diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1b7c03ebb..aad28a2d8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -48,6 +48,7 @@ benchmark: unit-testing: stage: test + retry: 2 cache: &testing_cache_policy <<: *global_cache_policy policy: pull @@ -80,6 +81,7 @@ unit-testing: unit-testing-rum: stage: test + retry: 2 cache: *testing_cache_policy services: - name: minibikini/postgres-with-rum:12 diff --git a/CHANGELOG.md b/CHANGELOG.md index 15a073c64..839bf90ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,23 +4,132 @@ 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] + ### Changed -- **Breaking:** BBCode and Markdown formatters will no longer return any `\n` and only use `
` for newlines +
+ API Changes +- **Breaking:** Emoji API: changed methods and renamed routes. +
### Removed - **Breaking:** removed `with_move` parameter from notifications timeline. ### Added +- ActivityPub: Added support for existing AP ids for instances migrated from Mastodon. +- Instance: Add `background_image` to configuration and `/api/v1/instance` +- Instance: Extend `/api/v1/instance` with Pleroma-specific information. - NodeInfo: `pleroma:api/v1/notifications:include_types_filter` to the `features` list. +- NodeInfo: `pleroma_emoji_reactions` to the `features` list. - Configuration: `:restrict_unauthenticated` setting, restrict access for unauthenticated users to timelines (public and federate), user profiles and statuses. +- Configuration: Add `:database_config_whitelist` setting to whitelist settings which can be configured from AdminFE. +- Configuration: `filename_display_max_length` option to set filename truncate limit, if filename display enabled (0 = no limit). +- New HTTP adapter [gun](https://github.com/ninenines/gun). Gun adapter requires minimum OTP version of 22.2 otherwise Pleroma won’t start. For hackney OTP update is not required. +- Mix task to create trusted OAuth App. +- Notifications: Added `follow_request` notification type. +- Added `:reject_deletes` group to SimplePolicy +- MRF (`EmojiStealPolicy`): New MRF Policy which allows to automatically download emojis from remote instances
API Changes +- Mastodon API: Extended `/api/v1/instance`. - Mastodon API: Support for `include_types` in `/api/v1/notifications`. +- Mastodon API: Added `/api/v1/notifications/:id/dismiss` endpoint. +- Mastodon API: Add support for filtering replies in public and home timelines +- Admin API: endpoints for create/update/delete OAuth Apps. +- Admin API: endpoint for status view.
+### Fixed +- Support pagination in conversations API +- **Breaking**: SimplePolicy `:reject` and `:accept` allow deletions again +- Fix follower/blocks import when nicknames starts with @ +- Filtering of push notifications on activities from blocked domains +- Resolving Peertube accounts with Webfinger +- `blob:` urls not being allowed by connect-src CSP + +## [Unreleased (patch)] + +### Fixed +- Healthcheck reporting the number of memory currently used, rather than allocated in total +- `InsertSkeletonsForDeletedUsers` failing on some instances + +## [2.0.3] - 2020-05-02 + +### Security +- Disallow re-registration of previously deleted users, which allowed viewing direct messages addressed to them +- Mastodon API: Fix `POST /api/v1/follow_requests/:id/authorize` allowing to force a follow from a local user even if they didn't request to follow +- CSP: Sandbox uploads + +### Fixed +- Notifications from blocked domains +- Potential federation issues with Mastodon versions before 3.0.0 +- HTTP Basic Authentication permissions issue +- Follow/Block imports not being able to find the user if the nickname started with an `@` +- Instance stats counting internal users +- Inability to run a From Source release without git +- ObjectAgePolicy didn't filter out old messages +- `blob:` urls not being allowed by CSP + +### Added +- NodeInfo: ObjectAgePolicy settings to the `federation` list. +- Follow request notifications +
+ API Changes +- Admin API: `GET /api/pleroma/admin/need_reboot`. +
+ +### Upgrade notes + +1. Restart Pleroma +2. Run database migrations (inside Pleroma directory): + - OTP: `./bin/pleroma_ctl migrate` + - From Source: `mix ecto.migrate` + + +## [2.0.2] - 2020-04-08 +### Added +- Support for Funkwhale's `Audio` activity +- Admin API: `PATCH /api/pleroma/admin/users/:nickname/update_credentials` + +### Fixed +- Blocked/muted users still generating push notifications +- Input textbox for bio ignoring newlines +- OTP: Inability to use PostgreSQL databases with SSL +- `user delete_activities` breaking when trying to delete already deleted posts +- Incorrect URL for Funkwhale channels + +### Upgrade notes +1. Restart Pleroma + +## [2.0.1] - 2020-03-15 +### Security +- Static-FE: Fix remote posts not being sanitized + +### Fixed +- 500 errors when no `Accept` header is present if Static-FE is enabled +- Instance panel not being updated immediately due to wrong `Cache-Control` headers +- Statuses posted with BBCode/Markdown having unncessary newlines in Pleroma-FE +- OTP: Fix some settings not being migrated to in-database config properly +- No `Cache-Control` headers on attachment/media proxy requests +- Character limit enforcement being off by 1 +- Mastodon Streaming API: hashtag timelines not working + +### Changed +- BBCode and Markdown formatters will no longer return any `\n` and only use `
` for newlines +- Mastodon API: Allow registration without email if email verification is not enabled + +### Upgrade notes +#### Nginx only +1. Remove `proxy_ignore_headers Cache-Control;` and `proxy_hide_header Cache-Control;` from your config. + +#### Everyone +1. Run database migrations (inside Pleroma directory): + - OTP: `./bin/pleroma_ctl migrate` + - From Source: `mix ecto.migrate` +2. Restart Pleroma + ## [2.0.0] - 2019-03-08 ### Security -- Mastodon API: Fix being able to request enourmous amount of statuses in timelines leading to DoS. Now limited to 40 per request. +- Mastodon API: Fix being able to request enormous amount of statuses in timelines leading to DoS. Now limited to 40 per request. ### Removed - **Breaking**: Removed 1.0+ deprecated configurations `Pleroma.Upload, :strip_exif` and `:instance, :dedupe_media` @@ -64,7 +173,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **Breaking:** Admin API: Return link alongside with token on password reset - **Breaking:** Admin API: `PUT /api/pleroma/admin/reports/:id` is now `PATCH /api/pleroma/admin/reports`, see admin_api.md for details - **Breaking:** `/api/pleroma/admin/users/invite_token` now uses `POST`, changed accepted params and returns full invite in json instead of only token string. -- **Breaking** replying to reports is now "report notes", enpoint changed from `POST /api/pleroma/admin/reports/:id/respond` to `POST /api/pleroma/admin/reports/:id/notes` +- **Breaking** replying to reports is now "report notes", endpoint changed from `POST /api/pleroma/admin/reports/:id/respond` to `POST /api/pleroma/admin/reports/:id/notes` - Mastodon API: stopped sanitizing display names, field names and subject fields since they are supposed to be treated as plaintext - Admin API: Return `total` when querying for reports - Mastodon API: Return `pleroma.direct_conversation_id` when creating a direct message (`POST /api/v1/statuses`) @@ -74,10 +183,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Mastodon API: `pleroma.thread_muted` to the Status entity - Mastodon API: Mark the direct conversation as read for the author when they send a new direct message - Mastodon API, streaming: Add `pleroma.direct_conversation_id` to the `conversation` stream event payload. +- Mastodon API: Add `pleroma.unread_count` to the Marker entity - Admin API: Render whole status in grouped reports - Mastodon API: User timelines will now respect blocks, unless you are getting the user timeline of somebody you blocked (which would be empty otherwise). - Mastodon API: Favoriting / Repeating a post multiple times will now return the identical response every time. Before, executing that action twice would return an error ("already favorited") on the second try. - Mastodon API: Limit timeline requests to 3 per timeline per 500ms per user/ip by default. +- Admin API: `PATCH /api/pleroma/admin/users/:nickname/credentials` and `GET /api/pleroma/admin/users/:nickname/credentials` ### Added diff --git a/COPYING b/COPYING index 0aede0fba..3140c8038 100644 --- a/COPYING +++ b/COPYING @@ -1,4 +1,4 @@ -Unless otherwise stated this repository is copyright © 2017-2019 +Unless otherwise stated this repository is copyright © 2017-2020 Pleroma Authors , and is distributed under The GNU Affero General Public License Version 3, you should have received a copy of the license file as AGPL-3. @@ -23,7 +23,7 @@ priv/static/images/pleroma-fox-tan-shy.png --- -The following files are copyright © 2017-2019 Pleroma Authors +The following files are copyright © 2017-2020 Pleroma Authors , and are distributed under the Creative Commons Attribution-ShareAlike 4.0 International license, you should have received a copy of the license file as CC-BY-SA-4.0. diff --git a/Dockerfile b/Dockerfile index 4f7f12716..29931a5e3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,7 +12,7 @@ RUN apk add git gcc g++ musl-dev make &&\ mkdir release &&\ mix release --path release -FROM alpine:3.9 +FROM alpine:3.11 ARG BUILD_DATE ARG VCS_REF @@ -33,7 +33,7 @@ ARG DATA=/var/lib/pleroma RUN echo "http://nl.alpinelinux.org/alpine/latest-stable/community" >> /etc/apk/repositories &&\ apk update &&\ - apk add ncurses postgresql-client &&\ + apk add imagemagick ncurses postgresql-client &&\ adduser --system --shell /bin/false --home ${HOME} pleroma &&\ mkdir -p ${DATA}/uploads &&\ mkdir -p ${DATA}/static &&\ diff --git a/benchmarks/load_testing/activities.ex b/benchmarks/load_testing/activities.ex new file mode 100644 index 000000000..ff0d481a8 --- /dev/null +++ b/benchmarks/load_testing/activities.ex @@ -0,0 +1,556 @@ +defmodule Pleroma.LoadTesting.Activities do + @moduledoc """ + Module for generating different activities. + """ + import Ecto.Query + import Pleroma.LoadTesting.Helper, only: [to_sec: 1] + + alias Ecto.UUID + alias Pleroma.Constants + alias Pleroma.LoadTesting.Users + alias Pleroma.Repo + alias Pleroma.Web.CommonAPI + + require Constants + + @defaults [ + iterations: 170, + friends_used: 20, + non_friends_used: 20 + ] + + @max_concurrency 10 + + @visibility ~w(public private direct unlisted) + @types ~w(simple emoji mentions hell_thread attachment tag like reblog simple_thread remote) + @groups ~w(user friends non_friends) + + @spec generate(User.t(), keyword()) :: :ok + def generate(user, opts \\ []) do + {:ok, _} = + Agent.start_link(fn -> %{} end, + name: :benchmark_state + ) + + opts = Keyword.merge(@defaults, opts) + + friends = + user + |> Users.get_users(limit: opts[:friends_used], local: :local, friends?: true) + |> Enum.shuffle() + + non_friends = + user + |> Users.get_users(limit: opts[:non_friends_used], local: :local, friends?: false) + |> Enum.shuffle() + + task_data = + for visibility <- @visibility, + type <- @types, + group <- @groups, + do: {visibility, type, group} + + IO.puts("Starting generating #{opts[:iterations]} iterations of activities...") + + friends_thread = Enum.take(friends, 5) + non_friends_thread = Enum.take(friends, 5) + + public_long_thread = fn -> + generate_long_thread("public", user, friends_thread, non_friends_thread, opts) + end + + private_long_thread = fn -> + generate_long_thread("private", user, friends_thread, non_friends_thread, opts) + end + + iterations = opts[:iterations] + + {time, _} = + :timer.tc(fn -> + Enum.each( + 1..iterations, + fn + i when i == iterations - 2 -> + spawn(public_long_thread) + spawn(private_long_thread) + generate_activities(user, friends, non_friends, Enum.shuffle(task_data), opts) + + _ -> + generate_activities(user, friends, non_friends, Enum.shuffle(task_data), opts) + end + ) + end) + + IO.puts("Generating iterations of activities took #{to_sec(time)} sec.\n") + :ok + end + + def generate_power_intervals(opts \\ []) do + count = Keyword.get(opts, :count, 20) + power = Keyword.get(opts, :power, 2) + IO.puts("Generating #{count} intervals for a power #{power} series...") + counts = Enum.map(1..count, fn n -> :math.pow(n, power) end) + sum = Enum.sum(counts) + + densities = + Enum.map(counts, fn c -> + c / sum + end) + + densities + |> Enum.reduce(0, fn density, acc -> + if acc == 0 do + [{0, density}] + else + [{_, lower} | _] = acc + [{lower, lower + density} | acc] + end + end) + |> Enum.reverse() + end + + def generate_tagged_activities(opts \\ []) do + tag_count = Keyword.get(opts, :tag_count, 20) + users = Keyword.get(opts, :users, Repo.all(Pleroma.User)) + activity_count = Keyword.get(opts, :count, 200_000) + + intervals = generate_power_intervals(count: tag_count) + + IO.puts( + "Generating #{activity_count} activities using #{tag_count} different tags of format `tag_n`, starting at tag_0" + ) + + Enum.each(1..activity_count, fn _ -> + random = :rand.uniform() + i = Enum.find_index(intervals, fn {lower, upper} -> lower <= random && upper > random end) + CommonAPI.post(Enum.random(users), %{status: "a post with the tag #tag_#{i}"}) + end) + end + + defp generate_long_thread(visibility, user, friends, non_friends, _opts) do + group = + if visibility == "public", + do: "friends", + else: "user" + + tasks = get_reply_tasks(visibility, group) |> Stream.cycle() |> Enum.take(50) + + {:ok, activity} = + CommonAPI.post(user, %{ + status: "Start of #{visibility} long thread", + visibility: visibility + }) + + Agent.update(:benchmark_state, fn state -> + key = + if visibility == "public", + do: :public_thread, + else: :private_thread + + Map.put(state, key, activity) + end) + + acc = {activity.id, ["@" <> user.nickname, "reply to long thread"]} + insert_replies_for_long_thread(tasks, visibility, user, friends, non_friends, acc) + IO.puts("Generating #{visibility} long thread ended\n") + end + + defp insert_replies_for_long_thread(tasks, visibility, user, friends, non_friends, acc) do + Enum.reduce(tasks, acc, fn + "friend", {id, data} -> + friend = Enum.random(friends) + insert_reply(friend, List.delete(data, "@" <> friend.nickname), id, visibility) + + "non_friend", {id, data} -> + non_friend = Enum.random(non_friends) + insert_reply(non_friend, List.delete(data, "@" <> non_friend.nickname), id, visibility) + + "user", {id, data} -> + insert_reply(user, List.delete(data, "@" <> user.nickname), id, visibility) + end) + end + + defp generate_activities(user, friends, non_friends, task_data, opts) do + Task.async_stream( + task_data, + fn {visibility, type, group} -> + insert_activity(type, visibility, group, user, friends, non_friends, opts) + end, + max_concurrency: @max_concurrency, + timeout: 30_000 + ) + |> Stream.run() + end + + defp insert_activity("simple", visibility, group, user, friends, non_friends, _opts) do + {:ok, _activity} = + group + |> get_actor(user, friends, non_friends) + |> CommonAPI.post(%{status: "Simple status", visibility: visibility}) + end + + defp insert_activity("emoji", visibility, group, user, friends, non_friends, _opts) do + {:ok, _activity} = + group + |> get_actor(user, friends, non_friends) + |> CommonAPI.post(%{ + status: "Simple status with emoji :firefox:", + visibility: visibility + }) + end + + defp insert_activity("mentions", visibility, group, user, friends, non_friends, _opts) do + user_mentions = + get_random_mentions(friends, Enum.random(0..3)) ++ + get_random_mentions(non_friends, Enum.random(0..3)) + + user_mentions = + if Enum.random([true, false]), + do: ["@" <> user.nickname | user_mentions], + else: user_mentions + + {:ok, _activity} = + group + |> get_actor(user, friends, non_friends) + |> CommonAPI.post(%{ + status: Enum.join(user_mentions, ", ") <> " simple status with mentions", + visibility: visibility + }) + end + + defp insert_activity("hell_thread", visibility, group, user, friends, non_friends, _opts) do + mentions = + with {:ok, nil} <- Cachex.get(:user_cache, "hell_thread_mentions") do + cached = + ([user | Enum.take(friends, 10)] ++ Enum.take(non_friends, 10)) + |> Enum.map(&"@#{&1.nickname}") + |> Enum.join(", ") + + Cachex.put(:user_cache, "hell_thread_mentions", cached) + cached + else + {:ok, cached} -> cached + end + + {:ok, _activity} = + group + |> get_actor(user, friends, non_friends) + |> CommonAPI.post(%{ + status: mentions <> " hell thread status", + visibility: visibility + }) + end + + defp insert_activity("attachment", visibility, group, user, friends, non_friends, _opts) do + actor = get_actor(group, user, friends, non_friends) + + obj_data = %{ + "actor" => actor.ap_id, + "name" => "4467-11.jpg", + "type" => "Document", + "url" => [ + %{ + "href" => + "#{Pleroma.Web.base_url()}/media/b1b873552422a07bf53af01f3c231c841db4dfc42c35efde681abaf0f2a4eab7.jpg", + "mediaType" => "image/jpeg", + "type" => "Link" + } + ] + } + + object = Repo.insert!(%Pleroma.Object{data: obj_data}) + + {:ok, _activity} = + CommonAPI.post(actor, %{ + status: "Post with attachment", + visibility: visibility, + media_ids: [object.id] + }) + end + + defp insert_activity("tag", visibility, group, user, friends, non_friends, _opts) do + {:ok, _activity} = + group + |> get_actor(user, friends, non_friends) + |> CommonAPI.post(%{status: "Status with #tag", visibility: visibility}) + end + + defp insert_activity("like", visibility, group, user, friends, non_friends, opts) do + actor = get_actor(group, user, friends, non_friends) + + with activity_id when not is_nil(activity_id) <- get_random_create_activity_id(), + {:ok, _activity} <- CommonAPI.favorite(actor, activity_id) do + :ok + else + {:error, _} -> + insert_activity("like", visibility, group, user, friends, non_friends, opts) + + nil -> + Process.sleep(15) + insert_activity("like", visibility, group, user, friends, non_friends, opts) + end + end + + defp insert_activity("reblog", visibility, group, user, friends, non_friends, opts) do + actor = get_actor(group, user, friends, non_friends) + + with activity_id when not is_nil(activity_id) <- get_random_create_activity_id(), + {:ok, _activity, _object} <- CommonAPI.repeat(activity_id, actor) do + :ok + else + {:error, _} -> + insert_activity("reblog", visibility, group, user, friends, non_friends, opts) + + nil -> + Process.sleep(15) + insert_activity("reblog", visibility, group, user, friends, non_friends, opts) + end + end + + defp insert_activity("simple_thread", visibility, group, user, friends, non_friends, _opts) + when visibility in ["public", "unlisted", "private"] do + actor = get_actor(group, user, friends, non_friends) + tasks = get_reply_tasks(visibility, group) + + {:ok, activity} = CommonAPI.post(user, %{status: "Simple status", visibility: visibility}) + + acc = {activity.id, ["@" <> actor.nickname, "reply to status"]} + insert_replies(tasks, visibility, user, friends, non_friends, acc) + end + + defp insert_activity("simple_thread", "direct", group, user, friends, non_friends, _opts) do + actor = get_actor(group, user, friends, non_friends) + tasks = get_reply_tasks("direct", group) + + list = + case group do + "non_friends" -> + Enum.take(non_friends, 3) + + _ -> + Enum.take(friends, 3) + end + + data = Enum.map(list, &("@" <> &1.nickname)) + + {:ok, activity} = + CommonAPI.post(actor, %{ + status: Enum.join(data, ", ") <> "simple status", + visibility: "direct" + }) + + acc = {activity.id, ["@" <> user.nickname | data] ++ ["reply to status"]} + insert_direct_replies(tasks, user, list, acc) + end + + defp insert_activity("remote", _, "user", _, _, _, _), do: :ok + + defp insert_activity("remote", visibility, group, user, _friends, _non_friends, opts) do + remote_friends = + Users.get_users(user, limit: opts[:friends_used], local: :external, friends?: true) + + remote_non_friends = + Users.get_users(user, limit: opts[:non_friends_used], local: :external, friends?: false) + + actor = get_actor(group, user, remote_friends, remote_non_friends) + + {act_data, obj_data} = prepare_activity_data(actor, visibility, user) + {activity_data, object_data} = other_data(actor) + + activity_data + |> Map.merge(act_data) + |> Map.put("object", Map.merge(object_data, obj_data)) + |> Pleroma.Web.ActivityPub.ActivityPub.insert(false) + end + + defp get_actor("user", user, _friends, _non_friends), do: user + defp get_actor("friends", _user, friends, _non_friends), do: Enum.random(friends) + defp get_actor("non_friends", _user, _friends, non_friends), do: Enum.random(non_friends) + + defp other_data(actor) do + %{host: host} = URI.parse(actor.ap_id) + datetime = DateTime.utc_now() + context_id = "http://#{host}:4000/contexts/#{UUID.generate()}" + activity_id = "http://#{host}:4000/activities/#{UUID.generate()}" + object_id = "http://#{host}:4000/objects/#{UUID.generate()}" + + activity_data = %{ + "actor" => actor.ap_id, + "context" => context_id, + "id" => activity_id, + "published" => datetime, + "type" => "Create", + "directMessage" => false + } + + object_data = %{ + "actor" => actor.ap_id, + "attachment" => [], + "attributedTo" => actor.ap_id, + "bcc" => [], + "bto" => [], + "content" => "Remote post", + "context" => context_id, + "conversation" => context_id, + "emoji" => %{}, + "id" => object_id, + "published" => datetime, + "sensitive" => false, + "summary" => "", + "tag" => [], + "to" => ["https://www.w3.org/ns/activitystreams#Public"], + "type" => "Note" + } + + {activity_data, object_data} + end + + defp prepare_activity_data(actor, "public", _mention) do + obj_data = %{ + "cc" => [actor.follower_address], + "to" => [Constants.as_public()] + } + + act_data = %{ + "cc" => [actor.follower_address], + "to" => [Constants.as_public()] + } + + {act_data, obj_data} + end + + defp prepare_activity_data(actor, "private", _mention) do + obj_data = %{ + "cc" => [], + "to" => [actor.follower_address] + } + + act_data = %{ + "cc" => [], + "to" => [actor.follower_address] + } + + {act_data, obj_data} + end + + defp prepare_activity_data(actor, "unlisted", _mention) do + obj_data = %{ + "cc" => [Constants.as_public()], + "to" => [actor.follower_address] + } + + act_data = %{ + "cc" => [Constants.as_public()], + "to" => [actor.follower_address] + } + + {act_data, obj_data} + end + + defp prepare_activity_data(_actor, "direct", mention) do + %{host: mentioned_host} = URI.parse(mention.ap_id) + + obj_data = %{ + "cc" => [], + "content" => + "@#{ + mention.nickname + } direct message", + "tag" => [ + %{ + "href" => mention.ap_id, + "name" => "@#{mention.nickname}@#{mentioned_host}", + "type" => "Mention" + } + ], + "to" => [mention.ap_id] + } + + act_data = %{ + "cc" => [], + "directMessage" => true, + "to" => [mention.ap_id] + } + + {act_data, obj_data} + end + + defp get_reply_tasks("public", "user"), do: ~w(friend non_friend user) + defp get_reply_tasks("public", "friends"), do: ~w(non_friend user friend) + defp get_reply_tasks("public", "non_friends"), do: ~w(user friend non_friend) + + defp get_reply_tasks(visibility, "user") when visibility in ["unlisted", "private"], + do: ~w(friend user friend) + + defp get_reply_tasks(visibility, "friends") when visibility in ["unlisted", "private"], + do: ~w(user friend user) + + defp get_reply_tasks(visibility, "non_friends") when visibility in ["unlisted", "private"], + do: [] + + defp get_reply_tasks("direct", "user"), do: ~w(friend user friend) + defp get_reply_tasks("direct", "friends"), do: ~w(user friend user) + defp get_reply_tasks("direct", "non_friends"), do: ~w(user non_friend user) + + defp insert_replies(tasks, visibility, user, friends, non_friends, acc) do + Enum.reduce(tasks, acc, fn + "friend", {id, data} -> + friend = Enum.random(friends) + insert_reply(friend, data, id, visibility) + + "non_friend", {id, data} -> + non_friend = Enum.random(non_friends) + insert_reply(non_friend, data, id, visibility) + + "user", {id, data} -> + insert_reply(user, data, id, visibility) + end) + end + + defp insert_direct_replies(tasks, user, list, acc) do + Enum.reduce(tasks, acc, fn + group, {id, data} when group in ["friend", "non_friend"] -> + actor = Enum.random(list) + + {reply_id, _} = + insert_reply(actor, List.delete(data, "@" <> actor.nickname), id, "direct") + + {reply_id, data} + + "user", {id, data} -> + {reply_id, _} = insert_reply(user, List.delete(data, "@" <> user.nickname), id, "direct") + {reply_id, data} + end) + end + + defp insert_reply(actor, data, activity_id, visibility) do + {:ok, reply} = + CommonAPI.post(actor, %{ + status: Enum.join(data, ", "), + visibility: visibility, + in_reply_to_status_id: activity_id + }) + + {reply.id, ["@" <> actor.nickname | data]} + end + + defp get_random_mentions(_users, count) when count == 0, do: [] + + defp get_random_mentions(users, count) do + users + |> Enum.shuffle() + |> Enum.take(count) + |> Enum.map(&"@#{&1.nickname}") + end + + defp get_random_create_activity_id do + Repo.one( + from(a in Pleroma.Activity, + where: fragment("(?)->>'type' = ?", a.data, ^"Create"), + order_by: fragment("RANDOM()"), + limit: 1, + select: a.id + ) + ) + end +end diff --git a/benchmarks/load_testing/fetcher.ex b/benchmarks/load_testing/fetcher.ex index a45a71d4a..0de4924bc 100644 --- a/benchmarks/load_testing/fetcher.ex +++ b/benchmarks/load_testing/fetcher.ex @@ -1,260 +1,544 @@ defmodule Pleroma.LoadTesting.Fetcher do - use Pleroma.LoadTesting.Helper + alias Pleroma.Activity + alias Pleroma.Pagination + alias Pleroma.Repo + alias Pleroma.User + alias Pleroma.Web.ActivityPub.ActivityPub + alias Pleroma.Web.MastodonAPI.MastodonAPI + alias Pleroma.Web.MastodonAPI.StatusView - def fetch_user(user) do - Benchee.run(%{ - "By id" => fn -> Repo.get_by(User, id: user.id) end, - "By ap_id" => fn -> Repo.get_by(User, ap_id: user.ap_id) end, - "By email" => fn -> Repo.get_by(User, email: user.email) end, - "By nickname" => fn -> Repo.get_by(User, nickname: user.nickname) end - }) + @spec run_benchmarks(User.t()) :: any() + def run_benchmarks(user) do + fetch_user(user) + fetch_timelines(user) + render_views(user) end - def query_timelines(user) do - home_timeline_params = %{ - "count" => 20, - "with_muted" => true, - "type" => ["Create", "Announce"], + defp formatters do + [ + Benchee.Formatters.Console + ] + end + + defp fetch_user(user) do + Benchee.run( + %{ + "By id" => fn -> Repo.get_by(User, id: user.id) end, + "By ap_id" => fn -> Repo.get_by(User, ap_id: user.ap_id) end, + "By email" => fn -> Repo.get_by(User, email: user.email) end, + "By nickname" => fn -> Repo.get_by(User, nickname: user.nickname) end + }, + formatters: formatters() + ) + end + + defp fetch_timelines(user) do + fetch_home_timeline(user) + fetch_direct_timeline(user) + fetch_public_timeline(user) + fetch_public_timeline(user, :local) + fetch_public_timeline(user, :tag) + fetch_notifications(user) + fetch_favourites(user) + fetch_long_thread(user) + fetch_timelines_with_reply_filtering(user) + end + + defp render_views(user) do + render_timelines(user) + render_long_thread(user) + end + + defp opts_for_home_timeline(user) do + %{ "blocking_user" => user, + "count" => "20", "muting_user" => user, + "type" => ["Create", "Announce"], + "user" => user, + "with_muted" => "true" + } + end + + defp fetch_home_timeline(user) do + opts = opts_for_home_timeline(user) + + recipients = [user.ap_id | User.following(user)] + + first_page_last = + ActivityPub.fetch_activities(recipients, opts) |> Enum.reverse() |> List.last() + + second_page_last = + ActivityPub.fetch_activities(recipients, Map.put(opts, "max_id", first_page_last.id)) + |> Enum.reverse() + |> List.last() + + third_page_last = + ActivityPub.fetch_activities(recipients, Map.put(opts, "max_id", second_page_last.id)) + |> Enum.reverse() + |> List.last() + + forth_page_last = + ActivityPub.fetch_activities(recipients, Map.put(opts, "max_id", third_page_last.id)) + |> Enum.reverse() + |> List.last() + + Benchee.run( + %{ + "home timeline" => fn opts -> ActivityPub.fetch_activities(recipients, opts) end + }, + inputs: %{ + "1 page" => opts, + "2 page" => Map.put(opts, "max_id", first_page_last.id), + "3 page" => Map.put(opts, "max_id", second_page_last.id), + "4 page" => Map.put(opts, "max_id", third_page_last.id), + "5 page" => Map.put(opts, "max_id", forth_page_last.id), + "1 page only media" => Map.put(opts, "only_media", "true"), + "2 page only media" => + Map.put(opts, "max_id", first_page_last.id) |> Map.put("only_media", "true"), + "3 page only media" => + Map.put(opts, "max_id", second_page_last.id) |> Map.put("only_media", "true"), + "4 page only media" => + Map.put(opts, "max_id", third_page_last.id) |> Map.put("only_media", "true"), + "5 page only media" => + Map.put(opts, "max_id", forth_page_last.id) |> Map.put("only_media", "true") + }, + formatters: formatters() + ) + end + + defp opts_for_direct_timeline(user) do + %{ + :visibility => "direct", + "blocking_user" => user, + "count" => "20", + "type" => "Create", + "user" => user, + "with_muted" => "true" + } + end + + defp fetch_direct_timeline(user) do + recipients = [user.ap_id] + + opts = opts_for_direct_timeline(user) + + first_page_last = + recipients + |> ActivityPub.fetch_activities_query(opts) + |> Pagination.fetch_paginated(opts) + |> List.last() + + opts2 = Map.put(opts, "max_id", first_page_last.id) + + second_page_last = + recipients + |> ActivityPub.fetch_activities_query(opts2) + |> Pagination.fetch_paginated(opts2) + |> List.last() + + opts3 = Map.put(opts, "max_id", second_page_last.id) + + third_page_last = + recipients + |> ActivityPub.fetch_activities_query(opts3) + |> Pagination.fetch_paginated(opts3) + |> List.last() + + opts4 = Map.put(opts, "max_id", third_page_last.id) + + forth_page_last = + recipients + |> ActivityPub.fetch_activities_query(opts4) + |> Pagination.fetch_paginated(opts4) + |> List.last() + + Benchee.run( + %{ + "direct timeline" => fn opts -> + ActivityPub.fetch_activities_query(recipients, opts) |> Pagination.fetch_paginated(opts) + end + }, + inputs: %{ + "1 page" => opts, + "2 page" => opts2, + "3 page" => opts3, + "4 page" => opts4, + "5 page" => Map.put(opts4, "max_id", forth_page_last.id) + }, + formatters: formatters() + ) + end + + defp opts_for_public_timeline(user) do + %{ + "type" => ["Create", "Announce"], + "local_only" => false, + "blocking_user" => user, + "muting_user" => user + } + end + + defp opts_for_public_timeline(user, :local) do + %{ + "type" => ["Create", "Announce"], + "local_only" => true, + "blocking_user" => user, + "muting_user" => user + } + end + + defp opts_for_public_timeline(user, :tag) do + %{ + "blocking_user" => user, + "count" => "20", + "local_only" => nil, + "muting_user" => user, + "tag" => ["tag"], + "tag_all" => [], + "tag_reject" => [], + "type" => "Create", + "user" => user, + "with_muted" => "true" + } + end + + defp fetch_public_timeline(user) do + opts = opts_for_public_timeline(user) + + fetch_public_timeline(opts, "public timeline") + end + + defp fetch_public_timeline(user, :local) do + opts = opts_for_public_timeline(user, :local) + + fetch_public_timeline(opts, "public timeline only local") + end + + defp fetch_public_timeline(user, :tag) do + opts = opts_for_public_timeline(user, :tag) + + fetch_public_timeline(opts, "hashtag timeline") + end + + defp fetch_public_timeline(user, :only_media) do + opts = opts_for_public_timeline(user) |> Map.put("only_media", "true") + + fetch_public_timeline(opts, "public timeline only media") + end + + defp fetch_public_timeline(opts, title) when is_binary(title) do + first_page_last = ActivityPub.fetch_public_activities(opts) |> List.last() + + second_page_last = + ActivityPub.fetch_public_activities(Map.put(opts, "max_id", first_page_last.id)) + |> List.last() + + third_page_last = + ActivityPub.fetch_public_activities(Map.put(opts, "max_id", second_page_last.id)) + |> List.last() + + forth_page_last = + ActivityPub.fetch_public_activities(Map.put(opts, "max_id", third_page_last.id)) + |> List.last() + + Benchee.run( + %{ + title => fn opts -> + ActivityPub.fetch_public_activities(opts) + end + }, + inputs: %{ + "1 page" => opts, + "2 page" => Map.put(opts, "max_id", first_page_last.id), + "3 page" => Map.put(opts, "max_id", second_page_last.id), + "4 page" => Map.put(opts, "max_id", third_page_last.id), + "5 page" => Map.put(opts, "max_id", forth_page_last.id) + }, + formatters: formatters() + ) + end + + defp opts_for_notifications do + %{"count" => "20", "with_muted" => "true"} + end + + defp fetch_notifications(user) do + opts = opts_for_notifications() + + first_page_last = MastodonAPI.get_notifications(user, opts) |> List.last() + + second_page_last = + MastodonAPI.get_notifications(user, Map.put(opts, "max_id", first_page_last.id)) + |> List.last() + + third_page_last = + MastodonAPI.get_notifications(user, Map.put(opts, "max_id", second_page_last.id)) + |> List.last() + + forth_page_last = + MastodonAPI.get_notifications(user, Map.put(opts, "max_id", third_page_last.id)) + |> List.last() + + Benchee.run( + %{ + "Notifications" => fn opts -> + MastodonAPI.get_notifications(user, opts) + end + }, + inputs: %{ + "1 page" => opts, + "2 page" => Map.put(opts, "max_id", first_page_last.id), + "3 page" => Map.put(opts, "max_id", second_page_last.id), + "4 page" => Map.put(opts, "max_id", third_page_last.id), + "5 page" => Map.put(opts, "max_id", forth_page_last.id) + }, + formatters: formatters() + ) + end + + defp fetch_favourites(user) do + first_page_last = ActivityPub.fetch_favourites(user) |> List.last() + + second_page_last = + ActivityPub.fetch_favourites(user, %{"max_id" => first_page_last.id}) |> List.last() + + third_page_last = + ActivityPub.fetch_favourites(user, %{"max_id" => second_page_last.id}) |> List.last() + + forth_page_last = + ActivityPub.fetch_favourites(user, %{"max_id" => third_page_last.id}) |> List.last() + + Benchee.run( + %{ + "Favourites" => fn opts -> + ActivityPub.fetch_favourites(user, opts) + end + }, + inputs: %{ + "1 page" => %{}, + "2 page" => %{"max_id" => first_page_last.id}, + "3 page" => %{"max_id" => second_page_last.id}, + "4 page" => %{"max_id" => third_page_last.id}, + "5 page" => %{"max_id" => forth_page_last.id} + }, + formatters: formatters() + ) + end + + defp opts_for_long_thread(user) do + %{ + "blocking_user" => user, "user" => user } + end - mastodon_public_timeline_params = %{ - "count" => 20, - "local_only" => true, - "only_media" => "false", - "type" => ["Create", "Announce"], - "with_muted" => "true", - "blocking_user" => user, - "muting_user" => user - } + defp fetch_long_thread(user) do + %{public_thread: public, private_thread: private} = + Agent.get(:benchmark_state, fn state -> state end) - mastodon_federated_timeline_params = %{ - "count" => 20, - "only_media" => "false", - "type" => ["Create", "Announce"], - "with_muted" => "true", - "blocking_user" => user, - "muting_user" => user - } + opts = opts_for_long_thread(user) - following = User.following(user) + private_input = {private.data["context"], Map.put(opts, "exclude_id", private.id)} - Benchee.run(%{ - "User home timeline" => fn -> - Pleroma.Web.ActivityPub.ActivityPub.fetch_activities( - following, - home_timeline_params - ) - end, - "User mastodon public timeline" => fn -> - Pleroma.Web.ActivityPub.ActivityPub.fetch_public_activities( - mastodon_public_timeline_params - ) - end, - "User mastodon federated public timeline" => fn -> - Pleroma.Web.ActivityPub.ActivityPub.fetch_public_activities( - mastodon_federated_timeline_params - ) - end - }) + public_input = {public.data["context"], Map.put(opts, "exclude_id", public.id)} - home_activities = - Pleroma.Web.ActivityPub.ActivityPub.fetch_activities( - following, - home_timeline_params + Benchee.run( + %{ + "fetch context" => fn {context, opts} -> + ActivityPub.fetch_activities_for_context(context, opts) + end + }, + inputs: %{ + "Private long thread" => private_input, + "Public long thread" => public_input + }, + formatters: formatters() + ) + end + + defp render_timelines(user) do + opts = opts_for_home_timeline(user) + + recipients = [user.ap_id | User.following(user)] + + home_activities = ActivityPub.fetch_activities(recipients, opts) |> Enum.reverse() + + recipients = [user.ap_id] + + opts = opts_for_direct_timeline(user) + + direct_activities = + recipients + |> ActivityPub.fetch_activities_query(opts) + |> Pagination.fetch_paginated(opts) + + opts = opts_for_public_timeline(user) + + public_activities = ActivityPub.fetch_public_activities(opts) + + opts = opts_for_public_timeline(user, :tag) + + tag_activities = ActivityPub.fetch_public_activities(opts) + + opts = opts_for_notifications() + + notifications = MastodonAPI.get_notifications(user, opts) + + favourites = ActivityPub.fetch_favourites(user) + + Benchee.run( + %{ + "Rendering home timeline" => fn -> + StatusView.render("index.json", %{ + activities: home_activities, + for: user, + as: :activity + }) + end, + "Rendering direct timeline" => fn -> + StatusView.render("index.json", %{ + activities: direct_activities, + for: user, + as: :activity + }) + end, + "Rendering public timeline" => fn -> + StatusView.render("index.json", %{ + activities: public_activities, + for: user, + as: :activity + }) + end, + "Rendering tag timeline" => fn -> + StatusView.render("index.json", %{ + activities: tag_activities, + for: user, + as: :activity + }) + end, + "Rendering notifications" => fn -> + Pleroma.Web.MastodonAPI.NotificationView.render("index.json", %{ + notifications: notifications, + for: user + }) + end, + "Rendering favourites timeline" => fn -> + StatusView.render("index.json", %{ + activities: favourites, + for: user, + as: :activity + }) + end + }, + formatters: formatters() + ) + end + + defp render_long_thread(user) do + %{public_thread: public, private_thread: private} = + Agent.get(:benchmark_state, fn state -> state end) + + opts = %{for: user} + public_activity = Activity.get_by_id_with_object(public.id) + private_activity = Activity.get_by_id_with_object(private.id) + + Benchee.run( + %{ + "render" => fn opts -> + StatusView.render("show.json", opts) + end + }, + inputs: %{ + "Public root" => Map.put(opts, :activity, public_activity), + "Private root" => Map.put(opts, :activity, private_activity) + }, + formatters: formatters() + ) + + fetch_opts = opts_for_long_thread(user) + + public_context = + ActivityPub.fetch_activities_for_context( + public.data["context"], + Map.put(fetch_opts, "exclude_id", public.id) ) - public_activities = - Pleroma.Web.ActivityPub.ActivityPub.fetch_public_activities(mastodon_public_timeline_params) - - public_federated_activities = - Pleroma.Web.ActivityPub.ActivityPub.fetch_public_activities( - mastodon_federated_timeline_params + private_context = + ActivityPub.fetch_activities_for_context( + private.data["context"], + Map.put(fetch_opts, "exclude_id", private.id) ) - Benchee.run(%{ - "Rendering home timeline" => fn -> - Pleroma.Web.MastodonAPI.StatusView.render("index.json", %{ - activities: home_activities, - for: user, - as: :activity - }) - end, - "Rendering public timeline" => fn -> - Pleroma.Web.MastodonAPI.StatusView.render("index.json", %{ - activities: public_activities, - for: user, - as: :activity - }) - end, - "Rendering public federated timeline" => fn -> - Pleroma.Web.MastodonAPI.StatusView.render("index.json", %{ - activities: public_federated_activities, - for: user, - as: :activity - }) - end, - "Rendering favorites timeline" => fn -> - conn = Phoenix.ConnTest.build_conn(:get, "http://localhost:4001/api/v1/favourites", nil) - Pleroma.Web.MastodonAPI.StatusController.favourites( - %Plug.Conn{conn | - assigns: %{user: user}, - query_params: %{"limit" => "0"}, - body_params: %{}, - cookies: %{}, - params: %{}, - path_params: %{}, - private: %{ - Pleroma.Web.Router => {[], %{}}, - phoenix_router: Pleroma.Web.Router, - phoenix_action: :favourites, - phoenix_controller: Pleroma.Web.MastodonAPI.StatusController, - phoenix_endpoint: Pleroma.Web.Endpoint, - phoenix_format: "json", - phoenix_layout: {Pleroma.Web.LayoutView, "app.html"}, - phoenix_recycled: true, - - phoenix_view: Pleroma.Web.MastodonAPI.StatusView, - plug_session: %{"user_id" => user.id}, - plug_session_fetch: :done, - plug_session_info: :write, - plug_skip_csrf_protection: true - } - }, - %{}) - end, - }) - end - - def query_notifications(user) do - without_muted_params = %{"count" => "20", "with_muted" => "false"} - with_muted_params = %{"count" => "20", "with_muted" => "true"} - - Benchee.run(%{ - "Notifications without muted" => fn -> - Pleroma.Web.MastodonAPI.MastodonAPI.get_notifications(user, without_muted_params) - end, - "Notifications with muted" => fn -> - Pleroma.Web.MastodonAPI.MastodonAPI.get_notifications(user, with_muted_params) - end - }) - - without_muted_notifications = - Pleroma.Web.MastodonAPI.MastodonAPI.get_notifications(user, without_muted_params) - - with_muted_notifications = - Pleroma.Web.MastodonAPI.MastodonAPI.get_notifications(user, with_muted_params) - - Benchee.run(%{ - "Render notifications without muted" => fn -> - Pleroma.Web.MastodonAPI.NotificationView.render("index.json", %{ - notifications: without_muted_notifications, - for: user - }) - end, - "Render notifications with muted" => fn -> - Pleroma.Web.MastodonAPI.NotificationView.render("index.json", %{ - notifications: with_muted_notifications, - for: user - }) - end - }) - end - - def query_dms(user) do - params = %{ - "count" => "20", - "with_muted" => "true", - "type" => "Create", - "blocking_user" => user, - "user" => user, - visibility: "direct" - } - - Benchee.run(%{ - "Direct messages with muted" => fn -> - Pleroma.Web.ActivityPub.ActivityPub.fetch_activities_query([user.ap_id], params) - |> Pleroma.Pagination.fetch_paginated(params) - end, - "Direct messages without muted" => fn -> - Pleroma.Web.ActivityPub.ActivityPub.fetch_activities_query([user.ap_id], params) - |> Pleroma.Pagination.fetch_paginated(Map.put(params, "with_muted", false)) - end - }) - - dms_with_muted = - Pleroma.Web.ActivityPub.ActivityPub.fetch_activities_query([user.ap_id], params) - |> Pleroma.Pagination.fetch_paginated(params) - - dms_without_muted = - Pleroma.Web.ActivityPub.ActivityPub.fetch_activities_query([user.ap_id], params) - |> Pleroma.Pagination.fetch_paginated(Map.put(params, "with_muted", false)) - - Benchee.run(%{ - "Rendering dms with muted" => fn -> - Pleroma.Web.MastodonAPI.StatusView.render("index.json", %{ - activities: dms_with_muted, - for: user, - as: :activity - }) - end, - "Rendering dms without muted" => fn -> - Pleroma.Web.MastodonAPI.StatusView.render("index.json", %{ - activities: dms_without_muted, - for: user, - as: :activity - }) - end - }) - end - - def query_long_thread(user, activity) do - Benchee.run(%{ - "Fetch main post" => fn -> - Pleroma.Activity.get_by_id_with_object(activity.id) - end, - "Fetch context of main post" => fn -> - Pleroma.Web.ActivityPub.ActivityPub.fetch_activities_for_context( - activity.data["context"], - %{ - "blocking_user" => user, - "user" => user, - "exclude_id" => activity.id - } - ) - end - }) - - activity = Pleroma.Activity.get_by_id_with_object(activity.id) - - context = - Pleroma.Web.ActivityPub.ActivityPub.fetch_activities_for_context( - activity.data["context"], - %{ - "blocking_user" => user, - "user" => user, - "exclude_id" => activity.id + Benchee.run( + %{ + "render" => fn opts -> + StatusView.render("context.json", opts) + end + }, + inputs: %{ + "Public context" => %{user: user, activity: public_activity, activities: public_context}, + "Private context" => %{ + user: user, + activity: private_activity, + activities: private_context } - ) + }, + formatters: formatters() + ) + end - Benchee.run(%{ - "Render status" => fn -> - Pleroma.Web.MastodonAPI.StatusView.render("show.json", %{ - activity: activity, - for: user - }) - end, - "Render context" => fn -> - Pleroma.Web.MastodonAPI.StatusView.render( - "index.json", - for: user, - activities: context, - as: :activity - ) - |> Enum.reverse() - end - }) + defp fetch_timelines_with_reply_filtering(user) do + public_params = opts_for_public_timeline(user) + + Benchee.run( + %{ + "Public timeline without reply filtering" => fn -> + ActivityPub.fetch_public_activities(public_params) + end, + "Public timeline with reply filtering - following" => fn -> + public_params + |> Map.put("reply_visibility", "following") + |> Map.put("reply_filtering_user", user) + |> ActivityPub.fetch_public_activities() + end, + "Public timeline with reply filtering - self" => fn -> + public_params + |> Map.put("reply_visibility", "self") + |> Map.put("reply_filtering_user", user) + |> ActivityPub.fetch_public_activities() + end + }, + formatters: formatters() + ) + + private_params = opts_for_home_timeline(user) + + recipients = [user.ap_id | User.following(user)] + + Benchee.run( + %{ + "Home timeline without reply filtering" => fn -> + ActivityPub.fetch_activities(recipients, private_params) + end, + "Home timeline with reply filtering - following" => fn -> + private_params = + private_params + |> Map.put("reply_filtering_user", user) + |> Map.put("reply_visibility", "following") + + ActivityPub.fetch_activities(recipients, private_params) + end, + "Home timeline with reply filtering - self" => fn -> + private_params = + private_params + |> Map.put("reply_filtering_user", user) + |> Map.put("reply_visibility", "self") + + ActivityPub.fetch_activities(recipients, private_params) + end + }, + formatters: formatters() + ) end end diff --git a/benchmarks/load_testing/generator.ex b/benchmarks/load_testing/generator.ex deleted file mode 100644 index 3f88fefd7..000000000 --- a/benchmarks/load_testing/generator.ex +++ /dev/null @@ -1,409 +0,0 @@ -defmodule Pleroma.LoadTesting.Generator do - use Pleroma.LoadTesting.Helper - alias Pleroma.Web.CommonAPI - - def generate_like_activities(user, posts) do - count_likes = Kernel.trunc(length(posts) / 4) - IO.puts("Starting generating #{count_likes} like activities...") - - {time, _} = - :timer.tc(fn -> - Task.async_stream( - Enum.take_random(posts, count_likes), - fn post -> {:ok, _, _} = CommonAPI.favorite(post.id, user) end, - max_concurrency: 10, - timeout: 30_000 - ) - |> Stream.run() - end) - - IO.puts("Inserting like activities take #{to_sec(time)} sec.\n") - end - - def generate_users(opts) do - IO.puts("Starting generating #{opts[:users_max]} users...") - {time, _} = :timer.tc(fn -> do_generate_users(opts) end) - - IO.puts("Inserting users take #{to_sec(time)} sec.\n") - end - - defp do_generate_users(opts) do - max = Keyword.get(opts, :users_max) - - Task.async_stream( - 1..max, - &generate_user_data(&1), - max_concurrency: 10, - timeout: 30_000 - ) - |> Enum.to_list() - end - - defp generate_user_data(i) do - remote = Enum.random([true, false]) - - user = %User{ - name: "Test テスト User #{i}", - email: "user#{i}@example.com", - nickname: "nick#{i}", - password_hash: - "$pbkdf2-sha512$160000$bU.OSFI7H/yqWb5DPEqyjw$uKp/2rmXw12QqnRRTqTtuk2DTwZfF8VR4MYW2xMeIlqPR/UX1nT1CEKVUx2CowFMZ5JON8aDvURrZpJjSgqXrg", - bio: "Tester Number #{i}", - local: remote - } - - user_urls = - if remote do - base_url = - Enum.random(["https://domain1.com", "https://domain2.com", "https://domain3.com"]) - - ap_id = "#{base_url}/users/#{user.nickname}" - - %{ - ap_id: ap_id, - follower_address: ap_id <> "/followers", - following_address: ap_id <> "/following" - } - else - %{ - ap_id: User.ap_id(user), - follower_address: User.ap_followers(user), - following_address: User.ap_following(user) - } - end - - user = Map.merge(user, user_urls) - - Repo.insert!(user) - end - - def generate_activities(user, users) do - do_generate_activities(user, users) - end - - defp do_generate_activities(user, users) do - IO.puts("Starting generating 20000 common activities...") - - {time, _} = - :timer.tc(fn -> - Task.async_stream( - 1..20_000, - fn _ -> - do_generate_activity([user | users]) - end, - max_concurrency: 10, - timeout: 30_000 - ) - |> Stream.run() - end) - - IO.puts("Inserting common activities take #{to_sec(time)} sec.\n") - - IO.puts("Starting generating 20000 activities with mentions...") - - {time, _} = - :timer.tc(fn -> - Task.async_stream( - 1..20_000, - fn _ -> - do_generate_activity_with_mention(user, users) - end, - max_concurrency: 10, - timeout: 30_000 - ) - |> Stream.run() - end) - - IO.puts("Inserting activities with menthions take #{to_sec(time)} sec.\n") - - IO.puts("Starting generating 10000 activities with threads...") - - {time, _} = - :timer.tc(fn -> - Task.async_stream( - 1..10_000, - fn _ -> - do_generate_threads([user | users]) - end, - max_concurrency: 10, - timeout: 30_000 - ) - |> Stream.run() - end) - - IO.puts("Inserting activities with threads take #{to_sec(time)} sec.\n") - end - - defp do_generate_activity(users) do - post = %{ - "status" => "Some status without mention with random user" - } - - CommonAPI.post(Enum.random(users), post) - end - - def generate_power_intervals(opts \\ []) do - count = Keyword.get(opts, :count, 20) - power = Keyword.get(opts, :power, 2) - IO.puts("Generating #{count} intervals for a power #{power} series...") - counts = Enum.map(1..count, fn n -> :math.pow(n, power) end) - sum = Enum.sum(counts) - - densities = - Enum.map(counts, fn c -> - c / sum - end) - - densities - |> Enum.reduce(0, fn density, acc -> - if acc == 0 do - [{0, density}] - else - [{_, lower} | _] = acc - [{lower, lower + density} | acc] - end - end) - |> Enum.reverse() - end - - def generate_tagged_activities(opts \\ []) do - tag_count = Keyword.get(opts, :tag_count, 20) - users = Keyword.get(opts, :users, Repo.all(User)) - activity_count = Keyword.get(opts, :count, 200_000) - - intervals = generate_power_intervals(count: tag_count) - - IO.puts( - "Generating #{activity_count} activities using #{tag_count} different tags of format `tag_n`, starting at tag_0" - ) - - Enum.each(1..activity_count, fn _ -> - random = :rand.uniform() - i = Enum.find_index(intervals, fn {lower, upper} -> lower <= random && upper > random end) - CommonAPI.post(Enum.random(users), %{"status" => "a post with the tag #tag_#{i}"}) - end) - end - - defp do_generate_activity_with_mention(user, users) do - mentions_cnt = Enum.random([2, 3, 4, 5]) - with_user = Enum.random([true, false]) - users = Enum.shuffle(users) - mentions_users = Enum.take(users, mentions_cnt) - mentions_users = if with_user, do: [user | mentions_users], else: mentions_users - - mentions_str = - Enum.map(mentions_users, fn user -> "@" <> user.nickname end) |> Enum.join(", ") - - post = %{ - "status" => mentions_str <> "some status with mentions random users" - } - - CommonAPI.post(Enum.random(users), post) - end - - defp do_generate_threads(users) do - thread_length = Enum.random([2, 3, 4, 5]) - actor = Enum.random(users) - - post = %{ - "status" => "Start of the thread" - } - - {:ok, activity} = CommonAPI.post(actor, post) - - Enum.each(1..thread_length, fn _ -> - user = Enum.random(users) - - post = %{ - "status" => "@#{actor.nickname} reply to thread", - "in_reply_to_status_id" => activity.id - } - - CommonAPI.post(user, post) - end) - end - - def generate_remote_activities(user, users) do - do_generate_remote_activities(user, users) - end - - defp do_generate_remote_activities(user, users) do - IO.puts("Starting generating 10000 remote activities...") - - {time, _} = - :timer.tc(fn -> - Task.async_stream( - 1..10_000, - fn i -> - do_generate_remote_activity(i, user, users) - end, - max_concurrency: 10, - timeout: 30_000 - ) - |> Stream.run() - end) - - IO.puts("Inserting remote activities take #{to_sec(time)} sec.\n") - end - - defp do_generate_remote_activity(i, user, users) do - actor = Enum.random(users) - %{host: host} = URI.parse(actor.ap_id) - date = Date.utc_today() - datetime = DateTime.utc_now() - - map = %{ - "actor" => actor.ap_id, - "cc" => [actor.follower_address, user.ap_id], - "context" => "tag:mastodon.example.org,#{date}:objectId=#{i}:objectType=Conversation", - "id" => actor.ap_id <> "/statuses/#{i}/activity", - "object" => %{ - "actor" => actor.ap_id, - "atomUri" => actor.ap_id <> "/statuses/#{i}", - "attachment" => [], - "attributedTo" => actor.ap_id, - "bcc" => [], - "bto" => [], - "cc" => [actor.follower_address, user.ap_id], - "content" => - "

- user.ap_id <> - "\" class=\"u-url mention\">@" <> user.nickname <> "

", - "context" => "tag:mastodon.example.org,#{date}:objectId=#{i}:objectType=Conversation", - "conversation" => - "tag:mastodon.example.org,#{date}:objectId=#{i}:objectType=Conversation", - "emoji" => %{}, - "id" => actor.ap_id <> "/statuses/#{i}", - "inReplyTo" => nil, - "inReplyToAtomUri" => nil, - "published" => datetime, - "sensitive" => true, - "summary" => "cw", - "tag" => [ - %{ - "href" => user.ap_id, - "name" => "@#{user.nickname}@#{host}", - "type" => "Mention" - } - ], - "to" => ["https://www.w3.org/ns/activitystreams#Public"], - "type" => "Note", - "url" => "http://#{host}/@#{actor.nickname}/#{i}" - }, - "published" => datetime, - "to" => ["https://www.w3.org/ns/activitystreams#Public"], - "type" => "Create" - } - - Pleroma.Web.ActivityPub.ActivityPub.insert(map, false) - end - - def generate_dms(user, users, opts) do - IO.puts("Starting generating #{opts[:dms_max]} DMs") - {time, _} = :timer.tc(fn -> do_generate_dms(user, users, opts) end) - IO.puts("Inserting dms take #{to_sec(time)} sec.\n") - end - - defp do_generate_dms(user, users, opts) do - Task.async_stream( - 1..opts[:dms_max], - fn _ -> - do_generate_dm(user, users) - end, - max_concurrency: 10, - timeout: 30_000 - ) - |> Stream.run() - end - - defp do_generate_dm(user, users) do - post = %{ - "status" => "@#{user.nickname} some direct message", - "visibility" => "direct" - } - - CommonAPI.post(Enum.random(users), post) - end - - def generate_long_thread(user, users, opts) do - IO.puts("Starting generating long thread with #{opts[:thread_length]} replies") - {time, activity} = :timer.tc(fn -> do_generate_long_thread(user, users, opts) end) - IO.puts("Inserting long thread replies take #{to_sec(time)} sec.\n") - {:ok, activity} - end - - defp do_generate_long_thread(user, users, opts) do - {:ok, %{id: id} = activity} = CommonAPI.post(user, %{"status" => "Start of long thread"}) - - Task.async_stream( - 1..opts[:thread_length], - fn _ -> do_generate_thread(users, id) end, - max_concurrency: 10, - timeout: 30_000 - ) - |> Stream.run() - - activity - end - - defp do_generate_thread(users, activity_id) do - CommonAPI.post(Enum.random(users), %{ - "status" => "reply to main post", - "in_reply_to_status_id" => activity_id - }) - end - - def generate_non_visible_message(user, users) do - IO.puts("Starting generating 1000 non visible posts") - - {time, _} = - :timer.tc(fn -> - do_generate_non_visible_posts(user, users) - end) - - IO.puts("Inserting non visible posts take #{to_sec(time)} sec.\n") - end - - defp do_generate_non_visible_posts(user, users) do - [not_friend | users] = users - - make_friends(user, users) - - Task.async_stream(1..1000, fn _ -> do_generate_non_visible_post(not_friend, users) end, - max_concurrency: 10, - timeout: 30_000 - ) - |> Stream.run() - end - - defp make_friends(_user, []), do: nil - - defp make_friends(user, [friend | users]) do - {:ok, _} = User.follow(user, friend) - {:ok, _} = User.follow(friend, user) - make_friends(user, users) - end - - defp do_generate_non_visible_post(not_friend, users) do - post = %{ - "status" => "some non visible post", - "visibility" => "private" - } - - {:ok, activity} = CommonAPI.post(not_friend, post) - - thread_length = Enum.random([2, 3, 4, 5]) - - Enum.each(1..thread_length, fn _ -> - user = Enum.random(users) - - post = %{ - "status" => "@#{not_friend.nickname} reply to non visible post", - "in_reply_to_status_id" => activity.id, - "visibility" => "private" - } - - CommonAPI.post(user, post) - end) - end -end diff --git a/benchmarks/load_testing/helper.ex b/benchmarks/load_testing/helper.ex index 47b25c65f..cab60acb4 100644 --- a/benchmarks/load_testing/helper.ex +++ b/benchmarks/load_testing/helper.ex @@ -1,11 +1,14 @@ defmodule Pleroma.LoadTesting.Helper do - defmacro __using__(_) do - quote do - import Ecto.Query - alias Pleroma.Repo - alias Pleroma.User + alias Ecto.Adapters.SQL + alias Pleroma.Repo - defp to_sec(microseconds), do: microseconds / 1_000_000 - end + def to_sec(microseconds), do: microseconds / 1_000_000 + + def clean_tables do + IO.puts("Deleting old data...\n") + SQL.query!(Repo, "TRUNCATE users CASCADE;") + SQL.query!(Repo, "TRUNCATE activities CASCADE;") + SQL.query!(Repo, "TRUNCATE objects CASCADE;") + SQL.query!(Repo, "TRUNCATE oban_jobs CASCADE;") end end diff --git a/benchmarks/load_testing/users.ex b/benchmarks/load_testing/users.ex new file mode 100644 index 000000000..e4d0b22ff --- /dev/null +++ b/benchmarks/load_testing/users.ex @@ -0,0 +1,169 @@ +defmodule Pleroma.LoadTesting.Users do + @moduledoc """ + Module for generating users with friends. + """ + import Ecto.Query + import Pleroma.LoadTesting.Helper, only: [to_sec: 1] + + alias Pleroma.Repo + alias Pleroma.User + alias Pleroma.User.Query + + @defaults [ + users: 20_000, + friends: 100 + ] + + @max_concurrency 10 + + @spec generate(keyword()) :: User.t() + def generate(opts \\ []) do + opts = Keyword.merge(@defaults, opts) + + generate_users(opts[:users]) + + main_user = + Repo.one(from(u in User, where: u.local == true, order_by: fragment("RANDOM()"), limit: 1)) + + make_friends(main_user, opts[:friends]) + + Repo.get(User, main_user.id) + end + + def generate_users(max) do + IO.puts("Starting generating #{max} users...") + + {time, users} = + :timer.tc(fn -> + Task.async_stream( + 1..max, + &generate_user(&1), + max_concurrency: @max_concurrency, + timeout: 30_000 + ) + |> Enum.to_list() + end) + + IO.puts("Generating users took #{to_sec(time)} sec.\n") + users + end + + defp generate_user(i) do + remote = Enum.random([true, false]) + + %User{ + name: "Test テスト User #{i}", + email: "user#{i}@example.com", + nickname: "nick#{i}", + password_hash: Pbkdf2.hash_pwd_salt("test"), + bio: "Tester Number #{i}", + local: !remote + } + |> user_urls() + |> Repo.insert!() + end + + defp user_urls(%{local: true} = user) do + urls = %{ + ap_id: User.ap_id(user), + follower_address: User.ap_followers(user), + following_address: User.ap_following(user) + } + + Map.merge(user, urls) + end + + defp user_urls(%{local: false} = user) do + base_domain = Enum.random(["domain1.com", "domain2.com", "domain3.com"]) + + ap_id = "https://#{base_domain}/users/#{user.nickname}" + + urls = %{ + ap_id: ap_id, + follower_address: ap_id <> "/followers", + following_address: ap_id <> "/following" + } + + Map.merge(user, urls) + end + + def make_friends(main_user, max) when is_integer(max) do + IO.puts("Starting making friends for #{max} users...") + + {time, _} = + :timer.tc(fn -> + number_of_users = + (max / 2) + |> Kernel.trunc() + + main_user + |> get_users(%{limit: number_of_users, local: :local}) + |> run_stream(main_user) + + main_user + |> get_users(%{limit: number_of_users, local: :external}) + |> run_stream(main_user) + end) + + IO.puts("Making friends took #{to_sec(time)} sec.\n") + end + + def make_friends(%User{} = main_user, %User{} = user) do + {:ok, _} = User.follow(main_user, user) + {:ok, _} = User.follow(user, main_user) + end + + @spec get_users(User.t(), keyword()) :: [User.t()] + def get_users(user, opts) do + criteria = %{limit: opts[:limit]} + + criteria = + if opts[:local] do + Map.put(criteria, opts[:local], true) + else + criteria + end + + criteria = + if opts[:friends?] do + Map.put(criteria, :friends, user) + else + criteria + end + + query = + criteria + |> Query.build() + |> random_without_user(user) + + query = + if opts[:friends?] == false do + friends_ids = + %{friends: user} + |> Query.build() + |> Repo.all() + |> Enum.map(& &1.id) + + from(u in query, where: u.id not in ^friends_ids) + else + query + end + + Repo.all(query) + end + + defp random_without_user(query, user) do + from(u in query, + where: u.id != ^user.id, + order_by: fragment("RANDOM()") + ) + end + + defp run_stream(users, main_user) do + Task.async_stream(users, &make_friends(main_user, &1), + max_concurrency: @max_concurrency, + timeout: 30_000 + ) + |> Stream.run() + end +end diff --git a/benchmarks/mix/tasks/pleroma/benchmarks/tags.ex b/benchmarks/mix/tasks/pleroma/benchmarks/tags.ex index fd1506907..657403202 100644 --- a/benchmarks/mix/tasks/pleroma/benchmarks/tags.ex +++ b/benchmarks/mix/tasks/pleroma/benchmarks/tags.ex @@ -1,9 +1,12 @@ defmodule Mix.Tasks.Pleroma.Benchmarks.Tags do use Mix.Task - alias Pleroma.Repo - alias Pleroma.LoadTesting.Generator + + import Pleroma.LoadTesting.Helper, only: [clean_tables: 0] import Ecto.Query + alias Pleroma.Repo + alias Pleroma.Web.MastodonAPI.TimelineController + def run(_args) do Mix.Pleroma.start_pleroma() activities_count = Repo.aggregate(from(a in Pleroma.Activity), :count, :id) @@ -11,8 +14,8 @@ def run(_args) do if activities_count == 0 do IO.puts("Did not find any activities, cleaning and generating") clean_tables() - Generator.generate_users(users_max: 10) - Generator.generate_tagged_activities() + Pleroma.LoadTesting.Users.generate_users(10) + Pleroma.LoadTesting.Activities.generate_tagged_activities() else IO.puts("Found #{activities_count} activities, won't generate new ones") end @@ -34,7 +37,7 @@ def run(_args) do Benchee.run( %{ "Hashtag fetching, any" => fn tags -> - Pleroma.Web.MastodonAPI.TimelineController.hashtag_fetching( + TimelineController.hashtag_fetching( %{ "any" => tags }, @@ -44,7 +47,7 @@ def run(_args) do end, # Will always return zero results because no overlapping hashtags are generated. "Hashtag fetching, all" => fn tags -> - Pleroma.Web.MastodonAPI.TimelineController.hashtag_fetching( + TimelineController.hashtag_fetching( %{ "all" => tags }, @@ -64,7 +67,7 @@ def run(_args) do Benchee.run( %{ "Hashtag fetching" => fn tag -> - Pleroma.Web.MastodonAPI.TimelineController.hashtag_fetching( + TimelineController.hashtag_fetching( %{ "tag" => tag }, @@ -77,11 +80,4 @@ def run(_args) do time: 5 ) end - - defp clean_tables do - IO.puts("Deleting old data...\n") - Ecto.Adapters.SQL.query!(Repo, "TRUNCATE users CASCADE;") - Ecto.Adapters.SQL.query!(Repo, "TRUNCATE activities CASCADE;") - Ecto.Adapters.SQL.query!(Repo, "TRUNCATE objects CASCADE;") - end end diff --git a/benchmarks/mix/tasks/pleroma/benchmarks/timelines.ex b/benchmarks/mix/tasks/pleroma/benchmarks/timelines.ex new file mode 100644 index 000000000..9b7ac6111 --- /dev/null +++ b/benchmarks/mix/tasks/pleroma/benchmarks/timelines.ex @@ -0,0 +1,70 @@ +defmodule Mix.Tasks.Pleroma.Benchmarks.Timelines do + use Mix.Task + + import Pleroma.LoadTesting.Helper, only: [clean_tables: 0] + + alias Pleroma.Web.CommonAPI + alias Plug.Conn + + def run(_args) do + Mix.Pleroma.start_pleroma() + + # Cleaning tables + clean_tables() + + [{:ok, user} | users] = Pleroma.LoadTesting.Users.generate_users(1000) + + # Let the user make 100 posts + + 1..100 + |> Enum.each(fn i -> CommonAPI.post(user, %{"status" => to_string(i)}) end) + + # Let 10 random users post + posts = + users + |> Enum.take_random(10) + |> Enum.map(fn {:ok, random_user} -> + {:ok, activity} = CommonAPI.post(random_user, %{"status" => "."}) + activity + end) + + # let our user repeat them + posts + |> Enum.each(fn activity -> + CommonAPI.repeat(activity.id, user) + end) + + Benchee.run( + %{ + "user timeline, no followers" => fn reading_user -> + conn = + Phoenix.ConnTest.build_conn() + |> Conn.assign(:user, reading_user) + |> Conn.assign(:skip_link_headers, true) + + Pleroma.Web.MastodonAPI.AccountController.statuses(conn, %{"id" => user.id}) + end + }, + inputs: %{"user" => user, "no user" => nil}, + time: 60 + ) + + users + |> Enum.each(fn {:ok, follower} -> Pleroma.User.follow(follower, user) end) + + Benchee.run( + %{ + "user timeline, all following" => fn reading_user -> + conn = + Phoenix.ConnTest.build_conn() + |> Conn.assign(:user, reading_user) + |> Conn.assign(:skip_link_headers, true) + + Pleroma.Web.MastodonAPI.AccountController.statuses(conn, %{"id" => user.id}) + end + }, + inputs: %{"user" => user, "no user" => nil}, + time: 60 + ) + end +end diff --git a/benchmarks/mix/tasks/pleroma/load_testing.ex b/benchmarks/mix/tasks/pleroma/load_testing.ex index 0a751adac..388883240 100644 --- a/benchmarks/mix/tasks/pleroma/load_testing.ex +++ b/benchmarks/mix/tasks/pleroma/load_testing.ex @@ -1,114 +1,56 @@ defmodule Mix.Tasks.Pleroma.LoadTesting do use Mix.Task - use Pleroma.LoadTesting.Helper - import Mix.Pleroma - import Pleroma.LoadTesting.Generator - import Pleroma.LoadTesting.Fetcher + import Ecto.Query + import Pleroma.LoadTesting.Helper, only: [clean_tables: 0] + + alias Pleroma.Repo + alias Pleroma.User @shortdoc "Factory for generation data" @moduledoc """ Generates data like: - local/remote users - - local/remote activities with notifications - - direct messages - - long thread - - non visible posts + - local/remote activities with differrent visibility: + - simple activiities + - with emoji + - with mentions + - hellthreads + - with attachments + - with tags + - likes + - reblogs + - simple threads + - long threads ## Generate data - MIX_ENV=benchmark mix pleroma.load_testing --users 20000 --dms 20000 --thread_length 2000 - MIX_ENV=benchmark mix pleroma.load_testing -u 20000 -d 20000 -t 2000 + MIX_ENV=benchmark mix pleroma.load_testing --users 20000 --friends 1000 --iterations 170 --friends_used 20 --non_friends_used 20 + MIX_ENV=benchmark mix pleroma.load_testing -u 20000 -f 1000 -i 170 -fu 20 -nfu 20 Options: - `--users NUMBER` - number of users to generate. Defaults to: 20000. Alias: `-u` - - `--dms NUMBER` - number of direct messages to generate. Defaults to: 20000. Alias `-d` - - `--thread_length` - number of messages in thread. Defaults to: 2000. ALias `-t` + - `--friends NUMBER` - number of friends for main user. Defaults to: 1000. Alias: `-f` + - `--iterations NUMBER` - number of iterations to generate activities. For each iteration in database is inserted about 120+ activities with different visibility, actors and types.Defaults to: 170. Alias: `-i` + - `--friends_used NUMBER` - number of main user friends used in activity generation. Defaults to: 20. Alias: `-fu` + - `--non_friends_used NUMBER` - number of non friends used in activity generation. Defaults to: 20. Alias: `-nfu` """ - @aliases [u: :users, d: :dms, t: :thread_length] + @aliases [u: :users, f: :friends, i: :iterations, fu: :friends_used, nfu: :non_friends_used] @switches [ users: :integer, - dms: :integer, - thread_length: :integer + friends: :integer, + iterations: :integer, + friends_used: :integer, + non_friends_used: :integer ] - @users_default 20_000 - @dms_default 1_000 - @thread_length_default 2_000 def run(args) do - start_pleroma() - Pleroma.Config.put([:instance, :skip_thread_containment], true) + Logger.configure(level: :error) + Mix.Pleroma.start_pleroma() + clean_tables() {opts, _} = OptionParser.parse!(args, strict: @switches, aliases: @aliases) - users_max = Keyword.get(opts, :users, @users_default) - dms_max = Keyword.get(opts, :dms, @dms_default) - thread_length = Keyword.get(opts, :thread_length, @thread_length_default) - - clean_tables() - - opts = - Keyword.put(opts, :users_max, users_max) - |> Keyword.put(:dms_max, dms_max) - |> Keyword.put(:thread_length, thread_length) - - generate_users(opts) - - # main user for queries - IO.puts("Fetching local main user...") - - {time, user} = - :timer.tc(fn -> - Repo.one( - from(u in User, where: u.local == true, order_by: fragment("RANDOM()"), limit: 1) - ) - end) - - IO.puts("Fetching main user take #{to_sec(time)} sec.\n") - - IO.puts("Fetching local users...") - - {time, users} = - :timer.tc(fn -> - Repo.all( - from(u in User, - where: u.id != ^user.id, - where: u.local == true, - order_by: fragment("RANDOM()"), - limit: 10 - ) - ) - end) - - IO.puts("Fetching local users take #{to_sec(time)} sec.\n") - - IO.puts("Fetching remote users...") - - {time, remote_users} = - :timer.tc(fn -> - Repo.all( - from(u in User, - where: u.id != ^user.id, - where: u.local == false, - order_by: fragment("RANDOM()"), - limit: 10 - ) - ) - end) - - IO.puts("Fetching remote users take #{to_sec(time)} sec.\n") - - generate_activities(user, users) - - generate_remote_activities(user, remote_users) - - generate_like_activities( - user, Pleroma.Repo.all(Pleroma.Activity.Queries.by_type("Create")) - ) - - generate_dms(user, users, opts) - - {:ok, activity} = generate_long_thread(user, users, opts) - - generate_non_visible_message(user, users) + user = Pleroma.LoadTesting.Users.generate(opts) + Pleroma.LoadTesting.Activities.generate(user, opts) IO.puts("Users in DB: #{Repo.aggregate(from(u in User), :count, :id)}") @@ -120,19 +62,6 @@ def run(args) do "Notifications in DB: #{Repo.aggregate(from(n in Pleroma.Notification), :count, :id)}" ) - fetch_user(user) - query_timelines(user) - query_notifications(user) - query_dms(user) - query_long_thread(user, activity) - Pleroma.Config.put([:instance, :skip_thread_containment], false) - query_timelines(user) - end - - defp clean_tables do - IO.puts("Deleting old data...\n") - Ecto.Adapters.SQL.query!(Repo, "TRUNCATE users CASCADE;") - Ecto.Adapters.SQL.query!(Repo, "TRUNCATE activities CASCADE;") - Ecto.Adapters.SQL.query!(Repo, "TRUNCATE objects CASCADE;") + Pleroma.LoadTesting.Fetcher.run_benchmarks(user) end end diff --git a/config/benchmark.exs b/config/benchmark.exs index ff59395cf..e867253eb 100644 --- a/config/benchmark.exs +++ b/config/benchmark.exs @@ -39,7 +39,7 @@ adapter: Ecto.Adapters.Postgres, username: "postgres", password: "postgres", - database: "pleroma_test", + database: "pleroma_benchmark", hostname: System.get_env("DB_HOST") || "localhost", pool_size: 10 diff --git a/config/config.exs b/config/config.exs index 2ab939107..d15998715 100644 --- a/config/config.exs +++ b/config/config.exs @@ -58,20 +58,6 @@ config :pleroma, Pleroma.Captcha.Kocaptcha, endpoint: "https://captcha.kotobank.ch" -config :pleroma, :hackney_pools, - federation: [ - max_connections: 50, - timeout: 150_000 - ], - media: [ - max_connections: 50, - timeout: 150_000 - ], - upload: [ - max_connections: 25, - timeout: 300_000 - ] - # Upload configuration config :pleroma, Pleroma.Upload, uploader: Pleroma.Uploaders.Local, @@ -85,7 +71,8 @@ follow_redirect: true, pool: :upload ] - ] + ], + filename_display_max_length: 30 config :pleroma, Pleroma.Uploaders.Local, uploads: "uploads" @@ -184,27 +171,20 @@ "application/ld+json" => ["activity+json"] } -config :tesla, adapter: Tesla.Adapter.Hackney - +config :tesla, adapter: Tesla.Adapter.Gun # Configures http settings, upstream proxy etc. config :pleroma, :http, proxy_url: nil, send_user_agent: true, user_agent: :default, - adapter: [ - ssl_options: [ - # Workaround for remote server certificate chain issues - partial_chain: &:hackney_connect.partial_chain/1, - # We don't support TLS v1.3 yet - versions: [:tlsv1, :"tlsv1.1", :"tlsv1.2"] - ] - ] + adapter: [] config :pleroma, :instance, name: "Pleroma", email: "example@example.com", notify_email: "noreply@example.com", description: "A Pleroma instance, an alternative fediverse server", + background_image: "/images/city.jpg", limit: 5_000, chat_limit: 5_000, remote_limit: 100_000, @@ -260,7 +240,18 @@ account_field_value_length: 2048, external_user_synchronization: true, extended_nickname_format: true, - cleanup_attachments: false + cleanup_attachments: false, + multi_factor_authentication: [ + totp: [ + # digits 6 or 8 + digits: 6, + period: 30 + ], + backup_codes: [ + number: 5, + length: 16 + ] + ] config :pleroma, :feed, post_title: %{ @@ -282,20 +273,33 @@ config :pleroma, :frontend_configurations, pleroma_fe: %{ - theme: "pleroma-dark", - logo: "/static/logo.png", + alwaysShowSubjectInput: true, background: "/images/city.jpg", - redirectRootNoLogin: "/main/all", - redirectRootLogin: "/main/friends", - showInstanceSpecificPanel: true, - scopeOptionsEnabled: false, - formattingOptionsEnabled: false, collapseMessageWithSubject: false, + disableChat: false, + greentext: false, + hideFilteredStatuses: false, + hideMutedPosts: false, hidePostStats: false, + hideSitename: false, hideUserStats: false, + loginMethod: "password", + logo: "/static/logo.png", + logoMargin: ".1em", + logoMask: true, + minimalScopesMode: false, + noAttachmentLinks: false, + nsfwCensorImage: "", + postContentType: "text/plain", + redirectRootLogin: "/main/friends", + redirectRootNoLogin: "/main/all", scopeCopy: true, + sidebarRight: false, + showFeaturesPanel: true, + showInstanceSpecificPanel: false, subjectLineBehavior: "email", - alwaysShowSubjectInput: true + theme: "pleroma-dark", + webPushNotifications: false }, masto_fe: %{ showInstanceSpecificPanel: true @@ -356,7 +360,8 @@ reject: [], accept: [], avatar_removal: [], - banner_removal: [] + banner_removal: [], + reject_deletes: [] config :pleroma, :mrf_keyword, reject: [], @@ -386,6 +391,10 @@ config :pleroma, :media_proxy, enabled: false, + invalidation: [ + enabled: false, + provider: Pleroma.Web.MediaProxy.Invalidation.Script + ], proxy_opts: [ redirect_on_failure: false, max_body_length: 25 * 1_048_576, @@ -624,11 +633,56 @@ parameters: [gin_fuzzy_search_limit: "500"], prepare: :unnamed +config :pleroma, :connections_pool, + checkin_timeout: 250, + max_connections: 250, + retry: 1, + retry_timeout: 1000, + await_up_timeout: 5_000 + +config :pleroma, :pools, + federation: [ + size: 50, + max_overflow: 10, + timeout: 150_000 + ], + media: [ + size: 50, + max_overflow: 10, + timeout: 150_000 + ], + upload: [ + size: 25, + max_overflow: 5, + timeout: 300_000 + ], + default: [ + size: 10, + max_overflow: 2, + timeout: 10_000 + ] + +config :pleroma, :hackney_pools, + federation: [ + max_connections: 50, + timeout: 150_000 + ], + media: [ + max_connections: 50, + timeout: 150_000 + ], + upload: [ + max_connections: 25, + timeout: 300_000 + ] + config :pleroma, :restrict_unauthenticated, timelines: %{local: false, federated: false}, profiles: %{local: false, remote: false}, activities: %{local: false, remote: false} +config :pleroma, Pleroma.Web.ApiSpec.CastAndValidate, strict: false + # 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/config/description.exs b/config/description.exs index 3781fb9cb..807c945e0 100644 --- a/config/description.exs +++ b/config/description.exs @@ -28,7 +28,8 @@ %{ key: :filters, type: {:list, :module}, - description: "List of filter modules for uploads", + description: + "List of filter modules for uploads. Module names are shortened (removed leading `Pleroma.Upload.Filter.` part), but on adding custom module you need to use full name.", suggestions: Generator.list_modules_in_dir( "lib/pleroma/upload/filter", @@ -118,6 +119,11 @@ ] } ] + }, + %{ + key: :filename_display_max_length, + type: :integer, + description: "Set max length of a filename to display. 0 = no limit. Default: 30" } ] }, @@ -678,14 +684,6 @@ 7 ] }, - %{ - key: :federation_publisher_modules, - type: {:list, :module}, - description: "List of modules for federation publishing", - suggestions: [ - Pleroma.Web.ActivityPub.Publisher - ] - }, %{ key: :allow_relay, type: :boolean, @@ -694,7 +692,8 @@ %{ key: :rewrite_policy, type: [:module, {:list, :module}], - description: "A list of MRF policies enabled", + description: + "A list of enabled MRF policies. Module names are shortened (removed leading `Pleroma.Web.ActivityPub.MRF.` part), but on adding custom module you need to use full name.", suggestions: Generator.list_modules_in_dir( "lib/pleroma/web/activity_pub/mrf", @@ -712,7 +711,7 @@ key: :quarantined_instances, type: {:list, :string}, description: - "List of ActivityPub instances where private (DMs, followers-only) activities will not be send", + "List of ActivityPub instances where private (DMs, followers-only) activities will not be sent", suggestions: [ "quarantined.com", "*.quarantined.com" @@ -919,6 +918,69 @@ key: :external_user_synchronization, type: :boolean, description: "Enabling following/followers counters synchronization for external users" + }, + %{ + key: :multi_factor_authentication, + type: :keyword, + description: "Multi-factor authentication settings", + suggestions: [ + [ + totp: [digits: 6, period: 30], + backup_codes: [number: 5, length: 16] + ] + ], + children: [ + %{ + key: :totp, + type: :keyword, + description: "TOTP settings", + suggestions: [digits: 6, period: 30], + children: [ + %{ + key: :digits, + type: :integer, + suggestions: [6], + description: + "Determines the length of a one-time pass-code, in characters. Defaults to 6 characters." + }, + %{ + key: :period, + type: :integer, + suggestions: [30], + description: + "a period for which the TOTP code will be valid, in seconds. Defaults to 30 seconds." + } + ] + }, + %{ + key: :backup_codes, + type: :keyword, + description: "MFA backup codes settings", + suggestions: [number: 5, length: 16], + children: [ + %{ + key: :number, + type: :integer, + suggestions: [5], + description: "number of backup codes to generate." + }, + %{ + key: :length, + type: :integer, + suggestions: [16], + description: + "Determines the length of backup one-time pass-codes, in characters. Defaults to 16 characters." + } + ] + } + ] + }, + %{ + key: :instance_thumbnail, + type: :string, + description: + "The instance thumbnail image. It will appear in [Pleroma Instances](http://distsn.org/pleroma-instances.html)", + suggestions: ["/instance/thumbnail.jpeg"] } ] }, @@ -1046,32 +1108,98 @@ description: "Settings for Pleroma FE", suggestions: [ %{ - theme: "pleroma-dark", - logo: "/static/logo.png", - background: "/images/city.jpg", - redirectRootNoLogin: "/main/all", - redirectRootLogin: "/main/friends", - showInstanceSpecificPanel: true, - scopeOptionsEnabled: false, - formattingOptionsEnabled: false, - collapseMessageWithSubject: false, - hidePostStats: false, - hideUserStats: false, - scopeCopy: true, - subjectLineBehavior: "email", alwaysShowSubjectInput: true, - logoMask: false, + background: "/static/aurora_borealis.jpg", + collapseMessageWithSubject: false, + disableChat: false, + greentext: false, + hideFilteredStatuses: false, + hideMutedPosts: false, + hidePostStats: false, + hideSitename: false, + hideUserStats: false, + loginMethod: "password", + logo: "/static/logo.png", logoMargin: ".1em", - stickers: false, - enableEmojiPicker: false + logoMask: true, + minimalScopesMode: false, + noAttachmentLinks: false, + nsfwCensorImage: "/static/img/nsfw.74818f9.png", + postContentType: "text/plain", + redirectRootLogin: "/main/friends", + redirectRootNoLogin: "/main/all", + scopeCopy: true, + sidebarRight: false, + showFeaturesPanel: true, + showInstanceSpecificPanel: false, + subjectLineBehavior: "email", + theme: "pleroma-dark", + webPushNotifications: false } ], children: [ %{ - key: :theme, + key: :alwaysShowSubjectInput, + label: "Always show subject input", + type: :boolean, + description: "When disabled, auto-hide the subject field if it's empty" + }, + %{ + key: :background, type: :string, - description: "Which theme to use, they are defined in styles.json", - suggestions: ["pleroma-dark"] + description: + "URL of the background, unless viewing a user profile with a background that is set", + suggestions: ["/images/city.jpg"] + }, + %{ + key: :collapseMessageWithSubject, + label: "Collapse message with subject", + type: :boolean, + description: + "When a message has a subject (aka Content Warning), collapse it by default" + }, + %{ + key: :disableChat, + label: "PleromaFE Chat", + type: :boolean, + description: "Disables PleromaFE Chat component" + }, + %{ + key: :greentext, + label: "Greentext", + type: :boolean, + description: "Enables green text on lines prefixed with the > character." + }, + %{ + key: :hideFilteredStatuses, + label: "Hide Filtered Statuses", + type: :boolean, + description: "Hides filtered statuses from timelines." + }, + %{ + key: :hideMutedPosts, + label: "Hide Muted Posts", + type: :boolean, + description: "Hides muted statuses from timelines." + }, + %{ + key: :hidePostStats, + label: "Hide post stats", + type: :boolean, + description: "Hide notices statistics (repeats, favorites, ...)" + }, + %{ + key: :hideSitename, + label: "Hide Sitename", + type: :boolean, + description: "Hides instance name from PleromaFE banner." + }, + %{ + key: :hideUserStats, + label: "Hide user stats", + type: :boolean, + description: + "Hide profile statistics (posts, posts per day, followers, followings, ...)" }, %{ key: :logo, @@ -1080,11 +1208,44 @@ suggestions: ["/static/logo.png"] }, %{ - key: :background, + key: :logoMargin, + label: "Logo margin", type: :string, description: - "URL of the background, unless viewing a user profile with a background that is set", - suggestions: ["/images/city.jpg"] + "Allows you to adjust vertical margins between logo boundary and navbar borders. " <> + "The idea is that to have logo's image without any extra margins and instead adjust them to your need in layout.", + suggestions: [".1em"] + }, + %{ + key: :logoMask, + label: "Logo mask", + type: :boolean, + description: + "By default it assumes logo used will be monochrome with alpha channel to be compatible with both light and dark themes. " <> + "If you want a colorful logo you must disable logoMask." + }, + %{ + key: :minimalScopesMode, + label: "Minimal scopes mode", + type: :boolean, + description: + "Limit scope selection to Direct, User default, and Scope of post replying to. " <> + "Also prevents replying to a DM with a public post from PleromaFE." + }, + %{ + key: :nsfwCensorImage, + label: "NSFW Censor Image", + type: :string, + description: + "URL of the image to use for hiding NSFW media attachments in the timeline.", + suggestions: ["/static/img/nsfw.74818f9.png"] + }, + %{ + key: :postContentType, + label: "Post Content Type", + type: {:dropdown, :atom}, + description: "Default post formatting option.", + suggestions: ["text/plain", "text/html", "text/markdown", "text/bbcode"] }, %{ key: :redirectRootNoLogin, @@ -1102,51 +1263,31 @@ "Relative URL which indicates where to redirect when a user is logged in", suggestions: ["/main/friends"] }, - %{ - key: :showInstanceSpecificPanel, - label: "Show instance specific panel", - type: :boolean, - description: "Whenether to show the instance's specific panel" - }, - %{ - key: :scopeOptionsEnabled, - label: "Scope options enabled", - type: :boolean, - description: "Enable setting a notice visibility and subject/CW when posting" - }, - %{ - key: :formattingOptionsEnabled, - label: "Formatting options enabled", - type: :boolean, - description: - "Enable setting a formatting different than plain-text (ie. HTML, Markdown) when posting, relates to `:instance`, `allowed_post_formats`" - }, - %{ - key: :collapseMessageWithSubject, - label: "Collapse message with subject", - type: :boolean, - description: - "When a message has a subject (aka Content Warning), collapse it by default" - }, - %{ - key: :hidePostStats, - label: "Hide post stats", - type: :boolean, - description: "Hide notices statistics (repeats, favorites, ...)" - }, - %{ - key: :hideUserStats, - label: "Hide user stats", - type: :boolean, - description: - "Hide profile statistics (posts, posts per day, followers, followings, ...)" - }, %{ key: :scopeCopy, label: "Scope copy", type: :boolean, description: "Copy the scope (private/unlisted/public) in replies to posts by default" }, + %{ + key: :sidebarRight, + label: "Sidebar on Right", + type: :boolean, + description: "Change alignment of sidebar and panels to the right." + }, + %{ + key: :showFeaturesPanel, + label: "Show instance features panel", + type: :boolean, + description: + "Enables panel displaying functionality of the instance on the About page." + }, + %{ + key: :showInstanceSpecificPanel, + label: "Show instance specific panel", + type: :boolean, + description: "Whether to show the instance's custom panel" + }, %{ key: :subjectLineBehavior, label: "Subject line behavior", @@ -1158,38 +1299,10 @@ suggestions: ["email", "masto", "noop"] }, %{ - key: :alwaysShowSubjectInput, - label: "Always show subject input", - type: :boolean, - description: "When disabled, auto-hide the subject field if it's empty" - }, - %{ - key: :logoMask, - label: "Logo mask", - type: :boolean, - description: - "By default it assumes logo used will be monochrome with alpha channel to be compatible with both light and dark themes. " <> - "If you want a colorful logo you must disable logoMask." - }, - %{ - key: :logoMargin, - label: "Logo margin", + key: :theme, type: :string, - description: - "Allows you to adjust vertical margins between logo boundary and navbar borders. " <> - "The idea is that to have logo's image without any extra margins and instead adjust them to your need in layout.", - suggestions: [".1em"] - }, - %{ - key: :stickers, - type: :boolean, - description: "Enables stickers." - }, - %{ - key: :enableEmojiPicker, - label: "Emoji picker", - type: :boolean, - description: "Enables emoji picker." + description: "Which theme to use. Available themes are defined in styles.json", + suggestions: ["pleroma-dark"] } ] }, @@ -1245,6 +1358,12 @@ suggestions: [ :pleroma_fox_tan ] + }, + %{ + key: :default_user_avatar, + type: :string, + description: "URL of the default user avatar.", + suggestions: ["/images/avi.png"] } ] }, @@ -1317,13 +1436,13 @@ %{ key: :reject, type: {:list, :string}, - description: "List of instances to reject any activities from", + description: "List of instances to reject activities from (except deletes)", suggestions: ["example.com", "*.example.com"] }, %{ key: :accept, type: {:list, :string}, - description: "List of instances to accept any activities from", + description: "List of instances to only accept activities from (except deletes)", suggestions: ["example.com", "*.example.com"] }, %{ @@ -1343,6 +1462,12 @@ type: {:list, :string}, description: "List of instances to strip banners from", suggestions: ["example.com", "*.example.com"] + }, + %{ + key: :reject_deletes, + type: {:list, :string}, + description: "List of instances to reject deletions from", + suggestions: ["example.com", "*.example.com"] } ] }, @@ -1793,12 +1918,6 @@ (see https://github.com/sorentwo/oban/issues/52). """, children: [ - %{ - key: :repo, - type: :module, - description: "Application's Ecto repo", - suggestions: [Pleroma.Repo] - }, %{ key: :verbose, type: {:dropdown, :atom}, @@ -1969,7 +2088,8 @@ %{ key: :parsers, type: {:list, :module}, - description: "List of Rich Media parsers.", + description: + "List of Rich Media parsers. Module names are shortened (removed leading `Pleroma.Web.RichMedia.Parsers.` part), but on adding custom module you need to use full name.", suggestions: [ Pleroma.Web.RichMedia.Parsers.MetaTagsParser, Pleroma.Web.RichMedia.Parsers.OEmbed, @@ -1981,7 +2101,8 @@ key: :ttl_setters, label: "TTL setters", type: {:list, :module}, - description: "List of rich media TTL setters.", + description: + "List of rich media TTL setters. Module names are shortened (removed leading `Pleroma.Web.RichMedia.Parser.` part), but on adding custom module you need to use full name.", suggestions: [ Pleroma.Web.RichMedia.Parser.TTL.AwsSignedUrl ] @@ -2241,6 +2362,7 @@ children: [ %{ key: :active, + label: "Enabled", type: :boolean, description: "Globally enable or disable digest emails" }, @@ -2442,7 +2564,7 @@ %{ key: :relations_actions, type: [:tuple, {:list, :tuple}], - description: "For actions on relations with all users (follow, unfollow)", + description: "For actions on relationships with all users (follow, unfollow)", suggestions: [{1000, 10}, [{10_000, 10}, {10_000, 50}]] }, %{ @@ -2570,18 +2692,6 @@ } ] }, - %{ - group: :http_signatures, - type: :group, - description: "HTTP Signatures settings", - children: [ - %{ - key: :adapter, - type: :module, - suggestions: [Pleroma.Signature] - } - ] - }, %{ group: :pleroma, key: :http, @@ -2654,6 +2764,8 @@ %{ key: :scrub_policy, type: {:list, :module}, + description: + "Module names are shortened (removed leading `Pleroma.HTML.` part), but on adding custom module you need to use full name.", suggestions: [Pleroma.HTML.Transform.MediaProxy, Pleroma.HTML.Scrubber.Default] } ] @@ -2916,6 +3028,219 @@ } ] }, + %{ + group: :pleroma, + key: :connections_pool, + type: :group, + description: "Advanced settings for `gun` connections pool", + children: [ + %{ + key: :checkin_timeout, + type: :integer, + description: "Timeout to checkin connection from pool. Default: 250ms.", + suggestions: [250] + }, + %{ + key: :max_connections, + type: :integer, + description: "Maximum number of connections in the pool. Default: 250 connections.", + suggestions: [250] + }, + %{ + key: :retry, + type: :integer, + description: + "Number of retries, while `gun` will try to reconnect if connection goes down. Default: 1.", + suggestions: [1] + }, + %{ + key: :retry_timeout, + type: :integer, + description: + "Time between retries when `gun` will try to reconnect in milliseconds. Default: 1000ms.", + suggestions: [1000] + }, + %{ + key: :await_up_timeout, + type: :integer, + description: "Timeout while `gun` will wait until connection is up. Default: 5000ms.", + suggestions: [5000] + } + ] + }, + %{ + group: :pleroma, + key: :pools, + type: :group, + description: "Advanced settings for `gun` workers pools", + children: [ + %{ + key: :federation, + type: :keyword, + description: "Settings for federation pool.", + children: [ + %{ + key: :size, + type: :integer, + description: "Number workers in the pool.", + suggestions: [50] + }, + %{ + key: :max_overflow, + type: :integer, + description: "Number of additional workers if pool is under load.", + suggestions: [10] + }, + %{ + key: :timeout, + type: :integer, + description: "Timeout while `gun` will wait for response.", + suggestions: [150_000] + } + ] + }, + %{ + key: :media, + type: :keyword, + description: "Settings for media pool.", + children: [ + %{ + key: :size, + type: :integer, + description: "Number workers in the pool.", + suggestions: [50] + }, + %{ + key: :max_overflow, + type: :integer, + description: "Number of additional workers if pool is under load.", + suggestions: [10] + }, + %{ + key: :timeout, + type: :integer, + description: "Timeout while `gun` will wait for response.", + suggestions: [150_000] + } + ] + }, + %{ + key: :upload, + type: :keyword, + description: "Settings for upload pool.", + children: [ + %{ + key: :size, + type: :integer, + description: "Number workers in the pool.", + suggestions: [25] + }, + %{ + key: :max_overflow, + type: :integer, + description: "Number of additional workers if pool is under load.", + suggestions: [5] + }, + %{ + key: :timeout, + type: :integer, + description: "Timeout while `gun` will wait for response.", + suggestions: [300_000] + } + ] + }, + %{ + key: :default, + type: :keyword, + description: "Settings for default pool.", + children: [ + %{ + key: :size, + type: :integer, + description: "Number workers in the pool.", + suggestions: [10] + }, + %{ + key: :max_overflow, + type: :integer, + description: "Number of additional workers if pool is under load.", + suggestions: [2] + }, + %{ + key: :timeout, + type: :integer, + description: "Timeout while `gun` will wait for response.", + suggestions: [10_000] + } + ] + } + ] + }, + %{ + group: :pleroma, + key: :hackney_pools, + type: :group, + description: "Advanced settings for `hackney` connections pools", + children: [ + %{ + key: :federation, + type: :keyword, + description: "Settings for federation pool.", + children: [ + %{ + key: :max_connections, + type: :integer, + description: "Number workers in the pool.", + suggestions: [50] + }, + %{ + key: :timeout, + type: :integer, + description: "Timeout while `hackney` will wait for response.", + suggestions: [150_000] + } + ] + }, + %{ + key: :media, + type: :keyword, + description: "Settings for media pool.", + children: [ + %{ + key: :max_connections, + type: :integer, + description: "Number workers in the pool.", + suggestions: [50] + }, + %{ + key: :timeout, + type: :integer, + description: "Timeout while `hackney` will wait for response.", + suggestions: [150_000] + } + ] + }, + %{ + key: :upload, + type: :keyword, + description: "Settings for upload pool.", + children: [ + %{ + key: :max_connections, + type: :integer, + description: "Number workers in the pool.", + suggestions: [25] + }, + %{ + key: :timeout, + type: :integer, + description: "Timeout while `hackney` will wait for response.", + suggestions: [300_000] + } + ] + } + ] + }, %{ group: :pleroma, key: :restrict_unauthenticated, @@ -2975,5 +3300,19 @@ ] } ] + }, + %{ + group: :pleroma, + key: Pleroma.Web.ApiSpec.CastAndValidate, + type: :group, + children: [ + %{ + key: :strict, + type: :boolean, + description: + "Enables strict input validation (useful in development, not recommended in production)", + suggestions: [false] + } + ] } ] diff --git a/config/dev.exs b/config/dev.exs index 7e1e3b4be..4faaeff5b 100644 --- a/config/dev.exs +++ b/config/dev.exs @@ -52,6 +52,8 @@ hostname: "localhost", pool_size: 10 +config :pleroma, Pleroma.Web.ApiSpec.CastAndValidate, strict: true + if File.exists?("./config/dev.secret.exs") do import_config "dev.secret.exs" else diff --git a/config/test.exs b/config/test.exs index b8ea63c94..e38b9967d 100644 --- a/config/test.exs +++ b/config/test.exs @@ -56,6 +56,19 @@ ignore_hosts: [], ignore_tld: ["local", "localdomain", "lan"] +config :pleroma, :instance, + multi_factor_authentication: [ + totp: [ + # digits 6 or 8 + digits: 6, + period: 30 + ], + backup_codes: [ + number: 2, + length: 6 + ] + ] + config :web_push_encryption, :vapid_details, subject: "mailto:administrator@example.com", public_key: @@ -90,10 +103,14 @@ config :pleroma, :modules, runtime_dir: "test/fixtures/modules" +config :pleroma, Pleroma.Gun, Pleroma.GunMock + config :pleroma, Pleroma.Emails.NewUsersDigestEmail, enabled: true config :pleroma, Pleroma.Plugs.RemoteIp, enabled: false +config :pleroma, Pleroma.Web.ApiSpec.CastAndValidate, strict: true + if File.exists?("./config/test.secret.exs") do import_config "test.secret.exs" else diff --git a/coveralls.json b/coveralls.json new file mode 100644 index 000000000..75e845ade --- /dev/null +++ b/coveralls.json @@ -0,0 +1,6 @@ +{ + "skip_files": [ + "test/support", + "lib/mix/tasks/pleroma/benchmark.ex" + ] +} \ No newline at end of file diff --git a/docs/API/admin_api.md b/docs/API/admin_api.md index 47afdfba5..639c3224d 100644 --- a/docs/API/admin_api.md +++ b/docs/API/admin_api.md @@ -392,10 +392,24 @@ Note: Available `:permission_group` is currently moderator and admin. 404 is ret - `email` - `name`, optional +- Response: + - On success: `204`, empty response + - On failure: + - 400 Bad Request, JSON: + + ```json + [ + { + "error": "Appropriate error message here" + } + ] + ``` + ## `GET /api/pleroma/admin/users/:nickname/password_reset` ### Get a password reset token for a given nickname + - Params: none - Response: @@ -414,6 +428,107 @@ Note: Available `:permission_group` is currently moderator and admin. 404 is ret - `nicknames` - Response: none (code `204`) +## PUT `/api/pleroma/admin/users/disable_mfa` + +### Disable mfa for user's account. + +- Params: + - `nickname` +- Response: User’s nickname + +## `GET /api/pleroma/admin/users/:nickname/credentials` + +### Get the user's email, password, display and settings-related fields + +- Params: + - `nickname` + +- Response: + +```json +{ + "actor_type": "Person", + "allow_following_move": true, + "avatar": "https://pleroma.social/media/7e8e7508fd545ef580549b6881d80ec0ff2c81ed9ad37b9bdbbdf0e0d030159d.jpg", + "background": "https://pleroma.social/media/4de34c0bd10970d02cbdef8972bef0ebbf55f43cadc449554d4396156162fe9a.jpg", + "banner": "https://pleroma.social/media/8d92ba2bd244b613520abf557dd448adcd30f5587022813ee9dd068945986946.jpg", + "bio": "bio", + "default_scope": "public", + "discoverable": false, + "email": "user@example.com", + "fields": [ + { + "name": "example", + "value": "https://example.com" + } + ], + "hide_favorites": false, + "hide_followers": false, + "hide_followers_count": false, + "hide_follows": false, + "hide_follows_count": false, + "id": "9oouHaEEUR54hls968", + "locked": true, + "name": "user", + "no_rich_text": true, + "pleroma_settings_store": {}, + "raw_fields": [ + { + "id": 1, + "name": "example", + "value": "https://example.com" + }, + ], + "show_role": true, + "skip_thread_containment": false +} +``` + +## `PATCH /api/pleroma/admin/users/:nickname/credentials` + +### Change the user's email, password, display and settings-related fields + +- Params: + - `email` + - `password` + - `name` + - `bio` + - `avatar` + - `locked` + - `no_rich_text` + - `default_scope` + - `banner` + - `hide_follows` + - `hide_followers` + - `hide_followers_count` + - `hide_follows_count` + - `hide_favorites` + - `allow_following_move` + - `background` + - `show_role` + - `skip_thread_containment` + - `fields` + - `discoverable` + - `actor_type` + +- Response: + +```json +{"status": "success"} +``` + +```json +{"errors": + {"actor_type": "is invalid"}, + {"email": "has invalid format"}, + ... + } +``` + +```json +{"error": "Unable to update user."} +``` + ## `GET /api/pleroma/admin/reports` ### Get a list of reports @@ -665,6 +780,17 @@ Note: Available `:permission_group` is currently moderator and admin. 404 is ret - 400 Bad Request `"Invalid parameters"` when `status` is missing - On success: `204`, empty response +## `GET /api/pleroma/admin/statuses/:id` + +### Show status by id + +- Params: + - `id`: required, status id +- Response: + - On failure: + - 404 Not Found `"Not Found"` + - On success: JSON, Mastodon Status entity + ## `PUT /api/pleroma/admin/statuses/:id` ### Change the scope of an individual reported status @@ -696,6 +822,8 @@ Note: Available `:permission_group` is currently moderator and admin. 404 is ret ### Restarts pleroma application +**Only works when configuration from database is enabled.** + - Params: none - Response: - On failure: @@ -705,11 +833,24 @@ Note: Available `:permission_group` is currently moderator and admin. 404 is ret {} ``` +## `GET /api/pleroma/admin/need_reboot` + +### Returns the flag whether the pleroma should be restarted + +- Params: none +- Response: + - `need_reboot` - boolean +```json +{ + "need_reboot": false +} +``` + ## `GET /api/pleroma/admin/config` ### Get list of merged default settings with saved in database. -*If `need_reboot` flag exists in response, instance must be restarted, so reboot time settings can take effect.* +*If `need_reboot` is `true`, instance must be restarted, so reboot time settings can take effect.* **Only works when configuration from database is enabled.** @@ -731,13 +872,12 @@ Note: Available `:permission_group` is currently moderator and admin. 404 is ret "need_reboot": true } ``` - need_reboot - *optional*, if were changed reboot time settings. ## `POST /api/pleroma/admin/config` ### Update config settings -*If `need_reboot` flag exists in response, instance must be restarted, so reboot time settings can take effect.* +*If `need_reboot` is `true`, instance must be restarted, so reboot time settings can take effect.* **Only works when configuration from database is enabled.** @@ -764,6 +904,8 @@ Some modifications are necessary to save the config settings correctly: Most of the settings will be applied in `runtime`, this means that you don't need to restart the instance. But some settings are applied in `compile time` and require a reboot of the instance, such as: - all settings inside these keys: - `:hackney_pools` + - `:connections_pool` + - `:pools` - `:chat` - partially settings inside these keys: - `:seconds_valid` in `Pleroma.Captcha` @@ -879,7 +1021,6 @@ config :quack, "need_reboot": true } ``` -need_reboot - *optional*, if were changed reboot time settings. ## ` GET /api/pleroma/admin/config/descriptions` @@ -983,3 +1124,104 @@ Loads json generated from `config/descriptions.exs`. } } ``` + +## `GET /api/pleroma/admin/oauth_app` + +### List OAuth app + +- Params: + - *optional* `name` + - *optional* `client_id` + - *optional* `page` + - *optional* `page_size` + - *optional* `trusted` + +- Response: + +```json +{ + "apps": [ + { + "id": 1, + "name": "App name", + "client_id": "yHoDSiWYp5mPV6AfsaVOWjdOyt5PhWRiafi6MRd1lSk", + "client_secret": "nLmis486Vqrv2o65eM9mLQx_m_4gH-Q6PcDpGIMl6FY", + "redirect_uri": "https://example.com/oauth-callback", + "website": "https://example.com", + "trusted": true + } + ], + "count": 17, + "page_size": 50 +} +``` + + +## `POST /api/pleroma/admin/oauth_app` + +### Create OAuth App + +- Params: + - `name` + - `redirect_uris` + - `scopes` + - *optional* `website` + - *optional* `trusted` + +- Response: + +```json +{ + "id": 1, + "name": "App name", + "client_id": "yHoDSiWYp5mPV6AfsaVOWjdOyt5PhWRiafi6MRd1lSk", + "client_secret": "nLmis486Vqrv2o65eM9mLQx_m_4gH-Q6PcDpGIMl6FY", + "redirect_uri": "https://example.com/oauth-callback", + "website": "https://example.com", + "trusted": true +} +``` + +- On failure: +```json +{ + "redirect_uris": "can't be blank", + "name": "can't be blank" +} +``` + +## `PATCH /api/pleroma/admin/oauth_app/:id` + +### Update OAuth App + +- Params: + - *optional* `name` + - *optional* `redirect_uris` + - *optional* `scopes` + - *optional* `website` + - *optional* `trusted` + +- Response: + +```json +{ + "id": 1, + "name": "App name", + "client_id": "yHoDSiWYp5mPV6AfsaVOWjdOyt5PhWRiafi6MRd1lSk", + "client_secret": "nLmis486Vqrv2o65eM9mLQx_m_4gH-Q6PcDpGIMl6FY", + "redirect_uri": "https://example.com/oauth-callback", + "website": "https://example.com", + "trusted": true +} +``` + +## `DELETE /api/pleroma/admin/oauth_app/:id` + +### Delete OAuth App + +- Params: None + +- Response: + - On success: `204`, empty response + - On failure: + - 400 Bad Request `"Invalid parameters"` when `status` is missing \ No newline at end of file diff --git a/docs/API/differences_in_mastoapi_responses.md b/docs/API/differences_in_mastoapi_responses.md index dc8f54d2a..434ade9a4 100644 --- a/docs/API/differences_in_mastoapi_responses.md +++ b/docs/API/differences_in_mastoapi_responses.md @@ -4,16 +4,13 @@ A Pleroma instance can be identified by " (compatible; Pleroma ## Flake IDs -Pleroma uses 128-bit ids as opposed to Mastodon's 64 bits. However just like Mastodon's ids they are sortable strings - -## Attachment cap - -Some apps operate under the assumption that no more than 4 attachments can be returned or uploaded. Pleroma however does not enforce any limits on attachment count neither when returning the status object nor when posting. +Pleroma uses 128-bit ids as opposed to Mastodon's 64 bits. However just like Mastodon's ids they are lexically sortable strings ## Timelines Adding the parameter `with_muted=true` to the timeline queries will also return activities by muted (not by blocked!) users. Adding the parameter `exclude_visibilities` to the timeline queries will exclude the statuses with the given visibilities. The parameter accepts an array of visibility types (`public`, `unlisted`, `private`, `direct`), e.g., `exclude_visibilities[]=direct&exclude_visibilities[]=private`. +Adding the parameter `reply_visibility` to the public and home timelines queries will filter replies. Possible values: without parameter (default) shows all replies, `following` - replies directed to you or users you follow, `self` - replies directed to you. ## Statuses @@ -31,12 +28,20 @@ Has these additional fields under the `pleroma` object: - `thread_muted`: true if the thread the post belongs to is muted - `emoji_reactions`: A list with emoji / reaction maps. The format is `{name: "☕", count: 1, me: true}`. Contains no information about the reacting users, for that use the `/statuses/:id/reactions` endpoint. -## Attachments +## Media Attachments Has these additional fields under the `pleroma` object: - `mime_type`: mime type of the attachment. +### Attachment cap + +Some apps operate under the assumption that no more than 4 attachments can be returned or uploaded. Pleroma however does not enforce any limits on attachment count neither when returning the status object nor when posting. + +### Limitations + +Pleroma does not process remote images and therefore cannot include fields such as `meta` and `blurhash`. It does not support focal points or aspect ratios. The frontend is expected to handle it. + ## Accounts The `id` parameter can also be the `nickname` of the user. This only works in these endpoints, not the deeper nested ones for following etc. @@ -60,6 +65,7 @@ Has these additional fields under the `pleroma` object: - `deactivated`: boolean, true when the user is deactivated - `allow_following_move`: boolean, true when the user allows automatically follow moved following accounts - `unread_conversation_count`: The count of unread conversations. Only returned to the account owner. +- `unread_notifications_count`: The count of unread notifications. Only returned to the account owner. ### Source @@ -119,6 +125,18 @@ Accepts additional parameters: - `exclude_visibilities`: will exclude the notifications for activities with the given visibilities. The parameter accepts an array of visibility types (`public`, `unlisted`, `private`, `direct`). Usage example: `GET /api/v1/notifications?exclude_visibilities[]=direct&exclude_visibilities[]=private`. - `include_types`: will include the notifications for activities with the given types. The parameter accepts an array of types (`mention`, `follow`, `reblog`, `favourite`, `move`, `pleroma:emoji_reaction`). Usage example: `GET /api/v1/notifications?include_types[]=mention&include_types[]=reblog`. +## DELETE `/api/v1/notifications/destroy_multiple` + +An endpoint to delete multiple statuses by IDs. + +Required parameters: + +- `ids`: array of activity ids + +Usage example: `DELETE /api/v1/notifications/destroy_multiple/?ids[]=1&ids[]=2`. + +Returns on success: 200 OK `{}` + ## POST `/api/v1/statuses` Additional parameters can be added to the JSON body/Form data: @@ -164,6 +182,7 @@ Additional parameters can be added to the JSON body/Form data: - `actor_type` - the type of this account. ### Pleroma Settings Store + Pleroma has mechanism that allows frontends to save blobs of json for each user on the backend. This can be used to save frontend-specific settings for a user that the backend does not need to know about. The parameter should have a form of `{frontend_name: {...}}`, with `frontend_name` identifying your type of client, e.g. `pleroma_fe`. It will overwrite everything under this property, but will not overwrite other frontend's settings. @@ -172,17 +191,42 @@ This information is returned in the `verify_credentials` endpoint. ## Authentication -*Pleroma supports refreshing tokens. +*Pleroma supports refreshing tokens.* `POST /oauth/token` -Post here request with grant_type=refresh_token to obtain new access token. Returns an access token. + +Post here request with `grant_type=refresh_token` to obtain new access token. Returns an access token. ## Account Registration + `POST /api/v1/accounts` Has theses additional parameters (which are the same as in Pleroma-API): - * `fullname`: optional - * `bio`: optional - * `captcha_solution`: optional, contains provider-specific captcha solution, - * `captcha_token`: optional, contains provider-specific captcha token - * `token`: invite token required when the registerations aren't public. + +- `fullname`: optional +- `bio`: optional +- `captcha_solution`: optional, contains provider-specific captcha solution, +- `captcha_token`: optional, contains provider-specific captcha token +- `captcha_answer_data`: optional, contains provider-specific captcha data +- `token`: invite token required when the registrations aren't public. + +## Instance + +`GET /api/v1/instance` has additional fields + +- `max_toot_chars`: The maximum characters per post +- `poll_limits`: The limits of polls +- `upload_limit`: The maximum upload file size +- `avatar_upload_limit`: The same for avatars +- `background_upload_limit`: The same for backgrounds +- `banner_upload_limit`: The same for banners +- `background_image`: A background image that frontends can use +- `pleroma.metadata.features`: A list of supported features +- `pleroma.metadata.federation`: The federation restrictions of this instance +- `vapid_public_key`: The public key needed for push messages + +## Markers + +Has these additional fields under the `pleroma` object: + +- `unread_count`: contains number unread notifications diff --git a/docs/API/pleroma_api.md b/docs/API/pleroma_api.md index 12e63ef9f..70d4755b7 100644 --- a/docs/API/pleroma_api.md +++ b/docs/API/pleroma_api.md @@ -70,7 +70,49 @@ Request parameters can be passed via [query strings](https://en.wikipedia.org/wi * Response: JSON. Returns `{"status": "success"}` if the account was successfully disabled, `{"error": "[error message]"}` otherwise * Example response: `{"error": "Invalid password."}` -## `/api/pleroma/admin/`… +## `/api/pleroma/accounts/mfa` +#### Gets current MFA settings +* method: `GET` +* Authentication: required +* OAuth scope: `read:security` +* Response: JSON. Returns `{"enabled": "false", "totp": false }` + +## `/api/pleroma/accounts/mfa/setup/totp` +#### Pre-setup the MFA/TOTP method +* method: `GET` +* Authentication: required +* OAuth scope: `write:security` +* Response: JSON. Returns `{"key": [secret_key], "provisioning_uri": "[qr code uri]" }` when successful, otherwise returns HTTP 422 `{"error": "error_msg"}` + +## `/api/pleroma/accounts/mfa/confirm/totp` +#### Confirms & enables MFA/TOTP support for user account. +* method: `POST` +* Authentication: required +* OAuth scope: `write:security` +* Params: + * `password`: user's password + * `code`: token from TOTP App +* Response: JSON. Returns `{}` if the enable was successful, HTTP 422 `{"error": "[error message]"}` otherwise + + +## `/api/pleroma/accounts/mfa/totp` +#### Disables MFA/TOTP method for user account. +* method: `DELETE` +* Authentication: required +* OAuth scope: `write:security` +* Params: + * `password`: user's password +* Response: JSON. Returns `{}` if the disable was successful, HTTP 422 `{"error": "[error message]"}` otherwise +* Example response: `{"error": "Invalid password."}` + +## `/api/pleroma/accounts/mfa/backup_codes` +#### Generstes backup codes MFA for user account. +* method: `GET` +* Authentication: required +* OAuth scope: `write:security` +* Response: JSON. Returns `{"codes": codes}`when successful, otherwise HTTP 422 `{"error": "[error message]"}` + +## `/api/pleroma/admin/` See [Admin-API](admin_api.md) ## `/api/v1/pleroma/notifications/read` @@ -223,7 +265,7 @@ See [Admin-API](admin_api.md) * Method `PUT` * Authentication: required * Params: - * `image`: Multipart image + * `file`: Multipart image * Response: JSON. Returns a mastodon media attachment entity when successful, otherwise returns HTTP 415 `{"error": "error_msg"}` * Example response: @@ -316,27 +358,61 @@ The status posting endpoint takes an additional parameter, `in_reply_to_conversa * `recipients`: A list of ids of users that should receive posts to this conversation. This will replace the current list of recipients, so submit the full list. The owner of owner of the conversation will always be part of the set of recipients, though. * Response: JSON, statuses (200 - healthy, 503 unhealthy) -## `GET /api/v1/pleroma/conversations/read` +## `POST /api/v1/pleroma/conversations/read` ### Marks all user's conversations as read. * Method `POST` * Authentication: required * Params: None * Response: JSON, returns a list of Mastodon Conversation entities that were marked as read (200 - healthy, 503 unhealthy). -## `GET /api/pleroma/emoji/packs` -### Lists the custom emoji packs on the server +## `GET /api/pleroma/emoji/packs/import` +### Imports packs from filesystem * Method `GET` -* Authentication: not required +* Authentication: required * Params: None -* Response: JSON, "ok" and 200 status and the JSON hashmap of "pack name" to "pack contents" +* Response: JSON, returns a list of imported packs. -## `PUT /api/pleroma/emoji/packs/:name` -### Creates an empty custom emoji pack -* Method `PUT` +## `GET /api/pleroma/emoji/packs/remote` +### Make request to another instance for packs list +* Method `GET` +* Authentication: required +* Params: + * `url`: url of the instance to get packs from +* Response: JSON with the pack list, hashmap with pack name and pack contents + +## `POST /api/pleroma/emoji/packs/download` +### Download pack from another instance +* Method `POST` +* Authentication: required +* Params: + * `url`: url of the instance to download from + * `name`: pack to download from that instance + * `as`: (*optional*) name how to save pack +* Response: JSON, "ok" with 200 status if the pack was downloaded, or 500 if there were + errors downloading the pack + +## `POST /api/pleroma/emoji/packs/:name` +### Creates an empty pack +* Method `POST` * Authentication: required * Params: None * Response: JSON, "ok" and 200 status or 409 if the pack with that name already exists +## `PATCH /api/pleroma/emoji/packs/:name` +### Updates (replaces) pack metadata +* Method `PATCH` +* Authentication: required +* Params: + * `metadata`: metadata to replace the old one + * `license`: Pack license + * `homepage`: Pack home page url + * `description`: Pack description + * `fallback-src`: Fallback url to download pack from + * `fallback-src-sha256`: SHA256 encoded for fallback pack archive + * `share-files`: is pack allowed for sharing (boolean) +* Response: JSON, updated "metadata" section of the pack and 200 status or 400 if there was a + problem with the new metadata (the error is specified in the "error" part of the response JSON) + ## `DELETE /api/pleroma/emoji/packs/:name` ### Delete a custom emoji pack * Method `DELETE` @@ -344,53 +420,51 @@ The status posting endpoint takes an additional parameter, `in_reply_to_conversa * Params: None * Response: JSON, "ok" and 200 status or 500 if there was an error deleting the pack -## `POST /api/pleroma/emoji/packs/:name/update_file` -### Update a file in a custom emoji pack +## `POST /api/pleroma/emoji/packs/:name/files` +### Add new file to the pack * Method `POST` * Authentication: required * Params: - * if the `action` is `add`, adds an emoji named `shortcode` to the pack `pack_name`, - that means that the emoji file needs to be uploaded with the request - (thus requiring it to be a multipart request) and be named `file`. - There can also be an optional `filename` that will be the new emoji file name - (if it's not there, the name will be taken from the uploaded file). - * if the `action` is `update`, changes emoji shortcode - (from `shortcode` to `new_shortcode` or moves the file (from the current filename to `new_filename`) - * if the `action` is `remove`, removes the emoji named `shortcode` and it's associated file -* Response: JSON, updated "files" section of the pack and 200 status, 409 if the trying to use a shortcode - that is already taken, 400 if there was an error with the shortcode, filename or file (additional info - in the "error" part of the response JSON) + * `file`: file needs to be uploaded with the multipart request or link to remote file. + * `shortcode`: (*optional*) shortcode for new emoji, must be unique for all emoji. If not sended, shortcode will be taken from original filename. + * `filename`: (*optional*) new emoji file name. If not specified will be taken from original filename. +* Response: JSON, list of files for updated pack (hashmap -> shortcode => filename) with status 200, either error status with error message. -## `POST /api/pleroma/emoji/packs/:name/update_metadata` -### Updates (replaces) pack metadata -* Method `POST` +## `PATCH /api/pleroma/emoji/packs/:name/files` +### Update emoji file from pack +* Method `PATCH` * Authentication: required * Params: - * `new_data`: new metadata to replace the old one -* Response: JSON, updated "metadata" section of the pack and 200 status or 400 if there was a - problem with the new metadata (the error is specified in the "error" part of the response JSON) + * `shortcode`: emoji file shortcode + * `new_shortcode`: new emoji file shortcode + * `new_filename`: new filename for emoji file + * `force`: (*optional*) with true value to overwrite existing emoji with new shortcode +* Response: JSON, list with updated files for updated pack (hashmap -> shortcode => filename) with status 200, either error status with error message. -## `POST /api/pleroma/emoji/packs/download_from` -### Requests the instance to download the pack from another instance -* Method `POST` +## `DELETE /api/pleroma/emoji/packs/:name/files` +### Delete emoji file from pack +* Method `DELETE` * Authentication: required * Params: - * `instance_address`: the address of the instance to download from - * `pack_name`: the pack to download from that instance -* Response: JSON, "ok" and 200 status if the pack was downloaded, or 500 if there were - errors downloading the pack + * `shortcode`: emoji file shortcode +* Response: JSON, list with updated files for updated pack (hashmap -> shortcode => filename) with status 200, either error status with error message. -## `POST /api/pleroma/emoji/packs/list_from` -### Requests the instance to list the packs from another instance -* Method `POST` -* Authentication: required -* Params: - * `instance_address`: the address of the instance to download from -* Response: JSON with the pack list, same as if the request was made to that instance's - list endpoint directly + 200 status +## `GET /api/pleroma/emoji/packs` +### Lists local custom emoji packs +* Method `GET` +* Authentication: not required +* Params: None +* Response: JSON, "ok" and 200 status and the JSON hashmap of pack name to pack contents -## `GET /api/pleroma/emoji/packs/:name/download_shared` -### Requests a local pack from the instance +## `GET /api/pleroma/emoji/packs/:name` +### Get pack.json for the pack +* Method `GET` +* Authentication: not required +* Params: None +* Response: JSON, pack json with `files` and `pack` keys with 200 status or 404 if the pack does not exist + +## `GET /api/pleroma/emoji/packs/:name/archive` +### Requests a local pack archive from the instance * Method `GET` * Authentication: not required * Params: None @@ -431,7 +505,7 @@ The status posting endpoint takes an additional parameter, `in_reply_to_conversa # Emoji Reactions -Emoji reactions work a lot like favourites do. They make it possible to react to a post with a single emoji character. +Emoji reactions work a lot like favourites do. They make it possible to react to a post with a single emoji character. To detect the presence of this feature, you can check `pleroma_emoji_reactions` entry in the features list of nodeinfo. ## `PUT /api/v1/pleroma/statuses/:id/reactions/:emoji` ### React to a post with a unicode emoji @@ -462,7 +536,7 @@ Emoji reactions work a lot like favourites do. They make it possible to react to ``` ## `GET /api/v1/pleroma/statuses/:id/reactions/:emoji` -### Get an object of emoji to account mappings with accounts that reacted to the post for a specific emoji` +### Get an object of emoji to account mappings with accounts that reacted to the post for a specific emoji * Method: `GET` * Authentication: optional * Params: None diff --git a/docs/administration/CLI_tasks/database.md b/docs/administration/CLI_tasks/database.md index ff400c8ed..647f6f274 100644 --- a/docs/administration/CLI_tasks/database.md +++ b/docs/administration/CLI_tasks/database.md @@ -69,3 +69,32 @@ mix pleroma.database update_users_following_followers_counts ```sh tab="From Source" mix pleroma.database fix_likes_collections ``` + +## Vacuum the database + +### Analyze + +Running an `analyze` vacuum job can improve performance by updating statistics used by the query planner. **It is safe to cancel this.** + +```sh tab="OTP" +./bin/pleroma_ctl database vacuum analyze +``` + +```sh tab="From Source" +mix pleroma.database vacuum analyze +``` + +### Full + +Running a `full` vacuum job rebuilds your entire database by reading all of the data and rewriting it into smaller +and more compact files with an optimized layout. This process will take a long time and use additional disk space as +it builds the files side-by-side the existing database files. It can make your database faster and use less disk space, +but should only be run if necessary. **It is safe to cancel this.** + +```sh tab="OTP" +./bin/pleroma_ctl database vacuum full +``` + +```sh tab="From Source" +mix pleroma.database vacuum full +``` \ No newline at end of file diff --git a/docs/administration/CLI_tasks/emoji.md b/docs/administration/CLI_tasks/emoji.md index efec8222c..3d524a52b 100644 --- a/docs/administration/CLI_tasks/emoji.md +++ b/docs/administration/CLI_tasks/emoji.md @@ -39,8 +39,8 @@ mix pleroma.emoji get-packs [option ...] mix pleroma.emoji gen-pack PACK-URL ``` -Currently, only .zip archives are recognized as remote pack files and packs are therefore assumed to be zip archives. This command is intended to run interactively and will first ask you some basic questions about the pack, then download the remote file and generate an SHA256 checksum for it, then generate an emoji file list for you. +Currently, only .zip archives are recognized as remote pack files and packs are therefore assumed to be zip archives. This command is intended to run interactively and will first ask you some basic questions about the pack, then download the remote file and generate an SHA256 checksum for it, then generate an emoji file list for you. - The manifest entry will either be written to a newly created `index.json` file or appended to the existing one, *replacing* the old pack with the same name if it was in the file previously. + The manifest entry will either be written to a newly created `pack_name.json` file (pack name is asked in questions) or appended to the existing one, *replacing* the old pack with the same name if it was in the file previously. The file list will be written to the file specified previously, *replacing* that file. You _should_ check that the file list doesn't contain anything you don't need in the pack, that is, anything that is not an emoji (the whole pack is downloaded, but only emoji files are extracted). diff --git a/docs/administration/CLI_tasks/oauth_app.md b/docs/administration/CLI_tasks/oauth_app.md new file mode 100644 index 000000000..4d6bfc25a --- /dev/null +++ b/docs/administration/CLI_tasks/oauth_app.md @@ -0,0 +1,16 @@ +# Creating trusted OAuth App + +{! backend/administration/CLI_tasks/general_cli_task_info.include !} + +## Create trusted OAuth App. + +Optional params: + * `-s SCOPES` - scopes for app, e.g. `read,write,follow,push`. + +```sh tab="OTP" + ./bin/pleroma_ctl app create -n APP_NAME -r REDIRECT_URI +``` + +```sh tab="From Source" +mix pleroma.app create -n APP_NAME -r REDIRECT_URI +``` \ No newline at end of file diff --git a/docs/administration/CLI_tasks/user.md b/docs/administration/CLI_tasks/user.md index f535dad82..afeb8d52f 100644 --- a/docs/administration/CLI_tasks/user.md +++ b/docs/administration/CLI_tasks/user.md @@ -95,33 +95,33 @@ mix pleroma.user sign_out ``` -## Deactivate or activate a user +## Deactivate or activate a user ```sh tab="OTP" - ./bin/pleroma_ctl user toggle_activated + ./bin/pleroma_ctl user toggle_activated ``` ```sh tab="From Source" -mix pleroma.user toggle_activated +mix pleroma.user toggle_activated ``` -## Unsubscribe local users from a user and deactivate the user +## Deactivate a user and unsubscribes local users from the user ```sh tab="OTP" - ./bin/pleroma_ctl user unsubscribe NICKNAME + ./bin/pleroma_ctl user deactivate NICKNAME ``` ```sh tab="From Source" -mix pleroma.user unsubscribe NICKNAME +mix pleroma.user deactivate NICKNAME ``` -## Unsubscribe local users from an instance and deactivate all accounts on it +## Deactivate all accounts from an instance and unsubscribe local users on it ```sh tab="OTP" - ./bin/pleroma_ctl user unsubscribe_all_from_instance + ./bin/pleroma_ctl user deactivate_all_from_instance ``` ```sh tab="From Source" -mix pleroma.user unsubscribe_all_from_instance +mix pleroma.user deactivate_all_from_instance ``` @@ -177,4 +177,3 @@ mix pleroma.user untag ```sh tab="From Source" mix pleroma.user toggle_confirmed ``` - diff --git a/docs/clients.md b/docs/clients.md index 1eae0f0c6..7f98dc7b1 100644 --- a/docs/clients.md +++ b/docs/clients.md @@ -49,11 +49,11 @@ Feel free to contact us to be added to this list! - Platforms: Android - Features: Streaming Ready -### Roma -- Homepage: -- Source Code: [iOS](https://github.com/roma-apps/roma-ios), [Android](https://github.com/roma-apps/roma-android) +### Fedi +- Homepage: +- Source Code: Proprietary, but free - Platforms: iOS, Android -- Features: No Streaming +- Features: Pleroma-specific features like Reactions ### Tusky - Homepage: diff --git a/docs/configuration/cheatsheet.md b/docs/configuration/cheatsheet.md index d16435e11..505acb293 100644 --- a/docs/configuration/cheatsheet.md +++ b/docs/configuration/cheatsheet.md @@ -8,6 +8,10 @@ For from source installations Pleroma configuration works by first importing the To add configuration to your config file, you can copy it from the base config. The latest version of it can be viewed [here](https://git.pleroma.social/pleroma/pleroma/blob/develop/config/config.exs). You can also use this file if you don't know how an option is supposed to be formatted. +## :chat + +* `enabled` - Enables the backend chat. Defaults to `true`. + ## :instance * `name`: The instance’s name. * `email`: Email used to reach an Administrator/Moderator of the instance. @@ -145,6 +149,11 @@ config :pleroma, :mrf_user_allowlist, * `:strip_followers` removes followers from the ActivityPub recipient list, ensuring they won't be delivered to home timelines * `:reject` rejects the message entirely +#### mrf_steal_emoji +* `hosts`: List of hosts to steal emojis from +* `rejected_shortcodes`: Regex-list of shortcodes to reject +* `size_limit`: File size limit (in bytes), checked before an emoji is saved to the disk + ### :activitypub * `unfollow_blocked`: Whether blocks result in people getting unfollowed * `outgoing_blocks`: Whether to federate blocks to other instances @@ -245,6 +254,40 @@ This section describe PWA manifest instance-specific values. Currently this opti * `base_url`: The base URL to access a user-uploaded file. Useful when you want to proxy the media files via another host/CDN fronts. * `proxy_opts`: All options defined in `Pleroma.ReverseProxy` documentation, defaults to `[max_body_length: (25*1_048_576)]`. * `whitelist`: List of domains to bypass the mediaproxy +* `invalidation`: options for remove media from cache after delete object: + * `enabled`: Enables purge cache + * `provider`: Which one of the [purge cache strategy](#purge-cache-strategy) to use. + +### Purge cache strategy + +#### Pleroma.Web.MediaProxy.Invalidation.Script + +This strategy allow perform external bash script to purge cache. +Urls of attachments pass to script as arguments. + +* `script_path`: path to external script. + +Example: +```elixir +config :pleroma, Pleroma.Web.MediaProxy.Invalidation.Script, + script_path: "./installation/nginx-cache-purge.example" +``` + +#### Pleroma.Web.MediaProxy.Invalidation.Http + +This strategy allow perform custom http request to purge cache. + +* `method`: http method. default is `purge` +* `headers`: http headers. default is empty +* `options`: request options. default is empty + +Example: +```elixir +config :pleroma, Pleroma.Web.MediaProxy.Invalidation.Http, + method: :purge, + headers: [], + options: [] +``` ## Link previews @@ -369,8 +412,7 @@ Available caches: * `proxy_url`: an upstream proxy to fetch posts and/or media with, (default: `nil`) * `send_user_agent`: should we include a user agent with HTTP requests? (default: `true`) * `user_agent`: what user agent should we use? (default: `:default`), must be string or `:default` -* `adapter`: array of hackney options - +* `adapter`: array of adapter options ### :hackney_pools @@ -389,6 +431,42 @@ For each pool, the options are: * `timeout` - retention duration for connections +### :connections_pool + +*For `gun` adapter* + +Advanced settings for connections pool. Pool with opened connections. These connections can be reused in worker pools. + +For big instances it's recommended to increase `config :pleroma, :connections_pool, max_connections: 500` up to 500-1000. +It will increase memory usage, but federation would work faster. + +* `:checkin_timeout` - timeout to checkin connection from pool. Default: 250ms. +* `:max_connections` - maximum number of connections in the pool. Default: 250 connections. +* `:retry` - number of retries, while `gun` will try to reconnect if connection goes down. Default: 1. +* `:retry_timeout` - time between retries when `gun` will try to reconnect in milliseconds. Default: 1000ms. +* `:await_up_timeout` - timeout while `gun` will wait until connection is up. Default: 5000ms. + +### :pools + +*For `gun` adapter* + +Advanced settings for workers pools. + +There are four pools used: + +* `:federation` for the federation jobs. + You may want this pool max_connections to be at least equal to the number of federator jobs + retry queue jobs. +* `:media` for rich media, media proxy +* `:upload` for uploaded media (if using a remote uploader and `proxy_remote: true`) +* `:default` for other requests + +For each pool, the options are: + +* `:size` - how much workers the pool can hold +* `:timeout` - timeout while `gun` will wait for response +* `:max_overflow` - additional workers if pool is under load + + ## Captcha ### Pleroma.Captcha @@ -420,6 +498,7 @@ the source code is here: https://github.com/koto-bank/kocaptcha. The default end * `base_url`: The base URL to access a user-uploaded file. Useful when you want to proxy the media files via another host. * `proxy_remote`: If you're using a remote uploader, Pleroma will proxy media requests instead of redirecting to it. * `proxy_opts`: Proxy options, see `Pleroma.ReverseProxy` documentation. +* `filename_display_max_length`: Set max length of a filename to display. 0 = no limit. Default: 30. !!! warning `strip_exif` has been replaced by `Pleroma.Upload.Filter.Mogrify`. @@ -580,24 +659,6 @@ config :pleroma, :workers, * `enabled: false` corresponds to `config :pleroma, :workers, retries: [federator_outgoing: 1]` * deprecated options: `max_jobs`, `initial_timeout` -### Pleroma.Scheduler - -Configuration for [Quantum](https://github.com/quantum-elixir/quantum-core) jobs scheduler. - -See [Quantum readme](https://github.com/quantum-elixir/quantum-core#usage) for the list of supported options. - -Example: - -```elixir -config :pleroma, Pleroma.Scheduler, - global: true, - overlap: true, - timezone: :utc, - jobs: [{"0 */6 * * * *", {Pleroma.Web.Websub, :refresh_subscriptions, []}}] -``` - -The above example defines a single job which invokes `Pleroma.Web.Websub.refresh_subscriptions()` every 6 hours ("0 */6 * * * *", [crontab format](https://en.wikipedia.org/wiki/Cron)). - ## :web_push_encryption, :vapid_details Web Push Notifications configuration. You can use the mix task `mix web_push.gen.keypair` to generate it. @@ -868,12 +929,33 @@ config :auto_linker, * `runtime_dir`: A path to custom Elixir modules (such as MRF policies). - ## :configurable_from_database Boolean, enables/disables in-database configuration. Read [Transfering the config to/from the database](../administration/CLI_tasks/config.md) for more information. +## :database_config_whitelist +List of valid configuration sections which are allowed to be configured from the +database. Settings stored in the database before the whitelist is configured are +still applied, so it is suggested to only use the whitelist on instances that +have not migrated the config to the database. + +Example: +```elixir +config :pleroma, :database_config_whitelist, [ + {:pleroma, :instance}, + {:pleroma, Pleroma.Web.Metadata}, + {:auto_linker} +] +``` + +### Multi-factor authentication - :two_factor_authentication +* `totp` - a list containing TOTP configuration + - `digits` - Determines the length of a one-time pass-code in characters. Defaults to 6 characters. + - `period` - a period for which the TOTP code will be valid in seconds. Defaults to 30 seconds. +* `backup_codes` - a list containing backup codes configuration + - `number` - number of backup codes to generate. + - `length` - backup code length. Defaults to 16 characters. ## Restrict entities access for unauthenticated users @@ -889,4 +971,9 @@ Restrict access for unauthenticated users to timelines (public and federate), us * `remote` * `activities` - statuses * `local` - * `remote` \ No newline at end of file + * `remote` + + +## Pleroma.Web.ApiSpec.CastAndValidate + +* `:strict` a boolean, enables strict input validation (useful in development, not recommended in production). Defaults to `false`. diff --git a/docs/configuration/hardening.md b/docs/configuration/hardening.md index b54c28850..d3bfc4e4a 100644 --- a/docs/configuration/hardening.md +++ b/docs/configuration/hardening.md @@ -36,7 +36,7 @@ content-security-policy: default-src 'none'; base-uri 'self'; frame-ancestors 'none'; - img-src 'self' data: https:; + img-src 'self' data: blob: https:; media-src 'self' https:; style-src 'self' 'unsafe-inline'; font-src 'self'; diff --git a/docs/configuration/mrf.md b/docs/configuration/mrf.md index c3957c255..d48d0cc99 100644 --- a/docs/configuration/mrf.md +++ b/docs/configuration/mrf.md @@ -41,11 +41,15 @@ config :pleroma, :instance, Once `SimplePolicy` is enabled, you can configure various groups in the `:mrf_simple` config object. These groups are: -* `media_removal`: Servers in this group will have media stripped from incoming messages. -* `media_nsfw`: Servers in this group will have the #nsfw tag and sensitive setting injected into incoming messages which contain media. * `reject`: Servers in this group will have their messages rejected. -* `federated_timeline_removal`: Servers in this group will have their messages unlisted from the public timelines by flipping the `to` and `cc` fields. +* `accept`: If not empty, only messages from these instances will be accepted (whitelist federation). +* `media_nsfw`: Servers in this group will have the #nsfw tag and sensitive setting injected into incoming messages which contain media. +* `media_removal`: Servers in this group will have media stripped from incoming messages. +* `avatar_removal`: Avatars from these servers will be stripped from incoming messages. +* `banner_removal`: Banner images from these servers will be stripped from incoming messages. * `report_removal`: Servers in this group will have their reports (flags) rejected. +* `federated_timeline_removal`: Servers in this group will have their messages unlisted from the public timelines by flipping the `to` and `cc` fields. +* `reject_deletes`: Deletion requests will be rejected from these servers. Servers should be configured as lists. @@ -113,7 +117,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.RewritePolicy do @impl true def describe do - {:ok, %{mrf_sample: %{content: "new message content"}}}` + {:ok, %{mrf_sample: %{content: "new message content"}}} end end ``` diff --git a/docs/configuration/postgresql.md b/docs/configuration/postgresql.md new file mode 100644 index 000000000..6983fb459 --- /dev/null +++ b/docs/configuration/postgresql.md @@ -0,0 +1,31 @@ +# Optimizing your PostgreSQL performance + +Pleroma performance depends to a large extent on good database performance. The default PostgreSQL settings are mostly fine, but often you can get better performance by changing a few settings. + +You can use [PGTune](https://pgtune.leopard.in.ua) to get recommendations for your setup. If you do, set the "Number of Connections" field to 20, as Pleroma will only use 10 concurrent connections anyway. If you don't, it will give you advice that might even hurt your performance. + +We also recommend not using the "Network Storage" option. + +## Example configurations + +Here are some configuration suggestions for PostgreSQL 10+. + +### 1GB RAM, 1 CPU +``` +shared_buffers = 256MB +effective_cache_size = 768MB +maintenance_work_mem = 64MB +work_mem = 13107kB +``` + +### 2GB RAM, 2 CPU +``` +shared_buffers = 512MB +effective_cache_size = 1536MB +maintenance_work_mem = 128MB +work_mem = 26214kB +max_worker_processes = 2 +max_parallel_workers_per_gather = 1 +max_parallel_workers = 2 +``` + diff --git a/docs/configuration/storing_remote_media.md b/docs/configuration/storing_remote_media.md new file mode 100644 index 000000000..7e91fe7d9 --- /dev/null +++ b/docs/configuration/storing_remote_media.md @@ -0,0 +1,38 @@ +# Storing Remote Media + +Pleroma does not store remote/federated media by default. The best way to achieve this is to change Nginx to keep its reverse proxy cache +for a year and to activate the `MediaProxyWarmingPolicy` MRF policy in Pleroma which will automatically fetch all media through the proxy +as soon as the post is received by your instance. + +## Nginx + +``` + proxy_cache_path /long/term/storage/path/pleroma-media-cache levels=1:2 + keys_zone=pleroma_media_cache:10m inactive=1y use_temp_path=off; + + location ~ ^/(media|proxy) { + proxy_cache pleroma_media_cache; + slice 1m; + proxy_cache_key $host$uri$is_args$args$slice_range; + proxy_set_header Range $slice_range; + proxy_http_version 1.1; + proxy_cache_valid 206 301 302 304 1h; + proxy_cache_valid 200 1y; + proxy_cache_use_stale error timeout invalid_header updating; + proxy_ignore_client_abort on; + proxy_buffering on; + chunked_transfer_encoding on; + proxy_ignore_headers Cache-Control Expires; + proxy_hide_header Cache-Control Expires; + proxy_pass http://127.0.0.1:4000; + } +``` + +## Pleroma + +Add to your `prod.secret.exs`: + +``` +config :pleroma, :instance, + rewrite_policy: [Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy] +``` diff --git a/docs/dev.md b/docs/dev.md new file mode 100644 index 000000000..f1b4cbf8b --- /dev/null +++ b/docs/dev.md @@ -0,0 +1,23 @@ +This document contains notes and guidelines for Pleroma developers. + +# Authentication & Authorization + +## OAuth token-based authentication & authorization + +* Pleroma supports hierarchical OAuth scopes, just like Mastodon but with added granularity of admin scopes. For a reference, see [Mastodon OAuth scopes](https://docs.joinmastodon.org/api/oauth-scopes/). + +* It is important to either define OAuth scope restrictions or explicitly mark OAuth scope check as skipped, for every controller action. To define scopes, call `plug(Pleroma.Plugs.OAuthScopesPlug, %{scopes: [...]})`. To explicitly set OAuth scopes check skipped, call `plug(:skip_plug, Pleroma.Plugs.OAuthScopesPlug )`. + +* In controllers, `use Pleroma.Web, :controller` will result in `action/2` (see `Pleroma.Web.controller/0` for definition) be called prior to actual controller action, and it'll perform security / privacy checks before passing control to actual controller action. + + For routes with `:authenticated_api` pipeline, authentication & authorization are expected, thus `OAuthScopesPlug` will be run unless explicitly skipped (also `EnsureAuthenticatedPlug` will be executed immediately before action even if there was an early run to give an early error, since `OAuthScopesPlug` supports `:proceed_unauthenticated` option, and other plugs may support similar options as well). + + For `:api` pipeline routes, it'll be verified whether `OAuthScopesPlug` was called or explicitly skipped, and if it was not then auth information will be dropped for request. Then `EnsurePublicOrAuthenticatedPlug` will be called to ensure that either the instance is not private or user is authenticated (unless explicitly skipped). Such automated checks help to prevent human errors and result in higher security / privacy for users. + +## [HTTP Basic Authentication](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Authorization) + +* With HTTP Basic Auth, OAuth scopes check is _not_ performed for any action (since password is provided during the auth, requester is able to obtain a token with full permissions anyways). `Pleroma.Plugs.AuthenticationPlug` and `Pleroma.Plugs.LegacyAuthenticationPlug` both call `Pleroma.Plugs.OAuthScopesPlug.skip_plug(conn)` when password is provided. + +## Auth-related configuration, OAuth consumer mode etc. + +See `Authentication` section of [`docs/configuration/cheatsheet.md`](docs/configuration/cheatsheet.md#authentication). diff --git a/docs/installation/debian_based_en.md b/docs/installation/debian_based_en.md index fe2dbb92d..2c20d521a 100644 --- a/docs/installation/debian_based_en.md +++ b/docs/installation/debian_based_en.md @@ -7,13 +7,9 @@ This guide will assume you are on Debian Stretch. This guide should also work wi * `postgresql` (9.6+, Ubuntu 16.04 comes with 9.5, you can get a newer version from [here](https://www.postgresql.org/download/linux/ubuntu/)) * `postgresql-contrib` (9.6+, same situtation as above) -* `elixir` (1.5+, [install from here, Debian and Ubuntu ship older versions](https://elixir-lang.org/install.html#unix-and-unix-like) or use [asdf](https://github.com/asdf-vm/asdf) as the pleroma user) +* `elixir` (1.8+, Follow the guide to install from the Erlang Solutions repo or use [asdf](https://github.com/asdf-vm/asdf) as the pleroma user) * `erlang-dev` -* `erlang-tools` -* `erlang-parsetools` -* `erlang-eldap`, if you want to enable ldap authenticator -* `erlang-ssh` -* `erlang-xmerl` +* `erlang-nox` * `git` * `build-essential` @@ -42,15 +38,15 @@ sudo apt install git build-essential postgresql postgresql-contrib * Download and add the Erlang repository: ```shell -wget -P /tmp/ https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb -sudo dpkg -i /tmp/erlang-solutions_1.0_all.deb +wget -P /tmp/ https://packages.erlang-solutions.com/erlang-solutions_2.0_all.deb +sudo dpkg -i /tmp/erlang-solutions_2.0_all.deb ``` * Install Elixir and Erlang: ```shell sudo apt update -sudo apt install elixir erlang-dev erlang-parsetools erlang-xmerl erlang-tools erlang-ssh +sudo apt install elixir erlang-dev erlang-nox ``` ### Install PleromaBE diff --git a/docs/installation/debian_based_jp.md b/docs/installation/debian_based_jp.md index 7aa0bcc24..1e5a9be91 100644 --- a/docs/installation/debian_based_jp.md +++ b/docs/installation/debian_based_jp.md @@ -10,21 +10,17 @@ ### 必要なソフトウェア - PostgreSQL 9.6以上 (Ubuntu16.04では9.5しか提供されていないので,[](https://www.postgresql.org/download/linux/ubuntu/)こちらから新しいバージョンを入手してください) -- postgresql-contrib 9.6以上 (同上) -- Elixir 1.5 以上 ([Debianのリポジトリからインストールしないこと!!! ここからインストールすること!](https://elixir-lang.org/install.html#unix-and-unix-like)。または [asdf](https://github.com/asdf-vm/asdf) をpleromaユーザーでインストールしてください) - - erlang-dev -- erlang-tools -- erlang-parsetools -- erlang-eldap (LDAP認証を有効化するときのみ必要) -- erlang-ssh -- erlang-xmerl -- git -- build-essential +- `postgresql-contrib` 9.6以上 (同上) +- Elixir 1.8 以上 ([Debianのリポジトリからインストールしないこと!!! ここからインストールすること!](https://elixir-lang.org/install.html#unix-and-unix-like)。または [asdf](https://github.com/asdf-vm/asdf) をpleromaユーザーでインストールしてください) +- `erlang-dev` +- `erlang-nox` +- `git` +- `build-essential` #### このガイドで利用している追加パッケージ -- nginx (おすすめです。他のリバースプロキシを使う場合は、参考となる設定をこのリポジトリから探してください) -- certbot (または何らかのLet's Encrypt向けACMEクライアント) +- `nginx` (おすすめです。他のリバースプロキシを使う場合は、参考となる設定をこのリポジトリから探してください) +- `certbot` (または何らかのLet's Encrypt向けACMEクライアント) ### システムを準備する @@ -44,14 +40,14 @@ sudo apt install git build-essential postgresql postgresql-contrib * Erlangのリポジトリをダウンロードおよびインストールします。 ``` -wget -P /tmp/ https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb -sudo dpkg -i /tmp/erlang-solutions_1.0_all.deb +wget -P /tmp/ https://packages.erlang-solutions.com/erlang-solutions_2.0_all.deb +sudo dpkg -i /tmp/erlang-solutions_2.0_all.deb ``` * ElixirとErlangをインストールします、 ``` sudo apt update -sudo apt install elixir erlang-dev erlang-parsetools erlang-xmerl erlang-tools erlang-ssh +sudo apt install elixir erlang-dev erlang-nox ``` ### Pleroma BE (バックエンド) をインストールします diff --git a/docs/installation/otp_en.md b/docs/installation/otp_en.md index fb99af699..86135cd20 100644 --- a/docs/installation/otp_en.md +++ b/docs/installation/otp_en.md @@ -63,7 +63,7 @@ apt install postgresql-11-rum ``` #### (Optional) Performance configuration -For optimal performance, you may use [PGTune](https://pgtune.leopard.in.ua), don't forget to restart postgresql after editing the configuration +It is encouraged to check [Optimizing your PostgreSQL performance](../configuration/postgresql.md) document, for tips on PostgreSQL tuning. ```sh tab="Alpine" rc-service postgresql restart diff --git a/installation/init.d/pleroma b/installation/init.d/pleroma index ed50bb551..384536f7e 100755 --- a/installation/init.d/pleroma +++ b/installation/init.d/pleroma @@ -1,21 +1,45 @@ #!/sbin/openrc-run - -# Requires OpenRC >= 0.35 -directory=/opt/pleroma - -command=/usr/bin/mix -command_args="phx.server" +supervisor=supervise-daemon command_user=pleroma:pleroma command_background=1 - -export PORT=4000 -export MIX_ENV=prod - # Ask process to terminate within 30 seconds, otherwise kill it retry="SIGTERM/30/SIGKILL/5" - pidfile="/var/run/pleroma.pid" +directory=/opt/pleroma +healthcheck_delay=60 +healthcheck_timer=30 + +: ${pleroma_port:-4000} + +# Needs OpenRC >= 0.42 +#respawn_max=0 +#respawn_delay=5 + +# put pleroma_console=YES in /etc/conf.d/pleroma if you want to be able to +# connect to pleroma via an elixir console +if yesno "${pleroma_console}"; then + command=elixir + command_args="--name pleroma@127.0.0.1 --erl '-kernel inet_dist_listen_min 9001 inet_dist_listen_max 9001 inet_dist_use_interface {127,0,0,1}' -S mix phx.server" + + start_post() { + einfo "You can get a console by using this command as pleroma's user:" + einfo "iex --name console@127.0.0.1 --remsh pleroma@127.0.0.1" + } +else + command=/usr/bin/mix + command_args="phx.server" +fi + +export MIX_ENV=prod depend() { - need nginx postgresql + need nginx postgresql +} + +healthcheck() { + # put pleroma_health=YES in /etc/conf.d/pleroma if you want healthchecking + # and make sure you have curl installed + yesno "$pleroma_health" || return 0 + + curl -q "localhost:${pleroma_port}/api/pleroma/healthcheck" } diff --git a/installation/nginx-cache-purge.sh.example b/installation/nginx-cache-purge.sh.example new file mode 100755 index 000000000..b2915321c --- /dev/null +++ b/installation/nginx-cache-purge.sh.example @@ -0,0 +1,40 @@ +#!/bin/sh + +# A simple shell script to delete a media from the Nginx cache. + +SCRIPTNAME=${0##*/} + +# NGINX cache directory +CACHE_DIRECTORY="/tmp/pleroma-media-cache" + +## Return the files where the items are cached. +## $1 - the filename, can be a pattern . +## $2 - the cache directory. +## $3 - (optional) the number of parallel processes to run for grep. +get_cache_files() { + local max_parallel=${3-16} + find $2 -maxdepth 2 -type d | xargs -P $max_parallel -n 1 grep -E Rl "^KEY:.*$1" | sort -u +} + +## Removes an item from the given cache zone. +## $1 - the filename, can be a pattern . +## $2 - the cache directory. +purge_item() { + for f in $(get_cache_files $1 $2); do + echo "found file: $f" + [ -f $f ] || continue + echo "Deleting $f from $2." + rm $f + done +} # purge_item + +purge() { + for url in "$@" + do + echo "$SCRIPTNAME delete \`$url\` from cache ($CACHE_DIRECTORY)" + purge_item $url $CACHE_DIRECTORY + done + +} + +purge $1 diff --git a/installation/pleroma-apache.conf b/installation/pleroma-apache.conf index b5640ac3d..0d627f2d7 100644 --- a/installation/pleroma-apache.conf +++ b/installation/pleroma-apache.conf @@ -32,9 +32,8 @@ CustomLog ${APACHE_LOG_DIR}/access.log combined SSLEngine on - SSLCertificateFile /etc/letsencrypt/live/${servername}/cert.pem + SSLCertificateFile /etc/letsencrypt/live/${servername}/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/${servername}/privkey.pem - SSLCertificateChainFile /etc/letsencrypt/live/${servername}/fullchain.pem # Mozilla modern configuration, tweak to your needs SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 diff --git a/lib/mix/tasks/pleroma/app.ex b/lib/mix/tasks/pleroma/app.ex new file mode 100644 index 000000000..463e2449f --- /dev/null +++ b/lib/mix/tasks/pleroma/app.ex @@ -0,0 +1,49 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Mix.Tasks.Pleroma.App do + @moduledoc File.read!("docs/administration/CLI_tasks/oauth_app.md") + use Mix.Task + + import Mix.Pleroma + + @shortdoc "Creates trusted OAuth App" + + def run(["create" | options]) do + start_pleroma() + + {opts, _} = + OptionParser.parse!(options, + strict: [name: :string, redirect_uri: :string, scopes: :string], + aliases: [n: :name, r: :redirect_uri, s: :scopes] + ) + + scopes = + if opts[:scopes] do + String.split(opts[:scopes], ",") + else + ["read", "write", "follow", "push"] + end + + params = %{ + client_name: opts[:name], + redirect_uris: opts[:redirect_uri], + trusted: true, + scopes: scopes + } + + with {:ok, app} <- Pleroma.Web.OAuth.App.create(params) do + shell_info("#{app.client_name} successfully created:") + shell_info("App client_id: " <> app.client_id) + shell_info("App client_secret: " <> app.client_secret) + else + {:error, changeset} -> + shell_error("Creating failed:") + + Enum.each(Pleroma.Web.OAuth.App.errors(changeset), fn {key, error} -> + shell_error("#{key}: #{error}") + end) + end + end +end diff --git a/lib/mix/tasks/pleroma/benchmark.ex b/lib/mix/tasks/pleroma/benchmark.ex index a4885b70c..dd2b9c8f2 100644 --- a/lib/mix/tasks/pleroma/benchmark.ex +++ b/lib/mix/tasks/pleroma/benchmark.ex @@ -74,4 +74,43 @@ def run(["render_timeline", nickname | _] = args) do inputs: inputs ) end + + def run(["adapters"]) do + start_pleroma() + + :ok = + Pleroma.Gun.Conn.open( + "https://httpbin.org/stream-bytes/1500", + :gun_connections + ) + + Process.sleep(1_500) + + Benchee.run( + %{ + "Without conn and without pool" => fn -> + {:ok, %Tesla.Env{}} = + Pleroma.HTTP.get("https://httpbin.org/stream-bytes/1500", [], + adapter: [pool: :no_pool, receive_conn: false] + ) + end, + "Without conn and with pool" => fn -> + {:ok, %Tesla.Env{}} = + Pleroma.HTTP.get("https://httpbin.org/stream-bytes/1500", [], + adapter: [receive_conn: false] + ) + end, + "With reused conn and without pool" => fn -> + {:ok, %Tesla.Env{}} = + Pleroma.HTTP.get("https://httpbin.org/stream-bytes/1500", [], + adapter: [pool: :no_pool] + ) + end, + "With reused conn and with pool" => fn -> + {:ok, %Tesla.Env{}} = Pleroma.HTTP.get("https://httpbin.org/stream-bytes/1500") + end + }, + parallel: 10 + ) + end end diff --git a/lib/mix/tasks/pleroma/database.ex b/lib/mix/tasks/pleroma/database.ex index 778de162f..82e2abdcb 100644 --- a/lib/mix/tasks/pleroma/database.ex +++ b/lib/mix/tasks/pleroma/database.ex @@ -4,6 +4,7 @@ defmodule Mix.Tasks.Pleroma.Database do alias Pleroma.Conversation + alias Pleroma.Maintenance alias Pleroma.Object alias Pleroma.Repo alias Pleroma.User @@ -34,13 +35,7 @@ def run(["remove_embedded_objects" | args]) do ) if Keyword.get(options, :vacuum) do - Logger.info("Runnning VACUUM FULL") - - Repo.query!( - "vacuum full;", - [], - timeout: :infinity - ) + Maintenance.vacuum("full") end end @@ -94,13 +89,7 @@ def run(["prune_objects" | args]) do |> Repo.delete_all(timeout: :infinity) if Keyword.get(options, :vacuum) do - Logger.info("Runnning VACUUM FULL") - - Repo.query!( - "vacuum full;", - [], - timeout: :infinity - ) + Maintenance.vacuum("full") end end @@ -135,4 +124,10 @@ def run(["fix_likes_collections"]) do end) |> Stream.run() end + + def run(["vacuum", args]) do + start_pleroma() + + Maintenance.vacuum(args) + end end diff --git a/lib/mix/tasks/pleroma/digest.ex b/lib/mix/tasks/pleroma/digest.ex index 7d09e70c5..3595f912d 100644 --- a/lib/mix/tasks/pleroma/digest.ex +++ b/lib/mix/tasks/pleroma/digest.ex @@ -1,5 +1,6 @@ defmodule Mix.Tasks.Pleroma.Digest do use Mix.Task + import Mix.Pleroma @shortdoc "Manages digest emails" @moduledoc File.read!("docs/administration/CLI_tasks/digest.md") @@ -22,12 +23,10 @@ def run(["test", nickname | opts]) do with %Swoosh.Email{} = email <- Pleroma.Emails.UserEmail.digest_email(patched_user) do {:ok, _} = Pleroma.Emails.Mailer.deliver(email) - Mix.shell().info("Digest email have been sent to #{nickname} (#{user.email})") + shell_info("Digest email have been sent to #{nickname} (#{user.email})") else _ -> - Mix.shell().info( - "Cound't find any mentions for #{nickname} since #{last_digest_emailed_at}" - ) + shell_info("Cound't find any mentions for #{nickname} since #{last_digest_emailed_at}") end end end diff --git a/lib/mix/tasks/pleroma/emoji.ex b/lib/mix/tasks/pleroma/emoji.ex index 2b03a3009..29a5fa99c 100644 --- a/lib/mix/tasks/pleroma/emoji.ex +++ b/lib/mix/tasks/pleroma/emoji.ex @@ -4,18 +4,18 @@ defmodule Mix.Tasks.Pleroma.Emoji do use Mix.Task + import Mix.Pleroma @shortdoc "Manages emoji packs" @moduledoc File.read!("docs/administration/CLI_tasks/emoji.md") def run(["ls-packs" | args]) do - Mix.Pleroma.start_pleroma() - Application.ensure_all_started(:hackney) + start_pleroma() {options, [], []} = parse_global_opts(args) - manifest = - fetch_manifest(if options[:manifest], do: options[:manifest], else: default_manifest()) + url_or_path = options[:manifest] || default_manifest() + manifest = fetch_and_decode(url_or_path) Enum.each(manifest, fn {name, info} -> to_print = [ @@ -36,19 +36,18 @@ def run(["ls-packs" | args]) do end def run(["get-packs" | args]) do - Mix.Pleroma.start_pleroma() - Application.ensure_all_started(:hackney) + start_pleroma() {options, pack_names, []} = parse_global_opts(args) - manifest_url = if options[:manifest], do: options[:manifest], else: default_manifest() + url_or_path = options[:manifest] || default_manifest() - manifest = fetch_manifest(manifest_url) + manifest = fetch_and_decode(url_or_path) for pack_name <- pack_names do if Map.has_key?(manifest, pack_name) do pack = manifest[pack_name] - src_url = pack["src"] + src = pack["src"] IO.puts( IO.ANSI.format([ @@ -58,11 +57,11 @@ def run(["get-packs" | args]) do :normal, " from ", :underline, - src_url + src ]) ) - binary_archive = Tesla.get!(client(), src_url).body + {:ok, binary_archive} = fetch(src) archive_sha = :crypto.hash(:sha256, binary_archive) |> Base.encode16() sha_status_text = ["SHA256 of ", :bright, pack_name, :normal, " source file is ", :bright] @@ -75,8 +74,11 @@ def run(["get-packs" | args]) do raise "Bad SHA256 for #{pack_name}" end - # The url specified in files should be in the same directory - files_url = Path.join(Path.dirname(manifest_url), pack["files"]) + # The location specified in files should be in the same directory + files_loc = + url_or_path + |> Path.dirname() + |> Path.join(pack["files"]) IO.puts( IO.ANSI.format([ @@ -86,11 +88,11 @@ def run(["get-packs" | args]) do :normal, " from ", :underline, - files_url + files_loc ]) ) - files = Tesla.get!(client(), files_url).body |> Jason.decode!() + files = fetch_and_decode(files_loc) IO.puts(IO.ANSI.format(["Unpacking ", :bright, pack_name])) @@ -134,38 +136,51 @@ def run(["get-packs" | args]) do end end - def run(["gen-pack", src]) do - Application.ensure_all_started(:hackney) + def run(["gen-pack" | args]) do + start_pleroma() - proposed_name = Path.basename(src) |> Path.rootname() - name = String.trim(IO.gets("Pack name [#{proposed_name}]: ")) - # If there's no name, use the default one - name = if String.length(name) > 0, do: name, else: proposed_name - - license = String.trim(IO.gets("License: ")) - homepage = String.trim(IO.gets("Homepage: ")) - description = String.trim(IO.gets("Description: ")) - - proposed_files_name = "#{name}.json" - files_name = String.trim(IO.gets("Save file list to [#{proposed_files_name}]: ")) - files_name = if String.length(files_name) > 0, do: files_name, else: proposed_files_name - - default_exts = [".png", ".gif"] - default_exts_str = Enum.join(default_exts, " ") - - exts = - String.trim( - IO.gets("Emoji file extensions (separated with spaces) [#{default_exts_str}]: ") + {opts, [src], []} = + OptionParser.parse( + args, + strict: [ + name: :string, + license: :string, + homepage: :string, + description: :string, + files: :string, + extensions: :string + ] ) + proposed_name = Path.basename(src) |> Path.rootname() + name = get_option(opts, :name, "Pack name:", proposed_name) + license = get_option(opts, :license, "License:") + homepage = get_option(opts, :homepage, "Homepage:") + description = get_option(opts, :description, "Description:") + + proposed_files_name = "#{name}_files.json" + files_name = get_option(opts, :files, "Save file list to:", proposed_files_name) + + default_exts = [".png", ".gif"] + + custom_exts = + get_option( + opts, + :extensions, + "Emoji file extensions (separated with spaces):", + Enum.join(default_exts, " ") + ) + |> String.split(" ", trim: true) + exts = - if String.length(exts) > 0 do - String.split(exts, " ") - |> Enum.filter(fn e -> e |> String.trim() |> String.length() > 0 end) - else + if MapSet.equal?(MapSet.new(default_exts), MapSet.new(custom_exts)) do default_exts + else + custom_exts end + IO.puts("Using #{Enum.join(exts, " ")} extensions") + IO.puts("Downloading the pack and generating SHA256") binary_archive = Tesla.get!(client(), src).body @@ -195,14 +210,16 @@ def run(["gen-pack", src]) do IO.puts(""" #{files_name} has been created and contains the list of all found emojis in the pack. - Please review the files in the remove those not needed. + Please review the files in the pack and remove those not needed. """) - if File.exists?("index.json") do - existing_data = File.read!("index.json") |> Jason.decode!() + pack_file = "#{name}.json" + + if File.exists?(pack_file) do + existing_data = File.read!(pack_file) |> Jason.decode!() File.write!( - "index.json", + pack_file, Jason.encode!( Map.merge( existing_data, @@ -212,24 +229,28 @@ def run(["gen-pack", src]) do ) ) - IO.puts("index.json file has been update with the #{name} pack") + IO.puts("#{pack_file} has been updated with the #{name} pack") else - File.write!("index.json", Jason.encode!(pack_json, pretty: true)) + File.write!(pack_file, Jason.encode!(pack_json, pretty: true)) - IO.puts("index.json has been created with the #{name} pack") + IO.puts("#{pack_file} has been created with the #{name} pack") end end - defp fetch_manifest(from) do - Jason.decode!( - if String.starts_with?(from, "http") do - Tesla.get!(client(), from).body - else - File.read!(from) - end - ) + defp fetch_and_decode(from) do + with {:ok, json} <- fetch(from) do + Jason.decode!(json) + end end + defp fetch("http" <> _ = from) do + with {:ok, %{body: body}} <- Tesla.get(client(), from) do + {:ok, body} + end + end + + defp fetch(path), do: File.read(path) + defp parse_global_opts(args) do OptionParser.parse( args, diff --git a/lib/mix/tasks/pleroma/instance.ex b/lib/mix/tasks/pleroma/instance.ex index bc842a59f..86409738a 100644 --- a/lib/mix/tasks/pleroma/instance.ex +++ b/lib/mix/tasks/pleroma/instance.ex @@ -147,6 +147,7 @@ def run(["gen" | rest]) do "What directory should media uploads go in (when using the local uploader)?", Pleroma.Config.get([Pleroma.Uploaders.Local, :uploads]) ) + |> Path.expand() static_dir = get_option( @@ -155,6 +156,7 @@ def run(["gen" | rest]) do "What directory should custom public files be read from (custom emojis, frontend bundle overrides, robots.txt, etc.)?", Pleroma.Config.get([:instance, :static_dir]) ) + |> Path.expand() Config.put([:instance, :static_dir], static_dir) @@ -204,7 +206,7 @@ def run(["gen" | rest]) do shell_info("Writing the postgres script to #{psql_path}.") File.write(psql_path, result_psql) - write_robots_txt(indexable, template_dir) + write_robots_txt(static_dir, indexable, template_dir) shell_info( "\n All files successfully written! Refer to the installation instructions for your platform for next steps." @@ -224,15 +226,13 @@ def run(["gen" | rest]) do end end - defp write_robots_txt(indexable, template_dir) do + defp write_robots_txt(static_dir, indexable, template_dir) do robots_txt = EEx.eval_file( template_dir <> "/robots_txt.eex", indexable: indexable ) - static_dir = Pleroma.Config.get([:instance, :static_dir], "instance/static/") - unless File.exists?(static_dir) do File.mkdir_p!(static_dir) end diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index 40dd9bdc0..3635c02bc 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -8,6 +8,8 @@ defmodule Mix.Tasks.Pleroma.User do alias Ecto.Changeset alias Pleroma.User alias Pleroma.UserInviteToken + alias Pleroma.Web.ActivityPub.Builder + alias Pleroma.Web.ActivityPub.Pipeline @shortdoc "Manages Pleroma users" @moduledoc File.read!("docs/administration/CLI_tasks/user.md") @@ -96,8 +98,9 @@ def run(["new", nickname, email | rest]) do def run(["rm", nickname]) do start_pleroma() - with %User{local: true} = user <- User.get_cached_by_nickname(nickname) do - User.perform(:delete, user) + with %User{local: true} = user <- User.get_cached_by_nickname(nickname), + {:ok, delete_data, _} <- Builder.delete(user, user.ap_id), + {:ok, _delete, _} <- Pipeline.common_pipeline(delete_data, local: true) do shell_info("User #{nickname} deleted.") else _ -> shell_error("No local user #{nickname}") @@ -141,28 +144,18 @@ def run(["reset_password", nickname]) do end end - def run(["unsubscribe", nickname]) do + def run(["deactivate", nickname]) do start_pleroma() with %User{} = user <- User.get_cached_by_nickname(nickname) do shell_info("Deactivating #{user.nickname}") User.deactivate(user) - - user - |> User.get_friends() - |> Enum.each(fn friend -> - user = User.get_cached_by_id(user.id) - - shell_info("Unsubscribing #{friend.nickname} from #{user.nickname}") - User.unfollow(user, friend) - end) - :timer.sleep(500) user = User.get_cached_by_id(user.id) - if Enum.empty?(User.get_friends(user)) do - shell_info("Successfully unsubscribed all followers from #{user.nickname}") + if Enum.empty?(Enum.filter(User.get_friends(user), & &1.local)) do + shell_info("Successfully unsubscribed all local followers from #{user.nickname}") end else _ -> @@ -170,7 +163,7 @@ def run(["unsubscribe", nickname]) do end end - def run(["unsubscribe_all_from_instance", instance]) do + def run(["deactivate_all_from_instance", instance]) do start_pleroma() Pleroma.User.Query.build(%{nickname: "@#{instance}"}) @@ -178,7 +171,7 @@ def run(["unsubscribe_all_from_instance", instance]) do |> Stream.each(fn users -> users |> Enum.each(fn user -> - run(["unsubscribe", user.nickname]) + run(["deactivate", user.nickname]) end) end) |> Stream.run() diff --git a/lib/pleroma/activity.ex b/lib/pleroma/activity.ex index 6ca05f74e..6213d0eb7 100644 --- a/lib/pleroma/activity.ex +++ b/lib/pleroma/activity.ex @@ -27,17 +27,13 @@ defmodule Pleroma.Activity do # https://github.com/tootsuite/mastodon/blob/master/app/models/notification.rb#L19 @mastodon_notification_types %{ "Create" => "mention", - "Follow" => "follow", + "Follow" => ["follow", "follow_request"], "Announce" => "reblog", "Like" => "favourite", "Move" => "move", "EmojiReact" => "pleroma:emoji_reaction" } - @mastodon_to_ap_notification_types for {k, v} <- @mastodon_notification_types, - into: %{}, - do: {v, k} - schema "activities" do field(:data, :map) field(:local, :boolean, default: true) @@ -95,6 +91,17 @@ def with_preloaded_object(query, join_type \\ :inner) do |> preload([activity, object: object], object: object) end + # Note: applies to fake activities (ActivityPub.Utils.get_notified_from_object/1 etc.) + def user_actor(%Activity{actor: nil}), do: nil + + def user_actor(%Activity{} = activity) do + with %User{} <- activity.user_actor do + activity.user_actor + else + _ -> User.get_cached_by_ap_id(activity.actor) + end + end + def with_joined_user_actor(query, join_type \\ :inner) do join(query, join_type, [activity], u in User, on: u.ap_id == activity.actor, @@ -280,15 +287,43 @@ defp purge_web_resp_cache(%Activity{} = activity) do defp purge_web_resp_cache(nil), do: nil - for {ap_type, type} <- @mastodon_notification_types do + def follow_accepted?( + %Activity{data: %{"type" => "Follow", "object" => followed_ap_id}} = activity + ) do + with %User{} = follower <- Activity.user_actor(activity), + %User{} = followed <- User.get_cached_by_ap_id(followed_ap_id) do + Pleroma.FollowingRelationship.following?(follower, followed) + else + _ -> false + end + end + + def follow_accepted?(_), do: false + + @spec mastodon_notification_type(Activity.t()) :: String.t() | nil + + for {ap_type, type} <- @mastodon_notification_types, not is_list(type) do def mastodon_notification_type(%Activity{data: %{"type" => unquote(ap_type)}}), do: unquote(type) end + def mastodon_notification_type(%Activity{data: %{"type" => "Follow"}} = activity) do + if follow_accepted?(activity) do + "follow" + else + "follow_request" + end + end + def mastodon_notification_type(%Activity{}), do: nil + @spec from_mastodon_notification_type(String.t()) :: String.t() | nil + @doc "Converts Mastodon notification type to AR activity type" def from_mastodon_notification_type(type) do - Map.get(@mastodon_to_ap_notification_types, type) + with {k, _v} <- + Enum.find(@mastodon_notification_types, fn {_k, v} -> type in List.wrap(v) end) do + k + end end def all_by_actor_and_id(actor, status_ids \\ []) diff --git a/lib/pleroma/activity/queries.ex b/lib/pleroma/activity/queries.ex index 04593b9fb..c99aae44b 100644 --- a/lib/pleroma/activity/queries.ex +++ b/lib/pleroma/activity/queries.ex @@ -24,10 +24,7 @@ def by_ap_id(query \\ Activity, ap_id) do @spec by_actor(query, String.t()) :: query def by_actor(query \\ Activity, actor) do - from( - activity in query, - where: fragment("(?)->>'actor' = ?", activity.data, ^actor) - ) + from(a in query, where: a.actor == ^actor) end @spec by_author(query, User.t()) :: query @@ -35,6 +32,13 @@ def by_author(query \\ Activity, %User{ap_id: ap_id}) do from(a in query, where: a.actor == ^ap_id) end + def find_by_object_ap_id(activities, object_ap_id) do + Enum.find( + activities, + &(object_ap_id in [is_map(&1.data["object"]) && &1.data["object"]["id"], &1.data["object"]]) + ) + end + @spec by_object_id(query, String.t() | [String.t()]) :: query def by_object_id(query \\ Activity, object_id) diff --git a/lib/pleroma/application.ex b/lib/pleroma/application.ex index 33f1705df..9d3d92b38 100644 --- a/lib/pleroma/application.ex +++ b/lib/pleroma/application.ex @@ -3,8 +3,12 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Application do - import Cachex.Spec use Application + + import Cachex.Spec + + alias Pleroma.Config + require Logger @name Mix.Project.config()[:name] @@ -18,9 +22,9 @@ def named_version, do: @name <> " " <> @version def repository, do: @repository def user_agent do - case Pleroma.Config.get([:http, :user_agent], :default) do + case Config.get([:http, :user_agent], :default) do :default -> - info = "#{Pleroma.Web.base_url()} <#{Pleroma.Config.get([:instance, :email], "")}>" + info = "#{Pleroma.Web.base_url()} <#{Config.get([:instance, :email], "")}>" named_version() <> "; " <> info custom -> @@ -33,27 +37,50 @@ def user_agent do def start(_type, _args) do Pleroma.Config.Holder.save_default() Pleroma.HTML.compile_scrubbers() - Pleroma.Config.DeprecationWarnings.warn() + Config.DeprecationWarnings.warn() Pleroma.Plugs.HTTPSecurityPlug.warn_if_disabled() Pleroma.Repo.check_migrations_applied!() setup_instrumenters() load_custom_modules() + adapter = Application.get_env(:tesla, :adapter) + + if adapter == Tesla.Adapter.Gun do + if version = Pleroma.OTPVersion.version() do + [major, minor] = + version + |> String.split(".") + |> Enum.map(&String.to_integer/1) + |> Enum.take(2) + + if (major == 22 and minor < 2) or major < 22 do + raise " + !!!OTP VERSION WARNING!!! + You are using gun adapter with OTP version #{version}, which doesn't support correct handling of unordered certificates chains. Please update your Erlang/OTP to at least 22.2. + " + end + else + raise " + !!!OTP VERSION WARNING!!! + To support correct handling of unordered certificates chains - OTP version must be > 22.2. + " + end + end + # Define workers and child supervisors to be supervised children = [ Pleroma.Repo, - Pleroma.Config.TransferTask, + Config.TransferTask, Pleroma.Emoji, - Pleroma.Captcha, Pleroma.Plugs.RateLimiter.Supervisor ] ++ cachex_children() ++ - hackney_pool_children() ++ + http_children(adapter, @env) ++ [ Pleroma.Stats, Pleroma.JobQueueMonitor, - {Oban, Pleroma.Config.get(Oban)} + {Oban, Config.get(Oban)} ] ++ task_children(@env) ++ streamer_child(@env) ++ @@ -70,7 +97,7 @@ def start(_type, _args) do end def load_custom_modules do - dir = Pleroma.Config.get([:modules, :runtime_dir]) + dir = Config.get([:modules, :runtime_dir]) if dir && File.exists?(dir) do dir @@ -111,20 +138,6 @@ defp setup_instrumenters do Pleroma.Web.Endpoint.Instrumenter.setup() end - def enabled_hackney_pools do - [:media] ++ - if Application.get_env(:tesla, :adapter) == Tesla.Adapter.Hackney do - [:federation] - else - [] - end ++ - if Pleroma.Config.get([Pleroma.Upload, :proxy_remote]) do - [:upload] - else - [] - end - end - defp cachex_children do [ build_cachex("used_captcha", ttl_interval: seconds_valid_interval()), @@ -146,7 +159,7 @@ defp idempotency_expiration, do: expiration(default: :timer.seconds(6 * 60 * 60), interval: :timer.seconds(60)) defp seconds_valid_interval, - do: :timer.seconds(Pleroma.Config.get!([Pleroma.Captcha, :seconds_valid])) + do: :timer.seconds(Config.get!([Pleroma.Captcha, :seconds_valid])) defp build_cachex(type, opts), do: %{ @@ -155,12 +168,19 @@ defp build_cachex(type, opts), type: :worker } - defp chat_enabled?, do: Pleroma.Config.get([:chat, :enabled]) + defp chat_enabled?, do: Config.get([:chat, :enabled]) - defp streamer_child(:test), do: [] + defp streamer_child(env) when env in [:test, :benchmark], do: [] defp streamer_child(_) do - [Pleroma.Web.Streamer.supervisor()] + [ + {Registry, + [ + name: Pleroma.Web.Streamer.registry(), + keys: :duplicate, + partitions: System.schedulers_online() + ]} + ] end defp chat_child(_env, true) do @@ -169,13 +189,6 @@ defp chat_child(_env, true) do defp chat_child(_, _), do: [] - defp hackney_pool_children do - for pool <- enabled_hackney_pools() do - options = Pleroma.Config.get([:hackney_pools, pool]) - :hackney_pool.child_spec(pool, options) - end - end - defp task_children(:test) do [ %{ @@ -200,4 +213,31 @@ defp task_children(_) do } ] end + + # start hackney and gun pools in tests + defp http_children(_, :test) do + hackney_options = Config.get([:hackney_pools, :federation]) + hackney_pool = :hackney_pool.child_spec(:federation, hackney_options) + [hackney_pool, Pleroma.Pool.Supervisor] + end + + defp http_children(Tesla.Adapter.Hackney, _) do + pools = [:federation, :media] + + pools = + if Config.get([Pleroma.Upload, :proxy_remote]) do + [:upload | pools] + else + pools + end + + for pool <- pools do + options = Config.get([:hackney_pools, pool]) + :hackney_pool.child_spec(pool, options) + end + end + + defp http_children(Tesla.Adapter.Gun, _), do: [Pleroma.Pool.Supervisor] + + defp http_children(_, _), do: [] end diff --git a/lib/pleroma/bbs/authenticator.ex b/lib/pleroma/bbs/authenticator.ex index e5b37f33e..815de7002 100644 --- a/lib/pleroma/bbs/authenticator.ex +++ b/lib/pleroma/bbs/authenticator.ex @@ -4,7 +4,7 @@ defmodule Pleroma.BBS.Authenticator do use Sshd.PasswordAuthenticator - alias Comeonin.Pbkdf2 + alias Pleroma.Plugs.AuthenticationPlug alias Pleroma.User def authenticate(username, password) do @@ -12,7 +12,7 @@ def authenticate(username, password) do password = to_string(password) with %User{} = user <- User.get_by_nickname(username) do - Pbkdf2.checkpw(password, user.password_hash) + AuthenticationPlug.checkpw(password, user.password_hash) else _e -> false end diff --git a/lib/pleroma/bbs/handler.ex b/lib/pleroma/bbs/handler.ex index c7bc8ef6c..12d64c2fe 100644 --- a/lib/pleroma/bbs/handler.ex +++ b/lib/pleroma/bbs/handler.ex @@ -66,7 +66,7 @@ def handle_command(%{user: user} = state, "r " <> text) do with %Activity{} <- Activity.get_by_id(activity_id), {:ok, _activity} <- - CommonAPI.post(user, %{"status" => rest, "in_reply_to_status_id" => activity_id}) do + CommonAPI.post(user, %{status: rest, in_reply_to_status_id: activity_id}) do IO.puts("Replied!") else _e -> IO.puts("Could not reply...") @@ -78,7 +78,7 @@ def handle_command(%{user: user} = state, "r " <> text) do def handle_command(%{user: user} = state, "p " <> text) do text = String.trim(text) - with {:ok, _activity} <- CommonAPI.post(user, %{"status" => text}) do + with {:ok, _activity} <- CommonAPI.post(user, %{status: text}) do IO.puts("Posted!") else _e -> IO.puts("Could not post...") diff --git a/lib/pleroma/captcha/captcha.ex b/lib/pleroma/captcha/captcha.ex index cf75c3adc..6ab754b6f 100644 --- a/lib/pleroma/captcha/captcha.ex +++ b/lib/pleroma/captcha/captcha.ex @@ -3,53 +3,22 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Captcha do - import Pleroma.Web.Gettext - alias Calendar.DateTime alias Plug.Crypto.KeyGenerator alias Plug.Crypto.MessageEncryptor - use GenServer - - @doc false - def start_link(_) do - GenServer.start_link(__MODULE__, [], name: __MODULE__) - end - - @doc false - def init(_) do - {:ok, nil} - end - @doc """ Ask the configured captcha service for a new captcha """ def new do - GenServer.call(__MODULE__, :new) - end - - @doc """ - Ask the configured captcha service to validate the captcha - """ - def validate(token, captcha, answer_data) do - GenServer.call(__MODULE__, {:validate, token, captcha, answer_data}) - end - - @doc false - def handle_call(:new, _from, state) do - enabled = Pleroma.Config.get([__MODULE__, :enabled]) - - if !enabled do - {:reply, %{type: :none}, state} + if not enabled?() do + %{type: :none} else new_captcha = method().new() - secret_key_base = Pleroma.Config.get!([Pleroma.Web.Endpoint, :secret_key_base]) - # This make salt a little different for two keys - token = new_captcha[:token] - secret = KeyGenerator.generate(secret_key_base, token <> "_encrypt") - sign_secret = KeyGenerator.generate(secret_key_base, token <> "_sign") + {secret, sign_secret} = secret_pair(new_captcha[:token]) + # Basically copy what Phoenix.Token does here, add the time to # the actual data and make it a binary to then encrypt it encrypted_captcha_answer = @@ -60,55 +29,73 @@ def handle_call(:new, _from, state) do |> :erlang.term_to_binary() |> MessageEncryptor.encrypt(secret, sign_secret) - { - :reply, - # Replace the answer with the encrypted answer - %{new_captcha | answer_data: encrypted_captcha_answer}, - state - } + # Replace the answer with the encrypted answer + %{new_captcha | answer_data: encrypted_captcha_answer} end end - @doc false - def handle_call({:validate, token, captcha, answer_data}, _from, state) do + @doc """ + Ask the configured captcha service to validate the captcha + """ + def validate(token, captcha, answer_data) do + with {:ok, %{at: at, answer_data: answer_md5}} <- validate_answer_data(token, answer_data), + :ok <- validate_expiration(at), + :ok <- validate_usage(token), + :ok <- method().validate(token, captcha, answer_md5), + {:ok, _} <- mark_captcha_as_used(token) do + :ok + end + end + + def enabled?, do: Pleroma.Config.get([__MODULE__, :enabled], false) + + defp seconds_valid, do: Pleroma.Config.get!([__MODULE__, :seconds_valid]) + + defp secret_pair(token) do secret_key_base = Pleroma.Config.get!([Pleroma.Web.Endpoint, :secret_key_base]) secret = KeyGenerator.generate(secret_key_base, token <> "_encrypt") sign_secret = KeyGenerator.generate(secret_key_base, token <> "_sign") + {secret, sign_secret} + end + + defp validate_answer_data(token, answer_data) do + {secret, sign_secret} = secret_pair(token) + + with false <- is_nil(answer_data), + {:ok, data} <- MessageEncryptor.decrypt(answer_data, secret, sign_secret), + %{at: at, answer_data: answer_md5} <- :erlang.binary_to_term(data) do + {:ok, %{at: at, answer_data: answer_md5}} + else + _ -> {:error, :invalid_answer_data} + end + end + + defp validate_expiration(created_at) do # If the time found is less than (current_time-seconds_valid) then the time has already passed # Later we check that the time found is more than the presumed invalidatation time, that means # that the data is still valid and the captcha can be checked - seconds_valid = Pleroma.Config.get!([Pleroma.Captcha, :seconds_valid]) - valid_if_after = DateTime.subtract!(DateTime.now_utc(), seconds_valid) - result = - with false <- is_nil(answer_data), - {:ok, data} <- MessageEncryptor.decrypt(answer_data, secret, sign_secret), - %{at: at, answer_data: answer_md5} <- :erlang.binary_to_term(data) do - try do - if DateTime.before?(at, valid_if_after), - do: throw({:error, dgettext("errors", "CAPTCHA expired")}) + valid_if_after = DateTime.subtract!(DateTime.now_utc(), seconds_valid()) - if not is_nil(Cachex.get!(:used_captcha_cache, token)), - do: throw({:error, dgettext("errors", "CAPTCHA already used")}) + if DateTime.before?(created_at, valid_if_after) do + {:error, :expired} + else + :ok + end + end - res = method().validate(token, captcha, answer_md5) - # Throw if an error occurs - if res != :ok, do: throw(res) + defp validate_usage(token) do + if is_nil(Cachex.get!(:used_captcha_cache, token)) do + :ok + else + {:error, :already_used} + end + end - # Mark this captcha as used - {:ok, _} = - Cachex.put(:used_captcha_cache, token, true, ttl: :timer.seconds(seconds_valid)) - - :ok - catch - :throw, e -> e - end - else - _ -> {:error, dgettext("errors", "Invalid answer data")} - end - - {:reply, result, state} + defp mark_captcha_as_used(token) do + ttl = seconds_valid() |> :timer.seconds() + Cachex.put(:used_captcha_cache, token, true, ttl: ttl) end defp method, do: Pleroma.Config.get!([__MODULE__, :method]) diff --git a/lib/pleroma/captcha/kocaptcha.ex b/lib/pleroma/captcha/kocaptcha.ex index 06ceb20b6..6bc2fa158 100644 --- a/lib/pleroma/captcha/kocaptcha.ex +++ b/lib/pleroma/captcha/kocaptcha.ex @@ -3,7 +3,6 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Captcha.Kocaptcha do - import Pleroma.Web.Gettext alias Pleroma.Captcha.Service @behaviour Service @@ -13,7 +12,7 @@ def new do case Tesla.get(endpoint <> "/new") do {:error, _} -> - %{error: dgettext("errors", "Kocaptcha service unavailable")} + %{error: :kocaptcha_service_unavailable} {:ok, res} -> json_resp = Jason.decode!(res.body) @@ -33,6 +32,6 @@ def validate(_token, captcha, answer_data) do if not is_nil(captcha) and :crypto.hash(:md5, captcha) |> Base.encode16() == String.upcase(answer_data), do: :ok, - else: {:error, dgettext("errors", "Invalid CAPTCHA")} + else: {:error, :invalid} end end diff --git a/lib/pleroma/captcha/native.ex b/lib/pleroma/captcha/native.ex index 06c479ca9..a90631d61 100644 --- a/lib/pleroma/captcha/native.ex +++ b/lib/pleroma/captcha/native.ex @@ -3,7 +3,6 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Captcha.Native do - import Pleroma.Web.Gettext alias Pleroma.Captcha.Service @behaviour Service @@ -11,7 +10,7 @@ defmodule Pleroma.Captcha.Native do def new do case Captcha.get() do :error -> - %{error: dgettext("errors", "Captcha error")} + %{error: :captcha_error} {:ok, answer_data, img_binary} -> %{ @@ -25,7 +24,7 @@ def new do @impl Service def validate(_token, captcha, captcha) when not is_nil(captcha), do: :ok - def validate(_token, _captcha, _answer), do: {:error, dgettext("errors", "Invalid CAPTCHA")} + def validate(_token, _captcha, _answer), do: {:error, :invalid} defp token do 10 diff --git a/lib/pleroma/config/loader.ex b/lib/pleroma/config/loader.ex index 6ca6550bd..0f3ecf1ed 100644 --- a/lib/pleroma/config/loader.ex +++ b/lib/pleroma/config/loader.ex @@ -47,7 +47,7 @@ defp filter(configs) do @spec filter_group(atom(), keyword()) :: keyword() def filter_group(group, configs) do Enum.reject(configs[group], fn {key, _v} -> - key in @reject_keys or (group == :phoenix and key == :serve_endpoints) + key in @reject_keys or (group == :phoenix and key == :serve_endpoints) or group == :postgrex end) end end diff --git a/lib/pleroma/config/transfer_task.ex b/lib/pleroma/config/transfer_task.ex index 7c3449b5e..c02b70e96 100644 --- a/lib/pleroma/config/transfer_task.ex +++ b/lib/pleroma/config/transfer_task.ex @@ -5,6 +5,7 @@ defmodule Pleroma.Config.TransferTask do use Task + alias Pleroma.Config alias Pleroma.ConfigDB alias Pleroma.Repo @@ -18,7 +19,9 @@ defmodule Pleroma.Config.TransferTask do {:pleroma, Oban}, {:pleroma, :rate_limit}, {:pleroma, :markup}, - {:plerome, :streamer} + {:pleroma, :streamer}, + {:pleroma, :pools}, + {:pleroma, :connections_pool} ] @reboot_time_subkeys [ @@ -32,45 +35,44 @@ defmodule Pleroma.Config.TransferTask do {:pleroma, :gopher, [:enabled]} ] - @reject [nil, :prometheus] - def start_link(_) do load_and_update_env() - if Pleroma.Config.get(:env) == :test, do: Ecto.Adapters.SQL.Sandbox.checkin(Repo) + if Config.get(:env) == :test, do: Ecto.Adapters.SQL.Sandbox.checkin(Repo) :ignore end - @spec load_and_update_env([ConfigDB.t()]) :: :ok | false - def load_and_update_env(deleted \\ [], restart_pleroma? \\ true) do - with {:configurable, true} <- - {:configurable, Pleroma.Config.get(:configurable_from_database)}, - true <- Ecto.Adapters.SQL.table_exists?(Repo, "config"), - started_applications <- Application.started_applications() do + @spec load_and_update_env([ConfigDB.t()], boolean()) :: :ok + def load_and_update_env(deleted_settings \\ [], restart_pleroma? \\ true) do + with {_, true} <- {:configurable, Config.get(:configurable_from_database)} do # We need to restart applications for loaded settings take effect - in_db = Repo.all(ConfigDB) + {logger, other} = + (Repo.all(ConfigDB) ++ deleted_settings) + |> Enum.map(&transform_and_merge/1) + |> Enum.split_with(fn {group, _, _, _} -> group in [:logger, :quack] end) - with_deleted = in_db ++ deleted + logger + |> Enum.sort() + |> Enum.each(&configure/1) - reject_for_restart = if restart_pleroma?, do: @reject, else: [:pleroma | @reject] + started_applications = Application.started_applications() - applications = - with_deleted - |> Enum.map(&merge_and_update(&1)) - |> Enum.uniq() - # TODO: some problem with prometheus after restart! - |> Enum.reject(&(&1 in reject_for_restart)) + # TODO: some problem with prometheus after restart! + reject = [nil, :prometheus, :postgrex] - # to be ensured that pleroma will be restarted last - applications = - if :pleroma in applications do - List.delete(applications, :pleroma) ++ [:pleroma] + reject = + if restart_pleroma? do + reject else - Restarter.Pleroma.rebooted() - applications + [:pleroma | reject] end - Enum.each(applications, &restart(started_applications, &1, Pleroma.Config.get(:env))) + other + |> Enum.map(&update/1) + |> Enum.uniq() + |> Enum.reject(&(&1 in reject)) + |> maybe_set_pleroma_last() + |> Enum.each(&restart(started_applications, &1, Config.get(:env))) :ok else @@ -78,51 +80,83 @@ def load_and_update_env(deleted \\ [], restart_pleroma? \\ true) do end end - defp merge_and_update(setting) do - try do - key = ConfigDB.from_string(setting.key) - group = ConfigDB.from_string(setting.group) + defp maybe_set_pleroma_last(apps) do + # to be ensured that pleroma will be restarted last + if :pleroma in apps do + apps + |> List.delete(:pleroma) + |> List.insert_at(-1, :pleroma) + else + Restarter.Pleroma.rebooted() + apps + end + end - default = Pleroma.Config.Holder.default_config(group, key) - value = ConfigDB.from_binary(setting.value) + defp transform_and_merge(%{group: group, key: key, value: value} = setting) do + group = ConfigDB.from_string(group) + key = ConfigDB.from_string(key) + value = ConfigDB.from_binary(value) - merged_value = - if Ecto.get_meta(setting, :state) == :deleted do - default - else - if can_be_merged?(default, value) do - ConfigDB.merge_group(group, key, default, value) - else - value - end - end + default = Config.Holder.default_config(group, key) - :ok = update_env(group, key, merged_value) - - if group != :logger do - if group != :pleroma or pleroma_need_restart?(group, key, value) do - group - end - else - # change logger configuration in runtime, without restart - if Keyword.keyword?(merged_value) and - key not in [:compile_time_application, :backends, :compile_time_purge_matching] do - Logger.configure_backend(key, merged_value) - else - Logger.configure([{key, merged_value}]) - end - - nil + merged = + cond do + Ecto.get_meta(setting, :state) == :deleted -> default + can_be_merged?(default, value) -> ConfigDB.merge_group(group, key, default, value) + true -> value end + + {group, key, value, merged} + end + + # change logger configuration in runtime, without restart + defp configure({:quack, key, _, merged}) do + Logger.configure_backend(Quack.Logger, [{key, merged}]) + :ok = update_env(:quack, key, merged) + end + + defp configure({_, :backends, _, merged}) do + # removing current backends + Enum.each(Application.get_env(:logger, :backends), &Logger.remove_backend/1) + + Enum.each(merged, &Logger.add_backend/1) + + :ok = update_env(:logger, :backends, merged) + end + + defp configure({_, key, _, merged}) when key in [:console, :ex_syslogger] do + merged = + if key == :console do + put_in(merged[:format], merged[:format] <> "\n") + else + merged + end + + backend = + if key == :ex_syslogger, + do: {ExSyslogger, :ex_syslogger}, + else: key + + Logger.configure_backend(backend, merged) + :ok = update_env(:logger, key, merged) + end + + defp configure({_, key, _, merged}) do + Logger.configure([{key, merged}]) + :ok = update_env(:logger, key, merged) + end + + defp update({group, key, value, merged}) do + try do + :ok = update_env(group, key, merged) + + if group != :pleroma or pleroma_need_restart?(group, key, value), do: group rescue error -> error_msg = - "updating env causes error, group: " <> - inspect(setting.group) <> - " key: " <> - inspect(setting.key) <> - " value: " <> - inspect(ConfigDB.from_binary(setting.value)) <> " error: " <> inspect(error) + "updating env causes error, group: #{inspect(group)}, key: #{inspect(key)}, value: #{ + inspect(value) + } error: #{inspect(error)}" Logger.warn(error_msg) @@ -130,6 +164,9 @@ defp merge_and_update(setting) do end end + defp update_env(group, key, nil), do: Application.delete_env(group, key) + defp update_env(group, key, value), do: Application.put_env(group, key, value) + @spec pleroma_need_restart?(atom(), atom(), any()) :: boolean() def pleroma_need_restart?(group, key, value) do group_and_key_need_reboot?(group, key) or group_and_subkey_need_reboot?(group, key, value) @@ -147,9 +184,6 @@ defp group_and_subkey_need_reboot?(group, key, value) do end) end - defp update_env(group, key, nil), do: Application.delete_env(group, key) - defp update_env(group, key, value), do: Application.put_env(group, key, value) - defp restart(_, :pleroma, env), do: Restarter.Pleroma.restart_after_boot(env) defp restart(started_applications, app, _) do diff --git a/lib/pleroma/constants.ex b/lib/pleroma/constants.ex index 4ba39b53f..13eeaa96b 100644 --- a/lib/pleroma/constants.ex +++ b/lib/pleroma/constants.ex @@ -17,7 +17,13 @@ defmodule Pleroma.Constants do "announcement_count", "emoji", "context_id", - "deleted_activity_id" + "deleted_activity_id", + "pleroma_internal" ] ) + + const(static_only_files, + do: + ~w(index.html robots.txt static static-fe finmoji emoji packs sounds images instance sw.js sw-pleroma.js favicon.png schemas doc embed.js embed.css) + ) end diff --git a/lib/pleroma/conversation.ex b/lib/pleroma/conversation.ex index 37d455cfc..e76eb0087 100644 --- a/lib/pleroma/conversation.ex +++ b/lib/pleroma/conversation.ex @@ -63,7 +63,7 @@ def create_or_bump_for(activity, opts \\ []) do ap_id when is_binary(ap_id) and byte_size(ap_id) > 0 <- object.data["context"] do {:ok, conversation} = create_for_ap_id(ap_id) - users = User.get_users_from_set(activity.recipients, false) + users = User.get_users_from_set(activity.recipients, local_only: false) participations = Enum.map(users, fn user -> diff --git a/lib/pleroma/conversation/participation.ex b/lib/pleroma/conversation/participation.ex index 693825cf5..51bb1bda9 100644 --- a/lib/pleroma/conversation/participation.ex +++ b/lib/pleroma/conversation/participation.ex @@ -128,22 +128,19 @@ def for_user(user, params \\ %{}) do |> Pleroma.Pagination.fetch_paginated(params) end - def restrict_recipients(query, user, %{"recipients" => user_ids}) do - user_ids = + def restrict_recipients(query, user, %{recipients: user_ids}) do + user_binary_ids = [user.id | user_ids] |> Enum.uniq() - |> Enum.reduce([], fn user_id, acc -> - {:ok, user_id} = FlakeId.Ecto.CompatType.dump(user_id) - [user_id | acc] - end) + |> User.binary_id() conversation_subquery = __MODULE__ |> group_by([p], p.conversation_id) |> having( [p], - count(p.user_id) == ^length(user_ids) and - fragment("array_agg(?) @> ?", p.user_id, ^user_ids) + count(p.user_id) == ^length(user_binary_ids) and + fragment("array_agg(?) @> ?", p.user_id, ^user_binary_ids) ) |> select([p], %{id: p.conversation_id}) @@ -175,7 +172,7 @@ def for_user_with_last_activity_id(user, params \\ %{}) do | last_activity_id: activity_id } end) - |> Enum.filter(& &1.last_activity_id) + |> Enum.reject(&is_nil(&1.last_activity_id)) end def get(_, _ \\ []) diff --git a/lib/pleroma/docs/json.ex b/lib/pleroma/docs/json.ex index 74f8b2615..d1cf1f487 100644 --- a/lib/pleroma/docs/json.ex +++ b/lib/pleroma/docs/json.ex @@ -18,7 +18,6 @@ def compile do with config <- Pleroma.Config.Loader.read("config/description.exs") do config[:pleroma][:config_description] |> Pleroma.Docs.Generator.convert_to_strings() - |> Jason.encode!() end end end diff --git a/lib/pleroma/ecto_enums.ex b/lib/pleroma/ecto_enums.ex index d9b601223..6fc47620c 100644 --- a/lib/pleroma/ecto_enums.ex +++ b/lib/pleroma/ecto_enums.ex @@ -4,10 +4,16 @@ import EctoEnum -defenum(UserRelationshipTypeEnum, +defenum(Pleroma.UserRelationship.Type, block: 1, mute: 2, reblog_mute: 3, notification_mute: 4, inverse_subscription: 5 ) + +defenum(Pleroma.FollowingRelationship.State, + follow_pending: 1, + follow_accept: 2, + follow_reject: 3 +) diff --git a/lib/pleroma/emails/new_users_digest_email.ex b/lib/pleroma/emails/new_users_digest_email.ex index 7d16b807f..348cbac9c 100644 --- a/lib/pleroma/emails/new_users_digest_email.ex +++ b/lib/pleroma/emails/new_users_digest_email.ex @@ -14,8 +14,10 @@ def new_users(to, users_and_statuses) do styling = Pleroma.Config.get([Pleroma.Emails.UserEmail, :styling]) logo_url = - Pleroma.Web.Endpoint.url() <> - Pleroma.Config.get([:frontend_configurations, :pleroma_fe, :logo]) + Pleroma.Helpers.UriHelper.maybe_add_base( + Pleroma.Config.get([:frontend_configurations, :pleroma_fe, :logo]), + Pleroma.Web.Endpoint.url() + ) new() |> to({to.name, to.email}) diff --git a/lib/pleroma/emoji/formatter.ex b/lib/pleroma/emoji/formatter.ex index 59ff2cac3..dc45b8a38 100644 --- a/lib/pleroma/emoji/formatter.ex +++ b/lib/pleroma/emoji/formatter.ex @@ -38,22 +38,14 @@ def demojify(text) do def demojify(text, nil), do: text - @doc "Outputs a list of the emoji-shortcodes in a text" - def get_emoji(text) when is_binary(text) do - Enum.filter(Emoji.get_all(), fn {emoji, %Emoji{}} -> - String.contains?(text, ":#{emoji}:") - end) - end - - def get_emoji(_), do: [] - @doc "Outputs a list of the emoji-Maps in a text" def get_emoji_map(text) when is_binary(text) do - get_emoji(text) + Emoji.get_all() + |> Enum.filter(fn {emoji, %Emoji{}} -> String.contains?(text, ":#{emoji}:") end) |> Enum.reduce(%{}, fn {name, %Emoji{file: file}}, acc -> Map.put(acc, name, "#{Pleroma.Web.Endpoint.static_url()}#{file}") end) end - def get_emoji_map(_), do: [] + def get_emoji_map(_), do: %{} end diff --git a/lib/pleroma/emoji/pack.ex b/lib/pleroma/emoji/pack.ex new file mode 100644 index 000000000..14a5185be --- /dev/null +++ b/lib/pleroma/emoji/pack.ex @@ -0,0 +1,541 @@ +defmodule Pleroma.Emoji.Pack do + @derive {Jason.Encoder, only: [:files, :pack]} + defstruct files: %{}, + pack_file: nil, + path: nil, + pack: %{}, + name: nil + + @type t() :: %__MODULE__{ + files: %{String.t() => Path.t()}, + pack_file: Path.t(), + path: Path.t(), + pack: map(), + name: String.t() + } + + alias Pleroma.Emoji + + @spec create(String.t()) :: :ok | {:error, File.posix()} | {:error, :empty_values} + def create(name) do + with :ok <- validate_not_empty([name]), + dir <- Path.join(emoji_path(), name), + :ok <- File.mkdir(dir) do + %__MODULE__{pack_file: Path.join(dir, "pack.json")} + |> save_pack() + end + end + + @spec show(String.t()) :: {:ok, t()} | {:error, atom()} + def show(name) do + with :ok <- validate_not_empty([name]), + {:ok, pack} <- load_pack(name) do + {:ok, validate_pack(pack)} + end + end + + @spec delete(String.t()) :: + {:ok, [binary()]} | {:error, File.posix(), binary()} | {:error, :empty_values} + def delete(name) do + with :ok <- validate_not_empty([name]) do + emoji_path() + |> Path.join(name) + |> File.rm_rf() + end + end + + @spec add_file(String.t(), String.t(), Path.t(), Plug.Upload.t() | String.t()) :: + {:ok, t()} | {:error, File.posix() | atom()} + def add_file(name, shortcode, filename, file) do + with :ok <- validate_not_empty([name, shortcode, filename]), + :ok <- validate_emoji_not_exists(shortcode), + {:ok, pack} <- load_pack(name), + :ok <- save_file(file, pack, filename), + {:ok, updated_pack} <- pack |> put_emoji(shortcode, filename) |> save_pack() do + Emoji.reload() + {:ok, updated_pack} + end + end + + @spec delete_file(String.t(), String.t()) :: + {:ok, t()} | {:error, File.posix() | atom()} + def delete_file(name, shortcode) do + with :ok <- validate_not_empty([name, shortcode]), + {:ok, pack} <- load_pack(name), + :ok <- remove_file(pack, shortcode), + {:ok, updated_pack} <- pack |> delete_emoji(shortcode) |> save_pack() do + Emoji.reload() + {:ok, updated_pack} + end + end + + @spec update_file(String.t(), String.t(), String.t(), String.t(), boolean()) :: + {:ok, t()} | {:error, File.posix() | atom()} + def update_file(name, shortcode, new_shortcode, new_filename, force) do + with :ok <- validate_not_empty([name, shortcode, new_shortcode, new_filename]), + {:ok, pack} <- load_pack(name), + {:ok, filename} <- get_filename(pack, shortcode), + :ok <- validate_emoji_not_exists(new_shortcode, force), + :ok <- rename_file(pack, filename, new_filename), + {:ok, updated_pack} <- + pack + |> delete_emoji(shortcode) + |> put_emoji(new_shortcode, new_filename) + |> save_pack() do + Emoji.reload() + {:ok, updated_pack} + end + end + + @spec import_from_filesystem() :: {:ok, [String.t()]} | {:error, File.posix() | atom()} + def import_from_filesystem do + emoji_path = emoji_path() + + with {:ok, %{access: :read_write}} <- File.stat(emoji_path), + {:ok, results} <- File.ls(emoji_path) do + names = + results + |> Enum.map(&Path.join(emoji_path, &1)) + |> Enum.reject(fn path -> + File.dir?(path) and File.exists?(Path.join(path, "pack.json")) + end) + |> Enum.map(&write_pack_contents/1) + |> Enum.reject(&is_nil/1) + + {:ok, names} + else + {:ok, %{access: _}} -> {:error, :no_read_write} + e -> e + end + end + + @spec list_remote(String.t()) :: {:ok, map()} | {:error, atom()} + def list_remote(url) do + uri = url |> String.trim() |> URI.parse() + + with :ok <- validate_shareable_packs_available(uri) do + uri + |> URI.merge("/api/pleroma/emoji/packs") + |> http_get() + end + end + + @spec list_local() :: {:ok, map()} + def list_local do + with {:ok, results} <- list_packs_dir() do + packs = + results + |> Enum.map(fn name -> + case load_pack(name) do + {:ok, pack} -> pack + _ -> nil + end + end) + |> Enum.reject(&is_nil/1) + |> Map.new(fn pack -> {pack.name, validate_pack(pack)} end) + + {:ok, packs} + end + end + + @spec get_archive(String.t()) :: {:ok, binary()} | {:error, atom()} + def get_archive(name) do + with {:ok, pack} <- load_pack(name), + :ok <- validate_downloadable(pack) do + {:ok, fetch_archive(pack)} + end + end + + @spec download(String.t(), String.t(), String.t()) :: :ok | {:error, atom()} + def download(name, url, as) do + uri = url |> String.trim() |> URI.parse() + + with :ok <- validate_shareable_packs_available(uri), + {:ok, remote_pack} <- uri |> URI.merge("/api/pleroma/emoji/packs/#{name}") |> http_get(), + {:ok, %{sha: sha, url: url} = pack_info} <- fetch_pack_info(remote_pack, uri, name), + {:ok, archive} <- download_archive(url, sha), + pack <- copy_as(remote_pack, as || name), + {:ok, _} = unzip(archive, pack_info, remote_pack, pack) do + # Fallback can't contain a pack.json file, since that would cause the fallback-src-sha256 + # in it to depend on itself + if pack_info[:fallback] do + save_pack(pack) + else + {:ok, pack} + end + end + end + + @spec save_metadata(map(), t()) :: {:ok, t()} | {:error, File.posix()} + def save_metadata(metadata, %__MODULE__{} = pack) do + pack + |> Map.put(:pack, metadata) + |> save_pack() + end + + @spec update_metadata(String.t(), map()) :: {:ok, t()} | {:error, File.posix()} + def update_metadata(name, data) do + with {:ok, pack} <- load_pack(name) do + if fallback_sha_changed?(pack, data) do + update_sha_and_save_metadata(pack, data) + else + save_metadata(data, pack) + end + end + end + + @spec load_pack(String.t()) :: {:ok, t()} | {:error, :not_found} + def load_pack(name) do + pack_file = Path.join([emoji_path(), name, "pack.json"]) + + if File.exists?(pack_file) do + pack = + pack_file + |> File.read!() + |> from_json() + |> Map.put(:pack_file, pack_file) + |> Map.put(:path, Path.dirname(pack_file)) + |> Map.put(:name, name) + + {:ok, pack} + else + {:error, :not_found} + end + end + + @spec emoji_path() :: Path.t() + defp emoji_path do + [:instance, :static_dir] + |> Pleroma.Config.get!() + |> Path.join("emoji") + end + + defp validate_emoji_not_exists(shortcode, force \\ false) + defp validate_emoji_not_exists(_shortcode, true), do: :ok + + defp validate_emoji_not_exists(shortcode, _) do + case Emoji.get(shortcode) do + nil -> :ok + _ -> {:error, :already_exists} + end + end + + defp write_pack_contents(path) do + pack = %__MODULE__{ + files: files_from_path(path), + path: path, + pack_file: Path.join(path, "pack.json") + } + + case save_pack(pack) do + {:ok, _pack} -> Path.basename(path) + _ -> nil + end + end + + defp files_from_path(path) do + txt_path = Path.join(path, "emoji.txt") + + if File.exists?(txt_path) do + # There's an emoji.txt file, it's likely from a pack installed by the pack manager. + # Make a pack.json file from the contents of that emoji.txt file + + # FIXME: Copy-pasted from Pleroma.Emoji/load_from_file_stream/2 + + # Create a map of shortcodes to filenames from emoji.txt + txt_path + |> File.read!() + |> String.split("\n") + |> Enum.map(&String.trim/1) + |> Enum.map(fn line -> + case String.split(line, ~r/,\s*/) do + # This matches both strings with and without tags + # and we don't care about tags here + [name, file | _] -> + file_dir_name = Path.dirname(file) + + if String.ends_with?(path, file_dir_name) do + {name, Path.basename(file)} + else + {name, file} + end + + _ -> + nil + end + end) + |> Enum.reject(&is_nil/1) + |> Map.new() + else + # If there's no emoji.txt, assume all files + # that are of certain extensions from the config are emojis and import them all + pack_extensions = Pleroma.Config.get!([:emoji, :pack_extensions]) + Emoji.Loader.make_shortcode_to_file_map(path, pack_extensions) + end + end + + defp validate_pack(pack) do + info = + if downloadable?(pack) do + archive = fetch_archive(pack) + archive_sha = :crypto.hash(:sha256, archive) |> Base.encode16() + + pack.pack + |> Map.put("can-download", true) + |> Map.put("download-sha256", archive_sha) + else + Map.put(pack.pack, "can-download", false) + end + + Map.put(pack, :pack, info) + end + + defp downloadable?(pack) do + # If the pack is set as shared, check if it can be downloaded + # That means that when asked, the pack can be packed and sent to the remote + # Otherwise, they'd have to download it from external-src + pack.pack["share-files"] && + Enum.all?(pack.files, fn {_, file} -> + File.exists?(Path.join(pack.path, file)) + end) + end + + defp create_archive_and_cache(pack, hash) do + files = ['pack.json' | Enum.map(pack.files, fn {_, file} -> to_charlist(file) end)] + + {:ok, {_, result}} = + :zip.zip('#{pack.name}.zip', files, [:memory, cwd: to_charlist(pack.path)]) + + ttl_per_file = Pleroma.Config.get!([:emoji, :shared_pack_cache_seconds_per_file]) + overall_ttl = :timer.seconds(ttl_per_file * Enum.count(files)) + + Cachex.put!( + :emoji_packs_cache, + pack.name, + # if pack.json MD5 changes, the cache is not valid anymore + %{hash: hash, pack_data: result}, + # Add a minute to cache time for every file in the pack + ttl: overall_ttl + ) + + result + end + + defp save_pack(pack) do + with {:ok, json} <- Jason.encode(pack, pretty: true), + :ok <- File.write(pack.pack_file, json) do + {:ok, pack} + end + end + + defp from_json(json) do + map = Jason.decode!(json) + + struct(__MODULE__, %{files: map["files"], pack: map["pack"]}) + end + + defp validate_shareable_packs_available(uri) do + with {:ok, %{"links" => links}} <- uri |> URI.merge("/.well-known/nodeinfo") |> http_get(), + # Get the actual nodeinfo address and fetch it + {:ok, %{"metadata" => %{"features" => features}}} <- + links |> List.last() |> Map.get("href") |> http_get() do + if Enum.member?(features, "shareable_emoji_packs") do + :ok + else + {:error, :not_shareable} + end + end + end + + defp validate_not_empty(list) do + if Enum.all?(list, fn i -> is_binary(i) and i != "" end) do + :ok + else + {:error, :empty_values} + end + end + + defp save_file(file, pack, filename) do + file_path = Path.join(pack.path, filename) + create_subdirs(file_path) + + case file do + %Plug.Upload{path: upload_path} -> + # Copy the uploaded file from the temporary directory + with {:ok, _} <- File.copy(upload_path, file_path), do: :ok + + url when is_binary(url) -> + # Download and write the file + file_contents = Tesla.get!(url).body + File.write(file_path, file_contents) + end + end + + defp put_emoji(pack, shortcode, filename) do + files = Map.put(pack.files, shortcode, filename) + %{pack | files: files} + end + + defp delete_emoji(pack, shortcode) do + files = Map.delete(pack.files, shortcode) + %{pack | files: files} + end + + defp rename_file(pack, filename, new_filename) do + old_path = Path.join(pack.path, filename) + new_path = Path.join(pack.path, new_filename) + create_subdirs(new_path) + + with :ok <- File.rename(old_path, new_path) do + remove_dir_if_empty(old_path, filename) + end + end + + defp create_subdirs(file_path) do + if String.contains?(file_path, "/") do + file_path + |> Path.dirname() + |> File.mkdir_p!() + end + end + + defp remove_file(pack, shortcode) do + with {:ok, filename} <- get_filename(pack, shortcode), + emoji <- Path.join(pack.path, filename), + :ok <- File.rm(emoji) do + remove_dir_if_empty(emoji, filename) + end + end + + defp remove_dir_if_empty(emoji, filename) do + dir = Path.dirname(emoji) + + if String.contains?(filename, "/") and File.ls!(dir) == [] do + File.rmdir!(dir) + else + :ok + end + end + + defp get_filename(pack, shortcode) do + with %{^shortcode => filename} when is_binary(filename) <- pack.files, + true <- pack.path |> Path.join(filename) |> File.exists?() do + {:ok, filename} + else + _ -> {:error, :doesnt_exist} + end + end + + defp http_get(%URI{} = url), do: url |> to_string() |> http_get() + + defp http_get(url) do + with {:ok, %{body: body}} <- url |> Pleroma.HTTP.get() do + Jason.decode(body) + end + end + + defp list_packs_dir do + emoji_path = emoji_path() + # Create the directory first if it does not exist. This is probably the first request made + # with the API so it should be sufficient + with {:create_dir, :ok} <- {:create_dir, File.mkdir_p(emoji_path)}, + {:ls, {:ok, results}} <- {:ls, File.ls(emoji_path)} do + {:ok, results} + else + {:create_dir, {:error, e}} -> {:error, :create_dir, e} + {:ls, {:error, e}} -> {:error, :ls, e} + end + end + + defp validate_downloadable(pack) do + if downloadable?(pack), do: :ok, else: {:error, :cant_download} + end + + defp copy_as(remote_pack, local_name) do + path = Path.join(emoji_path(), local_name) + + %__MODULE__{ + name: local_name, + path: path, + files: remote_pack["files"], + pack_file: Path.join(path, "pack.json") + } + end + + defp unzip(archive, pack_info, remote_pack, local_pack) do + with :ok <- File.mkdir_p!(local_pack.path) do + files = Enum.map(remote_pack["files"], fn {_, path} -> to_charlist(path) end) + # Fallback cannot contain a pack.json file + files = if pack_info[:fallback], do: files, else: ['pack.json' | files] + + :zip.unzip(archive, cwd: to_charlist(local_pack.path), file_list: files) + end + end + + defp fetch_pack_info(remote_pack, uri, name) do + case remote_pack["pack"] do + %{"share-files" => true, "can-download" => true, "download-sha256" => sha} -> + {:ok, + %{ + sha: sha, + url: URI.merge(uri, "/api/pleroma/emoji/packs/#{name}/archive") |> to_string() + }} + + %{"fallback-src" => src, "fallback-src-sha256" => sha} when is_binary(src) -> + {:ok, + %{ + sha: sha, + url: src, + fallback: true + }} + + _ -> + {:error, "The pack was not set as shared and there is no fallback src to download from"} + end + end + + defp download_archive(url, sha) do + with {:ok, %{body: archive}} <- Tesla.get(url) do + if Base.decode16!(sha) == :crypto.hash(:sha256, archive) do + {:ok, archive} + else + {:error, :invalid_checksum} + end + end + end + + defp fetch_archive(pack) do + hash = :crypto.hash(:md5, File.read!(pack.pack_file)) + + case Cachex.get!(:emoji_packs_cache, pack.name) do + %{hash: ^hash, pack_data: archive} -> archive + _ -> create_archive_and_cache(pack, hash) + end + end + + defp fallback_sha_changed?(pack, data) do + is_binary(data[:"fallback-src"]) and data[:"fallback-src"] != pack.pack["fallback-src"] + end + + defp update_sha_and_save_metadata(pack, data) do + with {:ok, %{body: zip}} <- Tesla.get(data[:"fallback-src"]), + :ok <- validate_has_all_files(pack, zip) do + fallback_sha = :sha256 |> :crypto.hash(zip) |> Base.encode16() + + data + |> Map.put("fallback-src-sha256", fallback_sha) + |> save_metadata(pack) + end + end + + defp validate_has_all_files(pack, zip) do + with {:ok, f_list} <- :zip.unzip(zip, [:memory]) do + # Check if all files from the pack.json are in the archive + pack.files + |> Enum.all?(fn {_, from_manifest} -> + List.keyfind(f_list, to_charlist(from_manifest), 0) + end) + |> if(do: :ok, else: {:error, :incomplete}) + end + end +end diff --git a/lib/pleroma/filter.ex b/lib/pleroma/filter.ex index 7cb49360f..4d61b3650 100644 --- a/lib/pleroma/filter.ex +++ b/lib/pleroma/filter.ex @@ -89,11 +89,10 @@ def delete(%Pleroma.Filter{id: filter_key} = filter) when is_nil(filter_key) do |> Repo.delete() end - def update(%Pleroma.Filter{} = filter) do - destination = Map.from_struct(filter) - - Pleroma.Filter.get(filter.filter_id, %{id: filter.user_id}) - |> cast(destination, [:phrase, :context, :hide, :expires_at, :whole_word]) + def update(%Pleroma.Filter{} = filter, params) do + filter + |> cast(params, [:phrase, :context, :hide, :expires_at, :whole_word]) + |> validate_required([:phrase, :context]) |> Repo.update() end end diff --git a/lib/pleroma/following_relationship.ex b/lib/pleroma/following_relationship.ex index a6d281151..3a3082e72 100644 --- a/lib/pleroma/following_relationship.ex +++ b/lib/pleroma/following_relationship.ex @@ -8,12 +8,14 @@ defmodule Pleroma.FollowingRelationship do import Ecto.Changeset import Ecto.Query + alias Ecto.Changeset alias FlakeId.Ecto.CompatType + alias Pleroma.FollowingRelationship.State alias Pleroma.Repo alias Pleroma.User schema "following_relationships" do - field(:state, :string, default: "accept") + field(:state, State, default: :follow_pending) belongs_to(:follower, User, type: CompatType) belongs_to(:following, User, type: CompatType) @@ -21,12 +23,29 @@ defmodule Pleroma.FollowingRelationship do timestamps() end + @doc "Returns underlying integer code for state atom" + def state_int_code(state_atom), do: State.__enum_map__() |> Keyword.fetch!(state_atom) + + def accept_state_code, do: state_int_code(:follow_accept) + def changeset(%__MODULE__{} = following_relationship, attrs) do following_relationship |> cast(attrs, [:state]) |> put_assoc(:follower, attrs.follower) |> put_assoc(:following, attrs.following) |> validate_required([:state, :follower, :following]) + |> unique_constraint(:follower_id, + name: :following_relationships_follower_id_following_id_index + ) + |> validate_not_self_relationship() + end + + def state_to_enum(state) when state in ["pending", "accept", "reject"] do + String.to_existing_atom("follow_#{state}") + end + + def state_to_enum(state) do + raise "State is not convertible to Pleroma.FollowingRelationship.State: #{state}" end def get(%User{} = follower, %User{} = following) do @@ -35,7 +54,7 @@ def get(%User{} = follower, %User{} = following) do |> Repo.one() end - def update(follower, following, "reject"), do: unfollow(follower, following) + def update(follower, following, :follow_reject), do: unfollow(follower, following) def update(%User{} = follower, %User{} = following, state) do case get(follower, following) do @@ -50,7 +69,7 @@ def update(%User{} = follower, %User{} = following, state) do end end - def follow(%User{} = follower, %User{} = following, state \\ "accept") do + def follow(%User{} = follower, %User{} = following, state \\ :follow_accept) do %__MODULE__{} |> changeset(%{follower: follower, following: following, state: state}) |> Repo.insert(on_conflict: :nothing) @@ -69,6 +88,29 @@ def follower_count(%User{} = user) do |> Repo.aggregate(:count, :id) end + def followers_query(%User{} = user) do + __MODULE__ + |> join(:inner, [r], u in User, on: r.follower_id == u.id) + |> where([r], r.following_id == ^user.id) + |> where([r], r.state == ^:follow_accept) + end + + def followers_ap_ids(%User{} = user, from_ap_ids \\ nil) do + query = + user + |> followers_query() + |> select([r, u], u.ap_id) + + query = + if from_ap_ids do + where(query, [r, u], u.ap_id in ^from_ap_ids) + else + query + end + + Repo.all(query) + end + def following_count(%User{id: nil}), do: 0 def following_count(%User{} = user) do @@ -80,7 +122,7 @@ def following_count(%User{} = user) do def get_follow_requests(%User{id: id}) do __MODULE__ |> join(:inner, [r], f in assoc(r, :follower)) - |> where([r], r.state == "pending") + |> where([r], r.state == ^:follow_pending) |> where([r], r.following_id == ^id) |> select([r, f], f) |> Repo.all() @@ -88,16 +130,20 @@ def get_follow_requests(%User{id: id}) do def following?(%User{id: follower_id}, %User{id: followed_id}) do __MODULE__ - |> where(follower_id: ^follower_id, following_id: ^followed_id, state: "accept") + |> where(follower_id: ^follower_id, following_id: ^followed_id, state: ^:follow_accept) |> Repo.exists?() end + def following_query(%User{} = user) do + __MODULE__ + |> join(:inner, [r], u in User, on: r.following_id == u.id) + |> where([r], r.follower_id == ^user.id) + |> where([r], r.state == ^:follow_accept) + end + def following(%User{} = user) do following = - __MODULE__ - |> join(:inner, [r], u in User, on: r.following_id == u.id) - |> where([r], r.follower_id == ^user.id) - |> where([r], r.state == "accept") + following_query(user) |> select([r, u], u.follower_address) |> Repo.all() @@ -129,4 +175,82 @@ def move_following(origin, target) do move_following(origin, target) end end + + def all_between_user_sets( + source_users, + target_users + ) + when is_list(source_users) and is_list(target_users) do + source_user_ids = User.binary_id(source_users) + target_user_ids = User.binary_id(target_users) + + __MODULE__ + |> where( + fragment( + "(follower_id = ANY(?) AND following_id = ANY(?)) OR \ + (follower_id = ANY(?) AND following_id = ANY(?))", + ^source_user_ids, + ^target_user_ids, + ^target_user_ids, + ^source_user_ids + ) + ) + |> Repo.all() + end + + def find(following_relationships, follower, following) do + Enum.find(following_relationships, fn + fr -> fr.follower_id == follower.id and fr.following_id == following.id + end) + end + + @doc """ + For a query with joined activity, + keeps rows where activity's actor is followed by user -or- is NOT domain-blocked by user. + """ + def keep_following_or_not_domain_blocked(query, user) do + where( + query, + [_, activity], + fragment( + # "(actor's domain NOT in domain_blocks) OR (actor IS in followed AP IDs)" + """ + NOT (substring(? from '.*://([^/]*)') = ANY(?)) OR + ? = ANY(SELECT ap_id FROM users AS u INNER JOIN following_relationships AS fr + ON u.id = fr.following_id WHERE fr.follower_id = ? AND fr.state = ?) + """, + activity.actor, + ^user.domain_blocks, + activity.actor, + ^User.binary_id(user.id), + ^accept_state_code() + ) + ) + end + + defp validate_not_self_relationship(%Changeset{} = changeset) do + changeset + |> validate_follower_id_following_id_inequality() + |> validate_following_id_follower_id_inequality() + end + + defp validate_follower_id_following_id_inequality(%Changeset{} = changeset) do + validate_change(changeset, :follower_id, fn _, follower_id -> + if follower_id == get_field(changeset, :following_id) do + [source_id: "can't be equal to following_id"] + else + [] + end + end) + end + + defp validate_following_id_follower_id_inequality(%Changeset{} = changeset) do + validate_change(changeset, :following_id, fn _, following_id -> + if following_id == get_field(changeset, :follower_id) do + [target_id: "can't be equal to follower_id"] + else + [] + end + end) + end end diff --git a/lib/pleroma/formatter.ex b/lib/pleroma/formatter.ex index e2a658cb3..02a93a8dc 100644 --- a/lib/pleroma/formatter.ex +++ b/lib/pleroma/formatter.ex @@ -31,13 +31,23 @@ def escape_mention_handler("@" <> nickname = mention, buffer, _, _) do def mention_handler("@" <> nickname, buffer, opts, acc) do case User.get_cached_by_nickname(nickname) do %User{id: id} = user -> - ap_id = get_ap_id(user) + user_url = user.uri || user.ap_id nickname_text = get_nickname_text(nickname, opts) link = - ~s(@#{ - nickname_text - }) + Phoenix.HTML.Tag.content_tag( + :span, + Phoenix.HTML.Tag.content_tag( + :a, + ["@", Phoenix.HTML.Tag.content_tag(:span, nickname_text)], + "data-user": id, + class: "u-url mention", + href: user_url, + rel: "ugc" + ), + class: "h-card" + ) + |> Phoenix.HTML.safe_to_string() {link, %{acc | mentions: MapSet.put(acc.mentions, {"@" <> nickname, user})}} @@ -49,7 +59,15 @@ def mention_handler("@" <> nickname, buffer, opts, acc) do def hashtag_handler("#" <> tag = tag_text, _buffer, _opts, acc) do tag = String.downcase(tag) url = "#{Pleroma.Web.base_url()}/tag/#{tag}" - link = ~s(#{tag_text}) + + link = + Phoenix.HTML.Tag.content_tag(:a, tag_text, + class: "hashtag", + "data-tag": tag, + href: url, + rel: "tag ugc" + ) + |> Phoenix.HTML.safe_to_string() {link, %{acc | tags: MapSet.put(acc.tags, {tag_text, tag})}} end @@ -128,9 +146,6 @@ def truncate(text, max_length \\ 200, omission \\ "...") do end end - defp get_ap_id(%User{source_data: %{"url" => url}}) when is_binary(url), do: url - defp get_ap_id(%User{ap_id: ap_id}), do: ap_id - defp get_nickname_text(nickname, %{mentions_format: :full}), do: User.full_nickname(nickname) defp get_nickname_text(nickname, _), do: User.local_nickname(nickname) end diff --git a/lib/pleroma/gun/api.ex b/lib/pleroma/gun/api.ex new file mode 100644 index 000000000..f51cd7db8 --- /dev/null +++ b/lib/pleroma/gun/api.ex @@ -0,0 +1,45 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Gun.API do + @behaviour Pleroma.Gun + + alias Pleroma.Gun + + @gun_keys [ + :connect_timeout, + :http_opts, + :http2_opts, + :protocols, + :retry, + :retry_timeout, + :trace, + :transport, + :tls_opts, + :tcp_opts, + :socks_opts, + :ws_opts + ] + + @impl Gun + def open(host, port, opts \\ %{}), do: :gun.open(host, port, Map.take(opts, @gun_keys)) + + @impl Gun + defdelegate info(pid), to: :gun + + @impl Gun + defdelegate close(pid), to: :gun + + @impl Gun + defdelegate await_up(pid, timeout \\ 5_000), to: :gun + + @impl Gun + defdelegate connect(pid, opts), to: :gun + + @impl Gun + defdelegate await(pid, ref), to: :gun + + @impl Gun + defdelegate set_owner(pid, owner), to: :gun +end diff --git a/lib/pleroma/gun/conn.ex b/lib/pleroma/gun/conn.ex new file mode 100644 index 000000000..cd25a2e74 --- /dev/null +++ b/lib/pleroma/gun/conn.ex @@ -0,0 +1,198 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Gun.Conn do + @moduledoc """ + Struct for gun connection data + """ + alias Pleroma.Gun + alias Pleroma.Pool.Connections + + require Logger + + @type gun_state :: :up | :down + @type conn_state :: :active | :idle + + @type t :: %__MODULE__{ + conn: pid(), + gun_state: gun_state(), + conn_state: conn_state(), + used_by: [pid()], + last_reference: pos_integer(), + crf: float(), + retries: pos_integer() + } + + defstruct conn: nil, + gun_state: :open, + conn_state: :init, + used_by: [], + last_reference: 0, + crf: 1, + retries: 0 + + @spec open(String.t() | URI.t(), atom(), keyword()) :: :ok | nil + def open(url, name, opts \\ []) + def open(url, name, opts) when is_binary(url), do: open(URI.parse(url), name, opts) + + def open(%URI{} = uri, name, opts) do + pool_opts = Pleroma.Config.get([:connections_pool], []) + + opts = + opts + |> Enum.into(%{}) + |> Map.put_new(:retry, pool_opts[:retry] || 1) + |> Map.put_new(:retry_timeout, pool_opts[:retry_timeout] || 1000) + |> Map.put_new(:await_up_timeout, pool_opts[:await_up_timeout] || 5_000) + |> maybe_add_tls_opts(uri) + + key = "#{uri.scheme}:#{uri.host}:#{uri.port}" + + max_connections = pool_opts[:max_connections] || 250 + + conn_pid = + if Connections.count(name) < max_connections do + do_open(uri, opts) + else + close_least_used_and_do_open(name, uri, opts) + end + + if is_pid(conn_pid) do + conn = %Pleroma.Gun.Conn{ + conn: conn_pid, + gun_state: :up, + conn_state: :active, + last_reference: :os.system_time(:second) + } + + :ok = Gun.set_owner(conn_pid, Process.whereis(name)) + Connections.add_conn(name, key, conn) + end + end + + defp maybe_add_tls_opts(opts, %URI{scheme: "http"}), do: opts + + defp maybe_add_tls_opts(opts, %URI{scheme: "https", host: host}) do + tls_opts = [ + verify: :verify_peer, + cacertfile: CAStore.file_path(), + depth: 20, + reuse_sessions: false, + verify_fun: + {&:ssl_verify_hostname.verify_fun/3, + [check_hostname: Pleroma.HTTP.Connection.format_host(host)]} + ] + + tls_opts = + if Keyword.keyword?(opts[:tls_opts]) do + Keyword.merge(tls_opts, opts[:tls_opts]) + else + tls_opts + end + + Map.put(opts, :tls_opts, tls_opts) + end + + defp do_open(uri, %{proxy: {proxy_host, proxy_port}} = opts) do + connect_opts = + uri + |> destination_opts() + |> add_http2_opts(uri.scheme, Map.get(opts, :tls_opts, [])) + + with open_opts <- Map.delete(opts, :tls_opts), + {:ok, conn} <- Gun.open(proxy_host, proxy_port, open_opts), + {:ok, _} <- Gun.await_up(conn, opts[:await_up_timeout]), + stream <- Gun.connect(conn, connect_opts), + {:response, :fin, 200, _} <- Gun.await(conn, stream) do + conn + else + error -> + Logger.warn( + "Opening proxied connection to #{compose_uri_log(uri)} failed with error #{ + inspect(error) + }" + ) + + error + end + end + + defp do_open(uri, %{proxy: {proxy_type, proxy_host, proxy_port}} = opts) do + version = + proxy_type + |> to_string() + |> String.last() + |> case do + "4" -> 4 + _ -> 5 + end + + socks_opts = + uri + |> destination_opts() + |> add_http2_opts(uri.scheme, Map.get(opts, :tls_opts, [])) + |> Map.put(:version, version) + + opts = + opts + |> Map.put(:protocols, [:socks]) + |> Map.put(:socks_opts, socks_opts) + + with {:ok, conn} <- Gun.open(proxy_host, proxy_port, opts), + {:ok, _} <- Gun.await_up(conn, opts[:await_up_timeout]) do + conn + else + error -> + Logger.warn( + "Opening socks proxied connection to #{compose_uri_log(uri)} failed with error #{ + inspect(error) + }" + ) + + error + end + end + + defp do_open(%URI{host: host, port: port} = uri, opts) do + host = Pleroma.HTTP.Connection.parse_host(host) + + with {:ok, conn} <- Gun.open(host, port, opts), + {:ok, _} <- Gun.await_up(conn, opts[:await_up_timeout]) do + conn + else + error -> + Logger.warn( + "Opening connection to #{compose_uri_log(uri)} failed with error #{inspect(error)}" + ) + + error + end + end + + defp destination_opts(%URI{host: host, port: port}) do + host = Pleroma.HTTP.Connection.parse_host(host) + %{host: host, port: port} + end + + defp add_http2_opts(opts, "https", tls_opts) do + Map.merge(opts, %{protocols: [:http2], transport: :tls, tls_opts: tls_opts}) + end + + defp add_http2_opts(opts, _, _), do: opts + + defp close_least_used_and_do_open(name, uri, opts) do + with [{key, conn} | _conns] <- Connections.get_unused_conns(name), + :ok <- Gun.close(conn.conn) do + Connections.remove_conn(name, key) + + do_open(uri, opts) + else + [] -> {:error, :pool_overflowed} + end + end + + def compose_uri_log(%URI{scheme: scheme, host: host, path: path}) do + "#{scheme}://#{host}#{path}" + end +end diff --git a/lib/pleroma/gun/gun.ex b/lib/pleroma/gun/gun.ex new file mode 100644 index 000000000..4043e4880 --- /dev/null +++ b/lib/pleroma/gun/gun.ex @@ -0,0 +1,31 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Gun do + @callback open(charlist(), pos_integer(), map()) :: {:ok, pid()} + @callback info(pid()) :: map() + @callback close(pid()) :: :ok + @callback await_up(pid, pos_integer()) :: {:ok, atom()} | {:error, atom()} + @callback connect(pid(), map()) :: reference() + @callback await(pid(), reference()) :: {:response, :fin, 200, []} + @callback set_owner(pid(), pid()) :: :ok + + @api Pleroma.Config.get([Pleroma.Gun], Pleroma.Gun.API) + + defp api, do: @api + + def open(host, port, opts), do: api().open(host, port, opts) + + def info(pid), do: api().info(pid) + + def close(pid), do: api().close(pid) + + def await_up(pid, timeout \\ 5_000), do: api().await_up(pid, timeout) + + def connect(pid, opts), do: api().connect(pid, opts) + + def await(pid, ref), do: api().await(pid, ref) + + def set_owner(pid, owner), do: api().set_owner(pid, owner) +end diff --git a/lib/pleroma/healthcheck.ex b/lib/pleroma/healthcheck.ex index 8f7f43ec2..92ce83cb7 100644 --- a/lib/pleroma/healthcheck.ex +++ b/lib/pleroma/healthcheck.ex @@ -29,7 +29,7 @@ defmodule Pleroma.Healthcheck do @spec system_info() :: t() def system_info do %Healthcheck{ - memory_used: Float.round(:erlang.memory(:total) / 1024 / 1024, 2) + memory_used: Float.round(:recon_alloc.memory(:allocated) / 1024 / 1024, 2) } |> assign_db_info() |> assign_job_queue_stats() diff --git a/lib/pleroma/helpers/uri_helper.ex b/lib/pleroma/helpers/uri_helper.ex index 256252ddb..69d8c8fe0 100644 --- a/lib/pleroma/helpers/uri_helper.ex +++ b/lib/pleroma/helpers/uri_helper.ex @@ -24,4 +24,7 @@ def append_param_if_present(%{} = params, param_name, param_value) do params end end + + def maybe_add_base("/" <> uri, base), do: Path.join([base, uri]) + def maybe_add_base(uri, _base), do: uri end diff --git a/lib/pleroma/http/adapter_helper.ex b/lib/pleroma/http/adapter_helper.ex new file mode 100644 index 000000000..510722ff9 --- /dev/null +++ b/lib/pleroma/http/adapter_helper.ex @@ -0,0 +1,41 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.HTTP.AdapterHelper do + alias Pleroma.HTTP.Connection + + @type proxy :: + {Connection.host(), pos_integer()} + | {Connection.proxy_type(), Connection.host(), pos_integer()} + + @callback options(keyword(), URI.t()) :: keyword() + @callback after_request(keyword()) :: :ok + + @spec options(keyword(), URI.t()) :: keyword() + def options(opts, _uri) do + proxy = Pleroma.Config.get([:http, :proxy_url], nil) + maybe_add_proxy(opts, format_proxy(proxy)) + end + + @spec maybe_get_conn(URI.t(), keyword()) :: keyword() + def maybe_get_conn(_uri, opts), do: opts + + @spec after_request(keyword()) :: :ok + def after_request(_opts), do: :ok + + @spec format_proxy(String.t() | tuple() | nil) :: proxy() | nil + def format_proxy(nil), do: nil + + def format_proxy(proxy_url) do + case Connection.parse_proxy(proxy_url) do + {:ok, host, port} -> {host, port} + {:ok, type, host, port} -> {type, host, port} + _ -> nil + end + end + + @spec maybe_add_proxy(keyword(), proxy() | nil) :: keyword() + def maybe_add_proxy(opts, nil), do: opts + def maybe_add_proxy(opts, proxy), do: Keyword.put_new(opts, :proxy, proxy) +end diff --git a/lib/pleroma/http/adapter_helper/gun.ex b/lib/pleroma/http/adapter_helper/gun.ex new file mode 100644 index 000000000..ead7cdc6b --- /dev/null +++ b/lib/pleroma/http/adapter_helper/gun.ex @@ -0,0 +1,77 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.HTTP.AdapterHelper.Gun do + @behaviour Pleroma.HTTP.AdapterHelper + + alias Pleroma.HTTP.AdapterHelper + alias Pleroma.Pool.Connections + + require Logger + + @defaults [ + connect_timeout: 5_000, + domain_lookup_timeout: 5_000, + tls_handshake_timeout: 5_000, + retry: 1, + retry_timeout: 1000, + await_up_timeout: 5_000 + ] + + @spec options(keyword(), URI.t()) :: keyword() + def options(incoming_opts \\ [], %URI{} = uri) do + proxy = + Pleroma.Config.get([:http, :proxy_url]) + |> AdapterHelper.format_proxy() + + config_opts = Pleroma.Config.get([:http, :adapter], []) + + @defaults + |> Keyword.merge(config_opts) + |> add_scheme_opts(uri) + |> AdapterHelper.maybe_add_proxy(proxy) + |> maybe_get_conn(uri, incoming_opts) + end + + @spec after_request(keyword()) :: :ok + def after_request(opts) do + if opts[:conn] && opts[:body_as] != :chunks do + Connections.checkout(opts[:conn], self(), :gun_connections) + end + + :ok + end + + defp add_scheme_opts(opts, %{scheme: "http"}), do: opts + + defp add_scheme_opts(opts, %{scheme: "https"}) do + opts + |> Keyword.put(:certificates_verification, true) + |> Keyword.put(:tls_opts, log_level: :warning) + end + + defp maybe_get_conn(adapter_opts, uri, incoming_opts) do + {receive_conn?, opts} = + adapter_opts + |> Keyword.merge(incoming_opts) + |> Keyword.pop(:receive_conn, true) + + if Connections.alive?(:gun_connections) and receive_conn? do + checkin_conn(uri, opts) + else + opts + end + end + + defp checkin_conn(uri, opts) do + case Connections.checkin(uri, :gun_connections) do + nil -> + Task.start(Pleroma.Gun.Conn, :open, [uri, :gun_connections, opts]) + opts + + conn when is_pid(conn) -> + Keyword.merge(opts, conn: conn, close_conn: false) + end + end +end diff --git a/lib/pleroma/http/adapter_helper/hackney.ex b/lib/pleroma/http/adapter_helper/hackney.ex new file mode 100644 index 000000000..3972a03a9 --- /dev/null +++ b/lib/pleroma/http/adapter_helper/hackney.ex @@ -0,0 +1,28 @@ +defmodule Pleroma.HTTP.AdapterHelper.Hackney do + @behaviour Pleroma.HTTP.AdapterHelper + + @defaults [ + connect_timeout: 10_000, + recv_timeout: 20_000, + follow_redirect: true, + force_redirect: true, + pool: :federation + ] + + @spec options(keyword(), URI.t()) :: keyword() + def options(connection_opts \\ [], %URI{} = uri) do + proxy = Pleroma.Config.get([:http, :proxy_url]) + + config_opts = Pleroma.Config.get([:http, :adapter], []) + + @defaults + |> Keyword.merge(config_opts) + |> Keyword.merge(connection_opts) + |> add_scheme_opts(uri) + |> Pleroma.HTTP.AdapterHelper.maybe_add_proxy(proxy) + end + + defp add_scheme_opts(opts, _), do: opts + + def after_request(_), do: :ok +end diff --git a/lib/pleroma/http/connection.ex b/lib/pleroma/http/connection.ex index 80e6c30d6..ebacf7902 100644 --- a/lib/pleroma/http/connection.ex +++ b/lib/pleroma/http/connection.ex @@ -4,40 +4,121 @@ defmodule Pleroma.HTTP.Connection do @moduledoc """ - Connection for http-requests. + Configure Tesla.Client with default and customized adapter options. """ - @hackney_options [ - connect_timeout: 10_000, - recv_timeout: 20_000, - follow_redirect: true, - force_redirect: true, - pool: :federation - ] - @adapter Application.get_env(:tesla, :adapter) + alias Pleroma.Config + alias Pleroma.HTTP.AdapterHelper + + require Logger + + @defaults [pool: :federation] + + @type ip_address :: ipv4_address() | ipv6_address() + @type ipv4_address :: {0..255, 0..255, 0..255, 0..255} + @type ipv6_address :: + {0..65_535, 0..65_535, 0..65_535, 0..65_535, 0..65_535, 0..65_535, 0..65_535, 0..65_535} + @type proxy_type() :: :socks4 | :socks5 + @type host() :: charlist() | ip_address() @doc """ - Configure a client connection - - # Returns - - Tesla.Env.client + Merge default connection & adapter options with received ones. """ - @spec new(Keyword.t()) :: Tesla.Env.client() - def new(opts \\ []) do - Tesla.client([], {@adapter, hackney_options(opts)}) + + @spec options(URI.t(), keyword()) :: keyword() + def options(%URI{} = uri, opts \\ []) do + @defaults + |> pool_timeout() + |> Keyword.merge(opts) + |> adapter_helper().options(uri) end - # fetch Hackney options - # - def hackney_options(opts) do - options = Keyword.get(opts, :adapter, []) - adapter_options = Pleroma.Config.get([:http, :adapter], []) - proxy_url = Pleroma.Config.get([:http, :proxy_url], nil) + defp pool_timeout(opts) do + {config_key, default} = + if adapter() == Tesla.Adapter.Gun do + {:pools, Config.get([:pools, :default, :timeout])} + else + {:hackney_pools, 10_000} + end - @hackney_options - |> Keyword.merge(adapter_options) - |> Keyword.merge(options) - |> Keyword.merge(proxy: proxy_url) + timeout = Config.get([config_key, opts[:pool], :timeout], default) + + Keyword.merge(opts, timeout: timeout) + end + + @spec after_request(keyword()) :: :ok + def after_request(opts), do: adapter_helper().after_request(opts) + + defp adapter, do: Application.get_env(:tesla, :adapter) + + defp adapter_helper do + case adapter() do + Tesla.Adapter.Gun -> AdapterHelper.Gun + Tesla.Adapter.Hackney -> AdapterHelper.Hackney + _ -> AdapterHelper + end + end + + @spec parse_proxy(String.t() | tuple() | nil) :: + {:ok, host(), pos_integer()} + | {:ok, proxy_type(), host(), pos_integer()} + | {:error, atom()} + | nil + + def parse_proxy(nil), do: nil + + def parse_proxy(proxy) when is_binary(proxy) do + with [host, port] <- String.split(proxy, ":"), + {port, ""} <- Integer.parse(port) do + {:ok, parse_host(host), port} + else + {_, _} -> + Logger.warn("Parsing port failed #{inspect(proxy)}") + {:error, :invalid_proxy_port} + + :error -> + Logger.warn("Parsing port failed #{inspect(proxy)}") + {:error, :invalid_proxy_port} + + _ -> + Logger.warn("Parsing proxy failed #{inspect(proxy)}") + {:error, :invalid_proxy} + end + end + + def parse_proxy(proxy) when is_tuple(proxy) do + with {type, host, port} <- proxy do + {:ok, type, parse_host(host), port} + else + _ -> + Logger.warn("Parsing proxy failed #{inspect(proxy)}") + {:error, :invalid_proxy} + end + end + + @spec parse_host(String.t() | atom() | charlist()) :: charlist() | ip_address() + def parse_host(host) when is_list(host), do: host + def parse_host(host) when is_atom(host), do: to_charlist(host) + + def parse_host(host) when is_binary(host) do + host = to_charlist(host) + + case :inet.parse_address(host) do + {:error, :einval} -> host + {:ok, ip} -> ip + end + end + + @spec format_host(String.t()) :: charlist() + def format_host(host) do + host_charlist = to_charlist(host) + + case :inet.parse_address(host_charlist) do + {:error, :einval} -> + :idna.encode(host_charlist) + + {:ok, _ip} -> + host_charlist + end end end diff --git a/lib/pleroma/http/http.ex b/lib/pleroma/http/http.ex index ee5b5e127..583b56484 100644 --- a/lib/pleroma/http/http.ex +++ b/lib/pleroma/http/http.ex @@ -4,21 +4,47 @@ defmodule Pleroma.HTTP do @moduledoc """ - + Wrapper for `Tesla.request/2`. """ alias Pleroma.HTTP.Connection + alias Pleroma.HTTP.Request alias Pleroma.HTTP.RequestBuilder, as: Builder + alias Tesla.Client + alias Tesla.Env + + require Logger @type t :: __MODULE__ @doc """ - Builds and perform http request. + Performs GET request. + + See `Pleroma.HTTP.request/5` + """ + @spec get(Request.url() | nil, Request.headers(), keyword()) :: + nil | {:ok, Env.t()} | {:error, any()} + def get(url, headers \\ [], options \\ []) + def get(nil, _, _), do: nil + def get(url, headers, options), do: request(:get, url, "", headers, options) + + @doc """ + Performs POST request. + + See `Pleroma.HTTP.request/5` + """ + @spec post(Request.url(), String.t(), Request.headers(), keyword()) :: + {:ok, Env.t()} | {:error, any()} + def post(url, body, headers \\ [], options \\ []), + do: request(:post, url, body, headers, options) + + @doc """ + Builds and performs http request. # Arguments: `method` - :get, :post, :put, :delete - `url` - `body` + `url` - full url + `body` - request body `headers` - a keyworld list of headers, e.g. `[{"content-type", "text/plain"}]` `options` - custom, per-request middleware or adapter options @@ -26,61 +52,66 @@ defmodule Pleroma.HTTP do `{:ok, %Tesla.Env{}}` or `{:error, error}` """ - def request(method, url, body \\ "", headers \\ [], options \\ []) do - try do - options = - process_request_options(options) - |> process_sni_options(url) - - params = Keyword.get(options, :params, []) - - %{} - |> Builder.method(method) - |> Builder.headers(headers) - |> Builder.opts(options) - |> Builder.url(url) - |> Builder.add_param(:body, :body, body) - |> Builder.add_param(:query, :query, params) - |> Enum.into([]) - |> (&Tesla.request(Connection.new(options), &1)).() - rescue - e -> - {:error, e} - catch - :exit, e -> - {:error, e} - end - end - - defp process_sni_options(options, nil), do: options - - defp process_sni_options(options, url) do + @spec request(atom(), Request.url(), String.t(), Request.headers(), keyword()) :: + {:ok, Env.t()} | {:error, any()} + def request(method, url, body, headers, options) when is_binary(url) do uri = URI.parse(url) - host = uri.host |> to_charlist() + adapter_opts = Connection.options(uri, options[:adapter] || []) + options = put_in(options[:adapter], adapter_opts) + params = options[:params] || [] + request = build_request(method, headers, options, url, body, params) - case uri.scheme do - "https" -> options ++ [ssl: [server_name_indication: host]] - _ -> options - end + adapter = Application.get_env(:tesla, :adapter) + client = Tesla.client([Tesla.Middleware.FollowRedirects], adapter) + + pid = Process.whereis(adapter_opts[:pool]) + + pool_alive? = + if adapter == Tesla.Adapter.Gun && pid do + Process.alive?(pid) + else + false + end + + request_opts = + adapter_opts + |> Enum.into(%{}) + |> Map.put(:env, Pleroma.Config.get([:env])) + |> Map.put(:pool_alive?, pool_alive?) + + response = request(client, request, request_opts) + + Connection.after_request(adapter_opts) + + response end - def process_request_options(options) do - Keyword.merge(Pleroma.HTTP.Connection.hackney_options([]), options) + @spec request(Client.t(), keyword(), map()) :: {:ok, Env.t()} | {:error, any()} + def request(%Client{} = client, request, %{env: :test}), do: request(client, request) + + def request(%Client{} = client, request, %{body_as: :chunks}), do: request(client, request) + + def request(%Client{} = client, request, %{pool_alive?: false}), do: request(client, request) + + def request(%Client{} = client, request, %{pool: pool, timeout: timeout}) do + :poolboy.transaction( + pool, + &Pleroma.Pool.Request.execute(&1, client, request, timeout), + timeout + ) end - @doc """ - Performs GET request. + @spec request(Client.t(), keyword()) :: {:ok, Env.t()} | {:error, any()} + def request(client, request), do: Tesla.request(client, request) - See `Pleroma.HTTP.request/5` - """ - def get(url, headers \\ [], options \\ []), - do: request(:get, url, "", headers, options) - - @doc """ - Performs POST request. - - See `Pleroma.HTTP.request/5` - """ - def post(url, body, headers \\ [], options \\ []), - do: request(:post, url, body, headers, options) + defp build_request(method, headers, options, url, body, params) do + Builder.new() + |> Builder.method(method) + |> Builder.headers(headers) + |> Builder.opts(options) + |> Builder.url(url) + |> Builder.add_param(:body, :body, body) + |> Builder.add_param(:query, :query, params) + |> Builder.convert_to_keyword() + end end diff --git a/lib/pleroma/http/request.ex b/lib/pleroma/http/request.ex new file mode 100644 index 000000000..761bd6ccf --- /dev/null +++ b/lib/pleroma/http/request.ex @@ -0,0 +1,23 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.HTTP.Request do + @moduledoc """ + Request struct. + """ + defstruct method: :get, url: "", query: [], headers: [], body: "", opts: [] + + @type method :: :head | :get | :delete | :trace | :options | :post | :put | :patch + @type url :: String.t() + @type headers :: [{String.t(), String.t()}] + + @type t :: %__MODULE__{ + method: method(), + url: url(), + query: keyword(), + headers: headers(), + body: String.t(), + opts: keyword() + } +end diff --git a/lib/pleroma/http/request_builder.ex b/lib/pleroma/http/request_builder.ex index 77ef4bfd8..2fc876d92 100644 --- a/lib/pleroma/http/request_builder.ex +++ b/lib/pleroma/http/request_builder.ex @@ -7,136 +7,87 @@ defmodule Pleroma.HTTP.RequestBuilder do Helper functions for building Tesla requests """ + alias Pleroma.HTTP.Request + alias Tesla.Multipart + @doc """ - Specify the request method when building a request - - ## Parameters - - - request (Map) - Collected request options - - m (atom) - Request method - - ## Returns - - Map + Creates new request """ - @spec method(map(), atom) :: map() - def method(request, m) do - Map.put_new(request, :method, m) - end + @spec new(Request.t()) :: Request.t() + def new(%Request{} = request \\ %Request{}), do: request @doc """ Specify the request method when building a request - - ## Parameters - - - request (Map) - Collected request options - - u (String) - Request URL - - ## Returns - - Map """ - @spec url(map(), String.t()) :: map() - def url(request, u) do - Map.put_new(request, :url, u) - end + @spec method(Request.t(), Request.method()) :: Request.t() + def method(request, m), do: %{request | method: m} + + @doc """ + Specify the request method when building a request + """ + @spec url(Request.t(), Request.url()) :: Request.t() + def url(request, u), do: %{request | url: u} @doc """ Add headers to the request """ - @spec headers(map(), list(tuple)) :: map() - def headers(request, header_list) do - header_list = + @spec headers(Request.t(), Request.headers()) :: Request.t() + def headers(request, headers) do + headers_list = if Pleroma.Config.get([:http, :send_user_agent]) do - header_list ++ [{"User-Agent", Pleroma.Application.user_agent()}] + [{"user-agent", Pleroma.Application.user_agent()} | headers] else - header_list + headers end - Map.put_new(request, :headers, header_list) + %{request | headers: headers_list} end @doc """ Add custom, per-request middleware or adapter options to the request """ - @spec opts(map(), Keyword.t()) :: map() - def opts(request, options) do - Map.put_new(request, :opts, options) - end + @spec opts(Request.t(), keyword()) :: Request.t() + def opts(request, options), do: %{request | opts: options} @doc """ Add optional parameters to the request - - ## Parameters - - - request (Map) - Collected request options - - definitions (Map) - Map of parameter name to parameter location. - - options (KeywordList) - The provided optional parameters - - ## Returns - - Map """ - @spec add_optional_params(map(), %{optional(atom) => atom}, keyword()) :: map() - def add_optional_params(request, _, []), do: request + @spec add_param(Request.t(), atom(), atom(), any()) :: Request.t() + def add_param(request, :query, :query, values), do: %{request | query: values} - def add_optional_params(request, definitions, [{key, value} | tail]) do - case definitions do - %{^key => location} -> - request - |> add_param(location, key, value) - |> add_optional_params(definitions, tail) - - _ -> - add_optional_params(request, definitions, tail) - end - end - - @doc """ - Add optional parameters to the request - - ## Parameters - - - request (Map) - Collected request options - - location (atom) - Where to put the parameter - - key (atom) - The name of the parameter - - value (any) - The value of the parameter - - ## Returns - - Map - """ - @spec add_param(map(), atom, atom, any()) :: map() - def add_param(request, :query, :query, values), do: Map.put(request, :query, values) - - def add_param(request, :body, :body, value), do: Map.put(request, :body, value) + def add_param(request, :body, :body, value), do: %{request | body: value} def add_param(request, :body, key, value) do request - |> Map.put_new_lazy(:body, &Tesla.Multipart.new/0) + |> Map.put(:body, Multipart.new()) |> Map.update!( :body, - &Tesla.Multipart.add_field( + &Multipart.add_field( &1, key, Jason.encode!(value), - headers: [{:"Content-Type", "application/json"}] + headers: [{"content-type", "application/json"}] ) ) end def add_param(request, :file, name, path) do request - |> Map.put_new_lazy(:body, &Tesla.Multipart.new/0) - |> Map.update!(:body, &Tesla.Multipart.add_file(&1, path, name: name)) + |> Map.put(:body, Multipart.new()) + |> Map.update!(:body, &Multipart.add_file(&1, path, name: name)) end def add_param(request, :form, name, value) do - request - |> Map.update(:body, %{name => value}, &Map.put(&1, name, value)) + Map.update(request, :body, %{name => value}, &Map.put(&1, name, value)) end def add_param(request, location, key, value) do Map.update(request, location, [{key, value}], &(&1 ++ [{key, value}])) end + + def convert_to_keyword(request) do + request + |> Map.from_struct() + |> Enum.into([]) + end end diff --git a/lib/pleroma/maintenance.ex b/lib/pleroma/maintenance.ex new file mode 100644 index 000000000..326c17825 --- /dev/null +++ b/lib/pleroma/maintenance.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.Maintenance do + alias Pleroma.Repo + require Logger + + def vacuum(args) do + case args do + "analyze" -> + Logger.info("Runnning VACUUM ANALYZE.") + + Repo.query!( + "vacuum analyze;", + [], + timeout: :infinity + ) + + "full" -> + Logger.info("Runnning VACUUM FULL.") + + Logger.warn( + "Re-packing your entire database may take a while and will consume extra disk space during the process." + ) + + Repo.query!( + "vacuum full;", + [], + timeout: :infinity + ) + + _ -> + Logger.error("Error: invalid vacuum argument.") + end + end +end diff --git a/lib/pleroma/marker.ex b/lib/pleroma/marker.ex index 443927392..4d82860f5 100644 --- a/lib/pleroma/marker.ex +++ b/lib/pleroma/marker.ex @@ -9,24 +9,34 @@ defmodule Pleroma.Marker do import Ecto.Query alias Ecto.Multi + alias Pleroma.Notification alias Pleroma.Repo alias Pleroma.User + alias __MODULE__ @timelines ["notifications"] + @type t :: %__MODULE__{} schema "markers" do field(:last_read_id, :string, default: "") field(:timeline, :string, default: "") field(:lock_version, :integer, default: 0) + field(:unread_count, :integer, default: 0, virtual: true) belongs_to(:user, User, type: FlakeId.Ecto.CompatType) timestamps() end + @doc "Gets markers by user and timeline." + @spec get_markers(User.t(), list(String)) :: list(t()) def get_markers(user, timelines \\ []) do - Repo.all(get_query(user, timelines)) + user + |> get_query(timelines) + |> unread_count_query() + |> Repo.all() end + @spec upsert(User.t(), map()) :: {:ok | :error, any()} def upsert(%User{} = user, attrs) do attrs |> Map.take(@timelines) @@ -45,6 +55,27 @@ def upsert(%User{} = user, attrs) do |> Repo.transaction() end + @spec multi_set_last_read_id(Multi.t(), User.t(), String.t()) :: Multi.t() + def multi_set_last_read_id(multi, %User{} = user, "notifications") do + multi + |> Multi.run(:counters, fn _repo, _changes -> + {:ok, %{last_read_id: Repo.one(Notification.last_read_query(user))}} + end) + |> Multi.insert( + :marker, + fn %{counters: attrs} -> + %Marker{timeline: "notifications", user_id: user.id} + |> struct(attrs) + |> Ecto.Changeset.change() + end, + returning: true, + on_conflict: {:replace, [:last_read_id]}, + conflict_target: [:user_id, :timeline] + ) + end + + def multi_set_last_read_id(multi, _, _), do: multi + defp get_marker(user, timeline) do case Repo.find_resource(get_query(user, timeline)) do {:ok, marker} -> %__MODULE__{marker | user: user} @@ -71,4 +102,16 @@ defp get_query(user, timelines) do |> by_user_id(user.id) |> by_timeline(timelines) end + + defp unread_count_query(query) do + from( + q in query, + left_join: n in "notifications", + on: n.user_id == q.user_id and n.seen == false, + group_by: [:id], + select_merge: %{ + unread_count: fragment("count(?)", n.id) + } + ) + end end diff --git a/lib/pleroma/mfa.ex b/lib/pleroma/mfa.ex new file mode 100644 index 000000000..01b743f4f --- /dev/null +++ b/lib/pleroma/mfa.ex @@ -0,0 +1,155 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.MFA do + @moduledoc """ + The MFA context. + """ + + alias Pleroma.User + + alias Pleroma.MFA.BackupCodes + alias Pleroma.MFA.Changeset + alias Pleroma.MFA.Settings + alias Pleroma.MFA.TOTP + + @doc """ + Returns MFA methods the user has enabled. + + ## Examples + + iex> Pleroma.MFA.supported_method(User) + "totp, u2f" + """ + @spec supported_methods(User.t()) :: String.t() + def supported_methods(user) do + settings = fetch_settings(user) + + Settings.mfa_methods() + |> Enum.reduce([], fn m, acc -> + if method_enabled?(m, settings) do + acc ++ [m] + else + acc + end + end) + |> Enum.join(",") + end + + @doc "Checks that user enabled MFA" + def require?(user) do + fetch_settings(user).enabled + end + + @doc """ + Display MFA settings of user + """ + def mfa_settings(user) do + settings = fetch_settings(user) + + Settings.mfa_methods() + |> Enum.map(fn m -> [m, method_enabled?(m, settings)] end) + |> Enum.into(%{enabled: settings.enabled}, fn [a, b] -> {a, b} end) + end + + @doc false + def fetch_settings(%User{} = user) do + user.multi_factor_authentication_settings || %Settings{} + end + + @doc "clears backup codes" + def invalidate_backup_code(%User{} = user, hash_code) do + %{backup_codes: codes} = fetch_settings(user) + + user + |> Changeset.cast_backup_codes(codes -- [hash_code]) + |> User.update_and_set_cache() + end + + @doc "generates backup codes" + @spec generate_backup_codes(User.t()) :: {:ok, list(binary)} | {:error, String.t()} + def generate_backup_codes(%User{} = user) do + with codes <- BackupCodes.generate(), + hashed_codes <- Enum.map(codes, &Pbkdf2.hash_pwd_salt/1), + changeset <- Changeset.cast_backup_codes(user, hashed_codes), + {:ok, _} <- User.update_and_set_cache(changeset) do + {:ok, codes} + else + {:error, msg} -> + %{error: msg} + end + end + + @doc """ + Generates secret key and set delivery_type to 'app' for TOTP method. + """ + @spec setup_totp(User.t()) :: {:ok, User.t()} | {:error, Ecto.Changeset.t()} + def setup_totp(user) do + user + |> Changeset.setup_totp(%{secret: TOTP.generate_secret(), delivery_type: "app"}) + |> User.update_and_set_cache() + end + + @doc """ + Confirms the TOTP method for user. + + `attrs`: + `password` - current user password + `code` - TOTP token + """ + @spec confirm_totp(User.t(), map()) :: {:ok, User.t()} | {:error, Ecto.Changeset.t() | atom()} + def confirm_totp(%User{} = user, attrs) do + with settings <- user.multi_factor_authentication_settings.totp, + {:ok, :pass} <- TOTP.validate_token(settings.secret, attrs["code"]) do + user + |> Changeset.confirm_totp() + |> User.update_and_set_cache() + end + end + + @doc """ + Disables the TOTP method for user. + + `attrs`: + `password` - current user password + """ + @spec disable_totp(User.t()) :: {:ok, User.t()} | {:error, Ecto.Changeset.t()} + def disable_totp(%User{} = user) do + user + |> Changeset.disable_totp() + |> Changeset.disable() + |> User.update_and_set_cache() + end + + @doc """ + Force disables all MFA methods for user. + """ + @spec disable(User.t()) :: {:ok, User.t()} | {:error, Ecto.Changeset.t()} + def disable(%User{} = user) do + user + |> Changeset.disable_totp() + |> Changeset.disable(true) + |> User.update_and_set_cache() + end + + @doc """ + Checks if the user has MFA method enabled. + """ + def method_enabled?(method, settings) do + with {:ok, %{confirmed: true} = _} <- Map.fetch(settings, method) do + true + else + _ -> false + end + end + + @doc """ + Checks if the user has enabled at least one MFA method. + """ + def enabled?(settings) do + Settings.mfa_methods() + |> Enum.map(fn m -> method_enabled?(m, settings) end) + |> Enum.any?() + end +end diff --git a/lib/pleroma/mfa/backup_codes.ex b/lib/pleroma/mfa/backup_codes.ex new file mode 100644 index 000000000..9875310ff --- /dev/null +++ b/lib/pleroma/mfa/backup_codes.ex @@ -0,0 +1,31 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.MFA.BackupCodes do + @moduledoc """ + This module contains functions for generating backup codes. + """ + alias Pleroma.Config + + @config_ns [:instance, :multi_factor_authentication, :backup_codes] + + @doc """ + Generates backup codes. + """ + @spec generate(Keyword.t()) :: list(String.t()) + def generate(opts \\ []) do + number_of_codes = Keyword.get(opts, :number_of_codes, default_backup_codes_number()) + code_length = Keyword.get(opts, :length, default_backup_codes_code_length()) + + Enum.map(1..number_of_codes, fn _ -> + :crypto.strong_rand_bytes(div(code_length, 2)) + |> Base.encode16(case: :lower) + end) + end + + defp default_backup_codes_number, do: Config.get(@config_ns ++ [:number], 5) + + defp default_backup_codes_code_length, + do: Config.get(@config_ns ++ [:length], 16) +end diff --git a/lib/pleroma/mfa/changeset.ex b/lib/pleroma/mfa/changeset.ex new file mode 100644 index 000000000..77c4fa202 --- /dev/null +++ b/lib/pleroma/mfa/changeset.ex @@ -0,0 +1,64 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.MFA.Changeset do + alias Pleroma.MFA + alias Pleroma.MFA.Settings + alias Pleroma.User + + def disable(%Ecto.Changeset{} = changeset, force \\ false) do + settings = + changeset + |> Ecto.Changeset.apply_changes() + |> MFA.fetch_settings() + + if force || not MFA.enabled?(settings) do + put_change(changeset, %Settings{settings | enabled: false}) + else + changeset + end + end + + def disable_totp(%User{multi_factor_authentication_settings: settings} = user) do + user + |> put_change(%Settings{settings | totp: %Settings.TOTP{}}) + end + + def confirm_totp(%User{multi_factor_authentication_settings: settings} = user) do + totp_settings = %Settings.TOTP{settings.totp | confirmed: true} + + user + |> put_change(%Settings{settings | totp: totp_settings, enabled: true}) + end + + def setup_totp(%User{} = user, attrs) do + mfa_settings = MFA.fetch_settings(user) + + totp_settings = + %Settings.TOTP{} + |> Ecto.Changeset.cast(attrs, [:secret, :delivery_type]) + + user + |> put_change(%Settings{mfa_settings | totp: Ecto.Changeset.apply_changes(totp_settings)}) + end + + def cast_backup_codes(%User{} = user, codes) do + user + |> put_change(%Settings{ + user.multi_factor_authentication_settings + | backup_codes: codes + }) + end + + defp put_change(%User{} = user, settings) do + user + |> Ecto.Changeset.change() + |> put_change(settings) + end + + defp put_change(%Ecto.Changeset{} = changeset, settings) do + changeset + |> Ecto.Changeset.put_change(:multi_factor_authentication_settings, settings) + end +end diff --git a/lib/pleroma/mfa/settings.ex b/lib/pleroma/mfa/settings.ex new file mode 100644 index 000000000..de6e2228f --- /dev/null +++ b/lib/pleroma/mfa/settings.ex @@ -0,0 +1,24 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.MFA.Settings do + use Ecto.Schema + + @primary_key false + + @mfa_methods [:totp] + embedded_schema do + field(:enabled, :boolean, default: false) + field(:backup_codes, {:array, :string}, default: []) + + embeds_one :totp, TOTP, on_replace: :delete, primary_key: false do + field(:secret, :string) + # app | sms + field(:delivery_type, :string, default: "app") + field(:confirmed, :boolean, default: false) + end + end + + def mfa_methods, do: @mfa_methods +end diff --git a/lib/pleroma/mfa/token.ex b/lib/pleroma/mfa/token.ex new file mode 100644 index 000000000..0b2449971 --- /dev/null +++ b/lib/pleroma/mfa/token.ex @@ -0,0 +1,106 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.MFA.Token do + use Ecto.Schema + import Ecto.Query + import Ecto.Changeset + + alias Pleroma.Repo + alias Pleroma.User + alias Pleroma.Web.OAuth.Authorization + alias Pleroma.Web.OAuth.Token, as: OAuthToken + + @expires 300 + + schema "mfa_tokens" do + field(:token, :string) + field(:valid_until, :naive_datetime_usec) + + belongs_to(:user, User, type: FlakeId.Ecto.CompatType) + belongs_to(:authorization, Authorization) + + timestamps() + end + + def get_by_token(token) do + from( + t in __MODULE__, + where: t.token == ^token, + preload: [:user, :authorization] + ) + |> 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 + {: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() + end + + def create_token(user, authorization) do + %__MODULE__{} + |> change + |> assign_user(user) + |> assign_authorization(authorization) + |> put_token + |> put_valid_until + |> Repo.insert() + end + + defp assign_user(changeset, user) do + changeset + |> put_assoc(:user, user) + |> validate_required([:user]) + end + + defp assign_authorization(changeset, authorization) do + changeset + |> put_assoc(:authorization, authorization) + |> validate_required([:authorization]) + end + + defp put_token(changeset) do + changeset + |> change(%{token: OAuthToken.Utils.generate_token()}) + |> validate_required([:token]) + |> unique_constraint(:token) + end + + defp put_valid_until(changeset) do + expires_in = NaiveDateTime.add(NaiveDateTime.utc_now(), @expires) + + changeset + |> 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/mfa/totp.ex b/lib/pleroma/mfa/totp.ex new file mode 100644 index 000000000..d2ea2b3aa --- /dev/null +++ b/lib/pleroma/mfa/totp.ex @@ -0,0 +1,86 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.MFA.TOTP do + @moduledoc """ + This module represents functions to create secrets for + TOTP Application as well as validate them with a time based token. + """ + alias Pleroma.Config + + @config_ns [:instance, :multi_factor_authentication, :totp] + + @doc """ + https://github.com/google/google-authenticator/wiki/Key-Uri-Format + """ + def provisioning_uri(secret, label, opts \\ []) do + query = + %{ + secret: secret, + issuer: Keyword.get(opts, :issuer, default_issuer()), + digits: Keyword.get(opts, :digits, default_digits()), + period: Keyword.get(opts, :period, default_period()) + } + |> Enum.filter(fn {_, v} -> not is_nil(v) end) + |> Enum.into(%{}) + |> URI.encode_query() + + %URI{scheme: "otpauth", host: "totp", path: "/" <> label, query: query} + |> URI.to_string() + end + + defp default_period, do: Config.get(@config_ns ++ [:period]) + defp default_digits, do: Config.get(@config_ns ++ [:digits]) + + defp default_issuer, + do: Config.get(@config_ns ++ [:issuer], Config.get([:instance, :name])) + + @doc "Creates a random Base 32 encoded string" + def generate_secret do + Base.encode32(:crypto.strong_rand_bytes(10)) + end + + @doc "Generates a valid token based on a secret" + def generate_token(secret) do + :pot.totp(secret) + end + + @doc """ + Validates a given token based on a secret. + + optional parameters: + `token_length` default `6` + `interval_length` default `30` + `window` default 0 + + Returns {:ok, :pass} if the token is valid and + {:error, :invalid_token} if it is not. + """ + @spec validate_token(String.t(), String.t()) :: + {:ok, :pass} | {:error, :invalid_token | :invalid_secret_and_token} + def validate_token(secret, token) + when is_binary(secret) and is_binary(token) do + opts = [ + token_length: default_digits(), + interval_length: default_period() + ] + + validate_token(secret, token, opts) + end + + def validate_token(_, _), do: {:error, :invalid_secret_and_token} + + @doc "See `validate_token/2`" + @spec validate_token(String.t(), String.t(), Keyword.t()) :: + {:ok, :pass} | {:error, :invalid_token | :invalid_secret_and_token} + def validate_token(secret, token, options) + when is_binary(secret) and is_binary(token) do + case :pot.valid_totp(token, secret, options) do + true -> {:ok, :pass} + false -> {:error, :invalid_token} + end + end + + def validate_token(_, _, _), do: {:error, :invalid_secret_and_token} +end diff --git a/lib/pleroma/moderation_log.ex b/lib/pleroma/moderation_log.ex index e32895f70..7aacd9d80 100644 --- a/lib/pleroma/moderation_log.ex +++ b/lib/pleroma/moderation_log.ex @@ -605,6 +605,17 @@ def get_log_entry_message(%ModerationLog{ }" end + @spec get_log_entry_message(ModerationLog) :: String.t() + def get_log_entry_message(%ModerationLog{ + data: %{ + "actor" => %{"nickname" => actor_nickname}, + "action" => "updated_users", + "subject" => subjects + } + }) do + "@#{actor_nickname} updated users: #{users_to_nicknames_string(subjects)}" + end + defp nicknames_to_string(nicknames) do nicknames |> Enum.map(&"@#{&1}") diff --git a/lib/pleroma/notification.ex b/lib/pleroma/notification.ex index 3ef3b3f58..7eca55ac9 100644 --- a/lib/pleroma/notification.ex +++ b/lib/pleroma/notification.ex @@ -5,11 +5,15 @@ defmodule Pleroma.Notification do use Ecto.Schema + alias Ecto.Multi alias Pleroma.Activity + alias Pleroma.FollowingRelationship + alias Pleroma.Marker alias Pleroma.Notification alias Pleroma.Object alias Pleroma.Pagination alias Pleroma.Repo + alias Pleroma.ThreadMute alias Pleroma.User alias Pleroma.Web.CommonAPI.Utils alias Pleroma.Web.Push @@ -17,6 +21,7 @@ defmodule Pleroma.Notification do import Ecto.Query import Ecto.Changeset + require Logger @type t :: %__MODULE__{} @@ -31,17 +36,36 @@ defmodule Pleroma.Notification do timestamps() end + @spec unread_notifications_count(User.t()) :: integer() + def unread_notifications_count(%User{id: user_id}) do + from(q in __MODULE__, + where: q.user_id == ^user_id and q.seen == false + ) + |> Repo.aggregate(:count, :id) + end + def changeset(%Notification{} = notification, attrs) do notification |> cast(attrs, [:seen]) end + @spec last_read_query(User.t()) :: Ecto.Queryable.t() + def last_read_query(user) do + from(q in Pleroma.Notification, + where: q.user_id == ^user.id, + where: q.seen == true, + select: type(q.id, :string), + limit: 1, + order_by: [desc: :id] + ) + end + defp for_user_query_ap_id_opts(user, opts) do - ap_id_relations = + ap_id_relationships = [:block] ++ if opts[@include_muted_option], do: [], else: [:notification_mute] - preloaded_ap_ids = User.outgoing_relations_ap_ids(user, ap_id_relations) + preloaded_ap_ids = User.outgoing_relationships_ap_ids(user, ap_id_relationships) exclude_blocked_opts = Map.merge(%{blocked_users_ap_ids: preloaded_ap_ids[:block]}, opts) @@ -68,8 +92,9 @@ def for_user_query(user, opts \\ %{}) do |> join(:left, [n, a], object in Object, on: fragment( - "(?->>'id') = COALESCE((? -> 'object'::text) ->> 'id'::text)", + "(?->>'id') = COALESCE(?->'object'->>'id', ?->>'object')", object.data, + a.data, a.data ) ) @@ -79,15 +104,13 @@ def for_user_query(user, opts \\ %{}) do |> exclude_visibility(opts) end + # Excludes blocked users and non-followed domain-blocked users defp exclude_blocked(query, user, opts) do blocked_ap_ids = opts[:blocked_users_ap_ids] || User.blocked_users_ap_ids(user) query |> where([n, a], a.actor not in ^blocked_ap_ids) - |> where( - [n, a], - fragment("substring(? from '.*://([^/]*)')", a.actor) not in ^user.domain_blocks - ) + |> FollowingRelationship.keep_following_or_not_domain_blocked(user) end defp exclude_notification_muted(query, _, %{@include_muted_option => true}) do @@ -100,7 +123,7 @@ defp exclude_notification_muted(query, user, opts) do query |> where([n, a], a.actor not in ^notification_muted_ap_ids) - |> join(:left, [n, a], tm in Pleroma.ThreadMute, + |> join(:left, [n, a], tm in ThreadMute, on: tm.user_id == ^user.id and tm.context == fragment("?->>'context'", a.data) ) |> where([n, a, o, tm], is_nil(tm.user_id)) @@ -184,46 +207,41 @@ def for_user_since(user, date) do |> Repo.all() end - def set_read_up_to(%{id: user_id} = _user, id) do + def set_read_up_to(%{id: user_id} = user, id) do query = from( n in Notification, where: n.user_id == ^user_id, where: n.id <= ^id, where: n.seen == false, - update: [ - set: [ - seen: true, - updated_at: ^NaiveDateTime.utc_now() - ] - ], # Ideally we would preload object and activities here # but Ecto does not support preloads in update_all select: n.id ) - {_, notification_ids} = Repo.update_all(query, []) + {:ok, %{ids: {_, notification_ids}}} = + Multi.new() + |> Multi.update_all(:ids, query, set: [seen: true, updated_at: NaiveDateTime.utc_now()]) + |> Marker.multi_set_last_read_id(user, "notifications") + |> Repo.transaction() - Notification + for_user_query(user) |> where([n], n.id in ^notification_ids) - |> join(:inner, [n], activity in assoc(n, :activity)) - |> join(:left, [n, a], object in Object, - on: - fragment( - "(?->>'id') = COALESCE((? -> 'object'::text) ->> 'id'::text)", - object.data, - a.data - ) - ) - |> preload([n, a, o], activity: {a, object: o}) |> Repo.all() end + @spec read_one(User.t(), String.t()) :: + {:ok, Notification.t()} | {:error, Ecto.Changeset.t()} | nil def read_one(%User{} = user, notification_id) do with {:ok, %Notification{} = notification} <- get(user, notification_id) do - notification - |> changeset(%{seen: true}) - |> Repo.update() + Multi.new() + |> Multi.update(:update, changeset(notification, %{seen: true})) + |> Marker.multi_set_last_read_id(user, "notifications") + |> Repo.transaction() + |> case do + {:ok, %{update: notification}} -> {:ok, notification} + {:error, :update, changeset, _} -> {:error, changeset} + end end end @@ -260,6 +278,16 @@ def destroy_multiple(%{id: user_id} = _user, ids) do |> Repo.delete_all() end + def dismiss(%Pleroma.Activity{} = activity) do + Notification + |> where([n], n.activity_id == ^activity.id) + |> Repo.delete_all() + |> case do + {_, notifications} -> {:ok, notifications} + _ -> {:error, "Cannot dismiss notification"} + end + end + def dismiss(%{id: user_id} = _user, id) do notification = Repo.get(Notification, id) @@ -275,58 +303,160 @@ def dismiss(%{id: user_id} = _user, id) do def create_notifications(%Activity{data: %{"to" => _, "type" => "Create"}} = activity) do object = Object.normalize(activity) - unless object && object.data["type"] == "Answer" do - users = get_notified_from_activity(activity) - notifications = Enum.map(users, fn user -> create_notification(activity, user) end) - {:ok, notifications} - else + if object && object.data["type"] == "Answer" do {:ok, []} + else + do_create_notifications(activity) end end def create_notifications(%Activity{data: %{"type" => type}} = activity) - when type in ["Like", "Announce", "Follow", "Move", "EmojiReact"] do - notifications = - activity - |> get_notified_from_activity() - |> Enum.map(&create_notification(activity, &1)) - - {:ok, notifications} + when type in ["Follow", "Like", "Announce", "Move", "EmojiReact"] do + do_create_notifications(activity) end def create_notifications(_), do: {:ok, []} + defp do_create_notifications(%Activity{} = activity) do + {enabled_receivers, disabled_receivers} = get_notified_from_activity(activity) + potential_receivers = enabled_receivers ++ disabled_receivers + + notifications = + Enum.map(potential_receivers, fn user -> + do_send = user in enabled_receivers + create_notification(activity, user, do_send) + end) + + {:ok, notifications} + end + # TODO move to sql, too. - def create_notification(%Activity{} = activity, %User{} = user) do + def create_notification(%Activity{} = activity, %User{} = user, do_send \\ true) do unless skip?(activity, user) do - notification = %Notification{user_id: user.id, activity: activity} - {:ok, notification} = Repo.insert(notification) + {:ok, %{notification: notification}} = + Multi.new() + |> Multi.insert(:notification, %Notification{user_id: user.id, activity: activity}) + |> Marker.multi_set_last_read_id(user, "notifications") + |> Repo.transaction() - ["user", "user:notification"] - |> Streamer.stream(notification) + if do_send do + Streamer.stream(["user", "user:notification"], notification) + Push.send(notification) + end - Push.send(notification) notification end end + @doc """ + Returns a tuple with 2 elements: + {notification-enabled receivers, currently disabled receivers (blocking / [thread] muting)} + + NOTE: might be called for FAKE Activities, see ActivityPub.Utils.get_notified_from_object/1 + """ + @spec get_notified_from_activity(Activity.t(), boolean()) :: {list(User.t()), list(User.t())} def get_notified_from_activity(activity, local_only \\ true) def get_notified_from_activity(%Activity{data: %{"type" => type}} = activity, local_only) when type in ["Create", "Like", "Announce", "Follow", "Move", "EmojiReact"] do + potential_receiver_ap_ids = get_potential_receiver_ap_ids(activity) + + potential_receivers = + User.get_users_from_set(potential_receiver_ap_ids, local_only: local_only) + + notification_enabled_ap_ids = + potential_receiver_ap_ids + |> exclude_domain_blocker_ap_ids(activity, potential_receivers) + |> exclude_relationship_restricted_ap_ids(activity) + |> exclude_thread_muter_ap_ids(activity) + + notification_enabled_users = + Enum.filter(potential_receivers, fn u -> u.ap_id in notification_enabled_ap_ids end) + + {notification_enabled_users, potential_receivers -- notification_enabled_users} + end + + def get_notified_from_activity(_, _local_only), do: {[], []} + + # For some activities, only notify the author of the object + def get_potential_receiver_ap_ids(%{data: %{"type" => type, "object" => object_id}}) + when type in ~w{Like Announce EmojiReact} do + case Object.get_cached_by_ap_id(object_id) do + %Object{data: %{"actor" => actor}} -> + [actor] + + _ -> + [] + end + end + + def get_potential_receiver_ap_ids(activity) do [] |> Utils.maybe_notify_to_recipients(activity) |> Utils.maybe_notify_mentioned_recipients(activity) |> Utils.maybe_notify_subscribers(activity) |> Utils.maybe_notify_followers(activity) |> Enum.uniq() - |> User.get_users_from_set(local_only) end - def get_notified_from_activity(_, _local_only), do: [] + @doc "Filters out AP IDs domain-blocking and not following the activity's actor" + def exclude_domain_blocker_ap_ids(ap_ids, activity, preloaded_users \\ []) + + def exclude_domain_blocker_ap_ids([], _activity, _preloaded_users), do: [] + + def exclude_domain_blocker_ap_ids(ap_ids, %Activity{} = activity, preloaded_users) do + activity_actor_domain = activity.actor && URI.parse(activity.actor).host + + users = + ap_ids + |> Enum.map(fn ap_id -> + Enum.find(preloaded_users, &(&1.ap_id == ap_id)) || + User.get_cached_by_ap_id(ap_id) + end) + |> Enum.filter(& &1) + + domain_blocker_ap_ids = for u <- users, activity_actor_domain in u.domain_blocks, do: u.ap_id + + domain_blocker_follower_ap_ids = + if Enum.any?(domain_blocker_ap_ids) do + activity + |> Activity.user_actor() + |> FollowingRelationship.followers_ap_ids(domain_blocker_ap_ids) + else + [] + end + + ap_ids + |> Kernel.--(domain_blocker_ap_ids) + |> Kernel.++(domain_blocker_follower_ap_ids) + end + + @doc "Filters out AP IDs of users basing on their relationships with activity actor user" + def exclude_relationship_restricted_ap_ids([], _activity), do: [] + + def exclude_relationship_restricted_ap_ids(ap_ids, %Activity{} = activity) do + relationship_restricted_ap_ids = + activity + |> Activity.user_actor() + |> User.incoming_relationships_ungrouped_ap_ids([ + :block, + :notification_mute + ]) + + Enum.uniq(ap_ids) -- relationship_restricted_ap_ids + end + + @doc "Filters out AP IDs of users who mute activity thread" + def exclude_thread_muter_ap_ids([], _activity), do: [] + + def exclude_thread_muter_ap_ids(ap_ids, %Activity{} = activity) do + thread_muter_ap_ids = ThreadMute.muter_ap_ids(activity.data["context"]) + + Enum.uniq(ap_ids) -- thread_muter_ap_ids + end @spec skip?(Activity.t(), User.t()) :: boolean() - def skip?(activity, user) do + def skip?(%Activity{} = activity, %User{} = user) do [ :self, :followers, @@ -335,18 +465,20 @@ def skip?(activity, user) do :non_follows, :recently_followed ] - |> Enum.any?(&skip?(&1, activity, user)) + |> Enum.find(&skip?(&1, activity, user)) end + def skip?(_, _), do: false + @spec skip?(atom(), Activity.t(), User.t()) :: boolean() - def skip?(:self, activity, user) do + def skip?(:self, %Activity{} = activity, %User{} = user) do activity.data["actor"] == user.ap_id end def skip?( :followers, - activity, - %{notification_settings: %{followers: false}} = user + %Activity{} = activity, + %User{notification_settings: %{followers: false}} = user ) do actor = activity.data["actor"] follower = User.get_cached_by_ap_id(actor) @@ -355,15 +487,19 @@ def skip?( def skip?( :non_followers, - activity, - %{notification_settings: %{non_followers: false}} = user + %Activity{} = activity, + %User{notification_settings: %{non_followers: false}} = user ) do actor = activity.data["actor"] follower = User.get_cached_by_ap_id(actor) !User.following?(follower, user) end - def skip?(:follows, activity, %{notification_settings: %{follows: false}} = user) do + def skip?( + :follows, + %Activity{} = activity, + %User{notification_settings: %{follows: false}} = user + ) do actor = activity.data["actor"] followed = User.get_cached_by_ap_id(actor) User.following?(user, followed) @@ -371,15 +507,16 @@ def skip?(:follows, activity, %{notification_settings: %{follows: false}} = user def skip?( :non_follows, - activity, - %{notification_settings: %{non_follows: false}} = user + %Activity{} = activity, + %User{notification_settings: %{non_follows: false}} = user ) do actor = activity.data["actor"] followed = User.get_cached_by_ap_id(actor) !User.following?(user, followed) end - def skip?(:recently_followed, %{data: %{"type" => "Follow"}} = activity, user) do + # To do: consider defining recency in hours and checking FollowingRelationship with a single SQL + def skip?(:recently_followed, %Activity{data: %{"type" => "Follow"}} = activity, %User{} = user) do actor = activity.data["actor"] Notification.for_user(user) diff --git a/lib/pleroma/object.ex b/lib/pleroma/object.ex index 9574432f0..546c4ea01 100644 --- a/lib/pleroma/object.ex +++ b/lib/pleroma/object.ex @@ -9,11 +9,13 @@ defmodule Pleroma.Object do import Ecto.Changeset alias Pleroma.Activity + alias Pleroma.Config alias Pleroma.Object alias Pleroma.Object.Fetcher alias Pleroma.ObjectTombstone alias Pleroma.Repo alias Pleroma.User + alias Pleroma.Workers.AttachmentsCleanupWorker require Logger @@ -138,12 +140,17 @@ def normalize(ap_id, true, options) when is_binary(ap_id) do def normalize(_, _, _), do: nil - # Owned objects can only be mutated by their owner - def authorize_mutation(%Object{data: %{"actor" => actor}}, %User{ap_id: ap_id}), - do: actor == ap_id + # Owned objects can only be accessed by their owner + def authorize_access(%Object{data: %{"actor" => actor}}, %User{ap_id: ap_id}) do + if actor == ap_id do + :ok + else + {:error, :forbidden} + end + end - # Legacy objects can be mutated by anybody - def authorize_mutation(%Object{}, %User{}), do: true + # Legacy objects can be accessed by anybody + def authorize_access(%Object{}, %User{}), do: :ok @spec get_cached_by_ap_id(String.t()) :: Object.t() | nil def get_cached_by_ap_id(ap_id) do @@ -183,27 +190,37 @@ def swap_object_with_tombstone(object) do def delete(%Object{data: %{"id" => id}} = object) do with {:ok, _obj} = swap_object_with_tombstone(object), deleted_activity = Activity.delete_all_by_object_ap_id(id), - {:ok, true} <- Cachex.del(:object_cache, "object:#{id}"), - {:ok, _} <- Cachex.del(:web_resp_cache, URI.parse(id).path) do - with true <- Pleroma.Config.get([:instance, :cleanup_attachments]) do - {:ok, _} = - Pleroma.Workers.AttachmentsCleanupWorker.enqueue("cleanup_attachments", %{ - "object" => object - }) - end + {:ok, _} <- invalid_object_cache(object) do + cleanup_attachments( + Config.get([:instance, :cleanup_attachments]), + %{"object" => object} + ) {:ok, object, deleted_activity} end end - def prune(%Object{data: %{"id" => id}} = object) do + @spec cleanup_attachments(boolean(), %{required(:object) => map()}) :: + {:ok, Oban.Job.t() | nil} + def cleanup_attachments(true, %{"object" => _} = params) do + AttachmentsCleanupWorker.enqueue("cleanup_attachments", params) + end + + def cleanup_attachments(_, _), do: {:ok, nil} + + def prune(%Object{data: %{"id" => _id}} = object) do with {:ok, object} <- Repo.delete(object), - {:ok, true} <- Cachex.del(:object_cache, "object:#{id}"), - {:ok, _} <- Cachex.del(:web_resp_cache, URI.parse(id).path) do + {:ok, _} <- invalid_object_cache(object) do {:ok, object} end end + def invalid_object_cache(%Object{data: %{"id" => id}}) do + with {:ok, true} <- Cachex.del(:object_cache, "object:#{id}") do + Cachex.del(:web_resp_cache, URI.parse(id).path) + end + end + def set_cache(%Object{data: %{"id" => ap_id}} = object) do Cachex.put(:object_cache, "object:#{ap_id}", object) {:ok, object} @@ -261,7 +278,7 @@ def decrease_replies_count(ap_id) do end end - def increase_vote_count(ap_id, name) do + def increase_vote_count(ap_id, name, actor) do with %Object{} = object <- Object.normalize(ap_id), "Question" <- object.data["type"] do multiple = Map.has_key?(object.data, "anyOf") @@ -276,12 +293,15 @@ def increase_vote_count(ap_id, name) do option end) + voters = [actor | object.data["voters"] || []] |> Enum.uniq() + data = if multiple do Map.put(object.data, "anyOf", options) else Map.put(object.data, "oneOf", options) end + |> Map.put("voters", voters) object |> Object.change(%{data: data}) diff --git a/lib/pleroma/object/containment.ex b/lib/pleroma/object/containment.ex index 9ae6a5600..99608b8a5 100644 --- a/lib/pleroma/object/containment.ex +++ b/lib/pleroma/object/containment.ex @@ -32,6 +32,18 @@ def get_actor(%{"actor" => nil, "attributedTo" => actor}) when not is_nil(actor) get_actor(%{"actor" => actor}) end + def get_object(%{"object" => id}) when is_binary(id) do + id + end + + def get_object(%{"object" => %{"id" => id}}) when is_binary(id) do + id + end + + def get_object(_) 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. diff --git a/lib/pleroma/object/fetcher.ex b/lib/pleroma/object/fetcher.ex index eaa13d1e7..263ded5dd 100644 --- a/lib/pleroma/object/fetcher.ex +++ b/lib/pleroma/object/fetcher.ex @@ -141,7 +141,7 @@ defp make_signature(id, date) do date: date }) - [{:Signature, signature}] + [{"signature", signature}] end defp sign_fetch(headers, id, date) do @@ -154,7 +154,7 @@ defp sign_fetch(headers, id, date) do defp maybe_date_fetch(headers, date) do if Pleroma.Config.get([:activitypub, :sign_object_fetches]) do - headers ++ [{:Date, date}] + headers ++ [{"date", date}] else headers end @@ -166,7 +166,7 @@ def fetch_and_contain_remote_object_from_id(id) when is_binary(id) do date = Pleroma.Signature.signed_date() headers = - [{:Accept, "application/activity+json"}] + [{"accept", "application/activity+json"}] |> maybe_date_fetch(date) |> sign_fetch(id, date) diff --git a/lib/pleroma/otp_version.ex b/lib/pleroma/otp_version.ex new file mode 100644 index 000000000..114d0054f --- /dev/null +++ b/lib/pleroma/otp_version.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.OTPVersion do + @spec version() :: String.t() | nil + def version do + # OTP Version https://erlang.org/doc/system_principles/versions.html#otp-version + [ + Path.join(:code.root_dir(), "OTP_VERSION"), + Path.join([:code.root_dir(), "releases", :erlang.system_info(:otp_release), "OTP_VERSION"]) + ] + |> get_version_from_files() + end + + @spec get_version_from_files([Path.t()]) :: String.t() | nil + def get_version_from_files([]), do: nil + + def get_version_from_files([path | paths]) do + if File.exists?(path) do + path + |> File.read!() + |> String.replace(~r/\r|\n|\s/, "") + else + get_version_from_files(paths) + end + end +end diff --git a/lib/pleroma/plugs/authentication_plug.ex b/lib/pleroma/plugs/authentication_plug.ex index 089028d77..057ea42f1 100644 --- a/lib/pleroma/plugs/authentication_plug.ex +++ b/lib/pleroma/plugs/authentication_plug.ex @@ -3,9 +3,11 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Plugs.AuthenticationPlug do - alias Comeonin.Pbkdf2 - import Plug.Conn + alias Pleroma.Plugs.OAuthScopesPlug alias Pleroma.User + + import Plug.Conn + require Logger def init(options), do: options @@ -14,8 +16,13 @@ def checkpw(password, "$6" <> _ = password_hash) do :crypt.crypt(password, password_hash) == password_hash end + def checkpw(password, "$2" <> _ = password_hash) do + # Handle bcrypt passwords for Mastodon migration + Bcrypt.verify_pass(password, password_hash) + end + def checkpw(password, "$pbkdf2" <> _ = password_hash) do - Pbkdf2.checkpw(password, password_hash) + Pbkdf2.verify_pass(password, password_hash) end def checkpw(_password, _password_hash) do @@ -23,6 +30,25 @@ def checkpw(_password, _password_hash) do false end + def maybe_update_password(%User{password_hash: "$2" <> _} = user, password) do + do_update_password(user, password) + end + + def maybe_update_password(%User{password_hash: "$6" <> _} = user, password) do + do_update_password(user, password) + end + + def maybe_update_password(user, _), do: {:ok, user} + + defp do_update_password(user, password) do + user + |> User.password_update_changeset(%{ + "password" => password, + "password_confirmation" => password + }) + |> Pleroma.Repo.update() + end + def call(%{assigns: %{user: %User{}}} = conn, _), do: conn def call( @@ -34,16 +60,19 @@ def call( } = conn, _ ) do - if Pbkdf2.checkpw(password, password_hash) do + if checkpw(password, password_hash) do + {:ok, auth_user} = maybe_update_password(auth_user, password) + conn |> assign(:user, auth_user) + |> OAuthScopesPlug.skip_plug() else conn end end def call(%{assigns: %{auth_credentials: %{password: _}}} = conn, _) do - Pbkdf2.dummy_checkpw() + Pbkdf2.no_user_verify() conn end diff --git a/lib/pleroma/plugs/ensure_authenticated_plug.ex b/lib/pleroma/plugs/ensure_authenticated_plug.ex index 054d2297f..3fe550806 100644 --- a/lib/pleroma/plugs/ensure_authenticated_plug.ex +++ b/lib/pleroma/plugs/ensure_authenticated_plug.ex @@ -5,32 +5,35 @@ defmodule Pleroma.Plugs.EnsureAuthenticatedPlug do import Plug.Conn import Pleroma.Web.TranslationHelpers + alias Pleroma.User + use Pleroma.Web, :plug + def init(options) do options end - def call(%{assigns: %{user: %User{}}} = conn, _) do + @impl true + def perform( + %{ + assigns: %{ + auth_credentials: %{password: _}, + user: %User{multi_factor_authentication_settings: %{enabled: true}} + } + } = conn, + _ + ) do + conn + |> render_error(:forbidden, "Two-factor authentication enabled, you must use a access token.") + |> halt() + end + + def perform(%{assigns: %{user: %User{}}} = conn, _) do conn end - def call(conn, options) do - perform = - cond do - options[:if_func] -> options[:if_func].() - options[:unless_func] -> !options[:unless_func].() - true -> true - end - - if perform do - fail(conn) - else - conn - end - end - - def fail(conn) do + def perform(conn, _) do conn |> render_error(:forbidden, "Invalid credentials.") |> halt() diff --git a/lib/pleroma/plugs/ensure_public_or_authenticated_plug.ex b/lib/pleroma/plugs/ensure_public_or_authenticated_plug.ex index d980ff13d..7265bb87a 100644 --- a/lib/pleroma/plugs/ensure_public_or_authenticated_plug.ex +++ b/lib/pleroma/plugs/ensure_public_or_authenticated_plug.ex @@ -5,14 +5,18 @@ defmodule Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug do import Pleroma.Web.TranslationHelpers import Plug.Conn + alias Pleroma.Config alias Pleroma.User + use Pleroma.Web, :plug + def init(options) do options end - def call(conn, _) do + @impl true + def perform(conn, _) do public? = Config.get!([:instance, :public]) case {public?, conn} do diff --git a/lib/pleroma/plugs/expect_authenticated_check_plug.ex b/lib/pleroma/plugs/expect_authenticated_check_plug.ex new file mode 100644 index 000000000..66b8d5de5 --- /dev/null +++ b/lib/pleroma/plugs/expect_authenticated_check_plug.ex @@ -0,0 +1,20 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Plugs.ExpectAuthenticatedCheckPlug do + @moduledoc """ + Marks `Pleroma.Plugs.EnsureAuthenticatedPlug` as expected to be executed later in plug chain. + + No-op plug which affects `Pleroma.Web` operation (is checked with `PlugHelper.plug_called?/2`). + """ + + use Pleroma.Web, :plug + + def init(options), do: options + + @impl true + def perform(conn, _) do + conn + end +end diff --git a/lib/pleroma/plugs/expect_public_or_authenticated_check_plug.ex b/lib/pleroma/plugs/expect_public_or_authenticated_check_plug.ex new file mode 100644 index 000000000..ba0ef76bd --- /dev/null +++ b/lib/pleroma/plugs/expect_public_or_authenticated_check_plug.ex @@ -0,0 +1,21 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Plugs.ExpectPublicOrAuthenticatedCheckPlug do + @moduledoc """ + Marks `Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug` as expected to be executed later in plug + chain. + + No-op plug which affects `Pleroma.Web` operation (is checked with `PlugHelper.plug_called?/2`). + """ + + use Pleroma.Web, :plug + + def init(options), do: options + + @impl true + def perform(conn, _) do + conn + end +end diff --git a/lib/pleroma/plugs/federating_plug.ex b/lib/pleroma/plugs/federating_plug.ex index 7d947339f..09038f3c6 100644 --- a/lib/pleroma/plugs/federating_plug.ex +++ b/lib/pleroma/plugs/federating_plug.ex @@ -19,6 +19,9 @@ def call(conn, _opts) do def federating?, do: Pleroma.Config.get([:instance, :federating]) + # Definition for the use in :if_func / :unless_func plug options + def federating?(_conn), do: federating?() + defp fail(conn) do conn |> put_status(404) diff --git a/lib/pleroma/plugs/http_security_plug.ex b/lib/pleroma/plugs/http_security_plug.ex index 81e6b4f2a..6a339b32c 100644 --- a/lib/pleroma/plugs/http_security_plug.ex +++ b/lib/pleroma/plugs/http_security_plug.ex @@ -31,7 +31,7 @@ defp headers do {"x-content-type-options", "nosniff"}, {"referrer-policy", referrer_policy}, {"x-download-options", "noopen"}, - {"content-security-policy", csp_string() <> ";"} + {"content-security-policy", csp_string()} ] if report_uri do @@ -43,23 +43,46 @@ defp headers do ] } - headers ++ [{"reply-to", Jason.encode!(report_group)}] + [{"reply-to", Jason.encode!(report_group)} | headers] else headers end end + static_csp_rules = [ + "default-src 'none'", + "base-uri 'self'", + "frame-ancestors 'none'", + "style-src 'self' 'unsafe-inline'", + "font-src 'self'", + "manifest-src 'self'" + ] + + @csp_start [Enum.join(static_csp_rules, ";") <> ";"] + defp csp_string do scheme = Config.get([Pleroma.Web.Endpoint, :url])[:scheme] static_url = Pleroma.Web.Endpoint.static_url() websocket_url = Pleroma.Web.Endpoint.websocket_url() report_uri = Config.get([:http_security, :report_uri]) - connect_src = "connect-src 'self' #{static_url} #{websocket_url}" + img_src = "img-src 'self' data: blob:" + media_src = "media-src 'self'" + + {img_src, media_src} = + if Config.get([:media_proxy, :enabled]) && + !Config.get([:media_proxy, :proxy_opts, :redirect_on_failure]) do + sources = get_proxy_and_attachment_sources() + {[img_src, sources], [media_src, sources]} + else + {[img_src, " https:"], [media_src, " https:"]} + end + + connect_src = ["connect-src 'self' blob: ", static_url, ?\s, websocket_url] connect_src = if Pleroma.Config.get(:env) == :dev do - connect_src <> " http://localhost:3035/" + [connect_src, " http://localhost:3035/"] else connect_src end @@ -71,27 +94,46 @@ defp csp_string do "script-src 'self'" end - main_part = [ - "default-src 'none'", - "base-uri 'self'", - "frame-ancestors 'none'", - "img-src 'self' data: https:", - "media-src 'self' https:", - "style-src 'self' 'unsafe-inline'", - "font-src 'self'", - "manifest-src 'self'", - connect_src, - script_src - ] + report = if report_uri, do: ["report-uri ", report_uri, ";report-to csp-endpoint"] + insecure = if scheme == "https", do: "upgrade-insecure-requests" - report = if report_uri, do: ["report-uri #{report_uri}; report-to csp-endpoint"], else: [] - - insecure = if scheme == "https", do: ["upgrade-insecure-requests"], else: [] - - (main_part ++ report ++ insecure) - |> Enum.join("; ") + @csp_start + |> add_csp_param(img_src) + |> add_csp_param(media_src) + |> add_csp_param(connect_src) + |> add_csp_param(script_src) + |> add_csp_param(insecure) + |> add_csp_param(report) + |> :erlang.iolist_to_binary() end + defp get_proxy_and_attachment_sources do + media_proxy_whitelist = + Enum.reduce(Config.get([:media_proxy, :whitelist]), [], fn host, acc -> + add_source(acc, host) + end) + + upload_base_url = + if Config.get([Pleroma.Upload, :base_url]), + do: URI.parse(Config.get([Pleroma.Upload, :base_url])).host + + s3_endpoint = + if Config.get([Pleroma.Upload, :uploader]) == Pleroma.Uploaders.S3, + do: URI.parse(Config.get([Pleroma.Uploaders.S3, :public_endpoint])).host + + [] + |> add_source(upload_base_url) + |> add_source(s3_endpoint) + |> add_source(media_proxy_whitelist) + end + + defp add_source(iodata, nil), do: iodata + defp add_source(iodata, source), do: [[?\s, source] | iodata] + + defp add_csp_param(csp_iodata, nil), do: csp_iodata + + defp add_csp_param(csp_iodata, param), do: [[param, ?;] | csp_iodata] + def warn_if_disabled do unless Config.get([:http_security, :enabled]) do Logger.warn(" diff --git a/lib/pleroma/plugs/instance_static.ex b/lib/pleroma/plugs/instance_static.ex index 927fa2663..7516f75c3 100644 --- a/lib/pleroma/plugs/instance_static.ex +++ b/lib/pleroma/plugs/instance_static.ex @@ -3,6 +3,8 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Plugs.InstanceStatic do + require Pleroma.Constants + @moduledoc """ This is a shim to call `Plug.Static` but with runtime `from` configuration. @@ -21,9 +23,6 @@ def file_path(path) do end end - @only ~w(index.html robots.txt static emoji packs sounds images instance favicon.png sw.js - sw-pleroma.js) - def init(opts) do opts |> Keyword.put(:from, "__unconfigured_instance_static_plug") @@ -31,7 +30,7 @@ def init(opts) do |> Plug.Static.init() end - for only <- @only do + for only <- Pleroma.Constants.static_only_files() do at = Plug.Router.Utils.split("/") def call(%{request_path: "/" <> unquote(only) <> _} = conn, opts) do diff --git a/lib/pleroma/plugs/legacy_authentication_plug.ex b/lib/pleroma/plugs/legacy_authentication_plug.ex index 5c5c36c56..d346e01a6 100644 --- a/lib/pleroma/plugs/legacy_authentication_plug.ex +++ b/lib/pleroma/plugs/legacy_authentication_plug.ex @@ -4,6 +4,8 @@ defmodule Pleroma.Plugs.LegacyAuthenticationPlug do import Plug.Conn + + alias Pleroma.Plugs.OAuthScopesPlug alias Pleroma.User def init(options) do @@ -27,6 +29,7 @@ def call( conn |> assign(:auth_user, user) |> assign(:user, user) + |> OAuthScopesPlug.skip_plug() else _ -> conn diff --git a/lib/pleroma/plugs/mapped_signature_to_identity_plug.ex b/lib/pleroma/plugs/mapped_signature_to_identity_plug.ex index 4f124ed4d..f44d4dee5 100644 --- a/lib/pleroma/plugs/mapped_signature_to_identity_plug.ex +++ b/lib/pleroma/plugs/mapped_signature_to_identity_plug.ex @@ -13,8 +13,9 @@ defmodule Pleroma.Web.Plugs.MappedSignatureToIdentityPlug do def init(options), do: options defp key_id_from_conn(conn) do - with %{"keyId" => key_id} <- HTTPSignatures.signature_for_conn(conn) do - Signature.key_id_to_actor_id(key_id) + with %{"keyId" => key_id} <- HTTPSignatures.signature_for_conn(conn), + {:ok, ap_id} <- Signature.key_id_to_actor_id(key_id) do + ap_id else _ -> nil @@ -42,13 +43,13 @@ def call(%{assigns: %{valid_signature: true}, params: %{"actor" => actor}} = con else {:user_match, false} -> Logger.debug("Failed to map identity from signature (payload actor mismatch)") - Logger.debug("key_id=#{key_id_from_conn(conn)}, actor=#{actor}") + Logger.debug("key_id=#{inspect(key_id_from_conn(conn))}, actor=#{inspect(actor)}") assign(conn, :valid_signature, false) # remove me once testsuite uses mapped capabilities instead of what we do now {:user, nil} -> Logger.debug("Failed to map identity from signature (lookup failure)") - Logger.debug("key_id=#{key_id_from_conn(conn)}, actor=#{actor}") + Logger.debug("key_id=#{inspect(key_id_from_conn(conn))}, actor=#{actor}") conn end end @@ -60,7 +61,7 @@ def call(%{assigns: %{valid_signature: true}} = conn, _opts) do else _ -> Logger.debug("Failed to map identity from signature (no payload actor mismatch)") - Logger.debug("key_id=#{key_id_from_conn(conn)}") + Logger.debug("key_id=#{inspect(key_id_from_conn(conn))}") assign(conn, :valid_signature, false) end end diff --git a/lib/pleroma/plugs/oauth_scopes_plug.ex b/lib/pleroma/plugs/oauth_scopes_plug.ex index 38df074ad..efc25b79f 100644 --- a/lib/pleroma/plugs/oauth_scopes_plug.ex +++ b/lib/pleroma/plugs/oauth_scopes_plug.ex @@ -7,13 +7,13 @@ defmodule Pleroma.Plugs.OAuthScopesPlug do import Pleroma.Web.Gettext alias Pleroma.Config - alias Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug - @behaviour Plug + use Pleroma.Web, :plug def init(%{scopes: _} = options), do: options - def call(%Plug.Conn{assigns: assigns} = conn, %{scopes: scopes} = options) do + @impl true + def perform(%Plug.Conn{assigns: assigns} = conn, %{scopes: scopes} = options) do op = options[:op] || :| token = assigns[:token] @@ -28,10 +28,7 @@ def call(%Plug.Conn{assigns: assigns} = conn, %{scopes: scopes} = options) do conn options[:fallback] == :proceed_unauthenticated -> - conn - |> assign(:user, nil) - |> assign(:token, nil) - |> maybe_perform_instance_privacy_check(options) + drop_auth_info(conn) true -> missing_scopes = scopes -- matched_scopes @@ -47,6 +44,15 @@ def call(%Plug.Conn{assigns: assigns} = conn, %{scopes: scopes} = options) do end end + @doc "Drops authentication info from connection" + def drop_auth_info(conn) do + # To simplify debugging, setting a private variable on `conn` if auth info is dropped + conn + |> put_private(:authentication_ignored, true) + |> assign(:user, nil) + |> assign(:token, nil) + end + @doc "Filters descendants of supported scopes" def filter_descendants(scopes, supported_scopes) do Enum.filter( @@ -68,12 +74,4 @@ def transform_scopes(scopes, options) do scopes end end - - defp maybe_perform_instance_privacy_check(%Plug.Conn{} = conn, options) do - if options[:skip_instance_privacy_check] do - conn - else - EnsurePublicOrAuthenticatedPlug.call(conn, []) - end - end end diff --git a/lib/pleroma/plugs/plug_helper.ex b/lib/pleroma/plugs/plug_helper.ex new file mode 100644 index 000000000..9c67be8ef --- /dev/null +++ b/lib/pleroma/plugs/plug_helper.ex @@ -0,0 +1,40 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Plugs.PlugHelper do + @moduledoc "Pleroma Plug helper" + + @called_plugs_list_id :called_plugs + def called_plugs_list_id, do: @called_plugs_list_id + + @skipped_plugs_list_id :skipped_plugs + def skipped_plugs_list_id, do: @skipped_plugs_list_id + + @doc "Returns `true` if specified plug was called." + def plug_called?(conn, plug_module) do + contained_in_private_list?(conn, @called_plugs_list_id, plug_module) + end + + @doc "Returns `true` if specified plug was explicitly marked as skipped." + def plug_skipped?(conn, plug_module) do + contained_in_private_list?(conn, @skipped_plugs_list_id, plug_module) + end + + @doc "Returns `true` if specified plug was either called or explicitly marked as skipped." + def plug_called_or_skipped?(conn, plug_module) do + plug_called?(conn, plug_module) || plug_skipped?(conn, plug_module) + end + + # Appends plug to known list (skipped, called). Intended to be used from within plug code only. + def append_to_private_list(conn, list_id, value) do + list = conn.private[list_id] || [] + modified_list = Enum.uniq(list ++ [value]) + Plug.Conn.put_private(conn, list_id, modified_list) + end + + defp contained_in_private_list?(conn, private_variable, value) do + list = conn.private[private_variable] || [] + value in list + end +end diff --git a/lib/pleroma/plugs/rate_limiter/rate_limiter.ex b/lib/pleroma/plugs/rate_limiter/rate_limiter.ex index 1529da717..c51e2c634 100644 --- a/lib/pleroma/plugs/rate_limiter/rate_limiter.ex +++ b/lib/pleroma/plugs/rate_limiter/rate_limiter.ex @@ -110,20 +110,9 @@ defp handle(conn, action_settings) do end def disabled?(conn) do - localhost_or_socket = - case Config.get([Pleroma.Web.Endpoint, :http, :ip]) do - {127, 0, 0, 1} -> true - {0, 0, 0, 0, 0, 0, 0, 1} -> true - {:local, _} -> true - _ -> false - end - - remote_ip_not_found = - if Map.has_key?(conn.assigns, :remote_ip_found), - do: !conn.assigns.remote_ip_found, - else: false - - localhost_or_socket and remote_ip_not_found + if Map.has_key?(conn.assigns, :remote_ip_found), + do: !conn.assigns.remote_ip_found, + else: false end @inspect_bucket_not_found {:error, :not_found} diff --git a/lib/pleroma/plugs/remote_ip.ex b/lib/pleroma/plugs/remote_ip.ex index 0ac9050d0..2eca4f8f6 100644 --- a/lib/pleroma/plugs/remote_ip.ex +++ b/lib/pleroma/plugs/remote_ip.ex @@ -7,8 +7,6 @@ defmodule Pleroma.Plugs.RemoteIp do This is a shim to call [`RemoteIp`](https://git.pleroma.social/pleroma/remote_ip) but with runtime configuration. """ - import Plug.Conn - @behaviour Plug @headers ~w[ @@ -28,12 +26,11 @@ defmodule Pleroma.Plugs.RemoteIp do def init(_), do: nil - def call(%{remote_ip: original_remote_ip} = conn, _) do + def call(conn, _) do config = Pleroma.Config.get(__MODULE__, []) if Keyword.get(config, :enabled, false) do - %{remote_ip: new_remote_ip} = conn = RemoteIp.call(conn, remote_ip_opts(config)) - assign(conn, :remote_ip_found, original_remote_ip != new_remote_ip) + RemoteIp.call(conn, remote_ip_opts(config)) else conn end diff --git a/lib/pleroma/plugs/uploaded_media.ex b/lib/pleroma/plugs/uploaded_media.ex index 36ff024a7..94147e0c4 100644 --- a/lib/pleroma/plugs/uploaded_media.ex +++ b/lib/pleroma/plugs/uploaded_media.ex @@ -41,6 +41,7 @@ def call(%{request_path: <<"/", @path, "/", file::binary>>} = conn, opts) do conn -> conn end + |> merge_resp_headers([{"content-security-policy", "sandbox"}]) config = Pleroma.Config.get(Pleroma.Upload) diff --git a/lib/pleroma/pool/connections.ex b/lib/pleroma/pool/connections.ex new file mode 100644 index 000000000..acafe1bea --- /dev/null +++ b/lib/pleroma/pool/connections.ex @@ -0,0 +1,283 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Pool.Connections do + use GenServer + + alias Pleroma.Config + alias Pleroma.Gun + + require Logger + + @type domain :: String.t() + @type conn :: Pleroma.Gun.Conn.t() + + @type t :: %__MODULE__{ + conns: %{domain() => conn()}, + opts: keyword() + } + + defstruct conns: %{}, opts: [] + + @spec start_link({atom(), keyword()}) :: {:ok, pid()} + def start_link({name, opts}) do + GenServer.start_link(__MODULE__, opts, name: name) + end + + @impl true + def init(opts), do: {:ok, %__MODULE__{conns: %{}, opts: opts}} + + @spec checkin(String.t() | URI.t(), atom()) :: pid() | nil + def checkin(url, name) + def checkin(url, name) when is_binary(url), do: checkin(URI.parse(url), name) + + def checkin(%URI{} = uri, name) do + timeout = Config.get([:connections_pool, :checkin_timeout], 250) + + GenServer.call(name, {:checkin, uri}, timeout) + end + + @spec alive?(atom()) :: boolean() + def alive?(name) do + if pid = Process.whereis(name) do + Process.alive?(pid) + else + false + end + end + + @spec get_state(atom()) :: t() + def get_state(name) do + GenServer.call(name, :state) + end + + @spec count(atom()) :: pos_integer() + def count(name) do + GenServer.call(name, :count) + end + + @spec get_unused_conns(atom()) :: [{domain(), conn()}] + def get_unused_conns(name) do + GenServer.call(name, :unused_conns) + end + + @spec checkout(pid(), pid(), atom()) :: :ok + def checkout(conn, pid, name) do + GenServer.cast(name, {:checkout, conn, pid}) + end + + @spec add_conn(atom(), String.t(), Pleroma.Gun.Conn.t()) :: :ok + def add_conn(name, key, conn) do + GenServer.cast(name, {:add_conn, key, conn}) + end + + @spec remove_conn(atom(), String.t()) :: :ok + def remove_conn(name, key) do + GenServer.cast(name, {:remove_conn, key}) + end + + @impl true + def handle_cast({:add_conn, key, conn}, state) do + state = put_in(state.conns[key], conn) + + Process.monitor(conn.conn) + {:noreply, state} + end + + @impl true + def handle_cast({:checkout, conn_pid, pid}, state) do + state = + with true <- Process.alive?(conn_pid), + {key, conn} <- find_conn(state.conns, conn_pid), + used_by <- List.keydelete(conn.used_by, pid, 0) do + conn_state = if used_by == [], do: :idle, else: conn.conn_state + + put_in(state.conns[key], %{conn | conn_state: conn_state, used_by: used_by}) + else + false -> + Logger.debug("checkout for closed conn #{inspect(conn_pid)}") + state + + nil -> + Logger.debug("checkout for alive conn #{inspect(conn_pid)}, but is not in state") + state + end + + {:noreply, state} + end + + @impl true + def handle_cast({:remove_conn, key}, state) do + state = put_in(state.conns, Map.delete(state.conns, key)) + {:noreply, state} + end + + @impl true + def handle_call({:checkin, uri}, from, state) do + key = "#{uri.scheme}:#{uri.host}:#{uri.port}" + + case state.conns[key] do + %{conn: pid, gun_state: :up} = conn -> + time = :os.system_time(:second) + last_reference = time - conn.last_reference + crf = crf(last_reference, 100, conn.crf) + + state = + put_in(state.conns[key], %{ + conn + | last_reference: time, + crf: crf, + conn_state: :active, + used_by: [from | conn.used_by] + }) + + {:reply, pid, state} + + %{gun_state: :down} -> + {:reply, nil, state} + + nil -> + {:reply, nil, state} + end + end + + @impl true + def handle_call(:state, _from, state), do: {:reply, state, state} + + @impl true + def handle_call(:count, _from, state) do + {:reply, Enum.count(state.conns), state} + end + + @impl true + def handle_call(:unused_conns, _from, state) do + unused_conns = + state.conns + |> Enum.filter(&filter_conns/1) + |> Enum.sort(&sort_conns/2) + + {:reply, unused_conns, state} + end + + defp filter_conns({_, %{conn_state: :idle, used_by: []}}), do: true + defp filter_conns(_), do: false + + defp sort_conns({_, c1}, {_, c2}) do + c1.crf <= c2.crf and c1.last_reference <= c2.last_reference + end + + @impl true + def handle_info({:gun_up, conn_pid, _protocol}, state) do + %{origin_host: host, origin_scheme: scheme, origin_port: port} = Gun.info(conn_pid) + + host = + case :inet.ntoa(host) do + {:error, :einval} -> host + ip -> ip + end + + key = "#{scheme}:#{host}:#{port}" + + state = + with {key, conn} <- find_conn(state.conns, conn_pid, key), + {true, key} <- {Process.alive?(conn_pid), key} do + put_in(state.conns[key], %{ + conn + | gun_state: :up, + conn_state: :active, + retries: 0 + }) + else + {false, key} -> + put_in( + state.conns, + Map.delete(state.conns, key) + ) + + nil -> + :ok = Gun.close(conn_pid) + + state + end + + {:noreply, state} + end + + @impl true + def handle_info({:gun_down, conn_pid, _protocol, _reason, _killed}, state) do + retries = Config.get([:connections_pool, :retry], 1) + # we can't get info on this pid, because pid is dead + state = + with {key, conn} <- find_conn(state.conns, conn_pid), + {true, key} <- {Process.alive?(conn_pid), key} do + if conn.retries == retries do + :ok = Gun.close(conn.conn) + + put_in( + state.conns, + Map.delete(state.conns, key) + ) + else + put_in(state.conns[key], %{ + conn + | gun_state: :down, + retries: conn.retries + 1 + }) + end + else + {false, key} -> + put_in( + state.conns, + Map.delete(state.conns, key) + ) + + nil -> + Logger.debug(":gun_down for conn which isn't found in state") + + state + end + + {:noreply, state} + end + + @impl true + def handle_info({:DOWN, _ref, :process, conn_pid, reason}, state) do + Logger.debug("received DOWN message for #{inspect(conn_pid)} reason -> #{inspect(reason)}") + + state = + with {key, conn} <- find_conn(state.conns, conn_pid) do + Enum.each(conn.used_by, fn {pid, _ref} -> + Process.exit(pid, reason) + end) + + put_in( + state.conns, + Map.delete(state.conns, key) + ) + else + nil -> + Logger.debug(":DOWN for conn which isn't found in state") + + state + end + + {:noreply, state} + end + + defp find_conn(conns, conn_pid) do + Enum.find(conns, fn {_key, conn} -> + conn.conn == conn_pid + end) + end + + defp find_conn(conns, conn_pid, conn_key) do + Enum.find(conns, fn {key, conn} -> + key == conn_key and conn.conn == conn_pid + end) + end + + def crf(current, steps, crf) do + 1 + :math.pow(0.5, current / steps) * crf + end +end diff --git a/lib/pleroma/pool/pool.ex b/lib/pleroma/pool/pool.ex new file mode 100644 index 000000000..21a6fbbc5 --- /dev/null +++ b/lib/pleroma/pool/pool.ex @@ -0,0 +1,22 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Pool do + def child_spec(opts) do + poolboy_opts = + opts + |> Keyword.put(:worker_module, Pleroma.Pool.Request) + |> Keyword.put(:name, {:local, opts[:name]}) + |> Keyword.put(:size, opts[:size]) + |> Keyword.put(:max_overflow, opts[:max_overflow]) + + %{ + id: opts[:id] || {__MODULE__, make_ref()}, + start: {:poolboy, :start_link, [poolboy_opts, [name: opts[:name]]]}, + restart: :permanent, + shutdown: 5000, + type: :worker + } + end +end diff --git a/lib/pleroma/pool/request.ex b/lib/pleroma/pool/request.ex new file mode 100644 index 000000000..3fb930db7 --- /dev/null +++ b/lib/pleroma/pool/request.ex @@ -0,0 +1,65 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Pool.Request do + use GenServer + + require Logger + + def start_link(args) do + GenServer.start_link(__MODULE__, args) + end + + @impl true + def init(_), do: {:ok, []} + + @spec execute(pid() | atom(), Tesla.Client.t(), keyword(), pos_integer()) :: + {:ok, Tesla.Env.t()} | {:error, any()} + def execute(pid, client, request, timeout) do + GenServer.call(pid, {:execute, client, request}, timeout) + end + + @impl true + def handle_call({:execute, client, request}, _from, state) do + response = Pleroma.HTTP.request(client, request) + + {:reply, response, state} + end + + @impl true + def handle_info({:gun_data, _conn, _stream, _, _}, state) do + {:noreply, state} + end + + @impl true + def handle_info({:gun_up, _conn, _protocol}, state) do + {:noreply, state} + end + + @impl true + def handle_info({:gun_down, _conn, _protocol, _reason, _killed}, state) do + {:noreply, state} + end + + @impl true + def handle_info({:gun_error, _conn, _stream, _error}, state) do + {:noreply, state} + end + + @impl true + def handle_info({:gun_push, _conn, _stream, _new_stream, _method, _uri, _headers}, state) do + {:noreply, state} + end + + @impl true + def handle_info({:gun_response, _conn, _stream, _, _status, _headers}, state) do + {:noreply, state} + end + + @impl true + def handle_info(msg, state) do + Logger.warn("Received unexpected message #{inspect(__MODULE__)} #{inspect(msg)}") + {:noreply, state} + end +end diff --git a/lib/pleroma/pool/supervisor.ex b/lib/pleroma/pool/supervisor.ex new file mode 100644 index 000000000..faf646cb2 --- /dev/null +++ b/lib/pleroma/pool/supervisor.ex @@ -0,0 +1,42 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Pool.Supervisor do + use Supervisor + + alias Pleroma.Config + alias Pleroma.Pool + + def start_link(args) do + Supervisor.start_link(__MODULE__, args, name: __MODULE__) + end + + def init(_) do + conns_child = %{ + id: Pool.Connections, + start: + {Pool.Connections, :start_link, [{:gun_connections, Config.get([:connections_pool])}]} + } + + Supervisor.init([conns_child | pools()], strategy: :one_for_one) + end + + defp pools do + pools = Config.get(:pools) + + pools = + if Config.get([Pleroma.Upload, :proxy_remote]) == false do + Keyword.delete(pools, :upload) + else + pools + end + + for {pool_name, pool_opts} <- pools do + pool_opts + |> Keyword.put(:id, {Pool, pool_name}) + |> Keyword.put(:name, pool_name) + |> Pool.child_spec() + end + end +end diff --git a/lib/pleroma/reverse_proxy/client.ex b/lib/pleroma/reverse_proxy/client.ex index 26d14fabd..0d13ff174 100644 --- a/lib/pleroma/reverse_proxy/client.ex +++ b/lib/pleroma/reverse_proxy/client.ex @@ -3,19 +3,23 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.ReverseProxy.Client do - @callback request(atom(), String.t(), [tuple()], String.t(), list()) :: - {:ok, pos_integer(), [tuple()], reference() | map()} - | {:ok, pos_integer(), [tuple()]} + @type status :: pos_integer() + @type header_name :: String.t() + @type header_value :: String.t() + @type headers :: [{header_name(), header_value()}] + + @callback request(atom(), String.t(), headers(), String.t(), list()) :: + {:ok, status(), headers(), reference() | map()} + | {:ok, status(), headers()} | {:ok, reference()} | {:error, term()} - @callback stream_body(reference() | pid() | map()) :: - {:ok, binary()} | :done | {:error, String.t()} + @callback stream_body(map()) :: {:ok, binary(), map()} | :done | {:error, atom() | String.t()} @callback close(reference() | pid() | map()) :: :ok - def request(method, url, headers, "", opts \\ []) do - client().request(method, url, headers, "", opts) + def request(method, url, headers, body \\ "", opts \\ []) do + client().request(method, url, headers, body, opts) end def stream_body(ref), do: client().stream_body(ref) @@ -23,6 +27,12 @@ def stream_body(ref), do: client().stream_body(ref) def close(ref), do: client().close(ref) defp client do - Pleroma.Config.get([Pleroma.ReverseProxy.Client], :hackney) + :tesla + |> Application.get_env(:adapter) + |> client() end + + defp client(Tesla.Adapter.Hackney), do: Pleroma.ReverseProxy.Client.Hackney + defp client(Tesla.Adapter.Gun), do: Pleroma.ReverseProxy.Client.Tesla + defp client(_), do: Pleroma.Config.get!(Pleroma.ReverseProxy.Client) end diff --git a/lib/pleroma/reverse_proxy/client/hackney.ex b/lib/pleroma/reverse_proxy/client/hackney.ex new file mode 100644 index 000000000..e84118a90 --- /dev/null +++ b/lib/pleroma/reverse_proxy/client/hackney.ex @@ -0,0 +1,24 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.ReverseProxy.Client.Hackney do + @behaviour Pleroma.ReverseProxy.Client + + @impl true + def request(method, url, headers, body, opts \\ []) do + :hackney.request(method, url, headers, body, opts) + end + + @impl true + def stream_body(ref) do + case :hackney.stream_body(ref) do + :done -> :done + {:ok, data} -> {:ok, data, ref} + {:error, error} -> {:error, error} + end + end + + @impl true + def close(ref), do: :hackney.close(ref) +end diff --git a/lib/pleroma/reverse_proxy/client/tesla.ex b/lib/pleroma/reverse_proxy/client/tesla.ex new file mode 100644 index 000000000..e81ea8bde --- /dev/null +++ b/lib/pleroma/reverse_proxy/client/tesla.ex @@ -0,0 +1,90 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.ReverseProxy.Client.Tesla do + @behaviour Pleroma.ReverseProxy.Client + + @type headers() :: [{String.t(), String.t()}] + @type status() :: pos_integer() + + @spec request(atom(), String.t(), headers(), String.t(), keyword()) :: + {:ok, status(), headers} + | {:ok, status(), headers, map()} + | {:error, atom() | String.t()} + | no_return() + + @impl true + def request(method, url, headers, body, opts \\ []) do + check_adapter() + + opts = Keyword.put(opts, :body_as, :chunks) + + with {:ok, response} <- + Pleroma.HTTP.request( + method, + url, + body, + headers, + Keyword.put(opts, :adapter, opts) + ) do + if is_map(response.body) and method != :head do + {:ok, response.status, response.headers, response.body} + else + {:ok, response.status, response.headers} + end + else + {:error, error} -> {:error, error} + end + end + + @impl true + @spec stream_body(map()) :: + {:ok, binary(), map()} | {:error, atom() | String.t()} | :done | no_return() + def stream_body(%{pid: pid, opts: opts, fin: true}) do + # if connection was reused, but in tesla were redirects, + # tesla returns new opened connection, which must be closed manually + if opts[:old_conn], do: Tesla.Adapter.Gun.close(pid) + # if there were redirects we need to checkout old conn + conn = opts[:old_conn] || opts[:conn] + + if conn, do: :ok = Pleroma.Pool.Connections.checkout(conn, self(), :gun_connections) + + :done + end + + def stream_body(client) do + case read_chunk!(client) do + {:fin, body} -> + {:ok, body, Map.put(client, :fin, true)} + + {:nofin, part} -> + {:ok, part, client} + + {:error, error} -> + {:error, error} + end + end + + defp read_chunk!(%{pid: pid, stream: stream, opts: opts}) do + adapter = check_adapter() + adapter.read_chunk(pid, stream, opts) + end + + @impl true + @spec close(map) :: :ok | no_return() + def close(%{pid: pid}) do + adapter = check_adapter() + adapter.close(pid) + end + + defp check_adapter do + adapter = Application.get_env(:tesla, :adapter) + + unless adapter == Tesla.Adapter.Gun do + raise "#{adapter} doesn't support reading body in chunks" + end + + adapter + end +end diff --git a/lib/pleroma/reverse_proxy/reverse_proxy.ex b/lib/pleroma/reverse_proxy/reverse_proxy.ex index 8b713b8f4..4bbeb493c 100644 --- a/lib/pleroma/reverse_proxy/reverse_proxy.ex +++ b/lib/pleroma/reverse_proxy/reverse_proxy.ex @@ -3,8 +3,6 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.ReverseProxy do - alias Pleroma.HTTP - @keep_req_headers ~w(accept user-agent accept-encoding cache-control if-modified-since) ++ ~w(if-unmodified-since if-none-match if-range range) @resp_cache_headers ~w(etag date last-modified) @@ -58,10 +56,10 @@ defmodule Pleroma.ReverseProxy do * `req_headers`, `resp_headers` additional headers. - * `http`: options for [hackney](https://github.com/benoitc/hackney). + * `http`: options for [hackney](https://github.com/benoitc/hackney) or [gun](https://github.com/ninenines/gun). """ - @default_hackney_options [pool: :media] + @default_options [pool: :media] @inline_content_types [ "image/gif", @@ -94,11 +92,7 @@ defmodule Pleroma.ReverseProxy do def call(_conn, _url, _opts \\ []) def call(conn = %{method: method}, url, opts) when method in @methods do - hackney_opts = - Pleroma.HTTP.Connection.hackney_options([]) - |> Keyword.merge(@default_hackney_options) - |> Keyword.merge(Keyword.get(opts, :http, [])) - |> HTTP.process_request_options() + client_opts = Keyword.merge(@default_options, Keyword.get(opts, :http, [])) req_headers = build_req_headers(conn.req_headers, opts) @@ -110,7 +104,7 @@ def call(conn = %{method: method}, url, opts) when method in @methods do end with {:ok, nil} <- Cachex.get(:failed_proxy_url_cache, url), - {:ok, code, headers, client} <- request(method, url, req_headers, hackney_opts), + {:ok, code, headers, client} <- request(method, url, req_headers, client_opts), :ok <- header_length_constraint( headers, @@ -156,11 +150,11 @@ def call(conn, _, _) do |> halt() end - defp request(method, url, headers, hackney_opts) do + defp request(method, url, headers, opts) do Logger.debug("#{__MODULE__} #{method} #{url} #{inspect(headers)}") method = method |> String.downcase() |> String.to_existing_atom() - case client().request(method, url, headers, "", hackney_opts) do + case client().request(method, url, headers, "", opts) do {:ok, code, headers, client} when code in @valid_resp_codes -> {:ok, code, downcase_headers(headers), client} @@ -210,7 +204,7 @@ defp chunk_reply(conn, client, opts, sent_so_far, duration) do duration, Keyword.get(opts, :max_read_duration, @max_read_duration) ), - {:ok, data} <- client().stream_body(client), + {:ok, data, client} <- client().stream_body(client), {:ok, duration} <- increase_read_duration(duration), sent_so_far = sent_so_far + byte_size(data), :ok <- diff --git a/lib/pleroma/scheduled_activity.ex b/lib/pleroma/scheduled_activity.ex index 8ff06a462..0937cb7db 100644 --- a/lib/pleroma/scheduled_activity.ex +++ b/lib/pleroma/scheduled_activity.ex @@ -40,7 +40,7 @@ defp with_media_attachments( %{changes: %{params: %{"media_ids" => media_ids} = params}} = changeset ) when is_list(media_ids) do - media_attachments = Utils.attachments_from_ids(%{"media_ids" => media_ids}) + media_attachments = Utils.attachments_from_ids(%{media_ids: media_ids}) params = params diff --git a/lib/pleroma/signature.ex b/lib/pleroma/signature.ex index 6b0b2c969..d01728361 100644 --- a/lib/pleroma/signature.ex +++ b/lib/pleroma/signature.ex @@ -8,6 +8,7 @@ defmodule Pleroma.Signature do alias Pleroma.Keys alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub + alias Pleroma.Web.ActivityPub.ObjectValidators.Types def key_id_to_actor_id(key_id) do uri = @@ -21,12 +22,23 @@ def key_id_to_actor_id(key_id) do uri end - URI.to_string(uri) + maybe_ap_id = URI.to_string(uri) + + case Types.ObjectID.cast(maybe_ap_id) do + {:ok, ap_id} -> + {:ok, ap_id} + + _ -> + case Pleroma.Web.WebFinger.finger(maybe_ap_id) do + %{"ap_id" => ap_id} -> {:ok, ap_id} + _ -> {:error, maybe_ap_id} + end + end end def fetch_public_key(conn) do with %{"keyId" => kid} <- HTTPSignatures.signature_for_conn(conn), - actor_id <- key_id_to_actor_id(kid), + {:ok, actor_id} <- key_id_to_actor_id(kid), {:ok, public_key} <- User.get_public_key_for_ap_id(actor_id) do {:ok, public_key} else @@ -37,7 +49,7 @@ def fetch_public_key(conn) do def refetch_public_key(conn) do with %{"keyId" => kid} <- HTTPSignatures.signature_for_conn(conn), - actor_id <- key_id_to_actor_id(kid), + {:ok, actor_id} <- key_id_to_actor_id(kid), {:ok, _user} <- ActivityPub.make_user_from_ap_id(actor_id), {:ok, public_key} <- User.get_public_key_for_ap_id(actor_id) do {:ok, public_key} diff --git a/lib/pleroma/stats.ex b/lib/pleroma/stats.ex index 4446562ac..6b3a8a41f 100644 --- a/lib/pleroma/stats.ex +++ b/lib/pleroma/stats.ex @@ -45,11 +45,11 @@ def get_peers do end def init(_args) do - {:ok, get_stat_data()} + {:ok, calculate_stat_data()} end def handle_call(:force_update, _from, _state) do - new_stats = get_stat_data() + new_stats = calculate_stat_data() {:reply, new_stats, new_stats} end @@ -58,12 +58,12 @@ def handle_call(:get_state, _from, state) do end def handle_cast(:run_update, _state) do - new_stats = get_stat_data() + new_stats = calculate_stat_data() {:noreply, new_stats} end - defp get_stat_data do + def calculate_stat_data do peers = from( u in User, @@ -77,13 +77,21 @@ defp get_stat_data do status_count = Repo.aggregate(User.Query.build(%{local: true}), :sum, :note_count) - user_count = Repo.aggregate(User.Query.build(%{local: true, active: true}), :count, :id) + users_query = + from(u in User, + where: u.deactivated != true, + where: u.local == true, + where: not is_nil(u.nickname), + where: not u.invisible + ) + + user_count = Repo.aggregate(users_query, :count, :id) %{ peers: peers, stats: %{ domain_count: domain_count, - status_count: status_count, + status_count: status_count || 0, user_count: user_count } } diff --git a/lib/pleroma/tests/auth_test_controller.ex b/lib/pleroma/tests/auth_test_controller.ex new file mode 100644 index 000000000..fb04411d9 --- /dev/null +++ b/lib/pleroma/tests/auth_test_controller.ex @@ -0,0 +1,93 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +# A test controller reachable only in :test env. +defmodule Pleroma.Tests.AuthTestController do + @moduledoc false + + use Pleroma.Web, :controller + + alias Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug + alias Pleroma.Plugs.OAuthScopesPlug + alias Pleroma.User + + # Serves only with proper OAuth token (:api and :authenticated_api) + # Skipping EnsurePublicOrAuthenticatedPlug has no effect in this case + # + # Suggested use case: all :authenticated_api endpoints (makes no sense for :api endpoints) + plug(OAuthScopesPlug, %{scopes: ["read"]} when action == :do_oauth_check) + + # Via :api, keeps :user if token has requested scopes (if :user is dropped, serves if public) + # Via :authenticated_api, serves if token is present and has requested scopes + # + # Suggested use case: vast majority of :api endpoints (no sense for :authenticated_api ones) + plug( + OAuthScopesPlug, + %{scopes: ["read"], fallback: :proceed_unauthenticated} + when action == :fallback_oauth_check + ) + + # Keeps :user if present, executes regardless of token / token scopes + # Fails with no :user for :authenticated_api / no user for :api on private instance + # Note: EnsurePublicOrAuthenticatedPlug is not skipped (private instance fails on no :user) + # Note: Basic Auth processing results in :skip_plug call for OAuthScopesPlug + # + # Suggested use: suppressing OAuth checks for other auth mechanisms (like Basic Auth) + # For controller-level use, see :skip_oauth_skip_publicity_check instead + plug( + :skip_plug, + OAuthScopesPlug when action == :skip_oauth_check + ) + + # (Shouldn't be executed since the plug is skipped) + plug(OAuthScopesPlug, %{scopes: ["admin"]} when action == :skip_oauth_check) + + # Via :api, keeps :user if token has requested scopes, and continues with nil :user otherwise + # Via :authenticated_api, serves if token is present and has requested scopes + # + # Suggested use: as :fallback_oauth_check but open with nil :user for :api on private instances + plug( + :skip_plug, + EnsurePublicOrAuthenticatedPlug when action == :fallback_oauth_skip_publicity_check + ) + + plug( + OAuthScopesPlug, + %{scopes: ["read"], fallback: :proceed_unauthenticated} + when action == :fallback_oauth_skip_publicity_check + ) + + # Via :api, keeps :user if present, serves regardless of token presence / scopes / :user presence + # Via :authenticated_api, serves if :user is set (regardless of token presence and its scopes) + # + # Suggested use: making an :api endpoint always accessible (e.g. email confirmation endpoint) + plug( + :skip_plug, + [OAuthScopesPlug, EnsurePublicOrAuthenticatedPlug] + when action == :skip_oauth_skip_publicity_check + ) + + # Via :authenticated_api, always fails with 403 (endpoint is insecure) + # Via :api, drops :user if present and serves if public (private instance rejects on no user) + # + # Suggested use: none; please define OAuth rules for all :api / :authenticated_api endpoints + plug(:skip_plug, [] when action == :missing_oauth_check_definition) + + def do_oauth_check(conn, _params), do: conn_state(conn) + + def fallback_oauth_check(conn, _params), do: conn_state(conn) + + def skip_oauth_check(conn, _params), do: conn_state(conn) + + def fallback_oauth_skip_publicity_check(conn, _params), do: conn_state(conn) + + def skip_oauth_skip_publicity_check(conn, _params), do: conn_state(conn) + + def missing_oauth_check_definition(conn, _params), do: conn_state(conn) + + defp conn_state(%{assigns: %{user: %User{} = user}} = conn), + do: json(conn, %{user_id: user.id}) + + defp conn_state(conn), do: json(conn, %{user_id: nil}) +end diff --git a/lib/pleroma/thread_mute.ex b/lib/pleroma/thread_mute.ex index cc815430a..be01d541d 100644 --- a/lib/pleroma/thread_mute.ex +++ b/lib/pleroma/thread_mute.ex @@ -9,7 +9,8 @@ defmodule Pleroma.ThreadMute do alias Pleroma.ThreadMute alias Pleroma.User - require Ecto.Query + import Ecto.Changeset + import Ecto.Query schema "thread_mutes" do belongs_to(:user, User, type: FlakeId.Ecto.CompatType) @@ -18,19 +19,44 @@ defmodule Pleroma.ThreadMute do def changeset(mute, params \\ %{}) do mute - |> Ecto.Changeset.cast(params, [:user_id, :context]) - |> Ecto.Changeset.foreign_key_constraint(:user_id) - |> Ecto.Changeset.unique_constraint(:user_id, name: :unique_index) + |> cast(params, [:user_id, :context]) + |> foreign_key_constraint(:user_id) + |> unique_constraint(:user_id, name: :unique_index) end def query(user_id, context) do - {:ok, user_id} = FlakeId.Ecto.CompatType.dump(user_id) + user_binary_id = User.binary_id(user_id) ThreadMute - |> Ecto.Query.where(user_id: ^user_id) - |> Ecto.Query.where(context: ^context) + |> where(user_id: ^user_binary_id) + |> where(context: ^context) end + def muters_query(context) do + ThreadMute + |> join(:inner, [tm], u in assoc(tm, :user)) + |> where([tm], tm.context == ^context) + |> select([tm, u], u.ap_id) + end + + def muter_ap_ids(context, ap_ids \\ nil) + + # Note: applies to fake activities (ActivityPub.Utils.get_notified_from_object/1 etc.) + def muter_ap_ids(context, _ap_ids) when is_nil(context), do: [] + + def muter_ap_ids(context, ap_ids) do + context + |> muters_query() + |> maybe_filter_on_ap_id(ap_ids) + |> Repo.all() + end + + defp maybe_filter_on_ap_id(query, ap_ids) when is_list(ap_ids) do + where(query, [tm, u], u.ap_id in ^ap_ids) + end + + defp maybe_filter_on_ap_id(query, _ap_ids), do: query + def add_mute(user_id, context) do %ThreadMute{} |> changeset(%{user_id: user_id, context: context}) @@ -42,8 +68,8 @@ def remove_mute(user_id, context) do |> Repo.delete_all() end - def check_muted(user_id, context) do + def exists?(user_id, context) do query(user_id, context) - |> Repo.all() + |> Repo.exists?() end end diff --git a/lib/pleroma/upload.ex b/lib/pleroma/upload.ex index 762d813d9..1be1a3a5b 100644 --- a/lib/pleroma/upload.ex +++ b/lib/pleroma/upload.ex @@ -134,7 +134,7 @@ defp prepare_upload(%Plug.Upload{} = file, opts) do end end - defp prepare_upload(%{"img" => "data:image/" <> image_data}, opts) do + defp prepare_upload(%{img: "data:image/" <> image_data}, opts) do parsed = Regex.named_captures(~r/(?jpeg|png|gif);base64,(?.*)/, image_data) data = Base.decode64!(parsed["data"], ignore: :whitespace) hash = String.downcase(Base.encode16(:crypto.hash(:sha256, data))) diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 8693c0b80..72ee2d58e 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -9,15 +9,17 @@ defmodule Pleroma.User do import Ecto.Query import Ecto, only: [assoc: 2] - alias Comeonin.Pbkdf2 alias Ecto.Multi alias Pleroma.Activity alias Pleroma.Config alias Pleroma.Conversation.Participation alias Pleroma.Delivery + alias Pleroma.Emoji alias Pleroma.FollowingRelationship + alias Pleroma.Formatter alias Pleroma.HTML alias Pleroma.Keys + alias Pleroma.MFA alias Pleroma.Notification alias Pleroma.Object alias Pleroma.Registration @@ -27,6 +29,9 @@ defmodule Pleroma.User do alias Pleroma.UserRelationship alias Pleroma.Web alias Pleroma.Web.ActivityPub.ActivityPub + alias Pleroma.Web.ActivityPub.Builder + alias Pleroma.Web.ActivityPub.ObjectValidators.Types + alias Pleroma.Web.ActivityPub.Pipeline alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.CommonAPI alias Pleroma.Web.CommonAPI.Utils, as: CommonUtils @@ -81,6 +86,7 @@ defmodule Pleroma.User do field(:password, :string, virtual: true) field(:password_confirmation, :string, virtual: true) field(:keys, :string) + field(:public_key, :string) field(:ap_id, :string) field(:avatar, :map) field(:local, :boolean, default: true) @@ -93,7 +99,6 @@ defmodule Pleroma.User do field(:last_digest_emailed_at, :naive_datetime) field(:banner, :map, default: %{}) field(:background, :map, default: %{}) - field(:source_data, :map, default: %{}) field(:note_count, :integer, default: 0) field(:follower_count, :integer, default: 0) field(:following_count, :integer, default: 0) @@ -110,8 +115,7 @@ defmodule Pleroma.User do field(:is_admin, :boolean, default: false) field(:show_role, :boolean, default: true) field(:settings, :map, default: nil) - field(:magic_key, :string, default: nil) - field(:uri, :string, default: nil) + field(:uri, Types.Uri, default: nil) field(:hide_followers_count, :boolean, default: false) field(:hide_follows_count, :boolean, default: false) field(:hide_followers, :boolean, default: false) @@ -121,7 +125,7 @@ defmodule Pleroma.User do field(:pinned_activities, {:array, :string}, default: []) field(:email_notifications, :map, default: %{"digest" => false}) field(:mascot, :map, default: nil) - field(:emoji, {:array, :map}, default: []) + field(:emoji, :map, default: %{}) field(:pleroma_settings_store, :map, default: %{}) field(:fields, {:array, :map}, default: []) field(:raw_fields, {:array, :map}, default: []) @@ -131,6 +135,8 @@ defmodule Pleroma.User do field(:skip_thread_containment, :boolean, default: false) field(:actor_type, :string, default: "Person") field(:also_known_as, {:array, :string}, default: []) + field(:inbox, :string) + field(:shared_inbox, :string) embeds_one( :notification_settings, @@ -150,22 +156,26 @@ defmodule Pleroma.User do {outgoing_relation, outgoing_relation_target}, {incoming_relation, incoming_relation_source} ]} <- @user_relationships_config do - # Definitions of `has_many :blocker_blocks`, `has_many :muter_mutes` etc. + # Definitions of `has_many` relations: :blocker_blocks, :muter_mutes, :reblog_muter_mutes, + # :notification_muter_mutes, :subscribee_subscriptions has_many(outgoing_relation, UserRelationship, foreign_key: :source_id, where: [relationship_type: relationship_type] ) - # Definitions of `has_many :blockee_blocks`, `has_many :mutee_mutes` etc. + # Definitions of `has_many` relations: :blockee_blocks, :mutee_mutes, :reblog_mutee_mutes, + # :notification_mutee_mutes, :subscriber_subscriptions has_many(incoming_relation, UserRelationship, foreign_key: :target_id, where: [relationship_type: relationship_type] ) - # Definitions of `has_many :blocked_users`, `has_many :muted_users` etc. + # Definitions of `has_many` relations: :blocked_users, :muted_users, :reblog_muted_users, + # :notification_muted_users, :subscriber_users has_many(outgoing_relation_target, through: [outgoing_relation, :target]) - # Definitions of `has_many :blocker_users`, `has_many :muter_users` etc. + # Definitions of `has_many` relations: :blocker_users, :muter_users, :reblog_muter_users, + # :notification_muter_users, :subscribee_users has_many(incoming_relation_source, through: [incoming_relation, :source]) end @@ -180,12 +190,20 @@ defmodule Pleroma.User do # `:subscribers` is deprecated (replaced with `subscriber_users` relation) field(:subscribers, {:array, :string}, default: []) + embeds_one( + :multi_factor_authentication_settings, + MFA.Settings, + on_replace: :delete + ) + timestamps() end for {_relationship_type, [{_outgoing_relation, outgoing_relation_target}, _]} <- @user_relationships_config do - # Definitions of `blocked_users_relation/1`, `muted_users_relation/1`, etc. + # `def blocked_users_relation/2`, `def muted_users_relation/2`, + # `def reblog_muted_users_relation/2`, `def notification_muted_users/2`, + # `def subscriber_users/2` def unquote(:"#{outgoing_relation_target}_relation")(user, restrict_deactivated? \\ false) do target_users_query = assoc(user, unquote(outgoing_relation_target)) @@ -196,7 +214,8 @@ def unquote(:"#{outgoing_relation_target}_relation")(user, restrict_deactivated? end end - # Definitions of `blocked_users/1`, `muted_users/1`, etc. + # `def blocked_users/2`, `def muted_users/2`, `def reblog_muted_users/2`, + # `def notification_muted_users/2`, `def subscriber_users/2` def unquote(outgoing_relation_target)(user, restrict_deactivated? \\ false) do __MODULE__ |> apply(unquote(:"#{outgoing_relation_target}_relation"), [ @@ -206,7 +225,8 @@ def unquote(outgoing_relation_target)(user, restrict_deactivated? \\ false) do |> Repo.all() end - # Definitions of `blocked_users_ap_ids/1`, `muted_users_ap_ids/1`, etc. + # `def blocked_users_ap_ids/2`, `def muted_users_ap_ids/2`, `def reblog_muted_users_ap_ids/2`, + # `def notification_muted_users_ap_ids/2`, `def subscriber_users_ap_ids/2` def unquote(:"#{outgoing_relation_target}_ap_ids")(user, restrict_deactivated? \\ false) do __MODULE__ |> apply(unquote(:"#{outgoing_relation_target}_relation"), [ @@ -218,6 +238,24 @@ def unquote(:"#{outgoing_relation_target}_ap_ids")(user, restrict_deactivated? \ end end + @doc """ + Dumps Flake Id to SQL-compatible format (16-byte UUID). + E.g. "9pQtDGXuq4p3VlcJEm" -> <<0, 0, 1, 110, 179, 218, 42, 92, 213, 41, 44, 227, 95, 213, 0, 0>> + """ + def binary_id(source_id) when is_binary(source_id) do + with {:ok, dumped_id} <- FlakeId.Ecto.CompatType.dump(source_id) do + dumped_id + else + _ -> source_id + end + end + + def binary_id(source_ids) when is_list(source_ids) do + Enum.map(source_ids, &binary_id/1) + end + + def binary_id(%User{} = user), do: binary_id(user.id) + @doc "Returns status account" @spec account_status(User.t()) :: account_status() def account_status(%User{deactivated: true}), do: :deactivated @@ -267,8 +305,13 @@ def invisible?(_), do: false def avatar_url(user, options \\ []) do case user.avatar do - %{"url" => [%{"href" => href} | _]} -> href - _ -> !options[:no_default] && "#{Web.base_url()}/images/avi.png" + %{"url" => [%{"href" => href} | _]} -> + href + + _ -> + unless options[:no_default] do + Config.get([:assets, :default_user_avatar], "#{Web.base_url()}/images/avi.png") + end end end @@ -279,37 +322,16 @@ def banner_url(user, options \\ []) do end end - def profile_url(%User{source_data: %{"url" => url}}), do: url - def profile_url(%User{ap_id: ap_id}), do: ap_id - def profile_url(_), do: nil - + # Should probably be renamed or removed def ap_id(%User{nickname: nickname}), do: "#{Web.base_url()}/users/#{nickname}" def ap_followers(%User{follower_address: fa}) when is_binary(fa), do: fa def ap_followers(%User{} = user), do: "#{ap_id(user)}/followers" - @spec ap_following(User.t()) :: Sring.t() + @spec ap_following(User.t()) :: String.t() def ap_following(%User{following_address: fa}) when is_binary(fa), do: fa def ap_following(%User{} = user), do: "#{ap_id(user)}/following" - def follow_state(%User{} = user, %User{} = target) do - case Utils.fetch_latest_follow(user, target) do - %{data: %{"state" => state}} -> state - # Ideally this would be nil, but then Cachex does not commit the value - _ -> false - end - end - - def get_cached_follow_state(user, target) do - key = "follow_state:#{user.ap_id}|#{target.ap_id}" - Cachex.fetch!(:user_cache, key, fn _ -> {:commit, follow_state(user, target)} end) - end - - @spec set_follow_state_cache(String.t(), String.t(), String.t()) :: {:ok | :error, boolean()} - def set_follow_state_cache(user_ap_id, target_ap_id, state) do - Cachex.put(:user_cache, "follow_state:#{user_ap_id}|#{target_ap_id}", state) - end - @spec restrict_deactivated(Ecto.Query.t()) :: Ecto.Query.t() def restrict_deactivated(query) do from(u in query, where: u.deactivated != ^true) @@ -334,62 +356,71 @@ defp truncate_if_exists(params, key, max_length) do end end - def remote_user_creation(params) do + defp fix_follower_address(%{follower_address: _, following_address: _} = params), do: params + + defp fix_follower_address(%{nickname: nickname} = params), + do: Map.put(params, :follower_address, ap_followers(%User{nickname: nickname})) + + defp fix_follower_address(params), do: params + + def remote_user_changeset(struct \\ %User{local: false}, params) do bio_limit = Pleroma.Config.get([:instance, :user_bio_length], 5000) name_limit = Pleroma.Config.get([:instance, :user_name_length], 100) + name = + case params[:name] do + name when is_binary(name) and byte_size(name) > 0 -> name + _ -> params[:nickname] + end + params = params + |> Map.put(:name, name) + |> Map.put_new(:last_refreshed_at, NaiveDateTime.utc_now()) |> truncate_if_exists(:name, name_limit) |> truncate_if_exists(:bio, bio_limit) |> truncate_fields_param() + |> fix_follower_address() - changeset = - %User{local: false} - |> cast( - params, - [ - :bio, - :name, - :ap_id, - :nickname, - :avatar, - :ap_enabled, - :source_data, - :banner, - :locked, - :magic_key, - :uri, - :hide_followers, - :hide_follows, - :hide_followers_count, - :hide_follows_count, - :follower_count, - :fields, - :following_count, - :discoverable, - :invisible, - :actor_type, - :also_known_as - ] - ) - |> validate_required([:name, :ap_id]) - |> unique_constraint(:nickname) - |> validate_format(:nickname, @email_regex) - |> validate_length(:bio, max: bio_limit) - |> validate_length(:name, max: name_limit) - |> validate_fields(true) - - case params[:source_data] do - %{"followers" => followers, "following" => following} -> - changeset - |> put_change(:follower_address, followers) - |> put_change(:following_address, following) - - _ -> - followers = ap_followers(%User{nickname: get_field(changeset, :nickname)}) - put_change(changeset, :follower_address, followers) - end + struct + |> cast( + params, + [ + :bio, + :name, + :emoji, + :ap_id, + :inbox, + :shared_inbox, + :nickname, + :public_key, + :avatar, + :ap_enabled, + :banner, + :locked, + :last_refreshed_at, + :uri, + :follower_address, + :following_address, + :hide_followers, + :hide_follows, + :hide_followers_count, + :hide_follows_count, + :follower_count, + :fields, + :following_count, + :discoverable, + :invisible, + :actor_type, + :also_known_as + ] + ) + |> validate_required([:name, :ap_id]) + |> unique_constraint(:nickname) + |> validate_format(:nickname, @email_regex) + |> validate_length(:bio, max: bio_limit) + |> validate_length(:name, max: name_limit) + |> validate_fields(true) end def update_changeset(struct, params \\ %{}) do @@ -402,7 +433,11 @@ def update_changeset(struct, params \\ %{}) do [ :bio, :name, + :emoji, :avatar, + :public_key, + :inbox, + :shared_inbox, :locked, :no_rich_text, :default_scope, @@ -428,50 +463,94 @@ def update_changeset(struct, params \\ %{}) do |> validate_format(:nickname, local_nickname_regex()) |> validate_length(:bio, max: bio_limit) |> validate_length(:name, min: 1, max: name_limit) + |> put_fields() + |> put_emoji() + |> put_change_if_present(:bio, &{:ok, parse_bio(&1, struct)}) + |> put_change_if_present(:avatar, &put_upload(&1, :avatar)) + |> put_change_if_present(:banner, &put_upload(&1, :banner)) + |> put_change_if_present(:background, &put_upload(&1, :background)) + |> put_change_if_present( + :pleroma_settings_store, + &{:ok, Map.merge(struct.pleroma_settings_store, &1)} + ) |> validate_fields(false) end - def upgrade_changeset(struct, params \\ %{}, remote? \\ false) do - bio_limit = Pleroma.Config.get([:instance, :user_bio_length], 5000) - name_limit = Pleroma.Config.get([:instance, :user_name_length], 100) + defp put_fields(changeset) do + if raw_fields = get_change(changeset, :raw_fields) do + raw_fields = + raw_fields + |> Enum.filter(fn %{"name" => n} -> n != "" end) - params = Map.put(params, :last_refreshed_at, NaiveDateTime.utc_now()) + fields = + raw_fields + |> Enum.map(fn f -> Map.update!(f, "value", &parse_fields(&1)) end) - params = if remote?, do: truncate_fields_param(params), else: params + changeset + |> put_change(:raw_fields, raw_fields) + |> put_change(:fields, fields) + else + changeset + end + end + defp parse_fields(value) do + value + |> Formatter.linkify(mentions_format: :full) + |> elem(0) + end + + defp put_emoji(changeset) do + bio = get_change(changeset, :bio) + name = get_change(changeset, :name) + + if bio || name do + emoji = Map.merge(Emoji.Formatter.get_emoji_map(bio), Emoji.Formatter.get_emoji_map(name)) + put_change(changeset, :emoji, emoji) + else + changeset + end + end + + defp put_change_if_present(changeset, map_field, value_function) do + if value = get_change(changeset, map_field) do + with {:ok, new_value} <- value_function.(value) do + put_change(changeset, map_field, new_value) + else + _ -> changeset + end + else + changeset + end + end + + defp put_upload(value, type) do + with %Plug.Upload{} <- value, + {:ok, object} <- ActivityPub.upload(value, type: type) do + {:ok, object.data} + end + end + + def update_as_admin_changeset(struct, params) do struct - |> cast( - params, - [ - :bio, - :name, - :follower_address, - :following_address, - :avatar, - :last_refreshed_at, - :ap_enabled, - :source_data, - :banner, - :locked, - :magic_key, - :follower_count, - :following_count, - :hide_follows, - :fields, - :hide_followers, - :allow_following_move, - :discoverable, - :hide_followers_count, - :hide_follows_count, - :actor_type, - :also_known_as - ] - ) - |> unique_constraint(:nickname) - |> validate_format(:nickname, local_nickname_regex()) - |> validate_length(:bio, max: bio_limit) - |> validate_length(:name, max: name_limit) - |> validate_fields(remote?) + |> update_changeset(params) + |> cast(params, [:email]) + |> delete_change(:also_known_as) + |> unique_constraint(:email) + |> validate_format(:email, @email_regex) + |> validate_inclusion(:actor_type, ["Person", "Service"]) + end + + @spec update_as_admin(User.t(), map()) :: {:ok, User.t()} | {:error, Changeset.t()} + def update_as_admin(user, params) do + params = Map.put(params, "password_confirmation", params["password"]) + changeset = update_as_admin_changeset(user, params) + + if params["password"] do + reset_password(user, changeset, params) + else + User.update_and_set_cache(changeset) + end end def password_update_changeset(struct, params) do @@ -483,11 +562,15 @@ def password_update_changeset(struct, params) do |> put_change(:password_reset_pending, false) end - @spec reset_password(User.t(), map) :: {:ok, User.t()} | {:error, Ecto.Changeset.t()} - def reset_password(%User{id: user_id} = user, data) do + @spec reset_password(User.t(), map()) :: {:ok, User.t()} | {:error, Changeset.t()} + def reset_password(%User{} = user, params) do + reset_password(user, user, params) + end + + def reset_password(%User{id: user_id} = user, struct, params) do multi = Multi.new() - |> Multi.update(:user, password_update_changeset(user, data)) + |> Multi.update(:user, password_update_changeset(struct, params)) |> Multi.delete_all(:tokens, OAuth.Token.Query.get_by_user(user_id)) |> Multi.delete_all(:auth, OAuth.Authorization.delete_by_user_query(user)) @@ -524,7 +607,7 @@ def register_changeset(struct, params \\ %{}, opts \\ []) do struct |> confirmation_changeset(need_confirmation: need_confirmation?) - |> cast(params, [:bio, :email, :name, :nickname, :password, :password_confirmation]) + |> cast(params, [:bio, :email, :name, :nickname, :password, :password_confirmation, :emoji]) |> validate_required([:name, :nickname, :password, :password_confirmation]) |> validate_confirmation(:password) |> unique_constraint(:email) @@ -617,8 +700,10 @@ def needs_update?(%User{local: false} = user) do def needs_update?(_), do: true @spec maybe_direct_follow(User.t(), User.t()) :: {:ok, User.t()} | {:error, String.t()} + + # "Locked" (self-locked) users demand explicit authorization of follow requests def maybe_direct_follow(%User{} = follower, %User{local: true, locked: true} = followed) do - follow(follower, followed, "pending") + follow(follower, followed, :follow_pending) end def maybe_direct_follow(%User{} = follower, %User{local: true} = followed) do @@ -638,14 +723,14 @@ def maybe_direct_follow(%User{} = follower, %User{} = followed) do def follow_all(follower, followeds) do followeds |> Enum.reject(fn followed -> blocks?(follower, followed) || blocks?(followed, follower) end) - |> Enum.each(&follow(follower, &1, "accept")) + |> Enum.each(&follow(follower, &1, :follow_accept)) set_cache(follower) end defdelegate following(user), to: FollowingRelationship - def follow(%User{} = follower, %User{} = followed, state \\ "accept") do + def follow(%User{} = follower, %User{} = followed, state \\ :follow_accept) do deny_follow_blocked = Pleroma.Config.get([:user, :deny_follow_blocked]) cond do @@ -670,9 +755,21 @@ def unfollow(%User{ap_id: ap_id}, %User{ap_id: ap_id}) do {:error, "Not subscribed!"} end + @spec unfollow(User.t(), User.t()) :: {:ok, User.t(), Activity.t()} | {:error, String.t()} def unfollow(%User{} = follower, %User{} = followed) do + case do_unfollow(follower, followed) do + {:ok, follower, followed} -> + {:ok, follower, Utils.fetch_latest_follow(follower, followed)} + + error -> + error + end + end + + @spec do_unfollow(User.t(), User.t()) :: {:ok, User.t(), User.t()} | {:error, String.t()} + defp do_unfollow(%User{} = follower, %User{} = followed) do case get_follow_state(follower, followed) do - state when state in ["accept", "pending"] -> + state when state in [:follow_pending, :follow_accept] -> FollowingRelationship.unfollow(follower, followed) {:ok, followed} = update_follower_count(followed) @@ -681,7 +778,7 @@ def unfollow(%User{} = follower, %User{} = followed) do |> update_following_count() |> set_cache() - {:ok, follower, Utils.fetch_latest_follow(follower, followed)} + {:ok, follower, followed} nil -> {:error, "Not subscribed!"} @@ -690,14 +787,25 @@ def unfollow(%User{} = follower, %User{} = followed) do defdelegate following?(follower, followed), to: FollowingRelationship + @doc "Returns follow state as Pleroma.FollowingRelationship.State value" def get_follow_state(%User{} = follower, %User{} = following) do following_relationship = FollowingRelationship.get(follower, following) + get_follow_state(follower, following, following_relationship) + end + def get_follow_state( + %User{} = follower, + %User{} = following, + following_relationship + ) do case {following_relationship, following.local} do {nil, false} -> case Utils.fetch_latest_follow(follower, following) do - %{data: %{"state" => state}} when state in ["pending", "accept"] -> state - _ -> nil + %Activity{data: %{"state" => state}} when state in ["pending", "accept"] -> + FollowingRelationship.state_to_enum(state) + + _ -> + nil end {%{state: state}, _} -> @@ -748,6 +856,7 @@ def set_cache({:error, err}), do: {:error, err} def set_cache(%User{} = user) do Cachex.put(:user_cache, "ap_id:#{user.ap_id}", user) Cachex.put(:user_cache, "nickname:#{user.nickname}", user) + Cachex.put(:user_cache, "friends_ap_ids:#{user.nickname}", get_user_friends_ap_ids(user)) {:ok, user} end @@ -763,9 +872,22 @@ def update_and_set_cache(changeset) do end end + def get_user_friends_ap_ids(user) do + from(u in User.get_friends_query(user), select: u.ap_id) + |> Repo.all() + end + + @spec get_cached_user_friends_ap_ids(User.t()) :: [String.t()] + def get_cached_user_friends_ap_ids(user) do + Cachex.fetch!(:user_cache, "friends_ap_ids:#{user.ap_id}", fn _ -> + get_user_friends_ap_ids(user) + end) + end + def invalidate_cache(user) do Cachex.del(:user_cache, "ap_id:#{user.ap_id}") Cachex.del(:user_cache, "nickname:#{user.nickname}") + Cachex.del(:user_cache, "friends_ap_ids:#{user.ap_id}") end @spec get_cached_by_ap_id(String.t()) :: User.t() | nil @@ -829,6 +951,7 @@ def get_cached_by_nickname_or_id(nickname_or_id, opts \\ []) do end end + @spec get_by_nickname(String.t()) :: User.t() | nil def get_by_nickname(nickname) do Repo.get_by(User, nickname: nickname) || if Regex.match?(~r(@#{Pleroma.Web.Endpoint.host()})i, nickname) do @@ -1086,8 +1209,9 @@ def increment_unread_conversation_count(conversation, %User{local: true} = user) def increment_unread_conversation_count(_, user), do: {:ok, user} - @spec get_users_from_set([String.t()], boolean()) :: [User.t()] - def get_users_from_set(ap_ids, local_only \\ true) do + @spec get_users_from_set([String.t()], keyword()) :: [User.t()] + def get_users_from_set(ap_ids, opts \\ []) do + local_only = Keyword.get(opts, :local_only, true) criteria = %{ap_id: ap_ids, deactivated: false} criteria = if local_only, do: Map.put(criteria, :local, true), else: criteria @@ -1096,8 +1220,12 @@ def get_users_from_set(ap_ids, local_only \\ true) do end @spec get_recipients_from_activity(Activity.t()) :: [User.t()] - def get_recipients_from_activity(%Activity{recipients: to}) do - User.Query.build(%{recipients_from_activity: to, local: true, deactivated: false}) + def get_recipients_from_activity(%Activity{recipients: to, actor: actor}) do + to = [actor | to] + + query = User.Query.build(%{recipients_from_activity: to, local: true, deactivated: false}) + + query |> Repo.all() end @@ -1196,7 +1324,7 @@ def blocks?(nil, _), do: false def blocks?(%User{} = user, %User{} = target) do blocks_user?(user, target) || - (!User.following?(user, target) && blocks_domain?(user, target)) + (blocks_domain?(user, target) and not User.following?(user, target)) end def blocks_user?(%User{} = user, %User{} = target) do @@ -1225,13 +1353,15 @@ def subscribed_to?(%User{} = user, %{ap_id: ap_id}) do end @doc """ - Returns map of outgoing (blocked, muted etc.) relations' user AP IDs by relation type. - E.g. `outgoing_relations_ap_ids(user, [:block])` -> `%{block: ["https://some.site/users/userapid"]}` + Returns map of outgoing (blocked, muted etc.) relationships' user AP IDs by relation type. + E.g. `outgoing_relationships_ap_ids(user, [:block])` -> `%{block: ["https://some.site/users/userapid"]}` """ - @spec outgoing_relations_ap_ids(User.t(), list(atom())) :: %{atom() => list(String.t())} - def outgoing_relations_ap_ids(_, []), do: %{} + @spec outgoing_relationships_ap_ids(User.t(), list(atom())) :: %{atom() => list(String.t())} + def outgoing_relationships_ap_ids(_user, []), do: %{} - def outgoing_relations_ap_ids(%User{} = user, relationship_types) + def outgoing_relationships_ap_ids(nil, _relationship_types), do: %{} + + def outgoing_relationships_ap_ids(%User{} = user, relationship_types) when is_list(relationship_types) do db_result = user @@ -1250,6 +1380,30 @@ def outgoing_relations_ap_ids(%User{} = user, relationship_types) ) end + def incoming_relationships_ungrouped_ap_ids(user, relationship_types, ap_ids \\ nil) + + def incoming_relationships_ungrouped_ap_ids(_user, [], _ap_ids), do: [] + + def incoming_relationships_ungrouped_ap_ids(nil, _relationship_types, _ap_ids), do: [] + + def incoming_relationships_ungrouped_ap_ids(%User{} = user, relationship_types, ap_ids) + when is_list(relationship_types) do + user + |> assoc(:incoming_relationships) + |> join(:inner, [user_rel], u in assoc(user_rel, :source)) + |> where([user_rel, u], user_rel.relationship_type in ^relationship_types) + |> maybe_filter_on_ap_id(ap_ids) + |> select([user_rel, u], u.ap_id) + |> distinct(true) + |> Repo.all() + end + + defp maybe_filter_on_ap_id(query, ap_ids) when is_list(ap_ids) do + where(query, [user_rel, u], u.ap_id in ^ap_ids) + end + + defp maybe_filter_on_ap_id(query, _ap_ids), do: query + def deactivate_async(user, status \\ true) do BackgroundWorker.enqueue("deactivate_user", %{"user_id" => user.id, "status" => status}) end @@ -1267,15 +1421,13 @@ def deactivate(%User{} = user, status) do user |> get_followers() |> Enum.filter(& &1.local) - |> Enum.each(fn follower -> - follower |> update_following_count() |> set_cache() - end) + |> Enum.each(&set_cache(update_following_count(&1))) # Only update local user counts, remote will be update during the next pull. user |> get_friends() |> Enum.filter(& &1.local) - |> Enum.each(&update_follower_count/1) + |> Enum.each(&do_unfollow(user, &1)) {:ok, user} end @@ -1297,12 +1449,29 @@ def delete(%User{} = user) do BackgroundWorker.enqueue("delete_user", %{"user_id" => user.id}) end + defp delete_and_invalidate_cache(%User{} = user) do + invalidate_cache(user) + Repo.delete(user) + end + + defp delete_or_deactivate(%User{local: false} = user), do: delete_and_invalidate_cache(user) + + defp delete_or_deactivate(%User{local: true} = user) do + status = account_status(user) + + if status == :confirmation_pending do + delete_and_invalidate_cache(user) + else + user + |> change(%{deactivated: true, email: nil}) + |> update_and_set_cache() + end + end + def perform(:force_password_reset, user), do: force_password_reset(user) @spec perform(atom(), User.t()) :: {:ok, User.t()} def perform(:delete, %User{} = user) do - {:ok, _user} = ActivityPub.delete(user) - # Remove all relationships user |> get_followers() @@ -1319,8 +1488,8 @@ def perform(:delete, %User{} = user) do end) delete_user_activities(user) - invalidate_cache(user) - Repo.delete(user) + + delete_or_deactivate(user) end def perform(:deactivate_async, user, status), do: deactivate(user, status) @@ -1405,37 +1574,42 @@ def follow_import(%User{} = follower, followed_identifiers) }) end - def delete_user_activities(%User{ap_id: ap_id}) do + def delete_user_activities(%User{ap_id: ap_id} = user) do ap_id |> Activity.Queries.by_actor() |> RepoStreamer.chunk_stream(50) - |> Stream.each(fn activities -> Enum.each(activities, &delete_activity/1) end) + |> Stream.each(fn activities -> + Enum.each(activities, fn activity -> delete_activity(activity, user) end) + end) |> Stream.run() end - defp delete_activity(%{data: %{"type" => "Create"}} = activity) do - activity - |> Object.normalize() - |> ActivityPub.delete() + defp delete_activity(%{data: %{"type" => "Create", "object" => object}} = activity, user) do + with {_, %Object{}} <- {:find_object, Object.get_by_ap_id(object)}, + {:ok, delete_data, _} <- Builder.delete(user, object) do + Pipeline.common_pipeline(delete_data, local: user.local) + else + {:find_object, nil} -> + # We have the create activity, but not the object, it was probably pruned. + # Insert a tombstone and try again + with {:ok, tombstone_data, _} <- Builder.tombstone(user.ap_id, object), + {:ok, _tombstone} <- Object.create(tombstone_data) do + delete_activity(activity, user) + end + + e -> + Logger.error("Could not delete #{object} created by #{activity.data["ap_id"]}") + Logger.error("Error: #{inspect(e)}") + end end - defp delete_activity(%{data: %{"type" => "Like"}} = activity) do - object = Object.normalize(activity) - - activity.actor - |> get_cached_by_ap_id() - |> ActivityPub.unlike(object) + defp delete_activity(%{data: %{"type" => type}} = activity, user) + when type in ["Like", "Announce"] do + {:ok, undo, _} = Builder.undo(user, activity) + Pipeline.common_pipeline(undo, local: user.local) end - defp delete_activity(%{data: %{"type" => "Announce"}} = activity) do - object = Object.normalize(activity) - - activity.actor - |> get_cached_by_ap_id() - |> ActivityPub.unannounce(object) - end - - defp delete_activity(_activity), do: "Doing nothing" + defp delete_activity(_activity, _user), do: "Doing nothing" def html_filter_policy(%User{no_rich_text: true}) do Pleroma.HTML.Scrubber.TwitterText @@ -1446,12 +1620,19 @@ def html_filter_policy(_), do: Pleroma.Config.get([:markup, :scrub_policy]) def fetch_by_ap_id(ap_id), do: ActivityPub.make_user_from_ap_id(ap_id) def get_or_fetch_by_ap_id(ap_id) do - user = get_cached_by_ap_id(ap_id) + cached_user = get_cached_by_ap_id(ap_id) - if !is_nil(user) and !needs_update?(user) do - {:ok, user} - else - fetch_by_ap_id(ap_id) + maybe_fetched_user = needs_update?(cached_user) && fetch_by_ap_id(ap_id) + + case {cached_user, maybe_fetched_user} do + {_, {:ok, %User{} = user}} -> + {:ok, user} + + {%User{} = user, _} -> + {:ok, user} + + _ -> + {:error, :not_found} end end @@ -1502,8 +1683,7 @@ defp create_service_actor(uri, nickname) do |> set_cache() end - # AP style - def public_key(%{source_data: %{"publicKey" => %{"publicKeyPem" => public_key_pem}}}) do + def public_key(%{public_key: public_key_pem}) when is_binary(public_key_pem) do key = public_key_pem |> :public_key.pem_decode() @@ -1513,7 +1693,7 @@ def public_key(%{source_data: %{"publicKey" => %{"publicKeyPem" => public_key_pe {:ok, key} end - def public_key(_), do: {:error, "not found key"} + def public_key(_), do: {:error, "key not found"} def get_public_key_for_ap_id(ap_id) do with {:ok, %User{} = user} <- get_or_fetch_by_ap_id(ap_id), @@ -1524,17 +1704,6 @@ def get_public_key_for_ap_id(ap_id) do end end - defp blank?(""), do: nil - defp blank?(n), do: n - - def insert_or_update_user(data) do - data - |> Map.put(:name, blank?(data[:name]) || data[:nickname]) - |> remote_user_creation() - |> Repo.insert(on_conflict: {:replace_all_except, [:id]}, conflict_target: :nickname) - |> set_cache() - end - def ap_enabled?(%User{local: true}), do: true def ap_enabled?(%User{ap_enabled: ap_enabled}), do: ap_enabled def ap_enabled?(_), do: false @@ -1660,8 +1829,12 @@ def all_superusers do |> Repo.all() end + def muting_reblogs?(%User{} = user, %User{} = target) do + UserRelationship.reblog_mute_exists?(user, target) + end + def showing_reblogs?(%User{} = user, %User{} = target) do - not UserRelationship.reblog_mute_exists?(user, target) + not muting_reblogs?(user, target) end @doc """ @@ -1790,7 +1963,7 @@ def get_ap_ids_by_nicknames(nicknames) do defp put_password_hash( %Ecto.Changeset{valid?: true, changes: %{password: password}} = changeset ) do - change(changeset, password_hash: Pbkdf2.hashpwsalt(password)) + change(changeset, password_hash: Pbkdf2.hash_pwd_salt(password)) end defp put_password_hash(changeset), do: changeset @@ -1839,12 +2012,6 @@ def update_background(user, background) do |> update_and_set_cache() end - def update_source_data(user, source_data) do - user - |> cast(%{source_data: source_data}, [:source_data]) - |> update_and_set_cache() - end - def roles(%{is_moderator: is_moderator, is_admin: is_admin}) do %{ admin: is_admin, @@ -1852,21 +2019,6 @@ def roles(%{is_moderator: is_moderator, is_admin: is_admin}) do } end - # ``fields`` is an array of mastodon profile field, containing ``{"name": "…", "value": "…"}``. - # For example: [{"name": "Pronoun", "value": "she/her"}, …] - def fields(%{fields: nil, source_data: %{"attachment" => attachment}}) do - limit = Pleroma.Config.get([:instance, :max_remote_account_fields], 0) - - attachment - |> Enum.filter(fn %{"type" => t} -> t == "PropertyValue" end) - |> Enum.map(fn fields -> Map.take(fields, ["name", "value"]) end) - |> Enum.take(limit) - end - - def fields(%{fields: nil}), do: [] - - def fields(%{fields: fields}), do: fields - def validate_fields(changeset, remote? \\ false) do limit_name = if remote?, do: :max_remote_account_fields, else: :max_account_fields limit = Pleroma.Config.get([:instance, limit_name], 0) @@ -2054,9 +2206,7 @@ def sanitize_html(%User{} = user) do # - display name def sanitize_html(%User{} = user, filter) do fields = - user - |> User.fields() - |> Enum.map(fn %{"name" => name, "value" => value} -> + Enum.map(user.fields, fn %{"name" => name, "value" => value} -> %{ "name" => name, "value" => HTML.filter_tags(value, Pleroma.HTML.Scrubber.LinksOnly) diff --git a/lib/pleroma/user/query.ex b/lib/pleroma/user/query.ex index 884e33039..293bbc082 100644 --- a/lib/pleroma/user/query.ex +++ b/lib/pleroma/user/query.ex @@ -45,6 +45,7 @@ defmodule Pleroma.User.Query do is_admin: boolean(), is_moderator: boolean(), super_users: boolean(), + exclude_service_users: boolean(), followers: User.t(), friends: User.t(), recipients_from_activity: [String.t()], @@ -54,13 +55,13 @@ defmodule Pleroma.User.Query do select: term(), limit: pos_integer() } - | %{} + | map() @ilike_criteria [:nickname, :name, :query] @equal_criteria [:email] @contains_criteria [:ap_id, :nickname] - @spec build(criteria()) :: Query.t() + @spec build(Query.t(), criteria()) :: Query.t() def build(query \\ base_query(), criteria) do prepare_query(query, criteria) end @@ -88,6 +89,10 @@ defp compose_query({key, value}, query) where(query, [u], ilike(field(u, ^key), ^"%#{value}%")) end + defp compose_query({:exclude_service_users, _}, query) do + where(query, [u], not like(u.ap_id, "%/relay") and not like(u.ap_id, "%/internal/fetch")) + end + defp compose_query({key, value}, query) when key in @equal_criteria and not_empty_string(value) do where(query, [u], ^[{key, value}]) @@ -98,7 +103,7 @@ defp compose_query({key, values}, query) when key in @contains_criteria and is_l end defp compose_query({:tags, tags}, query) when is_list(tags) and length(tags) > 0 do - Enum.reduce(tags, query, &prepare_tag_criteria/2) + where(query, [u], fragment("? && ?", u.tags, ^tags)) end defp compose_query({:is_admin, _}, query) do @@ -148,7 +153,7 @@ defp compose_query({:followers, %User{id: id}}, query) do as: :relationships, on: r.following_id == ^id and r.follower_id == u.id ) - |> where([relationships: r], r.state == "accept") + |> where([relationships: r], r.state == ^:follow_accept) end defp compose_query({:friends, %User{id: id}}, query) do @@ -158,24 +163,22 @@ defp compose_query({:friends, %User{id: id}}, query) do as: :relationships, on: r.following_id == u.id and r.follower_id == ^id ) - |> where([relationships: r], r.state == "accept") + |> where([relationships: r], r.state == ^:follow_accept) end defp compose_query({:recipients_from_activity, to}, query) do - query - |> join(:left, [u], r in FollowingRelationship, - as: :relationships, - on: r.follower_id == u.id + following_query = + from(u in User, + join: f in FollowingRelationship, + on: u.id == f.following_id, + where: f.state == ^:follow_accept, + where: u.follower_address in ^to, + select: f.follower_id + ) + + from(u in query, + where: u.ap_id in ^to or u.id in subquery(following_query) ) - |> join(:left, [relationships: r], f in User, - as: :following, - on: f.id == r.following_id - ) - |> where( - [u, following: f, relationships: r], - u.ap_id in ^to or (f.follower_address in ^to and r.state == "accept") - ) - |> distinct(true) end defp compose_query({:order_by, key}, query) do @@ -192,10 +195,6 @@ defp compose_query({:limit, limit}, query) do defp compose_query(_unsupported_param, query), do: query - defp prepare_tag_criteria(tag, query) do - or_where(query, [u], fragment("? = any(?)", ^tag, u.tags)) - end - defp location_query(query, local) do where(query, [u], u.local == ^local) |> where([u], not is_nil(u.nickname)) diff --git a/lib/pleroma/user/welcome_message.ex b/lib/pleroma/user/welcome_message.ex index f0ac8ebae..f8f520285 100644 --- a/lib/pleroma/user/welcome_message.ex +++ b/lib/pleroma/user/welcome_message.ex @@ -10,8 +10,8 @@ def post_welcome_message_to_user(user) do with %User{} = sender_user <- welcome_user(), message when is_binary(message) <- welcome_message() do CommonAPI.post(sender_user, %{ - "visibility" => "direct", - "status" => "@#{user.nickname}\n#{message}" + visibility: "direct", + status: "@#{user.nickname}\n#{message}" }) else _ -> {:ok, nil} diff --git a/lib/pleroma/user_relationship.ex b/lib/pleroma/user_relationship.ex index 393947942..6dfdd2860 100644 --- a/lib/pleroma/user_relationship.ex +++ b/lib/pleroma/user_relationship.ex @@ -8,6 +8,8 @@ defmodule Pleroma.UserRelationship do import Ecto.Changeset import Ecto.Query + alias Ecto.Changeset + alias Pleroma.FollowingRelationship alias Pleroma.Repo alias Pleroma.User alias Pleroma.UserRelationship @@ -15,25 +17,32 @@ defmodule Pleroma.UserRelationship do schema "user_relationships" do belongs_to(:source, User, type: FlakeId.Ecto.CompatType) belongs_to(:target, User, type: FlakeId.Ecto.CompatType) - field(:relationship_type, UserRelationshipTypeEnum) + field(:relationship_type, Pleroma.UserRelationship.Type) timestamps(updated_at: false) end - for relationship_type <- Keyword.keys(UserRelationshipTypeEnum.__enum_map__()) do - # Definitions of `create_block/2`, `create_mute/2` etc. + for relationship_type <- Keyword.keys(Pleroma.UserRelationship.Type.__enum_map__()) do + # `def create_block/2`, `def create_mute/2`, `def create_reblog_mute/2`, + # `def create_notification_mute/2`, `def create_inverse_subscription/2` def unquote(:"create_#{relationship_type}")(source, target), do: create(unquote(relationship_type), source, target) - # Definitions of `delete_block/2`, `delete_mute/2` etc. + # `def delete_block/2`, `def delete_mute/2`, `def delete_reblog_mute/2`, + # `def delete_notification_mute/2`, `def delete_inverse_subscription/2` def unquote(:"delete_#{relationship_type}")(source, target), do: delete(unquote(relationship_type), source, target) - # Definitions of `block_exists?/2`, `mute_exists?/2` etc. + # `def block_exists?/2`, `def mute_exists?/2`, `def reblog_mute_exists?/2`, + # `def notification_mute_exists?/2`, `def inverse_subscription_exists?/2` def unquote(:"#{relationship_type}_exists?")(source, target), do: exists?(unquote(relationship_type), source, target) end + def user_relationship_types, do: Keyword.keys(user_relationship_mappings()) + + def user_relationship_mappings, do: Pleroma.UserRelationship.Type.__enum_map__() + def changeset(%UserRelationship{} = user_relationship, params \\ %{}) do user_relationship |> cast(params, [:relationship_type, :source_id, :target_id]) @@ -72,16 +81,122 @@ def delete(relationship_type, %User{} = source, %User{} = target) do end end - defp validate_not_self_relationship(%Ecto.Changeset{} = changeset) do - changeset - |> validate_change(:target_id, fn _, target_id -> - if target_id == get_field(changeset, :source_id) do - [target_id: "can't be equal to source_id"] - else - [] + def dictionary( + source_users, + target_users, + source_to_target_rel_types \\ nil, + target_to_source_rel_types \\ nil + ) + + def dictionary( + _source_users, + _target_users, + [] = _source_to_target_rel_types, + [] = _target_to_source_rel_types + ) do + [] + end + + def dictionary( + source_users, + target_users, + source_to_target_rel_types, + target_to_source_rel_types + ) + when is_list(source_users) and is_list(target_users) do + source_user_ids = User.binary_id(source_users) + target_user_ids = User.binary_id(target_users) + + get_rel_type_codes = fn rel_type -> user_relationship_mappings()[rel_type] end + + source_to_target_rel_types = + Enum.map(source_to_target_rel_types || user_relationship_types(), &get_rel_type_codes.(&1)) + + target_to_source_rel_types = + Enum.map(target_to_source_rel_types || user_relationship_types(), &get_rel_type_codes.(&1)) + + __MODULE__ + |> where( + fragment( + "(source_id = ANY(?) AND target_id = ANY(?) AND relationship_type = ANY(?)) OR \ + (source_id = ANY(?) AND target_id = ANY(?) AND relationship_type = ANY(?))", + ^source_user_ids, + ^target_user_ids, + ^source_to_target_rel_types, + ^target_user_ids, + ^source_user_ids, + ^target_to_source_rel_types + ) + ) + |> select([ur], [ur.relationship_type, ur.source_id, ur.target_id]) + |> Repo.all() + end + + def exists?(dictionary, rel_type, source, target, func) do + cond do + is_nil(source) or is_nil(target) -> + false + + dictionary -> + [rel_type, source.id, target.id] in dictionary + + true -> + func.(source, target) + end + end + + @doc ":relationships option for StatusView / AccountView / NotificationView" + def view_relationships_option(reading_user, actors, opts \\ []) + + def view_relationships_option(nil = _reading_user, _actors, _opts) do + %{user_relationships: [], following_relationships: []} + end + + def view_relationships_option(%User{} = reading_user, actors, opts) do + {source_to_target_rel_types, target_to_source_rel_types} = + case opts[:subset] do + :source_mutes -> + # Used for statuses rendering (FE needs `muted` flag for each status when statuses load) + {[:mute], []} + + nil -> + {[:block, :mute, :notification_mute, :reblog_mute], [:block, :inverse_subscription]} + + unknown -> + raise "Unsupported :subset option value: #{inspect(unknown)}" end - end) - |> validate_change(:source_id, fn _, source_id -> + + user_relationships = + UserRelationship.dictionary( + [reading_user], + actors, + source_to_target_rel_types, + target_to_source_rel_types + ) + + following_relationships = + case opts[:subset] do + :source_mutes -> + [] + + nil -> + FollowingRelationship.all_between_user_sets([reading_user], actors) + + unknown -> + raise "Unsupported :subset option value: #{inspect(unknown)}" + end + + %{user_relationships: user_relationships, following_relationships: following_relationships} + end + + defp validate_not_self_relationship(%Changeset{} = changeset) do + changeset + |> validate_source_id_target_id_inequality() + |> validate_target_id_source_id_inequality() + end + + defp validate_source_id_target_id_inequality(%Changeset{} = changeset) do + validate_change(changeset, :source_id, fn _, source_id -> if source_id == get_field(changeset, :target_id) do [source_id: "can't be equal to target_id"] else @@ -89,4 +204,14 @@ defp validate_not_self_relationship(%Ecto.Changeset{} = changeset) do end end) end + + defp validate_target_id_source_id_inequality(%Changeset{} = changeset) do + validate_change(changeset, :target_id, fn _, target_id -> + if target_id == get_field(changeset, :source_id) do + [target_id: "can't be equal to source_id"] + else + [] + end + end) + end end diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index d9f74b6a4..b8a2873d8 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -118,13 +118,29 @@ def decrease_replies_count_if_reply(_object), do: :noop def increase_poll_votes_if_vote(%{ "object" => %{"inReplyTo" => reply_ap_id, "name" => name}, - "type" => "Create" + "type" => "Create", + "actor" => actor }) do - Object.increase_vote_count(reply_ap_id, name) + Object.increase_vote_count(reply_ap_id, name, actor) end def increase_poll_votes_if_vote(_create_data), do: :noop + @spec persist(map(), keyword()) :: {:ok, Activity.t() | Object.t()} + def persist(object, meta) do + with local <- Keyword.fetch!(meta, :local), + {recipients, _, _} <- get_recipients(object), + {:ok, activity} <- + Repo.insert(%Activity{ + data: object, + local: local, + recipients: recipients, + actor: object["actor"] + }) do + {:ok, activity, meta} + end + end + @spec insert(map(), boolean(), boolean(), boolean()) :: {:ok, Activity.t()} | {:error, any()} def insert(map, local \\ true, fake \\ false, bypass_actor_check \\ false) when is_map(map) do with nil <- Activity.normalize(map), @@ -154,12 +170,6 @@ def insert(map, local \\ true, fake \\ false, bypass_actor_check \\ false) when BackgroundWorker.enqueue("fetch_data_for_activity", %{"activity_id" => activity.id}) - Notification.create_notifications(activity) - - conversation = create_or_bump_conversation(activity, map["actor"]) - participations = get_participations(conversation) - stream_out(activity) - stream_out_participations(participations) {:ok, activity} else %Activity{} = activity -> @@ -182,6 +192,15 @@ def insert(map, local \\ true, fake \\ false, bypass_actor_check \\ false) when end end + def notify_and_stream(activity) do + Notification.create_notifications(activity) + + conversation = create_or_bump_conversation(activity, activity.actor) + participations = get_participations(conversation) + stream_out(activity) + stream_out_participations(participations) + end + defp create_or_bump_conversation(activity, actor) do with {:ok, conversation} <- Conversation.create_or_bump_for(activity), %User{} = user <- User.get_cached_by_ap_id(actor), @@ -258,6 +277,7 @@ defp do_create(%{to: to, actor: actor, context: context, object: object} = param _ <- increase_poll_votes_if_vote(create_data), {:quick_insert, false, activity} <- {:quick_insert, quick_insert?, activity}, {:ok, _actor} <- increase_note_count_if_public(actor, activity), + _ <- notify_and_stream(activity), :ok <- maybe_federate(activity) do {:ok, activity} else @@ -285,6 +305,7 @@ def listen(%{to: to, actor: actor, context: context, object: object} = params) d additional ), {:ok, activity} <- insert(listen_data, local), + _ <- notify_and_stream(activity), :ok <- maybe_federate(activity) do {:ok, activity} end @@ -309,6 +330,7 @@ def accept_or_reject(type, %{to: to, actor: actor, object: object} = params) do %{"to" => to, "type" => type, "actor" => actor.ap_id, "object" => object} |> Utils.maybe_put("id", activity_id), {:ok, activity} <- insert(data, local), + _ <- notify_and_stream(activity), :ok <- maybe_federate(activity) do {:ok, activity} end @@ -328,169 +350,12 @@ def update(%{to: to, cc: cc, actor: actor, object: object} = params) do }, data <- Utils.maybe_put(data, "id", activity_id), {:ok, activity} <- insert(data, local), + _ <- notify_and_stream(activity), :ok <- maybe_federate(activity) do {:ok, activity} end end - @spec react_with_emoji(User.t(), Object.t(), String.t(), keyword()) :: - {:ok, Activity.t(), Object.t()} | {:error, any()} - def react_with_emoji(user, object, emoji, options \\ []) do - with {:ok, result} <- - Repo.transaction(fn -> do_react_with_emoji(user, object, emoji, options) end) do - result - end - end - - defp do_react_with_emoji(user, object, emoji, options) do - with local <- Keyword.get(options, :local, true), - activity_id <- Keyword.get(options, :activity_id, nil), - true <- Pleroma.Emoji.is_unicode_emoji?(emoji), - reaction_data <- make_emoji_reaction_data(user, object, emoji, activity_id), - {:ok, activity} <- insert(reaction_data, local), - {:ok, object} <- add_emoji_reaction_to_object(activity, object), - :ok <- maybe_federate(activity) do - {:ok, activity, object} - else - false -> {:error, false} - {:error, error} -> Repo.rollback(error) - end - end - - @spec unreact_with_emoji(User.t(), String.t(), keyword()) :: - {:ok, Activity.t(), Object.t()} | {:error, any()} - def unreact_with_emoji(user, reaction_id, options \\ []) do - with {:ok, result} <- - Repo.transaction(fn -> do_unreact_with_emoji(user, reaction_id, options) end) do - result - end - end - - defp do_unreact_with_emoji(user, reaction_id, options) do - with local <- Keyword.get(options, :local, true), - activity_id <- Keyword.get(options, :activity_id, nil), - user_ap_id <- user.ap_id, - %Activity{actor: ^user_ap_id} = reaction_activity <- Activity.get_by_ap_id(reaction_id), - object <- Object.normalize(reaction_activity), - unreact_data <- make_undo_data(user, reaction_activity, activity_id), - {:ok, activity} <- insert(unreact_data, local), - {:ok, object} <- remove_emoji_reaction_from_object(reaction_activity, object), - :ok <- maybe_federate(activity) do - {:ok, activity, object} - else - {:error, error} -> Repo.rollback(error) - end - end - - # TODO: This is weird, maybe we shouldn't check here if we can make the activity. - @spec like(User.t(), Object.t(), String.t() | nil, boolean()) :: - {:ok, Activity.t(), Object.t()} | {:error, any()} - def like(user, object, activity_id \\ nil, local \\ true) do - with {:ok, result} <- Repo.transaction(fn -> do_like(user, object, activity_id, local) end) do - result - end - end - - defp do_like( - %User{ap_id: ap_id} = user, - %Object{data: %{"id" => _}} = object, - activity_id, - local - ) do - with nil <- get_existing_like(ap_id, object), - like_data <- make_like_data(user, object, activity_id), - {:ok, activity} <- insert(like_data, local), - {:ok, object} <- add_like_to_object(activity, object), - :ok <- maybe_federate(activity) do - {:ok, activity, object} - else - %Activity{} = activity -> - {:ok, activity, object} - - {:error, error} -> - Repo.rollback(error) - end - end - - @spec unlike(User.t(), Object.t(), String.t() | nil, boolean()) :: - {:ok, Activity.t(), Activity.t(), Object.t()} | {:ok, Object.t()} | {:error, any()} - def unlike(%User{} = actor, %Object{} = object, activity_id \\ nil, local \\ true) do - with {:ok, result} <- - Repo.transaction(fn -> do_unlike(actor, object, activity_id, local) end) do - result - end - end - - defp do_unlike(actor, object, activity_id, local) do - with %Activity{} = like_activity <- get_existing_like(actor.ap_id, object), - unlike_data <- make_unlike_data(actor, like_activity, activity_id), - {:ok, unlike_activity} <- insert(unlike_data, local), - {:ok, _activity} <- Repo.delete(like_activity), - {:ok, object} <- remove_like_from_object(like_activity, object), - :ok <- maybe_federate(unlike_activity) do - {:ok, unlike_activity, like_activity, object} - else - nil -> {:ok, object} - {:error, error} -> Repo.rollback(error) - end - end - - @spec announce(User.t(), Object.t(), String.t() | nil, boolean(), boolean()) :: - {:ok, Activity.t(), Object.t()} | {:error, any()} - def announce( - %User{ap_id: _} = user, - %Object{data: %{"id" => _}} = object, - activity_id \\ nil, - local \\ true, - public \\ true - ) do - with {:ok, result} <- - Repo.transaction(fn -> do_announce(user, object, activity_id, local, public) end) do - result - end - end - - defp do_announce(user, object, activity_id, local, public) do - with true <- is_announceable?(object, user, public), - announce_data <- make_announce_data(user, object, activity_id, public), - {:ok, activity} <- insert(announce_data, local), - {:ok, object} <- add_announce_to_object(activity, object), - :ok <- maybe_federate(activity) do - {:ok, activity, object} - else - false -> {:error, false} - {:error, error} -> Repo.rollback(error) - end - end - - @spec unannounce(User.t(), Object.t(), String.t() | nil, boolean()) :: - {:ok, Activity.t(), Object.t()} | {:ok, Object.t()} | {:error, any()} - def unannounce( - %User{} = actor, - %Object{} = object, - activity_id \\ nil, - local \\ true - ) do - with {:ok, result} <- - Repo.transaction(fn -> do_unannounce(actor, object, activity_id, local) end) do - result - end - end - - defp do_unannounce(actor, object, activity_id, local) do - with %Activity{} = announce_activity <- get_existing_announce(actor.ap_id, object), - unannounce_data <- make_unannounce_data(actor, announce_activity, activity_id), - {:ok, unannounce_activity} <- insert(unannounce_data, local), - :ok <- maybe_federate(unannounce_activity), - {:ok, _activity} <- Repo.delete(announce_activity), - {:ok, object} <- remove_announce_from_object(announce_activity, object) do - {:ok, unannounce_activity, object} - else - nil -> {:ok, object} - {:error, error} -> Repo.rollback(error) - end - end - @spec follow(User.t(), User.t(), String.t() | nil, boolean()) :: {:ok, Activity.t()} | {:error, any()} def follow(follower, followed, activity_id \\ nil, local \\ true) do @@ -503,8 +368,8 @@ def follow(follower, followed, activity_id \\ nil, local \\ true) do defp do_follow(follower, followed, activity_id, local) do with data <- make_follow_data(follower, followed, activity_id), {:ok, activity} <- insert(data, local), - :ok <- maybe_federate(activity), - _ <- User.set_follow_state_cache(follower.ap_id, followed.ap_id, activity.data["state"]) do + _ <- notify_and_stream(activity), + :ok <- maybe_federate(activity) do {:ok, activity} else {:error, error} -> Repo.rollback(error) @@ -525,6 +390,7 @@ defp do_unfollow(follower, followed, activity_id, local) do {:ok, follow_activity} <- update_follow_state(follow_activity, "cancelled"), unfollow_data <- make_unfollow_data(follower, followed, follow_activity, activity_id), {:ok, activity} <- insert(unfollow_data, local), + _ <- notify_and_stream(activity), :ok <- maybe_federate(activity) do {:ok, activity} else @@ -533,57 +399,6 @@ defp do_unfollow(follower, followed, activity_id, local) do end end - @spec delete(User.t() | Object.t(), keyword()) :: {:ok, User.t() | Object.t()} | {:error, any()} - def delete(entity, options \\ []) do - with {:ok, result} <- Repo.transaction(fn -> do_delete(entity, options) end) do - result - end - end - - defp do_delete(%User{ap_id: ap_id, follower_address: follower_address} = user, _) do - with data <- %{ - "to" => [follower_address], - "type" => "Delete", - "actor" => ap_id, - "object" => %{"type" => "Person", "id" => ap_id} - }, - {:ok, activity} <- insert(data, true, true, true), - :ok <- maybe_federate(activity) do - {:ok, user} - end - end - - defp do_delete(%Object{data: %{"id" => id, "actor" => actor}} = object, options) do - local = Keyword.get(options, :local, true) - activity_id = Keyword.get(options, :activity_id, nil) - actor = Keyword.get(options, :actor, actor) - - user = User.get_cached_by_ap_id(actor) - to = (object.data["to"] || []) ++ (object.data["cc"] || []) - - with create_activity <- Activity.get_create_by_object_ap_id(id), - data <- - %{ - "type" => "Delete", - "actor" => actor, - "object" => id, - "to" => to, - "deleted_activity_id" => create_activity && create_activity.id - } - |> maybe_put("id", activity_id), - {:ok, activity} <- insert(data, local, false), - {:ok, object, _create_activity} <- Object.delete(object), - stream_out_participations(object, user), - _ <- decrease_replies_count_if_reply(object), - {:ok, _actor} <- decrease_note_count_if_public(user, object), - :ok <- maybe_federate(activity) do - {:ok, activity} - else - {:error, error} -> - Repo.rollback(error) - end - end - @spec block(User.t(), User.t(), String.t() | nil, boolean()) :: {:ok, Activity.t()} | {:error, any()} def block(blocker, blocked, activity_id \\ nil, local \\ true) do @@ -594,7 +409,6 @@ def block(blocker, blocked, activity_id \\ nil, local \\ true) do end defp do_block(blocker, blocked, activity_id, local) do - outgoing_blocks = Config.get([:activitypub, :outgoing_blocks]) unfollow_blocked = Config.get([:activitypub, :unfollow_blocked]) if unfollow_blocked do @@ -602,9 +416,9 @@ defp do_block(blocker, blocked, activity_id, local) do if follow_activity, do: unfollow(blocker, blocked, nil, local) end - with true <- outgoing_blocks, - block_data <- make_block_data(blocker, blocked, activity_id), + with block_data <- make_block_data(blocker, blocked, activity_id), {:ok, activity} <- insert(block_data, local), + _ <- notify_and_stream(activity), :ok <- maybe_federate(activity) do {:ok, activity} else @@ -612,27 +426,6 @@ defp do_block(blocker, blocked, activity_id, local) do end end - @spec unblock(User.t(), User.t(), String.t() | nil, boolean()) :: - {:ok, Activity.t()} | {:error, any()} | nil - def unblock(blocker, blocked, activity_id \\ nil, local \\ true) do - with {:ok, result} <- - Repo.transaction(fn -> do_unblock(blocker, blocked, activity_id, local) end) do - result - end - end - - defp do_unblock(blocker, blocked, activity_id, local) do - with %Activity{} = block_activity <- fetch_latest_block(blocker, blocked), - unblock_data <- make_unblock_data(blocker, blocked, block_activity, activity_id), - {:ok, activity} <- insert(unblock_data, local), - :ok <- maybe_federate(activity) do - {:ok, activity} - else - nil -> nil - {:error, error} -> Repo.rollback(error) - end - end - @spec flag(map()) :: {:ok, Activity.t()} | {:error, any()} def flag( %{ @@ -659,6 +452,7 @@ def flag( with flag_data <- make_flag_data(params, additional), {:ok, activity} <- insert(flag_data, local), {:ok, stripped_activity} <- strip_report_status_data(activity), + _ <- notify_and_stream(activity), :ok <- maybe_federate(stripped_activity) do User.all_superusers() |> Enum.filter(fn user -> not is_nil(user.email) end) @@ -682,7 +476,8 @@ def move(%User{} = origin, %User{} = target, local \\ true) do } with true <- origin.ap_id in target.also_known_as, - {:ok, activity} <- insert(params, local) do + {:ok, activity} <- insert(params, local), + _ <- notify_and_stream(activity) do maybe_federate(activity) BackgroundWorker.enqueue("move_following", %{ @@ -697,7 +492,7 @@ def move(%User{} = origin, %User{} = target, local \\ true) do end end - defp fetch_activities_for_context_query(context, opts) do + def fetch_activities_for_context_query(context, opts) do public = [Constants.as_public()] recipients = @@ -743,14 +538,27 @@ def fetch_latest_activity_id_for_context(context, opts \\ %{}) do |> Repo.one() end - @spec fetch_public_activities(map(), Pagination.type()) :: [Activity.t()] - def fetch_public_activities(opts \\ %{}, pagination \\ :keyset) do + @spec fetch_public_or_unlisted_activities(map(), Pagination.type()) :: [Activity.t()] + def fetch_public_or_unlisted_activities(opts \\ %{}, pagination \\ :keyset) do opts = Map.drop(opts, ["user"]) - [Constants.as_public()] - |> fetch_activities_query(opts) - |> restrict_unlisted() - |> Pagination.fetch_paginated(opts, pagination) + query = fetch_activities_query([Constants.as_public()], opts) + + query = + if opts["restrict_unlisted"] do + restrict_unlisted(query) + else + query + end + + Pagination.fetch_paginated(query, opts, pagination) + end + + @spec fetch_public_activities(map(), Pagination.type()) :: [Activity.t()] + def fetch_public_activities(opts \\ %{}, pagination \\ :keyset) do + opts + |> Map.put("restrict_unlisted", true) + |> fetch_public_or_unlisted_activities(pagination) end @valid_visibilities ~w[direct unlisted public private] @@ -829,7 +637,7 @@ defp exclude_visibility(query, %{"exclude_visibilities" => visibility}) end defp exclude_visibility(query, %{"exclude_visibilities" => visibility}) - when visibility not in @valid_visibilities do + when visibility not in [nil | @valid_visibilities] do Logger.error("Could not exclude visibility to #{visibility}") query end @@ -1036,7 +844,7 @@ defp restrict_media(_query, %{"only_media" => _val, "skip_preload" => true}) do raise "Can't use the child object without preloading!" end - defp restrict_media(query, %{"only_media" => val}) when val == "true" or val == "1" do + defp restrict_media(query, %{"only_media" => val}) when val in [true, "true", "1"] do from( [_activity, object] in query, where: fragment("not (?)->'attachment' = (?)", object.data, ^[]) @@ -1045,16 +853,51 @@ defp restrict_media(query, %{"only_media" => val}) when val == "true" or val == defp restrict_media(query, _), do: query - defp restrict_replies(query, %{"exclude_replies" => val}) when val == "true" or val == "1" do + defp restrict_replies(query, %{"exclude_replies" => val}) when val in [true, "true", "1"] do from( [_activity, object] in query, where: fragment("?->>'inReplyTo' is null", object.data) ) end + defp restrict_replies(query, %{ + "reply_filtering_user" => user, + "reply_visibility" => "self" + }) do + from( + [activity, object] in query, + where: + fragment( + "?->>'inReplyTo' is null OR ? = ANY(?)", + object.data, + ^user.ap_id, + activity.recipients + ) + ) + end + + defp restrict_replies(query, %{ + "reply_filtering_user" => user, + "reply_visibility" => "following" + }) do + from( + [activity, object] in query, + where: + fragment( + "?->>'inReplyTo' is null OR ? && array_remove(?, ?) OR ? = ?", + object.data, + ^[user.ap_id | User.get_cached_user_friends_ap_ids(user)], + activity.recipients, + activity.actor, + activity.actor, + ^user.ap_id + ) + ) + end + defp restrict_replies(query, _), do: query - defp restrict_reblogs(query, %{"exclude_reblogs" => val}) when val == "true" or val == "1" do + defp restrict_reblogs(query, %{"exclude_reblogs" => val}) when val in [true, "true", "1"] do from(activity in query, where: fragment("?->>'type' != 'Announce'", activity.data)) end @@ -1133,7 +976,12 @@ defp restrict_unlisted(query) do ) end - defp restrict_pinned(query, %{"pinned" => "true", "pinned_activity_ids" => ids}) do + # TODO: when all endpoints migrated to OpenAPI compare `pinned` with `true` (boolean) only, + # the same for `restrict_media/2`, `restrict_replies/2`, 'restrict_reblogs/2' + # and `restrict_muted/2` + + defp restrict_pinned(query, %{"pinned" => pinned, "pinned_activity_ids" => ids}) + when pinned in [true, "true", "1"] do from(activity in query, where: activity.id in ^ids) end @@ -1230,17 +1078,17 @@ defp maybe_order(query, _), do: query defp fetch_activities_query_ap_ids_ops(opts) do source_user = opts["muting_user"] - ap_id_relations = if source_user, do: [:mute, :reblog_mute], else: [] + ap_id_relationships = if source_user, do: [:mute, :reblog_mute], else: [] - ap_id_relations = - ap_id_relations ++ + ap_id_relationships = + ap_id_relationships ++ if opts["blocking_user"] && opts["blocking_user"] == source_user do [:block] else [] end - preloaded_ap_ids = User.outgoing_relations_ap_ids(source_user, ap_id_relations) + preloaded_ap_ids = User.outgoing_relationships_ap_ids(source_user, ap_id_relationships) restrict_blocked_opts = Map.merge(%{"blocked_users_ap_ids" => preloaded_ap_ids[:block]}, opts) restrict_muted_opts = Map.merge(%{"muted_users_ap_ids" => preloaded_ap_ids[:mute]}, opts) @@ -1266,6 +1114,7 @@ def fetch_activities_query(recipients, opts \\ %{}) do |> maybe_set_thread_muted_field(opts) |> maybe_order(opts) |> restrict_recipients(recipients, opts["user"]) + |> restrict_replies(opts) |> restrict_tag(opts) |> restrict_tag_reject(opts) |> restrict_tag_all(opts) @@ -1280,7 +1129,6 @@ def fetch_activities_query(recipients, opts \\ %{}) do |> restrict_media(opts) |> restrict_visibility(opts) |> restrict_thread_visibility(opts, config) - |> restrict_replies(opts) |> restrict_reblogs(opts) |> restrict_pinned(opts) |> restrict_muted_reblogs(restrict_muted_reblogs_opts) @@ -1310,7 +1158,7 @@ def fetch_favourites(user, params \\ %{}, pagination \\ :keyset) do |> Activity.with_joined_object() |> Object.with_joined_activity() |> select([_like, object, activity], %{activity | object: object}) - |> order_by([like, _, _], desc: like.id) + |> order_by([like, _, _], desc_nulls_last: like.id) |> Pagination.fetch_paginated( Map.merge(params, %{"skip_order" => true}), pagination, @@ -1370,6 +1218,18 @@ def upload(file, opts \\ []) do end end + @spec get_actor_url(any()) :: binary() | nil + defp get_actor_url(url) when is_binary(url), do: url + defp get_actor_url(%{"href" => href}) when is_binary(href), do: href + + defp get_actor_url(url) when is_list(url) do + url + |> List.first() + |> get_actor_url() + end + + defp get_actor_url(_url), do: nil + defp object_to_user_data(data) do avatar = data["icon"]["url"] && @@ -1391,18 +1251,44 @@ defp object_to_user_data(data) do |> Enum.filter(fn %{"type" => t} -> t == "PropertyValue" end) |> Enum.map(fn fields -> Map.take(fields, ["name", "value"]) end) + emojis = + data + |> Map.get("tag", []) + |> Enum.filter(fn + %{"type" => "Emoji"} -> true + _ -> false + end) + |> Enum.reduce(%{}, fn %{"icon" => %{"url" => url}, "name" => name}, acc -> + Map.put(acc, String.trim(name, ":"), url) + end) + locked = data["manuallyApprovesFollowers"] || false data = Transmogrifier.maybe_fix_user_object(data) discoverable = data["discoverable"] || false invisible = data["invisible"] || false actor_type = data["type"] || "Person" + public_key = + if is_map(data["publicKey"]) && is_binary(data["publicKey"]["publicKeyPem"]) do + data["publicKey"]["publicKeyPem"] + else + nil + end + + shared_inbox = + if is_map(data["endpoints"]) && is_binary(data["endpoints"]["sharedInbox"]) do + data["endpoints"]["sharedInbox"] + else + nil + end + user_data = %{ ap_id: data["id"], + uri: get_actor_url(data["url"]), ap_enabled: true, - source_data: data, banner: banner, fields: fields, + emoji: emojis, locked: locked, discoverable: discoverable, invisible: invisible, @@ -1412,7 +1298,10 @@ defp object_to_user_data(data) do following_address: data["following"], bio: data["summary"], actor_type: actor_type, - also_known_as: Map.get(data, "alsoKnownAs", []) + also_known_as: Map.get(data, "alsoKnownAs", []), + public_key: public_key, + inbox: data["inbox"], + shared_inbox: shared_inbox } # nickname can be nil because of virtual actors @@ -1453,21 +1342,34 @@ def fetch_follow_information_for_user(user) do defp normalize_counter(counter) when is_integer(counter), do: counter defp normalize_counter(_), do: 0 - defp maybe_update_follow_information(data) do + def maybe_update_follow_information(user_data) do with {:enabled, true} <- {:enabled, Config.get([:instance, :external_user_synchronization])}, - {:ok, info} <- fetch_follow_information_for_user(data) do - info = Map.merge(data[:info] || %{}, info) - Map.put(data, :info, info) + {_, true} <- {:user_type_check, user_data[:type] in ["Person", "Service"]}, + {_, true} <- + {:collections_available, + !!(user_data[:following_address] && user_data[:follower_address])}, + {:ok, info} <- + fetch_follow_information_for_user(user_data) do + info = Map.merge(user_data[:info] || %{}, info) + + user_data + |> Map.put(:info, info) else + {:user_type_check, false} -> + user_data + + {:collections_available, false} -> + user_data + {:enabled, false} -> - data + user_data e -> Logger.error( - "Follower/Following counter update for #{data.ap_id} failed.\n" <> inspect(e) + "Follower/Following counter update for #{user_data.ap_id} failed.\n" <> inspect(e) ) - data + user_data end end @@ -1514,11 +1416,22 @@ def fetch_and_prepare_user_from_ap_id(ap_id) do end def make_user_from_ap_id(ap_id) do - if _user = User.get_cached_by_ap_id(ap_id) do + user = User.get_cached_by_ap_id(ap_id) + + if user && !User.ap_enabled?(user) do Transmogrifier.upgrade_user_from_ap_id(ap_id) else with {:ok, data} <- fetch_and_prepare_user_from_ap_id(ap_id) do - User.insert_or_update_user(data) + if user do + user + |> User.remote_user_changeset(data) + |> User.update_and_set_cache() + else + data + |> User.remote_user_changeset() + |> Repo.insert() + |> User.set_cache() + end else e -> {:error, e} end diff --git a/lib/pleroma/web/activity_pub/activity_pub_controller.ex b/lib/pleroma/web/activity_pub/activity_pub_controller.ex index 8b9eb4a2c..28727d619 100644 --- a/lib/pleroma/web/activity_pub/activity_pub_controller.ex +++ b/lib/pleroma/web/activity_pub/activity_pub_controller.ex @@ -12,13 +12,16 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do alias Pleroma.Plugs.EnsureAuthenticatedPlug alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub + alias Pleroma.Web.ActivityPub.Builder alias Pleroma.Web.ActivityPub.InternalFetchActor alias Pleroma.Web.ActivityPub.ObjectView + alias Pleroma.Web.ActivityPub.Pipeline alias Pleroma.Web.ActivityPub.Relay alias Pleroma.Web.ActivityPub.Transmogrifier alias Pleroma.Web.ActivityPub.UserView alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.ActivityPub.Visibility + alias Pleroma.Web.Endpoint alias Pleroma.Web.FederatingPlug alias Pleroma.Web.Federator @@ -32,12 +35,13 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do plug( EnsureAuthenticatedPlug, - [unless_func: &FederatingPlug.federating?/0] when action not in @federating_only_actions + [unless_func: &FederatingPlug.federating?/1] when action not in @federating_only_actions ) + # Note: :following and :followers must be served even without authentication (as via :api) plug( EnsureAuthenticatedPlug - when action in [:read_inbox, :update_outbox, :whoami, :upload_media, :following, :followers] + when action in [:read_inbox, :update_outbox, :whoami, :upload_media] ) plug( @@ -72,8 +76,8 @@ def user(conn, %{"nickname" => nickname}) do end end - def object(conn, %{"uuid" => uuid}) do - with ap_id <- o_status_url(conn, :object, uuid), + def object(conn, _) do + with ap_id <- Endpoint.url() <> conn.request_path, %Object{} = object <- Object.get_cached_by_ap_id(ap_id), {_, true} <- {:public?, Visibility.is_public?(object)} do conn @@ -98,8 +102,8 @@ def track_object_fetch(conn, object_id) do conn end - def activity(conn, %{"uuid" => uuid}) do - with ap_id <- o_status_url(conn, :activity, uuid), + def activity(conn, _params) do + with ap_id <- Endpoint.url() <> conn.request_path, %Activity{} = activity <- Activity.normalize(ap_id), {_, true} <- {:public?, Visibility.is_public?(activity)} do conn @@ -393,7 +397,10 @@ def read_inbox(%{assigns: %{user: %User{nickname: as_nickname}}} = conn, %{ |> json(err) end - defp handle_user_activity(%User{} = user, %{"type" => "Create"} = params) do + defp handle_user_activity( + %User{} = user, + %{"type" => "Create", "object" => %{"type" => "Note"}} = params + ) do object = params["object"] |> Map.merge(Map.take(params, ["to", "cc"])) @@ -412,7 +419,8 @@ defp handle_user_activity(%User{} = user, %{"type" => "Create"} = params) do defp handle_user_activity(%User{} = user, %{"type" => "Delete"} = params) do with %Object{} = object <- Object.normalize(params["object"]), true <- user.is_moderator || user.ap_id == object.data["actor"], - {:ok, delete} <- ActivityPub.delete(object) do + {:ok, delete_data, _} <- Builder.delete(user, object.data["id"]), + {:ok, delete, _} <- Pipeline.common_pipeline(delete_data, local: true) do {:ok, delete} else _ -> {:error, dgettext("errors", "Can't delete object")} @@ -421,7 +429,10 @@ defp handle_user_activity(%User{} = user, %{"type" => "Delete"} = params) do defp handle_user_activity(%User{} = user, %{"type" => "Like"} = params) do with %Object{} = object <- Object.normalize(params["object"]), - {:ok, activity, _object} <- ActivityPub.like(user, object) do + {_, {:ok, like_object, meta}} <- {:build_object, Builder.like(user, object)}, + {_, {:ok, %Activity{} = activity, _meta}} <- + {:common_pipeline, + Pipeline.common_pipeline(like_object, Keyword.put(meta, :local, true))} do {:ok, activity} else _ -> {:error, dgettext("errors", "Can't like object")} diff --git a/lib/pleroma/web/activity_pub/builder.ex b/lib/pleroma/web/activity_pub/builder.ex new file mode 100644 index 000000000..51b74414a --- /dev/null +++ b/lib/pleroma/web/activity_pub/builder.ex @@ -0,0 +1,146 @@ +defmodule Pleroma.Web.ActivityPub.Builder do + @moduledoc """ + This module builds the objects. Meant to be used for creating local objects. + + This module encodes our addressing policies and general shape of our objects. + """ + + alias Pleroma.Object + alias Pleroma.User + alias Pleroma.Web.ActivityPub.Relay + alias Pleroma.Web.ActivityPub.Utils + alias Pleroma.Web.ActivityPub.Visibility + + require Pleroma.Constants + + @spec emoji_react(User.t(), Object.t(), String.t()) :: {:ok, map(), keyword()} + def emoji_react(actor, object, emoji) do + with {:ok, data, meta} <- object_action(actor, object) do + data = + data + |> Map.put("content", emoji) + |> Map.put("type", "EmojiReact") + + {:ok, data, meta} + end + end + + @spec undo(User.t(), Activity.t()) :: {:ok, map(), keyword()} + def undo(actor, object) do + {:ok, + %{ + "id" => Utils.generate_activity_id(), + "actor" => actor.ap_id, + "type" => "Undo", + "object" => object.data["id"], + "to" => object.data["to"] || [], + "cc" => object.data["cc"] || [] + }, []} + end + + @spec delete(User.t(), String.t()) :: {:ok, map(), keyword()} + def delete(actor, object_id) do + object = Object.normalize(object_id, false) + + user = !object && User.get_cached_by_ap_id(object_id) + + to = + case {object, user} do + {%Object{}, _} -> + # We are deleting an object, address everyone who was originally mentioned + (object.data["to"] || []) ++ (object.data["cc"] || []) + + {_, %User{follower_address: follower_address}} -> + # We are deleting a user, address the followers of that user + [follower_address] + end + + {:ok, + %{ + "id" => Utils.generate_activity_id(), + "actor" => actor.ap_id, + "object" => object_id, + "to" => to, + "type" => "Delete" + }, []} + end + + @spec tombstone(String.t(), String.t()) :: {:ok, map(), keyword()} + def tombstone(actor, id) do + {:ok, + %{ + "id" => id, + "actor" => actor, + "type" => "Tombstone" + }, []} + end + + @spec like(User.t(), Object.t()) :: {:ok, map(), keyword()} + def like(actor, object) do + with {:ok, data, meta} <- object_action(actor, object) do + data = + data + |> Map.put("type", "Like") + + {:ok, data, meta} + end + end + + @spec announce(User.t(), Object.t(), keyword()) :: {:ok, map(), keyword()} + def announce(actor, object, options \\ []) do + public? = Keyword.get(options, :public, false) + + to = + cond do + actor.ap_id == Relay.relay_ap_id() -> + [actor.follower_address] + + public? -> + [actor.follower_address, object.data["actor"], Pleroma.Constants.as_public()] + + true -> + [actor.follower_address, object.data["actor"]] + end + + {:ok, + %{ + "id" => Utils.generate_activity_id(), + "actor" => actor.ap_id, + "object" => object.data["id"], + "to" => to, + "context" => object.data["context"], + "type" => "Announce", + "published" => Utils.make_date() + }, []} + end + + @spec object_action(User.t(), Object.t()) :: {:ok, map(), keyword()} + defp object_action(actor, object) do + object_actor = User.get_cached_by_ap_id(object.data["actor"]) + + # Address the actor of the object, and our actor's follower collection if the post is public. + to = + if Visibility.is_public?(object) do + [actor.follower_address, object.data["actor"]] + else + [object.data["actor"]] + end + + # CC everyone who's been addressed in the object, except ourself and the object actor's + # follower collection + cc = + (object.data["to"] ++ (object.data["cc"] || [])) + |> List.delete(actor.ap_id) + |> List.delete(object_actor.follower_address) + + {:ok, + %{ + "id" => Utils.generate_activity_id(), + "actor" => actor.ap_id, + "object" => object.data["id"], + "to" => to, + "cc" => cc, + "context" => object.data["context"] + }, []} + end +end diff --git a/lib/pleroma/web/activity_pub/mrf/anti_followbot_policy.ex b/lib/pleroma/web/activity_pub/mrf/anti_followbot_policy.ex index b3547ecd4..0270b96ae 100644 --- a/lib/pleroma/web/activity_pub/mrf/anti_followbot_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/anti_followbot_policy.ex @@ -1,5 +1,5 @@ # Pleroma: A lightweight social networking server -# Copyright © 2019 Pleroma Authors +# Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Web.ActivityPub.MRF.AntiFollowbotPolicy do 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 d9a0acfd3..dfab105a3 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,17 +12,23 @@ defmodule Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy do require Logger - @hackney_options [ - pool: :media, - recv_timeout: 10_000 + @options [ + pool: :media ] def perform(:prefetch, url) do Logger.debug("Prefetching #{inspect(url)}") + opts = + if Application.get_env(:tesla, :adapter) == Tesla.Adapter.Hackney do + Keyword.put(@options, :recv_timeout, 10_000) + else + @options + end + url |> MediaProxy.url() - |> HTTP.get([], adapter: @hackney_options) + |> HTTP.get([], adapter: opts) end def perform(:preload, %{"object" => %{"attachment" => attachments}} = _message) do diff --git a/lib/pleroma/web/activity_pub/mrf/no_placeholder_text_policy.ex b/lib/pleroma/web/activity_pub/mrf/no_placeholder_text_policy.ex index f67f48ab6..fc3475048 100644 --- a/lib/pleroma/web/activity_pub/mrf/no_placeholder_text_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/no_placeholder_text_policy.ex @@ -1,5 +1,5 @@ # Pleroma: A lightweight social networking server -# Copyright © 2019 Pleroma Authors +# Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Web.ActivityPub.MRF.NoPlaceholderTextPolicy do diff --git a/lib/pleroma/web/activity_pub/mrf/object_age_policy.ex b/lib/pleroma/web/activity_pub/mrf/object_age_policy.ex index 4a8bc91ae..b0ccb63c8 100644 --- a/lib/pleroma/web/activity_pub/mrf/object_age_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/object_age_policy.ex @@ -11,7 +11,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.ObjectAgePolicy do @moduledoc "Filter activities depending on their age" @behaviour Pleroma.Web.ActivityPub.MRF - defp check_date(%{"published" => published} = message) do + defp check_date(%{"object" => %{"published" => published}} = message) do with %DateTime{} = now <- DateTime.utc_now(), {:ok, %DateTime{} = then, _} <- DateTime.from_iso8601(published), max_ttl <- Config.get([:mrf_object_age, :threshold]), @@ -96,5 +96,11 @@ def filter(%{"type" => "Create", "published" => _} = message) do def filter(message), do: {:ok, message} @impl true - def describe, do: {:ok, %{}} + def describe do + mrf_object_age = + Pleroma.Config.get(:mrf_object_age) + |> Enum.into(%{}) + + {:ok, %{mrf_object_age: mrf_object_age}} + end end diff --git a/lib/pleroma/web/activity_pub/mrf/simple_policy.ex b/lib/pleroma/web/activity_pub/mrf/simple_policy.ex index 4edc007fd..b7dcb1b86 100644 --- a/lib/pleroma/web/activity_pub/mrf/simple_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/simple_policy.ex @@ -148,6 +148,21 @@ defp check_banner_removal(%{host: actor_host} = _actor_info, %{"image" => _image defp check_banner_removal(_actor_info, object), do: {:ok, object} + @impl true + def filter(%{"type" => "Delete", "actor" => actor} = object) do + %{host: actor_host} = URI.parse(actor) + + reject_deletes = + Pleroma.Config.get([:mrf_simple, :reject_deletes]) + |> MRF.subdomains_regex() + + if MRF.subdomain_match?(reject_deletes, actor_host) do + {:reject, nil} + else + {:ok, object} + end + end + @impl true def filter(%{"actor" => actor} = object) do actor_info = URI.parse(actor) diff --git a/lib/pleroma/web/activity_pub/mrf/steal_emoji_policy.ex b/lib/pleroma/web/activity_pub/mrf/steal_emoji_policy.ex new file mode 100644 index 000000000..2858af9eb --- /dev/null +++ b/lib/pleroma/web/activity_pub/mrf/steal_emoji_policy.ex @@ -0,0 +1,97 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.MRF.StealEmojiPolicy do + require Logger + + alias Pleroma.Config + + @moduledoc "Detect new emojis by their shortcode and steals them" + @behaviour Pleroma.Web.ActivityPub.MRF + + defp remote_host?(host), do: host != Config.get([Pleroma.Web.Endpoint, :url, :host]) + + defp accept_host?(host), do: host in Config.get([:mrf_steal_emoji, :hosts], []) + + defp steal_emoji({shortcode, url}) do + url = Pleroma.Web.MediaProxy.url(url) + {:ok, response} = Pleroma.HTTP.get(url) + size_limit = Config.get([:mrf_steal_emoji, :size_limit], 50_000) + + if byte_size(response.body) <= size_limit do + emoji_dir_path = + Config.get( + [:mrf_steal_emoji, :path], + Path.join(Config.get([:instance, :static_dir]), "emoji/stolen") + ) + + extension = + url + |> URI.parse() + |> Map.get(:path) + |> Path.basename() + |> Path.extname() + + file_path = Path.join([emoji_dir_path, shortcode <> (extension || ".png")]) + + try do + :ok = File.write(file_path, response.body) + + shortcode + rescue + e -> + Logger.warn("MRF.StealEmojiPolicy: Failed to write to #{file_path}: #{inspect(e)}") + nil + end + else + Logger.debug( + "MRF.StealEmojiPolicy: :#{shortcode}: at #{url} (#{byte_size(response.body)} B) over size limit (#{ + size_limit + } B)" + ) + + nil + end + rescue + e -> + Logger.warn("MRF.StealEmojiPolicy: Failed to fetch #{url}: #{inspect(e)}") + nil + end + + @impl true + def filter(%{"object" => %{"emoji" => foreign_emojis, "actor" => actor}} = message) do + host = URI.parse(actor).host + + if remote_host?(host) and accept_host?(host) do + installed_emoji = Pleroma.Emoji.get_all() |> Enum.map(fn {k, _} -> k end) + + new_emojis = + foreign_emojis + |> Enum.filter(fn {shortcode, _url} -> shortcode not in installed_emoji end) + |> Enum.filter(fn {shortcode, _url} -> + reject_emoji? = + Config.get([:mrf_steal_emoji, :rejected_shortcodes], []) + |> Enum.find(false, fn regex -> String.match?(shortcode, regex) end) + + !reject_emoji? + end) + |> Enum.map(&steal_emoji(&1)) + |> Enum.filter(& &1) + + if !Enum.empty?(new_emojis) do + Logger.info("Stole new emojis: #{inspect(new_emojis)}") + Pleroma.Emoji.reload() + end + end + + {:ok, message} + end + + def filter(message), do: {:ok, message} + + @impl true + def describe do + {:ok, %{}} + end +end diff --git a/lib/pleroma/web/activity_pub/object_validator.ex b/lib/pleroma/web/activity_pub/object_validator.ex new file mode 100644 index 000000000..2599067a8 --- /dev/null +++ b/lib/pleroma/web/activity_pub/object_validator.ex @@ -0,0 +1,94 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.ObjectValidator do + @moduledoc """ + This module is responsible for validating an object (which can be an activity) + and checking if it is both well formed and also compatible with our view of + the system. + """ + + alias Pleroma.Object + alias Pleroma.User + alias Pleroma.Web.ActivityPub.ObjectValidators.AnnounceValidator + alias Pleroma.Web.ActivityPub.ObjectValidators.DeleteValidator + alias Pleroma.Web.ActivityPub.ObjectValidators.EmojiReactValidator + alias Pleroma.Web.ActivityPub.ObjectValidators.LikeValidator + alias Pleroma.Web.ActivityPub.ObjectValidators.Types + alias Pleroma.Web.ActivityPub.ObjectValidators.UndoValidator + + @spec validate(map(), keyword()) :: {:ok, map(), keyword()} | {:error, any()} + def validate(object, meta) + + def validate(%{"type" => "Undo"} = object, meta) do + with {:ok, object} <- + object + |> UndoValidator.cast_and_validate() + |> Ecto.Changeset.apply_action(:insert) do + object = stringify_keys(object) + {:ok, object, meta} + end + end + + def validate(%{"type" => "Delete"} = object, meta) do + with cng <- DeleteValidator.cast_and_validate(object), + do_not_federate <- DeleteValidator.do_not_federate?(cng), + {:ok, object} <- Ecto.Changeset.apply_action(cng, :insert) do + object = stringify_keys(object) + meta = Keyword.put(meta, :do_not_federate, do_not_federate) + {:ok, object, meta} + end + end + + def validate(%{"type" => "Like"} = object, meta) do + with {:ok, object} <- + object |> LikeValidator.cast_and_validate() |> Ecto.Changeset.apply_action(:insert) do + object = stringify_keys(object |> Map.from_struct()) + {:ok, object, meta} + end + end + + def validate(%{"type" => "EmojiReact"} = object, meta) do + with {:ok, object} <- + object + |> EmojiReactValidator.cast_and_validate() + |> Ecto.Changeset.apply_action(:insert) do + object = stringify_keys(object |> Map.from_struct()) + {:ok, object, meta} + end + end + + def validate(%{"type" => "Announce"} = object, meta) do + with {:ok, object} <- + object + |> AnnounceValidator.cast_and_validate() + |> Ecto.Changeset.apply_action(:insert) do + object = stringify_keys(object |> Map.from_struct()) + {:ok, object, meta} + end + end + + def stringify_keys(%{__struct__: _} = object) do + object + |> Map.from_struct() + |> stringify_keys + end + + def stringify_keys(object) do + object + |> Map.new(fn {key, val} -> {to_string(key), val} end) + end + + def fetch_actor(object) do + with {:ok, actor} <- Types.ObjectID.cast(object["actor"]) do + User.get_or_fetch_by_ap_id(actor) + end + end + + def fetch_actor_and_object(object) do + fetch_actor(object) + Object.normalize(object["object"], true) + :ok + end +end diff --git a/lib/pleroma/web/activity_pub/object_validators/announce_validator.ex b/lib/pleroma/web/activity_pub/object_validators/announce_validator.ex new file mode 100644 index 000000000..40f861f47 --- /dev/null +++ b/lib/pleroma/web/activity_pub/object_validators/announce_validator.ex @@ -0,0 +1,101 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.ObjectValidators.AnnounceValidator do + use Ecto.Schema + + alias Pleroma.Object + alias Pleroma.User + alias Pleroma.Web.ActivityPub.ObjectValidators.Types + alias Pleroma.Web.ActivityPub.Utils + alias Pleroma.Web.ActivityPub.Visibility + + import Ecto.Changeset + import Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations + + require Pleroma.Constants + + @primary_key false + + embedded_schema do + field(:id, Types.ObjectID, primary_key: true) + field(:type, :string) + field(:object, Types.ObjectID) + field(:actor, Types.ObjectID) + field(:context, :string, autogenerate: {Utils, :generate_context_id, []}) + field(:to, Types.Recipients, default: []) + field(:cc, Types.Recipients, default: []) + field(:published, Types.DateTime) + end + + def cast_and_validate(data) do + data + |> cast_data() + |> validate_data() + end + + def cast_data(data) do + %__MODULE__{} + |> changeset(data) + end + + def changeset(struct, data) do + struct + |> cast(data, __schema__(:fields)) + |> fix_after_cast() + end + + def fix_after_cast(cng) do + cng + end + + def validate_data(data_cng) do + data_cng + |> validate_inclusion(:type, ["Announce"]) + |> validate_required([:id, :type, :object, :actor, :to, :cc]) + |> validate_actor_presence() + |> validate_object_presence() + |> validate_existing_announce() + |> validate_announcable() + end + + def validate_announcable(cng) do + with actor when is_binary(actor) <- get_field(cng, :actor), + object when is_binary(object) <- get_field(cng, :object), + %User{} = actor <- User.get_cached_by_ap_id(actor), + %Object{} = object <- Object.get_cached_by_ap_id(object), + false <- Visibility.is_public?(object) do + same_actor = object.data["actor"] == actor.ap_id + is_public = Pleroma.Constants.as_public() in (get_field(cng, :to) ++ get_field(cng, :cc)) + + cond do + same_actor && is_public -> + cng + |> add_error(:actor, "can not announce this object publicly") + + !same_actor -> + cng + |> add_error(:actor, "can not announce this object") + + true -> + cng + end + else + _ -> cng + end + end + + def validate_existing_announce(cng) do + actor = get_field(cng, :actor) + object = get_field(cng, :object) + + if actor && object && Utils.get_existing_announce(actor, %{data: %{"id" => object}}) do + cng + |> add_error(:actor, "already announced this object") + |> add_error(:object, "already announced by this actor") + else + cng + end + end +end diff --git a/lib/pleroma/web/activity_pub/object_validators/common_validations.ex b/lib/pleroma/web/activity_pub/object_validators/common_validations.ex new file mode 100644 index 000000000..aeef31945 --- /dev/null +++ b/lib/pleroma/web/activity_pub/object_validators/common_validations.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.ActivityPub.ObjectValidators.CommonValidations do + import Ecto.Changeset + + alias Pleroma.Activity + alias Pleroma.Object + alias Pleroma.User + + def validate_recipients_presence(cng, fields \\ [:to, :cc]) do + non_empty = + fields + |> Enum.map(fn field -> get_field(cng, field) end) + |> Enum.any?(fn + [] -> false + _ -> true + end) + + if non_empty do + cng + else + fields + |> Enum.reduce(cng, fn field, cng -> + cng + |> add_error(field, "no recipients in any field") + end) + end + end + + def validate_actor_presence(cng, options \\ []) do + field_name = Keyword.get(options, :field_name, :actor) + + cng + |> validate_change(field_name, fn field_name, actor -> + if User.get_cached_by_ap_id(actor) do + [] + else + [{field_name, "can't find user"}] + end + end) + end + + def validate_object_presence(cng, options \\ []) do + field_name = Keyword.get(options, :field_name, :object) + allowed_types = Keyword.get(options, :allowed_types, false) + + cng + |> validate_change(field_name, fn field_name, object_id -> + object = Object.get_cached_by_ap_id(object_id) || Activity.get_by_ap_id(object_id) + + cond do + !object -> + [{field_name, "can't find object"}] + + object && allowed_types && object.data["type"] not in allowed_types -> + [{field_name, "object not in allowed types"}] + + true -> + [] + end + end) + end + + def validate_object_or_user_presence(cng, options \\ []) do + field_name = Keyword.get(options, :field_name, :object) + options = Keyword.put(options, :field_name, field_name) + + actor_cng = + cng + |> validate_actor_presence(options) + + object_cng = + cng + |> validate_object_presence(options) + + if actor_cng.valid?, do: actor_cng, else: object_cng + end +end diff --git a/lib/pleroma/web/activity_pub/object_validators/create_validator.ex b/lib/pleroma/web/activity_pub/object_validators/create_validator.ex new file mode 100644 index 000000000..926804ce7 --- /dev/null +++ b/lib/pleroma/web/activity_pub/object_validators/create_validator.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.ActivityPub.ObjectValidators.CreateNoteValidator do + use Ecto.Schema + + alias Pleroma.Web.ActivityPub.ObjectValidators.NoteValidator + alias Pleroma.Web.ActivityPub.ObjectValidators.Types + + import Ecto.Changeset + + @primary_key false + + embedded_schema do + field(:id, Types.ObjectID, primary_key: true) + field(:actor, Types.ObjectID) + field(:type, :string) + field(:to, {:array, :string}) + field(:cc, {:array, :string}) + field(:bto, {:array, :string}, default: []) + field(:bcc, {:array, :string}, default: []) + + embeds_one(:object, NoteValidator) + end + + def cast_data(data) do + cast(%__MODULE__{}, data, __schema__(:fields)) + end +end diff --git a/lib/pleroma/web/activity_pub/object_validators/delete_validator.ex b/lib/pleroma/web/activity_pub/object_validators/delete_validator.ex new file mode 100644 index 000000000..f42c03510 --- /dev/null +++ b/lib/pleroma/web/activity_pub/object_validators/delete_validator.ex @@ -0,0 +1,100 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.ObjectValidators.DeleteValidator do + use Ecto.Schema + + alias Pleroma.Activity + alias Pleroma.User + alias Pleroma.Web.ActivityPub.ObjectValidators.Types + + import Ecto.Changeset + import Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations + + @primary_key false + + embedded_schema do + field(:id, Types.ObjectID, primary_key: true) + field(:type, :string) + field(:actor, Types.ObjectID) + field(:to, Types.Recipients, default: []) + field(:cc, Types.Recipients, default: []) + field(:deleted_activity_id, Types.ObjectID) + field(:object, Types.ObjectID) + end + + def cast_data(data) do + %__MODULE__{} + |> cast(data, __schema__(:fields)) + end + + def add_deleted_activity_id(cng) do + object = + cng + |> get_field(:object) + + with %Activity{id: id} <- Activity.get_create_by_object_ap_id(object) do + cng + |> put_change(:deleted_activity_id, id) + else + _ -> cng + end + end + + @deletable_types ~w{ + Answer + Article + Audio + Event + Note + Page + Question + Video + Tombstone + } + def validate_data(cng) do + cng + |> validate_required([:id, :type, :actor, :to, :cc, :object]) + |> validate_inclusion(:type, ["Delete"]) + |> validate_actor_presence() + |> validate_deletion_rights() + |> validate_object_or_user_presence(allowed_types: @deletable_types) + |> add_deleted_activity_id() + end + + def do_not_federate?(cng) do + !same_domain?(cng) + end + + defp same_domain?(cng) do + actor_uri = + cng + |> get_field(:actor) + |> URI.parse() + + object_uri = + cng + |> get_field(:object) + |> URI.parse() + + object_uri.host == actor_uri.host + end + + def validate_deletion_rights(cng) do + actor = User.get_cached_by_ap_id(get_field(cng, :actor)) + + if User.superuser?(actor) || same_domain?(cng) do + cng + else + cng + |> add_error(:actor, "is not allowed to delete object") + end + end + + def cast_and_validate(data) do + data + |> cast_data + |> validate_data + end +end diff --git a/lib/pleroma/web/activity_pub/object_validators/emoji_react_validator.ex b/lib/pleroma/web/activity_pub/object_validators/emoji_react_validator.ex new file mode 100644 index 000000000..e87519c59 --- /dev/null +++ b/lib/pleroma/web/activity_pub/object_validators/emoji_react_validator.ex @@ -0,0 +1,81 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.ObjectValidators.EmojiReactValidator do + use Ecto.Schema + + alias Pleroma.Object + alias Pleroma.Web.ActivityPub.ObjectValidators.Types + + import Ecto.Changeset + import Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations + + @primary_key false + + embedded_schema do + field(:id, Types.ObjectID, primary_key: true) + field(:type, :string) + field(:object, Types.ObjectID) + field(:actor, Types.ObjectID) + field(:context, :string) + field(:content, :string) + field(:to, {:array, :string}, default: []) + field(:cc, {:array, :string}, default: []) + end + + def cast_and_validate(data) do + data + |> cast_data() + |> validate_data() + end + + def cast_data(data) do + %__MODULE__{} + |> changeset(data) + end + + def changeset(struct, data) do + struct + |> cast(data, __schema__(:fields)) + |> fix_after_cast() + end + + def fix_after_cast(cng) do + cng + |> fix_context() + end + + def fix_context(cng) do + object = get_field(cng, :object) + + with nil <- get_field(cng, :context), + %Object{data: %{"context" => context}} <- Object.get_cached_by_ap_id(object) do + cng + |> put_change(:context, context) + else + _ -> + cng + end + end + + def validate_emoji(cng) do + content = get_field(cng, :content) + + if Pleroma.Emoji.is_unicode_emoji?(content) do + cng + else + cng + |> add_error(:content, "must be a single character emoji") + end + end + + def validate_data(data_cng) do + data_cng + |> validate_inclusion(:type, ["EmojiReact"]) + |> validate_required([:id, :type, :object, :actor, :context, :to, :cc, :content]) + |> validate_actor_presence() + |> validate_object_presence() + |> validate_emoji() + end +end diff --git a/lib/pleroma/web/activity_pub/object_validators/like_validator.ex b/lib/pleroma/web/activity_pub/object_validators/like_validator.ex new file mode 100644 index 000000000..034f25492 --- /dev/null +++ b/lib/pleroma/web/activity_pub/object_validators/like_validator.ex @@ -0,0 +1,99 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.ObjectValidators.LikeValidator do + use Ecto.Schema + + alias Pleroma.Object + alias Pleroma.Web.ActivityPub.ObjectValidators.Types + alias Pleroma.Web.ActivityPub.Utils + + import Ecto.Changeset + import Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations + + @primary_key false + + embedded_schema do + field(:id, Types.ObjectID, primary_key: true) + field(:type, :string) + field(:object, Types.ObjectID) + field(:actor, Types.ObjectID) + field(:context, :string) + field(:to, Types.Recipients, default: []) + field(:cc, Types.Recipients, default: []) + end + + def cast_and_validate(data) do + data + |> cast_data() + |> validate_data() + end + + def cast_data(data) do + %__MODULE__{} + |> changeset(data) + end + + def changeset(struct, data) do + struct + |> cast(data, __schema__(:fields)) + |> fix_after_cast() + end + + def fix_after_cast(cng) do + cng + |> fix_recipients() + |> fix_context() + end + + def fix_context(cng) do + object = get_field(cng, :object) + + with nil <- get_field(cng, :context), + %Object{data: %{"context" => context}} <- Object.get_cached_by_ap_id(object) do + cng + |> put_change(:context, context) + else + _ -> + cng + end + end + + def fix_recipients(cng) do + to = get_field(cng, :to) + cc = get_field(cng, :cc) + object = get_field(cng, :object) + + with {[], []} <- {to, cc}, + %Object{data: %{"actor" => actor}} <- Object.get_cached_by_ap_id(object), + {:ok, actor} <- Types.ObjectID.cast(actor) do + cng + |> put_change(:to, [actor]) + else + _ -> + cng + end + end + + def validate_data(data_cng) do + data_cng + |> validate_inclusion(:type, ["Like"]) + |> validate_required([:id, :type, :object, :actor, :context, :to, :cc]) + |> validate_actor_presence() + |> validate_object_presence() + |> validate_existing_like() + end + + def validate_existing_like(%{changes: %{actor: actor, object: object}} = cng) do + if Utils.get_existing_like(actor, %{data: %{"id" => object}}) do + cng + |> add_error(:actor, "already liked this object") + |> add_error(:object, "already liked by this actor") + else + cng + end + end + + def validate_existing_like(cng), do: cng +end diff --git a/lib/pleroma/web/activity_pub/object_validators/note_validator.ex b/lib/pleroma/web/activity_pub/object_validators/note_validator.ex new file mode 100644 index 000000000..462a5620a --- /dev/null +++ b/lib/pleroma/web/activity_pub/object_validators/note_validator.ex @@ -0,0 +1,64 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.ObjectValidators.NoteValidator do + use Ecto.Schema + + alias Pleroma.Web.ActivityPub.ObjectValidators.Types + + import Ecto.Changeset + + @primary_key false + + embedded_schema do + field(:id, Types.ObjectID, primary_key: true) + field(:to, {:array, :string}, default: []) + field(:cc, {:array, :string}, default: []) + field(:bto, {:array, :string}, default: []) + field(:bcc, {:array, :string}, default: []) + # TODO: Write type + field(:tag, {:array, :map}, default: []) + field(:type, :string) + field(:content, :string) + field(:context, :string) + field(:actor, Types.ObjectID) + field(:attributedTo, Types.ObjectID) + field(:summary, :string) + field(:published, Types.DateTime) + # TODO: Write type + field(:emoji, :map, default: %{}) + field(:sensitive, :boolean, default: false) + # TODO: Write type + field(:attachment, {:array, :map}, default: []) + field(:replies_count, :integer, default: 0) + field(:like_count, :integer, default: 0) + field(:announcement_count, :integer, default: 0) + field(:inRepyTo, :string) + field(:uri, Types.Uri) + + field(:likes, {:array, :string}, default: []) + field(:announcements, {:array, :string}, default: []) + + # see if needed + field(:conversation, :string) + field(:context_id, :string) + end + + def cast_and_validate(data) do + data + |> cast_data() + |> validate_data() + end + + def cast_data(data) do + %__MODULE__{} + |> cast(data, __schema__(:fields)) + end + + def validate_data(data_cng) do + data_cng + |> validate_inclusion(:type, ["Note"]) + |> validate_required([:id, :actor, :to, :cc, :type, :content, :context]) + end +end diff --git a/lib/pleroma/web/activity_pub/object_validators/types/date_time.ex b/lib/pleroma/web/activity_pub/object_validators/types/date_time.ex new file mode 100644 index 000000000..4f412fcde --- /dev/null +++ b/lib/pleroma/web/activity_pub/object_validators/types/date_time.ex @@ -0,0 +1,34 @@ +defmodule Pleroma.Web.ActivityPub.ObjectValidators.Types.DateTime do + @moduledoc """ + The AP standard defines the date fields in AP as xsd:DateTime. Elixir's + DateTime can't parse this, but it can parse the related iso8601. This + module punches the date until it looks like iso8601 and normalizes to + it. + + DateTimes without a timezone offset are treated as UTC. + + Reference: https://www.w3.org/TR/activitystreams-vocabulary/#dfn-published + """ + use Ecto.Type + + def type, do: :string + + def cast(datetime) when is_binary(datetime) do + with {:ok, datetime, _} <- DateTime.from_iso8601(datetime) do + {:ok, DateTime.to_iso8601(datetime)} + else + {:error, :missing_offset} -> cast("#{datetime}Z") + _e -> :error + end + end + + def cast(_), do: :error + + def dump(data) do + {:ok, data} + end + + def load(data) do + {:ok, data} + end +end diff --git a/lib/pleroma/web/activity_pub/object_validators/types/object_id.ex b/lib/pleroma/web/activity_pub/object_validators/types/object_id.ex new file mode 100644 index 000000000..f71f76370 --- /dev/null +++ b/lib/pleroma/web/activity_pub/object_validators/types/object_id.ex @@ -0,0 +1,23 @@ +defmodule Pleroma.Web.ActivityPub.ObjectValidators.Types.ObjectID do + use Ecto.Type + + def type, do: :string + + def cast(object) when is_binary(object) do + # Host has to be present and scheme has to be an http scheme (for now) + case URI.parse(object) do + %URI{host: nil} -> :error + %URI{host: ""} -> :error + %URI{scheme: scheme} when scheme in ["https", "http"] -> {:ok, object} + _ -> :error + end + end + + def cast(%{"id" => object}), do: cast(object) + + def cast(_), do: :error + + def dump(data), do: {:ok, data} + + def load(data), do: {:ok, data} +end diff --git a/lib/pleroma/web/activity_pub/object_validators/types/recipients.ex b/lib/pleroma/web/activity_pub/object_validators/types/recipients.ex new file mode 100644 index 000000000..48fe61e1a --- /dev/null +++ b/lib/pleroma/web/activity_pub/object_validators/types/recipients.ex @@ -0,0 +1,34 @@ +defmodule Pleroma.Web.ActivityPub.ObjectValidators.Types.Recipients do + use Ecto.Type + + alias Pleroma.Web.ActivityPub.ObjectValidators.Types.ObjectID + + def type, do: {:array, ObjectID} + + def cast(object) when is_binary(object) do + cast([object]) + end + + def cast(data) when is_list(data) do + data + |> Enum.reduce({:ok, []}, fn element, acc -> + case {acc, ObjectID.cast(element)} do + {:error, _} -> :error + {_, :error} -> :error + {{:ok, list}, {:ok, id}} -> {:ok, [id | list]} + end + end) + end + + def cast(_) do + :error + end + + def dump(data) do + {:ok, data} + end + + def load(data) do + {:ok, data} + end +end diff --git a/lib/pleroma/web/activity_pub/object_validators/types/uri.ex b/lib/pleroma/web/activity_pub/object_validators/types/uri.ex new file mode 100644 index 000000000..24845bcc0 --- /dev/null +++ b/lib/pleroma/web/activity_pub/object_validators/types/uri.ex @@ -0,0 +1,20 @@ +defmodule Pleroma.Web.ActivityPub.ObjectValidators.Types.Uri do + use Ecto.Type + + def type, do: :string + + def cast(uri) when is_binary(uri) do + case URI.parse(uri) do + %URI{host: nil} -> :error + %URI{host: ""} -> :error + %URI{scheme: scheme} when scheme in ["https", "http"] -> {:ok, uri} + _ -> :error + end + end + + def cast(_), do: :error + + def dump(data), do: {:ok, data} + + def load(data), do: {:ok, data} +end diff --git a/lib/pleroma/web/activity_pub/object_validators/undo_validator.ex b/lib/pleroma/web/activity_pub/object_validators/undo_validator.ex new file mode 100644 index 000000000..d0ba418e8 --- /dev/null +++ b/lib/pleroma/web/activity_pub/object_validators/undo_validator.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.ActivityPub.ObjectValidators.UndoValidator do + use Ecto.Schema + + alias Pleroma.Activity + alias Pleroma.Web.ActivityPub.ObjectValidators.Types + + import Ecto.Changeset + import Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations + + @primary_key false + + embedded_schema do + field(:id, Types.ObjectID, primary_key: true) + field(:type, :string) + field(:object, Types.ObjectID) + field(:actor, Types.ObjectID) + field(:to, {:array, :string}, default: []) + field(:cc, {:array, :string}, default: []) + end + + def cast_and_validate(data) do + data + |> cast_data() + |> validate_data() + end + + def cast_data(data) do + %__MODULE__{} + |> changeset(data) + end + + def changeset(struct, data) do + struct + |> cast(data, __schema__(:fields)) + end + + def validate_data(data_cng) do + data_cng + |> validate_inclusion(:type, ["Undo"]) + |> validate_required([:id, :type, :object, :actor, :to, :cc]) + |> validate_actor_presence() + |> validate_object_presence() + |> validate_undo_rights() + end + + def validate_undo_rights(cng) do + actor = get_field(cng, :actor) + object = get_field(cng, :object) + + with %Activity{data: %{"actor" => object_actor}} <- Activity.get_by_ap_id(object), + true <- object_actor != actor do + cng + |> add_error(:actor, "not the same as object actor") + else + _ -> cng + end + end +end diff --git a/lib/pleroma/web/activity_pub/pipeline.ex b/lib/pleroma/web/activity_pub/pipeline.ex new file mode 100644 index 000000000..0c54c4b23 --- /dev/null +++ b/lib/pleroma/web/activity_pub/pipeline.ex @@ -0,0 +1,60 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.Pipeline do + alias Pleroma.Activity + alias Pleroma.Config + alias Pleroma.Object + alias Pleroma.Repo + alias Pleroma.Web.ActivityPub.ActivityPub + alias Pleroma.Web.ActivityPub.MRF + alias Pleroma.Web.ActivityPub.ObjectValidator + alias Pleroma.Web.ActivityPub.SideEffects + alias Pleroma.Web.Federator + + @spec common_pipeline(map(), keyword()) :: + {:ok, Activity.t() | Object.t(), keyword()} | {:error, any()} + def common_pipeline(object, meta) do + case Repo.transaction(fn -> do_common_pipeline(object, meta) end) do + {:ok, value} -> + value + + {:error, e} -> + {:error, 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, activity, meta}} <- + {:persist_object, ActivityPub.persist(mrfd_object, meta)}, + {_, {:ok, activity, meta}} <- + {:execute_side_effects, SideEffects.handle(activity, meta)}, + {_, {:ok, _}} <- {:federation, maybe_federate(activity, meta)} do + {:ok, activity, meta} + else + {:mrf_object, {:reject, _}} -> {:ok, nil, meta} + e -> {:error, e} + end + end + + defp maybe_federate(%Object{}, _), do: {:ok, :not_federated} + + defp maybe_federate(%Activity{} = activity, meta) do + with {:ok, local} <- Keyword.fetch(meta, :local) do + do_not_federate = meta[:do_not_federate] || !Config.get([:instance, :federating]) + + if !do_not_federate && local do + Federator.publish(activity) + {:ok, :federated} + else + {:ok, :not_federated} + end + else + _e -> {:error, :badarg} + end + end +end diff --git a/lib/pleroma/web/activity_pub/publisher.ex b/lib/pleroma/web/activity_pub/publisher.ex index 6c558e7f0..b70cbd043 100644 --- a/lib/pleroma/web/activity_pub/publisher.ex +++ b/lib/pleroma/web/activity_pub/publisher.ex @@ -141,8 +141,8 @@ defp get_cc_ap_ids(ap_id, recipients) do |> Enum.map(& &1.ap_id) end - defp maybe_use_sharedinbox(%User{source_data: data}), - do: (is_map(data["endpoints"]) && Map.get(data["endpoints"], "sharedInbox")) || data["inbox"] + defp maybe_use_sharedinbox(%User{shared_inbox: nil, inbox: inbox}), do: inbox + defp maybe_use_sharedinbox(%User{shared_inbox: shared_inbox}), do: shared_inbox @doc """ Determine a user inbox to use based on heuristics. These heuristics @@ -157,7 +157,7 @@ defp maybe_use_sharedinbox(%User{source_data: data}), """ def determine_inbox( %Activity{data: activity_data}, - %User{source_data: data} = user + %User{inbox: inbox} = user ) do to = activity_data["to"] || [] cc = activity_data["cc"] || [] @@ -174,7 +174,7 @@ def determine_inbox( maybe_use_sharedinbox(user) true -> - data["inbox"] + inbox end end @@ -192,14 +192,13 @@ def publish(%User{} = actor, %{data: %{"bcc" => bcc}} = activity) inboxes = recipients |> Enum.filter(&User.ap_enabled?/1) - |> Enum.map(fn %{source_data: data} -> data["inbox"] end) + |> Enum.map(fn actor -> actor.inbox end) |> Enum.filter(fn inbox -> should_federate?(inbox, public) end) |> Instances.filter_reachable() Repo.checkout(fn -> Enum.each(inboxes, fn {inbox, unreachable_since} -> - %User{ap_id: ap_id} = - Enum.find(recipients, fn %{source_data: data} -> data["inbox"] == inbox end) + %User{ap_id: ap_id} = Enum.find(recipients, fn actor -> actor.inbox == inbox end) # Get all the recipients on the same host and add them to cc. Otherwise, a remote # instance would only accept a first message for the first recipient and ignore the rest. diff --git a/lib/pleroma/web/activity_pub/relay.ex b/lib/pleroma/web/activity_pub/relay.ex index 729c23af7..484178edd 100644 --- a/lib/pleroma/web/activity_pub/relay.ex +++ b/lib/pleroma/web/activity_pub/relay.ex @@ -4,9 +4,10 @@ defmodule Pleroma.Web.ActivityPub.Relay do alias Pleroma.Activity - alias Pleroma.Object alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub + alias Pleroma.Web.ActivityPub.Visibility + alias Pleroma.Web.CommonAPI require Logger @relay_nickname "relay" @@ -48,11 +49,11 @@ def unfollow(target_instance) do end end - @spec publish(any()) :: {:ok, Activity.t(), Object.t()} | {:error, any()} + @spec publish(any()) :: {:ok, Activity.t()} | {:error, any()} def publish(%Activity{data: %{"type" => "Create"}} = activity) do with %User{} = user <- get_actor(), - %Object{} = object <- Object.normalize(activity) do - ActivityPub.announce(user, object, nil, true, false) + true <- Visibility.is_public?(activity) do + CommonAPI.repeat(activity.id, user) else error -> format_error(error) end diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex new file mode 100644 index 000000000..fb6275450 --- /dev/null +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -0,0 +1,151 @@ +defmodule Pleroma.Web.ActivityPub.SideEffects do + @moduledoc """ + This module looks at an inserted object and executes the side effects that it + implies. For example, a `Like` activity will increase the like count on the + liked object, a `Follow` activity will add the user to the follower + collection, and so on. + """ + alias Pleroma.Activity + alias Pleroma.Notification + alias Pleroma.Object + alias Pleroma.Repo + alias Pleroma.User + alias Pleroma.Web.ActivityPub.ActivityPub + alias Pleroma.Web.ActivityPub.Utils + + def handle(object, meta \\ []) + + # Tasks this handles: + # - Add like to object + # - Set up notification + def handle(%{data: %{"type" => "Like"}} = object, meta) do + liked_object = Object.get_by_ap_id(object.data["object"]) + Utils.add_like_to_object(object, liked_object) + + Notification.create_notifications(object) + + {:ok, object, meta} + end + + # Tasks this handles: + # - Add announce to object + # - Set up notification + # - Stream out the announce + def handle(%{data: %{"type" => "Announce"}} = object, meta) do + announced_object = Object.get_by_ap_id(object.data["object"]) + user = User.get_cached_by_ap_id(object.data["actor"]) + + Utils.add_announce_to_object(object, announced_object) + + if !User.is_internal_user?(user) do + Notification.create_notifications(object) + ActivityPub.stream_out(object) + end + + {:ok, object, meta} + end + + def handle(%{data: %{"type" => "Undo", "object" => undone_object}} = object, meta) do + with undone_object <- Activity.get_by_ap_id(undone_object), + :ok <- handle_undoing(undone_object) do + {:ok, object, meta} + end + end + + # Tasks this handles: + # - Add reaction to object + # - Set up notification + def handle(%{data: %{"type" => "EmojiReact"}} = object, meta) do + reacted_object = Object.get_by_ap_id(object.data["object"]) + Utils.add_emoji_reaction_to_object(object, reacted_object) + + Notification.create_notifications(object) + + {:ok, object, meta} + end + + # Tasks this handles: + # - Delete and unpins the create activity + # - Replace object with Tombstone + # - Set up notification + # - Reduce the user note count + # - Reduce the reply count + # - Stream out the activity + def handle(%{data: %{"type" => "Delete", "object" => deleted_object}} = object, meta) do + deleted_object = + Object.normalize(deleted_object, false) || User.get_cached_by_ap_id(deleted_object) + + result = + case deleted_object do + %Object{} -> + with {:ok, deleted_object, activity} <- Object.delete(deleted_object), + %User{} = user <- User.get_cached_by_ap_id(deleted_object.data["actor"]) do + User.remove_pinnned_activity(user, activity) + + {:ok, user} = ActivityPub.decrease_note_count_if_public(user, deleted_object) + + if in_reply_to = deleted_object.data["inReplyTo"] do + Object.decrease_replies_count(in_reply_to) + end + + ActivityPub.stream_out(object) + ActivityPub.stream_out_participations(deleted_object, user) + :ok + end + + %User{} -> + with {:ok, _} <- User.delete(deleted_object) do + :ok + end + end + + if result == :ok do + Notification.create_notifications(object) + {:ok, object, meta} + else + {:error, result} + end + end + + # Nothing to do + def handle(object, meta) do + {:ok, object, meta} + end + + def handle_undoing(%{data: %{"type" => "Like"}} = object) do + with %Object{} = liked_object <- Object.get_by_ap_id(object.data["object"]), + {:ok, _} <- Utils.remove_like_from_object(object, liked_object), + {:ok, _} <- Repo.delete(object) do + :ok + end + end + + def handle_undoing(%{data: %{"type" => "EmojiReact"}} = object) do + with %Object{} = reacted_object <- Object.get_by_ap_id(object.data["object"]), + {:ok, _} <- Utils.remove_emoji_reaction_from_object(object, reacted_object), + {:ok, _} <- Repo.delete(object) do + :ok + end + end + + def handle_undoing(%{data: %{"type" => "Announce"}} = object) do + with %Object{} = liked_object <- Object.get_by_ap_id(object.data["object"]), + {:ok, _} <- Utils.remove_announce_from_object(object, liked_object), + {:ok, _} <- Repo.delete(object) do + :ok + end + end + + def handle_undoing( + %{data: %{"type" => "Block", "actor" => blocker, "object" => blocked}} = object + ) do + with %User{} = blocker <- User.get_cached_by_ap_id(blocker), + %User{} = blocked <- User.get_cached_by_ap_id(blocked), + {:ok, _} <- User.unblock(blocker, blocked), + {:ok, _} <- Repo.delete(object) do + :ok + end + end + + def handle_undoing(object), do: {:error, ["don't know how to handle", object]} +end diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 9cd3de705..8443c284c 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -7,12 +7,17 @@ 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.FollowingRelationship alias Pleroma.Object alias Pleroma.Object.Containment alias Pleroma.Repo alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub + alias Pleroma.Web.ActivityPub.Builder + alias Pleroma.Web.ActivityPub.ObjectValidator + alias Pleroma.Web.ActivityPub.ObjectValidators.Types + alias Pleroma.Web.ActivityPub.Pipeline alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.ActivityPub.Visibility alias Pleroma.Web.Federator @@ -40,6 +45,7 @@ def fix_object(object, options \\ []) do |> fix_addressing |> fix_summary |> fix_type(options) + |> fix_content end def fix_summary(%{"summary" => nil} = object) do @@ -202,16 +208,46 @@ def fix_context(object) do |> Map.put("conversation", context) end + defp add_if_present(map, _key, nil), do: map + + defp add_if_present(map, key, value) do + Map.put(map, key, value) + end + def fix_attachments(%{"attachment" => attachment} = object) when is_list(attachment) do attachments = Enum.map(attachment, fn data -> - media_type = data["mediaType"] || data["mimeType"] - href = data["url"] || data["href"] - url = [%{"type" => "Link", "mediaType" => media_type, "href" => href}] + url = + cond do + is_list(data["url"]) -> List.first(data["url"]) + is_map(data["url"]) -> data["url"] + true -> nil + end - data - |> Map.put("mediaType", media_type) - |> Map.put("url", url) + media_type = + cond do + is_map(url) && is_binary(url["mediaType"]) -> url["mediaType"] + is_binary(data["mediaType"]) -> data["mediaType"] + is_binary(data["mimeType"]) -> data["mimeType"] + true -> nil + end + + href = + cond do + is_map(url) && is_binary(url["href"]) -> url["href"] + is_binary(data["url"]) -> data["url"] + is_binary(data["href"]) -> data["href"] + end + + attachment_url = + %{"href" => href} + |> add_if_present("mediaType", media_type) + |> add_if_present("type", Map.get(url || %{}, "type")) + + %{"url" => [attachment_url]} + |> add_if_present("mediaType", media_type) + |> add_if_present("type", data["type"]) + |> add_if_present("name", data["name"]) end) Map.put(object, "attachment", attachments) @@ -229,7 +265,8 @@ def fix_url(%{"url" => url} = object) when is_map(url) do Map.put(object, "url", url["href"]) end - def fix_url(%{"type" => "Video", "url" => url} = object) when is_list(url) do + def fix_url(%{"type" => object_type, "url" => url} = object) + when object_type in ["Video", "Audio"] and is_list(url) do first_element = Enum.at(url, 0) link_element = Enum.find(url, fn x -> is_map(x) and x["mimeType"] == "text/html" end) @@ -323,6 +360,18 @@ def fix_type(%{"inReplyTo" => reply_id, "name" => _} = object, options) 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 + defp mastodon_follow_hack(%{"id" => id, "actor" => follower_id}, followed) do with true <- id =~ "follows", %User{local: true} = follower <- User.get_cached_by_ap_id(follower_id), @@ -398,7 +447,7 @@ def handle_incoming( %{"type" => "Create", "object" => %{"type" => objtype} = object} = data, options ) - when objtype in ["Article", "Event", "Note", "Video", "Page", "Question", "Answer"] do + when objtype in ["Article", "Event", "Note", "Video", "Page", "Question", "Answer", "Audio"] do actor = Containment.get_actor(data) data = @@ -490,7 +539,8 @@ def handle_incoming( {_, {:ok, follower}} <- {:follow, User.follow(follower, followed)}, {_, {:ok, _}} <- {:follow_state_update, Utils.update_follow_state_for_all(activity, "accept")}, - {:ok, _relationship} <- FollowingRelationship.update(follower, followed, "accept") do + {:ok, _relationship} <- + FollowingRelationship.update(follower, followed, :follow_accept) do ActivityPub.accept(%{ to: [follower.ap_id], actor: followed, @@ -500,7 +550,7 @@ def handle_incoming( else {:user_blocked, true} -> {:ok, _} = Utils.update_follow_state_for_all(activity, "reject") - {:ok, _relationship} = FollowingRelationship.update(follower, followed, "reject") + {:ok, _relationship} = FollowingRelationship.update(follower, followed, :follow_reject) ActivityPub.reject(%{ to: [follower.ap_id], @@ -511,7 +561,7 @@ def handle_incoming( {:follow, {:error, _}} -> {:ok, _} = Utils.update_follow_state_for_all(activity, "reject") - {:ok, _relationship} = FollowingRelationship.update(follower, followed, "reject") + {:ok, _relationship} = FollowingRelationship.update(follower, followed, :follow_reject) ActivityPub.reject(%{ to: [follower.ap_id], @@ -521,7 +571,7 @@ def handle_incoming( }) {:user_locked, true} -> - {:ok, _relationship} = FollowingRelationship.update(follower, followed, "pending") + {:ok, _relationship} = FollowingRelationship.update(follower, followed, :follow_pending) :noop end @@ -541,7 +591,10 @@ def handle_incoming( {:ok, follow_activity} <- get_follow_activity(follow_object, followed), {:ok, follow_activity} <- Utils.update_follow_state_for_all(follow_activity, "accept"), %User{local: true} = follower <- User.get_cached_by_ap_id(follow_activity.data["actor"]), - {:ok, _relationship} <- FollowingRelationship.update(follower, followed, "accept") do + {:ok, _relationship} <- FollowingRelationship.update(follower, followed, :follow_accept) do + User.update_follower_count(followed) + User.update_following_count(follower) + ActivityPub.accept(%{ to: follow_activity.data["to"], type: "Accept", @@ -551,7 +604,8 @@ def handle_incoming( activity_id: id }) else - _e -> :error + _e -> + :error end end @@ -564,7 +618,7 @@ def handle_incoming( {:ok, follow_activity} <- get_follow_activity(follow_object, followed), {:ok, follow_activity} <- Utils.update_follow_state_for_all(follow_activity, "reject"), %User{local: true} = follower <- User.get_cached_by_ap_id(follow_activity.data["actor"]), - {:ok, _relationship} <- FollowingRelationship.update(follower, followed, "reject"), + {:ok, _relationship} <- FollowingRelationship.update(follower, followed, :follow_reject), {:ok, activity} <- ActivityPub.reject(%{ to: follow_activity.data["to"], @@ -608,53 +662,14 @@ def handle_incoming( |> handle_incoming(options) end - def handle_incoming( - %{"type" => "Like", "object" => object_id, "actor" => _actor, "id" => id} = data, - _options - ) do - with actor <- Containment.get_actor(data), - {:ok, %User{} = actor} <- User.get_or_fetch_by_ap_id(actor), - {:ok, object} <- get_obj_helper(object_id), - {:ok, activity, _object} <- ActivityPub.like(actor, object, id, false) do + def handle_incoming(%{"type" => type} = data, _options) + when type in ["Like", "EmojiReact", "Announce"] do + with :ok <- ObjectValidator.fetch_actor_and_object(data), + {:ok, activity, _meta} <- + Pipeline.common_pipeline(data, local: false) do {:ok, activity} else - _e -> :error - end - end - - def handle_incoming( - %{ - "type" => "EmojiReact", - "object" => object_id, - "actor" => _actor, - "id" => id, - "content" => emoji - } = data, - _options - ) do - with actor <- Containment.get_actor(data), - {:ok, %User{} = actor} <- User.get_or_fetch_by_ap_id(actor), - {:ok, object} <- get_obj_helper(object_id), - {:ok, activity, _object} <- - ActivityPub.react_with_emoji(actor, object, emoji, activity_id: id, local: false) do - {:ok, activity} - else - _e -> :error - end - end - - def handle_incoming( - %{"type" => "Announce", "object" => object_id, "actor" => _actor, "id" => id} = data, - _options - ) do - with actor <- Containment.get_actor(data), - {:ok, %User{} = actor} <- User.get_or_fetch_by_ap_id(actor), - {:ok, object} <- get_embedded_obj_helper(object_id, actor), - public <- Visibility.is_public?(data), - {:ok, activity, _object} <- ActivityPub.announce(actor, object, id, false, public) do - {:ok, activity} - else - _e -> :error + e -> {:error, e} end end @@ -673,7 +688,7 @@ def handle_incoming( {:ok, new_user_data} = ActivityPub.user_data_from_user_object(object) actor - |> User.upgrade_changeset(new_user_data, true) + |> User.remote_user_changeset(new_user_data) |> User.update_and_set_cache() ActivityPub.update(%{ @@ -691,55 +706,25 @@ def handle_incoming( end end - # TODO: We presently assume that any actor on the same origin domain as the object being - # deleted has the rights to delete that object. A better way to validate whether or not - # the object should be deleted is to refetch the object URI, which should return either - # an error or a tombstone. This would allow us to verify that a deletion actually took - # place. def handle_incoming( - %{"type" => "Delete", "object" => object_id, "actor" => actor, "id" => id} = data, + %{"type" => "Delete"} = data, _options ) do - object_id = Utils.get_ap_id(object_id) - - with actor <- Containment.get_actor(data), - {:ok, %User{} = actor} <- User.get_or_fetch_by_ap_id(actor), - {:ok, object} <- get_obj_helper(object_id), - :ok <- Containment.contain_origin(actor.ap_id, object.data), - {:ok, activity} <- - ActivityPub.delete(object, local: false, activity_id: id, actor: actor.ap_id) do + with {:ok, activity, _} <- Pipeline.common_pipeline(data, local: false) do {:ok, activity} else - nil -> - case User.get_cached_by_ap_id(object_id) do - %User{ap_id: ^actor} = user -> - User.delete(user) - - nil -> - :error + {:error, {:validate_object, _}} = e -> + # Check if we have a create activity for this + with {:ok, object_id} <- Types.ObjectID.cast(data["object"]), + %Activity{data: %{"actor" => actor}} <- + Activity.create_by_object_ap_id(object_id) |> Repo.one(), + # We have one, insert a tombstone and retry + {:ok, tombstone_data, _} <- Builder.tombstone(actor, object_id), + {:ok, _tombstone} <- Object.create(tombstone_data) do + handle_incoming(data) + else + _ -> e end - - _e -> - :error - end - end - - def handle_incoming( - %{ - "type" => "Undo", - "object" => %{"type" => "Announce", "object" => object_id}, - "actor" => _actor, - "id" => id - } = data, - _options - ) do - with actor <- Containment.get_actor(data), - {:ok, %User{} = actor} <- User.get_or_fetch_by_ap_id(actor), - {:ok, object} <- get_obj_helper(object_id), - {:ok, activity, _} <- ActivityPub.unannounce(actor, object, id, false) do - {:ok, activity} - else - _e -> :error end end @@ -765,75 +750,13 @@ def handle_incoming( def handle_incoming( %{ "type" => "Undo", - "object" => %{"type" => "EmojiReact", "id" => reaction_activity_id}, - "actor" => _actor, - "id" => id + "object" => %{"type" => type} } = data, _options - ) do - with actor <- Containment.get_actor(data), - {:ok, %User{} = actor} <- User.get_or_fetch_by_ap_id(actor), - {:ok, activity, _} <- - ActivityPub.unreact_with_emoji(actor, reaction_activity_id, - activity_id: id, - local: false - ) do + ) + when type in ["Like", "EmojiReact", "Announce", "Block"] do + with {:ok, activity, _} <- Pipeline.common_pipeline(data, local: false) do {:ok, activity} - else - _e -> :error - end - end - - def handle_incoming( - %{ - "type" => "Undo", - "object" => %{"type" => "Block", "object" => blocked}, - "actor" => blocker, - "id" => id - } = _data, - _options - ) do - with %User{local: true} = blocked <- User.get_cached_by_ap_id(blocked), - {:ok, %User{} = blocker} <- User.get_or_fetch_by_ap_id(blocker), - {:ok, activity} <- ActivityPub.unblock(blocker, blocked, id, false) do - User.unblock(blocker, blocked) - {:ok, activity} - else - _e -> :error - end - end - - def handle_incoming( - %{"type" => "Block", "object" => blocked, "actor" => blocker, "id" => id} = _data, - _options - ) do - with %User{local: true} = blocked = User.get_cached_by_ap_id(blocked), - {:ok, %User{} = blocker} = User.get_or_fetch_by_ap_id(blocker), - {:ok, activity} <- ActivityPub.block(blocker, blocked, id, false) do - User.unfollow(blocker, blocked) - User.block(blocker, blocked) - {:ok, activity} - else - _e -> :error - end - end - - def handle_incoming( - %{ - "type" => "Undo", - "object" => %{"type" => "Like", "object" => object_id}, - "actor" => _actor, - "id" => id - } = data, - _options - ) do - with actor <- Containment.get_actor(data), - {:ok, %User{} = actor} <- User.get_or_fetch_by_ap_id(actor), - {:ok, object} <- get_obj_helper(object_id), - {:ok, activity, _, _} <- ActivityPub.unlike(actor, object, id, false) do - {:ok, activity} - else - _e -> :error end end @@ -855,6 +778,21 @@ def handle_incoming( end end + def handle_incoming( + %{"type" => "Block", "object" => blocked, "actor" => blocker, "id" => id} = _data, + _options + ) do + with %User{local: true} = blocked = User.get_cached_by_ap_id(blocked), + {:ok, %User{} = blocker} = User.get_or_fetch_by_ap_id(blocker), + {:ok, activity} <- ActivityPub.block(blocker, blocked, id, false) do + User.unfollow(blocker, blocked) + User.block(blocker, blocked) + {:ok, activity} + else + _e -> :error + end + end + def handle_incoming( %{ "type" => "Move", @@ -1107,14 +1045,16 @@ def add_hashtags(object) do Map.put(object, "tag", tags) end + # TODO These should be added on our side on insertion, it doesn't make much + # sense to regenerate these all the time def add_mention_tags(object) do - mentions = - object - |> Utils.get_notified_from_object() - |> Enum.map(&build_mention_tag/1) + to = object["to"] || [] + cc = object["cc"] || [] + mentioned = User.get_users_from_set(to ++ cc, local_only: false) + + mentions = Enum.map(mentioned, &build_mention_tag/1) tags = object["tag"] || [] - Map.put(object, "tag", tags ++ mentions) end @@ -1124,7 +1064,7 @@ defp build_mention_tag(%{ap_id: ap_id, nickname: nickname} = _) do def take_emoji_tags(%User{emoji: emoji}) do emoji - |> Enum.flat_map(&Map.to_list/1) + |> Map.to_list() |> Enum.map(&build_emoji_tag/1) end @@ -1153,6 +1093,10 @@ def set_conversation(object) do Map.put(object, "conversation", object["context"]) end + def set_sensitive(%{"sensitive" => true} = object) do + object + end + def set_sensitive(object) do tags = object["tag"] || [] Map.put(object, "sensitive", "nsfw" in tags) @@ -1171,18 +1115,24 @@ def add_attributed_to(object) do def prepare_attachments(object) do attachments = - (object["attachment"] || []) + object + |> Map.get("attachment", []) |> Enum.map(fn data -> [%{"mediaType" => media_type, "href" => href} | _] = data["url"] - %{"url" => href, "mediaType" => media_type, "name" => data["name"], "type" => "Document"} + + %{ + "url" => href, + "mediaType" => media_type, + "name" => data["name"], + "type" => "Document" + } end) Map.put(object, "attachment", attachments) end def strip_internal_fields(object) do - object - |> Map.drop(Pleroma.Constants.object_internal_fields()) + Map.drop(object, Pleroma.Constants.object_internal_fields()) end defp strip_internal_tags(%{"tag" => tags} = object) do @@ -1218,12 +1168,8 @@ def perform(:user_upgrade, user) do def upgrade_user_from_ap_id(ap_id) do with %User{local: false} = user <- User.get_cached_by_ap_id(ap_id), {:ok, data} <- ActivityPub.fetch_and_prepare_user_from_ap_id(ap_id), - already_ap <- User.ap_enabled?(user), - {:ok, user} <- upgrade_user(user, data) do - if not already_ap do - TransmogrifierWorker.enqueue("user_upgrade", %{"user_id" => user.id}) - end - + {:ok, user} <- update_user(user, data) do + TransmogrifierWorker.enqueue("user_upgrade", %{"user_id" => user.id}) {:ok, user} else %User{} = user -> {:ok, user} @@ -1231,9 +1177,9 @@ def upgrade_user_from_ap_id(ap_id) do end end - defp upgrade_user(user, data) do + defp update_user(user, data) do user - |> User.upgrade_changeset(data, true) + |> User.remote_user_changeset(data) |> User.update_and_set_cache() end diff --git a/lib/pleroma/web/activity_pub/utils.ex b/lib/pleroma/web/activity_pub/utils.ex index 15dd2ed45..f2375bcc4 100644 --- a/lib/pleroma/web/activity_pub/utils.ex +++ b/lib/pleroma/web/activity_pub/utils.ex @@ -6,6 +6,7 @@ defmodule Pleroma.Web.ActivityPub.Utils do alias Ecto.Changeset alias Ecto.UUID alias Pleroma.Activity + alias Pleroma.Config alias Pleroma.Notification alias Pleroma.Object alias Pleroma.Repo @@ -169,8 +170,11 @@ def create_context(context) do Enqueues an activity for federation if it's local """ @spec maybe_federate(any()) :: :ok - def maybe_federate(%Activity{local: true} = activity) do - if Pleroma.Config.get!([:instance, :federating]) do + def maybe_federate(%Activity{local: true, data: %{"type" => type}} = activity) do + outgoing_blocks = Config.get([:activitypub, :outgoing_blocks]) + + with true <- Config.get!([:instance, :federating]), + true <- type != "Block" || outgoing_blocks do Pleroma.Web.Federator.publish(activity) end @@ -440,22 +444,19 @@ def update_follow_state_for_all( |> update(set: [data: fragment("jsonb_set(data, '{state}', ?)", ^state)]) |> Repo.update_all([]) - User.set_follow_state_cache(actor, object, state) - activity = Activity.get_by_id(activity.id) {:ok, activity} end def update_follow_state( - %Activity{data: %{"actor" => actor, "object" => object}} = activity, + %Activity{} = activity, state ) do new_data = Map.put(activity.data, "state", state) changeset = Changeset.change(activity, data: new_data) with {:ok, activity} <- Repo.update(changeset) do - User.set_follow_state_cache(actor, object, state) {:ok, activity} end end @@ -515,7 +516,7 @@ def get_latest_reaction(internal_activity_id, %{ap_id: ap_id}, emoji) do #### Announce-related helpers @doc """ - Retruns an existing announce activity if the notice has already been announced + Returns an existing announce activity if the notice has already been announced """ @spec get_existing_announce(String.t(), map()) :: Activity.t() | nil def get_existing_announce(actor, %{data: %{"id" => ap_id}}) do @@ -565,45 +566,6 @@ def make_announce_data( |> maybe_put("id", activity_id) end - @doc """ - Make unannounce activity data for the given actor and object - """ - def make_unannounce_data( - %User{ap_id: ap_id} = user, - %Activity{data: %{"context" => context, "object" => object}} = activity, - activity_id - ) do - object = Object.normalize(object) - - %{ - "type" => "Undo", - "actor" => ap_id, - "object" => activity.data, - "to" => [user.follower_address, object.data["actor"]], - "cc" => [Pleroma.Constants.as_public()], - "context" => context - } - |> maybe_put("id", activity_id) - end - - def make_unlike_data( - %User{ap_id: ap_id} = user, - %Activity{data: %{"context" => context, "object" => object}} = activity, - activity_id - ) do - object = Object.normalize(object) - - %{ - "type" => "Undo", - "actor" => ap_id, - "object" => activity.data, - "to" => [user.follower_address, object.data["actor"]], - "cc" => [Pleroma.Constants.as_public()], - "context" => context - } - |> maybe_put("id", activity_id) - end - def make_undo_data( %User{ap_id: actor, follower_address: follower_address}, %Activity{ @@ -691,16 +653,6 @@ def make_block_data(blocker, blocked, activity_id) do |> maybe_put("id", activity_id) end - def make_unblock_data(blocker, blocked, block_activity, activity_id) do - %{ - "type" => "Undo", - "actor" => blocker.ap_id, - "to" => [blocked.ap_id], - "object" => block_activity.data - } - |> maybe_put("id", activity_id) - end - #### Create-related helpers def make_create_data(params, additional) do @@ -798,102 +750,6 @@ def get_reports(params, page, page_size) do ActivityPub.fetch_activities([], params, :offset) end - def parse_report_group(activity) do - reports = get_reports_by_status_id(activity["id"]) - max_date = Enum.max_by(reports, &NaiveDateTime.from_iso8601!(&1.data["published"])) - actors = Enum.map(reports, & &1.user_actor) - [%{data: %{"object" => [account_id | _]}} | _] = reports - - account = - AccountView.render("show.json", %{ - user: User.get_by_ap_id(account_id) - }) - - status = get_status_data(activity) - - %{ - date: max_date.data["published"], - account: account, - status: status, - actors: Enum.uniq(actors), - reports: reports - } - end - - defp get_status_data(status) do - case status["deleted"] do - true -> - %{ - "id" => status["id"], - "deleted" => true - } - - _ -> - Activity.get_by_ap_id(status["id"]) - end - end - - def get_reports_by_status_id(ap_id) do - from(a in Activity, - where: fragment("(?)->>'type' = 'Flag'", a.data), - where: fragment("(?)->'object' @> ?", a.data, ^[%{id: ap_id}]), - or_where: fragment("(?)->'object' @> ?", a.data, ^[ap_id]) - ) - |> Activity.with_preloaded_user_actor() - |> Repo.all() - end - - @spec get_reports_grouped_by_status([String.t()]) :: %{ - required(:groups) => [ - %{ - required(:date) => String.t(), - required(:account) => %{}, - required(:status) => %{}, - required(:actors) => [%User{}], - required(:reports) => [%Activity{}] - } - ] - } - def get_reports_grouped_by_status(activity_ids) do - parsed_groups = - activity_ids - |> Enum.map(fn id -> - id - |> build_flag_object() - |> parse_report_group() - end) - - %{ - groups: parsed_groups - } - end - - @spec get_reported_activities() :: [ - %{ - required(:activity) => String.t(), - required(:date) => String.t() - } - ] - def get_reported_activities do - reported_activities_query = - from(a in Activity, - where: fragment("(?)->>'type' = 'Flag'", a.data), - select: %{ - activity: fragment("jsonb_array_elements((? #- '{object,0}')->'object')", a.data) - }, - group_by: fragment("activity") - ) - - from(a in subquery(reported_activities_query), - distinct: true, - select: %{ - id: fragment("COALESCE(?->>'id'::text, ? #>> '{}')", a.activity, a.activity) - } - ) - |> Repo.all() - |> Enum.map(& &1.id) - end - def update_report_state(%Activity{} = activity, state) when state in @strip_status_report_states do {:ok, stripped_activity} = strip_report_status_data(activity) diff --git a/lib/pleroma/web/activity_pub/views/user_view.ex b/lib/pleroma/web/activity_pub/views/user_view.ex index bc21ac6c7..34590b16d 100644 --- a/lib/pleroma/web/activity_pub/views/user_view.ex +++ b/lib/pleroma/web/activity_pub/views/user_view.ex @@ -79,10 +79,7 @@ def render("user.json", %{user: user}) do emoji_tags = Transmogrifier.take_emoji_tags(user) - fields = - user - |> User.fields() - |> Enum.map(&Map.put(&1, "type", "PropertyValue")) + fields = Enum.map(user.fields, &Map.put(&1, "type", "PropertyValue")) %{ "id" => user.ap_id, @@ -103,7 +100,7 @@ def render("user.json", %{user: user}) do }, "endpoints" => endpoints, "attachment" => fields, - "tag" => (user.source_data["tag"] || []) ++ emoji_tags, + "tag" => emoji_tags, "discoverable" => user.discoverable } |> Map.merge(maybe_make_image(&User.avatar_url/2, "icon", user)) diff --git a/lib/pleroma/web/admin_api/admin_api_controller.ex b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex similarity index 77% rename from lib/pleroma/web/admin_api/admin_api_controller.ex rename to lib/pleroma/web/admin_api/controllers/admin_api_controller.ex index 175260bc2..783203c07 100644 --- a/lib/pleroma/web/admin_api/admin_api_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex @@ -10,6 +10,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do alias Pleroma.Activity alias Pleroma.Config alias Pleroma.ConfigDB + alias Pleroma.MFA alias Pleroma.ModerationLog alias Pleroma.Plugs.OAuthScopesPlug alias Pleroma.ReportNote @@ -17,8 +18,11 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do alias Pleroma.User alias Pleroma.UserInviteToken alias Pleroma.Web.ActivityPub.ActivityPub + alias Pleroma.Web.ActivityPub.Builder + alias Pleroma.Web.ActivityPub.Pipeline alias Pleroma.Web.ActivityPub.Relay alias Pleroma.Web.ActivityPub.Utils + alias Pleroma.Web.AdminAPI alias Pleroma.Web.AdminAPI.AccountView alias Pleroma.Web.AdminAPI.ConfigView alias Pleroma.Web.AdminAPI.ModerationLogView @@ -27,18 +31,20 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do alias Pleroma.Web.AdminAPI.Search alias Pleroma.Web.CommonAPI alias Pleroma.Web.Endpoint - alias Pleroma.Web.MastodonAPI.StatusView + alias Pleroma.Web.MastodonAPI + alias Pleroma.Web.MastodonAPI.AppView + alias Pleroma.Web.OAuth.App alias Pleroma.Web.Router require Logger - @descriptions_json Pleroma.Docs.JSON.compile() + @descriptions Pleroma.Docs.JSON.compile() @users_page_size 50 plug( OAuthScopesPlug, %{scopes: ["read:accounts"], admin: true} - when action in [:list_users, :user_show, :right_get] + when action in [:list_users, :user_show, :right_get, :show_user_credentials] ) plug( @@ -46,6 +52,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do %{scopes: ["write:accounts"], admin: true} when action in [ :get_password_reset, + :force_password_reset, :user_delete, :users_create, :user_toggle_activation, @@ -54,7 +61,11 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do :tag_users, :untag_users, :right_add, - :right_delete + :right_add_multiple, + :right_delete, + :disable_mfa, + :right_delete_multiple, + :update_user_credentials ] ) @@ -81,52 +92,60 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do plug( OAuthScopesPlug, %{scopes: ["write:reports"], admin: true} - when action in [:reports_update] + when action in [:reports_update, :report_notes_create, :report_notes_delete] ) plug( OAuthScopesPlug, %{scopes: ["read:statuses"], admin: true} - when action == :list_user_statuses - ) - - plug( - OAuthScopesPlug, - %{scopes: ["write:statuses"], admin: true} - when action in [:status_update, :status_delete] + when action in [:list_user_statuses, :list_instance_statuses] ) plug( OAuthScopesPlug, %{scopes: ["read"], admin: true} - when action in [:config_show, :list_log, :stats] + when action in [ + :config_show, + :list_log, + :stats, + :relay_list, + :config_descriptions, + :need_reboot + ] ) plug( OAuthScopesPlug, %{scopes: ["write"], admin: true} - when action == :config_update + when action in [ + :restart, + :config_update, + :resend_confirmation_email, + :confirm_email, + :oauth_app_create, + :oauth_app_list, + :oauth_app_update, + :oauth_app_delete, + :reload_emoji + ] ) - action_fallback(:errors) + action_fallback(AdminAPI.FallbackController) - def user_delete(%{assigns: %{user: admin}} = conn, %{"nickname" => nickname}) do - user = User.get_cached_by_nickname(nickname) - User.delete(user) - - ModerationLog.insert_log(%{ - actor: admin, - subject: [user], - action: "delete" - }) - - conn - |> json(nickname) + def user_delete(conn, %{"nickname" => nickname}) do + user_delete(conn, %{"nicknames" => [nickname]}) end def user_delete(%{assigns: %{user: admin}} = conn, %{"nicknames" => nicknames}) do - users = nicknames |> Enum.map(&User.get_cached_by_nickname/1) - User.delete(users) + users = + nicknames + |> Enum.map(&User.get_cached_by_nickname/1) + + users + |> Enum.each(fn user -> + {:ok, delete_data, _} = Builder.delete(admin, user.ap_id) + Pipeline.common_pipeline(delete_data, local: true) + end) ModerationLog.insert_log(%{ actor: admin, @@ -256,7 +275,7 @@ def list_instance_statuses(conn, %{"instance" => instance} = params) do }) conn - |> put_view(Pleroma.Web.AdminAPI.StatusView) + |> put_view(AdminAPI.StatusView) |> render("index.json", %{activities: activities, as: :activity}) end @@ -275,7 +294,7 @@ def list_user_statuses(conn, %{"nickname" => nickname} = params) do }) conn - |> put_view(StatusView) + |> put_view(MastodonAPI.StatusView) |> render("index.json", %{activities: activities, as: :activity}) else _ -> {:error, :not_found} @@ -369,29 +388,12 @@ def list_users(conn, params) do email: params["email"] } - with {:ok, users, count} <- Search.user(Map.merge(search_params, filters)), - {:ok, users, count} <- filter_service_users(users, count), - do: - conn - |> json( - AccountView.render("index.json", - users: users, - count: count, - page_size: page_size - ) - ) - end - - defp filter_service_users(users, count) do - filtered_users = Enum.reject(users, &service_user?/1) - count = if Enum.any?(users, &service_user?/1), do: length(filtered_users), else: count - - {:ok, filtered_users, count} - end - - defp service_user?(user) do - String.match?(user.ap_id, ~r/.*\/relay$/) or - String.match?(user.ap_id, ~r/.*\/internal\/fetch$/) + with {:ok, users, count} <- Search.user(Map.merge(search_params, filters)) do + json( + conn, + AccountView.render("index.json", users: users, count: count, page_size: page_size) + ) + end end @filters ~w(local external active deactivated is_admin is_moderator) @@ -575,9 +577,8 @@ def relay_unfollow(%{assigns: %{user: admin}} = conn, %{"relay_url" => target}) @doc "Sends registration invite via email" def email_invite(%{assigns: %{user: user}} = conn, %{"email" => email} = params) do - with true <- - Config.get([:instance, :invites_enabled]) && - !Config.get([:instance, :registrations_open]), + with {_, false} <- {:registrations_open, Config.get([:instance, :registrations_open])}, + {_, true} <- {:invites_enabled, Config.get([:instance, :invites_enabled])}, {:ok, invite_token} <- UserInviteToken.create_invite(), email <- Pleroma.Emails.UserEmail.user_invitation_email( @@ -588,6 +589,12 @@ def email_invite(%{assigns: %{user: user}} = conn, %{"email" => email} = params) ), {:ok, _} <- Pleroma.Emails.Mailer.deliver(email) do json_response(conn, :no_content, "") + else + {:registrations_open, _} -> + {:error, "To send invites you need to set the `registrations_open` option to false."} + + {:invites_enabled, _} -> + {:error, "To send invites you need to set the `invites_enabled` option to true."} end end @@ -658,6 +665,65 @@ def force_password_reset(%{assigns: %{user: admin}} = conn, %{"nicknames" => nic json_response(conn, :no_content, "") end + @doc "Disable mfa for user's account." + def disable_mfa(conn, %{"nickname" => nickname}) do + case User.get_by_nickname(nickname) do + %User{} = user -> + MFA.disable(user) + json(conn, nickname) + + _ -> + {:error, :not_found} + end + end + + @doc "Show a given user's credentials" + def show_user_credentials(%{assigns: %{user: admin}} = conn, %{"nickname" => nickname}) do + with %User{} = user <- User.get_cached_by_nickname_or_id(nickname) do + conn + |> put_view(AccountView) + |> render("credentials.json", %{user: user, for: admin}) + else + _ -> {:error, :not_found} + end + end + + @doc "Updates a given user" + def update_user_credentials( + %{assigns: %{user: admin}} = conn, + %{"nickname" => nickname} = params + ) do + with {_, %User{} = user} <- {:user, User.get_cached_by_nickname(nickname)}, + {:ok, _user} <- + User.update_as_admin(user, params) do + ModerationLog.insert_log(%{ + actor: admin, + subject: [user], + action: "updated_users" + }) + + if params["password"] do + User.force_password_reset_async(user) + end + + ModerationLog.insert_log(%{ + actor: admin, + subject: [user], + action: "force_password_reset" + }) + + json(conn, %{status: "success"}) + else + {:error, changeset} -> + errors = Map.new(changeset.errors, fn {key, {error, _}} -> {key, error} end) + + json(conn, %{errors: errors}) + + _ -> + json(conn, %{error: "Unable to update user."}) + end + end + def list_reports(conn, params) do {page, page_size} = page_params(params) @@ -668,14 +734,6 @@ def list_reports(conn, params) do |> render("index.json", %{reports: reports}) end - def list_grouped_reports(conn, _params) do - statuses = Utils.get_reported_activities() - - conn - |> put_view(ReportView) - |> render("index_grouped.json", Utils.get_reports_grouped_by_status(statuses)) - end - def report_show(conn, %{"id" => id}) do with %Activity{} = report <- Activity.get_by_id(id) do conn @@ -745,56 +803,6 @@ def report_notes_delete(%{assigns: %{user: user}} = conn, %{ end end - def list_statuses(%{assigns: %{user: _admin}} = conn, params) do - godmode = params["godmode"] == "true" || params["godmode"] == true - local_only = params["local_only"] == "true" || params["local_only"] == true - with_reblogs = params["with_reblogs"] == "true" || params["with_reblogs"] == true - {page, page_size} = page_params(params) - - activities = - ActivityPub.fetch_statuses(nil, %{ - "godmode" => godmode, - "local_only" => local_only, - "limit" => page_size, - "offset" => (page - 1) * page_size, - "exclude_reblogs" => !with_reblogs && "true" - }) - - conn - |> put_view(Pleroma.Web.AdminAPI.StatusView) - |> render("index.json", %{activities: activities, as: :activity}) - end - - def status_update(%{assigns: %{user: admin}} = conn, %{"id" => id} = params) do - with {:ok, activity} <- CommonAPI.update_activity_scope(id, params) do - {:ok, sensitive} = Ecto.Type.cast(:boolean, params["sensitive"]) - - ModerationLog.insert_log(%{ - action: "status_update", - actor: admin, - subject: activity, - sensitive: sensitive, - visibility: params["visibility"] - }) - - conn - |> put_view(StatusView) - |> render("show.json", %{activity: activity}) - end - end - - def status_delete(%{assigns: %{user: user}} = conn, %{"id" => id}) do - with {:ok, %Activity{}} <- CommonAPI.delete(id, user) do - ModerationLog.insert_log(%{ - action: "status_delete", - actor: user, - subject_id: id - }) - - json(conn, %{}) - end - end - def list_log(conn, params) do {page, page_size} = page_params(params) @@ -814,13 +822,13 @@ def list_log(conn, params) do end def config_descriptions(conn, _params) do - conn - |> Plug.Conn.put_resp_content_type("application/json") - |> Plug.Conn.send_resp(200, @descriptions_json) + descriptions = Enum.filter(@descriptions, &whitelisted_config?/1) + + json(conn, descriptions) end def config_show(conn, %{"only_db" => true}) do - with :ok <- configurable_from_database(conn) do + with :ok <- configurable_from_database() do configs = Pleroma.Repo.all(ConfigDB) conn @@ -830,7 +838,7 @@ def config_show(conn, %{"only_db" => true}) do end def config_show(conn, _params) do - with :ok <- configurable_from_database(conn) do + with :ok <- configurable_from_database() do configs = ConfigDB.get_all_as_keyword() merged = @@ -864,23 +872,16 @@ def config_show(conn, _params) do end) |> List.flatten() - response = %{configs: merged} - - response = - if Restarter.Pleroma.need_reboot?() do - Map.put(response, :need_reboot, true) - else - response - end - - json(conn, response) + json(conn, %{configs: merged, need_reboot: Restarter.Pleroma.need_reboot?()}) end end def config_update(conn, %{"configs" => configs}) do - with :ok <- configurable_from_database(conn) do + with :ok <- configurable_from_database() do {_errors, results} = - Enum.map(configs, fn + configs + |> Enum.filter(&whitelisted_config?/1) + |> Enum.map(fn %{"group" => group, "key" => key, "delete" => true} = params -> ConfigDB.delete(%{group: group, key: key, subkeys: params["subkeys"]}) @@ -900,50 +901,67 @@ def config_update(conn, %{"configs" => configs}) do Config.TransferTask.load_and_update_env(deleted, false) - need_reboot? = - Restarter.Pleroma.need_reboot?() || - Enum.any?(updated, fn config -> + if !Restarter.Pleroma.need_reboot?() do + changed_reboot_settings? = + (updated ++ deleted) + |> Enum.any?(fn config -> group = ConfigDB.from_string(config.group) key = ConfigDB.from_string(config.key) value = ConfigDB.from_binary(config.value) Config.TransferTask.pleroma_need_restart?(group, key, value) end) - response = %{configs: updated} - - response = - if need_reboot? do - Restarter.Pleroma.need_reboot() - Map.put(response, :need_reboot, need_reboot?) - else - response - end + if changed_reboot_settings?, do: Restarter.Pleroma.need_reboot() + end conn |> put_view(ConfigView) - |> render("index.json", response) + |> render("index.json", %{configs: updated, need_reboot: Restarter.Pleroma.need_reboot?()}) end end def restart(conn, _params) do - with :ok <- configurable_from_database(conn) do + with :ok <- configurable_from_database() do Restarter.Pleroma.restart(Config.get(:env), 50) json(conn, %{}) end end - defp configurable_from_database(conn) do + def need_reboot(conn, _params) do + json(conn, %{need_reboot: Restarter.Pleroma.need_reboot?()}) + end + + defp configurable_from_database do if Config.get(:configurable_from_database) do :ok else - errors( - conn, - {:error, "To use this endpoint you need to enable configuration from database."} - ) + {:error, "To use this endpoint you need to enable configuration from database."} end end + defp whitelisted_config?(group, key) do + if whitelisted_configs = Config.get(:database_config_whitelist) do + Enum.any?(whitelisted_configs, fn + {whitelisted_group} -> + group == inspect(whitelisted_group) + + {whitelisted_group, whitelisted_key} -> + group == inspect(whitelisted_group) && key == inspect(whitelisted_key) + end) + else + true + end + end + + defp whitelisted_config?(%{"group" => group, "key" => key}) do + whitelisted_config?(group, key) + end + + defp whitelisted_config?(%{:group => group} = config) do + whitelisted_config?(group, config[:key]) + end + def reload_emoji(conn, _params) do Pleroma.Emoji.reload() @@ -978,6 +996,83 @@ def resend_confirmation_email(%{assigns: %{user: admin}} = conn, %{"nicknames" = conn |> json("") end + def oauth_app_create(conn, params) do + params = + if params["name"] do + Map.put(params, "client_name", params["name"]) + else + params + end + + result = + case App.create(params) do + {:ok, app} -> + AppView.render("show.json", %{app: app, admin: true}) + + {:error, changeset} -> + App.errors(changeset) + end + + json(conn, result) + end + + def oauth_app_update(conn, params) do + params = + if params["name"] do + Map.put(params, "client_name", params["name"]) + else + params + end + + with {:ok, app} <- App.update(params) do + json(conn, AppView.render("show.json", %{app: app, admin: true})) + else + {:error, changeset} -> + json(conn, App.errors(changeset)) + + nil -> + json_response(conn, :bad_request, "") + end + end + + def oauth_app_list(conn, params) do + {page, page_size} = page_params(params) + + search_params = %{ + client_name: params["name"], + client_id: params["client_id"], + page: page, + page_size: page_size + } + + search_params = + if Map.has_key?(params, "trusted") do + Map.put(search_params, :trusted, params["trusted"]) + else + search_params + end + + with {:ok, apps, count} <- App.search(search_params) do + json( + conn, + AppView.render("index.json", + apps: apps, + count: count, + page_size: page_size, + admin: true + ) + ) + end + end + + def oauth_app_delete(conn, params) do + with {:ok, _app} <- App.destroy(params["id"]) do + json_response(conn, :no_content, "") + else + _ -> json_response(conn, :bad_request, "") + end + end + def stats(conn, _) do count = Stats.get_status_visibility_count() @@ -985,30 +1080,6 @@ def stats(conn, _) do |> json(%{"status_visibility" => count}) end - def errors(conn, {:error, :not_found}) do - conn - |> put_status(:not_found) - |> json(dgettext("errors", "Not found")) - end - - def errors(conn, {:error, reason}) do - conn - |> put_status(:bad_request) - |> json(reason) - end - - def errors(conn, {:param_cast, _}) do - conn - |> put_status(:bad_request) - |> json(dgettext("errors", "Invalid parameters")) - end - - def errors(conn, _) do - conn - |> put_status(:internal_server_error) - |> json(dgettext("errors", "Something went wrong")) - end - defp page_params(params) do {get_page(params["page"]), get_page_size(params["page_size"])} end diff --git a/lib/pleroma/web/admin_api/controllers/fallback_controller.ex b/lib/pleroma/web/admin_api/controllers/fallback_controller.ex new file mode 100644 index 000000000..82965936d --- /dev/null +++ b/lib/pleroma/web/admin_api/controllers/fallback_controller.ex @@ -0,0 +1,31 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.FallbackController do + use Pleroma.Web, :controller + + def call(conn, {:error, :not_found}) do + conn + |> put_status(:not_found) + |> json(%{error: dgettext("errors", "Not found")}) + end + + def call(conn, {:error, reason}) do + conn + |> put_status(:bad_request) + |> json(%{error: reason}) + end + + def call(conn, {:param_cast, _}) do + conn + |> put_status(:bad_request) + |> json(dgettext("errors", "Invalid parameters")) + end + + def call(conn, _) do + conn + |> put_status(:internal_server_error) + |> json(%{error: dgettext("errors", "Something went wrong")}) + end +end diff --git a/lib/pleroma/web/admin_api/controllers/status_controller.ex b/lib/pleroma/web/admin_api/controllers/status_controller.ex new file mode 100644 index 000000000..08cb9c10b --- /dev/null +++ b/lib/pleroma/web/admin_api/controllers/status_controller.ex @@ -0,0 +1,79 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.StatusController do + use Pleroma.Web, :controller + + alias Pleroma.Activity + alias Pleroma.ModerationLog + alias Pleroma.Plugs.OAuthScopesPlug + alias Pleroma.Web.ActivityPub.ActivityPub + alias Pleroma.Web.CommonAPI + alias Pleroma.Web.MastodonAPI + + require Logger + + plug(Pleroma.Web.ApiSpec.CastAndValidate) + plug(OAuthScopesPlug, %{scopes: ["read:statuses"], admin: true} when action in [:index, :show]) + + plug( + OAuthScopesPlug, + %{scopes: ["write:statuses"], admin: true} when action in [:update, :delete] + ) + + action_fallback(Pleroma.Web.AdminAPI.FallbackController) + + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.Admin.StatusOperation + + def index(%{assigns: %{user: _admin}} = conn, params) do + activities = + ActivityPub.fetch_statuses(nil, %{ + "godmode" => params.godmode, + "local_only" => params.local_only, + "limit" => params.page_size, + "offset" => (params.page - 1) * params.page_size, + "exclude_reblogs" => not params.with_reblogs + }) + + render(conn, "index.json", activities: activities, as: :activity) + end + + def show(conn, %{id: id}) do + with %Activity{} = activity <- Activity.get_by_id(id) do + conn + |> put_view(MastodonAPI.StatusView) + |> render("show.json", %{activity: activity}) + else + nil -> {:error, :not_found} + end + end + + def update(%{assigns: %{user: admin}, body_params: params} = conn, %{id: id}) do + with {:ok, activity} <- CommonAPI.update_activity_scope(id, params) do + ModerationLog.insert_log(%{ + action: "status_update", + actor: admin, + subject: activity, + sensitive: params[:sensitive], + visibility: params[:visibility] + }) + + conn + |> put_view(MastodonAPI.StatusView) + |> render("show.json", %{activity: activity}) + end + end + + def delete(%{assigns: %{user: user}} = conn, %{id: id}) do + with {:ok, %Activity{}} <- CommonAPI.delete(id, user) do + ModerationLog.insert_log(%{ + action: "status_delete", + actor: user, + subject_id: id + }) + + json(conn, %{}) + end + end +end diff --git a/lib/pleroma/web/admin_api/search.ex b/lib/pleroma/web/admin_api/search.ex index 29cea1f44..c28efadd5 100644 --- a/lib/pleroma/web/admin_api/search.ex +++ b/lib/pleroma/web/admin_api/search.ex @@ -21,6 +21,7 @@ def user(params \\ %{}) do query = params |> Map.drop([:page, :page_size]) + |> Map.put(:exclude_service_users, true) |> User.Query.build() |> order_by([u], u.nickname) diff --git a/lib/pleroma/web/admin_api/views/account_view.ex b/lib/pleroma/web/admin_api/views/account_view.ex index 1e03849de..46dadb5ee 100644 --- a/lib/pleroma/web/admin_api/views/account_view.ex +++ b/lib/pleroma/web/admin_api/views/account_view.ex @@ -6,7 +6,9 @@ defmodule Pleroma.Web.AdminAPI.AccountView do use Pleroma.Web, :view alias Pleroma.User + alias Pleroma.Web.AdminAPI alias Pleroma.Web.AdminAPI.AccountView + alias Pleroma.Web.MastodonAPI alias Pleroma.Web.MediaProxy def render("index.json", %{users: users, count: count, page_size: page_size}) do @@ -23,6 +25,43 @@ def render("index.json", %{users: users}) do } end + def render("credentials.json", %{user: user, for: for_user}) do + user = User.sanitize_html(user, User.html_filter_policy(for_user)) + avatar = User.avatar_url(user) |> MediaProxy.url() + banner = User.banner_url(user) |> MediaProxy.url() + background = image_url(user.background) |> MediaProxy.url() + + user + |> Map.take([ + :id, + :bio, + :email, + :fields, + :name, + :nickname, + :locked, + :no_rich_text, + :default_scope, + :hide_follows, + :hide_followers_count, + :hide_follows_count, + :hide_followers, + :hide_favorites, + :allow_following_move, + :show_role, + :skip_thread_containment, + :pleroma_settings_store, + :raw_fields, + :discoverable, + :actor_type + ]) + |> Map.merge(%{ + "avatar" => avatar, + "banner" => banner, + "background" => background + }) + end + def render("show.json", %{user: user}) do avatar = User.avatar_url(user) |> MediaProxy.url() display_name = Pleroma.HTML.strip_tags(user.name || user.nickname) @@ -82,6 +121,13 @@ def render("create-error.json", %{changeset: %Ecto.Changeset{changes: changes, e } end + def merge_account_views(%User{} = user) do + MastodonAPI.AccountView.render("show.json", %{user: user}) + |> Map.merge(AdminAPI.AccountView.render("show.json", %{user: user})) + end + + def merge_account_views(_), do: %{} + defp parse_error([]), do: "" defp parse_error(errors) do @@ -104,4 +150,7 @@ defp parse_error(errors) do "" end end + + defp image_url(%{"url" => [%{"href" => href} | _]}), do: href + defp image_url(_), do: nil end diff --git a/lib/pleroma/web/admin_api/views/report_view.ex b/lib/pleroma/web/admin_api/views/report_view.ex index fc8733ce8..f432b8c2c 100644 --- a/lib/pleroma/web/admin_api/views/report_view.ex +++ b/lib/pleroma/web/admin_api/views/report_view.ex @@ -4,13 +4,16 @@ defmodule Pleroma.Web.AdminAPI.ReportView do use Pleroma.Web, :view - alias Pleroma.Activity + alias Pleroma.HTML alias Pleroma.User + alias Pleroma.Web.AdminAPI alias Pleroma.Web.AdminAPI.Report alias Pleroma.Web.CommonAPI.Utils alias Pleroma.Web.MastodonAPI.StatusView + defdelegate merge_account_views(user), to: AdminAPI.AccountView + def render("index.json", %{reports: reports}) do %{ reports: @@ -38,38 +41,16 @@ def render("show.json", %{report: report, user: user, account: account, statuses actor: merge_account_views(user), content: content, created_at: created_at, - statuses: StatusView.render("index.json", %{activities: statuses, as: :activity}), + statuses: + StatusView.render("index.json", %{ + activities: statuses, + as: :activity + }), state: report.data["state"], notes: render(__MODULE__, "index_notes.json", %{notes: report.report_notes}) } end - def render("index_grouped.json", %{groups: groups}) do - reports = - Enum.map(groups, fn group -> - status = - case group.status do - %Activity{} = activity -> StatusView.render("show.json", %{activity: activity}) - _ -> group.status - end - - %{ - date: group[:date], - account: group[:account], - status: Map.put_new(status, "deleted", false), - actors: Enum.map(group[:actors], &merge_account_views/1), - reports: - group[:reports] - |> Enum.map(&Report.extract_report_info(&1)) - |> Enum.map(&render(__MODULE__, "show.json", &1)) - } - end) - - %{ - reports: reports - } - end - def render("index_notes.json", %{notes: notes}) when is_list(notes) do Enum.map(notes, &render(__MODULE__, "show_note.json", &1)) end @@ -91,11 +72,4 @@ def render("show_note.json", %{ created_at: Utils.to_masto_date(inserted_at) } end - - defp merge_account_views(%User{} = user) do - Pleroma.Web.MastodonAPI.AccountView.render("show.json", %{user: user}) - |> Map.merge(Pleroma.Web.AdminAPI.AccountView.render("show.json", %{user: user})) - end - - defp merge_account_views(_), do: %{} end diff --git a/lib/pleroma/web/admin_api/views/status_view.ex b/lib/pleroma/web/admin_api/views/status_view.ex index 360ddc22c..500800be2 100644 --- a/lib/pleroma/web/admin_api/views/status_view.ex +++ b/lib/pleroma/web/admin_api/views/status_view.ex @@ -7,36 +7,19 @@ defmodule Pleroma.Web.AdminAPI.StatusView do require Pleroma.Constants - alias Pleroma.User + alias Pleroma.Web.AdminAPI + alias Pleroma.Web.MastodonAPI + + defdelegate merge_account_views(user), to: AdminAPI.AccountView def render("index.json", opts) do safe_render_many(opts.activities, __MODULE__, "show.json", opts) end def render("show.json", %{activity: %{data: %{"object" => _object}} = activity} = opts) do - user = get_user(activity.data["actor"]) + user = MastodonAPI.StatusView.get_user(activity.data["actor"]) - Pleroma.Web.MastodonAPI.StatusView.render("show.json", opts) + MastodonAPI.StatusView.render("show.json", opts) |> Map.merge(%{account: merge_account_views(user)}) end - - defp merge_account_views(%User{} = user) do - Pleroma.Web.MastodonAPI.AccountView.render("show.json", %{user: user}) - |> Map.merge(Pleroma.Web.AdminAPI.AccountView.render("show.json", %{user: user})) - end - - defp merge_account_views(_), do: %{} - - defp get_user(ap_id) do - cond do - user = User.get_cached_by_ap_id(ap_id) -> - user - - user = User.get_by_guessed_nickname(ap_id) -> - user - - true -> - User.error_user(ap_id) - end - end end diff --git a/lib/pleroma/web/api_spec.ex b/lib/pleroma/web/api_spec.ex new file mode 100644 index 000000000..79fd5f871 --- /dev/null +++ b/lib/pleroma/web/api_spec.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.ApiSpec do + alias OpenApiSpex.OpenApi + alias OpenApiSpex.Operation + alias Pleroma.Web.Endpoint + alias Pleroma.Web.Router + + @behaviour OpenApi + + @impl OpenApi + def spec do + %OpenApi{ + servers: [ + # Populate the Server info from a phoenix endpoint + OpenApiSpex.Server.from_endpoint(Endpoint) + ], + info: %OpenApiSpex.Info{ + title: "Pleroma", + description: Application.spec(:pleroma, :description) |> to_string(), + version: Application.spec(:pleroma, :vsn) |> to_string() + }, + # populate the paths from a phoenix router + paths: OpenApiSpex.Paths.from_router(Router), + components: %OpenApiSpex.Components{ + parameters: %{ + "accountIdOrNickname" => + Operation.parameter(:id, :path, :string, "Account ID or nickname", + example: "123", + required: true + ) + }, + securitySchemes: %{ + "oAuth" => %OpenApiSpex.SecurityScheme{ + type: "oauth2", + flows: %OpenApiSpex.OAuthFlows{ + password: %OpenApiSpex.OAuthFlow{ + authorizationUrl: "/oauth/authorize", + tokenUrl: "/oauth/token", + scopes: %{ + "read" => "read", + "write" => "write", + "follow" => "follow", + "push" => "push" + } + } + } + } + } + } + } + # discover request/response schemas from path specs + |> OpenApiSpex.resolve_schema_modules() + end +end diff --git a/lib/pleroma/web/api_spec/cast_and_validate.ex b/lib/pleroma/web/api_spec/cast_and_validate.ex new file mode 100644 index 000000000..bd9026237 --- /dev/null +++ b/lib/pleroma/web/api_spec/cast_and_validate.ex @@ -0,0 +1,139 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2019-2020 Moxley Stratton, Mike Buhot , MPL-2.0 +# Copyright © 2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.CastAndValidate do + @moduledoc """ + This plug is based on [`OpenApiSpex.Plug.CastAndValidate`] + (https://github.com/open-api-spex/open_api_spex/blob/master/lib/open_api_spex/plug/cast_and_validate.ex). + The main difference is ignoring unexpected query params instead of throwing + an error and a config option (`[Pleroma.Web.ApiSpec.CastAndValidate, :strict]`) + to disable this behavior. Also, the default rendering error module + is `Pleroma.Web.ApiSpec.RenderError`. + """ + + @behaviour Plug + + alias Plug.Conn + + @impl Plug + def init(opts) do + opts + |> Map.new() + |> Map.put_new(:render_error, Pleroma.Web.ApiSpec.RenderError) + end + + @impl Plug + def call(%{private: %{open_api_spex: private_data}} = conn, %{ + operation_id: operation_id, + render_error: render_error + }) do + spec = private_data.spec + operation = private_data.operation_lookup[operation_id] + + content_type = + case Conn.get_req_header(conn, "content-type") do + [header_value | _] -> + header_value + |> String.split(";") + |> List.first() + + _ -> + nil + end + + private_data = Map.put(private_data, :operation_id, operation_id) + conn = Conn.put_private(conn, :open_api_spex, private_data) + + case cast_and_validate(spec, operation, conn, content_type, strict?()) do + {:ok, conn} -> + conn + + {:error, reason} -> + opts = render_error.init(reason) + + conn + |> render_error.call(opts) + |> Plug.Conn.halt() + end + end + + def call( + %{ + private: %{ + phoenix_controller: controller, + phoenix_action: action, + open_api_spex: private_data + } + } = conn, + opts + ) do + operation = + case private_data.operation_lookup[{controller, action}] do + nil -> + operation_id = controller.open_api_operation(action).operationId + operation = private_data.operation_lookup[operation_id] + + operation_lookup = + private_data.operation_lookup + |> Map.put({controller, action}, operation) + + OpenApiSpex.Plug.Cache.adapter().put( + private_data.spec_module, + {private_data.spec, operation_lookup} + ) + + operation + + operation -> + operation + end + + if operation.operationId do + call(conn, Map.put(opts, :operation_id, operation.operationId)) + else + raise "operationId was not found in action API spec" + end + end + + def call(conn, opts), do: OpenApiSpex.Plug.CastAndValidate.call(conn, opts) + + defp cast_and_validate(spec, operation, conn, content_type, true = _strict) do + OpenApiSpex.cast_and_validate(spec, operation, conn, content_type) + end + + defp cast_and_validate(spec, operation, conn, content_type, false = _strict) do + case OpenApiSpex.cast_and_validate(spec, operation, conn, content_type) do + {:ok, conn} -> + {:ok, conn} + + # Remove unexpected query params and cast/validate again + {:error, errors} -> + query_params = + Enum.reduce(errors, conn.query_params, fn + %{reason: :unexpected_field, name: name, path: [name]}, params -> + Map.delete(params, name) + + %{reason: :invalid_enum, name: nil, path: path, value: value}, params -> + path = path |> Enum.reverse() |> tl() |> Enum.reverse() |> list_items_to_string() + update_in(params, path, &List.delete(&1, value)) + + _, params -> + params + end) + + conn = %Conn{conn | query_params: query_params} + OpenApiSpex.cast_and_validate(spec, operation, conn, content_type) + end + end + + defp list_items_to_string(list) do + Enum.map(list, fn + i when is_atom(i) -> to_string(i) + i -> i + end) + end + + defp strict?, do: Pleroma.Config.get([__MODULE__, :strict], false) +end diff --git a/lib/pleroma/web/api_spec/helpers.ex b/lib/pleroma/web/api_spec/helpers.ex new file mode 100644 index 000000000..a9cfe0fed --- /dev/null +++ b/lib/pleroma/web/api_spec/helpers.ex @@ -0,0 +1,71 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Helpers do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.BooleanLike + + def request_body(description, schema_ref, opts \\ []) do + media_types = ["application/json", "multipart/form-data", "application/x-www-form-urlencoded"] + + content = + media_types + |> Enum.map(fn type -> + {type, + %OpenApiSpex.MediaType{ + schema: schema_ref, + example: opts[:example], + examples: opts[:examples] + }} + end) + |> Enum.into(%{}) + + %OpenApiSpex.RequestBody{ + description: description, + content: content, + required: opts[:required] || false + } + end + + def pagination_params do + [ + Operation.parameter(:max_id, :query, :string, "Return items older than this ID"), + Operation.parameter(:min_id, :query, :string, "Return the oldest items newer than this ID"), + Operation.parameter( + :since_id, + :query, + :string, + "Return the newest items newer than this ID" + ), + Operation.parameter( + :limit, + :query, + %Schema{type: :integer, default: 20}, + "Maximum number of items to return. Will be ignored if it's more than 40" + ) + ] + end + + def with_relationships_param do + Operation.parameter( + :with_relationships, + :query, + BooleanLike, + "Embed relationships into accounts." + ) + end + + def empty_object_response do + Operation.response("Empty object", "application/json", %Schema{type: :object, example: %{}}) + end + + def empty_array_response do + Operation.response("Empty array", "application/json", %Schema{type: :array, example: []}) + end + + def no_content_response do + Operation.response("No Content", "application/json", %Schema{type: :string, example: ""}) + end +end diff --git a/lib/pleroma/web/api_spec/operations/account_operation.ex b/lib/pleroma/web/api_spec/operations/account_operation.ex new file mode 100644 index 000000000..20572f8ea --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/account_operation.ex @@ -0,0 +1,730 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.AccountOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Reference + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.Account + alias Pleroma.Web.ApiSpec.Schemas.AccountRelationship + alias Pleroma.Web.ApiSpec.Schemas.ActorType + alias Pleroma.Web.ApiSpec.Schemas.ApiError + alias Pleroma.Web.ApiSpec.Schemas.BooleanLike + alias Pleroma.Web.ApiSpec.Schemas.List + alias Pleroma.Web.ApiSpec.Schemas.Status + alias Pleroma.Web.ApiSpec.Schemas.VisibilityScope + + 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 + + @spec create_operation() :: Operation.t() + def create_operation do + %Operation{ + tags: ["accounts"], + summary: "Register an account", + description: + "Creates a user and account records. Returns an account access token for the app that initiated the request. The app should save this token for later, and should wait for the user to confirm their account by clicking a link in their email inbox.", + operationId: "AccountController.create", + requestBody: request_body("Parameters", create_request(), required: true), + responses: %{ + 200 => Operation.response("Account", "application/json", create_response()), + 400 => Operation.response("Error", "application/json", ApiError), + 403 => Operation.response("Error", "application/json", ApiError), + 429 => Operation.response("Error", "application/json", ApiError) + } + } + end + + def verify_credentials_operation do + %Operation{ + tags: ["accounts"], + description: "Test to make sure that the user token works.", + summary: "Verify account credentials", + operationId: "AccountController.verify_credentials", + security: [%{"oAuth" => ["read:accounts"]}], + responses: %{ + 200 => Operation.response("Account", "application/json", Account) + } + } + end + + def update_credentials_operation do + %Operation{ + tags: ["accounts"], + summary: "Update account credentials", + description: "Update the user's display and preferences.", + operationId: "AccountController.update_credentials", + security: [%{"oAuth" => ["write:accounts"]}], + requestBody: request_body("Parameters", update_creadentials_request(), required: true), + responses: %{ + 200 => Operation.response("Account", "application/json", Account), + 403 => Operation.response("Error", "application/json", ApiError) + } + } + end + + def relationships_operation do + %Operation{ + tags: ["accounts"], + summary: "Check relationships to other accounts", + operationId: "AccountController.relationships", + description: "Find out whether a given account is followed, blocked, muted, etc.", + security: [%{"oAuth" => ["read:follows"]}], + parameters: [ + Operation.parameter( + :id, + :query, + %Schema{ + oneOf: [%Schema{type: :array, items: %Schema{type: :string}}, %Schema{type: :string}] + }, + "Account IDs", + example: "123" + ) + ], + responses: %{ + 200 => Operation.response("Account", "application/json", array_of_relationships()) + } + } + end + + def show_operation do + %Operation{ + tags: ["accounts"], + summary: "Account", + operationId: "AccountController.show", + description: "View information about a profile.", + parameters: [%Reference{"$ref": "#/components/parameters/accountIdOrNickname"}], + responses: %{ + 200 => Operation.response("Account", "application/json", Account), + 404 => Operation.response("Error", "application/json", ApiError) + } + } + end + + def statuses_operation do + %Operation{ + tags: ["accounts"], + summary: "Statuses", + operationId: "AccountController.statuses", + description: + "Statuses posted to the given account. Public (for public statuses only), or user token + `read:statuses` (for private statuses the user is authorized to see)", + parameters: + [ + %Reference{"$ref": "#/components/parameters/accountIdOrNickname"}, + Operation.parameter(:pinned, :query, BooleanLike, "Include only pinned statuses"), + Operation.parameter(:tagged, :query, :string, "With tag"), + Operation.parameter( + :only_media, + :query, + BooleanLike, + "Include only statuses with media attached" + ), + Operation.parameter( + :with_muted, + :query, + BooleanLike, + "Include statuses from muted acccounts." + ), + Operation.parameter(:exclude_reblogs, :query, BooleanLike, "Exclude reblogs"), + Operation.parameter(:exclude_replies, :query, BooleanLike, "Exclude replies"), + Operation.parameter( + :exclude_visibilities, + :query, + %Schema{type: :array, items: VisibilityScope}, + "Exclude visibilities" + ) + ] ++ pagination_params(), + responses: %{ + 200 => Operation.response("Statuses", "application/json", array_of_statuses()), + 404 => Operation.response("Error", "application/json", ApiError) + } + } + end + + def followers_operation do + %Operation{ + tags: ["accounts"], + summary: "Followers", + operationId: "AccountController.followers", + security: [%{"oAuth" => ["read:accounts"]}], + description: + "Accounts which follow the given account, if network is not hidden by the account owner.", + parameters: [ + %Reference{"$ref": "#/components/parameters/accountIdOrNickname"}, + with_relationships_param() | pagination_params() + ], + responses: %{ + 200 => Operation.response("Accounts", "application/json", array_of_accounts()) + } + } + end + + def following_operation do + %Operation{ + tags: ["accounts"], + summary: "Following", + operationId: "AccountController.following", + security: [%{"oAuth" => ["read:accounts"]}], + description: + "Accounts which the given account is following, if network is not hidden by the account owner.", + parameters: [ + %Reference{"$ref": "#/components/parameters/accountIdOrNickname"}, + with_relationships_param() | pagination_params() + ], + responses: %{200 => Operation.response("Accounts", "application/json", array_of_accounts())} + } + end + + def lists_operation do + %Operation{ + tags: ["accounts"], + summary: "Lists containing this account", + operationId: "AccountController.lists", + security: [%{"oAuth" => ["read:lists"]}], + description: "User lists that you have added this account to.", + parameters: [%Reference{"$ref": "#/components/parameters/accountIdOrNickname"}], + responses: %{200 => Operation.response("Lists", "application/json", array_of_lists())} + } + end + + def follow_operation do + %Operation{ + tags: ["accounts"], + summary: "Follow", + operationId: "AccountController.follow", + security: [%{"oAuth" => ["follow", "write:follows"]}], + description: "Follow the given account", + parameters: [ + %Reference{"$ref": "#/components/parameters/accountIdOrNickname"}, + Operation.parameter( + :reblogs, + :query, + BooleanLike, + "Receive this account's reblogs in home timeline? Defaults to true." + ) + ], + responses: %{ + 200 => Operation.response("Relationship", "application/json", AccountRelationship), + 400 => Operation.response("Error", "application/json", ApiError), + 404 => Operation.response("Error", "application/json", ApiError) + } + } + end + + def unfollow_operation do + %Operation{ + tags: ["accounts"], + summary: "Unfollow", + operationId: "AccountController.unfollow", + security: [%{"oAuth" => ["follow", "write:follows"]}], + description: "Unfollow the given account", + parameters: [%Reference{"$ref": "#/components/parameters/accountIdOrNickname"}], + responses: %{ + 200 => Operation.response("Relationship", "application/json", AccountRelationship), + 400 => Operation.response("Error", "application/json", ApiError), + 404 => Operation.response("Error", "application/json", ApiError) + } + } + end + + def mute_operation do + %Operation{ + tags: ["accounts"], + summary: "Mute", + operationId: "AccountController.mute", + security: [%{"oAuth" => ["follow", "write:mutes"]}], + requestBody: request_body("Parameters", mute_request()), + description: + "Mute the given account. Clients should filter statuses and notifications from this account, if received (e.g. due to a boost in the Home timeline).", + parameters: [ + %Reference{"$ref": "#/components/parameters/accountIdOrNickname"}, + Operation.parameter( + :notifications, + :query, + %Schema{allOf: [BooleanLike], default: true}, + "Mute notifications in addition to statuses? Defaults to `true`." + ) + ], + responses: %{ + 200 => Operation.response("Relationship", "application/json", AccountRelationship) + } + } + end + + def unmute_operation do + %Operation{ + tags: ["accounts"], + summary: "Unmute", + operationId: "AccountController.unmute", + security: [%{"oAuth" => ["follow", "write:mutes"]}], + description: "Unmute the given account.", + parameters: [%Reference{"$ref": "#/components/parameters/accountIdOrNickname"}], + responses: %{ + 200 => Operation.response("Relationship", "application/json", AccountRelationship) + } + } + end + + def block_operation do + %Operation{ + tags: ["accounts"], + summary: "Block", + operationId: "AccountController.block", + security: [%{"oAuth" => ["follow", "write:blocks"]}], + description: + "Block the given account. Clients should filter statuses from this account if received (e.g. due to a boost in the Home timeline)", + parameters: [%Reference{"$ref": "#/components/parameters/accountIdOrNickname"}], + responses: %{ + 200 => Operation.response("Relationship", "application/json", AccountRelationship) + } + } + end + + def unblock_operation do + %Operation{ + tags: ["accounts"], + summary: "Unblock", + operationId: "AccountController.unblock", + security: [%{"oAuth" => ["follow", "write:blocks"]}], + description: "Unblock the given account.", + parameters: [%Reference{"$ref": "#/components/parameters/accountIdOrNickname"}], + responses: %{ + 200 => Operation.response("Relationship", "application/json", AccountRelationship) + } + } + end + + def follow_by_uri_operation do + %Operation{ + tags: ["accounts"], + summary: "Follow by URI", + operationId: "AccountController.follows", + security: [%{"oAuth" => ["follow", "write:follows"]}], + requestBody: request_body("Parameters", follow_by_uri_request(), required: true), + responses: %{ + 200 => Operation.response("Account", "application/json", AccountRelationship), + 400 => Operation.response("Error", "application/json", ApiError), + 404 => Operation.response("Error", "application/json", ApiError) + } + } + end + + def mutes_operation do + %Operation{ + tags: ["accounts"], + summary: "Muted accounts", + operationId: "AccountController.mutes", + description: "Accounts the user has muted.", + security: [%{"oAuth" => ["follow", "read:mutes"]}], + responses: %{ + 200 => Operation.response("Accounts", "application/json", array_of_accounts()) + } + } + end + + def blocks_operation do + %Operation{ + tags: ["accounts"], + summary: "Blocked users", + operationId: "AccountController.blocks", + description: "View your blocks. See also accounts/:id/{block,unblock}", + security: [%{"oAuth" => ["read:blocks"]}], + responses: %{ + 200 => Operation.response("Accounts", "application/json", array_of_accounts()) + } + } + end + + def endorsements_operation do + %Operation{ + tags: ["accounts"], + summary: "Endorsements", + operationId: "AccountController.endorsements", + description: "Not implemented", + security: [%{"oAuth" => ["read:accounts"]}], + responses: %{ + 200 => empty_array_response() + } + } + end + + def identity_proofs_operation do + %Operation{ + tags: ["accounts"], + summary: "Identity proofs", + operationId: "AccountController.identity_proofs", + description: "Not implemented", + responses: %{ + 200 => empty_array_response() + } + } + end + + defp create_request do + %Schema{ + title: "AccountCreateRequest", + description: "POST body for creating an account", + type: :object, + required: [:username, :password, :agreement], + properties: %{ + reason: %Schema{ + type: :string, + nullable: true, + description: + "Text that will be reviewed by moderators if registrations require manual approval" + }, + username: %Schema{type: :string, description: "The desired username for the account"}, + email: %Schema{ + type: :string, + nullable: true, + description: + "The email address to be used for login. Required when `account_activation_required` is enabled.", + format: :email + }, + password: %Schema{ + type: :string, + description: "The password to be used for login", + format: :password + }, + agreement: %Schema{ + allOf: [BooleanLike], + description: + "Whether the user agrees to the local rules, terms, and policies. These should be presented to the user in order to allow them to consent before setting this parameter to TRUE." + }, + locale: %Schema{ + type: :string, + nullable: true, + description: "The language of the confirmation email that will be sent" + }, + # Pleroma-specific properties: + fullname: %Schema{type: :string, nullable: true, description: "Full name"}, + bio: %Schema{type: :string, description: "Bio", nullable: true, default: ""}, + captcha_solution: %Schema{ + type: :string, + nullable: true, + description: "Provider-specific captcha solution" + }, + captcha_token: %Schema{ + type: :string, + nullable: true, + description: "Provider-specific captcha token" + }, + captcha_answer_data: %Schema{ + type: :string, + nullable: true, + description: "Provider-specific captcha data" + }, + token: %Schema{ + type: :string, + nullable: true, + description: "Invite token required when the registrations aren't public" + } + }, + example: %{ + "username" => "cofe", + "email" => "cofe@example.com", + "password" => "secret", + "agreement" => "true", + "bio" => "☕️" + } + } + end + + defp create_response do + %Schema{ + title: "AccountCreateResponse", + description: "Response schema for an account", + type: :object, + properties: %{ + token_type: %Schema{type: :string}, + access_token: %Schema{type: :string}, + scope: %Schema{type: :array, items: %Schema{type: :string}}, + created_at: %Schema{type: :integer, format: :"date-time"} + }, + example: %{ + "access_token" => "i9hAVVzGld86Pl5JtLtizKoXVvtTlSCJvwaugCxvZzk", + "created_at" => 1_585_918_714, + "scope" => ["read", "write", "follow", "push"], + "token_type" => "Bearer" + } + } + end + + defp update_creadentials_request do + %Schema{ + title: "AccountUpdateCredentialsRequest", + description: "POST body for creating an account", + type: :object, + properties: %{ + bot: %Schema{ + allOf: [BooleanLike], + nullable: true, + description: "Whether the account has a bot flag." + }, + display_name: %Schema{ + type: :string, + nullable: true, + description: "The display name to use for the profile." + }, + note: %Schema{type: :string, description: "The account bio."}, + avatar: %Schema{ + type: :string, + nullable: true, + description: "Avatar image encoded using multipart/form-data", + format: :binary + }, + header: %Schema{ + type: :string, + nullable: true, + description: "Header image encoded using multipart/form-data", + format: :binary + }, + locked: %Schema{ + allOf: [BooleanLike], + nullable: true, + description: "Whether manual approval of follow requests is required." + }, + fields_attributes: %Schema{ + nullable: true, + oneOf: [ + %Schema{type: :array, items: attribute_field()}, + %Schema{type: :object, additionalProperties: %Schema{type: attribute_field()}} + ] + }, + # NOTE: `source` field is not supported + # + # source: %Schema{ + # type: :object, + # properties: %{ + # privacy: %Schema{type: :string}, + # sensitive: %Schema{type: :boolean}, + # language: %Schema{type: :string} + # } + # }, + + # Pleroma-specific fields + no_rich_text: %Schema{ + allOf: [BooleanLike], + nullable: true, + description: "html tags are stripped from all statuses requested from the API" + }, + hide_followers: %Schema{ + allOf: [BooleanLike], + nullable: true, + description: "user's followers will be hidden" + }, + hide_follows: %Schema{ + allOf: [BooleanLike], + nullable: true, + description: "user's follows will be hidden" + }, + hide_followers_count: %Schema{ + allOf: [BooleanLike], + nullable: true, + description: "user's follower count will be hidden" + }, + hide_follows_count: %Schema{ + allOf: [BooleanLike], + nullable: true, + description: "user's follow count will be hidden" + }, + hide_favorites: %Schema{ + allOf: [BooleanLike], + nullable: true, + description: "user's favorites timeline will be hidden" + }, + show_role: %Schema{ + allOf: [BooleanLike], + nullable: true, + description: "user's role (e.g admin, moderator) will be exposed to anyone in the + API" + }, + default_scope: VisibilityScope, + pleroma_settings_store: %Schema{ + type: :object, + nullable: true, + description: "Opaque user settings to be saved on the backend." + }, + skip_thread_containment: %Schema{ + allOf: [BooleanLike], + nullable: true, + description: "Skip filtering out broken threads" + }, + allow_following_move: %Schema{ + allOf: [BooleanLike], + nullable: true, + description: "Allows automatically follow moved following accounts" + }, + pleroma_background_image: %Schema{ + type: :string, + nullable: true, + description: "Sets the background image of the user.", + format: :binary + }, + discoverable: %Schema{ + allOf: [BooleanLike], + nullable: true, + description: + "Discovery of this account in search results and other services is allowed." + }, + actor_type: ActorType + }, + example: %{ + bot: false, + display_name: "cofe", + note: "foobar", + fields_attributes: [%{name: "foo", value: "bar"}], + no_rich_text: false, + hide_followers: true, + hide_follows: false, + hide_followers_count: false, + hide_follows_count: false, + hide_favorites: false, + show_role: false, + default_scope: "private", + pleroma_settings_store: %{"pleroma-fe" => %{"key" => "val"}}, + skip_thread_containment: false, + allow_following_move: false, + discoverable: false, + actor_type: "Person" + } + } + end + + def array_of_accounts do + %Schema{ + title: "ArrayOfAccounts", + type: :array, + items: Account, + example: [Account.schema().example] + } + end + + defp array_of_relationships do + %Schema{ + title: "ArrayOfRelationships", + description: "Response schema for account relationships", + type: :array, + items: AccountRelationship, + example: [ + %{ + "id" => "1", + "following" => true, + "showing_reblogs" => true, + "followed_by" => true, + "blocking" => false, + "blocked_by" => true, + "muting" => false, + "muting_notifications" => false, + "requested" => false, + "domain_blocking" => false, + "subscribing" => false, + "endorsed" => true + }, + %{ + "id" => "2", + "following" => true, + "showing_reblogs" => true, + "followed_by" => true, + "blocking" => false, + "blocked_by" => true, + "muting" => true, + "muting_notifications" => false, + "requested" => true, + "domain_blocking" => false, + "subscribing" => false, + "endorsed" => false + }, + %{ + "id" => "3", + "following" => true, + "showing_reblogs" => true, + "followed_by" => true, + "blocking" => true, + "blocked_by" => false, + "muting" => true, + "muting_notifications" => false, + "requested" => false, + "domain_blocking" => true, + "subscribing" => true, + "endorsed" => false + } + ] + } + end + + defp follow_by_uri_request do + %Schema{ + title: "AccountFollowsRequest", + description: "POST body for muting an account", + type: :object, + properties: %{ + uri: %Schema{type: :string, nullable: true, format: :uri} + }, + required: [:uri] + } + end + + defp mute_request do + %Schema{ + title: "AccountMuteRequest", + description: "POST body for muting an account", + type: :object, + properties: %{ + notifications: %Schema{ + allOf: [BooleanLike], + nullable: true, + description: "Mute notifications in addition to statuses? Defaults to true.", + default: true + } + }, + example: %{ + "notifications" => true + } + } + end + + defp array_of_lists do + %Schema{ + title: "ArrayOfLists", + description: "Response schema for lists", + type: :array, + items: List, + example: [ + %{"id" => "123", "title" => "my list"}, + %{"id" => "1337", "title" => "anotehr list"} + ] + } + end + + defp array_of_statuses do + %Schema{ + title: "ArrayOfStatuses", + type: :array, + items: Status + } + end + + defp attribute_field do + %Schema{ + title: "AccountAttributeField", + description: "Request schema for account custom fields", + type: :object, + properties: %{ + name: %Schema{type: :string}, + value: %Schema{type: :string} + }, + required: [:name, :value], + example: %{ + "name" => "Website", + "value" => "https://pleroma.com" + } + } + end +end diff --git a/lib/pleroma/web/api_spec/operations/admin/status_operation.ex b/lib/pleroma/web/api_spec/operations/admin/status_operation.ex new file mode 100644 index 000000000..0b138dc79 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/admin/status_operation.ex @@ -0,0 +1,165 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Admin.StatusOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.Account + alias Pleroma.Web.ApiSpec.Schemas.ApiError + alias Pleroma.Web.ApiSpec.Schemas.FlakeID + alias Pleroma.Web.ApiSpec.Schemas.Status + alias Pleroma.Web.ApiSpec.Schemas.VisibilityScope + + import Pleroma.Web.ApiSpec.Helpers + import Pleroma.Web.ApiSpec.StatusOperation, only: [id_param: 0] + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def index_operation do + %Operation{ + tags: ["Admin", "Statuses"], + operationId: "AdminAPI.StatusController.index", + security: [%{"oAuth" => ["read:statuses"]}], + parameters: [ + Operation.parameter( + :godmode, + :query, + %Schema{type: :boolean, default: false}, + "Allows to see private statuses" + ), + Operation.parameter( + :local_only, + :query, + %Schema{type: :boolean, default: false}, + "Excludes remote statuses" + ), + Operation.parameter( + :with_reblogs, + :query, + %Schema{type: :boolean, default: false}, + "Allows to see reblogs" + ), + Operation.parameter( + :page, + :query, + %Schema{type: :integer, default: 1}, + "Page" + ), + Operation.parameter( + :page_size, + :query, + %Schema{type: :integer, default: 50}, + "Number of statuses to return" + ) + ], + responses: %{ + 200 => + Operation.response("Array of statuses", "application/json", %Schema{ + type: :array, + items: status() + }) + } + } + end + + def show_operation do + %Operation{ + tags: ["Admin", "Statuses"], + summary: "Show Status", + operationId: "AdminAPI.StatusController.show", + parameters: [id_param()], + security: [%{"oAuth" => ["read:statuses"]}], + responses: %{ + 200 => Operation.response("Status", "application/json", Status), + 404 => Operation.response("Not Found", "application/json", ApiError) + } + } + end + + def update_operation do + %Operation{ + tags: ["Admin", "Statuses"], + summary: "Change the scope of an individual reported status", + operationId: "AdminAPI.StatusController.update", + parameters: [id_param()], + security: [%{"oAuth" => ["write:statuses"]}], + requestBody: request_body("Parameters", update_request(), required: true), + responses: %{ + 200 => Operation.response("Status", "application/json", Status), + 400 => Operation.response("Error", "application/json", ApiError) + } + } + end + + def delete_operation do + %Operation{ + tags: ["Admin", "Statuses"], + summary: "Delete an individual reported status", + operationId: "AdminAPI.StatusController.delete", + parameters: [id_param()], + security: [%{"oAuth" => ["write:statuses"]}], + responses: %{ + 200 => empty_object_response(), + 404 => Operation.response("Not Found", "application/json", ApiError) + } + } + end + + defp status do + %Schema{ + anyOf: [ + Status, + %Schema{ + type: :object, + properties: %{ + account: %Schema{allOf: [Account, admin_account()]} + } + } + ] + } + end + + defp admin_account do + %Schema{ + type: :object, + properties: %{ + id: FlakeID, + avatar: %Schema{type: :string}, + nickname: %Schema{type: :string}, + display_name: %Schema{type: :string}, + deactivated: %Schema{type: :boolean}, + local: %Schema{type: :boolean}, + roles: %Schema{ + type: :object, + properties: %{ + admin: %Schema{type: :boolean}, + moderator: %Schema{type: :boolean} + } + }, + tags: %Schema{type: :string}, + confirmation_pending: %Schema{type: :string} + } + } + end + + defp update_request do + %Schema{ + type: :object, + properties: %{ + sensitive: %Schema{ + type: :boolean, + description: "Mark status and attached media as sensitive?" + }, + visibility: VisibilityScope + }, + example: %{ + "visibility" => "private", + "sensitive" => "false" + } + } + end +end diff --git a/lib/pleroma/web/api_spec/operations/app_operation.ex b/lib/pleroma/web/api_spec/operations/app_operation.ex new file mode 100644 index 000000000..ae01cbbec --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/app_operation.ex @@ -0,0 +1,148 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.AppOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias 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 + + @spec create_operation() :: Operation.t() + def create_operation do + %Operation{ + tags: ["apps"], + summary: "Create an application", + description: "Create a new application to obtain OAuth2 credentials", + operationId: "AppController.create", + requestBody: Helpers.request_body("Parameters", create_request(), required: true), + responses: %{ + 200 => Operation.response("App", "application/json", create_response()), + 422 => + Operation.response( + "Unprocessable Entity", + "application/json", + %Schema{ + type: :object, + description: + "If a required parameter is missing or improperly formatted, the request will fail.", + properties: %{ + error: %Schema{type: :string} + }, + example: %{ + "error" => "Validation failed: Redirect URI must be an absolute URI." + } + } + ) + } + } + end + + def verify_credentials_operation do + %Operation{ + tags: ["apps"], + summary: "Verify your app works", + description: "Confirm that the app's OAuth2 credentials work.", + operationId: "AppController.verify_credentials", + security: [%{"oAuth" => ["read"]}], + responses: %{ + 200 => + Operation.response("App", "application/json", %Schema{ + type: :object, + description: + "If the Authorization header was provided with a valid token, you should see your app returned as an Application entity.", + properties: %{ + name: %Schema{type: :string}, + vapid_key: %Schema{type: :string}, + website: %Schema{type: :string, nullable: true} + }, + example: %{ + "name" => "My App", + "vapid_key" => + "BCk-QqERU0q-CfYZjcuB6lnyyOYfJ2AifKqfeGIm7Z-HiTU5T9eTG5GxVA0_OH5mMlI4UkkDTpaZwozy0TzdZ2M=", + "website" => "https://myapp.com/" + } + }), + 422 => + Operation.response( + "Unauthorized", + "application/json", + %Schema{ + type: :object, + description: + "If the Authorization header contains an invalid token, is malformed, or is not present, an error will be returned indicating an authorization failure.", + properties: %{ + error: %Schema{type: :string} + }, + example: %{ + "error" => "The access token is invalid." + } + } + ) + } + } + end + + defp create_request do + %Schema{ + title: "AppCreateRequest", + description: "POST body for creating an app", + type: :object, + properties: %{ + client_name: %Schema{type: :string, description: "A name for your application."}, + redirect_uris: %Schema{ + type: :string, + description: + "Where the user should be redirected after authorization. To display the authorization code to the user instead of redirecting to a web page, use `urn:ietf:wg:oauth:2.0:oob` in this parameter." + }, + scopes: %Schema{ + type: :string, + description: "Space separated list of scopes", + default: "read" + }, + website: %Schema{ + type: :string, + nullable: true, + description: "A URL to the homepage of your app" + } + }, + required: [:client_name, :redirect_uris], + example: %{ + "client_name" => "My App", + "redirect_uris" => "https://myapp.com/auth/callback", + "website" => "https://myapp.com/" + } + } + end + + defp create_response do + %Schema{ + title: "AppCreateResponse", + description: "Response schema for an app", + type: :object, + properties: %{ + id: %Schema{type: :string}, + name: %Schema{type: :string}, + client_id: %Schema{type: :string}, + client_secret: %Schema{type: :string}, + redirect_uri: %Schema{type: :string}, + vapid_key: %Schema{type: :string}, + website: %Schema{type: :string, nullable: true} + }, + example: %{ + "id" => "123", + "name" => "My App", + "client_id" => "TWhM-tNSuncnqN7DBJmoyeLnk6K3iJJ71KKXxgL1hPM", + "client_secret" => "ZEaFUFmF0umgBX1qKJDjaU99Q31lDkOU8NutzTOoliw", + "vapid_key" => + "BCk-QqERU0q-CfYZjcuB6lnyyOYfJ2AifKqfeGIm7Z-HiTU5T9eTG5GxVA0_OH5mMlI4UkkDTpaZwozy0TzdZ2M=", + "website" => "https://myapp.com/" + } + } + end +end diff --git a/lib/pleroma/web/api_spec/operations/conversation_operation.ex b/lib/pleroma/web/api_spec/operations/conversation_operation.ex new file mode 100644 index 000000000..475468893 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/conversation_operation.ex @@ -0,0 +1,61 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.ConversationOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.Conversation + 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 index_operation do + %Operation{ + tags: ["Conversations"], + summary: "Show conversation", + security: [%{"oAuth" => ["read:statuses"]}], + operationId: "ConversationController.index", + parameters: [ + Operation.parameter( + :recipients, + :query, + %Schema{type: :array, items: FlakeID}, + "Only return conversations with the given recipients (a list of user ids)" + ) + | pagination_params() + ], + responses: %{ + 200 => + Operation.response("Array of Conversation", "application/json", %Schema{ + type: :array, + items: Conversation, + example: [Conversation.schema().example] + }) + } + } + end + + def mark_as_read_operation do + %Operation{ + tags: ["Conversations"], + summary: "Mark as read", + operationId: "ConversationController.mark_as_read", + parameters: [ + Operation.parameter(:id, :path, :string, "Conversation ID", + example: "123", + required: true + ) + ], + security: [%{"oAuth" => ["write:conversations"]}], + responses: %{ + 200 => Operation.response("Conversation", "application/json", Conversation) + } + } + end +end diff --git a/lib/pleroma/web/api_spec/operations/custom_emoji_operation.ex b/lib/pleroma/web/api_spec/operations/custom_emoji_operation.ex new file mode 100644 index 000000000..2f812ac77 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/custom_emoji_operation.ex @@ -0,0 +1,88 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.CustomEmojiOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.Emoji + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def index_operation do + %Operation{ + tags: ["custom_emojis"], + summary: "List custom custom emojis", + description: "Returns custom emojis that are available on the server.", + operationId: "CustomEmojiController.index", + responses: %{ + 200 => Operation.response("Custom Emojis", "application/json", resposnse()) + } + } + end + + defp resposnse do + %Schema{ + title: "CustomEmojisResponse", + description: "Response schema for custom emojis", + type: :array, + items: custom_emoji(), + example: [ + %{ + "category" => "Fun", + "shortcode" => "blank", + "static_url" => "https://lain.com/emoji/blank.png", + "tags" => ["Fun"], + "url" => "https://lain.com/emoji/blank.png", + "visible_in_picker" => false + }, + %{ + "category" => "Gif,Fun", + "shortcode" => "firefox", + "static_url" => "https://lain.com/emoji/Firefox.gif", + "tags" => ["Gif", "Fun"], + "url" => "https://lain.com/emoji/Firefox.gif", + "visible_in_picker" => true + }, + %{ + "category" => "pack:mixed", + "shortcode" => "sadcat", + "static_url" => "https://lain.com/emoji/mixed/sadcat.png", + "tags" => ["pack:mixed"], + "url" => "https://lain.com/emoji/mixed/sadcat.png", + "visible_in_picker" => true + } + ] + } + end + + defp custom_emoji do + %Schema{ + title: "CustomEmoji", + description: "Schema for a CustomEmoji", + allOf: [ + Emoji, + %Schema{ + type: :object, + properties: %{ + category: %Schema{type: :string}, + tags: %Schema{type: :array} + } + } + ], + example: %{ + "category" => "Fun", + "shortcode" => "aaaa", + "url" => + "https://files.mastodon.social/custom_emojis/images/000/007/118/original/aaaa.png", + "static_url" => + "https://files.mastodon.social/custom_emojis/images/000/007/118/static/aaaa.png", + "visible_in_picker" => true, + "tags" => ["Gif", "Fun"] + } + } + end +end diff --git a/lib/pleroma/web/api_spec/operations/domain_block_operation.ex b/lib/pleroma/web/api_spec/operations/domain_block_operation.ex new file mode 100644 index 000000000..049bcf931 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/domain_block_operation.ex @@ -0,0 +1,83 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.DomainBlockOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + import Pleroma.Web.ApiSpec.Helpers + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def index_operation do + %Operation{ + tags: ["domain_blocks"], + summary: "Fetch domain blocks", + description: "View domains the user has blocked.", + security: [%{"oAuth" => ["follow", "read:blocks"]}], + operationId: "DomainBlockController.index", + responses: %{ + 200 => + Operation.response("Domain blocks", "application/json", %Schema{ + description: "Response schema for domain blocks", + type: :array, + items: %Schema{type: :string}, + example: ["google.com", "facebook.com"] + }) + } + } + end + + def create_operation do + %Operation{ + tags: ["domain_blocks"], + summary: "Block a domain", + description: """ + Block a domain to: + + - hide all public posts from it + - hide all notifications from it + - remove all followers from it + - prevent following new users from it (but does not remove existing follows) + """, + operationId: "DomainBlockController.create", + requestBody: domain_block_request(), + security: [%{"oAuth" => ["follow", "write:blocks"]}], + responses: %{200 => empty_object_response()} + } + end + + def delete_operation do + %Operation{ + tags: ["domain_blocks"], + summary: "Unblock a domain", + description: "Remove a domain block, if it exists in the user's array of blocked domains.", + operationId: "DomainBlockController.delete", + requestBody: domain_block_request(), + security: [%{"oAuth" => ["follow", "write:blocks"]}], + responses: %{ + 200 => Operation.response("Empty object", "application/json", %Schema{type: :object}) + } + } + end + + defp domain_block_request do + request_body( + "Parameters", + %Schema{ + type: :object, + properties: %{ + domain: %Schema{type: :string} + }, + required: [:domain] + }, + required: true, + example: %{ + "domain" => "facebook.com" + } + ) + end +end diff --git a/lib/pleroma/web/api_spec/operations/emoji_reaction_operation.ex b/lib/pleroma/web/api_spec/operations/emoji_reaction_operation.ex new file mode 100644 index 000000000..1a49fece0 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/emoji_reaction_operation.ex @@ -0,0 +1,104 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.EmojiReactionOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.Account + alias Pleroma.Web.ApiSpec.Schemas.ApiError + alias Pleroma.Web.ApiSpec.Schemas.FlakeID + alias Pleroma.Web.ApiSpec.Schemas.Status + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def index_operation do + %Operation{ + tags: ["Emoji Reactions"], + summary: + "Get an object of emoji to account mappings with accounts that reacted to the post", + parameters: [ + Operation.parameter(:id, :path, FlakeID, "Status ID", required: true), + Operation.parameter(:emoji, :path, :string, "Filter by a single unicode emoji", + required: false + ) + ], + security: [%{"oAuth" => ["read:statuses"]}], + operationId: "EmojiReactionController.index", + responses: %{ + 200 => array_of_reactions_response() + } + } + end + + def create_operation do + %Operation{ + tags: ["Emoji Reactions"], + summary: "React to a post with a unicode emoji", + parameters: [ + Operation.parameter(:id, :path, FlakeID, "Status ID", required: true), + Operation.parameter(:emoji, :path, :string, "A single character unicode emoji", + required: true + ) + ], + security: [%{"oAuth" => ["write:statuses"]}], + operationId: "EmojiReactionController.create", + responses: %{ + 200 => Operation.response("Status", "application/json", Status), + 400 => Operation.response("Bad Request", "application/json", ApiError) + } + } + end + + def delete_operation do + %Operation{ + tags: ["Emoji Reactions"], + summary: "Remove a reaction to a post with a unicode emoji", + parameters: [ + Operation.parameter(:id, :path, FlakeID, "Status ID", required: true), + Operation.parameter(:emoji, :path, :string, "A single character unicode emoji", + required: true + ) + ], + security: [%{"oAuth" => ["write:statuses"]}], + operationId: "EmojiReactionController.delete", + responses: %{ + 200 => Operation.response("Status", "application/json", Status) + } + } + end + + defp array_of_reactions_response do + Operation.response("Array of Emoji Reactions", "application/json", %Schema{ + type: :array, + items: emoji_reaction(), + example: [emoji_reaction().example] + }) + end + + defp emoji_reaction do + %Schema{ + title: "EmojiReaction", + type: :object, + properties: %{ + name: %Schema{type: :string, description: "Emoji"}, + count: %Schema{type: :integer, description: "Count of reactions with this emoji"}, + me: %Schema{type: :boolean, description: "Did I react with this emoji?"}, + accounts: %Schema{ + type: :array, + items: Account, + description: "Array of accounts reacted with this emoji" + } + }, + example: %{ + "name" => "😱", + "count" => 1, + "me" => false, + "accounts" => [Account.schema().example] + } + } + end +end diff --git a/lib/pleroma/web/api_spec/operations/filter_operation.ex b/lib/pleroma/web/api_spec/operations/filter_operation.ex new file mode 100644 index 000000000..31e576f99 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/filter_operation.ex @@ -0,0 +1,230 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.FilterOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Helpers + alias Pleroma.Web.ApiSpec.Schemas.BooleanLike + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def index_operation do + %Operation{ + tags: ["apps"], + summary: "View all filters", + operationId: "FilterController.index", + security: [%{"oAuth" => ["read:filters"]}], + responses: %{ + 200 => Operation.response("Filters", "application/json", array_of_filters()) + } + } + end + + def create_operation do + %Operation{ + tags: ["apps"], + summary: "Create a filter", + operationId: "FilterController.create", + requestBody: Helpers.request_body("Parameters", create_request(), required: true), + security: [%{"oAuth" => ["write:filters"]}], + responses: %{200 => Operation.response("Filter", "application/json", filter())} + } + end + + def show_operation do + %Operation{ + tags: ["apps"], + summary: "View all filters", + parameters: [id_param()], + operationId: "FilterController.show", + security: [%{"oAuth" => ["read:filters"]}], + responses: %{ + 200 => Operation.response("Filter", "application/json", filter()) + } + } + end + + def update_operation do + %Operation{ + tags: ["apps"], + summary: "Update a filter", + parameters: [id_param()], + operationId: "FilterController.update", + requestBody: Helpers.request_body("Parameters", update_request(), required: true), + security: [%{"oAuth" => ["write:filters"]}], + responses: %{ + 200 => Operation.response("Filter", "application/json", filter()) + } + } + end + + def delete_operation do + %Operation{ + tags: ["apps"], + summary: "Remove a filter", + parameters: [id_param()], + operationId: "FilterController.delete", + security: [%{"oAuth" => ["write:filters"]}], + responses: %{ + 200 => + Operation.response("Filter", "application/json", %Schema{ + type: :object, + description: "Empty object" + }) + } + } + end + + defp id_param do + Operation.parameter(:id, :path, :string, "Filter ID", example: "123", required: true) + end + + defp filter do + %Schema{ + title: "Filter", + type: :object, + properties: %{ + id: %Schema{type: :string}, + phrase: %Schema{type: :string, description: "The text to be filtered"}, + context: %Schema{ + type: :array, + items: %Schema{type: :string, enum: ["home", "notifications", "public", "thread"]}, + description: "The contexts in which the filter should be applied." + }, + expires_at: %Schema{ + type: :string, + format: :"date-time", + description: + "When the filter should no longer be applied. String (ISO 8601 Datetime), or null if the filter does not expire.", + nullable: true + }, + irreversible: %Schema{ + type: :boolean, + description: + "Should matching entities in home and notifications be dropped by the server?" + }, + whole_word: %Schema{ + type: :boolean, + description: "Should the filter consider word boundaries?" + } + }, + example: %{ + "id" => "5580", + "phrase" => "@twitter.com", + "context" => [ + "home", + "notifications", + "public", + "thread" + ], + "whole_word" => false, + "expires_at" => nil, + "irreversible" => true + } + } + end + + defp array_of_filters do + %Schema{ + title: "ArrayOfFilters", + description: "Array of Filters", + type: :array, + items: filter(), + example: [ + %{ + "id" => "5580", + "phrase" => "@twitter.com", + "context" => [ + "home", + "notifications", + "public", + "thread" + ], + "whole_word" => false, + "expires_at" => nil, + "irreversible" => true + }, + %{ + "id" => "6191", + "phrase" => ":eurovision2019:", + "context" => [ + "home" + ], + "whole_word" => true, + "expires_at" => "2019-05-21T13:47:31.333Z", + "irreversible" => false + } + ] + } + end + + defp create_request do + %Schema{ + title: "FilterCreateRequest", + allOf: [ + update_request(), + %Schema{ + type: :object, + properties: %{ + irreversible: %Schema{ + allOf: [BooleanLike], + description: + "Should the server irreversibly drop matching entities from home and notifications?", + default: false + } + } + } + ], + example: %{ + "phrase" => "knights", + "context" => ["home"] + } + } + end + + defp update_request do + %Schema{ + title: "FilterUpdateRequest", + type: :object, + properties: %{ + phrase: %Schema{type: :string, description: "The text to be filtered"}, + context: %Schema{ + type: :array, + items: %Schema{type: :string, enum: ["home", "notifications", "public", "thread"]}, + description: + "Array of enumerable strings `home`, `notifications`, `public`, `thread`. At least one context must be specified." + }, + irreversible: %Schema{ + allOf: [BooleanLike], + nullable: true, + description: + "Should the server irreversibly drop matching entities from home and notifications?" + }, + whole_word: %Schema{ + allOf: [BooleanLike], + nullable: true, + description: "Consider word boundaries?", + default: true + } + # TODO: probably should implement filter expiration + # expires_in: %Schema{ + # type: :string, + # format: :"date-time", + # description: + # "ISO 8601 Datetime for when the filter expires. Otherwise, + # null for a filter that doesn't expire." + # } + }, + required: [:phrase, :context], + example: %{ + "phrase" => "knights", + "context" => ["home"] + } + } + end +end diff --git a/lib/pleroma/web/api_spec/operations/follow_request_operation.ex b/lib/pleroma/web/api_spec/operations/follow_request_operation.ex new file mode 100644 index 000000000..ac4aee6da --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/follow_request_operation.ex @@ -0,0 +1,65 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.FollowRequestOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.Account + alias Pleroma.Web.ApiSpec.Schemas.AccountRelationship + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def index_operation do + %Operation{ + tags: ["Follow Requests"], + summary: "Pending Follows", + security: [%{"oAuth" => ["read:follows", "follow"]}], + operationId: "FollowRequestController.index", + responses: %{ + 200 => + Operation.response("Array of Account", "application/json", %Schema{ + type: :array, + items: Account, + example: [Account.schema().example] + }) + } + } + end + + def authorize_operation do + %Operation{ + tags: ["Follow Requests"], + summary: "Accept Follow", + operationId: "FollowRequestController.authorize", + parameters: [id_param()], + security: [%{"oAuth" => ["follow", "write:follows"]}], + responses: %{ + 200 => Operation.response("Relationship", "application/json", AccountRelationship) + } + } + end + + def reject_operation do + %Operation{ + tags: ["Follow Requests"], + summary: "Reject Follow", + operationId: "FollowRequestController.reject", + parameters: [id_param()], + security: [%{"oAuth" => ["follow", "write:follows"]}], + responses: %{ + 200 => Operation.response("Relationship", "application/json", AccountRelationship) + } + } + end + + defp id_param do + Operation.parameter(:id, :path, :string, "Conversation ID", + example: "123", + required: true + ) + end +end diff --git a/lib/pleroma/web/api_spec/operations/instance_operation.ex b/lib/pleroma/web/api_spec/operations/instance_operation.ex new file mode 100644 index 000000000..d5c335d0c --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/instance_operation.ex @@ -0,0 +1,175 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.InstanceOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def show_operation do + %Operation{ + tags: ["Instance"], + summary: "Fetch instance", + description: "Information about the server", + operationId: "InstanceController.show", + responses: %{ + 200 => Operation.response("Instance", "application/json", instance()) + } + } + end + + def peers_operation do + %Operation{ + tags: ["Instance"], + summary: "List of known hosts", + operationId: "InstanceController.peers", + responses: %{ + 200 => Operation.response("Array of domains", "application/json", array_of_domains()) + } + } + end + + defp instance do + %Schema{ + type: :object, + properties: %{ + uri: %Schema{type: :string, description: "The domain name of the instance"}, + title: %Schema{type: :string, description: "The title of the website"}, + description: %Schema{ + type: :string, + description: "Admin-defined description of the Pleroma site" + }, + version: %Schema{ + type: :string, + description: "The version of Pleroma installed on the instance" + }, + email: %Schema{ + type: :string, + description: "An email that may be contacted for any inquiries", + format: :email + }, + urls: %Schema{ + type: :object, + description: "URLs of interest for clients apps", + properties: %{ + streaming_api: %Schema{ + type: :string, + description: "Websockets address for push streaming" + } + } + }, + stats: %Schema{ + type: :object, + description: "Statistics about how much information the instance contains", + properties: %{ + user_count: %Schema{ + type: :integer, + description: "Users registered on this instance" + }, + status_count: %Schema{ + type: :integer, + description: "Statuses authored by users on instance" + }, + domain_count: %Schema{ + type: :integer, + description: "Domains federated with this instance" + } + } + }, + thumbnail: %Schema{ + type: :string, + description: "Banner image for the website", + nullable: true + }, + languages: %Schema{ + type: :array, + items: %Schema{type: :string}, + description: "Primary langauges of the website and its staff" + }, + registrations: %Schema{type: :boolean, description: "Whether registrations are enabled"}, + # Extra (not present in Mastodon): + max_toot_chars: %Schema{ + type: :integer, + description: ": Posts character limit (CW/Subject included in the counter)" + }, + poll_limits: %Schema{ + type: :object, + description: "A map with poll limits for local polls", + properties: %{ + max_options: %Schema{ + type: :integer, + description: "Maximum number of options." + }, + max_option_chars: %Schema{ + type: :integer, + description: "Maximum number of characters per option." + }, + min_expiration: %Schema{ + type: :integer, + description: "Minimum expiration time (in seconds)." + }, + max_expiration: %Schema{ + type: :integer, + description: "Maximum expiration time (in seconds)." + } + } + }, + upload_limit: %Schema{ + type: :integer, + description: "File size limit of uploads (except for avatar, background, banner)" + }, + avatar_upload_limit: %Schema{type: :integer, description: "The title of the website"}, + background_upload_limit: %Schema{type: :integer, description: "The title of the website"}, + banner_upload_limit: %Schema{type: :integer, description: "The title of the website"}, + background_image: %Schema{ + type: :string, + format: :uri, + description: "The background image for the website" + } + }, + example: %{ + "avatar_upload_limit" => 2_000_000, + "background_upload_limit" => 4_000_000, + "background_image" => "/static/image.png", + "banner_upload_limit" => 4_000_000, + "description" => "A Pleroma instance, an alternative fediverse server", + "email" => "lain@lain.com", + "languages" => ["en"], + "max_toot_chars" => 5000, + "poll_limits" => %{ + "max_expiration" => 31_536_000, + "max_option_chars" => 200, + "max_options" => 20, + "min_expiration" => 0 + }, + "registrations" => false, + "stats" => %{ + "domain_count" => 2996, + "status_count" => 15_802, + "user_count" => 5 + }, + "thumbnail" => "https://lain.com/instance/thumbnail.jpeg", + "title" => "lain.com", + "upload_limit" => 16_000_000, + "uri" => "https://lain.com", + "urls" => %{ + "streaming_api" => "wss://lain.com" + }, + "version" => "2.7.2 (compatible; Pleroma 2.0.50-536-g25eec6d7-develop)" + } + } + end + + defp array_of_domains do + %Schema{ + type: :array, + items: %Schema{type: :string}, + example: ["pleroma.site", "lain.com", "bikeshed.party"] + } + end +end diff --git a/lib/pleroma/web/api_spec/operations/list_operation.ex b/lib/pleroma/web/api_spec/operations/list_operation.ex new file mode 100644 index 000000000..c88ed5dd0 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/list_operation.ex @@ -0,0 +1,188 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.ListOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.Account + alias Pleroma.Web.ApiSpec.Schemas.ApiError + alias Pleroma.Web.ApiSpec.Schemas.FlakeID + alias Pleroma.Web.ApiSpec.Schemas.List + + import Pleroma.Web.ApiSpec.Helpers + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def index_operation do + %Operation{ + tags: ["Lists"], + summary: "Show user's lists", + description: "Fetch all lists that the user owns", + security: [%{"oAuth" => ["read:lists"]}], + operationId: "ListController.index", + responses: %{ + 200 => Operation.response("Array of List", "application/json", array_of_lists()) + } + } + end + + def create_operation do + %Operation{ + tags: ["Lists"], + summary: "Create a list", + description: "Fetch the list with the given ID. Used for verifying the title of a list.", + operationId: "ListController.create", + requestBody: create_update_request(), + security: [%{"oAuth" => ["write:lists"]}], + responses: %{ + 200 => Operation.response("List", "application/json", List), + 400 => Operation.response("Error", "application/json", ApiError), + 404 => Operation.response("Error", "application/json", ApiError) + } + } + end + + def show_operation do + %Operation{ + tags: ["Lists"], + summary: "Show a single list", + description: "Fetch the list with the given ID. Used for verifying the title of a list.", + operationId: "ListController.show", + parameters: [id_param()], + security: [%{"oAuth" => ["read:lists"]}], + responses: %{ + 200 => Operation.response("List", "application/json", List), + 404 => Operation.response("Error", "application/json", ApiError) + } + } + end + + def update_operation do + %Operation{ + tags: ["Lists"], + summary: "Update a list", + description: "Change the title of a list", + operationId: "ListController.update", + parameters: [id_param()], + requestBody: create_update_request(), + security: [%{"oAuth" => ["write:lists"]}], + responses: %{ + 200 => Operation.response("List", "application/json", List), + 422 => Operation.response("Error", "application/json", ApiError) + } + } + end + + def delete_operation do + %Operation{ + tags: ["Lists"], + summary: "Delete a list", + operationId: "ListController.delete", + parameters: [id_param()], + security: [%{"oAuth" => ["write:lists"]}], + responses: %{ + 200 => Operation.response("Empty object", "application/json", %Schema{type: :object}) + } + } + end + + def list_accounts_operation do + %Operation{ + tags: ["Lists"], + summary: "View accounts in list", + operationId: "ListController.list_accounts", + parameters: [id_param()], + security: [%{"oAuth" => ["read:lists"]}], + responses: %{ + 200 => + Operation.response("Array of Account", "application/json", %Schema{ + type: :array, + items: Account + }) + } + } + end + + def add_to_list_operation do + %Operation{ + tags: ["Lists"], + summary: "Add accounts to list", + description: "Add accounts to the given list.", + operationId: "ListController.add_to_list", + parameters: [id_param()], + requestBody: add_remove_accounts_request(), + security: [%{"oAuth" => ["write:lists"]}], + responses: %{ + 200 => Operation.response("Empty object", "application/json", %Schema{type: :object}) + } + } + end + + def remove_from_list_operation do + %Operation{ + tags: ["Lists"], + summary: "Remove accounts from list", + operationId: "ListController.remove_from_list", + parameters: [id_param()], + requestBody: add_remove_accounts_request(), + security: [%{"oAuth" => ["write:lists"]}], + responses: %{ + 200 => Operation.response("Empty object", "application/json", %Schema{type: :object}) + } + } + end + + defp array_of_lists do + %Schema{ + title: "ArrayOfLists", + description: "Response schema for lists", + type: :array, + items: List, + example: [ + %{"id" => "123", "title" => "my list"}, + %{"id" => "1337", "title" => "another list"} + ] + } + end + + defp id_param do + Operation.parameter(:id, :path, :string, "List ID", + example: "123", + required: true + ) + end + + defp create_update_request do + request_body( + "Parameters", + %Schema{ + description: "POST body for creating or updating a List", + type: :object, + properties: %{ + title: %Schema{type: :string, description: "List title"} + }, + required: [:title] + }, + required: true + ) + end + + defp add_remove_accounts_request do + request_body( + "Parameters", + %Schema{ + description: "POST body for adding/removing accounts to/from a List", + type: :object, + properties: %{ + account_ids: %Schema{type: :array, description: "Array of account IDs", items: FlakeID} + }, + required: [:account_ids] + }, + required: true + ) + end +end diff --git a/lib/pleroma/web/api_spec/operations/marker_operation.ex b/lib/pleroma/web/api_spec/operations/marker_operation.ex new file mode 100644 index 000000000..714ef1f99 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/marker_operation.ex @@ -0,0 +1,142 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.MarkerOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Helpers + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def index_operation do + %Operation{ + tags: ["Markers"], + summary: "Get saved timeline position", + security: [%{"oAuth" => ["read:statuses"]}], + operationId: "MarkerController.index", + parameters: [ + Operation.parameter( + :timeline, + :query, + %Schema{ + type: :array, + items: %Schema{type: :string, enum: ["home", "notifications"]} + }, + "Array of markers to fetch. If not provided, an empty object will be returned." + ) + ], + responses: %{ + 200 => Operation.response("Marker", "application/json", response()), + 403 => Operation.response("Error", "application/json", api_error()) + } + } + end + + def upsert_operation do + %Operation{ + tags: ["Markers"], + summary: "Save position in timeline", + operationId: "MarkerController.upsert", + requestBody: Helpers.request_body("Parameters", upsert_request(), required: true), + security: [%{"oAuth" => ["follow", "write:blocks"]}], + responses: %{ + 200 => Operation.response("Marker", "application/json", response()), + 403 => Operation.response("Error", "application/json", api_error()) + } + } + end + + defp marker do + %Schema{ + title: "Marker", + description: "Schema for a marker", + type: :object, + properties: %{ + last_read_id: %Schema{type: :string}, + version: %Schema{type: :integer}, + updated_at: %Schema{type: :string}, + pleroma: %Schema{ + type: :object, + properties: %{ + unread_count: %Schema{type: :integer} + } + } + }, + example: %{ + "last_read_id" => "35098814", + "version" => 361, + "updated_at" => "2019-11-26T22:37:25.239Z", + "pleroma" => %{"unread_count" => 5} + } + } + end + + defp response do + %Schema{ + title: "MarkersResponse", + description: "Response schema for markers", + type: :object, + properties: %{ + notifications: %Schema{allOf: [marker()], nullable: true}, + home: %Schema{allOf: [marker()], nullable: true} + }, + items: %Schema{type: :string}, + example: %{ + "notifications" => %{ + "last_read_id" => "35098814", + "version" => 361, + "updated_at" => "2019-11-26T22:37:25.239Z", + "pleroma" => %{"unread_count" => 0} + }, + "home" => %{ + "last_read_id" => "103206604258487607", + "version" => 468, + "updated_at" => "2019-11-26T22:37:25.235Z", + "pleroma" => %{"unread_count" => 10} + } + } + } + end + + defp upsert_request do + %Schema{ + title: "MarkersUpsertRequest", + description: "Request schema for marker upsert", + type: :object, + properties: %{ + notifications: %Schema{ + type: :object, + nullable: true, + properties: %{ + last_read_id: %Schema{nullable: true, type: :string} + } + }, + home: %Schema{ + type: :object, + nullable: true, + properties: %{ + last_read_id: %Schema{nullable: true, type: :string} + } + } + }, + example: %{ + "home" => %{ + "last_read_id" => "103194548672408537", + "version" => 462, + "updated_at" => "2019-11-24T19:39:39.337Z" + } + } + } + end + + defp api_error do + %Schema{ + type: :object, + properties: %{error: %Schema{type: :string}} + } + end +end diff --git a/lib/pleroma/web/api_spec/operations/media_operation.ex b/lib/pleroma/web/api_spec/operations/media_operation.ex new file mode 100644 index 000000000..d9c3c42db --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/media_operation.ex @@ -0,0 +1,132 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.MediaOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Helpers + alias Pleroma.Web.ApiSpec.Schemas.ApiError + alias Pleroma.Web.ApiSpec.Schemas.Attachment + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def create_operation do + %Operation{ + tags: ["media"], + summary: "Upload media as attachment", + description: "Creates an attachment to be used with a new status.", + operationId: "MediaController.create", + security: [%{"oAuth" => ["write:media"]}], + requestBody: Helpers.request_body("Parameters", create_request()), + responses: %{ + 200 => Operation.response("Media", "application/json", Attachment), + 401 => Operation.response("Media", "application/json", ApiError), + 422 => Operation.response("Media", "application/json", ApiError) + } + } + end + + defp create_request do + %Schema{ + title: "MediaCreateRequest", + description: "POST body for creating an attachment", + type: :object, + required: [:file], + properties: %{ + file: %Schema{ + type: :string, + format: :binary, + description: "The file to be attached, using multipart form data." + }, + description: %Schema{ + type: :string, + description: "A plain-text description of the media, for accessibility purposes." + }, + focus: %Schema{ + type: :string, + description: "Two floating points (x,y), comma-delimited, ranging from -1.0 to 1.0." + } + } + } + end + + def update_operation do + %Operation{ + tags: ["media"], + summary: "Upload media as attachment", + description: "Creates an attachment to be used with a new status.", + operationId: "MediaController.update", + security: [%{"oAuth" => ["write:media"]}], + parameters: [id_param()], + requestBody: Helpers.request_body("Parameters", update_request()), + responses: %{ + 200 => Operation.response("Media", "application/json", Attachment), + 400 => Operation.response("Media", "application/json", ApiError), + 401 => Operation.response("Media", "application/json", ApiError), + 422 => Operation.response("Media", "application/json", ApiError) + } + } + end + + defp update_request do + %Schema{ + title: "MediaUpdateRequest", + description: "POST body for updating an attachment", + type: :object, + properties: %{ + file: %Schema{ + type: :string, + format: :binary, + description: "The file to be attached, using multipart form data." + }, + description: %Schema{ + type: :string, + description: "A plain-text description of the media, for accessibility purposes." + }, + focus: %Schema{ + type: :string, + description: "Two floating points (x,y), comma-delimited, ranging from -1.0 to 1.0." + } + } + } + end + + def show_operation do + %Operation{ + tags: ["media"], + summary: "Show Uploaded media attachment", + operationId: "MediaController.show", + parameters: [id_param()], + security: [%{"oAuth" => ["read:media"]}], + responses: %{ + 200 => Operation.response("Media", "application/json", Attachment), + 401 => Operation.response("Media", "application/json", ApiError), + 422 => Operation.response("Media", "application/json", ApiError) + } + } + end + + def create2_operation do + %Operation{ + tags: ["media"], + summary: "Upload media as attachment", + description: "Creates an attachment to be used with a new status.", + operationId: "MediaController.create2", + security: [%{"oAuth" => ["write:media"]}], + requestBody: Helpers.request_body("Parameters", create_request()), + responses: %{ + 202 => Operation.response("Media", "application/json", Attachment), + 422 => Operation.response("Media", "application/json", ApiError), + 500 => Operation.response("Media", "application/json", ApiError) + } + } + end + + defp id_param do + Operation.parameter(:id, :path, :string, "The ID of the Attachment entity") + end +end diff --git a/lib/pleroma/web/api_spec/operations/notification_operation.ex b/lib/pleroma/web/api_spec/operations/notification_operation.ex new file mode 100644 index 000000000..46e72f8bf --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/notification_operation.ex @@ -0,0 +1,211 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.NotificationOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.Account + alias Pleroma.Web.ApiSpec.Schemas.ApiError + alias Pleroma.Web.ApiSpec.Schemas.BooleanLike + alias Pleroma.Web.ApiSpec.Schemas.Status + alias Pleroma.Web.ApiSpec.Schemas.VisibilityScope + + import Pleroma.Web.ApiSpec.Helpers + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def index_operation do + %Operation{ + tags: ["Notifications"], + summary: "Get all notifications", + description: + "Notifications concerning the user. This API returns Link headers containing links to the next/previous page. However, the links can also be constructed dynamically using query params and `id` values.", + operationId: "NotificationController.index", + security: [%{"oAuth" => ["read:notifications"]}], + parameters: + [ + Operation.parameter( + :exclude_types, + :query, + %Schema{type: :array, items: notification_type()}, + "Array of types to exclude" + ), + Operation.parameter( + :account_id, + :query, + %Schema{type: :string}, + "Return only notifications received from this account" + ), + Operation.parameter( + :exclude_visibilities, + :query, + %Schema{type: :array, items: VisibilityScope}, + "Exclude the notifications for activities with the given visibilities" + ), + Operation.parameter( + :include_types, + :query, + %Schema{type: :array, items: notification_type()}, + "Include the notifications for activities with the given types" + ), + Operation.parameter( + :with_muted, + :query, + BooleanLike, + "Include the notifications from muted users" + ) + ] ++ pagination_params(), + responses: %{ + 200 => + Operation.response("Array of notifications", "application/json", %Schema{ + type: :array, + items: notification() + }), + 404 => Operation.response("Error", "application/json", ApiError) + } + } + end + + def show_operation do + %Operation{ + tags: ["Notifications"], + summary: "Get a single notification", + description: "View information about a notification with a given ID.", + operationId: "NotificationController.show", + security: [%{"oAuth" => ["read:notifications"]}], + parameters: [id_param()], + responses: %{ + 200 => Operation.response("Notification", "application/json", notification()) + } + } + end + + def clear_operation do + %Operation{ + tags: ["Notifications"], + summary: "Dismiss all notifications", + description: "Clear all notifications from the server.", + operationId: "NotificationController.clear", + security: [%{"oAuth" => ["write:notifications"]}], + responses: %{200 => empty_object_response()} + } + end + + def dismiss_operation do + %Operation{ + tags: ["Notifications"], + summary: "Dismiss a single notification", + description: "Clear a single notification from the server.", + operationId: "NotificationController.dismiss", + parameters: [id_param()], + security: [%{"oAuth" => ["write:notifications"]}], + responses: %{200 => empty_object_response()} + } + end + + def dismiss_via_body_operation do + %Operation{ + tags: ["Notifications"], + summary: "Dismiss a single notification", + deprecated: true, + description: "Clear a single notification from the server.", + operationId: "NotificationController.dismiss_via_body", + requestBody: + request_body( + "Parameters", + %Schema{type: :object, properties: %{id: %Schema{type: :string}}}, + required: true + ), + security: [%{"oAuth" => ["write:notifications"]}], + responses: %{200 => empty_object_response()} + } + end + + def destroy_multiple_operation do + %Operation{ + tags: ["Notifications"], + summary: "Dismiss multiple notifications", + operationId: "NotificationController.destroy_multiple", + security: [%{"oAuth" => ["write:notifications"]}], + parameters: [ + Operation.parameter( + :ids, + :query, + %Schema{type: :array, items: %Schema{type: :string}}, + "Array of notification IDs to dismiss", + required: true + ) + ], + responses: %{200 => empty_object_response()} + } + end + + def notification do + %Schema{ + title: "Notification", + description: "Response schema for a notification", + type: :object, + properties: %{ + id: %Schema{type: :string}, + type: notification_type(), + created_at: %Schema{type: :string, format: :"date-time"}, + account: %Schema{ + allOf: [Account], + description: "The account that performed the action that generated the notification." + }, + status: %Schema{ + allOf: [Status], + description: + "Status that was the object of the notification, e.g. in mentions, reblogs, favourites, or polls.", + nullable: true + } + }, + example: %{ + "id" => "34975861", + "type" => "mention", + "created_at" => "2019-11-23T07:49:02.064Z", + "account" => Account.schema().example, + "status" => Status.schema().example + } + } + end + + defp notification_type do + %Schema{ + type: :string, + enum: [ + "follow", + "favourite", + "reblog", + "mention", + "poll", + "pleroma:emoji_reaction", + "move", + "follow_request" + ], + description: """ + The type of event that resulted in the notification. + + - `follow` - Someone followed you + - `mention` - Someone mentioned you in their status + - `reblog` - Someone boosted one of your statuses + - `favourite` - Someone favourited one of your statuses + - `poll` - A poll you have voted in or created has ended + - `move` - Someone moved their account + - `pleroma:emoji_reaction` - Someone reacted with emoji to your status + """ + } + end + + defp id_param do + Operation.parameter(:id, :path, :string, "Notification ID", + example: "123", + required: true + ) + end +end diff --git a/lib/pleroma/web/api_spec/operations/pleroma_account_operation.ex b/lib/pleroma/web/api_spec/operations/pleroma_account_operation.ex new file mode 100644 index 000000000..90922c064 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/pleroma_account_operation.ex @@ -0,0 +1,187 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.PleromaAccountOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.AccountRelationship + alias Pleroma.Web.ApiSpec.Schemas.ApiError + alias Pleroma.Web.ApiSpec.Schemas.FlakeID + alias Pleroma.Web.ApiSpec.StatusOperation + + import Pleroma.Web.ApiSpec.Helpers + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def confirmation_resend_operation do + %Operation{ + tags: ["Accounts"], + summary: "Resend confirmation email. Expects `email` or `nickname`", + operationId: "PleromaAPI.AccountController.confirmation_resend", + parameters: [ + Operation.parameter(:email, :query, :string, "Email of that needs to be verified", + example: "cofe@cofe.io" + ), + Operation.parameter( + :nickname, + :query, + :string, + "Nickname of user that needs to be verified", + example: "cofefe" + ) + ], + responses: %{ + 204 => no_content_response() + } + } + end + + def update_avatar_operation do + %Operation{ + tags: ["Accounts"], + summary: "Set/clear user avatar image", + operationId: "PleromaAPI.AccountController.update_avatar", + requestBody: + request_body("Parameters", update_avatar_or_background_request(), required: true), + security: [%{"oAuth" => ["write:accounts"]}], + responses: %{ + 200 => update_response(), + 403 => Operation.response("Forbidden", "application/json", ApiError) + } + } + end + + def update_banner_operation do + %Operation{ + tags: ["Accounts"], + summary: "Set/clear user banner image", + operationId: "PleromaAPI.AccountController.update_banner", + requestBody: request_body("Parameters", update_banner_request(), required: true), + security: [%{"oAuth" => ["write:accounts"]}], + responses: %{ + 200 => update_response() + } + } + end + + def update_background_operation do + %Operation{ + tags: ["Accounts"], + summary: "Set/clear user background image", + operationId: "PleromaAPI.AccountController.update_background", + security: [%{"oAuth" => ["write:accounts"]}], + requestBody: + request_body("Parameters", update_avatar_or_background_request(), required: true), + responses: %{ + 200 => update_response() + } + } + end + + def favourites_operation do + %Operation{ + tags: ["Accounts"], + summary: "Returns favorites timeline of any user", + operationId: "PleromaAPI.AccountController.favourites", + parameters: [id_param() | pagination_params()], + security: [%{"oAuth" => ["read:favourites"]}], + responses: %{ + 200 => + Operation.response( + "Array of Statuses", + "application/json", + StatusOperation.array_of_statuses() + ), + 403 => Operation.response("Forbidden", "application/json", ApiError), + 404 => Operation.response("Not Found", "application/json", ApiError) + } + } + end + + def subscribe_operation do + %Operation{ + tags: ["Accounts"], + summary: "Subscribe to receive notifications for all statuses posted by a user", + operationId: "PleromaAPI.AccountController.subscribe", + parameters: [id_param()], + security: [%{"oAuth" => ["follow", "write:follows"]}], + responses: %{ + 200 => Operation.response("Relationship", "application/json", AccountRelationship), + 404 => Operation.response("Not Found", "application/json", ApiError) + } + } + end + + def unsubscribe_operation do + %Operation{ + tags: ["Accounts"], + summary: "Unsubscribe to stop receiving notifications from user statuses", + operationId: "PleromaAPI.AccountController.unsubscribe", + parameters: [id_param()], + security: [%{"oAuth" => ["follow", "write:follows"]}], + responses: %{ + 200 => Operation.response("Relationship", "application/json", AccountRelationship), + 404 => Operation.response("Not Found", "application/json", ApiError) + } + } + end + + defp id_param do + Operation.parameter(:id, :path, FlakeID, "Account ID", + example: "9umDrYheeY451cQnEe", + required: true + ) + end + + defp update_avatar_or_background_request do + %Schema{ + title: "PleromaAccountUpdateAvatarOrBackgroundRequest", + type: :object, + properties: %{ + img: %Schema{ + nullable: true, + type: :string, + format: :binary, + description: "Image encoded using `multipart/form-data` or an empty string to clear" + } + } + } + end + + defp update_banner_request do + %Schema{ + title: "PleromaAccountUpdateBannerRequest", + type: :object, + properties: %{ + banner: %Schema{ + type: :string, + nullable: true, + format: :binary, + description: "Image encoded using `multipart/form-data` or an empty string to clear" + } + } + } + end + + defp update_response do + Operation.response("PleromaAccountUpdateResponse", "application/json", %Schema{ + type: :object, + properties: %{ + url: %Schema{ + type: :string, + format: :uri, + nullable: true, + description: "Image URL" + } + }, + example: %{ + "url" => + "https://cofe.party/media/9d0add56-bcb6-4c0f-8225-cbbd0b6dd773/13eadb6972c9ccd3f4ffa3b8196f0e0d38b4d2f27594457c52e52946c054cd9a.gif" + } + }) + end +end diff --git a/lib/pleroma/web/api_spec/operations/pleroma_conversation_operation.ex b/lib/pleroma/web/api_spec/operations/pleroma_conversation_operation.ex new file mode 100644 index 000000000..e885eab20 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/pleroma_conversation_operation.ex @@ -0,0 +1,106 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.PleromaConversationOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.Conversation + alias Pleroma.Web.ApiSpec.Schemas.FlakeID + alias Pleroma.Web.ApiSpec.StatusOperation + + import Pleroma.Web.ApiSpec.Helpers + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def show_operation do + %Operation{ + tags: ["Conversations"], + summary: "The conversation with the given ID", + parameters: [ + Operation.parameter(:id, :path, :string, "Conversation ID", + example: "123", + required: true + ) + ], + security: [%{"oAuth" => ["read:statuses"]}], + operationId: "PleromaAPI.ConversationController.show", + responses: %{ + 200 => Operation.response("Conversation", "application/json", Conversation) + } + } + end + + def statuses_operation do + %Operation{ + tags: ["Conversations"], + summary: "Timeline for a given conversation", + parameters: [ + Operation.parameter(:id, :path, :string, "Conversation ID", + example: "123", + required: true + ) + | pagination_params() + ], + security: [%{"oAuth" => ["read:statuses"]}], + operationId: "PleromaAPI.ConversationController.statuses", + responses: %{ + 200 => + Operation.response( + "Array of Statuses", + "application/json", + StatusOperation.array_of_statuses() + ) + } + } + end + + def update_operation do + %Operation{ + tags: ["Conversations"], + summary: "Update a conversation. Used to change the set of recipients.", + parameters: [ + Operation.parameter(:id, :path, :string, "Conversation ID", + example: "123", + required: true + ), + Operation.parameter( + :recipients, + :query, + %Schema{type: :array, items: FlakeID}, + "A list of ids of users that should receive posts to this conversation. This will replace the current list of recipients, so submit the full list. The owner of owner of the conversation will always be part of the set of recipients, though.", + required: true + ) + ], + security: [%{"oAuth" => ["write:conversations"]}], + operationId: "PleromaAPI.ConversationController.update", + responses: %{ + 200 => Operation.response("Conversation", "application/json", Conversation) + } + } + end + + def mark_as_read_operation do + %Operation{ + tags: ["Conversations"], + summary: "Marks all user's conversations as read", + security: [%{"oAuth" => ["write:conversations"]}], + operationId: "PleromaAPI.ConversationController.mark_as_read", + responses: %{ + 200 => + Operation.response( + "Array of Conversations that were marked as read", + "application/json", + %Schema{ + type: :array, + items: Conversation, + example: [Conversation.schema().example] + } + ) + } + } + end +end diff --git a/lib/pleroma/web/api_spec/operations/pleroma_emoji_pack_operation.ex b/lib/pleroma/web/api_spec/operations/pleroma_emoji_pack_operation.ex new file mode 100644 index 000000000..567688ff5 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/pleroma_emoji_pack_operation.ex @@ -0,0 +1,390 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.PleromaEmojiPackOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.ApiError + + import Pleroma.Web.ApiSpec.Helpers + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def remote_operation do + %Operation{ + tags: ["Emoji Packs"], + summary: "Make request to another instance for emoji packs list", + security: [%{"oAuth" => ["write"]}], + parameters: [url_param()], + operationId: "PleromaAPI.EmojiPackController.remote", + responses: %{ + 200 => emoji_packs_response(), + 500 => Operation.response("Error", "application/json", ApiError) + } + } + end + + def index_operation do + %Operation{ + tags: ["Emoji Packs"], + summary: "Lists local custom emoji packs", + operationId: "PleromaAPI.EmojiPackController.index", + responses: %{ + 200 => emoji_packs_response() + } + } + end + + def show_operation do + %Operation{ + tags: ["Emoji Packs"], + summary: "Show emoji pack", + operationId: "PleromaAPI.EmojiPackController.show", + parameters: [name_param()], + responses: %{ + 200 => Operation.response("Emoji Pack", "application/json", emoji_pack()), + 400 => Operation.response("Bad Request", "application/json", ApiError), + 404 => Operation.response("Not Found", "application/json", ApiError) + } + } + end + + def archive_operation do + %Operation{ + tags: ["Emoji Packs"], + summary: "Requests a local pack archive from the instance", + operationId: "PleromaAPI.EmojiPackController.archive", + parameters: [name_param()], + responses: %{ + 200 => + Operation.response("Archive file", "application/octet-stream", %Schema{ + type: :string, + format: :binary + }), + 403 => Operation.response("Forbidden", "application/json", ApiError), + 404 => Operation.response("Not Found", "application/json", ApiError) + } + } + end + + def download_operation do + %Operation{ + tags: ["Emoji Packs"], + summary: "Download pack from another instance", + operationId: "PleromaAPI.EmojiPackController.download", + security: [%{"oAuth" => ["write"]}], + requestBody: request_body("Parameters", download_request(), required: true), + responses: %{ + 200 => ok_response(), + 500 => Operation.response("Error", "application/json", ApiError) + } + } + end + + defp download_request do + %Schema{ + type: :object, + required: [:url, :name], + properties: %{ + url: %Schema{ + type: :string, + format: :uri, + description: "URL of the instance to download from" + }, + name: %Schema{type: :string, format: :uri, description: "Pack Name"}, + as: %Schema{type: :string, format: :uri, description: "Save as"} + } + } + end + + def create_operation do + %Operation{ + tags: ["Emoji Packs"], + summary: "Create an empty pack", + operationId: "PleromaAPI.EmojiPackController.create", + security: [%{"oAuth" => ["write"]}], + parameters: [name_param()], + responses: %{ + 200 => ok_response(), + 400 => Operation.response("Not Found", "application/json", ApiError), + 409 => Operation.response("Conflict", "application/json", ApiError), + 500 => Operation.response("Error", "application/json", ApiError) + } + } + end + + def delete_operation do + %Operation{ + tags: ["Emoji Packs"], + summary: "Delete a custom emoji pack", + operationId: "PleromaAPI.EmojiPackController.delete", + security: [%{"oAuth" => ["write"]}], + parameters: [name_param()], + responses: %{ + 200 => ok_response(), + 400 => Operation.response("Bad Request", "application/json", ApiError), + 404 => Operation.response("Not Found", "application/json", ApiError) + } + } + end + + def update_operation do + %Operation{ + tags: ["Emoji Packs"], + summary: "Updates (replaces) pack metadata", + operationId: "PleromaAPI.EmojiPackController.update", + security: [%{"oAuth" => ["write"]}], + requestBody: request_body("Parameters", update_request(), required: true), + parameters: [name_param()], + responses: %{ + 200 => Operation.response("Metadata", "application/json", metadata()), + 400 => Operation.response("Bad Request", "application/json", ApiError) + } + } + end + + def add_file_operation do + %Operation{ + tags: ["Emoji Packs"], + summary: "Add new file to the pack", + operationId: "PleromaAPI.EmojiPackController.add_file", + security: [%{"oAuth" => ["write"]}], + requestBody: request_body("Parameters", add_file_request(), required: true), + parameters: [name_param()], + responses: %{ + 200 => Operation.response("Files Object", "application/json", files_object()), + 400 => Operation.response("Bad Request", "application/json", ApiError), + 409 => Operation.response("Conflict", "application/json", ApiError) + } + } + end + + defp add_file_request do + %Schema{ + type: :object, + required: [:file], + properties: %{ + file: %Schema{ + description: + "File needs to be uploaded with the multipart request or link to remote file", + anyOf: [ + %Schema{type: :string, format: :binary}, + %Schema{type: :string, format: :uri} + ] + }, + shortcode: %Schema{ + type: :string, + description: + "Shortcode for new emoji, must be unique for all emoji. If not sended, shortcode will be taken from original filename." + }, + filename: %Schema{ + type: :string, + description: + "New emoji file name. If not specified will be taken from original filename." + } + } + } + end + + def update_file_operation do + %Operation{ + tags: ["Emoji Packs"], + summary: "Add new file to the pack", + operationId: "PleromaAPI.EmojiPackController.update_file", + security: [%{"oAuth" => ["write"]}], + requestBody: request_body("Parameters", update_file_request(), required: true), + parameters: [name_param()], + responses: %{ + 200 => Operation.response("Files Object", "application/json", files_object()), + 400 => Operation.response("Bad Request", "application/json", ApiError), + 409 => Operation.response("Conflict", "application/json", ApiError) + } + } + end + + defp update_file_request do + %Schema{ + type: :object, + required: [:shortcode, :new_shortcode, :new_filename], + properties: %{ + shortcode: %Schema{ + type: :string, + description: "Emoji file shortcode" + }, + new_shortcode: %Schema{ + type: :string, + description: "New emoji file shortcode" + }, + new_filename: %Schema{ + type: :string, + description: "New filename for emoji file" + }, + force: %Schema{ + type: :boolean, + description: "With true value to overwrite existing emoji with new shortcode", + default: false + } + } + } + end + + def delete_file_operation do + %Operation{ + tags: ["Emoji Packs"], + summary: "Delete emoji file from pack", + operationId: "PleromaAPI.EmojiPackController.delete_file", + security: [%{"oAuth" => ["write"]}], + parameters: [ + name_param(), + Operation.parameter(:shortcode, :query, :string, "File shortcode", + example: "cofe", + required: true + ) + ], + responses: %{ + 200 => Operation.response("Files Object", "application/json", files_object()), + 400 => Operation.response("Bad Request", "application/json", ApiError) + } + } + end + + def import_from_filesystem_operation do + %Operation{ + tags: ["Emoji Packs"], + summary: "Imports packs from filesystem", + operationId: "PleromaAPI.EmojiPackController.import", + security: [%{"oAuth" => ["write"]}], + responses: %{ + 200 => + Operation.response("Array of imported pack names", "application/json", %Schema{ + type: :array, + items: %Schema{type: :string} + }) + } + } + end + + defp name_param do + Operation.parameter(:name, :path, :string, "Pack Name", example: "cofe", required: true) + end + + defp url_param do + Operation.parameter( + :url, + :query, + %Schema{type: :string, format: :uri}, + "URL of the instance", + required: true + ) + end + + defp ok_response do + Operation.response("Ok", "application/json", %Schema{type: :string, example: "ok"}) + end + + defp emoji_packs_response do + Operation.response( + "Object with pack names as keys and pack contents as values", + "application/json", + %Schema{ + type: :object, + additionalProperties: emoji_pack(), + example: %{ + "emojos" => emoji_pack().example + } + } + ) + end + + defp emoji_pack do + %Schema{ + title: "EmojiPack", + type: :object, + properties: %{ + files: files_object(), + pack: %Schema{ + type: :object, + properties: %{ + license: %Schema{type: :string}, + homepage: %Schema{type: :string, format: :uri}, + description: %Schema{type: :string}, + "can-download": %Schema{type: :boolean}, + "share-files": %Schema{type: :boolean}, + "download-sha256": %Schema{type: :string} + } + } + }, + example: %{ + "files" => %{"emacs" => "emacs.png", "guix" => "guix.png"}, + "pack" => %{ + "license" => "Test license", + "homepage" => "https://pleroma.social", + "description" => "Test description", + "can-download" => true, + "share-files" => true, + "download-sha256" => "57482F30674FD3DE821FF48C81C00DA4D4AF1F300209253684ABA7075E5FC238" + } + } + } + end + + defp files_object do + %Schema{ + type: :object, + additionalProperties: %Schema{type: :string}, + description: "Object with emoji names as keys and filenames as values" + } + end + + defp update_request do + %Schema{ + type: :object, + properties: %{ + metadata: %Schema{ + type: :object, + description: "Metadata to replace the old one", + properties: %{ + license: %Schema{type: :string}, + homepage: %Schema{type: :string, format: :uri}, + description: %Schema{type: :string}, + "fallback-src": %Schema{ + type: :string, + format: :uri, + description: "Fallback url to download pack from" + }, + "fallback-src-sha256": %Schema{ + type: :string, + description: "SHA256 encoded for fallback pack archive" + }, + "share-files": %Schema{type: :boolean, description: "Is pack allowed for sharing?"} + } + } + } + } + end + + defp metadata do + %Schema{ + type: :object, + properties: %{ + license: %Schema{type: :string}, + homepage: %Schema{type: :string, format: :uri}, + description: %Schema{type: :string}, + "fallback-src": %Schema{ + type: :string, + format: :uri, + description: "Fallback url to download pack from" + }, + "fallback-src-sha256": %Schema{ + type: :string, + description: "SHA256 encoded for fallback pack archive" + }, + "share-files": %Schema{type: :boolean, description: "Is pack allowed for sharing?"} + } + } + end +end diff --git a/lib/pleroma/web/api_spec/operations/pleroma_mascot_operation.ex b/lib/pleroma/web/api_spec/operations/pleroma_mascot_operation.ex new file mode 100644 index 000000000..8c5f37ea6 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/pleroma_mascot_operation.ex @@ -0,0 +1,79 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.PleromaMascotOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.ApiError + + import Pleroma.Web.ApiSpec.Helpers + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def show_operation do + %Operation{ + tags: ["Mascot"], + summary: "Gets user mascot image", + security: [%{"oAuth" => ["read:accounts"]}], + operationId: "PleromaAPI.MascotController.show", + responses: %{ + 200 => Operation.response("Mascot", "application/json", mascot()) + } + } + end + + def update_operation do + %Operation{ + tags: ["Mascot"], + summary: "Set/clear user avatar image", + description: + "Behaves exactly the same as `POST /api/v1/upload`. Can only accept images - any attempt to upload non-image files will be met with `HTTP 415 Unsupported Media Type`.", + operationId: "PleromaAPI.MascotController.update", + requestBody: + request_body( + "Parameters", + %Schema{ + type: :object, + properties: %{ + file: %Schema{type: :string, format: :binary} + } + }, + required: true + ), + security: [%{"oAuth" => ["write:accounts"]}], + responses: %{ + 200 => Operation.response("Mascot", "application/json", mascot()), + 415 => Operation.response("Unsupported Media Type", "application/json", ApiError) + } + } + end + + defp mascot do + %Schema{ + type: :object, + properties: %{ + id: %Schema{type: :string}, + url: %Schema{type: :string, format: :uri}, + type: %Schema{type: :string}, + pleroma: %Schema{ + type: :object, + properties: %{ + mime_type: %Schema{type: :string} + } + } + }, + example: %{ + "id" => "abcdefg", + "url" => "https://pleroma.example.org/media/abcdefg.png", + "type" => "image", + "pleroma" => %{ + "mime_type" => "image/png" + } + } + } + end +end diff --git a/lib/pleroma/web/api_spec/operations/pleroma_notification_operation.ex b/lib/pleroma/web/api_spec/operations/pleroma_notification_operation.ex new file mode 100644 index 000000000..b0c8db863 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/pleroma_notification_operation.ex @@ -0,0 +1,48 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.PleromaNotificationOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.NotificationOperation + alias Pleroma.Web.ApiSpec.Schemas.ApiError + + import Pleroma.Web.ApiSpec.Helpers + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def mark_as_read_operation do + %Operation{ + tags: ["Notifications"], + summary: "Mark notifications as read. Query parameters are mutually exclusive.", + requestBody: + request_body("Parameters", %Schema{ + type: :object, + properties: %{ + id: %Schema{type: :integer, description: "A single notification ID to read"}, + max_id: %Schema{type: :integer, description: "Read all notifications up to this ID"} + } + }), + security: [%{"oAuth" => ["write:notifications"]}], + operationId: "PleromaAPI.NotificationController.mark_as_read", + responses: %{ + 200 => + Operation.response( + "A Notification or array of Motifications", + "application/json", + %Schema{ + anyOf: [ + %Schema{type: :array, items: NotificationOperation.notification()}, + NotificationOperation.notification() + ] + } + ), + 400 => Operation.response("Bad Request", "application/json", ApiError) + } + } + end +end diff --git a/lib/pleroma/web/api_spec/operations/pleroma_scrobble_operation.ex b/lib/pleroma/web/api_spec/operations/pleroma_scrobble_operation.ex new file mode 100644 index 000000000..85a22aa0b --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/pleroma_scrobble_operation.ex @@ -0,0 +1,102 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.PleromaScrobbleOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Reference + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.Account + alias Pleroma.Web.ApiSpec.Schemas.VisibilityScope + + import Pleroma.Web.ApiSpec.Helpers + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def create_operation do + %Operation{ + tags: ["Scrobbles"], + summary: "Creates a new Listen activity for an account", + security: [%{"oAuth" => ["write"]}], + operationId: "PleromaAPI.ScrobbleController.create", + requestBody: request_body("Parameters", create_request(), requried: true), + responses: %{ + 200 => Operation.response("Scrobble", "application/json", scrobble()) + } + } + end + + def index_operation do + %Operation{ + tags: ["Scrobbles"], + summary: "Requests a list of current and recent Listen activities for an account", + operationId: "PleromaAPI.ScrobbleController.index", + parameters: [ + %Reference{"$ref": "#/components/parameters/accountIdOrNickname"} | pagination_params() + ], + security: [%{"oAuth" => ["read"]}], + responses: %{ + 200 => + Operation.response("Array of Scrobble", "application/json", %Schema{ + type: :array, + items: scrobble() + }) + } + } + end + + defp create_request do + %Schema{ + type: :object, + required: [:title], + properties: %{ + title: %Schema{type: :string, description: "The title of the media playing"}, + album: %Schema{type: :string, description: "The album of the media playing"}, + artist: %Schema{type: :string, description: "The artist of the media playing"}, + length: %Schema{type: :integer, description: "The length of the media playing"}, + visibility: %Schema{ + allOf: [VisibilityScope], + default: "public", + description: "Scrobble visibility" + } + }, + example: %{ + "title" => "Some Title", + "artist" => "Some Artist", + "album" => "Some Album", + "length" => 180_000 + } + } + end + + defp scrobble do + %Schema{ + type: :object, + properties: %{ + id: %Schema{type: :string}, + account: Account, + title: %Schema{type: :string, description: "The title of the media playing"}, + album: %Schema{type: :string, description: "The album of the media playing"}, + artist: %Schema{type: :string, description: "The artist of the media playing"}, + length: %Schema{ + type: :integer, + description: "The length of the media playing", + nullable: true + }, + created_at: %Schema{type: :string, format: :"date-time"} + }, + example: %{ + "id" => "1234", + "account" => Account.schema().example, + "title" => "Some Title", + "artist" => "Some Artist", + "album" => "Some Album", + "length" => 180_000, + "created_at" => "2019-09-28T12:40:45.000Z" + } + } + end +end diff --git a/lib/pleroma/web/api_spec/operations/poll_operation.ex b/lib/pleroma/web/api_spec/operations/poll_operation.ex new file mode 100644 index 000000000..e15c7dc95 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/poll_operation.ex @@ -0,0 +1,76 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.PollOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.ApiError + alias Pleroma.Web.ApiSpec.Schemas.FlakeID + alias Pleroma.Web.ApiSpec.Schemas.Poll + + import Pleroma.Web.ApiSpec.Helpers + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def show_operation do + %Operation{ + tags: ["Polls"], + summary: "View a poll", + security: [%{"oAuth" => ["read:statuses"]}], + parameters: [id_param()], + operationId: "PollController.show", + responses: %{ + 200 => Operation.response("Poll", "application/json", Poll), + 404 => Operation.response("Error", "application/json", ApiError) + } + } + end + + def vote_operation do + %Operation{ + tags: ["Polls"], + summary: "Vote on a poll", + parameters: [id_param()], + operationId: "PollController.vote", + requestBody: vote_request(), + security: [%{"oAuth" => ["write:statuses"]}], + responses: %{ + 200 => Operation.response("Poll", "application/json", Poll), + 422 => Operation.response("Error", "application/json", ApiError), + 404 => Operation.response("Error", "application/json", ApiError) + } + } + end + + defp id_param do + Operation.parameter(:id, :path, FlakeID, "Poll ID", + example: "123", + required: true + ) + end + + defp vote_request do + request_body( + "Parameters", + %Schema{ + type: :object, + properties: %{ + choices: %Schema{ + type: :array, + items: %Schema{type: :integer}, + description: "Array of own votes containing index for each option (starting from 0)" + } + }, + required: [:choices] + }, + required: true, + example: %{ + "choices" => [0, 1, 2] + } + ) + end +end diff --git a/lib/pleroma/web/api_spec/operations/report_operation.ex b/lib/pleroma/web/api_spec/operations/report_operation.ex new file mode 100644 index 000000000..b9b4c4f79 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/report_operation.ex @@ -0,0 +1,82 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.ReportOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Helpers + alias Pleroma.Web.ApiSpec.Schemas.ApiError + alias Pleroma.Web.ApiSpec.Schemas.BooleanLike + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def create_operation do + %Operation{ + tags: ["reports"], + summary: "File a report", + description: "Report problematic users to your moderators", + operationId: "ReportController.create", + security: [%{"oAuth" => ["follow", "write:reports"]}], + requestBody: Helpers.request_body("Parameters", create_request(), required: true), + responses: %{ + 200 => Operation.response("Report", "application/json", create_response()), + 400 => Operation.response("Report", "application/json", ApiError) + } + } + end + + defp create_request do + %Schema{ + title: "ReportCreateRequest", + description: "POST body for creating a report", + type: :object, + properties: %{ + account_id: %Schema{type: :string, description: "ID of the account to report"}, + status_ids: %Schema{ + type: :array, + nullable: true, + items: %Schema{type: :string}, + description: "Array of Statuses to attach to the report, for context" + }, + comment: %Schema{ + type: :string, + nullable: true, + description: "Reason for the report" + }, + forward: %Schema{ + allOf: [BooleanLike], + nullable: true, + default: false, + description: + "If the account is remote, should the report be forwarded to the remote admin?" + } + }, + required: [:account_id], + example: %{ + "account_id" => "123", + "status_ids" => ["1337"], + "comment" => "bad status!", + "forward" => "false" + } + } + end + + defp create_response do + %Schema{ + title: "ReportResponse", + type: :object, + properties: %{ + id: %Schema{type: :string, description: "Report ID"}, + action_taken: %Schema{type: :boolean, description: "Is action taken?"} + }, + example: %{ + "id" => "123", + "action_taken" => false + } + } + end +end diff --git a/lib/pleroma/web/api_spec/operations/scheduled_activity_operation.ex b/lib/pleroma/web/api_spec/operations/scheduled_activity_operation.ex new file mode 100644 index 000000000..fe675a923 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/scheduled_activity_operation.ex @@ -0,0 +1,96 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.ScheduledActivityOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.ApiError + alias Pleroma.Web.ApiSpec.Schemas.FlakeID + alias Pleroma.Web.ApiSpec.Schemas.ScheduledStatus + + import Pleroma.Web.ApiSpec.Helpers + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def index_operation do + %Operation{ + tags: ["Scheduled Statuses"], + summary: "View scheduled statuses", + security: [%{"oAuth" => ["read:statuses"]}], + parameters: pagination_params(), + operationId: "ScheduledActivity.index", + responses: %{ + 200 => + Operation.response("Array of ScheduledStatus", "application/json", %Schema{ + type: :array, + items: ScheduledStatus + }) + } + } + end + + def show_operation do + %Operation{ + tags: ["Scheduled Statuses"], + summary: "View a single scheduled status", + security: [%{"oAuth" => ["read:statuses"]}], + parameters: [id_param()], + operationId: "ScheduledActivity.show", + responses: %{ + 200 => Operation.response("Scheduled Status", "application/json", ScheduledStatus), + 404 => Operation.response("Error", "application/json", ApiError) + } + } + end + + def update_operation do + %Operation{ + tags: ["Scheduled Statuses"], + summary: "Schedule a status", + operationId: "ScheduledActivity.update", + security: [%{"oAuth" => ["write:statuses"]}], + parameters: [id_param()], + requestBody: + request_body("Parameters", %Schema{ + type: :object, + properties: %{ + scheduled_at: %Schema{ + type: :string, + format: :"date-time", + description: + "ISO 8601 Datetime at which the status will be published. Must be at least 5 minutes into the future." + } + } + }), + responses: %{ + 200 => Operation.response("Scheduled Status", "application/json", ScheduledStatus), + 404 => Operation.response("Error", "application/json", ApiError) + } + } + end + + def delete_operation do + %Operation{ + tags: ["Scheduled Statuses"], + summary: "Cancel a scheduled status", + security: [%{"oAuth" => ["write:statuses"]}], + parameters: [id_param()], + operationId: "ScheduledActivity.delete", + responses: %{ + 200 => Operation.response("Empty object", "application/json", %Schema{type: :object}), + 404 => Operation.response("Error", "application/json", ApiError) + } + } + end + + defp id_param do + Operation.parameter(:id, :path, FlakeID, "Poll ID", + example: "123", + required: true + ) + end +end diff --git a/lib/pleroma/web/api_spec/operations/search_operation.ex b/lib/pleroma/web/api_spec/operations/search_operation.ex new file mode 100644 index 000000000..169c36d87 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/search_operation.ex @@ -0,0 +1,208 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.SearchOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.AccountOperation + alias Pleroma.Web.ApiSpec.Schemas.Account + alias Pleroma.Web.ApiSpec.Schemas.BooleanLike + alias Pleroma.Web.ApiSpec.Schemas.FlakeID + alias Pleroma.Web.ApiSpec.Schemas.Status + alias Pleroma.Web.ApiSpec.Schemas.Tag + + import Pleroma.Web.ApiSpec.Helpers + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + # Note: `with_relationships` param is not supported (PleromaFE uses this op for autocomplete) + def account_search_operation do + %Operation{ + tags: ["Search"], + summary: "Search for matching accounts by username or display name", + operationId: "SearchController.account_search", + parameters: [ + Operation.parameter(:q, :query, %Schema{type: :string}, "What to search for", + required: true + ), + Operation.parameter( + :limit, + :query, + %Schema{type: :integer, default: 40}, + "Maximum number of results" + ), + Operation.parameter( + :resolve, + :query, + %Schema{allOf: [BooleanLike], default: false}, + "Attempt WebFinger lookup. Use this when `q` is an exact address." + ), + Operation.parameter( + :following, + :query, + %Schema{allOf: [BooleanLike], default: false}, + "Only include accounts that the user is following" + ) + ], + responses: %{ + 200 => + Operation.response( + "Array of Account", + "application/json", + AccountOperation.array_of_accounts() + ) + } + } + end + + def search_operation do + %Operation{ + tags: ["Search"], + summary: "Search results", + security: [%{"oAuth" => ["read:search"]}], + operationId: "SearchController.search", + deprecated: true, + parameters: [ + Operation.parameter( + :account_id, + :query, + FlakeID, + "If provided, statuses returned will be authored only by this account" + ), + Operation.parameter( + :type, + :query, + %Schema{type: :string, enum: ["accounts", "hashtags", "statuses"]}, + "Search type" + ), + Operation.parameter(:q, :query, %Schema{type: :string}, "The search query", required: true), + Operation.parameter( + :resolve, + :query, + %Schema{allOf: [BooleanLike], default: false}, + "Attempt WebFinger lookup" + ), + Operation.parameter( + :following, + :query, + %Schema{allOf: [BooleanLike], default: false}, + "Only include accounts that the user is following" + ), + Operation.parameter( + :offset, + :query, + %Schema{type: :integer}, + "Offset" + ), + with_relationships_param() | pagination_params() + ], + responses: %{ + 200 => Operation.response("Results", "application/json", results()) + } + } + end + + def search2_operation do + %Operation{ + tags: ["Search"], + summary: "Search results", + security: [%{"oAuth" => ["read:search"]}], + operationId: "SearchController.search2", + parameters: [ + Operation.parameter( + :account_id, + :query, + FlakeID, + "If provided, statuses returned will be authored only by this account" + ), + Operation.parameter( + :type, + :query, + %Schema{type: :string, enum: ["accounts", "hashtags", "statuses"]}, + "Search type" + ), + Operation.parameter(:q, :query, %Schema{type: :string}, "What to search for", + required: true + ), + Operation.parameter( + :resolve, + :query, + %Schema{allOf: [BooleanLike], default: false}, + "Attempt WebFinger lookup" + ), + Operation.parameter( + :following, + :query, + %Schema{allOf: [BooleanLike], default: false}, + "Only include accounts that the user is following" + ), + with_relationships_param() | pagination_params() + ], + responses: %{ + 200 => Operation.response("Results", "application/json", results2()) + } + } + end + + defp results2 do + %Schema{ + title: "SearchResults", + type: :object, + properties: %{ + accounts: %Schema{ + type: :array, + items: Account, + description: "Accounts which match the given query" + }, + statuses: %Schema{ + type: :array, + items: Status, + description: "Statuses which match the given query" + }, + hashtags: %Schema{ + type: :array, + items: Tag, + description: "Hashtags which match the given query" + } + }, + example: %{ + "accounts" => [Account.schema().example], + "statuses" => [Status.schema().example], + "hashtags" => [Tag.schema().example] + } + } + end + + defp results do + %Schema{ + title: "SearchResults", + type: :object, + properties: %{ + accounts: %Schema{ + type: :array, + items: Account, + description: "Accounts which match the given query" + }, + statuses: %Schema{ + type: :array, + items: Status, + description: "Statuses which match the given query" + }, + hashtags: %Schema{ + type: :array, + items: %Schema{type: :string}, + description: "Hashtags which match the given query" + } + }, + example: %{ + "accounts" => [Account.schema().example], + "statuses" => [Status.schema().example], + "hashtags" => ["cofe"] + } + } + end +end diff --git a/lib/pleroma/web/api_spec/operations/status_operation.ex b/lib/pleroma/web/api_spec/operations/status_operation.ex new file mode 100644 index 000000000..ca9db01e5 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/status_operation.ex @@ -0,0 +1,518 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.StatusOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.AccountOperation + alias Pleroma.Web.ApiSpec.Schemas.ApiError + alias Pleroma.Web.ApiSpec.Schemas.BooleanLike + alias Pleroma.Web.ApiSpec.Schemas.FlakeID + alias Pleroma.Web.ApiSpec.Schemas.ScheduledStatus + alias Pleroma.Web.ApiSpec.Schemas.Status + alias Pleroma.Web.ApiSpec.Schemas.VisibilityScope + + import Pleroma.Web.ApiSpec.Helpers + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def index_operation do + %Operation{ + tags: ["Statuses"], + summary: "Get multiple statuses by IDs", + security: [%{"oAuth" => ["read:statuses"]}], + parameters: [ + Operation.parameter( + :ids, + :query, + %Schema{type: :array, items: FlakeID}, + "Array of status IDs" + ) + ], + operationId: "StatusController.index", + responses: %{ + 200 => Operation.response("Array of Status", "application/json", array_of_statuses()) + } + } + end + + def create_operation do + %Operation{ + tags: ["Statuses"], + summary: "Publish new status", + security: [%{"oAuth" => ["write:statuses"]}], + description: "Post a new status", + operationId: "StatusController.create", + requestBody: request_body("Parameters", create_request(), required: true), + responses: %{ + 200 => + Operation.response( + "Status. When `scheduled_at` is present, ScheduledStatus is returned instead", + "application/json", + %Schema{oneOf: [Status, ScheduledStatus]} + ), + 422 => Operation.response("Bad Request", "application/json", ApiError) + } + } + end + + def show_operation do + %Operation{ + tags: ["Statuses"], + summary: "View specific status", + description: "View information about a status", + operationId: "StatusController.show", + security: [%{"oAuth" => ["read:statuses"]}], + parameters: [id_param()], + responses: %{ + 200 => status_response(), + 404 => Operation.response("Not Found", "application/json", ApiError) + } + } + end + + def delete_operation do + %Operation{ + tags: ["Statuses"], + summary: "Delete status", + security: [%{"oAuth" => ["write:statuses"]}], + description: "Delete one of your own statuses", + operationId: "StatusController.delete", + parameters: [id_param()], + responses: %{ + 200 => empty_object_response(), + 403 => Operation.response("Forbidden", "application/json", ApiError), + 404 => Operation.response("Not Found", "application/json", ApiError) + } + } + end + + def reblog_operation do + %Operation{ + tags: ["Statuses"], + summary: "Boost", + security: [%{"oAuth" => ["write:statuses"]}], + description: "Share a status", + operationId: "StatusController.reblog", + parameters: [id_param()], + requestBody: + request_body("Parameters", %Schema{ + type: :object, + properties: %{ + visibility: %Schema{allOf: [VisibilityScope], default: "public"} + } + }), + responses: %{ + 200 => status_response(), + 404 => Operation.response("Not Found", "application/json", ApiError) + } + } + end + + def unreblog_operation do + %Operation{ + tags: ["Statuses"], + summary: "Undo boost", + security: [%{"oAuth" => ["write:statuses"]}], + description: "Undo a reshare of a status", + operationId: "StatusController.unreblog", + parameters: [id_param()], + responses: %{ + 200 => status_response(), + 404 => Operation.response("Not Found", "application/json", ApiError) + } + } + end + + def favourite_operation do + %Operation{ + tags: ["Statuses"], + summary: "Favourite", + security: [%{"oAuth" => ["write:favourites"]}], + description: "Add a status to your favourites list", + operationId: "StatusController.favourite", + parameters: [id_param()], + responses: %{ + 200 => status_response(), + 404 => Operation.response("Not Found", "application/json", ApiError) + } + } + end + + def unfavourite_operation do + %Operation{ + tags: ["Statuses"], + summary: "Undo favourite", + security: [%{"oAuth" => ["write:favourites"]}], + description: "Remove a status from your favourites list", + operationId: "StatusController.unfavourite", + parameters: [id_param()], + responses: %{ + 200 => status_response(), + 404 => Operation.response("Not Found", "application/json", ApiError) + } + } + end + + def pin_operation do + %Operation{ + tags: ["Statuses"], + summary: "Pin to profile", + security: [%{"oAuth" => ["write:accounts"]}], + description: "Feature one of your own public statuses at the top of your profile", + operationId: "StatusController.pin", + parameters: [id_param()], + responses: %{ + 200 => status_response(), + 400 => Operation.response("Error", "application/json", ApiError) + } + } + end + + def unpin_operation do + %Operation{ + tags: ["Statuses"], + summary: "Unpin to profile", + security: [%{"oAuth" => ["write:accounts"]}], + description: "Unfeature a status from the top of your profile", + operationId: "StatusController.unpin", + parameters: [id_param()], + responses: %{ + 200 => status_response(), + 400 => Operation.response("Error", "application/json", ApiError) + } + } + end + + def bookmark_operation do + %Operation{ + tags: ["Statuses"], + summary: "Bookmark", + security: [%{"oAuth" => ["write:bookmarks"]}], + description: "Privately bookmark a status", + operationId: "StatusController.bookmark", + parameters: [id_param()], + responses: %{ + 200 => status_response() + } + } + end + + def unbookmark_operation do + %Operation{ + tags: ["Statuses"], + summary: "Undo bookmark", + security: [%{"oAuth" => ["write:bookmarks"]}], + description: "Remove a status from your private bookmarks", + operationId: "StatusController.unbookmark", + parameters: [id_param()], + responses: %{ + 200 => status_response() + } + } + end + + def mute_conversation_operation do + %Operation{ + tags: ["Statuses"], + summary: "Mute conversation", + security: [%{"oAuth" => ["write:mutes"]}], + description: "Do not receive notifications for the thread that this status is part of.", + operationId: "StatusController.mute_conversation", + parameters: [id_param()], + responses: %{ + 200 => status_response(), + 400 => Operation.response("Error", "application/json", ApiError) + } + } + end + + def unmute_conversation_operation do + %Operation{ + tags: ["Statuses"], + summary: "Unmute conversation", + security: [%{"oAuth" => ["write:mutes"]}], + description: + "Start receiving notifications again for the thread that this status is part of", + operationId: "StatusController.unmute_conversation", + parameters: [id_param()], + responses: %{ + 200 => status_response(), + 400 => Operation.response("Error", "application/json", ApiError) + } + } + end + + def card_operation do + %Operation{ + tags: ["Statuses"], + deprecated: true, + summary: "Preview card", + description: "Deprecated in favor of card property inlined on Status entity", + operationId: "StatusController.card", + parameters: [id_param()], + security: [%{"oAuth" => ["read:statuses"]}], + responses: %{ + 200 => + Operation.response("Card", "application/json", %Schema{ + type: :object, + nullable: true, + properties: %{ + type: %Schema{type: :string, enum: ["link", "photo", "video", "rich"]}, + provider_name: %Schema{type: :string, nullable: true}, + provider_url: %Schema{type: :string, format: :uri}, + url: %Schema{type: :string, format: :uri}, + image: %Schema{type: :string, nullable: true, format: :uri}, + title: %Schema{type: :string}, + description: %Schema{type: :string} + } + }) + } + } + end + + def favourited_by_operation do + %Operation{ + tags: ["Statuses"], + summary: "Favourited by", + description: "View who favourited a given status", + operationId: "StatusController.favourited_by", + security: [%{"oAuth" => ["read:accounts"]}], + parameters: [id_param()], + responses: %{ + 200 => + Operation.response( + "Array of Accounts", + "application/json", + AccountOperation.array_of_accounts() + ), + 404 => Operation.response("Not Found", "application/json", ApiError) + } + } + end + + def reblogged_by_operation do + %Operation{ + tags: ["Statuses"], + summary: "Boosted by", + description: "View who boosted a given status", + operationId: "StatusController.reblogged_by", + security: [%{"oAuth" => ["read:accounts"]}], + parameters: [id_param()], + responses: %{ + 200 => + Operation.response( + "Array of Accounts", + "application/json", + AccountOperation.array_of_accounts() + ), + 404 => Operation.response("Not Found", "application/json", ApiError) + } + } + end + + def context_operation do + %Operation{ + tags: ["Statuses"], + summary: "Parent and child statuses", + description: "View statuses above and below this status in the thread", + operationId: "StatusController.context", + security: [%{"oAuth" => ["read:statuses"]}], + parameters: [id_param()], + responses: %{ + 200 => Operation.response("Context", "application/json", context()) + } + } + end + + def favourites_operation do + %Operation{ + tags: ["Statuses"], + summary: "Favourited statuses", + description: "Statuses the user has favourited", + operationId: "StatusController.favourites", + parameters: pagination_params(), + security: [%{"oAuth" => ["read:favourites"]}], + responses: %{ + 200 => Operation.response("Array of Statuses", "application/json", array_of_statuses()) + } + } + end + + def bookmarks_operation do + %Operation{ + tags: ["Statuses"], + summary: "Bookmarked statuses", + description: "Statuses the user has bookmarked", + operationId: "StatusController.bookmarks", + parameters: pagination_params(), + security: [%{"oAuth" => ["read:bookmarks"]}], + responses: %{ + 200 => Operation.response("Array of Statuses", "application/json", array_of_statuses()) + } + } + end + + def array_of_statuses do + %Schema{type: :array, items: Status, example: [Status.schema().example]} + end + + defp create_request do + %Schema{ + title: "StatusCreateRequest", + type: :object, + properties: %{ + status: %Schema{ + type: :string, + nullable: true, + description: + "Text content of the status. If `media_ids` is provided, this becomes optional. Attaching a `poll` is optional while `status` is provided." + }, + media_ids: %Schema{ + nullable: true, + type: :array, + items: %Schema{type: :string}, + description: "Array of Attachment ids to be attached as media." + }, + poll: %Schema{ + nullable: true, + type: :object, + required: [:options], + properties: %{ + options: %Schema{ + type: :array, + items: %Schema{type: :string}, + description: "Array of possible answers. Must be provided with `poll[expires_in]`." + }, + expires_in: %Schema{ + type: :integer, + nullable: true, + description: + "Duration the poll should be open, in seconds. Must be provided with `poll[options]`" + }, + multiple: %Schema{ + allOf: [BooleanLike], + nullable: true, + description: "Allow multiple choices?" + }, + hide_totals: %Schema{ + allOf: [BooleanLike], + nullable: true, + description: "Hide vote counts until the poll ends?" + } + } + }, + in_reply_to_id: %Schema{ + nullable: true, + allOf: [FlakeID], + description: "ID of the status being replied to, if status is a reply" + }, + sensitive: %Schema{ + allOf: [BooleanLike], + nullable: true, + description: "Mark status and attached media as sensitive?" + }, + spoiler_text: %Schema{ + type: :string, + nullable: true, + description: + "Text to be shown as a warning or subject before the actual content. Statuses are generally collapsed behind this field." + }, + scheduled_at: %Schema{ + type: :string, + format: :"date-time", + nullable: true, + description: + "ISO 8601 Datetime at which to schedule a status. Providing this paramter will cause ScheduledStatus to be returned instead of Status. Must be at least 5 minutes in the future." + }, + language: %Schema{ + type: :string, + nullable: true, + description: "ISO 639 language code for this status." + }, + # Pleroma-specific properties: + preview: %Schema{ + allOf: [BooleanLike], + nullable: true, + description: + "If set to `true` the post won't be actually posted, but the status entitiy would still be rendered back. This could be useful for previewing rich text/custom emoji, for example" + }, + content_type: %Schema{ + type: :string, + nullable: true, + description: + "The MIME type of the status, it is transformed into HTML by the backend. You can get the list of the supported MIME types with the nodeinfo endpoint." + }, + to: %Schema{ + type: :array, + nullable: true, + items: %Schema{type: :string}, + description: + "A list of nicknames (like `lain@soykaf.club` or `lain` on the local server) that will be used to determine who is going to be addressed by this post. Using this will disable the implicit addressing by mentioned names in the `status` body, only the people in the `to` list will be addressed. The normal rules for for post visibility are not affected by this and will still apply" + }, + visibility: %Schema{ + nullable: true, + anyOf: [ + VisibilityScope, + %Schema{type: :string, description: "`list:LIST_ID`", example: "LIST:123"} + ], + description: + "Visibility of the posted status. Besides standard MastoAPI values (`direct`, `private`, `unlisted` or `public`) it can be used to address a List by setting it to `list:LIST_ID`" + }, + expires_in: %Schema{ + nullable: true, + type: :integer, + description: + "The number of seconds the posted activity should expire in. When a posted activity expires it will be deleted from the server, and a delete request for it will be federated. This needs to be longer than an hour." + }, + in_reply_to_conversation_id: %Schema{ + nullable: true, + type: :string, + description: + "Will reply to a given conversation, addressing only the people who are part of the recipient set of that conversation. Sets the visibility to `direct`." + } + }, + example: %{ + "status" => "What time is it?", + "sensitive" => "false", + "poll" => %{ + "options" => ["Cofe", "Adventure"], + "expires_in" => 420 + } + } + } + end + + def id_param do + Operation.parameter(:id, :path, FlakeID, "Status ID", + example: "9umDrYheeY451cQnEe", + required: true + ) + end + + defp status_response do + Operation.response("Status", "application/json", Status) + end + + defp context do + %Schema{ + title: "StatusContext", + description: + "Represents the tree around a given status. Used for reconstructing threads of statuses.", + type: :object, + required: [:ancestors, :descendants], + properties: %{ + ancestors: array_of_statuses(), + descendants: array_of_statuses() + }, + example: %{ + "ancestors" => [Status.schema().example], + "descendants" => [Status.schema().example] + } + } + end +end diff --git a/lib/pleroma/web/api_spec/operations/subscription_operation.ex b/lib/pleroma/web/api_spec/operations/subscription_operation.ex new file mode 100644 index 000000000..c575a87e6 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/subscription_operation.ex @@ -0,0 +1,227 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.SubscriptionOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Helpers + alias Pleroma.Web.ApiSpec.Schemas.ApiError + alias Pleroma.Web.ApiSpec.Schemas.BooleanLike + alias Pleroma.Web.ApiSpec.Schemas.PushSubscription + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def create_operation do + %Operation{ + tags: ["Push Subscriptions"], + summary: "Subscribe to push notifications", + description: + "Add a Web Push API subscription to receive notifications. Each access token can have one push subscription. If you create a new subscription, the old subscription is deleted.", + operationId: "SubscriptionController.create", + security: [%{"oAuth" => ["push"]}], + requestBody: Helpers.request_body("Parameters", create_request(), required: true), + responses: %{ + 200 => Operation.response("Push Subscription", "application/json", PushSubscription), + 400 => Operation.response("Error", "application/json", ApiError), + 403 => Operation.response("Error", "application/json", ApiError) + } + } + end + + def show_operation do + %Operation{ + tags: ["Push Subscriptions"], + summary: "Get current subscription", + description: "View the PushSubscription currently associated with this access token.", + operationId: "SubscriptionController.show", + security: [%{"oAuth" => ["push"]}], + responses: %{ + 200 => Operation.response("Push Subscription", "application/json", PushSubscription), + 403 => Operation.response("Error", "application/json", ApiError), + 404 => Operation.response("Error", "application/json", ApiError) + } + } + end + + def update_operation do + %Operation{ + tags: ["Push Subscriptions"], + summary: "Change types of notifications", + description: + "Updates the current push subscription. Only the data part can be updated. To change fundamentals, a new subscription must be created instead.", + operationId: "SubscriptionController.update", + security: [%{"oAuth" => ["push"]}], + requestBody: Helpers.request_body("Parameters", update_request(), required: true), + responses: %{ + 200 => Operation.response("Push Subscription", "application/json", PushSubscription), + 403 => Operation.response("Error", "application/json", ApiError) + } + } + end + + def delete_operation do + %Operation{ + tags: ["Push Subscriptions"], + summary: "Remove current subscription", + description: "Removes the current Web Push API subscription.", + operationId: "SubscriptionController.delete", + security: [%{"oAuth" => ["push"]}], + responses: %{ + 200 => Operation.response("Empty object", "application/json", %Schema{type: :object}), + 403 => Operation.response("Error", "application/json", ApiError), + 404 => Operation.response("Error", "application/json", ApiError) + } + } + end + + defp create_request do + %Schema{ + title: "SubscriptionCreateRequest", + description: "POST body for creating a push subscription", + type: :object, + properties: %{ + subscription: %Schema{ + type: :object, + properties: %{ + endpoint: %Schema{ + type: :string, + description: "Endpoint URL that is called when a notification event occurs." + }, + keys: %Schema{ + type: :object, + properties: %{ + p256dh: %Schema{ + type: :string, + description: + "User agent public key. Base64 encoded string of public key of ECDH key using `prime256v1` curve." + }, + auth: %Schema{ + type: :string, + description: "Auth secret. Base64 encoded string of 16 bytes of random data." + } + }, + required: [:p256dh, :auth] + } + }, + required: [:endpoint, :keys] + }, + data: %Schema{ + nullable: true, + type: :object, + properties: %{ + alerts: %Schema{ + nullable: true, + type: :object, + properties: %{ + follow: %Schema{ + allOf: [BooleanLike], + nullable: true, + description: "Receive follow notifications?" + }, + favourite: %Schema{ + allOf: [BooleanLike], + nullable: true, + description: "Receive favourite notifications?" + }, + reblog: %Schema{ + allOf: [BooleanLike], + nullable: true, + description: "Receive reblog notifications?" + }, + mention: %Schema{ + allOf: [BooleanLike], + nullable: true, + description: "Receive mention notifications?" + }, + poll: %Schema{ + allOf: [BooleanLike], + nullable: true, + description: "Receive poll notifications?" + } + } + } + } + } + }, + required: [:subscription], + example: %{ + "subscription" => %{ + "endpoint" => "https://example.com/example/1234", + "keys" => %{ + "auth" => "8eDyX_uCN0XRhSbY5hs7Hg==", + "p256dh" => + "BCIWgsnyXDv1VkhqL2P7YRBvdeuDnlwAPT2guNhdIoW3IP7GmHh1SMKPLxRf7x8vJy6ZFK3ol2ohgn_-0yP7QQA=" + } + }, + "data" => %{ + "alerts" => %{ + "follow" => true, + "mention" => true, + "poll" => false + } + } + } + } + end + + defp update_request do + %Schema{ + title: "SubscriptionUpdateRequest", + type: :object, + properties: %{ + data: %Schema{ + nullable: true, + type: :object, + properties: %{ + alerts: %Schema{ + nullable: true, + type: :object, + properties: %{ + follow: %Schema{ + allOf: [BooleanLike], + nullable: true, + description: "Receive follow notifications?" + }, + favourite: %Schema{ + allOf: [BooleanLike], + nullable: true, + description: "Receive favourite notifications?" + }, + reblog: %Schema{ + allOf: [BooleanLike], + nullable: true, + description: "Receive reblog notifications?" + }, + mention: %Schema{ + allOf: [BooleanLike], + nullable: true, + description: "Receive mention notifications?" + }, + poll: %Schema{ + allOf: [BooleanLike], + nullable: true, + description: "Receive poll notifications?" + } + } + } + } + } + }, + example: %{ + "data" => %{ + "alerts" => %{ + "follow" => true, + "favourite" => true, + "reblog" => true, + "mention" => true, + "poll" => true + } + } + } + } + end +end diff --git a/lib/pleroma/web/api_spec/operations/timeline_operation.ex b/lib/pleroma/web/api_spec/operations/timeline_operation.ex new file mode 100644 index 000000000..8e19bace7 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/timeline_operation.ex @@ -0,0 +1,191 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.TimelineOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.ApiError + alias Pleroma.Web.ApiSpec.Schemas.BooleanLike + alias Pleroma.Web.ApiSpec.Schemas.Status + alias Pleroma.Web.ApiSpec.Schemas.VisibilityScope + + import Pleroma.Web.ApiSpec.Helpers + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def home_operation do + %Operation{ + tags: ["Timelines"], + summary: "Home timeline", + description: "View statuses from followed users", + security: [%{"oAuth" => ["read:statuses"]}], + parameters: [ + local_param(), + with_muted_param(), + exclude_visibilities_param(), + reply_visibility_param() | pagination_params() + ], + operationId: "TimelineController.home", + responses: %{ + 200 => Operation.response("Array of Status", "application/json", array_of_statuses()) + } + } + end + + def direct_operation do + %Operation{ + tags: ["Timelines"], + summary: "Direct timeline", + description: + "View statuses with a “direct” privacy, from your account or in your notifications", + deprecated: true, + parameters: [with_muted_param() | pagination_params()], + security: [%{"oAuth" => ["read:statuses"]}], + operationId: "TimelineController.direct", + responses: %{ + 200 => Operation.response("Array of Status", "application/json", array_of_statuses()) + } + } + end + + def public_operation do + %Operation{ + tags: ["Timelines"], + summary: "Public timeline", + security: [%{"oAuth" => ["read:statuses"]}], + parameters: [ + local_param(), + only_media_param(), + with_muted_param(), + exclude_visibilities_param(), + reply_visibility_param() | pagination_params() + ], + operationId: "TimelineController.public", + responses: %{ + 200 => Operation.response("Array of Status", "application/json", array_of_statuses()), + 401 => Operation.response("Error", "application/json", ApiError) + } + } + end + + def hashtag_operation do + %Operation{ + tags: ["Timelines"], + summary: "Hashtag timeline", + description: "View public statuses containing the given hashtag", + security: [%{"oAuth" => ["read:statuses"]}], + parameters: [ + Operation.parameter( + :tag, + :path, + %Schema{type: :string}, + "Content of a #hashtag, not including # symbol.", + required: true + ), + Operation.parameter( + :any, + :query, + %Schema{type: :array, items: %Schema{type: :string}}, + "Statuses that also includes any of these tags" + ), + Operation.parameter( + :all, + :query, + %Schema{type: :array, items: %Schema{type: :string}}, + "Statuses that also includes all of these tags" + ), + Operation.parameter( + :none, + :query, + %Schema{type: :array, items: %Schema{type: :string}}, + "Statuses that do not include these tags" + ), + local_param(), + only_media_param(), + with_muted_param(), + exclude_visibilities_param() | pagination_params() + ], + operationId: "TimelineController.hashtag", + responses: %{ + 200 => Operation.response("Array of Status", "application/json", array_of_statuses()) + } + } + end + + def list_operation do + %Operation{ + tags: ["Timelines"], + summary: "List timeline", + description: "View statuses in the given list timeline", + security: [%{"oAuth" => ["read:lists"]}], + parameters: [ + Operation.parameter( + :list_id, + :path, + %Schema{type: :string}, + "Local ID of the list in the database", + required: true + ), + with_muted_param(), + exclude_visibilities_param() | pagination_params() + ], + operationId: "TimelineController.list", + responses: %{ + 200 => Operation.response("Array of Status", "application/json", array_of_statuses()) + } + } + end + + defp array_of_statuses do + %Schema{ + title: "ArrayOfStatuses", + type: :array, + items: Status, + example: [Status.schema().example] + } + end + + defp local_param do + Operation.parameter( + :local, + :query, + %Schema{allOf: [BooleanLike], default: false}, + "Show only local statuses?" + ) + end + + defp with_muted_param do + Operation.parameter(:with_muted, :query, BooleanLike, "Includeactivities by muted users") + end + + defp exclude_visibilities_param do + Operation.parameter( + :exclude_visibilities, + :query, + %Schema{type: :array, items: VisibilityScope}, + "Exclude the statuses with the given visibilities" + ) + end + + defp reply_visibility_param do + Operation.parameter( + :reply_visibility, + :query, + %Schema{type: :string, enum: ["following", "self"]}, + "Filter replies. Possible values: without parameter (default) shows all replies, `following` - replies directed to you or users you follow, `self` - replies directed to you." + ) + end + + defp only_media_param do + Operation.parameter( + :only_media, + :query, + %Schema{allOf: [BooleanLike], default: false}, + "Show only statuses with media attached?" + ) + end +end diff --git a/lib/pleroma/web/api_spec/render_error.ex b/lib/pleroma/web/api_spec/render_error.ex new file mode 100644 index 000000000..d476b8ef3 --- /dev/null +++ b/lib/pleroma/web/api_spec/render_error.ex @@ -0,0 +1,234 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.RenderError do + @behaviour Plug + + import Plug.Conn, only: [put_status: 2] + import Phoenix.Controller, only: [json: 2] + import Pleroma.Web.Gettext + + @impl Plug + def init(opts), do: opts + + @impl Plug + + def call(conn, errors) do + errors = + Enum.map(errors, fn + %{name: nil, reason: :invalid_enum} = err -> + %OpenApiSpex.Cast.Error{err | name: err.value} + + %{name: nil} = err -> + %OpenApiSpex.Cast.Error{err | name: List.last(err.path)} + + err -> + err + end) + + conn + |> put_status(:bad_request) + |> json(%{ + error: errors |> Enum.map(&message/1) |> Enum.join(" "), + errors: errors |> Enum.map(&render_error/1) + }) + end + + defp render_error(error) do + pointer = OpenApiSpex.path_to_string(error) + + %{ + title: "Invalid value", + source: %{ + pointer: pointer + }, + message: OpenApiSpex.Cast.Error.message(error) + } + end + + defp message(%{reason: :invalid_schema_type, type: type, name: name}) do + gettext("%{name} - Invalid schema.type. Got: %{type}.", + name: name, + type: inspect(type) + ) + end + + defp message(%{reason: :null_value, name: name} = error) do + case error.type do + nil -> + gettext("%{name} - null value.", name: name) + + type -> + gettext("%{name} - null value where %{type} expected.", + name: name, + type: type + ) + end + end + + defp message(%{reason: :all_of, meta: %{invalid_schema: invalid_schema}}) do + gettext( + "Failed to cast value as %{invalid_schema}. Value must be castable using `allOf` schemas listed.", + invalid_schema: invalid_schema + ) + end + + defp message(%{reason: :any_of, meta: %{failed_schemas: failed_schemas}}) do + gettext("Failed to cast value using any of: %{failed_schemas}.", + failed_schemas: failed_schemas + ) + end + + defp message(%{reason: :one_of, meta: %{failed_schemas: failed_schemas}}) do + gettext("Failed to cast value to one of: %{failed_schemas}.", failed_schemas: failed_schemas) + end + + defp message(%{reason: :min_length, length: length, name: name}) do + gettext("%{name} - String length is smaller than minLength: %{length}.", + name: name, + length: length + ) + end + + defp message(%{reason: :max_length, length: length, name: name}) do + gettext("%{name} - String length is larger than maxLength: %{length}.", + name: name, + length: length + ) + end + + defp message(%{reason: :unique_items, name: name}) do + gettext("%{name} - Array items must be unique.", name: name) + end + + defp message(%{reason: :min_items, length: min, value: array, name: name}) do + gettext("%{name} - Array length %{length} is smaller than minItems: %{min}.", + name: name, + length: length(array), + min: min + ) + end + + defp message(%{reason: :max_items, length: max, value: array, name: name}) do + gettext("%{name} - Array length %{length} is larger than maxItems: %{}.", + name: name, + length: length(array), + max: max + ) + end + + defp message(%{reason: :multiple_of, length: multiple, value: count, name: name}) do + gettext("%{name} - %{count} is not a multiple of %{multiple}.", + name: name, + count: count, + multiple: multiple + ) + end + + defp message(%{reason: :exclusive_max, length: max, value: value, name: name}) + when value >= max do + gettext("%{name} - %{value} is larger than exclusive maximum %{max}.", + name: name, + value: value, + max: max + ) + end + + defp message(%{reason: :maximum, length: max, value: value, name: name}) + when value > max do + gettext("%{name} - %{value} is larger than inclusive maximum %{max}.", + name: name, + value: value, + max: max + ) + end + + defp message(%{reason: :exclusive_multiple, length: min, value: value, name: name}) + when value <= min do + gettext("%{name} - %{value} is smaller than exclusive minimum %{min}.", + name: name, + value: value, + min: min + ) + end + + defp message(%{reason: :minimum, length: min, value: value, name: name}) + when value < min do + gettext("%{name} - %{value} is smaller than inclusive minimum %{min}.", + name: name, + value: value, + min: min + ) + end + + defp message(%{reason: :invalid_type, type: type, value: value, name: name}) do + gettext("%{name} - Invalid %{type}. Got: %{value}.", + name: name, + value: OpenApiSpex.TermType.type(value), + type: type + ) + end + + defp message(%{reason: :invalid_format, format: format, name: name}) do + gettext("%{name} - Invalid format. Expected %{format}.", name: name, format: inspect(format)) + end + + defp message(%{reason: :invalid_enum, name: name}) do + gettext("%{name} - Invalid value for enum.", name: name) + end + + defp message(%{reason: :polymorphic_failed, type: polymorphic_type}) do + gettext("Failed to cast to any schema in %{polymorphic_type}", + polymorphic_type: polymorphic_type + ) + end + + defp message(%{reason: :unexpected_field, name: name}) do + gettext("Unexpected field: %{name}.", name: safe_string(name)) + end + + defp message(%{reason: :no_value_for_discriminator, name: field}) do + gettext("Value used as discriminator for `%{field}` matches no schemas.", name: field) + end + + defp message(%{reason: :invalid_discriminator_value, name: field}) do + gettext("No value provided for required discriminator `%{field}`.", name: field) + end + + defp message(%{reason: :unknown_schema, name: name}) do + gettext("Unknown schema: %{name}.", name: name) + end + + defp message(%{reason: :missing_field, name: name}) do + gettext("Missing field: %{name}.", name: name) + end + + defp message(%{reason: :missing_header, name: name}) do + gettext("Missing header: %{name}.", name: name) + end + + defp message(%{reason: :invalid_header, name: name}) do + gettext("Invalid value for header: %{name}.", name: name) + end + + defp message(%{reason: :max_properties, meta: meta}) do + gettext( + "Object property count %{property_count} is greater than maxProperties: %{max_properties}.", + property_count: meta.property_count, + max_properties: meta.max_properties + ) + end + + defp message(%{reason: :min_properties, meta: meta}) do + gettext( + "Object property count %{property_count} is less than minProperties: %{min_properties}", + property_count: meta.property_count, + min_properties: meta.min_properties + ) + end + + defp safe_string(string) do + to_string(string) |> String.slice(0..39) + end +end diff --git a/lib/pleroma/web/api_spec/schemas/account.ex b/lib/pleroma/web/api_spec/schemas/account.ex new file mode 100644 index 000000000..d54e2158d --- /dev/null +++ b/lib/pleroma/web/api_spec/schemas/account.ex @@ -0,0 +1,167 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Schemas.Account do + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.AccountField + alias Pleroma.Web.ApiSpec.Schemas.AccountRelationship + alias Pleroma.Web.ApiSpec.Schemas.ActorType + alias Pleroma.Web.ApiSpec.Schemas.Emoji + alias Pleroma.Web.ApiSpec.Schemas.FlakeID + alias Pleroma.Web.ApiSpec.Schemas.VisibilityScope + + require OpenApiSpex + + OpenApiSpex.schema(%{ + title: "Account", + description: "Response schema for an account", + type: :object, + properties: %{ + acct: %Schema{type: :string}, + avatar_static: %Schema{type: :string, format: :uri}, + avatar: %Schema{type: :string, format: :uri}, + bot: %Schema{type: :boolean}, + created_at: %Schema{type: :string, format: "date-time"}, + display_name: %Schema{type: :string}, + emojis: %Schema{type: :array, items: Emoji}, + fields: %Schema{type: :array, items: AccountField}, + follow_requests_count: %Schema{type: :integer}, + followers_count: %Schema{type: :integer}, + following_count: %Schema{type: :integer}, + header_static: %Schema{type: :string, format: :uri}, + header: %Schema{type: :string, format: :uri}, + id: FlakeID, + locked: %Schema{type: :boolean}, + note: %Schema{type: :string, format: :html}, + statuses_count: %Schema{type: :integer}, + url: %Schema{type: :string, format: :uri}, + username: %Schema{type: :string}, + pleroma: %Schema{ + type: :object, + properties: %{ + allow_following_move: %Schema{type: :boolean}, + background_image: %Schema{type: :string, nullable: true}, + chat_token: %Schema{type: :string}, + confirmation_pending: %Schema{type: :boolean}, + hide_favorites: %Schema{type: :boolean}, + hide_followers_count: %Schema{type: :boolean}, + hide_followers: %Schema{type: :boolean}, + hide_follows_count: %Schema{type: :boolean}, + hide_follows: %Schema{type: :boolean}, + is_admin: %Schema{type: :boolean}, + is_moderator: %Schema{type: :boolean}, + skip_thread_containment: %Schema{type: :boolean}, + tags: %Schema{type: :array, items: %Schema{type: :string}}, + unread_conversation_count: %Schema{type: :integer}, + notification_settings: %Schema{ + type: :object, + properties: %{ + followers: %Schema{type: :boolean}, + follows: %Schema{type: :boolean}, + non_followers: %Schema{type: :boolean}, + non_follows: %Schema{type: :boolean}, + privacy_option: %Schema{type: :boolean} + } + }, + relationship: AccountRelationship, + settings_store: %Schema{ + type: :object + } + } + }, + source: %Schema{ + type: :object, + properties: %{ + fields: %Schema{type: :array, items: AccountField}, + note: %Schema{type: :string}, + privacy: VisibilityScope, + sensitive: %Schema{type: :boolean}, + pleroma: %Schema{ + type: :object, + properties: %{ + actor_type: ActorType, + discoverable: %Schema{type: :boolean}, + no_rich_text: %Schema{type: :boolean}, + show_role: %Schema{type: :boolean} + } + } + } + } + }, + example: %{ + "acct" => "foobar", + "avatar" => "https://mypleroma.com/images/avi.png", + "avatar_static" => "https://mypleroma.com/images/avi.png", + "bot" => false, + "created_at" => "2020-03-24T13:05:58.000Z", + "display_name" => "foobar", + "emojis" => [], + "fields" => [], + "follow_requests_count" => 0, + "followers_count" => 0, + "following_count" => 1, + "header" => "https://mypleroma.com/images/banner.png", + "header_static" => "https://mypleroma.com/images/banner.png", + "id" => "9tKi3esbG7OQgZ2920", + "locked" => false, + "note" => "cofe", + "pleroma" => %{ + "allow_following_move" => true, + "background_image" => nil, + "confirmation_pending" => true, + "hide_favorites" => true, + "hide_followers" => false, + "hide_followers_count" => false, + "hide_follows" => false, + "hide_follows_count" => false, + "is_admin" => false, + "is_moderator" => false, + "skip_thread_containment" => false, + "chat_token" => + "SFMyNTY.g3QAAAACZAAEZGF0YW0AAAASOXRLaTNlc2JHN09RZ1oyOTIwZAAGc2lnbmVkbgYARNplS3EB.Mb_Iaqew2bN1I1o79B_iP7encmVCpTKC4OtHZRxdjKc", + "unread_conversation_count" => 0, + "tags" => [], + "notification_settings" => %{ + "followers" => true, + "follows" => true, + "non_followers" => true, + "non_follows" => true, + "privacy_option" => false + }, + "relationship" => %{ + "blocked_by" => false, + "blocking" => false, + "domain_blocking" => false, + "endorsed" => false, + "followed_by" => false, + "following" => false, + "id" => "9tKi3esbG7OQgZ2920", + "muting" => false, + "muting_notifications" => false, + "requested" => false, + "showing_reblogs" => true, + "subscribing" => false + }, + "settings_store" => %{ + "pleroma-fe" => %{} + } + }, + "source" => %{ + "fields" => [], + "note" => "foobar", + "pleroma" => %{ + "actor_type" => "Person", + "discoverable" => false, + "no_rich_text" => false, + "show_role" => true + }, + "privacy" => "public", + "sensitive" => false + }, + "statuses_count" => 0, + "url" => "https://mypleroma.com/users/foobar", + "username" => "foobar" + } + }) +end diff --git a/lib/pleroma/web/api_spec/schemas/account_field.ex b/lib/pleroma/web/api_spec/schemas/account_field.ex new file mode 100644 index 000000000..fa97073a0 --- /dev/null +++ b/lib/pleroma/web/api_spec/schemas/account_field.ex @@ -0,0 +1,26 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Schemas.AccountField do + alias OpenApiSpex.Schema + + require OpenApiSpex + + OpenApiSpex.schema(%{ + title: "AccountField", + description: "Response schema for account custom fields", + type: :object, + properties: %{ + name: %Schema{type: :string}, + value: %Schema{type: :string, format: :html}, + verified_at: %Schema{type: :string, format: :"date-time", nullable: true} + }, + example: %{ + "name" => "Website", + "value" => + "https://pleroma.com", + "verified_at" => "2019-08-29T04:14:55.571+00:00" + } + }) +end diff --git a/lib/pleroma/web/api_spec/schemas/account_relationship.ex b/lib/pleroma/web/api_spec/schemas/account_relationship.ex new file mode 100644 index 000000000..8b982669e --- /dev/null +++ b/lib/pleroma/web/api_spec/schemas/account_relationship.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.Schemas.AccountRelationship do + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.FlakeID + + require OpenApiSpex + + OpenApiSpex.schema(%{ + title: "AccountRelationship", + description: "Response schema for relationship", + type: :object, + properties: %{ + blocked_by: %Schema{type: :boolean}, + blocking: %Schema{type: :boolean}, + domain_blocking: %Schema{type: :boolean}, + endorsed: %Schema{type: :boolean}, + followed_by: %Schema{type: :boolean}, + following: %Schema{type: :boolean}, + id: FlakeID, + muting: %Schema{type: :boolean}, + muting_notifications: %Schema{type: :boolean}, + requested: %Schema{type: :boolean}, + showing_reblogs: %Schema{type: :boolean}, + subscribing: %Schema{type: :boolean} + }, + example: %{ + "blocked_by" => false, + "blocking" => false, + "domain_blocking" => false, + "endorsed" => false, + "followed_by" => false, + "following" => false, + "id" => "9tKi3esbG7OQgZ2920", + "muting" => false, + "muting_notifications" => false, + "requested" => false, + "showing_reblogs" => true, + "subscribing" => false + } + }) +end diff --git a/lib/pleroma/web/api_spec/schemas/actor_type.ex b/lib/pleroma/web/api_spec/schemas/actor_type.ex new file mode 100644 index 000000000..ac9b46678 --- /dev/null +++ b/lib/pleroma/web/api_spec/schemas/actor_type.ex @@ -0,0 +1,13 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Schemas.ActorType do + require OpenApiSpex + + OpenApiSpex.schema(%{ + title: "ActorType", + type: :string, + enum: ["Application", "Group", "Organization", "Person", "Service"] + }) +end diff --git a/lib/pleroma/web/api_spec/schemas/api_error.ex b/lib/pleroma/web/api_spec/schemas/api_error.ex new file mode 100644 index 000000000..5815df94c --- /dev/null +++ b/lib/pleroma/web/api_spec/schemas/api_error.ex @@ -0,0 +1,19 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Schemas.ApiError do + alias OpenApiSpex.Schema + + require OpenApiSpex + + OpenApiSpex.schema(%{ + title: "ApiError", + description: "Response schema for API error", + type: :object, + properties: %{error: %Schema{type: :string}}, + example: %{ + "error" => "Something went wrong" + } + }) +end diff --git a/lib/pleroma/web/api_spec/schemas/attachment.ex b/lib/pleroma/web/api_spec/schemas/attachment.ex new file mode 100644 index 000000000..c6edf6d36 --- /dev/null +++ b/lib/pleroma/web/api_spec/schemas/attachment.ex @@ -0,0 +1,68 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Schemas.Attachment do + alias OpenApiSpex.Schema + + require OpenApiSpex + + OpenApiSpex.schema(%{ + title: "Attachment", + description: "Represents a file or media attachment that can be added to a status.", + type: :object, + requried: [:id, :url, :preview_url], + properties: %{ + id: %Schema{type: :string, description: "The ID of the attachment in the database."}, + url: %Schema{ + type: :string, + format: :uri, + description: "The location of the original full-size attachment" + }, + remote_url: %Schema{ + type: :string, + format: :uri, + description: + "The location of the full-size original attachment on the remote website. String (URL), or null if the attachment is local", + nullable: true + }, + preview_url: %Schema{ + type: :string, + format: :uri, + description: "The location of a scaled-down preview of the attachment" + }, + text_url: %Schema{ + type: :string, + format: :uri, + description: "A shorter URL for the attachment" + }, + description: %Schema{ + type: :string, + nullable: true, + description: + "Alternate text that describes what is in the media attachment, to be used for the visually impaired or when media attachments do not load" + }, + type: %Schema{ + type: :string, + enum: ["image", "video", "audio", "unknown"], + description: "The type of the attachment" + }, + pleroma: %Schema{ + type: :object, + properties: %{ + mime_type: %Schema{type: :string, description: "mime type of the attachment"} + } + } + }, + example: %{ + id: "1638338801", + type: "image", + url: "someurl", + remote_url: "someurl", + preview_url: "someurl", + text_url: "someurl", + description: nil, + pleroma: %{mime_type: "image/png"} + } + }) +end diff --git a/lib/pleroma/web/api_spec/schemas/boolean_like.ex b/lib/pleroma/web/api_spec/schemas/boolean_like.ex new file mode 100644 index 000000000..f3bfb74da --- /dev/null +++ b/lib/pleroma/web/api_spec/schemas/boolean_like.ex @@ -0,0 +1,36 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Schemas.BooleanLike do + alias OpenApiSpex.Schema + + require OpenApiSpex + + OpenApiSpex.schema(%{ + title: "BooleanLike", + description: """ + The following values will be treated as `false`: + - false + - 0 + - "0", + - "f", + - "F", + - "false", + - "FALSE", + - "off", + - "OFF" + + All other non-null values will be treated as `true` + """, + anyOf: [ + %Schema{type: :boolean}, + %Schema{type: :string}, + %Schema{type: :integer} + ] + }) + + def after_cast(value, _schmea) do + {:ok, Pleroma.Web.ControllerHelper.truthy_param?(value)} + end +end diff --git a/lib/pleroma/web/api_spec/schemas/conversation.ex b/lib/pleroma/web/api_spec/schemas/conversation.ex new file mode 100644 index 000000000..d8ff5ba26 --- /dev/null +++ b/lib/pleroma/web/api_spec/schemas/conversation.ex @@ -0,0 +1,41 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Schemas.Conversation do + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.Account + alias Pleroma.Web.ApiSpec.Schemas.Status + + require OpenApiSpex + + OpenApiSpex.schema(%{ + title: "Conversation", + description: "Represents a conversation with \"direct message\" visibility.", + type: :object, + required: [:id, :accounts, :unread], + properties: %{ + id: %Schema{type: :string}, + accounts: %Schema{ + type: :array, + items: Account, + description: "Participants in the conversation" + }, + unread: %Schema{ + type: :boolean, + description: "Is the conversation currently marked as unread?" + }, + # last_status: Status + last_status: %Schema{ + allOf: [Status], + description: "The last status in the conversation, to be used for optional display" + } + }, + example: %{ + "id" => "418450", + "unread" => true, + "accounts" => [Account.schema().example], + "last_status" => Status.schema().example + } + }) +end diff --git a/lib/pleroma/web/api_spec/schemas/emoji.ex b/lib/pleroma/web/api_spec/schemas/emoji.ex new file mode 100644 index 000000000..26f35e648 --- /dev/null +++ b/lib/pleroma/web/api_spec/schemas/emoji.ex @@ -0,0 +1,29 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Schemas.Emoji do + alias OpenApiSpex.Schema + + require OpenApiSpex + + OpenApiSpex.schema(%{ + title: "Emoji", + description: "Response schema for an emoji", + type: :object, + properties: %{ + shortcode: %Schema{type: :string}, + url: %Schema{type: :string, format: :uri}, + static_url: %Schema{type: :string, format: :uri}, + visible_in_picker: %Schema{type: :boolean} + }, + example: %{ + "shortcode" => "fatyoshi", + "url" => + "https://files.mastodon.social/custom_emojis/images/000/023/920/original/e57ecb623faa0dc9.png", + "static_url" => + "https://files.mastodon.social/custom_emojis/images/000/023/920/static/e57ecb623faa0dc9.png", + "visible_in_picker" => true + } + }) +end diff --git a/lib/pleroma/web/api_spec/schemas/flake_id.ex b/lib/pleroma/web/api_spec/schemas/flake_id.ex new file mode 100644 index 000000000..3b5f6477a --- /dev/null +++ b/lib/pleroma/web/api_spec/schemas/flake_id.ex @@ -0,0 +1,14 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Schemas.FlakeID do + require OpenApiSpex + + OpenApiSpex.schema(%{ + title: "FlakeID", + description: + "Pleroma uses 128-bit ids as opposed to Mastodon's 64 bits. However just like Mastodon's ids they are lexically sortable strings", + type: :string + }) +end diff --git a/lib/pleroma/web/api_spec/schemas/list.ex b/lib/pleroma/web/api_spec/schemas/list.ex new file mode 100644 index 000000000..b7d1685c9 --- /dev/null +++ b/lib/pleroma/web/api_spec/schemas/list.ex @@ -0,0 +1,23 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Schemas.List do + alias OpenApiSpex.Schema + + require OpenApiSpex + + OpenApiSpex.schema(%{ + title: "List", + description: "Represents a list of users", + type: :object, + properties: %{ + id: %Schema{type: :string, description: "The internal database ID of the list"}, + title: %Schema{type: :string, description: "The user-defined title of the list"} + }, + example: %{ + "id" => "12249", + "title" => "Friends" + } + }) +end diff --git a/lib/pleroma/web/api_spec/schemas/poll.ex b/lib/pleroma/web/api_spec/schemas/poll.ex new file mode 100644 index 000000000..c62096db0 --- /dev/null +++ b/lib/pleroma/web/api_spec/schemas/poll.ex @@ -0,0 +1,82 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Schemas.Poll do + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.Emoji + alias Pleroma.Web.ApiSpec.Schemas.FlakeID + + require OpenApiSpex + + OpenApiSpex.schema(%{ + title: "Poll", + description: "Represents a poll attached to a status", + type: :object, + properties: %{ + id: FlakeID, + expires_at: %Schema{ + type: :string, + format: :"date-time", + nullable: true, + description: "When the poll ends" + }, + expired: %Schema{type: :boolean, description: "Is the poll currently expired?"}, + multiple: %Schema{ + type: :boolean, + description: "Does the poll allow multiple-choice answers?" + }, + votes_count: %Schema{ + type: :integer, + nullable: true, + description: "How many votes have been received. Number, or null if `multiple` is false." + }, + voted: %Schema{ + type: :boolean, + nullable: true, + description: + "When called with a user token, has the authorized user voted? Boolean, or null if no current user." + }, + emojis: %Schema{ + type: :array, + items: Emoji, + description: "Custom emoji to be used for rendering poll options." + }, + options: %Schema{ + type: :array, + items: %Schema{ + title: "PollOption", + type: :object, + properties: %{ + title: %Schema{type: :string}, + votes_count: %Schema{type: :integer} + } + }, + description: "Possible answers for the poll." + } + }, + example: %{ + id: "34830", + expires_at: "2019-12-05T04:05:08.302Z", + expired: true, + multiple: false, + votes_count: 10, + voters_count: nil, + voted: true, + own_votes: [ + 1 + ], + options: [ + %{ + title: "accept", + votes_count: 6 + }, + %{ + title: "deny", + votes_count: 4 + } + ], + emojis: [] + } + }) +end diff --git a/lib/pleroma/web/api_spec/schemas/push_subscription.ex b/lib/pleroma/web/api_spec/schemas/push_subscription.ex new file mode 100644 index 000000000..cc91b95b8 --- /dev/null +++ b/lib/pleroma/web/api_spec/schemas/push_subscription.ex @@ -0,0 +1,66 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Schemas.PushSubscription do + alias OpenApiSpex.Schema + + require OpenApiSpex + + OpenApiSpex.schema(%{ + title: "PushSubscription", + description: "Response schema for a push subscription", + type: :object, + properties: %{ + id: %Schema{ + anyOf: [%Schema{type: :string}, %Schema{type: :integer}], + description: "The id of the push subscription in the database." + }, + endpoint: %Schema{type: :string, description: "Where push alerts will be sent to."}, + server_key: %Schema{type: :string, description: "The streaming server's VAPID key."}, + alerts: %Schema{ + type: :object, + description: "Which alerts should be delivered to the endpoint.", + properties: %{ + follow: %Schema{ + type: :boolean, + description: "Receive a push notification when someone has followed you?" + }, + favourite: %Schema{ + type: :boolean, + description: + "Receive a push notification when a status you created has been favourited by someone else?" + }, + reblog: %Schema{ + type: :boolean, + description: + "Receive a push notification when a status you created has been boosted by someone else?" + }, + mention: %Schema{ + type: :boolean, + description: + "Receive a push notification when someone else has mentioned you in a status?" + }, + poll: %Schema{ + type: :boolean, + description: + "Receive a push notification when a poll you voted in or created has ended? " + } + } + } + }, + example: %{ + "id" => "328_183", + "endpoint" => "https://yourdomain.example/listener", + "alerts" => %{ + "follow" => true, + "favourite" => true, + "reblog" => true, + "mention" => true, + "poll" => true + }, + "server_key" => + "BCk-QqERU0q-CfYZjcuB6lnyyOYfJ2AifKqfeGIm7Z-HiTU5T9eTG5GxVA0_OH5mMlI4UkkDTpaZwozy0TzdZ2M=" + } + }) +end diff --git a/lib/pleroma/web/api_spec/schemas/scheduled_status.ex b/lib/pleroma/web/api_spec/schemas/scheduled_status.ex new file mode 100644 index 000000000..0520d0848 --- /dev/null +++ b/lib/pleroma/web/api_spec/schemas/scheduled_status.ex @@ -0,0 +1,54 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Schemas.ScheduledStatus do + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.Attachment + alias Pleroma.Web.ApiSpec.Schemas.Poll + alias Pleroma.Web.ApiSpec.Schemas.VisibilityScope + + require OpenApiSpex + + OpenApiSpex.schema(%{ + title: "ScheduledStatus", + description: "Represents a status that will be published at a future scheduled date.", + type: :object, + required: [:id, :scheduled_at, :params], + properties: %{ + id: %Schema{type: :string}, + scheduled_at: %Schema{type: :string, format: :"date-time"}, + media_attachments: %Schema{type: :array, items: Attachment}, + params: %Schema{ + type: :object, + required: [:text, :visibility], + properties: %{ + text: %Schema{type: :string, nullable: true}, + media_ids: %Schema{type: :array, nullable: true, items: %Schema{type: :string}}, + sensitive: %Schema{type: :boolean, nullable: true}, + spoiler_text: %Schema{type: :string, nullable: true}, + visibility: %Schema{type: VisibilityScope, nullable: true}, + scheduled_at: %Schema{type: :string, format: :"date-time", nullable: true}, + poll: %Schema{type: Poll, nullable: true}, + in_reply_to_id: %Schema{type: :string, nullable: true} + } + } + }, + example: %{ + id: "3221", + scheduled_at: "2019-12-05T12:33:01.000Z", + params: %{ + text: "test content", + media_ids: nil, + sensitive: nil, + spoiler_text: nil, + visibility: nil, + scheduled_at: nil, + poll: nil, + idempotency: nil, + in_reply_to_id: nil + }, + media_attachments: [Attachment.schema().example] + } + }) +end diff --git a/lib/pleroma/web/api_spec/schemas/status.ex b/lib/pleroma/web/api_spec/schemas/status.ex new file mode 100644 index 000000000..8b87cb25b --- /dev/null +++ b/lib/pleroma/web/api_spec/schemas/status.ex @@ -0,0 +1,325 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Schemas.Status do + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.Account + alias Pleroma.Web.ApiSpec.Schemas.Attachment + alias Pleroma.Web.ApiSpec.Schemas.Emoji + alias Pleroma.Web.ApiSpec.Schemas.FlakeID + alias Pleroma.Web.ApiSpec.Schemas.Poll + alias Pleroma.Web.ApiSpec.Schemas.Tag + alias Pleroma.Web.ApiSpec.Schemas.VisibilityScope + + require OpenApiSpex + + OpenApiSpex.schema(%{ + title: "Status", + description: "Response schema for a status", + type: :object, + properties: %{ + account: %Schema{allOf: [Account], description: "The account that authored this status"}, + application: %Schema{ + description: "The application used to post this status", + type: :object, + properties: %{ + name: %Schema{type: :string}, + website: %Schema{type: :string, nullable: true, format: :uri} + } + }, + bookmarked: %Schema{type: :boolean, description: "Have you bookmarked this status?"}, + card: %Schema{ + type: :object, + nullable: true, + description: "Preview card for links included within status content", + required: [:url, :title, :description, :type], + properties: %{ + type: %Schema{ + type: :string, + enum: ["link", "photo", "video", "rich"], + description: "The type of the preview card" + }, + provider_name: %Schema{ + type: :string, + nullable: true, + description: "The provider of the original resource" + }, + provider_url: %Schema{ + type: :string, + format: :uri, + description: "A link to the provider of the original resource" + }, + url: %Schema{type: :string, format: :uri, description: "Location of linked resource"}, + image: %Schema{ + type: :string, + nullable: true, + format: :uri, + description: "Preview thumbnail" + }, + title: %Schema{type: :string, description: "Title of linked resource"}, + description: %Schema{type: :string, description: "Description of preview"} + } + }, + content: %Schema{type: :string, format: :html, description: "HTML-encoded status content"}, + created_at: %Schema{ + type: :string, + format: "date-time", + description: "The date when this status was created" + }, + emojis: %Schema{ + type: :array, + items: Emoji, + description: "Custom emoji to be used when rendering status content" + }, + favourited: %Schema{type: :boolean, description: "Have you favourited this status?"}, + favourites_count: %Schema{ + type: :integer, + description: "How many favourites this status has received" + }, + id: FlakeID, + in_reply_to_account_id: %Schema{ + allOf: [FlakeID], + nullable: true, + description: "ID of the account being replied to" + }, + in_reply_to_id: %Schema{ + allOf: [FlakeID], + nullable: true, + description: "ID of the status being replied" + }, + language: %Schema{ + type: :string, + nullable: true, + description: "Primary language of this status" + }, + media_attachments: %Schema{ + type: :array, + items: Attachment, + description: "Media that is attached to this status" + }, + mentions: %Schema{ + type: :array, + description: "Mentions of users within the status content", + items: %Schema{ + type: :object, + properties: %{ + id: %Schema{allOf: [FlakeID], description: "The account id of the mentioned user"}, + acct: %Schema{ + type: :string, + description: + "The webfinger acct: URI of the mentioned user. Equivalent to `username` for local users, or `username@domain` for remote users." + }, + username: %Schema{type: :string, description: "The username of the mentioned user"}, + url: %Schema{ + type: :string, + format: :uri, + description: "The location of the mentioned user's profile" + } + } + } + }, + muted: %Schema{ + type: :boolean, + description: "Have you muted notifications for this status's conversation?" + }, + pinned: %Schema{ + type: :boolean, + description: "Have you pinned this status? Only appears if the status is pinnable." + }, + pleroma: %Schema{ + type: :object, + properties: %{ + content: %Schema{ + type: :object, + additionalProperties: %Schema{type: :string}, + description: + "A map consisting of alternate representations of the `content` property with the key being it's mimetype. Currently the only alternate representation supported is `text/plain`" + }, + conversation_id: %Schema{ + type: :integer, + description: "The ID of the AP context the status is associated with (if any)" + }, + direct_conversation_id: %Schema{ + type: :integer, + nullable: true, + description: + "The ID of the Mastodon direct message conversation the status is associated with (if any)" + }, + emoji_reactions: %Schema{ + type: :array, + description: + "A list with emoji / reaction maps. Contains no information about the reacting users, for that use the /statuses/:id/reactions endpoint.", + items: %Schema{ + type: :object, + properties: %{ + name: %Schema{type: :string}, + count: %Schema{type: :integer}, + me: %Schema{type: :boolean} + } + } + }, + expires_at: %Schema{ + type: :string, + format: "date-time", + nullable: true, + description: + "A datetime (ISO 8601) that states when the post will expire (be deleted automatically), or empty if the post won't expire" + }, + in_reply_to_account_acct: %Schema{ + type: :string, + nullable: true, + description: "The `acct` property of User entity for replied user (if any)" + }, + local: %Schema{ + type: :boolean, + description: "`true` if the post was made on the local instance" + }, + spoiler_text: %Schema{ + type: :object, + additionalProperties: %Schema{type: :string}, + description: + "A map consisting of alternate representations of the `spoiler_text` property with the key being it's mimetype. Currently the only alternate representation supported is `text/plain`." + }, + thread_muted: %Schema{ + type: :boolean, + description: "`true` if the thread the post belongs to is muted" + } + } + }, + poll: %Schema{allOf: [Poll], nullable: true, description: "The poll attached to the status"}, + reblog: %Schema{ + allOf: [%OpenApiSpex.Reference{"$ref": "#/components/schemas/Status"}], + nullable: true, + description: "The status being reblogged" + }, + reblogged: %Schema{type: :boolean, description: "Have you boosted this status?"}, + reblogs_count: %Schema{ + type: :integer, + description: "How many boosts this status has received" + }, + replies_count: %Schema{ + type: :integer, + description: "How many replies this status has received" + }, + sensitive: %Schema{ + type: :boolean, + description: "Is this status marked as sensitive content?" + }, + spoiler_text: %Schema{ + type: :string, + description: + "Subject or summary line, below which status content is collapsed until expanded" + }, + tags: %Schema{type: :array, items: Tag}, + uri: %Schema{ + type: :string, + format: :uri, + description: "URI of the status used for federation" + }, + url: %Schema{ + type: :string, + nullable: true, + format: :uri, + description: "A link to the status's HTML representation" + }, + visibility: %Schema{ + allOf: [VisibilityScope], + description: "Visibility of this status" + } + }, + example: %{ + "account" => %{ + "acct" => "nick6", + "avatar" => "http://localhost:4001/images/avi.png", + "avatar_static" => "http://localhost:4001/images/avi.png", + "bot" => false, + "created_at" => "2020-04-07T19:48:51.000Z", + "display_name" => "Test テスト User 6", + "emojis" => [], + "fields" => [], + "followers_count" => 1, + "following_count" => 0, + "header" => "http://localhost:4001/images/banner.png", + "header_static" => "http://localhost:4001/images/banner.png", + "id" => "9toJCsKN7SmSf3aj5c", + "locked" => false, + "note" => "Tester Number 6", + "pleroma" => %{ + "background_image" => nil, + "confirmation_pending" => false, + "hide_favorites" => true, + "hide_followers" => false, + "hide_followers_count" => false, + "hide_follows" => false, + "hide_follows_count" => false, + "is_admin" => false, + "is_moderator" => false, + "relationship" => %{ + "blocked_by" => false, + "blocking" => false, + "domain_blocking" => false, + "endorsed" => false, + "followed_by" => false, + "following" => true, + "id" => "9toJCsKN7SmSf3aj5c", + "muting" => false, + "muting_notifications" => false, + "requested" => false, + "showing_reblogs" => true, + "subscribing" => false + }, + "skip_thread_containment" => false, + "tags" => [] + }, + "source" => %{ + "fields" => [], + "note" => "Tester Number 6", + "pleroma" => %{"actor_type" => "Person", "discoverable" => false}, + "sensitive" => false + }, + "statuses_count" => 1, + "url" => "http://localhost:4001/users/nick6", + "username" => "nick6" + }, + "application" => %{"name" => "Web", "website" => nil}, + "bookmarked" => false, + "card" => nil, + "content" => "foobar", + "created_at" => "2020-04-07T19:48:51.000Z", + "emojis" => [], + "favourited" => false, + "favourites_count" => 0, + "id" => "9toJCu5YZW7O7gfvH6", + "in_reply_to_account_id" => nil, + "in_reply_to_id" => nil, + "language" => nil, + "media_attachments" => [], + "mentions" => [], + "muted" => false, + "pinned" => false, + "pleroma" => %{ + "content" => %{"text/plain" => "foobar"}, + "conversation_id" => 345_972, + "direct_conversation_id" => nil, + "emoji_reactions" => [], + "expires_at" => nil, + "in_reply_to_account_acct" => nil, + "local" => true, + "spoiler_text" => %{"text/plain" => ""}, + "thread_muted" => false + }, + "poll" => nil, + "reblog" => nil, + "reblogged" => false, + "reblogs_count" => 0, + "replies_count" => 0, + "sensitive" => false, + "spoiler_text" => "", + "tags" => [], + "uri" => "http://localhost:4001/objects/0f5dad44-0e9e-4610-b377-a2631e499190", + "url" => "http://localhost:4001/notice/9toJCu5YZW7O7gfvH6", + "visibility" => "private" + } + }) +end diff --git a/lib/pleroma/web/api_spec/schemas/tag.ex b/lib/pleroma/web/api_spec/schemas/tag.ex new file mode 100644 index 000000000..e693fb83e --- /dev/null +++ b/lib/pleroma/web/api_spec/schemas/tag.ex @@ -0,0 +1,27 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Schemas.Tag do + alias OpenApiSpex.Schema + + require OpenApiSpex + + OpenApiSpex.schema(%{ + title: "Tag", + description: "Represents a hashtag used within the content of a status", + type: :object, + properties: %{ + name: %Schema{type: :string, description: "The value of the hashtag after the # sign"}, + url: %Schema{ + type: :string, + format: :uri, + description: "A link to the hashtag on the instance" + } + }, + example: %{ + name: "cofe", + url: "https://lain.com/tag/cofe" + } + }) +end diff --git a/lib/pleroma/web/api_spec/schemas/visibility_scope.ex b/lib/pleroma/web/api_spec/schemas/visibility_scope.ex new file mode 100644 index 000000000..831734e27 --- /dev/null +++ b/lib/pleroma/web/api_spec/schemas/visibility_scope.ex @@ -0,0 +1,14 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Schemas.VisibilityScope do + require OpenApiSpex + + OpenApiSpex.schema(%{ + title: "VisibilityScope", + description: "Status visibility", + type: :string, + enum: ["public", "unlisted", "private", "direct", "list"] + }) +end diff --git a/lib/pleroma/web/auth/pleroma_authenticator.ex b/lib/pleroma/web/auth/pleroma_authenticator.ex index cb09664ce..200ca03dc 100644 --- a/lib/pleroma/web/auth/pleroma_authenticator.ex +++ b/lib/pleroma/web/auth/pleroma_authenticator.ex @@ -16,11 +16,12 @@ defmodule Pleroma.Web.Auth.PleromaAuthenticator do def get_user(%Plug.Conn{} = conn) do with {:ok, {name, password}} <- fetch_credentials(conn), {_, %User{} = user} <- {:user, fetch_user(name)}, - {_, true} <- {:checkpw, AuthenticationPlug.checkpw(password, user.password_hash)} do + {_, true} <- {:checkpw, AuthenticationPlug.checkpw(password, user.password_hash)}, + {:ok, user} <- AuthenticationPlug.maybe_update_password(user, password) do {:ok, user} else - error -> - {:error, error} + {:error, _reason} = error -> error + error -> {:error, error} end end diff --git a/lib/pleroma/web/auth/totp_authenticator.ex b/lib/pleroma/web/auth/totp_authenticator.ex new file mode 100644 index 000000000..1794e407c --- /dev/null +++ b/lib/pleroma/web/auth/totp_authenticator.ex @@ -0,0 +1,45 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.Auth.TOTPAuthenticator do + alias Pleroma.MFA + alias Pleroma.MFA.TOTP + alias Pleroma.Plugs.AuthenticationPlug + alias Pleroma.User + + @doc "Verify code or check backup code." + @spec verify(String.t(), User.t()) :: + {:ok, :pass} | {:error, :invalid_token | :invalid_secret_and_token} + def verify( + token, + %User{ + multi_factor_authentication_settings: + %{enabled: true, totp: %{secret: secret, confirmed: true}} = _ + } = _user + ) + when is_binary(token) and byte_size(token) > 0 do + TOTP.validate_token(secret, token) + end + + def verify(_, _), do: {:error, :invalid_token} + + @spec verify_recovery_code(User.t(), String.t()) :: + {:ok, :pass} | {:error, :invalid_token} + def verify_recovery_code( + %User{multi_factor_authentication_settings: %{enabled: true, backup_codes: codes}} = user, + code + ) + when is_list(codes) and is_binary(code) do + hash_code = Enum.find(codes, fn hash -> AuthenticationPlug.checkpw(code, hash) end) + + if hash_code do + MFA.invalidate_backup_code(user, hash_code) + {:ok, :pass} + else + {:error, :invalid_token} + end + end + + def verify_recovery_code(_, _), do: {:error, :invalid_token} +end diff --git a/lib/pleroma/web/chat_channel.ex b/lib/pleroma/web/chat_channel.ex index 38ec774f7..bce27897f 100644 --- a/lib/pleroma/web/chat_channel.ex +++ b/lib/pleroma/web/chat_channel.ex @@ -23,6 +23,7 @@ def handle_in("new_msg", %{"text" => text}, %{assigns: %{user_name: user_name}} if String.length(text) in 1..Pleroma.Config.get([:instance, :chat_limit]) do author = User.get_cached_by_nickname(user_name) author = Pleroma.Web.MastodonAPI.AccountView.render("show.json", user: author) + message = ChatChannelState.add_message(%{text: text, author: author}) broadcast!(socket, "new_msg", message) diff --git a/lib/pleroma/web/common_api/activity_draft.ex b/lib/pleroma/web/common_api/activity_draft.ex index c4356f93b..3f1a50b96 100644 --- a/lib/pleroma/web/common_api/activity_draft.ex +++ b/lib/pleroma/web/common_api/activity_draft.ex @@ -58,16 +58,16 @@ def create(user, params) do end defp put_params(draft, params) do - params = Map.put_new(params, "in_reply_to_status_id", params["in_reply_to_id"]) + params = Map.put_new(params, :in_reply_to_status_id, params[:in_reply_to_id]) %__MODULE__{draft | params: params} end - defp status(%{params: %{"status" => status}} = draft) do + defp status(%{params: %{status: status}} = draft) do %__MODULE__{draft | status: String.trim(status)} end defp summary(%{params: params} = draft) do - %__MODULE__{draft | summary: Map.get(params, "spoiler_text", "")} + %__MODULE__{draft | summary: Map.get(params, :spoiler_text, "")} end defp full_payload(%{status: status, summary: summary} = draft) do @@ -84,16 +84,20 @@ defp attachments(%{params: params} = draft) do %__MODULE__{draft | attachments: attachments} end - defp in_reply_to(draft) do - case Map.get(draft.params, "in_reply_to_status_id") do - "" -> draft - nil -> draft - id -> %__MODULE__{draft | in_reply_to: Activity.get_by_id(id)} - end + defp in_reply_to(%{params: %{in_reply_to_status_id: ""}} = draft), do: draft + + defp in_reply_to(%{params: %{in_reply_to_status_id: id}} = draft) when is_binary(id) do + %__MODULE__{draft | in_reply_to: Activity.get_by_id(id)} end + defp in_reply_to(%{params: %{in_reply_to_status_id: %Activity{} = in_reply_to}} = draft) do + %__MODULE__{draft | in_reply_to: in_reply_to} + end + + defp in_reply_to(draft), do: draft + defp in_reply_to_conversation(draft) do - in_reply_to_conversation = Participation.get(draft.params["in_reply_to_conversation_id"]) + in_reply_to_conversation = Participation.get(draft.params[:in_reply_to_conversation_id]) %__MODULE__{draft | in_reply_to_conversation: in_reply_to_conversation} end @@ -108,7 +112,7 @@ defp visibility(%{params: params} = draft) do end defp expires_at(draft) do - case CommonAPI.check_expiry_date(draft.params["expires_in"]) do + case CommonAPI.check_expiry_date(draft.params[:expires_in]) do {:ok, expires_at} -> %__MODULE__{draft | expires_at: expires_at} {:error, message} -> add_error(draft, message) end @@ -140,7 +144,7 @@ defp to_and_cc(draft) do addressed_users = draft.mentions |> Enum.map(fn {_, mentioned_user} -> mentioned_user.ap_id end) - |> Utils.get_addressed_users(draft.params["to"]) + |> Utils.get_addressed_users(draft.params[:to]) {to, cc} = Utils.get_to_and_cc( @@ -160,7 +164,7 @@ defp context(draft) do end defp sensitive(draft) do - sensitive = draft.params["sensitive"] || Enum.member?(draft.tags, {"#nsfw", "nsfw"}) + sensitive = draft.params[:sensitive] || Enum.member?(draft.tags, {"#nsfw", "nsfw"}) %__MODULE__{draft | sensitive: sensitive} end @@ -187,7 +191,7 @@ defp object(draft) do end defp preview?(draft) do - preview? = Pleroma.Web.ControllerHelper.truthy_param?(draft.params["preview"]) || false + preview? = Pleroma.Web.ControllerHelper.truthy_param?(draft.params[:preview]) %__MODULE__{draft | preview?: preview?} end diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex index 091011c6b..dbb3d7ade 100644 --- a/lib/pleroma/web/common_api/common_api.ex +++ b/lib/pleroma/web/common_api/common_api.ex @@ -7,11 +7,14 @@ defmodule Pleroma.Web.CommonAPI do alias Pleroma.ActivityExpiration alias Pleroma.Conversation.Participation alias Pleroma.FollowingRelationship + alias Pleroma.Notification alias Pleroma.Object alias Pleroma.ThreadMute alias Pleroma.User alias Pleroma.UserRelationship alias Pleroma.Web.ActivityPub.ActivityPub + alias Pleroma.Web.ActivityPub.Builder + alias Pleroma.Web.ActivityPub.Pipeline alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.ActivityPub.Visibility @@ -19,6 +22,26 @@ defmodule Pleroma.Web.CommonAPI do import Pleroma.Web.CommonAPI.Utils require Pleroma.Constants + require Logger + + def unblock(blocker, blocked) do + with {_, %Activity{} = block} <- {:fetch_block, Utils.fetch_latest_block(blocker, blocked)}, + {:ok, unblock_data, _} <- Builder.undo(blocker, block), + {:ok, unblock, _} <- Pipeline.common_pipeline(unblock_data, local: true) do + {:ok, unblock} + else + {:fetch_block, nil} -> + if User.blocks?(blocker, blocked) do + User.unblock(blocker, blocked) + {:ok, :no_activity} + else + {:error, :not_blocking} + end + + e -> + e + end + end def follow(follower, followed) do timeout = Pleroma.Config.get([:activitypub, :follow_handshake_timeout]) @@ -39,10 +62,10 @@ def unfollow(follower, unfollowed) do end def accept_follow_request(follower, followed) do - with {:ok, follower} <- User.follow(follower, followed), - %Activity{} = follow_activity <- Utils.fetch_latest_follow(follower, followed), + with %Activity{} = follow_activity <- Utils.fetch_latest_follow(follower, followed), + {:ok, follower} <- User.follow(follower, followed), {:ok, follow_activity} <- Utils.update_follow_state_for_all(follow_activity, "accept"), - {:ok, _relationship} <- FollowingRelationship.update(follower, followed, "accept"), + {:ok, _relationship} <- FollowingRelationship.update(follower, followed, :follow_accept), {:ok, _activity} <- ActivityPub.accept(%{ to: [follower.ap_id], @@ -57,7 +80,8 @@ def accept_follow_request(follower, followed) do def reject_follow_request(follower, followed) do with %Activity{} = follow_activity <- Utils.fetch_latest_follow(follower, followed), {:ok, follow_activity} <- Utils.update_follow_state_for_all(follow_activity, "reject"), - {:ok, _relationship} <- FollowingRelationship.update(follower, followed, "reject"), + {:ok, _relationship} <- FollowingRelationship.update(follower, followed, :follow_reject), + {:ok, _notifications} <- Notification.dismiss(follow_activity), {:ok, _activity} <- ActivityPub.reject(%{ to: [follower.ap_id], @@ -70,64 +94,125 @@ def reject_follow_request(follower, followed) do end def delete(activity_id, user) do - with {_, %Activity{data: %{"object" => _}} = activity} <- - {:find_activity, Activity.get_by_id_with_object(activity_id)}, - %Object{} = object <- Object.normalize(activity), + with {_, %Activity{data: %{"object" => _, "type" => "Create"}} = activity} <- + {:find_activity, Activity.get_by_id(activity_id)}, + {_, %Object{} = object, _} <- + {:find_object, Object.normalize(activity, false), activity}, true <- User.superuser?(user) || user.ap_id == object.data["actor"], - {:ok, _} <- unpin(activity_id, user), - {:ok, delete} <- ActivityPub.delete(object) do + {:ok, delete_data, _} <- Builder.delete(user, object.data["id"]), + {:ok, delete, _} <- Pipeline.common_pipeline(delete_data, local: true) do {:ok, delete} else - {:find_activity, _} -> {:error, :not_found} - _ -> {:error, dgettext("errors", "Could not delete")} + {:find_activity, _} -> + {:error, :not_found} + + {:find_object, nil, %Activity{data: %{"actor" => actor, "object" => object}}} -> + # We have the create activity, but not the object, it was probably pruned. + # Insert a tombstone and try again + with {:ok, tombstone_data, _} <- Builder.tombstone(actor, object), + {:ok, _tombstone} <- Object.create(tombstone_data) do + delete(activity_id, user) + else + _ -> + Logger.error( + "Could not insert tombstone for missing object on deletion. Object is #{object}." + ) + + {:error, dgettext("errors", "Could not delete")} + end + + _ -> + {:error, dgettext("errors", "Could not delete")} end end - def repeat(id_or_ap_id, user, params \\ %{}) do - with {_, %Activity{} = activity} <- {:find_activity, get_by_id_or_ap_id(id_or_ap_id)}, - object <- Object.normalize(activity), - announce_activity <- Utils.get_existing_announce(user.ap_id, object), - public <- public_announce?(object, params) do - if announce_activity do - {:ok, announce_activity, object} - else - ActivityPub.announce(user, object, nil, true, public) - end + def repeat(id, user, params \\ %{}) do + with %Activity{data: %{"type" => "Create"}} = activity <- Activity.get_by_id(id), + object = %Object{} <- Object.normalize(activity, false), + {_, nil} <- {:existing_announce, Utils.get_existing_announce(user.ap_id, object)}, + public = public_announce?(object, params), + {:ok, announce, _} <- Builder.announce(user, object, public: public), + {:ok, activity, _} <- Pipeline.common_pipeline(announce, local: true) do + {:ok, activity} else - {:find_activity, _} -> {:error, :not_found} - _ -> {:error, dgettext("errors", "Could not repeat")} + {:existing_announce, %Activity{} = announce} -> + {:ok, announce} + + _ -> + {:error, :not_found} end end - def unrepeat(id_or_ap_id, user) do - with {_, %Activity{} = activity} <- {:find_activity, get_by_id_or_ap_id(id_or_ap_id)} do - object = Object.normalize(activity) - ActivityPub.unannounce(user, object) + def unrepeat(id, user) do + with {_, %Activity{data: %{"type" => "Create"}} = activity} <- + {:find_activity, Activity.get_by_id(id)}, + %Object{} = note <- Object.normalize(activity, false), + %Activity{} = announce <- Utils.get_existing_announce(user.ap_id, note), + {:ok, undo, _} <- Builder.undo(user, announce), + {:ok, activity, _} <- Pipeline.common_pipeline(undo, local: true) do + {:ok, activity} else {:find_activity, _} -> {:error, :not_found} _ -> {:error, dgettext("errors", "Could not unrepeat")} end end - def favorite(id_or_ap_id, user) do - with {_, %Activity{} = activity} <- {:find_activity, get_by_id_or_ap_id(id_or_ap_id)}, - object <- Object.normalize(activity), - like_activity <- Utils.get_existing_like(user.ap_id, object) do - if like_activity do - {:ok, like_activity, object} - else - ActivityPub.like(user, object) - end - else - {:find_activity, _} -> {:error, :not_found} - _ -> {:error, dgettext("errors", "Could not favorite")} + @spec favorite(User.t(), binary()) :: {:ok, Activity.t() | :already_liked} | {:error, any()} + def favorite(%User{} = user, id) do + case favorite_helper(user, id) do + {:ok, _} = res -> + res + + {:error, :not_found} = res -> + res + + {:error, e} -> + Logger.error("Could not favorite #{id}. Error: #{inspect(e, pretty: true)}") + {:error, dgettext("errors", "Could not favorite")} end end - def unfavorite(id_or_ap_id, user) do - with {_, %Activity{} = activity} <- {:find_activity, get_by_id_or_ap_id(id_or_ap_id)} do - object = Object.normalize(activity) - ActivityPub.unlike(user, object) + def favorite_helper(user, id) do + with {_, %Activity{object: object}} <- {:find_object, Activity.get_by_id_with_object(id)}, + {_, {:ok, like_object, meta}} <- {:build_object, Builder.like(user, object)}, + {_, {:ok, %Activity{} = activity, _meta}} <- + {:common_pipeline, + Pipeline.common_pipeline(like_object, Keyword.put(meta, :local, true))} do + {:ok, activity} + else + {:find_object, _} -> + {:error, :not_found} + + {:common_pipeline, + { + :error, + { + :validate_object, + { + :error, + changeset + } + } + }} = e -> + if {:object, {"already liked by this actor", []}} in changeset.errors do + {:ok, :already_liked} + else + {:error, e} + end + + e -> + {:error, e} + end + end + + def unfavorite(id, user) do + with {_, %Activity{data: %{"type" => "Create"}} = activity} <- + {:find_activity, Activity.get_by_id(id)}, + %Object{} = note <- Object.normalize(activity, false), + %Activity{} = like <- Utils.get_existing_like(user.ap_id, note), + {:ok, undo, _} <- Builder.undo(user, like), + {:ok, activity, _} <- Pipeline.common_pipeline(undo, local: true) do + {:ok, activity} else {:find_activity, _} -> {:error, :not_found} _ -> {:error, dgettext("errors", "Could not unfavorite")} @@ -136,8 +221,10 @@ def unfavorite(id_or_ap_id, user) do def react_with_emoji(id, user, emoji) do with %Activity{} = activity <- Activity.get_by_id(id), - object <- Object.normalize(activity) do - ActivityPub.react_with_emoji(user, object, emoji) + object <- Object.normalize(activity), + {:ok, emoji_react, _} <- Builder.emoji_react(user, object, emoji), + {:ok, activity, _} <- Pipeline.common_pipeline(emoji_react, local: true) do + {:ok, activity} else _ -> {:error, dgettext("errors", "Could not add reaction emoji")} @@ -145,8 +232,10 @@ def react_with_emoji(id, user, emoji) do end def unreact_with_emoji(id, user, emoji) do - with %Activity{} = reaction_activity <- Utils.get_latest_reaction(id, user, emoji) do - ActivityPub.unreact_with_emoji(user, reaction_activity.data["id"]) + with %Activity{} = reaction_activity <- Utils.get_latest_reaction(id, user, emoji), + {:ok, undo, _} <- Builder.undo(user, reaction_activity), + {:ok, activity, _} <- Pipeline.common_pipeline(undo, local: true) do + {:ok, activity} else _ -> {:error, dgettext("errors", "Could not remove reaction emoji")} @@ -208,7 +297,7 @@ defp normalize_and_validate_choices(choices, object) do end end - def public_announce?(_, %{"visibility" => visibility}) + def public_announce?(_, %{visibility: visibility}) when visibility in ~w{public unlisted private direct}, do: visibility in ~w(public unlisted) @@ -218,11 +307,11 @@ def public_announce?(object, _) do def get_visibility(_, _, %Participation{}), do: {"direct", "direct"} - def get_visibility(%{"visibility" => visibility}, in_reply_to, _) + def get_visibility(%{visibility: visibility}, in_reply_to, _) when visibility in ~w{public unlisted private direct}, do: {visibility, get_replied_to_visibility(in_reply_to)} - def get_visibility(%{"visibility" => "list:" <> list_id}, in_reply_to, _) do + def get_visibility(%{visibility: "list:" <> list_id}, in_reply_to, _) do visibility = {:list, String.to_integer(list_id)} {visibility, get_replied_to_visibility(in_reply_to)} end @@ -259,11 +348,14 @@ def check_expiry_date(expiry_str) do |> check_expiry_date() end - def listen(user, %{"title" => _} = data) do - with visibility <- data["visibility"] || "public", - {to, cc} <- get_to_and_cc(user, [], nil, visibility, nil), + def listen(user, data) do + visibility = Map.get(data, :visibility, "public") + + with {to, cc} <- get_to_and_cc(user, [], nil, visibility, nil), listen_data <- - Map.take(data, ["album", "artist", "title", "length"]) + data + |> Map.take([:album, :artist, :title, :length]) + |> Map.new(fn {key, value} -> {to_string(key), value} end) |> Map.put("type", "Audio") |> Map.put("to", to) |> Map.put("cc", cc) @@ -280,7 +372,7 @@ def listen(user, %{"title" => _} = data) do end end - def post(user, %{"status" => _} = data) do + def post(user, %{status: _} = data) do with {:ok, draft} <- Pleroma.Web.CommonAPI.ActivityDraft.create(user, data) do draft.changes |> ActivityPub.create(draft.preview?) @@ -296,32 +388,12 @@ defp maybe_create_activity_expiration({:ok, activity}, %NaiveDateTime{} = expire defp maybe_create_activity_expiration(result, _), do: result - # Updates the emojis for a user based on their profile - def update(user) do - emoji = emoji_from_profile(user) - source_data = Map.put(user.source_data, "tag", emoji) - - user = - case User.update_source_data(user, source_data) do - {:ok, user} -> user - _ -> user - end - - ActivityPub.update(%{ - local: true, - to: [Pleroma.Constants.as_public(), user.follower_address], - cc: [], - actor: user.ap_id, - object: Pleroma.Web.ActivityPub.UserView.render("user.json", %{user: user}) - }) - end - - def pin(id_or_ap_id, %{ap_id: user_ap_id} = user) do + def pin(id, %{ap_id: user_ap_id} = user) do with %Activity{ actor: ^user_ap_id, data: %{"type" => "Create"}, object: %Object{data: %{"type" => object_type}} - } = activity <- get_by_id_or_ap_id(id_or_ap_id), + } = activity <- Activity.get_by_id_with_object(id), true <- object_type in ["Note", "Article", "Question"], true <- Visibility.is_public?(activity), {:ok, _user} <- User.add_pinnned_activity(user, activity) do @@ -332,8 +404,8 @@ def pin(id_or_ap_id, %{ap_id: user_ap_id} = user) do end end - def unpin(id_or_ap_id, user) do - with %Activity{} = activity <- get_by_id_or_ap_id(id_or_ap_id), + def unpin(id, user) do + with %Activity{data: %{"type" => "Create"}} = activity <- Activity.get_by_id(id), {:ok, _user} <- User.remove_pinnned_activity(user, activity) do {:ok, activity} else @@ -358,12 +430,12 @@ def remove_mute(user, activity) do def thread_muted?(%{id: nil} = _user, _activity), do: false def thread_muted?(user, activity) do - ThreadMute.check_muted(user.id, activity.data["context"]) != [] + ThreadMute.exists?(user.id, activity.data["context"]) end - def report(user, %{"account_id" => account_id} = data) do - with {:ok, account} <- get_reported_account(account_id), - {:ok, {content_html, _, _}} <- make_report_content_html(data["comment"]), + def report(user, data) do + with {:ok, account} <- get_reported_account(data.account_id), + {:ok, {content_html, _, _}} <- make_report_content_html(data[:comment]), {:ok, statuses} <- get_report_statuses(account, data) do ActivityPub.flag(%{ context: Utils.generate_context_id(), @@ -371,13 +443,11 @@ def report(user, %{"account_id" => account_id} = data) do account: account, statuses: statuses, content: content_html, - forward: data["forward"] || false + forward: Map.get(data, :forward, false) }) end end - def report(_user, _params), do: {:error, dgettext("errors", "Valid `account_id` required")} - defp get_reported_account(account_id) do case User.get_cached_by_id(account_id) do %User{} = account -> {:ok, account} @@ -411,11 +481,11 @@ def update_activity_scope(activity_id, opts \\ %{}) do end end - defp toggle_sensitive(activity, %{"sensitive" => sensitive}) when sensitive in ~w(true false) do - toggle_sensitive(activity, %{"sensitive" => String.to_existing_atom(sensitive)}) + defp toggle_sensitive(activity, %{sensitive: sensitive}) when sensitive in ~w(true false) do + toggle_sensitive(activity, %{sensitive: String.to_existing_atom(sensitive)}) end - defp toggle_sensitive(%Activity{object: object} = activity, %{"sensitive" => sensitive}) + defp toggle_sensitive(%Activity{object: object} = activity, %{sensitive: sensitive}) when is_boolean(sensitive) do new_data = Map.put(object.data, "sensitive", sensitive) @@ -429,7 +499,7 @@ defp toggle_sensitive(%Activity{object: object} = activity, %{"sensitive" => sen defp toggle_sensitive(activity, _), do: {:ok, activity} - defp set_visibility(activity, %{"visibility" => visibility}) do + defp set_visibility(activity, %{visibility: visibility}) do Utils.update_activity_visibility(activity, visibility) end diff --git a/lib/pleroma/web/common_api/utils.ex b/lib/pleroma/web/common_api/utils.ex index 635e7cd38..6ec489f9a 100644 --- a/lib/pleroma/web/common_api/utils.ex +++ b/lib/pleroma/web/common_api/utils.ex @@ -10,7 +10,6 @@ defmodule Pleroma.Web.CommonAPI.Utils do alias Pleroma.Activity alias Pleroma.Config alias Pleroma.Conversation.Participation - alias Pleroma.Emoji alias Pleroma.Formatter alias Pleroma.Object alias Pleroma.Plugs.AuthenticationPlug @@ -18,35 +17,16 @@ defmodule Pleroma.Web.CommonAPI.Utils do alias Pleroma.User alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.ActivityPub.Visibility - alias Pleroma.Web.Endpoint alias Pleroma.Web.MediaProxy require Logger require Pleroma.Constants - # This is a hack for twidere. - def get_by_id_or_ap_id(id) do - activity = - with true <- FlakeId.flake_id?(id), - %Activity{} = activity <- Activity.get_by_id_with_object(id) do - activity - else - _ -> Activity.get_create_by_object_ap_id_with_object(id) - end - - activity && - if activity.data["type"] == "Create" do - activity - else - Activity.get_create_by_object_ap_id_with_object(activity.data["object"]) - end - end - - def attachments_from_ids(%{"media_ids" => ids, "descriptions" => desc} = _) do + def attachments_from_ids(%{media_ids: ids, descriptions: desc}) do attachments_from_ids_descs(ids, desc) end - def attachments_from_ids(%{"media_ids" => ids} = _) do + def attachments_from_ids(%{media_ids: ids}) do attachments_from_ids_no_descs(ids) end @@ -57,11 +37,11 @@ def attachments_from_ids_no_descs([]), do: [] def attachments_from_ids_no_descs(ids) do Enum.map(ids, fn media_id -> case Repo.get(Object, media_id) do - %Object{data: data} = _ -> data + %Object{data: data} -> data _ -> nil end end) - |> Enum.filter(& &1) + |> Enum.reject(&is_nil/1) end def attachments_from_ids_descs([], _), do: [] @@ -71,14 +51,14 @@ def attachments_from_ids_descs(ids, descs_str) do Enum.map(ids, fn media_id -> case Repo.get(Object, media_id) do - %Object{data: data} = _ -> + %Object{data: data} -> Map.put(data, "name", descs[media_id]) _ -> nil end end) - |> Enum.filter(& &1) + |> Enum.reject(&is_nil/1) end @spec get_to_and_cc( @@ -122,7 +102,8 @@ def get_to_and_cc(user, mentioned_users, inReplyTo, "private", _) do end def get_to_and_cc(_user, mentioned_users, inReplyTo, "direct", _) do - if inReplyTo do + # If the OP is a DM already, add the implicit actor. + if inReplyTo && Visibility.is_direct?(inReplyTo) do {Enum.uniq([inReplyTo.data["actor"] | mentioned_users]), []} else {mentioned_users, []} @@ -160,7 +141,7 @@ def make_poll_data(%{"poll" => %{"expires_in" => expires_in}} = data) |> make_poll_data() end - def make_poll_data(%{"poll" => %{"options" => options, "expires_in" => expires_in}} = data) + def make_poll_data(%{poll: %{options: options, expires_in: expires_in}} = data) when is_list(options) do limits = Pleroma.Config.get([:instance, :poll_limits]) @@ -175,7 +156,7 @@ def make_poll_data(%{"poll" => %{"options" => options, "expires_in" => expires_i "replies" => %{"type" => "Collection", "totalItems" => 0} } - {note, Map.merge(emoji, Emoji.Formatter.get_emoji_map(option))} + {note, Map.merge(emoji, Pleroma.Emoji.Formatter.get_emoji_map(option))} end) end_time = @@ -183,7 +164,7 @@ def make_poll_data(%{"poll" => %{"options" => options, "expires_in" => expires_i |> DateTime.add(expires_in) |> DateTime.to_iso8601() - key = if truthy_param?(data["poll"]["multiple"]), do: "anyOf", else: "oneOf" + key = if truthy_param?(data.poll[:multiple]), do: "anyOf", else: "oneOf" poll = %{"type" => "Question", key => option_notes, "closed" => end_time} {:ok, {poll, emoji}} @@ -233,7 +214,7 @@ def make_content_html( |> Map.get("attachment_links", Config.get([:instance, :attachment_links])) |> truthy_param?() - content_type = get_content_type(data["content_type"]) + content_type = get_content_type(data[:content_type]) options = if visibility == "direct" && Config.get([:instance, :safe_dm_mentions]) do @@ -415,13 +396,16 @@ def to_masto_date(date) when is_binary(date) do def to_masto_date(_), do: "" defp shortname(name) do - if String.length(name) < 30 do - name + with max_length when max_length > 0 <- + Config.get([Pleroma.Upload, :filename_display_max_length], 30), + true <- String.length(name) > max_length do + String.slice(name, 0..max_length) <> "…" else - String.slice(name, 0..30) <> "…" + _ -> name end end + @spec confirm_current_password(User.t(), String.t()) :: {:ok, User.t()} | {:error, String.t()} def confirm_current_password(user, password) do with %User{local: true} = db_user <- User.get_cached_by_id(user.id), true <- AuthenticationPlug.checkpw(password, db_user.password_hash) do @@ -431,19 +415,6 @@ def confirm_current_password(user, password) do end end - def emoji_from_profile(%User{bio: bio, name: name}) do - [bio, name] - |> Enum.map(&Emoji.Formatter.get_emoji/1) - |> Enum.concat() - |> Enum.map(fn {shortcode, %Emoji{file: path}} -> - %{ - "type" => "Emoji", - "icon" => %{"type" => "Image", "url" => "#{Endpoint.url()}#{path}"}, - "name" => ":#{shortcode}:" - } - end) - end - def maybe_notify_to_recipients( recipients, %Activity{data: %{"to" => to, "type" => _type}} = _activity @@ -499,6 +470,8 @@ def maybe_notify_subscribers( |> Enum.map(& &1.ap_id) recipients ++ subscriber_ids + else + _e -> recipients end end @@ -510,6 +483,8 @@ def maybe_notify_followers(recipients, %Activity{data: %{"type" => "Move"}} = ac |> User.get_followers() |> Enum.map(& &1.ap_id) |> Enum.concat(recipients) + else + _e -> recipients end end @@ -537,7 +512,8 @@ def make_report_content_html(comment) do end end - def get_report_statuses(%User{ap_id: actor}, %{"status_ids" => status_ids}) do + def get_report_statuses(%User{ap_id: actor}, %{status_ids: status_ids}) + when is_list(status_ids) do {:ok, Activity.all_by_actor_and_id(actor, status_ids)} end diff --git a/lib/pleroma/web/controller_helper.ex b/lib/pleroma/web/controller_helper.ex index ad293cda9..5a1316a5f 100644 --- a/lib/pleroma/web/controller_helper.ex +++ b/lib/pleroma/web/controller_helper.ex @@ -5,10 +5,16 @@ defmodule Pleroma.Web.ControllerHelper do use Pleroma.Web, :controller - # As in MastoAPI, per https://api.rubyonrails.org/classes/ActiveModel/Type/Boolean.html + # As in Mastodon API, per https://api.rubyonrails.org/classes/ActiveModel/Type/Boolean.html @falsy_param_values [false, 0, "0", "f", "F", "false", "False", "FALSE", "off", "OFF"] - def truthy_param?(blank_value) when blank_value in [nil, ""], do: nil - def truthy_param?(value), do: value not in @falsy_param_values + + def explicitly_falsy_param?(value), do: value in @falsy_param_values + + # Note: `nil` and `""` are considered falsy values in Pleroma + def falsy_param?(value), + do: explicitly_falsy_param?(value) or value in [nil, ""] + + def truthy_param?(value), do: not falsy_param?(value) def json_response(conn, status, json) do conn @@ -34,7 +40,12 @@ defp param_to_integer(val, default) when is_binary(val) do defp param_to_integer(_, default), do: default - def add_link_headers(conn, activities, extra_params \\ %{}) do + def add_link_headers(conn, activities, extra_params \\ %{}) + + def add_link_headers(%{assigns: %{skip_link_headers: true}} = conn, _activities, _extra_params), + do: conn + + def add_link_headers(conn, activities, extra_params) do case List.last(activities) do %{id: max_id} -> params = @@ -69,8 +80,9 @@ def add_link_headers(conn, activities, extra_params \\ %{}) do end end - def assign_account_by_id(%{params: %{"id" => id}} = conn, _) do - case Pleroma.User.get_cached_by_id(id) do + def assign_account_by_id(conn, _) do + # TODO: use `conn.params[:id]` only after moving to OpenAPI + case Pleroma.User.get_cached_by_id(conn.params[:id] || conn.params["id"]) do %Pleroma.User{} = account -> assign(conn, :account, account) nil -> Pleroma.Web.MastodonAPI.FallbackController.call(conn, {:error, :not_found}) |> halt() end @@ -91,4 +103,17 @@ def try_render(conn, _, _) do def put_if_exist(map, _key, nil), do: map def put_if_exist(map, key, value), do: Map.put(map, key, value) + + @doc """ + Returns true if request specifies to include embedded relationships in account objects. + May only be used in selected account-related endpoints; has no effect for status- or + notification-related endpoints. + """ + # Intended for PleromaFE: https://git.pleroma.social/pleroma/pleroma-fe/-/issues/838 + def embed_relationships?(params) do + # To do once OpenAPI transition mess is over: just `truthy_param?(params[:with_relationships])` + params + |> Map.get(:with_relationships, params["with_relationships"]) + |> truthy_param?() + end end diff --git a/lib/pleroma/web/endpoint.ex b/lib/pleroma/web/endpoint.ex index 4f665db12..226d42c2c 100644 --- a/lib/pleroma/web/endpoint.ex +++ b/lib/pleroma/web/endpoint.ex @@ -5,6 +5,8 @@ defmodule Pleroma.Web.Endpoint do use Phoenix.Endpoint, otp_app: :pleroma + require Pleroma.Constants + socket("/socket", Pleroma.Web.UserSocket) plug(Pleroma.Plugs.SetLocalePlug) @@ -34,8 +36,7 @@ defmodule Pleroma.Web.Endpoint do Plug.Static, at: "/", from: :pleroma, - only: - ~w(index.html robots.txt static finmoji emoji packs sounds images instance sw.js sw-pleroma.js favicon.png schemas doc embed.js embed.css), + only: Pleroma.Constants.static_only_files(), # credo:disable-for-previous-line Credo.Check.Readability.MaxLineLength gzip: true, cache_control_for_etags: @static_cache_control, diff --git a/lib/pleroma/web/fallback_redirect_controller.ex b/lib/pleroma/web/fallback_redirect_controller.ex index c13518030..0d9d578fc 100644 --- a/lib/pleroma/web/fallback_redirect_controller.ex +++ b/lib/pleroma/web/fallback_redirect_controller.ex @@ -4,7 +4,9 @@ defmodule Fallback.RedirectController do use Pleroma.Web, :controller + require Logger + alias Pleroma.User alias Pleroma.Web.Metadata diff --git a/lib/pleroma/web/federator/federator.ex b/lib/pleroma/web/federator/federator.ex index fd904ef0a..f5803578d 100644 --- a/lib/pleroma/web/federator/federator.ex +++ b/lib/pleroma/web/federator/federator.ex @@ -72,19 +72,24 @@ def perform(:incoming_ap_doc, params) do # actor shouldn't be acting on objects outside their own AP server. with {:ok, _user} <- ap_enabled_actor(params["actor"]), nil <- Activity.normalize(params["id"]), - :ok <- Containment.contain_origin_from_id(params["actor"], params), + {_, :ok} <- + {:correct_origin?, Containment.contain_origin_from_id(params["actor"], params)}, {:ok, activity} <- Transmogrifier.handle_incoming(params) do {:ok, activity} else + {:correct_origin?, _} -> + Logger.debug("Origin containment failure for #{params["id"]}") + {:error, :origin_containment_failed} + %Activity{} -> Logger.debug("Already had #{params["id"]}") - :error + {:error, :already_present} - _e -> + e -> # Just drop those for now Logger.debug("Unhandled activity") Logger.debug(Jason.encode!(params, pretty: true)) - :error + {:error, e} end end diff --git a/lib/pleroma/web/feed/feed_view.ex b/lib/pleroma/web/feed/feed_view.ex index e18adaea8..1ae03e7e2 100644 --- a/lib/pleroma/web/feed/feed_view.ex +++ b/lib/pleroma/web/feed/feed_view.ex @@ -23,7 +23,7 @@ def pub_date(date) when is_binary(date) do def pub_date(%DateTime{} = date), do: Timex.format!(date, "{RFC822}") def prepare_activity(activity, opts \\ []) do - object = activity_object(activity) + object = Object.normalize(activity) actor = if opts[:actor] do @@ -33,7 +33,6 @@ def prepare_activity(activity, opts \\ []) do %{ activity: activity, data: Map.get(object, :data), - object: object, actor: actor } end @@ -68,9 +67,7 @@ def logo(user) do def last_activity(activities), do: List.last(activities) - def activity_object(activity), do: Object.normalize(activity) - - def activity_title(%{data: %{"content" => content}}, opts \\ %{}) do + def activity_title(%{"content" => content}, opts \\ %{}) do content |> Pleroma.Web.Metadata.Utils.scrub_html() |> Pleroma.Emoji.Formatter.demojify() @@ -78,7 +75,7 @@ def activity_title(%{data: %{"content" => content}}, opts \\ %{}) do |> escape() end - def activity_content(%{data: %{"content" => content}}) do + def activity_content(%{"content" => content}) do content |> String.replace(~r/[\n\r]/, "") |> escape() diff --git a/lib/pleroma/web/feed/user_controller.ex b/lib/pleroma/web/feed/user_controller.ex index e27f85929..5a6fc9de0 100644 --- a/lib/pleroma/web/feed/user_controller.ex +++ b/lib/pleroma/web/feed/user_controller.ex @@ -27,7 +27,7 @@ def feed_redirect(%{assigns: %{format: format}} = conn, _params) when format in ["json", "activity+json"] do with %{halted: false} = conn <- Pleroma.Plugs.EnsureAuthenticatedPlug.call(conn, - unless_func: &Pleroma.Web.FederatingPlug.federating?/0 + unless_func: &Pleroma.Web.FederatingPlug.federating?/1 ) do ActivityPubController.call(conn, :user) end @@ -56,7 +56,7 @@ def feed(conn, %{"nickname" => nickname} = params) do "actor_id" => user.ap_id } |> put_if_exist("max_id", params["max_id"]) - |> ActivityPub.fetch_public_activities() + |> ActivityPub.fetch_public_or_unlisted_activities() conn |> put_resp_content_type("application/#{format}+xml") diff --git a/lib/pleroma/web/masto_fe_controller.ex b/lib/pleroma/web/masto_fe_controller.ex index 43649ad26..d0d8bc8eb 100644 --- a/lib/pleroma/web/masto_fe_controller.ex +++ b/lib/pleroma/web/masto_fe_controller.ex @@ -5,19 +5,25 @@ defmodule Pleroma.Web.MastoFEController do use Pleroma.Web, :controller + alias Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug alias Pleroma.Plugs.OAuthScopesPlug alias Pleroma.User plug(OAuthScopesPlug, %{scopes: ["write:accounts"]} when action == :put_settings) # Note: :index action handles attempt of unauthenticated access to private instance with redirect + plug(:skip_plug, EnsurePublicOrAuthenticatedPlug when action == :index) + plug( OAuthScopesPlug, - %{scopes: ["read"], fallback: :proceed_unauthenticated, skip_instance_privacy_check: true} + %{scopes: ["read"], fallback: :proceed_unauthenticated} when action == :index ) - plug(Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug when action != :index) + plug( + :skip_plug, + [OAuthScopesPlug, EnsurePublicOrAuthenticatedPlug] when action == :manifest + ) @doc "GET /web/*path" def index(%{assigns: %{user: user, token: token}} = conn, _params) diff --git a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex index 6dbf11ac9..47649d41d 100644 --- a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex @@ -6,9 +6,15 @@ defmodule Pleroma.Web.MastodonAPI.AccountController do use Pleroma.Web, :controller import Pleroma.Web.ControllerHelper, - only: [add_link_headers: 2, truthy_param?: 1, assign_account_by_id: 2, json_response: 3] + only: [ + add_link_headers: 2, + truthy_param?: 1, + assign_account_by_id: 2, + embed_relationships?: 1, + json_response: 3 + ] - alias Pleroma.Emoji + alias Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug alias Pleroma.Plugs.OAuthScopesPlug alias Pleroma.Plugs.RateLimiter alias Pleroma.User @@ -16,20 +22,33 @@ defmodule Pleroma.Web.MastodonAPI.AccountController do alias Pleroma.Web.CommonAPI alias Pleroma.Web.MastodonAPI.ListView alias Pleroma.Web.MastodonAPI.MastodonAPI + alias Pleroma.Web.MastodonAPI.MastodonAPIController alias Pleroma.Web.MastodonAPI.StatusView alias Pleroma.Web.OAuth.Token alias Pleroma.Web.TwitterAPI.TwitterAPI + plug(Pleroma.Web.ApiSpec.CastAndValidate) + + plug(:skip_plug, [OAuthScopesPlug, EnsurePublicOrAuthenticatedPlug] when action == :create) + + plug(:skip_plug, EnsurePublicOrAuthenticatedPlug when action in [:show, :statuses]) + plug( OAuthScopesPlug, %{fallback: :proceed_unauthenticated, scopes: ["read:accounts"]} - when action == :show + when action in [:show, :followers, :following] + ) + + plug( + OAuthScopesPlug, + %{fallback: :proceed_unauthenticated, scopes: ["read:statuses"]} + when action == :statuses ) plug( OAuthScopesPlug, %{scopes: ["read:accounts"]} - when action in [:endorsements, :verify_credentials, :followers, :following] + when action in [:verify_credentials, :endorsements, :identity_proofs] ) plug(OAuthScopesPlug, %{scopes: ["write:accounts"]} when action == :update_credentials) @@ -48,52 +67,35 @@ defmodule Pleroma.Web.MastodonAPI.AccountController do plug(OAuthScopesPlug, %{scopes: ["read:follows"]} when action == :relationships) - # Note: :follows (POST /api/v1/follows) is the same as :follow, consider removing :follows plug( OAuthScopesPlug, - %{scopes: ["follow", "write:follows"]} when action in [:follows, :follow, :unfollow] + %{scopes: ["follow", "write:follows"]} when action in [:follow_by_uri, :follow, :unfollow] ) plug(OAuthScopesPlug, %{scopes: ["follow", "read:mutes"]} when action == :mutes) plug(OAuthScopesPlug, %{scopes: ["follow", "write:mutes"]} when action in [:mute, :unmute]) - plug( - Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug - when action not in [:create, :show, :statuses] - ) - - @relations [:follow, :unfollow] + @relationship_actions [:follow, :unfollow] @needs_account ~W(followers following lists follow unfollow mute unmute block unblock)a - plug(RateLimiter, [name: :relations_id_action, params: ["id", "uri"]] when action in @relations) - plug(RateLimiter, [name: :relations_actions] when action in @relations) + plug( + RateLimiter, + [name: :relation_id_action, params: [:id, :uri]] when action in @relationship_actions + ) + + plug(RateLimiter, [name: :relations_actions] when action in @relationship_actions) plug(RateLimiter, [name: :app_account_creation] when action == :create) plug(:assign_account_by_id when action in @needs_account) action_fallback(Pleroma.Web.MastodonAPI.FallbackController) - @doc "POST /api/v1/accounts" - def create( - %{assigns: %{app: app}} = conn, - %{"username" => nickname, "password" => _, "agreement" => true} = params - ) do - params = - params - |> Map.take([ - "email", - "captcha_solution", - "captcha_token", - "captcha_answer_data", - "token", - "password" - ]) - |> Map.put("nickname", nickname) - |> Map.put("fullname", params["fullname"] || nickname) - |> Map.put("bio", params["bio"] || "") - |> Map.put("confirm", params["password"]) + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.AccountOperation + @doc "POST /api/v1/accounts" + def create(%{assigns: %{app: app}, body_params: params} = conn, _params) do with :ok <- validate_email_param(params), + :ok <- TwitterAPI.validate_captcha(app, params), {:ok, user} <- TwitterAPI.register_user(params, need_confirmation: true), {:ok, token} <- Token.create_token(app, user, %{scopes: app.scopes}) do json(conn, %{ @@ -103,7 +105,7 @@ def create( created_at: Token.Utils.format_created_at(token) }) else - {:error, errors} -> json_response(conn, :bad_request, errors) + {:error, error} -> json_response(conn, :bad_request, %{error: error}) end end @@ -115,11 +117,11 @@ def create(conn, _) do render_error(conn, :forbidden, "Invalid credentials") end - defp validate_email_param(%{"email" => _}), do: :ok + defp validate_email_param(%{email: email}) when not is_nil(email), do: :ok defp validate_email_param(_) do case Pleroma.Config.get([:instance, :account_activation_required]) do - true -> {:error, %{"error" => "Missing parameters"}} + true -> {:error, dgettext("errors", "Missing parameter: %{name}", name: "email")} _ -> :ok end end @@ -137,19 +139,13 @@ def verify_credentials(%{assigns: %{user: user}} = conn, _) do end @doc "PATCH /api/v1/accounts/update_credentials" - def update_credentials(%{assigns: %{user: original_user}} = conn, params) do + def update_credentials(%{assigns: %{user: original_user}, body_params: params} = conn, _params) do user = original_user params = - if Map.has_key?(params, "fields_attributes") do - Map.update!(params, "fields_attributes", fn fields -> - fields - |> normalize_fields_attributes() - |> Enum.filter(fn %{"name" => n} -> n != "" end) - end) - else - params - end + params + |> Enum.filter(fn {_, value} -> not is_nil(value) end) + |> Enum.into(%{}) user_params = [ @@ -166,54 +162,27 @@ def update_credentials(%{assigns: %{user: original_user}} = conn, params) do :discoverable ] |> Enum.reduce(%{}, fn key, acc -> - add_if_present(acc, params, to_string(key), key, &{:ok, truthy_param?(&1)}) + add_if_present(acc, params, key, key, &{:ok, truthy_param?(&1)}) end) - |> add_if_present(params, "display_name", :name) - |> add_if_present(params, "note", :bio, fn value -> {:ok, User.parse_bio(value, user)} end) - |> add_if_present(params, "avatar", :avatar, fn value -> - with %Plug.Upload{} <- value, - {:ok, object} <- ActivityPub.upload(value, type: :avatar) do - {:ok, object.data} - end - end) - |> add_if_present(params, "header", :banner, fn value -> - with %Plug.Upload{} <- value, - {:ok, object} <- ActivityPub.upload(value, type: :banner) do - {:ok, object.data} - end - end) - |> add_if_present(params, "pleroma_background_image", :background, fn value -> - with %Plug.Upload{} <- value, - {:ok, object} <- ActivityPub.upload(value, type: :background) do - {:ok, object.data} - end - end) - |> add_if_present(params, "fields_attributes", :fields, fn fields -> - fields = Enum.map(fields, fn f -> Map.update!(f, "value", &AutoLinker.link(&1)) end) + |> add_if_present(params, :display_name, :name) + |> add_if_present(params, :note, :bio) + |> add_if_present(params, :avatar, :avatar) + |> add_if_present(params, :header, :banner) + |> add_if_present(params, :pleroma_background_image, :background) + |> add_if_present( + params, + :fields_attributes, + :raw_fields, + &{:ok, normalize_fields_attributes(&1)} + ) + |> add_if_present(params, :pleroma_settings_store, :pleroma_settings_store) + |> add_if_present(params, :default_scope, :default_scope) + |> add_if_present(params["source"], "privacy", :default_scope) + |> add_if_present(params, :actor_type, :actor_type) - {:ok, fields} - end) - |> add_if_present(params, "fields_attributes", :raw_fields) - |> add_if_present(params, "pleroma_settings_store", :pleroma_settings_store, fn value -> - {:ok, Map.merge(user.pleroma_settings_store, value)} - end) - |> add_if_present(params, "default_scope", :default_scope) - |> add_if_present(params, "actor_type", :actor_type) - - emojis_text = (user_params["display_name"] || "") <> (user_params["note"] || "") - - user_emojis = - user - |> Map.get(:emoji, []) - |> Enum.concat(Emoji.Formatter.get_emoji_map(emojis_text)) - |> Enum.dedup() - - user_params = Map.put(user_params, :emoji, user_emojis) changeset = User.update_changeset(user, user_params) with {:ok, user} <- User.update_and_set_cache(changeset) do - if original_user != user, do: CommonAPI.update(user) - render(conn, "show.json", user: user, for: user, with_pleroma_settings: true) else _e -> render_error(conn, :forbidden, "Invalid request") @@ -221,8 +190,9 @@ def update_credentials(%{assigns: %{user: original_user}} = conn, params) do end defp add_if_present(map, params, params_field, map_field, value_function \\ &{:ok, &1}) do - with true <- Map.has_key?(params, params_field), - {:ok, new_value} <- value_function.(params[params_field]) do + with true <- is_map(params), + true <- Map.has_key?(params, params_field), + {:ok, new_value} <- value_function.(Map.get(params, params_field)) do Map.put(map, map_field, new_value) else _ -> map @@ -233,12 +203,15 @@ defp normalize_fields_attributes(fields) do if Enum.all?(fields, &is_tuple/1) do Enum.map(fields, fn {_, v} -> v end) else - fields + Enum.map(fields, fn + %{} = field -> %{"name" => field.name, "value" => field.value} + field -> field + end) end end @doc "GET /api/v1/accounts/relationships" - def relationships(%{assigns: %{user: user}} = conn, %{"id" => id}) do + def relationships(%{assigns: %{user: user}} = conn, %{id: id}) do targets = User.get_all_by_ids(List.wrap(id)) render(conn, "relationships.json", user: user, targets: targets) @@ -248,7 +221,7 @@ def relationships(%{assigns: %{user: user}} = conn, %{"id" => id}) do def relationships(%{assigns: %{user: _user}} = conn, _), do: json(conn, []) @doc "GET /api/v1/accounts/:id" - def show(%{assigns: %{user: for_user}} = conn, %{"id" => nickname_or_id}) do + def show(%{assigns: %{user: for_user}} = conn, %{id: nickname_or_id}) do with %User{} = user <- User.get_cached_by_nickname_or_id(nickname_or_id, for: for_user), true <- User.visible_for?(user, for_user) do render(conn, "show.json", user: user, for: for_user) @@ -259,19 +232,25 @@ def show(%{assigns: %{user: for_user}} = conn, %{"id" => nickname_or_id}) do @doc "GET /api/v1/accounts/:id/statuses" def statuses(%{assigns: %{user: reading_user}} = conn, params) do - with %User{} = user <- User.get_cached_by_nickname_or_id(params["id"], for: reading_user), + with %User{} = user <- User.get_cached_by_nickname_or_id(params.id, for: reading_user), true <- User.visible_for?(user, reading_user) do params = params - |> Map.put("tag", params["tagged"]) - |> Map.delete("godmode") + |> Map.delete(:tagged) + |> Enum.filter(&(not is_nil(&1))) + |> Map.new(fn {key, value} -> {to_string(key), value} end) + |> Map.put("tag", params[:tagged]) activities = ActivityPub.fetch_user_activities(user, reading_user, params) conn |> add_link_headers(activities) |> put_view(StatusView) - |> render("index.json", activities: activities, for: reading_user, as: :activity) + |> render("index.json", + activities: activities, + for: reading_user, + as: :activity + ) else _e -> render_error(conn, :not_found, "Can't find user") end @@ -279,6 +258,11 @@ def statuses(%{assigns: %{user: reading_user}} = conn, params) do @doc "GET /api/v1/accounts/:id/followers" def followers(%{assigns: %{user: for_user, account: user}} = conn, params) do + params = + params + |> Enum.map(fn {key, value} -> {to_string(key), value} end) + |> Enum.into(%{}) + followers = cond do for_user && user.id == for_user.id -> MastodonAPI.get_followers(user, params) @@ -288,11 +272,22 @@ def followers(%{assigns: %{user: for_user, account: user}} = conn, params) do conn |> add_link_headers(followers) - |> render("index.json", for: for_user, users: followers, as: :user) + # https://git.pleroma.social/pleroma/pleroma-fe/-/issues/838#note_59223 + |> render("index.json", + for: for_user, + users: followers, + as: :user, + embed_relationships: embed_relationships?(params) + ) end @doc "GET /api/v1/accounts/:id/following" def following(%{assigns: %{user: for_user, account: user}} = conn, params) do + params = + params + |> Enum.map(fn {key, value} -> {to_string(key), value} end) + |> Enum.into(%{}) + followers = cond do for_user && user.id == for_user.id -> MastodonAPI.get_friends(user, params) @@ -302,7 +297,13 @@ def following(%{assigns: %{user: for_user, account: user}} = conn, params) do conn |> add_link_headers(followers) - |> render("index.json", for: for_user, users: followers, as: :user) + # https://git.pleroma.social/pleroma/pleroma-fe/-/issues/838#note_59223 + |> render("index.json", + for: for_user, + users: followers, + as: :user, + embed_relationships: embed_relationships?(params) + ) end @doc "GET /api/v1/accounts/:id/lists" @@ -316,11 +317,11 @@ def lists(%{assigns: %{user: user, account: account}} = conn, _params) do @doc "POST /api/v1/accounts/:id/follow" def follow(%{assigns: %{user: %{id: id}, account: %{id: id}}}, _params) do - {:error, :not_found} + {:error, "Can not follow yourself"} end - def follow(%{assigns: %{user: follower, account: followed}} = conn, _params) do - with {:ok, follower} <- MastodonAPI.follow(follower, followed, conn.params) do + def follow(%{assigns: %{user: follower, account: followed}} = conn, params) do + with {:ok, follower} <- MastodonAPI.follow(follower, followed, params) do render(conn, "relationship.json", user: follower, target: followed) else {:error, message} -> json_response(conn, :forbidden, %{error: message}) @@ -329,7 +330,7 @@ def follow(%{assigns: %{user: follower, account: followed}} = conn, _params) do @doc "POST /api/v1/accounts/:id/unfollow" def unfollow(%{assigns: %{user: %{id: id}, account: %{id: id}}}, _params) do - {:error, :not_found} + {:error, "Can not unfollow yourself"} end def unfollow(%{assigns: %{user: follower, account: followed}} = conn, _params) do @@ -339,10 +340,8 @@ def unfollow(%{assigns: %{user: follower, account: followed}} = conn, _params) d end @doc "POST /api/v1/accounts/:id/mute" - def mute(%{assigns: %{user: muter, account: muted}} = conn, params) do - notifications? = params |> Map.get("notifications", true) |> truthy_param?() - - with {:ok, _user_relationships} <- User.mute(muter, muted, notifications?) do + def mute(%{assigns: %{user: muter, account: muted}, body_params: params} = conn, _params) do + with {:ok, _user_relationships} <- User.mute(muter, muted, params.notifications) do render(conn, "relationship.json", user: muter, target: muted) else {:error, message} -> json_response(conn, :forbidden, %{error: message}) @@ -370,8 +369,7 @@ def block(%{assigns: %{user: blocker, account: blocked}} = conn, _params) do @doc "POST /api/v1/accounts/:id/unblock" def unblock(%{assigns: %{user: blocker, account: blocked}} = conn, _params) do - with {:ok, _user_block} <- User.unblock(blocker, blocked), - {:ok, _activity} <- ActivityPub.unblock(blocker, blocked) do + with {:ok, _activity} <- CommonAPI.unblock(blocker, blocked) do render(conn, "relationship.json", user: blocker, target: blocked) else {:error, message} -> json_response(conn, :forbidden, %{error: message}) @@ -379,14 +377,15 @@ def unblock(%{assigns: %{user: blocker, account: blocked}} = conn, _params) do end @doc "POST /api/v1/follows" - def follows(%{assigns: %{user: follower}} = conn, %{"uri" => uri}) do - with {_, %User{} = followed} <- {:followed, User.get_cached_by_nickname(uri)}, - {_, true} <- {:followed, follower.id != followed.id}, - {:ok, follower, followed, _} <- CommonAPI.follow(follower, followed) do - render(conn, "show.json", user: followed, for: follower) - else - {:followed, _} -> {:error, :not_found} - {:error, message} -> json_response(conn, :forbidden, %{error: message}) + def follow_by_uri(%{body_params: %{uri: uri}} = conn, _) do + case User.get_cached_by_nickname(uri) do + %User{} = user -> + conn + |> assign(:account, user) + |> follow(%{}) + + nil -> + {:error, :not_found} end end @@ -403,6 +402,8 @@ def blocks(%{assigns: %{user: user}} = conn, _) do end @doc "GET /api/v1/endorsements" - def endorsements(conn, params), - do: Pleroma.Web.MastodonAPI.MastodonAPIController.empty_array(conn, params) + def endorsements(conn, params), do: MastodonAPIController.empty_array(conn, params) + + @doc "GET /api/v1/identity_proofs" + def identity_proofs(conn, params), do: MastodonAPIController.empty_array(conn, params) end diff --git a/lib/pleroma/web/mastodon_api/controllers/app_controller.ex b/lib/pleroma/web/mastodon_api/controllers/app_controller.ex index 5e2871f18..a516b6c20 100644 --- a/lib/pleroma/web/mastodon_api/controllers/app_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/app_controller.ex @@ -5,6 +5,7 @@ defmodule Pleroma.Web.MastodonAPI.AppController do use Pleroma.Web, :controller + alias Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug alias Pleroma.Plugs.OAuthScopesPlug alias Pleroma.Repo alias Pleroma.Web.OAuth.App @@ -13,18 +14,28 @@ defmodule Pleroma.Web.MastodonAPI.AppController do action_fallback(Pleroma.Web.MastodonAPI.FallbackController) + plug( + :skip_plug, + [OAuthScopesPlug, EnsurePublicOrAuthenticatedPlug] + when action == :create + ) + plug(OAuthScopesPlug, %{scopes: ["read"]} when action == :verify_credentials) + plug(Pleroma.Web.ApiSpec.CastAndValidate) + @local_mastodon_name "Mastodon-Local" + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.AppOperation + @doc "POST /api/v1/apps" - def create(conn, params) do + def create(%{body_params: params} = conn, _params) do scopes = Scopes.fetch_scopes(params, ["read"]) app_attrs = params - |> Map.drop(["scope", "scopes"]) - |> Map.put("scopes", scopes) + |> Map.take([:client_name, :redirect_uris, :website]) + |> Map.put(:scopes, scopes) with cs <- App.register_changeset(%App{}, app_attrs), false <- cs.changes[:client_name] == @local_mastodon_name, diff --git a/lib/pleroma/web/mastodon_api/controllers/auth_controller.ex b/lib/pleroma/web/mastodon_api/controllers/auth_controller.ex index 37b389382..753b3db3e 100644 --- a/lib/pleroma/web/mastodon_api/controllers/auth_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/auth_controller.ex @@ -13,10 +13,10 @@ defmodule Pleroma.Web.MastodonAPI.AuthController do action_fallback(Pleroma.Web.MastodonAPI.FallbackController) - @local_mastodon_name "Mastodon-Local" - plug(Pleroma.Plugs.RateLimiter, [name: :password_reset] when action == :password_reset) + @local_mastodon_name "Mastodon-Local" + @doc "GET /web/login" def login(%{assigns: %{user: %User{}}} = conn, _params) do redirect(conn, to: local_mastodon_root_path(conn)) diff --git a/lib/pleroma/web/mastodon_api/controllers/conversation_controller.ex b/lib/pleroma/web/mastodon_api/controllers/conversation_controller.ex index 7c9b11bf1..69f0e3846 100644 --- a/lib/pleroma/web/mastodon_api/controllers/conversation_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/conversation_controller.ex @@ -13,13 +13,15 @@ defmodule Pleroma.Web.MastodonAPI.ConversationController do action_fallback(Pleroma.Web.MastodonAPI.FallbackController) + plug(Pleroma.Web.ApiSpec.CastAndValidate) plug(OAuthScopesPlug, %{scopes: ["read:statuses"]} when action == :index) - plug(OAuthScopesPlug, %{scopes: ["write:conversations"]} when action == :read) + plug(OAuthScopesPlug, %{scopes: ["write:conversations"]} when action != :index) - plug(Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug) + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.ConversationOperation @doc "GET /api/v1/conversations" def index(%{assigns: %{user: user}} = conn, params) do + params = stringify_pagination_params(params) participations = Participation.for_user_with_last_activity_id(user, params) conn @@ -28,11 +30,27 @@ def index(%{assigns: %{user: user}} = conn, params) do end @doc "POST /api/v1/conversations/:id/read" - def read(%{assigns: %{user: user}} = conn, %{"id" => participation_id}) do + def mark_as_read(%{assigns: %{user: user}} = conn, %{id: participation_id}) do with %Participation{} = participation <- Repo.get_by(Participation, id: participation_id, user_id: user.id), {:ok, participation} <- Participation.mark_as_read(participation) do render(conn, "participation.json", participation: participation, for: user) end end + + defp stringify_pagination_params(params) do + atom_keys = + Pleroma.Pagination.page_keys() + |> Enum.map(&String.to_atom(&1)) + + str_keys = + params + |> Map.take(atom_keys) + |> Enum.map(fn {key, value} -> {to_string(key), value} end) + |> Enum.into(%{}) + + params + |> Map.delete(atom_keys) + |> Map.merge(str_keys) + end end diff --git a/lib/pleroma/web/mastodon_api/controllers/custom_emoji_controller.ex b/lib/pleroma/web/mastodon_api/controllers/custom_emoji_controller.ex index d82de1db5..c5f47c5df 100644 --- a/lib/pleroma/web/mastodon_api/controllers/custom_emoji_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/custom_emoji_controller.ex @@ -5,6 +5,16 @@ defmodule Pleroma.Web.MastodonAPI.CustomEmojiController do use Pleroma.Web, :controller + plug(Pleroma.Web.ApiSpec.CastAndValidate) + + plug( + :skip_plug, + [Pleroma.Plugs.OAuthScopesPlug, Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug] + when action == :index + ) + + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.CustomEmojiOperation + def index(conn, _params) do render(conn, "index.json", custom_emojis: Pleroma.Emoji.get_all()) end diff --git a/lib/pleroma/web/mastodon_api/controllers/domain_block_controller.ex b/lib/pleroma/web/mastodon_api/controllers/domain_block_controller.ex index e4156cbe6..825b231ab 100644 --- a/lib/pleroma/web/mastodon_api/controllers/domain_block_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/domain_block_controller.ex @@ -8,6 +8,9 @@ defmodule Pleroma.Web.MastodonAPI.DomainBlockController do alias Pleroma.Plugs.OAuthScopesPlug alias Pleroma.User + plug(Pleroma.Web.ApiSpec.CastAndValidate) + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.DomainBlockOperation + plug( OAuthScopesPlug, %{scopes: ["follow", "read:blocks"]} when action == :index @@ -18,21 +21,19 @@ defmodule Pleroma.Web.MastodonAPI.DomainBlockController do %{scopes: ["follow", "write:blocks"]} when action != :index ) - plug(Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug) - @doc "GET /api/v1/domain_blocks" def index(%{assigns: %{user: user}} = conn, _) do json(conn, Map.get(user, :domain_blocks, [])) end @doc "POST /api/v1/domain_blocks" - def create(%{assigns: %{user: blocker}} = conn, %{"domain" => domain}) do + def create(%{assigns: %{user: blocker}, body_params: %{domain: domain}} = conn, _params) do User.block_domain(blocker, domain) json(conn, %{}) end @doc "DELETE /api/v1/domain_blocks" - def delete(%{assigns: %{user: blocker}} = conn, %{"domain" => domain}) do + def delete(%{assigns: %{user: blocker}, body_params: %{domain: domain}} = conn, _params) do User.unblock_domain(blocker, domain) json(conn, %{}) end diff --git a/lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex b/lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex index 0a257f604..8af557b61 100644 --- a/lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex @@ -20,6 +20,10 @@ def call(conn, {:error, :not_found}) do render_error(conn, :not_found, "Record not found") end + def call(conn, {:error, :forbidden}) do + render_error(conn, :forbidden, "Access denied") + end + def call(conn, {:error, error_message}) do conn |> put_status(:bad_request) diff --git a/lib/pleroma/web/mastodon_api/controllers/filter_controller.ex b/lib/pleroma/web/mastodon_api/controllers/filter_controller.ex index 7b0b937a2..abbf0ce02 100644 --- a/lib/pleroma/web/mastodon_api/controllers/filter_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/filter_controller.ex @@ -10,6 +10,7 @@ defmodule Pleroma.Web.MastodonAPI.FilterController do @oauth_read_actions [:show, :index] + plug(Pleroma.Web.ApiSpec.CastAndValidate) plug(OAuthScopesPlug, %{scopes: ["read:filters"]} when action in @oauth_read_actions) plug( @@ -17,62 +18,60 @@ defmodule Pleroma.Web.MastodonAPI.FilterController do %{scopes: ["write:filters"]} when action not in @oauth_read_actions ) - plug(Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug) + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.FilterOperation @doc "GET /api/v1/filters" def index(%{assigns: %{user: user}} = conn, _) do filters = Filter.get_filters(user) - render(conn, "filters.json", filters: filters) + render(conn, "index.json", filters: filters) end @doc "POST /api/v1/filters" - def create( - %{assigns: %{user: user}} = conn, - %{"phrase" => phrase, "context" => context} = params - ) do + def create(%{assigns: %{user: user}, body_params: params} = conn, _) do query = %Filter{ user_id: user.id, - phrase: phrase, - context: context, - hide: Map.get(params, "irreversible", false), - whole_word: Map.get(params, "boolean", true) - # expires_at + phrase: params.phrase, + context: params.context, + hide: params.irreversible, + whole_word: params.whole_word + # TODO: support `expires_in` parameter (as in Mastodon API) } {:ok, response} = Filter.create(query) - render(conn, "filter.json", filter: response) + render(conn, "show.json", filter: response) end @doc "GET /api/v1/filters/:id" - def show(%{assigns: %{user: user}} = conn, %{"id" => filter_id}) do + def show(%{assigns: %{user: user}} = conn, %{id: filter_id}) do filter = Filter.get(filter_id, user) - render(conn, "filter.json", filter: filter) + render(conn, "show.json", filter: filter) end @doc "PUT /api/v1/filters/:id" def update( - %{assigns: %{user: user}} = conn, - %{"phrase" => phrase, "context" => context, "id" => filter_id} = params + %{assigns: %{user: user}, body_params: params} = conn, + %{id: filter_id} ) do - query = %Filter{ - user_id: user.id, - filter_id: filter_id, - phrase: phrase, - context: context, - hide: Map.get(params, "irreversible", nil), - whole_word: Map.get(params, "boolean", true) - # expires_at - } + params = + params + |> Map.delete(:irreversible) + |> Map.put(:hide, params[:irreversible]) + |> Enum.reject(fn {_key, value} -> is_nil(value) end) + |> Map.new() - {:ok, response} = Filter.update(query) - render(conn, "filter.json", filter: response) + # TODO: support `expires_in` parameter (as in Mastodon API) + + with %Filter{} = filter <- Filter.get(filter_id, user), + {:ok, %Filter{} = filter} <- Filter.update(filter, params) do + render(conn, "show.json", filter: filter) + end end @doc "DELETE /api/v1/filters/:id" - def delete(%{assigns: %{user: user}} = conn, %{"id" => filter_id}) do + def delete(%{assigns: %{user: user}} = conn, %{id: filter_id}) do query = %Filter{ user_id: user.id, filter_id: filter_id diff --git a/lib/pleroma/web/mastodon_api/controllers/follow_request_controller.ex b/lib/pleroma/web/mastodon_api/controllers/follow_request_controller.ex index 1ca86f63f..748b6b475 100644 --- a/lib/pleroma/web/mastodon_api/controllers/follow_request_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/follow_request_controller.ex @@ -10,6 +10,7 @@ defmodule Pleroma.Web.MastodonAPI.FollowRequestController do alias Pleroma.Web.CommonAPI plug(:put_view, Pleroma.Web.MastodonAPI.AccountView) + plug(Pleroma.Web.ApiSpec.CastAndValidate) plug(:assign_follower when action != :index) action_fallback(:errors) @@ -21,7 +22,7 @@ defmodule Pleroma.Web.MastodonAPI.FollowRequestController do %{scopes: ["follow", "write:follows"]} when action != :index ) - plug(Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug) + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.FollowRequestOperation @doc "GET /api/v1/follow_requests" def index(%{assigns: %{user: followed}} = conn, _params) do @@ -44,7 +45,7 @@ def reject(%{assigns: %{user: followed, follower: follower}} = conn, _params) do end end - defp assign_follower(%{params: %{"id" => id}} = conn, _) do + defp assign_follower(%{params: %{id: id}} = conn, _) do case User.get_cached_by_id(id) do %User{} = follower -> assign(conn, :follower, follower) nil -> Pleroma.Web.MastodonAPI.FallbackController.call(conn, {:error, :not_found}) |> halt() diff --git a/lib/pleroma/web/mastodon_api/controllers/instance_controller.ex b/lib/pleroma/web/mastodon_api/controllers/instance_controller.ex index 27b5b1a52..d8859731d 100644 --- a/lib/pleroma/web/mastodon_api/controllers/instance_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/instance_controller.ex @@ -5,6 +5,16 @@ defmodule Pleroma.Web.MastodonAPI.InstanceController do use Pleroma.Web, :controller + plug(OpenApiSpex.Plug.CastAndValidate) + + plug( + :skip_plug, + [Pleroma.Plugs.OAuthScopesPlug, Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug] + when action in [:show, :peers] + ) + + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.InstanceOperation + @doc "GET /api/v1/instance" def show(conn, _params) do render(conn, "show.json") diff --git a/lib/pleroma/web/mastodon_api/controllers/list_controller.ex b/lib/pleroma/web/mastodon_api/controllers/list_controller.ex index dac4daa7b..acdc76fd2 100644 --- a/lib/pleroma/web/mastodon_api/controllers/list_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/list_controller.ex @@ -9,20 +9,17 @@ defmodule Pleroma.Web.MastodonAPI.ListController do alias Pleroma.User alias Pleroma.Web.MastodonAPI.AccountView + @oauth_read_actions [:index, :show, :list_accounts] + + plug(Pleroma.Web.ApiSpec.CastAndValidate) plug(:list_by_id_and_user when action not in [:index, :create]) - - plug(OAuthScopesPlug, %{scopes: ["read:lists"]} when action in [:index, :show, :list_accounts]) - - plug( - OAuthScopesPlug, - %{scopes: ["write:lists"]} - when action in [:create, :update, :delete, :add_to_list, :remove_from_list] - ) - - plug(Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug) + plug(OAuthScopesPlug, %{scopes: ["read:lists"]} when action in @oauth_read_actions) + plug(OAuthScopesPlug, %{scopes: ["write:lists"]} when action not in @oauth_read_actions) action_fallback(Pleroma.Web.MastodonAPI.FallbackController) + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.ListOperation + # GET /api/v1/lists def index(%{assigns: %{user: user}} = conn, opts) do lists = Pleroma.List.for_user(user, opts) @@ -30,7 +27,7 @@ def index(%{assigns: %{user: user}} = conn, opts) do end # POST /api/v1/lists - def create(%{assigns: %{user: user}} = conn, %{"title" => title}) do + def create(%{assigns: %{user: user}, body_params: %{title: title}} = conn, _) do with {:ok, %Pleroma.List{} = list} <- Pleroma.List.create(title, user) do render(conn, "show.json", list: list) end @@ -42,7 +39,7 @@ def show(%{assigns: %{list: list}} = conn, _) do end # PUT /api/v1/lists/:id - def update(%{assigns: %{list: list}} = conn, %{"title" => title}) do + def update(%{assigns: %{list: list}, body_params: %{title: title}} = conn, _) do with {:ok, list} <- Pleroma.List.rename(list, title) do render(conn, "show.json", list: list) end @@ -65,7 +62,7 @@ def list_accounts(%{assigns: %{user: user, list: list}} = conn, _) do end # POST /api/v1/lists/:id/accounts - def add_to_list(%{assigns: %{list: list}} = conn, %{"account_ids" => account_ids}) do + def add_to_list(%{assigns: %{list: list}, body_params: %{account_ids: account_ids}} = conn, _) do Enum.each(account_ids, fn account_id -> with %User{} = followed <- User.get_cached_by_id(account_id) do Pleroma.List.follow(list, followed) @@ -76,7 +73,10 @@ def add_to_list(%{assigns: %{list: list}} = conn, %{"account_ids" => account_ids end # DELETE /api/v1/lists/:id/accounts - def remove_from_list(%{assigns: %{list: list}} = conn, %{"account_ids" => account_ids}) do + def remove_from_list( + %{assigns: %{list: list}, body_params: %{account_ids: account_ids}} = conn, + _ + ) do Enum.each(account_ids, fn account_id -> with %User{} = followed <- User.get_cached_by_id(account_id) do Pleroma.List.unfollow(list, followed) @@ -86,7 +86,7 @@ def remove_from_list(%{assigns: %{list: list}} = conn, %{"account_ids" => accoun json(conn, %{}) end - defp list_by_id_and_user(%{assigns: %{user: user}, params: %{"id" => id}} = conn, _) do + defp list_by_id_and_user(%{assigns: %{user: user}, params: %{id: id}} = conn, _) do case Pleroma.List.get(id, user) do %Pleroma.List{} = list -> assign(conn, :list, list) nil -> conn |> render_error(:not_found, "List not found") |> halt() diff --git a/lib/pleroma/web/mastodon_api/controllers/marker_controller.ex b/lib/pleroma/web/mastodon_api/controllers/marker_controller.ex index 58e8a30c2..85310edfa 100644 --- a/lib/pleroma/web/mastodon_api/controllers/marker_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/marker_controller.ex @@ -6,6 +6,8 @@ defmodule Pleroma.Web.MastodonAPI.MarkerController do use Pleroma.Web, :controller alias Pleroma.Plugs.OAuthScopesPlug + plug(Pleroma.Web.ApiSpec.CastAndValidate) + plug( OAuthScopesPlug, %{scopes: ["read:statuses"]} @@ -13,17 +15,21 @@ defmodule Pleroma.Web.MastodonAPI.MarkerController do ) plug(OAuthScopesPlug, %{scopes: ["write:statuses"]} when action == :upsert) - plug(Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug) + action_fallback(Pleroma.Web.MastodonAPI.FallbackController) + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.MarkerOperation + # GET /api/v1/markers def index(%{assigns: %{user: user}} = conn, params) do - markers = Pleroma.Marker.get_markers(user, params["timeline"]) + markers = Pleroma.Marker.get_markers(user, params[:timeline]) render(conn, "markers.json", %{markers: markers}) end # POST /api/v1/markers - def upsert(%{assigns: %{user: user}} = conn, params) do + def upsert(%{assigns: %{user: user}, body_params: params} = conn, _) do + params = Map.new(params, fn {key, value} -> {to_string(key), value} end) + with {:ok, result} <- Pleroma.Marker.upsert(user, params), markers <- Map.values(result) do render(conn, "markers.json", %{markers: markers}) diff --git a/lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex index 14075307d..e7767de4e 100644 --- a/lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex @@ -3,21 +3,33 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do + @moduledoc """ + Contains stubs for unimplemented Mastodon API endpoints. + + Note: instead of routing directly to this controller's action, + it's preferable to define an action in relevant (non-generic) controller, + set up OAuth rules for it and call this controller's function from it. + """ + use Pleroma.Web, :controller require Logger + plug( + :skip_plug, + [Pleroma.Plugs.OAuthScopesPlug, Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug] + when action in [:empty_array, :empty_object] + ) + action_fallback(Pleroma.Web.MastodonAPI.FallbackController) - # Stubs for unimplemented mastodon api - # def empty_array(conn, _) do - Logger.debug("Unimplemented, returning an empty array") + Logger.debug("Unimplemented, returning an empty array (list)") json(conn, []) end def empty_object(conn, _) do - Logger.debug("Unimplemented, returning an empty object") + Logger.debug("Unimplemented, returning an empty object (map)") json(conn, %{}) end end diff --git a/lib/pleroma/web/mastodon_api/controllers/media_controller.ex b/lib/pleroma/web/mastodon_api/controllers/media_controller.ex index 2b6f00952..513de279f 100644 --- a/lib/pleroma/web/mastodon_api/controllers/media_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/media_controller.ex @@ -11,19 +11,21 @@ defmodule Pleroma.Web.MastodonAPI.MediaController do alias Pleroma.Web.ActivityPub.ActivityPub action_fallback(Pleroma.Web.MastodonAPI.FallbackController) + plug(Pleroma.Web.ApiSpec.CastAndValidate) plug(:put_view, Pleroma.Web.MastodonAPI.StatusView) - plug(OAuthScopesPlug, %{scopes: ["write:media"]}) + plug(OAuthScopesPlug, %{scopes: ["read:media"]} when action == :show) + plug(OAuthScopesPlug, %{scopes: ["write:media"]} when action != :show) - plug(Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug) + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.MediaOperation @doc "POST /api/v1/media" - def create(%{assigns: %{user: user}} = conn, %{"file" => file} = data) do + def create(%{assigns: %{user: user}, body_params: %{file: file} = data} = conn, _) do with {:ok, object} <- ActivityPub.upload( file, actor: User.ap_id(user), - description: Map.get(data, "description") + description: Map.get(data, :description) ) do attachment_data = Map.put(object.data, "id", object.id) @@ -31,11 +33,30 @@ def create(%{assigns: %{user: user}} = conn, %{"file" => file} = data) do end end + def create(_conn, _data), do: {:error, :bad_request} + + @doc "POST /api/v2/media" + def create2(%{assigns: %{user: user}, body_params: %{file: file} = data} = conn, _) do + with {:ok, object} <- + ActivityPub.upload( + file, + actor: User.ap_id(user), + description: Map.get(data, :description) + ) do + attachment_data = Map.put(object.data, "id", object.id) + + conn + |> put_status(202) + |> render("attachment.json", %{attachment: attachment_data}) + end + end + + def create2(_conn, _data), do: {:error, :bad_request} + @doc "PUT /api/v1/media/:id" - def update(%{assigns: %{user: user}} = conn, %{"id" => id, "description" => description}) - when is_binary(description) do + def update(%{assigns: %{user: user}, body_params: %{description: description}} = conn, %{id: id}) do with %Object{} = object <- Object.get_by_id(id), - true <- Object.authorize_mutation(object, user), + :ok <- Object.authorize_access(object, user), {:ok, %Object{data: data}} <- Object.update_data(object, %{"name" => description}) do attachment_data = Map.put(data, "id", object.id) @@ -43,5 +64,17 @@ def update(%{assigns: %{user: user}} = conn, %{"id" => id, "description" => desc end end - def update(_conn, _data), do: {:error, :bad_request} + def update(conn, data), do: show(conn, data) + + @doc "GET /api/v1/media/:id" + def show(%{assigns: %{user: user}} = conn, %{id: id}) do + with %Object{data: data, id: object_id} = object <- Object.get_by_id(id), + :ok <- Object.authorize_access(object, user) do + attachment_data = Map.put(data, "id", object_id) + + render(conn, "attachment.json", %{attachment: attachment_data}) + end + end + + def show(_conn, _data), do: {:error, :bad_request} end diff --git a/lib/pleroma/web/mastodon_api/controllers/notification_controller.ex b/lib/pleroma/web/mastodon_api/controllers/notification_controller.ex index 0c9218454..bcd12c73f 100644 --- a/lib/pleroma/web/mastodon_api/controllers/notification_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/notification_controller.ex @@ -13,6 +13,8 @@ defmodule Pleroma.Web.MastodonAPI.NotificationController do @oauth_read_actions [:show, :index] + plug(Pleroma.Web.ApiSpec.CastAndValidate) + plug( OAuthScopesPlug, %{scopes: ["read:notifications"]} when action in @oauth_read_actions @@ -20,16 +22,16 @@ defmodule Pleroma.Web.MastodonAPI.NotificationController do plug(OAuthScopesPlug, %{scopes: ["write:notifications"]} when action not in @oauth_read_actions) - plug(Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug) + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.NotificationOperation # GET /api/v1/notifications - def index(conn, %{"account_id" => account_id} = params) do + def index(conn, %{account_id: account_id} = params) do case Pleroma.User.get_cached_by_id(account_id) do %{ap_id: account_ap_id} -> params = params - |> Map.delete("account_id") - |> Map.put("account_ap_id", account_ap_id) + |> Map.delete(:account_id) + |> Map.put(:account_ap_id, account_ap_id) index(conn, params) @@ -41,15 +43,19 @@ def index(conn, %{"account_id" => account_id} = params) do end def index(%{assigns: %{user: user}} = conn, params) do + params = Map.new(params, fn {k, v} -> {to_string(k), v} end) notifications = MastodonAPI.get_notifications(user, params) conn |> add_link_headers(notifications) - |> render("index.json", notifications: notifications, for: user) + |> render("index.json", + notifications: notifications, + for: user + ) end # GET /api/v1/notifications/:id - def show(%{assigns: %{user: user}} = conn, %{"id" => id}) do + def show(%{assigns: %{user: user}} = conn, %{id: id}) do with {:ok, notification} <- Notification.get(user, id) do render(conn, "show.json", notification: notification, for: user) else @@ -66,8 +72,9 @@ def clear(%{assigns: %{user: user}} = conn, _params) do json(conn, %{}) end - # POST /api/v1/notifications/dismiss - def dismiss(%{assigns: %{user: user}} = conn, %{"id" => id} = _params) do + # POST /api/v1/notifications/:id/dismiss + + def dismiss(%{assigns: %{user: user}} = conn, %{id: id} = _params) do with {:ok, _notif} <- Notification.dismiss(user, id) do json(conn, %{}) else @@ -78,8 +85,13 @@ def dismiss(%{assigns: %{user: user}} = conn, %{"id" => id} = _params) do end end + # POST /api/v1/notifications/dismiss (deprecated) + def dismiss_via_body(%{body_params: params} = conn, _) do + dismiss(conn, params) + end + # DELETE /api/v1/notifications/destroy_multiple - def destroy_multiple(%{assigns: %{user: user}} = conn, %{"ids" => ids} = _params) do + def destroy_multiple(%{assigns: %{user: user}} = conn, %{ids: ids} = _params) do Notification.destroy_multiple(user, ids) json(conn, %{}) end diff --git a/lib/pleroma/web/mastodon_api/controllers/poll_controller.ex b/lib/pleroma/web/mastodon_api/controllers/poll_controller.ex index d9f894118..db46ffcfc 100644 --- a/lib/pleroma/web/mastodon_api/controllers/poll_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/poll_controller.ex @@ -15,6 +15,8 @@ defmodule Pleroma.Web.MastodonAPI.PollController do action_fallback(Pleroma.Web.MastodonAPI.FallbackController) + plug(Pleroma.Web.ApiSpec.CastAndValidate) + plug( OAuthScopesPlug, %{scopes: ["read:statuses"], fallback: :proceed_unauthenticated} when action == :show @@ -22,10 +24,10 @@ defmodule Pleroma.Web.MastodonAPI.PollController do plug(OAuthScopesPlug, %{scopes: ["write:statuses"]} when action == :vote) - plug(Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug) + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.PollOperation @doc "GET /api/v1/polls/:id" - def show(%{assigns: %{user: user}} = conn, %{"id" => id}) do + def show(%{assigns: %{user: user}} = conn, %{id: id}) do with %Object{} = object <- Object.get_by_id_and_maybe_refetch(id, interval: 60), %Activity{} = activity <- Activity.get_create_by_object_ap_id(object.data["id"]), true <- Visibility.visible_for_user?(activity, user) do @@ -37,7 +39,7 @@ def show(%{assigns: %{user: user}} = conn, %{"id" => id}) do end @doc "POST /api/v1/polls/:id/votes" - def vote(%{assigns: %{user: user}} = conn, %{"id" => id, "choices" => choices}) do + def vote(%{assigns: %{user: user}, body_params: %{choices: choices}} = conn, %{id: id}) do with %Object{data: %{"type" => "Question"}} = object <- Object.get_by_id(id), %Activity{} = activity <- Activity.get_create_by_object_ap_id(object.data["id"]), true <- Visibility.visible_for_user?(activity, user), diff --git a/lib/pleroma/web/mastodon_api/controllers/report_controller.ex b/lib/pleroma/web/mastodon_api/controllers/report_controller.ex index f5782be13..405167108 100644 --- a/lib/pleroma/web/mastodon_api/controllers/report_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/report_controller.ex @@ -9,12 +9,13 @@ defmodule Pleroma.Web.MastodonAPI.ReportController do action_fallback(Pleroma.Web.MastodonAPI.FallbackController) + plug(Pleroma.Web.ApiSpec.CastAndValidate) plug(OAuthScopesPlug, %{scopes: ["write:reports"]} when action == :create) - plug(Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug) + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.ReportOperation @doc "POST /api/v1/reports" - def create(%{assigns: %{user: user}} = conn, params) do + def create(%{assigns: %{user: user}, body_params: params} = conn, _) do with {:ok, activity} <- Pleroma.Web.CommonAPI.report(user, params) do render(conn, "show.json", activity: activity) end diff --git a/lib/pleroma/web/mastodon_api/controllers/scheduled_activity_controller.ex b/lib/pleroma/web/mastodon_api/controllers/scheduled_activity_controller.ex index e1e6bd89b..1719c67ea 100644 --- a/lib/pleroma/web/mastodon_api/controllers/scheduled_activity_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/scheduled_activity_controller.ex @@ -11,19 +11,21 @@ defmodule Pleroma.Web.MastodonAPI.ScheduledActivityController do alias Pleroma.ScheduledActivity alias Pleroma.Web.MastodonAPI.MastodonAPI - plug(:assign_scheduled_activity when action != :index) - @oauth_read_actions [:show, :index] + plug(Pleroma.Web.ApiSpec.CastAndValidate) plug(OAuthScopesPlug, %{scopes: ["read:statuses"]} when action in @oauth_read_actions) plug(OAuthScopesPlug, %{scopes: ["write:statuses"]} when action not in @oauth_read_actions) - - plug(Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug) + plug(:assign_scheduled_activity when action != :index) action_fallback(Pleroma.Web.MastodonAPI.FallbackController) + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.ScheduledActivityOperation + @doc "GET /api/v1/scheduled_statuses" def index(%{assigns: %{user: user}} = conn, params) do + params = Map.new(params, fn {key, value} -> {to_string(key), value} end) + with scheduled_activities <- MastodonAPI.get_scheduled_activities(user, params) do conn |> add_link_headers(scheduled_activities) @@ -37,7 +39,7 @@ def show(%{assigns: %{scheduled_activity: scheduled_activity}} = conn, _params) end @doc "PUT /api/v1/scheduled_statuses/:id" - def update(%{assigns: %{scheduled_activity: scheduled_activity}} = conn, params) do + def update(%{assigns: %{scheduled_activity: scheduled_activity}, body_params: params} = conn, _) do with {:ok, scheduled_activity} <- ScheduledActivity.update(scheduled_activity, params) do render(conn, "show.json", scheduled_activity: scheduled_activity) end @@ -50,7 +52,7 @@ def delete(%{assigns: %{scheduled_activity: scheduled_activity}} = conn, _params end end - defp assign_scheduled_activity(%{assigns: %{user: user}, params: %{"id" => id}} = conn, _) do + defp assign_scheduled_activity(%{assigns: %{user: user}, params: %{id: id}} = conn, _) do case ScheduledActivity.get(user, id) do %ScheduledActivity{} = activity -> assign(conn, :scheduled_activity, activity) nil -> Pleroma.Web.MastodonAPI.FallbackController.call(conn, {:error, :not_found}) |> halt() diff --git a/lib/pleroma/web/mastodon_api/controllers/search_controller.ex b/lib/pleroma/web/mastodon_api/controllers/search_controller.ex index fcab4ef63..77e2224e4 100644 --- a/lib/pleroma/web/mastodon_api/controllers/search_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/search_controller.ex @@ -17,25 +17,33 @@ defmodule Pleroma.Web.MastodonAPI.SearchController do require Logger + plug(Pleroma.Web.ApiSpec.CastAndValidate) + # Note: Mastodon doesn't allow unauthenticated access (requires read:accounts / read:search) plug(OAuthScopesPlug, %{scopes: ["read:search"], fallback: :proceed_unauthenticated}) - plug(Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug) + # Note: on private instances auth is required (EnsurePublicOrAuthenticatedPlug is not skipped) plug(RateLimiter, [name: :search] when action in [:search, :search2, :account_search]) - def account_search(%{assigns: %{user: user}} = conn, %{"q" => query} = params) do + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.SearchOperation + + def account_search(%{assigns: %{user: user}} = conn, %{q: query} = params) do accounts = User.search(query, search_options(params, user)) conn |> put_view(AccountView) - |> render("index.json", users: accounts, for: user, as: :user) + |> render("index.json", + users: accounts, + for: user, + as: :user + ) end def search2(conn, params), do: do_search(:v2, conn, params) def search(conn, params), do: do_search(:v1, conn, params) - defp do_search(version, %{assigns: %{user: user}} = conn, %{"q" => query} = params) do + defp do_search(version, %{assigns: %{user: user}} = conn, %{q: query} = params) do options = search_options(params, user) timeout = Keyword.get(Repo.config(), :timeout, 15_000) default_values = %{"statuses" => [], "accounts" => [], "hashtags" => []} @@ -43,7 +51,7 @@ defp do_search(version, %{assigns: %{user: user}} = conn, %{"q" => query} = para result = default_values |> Enum.map(fn {resource, default_value} -> - if params["type"] in [nil, resource] do + if params[:type] in [nil, resource] do {resource, fn -> resource_search(version, resource, query, options) end} else {resource, fn -> default_value end} @@ -66,12 +74,13 @@ defp do_search(version, %{assigns: %{user: user}} = conn, %{"q" => query} = para defp search_options(params, user) do [ - resolve: params["resolve"] == "true", - following: params["following"] == "true", - limit: ControllerHelper.fetch_integer_param(params, "limit"), - offset: ControllerHelper.fetch_integer_param(params, "offset"), - type: params["type"], + resolve: params[:resolve], + following: params[:following], + limit: params[:limit], + offset: params[:offset], + type: params[:type], author: get_author(params), + embed_relationships: ControllerHelper.embed_relationships?(params), for_user: user ] |> Enum.filter(&elem(&1, 1)) @@ -79,12 +88,23 @@ defp search_options(params, user) do defp resource_search(_, "accounts", query, options) do accounts = with_fallback(fn -> User.search(query, options) end) - AccountView.render("index.json", users: accounts, for: options[:for_user], as: :user) + + AccountView.render("index.json", + users: accounts, + for: options[:for_user], + as: :user, + embed_relationships: options[:embed_relationships] + ) end defp resource_search(_, "statuses", query, options) do statuses = with_fallback(fn -> Activity.search(options[:for_user], query, options) end) - StatusView.render("index.json", activities: statuses, for: options[:for_user], as: :activity) + + StatusView.render("index.json", + activities: statuses, + for: options[:for_user], + as: :activity + ) end defp resource_search(:v2, "hashtags", query, _options) do @@ -121,7 +141,7 @@ defp with_fallback(f, fallback \\ []) do end end - defp get_author(%{"account_id" => account_id}) when is_binary(account_id), + defp get_author(%{account_id: account_id}) when is_binary(account_id), do: User.get_cached_by_id(account_id) defp get_author(_params), do: nil diff --git a/lib/pleroma/web/mastodon_api/controllers/status_controller.ex b/lib/pleroma/web/mastodon_api/controllers/status_controller.ex index 37afe6949..f20157a5f 100644 --- a/lib/pleroma/web/mastodon_api/controllers/status_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/status_controller.ex @@ -5,7 +5,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusController do use Pleroma.Web, :controller - import Pleroma.Web.ControllerHelper, only: [try_render: 3, add_link_headers: 2] + import Pleroma.Web.ControllerHelper, + only: [try_render: 3, add_link_headers: 2] require Ecto.Query @@ -23,6 +24,9 @@ defmodule Pleroma.Web.MastodonAPI.StatusController do alias Pleroma.Web.MastodonAPI.AccountView alias Pleroma.Web.MastodonAPI.ScheduledActivityView + plug(Pleroma.Web.ApiSpec.CastAndValidate) + plug(:skip_plug, Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug when action in [:index, :show]) + @unauthenticated_access %{fallback: :proceed_unauthenticated, scopes: []} plug( @@ -76,19 +80,17 @@ defmodule Pleroma.Web.MastodonAPI.StatusController do %{scopes: ["write:bookmarks"]} when action in [:bookmark, :unbookmark] ) - plug(Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug when action not in [:index, :show]) - @rate_limited_status_actions ~w(reblog unreblog favourite unfavourite create delete)a plug( RateLimiter, - [name: :status_id_action, bucket_name: "status_id_action:reblog_unreblog", params: ["id"]] + [name: :status_id_action, bucket_name: "status_id_action:reblog_unreblog", params: [:id]] when action in ~w(reblog unreblog)a ) plug( RateLimiter, - [name: :status_id_action, bucket_name: "status_id_action:fav_unfav", params: ["id"]] + [name: :status_id_action, bucket_name: "status_id_action:fav_unfav", params: [:id]] when action in ~w(favourite unfavourite)a ) @@ -96,12 +98,14 @@ defmodule Pleroma.Web.MastodonAPI.StatusController do action_fallback(Pleroma.Web.MastodonAPI.FallbackController) + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.StatusOperation + @doc """ GET `/api/v1/statuses?ids[]=1&ids[]=2` `ids` query param is required """ - def index(%{assigns: %{user: user}} = conn, %{"ids" => ids}) do + def index(%{assigns: %{user: user}} = conn, %{ids: ids} = _params) do limit = 100 activities = @@ -110,7 +114,11 @@ def index(%{assigns: %{user: user}} = conn, %{"ids" => ids}) do |> Activity.all_by_ids_with_object() |> Enum.filter(&Visibility.visible_for_user?(&1, user)) - render(conn, "index.json", activities: activities, for: user, as: :activity) + render(conn, "index.json", + activities: activities, + for: user, + as: :activity + ) end @doc """ @@ -119,20 +127,29 @@ def index(%{assigns: %{user: user}} = conn, %{"ids" => ids}) do Creates a scheduled status when `scheduled_at` param is present and it's far enough """ def create( - %{assigns: %{user: user}} = conn, - %{"status" => _, "scheduled_at" => scheduled_at} = params - ) do - params = Map.put(params, "in_reply_to_status_id", params["in_reply_to_id"]) + %{ + assigns: %{user: user}, + body_params: %{status: _, scheduled_at: scheduled_at} = params + } = conn, + _ + ) + when not is_nil(scheduled_at) do + params = Map.put(params, :in_reply_to_status_id, params[:in_reply_to_id]) + + attrs = %{ + params: Map.new(params, fn {key, value} -> {to_string(key), value} end), + scheduled_at: scheduled_at + } with {:far_enough, true} <- {:far_enough, ScheduledActivity.far_enough?(scheduled_at)}, - attrs <- %{"params" => params, "scheduled_at" => scheduled_at}, {:ok, scheduled_activity} <- ScheduledActivity.create(user, attrs) do conn |> put_view(ScheduledActivityView) |> render("show.json", scheduled_activity: scheduled_activity) else {:far_enough, _} -> - create(conn, Map.drop(params, ["scheduled_at"])) + params = Map.drop(params, [:scheduled_at]) + create(%Plug.Conn{conn | body_params: params}, %{}) error -> error @@ -144,8 +161,8 @@ def create( Creates a regular status """ - def create(%{assigns: %{user: user}} = conn, %{"status" => _} = params) do - params = Map.put(params, "in_reply_to_status_id", params["in_reply_to_id"]) + def create(%{assigns: %{user: user}, body_params: %{status: _} = params} = conn, _) do + params = Map.put(params, :in_reply_to_status_id, params[:in_reply_to_id]) with {:ok, activity} <- CommonAPI.post(user, params) do try_render(conn, "show.json", @@ -162,12 +179,13 @@ def create(%{assigns: %{user: user}} = conn, %{"status" => _} = params) do end end - def create(%{assigns: %{user: _user}} = conn, %{"media_ids" => _} = params) do - create(conn, Map.put(params, "status", "")) + def create(%{assigns: %{user: _user}, body_params: %{media_ids: _} = params} = conn, _) do + params = Map.put(params, :status, "") + create(%Plug.Conn{conn | body_params: params}, %{}) end @doc "GET /api/v1/statuses/:id" - def show(%{assigns: %{user: user}} = conn, %{"id" => id}) do + def show(%{assigns: %{user: user}} = conn, %{id: id}) do with %Activity{} = activity <- Activity.get_by_id_with_object(id), true <- Visibility.visible_for_user?(activity, user) do try_render(conn, "show.json", @@ -181,7 +199,7 @@ def show(%{assigns: %{user: user}} = conn, %{"id" => id}) do end @doc "DELETE /api/v1/statuses/:id" - def delete(%{assigns: %{user: user}} = conn, %{"id" => id}) do + def delete(%{assigns: %{user: user}} = conn, %{id: id}) do with {:ok, %Activity{}} <- CommonAPI.delete(id, user) do json(conn, %{}) else @@ -191,53 +209,53 @@ def delete(%{assigns: %{user: user}} = conn, %{"id" => id}) do end @doc "POST /api/v1/statuses/:id/reblog" - def reblog(%{assigns: %{user: user}} = conn, %{"id" => ap_id_or_id} = params) do - with {:ok, announce, _activity} <- CommonAPI.repeat(ap_id_or_id, user, params), + def reblog(%{assigns: %{user: user}, body_params: params} = conn, %{id: ap_id_or_id}) do + with {:ok, announce} <- CommonAPI.repeat(ap_id_or_id, user, params), %Activity{} = announce <- Activity.normalize(announce.data) do try_render(conn, "show.json", %{activity: announce, for: user, as: :activity}) end end @doc "POST /api/v1/statuses/:id/unreblog" - def unreblog(%{assigns: %{user: user}} = conn, %{"id" => ap_id_or_id}) do - with {:ok, _unannounce, %{data: %{"id" => id}}} <- CommonAPI.unrepeat(ap_id_or_id, user), - %Activity{} = activity <- Activity.get_create_by_object_ap_id_with_object(id) do + def unreblog(%{assigns: %{user: user}} = conn, %{id: activity_id}) do + with {:ok, _unannounce} <- CommonAPI.unrepeat(activity_id, user), + %Activity{} = activity <- Activity.get_by_id(activity_id) do try_render(conn, "show.json", %{activity: activity, for: user, as: :activity}) end end @doc "POST /api/v1/statuses/:id/favourite" - def favourite(%{assigns: %{user: user}} = conn, %{"id" => ap_id_or_id}) do - with {:ok, _fav, %{data: %{"id" => id}}} <- CommonAPI.favorite(ap_id_or_id, user), - %Activity{} = activity <- Activity.get_create_by_object_ap_id(id) do + def favourite(%{assigns: %{user: user}} = conn, %{id: activity_id}) do + with {:ok, _fav} <- CommonAPI.favorite(user, activity_id), + %Activity{} = activity <- Activity.get_by_id(activity_id) do try_render(conn, "show.json", activity: activity, for: user, as: :activity) end end @doc "POST /api/v1/statuses/:id/unfavourite" - def unfavourite(%{assigns: %{user: user}} = conn, %{"id" => ap_id_or_id}) do - with {:ok, _, _, %{data: %{"id" => id}}} <- CommonAPI.unfavorite(ap_id_or_id, user), - %Activity{} = activity <- Activity.get_create_by_object_ap_id(id) do + def unfavourite(%{assigns: %{user: user}} = conn, %{id: activity_id}) do + with {:ok, _unfav} <- CommonAPI.unfavorite(activity_id, user), + %Activity{} = activity <- Activity.get_by_id(activity_id) do try_render(conn, "show.json", activity: activity, for: user, as: :activity) end end @doc "POST /api/v1/statuses/:id/pin" - def pin(%{assigns: %{user: user}} = conn, %{"id" => ap_id_or_id}) do + def pin(%{assigns: %{user: user}} = conn, %{id: ap_id_or_id}) do with {:ok, activity} <- CommonAPI.pin(ap_id_or_id, user) do try_render(conn, "show.json", activity: activity, for: user, as: :activity) end end @doc "POST /api/v1/statuses/:id/unpin" - def unpin(%{assigns: %{user: user}} = conn, %{"id" => ap_id_or_id}) do + def unpin(%{assigns: %{user: user}} = conn, %{id: ap_id_or_id}) do with {:ok, activity} <- CommonAPI.unpin(ap_id_or_id, user) do try_render(conn, "show.json", activity: activity, for: user, as: :activity) end end @doc "POST /api/v1/statuses/:id/bookmark" - def bookmark(%{assigns: %{user: user}} = conn, %{"id" => id}) do + def bookmark(%{assigns: %{user: user}} = conn, %{id: id}) do with %Activity{} = activity <- Activity.get_by_id_with_object(id), %User{} = user <- User.get_cached_by_nickname(user.nickname), true <- Visibility.visible_for_user?(activity, user), @@ -247,7 +265,7 @@ def bookmark(%{assigns: %{user: user}} = conn, %{"id" => id}) do end @doc "POST /api/v1/statuses/:id/unbookmark" - def unbookmark(%{assigns: %{user: user}} = conn, %{"id" => id}) do + def unbookmark(%{assigns: %{user: user}} = conn, %{id: id}) do with %Activity{} = activity <- Activity.get_by_id_with_object(id), %User{} = user <- User.get_cached_by_nickname(user.nickname), true <- Visibility.visible_for_user?(activity, user), @@ -257,7 +275,7 @@ def unbookmark(%{assigns: %{user: user}} = conn, %{"id" => id}) do end @doc "POST /api/v1/statuses/:id/mute" - def mute_conversation(%{assigns: %{user: user}} = conn, %{"id" => id}) do + def mute_conversation(%{assigns: %{user: user}} = conn, %{id: id}) do with %Activity{} = activity <- Activity.get_by_id(id), {:ok, activity} <- CommonAPI.add_mute(user, activity) do try_render(conn, "show.json", activity: activity, for: user, as: :activity) @@ -265,7 +283,7 @@ def mute_conversation(%{assigns: %{user: user}} = conn, %{"id" => id}) do end @doc "POST /api/v1/statuses/:id/unmute" - def unmute_conversation(%{assigns: %{user: user}} = conn, %{"id" => id}) do + def unmute_conversation(%{assigns: %{user: user}} = conn, %{id: id}) do with %Activity{} = activity <- Activity.get_by_id(id), {:ok, activity} <- CommonAPI.remove_mute(user, activity) do try_render(conn, "show.json", activity: activity, for: user, as: :activity) @@ -274,7 +292,7 @@ def unmute_conversation(%{assigns: %{user: user}} = conn, %{"id" => id}) do @doc "GET /api/v1/statuses/:id/card" @deprecated "https://github.com/tootsuite/mastodon/pull/11213" - def card(%{assigns: %{user: user}} = conn, %{"id" => status_id}) do + def card(%{assigns: %{user: user}} = conn, %{id: status_id}) do with %Activity{} = activity <- Activity.get_by_id(status_id), true <- Visibility.visible_for_user?(activity, user) do data = Pleroma.Web.RichMedia.Helpers.fetch_data_for_activity(activity) @@ -285,7 +303,7 @@ def card(%{assigns: %{user: user}} = conn, %{"id" => status_id}) do end @doc "GET /api/v1/statuses/:id/favourited_by" - def favourited_by(%{assigns: %{user: user}} = conn, %{"id" => id}) do + def favourited_by(%{assigns: %{user: user}} = conn, %{id: id}) do with %Activity{} = activity <- Activity.get_by_id_with_object(id), {:visible, true} <- {:visible, Visibility.visible_for_user?(activity, user)}, %Object{data: %{"likes" => likes}} <- Object.normalize(activity) do @@ -305,7 +323,7 @@ def favourited_by(%{assigns: %{user: user}} = conn, %{"id" => id}) do end @doc "GET /api/v1/statuses/:id/reblogged_by" - def reblogged_by(%{assigns: %{user: user}} = conn, %{"id" => id}) do + def reblogged_by(%{assigns: %{user: user}} = conn, %{id: id}) do with %Activity{} = activity <- Activity.get_by_id_with_object(id), {:visible, true} <- {:visible, Visibility.visible_for_user?(activity, user)}, %Object{data: %{"announcements" => announces, "id" => ap_id}} <- @@ -337,7 +355,7 @@ def reblogged_by(%{assigns: %{user: user}} = conn, %{"id" => id}) do end @doc "GET /api/v1/statuses/:id/context" - def context(%{assigns: %{user: user}} = conn, %{"id" => id}) do + def context(%{assigns: %{user: user}} = conn, %{id: id}) do with %Activity{} = activity <- Activity.get_by_id(id) do activities = ActivityPub.fetch_activities_for_context(activity.data["context"], %{ @@ -351,16 +369,21 @@ def context(%{assigns: %{user: user}} = conn, %{"id" => id}) do end @doc "GET /api/v1/favourites" - def favourites(%{assigns: %{user: user}} = conn, params) do - activities = - ActivityPub.fetch_favourites( - user, - Map.take(params, Pleroma.Pagination.page_keys()) - ) + def favourites(%{assigns: %{user: %User{} = user}} = conn, params) do + params = + params + |> Map.new(fn {key, value} -> {to_string(key), value} end) + |> Map.take(Pleroma.Pagination.page_keys()) + + activities = ActivityPub.fetch_favourites(user, params) conn |> add_link_headers(activities) - |> render("index.json", activities: activities, for: user, as: :activity) + |> render("index.json", + activities: activities, + for: user, + as: :activity + ) end @doc "GET /api/v1/bookmarks" @@ -378,6 +401,10 @@ def bookmarks(%{assigns: %{user: user}} = conn, params) do conn |> add_link_headers(bookmarks) - |> render("index.json", %{activities: activities, for: user, as: :activity}) + |> render("index.json", + activities: activities, + for: user, + as: :activity + ) end end diff --git a/lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex b/lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex index 11df6fc4a..34eac97c5 100644 --- a/lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex @@ -6,47 +6,42 @@ defmodule Pleroma.Web.MastodonAPI.SubscriptionController do @moduledoc "The module represents functions to manage user subscriptions." use Pleroma.Web, :controller - alias Pleroma.Web.MastodonAPI.PushSubscriptionView, as: View alias Pleroma.Web.Push alias Pleroma.Web.Push.Subscription action_fallback(:errors) + plug(Pleroma.Web.ApiSpec.CastAndValidate) + plug(:restrict_push_enabled) plug(Pleroma.Plugs.OAuthScopesPlug, %{scopes: ["push"]}) - plug(Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug) + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.SubscriptionOperation # Creates PushSubscription # POST /api/v1/push/subscription # - def create(%{assigns: %{user: user, token: token}} = conn, params) do - with true <- Push.enabled(), - {:ok, _} <- Subscription.delete_if_exists(user, token), + def create(%{assigns: %{user: user, token: token}, body_params: params} = conn, _) do + with {:ok, _} <- Subscription.delete_if_exists(user, token), {:ok, subscription} <- Subscription.create(user, token, params) do - view = View.render("push_subscription.json", subscription: subscription) - json(conn, view) + render(conn, "show.json", subscription: subscription) end end # Gets PushSubscription # GET /api/v1/push/subscription # - def get(%{assigns: %{user: user, token: token}} = conn, _params) do - with true <- Push.enabled(), - {:ok, subscription} <- Subscription.get(user, token) do - view = View.render("push_subscription.json", subscription: subscription) - json(conn, view) + def show(%{assigns: %{user: user, token: token}} = conn, _params) do + with {:ok, subscription} <- Subscription.get(user, token) do + render(conn, "show.json", subscription: subscription) end end # Updates PushSubscription # PUT /api/v1/push/subscription # - def update(%{assigns: %{user: user, token: token}} = conn, params) do - with true <- Push.enabled(), - {:ok, subscription} <- Subscription.update(user, token, params) do - view = View.render("push_subscription.json", subscription: subscription) - json(conn, view) + def update(%{assigns: %{user: user, token: token}, body_params: params} = conn, _) do + with {:ok, subscription} <- Subscription.update(user, token, params) do + render(conn, "show.json", subscription: subscription) end end @@ -54,17 +49,26 @@ def update(%{assigns: %{user: user, token: token}} = conn, params) do # DELETE /api/v1/push/subscription # def delete(%{assigns: %{user: user, token: token}} = conn, _params) do - with true <- Push.enabled(), - {:ok, _response} <- Subscription.delete(user, token), + with {:ok, _response} <- Subscription.delete(user, token), do: json(conn, %{}) end + defp restrict_push_enabled(conn, _) do + if Push.enabled() do + conn + else + conn + |> render_error(:forbidden, "Web push subscription is disabled on this Pleroma instance") + |> halt() + end + end + # fallback action # def errors(conn, {:error, :not_found}) do conn |> put_status(:not_found) - |> json(dgettext("errors", "Not found")) + |> json(%{error: dgettext("errors", "Record not found")}) end def errors(conn, _) do diff --git a/lib/pleroma/web/mastodon_api/controllers/suggestion_controller.ex b/lib/pleroma/web/mastodon_api/controllers/suggestion_controller.ex index 0cdc7bd8d..f91df9ab7 100644 --- a/lib/pleroma/web/mastodon_api/controllers/suggestion_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/suggestion_controller.ex @@ -7,8 +7,26 @@ defmodule Pleroma.Web.MastodonAPI.SuggestionController do require Logger - @doc "GET /api/v1/suggestions" - def index(conn, _) do - json(conn, []) + plug(Pleroma.Web.ApiSpec.CastAndValidate) + plug(Pleroma.Plugs.OAuthScopesPlug, %{scopes: ["read"]} when action == :index) + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) end + + def index_operation do + %OpenApiSpex.Operation{ + tags: ["Suggestions"], + summary: "Follow suggestions (Not implemented)", + operationId: "SuggestionController.index", + responses: %{ + 200 => Pleroma.Web.ApiSpec.Helpers.empty_array_response() + } + } + end + + @doc "GET /api/v1/suggestions" + def index(conn, params), + do: Pleroma.Web.MastodonAPI.MastodonAPIController.empty_array(conn, params) end diff --git a/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex b/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex index 91f41416d..958567510 100644 --- a/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex @@ -6,17 +6,20 @@ defmodule Pleroma.Web.MastodonAPI.TimelineController do use Pleroma.Web, :controller import Pleroma.Web.ControllerHelper, - only: [add_link_headers: 2, add_link_headers: 3, truthy_param?: 1] + only: [add_link_headers: 2, add_link_headers: 3] alias Pleroma.Pagination + alias Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug alias Pleroma.Plugs.OAuthScopesPlug alias Pleroma.Plugs.RateLimiter alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub - # TODO: Replace with a macro when there is a Phoenix release with + plug(Pleroma.Web.ApiSpec.CastAndValidate) + plug(:skip_plug, EnsurePublicOrAuthenticatedPlug when action in [:public, :hashtag]) + + # TODO: Replace with a macro when there is a Phoenix release with the following commit in it: # https://github.com/phoenixframework/phoenix/commit/2e8c63c01fec4dde5467dbbbf9705ff9e780735e - # in it plug(RateLimiter, [name: :timeline, bucket_name: :direct_timeline] when action == :direct) plug(RateLimiter, [name: :timeline, bucket_name: :public_timeline] when action == :public) @@ -27,17 +30,25 @@ defmodule Pleroma.Web.MastodonAPI.TimelineController do plug(OAuthScopesPlug, %{scopes: ["read:statuses"]} when action in [:home, :direct]) plug(OAuthScopesPlug, %{scopes: ["read:lists"]} when action == :list) - plug(Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug when action != :public) + plug( + OAuthScopesPlug, + %{scopes: ["read:statuses"], fallback: :proceed_unauthenticated} + when action in [:public, :hashtag] + ) plug(:put_view, Pleroma.Web.MastodonAPI.StatusView) + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.TimelineOperation + # GET /api/v1/timelines/home def home(%{assigns: %{user: user}} = conn, params) do params = params + |> Map.new(fn {key, value} -> {to_string(key), value} end) |> Map.put("type", ["Create", "Announce"]) |> Map.put("blocking_user", user) |> Map.put("muting_user", user) + |> Map.put("reply_filtering_user", user) |> Map.put("user", user) recipients = [user.ap_id | User.following(user)] @@ -49,13 +60,18 @@ def home(%{assigns: %{user: user}} = conn, params) do conn |> add_link_headers(activities) - |> render("index.json", activities: activities, for: user, as: :activity) + |> render("index.json", + activities: activities, + for: user, + as: :activity + ) end # GET /api/v1/timelines/direct def direct(%{assigns: %{user: user}} = conn, params) do params = params + |> Map.new(fn {key, value} -> {to_string(key), value} end) |> Map.put("type", "Create") |> Map.put("blocking_user", user) |> Map.put("user", user) @@ -68,12 +84,18 @@ def direct(%{assigns: %{user: user}} = conn, params) do conn |> add_link_headers(activities) - |> render("index.json", activities: activities, for: user, as: :activity) + |> render("index.json", + activities: activities, + for: user, + as: :activity + ) end # GET /api/v1/timelines/public def public(%{assigns: %{user: user}} = conn, params) do - local_only = truthy_param?(params["local"]) + params = Map.new(params, fn {key, value} -> {to_string(key), value} end) + + local_only = params["local"] cfg_key = if local_only do @@ -84,24 +106,29 @@ def public(%{assigns: %{user: user}} = conn, params) do restrict? = Pleroma.Config.get([:restrict_unauthenticated, :timelines, cfg_key]) - if not (restrict? and is_nil(user)) do + if restrict? and is_nil(user) do + render_error(conn, :unauthorized, "authorization required for timeline view") + else activities = params |> Map.put("type", ["Create", "Announce"]) |> Map.put("local_only", local_only) |> Map.put("blocking_user", user) |> Map.put("muting_user", user) + |> Map.put("reply_filtering_user", user) |> ActivityPub.fetch_public_activities() conn |> add_link_headers(activities, %{"local" => local_only}) - |> render("index.json", activities: activities, for: user, as: :activity) - else - render_error(conn, :unauthorized, "authorization required for timeline view") + |> render("index.json", + activities: activities, + for: user, + as: :activity + ) end end - def hashtag_fetching(params, user, local_only) do + defp hashtag_fetching(params, user, local_only) do tags = [params["tag"], params["any"]] |> List.flatten() @@ -134,20 +161,25 @@ def hashtag_fetching(params, user, local_only) do # GET /api/v1/timelines/tag/:tag def hashtag(%{assigns: %{user: user}} = conn, params) do - local_only = truthy_param?(params["local"]) - + params = Map.new(params, fn {key, value} -> {to_string(key), value} end) + local_only = params["local"] activities = hashtag_fetching(params, user, local_only) conn |> add_link_headers(activities, %{"local" => local_only}) - |> render("index.json", activities: activities, for: user, as: :activity) + |> render("index.json", + activities: activities, + for: user, + as: :activity + ) end # GET /api/v1/timelines/list/:list_id - def list(%{assigns: %{user: user}} = conn, %{"list_id" => id} = params) do + def list(%{assigns: %{user: user}} = conn, %{list_id: id} = params) do with %Pleroma.List{title: _title, following: following} <- Pleroma.List.get(id, user) do params = params + |> Map.new(fn {key, value} -> {to_string(key), value} end) |> Map.put("type", "Create") |> Map.put("blocking_user", user) |> Map.put("user", user) @@ -164,7 +196,11 @@ def list(%{assigns: %{user: user}} = conn, %{"list_id" => id} = params) do |> ActivityPub.fetch_activities_bounded(following, params) |> Enum.reverse() - render(conn, "index.json", activities: activities, for: user, as: :activity) + render(conn, "index.json", + activities: activities, + for: user, + as: :activity + ) else _e -> render_error(conn, :forbidden, "Error.") end diff --git a/lib/pleroma/web/mastodon_api/views/account_view.ex b/lib/pleroma/web/mastodon_api/views/account_view.ex index 341dc2c91..04c419d2f 100644 --- a/lib/pleroma/web/mastodon_api/views/account_view.ex +++ b/lib/pleroma/web/mastodon_api/views/account_view.ex @@ -5,21 +5,41 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do use Pleroma.Web, :view + alias Pleroma.FollowingRelationship alias Pleroma.User + alias Pleroma.UserRelationship alias Pleroma.Web.CommonAPI.Utils alias Pleroma.Web.MastodonAPI.AccountView alias Pleroma.Web.MediaProxy def render("index.json", %{users: users} = opts) do + reading_user = opts[:for] + + relationships_opt = + cond do + Map.has_key?(opts, :relationships) -> + opts[:relationships] + + is_nil(reading_user) || !opts[:embed_relationships] -> + UserRelationship.view_relationships_option(nil, []) + + true -> + UserRelationship.view_relationships_option(reading_user, users) + end + + opts = Map.put(opts, :relationships, relationships_opt) + users |> render_many(AccountView, "show.json", opts) |> Enum.filter(&Enum.any?/1) end def render("show.json", %{user: user} = opts) do - if User.visible_for?(user, opts[:for]), - do: do_render("show.json", opts), - else: %{} + if User.visible_for?(user, opts[:for]) do + do_render("show.json", opts) + else + %{} + end end def render("mention.json", %{user: user}) do @@ -27,7 +47,7 @@ def render("mention.json", %{user: user}) do id: to_string(user.id), acct: user.nickname, username: username_from_nickname(user.nickname), - url: User.profile_url(user) + url: user.uri || user.ap_id } end @@ -35,34 +55,107 @@ def render("relationship.json", %{user: nil, target: _target}) do %{} end - def render("relationship.json", %{user: %User{} = user, target: %User{} = target}) do - follow_state = User.get_cached_follow_state(user, target) + def render( + "relationship.json", + %{user: %User{} = reading_user, target: %User{} = target} = opts + ) do + user_relationships = get_in(opts, [:relationships, :user_relationships]) + following_relationships = get_in(opts, [:relationships, :following_relationships]) - requested = - if follow_state && !User.following?(user, target) do - follow_state == "pending" + follow_state = + if following_relationships do + user_to_target_following_relation = + FollowingRelationship.find(following_relationships, reading_user, target) + + User.get_follow_state(reading_user, target, user_to_target_following_relation) else - false + User.get_follow_state(reading_user, target) end + followed_by = + if following_relationships do + case FollowingRelationship.find(following_relationships, target, reading_user) do + %{state: :follow_accept} -> true + _ -> false + end + else + User.following?(target, reading_user) + end + + # NOTE: adjust UserRelationship.view_relationships_option/2 on new relation-related flags %{ id: to_string(target.id), - following: User.following?(user, target), - followed_by: User.following?(target, user), - blocking: User.blocks_user?(user, target), - blocked_by: User.blocks_user?(target, user), - muting: User.mutes?(user, target), - muting_notifications: User.muted_notifications?(user, target), - subscribing: User.subscribed_to?(user, target), - requested: requested, - domain_blocking: User.blocks_domain?(user, target), - showing_reblogs: User.showing_reblogs?(user, target), + following: follow_state == :follow_accept, + followed_by: followed_by, + blocking: + UserRelationship.exists?( + user_relationships, + :block, + reading_user, + target, + &User.blocks_user?(&1, &2) + ), + blocked_by: + UserRelationship.exists?( + user_relationships, + :block, + target, + reading_user, + &User.blocks_user?(&1, &2) + ), + muting: + UserRelationship.exists?( + user_relationships, + :mute, + reading_user, + target, + &User.mutes?(&1, &2) + ), + muting_notifications: + UserRelationship.exists?( + user_relationships, + :notification_mute, + reading_user, + target, + &User.muted_notifications?(&1, &2) + ), + subscribing: + UserRelationship.exists?( + user_relationships, + :inverse_subscription, + target, + reading_user, + &User.subscribed_to?(&2, &1) + ), + requested: follow_state == :follow_pending, + domain_blocking: User.blocks_domain?(reading_user, target), + showing_reblogs: + not UserRelationship.exists?( + user_relationships, + :reblog_mute, + reading_user, + target, + &User.muting_reblogs?(&1, &2) + ), endorsed: false } end - def render("relationships.json", %{user: user, targets: targets}) do - render_many(targets, AccountView, "relationship.json", user: user, as: :target) + def render("relationships.json", %{user: user, targets: targets} = opts) do + relationships_opt = + cond do + Map.has_key?(opts, :relationships) -> + opts[:relationships] + + is_nil(user) -> + UserRelationship.view_relationships_option(nil, []) + + true -> + UserRelationship.view_relationships_option(user, targets) + end + + render_opts = %{as: :target, user: user, relationships: relationships_opt} + render_many(targets, AccountView, "relationship.json", render_opts) end defp do_render("show.json", %{user: user} = opts) do @@ -89,18 +182,27 @@ defp do_render("show.json", %{user: user} = opts) do bot = user.actor_type in ["Application", "Service"] emojis = - (user.source_data["tag"] || []) - |> Enum.filter(fn %{"type" => t} -> t == "Emoji" end) - |> Enum.map(fn %{"icon" => %{"url" => url}, "name" => name} -> + Enum.map(user.emoji, fn {shortcode, raw_url} -> + url = MediaProxy.url(raw_url) + %{ - "shortcode" => String.trim(name, ":"), - "url" => MediaProxy.url(url), - "static_url" => MediaProxy.url(url), - "visible_in_picker" => false + shortcode: shortcode, + url: url, + static_url: url, + visible_in_picker: false } end) - relationship = render("relationship.json", %{user: opts[:for], target: user}) + relationship = + if opts[:embed_relationships] do + render("relationship.json", %{ + user: opts[:for], + target: user, + relationships: opts[:relationships] + }) + else + %{} + end %{ id: to_string(user.id), @@ -113,7 +215,7 @@ defp do_render("show.json", %{user: user} = opts) do following_count: following_count, statuses_count: user.note_count, note: user.bio || "", - url: User.profile_url(user), + url: user.uri || user.ap_id, avatar: image, avatar_static: image, header: header, @@ -122,7 +224,7 @@ defp do_render("show.json", %{user: user} = opts) do fields: user.fields, bot: bot, source: %{ - note: Pleroma.HTML.strip_tags((user.bio || "") |> String.replace("
", "\n")), + note: prepare_user_bio(user), sensitive: false, fields: user.raw_fields, pleroma: %{ @@ -154,8 +256,20 @@ defp do_render("show.json", %{user: user} = opts) do |> maybe_put_follow_requests_count(user, opts[:for]) |> maybe_put_allow_following_move(user, opts[:for]) |> maybe_put_unread_conversation_count(user, opts[:for]) + |> maybe_put_unread_notification_count(user, opts[:for]) end + defp prepare_user_bio(%User{bio: ""}), do: "" + + defp prepare_user_bio(%User{bio: bio}) when is_binary(bio) do + bio + |> String.replace(~r(
), "\n") + |> Pleroma.HTML.strip_tags() + |> HtmlEntities.decode() + end + + defp prepare_user_bio(_), do: "" + defp username_from_nickname(string) when is_binary(string) do hd(String.split(string, "@")) end @@ -224,7 +338,11 @@ defp maybe_put_role(data, %User{id: user_id} = user, %User{id: user_id}) do defp maybe_put_role(data, _, _), do: data defp maybe_put_notification_settings(data, %User{id: user_id} = user, %User{id: user_id}) do - Kernel.put_in(data, [:pleroma, :notification_settings], user.notification_settings) + Kernel.put_in( + data, + [:pleroma, :notification_settings], + Map.from_struct(user.notification_settings) + ) end defp maybe_put_notification_settings(data, _, _), do: data @@ -251,6 +369,16 @@ defp maybe_put_unread_conversation_count(data, %User{id: user_id} = user, %User{ defp maybe_put_unread_conversation_count(data, _, _), do: data + defp maybe_put_unread_notification_count(data, %User{id: user_id}, %User{id: user_id} = user) do + Kernel.put_in( + data, + [:pleroma, :unread_notifications_count], + Pleroma.Notification.unread_notifications_count(user) + ) + end + + defp maybe_put_unread_notification_count(data, _, _), do: data + defp image_url(%{"url" => [%{"href" => href} | _]}), do: href defp image_url(_), do: nil end diff --git a/lib/pleroma/web/mastodon_api/views/app_view.ex b/lib/pleroma/web/mastodon_api/views/app_view.ex index d934e2107..36071cd25 100644 --- a/lib/pleroma/web/mastodon_api/views/app_view.ex +++ b/lib/pleroma/web/mastodon_api/views/app_view.ex @@ -7,6 +7,21 @@ defmodule Pleroma.Web.MastodonAPI.AppView do alias Pleroma.Web.OAuth.App + def render("index.json", %{apps: apps, count: count, page_size: page_size, admin: true}) do + %{ + apps: render_many(apps, Pleroma.Web.MastodonAPI.AppView, "show.json", %{admin: true}), + count: count, + page_size: page_size + } + end + + def render("show.json", %{admin: true, app: %App{} = app} = assigns) do + "show.json" + |> render(Map.delete(assigns, :admin)) + |> Map.put(:trusted, app.trusted) + |> Map.put(:id, app.id) + end + def render("show.json", %{app: %App{} = app}) do %{ id: app.id |> to_string, diff --git a/lib/pleroma/web/mastodon_api/views/filter_view.ex b/lib/pleroma/web/mastodon_api/views/filter_view.ex index 97fd1e83f..aeff646f5 100644 --- a/lib/pleroma/web/mastodon_api/views/filter_view.ex +++ b/lib/pleroma/web/mastodon_api/views/filter_view.ex @@ -7,11 +7,11 @@ defmodule Pleroma.Web.MastodonAPI.FilterView do alias Pleroma.Web.CommonAPI.Utils alias Pleroma.Web.MastodonAPI.FilterView - def render("filters.json", %{filters: filters} = opts) do - render_many(filters, FilterView, "filter.json", opts) + def render("index.json", %{filters: filters}) do + render_many(filters, FilterView, "show.json") end - def render("filter.json", %{filter: filter}) do + def render("show.json", %{filter: filter}) do expires_at = if filter.expires_at do Utils.to_masto_date(filter.expires_at) diff --git a/lib/pleroma/web/mastodon_api/views/instance_view.ex b/lib/pleroma/web/mastodon_api/views/instance_view.ex index 67214dbea..6a630eafa 100644 --- a/lib/pleroma/web/mastodon_api/views/instance_view.ex +++ b/lib/pleroma/web/mastodon_api/views/instance_view.ex @@ -5,10 +5,13 @@ defmodule Pleroma.Web.MastodonAPI.InstanceView do use Pleroma.Web, :view + alias Pleroma.Config + alias Pleroma.Web.ActivityPub.MRF + @mastodon_api_level "2.7.2" def render("show.json", _) do - instance = Pleroma.Config.get(:instance) + instance = Config.get(:instance) %{ uri: Pleroma.Web.base_url(), @@ -20,7 +23,7 @@ def render("show.json", _) do streaming_api: Pleroma.Web.Endpoint.websocket_url() }, stats: Pleroma.Stats.get_stats(), - thumbnail: Pleroma.Web.base_url() <> "/instance/thumbnail.jpeg", + thumbnail: instance_thumbnail(), languages: ["en"], registrations: Keyword.get(instance, :registrations_open), # Extra (not present in Mastodon): @@ -29,7 +32,64 @@ def render("show.json", _) do upload_limit: Keyword.get(instance, :upload_limit), avatar_upload_limit: Keyword.get(instance, :avatar_upload_limit), background_upload_limit: Keyword.get(instance, :background_upload_limit), - banner_upload_limit: Keyword.get(instance, :banner_upload_limit) + banner_upload_limit: Keyword.get(instance, :banner_upload_limit), + background_image: Keyword.get(instance, :background_image), + pleroma: %{ + metadata: %{ + features: features(), + federation: federation() + }, + vapid_public_key: Keyword.get(Pleroma.Web.Push.vapid_config(), :public_key) + } } end + + def features do + [ + "pleroma_api", + "mastodon_api", + "mastodon_api_streaming", + "polls", + "pleroma_explicit_addressing", + "shareable_emoji_packs", + "multifetch", + "pleroma:api/v1/notifications:include_types_filter", + if Config.get([:media_proxy, :enabled]) do + "media_proxy" + end, + if Config.get([:gopher, :enabled]) do + "gopher" + end, + if Config.get([:chat, :enabled]) do + "chat" + end, + if Config.get([:instance, :allow_relay]) do + "relay" + end, + if Config.get([:instance, :safe_dm_mentions]) do + "safe_dm_mentions" + end, + "pleroma_emoji_reactions" + ] + |> Enum.filter(& &1) + end + + def federation do + quarantined = Config.get([:instance, :quarantined_instances], []) + + if Config.get([:instance, :mrf_transparency]) do + {:ok, data} = MRF.describe() + + data + |> Map.merge(%{quarantined_instances: quarantined}) + else + %{} + end + |> Map.put(:enabled, Config.get([:instance, :federating])) + end + + defp instance_thumbnail do + Pleroma.Config.get([:instance, :instance_thumbnail]) || + "#{Pleroma.Web.base_url()}/instance/thumbnail.jpeg" + end end diff --git a/lib/pleroma/web/mastodon_api/views/marker_view.ex b/lib/pleroma/web/mastodon_api/views/marker_view.ex index 985368fe5..21d535d54 100644 --- a/lib/pleroma/web/mastodon_api/views/marker_view.ex +++ b/lib/pleroma/web/mastodon_api/views/marker_view.ex @@ -6,12 +6,16 @@ defmodule Pleroma.Web.MastodonAPI.MarkerView do use Pleroma.Web, :view def render("markers.json", %{markers: markers}) do - Enum.reduce(markers, %{}, fn m, acc -> - Map.put_new(acc, m.timeline, %{ - last_read_id: m.last_read_id, - version: m.lock_version, - updated_at: NaiveDateTime.to_iso8601(m.updated_at) - }) + Map.new(markers, fn m -> + {m.timeline, + %{ + last_read_id: m.last_read_id, + version: m.lock_version, + updated_at: NaiveDateTime.to_iso8601(m.updated_at), + pleroma: %{ + unread_count: m.unread_count + } + }} end) end end diff --git a/lib/pleroma/web/mastodon_api/views/notification_view.ex b/lib/pleroma/web/mastodon_api/views/notification_view.ex index 33145c484..c46ddcf55 100644 --- a/lib/pleroma/web/mastodon_api/views/notification_view.ex +++ b/lib/pleroma/web/mastodon_api/views/notification_view.ex @@ -8,24 +8,87 @@ defmodule Pleroma.Web.MastodonAPI.NotificationView do alias Pleroma.Activity alias Pleroma.Notification alias Pleroma.User + alias Pleroma.UserRelationship alias Pleroma.Web.CommonAPI alias Pleroma.Web.MastodonAPI.AccountView alias Pleroma.Web.MastodonAPI.NotificationView alias Pleroma.Web.MastodonAPI.StatusView - def render("index.json", %{notifications: notifications, for: user}) do - safe_render_many(notifications, NotificationView, "show.json", %{for: user}) + def render("index.json", %{notifications: notifications, for: reading_user} = opts) do + activities = Enum.map(notifications, & &1.activity) + + parent_activities = + activities + |> Enum.filter( + &(Activity.mastodon_notification_type(&1) in [ + "favourite", + "reblog", + "pleroma:emoji_reaction" + ]) + ) + |> Enum.map(& &1.data["object"]) + |> Activity.create_by_object_ap_id() + |> Activity.with_preloaded_object(:left) + |> Pleroma.Repo.all() + + relationships_opt = + cond do + Map.has_key?(opts, :relationships) -> + opts[:relationships] + + is_nil(reading_user) -> + UserRelationship.view_relationships_option(nil, []) + + true -> + move_activities_targets = + activities + |> Enum.filter(&(Activity.mastodon_notification_type(&1) == "move")) + |> Enum.map(&User.get_cached_by_ap_id(&1.data["target"])) + + actors = + activities + |> Enum.map(fn a -> User.get_cached_by_ap_id(a.data["actor"]) end) + |> Enum.filter(& &1) + |> Kernel.++(move_activities_targets) + + UserRelationship.view_relationships_option(reading_user, actors, subset: :source_mutes) + end + + opts = + opts + |> Map.put(:parent_activities, parent_activities) + |> Map.put(:relationships, relationships_opt) + + safe_render_many(notifications, NotificationView, "show.json", opts) end - def render("show.json", %{ - notification: %Notification{activity: activity} = notification, - for: user - }) do + def render( + "show.json", + %{ + notification: %Notification{activity: activity} = notification, + for: reading_user + } = opts + ) do actor = User.get_cached_by_ap_id(activity.data["actor"]) - parent_activity = Activity.get_create_by_object_ap_id(activity.data["object"]) + + parent_activity_fn = fn -> + if opts[:parent_activities] do + Activity.Queries.find_by_object_ap_id(opts[:parent_activities], activity.data["object"]) + else + Activity.get_create_by_object_ap_id(activity.data["object"]) + end + end + mastodon_type = Activity.mastodon_notification_type(activity) - with %{id: _} = account <- AccountView.render("show.json", %{user: actor, for: user}) do + # Note: :relationships contain user mutes (needed for :muted flag in :status) + status_render_opts = %{relationships: opts[:relationships]} + + with %{id: _} = account <- + AccountView.render( + "show.json", + %{user: actor, for: reading_user} + ) do response = %{ id: to_string(notification.id), type: mastodon_type, @@ -38,22 +101,24 @@ def render("show.json", %{ case mastodon_type do "mention" -> - put_status(response, activity, user) + put_status(response, activity, reading_user, status_render_opts) "favourite" -> - put_status(response, parent_activity, user) + put_status(response, parent_activity_fn.(), reading_user, status_render_opts) "reblog" -> - put_status(response, parent_activity, user) + put_status(response, parent_activity_fn.(), reading_user, status_render_opts) "move" -> - put_target(response, activity, user) - - "follow" -> - response + put_target(response, activity, reading_user, %{}) "pleroma:emoji_reaction" -> - put_status(response, parent_activity, user) |> put_emoji(activity) + response + |> put_status(parent_activity_fn.(), reading_user, status_render_opts) + |> put_emoji(activity) + + type when type in ["follow", "follow_request"] -> + response _ -> nil @@ -64,16 +129,21 @@ def render("show.json", %{ end defp put_emoji(response, activity) do - response - |> Map.put(:emoji, activity.data["content"]) + Map.put(response, :emoji, activity.data["content"]) end - defp put_status(response, activity, user) do - Map.put(response, :status, StatusView.render("show.json", %{activity: activity, for: user})) + defp put_status(response, activity, reading_user, opts) do + status_render_opts = Map.merge(opts, %{activity: activity, for: reading_user}) + status_render = StatusView.render("show.json", status_render_opts) + + Map.put(response, :status, status_render) end - defp put_target(response, activity, user) do - target = User.get_cached_by_ap_id(activity.data["target"]) - Map.put(response, :target, AccountView.render("show.json", %{user: target, for: user})) + defp put_target(response, activity, reading_user, opts) do + target_user = User.get_cached_by_ap_id(activity.data["target"]) + target_render_opts = Map.merge(opts, %{user: target_user, for: reading_user}) + target_render = AccountView.render("show.json", target_render_opts) + + Map.put(response, :target, target_render) end end diff --git a/lib/pleroma/web/mastodon_api/views/poll_view.ex b/lib/pleroma/web/mastodon_api/views/poll_view.ex index 40edbb213..59a5deb28 100644 --- a/lib/pleroma/web/mastodon_api/views/poll_view.ex +++ b/lib/pleroma/web/mastodon_api/views/poll_view.ex @@ -19,6 +19,7 @@ def render("show.json", %{object: object, multiple: multiple, options: options} expired: expired, multiple: multiple, votes_count: votes_count, + voters_count: (multiple || nil) && voters_count(object), options: options, voted: voted?(params), emojis: Pleroma.Web.MastodonAPI.StatusView.build_emojis(object.data["emoji"]) @@ -62,6 +63,12 @@ defp options_and_votes_count(options) do end) end + defp voters_count(%{data: %{"voters" => [_ | _] = voters}}) do + length(voters) + end + + defp voters_count(_), do: 0 + defp voted?(%{object: object} = opts) do if opts[:for] do existing_votes = Pleroma.Web.ActivityPub.Utils.get_existing_votes(opts[:for].ap_id, object) diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex index f7469cdff..8e3715093 100644 --- a/lib/pleroma/web/mastodon_api/views/status_view.ex +++ b/lib/pleroma/web/mastodon_api/views/status_view.ex @@ -13,6 +13,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do alias Pleroma.Object alias Pleroma.Repo alias Pleroma.User + alias Pleroma.UserRelationship alias Pleroma.Web.CommonAPI alias Pleroma.Web.CommonAPI.Utils alias Pleroma.Web.MastodonAPI.AccountView @@ -44,7 +45,7 @@ defp get_replied_to_activities(activities) do end) end - defp get_user(ap_id) do + def get_user(ap_id, fake_record_fallback \\ true) do cond do user = User.get_cached_by_ap_id(ap_id) -> user @@ -52,8 +53,12 @@ defp get_user(ap_id) do user = User.get_by_guessed_nickname(ap_id) -> user - true -> + fake_record_fallback -> + # TODO: refactor (fake records is never a good idea) User.error_user(ap_id) + + true -> + nil end end @@ -71,10 +76,47 @@ defp reblogged?(activity, user) do end def render("index.json", opts) do - replied_to_activities = get_replied_to_activities(opts.activities) - opts = Map.put(opts, :replied_to_activities, replied_to_activities) + reading_user = opts[:for] - safe_render_many(opts.activities, StatusView, "show.json", opts) + # To do: check AdminAPIControllerTest on the reasons behind nil activities in the list + activities = Enum.filter(opts.activities, & &1) + replied_to_activities = get_replied_to_activities(activities) + + parent_activities = + activities + |> Enum.filter(&(&1.data["type"] == "Announce" && &1.data["object"])) + |> Enum.map(&Object.normalize(&1).data["id"]) + |> Activity.create_by_object_ap_id() + |> Activity.with_preloaded_object(:left) + |> Activity.with_preloaded_bookmark(reading_user) + |> Activity.with_set_thread_muted_field(reading_user) + |> Repo.all() + + relationships_opt = + cond do + Map.has_key?(opts, :relationships) -> + opts[:relationships] + + is_nil(reading_user) -> + UserRelationship.view_relationships_option(nil, []) + + true -> + # Note: unresolved users are filtered out + actors = + (activities ++ parent_activities) + |> Enum.map(&get_user(&1.data["actor"], false)) + |> Enum.filter(& &1) + + UserRelationship.view_relationships_option(reading_user, actors, subset: :source_mutes) + end + + opts = + opts + |> Map.put(:replied_to_activities, replied_to_activities) + |> Map.put(:parent_activities, parent_activities) + |> Map.put(:relationships, relationships_opt) + + safe_render_many(activities, StatusView, "show.json", opts) end def render( @@ -85,17 +127,25 @@ def render( created_at = Utils.to_masto_date(activity.data["published"]) activity_object = Object.normalize(activity) - reblogged_activity = - Activity.create_by_object_ap_id(activity_object.data["id"]) - |> Activity.with_preloaded_bookmark(opts[:for]) - |> Activity.with_set_thread_muted_field(opts[:for]) - |> Repo.one() + reblogged_parent_activity = + if opts[:parent_activities] do + Activity.Queries.find_by_object_ap_id( + opts[:parent_activities], + activity_object.data["id"] + ) + else + Activity.create_by_object_ap_id(activity_object.data["id"]) + |> Activity.with_preloaded_bookmark(opts[:for]) + |> Activity.with_set_thread_muted_field(opts[:for]) + |> Repo.one() + end - reblogged = render("show.json", Map.put(opts, :activity, reblogged_activity)) + reblog_rendering_opts = Map.put(opts, :activity, reblogged_parent_activity) + reblogged = render("show.json", reblog_rendering_opts) favorited = opts[:for] && opts[:for].ap_id in (activity_object.data["likes"] || []) - bookmarked = Activity.get_bookmark(reblogged_activity, opts[:for]) != nil + bookmarked = Activity.get_bookmark(reblogged_parent_activity, opts[:for]) != nil mentions = activity.recipients @@ -107,7 +157,11 @@ def render( id: to_string(activity.id), uri: activity_object.data["id"], url: activity_object.data["id"], - account: AccountView.render("show.json", %{user: user, for: opts[:for]}), + account: + AccountView.render("show.json", %{ + user: user, + for: opts[:for] + }), in_reply_to_id: nil, in_reply_to_account_id: nil, reblog: reblogged, @@ -116,7 +170,7 @@ def render( reblogs_count: 0, replies_count: 0, favourites_count: 0, - reblogged: reblogged?(reblogged_activity, opts[:for]), + reblogged: reblogged?(reblogged_parent_activity, opts[:for]), favourited: present?(favorited), bookmarked: present?(bookmarked), muted: false, @@ -183,9 +237,10 @@ def render("show.json", %{activity: %{data: %{"object" => _object}} = activity} end thread_muted? = - case activity.thread_muted? do - thread_muted? when is_boolean(thread_muted?) -> thread_muted? - nil -> (opts[:for] && CommonAPI.thread_muted?(opts[:for], activity)) || false + cond do + is_nil(opts[:for]) -> false + is_boolean(activity.thread_muted?) -> activity.thread_muted? + true -> CommonAPI.thread_muted?(opts[:for], activity) end attachment_data = object.data["attachment"] || [] @@ -253,11 +308,26 @@ def render("show.json", %{activity: %{data: %{"object" => _object}} = activity} _ -> [] end + # Status muted state (would do 1 request per status unless user mutes are preloaded) + muted = + thread_muted? || + UserRelationship.exists?( + get_in(opts, [:relationships, :user_relationships]), + :mute, + opts[:for], + user, + fn for_user, user -> User.mutes?(for_user, user) end + ) + %{ id: to_string(activity.id), uri: object.data["id"], url: url, - account: AccountView.render("show.json", %{user: user, for: opts[:for]}), + account: + AccountView.render("show.json", %{ + user: user, + for: opts[:for] + }), in_reply_to_id: reply_to && to_string(reply_to.id), in_reply_to_account_id: reply_to_user && to_string(reply_to_user.id), reblog: nil, @@ -270,7 +340,7 @@ def render("show.json", %{activity: %{data: %{"object" => _object}} = activity} reblogged: reblogged?(activity, opts[:for]), favourited: present?(favorited), bookmarked: present?(bookmarked), - muted: thread_muted? || User.mutes?(opts[:for], user), + muted: muted, pinned: pinned?(activity, user), sensitive: sensitive, spoiler_text: summary, @@ -366,27 +436,6 @@ def render("attachment.json", %{attachment: attachment}) do } end - def render("listen.json", %{activity: %Activity{data: %{"type" => "Listen"}} = activity} = opts) do - object = Object.normalize(activity) - - user = get_user(activity.data["actor"]) - created_at = Utils.to_masto_date(activity.data["published"]) - - %{ - id: activity.id, - account: AccountView.render("show.json", %{user: user, for: opts[:for]}), - created_at: created_at, - title: object.data["title"] |> HTML.strip_tags(), - artist: object.data["artist"] |> HTML.strip_tags(), - album: object.data["album"] |> HTML.strip_tags(), - length: object.data["length"] - } - end - - def render("listens.json", opts) do - safe_render_many(opts.activities, StatusView, "listen.json", opts) - end - def render("context.json", %{activity: activity, activities: activities, user: user}) do %{ancestors: ancestors, descendants: descendants} = activities @@ -421,7 +470,7 @@ def get_reply_to(%{data: %{"object" => _object}} = activity, _) do end def render_content(%{data: %{"type" => object_type}} = object) - when object_type in ["Video", "Event"] do + when object_type in ["Video", "Event", "Audio"] do with name when not is_nil(name) and name != "" <- object.data["name"] do "

#{name}

#{object.data["content"]}" else @@ -453,11 +502,9 @@ def render_content(object), do: object.data["content"] || "" """ @spec build_tags(list(any())) :: list(map()) def build_tags(object_tags) when is_list(object_tags) do - object_tags = for tag when is_binary(tag) <- object_tags, do: tag - - Enum.reduce(object_tags, [], fn tag, tags -> - tags ++ [%{name: tag, url: "/tag/#{URI.encode(tag)}"}] - end) + object_tags + |> Enum.filter(&is_binary/1) + |> Enum.map(&%{name: &1, url: "/tag/#{URI.encode(&1)}"}) end def build_tags(_), do: [] diff --git a/lib/pleroma/web/mastodon_api/views/push_subscription_view.ex b/lib/pleroma/web/mastodon_api/views/subscription_view.ex similarity index 77% rename from lib/pleroma/web/mastodon_api/views/push_subscription_view.ex rename to lib/pleroma/web/mastodon_api/views/subscription_view.ex index d32cef6e2..7c67cc924 100644 --- a/lib/pleroma/web/mastodon_api/views/push_subscription_view.ex +++ b/lib/pleroma/web/mastodon_api/views/subscription_view.ex @@ -2,11 +2,11 @@ # Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only -defmodule Pleroma.Web.MastodonAPI.PushSubscriptionView do +defmodule Pleroma.Web.MastodonAPI.SubscriptionView do use Pleroma.Web, :view alias Pleroma.Web.Push - def render("push_subscription.json", %{subscription: subscription}) do + def render("show.json", %{subscription: subscription}) do %{ id: to_string(subscription.id), endpoint: subscription.endpoint, diff --git a/lib/pleroma/web/mastodon_api/websocket_handler.ex b/lib/pleroma/web/mastodon_api/websocket_handler.ex index 5652a37c1..94e4595d8 100644 --- a/lib/pleroma/web/mastodon_api/websocket_handler.ex +++ b/lib/pleroma/web/mastodon_api/websocket_handler.ex @@ -12,29 +12,19 @@ defmodule Pleroma.Web.MastodonAPI.WebsocketHandler do @behaviour :cowboy_websocket - @streams [ - "public", - "public:local", - "public:media", - "public:local:media", - "user", - "user:notification", - "direct", - "list", - "hashtag" - ] - @anonymous_streams ["public", "public:local", "hashtag"] - - # Handled by periodic keepalive in Pleroma.Web.Streamer.Ping. - @timeout :infinity + # Client ping period. + @tick :timer.seconds(30) + # Cowboy timeout period. + @timeout :timer.seconds(60) + # Hibernate every X messages + @hibernate_every 100 def init(%{qs: qs} = req, state) do - with params <- :cow_qs.parse_qs(qs), + with params <- Enum.into(:cow_qs.parse_qs(qs), %{}), sec_websocket <- :cowboy_req.header("sec-websocket-protocol", req, nil), - access_token <- List.keyfind(params, "access_token", 0), - {_, stream} <- List.keyfind(params, "stream", 0), - {:ok, user} <- allow_request(stream, [access_token, sec_websocket]), - topic when is_binary(topic) <- expand_topic(stream, params) do + access_token <- Map.get(params, "access_token"), + {:ok, user} <- authenticate_request(access_token, sec_websocket), + {:ok, topic} <- Streamer.get_topic(Map.get(params, "stream"), user, params) do req = if sec_websocket do :cowboy_req.set_resp_header("sec-websocket-protocol", sec_websocket, req) @@ -42,43 +32,70 @@ def init(%{qs: qs} = req, state) do req end - {:cowboy_websocket, req, %{user: user, topic: topic}, %{idle_timeout: @timeout}} + {:cowboy_websocket, req, %{user: user, topic: topic, count: 0, timer: nil}, + %{idle_timeout: @timeout}} else - {:error, code} -> - Logger.debug("#{__MODULE__} denied connection: #{inspect(code)} - #{inspect(req)}") - {:ok, req} = :cowboy_req.reply(code, req) + {:error, :bad_topic} -> + Logger.debug("#{__MODULE__} bad topic #{inspect(req)}") + {:ok, req} = :cowboy_req.reply(404, req) {:ok, req, state} - error -> - Logger.debug("#{__MODULE__} denied connection: #{inspect(error)} - #{inspect(req)}") - {:ok, req} = :cowboy_req.reply(400, req) + {:error, :unauthorized} -> + Logger.debug("#{__MODULE__} authentication error: #{inspect(req)}") + {:ok, req} = :cowboy_req.reply(401, req) {:ok, req, state} end end def websocket_init(state) do - send(self(), :subscribe) - {:ok, state} - end - - # We never receive messages. - def websocket_handle(_frame, state) do - {:ok, state} - end - - def websocket_info(:subscribe, state) do Logger.debug( "#{__MODULE__} accepted websocket connection for user #{ (state.user || %{id: "anonymous"}).id }, topic #{state.topic}" ) - Streamer.add_socket(state.topic, streamer_socket(state)) + Streamer.add_socket(state.topic, state.user) + {:ok, %{state | timer: timer()}} + end + + # Client's Pong frame. + def websocket_handle(:pong, state) do + if state.timer, do: Process.cancel_timer(state.timer) + {:ok, %{state | timer: timer()}} + end + + # We never receive messages. + def websocket_handle(frame, state) do + Logger.error("#{__MODULE__} received frame: #{inspect(frame)}") {:ok, state} end + def websocket_info({:render_with_user, view, template, item}, state) do + user = %User{} = User.get_cached_by_ap_id(state.user.ap_id) + + unless Streamer.filtered_by_user?(user, item) do + websocket_info({:text, view.render(template, item, user)}, %{state | user: user}) + else + {:ok, state} + end + end + def websocket_info({:text, message}, state) do - {:reply, {:text, message}, state} + # If the websocket processed X messages, force an hibernate/GC. + # We don't hibernate at every message to balance CPU usage/latency with RAM usage. + if state.count > @hibernate_every do + {:reply, {:text, message}, %{state | count: 0}, :hibernate} + else + {:reply, {:text, message}, %{state | count: state.count + 1}} + end + end + + # Ping tick. We don't re-queue a timer there, it is instead queued when :pong is received. + # As we hibernate there, reset the count to 0. + # If the client misses :pong, Cowboy will automatically timeout the connection after + # `@idle_timeout`. + def websocket_info(:tick, state) do + {:reply, :ping, %{state | timer: nil, count: 0}, :hibernate} end def terminate(reason, _req, state) do @@ -88,56 +105,29 @@ def terminate(reason, _req, state) do }, topic #{state.topic || "?"}: #{inspect(reason)}" ) - Streamer.remove_socket(state.topic, streamer_socket(state)) + Streamer.remove_socket(state.topic) :ok end # Public streams without authentication. - defp allow_request(stream, [nil, nil]) when stream in @anonymous_streams do + defp authenticate_request(nil, nil) do {:ok, nil} end # Authenticated streams. - defp allow_request(stream, [access_token, sec_websocket]) when stream in @streams do - token = - with {"access_token", token} <- access_token do - token - else - _ -> sec_websocket - end + defp authenticate_request(access_token, sec_websocket) do + token = access_token || sec_websocket with true <- is_bitstring(token), %Token{user_id: user_id} <- Repo.get_by(Token, token: token), user = %User{} <- User.get_cached_by_id(user_id) do {:ok, user} else - _ -> {:error, 403} + _ -> {:error, :unauthorized} end end - # Not authenticated. - defp allow_request(stream, _) when stream in @streams, do: {:error, 403} - - # No matching stream. - defp allow_request(_, _), do: {:error, 404} - - defp expand_topic("hashtag", params) do - case List.keyfind(params, "tag", 0) do - {_, tag} -> "hashtag:#{tag}" - _ -> nil - end - end - - defp expand_topic("list", params) do - case List.keyfind(params, "list", 0) do - {_, list} -> "list:#{list}" - _ -> nil - end - end - - defp expand_topic(topic, _), do: topic - - defp streamer_socket(state) do - %{transport_pid: self(), assigns: state} + defp timer do + Process.send_after(self(), :tick, @tick) end end diff --git a/lib/pleroma/web/media_proxy/invalidation.ex b/lib/pleroma/web/media_proxy/invalidation.ex new file mode 100644 index 000000000..c037ff13e --- /dev/null +++ b/lib/pleroma/web/media_proxy/invalidation.ex @@ -0,0 +1,26 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.MediaProxy.Invalidation do + @moduledoc false + + @callback purge(list(String.t()), map()) :: {:ok, String.t()} | {:error, String.t()} + + alias Pleroma.Config + + @spec purge(list(String.t())) :: {:ok, String.t()} | {:error, String.t()} + def purge(urls) do + [:media_proxy, :invalidation, :enabled] + |> Config.get() + |> do_purge(urls) + end + + defp do_purge(true, urls) do + provider = Config.get([:media_proxy, :invalidation, :provider]) + options = Config.get(provider) + provider.purge(urls, options) + end + + defp do_purge(_, _), do: :ok +end diff --git a/lib/pleroma/web/media_proxy/invalidations/http.ex b/lib/pleroma/web/media_proxy/invalidations/http.ex new file mode 100644 index 000000000..07248df6e --- /dev/null +++ b/lib/pleroma/web/media_proxy/invalidations/http.ex @@ -0,0 +1,40 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.MediaProxy.Invalidation.Http do + @moduledoc false + @behaviour Pleroma.Web.MediaProxy.Invalidation + + require Logger + + @impl Pleroma.Web.MediaProxy.Invalidation + def purge(urls, opts) do + method = Map.get(opts, :method, :purge) + headers = Map.get(opts, :headers, []) + options = Map.get(opts, :options, []) + + Logger.debug("Running cache purge: #{inspect(urls)}") + + Enum.each(urls, fn url -> + with {:error, error} <- do_purge(method, url, headers, options) do + Logger.error("Error while cache purge: url - #{url}, error: #{inspect(error)}") + end + end) + + {:ok, "success"} + end + + defp do_purge(method, url, headers, options) do + case Pleroma.HTTP.request(method, url, "", headers, options) do + {:ok, %{status: status} = env} when 400 <= status and status < 500 -> + {:error, env} + + {:error, error} = error -> + error + + _ -> + {:ok, "success"} + end + end +end diff --git a/lib/pleroma/web/media_proxy/invalidations/script.ex b/lib/pleroma/web/media_proxy/invalidations/script.ex new file mode 100644 index 000000000..6be782132 --- /dev/null +++ b/lib/pleroma/web/media_proxy/invalidations/script.ex @@ -0,0 +1,41 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.MediaProxy.Invalidation.Script do + @moduledoc false + + @behaviour Pleroma.Web.MediaProxy.Invalidation + + require Logger + + @impl Pleroma.Web.MediaProxy.Invalidation + def purge(urls, %{script_path: script_path} = _options) do + args = + urls + |> List.wrap() + |> Enum.uniq() + |> Enum.join(" ") + + path = Path.expand(script_path) + + Logger.debug("Running cache purge: #{inspect(urls)}, #{path}") + + case do_purge(path, [args]) do + {result, exit_status} when exit_status > 0 -> + Logger.error("Error while cache purge: #{inspect(result)}") + {:error, inspect(result)} + + _ -> + {:ok, "success"} + end + end + + def purge(_, _), do: {:error, "not found script path"} + + defp do_purge(path, args) do + System.cmd(path, args) + rescue + error -> {inspect(error), 1} + 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 1a09ac62a..4657a4383 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -4,6 +4,7 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do use Pleroma.Web, :controller + alias Pleroma.ReverseProxy alias Pleroma.Web.MediaProxy diff --git a/lib/pleroma/web/metadata.ex b/lib/pleroma/web/metadata.ex index c9aac27dc..a9f70c43e 100644 --- a/lib/pleroma/web/metadata.ex +++ b/lib/pleroma/web/metadata.ex @@ -6,7 +6,12 @@ defmodule Pleroma.Web.Metadata do alias Phoenix.HTML def build_tags(params) do - Enum.reduce(Pleroma.Config.get([__MODULE__, :providers], []), "", fn parser, acc -> + providers = [ + Pleroma.Web.Metadata.Providers.RestrictIndexing + | Pleroma.Config.get([__MODULE__, :providers], []) + ] + + Enum.reduce(providers, "", fn parser, acc -> rendered_html = params |> parser.build_tags() diff --git a/lib/pleroma/web/metadata/opengraph.ex b/lib/pleroma/web/metadata/opengraph.ex index 21446ac77..68c871e71 100644 --- a/lib/pleroma/web/metadata/opengraph.ex +++ b/lib/pleroma/web/metadata/opengraph.ex @@ -68,7 +68,7 @@ def build_tags(%{user: user}) do property: "og:title", content: Utils.user_name_string(user) ], []}, - {:meta, [property: "og:url", content: User.profile_url(user)], []}, + {:meta, [property: "og:url", content: user.uri || user.ap_id], []}, {:meta, [property: "og:description", content: truncated_bio], []}, {:meta, [property: "og:type", content: "website"], []}, {:meta, [property: "og:image", content: Utils.attachment_url(User.avatar_url(user))], []}, diff --git a/lib/pleroma/web/metadata/restrict_indexing.ex b/lib/pleroma/web/metadata/restrict_indexing.ex new file mode 100644 index 000000000..f15607896 --- /dev/null +++ b/lib/pleroma/web/metadata/restrict_indexing.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.Web.Metadata.Providers.RestrictIndexing do + @behaviour Pleroma.Web.Metadata.Providers.Provider + + @moduledoc """ + Restricts indexing of remote users. + """ + + @impl true + def build_tags(%{user: %{local: false}}) do + [ + {:meta, + [ + name: "robots", + content: "noindex, noarchive" + ], []} + ] + end + + @impl true + def build_tags(%{user: %{local: true}}), do: [] +end diff --git a/lib/pleroma/web/mongooseim/mongoose_im_controller.ex b/lib/pleroma/web/mongooseim/mongoose_im_controller.ex index 04d823b36..6cbbe8fd8 100644 --- a/lib/pleroma/web/mongooseim/mongoose_im_controller.ex +++ b/lib/pleroma/web/mongooseim/mongoose_im_controller.ex @@ -5,7 +5,7 @@ defmodule Pleroma.Web.MongooseIM.MongooseIMController do use Pleroma.Web, :controller - alias Comeonin.Pbkdf2 + alias Pleroma.Plugs.AuthenticationPlug alias Pleroma.Plugs.RateLimiter alias Pleroma.Repo alias Pleroma.User @@ -14,7 +14,7 @@ defmodule Pleroma.Web.MongooseIM.MongooseIMController do plug(RateLimiter, [name: :authentication, params: ["user"]] when action == :check_password) def user_exists(conn, %{"user" => username}) do - with %User{} <- Repo.get_by(User, nickname: username, local: true) do + with %User{} <- Repo.get_by(User, nickname: username, local: true, deactivated: false) do conn |> json(true) else @@ -26,9 +26,9 @@ def user_exists(conn, %{"user" => username}) do end def check_password(conn, %{"user" => username, "pass" => password}) do - with %User{password_hash: password_hash} <- + with %User{password_hash: password_hash, deactivated: false} <- Repo.get_by(User, nickname: username, local: true), - true <- Pbkdf2.checkpw(password, password_hash) do + true <- AuthenticationPlug.checkpw(password, password_hash) do conn |> json(true) else diff --git a/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex b/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex index 30838b1eb..721b599d4 100644 --- a/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex +++ b/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex @@ -9,8 +9,8 @@ defmodule Pleroma.Web.Nodeinfo.NodeinfoController do alias Pleroma.Stats alias Pleroma.User alias Pleroma.Web - alias Pleroma.Web.ActivityPub.MRF alias Pleroma.Web.Federator.Publisher + alias Pleroma.Web.MastodonAPI.InstanceView def schemas(conn, _params) do response = %{ @@ -34,50 +34,12 @@ def schemas(conn, _params) do def raw_nodeinfo do stats = Stats.get_stats() - quarantined = Config.get([:instance, :quarantined_instances], []) - staff_accounts = User.all_superusers() |> Enum.map(fn u -> u.ap_id end) - federation_response = - if Config.get([:instance, :mrf_transparency]) do - {:ok, data} = MRF.describe() - - data - |> Map.merge(%{quarantined_instances: quarantined}) - else - %{} - end - |> Map.put(:enabled, Config.get([:instance, :federating])) - - features = - [ - "pleroma_api", - "mastodon_api", - "mastodon_api_streaming", - "polls", - "pleroma_explicit_addressing", - "shareable_emoji_packs", - "multifetch", - "pleroma:api/v1/notifications:include_types_filter", - if Config.get([:media_proxy, :enabled]) do - "media_proxy" - end, - if Config.get([:gopher, :enabled]) do - "gopher" - end, - if Config.get([:chat, :enabled]) do - "chat" - end, - if Config.get([:instance, :allow_relay]) do - "relay" - end, - if Config.get([:instance, :safe_dm_mentions]) do - "safe_dm_mentions" - end - ] - |> Enum.filter(& &1) + features = InstanceView.features() + federation = InstanceView.federation() %{ version: "2.0", @@ -105,7 +67,7 @@ def raw_nodeinfo do enabled: false }, staffAccounts: staff_accounts, - federation: federation_response, + federation: federation, pollLimits: Config.get([:instance, :poll_limits]), postFormats: Config.get([:instance, :allowed_post_formats]), uploadLimits: %{ diff --git a/lib/pleroma/web/oauth/app.ex b/lib/pleroma/web/oauth/app.ex index 01ed326f4..6a6d5f2e2 100644 --- a/lib/pleroma/web/oauth/app.ex +++ b/lib/pleroma/web/oauth/app.ex @@ -5,6 +5,7 @@ defmodule Pleroma.Web.OAuth.App do use Ecto.Schema import Ecto.Changeset + import Ecto.Query alias Pleroma.Repo @type t :: %__MODULE__{} @@ -16,14 +17,24 @@ defmodule Pleroma.Web.OAuth.App do field(:website, :string) field(:client_id, :string) field(:client_secret, :string) + field(:trusted, :boolean, default: false) + + has_many(:oauth_authorizations, Pleroma.Web.OAuth.Authorization, on_delete: :delete_all) + has_many(:oauth_tokens, Pleroma.Web.OAuth.Token, on_delete: :delete_all) timestamps() end + @spec changeset(App.t(), map()) :: Ecto.Changeset.t() + def changeset(struct, params) do + cast(struct, params, [:client_name, :redirect_uris, :scopes, :website, :trusted]) + end + + @spec register_changeset(App.t(), map()) :: Ecto.Changeset.t() def register_changeset(struct, params \\ %{}) do changeset = struct - |> cast(params, [:client_name, :redirect_uris, :scopes, :website]) + |> changeset(params) |> validate_required([:client_name, :redirect_uris, :scopes]) if changeset.valid? do @@ -41,6 +52,21 @@ def register_changeset(struct, params \\ %{}) do end end + @spec create(map()) :: {:ok, App.t()} | {:error, Ecto.Changeset.t()} + def create(params) do + with changeset <- __MODULE__.register_changeset(%__MODULE__{}, params) do + Repo.insert(changeset) + end + end + + @spec update(map()) :: {:ok, App.t()} | {:error, Ecto.Changeset.t()} + def update(params) do + with %__MODULE__{} = app <- Repo.get(__MODULE__, params["id"]), + changeset <- changeset(app, params) do + Repo.update(changeset) + end + end + @doc """ Gets app by attrs or create new with attrs. And updates the scopes if need. @@ -65,4 +91,58 @@ defp update_scopes(%__MODULE__{} = app, scopes) do |> change(%{scopes: scopes}) |> Repo.update() end + + @spec search(map()) :: {:ok, [App.t()], non_neg_integer()} + def search(params) do + query = from(a in __MODULE__) + + query = + if params[:client_name] do + from(a in query, where: a.client_name == ^params[:client_name]) + else + query + end + + query = + if params[:client_id] do + from(a in query, where: a.client_id == ^params[:client_id]) + else + query + end + + query = + if Map.has_key?(params, :trusted) do + from(a in query, where: a.trusted == ^params[:trusted]) + else + query + end + + query = + from(u in query, + limit: ^params[:page_size], + offset: ^((params[:page] - 1) * params[:page_size]) + ) + + count = Repo.aggregate(__MODULE__, :count, :id) + + {:ok, Repo.all(query), count} + end + + @spec destroy(pos_integer()) :: {:ok, App.t()} | {:error, Ecto.Changeset.t()} + def destroy(id) do + with %__MODULE__{} = app <- Repo.get(__MODULE__, id) do + Repo.delete(app) + end + end + + @spec errors(Ecto.Changeset.t()) :: map() + def errors(changeset) do + Enum.reduce(changeset.errors, %{}, fn + {:client_name, {error, _}}, acc -> + Map.put(acc, :name, error) + + {key, {error, _}}, acc -> + Map.put(acc, key, error) + end) + end end diff --git a/lib/pleroma/web/oauth/mfa_controller.ex b/lib/pleroma/web/oauth/mfa_controller.ex new file mode 100644 index 000000000..53e19f82e --- /dev/null +++ b/lib/pleroma/web/oauth/mfa_controller.ex @@ -0,0 +1,97 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.OAuth.MFAController do + @moduledoc """ + The model represents api to use Multi Factor authentications. + """ + + use Pleroma.Web, :controller + + alias Pleroma.MFA + alias Pleroma.Web.Auth.TOTPAuthenticator + alias Pleroma.Web.OAuth.MFAView, as: View + alias Pleroma.Web.OAuth.OAuthController + alias Pleroma.Web.OAuth.Token + + plug(:fetch_session when action in [:show, :verify]) + plug(:fetch_flash when action in [:show, :verify]) + + @doc """ + Display form to input mfa code or recovery code. + """ + def show(conn, %{"mfa_token" => mfa_token} = params) do + template = Map.get(params, "challenge_type", "totp") + + conn + |> put_view(View) + |> render("#{template}.html", %{ + mfa_token: mfa_token, + redirect_uri: params["redirect_uri"], + state: params["state"] + }) + end + + @doc """ + Verification code and continue authorization. + """ + def verify(conn, %{"mfa" => %{"mfa_token" => mfa_token} = mfa_params} = _) do + with {:ok, %{user: user, authorization: auth}} <- MFA.Token.validate(mfa_token), + {:ok, _} <- validates_challenge(user, mfa_params) do + conn + |> OAuthController.after_create_authorization(auth, %{ + "authorization" => %{ + "redirect_uri" => mfa_params["redirect_uri"], + "state" => mfa_params["state"] + } + }) + else + _ -> + conn + |> put_flash(:error, "Two-factor authentication failed.") + |> put_status(:unauthorized) + |> show(mfa_params) + end + end + + @doc """ + Verification second step of MFA (or recovery) and returns access token. + + ## Endpoint + POST /oauth/mfa/challenge + + params: + `client_id` + `client_secret` + `mfa_token` - access token to check second step of mfa + `challenge_type` - 'totp' or 'recovery' + `code` + + """ + def challenge(conn, %{"mfa_token" => mfa_token} = params) do + with {:ok, app} <- Token.Utils.fetch_app(conn), + {:ok, %{user: user, authorization: auth}} <- MFA.Token.validate(mfa_token), + {:ok, _} <- validates_challenge(user, params), + {:ok, token} <- Token.exchange_token(app, auth) do + json(conn, Token.Response.build(user, token)) + else + _error -> + conn + |> put_status(400) + |> json(%{error: "Invalid code"}) + end + end + + # Verify TOTP Code + defp validates_challenge(user, %{"challenge_type" => "totp", "code" => code} = _) do + TOTPAuthenticator.verify(code, user) + end + + # Verify Recovery Code + defp validates_challenge(user, %{"challenge_type" => "recovery", "code" => code} = _) do + TOTPAuthenticator.verify_recovery_code(user, code) + end + + defp validates_challenge(_, _), do: {:error, :unsupported_challenge_type} +end diff --git a/lib/pleroma/web/oauth/mfa_view.ex b/lib/pleroma/web/oauth/mfa_view.ex new file mode 100644 index 000000000..41d5578dc --- /dev/null +++ b/lib/pleroma/web/oauth/mfa_view.ex @@ -0,0 +1,8 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.OAuth.MFAView do + use Pleroma.Web, :view + import Phoenix.HTML.Form +end diff --git a/lib/pleroma/web/oauth/oauth_controller.ex b/lib/pleroma/web/oauth/oauth_controller.ex index 46688db7e..7c804233c 100644 --- a/lib/pleroma/web/oauth/oauth_controller.ex +++ b/lib/pleroma/web/oauth/oauth_controller.ex @@ -6,6 +6,7 @@ defmodule Pleroma.Web.OAuth.OAuthController do use Pleroma.Web, :controller alias Pleroma.Helpers.UriHelper + alias Pleroma.MFA alias Pleroma.Plugs.RateLimiter alias Pleroma.Registration alias Pleroma.Repo @@ -14,6 +15,7 @@ defmodule Pleroma.Web.OAuth.OAuthController do alias Pleroma.Web.ControllerHelper alias Pleroma.Web.OAuth.App alias Pleroma.Web.OAuth.Authorization + alias Pleroma.Web.OAuth.MFAController alias Pleroma.Web.OAuth.Scopes alias Pleroma.Web.OAuth.Token alias Pleroma.Web.OAuth.Token.Strategy.RefreshToken @@ -25,6 +27,9 @@ defmodule Pleroma.Web.OAuth.OAuthController do plug(:fetch_session) plug(:fetch_flash) + + plug(:skip_plug, [Pleroma.Plugs.OAuthScopesPlug, Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug]) + plug(RateLimiter, [name: :authentication] when action == :create_authorization) action_fallback(Pleroma.Web.OAuth.FallbackController) @@ -118,7 +123,8 @@ def create_authorization( %{"authorization" => _} = params, opts \\ [] ) do - with {:ok, auth} <- do_create_authorization(conn, params, opts[:user]) do + with {:ok, auth, user} <- do_create_authorization(conn, params, opts[:user]), + {:mfa_required, _, _, false} <- {:mfa_required, user, auth, MFA.require?(user)} do after_create_authorization(conn, auth, params) else error -> @@ -176,6 +182,22 @@ defp handle_create_authorization_error( |> authorize(params) end + defp handle_create_authorization_error( + %Plug.Conn{} = conn, + {:mfa_required, user, auth, _}, + params + ) do + {:ok, token} = MFA.Token.create_token(user, auth) + + data = %{ + "mfa_token" => token.token, + "redirect_uri" => params["authorization"]["redirect_uri"], + "state" => params["authorization"]["state"] + } + + MFAController.show(conn, data) + end + defp handle_create_authorization_error( %Plug.Conn{} = conn, {:account_status, :password_reset_pending}, @@ -228,7 +250,8 @@ def token_exchange(%Plug.Conn{} = conn, %{"grant_type" => "authorization_code"} json(conn, Token.Response.build(user, token, response_attrs)) else - _error -> render_invalid_credentials_error(conn) + error -> + handle_token_exchange_error(conn, error) end end @@ -241,6 +264,7 @@ def token_exchange( {:account_status, :active} <- {:account_status, User.account_status(user)}, {:ok, scopes} <- validate_scopes(app, params), {:ok, auth} <- Authorization.create_authorization(app, user, scopes), + {:mfa_required, _, _, false} <- {:mfa_required, user, auth, MFA.require?(user)}, {:ok, token} <- Token.exchange_token(app, auth) do json(conn, Token.Response.build(user, token)) else @@ -267,13 +291,20 @@ def token_exchange(%Plug.Conn{} = conn, %{"grant_type" => "client_credentials"} {:ok, token} <- Token.exchange_token(app, auth) do json(conn, Token.Response.build_for_client_credentials(token)) else - _error -> render_invalid_credentials_error(conn) + _error -> + handle_token_exchange_error(conn, :invalid_credentails) end end # Bad request def token_exchange(%Plug.Conn{} = conn, params), do: bad_request(conn, params) + defp handle_token_exchange_error(%Plug.Conn{} = conn, {:mfa_required, user, auth, _}) do + conn + |> put_status(:forbidden) + |> json(build_and_response_mfa_token(user, auth)) + end + defp handle_token_exchange_error(%Plug.Conn{} = conn, {:account_status, :deactivated}) do render_error( conn, @@ -431,7 +462,8 @@ def registration_details(%Plug.Conn{} = conn, %{"authorization" => auth_attrs}) def register(%Plug.Conn{} = conn, %{"authorization" => _, "op" => "connect"} = params) do with registration_id when not is_nil(registration_id) <- get_session_registration_id(conn), %Registration{} = registration <- Repo.get(Registration, registration_id), - {_, {:ok, auth}} <- {:create_authorization, do_create_authorization(conn, params)}, + {_, {:ok, auth, _user}} <- + {:create_authorization, do_create_authorization(conn, params)}, %User{} = user <- Repo.preload(auth, :user).user, {:ok, _updated_registration} <- Registration.bind_to_user(registration, user) do conn @@ -497,8 +529,9 @@ defp do_create_authorization( %App{} = app <- Repo.get_by(App, client_id: client_id), true <- redirect_uri in String.split(app.redirect_uris), {:ok, scopes} <- validate_scopes(app, auth_attrs), - {:account_status, :active} <- {:account_status, User.account_status(user)} do - Authorization.create_authorization(app, user, scopes) + {:account_status, :active} <- {:account_status, User.account_status(user)}, + {:ok, auth} <- Authorization.create_authorization(app, user, scopes) do + {:ok, auth, user} end end @@ -512,6 +545,12 @@ defp get_session_registration_id(%Plug.Conn{} = conn), do: get_session(conn, :re defp put_session_registration_id(%Plug.Conn{} = conn, registration_id), 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 + Token.Response.build_for_mfa_token(user, token) + end + end + @spec validate_scopes(App.t(), map()) :: {:ok, list()} | {:error, :missing_scopes | :unsupported_scopes} defp validate_scopes(%App{} = app, params) do diff --git a/lib/pleroma/web/oauth/scopes.ex b/lib/pleroma/web/oauth/scopes.ex index 8ecf901f3..6f06f1431 100644 --- a/lib/pleroma/web/oauth/scopes.ex +++ b/lib/pleroma/web/oauth/scopes.ex @@ -15,9 +15,10 @@ defmodule Pleroma.Web.OAuth.Scopes do Note: `scopes` is used by Mastodon — supporting it but sticking to OAuth's standard `scope` wherever we control it """ - @spec fetch_scopes(map(), list()) :: list() + @spec fetch_scopes(map() | struct(), list()) :: list() + def fetch_scopes(params, default) do - parse_scopes(params["scope"] || params["scopes"], default) + parse_scopes(params["scope"] || params["scopes"] || params[:scopes], default) end def parse_scopes(scopes, _default) when is_list(scopes) do diff --git a/lib/pleroma/web/oauth/token/clean_worker.ex b/lib/pleroma/web/oauth/token/clean_worker.ex new file mode 100644 index 000000000..e3aa4eb7e --- /dev/null +++ b/lib/pleroma/web/oauth/token/clean_worker.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.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.Web.OAuth + 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 + OAuth.Token.delete_expired_tokens() + MFA.Token.delete_expired_tokens() + end +end diff --git a/lib/pleroma/web/oauth/token/response.ex b/lib/pleroma/web/oauth/token/response.ex index 6f4713dee..0e72c31e9 100644 --- a/lib/pleroma/web/oauth/token/response.ex +++ b/lib/pleroma/web/oauth/token/response.ex @@ -5,6 +5,7 @@ defmodule Pleroma.Web.OAuth.Token.Response do @moduledoc false + alias Pleroma.MFA alias Pleroma.User alias Pleroma.Web.OAuth.Token.Utils @@ -32,5 +33,13 @@ def build_for_client_credentials(token) do } end + def build_for_mfa_token(user, mfa_token) do + %{ + error: "mfa_required", + mfa_token: mfa_token.token, + supported_challenge_types: MFA.supported_methods(user) + } + end + defp expires_in, do: Pleroma.Config.get([:oauth2, :token_expires_in], 600) end diff --git a/lib/pleroma/web/ostatus/ostatus_controller.ex b/lib/pleroma/web/ostatus/ostatus_controller.ex index 6fd3cfce5..de1b0b3f0 100644 --- a/lib/pleroma/web/ostatus/ostatus_controller.ex +++ b/lib/pleroma/web/ostatus/ostatus_controller.ex @@ -17,7 +17,7 @@ defmodule Pleroma.Web.OStatus.OStatusController do alias Pleroma.Web.Router plug(Pleroma.Plugs.EnsureAuthenticatedPlug, - unless_func: &Pleroma.Web.FederatingPlug.federating?/0 + unless_func: &Pleroma.Web.FederatingPlug.federating?/1 ) plug( @@ -32,13 +32,13 @@ defmodule Pleroma.Web.OStatus.OStatusController do action_fallback(:errors) - def object(%{assigns: %{format: format}} = conn, %{"uuid" => _uuid}) + def object(%{assigns: %{format: format}} = conn, _params) when format in ["json", "activity+json"] do ActivityPubController.call(conn, :object) end - def object(%{assigns: %{format: format}} = conn, %{"uuid" => uuid}) do - with id <- o_status_url(conn, :object, uuid), + def object(%{assigns: %{format: format}} = conn, _params) do + with id <- Endpoint.url() <> conn.request_path, {_, %Activity{} = activity} <- {:activity, Activity.get_create_by_object_ap_id_with_object(id)}, {_, true} <- {:public?, Visibility.is_public?(activity)} do @@ -54,13 +54,13 @@ def object(%{assigns: %{format: format}} = conn, %{"uuid" => uuid}) do end end - def activity(%{assigns: %{format: format}} = conn, %{"uuid" => _uuid}) + def activity(%{assigns: %{format: format}} = conn, _params) when format in ["json", "activity+json"] do ActivityPubController.call(conn, :activity) end - def activity(%{assigns: %{format: format}} = conn, %{"uuid" => uuid}) do - with id <- o_status_url(conn, :activity, uuid), + def activity(%{assigns: %{format: format}} = conn, _params) do + with id <- Endpoint.url() <> conn.request_path, {_, %Activity{} = activity} <- {:activity, Activity.normalize(id)}, {_, true} <- {:public?, Visibility.is_public?(activity)} do case format do diff --git a/lib/pleroma/web/pleroma_api/controllers/account_controller.ex b/lib/pleroma/web/pleroma_api/controllers/account_controller.ex index dcba67d03..0a3f45620 100644 --- a/lib/pleroma/web/pleroma_api/controllers/account_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/account_controller.ex @@ -9,15 +9,27 @@ defmodule Pleroma.Web.PleromaAPI.AccountController do only: [json_response: 3, add_link_headers: 2, assign_account_by_id: 2] alias Ecto.Changeset + alias Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug alias Pleroma.Plugs.OAuthScopesPlug alias Pleroma.Plugs.RateLimiter alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub - alias Pleroma.Web.CommonAPI alias Pleroma.Web.MastodonAPI.StatusView require Pleroma.Constants + plug( + OpenApiSpex.Plug.PutApiSpec, + [module: Pleroma.Web.ApiSpec] when action == :confirmation_resend + ) + + plug(Pleroma.Web.ApiSpec.CastAndValidate) + + plug( + :skip_plug, + [OAuthScopesPlug, EnsurePublicOrAuthenticatedPlug] when action == :confirmation_resend + ) + plug( OAuthScopesPlug, %{scopes: ["follow", "write:follows"]} when action in [:subscribe, :unsubscribe] @@ -34,21 +46,21 @@ defmodule Pleroma.Web.PleromaAPI.AccountController do ] ) - plug(OAuthScopesPlug, %{scopes: ["read:favourites"]} when action == :favourites) - - # An extra safety measure for possible actions not guarded by OAuth permissions specification plug( - Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug - when action != :confirmation_resend + OAuthScopesPlug, + %{scopes: ["read:favourites"], fallback: :proceed_unauthenticated} when action == :favourites ) plug(RateLimiter, [name: :account_confirmation_resend] when action == :confirmation_resend) + plug(:assign_account_by_id when action in [:favourites, :subscribe, :unsubscribe]) plug(:put_view, Pleroma.Web.MastodonAPI.AccountView) + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.PleromaAccountOperation + @doc "POST /api/v1/pleroma/accounts/confirmation_resend" def confirmation_resend(conn, params) do - nickname_or_email = params["email"] || params["nickname"] + nickname_or_email = params[:email] || params[:nickname] with %User{} = user <- User.get_by_nickname_or_email(nickname_or_email), {:ok, _} <- User.try_send_confirmation_email(user) do @@ -57,39 +69,33 @@ def confirmation_resend(conn, params) do end @doc "PATCH /api/v1/pleroma/accounts/update_avatar" - def update_avatar(%{assigns: %{user: user}} = conn, %{"img" => ""}) do - {:ok, user} = + def update_avatar(%{assigns: %{user: user}, body_params: %{img: ""}} = conn, _) do + {:ok, _user} = user |> Changeset.change(%{avatar: nil}) |> User.update_and_set_cache() - CommonAPI.update(user) - json(conn, %{url: nil}) end - def update_avatar(%{assigns: %{user: user}} = conn, params) do + def update_avatar(%{assigns: %{user: user}, body_params: params} = conn, _params) do {:ok, %{data: data}} = ActivityPub.upload(params, type: :avatar) - {:ok, user} = user |> Changeset.change(%{avatar: data}) |> User.update_and_set_cache() + {:ok, _user} = user |> Changeset.change(%{avatar: data}) |> User.update_and_set_cache() %{"url" => [%{"href" => href} | _]} = data - CommonAPI.update(user) - json(conn, %{url: href}) end @doc "PATCH /api/v1/pleroma/accounts/update_banner" - def update_banner(%{assigns: %{user: user}} = conn, %{"banner" => ""}) do - with {:ok, user} <- User.update_banner(user, %{}) do - CommonAPI.update(user) + def update_banner(%{assigns: %{user: user}, body_params: %{banner: ""}} = conn, _) do + with {:ok, _user} <- User.update_banner(user, %{}) do json(conn, %{url: nil}) end end - def update_banner(%{assigns: %{user: user}} = conn, params) do - with {:ok, object} <- ActivityPub.upload(%{"img" => params["banner"]}, type: :banner), - {:ok, user} <- User.update_banner(user, object.data) do - CommonAPI.update(user) + def update_banner(%{assigns: %{user: user}, body_params: params} = conn, _) do + with {:ok, object} <- ActivityPub.upload(%{img: params[:banner]}, type: :banner), + {:ok, _user} <- User.update_banner(user, object.data) do %{"url" => [%{"href" => href} | _]} = object.data json(conn, %{url: href}) @@ -97,13 +103,13 @@ def update_banner(%{assigns: %{user: user}} = conn, params) do end @doc "PATCH /api/v1/pleroma/accounts/update_background" - def update_background(%{assigns: %{user: user}} = conn, %{"img" => ""}) do + def update_background(%{assigns: %{user: user}, body_params: %{img: ""}} = conn, _) do with {:ok, _user} <- User.update_background(user, %{}) do json(conn, %{url: nil}) end end - def update_background(%{assigns: %{user: user}} = conn, params) do + def update_background(%{assigns: %{user: user}, body_params: params} = conn, _) do with {:ok, object} <- ActivityPub.upload(params, type: :background), {:ok, _user} <- User.update_background(user, object.data) do %{"url" => [%{"href" => href} | _]} = object.data @@ -120,6 +126,7 @@ def favourites(%{assigns: %{account: %{hide_favorites: true}}} = conn, _params) def favourites(%{assigns: %{user: for_user, account: user}} = conn, params) do params = params + |> Map.new(fn {key, value} -> {to_string(key), value} end) |> Map.put("type", "Create") |> Map.put("favorited_by", user.ap_id) |> Map.put("blocking_user", for_user) @@ -139,7 +146,11 @@ def favourites(%{assigns: %{user: for_user, account: user}} = conn, params) do conn |> add_link_headers(activities) |> put_view(StatusView) - |> render("index.json", activities: activities, for: for_user, as: :activity) + |> render("index.json", + activities: activities, + for: for_user, + as: :activity + ) end @doc "POST /api/v1/pleroma/accounts/:id/subscribe" diff --git a/lib/pleroma/web/pleroma_api/controllers/conversation_controller.ex b/lib/pleroma/web/pleroma_api/controllers/conversation_controller.ex new file mode 100644 index 000000000..21d5eb8d5 --- /dev/null +++ b/lib/pleroma/web/pleroma_api/controllers/conversation_controller.ex @@ -0,0 +1,95 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.PleromaAPI.ConversationController do + use Pleroma.Web, :controller + + import Pleroma.Web.ControllerHelper, only: [add_link_headers: 2] + + alias Pleroma.Conversation.Participation + alias Pleroma.Plugs.OAuthScopesPlug + alias Pleroma.Web.ActivityPub.ActivityPub + alias Pleroma.Web.MastodonAPI.StatusView + + plug(Pleroma.Web.ApiSpec.CastAndValidate) + plug(:put_view, Pleroma.Web.MastodonAPI.ConversationView) + plug(OAuthScopesPlug, %{scopes: ["read:statuses"]} when action in [:show, :statuses]) + + plug( + OAuthScopesPlug, + %{scopes: ["write:conversations"]} when action in [:update, :mark_as_read] + ) + + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.PleromaConversationOperation + + def show(%{assigns: %{user: %{id: user_id} = user}} = conn, %{id: participation_id}) do + with %Participation{user_id: ^user_id} = participation <- Participation.get(participation_id) do + render(conn, "participation.json", participation: participation, for: user) + else + _error -> + conn + |> put_status(:not_found) + |> json(%{"error" => "Unknown conversation id"}) + end + end + + def statuses( + %{assigns: %{user: %{id: user_id} = user}} = conn, + %{id: participation_id} = params + ) do + with %Participation{user_id: ^user_id} = participation <- + Participation.get(participation_id, preload: [:conversation]) do + params = + params + |> Map.new(fn {key, value} -> {to_string(key), value} end) + |> Map.put("blocking_user", user) + |> Map.put("muting_user", user) + |> Map.put("user", user) + + activities = + participation.conversation.ap_id + |> ActivityPub.fetch_activities_for_context_query(params) + |> Pleroma.Pagination.fetch_paginated(Map.put(params, "total", false)) + |> Enum.reverse() + + conn + |> add_link_headers(activities) + |> put_view(StatusView) + |> render("index.json", activities: activities, for: user, as: :activity) + else + _error -> + conn + |> put_status(:not_found) + |> json(%{"error" => "Unknown conversation id"}) + end + end + + def update( + %{assigns: %{user: %{id: user_id} = user}} = conn, + %{id: participation_id, recipients: recipients} + ) do + with %Participation{user_id: ^user_id} = participation <- Participation.get(participation_id), + {:ok, participation} <- Participation.set_recipients(participation, recipients) do + render(conn, "participation.json", participation: participation, for: user) + else + {:error, message} -> + conn + |> put_status(:bad_request) + |> json(%{"error" => message}) + + _error -> + conn + |> put_status(:not_found) + |> json(%{"error" => "Unknown conversation id"}) + end + end + + def mark_as_read(%{assigns: %{user: user}} = conn, _params) do + with {:ok, _, participations} <- Participation.mark_all_as_read(user) do + conn + |> add_link_headers(participations) + |> render("participations.json", participations: participations, for: user) + end + end +end diff --git a/lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex b/lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex deleted file mode 100644 index 03e95e020..000000000 --- a/lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex +++ /dev/null @@ -1,643 +0,0 @@ -defmodule Pleroma.Web.PleromaAPI.EmojiAPIController do - use Pleroma.Web, :controller - - alias Pleroma.Plugs.OAuthScopesPlug - - require Logger - - plug( - OAuthScopesPlug, - %{scopes: ["write"], admin: true} - when action in [ - :create, - :delete, - :download_from, - :list_from, - :import_from_fs, - :update_file, - :update_metadata - ] - ) - - plug(Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug) - - def emoji_dir_path do - Path.join( - Pleroma.Config.get!([:instance, :static_dir]), - "emoji" - ) - end - - @doc """ - Lists packs from the remote instance. - - Since JS cannot ask remote instances for their packs due to CPS, it has to - be done by the server - """ - def list_from(conn, %{"instance_address" => address}) do - address = String.trim(address) - - if shareable_packs_available(address) do - list_resp = - "#{address}/api/pleroma/emoji/packs" |> Tesla.get!() |> Map.get(:body) |> Jason.decode!() - - json(conn, list_resp) - else - conn - |> put_status(:internal_server_error) - |> json(%{error: "The requested instance does not support sharing emoji packs"}) - end - end - - @doc """ - Lists the packs available on the instance as JSON. - - The information is public and does not require authentication. The format is - a map of "pack directory name" to pack.json contents. - """ - def list_packs(conn, _params) do - # Create the directory first if it does not exist. This is probably the first request made - # with the API so it should be sufficient - with {:create_dir, :ok} <- {:create_dir, File.mkdir_p(emoji_dir_path())}, - {:ls, {:ok, results}} <- {:ls, File.ls(emoji_dir_path())} do - pack_infos = - results - |> Enum.filter(&has_pack_json?/1) - |> Enum.map(&load_pack/1) - # Check if all the files are in place and can be sent - |> Enum.map(&validate_pack/1) - # Transform into a map of pack-name => pack-data - |> Enum.into(%{}) - - json(conn, pack_infos) - else - {:create_dir, {:error, e}} -> - conn - |> put_status(:internal_server_error) - |> json(%{error: "Failed to create the emoji pack directory at #{emoji_dir_path()}: #{e}"}) - - {:ls, {:error, e}} -> - conn - |> put_status(:internal_server_error) - |> json(%{ - error: - "Failed to get the contents of the emoji pack directory at #{emoji_dir_path()}: #{e}" - }) - end - end - - defp has_pack_json?(file) do - dir_path = Path.join(emoji_dir_path(), file) - # Filter to only use the pack.json packs - File.dir?(dir_path) and File.exists?(Path.join(dir_path, "pack.json")) - end - - defp load_pack(pack_name) do - pack_path = Path.join(emoji_dir_path(), pack_name) - pack_file = Path.join(pack_path, "pack.json") - - {pack_name, Jason.decode!(File.read!(pack_file))} - end - - defp validate_pack({name, pack}) do - pack_path = Path.join(emoji_dir_path(), name) - - if can_download?(pack, pack_path) do - archive_for_sha = make_archive(name, pack, pack_path) - archive_sha = :crypto.hash(:sha256, archive_for_sha) |> Base.encode16() - - pack = - pack - |> put_in(["pack", "can-download"], true) - |> put_in(["pack", "download-sha256"], archive_sha) - - {name, pack} - else - {name, put_in(pack, ["pack", "can-download"], false)} - end - end - - defp can_download?(pack, pack_path) do - # If the pack is set as shared, check if it can be downloaded - # That means that when asked, the pack can be packed and sent to the remote - # Otherwise, they'd have to download it from external-src - pack["pack"]["share-files"] && - Enum.all?(pack["files"], fn {_, path} -> - File.exists?(Path.join(pack_path, path)) - end) - end - - defp create_archive_and_cache(name, pack, pack_dir, md5) do - files = - ['pack.json'] ++ - (pack["files"] |> Enum.map(fn {_, path} -> to_charlist(path) end)) - - {:ok, {_, zip_result}} = :zip.zip('#{name}.zip', files, [:memory, cwd: to_charlist(pack_dir)]) - - cache_seconds_per_file = Pleroma.Config.get!([:emoji, :shared_pack_cache_seconds_per_file]) - cache_ms = :timer.seconds(cache_seconds_per_file * Enum.count(files)) - - Cachex.put!( - :emoji_packs_cache, - name, - # if pack.json MD5 changes, the cache is not valid anymore - %{pack_json_md5: md5, pack_data: zip_result}, - # Add a minute to cache time for every file in the pack - ttl: cache_ms - ) - - Logger.debug("Created an archive for the '#{name}' emoji pack, \ -keeping it in cache for #{div(cache_ms, 1000)}s") - - zip_result - end - - defp make_archive(name, pack, pack_dir) do - # Having a different pack.json md5 invalidates cache - pack_file_md5 = :crypto.hash(:md5, File.read!(Path.join(pack_dir, "pack.json"))) - - case Cachex.get!(:emoji_packs_cache, name) do - %{pack_file_md5: ^pack_file_md5, pack_data: zip_result} -> - Logger.debug("Using cache for the '#{name}' shared emoji pack") - zip_result - - _ -> - create_archive_and_cache(name, pack, pack_dir, pack_file_md5) - end - end - - @doc """ - An endpoint for other instances (via admin UI) or users (via browser) - to download packs that the instance shares. - """ - def download_shared(conn, %{"name" => name}) do - pack_dir = Path.join(emoji_dir_path(), name) - pack_file = Path.join(pack_dir, "pack.json") - - with {_, true} <- {:exists?, File.exists?(pack_file)}, - pack = Jason.decode!(File.read!(pack_file)), - {_, true} <- {:can_download?, can_download?(pack, pack_dir)} do - zip_result = make_archive(name, pack, pack_dir) - send_download(conn, {:binary, zip_result}, filename: "#{name}.zip") - else - {:can_download?, _} -> - conn - |> put_status(:forbidden) - |> json(%{ - error: "Pack #{name} cannot be downloaded from this instance, either pack sharing\ - was disabled for this pack or some files are missing" - }) - - {:exists?, _} -> - conn - |> put_status(:not_found) - |> json(%{error: "Pack #{name} does not exist"}) - end - end - - defp shareable_packs_available(address) do - "#{address}/.well-known/nodeinfo" - |> Tesla.get!() - |> Map.get(:body) - |> Jason.decode!() - |> Map.get("links") - |> List.last() - |> Map.get("href") - # Get the actual nodeinfo address and fetch it - |> Tesla.get!() - |> Map.get(:body) - |> Jason.decode!() - |> get_in(["metadata", "features"]) - |> Enum.member?("shareable_emoji_packs") - end - - @doc """ - An admin endpoint to request downloading a pack named `pack_name` from the instance - `instance_address`. - - If the requested instance's admin chose to share the pack, it will be downloaded - from that instance, otherwise it will be downloaded from the fallback source, if there is one. - """ - def download_from(conn, %{"instance_address" => address, "pack_name" => name} = data) do - address = String.trim(address) - - if shareable_packs_available(address) do - full_pack = - "#{address}/api/pleroma/emoji/packs/list" - |> Tesla.get!() - |> Map.get(:body) - |> Jason.decode!() - |> Map.get(name) - - pack_info_res = - case full_pack["pack"] do - %{"share-files" => true, "can-download" => true, "download-sha256" => sha} -> - {:ok, - %{ - sha: sha, - uri: "#{address}/api/pleroma/emoji/packs/download_shared/#{name}" - }} - - %{"fallback-src" => src, "fallback-src-sha256" => sha} when is_binary(src) -> - {:ok, - %{ - sha: sha, - uri: src, - fallback: true - }} - - _ -> - {:error, - "The pack was not set as shared and there is no fallback src to download from"} - end - - with {:ok, %{sha: sha, uri: uri} = pinfo} <- pack_info_res, - %{body: emoji_archive} <- Tesla.get!(uri), - {_, true} <- {:checksum, Base.decode16!(sha) == :crypto.hash(:sha256, emoji_archive)} do - local_name = data["as"] || name - pack_dir = Path.join(emoji_dir_path(), local_name) - File.mkdir_p!(pack_dir) - - files = Enum.map(full_pack["files"], fn {_, path} -> to_charlist(path) end) - # Fallback cannot contain a pack.json file - files = if pinfo[:fallback], do: files, else: ['pack.json'] ++ files - - {:ok, _} = :zip.unzip(emoji_archive, cwd: to_charlist(pack_dir), file_list: files) - - # Fallback can't contain a pack.json file, since that would cause the fallback-src-sha256 - # in it to depend on itself - if pinfo[:fallback] do - pack_file_path = Path.join(pack_dir, "pack.json") - - File.write!(pack_file_path, Jason.encode!(full_pack, pretty: true)) - end - - json(conn, "ok") - else - {:error, e} -> - conn |> put_status(:internal_server_error) |> json(%{error: e}) - - {:checksum, _} -> - conn - |> put_status(:internal_server_error) - |> json(%{error: "SHA256 for the pack doesn't match the one sent by the server"}) - end - else - conn - |> put_status(:internal_server_error) - |> json(%{error: "The requested instance does not support sharing emoji packs"}) - end - end - - @doc """ - Creates an empty pack named `name` which then can be updated via the admin UI. - """ - def create(conn, %{"name" => name}) do - pack_dir = Path.join(emoji_dir_path(), name) - - if not File.exists?(pack_dir) do - File.mkdir_p!(pack_dir) - - pack_file_p = Path.join(pack_dir, "pack.json") - - File.write!( - pack_file_p, - Jason.encode!(%{pack: %{}, files: %{}}, pretty: true) - ) - - conn |> json("ok") - else - conn - |> put_status(:conflict) - |> json(%{error: "A pack named \"#{name}\" already exists"}) - end - end - - @doc """ - Deletes the pack `name` and all it's files. - """ - def delete(conn, %{"name" => name}) do - pack_dir = Path.join(emoji_dir_path(), name) - - case File.rm_rf(pack_dir) do - {:ok, _} -> - conn |> json("ok") - - {:error, _, _} -> - conn - |> put_status(:internal_server_error) - |> json(%{error: "Couldn't delete the pack #{name}"}) - end - end - - @doc """ - An endpoint to update `pack_names`'s metadata. - - `new_data` is the new metadata for the pack, that will replace the old metadata. - """ - def update_metadata(conn, %{"pack_name" => name, "new_data" => new_data}) do - pack_file_p = Path.join([emoji_dir_path(), name, "pack.json"]) - - full_pack = Jason.decode!(File.read!(pack_file_p)) - - # The new fallback-src is in the new data and it's not the same as it was in the old data - should_update_fb_sha = - not is_nil(new_data["fallback-src"]) and - new_data["fallback-src"] != full_pack["pack"]["fallback-src"] - - with {_, true} <- {:should_update?, should_update_fb_sha}, - %{body: pack_arch} <- Tesla.get!(new_data["fallback-src"]), - {:ok, flist} <- :zip.unzip(pack_arch, [:memory]), - {_, true} <- {:has_all_files?, has_all_files?(full_pack, flist)} do - fallback_sha = :crypto.hash(:sha256, pack_arch) |> Base.encode16() - - new_data = Map.put(new_data, "fallback-src-sha256", fallback_sha) - update_metadata_and_send(conn, full_pack, new_data, pack_file_p) - else - {:should_update?, _} -> - update_metadata_and_send(conn, full_pack, new_data, pack_file_p) - - {:has_all_files?, _} -> - conn - |> put_status(:bad_request) - |> json(%{error: "The fallback archive does not have all files specified in pack.json"}) - end - end - - # Check if all files from the pack.json are in the archive - defp has_all_files?(%{"files" => files}, flist) do - Enum.all?(files, fn {_, from_manifest} -> - Enum.find(flist, fn {from_archive, _} -> - to_string(from_archive) == from_manifest - end) - end) - end - - defp update_metadata_and_send(conn, full_pack, new_data, pack_file_p) do - full_pack = Map.put(full_pack, "pack", new_data) - File.write!(pack_file_p, Jason.encode!(full_pack, pretty: true)) - - # Send new data back with fallback sha filled - json(conn, new_data) - end - - defp get_filename(%{"filename" => filename}), do: filename - - defp get_filename(%{"file" => file}) do - case file do - %Plug.Upload{filename: filename} -> filename - url when is_binary(url) -> Path.basename(url) - end - end - - defp empty?(str), do: String.trim(str) == "" - - defp update_file_and_send(conn, updated_full_pack, pack_file_p) do - # Write the emoji pack file - File.write!(pack_file_p, Jason.encode!(updated_full_pack, pretty: true)) - - # Return the modified file list - json(conn, updated_full_pack["files"]) - end - - @doc """ - Updates a file in a pack. - - Updating can mean three things: - - - `add` adds an emoji named `shortcode` to the pack `pack_name`, - that means that the emoji file needs to be uploaded with the request - (thus requiring it to be a multipart request) and be named `file`. - There can also be an optional `filename` that will be the new emoji file name - (if it's not there, the name will be taken from the uploaded file). - - `update` changes emoji shortcode (from `shortcode` to `new_shortcode` or moves the file - (from the current filename to `new_filename`) - - `remove` removes the emoji named `shortcode` and it's associated file - """ - - # Add - def update_file( - conn, - %{"pack_name" => pack_name, "action" => "add", "shortcode" => shortcode} = params - ) do - pack_dir = Path.join(emoji_dir_path(), pack_name) - pack_file_p = Path.join(pack_dir, "pack.json") - - full_pack = Jason.decode!(File.read!(pack_file_p)) - - with {_, false} <- {:has_shortcode, Map.has_key?(full_pack["files"], shortcode)}, - filename <- get_filename(params), - false <- empty?(shortcode), - false <- empty?(filename) do - file_path = Path.join(pack_dir, filename) - - # If the name contains directories, create them - if String.contains?(file_path, "/") do - File.mkdir_p!(Path.dirname(file_path)) - end - - case params["file"] do - %Plug.Upload{path: upload_path} -> - # Copy the uploaded file from the temporary directory - File.copy!(upload_path, file_path) - - url when is_binary(url) -> - # Download and write the file - file_contents = Tesla.get!(url).body - File.write!(file_path, file_contents) - end - - updated_full_pack = put_in(full_pack, ["files", shortcode], filename) - update_file_and_send(conn, updated_full_pack, pack_file_p) - else - {:has_shortcode, _} -> - conn - |> put_status(:conflict) - |> json(%{error: "An emoji with the \"#{shortcode}\" shortcode already exists"}) - - true -> - conn - |> put_status(:bad_request) - |> json(%{error: "shortcode or filename cannot be empty"}) - end - end - - # Remove - def update_file(conn, %{ - "pack_name" => pack_name, - "action" => "remove", - "shortcode" => shortcode - }) do - pack_dir = Path.join(emoji_dir_path(), pack_name) - pack_file_p = Path.join(pack_dir, "pack.json") - - full_pack = Jason.decode!(File.read!(pack_file_p)) - - if Map.has_key?(full_pack["files"], shortcode) do - {emoji_file_path, updated_full_pack} = pop_in(full_pack, ["files", shortcode]) - - emoji_file_path = Path.join(pack_dir, emoji_file_path) - - # Delete the emoji file - File.rm!(emoji_file_path) - - # If the old directory has no more files, remove it - if String.contains?(emoji_file_path, "/") do - dir = Path.dirname(emoji_file_path) - - if Enum.empty?(File.ls!(dir)) do - File.rmdir!(dir) - end - end - - update_file_and_send(conn, updated_full_pack, pack_file_p) - else - conn - |> put_status(:bad_request) - |> json(%{error: "Emoji \"#{shortcode}\" does not exist"}) - end - end - - # Update - def update_file( - conn, - %{"pack_name" => pack_name, "action" => "update", "shortcode" => shortcode} = params - ) do - pack_dir = Path.join(emoji_dir_path(), pack_name) - pack_file_p = Path.join(pack_dir, "pack.json") - - full_pack = Jason.decode!(File.read!(pack_file_p)) - - with {_, true} <- {:has_shortcode, Map.has_key?(full_pack["files"], shortcode)}, - %{"new_shortcode" => new_shortcode, "new_filename" => new_filename} <- params, - false <- empty?(new_shortcode), - false <- empty?(new_filename) do - # First, remove the old shortcode, saving the old path - {old_emoji_file_path, updated_full_pack} = pop_in(full_pack, ["files", shortcode]) - old_emoji_file_path = Path.join(pack_dir, old_emoji_file_path) - new_emoji_file_path = Path.join(pack_dir, new_filename) - - # If the name contains directories, create them - if String.contains?(new_emoji_file_path, "/") do - File.mkdir_p!(Path.dirname(new_emoji_file_path)) - end - - # Move/Rename the old filename to a new filename - # These are probably on the same filesystem, so just rename should work - :ok = File.rename(old_emoji_file_path, new_emoji_file_path) - - # If the old directory has no more files, remove it - if String.contains?(old_emoji_file_path, "/") do - dir = Path.dirname(old_emoji_file_path) - - if Enum.empty?(File.ls!(dir)) do - File.rmdir!(dir) - end - end - - # Then, put in the new shortcode with the new path - updated_full_pack = put_in(updated_full_pack, ["files", new_shortcode], new_filename) - update_file_and_send(conn, updated_full_pack, pack_file_p) - else - {:has_shortcode, _} -> - conn - |> put_status(:bad_request) - |> json(%{error: "Emoji \"#{shortcode}\" does not exist"}) - - true -> - conn - |> put_status(:bad_request) - |> json(%{error: "new_shortcode or new_filename cannot be empty"}) - - _ -> - conn - |> put_status(:bad_request) - |> json(%{error: "new_shortcode or new_file were not specified"}) - end - end - - def update_file(conn, %{"action" => action}) do - conn - |> put_status(:bad_request) - |> json(%{error: "Unknown action: #{action}"}) - end - - @doc """ - Imports emoji from the filesystem. - - Importing means checking all the directories in the - `$instance_static/emoji/` for directories which do not have - `pack.json`. If one has an emoji.txt file, that file will be used - to create a `pack.json` file with it's contents. If the directory has - neither, all the files with specific configured extenstions will be - assumed to be emojis and stored in the new `pack.json` file. - """ - def import_from_fs(conn, _params) do - emoji_path = emoji_dir_path() - - with {:ok, %{access: :read_write}} <- File.stat(emoji_path), - {:ok, results} <- File.ls(emoji_path) do - imported_pack_names = - results - |> Enum.filter(fn file -> - dir_path = Path.join(emoji_path, file) - # Find the directories that do NOT have pack.json - File.dir?(dir_path) and not File.exists?(Path.join(dir_path, "pack.json")) - end) - |> Enum.map(&write_pack_json_contents/1) - - json(conn, imported_pack_names) - else - {:ok, %{access: _}} -> - conn - |> put_status(:internal_server_error) - |> json(%{error: "Error: emoji pack directory must be writable"}) - - {:error, _} -> - conn - |> put_status(:internal_server_error) - |> json(%{error: "Error accessing emoji pack directory"}) - end - end - - defp write_pack_json_contents(dir) do - dir_path = Path.join(emoji_dir_path(), dir) - emoji_txt_path = Path.join(dir_path, "emoji.txt") - - files_for_pack = files_for_pack(emoji_txt_path, dir_path) - pack_json_contents = Jason.encode!(%{pack: %{}, files: files_for_pack}) - - File.write!(Path.join(dir_path, "pack.json"), pack_json_contents) - - dir - end - - defp files_for_pack(emoji_txt_path, dir_path) do - if File.exists?(emoji_txt_path) do - # There's an emoji.txt file, it's likely from a pack installed by the pack manager. - # Make a pack.json file from the contents of that emoji.txt fileh - - # FIXME: Copy-pasted from Pleroma.Emoji/load_from_file_stream/2 - - # Create a map of shortcodes to filenames from emoji.txt - File.read!(emoji_txt_path) - |> String.split("\n") - |> Enum.map(&String.trim/1) - |> Enum.map(fn line -> - case String.split(line, ~r/,\s*/) do - # This matches both strings with and without tags - # and we don't care about tags here - [name, file | _] -> {name, file} - _ -> nil - end - end) - |> Enum.filter(fn x -> not is_nil(x) end) - |> Enum.into(%{}) - else - # If there's no emoji.txt, assume all files - # that are of certain extensions from the config are emojis and import them all - pack_extensions = Pleroma.Config.get!([:emoji, :pack_extensions]) - Pleroma.Emoji.Loader.make_shortcode_to_file_map(dir_path, pack_extensions) - end - end -end diff --git a/lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex b/lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex new file mode 100644 index 000000000..d1efdeb5d --- /dev/null +++ b/lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex @@ -0,0 +1,304 @@ +defmodule Pleroma.Web.PleromaAPI.EmojiPackController do + use Pleroma.Web, :controller + + alias Pleroma.Emoji.Pack + + plug(Pleroma.Web.ApiSpec.CastAndValidate) + + plug( + Pleroma.Plugs.OAuthScopesPlug, + %{scopes: ["write"], admin: true} + when action in [ + :import_from_filesystem, + :remote, + :download, + :create, + :update, + :delete, + :add_file, + :update_file, + :delete_file + ] + ) + + @skip_plugs [Pleroma.Plugs.OAuthScopesPlug, Pleroma.Plugs.ExpectPublicOrAuthenticatedCheckPlug] + plug(:skip_plug, @skip_plugs when action in [:archive, :show, :list]) + + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.PleromaEmojiPackOperation + + def remote(conn, %{url: url}) do + with {:ok, packs} <- Pack.list_remote(url) do + json(conn, packs) + else + {:error, :not_shareable} -> + conn + |> put_status(:internal_server_error) + |> json(%{error: "The requested instance does not support sharing emoji packs"}) + end + end + + def index(conn, _params) do + emoji_path = + [:instance, :static_dir] + |> Pleroma.Config.get!() + |> Path.join("emoji") + + with {:ok, packs} <- Pack.list_local() do + json(conn, packs) + else + {:error, :create_dir, e} -> + conn + |> put_status(:internal_server_error) + |> json(%{error: "Failed to create the emoji pack directory at #{emoji_path}: #{e}"}) + + {:error, :ls, e} -> + conn + |> put_status(:internal_server_error) + |> json(%{ + error: "Failed to get the contents of the emoji pack directory at #{emoji_path}: #{e}" + }) + end + end + + def show(conn, %{name: name}) do + name = String.trim(name) + + with {:ok, pack} <- Pack.show(name) do + json(conn, pack) + else + {:error, :not_found} -> + conn + |> put_status(:not_found) + |> json(%{error: "Pack #{name} does not exist"}) + + {:error, :empty_values} -> + conn + |> put_status(:bad_request) + |> json(%{error: "pack name cannot be empty"}) + end + end + + def archive(conn, %{name: name}) do + with {:ok, archive} <- Pack.get_archive(name) do + send_download(conn, {:binary, archive}, filename: "#{name}.zip") + else + {:error, :cant_download} -> + conn + |> put_status(:forbidden) + |> json(%{ + error: + "Pack #{name} cannot be downloaded from this instance, either pack sharing was disabled for this pack or some files are missing" + }) + + {:error, :not_found} -> + conn + |> put_status(:not_found) + |> json(%{error: "Pack #{name} does not exist"}) + end + end + + def download(%{body_params: %{url: url, name: name} = params} = conn, _) do + with {:ok, _pack} <- Pack.download(name, url, params[:as]) do + json(conn, "ok") + else + {:error, :not_shareable} -> + conn + |> put_status(:internal_server_error) + |> json(%{error: "The requested instance does not support sharing emoji packs"}) + + {:error, :invalid_checksum} -> + conn + |> put_status(:internal_server_error) + |> json(%{error: "SHA256 for the pack doesn't match the one sent by the server"}) + + {:error, e} -> + conn + |> put_status(:internal_server_error) + |> json(%{error: e}) + end + end + + def create(conn, %{name: name}) do + name = String.trim(name) + + with {:ok, _pack} <- Pack.create(name) do + json(conn, "ok") + else + {:error, :eexist} -> + conn + |> put_status(:conflict) + |> json(%{error: "A pack named \"#{name}\" already exists"}) + + {:error, :empty_values} -> + conn + |> put_status(:bad_request) + |> json(%{error: "pack name cannot be empty"}) + + {:error, _} -> + render_error( + conn, + :internal_server_error, + "Unexpected error occurred while creating pack." + ) + end + end + + def delete(conn, %{name: name}) do + name = String.trim(name) + + with {:ok, deleted} when deleted != [] <- Pack.delete(name) do + json(conn, "ok") + else + {:ok, []} -> + conn + |> put_status(:not_found) + |> json(%{error: "Pack #{name} does not exist"}) + + {:error, :empty_values} -> + conn + |> put_status(:bad_request) + |> json(%{error: "pack name cannot be empty"}) + + {:error, _, _} -> + conn + |> put_status(:internal_server_error) + |> json(%{error: "Couldn't delete the pack #{name}"}) + end + end + + def update(%{body_params: %{metadata: metadata}} = conn, %{name: name}) do + with {:ok, pack} <- Pack.update_metadata(name, metadata) do + json(conn, pack.pack) + else + {:error, :incomplete} -> + conn + |> put_status(:bad_request) + |> json(%{error: "The fallback archive does not have all files specified in pack.json"}) + + {:error, _} -> + render_error( + conn, + :internal_server_error, + "Unexpected error occurred while updating pack metadata." + ) + end + end + + def add_file(%{body_params: params} = conn, %{name: name}) do + filename = params[:filename] || get_filename(params[:file]) + shortcode = params[:shortcode] || Path.basename(filename, Path.extname(filename)) + + with {:ok, pack} <- Pack.add_file(name, shortcode, filename, params[:file]) do + json(conn, pack.files) + else + {:error, :already_exists} -> + conn + |> put_status(:conflict) + |> json(%{error: "An emoji with the \"#{shortcode}\" shortcode already exists"}) + + {:error, :not_found} -> + conn + |> put_status(:bad_request) + |> json(%{error: "pack \"#{name}\" is not found"}) + + {:error, :empty_values} -> + conn + |> put_status(:bad_request) + |> json(%{error: "pack name, shortcode or filename cannot be empty"}) + + {:error, _} -> + render_error( + conn, + :internal_server_error, + "Unexpected error occurred while adding file to pack." + ) + end + end + + def update_file(%{body_params: %{shortcode: shortcode} = params} = conn, %{name: name}) do + new_shortcode = params[:new_shortcode] + new_filename = params[:new_filename] + force = params[:force] + + with {:ok, pack} <- Pack.update_file(name, shortcode, new_shortcode, new_filename, force) do + json(conn, pack.files) + else + {:error, :doesnt_exist} -> + conn + |> put_status(:bad_request) + |> json(%{error: "Emoji \"#{shortcode}\" does not exist"}) + + {:error, :already_exists} -> + conn + |> put_status(:conflict) + |> json(%{ + error: + "New shortcode \"#{new_shortcode}\" is already used. If you want to override emoji use 'force' option" + }) + + {:error, :not_found} -> + conn + |> put_status(:bad_request) + |> json(%{error: "pack \"#{name}\" is not found"}) + + {:error, :empty_values} -> + conn + |> put_status(:bad_request) + |> json(%{error: "new_shortcode or new_filename cannot be empty"}) + + {:error, _} -> + render_error( + conn, + :internal_server_error, + "Unexpected error occurred while updating file in pack." + ) + end + end + + def delete_file(conn, %{name: name, shortcode: shortcode}) do + with {:ok, pack} <- Pack.delete_file(name, shortcode) do + json(conn, pack.files) + else + {:error, :doesnt_exist} -> + conn + |> put_status(:bad_request) + |> json(%{error: "Emoji \"#{shortcode}\" does not exist"}) + + {:error, :not_found} -> + conn + |> put_status(:bad_request) + |> json(%{error: "pack \"#{name}\" is not found"}) + + {:error, :empty_values} -> + conn + |> put_status(:bad_request) + |> json(%{error: "pack name or shortcode cannot be empty"}) + + {:error, _} -> + render_error( + conn, + :internal_server_error, + "Unexpected error occurred while removing file from pack." + ) + end + end + + def import_from_filesystem(conn, _params) do + with {:ok, names} <- Pack.import_from_filesystem() do + json(conn, names) + else + {:error, :no_read_write} -> + conn + |> put_status(:internal_server_error) + |> json(%{error: "Error: emoji pack directory must be writable"}) + + {:error, _} -> + conn + |> put_status(:internal_server_error) + |> json(%{error: "Error accessing emoji pack directory"}) + end + end + + defp get_filename(%Plug.Upload{filename: filename}), do: filename + defp get_filename(url) when is_binary(url), do: Path.basename(url) +end diff --git a/lib/pleroma/web/pleroma_api/controllers/emoji_reaction_controller.ex b/lib/pleroma/web/pleroma_api/controllers/emoji_reaction_controller.ex new file mode 100644 index 000000000..19dcffdf3 --- /dev/null +++ b/lib/pleroma/web/pleroma_api/controllers/emoji_reaction_controller.ex @@ -0,0 +1,63 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.PleromaAPI.EmojiReactionController do + use Pleroma.Web, :controller + + alias Pleroma.Activity + alias Pleroma.Object + alias Pleroma.Plugs.OAuthScopesPlug + alias Pleroma.Web.CommonAPI + alias Pleroma.Web.MastodonAPI.StatusView + + plug(Pleroma.Web.ApiSpec.CastAndValidate) + plug(OAuthScopesPlug, %{scopes: ["write:statuses"]} when action in [:create, :delete]) + + plug( + OAuthScopesPlug, + %{scopes: ["read:statuses"], fallback: :proceed_unauthenticated} + when action == :index + ) + + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.EmojiReactionOperation + + action_fallback(Pleroma.Web.MastodonAPI.FallbackController) + + def index(%{assigns: %{user: user}} = conn, %{id: activity_id} = params) do + with %Activity{} = activity <- Activity.get_by_id_with_object(activity_id), + %Object{data: %{"reactions" => reactions}} when is_list(reactions) <- + Object.normalize(activity) do + reactions = filter(reactions, params) + render(conn, "index.json", emoji_reactions: reactions, user: user) + else + _e -> json(conn, []) + end + end + + defp filter(reactions, %{emoji: emoji}) when is_binary(emoji) do + Enum.filter(reactions, fn [e, _] -> e == emoji end) + end + + defp filter(reactions, _), do: reactions + + def create(%{assigns: %{user: user}} = conn, %{id: activity_id, emoji: emoji}) do + with {:ok, _activity} <- CommonAPI.react_with_emoji(activity_id, user, emoji) do + activity = Activity.get_by_id(activity_id) + + conn + |> put_view(StatusView) + |> render("show.json", activity: activity, for: user, as: :activity) + end + end + + def delete(%{assigns: %{user: user}} = conn, %{id: activity_id, emoji: emoji}) do + with {:ok, _activity} <- CommonAPI.unreact_with_emoji(activity_id, user, emoji) do + activity = Activity.get_by_id(activity_id) + + conn + |> put_view(StatusView) + |> render("show.json", activity: activity, for: user, as: :activity) + end + end +end diff --git a/lib/pleroma/web/pleroma_api/controllers/mascot_controller.ex b/lib/pleroma/web/pleroma_api/controllers/mascot_controller.ex index d9c1c8636..df6c50ca5 100644 --- a/lib/pleroma/web/pleroma_api/controllers/mascot_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/mascot_controller.ex @@ -9,10 +9,11 @@ defmodule Pleroma.Web.PleromaAPI.MascotController do alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub + plug(Pleroma.Web.ApiSpec.CastAndValidate) plug(OAuthScopesPlug, %{scopes: ["read:accounts"]} when action == :show) plug(OAuthScopesPlug, %{scopes: ["write:accounts"]} when action != :show) - plug(Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug) + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.PleromaMascotOperation @doc "GET /api/v1/pleroma/mascot" def show(%{assigns: %{user: user}} = conn, _params) do @@ -20,7 +21,7 @@ def show(%{assigns: %{user: user}} = conn, _params) do end @doc "PUT /api/v1/pleroma/mascot" - def update(%{assigns: %{user: user}} = conn, %{"file" => file}) do + def update(%{assigns: %{user: user}, body_params: %{file: file}} = conn, _) do with {:ok, object} <- ActivityPub.upload(file, actor: User.ap_id(user)), # Reject if not an image %{type: "image"} = attachment <- render_attachment(object) do diff --git a/lib/pleroma/web/pleroma_api/controllers/notification_controller.ex b/lib/pleroma/web/pleroma_api/controllers/notification_controller.ex new file mode 100644 index 000000000..3ed8bd294 --- /dev/null +++ b/lib/pleroma/web/pleroma_api/controllers/notification_controller.ex @@ -0,0 +1,36 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.PleromaAPI.NotificationController do + use Pleroma.Web, :controller + + alias Pleroma.Notification + alias Pleroma.Plugs.OAuthScopesPlug + + plug(Pleroma.Web.ApiSpec.CastAndValidate) + plug(OAuthScopesPlug, %{scopes: ["write:notifications"]} when action == :mark_as_read) + plug(:put_view, Pleroma.Web.MastodonAPI.NotificationView) + + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.PleromaNotificationOperation + + def mark_as_read(%{assigns: %{user: user}, body_params: %{id: notification_id}} = conn, _) do + with {:ok, notification} <- Notification.read_one(user, notification_id) do + render(conn, "show.json", notification: notification, for: user) + else + {:error, message} -> + conn + |> put_status(:bad_request) + |> json(%{"error" => message}) + end + end + + def mark_as_read(%{assigns: %{user: user}, body_params: %{max_id: max_id}} = conn, _) do + notifications = + user + |> Notification.set_read_up_to(max_id) + |> Enum.take(80) + + render(conn, "index.json", notifications: notifications, for: user) + end +end diff --git a/lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex b/lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex deleted file mode 100644 index dae7f0f2f..000000000 --- a/lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex +++ /dev/null @@ -1,196 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.PleromaAPI.PleromaAPIController do - use Pleroma.Web, :controller - - import Pleroma.Web.ControllerHelper, only: [add_link_headers: 2] - - alias Pleroma.Activity - alias Pleroma.Conversation.Participation - alias Pleroma.Notification - alias Pleroma.Object - alias Pleroma.Plugs.OAuthScopesPlug - alias Pleroma.User - alias Pleroma.Web.ActivityPub.ActivityPub - alias Pleroma.Web.CommonAPI - alias Pleroma.Web.MastodonAPI.AccountView - alias Pleroma.Web.MastodonAPI.ConversationView - alias Pleroma.Web.MastodonAPI.NotificationView - alias Pleroma.Web.MastodonAPI.StatusView - - plug( - OAuthScopesPlug, - %{scopes: ["read:statuses"]} - when action in [:conversation, :conversation_statuses] - ) - - plug( - OAuthScopesPlug, - %{scopes: ["write:statuses"]} - when action in [:react_with_emoji, :unreact_with_emoji] - ) - - plug( - OAuthScopesPlug, - %{scopes: ["write:conversations"]} when action == :update_conversation - ) - - plug(OAuthScopesPlug, %{scopes: ["write:notifications"]} when action == :read_notification) - - plug(Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug) - - def emoji_reactions_by(%{assigns: %{user: user}} = conn, %{"id" => activity_id} = params) do - with %Activity{} = activity <- Activity.get_by_id_with_object(activity_id), - %Object{data: %{"reactions" => emoji_reactions}} when is_list(emoji_reactions) <- - Object.normalize(activity) do - reactions = - emoji_reactions - |> Enum.map(fn [emoji, user_ap_ids] -> - if params["emoji"] && params["emoji"] != emoji do - nil - else - users = - Enum.map(user_ap_ids, &User.get_cached_by_ap_id/1) - |> Enum.filter(& &1) - - %{ - name: emoji, - count: length(users), - accounts: AccountView.render("index.json", %{users: users, for: user, as: :user}), - me: !!(user && user.ap_id in user_ap_ids) - } - end - end) - |> Enum.filter(& &1) - - conn - |> json(reactions) - else - _e -> - conn - |> json([]) - end - end - - def react_with_emoji(%{assigns: %{user: user}} = conn, %{"id" => activity_id, "emoji" => emoji}) do - with {:ok, _activity, _object} <- CommonAPI.react_with_emoji(activity_id, user, emoji), - activity <- Activity.get_by_id(activity_id) do - conn - |> put_view(StatusView) - |> render("show.json", %{activity: activity, for: user, as: :activity}) - end - end - - def unreact_with_emoji(%{assigns: %{user: user}} = conn, %{ - "id" => activity_id, - "emoji" => emoji - }) do - with {:ok, _activity, _object} <- CommonAPI.unreact_with_emoji(activity_id, user, emoji), - activity <- Activity.get_by_id(activity_id) do - conn - |> put_view(StatusView) - |> render("show.json", %{activity: activity, for: user, as: :activity}) - end - end - - def conversation(%{assigns: %{user: user}} = conn, %{"id" => participation_id}) do - with %Participation{} = participation <- Participation.get(participation_id), - true <- user.id == participation.user_id do - conn - |> put_view(ConversationView) - |> render("participation.json", %{participation: participation, for: user}) - else - _error -> - conn - |> put_status(404) - |> json(%{"error" => "Unknown conversation id"}) - end - end - - def conversation_statuses( - %{assigns: %{user: user}} = conn, - %{"id" => participation_id} = params - ) do - with %Participation{} = participation <- - Participation.get(participation_id, preload: [:conversation]), - true <- user.id == participation.user_id do - params = - params - |> Map.put("blocking_user", user) - |> Map.put("muting_user", user) - |> Map.put("user", user) - - activities = - participation.conversation.ap_id - |> ActivityPub.fetch_activities_for_context(params) - |> Enum.reverse() - - conn - |> add_link_headers(activities) - |> put_view(StatusView) - |> render("index.json", %{activities: activities, for: user, as: :activity}) - else - _error -> - conn - |> put_status(404) - |> json(%{"error" => "Unknown conversation id"}) - end - end - - def update_conversation( - %{assigns: %{user: user}} = conn, - %{"id" => participation_id, "recipients" => recipients} - ) do - with %Participation{} = participation <- Participation.get(participation_id), - true <- user.id == participation.user_id, - {:ok, participation} <- Participation.set_recipients(participation, recipients) do - conn - |> put_view(ConversationView) - |> render("participation.json", %{participation: participation, for: user}) - else - {:error, message} -> - conn - |> put_status(:bad_request) - |> json(%{"error" => message}) - - _error -> - conn - |> put_status(404) - |> json(%{"error" => "Unknown conversation id"}) - end - end - - def read_conversations(%{assigns: %{user: user}} = conn, _params) do - with {:ok, _, participations} <- Participation.mark_all_as_read(user) do - conn - |> add_link_headers(participations) - |> put_view(ConversationView) - |> render("participations.json", participations: participations, for: user) - end - end - - def read_notification(%{assigns: %{user: user}} = conn, %{"id" => notification_id}) do - with {:ok, notification} <- Notification.read_one(user, notification_id) do - conn - |> put_view(NotificationView) - |> render("show.json", %{notification: notification, for: user}) - else - {:error, message} -> - conn - |> put_status(:bad_request) - |> json(%{"error" => message}) - end - end - - def read_notification(%{assigns: %{user: user}} = conn, %{"max_id" => max_id}) do - with notifications <- Notification.set_read_up_to(user, max_id) do - notifications = Enum.take(notifications, 80) - - conn - |> put_view(NotificationView) - |> render("index.json", %{notifications: notifications, for: user}) - end - end -end diff --git a/lib/pleroma/web/pleroma_api/controllers/scrobble_controller.ex b/lib/pleroma/web/pleroma_api/controllers/scrobble_controller.ex index 4463ec477..8665ca56c 100644 --- a/lib/pleroma/web/pleroma_api/controllers/scrobble_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/scrobble_controller.ex @@ -5,32 +5,27 @@ defmodule Pleroma.Web.PleromaAPI.ScrobbleController do use Pleroma.Web, :controller - import Pleroma.Web.ControllerHelper, only: [add_link_headers: 2, fetch_integer_param: 2] + import Pleroma.Web.ControllerHelper, only: [add_link_headers: 2] alias Pleroma.Plugs.OAuthScopesPlug alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.CommonAPI - alias Pleroma.Web.MastodonAPI.StatusView - plug(OAuthScopesPlug, %{scopes: ["read"]} when action == :user_scrobbles) - plug(OAuthScopesPlug, %{scopes: ["write"]} when action != :user_scrobbles) + plug(Pleroma.Web.ApiSpec.CastAndValidate) - plug(Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug) + plug( + OAuthScopesPlug, + %{scopes: ["read"], fallback: :proceed_unauthenticated} when action == :index + ) - def new_scrobble(%{assigns: %{user: user}} = conn, %{"title" => _} = params) do - params = - if !params["length"] do - params - else - params - |> Map.put("length", fetch_integer_param(params, "length")) - end + plug(OAuthScopesPlug, %{scopes: ["write"]} when action == :create) + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.PleromaScrobbleOperation + + def create(%{assigns: %{user: user}, body_params: params} = conn, _) do with {:ok, activity} <- CommonAPI.listen(user, params) do - conn - |> put_view(StatusView) - |> render("listen.json", %{activity: activity, for: user}) + render(conn, "show.json", activity: activity, for: user) else {:error, message} -> conn @@ -39,16 +34,18 @@ def new_scrobble(%{assigns: %{user: user}} = conn, %{"title" => _} = params) do end end - def user_scrobbles(%{assigns: %{user: reading_user}} = conn, params) do - with %User{} = user <- User.get_cached_by_nickname_or_id(params["id"], for: reading_user) do - params = Map.put(params, "type", ["Listen"]) + def index(%{assigns: %{user: reading_user}} = conn, %{id: id} = params) do + with %User{} = user <- User.get_cached_by_nickname_or_id(id, for: reading_user) do + params = + params + |> Map.new(fn {key, value} -> {to_string(key), value} end) + |> Map.put("type", ["Listen"]) activities = ActivityPub.fetch_user_abstract_activities(user, reading_user, params) conn |> add_link_headers(activities) - |> put_view(StatusView) - |> render("listens.json", %{ + |> render("index.json", %{ activities: activities, for: reading_user, as: :activity diff --git a/lib/pleroma/web/pleroma_api/controllers/two_factor_authentication_controller.ex b/lib/pleroma/web/pleroma_api/controllers/two_factor_authentication_controller.ex new file mode 100644 index 000000000..b86791d09 --- /dev/null +++ b/lib/pleroma/web/pleroma_api/controllers/two_factor_authentication_controller.ex @@ -0,0 +1,133 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.PleromaAPI.TwoFactorAuthenticationController do + @moduledoc "The module represents actions to manage MFA" + use Pleroma.Web, :controller + + import Pleroma.Web.ControllerHelper, only: [json_response: 3] + + alias Pleroma.MFA + alias Pleroma.MFA.TOTP + alias Pleroma.Plugs.OAuthScopesPlug + alias Pleroma.Web.CommonAPI.Utils + + plug(OAuthScopesPlug, %{scopes: ["read:security"]} when action in [:settings]) + + plug( + OAuthScopesPlug, + %{scopes: ["write:security"]} when action in [:setup, :confirm, :disable, :backup_codes] + ) + + @doc """ + Gets user multi factor authentication settings + + ## Endpoint + GET /api/pleroma/accounts/mfa + + """ + def settings(%{assigns: %{user: user}} = conn, _params) do + json(conn, %{settings: MFA.mfa_settings(user)}) + end + + @doc """ + Prepare setup mfa method + + ## Endpoint + GET /api/pleroma/accounts/mfa/setup/[:method] + + """ + def setup(%{assigns: %{user: user}} = conn, %{"method" => "totp"} = _params) do + with {:ok, user} <- MFA.setup_totp(user), + %{secret: secret} = _ <- user.multi_factor_authentication_settings.totp do + provisioning_uri = TOTP.provisioning_uri(secret, "#{user.email}") + + json(conn, %{provisioning_uri: provisioning_uri, key: secret}) + else + {:error, message} -> + json_response(conn, :unprocessable_entity, %{error: message}) + end + end + + def setup(conn, _params) do + json_response(conn, :bad_request, %{error: "undefined method"}) + end + + @doc """ + Confirms setup and enable mfa method + + ## Endpoint + POST /api/pleroma/accounts/mfa/confirm/:method + + - params: + `code` - confirmation code + `password` - current password + """ + def confirm( + %{assigns: %{user: user}} = conn, + %{"method" => "totp", "password" => _, "code" => _} = params + ) do + with {:ok, _user} <- Utils.confirm_current_password(user, params["password"]), + {:ok, _user} <- MFA.confirm_totp(user, params) do + json(conn, %{}) + else + {:error, message} -> + json_response(conn, :unprocessable_entity, %{error: message}) + end + end + + def confirm(conn, _) do + json_response(conn, :bad_request, %{error: "undefined mfa method"}) + end + + @doc """ + Disable mfa method and disable mfa if need. + """ + def disable(%{assigns: %{user: user}} = conn, %{"method" => "totp"} = params) do + with {:ok, user} <- Utils.confirm_current_password(user, params["password"]), + {:ok, _user} <- MFA.disable_totp(user) do + json(conn, %{}) + else + {:error, message} -> + json_response(conn, :unprocessable_entity, %{error: message}) + end + end + + def disable(%{assigns: %{user: user}} = conn, %{"method" => "mfa"} = params) do + with {:ok, user} <- Utils.confirm_current_password(user, params["password"]), + {:ok, _user} <- MFA.disable(user) do + json(conn, %{}) + else + {:error, message} -> + json_response(conn, :unprocessable_entity, %{error: message}) + end + end + + def disable(conn, _) do + json_response(conn, :bad_request, %{error: "undefined mfa method"}) + end + + @doc """ + Generates backup codes. + + ## Endpoint + GET /api/pleroma/accounts/mfa/backup_codes + + ## Response + ### Success + `{codes: [codes]}` + + ### Error + `{error: [error_message]}` + + """ + def backup_codes(%{assigns: %{user: user}} = conn, _params) do + with {:ok, codes} <- MFA.generate_backup_codes(user) do + json(conn, %{codes: codes}) + else + {:error, message} -> + json_response(conn, :unprocessable_entity, %{error: message}) + end + end +end diff --git a/lib/pleroma/web/pleroma_api/views/emoji_reaction_view.ex b/lib/pleroma/web/pleroma_api/views/emoji_reaction_view.ex new file mode 100644 index 000000000..84d2d303d --- /dev/null +++ b/lib/pleroma/web/pleroma_api/views/emoji_reaction_view.ex @@ -0,0 +1,33 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.PleromaAPI.EmojiReactionView do + use Pleroma.Web, :view + + alias Pleroma.Web.MastodonAPI.AccountView + + def render("index.json", %{emoji_reactions: emoji_reactions} = opts) do + render_many(emoji_reactions, __MODULE__, "show.json", opts) + end + + def render("show.json", %{emoji_reaction: [emoji, user_ap_ids], user: user}) do + users = fetch_users(user_ap_ids) + + %{ + name: emoji, + count: length(users), + accounts: render(AccountView, "index.json", users: users, for: user, as: :user), + me: !!(user && user.ap_id in user_ap_ids) + } + end + + defp fetch_users(user_ap_ids) do + user_ap_ids + |> Enum.map(&Pleroma.User.get_cached_by_ap_id/1) + |> Enum.filter(fn + %{deactivated: false} -> true + _ -> false + end) + end +end diff --git a/lib/pleroma/web/pleroma_api/views/scrobble_view.ex b/lib/pleroma/web/pleroma_api/views/scrobble_view.ex new file mode 100644 index 000000000..bbff93abe --- /dev/null +++ b/lib/pleroma/web/pleroma_api/views/scrobble_view.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.PleromaAPI.ScrobbleView do + use Pleroma.Web, :view + + require Pleroma.Constants + + alias Pleroma.Activity + alias Pleroma.HTML + alias Pleroma.Object + 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"]) + created_at = Utils.to_masto_date(activity.data["published"]) + + %{ + id: activity.id, + account: AccountView.render("show.json", %{user: user, for: opts[:for]}), + created_at: created_at, + title: object.data["title"] |> HTML.strip_tags(), + artist: object.data["artist"] |> HTML.strip_tags(), + album: object.data["album"] |> HTML.strip_tags(), + length: object.data["length"] + } + end + + def render("index.json", opts) do + safe_render_many(opts.activities, __MODULE__, "show.json", opts) + end +end diff --git a/lib/pleroma/web/push/impl.ex b/lib/pleroma/web/push/impl.ex index afa510f08..691725702 100644 --- a/lib/pleroma/web/push/impl.ex +++ b/lib/pleroma/web/push/impl.ex @@ -16,6 +16,8 @@ defmodule Pleroma.Web.Push.Impl do require Logger import Ecto.Query + defdelegate mastodon_notification_type(activity), to: Activity + @types ["Create", "Follow", "Announce", "Like", "Move"] @doc "Performs sending notifications for user subscriptions" @@ -24,40 +26,41 @@ def perform( %{ activity: %{data: %{"type" => activity_type}} = activity, user: %User{id: user_id} - } = notif + } = notification ) when activity_type in @types do - actor = User.get_cached_by_ap_id(notif.activity.data["actor"]) + actor = User.get_cached_by_ap_id(notification.activity.data["actor"]) - type = Activity.mastodon_notification_type(notif.activity) + mastodon_type = mastodon_notification_type(notification.activity) gcm_api_key = Application.get_env(:web_push_encryption, :gcm_api_key) avatar_url = User.avatar_url(actor) object = Object.normalize(activity) user = User.get_cached_by_id(user_id) direct_conversation_id = Activity.direct_conversation_id(activity, user) - for subscription <- fetch_subsriptions(user_id), - get_in(subscription.data, ["alerts", type]) do + for subscription <- fetch_subscriptions(user_id), + Subscription.enabled?(subscription, mastodon_type) do %{ access_token: subscription.token.token, - notification_id: notif.id, - notification_type: type, + notification_id: notification.id, + notification_type: mastodon_type, icon: avatar_url, preferred_locale: "en", pleroma: %{ - activity_id: notif.activity.id, + activity_id: notification.activity.id, direct_conversation_id: direct_conversation_id } } - |> Map.merge(build_content(notif, actor, object)) + |> Map.merge(build_content(notification, actor, object, mastodon_type)) |> Jason.encode!() |> push_message(build_sub(subscription), gcm_api_key, subscription) end + |> (&{:ok, &1}).() end def perform(_) do Logger.warn("Unknown notification type") - :error + {:error, :unknown_type} end @doc "Push message to web" @@ -82,7 +85,7 @@ def push_message(body, sub, api_key, subscription) do end @doc "Gets user subscriptions" - def fetch_subsriptions(user_id) do + def fetch_subscriptions(user_id) do Subscription |> where(user_id: ^user_id) |> preload(:token) @@ -99,28 +102,35 @@ def build_sub(subscription) do } end + def build_content(notification, actor, object, mastodon_type \\ nil) + def build_content( %{ - activity: %{data: %{"directMessage" => true}}, user: %{notification_settings: %{privacy_option: true}} - }, - actor, - _ + } = notification, + _actor, + _object, + mastodon_type ) do - %{title: "New Direct Message", body: "@#{actor.nickname}"} + %{body: format_title(notification, mastodon_type)} end - def build_content(notif, actor, object) do + def build_content(notification, actor, object, mastodon_type) do + mastodon_type = mastodon_type || mastodon_notification_type(notification.activity) + %{ - title: format_title(notif), - body: format_body(notif, actor, object) + title: format_title(notification, mastodon_type), + body: format_body(notification, actor, object, mastodon_type) } end + def format_body(activity, actor, object, mastodon_type \\ nil) + def format_body( %{activity: %{data: %{"type" => "Create"}}}, actor, - %{data: %{"content" => content}} + %{data: %{"content" => content}}, + _mastodon_type ) do "@#{actor.nickname}: #{Utils.scrub_html_and_truncate(content, 80)}" end @@ -128,33 +138,44 @@ def format_body( def format_body( %{activity: %{data: %{"type" => "Announce"}}}, actor, - %{data: %{"content" => content}} + %{data: %{"content" => content}}, + _mastodon_type ) do "@#{actor.nickname} repeated: #{Utils.scrub_html_and_truncate(content, 80)}" end def format_body( - %{activity: %{data: %{"type" => type}}}, + %{activity: %{data: %{"type" => type}}} = notification, actor, - _object + _object, + mastodon_type ) when type in ["Follow", "Like"] do - case type do - "Follow" -> "@#{actor.nickname} has followed you" - "Like" -> "@#{actor.nickname} has favorited your post" + mastodon_type = mastodon_type || mastodon_notification_type(notification.activity) + + case mastodon_type do + "follow" -> "@#{actor.nickname} has followed you" + "follow_request" -> "@#{actor.nickname} has requested to follow you" + "favourite" -> "@#{actor.nickname} has favorited your post" end end - def format_title(%{activity: %{data: %{"directMessage" => true}}}) do + def format_title(activity, mastodon_type \\ nil) + + def format_title(%{activity: %{data: %{"directMessage" => true}}}, _mastodon_type) do "New Direct Message" end - def format_title(%{activity: %{data: %{"type" => type}}}) do - case type do - "Create" -> "New Mention" - "Follow" -> "New Follower" - "Announce" -> "New Repeat" - "Like" -> "New Favorite" + def format_title(%{activity: activity}, mastodon_type) do + mastodon_type = mastodon_type || mastodon_notification_type(activity) + + case mastodon_type do + "mention" -> "New Mention" + "follow" -> "New Follower" + "follow_request" -> "New Follow Request" + "reblog" -> "New Repeat" + "favourite" -> "New Favorite" + type -> "New #{String.capitalize(type || "event")}" end end end diff --git a/lib/pleroma/web/push/subscription.ex b/lib/pleroma/web/push/subscription.ex index 5c448d6c9..3e401a490 100644 --- a/lib/pleroma/web/push/subscription.ex +++ b/lib/pleroma/web/push/subscription.ex @@ -25,20 +25,28 @@ defmodule Pleroma.Web.Push.Subscription do timestamps() end - @supported_alert_types ~w[follow favourite mention reblog] + @supported_alert_types ~w[follow favourite mention reblog]a - defp alerts(%{"data" => %{"alerts" => alerts}}) do + defp alerts(%{data: %{alerts: alerts}}) do alerts = Map.take(alerts, @supported_alert_types) %{"alerts" => alerts} end + def enabled?(subscription, "follow_request") do + enabled?(subscription, "follow") + end + + def enabled?(subscription, alert_type) do + get_in(subscription.data, ["alerts", alert_type]) + end + def create( %User{} = user, %Token{} = token, %{ - "subscription" => %{ - "endpoint" => endpoint, - "keys" => %{"auth" => key_auth, "p256dh" => key_p256dh} + subscription: %{ + endpoint: endpoint, + keys: %{auth: key_auth, p256dh: key_p256dh} } } = params ) do diff --git a/lib/pleroma/web/rel_me.ex b/lib/pleroma/web/rel_me.ex index e97c398dc..8e2b51508 100644 --- a/lib/pleroma/web/rel_me.ex +++ b/lib/pleroma/web/rel_me.ex @@ -3,11 +3,9 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Web.RelMe do - @hackney_options [ + @options [ pool: :media, - recv_timeout: 2_000, - max_body: 2_000_000, - with_body: true + max_body: 2_000_000 ] if Pleroma.Config.get(:env) == :test do @@ -25,8 +23,18 @@ def parse(url) when is_binary(url) do def parse(_), do: {:error, "No URL provided"} defp parse_url(url) do + opts = + if Application.get_env(:tesla, :adapter) == Tesla.Adapter.Hackney do + Keyword.merge(@options, + recv_timeout: 2_000, + with_body: true + ) + else + @options + end + with {:ok, %Tesla.Env{body: html, status: status}} when status in 200..299 <- - Pleroma.HTTP.get(url, [], adapter: @hackney_options), + Pleroma.HTTP.get(url, [], adapter: opts), {:ok, html_tree} <- Floki.parse_document(html), data <- Floki.attribute(html_tree, "link[rel~=me]", "href") ++ diff --git a/lib/pleroma/web/rich_media/helpers.ex b/lib/pleroma/web/rich_media/helpers.ex index 0314535d2..9d3d7f978 100644 --- a/lib/pleroma/web/rich_media/helpers.ex +++ b/lib/pleroma/web/rich_media/helpers.ex @@ -64,5 +64,8 @@ def fetch_data_for_activity(%Activity{data: %{"type" => "Create"}} = activity) d def fetch_data_for_activity(_), do: %{} - def perform(:fetch, %Activity{} = activity), do: fetch_data_for_activity(activity) + def perform(:fetch, %Activity{} = activity) do + fetch_data_for_activity(activity) + :ok + end end diff --git a/lib/pleroma/web/rich_media/parser.ex b/lib/pleroma/web/rich_media/parser.ex index 0779065ee..40980def8 100644 --- a/lib/pleroma/web/rich_media/parser.ex +++ b/lib/pleroma/web/rich_media/parser.ex @@ -3,11 +3,9 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Web.RichMedia.Parser do - @hackney_options [ + @options [ pool: :media, - recv_timeout: 2_000, - max_body: 2_000_000, - with_body: true + max_body: 2_000_000 ] defp parsers do @@ -77,8 +75,18 @@ defp get_ttl_from_image(data, url) do end defp parse_url(url) do + opts = + if Application.get_env(:tesla, :adapter) == Tesla.Adapter.Hackney do + Keyword.merge(@options, + recv_timeout: 2_000, + with_body: true + ) + else + @options + end + try do - {:ok, %Tesla.Env{body: html}} = Pleroma.HTTP.get(url, [], adapter: @hackney_options) + {:ok, %Tesla.Env{body: html}} = Pleroma.HTTP.get(url, [], adapter: opts) html |> parse_html() diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index eef0a8023..a2626521e 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -16,75 +16,70 @@ defmodule Pleroma.Web.Router do plug(Pleroma.Plugs.UserEnabledPlug) end - pipeline :api do - plug(:accepts, ["json"]) - plug(:fetch_session) + pipeline :expect_authentication do + plug(Pleroma.Plugs.ExpectAuthenticatedCheckPlug) + end + + pipeline :expect_public_instance_or_authentication do + plug(Pleroma.Plugs.ExpectPublicOrAuthenticatedCheckPlug) + end + + pipeline :authenticate do plug(Pleroma.Plugs.OAuthPlug) plug(Pleroma.Plugs.BasicAuthDecoderPlug) plug(Pleroma.Plugs.UserFetcherPlug) plug(Pleroma.Plugs.SessionAuthenticationPlug) plug(Pleroma.Plugs.LegacyAuthenticationPlug) plug(Pleroma.Plugs.AuthenticationPlug) + end + + pipeline :after_auth do plug(Pleroma.Plugs.UserEnabledPlug) plug(Pleroma.Plugs.SetUserSessionIdPlug) plug(Pleroma.Plugs.EnsureUserKeyPlug) + end + + pipeline :base_api do + plug(:accepts, ["json"]) + plug(:fetch_session) + plug(:authenticate) + plug(OpenApiSpex.Plug.PutApiSpec, module: Pleroma.Web.ApiSpec) + end + + pipeline :api do + plug(:expect_public_instance_or_authentication) + plug(:base_api) + plug(:after_auth) plug(Pleroma.Plugs.IdempotencyPlug) end pipeline :authenticated_api do - plug(:accepts, ["json"]) - plug(:fetch_session) - plug(Pleroma.Plugs.OAuthPlug) - plug(Pleroma.Plugs.BasicAuthDecoderPlug) - plug(Pleroma.Plugs.UserFetcherPlug) - plug(Pleroma.Plugs.SessionAuthenticationPlug) - plug(Pleroma.Plugs.LegacyAuthenticationPlug) - plug(Pleroma.Plugs.AuthenticationPlug) - plug(Pleroma.Plugs.UserEnabledPlug) - plug(Pleroma.Plugs.SetUserSessionIdPlug) + plug(:expect_authentication) + plug(:base_api) + plug(:after_auth) plug(Pleroma.Plugs.EnsureAuthenticatedPlug) plug(Pleroma.Plugs.IdempotencyPlug) end pipeline :admin_api do - plug(:accepts, ["json"]) - plug(:fetch_session) - plug(Pleroma.Plugs.OAuthPlug) - plug(Pleroma.Plugs.BasicAuthDecoderPlug) - plug(Pleroma.Plugs.UserFetcherPlug) - plug(Pleroma.Plugs.SessionAuthenticationPlug) - plug(Pleroma.Plugs.LegacyAuthenticationPlug) - plug(Pleroma.Plugs.AuthenticationPlug) + plug(:expect_authentication) + plug(:base_api) plug(Pleroma.Plugs.AdminSecretAuthenticationPlug) - plug(Pleroma.Plugs.UserEnabledPlug) - plug(Pleroma.Plugs.SetUserSessionIdPlug) + plug(:after_auth) plug(Pleroma.Plugs.EnsureAuthenticatedPlug) plug(Pleroma.Plugs.UserIsAdminPlug) plug(Pleroma.Plugs.IdempotencyPlug) end pipeline :mastodon_html do - plug(:accepts, ["html"]) - plug(:fetch_session) - plug(Pleroma.Plugs.OAuthPlug) - plug(Pleroma.Plugs.BasicAuthDecoderPlug) - plug(Pleroma.Plugs.UserFetcherPlug) - plug(Pleroma.Plugs.SessionAuthenticationPlug) - plug(Pleroma.Plugs.LegacyAuthenticationPlug) - plug(Pleroma.Plugs.AuthenticationPlug) - plug(Pleroma.Plugs.UserEnabledPlug) - plug(Pleroma.Plugs.SetUserSessionIdPlug) - plug(Pleroma.Plugs.EnsureUserKeyPlug) + plug(:browser) + plug(:authenticate) + plug(:after_auth) end pipeline :pleroma_html do - plug(:accepts, ["html"]) - plug(:fetch_session) - plug(Pleroma.Plugs.OAuthPlug) - plug(Pleroma.Plugs.BasicAuthDecoderPlug) - plug(Pleroma.Plugs.UserFetcherPlug) - plug(Pleroma.Plugs.SessionAuthenticationPlug) - plug(Pleroma.Plugs.AuthenticationPlug) + plug(:browser) + plug(:authenticate) plug(Pleroma.Plugs.EnsureUserKeyPlug) end @@ -94,10 +89,12 @@ defmodule Pleroma.Web.Router do pipeline :config do plug(:accepts, ["json", "xml"]) + plug(OpenApiSpex.Plug.PutApiSpec, module: Pleroma.Web.ApiSpec) end pipeline :pleroma_api do plug(:accepts, ["html", "json"]) + plug(OpenApiSpex.Plug.PutApiSpec, module: Pleroma.Web.ApiSpec) end pipeline :mailbox_preview do @@ -135,6 +132,7 @@ defmodule Pleroma.Web.Router do post("/users/follow", AdminAPIController, :user_follow) post("/users/unfollow", AdminAPIController, :user_unfollow) + put("/users/disable_mfa", AdminAPIController, :disable_mfa) delete("/users", AdminAPIController, :user_delete) post("/users", AdminAPIController, :users_create) patch("/users/:nickname/toggle_activation", AdminAPIController, :user_toggle_activation) @@ -173,6 +171,8 @@ defmodule Pleroma.Web.Router do get("/users/:nickname/password_reset", AdminAPIController, :get_password_reset) patch("/users/force_password_reset", AdminAPIController, :force_password_reset) + get("/users/:nickname/credentials", AdminAPIController, :show_user_credentials) + patch("/users/:nickname/credentials", AdminAPIController, :update_user_credentials) get("/users", AdminAPIController, :list_users) get("/users/:nickname", AdminAPIController, :user_show) @@ -184,46 +184,57 @@ defmodule Pleroma.Web.Router do patch("/users/resend_confirmation_email", AdminAPIController, :resend_confirmation_email) get("/reports", AdminAPIController, :list_reports) - get("/grouped_reports", AdminAPIController, :list_grouped_reports) get("/reports/:id", AdminAPIController, :report_show) patch("/reports", AdminAPIController, :reports_update) post("/reports/:id/notes", AdminAPIController, :report_notes_create) delete("/reports/:report_id/notes/:id", AdminAPIController, :report_notes_delete) - put("/statuses/:id", AdminAPIController, :status_update) - delete("/statuses/:id", AdminAPIController, :status_delete) - get("/statuses", AdminAPIController, :list_statuses) + get("/statuses/:id", StatusController, :show) + put("/statuses/:id", StatusController, :update) + delete("/statuses/:id", StatusController, :delete) + get("/statuses", StatusController, :index) get("/config", AdminAPIController, :config_show) post("/config", AdminAPIController, :config_update) get("/config/descriptions", AdminAPIController, :config_descriptions) + get("/need_reboot", AdminAPIController, :need_reboot) get("/restart", AdminAPIController, :restart) get("/moderation_log", AdminAPIController, :list_log) post("/reload_emoji", AdminAPIController, :reload_emoji) get("/stats", AdminAPIController, :stats) + + get("/oauth_app", AdminAPIController, :oauth_app_list) + post("/oauth_app", AdminAPIController, :oauth_app_create) + patch("/oauth_app/:id", AdminAPIController, :oauth_app_update) + delete("/oauth_app/:id", AdminAPIController, :oauth_app_delete) end scope "/api/pleroma/emoji", Pleroma.Web.PleromaAPI do + # Modifying packs scope "/packs" do - # Modifying packs pipe_through(:admin_api) - post("/import_from_fs", EmojiAPIController, :import_from_fs) + get("/import", EmojiPackController, :import_from_filesystem) + get("/remote", EmojiPackController, :remote) + post("/download", EmojiPackController, :download) - post("/:pack_name/update_file", EmojiAPIController, :update_file) - post("/:pack_name/update_metadata", EmojiAPIController, :update_metadata) - put("/:name", EmojiAPIController, :create) - delete("/:name", EmojiAPIController, :delete) - post("/download_from", EmojiAPIController, :download_from) - post("/list_from", EmojiAPIController, :list_from) + post("/:name", EmojiPackController, :create) + patch("/:name", EmojiPackController, :update) + delete("/:name", EmojiPackController, :delete) + + post("/:name/files", EmojiPackController, :add_file) + patch("/:name/files", EmojiPackController, :update_file) + delete("/:name/files", EmojiPackController, :delete_file) end + # Pack info / downloading scope "/packs" do - # Pack info / downloading - get("/", EmojiAPIController, :list_packs) - get("/:name/download_shared/", EmojiAPIController, :download_shared) + pipe_through(:api) + get("/", EmojiPackController, :index) + get("/:name", EmojiPackController, :show) + get("/:name/archive", EmojiPackController, :archive) end end @@ -249,6 +260,16 @@ defmodule Pleroma.Web.Router do post("/follow_import", UtilController, :follow_import) end + scope "/api/pleroma", Pleroma.Web.PleromaAPI do + pipe_through(:authenticated_api) + + get("/accounts/mfa", TwoFactorAuthenticationController, :settings) + get("/accounts/mfa/backup_codes", TwoFactorAuthenticationController, :backup_codes) + get("/accounts/mfa/setup/:method", TwoFactorAuthenticationController, :setup) + post("/accounts/mfa/confirm/:method", TwoFactorAuthenticationController, :confirm) + delete("/accounts/mfa/:method", TwoFactorAuthenticationController, :disable) + end + scope "/oauth", Pleroma.Web.OAuth do scope [] do pipe_through(:oauth) @@ -260,6 +281,10 @@ defmodule Pleroma.Web.Router do post("/revoke", OAuthController, :token_revoke) get("/registration_details", OAuthController, :registration_details) + post("/mfa/challenge", MFAController, :challenge) + post("/mfa/verify", MFAController, :verify, as: :mfa_verify) + get("/mfa", MFAController, :show) + scope [] do pipe_through(:browser) @@ -273,26 +298,22 @@ defmodule Pleroma.Web.Router do scope "/api/v1/pleroma", Pleroma.Web.PleromaAPI do pipe_through(:api) - get("/statuses/:id/reactions/:emoji", PleromaAPIController, :emoji_reactions_by) - get("/statuses/:id/reactions", PleromaAPIController, :emoji_reactions_by) + get("/statuses/:id/reactions/:emoji", EmojiReactionController, :index) + get("/statuses/:id/reactions", EmojiReactionController, :index) end scope "/api/v1/pleroma", Pleroma.Web.PleromaAPI do scope [] do pipe_through(:authenticated_api) - get("/conversations/:id/statuses", PleromaAPIController, :conversation_statuses) - get("/conversations/:id", PleromaAPIController, :conversation) - post("/conversations/read", PleromaAPIController, :read_conversations) - end + get("/conversations/:id/statuses", ConversationController, :statuses) + get("/conversations/:id", ConversationController, :show) + post("/conversations/read", ConversationController, :mark_as_read) + patch("/conversations/:id", ConversationController, :update) - scope [] do - pipe_through(:authenticated_api) - - patch("/conversations/:id", PleromaAPIController, :update_conversation) - put("/statuses/:id/reactions/:emoji", PleromaAPIController, :react_with_emoji) - delete("/statuses/:id/reactions/:emoji", PleromaAPIController, :unreact_with_emoji) - post("/notifications/read", PleromaAPIController, :read_notification) + put("/statuses/:id/reactions/:emoji", EmojiReactionController, :create) + delete("/statuses/:id/reactions/:emoji", EmojiReactionController, :delete) + post("/notifications/read", NotificationController, :mark_as_read) patch("/accounts/update_avatar", AccountController, :update_avatar) patch("/accounts/update_banner", AccountController, :update_banner) @@ -301,7 +322,7 @@ defmodule Pleroma.Web.Router do get("/mascot", MascotController, :show) put("/mascot", MascotController, :update) - post("/scrobble", ScrobbleController, :new_scrobble) + post("/scrobble", ScrobbleController, :create) end scope [] do @@ -321,58 +342,92 @@ defmodule Pleroma.Web.Router do scope "/api/v1/pleroma", Pleroma.Web.PleromaAPI do pipe_through(:api) - get("/accounts/:id/scrobbles", ScrobbleController, :user_scrobbles) + get("/accounts/:id/scrobbles", ScrobbleController, :index) end scope "/api/v1", Pleroma.Web.MastodonAPI do pipe_through(:authenticated_api) get("/accounts/verify_credentials", AccountController, :verify_credentials) + patch("/accounts/update_credentials", AccountController, :update_credentials) get("/accounts/relationships", AccountController, :relationships) - get("/accounts/:id/lists", AccountController, :lists) - get("/accounts/:id/identity_proofs", MastodonAPIController, :empty_array) - - get("/follow_requests", FollowRequestController, :index) + get("/accounts/:id/identity_proofs", AccountController, :identity_proofs) + get("/endorsements", AccountController, :endorsements) get("/blocks", AccountController, :blocks) get("/mutes", AccountController, :mutes) - get("/timelines/home", TimelineController, :home) - get("/timelines/direct", TimelineController, :direct) + post("/follows", AccountController, :follow_by_uri) + post("/accounts/:id/follow", AccountController, :follow) + post("/accounts/:id/unfollow", AccountController, :unfollow) + post("/accounts/:id/block", AccountController, :block) + post("/accounts/:id/unblock", AccountController, :unblock) + post("/accounts/:id/mute", AccountController, :mute) + post("/accounts/:id/unmute", AccountController, :unmute) - get("/favourites", StatusController, :favourites) - get("/bookmarks", StatusController, :bookmarks) + get("/apps/verify_credentials", AppController, :verify_credentials) - get("/notifications", NotificationController, :index) - get("/notifications/:id", NotificationController, :show) - post("/notifications/clear", NotificationController, :clear) - post("/notifications/dismiss", NotificationController, :dismiss) - delete("/notifications/destroy_multiple", NotificationController, :destroy_multiple) + get("/conversations", ConversationController, :index) + post("/conversations/:id/read", ConversationController, :mark_as_read) - get("/scheduled_statuses", ScheduledActivityController, :index) - get("/scheduled_statuses/:id", ScheduledActivityController, :show) + get("/domain_blocks", DomainBlockController, :index) + post("/domain_blocks", DomainBlockController, :create) + delete("/domain_blocks", DomainBlockController, :delete) + + get("/filters", FilterController, :index) + + post("/filters", FilterController, :create) + get("/filters/:id", FilterController, :show) + put("/filters/:id", FilterController, :update) + delete("/filters/:id", FilterController, :delete) + + get("/follow_requests", FollowRequestController, :index) + post("/follow_requests/:id/authorize", FollowRequestController, :authorize) + post("/follow_requests/:id/reject", FollowRequestController, :reject) get("/lists", ListController, :index) get("/lists/:id", ListController, :show) get("/lists/:id/accounts", ListController, :list_accounts) - get("/domain_blocks", DomainBlockController, :index) + delete("/lists/:id", ListController, :delete) + post("/lists", ListController, :create) + put("/lists/:id", ListController, :update) + post("/lists/:id/accounts", ListController, :add_to_list) + delete("/lists/:id/accounts", ListController, :remove_from_list) - get("/filters", FilterController, :index) + get("/markers", MarkerController, :index) + post("/markers", MarkerController, :upsert) - get("/suggestions", SuggestionController, :index) + post("/media", MediaController, :create) + get("/media/:id", MediaController, :show) + put("/media/:id", MediaController, :update) - get("/conversations", ConversationController, :index) - post("/conversations/:id/read", ConversationController, :read) + get("/notifications", NotificationController, :index) + get("/notifications/:id", NotificationController, :show) - get("/endorsements", AccountController, :endorsements) + post("/notifications/:id/dismiss", NotificationController, :dismiss) + post("/notifications/clear", NotificationController, :clear) + delete("/notifications/destroy_multiple", NotificationController, :destroy_multiple) + # Deprecated: was removed in Mastodon v3, use `/notifications/:id/dismiss` instead + post("/notifications/dismiss", NotificationController, :dismiss_via_body) - patch("/accounts/update_credentials", AccountController, :update_credentials) + post("/polls/:id/votes", PollController, :vote) + + post("/reports", ReportController, :create) + + get("/scheduled_statuses", ScheduledActivityController, :index) + get("/scheduled_statuses/:id", ScheduledActivityController, :show) + + put("/scheduled_statuses/:id", ScheduledActivityController, :update) + delete("/scheduled_statuses/:id", ScheduledActivityController, :delete) + + # Unlike `GET /api/v1/accounts/:id/favourites`, demands authentication + get("/favourites", StatusController, :favourites) + get("/bookmarks", StatusController, :bookmarks) post("/statuses", StatusController, :create) delete("/statuses/:id", StatusController, :delete) - post("/statuses/:id/reblog", StatusController, :reblog) post("/statuses/:id/unreblog", StatusController, :unreblog) post("/statuses/:id/favourite", StatusController, :favourite) @@ -384,49 +439,16 @@ defmodule Pleroma.Web.Router do post("/statuses/:id/mute", StatusController, :mute_conversation) post("/statuses/:id/unmute", StatusController, :unmute_conversation) - put("/scheduled_statuses/:id", ScheduledActivityController, :update) - delete("/scheduled_statuses/:id", ScheduledActivityController, :delete) - - post("/polls/:id/votes", PollController, :vote) - - post("/media", MediaController, :create) - put("/media/:id", MediaController, :update) - - delete("/lists/:id", ListController, :delete) - post("/lists", ListController, :create) - put("/lists/:id", ListController, :update) - - post("/lists/:id/accounts", ListController, :add_to_list) - delete("/lists/:id/accounts", ListController, :remove_from_list) - - post("/filters", FilterController, :create) - get("/filters/:id", FilterController, :show) - put("/filters/:id", FilterController, :update) - delete("/filters/:id", FilterController, :delete) - - post("/reports", ReportController, :create) - - post("/follows", AccountController, :follows) - post("/accounts/:id/follow", AccountController, :follow) - post("/accounts/:id/unfollow", AccountController, :unfollow) - post("/accounts/:id/block", AccountController, :block) - post("/accounts/:id/unblock", AccountController, :unblock) - post("/accounts/:id/mute", AccountController, :mute) - post("/accounts/:id/unmute", AccountController, :unmute) - - post("/follow_requests/:id/authorize", FollowRequestController, :authorize) - post("/follow_requests/:id/reject", FollowRequestController, :reject) - - post("/domain_blocks", DomainBlockController, :create) - delete("/domain_blocks", DomainBlockController, :delete) - post("/push/subscription", SubscriptionController, :create) - get("/push/subscription", SubscriptionController, :get) + get("/push/subscription", SubscriptionController, :show) put("/push/subscription", SubscriptionController, :update) delete("/push/subscription", SubscriptionController, :delete) - get("/markers", MarkerController, :index) - post("/markers", MarkerController, :upsert) + get("/suggestions", SuggestionController, :index) + + get("/timelines/home", TimelineController, :home) + get("/timelines/direct", TimelineController, :direct) + get("/timelines/list/:list_id", TimelineController, :list) end scope "/api/web", Pleroma.Web do @@ -438,15 +460,24 @@ defmodule Pleroma.Web.Router do scope "/api/v1", Pleroma.Web.MastodonAPI do pipe_through(:api) - post("/accounts", AccountController, :create) get("/accounts/search", SearchController, :account_search) + get("/search", SearchController, :search) + + get("/accounts/:id/statuses", AccountController, :statuses) + get("/accounts/:id/followers", AccountController, :followers) + get("/accounts/:id/following", AccountController, :following) + get("/accounts/:id", AccountController, :show) + + post("/accounts", AccountController, :create) get("/instance", InstanceController, :show) get("/instance/peers", InstanceController, :peers) post("/apps", AppController, :create) - get("/apps/verify_credentials", AppController, :verify_credentials) + get("/statuses", StatusController, :index) + get("/statuses/:id", StatusController, :show) + get("/statuses/:id/context", StatusController, :context) get("/statuses/:id/card", StatusController, :card) get("/statuses/:id/favourited_by", StatusController, :favourited_by) get("/statuses/:id/reblogged_by", StatusController, :reblogged_by) @@ -457,25 +488,15 @@ defmodule Pleroma.Web.Router do get("/timelines/public", TimelineController, :public) get("/timelines/tag/:tag", TimelineController, :hashtag) - get("/timelines/list/:list_id", TimelineController, :list) - - get("/statuses", StatusController, :index) - get("/statuses/:id", StatusController, :show) - get("/statuses/:id/context", StatusController, :context) get("/polls/:id", PollController, :show) - - get("/accounts/:id/statuses", AccountController, :statuses) - get("/accounts/:id/followers", AccountController, :followers) - get("/accounts/:id/following", AccountController, :following) - get("/accounts/:id", AccountController, :show) - - get("/search", SearchController, :search) end scope "/api/v2", Pleroma.Web.MastodonAPI do pipe_through(:api) get("/search", SearchController, :search2) + + post("/media", MediaController, :create2) end scope "/api", Pleroma.Web do @@ -499,17 +520,23 @@ defmodule Pleroma.Web.Router do ) end + scope "/api" do + pipe_through(:base_api) + + get("/openapi", OpenApiSpex.Plug.RenderSpec, []) + end + scope "/api", Pleroma.Web, as: :authenticated_twitter_api do pipe_through(:authenticated_api) get("/oauth_tokens", TwitterAPI.Controller, :oauth_tokens) delete("/oauth_tokens/:id", TwitterAPI.Controller, :revoke_token) - post("/qvitter/statuses/notifications/read", TwitterAPI.Controller, :notifications_read) - end - - pipeline :ap_service_actor do - plug(:accepts, ["activity+json", "json"]) + post( + "/qvitter/statuses/notifications/read", + TwitterAPI.Controller, + :mark_notifications_as_read + ) end pipeline :ostatus do @@ -522,14 +549,17 @@ defmodule Pleroma.Web.Router do end scope "/", Pleroma.Web do - pipe_through(:ostatus) - pipe_through(:http_signature) + pipe_through([:ostatus, :http_signature]) get("/objects/:uuid", OStatus.OStatusController, :object) get("/activities/:uuid", OStatus.OStatusController, :activity) get("/notice/:id", OStatus.OStatusController, :notice) get("/notice/:id/embed_player", OStatus.OStatusController, :notice_player) + # Mastodon compatibility routes + get("/users/:nickname/statuses/:id", OStatus.OStatusController, :object) + get("/users/:nickname/statuses/:id/activity", OStatus.OStatusController, :activity) + get("/users/:nickname/feed", Feed.UserController, :feed, as: :user_feed) get("/users/:nickname", Feed.UserController, :feed_redirect, as: :user_feed) @@ -541,13 +571,6 @@ defmodule Pleroma.Web.Router do get("/mailer/unsubscribe/:token", Mailer.SubscriptionController, :unsubscribe) end - # Server to Server (S2S) AP interactions - pipeline :activitypub do - plug(:accepts, ["activity+json", "json"]) - plug(Pleroma.Web.Plugs.HTTPSignaturePlug) - plug(Pleroma.Web.Plugs.MappedSignatureToIdentityPlug) - end - scope "/", Pleroma.Web.ActivityPub do # XXX: not really ostatus pipe_through(:ostatus) @@ -555,19 +578,22 @@ defmodule Pleroma.Web.Router do get("/users/:nickname/outbox", ActivityPubController, :outbox) end + pipeline :ap_service_actor do + plug(:accepts, ["activity+json", "json"]) + end + + # Server to Server (S2S) AP interactions + pipeline :activitypub do + plug(:ap_service_actor) + plug(:http_signature) + end + # Client to Server (C2S) AP interactions pipeline :activitypub_client do - plug(:accepts, ["activity+json", "json"]) + plug(:ap_service_actor) plug(:fetch_session) - plug(Pleroma.Plugs.OAuthPlug) - plug(Pleroma.Plugs.BasicAuthDecoderPlug) - plug(Pleroma.Plugs.UserFetcherPlug) - plug(Pleroma.Plugs.SessionAuthenticationPlug) - plug(Pleroma.Plugs.LegacyAuthenticationPlug) - plug(Pleroma.Plugs.AuthenticationPlug) - plug(Pleroma.Plugs.UserEnabledPlug) - plug(Pleroma.Plugs.SetUserSessionIdPlug) - plug(Pleroma.Plugs.EnsureUserKeyPlug) + plug(:authenticate) + plug(:after_auth) end scope "/", Pleroma.Web.ActivityPub do @@ -579,6 +605,7 @@ defmodule Pleroma.Web.Router do post("/users/:nickname/outbox", ActivityPubController, :update_outbox) post("/api/ap/upload_media", ActivityPubController, :upload_media) + # The following two are S2S as well, see `ActivityPub.fetch_follow_information_for_user/1`: get("/users/:nickname/followers", ActivityPubController, :followers) get("/users/:nickname/following", ActivityPubController, :following) end @@ -641,12 +668,7 @@ defmodule Pleroma.Web.Router do get("/embed/:id", EmbedController, :show) end - pipeline :remote_media do - end - scope "/proxy/", Pleroma.Web.MediaProxy do - pipe_through(:remote_media) - get("/:sig/:url", MediaProxyController, :remote) get("/:sig/:url/:filename", MediaProxyController, :remote) end @@ -659,6 +681,34 @@ defmodule Pleroma.Web.Router do end end + # Test-only routes needed to test action dispatching and plug chain execution + if Pleroma.Config.get(:env) == :test do + @test_actions [ + :do_oauth_check, + :fallback_oauth_check, + :skip_oauth_check, + :fallback_oauth_skip_publicity_check, + :skip_oauth_skip_publicity_check, + :missing_oauth_check_definition + ] + + scope "/test/api", Pleroma.Tests do + pipe_through(:api) + + for action <- @test_actions do + get("/#{action}", AuthTestController, action) + end + end + + scope "/test/authenticated_api", Pleroma.Tests do + pipe_through(:authenticated_api) + + for action <- @test_actions do + get("/#{action}", AuthTestController, action) + end + end + end + scope "/", Pleroma.Web.MongooseIM do get("/user_exists", MongooseIMController, :user_exists) get("/check_password", MongooseIMController, :check_password) diff --git a/lib/pleroma/web/static_fe/static_fe_controller.ex b/lib/pleroma/web/static_fe/static_fe_controller.ex index 7f9464268..c3efb6651 100644 --- a/lib/pleroma/web/static_fe/static_fe_controller.ex +++ b/lib/pleroma/web/static_fe/static_fe_controller.ex @@ -18,7 +18,7 @@ defmodule Pleroma.Web.StaticFE.StaticFEController do plug(:assign_id) plug(Pleroma.Plugs.EnsureAuthenticatedPlug, - unless_func: &Pleroma.Web.FederatingPlug.federating?/0 + unless_func: &Pleroma.Web.FederatingPlug.federating?/1 ) @page_keys ["max_id", "min_id", "limit", "since_id", "order"] @@ -60,7 +60,9 @@ defp represent(%Activity{object: %Object{data: data}} = activity, selected) do content = if data["content"] do - Pleroma.HTML.filter_tags(data["content"]) + data["content"] + |> Pleroma.HTML.filter_tags() + |> Pleroma.Emoji.Formatter.emojify(Map.get(data, "emoji", %{})) else nil end diff --git a/lib/pleroma/web/static_fe/static_fe_view.ex b/lib/pleroma/web/static_fe/static_fe_view.ex index 66d87620c..b3d1d1ec8 100644 --- a/lib/pleroma/web/static_fe/static_fe_view.ex +++ b/lib/pleroma/web/static_fe/static_fe_view.ex @@ -18,15 +18,6 @@ defmodule Pleroma.Web.StaticFE.StaticFEView do @media_types ["image", "audio", "video"] - def emoji_for_user(%User{} = user) do - user.source_data - |> Map.get("tag", []) - |> Enum.filter(fn %{"type" => t} -> t == "Emoji" end) - |> Enum.map(fn %{"icon" => %{"url" => url}, "name" => name} -> - {String.trim(name, ":"), url} - end) - end - def fetch_media_type(%{"mediaType" => mediaType}) do Utils.fetch_media_type(@media_types, mediaType) end diff --git a/lib/pleroma/web/streamer/ping.ex b/lib/pleroma/web/streamer/ping.ex deleted file mode 100644 index 7a08202a9..000000000 --- a/lib/pleroma/web/streamer/ping.ex +++ /dev/null @@ -1,37 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.Streamer.Ping do - use GenServer - require Logger - - alias Pleroma.Web.Streamer.State - alias Pleroma.Web.Streamer.StreamerSocket - - @keepalive_interval :timer.seconds(30) - - def start_link(opts) do - ping_interval = Keyword.get(opts, :ping_interval, @keepalive_interval) - GenServer.start_link(__MODULE__, %{ping_interval: ping_interval}, name: __MODULE__) - end - - def init(%{ping_interval: ping_interval} = args) do - Process.send_after(self(), :ping, ping_interval) - {:ok, args} - end - - def handle_info(:ping, %{ping_interval: ping_interval} = state) do - State.get_sockets() - |> Map.values() - |> List.flatten() - |> Enum.each(fn %StreamerSocket{transport_pid: transport_pid} -> - Logger.debug("Sending keepalive ping") - send(transport_pid, {:text, ""}) - end) - - Process.send_after(self(), :ping, ping_interval) - - {:noreply, state} - end -end diff --git a/lib/pleroma/web/streamer/state.ex b/lib/pleroma/web/streamer/state.ex deleted file mode 100644 index 999550b88..000000000 --- a/lib/pleroma/web/streamer/state.ex +++ /dev/null @@ -1,82 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.Streamer.State do - use GenServer - require Logger - - alias Pleroma.Web.Streamer.StreamerSocket - - @env Mix.env() - - def start_link(_) do - GenServer.start_link(__MODULE__, %{sockets: %{}}, name: __MODULE__) - end - - def add_socket(topic, socket) do - GenServer.call(__MODULE__, {:add, topic, socket}) - end - - def remove_socket(topic, socket) do - do_remove_socket(@env, topic, socket) - end - - def get_sockets do - %{sockets: stream_sockets} = GenServer.call(__MODULE__, :get_state) - stream_sockets - end - - def init(init_arg) do - {:ok, init_arg} - end - - def handle_call(:get_state, _from, state) do - {:reply, state, state} - end - - def handle_call({:add, topic, socket}, _from, %{sockets: sockets} = state) do - internal_topic = internal_topic(topic, socket) - stream_socket = StreamerSocket.from_socket(socket) - - sockets_for_topic = - sockets - |> Map.get(internal_topic, []) - |> List.insert_at(0, stream_socket) - |> Enum.uniq() - - state = put_in(state, [:sockets, internal_topic], sockets_for_topic) - Logger.debug("Got new conn for #{topic}") - {:reply, state, state} - end - - def handle_call({:remove, topic, socket}, _from, %{sockets: sockets} = state) do - internal_topic = internal_topic(topic, socket) - stream_socket = StreamerSocket.from_socket(socket) - - sockets_for_topic = - sockets - |> Map.get(internal_topic, []) - |> List.delete(stream_socket) - - state = Kernel.put_in(state, [:sockets, internal_topic], sockets_for_topic) - {:reply, state, state} - end - - defp do_remove_socket(:test, _, _) do - :ok - end - - defp do_remove_socket(_env, topic, socket) do - GenServer.call(__MODULE__, {:remove, topic, socket}) - end - - defp internal_topic(topic, socket) - when topic in ~w[user user:notification direct] do - "#{topic}:#{socket.assigns[:user].id}" - end - - defp internal_topic(topic, _) do - topic - end -end diff --git a/lib/pleroma/web/streamer/streamer.ex b/lib/pleroma/web/streamer/streamer.ex index 814d5a729..0cf41189b 100644 --- a/lib/pleroma/web/streamer/streamer.ex +++ b/lib/pleroma/web/streamer/streamer.ex @@ -3,53 +3,288 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Web.Streamer do - alias Pleroma.Web.Streamer.State - alias Pleroma.Web.Streamer.Worker + require Logger + + alias Pleroma.Activity + alias Pleroma.Config + alias Pleroma.Conversation.Participation + alias Pleroma.Notification + alias Pleroma.Object + alias Pleroma.User + alias Pleroma.Web.ActivityPub.ActivityPub + alias Pleroma.Web.ActivityPub.Visibility + alias Pleroma.Web.CommonAPI + alias Pleroma.Web.StreamerView - @timeout 60_000 @mix_env Mix.env() + @registry Pleroma.Web.StreamerRegistry - def add_socket(topic, socket) do - State.add_socket(topic, socket) + def registry, do: @registry + + @public_streams ["public", "public:local", "public:media", "public:local:media"] + @user_streams ["user", "user:notification", "direct"] + + @doc "Expands and authorizes a stream, and registers the process for streaming." + @spec get_topic_and_add_socket(stream :: String.t(), User.t() | nil, Map.t() | nil) :: + {:ok, topic :: String.t()} | {:error, :bad_topic} | {:error, :unauthorized} + def get_topic_and_add_socket(stream, user, params \\ %{}) do + case get_topic(stream, user, params) do + {:ok, topic} -> add_socket(topic, user) + error -> error + end end - def remove_socket(topic, socket) do - State.remove_socket(topic, socket) + @doc "Expand and authorizes a stream" + @spec get_topic(stream :: String.t(), User.t() | nil, Map.t()) :: + {:ok, topic :: String.t()} | {:error, :bad_topic} + def get_topic(stream, user, params \\ %{}) + + # Allow all public steams. + def get_topic(stream, _, _) when stream in @public_streams do + {:ok, stream} end - def get_sockets do - State.get_sockets() + # Allow all hashtags streams. + def get_topic("hashtag", _, %{"tag" => tag}) do + {:ok, "hashtag:" <> tag} end - def stream(topics, items) do - if should_send?() do - Task.async(fn -> - :poolboy.transaction( - :streamer_worker, - &Worker.stream(&1, topics, items), - @timeout - ) + # Expand user streams. + def get_topic(stream, %User{} = user, _) when stream in @user_streams do + {:ok, stream <> ":" <> to_string(user.id)} + end + + def get_topic(stream, _, _) when stream in @user_streams do + {:error, :unauthorized} + end + + # List streams. + def get_topic("list", %User{} = user, %{"list" => id}) do + if Pleroma.List.get(id, user) do + {:ok, "list:" <> to_string(id)} + else + {:error, :bad_topic} + end + end + + def get_topic("list", _, _) do + {:error, :unauthorized} + end + + def get_topic(_, _, _) do + {:error, :bad_topic} + end + + @doc "Registers the process for streaming. Use `get_topic/3` to get the full authorized topic." + def add_socket(topic, user) do + if should_env_send?() do + auth? = if user, do: true + Registry.register(@registry, topic, auth?) + end + + {:ok, topic} + end + + def remove_socket(topic) do + if should_env_send?(), do: Registry.unregister(@registry, topic) + end + + def stream(topics, item) when is_list(topics) do + if should_env_send?() do + Enum.each(topics, fn t -> + spawn(fn -> do_stream(t, item) end) end) end + + :ok end - def supervisor, do: Pleroma.Web.Streamer.Supervisor + def stream(topic, items) when is_list(items) do + if should_env_send?() do + Enum.each(items, fn i -> + spawn(fn -> do_stream(topic, i) end) + end) - defp should_send? do - handle_should_send(@mix_env) - end - - defp handle_should_send(:test) do - case Process.whereis(:streamer_worker) do - nil -> - false - - pid -> - Process.alive?(pid) + :ok end end - defp handle_should_send(:benchmark), do: false + def stream(topic, item) do + if should_env_send?() do + spawn(fn -> do_stream(topic, item) end) + end - defp handle_should_send(_), do: true + :ok + end + + def filtered_by_user?(%User{} = user, %Activity{} = item) do + %{block: blocked_ap_ids, mute: muted_ap_ids, reblog_mute: reblog_muted_ap_ids} = + User.outgoing_relationships_ap_ids(user, [:block, :mute, :reblog_mute]) + + recipient_blocks = MapSet.new(blocked_ap_ids ++ muted_ap_ids) + recipients = MapSet.new(item.recipients) + domain_blocks = Pleroma.Web.ActivityPub.MRF.subdomains_regex(user.domain_blocks) + + with parent <- Object.normalize(item) || item, + true <- + Enum.all?([blocked_ap_ids, muted_ap_ids], &(item.actor not in &1)), + true <- item.data["type"] != "Announce" || item.actor not in reblog_muted_ap_ids, + true <- Enum.all?([blocked_ap_ids, muted_ap_ids], &(parent.data["actor"] not in &1)), + true <- MapSet.disjoint?(recipients, recipient_blocks), + %{host: item_host} <- URI.parse(item.actor), + %{host: parent_host} <- URI.parse(parent.data["actor"]), + false <- Pleroma.Web.ActivityPub.MRF.subdomain_match?(domain_blocks, item_host), + false <- Pleroma.Web.ActivityPub.MRF.subdomain_match?(domain_blocks, parent_host), + true <- thread_containment(item, user), + false <- CommonAPI.thread_muted?(user, parent) do + false + else + _ -> true + end + end + + def filtered_by_user?(%User{} = user, %Notification{activity: activity}) do + filtered_by_user?(user, activity) + end + + defp do_stream("direct", item) do + recipient_topics = + User.get_recipients_from_activity(item) + |> Enum.map(fn %{id: id} -> "direct:#{id}" end) + + Enum.each(recipient_topics, fn user_topic -> + Logger.debug("Trying to push direct message to #{user_topic}\n\n") + push_to_socket(user_topic, item) + end) + end + + defp do_stream("participation", participation) do + user_topic = "direct:#{participation.user_id}" + Logger.debug("Trying to push a conversation participation to #{user_topic}\n\n") + + push_to_socket(user_topic, participation) + end + + defp do_stream("list", item) do + # filter the recipient list if the activity is not public, see #270. + recipient_lists = + case Visibility.is_public?(item) do + true -> + Pleroma.List.get_lists_from_activity(item) + + _ -> + Pleroma.List.get_lists_from_activity(item) + |> Enum.filter(fn list -> + owner = User.get_cached_by_id(list.user_id) + + Visibility.visible_for_user?(item, owner) + end) + end + + recipient_topics = + recipient_lists + |> Enum.map(fn %{id: id} -> "list:#{id}" end) + + Enum.each(recipient_topics, fn list_topic -> + Logger.debug("Trying to push message to #{list_topic}\n\n") + push_to_socket(list_topic, item) + end) + end + + defp do_stream(topic, %Notification{} = item) + when topic in ["user", "user:notification"] do + Registry.dispatch(@registry, "#{topic}:#{item.user_id}", fn list -> + Enum.each(list, fn {pid, _auth} -> + send(pid, {:render_with_user, StreamerView, "notification.json", item}) + end) + end) + end + + defp do_stream("user", item) do + Logger.debug("Trying to push to users") + + recipient_topics = + User.get_recipients_from_activity(item) + |> Enum.map(fn %{id: id} -> "user:#{id}" end) + + Enum.each(recipient_topics, fn topic -> + push_to_socket(topic, item) + end) + end + + defp do_stream(topic, item) do + Logger.debug("Trying to push to #{topic}") + Logger.debug("Pushing item to #{topic}") + push_to_socket(topic, item) + end + + defp push_to_socket(topic, %Participation{} = participation) do + rendered = StreamerView.render("conversation.json", participation) + + Registry.dispatch(@registry, topic, fn list -> + Enum.each(list, fn {pid, _} -> + send(pid, {:text, rendered}) + end) + end) + end + + defp push_to_socket(topic, %Activity{ + data: %{"type" => "Delete", "deleted_activity_id" => deleted_activity_id} + }) do + rendered = Jason.encode!(%{event: "delete", payload: to_string(deleted_activity_id)}) + + Registry.dispatch(@registry, topic, fn list -> + Enum.each(list, fn {pid, _} -> + send(pid, {:text, rendered}) + end) + end) + end + + defp push_to_socket(_topic, %Activity{data: %{"type" => "Delete"}}), do: :noop + + defp push_to_socket(topic, item) do + anon_render = StreamerView.render("update.json", item) + + Registry.dispatch(@registry, topic, fn list -> + Enum.each(list, fn {pid, auth?} -> + if auth? do + send(pid, {:render_with_user, StreamerView, "update.json", item}) + else + send(pid, {:text, anon_render}) + end + end) + end) + end + + defp thread_containment(_activity, %User{skip_thread_containment: true}), do: true + + defp thread_containment(activity, user) do + if Config.get([:instance, :skip_thread_containment]) do + true + else + ActivityPub.contain_activity(activity, user) + end + end + + # In test environement, only return true if the registry is started. + # In benchmark environment, returns false. + # In any other environment, always returns true. + cond do + @mix_env == :test -> + def should_env_send? do + case Process.whereis(@registry) do + nil -> + false + + pid -> + Process.alive?(pid) + end + end + + @mix_env == :benchmark -> + def should_env_send?, do: false + + true -> + def should_env_send?, do: true + end end diff --git a/lib/pleroma/web/streamer/streamer_socket.ex b/lib/pleroma/web/streamer/streamer_socket.ex deleted file mode 100644 index 7d5dcd34e..000000000 --- a/lib/pleroma/web/streamer/streamer_socket.ex +++ /dev/null @@ -1,35 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.Streamer.StreamerSocket do - defstruct transport_pid: nil, user: nil - - alias Pleroma.User - alias Pleroma.Web.Streamer.StreamerSocket - - def from_socket(%{ - transport_pid: transport_pid, - assigns: %{user: nil} - }) do - %StreamerSocket{ - transport_pid: transport_pid - } - end - - def from_socket(%{ - transport_pid: transport_pid, - assigns: %{user: %User{} = user} - }) do - %StreamerSocket{ - transport_pid: transport_pid, - user: user - } - end - - def from_socket(%{transport_pid: transport_pid}) do - %StreamerSocket{ - transport_pid: transport_pid - } - end -end diff --git a/lib/pleroma/web/streamer/supervisor.ex b/lib/pleroma/web/streamer/supervisor.ex deleted file mode 100644 index bd9029bc0..000000000 --- a/lib/pleroma/web/streamer/supervisor.ex +++ /dev/null @@ -1,37 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.Streamer.Supervisor do - use Supervisor - - def start_link(opts) do - Supervisor.start_link(__MODULE__, opts, name: __MODULE__) - end - - def init(args) do - children = [ - {Pleroma.Web.Streamer.State, args}, - {Pleroma.Web.Streamer.Ping, args}, - :poolboy.child_spec(:streamer_worker, poolboy_config()) - ] - - opts = [strategy: :one_for_one, name: Pleroma.Web.Streamer.Supervisor] - Supervisor.init(children, opts) - end - - defp poolboy_config do - opts = - Pleroma.Config.get(:streamer, - workers: 3, - overflow_workers: 2 - ) - - [ - {:name, {:local, :streamer_worker}}, - {:worker_module, Pleroma.Web.Streamer.Worker}, - {:size, opts[:workers]}, - {:max_overflow, opts[:overflow_workers]} - ] - end -end diff --git a/lib/pleroma/web/streamer/worker.ex b/lib/pleroma/web/streamer/worker.ex deleted file mode 100644 index 29f992a67..000000000 --- a/lib/pleroma/web/streamer/worker.ex +++ /dev/null @@ -1,226 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.Streamer.Worker do - use GenServer - - require Logger - - alias Pleroma.Activity - alias Pleroma.Config - alias Pleroma.Conversation.Participation - alias Pleroma.Notification - alias Pleroma.Object - alias Pleroma.User - alias Pleroma.Web.ActivityPub.ActivityPub - alias Pleroma.Web.ActivityPub.Visibility - alias Pleroma.Web.CommonAPI - alias Pleroma.Web.Streamer.State - alias Pleroma.Web.Streamer.StreamerSocket - alias Pleroma.Web.StreamerView - - def start_link(_) do - GenServer.start_link(__MODULE__, %{}, []) - end - - def init(init_arg) do - {:ok, init_arg} - end - - def stream(pid, topics, items) do - GenServer.call(pid, {:stream, topics, items}) - end - - def handle_call({:stream, topics, item}, _from, state) when is_list(topics) do - Enum.each(topics, fn t -> - do_stream(%{topic: t, item: item}) - end) - - {:reply, state, state} - end - - def handle_call({:stream, topic, items}, _from, state) when is_list(items) do - Enum.each(items, fn i -> - do_stream(%{topic: topic, item: i}) - end) - - {:reply, state, state} - end - - def handle_call({:stream, topic, item}, _from, state) do - do_stream(%{topic: topic, item: item}) - - {:reply, state, state} - end - - defp do_stream(%{topic: "direct", item: item}) do - recipient_topics = - User.get_recipients_from_activity(item) - |> Enum.map(fn %{id: id} -> "direct:#{id}" end) - - Enum.each(recipient_topics, fn user_topic -> - Logger.debug("Trying to push direct message to #{user_topic}\n\n") - push_to_socket(State.get_sockets(), user_topic, item) - end) - end - - defp do_stream(%{topic: "participation", item: participation}) do - user_topic = "direct:#{participation.user_id}" - Logger.debug("Trying to push a conversation participation to #{user_topic}\n\n") - - push_to_socket(State.get_sockets(), user_topic, participation) - end - - defp do_stream(%{topic: "list", item: item}) do - # filter the recipient list if the activity is not public, see #270. - recipient_lists = - case Visibility.is_public?(item) do - true -> - Pleroma.List.get_lists_from_activity(item) - - _ -> - Pleroma.List.get_lists_from_activity(item) - |> Enum.filter(fn list -> - owner = User.get_cached_by_id(list.user_id) - - Visibility.visible_for_user?(item, owner) - end) - end - - recipient_topics = - recipient_lists - |> Enum.map(fn %{id: id} -> "list:#{id}" end) - - Enum.each(recipient_topics, fn list_topic -> - Logger.debug("Trying to push message to #{list_topic}\n\n") - push_to_socket(State.get_sockets(), list_topic, item) - end) - end - - defp do_stream(%{topic: topic, item: %Notification{} = item}) - when topic in ["user", "user:notification"] do - State.get_sockets() - |> Map.get("#{topic}:#{item.user_id}", []) - |> Enum.each(fn %StreamerSocket{transport_pid: transport_pid, user: socket_user} -> - with %User{} = user <- User.get_cached_by_ap_id(socket_user.ap_id), - true <- should_send?(user, item) do - send(transport_pid, {:text, StreamerView.render("notification.json", socket_user, item)}) - end - end) - end - - defp do_stream(%{topic: "user", item: item}) do - Logger.debug("Trying to push to users") - - recipient_topics = - User.get_recipients_from_activity(item) - |> Enum.map(fn %{id: id} -> "user:#{id}" end) - - Enum.each(recipient_topics, fn topic -> - push_to_socket(State.get_sockets(), topic, item) - end) - end - - defp do_stream(%{topic: topic, item: item}) do - Logger.debug("Trying to push to #{topic}") - Logger.debug("Pushing item to #{topic}") - push_to_socket(State.get_sockets(), topic, item) - end - - defp should_send?(%User{} = user, %Activity{} = item) do - %{block: blocked_ap_ids, mute: muted_ap_ids, reblog_mute: reblog_muted_ap_ids} = - User.outgoing_relations_ap_ids(user, [:block, :mute, :reblog_mute]) - - recipient_blocks = MapSet.new(blocked_ap_ids ++ muted_ap_ids) - recipients = MapSet.new(item.recipients) - domain_blocks = Pleroma.Web.ActivityPub.MRF.subdomains_regex(user.domain_blocks) - - with parent <- Object.normalize(item) || item, - true <- - Enum.all?([blocked_ap_ids, muted_ap_ids], &(item.actor not in &1)), - true <- item.data["type"] != "Announce" || item.actor not in reblog_muted_ap_ids, - true <- Enum.all?([blocked_ap_ids, muted_ap_ids], &(parent.data["actor"] not in &1)), - true <- MapSet.disjoint?(recipients, recipient_blocks), - %{host: item_host} <- URI.parse(item.actor), - %{host: parent_host} <- URI.parse(parent.data["actor"]), - false <- Pleroma.Web.ActivityPub.MRF.subdomain_match?(domain_blocks, item_host), - false <- Pleroma.Web.ActivityPub.MRF.subdomain_match?(domain_blocks, parent_host), - true <- thread_containment(item, user), - false <- CommonAPI.thread_muted?(user, item) do - true - else - _ -> false - end - end - - defp should_send?(%User{} = user, %Notification{activity: activity}) do - should_send?(user, activity) - end - - def push_to_socket(topics, topic, %Activity{data: %{"type" => "Announce"}} = item) do - Enum.each(topics[topic] || [], fn %StreamerSocket{ - transport_pid: transport_pid, - user: socket_user - } -> - # Get the current user so we have up-to-date blocks etc. - if socket_user do - user = User.get_cached_by_ap_id(socket_user.ap_id) - - if should_send?(user, item) do - send(transport_pid, {:text, StreamerView.render("update.json", item, user)}) - end - else - send(transport_pid, {:text, StreamerView.render("update.json", item)}) - end - end) - end - - def push_to_socket(topics, topic, %Participation{} = participation) do - Enum.each(topics[topic] || [], fn %StreamerSocket{transport_pid: transport_pid} -> - send(transport_pid, {:text, StreamerView.render("conversation.json", participation)}) - end) - end - - def push_to_socket(topics, topic, %Activity{ - data: %{"type" => "Delete", "deleted_activity_id" => deleted_activity_id} - }) do - Enum.each(topics[topic] || [], fn %StreamerSocket{transport_pid: transport_pid} -> - send( - transport_pid, - {:text, %{event: "delete", payload: to_string(deleted_activity_id)} |> Jason.encode!()} - ) - end) - end - - def push_to_socket(_topics, _topic, %Activity{data: %{"type" => "Delete"}}), do: :noop - - def push_to_socket(topics, topic, item) do - Enum.each(topics[topic] || [], fn %StreamerSocket{ - transport_pid: transport_pid, - user: socket_user - } -> - # Get the current user so we have up-to-date blocks etc. - if socket_user do - user = User.get_cached_by_ap_id(socket_user.ap_id) - - if should_send?(user, item) do - send(transport_pid, {:text, StreamerView.render("update.json", item, user)}) - end - else - send(transport_pid, {:text, StreamerView.render("update.json", item)}) - end - end) - end - - @spec thread_containment(Activity.t(), User.t()) :: boolean() - defp thread_containment(_activity, %User{skip_thread_containment: true}), do: true - - defp thread_containment(activity, user) do - if Config.get([:instance, :skip_thread_containment]) do - true - else - ActivityPub.contain_activity(activity, user) - end - end -end diff --git a/lib/pleroma/web/templates/embed/show.html.eex b/lib/pleroma/web/templates/embed/show.html.eex index 6bf8fac29..05a3f0ee3 100644 --- a/lib/pleroma/web/templates/embed/show.html.eex +++ b/lib/pleroma/web/templates/embed/show.html.eex @@ -1,11 +1,11 @@
- +
- <%= raw (@author.name |> Formatter.emojify(emoji_for_user(@author))) %> + <%= raw (@author.name |> Formatter.emojify(@author.emoji)) %> <%= full_nickname(@author) %>
diff --git a/lib/pleroma/web/templates/feed/feed/_activity.atom.eex b/lib/pleroma/web/templates/feed/feed/_activity.atom.eex index ac8a75009..78350f2aa 100644 --- a/lib/pleroma/web/templates/feed/feed/_activity.atom.eex +++ b/lib/pleroma/web/templates/feed/feed/_activity.atom.eex @@ -2,10 +2,10 @@ http://activitystrea.ms/schema/1.0/note http://activitystrea.ms/schema/1.0/post <%= @data["id"] %> - <%= activity_title(@object, Keyword.get(@feed_config, :post_title, %{})) %> - <%= activity_content(@object) %> - <%= @data["published"] %> - <%= @data["published"] %> + <%= activity_title(@data, Keyword.get(@feed_config, :post_title, %{})) %> + <%= activity_content(@data) %> + <%= @activity.data["published"] %> + <%= @activity.data["published"] %> <%= activity_context(@activity) %> diff --git a/lib/pleroma/web/templates/feed/feed/_activity.rss.eex b/lib/pleroma/web/templates/feed/feed/_activity.rss.eex index a4dbed638..a304a16af 100644 --- a/lib/pleroma/web/templates/feed/feed/_activity.rss.eex +++ b/lib/pleroma/web/templates/feed/feed/_activity.rss.eex @@ -2,10 +2,10 @@ http://activitystrea.ms/schema/1.0/note http://activitystrea.ms/schema/1.0/post <%= @data["id"] %> - <%= activity_title(@object, Keyword.get(@feed_config, :post_title, %{})) %> - <%= activity_content(@object) %> - <%= @data["published"] %> - <%= @data["published"] %> + <%= activity_title(@data, Keyword.get(@feed_config, :post_title, %{})) %> + <%= activity_content(@data) %> + <%= @activity.data["published"] %> + <%= @activity.data["published"] %> <%= activity_context(@activity) %> diff --git a/lib/pleroma/web/templates/feed/feed/_tag_activity.atom.eex b/lib/pleroma/web/templates/feed/feed/_tag_activity.atom.eex index da4fa6d6c..cf5874a91 100644 --- a/lib/pleroma/web/templates/feed/feed/_tag_activity.atom.eex +++ b/lib/pleroma/web/templates/feed/feed/_tag_activity.atom.eex @@ -1,12 +1,12 @@ http://activitystrea.ms/schema/1.0/note http://activitystrea.ms/schema/1.0/post - + <%= render @view_module, "_tag_author.atom", assigns %> - + <%= @data["id"] %> - <%= activity_title(@object, Keyword.get(@feed_config, :post_title, %{})) %> - <%= activity_content(@object) %> + <%= activity_title(@data, Keyword.get(@feed_config, :post_title, %{})) %> + <%= activity_content(@data) %> <%= if @activity.local do %> @@ -15,8 +15,8 @@ <% end %> - <%= @data["published"] %> - <%= @data["published"] %> + <%= @activity.data["published"] %> + <%= @activity.data["published"] %> <%= activity_context(@activity) %> @@ -26,7 +26,7 @@ <%= if @data["summary"] do %> <%= @data["summary"] %> <% end %> - + <%= for id <- @activity.recipients do %> <%= if id == Pleroma.Constants.as_public() do %> <% end %> <% end %> - + <%= for tag <- @data["tag"] || [] do %> <% end %> diff --git a/lib/pleroma/web/templates/feed/feed/_tag_activity.xml.eex b/lib/pleroma/web/templates/feed/feed/_tag_activity.xml.eex index 295574df1..2334e24a2 100644 --- a/lib/pleroma/web/templates/feed/feed/_tag_activity.xml.eex +++ b/lib/pleroma/web/templates/feed/feed/_tag_activity.xml.eex @@ -1,15 +1,14 @@ - <%= activity_title(@object, Keyword.get(@feed_config, :post_title, %{})) %> - - + <%= activity_title(@data, Keyword.get(@feed_config, :post_title, %{})) %> + + <%= activity_context(@activity) %> <%= activity_context(@activity) %> - <%= pub_date(@data["published"]) %> - - <%= activity_content(@object) %> + <%= pub_date(@activity.data["published"]) %> + + <%= activity_content(@data) %> <%= for attachment <- @data["attachment"] || [] do %> <% end %> - - + diff --git a/lib/pleroma/web/templates/layout/embed.html.eex b/lib/pleroma/web/templates/layout/embed.html.eex index 57ae4f802..8b905f070 100644 --- a/lib/pleroma/web/templates/layout/embed.html.eex +++ b/lib/pleroma/web/templates/layout/embed.html.eex @@ -7,6 +7,7 @@ <%= Phoenix.HTML.raw(assigns[:meta] || "") %> + <%= render @view_module, @view_template, assigns %> diff --git a/lib/pleroma/web/templates/layout/static_fe.html.eex b/lib/pleroma/web/templates/layout/static_fe.html.eex index 819632cec..dc0ee2a5c 100644 --- a/lib/pleroma/web/templates/layout/static_fe.html.eex +++ b/lib/pleroma/web/templates/layout/static_fe.html.eex @@ -5,7 +5,7 @@ <%= Pleroma.Config.get([:instance, :name]) %> <%= Phoenix.HTML.raw(assigns[:meta] || "") %> - +
diff --git a/lib/pleroma/web/templates/o_auth/mfa/recovery.html.eex b/lib/pleroma/web/templates/o_auth/mfa/recovery.html.eex new file mode 100644 index 000000000..750f65386 --- /dev/null +++ b/lib/pleroma/web/templates/o_auth/mfa/recovery.html.eex @@ -0,0 +1,24 @@ +<%= if get_flash(@conn, :info) do %> + +<% end %> +<%= if get_flash(@conn, :error) do %> + +<% end %> + +

Two-factor recovery

+ +<%= form_for @conn, mfa_verify_path(@conn, :verify), [as: "mfa"], fn f -> %> +
+ <%= label f, :code, "Recovery code" %> + <%= text_input f, :code %> + <%= hidden_input f, :mfa_token, value: @mfa_token %> + <%= hidden_input f, :state, value: @state %> + <%= hidden_input f, :redirect_uri, value: @redirect_uri %> + <%= hidden_input f, :challenge_type, value: "recovery" %> +
+ +<%= submit "Verify" %> +<% end %> +"> + Enter a two-factor code + diff --git a/lib/pleroma/web/templates/o_auth/mfa/totp.html.eex b/lib/pleroma/web/templates/o_auth/mfa/totp.html.eex new file mode 100644 index 000000000..af6e546b0 --- /dev/null +++ b/lib/pleroma/web/templates/o_auth/mfa/totp.html.eex @@ -0,0 +1,24 @@ +<%= if get_flash(@conn, :info) do %> + +<% end %> +<%= if get_flash(@conn, :error) do %> + +<% end %> + +

Two-factor authentication

+ +<%= form_for @conn, mfa_verify_path(@conn, :verify), [as: "mfa"], fn f -> %> +
+ <%= label f, :code, "Authentication code" %> + <%= text_input f, :code %> + <%= hidden_input f, :mfa_token, value: @mfa_token %> + <%= hidden_input f, :state, value: @state %> + <%= hidden_input f, :redirect_uri, value: @redirect_uri %> + <%= hidden_input f, :challenge_type, value: "totp" %> +
+ +<%= submit "Verify" %> +<% end %> +"> + Enter a two-factor recovery code + diff --git a/lib/pleroma/web/templates/static_fe/static_fe/_attachment.html.eex b/lib/pleroma/web/templates/static_fe/static_fe/_attachment.html.eex index 7e04e9550..4853e7f4b 100644 --- a/lib/pleroma/web/templates/static_fe/static_fe/_attachment.html.eex +++ b/lib/pleroma/web/templates/static_fe/static_fe/_attachment.html.eex @@ -1,8 +1,8 @@ <%= case @mediaType do %> <% "audio" -> %> - + <% "video" -> %> - + <% _ -> %> -<%= @name %> +<%= @name %> <% end %> diff --git a/lib/pleroma/web/templates/static_fe/static_fe/_notice.html.eex b/lib/pleroma/web/templates/static_fe/static_fe/_notice.html.eex index df5e5eedd..df0244795 100644 --- a/lib/pleroma/web/templates/static_fe/static_fe/_notice.html.eex +++ b/lib/pleroma/web/templates/static_fe/static_fe/_notice.html.eex @@ -1,12 +1,16 @@ -
id="selected" <% end %>> +
id="selected" <% end %>>

- <%= link format_date(@published), to: @link, class: "activity-link" %> + + +

<%= render("_user_card.html", %{user: @user}) %>
<%= if @title != "" do %>
open<% end %>> - <%= raw @title %> + <%= raw @title %>
<%= raw @content %>
<% else %> diff --git a/lib/pleroma/web/templates/static_fe/static_fe/_user_card.html.eex b/lib/pleroma/web/templates/static_fe/static_fe/_user_card.html.eex index c7789f9ac..977b894d3 100644 --- a/lib/pleroma/web/templates/static_fe/static_fe/_user_card.html.eex +++ b/lib/pleroma/web/templates/static_fe/static_fe/_user_card.html.eex @@ -1,10 +1,10 @@
- +
- +
- <%= raw (@user.name |> Formatter.emojify(emoji_for_user(@user))) %> + <%= raw Formatter.emojify(@user.name, @user.emoji) %> <%= @user.nickname %>
diff --git a/lib/pleroma/web/templates/static_fe/static_fe/profile.html.eex b/lib/pleroma/web/templates/static_fe/static_fe/profile.html.eex index 94063c92d..3191bf450 100644 --- a/lib/pleroma/web/templates/static_fe/static_fe/profile.html.eex +++ b/lib/pleroma/web/templates/static_fe/static_fe/profile.html.eex @@ -7,8 +7,8 @@ - <%= raw Formatter.emojify(@user.name, emoji_for_user(@user)) %> | - <%= link "@#{@user.nickname}@#{Endpoint.host()}", to: User.profile_url(@user) %> + <%= raw Formatter.emojify(@user.name, @user.emoji) %> | + <%= link "@#{@user.nickname}@#{Endpoint.host()}", to: (@user.uri || @user.ap_id) %>

<%= raw @user.bio %>

diff --git a/lib/pleroma/web/templates/twitter_api/remote_follow/follow_mfa.html.eex b/lib/pleroma/web/templates/twitter_api/remote_follow/follow_mfa.html.eex new file mode 100644 index 000000000..adc3a3e3d --- /dev/null +++ b/lib/pleroma/web/templates/twitter_api/remote_follow/follow_mfa.html.eex @@ -0,0 +1,13 @@ +<%= if @error do %> +

<%= @error %>

+<% end %> +

Two-factor authentication

+

<%= @followee.nickname %>

+ +<%= form_for @conn, remote_follow_path(@conn, :do_follow), [as: "mfa"], fn f -> %> +<%= text_input f, :code, placeholder: "Authentication code", required: true %> +
+<%= hidden_input f, :id, value: @followee.id %> +<%= hidden_input f, :token, value: @mfa_token %> +<%= submit "Authorize" %> +<% 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 89da760da..521dc9322 100644 --- a/lib/pleroma/web/twitter_api/controllers/remote_follow_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/remote_follow_controller.ex @@ -8,10 +8,12 @@ defmodule Pleroma.Web.TwitterAPI.RemoteFollowController do require Logger alias Pleroma.Activity + alias Pleroma.MFA alias Pleroma.Object.Fetcher alias Pleroma.Plugs.OAuthScopesPlug alias Pleroma.User alias Pleroma.Web.Auth.Authenticator + alias Pleroma.Web.Auth.TOTPAuthenticator alias Pleroma.Web.CommonAPI @status_types ["Article", "Event", "Note", "Video", "Page", "Question"] @@ -68,6 +70,8 @@ defp is_status?(acct) do # POST /ostatus_subscribe # + # adds a remote account in followers if user already is signed in. + # def do_follow(%{assigns: %{user: %User{} = user}} = conn, %{"user" => %{"id" => id}}) do with {:fetch_user, %User{} = followee} <- {:fetch_user, User.get_cached_by_id(id)}, {:ok, _, _, _} <- CommonAPI.follow(user, followee) do @@ -78,9 +82,33 @@ def do_follow(%{assigns: %{user: %User{} = user}} = conn, %{"user" => %{"id" => end end + # POST /ostatus_subscribe + # + # step 1. + # checks login\password and displays step 2 form of MFA if need. + # def do_follow(conn, %{"authorization" => %{"name" => _, "password" => _, "id" => id}}) do - with {:fetch_user, %User{} = followee} <- {:fetch_user, User.get_cached_by_id(id)}, + with {_, %User{} = followee} <- {:fetch_user, User.get_cached_by_id(id)}, {_, {:ok, user}, _} <- {:auth, Authenticator.get_user(conn), followee}, + {_, _, _, false} <- {:mfa_required, followee, user, MFA.require?(user)}, + {:ok, _, _, _} <- CommonAPI.follow(user, followee) do + redirect(conn, to: "/users/#{followee.id}") + else + error -> + handle_follow_error(conn, error) + end + end + + # POST /ostatus_subscribe + # + # step 2 + # checks TOTP code. otherwise displays form with errors + # + def do_follow(conn, %{"mfa" => %{"code" => code, "token" => token, "id" => id}}) do + with {_, %User{} = followee} <- {:fetch_user, User.get_cached_by_id(id)}, + {_, _, {:ok, %{user: user}}} <- {:mfa_token, followee, MFA.Token.validate(token)}, + {_, _, _, {:ok, _}} <- + {:verify_mfa_code, followee, token, TOTPAuthenticator.verify(code, user)}, {:ok, _, _, _} <- CommonAPI.follow(user, followee) do redirect(conn, to: "/users/#{followee.id}") else @@ -94,6 +122,23 @@ def do_follow(%{assigns: %{user: nil}} = conn, _) do render(conn, "followed.html", %{error: "Insufficient permissions: follow | write:follows."}) end + defp handle_follow_error(conn, {:mfa_token, followee, _} = _) do + render(conn, "follow_login.html", %{error: "Wrong username or password", followee: followee}) + end + + defp handle_follow_error(conn, {:verify_mfa_code, followee, token, _} = _) do + render(conn, "follow_mfa.html", %{ + error: "Wrong authentication code", + followee: followee, + mfa_token: token + }) + end + + defp handle_follow_error(conn, {:mfa_required, followee, user, _} = _) do + {:ok, %{token: token}} = MFA.Token.create_token(user) + render(conn, "follow_mfa.html", %{followee: followee, mfa_token: token, error: false}) + end + defp handle_follow_error(conn, {:auth, _, followee} = _) do render(conn, "follow_login.html", %{error: "Wrong username or password", followee: followee}) end diff --git a/lib/pleroma/web/twitter_api/controllers/util_controller.ex b/lib/pleroma/web/twitter_api/controllers/util_controller.ex index 537f9f778..fd2aee175 100644 --- a/lib/pleroma/web/twitter_api/controllers/util_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/util_controller.ex @@ -25,13 +25,6 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do when action == :follow_import ) - # Note: follower can submit the form (with password auth) not being signed in (having no token) - plug( - OAuthScopesPlug, - %{fallback: :proceed_unauthenticated, scopes: ["follow", "write:follows"]} - when action == :do_remote_follow - ) - plug(OAuthScopesPlug, %{scopes: ["follow", "write:blocks"]} when action == :blocks_import) plug( @@ -199,15 +192,16 @@ def follow_import(conn, %{"list" => %Plug.Upload{} = listfile}) do end def follow_import(%{assigns: %{user: follower}} = conn, %{"list" => list}) do - with lines <- String.split(list, "\n"), - followed_identifiers <- - Enum.map(lines, fn line -> - String.split(line, ",") |> List.first() - end) - |> List.delete("Account address") do - User.follow_import(follower, followed_identifiers) - json(conn, "job started") - end + 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 @@ -215,10 +209,9 @@ def blocks_import(conn, %{"list" => %Plug.Upload{} = listfile}) do end def blocks_import(%{assigns: %{user: blocker}} = conn, %{"list" => list}) do - with blocked_identifiers <- String.split(list) do - User.blocks_import(blocker, blocked_identifiers) - json(conn, "job started") - end + 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 diff --git a/lib/pleroma/web/twitter_api/twitter_api.ex b/lib/pleroma/web/twitter_api/twitter_api.ex index f9c0994da..5cfb385ac 100644 --- a/lib/pleroma/web/twitter_api/twitter_api.ex +++ b/lib/pleroma/web/twitter_api/twitter_api.ex @@ -3,81 +3,39 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Web.TwitterAPI.TwitterAPI do + import Pleroma.Web.Gettext + alias Pleroma.Emails.Mailer alias Pleroma.Emails.UserEmail alias Pleroma.Repo alias Pleroma.User alias Pleroma.UserInviteToken - require Pleroma.Constants - def register_user(params, opts \\ []) do - token = params["token"] + params = + params + |> Map.take([:email, :token, :password]) + |> Map.put(:bio, params |> Map.get(:bio, "") |> User.parse_bio()) + |> Map.put(:nickname, params[:username]) + |> Map.put(:name, Map.get(params, :fullname, params[:username])) + |> Map.put(:password_confirmation, params[:password]) - params = %{ - nickname: params["nickname"], - name: params["fullname"], - bio: User.parse_bio(params["bio"]), - email: params["email"], - password: params["password"], - password_confirmation: params["confirm"], - captcha_solution: params["captcha_solution"], - captcha_token: params["captcha_token"], - captcha_answer_data: params["captcha_answer_data"] - } - - captcha_enabled = Pleroma.Config.get([Pleroma.Captcha, :enabled]) - # true if captcha is disabled or enabled and valid, false otherwise - captcha_ok = - if not captcha_enabled do - :ok - else - Pleroma.Captcha.validate( - params[:captcha_token], - params[:captcha_solution], - params[:captcha_answer_data] - ) - end - - # Captcha invalid - if captcha_ok != :ok do - {:error, error} = captcha_ok - # I have no idea how this error handling works - {:error, %{error: Jason.encode!(%{captcha: [error]})}} + if Pleroma.Config.get([:instance, :registrations_open]) do + create_user(params, opts) else - registration_process( - params, - %{ - registrations_open: Pleroma.Config.get([:instance, :registrations_open]), - token: token - }, - opts - ) + create_user_with_invite(params, opts) end end - defp registration_process(params, %{registrations_open: true}, opts) do - create_user(params, opts) - end - - defp registration_process(params, %{token: token}, opts) do - invite = - unless is_nil(token) do - Repo.get_by(UserInviteToken, %{token: token}) - end - - valid_invite? = invite && UserInviteToken.valid_invite?(invite) - - case invite do - nil -> - {:error, "Invalid token"} - - invite when valid_invite? -> - UserInviteToken.update_usage!(invite) - create_user(params, opts) - - _ -> - {:error, "Expired token"} + defp create_user_with_invite(params, opts) do + with %{token: token} when is_binary(token) <- params, + %UserInviteToken{} = invite <- Repo.get_by(UserInviteToken, %{token: token}), + true <- UserInviteToken.valid_invite?(invite) do + UserInviteToken.update_usage!(invite) + create_user(params, opts) + else + nil -> {:error, "Invalid token"} + _ -> {:error, "Expired token"} end end @@ -90,16 +48,17 @@ defp create_user(params, opts) do {:error, changeset} -> errors = - Ecto.Changeset.traverse_errors(changeset, fn {msg, _opts} -> msg end) + changeset + |> Ecto.Changeset.traverse_errors(fn {msg, _opts} -> msg end) |> Jason.encode!() - {:error, %{error: errors}} + {:error, errors} end end def password_reset(nickname_or_email) do with true <- is_binary(nickname_or_email), - %User{local: true, email: email} = user when not is_nil(email) <- + %User{local: true, email: email} = user when is_binary(email) <- User.get_by_nickname_or_email(nickname_or_email), {:ok, token_record} <- Pleroma.PasswordResetToken.create_token(user) do user @@ -121,4 +80,58 @@ def password_reset(nickname_or_email) do {:error, "unknown user"} end end + + def validate_captcha(app, params) do + if app.trusted || not Pleroma.Captcha.enabled?() do + :ok + else + do_validate_captcha(params) + end + end + + defp do_validate_captcha(params) do + with :ok <- validate_captcha_presence(params), + :ok <- + Pleroma.Captcha.validate( + params[:captcha_token], + params[:captcha_solution], + params[:captcha_answer_data] + ) do + :ok + else + {:error, :captcha_error} -> + captcha_error(dgettext("errors", "CAPTCHA Error")) + + {:error, :invalid} -> + captcha_error(dgettext("errors", "Invalid CAPTCHA")) + + {:error, :kocaptcha_service_unavailable} -> + captcha_error(dgettext("errors", "Kocaptcha service unavailable")) + + {:error, :expired} -> + captcha_error(dgettext("errors", "CAPTCHA expired")) + + {:error, :already_used} -> + captcha_error(dgettext("errors", "CAPTCHA already used")) + + {:error, :invalid_answer_data} -> + captcha_error(dgettext("errors", "Invalid answer data")) + + {:error, error} -> + captcha_error(error) + end + end + + defp validate_captcha_presence(params) do + [:captcha_solution, :captcha_token, :captcha_answer_data] + |> Enum.find_value(:ok, fn key -> + unless is_binary(params[key]) do + error = dgettext("errors", "Invalid CAPTCHA (Missing parameter: %{name})", name: key) + {:error, error} + end + end) + end + + # For some reason FE expects error message to be a serialized JSON + defp captcha_error(error), do: {:error, Jason.encode!(%{captcha: [error]})} end diff --git a/lib/pleroma/web/twitter_api/twitter_api_controller.ex b/lib/pleroma/web/twitter_api/twitter_api_controller.ex index 0229aea97..c2de26b0b 100644 --- a/lib/pleroma/web/twitter_api/twitter_api_controller.ex +++ b/lib/pleroma/web/twitter_api/twitter_api_controller.ex @@ -6,6 +6,7 @@ defmodule Pleroma.Web.TwitterAPI.Controller do use Pleroma.Web, :controller alias Pleroma.Notification + alias Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug alias Pleroma.Plugs.OAuthScopesPlug alias Pleroma.User alias Pleroma.Web.OAuth.Token @@ -13,9 +14,17 @@ defmodule Pleroma.Web.TwitterAPI.Controller do require Logger - plug(OAuthScopesPlug, %{scopes: ["write:notifications"]} when action == :notifications_read) + plug( + OAuthScopesPlug, + %{scopes: ["write:notifications"]} when action == :mark_notifications_as_read + ) - plug(Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug) + plug( + :skip_plug, + [OAuthScopesPlug, EnsurePublicOrAuthenticatedPlug] when action == :confirm_email + ) + + plug(:skip_plug, OAuthScopesPlug when action in [:oauth_tokens, :revoke_token]) action_fallback(:errors) @@ -44,13 +53,13 @@ def revoke_token(%{assigns: %{user: user}} = conn, %{"id" => id} = _params) do json_reply(conn, 201, "") end - def errors(conn, {:param_cast, _}) do + defp errors(conn, {:param_cast, _}) do conn |> put_status(400) |> json("Invalid parameters") end - def errors(conn, _) do + defp errors(conn, _) do conn |> put_status(500) |> json("Something went wrong") @@ -62,7 +71,10 @@ defp json_reply(conn, status, json) do |> send_resp(status, json) end - def notifications_read(%{assigns: %{user: user}} = conn, %{"latest_id" => latest_id} = params) do + def mark_notifications_as_read( + %{assigns: %{user: user}} = conn, + %{"latest_id" => latest_id} = params + ) do Notification.set_read_up_to(user, latest_id) notifications = Notification.for_user(user, params) @@ -73,7 +85,7 @@ def notifications_read(%{assigns: %{user: user}} = conn, %{"latest_id" => latest |> render("index.json", %{notifications: notifications, for: user}) end - def notifications_read(%{assigns: %{user: _user}} = conn, _) do + def mark_notifications_as_read(%{assigns: %{user: _user}} = conn, _) do bad_request_reply(conn, "You need to specify latest_id") end diff --git a/lib/pleroma/web/views/embed_view.ex b/lib/pleroma/web/views/embed_view.ex index 77536835b..5f50bd155 100644 --- a/lib/pleroma/web/views/embed_view.ex +++ b/lib/pleroma/web/views/embed_view.ex @@ -19,15 +19,6 @@ defmodule Pleroma.Web.EmbedView do @media_types ["image", "audio", "video"] - defp emoji_for_user(%User{} = user) do - user.source_data - |> Map.get("tag", []) - |> Enum.filter(fn %{"type" => t} -> t == "Emoji" end) - |> Enum.map(fn %{"icon" => %{"url" => url}, "name" => name} -> - {String.trim(name, ":"), url} - end) - end - defp fetch_media_type(%{"mediaType" => mediaType}) do Utils.fetch_media_type(@media_types, mediaType) end diff --git a/lib/pleroma/web/views/streamer_view.ex b/lib/pleroma/web/views/streamer_view.ex index 443868878..237b29ded 100644 --- a/lib/pleroma/web/views/streamer_view.ex +++ b/lib/pleroma/web/views/streamer_view.ex @@ -25,7 +25,7 @@ def render("update.json", %Activity{} = activity, %User{} = user) do |> Jason.encode!() end - def render("notification.json", %User{} = user, %Notification{} = notify) do + def render("notification.json", %Notification{} = notify, %User{} = user) do %{ event: "notification", payload: diff --git a/lib/pleroma/web/web.ex b/lib/pleroma/web/web.ex index cf3ac1287..4f9281851 100644 --- a/lib/pleroma/web/web.ex +++ b/lib/pleroma/web/web.ex @@ -2,6 +2,11 @@ # Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only +defmodule Pleroma.Web.Plug do + # Substitute for `call/2` which is defined with `use Pleroma.Web, :plug` + @callback perform(Plug.Conn.t(), Plug.opts()) :: Plug.Conn.t() +end + defmodule Pleroma.Web do @moduledoc """ A module that keeps using definitions for controllers, @@ -20,11 +25,19 @@ defmodule Pleroma.Web do below. """ + alias Pleroma.Plugs.EnsureAuthenticatedPlug + alias Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug + alias Pleroma.Plugs.ExpectAuthenticatedCheckPlug + alias Pleroma.Plugs.ExpectPublicOrAuthenticatedCheckPlug + alias Pleroma.Plugs.OAuthScopesPlug + alias Pleroma.Plugs.PlugHelper + def controller do quote do use Phoenix.Controller, namespace: Pleroma.Web import Plug.Conn + import Pleroma.Web.Gettext import Pleroma.Web.Router.Helpers import Pleroma.Web.TranslationHelpers @@ -34,6 +47,79 @@ def controller do defp set_put_layout(conn, _) do put_layout(conn, Pleroma.Config.get(:app_layout, "app.html")) end + + # Marks plugs intentionally skipped and blocks their execution if present in plugs chain + defp skip_plug(conn, plug_modules) do + plug_modules + |> List.wrap() + |> Enum.reduce( + conn, + fn plug_module, conn -> + try do + plug_module.skip_plug(conn) + rescue + UndefinedFunctionError -> + raise "`#{plug_module}` is not skippable. Append `use Pleroma.Web, :plug` to its code." + end + end + ) + end + + # Executed just before actual controller action, invokes before-action hooks (callbacks) + defp action(conn, params) do + with %{halted: false} = conn <- maybe_drop_authentication_if_oauth_check_ignored(conn), + %{halted: false} = conn <- maybe_perform_public_or_authenticated_check(conn), + %{halted: false} = conn <- maybe_perform_authenticated_check(conn), + %{halted: false} = conn <- maybe_halt_on_missing_oauth_scopes_check(conn) do + super(conn, params) + end + end + + # For non-authenticated API actions, drops auth info if OAuth scopes check was ignored + # (neither performed nor explicitly skipped) + defp maybe_drop_authentication_if_oauth_check_ignored(conn) do + if PlugHelper.plug_called?(conn, ExpectPublicOrAuthenticatedCheckPlug) and + not PlugHelper.plug_called_or_skipped?(conn, OAuthScopesPlug) do + OAuthScopesPlug.drop_auth_info(conn) + else + conn + end + end + + # Ensures instance is public -or- user is authenticated if such check was scheduled + defp maybe_perform_public_or_authenticated_check(conn) do + if PlugHelper.plug_called?(conn, ExpectPublicOrAuthenticatedCheckPlug) do + EnsurePublicOrAuthenticatedPlug.call(conn, %{}) + else + conn + end + end + + # Ensures user is authenticated if such check was scheduled + # Note: runs prior to action even if it was already executed earlier in plug chain + # (since OAuthScopesPlug has option of proceeding unauthenticated) + defp maybe_perform_authenticated_check(conn) do + if PlugHelper.plug_called?(conn, ExpectAuthenticatedCheckPlug) do + EnsureAuthenticatedPlug.call(conn, %{}) + else + conn + end + end + + # Halts if authenticated API action neither performs nor explicitly skips OAuth scopes check + defp maybe_halt_on_missing_oauth_scopes_check(conn) do + if PlugHelper.plug_called?(conn, ExpectAuthenticatedCheckPlug) and + not PlugHelper.plug_called_or_skipped?(conn, OAuthScopesPlug) do + conn + |> render_error( + :forbidden, + "Security violation: OAuth scopes check was neither handled nor explicitly skipped." + ) + |> halt() + else + conn + end + end end end @@ -96,6 +182,50 @@ def channel do end end + def plug do + quote do + @behaviour Pleroma.Web.Plug + @behaviour Plug + + @doc """ + Marks a plug intentionally skipped and blocks its execution if it's present in plugs chain. + """ + def skip_plug(conn) do + PlugHelper.append_to_private_list( + conn, + PlugHelper.skipped_plugs_list_id(), + __MODULE__ + ) + end + + @impl Plug + @doc """ + Before-plug hook that + * ensures the plug is not skipped + * processes `:if_func` / `:unless_func` functional pre-run conditions + * adds plug to the list of called plugs and calls `perform/2` if checks are passed + + Note: multiple invocations of the same plug (with different or same options) are allowed. + """ + def call(%Plug.Conn{} = conn, options) do + if PlugHelper.plug_skipped?(conn, __MODULE__) || + (options[:if_func] && !options[:if_func].(conn)) || + (options[:unless_func] && options[:unless_func].(conn)) do + conn + else + conn = + PlugHelper.append_to_private_list( + conn, + PlugHelper.called_plugs_list_id(), + __MODULE__ + ) + + apply(__MODULE__, :perform, [conn, options]) + end + end + end + end + @doc """ When used, dispatch to the appropriate controller/view/etc. """ diff --git a/lib/pleroma/web/web_finger/web_finger.ex b/lib/pleroma/web/web_finger/web_finger.ex index 43a81c75d..71ccf251a 100644 --- a/lib/pleroma/web/web_finger/web_finger.ex +++ b/lib/pleroma/web/web_finger/web_finger.ex @@ -86,54 +86,24 @@ def represent_user(user, "XML") do |> XmlBuilder.to_doc() end - defp get_magic_key("data:application/magic-public-key," <> magic_key) do - {:ok, magic_key} - end - - defp get_magic_key(nil) do - Logger.debug("Undefined magic key.") - {:ok, nil} - end - - defp get_magic_key(_) do - {:error, "Missing magic key data."} - end - defp webfinger_from_xml(doc) do - with magic_key <- XML.string_from_xpath(~s{//Link[@rel="magic-public-key"]/@href}, doc), - {:ok, magic_key} <- get_magic_key(magic_key), - topic <- - XML.string_from_xpath( - ~s{//Link[@rel="http://schemas.google.com/g/2010#updates-from"]/@href}, - doc - ), - subject <- XML.string_from_xpath("//Subject", doc), - subscribe_address <- - XML.string_from_xpath( - ~s{//Link[@rel="http://ostatus.org/schema/1.0/subscribe"]/@template}, - doc - ), - ap_id <- - XML.string_from_xpath( - ~s{//Link[@rel="self" and @type="application/activity+json"]/@href}, - doc - ) do - data = %{ - "magic_key" => magic_key, - "topic" => topic, - "subject" => subject, - "subscribe_address" => subscribe_address, - "ap_id" => ap_id - } + subject = XML.string_from_xpath("//Subject", doc) - {:ok, data} - else - {:error, e} -> - {:error, e} + subscribe_address = + ~s{//Link[@rel="http://ostatus.org/schema/1.0/subscribe"]/@template} + |> XML.string_from_xpath(doc) - e -> - {:error, e} - end + ap_id = + ~s{//Link[@rel="self" and @type="application/activity+json"]/@href} + |> XML.string_from_xpath(doc) + + data = %{ + "subject" => subject, + "subscribe_address" => subscribe_address, + "ap_id" => ap_id + } + + {:ok, data} end defp webfinger_from_json(doc) do @@ -146,9 +116,6 @@ defp webfinger_from_json(doc) do {"application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"", "self"} -> Map.put(data, "ap_id", link["href"]) - {_, "http://ostatus.org/schema/1.0/subscribe"} -> - Map.put(data, "subscribe_address", link["template"]) - _ -> Logger.debug("Unhandled type: #{inspect(link["type"])}") data @@ -173,7 +140,8 @@ def find_lrdd_template(domain) do get_template_from_xml(body) else _ -> - with {:ok, %{body: body}} <- HTTP.get("https://#{domain}/.well-known/host-meta", []) do + with {:ok, %{body: body, status: status}} when status in 200..299 <- + HTTP.get("https://#{domain}/.well-known/host-meta", []) do get_template_from_xml(body) else e -> {:error, "Can't find LRDD template: #{inspect(e)}"} @@ -193,19 +161,21 @@ def finger(account) do URI.parse(account).host end + encoded_account = URI.encode("acct:#{account}") + address = case find_lrdd_template(domain) do {:ok, template} -> - String.replace(template, "{uri}", URI.encode(account)) + String.replace(template, "{uri}", encoded_account) _ -> - "https://#{domain}/.well-known/webfinger?resource=acct:#{account}" + "https://#{domain}/.well-known/webfinger?resource=#{encoded_account}" end with response <- HTTP.get( address, - Accept: "application/xrd+xml,application/jrd+json" + [{"accept", "application/xrd+xml,application/jrd+json"}] ), {:ok, %{status: status, body: body}} when status in 200..299 <- response do doc = XML.parse_document(body) diff --git a/lib/pleroma/workers/attachments_cleanup_worker.ex b/lib/pleroma/workers/attachments_cleanup_worker.ex index 3c5820a86..49352db2a 100644 --- a/lib/pleroma/workers/attachments_cleanup_worker.ex +++ b/lib/pleroma/workers/attachments_cleanup_worker.ex @@ -27,8 +27,20 @@ def perform( uploader = Pleroma.Config.get([Pleroma.Upload, :uploader]) + prefix = + case Pleroma.Config.get([Pleroma.Upload, :base_url]) do + nil -> "media" + _ -> "" + end + + base_url = + String.trim_trailing( + Pleroma.Config.get([Pleroma.Upload, :base_url], Pleroma.Web.base_url()), + "/" + ) + # find all objects for copies of the attachments, name and actor doesn't matter here - delete_ids = + object_ids_and_hrefs = from(o in Object, where: fragment( @@ -67,29 +79,28 @@ def perform( |> Enum.map(fn {href, %{id: id, count: count}} -> # only delete files that have single instance with 1 <- count do - prefix = - case Pleroma.Config.get([Pleroma.Upload, :base_url]) do - nil -> "media" - _ -> "" - end + href + |> String.trim_leading("#{base_url}/#{prefix}") + |> uploader.delete_file() - base_url = - String.trim_trailing( - Pleroma.Config.get([Pleroma.Upload, :base_url], Pleroma.Web.base_url()), - "/" - ) - - file_path = String.trim_leading(href, "#{base_url}/#{prefix}") - - uploader.delete_file(file_path) + {id, href} + else + _ -> {id, nil} end - - id end) - from(o in Object, where: o.id in ^delete_ids) + object_ids = Enum.map(object_ids_and_hrefs, fn {id, _} -> id end) + + from(o in Object, where: o.id in ^object_ids) |> Repo.delete_all() + + object_ids_and_hrefs + |> Enum.filter(fn {_, href} -> not is_nil(href) end) + |> Enum.map(&elem(&1, 1)) + |> Pleroma.Web.MediaProxy.Invalidation.purge() + + {:ok, :success} end - def perform(%{"op" => "cleanup_attachments", "object" => _object}, _job), do: :ok + def perform(%{"op" => "cleanup_attachments", "object" => _object}, _job), do: {:ok, :skip} end diff --git a/lib/pleroma/workers/background_worker.ex b/lib/pleroma/workers/background_worker.ex index 0f8ece2c4..57c3a9c3a 100644 --- a/lib/pleroma/workers/background_worker.ex +++ b/lib/pleroma/workers/background_worker.ex @@ -35,7 +35,7 @@ def perform( _job ) do blocker = User.get_cached_by_id(blocker_id) - User.perform(:blocks_import, blocker, blocked_identifiers) + {:ok, User.perform(:blocks_import, blocker, blocked_identifiers)} end def perform( @@ -47,7 +47,7 @@ def perform( _job ) do follower = User.get_cached_by_id(follower_id) - User.perform(:follow_import, follower, followed_identifiers) + {:ok, User.perform(:follow_import, follower, followed_identifiers)} end def perform(%{"op" => "media_proxy_preload", "message" => message}, _job) do diff --git a/lib/pleroma/workers/cron/clear_oauth_token_worker.ex b/lib/pleroma/workers/cron/clear_oauth_token_worker.ex index 341eff054..a4c3b9516 100644 --- a/lib/pleroma/workers/cron/clear_oauth_token_worker.ex +++ b/lib/pleroma/workers/cron/clear_oauth_token_worker.ex @@ -16,6 +16,8 @@ defmodule Pleroma.Workers.Cron.ClearOauthTokenWorker do def perform(_opts, _job) do if Config.get([:oauth2, :clean_expired_tokens], false) do Token.delete_expired_tokens() + else + :ok end end end diff --git a/lib/pleroma/workers/cron/digest_emails_worker.ex b/lib/pleroma/workers/cron/digest_emails_worker.ex index dd13c3b17..7f09ff3cf 100644 --- a/lib/pleroma/workers/cron/digest_emails_worker.ex +++ b/lib/pleroma/workers/cron/digest_emails_worker.ex @@ -37,6 +37,8 @@ def perform(_opts, _job) do ) |> Repo.all() |> send_emails + else + :ok end end diff --git a/lib/pleroma/workers/cron/new_users_digest_worker.ex b/lib/pleroma/workers/cron/new_users_digest_worker.ex index 9bd0a5621..5c816b3fe 100644 --- a/lib/pleroma/workers/cron/new_users_digest_worker.ex +++ b/lib/pleroma/workers/cron/new_users_digest_worker.ex @@ -55,7 +55,11 @@ def perform(_args, _job) do |> Repo.all() |> Enum.map(&Pleroma.Emails.NewUsersDigestEmail.new_users(&1, users_and_statuses)) |> Enum.each(&Pleroma.Emails.Mailer.deliver/1) + else + :ok end + else + :ok end end end diff --git a/lib/pleroma/workers/cron/purge_expired_activities_worker.ex b/lib/pleroma/workers/cron/purge_expired_activities_worker.ex index b8953dd7f..84b3b84de 100644 --- a/lib/pleroma/workers/cron/purge_expired_activities_worker.ex +++ b/lib/pleroma/workers/cron/purge_expired_activities_worker.ex @@ -23,6 +23,8 @@ defmodule Pleroma.Workers.Cron.PurgeExpiredActivitiesWorker do def perform(_opts, _job) do if Config.get([ActivityExpiration, :enabled]) do Enum.each(ActivityExpiration.due_expirations(@interval), &delete_activity/1) + else + :ok end end diff --git a/lib/pleroma/workers/scheduled_activity_worker.ex b/lib/pleroma/workers/scheduled_activity_worker.ex index 8905f4ad0..97d1efbfb 100644 --- a/lib/pleroma/workers/scheduled_activity_worker.ex +++ b/lib/pleroma/workers/scheduled_activity_worker.ex @@ -30,6 +30,8 @@ def perform(%{"activity_id" => activity_id}, _job) do end defp post_activity(%ScheduledActivity{user_id: user_id, params: params} = scheduled_activity) do + params = Map.new(params, fn {key, value} -> {String.to_existing_atom(key), value} end) + with {:delete, {:ok, _}} <- {:delete, ScheduledActivity.delete(scheduled_activity)}, {:user, %User{} = user} <- {:user, User.get_cached_by_id(user_id)}, {:post, {:ok, _}} <- {:post, CommonAPI.post(user, params)} do diff --git a/mix.exs b/mix.exs index dd598345c..03b060bc0 100644 --- a/mix.exs +++ b/mix.exs @@ -36,13 +36,22 @@ def project do releases: [ pleroma: [ include_executables_for: [:unix], - applications: [ex_syslogger: :load, syslog: :load], - steps: [:assemble, ©_files/1, ©_nginx_config/1] + applications: [ex_syslogger: :load, syslog: :load, eldap: :transient], + steps: [:assemble, &put_otp_version/1, ©_files/1, ©_nginx_config/1] ] ] ] end + def put_otp_version(%{path: target_path} = release) do + File.write!( + Path.join([target_path, "OTP_VERSION"]), + Pleroma.OTPVersion.version() + ) + + release + end + def copy_files(%{path: target_path} = release) do File.cp_r!("./rel/files", target_path) release @@ -63,7 +72,14 @@ def copy_nginx_config(%{path: target_path} = release) do def application do [ mod: {Pleroma.Application, []}, - extra_applications: [:logger, :runtime_tools, :comeonin, :quack, :fast_sanitize], + extra_applications: [ + :logger, + :runtime_tools, + :comeonin, + :quack, + :fast_sanitize, + :ssl + ], included_applications: [:ex_syslogger] ] end @@ -108,10 +124,10 @@ defp deps do {:ecto_enum, "~> 1.4"}, {:ecto_sql, "~> 3.3.2"}, {:postgrex, ">= 0.13.5"}, - {:oban, "~> 0.12.1"}, + {:oban, "~> 1.2"}, {:gettext, "~> 0.15"}, - {:comeonin, "~> 4.1.1"}, - {:pbkdf2_elixir, "~> 0.12.3"}, + {:pbkdf2_elixir, "~> 1.0"}, + {:bcrypt_elixir, "~> 2.0"}, {:trailing_format_plug, "~> 0.0.7"}, {:fast_sanitize, "~> 0.1"}, {:html_entities, "~> 0.5", override: true}, @@ -119,7 +135,15 @@ defp deps do {:calendar, "~> 0.17.4"}, {:cachex, "~> 3.2"}, {:poison, "~> 3.0", override: true}, - {:tesla, "~> 1.3", override: true}, + # {:tesla, "~> 1.3", override: true}, + {:tesla, + git: "https://git.pleroma.social/pleroma/elixir-libraries/tesla.git", + ref: "61b7503cef33f00834f78ddfafe0d5d9dec2270b", + override: true}, + {:castore, "~> 0.1"}, + {:cowlib, "~> 2.8", override: true}, + {:gun, + github: "ninenines/gun", ref: "e1a69b36b180a574c0ac314ced9613fdd52312cc", override: true}, {:jason, "~> 1.0"}, {:mogrify, "~> 0.6.1"}, {:ex_aws, "~> 2.1"}, @@ -131,7 +155,7 @@ defp deps do {:credo, "~> 1.1.0", only: [:dev, :test], runtime: false}, {:mock, "~> 0.3.3", only: :test}, {:crypt, - git: "https://github.com/msantos/crypt", ref: "1f2b58927ab57e72910191a7ebaeff984382a1d3"}, + git: "https://github.com/msantos/crypt", ref: "f63a705f92c26955977ee62a313012e309a4d77a"}, {:cors_plug, "~> 1.5"}, {:ex_doc, "~> 0.21", only: :dev, runtime: false}, {:web_push_encryption, "~> 0.2.1"}, @@ -159,6 +183,7 @@ defp deps do {:quack, "~> 0.1.1"}, {:joken, "~> 2.0"}, {:benchee, "~> 1.0"}, + {:pot, "~> 0.10.2"}, {:esshd, "~> 0.1.0", runtime: Application.get_env(:esshd, :enabled, false)}, {:ex_const, "~> 0.2"}, {:plug_static_index_html, "~> 1.0.0"}, @@ -166,12 +191,15 @@ defp deps do {:flake_id, "~> 0.1.0"}, {:remote_ip, git: "https://git.pleroma.social/pleroma/remote_ip.git", - ref: "825dc00aaba5a1b7c4202a532b696b595dd3bcb3"}, + ref: "b647d0deecaa3acb140854fe4bda5b7e1dc6d1c8"}, {:captcha, git: "https://git.pleroma.social/pleroma/elixir-libraries/elixir-captcha.git", ref: "e0f16822d578866e186a0974d65ad58cddc1e2ab"}, {:mox, "~> 0.5", only: :test}, - {:restarter, path: "./restarter"} + {:restarter, path: "./restarter"}, + {:open_api_spex, + git: "https://git.pleroma.social/pleroma/elixir-libraries/open_api_spex.git", + ref: "f296ac0924ba3cf79c7a588c4c252889df4c2edd"} ] ++ oauth_deps() end @@ -203,19 +231,26 @@ defp version(version) do identifier_filter = ~r/[^0-9a-z\-]+/i # Pre-release version, denoted from patch version with a hyphen + {tag, tag_err} = + System.cmd("git", ["describe", "--tags", "--abbrev=0"], stderr_to_stdout: true) + + {describe, describe_err} = System.cmd("git", ["describe", "--tags", "--abbrev=8"]) + {commit_hash, commit_hash_err} = System.cmd("git", ["rev-parse", "--short", "HEAD"]) + git_pre_release = - with {tag, 0} <- - System.cmd("git", ["describe", "--tags", "--abbrev=0"], stderr_to_stdout: true), - {describe, 0} <- System.cmd("git", ["describe", "--tags", "--abbrev=8"]) do - describe - |> String.trim() - |> String.replace(String.trim(tag), "") - |> String.trim_leading("-") - |> String.trim() - else - _ -> - {commit_hash, 0} = System.cmd("git", ["rev-parse", "--short", "HEAD"]) + cond do + tag_err == 0 and describe_err == 0 -> + describe + |> String.trim() + |> String.replace(String.trim(tag), "") + |> String.trim_leading("-") + |> String.trim() + + commit_hash_err == 0 -> "0-g" <> String.trim(commit_hash) + + true -> + "" end # Branch name as pre-release version component, denoted with a dot @@ -233,6 +268,8 @@ defp version(version) do |> String.replace(identifier_filter, "-") branch_name + else + _ -> "stable" end build_name = diff --git a/mix.lock b/mix.lock index 62e14924a..5383c2c6e 100644 --- a/mix.lock +++ b/mix.lock @@ -5,29 +5,32 @@ "base64url": {:hex, :base64url, "0.0.1", "36a90125f5948e3afd7be97662a1504b934dd5dac78451ca6e9abf85a10286be", [:rebar], [], "hexpm"}, "bbcode": {:git, "https://git.pleroma.social/pleroma/elixir-libraries/bbcode.git", "f2d267675e9a7e1ad1ea9beb4cc23382762b66c2", [ref: "v0.2.0"]}, "bbcode_pleroma": {:hex, :bbcode_pleroma, "0.2.0", "d36f5bca6e2f62261c45be30fa9b92725c0655ad45c99025cb1c3e28e25803ef", [:mix], [{:nimble_parsec, "~> 0.5", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "19851074419a5fedb4ef49e1f01b30df504bb5dbb6d6adfc135238063bebd1c3"}, + "bcrypt_elixir": {:hex, :bcrypt_elixir, "2.2.0", "3df902b81ce7fa8867a2ae30d20a1da6877a2c056bfb116fd0bc8a5f0190cea4", [:make, :mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "762be3fcb779f08207531bc6612cca480a338e4b4357abb49f5ce00240a77d1e"}, "benchee": {:hex, :benchee, "1.0.1", "66b211f9bfd84bd97e6d1beaddf8fc2312aaabe192f776e8931cb0c16f53a521", [:mix], [{:deep_merge, "~> 1.0", [hex: :deep_merge, repo: "hexpm", optional: false]}], "hexpm", "3ad58ae787e9c7c94dd7ceda3b587ec2c64604563e049b2a0e8baafae832addb"}, "bunt": {:hex, :bunt, "0.2.0", "951c6e801e8b1d2cbe58ebbd3e616a869061ddadcc4863d0a2182541acae9a38", [:mix], [], "hexpm", "7af5c7e09fe1d40f76c8e4f9dd2be7cebd83909f31fee7cd0e9eadc567da8353"}, "cachex": {:hex, :cachex, "3.2.0", "a596476c781b0646e6cb5cd9751af2e2974c3e0d5498a8cab71807618b74fe2f", [:mix], [{:eternal, "~> 1.2", [hex: :eternal, repo: "hexpm", optional: false]}, {:jumper, "~> 1.0", [hex: :jumper, repo: "hexpm", optional: false]}, {:sleeplocks, "~> 1.1", [hex: :sleeplocks, repo: "hexpm", optional: false]}, {:unsafe, "~> 1.0", [hex: :unsafe, repo: "hexpm", optional: false]}], "hexpm", "aef93694067a43697ae0531727e097754a9e992a1e7946296f5969d6dd9ac986"}, "calendar": {:hex, :calendar, "0.17.6", "ec291cb2e4ba499c2e8c0ef5f4ace974e2f9d02ae9e807e711a9b0c7850b9aee", [:mix], [{:tzdata, "~> 0.5.20 or ~> 0.1.201603 or ~> 1.0", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "738d0e17a93c2ccfe4ddc707bdc8e672e9074c8569498483feb1c4530fb91b2b"}, "captcha": {:git, "https://git.pleroma.social/pleroma/elixir-libraries/elixir-captcha.git", "e0f16822d578866e186a0974d65ad58cddc1e2ab", [ref: "e0f16822d578866e186a0974d65ad58cddc1e2ab"]}, - "certifi": {:hex, :certifi, "2.5.1", "867ce347f7c7d78563450a18a6a28a8090331e77fa02380b4a21962a65d36ee5", [:rebar3], [{:parse_trans, "~>3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm", "805abd97539caf89ec6d4732c91e62ba9da0cda51ac462380bbd28ee697a8c42"}, + "castore": {:hex, :castore, "0.1.5", "591c763a637af2cc468a72f006878584bc6c306f8d111ef8ba1d4c10e0684010", [:mix], [], "hexpm", "6db356b2bc6cc22561e051ff545c20ad064af57647e436650aa24d7d06cd941a"}, + "certifi": {:hex, :certifi, "2.5.2", "b7cfeae9d2ed395695dd8201c57a2d019c0c43ecaf8b8bcb9320b40d6662f340", [:rebar3], [{:parse_trans, "~>3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm", "3b3b5f36493004ac3455966991eaf6e768ce9884693d9968055aeeeb1e575040"}, "combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm", "1b1dbc1790073076580d0d1d64e42eae2366583e7aecd455d1215b0d16f2451b"}, - "comeonin": {:hex, :comeonin, "4.1.2", "3eb5620fd8e35508991664b4c2b04dd41e52f1620b36957be837c1d7784b7592", [:mix], [{:argon2_elixir, "~> 1.2", [hex: :argon2_elixir, repo: "hexpm", optional: true]}, {:bcrypt_elixir, "~> 0.12.1 or ~> 1.0", [hex: :bcrypt_elixir, repo: "hexpm", optional: true]}, {:pbkdf2_elixir, "~> 0.12", [hex: :pbkdf2_elixir, repo: "hexpm", optional: true]}], "hexpm", "d8700a0ca4dbb616c22c9b3f6dd539d88deaafec3efe66869d6370c9a559b3e9"}, + "comeonin": {:hex, :comeonin, "5.3.1", "7fe612b739c78c9c1a75186ef2d322ce4d25032d119823269d0aa1e2f1e20025", [:mix], [], "hexpm", "d6222483060c17f0977fad1b7401ef0c5863c985a64352755f366aee3799c245"}, "connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [:mix], [], "hexpm", "4a0850c9be22a43af9920a71ab17c051f5f7d45c209e40269a1938832510e4d9"}, "cors_plug": {:hex, :cors_plug, "1.5.2", "72df63c87e4f94112f458ce9d25800900cc88608c1078f0e4faddf20933eda6e", [:mix], [{:plug, "~> 1.3 or ~> 1.4 or ~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "9af027d20dc12dd0c4345a6b87247e0c62965871feea0bfecf9764648b02cc69"}, "cowboy": {:hex, :cowboy, "2.7.0", "91ed100138a764355f43316b1d23d7ff6bdb0de4ea618cb5d8677c93a7a2f115", [:rebar3], [{:cowlib, "~> 2.8.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "~> 1.7.1", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "04fd8c6a39edc6aaa9c26123009200fc61f92a3a94f3178c527b70b767c6e605"}, "cowlib": {:hex, :cowlib, "2.8.0", "fd0ff1787db84ac415b8211573e9a30a3ebe71b5cbff7f720089972b2319c8a4", [:rebar3], [], "hexpm", "79f954a7021b302186a950a32869dbc185523d99d3e44ce430cd1f3289f41ed4"}, "credo": {:hex, :credo, "1.1.5", "caec7a3cadd2e58609d7ee25b3931b129e739e070539ad1a0cd7efeeb47014f4", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "d0bbd3222607ccaaac5c0340f7f525c627ae4d7aee6c8c8c108922620c5b6446"}, "crontab": {:hex, :crontab, "1.1.8", "2ce0e74777dfcadb28a1debbea707e58b879e6aa0ffbf9c9bb540887bce43617", [:mix], [{:ecto, "~> 1.0 or ~> 2.0 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: true]}], "hexpm"}, - "crypt": {:git, "https://github.com/msantos/crypt", "1f2b58927ab57e72910191a7ebaeff984382a1d3", [ref: "1f2b58927ab57e72910191a7ebaeff984382a1d3"]}, + "crypt": {:git, "https://github.com/msantos/crypt", "f63a705f92c26955977ee62a313012e309a4d77a", [ref: "f63a705f92c26955977ee62a313012e309a4d77a"]}, "custom_base": {:hex, :custom_base, "0.2.1", "4a832a42ea0552299d81652aa0b1f775d462175293e99dfbe4d7dbaab785a706", [:mix], [], "hexpm", "8df019facc5ec9603e94f7270f1ac73ddf339f56ade76a721eaa57c1493ba463"}, "db_connection": {:hex, :db_connection, "2.2.1", "caee17725495f5129cb7faebde001dc4406796f12a62b8949f4ac69315080566", [:mix], [{:connection, "~> 1.0.2", [hex: :connection, repo: "hexpm", optional: false]}], "hexpm", "2b02ece62d9f983fcd40954e443b7d9e6589664380e5546b2b9b523cd0fb59e1"}, "decimal": {:hex, :decimal, "1.8.1", "a4ef3f5f3428bdbc0d35374029ffcf4ede8533536fa79896dd450168d9acdf3c", [:mix], [], "hexpm", "3cb154b00225ac687f6cbd4acc4b7960027c757a5152b369923ead9ddbca7aec"}, "deep_merge": {:hex, :deep_merge, "1.0.0", "b4aa1a0d1acac393bdf38b2291af38cb1d4a52806cf7a4906f718e1feb5ee961", [:mix], [], "hexpm", "ce708e5f094b9cd4e8f2be4f00d2f4250c4095be93f8cd6d018c753894885430"}, "earmark": {:hex, :earmark, "1.4.3", "364ca2e9710f6bff494117dbbd53880d84bebb692dafc3a78eb50aa3183f2bfd", [:mix], [], "hexpm", "8cf8a291ebf1c7b9539e3cddb19e9cef066c2441b1640f13c34c1d3cfc825fec"}, - "ecto": {:hex, :ecto, "3.3.3", "0830bf3aebcbf3d8c1a1811cd581773b6866886c012f52c0f027031fa96a0b53", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "12e368e3c2a2938d7776defaabdae40e82900fc4d8d66120ec1e01dfd8b93c3a"}, + "ecto": {:hex, :ecto, "3.4.4", "a2c881e80dc756d648197ae0d936216c0308370332c5e77a2325a10293eef845", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "cc4bd3ad62abc3b21fb629f0f7a3dab23a192fca837d257dd08449fba7373561"}, "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"}, + "elixir_make": {:hex, :elixir_make, "0.6.0", "38349f3e29aff4864352084fc736fa7fa0f2995a819a737554f7ebd28b85aaab", [:mix], [], "hexpm", "d522695b93b7f0b4c0fcb2dfe73a6b905b1c301226a5a55cb42e5b14d509e050"}, "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"}, @@ -36,7 +39,7 @@ "ex_const": {:hex, :ex_const, "0.2.4", "d06e540c9d834865b012a17407761455efa71d0ce91e5831e86881b9c9d82448", [:mix], [], "hexpm", "96fd346610cc992b8f896ed26a98be82ac4efb065a0578f334a32d60a3ba9767"}, "ex_doc": {:hex, :ex_doc, "0.21.3", "857ec876b35a587c5d9148a2512e952e24c24345552259464b98bfbb883c7b42", [:mix], [{:earmark, "~> 1.4", [hex: :earmark, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}], "hexpm", "0db1ee8d1547ab4877c5b5dffc6604ef9454e189928d5ba8967d4a58a801f161"}, "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.0", "bc936ee3fd13d9e592cb4c3a1e8a55fccd33b05e3aa7b185f211f3ed263ff8f0", [:mix], [{:poison, ">= 1.5.0", [hex: :poison, repo: "hexpm", optional: true]}, {:syslog, "~> 1.0.5", [hex: :syslog, repo: "hexpm", optional: false]}], "hexpm", "f3b4b184dcdd5f356b7c26c6cd72ab0918ba9dfb4061ccfaf519e562942af87b"}, + "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"}, "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"}, @@ -46,14 +49,15 @@ "gen_stage": {:hex, :gen_stage, "0.14.3", "d0c66f1c87faa301c1a85a809a3ee9097a4264b2edf7644bf5c123237ef732bf", [:mix], [], "hexpm"}, "gen_state_machine": {:hex, :gen_state_machine, "2.0.5", "9ac15ec6e66acac994cc442dcc2c6f9796cf380ec4b08267223014be1c728a95", [:mix], [], "hexpm"}, "gettext": {:hex, :gettext, "0.17.4", "f13088e1ec10ce01665cf25f5ff779e7df3f2dc71b37084976cf89d1aa124d5c", [:mix], [], "hexpm", "3c75b5ea8288e2ee7ea503ff9e30dfe4d07ad3c054576a6e60040e79a801e14d"}, - "hackney": {:hex, :hackney, "1.15.2", "07e33c794f8f8964ee86cebec1a8ed88db5070e52e904b8f12209773c1036085", [:rebar3], [{:certifi, "2.5.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.5", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm", "e0100f8ef7d1124222c11ad362c857d3df7cb5f4204054f9f0f4a728666591fc"}, + "gun": {:git, "https://github.com/ninenines/gun.git", "e1a69b36b180a574c0ac314ced9613fdd52312cc", [ref: "e1a69b36b180a574c0ac314ced9613fdd52312cc"]}, + "hackney": {:hex, :hackney, "1.16.0", "5096ac8e823e3a441477b2d187e30dd3fff1a82991a806b2003845ce72ce2d84", [:rebar3], [{:certifi, "2.5.2", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "6.0.1", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.0", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.6", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm", "3bf0bebbd5d3092a3543b783bf065165fa5d3ad4b899b836810e513064134e18"}, "html_entities": {:hex, :html_entities, "0.5.1", "1c9715058b42c35a2ab65edc5b36d0ea66dd083767bef6e3edb57870ef556549", [:mix], [], "hexpm", "30efab070904eb897ff05cd52fa61c1025d7f8ef3a9ca250bc4e6513d16c32de"}, "html_sanitize_ex": {:hex, :html_sanitize_ex, "1.3.0", "f005ad692b717691203f940c686208aa3d8ffd9dd4bb3699240096a51fa9564e", [:mix], [{:mochiweb, "~> 2.15", [hex: :mochiweb, repo: "hexpm", optional: false]}], "hexpm"}, "http_signatures": {:git, "https://git.pleroma.social/pleroma/http_signatures.git", "293d77bb6f4a67ac8bde1428735c3b42f22cbb30", [ref: "293d77bb6f4a67ac8bde1428735c3b42f22cbb30"]}, "httpoison": {:hex, :httpoison, "1.6.2", "ace7c8d3a361cebccbed19c283c349b3d26991eff73a1eaaa8abae2e3c8089b6", [:mix], [{:hackney, "~> 1.15 and >= 1.15.2", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "aa2c74bd271af34239a3948779612f87df2422c2fdcfdbcec28d9c105f0773fe"}, - "idna": {:hex, :idna, "6.0.0", "689c46cbcdf3524c44d5f3dde8001f364cd7608a99556d8fbd8239a5798d4c10", [:rebar3], [{:unicode_util_compat, "0.4.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "4bdd305eb64e18b0273864920695cb18d7a2021f31a11b9c5fbcd9a253f936e2"}, + "idna": {:hex, :idna, "6.0.1", "1d038fb2e7668ce41fbf681d2c45902e52b3cb9e9c77b55334353b222c2ee50c", [:rebar3], [{:unicode_util_compat, "0.5.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "a02c8a1c4fd601215bb0b0324c8a6986749f807ce35f25449ec9e69758708122"}, "inet_cidr": {:hex, :inet_cidr, "1.0.4", "a05744ab7c221ca8e395c926c3919a821eb512e8f36547c062f62c4ca0cf3d6e", [:mix], [], "hexpm", "64a2d30189704ae41ca7dbdd587f5291db5d1dda1414e0774c29ffc81088c1bc"}, - "jason": {:hex, :jason, "1.1.2", "b03dedea67a99223a2eaf9f1264ce37154564de899fd3d8b9a21b1a6fd64afe7", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "fdf843bca858203ae1de16da2ee206f53416bbda5dc8c9e78f43243de4bc3afe"}, + "jason": {:hex, :jason, "1.2.1", "12b22825e22f468c02eb3e4b9985f3d0cb8dc40b9bd704730efa11abd2708c44", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "b659b8571deedf60f79c5a608e15414085fa141344e2716fbd6988a084b5f993"}, "joken": {:hex, :joken, "2.2.0", "2daa1b12be05184aff7b5ace1d43ca1f81345962285fff3f88db74927c954d3a", [:mix], [{:jose, "~> 1.9", [hex: :jose, repo: "hexpm", optional: false]}], "hexpm", "b4f92e30388206f869dd25d1af628a1d99d7586e5cf0672f64d4df84c4d2f5e9"}, "jose": {:hex, :jose, "1.10.1", "16d8e460dae7203c6d1efa3f277e25b5af8b659febfc2f2eb4bacf87f128b80a", [:mix, :rebar3], [], "hexpm", "3c7ddc8a9394b92891db7c2771da94bf819834a1a4c92e30857b7d582e2f8257"}, "jumper": {:hex, :jumper, "1.0.1", "3c00542ef1a83532b72269fab9f0f0c82bf23a35e27d278bfd9ed0865cecabff", [:mix], [], "hexpm", "318c59078ac220e966d27af3646026db9b5a5e6703cb2aa3e26bcfaba65b7433"}, @@ -71,9 +75,10 @@ "myhtmlex": {:git, "https://git.pleroma.social/pleroma/myhtmlex.git", "ad0097e2f61d4953bfef20fb6abddf23b87111e6", [ref: "ad0097e2f61d4953bfef20fb6abddf23b87111e6", submodules: true]}, "nimble_parsec": {:hex, :nimble_parsec, "0.5.3", "def21c10a9ed70ce22754fdeea0810dafd53c2db3219a0cd54cf5526377af1c6", [:mix], [], "hexpm", "589b5af56f4afca65217a1f3eb3fee7e79b09c40c742fddc1c312b3ac0b3399f"}, "nodex": {:git, "https://git.pleroma.social/pleroma/nodex", "cb6730f943cfc6aad674c92161be23a8411f15d1", [ref: "cb6730f943cfc6aad674c92161be23a8411f15d1"]}, - "oban": {:hex, :oban, "0.12.1", "695e9490c6e0edfca616d80639528e448bd29b3bff7b7dd10a56c79b00a5d7fb", [: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", "c1d58d69b8b5a86e7167abbb8cc92764a66f25f12f6172052595067fc6a30a17"}, + "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", "f296ac0924ba3cf79c7a588c4c252889df4c2edd", [ref: "f296ac0924ba3cf79c7a588c4c252889df4c2edd"]}, "parse_trans": {:hex, :parse_trans, "3.3.0", "09765507a3c7590a784615cfd421d101aec25098d50b89d7aa1d66646bc571c1", [:rebar3], [], "hexpm", "17ef63abde837ad30680ea7f857dd9e7ced9476cdd7b0394432af4bfc241b960"}, - "pbkdf2_elixir": {:hex, :pbkdf2_elixir, "0.12.4", "8dd29ed783f2e12195d7e0a4640effc0a7c37e6537da491f1db01839eee6d053", [:mix], [], "hexpm", "595d09db74cb093b1903381c9de423276a931a2480a46a1a5dc7f932a2a6375b"}, + "pbkdf2_elixir": {:hex, :pbkdf2_elixir, "1.2.1", "9cbe354b58121075bd20eb83076900a3832324b7dd171a6895fab57b6bb2752c", [:mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}], "hexpm", "d3b40a4a4630f0b442f19eca891fcfeeee4c40871936fed2f68e1c4faa30481f"}, "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"}, "phoenix_ecto": {:hex, :phoenix_ecto, "4.1.0", "a044d0756d0464c5a541b4a0bf4bcaf89bffcaf92468862408290682c73ae50d", [:mix], [{:ecto, "~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.9", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "c5e666a341ff104d0399d8f0e4ff094559b2fde13a5985d4cb5023b2c2ac558b"}, "phoenix_html": {:hex, :phoenix_html, "2.14.0", "d8c6bc28acc8e65f8ea0080ee05aa13d912c8758699283b8d3427b655aabe284", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "b0bb30eda478a06dbfbe96728061a93833db3861a49ccb516f839ecb08493fbb"}, @@ -86,6 +91,7 @@ "poison": {:hex, :poison, "3.1.0", "d9eb636610e096f86f25d9a46f35a9facac35609a7591b3be3326e99a0484665", [:mix], [], "hexpm", "fec8660eb7733ee4117b85f55799fd3833eb769a6df71ccf8903e8dc5447cfce"}, "poolboy": {:hex, :poolboy, "1.5.2", "392b007a1693a64540cead79830443abf5762f5d30cf50bc95cb2c1aaafa006b", [:rebar3], [], "hexpm", "dad79704ce5440f3d5a3681c8590b9dc25d1a561e8f5a9c995281012860901e3"}, "postgrex": {:hex, :postgrex, "0.15.3", "5806baa8a19a68c4d07c7a624ccdb9b57e89cbc573f1b98099e3741214746ae4", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "4737ce62a31747b4c63c12b20c62307e51bb4fcd730ca0c32c280991e0606c90"}, + "pot": {:hex, :pot, "0.10.2", "9895c83bcff8cd22d9f5bc79dfc88a188176b261b618ad70d93faf5c5ca36e67", [:rebar3], [], "hexpm", "ac589a8e296b7802681e93cd0a436faec117ea63e9916709c628df31e17e91e2"}, "prometheus": {:hex, :prometheus, "4.5.0", "8f4a2246fe0beb50af0f77c5e0a5bb78fe575c34a9655d7f8bc743aad1c6bf76", [:mix, :rebar3], [], "hexpm", "679b5215480fff612b8351f45c839d995a07ce403e42ff02f1c6b20960d41a4e"}, "prometheus_ecto": {:hex, :prometheus_ecto, "1.4.3", "3dd4da1812b8e0dbee81ea58bb3b62ed7588f2eae0c9e97e434c46807ff82311", [:mix], [{:ecto, "~> 2.0 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:prometheus_ex, "~> 1.1 or ~> 2.0 or ~> 3.0", [hex: :prometheus_ex, repo: "hexpm", optional: false]}], "hexpm", "8d66289f77f913b37eda81fd287340c17e61a447549deb28efc254532b2bed82"}, "prometheus_ex": {:hex, :prometheus_ex, "3.0.5", "fa58cfd983487fc5ead331e9a3e0aa622c67232b3ec71710ced122c4c453a02f", [:mix], [{:prometheus, "~> 4.0", [hex: :prometheus, repo: "hexpm", optional: false]}], "hexpm", "9fd13404a48437e044b288b41f76e64acd9735fb8b0e3809f494811dfa66d0fb"}, @@ -94,19 +100,19 @@ "quack": {:hex, :quack, "0.1.1", "cca7b4da1a233757fdb44b3334fce80c94785b3ad5a602053b7a002b5a8967bf", [:mix], [{:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: false]}, {:tesla, "~> 1.2.0", [hex: :tesla, repo: "hexpm", optional: false]}], "hexpm", "d736bfa7444112eb840027bb887832a0e403a4a3437f48028c3b29a2dbbd2543"}, "ranch": {:hex, :ranch, "1.7.1", "6b1fab51b49196860b733a49c07604465a47bdb78aa10c1c16a3d199f7f8c881", [:rebar3], [], "hexpm", "451d8527787df716d99dc36162fca05934915db0b6141bbdac2ea8d3c7afc7d7"}, "recon": {:hex, :recon, "2.5.0", "2f7fcbec2c35034bade2f9717f77059dc54eb4e929a3049ca7ba6775c0bd66cd", [:mix, :rebar3], [], "hexpm", "72f3840fedd94f06315c523f6cecf5b4827233bed7ae3fe135b2a0ebeab5e196"}, - "remote_ip": {:git, "https://git.pleroma.social/pleroma/remote_ip.git", "825dc00aaba5a1b7c4202a532b696b595dd3bcb3", [ref: "825dc00aaba5a1b7c4202a532b696b595dd3bcb3"]}, + "remote_ip": {:git, "https://git.pleroma.social/pleroma/remote_ip.git", "b647d0deecaa3acb140854fe4bda5b7e1dc6d1c8", [ref: "b647d0deecaa3acb140854fe4bda5b7e1dc6d1c8"]}, "sleeplocks": {:hex, :sleeplocks, "1.1.1", "3d462a0639a6ef36cc75d6038b7393ae537ab394641beb59830a1b8271faeed3", [:rebar3], [], "hexpm", "84ee37aeff4d0d92b290fff986d6a95ac5eedf9b383fadfd1d88e9b84a1c02e1"}, - "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.5", "6eaf7ad16cb568bb01753dbbd7a95ff8b91c7979482b95f38443fe2c8852a79b", [:make, :mix, :rebar3], [], "hexpm", "13104d7897e38ed7f044c4de953a6c28597d1c952075eb2e328bc6d6f2bfc496"}, + "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.6", "cf344f5692c82d2cd7554f5ec8fd961548d4fd09e7d22f5b62482e5aeaebd4b0", [:make, :mix, :rebar3], [], "hexpm", "bdb0d2471f453c88ff3908e7686f86f9be327d065cc1ec16fa4540197ea04680"}, "sweet_xml": {:hex, :sweet_xml, "0.6.6", "fc3e91ec5dd7c787b6195757fbcf0abc670cee1e4172687b45183032221b66b8", [:mix], [], "hexpm", "2e1ec458f892ffa81f9f8386e3f35a1af6db7a7a37748a64478f13163a1f3573"}, "swoosh": {:hex, :swoosh, "0.23.5", "bfd9404bbf5069b1be2ffd317923ce57e58b332e25dbca2a35dedd7820dfee5a", [:mix], [{:cowboy, "~> 1.0.1 or ~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}], "hexpm", "e3928e1d2889a308aaf3e42755809ac21cffd77cb58eef01cbfdab4ce2fd1e21"}, - "syslog": {:hex, :syslog, "1.0.6", "995970c9aa7feb380ac493302138e308d6e04fd57da95b439a6df5bb3bf75076", [:rebar3], [], "hexpm", "769ddfabd0d2a16f3f9c17eb7509951e0ca4f68363fb26f2ee51a8ec4a49881a"}, + "syslog": {:hex, :syslog, "1.1.0", "6419a232bea84f07b56dc575225007ffe34d9fdc91abe6f1b2f254fd71d8efc2", [:rebar3], [], "hexpm", "4c6a41373c7e20587be33ef841d3de6f3beba08519809329ecc4d27b15b659e1"}, "telemetry": {:hex, :telemetry, "0.4.1", "ae2718484892448a24470e6aa341bc847c3277bfb8d4e9289f7474d752c09c7f", [:rebar3], [], "hexpm", "4738382e36a0a9a2b6e25d67c960e40e1a2c95560b9f936d8e29de8cd858480f"}, - "tesla": {:hex, :tesla, "1.3.2", "deb92c5c9ce35e747a395ba413ca78593a4f75bf0e1545630ee2e3d34264021e", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: true]}, {:fuse, "~> 2.4", [hex: :fuse, repo: "hexpm", optional: true]}, {:gun, "~> 1.3", [hex: :gun, repo: "hexpm", optional: true]}, {:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: true]}, {:ibrowse, "~> 4.4.0", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: true]}, {:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.3", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "7567704c4790e21bd9a961b56d0b6a988ff68cc4dacfe6b2106e258da1d5cdda"}, + "tesla": {:git, "https://git.pleroma.social/pleroma/elixir-libraries/tesla.git", "61b7503cef33f00834f78ddfafe0d5d9dec2270b", [ref: "61b7503cef33f00834f78ddfafe0d5d9dec2270b"]}, "timex": {:hex, :timex, "3.6.1", "efdf56d0e67a6b956cc57774353b0329c8ab7726766a11547e529357ffdc1d56", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 0.1.8 or ~> 0.5 or ~> 1.0.0", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "f354efb2400dd7a80fd9eb6c8419068c4f632da4ac47f3d8822d6e33f08bc852"}, "trailing_format_plug": {:hex, :trailing_format_plug, "0.0.7", "64b877f912cf7273bed03379936df39894149e35137ac9509117e59866e10e45", [:mix], [{:plug, "> 0.12.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "bd4fde4c15f3e993a999e019d64347489b91b7a9096af68b2bdadd192afa693f"}, "tzdata": {:hex, :tzdata, "0.5.22", "f2ba9105117ee0360eae2eca389783ef7db36d533899b2e84559404dbc77ebb8", [:mix], [{:hackney, "~> 1.0", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "cd66c8a1e6a9e121d1f538b01bef459334bb4029a1ffb4eeeb5e4eae0337e7b6"}, "ueberauth": {:hex, :ueberauth, "0.6.2", "25a31111249d60bad8b65438b2306a4dc91f3208faa62f5a8c33e8713989b2e8", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "db9fbfb5ac707bc4f85a297758406340bf0358b4af737a88113c1a9eee120ac7"}, - "unicode_util_compat": {:hex, :unicode_util_compat, "0.4.1", "d869e4c68901dd9531385bb0c8c40444ebf624e60b6962d95952775cac5e90cd", [:rebar3], [], "hexpm", "1d1848c40487cdb0b30e8ed975e34e025860c02e419cb615d255849f3427439d"}, + "unicode_util_compat": {:hex, :unicode_util_compat, "0.5.0", "8516502659002cec19e244ebd90d312183064be95025a319a6c7e89f4bccd65b", [:rebar3], [], "hexpm", "d48d002e15f5cc105a696cf2f1bbb3fc72b4b770a184d8420c8db20da2674b38"}, "unsafe": {:hex, :unsafe, "1.0.1", "a27e1874f72ee49312e0a9ec2e0b27924214a05e3ddac90e91727bc76f8613d8", [:mix], [], "hexpm", "6c7729a2d214806450d29766abc2afaa7a2cbecf415be64f36a6691afebb50e5"}, "web_push_encryption": {:hex, :web_push_encryption, "0.2.3", "a0ceab85a805a30852f143d22d71c434046fbdbafbc7292e7887cec500826a80", [:mix], [{:httpoison, "~> 1.0", [hex: :httpoison, repo: "hexpm", optional: false]}, {:jose, "~> 1.8", [hex: :jose, repo: "hexpm", optional: false]}, {:poison, "~> 3.0", [hex: :poison, repo: "hexpm", optional: false]}], "hexpm", "9315c8f37c108835cf3f8e9157d7a9b8f420a34f402d1b1620a31aed5b93ecdf"}, "websocket_client": {:git, "https://github.com/jeremyong/websocket_client.git", "9a6f65d05ebf2725d62fb19262b21f1805a59fbf", []}, diff --git a/priv/gettext/en/LC_MESSAGES/errors.po b/priv/gettext/en/LC_MESSAGES/errors.po deleted file mode 100644 index 25a2f73e4..000000000 --- a/priv/gettext/en/LC_MESSAGES/errors.po +++ /dev/null @@ -1,465 +0,0 @@ -## `msgid`s in this file come from POT (.pot) files. -## -## Do not add, change, or remove `msgid`s manually here as -## they're tied to the ones in the corresponding POT file -## (with the same domain). -## -## Use `mix gettext.extract --merge` or `mix gettext.merge` -## to merge POT files into PO files. -msgid "" -msgstr "" -"Language: en\n" - -## From Ecto.Changeset.cast/4 -msgid "can't be blank" -msgstr "" - -## From Ecto.Changeset.unique_constraint/3 -msgid "has already been taken" -msgstr "" - -## From Ecto.Changeset.put_change/3 -msgid "is invalid" -msgstr "" - -## From Ecto.Changeset.validate_format/3 -msgid "has invalid format" -msgstr "" - -## From Ecto.Changeset.validate_subset/3 -msgid "has an invalid entry" -msgstr "" - -## From Ecto.Changeset.validate_exclusion/3 -msgid "is reserved" -msgstr "" - -## From Ecto.Changeset.validate_confirmation/3 -msgid "does not match confirmation" -msgstr "" - -## From Ecto.Changeset.no_assoc_constraint/3 -msgid "is still associated with this entry" -msgstr "" - -msgid "are still associated with this entry" -msgstr "" - -## From Ecto.Changeset.validate_length/3 -msgid "should be %{count} character(s)" -msgid_plural "should be %{count} character(s)" -msgstr[0] "" -msgstr[1] "" - -msgid "should have %{count} item(s)" -msgid_plural "should have %{count} item(s)" -msgstr[0] "" -msgstr[1] "" - -msgid "should be at least %{count} character(s)" -msgid_plural "should be at least %{count} character(s)" -msgstr[0] "" -msgstr[1] "" - -msgid "should have at least %{count} item(s)" -msgid_plural "should have at least %{count} item(s)" -msgstr[0] "" -msgstr[1] "" - -msgid "should be at most %{count} character(s)" -msgid_plural "should be at most %{count} character(s)" -msgstr[0] "" -msgstr[1] "" - -msgid "should have at most %{count} item(s)" -msgid_plural "should have at most %{count} item(s)" -msgstr[0] "" -msgstr[1] "" - -## From Ecto.Changeset.validate_number/3 -msgid "must be less than %{number}" -msgstr "" - -msgid "must be greater than %{number}" -msgstr "" - -msgid "must be less than or equal to %{number}" -msgstr "" - -msgid "must be greater than or equal to %{number}" -msgstr "" - -msgid "must be equal to %{number}" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/common_api/common_api.ex:381 -msgid "Account not found" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/common_api/common_api.ex:153 -msgid "Already voted" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/oauth/oauth_controller.ex:263 -msgid "Bad request" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:254 -msgid "Can't delete object" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:569 -msgid "Can't delete this post" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1731 -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1737 -msgid "Can't display this activity" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:195 -msgid "Can't find user" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1148 -msgid "Can't get favorites" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:263 -msgid "Can't like object" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/common_api/utils.ex:518 -msgid "Cannot post an empty status without attachments" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/common_api/utils.ex:461 -msgid "Comment must be up to %{max_size} characters" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/admin_api/config.ex:63 -msgid "Config with params %{params} not found" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/common_api/common_api.ex:78 -msgid "Could not delete" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/common_api/common_api.ex:110 -msgid "Could not favorite" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/common_api/common_api.ex:310 -msgid "Could not pin" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/common_api/common_api.ex:89 -msgid "Could not repeat" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/common_api/common_api.ex:120 -msgid "Could not unfavorite" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/common_api/common_api.ex:327 -msgid "Could not unpin" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/common_api/common_api.ex:99 -msgid "Could not unrepeat" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/common_api/common_api.ex:392 -msgid "Could not update state" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1271 -msgid "Error." -msgstr "" - -#, elixir-format -#: lib/pleroma/captcha/kocaptcha.ex:36 -msgid "Invalid CAPTCHA" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1700 -#: lib/pleroma/web/oauth/oauth_controller.ex:465 -msgid "Invalid credentials" -msgstr "" - -#, elixir-format -#: lib/pleroma/plugs/ensure_authenticated_plug.ex:20 -msgid "Invalid credentials." -msgstr "" - -#, elixir-format -#: lib/pleroma/web/common_api/common_api.ex:154 -msgid "Invalid indices" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/admin_api/admin_api_controller.ex:411 -msgid "Invalid parameters" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/common_api/utils.ex:377 -msgid "Invalid password." -msgstr "" - -#, elixir-format -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:163 -msgid "Invalid request" -msgstr "" - -#, elixir-format -#: lib/pleroma/captcha/kocaptcha.ex:16 -msgid "Kocaptcha service unavailable" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1696 -msgid "Missing parameters" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/common_api/utils.ex:496 -msgid "No such conversation" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/admin_api/admin_api_controller.ex:163 -#: lib/pleroma/web/admin_api/admin_api_controller.ex:206 -msgid "No such permission_group" -msgstr "" - -#, elixir-format -#: lib/pleroma/plugs/uploaded_media.ex:69 -#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:311 -#: lib/pleroma/web/admin_api/admin_api_controller.ex:399 -#: lib/pleroma/web/mastodon_api/subscription_controller.ex:63 -#: lib/pleroma/web/ostatus/ostatus_controller.ex:248 -msgid "Not found" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/common_api/common_api.ex:152 -msgid "Poll's author can't vote" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:443 -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:444 -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:473 -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:476 -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1180 -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1564 -msgid "Record not found" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/admin_api/admin_api_controller.ex:417 -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1570 -#: lib/pleroma/web/mastodon_api/subscription_controller.ex:69 -#: lib/pleroma/web/ostatus/ostatus_controller.ex:252 -msgid "Something went wrong" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/common_api/common_api.ex:253 -msgid "The message visibility must be direct" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/common_api/utils.ex:521 -msgid "The status is over the character limit" -msgstr "" - -#, elixir-format -#: lib/pleroma/plugs/ensure_public_or_authenticated_plug.ex:27 -msgid "This resource requires authentication." -msgstr "" - -#, elixir-format -#: lib/pleroma/plugs/rate_limiter.ex:89 -msgid "Throttled" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/common_api/common_api.ex:155 -msgid "Too many choices" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:268 -msgid "Unhandled activity type" -msgstr "" - -#, elixir-format -#: lib/pleroma/plugs/user_is_admin_plug.ex:20 -msgid "User is not admin." -msgstr "" - -#, elixir-format -#: lib/pleroma/web/common_api/common_api.ex:380 -msgid "Valid `account_id` required" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/admin_api/admin_api_controller.ex:185 -msgid "You can't revoke your own admin status." -msgstr "" - -#, elixir-format -#: lib/pleroma/web/oauth/oauth_controller.ex:216 -msgid "Your account is currently disabled" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/oauth/oauth_controller.ex:158 -#: lib/pleroma/web/oauth/oauth_controller.ex:213 -msgid "Your login is missing a confirmed e-mail address" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:221 -msgid "can't read inbox of %{nickname} as %{as_nickname}" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:297 -msgid "can't update outbox of %{nickname} as %{as_nickname}" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/common_api/common_api.ex:335 -msgid "conversation is already muted" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:192 -#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:317 -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1196 -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1247 -msgid "error" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:789 -msgid "mascots can only be images" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:34 -msgid "not found" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/oauth/oauth_controller.ex:298 -msgid "Bad OAuth request." -msgstr "" - -#, elixir-format -#: lib/pleroma/captcha/captcha.ex:92 -msgid "CAPTCHA already used" -msgstr "" - -#, elixir-format -#: lib/pleroma/captcha/captcha.ex:89 -msgid "CAPTCHA expired" -msgstr "" - -#, elixir-format -#: lib/pleroma/plugs/uploaded_media.ex:50 -msgid "Failed" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/oauth/oauth_controller.ex:314 -msgid "Failed to authenticate: %{message}." -msgstr "" - -#, elixir-format -#: lib/pleroma/web/oauth/oauth_controller.ex:345 -msgid "Failed to set up user account." -msgstr "" - -#, elixir-format -#: lib/pleroma/plugs/oauth_scopes_plug.ex:37 -msgid "Insufficient permissions: %{permissions}." -msgstr "" - -#, elixir-format -#: lib/pleroma/plugs/uploaded_media.ex:89 -msgid "Internal Error" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/oauth/fallback_controller.ex:22 -#: lib/pleroma/web/oauth/fallback_controller.ex:29 -msgid "Invalid Username/Password" -msgstr "" - -#, elixir-format -#: lib/pleroma/captcha/captcha.ex:107 -msgid "Invalid answer data" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/nodeinfo/nodeinfo_controller.ex:204 -msgid "Nodeinfo schema version not handled" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/oauth/oauth_controller.ex:145 -msgid "This action is outside the authorized scopes" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/oauth/fallback_controller.ex:14 -msgid "Unknown error, please check the details and try again." -msgstr "" - -#, elixir-format -#: lib/pleroma/web/oauth/oauth_controller.ex:93 -#: lib/pleroma/web/oauth/oauth_controller.ex:131 -msgid "Unlisted redirect_uri." -msgstr "" - -#, elixir-format -#: lib/pleroma/web/oauth/oauth_controller.ex:294 -msgid "Unsupported OAuth provider: %{provider}." -msgstr "" - -#, elixir-format -#: lib/pleroma/uploaders/uploader.ex:71 -msgid "Uploader callback timeout" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/uploader_controller.ex:11 -#: lib/pleroma/web/uploader_controller.ex:23 -msgid "bad request" -msgstr "" diff --git a/priv/gettext/errors.pot b/priv/gettext/errors.pot index 2fd9c42e3..0e1cf37eb 100644 --- a/priv/gettext/errors.pot +++ b/priv/gettext/errors.pot @@ -90,326 +90,312 @@ msgid "must be equal to %{number}" msgstr "" #, elixir-format -#: lib/pleroma/web/common_api/common_api.ex:381 +#: lib/pleroma/web/common_api/common_api.ex:421 msgid "Account not found" msgstr "" #, elixir-format -#: lib/pleroma/web/common_api/common_api.ex:153 +#: lib/pleroma/web/common_api/common_api.ex:249 msgid "Already voted" msgstr "" #, elixir-format -#: lib/pleroma/web/oauth/oauth_controller.ex:263 +#: lib/pleroma/web/oauth/oauth_controller.ex:360 msgid "Bad request" msgstr "" #, elixir-format -#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:254 +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:425 msgid "Can't delete object" msgstr "" #, elixir-format -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:569 +#: lib/pleroma/web/mastodon_api/controllers/status_controller.ex:196 msgid "Can't delete this post" msgstr "" #, elixir-format -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1731 -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1737 +#: lib/pleroma/web/controller_helper.ex:95 +#: lib/pleroma/web/controller_helper.ex:101 msgid "Can't display this activity" msgstr "" #, elixir-format -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:195 +#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:227 +#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:254 msgid "Can't find user" msgstr "" #, elixir-format -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1148 +#: lib/pleroma/web/pleroma_api/controllers/account_controller.ex:114 msgid "Can't get favorites" msgstr "" #, elixir-format -#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:263 +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:437 msgid "Can't like object" msgstr "" #, elixir-format -#: lib/pleroma/web/common_api/utils.ex:518 +#: lib/pleroma/web/common_api/utils.ex:556 msgid "Cannot post an empty status without attachments" msgstr "" #, elixir-format -#: lib/pleroma/web/common_api/utils.ex:461 +#: lib/pleroma/web/common_api/utils.ex:504 msgid "Comment must be up to %{max_size} characters" msgstr "" #, elixir-format -#: lib/pleroma/web/admin_api/config.ex:63 +#: lib/pleroma/config/config_db.ex:222 msgid "Config with params %{params} not found" msgstr "" #, elixir-format -#: lib/pleroma/web/common_api/common_api.ex:78 +#: lib/pleroma/web/common_api/common_api.ex:95 msgid "Could not delete" msgstr "" #, elixir-format -#: lib/pleroma/web/common_api/common_api.ex:110 +#: lib/pleroma/web/common_api/common_api.ex:141 msgid "Could not favorite" msgstr "" #, elixir-format -#: lib/pleroma/web/common_api/common_api.ex:310 +#: lib/pleroma/web/common_api/common_api.ex:370 msgid "Could not pin" msgstr "" #, elixir-format -#: lib/pleroma/web/common_api/common_api.ex:89 +#: lib/pleroma/web/common_api/common_api.ex:112 msgid "Could not repeat" msgstr "" #, elixir-format -#: lib/pleroma/web/common_api/common_api.ex:120 +#: lib/pleroma/web/common_api/common_api.ex:188 msgid "Could not unfavorite" msgstr "" #, elixir-format -#: lib/pleroma/web/common_api/common_api.ex:327 +#: lib/pleroma/web/common_api/common_api.ex:380 msgid "Could not unpin" msgstr "" #, elixir-format -#: lib/pleroma/web/common_api/common_api.ex:99 +#: lib/pleroma/web/common_api/common_api.ex:126 msgid "Could not unrepeat" msgstr "" #, elixir-format -#: lib/pleroma/web/common_api/common_api.ex:392 +#: lib/pleroma/web/common_api/common_api.ex:428 +#: lib/pleroma/web/common_api/common_api.ex:437 msgid "Could not update state" msgstr "" #, elixir-format -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1271 +#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:202 msgid "Error." msgstr "" #, elixir-format -#: lib/pleroma/captcha/kocaptcha.ex:36 +#: lib/pleroma/web/twitter_api/twitter_api.ex:106 msgid "Invalid CAPTCHA" msgstr "" #, elixir-format -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1700 -#: lib/pleroma/web/oauth/oauth_controller.ex:465 +#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:117 +#: lib/pleroma/web/oauth/oauth_controller.ex:569 msgid "Invalid credentials" msgstr "" #, elixir-format -#: lib/pleroma/plugs/ensure_authenticated_plug.ex:20 +#: lib/pleroma/plugs/ensure_authenticated_plug.ex:38 msgid "Invalid credentials." msgstr "" #, elixir-format -#: lib/pleroma/web/common_api/common_api.ex:154 +#: lib/pleroma/web/common_api/common_api.ex:265 msgid "Invalid indices" msgstr "" #, elixir-format -#: lib/pleroma/web/admin_api/admin_api_controller.ex:411 +#: lib/pleroma/web/admin_api/admin_api_controller.ex:1147 msgid "Invalid parameters" msgstr "" #, elixir-format -#: lib/pleroma/web/common_api/utils.ex:377 +#: lib/pleroma/web/common_api/utils.ex:411 msgid "Invalid password." msgstr "" #, elixir-format -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:163 +#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:187 msgid "Invalid request" msgstr "" #, elixir-format -#: lib/pleroma/captcha/kocaptcha.ex:16 +#: lib/pleroma/web/twitter_api/twitter_api.ex:109 msgid "Kocaptcha service unavailable" msgstr "" #, elixir-format -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1696 +#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:113 msgid "Missing parameters" msgstr "" #, elixir-format -#: lib/pleroma/web/common_api/utils.ex:496 +#: lib/pleroma/web/common_api/utils.ex:540 msgid "No such conversation" msgstr "" #, elixir-format -#: lib/pleroma/web/admin_api/admin_api_controller.ex:163 -#: lib/pleroma/web/admin_api/admin_api_controller.ex:206 +#: lib/pleroma/web/admin_api/admin_api_controller.ex:439 +#: lib/pleroma/web/admin_api/admin_api_controller.ex:465 lib/pleroma/web/admin_api/admin_api_controller.ex:507 msgid "No such permission_group" msgstr "" #, elixir-format -#: lib/pleroma/plugs/uploaded_media.ex:69 -#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:311 -#: lib/pleroma/web/admin_api/admin_api_controller.ex:399 -#: lib/pleroma/web/mastodon_api/subscription_controller.ex:63 -#: lib/pleroma/web/ostatus/ostatus_controller.ex:248 +#: lib/pleroma/plugs/uploaded_media.ex:74 +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:485 lib/pleroma/web/admin_api/admin_api_controller.ex:1135 +#: lib/pleroma/web/feed/user_controller.ex:73 lib/pleroma/web/ostatus/ostatus_controller.ex:143 msgid "Not found" msgstr "" #, elixir-format -#: lib/pleroma/web/common_api/common_api.ex:152 +#: lib/pleroma/web/common_api/common_api.ex:241 msgid "Poll's author can't vote" msgstr "" #, elixir-format -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:443 -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:444 -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:473 -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:476 -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1180 -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1564 +#: lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:20 +#: lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:37 lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:49 +#: lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:50 lib/pleroma/web/mastodon_api/controllers/status_controller.ex:290 +#: lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:71 msgid "Record not found" msgstr "" #, elixir-format -#: lib/pleroma/web/admin_api/admin_api_controller.ex:417 -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1570 -#: lib/pleroma/web/mastodon_api/subscription_controller.ex:69 -#: lib/pleroma/web/ostatus/ostatus_controller.ex:252 +#: lib/pleroma/web/admin_api/admin_api_controller.ex:1153 +#: lib/pleroma/web/feed/user_controller.ex:79 lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:32 +#: lib/pleroma/web/ostatus/ostatus_controller.ex:149 msgid "Something went wrong" msgstr "" #, elixir-format -#: lib/pleroma/web/common_api/common_api.ex:253 +#: lib/pleroma/web/common_api/activity_draft.ex:107 msgid "The message visibility must be direct" msgstr "" #, elixir-format -#: lib/pleroma/web/common_api/utils.ex:521 +#: lib/pleroma/web/common_api/utils.ex:566 msgid "The status is over the character limit" msgstr "" #, elixir-format -#: lib/pleroma/plugs/ensure_public_or_authenticated_plug.ex:27 +#: lib/pleroma/plugs/ensure_public_or_authenticated_plug.ex:31 msgid "This resource requires authentication." msgstr "" #, elixir-format -#: lib/pleroma/plugs/rate_limiter.ex:89 +#: lib/pleroma/plugs/rate_limiter/rate_limiter.ex:206 msgid "Throttled" msgstr "" #, elixir-format -#: lib/pleroma/web/common_api/common_api.ex:155 +#: lib/pleroma/web/common_api/common_api.ex:266 msgid "Too many choices" msgstr "" #, elixir-format -#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:268 +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:442 msgid "Unhandled activity type" msgstr "" #, elixir-format -#: lib/pleroma/plugs/user_is_admin_plug.ex:20 -msgid "User is not admin." -msgstr "" - -#, elixir-format -#: lib/pleroma/web/common_api/common_api.ex:380 -msgid "Valid `account_id` required" -msgstr "" - -#, elixir-format -#: lib/pleroma/web/admin_api/admin_api_controller.ex:185 +#: lib/pleroma/web/admin_api/admin_api_controller.ex:536 msgid "You can't revoke your own admin status." msgstr "" #, elixir-format -#: lib/pleroma/web/oauth/oauth_controller.ex:216 +#: lib/pleroma/web/oauth/oauth_controller.ex:218 +#: lib/pleroma/web/oauth/oauth_controller.ex:309 msgid "Your account is currently disabled" msgstr "" #, elixir-format -#: lib/pleroma/web/oauth/oauth_controller.ex:158 -#: lib/pleroma/web/oauth/oauth_controller.ex:213 +#: lib/pleroma/web/oauth/oauth_controller.ex:180 +#: lib/pleroma/web/oauth/oauth_controller.ex:332 msgid "Your login is missing a confirmed e-mail address" msgstr "" #, elixir-format -#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:221 +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:389 msgid "can't read inbox of %{nickname} as %{as_nickname}" msgstr "" #, elixir-format -#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:297 +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:472 msgid "can't update outbox of %{nickname} as %{as_nickname}" msgstr "" #, elixir-format -#: lib/pleroma/web/common_api/common_api.ex:335 +#: lib/pleroma/web/common_api/common_api.ex:388 msgid "conversation is already muted" msgstr "" #, elixir-format -#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:192 -#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:317 -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1196 -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1247 +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:316 +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:491 msgid "error" msgstr "" #, elixir-format -#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:789 +#: lib/pleroma/web/pleroma_api/controllers/mascot_controller.ex:29 msgid "mascots can only be images" msgstr "" #, elixir-format -#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:34 +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:60 msgid "not found" msgstr "" #, elixir-format -#: lib/pleroma/web/oauth/oauth_controller.ex:298 +#: lib/pleroma/web/oauth/oauth_controller.ex:395 msgid "Bad OAuth request." msgstr "" #, elixir-format -#: lib/pleroma/captcha/captcha.ex:92 +#: lib/pleroma/web/twitter_api/twitter_api.ex:115 msgid "CAPTCHA already used" msgstr "" #, elixir-format -#: lib/pleroma/captcha/captcha.ex:89 +#: lib/pleroma/web/twitter_api/twitter_api.ex:112 msgid "CAPTCHA expired" msgstr "" #, elixir-format -#: lib/pleroma/plugs/uploaded_media.ex:50 +#: lib/pleroma/plugs/uploaded_media.ex:55 msgid "Failed" msgstr "" #, elixir-format -#: lib/pleroma/web/oauth/oauth_controller.ex:314 +#: lib/pleroma/web/oauth/oauth_controller.ex:411 msgid "Failed to authenticate: %{message}." msgstr "" #, elixir-format -#: lib/pleroma/web/oauth/oauth_controller.ex:345 +#: lib/pleroma/web/oauth/oauth_controller.ex:442 msgid "Failed to set up user account." msgstr "" #, elixir-format -#: lib/pleroma/plugs/oauth_scopes_plug.ex:37 +#: lib/pleroma/plugs/oauth_scopes_plug.ex:38 msgid "Insufficient permissions: %{permissions}." msgstr "" #, elixir-format -#: lib/pleroma/plugs/uploaded_media.ex:89 +#: lib/pleroma/plugs/uploaded_media.ex:94 msgid "Internal Error" msgstr "" @@ -420,17 +406,17 @@ msgid "Invalid Username/Password" msgstr "" #, elixir-format -#: lib/pleroma/captcha/captcha.ex:107 +#: lib/pleroma/web/twitter_api/twitter_api.ex:118 msgid "Invalid answer data" msgstr "" #, elixir-format -#: lib/pleroma/web/nodeinfo/nodeinfo_controller.ex:204 +#: lib/pleroma/web/nodeinfo/nodeinfo_controller.ex:128 msgid "Nodeinfo schema version not handled" msgstr "" #, elixir-format -#: lib/pleroma/web/oauth/oauth_controller.ex:145 +#: lib/pleroma/web/oauth/oauth_controller.ex:169 msgid "This action is outside the authorized scopes" msgstr "" @@ -440,23 +426,139 @@ msgid "Unknown error, please check the details and try again." msgstr "" #, elixir-format -#: lib/pleroma/web/oauth/oauth_controller.ex:93 -#: lib/pleroma/web/oauth/oauth_controller.ex:131 +#: lib/pleroma/web/oauth/oauth_controller.ex:116 +#: lib/pleroma/web/oauth/oauth_controller.ex:155 msgid "Unlisted redirect_uri." msgstr "" #, elixir-format -#: lib/pleroma/web/oauth/oauth_controller.ex:294 +#: lib/pleroma/web/oauth/oauth_controller.ex:391 msgid "Unsupported OAuth provider: %{provider}." msgstr "" #, elixir-format -#: lib/pleroma/uploaders/uploader.ex:71 +#: lib/pleroma/uploaders/uploader.ex:72 msgid "Uploader callback timeout" msgstr "" #, elixir-format -#: lib/pleroma/web/uploader_controller.ex:11 #: lib/pleroma/web/uploader_controller.ex:23 msgid "bad request" msgstr "" + +#, elixir-format +#: lib/pleroma/web/twitter_api/twitter_api.ex:103 +msgid "CAPTCHA Error" +msgstr "" + +#, elixir-format +#: lib/pleroma/web/common_api/common_api.ex:200 +msgid "Could not add reaction emoji" +msgstr "" + +#, elixir-format +#: lib/pleroma/web/common_api/common_api.ex:211 +msgid "Could not remove reaction emoji" +msgstr "" + +#, elixir-format +#: lib/pleroma/web/twitter_api/twitter_api.ex:129 +msgid "Invalid CAPTCHA (Missing parameter: %{name})" +msgstr "" + +#, elixir-format +#: lib/pleroma/web/mastodon_api/controllers/list_controller.ex:92 +msgid "List not found" +msgstr "" + +#, elixir-format +#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:124 +msgid "Missing parameter: %{name}" +msgstr "" + +#, elixir-format +#: lib/pleroma/web/oauth/oauth_controller.ex:207 +#: lib/pleroma/web/oauth/oauth_controller.ex:322 +msgid "Password reset is required" +msgstr "" + +#, elixir-format +#: lib/pleroma/tests/auth_test_controller.ex:9 +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:6 lib/pleroma/web/admin_api/admin_api_controller.ex:6 +#: lib/pleroma/web/controller_helper.ex:6 lib/pleroma/web/fallback_redirect_controller.ex:6 +#: lib/pleroma/web/feed/tag_controller.ex:6 lib/pleroma/web/feed/user_controller.ex:6 +#: lib/pleroma/web/mailer/subscription_controller.ex:2 lib/pleroma/web/masto_fe_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/app_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/auth_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/conversation_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/custom_emoji_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/domain_block_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/filter_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/follow_request_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/instance_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/list_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/marker_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex:14 lib/pleroma/web/mastodon_api/controllers/media_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/notification_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/report_controller.ex:8 lib/pleroma/web/mastodon_api/controllers/scheduled_activity_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/search_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/status_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:7 lib/pleroma/web/mastodon_api/controllers/suggestion_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:6 lib/pleroma/web/media_proxy/media_proxy_controller.ex:6 +#: lib/pleroma/web/mongooseim/mongoose_im_controller.ex:6 lib/pleroma/web/nodeinfo/nodeinfo_controller.ex:6 +#: lib/pleroma/web/oauth/fallback_controller.ex:6 lib/pleroma/web/oauth/mfa_controller.ex:10 +#: lib/pleroma/web/oauth/oauth_controller.ex:6 lib/pleroma/web/ostatus/ostatus_controller.ex:6 +#: lib/pleroma/web/pleroma_api/controllers/account_controller.ex:6 lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex:2 +#: lib/pleroma/web/pleroma_api/controllers/mascot_controller.ex:6 lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex:6 +#: lib/pleroma/web/pleroma_api/controllers/scrobble_controller.ex:6 +#: lib/pleroma/web/pleroma_api/controllers/two_factor_authentication_controller.ex:7 lib/pleroma/web/static_fe/static_fe_controller.ex:6 +#: lib/pleroma/web/twitter_api/controllers/password_controller.ex:10 lib/pleroma/web/twitter_api/controllers/remote_follow_controller.ex:6 +#: lib/pleroma/web/twitter_api/controllers/util_controller.ex:6 lib/pleroma/web/twitter_api/twitter_api_controller.ex:6 +#: lib/pleroma/web/uploader_controller.ex:6 lib/pleroma/web/web_finger/web_finger_controller.ex:6 +msgid "Security violation: OAuth scopes check was neither handled nor explicitly skipped." +msgstr "" + +#, elixir-format +#: lib/pleroma/plugs/ensure_authenticated_plug.ex:28 +msgid "Two-factor authentication enabled, you must use a access token." +msgstr "" + +#, elixir-format +#: lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex:210 +msgid "Unexpected error occurred while adding file to pack." +msgstr "" + +#, elixir-format +#: lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex:138 +msgid "Unexpected error occurred while creating pack." +msgstr "" + +#, elixir-format +#: lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex:278 +msgid "Unexpected error occurred while removing file from pack." +msgstr "" + +#, elixir-format +#: lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex:250 +msgid "Unexpected error occurred while updating file in pack." +msgstr "" + +#, elixir-format +#: lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex:179 +msgid "Unexpected error occurred while updating pack metadata." +msgstr "" + +#, elixir-format +#: lib/pleroma/plugs/user_is_admin_plug.ex:40 +msgid "User is not an admin or OAuth admin scope is not granted." +msgstr "" + +#, elixir-format +#: lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:61 +msgid "Web push subscription is disabled on this Pleroma instance" +msgstr "" + +#, elixir-format +#: lib/pleroma/web/admin_api/admin_api_controller.ex:502 +msgid "You can't revoke your own admin/moderator status." +msgstr "" + +#, elixir-format +#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:105 +msgid "authorization required for timeline view" +msgstr "" diff --git a/priv/gettext/fr/LC_MESSAGES/errors.po b/priv/gettext/fr/LC_MESSAGES/errors.po index 678b32289..406f98de9 100644 --- a/priv/gettext/fr/LC_MESSAGES/errors.po +++ b/priv/gettext/fr/LC_MESSAGES/errors.po @@ -8,8 +8,16 @@ ## to merge POT files into PO files. msgid "" msgstr "" +"PO-Revision-Date: 2020-05-12 15:52+0000\n" +"Last-Translator: Haelwenn (lanodan) Monnier " +"\n" +"Language-Team: French \n" "Language: fr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.0.4\n" +"Content-Transfer-Encoding: 8bit\n" msgid "can't be blank" msgstr "ne peut être vide" @@ -35,10 +43,10 @@ msgid "does not match confirmation" msgstr "ne correspondent pas" msgid "is still associated with this entry" -msgstr "" +msgstr "est toujours associé à cette entrée" msgid "are still associated with this entry" -msgstr "" +msgstr "sont toujours associés à cette entrée" msgid "should be %{count} character(s)" msgid_plural "should be %{count} character(s)" @@ -85,375 +93,375 @@ msgstr "doit être supérieur ou égal à %{number}" msgid "must be equal to %{number}" msgstr "doit égal à %{number}" -#, elixir-format #: lib/pleroma/web/common_api/common_api.ex:381 +#, elixir-format msgid "Account not found" msgstr "Compte non trouvé" -#, elixir-format #: lib/pleroma/web/common_api/common_api.ex:153 +#, elixir-format msgid "Already voted" msgstr "A déjà voté" -#, elixir-format #: lib/pleroma/web/oauth/oauth_controller.ex:263 +#, elixir-format msgid "Bad request" msgstr "Requête Invalide" -#, elixir-format #: lib/pleroma/web/activity_pub/activity_pub_controller.ex:254 +#, elixir-format msgid "Can't delete object" msgstr "Ne peut supprimer cet objet" -#, elixir-format #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:569 +#, elixir-format msgid "Can't delete this post" msgstr "Ne peut supprimer ce message" -#, elixir-format #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1731 #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1737 +#, elixir-format msgid "Can't display this activity" msgstr "Ne peut afficher cette activitée" -#, elixir-format #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:195 +#, elixir-format msgid "Can't find user" msgstr "Compte non trouvé" -#, elixir-format #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1148 +#, elixir-format msgid "Can't get favorites" msgstr "Favoris non trouvables" -#, elixir-format #: lib/pleroma/web/activity_pub/activity_pub_controller.ex:263 +#, elixir-format msgid "Can't like object" msgstr "Ne peut aimer cet objet" -#, elixir-format #: lib/pleroma/web/common_api/utils.ex:518 +#, elixir-format msgid "Cannot post an empty status without attachments" msgstr "Ne peut envoyer un status vide sans attachements" -#, elixir-format #: lib/pleroma/web/common_api/utils.ex:461 +#, elixir-format msgid "Comment must be up to %{max_size} characters" msgstr "Le commentaire ne doit faire plus de %{max_size} charactères" -#, elixir-format #: lib/pleroma/web/admin_api/config.ex:63 +#, elixir-format msgid "Config with params %{params} not found" msgstr "Configuration avec les paramètres %{params} non trouvée" -#, elixir-format #: lib/pleroma/web/common_api/common_api.ex:78 +#, elixir-format msgid "Could not delete" msgstr "Échec de la suppression" -#, elixir-format #: lib/pleroma/web/common_api/common_api.ex:110 +#, elixir-format msgid "Could not favorite" msgstr "Échec de mise en favoris" -#, elixir-format #: lib/pleroma/web/common_api/common_api.ex:310 +#, elixir-format msgid "Could not pin" msgstr "Échec de l'épinglage" -#, elixir-format #: lib/pleroma/web/common_api/common_api.ex:89 +#, elixir-format msgid "Could not repeat" msgstr "Échec de création la répétition" -#, elixir-format #: lib/pleroma/web/common_api/common_api.ex:120 +#, elixir-format msgid "Could not unfavorite" msgstr "Échec de suppression des favoris" -#, elixir-format #: lib/pleroma/web/common_api/common_api.ex:327 +#, elixir-format msgid "Could not unpin" msgstr "Échec du dépinglage" -#, elixir-format #: lib/pleroma/web/common_api/common_api.ex:99 +#, elixir-format msgid "Could not unrepeat" msgstr "Échec de suppression de la répétition" -#, elixir-format #: lib/pleroma/web/common_api/common_api.ex:392 +#, elixir-format msgid "Could not update state" msgstr "Échec de la mise à jour du status" -#, elixir-format #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1271 +#, elixir-format msgid "Error." msgstr "Erreur." -#, elixir-format #: lib/pleroma/captcha/kocaptcha.ex:36 +#, elixir-format msgid "Invalid CAPTCHA" msgstr "CAPTCHA invalide" -#, elixir-format #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1700 #: lib/pleroma/web/oauth/oauth_controller.ex:465 +#, elixir-format msgid "Invalid credentials" msgstr "Paramètres d'authentification invalides" -#, elixir-format #: lib/pleroma/plugs/ensure_authenticated_plug.ex:20 +#, elixir-format msgid "Invalid credentials." msgstr "Paramètres d'authentification invalides." -#, elixir-format #: lib/pleroma/web/common_api/common_api.ex:154 +#, elixir-format msgid "Invalid indices" msgstr "Indices invalides" -#, elixir-format #: lib/pleroma/web/admin_api/admin_api_controller.ex:411 +#, elixir-format msgid "Invalid parameters" msgstr "Paramètres invalides" -#, elixir-format #: lib/pleroma/web/common_api/utils.ex:377 +#, elixir-format msgid "Invalid password." msgstr "Mot de passe invalide." -#, elixir-format #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:163 +#, elixir-format msgid "Invalid request" msgstr "Requête invalide" -#, elixir-format #: lib/pleroma/captcha/kocaptcha.ex:16 +#, elixir-format msgid "Kocaptcha service unavailable" msgstr "Service Kocaptcha non disponible" -#, elixir-format #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1696 +#, elixir-format msgid "Missing parameters" msgstr "Paramètres manquants" -#, elixir-format #: lib/pleroma/web/common_api/utils.ex:496 +#, elixir-format msgid "No such conversation" msgstr "Conversation inconnue" -#, elixir-format #: lib/pleroma/web/admin_api/admin_api_controller.ex:163 #: lib/pleroma/web/admin_api/admin_api_controller.ex:206 +#, elixir-format msgid "No such permission_group" msgstr "Groupe de permission inconnu" -#, elixir-format #: lib/pleroma/plugs/uploaded_media.ex:69 #: lib/pleroma/web/activity_pub/activity_pub_controller.ex:311 #: lib/pleroma/web/admin_api/admin_api_controller.ex:399 #: lib/pleroma/web/mastodon_api/subscription_controller.ex:63 #: lib/pleroma/web/ostatus/ostatus_controller.ex:248 +#, elixir-format msgid "Not found" msgstr "Non Trouvé" -#, elixir-format #: lib/pleroma/web/common_api/common_api.ex:152 +#, elixir-format msgid "Poll's author can't vote" msgstr "L'auteur·rice d'un sondage ne peut voter" -#, elixir-format #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:443 #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:444 #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:473 #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:476 #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1180 #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1564 +#, elixir-format msgid "Record not found" msgstr "Enregistrement non trouvé" -#, elixir-format #: lib/pleroma/web/admin_api/admin_api_controller.ex:417 #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1570 #: lib/pleroma/web/mastodon_api/subscription_controller.ex:69 #: lib/pleroma/web/ostatus/ostatus_controller.ex:252 +#, elixir-format msgid "Something went wrong" msgstr "Erreur inconnue" -#, elixir-format #: lib/pleroma/web/common_api/common_api.ex:253 +#, elixir-format msgid "The message visibility must be direct" msgstr "La visibilitée du message doit être « direct »" -#, elixir-format #: lib/pleroma/web/common_api/utils.ex:521 +#, elixir-format msgid "The status is over the character limit" msgstr "Le status est au-delà de la limite de charactères" -#, elixir-format #: lib/pleroma/plugs/ensure_public_or_authenticated_plug.ex:27 +#, elixir-format msgid "This resource requires authentication." msgstr "Cette resource nécessite une authentification." -#, elixir-format #: lib/pleroma/plugs/rate_limiter.ex:89 +#, elixir-format msgid "Throttled" msgstr "Limité" -#, elixir-format #: lib/pleroma/web/common_api/common_api.ex:155 +#, elixir-format msgid "Too many choices" msgstr "Trop de choix" -#, elixir-format #: lib/pleroma/web/activity_pub/activity_pub_controller.ex:268 +#, elixir-format msgid "Unhandled activity type" msgstr "Type d'activitée non-gérée" -#, elixir-format #: lib/pleroma/plugs/user_is_admin_plug.ex:20 +#, elixir-format msgid "User is not admin." msgstr "Le compte n'est pas admin." -#, elixir-format #: lib/pleroma/web/common_api/common_api.ex:380 +#, elixir-format msgid "Valid `account_id` required" msgstr "Un `account_id` valide est requis" -#, elixir-format #: lib/pleroma/web/admin_api/admin_api_controller.ex:185 +#, elixir-format msgid "You can't revoke your own admin status." msgstr "Vous ne pouvez révoquer votre propre status d'admin." -#, elixir-format #: lib/pleroma/web/oauth/oauth_controller.ex:216 +#, elixir-format msgid "Your account is currently disabled" msgstr "Votre compte est actuellement désactivé" -#, elixir-format #: lib/pleroma/web/oauth/oauth_controller.ex:158 #: lib/pleroma/web/oauth/oauth_controller.ex:213 +#, elixir-format msgid "Your login is missing a confirmed e-mail address" msgstr "Une confirmation de l'addresse de couriel est requise pour l'authentification" -#, elixir-format #: lib/pleroma/web/activity_pub/activity_pub_controller.ex:221 +#, elixir-format msgid "can't read inbox of %{nickname} as %{as_nickname}" msgstr "Ne peut lire la boite de réception de %{nickname} en tant que %{as_nickname}" -#, elixir-format #: lib/pleroma/web/activity_pub/activity_pub_controller.ex:297 +#, elixir-format msgid "can't update outbox of %{nickname} as %{as_nickname}" msgstr "Ne peut poster dans la boite d'émission de %{nickname} en tant que %{as_nickname}" -#, elixir-format #: lib/pleroma/web/common_api/common_api.ex:335 +#, elixir-format msgid "conversation is already muted" msgstr "la conversation est déjà baillonée" -#, elixir-format #: lib/pleroma/web/activity_pub/activity_pub_controller.ex:192 #: lib/pleroma/web/activity_pub/activity_pub_controller.ex:317 #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1196 #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1247 +#, elixir-format msgid "error" msgstr "erreur" -#, elixir-format #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:789 +#, elixir-format msgid "mascots can only be images" msgstr "les mascottes ne peuvent être que des images" -#, elixir-format #: lib/pleroma/web/activity_pub/activity_pub_controller.ex:34 +#, elixir-format msgid "not found" msgstr "non trouvé" -#, elixir-format #: lib/pleroma/web/oauth/oauth_controller.ex:298 +#, elixir-format msgid "Bad OAuth request." msgstr "Requête OAuth invalide." -#, elixir-format #: lib/pleroma/captcha/captcha.ex:92 +#, elixir-format msgid "CAPTCHA already used" msgstr "CAPTCHA déjà utilisé" -#, elixir-format #: lib/pleroma/captcha/captcha.ex:89 +#, elixir-format msgid "CAPTCHA expired" msgstr "CAPTCHA expiré" -#, elixir-format #: lib/pleroma/plugs/uploaded_media.ex:50 +#, elixir-format msgid "Failed" msgstr "Échec" -#, elixir-format #: lib/pleroma/web/oauth/oauth_controller.ex:314 -msgid "Failed to authenticate: %{message}." -msgstr "Échec de l'authentification: %{message}" - #, elixir-format +msgid "Failed to authenticate: %{message}." +msgstr "Échec de l'authentification : %{message}." + #: lib/pleroma/web/oauth/oauth_controller.ex:345 +#, elixir-format msgid "Failed to set up user account." msgstr "Échec de création de votre compte." -#, elixir-format #: lib/pleroma/plugs/oauth_scopes_plug.ex:37 -msgid "Insufficient permissions: %{permissions}." -msgstr "Permissions insuffisantes: %{permissions}." - #, elixir-format +msgid "Insufficient permissions: %{permissions}." +msgstr "Permissions insuffisantes : %{permissions}." + #: lib/pleroma/plugs/uploaded_media.ex:89 +#, elixir-format msgid "Internal Error" msgstr "Erreur interne" -#, elixir-format #: lib/pleroma/web/oauth/fallback_controller.ex:22 #: lib/pleroma/web/oauth/fallback_controller.ex:29 +#, elixir-format msgid "Invalid Username/Password" msgstr "Nom d'utilisateur/mot de passe invalide" -#, elixir-format #: lib/pleroma/captcha/captcha.ex:107 +#, elixir-format msgid "Invalid answer data" msgstr "Réponse invalide" -#, elixir-format #: lib/pleroma/web/nodeinfo/nodeinfo_controller.ex:204 +#, elixir-format msgid "Nodeinfo schema version not handled" msgstr "Version du schéma nodeinfo non géré" -#, elixir-format #: lib/pleroma/web/oauth/oauth_controller.ex:145 -msgid "This action is outside the authorized scopes" -msgstr "Cette action est en dehors des authorisations" # "scopes" ? - #, elixir-format +msgid "This action is outside the authorized scopes" +msgstr "Cette action est en dehors des authorisations" # "scopes" + #: lib/pleroma/web/oauth/fallback_controller.ex:14 +#, elixir-format msgid "Unknown error, please check the details and try again." msgstr "Erreur inconnue, veuillez vérifier les détails et réessayer." -#, elixir-format #: lib/pleroma/web/oauth/oauth_controller.ex:93 #: lib/pleroma/web/oauth/oauth_controller.ex:131 +#, elixir-format msgid "Unlisted redirect_uri." msgstr "redirect_uri non listé." -#, elixir-format #: lib/pleroma/web/oauth/oauth_controller.ex:294 +#, elixir-format msgid "Unsupported OAuth provider: %{provider}." msgstr "Fournisseur OAuth non supporté : %{provider}." -#, elixir-format #: lib/pleroma/uploaders/uploader.ex:71 -msgid "Uploader callback timeout" -msgstr "" -## msgstr "Attente écoulée" - #, elixir-format +msgid "Uploader callback timeout" +msgstr "Temps d'attente du téléverseur écoulé" + +## msgstr "Attente écoulée" #: lib/pleroma/web/uploader_controller.ex:11 #: lib/pleroma/web/uploader_controller.ex:23 +#, elixir-format msgid "bad request" msgstr "requête invalide" diff --git a/priv/gettext/nl/LC_MESSAGES/errors.po b/priv/gettext/nl/LC_MESSAGES/errors.po new file mode 100644 index 000000000..7e12ff96c --- /dev/null +++ b/priv/gettext/nl/LC_MESSAGES/errors.po @@ -0,0 +1,578 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-05-15 09:37+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Translate Toolkit 2.5.1\n" + +## This file is a PO Template file. +## +## `msgid`s here are often extracted from source code. +## Add new translations manually only if they're dynamic +## translations that can't be statically extracted. +## +## Run `mix gettext.extract` to bring this file up to +## date. Leave `msgstr`s empty as changing them here as no +## effect: edit them in PO (`.po`) files instead. +## From Ecto.Changeset.cast/4 +msgid "can't be blank" +msgstr "" + +## From Ecto.Changeset.unique_constraint/3 +msgid "has already been taken" +msgstr "" + +## From Ecto.Changeset.put_change/3 +msgid "is invalid" +msgstr "" + +## From Ecto.Changeset.validate_format/3 +msgid "has invalid format" +msgstr "" + +## From Ecto.Changeset.validate_subset/3 +msgid "has an invalid entry" +msgstr "" + +## From Ecto.Changeset.validate_exclusion/3 +msgid "is reserved" +msgstr "" + +## From Ecto.Changeset.validate_confirmation/3 +msgid "does not match confirmation" +msgstr "" + +## From Ecto.Changeset.no_assoc_constraint/3 +msgid "is still associated with this entry" +msgstr "" + +msgid "are still associated with this entry" +msgstr "" + +## From Ecto.Changeset.validate_length/3 +msgid "should be %{count} character(s)" +msgid_plural "should be %{count} character(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should have %{count} item(s)" +msgid_plural "should have %{count} item(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should be at least %{count} character(s)" +msgid_plural "should be at least %{count} character(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should have at least %{count} item(s)" +msgid_plural "should have at least %{count} item(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should be at most %{count} character(s)" +msgid_plural "should be at most %{count} character(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should have at most %{count} item(s)" +msgid_plural "should have at most %{count} item(s)" +msgstr[0] "" +msgstr[1] "" + +## From Ecto.Changeset.validate_number/3 +msgid "must be less than %{number}" +msgstr "" + +msgid "must be greater than %{number}" +msgstr "" + +msgid "must be less than or equal to %{number}" +msgstr "" + +msgid "must be greater than or equal to %{number}" +msgstr "" + +msgid "must be equal to %{number}" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:421 +#, elixir-format +msgid "Account not found" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:249 +#, elixir-format +msgid "Already voted" +msgstr "" + +#: lib/pleroma/web/oauth/oauth_controller.ex:360 +#, elixir-format +msgid "Bad request" +msgstr "" + +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:425 +#, elixir-format +msgid "Can't delete object" +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/status_controller.ex:196 +#, elixir-format +msgid "Can't delete this post" +msgstr "" + +#: lib/pleroma/web/controller_helper.ex:95 +#: lib/pleroma/web/controller_helper.ex:101 +#, elixir-format +msgid "Can't display this activity" +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:227 +#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:254 +#, elixir-format +msgid "Can't find user" +msgstr "" + +#: lib/pleroma/web/pleroma_api/controllers/account_controller.ex:114 +#, elixir-format +msgid "Can't get favorites" +msgstr "" + +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:437 +#, elixir-format +msgid "Can't like object" +msgstr "" + +#: lib/pleroma/web/common_api/utils.ex:556 +#, elixir-format +msgid "Cannot post an empty status without attachments" +msgstr "" + +#: lib/pleroma/web/common_api/utils.ex:504 +#, elixir-format +msgid "Comment must be up to %{max_size} characters" +msgstr "" + +#: lib/pleroma/config/config_db.ex:222 +#, elixir-format +msgid "Config with params %{params} not found" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:95 +#, elixir-format +msgid "Could not delete" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:141 +#, elixir-format +msgid "Could not favorite" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:370 +#, elixir-format +msgid "Could not pin" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:112 +#, elixir-format +msgid "Could not repeat" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:188 +#, elixir-format +msgid "Could not unfavorite" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:380 +#, elixir-format +msgid "Could not unpin" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:126 +#, elixir-format +msgid "Could not unrepeat" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:428 +#: lib/pleroma/web/common_api/common_api.ex:437 +#, elixir-format +msgid "Could not update state" +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:202 +#, elixir-format +msgid "Error." +msgstr "" + +#: lib/pleroma/web/twitter_api/twitter_api.ex:106 +#, elixir-format +msgid "Invalid CAPTCHA" +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:117 +#: lib/pleroma/web/oauth/oauth_controller.ex:569 +#, elixir-format +msgid "Invalid credentials" +msgstr "" + +#: lib/pleroma/plugs/ensure_authenticated_plug.ex:38 +#, elixir-format +msgid "Invalid credentials." +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:265 +#, elixir-format +msgid "Invalid indices" +msgstr "" + +#: lib/pleroma/web/admin_api/admin_api_controller.ex:1147 +#, elixir-format +msgid "Invalid parameters" +msgstr "" + +#: lib/pleroma/web/common_api/utils.ex:411 +#, elixir-format +msgid "Invalid password." +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:187 +#, elixir-format +msgid "Invalid request" +msgstr "" + +#: lib/pleroma/web/twitter_api/twitter_api.ex:109 +#, elixir-format +msgid "Kocaptcha service unavailable" +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:113 +#, elixir-format +msgid "Missing parameters" +msgstr "" + +#: lib/pleroma/web/common_api/utils.ex:540 +#, elixir-format +msgid "No such conversation" +msgstr "" + +#: lib/pleroma/web/admin_api/admin_api_controller.ex:439 +#: lib/pleroma/web/admin_api/admin_api_controller.ex:465 lib/pleroma/web/admin_api/admin_api_controller.ex:507 +#, elixir-format +msgid "No such permission_group" +msgstr "" + +#: lib/pleroma/plugs/uploaded_media.ex:74 +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:485 lib/pleroma/web/admin_api/admin_api_controller.ex:1135 +#: lib/pleroma/web/feed/user_controller.ex:73 lib/pleroma/web/ostatus/ostatus_controller.ex:143 +#, elixir-format +msgid "Not found" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:241 +#, elixir-format +msgid "Poll's author can't vote" +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:20 +#: lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:37 lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:49 +#: lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:50 lib/pleroma/web/mastodon_api/controllers/status_controller.ex:290 +#: lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:71 +#, elixir-format +msgid "Record not found" +msgstr "" + +#: lib/pleroma/web/admin_api/admin_api_controller.ex:1153 +#: lib/pleroma/web/feed/user_controller.ex:79 lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:32 +#: lib/pleroma/web/ostatus/ostatus_controller.ex:149 +#, elixir-format +msgid "Something went wrong" +msgstr "" + +#: lib/pleroma/web/common_api/activity_draft.ex:107 +#, elixir-format +msgid "The message visibility must be direct" +msgstr "" + +#: lib/pleroma/web/common_api/utils.ex:566 +#, elixir-format +msgid "The status is over the character limit" +msgstr "" + +#: lib/pleroma/plugs/ensure_public_or_authenticated_plug.ex:31 +#, elixir-format +msgid "This resource requires authentication." +msgstr "" + +#: lib/pleroma/plugs/rate_limiter/rate_limiter.ex:206 +#, elixir-format +msgid "Throttled" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:266 +#, elixir-format +msgid "Too many choices" +msgstr "" + +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:442 +#, elixir-format +msgid "Unhandled activity type" +msgstr "" + +#: lib/pleroma/web/admin_api/admin_api_controller.ex:536 +#, elixir-format +msgid "You can't revoke your own admin status." +msgstr "" + +#: lib/pleroma/web/oauth/oauth_controller.ex:218 +#: lib/pleroma/web/oauth/oauth_controller.ex:309 +#, elixir-format +msgid "Your account is currently disabled" +msgstr "" + +#: lib/pleroma/web/oauth/oauth_controller.ex:180 +#: lib/pleroma/web/oauth/oauth_controller.ex:332 +#, elixir-format +msgid "Your login is missing a confirmed e-mail address" +msgstr "" + +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:389 +#, elixir-format +msgid "can't read inbox of %{nickname} as %{as_nickname}" +msgstr "" + +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:472 +#, elixir-format +msgid "can't update outbox of %{nickname} as %{as_nickname}" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:388 +#, elixir-format +msgid "conversation is already muted" +msgstr "" + +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:316 +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:491 +#, elixir-format +msgid "error" +msgstr "" + +#: lib/pleroma/web/pleroma_api/controllers/mascot_controller.ex:29 +#, elixir-format +msgid "mascots can only be images" +msgstr "" + +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:60 +#, elixir-format +msgid "not found" +msgstr "" + +#: lib/pleroma/web/oauth/oauth_controller.ex:395 +#, elixir-format +msgid "Bad OAuth request." +msgstr "" + +#: lib/pleroma/web/twitter_api/twitter_api.ex:115 +#, elixir-format +msgid "CAPTCHA already used" +msgstr "" + +#: lib/pleroma/web/twitter_api/twitter_api.ex:112 +#, elixir-format +msgid "CAPTCHA expired" +msgstr "" + +#: lib/pleroma/plugs/uploaded_media.ex:55 +#, elixir-format +msgid "Failed" +msgstr "" + +#: lib/pleroma/web/oauth/oauth_controller.ex:411 +#, elixir-format +msgid "Failed to authenticate: %{message}." +msgstr "" + +#: lib/pleroma/web/oauth/oauth_controller.ex:442 +#, elixir-format +msgid "Failed to set up user account." +msgstr "" + +#: lib/pleroma/plugs/oauth_scopes_plug.ex:38 +#, elixir-format +msgid "Insufficient permissions: %{permissions}." +msgstr "" + +#: lib/pleroma/plugs/uploaded_media.ex:94 +#, elixir-format +msgid "Internal Error" +msgstr "" + +#: lib/pleroma/web/oauth/fallback_controller.ex:22 +#: lib/pleroma/web/oauth/fallback_controller.ex:29 +#, elixir-format +msgid "Invalid Username/Password" +msgstr "" + +#: lib/pleroma/web/twitter_api/twitter_api.ex:118 +#, elixir-format +msgid "Invalid answer data" +msgstr "" + +#: lib/pleroma/web/nodeinfo/nodeinfo_controller.ex:128 +#, elixir-format +msgid "Nodeinfo schema version not handled" +msgstr "" + +#: lib/pleroma/web/oauth/oauth_controller.ex:169 +#, elixir-format +msgid "This action is outside the authorized scopes" +msgstr "" + +#: lib/pleroma/web/oauth/fallback_controller.ex:14 +#, elixir-format +msgid "Unknown error, please check the details and try again." +msgstr "" + +#: lib/pleroma/web/oauth/oauth_controller.ex:116 +#: lib/pleroma/web/oauth/oauth_controller.ex:155 +#, elixir-format +msgid "Unlisted redirect_uri." +msgstr "" + +#: lib/pleroma/web/oauth/oauth_controller.ex:391 +#, elixir-format +msgid "Unsupported OAuth provider: %{provider}." +msgstr "" + +#: lib/pleroma/uploaders/uploader.ex:72 +#, elixir-format +msgid "Uploader callback timeout" +msgstr "" + +#: lib/pleroma/web/uploader_controller.ex:23 +#, elixir-format +msgid "bad request" +msgstr "" + +#: lib/pleroma/web/twitter_api/twitter_api.ex:103 +#, elixir-format +msgid "CAPTCHA Error" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:200 +#, elixir-format +msgid "Could not add reaction emoji" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:211 +#, elixir-format +msgid "Could not remove reaction emoji" +msgstr "" + +#: lib/pleroma/web/twitter_api/twitter_api.ex:129 +#, elixir-format +msgid "Invalid CAPTCHA (Missing parameter: %{name})" +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/list_controller.ex:92 +#, elixir-format +msgid "List not found" +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:124 +#, elixir-format +msgid "Missing parameter: %{name}" +msgstr "" + +#: lib/pleroma/web/oauth/oauth_controller.ex:207 +#: lib/pleroma/web/oauth/oauth_controller.ex:322 +#, elixir-format +msgid "Password reset is required" +msgstr "" + +#: lib/pleroma/tests/auth_test_controller.ex:9 +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:6 lib/pleroma/web/admin_api/admin_api_controller.ex:6 +#: lib/pleroma/web/controller_helper.ex:6 lib/pleroma/web/fallback_redirect_controller.ex:6 +#: lib/pleroma/web/feed/tag_controller.ex:6 lib/pleroma/web/feed/user_controller.ex:6 +#: lib/pleroma/web/mailer/subscription_controller.ex:2 lib/pleroma/web/masto_fe_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/app_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/auth_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/conversation_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/custom_emoji_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/domain_block_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/filter_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/follow_request_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/instance_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/list_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/marker_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex:14 lib/pleroma/web/mastodon_api/controllers/media_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/notification_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/report_controller.ex:8 lib/pleroma/web/mastodon_api/controllers/scheduled_activity_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/search_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/status_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:7 lib/pleroma/web/mastodon_api/controllers/suggestion_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:6 lib/pleroma/web/media_proxy/media_proxy_controller.ex:6 +#: lib/pleroma/web/mongooseim/mongoose_im_controller.ex:6 lib/pleroma/web/nodeinfo/nodeinfo_controller.ex:6 +#: lib/pleroma/web/oauth/fallback_controller.ex:6 lib/pleroma/web/oauth/mfa_controller.ex:10 +#: lib/pleroma/web/oauth/oauth_controller.ex:6 lib/pleroma/web/ostatus/ostatus_controller.ex:6 +#: lib/pleroma/web/pleroma_api/controllers/account_controller.ex:6 lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex:2 +#: lib/pleroma/web/pleroma_api/controllers/mascot_controller.ex:6 lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex:6 +#: lib/pleroma/web/pleroma_api/controllers/scrobble_controller.ex:6 +#: lib/pleroma/web/pleroma_api/controllers/two_factor_authentication_controller.ex:7 lib/pleroma/web/static_fe/static_fe_controller.ex:6 +#: lib/pleroma/web/twitter_api/controllers/password_controller.ex:10 lib/pleroma/web/twitter_api/controllers/remote_follow_controller.ex:6 +#: lib/pleroma/web/twitter_api/controllers/util_controller.ex:6 lib/pleroma/web/twitter_api/twitter_api_controller.ex:6 +#: lib/pleroma/web/uploader_controller.ex:6 lib/pleroma/web/web_finger/web_finger_controller.ex:6 +#, elixir-format +msgid "Security violation: OAuth scopes check was neither handled nor explicitly skipped." +msgstr "" + +#: lib/pleroma/plugs/ensure_authenticated_plug.ex:28 +#, elixir-format +msgid "Two-factor authentication enabled, you must use a access token." +msgstr "" + +#: lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex:210 +#, elixir-format +msgid "Unexpected error occurred while adding file to pack." +msgstr "" + +#: lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex:138 +#, elixir-format +msgid "Unexpected error occurred while creating pack." +msgstr "" + +#: lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex:278 +#, elixir-format +msgid "Unexpected error occurred while removing file from pack." +msgstr "" + +#: lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex:250 +#, elixir-format +msgid "Unexpected error occurred while updating file in pack." +msgstr "" + +#: lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex:179 +#, elixir-format +msgid "Unexpected error occurred while updating pack metadata." +msgstr "" + +#: lib/pleroma/plugs/user_is_admin_plug.ex:40 +#, elixir-format +msgid "User is not an admin or OAuth admin scope is not granted." +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:61 +#, elixir-format +msgid "Web push subscription is disabled on this Pleroma instance" +msgstr "" + +#: lib/pleroma/web/admin_api/admin_api_controller.ex:502 +#, elixir-format +msgid "You can't revoke your own admin/moderator status." +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:105 +#, elixir-format +msgid "authorization required for timeline view" +msgstr "" diff --git a/priv/gettext/pl/LC_MESSAGES/errors.po b/priv/gettext/pl/LC_MESSAGES/errors.po new file mode 100644 index 000000000..7bc39c52a --- /dev/null +++ b/priv/gettext/pl/LC_MESSAGES/errors.po @@ -0,0 +1,587 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-05-13 16:37+0000\n" +"PO-Revision-Date: 2020-05-16 17:13+0000\n" +"Last-Translator: Jędrzej Tomaszewski \n" +"Language-Team: Polish \n" +"Language: pl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 4.0.4\n" + +## This file is a PO Template file. +## +## `msgid`s here are often extracted from source code. +## Add new translations manually only if they're dynamic +## translations that can't be statically extracted. +## +## Run `mix gettext.extract` to bring this file up to +## date. Leave `msgstr`s empty as changing them here as no +## effect: edit them in PO (`.po`) files instead. +## From Ecto.Changeset.cast/4 +msgid "can't be blank" +msgstr "nie może być pusty" + +## From Ecto.Changeset.unique_constraint/3 +msgid "has already been taken" +msgstr "jest już zajęty" + +## From Ecto.Changeset.put_change/3 +msgid "is invalid" +msgstr "jest nieprawidłowy" + +## From Ecto.Changeset.validate_format/3 +msgid "has invalid format" +msgstr "ma niepoprawny format" + +## From Ecto.Changeset.validate_subset/3 +msgid "has an invalid entry" +msgstr "ma niepoprawny wpis" + +## From Ecto.Changeset.validate_exclusion/3 +msgid "is reserved" +msgstr "jest zarezerwowany" + +## From Ecto.Changeset.validate_confirmation/3 +msgid "does not match confirmation" +msgstr "" + +## From Ecto.Changeset.no_assoc_constraint/3 +msgid "is still associated with this entry" +msgstr "jest wciąż powiązane z tym wpisem" + +msgid "are still associated with this entry" +msgstr "są wciąż powiązane z tym wpisem" + +## From Ecto.Changeset.validate_length/3 +msgid "should be %{count} character(s)" +msgid_plural "should be %{count} character(s)" +msgstr[0] "powinno mieć %{count} znak" +msgstr[1] "powinno mieć %{count} znaki" +msgstr[2] "powinno mieć %{count} znaków" + +msgid "should have %{count} item(s)" +msgid_plural "should have %{count} item(s)" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +msgid "should be at least %{count} character(s)" +msgid_plural "should be at least %{count} character(s)" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +msgid "should have at least %{count} item(s)" +msgid_plural "should have at least %{count} item(s)" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +msgid "should be at most %{count} character(s)" +msgid_plural "should be at most %{count} character(s)" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +msgid "should have at most %{count} item(s)" +msgid_plural "should have at most %{count} item(s)" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +## From Ecto.Changeset.validate_number/3 +msgid "must be less than %{number}" +msgstr "" + +msgid "must be greater than %{number}" +msgstr "" + +msgid "must be less than or equal to %{number}" +msgstr "" + +msgid "must be greater than or equal to %{number}" +msgstr "" + +msgid "must be equal to %{number}" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:421 +#, elixir-format +msgid "Account not found" +msgstr "Nie znaleziono konta" + +#: lib/pleroma/web/common_api/common_api.ex:249 +#, elixir-format +msgid "Already voted" +msgstr "Już zagłosowano" + +#: lib/pleroma/web/oauth/oauth_controller.ex:360 +#, elixir-format +msgid "Bad request" +msgstr "Nieprawidłowe żądanie" + +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:425 +#, elixir-format +msgid "Can't delete object" +msgstr "Nie można usunąć obiektu" + +#: lib/pleroma/web/mastodon_api/controllers/status_controller.ex:196 +#, elixir-format +msgid "Can't delete this post" +msgstr "Nie udało się usunąć tego statusu" + +#: lib/pleroma/web/controller_helper.ex:95 +#: lib/pleroma/web/controller_helper.ex:101 +#, elixir-format +msgid "Can't display this activity" +msgstr "Nie można wyświetlić tej aktywności" + +#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:227 +#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:254 +#, elixir-format +msgid "Can't find user" +msgstr "Nie znaleziono użytkownika" + +#: lib/pleroma/web/pleroma_api/controllers/account_controller.ex:114 +#, elixir-format +msgid "Can't get favorites" +msgstr "" + +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:437 +#, elixir-format +msgid "Can't like object" +msgstr "Nie udało się polubić obiektu" + +#: lib/pleroma/web/common_api/utils.ex:556 +#, elixir-format +msgid "Cannot post an empty status without attachments" +msgstr "Nie można opublikować pustego statusu bez załączników" + +#: lib/pleroma/web/common_api/utils.ex:504 +#, elixir-format +msgid "Comment must be up to %{max_size} characters" +msgstr "Komentarz może mieć co najwyżej %{max_size} znaków" + +#: lib/pleroma/config/config_db.ex:222 +#, elixir-format +msgid "Config with params %{params} not found" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:95 +#, elixir-format +msgid "Could not delete" +msgstr "Nie udało się usunąć" + +#: lib/pleroma/web/common_api/common_api.ex:141 +#, elixir-format +msgid "Could not favorite" +msgstr "Nie udało się dodać do ulubionych" + +#: lib/pleroma/web/common_api/common_api.ex:370 +#, elixir-format +msgid "Could not pin" +msgstr "Nie udało się przypiąć" + +#: lib/pleroma/web/common_api/common_api.ex:112 +#, elixir-format +msgid "Could not repeat" +msgstr "Nie udało się powtórzyć" + +#: lib/pleroma/web/common_api/common_api.ex:188 +#, elixir-format +msgid "Could not unfavorite" +msgstr "Nie udało się usunąć z ulubionych" + +#: lib/pleroma/web/common_api/common_api.ex:380 +#, elixir-format +msgid "Could not unpin" +msgstr "Nie udało się odpiąć" + +#: lib/pleroma/web/common_api/common_api.ex:126 +#, elixir-format +msgid "Could not unrepeat" +msgstr "Nie udało się cofnąć powtórzenia" + +#: lib/pleroma/web/common_api/common_api.ex:428 +#: lib/pleroma/web/common_api/common_api.ex:437 +#, elixir-format +msgid "Could not update state" +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:202 +#, elixir-format +msgid "Error." +msgstr "" + +#: lib/pleroma/web/twitter_api/twitter_api.ex:106 +#, elixir-format +msgid "Invalid CAPTCHA" +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:117 +#: lib/pleroma/web/oauth/oauth_controller.ex:569 +#, elixir-format +msgid "Invalid credentials" +msgstr "" + +#: lib/pleroma/plugs/ensure_authenticated_plug.ex:38 +#, elixir-format +msgid "Invalid credentials." +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:265 +#, elixir-format +msgid "Invalid indices" +msgstr "" + +#: lib/pleroma/web/admin_api/admin_api_controller.ex:1147 +#, elixir-format +msgid "Invalid parameters" +msgstr "" + +#: lib/pleroma/web/common_api/utils.ex:411 +#, elixir-format +msgid "Invalid password." +msgstr "Nieprawidłowe hasło." + +#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:187 +#, elixir-format +msgid "Invalid request" +msgstr "Nieprawidłowe żądanie" + +#: lib/pleroma/web/twitter_api/twitter_api.ex:109 +#, elixir-format +msgid "Kocaptcha service unavailable" +msgstr "Usługa Kocaptcha niedostępna" + +#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:113 +#, elixir-format +msgid "Missing parameters" +msgstr "Brakujące parametry" + +#: lib/pleroma/web/common_api/utils.ex:540 +#, elixir-format +msgid "No such conversation" +msgstr "Nie ma takiej rozmowy" + +#: lib/pleroma/web/admin_api/admin_api_controller.ex:439 +#: lib/pleroma/web/admin_api/admin_api_controller.ex:465 lib/pleroma/web/admin_api/admin_api_controller.ex:507 +#, elixir-format +msgid "No such permission_group" +msgstr "Nie ma takiej grupy uprawnień" + +#: lib/pleroma/plugs/uploaded_media.ex:74 +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:485 lib/pleroma/web/admin_api/admin_api_controller.ex:1135 +#: lib/pleroma/web/feed/user_controller.ex:73 lib/pleroma/web/ostatus/ostatus_controller.ex:143 +#, elixir-format +msgid "Not found" +msgstr "Nie znaleziono" + +#: lib/pleroma/web/common_api/common_api.ex:241 +#, elixir-format +msgid "Poll's author can't vote" +msgstr "Autor ankiety nie może głosować" + +#: lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:20 +#: lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:37 lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:49 +#: lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:50 lib/pleroma/web/mastodon_api/controllers/status_controller.ex:290 +#: lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:71 +#, elixir-format +msgid "Record not found" +msgstr "Nie znaleziono rekordu" + +#: lib/pleroma/web/admin_api/admin_api_controller.ex:1153 +#: lib/pleroma/web/feed/user_controller.ex:79 lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:32 +#: lib/pleroma/web/ostatus/ostatus_controller.ex:149 +#, elixir-format +msgid "Something went wrong" +msgstr "Coś się zepsuło" + +#: lib/pleroma/web/common_api/activity_draft.ex:107 +#, elixir-format +msgid "The message visibility must be direct" +msgstr "" + +#: lib/pleroma/web/common_api/utils.ex:566 +#, elixir-format +msgid "The status is over the character limit" +msgstr "Ten status przekracza limit znaków" + +#: lib/pleroma/plugs/ensure_public_or_authenticated_plug.ex:31 +#, elixir-format +msgid "This resource requires authentication." +msgstr "" + +#: lib/pleroma/plugs/rate_limiter/rate_limiter.ex:206 +#, elixir-format +msgid "Throttled" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:266 +#, elixir-format +msgid "Too many choices" +msgstr "" + +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:442 +#, elixir-format +msgid "Unhandled activity type" +msgstr "Nieobsługiwany typ aktywności" + +#: lib/pleroma/web/admin_api/admin_api_controller.ex:536 +#, elixir-format +msgid "You can't revoke your own admin status." +msgstr "Nie możesz odebrać samemu sobie statusu administratora." + +#: lib/pleroma/web/oauth/oauth_controller.ex:218 +#: lib/pleroma/web/oauth/oauth_controller.ex:309 +#, elixir-format +msgid "Your account is currently disabled" +msgstr "Twoje konto jest obecnie nieaktywne" + +#: lib/pleroma/web/oauth/oauth_controller.ex:180 +#: lib/pleroma/web/oauth/oauth_controller.ex:332 +#, elixir-format +msgid "Your login is missing a confirmed e-mail address" +msgstr "" + +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:389 +#, elixir-format +msgid "can't read inbox of %{nickname} as %{as_nickname}" +msgstr "" + +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:472 +#, elixir-format +msgid "can't update outbox of %{nickname} as %{as_nickname}" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:388 +#, elixir-format +msgid "conversation is already muted" +msgstr "rozmowa jest już wyciszona" + +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:316 +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:491 +#, elixir-format +msgid "error" +msgstr "błąd" + +#: lib/pleroma/web/pleroma_api/controllers/mascot_controller.ex:29 +#, elixir-format +msgid "mascots can only be images" +msgstr "maskotki muszą być obrazkami" + +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:60 +#, elixir-format +msgid "not found" +msgstr "nie znaleziono" + +#: lib/pleroma/web/oauth/oauth_controller.ex:395 +#, elixir-format +msgid "Bad OAuth request." +msgstr "Niepoprawne żądanie OAuth." + +#: lib/pleroma/web/twitter_api/twitter_api.ex:115 +#, elixir-format +msgid "CAPTCHA already used" +msgstr "Zużyta CAPTCHA" + +#: lib/pleroma/web/twitter_api/twitter_api.ex:112 +#, elixir-format +msgid "CAPTCHA expired" +msgstr "CAPTCHA wygasła" + +#: lib/pleroma/plugs/uploaded_media.ex:55 +#, elixir-format +msgid "Failed" +msgstr "Nie udało się" + +#: lib/pleroma/web/oauth/oauth_controller.ex:411 +#, elixir-format +msgid "Failed to authenticate: %{message}." +msgstr "" + +#: lib/pleroma/web/oauth/oauth_controller.ex:442 +#, elixir-format +msgid "Failed to set up user account." +msgstr "" + +#: lib/pleroma/plugs/oauth_scopes_plug.ex:38 +#, elixir-format +msgid "Insufficient permissions: %{permissions}." +msgstr "Niewystarczające uprawnienia: %{permissions}." + +#: lib/pleroma/plugs/uploaded_media.ex:94 +#, elixir-format +msgid "Internal Error" +msgstr "Błąd wewnętrzny" + +#: lib/pleroma/web/oauth/fallback_controller.ex:22 +#: lib/pleroma/web/oauth/fallback_controller.ex:29 +#, elixir-format +msgid "Invalid Username/Password" +msgstr "Nieprawidłowa nazwa użytkownika lub hasło" + +#: lib/pleroma/web/twitter_api/twitter_api.ex:118 +#, elixir-format +msgid "Invalid answer data" +msgstr "" + +#: lib/pleroma/web/nodeinfo/nodeinfo_controller.ex:128 +#, elixir-format +msgid "Nodeinfo schema version not handled" +msgstr "Nieobsługiwana wersja schematu Nodeinfo" + +#: lib/pleroma/web/oauth/oauth_controller.ex:169 +#, elixir-format +msgid "This action is outside the authorized scopes" +msgstr "" + +#: lib/pleroma/web/oauth/fallback_controller.ex:14 +#, elixir-format +msgid "Unknown error, please check the details and try again." +msgstr "Nieznany błąd, sprawdź szczegóły i spróbuj ponownie." + +#: lib/pleroma/web/oauth/oauth_controller.ex:116 +#: lib/pleroma/web/oauth/oauth_controller.ex:155 +#, elixir-format +msgid "Unlisted redirect_uri." +msgstr "" + +#: lib/pleroma/web/oauth/oauth_controller.ex:391 +#, elixir-format +msgid "Unsupported OAuth provider: %{provider}." +msgstr "Nieobsługiwany dostawca OAuth: %{provider}." + +#: lib/pleroma/uploaders/uploader.ex:72 +#, elixir-format +msgid "Uploader callback timeout" +msgstr "" + +#: lib/pleroma/web/uploader_controller.ex:23 +#, elixir-format +msgid "bad request" +msgstr "nieprawidłowe żądanie" + +#: lib/pleroma/web/twitter_api/twitter_api.ex:103 +#, elixir-format +msgid "CAPTCHA Error" +msgstr "Błąd CAPTCHA" + +#: lib/pleroma/web/common_api/common_api.ex:200 +#, elixir-format +msgid "Could not add reaction emoji" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:211 +#, elixir-format +msgid "Could not remove reaction emoji" +msgstr "" + +#: lib/pleroma/web/twitter_api/twitter_api.ex:129 +#, elixir-format +msgid "Invalid CAPTCHA (Missing parameter: %{name})" +msgstr "Nieprawidłowa CAPTCHA (Brakujący parametr: %{name})" + +#: lib/pleroma/web/mastodon_api/controllers/list_controller.ex:92 +#, elixir-format +msgid "List not found" +msgstr "Nie znaleziono listy" + +#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:124 +#, elixir-format +msgid "Missing parameter: %{name}" +msgstr "Brakujący parametr: %{name}" + +#: lib/pleroma/web/oauth/oauth_controller.ex:207 +#: lib/pleroma/web/oauth/oauth_controller.ex:322 +#, elixir-format +msgid "Password reset is required" +msgstr "Wymagany reset hasła" + +#: lib/pleroma/tests/auth_test_controller.ex:9 +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:6 lib/pleroma/web/admin_api/admin_api_controller.ex:6 +#: lib/pleroma/web/controller_helper.ex:6 lib/pleroma/web/fallback_redirect_controller.ex:6 +#: lib/pleroma/web/feed/tag_controller.ex:6 lib/pleroma/web/feed/user_controller.ex:6 +#: lib/pleroma/web/mailer/subscription_controller.ex:2 lib/pleroma/web/masto_fe_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/app_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/auth_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/conversation_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/custom_emoji_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/domain_block_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/filter_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/follow_request_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/instance_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/list_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/marker_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex:14 lib/pleroma/web/mastodon_api/controllers/media_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/notification_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/report_controller.ex:8 lib/pleroma/web/mastodon_api/controllers/scheduled_activity_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/search_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/status_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:7 lib/pleroma/web/mastodon_api/controllers/suggestion_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:6 lib/pleroma/web/media_proxy/media_proxy_controller.ex:6 +#: lib/pleroma/web/mongooseim/mongoose_im_controller.ex:6 lib/pleroma/web/nodeinfo/nodeinfo_controller.ex:6 +#: lib/pleroma/web/oauth/fallback_controller.ex:6 lib/pleroma/web/oauth/mfa_controller.ex:10 +#: lib/pleroma/web/oauth/oauth_controller.ex:6 lib/pleroma/web/ostatus/ostatus_controller.ex:6 +#: lib/pleroma/web/pleroma_api/controllers/account_controller.ex:6 lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex:2 +#: lib/pleroma/web/pleroma_api/controllers/mascot_controller.ex:6 lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex:6 +#: lib/pleroma/web/pleroma_api/controllers/scrobble_controller.ex:6 +#: lib/pleroma/web/pleroma_api/controllers/two_factor_authentication_controller.ex:7 lib/pleroma/web/static_fe/static_fe_controller.ex:6 +#: lib/pleroma/web/twitter_api/controllers/password_controller.ex:10 lib/pleroma/web/twitter_api/controllers/remote_follow_controller.ex:6 +#: lib/pleroma/web/twitter_api/controllers/util_controller.ex:6 lib/pleroma/web/twitter_api/twitter_api_controller.ex:6 +#: lib/pleroma/web/uploader_controller.ex:6 lib/pleroma/web/web_finger/web_finger_controller.ex:6 +#, elixir-format +msgid "Security violation: OAuth scopes check was neither handled nor explicitly skipped." +msgstr "" + +#: lib/pleroma/plugs/ensure_authenticated_plug.ex:28 +#, elixir-format +msgid "Two-factor authentication enabled, you must use a access token." +msgstr "Uwierzytelnienie dwuskładnikowe jest włączone, musisz użyć tokenu." + +#: lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex:210 +#, elixir-format +msgid "Unexpected error occurred while adding file to pack." +msgstr "Nieoczekiwany błąd podczas dodawania pliku do paczki." + +#: lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex:138 +#, elixir-format +msgid "Unexpected error occurred while creating pack." +msgstr "Nieoczekiwany błąd podczas tworzenia paczki." + +#: lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex:278 +#, elixir-format +msgid "Unexpected error occurred while removing file from pack." +msgstr "Nieoczekiwany błąd podczas usuwania pliku z paczki." + +#: lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex:250 +#, elixir-format +msgid "Unexpected error occurred while updating file in pack." +msgstr "Nieoczekiwany błąd podczas zmieniania pliku w paczce." + +#: lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex:179 +#, elixir-format +msgid "Unexpected error occurred while updating pack metadata." +msgstr "Nieoczekiwany błąd podczas zmieniania metadanych paczki." + +#: lib/pleroma/plugs/user_is_admin_plug.ex:40 +#, elixir-format +msgid "User is not an admin or OAuth admin scope is not granted." +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:61 +#, elixir-format +msgid "Web push subscription is disabled on this Pleroma instance" +msgstr "Powiadomienia web push są wyłączone na tej instancji Pleromy" + +#: lib/pleroma/web/admin_api/admin_api_controller.ex:502 +#, elixir-format +msgid "You can't revoke your own admin/moderator status." +msgstr "Nie możesz odebrać samemu sobie statusu administratora/moderatora." + +#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:105 +#, elixir-format +msgid "authorization required for timeline view" +msgstr "logowanie wymagane do przeglądania osi czasu" diff --git a/priv/repo/migrations/20190408123347_create_conversations.exs b/priv/repo/migrations/20190408123347_create_conversations.exs index d75459e82..3eaa6136c 100644 --- a/priv/repo/migrations/20190408123347_create_conversations.exs +++ b/priv/repo/migrations/20190408123347_create_conversations.exs @@ -1,5 +1,5 @@ # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors +# Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Repo.Migrations.CreateConversations do diff --git a/priv/repo/migrations/20190414125034_migrate_old_bookmarks.exs b/priv/repo/migrations/20190414125034_migrate_old_bookmarks.exs index c618ea381..b6f0ac66b 100644 --- a/priv/repo/migrations/20190414125034_migrate_old_bookmarks.exs +++ b/priv/repo/migrations/20190414125034_migrate_old_bookmarks.exs @@ -3,7 +3,6 @@ defmodule Pleroma.Repo.Migrations.MigrateOldBookmarks do import Ecto.Query alias Pleroma.Activity alias Pleroma.Bookmark - alias Pleroma.User alias Pleroma.Repo def up do diff --git a/priv/repo/migrations/20190506054542_add_multi_factor_authentication_settings_to_user.exs b/priv/repo/migrations/20190506054542_add_multi_factor_authentication_settings_to_user.exs new file mode 100644 index 000000000..8b653c61f --- /dev/null +++ b/priv/repo/migrations/20190506054542_add_multi_factor_authentication_settings_to_user.exs @@ -0,0 +1,9 @@ +defmodule Pleroma.Repo.Migrations.AddMultiFactorAuthenticationSettingsToUser do + use Ecto.Migration + + def change do + alter table(:users) do + add(:multi_factor_authentication_settings, :map, default: %{}) + end + end +end diff --git a/priv/repo/migrations/20190508193213_create_mfa_tokens.exs b/priv/repo/migrations/20190508193213_create_mfa_tokens.exs new file mode 100644 index 000000000..da9f8fabe --- /dev/null +++ b/priv/repo/migrations/20190508193213_create_mfa_tokens.exs @@ -0,0 +1,16 @@ +defmodule Pleroma.Repo.Migrations.CreateMfaTokens do + use Ecto.Migration + + def change do + create table(:mfa_tokens) do + add(:user_id, references(:users, type: :uuid, on_delete: :delete_all)) + add(:authorization_id, references(:oauth_authorizations, on_delete: :delete_all)) + add(:token, :string) + add(:valid_until, :naive_datetime_usec) + + timestamps() + end + + create(unique_index(:mfa_tokens, :token)) + end +end diff --git a/priv/repo/migrations/20190711042021_create_safe_jsonb_set.exs b/priv/repo/migrations/20190711042021_create_safe_jsonb_set.exs index 2f336a5e8..43d616705 100644 --- a/priv/repo/migrations/20190711042021_create_safe_jsonb_set.exs +++ b/priv/repo/migrations/20190711042021_create_safe_jsonb_set.exs @@ -1,6 +1,5 @@ defmodule Pleroma.Repo.Migrations.CreateSafeJsonbSet do use Ecto.Migration - alias Pleroma.User def change do execute(""" diff --git a/priv/repo/migrations/20200227122417_add_trusted_to_apps.exs b/priv/repo/migrations/20200227122417_add_trusted_to_apps.exs new file mode 100644 index 000000000..4e2a62af0 --- /dev/null +++ b/priv/repo/migrations/20200227122417_add_trusted_to_apps.exs @@ -0,0 +1,9 @@ +defmodule Pleroma.Repo.Migrations.AddTrustedToApps do + use Ecto.Migration + + def change do + alter table(:apps) do + add(:trusted, :boolean, default: false) + end + end +end diff --git a/priv/repo/migrations/20200328124805_change_following_relationships_state_to_integer.exs b/priv/repo/migrations/20200328124805_change_following_relationships_state_to_integer.exs new file mode 100644 index 000000000..2b0820f3f --- /dev/null +++ b/priv/repo/migrations/20200328124805_change_following_relationships_state_to_integer.exs @@ -0,0 +1,29 @@ +defmodule Pleroma.Repo.Migrations.ChangeFollowingRelationshipsStateToInteger do + use Ecto.Migration + + @alter_following_relationship_state "ALTER TABLE following_relationships ALTER COLUMN state" + + def up do + execute(""" + #{@alter_following_relationship_state} TYPE integer USING + CASE + WHEN state = 'pending' THEN 1 + WHEN state = 'accept' THEN 2 + WHEN state = 'reject' THEN 3 + ELSE 0 + END; + """) + end + + def down do + execute(""" + #{@alter_following_relationship_state} TYPE varchar(255) USING + CASE + WHEN state = 1 THEN 'pending' + WHEN state = 2 THEN 'accept' + WHEN state = 3 THEN 'reject' + ELSE '' + END; + """) + end +end diff --git a/priv/repo/migrations/20200328130139_add_following_relationships_following_id_index.exs b/priv/repo/migrations/20200328130139_add_following_relationships_following_id_index.exs new file mode 100644 index 000000000..884832f84 --- /dev/null +++ b/priv/repo/migrations/20200328130139_add_following_relationships_following_id_index.exs @@ -0,0 +1,11 @@ +defmodule Pleroma.Repo.Migrations.AddFollowingRelationshipsFollowingIdIndex do + use Ecto.Migration + + # [:follower_index] index is useless because of [:follower_id, :following_id] index + # [:following_id] index makes sense because of user's followers-targeted queries + def change do + drop_if_exists(index(:following_relationships, [:follower_id])) + + create_if_not_exists(index(:following_relationships, [:following_id])) + end +end diff --git a/priv/repo/migrations/20200401030751_users_add_public_key.exs b/priv/repo/migrations/20200401030751_users_add_public_key.exs new file mode 100644 index 000000000..04e5ad1e2 --- /dev/null +++ b/priv/repo/migrations/20200401030751_users_add_public_key.exs @@ -0,0 +1,17 @@ +defmodule Pleroma.Repo.Migrations.UsersAddPublicKey do + use Ecto.Migration + + def up do + alter table(:users) do + add_if_not_exists(:public_key, :text) + end + + execute("UPDATE users SET public_key = source_data->'publicKey'->>'publicKeyPem'") + end + + def down do + alter table(:users) do + remove_if_exists(:public_key, :text) + end + end +end diff --git a/priv/repo/migrations/20200401072456_users_add_inboxes.exs b/priv/repo/migrations/20200401072456_users_add_inboxes.exs new file mode 100644 index 000000000..0947f0ab2 --- /dev/null +++ b/priv/repo/migrations/20200401072456_users_add_inboxes.exs @@ -0,0 +1,20 @@ +defmodule Pleroma.Repo.Migrations.UsersAddInboxes do + use Ecto.Migration + + def up do + alter table(:users) do + add_if_not_exists(:inbox, :text) + add_if_not_exists(:shared_inbox, :text) + end + + execute("UPDATE users SET inbox = source_data->>'inbox'") + execute("UPDATE users SET shared_inbox = source_data->'endpoints'->>'sharedInbox'") + end + + def down do + alter table(:users) do + remove_if_exists(:inbox, :text) + remove_if_exists(:shared_inbox, :text) + end + end +end diff --git a/priv/repo/migrations/20200402063221_update_oban_jobs_table.exs b/priv/repo/migrations/20200402063221_update_oban_jobs_table.exs new file mode 100644 index 000000000..e7ff04008 --- /dev/null +++ b/priv/repo/migrations/20200402063221_update_oban_jobs_table.exs @@ -0,0 +1,11 @@ +defmodule Pleroma.Repo.Migrations.UpdateObanJobsTable do + use Ecto.Migration + + def up do + Oban.Migrations.up(version: 8) + end + + def down do + Oban.Migrations.down(version: 7) + end +end diff --git a/priv/repo/migrations/20200406100225_users_add_emoji.exs b/priv/repo/migrations/20200406100225_users_add_emoji.exs new file mode 100644 index 000000000..f248108de --- /dev/null +++ b/priv/repo/migrations/20200406100225_users_add_emoji.exs @@ -0,0 +1,38 @@ +defmodule Pleroma.Repo.Migrations.UsersPopulateEmoji do + use Ecto.Migration + + import Ecto.Query + + alias Pleroma.User + alias Pleroma.Repo + + def up do + execute("ALTER TABLE users ALTER COLUMN emoji SET DEFAULT '{}'::jsonb") + execute("UPDATE users SET emoji = DEFAULT WHERE emoji = '[]'::jsonb") + + from(u in User) + |> select([u], struct(u, [:id, :ap_id, :source_data])) + |> Repo.stream() + |> Enum.each(fn user -> + emoji = + user.source_data + |> Map.get("tag", []) + |> Enum.filter(fn + %{"type" => "Emoji"} -> true + _ -> false + end) + |> Enum.reduce(%{}, fn %{"icon" => %{"url" => url}, "name" => name}, acc -> + Map.put(acc, String.trim(name, ":"), url) + end) + + user + |> Ecto.Changeset.cast(%{emoji: emoji}, [:emoji]) + |> Repo.update() + end) + end + + def down do + execute("ALTER TABLE users ALTER COLUMN emoji SET DEFAULT '[]'::jsonb") + execute("UPDATE users SET emoji = DEFAULT WHERE emoji = '{}'::jsonb") + end +end diff --git a/priv/repo/migrations/20200406105422_users_remove_source_data.exs b/priv/repo/migrations/20200406105422_users_remove_source_data.exs new file mode 100644 index 000000000..9812d480f --- /dev/null +++ b/priv/repo/migrations/20200406105422_users_remove_source_data.exs @@ -0,0 +1,15 @@ +defmodule Pleroma.Repo.Migrations.UsersRemoveSourceData do + use Ecto.Migration + + def up do + alter table(:users) do + remove_if_exists(:source_data, :map) + end + end + + def down do + alter table(:users) do + add_if_not_exists(:source_data, :map, default: %{}) + end + end +end diff --git a/priv/repo/migrations/20200415181818_update_markers.exs b/priv/repo/migrations/20200415181818_update_markers.exs new file mode 100644 index 000000000..bb9d8e860 --- /dev/null +++ b/priv/repo/migrations/20200415181818_update_markers.exs @@ -0,0 +1,44 @@ +defmodule Pleroma.Repo.Migrations.UpdateMarkers do + use Ecto.Migration + import Ecto.Query + alias Pleroma.Repo + + def up do + update_markers() + end + + def down do + :ok + end + + defp update_markers do + now = NaiveDateTime.utc_now() + + markers_attrs = + from(q in "notifications", + select: %{ + timeline: "notifications", + user_id: q.user_id, + last_read_id: + type(fragment("MAX( CASE WHEN seen = true THEN id ELSE null END )"), :string) + }, + group_by: [q.user_id] + ) + |> Repo.all() + |> Enum.map(fn %{last_read_id: last_read_id} = attrs -> + attrs + |> Map.put(:last_read_id, last_read_id || "") + |> Map.put_new(:inserted_at, now) + |> Map.put_new(:updated_at, now) + end) + + markers_attrs + |> Enum.chunk_every(1000) + |> Enum.each(fn markers_attrs_chunked -> + Repo.insert_all("markers", markers_attrs_chunked, + on_conflict: {:replace, [:last_read_id]}, + conflict_target: [:user_id, :timeline] + ) + end) + end +end diff --git a/priv/repo/migrations/20200428221338_insert_skeletons_for_deleted_users.exs b/priv/repo/migrations/20200428221338_insert_skeletons_for_deleted_users.exs new file mode 100644 index 000000000..2adc38186 --- /dev/null +++ b/priv/repo/migrations/20200428221338_insert_skeletons_for_deleted_users.exs @@ -0,0 +1,45 @@ +defmodule Pleroma.Repo.Migrations.InsertSkeletonsForDeletedUsers do + use Ecto.Migration + + alias Pleroma.User + alias Pleroma.Repo + + import Ecto.Query + + def change do + Application.ensure_all_started(:flake_id) + + local_ap_id = + User.Query.build(%{local: true}) + |> select([u], u.ap_id) + |> limit(1) + |> Repo.one() + + unless local_ap_id == nil do + # Hack to get instance base url because getting it from Phoenix + # would require starting the whole application + instance_uri = + local_ap_id + |> URI.parse() + |> Map.put(:query, nil) + |> Map.put(:path, nil) + |> URI.to_string() + + {:ok, %{rows: ap_ids}} = + Ecto.Adapters.SQL.query( + Repo, + "select distinct unnest(nonexistent_locals.recipients) from activities, lateral (select array_agg(recipient) as recipients from unnest(activities.recipients) as recipient where recipient similar to '#{ + instance_uri + }/users/[A-Za-z0-9]*' and not(recipient in (select ap_id from users))) nonexistent_locals;", + [], + timeout: :infinity + ) + + ap_ids + |> Enum.each(fn [ap_id] -> + Ecto.Changeset.change(%User{}, deactivated: true, ap_id: ap_id) + |> Repo.insert() + end) + end + end +end diff --git a/priv/repo/migrations/20200505072231_remove_magic_key_field.exs b/priv/repo/migrations/20200505072231_remove_magic_key_field.exs new file mode 100644 index 000000000..2635e671b --- /dev/null +++ b/priv/repo/migrations/20200505072231_remove_magic_key_field.exs @@ -0,0 +1,9 @@ +defmodule Pleroma.Repo.Migrations.RemoveMagicKeyField do + use Ecto.Migration + + def change do + alter table(:users) do + remove(:magic_key, :string) + end + end +end diff --git a/priv/repo/migrations/20200526144426_add_apps_indexes.exs b/priv/repo/migrations/20200526144426_add_apps_indexes.exs new file mode 100644 index 000000000..5cb6a0473 --- /dev/null +++ b/priv/repo/migrations/20200526144426_add_apps_indexes.exs @@ -0,0 +1,7 @@ +defmodule Pleroma.Repo.Migrations.AddAppsIndexes do + use Ecto.Migration + + def change do + create(index(:apps, [:client_id, :client_secret])) + end +end diff --git a/priv/repo/migrations/20200527104138_change_notification_user_index.exs b/priv/repo/migrations/20200527104138_change_notification_user_index.exs new file mode 100644 index 000000000..4dcfe6de9 --- /dev/null +++ b/priv/repo/migrations/20200527104138_change_notification_user_index.exs @@ -0,0 +1,8 @@ +defmodule Pleroma.Repo.Migrations.ChangeNotificationUserIndex do + use Ecto.Migration + + def change do + drop_if_exists(index(:notifications, [:user_id])) + create_if_not_exists(index(:notifications, [:user_id, "id desc nulls last"])) + end +end diff --git a/priv/static/READ_THIS_BEFORE_TOUCHING_FILES_HERE b/priv/static/READ_THIS_BEFORE_TOUCHING_FILES_HERE new file mode 100644 index 000000000..eb5294eaf --- /dev/null +++ b/priv/static/READ_THIS_BEFORE_TOUCHING_FILES_HERE @@ -0,0 +1 @@ +If you are an instance admin and you want to modify the instace static files, this is probably not the right place to do it. This directory is checked in version control, so don't be surprised if you get merge conflicts after modifying anything here. Please use instance static directory instead, it has the same directory structure and files placed there will override files placed here. See https://docs.pleroma.social/backend/configuration/static_dir/ for more info diff --git a/priv/static/adminfe/app.c836e084.css b/priv/static/adminfe/app.796ca6d4.css similarity index 68% rename from priv/static/adminfe/app.c836e084.css rename to priv/static/adminfe/app.796ca6d4.css index 473ec1b86..1b83a8a39 100644 Binary files a/priv/static/adminfe/app.c836e084.css and b/priv/static/adminfe/app.796ca6d4.css differ diff --git a/priv/static/adminfe/chunk-15fa.5a5f973d.css b/priv/static/adminfe/chunk-0558.af0d89cd.css similarity index 100% rename from priv/static/adminfe/chunk-15fa.5a5f973d.css rename to priv/static/adminfe/chunk-0558.af0d89cd.css diff --git a/priv/static/adminfe/chunk-0778.d9e7180a.css b/priv/static/adminfe/chunk-0778.d9e7180a.css new file mode 100644 index 000000000..9d730019a Binary files /dev/null and b/priv/static/adminfe/chunk-0778.d9e7180a.css differ diff --git a/priv/static/adminfe/chunk-876c.90dffac4.css b/priv/static/adminfe/chunk-0961.d3692214.css similarity index 100% rename from priv/static/adminfe/chunk-876c.90dffac4.css rename to priv/static/adminfe/chunk-0961.d3692214.css diff --git a/priv/static/adminfe/chunk-0d8f.650c8e81.css b/priv/static/adminfe/chunk-0d8f.650c8e81.css deleted file mode 100644 index 0b2a3f669..000000000 Binary files a/priv/static/adminfe/chunk-0d8f.650c8e81.css and /dev/null differ diff --git a/priv/static/adminfe/chunk-136a.3936457d.css b/priv/static/adminfe/chunk-136a.3936457d.css deleted file mode 100644 index 2857a9d6e..000000000 Binary files a/priv/static/adminfe/chunk-136a.3936457d.css and /dev/null differ diff --git a/priv/static/adminfe/chunk-22d2.813009b9.css b/priv/static/adminfe/chunk-22d2.813009b9.css new file mode 100644 index 000000000..f0a98583e Binary files /dev/null and b/priv/static/adminfe/chunk-22d2.813009b9.css differ diff --git a/priv/static/adminfe/chunk-3384.d50ed383.css b/priv/static/adminfe/chunk-3384.d50ed383.css new file mode 100644 index 000000000..70ae2a26b Binary files /dev/null and b/priv/static/adminfe/chunk-3384.d50ed383.css differ diff --git a/priv/static/adminfe/chunk-46cf.a43e9415.css b/priv/static/adminfe/chunk-46cf.a43e9415.css deleted file mode 100644 index aa7160528..000000000 Binary files a/priv/static/adminfe/chunk-46cf.a43e9415.css and /dev/null differ diff --git a/priv/static/adminfe/chunk-46ef.d45db7be.css b/priv/static/adminfe/chunk-46ef.d45db7be.css deleted file mode 100644 index d6cc7d182..000000000 Binary files a/priv/static/adminfe/chunk-46ef.d45db7be.css and /dev/null differ diff --git a/priv/static/adminfe/chunk-4e7d.7aace723.css b/priv/static/adminfe/chunk-4e7d.7aace723.css deleted file mode 100644 index 9a35b64a0..000000000 Binary files a/priv/static/adminfe/chunk-4e7d.7aace723.css and /dev/null differ diff --git a/priv/static/adminfe/chunk-6b68.0cc00484.css b/priv/static/adminfe/chunk-6b68.0cc00484.css new file mode 100644 index 000000000..7061b3d03 Binary files /dev/null and b/priv/static/adminfe/chunk-6b68.0cc00484.css differ diff --git a/priv/static/adminfe/chunk-4ffb.dd09fe2e.css b/priv/static/adminfe/chunk-6e81.0e80d020.css similarity index 100% rename from priv/static/adminfe/chunk-4ffb.dd09fe2e.css rename to priv/static/adminfe/chunk-6e81.0e80d020.css diff --git a/priv/static/adminfe/chunk-7637.941c4edb.css b/priv/static/adminfe/chunk-7637.941c4edb.css new file mode 100644 index 000000000..be1d183a9 Binary files /dev/null and b/priv/static/adminfe/chunk-7637.941c4edb.css differ diff --git a/priv/static/adminfe/chunk-7e30.f2b9674a.css b/priv/static/adminfe/chunk-7e30.f2b9674a.css new file mode 100644 index 000000000..a4a56712e Binary files /dev/null and b/priv/static/adminfe/chunk-7e30.f2b9674a.css differ diff --git a/priv/static/adminfe/chunk-87b3.2affd602.css b/priv/static/adminfe/chunk-87b3.2affd602.css deleted file mode 100644 index c4fa46d3e..000000000 Binary files a/priv/static/adminfe/chunk-87b3.2affd602.css and /dev/null differ diff --git a/priv/static/adminfe/chunk-970d.f59cca8c.css b/priv/static/adminfe/chunk-970d.f59cca8c.css new file mode 100644 index 000000000..15511f12f Binary files /dev/null and b/priv/static/adminfe/chunk-970d.f59cca8c.css differ diff --git a/priv/static/adminfe/chunk-cf57.4d39576f.css b/priv/static/adminfe/chunk-cf57.4d39576f.css deleted file mode 100644 index 1190aca24..000000000 Binary files a/priv/static/adminfe/chunk-cf57.4d39576f.css and /dev/null differ diff --git a/priv/static/adminfe/chunk-d38a.cabdc22e.css b/priv/static/adminfe/chunk-d38a.cabdc22e.css new file mode 100644 index 000000000..4a2bf472b Binary files /dev/null and b/priv/static/adminfe/chunk-d38a.cabdc22e.css differ diff --git a/priv/static/adminfe/chunk-e458.6c0703cb.css b/priv/static/adminfe/chunk-e458.6c0703cb.css new file mode 100644 index 000000000..6d2a5d996 Binary files /dev/null and b/priv/static/adminfe/chunk-e458.6c0703cb.css differ diff --git a/priv/static/adminfe/chunk-e5cf.cba3ae06.css b/priv/static/adminfe/chunk-e5cf.cba3ae06.css deleted file mode 100644 index a74b42d14..000000000 Binary files a/priv/static/adminfe/chunk-e5cf.cba3ae06.css and /dev/null differ diff --git a/priv/static/adminfe/index.html b/priv/static/adminfe/index.html index 717b0f32d..73e680115 100644 --- a/priv/static/adminfe/index.html +++ b/priv/static/adminfe/index.html @@ -1 +1 @@ -Admin FE
\ No newline at end of file +Admin FE
\ No newline at end of file diff --git a/priv/static/adminfe/static/js/app.0146039c.js b/priv/static/adminfe/static/js/app.0146039c.js new file mode 100644 index 000000000..ab08475ad Binary files /dev/null and b/priv/static/adminfe/static/js/app.0146039c.js differ diff --git a/priv/static/adminfe/static/js/app.0146039c.js.map b/priv/static/adminfe/static/js/app.0146039c.js.map new file mode 100644 index 000000000..178715dc6 Binary files /dev/null and b/priv/static/adminfe/static/js/app.0146039c.js.map differ diff --git a/priv/static/adminfe/static/js/app.d2c3c6b3.js b/priv/static/adminfe/static/js/app.d2c3c6b3.js deleted file mode 100644 index c527207dd..000000000 Binary files a/priv/static/adminfe/static/js/app.d2c3c6b3.js and /dev/null differ diff --git a/priv/static/adminfe/static/js/app.d2c3c6b3.js.map b/priv/static/adminfe/static/js/app.d2c3c6b3.js.map deleted file mode 100644 index 7b2d4dc05..000000000 Binary files a/priv/static/adminfe/static/js/app.d2c3c6b3.js.map and /dev/null differ diff --git a/priv/static/adminfe/static/js/chunk-15fa.34070731.js b/priv/static/adminfe/static/js/chunk-0558.75954137.js similarity index 98% rename from priv/static/adminfe/static/js/chunk-15fa.34070731.js rename to priv/static/adminfe/static/js/chunk-0558.75954137.js index 937908d00..7b29707fa 100644 Binary files a/priv/static/adminfe/static/js/chunk-15fa.34070731.js and b/priv/static/adminfe/static/js/chunk-0558.75954137.js differ diff --git a/priv/static/adminfe/static/js/chunk-15fa.34070731.js.map b/priv/static/adminfe/static/js/chunk-0558.75954137.js.map similarity index 99% rename from priv/static/adminfe/static/js/chunk-15fa.34070731.js.map rename to priv/static/adminfe/static/js/chunk-0558.75954137.js.map index d3830be7c..e9e2affb6 100644 Binary files a/priv/static/adminfe/static/js/chunk-15fa.34070731.js.map and b/priv/static/adminfe/static/js/chunk-0558.75954137.js.map differ diff --git a/priv/static/adminfe/static/js/chunk-0778.b17650df.js b/priv/static/adminfe/static/js/chunk-0778.b17650df.js new file mode 100644 index 000000000..1a174cc1e Binary files /dev/null and b/priv/static/adminfe/static/js/chunk-0778.b17650df.js differ diff --git a/priv/static/adminfe/static/js/chunk-0778.b17650df.js.map b/priv/static/adminfe/static/js/chunk-0778.b17650df.js.map new file mode 100644 index 000000000..1f96c3236 Binary files /dev/null and b/priv/static/adminfe/static/js/chunk-0778.b17650df.js.map differ diff --git a/priv/static/adminfe/static/js/chunk-876c.e4ceccca.js b/priv/static/adminfe/static/js/chunk-0961.ef33e81b.js similarity index 97% rename from priv/static/adminfe/static/js/chunk-876c.e4ceccca.js rename to priv/static/adminfe/static/js/chunk-0961.ef33e81b.js index 841ceb9dc..e090bb93c 100644 Binary files a/priv/static/adminfe/static/js/chunk-876c.e4ceccca.js and b/priv/static/adminfe/static/js/chunk-0961.ef33e81b.js differ diff --git a/priv/static/adminfe/static/js/chunk-876c.e4ceccca.js.map b/priv/static/adminfe/static/js/chunk-0961.ef33e81b.js.map similarity index 99% rename from priv/static/adminfe/static/js/chunk-876c.e4ceccca.js.map rename to priv/static/adminfe/static/js/chunk-0961.ef33e81b.js.map index 88976a4fe..97c6a4b54 100644 Binary files a/priv/static/adminfe/static/js/chunk-876c.e4ceccca.js.map and b/priv/static/adminfe/static/js/chunk-0961.ef33e81b.js.map differ diff --git a/priv/static/adminfe/static/js/chunk-0d8f.a85e3222.js b/priv/static/adminfe/static/js/chunk-0d8f.a85e3222.js deleted file mode 100644 index e3b0ae986..000000000 Binary files a/priv/static/adminfe/static/js/chunk-0d8f.a85e3222.js and /dev/null differ diff --git a/priv/static/adminfe/static/js/chunk-0d8f.a85e3222.js.map b/priv/static/adminfe/static/js/chunk-0d8f.a85e3222.js.map deleted file mode 100644 index cf75f3243..000000000 Binary files a/priv/static/adminfe/static/js/chunk-0d8f.a85e3222.js.map and /dev/null differ diff --git a/priv/static/adminfe/static/js/chunk-136a.142aa42a.js b/priv/static/adminfe/static/js/chunk-136a.142aa42a.js deleted file mode 100644 index 812089b5f..000000000 Binary files a/priv/static/adminfe/static/js/chunk-136a.142aa42a.js and /dev/null differ diff --git a/priv/static/adminfe/static/js/chunk-136a.142aa42a.js.map b/priv/static/adminfe/static/js/chunk-136a.142aa42a.js.map deleted file mode 100644 index f6b4c84aa..000000000 Binary files a/priv/static/adminfe/static/js/chunk-136a.142aa42a.js.map and /dev/null differ diff --git a/priv/static/adminfe/static/js/chunk-22d2.a0cf7976.js b/priv/static/adminfe/static/js/chunk-22d2.a0cf7976.js new file mode 100644 index 000000000..903f553b0 Binary files /dev/null and b/priv/static/adminfe/static/js/chunk-22d2.a0cf7976.js differ diff --git a/priv/static/adminfe/static/js/chunk-22d2.a0cf7976.js.map b/priv/static/adminfe/static/js/chunk-22d2.a0cf7976.js.map new file mode 100644 index 000000000..68735ed26 Binary files /dev/null and b/priv/static/adminfe/static/js/chunk-22d2.a0cf7976.js.map differ diff --git a/priv/static/adminfe/static/js/chunk-3384.b2ebeeca.js b/priv/static/adminfe/static/js/chunk-3384.b2ebeeca.js new file mode 100644 index 000000000..6a161a0c6 Binary files /dev/null and b/priv/static/adminfe/static/js/chunk-3384.b2ebeeca.js differ diff --git a/priv/static/adminfe/static/js/chunk-3384.b2ebeeca.js.map b/priv/static/adminfe/static/js/chunk-3384.b2ebeeca.js.map new file mode 100644 index 000000000..b08db9d6e Binary files /dev/null and b/priv/static/adminfe/static/js/chunk-3384.b2ebeeca.js.map differ diff --git a/priv/static/adminfe/static/js/chunk-46cf.3bd3567a.js b/priv/static/adminfe/static/js/chunk-46cf.3bd3567a.js deleted file mode 100644 index 0795a46b6..000000000 Binary files a/priv/static/adminfe/static/js/chunk-46cf.3bd3567a.js and /dev/null differ diff --git a/priv/static/adminfe/static/js/chunk-46cf.3bd3567a.js.map b/priv/static/adminfe/static/js/chunk-46cf.3bd3567a.js.map deleted file mode 100644 index 9993be4aa..000000000 Binary files a/priv/static/adminfe/static/js/chunk-46cf.3bd3567a.js.map and /dev/null differ diff --git a/priv/static/adminfe/static/js/chunk-46ef.215af110.js b/priv/static/adminfe/static/js/chunk-46ef.215af110.js deleted file mode 100644 index db11c7488..000000000 Binary files a/priv/static/adminfe/static/js/chunk-46ef.215af110.js and /dev/null differ diff --git a/priv/static/adminfe/static/js/chunk-46ef.215af110.js.map b/priv/static/adminfe/static/js/chunk-46ef.215af110.js.map deleted file mode 100644 index 2da3dbec6..000000000 Binary files a/priv/static/adminfe/static/js/chunk-46ef.215af110.js.map and /dev/null differ diff --git a/priv/static/adminfe/static/js/chunk-4e7d.a40ad735.js b/priv/static/adminfe/static/js/chunk-4e7d.a40ad735.js deleted file mode 100644 index ef2379ed9..000000000 Binary files a/priv/static/adminfe/static/js/chunk-4e7d.a40ad735.js and /dev/null differ diff --git a/priv/static/adminfe/static/js/chunk-4e7d.a40ad735.js.map b/priv/static/adminfe/static/js/chunk-4e7d.a40ad735.js.map deleted file mode 100644 index b349f12eb..000000000 Binary files a/priv/static/adminfe/static/js/chunk-4e7d.a40ad735.js.map and /dev/null differ diff --git a/priv/static/adminfe/static/js/chunk-6b68.fbc0f684.js b/priv/static/adminfe/static/js/chunk-6b68.fbc0f684.js new file mode 100644 index 000000000..bfdf936f8 Binary files /dev/null and b/priv/static/adminfe/static/js/chunk-6b68.fbc0f684.js differ diff --git a/priv/static/adminfe/static/js/chunk-6b68.fbc0f684.js.map b/priv/static/adminfe/static/js/chunk-6b68.fbc0f684.js.map new file mode 100644 index 000000000..d1d728b80 Binary files /dev/null and b/priv/static/adminfe/static/js/chunk-6b68.fbc0f684.js.map differ diff --git a/priv/static/adminfe/static/js/chunk-4ffb.0e8f3772.js b/priv/static/adminfe/static/js/chunk-6e81.3733ace2.js similarity index 85% rename from priv/static/adminfe/static/js/chunk-4ffb.0e8f3772.js rename to priv/static/adminfe/static/js/chunk-6e81.3733ace2.js index 5a7aa9f59..c888ce03f 100644 Binary files a/priv/static/adminfe/static/js/chunk-4ffb.0e8f3772.js and b/priv/static/adminfe/static/js/chunk-6e81.3733ace2.js differ diff --git a/priv/static/adminfe/static/js/chunk-4ffb.0e8f3772.js.map b/priv/static/adminfe/static/js/chunk-6e81.3733ace2.js.map similarity index 98% rename from priv/static/adminfe/static/js/chunk-4ffb.0e8f3772.js.map rename to priv/static/adminfe/static/js/chunk-6e81.3733ace2.js.map index 7c020768c..63128dd67 100644 Binary files a/priv/static/adminfe/static/js/chunk-4ffb.0e8f3772.js.map and b/priv/static/adminfe/static/js/chunk-6e81.3733ace2.js.map differ diff --git a/priv/static/adminfe/static/js/chunk-7637.8f5fb36e.js b/priv/static/adminfe/static/js/chunk-7637.8f5fb36e.js new file mode 100644 index 000000000..b38644b98 Binary files /dev/null and b/priv/static/adminfe/static/js/chunk-7637.8f5fb36e.js differ diff --git a/priv/static/adminfe/static/js/chunk-7637.8f5fb36e.js.map b/priv/static/adminfe/static/js/chunk-7637.8f5fb36e.js.map new file mode 100644 index 000000000..ddd53f1cd Binary files /dev/null and b/priv/static/adminfe/static/js/chunk-7637.8f5fb36e.js.map differ diff --git a/priv/static/adminfe/static/js/chunk-7e30.ec42e302.js b/priv/static/adminfe/static/js/chunk-7e30.ec42e302.js new file mode 100644 index 000000000..0a0e1ca34 Binary files /dev/null and b/priv/static/adminfe/static/js/chunk-7e30.ec42e302.js differ diff --git a/priv/static/adminfe/static/js/chunk-7e30.ec42e302.js.map b/priv/static/adminfe/static/js/chunk-7e30.ec42e302.js.map new file mode 100644 index 000000000..bc47158ea Binary files /dev/null and b/priv/static/adminfe/static/js/chunk-7e30.ec42e302.js.map differ diff --git a/priv/static/adminfe/static/js/chunk-87b3.4704cadf.js b/priv/static/adminfe/static/js/chunk-87b3.4704cadf.js deleted file mode 100644 index 9766fd7d2..000000000 Binary files a/priv/static/adminfe/static/js/chunk-87b3.4704cadf.js and /dev/null differ diff --git a/priv/static/adminfe/static/js/chunk-87b3.4704cadf.js.map b/priv/static/adminfe/static/js/chunk-87b3.4704cadf.js.map deleted file mode 100644 index 7472fcd92..000000000 Binary files a/priv/static/adminfe/static/js/chunk-87b3.4704cadf.js.map and /dev/null differ diff --git a/priv/static/adminfe/static/js/chunk-970d.2457e066.js b/priv/static/adminfe/static/js/chunk-970d.2457e066.js new file mode 100644 index 000000000..0f99d835e Binary files /dev/null and b/priv/static/adminfe/static/js/chunk-970d.2457e066.js differ diff --git a/priv/static/adminfe/static/js/chunk-970d.2457e066.js.map b/priv/static/adminfe/static/js/chunk-970d.2457e066.js.map new file mode 100644 index 000000000..6896407b0 Binary files /dev/null and b/priv/static/adminfe/static/js/chunk-970d.2457e066.js.map differ diff --git a/priv/static/adminfe/static/js/chunk-cf57.42b96339.js b/priv/static/adminfe/static/js/chunk-cf57.42b96339.js deleted file mode 100644 index 81122f992..000000000 Binary files a/priv/static/adminfe/static/js/chunk-cf57.42b96339.js and /dev/null differ diff --git a/priv/static/adminfe/static/js/chunk-cf57.42b96339.js.map b/priv/static/adminfe/static/js/chunk-cf57.42b96339.js.map deleted file mode 100644 index 7471835b9..000000000 Binary files a/priv/static/adminfe/static/js/chunk-cf57.42b96339.js.map and /dev/null differ diff --git a/priv/static/adminfe/static/js/chunk-d38a.a851004a.js b/priv/static/adminfe/static/js/chunk-d38a.a851004a.js new file mode 100644 index 000000000..c302af310 Binary files /dev/null and b/priv/static/adminfe/static/js/chunk-d38a.a851004a.js differ diff --git a/priv/static/adminfe/static/js/chunk-d38a.a851004a.js.map b/priv/static/adminfe/static/js/chunk-d38a.a851004a.js.map new file mode 100644 index 000000000..6779f6dc1 Binary files /dev/null and b/priv/static/adminfe/static/js/chunk-d38a.a851004a.js.map differ diff --git a/priv/static/adminfe/static/js/chunk-e458.bb460d81.js b/priv/static/adminfe/static/js/chunk-e458.bb460d81.js new file mode 100644 index 000000000..a08717166 Binary files /dev/null and b/priv/static/adminfe/static/js/chunk-e458.bb460d81.js differ diff --git a/priv/static/adminfe/static/js/chunk-e458.bb460d81.js.map b/priv/static/adminfe/static/js/chunk-e458.bb460d81.js.map new file mode 100644 index 000000000..89f05fb99 Binary files /dev/null and b/priv/static/adminfe/static/js/chunk-e458.bb460d81.js.map differ diff --git a/priv/static/adminfe/static/js/chunk-e5cf.501d7902.js b/priv/static/adminfe/static/js/chunk-e5cf.501d7902.js deleted file mode 100644 index fe5552943..000000000 Binary files a/priv/static/adminfe/static/js/chunk-e5cf.501d7902.js and /dev/null differ diff --git a/priv/static/adminfe/static/js/chunk-e5cf.501d7902.js.map b/priv/static/adminfe/static/js/chunk-e5cf.501d7902.js.map deleted file mode 100644 index 60676bfe7..000000000 Binary files a/priv/static/adminfe/static/js/chunk-e5cf.501d7902.js.map and /dev/null differ diff --git a/priv/static/adminfe/static/js/runtime.b08eb412.js b/priv/static/adminfe/static/js/runtime.b08eb412.js new file mode 100644 index 000000000..2a9a4e0db Binary files /dev/null and b/priv/static/adminfe/static/js/runtime.b08eb412.js differ diff --git a/priv/static/adminfe/static/js/runtime.b08eb412.js.map b/priv/static/adminfe/static/js/runtime.b08eb412.js.map new file mode 100644 index 000000000..62f70ee3e Binary files /dev/null and b/priv/static/adminfe/static/js/runtime.b08eb412.js.map differ diff --git a/priv/static/adminfe/static/js/runtime.fa19e5d1.js b/priv/static/adminfe/static/js/runtime.fa19e5d1.js deleted file mode 100644 index b905e42e1..000000000 Binary files a/priv/static/adminfe/static/js/runtime.fa19e5d1.js and /dev/null differ diff --git a/priv/static/adminfe/static/js/runtime.fa19e5d1.js.map b/priv/static/adminfe/static/js/runtime.fa19e5d1.js.map deleted file mode 100644 index 6a2565556..000000000 Binary files a/priv/static/adminfe/static/js/runtime.fa19e5d1.js.map and /dev/null differ diff --git a/priv/static/font/fontello.1575660578688.eot b/priv/static/font/fontello.1575660578688.eot deleted file mode 100644 index 31a66127f..000000000 Binary files a/priv/static/font/fontello.1575660578688.eot and /dev/null differ diff --git a/priv/static/font/fontello.1575660578688.svg b/priv/static/font/fontello.1575660578688.svg deleted file mode 100644 index 19fa56ba4..000000000 --- a/priv/static/font/fontello.1575660578688.svg +++ /dev/null @@ -1,126 +0,0 @@ - - - -Copyright (C) 2019 by original authors @ fontello.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/priv/static/font/fontello.1575660578688.ttf b/priv/static/font/fontello.1575660578688.ttf deleted file mode 100644 index 7e990495e..000000000 Binary files a/priv/static/font/fontello.1575660578688.ttf and /dev/null differ diff --git a/priv/static/font/fontello.1575660578688.woff b/priv/static/font/fontello.1575660578688.woff deleted file mode 100644 index 239190cba..000000000 Binary files a/priv/static/font/fontello.1575660578688.woff and /dev/null differ diff --git a/priv/static/font/fontello.1575660578688.woff2 b/priv/static/font/fontello.1575660578688.woff2 deleted file mode 100644 index b4d3537c5..000000000 Binary files a/priv/static/font/fontello.1575660578688.woff2 and /dev/null differ diff --git a/priv/static/font/fontello.1575662648966.eot b/priv/static/font/fontello.1575662648966.eot deleted file mode 100644 index a5cb925ad..000000000 Binary files a/priv/static/font/fontello.1575662648966.eot and /dev/null differ diff --git a/priv/static/font/fontello.1575662648966.svg b/priv/static/font/fontello.1575662648966.svg deleted file mode 100644 index 19fa56ba4..000000000 --- a/priv/static/font/fontello.1575662648966.svg +++ /dev/null @@ -1,126 +0,0 @@ - - - -Copyright (C) 2019 by original authors @ fontello.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/priv/static/font/fontello.1575662648966.ttf b/priv/static/font/fontello.1575662648966.ttf deleted file mode 100644 index ec67a3d00..000000000 Binary files a/priv/static/font/fontello.1575662648966.ttf and /dev/null differ diff --git a/priv/static/font/fontello.1575662648966.woff b/priv/static/font/fontello.1575662648966.woff deleted file mode 100644 index feee99308..000000000 Binary files a/priv/static/font/fontello.1575662648966.woff and /dev/null differ diff --git a/priv/static/font/fontello.1575662648966.woff2 b/priv/static/font/fontello.1575662648966.woff2 deleted file mode 100644 index a126c585f..000000000 Binary files a/priv/static/font/fontello.1575662648966.woff2 and /dev/null differ diff --git a/priv/static/fontello.1575660578688.css b/priv/static/fontello.1575660578688.css deleted file mode 100644 index f232f5600..000000000 Binary files a/priv/static/fontello.1575660578688.css and /dev/null differ diff --git a/priv/static/fontello.1575662648966.css b/priv/static/fontello.1575662648966.css deleted file mode 100644 index a47f73e3a..000000000 Binary files a/priv/static/fontello.1575662648966.css and /dev/null differ diff --git a/priv/static/index.html b/priv/static/index.html index 4304bdcbb..ddd4ec4eb 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/packs/arrow-key-navigation.js b/priv/static/packs/arrow-key-navigation.js index 710bab007..6f05ce3e1 100644 Binary files a/priv/static/packs/arrow-key-navigation.js and b/priv/static/packs/arrow-key-navigation.js differ diff --git a/priv/static/packs/base_polyfills.js b/priv/static/packs/base_polyfills.js index 092ef3b0a..04e0f921c 100644 Binary files a/priv/static/packs/base_polyfills.js and b/priv/static/packs/base_polyfills.js differ diff --git a/priv/static/packs/base_polyfills.js.LICENSE b/priv/static/packs/base_polyfills.js.LICENSE.txt similarity index 100% rename from priv/static/packs/base_polyfills.js.LICENSE rename to priv/static/packs/base_polyfills.js.LICENSE.txt diff --git a/priv/static/packs/base_polyfills.js.map b/priv/static/packs/base_polyfills.js.map index 21b2fa20e..a16ae5010 100644 Binary files a/priv/static/packs/base_polyfills.js.map and b/priv/static/packs/base_polyfills.js.map differ diff --git a/priv/static/packs/common.js b/priv/static/packs/common.js index 989a740a4..372dc3b82 100644 Binary files a/priv/static/packs/common.js and b/priv/static/packs/common.js differ diff --git a/priv/static/packs/common.js.LICENSE b/priv/static/packs/common.js.LICENSE.txt similarity index 100% rename from priv/static/packs/common.js.LICENSE rename to priv/static/packs/common.js.LICENSE.txt diff --git a/priv/static/packs/common.js.map b/priv/static/packs/common.js.map index 682fdbcf5..b077d20c4 100644 Binary files a/priv/static/packs/common.js.map and b/priv/static/packs/common.js.map differ diff --git a/priv/static/packs/containers/media_container.js b/priv/static/packs/containers/media_container.js index 6f0042d4c..d55f51c04 100644 Binary files a/priv/static/packs/containers/media_container.js and b/priv/static/packs/containers/media_container.js differ diff --git a/priv/static/packs/containers/media_container.js.LICENSE b/priv/static/packs/containers/media_container.js.LICENSE.txt similarity index 100% rename from priv/static/packs/containers/media_container.js.LICENSE rename to priv/static/packs/containers/media_container.js.LICENSE.txt index e72838f69..1fdf87e4c 100644 --- a/priv/static/packs/containers/media_container.js.LICENSE +++ b/priv/static/packs/containers/media_container.js.LICENSE.txt @@ -4,103 +4,69 @@ http://jedwatson.github.io/classnames */ +/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */ + /*! * wavesurfer.js 3.3.1 (2020-01-14) * https://github.com/katspaugh/wavesurfer.js * @license BSD-3-Clause */ -/*!****************************************!*\ - !*** ./node_modules/debounce/index.js ***! - \****************************************/ - -/*! no static exports found */ - -/*!***********************************!*\ - !*** ./src/drawer.canvasentry.js ***! - \***********************************/ - -/*! ./util/style */ - -/*! ./util/get-id */ - -/*!***********************!*\ - !*** ./src/drawer.js ***! - \***********************/ - -/*! ./util */ - -/*!***********************************!*\ - !*** ./src/drawer.multicanvas.js ***! - \***********************************/ +/*! ./ajax */ /*! ./drawer */ /*! ./drawer.canvasentry */ -/*!**************************************!*\ - !*** ./src/mediaelement-webaudio.js ***! - \**************************************/ +/*! ./drawer.multicanvas */ -/*! ./mediaelement */ +/*! ./extend */ -/*!*****************************!*\ - !*** ./src/mediaelement.js ***! - \*****************************/ +/*! ./fetch */ -/*! ./webaudio */ - -/*!**************************!*\ - !*** ./src/peakcache.js ***! - \**************************/ - -/*!**************************!*\ - !*** ./src/util/ajax.js ***! - \**************************/ - -/*! ./observer */ - -/*!****************************!*\ - !*** ./src/util/extend.js ***! - \****************************/ - -/*!***************************!*\ - !*** ./src/util/fetch.js ***! - \***************************/ - -/*!***************************!*\ - !*** ./src/util/frame.js ***! - \***************************/ - -/*! ./request-animation-frame */ - -/*!****************************!*\ - !*** ./src/util/get-id.js ***! - \****************************/ - -/*!***************************!*\ - !*** ./src/util/index.js ***! - \***************************/ - -/*! ./ajax */ +/*! ./frame */ /*! ./get-id */ /*! ./max */ +/*! ./mediaelement */ + +/*! ./mediaelement-webaudio */ + /*! ./min */ -/*! ./extend */ +/*! ./observer */ -/*! ./style */ - -/*! ./frame */ - -/*! debounce */ +/*! ./peakcache */ /*! ./prevent-click */ -/*! ./fetch */ +/*! ./request-animation-frame */ + +/*! ./style */ + +/*! ./util */ + +/*! ./util/get-id */ + +/*! ./util/style */ + +/*! ./webaudio */ + +/*! debounce */ + +/*! no static exports found */ + +/*!***********************!*\ + !*** ./src/drawer.js ***! + \***********************/ /*!*************************!*\ !*** ./src/util/max.js ***! @@ -110,17 +76,29 @@ !*** ./src/util/min.js ***! \*************************/ -/*!******************************!*\ - !*** ./src/util/observer.js ***! - \******************************/ +/*!*************************!*\ + !*** ./src/webaudio.js ***! + \*************************/ -/*!***********************************!*\ - !*** ./src/util/prevent-click.js ***! - \***********************************/ +/*!**************************!*\ + !*** ./src/peakcache.js ***! + \**************************/ -/*!*********************************************!*\ - !*** ./src/util/request-animation-frame.js ***! - \*********************************************/ +/*!**************************!*\ + !*** ./src/util/ajax.js ***! + \**************************/ + +/*!***************************!*\ + !*** ./src/util/fetch.js ***! + \***************************/ + +/*!***************************!*\ + !*** ./src/util/frame.js ***! + \***************************/ + +/*!***************************!*\ + !*** ./src/util/index.js ***! + \***************************/ /*!***************************!*\ !*** ./src/util/style.js ***! @@ -130,20 +108,42 @@ !*** ./src/wavesurfer.js ***! \***************************/ -/*! ./drawer.multicanvas */ +/*!****************************!*\ + !*** ./src/util/extend.js ***! + \****************************/ -/*! ./peakcache */ +/*!****************************!*\ + !*** ./src/util/get-id.js ***! + \****************************/ -/*! ./mediaelement-webaudio */ +/*!*****************************!*\ + !*** ./src/mediaelement.js ***! + \*****************************/ -/*!*************************!*\ - !*** ./src/webaudio.js ***! - \*************************/ +/*!******************************!*\ + !*** ./src/util/observer.js ***! + \******************************/ -/*! - * escape-html - * Copyright(c) 2012-2013 TJ Holowaychuk - * Copyright(c) 2015 Andreas Lubbe - * Copyright(c) 2015 Tiancheng "Timothy" Gu - * MIT Licensed - */ +/*!***********************************!*\ + !*** ./src/drawer.canvasentry.js ***! + \***********************************/ + +/*!***********************************!*\ + !*** ./src/drawer.multicanvas.js ***! + \***********************************/ + +/*!***********************************!*\ + !*** ./src/util/prevent-click.js ***! + \***********************************/ + +/*!**************************************!*\ + !*** ./src/mediaelement-webaudio.js ***! + \**************************************/ + +/*!****************************************!*\ + !*** ./node_modules/debounce/index.js ***! + \****************************************/ + +/*!*********************************************!*\ + !*** ./src/util/request-animation-frame.js ***! + \*********************************************/ diff --git a/priv/static/packs/containers/media_container.js.map b/priv/static/packs/containers/media_container.js.map index 26ccbae0b..bfe37b1d7 100644 Binary files a/priv/static/packs/containers/media_container.js.map and b/priv/static/packs/containers/media_container.js.map differ diff --git a/priv/static/packs/core/admin.js b/priv/static/packs/core/admin.js index 74b3a4573..000669e56 100644 Binary files a/priv/static/packs/core/admin.js and b/priv/static/packs/core/admin.js differ diff --git a/priv/static/packs/core/admin.js.map b/priv/static/packs/core/admin.js.map index aa80e7ea4..cdae04586 100644 Binary files a/priv/static/packs/core/admin.js.map and b/priv/static/packs/core/admin.js.map differ diff --git a/priv/static/packs/core/auth.js b/priv/static/packs/core/auth.js index 082b72b93..e682011a6 100644 Binary files a/priv/static/packs/core/auth.js and b/priv/static/packs/core/auth.js differ diff --git a/priv/static/packs/core/auth.js.LICENSE b/priv/static/packs/core/auth.js.LICENSE.txt similarity index 100% rename from priv/static/packs/core/auth.js.LICENSE rename to priv/static/packs/core/auth.js.LICENSE.txt diff --git a/priv/static/packs/core/auth.js.map b/priv/static/packs/core/auth.js.map index 57c319165..ddbefa466 100644 Binary files a/priv/static/packs/core/auth.js.map and b/priv/static/packs/core/auth.js.map differ diff --git a/priv/static/packs/core/common.js b/priv/static/packs/core/common.js index a74ef3128..94224c402 100644 Binary files a/priv/static/packs/core/common.js and b/priv/static/packs/core/common.js differ diff --git a/priv/static/packs/core/common.js.map b/priv/static/packs/core/common.js.map index 0a1f6d68d..bd4f5a5e2 100644 Binary files a/priv/static/packs/core/common.js.map and b/priv/static/packs/core/common.js.map differ diff --git a/priv/static/packs/core/embed.js b/priv/static/packs/core/embed.js index c136c2652..6a16743d4 100644 Binary files a/priv/static/packs/core/embed.js and b/priv/static/packs/core/embed.js differ diff --git a/priv/static/packs/core/mailer.js b/priv/static/packs/core/mailer.js index 50a41cefa..503710f5d 100644 Binary files a/priv/static/packs/core/mailer.js and b/priv/static/packs/core/mailer.js differ diff --git a/priv/static/packs/core/modal.js b/priv/static/packs/core/modal.js index 70b7c2498..a610ed274 100644 Binary files a/priv/static/packs/core/modal.js and b/priv/static/packs/core/modal.js differ diff --git a/priv/static/packs/core/modal.js.map b/priv/static/packs/core/modal.js.map index ac406915e..0e77ac03d 100644 Binary files a/priv/static/packs/core/modal.js.map and b/priv/static/packs/core/modal.js.map differ diff --git a/priv/static/packs/core/public.js b/priv/static/packs/core/public.js index fd535b14e..00ba6b774 100644 Binary files a/priv/static/packs/core/public.js and b/priv/static/packs/core/public.js differ diff --git a/priv/static/packs/core/public.js.map b/priv/static/packs/core/public.js.map index abcf37ca0..e89df0775 100644 Binary files a/priv/static/packs/core/public.js.map and b/priv/static/packs/core/public.js.map differ diff --git a/priv/static/packs/core/settings.js b/priv/static/packs/core/settings.js index 22b6c9f12..2c496dfa8 100644 Binary files a/priv/static/packs/core/settings.js and b/priv/static/packs/core/settings.js differ diff --git a/priv/static/packs/core/settings.js.LICENSE b/priv/static/packs/core/settings.js.LICENSE.txt similarity index 100% rename from priv/static/packs/core/settings.js.LICENSE rename to priv/static/packs/core/settings.js.LICENSE.txt diff --git a/priv/static/packs/core/settings.js.map b/priv/static/packs/core/settings.js.map index d61b87412..cd1dd9bf8 100644 Binary files a/priv/static/packs/core/settings.js.map and b/priv/static/packs/core/settings.js.map differ diff --git a/priv/static/packs/emoji_picker.js b/priv/static/packs/emoji_picker.js index 281bc43fd..959ae18e1 100644 Binary files a/priv/static/packs/emoji_picker.js and b/priv/static/packs/emoji_picker.js differ diff --git a/priv/static/packs/extra_polyfills.js b/priv/static/packs/extra_polyfills.js index 614adafe1..3e613035a 100644 Binary files a/priv/static/packs/extra_polyfills.js and b/priv/static/packs/extra_polyfills.js differ diff --git a/priv/static/packs/extra_polyfills.js.LICENSE b/priv/static/packs/extra_polyfills.js.LICENSE.txt similarity index 100% rename from priv/static/packs/extra_polyfills.js.LICENSE rename to priv/static/packs/extra_polyfills.js.LICENSE.txt diff --git a/priv/static/packs/extra_polyfills.js.map b/priv/static/packs/extra_polyfills.js.map index 4d96e42cd..524bdd7e1 100644 Binary files a/priv/static/packs/extra_polyfills.js.map and b/priv/static/packs/extra_polyfills.js.map differ diff --git a/priv/static/packs/features/account_gallery.js b/priv/static/packs/features/account_gallery.js index 19dbf1fec..6afdba220 100644 Binary files a/priv/static/packs/features/account_gallery.js and b/priv/static/packs/features/account_gallery.js differ diff --git a/priv/static/packs/features/account_gallery.js.map b/priv/static/packs/features/account_gallery.js.map index 6e91f9d92..6c6a30c94 100644 Binary files a/priv/static/packs/features/account_gallery.js.map and b/priv/static/packs/features/account_gallery.js.map differ diff --git a/priv/static/packs/features/account_timeline.js b/priv/static/packs/features/account_timeline.js index c8b46f89c..792bf05f0 100644 Binary files a/priv/static/packs/features/account_timeline.js and b/priv/static/packs/features/account_timeline.js differ diff --git a/priv/static/packs/features/account_timeline.js.map b/priv/static/packs/features/account_timeline.js.map index 779a67ad6..8766fb489 100644 Binary files a/priv/static/packs/features/account_timeline.js.map and b/priv/static/packs/features/account_timeline.js.map differ diff --git a/priv/static/packs/features/blocks.js b/priv/static/packs/features/blocks.js index 5aacfc455..b41df4ce4 100644 Binary files a/priv/static/packs/features/blocks.js and b/priv/static/packs/features/blocks.js differ diff --git a/priv/static/packs/features/blocks.js.map b/priv/static/packs/features/blocks.js.map index 57ff7e878..3935acd77 100644 Binary files a/priv/static/packs/features/blocks.js.map and b/priv/static/packs/features/blocks.js.map differ diff --git a/priv/static/packs/features/bookmarked_statuses.js b/priv/static/packs/features/bookmarked_statuses.js index 7a2eb9ded..15ff22331 100644 Binary files a/priv/static/packs/features/bookmarked_statuses.js and b/priv/static/packs/features/bookmarked_statuses.js differ diff --git a/priv/static/packs/features/bookmarked_statuses.js.map b/priv/static/packs/features/bookmarked_statuses.js.map index d6ab7f248..01b5594a6 100644 Binary files a/priv/static/packs/features/bookmarked_statuses.js.map and b/priv/static/packs/features/bookmarked_statuses.js.map differ diff --git a/priv/static/packs/features/community_timeline.js b/priv/static/packs/features/community_timeline.js index 88cb0bd86..69d215446 100644 Binary files a/priv/static/packs/features/community_timeline.js and b/priv/static/packs/features/community_timeline.js differ diff --git a/priv/static/packs/features/community_timeline.js.map b/priv/static/packs/features/community_timeline.js.map index 5f98a8561..66c4b57b4 100644 Binary files a/priv/static/packs/features/community_timeline.js.map and b/priv/static/packs/features/community_timeline.js.map differ diff --git a/priv/static/packs/features/compose.js b/priv/static/packs/features/compose.js index f6ebb3c06..fc3398284 100644 Binary files a/priv/static/packs/features/compose.js and b/priv/static/packs/features/compose.js differ diff --git a/priv/static/packs/features/compose.js.map b/priv/static/packs/features/compose.js.map index 3397e47c7..c0c9b14bd 100644 Binary files a/priv/static/packs/features/compose.js.map and b/priv/static/packs/features/compose.js.map differ diff --git a/priv/static/packs/features/direct_timeline.js b/priv/static/packs/features/direct_timeline.js index 76620a29a..ff330c383 100644 Binary files a/priv/static/packs/features/direct_timeline.js and b/priv/static/packs/features/direct_timeline.js differ diff --git a/priv/static/packs/features/direct_timeline.js.map b/priv/static/packs/features/direct_timeline.js.map index d0ef3c943..fd6845a06 100644 Binary files a/priv/static/packs/features/direct_timeline.js.map and b/priv/static/packs/features/direct_timeline.js.map differ diff --git a/priv/static/packs/features/directory.js b/priv/static/packs/features/directory.js index e02e54d5e..2c0111bc3 100644 Binary files a/priv/static/packs/features/directory.js and b/priv/static/packs/features/directory.js differ diff --git a/priv/static/packs/features/directory.js.map b/priv/static/packs/features/directory.js.map index eb45753be..be594d23d 100644 Binary files a/priv/static/packs/features/directory.js.map and b/priv/static/packs/features/directory.js.map differ diff --git a/priv/static/packs/features/domain_blocks.js b/priv/static/packs/features/domain_blocks.js index efa714703..2e59340de 100644 Binary files a/priv/static/packs/features/domain_blocks.js and b/priv/static/packs/features/domain_blocks.js differ diff --git a/priv/static/packs/features/domain_blocks.js.map b/priv/static/packs/features/domain_blocks.js.map index 2ffb7e1f2..687c9b1bc 100644 Binary files a/priv/static/packs/features/domain_blocks.js.map and b/priv/static/packs/features/domain_blocks.js.map differ diff --git a/priv/static/packs/features/favourited_statuses.js b/priv/static/packs/features/favourited_statuses.js index 747c47ea1..fcc60050f 100644 Binary files a/priv/static/packs/features/favourited_statuses.js and b/priv/static/packs/features/favourited_statuses.js differ diff --git a/priv/static/packs/features/favourited_statuses.js.map b/priv/static/packs/features/favourited_statuses.js.map index 136949ae3..5d1a473bf 100644 Binary files a/priv/static/packs/features/favourited_statuses.js.map and b/priv/static/packs/features/favourited_statuses.js.map differ diff --git a/priv/static/packs/features/favourites.js b/priv/static/packs/features/favourites.js index 605a1ed64..337ad7f6f 100644 Binary files a/priv/static/packs/features/favourites.js and b/priv/static/packs/features/favourites.js differ diff --git a/priv/static/packs/features/favourites.js.map b/priv/static/packs/features/favourites.js.map index d1586da7a..9f9501be2 100644 Binary files a/priv/static/packs/features/favourites.js.map and b/priv/static/packs/features/favourites.js.map differ diff --git a/priv/static/packs/features/follow_requests.js b/priv/static/packs/features/follow_requests.js index c022a1eee..902c02d13 100644 Binary files a/priv/static/packs/features/follow_requests.js and b/priv/static/packs/features/follow_requests.js differ diff --git a/priv/static/packs/features/follow_requests.js.map b/priv/static/packs/features/follow_requests.js.map index dd58baf4d..407dbd78e 100644 Binary files a/priv/static/packs/features/follow_requests.js.map and b/priv/static/packs/features/follow_requests.js.map differ diff --git a/priv/static/packs/features/followers.js b/priv/static/packs/features/followers.js index 67c5826cd..a74070322 100644 Binary files a/priv/static/packs/features/followers.js and b/priv/static/packs/features/followers.js differ diff --git a/priv/static/packs/features/followers.js.map b/priv/static/packs/features/followers.js.map index 44384dbc1..4e5cf5a2e 100644 Binary files a/priv/static/packs/features/followers.js.map and b/priv/static/packs/features/followers.js.map differ diff --git a/priv/static/packs/features/following.js b/priv/static/packs/features/following.js index e7bf1afb6..5189467a3 100644 Binary files a/priv/static/packs/features/following.js and b/priv/static/packs/features/following.js differ diff --git a/priv/static/packs/features/following.js.map b/priv/static/packs/features/following.js.map index 7f94461b6..dc4b4badb 100644 Binary files a/priv/static/packs/features/following.js.map and b/priv/static/packs/features/following.js.map differ diff --git a/priv/static/packs/features/generic_not_found.js b/priv/static/packs/features/generic_not_found.js index 4b6f0f228..7dce6d8e4 100644 Binary files a/priv/static/packs/features/generic_not_found.js and b/priv/static/packs/features/generic_not_found.js differ diff --git a/priv/static/packs/features/getting_started.js b/priv/static/packs/features/getting_started.js index 5b3f3471d..21450c8e1 100644 Binary files a/priv/static/packs/features/getting_started.js and b/priv/static/packs/features/getting_started.js differ diff --git a/priv/static/packs/features/getting_started.js.map b/priv/static/packs/features/getting_started.js.map index f53c06c10..808b2d8ba 100644 Binary files a/priv/static/packs/features/getting_started.js.map and b/priv/static/packs/features/getting_started.js.map differ diff --git a/priv/static/packs/features/glitch/async/directory.js b/priv/static/packs/features/glitch/async/directory.js index db8c2a912..725142be0 100644 Binary files a/priv/static/packs/features/glitch/async/directory.js and b/priv/static/packs/features/glitch/async/directory.js differ diff --git a/priv/static/packs/features/glitch/async/directory.js.map b/priv/static/packs/features/glitch/async/directory.js.map index 218c65282..e8c157894 100644 Binary files a/priv/static/packs/features/glitch/async/directory.js.map and b/priv/static/packs/features/glitch/async/directory.js.map differ diff --git a/priv/static/packs/features/glitch/async/list_adder.js b/priv/static/packs/features/glitch/async/list_adder.js index 1dc96e38c..456fbfb9a 100644 Binary files a/priv/static/packs/features/glitch/async/list_adder.js and b/priv/static/packs/features/glitch/async/list_adder.js differ diff --git a/priv/static/packs/features/glitch/async/list_adder.js.map b/priv/static/packs/features/glitch/async/list_adder.js.map index 956b752d1..cff691afb 100644 Binary files a/priv/static/packs/features/glitch/async/list_adder.js.map and b/priv/static/packs/features/glitch/async/list_adder.js.map differ diff --git a/priv/static/packs/features/glitch/async/search.js b/priv/static/packs/features/glitch/async/search.js index f39dc3db0..2edb95c49 100644 Binary files a/priv/static/packs/features/glitch/async/search.js and b/priv/static/packs/features/glitch/async/search.js differ diff --git a/priv/static/packs/features/hashtag_timeline.js b/priv/static/packs/features/hashtag_timeline.js index f54b99ce8..139ca9b33 100644 Binary files a/priv/static/packs/features/hashtag_timeline.js and b/priv/static/packs/features/hashtag_timeline.js differ diff --git a/priv/static/packs/features/hashtag_timeline.js.map b/priv/static/packs/features/hashtag_timeline.js.map index 909563919..3bd79924b 100644 Binary files a/priv/static/packs/features/hashtag_timeline.js.map and b/priv/static/packs/features/hashtag_timeline.js.map differ diff --git a/priv/static/packs/features/home_timeline.js b/priv/static/packs/features/home_timeline.js index 33237345b..9286699bd 100644 Binary files a/priv/static/packs/features/home_timeline.js and b/priv/static/packs/features/home_timeline.js differ diff --git a/priv/static/packs/features/home_timeline.js.map b/priv/static/packs/features/home_timeline.js.map index 20a487956..156d44782 100644 Binary files a/priv/static/packs/features/home_timeline.js.map and b/priv/static/packs/features/home_timeline.js.map differ diff --git a/priv/static/packs/features/keyboard_shortcuts.js b/priv/static/packs/features/keyboard_shortcuts.js index 484204569..cfeb074bd 100644 Binary files a/priv/static/packs/features/keyboard_shortcuts.js and b/priv/static/packs/features/keyboard_shortcuts.js differ diff --git a/priv/static/packs/features/keyboard_shortcuts.js.map b/priv/static/packs/features/keyboard_shortcuts.js.map index a383cb935..d736f454e 100644 Binary files a/priv/static/packs/features/keyboard_shortcuts.js.map and b/priv/static/packs/features/keyboard_shortcuts.js.map differ diff --git a/priv/static/packs/features/list_adder.js b/priv/static/packs/features/list_adder.js index 84fe9926c..0b4da1969 100644 Binary files a/priv/static/packs/features/list_adder.js and b/priv/static/packs/features/list_adder.js differ diff --git a/priv/static/packs/features/list_adder.js.map b/priv/static/packs/features/list_adder.js.map index f29e5f9f8..f3b671cad 100644 Binary files a/priv/static/packs/features/list_adder.js.map and b/priv/static/packs/features/list_adder.js.map differ diff --git a/priv/static/packs/features/list_editor.js b/priv/static/packs/features/list_editor.js index 76f0f6599..f63276d6c 100644 Binary files a/priv/static/packs/features/list_editor.js and b/priv/static/packs/features/list_editor.js differ diff --git a/priv/static/packs/features/list_editor.js.map b/priv/static/packs/features/list_editor.js.map index c2ab32c4a..ee536303a 100644 Binary files a/priv/static/packs/features/list_editor.js.map and b/priv/static/packs/features/list_editor.js.map differ diff --git a/priv/static/packs/features/list_timeline.js b/priv/static/packs/features/list_timeline.js index 391d15b87..8592d85a1 100644 Binary files a/priv/static/packs/features/list_timeline.js and b/priv/static/packs/features/list_timeline.js differ diff --git a/priv/static/packs/features/list_timeline.js.map b/priv/static/packs/features/list_timeline.js.map index 766670bd2..6e55f0a0c 100644 Binary files a/priv/static/packs/features/list_timeline.js.map and b/priv/static/packs/features/list_timeline.js.map differ diff --git a/priv/static/packs/features/lists.js b/priv/static/packs/features/lists.js index fa26c7031..702c3adcf 100644 Binary files a/priv/static/packs/features/lists.js and b/priv/static/packs/features/lists.js differ diff --git a/priv/static/packs/features/lists.js.map b/priv/static/packs/features/lists.js.map index 2e4811657..58c03a95b 100644 Binary files a/priv/static/packs/features/lists.js.map and b/priv/static/packs/features/lists.js.map differ diff --git a/priv/static/packs/features/mutes.js b/priv/static/packs/features/mutes.js index 3ed714fbd..444d6cd06 100644 Binary files a/priv/static/packs/features/mutes.js and b/priv/static/packs/features/mutes.js differ diff --git a/priv/static/packs/features/mutes.js.map b/priv/static/packs/features/mutes.js.map index 83d73d273..24155f586 100644 Binary files a/priv/static/packs/features/mutes.js.map and b/priv/static/packs/features/mutes.js.map differ diff --git a/priv/static/packs/features/notifications.js b/priv/static/packs/features/notifications.js index 49f828901..419aeeaac 100644 Binary files a/priv/static/packs/features/notifications.js and b/priv/static/packs/features/notifications.js differ diff --git a/priv/static/packs/features/notifications.js.map b/priv/static/packs/features/notifications.js.map index d466060de..80ef6305b 100644 Binary files a/priv/static/packs/features/notifications.js.map and b/priv/static/packs/features/notifications.js.map differ diff --git a/priv/static/packs/features/pinned_statuses.js b/priv/static/packs/features/pinned_statuses.js index b5a366202..1aa2d549a 100644 Binary files a/priv/static/packs/features/pinned_statuses.js and b/priv/static/packs/features/pinned_statuses.js differ diff --git a/priv/static/packs/features/pinned_statuses.js.map b/priv/static/packs/features/pinned_statuses.js.map index 2920e023c..898fcfd27 100644 Binary files a/priv/static/packs/features/pinned_statuses.js.map and b/priv/static/packs/features/pinned_statuses.js.map differ diff --git a/priv/static/packs/features/public_timeline.js b/priv/static/packs/features/public_timeline.js index eb800e73e..a32594de9 100644 Binary files a/priv/static/packs/features/public_timeline.js and b/priv/static/packs/features/public_timeline.js differ diff --git a/priv/static/packs/features/public_timeline.js.map b/priv/static/packs/features/public_timeline.js.map index eb39bab9d..92bd1de46 100644 Binary files a/priv/static/packs/features/public_timeline.js.map and b/priv/static/packs/features/public_timeline.js.map differ diff --git a/priv/static/packs/features/reblogs.js b/priv/static/packs/features/reblogs.js index d8598f305..857ed6a60 100644 Binary files a/priv/static/packs/features/reblogs.js and b/priv/static/packs/features/reblogs.js differ diff --git a/priv/static/packs/features/reblogs.js.map b/priv/static/packs/features/reblogs.js.map index ec193dd4f..211b4a843 100644 Binary files a/priv/static/packs/features/reblogs.js.map and b/priv/static/packs/features/reblogs.js.map differ diff --git a/priv/static/packs/features/search.js b/priv/static/packs/features/search.js index 7efd675f3..64bbc4984 100644 Binary files a/priv/static/packs/features/search.js and b/priv/static/packs/features/search.js differ diff --git a/priv/static/packs/features/status.js b/priv/static/packs/features/status.js index bd8c71d8f..dace442de 100644 Binary files a/priv/static/packs/features/status.js and b/priv/static/packs/features/status.js differ diff --git a/priv/static/packs/features/status.js.map b/priv/static/packs/features/status.js.map index 55d5f08e7..f4688ee17 100644 Binary files a/priv/static/packs/features/status.js.map and b/priv/static/packs/features/status.js.map differ diff --git a/priv/static/packs/flavours/glitch/about.js b/priv/static/packs/flavours/glitch/about.js index b858f1220..19611cdda 100644 Binary files a/priv/static/packs/flavours/glitch/about.js and b/priv/static/packs/flavours/glitch/about.js differ diff --git a/priv/static/packs/flavours/glitch/about.js.LICENSE b/priv/static/packs/flavours/glitch/about.js.LICENSE.txt similarity index 98% rename from priv/static/packs/flavours/glitch/about.js.LICENSE rename to priv/static/packs/flavours/glitch/about.js.LICENSE.txt index 0a0301353..90a9a7678 100644 --- a/priv/static/packs/flavours/glitch/about.js.LICENSE +++ b/priv/static/packs/flavours/glitch/about.js.LICENSE.txt @@ -1,3 +1,9 @@ +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/ + /*! Copyright (c) 2017 Jed Watson. Licensed under the MIT License (MIT), see @@ -12,31 +18,145 @@ * MIT Licensed */ -/* -object-assign -(c) Sindre Sorhus -@license MIT -*/ - -/** @license React v16.12.0 - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. +/*! + * wavesurfer.js 3.3.1 (2020-01-14) + * https://github.com/katspaugh/wavesurfer.js + * @license BSD-3-Clause */ -/** @license React v16.12.0 - * react-dom.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ +/*! ./ajax */ -/** @license React v0.18.0 +/*! ./drawer */ + +/*! ./drawer.canvasentry */ + +/*! ./drawer.multicanvas */ + +/*! ./extend */ + +/*! ./fetch */ + +/*! ./frame */ + +/*! ./get-id */ + +/*! ./max */ + +/*! ./mediaelement */ + +/*! ./mediaelement-webaudio */ + +/*! ./min */ + +/*! ./observer */ + +/*! ./peakcache */ + +/*! ./prevent-click */ + +/*! ./request-animation-frame */ + +/*! ./style */ + +/*! ./util */ + +/*! ./util/get-id */ + +/*! ./util/style */ + +/*! ./webaudio */ + +/*! debounce */ + +/*! https://mths.be/punycode v1.4.1 by @mathias */ + +/*! no static exports found */ + +/*!***********************!*\ + !*** ./src/drawer.js ***! + \***********************/ + +/*!*************************!*\ + !*** ./src/util/max.js ***! + \*************************/ + +/*!*************************!*\ + !*** ./src/util/min.js ***! + \*************************/ + +/*!*************************!*\ + !*** ./src/webaudio.js ***! + \*************************/ + +/*!**************************!*\ + !*** ./src/peakcache.js ***! + \**************************/ + +/*!**************************!*\ + !*** ./src/util/ajax.js ***! + \**************************/ + +/*!***************************!*\ + !*** ./src/util/fetch.js ***! + \***************************/ + +/*!***************************!*\ + !*** ./src/util/frame.js ***! + \***************************/ + +/*!***************************!*\ + !*** ./src/util/index.js ***! + \***************************/ + +/*!***************************!*\ + !*** ./src/util/style.js ***! + \***************************/ + +/*!***************************!*\ + !*** ./src/wavesurfer.js ***! + \***************************/ + +/*!****************************!*\ + !*** ./src/util/extend.js ***! + \****************************/ + +/*!****************************!*\ + !*** ./src/util/get-id.js ***! + \****************************/ + +/*!*****************************!*\ + !*** ./src/mediaelement.js ***! + \*****************************/ + +/*!******************************!*\ + !*** ./src/util/observer.js ***! + \******************************/ + +/*!***********************************!*\ + !*** ./src/drawer.canvasentry.js ***! + \***********************************/ + +/*!***********************************!*\ + !*** ./src/drawer.multicanvas.js ***! + \***********************************/ + +/*!***********************************!*\ + !*** ./src/util/prevent-click.js ***! + \***********************************/ + +/*!**************************************!*\ + !*** ./src/mediaelement-webaudio.js ***! + \**************************************/ + +/*!****************************************!*\ + !*** ./node_modules/debounce/index.js ***! + \****************************************/ + +/*!*********************************************!*\ + !*** ./src/util/request-animation-frame.js ***! + \*********************************************/ + +/** @license React v0.19.0 * scheduler.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. @@ -54,140 +174,20 @@ object-assign * LICENSE file in the root directory of this source tree. */ -/*! - * wavesurfer.js 3.3.1 (2020-01-14) - * https://github.com/katspaugh/wavesurfer.js - * @license BSD-3-Clause +/** @license React v16.13.0 + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. */ -/*!****************************************!*\ - !*** ./node_modules/debounce/index.js ***! - \****************************************/ - -/*! no static exports found */ - -/*!***********************************!*\ - !*** ./src/drawer.canvasentry.js ***! - \***********************************/ - -/*! ./util/style */ - -/*! ./util/get-id */ - -/*!***********************!*\ - !*** ./src/drawer.js ***! - \***********************/ - -/*! ./util */ - -/*!***********************************!*\ - !*** ./src/drawer.multicanvas.js ***! - \***********************************/ - -/*! ./drawer */ - -/*! ./drawer.canvasentry */ - -/*!**************************************!*\ - !*** ./src/mediaelement-webaudio.js ***! - \**************************************/ - -/*! ./mediaelement */ - -/*!*****************************!*\ - !*** ./src/mediaelement.js ***! - \*****************************/ - -/*! ./webaudio */ - -/*!**************************!*\ - !*** ./src/peakcache.js ***! - \**************************/ - -/*!**************************!*\ - !*** ./src/util/ajax.js ***! - \**************************/ - -/*! ./observer */ - -/*!****************************!*\ - !*** ./src/util/extend.js ***! - \****************************/ - -/*!***************************!*\ - !*** ./src/util/fetch.js ***! - \***************************/ - -/*!***************************!*\ - !*** ./src/util/frame.js ***! - \***************************/ - -/*! ./request-animation-frame */ - -/*!****************************!*\ - !*** ./src/util/get-id.js ***! - \****************************/ - -/*!***************************!*\ - !*** ./src/util/index.js ***! - \***************************/ - -/*! ./ajax */ - -/*! ./get-id */ - -/*! ./max */ - -/*! ./min */ - -/*! ./extend */ - -/*! ./style */ - -/*! ./frame */ - -/*! debounce */ - -/*! ./prevent-click */ - -/*! ./fetch */ - -/*!*************************!*\ - !*** ./src/util/max.js ***! - \*************************/ - -/*!*************************!*\ - !*** ./src/util/min.js ***! - \*************************/ - -/*!******************************!*\ - !*** ./src/util/observer.js ***! - \******************************/ - -/*!***********************************!*\ - !*** ./src/util/prevent-click.js ***! - \***********************************/ - -/*!*********************************************!*\ - !*** ./src/util/request-animation-frame.js ***! - \*********************************************/ - -/*!***************************!*\ - !*** ./src/util/style.js ***! - \***************************/ - -/*!***************************!*\ - !*** ./src/wavesurfer.js ***! - \***************************/ - -/*! ./drawer.multicanvas */ - -/*! ./peakcache */ - -/*! ./mediaelement-webaudio */ - -/*!*************************!*\ - !*** ./src/webaudio.js ***! - \*************************/ - -/*! https://mths.be/punycode v1.4.1 by @mathias */ +/** @license React v16.13.1 + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ diff --git a/priv/static/packs/flavours/glitch/about.js.map b/priv/static/packs/flavours/glitch/about.js.map index bc9d0864b..4914692f5 100644 Binary files a/priv/static/packs/flavours/glitch/about.js.map and b/priv/static/packs/flavours/glitch/about.js.map differ diff --git a/priv/static/packs/flavours/glitch/admin.js b/priv/static/packs/flavours/glitch/admin.js index b6d94af56..82d7437f1 100644 Binary files a/priv/static/packs/flavours/glitch/admin.js and b/priv/static/packs/flavours/glitch/admin.js differ diff --git a/priv/static/packs/flavours/glitch/embed.js.LICENSE b/priv/static/packs/flavours/glitch/admin.js.LICENSE.txt similarity index 91% rename from priv/static/packs/flavours/glitch/embed.js.LICENSE rename to priv/static/packs/flavours/glitch/admin.js.LICENSE.txt index 448b94017..2196b2def 100644 --- a/priv/static/packs/flavours/glitch/embed.js.LICENSE +++ b/priv/static/packs/flavours/glitch/admin.js.LICENSE.txt @@ -1,22 +1,10 @@ -/** @license React v16.12.0 - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/ -/** @license React v16.12.0 - * react-dom.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -/** @license React v0.18.0 +/** @license React v0.19.0 * scheduler.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. @@ -34,8 +22,20 @@ * LICENSE file in the root directory of this source tree. */ -/* -object-assign -(c) Sindre Sorhus -@license MIT -*/ +/** @license React v16.13.0 + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** @license React v16.13.1 + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ diff --git a/priv/static/packs/flavours/glitch/admin.js.map b/priv/static/packs/flavours/glitch/admin.js.map index 203550c99..df66cbc6a 100644 Binary files a/priv/static/packs/flavours/glitch/admin.js.map and b/priv/static/packs/flavours/glitch/admin.js.map differ diff --git a/priv/static/packs/flavours/glitch/async/account_gallery.js b/priv/static/packs/flavours/glitch/async/account_gallery.js index 50c23a1cf..a282e6ebc 100644 Binary files a/priv/static/packs/flavours/glitch/async/account_gallery.js and b/priv/static/packs/flavours/glitch/async/account_gallery.js differ diff --git a/priv/static/packs/flavours/glitch/async/account_gallery.js.map b/priv/static/packs/flavours/glitch/async/account_gallery.js.map index 2fcee6618..0aeddd9ef 100644 Binary files a/priv/static/packs/flavours/glitch/async/account_gallery.js.map and b/priv/static/packs/flavours/glitch/async/account_gallery.js.map differ diff --git a/priv/static/packs/flavours/glitch/async/account_timeline.js b/priv/static/packs/flavours/glitch/async/account_timeline.js index ebf40ef53..80863af8d 100644 Binary files a/priv/static/packs/flavours/glitch/async/account_timeline.js and b/priv/static/packs/flavours/glitch/async/account_timeline.js differ diff --git a/priv/static/packs/flavours/glitch/async/account_timeline.js.map b/priv/static/packs/flavours/glitch/async/account_timeline.js.map index 2288ad945..af4549145 100644 Binary files a/priv/static/packs/flavours/glitch/async/account_timeline.js.map and b/priv/static/packs/flavours/glitch/async/account_timeline.js.map differ diff --git a/priv/static/packs/flavours/glitch/async/block_modal.js b/priv/static/packs/flavours/glitch/async/block_modal.js index 7a5c639aa..ff78212cd 100644 Binary files a/priv/static/packs/flavours/glitch/async/block_modal.js and b/priv/static/packs/flavours/glitch/async/block_modal.js differ diff --git a/priv/static/packs/flavours/glitch/async/block_modal.js.map b/priv/static/packs/flavours/glitch/async/block_modal.js.map index 4214332d9..a99478646 100644 Binary files a/priv/static/packs/flavours/glitch/async/block_modal.js.map and b/priv/static/packs/flavours/glitch/async/block_modal.js.map differ diff --git a/priv/static/packs/flavours/glitch/async/blocks.js b/priv/static/packs/flavours/glitch/async/blocks.js index 868309ca2..7287b772f 100644 Binary files a/priv/static/packs/flavours/glitch/async/blocks.js and b/priv/static/packs/flavours/glitch/async/blocks.js differ diff --git a/priv/static/packs/flavours/glitch/async/blocks.js.map b/priv/static/packs/flavours/glitch/async/blocks.js.map index bf2305454..0f1981357 100644 Binary files a/priv/static/packs/flavours/glitch/async/blocks.js.map and b/priv/static/packs/flavours/glitch/async/blocks.js.map differ diff --git a/priv/static/packs/flavours/glitch/async/bookmarked_statuses.js b/priv/static/packs/flavours/glitch/async/bookmarked_statuses.js index 7621abf44..45e9d1417 100644 Binary files a/priv/static/packs/flavours/glitch/async/bookmarked_statuses.js and b/priv/static/packs/flavours/glitch/async/bookmarked_statuses.js differ diff --git a/priv/static/packs/flavours/glitch/async/bookmarked_statuses.js.map b/priv/static/packs/flavours/glitch/async/bookmarked_statuses.js.map index d784d0af2..050a31135 100644 Binary files a/priv/static/packs/flavours/glitch/async/bookmarked_statuses.js.map and b/priv/static/packs/flavours/glitch/async/bookmarked_statuses.js.map differ diff --git a/priv/static/packs/flavours/glitch/async/community_timeline.js b/priv/static/packs/flavours/glitch/async/community_timeline.js index 73d1c24bc..75e21406f 100644 Binary files a/priv/static/packs/flavours/glitch/async/community_timeline.js and b/priv/static/packs/flavours/glitch/async/community_timeline.js differ diff --git a/priv/static/packs/flavours/glitch/async/community_timeline.js.map b/priv/static/packs/flavours/glitch/async/community_timeline.js.map index 690da36f0..da2a24bdf 100644 Binary files a/priv/static/packs/flavours/glitch/async/community_timeline.js.map and b/priv/static/packs/flavours/glitch/async/community_timeline.js.map differ diff --git a/priv/static/packs/flavours/glitch/async/compose.js b/priv/static/packs/flavours/glitch/async/compose.js index 18da703a5..dbbe43090 100644 Binary files a/priv/static/packs/flavours/glitch/async/compose.js and b/priv/static/packs/flavours/glitch/async/compose.js differ diff --git a/priv/static/packs/flavours/glitch/async/compose.js.map b/priv/static/packs/flavours/glitch/async/compose.js.map index 8df71764e..5770307aa 100644 Binary files a/priv/static/packs/flavours/glitch/async/compose.js.map and b/priv/static/packs/flavours/glitch/async/compose.js.map differ diff --git a/priv/static/packs/flavours/glitch/async/direct_timeline.js b/priv/static/packs/flavours/glitch/async/direct_timeline.js index 66e783179..4b19a1383 100644 Binary files a/priv/static/packs/flavours/glitch/async/direct_timeline.js and b/priv/static/packs/flavours/glitch/async/direct_timeline.js differ diff --git a/priv/static/packs/flavours/glitch/async/direct_timeline.js.map b/priv/static/packs/flavours/glitch/async/direct_timeline.js.map index da686195a..83b0d0c28 100644 Binary files a/priv/static/packs/flavours/glitch/async/direct_timeline.js.map and b/priv/static/packs/flavours/glitch/async/direct_timeline.js.map differ diff --git a/priv/static/packs/flavours/glitch/async/domain_blocks.js b/priv/static/packs/flavours/glitch/async/domain_blocks.js index d78750fe9..74fac4c3e 100644 Binary files a/priv/static/packs/flavours/glitch/async/domain_blocks.js and b/priv/static/packs/flavours/glitch/async/domain_blocks.js differ diff --git a/priv/static/packs/flavours/glitch/async/domain_blocks.js.map b/priv/static/packs/flavours/glitch/async/domain_blocks.js.map index a877d0ea5..9534e788e 100644 Binary files a/priv/static/packs/flavours/glitch/async/domain_blocks.js.map and b/priv/static/packs/flavours/glitch/async/domain_blocks.js.map differ diff --git a/priv/static/packs/flavours/glitch/async/embed_modal.js b/priv/static/packs/flavours/glitch/async/embed_modal.js index 770375048..6b2709250 100644 Binary files a/priv/static/packs/flavours/glitch/async/embed_modal.js and b/priv/static/packs/flavours/glitch/async/embed_modal.js differ diff --git a/priv/static/packs/flavours/glitch/async/embed_modal.js.map b/priv/static/packs/flavours/glitch/async/embed_modal.js.map index ea025afc1..848f507d6 100644 Binary files a/priv/static/packs/flavours/glitch/async/embed_modal.js.map and b/priv/static/packs/flavours/glitch/async/embed_modal.js.map differ diff --git a/priv/static/packs/flavours/glitch/async/emoji_picker.js b/priv/static/packs/flavours/glitch/async/emoji_picker.js index 21db597b1..57833a531 100644 Binary files a/priv/static/packs/flavours/glitch/async/emoji_picker.js and b/priv/static/packs/flavours/glitch/async/emoji_picker.js differ diff --git a/priv/static/packs/flavours/glitch/async/favourited_statuses.js b/priv/static/packs/flavours/glitch/async/favourited_statuses.js index aaf19c371..4401228f6 100644 Binary files a/priv/static/packs/flavours/glitch/async/favourited_statuses.js and b/priv/static/packs/flavours/glitch/async/favourited_statuses.js differ diff --git a/priv/static/packs/flavours/glitch/async/favourited_statuses.js.map b/priv/static/packs/flavours/glitch/async/favourited_statuses.js.map index 148d77388..8fbbf1484 100644 Binary files a/priv/static/packs/flavours/glitch/async/favourited_statuses.js.map and b/priv/static/packs/flavours/glitch/async/favourited_statuses.js.map differ diff --git a/priv/static/packs/flavours/glitch/async/favourites.js b/priv/static/packs/flavours/glitch/async/favourites.js index 168e30029..59b9cec75 100644 Binary files a/priv/static/packs/flavours/glitch/async/favourites.js and b/priv/static/packs/flavours/glitch/async/favourites.js differ diff --git a/priv/static/packs/flavours/glitch/async/favourites.js.map b/priv/static/packs/flavours/glitch/async/favourites.js.map index d9b11d0cb..4819f60ec 100644 Binary files a/priv/static/packs/flavours/glitch/async/favourites.js.map and b/priv/static/packs/flavours/glitch/async/favourites.js.map differ diff --git a/priv/static/packs/flavours/glitch/async/follow_requests.js b/priv/static/packs/flavours/glitch/async/follow_requests.js index 40bde6f6f..57ed8204e 100644 Binary files a/priv/static/packs/flavours/glitch/async/follow_requests.js and b/priv/static/packs/flavours/glitch/async/follow_requests.js differ diff --git a/priv/static/packs/flavours/glitch/async/follow_requests.js.map b/priv/static/packs/flavours/glitch/async/follow_requests.js.map index 9b3fcd854..c0a2db075 100644 Binary files a/priv/static/packs/flavours/glitch/async/follow_requests.js.map and b/priv/static/packs/flavours/glitch/async/follow_requests.js.map differ diff --git a/priv/static/packs/flavours/glitch/async/followers.js b/priv/static/packs/flavours/glitch/async/followers.js index de0905eb3..fdb647ef2 100644 Binary files a/priv/static/packs/flavours/glitch/async/followers.js and b/priv/static/packs/flavours/glitch/async/followers.js differ diff --git a/priv/static/packs/flavours/glitch/async/followers.js.map b/priv/static/packs/flavours/glitch/async/followers.js.map index 89f1588f9..cc1470d15 100644 Binary files a/priv/static/packs/flavours/glitch/async/followers.js.map and b/priv/static/packs/flavours/glitch/async/followers.js.map differ diff --git a/priv/static/packs/flavours/glitch/async/following.js b/priv/static/packs/flavours/glitch/async/following.js index 98589dd95..60f78c45c 100644 Binary files a/priv/static/packs/flavours/glitch/async/following.js and b/priv/static/packs/flavours/glitch/async/following.js differ diff --git a/priv/static/packs/flavours/glitch/async/following.js.map b/priv/static/packs/flavours/glitch/async/following.js.map index 66ded9c53..7fff787bb 100644 Binary files a/priv/static/packs/flavours/glitch/async/following.js.map and b/priv/static/packs/flavours/glitch/async/following.js.map differ diff --git a/priv/static/packs/flavours/glitch/async/generic_not_found.js b/priv/static/packs/flavours/glitch/async/generic_not_found.js index 4546a62ef..dca1026b6 100644 Binary files a/priv/static/packs/flavours/glitch/async/generic_not_found.js and b/priv/static/packs/flavours/glitch/async/generic_not_found.js differ diff --git a/priv/static/packs/flavours/glitch/async/getting_started.js b/priv/static/packs/flavours/glitch/async/getting_started.js index cf8a8c738..b1e5d2309 100644 Binary files a/priv/static/packs/flavours/glitch/async/getting_started.js and b/priv/static/packs/flavours/glitch/async/getting_started.js differ diff --git a/priv/static/packs/flavours/glitch/async/getting_started.js.map b/priv/static/packs/flavours/glitch/async/getting_started.js.map index e63299ca7..5c9294fff 100644 Binary files a/priv/static/packs/flavours/glitch/async/getting_started.js.map and b/priv/static/packs/flavours/glitch/async/getting_started.js.map differ diff --git a/priv/static/packs/flavours/glitch/async/getting_started_misc.js b/priv/static/packs/flavours/glitch/async/getting_started_misc.js index 1efef99bf..2b17ff3bc 100644 Binary files a/priv/static/packs/flavours/glitch/async/getting_started_misc.js and b/priv/static/packs/flavours/glitch/async/getting_started_misc.js differ diff --git a/priv/static/packs/flavours/glitch/async/getting_started_misc.js.map b/priv/static/packs/flavours/glitch/async/getting_started_misc.js.map index 6917180c4..ba253da51 100644 Binary files a/priv/static/packs/flavours/glitch/async/getting_started_misc.js.map and b/priv/static/packs/flavours/glitch/async/getting_started_misc.js.map differ diff --git a/priv/static/packs/flavours/glitch/async/hashtag_timeline.js b/priv/static/packs/flavours/glitch/async/hashtag_timeline.js index b997808d8..70c5b1c02 100644 Binary files a/priv/static/packs/flavours/glitch/async/hashtag_timeline.js and b/priv/static/packs/flavours/glitch/async/hashtag_timeline.js differ diff --git a/priv/static/packs/flavours/glitch/async/hashtag_timeline.js.map b/priv/static/packs/flavours/glitch/async/hashtag_timeline.js.map index 602538af9..f495dd459 100644 Binary files a/priv/static/packs/flavours/glitch/async/hashtag_timeline.js.map and b/priv/static/packs/flavours/glitch/async/hashtag_timeline.js.map differ diff --git a/priv/static/packs/flavours/glitch/async/home_timeline.js b/priv/static/packs/flavours/glitch/async/home_timeline.js index 63d338bb1..778f336ed 100644 Binary files a/priv/static/packs/flavours/glitch/async/home_timeline.js and b/priv/static/packs/flavours/glitch/async/home_timeline.js differ diff --git a/priv/static/packs/flavours/glitch/async/home_timeline.js.map b/priv/static/packs/flavours/glitch/async/home_timeline.js.map index c063eebe2..37db6a195 100644 Binary files a/priv/static/packs/flavours/glitch/async/home_timeline.js.map and b/priv/static/packs/flavours/glitch/async/home_timeline.js.map differ diff --git a/priv/static/packs/flavours/glitch/async/keyboard_shortcuts.js b/priv/static/packs/flavours/glitch/async/keyboard_shortcuts.js index 0d59ee5ec..b6037c53e 100644 Binary files a/priv/static/packs/flavours/glitch/async/keyboard_shortcuts.js and b/priv/static/packs/flavours/glitch/async/keyboard_shortcuts.js differ diff --git a/priv/static/packs/flavours/glitch/async/keyboard_shortcuts.js.map b/priv/static/packs/flavours/glitch/async/keyboard_shortcuts.js.map index 18b367cfd..2db9f69d1 100644 Binary files a/priv/static/packs/flavours/glitch/async/keyboard_shortcuts.js.map and b/priv/static/packs/flavours/glitch/async/keyboard_shortcuts.js.map differ diff --git a/priv/static/packs/flavours/glitch/async/list_editor.js b/priv/static/packs/flavours/glitch/async/list_editor.js index 59bcc86a6..d80cb005a 100644 Binary files a/priv/static/packs/flavours/glitch/async/list_editor.js and b/priv/static/packs/flavours/glitch/async/list_editor.js differ diff --git a/priv/static/packs/flavours/glitch/async/list_editor.js.map b/priv/static/packs/flavours/glitch/async/list_editor.js.map index c0b2041fd..32db1fab1 100644 Binary files a/priv/static/packs/flavours/glitch/async/list_editor.js.map and b/priv/static/packs/flavours/glitch/async/list_editor.js.map differ diff --git a/priv/static/packs/flavours/glitch/async/list_timeline.js b/priv/static/packs/flavours/glitch/async/list_timeline.js index 8f1d12946..7be347902 100644 Binary files a/priv/static/packs/flavours/glitch/async/list_timeline.js and b/priv/static/packs/flavours/glitch/async/list_timeline.js differ diff --git a/priv/static/packs/flavours/glitch/async/list_timeline.js.map b/priv/static/packs/flavours/glitch/async/list_timeline.js.map index 109de2301..82e887f76 100644 Binary files a/priv/static/packs/flavours/glitch/async/list_timeline.js.map and b/priv/static/packs/flavours/glitch/async/list_timeline.js.map differ diff --git a/priv/static/packs/flavours/glitch/async/lists.js b/priv/static/packs/flavours/glitch/async/lists.js index 09e9c2090..01359b617 100644 Binary files a/priv/static/packs/flavours/glitch/async/lists.js and b/priv/static/packs/flavours/glitch/async/lists.js differ diff --git a/priv/static/packs/flavours/glitch/async/lists.js.map b/priv/static/packs/flavours/glitch/async/lists.js.map index 6d0e57545..94a638597 100644 Binary files a/priv/static/packs/flavours/glitch/async/lists.js.map and b/priv/static/packs/flavours/glitch/async/lists.js.map differ diff --git a/priv/static/packs/flavours/glitch/async/mute_modal.js b/priv/static/packs/flavours/glitch/async/mute_modal.js index 8799086c4..4563b7c03 100644 Binary files a/priv/static/packs/flavours/glitch/async/mute_modal.js and b/priv/static/packs/flavours/glitch/async/mute_modal.js differ diff --git a/priv/static/packs/flavours/glitch/async/mute_modal.js.map b/priv/static/packs/flavours/glitch/async/mute_modal.js.map index 2cef662e9..b8a427cc5 100644 Binary files a/priv/static/packs/flavours/glitch/async/mute_modal.js.map and b/priv/static/packs/flavours/glitch/async/mute_modal.js.map differ diff --git a/priv/static/packs/flavours/glitch/async/mutes.js b/priv/static/packs/flavours/glitch/async/mutes.js index bff20ce26..561bff711 100644 Binary files a/priv/static/packs/flavours/glitch/async/mutes.js and b/priv/static/packs/flavours/glitch/async/mutes.js differ diff --git a/priv/static/packs/flavours/glitch/async/mutes.js.map b/priv/static/packs/flavours/glitch/async/mutes.js.map index 63d70481c..288221494 100644 Binary files a/priv/static/packs/flavours/glitch/async/mutes.js.map and b/priv/static/packs/flavours/glitch/async/mutes.js.map differ diff --git a/priv/static/packs/flavours/glitch/async/notifications.js b/priv/static/packs/flavours/glitch/async/notifications.js index d894ca4d3..775819241 100644 Binary files a/priv/static/packs/flavours/glitch/async/notifications.js and b/priv/static/packs/flavours/glitch/async/notifications.js differ diff --git a/priv/static/packs/flavours/glitch/async/notifications.js.map b/priv/static/packs/flavours/glitch/async/notifications.js.map index 340227645..7a3ae0be5 100644 Binary files a/priv/static/packs/flavours/glitch/async/notifications.js.map and b/priv/static/packs/flavours/glitch/async/notifications.js.map differ diff --git a/priv/static/packs/flavours/glitch/async/onboarding_modal.js b/priv/static/packs/flavours/glitch/async/onboarding_modal.js index fbe875eed..4e5acb0c0 100644 Binary files a/priv/static/packs/flavours/glitch/async/onboarding_modal.js and b/priv/static/packs/flavours/glitch/async/onboarding_modal.js differ diff --git a/priv/static/packs/flavours/glitch/async/onboarding_modal.js.map b/priv/static/packs/flavours/glitch/async/onboarding_modal.js.map index 9e11b9f3a..4b7124f38 100644 Binary files a/priv/static/packs/flavours/glitch/async/onboarding_modal.js.map and b/priv/static/packs/flavours/glitch/async/onboarding_modal.js.map differ diff --git a/priv/static/packs/flavours/glitch/async/pinned_accounts_editor.js b/priv/static/packs/flavours/glitch/async/pinned_accounts_editor.js index a8dbe836b..799270f5b 100644 Binary files a/priv/static/packs/flavours/glitch/async/pinned_accounts_editor.js and b/priv/static/packs/flavours/glitch/async/pinned_accounts_editor.js differ diff --git a/priv/static/packs/flavours/glitch/async/pinned_accounts_editor.js.map b/priv/static/packs/flavours/glitch/async/pinned_accounts_editor.js.map index a620906cd..c0677599f 100644 Binary files a/priv/static/packs/flavours/glitch/async/pinned_accounts_editor.js.map and b/priv/static/packs/flavours/glitch/async/pinned_accounts_editor.js.map differ diff --git a/priv/static/packs/flavours/glitch/async/pinned_statuses.js b/priv/static/packs/flavours/glitch/async/pinned_statuses.js index 58de4fa48..f2f32ada7 100644 Binary files a/priv/static/packs/flavours/glitch/async/pinned_statuses.js and b/priv/static/packs/flavours/glitch/async/pinned_statuses.js differ diff --git a/priv/static/packs/flavours/glitch/async/pinned_statuses.js.map b/priv/static/packs/flavours/glitch/async/pinned_statuses.js.map index 01838825d..20582528c 100644 Binary files a/priv/static/packs/flavours/glitch/async/pinned_statuses.js.map and b/priv/static/packs/flavours/glitch/async/pinned_statuses.js.map differ diff --git a/priv/static/packs/flavours/glitch/async/public_timeline.js b/priv/static/packs/flavours/glitch/async/public_timeline.js index 8a9678a53..d48e77f7e 100644 Binary files a/priv/static/packs/flavours/glitch/async/public_timeline.js and b/priv/static/packs/flavours/glitch/async/public_timeline.js differ diff --git a/priv/static/packs/flavours/glitch/async/public_timeline.js.map b/priv/static/packs/flavours/glitch/async/public_timeline.js.map index c8fa69daa..77fa4cf1f 100644 Binary files a/priv/static/packs/flavours/glitch/async/public_timeline.js.map and b/priv/static/packs/flavours/glitch/async/public_timeline.js.map differ diff --git a/priv/static/packs/flavours/glitch/async/reblogs.js b/priv/static/packs/flavours/glitch/async/reblogs.js index 3e6c806f4..59ca6d0af 100644 Binary files a/priv/static/packs/flavours/glitch/async/reblogs.js and b/priv/static/packs/flavours/glitch/async/reblogs.js differ diff --git a/priv/static/packs/flavours/glitch/async/reblogs.js.map b/priv/static/packs/flavours/glitch/async/reblogs.js.map index 696da7f09..150c0e1ab 100644 Binary files a/priv/static/packs/flavours/glitch/async/reblogs.js.map and b/priv/static/packs/flavours/glitch/async/reblogs.js.map differ diff --git a/priv/static/packs/flavours/glitch/async/report_modal.js b/priv/static/packs/flavours/glitch/async/report_modal.js index 92601ff8c..d4d94eda1 100644 Binary files a/priv/static/packs/flavours/glitch/async/report_modal.js and b/priv/static/packs/flavours/glitch/async/report_modal.js differ diff --git a/priv/static/packs/flavours/glitch/async/report_modal.js.map b/priv/static/packs/flavours/glitch/async/report_modal.js.map index 40cd55a9c..50065b0ba 100644 Binary files a/priv/static/packs/flavours/glitch/async/report_modal.js.map and b/priv/static/packs/flavours/glitch/async/report_modal.js.map differ diff --git a/priv/static/packs/flavours/glitch/async/settings_modal.js b/priv/static/packs/flavours/glitch/async/settings_modal.js index de55ebceb..7aa1fb5a8 100644 Binary files a/priv/static/packs/flavours/glitch/async/settings_modal.js and b/priv/static/packs/flavours/glitch/async/settings_modal.js differ diff --git a/priv/static/packs/flavours/glitch/async/settings_modal.js.map b/priv/static/packs/flavours/glitch/async/settings_modal.js.map index 70ebb8ebe..eec31e79a 100644 Binary files a/priv/static/packs/flavours/glitch/async/settings_modal.js.map and b/priv/static/packs/flavours/glitch/async/settings_modal.js.map differ diff --git a/priv/static/packs/flavours/glitch/async/status.js b/priv/static/packs/flavours/glitch/async/status.js index f82c91fd6..bfb80c63d 100644 Binary files a/priv/static/packs/flavours/glitch/async/status.js and b/priv/static/packs/flavours/glitch/async/status.js differ diff --git a/priv/static/packs/flavours/glitch/async/status.js.map b/priv/static/packs/flavours/glitch/async/status.js.map index 012698efb..a8c110f98 100644 Binary files a/priv/static/packs/flavours/glitch/async/status.js.map and b/priv/static/packs/flavours/glitch/async/status.js.map differ diff --git a/priv/static/packs/flavours/glitch/common.css b/priv/static/packs/flavours/glitch/common.css index 98f5564e2..f25155ee5 100644 Binary files a/priv/static/packs/flavours/glitch/common.css and b/priv/static/packs/flavours/glitch/common.css differ diff --git a/priv/static/packs/flavours/glitch/common.css.map b/priv/static/packs/flavours/glitch/common.css.map index a44590ee3..2d608b89f 100644 --- a/priv/static/packs/flavours/glitch/common.css.map +++ b/priv/static/packs/flavours/glitch/common.css.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///index.scss","webpack:///./app/javascript/flavours/glitch/styles/reset.scss","webpack:///./app/javascript/flavours/glitch/styles/variables.scss","webpack:///./app/javascript/flavours/glitch/styles/basics.scss","webpack:///./app/javascript/flavours/glitch/styles/containers.scss","webpack:///./app/javascript/flavours/glitch/styles/_mixins.scss","webpack:///./app/javascript/flavours/glitch/styles/lists.scss","webpack:///./app/javascript/flavours/glitch/styles/modal.scss","webpack:///./app/javascript/flavours/glitch/styles/footer.scss","webpack:///./app/javascript/flavours/glitch/styles/compact_header.scss","webpack:///./app/javascript/flavours/glitch/styles/widgets.scss","webpack:///./app/javascript/flavours/glitch/styles/forms.scss","webpack:///./app/javascript/flavours/glitch/styles/accounts.scss","webpack:///./app/javascript/flavours/glitch/styles/statuses.scss","webpack:///./app/javascript/flavours/glitch/styles/components/index.scss","webpack:///./app/javascript/flavours/glitch/styles/components/boost.scss","webpack:///./app/javascript/flavours/glitch/styles/components/accounts.scss","webpack:///./app/javascript/flavours/glitch/styles/components/domains.scss","webpack:///./app/javascript/flavours/glitch/styles/components/status.scss","webpack:///./app/javascript/flavours/glitch/styles/components/modal.scss","webpack:///./app/javascript/flavours/glitch/styles/components/composer.scss","webpack:///./app/javascript/flavours/glitch/styles/components/columns.scss","webpack:///./app/javascript/flavours/glitch/styles/components/regeneration_indicator.scss","webpack:///./app/javascript/flavours/glitch/styles/components/directory.scss","webpack:///./app/javascript/flavours/glitch/styles/components/search.scss","webpack:///","webpack:///./app/javascript/flavours/glitch/styles/components/emoji.scss","webpack:///./app/javascript/flavours/glitch/styles/components/doodle.scss","webpack:///./app/javascript/flavours/glitch/styles/components/drawer.scss","webpack:///./app/javascript/flavours/glitch/styles/components/media.scss","webpack:///./app/javascript/flavours/glitch/styles/components/sensitive.scss","webpack:///./app/javascript/flavours/glitch/styles/components/lists.scss","webpack:///./app/javascript/flavours/glitch/styles/components/emoji_picker.scss","webpack:///./app/javascript/flavours/glitch/styles/components/local_settings.scss","webpack:///./app/javascript/flavours/glitch/styles/components/error_boundary.scss","webpack:///./app/javascript/flavours/glitch/styles/components/single_column.scss","webpack:///./app/javascript/flavours/glitch/styles/polls.scss","webpack:///./app/javascript/flavours/glitch/styles/about.scss","webpack:///./app/javascript/flavours/glitch/styles/tables.scss","webpack:///./app/javascript/flavours/glitch/styles/admin.scss","webpack:///./app/javascript/flavours/glitch/styles/accessibility.scss","webpack:///./app/javascript/flavours/glitch/styles/rtl.scss","webpack:///./app/javascript/flavours/glitch/styles/dashboard.scss"],"names":[],"mappings":"AAAA,2ZCKA,QAaE,UACA,SACA,eACA,aACA,wBACA,+EAIF,aAEE,MAGF,aACE,OAGF,eACE,cAGF,WACE,qDAGF,UAEE,aACA,OAGF,wBACE,iBACA,MAGF,sCACE,qBAGF,UACE,YACA,2BAGF,kBACE,cACA,mBACA,iCAGF,kBACE,kCAGF,kBACE,2BAGF,aACE,gBACA,0BACA,CCtEW,iED6Eb,kBC7Ea,4BDiFb,sBACE,MEtFF,sBACE,mBACA,eACA,iBACA,gBACA,WDVM,kCCYN,6BACA,8BACA,CADA,0BACA,CADA,yBACA,CADA,qBACA,0CACA,wCACA,kBAEA,sIAYE,eAGF,SACE,oCAEA,WACE,iBACA,kBACA,uCAGF,iBACE,WACA,YACA,mCAGF,iBACE,cAIJ,kBD5CW,kBCgDX,iBACE,kBACA,0BAEA,iBACE,YAIJ,kBACE,SACA,iBACA,uBAEA,iBACE,WACA,YACA,gBACA,YAIJ,kBACE,UACA,YAGF,iBACE,kBACA,cDtEoB,mBAPX,WCgFT,YACA,UACA,aACA,uBACA,mBACA,oBAEA,qBACE,YACA,wBAEA,aACE,gBACA,WACA,YACA,kBACA,uBAGF,cACE,iBACA,gBACA,QAMR,mBACE,eACA,cAEA,YACE,6BAKF,YAEE,WACA,mBACA,uBACA,oBACA,yEAKF,gBAEE,+EAKF,WAEE,gBCrJJ,WACE,CACA,kBACA,qCAEA,eALF,UAMI,SACA,kBAIJ,sBACE,qCAEA,gBAHF,kBAII,qBAGF,YACE,uBACA,mBACA,wBAEA,SFrBI,YEuBF,kBACA,sBAGF,YACE,uBACA,mBACA,WF9BE,qBEgCF,UACA,kBACA,iBACA,uBACA,gBACA,eACA,mCAMJ,WACE,CACA,cACA,mBACA,sBACA,qCAEA,kCAPF,UAQI,aACA,aACA,kBAKN,WACE,CACA,YACA,eACA,iBACA,sBACA,CACA,gBACA,CACA,sBACA,qCAEA,gBAZF,UAaI,CACA,eACA,CACA,mBACA,0BAKA,UACqB,sCC3EvB,iBD4EE,6BAEA,UACE,YACA,cACA,SACA,kBACA,iBF5BkB,wBG9DtB,4BACA,uBD8FA,aACE,cF/EsB,wBEiFtB,iCAEA,aACE,gBACA,uBACA,gBACA,8BAIJ,aACE,eACA,iBACA,gBACA,SAIJ,YACE,cACA,8BACA,sBACA,mCACA,CADA,0BACA,mBAEA,eACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,eACE,WACA,qCAGF,QA3BF,UA4BI,qCACA,mBAEA,aACE,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,UAKN,YACE,cACA,8CACA,sBACA,mCACA,CADA,0BACA,mBAEA,eACE,WACA,mBAGF,eACE,WACA,mBAGF,aACE,WACA,mBAGF,eACE,WACA,mBAGF,aACE,WACA,uCAGF,eACE,wBAGF,kBACE,qCAGF,QAxCF,iDAyCI,uCAEA,YACE,aACA,mBACA,uBACA,iCAGF,UACE,uBACA,mBACA,sBAGF,YACE,sCAIJ,QA7DF,UA8DI,qCACA,mBAEA,aACE,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,sCAMJ,eADF,gBAEI,4BAGF,eACE,qCAEA,0BAHF,SAII,yBAIJ,kBACE,mCACA,kBACA,YACA,cACA,aACA,oBACA,uBACA,iBACA,gBACA,qCAEA,uBAZF,cAaI,WACA,MACA,OACA,SACA,gBACA,gBACA,YACA,6BAGF,cACE,eACA,kCAGF,YACE,oBACA,2BACA,iBACA,oCAGF,YACE,oBACA,uBACA,iBACA,mCAGF,YACE,oBACA,yBACA,iBACA,+BAGF,aACE,aACA,mCAEA,aACE,YACA,WACA,kBACA,YACA,UF1UA,qCE6UA,kCARF,WASI,+GAIJ,kBAGE,kCAIJ,YACE,mBACA,eACA,eACA,gBACA,qBACA,cF/UkB,mBEiVlB,kBACA,uHAEA,yBAGE,WFvWA,qCE2WF,0CACE,YACE,qCAKN,kBACE,CACA,oBACA,kBACA,6HAEA,oBAGE,mBACA,sBAON,YACE,cACA,0DACA,sBACA,mCACA,CADA,0BACA,gCAEA,UACE,cACA,gCAGF,UACE,cACA,qCAGF,qBAjBF,0BAkBI,WACA,gCAEA,YACE,kCAKN,iBACE,qCAEA,gCAHF,eAII,sCAKF,4BADF,eAEI,wCAIJ,eACE,mBACA,mCACA,gDAEA,UACE,qIAEA,8BAEE,CAFF,sBAEE,6DAGF,wBFxaoB,8CE6atB,yBACE,gBACA,aACA,kBACA,gBACA,oDAEA,UACE,cACA,kBACA,WACA,YACA,gDACA,MACA,OACA,kDAGF,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,0BACA,qCAGF,6CA3BF,YA4BI,gDAIJ,eACE,6JAEA,iBAEE,qCAEA,4JAJF,eAKI,sCAKN,sCA/DF,eAgEI,gBACA,oDAEA,YACE,+FAGF,eAEE,6CAIJ,iBACE,iBACA,aACA,2BACA,mDAEA,UACE,cACA,mBACA,kBACA,SACA,OACA,QACA,YACA,0BACA,WACA,oDAGF,aACE,CAEA,WACqB,yCCzgB3B,kBD0gBM,cACA,wDAEA,aACE,WACA,YACA,SACA,kBACA,yBACA,mBACA,iBF7dc,wBG9DtB,4BACA,qCD+hBI,2CAvCF,YAwCI,mBACA,0BACA,YACA,mDAEA,YACE,oDAKA,UACqB,sCCtiB7B,CDuiBQ,sBACA,wDAEA,QACE,kBACA,iBFrfY,wBG9DtB,4BACA,2DDsjBQ,mDAbF,YAcI,sCAKN,2CApEF,eAqEI,sCAGF,2CAxEF,cAyEI,8CAIJ,aACE,iBACA,mDAEA,gBACE,mBACA,sDAEA,cACE,iBACA,WFhlBF,gBEklBE,gBACA,mBACA,uBACA,6BACA,4DAEA,aACE,eACA,WF1lBJ,gBE4lBI,gBACA,uBACA,qCAKN,4CA7BF,gBA8BI,aACA,8BACA,mBACA,mDAEA,aACE,iBACA,sDAEA,cACE,iBACA,iBACA,4DAEA,aFlmBY,oDEymBlB,YACE,2BACA,oBACA,YACA,qEAEA,YACE,mBACA,gBACA,qCAGF,oEACE,YACE,6DAIJ,eACE,sBACA,cACA,cF9nBc,aEgoBd,+BACA,eACA,kBACA,kBACA,8DAEA,aACE,uEAGF,cACE,kEAGF,aACE,WACA,kBACA,SACA,OACA,WACA,gCACA,WACA,wBACA,yEAIA,+BACE,UACA,kFAGF,2BF/pBc,wEEqqBd,SACE,wBACA,8DAIJ,oBACE,cACA,2EAGF,cACE,cACA,4EAGF,eACE,eACA,kBACA,WFzsBJ,uBE2sBI,2DAIJ,aACE,WACA,4DAGF,eACE,8CAKN,YACE,eACA,kEAEA,eACE,gBACA,uBACA,cACA,2FAEA,4BACE,yEAGF,YACE,qDAIJ,gBACE,eACA,cF/tBgB,uDEkuBhB,oBACE,cFnuBc,qBEquBd,aACA,gBACA,8DAEA,eACE,WF1vBJ,qCEgwBF,6CAtCF,aAuCI,UACA,4CAKN,yBACE,qCAEA,0CAHF,eAII,wCAIJ,eACE,oCAGF,kBACE,mCACA,kBACA,gBACA,mBACA,qCAEA,mCAPF,eAQI,gBACA,gBACA,8DAGF,QACE,aACA,+DAEA,aACE,sFAGF,uBACE,yEAGF,aF3yBU,8DEizBV,mBACA,WFnzBE,qFEuzBJ,YAEE,eACA,cF1yBkB,2CE8yBpB,gBACE,iCAIJ,YACE,cACA,kDACA,qCAEA,gCALF,aAMI,+CAGF,cACE,iCAIJ,eACE,2BAGF,YACE,eACA,eACA,cACA,+BAEA,qBACE,cACA,YACA,cACA,mBACA,kBACA,qCAEA,8BARF,aASI,sCAGF,8BAZF,cAaI,sCAIJ,0BAvBF,QAwBI,6BACA,+BAEA,UACE,UACA,gBACA,gCACA,0CAEA,eACE,0CAGF,kBFj3BK,+IEo3BH,kBAGE,WEl4BZ,eACE,aAEA,oBACE,aACA,iBAIJ,eACE,cACA,oBAEA,cACE,gBACA,mBACA,eChBJ,k1BACE,aACA,sBACA,aACA,UACA,yBAGF,YACE,OACA,sBACA,yBACA,2BAEA,MACE,iBACA,qCAIJ,gBACE,YACE,yBCrBF,eACE,iBACA,oBACA,eACA,cACA,qCAEA,uBAPF,iBAQI,mBACA,+BAGF,YACE,cACA,0CACA,wCAEA,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,kBACA,6CAEA,aACE,wCAIJ,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,qCAGF,6BAxCF,iCAyCI,+EAEA,aAEE,wCAGF,UACE,wCAGF,aACE,+EAGF,aAEE,wCAGF,UACE,sCAIJ,uCACE,aACE,sCAIJ,4JACE,YAIE,4BAKN,wBACE,gBACA,kBACA,cNhFkB,6BMmFlB,aACE,qBACA,6BAIJ,oBACE,cACA,wGAEA,yBAGE,mCAKF,aACE,YACA,WACA,cACA,aACA,0HAMA,YACE,oBClIR,cACE,iBACA,cPeoB,gBObpB,mBACA,eACA,qBACA,qCAEA,mBATF,iBAUI,oBACA,uBAGF,aACE,qBACA,0BAGF,eACE,cPFoB,wBOMtB,oBACE,mBACA,kBACA,WACA,YACA,cC9BN,kBACE,mCACA,mBAEA,UACE,kBACA,gBACA,0BACA,gBRPI,uBQUJ,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,0BACA,oBAIJ,kBRVW,aQYT,0BACA,eACA,cRPoB,iBQSpB,qBACA,gBACA,8BAEA,UACE,YACA,gBACA,sBAGF,kBACE,iCAEA,eACE,uBAIJ,cACE,SACA,UACA,gBACA,uBACA,oBACA,kBACA,oBACA,cACA,sBAGF,aRtCsB,qBQwCpB,4BAEA,yBACE,qCAKN,aAnEF,YAoEI,uBAIJ,kBACE,oBACA,yBAEA,YACE,yBACA,gBACA,eACA,cR9DoB,+BQkEtB,cACE,0CAEA,eACE,sDAGF,YACE,mBACA,gDAGF,UACE,YACA,0BACA,oCAIJ,YACE,mBAKF,aR3FsB,aQgGxB,YACE,kBACA,mBRzGW,mCQ2GX,qBAGF,YACE,kBACA,0BACA,kBACA,cR3GsB,mBQ6GtB,iBAGF,eACE,eACA,cRlHsB,iBQoHtB,qBACA,gBACA,UACA,oBAEA,YACE,yBACA,gBACA,eACA,cR7HoB,0BQiItB,eACE,CACA,kBACA,mBAGF,oBACE,CACA,mBACA,cR1IoB,qBQ4IpB,mBACA,gBACA,uBACA,0EAEA,yBAGE,uBAMJ,sBACA,kBACA,mBRnKW,mCQqKX,cR7JwB,gBQ+JxB,mBACA,sDAEA,eAEE,CAII,qXADF,eACE,yBAKN,aACE,0BACA,CAMI,wLAGF,oBAGE,mIAEA,yBACE,gCAMR,kBACE,oCAEA,gBACE,cRzMkB,8DQ+MpB,iBACE,eACA,4DAGF,eACE,qBACA,iEAEA,eACE,kBAMR,YACE,CACA,eRlPM,CQoPN,cACA,cRpOsB,mBQsOtB,+BANA,iBACA,CRlPM,kCQgQN,CATA,aAGF,kBACE,CAEA,iBACA,kBACA,cACA,iBAEA,URjQM,eQmQJ,gBACA,gBACA,mBACA,gBAGF,cACE,cR1PoB,qCQ8PtB,aArBF,YAsBI,mBACA,iBAEA,cACE,aAKN,kBR/Qa,kBQiRX,mCACA,iBAEA,qBACE,mBACA,uCAEA,YAEE,mBACA,8BACA,mBR5RO,kBQ8RP,aACA,qBACA,cACA,mCACA,0EAIA,kBAGE,0BAIJ,kBRpSsB,eQsSpB,8BAGF,UACE,eACA,oBAGF,aACE,eACA,gBACA,WRnUE,mBQqUF,gBACA,uBACA,wBAEA,aRzTkB,0BQ6TlB,aACE,gBACA,eACA,eACA,cRjUgB,yFQuUlB,URvVE,+BQ8VJ,aACE,YACA,uDAGF,oBRjVsB,eQuV1B,YACE,yBACA,gCAEA,aACE,WACA,YACA,kBACA,kBACA,kBACA,mBACA,yBACA,4CAEA,SACE,6CAGF,SACE,6CAGF,SACE,iBAKN,UACE,0BAEA,SACE,SACA,wBAGF,eACE,0BAGF,iBACE,yBACA,cRnYoB,gBQqYpB,aACA,sCAEA,eACE,0BAIJ,cACE,sBACA,gCACA,wCAGF,eACE,wBAGF,WACE,kBACA,eACA,gBACA,WR3aI,8BQ8aJ,aACE,cR/ZkB,gBQialB,eACA,0BAIJ,SACE,iCACA,qCAGF,kCACE,YACE,sCAYJ,qIAPF,eAQI,gBACA,gBACA,iBAOJ,gBACE,qCAEA,eAHF,oBAII,uBAGF,sBACE,sCAEA,qBAHF,sBAII,sCAGF,qBAPF,UAQI,sCAGF,qBAXF,WAYI,kCAIJ,iBACE,qCAEA,gCAHF,4BAII,iEAIA,eACE,0DAGF,cACE,iBACA,oEAEA,UACE,YACA,gBACA,yFAGF,gBACE,SACA,mKAIJ,eAGE,gBAON,aRhgBsB,iCQ+fxB,kBAKI,6BAEA,eACE,kBAIJ,cACE,iBACA,wCAMF,oBACE,gBACA,cRnhBsB,4JQshBtB,yBAGE,oBAKN,kBACE,gBACA,eACA,kBACA,yBAEA,aACE,gBACA,aACA,CACA,kBACA,gBACA,uBACA,qBACA,WR9jBI,gCQgkBJ,4FAEA,yBAGE,oCAIJ,eACE,0BAGF,iBACE,gCACA,MC/kBJ,+BACE,gBACA,iBAGF,eACE,aACA,cACA,qBAIA,kBACE,gBACA,4BAEA,QACE,0CAIA,kBACE,qDAEA,eACE,gDAIJ,iBACE,kBACA,sDAEA,iBACE,SACA,OACA,6BAKN,iBACE,gBACA,gDAEA,mBACE,eACA,gBACA,WThDA,cSkDA,WACA,4EAGF,iBAEE,mDAGF,eACE,4CAGF,iBACE,QACA,OACA,qCAGF,aTnDoB,0BSqDlB,gIAEA,oBAGE,0CAIJ,iBACE,CACA,iBACA,mBAKN,YACE,cACA,0BAEA,qBACE,cACA,UACA,cACA,oBAIJ,aTpFsB,sBSuFpB,aTrFsB,yBSyFtB,iBACE,kBACA,gBACA,wBAIJ,aACE,eACA,eACA,qBAGF,kBACE,cTzGoB,iCS4GpB,iBACE,eACA,iBACA,gBACA,gBACA,oBAIJ,kBACE,qBAGF,eACE,CAII,0JADF,eACE,sDAMJ,YACE,4DAEA,mBACE,eACA,WTzJA,gBS2JA,gBACA,cACA,wHAGF,aAEE,sDAIJ,cACE,kBACA,mDAKF,mBACE,eACA,WT/KE,cSiLF,kBACA,qBACA,gBACA,sCAGF,cACE,mCAGF,UACE,sCAIJ,cACE,4CAEA,mBACE,eACA,WTrME,cSuMF,gBACA,gBACA,4CAGF,kBACE,yCAGF,cACE,CADF,cACE,6BAIJ,oBACE,cACA,4BAGF,kBACE,8CAEA,eACE,0BAIJ,YACE,CACA,eACA,oBACA,iCAEA,cACE,kCAGF,qBACE,eACA,cACA,eACA,oCAEA,aACE,2CAGF,eACE,6GAIJ,eAEE,qCAGF,yBA9BF,aA+BI,gBACA,kCAEA,cACE,0JAGF,kBAGE,iDAKN,iBACE,oBACA,eACA,WTnRI,cSqRJ,WACA,2CAKE,mBACE,eACA,WT7RA,qBS+RA,WACA,kBACA,gBACA,kBACA,cACA,0DAGF,iBACE,OACA,QACA,SACA,kDAKN,cACE,aACA,yBACA,kBACA,sJAGF,qBAKE,eACA,WT7TI,cS+TJ,WACA,UACA,oBACA,gBACA,mBACA,sBACA,kBACA,aACA,6RAEA,aACE,CAHF,+OAEA,aACE,CAHF,mQAEA,aACE,CAHF,wQAEA,aACE,CAHF,sNAEA,aACE,8LAGF,eACE,oVAGF,oBACE,iOAGF,oBTpVY,oLSwVZ,iBACE,4WAGF,oBT3UsB,mBS8UpB,6CAKF,aACE,gUAGF,oBAME,8CAGF,aACE,gBACA,cACA,eACA,8BAIJ,UACE,uBAGF,eACE,aACA,oCAEA,YACE,mBACA,qEAIJ,aAGE,WACA,SACA,kBACA,mBT5XsB,WAlBlB,eSiZJ,oBACA,YACA,aACA,yBACA,qBACA,kBACA,sBACA,eACA,gBACA,UACA,mBACA,kBACA,sGAEA,cACE,uFAGF,wBACE,gLAGF,wBAEE,kHAGF,wBT5ZoB,gGSgapB,kBT9aQ,kHSibN,wBACE,sOAGF,wBAEE,qBAKN,uBACE,CADF,oBACE,CADF,eACE,sBACA,eACA,WTjcI,cSmcJ,WACA,UACA,oBACA,gBACA,wXACA,sBACA,kBACA,kBACA,mBACA,YACA,iBAGF,4BACE,oCAIA,iBACE,mCAGF,iBACE,UACA,QACA,CACA,qBACA,eACA,cTjckB,oBSmclB,oBACA,eACA,gBACA,mBACA,gBACA,yCAEA,UACE,cACA,kBACA,MACA,QACA,WACA,UACA,8DACA,4BAKN,iBACE,0CAEA,wBACE,CADF,gBACE,qCAGF,iBACE,MACA,OACA,WACA,YACA,aACA,uBACA,mBACA,8BACA,kBACA,iBACA,gBACA,YACA,8CAEA,iBACE,6HAGE,UT/gBF,aSyhBR,aACE,CACA,kBACA,eACA,gBAGF,kBACE,cTjhBsB,kBSmhBtB,kBACA,mBACA,kBACA,uBAEA,qCACE,iCACA,cTziBY,sBS6iBd,mCACE,+BACA,cT9iBQ,kBSkjBV,oBACE,cTriBoB,qBSuiBpB,wBAEA,UTzjBI,0BS2jBF,kBAIJ,kBACE,4BAGF,SACE,sBACA,cACA,WACA,YACA,aACA,gCACA,mBTjkBS,WATL,eS6kBJ,SACA,8CAEA,QACE,iHAGF,mBAGE,kCAGF,kBACE,uBAIJ,eACE,CAII,oKADF,eACE,0DAKN,eAzEF,eA0EI,eAIJ,eACE,kBACA,gBAEA,aTlmBsB,qBSomBpB,sBAEA,yBACE,YAKN,eACE,mBACA,eACA,eAEA,oBACE,kBACA,cAGF,aTpnBwB,yBSsnBtB,qBACA,gBACA,2DAEA,aAGE,8BAKN,kBAEE,cTtoBsB,oCSyoBtB,cACE,mBACA,kBACA,4CAGF,aT9oBwB,gBSgpBtB,CAII,mUADF,eACE,0DAKN,6BAtBF,eAuBI,cAIJ,YACE,eACA,uBACA,UAGF,aACE,gBTtrBM,YSwrBN,qBACA,mCACA,qBACA,cAEA,aACE,SACA,iBAIJ,kBACE,cTnrBwB,WSqrBxB,sBAEA,aACE,eACA,eAKF,kBACE,sBAEA,eACE,CAII,+JADF,eACE,4CASR,qBACE,8BACA,WTluBI,qCSouBJ,oCACA,kBACA,aACA,mBACA,gDAEA,UT1uBI,0BS4uBF,oLAEA,oBAGE,0DAIJ,eACE,cACA,kBACA,CAII,yYADF,eACE,kEAIJ,eACE,oBAMR,YACE,eACA,mBACA,4DAEA,aAEE,6BAIA,wBACA,cACA,sBAIJ,iBACE,cTzwBsB,0BS4wBtB,iBACE,oBAIJ,eACE,mBACA,uBAEA,cACE,WTtyBI,kBSwyBJ,mBACA,SACA,UACA,4BAGF,aACE,eAIJ,aThzBc,0SS0zBZ,+BACE,aAIJ,kBACE,sBACA,kBACA,aACA,mBACA,kBACA,kBACA,QACA,mCACA,sBAEA,aACE,8BAGF,sBACE,SACA,aACA,eACA,gCACA,oBAGF,aACE,WACA,oBACA,gBACA,eACA,CACA,oBACA,WACA,iCACA,oBAGF,oBTp2Bc,gBSs2BZ,2BAEA,kBTx2BY,gBS02BV,oBAKN,kBACE,6BAEA,wBACE,mBACA,eACA,aACA,4BAGF,kBACE,aACA,OACA,sBACA,cACA,cACA,gCAEA,iBACE,YACA,iBACA,kBACA,UACA,8BAGF,qBACE,qCAIJ,kBACE,gCAGF,wBACE,mCACA,kBACA,kBACA,kBACA,kBACA,sCAEA,wBACE,WACA,cACA,YACA,SACA,kBACA,MACA,UACA,yBAIJ,sBACE,aACA,mBACA,SC36BF,aACE,qBACA,cACA,mCACA,qCAEA,QANF,eAOI,8EAMA,kBACE,YAKN,YACE,kBACA,gBACA,0BACA,gBAEA,aACE,WACA,YACA,SACA,oBACA,CADA,8BACA,CADA,gBACA,0BACA,qCAGF,WAfF,YAgBI,sCAGF,WAnBF,YAoBI,aAIJ,iBACE,aACA,aACA,2BACA,mBACA,mBACA,0BACA,qCAEA,WATF,eAUI,qBAGF,aACE,CAEA,UACqB,sCPpDzB,gBOqDI,wBAEA,UACE,YACA,cACA,SACA,kBACA,iBVLgB,wBG9DtB,4BACA,mBOoEM,oBACA,CADA,8BACA,CADA,gBACA,0BAIJ,gBACE,gBACA,iCAEA,cACE,WV/EA,gBUiFA,gBACA,uBACA,+BAGF,aACE,eACA,cVxEgB,gBU0EhB,gBACA,uBACA,aAMR,cACE,kBACA,gBACA,6GAEA,cAME,WV7GI,gBU+GJ,qBACA,iBACA,qBACA,sBAGF,eVrHM,oBUuHJ,cV9GS,eUgHT,cACA,kBAGF,cACE,uCAGF,wBAEE,cVlHsB,oBUsHxB,UACE,eACA,wBAEA,oBACE,iBACA,oBAIJ,WACE,gBACA,wBAEA,oBACE,gBACA,uBAIJ,cACE,cACA,qCAGF,YA9DF,iBA+DI,mBAEA,YACE,uCAGF,oBAEE,gBAKN,kBVrKa,mCUuKX,cVhKsB,eUkKtB,gBACA,kBACA,aACA,uBACA,mBACA,eACA,kBACA,aACA,gBACA,2BAEA,yBACE,yBAGF,qBACE,gBACA,yCAIJ,oBAEE,gBACA,eACA,kBACA,eACA,iBACA,gBACA,cV9LwB,sCUgMxB,sCACA,6DAEA,aVnNc,sCUqNZ,kCACA,qDAGF,aACE,sCACA,kCACA,0BAIJ,eACE,UACA,wBACA,gBACA,CADA,YACA,CACA,iCACA,CADA,uBACA,CADA,kBACA,eACA,iBACA,6BAEA,YACE,gCACA,yDAGF,qBAEE,aACA,kBACA,gBACA,gBACA,mBACA,uBACA,6BAGF,eACE,YACA,cACA,cV7OsB,0BU+OtB,6BAGF,aACE,cVpPoB,4BUwPtB,aVtPwB,qBUwPtB,qGAEA,yBAGE,oCAIJ,qCACE,iCACA,sCAEA,aVtRY,gBUwRV,0CAGF,aV3RY,wCUgSd,eACE,wCAIJ,UACE,0BAIA,aV3RsB,4BU8RpB,aV7RsB,qBU+RpB,qGAEA,yBAGE,iCAIJ,UVzTI,gBU2TF,wBAIJ,eACE,kBClUJ,kCACE,kBACA,gBACA,mBACA,qCAEA,iBANF,eAOI,gBACA,gBACA,6BAGF,eACE,SACA,gBACA,gFAEA,yBAEE,sCAIJ,UACE,yBAGF,kBXhBW,6GWmBT,sBAGE,CAHF,cAGE,8IAIA,eAGE,0BACA,iJAKF,yBAGE,kLAIA,iBAGE,qCAKN,4GACE,yBAGE,uCAKN,kBACE,qBAIJ,WACE,eACA,mBXzDwB,WAlBlB,oBW8EN,iBACA,YACA,iBACA,SACA,yBAEA,UACE,YACA,sBACA,iBACA,UXxFI,gFW4FN,kBAGE,qNAKA,kBXpFoB,4IW4FpB,kBX1GQ,qCWiHV,wBACE,YACE,0DAOJ,YACE,uCAGF,2BACE,gBACA,uDAEA,SACE,SACA,yDAGF,eACE,yDAKA,cACA,iBACA,mBACA,mFAGF,iBACE,eACA,WACA,WACA,WACA,qMAGF,eAGE,mEASF,cACE,gBACA,qFAGF,aXhJoB,YWkJlB,eACA,WACA,eACA,gBACA,+GAGF,aACE,eACA,CACA,sBACA,eACA,yJAEA,cACE,uEAIJ,WACE,kBACA,WACA,eACA,iDAQF,iBACE,mBACA,yHAEA,iBACE,gBACA,+FAGF,UACE,WC3NR,gCACE,4CACA,cAGF,aACE,eACA,iBACA,cZYwB,SYVxB,uBACA,UACA,eACA,wCAEA,yBAEE,uBAGF,aZFsB,eYIpB,SAIJ,wBACE,YACA,kBACA,sBACA,WZ5BM,eY8BN,qBACA,oBACA,eACA,gBACA,YACA,iBACA,iBACA,gBACA,eACA,kBACA,kBACA,yBACA,qBACA,uBACA,2BACA,qCACA,mBACA,WACA,4CAEA,wBAGE,4BACA,qCACA,sBAGF,eACE,mFAEA,wBZ3DQ,gBY+DN,kBAIJ,wBZrDsB,eYuDpB,yGAGF,cAIE,iBACA,YACA,oBACA,iBACA,4BAGF,aZ5EW,mBAOW,qGYyEpB,wBAGE,8BAIJ,kBZlEsB,2GYqEpB,wBAGE,0BAIJ,cACE,iBACA,YACA,cZ7FoB,oBY+FpB,uBACA,iBACA,kBACA,yBACA,+FAEA,oBAGE,cACA,mCAGF,UACE,uBAIJ,aACE,WACA,cAIJ,oBACE,UACA,cZ3GsB,SY6GtB,kBACA,uBACA,eACA,2BACA,2CACA,2DAEA,aAGE,qCACA,4BACA,2CACA,oBAGF,mCACE,uBAGF,aACE,6BACA,eACA,qBAGF,aZnJwB,gCYuJxB,QACE,uEAGF,mBAGE,uBAGF,aZrJsB,sFYwJpB,aAGE,qCACA,6BAGF,mCACE,gCAGF,aACE,6BACA,8BAGF,aZpLsB,uCYuLpB,aACE,wBAKN,sBACE,0BACA,yBACA,kBACA,YACA,8BAEA,yBACE,mBAKN,aZ9LwB,SYgMtB,kBACA,uBACA,eACA,gBACA,eACA,cACA,iBACA,UACA,2BACA,2CACA,0EAEA,aAGE,qCACA,4BACA,2CACA,yBAGF,mCACE,4BAGF,aACE,6BACA,eACA,0BAGF,aZ3OwB,qCY+OxB,QACE,sFAGF,mBAGE,gBAIJ,iBACE,uBACA,YAGF,WACE,cACA,qBACA,QACA,SACA,kBACA,+BAEA,kBAEE,mBACA,oBACA,kBACA,mBACA,iBAKF,WACE,uCAIJ,MACE,kBACA,CZvSU,sEY8SZ,aZ9SY,uBYkTZ,aZnTc,4DYyTV,4CACE,CADF,oCACE,8DAKF,6CACE,CADF,qCACE,6BAKN,aACE,gBACA,qBACA,mCAEA,UZ7UM,0BY+UJ,eAIJ,aACE,eACA,gBACA,uBACA,mBACA,iBAEA,aACE,wBACA,sBAIA,cACA,gBAKA,yCAPF,WACE,CAEA,gBACA,uBACA,gBACA,mBAWA,CAVA,mBAGF,aACE,CACA,cAKA,8BAIA,yBACE,sBAIJ,SACE,YACA,eACA,iBACA,uBACA,mBACA,gBACA,CAME,sDAGF,cACE,YACA,kBACA,oBACA,qBAKN,eACE,wBAGF,cACE,eAGF,iBACE,WACA,YACA,aACA,mBACA,uBACA,sBACA,6CAEA,cZhX4B,eAEC,0DYiX3B,sBACA,CADA,gCACA,CADA,kBACA,4BAGF,iBACE,qEAGF,YACE,iBAIJ,iBACE,WACA,YACA,aACA,mBACA,uBACA,qBAEA,cZxY4B,eAEC,WYyY3B,YACA,sBACA,CADA,gCACA,CADA,kBACA,WAIJ,oBACE,oBAGF,YACE,kBACA,2BAGF,+BACE,mBACA,SACA,gBAGF,kBZlc0B,cYocxB,kBACA,uCACA,mBAEA,eACE,uBAIJ,iBACE,QACA,SACA,2BACA,4BAEA,UACE,gBACA,2BACA,0BZtdsB,2BY0dxB,WACE,iBACA,uBACA,yBZ7dsB,8BYiexB,QACE,iBACA,uBACA,4BZpesB,6BYwexB,SACE,gBACA,2BACA,2BZ3esB,wBYifxB,cACE,iBACA,cACA,iBACA,sBACA,qBACA,mBZvfsB,cARb,gBYkgBT,uBACA,mBACA,yFAEA,kBZ7fsB,cADA,UYmgBpB,sCAKN,aACE,iBACA,gBACA,QACA,gBACA,aACA,yCAEA,eACE,mBZjhBsB,cYmhBtB,kBACA,mCACA,gBACA,kBACA,sDAGF,OACE,wDAIA,UACE,8CAIJ,cACE,iBACA,cACA,iBACA,sBACA,qBACA,mBZ1iBsB,cARb,gBYqjBT,uBACA,mBACA,oDAEA,SACE,oDAGF,kBZpjBsB,cADA,iBY4jB1B,qBACE,iBAIA,sBACA,cZrjBsB,oBYwjBtB,cACE,gBACA,mBACA,kBACA,mBAGF,cACE,mBACA,iBAIJ,aAEE,gBACA,qCAGF,cACE,SACE,iBAGF,aAEE,CAEA,gBACA,yCAEA,iBACE,uCAGF,kBACE,qDAKF,gBAEE,kBACA,YAKN,qBACE,aACA,mBACA,cACA,gBACA,iBAGF,aACE,cACA,CACA,sBACA,WZnpBM,qBYqpBN,kBACA,eACA,gBACA,gCACA,2BACA,mDACA,qBAEA,eACE,eACA,qCThoBA,6GADF,kBSwoBI,4BACA,kHTpoBJ,kBSmoBI,4BACA,wBAIJ,+BACE,cZ1pBsB,sBY8pBxB,eACE,aACA,2BAGF,aACE,eACA,kBAIJ,iBACE,yBAEA,iBACE,SACA,UACA,mBZ/qBsB,yBYirBtB,gBACA,kBACA,eACA,gBACA,iBACA,WZxsBI,mDY6sBR,oBACE,aAGF,iBACE,kBACA,cACA,iCACA,mCAEA,eACE,yBAGF,YAVF,cAWI,oBAGF,YACE,sBACA,qBAGF,aACE,kBACA,iBACA,yBAKF,uBADF,YAEI,gBAIJ,oBACE,kBACA,eACA,6BACA,SACA,UACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,0CACA,wCACA,iCAGF,QACE,mBACA,WACA,YACA,gBACA,UACA,kBACA,UACA,yBAGF,kBACE,WACA,wBACA,qBAGF,UACE,YACA,UACA,mBACA,yBZzwBW,qCY2wBX,sEAGF,wBACE,4CAGF,wBZzwB0B,+EY6wB1B,wBACE,2BAGF,iBACE,WACA,YACA,MACA,SACA,gBACA,mBACA,cACA,SACA,UACA,6BACA,CAKA,uEAFF,SACE,6BAeA,CAdA,sBAGF,iBACE,WACA,YACA,MACA,SACA,gBACA,mBACA,cACA,WAGA,8CAGF,SACE,qBAGF,iBACE,QACA,SACA,WACA,YACA,yBACA,kBACA,yBACA,sBACA,yBACA,sCACA,4CAGF,SACE,qBZr0BwB,yDYy0B1B,kBZl1Ba,2BYw1Bb,iBACE,gBACA,cAGF,aACE,kBAGF,kBZj2Ba,cYm2BX,oBAEA,aZ71BwB,oBYi2BxB,aZp1BsB,yBYw1BtB,0BACE,CADF,uBACE,CADF,kBACE,kDAKA,sBACA,cACA,wDAEA,kBACE,8DAGF,cACE,sDAGF,aZ12BoB,eY42BlB,0DAEA,aZ92BkB,0BYg3BhB,sDAIJ,oBACE,cZn4BkB,sMYs4BlB,yBAGE,0BAKN,aACE,UACA,mCACA,CADA,0BACA,gBACA,6BAEA,cACE,yBACA,cZt5BkB,aYw5BlB,gBACA,gCACA,sCAGF,oDACE,YACE,uCAIJ,oDACE,YACE,uCAIJ,yBA3BF,YA4BI,yCAGF,eACE,aACA,iDAEA,aZj7BkB,qBYw7BxB,oBACE,kBACA,eACA,iBACA,gBACA,mBZp8BW,gBYs8BX,iBACA,qBAGF,eACE,gBACA,2BAEA,iBACE,aACA,wBAGF,kBACE,yBAGF,oBACE,gBACA,yBACA,yBACA,eAIJ,aZx9BwB,uBY09BtB,CACA,WACA,CADA,+BACA,sBACA,cACA,oBACA,mBACA,cACA,WACA,0CAEA,UZp/BM,4BAkBkB,qCGKtB,yDADF,cSq+BE,sBAGF,aZr/BW,gCYu/BT,sDAEA,aZz/BS,4BASa,mDYw/B1B,uBACE,YACA,6CACA,uBACA,sBACA,WACA,0DAEA,sBACE,0DAIJ,uBACE,2BACA,gDAGF,aZ9/BwB,6BYggCtB,uDAGF,aZ/gC0B,yDYmhC1B,aACE,YAGF,aACE,cZ5gCsB,6BY8gCtB,SACA,kBACA,kBACA,oBACA,SACA,aACA,sBACA,WACA,WACA,qBACA,kBAEA,kBACE,WAIJ,+BACE,oBAGF,gBACE,qEAGF,4BACE,gCAGF,eACE,kBACA,MACA,QACA,YACA,kBACA,YAEA,mBACA,yBACA,eACA,aAEA,wCAEA,UZvhCsB,mBYyhCpB,aACA,sBACA,mBACA,uBACA,mBACA,8BACA,wBACA,gCACA,uCAGF,wBACE,kBACA,WACA,YACA,eACA,cZ1lCoB,yBY4lCpB,aACA,uBACA,mBACA,sCAGF,mBACE,6CAEA,8BACE,WAKN,oBACE,UACA,oBACA,kBACA,cACA,SACA,uBACA,eACA,oBAGF,aZxmCwB,eY0mCtB,gBACA,yBACA,iBACA,kBACA,QACA,SACA,+BACA,yBAEA,aACE,WACA,CACA,0BACA,oBACA,mBACA,4BAIJ,iBACE,QACA,SACA,+BACA,WACA,YACA,sBACA,6BACA,CACA,wBACA,kBACA,2CAGF,2EACE,CADF,mEACE,8CAGF,4EACE,CADF,oEACE,qCAGF,GACE,sBACE,KAGF,2BACE,KAGF,2BACE,KAGF,yBACE,IAGF,wBACE,EArBF,4BAGF,GACE,sBACE,KAGF,2BACE,KAGF,2BACE,KAGF,yBACE,IAGF,wBACE,uCAIJ,GACE,wBACE,KAGF,0BACE,KAGF,2BACE,KAGF,uBACE,IAGF,sBACE,EAtBA,6BAIJ,GACE,wBACE,KAGF,0BACE,KAGF,2BACE,KAGF,uBACE,IAGF,sBACE,mCAIJ,GACE,OACE,SACA,yBACA,KAGF,wBACE,KAGF,UACE,YACA,6BACA,kBACA,UACA,IAGF,UACE,YACA,eACA,UACA,6BACA,EA5BA,yBAIJ,GACE,OACE,SACA,yBACA,KAGF,wBACE,KAGF,UACE,YACA,6BACA,kBACA,UACA,IAGF,UACE,YACA,eACA,UACA,6BACA,kCAIJ,GACE,gBACA,aACA,aAPE,wBAIJ,GACE,gBACA,aACA,6BAGF,KACE,OACA,WACA,YACA,kBACA,YACA,2BAEA,YACE,SACA,QACA,WACA,YACA,mBACA,6BAGF,mBACE,yBAGF,YACE,0BAGF,aACE,uBACA,WACA,YACA,SACA,iCAEA,oBACE,0BACA,kBACA,iBACA,WZnyCE,gBYqyCF,eACA,+LAMA,yBACE,mEAKF,yBACE,iBAMR,aACE,iBACA,mEAGF,aZ9yCwB,qBYkzCtB,mBACA,gBACA,sBACA,gBAGF,aACE,iBACA,uBAGF,eACE,8BAGF,aZj0CwB,eYm0CtB,cACA,gBACA,gBACA,uBAGF,qBACE,sBAGF,WACE,8BAGF,GACE,kBACE,+BACA,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,oBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,kBACE,2CACA,CADA,kCACA,EA3BF,qBAGF,GACE,kBACE,+BACA,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,oBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,kBACE,2CACA,CADA,kCACA,iBAIJ,0DACE,CADF,kDACE,cAGF,kBACE,0BACA,aACA,YACA,uBACA,OACA,UACA,kBACA,MACA,kBACA,WACA,aACA,gBAEA,mBACE,oBAIJ,WACE,aACA,aACA,sBACA,kBACA,YACA,0BAGF,iBACE,MACA,QACA,SACA,OACA,WACA,kBACA,mBZ35CW,kCY65CX,uBAGF,MACE,aACA,mBACA,uBACA,cZ55CwB,eY85CxB,gBACA,0BACA,kBACA,qCAGF,SACE,oBACA,CADA,WACA,cAGF,wBZx6C0B,WY06CxB,kBACA,MACA,OACA,aACA,qBAGF,iBACE,aAGF,iBACE,cACA,aACA,WACA,yBZz7CwB,kBY27CxB,cACA,UACA,WACA,eAGF,YACE,gCACA,CACA,iBACA,qBAEA,kBACE,UACA,uBAGF,aACE,CACA,sBACA,kBACA,uBAGF,oBACE,mBZp9CsB,kBYs9CtB,cACA,eACA,wBACA,wBAGF,aACE,CACA,0BACA,gBACA,8BAEA,eACE,aACA,2BACA,8BACA,uCAGF,cACE,cZ5+CkB,kBY8+ClB,+BAGF,aZj/CoB,eYm/ClB,mBACA,gBACA,uBACA,kBACA,gBACA,YACA,iCAEA,UZ3gDE,qBY6gDA,oHAEA,yBAGE,yCAKN,QACE,uBAIJ,kBACE,6BAEA,kBACE,oDAGF,eACE,6DAGF,UZviDI,oBYgjDN,kBACA,cACA,2BAGF,eACE,UAGF,iBACE,cAEA,WACE,WACA,sCACA,CADA,6BACA,cAGF,cACE,iBACA,cZnjDsB,gBYqjDtB,gBAEA,aZtjDsB,0BYwjDpB,sBAEA,oBACE,gBAIJ,qBACE,4BAKN,GACE,cACA,eACA,WARI,mBAKN,GACE,cACA,eACA,2CC5lDF,u+KACE,uCAEA,u+KACE,CAOA,8MAMF,okBACE,UClBJ,YACE,gCACA,cACA,qBACA,iCAEA,aACE,cACA,cdUoB,gBcRpB,qBACA,eACA,gBAGF,WACE,UACA,yCAEA,8CAEA,WACE,iBACA,mBAKN,YACE,0BAGF,UACE,iBACA,kBACA,kBAGF,gBd0BwB,wBG9DtB,4BACA,kBWqCA,eACA,yBAEA,oBACE,sBACA,iBACA,4BX3CF,eWgDE,CACA,cACA,2DAJF,gBdesB,wBG9DtB,4BACA,CWgDE,iBAQE,CANF,+BXlDF,UWsDI,CACA,qBACA,mCAGF,aACE,kBACA,QACA,SACA,+BACA,WdjEE,6BcmEF,gBACA,eACA,0BAKN,iBACE,WACqB,sCXrErB,+BANA,UW+EuB,sCXzEvB,gEWuEA,gBdhBsB,wBG9DtB,4BW0FE,CXnFF,iCANA,UWoFuB,sCX9EvB,kBWgFE,SACA,QACA,UACA,wBAIJ,WACE,aACA,mBACA,2BAGF,aACE,mBACA,sBAGF,YACE,cd5EsB,6Bc+EtB,eACE,CAII,kMADF,eACE,wBAKN,eACE,cACA,0BACA,yFAEA,oBAGE,sBAKN,4BACE,gCACA,iBACA,gBACA,cACA,aACA,4BAGF,YACE,cACA,iBACA,kBACA,2BAGF,oBACE,gBACA,cACA,8BACA,eACA,oCACA,uCAEA,aACE,kCAGF,+BACE,gCAGF,aACE,yBACA,eACA,cdvJoB,kCc2JtB,aACE,eACA,gBACA,Wd9KI,CcmLA,2NADF,eACE,gCAKN,adtKwB,oBc2K1B,iBACE,mDAEA,aACE,mBACA,gBACA,4BAIJ,UACE,kBACA,wBAGF,gBACE,qBACA,eACA,cd/LsB,eciMtB,kBACA,4BAEA,adlMwB,6BcsMxB,aACE,gBACA,uBACA,iBAIJ,kBACE,6BACA,gCACA,aACA,mBACA,eACA,kDAGF,aAEE,kBACA,yBAGF,kBACE,aACA,2BAGF,adnOwB,ecqOtB,cACA,gBACA,mBACA,kDAIA,kBACE,oDAIA,SX7MF,sBACA,WACA,YACA,gBACA,oBACA,mBHhDW,cAOW,eG4CtB,SACA,+EWuMI,aACE,CXxMN,qEWuMI,aACE,CXxMN,yEWuMI,aACE,CXxMN,0EWuMI,aACE,CXxMN,gEWuMI,aACE,sEAGF,QACE,yLAGF,mBAGE,0DAGF,kBACE,qCAGF,mDArBF,cAsBI,yDAIJ,ad7PoB,iBc+PlB,eACA,4DAGF,gBACE,wDAGF,kBACE,gEAEA,cACE,iNAEA,kBAGE,cACA,gHAKN,adpSoB,0HcySpB,cAEE,gBACA,cd9RkB,kZciSlB,aAGE,gEAIJ,wBACE,iDAGF,ed1UI,kBGkEN,CAEA,eACA,cHrDsB,uCGuDtB,UWqQI,mBd3ToB,oDGwDxB,wBACE,cH1DoB,eG4DpB,gBACA,mBACA,oDAGF,aACE,oDAGF,kBACE,oDAGF,eACE,cHjFS,sDcuUT,WACE,mDAGF,ad3US,kBc6UP,eACA,8HAEA,kBAEE,iCAON,kBACE,mBAIJ,UdvWQ,kBcyWN,cACA,mBACA,sBd5WM,yBc8WN,eACA,gBACA,YACA,kBACA,WACA,yBAEA,SACE,6BAIJ,YACE,eACA,gBACA,wBAGF,WACE,sBACA,cACA,kBACA,kBACA,gBACA,WACA,+BAEA,iBACE,QACA,SACA,+BACA,eACA,sDAIJ,kBAEE,gCACA,eACA,aACA,cACA,oEAEA,kBACE,SACA,SACA,6HAGF,aAEE,cACA,cdlZoB,ecoZpB,eACA,gBACA,kBACA,qBACA,kBACA,yJAEA,ad1ZsB,qWc6ZpB,aAEE,WACA,kBACA,SACA,SACA,QACA,SACA,2BACA,CAEA,4CACA,CADA,kBACA,CADA,wBACA,iLAGF,WACE,6CACA,8GAKN,kBACE,gCACA,qSAKI,YACE,iSAGF,4CACE,sBAQR,sBACA,mBACA,6BACA,gCACA,+BAEA,iBACE,iBACA,cdlcoB,CcqcpB,eACA,eACA,oCAEA,aACE,gBACA,uBACA,oCAIJ,UACE,kBACA,uDAGF,iBACE,qDAGF,eACE,2BAIJ,ad5ewB,ec8etB,gBACA,gBACA,kBACA,qBACA,6BAEA,kBACE,wCAEA,eACE,6BAIJ,aACE,0BACA,mCAEA,oBACE,kBAKN,eACE,2BAEA,UACE,8FAEA,8BAEE,CAFF,sBAEE,wBAIJ,iBACE,SACA,UACA,yBAGF,eACE,aACA,kBACA,mBACA,6BAEA,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,uBAIJ,iBACE,mBACA,YACA,gCACA,+BAEA,aACE,cACA,WACA,iBACA,gDAEA,kBACE,yBACA,wBAKN,YACE,uBACA,gBACA,iBACA,iCAEA,YACE,mBACA,iBACA,gBACA,8CAEA,wBACE,kBACA,uBACA,YACA,yCAGF,YACE,8BAIJ,WACE,4CAEA,kBACE,wCAGF,UACE,YACA,iCAGF,cACE,iBACA,WdhnBA,gBcknBA,gBACA,mBACA,uBACA,uCAEA,aACE,eACA,cdzmBc,gBc2mBd,gBACA,uBACA,gCAKN,aACE,uBAIJ,eACE,cACA,iDAGE,qBACA,Wd7oBE,gDcipBJ,QACE,6BACA,kDAEA,aACE,yEAGF,uBACE,4DAGF,ad5pBU,yBckqBd,cACE,gCAEA,cACE,cdvpBkB,ecypBlB,kCAEA,oBACE,cd5pBgB,qBc8pBhB,iBACA,gBACA,yCAEA,eACE,WdnrBF,SeFR,YACE,gCACA,8BAEA,aACE,cACA,WfJI,qBeMJ,eACA,gBACA,kBAIJ,YACE,iBAGF,WACE,aACA,mBACA,mCCrBF,GACE,sBACE,KAGF,2BACE,KAGF,4BACE,KAGF,2BACE,IAGF,yBACE,EDGF,0BCrBF,GACE,sBACE,KAGF,2BACE,KAGF,4BACE,KAGF,2BACE,IAGF,yBACE,qCAIJ,GACE,yBACE,KAGF,yBACE,KAGF,4BACE,KAGF,wBACE,IAGF,sBACE,EAtBA,2BAIJ,GACE,yBACE,KAGF,yBACE,KAGF,4BACE,KAGF,wBACE,IAGF,sBACE,gCAIJ,cACE,kBAGF,iBACE,cACA,eACA,iBACA,qBACA,gBACA,iBACA,gBACA,wBAEA,SACE,4BAGF,UACE,YACA,gBACA,sBAGF,cACE,iBACA,sBACA,CADA,gCACA,CADA,kBACA,qEAGF,kBACE,qBACA,sGAEA,eACE,qEAIJ,eAEE,qJAEA,kBAEE,mXAGF,eACE,mBACA,qJAGF,eACE,gBACA,2EAGF,eACE,+NAGF,eACE,2FAGF,iBACE,8BACA,chB9FkB,mBgBgGlB,qHAEA,eACE,2JAIJ,eACE,mJAGF,iBACE,6EAGF,iBACE,eACA,6EAGF,iBACE,qBACA,qJAGF,eACE,6JAEA,QACE,2EAIJ,oBACE,2EAGF,uBACE,oBAIJ,ahB9Ic,qBgBgJZ,0BAEA,yBACE,8BAEA,aACE,kCAKF,oBACE,uCAEA,yBACE,wBAKN,ahBlJoB,4CgBuJtB,YACE,8EAEA,aACE,mCAIJ,aACE,oDAEA,ahB5LQ,egB8LN,iDAIJ,kBACE,uDAEA,kBACE,qBACA,gCAKN,oBACE,kBACA,mBACA,YACA,chB3MW,gBgB6MX,eACA,cACA,yBACA,oBACA,eACA,sBACA,sCAEA,kBACE,qBACA,+DAGF,oBACE,iBACA,sBACA,kBACA,eACA,oBACA,2GAKF,oBAGE,4BAIJ,ahBvNwB,SgByNtB,kBACA,kBACA,oBACA,SACA,aACA,sBACA,WACA,WACA,gCACA,+BAGF,UACE,kBACA,mDAGF,iBAEE,gCAGA,qEAEA,eACE,kBAKF,SACE,mBACA,kDAEA,kBACE,wDAEA,sBACE,iFAIJ,kBAEE,SAKN,iBACE,kBACA,YACA,gCACA,eACA,UAaA,mCACA,CADA,0BACA,wDAZA,QAPF,kBAUI,0BAGF,GACE,aACA,WALA,gBAGF,GACE,aACA,uDAMF,cAEE,kCAGF,kBACE,4BACA,sCAIA,ahB1SoB,CArBX,uEgBwUP,ahBxUO,kCgB4UP,ahBvTkB,gCgB4TpB,ahBjVS,kCgBoVP,ahB3UoB,gEgB+UpB,UhBjWE,mBAgBgB,sEgBqVhB,kBACE,mBAMR,uBACE,sBACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,yCAEA,aACE,kBACA,OACA,QACA,MACA,SACA,6FACA,oBACA,WACA,2DAGF,oBACE,oCAGF,WACE,gBACA,uBACA,cACA,0CAEA,UACE,kBACA,MACA,gBACA,6DACA,oBACA,4CAGF,oBACE,gDAGJ,oDACE,mEAEF,oDACE,0CAGF,eACE,6DAGF,kBACE,gCAIJ,mBACE,+CAKF,sBACE,qEAEA,aACE,wBAKN,oBACE,YACA,ChBvZsB,cgByZtB,iBACA,mBACA,CACA,sBACA,8CANA,ahBvZsB,CgB2ZtB,eAOA,8CAGF,aACE,eACA,eAGF,YACE,8BACA,eACA,oBAEA,sBACE,gBACA,2CAGF,oBACE,sBAIJ,YACE,mBACA,WACA,chB5bsB,iIgB+btB,gBAGE,kBACA,0EAGF,yBACE,yEAMA,0CACE,CADF,kCACE,2EAKF,2CACE,CADF,mCACE,wBAKN,YACE,mBACA,2BACA,mBAGF,+BACE,aACA,6CAEA,uBACE,OACA,4DAEA,eACE,8DAGF,SACE,mBACA,qHAGF,cAEE,gBACA,4EAGF,cACE,0BAKN,kBACE,aACA,cACA,uBACA,aACA,kBAGF,gBACE,mBACA,iBACA,chBvgBsB,CgBygBtB,iBACA,eACA,kBACA,+CAEA,ahB9gBsB,uBgBkhBtB,aACE,gBACA,uBACA,qBAIJ,kBACE,aACA,eACA,8BAEA,mBACE,kBACA,mBACA,yDAEA,gBACE,qCAGF,oBACE,WACA,eACA,gBACA,chB3iBkB,4BgBijBxB,iBACE,8BAGF,cACE,cACA,uCAGF,aACE,aACA,mBACA,uBACA,kBACA,kBAGF,kBACE,kBACA,wBAEA,YACE,eACA,8BACA,uBACA,uFAEA,SAEE,mCAIJ,cACE,iBACA,6CAEA,UACE,YACA,gBACA,+DAIJ,cAEE,wBAIJ,eACE,chBpmBsB,egBsmBtB,iBACA,8BAGF,kBACE,6BACA,gCACA,aACA,mBACA,eACA,wBAGF,aACE,qBACA,uDAGF,oBAEE,gBACA,eACA,gBACA,6JAGF,oBAME,4DAKA,UhBzqBM,kBgB+qBN,UACE,iKAQF,yBACE,+BAIJ,aACE,gBACA,uBACA,0DAGF,aAEE,sCAGF,kBACE,gCAGF,ahB3rB0B,cgB6rBxB,iBACA,mBACA,gBACA,2EAEA,aAEE,uBACA,gBACA,uCAGF,cACE,WhB3tBI,kCgBguBR,UACE,kBACA,iBAGF,SACE,kBACA,YACA,WACA,ChB3sBsB,8IgBstBtB,ahBttBsB,wBgB0tBtB,UACE,wCAGF,kBhB9tBsB,cArBX,8CgBuvBT,kBACE,qBACA,+DAOJ,yBACE,cAIJ,YACE,eACA,yBACA,kBACA,chBpvBsB,gBgBsvBtB,qBACA,gBACA,uBAEA,QACE,OACA,kBACA,QACA,MAIA,iDAHA,YACA,uBACA,mBAUE,CATF,0BAEA,yBACE,kBACA,iBACA,cAIA,sDAGF,cAEE,chB7xBoB,uBgB+xBpB,SACA,cACA,qBACA,eACA,iBACA,sMAEA,UhBvzBE,yBgB8zBJ,cACE,kBACA,YACA,+DAGF,aACE,eAKN,cACE,qBAEA,kBACE,oBAIJ,cACE,cACA,qBACA,WACE,YACA,SACA,2BAIF,UACE,YACA,qBAIJ,aACE,gBACA,kBACA,chBr1BsB,gBgBu1BtB,uBACA,mBACA,qBACA,uBAGF,aACE,gBACA,2BACA,2BAGF,ahBn2BwB,oBgBu2BxB,aACE,eACA,eACA,gBACA,uBACA,mBACA,qBAGF,cACE,mBACA,kBACA,yBAEA,cACE,kBACA,yBACA,QACA,SACA,+BACA,yBAIJ,aACE,6CAEA,UACE,mDAGF,yBACE,6CAGF,mBACE,sBAIJ,oBACE,kCAEA,QACE,4CAIA,oBACA,0CAGF,kBACE,0CAGF,aACE,6BAIJ,wBACE,2BAGF,yBACE,cACA,SACA,WACA,YACA,oBACA,CADA,8BACA,CADA,gBACA,sBACA,wBACA,kBAGF,YACE,eACA,yBACA,kBACA,gBACA,gBACA,wBAEA,aACE,chB96BoB,iBgBg7BpB,eACA,+BACA,aACA,sBACA,mBACA,uBACA,eACA,4BAEA,aACE,wBAIJ,eACE,CACA,qBACA,aACA,sBACA,uBACA,2BAEA,aACE,cACA,0BAGF,oBACE,chB58BkB,gBgB88BlB,gCAEA,yBACE,0BAKN,QACE,eACA,iDAEA,SACE,cACA,8BAGF,ahB/9BoB,oCgBq+BxB,cACE,cACA,SACA,uBACA,UACA,kBACA,oBACA,oFAEA,yBAEE,6BChhCJ,kBACE,aAGF,iBACE,8BACA,oBACA,aACA,sBAGF,cACE,MACA,OACA,QACA,SACA,0BACA,wBAGF,cACE,MACA,OACA,WACA,YACA,aACA,sBACA,mBACA,uBACA,2BACA,aACA,oBACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,oBAGF,mBACE,aACA,aACA,6CAGF,kBjBvB0B,cARb,kBiBoCX,gBACA,aACA,sBACA,0BAGF,WACE,WACA,gBACA,iBACA,8DAEA,UACE,YACA,sBACA,aACA,sBACA,mBACA,uBACA,aACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,oBAIJ,WACE,WACA,gBACA,iBACA,kBACA,wBAEA,iBACE,MACA,OACA,WACA,YACA,sBACA,aACA,aACA,CAGA,YACA,UACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,2CANA,qBACA,mBACA,uBAaF,CATE,mBAIJ,YACE,CAGA,iBACA,qCAGF,kBACE,UACE,YACA,gBACA,0BAGF,UACE,YACA,eACA,gBACA,cACA,oDAIJ,aAEE,mBACA,aACA,aACA,2DAEA,cACE,uLAGF,ajBpGsB,SiBuGpB,eACA,gBACA,kBACA,oBACA,YACA,aACA,kBACA,6BACA,+mBAEA,aAGE,yBACA,qiBAGF,ajB7IS,qwDiBiJP,aAGE,sBAMR,sBACE,yBAGF,aACE,aACA,mBACA,uBACA,wBAGF,UACE,YACA,mBACA,mBACA,aACA,eACA,8BAEA,kBACE,+BAGF,cACE,mBACA,kCAIJ,mBACE,CACA,mBACA,0EAEA,mBACE,yBAIJ,cACE,iBACA,4BAEA,cACE,gBACA,cjBvMS,mBiByMT,2BAGF,ajBnMwB,kGiBsMtB,aAGE,2CAIJ,aACE,2BAGF,cACE,cjBtMoB,gBiBwMpB,mBACA,sCAEA,eACE,kCAGF,eACE,mBjBrOO,cAQa,kBiBgOpB,eACA,gBACA,CAII,2NADF,eACE,oCAOV,WACE,UACA,mCAME,mBACA,mBACA,sCAEA,cACE,iBACA,kBACA,qCAGF,eACE,oCAIJ,kBACE,mBACA,kBACA,eAIJ,iBACE,eACA,mBACA,sBAEA,eACE,cjBzRS,kBiB2RT,yBACA,eACA,qBAGF,kBjBhSW,cAQa,gBiB2RtB,aACA,kBACA,6HAQF,eACE,qJAGF,kBACE,cjB1SsB,mBiB4StB,kBACA,aACA,kBACA,eACA,sCACA,yPAEA,iBACE,mBACA,qNAGF,mBACE,gBACA,4CAMJ,YACE,mBACA,gDAEA,UACE,cACA,4DAEA,aACE,2DAGF,cACE,kDAGF,iBACE,uDAIJ,eACE,sDAIJ,UjB3WM,2DiBgXR,0BACE,cACE,iBACA,qJAGF,cAIE,mBACA,4CAGF,kBACE,sDAGF,WACE,eACA,mBAIJ,oBACE,eACA,gBACA,iBACA,uHAGF,kBAOE,cjB7YW,kBiB+YX,gBACA,eACA,YACA,kBACA,sBACA,+SAEA,ajBjYsB,YiBmYpB,eACA,WACA,eACA,gBACA,uSAGF,YACE,uPAGF,WACE,WACA,+WAGF,aACE,wBAKF,ejBvbM,CAiBkB,gBiByatB,oBACA,iEjB3bI,2BAiBkB,qDiBkb1B,iBAEE,aACA,qEAEA,wBACE,CADF,qBACE,CADF,oBACE,CADF,gBACE,gBACA,kKAIJ,YAKE,8BACA,mBjBncwB,aiBqcxB,iBACA,0LAEA,aACE,iBACA,cjB7boB,mBiB+bpB,kNAGF,aACE,6DAIJ,cAEE,yDAGF,WAEE,eACA,0BAGF,gBAEE,sDAGF,qBAEE,eAGF,UACE,gBACA,0BAGF,YACE,6BACA,qCAEA,yBAJF,cAKI,gBACA,iDAIJ,qBAEE,UACA,qCAEA,+CALF,UAMI,sDAIJ,aAEE,gBACA,gBACA,gBACA,kBACA,2FAEA,ajBzgBwB,qCiB6gBxB,oDAZF,eAaI,sCAKF,4BADF,eAEI,yBAIJ,YACE,+BACA,gBACA,0BAEA,cACE,iBACA,mBACA,sCAGF,aACE,sBACA,WACA,CACA,ajBhjBS,gBATL,aiB4jBJ,oBACA,eACA,YACA,CACA,SACA,kBACA,yBACA,iBACA,gBACA,gBACA,4CAEA,wBACE,+CAGF,ejB5kBI,yBiB8kBF,mBACA,kBACA,6DAEA,QACE,gBACA,gBACA,mEAEA,QACE,0DAIJ,ajBnlBO,oBiBqlBL,eACA,gBjB/lBA,+CiBomBJ,YACE,8BACA,mBACA,4CAIJ,aACE,cjBnmBS,eiBqmBT,gBACA,mBACA,wCAGF,eACE,mBACA,+CAEA,ajB9mBS,eiBgnBP,qCAIJ,uBAnFF,YAoFI,eACA,QACA,wCAEA,iBACE,iBAKN,eAWE,eACA,wBAXA,eACE,iBACA,uBAGF,aACE,gBACA,2CAMF,eACE,mBAGF,eACE,cACA,gBACA,+BAEA,4BACE,4BAGF,QACE,oCAIA,ajB/pBO,aiBiqBL,kBACA,eACA,mBACA,qBACA,8EAEA,eAEE,yWAOA,kBjBvqBgB,WAlBlB,iJiBgsBA,iBAGE,oMAUR,aACE,iIAIJ,4BAIE,cjBxrBsB,eiB0rBtB,gBACA,6cAEA,aAGE,6BACA,uCAIJ,iBACE,mBACA,oBACA,eAEA,yFAEA,qBACE,qGAIJ,YAIE,eACA,iIAEA,eACE,CAII,w1BADF,eACE,sDAMR,iBAEE,oDAKA,eACE,0DAGF,eACE,mBACA,aACA,mBACA,wEAEA,ajBzwBS,CiB2wBP,gBACA,uBAKN,YACE,2CAEA,QACE,WACA,cAIJ,UACE,eACA,gBACA,iBAEA,YACE,gBACA,eACA,kBACA,sCAGF,YACE,4CAEA,kBACE,yDAGF,SACE,sBACA,cACA,WACA,YACA,aACA,gDACA,mBjBpzBO,WATL,eiBg0BF,CACA,eACA,kBACA,2EAEA,QACE,wMAGF,mBAGE,+DAGF,kBACE,qCAGF,wDA7BF,cA8BI,4DAIJ,WACE,eACA,gBACA,SACA,kBACA,cAKN,iBACE,YACA,gBACA,YACA,aACA,uBACA,mBACA,gBjB12BM,yDiB62BN,aAGE,gBACA,WACA,YACA,SACA,sBACA,CADA,gCACA,CADA,kBACA,gBjBr3BI,uBiBy3BN,iBACE,YACA,aACA,+BACA,iEACA,kBACA,wCACA,uBAGF,iBACE,WACA,YACA,MACA,OACA,uBAGF,iBACE,YACA,WACA,UACA,YACA,4BACA,6BAEA,UACE,8BAGF,UjBt5BI,eiBw5BF,gBACA,cACA,kBACA,2BAGF,iBACE,mCACA,qCAIJ,oCACE,eAEE,uBAGF,YACE,wBAKN,gBACE,sCAEA,eACE,gCAGF,eACE,qDAGF,ajBl7BW,iDiBs7BX,YACE,0DAEA,YACE,0BAIJ,YACE,iBACA,uBACA,kDAGF,ajB/6BsB,qBiBi7BpB,wDAEA,yBACE,WCp9BN,YACE,oBAGF,cACE,uBACA,eACA,gBACA,clBwBsB,4CkBrBtB,alBNY,sCkBWd,2CACE,oBAGF,QACE,wBACA,UACA,+CAEA,WACE,mBACA,UACA,0BAGF,aACE,sBACA,SACA,YACA,kBACA,aACA,WACA,UACA,clB5BS,gBATL,ekBwCJ,oBACA,gBACA,qDAEA,alBdoB,CkBYpB,2CAEA,alBdoB,CkBYpB,+CAEA,alBdoB,CkBYpB,gDAEA,alBdoB,CkBYpB,sCAEA,alBdoB,gCkBkBpB,8CfpCA,uCADF,cesC4D,0CfjC5D,ceiC4D,oBAI9D,alB5Ca,mBkB8CX,mBlBvCsB,oCkByCtB,iBACA,kBACA,eACA,gBACA,sBAEA,alBjCsB,gBkBmCpB,0BACA,mFAEA,oBAEU,iCAKZ,mBACA,eAEA,gBACA,wCAEA,alB/DwB,sDkBmExB,YACE,2CAGF,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,gBACA,kBACA,SACA,kBACA,sBACA,kDAEA,oBlBrFsB,qCkB4F1B,eACE,kBACA,aACA,mBlBjGsB,gBkBmGtB,gBACA,cACA,yBAEA,iBACE,gBACA,wCAEA,alBlHS,iCkBoHT,WACE,iBACA,2BAIJ,iBACE,cACA,CACA,cACA,iBACA,clB/HS,qBkBiIT,gBACA,iBACA,qBACA,mBACA,gBACA,gGAEA,kBACE,qBACA,iIAEA,eACE,kJAIJ,eACE,mBACA,2DAGF,eACE,eACA,8BAGF,cACE,wFAGF,eACE,sCAGF,iBACE,8BACA,clBrKO,mBkBuKP,mDAEA,eACE,8DAIJ,eACE,0DAGF,iBACE,+BAGF,iBACE,eACA,2DAGF,eACE,+DAEA,QACE,8BAIJ,oBACE,8BAGF,uBACE,6BAGF,alBtLoB,qBkBwLlB,mCAEA,oEAGE,oBACE,gDAEA,qDAMR,UACE,YACA,gBACA,wBAIJ,iBACE,UACA,QACA,gHAEA,+BAEE,uDAIJ,iBAEE,WACA,mIAGE,aACE,sBACA,SACA,YACA,0BACA,yBACA,WACA,iBACA,UACA,clB5PO,gBATL,ekBwQF,oBACA,YACA,qBACA,yLAEA,alB/OkB,CkB6OlB,sKAEA,alB/OkB,CkB6OlB,8KAEA,alB/OkB,CkB6OlB,gLAEA,alB/OkB,CkB6OlB,4JAEA,alB/OkB,yKkBmPlB,SACE,qJAGF,kBlBpQoB,+IkBqQpB,8Cf1QF,8JADF,ce4Q8D,kKfvQ9D,ceuQ8D,qCfhQ5D,8TADF,sBeoQM,gBACA,6BAMR,aACE,kBACA,SACA,UACA,WACA,gBACA,2CAEA,aACE,mBACA,WACA,YACA,clB/QoB,ekBiRpB,iBACA,kBACA,WACA,4CAIJ,iBACE,SACA,oCAGF,aACE,kBACA,sBACA,SACA,0BACA,YACA,WACA,clBzTW,mBAQa,sCkBoTxB,eACA,WACA,aACA,6CAGF,aACE,0CAGF,YACE,eACA,kBACA,iMAEA,kBAGa,iKAEb,YAGE,mBACA,mBACA,2BACA,iBACA,eACA,+DAGF,6BACE,qEAEA,aACE,gBACA,uBACA,mBACA,sEAGF,eACE,qEAGF,aACE,iBACA,gBACA,uBACA,mBACA,4EAMA,alB/VkB,wBkBoWxB,eACE,iCAEA,YACE,mBACA,eACA,oBACA,YACA,gBACA,8BAIJ,UACE,WACA,cACA,kCAEA,iBACE,kBACA,aACA,WACA,sBlBzZI,wBkB2ZJ,sBACA,4BACA,gBACA,2CAEA,aACE,kBACA,sBACA,SACA,OACA,SACA,SACA,aACA,WACA,clBvZoB,gFkByZpB,eACA,oBACA,gBACA,UACA,UACA,4BACA,iDAEA,UlBlbE,sEkBobF,WACE,clBpakB,CAjBlB,4DkBobF,WACE,clBpakB,CAjBlB,gEkBobF,WACE,clBpakB,CAjBlB,iEkBobF,WACE,clBpakB,CAjBlB,uDkBobF,WACE,clBpakB,yCkByatB,2EAKE,0CAKN,iFACE,aACA,uBACA,8BACA,UACA,4BACA,8CAEA,aACE,clB5bsB,ekB8btB,gBACA,aACA,oBACA,2JAEA,aAGE,wCAIJ,SACE,kCAIJ,YACE,aACA,clBldsB,gBkBodtB,sCAEA,cACE,kBACA,2CAGF,aACE,gDAEA,aACE,eACA,gBACA,yBACA,qDAGF,iBACE,eACA,kBACA,WACA,WACA,mBlB5dkB,8DkB+dlB,iBACE,MACA,OACA,WACA,kBACA,mBlBhfkB,0BkBuf1B,alBhgBa,oBkBkgBX,eACA,gBlB5gBM,4BkBghBR,YACE,mBACA,0BACA,YACA,aACA,8BACA,cACA,oBAGF,YACE,cACA,sBAEA,oBACE,uBACA,cACA,YACA,iBACA,sBACA,uBAGF,oBACE,aACA,CAEA,oBACA,CADA,6BACA,UACA,QACA,YACA,uBACA,2BAIJ,iBACE,iBACA,0CAKE,yBACE,qCACA,WlB7jBE,mBAkBkB,gBkB8iBpB,8CAGA,yBACE,oCACA,uCAMR,iBACE,kBACA,uCACA,gBlB9kBM,gBkBglBN,uBACA,6CAGF,YACE,mBACA,aACA,clB9kBW,ekBglBX,sDAEA,aACE,clB9jBoB,wEkBikBpB,6EAEA,aACE,clBzlBO,gBkB2lBP,sGAIJ,kBlBtlBwB,WAlBlB,6PkBgnBF,UlBhnBE,0DkBonBN,wCAGF,gBACE,iBACA,mBACA,gBACA,yBACA,cACA,+BAEA,oBACE,SACA,eACA,kBACA,gCAGF,oBACE,aACA,UACA,WACA,kBACA,kCAIA,alB5oBU,CmBFZ,+BAHF,YACE,cACA,kBAUA,CATA,cAKA,kBACA,2BACA,gBAEA,uBAEA,YACE,uBACA,WACA,YACA,iBACA,6BAEA,WACE,gBACA,oBACA,aACA,yBACA,gBACA,oCAEA,0BACE,oCAGF,cACE,YACA,oBACA,YACA,6BAIJ,qBACE,WACA,gBACA,cACA,aACA,sBACA,qCAEA,4BARF,cASI,qBAMR,kBACE,wBACA,CADA,eACA,MACA,UACA,cACA,qCAEA,mBAPF,gBAQI,+BAGF,eACE,qCAEA,6BAHF,kBAII,wHAMJ,WAGE,mCAIJ,YACE,mBACA,uBACA,YACA,CnB7EW,ImB4Fb,aACE,aACA,sBACA,WACA,YACA,CAIA,oBAGF,qBACE,WACA,mBACA,cnBlGwB,emBoGxB,cACA,eACA,SACA,iBACA,aACA,SACA,UACA,2BAEA,yBACE,6BAIJ,kBACE,SACA,oBACA,cnBrHwB,emBuHxB,cACA,eACA,kBACA,UACA,mCAEA,yBACE,wCAGF,kBACE,2BAIJ,oBACE,iBACA,2BAGF,iBACE,kCAGF,cACE,cACA,eACA,aACA,kBACA,QACA,UACA,cAGF,kBACE,WnB5KM,cmB8KN,eACA,aACA,qBACA,2DAEA,kBAGE,oBAGF,SACE,2BAGF,sBACE,cnB7KsB,kGmBgLtB,sBAGE,WnBpME,kCmBwMJ,anBtLsB,oBmB4L1B,oBACE,iBACA,oBAGF,kBnB1Ma,cAqBW,iBmBwLtB,eACA,gBACA,yBACA,eACA,yBAGF,iBACE,cACA,uCAGE,aACE,WACA,kBACA,SACA,OACA,QACA,cACA,UACA,oBACA,YACA,UACA,oFACA,gBAKN,YACE,eACA,mBACA,cACA,eACA,kBACA,UACA,UACA,gBACA,uBAEA,QACE,YACA,aACA,cACA,uBACA,aACA,gBACA,uBACA,gBACA,mBACA,OACA,4CAGF,anB1PwB,uBmB8PxB,uCACE,4CAEA,anBjQsB,0CmBmQpB,4CAIJ,SAEE,SAIJ,WACE,kBACA,sBACA,aACA,sBACA,gBACA,wDAEA,SACE,gBACA,gBACA,qBAGF,kBnBpSW,yBmBySb,WACE,aACA,cACA,uBAGF,kBACE,iCAGF,iBACE,sEAGF,kBACE,SACA,cnBlTsB,emBoTtB,eACA,eACA,kFAEA,aACE,CAKA,kLAEA,UnBhVI,mBmBkVF,kFAKJ,2BACE,wCAIJ,YACE,oBACA,6BACA,+CAEA,sBAEE,kBACA,eACA,qBACA,0CAGF,eACE,gDAKJ,SACE,6BAGF,eACE,gBACA,gBACA,cnBtWsB,0DmBwWtB,UACA,uCAEA,YACE,WACA,uCAGF,iBACE,gCAGF,QACE,uBACA,SACA,6BACA,cACA,iCAIF,eACE,2CACA,YACE,WACA,mCAKN,kBACE,aACA,mCAIA,anB5YsB,0BmB8YpB,gCAIJ,WACE,4DAEA,cACE,uEAEA,eACE,uBAKN,oBACE,uBACA,gBACA,mBACA,OACA,sBAGF,oBACE,iBACA,uCAGF,anB7ZwB,mBArBX,kBmBsbX,aACA,eACA,gBACA,eACA,aACA,cACA,mBACA,uBACA,yBACA,sCAbF,cAcI,kDAGF,eACE,2CAGF,anB9bwB,qBmBgctB,uDAEA,yBACE,eAKN,qBACE,uCAKA,sBACE,6BACA,qCASF,qCAXA,sBACE,6BACA,sCAgBF,mJAFF,qBAGI,sBAKF,wBACA,aACA,2BACA,mBACA,mBACA,2BAEA,aACE,iCAEA,UACE,kBACA,uCAEA,SACE,kCAKN,aACE,aACA,yBChhBJ,iBACE,eACA,gBACA,cpB6BsB,mBArBX,eoBLX,aACA,cACA,sBACA,mBACA,uBACA,aACA,qEAGE,aAEE,WACA,aACA,SACA,yCAIJ,gBACE,gCAGF,eACE,uCAEA,aACE,mBACA,cpBDkB,qCoBKpB,cACE,gBACA,kBCtCJ,UACE,cACA,+BACA,0BAEA,UACE,qCAGF,iBATF,QAUI,mBAIJ,qBACE,mBACA,uBAEA,YACE,kBACA,gBACA,gBACA,2BAEA,aACE,WACA,YACA,SACA,oBACA,CADA,8BACA,CADA,gBACA,uBAIJ,YACE,mBACA,mBACA,aACA,6BAEA,aACE,aACA,mBACA,qBACA,gBACA,qCAGF,UACE,eACA,cACA,+BAGF,aACE,WACA,YACA,gBACA,mCAEA,UACE,YACA,cACA,SACA,kBACA,mBACA,oBACA,CADA,8BACA,CADA,gBACA,qCAIJ,gBACE,gBACA,4CAEA,cACE,WrB1EF,gBqB4EE,gBACA,uBACA,0CAGF,aACE,eACA,crBnEc,gBqBqEd,gBACA,uBACA,yBAKN,kBrBnFS,aqBqFP,mBACA,uBACA,gDAEA,YACE,cACA,eACA,mDAGF,qBACE,kBACA,gCACA,WACA,gBACA,mBACA,gBACA,uBACA,qDAEA,YACE,iEAEA,cACE,sDAIJ,YACE,cAOV,kBrBzHa,sBqB4HX,iBACE,4BAGF,aACE,eAIJ,cACE,kBACA,qBACA,cACA,iBACA,eACA,mBACA,gBACA,uBACA,eACA,oEAEA,YAEE,sBAGF,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,8BAEA,oBACE,mBACA,CC/KJ,eAGF,SnBkDE,sBACA,WACA,YACA,gBACA,oBACA,mBHhDW,cAOW,eG4CtB,SACA,cmBxDA,CACA,2BACA,iBACA,eACA,2CAEA,aACE,CAHF,iCAEA,aACE,CAHF,qCAEA,aACE,CAHF,sCAEA,aACE,CAHF,4BAEA,aACE,kCAGF,QACE,6EAGF,mBAGE,sBAGF,kBACE,qCAGF,eA3BF,cA4BI,kCAKF,QACE,qDAGF,mBAEE,mBAGF,iBACE,SACA,WACA,UACA,qBACA,UACA,0BACA,4CACA,eACA,WACA,YACA,ctBtCsB,esBwCtB,oBACA,0BAEA,mBACE,WACA,0BAIJ,sBACE,iCAEA,mBACE,WACA,gCAIJ,QACE,uBACA,ctB/CoB,esBiDpB,uCAEA,uBACE,sCAGF,aACE,yBAKN,atB7DwB,mBsB+DtB,gCACA,kBACA,eACA,gBACA,uBAGF,YACE,ctBrFsB,kBsBuFtB,iBAIA,atB7EsB,mBsB+EpB,gCACA,gBACA,aACA,eACA,eACA,qBAEA,oBACE,iBACA,eAIJ,YACE,mBACA,aACA,gCACA,0BAEA,eACE,qBAGF,aACE,ctBvGkB,gBsByGlB,uBACA,mBACA,4BAEA,eACE,uBAGF,atB/HkB,qBsBiIhB,eACA,gBACA,cACA,gBACA,uBACA,mBACA,qGAKE,yBACE,wBAMR,aACE,eACA,iBACA,gBACA,iBACA,mBACA,gBACA,ctBzJoB,0BsB6JtB,aACE,WACA,2CAEA,oCACE,yBACA,0CAGF,wBACE,WC1LR,yCCCE,qBACA,sBACA,CADA,kBACA,wBACA,WACA,YACA,eAEA,UACE,8BAIJ,exBXQ,kBwBaN,sCACA,kBACA,eACA,UACA,iDAEA,2BACE,2DAGF,UACE,mCAIJ,iBACE,SACA,WACA,eACA,yCAGF,iBACE,UACA,SACA,UACA,gBxBvCM,kBwByCN,sCACA,gBACA,gDAEA,aACE,eACA,SACA,gBACA,uBACA,iKAEA,+BAGE,2DAIJ,WACE,wBAKF,2BACE,eAIJ,aACE,eACA,iBACA,gBACA,WACA,UACA,eACA,0CAEA,mBAEE,mBAGF,8BACE,CADF,sBACE,WACA,cACA,CACA,UACA,YACA,eACA,0EAMA,SACE,oBACA,CADA,WACA,eCpGN,WAEE,0BAGF,kBANW,kBAQT,cACA,iCACA,wBACE,mCAOF,WACE,SACA,UACA,2CAGF,aACE,aAEA,sBACA,YACA,6BACA,6DAGE,oBACE,WACA,iBACA,iBACA,iJAGF,UACE,gEAEF,oBACE,gBACA,WACA,2CAKN,yBACE,sBACA,kBACA,YACA,gBACA,kDAEA,uBACE,CADF,oBACE,CADF,eACE,WACA,YACA,SACA,4BACA,WACA,yBACA,eACA,4CACA,sBACA,oBACA,6DAEA,uBACE,6DAGF,sBACE,wEAGF,sBACE,kBACA,SCjFR,WACE,sBACA,aACA,sBACA,kBACA,iBACA,UACA,qBAEA,iBACE,oBAGF,kBACE,2DvBDF,SuBI0D,yBvBC1D,SuBD0D,qCvBQxD,qLuBLA,yBAGF,eACE,gBACA,eACA,qCvBZA,4BuBgBA,SACE,WACA,YACA,eACA,UACA,+BALF,SACE,WACA,YACA,eACA,UACA,yCAIJ,4BAGF,YACE,mBACA,mBACA,UACA,mBACA,eACA,mBAEA,aACE,sBACA,oCACA,sBACA,YACA,cACA,c1BtCoB,kB0BwCpB,qBACA,eACA,mBAGF,iCACE,iDAEA,YAEE,mBACA,mCACA,SAKN,iBACE,mBACA,UACA,qCvBrDE,6CADF,euBwDkF,sCvBlEhF,sBADF,cuBoE0D,yBvB/D1D,cuB+D0D,gBAG5D,e1BlFQ,kBGkEN,CACA,sBACA,gBACA,cHrDsB,uCGuDtB,mBAEA,wBACE,cH1DoB,eG4DpB,gBACA,mBACA,mBAGF,aACE,mBAGF,kBACE,mBAGF,eACE,cHjFS,kB0B6Eb,YACE,c1BvEsB,a0ByEtB,mBACA,oBAEA,aACE,qBACA,wBAGF,aACE,c1BjFsB,gB0BmFtB,mBACA,gBACA,uBACA,0BAIJ,aACE,gBACA,gBACA,kBAGF,kB1BxGa,kB0B0GX,gBACA,yBAEA,a1BxFsB,mB0B0FpB,aACA,gBACA,eACA,eACA,6BAEA,oBACE,iBACA,0BAIJ,iBACE,6BAEA,kBACE,gCACA,eACA,aACA,aACA,gBACA,eACA,c1BhHkB,iC0BmHlB,oBACE,iBACA,8FAIJ,eAEE,mCAGF,aACE,aACA,c1B7IoB,qB0B+IpB,0HAEA,aAGE,0BACA,gBAQN,WACA,kBAGA,+BANF,qBACE,UACA,CAEA,eACA,aAgBA,CAfA,eAGF,iBACE,MACA,OACA,mBACA,CAGA,qBACA,CACA,eACA,WACA,YACA,uBAEA,kB1B1LW,0B0B+Lb,u1BACE,OACA,gBACA,aACA,8BAEA,aACE,sBACA,CADA,4DACA,CADA,kBACA,+BACA,CADA,2BACA,WACA,YACA,oBACA,eACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,oCAGF,aACE,WACA,YACA,YACA,eACA,sCAGF,yBAzBF,aA0BI,iBAIJ,kBACE,eACA,gBACA,mBAGF,cACE,kBACA,MACA,OACA,WACA,YACA,0BACA,oBCrPF,kBACE,gB3BAM,WACA,e2BEN,aACA,sBACA,YACA,uBACA,eACA,kBACA,kBACA,YACA,gBAGF,e3BdQ,cAiBgB,oB2BCtB,YACA,iEAEA,aAGE,iCAGF,eACE,2BxBcF,iBACE,mBACA,cACA,eACA,aACA,gBACA,yBwBfJ,aACE,eACA,yBAGF,aACE,eACA,gBACA,6BAGF,aACE,kBACA,W3B7CM,0B2B+CN,WACA,SACA,gBACA,kBACA,eACA,gBACA,UACA,oBACA,WACA,4BACA,iBACA,2DAKE,YACE,wDAKF,SACE,uBAKN,WACE,aACA,sBACA,4BAEA,iBACE,c3BjEoB,a2BmEpB,YACA,mBACA,CAGE,yDAIJ,UACE,gBAIJ,qBACE,eACA,gBACA,kBACA,kBACA,WACA,aACA,2BxB/DA,iBACE,mBACA,cACA,eACA,aACA,gBACA,sBwB8DJ,WACE,sBACA,cACA,WACA,kBACA,kBACA,gBACA,kCAEA,eACE,qEAIA,cACE,MACA,gCAIJ,e3BlIM,gC2BuIR,cACE,cACA,qBACA,c3BxHwB,kB2B0HxB,UACA,mEAEA,WAEE,WACA,sBACA,CADA,gCACA,CADA,kBACA,CAIE,0HAFF,WACE,oBACA,CADA,8BACA,CADA,gB3BtJE,C2BuJF,wBAKN,UACE,CAEA,iBACA,MACA,OACA,UACA,gB3BnKM,iC2BsKN,YACE,sBAIJ,WACE,gBACA,kBACA,WACA,aACA,uBACA,qCAGF,cACE,YACA,WACA,kBACA,UACA,sBACA,CADA,gCACA,CADA,kBACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,qDAEA,WACE,oBACA,CADA,8BACA,CADA,gBACA,sCAIJ,0BACE,2BACA,gBACA,kBACA,yBAGF,eACE,iBACA,yBAGF,UACE,cAGF,UACE,YACA,kBACA,qCAEA,UACE,YACA,aACA,mBACA,uBACA,2CAEA,c3B3K0B,eAEC,C2BqL7B,8CALF,iBACE,MACA,OACA,QACA,SAYA,CAXA,yBAQA,mBACA,8BACA,oBACA,4BAEA,mBACE,0DAGF,SACE,4DAEA,mBACE,mBAKN,yBACE,sBACA,SACA,W3BvQM,e2ByQN,aACA,mBACA,eACA,cACA,cACA,kBACA,kBACA,MACA,SACA,yBAGF,MACE,0BAGF,OACE,CASA,4CANF,UACE,kBACA,kBACA,OACA,YACA,oBAUA,6BAEA,WACE,sBAGF,mBACE,qBACA,gBACA,c3BpSsB,mF2BuStB,yBAGE,wBAKN,oBACE,sBAGF,qB3BpUQ,Y2BsUN,WACA,kBACA,YACA,UACA,SACA,YACA,8BAGF,wB3B7T0B,qB2BiU1B,iBACE,UACA,QACA,YACA,qKAKA,WAEE,mFAGF,WACE,eAKJ,qBACE,kBACA,mBACA,kBACA,oBACA,cACA,wBAEA,eACE,YACA,yBAGF,cACE,kBACA,gBACA,gCAEA,UACE,cACA,kBACA,6BACA,WACA,SACA,OACA,oBACA,qCAIJ,qCACE,iCAGF,wBACE,uCAIA,mBACA,mBACA,6BACA,0BACA,eAIJ,eACE,kBACA,gB3BzZM,e2B2ZN,kBACA,sBACA,cACA,wBAEA,eACE,sBACA,qBAGF,SACE,gCAGF,UACE,YACA,0BxBjYF,iBACE,mBACA,cACA,eACA,aACA,gBACA,qBwBgYF,eACE,gBACA,UACA,kBACA,0BAGF,oBACE,sBACA,SACA,gCAEA,wBACE,0BACA,qBACA,sBACA,UACA,4BAKF,qBACE,CADF,gCACE,CADF,kBACE,kBACA,QACA,2BACA,yBAIJ,iBACE,UACA,SACA,OACA,QACA,sBACA,iFACA,eACA,UACA,4BACA,gCAEA,SACE,6EAKF,iBAEE,wBAIJ,YACE,kBACA,MACA,OACA,WACA,YACA,UACA,SACA,gB3B9eI,cAiBgB,gB2BgepB,oBACA,+BAEA,aACE,oBACA,8GAEA,aAGE,+BAIJ,aACE,eACA,kCAGF,aACE,eACA,gBACA,4BAIJ,YACE,8BACA,oBACA,CAGE,gUAEA,aAIE,wBAKN,cACE,mBACA,gBACA,uBACA,oCAGE,cACE,qCAKF,eACE,+BAIJ,sBACE,iBACA,eACA,SACA,0BACA,8GAEA,U3BpjBE,+E2B4jBN,cAGE,gBACA,6BAGF,U3BnkBM,iB2BqkBJ,yBAGF,oBACE,aACA,mDAGF,U3B7kBM,uB2BklBN,cACE,YACA,eACA,8BAEA,UACE,WACA,+BAOA,6DANA,iBACA,cACA,kBACA,WACA,UACA,YAWA,CAVA,+BASA,kBACA,+BAGF,iBACE,UACA,kBACA,WACA,YACA,YACA,UACA,4BACA,mBACA,sCACA,oBACA,qBAIJ,gBACE,uBAEA,oBACE,eACA,gBACA,W3BloBE,sF2BqoBF,yBAGE,qBAKN,cACE,YACA,kBACA,4BAEA,UACE,WACA,+BACA,kBACA,cACA,kBACA,WACA,SACA,2DAGF,aAEE,kBACA,WACA,kBACA,SACA,mBACA,6BAGF,6BACE,6BAGF,iBACE,UACA,UACA,kBACA,WACA,YACA,QACA,iBACA,4BACA,mBACA,sCACA,oBACA,CAGE,yFAKF,SACE,6GAQF,gBACE,oBACA,iBC5sBR,YACE,mBACA,mBACA,kBACA,QACA,SACA,YACA,mBAGF,YACE,kBACA,gBACA,yBACA,0BACA,eACA,iBACA,yBACA,WACA,4BACA,wCAEA,uBCtBF,kB7BWa,sB6BTX,kBACA,uCACA,YACA,gBACA,qCAEA,aARF,SASI,kBAGF,cACE,mBACA,gBACA,eACA,kBACA,0BACA,6BAGF,WACE,6BAGF,yBACE,sCAEA,uBACE,uCACA,wBACA,wBAIJ,eACE,kDAIA,oBACE,+BAIJ,cACE,sBAGF,eACE,aAIJ,kB7B3Ca,sB6B6CX,kBACA,uCACA,YACA,gBACA,qCAEA,YARF,SASI,uBAGF,kBACE,oBAGF,kBACE,YACA,0BACA,gBACA,mBAGF,YACE,gCACA,4BAGF,YACE,iCAGF,aACE,gBACA,qBACA,eACA,aACA,aC3FJ,cAOE,qBACA,c9BGW,2B8BVX,qBAEE,iBACA,+BAOF,WACE,iBAIJ,sBACE,6BAEA,uBACE,2BACA,4BACA,mB9BHsB,4B8BOxB,oBACE,8BACA,+BACA,aACA,qBAIJ,YACE,8BACA,cACA,c9BLsB,c8BOtB,oBAGF,iBACE,OACA,kBACA,iBACA,gBACA,8BACA,eACA,0BAEA,aACE,6BAIJ,a9BpC0B,mC8BuCxB,aACE,oDAGF,QACE,wBAIJ,iBACE,YACA,OACA,WACA,WACA,yBACA,uBAIA,oBACE,WACA,eACA,yBAGF,iBACE,gBACA,oBAIJ,iBACE,aACA,gBACA,kBACA,gB9B5FM,sB8B8FN,sGAEA,+BAEE,oBAKF,2BACA,gB9BxGM,0B8B2GN,cACE,gBACA,gBACA,oBACA,cACA,WACA,gCACA,c9BzGS,yB8B2GT,kBACA,4CAEA,QACE,2GAGF,mBAGE,wCAKN,cACE,6CAEA,SACE,kBACA,kBACA,qDAGF,SACE,WACA,kBACA,MACA,OACA,WACA,YACA,sCACA,mBACA,4BAIJ,SACE,kBACA,wBACA,gBACA,MACA,iCAEA,aACE,WACA,gBACA,gBACA,gB9BpKI,mB8ByKR,iBACE,qBACA,YACA,wBAEA,UACE,YACA,wBAIJ,cACE,kBACA,iBACA,c9BvKsB,mD8B0KtB,YACE,qDAGF,eACE,uDAGF,YACE,qBAIJ,YACE,wBC1MF,iBACE,aACA,mBACA,mB/BgBwB,cARb,kB+BLX,YACA,WACA,gBACA,iBACA,gBACA,4DAEA,aACE,eACA,mFAGF,iBACE,kBACA,gBACA,+FAEA,iBACE,OACA,MACA,kCAIJ,aACE,cACA,2BAGF,cACE,gBACA,iBACA,mBACA,2BAGF,cACE,gBACA,iBACA,gBACA,mBACA,0CAIJ,aACE,kBACA,cACA,mBACA,gCACA,eACA,qBACA,aACA,0BACA,4DAEA,aACE,iBACA,gDAGF,kB/BhDwB,iD+BoDxB,kB/BnDwB,WAlBlB,qG+B0EN,kB/BxEU,WAFJ,oC+BgFR,kBACE,YACA,eACA,iBACA,gBACA,8BAGF,aACE,UACA,kBACA,YACA,gBACA,oCAGF,iBACE,4FAGF,eAEE,mBACA,qCAGF,mCACE,UACE,cACA,0CAGF,YACE,4DAEA,YACE,kBCtHN,UhCEQ,gCgCCN,oBAEA,cACE,iBACA,gBACA,kBACA,mBAGF,UhCVM,0BgCYJ,oBAGF,eACE,cACA,iBACA,mDAGF,UACE,YACA,gBACA,gCACA,gBC3BJ,WACE,gBACA,aACA,sBACA,yBACA,kBACA,+BAEA,gBACE,eACA,CACA,2BACA,kCAGF,QACE,iCAGF,aACE,6BAGF,sBACE,0BAGF,MACE,kBACA,aACA,sBACA,iBACA,mDAGF,eACE,sBjClCI,0BiCoCJ,cACA,gDAGF,iBACE,gDAGF,WACE,mBAIJ,eACE,mBACA,yBACA,gBACA,aACA,sBACA,qBAEA,aACE,sBAGF,aACE,SACA,CACA,4BACA,cACA,qDAHA,sBAOA,qCAIJ,qBAEI,cACE,wBAKN,qBACE,WACA,cACA,6DAEA,UAEE,YACA,UACA,wCAGF,YACE,cACA,kDACA,qCAEA,uCALF,aAMI,yCAIJ,eACE,oCAGF,YACE,uDAGF,cACE,sCAGF,gBACE,eACA,CACA,2BACA,yCAGF,QACE,mCAGF,gBACE,yBAEA,kCAHF,eAII,sCAIJ,sBACE,gBACA,sCAGF,uCACE,YACE,iKAEA,eAGE,6CAIJ,gBACE,2EAGF,YAEE,kGAGF,gBACE,+BAGF,YACE,gBACA,gLAEA,eAIE,gCAIJ,iBACE,6CAEA,cACE,8CAKF,gBACE,CAIA,yFAGF,eACE,0BAMR,cACE,aACA,uBACA,mBACA,gBACA,iBACA,iBACA,gBACA,mBACA,WjCjNM,kBiCmNN,eACA,iBACA,qBACA,sCACA,4FAEA,kBAGE,qCAIJ,UACE,UACE,uDAGF,kCACE,mCAGF,kBAEE,sCAIJ,2CACE,YACE,sCAOA,sEAGF,YACE,uCAIJ,0CACE,YACE,uCAIJ,UACE,YACE,QC1QJ,eACE,eACA,8BAEA,QAEE,gBACA,UAGF,kBACE,kBACA,cAGF,iBACE,MACA,OACA,YACA,qBACA,kBACA,mBACA,sBAEA,kBlCJsB,akCSxB,iBACE,aACA,cACA,iBACA,eACA,gBACA,gEAEA,YAEE,gCAGF,aACE,8BAIA,qBACA,WACA,eACA,clCvCO,ckCyCP,UACA,oBACA,gBlCpDE,yBkCsDF,kBACA,iBACA,oCAEA,oBlCxCoB,wBkC6CtB,cACE,sBAGF,YACE,mBACA,iBACA,cAIJ,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,gBACA,mBACA,cACA,uBAEA,iBACE,qBAGF,oBlC7FY,8EkCkGZ,gBAGE,gBACA,gCAGF,mBACE,SACA,wCAGF,mBAEE,eAIJ,oBACE,WACA,gBACA,CACA,oBACA,iBACA,gBACA,mBACA,cACA,mBAGF,UACE,iBACA,eAGF,eACE,mBACA,clC1GoB,akC8GtB,cACE,uBACA,UACA,SACA,SACA,clCnHoB,0BkCqHpB,kBACA,mBAEA,oBACE,sCAGF,mCAEE,eAIJ,WACE,eACA,kBACA,eACA,6BAIJ,4BACE,gCAEA,YACE,2CAGF,4BACE,aACA,aACA,mBACA,mGAEA,UAEE,aACA,+GAEA,oBlCxKoB,sDkC8KxB,cACE,gBACA,iBACA,YACA,oBACA,clCvKoB,sCkC0KpB,gCAGF,YACE,mBACA,4CAEA,aACE,wBACA,iBACA,oCAIJ,uBACE,CADF,oBACE,CADF,eACE,sBACA,eACA,clChNS,qBkCkNT,WACA,UACA,oBACA,qXACA,yBACA,kBACA,CACA,yBACA,mDAGF,aACE,cAIJ,alC7MwB,qBkCgNtB,+BACE,6BAEA,+BACE,YC/ON,qBACE,iBANc,cAQd,kBACA,sCAEA,WANF,UAOI,eACA,mBAIJ,sBACE,eACA,gBACA,gBACA,qBACA,cnCJsB,oBmCOtB,anCLwB,0BmCOtB,6EAEA,oBAGE,wCAIJ,anClBsB,oBmCuBtB,YACE,oBACA,+BAEA,eACE,yBAIJ,eACE,cnChCsB,qBmCoCxB,iBACE,cnCrCsB,uBmCyCxB,eACE,mBACA,kBACA,kBACA,yHAGF,sBAME,mBACA,oBACA,gBACA,cnCzDsB,qBmC6DxB,aACE,qBAGF,gBACE,qBAGF,eACE,qBAGF,gBACE,yCAGF,aAEE,qBAGF,eACE,qBAGF,kBACE,yCAMA,iBACA,iBACA,yDAEA,2BACE,yDAGF,2BACE,qBAIJ,UACE,SACA,SACA,gCACA,eACA,4BAEA,UACE,SACA,wBAIJ,UACE,yBACA,8BACA,CADA,iBACA,gBACA,mBACA,iEAEA,+BAEE,cACA,kBACA,gBACA,gBACA,cnCrIkB,iCmCyIpB,uBACE,gBACA,gBACA,cnC9HkB,qDmCkIpB,WAEE,iBACA,kBACA,qBACA,mEAEA,SACE,kBACA,iFAEA,gBACE,kBACA,6EAGF,iBACE,SACA,UACA,mBACA,gBACA,uBACA,+BAMR,YACE,oBAIJ,kBACE,eACA,mCAEA,iBACE,oBACA,8BAGF,YACE,8BACA,eACA,6BAGF,UACE,uBACA,eACA,iBACA,WnCpNI,iBmCsNJ,kBACA,qEAEA,aAEE,6CAIA,anC9MoB,oCmCmNtB,sBACE,gBACA,eACA,iBACA,qCAGF,4BA3BF,iBA4BI,4BAIJ,iBACE,YACA,sBACA,mBACA,CACA,sBACA,0BACA,QACA,aACA,yCAEA,sBACE,eACA,iBACA,gBACA,cnC/OkB,mBmCiPlB,mBACA,gCACA,uBACA,mBACA,gBACA,wFAEA,eAEE,cACA,2CAGF,oBACE,2BAKN,iBACE,mCAIE,UACqB,sChCnRzB,CgCoRI,kBACA,uCAEA,aACE,WACA,YACA,mBACA,iBnCpOgB,wBG9DtB,4BACA,iCgCsSE,cACE,mCAEA,aACE,WnC3SA,qBmC6SA,uDAGE,yBACE,2CAKN,aACE,cnCvSgB,kCmC+StB,sBAEE,CACA,eACA,eACA,iBACA,mBACA,cnCtToB,sCmCyTpB,anCvTsB,0BmCyTpB,kBAIJ,cACE,SACA,UACA,gBACA,uBACA,oBACA,kBACA,oBACA,cACA,kBAGF,sBACE,eACA,iBACA,gBACA,mBACA,cnC/UsB,wBmCkVtB,sBACE,cACA,eACA,gBACA,cACA,kBAKF,cACA,iBnC7VsB,mCmC2VxB,sBACE,CAEA,eACA,mBACA,cnChWsB,kBmCqWtB,cACA,iBnCtWsB,kBmC8WtB,cnC9WsB,mCmC6WxB,sBACE,CACA,gBACA,gBACA,mBACA,cnClXsB,kBmCuXtB,cnCvXsB,kBmC+XxB,sBACE,eACA,iBACA,gBACA,mBACA,cnCpYsB,mCmCwYxB,gBAEE,mDAEA,2BACE,mDAGF,2BACE,kBAIJ,eACE,kBAGF,kBACE,yCAGF,cAEE,kBAGF,UACE,SACA,SACA,2CACA,cACA,yBAEA,UACE,SACA,iDAIJ,YAEE,+BAGF,kBnC5bW,kBmC8bT,kBACA,gBACA,sBACA,oCAEA,UACE,aACA,2BACA,iBACA,8BACA,mBACA,uDAGF,YACE,yBACA,qBACA,mFAEA,aACE,eACA,qCAGF,sDAVF,UAWI,8BACA,6CAIJ,MACE,sBACA,qCAEA,2CAJF,YAKI,sBAKN,iBACE,yBAEA,WACE,WACA,uBACA,4BAIJ,iBACE,mBACA,uCAEA,eACE,mCAGF,eACE,cACA,qCAGF,eACE,UACA,mDAEA,kBACE,aACA,iBACA,0FAKE,oBACE,gFAIJ,cACE,qDAIJ,aACE,cACA,6CAMA,UACqB,sChC9hB3B,mDgCiiBI,cACE,4DAEA,cACE,qCAKN,oCACE,eACE,sCAIJ,2BA9DF,iBA+DI,mFAIJ,qBAGE,mBnCtjBS,kBmCwjBT,kCACA,uBAGF,YACE,kBACA,WACA,YACA,2BAEA,YACE,WACA,uCAKF,YACE,eACA,mBACA,mBACA,qCAGF,sCACE,kBACE,uCAIJ,anC9kBsB,qCmCklBtB,eACE,WnCpmBE,gBmCsmBF,2CAEA,anCxlBkB,gDmC2lBhB,anC1lBkB,+CmCgmBtB,eACE,qBAIJ,kBACE,yBAEA,aACE,SACA,eACA,YACA,kBACA,qCAIJ,gDAEI,kBACE,yCAGF,eACE,gBACA,WACA,kBACA,uDAEA,iBACE,sCAMR,8BACE,aACE,uCAEA,gBACE,sDAGF,kBACE,6EAIJ,aAEE,qBAIJ,WACE,UAIJ,mBACE,qCAEA,SAHF,eAII,kBAGF,YACE,uBACA,mBACA,aACA,qBAEA,SnC1rBI,YmC4rBF,qCAGF,gBAXF,SAYI,mBACA,sBAIJ,eACE,uBACA,gBACA,gBACA,uBAGF,eACE,gBACA,0BAEA,YACE,yBACA,gBACA,eACA,cnCpsBkB,6BmCwsBpB,eACE,iBACA,+BAGF,kBnCptBS,amCstBP,0BACA,aACA,uCAEA,YACE,gCAIJ,cACE,gBACA,uDAEA,YACE,mBACA,iDAGF,UACE,YACA,0BACA,gCAIJ,YACE,uCAEA,sBACE,eACA,gBACA,cACA,qCAGF,cACE,cnCnvBgB,uFmCyvBtB,eACE,cASA,CnCnwBoB,2CmCgwBpB,iBACA,CACA,kBACA,gBAGF,eACE,cACA,aACA,kDACA,cACA,qCAEA,eAPF,oCAQI,cACA,8BAEA,UACE,aACA,sBACA,0CAEA,OACE,cACA,2CAGF,YACE,mBACA,QACA,cACA,qCAIJ,UACE,2BAGF,eACE,sCAIJ,eAtCF,UAuCI,6BAEA,aACE,gBACA,gBACA,2GAEA,eAGE,uFAIJ,+BAGE,2BAGF,YACE,gCAEA,eACE,qEAEA,eAEE,gBACA,2CAGF,eACE,SAQZ,iBACE,qBACA,iBAGF,aACE,kBACA,aACA,UACA,YACA,cnCh2BsB,qBmCk2BtB,eACA,qCAEA,gBAVF,eAWI,WACA,gBACA,cnC11BoB,SoChCxB,UACE,eACA,iBACA,yBACA,qBAEA,WAEE,iBACA,mBACA,6BACA,gBACA,mBACA,oBAGF,qBACE,gCACA,aACA,gBACA,oBAGF,eACE,qEAGF,kBpChBW,UoCqBX,apCZwB,0BoCctB,gBAEA,oBACE,eAIJ,eACE,CAII,4HADF,eACE,+FAOF,sBAEE,yFAKF,YAEE,gCAMJ,kBpCzDS,6BoC2DP,gCACA,4CAEA,qBACE,8BACA,2CAGF,uBACE,+BACA,0BAKN,qBACE,gBAIJ,aACE,mBACA,MAGF,+BACE,0BAGF,sBACE,SACA,aACA,8CAGF,oBAEE,qBACA,iBACA,eACA,cpC5FsB,gBoC8FtB,0DAEA,UpChHM,wDoCoHN,eACE,iBACA,sEAGF,cACE,yCAKF,YAEE,yDAEA,qBACE,iBACA,eACA,gBACA,qEAEA,cACE,2EAGF,YACE,mBACA,uFAEA,YACE,qHAOJ,sBACA,cACA,uBAIJ,wBACE,mBpCvJS,sBoCyJT,YACA,mBACA,gCAEA,gBACE,mBACA,oBAIJ,YACE,yBACA,aACA,mBpCtKS,gCoCyKT,aACE,gBACA,mBAIJ,wBACE,aACA,mBACA,qCAEA,wCACE,4BACE,0BAIJ,kBACE,iCAGF,kBpC9LS,uCoCiMP,kBACE,4BAIJ,gBACE,oBACA,sCAEA,SACE,wCAGF,YACE,mBACA,mCAGF,aACE,aACA,uBACA,mBACA,kBACA,6CAEA,UACE,YACA,kCAIJ,aACE,mCAGF,aACE,iBACA,cpC/NgB,gBoCiOhB,mCAIJ,QACE,WACA,qCAEA,sBACE,gBACA,qCAOJ,4FAFF,YAGI,gCAIJ,aACE,sCAEA,eACE,4BAIJ,wBACE,aACA,gBACA,qCAEA,2BALF,4BAMI,sCAIJ,+CACE,YACE,iBCzRN,YACE,uBACA,WACA,iBACA,iCAEA,gBACE,gBACA,oBACA,cACA,wCAEA,YACE,yBACA,mBrCPO,YqCSP,yBAIJ,WAvBc,UAyBZ,oBACA,iCAEA,YACE,mBACA,YACA,uCAEA,aACE,yCAEA,oBACE,aACA,2CAGF,SrCxCA,YqC0CE,kBACA,YACA,uCAIJ,aACE,crCjCgB,qBqCmChB,cACA,eACA,aACA,0HAIA,kBAGE,+BAKN,aACE,iBACA,YACA,aACA,qCAGF,sCACE,YACE,6BAIJ,eACE,0BACA,gBACA,mBACA,qCAEA,2BANF,eAOI,+BAGF,aACE,aACA,crC3EgB,qBqC6EhB,0BACA,2CACA,0BACA,mBACA,gBACA,uBACA,mCAEA,gBACE,oCAGF,UrCzGA,yBqC2GE,0BACA,2CACA,uCAGF,kBACE,sBACA,+BAIJ,kBACE,wBACA,SACA,iCAEA,QACE,kBACA,6DAIJ,UrCjIE,yBAkBkB,gBqCkHlB,gBACA,mEAEA,wBACE,6DAKN,yBACE,iCAIJ,qBACE,WACA,gBApJY,cAsJZ,sCAGF,uCACE,YACE,iCAGF,WA/JY,cAiKV,sCAIJ,gCACE,UACE,0BAMF,2BACA,qCAEA,wBALF,cAMI,CACA,sBACA,kCAGF,YACE,oBAEA,gCACA,0BAEA,eAEA,mBACA,8BACA,mCAEA,eACE,kBACA,yCAGF,mBACE,4DAEA,eACE,qCAIJ,gCAzBF,eA0BI,iBACA,6BAIJ,arCnMsB,eqCqMpB,iBACA,gBACA,qCAEA,2BANF,eAOI,6BAIJ,arC9MsB,eqCgNpB,iBACA,gBACA,mBACA,4BAGF,wBACE,eACA,gBACA,crC1NkB,mBqC4NlB,kBACA,gCACA,4BAGF,cACE,crCjOoB,iBqCmOpB,gBACA,0CAGF,UrCxPI,gBqC0PF,uFAGF,eAEE,gEAGF,aACE,4CAGF,cACE,gBACA,WrCxQE,oBqC0QF,iBACA,gBACA,mBACA,2BAGF,cACE,iBACA,crCjQoB,mBqCmQpB,kCAEA,UrCtRE,gBqCwRA,CAII,2NADF,eACE,4BAMR,UACE,SACA,SACA,2CACA,cACA,mCAEA,UACE,SACA,qCAKN,eA9SF,aA+SI,iCAEA,YACE,yBAGF,UACE,UACA,YACA,iCAEA,YACE,4BAGF,YACE,8DAGF,eAEE,gCACA,gBACA,0EAEA,eACE,+BAIJ,eACE,6DAGF,2BrCjUoB,YqCwU1B,UACE,SACA,cACA,WACA,sDAKA,arCnVsB,0DqCsVpB,arCpVsB,4DqCyVxB,arC1Wc,gBqC4WZ,4DAGF,arC9WU,gBqCgXR,0DAGF,arCvVsB,gBqCyVpB,0DAGF,arCtXU,gBqCwXR,UAIJ,YACE,eACA,yBAEA,aACE,qBACA,oCAEA,kBACE,4BAGF,cACE,gBACA,+BAEA,oBACE,iBACA,gCAIJ,eACE,yBACA,eACA,CAII,iNADF,eACE,2BAKN,oBACE,crCnZkB,qBqCqZlB,yBACA,eACA,gBACA,gCACA,iCAEA,UrC3aE,gCqC6aA,oCAGF,arC9ZoB,gCqCgalB,iBAMR,aACE,iBACA,eACA,sBAGF,aACE,eACA,cACA,wBAEA,aACE,kBAIJ,YACE,eACA,mBACA,wBAGF,YACE,WACA,sBACA,aACA,+BAEA,aACE,qBACA,gBACA,eACA,iBACA,crCxcsB,CqC6clB,4MADF,eACE,sCAKN,aACE,gCAIJ,YAEE,mBACA,kEAEA,UACE,kBACA,4BACA,gFAEA,iBACE,kDAKN,aAEE,aACA,sBACA,4EAEA,cACE,WACA,kBACA,mBACA,uEAIJ,cAEE,iBAGF,YACE,eACA,kBACA,2CAEA,kBACE,eACA,8BAGF,kBACE,+CAGF,gBACE,uDAEA,gBACE,mBACA,YACA,YAKN,kBACE,eACA,cAEA,arCthBwB,qBqCwhBtB,oBAEA,yBACE,SAKN,aACE,YAGF,kBACE,iBACA,oBAEA,YACE,2BACA,mBACA,aACA,mBrCrjBS,cAOW,0BqCijBpB,eACA,kBACA,oBAGF,iBACE,4BAEA,aACE,SACA,kBACA,WACA,YACA,qBAIJ,2BACE,mBAGF,oBACE,uBAGF,arC5jBsB,oBqCgkBtB,kBACE,0BACA,aACA,crCjlBoB,gCqCmlBpB,eACA,qBACA,gBACA,kBAGF,cACE,kBACA,crC7kBoB,2BqCilBtB,iBACE,SACA,WACA,WACA,YACA,kBACA,oCAEA,kBrCtnBY,oCqC0nBZ,kBACE,mCAGF,kBrC7mBsB,sDqCknBxB,arCnnBwB,qBqCunBtB,gBACA,sBAGF,aACE,0BAGF,arC/nBwB,sBqCmoBxB,arCnpBc,yDqCwpBhB,oBAIE,crC5oBwB,iGqC+oBxB,eACE,yIAIA,4BACE,cACA,iIAGF,8BACE,CADF,sBACE,WACA,sBAKN,YAEE,mBACA,sCAEA,aACE,CACA,gBACA,kBACA,0DAIA,8BACE,CADF,sBACE,WACA,gBAKN,kBACE,8BACA,yBAEA,yBrCxsBc,yBqC4sBd,yBACE,wBAGF,yBrC7sBU,wBqCktBR,2BACA,eACA,iBACA,4BACA,kBACA,gBACA,0BAEA,arC9sBoB,uBqCotBpB,wBACA,qBAGF,arC1sBsB,cqC+sBxB,kBrCpuBa,kBqCsuBX,mBACA,uBAEA,YACE,8BACA,mBACA,aACA,gCAEA,SACE,SACA,gDAEA,aACE,8BAIJ,aACE,gBACA,crCnvBkB,yBqCqvBlB,iBACA,gCAEA,aACE,qBACA,iHAEA,aAGE,mCAIJ,arCjxBM,6BqCwxBR,YACE,2BACA,6BACA,mCAEA,kBACE,gFAGF,YAEE,cACA,sBACA,YACA,crCxxBgB,mLqC2xBhB,kBAEE,gBACA,uBACA,sCAIJ,aACE,6BACA,4CAEA,arCzxBgB,iBqC2xBd,gBACA,wCAIJ,aACE,sBACA,WACA,aACA,qBACA,crCnzBgB,WqC0zBxB,kBAGE,0BAFA,eACA,uBASA,CARA,eAGF,oBACE,gBACA,CAEA,qBACA,oBAGF,YACE,eACA,CACA,kBACA,wBAEA,qBACE,cACA,mBACA,aACA,0FAGF,kBAEE,kBACA,YACA,6CAGF,QACE,SACA,+CAEA,aACE,sEAGF,uBACE,yDAGF,arCv3BY,8CqC43Bd,qBACE,aACA,WrC/3BI,cqCo4BR,iBACE,kkECr4BF,kIACE,CADF,sIACE,uIAYA,aAEE,yIAGF,aAEE,qIAGF,aAEE,6IAGF,aAEE,UChCJ,aACE,gCAEA,gBACE,eACA,mBACA,+BAGF,cACE,iBACA,8CAGF,aACE,kBACA,wBAGF,gBACE,iCAGF,aACE,kBACA,uCAGF,oBACE,gDAGF,SACE,YACA,8BAGF,cACE,iBACA,mEAGF,aACE,kBACA,2DAGF,cAEE,gBACA,mFAGF,cACE,gBACA,+BAGF,eACE,2EAGF,UAEE,mCAGF,aACE,iBACA,yBAGF,kBACE,kBACA,4BAGF,UACE,UACA,wBAGF,aACE,kCAGF,MACE,WACA,cACA,mBACA,2CAGF,aACE,iBACA,0CAGF,gBACE,eACA,mCAGF,WACE,sCAGF,gBACE,gBACA,yCAGF,UACE,iCAGF,aACE,iBACA,+BAGF,UACE,0BAGF,gBACE,eACA,UAGA,WACA,yCAGF,iBACE,mBACA,4GAGF,iBAEE,gBACA,uCAGF,kBACE,eACA,2BAGF,aACE,kBACA,wCAGF,SACE,YACA,yDAGF,SACE,WACA,CAKA,oFAGF,UACE,OACA,uGAGF,UAEE,gBACA,uCAIA,cACE,iBACA,kEAEA,cACE,gBACA,qCAKN,WACE,eACA,iBACA,uCAGF,WACE,sCAGF,aACE,kBACA,0CAGF,gBACE,eACA,uDAGF,gBACE,2CAGF,cACE,iBACA,YACA,yEAGF,aAEE,iBACA,iBAGF,wBACE,iBAGF,SACE,oBACA,yBAGF,aACE,8EAGF,cAEE,gBACA,oDAGF,cACE,mBACA,gEAGF,iBACE,gBACA,CAMA,8KAGF,SACE,QACA,yDAGF,kBACE,eACA,uDAGF,kBACE,gBACA,qDAGF,SACE,QACA,8FAGF,cAEE,mBACA,4CAGF,UACE,SACA,kDAEA,UACE,OACA,+DACA,8BAIJ,sXACE,uCAGF,gBAEE,kCAGF,cACE,iBACA,gDAGF,UACE,UACA,gEAGF,aACE,uDAGF,WACE,WACA,uDAGF,UACE,WACA,uDAGF,UACE,WACA,kDAGF,MACE,0CAGF,iBACE,yBACA,qDAGF,cACE,iBACA,qCAGF,kCACE,gBAEE,kBACA,2DAEA,gBACE,mBACA,uEAKF,gBAEE,kBACA,gFAKN,cAEE,gBACA,6CAKE,eACE,eACA,sDAIJ,aACE,kBACA,4DAKF,cACE,gBACA,8DAGF,gBACE,eACA,mCAIJ,aACE,kBACA,iBACA,kCAGF,WACE,mCAGF,WACE,oCAGF,cACE,gBACA,gFAGF,cACE,mBACA,+DAGF,SACE,QACA,sBChbJ,YACE,eACA,CACA,kBACA,0BAEA,qBACE,iBACA,cACA,mBACA,yDAEA,YAEE,mBACA,kBACA,sBACA,YACA,4BAGF,oBACE,cACA,cACA,qGAEA,kBAGE,sDAKN,iBAEE,gBACA,eACA,iBACA,WxCrCI,uBwCuCJ,mBACA,iBACA,4BAGF,cACE,6BAGF,cACE,cxCjCoB,kBwCmCpB,gBACA,qBAIJ,YACE,eACA,cACA,yBAEA,gBACE,mBACA,6BAEA,aACE,sCAIJ,axCrDwB,gBwCuDtB,qBACA,0D","file":"flavours/glitch/common.css","sourcesContent":["html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:\"\";content:none}table{border-collapse:collapse;border-spacing:0}html{scrollbar-color:#192432 rgba(0,0,0,.1)}::-webkit-scrollbar{width:12px;height:12px}::-webkit-scrollbar-thumb{background:#192432;border:0px none #fff;border-radius:50px}::-webkit-scrollbar-thumb:hover{background:#1c2938}::-webkit-scrollbar-thumb:active{background:#192432}::-webkit-scrollbar-track{border:0px none #fff;border-radius:0;background:rgba(0,0,0,.1)}::-webkit-scrollbar-track:hover{background:#121a24}::-webkit-scrollbar-track:active{background:#121a24}::-webkit-scrollbar-corner{background:transparent}body{font-family:sans-serif,sans-serif;background:#06090c;font-size:13px;line-height:18px;font-weight:400;color:#fff;text-rendering:optimizelegibility;font-feature-settings:\"kern\";text-size-adjust:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-tap-highlight-color:transparent}body.system-font{font-family:system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"Oxygen\",\"Ubuntu\",\"Cantarell\",\"Fira Sans\",\"Droid Sans\",\"Helvetica Neue\",sans-serif,sans-serif}body.app-body{padding:0}body.app-body.layout-single-column{height:auto;min-height:100vh;overflow-y:scroll}body.app-body.layout-multiple-columns{position:absolute;width:100%;height:100%}body.app-body.with-modals--active{overflow-y:hidden}body.lighter{background:#121a24}body.with-modals{overflow-x:hidden;overflow-y:scroll}body.with-modals--active{overflow-y:hidden}body.embed{background:#192432;margin:0;padding-bottom:0}body.embed .container{position:absolute;width:100%;height:100%;overflow:hidden}body.admin{background:#0b1016;padding:0}body.error{position:absolute;text-align:center;color:#9baec8;background:#121a24;width:100%;height:100%;padding:0;display:flex;justify-content:center;align-items:center}body.error .dialog{vertical-align:middle;margin:20px}body.error .dialog img{display:block;max-width:470px;width:100%;height:auto;margin-top:-120px}body.error .dialog h1{font-size:20px;line-height:28px;font-weight:400}button{font-family:inherit;cursor:pointer}button:focus{outline:none}.app-holder,.app-holder>div{display:flex;width:100%;align-items:center;justify-content:center;outline:0 !important}.layout-single-column .app-holder,.layout-single-column .app-holder>div{min-height:100vh}.layout-multiple-columns .app-holder,.layout-multiple-columns .app-holder>div{height:100%}.container-alt{width:700px;margin:0 auto;margin-top:40px}@media screen and (max-width: 740px){.container-alt{width:100%;margin:0}}.logo-container{margin:100px auto 50px}@media screen and (max-width: 500px){.logo-container{margin:40px auto 0}}.logo-container h1{display:flex;justify-content:center;align-items:center}.logo-container h1 svg{fill:#fff;height:42px;margin-right:10px}.logo-container h1 a{display:flex;justify-content:center;align-items:center;color:#fff;text-decoration:none;outline:0;padding:12px 16px;line-height:32px;font-family:sans-serif,sans-serif;font-weight:500;font-size:14px}.compose-standalone .compose-form{width:400px;margin:0 auto;padding:20px 0;margin-top:40px;box-sizing:border-box}@media screen and (max-width: 400px){.compose-standalone .compose-form{width:100%;margin-top:0;padding:20px}}.account-header{width:400px;margin:0 auto;display:flex;font-size:13px;line-height:18px;box-sizing:border-box;padding:20px 0;padding-bottom:0;margin-bottom:-30px;margin-top:40px}@media screen and (max-width: 440px){.account-header{width:100%;margin:0;margin-bottom:10px;padding:20px;padding-bottom:0}}.account-header .avatar{width:40px;height:40px;width:40px;height:40px;background-size:40px 40px;margin-right:8px}.account-header .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px;border-radius:8%;background-position:50%;background-clip:padding-box}.account-header .name{flex:1 1 auto;color:#d9e1e8;width:calc(100% - 88px)}.account-header .name .username{display:block;font-weight:500;text-overflow:ellipsis;overflow:hidden}.account-header .logout-link{display:block;font-size:32px;line-height:40px;margin-left:8px}.grid-3{display:grid;grid-gap:10px;grid-template-columns:3fr 1fr;grid-auto-columns:25%;grid-auto-rows:max-content}.grid-3 .column-0{grid-column:1/3;grid-row:1}.grid-3 .column-1{grid-column:1;grid-row:2}.grid-3 .column-2{grid-column:2;grid-row:2}.grid-3 .column-3{grid-column:1/3;grid-row:3}@media screen and (max-width: 415px){.grid-3{grid-gap:0;grid-template-columns:minmax(0, 100%)}.grid-3 .column-0{grid-column:1}.grid-3 .column-1{grid-column:1;grid-row:3}.grid-3 .column-2{grid-column:1;grid-row:2}.grid-3 .column-3{grid-column:1;grid-row:4}}.grid-4{display:grid;grid-gap:10px;grid-template-columns:repeat(4, minmax(0, 1fr));grid-auto-columns:25%;grid-auto-rows:max-content}.grid-4 .column-0{grid-column:1/5;grid-row:1}.grid-4 .column-1{grid-column:1/4;grid-row:2}.grid-4 .column-2{grid-column:4;grid-row:2}.grid-4 .column-3{grid-column:2/5;grid-row:3}.grid-4 .column-4{grid-column:1;grid-row:3}.grid-4 .landing-page__call-to-action{min-height:100%}.grid-4 .flash-message{margin-bottom:10px}@media screen and (max-width: 738px){.grid-4{grid-template-columns:minmax(0, 50%) minmax(0, 50%)}.grid-4 .landing-page__call-to-action{padding:20px;display:flex;align-items:center;justify-content:center}.grid-4 .row__information-board{width:100%;justify-content:center;align-items:center}.grid-4 .row__mascot{display:none}}@media screen and (max-width: 415px){.grid-4{grid-gap:0;grid-template-columns:minmax(0, 100%)}.grid-4 .column-0{grid-column:1}.grid-4 .column-1{grid-column:1;grid-row:3}.grid-4 .column-2{grid-column:1;grid-row:2}.grid-4 .column-3{grid-column:1;grid-row:5}.grid-4 .column-4{grid-column:1;grid-row:4}}@media screen and (max-width: 415px){.public-layout{padding-top:48px}}.public-layout .container{max-width:960px}@media screen and (max-width: 415px){.public-layout .container{padding:0}}.public-layout .header{background:#202e3f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;height:48px;margin:10px 0;display:flex;align-items:stretch;justify-content:center;flex-wrap:nowrap;overflow:hidden}@media screen and (max-width: 415px){.public-layout .header{position:fixed;width:100%;top:0;left:0;margin:0;border-radius:0;box-shadow:none;z-index:110}}.public-layout .header>div{flex:1 1 33.3%;min-height:1px}.public-layout .header .nav-left{display:flex;align-items:stretch;justify-content:flex-start;flex-wrap:nowrap}.public-layout .header .nav-center{display:flex;align-items:stretch;justify-content:center;flex-wrap:nowrap}.public-layout .header .nav-right{display:flex;align-items:stretch;justify-content:flex-end;flex-wrap:nowrap}.public-layout .header .brand{display:block;padding:15px}.public-layout .header .brand svg{display:block;height:18px;width:auto;position:relative;bottom:-2px;fill:#fff}@media screen and (max-width: 415px){.public-layout .header .brand svg{height:20px}}.public-layout .header .brand:hover,.public-layout .header .brand:focus,.public-layout .header .brand:active{background:#26374d}.public-layout .header .nav-link{display:flex;align-items:center;padding:0 1rem;font-size:12px;font-weight:500;text-decoration:none;color:#9baec8;white-space:nowrap;text-align:center}.public-layout .header .nav-link:hover,.public-layout .header .nav-link:focus,.public-layout .header .nav-link:active{text-decoration:underline;color:#fff}@media screen and (max-width: 550px){.public-layout .header .nav-link.optional{display:none}}.public-layout .header .nav-button{background:#2d415a;margin:8px;margin-left:0;border-radius:4px}.public-layout .header .nav-button:hover,.public-layout .header .nav-button:focus,.public-layout .header .nav-button:active{text-decoration:none;background:#344b68}.public-layout .grid{display:grid;grid-gap:10px;grid-template-columns:minmax(300px, 3fr) minmax(298px, 1fr);grid-auto-columns:25%;grid-auto-rows:max-content}.public-layout .grid .column-0{grid-row:1;grid-column:1}.public-layout .grid .column-1{grid-row:1;grid-column:2}@media screen and (max-width: 600px){.public-layout .grid{grid-template-columns:100%;grid-gap:0}.public-layout .grid .column-1{display:none}}.public-layout .directory__card{border-radius:4px}@media screen and (max-width: 415px){.public-layout .directory__card{border-radius:0}}@media screen and (max-width: 415px){.public-layout .page-header{border-bottom:0}}.public-layout .public-account-header{overflow:hidden;margin-bottom:10px;box-shadow:0 0 15px rgba(0,0,0,.2)}.public-layout .public-account-header.inactive{opacity:.5}.public-layout .public-account-header.inactive .public-account-header__image,.public-layout .public-account-header.inactive .avatar{filter:grayscale(100%)}.public-layout .public-account-header.inactive .logo-button{background-color:#d9e1e8}.public-layout .public-account-header__image{border-radius:4px 4px 0 0;overflow:hidden;height:300px;position:relative;background:#000}.public-layout .public-account-header__image::after{content:\"\";display:block;position:absolute;width:100%;height:100%;box-shadow:inset 0 -1px 1px 1px rgba(0,0,0,.15);top:0;left:0}.public-layout .public-account-header__image img{object-fit:cover;display:block;width:100%;height:100%;margin:0;border-radius:4px 4px 0 0}@media screen and (max-width: 600px){.public-layout .public-account-header__image{height:200px}}.public-layout .public-account-header--no-bar{margin-bottom:0}.public-layout .public-account-header--no-bar .public-account-header__image,.public-layout .public-account-header--no-bar .public-account-header__image img{border-radius:4px}@media screen and (max-width: 415px){.public-layout .public-account-header--no-bar .public-account-header__image,.public-layout .public-account-header--no-bar .public-account-header__image img{border-radius:0}}@media screen and (max-width: 415px){.public-layout .public-account-header{margin-bottom:0;box-shadow:none}.public-layout .public-account-header__image::after{display:none}.public-layout .public-account-header__image,.public-layout .public-account-header__image img{border-radius:0}}.public-layout .public-account-header__bar{position:relative;margin-top:-80px;display:flex;justify-content:flex-start}.public-layout .public-account-header__bar::before{content:\"\";display:block;background:#192432;position:absolute;bottom:0;left:0;right:0;height:60px;border-radius:0 0 4px 4px;z-index:-1}.public-layout .public-account-header__bar .avatar{display:block;width:120px;height:120px;width:120px;height:120px;background-size:120px 120px;padding-left:16px;flex:0 0 auto}.public-layout .public-account-header__bar .avatar img{display:block;width:100%;height:100%;margin:0;border-radius:50%;border:4px solid #192432;background:#040609;border-radius:8%;background-position:50%;background-clip:padding-box}@media screen and (max-width: 600px){.public-layout .public-account-header__bar{margin-top:0;background:#192432;border-radius:0 0 4px 4px;padding:5px}.public-layout .public-account-header__bar::before{display:none}.public-layout .public-account-header__bar .avatar{width:48px;height:48px;width:48px;height:48px;background-size:48px 48px;padding:7px 0;padding-left:10px}.public-layout .public-account-header__bar .avatar img{border:0;border-radius:4px;border-radius:8%;background-position:50%;background-clip:padding-box}}@media screen and (max-width: 600px)and (max-width: 360px){.public-layout .public-account-header__bar .avatar{display:none}}@media screen and (max-width: 415px){.public-layout .public-account-header__bar{border-radius:0}}@media screen and (max-width: 600px){.public-layout .public-account-header__bar{flex-wrap:wrap}}.public-layout .public-account-header__tabs{flex:1 1 auto;margin-left:20px}.public-layout .public-account-header__tabs__name{padding-top:20px;padding-bottom:8px}.public-layout .public-account-header__tabs__name h1{font-size:20px;line-height:27px;color:#fff;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-shadow:1px 1px 1px #000}.public-layout .public-account-header__tabs__name h1 small{display:block;font-size:14px;color:#fff;font-weight:400;overflow:hidden;text-overflow:ellipsis}@media screen and (max-width: 600px){.public-layout .public-account-header__tabs{margin-left:15px;display:flex;justify-content:space-between;align-items:center}.public-layout .public-account-header__tabs__name{padding-top:0;padding-bottom:0}.public-layout .public-account-header__tabs__name h1{font-size:16px;line-height:24px;text-shadow:none}.public-layout .public-account-header__tabs__name h1 small{color:#9baec8}}.public-layout .public-account-header__tabs__tabs{display:flex;justify-content:flex-start;align-items:stretch;height:58px}.public-layout .public-account-header__tabs__tabs .details-counters{display:flex;flex-direction:row;min-width:300px}@media screen and (max-width: 600px){.public-layout .public-account-header__tabs__tabs .details-counters{display:none}}.public-layout .public-account-header__tabs__tabs .counter{min-width:33.3%;box-sizing:border-box;flex:0 0 auto;color:#9baec8;padding:10px;border-right:1px solid #192432;cursor:default;text-align:center;position:relative}.public-layout .public-account-header__tabs__tabs .counter a{display:block}.public-layout .public-account-header__tabs__tabs .counter:last-child{border-right:0}.public-layout .public-account-header__tabs__tabs .counter::after{display:block;content:\"\";position:absolute;bottom:0;left:0;width:100%;border-bottom:4px solid #9baec8;opacity:.5;transition:all 400ms ease}.public-layout .public-account-header__tabs__tabs .counter.active::after{border-bottom:4px solid #d8a070;opacity:1}.public-layout .public-account-header__tabs__tabs .counter.active.inactive::after{border-bottom-color:#d9e1e8}.public-layout .public-account-header__tabs__tabs .counter:hover::after{opacity:1;transition-duration:100ms}.public-layout .public-account-header__tabs__tabs .counter a{text-decoration:none;color:inherit}.public-layout .public-account-header__tabs__tabs .counter .counter-label{font-size:12px;display:block}.public-layout .public-account-header__tabs__tabs .counter .counter-number{font-weight:500;font-size:18px;margin-bottom:5px;color:#fff;font-family:sans-serif,sans-serif}.public-layout .public-account-header__tabs__tabs .spacer{flex:1 1 auto;height:1px}.public-layout .public-account-header__tabs__tabs__buttons{padding:7px 8px}.public-layout .public-account-header__extra{display:none;margin-top:4px}.public-layout .public-account-header__extra .public-account-bio{border-radius:0;box-shadow:none;background:transparent;margin:0 -5px}.public-layout .public-account-header__extra .public-account-bio .account__header__fields{border-top:1px solid #26374d}.public-layout .public-account-header__extra .public-account-bio .roles{display:none}.public-layout .public-account-header__extra__links{margin-top:-15px;font-size:14px;color:#9baec8}.public-layout .public-account-header__extra__links a{display:inline-block;color:#9baec8;text-decoration:none;padding:15px;font-weight:500}.public-layout .public-account-header__extra__links a strong{font-weight:700;color:#fff}@media screen and (max-width: 600px){.public-layout .public-account-header__extra{display:block;flex:100%}}.public-layout .account__section-headline{border-radius:4px 4px 0 0}@media screen and (max-width: 415px){.public-layout .account__section-headline{border-radius:0}}.public-layout .detailed-status__meta{margin-top:25px}.public-layout .public-account-bio{background:#202e3f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;overflow:hidden;margin-bottom:10px}@media screen and (max-width: 415px){.public-layout .public-account-bio{box-shadow:none;margin-bottom:0;border-radius:0}}.public-layout .public-account-bio .account__header__fields{margin:0;border-top:0}.public-layout .public-account-bio .account__header__fields a{color:#e1b590}.public-layout .public-account-bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.public-layout .public-account-bio .account__header__fields .verified a{color:#79bd9a}.public-layout .public-account-bio .account__header__content{padding:20px;padding-bottom:0;color:#fff}.public-layout .public-account-bio__extra,.public-layout .public-account-bio .roles{padding:20px;font-size:14px;color:#9baec8}.public-layout .public-account-bio .roles{padding-bottom:0}.public-layout .directory__list{display:grid;grid-gap:10px;grid-template-columns:minmax(0, 50%) minmax(0, 50%)}@media screen and (max-width: 415px){.public-layout .directory__list{display:block}}.public-layout .directory__list .icon-button{font-size:18px}.public-layout .directory__card{margin-bottom:0}.public-layout .card-grid{display:flex;flex-wrap:wrap;min-width:100%;margin:0 -5px}.public-layout .card-grid>div{box-sizing:border-box;flex:1 0 auto;width:300px;padding:0 5px;margin-bottom:10px;max-width:33.333%}@media screen and (max-width: 900px){.public-layout .card-grid>div{max-width:50%}}@media screen and (max-width: 600px){.public-layout .card-grid>div{max-width:100%}}@media screen and (max-width: 415px){.public-layout .card-grid{margin:0;border-top:1px solid #202e3f}.public-layout .card-grid>div{width:100%;padding:0;margin-bottom:0;border-bottom:1px solid #202e3f}.public-layout .card-grid>div:last-child{border-bottom:0}.public-layout .card-grid>div .card__bar{background:#121a24}.public-layout .card-grid>div .card__bar:hover,.public-layout .card-grid>div .card__bar:active,.public-layout .card-grid>div .card__bar:focus{background:#192432}}.no-list{list-style:none}.no-list li{display:inline-block;margin:0 5px}.recovery-codes{list-style:none;margin:0 auto}.recovery-codes li{font-size:125%;line-height:1.5;letter-spacing:1px}.modal-layout{background:#121a24 url('data:image/svg+xml;utf8,') repeat-x bottom fixed;display:flex;flex-direction:column;height:100vh;padding:0}.modal-layout__mastodon{display:flex;flex:1;flex-direction:column;justify-content:flex-end}.modal-layout__mastodon>*{flex:1;max-height:235px}@media screen and (max-width: 600px){.account-header{margin-top:0}}.public-layout .footer{text-align:left;padding-top:20px;padding-bottom:60px;font-size:12px;color:#4c6d98}@media screen and (max-width: 415px){.public-layout .footer{padding-left:20px;padding-right:20px}}.public-layout .footer .grid{display:grid;grid-gap:10px;grid-template-columns:1fr 1fr 2fr 1fr 1fr}.public-layout .footer .grid .column-0{grid-column:1;grid-row:1;min-width:0}.public-layout .footer .grid .column-1{grid-column:2;grid-row:1;min-width:0}.public-layout .footer .grid .column-2{grid-column:3;grid-row:1;min-width:0;text-align:center}.public-layout .footer .grid .column-2 h4 a{color:#4c6d98}.public-layout .footer .grid .column-3{grid-column:4;grid-row:1;min-width:0}.public-layout .footer .grid .column-4{grid-column:5;grid-row:1;min-width:0}@media screen and (max-width: 690px){.public-layout .footer .grid{grid-template-columns:1fr 2fr 1fr}.public-layout .footer .grid .column-0,.public-layout .footer .grid .column-1{grid-column:1}.public-layout .footer .grid .column-1{grid-row:2}.public-layout .footer .grid .column-2{grid-column:2}.public-layout .footer .grid .column-3,.public-layout .footer .grid .column-4{grid-column:3}.public-layout .footer .grid .column-4{grid-row:2}}@media screen and (max-width: 600px){.public-layout .footer .grid .column-1{display:block}}@media screen and (max-width: 415px){.public-layout .footer .grid .column-0,.public-layout .footer .grid .column-1,.public-layout .footer .grid .column-3,.public-layout .footer .grid .column-4{display:none}}.public-layout .footer h4{text-transform:uppercase;font-weight:700;margin-bottom:8px;color:#9baec8}.public-layout .footer h4 a{color:inherit;text-decoration:none}.public-layout .footer ul a{text-decoration:none;color:#4c6d98}.public-layout .footer ul a:hover,.public-layout .footer ul a:active,.public-layout .footer ul a:focus{text-decoration:underline}.public-layout .footer .brand svg{display:block;height:36px;width:auto;margin:0 auto;fill:#4c6d98}.public-layout .footer .brand:hover svg,.public-layout .footer .brand:focus svg,.public-layout .footer .brand:active svg{fill:#5377a5}.compact-header h1{font-size:24px;line-height:28px;color:#9baec8;font-weight:500;margin-bottom:20px;padding:0 10px;word-wrap:break-word}@media screen and (max-width: 740px){.compact-header h1{text-align:center;padding:20px 10px 0}}.compact-header h1 a{color:inherit;text-decoration:none}.compact-header h1 small{font-weight:400;color:#d9e1e8}.compact-header h1 img{display:inline-block;margin-bottom:-5px;margin-right:15px;width:36px;height:36px}.hero-widget{margin-bottom:10px;box-shadow:0 0 15px rgba(0,0,0,.2)}.hero-widget__img{width:100%;position:relative;overflow:hidden;border-radius:4px 4px 0 0;background:#000}.hero-widget__img img{object-fit:cover;display:block;width:100%;height:100%;margin:0;border-radius:4px 4px 0 0}.hero-widget__text{background:#121a24;padding:20px;border-radius:0 0 4px 4px;font-size:15px;color:#9baec8;line-height:20px;word-wrap:break-word;font-weight:400}.hero-widget__text .emojione{width:20px;height:20px;margin:-3px 0 0}.hero-widget__text p{margin-bottom:20px}.hero-widget__text p:last-child{margin-bottom:0}.hero-widget__text em{display:inline;margin:0;padding:0;font-weight:700;background:transparent;font-family:inherit;font-size:inherit;line-height:inherit;color:#bcc9da}.hero-widget__text a{color:#d9e1e8;text-decoration:none}.hero-widget__text a:hover{text-decoration:underline}@media screen and (max-width: 415px){.hero-widget{display:none}}.endorsements-widget{margin-bottom:10px;padding-bottom:10px}.endorsements-widget h4{padding:10px;text-transform:uppercase;font-weight:700;font-size:13px;color:#9baec8}.endorsements-widget .account{padding:10px 0}.endorsements-widget .account:last-child{border-bottom:0}.endorsements-widget .account .account__display-name{display:flex;align-items:center}.endorsements-widget .account .account__avatar{width:44px;height:44px;background-size:44px 44px}.endorsements-widget .trends__item{padding:10px}.trends-widget h4{color:#9baec8}.box-widget{padding:20px;border-radius:4px;background:#121a24;box-shadow:0 0 15px rgba(0,0,0,.2)}.placeholder-widget{padding:16px;border-radius:4px;border:2px dashed #3e5a7c;text-align:center;color:#9baec8;margin-bottom:10px}.contact-widget{min-height:100%;font-size:15px;color:#9baec8;line-height:20px;word-wrap:break-word;font-weight:400;padding:0}.contact-widget h4{padding:10px;text-transform:uppercase;font-weight:700;font-size:13px;color:#9baec8}.contact-widget .account{border-bottom:0;padding:10px 0;padding-top:5px}.contact-widget>a{display:inline-block;padding:10px;padding-top:0;color:#9baec8;text-decoration:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.contact-widget>a:hover,.contact-widget>a:focus,.contact-widget>a:active{text-decoration:underline}.moved-account-widget{padding:15px;padding-bottom:20px;border-radius:4px;background:#121a24;box-shadow:0 0 15px rgba(0,0,0,.2);color:#d9e1e8;font-weight:400;margin-bottom:10px}.moved-account-widget strong,.moved-account-widget a{font-weight:500}.moved-account-widget strong:lang(ja),.moved-account-widget a:lang(ja){font-weight:700}.moved-account-widget strong:lang(ko),.moved-account-widget a:lang(ko){font-weight:700}.moved-account-widget strong:lang(zh-CN),.moved-account-widget a:lang(zh-CN){font-weight:700}.moved-account-widget strong:lang(zh-HK),.moved-account-widget a:lang(zh-HK){font-weight:700}.moved-account-widget strong:lang(zh-TW),.moved-account-widget a:lang(zh-TW){font-weight:700}.moved-account-widget a{color:inherit;text-decoration:underline}.moved-account-widget a.mention{text-decoration:none}.moved-account-widget a.mention span{text-decoration:none}.moved-account-widget a.mention:focus,.moved-account-widget a.mention:hover,.moved-account-widget a.mention:active{text-decoration:none}.moved-account-widget a.mention:focus span,.moved-account-widget a.mention:hover span,.moved-account-widget a.mention:active span{text-decoration:underline}.moved-account-widget__message{margin-bottom:15px}.moved-account-widget__message .fa{margin-right:5px;color:#9baec8}.moved-account-widget__card .detailed-status__display-avatar{position:relative;cursor:pointer}.moved-account-widget__card .detailed-status__display-name{margin-bottom:0;text-decoration:none}.moved-account-widget__card .detailed-status__display-name span{font-weight:400}.memoriam-widget{padding:20px;border-radius:4px;background:#000;box-shadow:0 0 15px rgba(0,0,0,.2);font-size:14px;color:#9baec8;margin-bottom:10px}.page-header{background:#202e3f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;padding:60px 15px;text-align:center;margin:10px 0}.page-header h1{color:#fff;font-size:36px;line-height:1.1;font-weight:700;margin-bottom:10px}.page-header p{font-size:15px;color:#9baec8}@media screen and (max-width: 415px){.page-header{margin-top:0;background:#192432}.page-header h1{font-size:24px}}.directory{background:#121a24;border-radius:4px;box-shadow:0 0 15px rgba(0,0,0,.2)}.directory__tag{box-sizing:border-box;margin-bottom:10px}.directory__tag>a,.directory__tag>div{display:flex;align-items:center;justify-content:space-between;background:#121a24;border-radius:4px;padding:15px;text-decoration:none;color:inherit;box-shadow:0 0 15px rgba(0,0,0,.2)}.directory__tag>a:hover,.directory__tag>a:active,.directory__tag>a:focus{background:#202e3f}.directory__tag.active>a{background:#d8a070;cursor:default}.directory__tag.disabled>div{opacity:.5;cursor:default}.directory__tag h4{flex:1 1 auto;font-size:18px;font-weight:700;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.directory__tag h4 .fa{color:#9baec8}.directory__tag h4 small{display:block;font-weight:400;font-size:15px;margin-top:8px;color:#9baec8}.directory__tag.active h4,.directory__tag.active h4 .fa,.directory__tag.active h4 small{color:#fff}.directory__tag .avatar-stack{flex:0 0 auto;width:120px}.directory__tag.active .avatar-stack .account__avatar{border-color:#d8a070}.avatar-stack{display:flex;justify-content:flex-end}.avatar-stack .account__avatar{flex:0 0 auto;width:36px;height:36px;border-radius:50%;position:relative;margin-left:-10px;background:#040609;border:2px solid #121a24}.avatar-stack .account__avatar:nth-child(1){z-index:1}.avatar-stack .account__avatar:nth-child(2){z-index:2}.avatar-stack .account__avatar:nth-child(3){z-index:3}.accounts-table{width:100%}.accounts-table .account{padding:0;border:0}.accounts-table strong{font-weight:700}.accounts-table thead th{text-align:center;text-transform:uppercase;color:#9baec8;font-weight:700;padding:10px}.accounts-table thead th:first-child{text-align:left}.accounts-table tbody td{padding:15px 0;vertical-align:middle;border-bottom:1px solid #202e3f}.accounts-table tbody tr:last-child td{border-bottom:0}.accounts-table__count{width:120px;text-align:center;font-size:15px;font-weight:500;color:#fff}.accounts-table__count small{display:block;color:#9baec8;font-weight:400;font-size:14px}.accounts-table__comment{width:50%;vertical-align:initial !important}@media screen and (max-width: 415px){.accounts-table tbody td.optional{display:none}}@media screen and (max-width: 415px){.moved-account-widget,.memoriam-widget,.box-widget,.contact-widget,.landing-page__information.contact-widget,.directory,.page-header{margin-bottom:0;box-shadow:none;border-radius:0}}.statuses-grid{min-height:600px}@media screen and (max-width: 640px){.statuses-grid{width:100% !important}}.statuses-grid__item{width:313.3333333333px}@media screen and (max-width: 1255px){.statuses-grid__item{width:306.6666666667px}}@media screen and (max-width: 640px){.statuses-grid__item{width:100%}}@media screen and (max-width: 415px){.statuses-grid__item{width:100vw}}.statuses-grid .detailed-status{border-radius:4px}@media screen and (max-width: 415px){.statuses-grid .detailed-status{border-top:1px solid #2d415a}}.statuses-grid .detailed-status.compact .detailed-status__meta{margin-top:15px}.statuses-grid .detailed-status.compact .status__content{font-size:15px;line-height:20px}.statuses-grid .detailed-status.compact .status__content .emojione{width:20px;height:20px;margin:-3px 0 0}.statuses-grid .detailed-status.compact .status__content .status__content__spoiler-link{line-height:20px;margin:0}.statuses-grid .detailed-status.compact .media-gallery,.statuses-grid .detailed-status.compact .status-card,.statuses-grid .detailed-status.compact .video-player{margin-top:15px}.notice-widget{margin-bottom:10px;color:#9baec8}.notice-widget p{margin-bottom:10px}.notice-widget p:last-child{margin-bottom:0}.notice-widget a{font-size:14px;line-height:20px}.notice-widget a,.placeholder-widget a{text-decoration:none;font-weight:500;color:#d8a070}.notice-widget a:hover,.notice-widget a:focus,.notice-widget a:active,.placeholder-widget a:hover,.placeholder-widget a:focus,.placeholder-widget a:active{text-decoration:underline}.table-of-contents{background:#0b1016;min-height:100%;font-size:14px;border-radius:4px}.table-of-contents li a{display:block;font-weight:500;padding:15px;overflow:hidden;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-decoration:none;color:#fff;border-bottom:1px solid #192432}.table-of-contents li a:hover,.table-of-contents li a:focus,.table-of-contents li a:active{text-decoration:underline}.table-of-contents li:last-child a{border-bottom:0}.table-of-contents li ul{padding-left:20px;border-bottom:1px solid #192432}code{font-family:monospace,monospace;font-weight:400}.form-container{max-width:400px;padding:20px;margin:0 auto}.simple_form .input{margin-bottom:15px;overflow:hidden}.simple_form .input.hidden{margin:0}.simple_form .input.radio_buttons .radio{margin-bottom:15px}.simple_form .input.radio_buttons .radio:last-child{margin-bottom:0}.simple_form .input.radio_buttons .radio>label{position:relative;padding-left:28px}.simple_form .input.radio_buttons .radio>label input{position:absolute;top:-2px;left:0}.simple_form .input.boolean{position:relative;margin-bottom:0}.simple_form .input.boolean .label_input>label{font-family:inherit;font-size:14px;padding-top:5px;color:#fff;display:block;width:auto}.simple_form .input.boolean .label_input,.simple_form .input.boolean .hint{padding-left:28px}.simple_form .input.boolean .label_input__wrapper{position:static}.simple_form .input.boolean label.checkbox{position:absolute;top:2px;left:0}.simple_form .input.boolean label a{color:#d8a070;text-decoration:underline}.simple_form .input.boolean label a:hover,.simple_form .input.boolean label a:active,.simple_form .input.boolean label a:focus{text-decoration:none}.simple_form .input.boolean .recommended{position:absolute;margin:0 4px;margin-top:-2px}.simple_form .row{display:flex;margin:0 -5px}.simple_form .row .input{box-sizing:border-box;flex:1 1 auto;width:50%;padding:0 5px}.simple_form .hint{color:#9baec8}.simple_form .hint a{color:#d8a070}.simple_form .hint code{border-radius:3px;padding:.2em .4em;background:#000}.simple_form span.hint{display:block;font-size:12px;margin-top:4px}.simple_form p.hint{margin-bottom:15px;color:#9baec8}.simple_form p.hint.subtle-hint{text-align:center;font-size:12px;line-height:18px;margin-top:15px;margin-bottom:0}.simple_form .card{margin-bottom:15px}.simple_form strong{font-weight:500}.simple_form strong:lang(ja){font-weight:700}.simple_form strong:lang(ko){font-weight:700}.simple_form strong:lang(zh-CN){font-weight:700}.simple_form strong:lang(zh-HK){font-weight:700}.simple_form strong:lang(zh-TW){font-weight:700}.simple_form .input.with_floating_label .label_input{display:flex}.simple_form .input.with_floating_label .label_input>label{font-family:inherit;font-size:14px;color:#fff;font-weight:500;min-width:150px;flex:0 0 auto}.simple_form .input.with_floating_label .label_input input,.simple_form .input.with_floating_label .label_input select{flex:1 1 auto}.simple_form .input.with_floating_label.select .hint{margin-top:6px;margin-left:150px}.simple_form .input.with_label .label_input>label{font-family:inherit;font-size:14px;color:#fff;display:block;margin-bottom:8px;word-wrap:break-word;font-weight:500}.simple_form .input.with_label .hint{margin-top:6px}.simple_form .input.with_label ul{flex:390px}.simple_form .input.with_block_label{max-width:none}.simple_form .input.with_block_label>label{font-family:inherit;font-size:16px;color:#fff;display:block;font-weight:500;padding-top:5px}.simple_form .input.with_block_label .hint{margin-bottom:15px}.simple_form .input.with_block_label ul{columns:2}.simple_form .required abbr{text-decoration:none;color:#e87487}.simple_form .fields-group{margin-bottom:25px}.simple_form .fields-group .input:last-child{margin-bottom:0}.simple_form .fields-row{display:flex;margin:0 -10px;padding-top:5px;margin-bottom:25px}.simple_form .fields-row .input{max-width:none}.simple_form .fields-row__column{box-sizing:border-box;padding:0 10px;flex:1 1 auto;min-height:1px}.simple_form .fields-row__column-6{max-width:50%}.simple_form .fields-row__column .actions{margin-top:27px}.simple_form .fields-row .fields-group:last-child,.simple_form .fields-row .fields-row__column.fields-group{margin-bottom:0}@media screen and (max-width: 600px){.simple_form .fields-row{display:block;margin-bottom:0}.simple_form .fields-row__column{max-width:none}.simple_form .fields-row .fields-group:last-child,.simple_form .fields-row .fields-row__column.fields-group,.simple_form .fields-row .fields-row__column{margin-bottom:25px}}.simple_form .input.radio_buttons .radio label{margin-bottom:5px;font-family:inherit;font-size:14px;color:#fff;display:block;width:auto}.simple_form .check_boxes .checkbox label{font-family:inherit;font-size:14px;color:#fff;display:inline-block;width:auto;position:relative;padding-top:5px;padding-left:25px;flex:1 1 auto}.simple_form .check_boxes .checkbox input[type=checkbox]{position:absolute;left:0;top:5px;margin:0}.simple_form .input.static .label_input__wrapper{font-size:16px;padding:10px;border:1px solid #3e5a7c;border-radius:4px}.simple_form input[type=text],.simple_form input[type=number],.simple_form input[type=email],.simple_form input[type=password],.simple_form textarea{box-sizing:border-box;font-size:16px;color:#fff;display:block;width:100%;outline:0;font-family:inherit;resize:vertical;background:#010102;border:1px solid #000;border-radius:4px;padding:10px}.simple_form input[type=text]::placeholder,.simple_form input[type=number]::placeholder,.simple_form input[type=email]::placeholder,.simple_form input[type=password]::placeholder,.simple_form textarea::placeholder{color:#a8b9cf}.simple_form input[type=text]:invalid,.simple_form input[type=number]:invalid,.simple_form input[type=email]:invalid,.simple_form input[type=password]:invalid,.simple_form textarea:invalid{box-shadow:none}.simple_form input[type=text]:focus:invalid:not(:placeholder-shown),.simple_form input[type=number]:focus:invalid:not(:placeholder-shown),.simple_form input[type=email]:focus:invalid:not(:placeholder-shown),.simple_form input[type=password]:focus:invalid:not(:placeholder-shown),.simple_form textarea:focus:invalid:not(:placeholder-shown){border-color:#e87487}.simple_form input[type=text]:required:valid,.simple_form input[type=number]:required:valid,.simple_form input[type=email]:required:valid,.simple_form input[type=password]:required:valid,.simple_form textarea:required:valid{border-color:#79bd9a}.simple_form input[type=text]:hover,.simple_form input[type=number]:hover,.simple_form input[type=email]:hover,.simple_form input[type=password]:hover,.simple_form textarea:hover{border-color:#000}.simple_form input[type=text]:active,.simple_form input[type=text]:focus,.simple_form input[type=number]:active,.simple_form input[type=number]:focus,.simple_form input[type=email]:active,.simple_form input[type=email]:focus,.simple_form input[type=password]:active,.simple_form input[type=password]:focus,.simple_form textarea:active,.simple_form textarea:focus{border-color:#d8a070;background:#040609}.simple_form .input.field_with_errors label{color:#e87487}.simple_form .input.field_with_errors input[type=text],.simple_form .input.field_with_errors input[type=number],.simple_form .input.field_with_errors input[type=email],.simple_form .input.field_with_errors input[type=password],.simple_form .input.field_with_errors textarea,.simple_form .input.field_with_errors select{border-color:#e87487}.simple_form .input.field_with_errors .error{display:block;font-weight:500;color:#e87487;margin-top:4px}.simple_form .input.disabled{opacity:.5}.simple_form .actions{margin-top:30px;display:flex}.simple_form .actions.actions--top{margin-top:0;margin-bottom:30px}.simple_form button,.simple_form .button,.simple_form .block-button{display:block;width:100%;border:0;border-radius:4px;background:#d8a070;color:#fff;font-size:18px;line-height:inherit;height:auto;padding:10px;text-transform:uppercase;text-decoration:none;text-align:center;box-sizing:border-box;cursor:pointer;font-weight:500;outline:0;margin-bottom:10px;margin-right:10px}.simple_form button:last-child,.simple_form .button:last-child,.simple_form .block-button:last-child{margin-right:0}.simple_form button:hover,.simple_form .button:hover,.simple_form .block-button:hover{background-color:#ddad84}.simple_form button:active,.simple_form button:focus,.simple_form .button:active,.simple_form .button:focus,.simple_form .block-button:active,.simple_form .block-button:focus{background-color:#d3935c}.simple_form button:disabled:hover,.simple_form .button:disabled:hover,.simple_form .block-button:disabled:hover{background-color:#9baec8}.simple_form button.negative,.simple_form .button.negative,.simple_form .block-button.negative{background:#df405a}.simple_form button.negative:hover,.simple_form .button.negative:hover,.simple_form .block-button.negative:hover{background-color:#e3566d}.simple_form button.negative:active,.simple_form button.negative:focus,.simple_form .button.negative:active,.simple_form .button.negative:focus,.simple_form .block-button.negative:active,.simple_form .block-button.negative:focus{background-color:#db2a47}.simple_form select{appearance:none;box-sizing:border-box;font-size:16px;color:#fff;display:block;width:100%;outline:0;font-family:inherit;resize:vertical;background:#010102 url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center/auto 16px;border:1px solid #000;border-radius:4px;padding-left:10px;padding-right:30px;height:41px}.simple_form h4{margin-bottom:15px !important}.simple_form .label_input__wrapper{position:relative}.simple_form .label_input__append{position:absolute;right:3px;top:1px;padding:10px;padding-bottom:9px;font-size:16px;color:#3e5a7c;font-family:inherit;pointer-events:none;cursor:default;max-width:140px;white-space:nowrap;overflow:hidden}.simple_form .label_input__append::after{content:\"\";display:block;position:absolute;top:0;right:0;bottom:1px;width:5px;background-image:linear-gradient(to right, rgba(1, 1, 2, 0), #010102)}.simple_form__overlay-area{position:relative}.simple_form__overlay-area__blurred form{filter:blur(2px)}.simple_form__overlay-area__overlay{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;background:rgba(18,26,36,.65);border-radius:4px;margin-left:-4px;margin-top:-4px;padding:4px}.simple_form__overlay-area__overlay__content{text-align:center}.simple_form__overlay-area__overlay__content.rich-formatting,.simple_form__overlay-area__overlay__content.rich-formatting p{color:#fff}.block-icon{display:block;margin:0 auto;margin-bottom:10px;font-size:24px}.flash-message{background:#202e3f;color:#9baec8;border-radius:4px;padding:15px 10px;margin-bottom:30px;text-align:center}.flash-message.notice{border:1px solid rgba(121,189,154,.5);background:rgba(121,189,154,.25);color:#79bd9a}.flash-message.alert{border:1px solid rgba(223,64,90,.5);background:rgba(223,64,90,.25);color:#df405a}.flash-message a{display:inline-block;color:#9baec8;text-decoration:none}.flash-message a:hover{color:#fff;text-decoration:underline}.flash-message p{margin-bottom:15px}.flash-message .oauth-code{outline:0;box-sizing:border-box;display:block;width:100%;border:none;padding:10px;font-family:monospace,monospace;background:#121a24;color:#fff;font-size:14px;margin:0}.flash-message .oauth-code::-moz-focus-inner{border:0}.flash-message .oauth-code::-moz-focus-inner,.flash-message .oauth-code:focus,.flash-message .oauth-code:active{outline:0 !important}.flash-message .oauth-code:focus{background:#192432}.flash-message strong{font-weight:500}.flash-message strong:lang(ja){font-weight:700}.flash-message strong:lang(ko){font-weight:700}.flash-message strong:lang(zh-CN){font-weight:700}.flash-message strong:lang(zh-HK){font-weight:700}.flash-message strong:lang(zh-TW){font-weight:700}@media screen and (max-width: 740px)and (min-width: 441px){.flash-message{margin-top:40px}}.form-footer{margin-top:30px;text-align:center}.form-footer a{color:#9baec8;text-decoration:none}.form-footer a:hover{text-decoration:underline}.quick-nav{list-style:none;margin-bottom:25px;font-size:14px}.quick-nav li{display:inline-block;margin-right:10px}.quick-nav a{color:#d8a070;text-transform:uppercase;text-decoration:none;font-weight:700}.quick-nav a:hover,.quick-nav a:focus,.quick-nav a:active{color:#e1b590}.oauth-prompt,.follow-prompt{margin-bottom:30px;color:#9baec8}.oauth-prompt h2,.follow-prompt h2{font-size:16px;margin-bottom:30px;text-align:center}.oauth-prompt strong,.follow-prompt strong{color:#d9e1e8;font-weight:500}.oauth-prompt strong:lang(ja),.follow-prompt strong:lang(ja){font-weight:700}.oauth-prompt strong:lang(ko),.follow-prompt strong:lang(ko){font-weight:700}.oauth-prompt strong:lang(zh-CN),.follow-prompt strong:lang(zh-CN){font-weight:700}.oauth-prompt strong:lang(zh-HK),.follow-prompt strong:lang(zh-HK){font-weight:700}.oauth-prompt strong:lang(zh-TW),.follow-prompt strong:lang(zh-TW){font-weight:700}@media screen and (max-width: 740px)and (min-width: 441px){.oauth-prompt,.follow-prompt{margin-top:40px}}.qr-wrapper{display:flex;flex-wrap:wrap;align-items:flex-start}.qr-code{flex:0 0 auto;background:#fff;padding:4px;margin:0 10px 20px 0;box-shadow:0 0 15px rgba(0,0,0,.2);display:inline-block}.qr-code svg{display:block;margin:0}.qr-alternative{margin-bottom:20px;color:#d9e1e8;flex:150px}.qr-alternative samp{display:block;font-size:14px}.table-form p{margin-bottom:15px}.table-form p strong{font-weight:500}.table-form p strong:lang(ja){font-weight:700}.table-form p strong:lang(ko){font-weight:700}.table-form p strong:lang(zh-CN){font-weight:700}.table-form p strong:lang(zh-HK){font-weight:700}.table-form p strong:lang(zh-TW){font-weight:700}.simple_form .warning,.table-form .warning{box-sizing:border-box;background:rgba(223,64,90,.5);color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,.3);box-shadow:0 2px 6px rgba(0,0,0,.4);border-radius:4px;padding:10px;margin-bottom:15px}.simple_form .warning a,.table-form .warning a{color:#fff;text-decoration:underline}.simple_form .warning a:hover,.simple_form .warning a:focus,.simple_form .warning a:active,.table-form .warning a:hover,.table-form .warning a:focus,.table-form .warning a:active{text-decoration:none}.simple_form .warning strong,.table-form .warning strong{font-weight:600;display:block;margin-bottom:5px}.simple_form .warning strong:lang(ja),.table-form .warning strong:lang(ja){font-weight:700}.simple_form .warning strong:lang(ko),.table-form .warning strong:lang(ko){font-weight:700}.simple_form .warning strong:lang(zh-CN),.table-form .warning strong:lang(zh-CN){font-weight:700}.simple_form .warning strong:lang(zh-HK),.table-form .warning strong:lang(zh-HK){font-weight:700}.simple_form .warning strong:lang(zh-TW),.table-form .warning strong:lang(zh-TW){font-weight:700}.simple_form .warning strong .fa,.table-form .warning strong .fa{font-weight:400}.action-pagination{display:flex;flex-wrap:wrap;align-items:center}.action-pagination .actions,.action-pagination .pagination{flex:1 1 auto}.action-pagination .actions{padding:30px 0;padding-right:20px;flex:0 0 auto}.post-follow-actions{text-align:center;color:#9baec8}.post-follow-actions div{margin-bottom:4px}.alternative-login{margin-top:20px;margin-bottom:20px}.alternative-login h4{font-size:16px;color:#fff;text-align:center;margin-bottom:20px;border:0;padding:0}.alternative-login .button{display:block}.scope-danger{color:#ff5050}.form_admin_settings_site_short_description textarea,.form_admin_settings_site_description textarea,.form_admin_settings_site_extended_description textarea,.form_admin_settings_site_terms textarea,.form_admin_settings_custom_css textarea,.form_admin_settings_closed_registrations_message textarea{font-family:monospace,monospace}.input-copy{background:#010102;border:1px solid #000;border-radius:4px;display:flex;align-items:center;padding-right:4px;position:relative;top:1px;transition:border-color 300ms linear}.input-copy__wrapper{flex:1 1 auto}.input-copy input[type=text]{background:transparent;border:0;padding:10px;font-size:14px;font-family:monospace,monospace}.input-copy button{flex:0 0 auto;margin:4px;text-transform:none;font-weight:400;font-size:14px;padding:7px 18px;padding-bottom:6px;width:auto;transition:background 300ms linear}.input-copy.copied{border-color:#79bd9a;transition:none}.input-copy.copied button{background:#79bd9a;transition:none}.connection-prompt{margin-bottom:25px}.connection-prompt .fa-link{background-color:#0b1016;border-radius:100%;font-size:24px;padding:10px}.connection-prompt__column{align-items:center;display:flex;flex:1;flex-direction:column;flex-shrink:1;max-width:50%}.connection-prompt__column-sep{align-self:center;flex-grow:0;overflow:visible;position:relative;z-index:1}.connection-prompt__column p{word-break:break-word}.connection-prompt .account__avatar{margin-bottom:20px}.connection-prompt__connection{background-color:#202e3f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;padding:25px 10px;position:relative;text-align:center}.connection-prompt__connection::after{background-color:#0b1016;content:\"\";display:block;height:100%;left:50%;position:absolute;top:0;width:1px}.connection-prompt__row{align-items:flex-start;display:flex;flex-direction:row}.card>a{display:block;text-decoration:none;color:inherit;box-shadow:0 0 15px rgba(0,0,0,.2)}@media screen and (max-width: 415px){.card>a{box-shadow:none}}.card>a:hover .card__bar,.card>a:active .card__bar,.card>a:focus .card__bar{background:#202e3f}.card__img{height:130px;position:relative;background:#000;border-radius:4px 4px 0 0}.card__img img{display:block;width:100%;height:100%;margin:0;object-fit:cover;border-radius:4px 4px 0 0}@media screen and (max-width: 600px){.card__img{height:200px}}@media screen and (max-width: 415px){.card__img{display:none}}.card__bar{position:relative;padding:15px;display:flex;justify-content:flex-start;align-items:center;background:#192432;border-radius:0 0 4px 4px}@media screen and (max-width: 415px){.card__bar{border-radius:0}}.card__bar .avatar{flex:0 0 auto;width:48px;height:48px;width:48px;height:48px;background-size:48px 48px;padding-top:2px}.card__bar .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px;border-radius:8%;background-position:50%;background-clip:padding-box;background:#040609;object-fit:cover}.card__bar .display-name{margin-left:15px;text-align:left}.card__bar .display-name strong{font-size:15px;color:#fff;font-weight:500;overflow:hidden;text-overflow:ellipsis}.card__bar .display-name span{display:block;font-size:14px;color:#9baec8;font-weight:400;overflow:hidden;text-overflow:ellipsis}.pagination{padding:30px 0;text-align:center;overflow:hidden}.pagination a,.pagination .current,.pagination .newer,.pagination .older,.pagination .page,.pagination .gap{font-size:14px;color:#fff;font-weight:500;display:inline-block;padding:6px 10px;text-decoration:none}.pagination .current{background:#fff;border-radius:100px;color:#121a24;cursor:default;margin:0 10px}.pagination .gap{cursor:default}.pagination .older,.pagination .newer{text-transform:uppercase;color:#d9e1e8}.pagination .older{float:left;padding-left:0}.pagination .older .fa{display:inline-block;margin-right:5px}.pagination .newer{float:right;padding-right:0}.pagination .newer .fa{display:inline-block;margin-left:5px}.pagination .disabled{cursor:default;color:#233346}@media screen and (max-width: 700px){.pagination{padding:30px 20px}.pagination .page{display:none}.pagination .newer,.pagination .older{display:inline-block}}.nothing-here{background:#121a24;box-shadow:0 0 15px rgba(0,0,0,.2);color:#9baec8;font-size:14px;font-weight:500;text-align:center;display:flex;justify-content:center;align-items:center;cursor:default;border-radius:4px;padding:20px;min-height:30vh}.nothing-here--under-tabs{border-radius:0 0 4px 4px}.nothing-here--flexible{box-sizing:border-box;min-height:100%}.account-role,.simple_form .recommended{display:inline-block;padding:4px 6px;cursor:default;border-radius:3px;font-size:12px;line-height:12px;font-weight:500;color:#d9e1e8;background-color:rgba(217,225,232,.1);border:1px solid rgba(217,225,232,.5)}.account-role.moderator,.simple_form .recommended.moderator{color:#79bd9a;background-color:rgba(121,189,154,.1);border-color:rgba(121,189,154,.5)}.account-role.admin,.simple_form .recommended.admin{color:#e87487;background-color:rgba(232,116,135,.1);border-color:rgba(232,116,135,.5)}.account__header__fields{max-width:100vw;padding:0;margin:15px -15px -15px;border:0 none;border-top:1px solid #26374d;border-bottom:1px solid #26374d;font-size:14px;line-height:20px}.account__header__fields dl{display:flex;border-bottom:1px solid #26374d}.account__header__fields dt,.account__header__fields dd{box-sizing:border-box;padding:14px;text-align:center;max-height:48px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.account__header__fields dt{font-weight:500;width:120px;flex:0 0 auto;color:#d9e1e8;background:rgba(4,6,9,.5)}.account__header__fields dd{flex:1 1 auto;color:#9baec8}.account__header__fields a{color:#d8a070;text-decoration:none}.account__header__fields a:hover,.account__header__fields a:focus,.account__header__fields a:active{text-decoration:underline}.account__header__fields .verified{border:1px solid rgba(121,189,154,.5);background:rgba(121,189,154,.25)}.account__header__fields .verified a{color:#79bd9a;font-weight:500}.account__header__fields .verified__mark{color:#79bd9a}.account__header__fields dl:last-child{border-bottom:0}.directory__tag .trends__item__current{width:auto}.pending-account__header{color:#9baec8}.pending-account__header a{color:#d9e1e8;text-decoration:none}.pending-account__header a:hover,.pending-account__header a:active,.pending-account__header a:focus{text-decoration:underline}.pending-account__header strong{color:#fff;font-weight:700}.pending-account__body{margin-top:10px}.activity-stream{box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;overflow:hidden;margin-bottom:10px}@media screen and (max-width: 415px){.activity-stream{margin-bottom:0;border-radius:0;box-shadow:none}}.activity-stream--headless{border-radius:0;margin:0;box-shadow:none}.activity-stream--headless .detailed-status,.activity-stream--headless .status{border-radius:0 !important}.activity-stream div[data-component]{width:100%}.activity-stream .entry{background:#121a24}.activity-stream .entry .detailed-status,.activity-stream .entry .status,.activity-stream .entry .load-more{animation:none}.activity-stream .entry:last-child .detailed-status,.activity-stream .entry:last-child .status,.activity-stream .entry:last-child .load-more{border-bottom:0;border-radius:0 0 4px 4px}.activity-stream .entry:first-child .detailed-status,.activity-stream .entry:first-child .status,.activity-stream .entry:first-child .load-more{border-radius:4px 4px 0 0}.activity-stream .entry:first-child:last-child .detailed-status,.activity-stream .entry:first-child:last-child .status,.activity-stream .entry:first-child:last-child .load-more{border-radius:4px}@media screen and (max-width: 740px){.activity-stream .entry .detailed-status,.activity-stream .entry .status,.activity-stream .entry .load-more{border-radius:0 !important}}.activity-stream--highlighted .entry{background:#202e3f}.button.logo-button{flex:0 auto;font-size:14px;background:#d8a070;color:#fff;text-transform:none;line-height:36px;height:auto;padding:3px 15px;border:0}.button.logo-button svg{width:20px;height:auto;vertical-align:middle;margin-right:5px;fill:#fff}.button.logo-button:active,.button.logo-button:focus,.button.logo-button:hover{background:#e3bb98}.button.logo-button:disabled:active,.button.logo-button:disabled:focus,.button.logo-button:disabled:hover,.button.logo-button.disabled:active,.button.logo-button.disabled:focus,.button.logo-button.disabled:hover{background:#9baec8}.button.logo-button.button--destructive:active,.button.logo-button.button--destructive:focus,.button.logo-button.button--destructive:hover{background:#df405a}@media screen and (max-width: 415px){.button.logo-button svg{display:none}}.embed .detailed-status,.public-layout .detailed-status{padding:15px}.embed .status,.public-layout .status{padding:15px 15px 15px 78px;min-height:50px}.embed .status__avatar,.public-layout .status__avatar{left:15px;top:17px}.embed .status__content,.public-layout .status__content{padding-top:5px}.embed .status__prepend,.public-layout .status__prepend{padding:8px 0;padding-bottom:2px;margin:initial;margin-left:78px;padding-top:15px}.embed .status__prepend-icon-wrapper,.public-layout .status__prepend-icon-wrapper{position:absolute;margin:initial;float:initial;width:auto;left:-32px}.embed .status .media-gallery,.embed .status__action-bar,.embed .status .video-player,.public-layout .status .media-gallery,.public-layout .status__action-bar,.public-layout .status .video-player{margin-top:10px}.embed .status .status__info,.public-layout .status .status__info{font-size:15px;display:initial}.embed .status .status__relative-time,.public-layout .status .status__relative-time{color:#3e5a7c;float:right;font-size:14px;width:auto;margin:initial;padding:initial}.embed .status .status__info .status__display-name,.public-layout .status .status__info .status__display-name{display:block;max-width:100%;padding:6px 0;padding-right:25px;margin:initial}.embed .status .status__info .status__display-name .display-name strong,.public-layout .status .status__info .status__display-name .display-name strong{display:inline}.embed .status .status__avatar,.public-layout .status .status__avatar{height:48px;position:absolute;width:48px;margin:initial}.rtl .embed .status,.rtl .public-layout .status{padding-left:10px;padding-right:68px}.rtl .embed .status .status__info .status__display-name,.rtl .public-layout .status .status__info .status__display-name{padding-left:25px;padding-right:0}.rtl .embed .status .status__relative-time,.rtl .public-layout .status .status__relative-time{float:left}.app-body{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.link-button{display:block;font-size:15px;line-height:20px;color:#d8a070;border:0;background:transparent;padding:0;cursor:pointer}.link-button:hover,.link-button:active{text-decoration:underline}.link-button:disabled{color:#9baec8;cursor:default}.button{background-color:#d59864;border:10px none;border-radius:4px;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-family:inherit;font-size:14px;font-weight:500;height:36px;letter-spacing:0;line-height:36px;overflow:hidden;padding:0 16px;position:relative;text-align:center;text-transform:uppercase;text-decoration:none;text-overflow:ellipsis;transition:all 100ms ease-in;transition-property:background-color;white-space:nowrap;width:auto}.button:active,.button:focus,.button:hover{background-color:#e0b38c;transition:all 200ms ease-out;transition-property:background-color}.button--destructive{transition:none}.button--destructive:active,.button--destructive:focus,.button--destructive:hover{background-color:#df405a;transition:none}.button:disabled{background-color:#9baec8;cursor:default}.button.button-primary,.button.button-alternative,.button.button-secondary,.button.button-alternative-2{font-size:16px;line-height:36px;height:auto;text-transform:none;padding:4px 16px}.button.button-alternative{color:#121a24;background:#9baec8}.button.button-alternative:active,.button.button-alternative:focus,.button.button-alternative:hover{background-color:#a8b9cf}.button.button-alternative-2{background:#3e5a7c}.button.button-alternative-2:active,.button.button-alternative-2:focus,.button.button-alternative-2:hover{background-color:#45648a}.button.button-secondary{font-size:16px;line-height:36px;height:auto;color:#9baec8;text-transform:none;background:transparent;padding:3px 15px;border-radius:4px;border:1px solid #9baec8}.button.button-secondary:active,.button.button-secondary:focus,.button.button-secondary:hover{border-color:#a8b9cf;color:#a8b9cf}.button.button-secondary:disabled{opacity:.5}.button.button--block{display:block;width:100%}.icon-button{display:inline-block;padding:0;color:#3e5a7c;border:0;border-radius:4px;background:transparent;cursor:pointer;transition:all 100ms ease-in;transition-property:background-color,color}.icon-button:hover,.icon-button:active,.icon-button:focus{color:#4a6b94;background-color:rgba(62,90,124,.15);transition:all 200ms ease-out;transition-property:background-color,color}.icon-button:focus{background-color:rgba(62,90,124,.3)}.icon-button.disabled{color:#283a50;background-color:transparent;cursor:default}.icon-button.active{color:#d8a070}.icon-button::-moz-focus-inner{border:0}.icon-button::-moz-focus-inner,.icon-button:focus,.icon-button:active{outline:0 !important}.icon-button.inverted{color:#3e5a7c}.icon-button.inverted:hover,.icon-button.inverted:active,.icon-button.inverted:focus{color:#324965;background-color:rgba(62,90,124,.15)}.icon-button.inverted:focus{background-color:rgba(62,90,124,.3)}.icon-button.inverted.disabled{color:#4a6b94;background-color:transparent}.icon-button.inverted.active{color:#d8a070}.icon-button.inverted.active.disabled{color:#e6c3a4}.icon-button.overlayed{box-sizing:content-box;background:rgba(0,0,0,.6);color:rgba(255,255,255,.7);border-radius:4px;padding:2px}.icon-button.overlayed:hover{background:rgba(0,0,0,.9)}.text-icon-button{color:#3e5a7c;border:0;border-radius:4px;background:transparent;cursor:pointer;font-weight:600;font-size:11px;padding:0 3px;line-height:27px;outline:0;transition:all 100ms ease-in;transition-property:background-color,color}.text-icon-button:hover,.text-icon-button:active,.text-icon-button:focus{color:#324965;background-color:rgba(62,90,124,.15);transition:all 200ms ease-out;transition-property:background-color,color}.text-icon-button:focus{background-color:rgba(62,90,124,.3)}.text-icon-button.disabled{color:#6b8cb5;background-color:transparent;cursor:default}.text-icon-button.active{color:#d8a070}.text-icon-button::-moz-focus-inner{border:0}.text-icon-button::-moz-focus-inner,.text-icon-button:focus,.text-icon-button:active{outline:0 !important}.dropdown-menu{position:absolute;transform-origin:50% 0}.invisible{font-size:0;line-height:0;display:inline-block;width:0;height:0;position:absolute}.invisible img,.invisible svg{margin:0 !important;border:0 !important;padding:0 !important;width:0 !important;height:0 !important}.ellipsis::after{content:\"…\"}.notification__favourite-icon-wrapper{left:0;position:absolute}.notification__favourite-icon-wrapper .fa.star-icon{color:#ca8f04}.star-icon.active{color:#ca8f04}.bookmark-icon.active{color:#ff5050}.no-reduce-motion .icon-button.star-icon.activate>.fa-star{animation:spring-rotate-in 1s linear}.no-reduce-motion .icon-button.star-icon.deactivate>.fa-star{animation:spring-rotate-out 1s linear}.notification__display-name{color:inherit;font-weight:500;text-decoration:none}.notification__display-name:hover{color:#fff;text-decoration:underline}.display-name{display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.display-name a{color:inherit;text-decoration:inherit}.display-name strong{height:18px;font-size:16px;font-weight:500;line-height:18px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.display-name span{display:block;height:18px;font-size:15px;line-height:18px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.display-name>a:hover strong{text-decoration:underline}.display-name.inline{padding:0;height:18px;font-size:15px;line-height:18px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.display-name.inline strong{display:inline;height:auto;font-size:inherit;line-height:inherit}.display-name.inline span{display:inline;height:auto;font-size:inherit;line-height:inherit}.display-name__html{font-weight:500}.display-name__account{font-size:14px}.image-loader{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center;flex-direction:column}.image-loader .image-loader__preview-canvas{max-width:100%;max-height:80%;background:url(\"~images/void.png\") repeat;object-fit:contain}.image-loader .loading-bar{position:relative}.image-loader.image-loader--amorphous .image-loader__preview-canvas{display:none}.zoomable-image{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center}.zoomable-image img{max-width:100%;max-height:80%;width:auto;height:auto;object-fit:contain}.dropdown{display:inline-block}.dropdown__content{display:none;position:absolute}.dropdown-menu__separator{border-bottom:1px solid #c0cdd9;margin:5px 7px 6px;height:0}.dropdown-menu{background:#d9e1e8;padding:4px 0;border-radius:4px;box-shadow:2px 4px 15px rgba(0,0,0,.4)}.dropdown-menu ul{list-style:none}.dropdown-menu__arrow{position:absolute;width:0;height:0;border:0 solid transparent}.dropdown-menu__arrow.left{right:-5px;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#d9e1e8}.dropdown-menu__arrow.top{bottom:-5px;margin-left:-7px;border-width:5px 7px 0;border-top-color:#d9e1e8}.dropdown-menu__arrow.bottom{top:-5px;margin-left:-7px;border-width:0 7px 5px;border-bottom-color:#d9e1e8}.dropdown-menu__arrow.right{left:-5px;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#d9e1e8}.dropdown-menu__item a{font-size:13px;line-height:18px;display:block;padding:4px 14px;box-sizing:border-box;text-decoration:none;background:#d9e1e8;color:#121a24;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown-menu__item a:focus,.dropdown-menu__item a:hover,.dropdown-menu__item a:active{background:#d8a070;color:#d9e1e8;outline:0}.dropdown--active .dropdown__content{display:block;line-height:18px;max-width:311px;right:0;text-align:left;z-index:9999}.dropdown--active .dropdown__content>ul{list-style:none;background:#d9e1e8;padding:4px 0;border-radius:4px;box-shadow:0 0 15px rgba(0,0,0,.4);min-width:140px;position:relative}.dropdown--active .dropdown__content.dropdown__right{right:0}.dropdown--active .dropdown__content.dropdown__left>ul{left:-98px}.dropdown--active .dropdown__content>ul>li>a{font-size:13px;line-height:18px;display:block;padding:4px 14px;box-sizing:border-box;text-decoration:none;background:#d9e1e8;color:#121a24;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown--active .dropdown__content>ul>li>a:focus{outline:0}.dropdown--active .dropdown__content>ul>li>a:hover{background:#d8a070;color:#d9e1e8}.dropdown__icon{vertical-align:middle}.static-content{padding:10px;padding-top:20px;color:#3e5a7c}.static-content h1{font-size:16px;font-weight:500;margin-bottom:40px;text-align:center}.static-content p{font-size:13px;margin-bottom:20px}.column,.drawer{flex:1 1 100%;overflow:hidden}@media screen and (min-width: 631px){.columns-area{padding:0}.column,.drawer{flex:0 0 auto;padding:10px;padding-left:5px;padding-right:5px}.column:first-child,.drawer:first-child{padding-left:10px}.column:last-child,.drawer:last-child{padding-right:10px}.columns-area>div .column,.columns-area>div .drawer{padding-left:5px;padding-right:5px}}.tabs-bar{box-sizing:border-box;display:flex;background:#202e3f;flex:0 0 auto;overflow-y:auto}.tabs-bar__link{display:block;flex:1 1 auto;padding:15px 10px;padding-bottom:13px;color:#fff;text-decoration:none;text-align:center;font-size:14px;font-weight:500;border-bottom:2px solid #202e3f;transition:all 50ms linear;transition-property:border-bottom,background,color}.tabs-bar__link .fa{font-weight:400;font-size:16px}@media screen and (min-width: 631px){.auto-columns .tabs-bar__link:hover,.auto-columns .tabs-bar__link:focus,.auto-columns .tabs-bar__link:active{background:#2a3c54;border-bottom-color:#2a3c54}}.multi-columns .tabs-bar__link:hover,.multi-columns .tabs-bar__link:focus,.multi-columns .tabs-bar__link:active{background:#2a3c54;border-bottom-color:#2a3c54}.tabs-bar__link.active{border-bottom:2px solid #d8a070;color:#d8a070}.tabs-bar__link span{margin-left:5px;display:none}.tabs-bar__link span.icon{margin-left:0;display:inline}.icon-with-badge{position:relative}.icon-with-badge__badge{position:absolute;left:9px;top:-13px;background:#d8a070;border:2px solid #202e3f;padding:1px 6px;border-radius:6px;font-size:10px;font-weight:500;line-height:14px;color:#fff}.column-link--transparent .icon-with-badge__badge{border-color:#040609}.scrollable{overflow-y:scroll;overflow-x:hidden;flex:1 1 auto;-webkit-overflow-scrolling:touch}.scrollable.optionally-scrollable{overflow-y:auto}@supports(display: grid){.scrollable{contain:strict}}.scrollable--flex{display:flex;flex-direction:column}.scrollable__append{flex:1 1 auto;position:relative;min-height:120px}@supports(display: grid){.scrollable.fullscreen{contain:none}}.react-toggle{display:inline-block;position:relative;cursor:pointer;background-color:transparent;border:0;padding:0;user-select:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-tap-highlight-color:transparent}.react-toggle-screenreader-only{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.react-toggle--disabled{cursor:not-allowed;opacity:.5;transition:opacity .25s}.react-toggle-track{width:50px;height:24px;padding:0;border-radius:30px;background-color:#121a24;transition:background-color .2s ease}.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track{background-color:#010102}.react-toggle--checked .react-toggle-track{background-color:#d8a070}.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track{background-color:#e3bb98}.react-toggle-track-check{position:absolute;width:14px;height:10px;top:0;bottom:0;margin-top:auto;margin-bottom:auto;line-height:0;left:8px;opacity:0;transition:opacity .25s ease}.react-toggle--checked .react-toggle-track-check{opacity:1;transition:opacity .25s ease}.react-toggle-track-x{position:absolute;width:10px;height:10px;top:0;bottom:0;margin-top:auto;margin-bottom:auto;line-height:0;right:10px;opacity:1;transition:opacity .25s ease}.react-toggle--checked .react-toggle-track-x{opacity:0}.react-toggle-thumb{position:absolute;top:1px;left:1px;width:22px;height:22px;border:1px solid #121a24;border-radius:50%;background-color:#fafafa;box-sizing:border-box;transition:all .25s ease;transition-property:border-color,left}.react-toggle--checked .react-toggle-thumb{left:27px;border-color:#d8a070}.getting-started__wrapper,.getting_started,.flex-spacer{background:#121a24}.getting-started__wrapper{position:relative;overflow-y:auto}.flex-spacer{flex:1 1 auto}.getting-started{background:#121a24;flex:1 0 auto}.getting-started p{color:#d9e1e8}.getting-started a{color:#3e5a7c}.getting-started__panel{height:min-content}.getting-started__panel,.getting-started__footer{padding:10px;padding-top:20px;flex:0 1 auto}.getting-started__panel ul,.getting-started__footer ul{margin-bottom:10px}.getting-started__panel ul li,.getting-started__footer ul li{display:inline}.getting-started__panel p,.getting-started__footer p{color:#3e5a7c;font-size:13px}.getting-started__panel p a,.getting-started__footer p a{color:#3e5a7c;text-decoration:underline}.getting-started__panel a,.getting-started__footer a{text-decoration:none;color:#9baec8}.getting-started__panel a:hover,.getting-started__panel a:focus,.getting-started__panel a:active,.getting-started__footer a:hover,.getting-started__footer a:focus,.getting-started__footer a:active{text-decoration:underline}.getting-started__trends{flex:0 1 auto;opacity:1;animation:fade 150ms linear;margin-top:10px}.getting-started__trends h4{font-size:12px;text-transform:uppercase;color:#9baec8;padding:10px;font-weight:500;border-bottom:1px solid #202e3f}@media screen and (max-height: 810px){.getting-started__trends .trends__item:nth-child(3){display:none}}@media screen and (max-height: 720px){.getting-started__trends .trends__item:nth-child(2){display:none}}@media screen and (max-height: 670px){.getting-started__trends{display:none}}.getting-started__trends .trends__item{border-bottom:0;padding:10px}.getting-started__trends .trends__item__current{color:#9baec8}.column-link__badge{display:inline-block;border-radius:4px;font-size:12px;line-height:19px;font-weight:500;background:#121a24;padding:4px 8px;margin:-6px 10px}.keyboard-shortcuts{padding:8px 0 0;overflow:hidden}.keyboard-shortcuts thead{position:absolute;left:-9999px}.keyboard-shortcuts td{padding:0 10px 8px}.keyboard-shortcuts kbd{display:inline-block;padding:3px 5px;background-color:#202e3f;border:1px solid #0b1016}.setting-text{color:#9baec8;background:transparent;border:none;border-bottom:2px solid #9baec8;box-sizing:border-box;display:block;font-family:inherit;margin-bottom:10px;padding:7px 0;width:100%}.setting-text:focus,.setting-text:active{color:#fff;border-bottom-color:#d8a070}@media screen and (max-width: 600px){.auto-columns .setting-text,.single-column .setting-text{font-size:16px}}.setting-text.light{color:#121a24;border-bottom:2px solid #405c80}.setting-text.light:focus,.setting-text.light:active{color:#121a24;border-bottom-color:#d8a070}.no-reduce-motion button.icon-button i.fa-retweet{background-position:0 0;height:19px;transition:background-position .9s steps(10);transition-duration:0s;vertical-align:middle;width:22px}.no-reduce-motion button.icon-button i.fa-retweet::before{display:none !important}.no-reduce-motion button.icon-button.active i.fa-retweet{transition-duration:.9s;background-position:0 100%}.reduce-motion button.icon-button i.fa-retweet{color:#3e5a7c;transition:color 100ms ease-in}.reduce-motion button.icon-button.active i.fa-retweet{color:#d8a070}.reduce-motion button.icon-button.disabled i.fa-retweet{color:#283a50}.load-more{display:block;color:#3e5a7c;background-color:transparent;border:0;font-size:inherit;text-align:center;line-height:inherit;margin:0;padding:15px;box-sizing:border-box;width:100%;clear:both;text-decoration:none}.load-more:hover{background:#151f2b}.load-gap{border-bottom:1px solid #202e3f}.missing-indicator{padding-top:68px}.scrollable>div>:first-child .notification__dismiss-overlay>.wrappy{border-top:1px solid #121a24}.notification__dismiss-overlay{overflow:hidden;position:absolute;top:0;right:0;bottom:-1px;padding-left:15px;z-index:999;align-items:center;justify-content:flex-end;cursor:pointer;display:flex}.notification__dismiss-overlay .wrappy{width:4rem;align-self:stretch;display:flex;flex-direction:column;align-items:center;justify-content:center;background:#202e3f;border-left:1px solid #344b68;box-shadow:0 0 5px #000;border-bottom:1px solid #121a24}.notification__dismiss-overlay .ckbox{border:2px solid #9baec8;border-radius:2px;width:30px;height:30px;font-size:20px;color:#9baec8;text-shadow:0 0 5px #000;display:flex;justify-content:center;align-items:center}.notification__dismiss-overlay:focus{outline:0 !important}.notification__dismiss-overlay:focus .ckbox{box-shadow:0 0 1px 1px #d8a070}.text-btn{display:inline-block;padding:0;font-family:inherit;font-size:inherit;color:inherit;border:0;background:transparent;cursor:pointer}.loading-indicator{color:#3e5a7c;font-size:12px;font-weight:400;text-transform:uppercase;overflow:visible;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.loading-indicator span{display:block;float:left;margin-left:50%;transform:translateX(-50%);margin:82px 0 0 50%;white-space:nowrap}.loading-indicator__figure{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);width:42px;height:42px;box-sizing:border-box;background-color:transparent;border:0 solid #3e5a7c;border-width:6px;border-radius:50%}.no-reduce-motion .loading-indicator span{animation:loader-label 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1)}.no-reduce-motion .loading-indicator__figure{animation:loader-figure 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1)}@keyframes spring-rotate-in{0%{transform:rotate(0deg)}30%{transform:rotate(-484.8deg)}60%{transform:rotate(-316.7deg)}90%{transform:rotate(-375deg)}100%{transform:rotate(-360deg)}}@keyframes spring-rotate-out{0%{transform:rotate(-360deg)}30%{transform:rotate(124.8deg)}60%{transform:rotate(-43.27deg)}90%{transform:rotate(15deg)}100%{transform:rotate(0deg)}}@keyframes loader-figure{0%{width:0;height:0;background-color:#3e5a7c}29%{background-color:#3e5a7c}30%{width:42px;height:42px;background-color:transparent;border-width:21px;opacity:1}100%{width:42px;height:42px;border-width:0;opacity:0;background-color:transparent}}@keyframes loader-label{0%{opacity:.25}30%{opacity:1}100%{opacity:.25}}.spoiler-button{top:0;left:0;width:100%;height:100%;position:absolute;z-index:100}.spoiler-button--minified{display:flex;left:4px;top:4px;width:auto;height:auto;align-items:center}.spoiler-button--click-thru{pointer-events:none}.spoiler-button--hidden{display:none}.spoiler-button__overlay{display:block;background:transparent;width:100%;height:100%;border:0}.spoiler-button__overlay__label{display:inline-block;background:rgba(0,0,0,.5);border-radius:8px;padding:8px 12px;color:#fff;font-weight:500;font-size:14px}.spoiler-button__overlay:hover .spoiler-button__overlay__label,.spoiler-button__overlay:focus .spoiler-button__overlay__label,.spoiler-button__overlay:active .spoiler-button__overlay__label{background:rgba(0,0,0,.8)}.spoiler-button__overlay:disabled .spoiler-button__overlay__label{background:rgba(0,0,0,.5)}.setting-toggle{display:block;line-height:24px}.setting-toggle__label,.setting-radio__label,.setting-meta__label{color:#9baec8;display:inline-block;margin-bottom:14px;margin-left:8px;vertical-align:middle}.setting-radio{display:block;line-height:18px}.setting-radio__label{margin-bottom:0}.column-settings__row legend{color:#9baec8;cursor:default;display:block;font-weight:500;margin-top:10px}.setting-radio__input{vertical-align:middle}.setting-meta__label{float:right}@keyframes heartbeat{from{transform:scale(1);transform-origin:center center;animation-timing-function:ease-out}10%{transform:scale(0.91);animation-timing-function:ease-in}17%{transform:scale(0.98);animation-timing-function:ease-out}33%{transform:scale(0.87);animation-timing-function:ease-in}45%{transform:scale(1);animation-timing-function:ease-out}}.pulse-loading{animation:heartbeat 1.5s ease-in-out infinite both}.upload-area{align-items:center;background:rgba(0,0,0,.8);display:flex;height:100%;justify-content:center;left:0;opacity:0;position:absolute;top:0;visibility:hidden;width:100%;z-index:2000}.upload-area *{pointer-events:none}.upload-area__drop{width:320px;height:160px;display:flex;box-sizing:border-box;position:relative;padding:8px}.upload-area__background{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;border-radius:4px;background:#121a24;box-shadow:0 0 5px rgba(0,0,0,.2)}.upload-area__content{flex:1;display:flex;align-items:center;justify-content:center;color:#d9e1e8;font-size:18px;font-weight:500;border:2px dashed #3e5a7c;border-radius:4px}.dropdown--active .emoji-button img{opacity:1;filter:none}.loading-bar{background-color:#d8a070;height:3px;position:absolute;top:0;left:0;z-index:9999}.icon-badge-wrapper{position:relative}.icon-badge{position:absolute;display:block;right:-0.25em;top:-0.25em;background-color:#d8a070;border-radius:50%;font-size:75%;width:1em;height:1em}.conversation{display:flex;border-bottom:1px solid #202e3f;padding:5px;padding-bottom:0}.conversation:focus{background:#151f2b;outline:0}.conversation__avatar{flex:0 0 auto;padding:10px;padding-top:12px;position:relative}.conversation__unread{display:inline-block;background:#d8a070;border-radius:50%;width:.625rem;height:.625rem;margin:-0.1ex .15em .1ex}.conversation__content{flex:1 1 auto;padding:10px 5px;padding-right:15px;overflow:hidden}.conversation__content__info{overflow:hidden;display:flex;flex-direction:row-reverse;justify-content:space-between}.conversation__content__relative-time{font-size:15px;color:#9baec8;padding-left:15px}.conversation__content__names{color:#9baec8;font-size:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:4px;flex-basis:90px;flex-grow:1}.conversation__content__names a{color:#fff;text-decoration:none}.conversation__content__names a:hover,.conversation__content__names a:focus,.conversation__content__names a:active{text-decoration:underline}.conversation__content .status__content{margin:0}.conversation--unread{background:#151f2b}.conversation--unread:focus{background:#192432}.conversation--unread .conversation__content__info{font-weight:700}.conversation--unread .conversation__content__relative-time{color:#fff}.ui .flash-message{margin-top:10px;margin-left:auto;margin-right:auto;margin-bottom:0;min-width:75%}::-webkit-scrollbar-thumb{border-radius:0}noscript{text-align:center}noscript img{width:200px;opacity:.5;animation:flicker 4s infinite}noscript div{font-size:14px;margin:30px auto;color:#d9e1e8;max-width:400px}noscript div a{color:#d8a070;text-decoration:underline}noscript div a:hover{text-decoration:none}noscript div a{word-break:break-word}@keyframes flicker{0%{opacity:1}30%{opacity:.75}100%{opacity:1}}button.icon-button i.fa-retweet{background-image:url(\"data:image/svg+xml;utf8,\")}button.icon-button i.fa-retweet:hover{background-image:url(\"data:image/svg+xml;utf8,\")}button.icon-button.disabled i.fa-retweet,button.icon-button.disabled i.fa-retweet:hover{background-image:url(\"data:image/svg+xml;utf8,\")}.status-direct button.icon-button.disabled i.fa-retweet,.status-direct button.icon-button.disabled i.fa-retweet:hover{background-image:url(\"data:image/svg+xml;utf8,\")}.account{padding:10px;border-bottom:1px solid #202e3f;color:inherit;text-decoration:none}.account .account__display-name{flex:1 1 auto;display:block;color:#9baec8;overflow:hidden;text-decoration:none;font-size:14px}.account.small{border:none;padding:0}.account.small>.account__avatar-wrapper{margin:0 8px 0 0}.account.small>.display-name{height:24px;line-height:24px}.account__wrapper{display:flex}.account__avatar-wrapper{float:left;margin-left:12px;margin-right:12px}.account__avatar{border-radius:8%;background-position:50%;background-clip:padding-box;position:relative;cursor:pointer}.account__avatar-inline{display:inline-block;vertical-align:middle;margin-right:5px}.account__avatar-composite{border-radius:8%;background-position:50%;background-clip:padding-box;overflow:hidden;position:relative;cursor:default}.account__avatar-composite div{border-radius:8%;background-position:50%;background-clip:padding-box;float:left;position:relative;box-sizing:border-box}.account__avatar-composite__label{display:block;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);color:#fff;text-shadow:1px 1px 2px #000;font-weight:700;font-size:15px}.account__avatar-overlay{position:relative;width:48px;height:48px;background-size:48px 48px}.account__avatar-overlay-base{border-radius:8%;background-position:50%;background-clip:padding-box;width:36px;height:36px;background-size:36px 36px}.account__avatar-overlay-overlay{border-radius:8%;background-position:50%;background-clip:padding-box;width:24px;height:24px;background-size:24px 24px;position:absolute;bottom:0;right:0;z-index:1}.account__relationship{height:18px;padding:10px;white-space:nowrap}.account__header__wrapper{flex:0 0 auto;background:#192432}.account__disclaimer{padding:10px;color:#3e5a7c}.account__disclaimer strong{font-weight:500}.account__disclaimer strong:lang(ja){font-weight:700}.account__disclaimer strong:lang(ko){font-weight:700}.account__disclaimer strong:lang(zh-CN){font-weight:700}.account__disclaimer strong:lang(zh-HK){font-weight:700}.account__disclaimer strong:lang(zh-TW){font-weight:700}.account__disclaimer a{font-weight:500;color:inherit;text-decoration:underline}.account__disclaimer a:hover,.account__disclaimer a:focus,.account__disclaimer a:active{text-decoration:none}.account__action-bar{border-top:1px solid #202e3f;border-bottom:1px solid #202e3f;line-height:36px;overflow:hidden;flex:0 0 auto;display:flex}.account__action-bar-links{display:flex;flex:1 1 auto;line-height:18px;text-align:center}.account__action-bar__tab{text-decoration:none;overflow:hidden;flex:0 1 100%;border-left:1px solid #202e3f;padding:10px 0;border-bottom:4px solid transparent}.account__action-bar__tab:first-child{border-left:0}.account__action-bar__tab.active{border-bottom:4px solid #d8a070}.account__action-bar__tab>span{display:block;text-transform:uppercase;font-size:11px;color:#9baec8}.account__action-bar__tab strong{display:block;font-size:15px;font-weight:500;color:#fff}.account__action-bar__tab strong:lang(ja){font-weight:700}.account__action-bar__tab strong:lang(ko){font-weight:700}.account__action-bar__tab strong:lang(zh-CN){font-weight:700}.account__action-bar__tab strong:lang(zh-HK){font-weight:700}.account__action-bar__tab strong:lang(zh-TW){font-weight:700}.account__action-bar__tab abbr{color:#d8a070}.account-authorize{padding:14px 10px}.account-authorize .detailed-status__display-name{display:block;margin-bottom:15px;overflow:hidden}.account-authorize__avatar{float:left;margin-right:10px}.notification__message{margin-left:42px;padding:8px 0 0 26px;cursor:default;color:#9baec8;font-size:15px;position:relative}.notification__message .fa{color:#d8a070}.notification__message>span{display:block;overflow:hidden;text-overflow:ellipsis}.account--panel{background:#192432;border-top:1px solid #202e3f;border-bottom:1px solid #202e3f;display:flex;flex-direction:row;padding:10px 0}.account--panel__button,.detailed-status__button{flex:1 1 auto;text-align:center}.column-settings__outer{background:#202e3f;padding:15px}.column-settings__section{color:#9baec8;cursor:default;display:block;font-weight:500;margin-bottom:10px}.column-settings__hashtags .column-settings__row{margin-bottom:15px}.column-settings__hashtags .column-select__control{outline:0;box-sizing:border-box;width:100%;border:none;box-shadow:none;font-family:inherit;background:#121a24;color:#9baec8;font-size:14px;margin:0}.column-settings__hashtags .column-select__control::placeholder{color:#a8b9cf}.column-settings__hashtags .column-select__control::-moz-focus-inner{border:0}.column-settings__hashtags .column-select__control::-moz-focus-inner,.column-settings__hashtags .column-select__control:focus,.column-settings__hashtags .column-select__control:active{outline:0 !important}.column-settings__hashtags .column-select__control:focus{background:#192432}@media screen and (max-width: 600px){.column-settings__hashtags .column-select__control{font-size:16px}}.column-settings__hashtags .column-select__placeholder{color:#3e5a7c;padding-left:2px;font-size:12px}.column-settings__hashtags .column-select__value-container{padding-left:6px}.column-settings__hashtags .column-select__multi-value{background:#202e3f}.column-settings__hashtags .column-select__multi-value__remove{cursor:pointer}.column-settings__hashtags .column-select__multi-value__remove:hover,.column-settings__hashtags .column-select__multi-value__remove:active,.column-settings__hashtags .column-select__multi-value__remove:focus{background:#26374d;color:#a8b9cf}.column-settings__hashtags .column-select__multi-value__label,.column-settings__hashtags .column-select__input{color:#9baec8}.column-settings__hashtags .column-select__clear-indicator,.column-settings__hashtags .column-select__dropdown-indicator{cursor:pointer;transition:none;color:#3e5a7c}.column-settings__hashtags .column-select__clear-indicator:hover,.column-settings__hashtags .column-select__clear-indicator:active,.column-settings__hashtags .column-select__clear-indicator:focus,.column-settings__hashtags .column-select__dropdown-indicator:hover,.column-settings__hashtags .column-select__dropdown-indicator:active,.column-settings__hashtags .column-select__dropdown-indicator:focus{color:#45648a}.column-settings__hashtags .column-select__indicator-separator{background-color:#202e3f}.column-settings__hashtags .column-select__menu{background:#fff;border-radius:4px;padding:10px 14px;padding-bottom:14px;margin-top:10px;color:#9baec8;box-shadow:2px 4px 15px rgba(0,0,0,.4);padding:0;background:#d9e1e8}.column-settings__hashtags .column-select__menu h4{text-transform:uppercase;color:#9baec8;font-size:13px;font-weight:500;margin-bottom:10px}.column-settings__hashtags .column-select__menu li{padding:4px 0}.column-settings__hashtags .column-select__menu ul{margin-bottom:10px}.column-settings__hashtags .column-select__menu em{font-weight:500;color:#121a24}.column-settings__hashtags .column-select__menu-list{padding:6px}.column-settings__hashtags .column-select__option{color:#121a24;border-radius:4px;font-size:14px}.column-settings__hashtags .column-select__option--is-focused,.column-settings__hashtags .column-select__option--is-selected{background:#b9c8d5}.column-settings__row .text-btn{margin-bottom:15px}.relationship-tag{color:#fff;margin-bottom:4px;display:block;vertical-align:top;background-color:#000;text-transform:uppercase;font-size:11px;font-weight:500;padding:4px;border-radius:4px;opacity:.7}.relationship-tag:hover{opacity:1}.account-gallery__container{display:flex;flex-wrap:wrap;padding:4px 2px}.account-gallery__item{border:none;box-sizing:border-box;display:block;position:relative;border-radius:4px;overflow:hidden;margin:2px}.account-gallery__item__icons{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);font-size:24px}.notification__filter-bar,.account__section-headline{background:#0b1016;border-bottom:1px solid #202e3f;cursor:default;display:flex;flex-shrink:0}.notification__filter-bar button,.account__section-headline button{background:#0b1016;border:0;margin:0}.notification__filter-bar button,.notification__filter-bar a,.account__section-headline button,.account__section-headline a{display:block;flex:1 1 auto;color:#9baec8;padding:15px 0;font-size:14px;font-weight:500;text-align:center;text-decoration:none;position:relative}.notification__filter-bar button.active,.notification__filter-bar a.active,.account__section-headline button.active,.account__section-headline a.active{color:#d9e1e8}.notification__filter-bar button.active::before,.notification__filter-bar button.active::after,.notification__filter-bar a.active::before,.notification__filter-bar a.active::after,.account__section-headline button.active::before,.account__section-headline button.active::after,.account__section-headline a.active::before,.account__section-headline a.active::after{display:block;content:\"\";position:absolute;bottom:0;left:50%;width:0;height:0;transform:translateX(-50%);border-style:solid;border-width:0 10px 10px;border-color:transparent transparent #202e3f}.notification__filter-bar button.active::after,.notification__filter-bar a.active::after,.account__section-headline button.active::after,.account__section-headline a.active::after{bottom:-1px;border-color:transparent transparent #121a24}.notification__filter-bar.directory__section-headline,.account__section-headline.directory__section-headline{background:#0f151d;border-bottom-color:transparent}.notification__filter-bar.directory__section-headline a.active::before,.notification__filter-bar.directory__section-headline button.active::before,.account__section-headline.directory__section-headline a.active::before,.account__section-headline.directory__section-headline button.active::before{display:none}.notification__filter-bar.directory__section-headline a.active::after,.notification__filter-bar.directory__section-headline button.active::after,.account__section-headline.directory__section-headline a.active::after,.account__section-headline.directory__section-headline button.active::after{border-color:transparent transparent #06090c}.account__moved-note{padding:14px 10px;padding-bottom:16px;background:#192432;border-top:1px solid #202e3f;border-bottom:1px solid #202e3f}.account__moved-note__message{position:relative;margin-left:58px;color:#3e5a7c;padding:8px 0;padding-top:0;padding-bottom:4px;font-size:14px}.account__moved-note__message>span{display:block;overflow:hidden;text-overflow:ellipsis}.account__moved-note__icon-wrapper{left:-26px;position:absolute}.account__moved-note .detailed-status__display-avatar{position:relative}.account__moved-note .detailed-status__display-name{margin-bottom:0}.account__header__content{color:#9baec8;font-size:14px;font-weight:400;overflow:hidden;word-break:normal;word-wrap:break-word}.account__header__content p{margin-bottom:20px}.account__header__content p:last-child{margin-bottom:0}.account__header__content a{color:inherit;text-decoration:underline}.account__header__content a:hover{text-decoration:none}.account__header{overflow:hidden}.account__header.inactive{opacity:.5}.account__header.inactive .account__header__image,.account__header.inactive .account__avatar{filter:grayscale(100%)}.account__header__info{position:absolute;top:10px;left:10px}.account__header__image{overflow:hidden;height:145px;position:relative;background:#0b1016}.account__header__image img{object-fit:cover;display:block;width:100%;height:100%;margin:0}.account__header__bar{position:relative;background:#192432;padding:5px;border-bottom:1px solid #26374d}.account__header__bar .avatar{display:block;flex:0 0 auto;width:94px;margin-left:-2px}.account__header__bar .avatar .account__avatar{background:#040609;border:2px solid #192432}.account__header__tabs{display:flex;align-items:flex-start;padding:7px 5px;margin-top:-55px}.account__header__tabs__buttons{display:flex;align-items:center;padding-top:55px;overflow:hidden}.account__header__tabs__buttons .icon-button{border:1px solid #26374d;border-radius:4px;box-sizing:content-box;padding:2px}.account__header__tabs__buttons .button{margin:0 8px}.account__header__tabs__name{padding:5px}.account__header__tabs__name .account-role{vertical-align:top}.account__header__tabs__name .emojione{width:22px;height:22px}.account__header__tabs__name h1{font-size:16px;line-height:24px;color:#fff;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.account__header__tabs__name h1 small{display:block;font-size:14px;color:#9baec8;font-weight:400;overflow:hidden;text-overflow:ellipsis}.account__header__tabs .spacer{flex:1 1 auto}.account__header__bio{overflow:hidden;margin:0 -5px}.account__header__bio .account__header__content{padding:20px 15px;padding-bottom:5px;color:#fff}.account__header__bio .account__header__fields{margin:0;border-top:1px solid #26374d}.account__header__bio .account__header__fields a{color:#e1b590}.account__header__bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.account__header__bio .account__header__fields .verified a{color:#79bd9a}.account__header__extra{margin-top:4px}.account__header__extra__links{font-size:14px;color:#9baec8;padding:10px 0}.account__header__extra__links a{display:inline-block;color:#9baec8;text-decoration:none;padding:5px 10px;font-weight:500}.account__header__extra__links a strong{font-weight:700;color:#fff}.domain{padding:10px;border-bottom:1px solid #202e3f}.domain .domain__domain-name{flex:1 1 auto;display:block;color:#fff;text-decoration:none;font-size:14px;font-weight:500}.domain__wrapper{display:flex}.domain_buttons{height:18px;padding:10px;white-space:nowrap}@keyframes spring-flip-in{0%{transform:rotate(0deg)}30%{transform:rotate(-242.4deg)}60%{transform:rotate(-158.35deg)}90%{transform:rotate(-187.5deg)}100%{transform:rotate(-180deg)}}@keyframes spring-flip-out{0%{transform:rotate(-180deg)}30%{transform:rotate(62.4deg)}60%{transform:rotate(-21.635deg)}90%{transform:rotate(7.5deg)}100%{transform:rotate(0deg)}}.status__content--with-action{cursor:pointer}.status__content{position:relative;margin:10px 0;font-size:15px;line-height:20px;word-wrap:break-word;font-weight:400;overflow:visible;padding-top:5px}.status__content:focus{outline:0}.status__content .emojione{width:20px;height:20px;margin:-3px 0 0}.status__content img{max-width:100%;max-height:400px;object-fit:contain}.status__content p,.status__content pre,.status__content blockquote{margin-bottom:20px;white-space:pre-wrap}.status__content p:last-child,.status__content pre:last-child,.status__content blockquote:last-child{margin-bottom:0}.status__content .status__content__text,.status__content .e-content{overflow:hidden}.status__content .status__content__text>ul,.status__content .status__content__text>ol,.status__content .e-content>ul,.status__content .e-content>ol{margin-bottom:20px}.status__content .status__content__text h1,.status__content .status__content__text h2,.status__content .status__content__text h3,.status__content .status__content__text h4,.status__content .status__content__text h5,.status__content .e-content h1,.status__content .e-content h2,.status__content .e-content h3,.status__content .e-content h4,.status__content .e-content h5{margin-top:20px;margin-bottom:20px}.status__content .status__content__text h1,.status__content .status__content__text h2,.status__content .e-content h1,.status__content .e-content h2{font-weight:700;font-size:1.2em}.status__content .status__content__text h2,.status__content .e-content h2{font-size:1.1em}.status__content .status__content__text h3,.status__content .status__content__text h4,.status__content .status__content__text h5,.status__content .e-content h3,.status__content .e-content h4,.status__content .e-content h5{font-weight:500}.status__content .status__content__text blockquote,.status__content .e-content blockquote{padding-left:10px;border-left:3px solid #9baec8;color:#9baec8;white-space:normal}.status__content .status__content__text blockquote p:last-child,.status__content .e-content blockquote p:last-child{margin-bottom:0}.status__content .status__content__text b,.status__content .status__content__text strong,.status__content .e-content b,.status__content .e-content strong{font-weight:700}.status__content .status__content__text em,.status__content .status__content__text i,.status__content .e-content em,.status__content .e-content i{font-style:italic}.status__content .status__content__text sub,.status__content .e-content sub{font-size:smaller;text-align:sub}.status__content .status__content__text sup,.status__content .e-content sup{font-size:smaller;vertical-align:super}.status__content .status__content__text ul,.status__content .status__content__text ol,.status__content .e-content ul,.status__content .e-content ol{margin-left:1em}.status__content .status__content__text ul p,.status__content .status__content__text ol p,.status__content .e-content ul p,.status__content .e-content ol p{margin:0}.status__content .status__content__text ul,.status__content .e-content ul{list-style-type:disc}.status__content .status__content__text ol,.status__content .e-content ol{list-style-type:decimal}.status__content a{color:#d8a070;text-decoration:none}.status__content a:hover{text-decoration:underline}.status__content a:hover .fa{color:#4a6b94}.status__content a.mention:hover{text-decoration:none}.status__content a.mention:hover span{text-decoration:underline}.status__content a .fa{color:#3e5a7c}.status__content .status__content__spoiler{display:none}.status__content .status__content__spoiler.status__content__spoiler--visible{display:block}.status__content a.unhandled-link{color:#e1b590}.status__content a.unhandled-link .link-origin-tag{color:#ca8f04;font-size:.8em}.status__content .status__content__spoiler-link{background:#45648a}.status__content .status__content__spoiler-link:hover{background:#4a6b94;text-decoration:none}.status__content__spoiler-link{display:inline-block;border-radius:2px;background:#45648a;border:none;color:#121a24;font-weight:500;font-size:11px;padding:0 5px;text-transform:uppercase;line-height:inherit;cursor:pointer;vertical-align:bottom}.status__content__spoiler-link:hover{background:#4a6b94;text-decoration:none}.status__content__spoiler-link .status__content__spoiler-icon{display:inline-block;margin:0 0 0 5px;border-left:1px solid currentColor;padding:0 0 0 4px;font-size:16px;vertical-align:-2px}.notif-cleaning .status,.notif-cleaning .notification-follow,.notif-cleaning .notification-follow-request{padding-right:4.5rem}.status__wrapper--filtered{color:#3e5a7c;border:0;font-size:inherit;text-align:center;line-height:inherit;margin:0;padding:15px;box-sizing:border-box;width:100%;clear:both;border-bottom:1px solid #202e3f}.status__prepend-icon-wrapper{left:-26px;position:absolute}.notification-follow,.notification-follow-request{position:relative;border-bottom:1px solid #202e3f}.notification-follow .account,.notification-follow-request .account{border-bottom:0 none}.focusable:focus{outline:0;background:#192432}.focusable:focus.status.status-direct:not(.read){background:#26374d}.focusable:focus.status.status-direct:not(.read).muted{background:transparent}.focusable:focus .detailed-status,.focusable:focus .detailed-status__action-bar{background:#202e3f}.status{padding:10px 14px;position:relative;height:auto;border-bottom:1px solid #202e3f;cursor:default;opacity:1;animation:fade 150ms linear}@supports(-ms-overflow-style: -ms-autohiding-scrollbar){.status{padding-right:28px}}@keyframes fade{0%{opacity:0}100%{opacity:1}}.status .video-player,.status .audio-player{margin-top:8px}.status.status-direct:not(.read){background:#202e3f;border-bottom-color:#26374d}.status.light .status__relative-time{color:#3e5a7c}.status.light .status__display-name{color:#121a24}.status.light .display-name strong{color:#121a24}.status.light .display-name span{color:#3e5a7c}.status.light .status__content{color:#121a24}.status.light .status__content a{color:#d8a070}.status.light .status__content a.status__content__spoiler-link{color:#fff;background:#9baec8}.status.light .status__content a.status__content__spoiler-link:hover{background:#b5c3d6}.status.collapsed{background-position:center;background-size:cover;user-select:none}.status.collapsed.has-background::before{display:block;position:absolute;left:0;right:0;top:0;bottom:0;background-image:linear-gradient(to bottom, rgba(0, 0, 0, 0.75), rgba(0, 0, 0, 0.65) 24px, rgba(0, 0, 0, 0.8));pointer-events:none;content:\"\"}.status.collapsed .display-name:hover .display-name__html{text-decoration:none}.status.collapsed .status__content{height:20px;overflow:hidden;text-overflow:ellipsis;padding-top:0}.status.collapsed .status__content:after{content:\"\";position:absolute;top:0;bottom:0;left:0;right:0;background:linear-gradient(rgba(18, 26, 36, 0), #121a24);pointer-events:none}.status.collapsed .status__content a:hover{text-decoration:none}.status.collapsed:focus>.status__content:after{background:linear-gradient(rgba(25, 36, 50, 0), #192432)}.status.collapsed.status-direct:not(.read)>.status__content:after{background:linear-gradient(rgba(32, 46, 63, 0), #202e3f)}.status.collapsed .notification__message{margin-bottom:0}.status.collapsed .status__info .notification__message>span{white-space:nowrap}.status .notification__message{margin:-10px 0px 10px 0}.notification-favourite .status.status-direct{background:transparent}.notification-favourite .status.status-direct .icon-button.disabled{color:#547aa9}.status__relative-time{display:inline-block;flex-grow:1;color:#3e5a7c;font-size:14px;text-align:right;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.status__display-name{color:#3e5a7c;overflow:hidden}.status__info__account .status__display-name{display:block;max-width:100%}.status__info{display:flex;justify-content:space-between;font-size:15px}.status__info>span{text-overflow:ellipsis;overflow:hidden}.status__info .notification__message>span{word-wrap:break-word}.status__info__icons{display:flex;align-items:center;height:1em;color:#3e5a7c}.status__info__icons .status__media-icon,.status__info__icons .status__visibility-icon,.status__info__icons .status__reply-icon{padding-left:2px;padding-right:2px}.status__info__icons .status__collapse-button.active>.fa-angle-double-up{transform:rotate(-180deg)}.no-reduce-motion .status__collapse-button.activate>.fa-angle-double-up{animation:spring-flip-in 1s linear}.no-reduce-motion .status__collapse-button.deactivate>.fa-angle-double-up{animation:spring-flip-out 1s linear}.status__info__account{display:flex;align-items:center;justify-content:flex-start}.status-check-box{border-bottom:1px solid #d9e1e8;display:flex}.status-check-box .status-check-box__status{margin:10px 0 10px 10px;flex:1}.status-check-box .status-check-box__status .media-gallery{max-width:250px}.status-check-box .status-check-box__status .status__content{padding:0;white-space:normal}.status-check-box .status-check-box__status .video-player,.status-check-box .status-check-box__status .audio-player{margin-top:8px;max-width:250px}.status-check-box .status-check-box__status .media-gallery__item-thumbnail{cursor:default}.status-check-box-toggle{align-items:center;display:flex;flex:0 0 auto;justify-content:center;padding:10px}.status__prepend{margin-top:-10px;margin-bottom:10px;margin-left:58px;color:#3e5a7c;padding:8px 0;padding-bottom:2px;font-size:14px;position:relative}.status__prepend .status__display-name strong{color:#3e5a7c}.status__prepend>span{display:block;overflow:hidden;text-overflow:ellipsis}.status__action-bar{align-items:center;display:flex;margin-top:8px}.status__action-bar__counter{display:inline-flex;margin-right:11px;align-items:center}.status__action-bar__counter .status__action-bar-button{margin-right:4px}.status__action-bar__counter__label{display:inline-block;width:14px;font-size:12px;font-weight:500;color:#3e5a7c}.status__action-bar-button{margin-right:18px}.status__action-bar-dropdown{height:23.15px;width:23.15px}.detailed-status__action-bar-dropdown{flex:1 1 auto;display:flex;align-items:center;justify-content:center;position:relative}.detailed-status{background:#192432;padding:14px 10px}.detailed-status--flex{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-start}.detailed-status--flex .status__content,.detailed-status--flex .detailed-status__meta{flex:100%}.detailed-status .status__content{font-size:19px;line-height:24px}.detailed-status .status__content .emojione{width:24px;height:24px;margin:-1px 0 0}.detailed-status .video-player,.detailed-status .audio-player{margin-top:8px}.detailed-status__meta{margin-top:15px;color:#3e5a7c;font-size:14px;line-height:18px}.detailed-status__action-bar{background:#192432;border-top:1px solid #202e3f;border-bottom:1px solid #202e3f;display:flex;flex-direction:row;padding:10px 0}.detailed-status__link{color:inherit;text-decoration:none}.detailed-status__favorites,.detailed-status__reblogs{display:inline-block;font-weight:500;font-size:12px;margin-left:6px}.status__display-name,.status__relative-time,.detailed-status__display-name,.detailed-status__datetime,.detailed-status__application,.account__display-name{text-decoration:none}.status__display-name strong,.account__display-name strong{color:#fff}.muted .emojione{opacity:.5}a.status__display-name:hover strong,.reply-indicator__display-name:hover strong,.detailed-status__display-name:hover strong,.account__display-name:hover strong{text-decoration:underline}.account__display-name strong{display:block;overflow:hidden;text-overflow:ellipsis}.detailed-status__application,.detailed-status__datetime{color:inherit}.detailed-status .button.logo-button{margin-bottom:15px}.detailed-status__display-name{color:#d9e1e8;display:block;line-height:24px;margin-bottom:15px;overflow:hidden}.detailed-status__display-name strong,.detailed-status__display-name span{display:block;text-overflow:ellipsis;overflow:hidden}.detailed-status__display-name strong{font-size:16px;color:#fff}.detailed-status__display-avatar{float:left;margin-right:10px}.status__avatar{flex:none;margin:0 10px 0 0;height:48px;width:48px}.muted .status__content,.muted .status__content p,.muted .status__content a,.muted .status__content__text{color:#3e5a7c}.muted .status__display-name strong{color:#3e5a7c}.muted .status__avatar{opacity:.5}.muted a.status__content__spoiler-link{background:#3e5a7c;color:#121a24}.muted a.status__content__spoiler-link:hover{background:#436187;text-decoration:none}.status__relative-time:hover,.detailed-status__datetime:hover{text-decoration:underline}.status-card{display:flex;font-size:14px;border:1px solid #202e3f;border-radius:4px;color:#3e5a7c;margin-top:14px;text-decoration:none;overflow:hidden}.status-card__actions{bottom:0;left:0;position:absolute;right:0;top:0;display:flex;justify-content:center;align-items:center}.status-card__actions>div{background:rgba(0,0,0,.6);border-radius:8px;padding:12px 9px;flex:0 0 auto;display:flex;justify-content:center;align-items:center}.status-card__actions button,.status-card__actions a{display:inline;color:#d9e1e8;background:transparent;border:0;padding:0 8px;text-decoration:none;font-size:18px;line-height:18px}.status-card__actions button:hover,.status-card__actions button:active,.status-card__actions button:focus,.status-card__actions a:hover,.status-card__actions a:active,.status-card__actions a:focus{color:#fff}.status-card__actions a{font-size:19px;position:relative;bottom:-1px}.status-card__actions a .fa,.status-card__actions a:hover .fa{color:inherit}a.status-card{cursor:pointer}a.status-card:hover{background:#202e3f}.status-card-photo{cursor:zoom-in;display:block;text-decoration:none;width:100%;height:auto;margin:0}.status-card-video iframe{width:100%;height:100%}.status-card__title{display:block;font-weight:500;margin-bottom:5px;color:#9baec8;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-decoration:none}.status-card__content{flex:1 1 auto;overflow:hidden;padding:14px 14px 14px 8px}.status-card__description{color:#9baec8}.status-card__host{display:block;margin-top:5px;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-card__image{flex:0 0 100px;background:#202e3f;position:relative}.status-card__image>.fa{font-size:21px;position:absolute;transform-origin:50% 50%;top:50%;left:50%;transform:translate(-50%, -50%)}.status-card.horizontal{display:block}.status-card.horizontal .status-card__image{width:100%}.status-card.horizontal .status-card__image-image{border-radius:4px 4px 0 0}.status-card.horizontal .status-card__title{white-space:inherit}.status-card.compact{border-color:#192432}.status-card.compact.interactive{border:0}.status-card.compact .status-card__content{padding:8px;padding-top:10px}.status-card.compact .status-card__title{white-space:nowrap}.status-card.compact .status-card__image{flex:0 0 60px}a.status-card.compact:hover{background-color:#192432}.status-card__image-image{border-radius:4px 0 0 4px;display:block;margin:0;width:100%;height:100%;object-fit:cover;background-size:cover;background-position:center center}.attachment-list{display:flex;font-size:14px;border:1px solid #202e3f;border-radius:4px;margin-top:14px;overflow:hidden}.attachment-list__icon{flex:0 0 auto;color:#3e5a7c;padding:8px 18px;cursor:default;border-right:1px solid #202e3f;display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:26px}.attachment-list__icon .fa{display:block}.attachment-list__list{list-style:none;padding:4px 0;padding-left:8px;display:flex;flex-direction:column;justify-content:center}.attachment-list__list li{display:block;padding:4px 0}.attachment-list__list a{text-decoration:none;color:#3e5a7c;font-weight:500}.attachment-list__list a:hover{text-decoration:underline}.attachment-list.compact{border:0;margin-top:4px}.attachment-list.compact .attachment-list__list{padding:0;display:block}.attachment-list.compact .fa{color:#3e5a7c}.status__wrapper--filtered__button{display:inline;color:#e1b590;border:0;background:transparent;padding:0;font-size:inherit;line-height:inherit}.status__wrapper--filtered__button:hover,.status__wrapper--filtered__button:active{text-decoration:underline}.modal-container--preloader{background:#202e3f}.modal-root{position:relative;transition:opacity .3s linear;will-change:opacity;z-index:9999}.modal-root__overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.7)}.modal-root__container{position:fixed;top:0;left:0;width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;align-content:space-around;z-index:9999;pointer-events:none;user-select:none}.modal-root__modal{pointer-events:auto;display:flex;z-index:9999}.onboarding-modal,.error-modal,.embed-modal{background:#d9e1e8;color:#121a24;border-radius:8px;overflow:hidden;display:flex;flex-direction:column}.onboarding-modal__pager{height:80vh;width:80vw;max-width:520px;max-height:470px}.onboarding-modal__pager .react-swipeable-view-container>div{width:100%;height:100%;box-sizing:border-box;display:none;flex-direction:column;align-items:center;justify-content:center;display:flex;user-select:text}.error-modal__body{height:80vh;width:80vw;max-width:520px;max-height:420px;position:relative}.error-modal__body>div{position:absolute;top:0;left:0;width:100%;height:100%;box-sizing:border-box;padding:25px;display:none;flex-direction:column;align-items:center;justify-content:center;display:flex;opacity:0;user-select:text}.error-modal__body{display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center}@media screen and (max-width: 550px){.onboarding-modal{width:100%;height:100%;border-radius:0}.onboarding-modal__pager{width:100%;height:auto;max-width:none;max-height:none;flex:1 1 auto}}.onboarding-modal__paginator,.error-modal__footer{flex:0 0 auto;background:#c0cdd9;display:flex;padding:25px}.onboarding-modal__paginator>div,.error-modal__footer>div{min-width:33px}.onboarding-modal__paginator .onboarding-modal__nav,.onboarding-modal__paginator .error-modal__nav,.error-modal__footer .onboarding-modal__nav,.error-modal__footer .error-modal__nav{color:#3e5a7c;border:0;font-size:14px;font-weight:500;padding:10px 25px;line-height:inherit;height:auto;margin:-10px;border-radius:4px;background-color:transparent}.onboarding-modal__paginator .onboarding-modal__nav:hover,.onboarding-modal__paginator .onboarding-modal__nav:focus,.onboarding-modal__paginator .onboarding-modal__nav:active,.onboarding-modal__paginator .error-modal__nav:hover,.onboarding-modal__paginator .error-modal__nav:focus,.onboarding-modal__paginator .error-modal__nav:active,.error-modal__footer .onboarding-modal__nav:hover,.error-modal__footer .onboarding-modal__nav:focus,.error-modal__footer .onboarding-modal__nav:active,.error-modal__footer .error-modal__nav:hover,.error-modal__footer .error-modal__nav:focus,.error-modal__footer .error-modal__nav:active{color:#37506f;background-color:#a6b9c9}.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next,.error-modal__footer .error-modal__nav.onboarding-modal__done,.error-modal__footer .error-modal__nav.onboarding-modal__next{color:#121a24}.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:hover,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:focus,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:active,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:hover,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:focus,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:active,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:hover,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:focus,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:active,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:hover,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:focus,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:active,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:hover,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:focus,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:active,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:hover,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:focus,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:active,.error-modal__footer .error-modal__nav.onboarding-modal__done:hover,.error-modal__footer .error-modal__nav.onboarding-modal__done:focus,.error-modal__footer .error-modal__nav.onboarding-modal__done:active,.error-modal__footer .error-modal__nav.onboarding-modal__next:hover,.error-modal__footer .error-modal__nav.onboarding-modal__next:focus,.error-modal__footer .error-modal__nav.onboarding-modal__next:active{color:#192432}.error-modal__footer{justify-content:center}.onboarding-modal__dots{flex:1 1 auto;display:flex;align-items:center;justify-content:center}.onboarding-modal__dot{width:14px;height:14px;border-radius:14px;background:#a6b9c9;margin:0 3px;cursor:pointer}.onboarding-modal__dot:hover{background:#a0b4c5}.onboarding-modal__dot.active{cursor:default;background:#8da5ba}.onboarding-modal__page__wrapper{pointer-events:none;padding:25px;padding-bottom:0}.onboarding-modal__page__wrapper.onboarding-modal__page__wrapper--active{pointer-events:auto}.onboarding-modal__page{cursor:default;line-height:21px}.onboarding-modal__page h1{font-size:18px;font-weight:500;color:#121a24;margin-bottom:20px}.onboarding-modal__page a{color:#d8a070}.onboarding-modal__page a:hover,.onboarding-modal__page a:focus,.onboarding-modal__page a:active{color:#dcab80}.onboarding-modal__page .navigation-bar a{color:inherit}.onboarding-modal__page p{font-size:16px;color:#3e5a7c;margin-top:10px;margin-bottom:10px}.onboarding-modal__page p:last-child{margin-bottom:0}.onboarding-modal__page p strong{font-weight:500;background:#121a24;color:#d9e1e8;border-radius:4px;font-size:14px;padding:3px 6px}.onboarding-modal__page p strong:lang(ja){font-weight:700}.onboarding-modal__page p strong:lang(ko){font-weight:700}.onboarding-modal__page p strong:lang(zh-CN){font-weight:700}.onboarding-modal__page p strong:lang(zh-HK){font-weight:700}.onboarding-modal__page p strong:lang(zh-TW){font-weight:700}.onboarding-modal__page__wrapper-0{height:100%;padding:0}.onboarding-modal__page-one__lead{padding:65px;padding-top:45px;padding-bottom:0;margin-bottom:10px}.onboarding-modal__page-one__lead h1{font-size:26px;line-height:36px;margin-bottom:8px}.onboarding-modal__page-one__lead p{margin-bottom:0}.onboarding-modal__page-one__extra{padding-right:65px;padding-left:185px;text-align:center}.display-case{text-align:center;font-size:15px;margin-bottom:15px}.display-case__label{font-weight:500;color:#121a24;margin-bottom:5px;text-transform:uppercase;font-size:12px}.display-case__case{background:#121a24;color:#d9e1e8;font-weight:500;padding:10px;border-radius:4px}.onboarding-modal__page-two p,.onboarding-modal__page-three p,.onboarding-modal__page-four p,.onboarding-modal__page-five p{text-align:left}.onboarding-modal__page-two .figure,.onboarding-modal__page-three .figure,.onboarding-modal__page-four .figure,.onboarding-modal__page-five .figure{background:#040609;color:#d9e1e8;margin-bottom:20px;border-radius:4px;padding:10px;text-align:center;font-size:14px;box-shadow:1px 2px 6px rgba(0,0,0,.3)}.onboarding-modal__page-two .figure .onboarding-modal__image,.onboarding-modal__page-three .figure .onboarding-modal__image,.onboarding-modal__page-four .figure .onboarding-modal__image,.onboarding-modal__page-five .figure .onboarding-modal__image{border-radius:4px;margin-bottom:10px}.onboarding-modal__page-two .figure.non-interactive,.onboarding-modal__page-three .figure.non-interactive,.onboarding-modal__page-four .figure.non-interactive,.onboarding-modal__page-five .figure.non-interactive{pointer-events:none;text-align:left}.onboarding-modal__page-four__columns .row{display:flex;margin-bottom:20px}.onboarding-modal__page-four__columns .row>div{flex:1 1 0;margin:0 10px}.onboarding-modal__page-four__columns .row>div:first-child{margin-left:0}.onboarding-modal__page-four__columns .row>div:last-child{margin-right:0}.onboarding-modal__page-four__columns .row>div p{text-align:center}.onboarding-modal__page-four__columns .row:last-child{margin-bottom:0}.onboarding-modal__page-four__columns .column-header{color:#fff}@media screen and (max-width: 320px)and (max-height: 600px){.onboarding-modal__page p{font-size:14px;line-height:20px}.onboarding-modal__page-two .figure,.onboarding-modal__page-three .figure,.onboarding-modal__page-four .figure,.onboarding-modal__page-five .figure{font-size:12px;margin-bottom:10px}.onboarding-modal__page-four__columns .row{margin-bottom:10px}.onboarding-modal__page-four__columns .column-header{padding:5px;font-size:12px}}.onboard-sliders{display:inline-block;max-width:30px;max-height:auto;margin-left:10px}.boost-modal,.doodle-modal,.favourite-modal,.confirmation-modal,.report-modal,.actions-modal,.mute-modal,.block-modal{background:#f2f5f7;color:#121a24;border-radius:8px;overflow:hidden;max-width:90vw;width:480px;position:relative;flex-direction:column}.boost-modal .status__relative-time,.doodle-modal .status__relative-time,.favourite-modal .status__relative-time,.confirmation-modal .status__relative-time,.report-modal .status__relative-time,.actions-modal .status__relative-time,.mute-modal .status__relative-time,.block-modal .status__relative-time{color:#3e5a7c;float:right;font-size:14px;width:auto;margin:initial;padding:initial}.boost-modal .status__display-name,.doodle-modal .status__display-name,.favourite-modal .status__display-name,.confirmation-modal .status__display-name,.report-modal .status__display-name,.actions-modal .status__display-name,.mute-modal .status__display-name,.block-modal .status__display-name{display:flex}.boost-modal .status__avatar,.doodle-modal .status__avatar,.favourite-modal .status__avatar,.confirmation-modal .status__avatar,.report-modal .status__avatar,.actions-modal .status__avatar,.mute-modal .status__avatar,.block-modal .status__avatar{height:48px;width:48px}.boost-modal .status__content__spoiler-link,.doodle-modal .status__content__spoiler-link,.favourite-modal .status__content__spoiler-link,.confirmation-modal .status__content__spoiler-link,.report-modal .status__content__spoiler-link,.actions-modal .status__content__spoiler-link,.mute-modal .status__content__spoiler-link,.block-modal .status__content__spoiler-link{color:#f2f5f7}.actions-modal .status{background:#fff;border-bottom-color:#d9e1e8;padding-top:10px;padding-bottom:10px}.actions-modal .dropdown-menu__separator{border-bottom-color:#d9e1e8}.boost-modal__container,.favourite-modal__container{overflow-x:scroll;padding:10px}.boost-modal__container .status,.favourite-modal__container .status{user-select:text;border-bottom:0}.boost-modal__action-bar,.doodle-modal__action-bar,.favourite-modal__action-bar,.confirmation-modal__action-bar,.mute-modal__action-bar,.block-modal__action-bar{display:flex;justify-content:space-between;background:#d9e1e8;padding:10px;line-height:36px}.boost-modal__action-bar>div,.doodle-modal__action-bar>div,.favourite-modal__action-bar>div,.confirmation-modal__action-bar>div,.mute-modal__action-bar>div,.block-modal__action-bar>div{flex:1 1 auto;text-align:right;color:#3e5a7c;padding-right:10px}.boost-modal__action-bar .button,.doodle-modal__action-bar .button,.favourite-modal__action-bar .button,.confirmation-modal__action-bar .button,.mute-modal__action-bar .button,.block-modal__action-bar .button{flex:0 0 auto}.boost-modal__status-header,.favourite-modal__status-header{font-size:15px}.boost-modal__status-time,.favourite-modal__status-time{float:right;font-size:14px}.mute-modal,.block-modal{line-height:24px}.mute-modal .react-toggle,.block-modal .react-toggle{vertical-align:middle}.report-modal{width:90vw;max-width:700px}.report-modal__container{display:flex;border-top:1px solid #d9e1e8}@media screen and (max-width: 480px){.report-modal__container{flex-wrap:wrap;overflow-y:auto}}.report-modal__statuses,.report-modal__comment{box-sizing:border-box;width:50%}@media screen and (max-width: 480px){.report-modal__statuses,.report-modal__comment{width:100%}}.report-modal__statuses,.focal-point-modal__content{flex:1 1 auto;min-height:20vh;max-height:80vh;overflow-y:auto;overflow-x:hidden}.report-modal__statuses .status__content a,.focal-point-modal__content .status__content a{color:#d8a070}@media screen and (max-width: 480px){.report-modal__statuses,.focal-point-modal__content{max-height:10vh}}@media screen and (max-width: 480px){.focal-point-modal__content{max-height:40vh}}.report-modal__comment{padding:20px;border-right:1px solid #d9e1e8;max-width:320px}.report-modal__comment p{font-size:14px;line-height:20px;margin-bottom:20px}.report-modal__comment .setting-text{display:block;box-sizing:border-box;width:100%;margin:0;color:#121a24;background:#fff;padding:10px;font-family:inherit;font-size:14px;resize:none;border:0;outline:0;border-radius:4px;border:1px solid #d9e1e8;min-height:100px;max-height:50vh;margin-bottom:10px}.report-modal__comment .setting-text:focus{border:1px solid #c0cdd9}.report-modal__comment .setting-text__wrapper{background:#fff;border:1px solid #d9e1e8;margin-bottom:10px;border-radius:4px}.report-modal__comment .setting-text__wrapper .setting-text{border:0;margin-bottom:0;border-radius:0}.report-modal__comment .setting-text__wrapper .setting-text:focus{border:0}.report-modal__comment .setting-text__wrapper__modifiers{color:#121a24;font-family:inherit;font-size:14px;background:#fff}.report-modal__comment .setting-text__toolbar{display:flex;justify-content:space-between;margin-bottom:20px}.report-modal__comment .setting-text-label{display:block;color:#121a24;font-size:14px;font-weight:500;margin-bottom:10px}.report-modal__comment .setting-toggle{margin-top:20px;margin-bottom:24px}.report-modal__comment .setting-toggle__label{color:#121a24;font-size:14px}@media screen and (max-width: 480px){.report-modal__comment{padding:10px;max-width:100%;order:2}.report-modal__comment .setting-toggle{margin-bottom:4px}}.actions-modal{max-height:80vh;max-width:80vw}.actions-modal .status{overflow-y:auto;max-height:300px}.actions-modal strong{display:block;font-weight:500}.actions-modal .actions-modal__item-label{font-weight:500}.actions-modal ul{overflow-y:auto;flex-shrink:0;max-height:80vh}.actions-modal ul.with-status{max-height:calc(80vh - 75px)}.actions-modal ul li:empty{margin:0}.actions-modal ul li:not(:empty) a{color:#121a24;display:flex;padding:12px 16px;font-size:15px;align-items:center;text-decoration:none}.actions-modal ul li:not(:empty) a,.actions-modal ul li:not(:empty) a button{transition:none}.actions-modal ul li:not(:empty) a.active,.actions-modal ul li:not(:empty) a.active button,.actions-modal ul li:not(:empty) a:hover,.actions-modal ul li:not(:empty) a:hover button,.actions-modal ul li:not(:empty) a:active,.actions-modal ul li:not(:empty) a:active button,.actions-modal ul li:not(:empty) a:focus,.actions-modal ul li:not(:empty) a:focus button{background:#d8a070;color:#fff}.actions-modal ul li:not(:empty) a>.react-toggle,.actions-modal ul li:not(:empty) a>.icon,.actions-modal ul li:not(:empty) a button:first-child{margin-right:10px}.confirmation-modal__action-bar .confirmation-modal__secondary-button,.mute-modal__action-bar .confirmation-modal__secondary-button,.block-modal__action-bar .confirmation-modal__secondary-button{flex-shrink:1}.confirmation-modal__secondary-button,.confirmation-modal__cancel-button,.mute-modal__cancel-button,.block-modal__cancel-button{background-color:transparent;color:#3e5a7c;font-size:14px;font-weight:500}.confirmation-modal__secondary-button:hover,.confirmation-modal__secondary-button:focus,.confirmation-modal__secondary-button:active,.confirmation-modal__cancel-button:hover,.confirmation-modal__cancel-button:focus,.confirmation-modal__cancel-button:active,.mute-modal__cancel-button:hover,.mute-modal__cancel-button:focus,.mute-modal__cancel-button:active,.block-modal__cancel-button:hover,.block-modal__cancel-button:focus,.block-modal__cancel-button:active{color:#37506f;background-color:transparent}.confirmation-modal__do_not_ask_again{padding-left:20px;padding-right:20px;padding-bottom:10px;font-size:14px}.confirmation-modal__do_not_ask_again label,.confirmation-modal__do_not_ask_again input{vertical-align:middle}.confirmation-modal__container,.mute-modal__container,.block-modal__container,.report-modal__target{padding:30px;font-size:16px}.confirmation-modal__container strong,.mute-modal__container strong,.block-modal__container strong,.report-modal__target strong{font-weight:500}.confirmation-modal__container strong:lang(ja),.mute-modal__container strong:lang(ja),.block-modal__container strong:lang(ja),.report-modal__target strong:lang(ja){font-weight:700}.confirmation-modal__container strong:lang(ko),.mute-modal__container strong:lang(ko),.block-modal__container strong:lang(ko),.report-modal__target strong:lang(ko){font-weight:700}.confirmation-modal__container strong:lang(zh-CN),.mute-modal__container strong:lang(zh-CN),.block-modal__container strong:lang(zh-CN),.report-modal__target strong:lang(zh-CN){font-weight:700}.confirmation-modal__container strong:lang(zh-HK),.mute-modal__container strong:lang(zh-HK),.block-modal__container strong:lang(zh-HK),.report-modal__target strong:lang(zh-HK){font-weight:700}.confirmation-modal__container strong:lang(zh-TW),.mute-modal__container strong:lang(zh-TW),.block-modal__container strong:lang(zh-TW),.report-modal__target strong:lang(zh-TW){font-weight:700}.confirmation-modal__container,.report-modal__target{text-align:center}.block-modal__explanation,.mute-modal__explanation{margin-top:20px}.block-modal .setting-toggle,.mute-modal .setting-toggle{margin-top:20px;margin-bottom:24px;display:flex;align-items:center}.block-modal .setting-toggle__label,.mute-modal .setting-toggle__label{color:#121a24;margin:0;margin-left:8px}.report-modal__target{padding:15px}.report-modal__target .media-modal__close{top:14px;right:15px}.embed-modal{width:auto;max-width:80vw;max-height:80vh}.embed-modal h4{padding:30px;font-weight:500;font-size:16px;text-align:center}.embed-modal .embed-modal__container{padding:10px}.embed-modal .embed-modal__container .hint{margin-bottom:15px}.embed-modal .embed-modal__container .embed-modal__html{outline:0;box-sizing:border-box;display:block;width:100%;border:none;padding:10px;font-family:\"mastodon-font-monospace\",monospace;background:#121a24;color:#fff;font-size:14px;margin:0;margin-bottom:15px;border-radius:4px}.embed-modal .embed-modal__container .embed-modal__html::-moz-focus-inner{border:0}.embed-modal .embed-modal__container .embed-modal__html::-moz-focus-inner,.embed-modal .embed-modal__container .embed-modal__html:focus,.embed-modal .embed-modal__container .embed-modal__html:active{outline:0 !important}.embed-modal .embed-modal__container .embed-modal__html:focus{background:#192432}@media screen and (max-width: 600px){.embed-modal .embed-modal__container .embed-modal__html{font-size:16px}}.embed-modal .embed-modal__container .embed-modal__iframe{width:400px;max-width:100%;overflow:hidden;border:0;border-radius:4px}.focal-point{position:relative;cursor:move;overflow:hidden;height:100%;display:flex;justify-content:center;align-items:center;background:#000}.focal-point img,.focal-point video,.focal-point canvas{display:block;max-height:80vh;width:100%;height:auto;margin:0;object-fit:contain;background:#000}.focal-point__reticle{position:absolute;width:100px;height:100px;transform:translate(-50%, -50%);background:url(\"~images/reticle.png\") no-repeat 0 0;border-radius:50%;box-shadow:0 0 0 9999em rgba(0,0,0,.35)}.focal-point__overlay{position:absolute;width:100%;height:100%;top:0;left:0}.focal-point__preview{position:absolute;bottom:10px;right:10px;z-index:2;cursor:move;transition:opacity .1s ease}.focal-point__preview:hover{opacity:.5}.focal-point__preview strong{color:#fff;font-size:14px;font-weight:500;display:block;margin-bottom:5px}.focal-point__preview div{border-radius:4px;box-shadow:0 0 14px rgba(0,0,0,.2)}@media screen and (max-width: 480px){.focal-point img,.focal-point video{max-height:100%}.focal-point__preview{display:none}}.filtered-status-info{text-align:start}.filtered-status-info .spoiler__text{margin-top:20px}.filtered-status-info .account{border-bottom:0}.filtered-status-info .account__display-name strong{color:#121a24}.filtered-status-info .status__content__spoiler{display:none}.filtered-status-info .status__content__spoiler--visible{display:flex}.filtered-status-info ul{padding:10px;margin-left:12px;list-style:disc inside}.filtered-status-info .filtered-status-edit-link{color:#3e5a7c;text-decoration:none}.filtered-status-info .filtered-status-edit-link:hover{text-decoration:underline}.composer{padding:10px}.character-counter{cursor:default;font-family:sans-serif,sans-serif;font-size:14px;font-weight:600;color:#3e5a7c}.character-counter.character-counter--over{color:#ff5050}.no-reduce-motion .composer--spoiler{transition:height .4s ease,opacity .4s ease}.composer--spoiler{height:0;transform-origin:bottom;opacity:0}.composer--spoiler.composer--spoiler--visible{height:36px;margin-bottom:11px;opacity:1}.composer--spoiler input{display:block;box-sizing:border-box;margin:0;border:none;border-radius:4px;padding:10px;width:100%;outline:0;color:#121a24;background:#fff;font-size:14px;font-family:inherit;resize:vertical}.composer--spoiler input::placeholder{color:#3e5a7c}.composer--spoiler input:focus{outline:0}@media screen and (max-width: 630px){.auto-columns .composer--spoiler input{font-size:16px}}.single-column .composer--spoiler input{font-size:16px}.composer--warning{color:#121a24;margin-bottom:15px;background:#9baec8;box-shadow:0 2px 6px rgba(0,0,0,.3);padding:8px 10px;border-radius:4px;font-size:13px;font-weight:400}.composer--warning a{color:#3e5a7c;font-weight:500;text-decoration:underline}.composer--warning a:active,.composer--warning a:focus,.composer--warning a:hover{text-decoration:none}.compose-form__sensitive-button{padding:10px;padding-top:0;font-size:14px;font-weight:500}.compose-form__sensitive-button.active{color:#d8a070}.compose-form__sensitive-button input[type=checkbox]{display:none}.compose-form__sensitive-button .checkbox{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-left:5px;margin-right:10px;top:-1px;border-radius:4px;vertical-align:middle}.compose-form__sensitive-button .checkbox.active{border-color:#d8a070;background:#d8a070}.composer--reply{margin:0 0 10px;border-radius:4px;padding:10px;background:#9baec8;min-height:23px;overflow-y:auto;flex:0 2 auto}.composer--reply>header{margin-bottom:5px;overflow:hidden}.composer--reply>header>.account.small{color:#121a24}.composer--reply>header>.cancel{float:right;line-height:24px}.composer--reply>.content{position:relative;margin:10px 0;padding:0 12px;font-size:14px;line-height:20px;color:#121a24;word-wrap:break-word;font-weight:400;overflow:visible;white-space:pre-wrap;padding-top:5px;overflow:hidden}.composer--reply>.content p,.composer--reply>.content pre,.composer--reply>.content blockquote{margin-bottom:20px;white-space:pre-wrap}.composer--reply>.content p:last-child,.composer--reply>.content pre:last-child,.composer--reply>.content blockquote:last-child{margin-bottom:0}.composer--reply>.content h1,.composer--reply>.content h2,.composer--reply>.content h3,.composer--reply>.content h4,.composer--reply>.content h5{margin-top:20px;margin-bottom:20px}.composer--reply>.content h1,.composer--reply>.content h2{font-weight:700;font-size:18px}.composer--reply>.content h2{font-size:16px}.composer--reply>.content h3,.composer--reply>.content h4,.composer--reply>.content h5{font-weight:500}.composer--reply>.content blockquote{padding-left:10px;border-left:3px solid #121a24;color:#121a24;white-space:normal}.composer--reply>.content blockquote p:last-child{margin-bottom:0}.composer--reply>.content b,.composer--reply>.content strong{font-weight:700}.composer--reply>.content em,.composer--reply>.content i{font-style:italic}.composer--reply>.content sub{font-size:smaller;text-align:sub}.composer--reply>.content ul,.composer--reply>.content ol{margin-left:1em}.composer--reply>.content ul p,.composer--reply>.content ol p{margin:0}.composer--reply>.content ul{list-style-type:disc}.composer--reply>.content ol{list-style-type:decimal}.composer--reply>.content a{color:#3e5a7c;text-decoration:none}.composer--reply>.content a:hover{text-decoration:underline}.composer--reply>.content a.mention:hover{text-decoration:none}.composer--reply>.content a.mention:hover span{text-decoration:underline}.composer--reply .emojione{width:20px;height:20px;margin:-5px 0 0}.emoji-picker-dropdown{position:absolute;right:5px;top:5px}.emoji-picker-dropdown ::-webkit-scrollbar-track:hover,.emoji-picker-dropdown ::-webkit-scrollbar-track:active{background-color:rgba(0,0,0,.3)}.compose-form__autosuggest-wrapper,.autosuggest-input{position:relative;width:100%}.compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea,.autosuggest-input label .autosuggest-textarea__textarea{display:block;box-sizing:border-box;margin:0;border:none;border-radius:4px 4px 0 0;padding:10px 32px 0 10px;width:100%;min-height:100px;outline:0;color:#121a24;background:#fff;font-size:14px;font-family:inherit;resize:none;scrollbar-color:initial}.compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea::placeholder,.autosuggest-input label .autosuggest-textarea__textarea::placeholder{color:#3e5a7c}.compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea::-webkit-scrollbar,.autosuggest-input label .autosuggest-textarea__textarea::-webkit-scrollbar{all:unset}.compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea:disabled,.autosuggest-input label .autosuggest-textarea__textarea:disabled{background:#d9e1e8}.compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea:focus,.autosuggest-input label .autosuggest-textarea__textarea:focus{outline:0}@media screen and (max-width: 630px){.auto-columns .compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea,.auto-columns .autosuggest-input label .autosuggest-textarea__textarea{font-size:16px}}.single-column .compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea,.single-column .autosuggest-input label .autosuggest-textarea__textarea{font-size:16px}@media screen and (max-width: 600px){.auto-columns .compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea,.single-column .compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea,.auto-columns .autosuggest-input label .autosuggest-textarea__textarea,.single-column .autosuggest-input label .autosuggest-textarea__textarea{height:100px !important;resize:vertical}}.composer--textarea--icons{display:block;position:absolute;top:29px;right:5px;bottom:5px;overflow:hidden}.composer--textarea--icons>.textarea_icon{display:block;margin:2px 0 0 2px;width:24px;height:24px;color:#3e5a7c;font-size:18px;line-height:24px;text-align:center;opacity:.8}.autosuggest-textarea__suggestions-wrapper{position:relative;height:0}.autosuggest-textarea__suggestions{display:block;position:absolute;box-sizing:border-box;top:100%;border-radius:0 0 4px 4px;padding:6px;width:100%;color:#121a24;background:#d9e1e8;box-shadow:4px 4px 6px rgba(0,0,0,.4);font-size:14px;z-index:99;display:none}.autosuggest-textarea__suggestions--visible{display:block}.autosuggest-textarea__suggestions__item{padding:10px;cursor:pointer;border-radius:4px}.autosuggest-textarea__suggestions__item:hover,.autosuggest-textarea__suggestions__item:focus,.autosuggest-textarea__suggestions__item:active,.autosuggest-textarea__suggestions__item.selected{background:#b9c8d5}.autosuggest-textarea__suggestions__item>.account,.autosuggest-textarea__suggestions__item>.emoji,.autosuggest-textarea__suggestions__item>.autosuggest-hashtag{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;line-height:18px;font-size:14px}.autosuggest-textarea__suggestions__item .autosuggest-hashtag{justify-content:space-between}.autosuggest-textarea__suggestions__item .autosuggest-hashtag__name{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.autosuggest-textarea__suggestions__item .autosuggest-hashtag strong{font-weight:500}.autosuggest-textarea__suggestions__item .autosuggest-hashtag__uses{flex:0 0 auto;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.autosuggest-textarea__suggestions__item>.account.small .display-name>span{color:#3e5a7c}.composer--upload_form{overflow:hidden}.composer--upload_form>.content{display:flex;flex-direction:row;flex-wrap:wrap;font-family:inherit;padding:5px;overflow:hidden}.composer--upload_form--item{flex:1 1 0;margin:5px;min-width:40%}.composer--upload_form--item>div{position:relative;border-radius:4px;height:140px;width:100%;background-color:#000;background-position:center;background-size:cover;background-repeat:no-repeat;overflow:hidden}.composer--upload_form--item>div textarea{display:block;position:absolute;box-sizing:border-box;bottom:0;left:0;margin:0;border:0;padding:10px;width:100%;color:#d9e1e8;background:linear-gradient(0deg, rgba(0, 0, 0, 0.8) 0, rgba(0, 0, 0, 0.35) 80%, transparent);font-size:14px;font-family:inherit;font-weight:500;opacity:0;z-index:2;transition:opacity .1s ease}.composer--upload_form--item>div textarea:focus{color:#fff}.composer--upload_form--item>div textarea::placeholder{opacity:.54;color:#d9e1e8}.composer--upload_form--item>div>.close{mix-blend-mode:difference}.composer--upload_form--item.active>div textarea{opacity:1}.composer--upload_form--actions{background:linear-gradient(180deg, rgba(0, 0, 0, 0.8) 0, rgba(0, 0, 0, 0.35) 80%, transparent);display:flex;align-items:flex-start;justify-content:space-between;opacity:0;transition:opacity .1s ease}.composer--upload_form--actions .icon-button{flex:0 1 auto;color:#d9e1e8;font-size:14px;font-weight:500;padding:10px;font-family:inherit}.composer--upload_form--actions .icon-button:hover,.composer--upload_form--actions .icon-button:focus,.composer--upload_form--actions .icon-button:active{color:#e6ebf0}.composer--upload_form--actions.active{opacity:1}.composer--upload_form--progress{display:flex;padding:10px;color:#9baec8;overflow:hidden}.composer--upload_form--progress>.fa{font-size:34px;margin-right:10px}.composer--upload_form--progress>.message{flex:1 1 auto}.composer--upload_form--progress>.message>span{display:block;font-size:12px;font-weight:500;text-transform:uppercase}.composer--upload_form--progress>.message>.backdrop{position:relative;margin-top:5px;border-radius:6px;width:100%;height:6px;background:#3e5a7c}.composer--upload_form--progress>.message>.backdrop>.tracker{position:absolute;top:0;left:0;height:6px;border-radius:6px;background:#d8a070}.compose-form__modifiers{color:#121a24;font-family:inherit;font-size:14px;background:#fff}.composer--options-wrapper{padding:10px;background:#ebebeb;border-radius:0 0 4px 4px;height:27px;display:flex;justify-content:space-between;flex:0 0 auto}.composer--options{display:flex;flex:0 0 auto}.composer--options>*{display:inline-block;box-sizing:content-box;padding:0 3px;height:27px;line-height:27px;vertical-align:bottom}.composer--options>hr{display:inline-block;margin:0 3px;border-width:0 0 0 1px;border-style:none none none solid;border-color:transparent transparent transparent #c2c2c2;padding:0;width:0;height:27px;background:transparent}.compose--counter-wrapper{align-self:center;margin-right:4px}.composer--options--dropdown.open>.value{border-radius:4px 4px 0 0;box-shadow:0 -4px 4px rgba(0,0,0,.1);color:#fff;background:#d8a070;transition:none}.composer--options--dropdown.open.top>.value{border-radius:0 0 4px 4px;box-shadow:0 4px 4px rgba(0,0,0,.1)}.composer--options--dropdown--content{position:absolute;border-radius:4px;box-shadow:2px 4px 15px rgba(0,0,0,.4);background:#fff;overflow:hidden;transform-origin:50% 0}.composer--options--dropdown--content--item{display:flex;align-items:center;padding:10px;color:#121a24;cursor:pointer}.composer--options--dropdown--content--item>.content{flex:1 1 auto;color:#3e5a7c}.composer--options--dropdown--content--item>.content:not(:first-child){margin-left:10px}.composer--options--dropdown--content--item>.content strong{display:block;color:#121a24;font-weight:500}.composer--options--dropdown--content--item:hover,.composer--options--dropdown--content--item.active{background:#d8a070;color:#fff}.composer--options--dropdown--content--item:hover>.content,.composer--options--dropdown--content--item.active>.content{color:#fff}.composer--options--dropdown--content--item:hover>.content strong,.composer--options--dropdown--content--item.active>.content strong{color:#fff}.composer--options--dropdown--content--item.active:hover{background:#dcab80}.composer--publisher{padding-top:10px;text-align:right;white-space:nowrap;overflow:hidden;justify-content:flex-end;flex:0 0 auto}.composer--publisher>.primary{display:inline-block;margin:0;padding:0 10px;text-align:center}.composer--publisher>.side_arm{display:inline-block;margin:0 2px;padding:0;width:36px;text-align:center}.composer--publisher.over>.count{color:#ff5050}.column__wrapper{display:flex;flex:1 1 auto;position:relative}.columns-area{display:flex;flex:1 1 auto;flex-direction:row;justify-content:flex-start;overflow-x:auto;position:relative}.columns-area__panels{display:flex;justify-content:center;width:100%;height:100%;min-height:100vh}.columns-area__panels__pane{height:100%;overflow:hidden;pointer-events:none;display:flex;justify-content:flex-end;min-width:285px}.columns-area__panels__pane--start{justify-content:flex-start}.columns-area__panels__pane__inner{position:fixed;width:285px;pointer-events:auto;height:100%}.columns-area__panels__main{box-sizing:border-box;width:100%;max-width:600px;flex:0 0 auto;display:flex;flex-direction:column}@media screen and (min-width: 415px){.columns-area__panels__main{padding:0 10px}}.tabs-bar__wrapper{background:#040609;position:sticky;top:0;z-index:2;padding-top:0}@media screen and (min-width: 415px){.tabs-bar__wrapper{padding-top:10px}}.tabs-bar__wrapper .tabs-bar{margin-bottom:0}@media screen and (min-width: 415px){.tabs-bar__wrapper .tabs-bar{margin-bottom:10px}}.react-swipeable-view-container,.react-swipeable-view-container .columns-area,.react-swipeable-view-container .column{height:100%}.react-swipeable-view-container>*{display:flex;align-items:center;justify-content:center;height:100%}.column{width:330px;position:relative;box-sizing:border-box;display:flex;flex-direction:column}.column>.scrollable{background:#121a24}.ui{flex:0 0 auto;display:flex;flex-direction:column;width:100%;height:100%}.column{overflow:hidden}.column-back-button{box-sizing:border-box;width:100%;background:#192432;color:#d8a070;cursor:pointer;flex:0 0 auto;font-size:16px;border:0;text-align:unset;padding:15px;margin:0;z-index:3}.column-back-button:hover{text-decoration:underline}.column-header__back-button{background:#192432;border:0;font-family:inherit;color:#d8a070;cursor:pointer;flex:0 0 auto;font-size:16px;padding:0 5px 0 0;z-index:3}.column-header__back-button:hover{text-decoration:underline}.column-header__back-button:last-child{padding:0 15px 0 0}.column-back-button__icon{display:inline-block;margin-right:5px}.column-back-button--slim{position:relative}.column-back-button--slim-button{cursor:pointer;flex:0 0 auto;font-size:16px;padding:15px;position:absolute;right:0;top:-48px}.column-link{background:#202e3f;color:#fff;display:block;font-size:16px;padding:15px;text-decoration:none}.column-link:hover,.column-link:focus,.column-link:active{background:#253549}.column-link:focus{outline:0}.column-link--transparent{background:transparent;color:#d9e1e8}.column-link--transparent:hover,.column-link--transparent:focus,.column-link--transparent:active{background:transparent;color:#fff}.column-link--transparent.active{color:#d8a070}.column-link__icon{display:inline-block;margin-right:5px}.column-subheading{background:#121a24;color:#3e5a7c;padding:8px 20px;font-size:12px;font-weight:500;text-transform:uppercase;cursor:default}.column-header__wrapper{position:relative;flex:0 0 auto}.column-header__wrapper.active::before{display:block;content:\"\";position:absolute;top:35px;left:0;right:0;margin:0 auto;width:60%;pointer-events:none;height:28px;z-index:1;background:radial-gradient(ellipse, rgba(216, 160, 112, 0.23) 0%, rgba(216, 160, 112, 0) 60%)}.column-header{display:flex;font-size:16px;background:#192432;flex:0 0 auto;cursor:pointer;position:relative;z-index:2;outline:0;overflow:hidden}.column-header>button{margin:0;border:none;padding:15px;color:inherit;background:transparent;font:inherit;text-align:left;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;flex:1}.column-header>.column-header__back-button{color:#d8a070}.column-header.active{box-shadow:0 1px 0 rgba(216,160,112,.3)}.column-header.active .column-header__icon{color:#d8a070;text-shadow:0 0 10px rgba(216,160,112,.4)}.column-header:focus,.column-header:active{outline:0}.column{width:330px;position:relative;box-sizing:border-box;display:flex;flex-direction:column;overflow:hidden}.wide .columns-area:not(.columns-area--mobile) .column{flex:auto;min-width:330px;max-width:400px}.column>.scrollable{background:#121a24}.column-header__buttons{height:48px;display:flex;margin-left:0}.column-header__links{margin-bottom:14px}.column-header__links .text-btn{margin-right:10px}.column-header__button,.column-header__notif-cleaning-buttons button{background:#192432;border:0;color:#9baec8;cursor:pointer;font-size:16px;padding:0 15px}.column-header__button:hover,.column-header__notif-cleaning-buttons button:hover{color:#b2c1d5}.column-header__button.active,.column-header__notif-cleaning-buttons button.active{color:#fff;background:#202e3f}.column-header__button.active:hover,.column-header__notif-cleaning-buttons button.active:hover{color:#fff;background:#202e3f}.column-header__button:focus,.column-header__notif-cleaning-buttons button:focus{text-shadow:0 0 4px #d3935c}.column-header__notif-cleaning-buttons{display:flex;align-items:stretch;justify-content:space-around}.column-header__notif-cleaning-buttons button{background:transparent;text-align:center;padding:10px 0;white-space:pre-wrap}.column-header__notif-cleaning-buttons b{font-weight:bold}.column-header__collapsible-inner.nopad-drawer{padding:0}.column-header__collapsible{max-height:70vh;overflow:hidden;overflow-y:auto;color:#9baec8;transition:max-height 150ms ease-in-out,opacity 300ms linear;opacity:1}.column-header__collapsible.collapsed{max-height:0;opacity:.5}.column-header__collapsible.animating{overflow-y:hidden}.column-header__collapsible hr{height:0;background:transparent;border:0;border-top:1px solid #26374d;margin:10px 0}.column-header__collapsible.ncd{transition:none}.column-header__collapsible.ncd.collapsed{max-height:0;opacity:.7}.column-header__collapsible-inner{background:#202e3f;padding:15px}.column-header__setting-btn:hover{color:#9baec8;text-decoration:underline}.column-header__setting-arrows{float:right}.column-header__setting-arrows .column-header__setting-btn{padding:0 10px}.column-header__setting-arrows .column-header__setting-btn:last-child{padding-right:0}.column-header__title{display:inline-block;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;flex:1}.column-header__icon{display:inline-block;margin-right:5px}.empty-column-indicator,.error-column{color:#3e5a7c;background:#121a24;text-align:center;padding:20px;font-size:15px;font-weight:400;cursor:default;display:flex;flex:1 1 auto;align-items:center;justify-content:center}@supports(display: grid){.empty-column-indicator,.error-column{contain:strict}}.empty-column-indicator>span,.error-column>span{max-width:400px}.empty-column-indicator a,.error-column a{color:#d8a070;text-decoration:none}.empty-column-indicator a:hover,.error-column a:hover{text-decoration:underline}.error-column{flex-direction:column}.single-column.navbar-under .tabs-bar{margin-top:0 !important;margin-bottom:-6px !important}@media screen and (max-width: 415px){.auto-columns.navbar-under .tabs-bar{margin-top:0 !important;margin-bottom:-6px !important}}@media screen and (max-width: 415px){.auto-columns.navbar-under .react-swipeable-view-container .columns-area,.single-column.navbar-under .react-swipeable-view-container .columns-area{height:100% !important}}.column-inline-form{padding:7px 15px;padding-right:5px;display:flex;justify-content:flex-start;align-items:center;background:#192432}.column-inline-form label{flex:1 1 auto}.column-inline-form label input{width:100%;margin-bottom:6px}.column-inline-form label input:focus{outline:0}.column-inline-form .icon-button{flex:0 0 auto;margin:0 5px}.regeneration-indicator{text-align:center;font-size:16px;font-weight:500;color:#3e5a7c;background:#121a24;cursor:default;display:flex;flex:1 1 auto;flex-direction:column;align-items:center;justify-content:center;padding:20px}.regeneration-indicator__figure,.regeneration-indicator__figure img{display:block;width:auto;height:160px;margin:0}.regeneration-indicator--without-header{padding-top:68px}.regeneration-indicator__label{margin-top:30px}.regeneration-indicator__label strong{display:block;margin-bottom:10px;color:#3e5a7c}.regeneration-indicator__label span{font-size:15px;font-weight:400}.directory__list{width:100%;margin:10px 0;transition:opacity 100ms ease-in}.directory__list.loading{opacity:.7}@media screen and (max-width: 415px){.directory__list{margin:0}}.directory__card{box-sizing:border-box;margin-bottom:10px}.directory__card__img{height:125px;position:relative;background:#000;overflow:hidden}.directory__card__img img{display:block;width:100%;height:100%;margin:0;object-fit:cover}.directory__card__bar{display:flex;align-items:center;background:#192432;padding:10px}.directory__card__bar__name{flex:1 1 auto;display:flex;align-items:center;text-decoration:none;overflow:hidden}.directory__card__bar__relationship{width:23px;min-height:1px;flex:0 0 auto}.directory__card__bar .avatar{flex:0 0 auto;width:48px;height:48px;padding-top:2px}.directory__card__bar .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px;background:#040609;object-fit:cover}.directory__card__bar .display-name{margin-left:15px;text-align:left}.directory__card__bar .display-name strong{font-size:15px;color:#fff;font-weight:500;overflow:hidden;text-overflow:ellipsis}.directory__card__bar .display-name span{display:block;font-size:14px;color:#9baec8;font-weight:400;overflow:hidden;text-overflow:ellipsis}.directory__card__extra{background:#121a24;display:flex;align-items:center;justify-content:center}.directory__card__extra .accounts-table__count{width:33.33%;flex:0 0 auto;padding:15px 0}.directory__card__extra .account__header__content{box-sizing:border-box;padding:15px 10px;border-bottom:1px solid #202e3f;width:100%;min-height:48px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.directory__card__extra .account__header__content p{display:none}.directory__card__extra .account__header__content p:first-child{display:inline}.directory__card__extra .account__header__content br{display:none}.filter-form{background:#121a24}.filter-form__column{padding:10px 15px}.filter-form .radio-button{display:block}.radio-button{font-size:14px;position:relative;display:inline-block;padding:6px 0;line-height:18px;cursor:default;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer}.radio-button input[type=radio],.radio-button input[type=checkbox]{display:none}.radio-button__input{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:50%;vertical-align:middle}.radio-button__input.checked{border-color:#e1b590;background:#e1b590}.search{position:relative}.search__input{outline:0;box-sizing:border-box;width:100%;border:none;box-shadow:none;font-family:inherit;background:#121a24;color:#9baec8;font-size:14px;margin:0;display:block;padding:15px;padding-right:30px;line-height:18px;font-size:16px}.search__input::placeholder{color:#a8b9cf}.search__input::-moz-focus-inner{border:0}.search__input::-moz-focus-inner,.search__input:focus,.search__input:active{outline:0 !important}.search__input:focus{background:#192432}@media screen and (max-width: 600px){.search__input{font-size:16px}}.search__icon::-moz-focus-inner{border:0}.search__icon::-moz-focus-inner,.search__icon:focus{outline:0 !important}.search__icon .fa{position:absolute;top:16px;right:10px;z-index:2;display:inline-block;opacity:0;transition:all 100ms linear;transition-property:color,transform,opacity;font-size:18px;width:18px;height:18px;color:#d9e1e8;cursor:default;pointer-events:none}.search__icon .fa.active{pointer-events:auto;opacity:.3}.search__icon .fa-search{transform:rotate(0deg)}.search__icon .fa-search.active{pointer-events:auto;opacity:.3}.search__icon .fa-times-circle{top:17px;transform:rotate(0deg);color:#3e5a7c;cursor:pointer}.search__icon .fa-times-circle.active{transform:rotate(90deg)}.search__icon .fa-times-circle:hover{color:#4a6b94}.search-results__header{color:#3e5a7c;background:#151f2b;border-bottom:1px solid #0b1016;padding:15px 10px;font-size:14px;font-weight:500}.search-results__info{padding:20px;color:#9baec8;text-align:center}.trends__header{color:#3e5a7c;background:#151f2b;border-bottom:1px solid #0b1016;font-weight:500;padding:15px;font-size:16px;cursor:default}.trends__header .fa{display:inline-block;margin-right:5px}.trends__item{display:flex;align-items:center;padding:15px;border-bottom:1px solid #202e3f}.trends__item:last-child{border-bottom:0}.trends__item__name{flex:1 1 auto;color:#3e5a7c;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trends__item__name strong{font-weight:500}.trends__item__name a{color:#9baec8;text-decoration:none;font-size:14px;font-weight:500;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trends__item__name a:hover span,.trends__item__name a:focus span,.trends__item__name a:active span{text-decoration:underline}.trends__item__current{flex:0 0 auto;font-size:24px;line-height:36px;font-weight:500;text-align:right;padding-right:15px;margin-left:5px;color:#d9e1e8}.trends__item__sparkline{flex:0 0 auto;width:50px}.trends__item__sparkline path:first-child{fill:rgba(216,160,112,.25) !important;fill-opacity:1 !important}.trends__item__sparkline path:last-child{stroke:#dfb088 !important}.emojione{font-size:inherit;vertical-align:middle;object-fit:contain;margin:-0.2ex .15em .2ex;width:16px;height:16px}.emojione img{width:auto}.emoji-picker-dropdown__menu{background:#fff;position:absolute;box-shadow:4px 4px 6px rgba(0,0,0,.4);border-radius:4px;margin-top:5px;z-index:2}.emoji-picker-dropdown__menu .emoji-mart-scroll{transition:opacity 200ms ease}.emoji-picker-dropdown__menu.selecting .emoji-mart-scroll{opacity:.5}.emoji-picker-dropdown__modifiers{position:absolute;top:60px;right:11px;cursor:pointer}.emoji-picker-dropdown__modifiers__menu{position:absolute;z-index:4;top:-4px;left:-8px;background:#fff;border-radius:4px;box-shadow:1px 2px 6px rgba(0,0,0,.2);overflow:hidden}.emoji-picker-dropdown__modifiers__menu button{display:block;cursor:pointer;border:0;padding:4px 8px;background:transparent}.emoji-picker-dropdown__modifiers__menu button:hover,.emoji-picker-dropdown__modifiers__menu button:focus,.emoji-picker-dropdown__modifiers__menu button:active{background:rgba(217,225,232,.4)}.emoji-picker-dropdown__modifiers__menu .emoji-mart-emoji{height:22px}.emoji-mart-emoji span{background-repeat:no-repeat}.emoji-button{display:block;font-size:24px;line-height:24px;margin-left:2px;width:24px;outline:0;cursor:pointer}.emoji-button:active,.emoji-button:focus{outline:0 !important}.emoji-button img{filter:grayscale(100%);opacity:.8;display:block;margin:0;width:22px;height:22px;margin-top:2px}.emoji-button:hover img,.emoji-button:active img,.emoji-button:focus img{opacity:1;filter:none}.doodle-modal{width:unset}.doodle-modal__container{background:#d9e1e8;text-align:center;line-height:0}.doodle-modal__container canvas{border:5px solid #d9e1e8}.doodle-modal__action-bar .filler{flex-grow:1;margin:0;padding:0}.doodle-modal__action-bar .doodle-toolbar{line-height:1;display:flex;flex-direction:column;flex-grow:0;justify-content:space-around}.doodle-modal__action-bar .doodle-toolbar.with-inputs label{display:inline-block;width:70px;text-align:right;margin-right:2px}.doodle-modal__action-bar .doodle-toolbar.with-inputs input[type=number],.doodle-modal__action-bar .doodle-toolbar.with-inputs input[type=text]{width:40px}.doodle-modal__action-bar .doodle-toolbar.with-inputs span.val{display:inline-block;text-align:left;width:50px}.doodle-modal__action-bar .doodle-palette{padding-right:0 !important;border:1px solid #000;line-height:.2rem;flex-grow:0;background:#fff}.doodle-modal__action-bar .doodle-palette button{appearance:none;width:1rem;height:1rem;margin:0;padding:0;text-align:center;color:#000;text-shadow:0 0 1px #fff;cursor:pointer;box-shadow:inset 0 0 1px rgba(255,255,255,.5);border:1px solid #000;outline-offset:-1px}.doodle-modal__action-bar .doodle-palette button.foreground{outline:1px dashed #fff}.doodle-modal__action-bar .doodle-palette button.background{outline:1px dashed red}.doodle-modal__action-bar .doodle-palette button.foreground.background{outline:1px dashed red;border-color:#fff}.drawer{width:300px;box-sizing:border-box;display:flex;flex-direction:column;overflow-y:hidden;padding:10px 5px;flex:none}.drawer:first-child{padding-left:10px}.drawer:last-child{padding-right:10px}@media screen and (max-width: 630px){.auto-columns .drawer{flex:auto}}.single-column .drawer{flex:auto}@media screen and (max-width: 630px){.auto-columns .drawer,.auto-columns .drawer:first-child,.auto-columns .drawer:last-child,.single-column .drawer,.single-column .drawer:first-child,.single-column .drawer:last-child{padding:0}}.wide .drawer{min-width:300px;max-width:400px;flex:1 1 200px}@media screen and (max-width: 630px){:root .auto-columns .drawer{flex:auto;width:100%;min-width:0;max-width:none;padding:0}}:root .single-column .drawer{flex:auto;width:100%;min-width:0;max-width:none;padding:0}.react-swipeable-view-container .drawer{height:100%}.drawer--header{display:flex;flex-direction:row;margin-bottom:10px;flex:none;background:#202e3f;font-size:16px}.drawer--header>*{display:block;box-sizing:border-box;border-bottom:2px solid transparent;padding:15px 5px 13px;height:48px;flex:1 1 auto;color:#9baec8;text-align:center;text-decoration:none;cursor:pointer}.drawer--header a{transition:background 100ms ease-in}.drawer--header a:focus,.drawer--header a:hover{outline:none;background:#17212e;transition:background 200ms ease-out}.search{position:relative;margin-bottom:10px;flex:none}@media screen and (max-width: 415px){.auto-columns .search,.single-column .search{margin-bottom:0}}@media screen and (max-width: 630px){.auto-columns .search{font-size:16px}}.single-column .search{font-size:16px}.search-popout{background:#fff;border-radius:4px;padding:10px 14px;padding-bottom:14px;margin-top:10px;color:#9baec8;box-shadow:2px 4px 15px rgba(0,0,0,.4)}.search-popout h4{text-transform:uppercase;color:#9baec8;font-size:13px;font-weight:500;margin-bottom:10px}.search-popout li{padding:4px 0}.search-popout ul{margin-bottom:10px}.search-popout em{font-weight:500;color:#121a24}.drawer--account{padding:10px;color:#9baec8;display:flex;align-items:center}.drawer--account a{color:inherit;text-decoration:none}.drawer--account .acct{display:block;color:#d9e1e8;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.navigation-bar__profile{flex:1 1 auto;margin-left:8px;overflow:hidden}.drawer--results{background:#121a24;overflow-x:hidden;overflow-y:auto}.drawer--results>header{color:#3e5a7c;background:#151f2b;padding:15px;font-weight:500;font-size:16px;cursor:default}.drawer--results>header .fa{display:inline-block;margin-right:5px}.drawer--results>section{margin-bottom:5px}.drawer--results>section h5{background:#0b1016;border-bottom:1px solid #202e3f;cursor:default;display:flex;padding:15px;font-weight:500;font-size:16px;color:#3e5a7c}.drawer--results>section h5 .fa{display:inline-block;margin-right:5px}.drawer--results>section .account:last-child,.drawer--results>section>div:last-child .status{border-bottom:0}.drawer--results>section>.hashtag{display:block;padding:10px;color:#d9e1e8;text-decoration:none}.drawer--results>section>.hashtag:hover,.drawer--results>section>.hashtag:active,.drawer--results>section>.hashtag:focus{color:#e6ebf0;text-decoration:underline}.drawer__pager{box-sizing:border-box;padding:0;flex-grow:1;position:relative;overflow:hidden;display:flex}.drawer__inner{position:absolute;top:0;left:0;background:#283a50;box-sizing:border-box;padding:0;display:flex;flex-direction:column;overflow:hidden;overflow-y:auto;width:100%;height:100%}.drawer__inner.darker{background:#121a24}.drawer__inner__mastodon{background:#283a50 url('data:image/svg+xml;utf8,') no-repeat bottom/100% auto;flex:1;min-height:47px;display:none}.drawer__inner__mastodon>img{display:block;object-fit:contain;object-position:bottom left;width:100%;height:100%;pointer-events:none;user-drag:none;user-select:none}.drawer__inner__mastodon>.mastodon{display:block;width:100%;height:100%;border:none;cursor:inherit}@media screen and (min-height: 640px){.drawer__inner__mastodon{display:block}}.pseudo-drawer{background:#283a50;font-size:13px;text-align:left}.drawer__backdrop{cursor:pointer;position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5)}.video-error-cover{align-items:center;background:#000;color:#fff;cursor:pointer;display:flex;flex-direction:column;height:100%;justify-content:center;margin-top:8px;position:relative;text-align:center;z-index:100}.media-spoiler{background:#000;color:#9baec8;border:0;width:100%;height:100%}.media-spoiler:hover,.media-spoiler:active,.media-spoiler:focus{color:#b5c3d6}.status__content>.media-spoiler{margin-top:15px}.media-spoiler.full-width{margin-left:-14px;margin-right:-14px;width:inherit;max-width:none;height:250px;border-radius:0px}.media-spoiler__warning{display:block;font-size:14px}.media-spoiler__trigger{display:block;font-size:11px;font-weight:500}.media-gallery__gifv__label{display:block;position:absolute;color:#fff;background:rgba(0,0,0,.5);bottom:6px;left:6px;padding:2px 6px;border-radius:2px;font-size:11px;font-weight:600;z-index:1;pointer-events:none;opacity:.9;transition:opacity .1s ease;line-height:18px}.media-gallery__gifv.autoplay .media-gallery__gifv__label{display:none}.media-gallery__gifv:hover .media-gallery__gifv__label{opacity:1}.media-gallery__audio{height:100%;display:flex;flex-direction:column}.media-gallery__audio span{text-align:center;color:#9baec8;display:flex;height:100%;align-items:center}.media-gallery__audio span p{width:100%}.media-gallery__audio audio{width:100%}.media-gallery{box-sizing:border-box;margin-top:8px;overflow:hidden;border-radius:4px;position:relative;width:100%;height:110px}.media-gallery.full-width{margin-left:-14px;margin-right:-14px;width:inherit;max-width:none;height:250px;border-radius:0px}.media-gallery__item{border:none;box-sizing:border-box;display:block;float:left;position:relative;border-radius:4px;overflow:hidden}.full-width .media-gallery__item{border-radius:0}.media-gallery__item.standalone .media-gallery__item-gifv-thumbnail{transform:none;top:0}.media-gallery__item.letterbox{background:#000}.media-gallery__item-thumbnail{cursor:zoom-in;display:block;text-decoration:none;color:#d9e1e8;position:relative;z-index:1}.media-gallery__item-thumbnail,.media-gallery__item-thumbnail img{height:100%;width:100%;object-fit:contain}.media-gallery__item-thumbnail:not(.letterbox),.media-gallery__item-thumbnail img:not(.letterbox){height:100%;object-fit:cover}.media-gallery__preview{width:100%;height:100%;object-fit:cover;position:absolute;top:0;left:0;z-index:0;background:#000}.media-gallery__preview--hidden{display:none}.media-gallery__gifv{height:100%;overflow:hidden;position:relative;width:100%;display:flex;justify-content:center}.media-gallery__item-gifv-thumbnail{cursor:zoom-in;height:100%;width:100%;position:relative;z-index:1;object-fit:contain;user-select:none}.media-gallery__item-gifv-thumbnail:not(.letterbox){height:100%;object-fit:cover}.media-gallery__item-thumbnail-label{clip:rect(1px 1px 1px 1px);clip:rect(1px, 1px, 1px, 1px);overflow:hidden;position:absolute}.video-modal__container{max-width:100vw;max-height:100vh}.audio-modal__container{width:50vw}.media-modal{width:100%;height:100%;position:relative}.media-modal .extended-video-player{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.media-modal .extended-video-player video{max-width:100%;max-height:80%}.media-modal__closer{position:absolute;top:0;left:0;right:0;bottom:0}.media-modal__navigation{position:absolute;top:0;left:0;right:0;bottom:0;pointer-events:none;transition:opacity .3s linear;will-change:opacity}.media-modal__navigation *{pointer-events:auto}.media-modal__navigation.media-modal__navigation--hidden{opacity:0}.media-modal__navigation.media-modal__navigation--hidden *{pointer-events:none}.media-modal__nav{background:rgba(0,0,0,.5);box-sizing:border-box;border:0;color:#fff;cursor:pointer;display:flex;align-items:center;font-size:24px;height:20vmax;margin:auto 0;padding:30px 15px;position:absolute;top:0;bottom:0}.media-modal__nav--left{left:0}.media-modal__nav--right{right:0}.media-modal__pagination{width:100%;text-align:center;position:absolute;left:0;bottom:20px;pointer-events:none}.media-modal__meta{text-align:center;position:absolute;left:0;bottom:20px;width:100%;pointer-events:none}.media-modal__meta--shifted{bottom:62px}.media-modal__meta a{pointer-events:auto;text-decoration:none;font-weight:500;color:#d9e1e8}.media-modal__meta a:hover,.media-modal__meta a:focus,.media-modal__meta a:active{text-decoration:underline}.media-modal__page-dot{display:inline-block}.media-modal__button{background-color:#fff;height:12px;width:12px;border-radius:6px;margin:10px;padding:0;border:0;font-size:0}.media-modal__button--active{background-color:#d8a070}.media-modal__close{position:absolute;right:8px;top:8px;z-index:100}.detailed .video-player__volume__current,.detailed .video-player__volume::before,.fullscreen .video-player__volume__current,.fullscreen .video-player__volume::before{bottom:27px}.detailed .video-player__volume__handle,.fullscreen .video-player__volume__handle{bottom:23px}.audio-player{box-sizing:border-box;position:relative;background:#040609;border-radius:4px;padding-bottom:44px;direction:ltr}.audio-player.editable{border-radius:0;height:100%}.audio-player__waveform{padding:15px 0;position:relative;overflow:hidden}.audio-player__waveform::before{content:\"\";display:block;position:absolute;border-top:1px solid #192432;width:100%;height:0;left:0;top:calc(50% + 1px)}.audio-player__progress-placeholder{background-color:rgba(225,181,144,.5)}.audio-player__wave-placeholder{background-color:#2d415a}.audio-player .video-player__controls{padding:0 15px;padding-top:10px;background:#040609;border-top:1px solid #192432;border-radius:0 0 4px 4px}.video-player{overflow:hidden;position:relative;background:#000;max-width:100%;border-radius:4px;box-sizing:border-box;direction:ltr}.video-player.editable{border-radius:0;height:100% !important}.video-player:focus{outline:0}.detailed-status .video-player{width:100%;height:100%}.video-player.full-width{margin-left:-14px;margin-right:-14px;width:inherit;max-width:none;height:250px;border-radius:0px}.video-player video{max-width:100vw;max-height:80vh;z-index:1;position:relative}.video-player.fullscreen{width:100% !important;height:100% !important;margin:0}.video-player.fullscreen video{max-width:100% !important;max-height:100% !important;width:100% !important;height:100% !important;outline:0}.video-player.inline video{object-fit:contain;position:relative;top:50%;transform:translateY(-50%)}.video-player__controls{position:absolute;z-index:2;bottom:0;left:0;right:0;box-sizing:border-box;background:linear-gradient(0deg, rgba(0, 0, 0, 0.85) 0, rgba(0, 0, 0, 0.45) 60%, transparent);padding:0 15px;opacity:0;transition:opacity .1s ease}.video-player__controls.active{opacity:1}.video-player.inactive video,.video-player.inactive .video-player__controls{visibility:hidden}.video-player__spoiler{display:none;position:absolute;top:0;left:0;width:100%;height:100%;z-index:4;border:0;background:#000;color:#9baec8;transition:none;pointer-events:none}.video-player__spoiler.active{display:block;pointer-events:auto}.video-player__spoiler.active:hover,.video-player__spoiler.active:active,.video-player__spoiler.active:focus{color:#b2c1d5}.video-player__spoiler__title{display:block;font-size:14px}.video-player__spoiler__subtitle{display:block;font-size:11px;font-weight:500}.video-player__buttons-bar{display:flex;justify-content:space-between;padding-bottom:10px}.video-player__buttons-bar .video-player__download__icon{color:inherit}.video-player__buttons-bar .video-player__download__icon .fa,.video-player__buttons-bar .video-player__download__icon:active .fa,.video-player__buttons-bar .video-player__download__icon:hover .fa,.video-player__buttons-bar .video-player__download__icon:focus .fa{color:inherit}.video-player__buttons{font-size:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.video-player__buttons.left button{padding-left:0}.video-player__buttons.right button{padding-right:0}.video-player__buttons button{background:transparent;padding:2px 10px;font-size:16px;border:0;color:rgba(255,255,255,.75)}.video-player__buttons button:active,.video-player__buttons button:hover,.video-player__buttons button:focus{color:#fff}.video-player__time-sep,.video-player__time-total,.video-player__time-current{font-size:14px;font-weight:500}.video-player__time-current{color:#fff;margin-left:60px}.video-player__time-sep{display:inline-block;margin:0 6px}.video-player__time-sep,.video-player__time-total{color:#fff}.video-player__volume{cursor:pointer;height:24px;display:inline}.video-player__volume::before{content:\"\";width:50px;background:rgba(255,255,255,.35);border-radius:4px;display:block;position:absolute;height:4px;left:70px;bottom:20px}.video-player__volume__current{display:block;position:absolute;height:4px;border-radius:4px;left:70px;bottom:20px;background:#e1b590}.video-player__volume__handle{position:absolute;z-index:3;border-radius:50%;width:12px;height:12px;bottom:16px;left:70px;transition:opacity .1s ease;background:#e1b590;box-shadow:1px 2px 6px rgba(0,0,0,.2);pointer-events:none}.video-player__link{padding:2px 10px}.video-player__link a{text-decoration:none;font-size:14px;font-weight:500;color:#fff}.video-player__link a:hover,.video-player__link a:active,.video-player__link a:focus{text-decoration:underline}.video-player__seek{cursor:pointer;height:24px;position:relative}.video-player__seek::before{content:\"\";width:100%;background:rgba(255,255,255,.35);border-radius:4px;display:block;position:absolute;height:4px;top:10px}.video-player__seek__progress,.video-player__seek__buffer{display:block;position:absolute;height:4px;border-radius:4px;top:10px;background:#e1b590}.video-player__seek__buffer{background:rgba(255,255,255,.2)}.video-player__seek__handle{position:absolute;z-index:3;opacity:0;border-radius:50%;width:12px;height:12px;top:6px;margin-left:-6px;transition:opacity .1s ease;background:#e1b590;box-shadow:1px 2px 6px rgba(0,0,0,.2);pointer-events:none}.video-player__seek__handle.active{opacity:1}.video-player__seek:hover .video-player__seek__handle{opacity:1}.video-player.detailed .video-player__buttons button,.video-player.fullscreen .video-player__buttons button{padding-top:10px;padding-bottom:10px}.sensitive-info{display:flex;flex-direction:row;align-items:center;position:absolute;top:4px;left:4px;z-index:100}.sensitive-marker{margin:0 3px;border-radius:2px;padding:2px 6px;color:rgba(255,255,255,.8);background:rgba(0,0,0,.5);font-size:12px;line-height:18px;text-transform:uppercase;opacity:.9;transition:opacity .1s ease}.media-gallery:hover .sensitive-marker{opacity:1}.list-editor{background:#121a24;flex-direction:column;border-radius:8px;box-shadow:2px 4px 15px rgba(0,0,0,.4);width:380px;overflow:hidden}@media screen and (max-width: 420px){.list-editor{width:90%}}.list-editor h4{padding:15px 0;background:#283a50;font-weight:500;font-size:16px;text-align:center;border-radius:8px 8px 0 0}.list-editor .drawer__pager{height:50vh}.list-editor .drawer__inner{border-radius:0 0 8px 8px}.list-editor .drawer__inner.backdrop{width:calc(100% - 60px);box-shadow:2px 4px 15px rgba(0,0,0,.4);border-radius:0 0 0 8px}.list-editor__accounts{overflow-y:auto}.list-editor .account__display-name:hover strong{text-decoration:none}.list-editor .account__avatar{cursor:default}.list-editor .search{margin-bottom:0}.list-adder{background:#121a24;flex-direction:column;border-radius:8px;box-shadow:2px 4px 15px rgba(0,0,0,.4);width:380px;overflow:hidden}@media screen and (max-width: 420px){.list-adder{width:90%}}.list-adder__account{background:#283a50}.list-adder__lists{background:#283a50;height:50vh;border-radius:0 0 8px 8px;overflow-y:auto}.list-adder .list{padding:10px;border-bottom:1px solid #202e3f}.list-adder .list__wrapper{display:flex}.list-adder .list__display-name{flex:1 1 auto;overflow:hidden;text-decoration:none;font-size:16px;padding:10px}.emoji-mart{font-size:13px;display:inline-block;color:#121a24}.emoji-mart,.emoji-mart *{box-sizing:border-box;line-height:1.15}.emoji-mart .emoji-mart-emoji{padding:6px}.emoji-mart-bar{border:0 solid #c0cdd9}.emoji-mart-bar:first-child{border-bottom-width:1px;border-top-left-radius:5px;border-top-right-radius:5px;background:#d9e1e8}.emoji-mart-bar:last-child{border-top-width:1px;border-bottom-left-radius:5px;border-bottom-right-radius:5px;display:none}.emoji-mart-anchors{display:flex;justify-content:space-between;padding:0 6px;color:#3e5a7c;line-height:0}.emoji-mart-anchor{position:relative;flex:1;text-align:center;padding:12px 4px;overflow:hidden;transition:color .1s ease-out;cursor:pointer}.emoji-mart-anchor:hover{color:#37506f}.emoji-mart-anchor-selected{color:#d8a070}.emoji-mart-anchor-selected:hover{color:#d49560}.emoji-mart-anchor-selected .emoji-mart-anchor-bar{bottom:0}.emoji-mart-anchor-bar{position:absolute;bottom:-3px;left:0;width:100%;height:3px;background-color:#d59864}.emoji-mart-anchors i{display:inline-block;width:100%;max-width:22px}.emoji-mart-anchors svg{fill:currentColor;max-height:18px}.emoji-mart-scroll{overflow-y:scroll;height:270px;max-height:35vh;padding:0 6px 6px;background:#fff;will-change:transform}.emoji-mart-scroll::-webkit-scrollbar-track:hover,.emoji-mart-scroll::-webkit-scrollbar-track:active{background-color:rgba(0,0,0,.3)}.emoji-mart-search{padding:10px;padding-right:45px;background:#fff}.emoji-mart-search input{font-size:14px;font-weight:400;padding:7px 9px;font-family:inherit;display:block;width:100%;background:rgba(217,225,232,.3);color:#121a24;border:1px solid #d9e1e8;border-radius:4px}.emoji-mart-search input::-moz-focus-inner{border:0}.emoji-mart-search input::-moz-focus-inner,.emoji-mart-search input:focus,.emoji-mart-search input:active{outline:0 !important}.emoji-mart-category .emoji-mart-emoji{cursor:pointer}.emoji-mart-category .emoji-mart-emoji span{z-index:1;position:relative;text-align:center}.emoji-mart-category .emoji-mart-emoji:hover::before{z-index:0;content:\"\";position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(217,225,232,.7);border-radius:100%}.emoji-mart-category-label{z-index:2;position:relative;position:-webkit-sticky;position:sticky;top:0}.emoji-mart-category-label span{display:block;width:100%;font-weight:500;padding:5px 6px;background:#fff}.emoji-mart-emoji{position:relative;display:inline-block;font-size:0}.emoji-mart-emoji span{width:22px;height:22px}.emoji-mart-no-results{font-size:14px;text-align:center;padding-top:70px;color:#9baec8}.emoji-mart-no-results .emoji-mart-category-label{display:none}.emoji-mart-no-results .emoji-mart-no-results-label{margin-top:.2em}.emoji-mart-no-results .emoji-mart-emoji:hover::before{content:none}.emoji-mart-preview{display:none}.glitch.local-settings{position:relative;display:flex;flex-direction:row;background:#d9e1e8;color:#121a24;border-radius:8px;height:80vh;width:80vw;max-width:740px;max-height:450px;overflow:hidden}.glitch.local-settings label,.glitch.local-settings legend{display:block;font-size:14px}.glitch.local-settings .boolean label,.glitch.local-settings .radio_buttons label{position:relative;padding-left:28px;padding-top:3px}.glitch.local-settings .boolean label input,.glitch.local-settings .radio_buttons label input{position:absolute;left:0;top:0}.glitch.local-settings span.hint{display:block;color:#3e5a7c}.glitch.local-settings h1{font-size:18px;font-weight:500;line-height:24px;margin-bottom:20px}.glitch.local-settings h2{font-size:15px;font-weight:500;line-height:20px;margin-top:20px;margin-bottom:10px}.glitch.local-settings__navigation__item{display:block;padding:15px 20px;color:inherit;background:#f2f5f7;border-bottom:1px #d9e1e8 solid;cursor:pointer;text-decoration:none;outline:none;transition:background .3s}.glitch.local-settings__navigation__item .text-icon-button{color:inherit;transition:unset}.glitch.local-settings__navigation__item:hover{background:#d9e1e8}.glitch.local-settings__navigation__item.active{background:#d8a070;color:#fff}.glitch.local-settings__navigation__item.close,.glitch.local-settings__navigation__item.close:hover{background:#df405a;color:#fff}.glitch.local-settings__navigation{background:#f2f5f7;width:212px;font-size:15px;line-height:20px;overflow-y:auto}.glitch.local-settings__page{display:block;flex:auto;padding:15px 20px 15px 20px;width:360px;overflow-y:auto}.glitch.local-settings__page__item{margin-bottom:2px}.glitch.local-settings__page__item.string,.glitch.local-settings__page__item.radio_buttons{margin-top:10px;margin-bottom:10px}@media screen and (max-width: 630px){.glitch.local-settings__navigation{width:40px;flex-shrink:0}.glitch.local-settings__navigation__item{padding:10px}.glitch.local-settings__navigation__item span:last-of-type{display:none}}.error-boundary{color:#fff;font-size:15px;line-height:20px}.error-boundary h1{font-size:26px;line-height:36px;font-weight:400;margin-bottom:8px}.error-boundary a{color:#fff;text-decoration:underline}.error-boundary ul{list-style:disc;margin-left:0;padding-left:1em}.error-boundary textarea.web_app_crash-stacktrace{width:100%;resize:none;white-space:pre;font-family:monospace,monospace}.compose-panel{width:285px;margin-top:10px;display:flex;flex-direction:column;height:calc(100% - 10px);overflow-y:hidden}.compose-panel .search__input{line-height:18px;font-size:16px;padding:15px;padding-right:30px}.compose-panel .search__icon .fa{top:15px}.compose-panel .drawer--account{flex:0 1 48px}.compose-panel .flex-spacer{background:transparent}.compose-panel .composer{flex:1;overflow-y:hidden;display:flex;flex-direction:column;min-height:310px}.compose-panel .compose-form__autosuggest-wrapper{overflow-y:auto;background-color:#fff;border-radius:4px 4px 0 0;flex:0 1 auto}.compose-panel .autosuggest-textarea__textarea{overflow-y:hidden}.compose-panel .compose-form__upload-thumbnail{height:80px}.navigation-panel{margin-top:10px;margin-bottom:10px;height:calc(100% - 20px);overflow-y:auto;display:flex;flex-direction:column}.navigation-panel>a{flex:0 0 auto}.navigation-panel hr{flex:0 0 auto;border:0;background:transparent;border-top:1px solid #192432;margin:10px 0}.navigation-panel .flex-spacer{background:transparent}@media screen and (min-width: 600px){.tabs-bar__link span{display:inline}}.columns-area--mobile{flex-direction:column;width:100%;margin:0 auto}.columns-area--mobile .column,.columns-area--mobile .drawer{width:100%;height:100%;padding:0}.columns-area--mobile .directory__list{display:grid;grid-gap:10px;grid-template-columns:minmax(0, 50%) minmax(0, 50%)}@media screen and (max-width: 415px){.columns-area--mobile .directory__list{display:block}}.columns-area--mobile .directory__card{margin-bottom:0}.columns-area--mobile .filter-form{display:flex}.columns-area--mobile .autosuggest-textarea__textarea{font-size:16px}.columns-area--mobile .search__input{line-height:18px;font-size:16px;padding:15px;padding-right:30px}.columns-area--mobile .search__icon .fa{top:15px}.columns-area--mobile .scrollable{overflow:visible}@supports(display: grid){.columns-area--mobile .scrollable{contain:content}}@media screen and (min-width: 415px){.columns-area--mobile{padding:10px 0;padding-top:0}}@media screen and (min-width: 630px){.columns-area--mobile .detailed-status{padding:15px}.columns-area--mobile .detailed-status .media-gallery,.columns-area--mobile .detailed-status .video-player,.columns-area--mobile .detailed-status .audio-player{margin-top:15px}.columns-area--mobile .account__header__bar{padding:5px 10px}.columns-area--mobile .navigation-bar,.columns-area--mobile .compose-form{padding:15px}.columns-area--mobile .compose-form .compose-form__publish .compose-form__publish-button-wrapper{padding-top:15px}.columns-area--mobile .status{padding:15px;min-height:50px}.columns-area--mobile .status .media-gallery,.columns-area--mobile .status__action-bar,.columns-area--mobile .status .video-player,.columns-area--mobile .status .audio-player{margin-top:10px}.columns-area--mobile .account{padding:15px 10px}.columns-area--mobile .account__header__bio{margin:0 -10px}.columns-area--mobile .notification__message{padding-top:15px}.columns-area--mobile .notification .status{padding-top:8px}.columns-area--mobile .notification .account{padding-top:8px}}.floating-action-button{position:fixed;display:flex;justify-content:center;align-items:center;width:3.9375rem;height:3.9375rem;bottom:1.3125rem;right:1.3125rem;background:#d59864;color:#fff;border-radius:50%;font-size:21px;line-height:21px;text-decoration:none;box-shadow:2px 3px 9px rgba(0,0,0,.4)}.floating-action-button:hover,.floating-action-button:focus,.floating-action-button:active{background:#e0b38c}@media screen and (min-width: 415px){.tabs-bar{width:100%}.react-swipeable-view-container .columns-area--mobile{height:calc(100% - 10px) !important}.getting-started__wrapper,.search{margin-bottom:10px}}@media screen and (max-width: 895px){.columns-area__panels__pane--compositional{display:none}}@media screen and (min-width: 895px){.floating-action-button,.tabs-bar__link.optional{display:none}.search-page .search{display:none}}@media screen and (max-width: 1190px){.columns-area__panels__pane--navigational{display:none}}@media screen and (min-width: 1190px){.tabs-bar{display:none}}.poll{margin-top:16px;font-size:14px}.poll ul,.e-content .poll ul{margin:0;list-style:none}.poll li{margin-bottom:10px;position:relative}.poll__chart{position:absolute;top:0;left:0;height:100%;display:inline-block;border-radius:4px;background:#6d89af}.poll__chart.leading{background:#d8a070}.poll__text{position:relative;display:flex;padding:6px 0;line-height:18px;cursor:default;overflow:hidden}.poll__text input[type=radio],.poll__text input[type=checkbox]{display:none}.poll__text .autossugest-input{flex:1 1 auto}.poll__text input[type=text]{display:block;box-sizing:border-box;width:100%;font-size:14px;color:#121a24;display:block;outline:0;font-family:inherit;background:#fff;border:1px solid #dbdbdb;border-radius:4px;padding:6px 10px}.poll__text input[type=text]:focus{border-color:#d8a070}.poll__text.selectable{cursor:pointer}.poll__text.editable{display:flex;align-items:center;overflow:visible}.poll__input{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:50%;vertical-align:middle;margin-top:auto;margin-bottom:auto;flex:0 0 18px}.poll__input.checkbox{border-radius:4px}.poll__input.active{border-color:#79bd9a;background:#79bd9a}.poll__input:active,.poll__input:focus,.poll__input:hover{border-width:4px;background:none}.poll__input::-moz-focus-inner{outline:0 !important;border:0}.poll__input:focus,.poll__input:active{outline:0 !important}.poll__number{display:inline-block;width:52px;font-weight:700;padding:0 10px;padding-left:8px;text-align:right;margin-top:auto;margin-bottom:auto;flex:0 0 52px}.poll__vote__mark{float:left;line-height:18px}.poll__footer{padding-top:6px;padding-bottom:5px;color:#3e5a7c}.poll__link{display:inline;background:transparent;padding:0;margin:0;border:0;color:#3e5a7c;text-decoration:underline;font-size:inherit}.poll__link:hover{text-decoration:none}.poll__link:active,.poll__link:focus{background-color:rgba(62,90,124,.1)}.poll .button{height:36px;padding:0 16px;margin-right:10px;font-size:14px}.compose-form__poll-wrapper{border-top:1px solid #ebebeb}.compose-form__poll-wrapper ul{padding:10px}.compose-form__poll-wrapper .poll__footer{border-top:1px solid #ebebeb;padding:10px;display:flex;align-items:center}.compose-form__poll-wrapper .poll__footer button,.compose-form__poll-wrapper .poll__footer select{width:100%;flex:1 1 50%}.compose-form__poll-wrapper .poll__footer button:focus,.compose-form__poll-wrapper .poll__footer select:focus{border-color:#d8a070}.compose-form__poll-wrapper .button.button-secondary{font-size:14px;font-weight:400;padding:6px 10px;height:auto;line-height:inherit;color:#3e5a7c;border-color:#3e5a7c;margin-right:5px}.compose-form__poll-wrapper li{display:flex;align-items:center}.compose-form__poll-wrapper li .poll__text{flex:0 0 auto;width:calc(100% - (23px + 6px));margin-right:6px}.compose-form__poll-wrapper select{appearance:none;box-sizing:border-box;font-size:14px;color:#121a24;display:inline-block;width:auto;outline:0;font-family:inherit;background:#fff url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center/auto 16px;border:1px solid #dbdbdb;border-radius:4px;padding:6px 10px;padding-right:30px}.compose-form__poll-wrapper .icon-button.disabled{color:#dbdbdb}.muted .poll{color:#3e5a7c}.muted .poll__chart{background:rgba(109,137,175,.2)}.muted .poll__chart.leading{background:rgba(216,160,112,.2)}.container{box-sizing:border-box;max-width:1235px;margin:0 auto;position:relative}@media screen and (max-width: 1255px){.container{width:100%;padding:0 10px}}.rich-formatting{font-family:sans-serif,sans-serif;font-size:14px;font-weight:400;line-height:1.7;word-wrap:break-word;color:#9baec8}.rich-formatting a{color:#d8a070;text-decoration:underline}.rich-formatting a:hover,.rich-formatting a:focus,.rich-formatting a:active{text-decoration:none}.rich-formatting p,.rich-formatting li{color:#9baec8}.rich-formatting p{margin-top:0;margin-bottom:.85em}.rich-formatting p:last-child{margin-bottom:0}.rich-formatting strong{font-weight:700;color:#d9e1e8}.rich-formatting em{font-style:italic;color:#d9e1e8}.rich-formatting code{font-size:.85em;background:#040609;border-radius:4px;padding:.2em .3em}.rich-formatting h1,.rich-formatting h2,.rich-formatting h3,.rich-formatting h4,.rich-formatting h5,.rich-formatting h6{font-family:sans-serif,sans-serif;margin-top:1.275em;margin-bottom:.85em;font-weight:500;color:#d9e1e8}.rich-formatting h1{font-size:2em}.rich-formatting h2{font-size:1.75em}.rich-formatting h3{font-size:1.5em}.rich-formatting h4{font-size:1.25em}.rich-formatting h5,.rich-formatting h6{font-size:1em}.rich-formatting ul{list-style:disc}.rich-formatting ol{list-style:decimal}.rich-formatting ul,.rich-formatting ol{margin:0;padding:0;padding-left:2em;margin-bottom:.85em}.rich-formatting ul[type=a],.rich-formatting ol[type=a]{list-style-type:lower-alpha}.rich-formatting ul[type=i],.rich-formatting ol[type=i]{list-style-type:lower-roman}.rich-formatting hr{width:100%;height:0;border:0;border-bottom:1px solid #192432;margin:1.7em 0}.rich-formatting hr.spacer{height:1px;border:0}.rich-formatting table{width:100%;border-collapse:collapse;break-inside:auto;margin-top:24px;margin-bottom:32px}.rich-formatting table thead tr,.rich-formatting table tbody tr{border-bottom:1px solid #192432;font-size:1em;line-height:1.625;font-weight:400;text-align:left;color:#9baec8}.rich-formatting table thead tr{border-bottom-width:2px;line-height:1.5;font-weight:500;color:#3e5a7c}.rich-formatting table th,.rich-formatting table td{padding:8px;align-self:start;align-items:start;word-break:break-all}.rich-formatting table th.nowrap,.rich-formatting table td.nowrap{width:25%;position:relative}.rich-formatting table th.nowrap::before,.rich-formatting table td.nowrap::before{content:\" \";visibility:hidden}.rich-formatting table th.nowrap span,.rich-formatting table td.nowrap span{position:absolute;left:8px;right:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rich-formatting>:first-child{margin-top:0}.information-board{background:#0b1016;padding:20px 0}.information-board .container-alt{position:relative;padding-right:295px}.information-board__sections{display:flex;justify-content:space-between;flex-wrap:wrap}.information-board__section{flex:1 0 0;font-family:sans-serif,sans-serif;font-size:16px;line-height:28px;color:#fff;text-align:right;padding:10px 15px}.information-board__section span,.information-board__section strong{display:block}.information-board__section span:last-child{color:#d9e1e8}.information-board__section strong{font-family:sans-serif,sans-serif;font-weight:500;font-size:32px;line-height:48px}@media screen and (max-width: 700px){.information-board__section{text-align:center}}.information-board .panel{position:absolute;width:280px;box-sizing:border-box;background:#040609;padding:20px;padding-top:10px;border-radius:4px 4px 0 0;right:0;bottom:-40px}.information-board .panel .panel-header{font-family:sans-serif,sans-serif;font-size:14px;line-height:24px;font-weight:500;color:#9baec8;padding-bottom:5px;margin-bottom:15px;border-bottom:1px solid #192432;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.information-board .panel .panel-header a,.information-board .panel .panel-header span{font-weight:400;color:#7a93b6}.information-board .panel .panel-header a{text-decoration:none}.information-board .owner{text-align:center}.information-board .owner .avatar{width:80px;height:80px;width:80px;height:80px;background-size:80px 80px;margin:0 auto;margin-bottom:15px}.information-board .owner .avatar img{display:block;width:80px;height:80px;border-radius:48px;border-radius:8%;background-position:50%;background-clip:padding-box}.information-board .owner .name{font-size:14px}.information-board .owner .name a{display:block;color:#fff;text-decoration:none}.information-board .owner .name a:hover .display_name{text-decoration:underline}.information-board .owner .name .username{display:block;color:#9baec8}.landing-page p,.landing-page li{font-family:sans-serif,sans-serif;font-size:16px;font-weight:400;font-size:16px;line-height:30px;margin-bottom:12px;color:#9baec8}.landing-page p a,.landing-page li a{color:#d8a070;text-decoration:underline}.landing-page em{display:inline;margin:0;padding:0;font-weight:700;background:transparent;font-family:inherit;font-size:inherit;line-height:inherit;color:#bcc9da}.landing-page h1{font-family:sans-serif,sans-serif;font-size:26px;line-height:30px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page h1 small{font-family:sans-serif,sans-serif;display:block;font-size:18px;font-weight:400;color:#bcc9da}.landing-page h2{font-family:sans-serif,sans-serif;font-size:22px;line-height:26px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page h3{font-family:sans-serif,sans-serif;font-size:18px;line-height:24px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page h4{font-family:sans-serif,sans-serif;font-size:16px;line-height:24px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page h5{font-family:sans-serif,sans-serif;font-size:14px;line-height:24px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page h6{font-family:sans-serif,sans-serif;font-size:12px;line-height:24px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page ul,.landing-page ol{margin-left:20px}.landing-page ul[type=a],.landing-page ol[type=a]{list-style-type:lower-alpha}.landing-page ul[type=i],.landing-page ol[type=i]{list-style-type:lower-roman}.landing-page ul{list-style:disc}.landing-page ol{list-style:decimal}.landing-page li>ol,.landing-page li>ul{margin-top:6px}.landing-page hr{width:100%;height:0;border:0;border-bottom:1px solid rgba(62,90,124,.6);margin:20px 0}.landing-page hr.spacer{height:1px;border:0}.landing-page__information,.landing-page__forms{padding:20px}.landing-page__call-to-action{background:#121a24;border-radius:4px;padding:25px 40px;overflow:hidden;box-sizing:border-box}.landing-page__call-to-action .row{width:100%;display:flex;flex-direction:row-reverse;flex-wrap:nowrap;justify-content:space-between;align-items:center}.landing-page__call-to-action .row__information-board{display:flex;justify-content:flex-end;align-items:flex-end}.landing-page__call-to-action .row__information-board .information-board__section{flex:1 0 auto;padding:0 10px}@media screen and (max-width: 415px){.landing-page__call-to-action .row__information-board{width:100%;justify-content:space-between}}.landing-page__call-to-action .row__mascot{flex:1;margin:10px -50px 0 0}@media screen and (max-width: 415px){.landing-page__call-to-action .row__mascot{display:none}}.landing-page__logo{margin-right:20px}.landing-page__logo img{height:50px;width:auto;mix-blend-mode:lighten}.landing-page__information{padding:45px 40px;margin-bottom:10px}.landing-page__information:last-child{margin-bottom:0}.landing-page__information strong{font-weight:500;color:#bcc9da}.landing-page__information .account{border-bottom:0;padding:0}.landing-page__information .account__display-name{align-items:center;display:flex;margin-right:5px}.landing-page__information .account div.account__display-name:hover .display-name strong{text-decoration:none}.landing-page__information .account div.account__display-name .account__avatar{cursor:default}.landing-page__information .account__avatar-wrapper{margin-left:0;flex:0 0 auto}.landing-page__information .account__avatar{width:44px;height:44px;background-size:44px 44px;width:44px;height:44px;background-size:44px 44px}.landing-page__information .account .display-name{font-size:15px}.landing-page__information .account .display-name__account{font-size:14px}@media screen and (max-width: 960px){.landing-page__information .contact{margin-top:30px}}@media screen and (max-width: 700px){.landing-page__information{padding:25px 20px}}.landing-page__information,.landing-page__forms,.landing-page #mastodon-timeline{box-sizing:border-box;background:#121a24;border-radius:4px;box-shadow:0 0 6px rgba(0,0,0,.1)}.landing-page__mascot{height:104px;position:relative;left:-40px;bottom:25px}.landing-page__mascot img{height:190px;width:auto}.landing-page__short-description .row{display:flex;flex-wrap:wrap;align-items:center;margin-bottom:40px}@media screen and (max-width: 700px){.landing-page__short-description .row{margin-bottom:20px}}.landing-page__short-description p a{color:#d9e1e8}.landing-page__short-description h1{font-weight:500;color:#fff;margin-bottom:0}.landing-page__short-description h1 small{color:#9baec8}.landing-page__short-description h1 small span{color:#d9e1e8}.landing-page__short-description p:last-child{margin-bottom:0}.landing-page__hero{margin-bottom:10px}.landing-page__hero img{display:block;margin:0;max-width:100%;height:auto;border-radius:4px}@media screen and (max-width: 840px){.landing-page .information-board .container-alt{padding-right:20px}.landing-page .information-board .panel{position:static;margin-top:20px;width:100%;border-radius:4px}.landing-page .information-board .panel .panel-header{text-align:center}}@media screen and (max-width: 675px){.landing-page .header-wrapper{padding-top:0}.landing-page .header-wrapper.compact{padding-bottom:0}.landing-page .header-wrapper.compact .hero .heading{text-align:initial}.landing-page .header .container-alt,.landing-page .features .container-alt{display:block}}.landing-page .cta{margin:20px}.landing{margin-bottom:100px}@media screen and (max-width: 738px){.landing{margin-bottom:0}}.landing__brand{display:flex;justify-content:center;align-items:center;padding:50px}.landing__brand svg{fill:#fff;height:52px}@media screen and (max-width: 415px){.landing__brand{padding:0;margin-bottom:30px}}.landing .directory{margin-top:30px;background:transparent;box-shadow:none;border-radius:0}.landing .hero-widget{margin-top:30px;margin-bottom:0}.landing .hero-widget h4{padding:10px;text-transform:uppercase;font-weight:700;font-size:13px;color:#9baec8}.landing .hero-widget__text{border-radius:0;padding-bottom:0}.landing .hero-widget__footer{background:#121a24;padding:10px;border-radius:0 0 4px 4px;display:flex}.landing .hero-widget__footer__column{flex:1 1 50%}.landing .hero-widget .account{padding:10px 0;border-bottom:0}.landing .hero-widget .account .account__display-name{display:flex;align-items:center}.landing .hero-widget .account .account__avatar{width:44px;height:44px;background-size:44px 44px}.landing .hero-widget__counter{padding:10px}.landing .hero-widget__counter strong{font-family:sans-serif,sans-serif;font-size:15px;font-weight:700;display:block}.landing .hero-widget__counter span{font-size:14px;color:#9baec8}.landing .simple_form .user_agreement .label_input>label{font-weight:400;color:#9baec8}.landing .simple_form p.lead{color:#9baec8;font-size:15px;line-height:20px;font-weight:400;margin-bottom:25px}.landing__grid{max-width:960px;margin:0 auto;display:grid;grid-template-columns:minmax(0, 50%) minmax(0, 50%);grid-gap:30px}@media screen and (max-width: 738px){.landing__grid{grid-template-columns:minmax(0, 100%);grid-gap:10px}.landing__grid__column-login{grid-row:1;display:flex;flex-direction:column}.landing__grid__column-login .box-widget{order:2;flex:0 0 auto}.landing__grid__column-login .hero-widget{margin-top:0;margin-bottom:10px;order:1;flex:0 0 auto}.landing__grid__column-registration{grid-row:2}.landing__grid .directory{margin-top:10px}}@media screen and (max-width: 415px){.landing__grid{grid-gap:0}.landing__grid .hero-widget{display:block;margin-bottom:0;box-shadow:none}.landing__grid .hero-widget__img,.landing__grid .hero-widget__img img,.landing__grid .hero-widget__footer{border-radius:0}.landing__grid .hero-widget,.landing__grid .box-widget,.landing__grid .directory__tag{border-bottom:1px solid #202e3f}.landing__grid .directory{margin-top:0}.landing__grid .directory__tag{margin-bottom:0}.landing__grid .directory__tag>a,.landing__grid .directory__tag>div{border-radius:0;box-shadow:none}.landing__grid .directory__tag:last-child{border-bottom:0}}.brand{position:relative;text-decoration:none}.brand__tagline{display:block;position:absolute;bottom:-10px;left:50px;width:300px;color:#9baec8;text-decoration:none;font-size:14px}@media screen and (max-width: 415px){.brand__tagline{position:static;width:auto;margin-top:20px;color:#3e5a7c}}.table{width:100%;max-width:100%;border-spacing:0;border-collapse:collapse}.table th,.table td{padding:8px;line-height:18px;vertical-align:top;border-top:1px solid #121a24;text-align:left;background:#0b1016}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #121a24;border-top:0;font-weight:500}.table>tbody>tr>th{font-weight:500}.table>tbody>tr:nth-child(odd)>td,.table>tbody>tr:nth-child(odd)>th{background:#121a24}.table a{color:#d8a070;text-decoration:underline}.table a:hover{text-decoration:none}.table strong{font-weight:500}.table strong:lang(ja){font-weight:700}.table strong:lang(ko){font-weight:700}.table strong:lang(zh-CN){font-weight:700}.table strong:lang(zh-HK){font-weight:700}.table strong:lang(zh-TW){font-weight:700}.table.inline-table>tbody>tr:nth-child(odd)>td,.table.inline-table>tbody>tr:nth-child(odd)>th{background:transparent}.table.inline-table>tbody>tr:first-child>td,.table.inline-table>tbody>tr:first-child>th{border-top:0}.table.batch-table>thead>tr>th{background:#121a24;border-top:1px solid #040609;border-bottom:1px solid #040609}.table.batch-table>thead>tr>th:first-child{border-radius:4px 0 0;border-left:1px solid #040609}.table.batch-table>thead>tr>th:last-child{border-radius:0 4px 0 0;border-right:1px solid #040609}.table--invites tbody td{vertical-align:middle}.table-wrapper{overflow:auto;margin-bottom:20px}samp{font-family:monospace,monospace}button.table-action-link{background:transparent;border:0;font:inherit}button.table-action-link,a.table-action-link{text-decoration:none;display:inline-block;margin-right:5px;padding:0 10px;color:#9baec8;font-weight:500}button.table-action-link:hover,a.table-action-link:hover{color:#fff}button.table-action-link i.fa,a.table-action-link i.fa{font-weight:400;margin-right:5px}button.table-action-link:first-child,a.table-action-link:first-child{padding-left:0}.batch-table__toolbar,.batch-table__row{display:flex}.batch-table__toolbar__select,.batch-table__row__select{box-sizing:border-box;padding:8px 16px;cursor:pointer;min-height:100%}.batch-table__toolbar__select input,.batch-table__row__select input{margin-top:8px}.batch-table__toolbar__select--aligned,.batch-table__row__select--aligned{display:flex;align-items:center}.batch-table__toolbar__select--aligned input,.batch-table__row__select--aligned input{margin-top:0}.batch-table__toolbar__actions,.batch-table__toolbar__content,.batch-table__row__actions,.batch-table__row__content{padding:8px 0;padding-right:16px;flex:1 1 auto}.batch-table__toolbar{border:1px solid #040609;background:#121a24;border-radius:4px 0 0;height:47px;align-items:center}.batch-table__toolbar__actions{text-align:right;padding-right:11px}.batch-table__form{padding:16px;border:1px solid #040609;border-top:0;background:#121a24}.batch-table__form .fields-row{padding-top:0;margin-bottom:0}.batch-table__row{border:1px solid #040609;border-top:0;background:#0b1016}@media screen and (max-width: 415px){.optional .batch-table__row:first-child{border-top:1px solid #040609}}.batch-table__row:hover{background:#0f151d}.batch-table__row:nth-child(even){background:#121a24}.batch-table__row:nth-child(even):hover{background:#151f2b}.batch-table__row__content{padding-top:12px;padding-bottom:16px}.batch-table__row__content--unpadded{padding:0}.batch-table__row__content--with-image{display:flex;align-items:center}.batch-table__row__content__image{flex:0 0 auto;display:flex;justify-content:center;align-items:center;margin-right:10px}.batch-table__row__content__image .emojione{width:32px;height:32px}.batch-table__row__content__text{flex:1 1 auto}.batch-table__row__content__extra{flex:0 0 auto;text-align:right;color:#9baec8;font-weight:500}.batch-table__row .directory__tag{margin:0;width:100%}.batch-table__row .directory__tag a{background:transparent;border-radius:0}@media screen and (max-width: 415px){.batch-table.optional .batch-table__toolbar,.batch-table.optional .batch-table__row__select{display:none}}.batch-table .status__content{padding-top:0}.batch-table .status__content strong{font-weight:700}.batch-table .nothing-here{border:1px solid #040609;border-top:0;box-shadow:none}@media screen and (max-width: 415px){.batch-table .nothing-here{border-top:1px solid #040609}}@media screen and (max-width: 870px){.batch-table .accounts-table tbody td.optional{display:none}}.admin-wrapper{display:flex;justify-content:center;width:100%;min-height:100vh}.admin-wrapper .sidebar-wrapper{min-height:100vh;overflow:hidden;pointer-events:none;flex:1 1 auto}.admin-wrapper .sidebar-wrapper__inner{display:flex;justify-content:flex-end;background:#121a24;height:100%}.admin-wrapper .sidebar{width:240px;padding:0;pointer-events:auto}.admin-wrapper .sidebar__toggle{display:none;background:#202e3f;height:48px}.admin-wrapper .sidebar__toggle__logo{flex:1 1 auto}.admin-wrapper .sidebar__toggle__logo a{display:inline-block;padding:15px}.admin-wrapper .sidebar__toggle__logo svg{fill:#fff;height:20px;position:relative;bottom:-2px}.admin-wrapper .sidebar__toggle__icon{display:block;color:#9baec8;text-decoration:none;flex:0 0 auto;font-size:20px;padding:15px}.admin-wrapper .sidebar__toggle a:hover,.admin-wrapper .sidebar__toggle a:focus,.admin-wrapper .sidebar__toggle a:active{background:#26374d}.admin-wrapper .sidebar .logo{display:block;margin:40px auto;width:100px;height:100px}@media screen and (max-width: 600px){.admin-wrapper .sidebar>a:first-child{display:none}}.admin-wrapper .sidebar ul{list-style:none;border-radius:4px 0 0 4px;overflow:hidden;margin-bottom:20px}@media screen and (max-width: 600px){.admin-wrapper .sidebar ul{margin-bottom:0}}.admin-wrapper .sidebar ul a{display:block;padding:15px;color:#9baec8;text-decoration:none;transition:all 200ms linear;transition-property:color,background-color;border-radius:4px 0 0 4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.admin-wrapper .sidebar ul a i.fa{margin-right:5px}.admin-wrapper .sidebar ul a:hover{color:#fff;background-color:#0a0e13;transition:all 100ms linear;transition-property:color,background-color}.admin-wrapper .sidebar ul a.selected{background:#0f151d;border-radius:4px 0 0}.admin-wrapper .sidebar ul ul{background:#0b1016;border-radius:0 0 0 4px;margin:0}.admin-wrapper .sidebar ul ul a{border:0;padding:15px 35px}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a{color:#fff;background-color:#d8a070;border-bottom:0;border-radius:0}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a:hover{background-color:#ddad84}.admin-wrapper .sidebar>ul>.simple-navigation-active-leaf a{border-radius:4px 0 0 4px}.admin-wrapper .content-wrapper{box-sizing:border-box;width:100%;max-width:840px;flex:1 1 auto}@media screen and (max-width: 1080px){.admin-wrapper .sidebar-wrapper--empty{display:none}.admin-wrapper .sidebar-wrapper{width:240px;flex:0 0 auto}}@media screen and (max-width: 600px){.admin-wrapper .sidebar-wrapper{width:100%}}.admin-wrapper .content{padding:20px 15px;padding-top:60px;padding-left:25px}@media screen and (max-width: 600px){.admin-wrapper .content{max-width:none;padding:15px;padding-top:30px}}.admin-wrapper .content-heading{display:flex;padding-bottom:40px;border-bottom:1px solid #202e3f;margin:-15px -15px 40px 0;flex-wrap:wrap;align-items:center;justify-content:space-between}.admin-wrapper .content-heading>*{margin-top:15px;margin-right:15px}.admin-wrapper .content-heading-actions{display:inline-flex}.admin-wrapper .content-heading-actions>:not(:first-child){margin-left:5px}@media screen and (max-width: 600px){.admin-wrapper .content-heading{border-bottom:0;padding-bottom:0}}.admin-wrapper .content h2{color:#d9e1e8;font-size:24px;line-height:28px;font-weight:400}@media screen and (max-width: 600px){.admin-wrapper .content h2{font-weight:700}}.admin-wrapper .content h3{color:#d9e1e8;font-size:20px;line-height:28px;font-weight:400;margin-bottom:30px}.admin-wrapper .content h4{text-transform:uppercase;font-size:13px;font-weight:700;color:#9baec8;padding-bottom:8px;margin-bottom:8px;border-bottom:1px solid #202e3f}.admin-wrapper .content h6{font-size:16px;color:#d9e1e8;line-height:28px;font-weight:500}.admin-wrapper .content .fields-group h6{color:#fff;font-weight:500}.admin-wrapper .content .directory__tag>a,.admin-wrapper .content .directory__tag>div{box-shadow:none}.admin-wrapper .content .directory__tag .table-action-link .fa{color:inherit}.admin-wrapper .content .directory__tag h4{font-size:18px;font-weight:700;color:#fff;text-transform:none;padding-bottom:0;margin-bottom:0;border-bottom:none}.admin-wrapper .content>p{font-size:14px;line-height:21px;color:#d9e1e8;margin-bottom:20px}.admin-wrapper .content>p strong{color:#fff;font-weight:500}.admin-wrapper .content>p strong:lang(ja){font-weight:700}.admin-wrapper .content>p strong:lang(ko){font-weight:700}.admin-wrapper .content>p strong:lang(zh-CN){font-weight:700}.admin-wrapper .content>p strong:lang(zh-HK){font-weight:700}.admin-wrapper .content>p strong:lang(zh-TW){font-weight:700}.admin-wrapper .content hr{width:100%;height:0;border:0;border-bottom:1px solid rgba(62,90,124,.6);margin:20px 0}.admin-wrapper .content hr.spacer{height:1px;border:0}@media screen and (max-width: 600px){.admin-wrapper{display:block}.admin-wrapper .sidebar-wrapper{min-height:0}.admin-wrapper .sidebar{width:100%;padding:0;height:auto}.admin-wrapper .sidebar__toggle{display:flex}.admin-wrapper .sidebar>ul{display:none}.admin-wrapper .sidebar ul a,.admin-wrapper .sidebar ul ul a{border-radius:0;border-bottom:1px solid #192432;transition:none}.admin-wrapper .sidebar ul a:hover,.admin-wrapper .sidebar ul ul a:hover{transition:none}.admin-wrapper .sidebar ul ul{border-radius:0}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a{border-bottom-color:#d8a070}}hr.spacer{width:100%;border:0;margin:20px 0;height:1px}body .muted-hint,.admin-wrapper .content .muted-hint{color:#9baec8}body .muted-hint a,.admin-wrapper .content .muted-hint a{color:#d8a070}body .positive-hint,.admin-wrapper .content .positive-hint{color:#79bd9a;font-weight:500}body .negative-hint,.admin-wrapper .content .negative-hint{color:#df405a;font-weight:500}body .neutral-hint,.admin-wrapper .content .neutral-hint{color:#3e5a7c;font-weight:500}body .warning-hint,.admin-wrapper .content .warning-hint{color:#ca8f04;font-weight:500}.filters{display:flex;flex-wrap:wrap}.filters .filter-subset{flex:0 0 auto;margin:0 40px 20px 0}.filters .filter-subset:last-child{margin-bottom:30px}.filters .filter-subset ul{margin-top:5px;list-style:none}.filters .filter-subset ul li{display:inline-block;margin-right:5px}.filters .filter-subset strong{font-weight:500;text-transform:uppercase;font-size:12px}.filters .filter-subset strong:lang(ja){font-weight:700}.filters .filter-subset strong:lang(ko){font-weight:700}.filters .filter-subset strong:lang(zh-CN){font-weight:700}.filters .filter-subset strong:lang(zh-HK){font-weight:700}.filters .filter-subset strong:lang(zh-TW){font-weight:700}.filters .filter-subset a{display:inline-block;color:#9baec8;text-decoration:none;text-transform:uppercase;font-size:12px;font-weight:500;border-bottom:2px solid #121a24}.filters .filter-subset a:hover{color:#fff;border-bottom:2px solid #1b2635}.filters .filter-subset a.selected{color:#d8a070;border-bottom:2px solid #d8a070}.flavour-screen{display:block;margin:10px auto;max-width:100%}.flavour-description{display:block;font-size:16px;margin:10px 0}.flavour-description>p{margin:10px 0}.report-accounts{display:flex;flex-wrap:wrap;margin-bottom:20px}.report-accounts__item{display:flex;flex:250px;flex-direction:column;margin:0 5px}.report-accounts__item>strong{display:block;margin:0 0 10px -5px;font-weight:500;font-size:14px;line-height:18px;color:#d9e1e8}.report-accounts__item>strong:lang(ja){font-weight:700}.report-accounts__item>strong:lang(ko){font-weight:700}.report-accounts__item>strong:lang(zh-CN){font-weight:700}.report-accounts__item>strong:lang(zh-HK){font-weight:700}.report-accounts__item>strong:lang(zh-TW){font-weight:700}.report-accounts__item .account-card{flex:1 1 auto}.report-status,.account-status{display:flex;margin-bottom:10px}.report-status .activity-stream,.account-status .activity-stream{flex:2 0 0;margin-right:20px;max-width:calc(100% - 60px)}.report-status .activity-stream .entry,.account-status .activity-stream .entry{border-radius:4px}.report-status__actions,.account-status__actions{flex:0 0 auto;display:flex;flex-direction:column}.report-status__actions .icon-button,.account-status__actions .icon-button{font-size:24px;width:24px;text-align:center;margin-bottom:10px}.simple_form.new_report_note,.simple_form.new_account_moderation_note{max-width:100%}.batch-form-box{display:flex;flex-wrap:wrap;margin-bottom:5px}.batch-form-box #form_status_batch_action{margin:0 5px 5px 0;font-size:14px}.batch-form-box input.button{margin:0 5px 5px 0}.batch-form-box .media-spoiler-toggle-buttons{margin-left:auto}.batch-form-box .media-spoiler-toggle-buttons .button{overflow:visible;margin:0 0 5px 5px;float:right}.back-link{margin-bottom:10px;font-size:14px}.back-link a{color:#d8a070;text-decoration:none}.back-link a:hover{text-decoration:underline}.spacer{flex:1 1 auto}.log-entry{margin-bottom:20px;line-height:20px}.log-entry__header{display:flex;justify-content:flex-start;align-items:center;padding:10px;background:#121a24;color:#9baec8;border-radius:4px 4px 0 0;font-size:14px;position:relative}.log-entry__avatar{margin-right:10px}.log-entry__avatar .avatar{display:block;margin:0;border-radius:50%;width:40px;height:40px}.log-entry__content{max-width:calc(100% - 90px)}.log-entry__title{word-wrap:break-word}.log-entry__timestamp{color:#3e5a7c}.log-entry__extras{background:#1c2938;border-radius:0 0 4px 4px;padding:10px;color:#9baec8;font-family:monospace,monospace;font-size:12px;word-wrap:break-word;min-height:20px}.log-entry__icon{font-size:28px;margin-right:10px;color:#3e5a7c}.log-entry__icon__overlay{position:absolute;top:10px;right:10px;width:10px;height:10px;border-radius:50%}.log-entry__icon__overlay.positive{background:#79bd9a}.log-entry__icon__overlay.negative{background:#e87487}.log-entry__icon__overlay.neutral{background:#d8a070}.log-entry a,.log-entry .username,.log-entry .target{color:#d9e1e8;text-decoration:none;font-weight:500}.log-entry .diff-old{color:#e87487}.log-entry .diff-neutral{color:#d9e1e8}.log-entry .diff-new{color:#79bd9a}a.name-tag,.name-tag,a.inline-name-tag,.inline-name-tag{text-decoration:none;color:#d9e1e8}a.name-tag .username,.name-tag .username,a.inline-name-tag .username,.inline-name-tag .username{font-weight:500}a.name-tag.suspended .username,.name-tag.suspended .username,a.inline-name-tag.suspended .username,.inline-name-tag.suspended .username{text-decoration:line-through;color:#e87487}a.name-tag.suspended .avatar,.name-tag.suspended .avatar,a.inline-name-tag.suspended .avatar,.inline-name-tag.suspended .avatar{filter:grayscale(100%);opacity:.8}a.name-tag,.name-tag{display:flex;align-items:center}a.name-tag .avatar,.name-tag .avatar{display:block;margin:0;margin-right:5px;border-radius:50%}a.name-tag.suspended .avatar,.name-tag.suspended .avatar{filter:grayscale(100%);opacity:.8}.speech-bubble{margin-bottom:20px;border-left:4px solid #d8a070}.speech-bubble.positive{border-left-color:#79bd9a}.speech-bubble.negative{border-left-color:#e87487}.speech-bubble.warning{border-left-color:#ca8f04}.speech-bubble__bubble{padding:16px;padding-left:14px;font-size:15px;line-height:20px;border-radius:4px 4px 4px 0;position:relative;font-weight:500}.speech-bubble__bubble a{color:#9baec8}.speech-bubble__owner{padding:8px;padding-left:12px}.speech-bubble time{color:#3e5a7c}.report-card{background:#121a24;border-radius:4px;margin-bottom:20px}.report-card__profile{display:flex;justify-content:space-between;align-items:center;padding:15px}.report-card__profile .account{padding:0;border:0}.report-card__profile .account__avatar-wrapper{margin-left:0}.report-card__profile__stats{flex:0 0 auto;font-weight:500;color:#9baec8;text-transform:uppercase;text-align:right}.report-card__profile__stats a{color:inherit;text-decoration:none}.report-card__profile__stats a:focus,.report-card__profile__stats a:hover,.report-card__profile__stats a:active{color:#b5c3d6}.report-card__profile__stats .red{color:#df405a}.report-card__summary__item{display:flex;justify-content:flex-start;border-top:1px solid #0b1016}.report-card__summary__item:hover{background:#151f2b}.report-card__summary__item__reported-by,.report-card__summary__item__assigned{padding:15px;flex:0 0 auto;box-sizing:border-box;width:150px;color:#9baec8}.report-card__summary__item__reported-by,.report-card__summary__item__reported-by .username,.report-card__summary__item__assigned,.report-card__summary__item__assigned .username{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.report-card__summary__item__content{flex:1 1 auto;max-width:calc(100% - 300px)}.report-card__summary__item__content__icon{color:#3e5a7c;margin-right:4px;font-weight:500}.report-card__summary__item__content a{display:block;box-sizing:border-box;width:100%;padding:15px;text-decoration:none;color:#9baec8}.one-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ellipsized-ip{display:inline-block;max-width:120px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.admin-account-bio{display:flex;flex-wrap:wrap;margin:0 -5px;margin-top:20px}.admin-account-bio>div{box-sizing:border-box;padding:0 5px;margin-bottom:10px;flex:1 0 50%}.admin-account-bio .account__header__fields,.admin-account-bio .account__header__content{background:#202e3f;border-radius:4px;height:100%}.admin-account-bio .account__header__fields{margin:0;border:0}.admin-account-bio .account__header__fields a{color:#e1b590}.admin-account-bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.admin-account-bio .account__header__fields .verified a{color:#79bd9a}.admin-account-bio .account__header__content{box-sizing:border-box;padding:20px;color:#fff}.center-text{text-align:center}.emojione[title=\":wavy_dash:\"],.emojione[title=\":waving_black_flag:\"],.emojione[title=\":water_buffalo:\"],.emojione[title=\":video_game:\"],.emojione[title=\":video_camera:\"],.emojione[title=\":vhs:\"],.emojione[title=\":turkey:\"],.emojione[title=\":tophat:\"],.emojione[title=\":top:\"],.emojione[title=\":tm:\"],.emojione[title=\":telephone_receiver:\"],.emojione[title=\":spider:\"],.emojione[title=\":speaking_head_in_silhouette:\"],.emojione[title=\":spades:\"],.emojione[title=\":soon:\"],.emojione[title=\":registered:\"],.emojione[title=\":on:\"],.emojione[title=\":musical_score:\"],.emojione[title=\":movie_camera:\"],.emojione[title=\":mortar_board:\"],.emojione[title=\":microphone:\"],.emojione[title=\":male-guard:\"],.emojione[title=\":lower_left_fountain_pen:\"],.emojione[title=\":lower_left_ballpoint_pen:\"],.emojione[title=\":kaaba:\"],.emojione[title=\":joystick:\"],.emojione[title=\":hole:\"],.emojione[title=\":hocho:\"],.emojione[title=\":heavy_plus_sign:\"],.emojione[title=\":heavy_multiplication_x:\"],.emojione[title=\":heavy_minus_sign:\"],.emojione[title=\":heavy_dollar_sign:\"],.emojione[title=\":heavy_division_sign:\"],.emojione[title=\":heavy_check_mark:\"],.emojione[title=\":guardsman:\"],.emojione[title=\":gorilla:\"],.emojione[title=\":fried_egg:\"],.emojione[title=\":film_projector:\"],.emojione[title=\":female-guard:\"],.emojione[title=\":end:\"],.emojione[title=\":electric_plug:\"],.emojione[title=\":eight_pointed_black_star:\"],.emojione[title=\":dark_sunglasses:\"],.emojione[title=\":currency_exchange:\"],.emojione[title=\":curly_loop:\"],.emojione[title=\":copyright:\"],.emojione[title=\":clubs:\"],.emojione[title=\":camera_with_flash:\"],.emojione[title=\":camera:\"],.emojione[title=\":busts_in_silhouette:\"],.emojione[title=\":bust_in_silhouette:\"],.emojione[title=\":bowling:\"],.emojione[title=\":bomb:\"],.emojione[title=\":black_small_square:\"],.emojione[title=\":black_nib:\"],.emojione[title=\":black_medium_square:\"],.emojione[title=\":black_medium_small_square:\"],.emojione[title=\":black_large_square:\"],.emojione[title=\":black_heart:\"],.emojione[title=\":black_circle:\"],.emojione[title=\":back:\"],.emojione[title=\":ant:\"],.emojione[title=\":8ball:\"]{filter:drop-shadow(1px 1px 0 #ffffff) drop-shadow(-1px 1px 0 #ffffff) drop-shadow(1px -1px 0 #ffffff) drop-shadow(-1px -1px 0 #ffffff)}.hicolor-privacy-icons .status__visibility-icon.fa-globe,.hicolor-privacy-icons .composer--options--dropdown--content--item .fa-globe{color:#1976d2}.hicolor-privacy-icons .status__visibility-icon.fa-unlock,.hicolor-privacy-icons .composer--options--dropdown--content--item .fa-unlock{color:#388e3c}.hicolor-privacy-icons .status__visibility-icon.fa-lock,.hicolor-privacy-icons .composer--options--dropdown--content--item .fa-lock{color:#ffa000}.hicolor-privacy-icons .status__visibility-icon.fa-envelope,.hicolor-privacy-icons .composer--options--dropdown--content--item .fa-envelope{color:#d32f2f}body.rtl{direction:rtl}body.rtl .column-header>button{text-align:right;padding-left:0;padding-right:15px}body.rtl .radio-button__input{margin-right:0;margin-left:10px}body.rtl .directory__card__bar .display-name{margin-left:0;margin-right:15px}body.rtl .display-name{text-align:right}body.rtl .notification__message{margin-left:0;margin-right:68px}body.rtl .drawer__inner__mastodon>img{transform:scaleX(-1)}body.rtl .notification__favourite-icon-wrapper{left:auto;right:-26px}body.rtl .landing-page__logo{margin-right:0;margin-left:20px}body.rtl .landing-page .features-list .features-list__row .visual{margin-left:0;margin-right:15px}body.rtl .column-link__icon,body.rtl .column-header__icon{margin-right:0;margin-left:5px}body.rtl .compose-form .compose-form__buttons-wrapper .character-counter__wrapper{margin-right:0;margin-left:4px}body.rtl .composer--publisher{text-align:left}body.rtl .boost-modal__status-time,body.rtl .favourite-modal__status-time{float:left}body.rtl .navigation-bar__profile{margin-left:0;margin-right:8px}body.rtl .search__input{padding-right:10px;padding-left:30px}body.rtl .search__icon .fa{right:auto;left:10px}body.rtl .columns-area{direction:rtl}body.rtl .column-header__buttons{left:0;right:auto;margin-left:0;margin-right:-15px}body.rtl .column-inline-form .icon-button{margin-left:0;margin-right:5px}body.rtl .column-header__links .text-btn{margin-left:10px;margin-right:0}body.rtl .account__avatar-wrapper{float:right}body.rtl .column-header__back-button{padding-left:5px;padding-right:0}body.rtl .column-header__setting-arrows{float:left}body.rtl .setting-toggle__label{margin-left:0;margin-right:8px}body.rtl .setting-meta__label{float:left}body.rtl .status__avatar{margin-left:10px;margin-right:0;left:auto;right:10px}body.rtl .activity-stream .status.light{padding-left:10px;padding-right:68px}body.rtl .status__info .status__display-name,body.rtl .activity-stream .status.light .status__display-name{padding-left:25px;padding-right:0}body.rtl .activity-stream .pre-header{padding-right:68px;padding-left:0}body.rtl .status__prepend{margin-left:0;margin-right:58px}body.rtl .status__prepend-icon-wrapper{left:auto;right:-26px}body.rtl .activity-stream .pre-header .pre-header__icon{left:auto;right:42px}body.rtl .account__avatar-overlay-overlay{right:auto;left:0}body.rtl .column-back-button--slim-button{right:auto;left:0}body.rtl .status__relative-time,body.rtl .activity-stream .status.light .status__header .status__meta{float:left;text-align:left}body.rtl .status__action-bar__counter{margin-right:0;margin-left:11px}body.rtl .status__action-bar__counter .status__action-bar-button{margin-right:0;margin-left:4px}body.rtl .status__action-bar-button{float:right;margin-right:0;margin-left:18px}body.rtl .status__action-bar-dropdown{float:right}body.rtl .privacy-dropdown__dropdown{margin-left:0;margin-right:40px}body.rtl .privacy-dropdown__option__icon{margin-left:10px;margin-right:0}body.rtl .detailed-status__display-name .display-name{text-align:right}body.rtl .detailed-status__display-avatar{margin-right:0;margin-left:10px;float:right}body.rtl .detailed-status__favorites,body.rtl .detailed-status__reblogs{margin-left:0;margin-right:6px}body.rtl .fa-ul{margin-left:2.14285714em}body.rtl .fa-li{left:auto;right:-2.14285714em}body.rtl .admin-wrapper{direction:rtl}body.rtl .admin-wrapper .sidebar ul a i.fa,body.rtl a.table-action-link i.fa{margin-right:0;margin-left:5px}body.rtl .simple_form .check_boxes .checkbox label{padding-left:0;padding-right:25px}body.rtl .simple_form .input.with_label.boolean label.checkbox{padding-left:25px;padding-right:0}body.rtl .simple_form .check_boxes .checkbox input[type=checkbox],body.rtl .simple_form .input.boolean input[type=checkbox]{left:auto;right:0}body.rtl .simple_form .input.radio_buttons .radio{left:auto;right:0}body.rtl .simple_form .input.radio_buttons .radio>label{padding-right:28px;padding-left:0}body.rtl .simple_form .input-with-append .input input{padding-left:142px;padding-right:0}body.rtl .simple_form .input.boolean label.checkbox{left:auto;right:0}body.rtl .simple_form .input.boolean .label_input,body.rtl .simple_form .input.boolean .hint{padding-left:0;padding-right:28px}body.rtl .simple_form .label_input__append{right:auto;left:3px}body.rtl .simple_form .label_input__append::after{right:auto;left:0;background-image:linear-gradient(to left, rgba(1, 1, 2, 0), #010102)}body.rtl .simple_form select{background:#010102 url(\"data:image/svg+xml;utf8,\") no-repeat left 8px center/auto 16px}body.rtl .table th,body.rtl .table td{text-align:right}body.rtl .filters .filter-subset{margin-right:0;margin-left:45px}body.rtl .landing-page .header-wrapper .mascot{right:60px;left:auto}body.rtl .landing-page__call-to-action .row__information-board{direction:rtl}body.rtl .landing-page .header .hero .floats .float-1{left:-120px;right:auto}body.rtl .landing-page .header .hero .floats .float-2{left:210px;right:auto}body.rtl .landing-page .header .hero .floats .float-3{left:110px;right:auto}body.rtl .landing-page .header .links .brand img{left:0}body.rtl .landing-page .fa-external-link{padding-right:5px;padding-left:0 !important}body.rtl .landing-page .features #mastodon-timeline{margin-right:0;margin-left:30px}@media screen and (min-width: 631px){body.rtl .column,body.rtl .drawer{padding-left:5px;padding-right:5px}body.rtl .column:first-child,body.rtl .drawer:first-child{padding-left:5px;padding-right:10px}body.rtl .columns-area>div .column,body.rtl .columns-area>div .drawer{padding-left:5px;padding-right:5px}}body.rtl .columns-area--mobile .column,body.rtl .columns-area--mobile .drawer{padding-left:0;padding-right:0}body.rtl .public-layout .header .nav-button{margin-left:8px;margin-right:0}body.rtl .public-layout .public-account-header__tabs{margin-left:0;margin-right:20px}body.rtl .landing-page__information .account__display-name{margin-right:0;margin-left:5px}body.rtl .landing-page__information .account__avatar-wrapper{margin-left:12px;margin-right:0}body.rtl .card__bar .display-name{margin-left:0;margin-right:15px;text-align:right}body.rtl .fa-chevron-left::before{content:\"\"}body.rtl .fa-chevron-right::before{content:\"\"}body.rtl .column-back-button__icon{margin-right:0;margin-left:5px}body.rtl .column-header__setting-arrows .column-header__setting-btn:last-child{padding-left:0;padding-right:10px}body.rtl .simple_form .input.radio_buttons .radio>label input{left:auto;right:0}.dashboard__counters{display:flex;flex-wrap:wrap;margin:0 -5px;margin-bottom:20px}.dashboard__counters>div{box-sizing:border-box;flex:0 0 33.333%;padding:0 5px;margin-bottom:10px}.dashboard__counters>div>div,.dashboard__counters>div>a{padding:20px;background:#192432;border-radius:4px;box-sizing:border-box;height:100%}.dashboard__counters>div>a{text-decoration:none;color:inherit;display:block}.dashboard__counters>div>a:hover,.dashboard__counters>div>a:focus,.dashboard__counters>div>a:active{background:#202e3f}.dashboard__counters__num,.dashboard__counters__text{text-align:center;font-weight:500;font-size:24px;line-height:21px;color:#fff;font-family:sans-serif,sans-serif;margin-bottom:20px;line-height:30px}.dashboard__counters__text{font-size:18px}.dashboard__counters__label{font-size:14px;color:#9baec8;text-align:center;font-weight:500}.dashboard__widgets{display:flex;flex-wrap:wrap;margin:0 -5px}.dashboard__widgets>div{flex:0 0 33.333%;margin-bottom:20px}.dashboard__widgets>div>div{padding:0 5px}.dashboard__widgets a:not(.name-tag){color:#d9e1e8;font-weight:500;text-decoration:none}","/* http://meyerweb.com/eric/tools/css/reset/\n v2.0 | 20110126\n License: none (public domain)\n*/\n\nhtml, body, div, span, applet, object, iframe,\nh1, h2, h3, h4, h5, h6, p, blockquote, pre,\na, abbr, acronym, address, big, cite, code,\ndel, dfn, em, img, ins, kbd, q, s, samp,\nsmall, strike, strong, sub, sup, tt, var,\nb, u, i, center,\ndl, dt, dd, ol, ul, li,\nfieldset, form, label, legend,\ntable, caption, tbody, tfoot, thead, tr, th, td,\narticle, aside, canvas, details, embed,\nfigure, figcaption, footer, header, hgroup,\nmenu, nav, output, ruby, section, summary,\ntime, mark, audio, video {\n margin: 0;\n padding: 0;\n border: 0;\n font-size: 100%;\n font: inherit;\n vertical-align: baseline;\n}\n\n/* HTML5 display-role reset for older browsers */\narticle, aside, details, figcaption, figure,\nfooter, header, hgroup, menu, nav, section {\n display: block;\n}\n\nbody {\n line-height: 1;\n}\n\nol, ul {\n list-style: none;\n}\n\nblockquote, q {\n quotes: none;\n}\n\nblockquote:before, blockquote:after,\nq:before, q:after {\n content: '';\n content: none;\n}\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\nhtml {\n scrollbar-color: lighten($ui-base-color, 4%) rgba($base-overlay-background, 0.1);\n}\n\n::-webkit-scrollbar {\n width: 12px;\n height: 12px;\n}\n\n::-webkit-scrollbar-thumb {\n background: lighten($ui-base-color, 4%);\n border: 0px none $base-border-color;\n border-radius: 50px;\n}\n\n::-webkit-scrollbar-thumb:hover {\n background: lighten($ui-base-color, 6%);\n}\n\n::-webkit-scrollbar-thumb:active {\n background: lighten($ui-base-color, 4%);\n}\n\n::-webkit-scrollbar-track {\n border: 0px none $base-border-color;\n border-radius: 0;\n background: rgba($base-overlay-background, 0.1);\n}\n\n::-webkit-scrollbar-track:hover {\n background: $ui-base-color;\n}\n\n::-webkit-scrollbar-track:active {\n background: $ui-base-color;\n}\n\n::-webkit-scrollbar-corner {\n background: transparent;\n}\n","// Commonly used web colors\n$black: #000000; // Black\n$white: #ffffff; // White\n$success-green: #79bd9a; // Padua\n$error-red: #df405a; // Cerise\n$warning-red: #ff5050; // Sunset Orange\n$gold-star: #ca8f04; // Dark Goldenrod\n\n$red-bookmark: $warning-red;\n\n// Pleroma-Dark colors\n$pleroma-bg: #121a24;\n$pleroma-fg: #182230;\n$pleroma-text: #b9b9ba;\n$pleroma-links: #d8a070;\n\n// Values from the classic Mastodon UI\n$classic-base-color: $pleroma-bg;\n$classic-primary-color: #9baec8;\n$classic-secondary-color: #d9e1e8;\n$classic-highlight-color: #d8a070;\n\n// Variables for defaults in UI\n$base-shadow-color: $black !default;\n$base-overlay-background: $black !default;\n$base-border-color: $white !default;\n$simple-background-color: $white !default;\n$valid-value-color: $success-green !default;\n$error-value-color: $error-red !default;\n\n// Tell UI to use selected colors\n$ui-base-color: $classic-base-color !default; // Darkest\n$ui-base-lighter-color: lighten($ui-base-color, 26%) !default; // Lighter darkest\n$ui-primary-color: $classic-primary-color !default; // Lighter\n$ui-secondary-color: $classic-secondary-color !default; // Lightest\n$ui-highlight-color: $classic-highlight-color !default;\n\n// Variables for texts\n$primary-text-color: $white !default;\n$darker-text-color: $ui-primary-color !default;\n$dark-text-color: $ui-base-lighter-color !default;\n$secondary-text-color: $ui-secondary-color !default;\n$highlight-text-color: $ui-highlight-color !default;\n$action-button-color: $ui-base-lighter-color !default;\n// For texts on inverted backgrounds\n$inverted-text-color: $ui-base-color !default;\n$lighter-text-color: $ui-base-lighter-color !default;\n$light-text-color: $ui-primary-color !default;\n\n// Language codes that uses CJK fonts\n$cjk-langs: ja, ko, zh-CN, zh-HK, zh-TW;\n\n// Variables for components\n$media-modal-media-max-width: 100%;\n// put margins on top and bottom of image to avoid the screen covered by image.\n$media-modal-media-max-height: 80%;\n\n$no-gap-breakpoint: 415px;\n\n$font-sans-serif: sans-serif !default;\n$font-display: sans-serif !default;\n$font-monospace: monospace !default;\n\n// Avatar border size (8% default, 100% for rounded avatars)\n$ui-avatar-border-size: 8%;\n\n// More variables\n$dismiss-overlay-width: 4rem;\n","@function hex-color($color) {\n @if type-of($color) == 'color' {\n $color: str-slice(ie-hex-str($color), 4);\n }\n @return '%23' + unquote($color)\n}\n\nbody {\n font-family: $font-sans-serif, sans-serif;\n background: darken($ui-base-color, 7%);\n font-size: 13px;\n line-height: 18px;\n font-weight: 400;\n color: $primary-text-color;\n text-rendering: optimizelegibility;\n font-feature-settings: \"kern\";\n text-size-adjust: none;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n -webkit-tap-highlight-color: transparent;\n\n &.system-font {\n // system-ui => standard property (Chrome/Android WebView 56+, Opera 43+, Safari 11+)\n // -apple-system => Safari <11 specific\n // BlinkMacSystemFont => Chrome <56 on macOS specific\n // Segoe UI => Windows 7/8/10\n // Oxygen => KDE\n // Ubuntu => Unity/Ubuntu\n // Cantarell => GNOME\n // Fira Sans => Firefox OS\n // Droid Sans => Older Androids (<4.0)\n // Helvetica Neue => Older macOS <10.11\n // $font-sans-serif => web-font (Roboto) fallback and newer Androids (>=4.0)\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Oxygen\", \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", $font-sans-serif, sans-serif;\n }\n\n &.app-body {\n padding: 0;\n\n &.layout-single-column {\n height: auto;\n min-height: 100vh;\n overflow-y: scroll;\n }\n\n &.layout-multiple-columns {\n position: absolute;\n width: 100%;\n height: 100%;\n }\n\n &.with-modals--active {\n overflow-y: hidden;\n }\n }\n\n &.lighter {\n background: $ui-base-color;\n }\n\n &.with-modals {\n overflow-x: hidden;\n overflow-y: scroll;\n\n &--active {\n overflow-y: hidden;\n }\n }\n\n &.embed {\n background: lighten($ui-base-color, 4%);\n margin: 0;\n padding-bottom: 0;\n\n .container {\n position: absolute;\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n }\n\n &.admin {\n background: darken($ui-base-color, 4%);\n padding: 0;\n }\n\n &.error {\n position: absolute;\n text-align: center;\n color: $darker-text-color;\n background: $ui-base-color;\n width: 100%;\n height: 100%;\n padding: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n\n .dialog {\n vertical-align: middle;\n margin: 20px;\n\n img {\n display: block;\n max-width: 470px;\n width: 100%;\n height: auto;\n margin-top: -120px;\n }\n\n h1 {\n font-size: 20px;\n line-height: 28px;\n font-weight: 400;\n }\n }\n }\n}\n\nbutton {\n font-family: inherit;\n cursor: pointer;\n\n &:focus {\n outline: none;\n }\n}\n\n.app-holder {\n &,\n & > div {\n display: flex;\n width: 100%;\n align-items: center;\n justify-content: center;\n outline: 0 !important;\n }\n}\n\n.layout-single-column .app-holder {\n &,\n & > div {\n min-height: 100vh;\n }\n}\n\n.layout-multiple-columns .app-holder {\n &,\n & > div {\n height: 100%;\n }\n}\n",".container-alt {\n width: 700px;\n margin: 0 auto;\n margin-top: 40px;\n\n @media screen and (max-width: 740px) {\n width: 100%;\n margin: 0;\n }\n}\n\n.logo-container {\n margin: 100px auto 50px;\n\n @media screen and (max-width: 500px) {\n margin: 40px auto 0;\n }\n\n h1 {\n display: flex;\n justify-content: center;\n align-items: center;\n\n svg {\n fill: $primary-text-color;\n height: 42px;\n margin-right: 10px;\n }\n\n a {\n display: flex;\n justify-content: center;\n align-items: center;\n color: $primary-text-color;\n text-decoration: none;\n outline: 0;\n padding: 12px 16px;\n line-height: 32px;\n font-family: $font-display, sans-serif;\n font-weight: 500;\n font-size: 14px;\n }\n }\n}\n\n.compose-standalone {\n .compose-form {\n width: 400px;\n margin: 0 auto;\n padding: 20px 0;\n margin-top: 40px;\n box-sizing: border-box;\n\n @media screen and (max-width: 400px) {\n width: 100%;\n margin-top: 0;\n padding: 20px;\n }\n }\n}\n\n.account-header {\n width: 400px;\n margin: 0 auto;\n display: flex;\n font-size: 13px;\n line-height: 18px;\n box-sizing: border-box;\n padding: 20px 0;\n padding-bottom: 0;\n margin-bottom: -30px;\n margin-top: 40px;\n\n @media screen and (max-width: 440px) {\n width: 100%;\n margin: 0;\n margin-bottom: 10px;\n padding: 20px;\n padding-bottom: 0;\n }\n\n .avatar {\n width: 40px;\n height: 40px;\n @include avatar-size(40px);\n margin-right: 8px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n @include avatar-radius();\n }\n }\n\n .name {\n flex: 1 1 auto;\n color: $secondary-text-color;\n width: calc(100% - 88px);\n\n .username {\n display: block;\n font-weight: 500;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n }\n\n .logout-link {\n display: block;\n font-size: 32px;\n line-height: 40px;\n margin-left: 8px;\n }\n}\n\n.grid-3 {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: 3fr 1fr;\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-column: 1/3;\n grid-row: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 2;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1/3;\n grid-row: 3;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n grid-template-columns: minmax(0, 100%);\n\n .column-0 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .column-2 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1;\n grid-row: 4;\n }\n }\n}\n\n.grid-4 {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: repeat(4, minmax(0, 1fr));\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-column: 1 / 5;\n grid-row: 1;\n }\n\n .column-1 {\n grid-column: 1 / 4;\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 4;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 2 / 5;\n grid-row: 3;\n }\n\n .column-4 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .landing-page__call-to-action {\n min-height: 100%;\n }\n\n .flash-message {\n margin-bottom: 10px;\n }\n\n @media screen and (max-width: 738px) {\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n .landing-page__call-to-action {\n padding: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .row__information-board {\n width: 100%;\n justify-content: center;\n align-items: center;\n }\n\n .row__mascot {\n display: none;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n grid-template-columns: minmax(0, 100%);\n\n .column-0 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .column-2 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1;\n grid-row: 5;\n }\n\n .column-4 {\n grid-column: 1;\n grid-row: 4;\n }\n }\n}\n\n.public-layout {\n @media screen and (max-width: $no-gap-breakpoint) {\n padding-top: 48px;\n }\n\n .container {\n max-width: 960px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding: 0;\n }\n }\n\n .header {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n height: 48px;\n margin: 10px 0;\n display: flex;\n align-items: stretch;\n justify-content: center;\n flex-wrap: nowrap;\n overflow: hidden;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n position: fixed;\n width: 100%;\n top: 0;\n left: 0;\n margin: 0;\n border-radius: 0;\n box-shadow: none;\n z-index: 110;\n }\n\n & > div {\n flex: 1 1 33.3%;\n min-height: 1px;\n }\n\n .nav-left {\n display: flex;\n align-items: stretch;\n justify-content: flex-start;\n flex-wrap: nowrap;\n }\n\n .nav-center {\n display: flex;\n align-items: stretch;\n justify-content: center;\n flex-wrap: nowrap;\n }\n\n .nav-right {\n display: flex;\n align-items: stretch;\n justify-content: flex-end;\n flex-wrap: nowrap;\n }\n\n .brand {\n display: block;\n padding: 15px;\n\n svg {\n display: block;\n height: 18px;\n width: auto;\n position: relative;\n bottom: -2px;\n fill: $primary-text-color;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n height: 20px;\n }\n }\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 12%);\n }\n }\n\n .nav-link {\n display: flex;\n align-items: center;\n padding: 0 1rem;\n font-size: 12px;\n font-weight: 500;\n text-decoration: none;\n color: $darker-text-color;\n white-space: nowrap;\n text-align: center;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n color: $primary-text-color;\n }\n\n @media screen and (max-width: 550px) {\n &.optional {\n display: none;\n }\n }\n }\n\n .nav-button {\n background: lighten($ui-base-color, 16%);\n margin: 8px;\n margin-left: 0;\n border-radius: 4px;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n background: lighten($ui-base-color, 20%);\n }\n }\n }\n\n $no-columns-breakpoint: 600px;\n\n .grid {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(300px, 3fr) minmax(298px, 1fr);\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-row: 1;\n grid-column: 1;\n }\n\n .column-1 {\n grid-row: 1;\n grid-column: 2;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n grid-template-columns: 100%;\n grid-gap: 0;\n\n .column-1 {\n display: none;\n }\n }\n }\n\n .directory__card {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n\n .page-header {\n @media screen and (max-width: $no-gap-breakpoint) {\n border-bottom: 0;\n }\n }\n\n .public-account-header {\n overflow: hidden;\n margin-bottom: 10px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &.inactive {\n opacity: 0.5;\n\n .public-account-header__image,\n .avatar {\n filter: grayscale(100%);\n }\n\n .logo-button {\n background-color: $secondary-text-color;\n }\n }\n\n &__image {\n border-radius: 4px 4px 0 0;\n overflow: hidden;\n height: 300px;\n position: relative;\n background: darken($ui-base-color, 12%);\n\n &::after {\n content: \"\";\n display: block;\n position: absolute;\n width: 100%;\n height: 100%;\n box-shadow: inset 0 -1px 1px 1px rgba($base-shadow-color, 0.15);\n top: 0;\n left: 0;\n }\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 4px 4px 0 0;\n }\n\n @media screen and (max-width: 600px) {\n height: 200px;\n }\n }\n\n &--no-bar {\n margin-bottom: 0;\n\n .public-account-header__image,\n .public-account-header__image img {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n box-shadow: none;\n\n &__image::after {\n display: none;\n }\n\n &__image,\n &__image img {\n border-radius: 0;\n }\n }\n\n &__bar {\n position: relative;\n margin-top: -80px;\n display: flex;\n justify-content: flex-start;\n\n &::before {\n content: \"\";\n display: block;\n background: lighten($ui-base-color, 4%);\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: 60px;\n border-radius: 0 0 4px 4px;\n z-index: -1;\n }\n\n .avatar {\n display: block;\n width: 120px;\n height: 120px;\n @include avatar-size(120px);\n padding-left: 20px - 4px;\n flex: 0 0 auto;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 50%;\n border: 4px solid lighten($ui-base-color, 4%);\n background: darken($ui-base-color, 8%);\n @include avatar-radius();\n }\n }\n\n @media screen and (max-width: 600px) {\n margin-top: 0;\n background: lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n padding: 5px;\n\n &::before {\n display: none;\n }\n\n .avatar {\n width: 48px;\n height: 48px;\n @include avatar-size(48px);\n padding: 7px 0;\n padding-left: 10px;\n\n img {\n border: 0;\n border-radius: 4px;\n @include avatar-radius();\n }\n\n @media screen and (max-width: 360px) {\n display: none;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n flex-wrap: wrap;\n }\n }\n\n &__tabs {\n flex: 1 1 auto;\n margin-left: 20px;\n\n &__name {\n padding-top: 20px;\n padding-bottom: 8px;\n\n h1 {\n font-size: 20px;\n line-height: 18px * 1.5;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n text-shadow: 1px 1px 1px $base-shadow-color;\n\n small {\n display: block;\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n @media screen and (max-width: 600px) {\n margin-left: 15px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n &__name {\n padding-top: 0;\n padding-bottom: 0;\n\n h1 {\n font-size: 16px;\n line-height: 24px;\n text-shadow: none;\n\n small {\n color: $darker-text-color;\n }\n }\n }\n }\n\n &__tabs {\n display: flex;\n justify-content: flex-start;\n align-items: stretch;\n height: 58px;\n\n .details-counters {\n display: flex;\n flex-direction: row;\n min-width: 300px;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n .details-counters {\n display: none;\n }\n }\n\n .counter {\n min-width: 33.3%;\n box-sizing: border-box;\n flex: 0 0 auto;\n color: $darker-text-color;\n padding: 10px;\n border-right: 1px solid lighten($ui-base-color, 4%);\n cursor: default;\n text-align: center;\n position: relative;\n\n a {\n display: block;\n }\n\n &:last-child {\n border-right: 0;\n }\n\n &::after {\n display: block;\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n border-bottom: 4px solid $ui-primary-color;\n opacity: 0.5;\n transition: all 400ms ease;\n }\n\n &.active {\n &::after {\n border-bottom: 4px solid $highlight-text-color;\n opacity: 1;\n }\n\n &.inactive::after {\n border-bottom-color: $secondary-text-color;\n }\n }\n\n &:hover {\n &::after {\n opacity: 1;\n transition-duration: 100ms;\n }\n }\n\n a {\n text-decoration: none;\n color: inherit;\n }\n\n .counter-label {\n font-size: 12px;\n display: block;\n }\n\n .counter-number {\n font-weight: 500;\n font-size: 18px;\n margin-bottom: 5px;\n color: $primary-text-color;\n font-family: $font-display, sans-serif;\n }\n }\n\n .spacer {\n flex: 1 1 auto;\n height: 1px;\n }\n\n &__buttons {\n padding: 7px 8px;\n }\n }\n }\n\n &__extra {\n display: none;\n margin-top: 4px;\n\n .public-account-bio {\n border-radius: 0;\n box-shadow: none;\n background: transparent;\n margin: 0 -5px;\n\n .account__header__fields {\n border-top: 1px solid lighten($ui-base-color, 12%);\n }\n\n .roles {\n display: none;\n }\n }\n\n &__links {\n margin-top: -15px;\n font-size: 14px;\n color: $darker-text-color;\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n padding: 15px;\n font-weight: 500;\n\n strong {\n font-weight: 700;\n color: $primary-text-color;\n }\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n flex: 100%;\n }\n }\n }\n\n .account__section-headline {\n border-radius: 4px 4px 0 0;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n\n .detailed-status__meta {\n margin-top: 25px;\n }\n\n .public-account-bio {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n overflow: hidden;\n margin-bottom: 10px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n box-shadow: none;\n margin-bottom: 0;\n border-radius: 0;\n }\n\n .account__header__fields {\n margin: 0;\n border-top: 0;\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n\n .account__header__content {\n padding: 20px;\n padding-bottom: 0;\n color: $primary-text-color;\n }\n\n &__extra,\n .roles {\n padding: 20px;\n font-size: 14px;\n color: $darker-text-color;\n }\n\n .roles {\n padding-bottom: 0;\n }\n }\n\n .directory__list {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: block;\n }\n\n .icon-button {\n font-size: 18px;\n }\n }\n\n .directory__card {\n margin-bottom: 0;\n }\n\n .card-grid {\n display: flex;\n flex-wrap: wrap;\n min-width: 100%;\n margin: 0 -5px;\n\n & > div {\n box-sizing: border-box;\n flex: 1 0 auto;\n width: 300px;\n padding: 0 5px;\n margin-bottom: 10px;\n max-width: 33.333%;\n\n @media screen and (max-width: 900px) {\n max-width: 50%;\n }\n\n @media screen and (max-width: 600px) {\n max-width: 100%;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin: 0;\n border-top: 1px solid lighten($ui-base-color, 8%);\n\n & > div {\n width: 100%;\n padding: 0;\n margin-bottom: 0;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &:last-child {\n border-bottom: 0;\n }\n\n .card__bar {\n background: $ui-base-color;\n\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n }\n }\n }\n }\n}\n","@mixin avatar-radius() {\n border-radius: $ui-avatar-border-size;\n background-position: 50%;\n background-clip: padding-box;\n}\n\n@mixin avatar-size($size:48px) {\n width: $size;\n height: $size;\n background-size: $size $size;\n}\n\n@mixin single-column($media, $parent: '&') {\n .auto-columns #{$parent} {\n @media #{$media} {\n @content;\n }\n }\n .single-column #{$parent} {\n @content;\n }\n}\n\n@mixin limited-single-column($media, $parent: '&') {\n .auto-columns #{$parent}, .single-column #{$parent} {\n @media #{$media} {\n @content;\n }\n }\n}\n\n@mixin multi-columns($media, $parent: '&') {\n .auto-columns #{$parent} {\n @media #{$media} {\n @content;\n }\n }\n .multi-columns #{$parent} {\n @content;\n }\n}\n\n@mixin fullwidth-gallery {\n &.full-width {\n margin-left: -14px;\n margin-right: -14px;\n width: inherit;\n max-width: none;\n height: 250px;\n border-radius: 0px;\n }\n}\n\n@mixin search-input() {\n outline: 0;\n box-sizing: border-box;\n width: 100%;\n border: none;\n box-shadow: none;\n font-family: inherit;\n background: $ui-base-color;\n color: $darker-text-color;\n font-size: 14px;\n margin: 0;\n}\n\n@mixin search-popout() {\n background: $simple-background-color;\n border-radius: 4px;\n padding: 10px 14px;\n padding-bottom: 14px;\n margin-top: 10px;\n color: $light-text-color;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n\n h4 {\n text-transform: uppercase;\n color: $light-text-color;\n font-size: 13px;\n font-weight: 500;\n margin-bottom: 10px;\n }\n\n li {\n padding: 4px 0;\n }\n\n ul {\n margin-bottom: 10px;\n }\n\n em {\n font-weight: 500;\n color: $inverted-text-color;\n }\n}\n",".no-list {\n list-style: none;\n\n li {\n display: inline-block;\n margin: 0 5px;\n }\n}\n\n.recovery-codes {\n list-style: none;\n margin: 0 auto;\n\n li {\n font-size: 125%;\n line-height: 1.5;\n letter-spacing: 1px;\n }\n}\n",".modal-layout {\n background: $ui-base-color url('data:image/svg+xml;utf8,') repeat-x bottom fixed;\n display: flex;\n flex-direction: column;\n height: 100vh;\n padding: 0;\n}\n\n.modal-layout__mastodon {\n display: flex;\n flex: 1;\n flex-direction: column;\n justify-content: flex-end;\n\n > * {\n flex: 1;\n max-height: 235px;\n }\n}\n\n@media screen and (max-width: 600px) {\n .account-header {\n margin-top: 0;\n }\n}\n",".public-layout {\n .footer {\n text-align: left;\n padding-top: 20px;\n padding-bottom: 60px;\n font-size: 12px;\n color: lighten($ui-base-color, 34%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding-left: 20px;\n padding-right: 20px;\n }\n\n .grid {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: 1fr 1fr 2fr 1fr 1fr;\n\n .column-0 {\n grid-column: 1;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-1 {\n grid-column: 2;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-2 {\n grid-column: 3;\n grid-row: 1;\n min-width: 0;\n text-align: center;\n\n h4 a {\n color: lighten($ui-base-color, 34%);\n }\n }\n\n .column-3 {\n grid-column: 4;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-4 {\n grid-column: 5;\n grid-row: 1;\n min-width: 0;\n }\n\n @media screen and (max-width: 690px) {\n grid-template-columns: 1fr 2fr 1fr;\n\n .column-0,\n .column-1 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 2;\n }\n\n .column-3,\n .column-4 {\n grid-column: 3;\n }\n\n .column-4 {\n grid-row: 2;\n }\n }\n\n @media screen and (max-width: 600px) {\n .column-1 {\n display: block;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n .column-0,\n .column-1,\n .column-3,\n .column-4 {\n display: none;\n }\n }\n }\n\n h4 {\n text-transform: uppercase;\n font-weight: 700;\n margin-bottom: 8px;\n color: $darker-text-color;\n\n a {\n color: inherit;\n text-decoration: none;\n }\n }\n\n ul a {\n text-decoration: none;\n color: lighten($ui-base-color, 34%);\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n\n .brand {\n svg {\n display: block;\n height: 36px;\n width: auto;\n margin: 0 auto;\n fill: lighten($ui-base-color, 34%);\n }\n\n &:hover,\n &:focus,\n &:active {\n svg {\n fill: lighten($ui-base-color, 38%);\n }\n }\n }\n }\n}\n",".compact-header {\n h1 {\n font-size: 24px;\n line-height: 28px;\n color: $darker-text-color;\n font-weight: 500;\n margin-bottom: 20px;\n padding: 0 10px;\n word-wrap: break-word;\n\n @media screen and (max-width: 740px) {\n text-align: center;\n padding: 20px 10px 0;\n }\n\n a {\n color: inherit;\n text-decoration: none;\n }\n\n small {\n font-weight: 400;\n color: $secondary-text-color;\n }\n\n img {\n display: inline-block;\n margin-bottom: -5px;\n margin-right: 15px;\n width: 36px;\n height: 36px;\n }\n }\n}\n",".hero-widget {\n margin-bottom: 10px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &__img {\n width: 100%;\n position: relative;\n overflow: hidden;\n border-radius: 4px 4px 0 0;\n background: $base-shadow-color;\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 4px 4px 0 0;\n }\n }\n\n &__text {\n background: $ui-base-color;\n padding: 20px;\n border-radius: 0 0 4px 4px;\n font-size: 15px;\n color: $darker-text-color;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n p {\n margin-bottom: 20px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n em {\n display: inline;\n margin: 0;\n padding: 0;\n font-weight: 700;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n color: lighten($darker-text-color, 10%);\n }\n\n a {\n color: $secondary-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n}\n\n.endorsements-widget {\n margin-bottom: 10px;\n padding-bottom: 10px;\n\n h4 {\n padding: 10px;\n text-transform: uppercase;\n font-weight: 700;\n font-size: 13px;\n color: $darker-text-color;\n }\n\n .account {\n padding: 10px 0;\n\n &:last-child {\n border-bottom: 0;\n }\n\n .account__display-name {\n display: flex;\n align-items: center;\n }\n\n .account__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n }\n\n .trends__item {\n padding: 10px;\n }\n}\n\n.trends-widget {\n h4 {\n color: $darker-text-color;\n }\n}\n\n.box-widget {\n padding: 20px;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n}\n\n.placeholder-widget {\n padding: 16px;\n border-radius: 4px;\n border: 2px dashed $dark-text-color;\n text-align: center;\n color: $darker-text-color;\n margin-bottom: 10px;\n}\n\n.contact-widget {\n min-height: 100%;\n font-size: 15px;\n color: $darker-text-color;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n padding: 0;\n\n h4 {\n padding: 10px;\n text-transform: uppercase;\n font-weight: 700;\n font-size: 13px;\n color: $darker-text-color;\n }\n\n .account {\n border-bottom: 0;\n padding: 10px 0;\n padding-top: 5px;\n }\n\n & > a {\n display: inline-block;\n padding: 10px;\n padding-top: 0;\n color: $darker-text-color;\n text-decoration: none;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.moved-account-widget {\n padding: 15px;\n padding-bottom: 20px;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n color: $secondary-text-color;\n font-weight: 400;\n margin-bottom: 10px;\n\n strong,\n a {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n color: inherit;\n text-decoration: underline;\n\n &.mention {\n text-decoration: none;\n\n span {\n text-decoration: none;\n }\n\n &:focus,\n &:hover,\n &:active {\n text-decoration: none;\n\n span {\n text-decoration: underline;\n }\n }\n }\n }\n\n &__message {\n margin-bottom: 15px;\n\n .fa {\n margin-right: 5px;\n color: $darker-text-color;\n }\n }\n\n &__card {\n .detailed-status__display-avatar {\n position: relative;\n cursor: pointer;\n }\n\n .detailed-status__display-name {\n margin-bottom: 0;\n text-decoration: none;\n\n span {\n font-weight: 400;\n }\n }\n }\n}\n\n.memoriam-widget {\n padding: 20px;\n border-radius: 4px;\n background: $base-shadow-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n font-size: 14px;\n color: $darker-text-color;\n margin-bottom: 10px;\n}\n\n.page-header {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n padding: 60px 15px;\n text-align: center;\n margin: 10px 0;\n\n h1 {\n color: $primary-text-color;\n font-size: 36px;\n line-height: 1.1;\n font-weight: 700;\n margin-bottom: 10px;\n }\n\n p {\n font-size: 15px;\n color: $darker-text-color;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-top: 0;\n background: lighten($ui-base-color, 4%);\n\n h1 {\n font-size: 24px;\n }\n }\n}\n\n.directory {\n background: $ui-base-color;\n border-radius: 4px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &__tag {\n box-sizing: border-box;\n margin-bottom: 10px;\n\n & > a,\n & > div {\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: $ui-base-color;\n border-radius: 4px;\n padding: 15px;\n text-decoration: none;\n color: inherit;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n }\n\n & > a {\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 8%);\n }\n }\n\n &.active > a {\n background: $ui-highlight-color;\n cursor: default;\n }\n\n &.disabled > div {\n opacity: 0.5;\n cursor: default;\n }\n\n h4 {\n flex: 1 1 auto;\n font-size: 18px;\n font-weight: 700;\n color: $primary-text-color;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n .fa {\n color: $darker-text-color;\n }\n\n small {\n display: block;\n font-weight: 400;\n font-size: 15px;\n margin-top: 8px;\n color: $darker-text-color;\n }\n }\n\n &.active h4 {\n &,\n .fa,\n small {\n color: $primary-text-color;\n }\n }\n\n .avatar-stack {\n flex: 0 0 auto;\n width: (36px + 4px) * 3;\n }\n\n &.active .avatar-stack .account__avatar {\n border-color: $ui-highlight-color;\n }\n }\n}\n\n.avatar-stack {\n display: flex;\n justify-content: flex-end;\n\n .account__avatar {\n flex: 0 0 auto;\n width: 36px;\n height: 36px;\n border-radius: 50%;\n position: relative;\n margin-left: -10px;\n background: darken($ui-base-color, 8%);\n border: 2px solid $ui-base-color;\n\n &:nth-child(1) {\n z-index: 1;\n }\n\n &:nth-child(2) {\n z-index: 2;\n }\n\n &:nth-child(3) {\n z-index: 3;\n }\n }\n}\n\n.accounts-table {\n width: 100%;\n\n .account {\n padding: 0;\n border: 0;\n }\n\n strong {\n font-weight: 700;\n }\n\n thead th {\n text-align: center;\n text-transform: uppercase;\n color: $darker-text-color;\n font-weight: 700;\n padding: 10px;\n\n &:first-child {\n text-align: left;\n }\n }\n\n tbody td {\n padding: 15px 0;\n vertical-align: middle;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n tbody tr:last-child td {\n border-bottom: 0;\n }\n\n &__count {\n width: 120px;\n text-align: center;\n font-size: 15px;\n font-weight: 500;\n color: $primary-text-color;\n\n small {\n display: block;\n color: $darker-text-color;\n font-weight: 400;\n font-size: 14px;\n }\n }\n\n &__comment {\n width: 50%;\n vertical-align: initial !important;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n tbody td.optional {\n display: none;\n }\n }\n}\n\n.moved-account-widget,\n.memoriam-widget,\n.box-widget,\n.contact-widget,\n.landing-page__information.contact-widget,\n.directory,\n.page-header {\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n box-shadow: none;\n border-radius: 0;\n }\n}\n\n$maximum-width: 1235px;\n$fluid-breakpoint: $maximum-width + 20px;\n\n.statuses-grid {\n min-height: 600px;\n\n @media screen and (max-width: 640px) {\n width: 100% !important; // Masonry layout is unnecessary at this width\n }\n\n &__item {\n width: (960px - 20px) / 3;\n\n @media screen and (max-width: $fluid-breakpoint) {\n width: (940px - 20px) / 3;\n }\n\n @media screen and (max-width: 640px) {\n width: 100%;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n width: 100vw;\n }\n }\n\n .detailed-status {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 1px solid lighten($ui-base-color, 16%);\n }\n\n &.compact {\n .detailed-status__meta {\n margin-top: 15px;\n }\n\n .status__content {\n font-size: 15px;\n line-height: 20px;\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n .status__content__spoiler-link {\n line-height: 20px;\n margin: 0;\n }\n }\n\n .media-gallery,\n .status-card,\n .video-player {\n margin-top: 15px;\n }\n }\n }\n}\n\n.notice-widget {\n margin-bottom: 10px;\n color: $darker-text-color;\n\n p {\n margin-bottom: 10px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n font-size: 14px;\n line-height: 20px;\n }\n}\n\n.notice-widget,\n.placeholder-widget {\n a {\n text-decoration: none;\n font-weight: 500;\n color: $ui-highlight-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.table-of-contents {\n background: darken($ui-base-color, 4%);\n min-height: 100%;\n font-size: 14px;\n border-radius: 4px;\n\n li a {\n display: block;\n font-weight: 500;\n padding: 15px;\n overflow: hidden;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n text-decoration: none;\n color: $primary-text-color;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n\n li:last-child a {\n border-bottom: 0;\n }\n\n li ul {\n padding-left: 20px;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n }\n}\n","$no-columns-breakpoint: 600px;\n\ncode {\n font-family: $font-monospace, monospace;\n font-weight: 400;\n}\n\n.form-container {\n max-width: 400px;\n padding: 20px;\n margin: 0 auto;\n}\n\n.simple_form {\n .input {\n margin-bottom: 15px;\n overflow: hidden;\n\n &.hidden {\n margin: 0;\n }\n\n &.radio_buttons {\n .radio {\n margin-bottom: 15px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .radio > label {\n position: relative;\n padding-left: 28px;\n\n input {\n position: absolute;\n top: -2px;\n left: 0;\n }\n }\n }\n\n &.boolean {\n position: relative;\n margin-bottom: 0;\n\n .label_input > label {\n font-family: inherit;\n font-size: 14px;\n padding-top: 5px;\n color: $primary-text-color;\n display: block;\n width: auto;\n }\n\n .label_input,\n .hint {\n padding-left: 28px;\n }\n\n .label_input__wrapper {\n position: static;\n }\n\n label.checkbox {\n position: absolute;\n top: 2px;\n left: 0;\n }\n\n label a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: none;\n }\n }\n\n .recommended {\n position: absolute;\n margin: 0 4px;\n margin-top: -2px;\n }\n }\n }\n\n .row {\n display: flex;\n margin: 0 -5px;\n\n .input {\n box-sizing: border-box;\n flex: 1 1 auto;\n width: 50%;\n padding: 0 5px;\n }\n }\n\n .hint {\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n }\n\n code {\n border-radius: 3px;\n padding: 0.2em 0.4em;\n background: darken($ui-base-color, 12%);\n }\n }\n\n span.hint {\n display: block;\n font-size: 12px;\n margin-top: 4px;\n }\n\n p.hint {\n margin-bottom: 15px;\n color: $darker-text-color;\n\n &.subtle-hint {\n text-align: center;\n font-size: 12px;\n line-height: 18px;\n margin-top: 15px;\n margin-bottom: 0;\n }\n }\n\n .card {\n margin-bottom: 15px;\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n .input.with_floating_label {\n .label_input {\n display: flex;\n\n & > label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 500;\n min-width: 150px;\n flex: 0 0 auto;\n }\n\n input,\n select {\n flex: 1 1 auto;\n }\n }\n\n &.select .hint {\n margin-top: 6px;\n margin-left: 150px;\n }\n }\n\n .input.with_label {\n .label_input > label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: block;\n margin-bottom: 8px;\n word-wrap: break-word;\n font-weight: 500;\n }\n\n .hint {\n margin-top: 6px;\n }\n\n ul {\n flex: 390px;\n }\n }\n\n .input.with_block_label {\n max-width: none;\n\n & > label {\n font-family: inherit;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n font-weight: 500;\n padding-top: 5px;\n }\n\n .hint {\n margin-bottom: 15px;\n }\n\n ul {\n columns: 2;\n }\n }\n\n .required abbr {\n text-decoration: none;\n color: lighten($error-value-color, 12%);\n }\n\n .fields-group {\n margin-bottom: 25px;\n\n .input:last-child {\n margin-bottom: 0;\n }\n }\n\n .fields-row {\n display: flex;\n margin: 0 -10px;\n padding-top: 5px;\n margin-bottom: 25px;\n\n .input {\n max-width: none;\n }\n\n &__column {\n box-sizing: border-box;\n padding: 0 10px;\n flex: 1 1 auto;\n min-height: 1px;\n\n &-6 {\n max-width: 50%;\n }\n\n .actions {\n margin-top: 27px;\n }\n }\n\n .fields-group:last-child,\n .fields-row__column.fields-group {\n margin-bottom: 0;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n margin-bottom: 0;\n\n &__column {\n max-width: none;\n }\n\n .fields-group:last-child,\n .fields-row__column.fields-group,\n .fields-row__column {\n margin-bottom: 25px;\n }\n }\n }\n\n .input.radio_buttons .radio label {\n margin-bottom: 5px;\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: block;\n width: auto;\n }\n\n .check_boxes {\n .checkbox {\n label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: inline-block;\n width: auto;\n position: relative;\n padding-top: 5px;\n padding-left: 25px;\n flex: 1 1 auto;\n }\n\n input[type=checkbox] {\n position: absolute;\n left: 0;\n top: 5px;\n margin: 0;\n }\n }\n }\n\n .input.static .label_input__wrapper {\n font-size: 16px;\n padding: 10px;\n border: 1px solid $dark-text-color;\n border-radius: 4px;\n }\n\n input[type=text],\n input[type=number],\n input[type=email],\n input[type=password],\n textarea {\n box-sizing: border-box;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n width: 100%;\n outline: 0;\n font-family: inherit;\n resize: vertical;\n background: darken($ui-base-color, 10%);\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n padding: 10px;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &:invalid {\n box-shadow: none;\n }\n\n &:focus:invalid:not(:placeholder-shown) {\n border-color: lighten($error-red, 12%);\n }\n\n &:required:valid {\n border-color: $valid-value-color;\n }\n\n &:hover {\n border-color: darken($ui-base-color, 20%);\n }\n\n &:active,\n &:focus {\n border-color: $highlight-text-color;\n background: darken($ui-base-color, 8%);\n }\n }\n\n .input.field_with_errors {\n label {\n color: lighten($error-red, 12%);\n }\n\n input[type=text],\n input[type=number],\n input[type=email],\n input[type=password],\n textarea,\n select {\n border-color: lighten($error-red, 12%);\n }\n\n .error {\n display: block;\n font-weight: 500;\n color: lighten($error-red, 12%);\n margin-top: 4px;\n }\n }\n\n .input.disabled {\n opacity: 0.5;\n }\n\n .actions {\n margin-top: 30px;\n display: flex;\n\n &.actions--top {\n margin-top: 0;\n margin-bottom: 30px;\n }\n }\n\n button,\n .button,\n .block-button {\n display: block;\n width: 100%;\n border: 0;\n border-radius: 4px;\n background: $ui-highlight-color;\n color: $primary-text-color;\n font-size: 18px;\n line-height: inherit;\n height: auto;\n padding: 10px;\n text-transform: uppercase;\n text-decoration: none;\n text-align: center;\n box-sizing: border-box;\n cursor: pointer;\n font-weight: 500;\n outline: 0;\n margin-bottom: 10px;\n margin-right: 10px;\n\n &:last-child {\n margin-right: 0;\n }\n\n &:hover {\n background-color: lighten($ui-highlight-color, 5%);\n }\n\n &:active,\n &:focus {\n background-color: darken($ui-highlight-color, 5%);\n }\n\n &:disabled:hover {\n background-color: $ui-primary-color;\n }\n\n &.negative {\n background: $error-value-color;\n\n &:hover {\n background-color: lighten($error-value-color, 5%);\n }\n\n &:active,\n &:focus {\n background-color: darken($error-value-color, 5%);\n }\n }\n }\n\n select {\n appearance: none;\n box-sizing: border-box;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n width: 100%;\n outline: 0;\n font-family: inherit;\n resize: vertical;\n background: darken($ui-base-color, 10%) url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center / auto 16px;\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n padding-left: 10px;\n padding-right: 30px;\n height: 41px;\n }\n\n h4 {\n margin-bottom: 15px !important;\n }\n\n .label_input {\n &__wrapper {\n position: relative;\n }\n\n &__append {\n position: absolute;\n right: 3px;\n top: 1px;\n padding: 10px;\n padding-bottom: 9px;\n font-size: 16px;\n color: $dark-text-color;\n font-family: inherit;\n pointer-events: none;\n cursor: default;\n max-width: 140px;\n white-space: nowrap;\n overflow: hidden;\n\n &::after {\n content: '';\n display: block;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 1px;\n width: 5px;\n background-image: linear-gradient(to right, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));\n }\n }\n }\n\n &__overlay-area {\n position: relative;\n\n &__blurred form {\n filter: blur(2px);\n }\n\n &__overlay {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n background: rgba($ui-base-color, 0.65);\n border-radius: 4px;\n margin-left: -4px;\n margin-top: -4px;\n padding: 4px;\n\n &__content {\n text-align: center;\n\n &.rich-formatting {\n &,\n p {\n color: $primary-text-color;\n }\n }\n }\n }\n }\n}\n\n.block-icon {\n display: block;\n margin: 0 auto;\n margin-bottom: 10px;\n font-size: 24px;\n}\n\n.flash-message {\n background: lighten($ui-base-color, 8%);\n color: $darker-text-color;\n border-radius: 4px;\n padding: 15px 10px;\n margin-bottom: 30px;\n text-align: center;\n\n &.notice {\n border: 1px solid rgba($valid-value-color, 0.5);\n background: rgba($valid-value-color, 0.25);\n color: $valid-value-color;\n }\n\n &.alert {\n border: 1px solid rgba($error-value-color, 0.5);\n background: rgba($error-value-color, 0.25);\n color: $error-value-color;\n }\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n\n &:hover {\n color: $primary-text-color;\n text-decoration: underline;\n }\n }\n\n p {\n margin-bottom: 15px;\n }\n\n .oauth-code {\n outline: 0;\n box-sizing: border-box;\n display: block;\n width: 100%;\n border: none;\n padding: 10px;\n font-family: $font-monospace, monospace;\n background: $ui-base-color;\n color: $primary-text-color;\n font-size: 14px;\n margin: 0;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n @media screen and (max-width: 740px) and (min-width: 441px) {\n margin-top: 40px;\n }\n}\n\n.form-footer {\n margin-top: 30px;\n text-align: center;\n\n a {\n color: $darker-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.quick-nav {\n list-style: none;\n margin-bottom: 25px;\n font-size: 14px;\n\n li {\n display: inline-block;\n margin-right: 10px;\n }\n\n a {\n color: $highlight-text-color;\n text-transform: uppercase;\n text-decoration: none;\n font-weight: 700;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($highlight-text-color, 8%);\n }\n }\n}\n\n.oauth-prompt,\n.follow-prompt {\n margin-bottom: 30px;\n color: $darker-text-color;\n\n h2 {\n font-size: 16px;\n margin-bottom: 30px;\n text-align: center;\n }\n\n strong {\n color: $secondary-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n @media screen and (max-width: 740px) and (min-width: 441px) {\n margin-top: 40px;\n }\n}\n\n.qr-wrapper {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n}\n\n.qr-code {\n flex: 0 0 auto;\n background: $simple-background-color;\n padding: 4px;\n margin: 0 10px 20px 0;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n display: inline-block;\n\n svg {\n display: block;\n margin: 0;\n }\n}\n\n.qr-alternative {\n margin-bottom: 20px;\n color: $secondary-text-color;\n flex: 150px;\n\n samp {\n display: block;\n font-size: 14px;\n }\n}\n\n.table-form {\n p {\n margin-bottom: 15px;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n }\n}\n\n.simple_form,\n.table-form {\n .warning {\n box-sizing: border-box;\n background: rgba($error-value-color, 0.5);\n color: $primary-text-color;\n text-shadow: 1px 1px 0 rgba($base-shadow-color, 0.3);\n box-shadow: 0 2px 6px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n padding: 10px;\n margin-bottom: 15px;\n\n a {\n color: $primary-text-color;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n strong {\n font-weight: 600;\n display: block;\n margin-bottom: 5px;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n\n .fa {\n font-weight: 400;\n }\n }\n }\n}\n\n.action-pagination {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n\n .actions,\n .pagination {\n flex: 1 1 auto;\n }\n\n .actions {\n padding: 30px 0;\n padding-right: 20px;\n flex: 0 0 auto;\n }\n}\n\n.post-follow-actions {\n text-align: center;\n color: $darker-text-color;\n\n div {\n margin-bottom: 4px;\n }\n}\n\n.alternative-login {\n margin-top: 20px;\n margin-bottom: 20px;\n\n h4 {\n font-size: 16px;\n color: $primary-text-color;\n text-align: center;\n margin-bottom: 20px;\n border: 0;\n padding: 0;\n }\n\n .button {\n display: block;\n }\n}\n\n.scope-danger {\n color: $warning-red;\n}\n\n.form_admin_settings_site_short_description,\n.form_admin_settings_site_description,\n.form_admin_settings_site_extended_description,\n.form_admin_settings_site_terms,\n.form_admin_settings_custom_css,\n.form_admin_settings_closed_registrations_message {\n textarea {\n font-family: $font-monospace, monospace;\n }\n}\n\n.input-copy {\n background: darken($ui-base-color, 10%);\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n display: flex;\n align-items: center;\n padding-right: 4px;\n position: relative;\n top: 1px;\n transition: border-color 300ms linear;\n\n &__wrapper {\n flex: 1 1 auto;\n }\n\n input[type=text] {\n background: transparent;\n border: 0;\n padding: 10px;\n font-size: 14px;\n font-family: $font-monospace, monospace;\n }\n\n button {\n flex: 0 0 auto;\n margin: 4px;\n text-transform: none;\n font-weight: 400;\n font-size: 14px;\n padding: 7px 18px;\n padding-bottom: 6px;\n width: auto;\n transition: background 300ms linear;\n }\n\n &.copied {\n border-color: $valid-value-color;\n transition: none;\n\n button {\n background: $valid-value-color;\n transition: none;\n }\n }\n}\n\n.connection-prompt {\n margin-bottom: 25px;\n\n .fa-link {\n background-color: darken($ui-base-color, 4%);\n border-radius: 100%;\n font-size: 24px;\n padding: 10px;\n }\n\n &__column {\n align-items: center;\n display: flex;\n flex: 1;\n flex-direction: column;\n flex-shrink: 1;\n max-width: 50%;\n\n &-sep {\n align-self: center;\n flex-grow: 0;\n overflow: visible;\n position: relative;\n z-index: 1;\n }\n\n p {\n word-break: break-word;\n }\n }\n\n .account__avatar {\n margin-bottom: 20px;\n }\n\n &__connection {\n background-color: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n padding: 25px 10px;\n position: relative;\n text-align: center;\n\n &::after {\n background-color: darken($ui-base-color, 4%);\n content: '';\n display: block;\n height: 100%;\n left: 50%;\n position: absolute;\n top: 0;\n width: 1px;\n }\n }\n\n &__row {\n align-items: flex-start;\n display: flex;\n flex-direction: row;\n }\n}\n",".card {\n & > a {\n display: block;\n text-decoration: none;\n color: inherit;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n box-shadow: none;\n }\n\n &:hover,\n &:active,\n &:focus {\n .card__bar {\n background: lighten($ui-base-color, 8%);\n }\n }\n }\n\n &__img {\n height: 130px;\n position: relative;\n background: darken($ui-base-color, 12%);\n border-radius: 4px 4px 0 0;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n object-fit: cover;\n border-radius: 4px 4px 0 0;\n }\n\n @media screen and (max-width: 600px) {\n height: 200px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n\n &__bar {\n position: relative;\n padding: 15px;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n\n .avatar {\n flex: 0 0 auto;\n width: 48px;\n height: 48px;\n @include avatar-size(48px);\n padding-top: 2px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n @include avatar-radius();\n background: darken($ui-base-color, 8%);\n object-fit: cover;\n }\n }\n\n .display-name {\n margin-left: 15px;\n text-align: left;\n\n strong {\n font-size: 15px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n span {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n}\n\n.pagination {\n padding: 30px 0;\n text-align: center;\n overflow: hidden;\n\n a,\n .current,\n .newer,\n .older,\n .page,\n .gap {\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 500;\n display: inline-block;\n padding: 6px 10px;\n text-decoration: none;\n }\n\n .current {\n background: $simple-background-color;\n border-radius: 100px;\n color: $inverted-text-color;\n cursor: default;\n margin: 0 10px;\n }\n\n .gap {\n cursor: default;\n }\n\n .older,\n .newer {\n text-transform: uppercase;\n color: $secondary-text-color;\n }\n\n .older {\n float: left;\n padding-left: 0;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n .newer {\n float: right;\n padding-right: 0;\n\n .fa {\n display: inline-block;\n margin-left: 5px;\n }\n }\n\n .disabled {\n cursor: default;\n color: lighten($inverted-text-color, 10%);\n }\n\n @media screen and (max-width: 700px) {\n padding: 30px 20px;\n\n .page {\n display: none;\n }\n\n .newer,\n .older {\n display: inline-block;\n }\n }\n}\n\n.nothing-here {\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n color: $light-text-color;\n font-size: 14px;\n font-weight: 500;\n text-align: center;\n display: flex;\n justify-content: center;\n align-items: center;\n cursor: default;\n border-radius: 4px;\n padding: 20px;\n min-height: 30vh;\n\n &--under-tabs {\n border-radius: 0 0 4px 4px;\n }\n\n &--flexible {\n box-sizing: border-box;\n min-height: 100%;\n }\n}\n\n.account-role,\n.simple_form .recommended {\n display: inline-block;\n padding: 4px 6px;\n cursor: default;\n border-radius: 3px;\n font-size: 12px;\n line-height: 12px;\n font-weight: 500;\n color: $ui-secondary-color;\n background-color: rgba($ui-secondary-color, 0.1);\n border: 1px solid rgba($ui-secondary-color, 0.5);\n\n &.moderator {\n color: $success-green;\n background-color: rgba($success-green, 0.1);\n border-color: rgba($success-green, 0.5);\n }\n\n &.admin {\n color: lighten($error-red, 12%);\n background-color: rgba(lighten($error-red, 12%), 0.1);\n border-color: rgba(lighten($error-red, 12%), 0.5);\n }\n}\n\n.account__header__fields {\n max-width: 100vw;\n padding: 0;\n margin: 15px -15px -15px;\n border: 0 none;\n border-top: 1px solid lighten($ui-base-color, 12%);\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n font-size: 14px;\n line-height: 20px;\n\n dl {\n display: flex;\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n }\n\n dt,\n dd {\n box-sizing: border-box;\n padding: 14px;\n text-align: center;\n max-height: 48px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n dt {\n font-weight: 500;\n width: 120px;\n flex: 0 0 auto;\n color: $secondary-text-color;\n background: rgba(darken($ui-base-color, 8%), 0.5);\n }\n\n dd {\n flex: 1 1 auto;\n color: $darker-text-color;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n\n .verified {\n border: 1px solid rgba($valid-value-color, 0.5);\n background: rgba($valid-value-color, 0.25);\n\n a {\n color: $valid-value-color;\n font-weight: 500;\n }\n\n &__mark {\n color: $valid-value-color;\n }\n }\n\n dl:last-child {\n border-bottom: 0;\n }\n}\n\n.directory__tag .trends__item__current {\n width: auto;\n}\n\n.pending-account {\n &__header {\n color: $darker-text-color;\n\n a {\n color: $ui-secondary-color;\n text-decoration: none;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n\n strong {\n color: $primary-text-color;\n font-weight: 700;\n }\n }\n\n &__body {\n margin-top: 10px;\n }\n}\n",".activity-stream {\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n overflow: hidden;\n margin-bottom: 10px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n border-radius: 0;\n box-shadow: none;\n }\n\n &--headless {\n border-radius: 0;\n margin: 0;\n box-shadow: none;\n\n .detailed-status,\n .status {\n border-radius: 0 !important;\n }\n }\n\n div[data-component] {\n width: 100%;\n }\n\n .entry {\n background: $ui-base-color;\n\n .detailed-status,\n .status,\n .load-more {\n animation: none;\n }\n\n &:last-child {\n .detailed-status,\n .status,\n .load-more {\n border-bottom: 0;\n border-radius: 0 0 4px 4px;\n }\n }\n\n &:first-child {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 4px 4px 0 0;\n }\n\n &:last-child {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 4px;\n }\n }\n }\n\n @media screen and (max-width: 740px) {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 0 !important;\n }\n }\n }\n\n &--highlighted .entry {\n background: lighten($ui-base-color, 8%);\n }\n}\n\n.button.logo-button {\n flex: 0 auto;\n font-size: 14px;\n background: $ui-highlight-color;\n color: $primary-text-color;\n text-transform: none;\n line-height: 36px;\n height: auto;\n padding: 3px 15px;\n border: 0;\n\n svg {\n width: 20px;\n height: auto;\n vertical-align: middle;\n margin-right: 5px;\n fill: $primary-text-color;\n }\n\n &:active,\n &:focus,\n &:hover {\n background: lighten($ui-highlight-color, 10%);\n }\n\n &:disabled,\n &.disabled {\n &:active,\n &:focus,\n &:hover {\n background: $ui-primary-color;\n }\n }\n\n &.button--destructive {\n &:active,\n &:focus,\n &:hover {\n background: $error-red;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n svg {\n display: none;\n }\n }\n}\n\n.embed,\n.public-layout {\n .detailed-status {\n padding: 15px;\n }\n\n .status {\n padding: 15px 15px 15px (48px + 15px * 2);\n min-height: 48px + 2px;\n\n &__avatar {\n left: 15px;\n top: 17px;\n }\n\n &__content {\n padding-top: 5px;\n }\n\n &__prepend {\n padding: 8px 0;\n padding-bottom: 2px;\n margin: initial;\n margin-left: 48px + 15px * 2;\n padding-top: 15px;\n }\n\n &__prepend-icon-wrapper {\n position: absolute;\n margin: initial;\n float: initial;\n width: auto;\n left: -32px;\n }\n\n .media-gallery,\n &__action-bar,\n .video-player {\n margin-top: 10px;\n }\n }\n}\n\n// Styling from upstream's WebUI, as public pages use the same layout\n.embed,\n.public-layout {\n .status {\n .status__info {\n font-size: 15px;\n display: initial;\n }\n\n .status__relative-time {\n color: $dark-text-color;\n float: right;\n font-size: 14px;\n width: auto;\n margin: initial;\n padding: initial;\n }\n\n .status__info .status__display-name {\n display: block;\n max-width: 100%;\n padding: 6px 0;\n padding-right: 25px;\n margin: initial;\n\n .display-name strong {\n display: inline;\n }\n }\n\n .status__avatar {\n height: 48px;\n position: absolute;\n width: 48px;\n margin: initial;\n }\n }\n}\n\n.rtl {\n .embed,\n .public-layout {\n .status {\n padding-left: 10px;\n padding-right: 68px;\n\n .status__info .status__display-name {\n padding-left: 25px;\n padding-right: 0;\n }\n\n .status__relative-time {\n float: left;\n }\n }\n }\n}\n",".app-body {\n -webkit-overflow-scrolling: touch;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n}\n\n.link-button {\n display: block;\n font-size: 15px;\n line-height: 20px;\n color: $ui-highlight-color;\n border: 0;\n background: transparent;\n padding: 0;\n cursor: pointer;\n\n &:hover,\n &:active {\n text-decoration: underline;\n }\n\n &:disabled {\n color: $ui-primary-color;\n cursor: default;\n }\n}\n\n.button {\n background-color: darken($ui-highlight-color, 3%);\n border: 10px none;\n border-radius: 4px;\n box-sizing: border-box;\n color: $primary-text-color;\n cursor: pointer;\n display: inline-block;\n font-family: inherit;\n font-size: 14px;\n font-weight: 500;\n height: 36px;\n letter-spacing: 0;\n line-height: 36px;\n overflow: hidden;\n padding: 0 16px;\n position: relative;\n text-align: center;\n text-transform: uppercase;\n text-decoration: none;\n text-overflow: ellipsis;\n transition: all 100ms ease-in;\n transition-property: background-color;\n white-space: nowrap;\n width: auto;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-highlight-color, 7%);\n transition: all 200ms ease-out;\n transition-property: background-color;\n }\n\n &--destructive {\n transition: none;\n\n &:active,\n &:focus,\n &:hover {\n background-color: $error-red;\n transition: none;\n }\n }\n\n &:disabled {\n background-color: $ui-primary-color;\n cursor: default;\n }\n\n &.button-primary,\n &.button-alternative,\n &.button-secondary,\n &.button-alternative-2 {\n font-size: 16px;\n line-height: 36px;\n height: auto;\n text-transform: none;\n padding: 4px 16px;\n }\n\n &.button-alternative {\n color: $inverted-text-color;\n background: $ui-primary-color;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-primary-color, 4%);\n }\n }\n\n &.button-alternative-2 {\n background: $ui-base-lighter-color;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-base-lighter-color, 4%);\n }\n }\n\n &.button-secondary {\n font-size: 16px;\n line-height: 36px;\n height: auto;\n color: $darker-text-color;\n text-transform: none;\n background: transparent;\n padding: 3px 15px;\n border-radius: 4px;\n border: 1px solid $ui-primary-color;\n\n &:active,\n &:focus,\n &:hover {\n border-color: lighten($ui-primary-color, 4%);\n color: lighten($darker-text-color, 4%);\n }\n\n &:disabled {\n opacity: 0.5;\n }\n }\n\n &.button--block {\n display: block;\n width: 100%;\n }\n}\n\n.icon-button {\n display: inline-block;\n padding: 0;\n color: $action-button-color;\n border: 0;\n border-radius: 4px;\n background: transparent;\n cursor: pointer;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($action-button-color, 7%);\n background-color: rgba($action-button-color, 0.15);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n }\n\n &:focus {\n background-color: rgba($action-button-color, 0.3);\n }\n\n &.disabled {\n color: darken($action-button-color, 13%);\n background-color: transparent;\n cursor: default;\n }\n\n &.active {\n color: $highlight-text-color;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &.inverted {\n color: $lighter-text-color;\n\n &:hover,\n &:active,\n &:focus {\n color: darken($lighter-text-color, 7%);\n background-color: rgba($lighter-text-color, 0.15);\n }\n\n &:focus {\n background-color: rgba($lighter-text-color, 0.3);\n }\n\n &.disabled {\n color: lighten($lighter-text-color, 7%);\n background-color: transparent;\n }\n\n &.active {\n color: $highlight-text-color;\n\n &.disabled {\n color: lighten($highlight-text-color, 13%);\n }\n }\n }\n\n &.overlayed {\n box-sizing: content-box;\n background: rgba($base-overlay-background, 0.6);\n color: rgba($primary-text-color, 0.7);\n border-radius: 4px;\n padding: 2px;\n\n &:hover {\n background: rgba($base-overlay-background, 0.9);\n }\n }\n}\n\n.text-icon-button {\n color: $lighter-text-color;\n border: 0;\n border-radius: 4px;\n background: transparent;\n cursor: pointer;\n font-weight: 600;\n font-size: 11px;\n padding: 0 3px;\n line-height: 27px;\n outline: 0;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &:hover,\n &:active,\n &:focus {\n color: darken($lighter-text-color, 7%);\n background-color: rgba($lighter-text-color, 0.15);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n }\n\n &:focus {\n background-color: rgba($lighter-text-color, 0.3);\n }\n\n &.disabled {\n color: lighten($lighter-text-color, 20%);\n background-color: transparent;\n cursor: default;\n }\n\n &.active {\n color: $highlight-text-color;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n}\n\n.dropdown-menu {\n position: absolute;\n transform-origin: 50% 0;\n}\n\n.invisible {\n font-size: 0;\n line-height: 0;\n display: inline-block;\n width: 0;\n height: 0;\n position: absolute;\n\n img,\n svg {\n margin: 0 !important;\n border: 0 !important;\n padding: 0 !important;\n width: 0 !important;\n height: 0 !important;\n }\n}\n\n.ellipsis {\n &::after {\n content: \"…\";\n }\n}\n\n.notification__favourite-icon-wrapper {\n left: 0;\n position: absolute;\n\n .fa.star-icon {\n color: $gold-star;\n }\n}\n\n.star-icon.active {\n color: $gold-star;\n}\n\n.bookmark-icon.active {\n color: $red-bookmark;\n}\n\n.no-reduce-motion .icon-button.star-icon {\n &.activate {\n & > .fa-star {\n animation: spring-rotate-in 1s linear;\n }\n }\n\n &.deactivate {\n & > .fa-star {\n animation: spring-rotate-out 1s linear;\n }\n }\n}\n\n.notification__display-name {\n color: inherit;\n font-weight: 500;\n text-decoration: none;\n\n &:hover {\n color: $primary-text-color;\n text-decoration: underline;\n }\n}\n\n.display-name {\n display: block;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n a {\n color: inherit;\n text-decoration: inherit;\n }\n\n strong {\n height: 18px;\n font-size: 16px;\n font-weight: 500;\n line-height: 18px;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n }\n\n span {\n display: block;\n height: 18px;\n font-size: 15px;\n line-height: 18px;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n }\n\n > a:hover {\n strong {\n text-decoration: underline;\n }\n }\n\n &.inline {\n padding: 0;\n height: 18px;\n font-size: 15px;\n line-height: 18px;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n\n strong {\n display: inline;\n height: auto;\n font-size: inherit;\n line-height: inherit;\n }\n\n span {\n display: inline;\n height: auto;\n font-size: inherit;\n line-height: inherit;\n }\n }\n}\n\n.display-name__html {\n font-weight: 500;\n}\n\n.display-name__account {\n font-size: 14px;\n}\n\n.image-loader {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n\n .image-loader__preview-canvas {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n background: url('~images/void.png') repeat;\n object-fit: contain;\n }\n\n .loading-bar {\n position: relative;\n }\n\n &.image-loader--amorphous .image-loader__preview-canvas {\n display: none;\n }\n}\n\n.zoomable-image {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n img {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n width: auto;\n height: auto;\n object-fit: contain;\n }\n}\n\n.dropdown {\n display: inline-block;\n}\n\n.dropdown__content {\n display: none;\n position: absolute;\n}\n\n.dropdown-menu__separator {\n border-bottom: 1px solid darken($ui-secondary-color, 8%);\n margin: 5px 7px 6px;\n height: 0;\n}\n\n.dropdown-menu {\n background: $ui-secondary-color;\n padding: 4px 0;\n border-radius: 4px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n\n ul {\n list-style: none;\n }\n}\n\n.dropdown-menu__arrow {\n position: absolute;\n width: 0;\n height: 0;\n border: 0 solid transparent;\n\n &.left {\n right: -5px;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: $ui-secondary-color;\n }\n\n &.top {\n bottom: -5px;\n margin-left: -7px;\n border-width: 5px 7px 0;\n border-top-color: $ui-secondary-color;\n }\n\n &.bottom {\n top: -5px;\n margin-left: -7px;\n border-width: 0 7px 5px;\n border-bottom-color: $ui-secondary-color;\n }\n\n &.right {\n left: -5px;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: $ui-secondary-color;\n }\n}\n\n.dropdown-menu__item {\n a {\n font-size: 13px;\n line-height: 18px;\n display: block;\n padding: 4px 14px;\n box-sizing: border-box;\n text-decoration: none;\n background: $ui-secondary-color;\n color: $inverted-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:focus,\n &:hover,\n &:active {\n background: $ui-highlight-color;\n color: $secondary-text-color;\n outline: 0;\n }\n }\n}\n\n.dropdown--active .dropdown__content {\n display: block;\n line-height: 18px;\n max-width: 311px;\n right: 0;\n text-align: left;\n z-index: 9999;\n\n & > ul {\n list-style: none;\n background: $ui-secondary-color;\n padding: 4px 0;\n border-radius: 4px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.4);\n min-width: 140px;\n position: relative;\n }\n\n &.dropdown__right {\n right: 0;\n }\n\n &.dropdown__left {\n & > ul {\n left: -98px;\n }\n }\n\n & > ul > li > a {\n font-size: 13px;\n line-height: 18px;\n display: block;\n padding: 4px 14px;\n box-sizing: border-box;\n text-decoration: none;\n background: $ui-secondary-color;\n color: $inverted-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:focus {\n outline: 0;\n }\n\n &:hover {\n background: $ui-highlight-color;\n color: $secondary-text-color;\n }\n }\n}\n\n.dropdown__icon {\n vertical-align: middle;\n}\n\n.static-content {\n padding: 10px;\n padding-top: 20px;\n color: $dark-text-color;\n\n h1 {\n font-size: 16px;\n font-weight: 500;\n margin-bottom: 40px;\n text-align: center;\n }\n\n p {\n font-size: 13px;\n margin-bottom: 20px;\n }\n}\n\n.column,\n.drawer {\n flex: 1 1 100%;\n overflow: hidden;\n}\n\n@media screen and (min-width: 631px) {\n .columns-area {\n padding: 0;\n }\n\n .column,\n .drawer {\n flex: 0 0 auto;\n padding: 10px;\n padding-left: 5px;\n padding-right: 5px;\n\n &:first-child {\n padding-left: 10px;\n }\n\n &:last-child {\n padding-right: 10px;\n }\n }\n\n .columns-area > div {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n }\n }\n}\n\n.tabs-bar {\n box-sizing: border-box;\n display: flex;\n background: lighten($ui-base-color, 8%);\n flex: 0 0 auto;\n overflow-y: auto;\n}\n\n.tabs-bar__link {\n display: block;\n flex: 1 1 auto;\n padding: 15px 10px;\n padding-bottom: 13px;\n color: $primary-text-color;\n text-decoration: none;\n text-align: center;\n font-size: 14px;\n font-weight: 500;\n border-bottom: 2px solid lighten($ui-base-color, 8%);\n transition: all 50ms linear;\n transition-property: border-bottom, background, color;\n\n .fa {\n font-weight: 400;\n font-size: 16px;\n }\n\n &:hover,\n &:focus,\n &:active {\n @include multi-columns('screen and (min-width: 631px)') {\n background: lighten($ui-base-color, 14%);\n border-bottom-color: lighten($ui-base-color, 14%);\n }\n }\n\n &.active {\n border-bottom: 2px solid $ui-highlight-color;\n color: $highlight-text-color;\n }\n\n span {\n margin-left: 5px;\n display: none;\n }\n\n span.icon {\n margin-left: 0;\n display: inline;\n }\n}\n\n.icon-with-badge {\n position: relative;\n\n &__badge {\n position: absolute;\n left: 9px;\n top: -13px;\n background: $ui-highlight-color;\n border: 2px solid lighten($ui-base-color, 8%);\n padding: 1px 6px;\n border-radius: 6px;\n font-size: 10px;\n font-weight: 500;\n line-height: 14px;\n color: $primary-text-color;\n }\n}\n\n.column-link--transparent .icon-with-badge__badge {\n border-color: darken($ui-base-color, 8%);\n}\n\n.scrollable {\n overflow-y: scroll;\n overflow-x: hidden;\n flex: 1 1 auto;\n -webkit-overflow-scrolling: touch;\n\n &.optionally-scrollable {\n overflow-y: auto;\n }\n\n @supports(display: grid) { // hack to fix Chrome <57\n contain: strict;\n }\n\n &--flex {\n display: flex;\n flex-direction: column;\n }\n\n &__append {\n flex: 1 1 auto;\n position: relative;\n min-height: 120px;\n }\n}\n\n.scrollable.fullscreen {\n @supports(display: grid) { // hack to fix Chrome <57\n contain: none;\n }\n}\n\n.react-toggle {\n display: inline-block;\n position: relative;\n cursor: pointer;\n background-color: transparent;\n border: 0;\n padding: 0;\n user-select: none;\n -webkit-tap-highlight-color: rgba($base-overlay-background, 0);\n -webkit-tap-highlight-color: transparent;\n}\n\n.react-toggle-screenreader-only {\n border: 0;\n clip: rect(0 0 0 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n}\n\n.react-toggle--disabled {\n cursor: not-allowed;\n opacity: 0.5;\n transition: opacity 0.25s;\n}\n\n.react-toggle-track {\n width: 50px;\n height: 24px;\n padding: 0;\n border-radius: 30px;\n background-color: $ui-base-color;\n transition: background-color 0.2s ease;\n}\n\n.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track {\n background-color: darken($ui-base-color, 10%);\n}\n\n.react-toggle--checked .react-toggle-track {\n background-color: $ui-highlight-color;\n}\n\n.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track {\n background-color: lighten($ui-highlight-color, 10%);\n}\n\n.react-toggle-track-check {\n position: absolute;\n width: 14px;\n height: 10px;\n top: 0;\n bottom: 0;\n margin-top: auto;\n margin-bottom: auto;\n line-height: 0;\n left: 8px;\n opacity: 0;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle--checked .react-toggle-track-check {\n opacity: 1;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle-track-x {\n position: absolute;\n width: 10px;\n height: 10px;\n top: 0;\n bottom: 0;\n margin-top: auto;\n margin-bottom: auto;\n line-height: 0;\n right: 10px;\n opacity: 1;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle--checked .react-toggle-track-x {\n opacity: 0;\n}\n\n.react-toggle-thumb {\n position: absolute;\n top: 1px;\n left: 1px;\n width: 22px;\n height: 22px;\n border: 1px solid $ui-base-color;\n border-radius: 50%;\n background-color: darken($simple-background-color, 2%);\n box-sizing: border-box;\n transition: all 0.25s ease;\n transition-property: border-color, left;\n}\n\n.react-toggle--checked .react-toggle-thumb {\n left: 27px;\n border-color: $ui-highlight-color;\n}\n\n.getting-started__wrapper,\n.getting_started,\n.flex-spacer {\n background: $ui-base-color;\n}\n\n.getting-started__wrapper {\n position: relative;\n overflow-y: auto;\n}\n\n.flex-spacer {\n flex: 1 1 auto;\n}\n\n.getting-started {\n background: $ui-base-color;\n flex: 1 0 auto;\n\n p {\n color: $secondary-text-color;\n }\n\n a {\n color: $dark-text-color;\n }\n\n &__panel {\n height: min-content;\n }\n\n &__panel,\n &__footer {\n padding: 10px;\n padding-top: 20px;\n flex: 0 1 auto;\n\n ul {\n margin-bottom: 10px;\n }\n\n ul li {\n display: inline;\n }\n\n p {\n color: $dark-text-color;\n font-size: 13px;\n\n a {\n color: $dark-text-color;\n text-decoration: underline;\n }\n }\n\n a {\n text-decoration: none;\n color: $darker-text-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n }\n\n &__trends {\n flex: 0 1 auto;\n opacity: 1;\n animation: fade 150ms linear;\n margin-top: 10px;\n\n h4 {\n font-size: 12px;\n text-transform: uppercase;\n color: $darker-text-color;\n padding: 10px;\n font-weight: 500;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n @media screen and (max-height: 810px) {\n .trends__item:nth-child(3) {\n display: none;\n }\n }\n\n @media screen and (max-height: 720px) {\n .trends__item:nth-child(2) {\n display: none;\n }\n }\n\n @media screen and (max-height: 670px) {\n display: none;\n }\n\n .trends__item {\n border-bottom: 0;\n padding: 10px;\n\n &__current {\n color: $darker-text-color;\n }\n }\n }\n}\n\n.column-link__badge {\n display: inline-block;\n border-radius: 4px;\n font-size: 12px;\n line-height: 19px;\n font-weight: 500;\n background: $ui-base-color;\n padding: 4px 8px;\n margin: -6px 10px;\n}\n\n.keyboard-shortcuts {\n padding: 8px 0 0;\n overflow: hidden;\n\n thead {\n position: absolute;\n left: -9999px;\n }\n\n td {\n padding: 0 10px 8px;\n }\n\n kbd {\n display: inline-block;\n padding: 3px 5px;\n background-color: lighten($ui-base-color, 8%);\n border: 1px solid darken($ui-base-color, 4%);\n }\n}\n\n.setting-text {\n color: $darker-text-color;\n background: transparent;\n border: none;\n border-bottom: 2px solid $ui-primary-color;\n box-sizing: border-box;\n display: block;\n font-family: inherit;\n margin-bottom: 10px;\n padding: 7px 0;\n width: 100%;\n\n &:focus,\n &:active {\n color: $primary-text-color;\n border-bottom-color: $ui-highlight-color;\n }\n\n @include limited-single-column('screen and (max-width: 600px)') {\n font-size: 16px;\n }\n\n &.light {\n color: $inverted-text-color;\n border-bottom: 2px solid lighten($ui-base-color, 27%);\n\n &:focus,\n &:active {\n color: $inverted-text-color;\n border-bottom-color: $ui-highlight-color;\n }\n }\n}\n\n.no-reduce-motion button.icon-button i.fa-retweet {\n background-position: 0 0;\n height: 19px;\n transition: background-position 0.9s steps(10);\n transition-duration: 0s;\n vertical-align: middle;\n width: 22px;\n\n &::before {\n display: none !important;\n }\n}\n\n.no-reduce-motion button.icon-button.active i.fa-retweet {\n transition-duration: 0.9s;\n background-position: 0 100%;\n}\n\n.reduce-motion button.icon-button i.fa-retweet {\n color: $action-button-color;\n transition: color 100ms ease-in;\n}\n\n.reduce-motion button.icon-button.active i.fa-retweet {\n color: $highlight-text-color;\n}\n\n.reduce-motion button.icon-button.disabled i.fa-retweet {\n color: darken($action-button-color, 13%);\n}\n\n.load-more {\n display: block;\n color: $dark-text-color;\n background-color: transparent;\n border: 0;\n font-size: inherit;\n text-align: center;\n line-height: inherit;\n margin: 0;\n padding: 15px;\n box-sizing: border-box;\n width: 100%;\n clear: both;\n text-decoration: none;\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n}\n\n.load-gap {\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n}\n\n.missing-indicator {\n padding-top: 20px + 48px;\n}\n\n.scrollable > div > :first-child .notification__dismiss-overlay > .wrappy {\n border-top: 1px solid $ui-base-color;\n}\n\n.notification__dismiss-overlay {\n overflow: hidden;\n position: absolute;\n top: 0;\n right: 0;\n bottom: -1px;\n padding-left: 15px; // space for the box shadow to be visible\n\n z-index: 999;\n align-items: center;\n justify-content: flex-end;\n cursor: pointer;\n\n display: flex;\n\n .wrappy {\n width: $dismiss-overlay-width;\n align-self: stretch;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background: lighten($ui-base-color, 8%);\n border-left: 1px solid lighten($ui-base-color, 20%);\n box-shadow: 0 0 5px black;\n border-bottom: 1px solid $ui-base-color;\n }\n\n .ckbox {\n border: 2px solid $ui-primary-color;\n border-radius: 2px;\n width: 30px;\n height: 30px;\n font-size: 20px;\n color: $darker-text-color;\n text-shadow: 0 0 5px black;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n &:focus {\n outline: 0 !important;\n\n .ckbox {\n box-shadow: 0 0 1px 1px $ui-highlight-color;\n }\n }\n}\n\n.text-btn {\n display: inline-block;\n padding: 0;\n font-family: inherit;\n font-size: inherit;\n color: inherit;\n border: 0;\n background: transparent;\n cursor: pointer;\n}\n\n.loading-indicator {\n color: $dark-text-color;\n font-size: 12px;\n font-weight: 400;\n text-transform: uppercase;\n overflow: visible;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n\n span {\n display: block;\n float: left;\n margin-left: 50%;\n transform: translateX(-50%);\n margin: 82px 0 0 50%;\n white-space: nowrap;\n }\n}\n\n.loading-indicator__figure {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 42px;\n height: 42px;\n box-sizing: border-box;\n background-color: transparent;\n border: 0 solid lighten($ui-base-color, 26%);\n border-width: 6px;\n border-radius: 50%;\n}\n\n.no-reduce-motion .loading-indicator span {\n animation: loader-label 1.15s infinite cubic-bezier(0.215, 0.610, 0.355, 1.000);\n}\n\n.no-reduce-motion .loading-indicator__figure {\n animation: loader-figure 1.15s infinite cubic-bezier(0.215, 0.610, 0.355, 1.000);\n}\n\n@keyframes spring-rotate-in {\n 0% {\n transform: rotate(0deg);\n }\n\n 30% {\n transform: rotate(-484.8deg);\n }\n\n 60% {\n transform: rotate(-316.7deg);\n }\n\n 90% {\n transform: rotate(-375deg);\n }\n\n 100% {\n transform: rotate(-360deg);\n }\n}\n\n@keyframes spring-rotate-out {\n 0% {\n transform: rotate(-360deg);\n }\n\n 30% {\n transform: rotate(124.8deg);\n }\n\n 60% {\n transform: rotate(-43.27deg);\n }\n\n 90% {\n transform: rotate(15deg);\n }\n\n 100% {\n transform: rotate(0deg);\n }\n}\n\n@keyframes loader-figure {\n 0% {\n width: 0;\n height: 0;\n background-color: lighten($ui-base-color, 26%);\n }\n\n 29% {\n background-color: lighten($ui-base-color, 26%);\n }\n\n 30% {\n width: 42px;\n height: 42px;\n background-color: transparent;\n border-width: 21px;\n opacity: 1;\n }\n\n 100% {\n width: 42px;\n height: 42px;\n border-width: 0;\n opacity: 0;\n background-color: transparent;\n }\n}\n\n@keyframes loader-label {\n 0% { opacity: 0.25; }\n 30% { opacity: 1; }\n 100% { opacity: 0.25; }\n}\n\n.spoiler-button {\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n position: absolute;\n z-index: 100;\n\n &--minified {\n display: flex;\n left: 4px;\n top: 4px;\n width: auto;\n height: auto;\n align-items: center;\n }\n\n &--click-thru {\n pointer-events: none;\n }\n\n &--hidden {\n display: none;\n }\n\n &__overlay {\n display: block;\n background: transparent;\n width: 100%;\n height: 100%;\n border: 0;\n\n &__label {\n display: inline-block;\n background: rgba($base-overlay-background, 0.5);\n border-radius: 8px;\n padding: 8px 12px;\n color: $primary-text-color;\n font-weight: 500;\n font-size: 14px;\n }\n\n &:hover,\n &:focus,\n &:active {\n .spoiler-button__overlay__label {\n background: rgba($base-overlay-background, 0.8);\n }\n }\n\n &:disabled {\n .spoiler-button__overlay__label {\n background: rgba($base-overlay-background, 0.5);\n }\n }\n }\n}\n\n.setting-toggle {\n display: block;\n line-height: 24px;\n}\n\n.setting-toggle__label,\n.setting-radio__label,\n.setting-meta__label {\n color: $darker-text-color;\n display: inline-block;\n margin-bottom: 14px;\n margin-left: 8px;\n vertical-align: middle;\n}\n\n.setting-radio {\n display: block;\n line-height: 18px;\n}\n\n.setting-radio__label {\n margin-bottom: 0;\n}\n\n.column-settings__row legend {\n color: $darker-text-color;\n cursor: default;\n display: block;\n font-weight: 500;\n margin-top: 10px;\n}\n\n.setting-radio__input {\n vertical-align: middle;\n}\n\n.setting-meta__label {\n float: right;\n}\n\n@keyframes heartbeat {\n from {\n transform: scale(1);\n transform-origin: center center;\n animation-timing-function: ease-out;\n }\n\n 10% {\n transform: scale(0.91);\n animation-timing-function: ease-in;\n }\n\n 17% {\n transform: scale(0.98);\n animation-timing-function: ease-out;\n }\n\n 33% {\n transform: scale(0.87);\n animation-timing-function: ease-in;\n }\n\n 45% {\n transform: scale(1);\n animation-timing-function: ease-out;\n }\n}\n\n.pulse-loading {\n animation: heartbeat 1.5s ease-in-out infinite both;\n}\n\n.upload-area {\n align-items: center;\n background: rgba($base-overlay-background, 0.8);\n display: flex;\n height: 100%;\n justify-content: center;\n left: 0;\n opacity: 0;\n position: absolute;\n top: 0;\n visibility: hidden;\n width: 100%;\n z-index: 2000;\n\n * {\n pointer-events: none;\n }\n}\n\n.upload-area__drop {\n width: 320px;\n height: 160px;\n display: flex;\n box-sizing: border-box;\n position: relative;\n padding: 8px;\n}\n\n.upload-area__background {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: -1;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 5px rgba($base-shadow-color, 0.2);\n}\n\n.upload-area__content {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: $secondary-text-color;\n font-size: 18px;\n font-weight: 500;\n border: 2px dashed $ui-base-lighter-color;\n border-radius: 4px;\n}\n\n.dropdown--active .emoji-button img {\n opacity: 1;\n filter: none;\n}\n\n.loading-bar {\n background-color: $ui-highlight-color;\n height: 3px;\n position: absolute;\n top: 0;\n left: 0;\n z-index: 9999;\n}\n\n.icon-badge-wrapper {\n position: relative;\n}\n\n.icon-badge {\n position: absolute;\n display: block;\n right: -.25em;\n top: -.25em;\n background-color: $ui-highlight-color;\n border-radius: 50%;\n font-size: 75%;\n width: 1em;\n height: 1em;\n}\n\n.conversation {\n display: flex;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n padding: 5px;\n padding-bottom: 0;\n\n &:focus {\n background: lighten($ui-base-color, 2%);\n outline: 0;\n }\n\n &__avatar {\n flex: 0 0 auto;\n padding: 10px;\n padding-top: 12px;\n position: relative;\n }\n\n &__unread {\n display: inline-block;\n background: $highlight-text-color;\n border-radius: 50%;\n width: 0.625rem;\n height: 0.625rem;\n margin: -.1ex .15em .1ex;\n }\n\n &__content {\n flex: 1 1 auto;\n padding: 10px 5px;\n padding-right: 15px;\n overflow: hidden;\n\n &__info {\n overflow: hidden;\n display: flex;\n flex-direction: row-reverse;\n justify-content: space-between;\n }\n\n &__relative-time {\n font-size: 15px;\n color: $darker-text-color;\n padding-left: 15px;\n }\n\n &__names {\n color: $darker-text-color;\n font-size: 15px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-bottom: 4px;\n flex-basis: 90px;\n flex-grow: 1;\n\n a {\n color: $primary-text-color;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n }\n\n .status__content {\n margin: 0;\n }\n }\n\n &--unread {\n background: lighten($ui-base-color, 2%);\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n .conversation__content__info {\n font-weight: 700;\n }\n\n .conversation__content__relative-time {\n color: $primary-text-color;\n }\n }\n}\n\n.ui .flash-message {\n margin-top: 10px;\n margin-left: auto;\n margin-right: auto;\n margin-bottom: 0;\n min-width: 75%;\n}\n\n::-webkit-scrollbar-thumb {\n border-radius: 0;\n}\n\nnoscript {\n text-align: center;\n\n img {\n width: 200px;\n opacity: 0.5;\n animation: flicker 4s infinite;\n }\n\n div {\n font-size: 14px;\n margin: 30px auto;\n color: $secondary-text-color;\n max-width: 400px;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n\n a {\n word-break: break-word;\n }\n }\n}\n\n@keyframes flicker {\n 0% { opacity: 1; }\n 30% { opacity: 0.75; }\n 100% { opacity: 1; }\n}\n\n@import 'boost';\n@import 'accounts';\n@import 'domains';\n@import 'status';\n@import 'modal';\n@import 'composer';\n@import 'columns';\n@import 'regeneration_indicator';\n@import 'directory';\n@import 'search';\n@import 'emoji';\n@import 'doodle';\n@import 'drawer';\n@import 'media';\n@import 'sensitive';\n@import 'lists';\n@import 'emoji_picker';\n@import 'local_settings';\n@import 'error_boundary';\n@import 'single_column';\n","button.icon-button i.fa-retweet {\n background-image: url(\"data:image/svg+xml;utf8,\");\n\n &:hover {\n background-image: url(\"data:image/svg+xml;utf8,\");\n }\n}\n\n// Disabled variant\nbutton.icon-button.disabled i.fa-retweet {\n &, &:hover {\n background-image: url(\"data:image/svg+xml;utf8,\");\n }\n}\n\n// Disabled variant for use with DMs\n.status-direct button.icon-button.disabled i.fa-retweet {\n &, &:hover {\n background-image: url(\"data:image/svg+xml;utf8,\");\n }\n}\n",".account {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n color: inherit;\n text-decoration: none;\n\n .account__display-name {\n flex: 1 1 auto;\n display: block;\n color: $darker-text-color;\n overflow: hidden;\n text-decoration: none;\n font-size: 14px;\n }\n\n &.small {\n border: none;\n padding: 0;\n\n & > .account__avatar-wrapper { margin: 0 8px 0 0 }\n\n & > .display-name {\n height: 24px;\n line-height: 24px;\n }\n }\n}\n\n.account__wrapper {\n display: flex;\n}\n\n.account__avatar-wrapper {\n float: left;\n margin-left: 12px;\n margin-right: 12px;\n}\n\n.account__avatar {\n @include avatar-radius();\n position: relative;\n cursor: pointer;\n\n &-inline {\n display: inline-block;\n vertical-align: middle;\n margin-right: 5px;\n }\n\n &-composite {\n @include avatar-radius;\n overflow: hidden;\n position: relative;\n cursor: default;\n\n & div {\n @include avatar-radius;\n float: left;\n position: relative;\n box-sizing: border-box;\n }\n\n &__label {\n display: block;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n color: $primary-text-color;\n text-shadow: 1px 1px 2px $base-shadow-color;\n font-weight: 700;\n font-size: 15px;\n }\n }\n}\n\n.account__avatar-overlay {\n position: relative;\n @include avatar-size(48px);\n\n &-base {\n @include avatar-radius();\n @include avatar-size(36px);\n }\n\n &-overlay {\n @include avatar-radius();\n @include avatar-size(24px);\n\n position: absolute;\n bottom: 0;\n right: 0;\n z-index: 1;\n }\n}\n\n.account__relationship {\n height: 18px;\n padding: 10px;\n white-space: nowrap;\n}\n\n.account__header__wrapper {\n flex: 0 0 auto;\n background: lighten($ui-base-color, 4%);\n}\n\n.account__disclaimer {\n padding: 10px;\n color: $dark-text-color;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n font-weight: 500;\n color: inherit;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n}\n\n.account__action-bar {\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n line-height: 36px;\n overflow: hidden;\n flex: 0 0 auto;\n display: flex;\n}\n\n.account__action-bar-links {\n display: flex;\n flex: 1 1 auto;\n line-height: 18px;\n text-align: center;\n}\n\n.account__action-bar__tab {\n text-decoration: none;\n overflow: hidden;\n flex: 0 1 100%;\n border-left: 1px solid lighten($ui-base-color, 8%);\n padding: 10px 0;\n border-bottom: 4px solid transparent;\n\n &:first-child {\n border-left: 0;\n }\n\n &.active {\n border-bottom: 4px solid $ui-highlight-color;\n }\n\n & > span {\n display: block;\n text-transform: uppercase;\n font-size: 11px;\n color: $darker-text-color;\n }\n\n strong {\n display: block;\n font-size: 15px;\n font-weight: 500;\n color: $primary-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n abbr {\n color: $highlight-text-color;\n }\n}\n\n.account-authorize {\n padding: 14px 10px;\n\n .detailed-status__display-name {\n display: block;\n margin-bottom: 15px;\n overflow: hidden;\n }\n}\n\n.account-authorize__avatar {\n float: left;\n margin-right: 10px;\n}\n\n.notification__message {\n margin-left: 42px;\n padding: 8px 0 0 26px;\n cursor: default;\n color: $darker-text-color;\n font-size: 15px;\n position: relative;\n\n .fa {\n color: $highlight-text-color;\n }\n\n > span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.account--panel {\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: row;\n padding: 10px 0;\n}\n\n.account--panel__button,\n.detailed-status__button {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.column-settings__outer {\n background: lighten($ui-base-color, 8%);\n padding: 15px;\n}\n\n.column-settings__section {\n color: $darker-text-color;\n cursor: default;\n display: block;\n font-weight: 500;\n margin-bottom: 10px;\n}\n\n.column-settings__hashtags {\n .column-settings__row {\n margin-bottom: 15px;\n }\n\n .column-select {\n &__control {\n @include search-input();\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n &__placeholder {\n color: $dark-text-color;\n padding-left: 2px;\n font-size: 12px;\n }\n\n &__value-container {\n padding-left: 6px;\n }\n\n &__multi-value {\n background: lighten($ui-base-color, 8%);\n\n &__remove {\n cursor: pointer;\n\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 12%);\n color: lighten($darker-text-color, 4%);\n }\n }\n }\n\n &__multi-value__label,\n &__input {\n color: $darker-text-color;\n }\n\n &__clear-indicator,\n &__dropdown-indicator {\n cursor: pointer;\n transition: none;\n color: $dark-text-color;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($dark-text-color, 4%);\n }\n }\n\n &__indicator-separator {\n background-color: lighten($ui-base-color, 8%);\n }\n\n &__menu {\n @include search-popout();\n padding: 0;\n background: $ui-secondary-color;\n }\n\n &__menu-list {\n padding: 6px;\n }\n\n &__option {\n color: $inverted-text-color;\n border-radius: 4px;\n font-size: 14px;\n\n &--is-focused,\n &--is-selected {\n background: darken($ui-secondary-color, 10%);\n }\n }\n }\n}\n\n.column-settings__row {\n .text-btn {\n margin-bottom: 15px;\n }\n}\n\n.relationship-tag {\n color: $primary-text-color;\n margin-bottom: 4px;\n display: block;\n vertical-align: top;\n background-color: $base-overlay-background;\n text-transform: uppercase;\n font-size: 11px;\n font-weight: 500;\n padding: 4px;\n border-radius: 4px;\n opacity: 0.7;\n\n &:hover {\n opacity: 1;\n }\n}\n\n.account-gallery__container {\n display: flex;\n flex-wrap: wrap;\n padding: 4px 2px;\n}\n\n.account-gallery__item {\n border: none;\n box-sizing: border-box;\n display: block;\n position: relative;\n border-radius: 4px;\n overflow: hidden;\n margin: 2px;\n\n &__icons {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 24px;\n }\n}\n\n.notification__filter-bar,\n.account__section-headline {\n background: darken($ui-base-color, 4%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n display: flex;\n flex-shrink: 0;\n\n button {\n background: darken($ui-base-color, 4%);\n border: 0;\n margin: 0;\n }\n\n button,\n a {\n display: block;\n flex: 1 1 auto;\n color: $darker-text-color;\n padding: 15px 0;\n font-size: 14px;\n font-weight: 500;\n text-align: center;\n text-decoration: none;\n position: relative;\n\n &.active {\n color: $secondary-text-color;\n\n &::before,\n &::after {\n display: block;\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 50%;\n width: 0;\n height: 0;\n transform: translateX(-50%);\n border-style: solid;\n border-width: 0 10px 10px;\n border-color: transparent transparent lighten($ui-base-color, 8%);\n }\n\n &::after {\n bottom: -1px;\n border-color: transparent transparent $ui-base-color;\n }\n }\n }\n\n &.directory__section-headline {\n background: darken($ui-base-color, 2%);\n border-bottom-color: transparent;\n\n a,\n button {\n &.active {\n &::before {\n display: none;\n }\n\n &::after {\n border-color: transparent transparent darken($ui-base-color, 7%);\n }\n }\n }\n }\n}\n\n.account__moved-note {\n padding: 14px 10px;\n padding-bottom: 16px;\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &__message {\n position: relative;\n margin-left: 58px;\n color: $dark-text-color;\n padding: 8px 0;\n padding-top: 0;\n padding-bottom: 4px;\n font-size: 14px;\n\n > span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n &__icon-wrapper {\n left: -26px;\n position: absolute;\n }\n\n .detailed-status__display-avatar {\n position: relative;\n }\n\n .detailed-status__display-name {\n margin-bottom: 0;\n }\n}\n\n.account__header__content {\n color: $darker-text-color;\n font-size: 14px;\n font-weight: 400;\n overflow: hidden;\n word-break: normal;\n word-wrap: break-word;\n\n p {\n margin-bottom: 20px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: inherit;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n}\n\n.account__header {\n overflow: hidden;\n\n &.inactive {\n opacity: 0.5;\n\n .account__header__image,\n .account__avatar {\n filter: grayscale(100%);\n }\n }\n\n &__info {\n position: absolute;\n top: 10px;\n left: 10px;\n }\n\n &__image {\n overflow: hidden;\n height: 145px;\n position: relative;\n background: darken($ui-base-color, 4%);\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n }\n }\n\n &__bar {\n position: relative;\n background: lighten($ui-base-color, 4%);\n padding: 5px;\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n\n .avatar {\n display: block;\n flex: 0 0 auto;\n width: 94px;\n margin-left: -2px;\n\n .account__avatar {\n background: darken($ui-base-color, 8%);\n border: 2px solid lighten($ui-base-color, 4%);\n }\n }\n }\n\n &__tabs {\n display: flex;\n align-items: flex-start;\n padding: 7px 5px;\n margin-top: -55px;\n\n &__buttons {\n display: flex;\n align-items: center;\n padding-top: 55px;\n overflow: hidden;\n\n .icon-button {\n border: 1px solid lighten($ui-base-color, 12%);\n border-radius: 4px;\n box-sizing: content-box;\n padding: 2px;\n }\n\n .button {\n margin: 0 8px;\n }\n }\n\n &__name {\n padding: 5px;\n\n .account-role {\n vertical-align: top;\n }\n\n .emojione {\n width: 22px;\n height: 22px;\n }\n\n h1 {\n font-size: 16px;\n line-height: 24px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n\n small {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n .spacer {\n flex: 1 1 auto;\n }\n }\n\n &__bio {\n overflow: hidden;\n margin: 0 -5px;\n\n .account__header__content {\n padding: 20px 15px;\n padding-bottom: 5px;\n color: $primary-text-color;\n }\n\n .account__header__fields {\n margin: 0;\n border-top: 1px solid lighten($ui-base-color, 12%);\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n }\n\n &__extra {\n margin-top: 4px;\n\n &__links {\n font-size: 14px;\n color: $darker-text-color;\n padding: 10px 0;\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n padding: 5px 10px;\n font-weight: 500;\n\n strong {\n font-weight: 700;\n color: $primary-text-color;\n }\n }\n }\n }\n}\n",".domain {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n .domain__domain-name {\n flex: 1 1 auto;\n display: block;\n color: $primary-text-color;\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n }\n}\n\n.domain__wrapper {\n display: flex;\n}\n\n.domain_buttons {\n height: 18px;\n padding: 10px;\n white-space: nowrap;\n}\n","@keyframes spring-flip-in {\n 0% {\n transform: rotate(0deg);\n }\n\n 30% {\n transform: rotate(-242.4deg);\n }\n\n 60% {\n transform: rotate(-158.35deg);\n }\n\n 90% {\n transform: rotate(-187.5deg);\n }\n\n 100% {\n transform: rotate(-180deg);\n }\n}\n\n@keyframes spring-flip-out {\n 0% {\n transform: rotate(-180deg);\n }\n\n 30% {\n transform: rotate(62.4deg);\n }\n\n 60% {\n transform: rotate(-21.635deg);\n }\n\n 90% {\n transform: rotate(7.5deg);\n }\n\n 100% {\n transform: rotate(0deg);\n }\n}\n\n.status__content--with-action {\n cursor: pointer;\n}\n\n.status__content {\n position: relative;\n margin: 10px 0;\n font-size: 15px;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n overflow: visible;\n padding-top: 5px;\n\n &:focus {\n outline: 0;\n }\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n img {\n max-width: 100%;\n max-height: 400px;\n object-fit: contain;\n }\n\n p, pre, blockquote {\n margin-bottom: 20px;\n white-space: pre-wrap;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .status__content__text,\n .e-content {\n overflow: hidden;\n\n & > ul,\n & > ol {\n margin-bottom: 20px;\n }\n\n h1, h2, h3, h4, h5 {\n margin-top: 20px;\n margin-bottom: 20px;\n }\n\n h1, h2 {\n font-weight: 700;\n font-size: 1.2em;\n }\n\n h2 {\n font-size: 1.1em;\n }\n\n h3, h4, h5 {\n font-weight: 500;\n }\n\n blockquote {\n padding-left: 10px;\n border-left: 3px solid $darker-text-color;\n color: $darker-text-color;\n white-space: normal;\n\n p:last-child {\n margin-bottom: 0;\n }\n }\n\n b, strong {\n font-weight: 700;\n }\n\n em, i {\n font-style: italic;\n }\n\n sub {\n font-size: smaller;\n text-align: sub;\n }\n\n sup {\n font-size: smaller;\n vertical-align: super;\n }\n\n ul, ol {\n margin-left: 1em;\n\n p {\n margin: 0;\n }\n }\n\n ul {\n list-style-type: disc;\n }\n\n ol {\n list-style-type: decimal;\n }\n }\n\n a {\n color: $pleroma-links;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n\n .fa {\n color: lighten($dark-text-color, 7%);\n }\n }\n\n &.mention {\n &:hover {\n text-decoration: none;\n\n span {\n text-decoration: underline;\n }\n }\n }\n\n .fa {\n color: $dark-text-color;\n }\n }\n\n .status__content__spoiler {\n display: none;\n\n &.status__content__spoiler--visible {\n display: block;\n }\n }\n\n a.unhandled-link {\n color: lighten($ui-highlight-color, 8%);\n\n .link-origin-tag {\n color: $gold-star;\n font-size: 0.8em;\n }\n }\n\n .status__content__spoiler-link {\n background: lighten($ui-base-color, 30%);\n\n &:hover {\n background: lighten($ui-base-color, 33%);\n text-decoration: none;\n }\n }\n}\n\n.status__content__spoiler-link {\n display: inline-block;\n border-radius: 2px;\n background: lighten($ui-base-color, 30%);\n border: none;\n color: $inverted-text-color;\n font-weight: 500;\n font-size: 11px;\n padding: 0 5px;\n text-transform: uppercase;\n line-height: inherit;\n cursor: pointer;\n vertical-align: bottom;\n\n &:hover {\n background: lighten($ui-base-color, 33%);\n text-decoration: none;\n }\n\n .status__content__spoiler-icon {\n display: inline-block;\n margin: 0 0 0 5px;\n border-left: 1px solid currentColor;\n padding: 0 0 0 4px;\n font-size: 16px;\n vertical-align: -2px;\n }\n}\n\n.notif-cleaning {\n .status,\n .notification-follow,\n .notification-follow-request {\n padding-right: ($dismiss-overlay-width + 0.5rem);\n }\n}\n\n.status__wrapper--filtered {\n color: $dark-text-color;\n border: 0;\n font-size: inherit;\n text-align: center;\n line-height: inherit;\n margin: 0;\n padding: 15px;\n box-sizing: border-box;\n width: 100%;\n clear: both;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n}\n\n.status__prepend-icon-wrapper {\n left: -26px;\n position: absolute;\n}\n\n.notification-follow,\n.notification-follow-request {\n position: relative;\n\n // same like Status\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n .account {\n border-bottom: 0 none;\n }\n}\n\n.focusable {\n &:focus {\n outline: 0;\n background: lighten($ui-base-color, 4%);\n\n &.status.status-direct:not(.read) {\n background: lighten($ui-base-color, 12%);\n\n &.muted {\n background: transparent;\n }\n }\n\n .detailed-status,\n .detailed-status__action-bar {\n background: lighten($ui-base-color, 8%);\n }\n }\n}\n\n.status {\n padding: 10px 14px;\n position: relative;\n height: auto;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n\n @supports (-ms-overflow-style: -ms-autohiding-scrollbar) {\n // Add margin to avoid Edge auto-hiding scrollbar appearing over content.\n // On Edge 16 this is 16px and Edge <=15 it's 12px, so aim for 16px.\n padding-right: 28px; // 12px + 16px\n }\n\n @keyframes fade {\n 0% { opacity: 0; }\n 100% { opacity: 1; }\n }\n\n opacity: 1;\n animation: fade 150ms linear;\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n }\n\n &.status-direct:not(.read) {\n background: lighten($ui-base-color, 8%);\n border-bottom-color: lighten($ui-base-color, 12%);\n }\n\n &.light {\n .status__relative-time {\n color: $lighter-text-color;\n }\n\n .status__display-name {\n color: $inverted-text-color;\n }\n\n .display-name {\n strong {\n color: $inverted-text-color;\n }\n\n span {\n color: $lighter-text-color;\n }\n }\n\n .status__content {\n color: $inverted-text-color;\n\n a {\n color: $highlight-text-color;\n }\n\n a.status__content__spoiler-link {\n color: $primary-text-color;\n background: $ui-primary-color;\n\n &:hover {\n background: lighten($ui-primary-color, 8%);\n }\n }\n }\n }\n\n &.collapsed {\n background-position: center;\n background-size: cover;\n user-select: none;\n\n &.has-background::before {\n display: block;\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n background-image: linear-gradient(to bottom, rgba($base-shadow-color, .75), rgba($base-shadow-color, .65) 24px, rgba($base-shadow-color, .8));\n pointer-events: none;\n content: \"\";\n }\n\n .display-name:hover .display-name__html {\n text-decoration: none;\n }\n\n .status__content {\n height: 20px;\n overflow: hidden;\n text-overflow: ellipsis;\n padding-top: 0;\n\n &:after {\n content: \"\";\n position: absolute;\n top: 0; bottom: 0;\n left: 0; right: 0;\n background: linear-gradient(rgba($ui-base-color, 0), rgba($ui-base-color, 1));\n pointer-events: none;\n }\n \n a:hover {\n text-decoration: none;\n }\n }\n &:focus > .status__content:after {\n background: linear-gradient(rgba(lighten($ui-base-color, 4%), 0), rgba(lighten($ui-base-color, 4%), 1));\n }\n &.status-direct:not(.read)> .status__content:after {\n background: linear-gradient(rgba(lighten($ui-base-color, 8%), 0), rgba(lighten($ui-base-color, 8%), 1));\n }\n\n .notification__message {\n margin-bottom: 0;\n }\n\n .status__info .notification__message > span {\n white-space: nowrap;\n }\n }\n\n .notification__message {\n margin: -10px 0px 10px 0;\n }\n}\n\n.notification-favourite {\n .status.status-direct {\n background: transparent;\n\n .icon-button.disabled {\n color: lighten($action-button-color, 13%);\n }\n }\n}\n\n.status__relative-time {\n display: inline-block;\n flex-grow: 1;\n color: $dark-text-color;\n font-size: 14px;\n text-align: right;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.status__display-name {\n color: $dark-text-color;\n overflow: hidden;\n}\n\n.status__info__account .status__display-name {\n display: block;\n max-width: 100%;\n}\n\n.status__info {\n display: flex;\n justify-content: space-between;\n font-size: 15px;\n\n > span {\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n .notification__message > span {\n word-wrap: break-word;\n }\n}\n\n.status__info__icons {\n display: flex;\n align-items: center;\n height: 1em;\n color: $action-button-color;\n\n .status__media-icon,\n .status__visibility-icon,\n .status__reply-icon {\n padding-left: 2px;\n padding-right: 2px;\n }\n\n .status__collapse-button.active > .fa-angle-double-up {\n transform: rotate(-180deg);\n }\n}\n\n.no-reduce-motion .status__collapse-button {\n &.activate {\n & > .fa-angle-double-up {\n animation: spring-flip-in 1s linear;\n }\n }\n\n &.deactivate {\n & > .fa-angle-double-up {\n animation: spring-flip-out 1s linear;\n }\n }\n}\n\n.status__info__account {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n}\n\n.status-check-box {\n border-bottom: 1px solid $ui-secondary-color;\n display: flex;\n\n .status-check-box__status {\n margin: 10px 0 10px 10px;\n flex: 1;\n\n .media-gallery {\n max-width: 250px;\n }\n\n .status__content {\n padding: 0;\n white-space: normal;\n }\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n max-width: 250px;\n }\n\n .media-gallery__item-thumbnail {\n cursor: default;\n }\n }\n}\n\n.status-check-box-toggle {\n align-items: center;\n display: flex;\n flex: 0 0 auto;\n justify-content: center;\n padding: 10px;\n}\n\n.status__prepend {\n margin-top: -10px;\n margin-bottom: 10px;\n margin-left: 58px;\n color: $dark-text-color;\n padding: 8px 0;\n padding-bottom: 2px;\n font-size: 14px;\n position: relative;\n\n .status__display-name strong {\n color: $dark-text-color;\n }\n\n > span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.status__action-bar {\n align-items: center;\n display: flex;\n margin-top: 8px;\n\n &__counter {\n display: inline-flex;\n margin-right: 11px;\n align-items: center;\n\n .status__action-bar-button {\n margin-right: 4px;\n }\n\n &__label {\n display: inline-block;\n width: 14px;\n font-size: 12px;\n font-weight: 500;\n color: $action-button-color;\n }\n }\n}\n\n.status__action-bar-button {\n margin-right: 18px;\n}\n\n.status__action-bar-dropdown {\n height: 23.15px;\n width: 23.15px;\n}\n\n.detailed-status__action-bar-dropdown {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n}\n\n.detailed-status {\n background: lighten($ui-base-color, 4%);\n padding: 14px 10px;\n\n &--flex {\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n align-items: flex-start;\n\n .status__content,\n .detailed-status__meta {\n flex: 100%;\n }\n }\n\n .status__content {\n font-size: 19px;\n line-height: 24px;\n\n .emojione {\n width: 24px;\n height: 24px;\n margin: -1px 0 0;\n }\n }\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n }\n}\n\n.detailed-status__meta {\n margin-top: 15px;\n color: $dark-text-color;\n font-size: 14px;\n line-height: 18px;\n}\n\n.detailed-status__action-bar {\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: row;\n padding: 10px 0;\n}\n\n.detailed-status__link {\n color: inherit;\n text-decoration: none;\n}\n\n.detailed-status__favorites,\n.detailed-status__reblogs {\n display: inline-block;\n font-weight: 500;\n font-size: 12px;\n margin-left: 6px;\n}\n\n.status__display-name,\n.status__relative-time,\n.detailed-status__display-name,\n.detailed-status__datetime,\n.detailed-status__application,\n.account__display-name {\n text-decoration: none;\n}\n\n.status__display-name,\n.account__display-name {\n strong {\n color: $primary-text-color;\n }\n}\n\n.muted {\n .emojione {\n opacity: 0.5;\n }\n}\n\na.status__display-name,\n.reply-indicator__display-name,\n.detailed-status__display-name,\n.account__display-name {\n &:hover strong {\n text-decoration: underline;\n }\n}\n\n.account__display-name strong {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.detailed-status__application,\n.detailed-status__datetime {\n color: inherit;\n}\n\n.detailed-status .button.logo-button {\n margin-bottom: 15px;\n}\n\n.detailed-status__display-name {\n color: $secondary-text-color;\n display: block;\n line-height: 24px;\n margin-bottom: 15px;\n overflow: hidden;\n\n strong,\n span {\n display: block;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n strong {\n font-size: 16px;\n color: $primary-text-color;\n }\n}\n\n.detailed-status__display-avatar {\n float: left;\n margin-right: 10px;\n}\n\n.status__avatar {\n flex: none;\n margin: 0 10px 0 0;\n height: 48px;\n width: 48px;\n}\n\n.muted {\n .status__content,\n .status__content p,\n .status__content a,\n .status__content__text {\n color: $dark-text-color;\n }\n\n .status__display-name strong {\n color: $dark-text-color;\n }\n\n .status__avatar {\n opacity: 0.5;\n }\n\n a.status__content__spoiler-link {\n background: $ui-base-lighter-color;\n color: $inverted-text-color;\n\n &:hover {\n background: lighten($ui-base-color, 29%);\n text-decoration: none;\n }\n }\n}\n\n.status__relative-time,\n.detailed-status__datetime {\n &:hover {\n text-decoration: underline;\n }\n}\n\n.status-card {\n display: flex;\n font-size: 14px;\n border: 1px solid lighten($ui-base-color, 8%);\n border-radius: 4px;\n color: $dark-text-color;\n margin-top: 14px;\n text-decoration: none;\n overflow: hidden;\n\n &__actions {\n bottom: 0;\n left: 0;\n position: absolute;\n right: 0;\n top: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n\n & > div {\n background: rgba($base-shadow-color, 0.6);\n border-radius: 8px;\n padding: 12px 9px;\n flex: 0 0 auto;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n button,\n a {\n display: inline;\n color: $secondary-text-color;\n background: transparent;\n border: 0;\n padding: 0 8px;\n text-decoration: none;\n font-size: 18px;\n line-height: 18px;\n\n &:hover,\n &:active,\n &:focus {\n color: $primary-text-color;\n }\n }\n\n a {\n font-size: 19px;\n position: relative;\n bottom: -1px;\n }\n\n a .fa, a:hover .fa {\n color: inherit;\n }\n }\n}\n\na.status-card {\n cursor: pointer;\n\n &:hover {\n background: lighten($ui-base-color, 8%);\n }\n}\n\n.status-card-photo {\n cursor: zoom-in;\n display: block;\n text-decoration: none;\n width: 100%;\n height: auto;\n margin: 0;\n}\n\n.status-card-video {\n iframe {\n width: 100%;\n height: 100%;\n }\n}\n\n.status-card__title {\n display: block;\n font-weight: 500;\n margin-bottom: 5px;\n color: $darker-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-decoration: none;\n}\n\n.status-card__content {\n flex: 1 1 auto;\n overflow: hidden;\n padding: 14px 14px 14px 8px;\n}\n\n.status-card__description {\n color: $darker-text-color;\n}\n\n.status-card__host {\n display: block;\n margin-top: 5px;\n font-size: 13px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.status-card__image {\n flex: 0 0 100px;\n background: lighten($ui-base-color, 8%);\n position: relative;\n\n & > .fa {\n font-size: 21px;\n position: absolute;\n transform-origin: 50% 50%;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n}\n\n.status-card.horizontal {\n display: block;\n\n .status-card__image {\n width: 100%;\n }\n\n .status-card__image-image {\n border-radius: 4px 4px 0 0;\n }\n\n .status-card__title {\n white-space: inherit;\n }\n}\n\n.status-card.compact {\n border-color: lighten($ui-base-color, 4%);\n\n &.interactive {\n border: 0;\n }\n\n .status-card__content {\n padding: 8px;\n padding-top: 10px;\n }\n\n .status-card__title {\n white-space: nowrap;\n }\n\n .status-card__image {\n flex: 0 0 60px;\n }\n}\n\na.status-card.compact:hover {\n background-color: lighten($ui-base-color, 4%);\n}\n\n.status-card__image-image {\n border-radius: 4px 0 0 4px;\n display: block;\n margin: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n background-size: cover;\n background-position: center center;\n}\n\n.attachment-list {\n display: flex;\n font-size: 14px;\n border: 1px solid lighten($ui-base-color, 8%);\n border-radius: 4px;\n margin-top: 14px;\n overflow: hidden;\n\n &__icon {\n flex: 0 0 auto;\n color: $dark-text-color;\n padding: 8px 18px;\n cursor: default;\n border-right: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n font-size: 26px;\n\n .fa {\n display: block;\n }\n }\n\n &__list {\n list-style: none;\n padding: 4px 0;\n padding-left: 8px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n\n li {\n display: block;\n padding: 4px 0;\n }\n\n a {\n text-decoration: none;\n color: $dark-text-color;\n font-weight: 500;\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n &.compact {\n border: 0;\n margin-top: 4px;\n\n .attachment-list__list {\n padding: 0;\n display: block;\n }\n\n .fa {\n color: $dark-text-color;\n }\n }\n}\n\n.status__wrapper--filtered__button {\n display: inline;\n color: lighten($ui-highlight-color, 8%);\n border: 0;\n background: transparent;\n padding: 0;\n font-size: inherit;\n line-height: inherit;\n\n &:hover,\n &:active {\n text-decoration: underline;\n }\n}\n",".modal-container--preloader {\n background: lighten($ui-base-color, 8%);\n}\n\n.modal-root {\n position: relative;\n transition: opacity 0.3s linear;\n will-change: opacity;\n z-index: 9999;\n}\n\n.modal-root__overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba($base-overlay-background, 0.7);\n}\n\n.modal-root__container {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n align-content: space-around;\n z-index: 9999;\n pointer-events: none;\n user-select: none;\n}\n\n.modal-root__modal {\n pointer-events: auto;\n display: flex;\n z-index: 9999;\n}\n\n.onboarding-modal,\n.error-modal,\n.embed-modal {\n background: $ui-secondary-color;\n color: $inverted-text-color;\n border-radius: 8px;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.onboarding-modal__pager {\n height: 80vh;\n width: 80vw;\n max-width: 520px;\n max-height: 470px;\n\n .react-swipeable-view-container > div {\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n display: none;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n display: flex;\n user-select: text;\n }\n}\n\n.error-modal__body {\n height: 80vh;\n width: 80vw;\n max-width: 520px;\n max-height: 420px;\n position: relative;\n\n & > div {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n padding: 25px;\n display: none;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n display: flex;\n opacity: 0;\n user-select: text;\n }\n}\n\n.error-modal__body {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n text-align: center;\n}\n\n@media screen and (max-width: 550px) {\n .onboarding-modal {\n width: 100%;\n height: 100%;\n border-radius: 0;\n }\n\n .onboarding-modal__pager {\n width: 100%;\n height: auto;\n max-width: none;\n max-height: none;\n flex: 1 1 auto;\n }\n}\n\n.onboarding-modal__paginator,\n.error-modal__footer {\n flex: 0 0 auto;\n background: darken($ui-secondary-color, 8%);\n display: flex;\n padding: 25px;\n\n & > div {\n min-width: 33px;\n }\n\n .onboarding-modal__nav,\n .error-modal__nav {\n color: $lighter-text-color;\n border: 0;\n font-size: 14px;\n font-weight: 500;\n padding: 10px 25px;\n line-height: inherit;\n height: auto;\n margin: -10px;\n border-radius: 4px;\n background-color: transparent;\n\n &:hover,\n &:focus,\n &:active {\n color: darken($lighter-text-color, 4%);\n background-color: darken($ui-secondary-color, 16%);\n }\n\n &.onboarding-modal__done,\n &.onboarding-modal__next {\n color: $inverted-text-color;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($inverted-text-color, 4%);\n }\n }\n }\n}\n\n.error-modal__footer {\n justify-content: center;\n}\n\n.onboarding-modal__dots {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.onboarding-modal__dot {\n width: 14px;\n height: 14px;\n border-radius: 14px;\n background: darken($ui-secondary-color, 16%);\n margin: 0 3px;\n cursor: pointer;\n\n &:hover {\n background: darken($ui-secondary-color, 18%);\n }\n\n &.active {\n cursor: default;\n background: darken($ui-secondary-color, 24%);\n }\n}\n\n.onboarding-modal__page__wrapper {\n pointer-events: none;\n padding: 25px;\n padding-bottom: 0;\n\n &.onboarding-modal__page__wrapper--active {\n pointer-events: auto;\n }\n}\n\n.onboarding-modal__page {\n cursor: default;\n line-height: 21px;\n\n h1 {\n font-size: 18px;\n font-weight: 500;\n color: $inverted-text-color;\n margin-bottom: 20px;\n }\n\n a {\n color: $highlight-text-color;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($highlight-text-color, 4%);\n }\n }\n\n .navigation-bar a {\n color: inherit;\n }\n\n p {\n font-size: 16px;\n color: $lighter-text-color;\n margin-top: 10px;\n margin-bottom: 10px;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n strong {\n font-weight: 500;\n background: $ui-base-color;\n color: $secondary-text-color;\n border-radius: 4px;\n font-size: 14px;\n padding: 3px 6px;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n }\n}\n\n.onboarding-modal__page__wrapper-0 {\n height: 100%;\n padding: 0;\n}\n\n.onboarding-modal__page-one {\n &__lead {\n padding: 65px;\n padding-top: 45px;\n padding-bottom: 0;\n margin-bottom: 10px;\n\n h1 {\n font-size: 26px;\n line-height: 36px;\n margin-bottom: 8px;\n }\n\n p {\n margin-bottom: 0;\n }\n }\n\n &__extra {\n padding-right: 65px;\n padding-left: 185px;\n text-align: center;\n }\n}\n\n.display-case {\n text-align: center;\n font-size: 15px;\n margin-bottom: 15px;\n\n &__label {\n font-weight: 500;\n color: $inverted-text-color;\n margin-bottom: 5px;\n text-transform: uppercase;\n font-size: 12px;\n }\n\n &__case {\n background: $ui-base-color;\n color: $secondary-text-color;\n font-weight: 500;\n padding: 10px;\n border-radius: 4px;\n }\n}\n\n.onboarding-modal__page-two,\n.onboarding-modal__page-three,\n.onboarding-modal__page-four,\n.onboarding-modal__page-five {\n p {\n text-align: left;\n }\n\n .figure {\n background: darken($ui-base-color, 8%);\n color: $secondary-text-color;\n margin-bottom: 20px;\n border-radius: 4px;\n padding: 10px;\n text-align: center;\n font-size: 14px;\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.3);\n\n .onboarding-modal__image {\n border-radius: 4px;\n margin-bottom: 10px;\n }\n\n &.non-interactive {\n pointer-events: none;\n text-align: left;\n }\n }\n}\n\n.onboarding-modal__page-four__columns {\n .row {\n display: flex;\n margin-bottom: 20px;\n\n & > div {\n flex: 1 1 0;\n margin: 0 10px;\n\n &:first-child {\n margin-left: 0;\n }\n\n &:last-child {\n margin-right: 0;\n }\n\n p {\n text-align: center;\n }\n }\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .column-header {\n color: $primary-text-color;\n }\n}\n\n@media screen and (max-width: 320px) and (max-height: 600px) {\n .onboarding-modal__page p {\n font-size: 14px;\n line-height: 20px;\n }\n\n .onboarding-modal__page-two .figure,\n .onboarding-modal__page-three .figure,\n .onboarding-modal__page-four .figure,\n .onboarding-modal__page-five .figure {\n font-size: 12px;\n margin-bottom: 10px;\n }\n\n .onboarding-modal__page-four__columns .row {\n margin-bottom: 10px;\n }\n\n .onboarding-modal__page-four__columns .column-header {\n padding: 5px;\n font-size: 12px;\n }\n}\n\n.onboard-sliders {\n display: inline-block;\n max-width: 30px;\n max-height: auto;\n margin-left: 10px;\n}\n\n.boost-modal,\n.favourite-modal,\n.confirmation-modal,\n.report-modal,\n.actions-modal,\n.mute-modal,\n.block-modal {\n background: lighten($ui-secondary-color, 8%);\n color: $inverted-text-color;\n border-radius: 8px;\n overflow: hidden;\n max-width: 90vw;\n width: 480px;\n position: relative;\n flex-direction: column;\n\n .status__relative-time {\n color: $dark-text-color;\n float: right;\n font-size: 14px;\n width: auto;\n margin: initial;\n padding: initial;\n }\n\n .status__display-name {\n display: flex;\n }\n\n .status__avatar {\n height: 48px;\n width: 48px;\n }\n\n .status__content__spoiler-link {\n color: lighten($secondary-text-color, 8%);\n }\n}\n\n.actions-modal {\n .status {\n background: $white;\n border-bottom-color: $ui-secondary-color;\n padding-top: 10px;\n padding-bottom: 10px;\n }\n\n .dropdown-menu__separator {\n border-bottom-color: $ui-secondary-color;\n }\n}\n\n.boost-modal__container,\n.favourite-modal__container {\n overflow-x: scroll;\n padding: 10px;\n\n .status {\n user-select: text;\n border-bottom: 0;\n }\n}\n\n.boost-modal__action-bar,\n.favourite-modal__action-bar,\n.confirmation-modal__action-bar,\n.mute-modal__action-bar,\n.block-modal__action-bar {\n display: flex;\n justify-content: space-between;\n background: $ui-secondary-color;\n padding: 10px;\n line-height: 36px;\n\n & > div {\n flex: 1 1 auto;\n text-align: right;\n color: $lighter-text-color;\n padding-right: 10px;\n }\n\n .button {\n flex: 0 0 auto;\n }\n}\n\n.boost-modal__status-header,\n.favourite-modal__status-header {\n font-size: 15px;\n}\n\n.boost-modal__status-time,\n.favourite-modal__status-time {\n float: right;\n font-size: 14px;\n}\n\n.mute-modal,\n.block-modal {\n line-height: 24px;\n}\n\n.mute-modal .react-toggle,\n.block-modal .react-toggle {\n vertical-align: middle;\n}\n\n.report-modal {\n width: 90vw;\n max-width: 700px;\n}\n\n.report-modal__container {\n display: flex;\n border-top: 1px solid $ui-secondary-color;\n\n @media screen and (max-width: 480px) {\n flex-wrap: wrap;\n overflow-y: auto;\n }\n}\n\n.report-modal__statuses,\n.report-modal__comment {\n box-sizing: border-box;\n width: 50%;\n\n @media screen and (max-width: 480px) {\n width: 100%;\n }\n}\n\n.report-modal__statuses,\n.focal-point-modal__content {\n flex: 1 1 auto;\n min-height: 20vh;\n max-height: 80vh;\n overflow-y: auto;\n overflow-x: hidden;\n\n .status__content a {\n color: $highlight-text-color;\n }\n\n @media screen and (max-width: 480px) {\n max-height: 10vh;\n }\n}\n\n.focal-point-modal__content {\n @media screen and (max-width: 480px) {\n max-height: 40vh;\n }\n}\n\n.report-modal__comment {\n padding: 20px;\n border-right: 1px solid $ui-secondary-color;\n max-width: 320px;\n\n p {\n font-size: 14px;\n line-height: 20px;\n margin-bottom: 20px;\n }\n\n .setting-text {\n display: block;\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n color: $inverted-text-color;\n background: $white;\n padding: 10px;\n font-family: inherit;\n font-size: 14px;\n resize: none;\n border: 0;\n outline: 0;\n border-radius: 4px;\n border: 1px solid $ui-secondary-color;\n min-height: 100px;\n max-height: 50vh;\n margin-bottom: 10px;\n\n &:focus {\n border: 1px solid darken($ui-secondary-color, 8%);\n }\n\n &__wrapper {\n background: $white;\n border: 1px solid $ui-secondary-color;\n margin-bottom: 10px;\n border-radius: 4px;\n\n .setting-text {\n border: 0;\n margin-bottom: 0;\n border-radius: 0;\n\n &:focus {\n border: 0;\n }\n }\n\n &__modifiers {\n color: $inverted-text-color;\n font-family: inherit;\n font-size: 14px;\n background: $white;\n }\n }\n\n &__toolbar {\n display: flex;\n justify-content: space-between;\n margin-bottom: 20px;\n }\n }\n\n .setting-text-label {\n display: block;\n color: $inverted-text-color;\n font-size: 14px;\n font-weight: 500;\n margin-bottom: 10px;\n }\n\n .setting-toggle {\n margin-top: 20px;\n margin-bottom: 24px;\n\n &__label {\n color: $inverted-text-color;\n font-size: 14px;\n }\n }\n\n @media screen and (max-width: 480px) {\n padding: 10px;\n max-width: 100%;\n order: 2;\n\n .setting-toggle {\n margin-bottom: 4px;\n }\n }\n}\n\n.actions-modal {\n .status {\n overflow-y: auto;\n max-height: 300px;\n }\n\n strong {\n display: block;\n font-weight: 500;\n }\n\n max-height: 80vh;\n max-width: 80vw;\n\n .actions-modal__item-label {\n font-weight: 500;\n }\n\n ul {\n overflow-y: auto;\n flex-shrink: 0;\n max-height: 80vh;\n\n &.with-status {\n max-height: calc(80vh - 75px);\n }\n\n li:empty {\n margin: 0;\n }\n\n li:not(:empty) {\n a {\n color: $inverted-text-color;\n display: flex;\n padding: 12px 16px;\n font-size: 15px;\n align-items: center;\n text-decoration: none;\n\n &,\n button {\n transition: none;\n }\n\n &.active,\n &:hover,\n &:active,\n &:focus {\n &,\n button {\n background: $ui-highlight-color;\n color: $primary-text-color;\n }\n }\n\n & > .react-toggle,\n & > .icon,\n button:first-child {\n margin-right: 10px;\n }\n }\n }\n }\n}\n\n.confirmation-modal__action-bar,\n.mute-modal__action-bar,\n.block-modal__action-bar {\n .confirmation-modal__secondary-button {\n flex-shrink: 1;\n }\n}\n\n.confirmation-modal__secondary-button,\n.confirmation-modal__cancel-button,\n.mute-modal__cancel-button,\n.block-modal__cancel-button {\n background-color: transparent;\n color: $lighter-text-color;\n font-size: 14px;\n font-weight: 500;\n\n &:hover,\n &:focus,\n &:active {\n color: darken($lighter-text-color, 4%);\n background-color: transparent;\n }\n}\n\n.confirmation-modal__do_not_ask_again {\n padding-left: 20px;\n padding-right: 20px;\n padding-bottom: 10px;\n\n font-size: 14px;\n\n label, input {\n vertical-align: middle;\n }\n}\n\n.confirmation-modal__container,\n.mute-modal__container,\n.block-modal__container,\n.report-modal__target {\n padding: 30px;\n font-size: 16px;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n}\n\n.confirmation-modal__container,\n.report-modal__target {\n text-align: center;\n}\n\n.block-modal,\n.mute-modal {\n &__explanation {\n margin-top: 20px;\n }\n\n .setting-toggle {\n margin-top: 20px;\n margin-bottom: 24px;\n display: flex;\n align-items: center;\n\n &__label {\n color: $inverted-text-color;\n margin: 0;\n margin-left: 8px;\n }\n }\n}\n\n.report-modal__target {\n padding: 15px;\n\n .media-modal__close {\n top: 14px;\n right: 15px;\n }\n}\n\n.embed-modal {\n width: auto;\n max-width: 80vw;\n max-height: 80vh;\n\n h4 {\n padding: 30px;\n font-weight: 500;\n font-size: 16px;\n text-align: center;\n }\n\n .embed-modal__container {\n padding: 10px;\n\n .hint {\n margin-bottom: 15px;\n }\n\n .embed-modal__html {\n outline: 0;\n box-sizing: border-box;\n display: block;\n width: 100%;\n border: none;\n padding: 10px;\n font-family: 'mastodon-font-monospace', monospace;\n background: $ui-base-color;\n color: $primary-text-color;\n font-size: 14px;\n margin: 0;\n margin-bottom: 15px;\n border-radius: 4px;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n .embed-modal__iframe {\n width: 400px;\n max-width: 100%;\n overflow: hidden;\n border: 0;\n border-radius: 4px;\n }\n }\n}\n\n.focal-point {\n position: relative;\n cursor: move;\n overflow: hidden;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n background: $base-shadow-color;\n\n img,\n video,\n canvas {\n display: block;\n max-height: 80vh;\n width: 100%;\n height: auto;\n margin: 0;\n object-fit: contain;\n background: $base-shadow-color;\n }\n\n &__reticle {\n position: absolute;\n width: 100px;\n height: 100px;\n transform: translate(-50%, -50%);\n background: url('~images/reticle.png') no-repeat 0 0;\n border-radius: 50%;\n box-shadow: 0 0 0 9999em rgba($base-shadow-color, 0.35);\n }\n\n &__overlay {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n }\n\n &__preview {\n position: absolute;\n bottom: 10px;\n right: 10px;\n z-index: 2;\n cursor: move;\n transition: opacity 0.1s ease;\n\n &:hover {\n opacity: 0.5;\n }\n\n strong {\n color: $primary-text-color;\n font-size: 14px;\n font-weight: 500;\n display: block;\n margin-bottom: 5px;\n }\n\n div {\n border-radius: 4px;\n box-shadow: 0 0 14px rgba($base-shadow-color, 0.2);\n }\n }\n\n @media screen and (max-width: 480px) {\n img,\n video {\n max-height: 100%;\n }\n\n &__preview {\n display: none;\n }\n }\n}\n\n.filtered-status-info {\n text-align: start;\n\n .spoiler__text {\n margin-top: 20px;\n }\n\n .account {\n border-bottom: 0;\n }\n\n .account__display-name strong {\n color: $inverted-text-color;\n }\n\n .status__content__spoiler {\n display: none;\n\n &--visible {\n display: flex;\n }\n }\n\n ul {\n padding: 10px;\n margin-left: 12px;\n list-style: disc inside;\n }\n\n .filtered-status-edit-link {\n color: $action-button-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline\n }\n }\n}\n",".composer {\n padding: 10px;\n}\n\n.character-counter {\n cursor: default;\n font-family: $font-sans-serif, sans-serif;\n font-size: 14px;\n font-weight: 600;\n color: $lighter-text-color;\n\n &.character-counter--over {\n color: $warning-red;\n }\n}\n\n.no-reduce-motion .composer--spoiler {\n transition: height 0.4s ease, opacity 0.4s ease;\n}\n\n.composer--spoiler {\n height: 0;\n transform-origin: bottom;\n opacity: 0.0;\n\n &.composer--spoiler--visible {\n height: 36px;\n margin-bottom: 11px;\n opacity: 1.0;\n }\n\n input {\n display: block;\n box-sizing: border-box;\n margin: 0;\n border: none;\n border-radius: 4px;\n padding: 10px;\n width: 100%;\n outline: 0;\n color: $inverted-text-color;\n background: $simple-background-color;\n font-size: 14px;\n font-family: inherit;\n resize: vertical;\n\n &::placeholder {\n color: $dark-text-color;\n }\n\n &:focus { outline: 0 }\n @include single-column('screen and (max-width: 630px)') { font-size: 16px }\n }\n}\n\n.composer--warning {\n color: $inverted-text-color;\n margin-bottom: 15px;\n background: $ui-primary-color;\n box-shadow: 0 2px 6px rgba($base-shadow-color, 0.3);\n padding: 8px 10px;\n border-radius: 4px;\n font-size: 13px;\n font-weight: 400;\n\n a {\n color: $lighter-text-color;\n font-weight: 500;\n text-decoration: underline;\n\n &:active,\n &:focus,\n &:hover { text-decoration: none }\n }\n}\n\n.compose-form__sensitive-button {\n padding: 10px;\n padding-top: 0;\n\n font-size: 14px;\n font-weight: 500;\n\n &.active {\n color: $highlight-text-color;\n }\n\n input[type=checkbox] {\n display: none;\n }\n\n .checkbox {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-left: 5px;\n margin-right: 10px;\n top: -1px;\n border-radius: 4px;\n vertical-align: middle;\n\n &.active {\n border-color: $highlight-text-color;\n background: $highlight-text-color;\n }\n }\n}\n\n.composer--reply {\n margin: 0 0 10px;\n border-radius: 4px;\n padding: 10px;\n background: $ui-primary-color;\n min-height: 23px;\n overflow-y: auto;\n flex: 0 2 auto;\n\n & > header {\n margin-bottom: 5px;\n overflow: hidden;\n\n & > .account.small { color: $inverted-text-color; }\n\n & > .cancel {\n float: right;\n line-height: 24px;\n }\n }\n\n & > .content {\n position: relative;\n margin: 10px 0;\n padding: 0 12px;\n font-size: 14px;\n line-height: 20px;\n color: $inverted-text-color;\n word-wrap: break-word;\n font-weight: 400;\n overflow: visible;\n white-space: pre-wrap;\n padding-top: 5px;\n overflow: hidden;\n\n p, pre, blockquote {\n margin-bottom: 20px;\n white-space: pre-wrap;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n h1, h2, h3, h4, h5 {\n margin-top: 20px;\n margin-bottom: 20px;\n }\n\n h1, h2 {\n font-weight: 700;\n font-size: 18px;\n }\n\n h2 {\n font-size: 16px;\n }\n\n h3, h4, h5 {\n font-weight: 500;\n }\n\n blockquote {\n padding-left: 10px;\n border-left: 3px solid $inverted-text-color;\n color: $inverted-text-color;\n white-space: normal;\n\n p:last-child {\n margin-bottom: 0;\n }\n }\n\n b, strong {\n font-weight: 700;\n }\n\n em, i {\n font-style: italic;\n }\n\n sub {\n font-size: smaller;\n text-align: sub;\n }\n\n ul, ol {\n margin-left: 1em;\n\n p {\n margin: 0;\n }\n }\n\n ul {\n list-style-type: disc;\n }\n\n ol {\n list-style-type: decimal;\n }\n\n a {\n color: $lighter-text-color;\n text-decoration: none;\n\n &:hover { text-decoration: underline }\n\n &.mention {\n &:hover {\n text-decoration: none;\n\n span { text-decoration: underline }\n }\n }\n }\n }\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -5px 0 0;\n }\n}\n\n.emoji-picker-dropdown {\n position: absolute;\n right: 5px;\n top: 5px;\n\n ::-webkit-scrollbar-track:hover,\n ::-webkit-scrollbar-track:active {\n background-color: rgba($base-overlay-background, 0.3);\n }\n}\n\n.compose-form__autosuggest-wrapper,\n.autosuggest-input {\n position: relative;\n width: 100%;\n\n label {\n .autosuggest-textarea__textarea {\n display: block;\n box-sizing: border-box;\n margin: 0;\n border: none;\n border-radius: 4px 4px 0 0;\n padding: 10px 32px 0 10px;\n width: 100%;\n min-height: 100px;\n outline: 0;\n color: $inverted-text-color;\n background: $simple-background-color;\n font-size: 14px;\n font-family: inherit;\n resize: none;\n scrollbar-color: initial;\n\n &::placeholder {\n color: $dark-text-color;\n }\n\n &::-webkit-scrollbar {\n all: unset;\n }\n\n &:disabled { background: $ui-secondary-color }\n &:focus { outline: 0 }\n @include single-column('screen and (max-width: 630px)') { font-size: 16px }\n\n @include limited-single-column('screen and (max-width: 600px)') {\n height: 100px !important; // prevent auto-resize textarea\n resize: vertical;\n }\n }\n }\n}\n\n.composer--textarea--icons {\n display: block;\n position: absolute;\n top: 29px;\n right: 5px;\n bottom: 5px;\n overflow: hidden;\n\n & > .textarea_icon {\n display: block;\n margin: 2px 0 0 2px;\n width: 24px;\n height: 24px;\n color: $lighter-text-color;\n font-size: 18px;\n line-height: 24px;\n text-align: center;\n opacity: .8;\n }\n}\n\n.autosuggest-textarea__suggestions-wrapper {\n position: relative;\n height: 0;\n}\n\n.autosuggest-textarea__suggestions {\n display: block;\n position: absolute;\n box-sizing: border-box;\n top: 100%;\n border-radius: 0 0 4px 4px;\n padding: 6px;\n width: 100%;\n color: $inverted-text-color;\n background: $ui-secondary-color;\n box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4);\n font-size: 14px;\n z-index: 99;\n display: none;\n}\n\n.autosuggest-textarea__suggestions--visible {\n display: block;\n}\n\n.autosuggest-textarea__suggestions__item {\n padding: 10px;\n cursor: pointer;\n border-radius: 4px;\n\n &:hover,\n &:focus,\n &:active,\n &.selected { background: darken($ui-secondary-color, 10%) }\n\n > .account,\n > .emoji,\n > .autosuggest-hashtag {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: flex-start;\n line-height: 18px;\n font-size: 14px;\n }\n\n .autosuggest-hashtag {\n justify-content: space-between;\n\n &__name {\n flex: 1 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n strong {\n font-weight: 500;\n }\n\n &__uses {\n flex: 0 0 auto;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n }\n\n & > .account.small {\n .display-name {\n & > span { color: $lighter-text-color }\n }\n }\n}\n\n.composer--upload_form {\n overflow: hidden;\n\n & > .content {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n font-family: inherit;\n padding: 5px;\n overflow: hidden;\n }\n}\n\n.composer--upload_form--item {\n flex: 1 1 0;\n margin: 5px;\n min-width: 40%;\n\n & > div {\n position: relative;\n border-radius: 4px;\n height: 140px;\n width: 100%;\n background-color: $base-shadow-color;\n background-position: center;\n background-size: cover;\n background-repeat: no-repeat;\n overflow: hidden;\n\n textarea {\n display: block;\n position: absolute;\n box-sizing: border-box;\n bottom: 0;\n left: 0;\n margin: 0;\n border: 0;\n padding: 10px;\n width: 100%;\n color: $secondary-text-color;\n background: linear-gradient(0deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);\n font-size: 14px;\n font-family: inherit;\n font-weight: 500;\n opacity: 0;\n z-index: 2;\n transition: opacity .1s ease;\n\n &:focus { color: $white }\n\n &::placeholder {\n opacity: 0.54;\n color: $secondary-text-color;\n }\n }\n\n & > .close { mix-blend-mode: difference }\n }\n\n &.active {\n & > div {\n textarea { opacity: 1 }\n }\n }\n}\n\n.composer--upload_form--actions {\n background: linear-gradient(180deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n opacity: 0;\n transition: opacity .1s ease;\n\n .icon-button {\n flex: 0 1 auto;\n color: $ui-secondary-color;\n font-size: 14px;\n font-weight: 500;\n padding: 10px;\n font-family: inherit;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($ui-secondary-color, 4%);\n }\n }\n\n &.active {\n opacity: 1;\n }\n}\n\n.composer--upload_form--progress {\n display: flex;\n padding: 10px;\n color: $darker-text-color;\n overflow: hidden;\n\n & > .fa {\n font-size: 34px;\n margin-right: 10px;\n }\n\n & > .message {\n flex: 1 1 auto;\n\n & > span {\n display: block;\n font-size: 12px;\n font-weight: 500;\n text-transform: uppercase;\n }\n\n & > .backdrop {\n position: relative;\n margin-top: 5px;\n border-radius: 6px;\n width: 100%;\n height: 6px;\n background: $ui-base-lighter-color;\n\n & > .tracker {\n position: absolute;\n top: 0;\n left: 0;\n height: 6px;\n border-radius: 6px;\n background: $ui-highlight-color;\n }\n }\n }\n}\n\n.compose-form__modifiers {\n color: $inverted-text-color;\n font-family: inherit;\n font-size: 14px;\n background: $simple-background-color;\n}\n\n.composer--options-wrapper {\n padding: 10px;\n background: darken($simple-background-color, 8%);\n border-radius: 0 0 4px 4px;\n height: 27px;\n display: flex;\n justify-content: space-between;\n flex: 0 0 auto;\n}\n\n.composer--options {\n display: flex;\n flex: 0 0 auto;\n\n & > * {\n display: inline-block;\n box-sizing: content-box;\n padding: 0 3px;\n height: 27px;\n line-height: 27px;\n vertical-align: bottom;\n }\n\n & > hr {\n display: inline-block;\n margin: 0 3px;\n border-width: 0 0 0 1px;\n border-style: none none none solid;\n border-color: transparent transparent transparent darken($simple-background-color, 24%);\n padding: 0;\n width: 0;\n height: 27px;\n background: transparent;\n }\n}\n\n.compose--counter-wrapper {\n align-self: center;\n margin-right: 4px;\n}\n\n.composer--options--dropdown {\n &.open {\n & > .value {\n border-radius: 4px 4px 0 0;\n box-shadow: 0 -4px 4px rgba($base-shadow-color, 0.1);\n color: $primary-text-color;\n background: $ui-highlight-color;\n transition: none;\n }\n &.top {\n & > .value {\n border-radius: 0 0 4px 4px;\n box-shadow: 0 4px 4px rgba($base-shadow-color, 0.1);\n }\n }\n }\n}\n\n.composer--options--dropdown--content {\n position: absolute;\n border-radius: 4px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n background: $simple-background-color;\n overflow: hidden;\n transform-origin: 50% 0;\n}\n\n.composer--options--dropdown--content--item {\n display: flex;\n align-items: center;\n padding: 10px;\n color: $inverted-text-color;\n cursor: pointer;\n\n & > .content {\n flex: 1 1 auto;\n color: $lighter-text-color;\n\n &:not(:first-child) { margin-left: 10px }\n\n strong {\n display: block;\n color: $inverted-text-color;\n font-weight: 500;\n }\n }\n\n &:hover,\n &.active {\n background: $ui-highlight-color;\n color: $primary-text-color;\n\n & > .content {\n color: $primary-text-color;\n\n strong { color: $primary-text-color }\n }\n }\n\n &.active:hover { background: lighten($ui-highlight-color, 4%) }\n}\n\n.composer--publisher {\n padding-top: 10px;\n text-align: right;\n white-space: nowrap;\n overflow: hidden;\n justify-content: flex-end;\n flex: 0 0 auto;\n\n & > .primary {\n display: inline-block;\n margin: 0;\n padding: 0 10px;\n text-align: center;\n }\n\n & > .side_arm {\n display: inline-block;\n margin: 0 2px;\n padding: 0;\n width: 36px;\n text-align: center;\n }\n\n &.over {\n & > .count { color: $warning-red }\n }\n}\n",".column__wrapper {\n display: flex;\n flex: 1 1 auto;\n position: relative;\n}\n\n.columns-area {\n display: flex;\n flex: 1 1 auto;\n flex-direction: row;\n justify-content: flex-start;\n overflow-x: auto;\n position: relative;\n\n &__panels {\n display: flex;\n justify-content: center;\n width: 100%;\n height: 100%;\n min-height: 100vh;\n\n &__pane {\n height: 100%;\n overflow: hidden;\n pointer-events: none;\n display: flex;\n justify-content: flex-end;\n min-width: 285px;\n\n &--start {\n justify-content: flex-start;\n }\n\n &__inner {\n position: fixed;\n width: 285px;\n pointer-events: auto;\n height: 100%;\n }\n }\n\n &__main {\n box-sizing: border-box;\n width: 100%;\n max-width: 600px;\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding: 0 10px;\n }\n }\n }\n}\n\n.tabs-bar__wrapper {\n background: darken($ui-base-color, 8%);\n position: sticky;\n top: 0;\n z-index: 2;\n padding-top: 0;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding-top: 10px;\n }\n\n .tabs-bar {\n margin-bottom: 0;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n margin-bottom: 10px;\n }\n }\n}\n\n.react-swipeable-view-container {\n &,\n .columns-area,\n .column {\n height: 100%;\n }\n}\n\n.react-swipeable-view-container > * {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n}\n\n.column {\n width: 330px;\n position: relative;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n\n > .scrollable {\n background: $ui-base-color;\n }\n}\n\n.ui {\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n}\n\n.column {\n overflow: hidden;\n}\n\n.column-back-button {\n box-sizing: border-box;\n width: 100%;\n background: lighten($ui-base-color, 4%);\n color: $highlight-text-color;\n cursor: pointer;\n flex: 0 0 auto;\n font-size: 16px;\n border: 0;\n text-align: unset;\n padding: 15px;\n margin: 0;\n z-index: 3;\n\n &:hover {\n text-decoration: underline;\n }\n}\n\n.column-header__back-button {\n background: lighten($ui-base-color, 4%);\n border: 0;\n font-family: inherit;\n color: $highlight-text-color;\n cursor: pointer;\n flex: 0 0 auto;\n font-size: 16px;\n padding: 0 5px 0 0;\n z-index: 3;\n\n &:hover {\n text-decoration: underline;\n }\n\n &:last-child {\n padding: 0 15px 0 0;\n }\n}\n\n.column-back-button__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.column-back-button--slim {\n position: relative;\n}\n\n.column-back-button--slim-button {\n cursor: pointer;\n flex: 0 0 auto;\n font-size: 16px;\n padding: 15px;\n position: absolute;\n right: 0;\n top: -48px;\n}\n\n.column-link {\n background: lighten($ui-base-color, 8%);\n color: $primary-text-color;\n display: block;\n font-size: 16px;\n padding: 15px;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 11%);\n }\n\n &:focus {\n outline: 0;\n }\n\n &--transparent {\n background: transparent;\n color: $ui-secondary-color;\n\n &:hover,\n &:focus,\n &:active {\n background: transparent;\n color: $primary-text-color;\n }\n\n &.active {\n color: $ui-highlight-color;\n }\n }\n}\n\n.column-link__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.column-subheading {\n background: $ui-base-color;\n color: $dark-text-color;\n padding: 8px 20px;\n font-size: 12px;\n font-weight: 500;\n text-transform: uppercase;\n cursor: default;\n}\n\n.column-header__wrapper {\n position: relative;\n flex: 0 0 auto;\n\n &.active {\n &::before {\n display: block;\n content: \"\";\n position: absolute;\n top: 35px;\n left: 0;\n right: 0;\n margin: 0 auto;\n width: 60%;\n pointer-events: none;\n height: 28px;\n z-index: 1;\n background: radial-gradient(ellipse, rgba($ui-highlight-color, 0.23) 0%, rgba($ui-highlight-color, 0) 60%);\n }\n }\n}\n\n.column-header {\n display: flex;\n font-size: 16px;\n background: lighten($ui-base-color, 4%);\n flex: 0 0 auto;\n cursor: pointer;\n position: relative;\n z-index: 2;\n outline: 0;\n overflow: hidden;\n\n & > button {\n margin: 0;\n border: none;\n padding: 15px;\n color: inherit;\n background: transparent;\n font: inherit;\n text-align: left;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n flex: 1;\n }\n\n & > .column-header__back-button {\n color: $highlight-text-color;\n }\n\n &.active {\n box-shadow: 0 1px 0 rgba($ui-highlight-color, 0.3);\n\n .column-header__icon {\n color: $highlight-text-color;\n text-shadow: 0 0 10px rgba($ui-highlight-color, 0.4);\n }\n }\n\n &:focus,\n &:active {\n outline: 0;\n }\n}\n\n.column {\n width: 330px;\n position: relative;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n\n .wide .columns-area:not(.columns-area--mobile) & {\n flex: auto;\n min-width: 330px;\n max-width: 400px;\n }\n\n > .scrollable {\n background: $ui-base-color;\n }\n}\n\n.column-header__buttons {\n height: 48px;\n display: flex;\n margin-left: 0;\n}\n\n.column-header__links {\n margin-bottom: 14px;\n}\n\n.column-header__links .text-btn {\n margin-right: 10px;\n}\n\n.column-header__button {\n background: lighten($ui-base-color, 4%);\n border: 0;\n color: $darker-text-color;\n cursor: pointer;\n font-size: 16px;\n padding: 0 15px;\n\n &:hover {\n color: lighten($darker-text-color, 7%);\n }\n\n &.active {\n color: $primary-text-color;\n background: lighten($ui-base-color, 8%);\n\n &:hover {\n color: $primary-text-color;\n background: lighten($ui-base-color, 8%);\n }\n }\n\n // glitch - added focus ring for keyboard navigation\n &:focus {\n text-shadow: 0 0 4px darken($ui-highlight-color, 5%);\n }\n}\n\n.column-header__notif-cleaning-buttons {\n display: flex;\n align-items: stretch;\n justify-content: space-around;\n\n button {\n @extend .column-header__button;\n background: transparent;\n text-align: center;\n padding: 10px 0;\n white-space: pre-wrap;\n }\n\n b {\n font-weight: bold;\n }\n}\n\n// The notifs drawer with no padding to have more space for the buttons\n.column-header__collapsible-inner.nopad-drawer {\n padding: 0;\n}\n\n.column-header__collapsible {\n max-height: 70vh;\n overflow: hidden;\n overflow-y: auto;\n color: $darker-text-color;\n transition: max-height 150ms ease-in-out, opacity 300ms linear;\n opacity: 1;\n\n &.collapsed {\n max-height: 0;\n opacity: 0.5;\n }\n\n &.animating {\n overflow-y: hidden;\n }\n\n hr {\n height: 0;\n background: transparent;\n border: 0;\n border-top: 1px solid lighten($ui-base-color, 12%);\n margin: 10px 0;\n }\n\n // notif cleaning drawer\n &.ncd {\n transition: none;\n &.collapsed {\n max-height: 0;\n opacity: 0.7;\n }\n }\n}\n\n.column-header__collapsible-inner {\n background: lighten($ui-base-color, 8%);\n padding: 15px;\n}\n\n.column-header__setting-btn {\n &:hover {\n color: $darker-text-color;\n text-decoration: underline;\n }\n}\n\n.column-header__setting-arrows {\n float: right;\n\n .column-header__setting-btn {\n padding: 0 10px;\n\n &:last-child {\n padding-right: 0;\n }\n }\n}\n\n.column-header__title {\n display: inline-block;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n flex: 1;\n}\n\n.column-header__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.empty-column-indicator,\n.error-column {\n color: $dark-text-color;\n background: $ui-base-color;\n text-align: center;\n padding: 20px;\n font-size: 15px;\n font-weight: 400;\n cursor: default;\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n justify-content: center;\n @supports(display: grid) { // hack to fix Chrome <57\n contain: strict;\n }\n\n & > span {\n max-width: 400px;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.error-column {\n flex-direction: column;\n}\n\n// more fixes for the navbar-under mode\n@mixin fix-margins-for-navbar-under {\n .tabs-bar {\n margin-top: 0 !important;\n margin-bottom: -6px !important;\n }\n}\n\n.single-column.navbar-under {\n @include fix-margins-for-navbar-under;\n}\n\n.auto-columns.navbar-under {\n @media screen and (max-width: $no-gap-breakpoint) {\n @include fix-margins-for-navbar-under;\n }\n}\n\n.auto-columns.navbar-under .react-swipeable-view-container .columns-area,\n.single-column.navbar-under .react-swipeable-view-container .columns-area {\n @media screen and (max-width: $no-gap-breakpoint) {\n height: 100% !important;\n }\n}\n\n.column-inline-form {\n padding: 7px 15px;\n padding-right: 5px;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n\n label {\n flex: 1 1 auto;\n\n input {\n width: 100%;\n margin-bottom: 6px;\n\n &:focus {\n outline: 0;\n }\n }\n }\n\n .icon-button {\n flex: 0 0 auto;\n margin: 0 5px;\n }\n}\n",".regeneration-indicator {\n text-align: center;\n font-size: 16px;\n font-weight: 500;\n color: $dark-text-color;\n background: $ui-base-color;\n cursor: default;\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 20px;\n\n &__figure {\n &,\n img {\n display: block;\n width: auto;\n height: 160px;\n margin: 0;\n }\n }\n\n &--without-header {\n padding-top: 20px + 48px;\n }\n\n &__label {\n margin-top: 30px;\n\n strong {\n display: block;\n margin-bottom: 10px;\n color: $dark-text-color;\n }\n\n span {\n font-size: 15px;\n font-weight: 400;\n }\n }\n}\n",".directory {\n &__list {\n width: 100%;\n margin: 10px 0;\n transition: opacity 100ms ease-in;\n\n &.loading {\n opacity: 0.7;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin: 0;\n }\n }\n\n &__card {\n box-sizing: border-box;\n margin-bottom: 10px;\n\n &__img {\n height: 125px;\n position: relative;\n background: darken($ui-base-color, 12%);\n overflow: hidden;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n object-fit: cover;\n }\n }\n\n &__bar {\n display: flex;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n padding: 10px;\n\n &__name {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n text-decoration: none;\n overflow: hidden;\n }\n\n &__relationship {\n width: 23px;\n min-height: 1px;\n flex: 0 0 auto;\n }\n\n .avatar {\n flex: 0 0 auto;\n width: 48px;\n height: 48px;\n padding-top: 2px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n background: darken($ui-base-color, 8%);\n object-fit: cover;\n }\n }\n\n .display-name {\n margin-left: 15px;\n text-align: left;\n\n strong {\n font-size: 15px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n span {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n &__extra {\n background: $ui-base-color;\n display: flex;\n align-items: center;\n justify-content: center;\n\n .accounts-table__count {\n width: 33.33%;\n flex: 0 0 auto;\n padding: 15px 0;\n }\n\n .account__header__content {\n box-sizing: border-box;\n padding: 15px 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n width: 100%;\n min-height: 18px + 30px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n p {\n display: none;\n\n &:first-child {\n display: inline;\n }\n }\n\n br {\n display: none;\n }\n }\n }\n }\n}\n\n.filter-form {\n background: $ui-base-color;\n\n &__column {\n padding: 10px 15px;\n }\n\n .radio-button {\n display: block;\n }\n}\n\n.radio-button {\n font-size: 14px;\n position: relative;\n display: inline-block;\n padding: 6px 0;\n line-height: 18px;\n cursor: default;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n cursor: pointer;\n\n input[type=radio],\n input[type=checkbox] {\n display: none;\n }\n\n &__input {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 50%;\n vertical-align: middle;\n\n &.checked {\n border-color: lighten($ui-highlight-color, 8%);\n background: lighten($ui-highlight-color, 8%);\n }\n }\n}\n",".search {\n position: relative;\n}\n\n.search__input {\n @include search-input();\n\n display: block;\n padding: 15px;\n padding-right: 30px;\n line-height: 18px;\n font-size: 16px;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n}\n\n.search__icon {\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus {\n outline: 0 !important;\n }\n\n .fa {\n position: absolute;\n top: 16px;\n right: 10px;\n z-index: 2;\n display: inline-block;\n opacity: 0;\n transition: all 100ms linear;\n transition-property: color, transform, opacity;\n font-size: 18px;\n width: 18px;\n height: 18px;\n color: $secondary-text-color;\n cursor: default;\n pointer-events: none;\n\n &.active {\n pointer-events: auto;\n opacity: 0.3;\n }\n }\n\n .fa-search {\n transform: rotate(0deg);\n\n &.active {\n pointer-events: auto;\n opacity: 0.3;\n }\n }\n\n .fa-times-circle {\n top: 17px;\n transform: rotate(0deg);\n color: $action-button-color;\n cursor: pointer;\n\n &.active {\n transform: rotate(90deg);\n }\n\n &:hover {\n color: lighten($action-button-color, 7%);\n }\n }\n}\n\n.search-results__header {\n color: $dark-text-color;\n background: lighten($ui-base-color, 2%);\n border-bottom: 1px solid darken($ui-base-color, 4%);\n padding: 15px 10px;\n font-size: 14px;\n font-weight: 500;\n}\n\n.search-results__info {\n padding: 20px;\n color: $darker-text-color;\n text-align: center;\n}\n\n.trends {\n &__header {\n color: $dark-text-color;\n background: lighten($ui-base-color, 2%);\n border-bottom: 1px solid darken($ui-base-color, 4%);\n font-weight: 500;\n padding: 15px;\n font-size: 16px;\n cursor: default;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n &__item {\n display: flex;\n align-items: center;\n padding: 15px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &:last-child {\n border-bottom: 0;\n }\n\n &__name {\n flex: 1 1 auto;\n color: $dark-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n strong {\n font-weight: 500;\n }\n\n a {\n color: $darker-text-color;\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:hover,\n &:focus,\n &:active {\n span {\n text-decoration: underline;\n }\n }\n }\n }\n\n &__current {\n flex: 0 0 auto;\n font-size: 24px;\n line-height: 36px;\n font-weight: 500;\n text-align: right;\n padding-right: 15px;\n margin-left: 5px;\n color: $secondary-text-color;\n }\n\n &__sparkline {\n flex: 0 0 auto;\n width: 50px;\n\n path:first-child {\n fill: rgba($highlight-text-color, 0.25) !important;\n fill-opacity: 1 !important;\n }\n\n path:last-child {\n stroke: lighten($highlight-text-color, 6%) !important;\n }\n }\n }\n}\n",null,".emojione {\n font-size: inherit;\n vertical-align: middle;\n object-fit: contain;\n margin: -.2ex .15em .2ex;\n width: 16px;\n height: 16px;\n\n img {\n width: auto;\n }\n}\n\n.emoji-picker-dropdown__menu {\n background: $simple-background-color;\n position: absolute;\n box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n margin-top: 5px;\n z-index: 2;\n\n .emoji-mart-scroll {\n transition: opacity 200ms ease;\n }\n\n &.selecting .emoji-mart-scroll {\n opacity: 0.5;\n }\n}\n\n.emoji-picker-dropdown__modifiers {\n position: absolute;\n top: 60px;\n right: 11px;\n cursor: pointer;\n}\n\n.emoji-picker-dropdown__modifiers__menu {\n position: absolute;\n z-index: 4;\n top: -4px;\n left: -8px;\n background: $simple-background-color;\n border-radius: 4px;\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n overflow: hidden;\n\n button {\n display: block;\n cursor: pointer;\n border: 0;\n padding: 4px 8px;\n background: transparent;\n\n &:hover,\n &:focus,\n &:active {\n background: rgba($ui-secondary-color, 0.4);\n }\n }\n\n .emoji-mart-emoji {\n height: 22px;\n }\n}\n\n.emoji-mart-emoji {\n span {\n background-repeat: no-repeat;\n }\n}\n\n.emoji-button {\n display: block;\n font-size: 24px;\n line-height: 24px;\n margin-left: 2px;\n width: 24px;\n outline: 0;\n cursor: pointer;\n\n &:active,\n &:focus {\n outline: 0 !important;\n }\n\n img {\n filter: grayscale(100%);\n opacity: 0.8;\n display: block;\n margin: 0;\n width: 22px;\n height: 22px;\n margin-top: 2px;\n }\n\n &:hover,\n &:active,\n &:focus {\n img {\n opacity: 1;\n filter: none;\n }\n }\n}\n","$doodleBg: #d9e1e8;\n.doodle-modal {\n @extend .boost-modal;\n width: unset;\n}\n\n.doodle-modal__container {\n background: $doodleBg;\n text-align: center;\n line-height: 0; // remove weird gap under canvas\n canvas {\n border: 5px solid $doodleBg;\n }\n}\n\n.doodle-modal__action-bar {\n @extend .boost-modal__action-bar;\n\n .filler {\n flex-grow: 1;\n margin: 0;\n padding: 0;\n }\n\n .doodle-toolbar {\n line-height: 1;\n\n display: flex;\n flex-direction: column;\n flex-grow: 0;\n justify-content: space-around;\n\n &.with-inputs {\n label {\n display: inline-block;\n width: 70px;\n text-align: right;\n margin-right: 2px;\n }\n\n input[type=\"number\"],input[type=\"text\"] {\n width: 40px;\n }\n span.val {\n display: inline-block;\n text-align: left;\n width: 50px;\n }\n }\n }\n\n .doodle-palette {\n padding-right: 0 !important;\n border: 1px solid black;\n line-height: .2rem;\n flex-grow: 0;\n background: white;\n\n button {\n appearance: none;\n width: 1rem;\n height: 1rem;\n margin: 0; padding: 0;\n text-align: center;\n color: black;\n text-shadow: 0 0 1px white;\n cursor: pointer;\n box-shadow: inset 0 0 1px rgba(white, .5);\n border: 1px solid black;\n outline-offset:-1px;\n\n &.foreground {\n outline: 1px dashed white;\n }\n\n &.background {\n outline: 1px dashed red;\n }\n\n &.foreground.background {\n outline: 1px dashed red;\n border-color: white;\n }\n }\n }\n}\n",".drawer {\n width: 300px;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n overflow-y: hidden;\n padding: 10px 5px;\n flex: none;\n\n &:first-child {\n padding-left: 10px;\n }\n\n &:last-child {\n padding-right: 10px;\n }\n\n @include single-column('screen and (max-width: 630px)') { flex: auto }\n\n @include limited-single-column('screen and (max-width: 630px)') {\n &, &:first-child, &:last-child { padding: 0 }\n }\n\n .wide & {\n min-width: 300px;\n max-width: 400px;\n flex: 1 1 200px;\n }\n\n @include single-column('screen and (max-width: 630px)') {\n :root & { // Overrides `.wide` for single-column view\n flex: auto;\n width: 100%;\n min-width: 0;\n max-width: none;\n padding: 0;\n }\n }\n\n .react-swipeable-view-container & { height: 100% }\n}\n\n.drawer--header {\n display: flex;\n flex-direction: row;\n margin-bottom: 10px;\n flex: none;\n background: lighten($ui-base-color, 8%);\n font-size: 16px;\n\n & > * {\n display: block;\n box-sizing: border-box;\n border-bottom: 2px solid transparent;\n padding: 15px 5px 13px;\n height: 48px;\n flex: 1 1 auto;\n color: $darker-text-color;\n text-align: center;\n text-decoration: none;\n cursor: pointer;\n }\n\n a {\n transition: background 100ms ease-in;\n\n &:focus,\n &:hover {\n outline: none;\n background: lighten($ui-base-color, 3%);\n transition: background 200ms ease-out;\n }\n }\n}\n\n.search {\n position: relative;\n margin-bottom: 10px;\n flex: none;\n\n @include limited-single-column('screen and (max-width: #{$no-gap-breakpoint})') { margin-bottom: 0 }\n @include single-column('screen and (max-width: 630px)') { font-size: 16px }\n}\n\n.search-popout {\n @include search-popout();\n}\n\n.drawer--account {\n padding: 10px;\n color: $darker-text-color;\n display: flex;\n align-items: center;\n\n a {\n color: inherit;\n text-decoration: none;\n }\n\n .acct {\n display: block;\n color: $secondary-text-color;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.navigation-bar__profile {\n flex: 1 1 auto;\n margin-left: 8px;\n overflow: hidden;\n}\n\n.drawer--results {\n background: $ui-base-color;\n overflow-x: hidden;\n overflow-y: auto;\n\n & > header {\n color: $dark-text-color;\n background: lighten($ui-base-color, 2%);\n padding: 15px;\n font-weight: 500;\n font-size: 16px;\n cursor: default;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n & > section {\n margin-bottom: 5px;\n\n h5 {\n background: darken($ui-base-color, 4%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n display: flex;\n padding: 15px;\n font-weight: 500;\n font-size: 16px;\n color: $dark-text-color;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n .account:last-child,\n & > div:last-child .status {\n border-bottom: 0;\n }\n\n & > .hashtag {\n display: block;\n padding: 10px;\n color: $secondary-text-color;\n text-decoration: none;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($secondary-text-color, 4%);\n text-decoration: underline;\n }\n }\n }\n}\n\n.drawer__pager {\n box-sizing: border-box;\n padding: 0;\n flex-grow: 1;\n position: relative;\n overflow: hidden;\n display: flex;\n}\n\n.drawer__inner {\n position: absolute;\n top: 0;\n left: 0;\n background: lighten($ui-base-color, 13%);\n box-sizing: border-box;\n padding: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n overflow-y: auto;\n width: 100%;\n height: 100%;\n\n &.darker {\n background: $ui-base-color;\n }\n}\n\n.drawer__inner__mastodon {\n background: lighten($ui-base-color, 13%) url('data:image/svg+xml;utf8,') no-repeat bottom / 100% auto;\n flex: 1;\n min-height: 47px;\n display: none;\n\n > img {\n display: block;\n object-fit: contain;\n object-position: bottom left;\n width: 100%;\n height: 100%;\n pointer-events: none;\n user-drag: none;\n user-select: none;\n }\n\n > .mastodon {\n display: block;\n width: 100%;\n height: 100%;\n border: none;\n cursor: inherit;\n }\n\n @media screen and (min-height: 640px) {\n display: block;\n }\n}\n\n.pseudo-drawer {\n background: lighten($ui-base-color, 13%);\n font-size: 13px;\n text-align: left;\n}\n\n.drawer__backdrop {\n cursor: pointer;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba($base-overlay-background, 0.5);\n}\n",".video-error-cover {\n align-items: center;\n background: $base-overlay-background;\n color: $primary-text-color;\n cursor: pointer;\n display: flex;\n flex-direction: column;\n height: 100%;\n justify-content: center;\n margin-top: 8px;\n position: relative;\n text-align: center;\n z-index: 100;\n}\n\n.media-spoiler {\n background: $base-overlay-background;\n color: $darker-text-color;\n border: 0;\n width: 100%;\n height: 100%;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($darker-text-color, 8%);\n }\n\n .status__content > & {\n margin-top: 15px; // Add margin when used bare for NSFW video player\n }\n @include fullwidth-gallery;\n}\n\n.media-spoiler__warning {\n display: block;\n font-size: 14px;\n}\n\n.media-spoiler__trigger {\n display: block;\n font-size: 11px;\n font-weight: 500;\n}\n\n.media-gallery__gifv__label {\n display: block;\n position: absolute;\n color: $primary-text-color;\n background: rgba($base-overlay-background, 0.5);\n bottom: 6px;\n left: 6px;\n padding: 2px 6px;\n border-radius: 2px;\n font-size: 11px;\n font-weight: 600;\n z-index: 1;\n pointer-events: none;\n opacity: 0.9;\n transition: opacity 0.1s ease;\n line-height: 18px;\n}\n\n.media-gallery__gifv {\n &.autoplay {\n .media-gallery__gifv__label {\n display: none;\n }\n }\n\n &:hover {\n .media-gallery__gifv__label {\n opacity: 1;\n }\n }\n}\n\n.media-gallery__audio {\n height: 100%;\n display: flex;\n flex-direction: column;\n\n span {\n text-align: center;\n color: $darker-text-color;\n display: flex;\n height: 100%;\n align-items: center;\n\n p {\n width: 100%;\n }\n }\n\n audio {\n width: 100%;\n }\n}\n\n.media-gallery {\n box-sizing: border-box;\n margin-top: 8px;\n overflow: hidden;\n border-radius: 4px;\n position: relative;\n width: 100%;\n height: 110px;\n\n @include fullwidth-gallery;\n}\n\n.media-gallery__item {\n border: none;\n box-sizing: border-box;\n display: block;\n float: left;\n position: relative;\n border-radius: 4px;\n overflow: hidden;\n\n .full-width & {\n border-radius: 0;\n }\n\n &.standalone {\n .media-gallery__item-gifv-thumbnail {\n transform: none;\n top: 0;\n }\n }\n\n &.letterbox {\n background: $base-shadow-color;\n }\n}\n\n.media-gallery__item-thumbnail {\n cursor: zoom-in;\n display: block;\n text-decoration: none;\n color: $secondary-text-color;\n position: relative;\n z-index: 1;\n\n &,\n img {\n height: 100%;\n width: 100%;\n object-fit: contain;\n\n &:not(.letterbox) {\n height: 100%;\n object-fit: cover;\n }\n }\n}\n\n.media-gallery__preview {\n width: 100%;\n height: 100%;\n object-fit: cover;\n position: absolute;\n top: 0;\n left: 0;\n z-index: 0;\n background: $base-overlay-background;\n\n &--hidden {\n display: none;\n }\n}\n\n.media-gallery__gifv {\n height: 100%;\n overflow: hidden;\n position: relative;\n width: 100%;\n display: flex;\n justify-content: center;\n}\n\n.media-gallery__item-gifv-thumbnail {\n cursor: zoom-in;\n height: 100%;\n width: 100%;\n position: relative;\n z-index: 1;\n object-fit: contain;\n user-select: none;\n\n &:not(.letterbox) {\n height: 100%;\n object-fit: cover;\n }\n}\n\n.media-gallery__item-thumbnail-label {\n clip: rect(1px 1px 1px 1px); /* IE6, IE7 */\n clip: rect(1px, 1px, 1px, 1px);\n overflow: hidden;\n position: absolute;\n}\n\n.video-modal__container {\n max-width: 100vw;\n max-height: 100vh;\n}\n\n.audio-modal__container {\n width: 50vw;\n}\n\n.media-modal {\n width: 100%;\n height: 100%;\n position: relative;\n\n .extended-video-player {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n video {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n }\n }\n}\n\n.media-modal__closer {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n}\n\n.media-modal__navigation {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n transition: opacity 0.3s linear;\n will-change: opacity;\n\n * {\n pointer-events: auto;\n }\n\n &.media-modal__navigation--hidden {\n opacity: 0;\n\n * {\n pointer-events: none;\n }\n }\n}\n\n.media-modal__nav {\n background: rgba($base-overlay-background, 0.5);\n box-sizing: border-box;\n border: 0;\n color: $primary-text-color;\n cursor: pointer;\n display: flex;\n align-items: center;\n font-size: 24px;\n height: 20vmax;\n margin: auto 0;\n padding: 30px 15px;\n position: absolute;\n top: 0;\n bottom: 0;\n}\n\n.media-modal__nav--left {\n left: 0;\n}\n\n.media-modal__nav--right {\n right: 0;\n}\n\n.media-modal__pagination {\n width: 100%;\n text-align: center;\n position: absolute;\n left: 0;\n bottom: 20px;\n pointer-events: none;\n}\n\n.media-modal__meta {\n text-align: center;\n position: absolute;\n left: 0;\n bottom: 20px;\n width: 100%;\n pointer-events: none;\n\n &--shifted {\n bottom: 62px;\n }\n\n a {\n pointer-events: auto;\n text-decoration: none;\n font-weight: 500;\n color: $ui-secondary-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.media-modal__page-dot {\n display: inline-block;\n}\n\n.media-modal__button {\n background-color: $white;\n height: 12px;\n width: 12px;\n border-radius: 6px;\n margin: 10px;\n padding: 0;\n border: 0;\n font-size: 0;\n}\n\n.media-modal__button--active {\n background-color: $ui-highlight-color;\n}\n\n.media-modal__close {\n position: absolute;\n right: 8px;\n top: 8px;\n z-index: 100;\n}\n\n.detailed,\n.fullscreen {\n .video-player__volume__current,\n .video-player__volume::before {\n bottom: 27px;\n }\n\n .video-player__volume__handle {\n bottom: 23px;\n }\n\n}\n\n.audio-player {\n box-sizing: border-box;\n position: relative;\n background: darken($ui-base-color, 8%);\n border-radius: 4px;\n padding-bottom: 44px;\n direction: ltr;\n\n &.editable {\n border-radius: 0;\n height: 100%;\n }\n\n &__waveform {\n padding: 15px 0;\n position: relative;\n overflow: hidden;\n\n &::before {\n content: \"\";\n display: block;\n position: absolute;\n border-top: 1px solid lighten($ui-base-color, 4%);\n width: 100%;\n height: 0;\n left: 0;\n top: calc(50% + 1px);\n }\n }\n\n &__progress-placeholder {\n background-color: rgba(lighten($ui-highlight-color, 8%), 0.5);\n }\n\n &__wave-placeholder {\n background-color: lighten($ui-base-color, 16%);\n }\n\n .video-player__controls {\n padding: 0 15px;\n padding-top: 10px;\n background: darken($ui-base-color, 8%);\n border-top: 1px solid lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n }\n}\n\n.video-player {\n overflow: hidden;\n position: relative;\n background: $base-shadow-color;\n max-width: 100%;\n border-radius: 4px;\n box-sizing: border-box;\n direction: ltr;\n\n &.editable {\n border-radius: 0;\n height: 100% !important;\n }\n\n &:focus {\n outline: 0;\n }\n\n .detailed-status & {\n width: 100%;\n height: 100%;\n }\n\n @include fullwidth-gallery;\n\n video {\n max-width: 100vw;\n max-height: 80vh;\n z-index: 1;\n position: relative;\n }\n\n &.fullscreen {\n width: 100% !important;\n height: 100% !important;\n margin: 0;\n\n video {\n max-width: 100% !important;\n max-height: 100% !important;\n width: 100% !important;\n height: 100% !important;\n outline: 0;\n }\n }\n\n &.inline {\n video {\n object-fit: contain;\n position: relative;\n top: 50%;\n transform: translateY(-50%);\n }\n }\n\n &__controls {\n position: absolute;\n z-index: 2;\n bottom: 0;\n left: 0;\n right: 0;\n box-sizing: border-box;\n background: linear-gradient(0deg, rgba($base-shadow-color, 0.85) 0, rgba($base-shadow-color, 0.45) 60%, transparent);\n padding: 0 15px;\n opacity: 0;\n transition: opacity .1s ease;\n\n &.active {\n opacity: 1;\n }\n }\n\n &.inactive {\n video,\n .video-player__controls {\n visibility: hidden;\n }\n }\n\n &__spoiler {\n display: none;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 4;\n border: 0;\n background: $base-shadow-color;\n color: $darker-text-color;\n transition: none;\n pointer-events: none;\n\n &.active {\n display: block;\n pointer-events: auto;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($darker-text-color, 7%);\n }\n }\n\n &__title {\n display: block;\n font-size: 14px;\n }\n\n &__subtitle {\n display: block;\n font-size: 11px;\n font-weight: 500;\n }\n }\n\n &__buttons-bar {\n display: flex;\n justify-content: space-between;\n padding-bottom: 10px;\n\n .video-player__download__icon {\n color: inherit;\n\n .fa,\n &:active .fa,\n &:hover .fa,\n &:focus .fa {\n color: inherit;\n }\n }\n }\n\n &__buttons {\n font-size: 16px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &.left {\n button {\n padding-left: 0;\n }\n }\n\n &.right {\n button {\n padding-right: 0;\n }\n }\n\n button {\n background: transparent;\n padding: 2px 10px;\n font-size: 16px;\n border: 0;\n color: rgba($white, 0.75);\n\n &:active,\n &:hover,\n &:focus {\n color: $white;\n }\n }\n }\n\n &__time-sep,\n &__time-total,\n &__time-current {\n font-size: 14px;\n font-weight: 500;\n }\n\n &__time-current {\n color: $white;\n margin-left: 60px;\n }\n\n &__time-sep {\n display: inline-block;\n margin: 0 6px;\n }\n\n &__time-sep,\n &__time-total {\n color: $white;\n }\n\n &__volume {\n cursor: pointer;\n height: 24px;\n display: inline;\n\n &::before {\n content: \"\";\n width: 50px;\n background: rgba($white, 0.35);\n border-radius: 4px;\n display: block;\n position: absolute;\n height: 4px;\n left: 70px;\n bottom: 20px;\n }\n\n &__current {\n display: block;\n position: absolute;\n height: 4px;\n border-radius: 4px;\n left: 70px;\n bottom: 20px;\n background: lighten($ui-highlight-color, 8%);\n }\n\n &__handle {\n position: absolute;\n z-index: 3;\n border-radius: 50%;\n width: 12px;\n height: 12px;\n bottom: 16px;\n left: 70px;\n transition: opacity .1s ease;\n background: lighten($ui-highlight-color, 8%);\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n pointer-events: none;\n }\n }\n\n &__link {\n padding: 2px 10px;\n\n a {\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n color: $white;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n }\n\n &__seek {\n cursor: pointer;\n height: 24px;\n position: relative;\n\n &::before {\n content: \"\";\n width: 100%;\n background: rgba($white, 0.35);\n border-radius: 4px;\n display: block;\n position: absolute;\n height: 4px;\n top: 10px;\n }\n\n &__progress,\n &__buffer {\n display: block;\n position: absolute;\n height: 4px;\n border-radius: 4px;\n top: 10px;\n background: lighten($ui-highlight-color, 8%);\n }\n\n &__buffer {\n background: rgba($white, 0.2);\n }\n\n &__handle {\n position: absolute;\n z-index: 3;\n opacity: 0;\n border-radius: 50%;\n width: 12px;\n height: 12px;\n top: 6px;\n margin-left: -6px;\n transition: opacity .1s ease;\n background: lighten($ui-highlight-color, 8%);\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n pointer-events: none;\n\n &.active {\n opacity: 1;\n }\n }\n\n &:hover {\n .video-player__seek__handle {\n opacity: 1;\n }\n }\n }\n\n &.detailed,\n &.fullscreen {\n .video-player__buttons {\n button {\n padding-top: 10px;\n padding-bottom: 10px;\n }\n }\n }\n}\n",".sensitive-info {\n display: flex;\n flex-direction: row;\n align-items: center;\n position: absolute;\n top: 4px;\n left: 4px;\n z-index: 100;\n}\n\n.sensitive-marker {\n margin: 0 3px;\n border-radius: 2px;\n padding: 2px 6px;\n color: rgba($primary-text-color, 0.8);\n background: rgba($base-overlay-background, 0.5);\n font-size: 12px;\n line-height: 18px;\n text-transform: uppercase;\n opacity: .9;\n transition: opacity .1s ease;\n\n .media-gallery:hover & { opacity: 1 }\n}\n",".list-editor {\n background: $ui-base-color;\n flex-direction: column;\n border-radius: 8px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n width: 380px;\n overflow: hidden;\n\n @media screen and (max-width: 420px) {\n width: 90%;\n }\n\n h4 {\n padding: 15px 0;\n background: lighten($ui-base-color, 13%);\n font-weight: 500;\n font-size: 16px;\n text-align: center;\n border-radius: 8px 8px 0 0;\n }\n\n .drawer__pager {\n height: 50vh;\n }\n\n .drawer__inner {\n border-radius: 0 0 8px 8px;\n\n &.backdrop {\n width: calc(100% - 60px);\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n border-radius: 0 0 0 8px;\n }\n }\n\n &__accounts {\n overflow-y: auto;\n }\n\n .account__display-name {\n &:hover strong {\n text-decoration: none;\n }\n }\n\n .account__avatar {\n cursor: default;\n }\n\n .search {\n margin-bottom: 0;\n }\n}\n\n.list-adder {\n background: $ui-base-color;\n flex-direction: column;\n border-radius: 8px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n width: 380px;\n overflow: hidden;\n\n @media screen and (max-width: 420px) {\n width: 90%;\n }\n\n &__account {\n background: lighten($ui-base-color, 13%);\n }\n\n &__lists {\n background: lighten($ui-base-color, 13%);\n height: 50vh;\n border-radius: 0 0 8px 8px;\n overflow-y: auto;\n }\n\n .list {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n .list__wrapper {\n display: flex;\n }\n\n .list__display-name {\n flex: 1 1 auto;\n overflow: hidden;\n text-decoration: none;\n font-size: 16px;\n padding: 10px;\n }\n}\n",".emoji-mart {\n &,\n * {\n box-sizing: border-box;\n line-height: 1.15;\n }\n\n font-size: 13px;\n display: inline-block;\n color: $inverted-text-color;\n\n .emoji-mart-emoji {\n padding: 6px;\n }\n}\n\n.emoji-mart-bar {\n border: 0 solid darken($ui-secondary-color, 8%);\n\n &:first-child {\n border-bottom-width: 1px;\n border-top-left-radius: 5px;\n border-top-right-radius: 5px;\n background: $ui-secondary-color;\n }\n\n &:last-child {\n border-top-width: 1px;\n border-bottom-left-radius: 5px;\n border-bottom-right-radius: 5px;\n display: none;\n }\n}\n\n.emoji-mart-anchors {\n display: flex;\n justify-content: space-between;\n padding: 0 6px;\n color: $lighter-text-color;\n line-height: 0;\n}\n\n.emoji-mart-anchor {\n position: relative;\n flex: 1;\n text-align: center;\n padding: 12px 4px;\n overflow: hidden;\n transition: color .1s ease-out;\n cursor: pointer;\n\n &:hover {\n color: darken($lighter-text-color, 4%);\n }\n}\n\n.emoji-mart-anchor-selected {\n color: $highlight-text-color;\n\n &:hover {\n color: darken($highlight-text-color, 4%);\n }\n\n .emoji-mart-anchor-bar {\n bottom: 0;\n }\n}\n\n.emoji-mart-anchor-bar {\n position: absolute;\n bottom: -3px;\n left: 0;\n width: 100%;\n height: 3px;\n background-color: darken($ui-highlight-color, 3%);\n}\n\n.emoji-mart-anchors {\n i {\n display: inline-block;\n width: 100%;\n max-width: 22px;\n }\n\n svg {\n fill: currentColor;\n max-height: 18px;\n }\n}\n\n.emoji-mart-scroll {\n overflow-y: scroll;\n height: 270px;\n max-height: 35vh;\n padding: 0 6px 6px;\n background: $simple-background-color;\n will-change: transform;\n\n &::-webkit-scrollbar-track:hover,\n &::-webkit-scrollbar-track:active {\n background-color: rgba($base-overlay-background, 0.3);\n }\n}\n\n.emoji-mart-search {\n padding: 10px;\n padding-right: 45px;\n background: $simple-background-color;\n\n input {\n font-size: 14px;\n font-weight: 400;\n padding: 7px 9px;\n font-family: inherit;\n display: block;\n width: 100%;\n background: rgba($ui-secondary-color, 0.3);\n color: $inverted-text-color;\n border: 1px solid $ui-secondary-color;\n border-radius: 4px;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n}\n\n.emoji-mart-category .emoji-mart-emoji {\n cursor: pointer;\n\n span {\n z-index: 1;\n position: relative;\n text-align: center;\n }\n\n &:hover::before {\n z-index: 0;\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba($ui-secondary-color, 0.7);\n border-radius: 100%;\n }\n}\n\n.emoji-mart-category-label {\n z-index: 2;\n position: relative;\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n\n span {\n display: block;\n width: 100%;\n font-weight: 500;\n padding: 5px 6px;\n background: $simple-background-color;\n }\n}\n\n.emoji-mart-emoji {\n position: relative;\n display: inline-block;\n font-size: 0;\n\n span {\n width: 22px;\n height: 22px;\n }\n}\n\n.emoji-mart-no-results {\n font-size: 14px;\n text-align: center;\n padding-top: 70px;\n color: $light-text-color;\n\n .emoji-mart-category-label {\n display: none;\n }\n\n .emoji-mart-no-results-label {\n margin-top: .2em;\n }\n\n .emoji-mart-emoji:hover::before {\n content: none;\n }\n}\n\n.emoji-mart-preview {\n display: none;\n}\n",".glitch.local-settings {\n position: relative;\n display: flex;\n flex-direction: row;\n background: $ui-secondary-color;\n color: $inverted-text-color;\n border-radius: 8px;\n height: 80vh;\n width: 80vw;\n max-width: 740px;\n max-height: 450px;\n overflow: hidden;\n\n label, legend {\n display: block;\n font-size: 14px;\n }\n\n .boolean label, .radio_buttons label {\n position: relative;\n padding-left: 28px;\n padding-top: 3px;\n\n input {\n position: absolute;\n left: 0;\n top: 0;\n }\n }\n\n span.hint {\n display: block;\n color: $lighter-text-color;\n }\n\n h1 {\n font-size: 18px;\n font-weight: 500;\n line-height: 24px;\n margin-bottom: 20px;\n }\n\n h2 {\n font-size: 15px;\n font-weight: 500;\n line-height: 20px;\n margin-top: 20px;\n margin-bottom: 10px;\n }\n}\n\n.glitch.local-settings__navigation__item {\n display: block;\n padding: 15px 20px;\n color: inherit;\n background: lighten($ui-secondary-color, 8%);\n border-bottom: 1px $ui-secondary-color solid;\n cursor: pointer;\n text-decoration: none;\n outline: none;\n transition: background .3s;\n\n .text-icon-button {\n color: inherit;\n transition: unset;\n }\n\n &:hover {\n background: $ui-secondary-color;\n }\n\n &.active {\n background: $ui-highlight-color;\n color: $primary-text-color;\n }\n\n &.close, &.close:hover {\n background: $error-value-color;\n color: $primary-text-color;\n }\n}\n\n.glitch.local-settings__navigation {\n background: lighten($ui-secondary-color, 8%);\n width: 212px;\n font-size: 15px;\n line-height: 20px;\n overflow-y: auto;\n}\n\n.glitch.local-settings__page {\n display: block;\n flex: auto;\n padding: 15px 20px 15px 20px;\n width: 360px;\n overflow-y: auto;\n}\n\n.glitch.local-settings__page__item {\n margin-bottom: 2px;\n}\n\n.glitch.local-settings__page__item.string,\n.glitch.local-settings__page__item.radio_buttons {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n\n@media screen and (max-width: 630px) {\n .glitch.local-settings__navigation {\n width: 40px;\n flex-shrink: 0;\n }\n\n .glitch.local-settings__navigation__item {\n padding: 10px;\n\n span:last-of-type {\n display: none;\n }\n }\n}\n",".error-boundary {\n color: $primary-text-color;\n font-size: 15px;\n line-height: 20px;\n\n h1 {\n font-size: 26px;\n line-height: 36px;\n font-weight: 400;\n margin-bottom: 8px;\n }\n\n a {\n color: $primary-text-color;\n text-decoration: underline;\n }\n\n ul {\n list-style: disc;\n margin-left: 0;\n padding-left: 1em;\n }\n\n textarea.web_app_crash-stacktrace {\n width: 100%;\n resize: none;\n white-space: pre;\n font-family: $font-monospace, monospace;\n }\n}\n",".compose-panel {\n width: 285px;\n margin-top: 10px;\n display: flex;\n flex-direction: column;\n height: calc(100% - 10px);\n overflow-y: hidden;\n\n .search__input {\n line-height: 18px;\n font-size: 16px;\n padding: 15px;\n padding-right: 30px;\n }\n\n .search__icon .fa {\n top: 15px;\n }\n\n .drawer--account {\n flex: 0 1 48px;\n }\n\n .flex-spacer {\n background: transparent;\n }\n\n .composer {\n flex: 1;\n overflow-y: hidden;\n display: flex;\n flex-direction: column;\n min-height: 310px;\n }\n\n .compose-form__autosuggest-wrapper {\n overflow-y: auto;\n background-color: $white;\n border-radius: 4px 4px 0 0;\n flex: 0 1 auto;\n }\n\n .autosuggest-textarea__textarea {\n overflow-y: hidden;\n }\n\n .compose-form__upload-thumbnail {\n height: 80px;\n }\n}\n\n.navigation-panel {\n margin-top: 10px;\n margin-bottom: 10px;\n height: calc(100% - 20px);\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n\n & > a {\n flex: 0 0 auto;\n }\n\n hr {\n flex: 0 0 auto;\n border: 0;\n background: transparent;\n border-top: 1px solid lighten($ui-base-color, 4%);\n margin: 10px 0;\n }\n\n .flex-spacer {\n background: transparent;\n }\n}\n\n@media screen and (min-width: 600px) {\n .tabs-bar__link {\n span {\n display: inline;\n }\n }\n}\n\n.columns-area--mobile {\n flex-direction: column;\n width: 100%;\n margin: 0 auto;\n\n .column,\n .drawer {\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .directory__list {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: block;\n }\n }\n\n .directory__card {\n margin-bottom: 0;\n }\n\n .filter-form {\n display: flex;\n }\n\n .autosuggest-textarea__textarea {\n font-size: 16px;\n }\n\n .search__input {\n line-height: 18px;\n font-size: 16px;\n padding: 15px;\n padding-right: 30px;\n }\n\n .search__icon .fa {\n top: 15px;\n }\n\n .scrollable {\n overflow: visible;\n\n @supports(display: grid) {\n contain: content;\n }\n }\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding: 10px 0;\n padding-top: 0;\n }\n\n @media screen and (min-width: 630px) {\n .detailed-status {\n padding: 15px;\n\n .media-gallery,\n .video-player,\n .audio-player {\n margin-top: 15px;\n }\n }\n\n .account__header__bar {\n padding: 5px 10px;\n }\n\n .navigation-bar,\n .compose-form {\n padding: 15px;\n }\n\n .compose-form .compose-form__publish .compose-form__publish-button-wrapper {\n padding-top: 15px;\n }\n\n .status {\n padding: 15px;\n min-height: 48px + 2px;\n\n .media-gallery,\n &__action-bar,\n .video-player,\n .audio-player {\n margin-top: 10px;\n }\n }\n\n .account {\n padding: 15px 10px;\n\n &__header__bio {\n margin: 0 -10px;\n }\n }\n\n .notification {\n &__message {\n padding-top: 15px;\n }\n\n .status {\n padding-top: 8px;\n }\n\n .account {\n padding-top: 8px;\n }\n }\n }\n}\n\n.floating-action-button {\n position: fixed;\n display: flex;\n justify-content: center;\n align-items: center;\n width: 3.9375rem;\n height: 3.9375rem;\n bottom: 1.3125rem;\n right: 1.3125rem;\n background: darken($ui-highlight-color, 3%);\n color: $white;\n border-radius: 50%;\n font-size: 21px;\n line-height: 21px;\n text-decoration: none;\n box-shadow: 2px 3px 9px rgba($base-shadow-color, 0.4);\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-highlight-color, 7%);\n }\n}\n\n@media screen and (min-width: $no-gap-breakpoint) {\n .tabs-bar {\n width: 100%;\n }\n\n .react-swipeable-view-container .columns-area--mobile {\n height: calc(100% - 10px) !important;\n }\n\n .getting-started__wrapper,\n .search {\n margin-bottom: 10px;\n }\n}\n\n@media screen and (max-width: 600px + (285px * 1) + (10px * 1)) {\n .columns-area__panels__pane--compositional {\n display: none;\n }\n}\n\n@media screen and (min-width: 600px + (285px * 1) + (10px * 1)) {\n .floating-action-button,\n .tabs-bar__link.optional {\n display: none;\n }\n\n .search-page .search {\n display: none;\n }\n}\n\n@media screen and (max-width: 600px + (285px * 2) + (10px * 2)) {\n .columns-area__panels__pane--navigational {\n display: none;\n }\n}\n\n@media screen and (min-width: 600px + (285px * 2) + (10px * 2)) {\n .tabs-bar {\n display: none;\n }\n}\n",".poll {\n margin-top: 16px;\n font-size: 14px;\n\n ul,\n .e-content & ul {\n margin: 0;\n list-style: none;\n }\n\n li {\n margin-bottom: 10px;\n position: relative;\n }\n\n &__chart {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n display: inline-block;\n border-radius: 4px;\n background: darken($ui-primary-color, 14%);\n\n &.leading {\n background: $ui-highlight-color;\n }\n }\n\n &__text {\n position: relative;\n display: flex;\n padding: 6px 0;\n line-height: 18px;\n cursor: default;\n overflow: hidden;\n\n input[type=radio],\n input[type=checkbox] {\n display: none;\n }\n\n .autossugest-input {\n flex: 1 1 auto;\n }\n\n input[type=text] {\n display: block;\n box-sizing: border-box;\n width: 100%;\n font-size: 14px;\n color: $inverted-text-color;\n display: block;\n outline: 0;\n font-family: inherit;\n background: $simple-background-color;\n border: 1px solid darken($simple-background-color, 14%);\n border-radius: 4px;\n padding: 6px 10px;\n\n &:focus {\n border-color: $highlight-text-color;\n }\n }\n\n &.selectable {\n cursor: pointer;\n }\n\n &.editable {\n display: flex;\n align-items: center;\n overflow: visible;\n }\n }\n\n &__input {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 50%;\n vertical-align: middle;\n margin-top: auto;\n margin-bottom: auto;\n flex: 0 0 18px;\n\n &.checkbox {\n border-radius: 4px;\n }\n\n &.active {\n border-color: $valid-value-color;\n background: $valid-value-color;\n }\n\n &:active,\n &:focus,\n &:hover {\n border-width: 4px;\n background: none;\n }\n\n &::-moz-focus-inner {\n outline: 0 !important;\n border: 0;\n }\n\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n\n &__number {\n display: inline-block;\n width: 52px;\n font-weight: 700;\n padding: 0 10px;\n padding-left: 8px;\n text-align: right;\n margin-top: auto;\n margin-bottom: auto;\n flex: 0 0 52px;\n }\n\n &__vote__mark {\n float: left;\n line-height: 18px;\n }\n\n &__footer {\n padding-top: 6px;\n padding-bottom: 5px;\n color: $dark-text-color;\n }\n\n &__link {\n display: inline;\n background: transparent;\n padding: 0;\n margin: 0;\n border: 0;\n color: $dark-text-color;\n text-decoration: underline;\n font-size: inherit;\n\n &:hover {\n text-decoration: none;\n }\n\n &:active,\n &:focus {\n background-color: rgba($dark-text-color, .1);\n }\n }\n\n .button {\n height: 36px;\n padding: 0 16px;\n margin-right: 10px;\n font-size: 14px;\n }\n}\n\n.compose-form__poll-wrapper {\n border-top: 1px solid darken($simple-background-color, 8%);\n\n ul {\n padding: 10px;\n }\n\n .poll__footer {\n border-top: 1px solid darken($simple-background-color, 8%);\n padding: 10px;\n display: flex;\n align-items: center;\n\n button,\n select {\n width: 100%;\n flex: 1 1 50%;\n\n &:focus {\n border-color: $highlight-text-color;\n }\n }\n }\n\n .button.button-secondary {\n font-size: 14px;\n font-weight: 400;\n padding: 6px 10px;\n height: auto;\n line-height: inherit;\n color: $action-button-color;\n border-color: $action-button-color;\n margin-right: 5px;\n }\n\n li {\n display: flex;\n align-items: center;\n\n .poll__text {\n flex: 0 0 auto;\n width: calc(100% - (23px + 6px));\n margin-right: 6px;\n }\n }\n\n select {\n appearance: none;\n box-sizing: border-box;\n font-size: 14px;\n color: $inverted-text-color;\n display: inline-block;\n width: auto;\n outline: 0;\n font-family: inherit;\n background: $simple-background-color url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center / auto 16px;\n border: 1px solid darken($simple-background-color, 14%);\n border-radius: 4px;\n padding: 6px 10px;\n padding-right: 30px;\n }\n\n .icon-button.disabled {\n color: darken($simple-background-color, 14%);\n }\n}\n\n.muted .poll {\n color: $dark-text-color;\n\n &__chart {\n background: rgba(darken($ui-primary-color, 14%), 0.2);\n\n &.leading {\n background: rgba($ui-highlight-color, 0.2);\n }\n }\n}\n","$maximum-width: 1235px;\n$fluid-breakpoint: $maximum-width + 20px;\n$column-breakpoint: 700px;\n$small-breakpoint: 960px;\n\n.container {\n box-sizing: border-box;\n max-width: $maximum-width;\n margin: 0 auto;\n position: relative;\n\n @media screen and (max-width: $fluid-breakpoint) {\n width: 100%;\n padding: 0 10px;\n }\n}\n\n.rich-formatting {\n font-family: $font-sans-serif, sans-serif;\n font-size: 14px;\n font-weight: 400;\n line-height: 1.7;\n word-wrap: break-word;\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n p,\n li {\n color: $darker-text-color;\n }\n\n p {\n margin-top: 0;\n margin-bottom: .85em;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n strong {\n font-weight: 700;\n color: $secondary-text-color;\n }\n\n em {\n font-style: italic;\n color: $secondary-text-color;\n }\n\n code {\n font-size: 0.85em;\n background: darken($ui-base-color, 8%);\n border-radius: 4px;\n padding: 0.2em 0.3em;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n font-family: $font-display, sans-serif;\n margin-top: 1.275em;\n margin-bottom: .85em;\n font-weight: 500;\n color: $secondary-text-color;\n }\n\n h1 {\n font-size: 2em;\n }\n\n h2 {\n font-size: 1.75em;\n }\n\n h3 {\n font-size: 1.5em;\n }\n\n h4 {\n font-size: 1.25em;\n }\n\n h5,\n h6 {\n font-size: 1em;\n }\n\n ul {\n list-style: disc;\n }\n\n ol {\n list-style: decimal;\n }\n\n ul,\n ol {\n margin: 0;\n padding: 0;\n padding-left: 2em;\n margin-bottom: 0.85em;\n\n &[type='a'] {\n list-style-type: lower-alpha;\n }\n\n &[type='i'] {\n list-style-type: lower-roman;\n }\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n margin: 1.7em 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n\n table {\n width: 100%;\n border-collapse: collapse;\n break-inside: auto;\n margin-top: 24px;\n margin-bottom: 32px;\n\n thead tr,\n tbody tr {\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n font-size: 1em;\n line-height: 1.625;\n font-weight: 400;\n text-align: left;\n color: $darker-text-color;\n }\n\n thead tr {\n border-bottom-width: 2px;\n line-height: 1.5;\n font-weight: 500;\n color: $dark-text-color;\n }\n\n th,\n td {\n padding: 8px;\n align-self: start;\n align-items: start;\n word-break: break-all;\n\n &.nowrap {\n width: 25%;\n position: relative;\n\n &::before {\n content: ' ';\n visibility: hidden;\n }\n\n span {\n position: absolute;\n left: 8px;\n right: 8px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n }\n\n & > :first-child {\n margin-top: 0;\n }\n}\n\n.information-board {\n background: darken($ui-base-color, 4%);\n padding: 20px 0;\n\n .container-alt {\n position: relative;\n padding-right: 280px + 15px;\n }\n\n &__sections {\n display: flex;\n justify-content: space-between;\n flex-wrap: wrap;\n }\n\n &__section {\n flex: 1 0 0;\n font-family: $font-sans-serif, sans-serif;\n font-size: 16px;\n line-height: 28px;\n color: $primary-text-color;\n text-align: right;\n padding: 10px 15px;\n\n span,\n strong {\n display: block;\n }\n\n span {\n &:last-child {\n color: $secondary-text-color;\n }\n }\n\n strong {\n font-family: $font-display, sans-serif;\n font-weight: 500;\n font-size: 32px;\n line-height: 48px;\n }\n\n @media screen and (max-width: $column-breakpoint) {\n text-align: center;\n }\n }\n\n .panel {\n position: absolute;\n width: 280px;\n box-sizing: border-box;\n background: darken($ui-base-color, 8%);\n padding: 20px;\n padding-top: 10px;\n border-radius: 4px 4px 0 0;\n right: 0;\n bottom: -40px;\n\n .panel-header {\n font-family: $font-display, sans-serif;\n font-size: 14px;\n line-height: 24px;\n font-weight: 500;\n color: $darker-text-color;\n padding-bottom: 5px;\n margin-bottom: 15px;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n\n a,\n span {\n font-weight: 400;\n color: darken($darker-text-color, 10%);\n }\n\n a {\n text-decoration: none;\n }\n }\n }\n\n .owner {\n text-align: center;\n\n .avatar {\n width: 80px;\n height: 80px;\n @include avatar-size(80px);\n margin: 0 auto;\n margin-bottom: 15px;\n\n img {\n display: block;\n width: 80px;\n height: 80px;\n border-radius: 48px;\n @include avatar-radius();\n }\n }\n\n .name {\n font-size: 14px;\n\n a {\n display: block;\n color: $primary-text-color;\n text-decoration: none;\n\n &:hover {\n .display_name {\n text-decoration: underline;\n }\n }\n }\n\n .username {\n display: block;\n color: $darker-text-color;\n }\n }\n }\n}\n\n.landing-page {\n p,\n li {\n font-family: $font-sans-serif, sans-serif;\n font-size: 16px;\n font-weight: 400;\n font-size: 16px;\n line-height: 30px;\n margin-bottom: 12px;\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n }\n }\n\n em {\n display: inline;\n margin: 0;\n padding: 0;\n font-weight: 700;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n color: lighten($darker-text-color, 10%);\n }\n\n h1 {\n font-family: $font-display, sans-serif;\n font-size: 26px;\n line-height: 30px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n\n small {\n font-family: $font-sans-serif, sans-serif;\n display: block;\n font-size: 18px;\n font-weight: 400;\n color: lighten($darker-text-color, 10%);\n }\n }\n\n h2 {\n font-family: $font-display, sans-serif;\n font-size: 22px;\n line-height: 26px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h3 {\n font-family: $font-display, sans-serif;\n font-size: 18px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h4 {\n font-family: $font-display, sans-serif;\n font-size: 16px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h5 {\n font-family: $font-display, sans-serif;\n font-size: 14px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h6 {\n font-family: $font-display, sans-serif;\n font-size: 12px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n ul,\n ol {\n margin-left: 20px;\n\n &[type='a'] {\n list-style-type: lower-alpha;\n }\n\n &[type='i'] {\n list-style-type: lower-roman;\n }\n }\n\n ul {\n list-style: disc;\n }\n\n ol {\n list-style: decimal;\n }\n\n li > ol,\n li > ul {\n margin-top: 6px;\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid rgba($ui-base-lighter-color, .6);\n margin: 20px 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n\n &__information,\n &__forms {\n padding: 20px;\n }\n\n &__call-to-action {\n background: $ui-base-color;\n border-radius: 4px;\n padding: 25px 40px;\n overflow: hidden;\n box-sizing: border-box;\n\n .row {\n width: 100%;\n display: flex;\n flex-direction: row-reverse;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n }\n\n .row__information-board {\n display: flex;\n justify-content: flex-end;\n align-items: flex-end;\n\n .information-board__section {\n flex: 1 0 auto;\n padding: 0 10px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n width: 100%;\n justify-content: space-between;\n }\n }\n\n .row__mascot {\n flex: 1;\n margin: 10px -50px 0 0;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n }\n\n &__logo {\n margin-right: 20px;\n\n img {\n height: 50px;\n width: auto;\n mix-blend-mode: lighten;\n }\n }\n\n &__information {\n padding: 45px 40px;\n margin-bottom: 10px;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n strong {\n font-weight: 500;\n color: lighten($darker-text-color, 10%);\n }\n\n .account {\n border-bottom: 0;\n padding: 0;\n\n &__display-name {\n align-items: center;\n display: flex;\n margin-right: 5px;\n }\n\n div.account__display-name {\n &:hover {\n .display-name strong {\n text-decoration: none;\n }\n }\n\n .account__avatar {\n cursor: default;\n }\n }\n\n &__avatar-wrapper {\n margin-left: 0;\n flex: 0 0 auto;\n }\n\n &__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n @include avatar-size(44px);\n }\n\n .display-name {\n font-size: 15px;\n\n &__account {\n font-size: 14px;\n }\n }\n }\n\n @media screen and (max-width: $small-breakpoint) {\n .contact {\n margin-top: 30px;\n }\n }\n\n @media screen and (max-width: $column-breakpoint) {\n padding: 25px 20px;\n }\n }\n\n &__information,\n &__forms,\n #mastodon-timeline {\n box-sizing: border-box;\n background: $ui-base-color;\n border-radius: 4px;\n box-shadow: 0 0 6px rgba($black, 0.1);\n }\n\n &__mascot {\n height: 104px;\n position: relative;\n left: -40px;\n bottom: 25px;\n\n img {\n height: 190px;\n width: auto;\n }\n }\n\n &__short-description {\n .row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n margin-bottom: 40px;\n }\n\n @media screen and (max-width: $column-breakpoint) {\n .row {\n margin-bottom: 20px;\n }\n }\n\n p a {\n color: $secondary-text-color;\n }\n\n h1 {\n font-weight: 500;\n color: $primary-text-color;\n margin-bottom: 0;\n\n small {\n color: $darker-text-color;\n\n span {\n color: $secondary-text-color;\n }\n }\n }\n\n p:last-child {\n margin-bottom: 0;\n }\n }\n\n &__hero {\n margin-bottom: 10px;\n\n img {\n display: block;\n margin: 0;\n max-width: 100%;\n height: auto;\n border-radius: 4px;\n }\n }\n\n @media screen and (max-width: 840px) {\n .information-board {\n .container-alt {\n padding-right: 20px;\n }\n\n .panel {\n position: static;\n margin-top: 20px;\n width: 100%;\n border-radius: 4px;\n\n .panel-header {\n text-align: center;\n }\n }\n }\n }\n\n @media screen and (max-width: 675px) {\n .header-wrapper {\n padding-top: 0;\n\n &.compact {\n padding-bottom: 0;\n }\n\n &.compact .hero .heading {\n text-align: initial;\n }\n }\n\n .header .container-alt,\n .features .container-alt {\n display: block;\n }\n }\n\n .cta {\n margin: 20px;\n }\n}\n\n.landing {\n margin-bottom: 100px;\n\n @media screen and (max-width: 738px) {\n margin-bottom: 0;\n }\n\n &__brand {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 50px;\n\n svg {\n fill: $primary-text-color;\n height: 52px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding: 0;\n margin-bottom: 30px;\n }\n }\n\n .directory {\n margin-top: 30px;\n background: transparent;\n box-shadow: none;\n border-radius: 0;\n }\n\n .hero-widget {\n margin-top: 30px;\n margin-bottom: 0;\n\n h4 {\n padding: 10px;\n text-transform: uppercase;\n font-weight: 700;\n font-size: 13px;\n color: $darker-text-color;\n }\n\n &__text {\n border-radius: 0;\n padding-bottom: 0;\n }\n\n &__footer {\n background: $ui-base-color;\n padding: 10px;\n border-radius: 0 0 4px 4px;\n display: flex;\n\n &__column {\n flex: 1 1 50%;\n }\n }\n\n .account {\n padding: 10px 0;\n border-bottom: 0;\n\n .account__display-name {\n display: flex;\n align-items: center;\n }\n\n .account__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n }\n\n &__counter {\n padding: 10px;\n\n strong {\n font-family: $font-display, sans-serif;\n font-size: 15px;\n font-weight: 700;\n display: block;\n }\n\n span {\n font-size: 14px;\n color: $darker-text-color;\n }\n }\n }\n\n .simple_form .user_agreement .label_input > label {\n font-weight: 400;\n color: $darker-text-color;\n }\n\n .simple_form p.lead {\n color: $darker-text-color;\n font-size: 15px;\n line-height: 20px;\n font-weight: 400;\n margin-bottom: 25px;\n }\n\n &__grid {\n max-width: 960px;\n margin: 0 auto;\n display: grid;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n grid-gap: 30px;\n\n @media screen and (max-width: 738px) {\n grid-template-columns: minmax(0, 100%);\n grid-gap: 10px;\n\n &__column-login {\n grid-row: 1;\n display: flex;\n flex-direction: column;\n\n .box-widget {\n order: 2;\n flex: 0 0 auto;\n }\n\n .hero-widget {\n margin-top: 0;\n margin-bottom: 10px;\n order: 1;\n flex: 0 0 auto;\n }\n }\n\n &__column-registration {\n grid-row: 2;\n }\n\n .directory {\n margin-top: 10px;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n\n .hero-widget {\n display: block;\n margin-bottom: 0;\n box-shadow: none;\n\n &__img,\n &__img img,\n &__footer {\n border-radius: 0;\n }\n }\n\n .hero-widget,\n .box-widget,\n .directory__tag {\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n .directory {\n margin-top: 0;\n\n &__tag {\n margin-bottom: 0;\n\n & > a,\n & > div {\n border-radius: 0;\n box-shadow: none;\n }\n\n &:last-child {\n border-bottom: 0;\n }\n }\n }\n }\n }\n}\n\n.brand {\n position: relative;\n text-decoration: none;\n}\n\n.brand__tagline {\n display: block;\n position: absolute;\n bottom: -10px;\n left: 50px;\n width: 300px;\n color: $ui-primary-color;\n text-decoration: none;\n font-size: 14px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n position: static;\n width: auto;\n margin-top: 20px;\n color: $dark-text-color;\n }\n}\n\n",".table {\n width: 100%;\n max-width: 100%;\n border-spacing: 0;\n border-collapse: collapse;\n\n th,\n td {\n padding: 8px;\n line-height: 18px;\n vertical-align: top;\n border-top: 1px solid $ui-base-color;\n text-align: left;\n background: darken($ui-base-color, 4%);\n }\n\n & > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid $ui-base-color;\n border-top: 0;\n font-weight: 500;\n }\n\n & > tbody > tr > th {\n font-weight: 500;\n }\n\n & > tbody > tr:nth-child(odd) > td,\n & > tbody > tr:nth-child(odd) > th {\n background: $ui-base-color;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n &.inline-table {\n & > tbody > tr:nth-child(odd) {\n & > td,\n & > th {\n background: transparent;\n }\n }\n\n & > tbody > tr:first-child {\n & > td,\n & > th {\n border-top: 0;\n }\n }\n }\n\n &.batch-table {\n & > thead > tr > th {\n background: $ui-base-color;\n border-top: 1px solid darken($ui-base-color, 8%);\n border-bottom: 1px solid darken($ui-base-color, 8%);\n\n &:first-child {\n border-radius: 4px 0 0;\n border-left: 1px solid darken($ui-base-color, 8%);\n }\n\n &:last-child {\n border-radius: 0 4px 0 0;\n border-right: 1px solid darken($ui-base-color, 8%);\n }\n }\n }\n\n &--invites tbody td {\n vertical-align: middle;\n }\n}\n\n.table-wrapper {\n overflow: auto;\n margin-bottom: 20px;\n}\n\nsamp {\n font-family: $font-monospace, monospace;\n}\n\nbutton.table-action-link {\n background: transparent;\n border: 0;\n font: inherit;\n}\n\nbutton.table-action-link,\na.table-action-link {\n text-decoration: none;\n display: inline-block;\n margin-right: 5px;\n padding: 0 10px;\n color: $darker-text-color;\n font-weight: 500;\n\n &:hover {\n color: $primary-text-color;\n }\n\n i.fa {\n font-weight: 400;\n margin-right: 5px;\n }\n\n &:first-child {\n padding-left: 0;\n }\n}\n\n.batch-table {\n &__toolbar,\n &__row {\n display: flex;\n\n &__select {\n box-sizing: border-box;\n padding: 8px 16px;\n cursor: pointer;\n min-height: 100%;\n\n input {\n margin-top: 8px;\n }\n\n &--aligned {\n display: flex;\n align-items: center;\n\n input {\n margin-top: 0;\n }\n }\n }\n\n &__actions,\n &__content {\n padding: 8px 0;\n padding-right: 16px;\n flex: 1 1 auto;\n }\n }\n\n &__toolbar {\n border: 1px solid darken($ui-base-color, 8%);\n background: $ui-base-color;\n border-radius: 4px 0 0;\n height: 47px;\n align-items: center;\n\n &__actions {\n text-align: right;\n padding-right: 16px - 5px;\n }\n }\n\n &__form {\n padding: 16px;\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n background: $ui-base-color;\n\n .fields-row {\n padding-top: 0;\n margin-bottom: 0;\n }\n }\n\n &__row {\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n background: darken($ui-base-color, 4%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n .optional &:first-child {\n border-top: 1px solid darken($ui-base-color, 8%);\n }\n }\n\n &:hover {\n background: darken($ui-base-color, 2%);\n }\n\n &:nth-child(even) {\n background: $ui-base-color;\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n }\n\n &__content {\n padding-top: 12px;\n padding-bottom: 16px;\n\n &--unpadded {\n padding: 0;\n }\n\n &--with-image {\n display: flex;\n align-items: center;\n }\n\n &__image {\n flex: 0 0 auto;\n display: flex;\n justify-content: center;\n align-items: center;\n margin-right: 10px;\n\n .emojione {\n width: 32px;\n height: 32px;\n }\n }\n\n &__text {\n flex: 1 1 auto;\n }\n\n &__extra {\n flex: 0 0 auto;\n text-align: right;\n color: $darker-text-color;\n font-weight: 500;\n }\n }\n\n .directory__tag {\n margin: 0;\n width: 100%;\n\n a {\n background: transparent;\n border-radius: 0;\n }\n }\n }\n\n &.optional .batch-table__toolbar,\n &.optional .batch-table__row__select {\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n\n .status__content {\n padding-top: 0;\n\n strong {\n font-weight: 700;\n }\n }\n\n .nothing-here {\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n box-shadow: none;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 1px solid darken($ui-base-color, 8%);\n }\n }\n\n @media screen and (max-width: 870px) {\n .accounts-table tbody td.optional {\n display: none;\n }\n }\n}\n","$no-columns-breakpoint: 600px;\n$sidebar-width: 240px;\n$content-width: 840px;\n\n.admin-wrapper {\n display: flex;\n justify-content: center;\n width: 100%;\n min-height: 100vh;\n\n .sidebar-wrapper {\n min-height: 100vh;\n overflow: hidden;\n pointer-events: none;\n flex: 1 1 auto;\n\n &__inner {\n display: flex;\n justify-content: flex-end;\n background: $ui-base-color;\n height: 100%;\n }\n }\n\n .sidebar {\n width: $sidebar-width;\n padding: 0;\n pointer-events: auto;\n\n &__toggle {\n display: none;\n background: lighten($ui-base-color, 8%);\n height: 48px;\n\n &__logo {\n flex: 1 1 auto;\n\n a {\n display: inline-block;\n padding: 15px;\n }\n\n svg {\n fill: $primary-text-color;\n height: 20px;\n position: relative;\n bottom: -2px;\n }\n }\n\n &__icon {\n display: block;\n color: $darker-text-color;\n text-decoration: none;\n flex: 0 0 auto;\n font-size: 20px;\n padding: 15px;\n }\n\n a {\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 12%);\n }\n }\n }\n\n .logo {\n display: block;\n margin: 40px auto;\n width: 100px;\n height: 100px;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n & > a:first-child {\n display: none;\n }\n }\n\n ul {\n list-style: none;\n border-radius: 4px 0 0 4px;\n overflow: hidden;\n margin-bottom: 20px;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n margin-bottom: 0;\n }\n\n a {\n display: block;\n padding: 15px;\n color: $darker-text-color;\n text-decoration: none;\n transition: all 200ms linear;\n transition-property: color, background-color;\n border-radius: 4px 0 0 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n i.fa {\n margin-right: 5px;\n }\n\n &:hover {\n color: $primary-text-color;\n background-color: darken($ui-base-color, 5%);\n transition: all 100ms linear;\n transition-property: color, background-color;\n }\n\n &.selected {\n background: darken($ui-base-color, 2%);\n border-radius: 4px 0 0;\n }\n }\n\n ul {\n background: darken($ui-base-color, 4%);\n border-radius: 0 0 0 4px;\n margin: 0;\n\n a {\n border: 0;\n padding: 15px 35px;\n }\n }\n\n .simple-navigation-active-leaf a {\n color: $primary-text-color;\n background-color: $ui-highlight-color;\n border-bottom: 0;\n border-radius: 0;\n\n &:hover {\n background-color: lighten($ui-highlight-color, 5%);\n }\n }\n }\n\n & > ul > .simple-navigation-active-leaf a {\n border-radius: 4px 0 0 4px;\n }\n }\n\n .content-wrapper {\n box-sizing: border-box;\n width: 100%;\n max-width: $content-width;\n flex: 1 1 auto;\n }\n\n @media screen and (max-width: $content-width + $sidebar-width) {\n .sidebar-wrapper--empty {\n display: none;\n }\n\n .sidebar-wrapper {\n width: $sidebar-width;\n flex: 0 0 auto;\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n .sidebar-wrapper {\n width: 100%;\n }\n }\n\n .content {\n padding: 20px 15px;\n padding-top: 60px;\n padding-left: 25px;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n max-width: none;\n padding: 15px;\n padding-top: 30px;\n }\n\n &-heading {\n display: flex;\n\n padding-bottom: 40px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n margin: -15px -15px 40px 0;\n\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n\n & > * {\n margin-top: 15px;\n margin-right: 15px;\n }\n\n &-actions {\n display: inline-flex;\n\n & > :not(:first-child) {\n margin-left: 5px;\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n border-bottom: 0;\n padding-bottom: 0;\n }\n }\n\n h2 {\n color: $secondary-text-color;\n font-size: 24px;\n line-height: 28px;\n font-weight: 400;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n font-weight: 700;\n }\n }\n\n h3 {\n color: $secondary-text-color;\n font-size: 20px;\n line-height: 28px;\n font-weight: 400;\n margin-bottom: 30px;\n }\n\n h4 {\n text-transform: uppercase;\n font-size: 13px;\n font-weight: 700;\n color: $darker-text-color;\n padding-bottom: 8px;\n margin-bottom: 8px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n h6 {\n font-size: 16px;\n color: $secondary-text-color;\n line-height: 28px;\n font-weight: 500;\n }\n\n .fields-group h6 {\n color: $primary-text-color;\n font-weight: 500;\n }\n\n .directory__tag > a,\n .directory__tag > div {\n box-shadow: none;\n }\n\n .directory__tag .table-action-link .fa {\n color: inherit;\n }\n\n .directory__tag h4 {\n font-size: 18px;\n font-weight: 700;\n color: $primary-text-color;\n text-transform: none;\n padding-bottom: 0;\n margin-bottom: 0;\n border-bottom: none;\n }\n\n & > p {\n font-size: 14px;\n line-height: 21px;\n color: $secondary-text-color;\n margin-bottom: 20px;\n\n strong {\n color: $primary-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid rgba($ui-base-lighter-color, .6);\n margin: 20px 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n\n .sidebar-wrapper {\n min-height: 0;\n }\n\n .sidebar {\n width: 100%;\n padding: 0;\n height: auto;\n\n &__toggle {\n display: flex;\n }\n\n & > ul {\n display: none;\n }\n\n ul a,\n ul ul a {\n border-radius: 0;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n transition: none;\n\n &:hover {\n transition: none;\n }\n }\n\n ul ul {\n border-radius: 0;\n }\n\n ul .simple-navigation-active-leaf a {\n border-bottom-color: $ui-highlight-color;\n }\n }\n }\n}\n\nhr.spacer {\n width: 100%;\n border: 0;\n margin: 20px 0;\n height: 1px;\n}\n\nbody,\n.admin-wrapper .content {\n .muted-hint {\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n }\n }\n\n .positive-hint {\n color: $valid-value-color;\n font-weight: 500;\n }\n\n .negative-hint {\n color: $error-value-color;\n font-weight: 500;\n }\n\n .neutral-hint {\n color: $dark-text-color;\n font-weight: 500;\n }\n\n .warning-hint {\n color: $gold-star;\n font-weight: 500;\n }\n}\n\n.filters {\n display: flex;\n flex-wrap: wrap;\n\n .filter-subset {\n flex: 0 0 auto;\n margin: 0 40px 20px 0;\n\n &:last-child {\n margin-bottom: 30px;\n }\n\n ul {\n margin-top: 5px;\n list-style: none;\n\n li {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n strong {\n font-weight: 500;\n text-transform: uppercase;\n font-size: 12px;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n text-transform: uppercase;\n font-size: 12px;\n font-weight: 500;\n border-bottom: 2px solid $ui-base-color;\n\n &:hover {\n color: $primary-text-color;\n border-bottom: 2px solid lighten($ui-base-color, 5%);\n }\n\n &.selected {\n color: $highlight-text-color;\n border-bottom: 2px solid $ui-highlight-color;\n }\n }\n }\n}\n\n.flavour-screen {\n display: block;\n margin: 10px auto;\n max-width: 100%;\n}\n\n.flavour-description {\n display: block;\n font-size: 16px;\n margin: 10px 0;\n\n & > p {\n margin: 10px 0;\n }\n}\n\n.report-accounts {\n display: flex;\n flex-wrap: wrap;\n margin-bottom: 20px;\n}\n\n.report-accounts__item {\n display: flex;\n flex: 250px;\n flex-direction: column;\n margin: 0 5px;\n\n & > strong {\n display: block;\n margin: 0 0 10px -5px;\n font-weight: 500;\n font-size: 14px;\n line-height: 18px;\n color: $secondary-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n .account-card {\n flex: 1 1 auto;\n }\n}\n\n.report-status,\n.account-status {\n display: flex;\n margin-bottom: 10px;\n\n .activity-stream {\n flex: 2 0 0;\n margin-right: 20px;\n max-width: calc(100% - 60px);\n\n .entry {\n border-radius: 4px;\n }\n }\n}\n\n.report-status__actions,\n.account-status__actions {\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n\n .icon-button {\n font-size: 24px;\n width: 24px;\n text-align: center;\n margin-bottom: 10px;\n }\n}\n\n.simple_form.new_report_note,\n.simple_form.new_account_moderation_note {\n max-width: 100%;\n}\n\n.batch-form-box {\n display: flex;\n flex-wrap: wrap;\n margin-bottom: 5px;\n\n #form_status_batch_action {\n margin: 0 5px 5px 0;\n font-size: 14px;\n }\n\n input.button {\n margin: 0 5px 5px 0;\n }\n\n .media-spoiler-toggle-buttons {\n margin-left: auto;\n\n .button {\n overflow: visible;\n margin: 0 0 5px 5px;\n float: right;\n }\n }\n}\n\n.back-link {\n margin-bottom: 10px;\n font-size: 14px;\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.spacer {\n flex: 1 1 auto;\n}\n\n.log-entry {\n margin-bottom: 20px;\n line-height: 20px;\n\n &__header {\n display: flex;\n justify-content: flex-start;\n align-items: center;\n padding: 10px;\n background: $ui-base-color;\n color: $darker-text-color;\n border-radius: 4px 4px 0 0;\n font-size: 14px;\n position: relative;\n }\n\n &__avatar {\n margin-right: 10px;\n\n .avatar {\n display: block;\n margin: 0;\n border-radius: 50%;\n width: 40px;\n height: 40px;\n }\n }\n\n &__content {\n max-width: calc(100% - 90px);\n }\n\n &__title {\n word-wrap: break-word;\n }\n\n &__timestamp {\n color: $dark-text-color;\n }\n\n &__extras {\n background: lighten($ui-base-color, 6%);\n border-radius: 0 0 4px 4px;\n padding: 10px;\n color: $darker-text-color;\n font-family: $font-monospace, monospace;\n font-size: 12px;\n word-wrap: break-word;\n min-height: 20px;\n }\n\n &__icon {\n font-size: 28px;\n margin-right: 10px;\n color: $dark-text-color;\n }\n\n &__icon__overlay {\n position: absolute;\n top: 10px;\n right: 10px;\n width: 10px;\n height: 10px;\n border-radius: 50%;\n\n &.positive {\n background: $success-green;\n }\n\n &.negative {\n background: lighten($error-red, 12%);\n }\n\n &.neutral {\n background: $ui-highlight-color;\n }\n }\n\n a,\n .username,\n .target {\n color: $secondary-text-color;\n text-decoration: none;\n font-weight: 500;\n }\n\n .diff-old {\n color: lighten($error-red, 12%);\n }\n\n .diff-neutral {\n color: $secondary-text-color;\n }\n\n .diff-new {\n color: $success-green;\n }\n}\n\na.name-tag,\n.name-tag,\na.inline-name-tag,\n.inline-name-tag {\n text-decoration: none;\n color: $secondary-text-color;\n\n .username {\n font-weight: 500;\n }\n\n &.suspended {\n .username {\n text-decoration: line-through;\n color: lighten($error-red, 12%);\n }\n\n .avatar {\n filter: grayscale(100%);\n opacity: 0.8;\n }\n }\n}\n\na.name-tag,\n.name-tag {\n display: flex;\n align-items: center;\n\n .avatar {\n display: block;\n margin: 0;\n margin-right: 5px;\n border-radius: 50%;\n }\n\n &.suspended {\n .avatar {\n filter: grayscale(100%);\n opacity: 0.8;\n }\n }\n}\n\n.speech-bubble {\n margin-bottom: 20px;\n border-left: 4px solid $ui-highlight-color;\n\n &.positive {\n border-left-color: $success-green;\n }\n\n &.negative {\n border-left-color: lighten($error-red, 12%);\n }\n\n &.warning {\n border-left-color: $gold-star;\n }\n\n &__bubble {\n padding: 16px;\n padding-left: 14px;\n font-size: 15px;\n line-height: 20px;\n border-radius: 4px 4px 4px 0;\n position: relative;\n font-weight: 500;\n\n a {\n color: $darker-text-color;\n }\n }\n\n &__owner {\n padding: 8px;\n padding-left: 12px;\n }\n\n time {\n color: $dark-text-color;\n }\n}\n\n.report-card {\n background: $ui-base-color;\n border-radius: 4px;\n margin-bottom: 20px;\n\n &__profile {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 15px;\n\n .account {\n padding: 0;\n border: 0;\n\n &__avatar-wrapper {\n margin-left: 0;\n }\n }\n\n &__stats {\n flex: 0 0 auto;\n font-weight: 500;\n color: $darker-text-color;\n text-transform: uppercase;\n text-align: right;\n\n a {\n color: inherit;\n text-decoration: none;\n\n &:focus,\n &:hover,\n &:active {\n color: lighten($darker-text-color, 8%);\n }\n }\n\n .red {\n color: $error-value-color;\n }\n }\n }\n\n &__summary {\n &__item {\n display: flex;\n justify-content: flex-start;\n border-top: 1px solid darken($ui-base-color, 4%);\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n\n &__reported-by,\n &__assigned {\n padding: 15px;\n flex: 0 0 auto;\n box-sizing: border-box;\n width: 150px;\n color: $darker-text-color;\n\n &,\n .username {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n &__content {\n flex: 1 1 auto;\n max-width: calc(100% - 300px);\n\n &__icon {\n color: $dark-text-color;\n margin-right: 4px;\n font-weight: 500;\n }\n }\n\n &__content a {\n display: block;\n box-sizing: border-box;\n width: 100%;\n padding: 15px;\n text-decoration: none;\n color: $darker-text-color;\n }\n }\n }\n}\n\n.one-line {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.ellipsized-ip {\n display: inline-block;\n max-width: 120px;\n overflow: hidden;\n text-overflow: ellipsis;\n vertical-align: middle;\n}\n\n.admin-account-bio {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n margin-top: 20px;\n\n > div {\n box-sizing: border-box;\n padding: 0 5px;\n margin-bottom: 10px;\n flex: 1 0 50%;\n }\n\n .account__header__fields,\n .account__header__content {\n background: lighten($ui-base-color, 8%);\n border-radius: 4px;\n height: 100%;\n }\n\n .account__header__fields {\n margin: 0;\n border: 0;\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n\n .account__header__content {\n box-sizing: border-box;\n padding: 20px;\n color: $primary-text-color;\n }\n}\n\n.center-text {\n text-align: center;\n}\n","$emojis-requiring-outlines: '8ball' 'ant' 'back' 'black_circle' 'black_heart' 'black_large_square' 'black_medium_small_square' 'black_medium_square' 'black_nib' 'black_small_square' 'bomb' 'bowling' 'bust_in_silhouette' 'busts_in_silhouette' 'camera' 'camera_with_flash' 'clubs' 'copyright' 'curly_loop' 'currency_exchange' 'dark_sunglasses' 'eight_pointed_black_star' 'electric_plug' 'end' 'female-guard' 'film_projector' 'fried_egg' 'gorilla' 'guardsman' 'heavy_check_mark' 'heavy_division_sign' 'heavy_dollar_sign' 'heavy_minus_sign' 'heavy_multiplication_x' 'heavy_plus_sign' 'hocho' 'hole' 'joystick' 'kaaba' 'lower_left_ballpoint_pen' 'lower_left_fountain_pen' 'male-guard' 'microphone' 'mortar_board' 'movie_camera' 'musical_score' 'on' 'registered' 'soon' 'spades' 'speaking_head_in_silhouette' 'spider' 'telephone_receiver' 'tm' 'top' 'tophat' 'turkey' 'vhs' 'video_camera' 'video_game' 'water_buffalo' 'waving_black_flag' 'wavy_dash' !default;\n\n%emoji-outline {\n filter: drop-shadow(1px 1px 0 $primary-text-color) drop-shadow(-1px 1px 0 $primary-text-color) drop-shadow(1px -1px 0 $primary-text-color) drop-shadow(-1px -1px 0 $primary-text-color);\n}\n\n.emojione {\n @each $emoji in $emojis-requiring-outlines {\n &[title=':#{$emoji}:'] {\n @extend %emoji-outline;\n }\n }\n}\n\n.hicolor-privacy-icons {\n .status__visibility-icon.fa-globe,\n .composer--options--dropdown--content--item .fa-globe {\n color: #1976D2;\n }\n\n .status__visibility-icon.fa-unlock,\n .composer--options--dropdown--content--item .fa-unlock {\n color: #388E3C;\n }\n\n .status__visibility-icon.fa-lock,\n .composer--options--dropdown--content--item .fa-lock {\n color: #FFA000;\n }\n\n .status__visibility-icon.fa-envelope,\n .composer--options--dropdown--content--item .fa-envelope {\n color: #D32F2F;\n }\n}\n","body.rtl {\n direction: rtl;\n\n .column-header > button {\n text-align: right;\n padding-left: 0;\n padding-right: 15px;\n }\n\n .radio-button__input {\n margin-right: 0;\n margin-left: 10px;\n }\n\n .directory__card__bar .display-name {\n margin-left: 0;\n margin-right: 15px;\n }\n\n .display-name {\n text-align: right;\n }\n\n .notification__message {\n margin-left: 0;\n margin-right: 68px;\n }\n\n .drawer__inner__mastodon > img {\n transform: scaleX(-1);\n }\n\n .notification__favourite-icon-wrapper {\n left: auto;\n right: -26px;\n }\n\n .landing-page__logo {\n margin-right: 0;\n margin-left: 20px;\n }\n\n .landing-page .features-list .features-list__row .visual {\n margin-left: 0;\n margin-right: 15px;\n }\n\n .column-link__icon,\n .column-header__icon {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .compose-form .compose-form__buttons-wrapper .character-counter__wrapper {\n margin-right: 0;\n margin-left: 4px;\n }\n\n .composer--publisher {\n text-align: left;\n }\n\n .boost-modal__status-time,\n .favourite-modal__status-time {\n float: left;\n }\n\n .navigation-bar__profile {\n margin-left: 0;\n margin-right: 8px;\n }\n\n .search__input {\n padding-right: 10px;\n padding-left: 30px;\n }\n\n .search__icon .fa {\n right: auto;\n left: 10px;\n }\n\n .columns-area {\n direction: rtl;\n }\n\n .column-header__buttons {\n left: 0;\n right: auto;\n margin-left: 0;\n margin-right: -15px;\n }\n\n .column-inline-form .icon-button {\n margin-left: 0;\n margin-right: 5px;\n }\n\n .column-header__links .text-btn {\n margin-left: 10px;\n margin-right: 0;\n }\n\n .account__avatar-wrapper {\n float: right;\n }\n\n .column-header__back-button {\n padding-left: 5px;\n padding-right: 0;\n }\n\n .column-header__setting-arrows {\n float: left;\n }\n\n .setting-toggle__label {\n margin-left: 0;\n margin-right: 8px;\n }\n\n .setting-meta__label {\n float: left;\n }\n\n .status__avatar {\n margin-left: 10px;\n margin-right: 0;\n\n // Those are used for public pages\n left: auto;\n right: 10px;\n }\n\n .activity-stream .status.light {\n padding-left: 10px;\n padding-right: 68px;\n }\n\n .status__info .status__display-name,\n .activity-stream .status.light .status__display-name {\n padding-left: 25px;\n padding-right: 0;\n }\n\n .activity-stream .pre-header {\n padding-right: 68px;\n padding-left: 0;\n }\n\n .status__prepend {\n margin-left: 0;\n margin-right: 58px;\n }\n\n .status__prepend-icon-wrapper {\n left: auto;\n right: -26px;\n }\n\n .activity-stream .pre-header .pre-header__icon {\n left: auto;\n right: 42px;\n }\n\n .account__avatar-overlay-overlay {\n right: auto;\n left: 0;\n }\n\n .column-back-button--slim-button {\n right: auto;\n left: 0;\n }\n\n .status__relative-time,\n .activity-stream .status.light .status__header .status__meta {\n float: left;\n text-align: left;\n }\n\n .status__action-bar {\n &__counter {\n margin-right: 0;\n margin-left: 11px;\n\n .status__action-bar-button {\n margin-right: 0;\n margin-left: 4px;\n }\n }\n }\n\n .status__action-bar-button {\n float: right;\n margin-right: 0;\n margin-left: 18px;\n }\n\n .status__action-bar-dropdown {\n float: right;\n }\n\n .privacy-dropdown__dropdown {\n margin-left: 0;\n margin-right: 40px;\n }\n\n .privacy-dropdown__option__icon {\n margin-left: 10px;\n margin-right: 0;\n }\n\n .detailed-status__display-name .display-name {\n text-align: right;\n }\n\n .detailed-status__display-avatar {\n margin-right: 0;\n margin-left: 10px;\n float: right;\n }\n\n .detailed-status__favorites,\n .detailed-status__reblogs {\n margin-left: 0;\n margin-right: 6px;\n }\n\n .fa-ul {\n margin-left: 2.14285714em;\n }\n\n .fa-li {\n left: auto;\n right: -2.14285714em;\n }\n\n .admin-wrapper {\n direction: rtl;\n }\n\n .admin-wrapper .sidebar ul a i.fa,\n a.table-action-link i.fa {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .simple_form .check_boxes .checkbox label {\n padding-left: 0;\n padding-right: 25px;\n }\n\n .simple_form .input.with_label.boolean label.checkbox {\n padding-left: 25px;\n padding-right: 0;\n }\n\n .simple_form .check_boxes .checkbox input[type=\"checkbox\"],\n .simple_form .input.boolean input[type=\"checkbox\"] {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.radio_buttons .radio {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.radio_buttons .radio > label {\n padding-right: 28px;\n padding-left: 0;\n }\n\n .simple_form .input-with-append .input input {\n padding-left: 142px;\n padding-right: 0;\n }\n\n .simple_form .input.boolean label.checkbox {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.boolean .label_input,\n .simple_form .input.boolean .hint {\n padding-left: 0;\n padding-right: 28px;\n }\n\n .simple_form .label_input__append {\n right: auto;\n left: 3px;\n\n &::after {\n right: auto;\n left: 0;\n background-image: linear-gradient(to left, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));\n }\n }\n\n .simple_form select {\n background: darken($ui-base-color, 10%) url(\"data:image/svg+xml;utf8,\") no-repeat left 8px center / auto 16px;\n }\n\n .table th,\n .table td {\n text-align: right;\n }\n\n .filters .filter-subset {\n margin-right: 0;\n margin-left: 45px;\n }\n\n .landing-page .header-wrapper .mascot {\n right: 60px;\n left: auto;\n }\n\n .landing-page__call-to-action .row__information-board {\n direction: rtl;\n }\n\n .landing-page .header .hero .floats .float-1 {\n left: -120px;\n right: auto;\n }\n\n .landing-page .header .hero .floats .float-2 {\n left: 210px;\n right: auto;\n }\n\n .landing-page .header .hero .floats .float-3 {\n left: 110px;\n right: auto;\n }\n\n .landing-page .header .links .brand img {\n left: 0;\n }\n\n .landing-page .fa-external-link {\n padding-right: 5px;\n padding-left: 0 !important;\n }\n\n .landing-page .features #mastodon-timeline {\n margin-right: 0;\n margin-left: 30px;\n }\n\n @media screen and (min-width: 631px) {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n\n &:first-child {\n padding-left: 5px;\n padding-right: 10px;\n }\n }\n\n .columns-area > div {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n }\n }\n }\n\n .columns-area--mobile .column,\n .columns-area--mobile .drawer {\n padding-left: 0;\n padding-right: 0;\n }\n\n .public-layout {\n .header {\n .nav-button {\n margin-left: 8px;\n margin-right: 0;\n }\n }\n\n .public-account-header__tabs {\n margin-left: 0;\n margin-right: 20px;\n }\n }\n\n .landing-page__information {\n .account__display-name {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .account__avatar-wrapper {\n margin-left: 12px;\n margin-right: 0;\n }\n }\n\n .card__bar .display-name {\n margin-left: 0;\n margin-right: 15px;\n text-align: right;\n }\n\n .fa-chevron-left::before {\n content: \"\\F054\";\n }\n\n .fa-chevron-right::before {\n content: \"\\F053\";\n }\n\n .column-back-button__icon {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .column-header__setting-arrows .column-header__setting-btn:last-child {\n padding-left: 0;\n padding-right: 10px;\n }\n\n .simple_form .input.radio_buttons .radio > label input {\n left: auto;\n right: 0;\n }\n}\n",".dashboard__counters {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n margin-bottom: 20px;\n\n & > div {\n box-sizing: border-box;\n flex: 0 0 33.333%;\n padding: 0 5px;\n margin-bottom: 10px;\n\n & > div,\n & > a {\n padding: 20px;\n background: lighten($ui-base-color, 4%);\n border-radius: 4px;\n box-sizing: border-box;\n height: 100%;\n }\n\n & > a {\n text-decoration: none;\n color: inherit;\n display: block;\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 8%);\n }\n }\n }\n\n &__num,\n &__text {\n text-align: center;\n font-weight: 500;\n font-size: 24px;\n line-height: 21px;\n color: $primary-text-color;\n font-family: $font-display, sans-serif;\n margin-bottom: 20px;\n line-height: 30px;\n }\n\n &__text {\n font-size: 18px;\n }\n\n &__label {\n font-size: 14px;\n color: $darker-text-color;\n text-align: center;\n font-weight: 500;\n }\n}\n\n.dashboard__widgets {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n\n & > div {\n flex: 0 0 33.333%;\n margin-bottom: 20px;\n\n & > div {\n padding: 0 5px;\n }\n }\n\n a:not(.name-tag) {\n color: $ui-secondary-color;\n font-weight: 500;\n text-decoration: none;\n }\n}\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///index.scss","webpack:///./app/javascript/flavours/glitch/styles/reset.scss","webpack:///./app/javascript/flavours/glitch/styles/variables.scss","webpack:///./app/javascript/flavours/glitch/styles/basics.scss","webpack:///./app/javascript/flavours/glitch/styles/containers.scss","webpack:///./app/javascript/flavours/glitch/styles/_mixins.scss","webpack:///./app/javascript/flavours/glitch/styles/lists.scss","webpack:///./app/javascript/flavours/glitch/styles/modal.scss","webpack:///./app/javascript/flavours/glitch/styles/footer.scss","webpack:///./app/javascript/flavours/glitch/styles/compact_header.scss","webpack:///./app/javascript/flavours/glitch/styles/widgets.scss","webpack:///./app/javascript/flavours/glitch/styles/forms.scss","webpack:///./app/javascript/flavours/glitch/styles/accounts.scss","webpack:///./app/javascript/flavours/glitch/styles/statuses.scss","webpack:///./app/javascript/flavours/glitch/styles/components/index.scss","webpack:///./app/javascript/flavours/glitch/styles/components/boost.scss","webpack:///./app/javascript/flavours/glitch/styles/components/accounts.scss","webpack:///./app/javascript/flavours/glitch/styles/components/domains.scss","webpack:///./app/javascript/flavours/glitch/styles/components/status.scss","webpack:///./app/javascript/flavours/glitch/styles/components/modal.scss","webpack:///./app/javascript/flavours/glitch/styles/components/composer.scss","webpack:///./app/javascript/flavours/glitch/styles/components/columns.scss","webpack:///./app/javascript/flavours/glitch/styles/components/regeneration_indicator.scss","webpack:///./app/javascript/flavours/glitch/styles/components/directory.scss","webpack:///./app/javascript/flavours/glitch/styles/components/search.scss","webpack:///","webpack:///./app/javascript/flavours/glitch/styles/components/emoji.scss","webpack:///./app/javascript/flavours/glitch/styles/components/doodle.scss","webpack:///./app/javascript/flavours/glitch/styles/components/drawer.scss","webpack:///./app/javascript/flavours/glitch/styles/components/media.scss","webpack:///./app/javascript/flavours/glitch/styles/components/sensitive.scss","webpack:///./app/javascript/flavours/glitch/styles/components/lists.scss","webpack:///./app/javascript/flavours/glitch/styles/components/emoji_picker.scss","webpack:///./app/javascript/flavours/glitch/styles/components/local_settings.scss","webpack:///./app/javascript/flavours/glitch/styles/components/error_boundary.scss","webpack:///./app/javascript/flavours/glitch/styles/components/single_column.scss","webpack:///./app/javascript/flavours/glitch/styles/components/announcements.scss","webpack:///./app/javascript/flavours/glitch/styles/polls.scss","webpack:///./app/javascript/flavours/glitch/styles/about.scss","webpack:///./app/javascript/flavours/glitch/styles/tables.scss","webpack:///./app/javascript/flavours/glitch/styles/admin.scss","webpack:///./app/javascript/flavours/glitch/styles/accessibility.scss","webpack:///./app/javascript/flavours/glitch/styles/rtl.scss","webpack:///./app/javascript/flavours/glitch/styles/dashboard.scss"],"names":[],"mappings":"AAAA,2ZCKA,QAaE,UACA,SACA,eACA,aACA,wBACA,+EAIF,aAEE,MAGF,aACE,OAGF,eACE,cAGF,WACE,qDAGF,UAEE,aACA,OAGF,wBACE,iBACA,MAGF,sCACE,qBAGF,UACE,YACA,2BAGF,kBACE,cACA,mBACA,iCAGF,kBACE,kCAGF,kBACE,2BAGF,aACE,gBACA,0BACA,CCtEW,iED6Eb,kBC7Ea,4BDiFb,sBACE,MEtFF,sBACE,mBACA,eACA,iBACA,gBACA,WDVM,kCCYN,6BACA,8BACA,CADA,0BACA,CADA,qBACA,0CACA,wCACA,kBAEA,sIAYE,eAGF,SACE,oCAEA,WACE,iBACA,kBACA,uCAGF,iBACE,WACA,YACA,mCAGF,iBACE,cAIJ,kBD5CW,kBCgDX,iBACE,kBACA,0BAEA,iBACE,YAIJ,kBACE,SACA,iBACA,uBAEA,iBACE,WACA,YACA,gBACA,YAIJ,kBACE,UACA,YAGF,iBACE,kBACA,cDtEoB,mBAPX,WCgFT,YACA,UACA,aACA,uBACA,mBACA,oBAEA,qBACE,YACA,wBAEA,aACE,gBACA,WACA,YACA,kBACA,uBAGF,cACE,iBACA,gBACA,QAMR,mBACE,eACA,cAEA,YACE,6BAKF,YAEE,WACA,mBACA,uBACA,oBACA,yEAKF,gBAEE,+EAKF,WAEE,gBCrJJ,WACE,CACA,kBACA,qCAEA,eALF,UAMI,SACA,kBAIJ,sBACE,qCAEA,gBAHF,kBAII,qBAGF,YACE,uBACA,mBACA,wBAEA,SFrBI,YEuBF,kBACA,sBAGF,YACE,uBACA,mBACA,WF9BE,qBEgCF,UACA,kBACA,iBACA,uBACA,gBACA,eACA,mCAMJ,WACE,CACA,cACA,mBACA,sBACA,qCAEA,kCAPF,UAQI,aACA,aACA,kBAKN,WACE,CACA,YACA,eACA,iBACA,sBACA,CACA,gBACA,CACA,sBACA,qCAEA,gBAZF,UAaI,CACA,eACA,CACA,mBACA,0BAKA,UACqB,sCC3EvB,iBD4EE,6BAEA,UACE,YACA,cACA,SACA,kBACA,iBF5BkB,wBG9DtB,4BACA,uBD8FA,aACE,cF/EsB,wBEiFtB,iCAEA,aACE,gBACA,uBACA,gBACA,8BAIJ,aACE,eACA,iBACA,gBACA,SAIJ,YACE,cACA,8BACA,sBACA,mCACA,CADA,0BACA,mBAEA,eACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,eACE,WACA,qCAGF,QA3BF,UA4BI,qCACA,mBAEA,aACE,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,UAKN,YACE,cACA,8CACA,sBACA,mCACA,CADA,0BACA,mBAEA,eACE,WACA,mBAGF,eACE,WACA,mBAGF,aACE,WACA,mBAGF,eACE,WACA,mBAGF,aACE,WACA,uCAGF,eACE,wBAGF,kBACE,qCAGF,QAxCF,iDAyCI,uCAEA,YACE,aACA,mBACA,uBACA,iCAGF,UACE,uBACA,mBACA,sBAGF,YACE,sCAIJ,QA7DF,UA8DI,qCACA,mBAEA,aACE,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,sCAMJ,eADF,gBAEI,4BAGF,eACE,qCAEA,0BAHF,SAII,yBAIJ,kBACE,mCACA,kBACA,YACA,cACA,aACA,oBACA,uBACA,iBACA,gBACA,qCAEA,uBAZF,cAaI,WACA,MACA,OACA,SACA,gBACA,gBACA,YACA,6BAGF,cACE,eACA,kCAGF,YACE,oBACA,2BACA,iBACA,oCAGF,YACE,oBACA,uBACA,iBACA,mCAGF,YACE,oBACA,yBACA,iBACA,+BAGF,aACE,aACA,mCAEA,aACE,YACA,WACA,kBACA,YACA,UF1UA,qCE6UA,kCARF,WASI,+GAIJ,kBAGE,kCAIJ,YACE,mBACA,eACA,eACA,gBACA,qBACA,cF/UkB,mBEiVlB,kBACA,uHAEA,yBAGE,WFvWA,qCE2WF,0CACE,YACE,qCAKN,kBACE,CACA,oBACA,kBACA,6HAEA,oBAGE,mBACA,sBAON,YACE,cACA,0DACA,sBACA,mCACA,CADA,0BACA,gCAEA,UACE,cACA,gCAGF,UACE,cACA,qCAGF,qBAjBF,0BAkBI,WACA,gCAEA,YACE,kCAKN,iBACE,qCAEA,gCAHF,eAII,sCAKF,4BADF,eAEI,wCAIJ,eACE,mBACA,mCACA,gDAEA,UACE,qIAEA,8BAEE,CAFF,sBAEE,6DAGF,wBFxaoB,8CE6atB,yBACE,gBACA,aACA,kBACA,gBACA,oDAEA,UACE,cACA,kBACA,WACA,YACA,gDACA,MACA,OACA,kDAGF,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,0BACA,qCAGF,6CA3BF,YA4BI,gDAIJ,eACE,6JAEA,iBAEE,qCAEA,4JAJF,eAKI,sCAKN,sCA/DF,eAgEI,gBACA,oDAEA,YACE,+FAGF,eAEE,6CAIJ,iBACE,iBACA,aACA,2BACA,mDAEA,UACE,cACA,mBACA,kBACA,SACA,OACA,QACA,YACA,0BACA,WACA,oDAGF,aACE,CAEA,WACqB,yCCzgB3B,kBD0gBM,cACA,wDAEA,aACE,WACA,YACA,SACA,kBACA,yBACA,mBACA,iBF7dc,wBG9DtB,4BACA,qCD+hBI,2CAvCF,YAwCI,mBACA,0BACA,YACA,mDAEA,YACE,oDAKA,UACqB,sCCtiB7B,CDuiBQ,sBACA,wDAEA,QACE,kBACA,iBFrfY,wBG9DtB,4BACA,2DDsjBQ,mDAbF,YAcI,sCAKN,2CApEF,eAqEI,sCAGF,2CAxEF,cAyEI,8CAIJ,aACE,iBACA,mDAEA,gBACE,mBACA,sDAEA,cACE,iBACA,WFhlBF,gBEklBE,gBACA,mBACA,uBACA,6BACA,4DAEA,aACE,eACA,WF1lBJ,gBE4lBI,gBACA,uBACA,qCAKN,4CA7BF,gBA8BI,aACA,8BACA,mBACA,mDAEA,aACE,iBACA,sDAEA,cACE,iBACA,iBACA,4DAEA,aFlmBY,oDEymBlB,YACE,2BACA,oBACA,YACA,qEAEA,YACE,mBACA,gBACA,qCAGF,oEACE,YACE,6DAIJ,eACE,sBACA,cACA,cF9nBc,aEgoBd,+BACA,eACA,kBACA,kBACA,8DAEA,aACE,uEAGF,cACE,kEAGF,aACE,WACA,kBACA,SACA,OACA,WACA,gCACA,WACA,wBACA,yEAIA,+BACE,UACA,kFAGF,2BF/pBc,wEEqqBd,SACE,wBACA,8DAIJ,oBACE,cACA,2EAGF,cACE,cACA,4EAGF,eACE,eACA,kBACA,WFzsBJ,uBE2sBI,2DAIJ,aACE,WACA,4DAGF,eACE,8CAKN,YACE,eACA,kEAEA,eACE,gBACA,uBACA,cACA,2FAEA,4BACE,yEAGF,YACE,qDAIJ,gBACE,eACA,cF/tBgB,uDEkuBhB,oBACE,cFnuBc,qBEquBd,aACA,gBACA,8DAEA,eACE,WF1vBJ,qCEgwBF,6CAtCF,aAuCI,UACA,4CAKN,yBACE,qCAEA,0CAHF,eAII,wCAIJ,eACE,oCAGF,kBACE,mCACA,kBACA,gBACA,mBACA,qCAEA,mCAPF,eAQI,gBACA,gBACA,8DAGF,QACE,aACA,+DAEA,aACE,sFAGF,uBACE,yEAGF,aF3yBU,8DEizBV,mBACA,WFnzBE,qFEuzBJ,YAEE,eACA,cF1yBkB,2CE8yBpB,gBACE,iCAIJ,YACE,cACA,kDACA,qCAEA,gCALF,aAMI,+CAGF,cACE,iCAIJ,eACE,2BAGF,YACE,eACA,eACA,cACA,+BAEA,qBACE,cACA,YACA,cACA,mBACA,kBACA,qCAEA,8BARF,aASI,sCAGF,8BAZF,cAaI,sCAIJ,0BAvBF,QAwBI,6BACA,+BAEA,UACE,UACA,gBACA,gCACA,0CAEA,eACE,0CAGF,kBFj3BK,+IEo3BH,kBAGE,WEl4BZ,eACE,aAEA,oBACE,aACA,iBAIJ,eACE,cACA,oBAEA,cACE,gBACA,mBACA,eChBJ,k1BACE,aACA,sBACA,aACA,UACA,yBAGF,YACE,OACA,sBACA,yBACA,2BAEA,MACE,iBACA,qCAIJ,gBACE,YACE,yBCrBF,eACE,iBACA,oBACA,eACA,cACA,qCAEA,uBAPF,iBAQI,mBACA,+BAGF,YACE,cACA,0CACA,wCAEA,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,kBACA,6CAEA,aACE,wCAIJ,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,qCAGF,6BAxCF,iCAyCI,+EAEA,aAEE,wCAGF,UACE,wCAGF,aACE,+EAGF,aAEE,wCAGF,UACE,sCAIJ,uCACE,aACE,sCAIJ,4JACE,YAIE,4BAKN,wBACE,gBACA,kBACA,cNhFkB,6BMmFlB,aACE,qBACA,6BAIJ,oBACE,cACA,wGAEA,yBAGE,mCAKF,aACE,YACA,WACA,cACA,aACA,0HAMA,YACE,oBClIR,cACE,iBACA,cPeoB,gBObpB,mBACA,eACA,qBACA,qCAEA,mBATF,iBAUI,oBACA,uBAGF,aACE,qBACA,0BAGF,eACE,cPFoB,wBOMtB,oBACE,mBACA,kBACA,WACA,YACA,cC9BN,kBACE,mCACA,mBAEA,UACE,kBACA,gBACA,0BACA,gBRPI,uBQUJ,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,0BACA,oBAIJ,kBRVW,aQYT,0BACA,eACA,cRPoB,iBQSpB,qBACA,gBACA,8BAEA,UACE,YACA,gBACA,sBAGF,kBACE,iCAEA,eACE,uBAIJ,cACE,SACA,UACA,gBACA,uBACA,oBACA,kBACA,oBACA,cACA,sBAGF,aRtCsB,qBQwCpB,4BAEA,yBACE,qCAKN,aAnEF,YAoEI,uBAIJ,kBACE,oBACA,yBAEA,YACE,yBACA,gBACA,eACA,cR9DoB,+BQkEtB,cACE,0CAEA,eACE,sDAGF,YACE,mBACA,gDAGF,UACE,YACA,0BACA,oCAIJ,YACE,mBAKF,aR3FsB,aQgGxB,YACE,kBACA,mBRzGW,mCQ2GX,qBAGF,YACE,kBACA,0BACA,kBACA,cR3GsB,mBQ6GtB,iBAGF,eACE,eACA,cRlHsB,iBQoHtB,qBACA,gBACA,UACA,oBAEA,YACE,yBACA,gBACA,eACA,cR7HoB,0BQiItB,eACE,CACA,kBACA,mBAGF,oBACE,CACA,mBACA,cR1IoB,qBQ4IpB,mBACA,gBACA,uBACA,0EAEA,yBAGE,uBAMJ,sBACA,kBACA,mBRnKW,mCQqKX,cR7JwB,gBQ+JxB,mBACA,sDAEA,eAEE,CAII,qXADF,eACE,yBAKN,aACE,0BACA,CAMI,wLAGF,oBAGE,mIAEA,yBACE,gCAMR,kBACE,oCAEA,gBACE,cRzMkB,8DQ+MpB,iBACE,eACA,4DAGF,eACE,qBACA,iEAEA,eACE,kBAMR,YACE,CACA,eRlPM,CQoPN,cACA,cRpOsB,mBQsOtB,+BANA,iBACA,CRlPM,kCQgQN,CATA,aAGF,kBACE,CAEA,iBACA,kBACA,cACA,iBAEA,URjQM,eQmQJ,gBACA,gBACA,mBACA,gBAGF,cACE,cR1PoB,qCQ8PtB,aArBF,YAsBI,mBACA,iBAEA,cACE,aAKN,kBR/Qa,kBQiRX,mCACA,iBAEA,qBACE,mBACA,uCAEA,YAEE,mBACA,8BACA,mBR5RO,kBQ8RP,aACA,qBACA,cACA,mCACA,0EAIA,kBAGE,0BAIJ,kBRpSsB,eQsSpB,8BAGF,UACE,eACA,oBAGF,aACE,eACA,gBACA,WRnUE,mBQqUF,gBACA,uBACA,wBAEA,aRzTkB,0BQ6TlB,aACE,gBACA,eACA,eACA,cRjUgB,yFQuUlB,URvVE,+BQ8VJ,aACE,YACA,uDAGF,oBRjVsB,eQuV1B,YACE,yBACA,gCAEA,aACE,WACA,YACA,kBACA,kBACA,kBACA,mBACA,yBACA,4CAEA,SACE,6CAGF,SACE,6CAGF,SACE,iBAKN,UACE,0BAEA,SACE,SACA,wBAGF,eACE,0BAGF,iBACE,yBACA,cRnYoB,gBQqYpB,aACA,sCAEA,eACE,0BAIJ,cACE,sBACA,gCACA,wCAGF,eACE,wBAGF,WACE,kBACA,eACA,gBACA,WR3aI,8BQ8aJ,aACE,cR/ZkB,gBQialB,eACA,0BAIJ,SACE,iCACA,qCAGF,kCACE,YACE,sCAYJ,qIAPF,eAQI,gBACA,gBACA,iBAOJ,gBACE,qCAEA,eAHF,oBAII,uBAGF,sBACE,sCAEA,qBAHF,sBAII,sCAGF,qBAPF,UAQI,sCAGF,qBAXF,WAYI,kCAIJ,iBACE,qCAEA,gCAHF,4BAII,iEAIA,eACE,0DAGF,cACE,iBACA,oEAEA,UACE,YACA,gBACA,yFAGF,gBACE,SACA,mKAIJ,eAGE,gBAON,aRhgBsB,iCQ+fxB,kBAKI,6BAEA,eACE,kBAIJ,cACE,iBACA,wCAMF,oBACE,gBACA,cRnhBsB,4JQshBtB,yBAGE,oBAKN,kBACE,gBACA,eACA,kBACA,yBAEA,aACE,gBACA,aACA,CACA,kBACA,gBACA,uBACA,qBACA,WR9jBI,gCQgkBJ,4FAEA,yBAGE,oCAIJ,eACE,0BAGF,iBACE,gCACA,MC/kBJ,+BACE,gBACA,iBAGF,eACE,aACA,cACA,qBAIA,kBACE,gBACA,4BAEA,QACE,0CAIA,kBACE,qDAEA,eACE,gDAIJ,iBACE,kBACA,sDAEA,iBACE,SACA,OACA,6BAKN,iBACE,gBACA,gDAEA,mBACE,eACA,gBACA,WThDA,cSkDA,WACA,4EAGF,iBAEE,mDAGF,eACE,4CAGF,iBACE,QACA,OACA,qCAGF,aTnDoB,0BSqDlB,gIAEA,oBAGE,0CAIJ,iBACE,CACA,iBACA,mBAKN,YACE,cACA,0BAEA,qBACE,cACA,UACA,cACA,oBAIJ,aTpFsB,sBSuFpB,aTrFsB,yBSyFtB,iBACE,kBACA,gBACA,wBAIJ,aACE,eACA,eACA,qBAGF,kBACE,cTzGoB,iCS4GpB,iBACE,eACA,iBACA,gBACA,gBACA,oBAIJ,kBACE,qBAGF,eACE,CAII,0JADF,eACE,sDAMJ,YACE,4DAEA,mBACE,eACA,WTzJA,gBS2JA,gBACA,cACA,wHAGF,aAEE,sDAIJ,cACE,kBACA,mDAKF,mBACE,eACA,WT/KE,cSiLF,kBACA,qBACA,gBACA,sCAGF,cACE,mCAGF,UACE,sCAIJ,cACE,4CAEA,mBACE,eACA,WTrME,cSuMF,gBACA,gBACA,4CAGF,kBACE,yCAGF,cACE,CADF,cACE,kDAIJ,oBACE,WACA,OACA,6BAGF,oBACE,cACA,4BAGF,kBACE,8CAEA,eACE,0BAIJ,YACE,CACA,eACA,oBACA,iCAEA,cACE,kCAGF,qBACE,eACA,cACA,eACA,oCAEA,aACE,2CAGF,eACE,6GAIJ,eAEE,qCAGF,yBA9BF,aA+BI,gBACA,kCAEA,cACE,0JAGF,kBAGE,iDAKN,iBACE,oBACA,eACA,WTzRI,cS2RJ,WACA,2CAKE,mBACE,eACA,WTnSA,qBSqSA,WACA,kBACA,gBACA,kBACA,cACA,0DAGF,iBACE,OACA,QACA,SACA,kDAKN,cACE,aACA,yBACA,kBACA,sJAGF,qBAKE,eACA,WTnUI,cSqUJ,WACA,UACA,oBACA,gBACA,mBACA,sBACA,kBACA,aACA,6RAEA,aACE,CAHF,+OAEA,aACE,CAHF,mQAEA,aACE,CAHF,sNAEA,aACE,8LAGF,eACE,oVAGF,oBACE,iOAGF,oBT1VY,oLS8VZ,iBACE,4WAGF,oBTjVsB,mBSoVpB,6CAKF,aACE,gUAGF,oBAME,8CAGF,aACE,gBACA,cACA,eACA,8BAIJ,UACE,uBAGF,eACE,aACA,oCAEA,YACE,mBACA,qEAIJ,aAGE,WACA,SACA,kBACA,mBTlYsB,WAlBlB,eSuZJ,oBACA,YACA,aACA,yBACA,qBACA,kBACA,sBACA,eACA,gBACA,UACA,mBACA,kBACA,sGAEA,cACE,uFAGF,wBACE,gLAGF,wBAEE,kHAGF,wBTlaoB,gGSsapB,kBTpbQ,kHSubN,wBACE,sOAGF,wBAEE,qBAKN,uBACE,CADF,oBACE,CADF,eACE,sBACA,eACA,WTvcI,cSycJ,WACA,UACA,oBACA,gBACA,wXACA,sBACA,kBACA,kBACA,mBACA,YACA,iBAGF,4BACE,oCAIA,iBACE,mCAGF,iBACE,UACA,QACA,CACA,qBACA,eACA,cTvckB,oBSyclB,oBACA,eACA,gBACA,mBACA,gBACA,yCAEA,UACE,cACA,kBACA,MACA,QACA,WACA,UACA,8DACA,4BAKN,iBACE,0CAEA,wBACE,CADF,gBACE,qCAGF,iBACE,MACA,OACA,WACA,YACA,aACA,uBACA,mBACA,8BACA,kBACA,iBACA,gBACA,YACA,8CAEA,iBACE,6HAGE,UTrhBF,aS+hBR,aACE,CACA,kBACA,eACA,gBAGF,kBACE,cTvhBsB,kBSyhBtB,kBACA,mBACA,kBACA,uBAEA,qCACE,iCACA,cT/iBY,sBSmjBd,mCACE,+BACA,cTpjBQ,kBSwjBV,oBACE,cT3iBoB,qBS6iBpB,wBAEA,UT/jBI,0BSikBF,kBAIJ,kBACE,4BAGF,SACE,sBACA,cACA,WACA,YACA,aACA,gCACA,mBTvkBS,WATL,eSmlBJ,SACA,8CAEA,QACE,iHAGF,mBAGE,kCAGF,kBACE,uBAIJ,eACE,CAII,oKADF,eACE,0DAKN,eAzEF,eA0EI,eAIJ,eACE,kBACA,gBAEA,aTxmBsB,qBS0mBpB,sBAEA,yBACE,YAKN,eACE,mBACA,eACA,eAEA,oBACE,kBACA,cAGF,aT1nBwB,yBS4nBtB,qBACA,gBACA,2DAEA,aAGE,8BAKN,kBAEE,cT5oBsB,oCS+oBtB,cACE,mBACA,kBACA,4CAGF,aTppBwB,gBSspBtB,CAII,mUADF,eACE,0DAKN,6BAtBF,eAuBI,cAIJ,YACE,eACA,uBACA,UAGF,aACE,gBT5rBM,YS8rBN,qBACA,mCACA,qBACA,cAEA,aACE,SACA,iBAIJ,kBACE,cTzrBwB,WS2rBxB,sBAEA,aACE,eACA,eAKF,kBACE,sBAEA,eACE,CAII,+JADF,eACE,4CASR,qBACE,8BACA,WTxuBI,qCS0uBJ,oCACA,kBACA,aACA,mBACA,gDAEA,UThvBI,0BSkvBF,oLAEA,oBAGE,0DAIJ,eACE,cACA,kBACA,CAII,yYADF,eACE,kEAIJ,eACE,oBAMR,YACE,eACA,mBACA,4DAEA,aAEE,6BAIA,wBACA,cACA,sBAIJ,iBACE,cT/wBsB,0BSkxBtB,iBACE,oBAIJ,eACE,mBACA,uBAEA,cACE,WT5yBI,kBS8yBJ,mBACA,SACA,UACA,4BAGF,aACE,eAIJ,aTtzBc,0SSg0BZ,+BACE,aAIJ,kBACE,sBACA,kBACA,aACA,mBACA,kBACA,kBACA,QACA,mCACA,sBAEA,aACE,8BAGF,sBACE,SACA,aACA,eACA,gCACA,oBAGF,aACE,WACA,oBACA,gBACA,eACA,CACA,oBACA,WACA,iCACA,oBAGF,oBT12Bc,gBS42BZ,2BAEA,kBT92BY,gBSg3BV,oBAKN,kBACE,6BAEA,wBACE,mBACA,eACA,aACA,4BAGF,kBACE,aACA,OACA,sBACA,cACA,cACA,gCAEA,iBACE,YACA,iBACA,kBACA,UACA,8BAGF,qBACE,qCAIJ,kBACE,gCAGF,wBACE,mCACA,kBACA,kBACA,kBACA,kBACA,sCAEA,wBACE,WACA,cACA,YACA,SACA,kBACA,MACA,UACA,yBAIJ,sBACE,aACA,mBACA,SCj7BF,aACE,qBACA,cACA,mCACA,qCAEA,QANF,eAOI,8EAMA,kBACE,YAKN,YACE,kBACA,gBACA,0BACA,gBAEA,aACE,WACA,YACA,SACA,oBACA,CADA,8BACA,CADA,gBACA,0BACA,qCAGF,WAfF,YAgBI,sCAGF,WAnBF,YAoBI,aAIJ,iBACE,aACA,aACA,2BACA,mBACA,mBACA,0BACA,qCAEA,WATF,eAUI,qBAGF,aACE,CAEA,UACqB,sCPpDzB,gBOqDI,wBAEA,UACE,YACA,cACA,SACA,kBACA,iBVLgB,wBG9DtB,4BACA,mBOoEM,oBACA,CADA,8BACA,CADA,gBACA,0BAIJ,gBACE,gBACA,iCAEA,cACE,WV/EA,gBUiFA,gBACA,uBACA,+BAGF,aACE,eACA,cVxEgB,gBU0EhB,gBACA,uBACA,aAMR,cACE,kBACA,gBACA,6GAEA,cAME,WV7GI,gBU+GJ,qBACA,iBACA,qBACA,sBAGF,eVrHM,oBUuHJ,cV9GS,eUgHT,cACA,kBAGF,cACE,uCAGF,wBAEE,cVlHsB,oBUsHxB,UACE,eACA,wBAEA,oBACE,iBACA,oBAIJ,WACE,gBACA,wBAEA,oBACE,gBACA,uBAIJ,cACE,cACA,qCAGF,YA9DF,iBA+DI,mBAEA,YACE,uCAGF,oBAEE,gBAKN,kBVrKa,mCUuKX,cVhKsB,eUkKtB,gBACA,kBACA,aACA,uBACA,mBACA,eACA,kBACA,aACA,gBACA,2BAEA,yBACE,yBAGF,qBACE,gBACA,yCAIJ,oBAEE,gBACA,eACA,kBACA,eACA,iBACA,gBACA,cV9LwB,sCUgMxB,sCACA,6DAEA,aVnNc,sCUqNZ,kCACA,qDAGF,aACE,sCACA,kCACA,0BAIJ,eACE,UACA,wBACA,gBACA,CADA,YACA,CACA,iCACA,CADA,uBACA,CADA,kBACA,eACA,iBACA,6BAEA,YACE,gCACA,yDAGF,qBAEE,aACA,kBACA,gBACA,gBACA,mBACA,uBACA,6BAGF,eACE,YACA,cACA,cV7OsB,0BU+OtB,6BAGF,aACE,cVpPoB,4BUwPtB,aVtPwB,qBUwPtB,qGAEA,yBAGE,oCAIJ,qCACE,iCACA,sCAEA,aVtRY,gBUwRV,0CAGF,aV3RY,wCUgSd,eACE,wCAIJ,UACE,0BAIA,aV3RsB,4BU8RpB,aV7RsB,qBU+RpB,qGAEA,yBAGE,iCAIJ,UVzTI,gBU2TF,wBAIJ,eACE,kBClUJ,kCACE,kBACA,gBACA,mBACA,qCAEA,iBANF,eAOI,gBACA,gBACA,6BAGF,eACE,SACA,gBACA,gFAEA,yBAEE,sCAIJ,UACE,yBAGF,kBXhBW,6GWmBT,sBAGE,CAHF,cAGE,8IAIA,eAGE,0BACA,iJAKF,yBAGE,kLAIA,iBAGE,qCAKN,4GACE,yBAGE,uCAKN,kBACE,qBAIJ,WACE,eACA,mBXzDwB,WAlBlB,oBW8EN,iBACA,YACA,iBACA,SACA,yBAEA,UACE,YACA,sBACA,iBACA,UXxFI,gFW4FN,kBAGE,qNAKA,kBXpFoB,4IW4FpB,kBX1GQ,qCWiHV,wBACE,YACE,0DAOJ,YACE,uCAGF,2BACE,gBACA,uDAEA,SACE,SACA,yDAGF,eACE,yDAKA,cACA,iBACA,mBACA,mFAGF,iBACE,eACA,WACA,WACA,WACA,qMAGF,eAGE,mEASF,cACE,gBACA,qFAGF,aXhJoB,YWkJlB,eACA,WACA,eACA,gBACA,+GAGF,aACE,eACA,CACA,sBACA,eACA,yJAEA,cACE,uEAIJ,WACE,kBACA,WACA,eACA,iDAQF,iBACE,mBACA,yHAEA,iBACE,gBACA,+FAGF,UACE,oCAMR,aACE,eACA,iBACA,cACA,SACA,uBACA,CACA,eACA,qBACA,oFAEA,yBAEE,WC9OJ,gCACE,4CACA,kBAGF,mBACE,sBACA,oBACA,gBACA,kBACA,cAGF,aACE,eACA,iBACA,cZIwB,SYFxB,uBACA,UACA,eACA,wCAEA,yBAEE,uBAGF,aZVsB,eYYpB,SAIJ,wBACE,YACA,kBACA,sBACA,WZpCM,eYsCN,qBACA,oBACA,eACA,gBACA,YACA,iBACA,iBACA,gBACA,eACA,kBACA,kBACA,yBACA,qBACA,uBACA,2BACA,qCACA,mBACA,WACA,4CAEA,wBAGE,4BACA,qCACA,sBAGF,eACE,mFAEA,wBZnEQ,gBYuEN,kBAIJ,wBZ7DsB,eY+DpB,yGAGF,cAIE,iBACA,YACA,oBACA,iBACA,4BAGF,aZpFW,mBAOW,qGYiFpB,wBAGE,8BAIJ,kBZ1EsB,2GY6EpB,wBAGE,0BAIJ,cACE,iBACA,YACA,cZrGoB,oBYuGpB,uBACA,iBACA,kBACA,yBACA,+FAEA,oBAGE,cACA,mCAGF,UACE,uBAIJ,aACE,WACA,cAIJ,oBACE,UACA,cZnHsB,SYqHtB,kBACA,uBACA,eACA,2BACA,2CACA,2DAEA,aAGE,qCACA,4BACA,2CACA,oBAGF,mCACE,uBAGF,aACE,6BACA,eACA,qBAGF,aZ3JwB,gCY+JxB,QACE,uEAGF,mBAGE,uBAGF,aZ7JsB,sFYgKpB,aAGE,qCACA,6BAGF,mCACE,gCAGF,aACE,6BACA,8BAGF,aZ5LsB,uCY+LpB,aACE,wBAKN,sBACE,0BACA,yBACA,kBACA,YACA,8BAEA,yBACE,mBAKN,aZtMwB,SYwMtB,kBACA,uBACA,eACA,gBACA,eACA,cACA,iBACA,UACA,2BACA,2CACA,0EAEA,aAGE,qCACA,4BACA,2CACA,yBAGF,mCACE,4BAGF,aACE,6BACA,eACA,0BAGF,aZnPwB,qCYuPxB,QACE,sFAGF,mBAGE,gBAIJ,iBACE,uBACA,YAGF,WACE,cACA,qBACA,QACA,SACA,kBACA,+BAEA,kBAEE,mBACA,oBACA,kBACA,mBACA,iBAKF,WACE,uCAIJ,MACE,kBACA,CZ/SU,sEYsTZ,aZtTY,uBY0TZ,aZ3Tc,4DYiUV,4CACE,CADF,oCACE,8DAKF,6CACE,CADF,qCACE,6BAKN,aACE,gBACA,qBACA,mCAEA,UZrVM,0BYuVJ,eAIJ,aACE,eACA,gBACA,uBACA,mBACA,iBAEA,aACE,wBACA,sBAIA,cACA,gBAKA,yCAPF,WACE,CAEA,gBACA,uBACA,gBACA,mBAWA,CAVA,mBAGF,aACE,CACA,cAKA,8BAIA,yBACE,sBAIJ,SACE,YACA,eACA,iBACA,uBACA,mBACA,gBACA,CAME,sDAGF,cACE,YACA,kBACA,oBACA,qBAKN,eACE,wBAGF,cACE,eAGF,iBACE,WACA,YACA,aACA,mBACA,uBACA,sBACA,6CAEA,cZxX4B,eAEC,0DYyX3B,sBACA,CADA,gCACA,CADA,kBACA,4BAGF,iBACE,qEAGF,YACE,iBAIJ,iBACE,WACA,YACA,aACA,mBACA,uBACA,qBAEA,cZhZ4B,eAEC,WYiZ3B,YACA,sBACA,CADA,gCACA,CADA,kBACA,WAIJ,oBACE,oBAGF,YACE,kBACA,2BAGF,+BACE,mBACA,SACA,gBAGF,kBZ1c0B,cY4cxB,kBACA,uCACA,mBAEA,eACE,uBAIJ,iBACE,QACA,SACA,2BACA,4BAEA,UACE,gBACA,2BACA,0BZ9dsB,2BYkexB,WACE,iBACA,uBACA,yBZresB,8BYyexB,QACE,iBACA,uBACA,4BZ5esB,6BYgfxB,SACE,gBACA,2BACA,2BZnfsB,wBYyfxB,cACE,iBACA,cACA,iBACA,sBACA,qBACA,mBZ/fsB,cARb,gBY0gBT,uBACA,mBACA,yFAEA,kBZrgBsB,cADA,UY2gBpB,sCAKN,aACE,iBACA,gBACA,QACA,gBACA,aACA,yCAEA,eACE,mBZzhBsB,cY2hBtB,kBACA,mCACA,gBACA,kBACA,sDAGF,OACE,wDAIA,UACE,8CAIJ,cACE,iBACA,cACA,iBACA,sBACA,qBACA,mBZljBsB,cARb,gBY6jBT,uBACA,mBACA,oDAEA,SACE,oDAGF,kBZ5jBsB,cADA,iBYokB1B,qBACE,iBAIA,sBACA,cZ7jBsB,oBYgkBtB,cACE,gBACA,mBACA,kBACA,mBAGF,cACE,mBACA,iBAIJ,aAEE,gBACA,qCAGF,cACE,SACE,iBAGF,aAEE,CAEA,gBACA,yCAEA,iBACE,uCAGF,kBACE,qDAKF,gBAEE,kBACA,YAKN,qBACE,aACA,mBACA,cACA,gBACA,iBAGF,aACE,cACA,CACA,sBACA,WZ3pBM,qBY6pBN,kBACA,eACA,gBACA,gCACA,2BACA,mDACA,qBAEA,eACE,eACA,qCTxoBA,6GADF,kBSgpBI,4BACA,kHT5oBJ,kBS2oBI,4BACA,wBAIJ,+BACE,cZlqBsB,sBYsqBxB,eACE,aACA,2BAGF,aACE,eACA,kBAIJ,iBACE,yBAEA,iBACE,SACA,UACA,mBZvrBsB,yBYyrBtB,gBACA,kBACA,eACA,gBACA,iBACA,WZhtBI,mDYqtBR,oBACE,aAGF,iBACE,kBACA,cACA,iCACA,mCAEA,eACE,yBAGF,YAVF,cAWI,oBAGF,YACE,sBACA,qBAGF,aACE,kBACA,iBACA,yBAKF,uBADF,YAEI,gBAIJ,oBACE,kBACA,eACA,6BACA,SACA,UACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,0CACA,wCACA,iCAGF,QACE,mBACA,WACA,YACA,gBACA,UACA,kBACA,UACA,yBAGF,kBACE,WACA,wBACA,qBAGF,UACE,YACA,UACA,mBACA,yBZjxBW,qCYmxBX,sEAGF,wBACE,4CAGF,wBZjxB0B,+EYqxB1B,wBACE,2BAGF,iBACE,WACA,YACA,MACA,SACA,gBACA,mBACA,cACA,SACA,UACA,6BACA,CAKA,uEAFF,SACE,6BAeA,CAdA,sBAGF,iBACE,WACA,YACA,MACA,SACA,gBACA,mBACA,cACA,WAGA,8CAGF,SACE,qBAGF,iBACE,QACA,SACA,WACA,YACA,yBACA,kBACA,yBACA,sBACA,yBACA,sCACA,4CAGF,SACE,qBZ70BwB,yDYi1B1B,kBZ11Ba,2BYg2Bb,iBACE,gBACA,cAGF,aACE,kBAGF,kBZz2Ba,cY22BX,oBAEA,aZr2BwB,oBYy2BxB,aZ51BsB,yBYg2BtB,0BACE,CADF,uBACE,CADF,kBACE,kDAKA,sBACA,cACA,wDAEA,kBACE,8DAGF,cACE,sDAGF,aZl3BoB,eYo3BlB,0DAEA,aZt3BkB,0BYw3BhB,sDAIJ,oBACE,cZ34BkB,sMY84BlB,yBAGE,0BAKN,aACE,UACA,mCACA,CADA,0BACA,gBACA,6BAEA,cACE,yBACA,cZ95BkB,aYg6BlB,gBACA,gCACA,sCAGF,oDACE,YACE,uCAIJ,oDACE,YACE,uCAIJ,yBA3BF,YA4BI,yCAGF,eACE,aACA,iDAEA,aZz7BkB,qBYg8BxB,oBACE,kBACA,eACA,iBACA,gBACA,mBZ58BW,gBY88BX,iBACA,qBAGF,eACE,gBACA,2BAEA,iBACE,aACA,wBAGF,kBACE,yBAGF,oBACE,gBACA,yBACA,yBACA,eAIJ,aZh+BwB,uBYk+BtB,CACA,WACA,CADA,+BACA,sBACA,cACA,oBACA,mBACA,cACA,WACA,0CAEA,UZ5/BM,4BAkBkB,qCGKtB,yDADF,cS6+BE,sBAGF,aZ7/BW,gCY+/BT,sDAEA,aZjgCS,4BASa,mDYggC1B,uBACE,YACA,6CACA,uBACA,sBACA,WACA,0DAEA,sBACE,0DAIJ,uBACE,2BACA,gDAGF,aZtgCwB,6BYwgCtB,uDAGF,aZvhC0B,yDY2hC1B,aACE,YAGF,aACE,cZphCsB,6BYshCtB,SACA,kBACA,kBACA,oBACA,SACA,aACA,sBACA,WACA,WACA,qBACA,kBAEA,kBACE,WAIJ,+BACE,oBAGF,gBACE,qEAGF,4BACE,gCAGF,eACE,kBACA,MACA,QACA,YACA,kBACA,YAEA,mBACA,yBACA,eACA,aAEA,wCAEA,UZ/hCsB,mBYiiCpB,aACA,sBACA,mBACA,uBACA,mBACA,8BACA,wBACA,gCACA,uCAGF,wBACE,kBACA,WACA,YACA,eACA,cZlmCoB,yBYomCpB,aACA,uBACA,mBACA,sCAGF,mBACE,6CAEA,8BACE,WAKN,oBACE,UACA,oBACA,kBACA,cACA,SACA,uBACA,eACA,oBAGF,aZhnCwB,eYknCtB,gBACA,yBACA,iBACA,kBACA,QACA,SACA,+BACA,yBAEA,aACE,WACA,CACA,0BACA,oBACA,mBACA,4BAIJ,iBACE,QACA,SACA,+BACA,WACA,YACA,sBACA,6BACA,CACA,wBACA,kBACA,2CAGF,2EACE,CADF,mEACE,8CAGF,4EACE,CADF,oEACE,qCAGF,GACE,sBACE,KAGF,2BACE,KAGF,2BACE,KAGF,yBACE,IAGF,wBACE,EArBF,4BAGF,GACE,sBACE,KAGF,2BACE,KAGF,2BACE,KAGF,yBACE,IAGF,wBACE,uCAIJ,GACE,wBACE,KAGF,0BACE,KAGF,2BACE,KAGF,uBACE,IAGF,sBACE,EAtBA,6BAIJ,GACE,wBACE,KAGF,0BACE,KAGF,2BACE,KAGF,uBACE,IAGF,sBACE,mCAIJ,GACE,OACE,SACA,yBACA,KAGF,wBACE,KAGF,UACE,YACA,6BACA,kBACA,UACA,IAGF,UACE,YACA,eACA,UACA,6BACA,EA5BA,yBAIJ,GACE,OACE,SACA,yBACA,KAGF,wBACE,KAGF,UACE,YACA,6BACA,kBACA,UACA,IAGF,UACE,YACA,eACA,UACA,6BACA,kCAIJ,GACE,gBACA,aACA,aAPE,wBAIJ,GACE,gBACA,aACA,6BAGF,KACE,OACA,WACA,YACA,kBACA,YACA,2BAEA,YACE,SACA,QACA,WACA,YACA,mBACA,6BAGF,mBACE,yBAGF,YACE,0BAGF,aACE,uBACA,WACA,YACA,SACA,iCAEA,oBACE,0BACA,kBACA,iBACA,WZ3yCE,gBY6yCF,eACA,+LAMA,yBACE,mEAKF,yBACE,iBAMR,aACE,iBACA,mEAGF,aZtzCwB,qBY0zCtB,mBACA,gBACA,sBACA,gBAGF,aACE,iBACA,uBAGF,eACE,8BAGF,aZz0CwB,eY20CtB,cACA,gBACA,gBACA,uBAGF,qBACE,sBAGF,WACE,8BAGF,GACE,kBACE,+BACA,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,oBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,kBACE,2CACA,CADA,kCACA,EA3BF,qBAGF,GACE,kBACE,+BACA,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,oBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,kBACE,2CACA,CADA,kCACA,iBAIJ,0DACE,CADF,kDACE,cAGF,kBACE,0BACA,aACA,YACA,uBACA,OACA,UACA,kBACA,MACA,kBACA,WACA,aACA,gBAEA,mBACE,oBAIJ,WACE,aACA,aACA,sBACA,kBACA,YACA,0BAGF,iBACE,MACA,QACA,SACA,OACA,WACA,kBACA,mBZn6CW,kCYq6CX,uBAGF,MACE,aACA,mBACA,uBACA,cZp6CwB,eYs6CxB,gBACA,0BACA,kBACA,qCAGF,SACE,oBACA,CADA,WACA,cAGF,wBZh7C0B,WYk7CxB,kBACA,MACA,OACA,aACA,qBAGF,iBACE,aAGF,iBACE,cACA,aACA,WACA,yBZj8CwB,kBYm8CxB,cACA,UACA,WACA,eAGF,YACE,gCACA,CACA,iBACA,qBAEA,kBACE,UACA,uBAGF,aACE,CACA,sBACA,kBACA,eACA,uBAGF,oBACE,mBZ79CsB,kBY+9CtB,cACA,eACA,wBACA,wBAGF,aACE,CACA,0BACA,gBACA,8BAEA,eACE,aACA,2BACA,8BACA,uCAGF,cACE,cZr/CkB,kBYu/ClB,+BAGF,aZ1/CoB,eY4/ClB,mBACA,gBACA,uBACA,kBACA,gBACA,YACA,iCAEA,UZphDE,qBYshDA,oHAEA,yBAGE,yCAKN,QACE,uBAIJ,kBACE,6BAEA,kBACE,oDAGF,eACE,6DAGF,UZhjDI,oBYyjDN,kBACA,cACA,2BAGF,eACE,UAGF,iBACE,cAEA,WACE,WACA,sCACA,CADA,6BACA,cAGF,cACE,iBACA,cZ5jDsB,gBY8jDtB,gBAEA,aZ/jDsB,0BYikDpB,sBAEA,oBACE,gBAIJ,qBACE,4BAKN,GACE,cACA,eACA,WARI,mBAKN,GACE,cACA,eACA,2CCrmDF,u+KACE,uCAEA,u+KACE,CAOA,8MAMF,okBACE,UClBJ,YACE,gCACA,cACA,qBACA,iCAEA,aACE,cACA,cdUoB,gBcRpB,qBACA,eACA,gBAGF,WACE,UACA,yCAEA,8CAEA,WACE,iBACA,mBAKN,YACE,0BAGF,UACE,iBACA,kBACA,kBAGF,gBd0BwB,wBG9DtB,4BACA,kBWqCA,eACA,yBAEA,oBACE,sBACA,iBACA,4BX3CF,eWiDE,2DAHF,gBdesB,wBG9DtB,4BACA,CWgDE,iBAOE,CANF,+BXjDF,UWqDI,CACA,qBACA,mCAGF,aACE,kBACA,QACA,SACA,+BACA,WdhEE,6BckEF,gBACA,eACA,0BAKN,iBACE,WACqB,sCXpErB,+BANA,UW8EuB,sCXxEvB,gEWsEA,gBdfsB,wBG9DtB,4BWyFE,CXlFF,iCANA,UWmFuB,sCX7EvB,kBW+EE,SACA,QACA,UACA,wBAIJ,WACE,aACA,mBACA,2BAGF,aACE,mBACA,sBAGF,YACE,cd3EsB,6Bc8EtB,eACE,CAII,kMADF,eACE,wBAKN,eACE,cACA,0BACA,yFAEA,oBAGE,sBAKN,4BACE,gCACA,iBACA,gBACA,cACA,aACA,4BAGF,YACE,cACA,iBACA,kBACA,2BAGF,oBACE,gBACA,cACA,8BACA,eACA,oCACA,uCAEA,aACE,kCAGF,+BACE,gCAGF,aACE,yBACA,eACA,cdtJoB,kCc0JtB,aACE,eACA,gBACA,Wd7KI,CckLA,2NADF,eACE,gCAKN,adrKwB,oBc0K1B,iBACE,mDAEA,aACE,mBACA,gBACA,4BAIJ,UACE,kBACA,wBAGF,gBACE,qBACA,eACA,cd9LsB,ecgMtB,kBACA,4BAEA,adjMwB,6BcqMxB,aACE,gBACA,uBACA,iBAIJ,kBACE,6BACA,gCACA,aACA,mBACA,eACA,kDAGF,aAEE,kBACA,yBAGF,kBACE,aACA,2BAGF,adlOwB,ecoOtB,cACA,gBACA,mBACA,kDAIA,kBACE,oDAIA,SX5MF,sBACA,WACA,YACA,gBACA,oBACA,mBHhDW,cAOW,eG4CtB,SACA,+EWsMI,aACE,CXvMN,qEWsMI,aACE,CXvMN,yEWsMI,aACE,CXvMN,gEWsMI,aACE,sEAGF,QACE,yLAGF,mBAGE,0DAGF,kBACE,qCAGF,mDArBF,cAsBI,yDAIJ,ad5PoB,iBc8PlB,eACA,4DAGF,gBACE,wDAGF,kBACE,gEAEA,cACE,iNAEA,kBAGE,cACA,gHAKN,adnSoB,0HcwSpB,cAEE,gBACA,cd7RkB,kZcgSlB,aAGE,gEAIJ,wBACE,iDAGF,edzUI,kBGkEN,CAEA,eACA,cHrDsB,uCGuDtB,UWoQI,mBd1ToB,oDGwDxB,wBACE,cH1DoB,eG4DpB,gBACA,mBACA,oDAGF,aACE,oDAGF,kBACE,oDAGF,eACE,cHjFS,sDcsUT,WACE,mDAGF,ad1US,kBc4UP,eACA,8HAEA,kBAEE,iCAON,kBACE,mBAIJ,UdtWQ,kBcwWN,cACA,mBACA,sBd3WM,yBc6WN,eACA,gBACA,YACA,kBACA,WACA,yBAEA,SACE,6BAIJ,YACE,eACA,gBACA,wBAGF,WACE,sBACA,cACA,kBACA,kBACA,gBACA,WACA,+BAEA,iBACE,QACA,SACA,+BACA,eACA,sDAIJ,kBAEE,gCACA,eACA,aACA,cACA,oEAEA,kBACE,SACA,SACA,6HAGF,aAEE,cACA,cdjZoB,ecmZpB,eACA,gBACA,kBACA,qBACA,kBACA,yJAEA,adzZsB,qWc4ZpB,aAEE,WACA,kBACA,SACA,SACA,QACA,SACA,2BACA,CAEA,4CACA,CADA,kBACA,CADA,wBACA,iLAGF,WACE,6CACA,8GAKN,kBACE,gCACA,qSAKI,YACE,iSAGF,4CACE,sBAQR,sBACA,mBACA,6BACA,gCACA,+BAEA,iBACE,iBACA,cdjcoB,CcocpB,eACA,eACA,oCAEA,aACE,gBACA,uBACA,oCAIJ,UACE,kBACA,uDAGF,iBACE,qDAGF,eACE,2BAIJ,ad3ewB,ec6etB,gBACA,gBACA,kBACA,qBACA,6BAEA,kBACE,wCAEA,eACE,6BAIJ,aACE,0BACA,mCAEA,oBACE,kBAKN,eACE,2BAEA,UACE,8FAEA,8BAEE,CAFF,sBAEE,wBAIJ,iBACE,SACA,UACA,yBAGF,eACE,aACA,kBACA,mBACA,6BAEA,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,uBAIJ,iBACE,mBACA,YACA,gCACA,+BAEA,aACE,cACA,WACA,iBACA,gDAEA,kBACE,yBACA,wBAKN,YACE,uBACA,gBACA,iBACA,iCAEA,YACE,mBACA,iBACA,gBACA,8CAEA,wBACE,kBACA,uBACA,YACA,yCAGF,YACE,8BAIJ,WACE,4CAEA,kBACE,wCAGF,UACE,YACA,iCAGF,cACE,iBACA,Wd/mBA,gBcinBA,gBACA,mBACA,uBACA,uCAEA,aACE,eACA,cdxmBc,gBc0mBd,gBACA,uBACA,gCAKN,aACE,uBAIJ,eACE,cACA,iDAGE,qBACA,Wd5oBE,gDcgpBJ,QACE,6BACA,kDAEA,aACE,yEAGF,uBACE,4DAGF,ad3pBU,yBciqBd,cACE,gCAEA,cACE,cdtpBkB,ecwpBlB,kCAEA,oBACE,cd3pBgB,qBc6pBhB,iBACA,gBACA,yCAEA,eACE,WdlrBF,SeFR,YACE,gCACA,8BAEA,aACE,cACA,WfJI,qBeMJ,eACA,gBACA,kBAIJ,YACE,iBAGF,WACE,aACA,mBACA,mCCrBF,GACE,sBACE,KAGF,2BACE,KAGF,4BACE,KAGF,2BACE,IAGF,yBACE,EDGF,0BCrBF,GACE,sBACE,KAGF,2BACE,KAGF,4BACE,KAGF,2BACE,IAGF,yBACE,qCAIJ,GACE,yBACE,KAGF,yBACE,KAGF,4BACE,KAGF,wBACE,IAGF,sBACE,EAtBA,2BAIJ,GACE,yBACE,KAGF,yBACE,KAGF,4BACE,KAGF,wBACE,IAGF,sBACE,gCAIJ,cACE,kBAGF,iBACE,cACA,eACA,iBACA,qBACA,gBACA,iBACA,gBACA,wBAEA,SACE,4BAGF,UACE,YACA,gBACA,sBAGF,cACE,iBACA,sBACA,CADA,gCACA,CADA,kBACA,qEAGF,kBACE,qBACA,sGAEA,eACE,qEAIJ,eAEE,qJAEA,kBAEE,mXAGF,eACE,mBACA,qJAGF,eACE,gBACA,2EAGF,eACE,+NAGF,eACE,2FAGF,iBACE,8BACA,chB9FkB,mBgBgGlB,qHAEA,eACE,2JAIJ,eACE,mJAGF,iBACE,6EAGF,iBACE,eACA,6EAGF,iBACE,qBACA,qJAGF,eACE,6JAEA,QACE,2EAIJ,oBACE,2EAGF,uBACE,oBAIJ,ahB9Ic,qBgBgJZ,0BAEA,yBACE,8BAEA,aACE,kCAKF,oBACE,uCAEA,yBACE,wBAKN,ahBlJoB,4CgBuJtB,YACE,8EAEA,aACE,mCAIJ,aACE,oDAEA,ahB5LQ,egB8LN,iDAIJ,kBACE,uDAEA,kBACE,qBACA,gCAKN,oBACE,kBACA,mBACA,YACA,chB3MW,gBgB6MX,eACA,cACA,yBACA,oBACA,eACA,sBACA,sCAEA,kBACE,qBACA,+DAGF,oBACE,iBACA,sBACA,kBACA,eACA,oBACA,2GAKF,oBAGE,4BAIJ,ahBvNwB,SgByNtB,kBACA,kBACA,oBACA,SACA,aACA,sBACA,WACA,WACA,gCACA,+BAGF,UACE,kBACA,mDAGF,iBAEE,gCAGA,qEAEA,eACE,kBAKF,SACE,mBACA,kDAEA,kBACE,wDAEA,sBACE,iFAIJ,kBAEE,SAKN,iBACE,kBACA,YACA,gCACA,eACA,UAaA,mCACA,CADA,0BACA,wDAZA,QAPF,kBAUI,0BAGF,GACE,aACA,WALA,gBAGF,GACE,aACA,uDAMF,cAEE,kCAGF,kBACE,4BACA,sCAIA,ahB1SoB,qCgB8SpB,ahBnUS,6BgBuUT,ahBhUoB,CAPX,kEgB+UT,ahB/US,kCgBkVP,ahBzUoB,gEgB6UpB,UhB/VE,mBAgBgB,sEgBmVhB,kBACE,mBAMR,uBACE,sBACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,yCAEA,aACE,kBACA,OACA,QACA,MACA,SACA,6FACA,oBACA,WACA,2DAGF,oBACE,oCAGF,WACE,gBACA,uBACA,cACA,0CAEA,UACE,kBACA,MACA,gBACA,6DACA,oBACA,4CAGF,oBACE,gDAGJ,oDACE,mEAEF,oDACE,0CAGF,eACE,6DAGF,kBACE,gCAIJ,mBACE,+CAKF,sBACE,qEAEA,aACE,wBAKN,oBACE,YACA,ChBrZsB,cgBuZtB,iBACA,mBACA,CACA,sBACA,8CANA,ahBrZsB,CgByZtB,eAOA,8CAGF,aACE,eACA,eAGF,YACE,8BACA,eACA,oBAEA,sBACE,gBACA,2CAGF,oBACE,sBAIJ,YACE,mBACA,WACA,chB1bsB,iIgB6btB,gBAGE,kBACA,0EAGF,yBACE,yEAMA,0CACE,CADF,kCACE,2EAKF,2CACE,CADF,mCACE,wBAKN,YACE,mBACA,2BACA,mBAGF,+BACE,aACA,6CAEA,uBACE,OACA,gBACA,4DAEA,eACE,8DAGF,SACE,mBACA,qHAGF,cAEE,gBACA,4EAGF,cACE,0BAKN,kBACE,aACA,cACA,uBACA,aACA,kBAGF,gBACE,mBACA,iBACA,chBtgBsB,CgBwgBtB,iBACA,eACA,kBACA,+CAEA,ahB7gBsB,uBgBihBtB,aACE,gBACA,uBACA,qBAIJ,kBACE,aACA,eACA,8BAEA,mBACE,kBACA,mBACA,yDAEA,gBACE,qCAGF,oBACE,WACA,eACA,gBACA,chB1iBkB,4BgBgjBxB,iBACE,8BAGF,cACE,cACA,uCAGF,aACE,aACA,mBACA,uBACA,kBACA,kBAGF,kBACE,kBACA,wBAEA,YACE,eACA,8BACA,uBACA,uFAEA,SAEE,mCAIJ,cACE,iBACA,6CAEA,UACE,YACA,gBACA,+DAIJ,cAEE,wBAIJ,eACE,chBnmBsB,egBqmBtB,iBACA,8BAGF,kBACE,6BACA,gCACA,aACA,mBACA,eACA,wBAGF,aACE,qBACA,uDAGF,oBAEE,gBACA,eACA,gBACA,6JAGF,oBAME,4DAKA,UhBxqBM,kBgB8qBN,UACE,iKAQF,yBACE,+BAIJ,aACE,gBACA,uBACA,0DAGF,aAEE,sCAGF,kBACE,gCAGF,ahB1rB0B,cgB4rBxB,iBACA,mBACA,gBACA,2EAEA,aAEE,uBACA,gBACA,uCAGF,cACE,WhB1tBI,kCgB+tBR,UACE,kBACA,iBAGF,SACE,kBACA,YACA,WACA,ChB1sBsB,8IgBqtBtB,ahBrtBsB,wBgBytBtB,UACE,wCAGF,kBhB7tBsB,cArBX,8CgBsvBT,kBACE,qBACA,+DAOJ,yBACE,cAIJ,YACE,eACA,yBACA,kBACA,chBnvBsB,gBgBqvBtB,qBACA,gBACA,uBAEA,QACE,OACA,kBACA,QACA,MAIA,iDAHA,YACA,uBACA,mBAUE,CATF,0BAEA,yBACE,kBACA,iBACA,cAIA,sDAGF,cAEE,chB5xBoB,uBgB8xBpB,SACA,cACA,qBACA,eACA,iBACA,sMAEA,UhBtzBE,yBgB6zBJ,cACE,kBACA,YACA,+DAGF,aACE,eAKN,cACE,qBAEA,kBACE,oBAIJ,cACE,cACA,qBACA,WACE,YACA,SACA,2BAIF,UACE,YACA,qBAIJ,aACE,gBACA,kBACA,chBp1BsB,gBgBs1BtB,uBACA,mBACA,qBACA,uBAGF,aACE,gBACA,2BACA,2BAGF,ahBl2BwB,oBgBs2BxB,aACE,eACA,eACA,gBACA,uBACA,mBACA,qBAGF,cACE,mBACA,kBACA,yBAEA,cACE,kBACA,yBACA,QACA,SACA,+BACA,yBAIJ,aACE,6CAEA,UACE,mDAGF,yBACE,6CAGF,mBACE,sBAIJ,oBACE,kCAEA,QACE,4CAIA,oBACA,0CAGF,kBACE,0CAGF,aACE,6BAIJ,wBACE,2BAGF,yBACE,cACA,SACA,WACA,YACA,oBACA,CADA,8BACA,CADA,gBACA,sBACA,wBACA,kBAGF,YACE,eACA,yBACA,kBACA,gBACA,gBACA,wBAEA,aACE,chB76BoB,iBgB+6BpB,eACA,+BACA,aACA,sBACA,mBACA,uBACA,eACA,4BAEA,aACE,wBAIJ,eACE,CACA,qBACA,aACA,sBACA,uBACA,2BAEA,aACE,cACA,0BAGF,oBACE,chB38BkB,gBgB68BlB,gCAEA,yBACE,0BAKN,QACE,eACA,iDAEA,SACE,cACA,8BAGF,ahB99BoB,oCgBo+BxB,cACE,cACA,SACA,uBACA,UACA,kBACA,oBACA,oFAEA,yBAEE,6BC/gCJ,kBACE,aAGF,iBACE,8BACA,oBACA,aACA,sBAGF,cACE,MACA,OACA,QACA,SACA,0BACA,wBAGF,cACE,MACA,OACA,WACA,YACA,aACA,sBACA,mBACA,uBACA,2BACA,aACA,oBACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,oBAGF,mBACE,aACA,aACA,6CAGF,kBjBvB0B,cARb,kBiBoCX,gBACA,aACA,sBACA,0BAGF,WACE,WACA,gBACA,iBACA,8DAEA,UACE,YACA,sBACA,aACA,sBACA,mBACA,uBACA,aACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,oBAIJ,WACE,WACA,gBACA,iBACA,kBACA,wBAEA,iBACE,MACA,OACA,WACA,YACA,sBACA,aACA,aACA,CAGA,YACA,UACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,2CANA,qBACA,mBACA,uBAaF,CATE,mBAIJ,YACE,CAGA,iBACA,qCAGF,kBACE,UACE,YACA,gBACA,0BAGF,UACE,YACA,eACA,gBACA,cACA,oDAIJ,aAEE,mBACA,aACA,aACA,2DAEA,cACE,uLAGF,ajBpGsB,SiBuGpB,eACA,gBACA,kBACA,oBACA,YACA,aACA,kBACA,6BACA,+mBAEA,aAGE,yBACA,qiBAGF,ajB7IS,qwDiBiJP,aAGE,sBAMR,sBACE,yBAGF,aACE,aACA,mBACA,uBACA,wBAGF,UACE,YACA,mBACA,mBACA,aACA,eACA,8BAEA,kBACE,+BAGF,cACE,mBACA,kCAIJ,mBACE,CACA,mBACA,0EAEA,mBACE,yBAIJ,cACE,iBACA,4BAEA,cACE,gBACA,cjBvMS,mBiByMT,2BAGF,ajBnMwB,kGiBsMtB,aAGE,2CAIJ,aACE,2BAGF,cACE,cjBtMoB,gBiBwMpB,mBACA,sCAEA,eACE,kCAGF,eACE,mBjBrOO,cAQa,kBiBgOpB,eACA,gBACA,CAII,2NADF,eACE,oCAOV,WACE,UACA,mCAME,mBACA,mBACA,sCAEA,cACE,iBACA,kBACA,qCAGF,eACE,oCAIJ,kBACE,mBACA,kBACA,eAIJ,iBACE,eACA,mBACA,sBAEA,eACE,cjBzRS,kBiB2RT,yBACA,eACA,qBAGF,kBjBhSW,cAQa,gBiB2RtB,aACA,kBACA,6HAQF,eACE,qJAGF,kBACE,cjB1SsB,mBiB4StB,kBACA,aACA,kBACA,eACA,sCACA,yPAEA,iBACE,mBACA,qNAGF,mBACE,gBACA,4CAMJ,YACE,mBACA,gDAEA,UACE,cACA,4DAEA,aACE,2DAGF,cACE,kDAGF,iBACE,uDAIJ,eACE,sDAIJ,UjB3WM,2DiBgXR,0BACE,cACE,iBACA,qJAGF,cAIE,mBACA,4CAGF,kBACE,sDAGF,WACE,eACA,mBAIJ,oBACE,eACA,gBACA,iBACA,uHAGF,kBAOE,cjB7YW,kBiB+YX,gBACA,eACA,YACA,kBACA,sBACA,+SAEA,ajBjYsB,YiBmYpB,eACA,WACA,eACA,gBACA,uSAGF,YACE,uPAGF,WACE,WACA,+WAGF,aACE,wBAKF,ejBvbM,CAiBkB,gBiByatB,oBACA,iEjB3bI,2BAiBkB,qDiBkb1B,iBAEE,aACA,qEAEA,wBACE,CADF,qBACE,CADF,oBACE,CADF,gBACE,gBACA,kKAIJ,YAKE,8BACA,mBjBncwB,aiBqcxB,iBACA,0LAEA,aACE,iBACA,cjB7boB,mBiB+bpB,kNAGF,aACE,6DAIJ,cAEE,yDAGF,WAEE,eACA,0BAGF,gBAEE,sDAGF,qBAEE,eAGF,UACE,gBACA,0BAGF,YACE,6BACA,qCAEA,yBAJF,cAKI,gBACA,iDAIJ,qBAEE,UACA,qCAEA,+CALF,UAMI,sDAIJ,aAEE,gBACA,gBACA,gBACA,kBACA,2FAEA,ajBzgBwB,qCiB6gBxB,oDAZF,eAaI,sCAKF,4BADF,eAEI,yBAIJ,YACE,+BACA,gBACA,0BAEA,cACE,iBACA,mBACA,sCAGF,aACE,sBACA,WACA,CACA,ajBhjBS,gBATL,aiB4jBJ,oBACA,eACA,YACA,CACA,SACA,kBACA,yBACA,iBACA,gBACA,gBACA,4CAEA,wBACE,+CAGF,ejB5kBI,yBiB8kBF,mBACA,kBACA,6DAEA,QACE,gBACA,gBACA,mEAEA,QACE,0DAIJ,ajBnlBO,oBiBqlBL,eACA,gBjB/lBA,+CiBomBJ,YACE,8BACA,mBACA,4CAIJ,aACE,cjBnmBS,eiBqmBT,gBACA,mBACA,wCAGF,eACE,mBACA,+CAEA,ajB9mBS,eiBgnBP,qCAIJ,uBAnFF,YAoFI,eACA,QACA,wCAEA,iBACE,iBAKN,eAWE,eACA,wBAXA,eACE,iBACA,uBAGF,aACE,gBACA,2CAMF,eACE,mBAGF,eACE,cACA,gBACA,+BAEA,4BACE,4BAGF,QACE,oCAIA,ajB/pBO,aiBiqBL,kBACA,eACA,mBACA,qBACA,8EAEA,eAEE,yWAOA,kBjBvqBgB,WAlBlB,iJiBgsBA,iBAGE,oMAUR,aACE,iIAIJ,4BAIE,cjBxrBsB,eiB0rBtB,gBACA,6cAEA,aAGE,6BACA,uCAIJ,iBACE,mBACA,oBACA,eAEA,yFAEA,qBACE,qGAIJ,YAIE,eACA,iIAEA,eACE,CAII,w1BADF,eACE,sDAMR,iBAEE,oDAKA,eACE,0DAGF,eACE,mBACA,aACA,mBACA,wEAEA,ajBzwBS,CiB2wBP,gBACA,uBAKN,YACE,2CAEA,QACE,WACA,cAIJ,UACE,eACA,gBACA,iBAEA,YACE,gBACA,eACA,kBACA,sCAGF,YACE,4CAEA,kBACE,yDAGF,SACE,sBACA,cACA,WACA,YACA,aACA,gDACA,mBjBpzBO,WATL,eiBg0BF,CACA,eACA,kBACA,2EAEA,QACE,wMAGF,mBAGE,+DAGF,kBACE,qCAGF,wDA7BF,cA8BI,4DAIJ,WACE,eACA,gBACA,SACA,kBACA,cAKN,iBACE,YACA,gBACA,YACA,aACA,uBACA,mBACA,gBjB12BM,yDiB62BN,aAGE,gBACA,WACA,YACA,SACA,sBACA,CADA,gCACA,CADA,kBACA,gBjBr3BI,uBiBy3BN,iBACE,YACA,aACA,+BACA,iEACA,kBACA,wCACA,uBAGF,iBACE,WACA,YACA,MACA,OACA,uBAGF,iBACE,YACA,WACA,UACA,YACA,4BACA,6BAEA,UACE,8BAGF,UjBt5BI,eiBw5BF,gBACA,cACA,kBACA,2BAGF,iBACE,mCACA,qCAIJ,oCACE,eAEE,uBAGF,YACE,wBAKN,gBACE,sCAEA,eACE,gCAGF,eACE,qDAGF,ajBl7BW,iDiBs7BX,YACE,0DAEA,YACE,0BAIJ,YACE,iBACA,uBACA,kDAGF,ajB/6BsB,qBiBi7BpB,wDAEA,yBACE,WCp9BN,YACE,kCAEA,iBACE,MACA,QACA,oIAEA,+BAEE,oBAKN,cACE,uBACA,eACA,gBACA,clBasB,4CkBVtB,alBjBY,sCkBsBd,2CACE,oBAGF,QACE,wBACA,UACA,+CAEA,WACE,mBACA,UACA,0BAGF,aACE,sBACA,SACA,YACA,kBACA,aACA,WACA,UACA,clBvCS,gBATL,ekBmDJ,oBACA,gBACA,qDAEA,alBzBoB,CkBuBpB,2CAEA,alBzBoB,CkBuBpB,+CAEA,alBzBoB,CkBuBpB,sCAEA,alBzBoB,gCkB6BpB,8Cf/CA,uCADF,ceiD4D,0Cf5C5D,ce4C4D,oBAI9D,alBvDa,mBkByDX,mBlBlDsB,oCkBoDtB,iBACA,kBACA,eACA,gBACA,sBAEA,alB5CsB,gBkB8CpB,0BACA,mFAEA,oBAEU,iCAKZ,mBACA,eAEA,gBACA,wCAEA,alB1EwB,sDkB8ExB,YACE,2CAGF,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,gBACA,kBACA,SACA,kBACA,sBACA,kDAEA,oBlBhGsB,qCkBuG1B,eACE,kBACA,aACA,mBlB5GsB,gBkB8GtB,gBACA,cACA,yBAEA,iBACE,gBACA,wCAEA,alB7HS,iCkB+HT,WACE,iBACA,2BAIJ,iBACE,cACA,CACA,cACA,iBACA,clB1IS,qBkB4IT,gBACA,iBACA,qBACA,mBACA,gBACA,gGAEA,kBACE,qBACA,iIAEA,eACE,kJAIJ,eACE,mBACA,2DAGF,eACE,eACA,8BAGF,cACE,wFAGF,eACE,sCAGF,iBACE,8BACA,clBhLO,mBkBkLP,mDAEA,eACE,8DAIJ,eACE,0DAGF,iBACE,+BAGF,iBACE,eACA,2DAGF,eACE,+DAEA,QACE,8BAIJ,oBACE,8BAGF,uBACE,6BAGF,alBjMoB,qBkBmMlB,mCAEA,oEAGE,oBACE,gDAEA,qDAMR,UACE,YACA,gBACA,uDAIJ,iBAEE,WACA,mIAGE,aACE,sBACA,SACA,YACA,0BACA,yBACA,WACA,iBACA,UACA,clB5PO,gBATL,ekBwQF,oBACA,YACA,qBACA,yLAEA,alB/OkB,CkB6OlB,sKAEA,alB/OkB,CkB6OlB,8KAEA,alB/OkB,CkB6OlB,4JAEA,alB/OkB,yKkBmPlB,SACE,qJAGF,kBlBpQoB,+IkBqQpB,8Cf1QF,8JADF,ce4Q8D,kKfvQ9D,ceuQ8D,qCfhQ5D,8TADF,sBeoQM,gBACA,6BAMR,aACE,kBACA,SACA,UACA,WACA,gBACA,2CAEA,aACE,mBACA,WACA,YACA,clB/QoB,ekBiRpB,iBACA,kBACA,WACA,4CAIJ,iBACE,SACA,oCAGF,aACE,kBACA,sBACA,SACA,0BACA,YACA,WACA,clBzTW,mBAQa,sCkBoTxB,eACA,WACA,aACA,6CAGF,aACE,0CAGF,YACE,eACA,kBACA,iMAEA,kBAGa,iKAEb,YAGE,mBACA,mBACA,2BACA,iBACA,eACA,+DAGF,6BACE,qEAEA,aACE,gBACA,uBACA,mBACA,sEAGF,eACE,qEAGF,aACE,iBACA,gBACA,uBACA,mBACA,4EAMA,alB/VkB,wBkBoWxB,eACE,iCAEA,YACE,mBACA,eACA,oBACA,YACA,gBACA,8BAIJ,UACE,WACA,cACA,kCAEA,iBACE,kBACA,aACA,WACA,sBlBzZI,wBkB2ZJ,sBACA,4BACA,gBACA,2CAEA,aACE,kBACA,sBACA,SACA,OACA,SACA,SACA,aACA,WACA,clBvZoB,gFkByZpB,eACA,oBACA,gBACA,UACA,UACA,4BACA,iDAEA,UlBlbE,sEkBobF,WACE,clBpakB,CAjBlB,4DkBobF,WACE,clBpakB,CAjBlB,gEkBobF,WACE,clBpakB,CAjBlB,uDkBobF,WACE,clBpakB,yCkByatB,2EAKE,0CAKN,iFACE,aACA,uBACA,8BACA,UACA,4BACA,8CAEA,aACE,clB5bsB,ekB8btB,gBACA,aACA,oBACA,2JAEA,aAGE,wCAIJ,SACE,kCAIJ,YACE,aACA,clBldsB,gBkBodtB,sCAEA,cACE,kBACA,2CAGF,aACE,gDAEA,aACE,eACA,gBACA,yBACA,qDAGF,iBACE,eACA,kBACA,WACA,WACA,mBlB5dkB,8DkB+dlB,iBACE,MACA,OACA,WACA,kBACA,mBlBhfkB,0BkBuf1B,alBhgBa,oBkBkgBX,eACA,gBlB5gBM,4BkBghBR,YACE,mBACA,0BACA,YACA,aACA,8BACA,cACA,oBAGF,YACE,cACA,sBAEA,oBACE,uBACA,cACA,YACA,iBACA,sBACA,uBAGF,oBACE,aACA,CAEA,oBACA,CADA,6BACA,UACA,QACA,YACA,uBACA,2BAIJ,iBACE,iBACA,0CAKE,yBACE,qCACA,WlB7jBE,mBAkBkB,gBkB8iBpB,8CAGA,yBACE,oCACA,uCAMR,iBACE,kBACA,uCACA,gBlB9kBM,gBkBglBN,uBACA,6CAGF,YACE,mBACA,aACA,clB9kBW,ekBglBX,sDAEA,aACE,clB9jBoB,wEkBikBpB,6EAEA,aACE,clBzlBO,gBkB2lBP,sGAIJ,kBlBtlBwB,WAlBlB,6PkBgnBF,UlBhnBE,0DkBonBN,wCAGF,gBACE,iBACA,mBACA,gBACA,yBACA,cACA,+BAEA,oBACE,SACA,eACA,kBACA,gCAGF,oBACE,aACA,UACA,WACA,kBACA,kCAIA,alB5oBU,CmBFZ,+BAHF,YACE,cACA,kBAUA,CATA,cAKA,kBACA,2BACA,gBAEA,uBAEA,YACE,uBACA,WACA,YACA,iBACA,6BAEA,WACE,gBACA,oBACA,aACA,yBACA,gBACA,oCAEA,0BACE,oCAGF,cACE,YACA,oBACA,YACA,6BAIJ,qBACE,WACA,gBACA,cACA,aACA,sBACA,qCAEA,4BARF,cASI,qBAMR,kBACE,wBACA,CADA,eACA,MACA,UACA,cACA,qCAEA,mBAPF,gBAQI,+BAGF,eACE,qCAEA,6BAHF,kBAII,wHAMJ,WAGE,mCAIJ,YACE,mBACA,uBACA,YACA,CnB7EW,ImB4Fb,aACE,aACA,sBACA,WACA,YACA,CAIA,oBAGF,qBACE,WACA,mBACA,cnBlGwB,emBoGxB,cACA,eACA,SACA,iBACA,aACA,SACA,UACA,2BAEA,yBACE,6BAIJ,kBACE,SACA,oBACA,cnBrHwB,emBuHxB,cACA,eACA,kBACA,UACA,mCAEA,yBACE,wCAGF,kBACE,2BAIJ,oBACE,iBACA,2BAGF,iBACE,kCAGF,cACE,cACA,eACA,aACA,kBACA,QACA,UACA,cAGF,kBACE,WnB5KM,cmB8KN,eACA,aACA,qBACA,2DAEA,kBAGE,oBAGF,SACE,2BAGF,sBACE,cnB7KsB,kGmBgLtB,sBAGE,WnBpME,kCmBwMJ,anBtLsB,oBmB4L1B,oBACE,iBACA,oBAGF,kBnB1Ma,cAqBW,iBmBwLtB,eACA,gBACA,yBACA,eACA,yBAGF,iBACE,cACA,UACA,gCAEA,uCACE,uCAEA,aACE,WACA,kBACA,aACA,OACA,QACA,cACA,UACA,oBACA,YACA,UACA,oFACA,wCAIJ,SACE,kBACA,gBAIJ,YACE,eACA,mBACA,cACA,eACA,kBACA,UACA,UACA,gBACA,uBAEA,QACE,YACA,aACA,cACA,uBACA,aACA,gBACA,uBACA,gBACA,mBACA,OACA,4CAGF,anBlQwB,4CmBuQtB,anBvQsB,0CmByQpB,4CAIJ,SAEE,SAIJ,WACE,kBACA,sBACA,aACA,sBACA,gBACA,wDAEA,SACE,gBACA,gBACA,qBAGF,kBnB1SW,yBmB+Sb,WACE,aACA,cACA,uBAGF,kBACE,iCAGF,iBACE,sEAGF,kBACE,SACA,cnBxTsB,emB0TtB,eACA,eACA,kFAEA,aACE,CAKA,kLAEA,UnBtVI,mBmBwVF,kFAKJ,2BACE,wCAIJ,YACE,oBACA,6BACA,+CAEA,sBAEE,kBACA,eACA,qBACA,0CAGF,eACE,gDAKJ,SACE,6BAGF,eACE,gBACA,gBACA,cnB5WsB,0DmB8WtB,UACA,UACA,kBACA,uCAEA,YACE,WACA,uCAGF,iBACE,gCAGF,QACE,uBACA,SACA,6BACA,cACA,iCAIF,eACE,2CACA,YACE,WACA,mCAKN,kBACE,aACA,mCAIA,anBpZsB,0BmBsZpB,gCAIJ,WACE,4DAEA,cACE,uEAEA,eACE,uBAKN,oBACE,uBACA,gBACA,mBACA,OACA,sBAGF,oBACE,iBACA,6EAGF,anBrawB,mBArBX,kBmB+bX,aACA,eACA,gBACA,eACA,aACA,cACA,mBACA,uBACA,yBACA,4EAdF,cAeI,6FAGF,eACE,mFAGF,anBvcwB,qBmByctB,qGAEA,yBACE,uCAKN,kBACE,aACA,eAGF,qBACE,uCAKA,sBACE,6BACA,qCASF,qCAXA,sBACE,6BACA,sCAgBF,mJAFF,qBAGI,sBAKF,wBACA,aACA,2BACA,mBACA,mBACA,2BAEA,aACE,iCAEA,UACE,kBACA,uCAEA,SACE,kCAKN,aACE,aACA,yBC9hBJ,iBACE,eACA,gBACA,cpB6BsB,mBArBX,eoBLX,aACA,cACA,sBACA,mBACA,uBACA,aACA,qEAGE,aAEE,WACA,aACA,SACA,yCAIJ,gBACE,gCAGF,eACE,uCAEA,aACE,mBACA,cpBDkB,qCoBKpB,cACE,gBACA,kBCtCJ,UACE,cACA,+BACA,0BAEA,UACE,qCAGF,iBATF,QAUI,mBAIJ,qBACE,mBACA,uBAEA,YACE,kBACA,gBACA,gBACA,2BAEA,aACE,WACA,YACA,SACA,oBACA,CADA,8BACA,CADA,gBACA,uBAIJ,YACE,mBACA,mBACA,aACA,6BAEA,aACE,aACA,mBACA,qBACA,gBACA,qCAGF,UACE,eACA,cACA,+BAGF,aACE,WACA,YACA,gBACA,mCAEA,UACE,YACA,cACA,SACA,kBACA,mBACA,oBACA,CADA,8BACA,CADA,gBACA,qCAIJ,gBACE,gBACA,4CAEA,cACE,WrB1EF,gBqB4EE,gBACA,uBACA,0CAGF,aACE,eACA,crBnEc,gBqBqEd,gBACA,uBACA,yBAKN,kBrBnFS,aqBqFP,mBACA,uBACA,gDAEA,YACE,cACA,eACA,mDAGF,qBACE,kBACA,gCACA,WACA,gBACA,mBACA,gBACA,uBACA,qDAEA,YACE,iEAEA,cACE,sDAIJ,YACE,cAOV,kBrBzHa,sBqB4HX,iBACE,4BAGF,aACE,eAIJ,cACE,kBACA,qBACA,cACA,iBACA,eACA,mBACA,gBACA,uBACA,eACA,oEAEA,YAEE,sBAGF,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,8BAEA,oBACE,mBACA,CC/KJ,eAGF,SnBkDE,sBACA,WACA,YACA,gBACA,oBACA,mBHhDW,cAOW,eG4CtB,SACA,cmBxDA,CACA,2BACA,iBACA,eACA,2CAEA,aACE,CAHF,iCAEA,aACE,CAHF,qCAEA,aACE,CAHF,4BAEA,aACE,kCAGF,QACE,6EAGF,mBAGE,sBAGF,kBACE,qCAGF,eA3BF,cA4BI,kCAKF,QACE,qDAGF,mBAEE,mBAGF,iBACE,SACA,WACA,UACA,qBACA,UACA,0BACA,4CACA,eACA,WACA,YACA,ctBtCsB,esBwCtB,oBACA,0BAEA,mBACE,WACA,0BAIJ,sBACE,iCAEA,mBACE,WACA,gCAIJ,QACE,uBACA,ctB/CoB,esBiDpB,uCAEA,uBACE,sCAGF,aACE,yBAKN,atB7DwB,mBsB+DtB,gCACA,kBACA,eACA,gBACA,uBAGF,YACE,ctBrFsB,kBsBuFtB,iBAIA,atB7EsB,mBsB+EpB,gCACA,gBACA,aACA,eACA,eACA,qBAEA,oBACE,iBACA,eAIJ,YACE,mBACA,aACA,gCACA,0BAEA,eACE,qBAGF,aACE,ctBvGkB,gBsByGlB,uBACA,mBACA,4BAEA,eACE,uBAGF,atB/HkB,qBsBiIhB,eACA,gBACA,cACA,gBACA,uBACA,mBACA,qGAKE,yBACE,wBAMR,aACE,eACA,iBACA,gBACA,iBACA,mBACA,gBACA,ctBzJoB,0BsB6JtB,aACE,WACA,2CAEA,oCACE,yBACA,0CAGF,wBACE,WC1LR,yCCCE,qBACA,sBACA,CADA,kBACA,wBACA,WACA,YACA,eAEA,UACE,8BAIJ,exBXQ,kBwBaN,sCACA,kBACA,eACA,UACA,iDAEA,2BACE,2DAGF,UACE,mCAIJ,iBACE,SACA,WACA,eACA,yCAGF,iBACE,UACA,SACA,UACA,gBxBvCM,kBwByCN,sCACA,gBACA,gDAEA,aACE,eACA,SACA,gBACA,uBACA,iKAEA,+BAGE,2DAIJ,WACE,wBAKF,2BACE,eAIJ,aACE,wBACA,UACA,eACA,0CAEA,mBAEE,mBAGF,8BACE,CADF,sBACE,WACA,cACA,SACA,WACA,YACA,0EAMA,SACE,oBACA,CADA,WACA,eChGN,WAEE,0BAGF,kBANW,kBAQT,cACA,iCACA,wBACE,mCAOF,WACE,SACA,UACA,2CAGF,aACE,aAEA,sBACA,YACA,6BACA,6DAGE,oBACE,WACA,iBACA,iBACA,iJAGF,UACE,gEAEF,oBACE,gBACA,WACA,2CAKN,yBACE,sBACA,kBACA,YACA,gBACA,kDAEA,uBACE,CADF,oBACE,CADF,eACE,WACA,YACA,SACA,4BACA,WACA,yBACA,eACA,4CACA,sBACA,oBACA,6DAEA,uBACE,6DAGF,sBACE,wEAGF,sBACE,kBACA,SCjFR,WACE,sBACA,aACA,sBACA,kBACA,iBACA,UACA,qBAEA,iBACE,oBAGF,kBACE,2DvBDF,SuBI0D,yBvBC1D,SuBD0D,qCvBQxD,qLuBLA,yBAGF,eACE,gBACA,eACA,qCvBZA,4BuBgBA,SACE,WACA,YACA,eACA,UACA,+BALF,SACE,WACA,YACA,eACA,UACA,yCAIJ,4BAGF,YACE,mBACA,mBACA,UACA,mBACA,eACA,mBAEA,aACE,sBACA,oCACA,sBACA,YACA,cACA,c1BtCoB,kB0BwCpB,qBACA,eACA,mBAGF,iCACE,iDAEA,YAEE,mBACA,mCACA,SAKN,iBACE,mBACA,UACA,qCvBrDE,6CADF,euBwDkF,sCvBlEhF,sBADF,cuBoE0D,yBvB/D1D,cuB+D0D,gBAG5D,e1BlFQ,kBGkEN,CACA,sBACA,gBACA,cHrDsB,uCGuDtB,mBAEA,wBACE,cH1DoB,eG4DpB,gBACA,mBACA,mBAGF,aACE,mBAGF,kBACE,mBAGF,eACE,cHjFS,kB0B6Eb,YACE,c1BvEsB,a0ByEtB,mBACA,oBAEA,aACE,qBACA,wBAGF,aACE,c1BjFsB,gB0BmFtB,mBACA,gBACA,uBACA,0BAIJ,aACE,gBACA,gBACA,kBAGF,kB1BxGa,kB0B0GX,gBACA,yBAEA,a1BxFsB,mB0B0FpB,aACA,gBACA,eACA,eACA,6BAEA,oBACE,iBACA,0BAIJ,iBACE,6BAEA,kBACE,gCACA,eACA,aACA,aACA,gBACA,eACA,c1BhHkB,iC0BmHlB,oBACE,iBACA,8FAIJ,eAEE,mCAGF,aACE,aACA,c1B7IoB,qB0B+IpB,0HAEA,aAGE,0BACA,gBAQN,WACA,kBAGA,+BANF,qBACE,UACA,CAEA,eACA,aAgBA,CAfA,eAGF,iBACE,MACA,OACA,mBACA,CAGA,qBACA,CACA,eACA,WACA,YACA,uBAEA,kB1B1LW,0B0B+Lb,u1BACE,OACA,gBACA,aACA,8BAEA,aACE,sBACA,CADA,4DACA,CADA,kBACA,+BACA,CADA,2BACA,UACA,YACA,oBACA,eACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,oCAGF,aACE,WACA,YACA,YACA,eACA,sCAGF,yBAzBF,aA0BI,iBAIJ,kBACE,eACA,gBACA,mBAGF,cACE,kBACA,MACA,OACA,WACA,YACA,0BACA,oBCrPF,kBACE,gB3BAM,WACA,e2BEN,aACA,sBACA,YACA,uBACA,eACA,kBACA,kBACA,YACA,gBAGF,e3BdQ,cAiBgB,oB2BCtB,YACA,iEAEA,aAGE,iCAGF,eACE,2BxBcF,iBACE,mBACA,cACA,eACA,aACA,gBACA,yBwBfJ,aACE,eACA,yBAGF,aACE,eACA,gBACA,6BAGF,aACE,kBACA,W3B7CM,0B2B+CN,WACA,SACA,gBACA,kBACA,eACA,gBACA,UACA,oBACA,WACA,4BACA,iBACA,wDAKE,SACE,uBAKN,WACE,aACA,sBACA,4BAEA,iBACE,c3B3DoB,a2B6DpB,YACA,mBACA,CAGE,yDAIJ,UACE,gBAIJ,qBACE,eACA,gBACA,kBACA,kBACA,WACA,aACA,2BxBzDA,iBACE,mBACA,cACA,eACA,aACA,gBACA,sBwBwDJ,WACE,sBACA,cACA,WACA,kBACA,kBACA,gBACA,kCAEA,eACE,qEAIA,cACE,MACA,gCAIJ,e3B5HM,gC2BiIR,cACE,cACA,qBACA,c3BlHwB,kB2BoHxB,UACA,mEAEA,WAEE,WACA,sBACA,CADA,gCACA,CADA,kBACA,CAIE,0HAFF,WACE,oBACA,CADA,8BACA,CADA,gB3BhJE,C2BiJF,wBAKN,UACE,CAEA,iBACA,MACA,OACA,UACA,gB3B7JM,iC2BgKN,YACE,sBAIJ,WACE,gBACA,kBACA,WACA,aACA,uBACA,qCAGF,cACE,YACA,WACA,kBACA,UACA,sBACA,CADA,gCACA,CADA,kBACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,qDAEA,WACE,oBACA,CADA,8BACA,CADA,gBACA,sCAIJ,0BACE,2BACA,gBACA,kBACA,yBAGF,eACE,iBACA,yBAGF,UACE,cAGF,UACE,YACA,kBACA,qCAEA,UACE,YACA,aACA,mBACA,uBACA,2CAEA,c3BrK0B,eAEC,C2B+K7B,8CALF,iBACE,MACA,OACA,QACA,SAYA,CAXA,yBAQA,mBACA,8BACA,oBACA,4BAEA,mBACE,0DAGF,SACE,4DAEA,mBACE,mBAKN,yBACE,sBACA,SACA,W3BjQM,e2BmQN,aACA,mBACA,eACA,cACA,cACA,kBACA,kBACA,MACA,SACA,yBAGF,MACE,0BAGF,OACE,CASA,4CANF,UACE,kBACA,kBACA,OACA,YACA,oBAUA,6BAEA,WACE,sBAGF,mBACE,qBACA,gBACA,c3B9RsB,mF2BiStB,yBAGE,wBAKN,oBACE,sBAGF,qB3B9TQ,Y2BgUN,WACA,kBACA,YACA,UACA,SACA,YACA,8BAGF,wB3BvT0B,qB2B2T1B,iBACE,UACA,QACA,YACA,qKAKA,WAEE,mFAGF,WACE,eAKJ,qBACE,kBACA,mBACA,kBACA,oBACA,cACA,wBAEA,eACE,YACA,yBAGF,cACE,kBACA,gBACA,gCAEA,UACE,cACA,kBACA,6BACA,WACA,SACA,OACA,oBACA,qCAIJ,qCACE,iCAGF,wBACE,uCAIA,mBACA,mBACA,6BACA,0BACA,eAIJ,eACE,kBACA,gB3BnZM,e2BqZN,kBACA,sBACA,cACA,wBAEA,eACE,sBACA,qBAGF,SACE,gCAGF,UACE,YACA,0BxB3XF,iBACE,mBACA,cACA,eACA,aACA,gBACA,qBwB0XF,eACE,gBACA,UACA,kBACA,0BAGF,oBACE,sBACA,SACA,gCAEA,wBACE,0BACA,qBACA,sBACA,UACA,4BAKF,qBACE,CADF,gCACE,CADF,kBACE,kBACA,QACA,2BACA,yBAIJ,iBACE,UACA,SACA,OACA,QACA,sBACA,iFACA,eACA,UACA,4BACA,gCAEA,SACE,6EAKF,iBAEE,wBAIJ,YACE,kBACA,MACA,OACA,WACA,YACA,UACA,SACA,gB3BxeI,cAiBgB,gB2B0dpB,oBACA,+BAEA,aACE,oBACA,8GAEA,aAGE,+BAIJ,aACE,eACA,kCAGF,aACE,eACA,gBACA,4BAIJ,YACE,8BACA,oBACA,CAGE,gUAEA,aAIE,wBAKN,cACE,mBACA,gBACA,uBACA,oCAGE,cACE,qCAKF,eACE,+BAIJ,sBACE,iBACA,eACA,SACA,0BACA,8GAEA,U3B9iBE,+E2BsjBN,cAGE,gBACA,6BAGF,U3B7jBM,iB2B+jBJ,yBAGF,oBACE,aACA,mDAGF,U3BvkBM,uB2B4kBN,cACE,YACA,eACA,8BAEA,UACE,WACA,+BAOA,6DANA,iBACA,cACA,kBACA,WACA,UACA,YAWA,CAVA,+BASA,kBACA,+BAGF,iBACE,UACA,kBACA,WACA,YACA,YACA,UACA,4BACA,mBACA,sCACA,oBACA,qBAIJ,gBACE,uBAEA,oBACE,eACA,gBACA,W3B5nBE,sF2B+nBF,yBAGE,qBAKN,cACE,YACA,kBACA,4BAEA,UACE,WACA,+BACA,kBACA,cACA,kBACA,WACA,SACA,2DAGF,aAEE,kBACA,WACA,kBACA,SACA,mBACA,6BAGF,6BACE,6BAGF,iBACE,UACA,UACA,kBACA,WACA,YACA,QACA,iBACA,4BACA,mBACA,sCACA,oBACA,CAGE,yFAKF,SACE,6GAQF,gBACE,oBACA,iBCtsBR,YACE,mBACA,mBACA,kBACA,QACA,SACA,YACA,mBAGF,YACE,kBACA,gBACA,yBACA,0BACA,eACA,iBACA,yBACA,WACA,4BACA,wCAEA,uBCtBF,kB7BWa,sB6BTX,kBACA,uCACA,YACA,gBACA,qCAEA,aARF,SASI,kBAGF,cACE,mBACA,gBACA,eACA,kBACA,0BACA,6BAGF,WACE,6BAGF,yBACE,sCAEA,uBACE,uCACA,wBACA,wBAIJ,eACE,kDAIA,oBACE,+BAIJ,cACE,sBAGF,eACE,aAIJ,kB7B3Ca,sB6B6CX,kBACA,uCACA,YACA,gBACA,qCAEA,YARF,SASI,uBAGF,kBACE,oBAGF,kBACE,YACA,0BACA,gBACA,mBAGF,YACE,gCACA,4BAGF,YACE,iCAGF,aACE,gBACA,qBACA,eACA,aACA,aC3FJ,cAOE,qBACA,c9BGW,2B8BVX,qBAEE,iBACA,+BAOF,WACE,iBAIJ,sBACE,6BAEA,uBACE,2BACA,4BACA,mB9BHsB,4B8BOxB,oBACE,8BACA,+BACA,aACA,qBAIJ,YACE,8BACA,cACA,c9BLsB,c8BOtB,oBAGF,iBACE,OACA,kBACA,iBACA,gBACA,8BACA,eACA,0BAEA,aACE,6BAIJ,a9BpC0B,mC8BuCxB,aACE,oDAGF,QACE,wBAIJ,iBACE,YACA,OACA,WACA,WACA,yBACA,uBAIA,oBACE,WACA,eACA,yBAGF,iBACE,gBACA,oBAIJ,iBACE,aACA,gBACA,kBACA,gB9B5FM,sB8B8FN,sGAEA,+BAEE,oBAKF,2BACA,gB9BxGM,0B8B2GN,cACE,gBACA,gBACA,oBACA,cACA,WACA,gCACA,c9BzGS,yB8B2GT,kBACA,4CAEA,QACE,2GAGF,mBAGE,wCAKN,cACE,6CAEA,SACE,kBACA,kBACA,qDAGF,SACE,WACA,kBACA,MACA,OACA,WACA,YACA,sCACA,mBACA,4BAIJ,SACE,kBACA,wBACA,gBACA,MACA,iCAEA,aACE,WACA,gBACA,gBACA,gB9BpKI,mB8ByKR,iBACE,qBACA,YACA,wBAEA,UACE,YACA,wBAIJ,cACE,kBACA,iBACA,c9BvKsB,mD8B0KtB,YACE,qDAGF,eACE,uDAGF,YACE,qBAIJ,YACE,wBC1MF,iBACE,aACA,mBACA,mB/BgBwB,cARb,kB+BLX,YACA,WACA,gBACA,iBACA,gBACA,4DAEA,aACE,eACA,mFAGF,iBACE,kBACA,gBACA,+FAEA,iBACE,OACA,MACA,kCAIJ,aACE,cACA,2BAGF,cACE,gBACA,iBACA,mBACA,2BAGF,cACE,gBACA,iBACA,gBACA,mBACA,0CAIJ,aACE,kBACA,cACA,mBACA,gCACA,eACA,qBACA,aACA,0BACA,4DAEA,aACE,iBACA,gDAGF,kB/BhDwB,iD+BoDxB,kB/BnDwB,WAlBlB,qG+B0EN,kB/BxEU,WAFJ,oC+BgFR,kBACE,YACA,eACA,iBACA,gBACA,8BAGF,aACE,UACA,kBACA,YACA,gBACA,oCAGF,iBACE,4FAGF,eAEE,mBACA,qCAGF,mCACE,UACE,cACA,0CAGF,YACE,4DAEA,YACE,kBCtHN,UhCEQ,gCgCCN,oBAEA,cACE,iBACA,gBACA,kBACA,mBAGF,UhCVM,0BgCYJ,oBAGF,eACE,cACA,iBACA,mDAGF,UACE,YACA,gBACA,gCACA,gBC3BJ,WACE,gBACA,aACA,sBACA,yBACA,kBACA,+BAEA,gBACE,eACA,CACA,2BACA,kCAGF,QACE,iCAGF,aACE,6BAGF,sBACE,0BAGF,MACE,kBACA,aACA,sBACA,iBACA,mDAGF,eACE,sBjClCI,0BiCoCJ,cACA,gDAGF,iBACE,gDAGF,WACE,mBAIJ,eACE,mBACA,yBACA,gBACA,aACA,sBACA,qBAEA,aACE,sBAGF,aACE,SACA,CACA,4BACA,cACA,qDAHA,sBAOA,qCAIJ,qBAEI,cACE,wBAKN,qBACE,WACA,cACA,6DAEA,UAEE,YACA,UACA,wCAGF,YACE,cACA,kDACA,qCAEA,uCALF,aAMI,yCAIJ,eACE,oCAGF,YACE,uDAGF,cACE,sCAGF,gBACE,eACA,CACA,2BACA,yCAGF,QACE,mCAGF,gBACE,yBAEA,kCAHF,eAII,sCAIJ,sBACE,gBACA,sCAGF,uCACE,YACE,iKAEA,eAGE,6CAIJ,gBACE,2EAGF,YAEE,kGAGF,gBACE,+BAGF,YACE,gBACA,gLAEA,eAIE,gCAIJ,iBACE,6CAEA,cACE,8CAKF,gBACE,CAIA,yFAGF,eACE,0BAMR,cACE,aACA,uBACA,mBACA,gBACA,iBACA,iBACA,gBACA,mBACA,WjCjNM,kBiCmNN,eACA,iBACA,qBACA,sCACA,4FAEA,kBAGE,qCAIJ,UACE,UACE,uDAGF,kCACE,mCAGF,kBAEE,sCAIJ,2CACE,YACE,sCAOA,sEAGF,YACE,uCAIJ,0CACE,YACE,uCAIJ,UACE,YACE,gCC1QJ,oBACE,gBACA,yCAEA,UACE,YACA,gBACA,iCAGF,kBACE,qBACA,4CAEA,eACE,iCAIJ,alCAwB,qBkCEtB,uCAEA,yBACE,+CAIA,oBACE,oDAEA,yBACE,gDAKN,aACE,gBAKN,kBACE,eACA,aACA,qBACA,0BAEA,WACE,cACA,qCAEA,yBAJF,YAKI,4BAIJ,wBACE,cACA,kBACA,qCAEA,0BALF,UAMI,uBAIJ,qBACE,WACA,aACA,kBACA,eACA,iBACA,qBACA,gBACA,gBACA,gBACA,aACA,sBACA,6BAEA,aACE,gBACA,mBACA,mBACA,8BAGF,iBACE,SACA,WACA,cACA,mBlCzEoB,kBkC2EpB,cACA,eACA,4BAIJ,YACE,clCpFoB,kBkCsFpB,WACA,QACA,mDAIJ,YACE,oDAGF,UACE,gBAGF,YACE,eACA,mBACA,gBACA,iBACA,wBACA,sBAEA,aACE,mBACA,SACA,kBACA,WACA,eACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,cACA,aACA,mBACA,2BACA,2CACA,6BAEA,aACE,aACA,WACA,YACA,iCAEA,aACE,SACA,WACA,YACA,eACA,gBACA,sBACA,sBACA,CADA,gCACA,CADA,kBACA,6BAIJ,aACE,cACA,eACA,gBACA,kBACA,gBACA,clClJkB,mFkCsJpB,kBAGE,4BACA,2CACA,wGAEA,aACE,6BAIJ,0BACE,2CACA,yBACA,yDAEA,aACE,uCAKN,UACE,oCAGF,WACE,8BAGF,alCrLsB,SkCuLpB,eACA,WACA,cACA,cACA,YACA,aACA,mBACA,WACA,2BACA,2CACA,2GAEA,SAGE,cACA,4BACA,2CACA,qCAKF,SACE,OCjON,eACE,eACA,8BAEA,QAEE,gBACA,UAGF,kBACE,kBACA,cAGF,iBACE,cACA,mBACA,WACA,aACA,sBAEA,kBnCFsB,emCOxB,iBACE,aACA,cACA,iBACA,eACA,gBACA,qBAEA,oBACE,qBACA,yBACA,4BACA,oEAGF,YAEE,kCAGF,aACE,gCAIA,qBACA,WACA,eACA,cnC5CO,cmC8CP,UACA,oBACA,gBnCzDE,yBmC2DF,kBACA,iBACA,sCAEA,oBnC7CoB,0BmCkDtB,cACE,wBAGF,YACE,mBACA,iBACA,cAIJ,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,gBACA,mBACA,cACA,uBAEA,iBACE,qBAGF,oBnClGY,8EmCuGZ,oBAGE,iBACA,gCAGF,mBACE,SACA,wCAGF,mBAEE,eAIJ,oBACE,WACA,gBACA,cACA,cAGF,aACE,qBACA,oBAEA,cACE,eAIJ,eACE,mBACA,cnC9GoB,amCkHtB,cACE,uBACA,UACA,SACA,SACA,cnCvHoB,0BmCyHpB,kBACA,mBAEA,oBACE,sCAGF,mCAEE,eAIJ,WACE,eACA,kBACA,eACA,6BAIJ,4BACE,kBACA,gCAEA,YACE,2CAGF,4BACE,aACA,aACA,mBACA,mGAEA,UAEE,aACA,+GAEA,oBnC7KoB,sDmCmLxB,cACE,gBACA,iBACA,YACA,oBACA,cnC5KoB,sCmC+KpB,gCAGF,YACE,mBACA,8CAEA,aACE,wBACA,iBACA,oCAIJ,uBACE,CADF,oBACE,CADF,eACE,sBACA,eACA,cnCrNS,qBmCuNT,WACA,UACA,oBACA,qXACA,yBACA,kBACA,CACA,yBACA,mDAGF,aACE,cAIJ,anClNwB,qBmCqNtB,+BACE,6BAEA,+BACE,YCpPN,qBACE,iBANc,cAQd,kBACA,sCAEA,WANF,UAOI,eACA,mBAIJ,sBACE,eACA,gBACA,gBACA,qBACA,cpCJsB,oBoCOtB,apCLwB,0BoCOtB,6EAEA,oBAGE,wCAIJ,apClBsB,oBoCuBtB,YACE,oBACA,+BAEA,eACE,yBAIJ,eACE,cpChCsB,qBoCoCxB,iBACE,cpCrCsB,uBoCyCxB,eACE,mBACA,kBACA,kBACA,yHAGF,sBAME,mBACA,oBACA,gBACA,cpCzDsB,qBoC6DxB,aACE,qBAGF,gBACE,qBAGF,eACE,qBAGF,gBACE,yCAGF,aAEE,qBAGF,eACE,qBAGF,kBACE,yCAMA,iBACA,iBACA,yDAEA,2BACE,yDAGF,2BACE,qBAIJ,UACE,SACA,SACA,gCACA,eACA,4BAEA,UACE,SACA,wBAIJ,UACE,yBACA,8BACA,CADA,iBACA,gBACA,mBACA,iEAEA,+BAEE,cACA,kBACA,gBACA,gBACA,cpCrIkB,iCoCyIpB,uBACE,gBACA,gBACA,cpC9HkB,qDoCkIpB,WAEE,iBACA,kBACA,qBACA,mEAEA,SACE,kBACA,iFAEA,gBACE,kBACA,6EAGF,iBACE,SACA,UACA,mBACA,gBACA,uBACA,+BAMR,YACE,oBAIJ,kBACE,eACA,mCAEA,iBACE,oBACA,8BAGF,YACE,8BACA,eACA,6BAGF,UACE,uBACA,eACA,iBACA,WpCpNI,iBoCsNJ,kBACA,qEAEA,aAEE,6CAIA,apC9MoB,oCoCmNtB,sBACE,gBACA,eACA,iBACA,qCAGF,4BA3BF,iBA4BI,4BAIJ,iBACE,YACA,sBACA,mBACA,CACA,sBACA,0BACA,QACA,aACA,yCAEA,sBACE,eACA,iBACA,gBACA,cpC/OkB,mBoCiPlB,mBACA,gCACA,uBACA,mBACA,gBACA,wFAEA,eAEE,cACA,2CAGF,oBACE,2BAKN,iBACE,mCAIE,UACqB,sCjCnRzB,CiCoRI,kBACA,uCAEA,aACE,WACA,YACA,mBACA,iBpCpOgB,wBG9DtB,4BACA,iCiCsSE,cACE,mCAEA,aACE,WpC3SA,qBoC6SA,uDAGE,yBACE,2CAKN,aACE,cpCvSgB,kCoC+StB,sBAEE,CACA,eACA,eACA,iBACA,mBACA,cpCtToB,sCoCyTpB,apCvTsB,0BoCyTpB,kBAIJ,cACE,SACA,UACA,gBACA,uBACA,oBACA,kBACA,oBACA,cACA,kBAGF,sBACE,eACA,iBACA,gBACA,mBACA,cpC/UsB,wBoCkVtB,sBACE,cACA,eACA,gBACA,cACA,kBAKF,cACA,iBpC7VsB,mCoC2VxB,sBACE,CAEA,eACA,mBACA,cpChWsB,kBoCqWtB,cACA,iBpCtWsB,kBoC8WtB,cpC9WsB,mCoC6WxB,sBACE,CACA,gBACA,gBACA,mBACA,cpClXsB,kBoCuXtB,cpCvXsB,kBoC+XxB,sBACE,eACA,iBACA,gBACA,mBACA,cpCpYsB,mCoCwYxB,gBAEE,mDAEA,2BACE,mDAGF,2BACE,kBAIJ,eACE,kBAGF,kBACE,yCAGF,cAEE,kBAGF,UACE,SACA,SACA,2CACA,cACA,yBAEA,UACE,SACA,iDAIJ,YAEE,+BAGF,kBpC5bW,kBoC8bT,kBACA,gBACA,sBACA,oCAEA,UACE,aACA,2BACA,iBACA,8BACA,mBACA,uDAGF,YACE,yBACA,qBACA,mFAEA,aACE,eACA,qCAGF,sDAVF,UAWI,8BACA,6CAIJ,MACE,sBACA,qCAEA,2CAJF,YAKI,sBAKN,iBACE,yBAEA,WACE,WACA,uBACA,4BAIJ,iBACE,mBACA,uCAEA,eACE,mCAGF,eACE,cACA,qCAGF,eACE,UACA,mDAEA,kBACE,aACA,iBACA,0FAKE,oBACE,gFAIJ,cACE,qDAIJ,aACE,cACA,6CAMA,UACqB,sCjC9hB3B,mDiCiiBI,cACE,4DAEA,cACE,qCAKN,oCACE,eACE,sCAIJ,2BA9DF,iBA+DI,mFAIJ,qBAGE,mBpCtjBS,kBoCwjBT,kCACA,uBAGF,YACE,kBACA,WACA,YACA,2BAEA,YACE,WACA,uCAKF,YACE,eACA,mBACA,mBACA,qCAGF,sCACE,kBACE,uCAIJ,apC9kBsB,qCoCklBtB,eACE,WpCpmBE,gBoCsmBF,2CAEA,apCxlBkB,gDoC2lBhB,apC1lBkB,+CoCgmBtB,eACE,qBAIJ,kBACE,yBAEA,aACE,SACA,eACA,YACA,kBACA,qCAIJ,gDAEI,kBACE,yCAGF,eACE,gBACA,WACA,kBACA,uDAEA,iBACE,sCAMR,8BACE,aACE,uCAEA,gBACE,sDAGF,kBACE,6EAIJ,aAEE,qBAIJ,WACE,UAIJ,mBACE,qCAEA,SAHF,eAII,kBAGF,YACE,uBACA,mBACA,aACA,qBAEA,SpC1rBI,YoC4rBF,qCAGF,gBAXF,SAYI,mBACA,sBAIJ,eACE,uBACA,gBACA,gBACA,uBAGF,eACE,gBACA,0BAEA,YACE,yBACA,gBACA,eACA,cpCpsBkB,6BoCwsBpB,eACE,iBACA,+BAGF,kBpCptBS,aoCstBP,0BACA,aACA,uCAEA,YACE,gCAIJ,cACE,gBACA,uDAEA,YACE,mBACA,iDAGF,UACE,YACA,0BACA,gCAIJ,YACE,uCAEA,sBACE,eACA,gBACA,cACA,qCAGF,cACE,cpCnvBgB,uFoCyvBtB,eACE,cASA,CpCnwBoB,2CoCgwBpB,iBACA,CACA,kBACA,gBAGF,eACE,cACA,aACA,kDACA,cACA,qCAEA,eAPF,oCAQI,cACA,8BAEA,UACE,aACA,sBACA,0CAEA,OACE,cACA,2CAGF,YACE,mBACA,QACA,cACA,qCAIJ,UACE,2BAGF,eACE,sCAIJ,eAtCF,UAuCI,6BAEA,aACE,gBACA,gBACA,2GAEA,eAGE,uFAIJ,+BAGE,2BAGF,YACE,gCAEA,eACE,qEAEA,eAEE,gBACA,2CAGF,eACE,SAQZ,iBACE,qBACA,iBAGF,aACE,kBACA,aACA,UACA,YACA,cpCh2BsB,qBoCk2BtB,eACA,qCAEA,gBAVF,eAWI,WACA,gBACA,cpC11BoB,SqChCxB,UACE,eACA,iBACA,yBACA,qBAEA,WAEE,iBACA,mBACA,6BACA,gBACA,mBACA,oBAGF,qBACE,gCACA,aACA,gBACA,oBAGF,eACE,qEAGF,kBrChBW,UqCqBX,arCZwB,0BqCctB,gBAEA,oBACE,eAIJ,eACE,CAII,4HADF,eACE,+FAOF,sBAEE,yFAKF,YAEE,gCAMJ,kBrCzDS,6BqC2DP,gCACA,4CAEA,qBACE,8BACA,2CAGF,uBACE,+BACA,0BAKN,qBACE,gBAIJ,aACE,mBACA,MAGF,+BACE,0BAGF,sBACE,SACA,aACA,8CAGF,oBAEE,qBACA,iBACA,eACA,crC5FsB,gBqC8FtB,0DAEA,UrChHM,wDqCoHN,eACE,iBACA,sEAGF,cACE,yCAKF,YAEE,yDAEA,qBACE,iBACA,eACA,gBACA,qEAEA,cACE,2EAGF,YACE,mBACA,uFAEA,YACE,qHAOJ,sBACA,cACA,uBAIJ,wBACE,mBrCvJS,sBqCyJT,YACA,mBACA,gCAEA,gBACE,mBACA,oBAIJ,YACE,yBACA,aACA,mBrCtKS,gCqCyKT,aACE,gBACA,mBAIJ,wBACE,aACA,mBACA,qCAEA,wCACE,4BACE,0BAIJ,kBACE,iCAGF,kBrC9LS,uCqCiMP,kBACE,4BAIJ,gBACE,oBACA,sCAEA,SACE,wCAGF,YACE,mBACA,mCAGF,aACE,aACA,uBACA,mBACA,kBACA,6CAEA,UACE,YACA,kCAIJ,aACE,mCAGF,aACE,iBACA,crC/NgB,gBqCiOhB,mCAIJ,QACE,WACA,qCAEA,sBACE,gBACA,qCAOJ,4FAFF,YAGI,gCAIJ,aACE,sCAEA,eACE,4BAIJ,wBACE,aACA,gBACA,qCAEA,2BALF,4BAMI,sCAIJ,+CACE,YACE,iBCzRN,YACE,uBACA,WACA,iBACA,iCAEA,gBACE,gBACA,oBACA,cACA,wCAEA,YACE,yBACA,mBtCPO,YsCSP,yBAIJ,WAvBc,UAyBZ,oBACA,iCAEA,YACE,mBACA,YACA,uCAEA,aACE,yCAEA,oBACE,aACA,2CAGF,StCxCA,YsC0CE,kBACA,YACA,uCAIJ,aACE,ctCjCgB,qBsCmChB,cACA,eACA,aACA,0HAIA,kBAGE,+BAKN,aACE,iBACA,YACA,aACA,qCAGF,sCACE,YACE,6BAIJ,eACE,0BACA,gBACA,mBACA,qCAEA,2BANF,eAOI,+BAGF,aACE,aACA,ctC3EgB,qBsC6EhB,0BACA,2CACA,0BACA,mBACA,gBACA,uBACA,mCAEA,gBACE,oCAGF,UtCzGA,yBsC2GE,0BACA,2CACA,uCAGF,kBACE,sBACA,+BAIJ,kBACE,wBACA,SACA,iCAEA,QACE,kBACA,6DAIJ,UtCjIE,yBAkBkB,gBsCkHlB,gBACA,mEAEA,wBACE,6DAKN,yBACE,iCAIJ,qBACE,WACA,gBApJY,cAsJZ,sCAGF,uCACE,YACE,iCAGF,WA/JY,cAiKV,sCAIJ,gCACE,UACE,0BAMF,2BACA,qCAEA,wBALF,cAMI,CACA,sBACA,kCAGF,YACE,oBAEA,gCACA,0BAEA,eAEA,mBACA,8BACA,mCAEA,eACE,kBACA,yCAGF,mBACE,4DAEA,eACE,qCAIJ,gCAzBF,eA0BI,iBACA,6BAIJ,atCnMsB,esCqMpB,iBACA,gBACA,qCAEA,2BANF,eAOI,6BAIJ,atC9MsB,esCgNpB,iBACA,gBACA,mBACA,4BAGF,wBACE,eACA,gBACA,ctC1NkB,mBsC4NlB,kBACA,gCACA,4BAGF,cACE,ctCjOoB,iBsCmOpB,gBACA,0CAGF,UtCxPI,gBsC0PF,uFAGF,eAEE,gEAGF,aACE,4CAGF,cACE,gBACA,WtCxQE,oBsC0QF,iBACA,gBACA,mBACA,2BAGF,cACE,iBACA,ctCjQoB,mBsCmQpB,kCAEA,UtCtRE,gBsCwRA,CAII,2NADF,eACE,4BAMR,UACE,SACA,SACA,2CACA,cACA,mCAEA,UACE,SACA,qCAKN,eA9SF,aA+SI,iCAEA,YACE,yBAGF,UACE,UACA,YACA,iCAEA,YACE,4BAGF,YACE,8DAGF,eAEE,gCACA,gBACA,0EAEA,eACE,+BAIJ,eACE,6DAGF,2BtCjUoB,YsCwU1B,UACE,SACA,cACA,WACA,sDAKA,atCnVsB,0DsCsVpB,atCpVsB,4DsCyVxB,atC1Wc,gBsC4WZ,4DAGF,atC9WU,gBsCgXR,0DAGF,atCvVsB,gBsCyVpB,0DAGF,atCtXU,gBsCwXR,UAIJ,YACE,eACA,yBAEA,aACE,qBACA,oCAEA,kBACE,4BAGF,cACE,gBACA,+BAEA,oBACE,iBACA,gCAIJ,eACE,yBACA,eACA,CAII,iNADF,eACE,6CAKN,aACE,mBACA,2BAGF,oBACE,ctCxZkB,qBsC0ZlB,yBACA,eACA,gBACA,gCACA,iCAEA,UtChbE,gCsCkbA,oCAGF,atCnaoB,gCsCqalB,iBAMR,aACE,iBACA,eACA,sBAGF,aACE,eACA,cACA,wBAEA,aACE,kBAIJ,YACE,eACA,mBACA,wBAGF,YACE,WACA,sBACA,aACA,+BAEA,aACE,qBACA,gBACA,eACA,iBACA,ctC7csB,CsCkdlB,4MADF,eACE,sCAKN,aACE,gCAIJ,YAEE,mBACA,kEAEA,UACE,kBACA,4BACA,gFAEA,iBACE,kDAKN,aAEE,aACA,sBACA,4EAEA,cACE,WACA,kBACA,mBACA,uEAIJ,cAEE,iBAGF,YACE,eACA,kBACA,2CAEA,kBACE,eACA,8BAGF,kBACE,+CAGF,gBACE,uDAEA,gBACE,mBACA,YACA,YAKN,kBACE,eACA,cAEA,atC3hBwB,qBsC6hBtB,oBAEA,yBACE,SAKN,aACE,YAGF,gBACE,eACA,mBtCpjBW,gCsCsjBX,uBAEA,eACE,oBAGF,YACE,2BACA,mBACA,ctCxjBoB,esC0jBpB,eACA,oBAGF,iBACE,4BAEA,aACE,SACA,kBACA,WACA,YACA,qBAIJ,2BACE,mBAGF,oBACE,uBAGF,atCpkBsB,sDsCwkBtB,atCrlBwB,qBsCylBtB,gBACA,yDAIJ,oBAIE,ctClmBwB,iGsCqmBxB,eACE,yIAIA,4BACE,cACA,iIAGF,8BACE,CADF,sBACE,WACA,sBAKN,YAEE,mBACA,sCAEA,aACE,CACA,gBACA,kBACA,0DAIA,8BACE,CADF,sBACE,WACA,gBAKN,kBACE,8BACA,yBAEA,yBtC9pBc,yBsCkqBd,yBACE,wBAGF,yBtCnqBU,wBsCwqBR,2BACA,eACA,iBACA,4BACA,kBACA,gBACA,0BAEA,atCpqBoB,uBsC0qBpB,wBACA,qBAGF,atChqBsB,csCqqBxB,kBtC1rBa,kBsC4rBX,mBACA,uBAEA,YACE,8BACA,mBACA,aACA,gCAEA,SACE,SACA,gDAEA,aACE,8BAIJ,aACE,gBACA,ctCzsBkB,yBsC2sBlB,iBACA,gCAEA,aACE,qBACA,iHAEA,aAGE,mCAIJ,atCvuBM,6BsC8uBR,YACE,2BACA,6BACA,mCAEA,kBACE,gFAGF,YAEE,cACA,sBACA,YACA,ctC9uBgB,mLsCivBhB,kBAEE,gBACA,uBACA,sCAIJ,aACE,6BACA,4CAEA,atC/uBgB,iBsCivBd,gBACA,wCAIJ,aACE,sBACA,WACA,aACA,qBACA,ctCzwBgB,WsCgxBxB,kBAGE,0BAFA,eACA,uBASA,CARA,eAGF,oBACE,gBACA,CAEA,qBACA,oBAGF,YACE,eACA,CACA,kBACA,wBAEA,qBACE,cACA,mBACA,aACA,0FAGF,kBAEE,kBACA,YACA,6CAGF,QACE,SACA,+CAEA,aACE,sEAGF,uBACE,yDAGF,atC70BY,8CsCk1Bd,qBACE,aACA,WtCr1BI,csC01BR,iBACE,qBAGF,wBACE,kBACA,2BAEA,cACE,mBtC11BS,gCsC41BT,kCAEA,cACE,cACA,gBACA,eACA,gBACA,ctC31BoB,qBsC61BpB,mBACA,uHAEA,UtCj3BE,iCsCw3BJ,cACE,ctC31BkB,uCsC+1BpB,YACE,8BACA,mBACA,sCAGF,eACE,kkECp4BN,kIACE,CADF,sIACE,uIAYA,aAEE,yIAGF,aAEE,qIAGF,aAEE,6IAGF,aAEE,UChCJ,aACE,gCAEA,gBACE,eACA,mBACA,+BAGF,cACE,iBACA,8CAGF,aACE,kBACA,wBAGF,gBACE,iCAGF,aACE,kBACA,uCAGF,oBACE,gDAGF,SACE,YACA,8BAGF,cACE,iBACA,mEAGF,aACE,kBACA,2DAGF,cAEE,gBACA,mFAGF,cACE,gBACA,+BAGF,eACE,2EAGF,UAEE,mCAGF,aACE,iBACA,yBAGF,kBACE,kBACA,4BAGF,UACE,UACA,wBAGF,aACE,kCAGF,MACE,WACA,cACA,mBACA,2CAGF,aACE,iBACA,0CAGF,gBACE,eACA,mCAGF,WACE,sCAGF,gBACE,gBACA,yCAGF,UACE,iCAGF,aACE,iBACA,+BAGF,UACE,0BAGF,gBACE,eACA,UAGA,WACA,yCAGF,iBACE,mBACA,4GAGF,iBAEE,gBACA,uCAGF,kBACE,eACA,2BAGF,aACE,kBACA,wCAGF,SACE,YACA,yDAGF,SACE,WACA,CAKA,oFAGF,UACE,OACA,uGAGF,UAEE,gBACA,uCAIA,cACE,iBACA,kEAEA,cACE,gBACA,qCAKN,WACE,eACA,iBACA,uCAGF,WACE,sCAGF,aACE,kBACA,0CAGF,gBACE,eACA,uDAGF,gBACE,2CAGF,cACE,iBACA,YACA,yEAGF,aAEE,iBACA,iBAGF,wBACE,iBAGF,SACE,oBACA,yBAGF,aACE,8EAGF,cAEE,gBACA,oDAGF,cACE,mBACA,gEAGF,iBACE,gBACA,CAMA,8KAGF,SACE,QACA,yDAGF,kBACE,eACA,uDAGF,kBACE,gBACA,qDAGF,SACE,QACA,8FAGF,cAEE,mBACA,4CAGF,UACE,SACA,kDAEA,UACE,OACA,+DACA,8BAIJ,sXACE,uCAGF,gBAEE,kCAGF,cACE,iBACA,gDAGF,UACE,UACA,gEAGF,aACE,uDAGF,WACE,WACA,uDAGF,UACE,WACA,uDAGF,UACE,WACA,kDAGF,MACE,0CAGF,iBACE,yBACA,qDAGF,cACE,iBACA,qCAGF,kCACE,gBAEE,kBACA,2DAEA,gBACE,mBACA,uEAKF,gBAEE,kBACA,gFAKN,cAEE,gBACA,6CAKE,eACE,eACA,sDAIJ,aACE,kBACA,4DAKF,cACE,gBACA,8DAGF,gBACE,eACA,mCAIJ,aACE,kBACA,iBACA,kCAGF,WACE,mCAGF,WACE,oCAGF,cACE,gBACA,gFAGF,cACE,mBACA,+DAGF,SACE,QACA,sBChbJ,YACE,eACA,CACA,kBACA,0BAEA,qBACE,iBACA,cACA,mBACA,yDAEA,YAEE,mBACA,kBACA,sBACA,YACA,4BAGF,oBACE,cACA,cACA,qGAEA,kBAGE,sDAKN,iBAEE,gBACA,eACA,iBACA,WzCrCI,uByCuCJ,mBACA,iBACA,4BAGF,cACE,6BAGF,cACE,czCjCoB,kByCmCpB,gBACA,qBAIJ,YACE,eACA,cACA,yBAEA,gBACE,mBACA,6BAEA,aACE,sCAIJ,azCrDwB,gByCuDtB,qBACA,0D","file":"flavours/glitch/common.css","sourcesContent":["html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:\"\";content:none}table{border-collapse:collapse;border-spacing:0}html{scrollbar-color:#192432 rgba(0,0,0,.1)}::-webkit-scrollbar{width:12px;height:12px}::-webkit-scrollbar-thumb{background:#192432;border:0px none #fff;border-radius:50px}::-webkit-scrollbar-thumb:hover{background:#1c2938}::-webkit-scrollbar-thumb:active{background:#192432}::-webkit-scrollbar-track{border:0px none #fff;border-radius:0;background:rgba(0,0,0,.1)}::-webkit-scrollbar-track:hover{background:#121a24}::-webkit-scrollbar-track:active{background:#121a24}::-webkit-scrollbar-corner{background:transparent}body{font-family:sans-serif,sans-serif;background:#06090c;font-size:13px;line-height:18px;font-weight:400;color:#fff;text-rendering:optimizelegibility;font-feature-settings:\"kern\";text-size-adjust:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-tap-highlight-color:transparent}body.system-font{font-family:system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"Oxygen\",\"Ubuntu\",\"Cantarell\",\"Fira Sans\",\"Droid Sans\",\"Helvetica Neue\",sans-serif,sans-serif}body.app-body{padding:0}body.app-body.layout-single-column{height:auto;min-height:100vh;overflow-y:scroll}body.app-body.layout-multiple-columns{position:absolute;width:100%;height:100%}body.app-body.with-modals--active{overflow-y:hidden}body.lighter{background:#121a24}body.with-modals{overflow-x:hidden;overflow-y:scroll}body.with-modals--active{overflow-y:hidden}body.embed{background:#192432;margin:0;padding-bottom:0}body.embed .container{position:absolute;width:100%;height:100%;overflow:hidden}body.admin{background:#0b1016;padding:0}body.error{position:absolute;text-align:center;color:#9baec8;background:#121a24;width:100%;height:100%;padding:0;display:flex;justify-content:center;align-items:center}body.error .dialog{vertical-align:middle;margin:20px}body.error .dialog img{display:block;max-width:470px;width:100%;height:auto;margin-top:-120px}body.error .dialog h1{font-size:20px;line-height:28px;font-weight:400}button{font-family:inherit;cursor:pointer}button:focus{outline:none}.app-holder,.app-holder>div{display:flex;width:100%;align-items:center;justify-content:center;outline:0 !important}.layout-single-column .app-holder,.layout-single-column .app-holder>div{min-height:100vh}.layout-multiple-columns .app-holder,.layout-multiple-columns .app-holder>div{height:100%}.container-alt{width:700px;margin:0 auto;margin-top:40px}@media screen and (max-width: 740px){.container-alt{width:100%;margin:0}}.logo-container{margin:100px auto 50px}@media screen and (max-width: 500px){.logo-container{margin:40px auto 0}}.logo-container h1{display:flex;justify-content:center;align-items:center}.logo-container h1 svg{fill:#fff;height:42px;margin-right:10px}.logo-container h1 a{display:flex;justify-content:center;align-items:center;color:#fff;text-decoration:none;outline:0;padding:12px 16px;line-height:32px;font-family:sans-serif,sans-serif;font-weight:500;font-size:14px}.compose-standalone .compose-form{width:400px;margin:0 auto;padding:20px 0;margin-top:40px;box-sizing:border-box}@media screen and (max-width: 400px){.compose-standalone .compose-form{width:100%;margin-top:0;padding:20px}}.account-header{width:400px;margin:0 auto;display:flex;font-size:13px;line-height:18px;box-sizing:border-box;padding:20px 0;padding-bottom:0;margin-bottom:-30px;margin-top:40px}@media screen and (max-width: 440px){.account-header{width:100%;margin:0;margin-bottom:10px;padding:20px;padding-bottom:0}}.account-header .avatar{width:40px;height:40px;width:40px;height:40px;background-size:40px 40px;margin-right:8px}.account-header .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px;border-radius:8%;background-position:50%;background-clip:padding-box}.account-header .name{flex:1 1 auto;color:#d9e1e8;width:calc(100% - 88px)}.account-header .name .username{display:block;font-weight:500;text-overflow:ellipsis;overflow:hidden}.account-header .logout-link{display:block;font-size:32px;line-height:40px;margin-left:8px}.grid-3{display:grid;grid-gap:10px;grid-template-columns:3fr 1fr;grid-auto-columns:25%;grid-auto-rows:max-content}.grid-3 .column-0{grid-column:1/3;grid-row:1}.grid-3 .column-1{grid-column:1;grid-row:2}.grid-3 .column-2{grid-column:2;grid-row:2}.grid-3 .column-3{grid-column:1/3;grid-row:3}@media screen and (max-width: 415px){.grid-3{grid-gap:0;grid-template-columns:minmax(0, 100%)}.grid-3 .column-0{grid-column:1}.grid-3 .column-1{grid-column:1;grid-row:3}.grid-3 .column-2{grid-column:1;grid-row:2}.grid-3 .column-3{grid-column:1;grid-row:4}}.grid-4{display:grid;grid-gap:10px;grid-template-columns:repeat(4, minmax(0, 1fr));grid-auto-columns:25%;grid-auto-rows:max-content}.grid-4 .column-0{grid-column:1/5;grid-row:1}.grid-4 .column-1{grid-column:1/4;grid-row:2}.grid-4 .column-2{grid-column:4;grid-row:2}.grid-4 .column-3{grid-column:2/5;grid-row:3}.grid-4 .column-4{grid-column:1;grid-row:3}.grid-4 .landing-page__call-to-action{min-height:100%}.grid-4 .flash-message{margin-bottom:10px}@media screen and (max-width: 738px){.grid-4{grid-template-columns:minmax(0, 50%) minmax(0, 50%)}.grid-4 .landing-page__call-to-action{padding:20px;display:flex;align-items:center;justify-content:center}.grid-4 .row__information-board{width:100%;justify-content:center;align-items:center}.grid-4 .row__mascot{display:none}}@media screen and (max-width: 415px){.grid-4{grid-gap:0;grid-template-columns:minmax(0, 100%)}.grid-4 .column-0{grid-column:1}.grid-4 .column-1{grid-column:1;grid-row:3}.grid-4 .column-2{grid-column:1;grid-row:2}.grid-4 .column-3{grid-column:1;grid-row:5}.grid-4 .column-4{grid-column:1;grid-row:4}}@media screen and (max-width: 415px){.public-layout{padding-top:48px}}.public-layout .container{max-width:960px}@media screen and (max-width: 415px){.public-layout .container{padding:0}}.public-layout .header{background:#202e3f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;height:48px;margin:10px 0;display:flex;align-items:stretch;justify-content:center;flex-wrap:nowrap;overflow:hidden}@media screen and (max-width: 415px){.public-layout .header{position:fixed;width:100%;top:0;left:0;margin:0;border-radius:0;box-shadow:none;z-index:110}}.public-layout .header>div{flex:1 1 33.3%;min-height:1px}.public-layout .header .nav-left{display:flex;align-items:stretch;justify-content:flex-start;flex-wrap:nowrap}.public-layout .header .nav-center{display:flex;align-items:stretch;justify-content:center;flex-wrap:nowrap}.public-layout .header .nav-right{display:flex;align-items:stretch;justify-content:flex-end;flex-wrap:nowrap}.public-layout .header .brand{display:block;padding:15px}.public-layout .header .brand svg{display:block;height:18px;width:auto;position:relative;bottom:-2px;fill:#fff}@media screen and (max-width: 415px){.public-layout .header .brand svg{height:20px}}.public-layout .header .brand:hover,.public-layout .header .brand:focus,.public-layout .header .brand:active{background:#26374d}.public-layout .header .nav-link{display:flex;align-items:center;padding:0 1rem;font-size:12px;font-weight:500;text-decoration:none;color:#9baec8;white-space:nowrap;text-align:center}.public-layout .header .nav-link:hover,.public-layout .header .nav-link:focus,.public-layout .header .nav-link:active{text-decoration:underline;color:#fff}@media screen and (max-width: 550px){.public-layout .header .nav-link.optional{display:none}}.public-layout .header .nav-button{background:#2d415a;margin:8px;margin-left:0;border-radius:4px}.public-layout .header .nav-button:hover,.public-layout .header .nav-button:focus,.public-layout .header .nav-button:active{text-decoration:none;background:#344b68}.public-layout .grid{display:grid;grid-gap:10px;grid-template-columns:minmax(300px, 3fr) minmax(298px, 1fr);grid-auto-columns:25%;grid-auto-rows:max-content}.public-layout .grid .column-0{grid-row:1;grid-column:1}.public-layout .grid .column-1{grid-row:1;grid-column:2}@media screen and (max-width: 600px){.public-layout .grid{grid-template-columns:100%;grid-gap:0}.public-layout .grid .column-1{display:none}}.public-layout .directory__card{border-radius:4px}@media screen and (max-width: 415px){.public-layout .directory__card{border-radius:0}}@media screen and (max-width: 415px){.public-layout .page-header{border-bottom:0}}.public-layout .public-account-header{overflow:hidden;margin-bottom:10px;box-shadow:0 0 15px rgba(0,0,0,.2)}.public-layout .public-account-header.inactive{opacity:.5}.public-layout .public-account-header.inactive .public-account-header__image,.public-layout .public-account-header.inactive .avatar{filter:grayscale(100%)}.public-layout .public-account-header.inactive .logo-button{background-color:#d9e1e8}.public-layout .public-account-header__image{border-radius:4px 4px 0 0;overflow:hidden;height:300px;position:relative;background:#000}.public-layout .public-account-header__image::after{content:\"\";display:block;position:absolute;width:100%;height:100%;box-shadow:inset 0 -1px 1px 1px rgba(0,0,0,.15);top:0;left:0}.public-layout .public-account-header__image img{object-fit:cover;display:block;width:100%;height:100%;margin:0;border-radius:4px 4px 0 0}@media screen and (max-width: 600px){.public-layout .public-account-header__image{height:200px}}.public-layout .public-account-header--no-bar{margin-bottom:0}.public-layout .public-account-header--no-bar .public-account-header__image,.public-layout .public-account-header--no-bar .public-account-header__image img{border-radius:4px}@media screen and (max-width: 415px){.public-layout .public-account-header--no-bar .public-account-header__image,.public-layout .public-account-header--no-bar .public-account-header__image img{border-radius:0}}@media screen and (max-width: 415px){.public-layout .public-account-header{margin-bottom:0;box-shadow:none}.public-layout .public-account-header__image::after{display:none}.public-layout .public-account-header__image,.public-layout .public-account-header__image img{border-radius:0}}.public-layout .public-account-header__bar{position:relative;margin-top:-80px;display:flex;justify-content:flex-start}.public-layout .public-account-header__bar::before{content:\"\";display:block;background:#192432;position:absolute;bottom:0;left:0;right:0;height:60px;border-radius:0 0 4px 4px;z-index:-1}.public-layout .public-account-header__bar .avatar{display:block;width:120px;height:120px;width:120px;height:120px;background-size:120px 120px;padding-left:16px;flex:0 0 auto}.public-layout .public-account-header__bar .avatar img{display:block;width:100%;height:100%;margin:0;border-radius:50%;border:4px solid #192432;background:#040609;border-radius:8%;background-position:50%;background-clip:padding-box}@media screen and (max-width: 600px){.public-layout .public-account-header__bar{margin-top:0;background:#192432;border-radius:0 0 4px 4px;padding:5px}.public-layout .public-account-header__bar::before{display:none}.public-layout .public-account-header__bar .avatar{width:48px;height:48px;width:48px;height:48px;background-size:48px 48px;padding:7px 0;padding-left:10px}.public-layout .public-account-header__bar .avatar img{border:0;border-radius:4px;border-radius:8%;background-position:50%;background-clip:padding-box}}@media screen and (max-width: 600px)and (max-width: 360px){.public-layout .public-account-header__bar .avatar{display:none}}@media screen and (max-width: 415px){.public-layout .public-account-header__bar{border-radius:0}}@media screen and (max-width: 600px){.public-layout .public-account-header__bar{flex-wrap:wrap}}.public-layout .public-account-header__tabs{flex:1 1 auto;margin-left:20px}.public-layout .public-account-header__tabs__name{padding-top:20px;padding-bottom:8px}.public-layout .public-account-header__tabs__name h1{font-size:20px;line-height:27px;color:#fff;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-shadow:1px 1px 1px #000}.public-layout .public-account-header__tabs__name h1 small{display:block;font-size:14px;color:#fff;font-weight:400;overflow:hidden;text-overflow:ellipsis}@media screen and (max-width: 600px){.public-layout .public-account-header__tabs{margin-left:15px;display:flex;justify-content:space-between;align-items:center}.public-layout .public-account-header__tabs__name{padding-top:0;padding-bottom:0}.public-layout .public-account-header__tabs__name h1{font-size:16px;line-height:24px;text-shadow:none}.public-layout .public-account-header__tabs__name h1 small{color:#9baec8}}.public-layout .public-account-header__tabs__tabs{display:flex;justify-content:flex-start;align-items:stretch;height:58px}.public-layout .public-account-header__tabs__tabs .details-counters{display:flex;flex-direction:row;min-width:300px}@media screen and (max-width: 600px){.public-layout .public-account-header__tabs__tabs .details-counters{display:none}}.public-layout .public-account-header__tabs__tabs .counter{min-width:33.3%;box-sizing:border-box;flex:0 0 auto;color:#9baec8;padding:10px;border-right:1px solid #192432;cursor:default;text-align:center;position:relative}.public-layout .public-account-header__tabs__tabs .counter a{display:block}.public-layout .public-account-header__tabs__tabs .counter:last-child{border-right:0}.public-layout .public-account-header__tabs__tabs .counter::after{display:block;content:\"\";position:absolute;bottom:0;left:0;width:100%;border-bottom:4px solid #9baec8;opacity:.5;transition:all 400ms ease}.public-layout .public-account-header__tabs__tabs .counter.active::after{border-bottom:4px solid #d8a070;opacity:1}.public-layout .public-account-header__tabs__tabs .counter.active.inactive::after{border-bottom-color:#d9e1e8}.public-layout .public-account-header__tabs__tabs .counter:hover::after{opacity:1;transition-duration:100ms}.public-layout .public-account-header__tabs__tabs .counter a{text-decoration:none;color:inherit}.public-layout .public-account-header__tabs__tabs .counter .counter-label{font-size:12px;display:block}.public-layout .public-account-header__tabs__tabs .counter .counter-number{font-weight:500;font-size:18px;margin-bottom:5px;color:#fff;font-family:sans-serif,sans-serif}.public-layout .public-account-header__tabs__tabs .spacer{flex:1 1 auto;height:1px}.public-layout .public-account-header__tabs__tabs__buttons{padding:7px 8px}.public-layout .public-account-header__extra{display:none;margin-top:4px}.public-layout .public-account-header__extra .public-account-bio{border-radius:0;box-shadow:none;background:transparent;margin:0 -5px}.public-layout .public-account-header__extra .public-account-bio .account__header__fields{border-top:1px solid #26374d}.public-layout .public-account-header__extra .public-account-bio .roles{display:none}.public-layout .public-account-header__extra__links{margin-top:-15px;font-size:14px;color:#9baec8}.public-layout .public-account-header__extra__links a{display:inline-block;color:#9baec8;text-decoration:none;padding:15px;font-weight:500}.public-layout .public-account-header__extra__links a strong{font-weight:700;color:#fff}@media screen and (max-width: 600px){.public-layout .public-account-header__extra{display:block;flex:100%}}.public-layout .account__section-headline{border-radius:4px 4px 0 0}@media screen and (max-width: 415px){.public-layout .account__section-headline{border-radius:0}}.public-layout .detailed-status__meta{margin-top:25px}.public-layout .public-account-bio{background:#202e3f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;overflow:hidden;margin-bottom:10px}@media screen and (max-width: 415px){.public-layout .public-account-bio{box-shadow:none;margin-bottom:0;border-radius:0}}.public-layout .public-account-bio .account__header__fields{margin:0;border-top:0}.public-layout .public-account-bio .account__header__fields a{color:#e1b590}.public-layout .public-account-bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.public-layout .public-account-bio .account__header__fields .verified a{color:#79bd9a}.public-layout .public-account-bio .account__header__content{padding:20px;padding-bottom:0;color:#fff}.public-layout .public-account-bio__extra,.public-layout .public-account-bio .roles{padding:20px;font-size:14px;color:#9baec8}.public-layout .public-account-bio .roles{padding-bottom:0}.public-layout .directory__list{display:grid;grid-gap:10px;grid-template-columns:minmax(0, 50%) minmax(0, 50%)}@media screen and (max-width: 415px){.public-layout .directory__list{display:block}}.public-layout .directory__list .icon-button{font-size:18px}.public-layout .directory__card{margin-bottom:0}.public-layout .card-grid{display:flex;flex-wrap:wrap;min-width:100%;margin:0 -5px}.public-layout .card-grid>div{box-sizing:border-box;flex:1 0 auto;width:300px;padding:0 5px;margin-bottom:10px;max-width:33.333%}@media screen and (max-width: 900px){.public-layout .card-grid>div{max-width:50%}}@media screen and (max-width: 600px){.public-layout .card-grid>div{max-width:100%}}@media screen and (max-width: 415px){.public-layout .card-grid{margin:0;border-top:1px solid #202e3f}.public-layout .card-grid>div{width:100%;padding:0;margin-bottom:0;border-bottom:1px solid #202e3f}.public-layout .card-grid>div:last-child{border-bottom:0}.public-layout .card-grid>div .card__bar{background:#121a24}.public-layout .card-grid>div .card__bar:hover,.public-layout .card-grid>div .card__bar:active,.public-layout .card-grid>div .card__bar:focus{background:#192432}}.no-list{list-style:none}.no-list li{display:inline-block;margin:0 5px}.recovery-codes{list-style:none;margin:0 auto}.recovery-codes li{font-size:125%;line-height:1.5;letter-spacing:1px}.modal-layout{background:#121a24 url('data:image/svg+xml;utf8,') repeat-x bottom fixed;display:flex;flex-direction:column;height:100vh;padding:0}.modal-layout__mastodon{display:flex;flex:1;flex-direction:column;justify-content:flex-end}.modal-layout__mastodon>*{flex:1;max-height:235px}@media screen and (max-width: 600px){.account-header{margin-top:0}}.public-layout .footer{text-align:left;padding-top:20px;padding-bottom:60px;font-size:12px;color:#4c6d98}@media screen and (max-width: 415px){.public-layout .footer{padding-left:20px;padding-right:20px}}.public-layout .footer .grid{display:grid;grid-gap:10px;grid-template-columns:1fr 1fr 2fr 1fr 1fr}.public-layout .footer .grid .column-0{grid-column:1;grid-row:1;min-width:0}.public-layout .footer .grid .column-1{grid-column:2;grid-row:1;min-width:0}.public-layout .footer .grid .column-2{grid-column:3;grid-row:1;min-width:0;text-align:center}.public-layout .footer .grid .column-2 h4 a{color:#4c6d98}.public-layout .footer .grid .column-3{grid-column:4;grid-row:1;min-width:0}.public-layout .footer .grid .column-4{grid-column:5;grid-row:1;min-width:0}@media screen and (max-width: 690px){.public-layout .footer .grid{grid-template-columns:1fr 2fr 1fr}.public-layout .footer .grid .column-0,.public-layout .footer .grid .column-1{grid-column:1}.public-layout .footer .grid .column-1{grid-row:2}.public-layout .footer .grid .column-2{grid-column:2}.public-layout .footer .grid .column-3,.public-layout .footer .grid .column-4{grid-column:3}.public-layout .footer .grid .column-4{grid-row:2}}@media screen and (max-width: 600px){.public-layout .footer .grid .column-1{display:block}}@media screen and (max-width: 415px){.public-layout .footer .grid .column-0,.public-layout .footer .grid .column-1,.public-layout .footer .grid .column-3,.public-layout .footer .grid .column-4{display:none}}.public-layout .footer h4{text-transform:uppercase;font-weight:700;margin-bottom:8px;color:#9baec8}.public-layout .footer h4 a{color:inherit;text-decoration:none}.public-layout .footer ul a{text-decoration:none;color:#4c6d98}.public-layout .footer ul a:hover,.public-layout .footer ul a:active,.public-layout .footer ul a:focus{text-decoration:underline}.public-layout .footer .brand svg{display:block;height:36px;width:auto;margin:0 auto;fill:#4c6d98}.public-layout .footer .brand:hover svg,.public-layout .footer .brand:focus svg,.public-layout .footer .brand:active svg{fill:#5377a5}.compact-header h1{font-size:24px;line-height:28px;color:#9baec8;font-weight:500;margin-bottom:20px;padding:0 10px;word-wrap:break-word}@media screen and (max-width: 740px){.compact-header h1{text-align:center;padding:20px 10px 0}}.compact-header h1 a{color:inherit;text-decoration:none}.compact-header h1 small{font-weight:400;color:#d9e1e8}.compact-header h1 img{display:inline-block;margin-bottom:-5px;margin-right:15px;width:36px;height:36px}.hero-widget{margin-bottom:10px;box-shadow:0 0 15px rgba(0,0,0,.2)}.hero-widget__img{width:100%;position:relative;overflow:hidden;border-radius:4px 4px 0 0;background:#000}.hero-widget__img img{object-fit:cover;display:block;width:100%;height:100%;margin:0;border-radius:4px 4px 0 0}.hero-widget__text{background:#121a24;padding:20px;border-radius:0 0 4px 4px;font-size:15px;color:#9baec8;line-height:20px;word-wrap:break-word;font-weight:400}.hero-widget__text .emojione{width:20px;height:20px;margin:-3px 0 0}.hero-widget__text p{margin-bottom:20px}.hero-widget__text p:last-child{margin-bottom:0}.hero-widget__text em{display:inline;margin:0;padding:0;font-weight:700;background:transparent;font-family:inherit;font-size:inherit;line-height:inherit;color:#bcc9da}.hero-widget__text a{color:#d9e1e8;text-decoration:none}.hero-widget__text a:hover{text-decoration:underline}@media screen and (max-width: 415px){.hero-widget{display:none}}.endorsements-widget{margin-bottom:10px;padding-bottom:10px}.endorsements-widget h4{padding:10px;text-transform:uppercase;font-weight:700;font-size:13px;color:#9baec8}.endorsements-widget .account{padding:10px 0}.endorsements-widget .account:last-child{border-bottom:0}.endorsements-widget .account .account__display-name{display:flex;align-items:center}.endorsements-widget .account .account__avatar{width:44px;height:44px;background-size:44px 44px}.endorsements-widget .trends__item{padding:10px}.trends-widget h4{color:#9baec8}.box-widget{padding:20px;border-radius:4px;background:#121a24;box-shadow:0 0 15px rgba(0,0,0,.2)}.placeholder-widget{padding:16px;border-radius:4px;border:2px dashed #3e5a7c;text-align:center;color:#9baec8;margin-bottom:10px}.contact-widget{min-height:100%;font-size:15px;color:#9baec8;line-height:20px;word-wrap:break-word;font-weight:400;padding:0}.contact-widget h4{padding:10px;text-transform:uppercase;font-weight:700;font-size:13px;color:#9baec8}.contact-widget .account{border-bottom:0;padding:10px 0;padding-top:5px}.contact-widget>a{display:inline-block;padding:10px;padding-top:0;color:#9baec8;text-decoration:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.contact-widget>a:hover,.contact-widget>a:focus,.contact-widget>a:active{text-decoration:underline}.moved-account-widget{padding:15px;padding-bottom:20px;border-radius:4px;background:#121a24;box-shadow:0 0 15px rgba(0,0,0,.2);color:#d9e1e8;font-weight:400;margin-bottom:10px}.moved-account-widget strong,.moved-account-widget a{font-weight:500}.moved-account-widget strong:lang(ja),.moved-account-widget a:lang(ja){font-weight:700}.moved-account-widget strong:lang(ko),.moved-account-widget a:lang(ko){font-weight:700}.moved-account-widget strong:lang(zh-CN),.moved-account-widget a:lang(zh-CN){font-weight:700}.moved-account-widget strong:lang(zh-HK),.moved-account-widget a:lang(zh-HK){font-weight:700}.moved-account-widget strong:lang(zh-TW),.moved-account-widget a:lang(zh-TW){font-weight:700}.moved-account-widget a{color:inherit;text-decoration:underline}.moved-account-widget a.mention{text-decoration:none}.moved-account-widget a.mention span{text-decoration:none}.moved-account-widget a.mention:focus,.moved-account-widget a.mention:hover,.moved-account-widget a.mention:active{text-decoration:none}.moved-account-widget a.mention:focus span,.moved-account-widget a.mention:hover span,.moved-account-widget a.mention:active span{text-decoration:underline}.moved-account-widget__message{margin-bottom:15px}.moved-account-widget__message .fa{margin-right:5px;color:#9baec8}.moved-account-widget__card .detailed-status__display-avatar{position:relative;cursor:pointer}.moved-account-widget__card .detailed-status__display-name{margin-bottom:0;text-decoration:none}.moved-account-widget__card .detailed-status__display-name span{font-weight:400}.memoriam-widget{padding:20px;border-radius:4px;background:#000;box-shadow:0 0 15px rgba(0,0,0,.2);font-size:14px;color:#9baec8;margin-bottom:10px}.page-header{background:#202e3f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;padding:60px 15px;text-align:center;margin:10px 0}.page-header h1{color:#fff;font-size:36px;line-height:1.1;font-weight:700;margin-bottom:10px}.page-header p{font-size:15px;color:#9baec8}@media screen and (max-width: 415px){.page-header{margin-top:0;background:#192432}.page-header h1{font-size:24px}}.directory{background:#121a24;border-radius:4px;box-shadow:0 0 15px rgba(0,0,0,.2)}.directory__tag{box-sizing:border-box;margin-bottom:10px}.directory__tag>a,.directory__tag>div{display:flex;align-items:center;justify-content:space-between;background:#121a24;border-radius:4px;padding:15px;text-decoration:none;color:inherit;box-shadow:0 0 15px rgba(0,0,0,.2)}.directory__tag>a:hover,.directory__tag>a:active,.directory__tag>a:focus{background:#202e3f}.directory__tag.active>a{background:#d8a070;cursor:default}.directory__tag.disabled>div{opacity:.5;cursor:default}.directory__tag h4{flex:1 1 auto;font-size:18px;font-weight:700;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.directory__tag h4 .fa{color:#9baec8}.directory__tag h4 small{display:block;font-weight:400;font-size:15px;margin-top:8px;color:#9baec8}.directory__tag.active h4,.directory__tag.active h4 .fa,.directory__tag.active h4 small{color:#fff}.directory__tag .avatar-stack{flex:0 0 auto;width:120px}.directory__tag.active .avatar-stack .account__avatar{border-color:#d8a070}.avatar-stack{display:flex;justify-content:flex-end}.avatar-stack .account__avatar{flex:0 0 auto;width:36px;height:36px;border-radius:50%;position:relative;margin-left:-10px;background:#040609;border:2px solid #121a24}.avatar-stack .account__avatar:nth-child(1){z-index:1}.avatar-stack .account__avatar:nth-child(2){z-index:2}.avatar-stack .account__avatar:nth-child(3){z-index:3}.accounts-table{width:100%}.accounts-table .account{padding:0;border:0}.accounts-table strong{font-weight:700}.accounts-table thead th{text-align:center;text-transform:uppercase;color:#9baec8;font-weight:700;padding:10px}.accounts-table thead th:first-child{text-align:left}.accounts-table tbody td{padding:15px 0;vertical-align:middle;border-bottom:1px solid #202e3f}.accounts-table tbody tr:last-child td{border-bottom:0}.accounts-table__count{width:120px;text-align:center;font-size:15px;font-weight:500;color:#fff}.accounts-table__count small{display:block;color:#9baec8;font-weight:400;font-size:14px}.accounts-table__comment{width:50%;vertical-align:initial !important}@media screen and (max-width: 415px){.accounts-table tbody td.optional{display:none}}@media screen and (max-width: 415px){.moved-account-widget,.memoriam-widget,.box-widget,.contact-widget,.landing-page__information.contact-widget,.directory,.page-header{margin-bottom:0;box-shadow:none;border-radius:0}}.statuses-grid{min-height:600px}@media screen and (max-width: 640px){.statuses-grid{width:100% !important}}.statuses-grid__item{width:313.3333333333px}@media screen and (max-width: 1255px){.statuses-grid__item{width:306.6666666667px}}@media screen and (max-width: 640px){.statuses-grid__item{width:100%}}@media screen and (max-width: 415px){.statuses-grid__item{width:100vw}}.statuses-grid .detailed-status{border-radius:4px}@media screen and (max-width: 415px){.statuses-grid .detailed-status{border-top:1px solid #2d415a}}.statuses-grid .detailed-status.compact .detailed-status__meta{margin-top:15px}.statuses-grid .detailed-status.compact .status__content{font-size:15px;line-height:20px}.statuses-grid .detailed-status.compact .status__content .emojione{width:20px;height:20px;margin:-3px 0 0}.statuses-grid .detailed-status.compact .status__content .status__content__spoiler-link{line-height:20px;margin:0}.statuses-grid .detailed-status.compact .media-gallery,.statuses-grid .detailed-status.compact .status-card,.statuses-grid .detailed-status.compact .video-player{margin-top:15px}.notice-widget{margin-bottom:10px;color:#9baec8}.notice-widget p{margin-bottom:10px}.notice-widget p:last-child{margin-bottom:0}.notice-widget a{font-size:14px;line-height:20px}.notice-widget a,.placeholder-widget a{text-decoration:none;font-weight:500;color:#d8a070}.notice-widget a:hover,.notice-widget a:focus,.notice-widget a:active,.placeholder-widget a:hover,.placeholder-widget a:focus,.placeholder-widget a:active{text-decoration:underline}.table-of-contents{background:#0b1016;min-height:100%;font-size:14px;border-radius:4px}.table-of-contents li a{display:block;font-weight:500;padding:15px;overflow:hidden;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-decoration:none;color:#fff;border-bottom:1px solid #192432}.table-of-contents li a:hover,.table-of-contents li a:focus,.table-of-contents li a:active{text-decoration:underline}.table-of-contents li:last-child a{border-bottom:0}.table-of-contents li ul{padding-left:20px;border-bottom:1px solid #192432}code{font-family:monospace,monospace;font-weight:400}.form-container{max-width:400px;padding:20px;margin:0 auto}.simple_form .input{margin-bottom:15px;overflow:hidden}.simple_form .input.hidden{margin:0}.simple_form .input.radio_buttons .radio{margin-bottom:15px}.simple_form .input.radio_buttons .radio:last-child{margin-bottom:0}.simple_form .input.radio_buttons .radio>label{position:relative;padding-left:28px}.simple_form .input.radio_buttons .radio>label input{position:absolute;top:-2px;left:0}.simple_form .input.boolean{position:relative;margin-bottom:0}.simple_form .input.boolean .label_input>label{font-family:inherit;font-size:14px;padding-top:5px;color:#fff;display:block;width:auto}.simple_form .input.boolean .label_input,.simple_form .input.boolean .hint{padding-left:28px}.simple_form .input.boolean .label_input__wrapper{position:static}.simple_form .input.boolean label.checkbox{position:absolute;top:2px;left:0}.simple_form .input.boolean label a{color:#d8a070;text-decoration:underline}.simple_form .input.boolean label a:hover,.simple_form .input.boolean label a:active,.simple_form .input.boolean label a:focus{text-decoration:none}.simple_form .input.boolean .recommended{position:absolute;margin:0 4px;margin-top:-2px}.simple_form .row{display:flex;margin:0 -5px}.simple_form .row .input{box-sizing:border-box;flex:1 1 auto;width:50%;padding:0 5px}.simple_form .hint{color:#9baec8}.simple_form .hint a{color:#d8a070}.simple_form .hint code{border-radius:3px;padding:.2em .4em;background:#000}.simple_form span.hint{display:block;font-size:12px;margin-top:4px}.simple_form p.hint{margin-bottom:15px;color:#9baec8}.simple_form p.hint.subtle-hint{text-align:center;font-size:12px;line-height:18px;margin-top:15px;margin-bottom:0}.simple_form .card{margin-bottom:15px}.simple_form strong{font-weight:500}.simple_form strong:lang(ja){font-weight:700}.simple_form strong:lang(ko){font-weight:700}.simple_form strong:lang(zh-CN){font-weight:700}.simple_form strong:lang(zh-HK){font-weight:700}.simple_form strong:lang(zh-TW){font-weight:700}.simple_form .input.with_floating_label .label_input{display:flex}.simple_form .input.with_floating_label .label_input>label{font-family:inherit;font-size:14px;color:#fff;font-weight:500;min-width:150px;flex:0 0 auto}.simple_form .input.with_floating_label .label_input input,.simple_form .input.with_floating_label .label_input select{flex:1 1 auto}.simple_form .input.with_floating_label.select .hint{margin-top:6px;margin-left:150px}.simple_form .input.with_label .label_input>label{font-family:inherit;font-size:14px;color:#fff;display:block;margin-bottom:8px;word-wrap:break-word;font-weight:500}.simple_form .input.with_label .hint{margin-top:6px}.simple_form .input.with_label ul{flex:390px}.simple_form .input.with_block_label{max-width:none}.simple_form .input.with_block_label>label{font-family:inherit;font-size:16px;color:#fff;display:block;font-weight:500;padding-top:5px}.simple_form .input.with_block_label .hint{margin-bottom:15px}.simple_form .input.with_block_label ul{columns:2}.simple_form .input.datetime .label_input select{display:inline-block;width:auto;flex:0}.simple_form .required abbr{text-decoration:none;color:#e87487}.simple_form .fields-group{margin-bottom:25px}.simple_form .fields-group .input:last-child{margin-bottom:0}.simple_form .fields-row{display:flex;margin:0 -10px;padding-top:5px;margin-bottom:25px}.simple_form .fields-row .input{max-width:none}.simple_form .fields-row__column{box-sizing:border-box;padding:0 10px;flex:1 1 auto;min-height:1px}.simple_form .fields-row__column-6{max-width:50%}.simple_form .fields-row__column .actions{margin-top:27px}.simple_form .fields-row .fields-group:last-child,.simple_form .fields-row .fields-row__column.fields-group{margin-bottom:0}@media screen and (max-width: 600px){.simple_form .fields-row{display:block;margin-bottom:0}.simple_form .fields-row__column{max-width:none}.simple_form .fields-row .fields-group:last-child,.simple_form .fields-row .fields-row__column.fields-group,.simple_form .fields-row .fields-row__column{margin-bottom:25px}}.simple_form .input.radio_buttons .radio label{margin-bottom:5px;font-family:inherit;font-size:14px;color:#fff;display:block;width:auto}.simple_form .check_boxes .checkbox label{font-family:inherit;font-size:14px;color:#fff;display:inline-block;width:auto;position:relative;padding-top:5px;padding-left:25px;flex:1 1 auto}.simple_form .check_boxes .checkbox input[type=checkbox]{position:absolute;left:0;top:5px;margin:0}.simple_form .input.static .label_input__wrapper{font-size:16px;padding:10px;border:1px solid #3e5a7c;border-radius:4px}.simple_form input[type=text],.simple_form input[type=number],.simple_form input[type=email],.simple_form input[type=password],.simple_form textarea{box-sizing:border-box;font-size:16px;color:#fff;display:block;width:100%;outline:0;font-family:inherit;resize:vertical;background:#010102;border:1px solid #000;border-radius:4px;padding:10px}.simple_form input[type=text]::placeholder,.simple_form input[type=number]::placeholder,.simple_form input[type=email]::placeholder,.simple_form input[type=password]::placeholder,.simple_form textarea::placeholder{color:#a8b9cf}.simple_form input[type=text]:invalid,.simple_form input[type=number]:invalid,.simple_form input[type=email]:invalid,.simple_form input[type=password]:invalid,.simple_form textarea:invalid{box-shadow:none}.simple_form input[type=text]:focus:invalid:not(:placeholder-shown),.simple_form input[type=number]:focus:invalid:not(:placeholder-shown),.simple_form input[type=email]:focus:invalid:not(:placeholder-shown),.simple_form input[type=password]:focus:invalid:not(:placeholder-shown),.simple_form textarea:focus:invalid:not(:placeholder-shown){border-color:#e87487}.simple_form input[type=text]:required:valid,.simple_form input[type=number]:required:valid,.simple_form input[type=email]:required:valid,.simple_form input[type=password]:required:valid,.simple_form textarea:required:valid{border-color:#79bd9a}.simple_form input[type=text]:hover,.simple_form input[type=number]:hover,.simple_form input[type=email]:hover,.simple_form input[type=password]:hover,.simple_form textarea:hover{border-color:#000}.simple_form input[type=text]:active,.simple_form input[type=text]:focus,.simple_form input[type=number]:active,.simple_form input[type=number]:focus,.simple_form input[type=email]:active,.simple_form input[type=email]:focus,.simple_form input[type=password]:active,.simple_form input[type=password]:focus,.simple_form textarea:active,.simple_form textarea:focus{border-color:#d8a070;background:#040609}.simple_form .input.field_with_errors label{color:#e87487}.simple_form .input.field_with_errors input[type=text],.simple_form .input.field_with_errors input[type=number],.simple_form .input.field_with_errors input[type=email],.simple_form .input.field_with_errors input[type=password],.simple_form .input.field_with_errors textarea,.simple_form .input.field_with_errors select{border-color:#e87487}.simple_form .input.field_with_errors .error{display:block;font-weight:500;color:#e87487;margin-top:4px}.simple_form .input.disabled{opacity:.5}.simple_form .actions{margin-top:30px;display:flex}.simple_form .actions.actions--top{margin-top:0;margin-bottom:30px}.simple_form button,.simple_form .button,.simple_form .block-button{display:block;width:100%;border:0;border-radius:4px;background:#d8a070;color:#fff;font-size:18px;line-height:inherit;height:auto;padding:10px;text-transform:uppercase;text-decoration:none;text-align:center;box-sizing:border-box;cursor:pointer;font-weight:500;outline:0;margin-bottom:10px;margin-right:10px}.simple_form button:last-child,.simple_form .button:last-child,.simple_form .block-button:last-child{margin-right:0}.simple_form button:hover,.simple_form .button:hover,.simple_form .block-button:hover{background-color:#ddad84}.simple_form button:active,.simple_form button:focus,.simple_form .button:active,.simple_form .button:focus,.simple_form .block-button:active,.simple_form .block-button:focus{background-color:#d3935c}.simple_form button:disabled:hover,.simple_form .button:disabled:hover,.simple_form .block-button:disabled:hover{background-color:#9baec8}.simple_form button.negative,.simple_form .button.negative,.simple_form .block-button.negative{background:#df405a}.simple_form button.negative:hover,.simple_form .button.negative:hover,.simple_form .block-button.negative:hover{background-color:#e3566d}.simple_form button.negative:active,.simple_form button.negative:focus,.simple_form .button.negative:active,.simple_form .button.negative:focus,.simple_form .block-button.negative:active,.simple_form .block-button.negative:focus{background-color:#db2a47}.simple_form select{appearance:none;box-sizing:border-box;font-size:16px;color:#fff;display:block;width:100%;outline:0;font-family:inherit;resize:vertical;background:#010102 url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center/auto 16px;border:1px solid #000;border-radius:4px;padding-left:10px;padding-right:30px;height:41px}.simple_form h4{margin-bottom:15px !important}.simple_form .label_input__wrapper{position:relative}.simple_form .label_input__append{position:absolute;right:3px;top:1px;padding:10px;padding-bottom:9px;font-size:16px;color:#3e5a7c;font-family:inherit;pointer-events:none;cursor:default;max-width:140px;white-space:nowrap;overflow:hidden}.simple_form .label_input__append::after{content:\"\";display:block;position:absolute;top:0;right:0;bottom:1px;width:5px;background-image:linear-gradient(to right, rgba(1, 1, 2, 0), #010102)}.simple_form__overlay-area{position:relative}.simple_form__overlay-area__blurred form{filter:blur(2px)}.simple_form__overlay-area__overlay{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;background:rgba(18,26,36,.65);border-radius:4px;margin-left:-4px;margin-top:-4px;padding:4px}.simple_form__overlay-area__overlay__content{text-align:center}.simple_form__overlay-area__overlay__content.rich-formatting,.simple_form__overlay-area__overlay__content.rich-formatting p{color:#fff}.block-icon{display:block;margin:0 auto;margin-bottom:10px;font-size:24px}.flash-message{background:#202e3f;color:#9baec8;border-radius:4px;padding:15px 10px;margin-bottom:30px;text-align:center}.flash-message.notice{border:1px solid rgba(121,189,154,.5);background:rgba(121,189,154,.25);color:#79bd9a}.flash-message.alert{border:1px solid rgba(223,64,90,.5);background:rgba(223,64,90,.25);color:#df405a}.flash-message a{display:inline-block;color:#9baec8;text-decoration:none}.flash-message a:hover{color:#fff;text-decoration:underline}.flash-message p{margin-bottom:15px}.flash-message .oauth-code{outline:0;box-sizing:border-box;display:block;width:100%;border:none;padding:10px;font-family:monospace,monospace;background:#121a24;color:#fff;font-size:14px;margin:0}.flash-message .oauth-code::-moz-focus-inner{border:0}.flash-message .oauth-code::-moz-focus-inner,.flash-message .oauth-code:focus,.flash-message .oauth-code:active{outline:0 !important}.flash-message .oauth-code:focus{background:#192432}.flash-message strong{font-weight:500}.flash-message strong:lang(ja){font-weight:700}.flash-message strong:lang(ko){font-weight:700}.flash-message strong:lang(zh-CN){font-weight:700}.flash-message strong:lang(zh-HK){font-weight:700}.flash-message strong:lang(zh-TW){font-weight:700}@media screen and (max-width: 740px)and (min-width: 441px){.flash-message{margin-top:40px}}.form-footer{margin-top:30px;text-align:center}.form-footer a{color:#9baec8;text-decoration:none}.form-footer a:hover{text-decoration:underline}.quick-nav{list-style:none;margin-bottom:25px;font-size:14px}.quick-nav li{display:inline-block;margin-right:10px}.quick-nav a{color:#d8a070;text-transform:uppercase;text-decoration:none;font-weight:700}.quick-nav a:hover,.quick-nav a:focus,.quick-nav a:active{color:#e1b590}.oauth-prompt,.follow-prompt{margin-bottom:30px;color:#9baec8}.oauth-prompt h2,.follow-prompt h2{font-size:16px;margin-bottom:30px;text-align:center}.oauth-prompt strong,.follow-prompt strong{color:#d9e1e8;font-weight:500}.oauth-prompt strong:lang(ja),.follow-prompt strong:lang(ja){font-weight:700}.oauth-prompt strong:lang(ko),.follow-prompt strong:lang(ko){font-weight:700}.oauth-prompt strong:lang(zh-CN),.follow-prompt strong:lang(zh-CN){font-weight:700}.oauth-prompt strong:lang(zh-HK),.follow-prompt strong:lang(zh-HK){font-weight:700}.oauth-prompt strong:lang(zh-TW),.follow-prompt strong:lang(zh-TW){font-weight:700}@media screen and (max-width: 740px)and (min-width: 441px){.oauth-prompt,.follow-prompt{margin-top:40px}}.qr-wrapper{display:flex;flex-wrap:wrap;align-items:flex-start}.qr-code{flex:0 0 auto;background:#fff;padding:4px;margin:0 10px 20px 0;box-shadow:0 0 15px rgba(0,0,0,.2);display:inline-block}.qr-code svg{display:block;margin:0}.qr-alternative{margin-bottom:20px;color:#d9e1e8;flex:150px}.qr-alternative samp{display:block;font-size:14px}.table-form p{margin-bottom:15px}.table-form p strong{font-weight:500}.table-form p strong:lang(ja){font-weight:700}.table-form p strong:lang(ko){font-weight:700}.table-form p strong:lang(zh-CN){font-weight:700}.table-form p strong:lang(zh-HK){font-weight:700}.table-form p strong:lang(zh-TW){font-weight:700}.simple_form .warning,.table-form .warning{box-sizing:border-box;background:rgba(223,64,90,.5);color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,.3);box-shadow:0 2px 6px rgba(0,0,0,.4);border-radius:4px;padding:10px;margin-bottom:15px}.simple_form .warning a,.table-form .warning a{color:#fff;text-decoration:underline}.simple_form .warning a:hover,.simple_form .warning a:focus,.simple_form .warning a:active,.table-form .warning a:hover,.table-form .warning a:focus,.table-form .warning a:active{text-decoration:none}.simple_form .warning strong,.table-form .warning strong{font-weight:600;display:block;margin-bottom:5px}.simple_form .warning strong:lang(ja),.table-form .warning strong:lang(ja){font-weight:700}.simple_form .warning strong:lang(ko),.table-form .warning strong:lang(ko){font-weight:700}.simple_form .warning strong:lang(zh-CN),.table-form .warning strong:lang(zh-CN){font-weight:700}.simple_form .warning strong:lang(zh-HK),.table-form .warning strong:lang(zh-HK){font-weight:700}.simple_form .warning strong:lang(zh-TW),.table-form .warning strong:lang(zh-TW){font-weight:700}.simple_form .warning strong .fa,.table-form .warning strong .fa{font-weight:400}.action-pagination{display:flex;flex-wrap:wrap;align-items:center}.action-pagination .actions,.action-pagination .pagination{flex:1 1 auto}.action-pagination .actions{padding:30px 0;padding-right:20px;flex:0 0 auto}.post-follow-actions{text-align:center;color:#9baec8}.post-follow-actions div{margin-bottom:4px}.alternative-login{margin-top:20px;margin-bottom:20px}.alternative-login h4{font-size:16px;color:#fff;text-align:center;margin-bottom:20px;border:0;padding:0}.alternative-login .button{display:block}.scope-danger{color:#ff5050}.form_admin_settings_site_short_description textarea,.form_admin_settings_site_description textarea,.form_admin_settings_site_extended_description textarea,.form_admin_settings_site_terms textarea,.form_admin_settings_custom_css textarea,.form_admin_settings_closed_registrations_message textarea{font-family:monospace,monospace}.input-copy{background:#010102;border:1px solid #000;border-radius:4px;display:flex;align-items:center;padding-right:4px;position:relative;top:1px;transition:border-color 300ms linear}.input-copy__wrapper{flex:1 1 auto}.input-copy input[type=text]{background:transparent;border:0;padding:10px;font-size:14px;font-family:monospace,monospace}.input-copy button{flex:0 0 auto;margin:4px;text-transform:none;font-weight:400;font-size:14px;padding:7px 18px;padding-bottom:6px;width:auto;transition:background 300ms linear}.input-copy.copied{border-color:#79bd9a;transition:none}.input-copy.copied button{background:#79bd9a;transition:none}.connection-prompt{margin-bottom:25px}.connection-prompt .fa-link{background-color:#0b1016;border-radius:100%;font-size:24px;padding:10px}.connection-prompt__column{align-items:center;display:flex;flex:1;flex-direction:column;flex-shrink:1;max-width:50%}.connection-prompt__column-sep{align-self:center;flex-grow:0;overflow:visible;position:relative;z-index:1}.connection-prompt__column p{word-break:break-word}.connection-prompt .account__avatar{margin-bottom:20px}.connection-prompt__connection{background-color:#202e3f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;padding:25px 10px;position:relative;text-align:center}.connection-prompt__connection::after{background-color:#0b1016;content:\"\";display:block;height:100%;left:50%;position:absolute;top:0;width:1px}.connection-prompt__row{align-items:flex-start;display:flex;flex-direction:row}.card>a{display:block;text-decoration:none;color:inherit;box-shadow:0 0 15px rgba(0,0,0,.2)}@media screen and (max-width: 415px){.card>a{box-shadow:none}}.card>a:hover .card__bar,.card>a:active .card__bar,.card>a:focus .card__bar{background:#202e3f}.card__img{height:130px;position:relative;background:#000;border-radius:4px 4px 0 0}.card__img img{display:block;width:100%;height:100%;margin:0;object-fit:cover;border-radius:4px 4px 0 0}@media screen and (max-width: 600px){.card__img{height:200px}}@media screen and (max-width: 415px){.card__img{display:none}}.card__bar{position:relative;padding:15px;display:flex;justify-content:flex-start;align-items:center;background:#192432;border-radius:0 0 4px 4px}@media screen and (max-width: 415px){.card__bar{border-radius:0}}.card__bar .avatar{flex:0 0 auto;width:48px;height:48px;width:48px;height:48px;background-size:48px 48px;padding-top:2px}.card__bar .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px;border-radius:8%;background-position:50%;background-clip:padding-box;background:#040609;object-fit:cover}.card__bar .display-name{margin-left:15px;text-align:left}.card__bar .display-name strong{font-size:15px;color:#fff;font-weight:500;overflow:hidden;text-overflow:ellipsis}.card__bar .display-name span{display:block;font-size:14px;color:#9baec8;font-weight:400;overflow:hidden;text-overflow:ellipsis}.pagination{padding:30px 0;text-align:center;overflow:hidden}.pagination a,.pagination .current,.pagination .newer,.pagination .older,.pagination .page,.pagination .gap{font-size:14px;color:#fff;font-weight:500;display:inline-block;padding:6px 10px;text-decoration:none}.pagination .current{background:#fff;border-radius:100px;color:#121a24;cursor:default;margin:0 10px}.pagination .gap{cursor:default}.pagination .older,.pagination .newer{text-transform:uppercase;color:#d9e1e8}.pagination .older{float:left;padding-left:0}.pagination .older .fa{display:inline-block;margin-right:5px}.pagination .newer{float:right;padding-right:0}.pagination .newer .fa{display:inline-block;margin-left:5px}.pagination .disabled{cursor:default;color:#233346}@media screen and (max-width: 700px){.pagination{padding:30px 20px}.pagination .page{display:none}.pagination .newer,.pagination .older{display:inline-block}}.nothing-here{background:#121a24;box-shadow:0 0 15px rgba(0,0,0,.2);color:#9baec8;font-size:14px;font-weight:500;text-align:center;display:flex;justify-content:center;align-items:center;cursor:default;border-radius:4px;padding:20px;min-height:30vh}.nothing-here--under-tabs{border-radius:0 0 4px 4px}.nothing-here--flexible{box-sizing:border-box;min-height:100%}.account-role,.simple_form .recommended{display:inline-block;padding:4px 6px;cursor:default;border-radius:3px;font-size:12px;line-height:12px;font-weight:500;color:#d9e1e8;background-color:rgba(217,225,232,.1);border:1px solid rgba(217,225,232,.5)}.account-role.moderator,.simple_form .recommended.moderator{color:#79bd9a;background-color:rgba(121,189,154,.1);border-color:rgba(121,189,154,.5)}.account-role.admin,.simple_form .recommended.admin{color:#e87487;background-color:rgba(232,116,135,.1);border-color:rgba(232,116,135,.5)}.account__header__fields{max-width:100vw;padding:0;margin:15px -15px -15px;border:0 none;border-top:1px solid #26374d;border-bottom:1px solid #26374d;font-size:14px;line-height:20px}.account__header__fields dl{display:flex;border-bottom:1px solid #26374d}.account__header__fields dt,.account__header__fields dd{box-sizing:border-box;padding:14px;text-align:center;max-height:48px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.account__header__fields dt{font-weight:500;width:120px;flex:0 0 auto;color:#d9e1e8;background:rgba(4,6,9,.5)}.account__header__fields dd{flex:1 1 auto;color:#9baec8}.account__header__fields a{color:#d8a070;text-decoration:none}.account__header__fields a:hover,.account__header__fields a:focus,.account__header__fields a:active{text-decoration:underline}.account__header__fields .verified{border:1px solid rgba(121,189,154,.5);background:rgba(121,189,154,.25)}.account__header__fields .verified a{color:#79bd9a;font-weight:500}.account__header__fields .verified__mark{color:#79bd9a}.account__header__fields dl:last-child{border-bottom:0}.directory__tag .trends__item__current{width:auto}.pending-account__header{color:#9baec8}.pending-account__header a{color:#d9e1e8;text-decoration:none}.pending-account__header a:hover,.pending-account__header a:active,.pending-account__header a:focus{text-decoration:underline}.pending-account__header strong{color:#fff;font-weight:700}.pending-account__body{margin-top:10px}.activity-stream{box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;overflow:hidden;margin-bottom:10px}@media screen and (max-width: 415px){.activity-stream{margin-bottom:0;border-radius:0;box-shadow:none}}.activity-stream--headless{border-radius:0;margin:0;box-shadow:none}.activity-stream--headless .detailed-status,.activity-stream--headless .status{border-radius:0 !important}.activity-stream div[data-component]{width:100%}.activity-stream .entry{background:#121a24}.activity-stream .entry .detailed-status,.activity-stream .entry .status,.activity-stream .entry .load-more{animation:none}.activity-stream .entry:last-child .detailed-status,.activity-stream .entry:last-child .status,.activity-stream .entry:last-child .load-more{border-bottom:0;border-radius:0 0 4px 4px}.activity-stream .entry:first-child .detailed-status,.activity-stream .entry:first-child .status,.activity-stream .entry:first-child .load-more{border-radius:4px 4px 0 0}.activity-stream .entry:first-child:last-child .detailed-status,.activity-stream .entry:first-child:last-child .status,.activity-stream .entry:first-child:last-child .load-more{border-radius:4px}@media screen and (max-width: 740px){.activity-stream .entry .detailed-status,.activity-stream .entry .status,.activity-stream .entry .load-more{border-radius:0 !important}}.activity-stream--highlighted .entry{background:#202e3f}.button.logo-button{flex:0 auto;font-size:14px;background:#d8a070;color:#fff;text-transform:none;line-height:36px;height:auto;padding:3px 15px;border:0}.button.logo-button svg{width:20px;height:auto;vertical-align:middle;margin-right:5px;fill:#fff}.button.logo-button:active,.button.logo-button:focus,.button.logo-button:hover{background:#e3bb98}.button.logo-button:disabled:active,.button.logo-button:disabled:focus,.button.logo-button:disabled:hover,.button.logo-button.disabled:active,.button.logo-button.disabled:focus,.button.logo-button.disabled:hover{background:#9baec8}.button.logo-button.button--destructive:active,.button.logo-button.button--destructive:focus,.button.logo-button.button--destructive:hover{background:#df405a}@media screen and (max-width: 415px){.button.logo-button svg{display:none}}.embed .detailed-status,.public-layout .detailed-status{padding:15px}.embed .status,.public-layout .status{padding:15px 15px 15px 78px;min-height:50px}.embed .status__avatar,.public-layout .status__avatar{left:15px;top:17px}.embed .status__content,.public-layout .status__content{padding-top:5px}.embed .status__prepend,.public-layout .status__prepend{padding:8px 0;padding-bottom:2px;margin:initial;margin-left:78px;padding-top:15px}.embed .status__prepend-icon-wrapper,.public-layout .status__prepend-icon-wrapper{position:absolute;margin:initial;float:initial;width:auto;left:-32px}.embed .status .media-gallery,.embed .status__action-bar,.embed .status .video-player,.public-layout .status .media-gallery,.public-layout .status__action-bar,.public-layout .status .video-player{margin-top:10px}.embed .status .status__info,.public-layout .status .status__info{font-size:15px;display:initial}.embed .status .status__relative-time,.public-layout .status .status__relative-time{color:#3e5a7c;float:right;font-size:14px;width:auto;margin:initial;padding:initial}.embed .status .status__info .status__display-name,.public-layout .status .status__info .status__display-name{display:block;max-width:100%;padding:6px 0;padding-right:25px;margin:initial}.embed .status .status__info .status__display-name .display-name strong,.public-layout .status .status__info .status__display-name .display-name strong{display:inline}.embed .status .status__avatar,.public-layout .status .status__avatar{height:48px;position:absolute;width:48px;margin:initial}.rtl .embed .status,.rtl .public-layout .status{padding-left:10px;padding-right:68px}.rtl .embed .status .status__info .status__display-name,.rtl .public-layout .status .status__info .status__display-name{padding-left:25px;padding-right:0}.rtl .embed .status .status__relative-time,.rtl .public-layout .status .status__relative-time{float:left}.status__content__read-more-button{display:block;font-size:15px;line-height:20px;color:#e1b590;border:0;background:transparent;padding:0;padding-top:8px;text-decoration:none}.status__content__read-more-button:hover,.status__content__read-more-button:active{text-decoration:underline}.app-body{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.animated-number{display:inline-flex;flex-direction:column;align-items:stretch;overflow:hidden;position:relative}.link-button{display:block;font-size:15px;line-height:20px;color:#d8a070;border:0;background:transparent;padding:0;cursor:pointer}.link-button:hover,.link-button:active{text-decoration:underline}.link-button:disabled{color:#9baec8;cursor:default}.button{background-color:#d59864;border:10px none;border-radius:4px;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-family:inherit;font-size:14px;font-weight:500;height:36px;letter-spacing:0;line-height:36px;overflow:hidden;padding:0 16px;position:relative;text-align:center;text-transform:uppercase;text-decoration:none;text-overflow:ellipsis;transition:all 100ms ease-in;transition-property:background-color;white-space:nowrap;width:auto}.button:active,.button:focus,.button:hover{background-color:#e0b38c;transition:all 200ms ease-out;transition-property:background-color}.button--destructive{transition:none}.button--destructive:active,.button--destructive:focus,.button--destructive:hover{background-color:#df405a;transition:none}.button:disabled{background-color:#9baec8;cursor:default}.button.button-primary,.button.button-alternative,.button.button-secondary,.button.button-alternative-2{font-size:16px;line-height:36px;height:auto;text-transform:none;padding:4px 16px}.button.button-alternative{color:#121a24;background:#9baec8}.button.button-alternative:active,.button.button-alternative:focus,.button.button-alternative:hover{background-color:#a8b9cf}.button.button-alternative-2{background:#3e5a7c}.button.button-alternative-2:active,.button.button-alternative-2:focus,.button.button-alternative-2:hover{background-color:#45648a}.button.button-secondary{font-size:16px;line-height:36px;height:auto;color:#9baec8;text-transform:none;background:transparent;padding:3px 15px;border-radius:4px;border:1px solid #9baec8}.button.button-secondary:active,.button.button-secondary:focus,.button.button-secondary:hover{border-color:#a8b9cf;color:#a8b9cf}.button.button-secondary:disabled{opacity:.5}.button.button--block{display:block;width:100%}.icon-button{display:inline-block;padding:0;color:#3e5a7c;border:0;border-radius:4px;background:transparent;cursor:pointer;transition:all 100ms ease-in;transition-property:background-color,color}.icon-button:hover,.icon-button:active,.icon-button:focus{color:#4a6b94;background-color:rgba(62,90,124,.15);transition:all 200ms ease-out;transition-property:background-color,color}.icon-button:focus{background-color:rgba(62,90,124,.3)}.icon-button.disabled{color:#283a50;background-color:transparent;cursor:default}.icon-button.active{color:#d8a070}.icon-button::-moz-focus-inner{border:0}.icon-button::-moz-focus-inner,.icon-button:focus,.icon-button:active{outline:0 !important}.icon-button.inverted{color:#3e5a7c}.icon-button.inverted:hover,.icon-button.inverted:active,.icon-button.inverted:focus{color:#324965;background-color:rgba(62,90,124,.15)}.icon-button.inverted:focus{background-color:rgba(62,90,124,.3)}.icon-button.inverted.disabled{color:#4a6b94;background-color:transparent}.icon-button.inverted.active{color:#d8a070}.icon-button.inverted.active.disabled{color:#e6c3a4}.icon-button.overlayed{box-sizing:content-box;background:rgba(0,0,0,.6);color:rgba(255,255,255,.7);border-radius:4px;padding:2px}.icon-button.overlayed:hover{background:rgba(0,0,0,.9)}.text-icon-button{color:#3e5a7c;border:0;border-radius:4px;background:transparent;cursor:pointer;font-weight:600;font-size:11px;padding:0 3px;line-height:27px;outline:0;transition:all 100ms ease-in;transition-property:background-color,color}.text-icon-button:hover,.text-icon-button:active,.text-icon-button:focus{color:#324965;background-color:rgba(62,90,124,.15);transition:all 200ms ease-out;transition-property:background-color,color}.text-icon-button:focus{background-color:rgba(62,90,124,.3)}.text-icon-button.disabled{color:#6b8cb5;background-color:transparent;cursor:default}.text-icon-button.active{color:#d8a070}.text-icon-button::-moz-focus-inner{border:0}.text-icon-button::-moz-focus-inner,.text-icon-button:focus,.text-icon-button:active{outline:0 !important}.dropdown-menu{position:absolute;transform-origin:50% 0}.invisible{font-size:0;line-height:0;display:inline-block;width:0;height:0;position:absolute}.invisible img,.invisible svg{margin:0 !important;border:0 !important;padding:0 !important;width:0 !important;height:0 !important}.ellipsis::after{content:\"…\"}.notification__favourite-icon-wrapper{left:0;position:absolute}.notification__favourite-icon-wrapper .fa.star-icon{color:#ca8f04}.star-icon.active{color:#ca8f04}.bookmark-icon.active{color:#ff5050}.no-reduce-motion .icon-button.star-icon.activate>.fa-star{animation:spring-rotate-in 1s linear}.no-reduce-motion .icon-button.star-icon.deactivate>.fa-star{animation:spring-rotate-out 1s linear}.notification__display-name{color:inherit;font-weight:500;text-decoration:none}.notification__display-name:hover{color:#fff;text-decoration:underline}.display-name{display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.display-name a{color:inherit;text-decoration:inherit}.display-name strong{height:18px;font-size:16px;font-weight:500;line-height:18px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.display-name span{display:block;height:18px;font-size:15px;line-height:18px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.display-name>a:hover strong{text-decoration:underline}.display-name.inline{padding:0;height:18px;font-size:15px;line-height:18px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.display-name.inline strong{display:inline;height:auto;font-size:inherit;line-height:inherit}.display-name.inline span{display:inline;height:auto;font-size:inherit;line-height:inherit}.display-name__html{font-weight:500}.display-name__account{font-size:14px}.image-loader{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center;flex-direction:column}.image-loader .image-loader__preview-canvas{max-width:100%;max-height:80%;background:url(\"~images/void.png\") repeat;object-fit:contain}.image-loader .loading-bar{position:relative}.image-loader.image-loader--amorphous .image-loader__preview-canvas{display:none}.zoomable-image{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center}.zoomable-image img{max-width:100%;max-height:80%;width:auto;height:auto;object-fit:contain}.dropdown{display:inline-block}.dropdown__content{display:none;position:absolute}.dropdown-menu__separator{border-bottom:1px solid #c0cdd9;margin:5px 7px 6px;height:0}.dropdown-menu{background:#d9e1e8;padding:4px 0;border-radius:4px;box-shadow:2px 4px 15px rgba(0,0,0,.4)}.dropdown-menu ul{list-style:none}.dropdown-menu__arrow{position:absolute;width:0;height:0;border:0 solid transparent}.dropdown-menu__arrow.left{right:-5px;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#d9e1e8}.dropdown-menu__arrow.top{bottom:-5px;margin-left:-7px;border-width:5px 7px 0;border-top-color:#d9e1e8}.dropdown-menu__arrow.bottom{top:-5px;margin-left:-7px;border-width:0 7px 5px;border-bottom-color:#d9e1e8}.dropdown-menu__arrow.right{left:-5px;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#d9e1e8}.dropdown-menu__item a{font-size:13px;line-height:18px;display:block;padding:4px 14px;box-sizing:border-box;text-decoration:none;background:#d9e1e8;color:#121a24;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown-menu__item a:focus,.dropdown-menu__item a:hover,.dropdown-menu__item a:active{background:#d8a070;color:#d9e1e8;outline:0}.dropdown--active .dropdown__content{display:block;line-height:18px;max-width:311px;right:0;text-align:left;z-index:9999}.dropdown--active .dropdown__content>ul{list-style:none;background:#d9e1e8;padding:4px 0;border-radius:4px;box-shadow:0 0 15px rgba(0,0,0,.4);min-width:140px;position:relative}.dropdown--active .dropdown__content.dropdown__right{right:0}.dropdown--active .dropdown__content.dropdown__left>ul{left:-98px}.dropdown--active .dropdown__content>ul>li>a{font-size:13px;line-height:18px;display:block;padding:4px 14px;box-sizing:border-box;text-decoration:none;background:#d9e1e8;color:#121a24;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown--active .dropdown__content>ul>li>a:focus{outline:0}.dropdown--active .dropdown__content>ul>li>a:hover{background:#d8a070;color:#d9e1e8}.dropdown__icon{vertical-align:middle}.static-content{padding:10px;padding-top:20px;color:#3e5a7c}.static-content h1{font-size:16px;font-weight:500;margin-bottom:40px;text-align:center}.static-content p{font-size:13px;margin-bottom:20px}.column,.drawer{flex:1 1 100%;overflow:hidden}@media screen and (min-width: 631px){.columns-area{padding:0}.column,.drawer{flex:0 0 auto;padding:10px;padding-left:5px;padding-right:5px}.column:first-child,.drawer:first-child{padding-left:10px}.column:last-child,.drawer:last-child{padding-right:10px}.columns-area>div .column,.columns-area>div .drawer{padding-left:5px;padding-right:5px}}.tabs-bar{box-sizing:border-box;display:flex;background:#202e3f;flex:0 0 auto;overflow-y:auto}.tabs-bar__link{display:block;flex:1 1 auto;padding:15px 10px;padding-bottom:13px;color:#fff;text-decoration:none;text-align:center;font-size:14px;font-weight:500;border-bottom:2px solid #202e3f;transition:all 50ms linear;transition-property:border-bottom,background,color}.tabs-bar__link .fa{font-weight:400;font-size:16px}@media screen and (min-width: 631px){.auto-columns .tabs-bar__link:hover,.auto-columns .tabs-bar__link:focus,.auto-columns .tabs-bar__link:active{background:#2a3c54;border-bottom-color:#2a3c54}}.multi-columns .tabs-bar__link:hover,.multi-columns .tabs-bar__link:focus,.multi-columns .tabs-bar__link:active{background:#2a3c54;border-bottom-color:#2a3c54}.tabs-bar__link.active{border-bottom:2px solid #d8a070;color:#d8a070}.tabs-bar__link span{margin-left:5px;display:none}.tabs-bar__link span.icon{margin-left:0;display:inline}.icon-with-badge{position:relative}.icon-with-badge__badge{position:absolute;left:9px;top:-13px;background:#d8a070;border:2px solid #202e3f;padding:1px 6px;border-radius:6px;font-size:10px;font-weight:500;line-height:14px;color:#fff}.column-link--transparent .icon-with-badge__badge{border-color:#040609}.scrollable{overflow-y:scroll;overflow-x:hidden;flex:1 1 auto;-webkit-overflow-scrolling:touch}.scrollable.optionally-scrollable{overflow-y:auto}@supports(display: grid){.scrollable{contain:strict}}.scrollable--flex{display:flex;flex-direction:column}.scrollable__append{flex:1 1 auto;position:relative;min-height:120px}@supports(display: grid){.scrollable.fullscreen{contain:none}}.react-toggle{display:inline-block;position:relative;cursor:pointer;background-color:transparent;border:0;padding:0;user-select:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-tap-highlight-color:transparent}.react-toggle-screenreader-only{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.react-toggle--disabled{cursor:not-allowed;opacity:.5;transition:opacity .25s}.react-toggle-track{width:50px;height:24px;padding:0;border-radius:30px;background-color:#121a24;transition:background-color .2s ease}.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track{background-color:#010102}.react-toggle--checked .react-toggle-track{background-color:#d8a070}.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track{background-color:#e3bb98}.react-toggle-track-check{position:absolute;width:14px;height:10px;top:0;bottom:0;margin-top:auto;margin-bottom:auto;line-height:0;left:8px;opacity:0;transition:opacity .25s ease}.react-toggle--checked .react-toggle-track-check{opacity:1;transition:opacity .25s ease}.react-toggle-track-x{position:absolute;width:10px;height:10px;top:0;bottom:0;margin-top:auto;margin-bottom:auto;line-height:0;right:10px;opacity:1;transition:opacity .25s ease}.react-toggle--checked .react-toggle-track-x{opacity:0}.react-toggle-thumb{position:absolute;top:1px;left:1px;width:22px;height:22px;border:1px solid #121a24;border-radius:50%;background-color:#fafafa;box-sizing:border-box;transition:all .25s ease;transition-property:border-color,left}.react-toggle--checked .react-toggle-thumb{left:27px;border-color:#d8a070}.getting-started__wrapper,.getting_started,.flex-spacer{background:#121a24}.getting-started__wrapper{position:relative;overflow-y:auto}.flex-spacer{flex:1 1 auto}.getting-started{background:#121a24;flex:1 0 auto}.getting-started p{color:#d9e1e8}.getting-started a{color:#3e5a7c}.getting-started__panel{height:min-content}.getting-started__panel,.getting-started__footer{padding:10px;padding-top:20px;flex:0 1 auto}.getting-started__panel ul,.getting-started__footer ul{margin-bottom:10px}.getting-started__panel ul li,.getting-started__footer ul li{display:inline}.getting-started__panel p,.getting-started__footer p{color:#3e5a7c;font-size:13px}.getting-started__panel p a,.getting-started__footer p a{color:#3e5a7c;text-decoration:underline}.getting-started__panel a,.getting-started__footer a{text-decoration:none;color:#9baec8}.getting-started__panel a:hover,.getting-started__panel a:focus,.getting-started__panel a:active,.getting-started__footer a:hover,.getting-started__footer a:focus,.getting-started__footer a:active{text-decoration:underline}.getting-started__trends{flex:0 1 auto;opacity:1;animation:fade 150ms linear;margin-top:10px}.getting-started__trends h4{font-size:12px;text-transform:uppercase;color:#9baec8;padding:10px;font-weight:500;border-bottom:1px solid #202e3f}@media screen and (max-height: 810px){.getting-started__trends .trends__item:nth-child(3){display:none}}@media screen and (max-height: 720px){.getting-started__trends .trends__item:nth-child(2){display:none}}@media screen and (max-height: 670px){.getting-started__trends{display:none}}.getting-started__trends .trends__item{border-bottom:0;padding:10px}.getting-started__trends .trends__item__current{color:#9baec8}.column-link__badge{display:inline-block;border-radius:4px;font-size:12px;line-height:19px;font-weight:500;background:#121a24;padding:4px 8px;margin:-6px 10px}.keyboard-shortcuts{padding:8px 0 0;overflow:hidden}.keyboard-shortcuts thead{position:absolute;left:-9999px}.keyboard-shortcuts td{padding:0 10px 8px}.keyboard-shortcuts kbd{display:inline-block;padding:3px 5px;background-color:#202e3f;border:1px solid #0b1016}.setting-text{color:#9baec8;background:transparent;border:none;border-bottom:2px solid #9baec8;box-sizing:border-box;display:block;font-family:inherit;margin-bottom:10px;padding:7px 0;width:100%}.setting-text:focus,.setting-text:active{color:#fff;border-bottom-color:#d8a070}@media screen and (max-width: 600px){.auto-columns .setting-text,.single-column .setting-text{font-size:16px}}.setting-text.light{color:#121a24;border-bottom:2px solid #405c80}.setting-text.light:focus,.setting-text.light:active{color:#121a24;border-bottom-color:#d8a070}.no-reduce-motion button.icon-button i.fa-retweet{background-position:0 0;height:19px;transition:background-position .9s steps(10);transition-duration:0s;vertical-align:middle;width:22px}.no-reduce-motion button.icon-button i.fa-retweet::before{display:none !important}.no-reduce-motion button.icon-button.active i.fa-retweet{transition-duration:.9s;background-position:0 100%}.reduce-motion button.icon-button i.fa-retweet{color:#3e5a7c;transition:color 100ms ease-in}.reduce-motion button.icon-button.active i.fa-retweet{color:#d8a070}.reduce-motion button.icon-button.disabled i.fa-retweet{color:#283a50}.load-more{display:block;color:#3e5a7c;background-color:transparent;border:0;font-size:inherit;text-align:center;line-height:inherit;margin:0;padding:15px;box-sizing:border-box;width:100%;clear:both;text-decoration:none}.load-more:hover{background:#151f2b}.load-gap{border-bottom:1px solid #202e3f}.missing-indicator{padding-top:68px}.scrollable>div>:first-child .notification__dismiss-overlay>.wrappy{border-top:1px solid #121a24}.notification__dismiss-overlay{overflow:hidden;position:absolute;top:0;right:0;bottom:-1px;padding-left:15px;z-index:999;align-items:center;justify-content:flex-end;cursor:pointer;display:flex}.notification__dismiss-overlay .wrappy{width:4rem;align-self:stretch;display:flex;flex-direction:column;align-items:center;justify-content:center;background:#202e3f;border-left:1px solid #344b68;box-shadow:0 0 5px #000;border-bottom:1px solid #121a24}.notification__dismiss-overlay .ckbox{border:2px solid #9baec8;border-radius:2px;width:30px;height:30px;font-size:20px;color:#9baec8;text-shadow:0 0 5px #000;display:flex;justify-content:center;align-items:center}.notification__dismiss-overlay:focus{outline:0 !important}.notification__dismiss-overlay:focus .ckbox{box-shadow:0 0 1px 1px #d8a070}.text-btn{display:inline-block;padding:0;font-family:inherit;font-size:inherit;color:inherit;border:0;background:transparent;cursor:pointer}.loading-indicator{color:#3e5a7c;font-size:12px;font-weight:400;text-transform:uppercase;overflow:visible;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.loading-indicator span{display:block;float:left;margin-left:50%;transform:translateX(-50%);margin:82px 0 0 50%;white-space:nowrap}.loading-indicator__figure{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);width:42px;height:42px;box-sizing:border-box;background-color:transparent;border:0 solid #3e5a7c;border-width:6px;border-radius:50%}.no-reduce-motion .loading-indicator span{animation:loader-label 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1)}.no-reduce-motion .loading-indicator__figure{animation:loader-figure 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1)}@keyframes spring-rotate-in{0%{transform:rotate(0deg)}30%{transform:rotate(-484.8deg)}60%{transform:rotate(-316.7deg)}90%{transform:rotate(-375deg)}100%{transform:rotate(-360deg)}}@keyframes spring-rotate-out{0%{transform:rotate(-360deg)}30%{transform:rotate(124.8deg)}60%{transform:rotate(-43.27deg)}90%{transform:rotate(15deg)}100%{transform:rotate(0deg)}}@keyframes loader-figure{0%{width:0;height:0;background-color:#3e5a7c}29%{background-color:#3e5a7c}30%{width:42px;height:42px;background-color:transparent;border-width:21px;opacity:1}100%{width:42px;height:42px;border-width:0;opacity:0;background-color:transparent}}@keyframes loader-label{0%{opacity:.25}30%{opacity:1}100%{opacity:.25}}.spoiler-button{top:0;left:0;width:100%;height:100%;position:absolute;z-index:100}.spoiler-button--minified{display:flex;left:4px;top:4px;width:auto;height:auto;align-items:center}.spoiler-button--click-thru{pointer-events:none}.spoiler-button--hidden{display:none}.spoiler-button__overlay{display:block;background:transparent;width:100%;height:100%;border:0}.spoiler-button__overlay__label{display:inline-block;background:rgba(0,0,0,.5);border-radius:8px;padding:8px 12px;color:#fff;font-weight:500;font-size:14px}.spoiler-button__overlay:hover .spoiler-button__overlay__label,.spoiler-button__overlay:focus .spoiler-button__overlay__label,.spoiler-button__overlay:active .spoiler-button__overlay__label{background:rgba(0,0,0,.8)}.spoiler-button__overlay:disabled .spoiler-button__overlay__label{background:rgba(0,0,0,.5)}.setting-toggle{display:block;line-height:24px}.setting-toggle__label,.setting-radio__label,.setting-meta__label{color:#9baec8;display:inline-block;margin-bottom:14px;margin-left:8px;vertical-align:middle}.setting-radio{display:block;line-height:18px}.setting-radio__label{margin-bottom:0}.column-settings__row legend{color:#9baec8;cursor:default;display:block;font-weight:500;margin-top:10px}.setting-radio__input{vertical-align:middle}.setting-meta__label{float:right}@keyframes heartbeat{from{transform:scale(1);transform-origin:center center;animation-timing-function:ease-out}10%{transform:scale(0.91);animation-timing-function:ease-in}17%{transform:scale(0.98);animation-timing-function:ease-out}33%{transform:scale(0.87);animation-timing-function:ease-in}45%{transform:scale(1);animation-timing-function:ease-out}}.pulse-loading{animation:heartbeat 1.5s ease-in-out infinite both}.upload-area{align-items:center;background:rgba(0,0,0,.8);display:flex;height:100%;justify-content:center;left:0;opacity:0;position:absolute;top:0;visibility:hidden;width:100%;z-index:2000}.upload-area *{pointer-events:none}.upload-area__drop{width:320px;height:160px;display:flex;box-sizing:border-box;position:relative;padding:8px}.upload-area__background{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;border-radius:4px;background:#121a24;box-shadow:0 0 5px rgba(0,0,0,.2)}.upload-area__content{flex:1;display:flex;align-items:center;justify-content:center;color:#d9e1e8;font-size:18px;font-weight:500;border:2px dashed #3e5a7c;border-radius:4px}.dropdown--active .emoji-button img{opacity:1;filter:none}.loading-bar{background-color:#d8a070;height:3px;position:absolute;top:0;left:0;z-index:9999}.icon-badge-wrapper{position:relative}.icon-badge{position:absolute;display:block;right:-0.25em;top:-0.25em;background-color:#d8a070;border-radius:50%;font-size:75%;width:1em;height:1em}.conversation{display:flex;border-bottom:1px solid #202e3f;padding:5px;padding-bottom:0}.conversation:focus{background:#151f2b;outline:0}.conversation__avatar{flex:0 0 auto;padding:10px;padding-top:12px;position:relative;cursor:pointer}.conversation__unread{display:inline-block;background:#d8a070;border-radius:50%;width:.625rem;height:.625rem;margin:-0.1ex .15em .1ex}.conversation__content{flex:1 1 auto;padding:10px 5px;padding-right:15px;overflow:hidden}.conversation__content__info{overflow:hidden;display:flex;flex-direction:row-reverse;justify-content:space-between}.conversation__content__relative-time{font-size:15px;color:#9baec8;padding-left:15px}.conversation__content__names{color:#9baec8;font-size:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:4px;flex-basis:90px;flex-grow:1}.conversation__content__names a{color:#fff;text-decoration:none}.conversation__content__names a:hover,.conversation__content__names a:focus,.conversation__content__names a:active{text-decoration:underline}.conversation__content .status__content{margin:0}.conversation--unread{background:#151f2b}.conversation--unread:focus{background:#192432}.conversation--unread .conversation__content__info{font-weight:700}.conversation--unread .conversation__content__relative-time{color:#fff}.ui .flash-message{margin-top:10px;margin-left:auto;margin-right:auto;margin-bottom:0;min-width:75%}::-webkit-scrollbar-thumb{border-radius:0}noscript{text-align:center}noscript img{width:200px;opacity:.5;animation:flicker 4s infinite}noscript div{font-size:14px;margin:30px auto;color:#d9e1e8;max-width:400px}noscript div a{color:#d8a070;text-decoration:underline}noscript div a:hover{text-decoration:none}noscript div a{word-break:break-word}@keyframes flicker{0%{opacity:1}30%{opacity:.75}100%{opacity:1}}button.icon-button i.fa-retweet{background-image:url(\"data:image/svg+xml;utf8,\")}button.icon-button i.fa-retweet:hover{background-image:url(\"data:image/svg+xml;utf8,\")}button.icon-button.disabled i.fa-retweet,button.icon-button.disabled i.fa-retweet:hover{background-image:url(\"data:image/svg+xml;utf8,\")}.status-direct button.icon-button.disabled i.fa-retweet,.status-direct button.icon-button.disabled i.fa-retweet:hover{background-image:url(\"data:image/svg+xml;utf8,\")}.account{padding:10px;border-bottom:1px solid #202e3f;color:inherit;text-decoration:none}.account .account__display-name{flex:1 1 auto;display:block;color:#9baec8;overflow:hidden;text-decoration:none;font-size:14px}.account.small{border:none;padding:0}.account.small>.account__avatar-wrapper{margin:0 8px 0 0}.account.small>.display-name{height:24px;line-height:24px}.account__wrapper{display:flex}.account__avatar-wrapper{float:left;margin-left:12px;margin-right:12px}.account__avatar{border-radius:8%;background-position:50%;background-clip:padding-box;position:relative;cursor:pointer}.account__avatar-inline{display:inline-block;vertical-align:middle;margin-right:5px}.account__avatar-composite{border-radius:8%;background-position:50%;background-clip:padding-box;overflow:hidden;position:relative}.account__avatar-composite div{border-radius:8%;background-position:50%;background-clip:padding-box;float:left;position:relative;box-sizing:border-box}.account__avatar-composite__label{display:block;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);color:#fff;text-shadow:1px 1px 2px #000;font-weight:700;font-size:15px}.account__avatar-overlay{position:relative;width:48px;height:48px;background-size:48px 48px}.account__avatar-overlay-base{border-radius:8%;background-position:50%;background-clip:padding-box;width:36px;height:36px;background-size:36px 36px}.account__avatar-overlay-overlay{border-radius:8%;background-position:50%;background-clip:padding-box;width:24px;height:24px;background-size:24px 24px;position:absolute;bottom:0;right:0;z-index:1}.account__relationship{height:18px;padding:10px;white-space:nowrap}.account__header__wrapper{flex:0 0 auto;background:#192432}.account__disclaimer{padding:10px;color:#3e5a7c}.account__disclaimer strong{font-weight:500}.account__disclaimer strong:lang(ja){font-weight:700}.account__disclaimer strong:lang(ko){font-weight:700}.account__disclaimer strong:lang(zh-CN){font-weight:700}.account__disclaimer strong:lang(zh-HK){font-weight:700}.account__disclaimer strong:lang(zh-TW){font-weight:700}.account__disclaimer a{font-weight:500;color:inherit;text-decoration:underline}.account__disclaimer a:hover,.account__disclaimer a:focus,.account__disclaimer a:active{text-decoration:none}.account__action-bar{border-top:1px solid #202e3f;border-bottom:1px solid #202e3f;line-height:36px;overflow:hidden;flex:0 0 auto;display:flex}.account__action-bar-links{display:flex;flex:1 1 auto;line-height:18px;text-align:center}.account__action-bar__tab{text-decoration:none;overflow:hidden;flex:0 1 100%;border-left:1px solid #202e3f;padding:10px 0;border-bottom:4px solid transparent}.account__action-bar__tab:first-child{border-left:0}.account__action-bar__tab.active{border-bottom:4px solid #d8a070}.account__action-bar__tab>span{display:block;text-transform:uppercase;font-size:11px;color:#9baec8}.account__action-bar__tab strong{display:block;font-size:15px;font-weight:500;color:#fff}.account__action-bar__tab strong:lang(ja){font-weight:700}.account__action-bar__tab strong:lang(ko){font-weight:700}.account__action-bar__tab strong:lang(zh-CN){font-weight:700}.account__action-bar__tab strong:lang(zh-HK){font-weight:700}.account__action-bar__tab strong:lang(zh-TW){font-weight:700}.account__action-bar__tab abbr{color:#d8a070}.account-authorize{padding:14px 10px}.account-authorize .detailed-status__display-name{display:block;margin-bottom:15px;overflow:hidden}.account-authorize__avatar{float:left;margin-right:10px}.notification__message{margin-left:42px;padding:8px 0 0 26px;cursor:default;color:#9baec8;font-size:15px;position:relative}.notification__message .fa{color:#d8a070}.notification__message>span{display:block;overflow:hidden;text-overflow:ellipsis}.account--panel{background:#192432;border-top:1px solid #202e3f;border-bottom:1px solid #202e3f;display:flex;flex-direction:row;padding:10px 0}.account--panel__button,.detailed-status__button{flex:1 1 auto;text-align:center}.column-settings__outer{background:#202e3f;padding:15px}.column-settings__section{color:#9baec8;cursor:default;display:block;font-weight:500;margin-bottom:10px}.column-settings__hashtags .column-settings__row{margin-bottom:15px}.column-settings__hashtags .column-select__control{outline:0;box-sizing:border-box;width:100%;border:none;box-shadow:none;font-family:inherit;background:#121a24;color:#9baec8;font-size:14px;margin:0}.column-settings__hashtags .column-select__control::placeholder{color:#a8b9cf}.column-settings__hashtags .column-select__control::-moz-focus-inner{border:0}.column-settings__hashtags .column-select__control::-moz-focus-inner,.column-settings__hashtags .column-select__control:focus,.column-settings__hashtags .column-select__control:active{outline:0 !important}.column-settings__hashtags .column-select__control:focus{background:#192432}@media screen and (max-width: 600px){.column-settings__hashtags .column-select__control{font-size:16px}}.column-settings__hashtags .column-select__placeholder{color:#3e5a7c;padding-left:2px;font-size:12px}.column-settings__hashtags .column-select__value-container{padding-left:6px}.column-settings__hashtags .column-select__multi-value{background:#202e3f}.column-settings__hashtags .column-select__multi-value__remove{cursor:pointer}.column-settings__hashtags .column-select__multi-value__remove:hover,.column-settings__hashtags .column-select__multi-value__remove:active,.column-settings__hashtags .column-select__multi-value__remove:focus{background:#26374d;color:#a8b9cf}.column-settings__hashtags .column-select__multi-value__label,.column-settings__hashtags .column-select__input{color:#9baec8}.column-settings__hashtags .column-select__clear-indicator,.column-settings__hashtags .column-select__dropdown-indicator{cursor:pointer;transition:none;color:#3e5a7c}.column-settings__hashtags .column-select__clear-indicator:hover,.column-settings__hashtags .column-select__clear-indicator:active,.column-settings__hashtags .column-select__clear-indicator:focus,.column-settings__hashtags .column-select__dropdown-indicator:hover,.column-settings__hashtags .column-select__dropdown-indicator:active,.column-settings__hashtags .column-select__dropdown-indicator:focus{color:#45648a}.column-settings__hashtags .column-select__indicator-separator{background-color:#202e3f}.column-settings__hashtags .column-select__menu{background:#fff;border-radius:4px;padding:10px 14px;padding-bottom:14px;margin-top:10px;color:#9baec8;box-shadow:2px 4px 15px rgba(0,0,0,.4);padding:0;background:#d9e1e8}.column-settings__hashtags .column-select__menu h4{text-transform:uppercase;color:#9baec8;font-size:13px;font-weight:500;margin-bottom:10px}.column-settings__hashtags .column-select__menu li{padding:4px 0}.column-settings__hashtags .column-select__menu ul{margin-bottom:10px}.column-settings__hashtags .column-select__menu em{font-weight:500;color:#121a24}.column-settings__hashtags .column-select__menu-list{padding:6px}.column-settings__hashtags .column-select__option{color:#121a24;border-radius:4px;font-size:14px}.column-settings__hashtags .column-select__option--is-focused,.column-settings__hashtags .column-select__option--is-selected{background:#b9c8d5}.column-settings__row .text-btn{margin-bottom:15px}.relationship-tag{color:#fff;margin-bottom:4px;display:block;vertical-align:top;background-color:#000;text-transform:uppercase;font-size:11px;font-weight:500;padding:4px;border-radius:4px;opacity:.7}.relationship-tag:hover{opacity:1}.account-gallery__container{display:flex;flex-wrap:wrap;padding:4px 2px}.account-gallery__item{border:none;box-sizing:border-box;display:block;position:relative;border-radius:4px;overflow:hidden;margin:2px}.account-gallery__item__icons{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);font-size:24px}.notification__filter-bar,.account__section-headline{background:#0b1016;border-bottom:1px solid #202e3f;cursor:default;display:flex;flex-shrink:0}.notification__filter-bar button,.account__section-headline button{background:#0b1016;border:0;margin:0}.notification__filter-bar button,.notification__filter-bar a,.account__section-headline button,.account__section-headline a{display:block;flex:1 1 auto;color:#9baec8;padding:15px 0;font-size:14px;font-weight:500;text-align:center;text-decoration:none;position:relative}.notification__filter-bar button.active,.notification__filter-bar a.active,.account__section-headline button.active,.account__section-headline a.active{color:#d9e1e8}.notification__filter-bar button.active::before,.notification__filter-bar button.active::after,.notification__filter-bar a.active::before,.notification__filter-bar a.active::after,.account__section-headline button.active::before,.account__section-headline button.active::after,.account__section-headline a.active::before,.account__section-headline a.active::after{display:block;content:\"\";position:absolute;bottom:0;left:50%;width:0;height:0;transform:translateX(-50%);border-style:solid;border-width:0 10px 10px;border-color:transparent transparent #202e3f}.notification__filter-bar button.active::after,.notification__filter-bar a.active::after,.account__section-headline button.active::after,.account__section-headline a.active::after{bottom:-1px;border-color:transparent transparent #121a24}.notification__filter-bar.directory__section-headline,.account__section-headline.directory__section-headline{background:#0f151d;border-bottom-color:transparent}.notification__filter-bar.directory__section-headline a.active::before,.notification__filter-bar.directory__section-headline button.active::before,.account__section-headline.directory__section-headline a.active::before,.account__section-headline.directory__section-headline button.active::before{display:none}.notification__filter-bar.directory__section-headline a.active::after,.notification__filter-bar.directory__section-headline button.active::after,.account__section-headline.directory__section-headline a.active::after,.account__section-headline.directory__section-headline button.active::after{border-color:transparent transparent #06090c}.account__moved-note{padding:14px 10px;padding-bottom:16px;background:#192432;border-top:1px solid #202e3f;border-bottom:1px solid #202e3f}.account__moved-note__message{position:relative;margin-left:58px;color:#3e5a7c;padding:8px 0;padding-top:0;padding-bottom:4px;font-size:14px}.account__moved-note__message>span{display:block;overflow:hidden;text-overflow:ellipsis}.account__moved-note__icon-wrapper{left:-26px;position:absolute}.account__moved-note .detailed-status__display-avatar{position:relative}.account__moved-note .detailed-status__display-name{margin-bottom:0}.account__header__content{color:#9baec8;font-size:14px;font-weight:400;overflow:hidden;word-break:normal;word-wrap:break-word}.account__header__content p{margin-bottom:20px}.account__header__content p:last-child{margin-bottom:0}.account__header__content a{color:inherit;text-decoration:underline}.account__header__content a:hover{text-decoration:none}.account__header{overflow:hidden}.account__header.inactive{opacity:.5}.account__header.inactive .account__header__image,.account__header.inactive .account__avatar{filter:grayscale(100%)}.account__header__info{position:absolute;top:10px;left:10px}.account__header__image{overflow:hidden;height:145px;position:relative;background:#0b1016}.account__header__image img{object-fit:cover;display:block;width:100%;height:100%;margin:0}.account__header__bar{position:relative;background:#192432;padding:5px;border-bottom:1px solid #26374d}.account__header__bar .avatar{display:block;flex:0 0 auto;width:94px;margin-left:-2px}.account__header__bar .avatar .account__avatar{background:#040609;border:2px solid #192432}.account__header__tabs{display:flex;align-items:flex-start;padding:7px 5px;margin-top:-55px}.account__header__tabs__buttons{display:flex;align-items:center;padding-top:55px;overflow:hidden}.account__header__tabs__buttons .icon-button{border:1px solid #26374d;border-radius:4px;box-sizing:content-box;padding:2px}.account__header__tabs__buttons .button{margin:0 8px}.account__header__tabs__name{padding:5px}.account__header__tabs__name .account-role{vertical-align:top}.account__header__tabs__name .emojione{width:22px;height:22px}.account__header__tabs__name h1{font-size:16px;line-height:24px;color:#fff;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.account__header__tabs__name h1 small{display:block;font-size:14px;color:#9baec8;font-weight:400;overflow:hidden;text-overflow:ellipsis}.account__header__tabs .spacer{flex:1 1 auto}.account__header__bio{overflow:hidden;margin:0 -5px}.account__header__bio .account__header__content{padding:20px 15px;padding-bottom:5px;color:#fff}.account__header__bio .account__header__fields{margin:0;border-top:1px solid #26374d}.account__header__bio .account__header__fields a{color:#e1b590}.account__header__bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.account__header__bio .account__header__fields .verified a{color:#79bd9a}.account__header__extra{margin-top:4px}.account__header__extra__links{font-size:14px;color:#9baec8;padding:10px 0}.account__header__extra__links a{display:inline-block;color:#9baec8;text-decoration:none;padding:5px 10px;font-weight:500}.account__header__extra__links a strong{font-weight:700;color:#fff}.domain{padding:10px;border-bottom:1px solid #202e3f}.domain .domain__domain-name{flex:1 1 auto;display:block;color:#fff;text-decoration:none;font-size:14px;font-weight:500}.domain__wrapper{display:flex}.domain_buttons{height:18px;padding:10px;white-space:nowrap}@keyframes spring-flip-in{0%{transform:rotate(0deg)}30%{transform:rotate(-242.4deg)}60%{transform:rotate(-158.35deg)}90%{transform:rotate(-187.5deg)}100%{transform:rotate(-180deg)}}@keyframes spring-flip-out{0%{transform:rotate(-180deg)}30%{transform:rotate(62.4deg)}60%{transform:rotate(-21.635deg)}90%{transform:rotate(7.5deg)}100%{transform:rotate(0deg)}}.status__content--with-action{cursor:pointer}.status__content{position:relative;margin:10px 0;font-size:15px;line-height:20px;word-wrap:break-word;font-weight:400;overflow:visible;padding-top:5px}.status__content:focus{outline:0}.status__content .emojione{width:20px;height:20px;margin:-3px 0 0}.status__content img{max-width:100%;max-height:400px;object-fit:contain}.status__content p,.status__content pre,.status__content blockquote{margin-bottom:20px;white-space:pre-wrap}.status__content p:last-child,.status__content pre:last-child,.status__content blockquote:last-child{margin-bottom:0}.status__content .status__content__text,.status__content .e-content{overflow:hidden}.status__content .status__content__text>ul,.status__content .status__content__text>ol,.status__content .e-content>ul,.status__content .e-content>ol{margin-bottom:20px}.status__content .status__content__text h1,.status__content .status__content__text h2,.status__content .status__content__text h3,.status__content .status__content__text h4,.status__content .status__content__text h5,.status__content .e-content h1,.status__content .e-content h2,.status__content .e-content h3,.status__content .e-content h4,.status__content .e-content h5{margin-top:20px;margin-bottom:20px}.status__content .status__content__text h1,.status__content .status__content__text h2,.status__content .e-content h1,.status__content .e-content h2{font-weight:700;font-size:1.2em}.status__content .status__content__text h2,.status__content .e-content h2{font-size:1.1em}.status__content .status__content__text h3,.status__content .status__content__text h4,.status__content .status__content__text h5,.status__content .e-content h3,.status__content .e-content h4,.status__content .e-content h5{font-weight:500}.status__content .status__content__text blockquote,.status__content .e-content blockquote{padding-left:10px;border-left:3px solid #9baec8;color:#9baec8;white-space:normal}.status__content .status__content__text blockquote p:last-child,.status__content .e-content blockquote p:last-child{margin-bottom:0}.status__content .status__content__text b,.status__content .status__content__text strong,.status__content .e-content b,.status__content .e-content strong{font-weight:700}.status__content .status__content__text em,.status__content .status__content__text i,.status__content .e-content em,.status__content .e-content i{font-style:italic}.status__content .status__content__text sub,.status__content .e-content sub{font-size:smaller;text-align:sub}.status__content .status__content__text sup,.status__content .e-content sup{font-size:smaller;vertical-align:super}.status__content .status__content__text ul,.status__content .status__content__text ol,.status__content .e-content ul,.status__content .e-content ol{margin-left:1em}.status__content .status__content__text ul p,.status__content .status__content__text ol p,.status__content .e-content ul p,.status__content .e-content ol p{margin:0}.status__content .status__content__text ul,.status__content .e-content ul{list-style-type:disc}.status__content .status__content__text ol,.status__content .e-content ol{list-style-type:decimal}.status__content a{color:#d8a070;text-decoration:none}.status__content a:hover{text-decoration:underline}.status__content a:hover .fa{color:#4a6b94}.status__content a.mention:hover{text-decoration:none}.status__content a.mention:hover span{text-decoration:underline}.status__content a .fa{color:#3e5a7c}.status__content .status__content__spoiler{display:none}.status__content .status__content__spoiler.status__content__spoiler--visible{display:block}.status__content a.unhandled-link{color:#e1b590}.status__content a.unhandled-link .link-origin-tag{color:#ca8f04;font-size:.8em}.status__content .status__content__spoiler-link{background:#45648a}.status__content .status__content__spoiler-link:hover{background:#4a6b94;text-decoration:none}.status__content__spoiler-link{display:inline-block;border-radius:2px;background:#45648a;border:none;color:#121a24;font-weight:500;font-size:11px;padding:0 5px;text-transform:uppercase;line-height:inherit;cursor:pointer;vertical-align:bottom}.status__content__spoiler-link:hover{background:#4a6b94;text-decoration:none}.status__content__spoiler-link .status__content__spoiler-icon{display:inline-block;margin:0 0 0 5px;border-left:1px solid currentColor;padding:0 0 0 4px;font-size:16px;vertical-align:-2px}.notif-cleaning .status,.notif-cleaning .notification-follow,.notif-cleaning .notification-follow-request{padding-right:4.5rem}.status__wrapper--filtered{color:#3e5a7c;border:0;font-size:inherit;text-align:center;line-height:inherit;margin:0;padding:15px;box-sizing:border-box;width:100%;clear:both;border-bottom:1px solid #202e3f}.status__prepend-icon-wrapper{left:-26px;position:absolute}.notification-follow,.notification-follow-request{position:relative;border-bottom:1px solid #202e3f}.notification-follow .account,.notification-follow-request .account{border-bottom:0 none}.focusable:focus{outline:0;background:#192432}.focusable:focus.status.status-direct:not(.read){background:#26374d}.focusable:focus.status.status-direct:not(.read).muted{background:transparent}.focusable:focus .detailed-status,.focusable:focus .detailed-status__action-bar{background:#202e3f}.status{padding:10px 14px;position:relative;height:auto;border-bottom:1px solid #202e3f;cursor:default;opacity:1;animation:fade 150ms linear}@supports(-ms-overflow-style: -ms-autohiding-scrollbar){.status{padding-right:28px}}@keyframes fade{0%{opacity:0}100%{opacity:1}}.status .video-player,.status .audio-player{margin-top:8px}.status.status-direct:not(.read){background:#202e3f;border-bottom-color:#26374d}.status.light .status__relative-time{color:#3e5a7c}.status.light .status__display-name{color:#121a24}.status.light .display-name{color:#9baec8}.status.light .display-name strong{color:#121a24}.status.light .status__content{color:#121a24}.status.light .status__content a{color:#d8a070}.status.light .status__content a.status__content__spoiler-link{color:#fff;background:#9baec8}.status.light .status__content a.status__content__spoiler-link:hover{background:#b5c3d6}.status.collapsed{background-position:center;background-size:cover;user-select:none}.status.collapsed.has-background::before{display:block;position:absolute;left:0;right:0;top:0;bottom:0;background-image:linear-gradient(to bottom, rgba(0, 0, 0, 0.75), rgba(0, 0, 0, 0.65) 24px, rgba(0, 0, 0, 0.8));pointer-events:none;content:\"\"}.status.collapsed .display-name:hover .display-name__html{text-decoration:none}.status.collapsed .status__content{height:20px;overflow:hidden;text-overflow:ellipsis;padding-top:0}.status.collapsed .status__content:after{content:\"\";position:absolute;top:0;bottom:0;left:0;right:0;background:linear-gradient(rgba(18, 26, 36, 0), #121a24);pointer-events:none}.status.collapsed .status__content a:hover{text-decoration:none}.status.collapsed:focus>.status__content:after{background:linear-gradient(rgba(25, 36, 50, 0), #192432)}.status.collapsed.status-direct:not(.read)>.status__content:after{background:linear-gradient(rgba(32, 46, 63, 0), #202e3f)}.status.collapsed .notification__message{margin-bottom:0}.status.collapsed .status__info .notification__message>span{white-space:nowrap}.status .notification__message{margin:-10px 0px 10px 0}.notification-favourite .status.status-direct{background:transparent}.notification-favourite .status.status-direct .icon-button.disabled{color:#547aa9}.status__relative-time{display:inline-block;flex-grow:1;color:#3e5a7c;font-size:14px;text-align:right;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.status__display-name{color:#3e5a7c;overflow:hidden}.status__info__account .status__display-name{display:block;max-width:100%}.status__info{display:flex;justify-content:space-between;font-size:15px}.status__info>span{text-overflow:ellipsis;overflow:hidden}.status__info .notification__message>span{word-wrap:break-word}.status__info__icons{display:flex;align-items:center;height:1em;color:#3e5a7c}.status__info__icons .status__media-icon,.status__info__icons .status__visibility-icon,.status__info__icons .status__reply-icon{padding-left:2px;padding-right:2px}.status__info__icons .status__collapse-button.active>.fa-angle-double-up{transform:rotate(-180deg)}.no-reduce-motion .status__collapse-button.activate>.fa-angle-double-up{animation:spring-flip-in 1s linear}.no-reduce-motion .status__collapse-button.deactivate>.fa-angle-double-up{animation:spring-flip-out 1s linear}.status__info__account{display:flex;align-items:center;justify-content:flex-start}.status-check-box{border-bottom:1px solid #d9e1e8;display:flex}.status-check-box .status-check-box__status{margin:10px 0 10px 10px;flex:1;overflow:hidden}.status-check-box .status-check-box__status .media-gallery{max-width:250px}.status-check-box .status-check-box__status .status__content{padding:0;white-space:normal}.status-check-box .status-check-box__status .video-player,.status-check-box .status-check-box__status .audio-player{margin-top:8px;max-width:250px}.status-check-box .status-check-box__status .media-gallery__item-thumbnail{cursor:default}.status-check-box-toggle{align-items:center;display:flex;flex:0 0 auto;justify-content:center;padding:10px}.status__prepend{margin-top:-10px;margin-bottom:10px;margin-left:58px;color:#3e5a7c;padding:8px 0;padding-bottom:2px;font-size:14px;position:relative}.status__prepend .status__display-name strong{color:#3e5a7c}.status__prepend>span{display:block;overflow:hidden;text-overflow:ellipsis}.status__action-bar{align-items:center;display:flex;margin-top:8px}.status__action-bar__counter{display:inline-flex;margin-right:11px;align-items:center}.status__action-bar__counter .status__action-bar-button{margin-right:4px}.status__action-bar__counter__label{display:inline-block;width:14px;font-size:12px;font-weight:500;color:#3e5a7c}.status__action-bar-button{margin-right:18px}.status__action-bar-dropdown{height:23.15px;width:23.15px}.detailed-status__action-bar-dropdown{flex:1 1 auto;display:flex;align-items:center;justify-content:center;position:relative}.detailed-status{background:#192432;padding:14px 10px}.detailed-status--flex{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-start}.detailed-status--flex .status__content,.detailed-status--flex .detailed-status__meta{flex:100%}.detailed-status .status__content{font-size:19px;line-height:24px}.detailed-status .status__content .emojione{width:24px;height:24px;margin:-1px 0 0}.detailed-status .video-player,.detailed-status .audio-player{margin-top:8px}.detailed-status__meta{margin-top:15px;color:#3e5a7c;font-size:14px;line-height:18px}.detailed-status__action-bar{background:#192432;border-top:1px solid #202e3f;border-bottom:1px solid #202e3f;display:flex;flex-direction:row;padding:10px 0}.detailed-status__link{color:inherit;text-decoration:none}.detailed-status__favorites,.detailed-status__reblogs{display:inline-block;font-weight:500;font-size:12px;margin-left:6px}.status__display-name,.status__relative-time,.detailed-status__display-name,.detailed-status__datetime,.detailed-status__application,.account__display-name{text-decoration:none}.status__display-name strong,.account__display-name strong{color:#fff}.muted .emojione{opacity:.5}a.status__display-name:hover strong,.reply-indicator__display-name:hover strong,.detailed-status__display-name:hover strong,.account__display-name:hover strong{text-decoration:underline}.account__display-name strong{display:block;overflow:hidden;text-overflow:ellipsis}.detailed-status__application,.detailed-status__datetime{color:inherit}.detailed-status .button.logo-button{margin-bottom:15px}.detailed-status__display-name{color:#d9e1e8;display:block;line-height:24px;margin-bottom:15px;overflow:hidden}.detailed-status__display-name strong,.detailed-status__display-name span{display:block;text-overflow:ellipsis;overflow:hidden}.detailed-status__display-name strong{font-size:16px;color:#fff}.detailed-status__display-avatar{float:left;margin-right:10px}.status__avatar{flex:none;margin:0 10px 0 0;height:48px;width:48px}.muted .status__content,.muted .status__content p,.muted .status__content a,.muted .status__content__text{color:#3e5a7c}.muted .status__display-name strong{color:#3e5a7c}.muted .status__avatar{opacity:.5}.muted a.status__content__spoiler-link{background:#3e5a7c;color:#121a24}.muted a.status__content__spoiler-link:hover{background:#436187;text-decoration:none}.status__relative-time:hover,.detailed-status__datetime:hover{text-decoration:underline}.status-card{display:flex;font-size:14px;border:1px solid #202e3f;border-radius:4px;color:#3e5a7c;margin-top:14px;text-decoration:none;overflow:hidden}.status-card__actions{bottom:0;left:0;position:absolute;right:0;top:0;display:flex;justify-content:center;align-items:center}.status-card__actions>div{background:rgba(0,0,0,.6);border-radius:8px;padding:12px 9px;flex:0 0 auto;display:flex;justify-content:center;align-items:center}.status-card__actions button,.status-card__actions a{display:inline;color:#d9e1e8;background:transparent;border:0;padding:0 8px;text-decoration:none;font-size:18px;line-height:18px}.status-card__actions button:hover,.status-card__actions button:active,.status-card__actions button:focus,.status-card__actions a:hover,.status-card__actions a:active,.status-card__actions a:focus{color:#fff}.status-card__actions a{font-size:19px;position:relative;bottom:-1px}.status-card__actions a .fa,.status-card__actions a:hover .fa{color:inherit}a.status-card{cursor:pointer}a.status-card:hover{background:#202e3f}.status-card-photo{cursor:zoom-in;display:block;text-decoration:none;width:100%;height:auto;margin:0}.status-card-video iframe{width:100%;height:100%}.status-card__title{display:block;font-weight:500;margin-bottom:5px;color:#9baec8;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-decoration:none}.status-card__content{flex:1 1 auto;overflow:hidden;padding:14px 14px 14px 8px}.status-card__description{color:#9baec8}.status-card__host{display:block;margin-top:5px;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-card__image{flex:0 0 100px;background:#202e3f;position:relative}.status-card__image>.fa{font-size:21px;position:absolute;transform-origin:50% 50%;top:50%;left:50%;transform:translate(-50%, -50%)}.status-card.horizontal{display:block}.status-card.horizontal .status-card__image{width:100%}.status-card.horizontal .status-card__image-image{border-radius:4px 4px 0 0}.status-card.horizontal .status-card__title{white-space:inherit}.status-card.compact{border-color:#192432}.status-card.compact.interactive{border:0}.status-card.compact .status-card__content{padding:8px;padding-top:10px}.status-card.compact .status-card__title{white-space:nowrap}.status-card.compact .status-card__image{flex:0 0 60px}a.status-card.compact:hover{background-color:#192432}.status-card__image-image{border-radius:4px 0 0 4px;display:block;margin:0;width:100%;height:100%;object-fit:cover;background-size:cover;background-position:center center}.attachment-list{display:flex;font-size:14px;border:1px solid #202e3f;border-radius:4px;margin-top:14px;overflow:hidden}.attachment-list__icon{flex:0 0 auto;color:#3e5a7c;padding:8px 18px;cursor:default;border-right:1px solid #202e3f;display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:26px}.attachment-list__icon .fa{display:block}.attachment-list__list{list-style:none;padding:4px 0;padding-left:8px;display:flex;flex-direction:column;justify-content:center}.attachment-list__list li{display:block;padding:4px 0}.attachment-list__list a{text-decoration:none;color:#3e5a7c;font-weight:500}.attachment-list__list a:hover{text-decoration:underline}.attachment-list.compact{border:0;margin-top:4px}.attachment-list.compact .attachment-list__list{padding:0;display:block}.attachment-list.compact .fa{color:#3e5a7c}.status__wrapper--filtered__button{display:inline;color:#e1b590;border:0;background:transparent;padding:0;font-size:inherit;line-height:inherit}.status__wrapper--filtered__button:hover,.status__wrapper--filtered__button:active{text-decoration:underline}.modal-container--preloader{background:#202e3f}.modal-root{position:relative;transition:opacity .3s linear;will-change:opacity;z-index:9999}.modal-root__overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.7)}.modal-root__container{position:fixed;top:0;left:0;width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;align-content:space-around;z-index:9999;pointer-events:none;user-select:none}.modal-root__modal{pointer-events:auto;display:flex;z-index:9999}.onboarding-modal,.error-modal,.embed-modal{background:#d9e1e8;color:#121a24;border-radius:8px;overflow:hidden;display:flex;flex-direction:column}.onboarding-modal__pager{height:80vh;width:80vw;max-width:520px;max-height:470px}.onboarding-modal__pager .react-swipeable-view-container>div{width:100%;height:100%;box-sizing:border-box;display:none;flex-direction:column;align-items:center;justify-content:center;display:flex;user-select:text}.error-modal__body{height:80vh;width:80vw;max-width:520px;max-height:420px;position:relative}.error-modal__body>div{position:absolute;top:0;left:0;width:100%;height:100%;box-sizing:border-box;padding:25px;display:none;flex-direction:column;align-items:center;justify-content:center;display:flex;opacity:0;user-select:text}.error-modal__body{display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center}@media screen and (max-width: 550px){.onboarding-modal{width:100%;height:100%;border-radius:0}.onboarding-modal__pager{width:100%;height:auto;max-width:none;max-height:none;flex:1 1 auto}}.onboarding-modal__paginator,.error-modal__footer{flex:0 0 auto;background:#c0cdd9;display:flex;padding:25px}.onboarding-modal__paginator>div,.error-modal__footer>div{min-width:33px}.onboarding-modal__paginator .onboarding-modal__nav,.onboarding-modal__paginator .error-modal__nav,.error-modal__footer .onboarding-modal__nav,.error-modal__footer .error-modal__nav{color:#3e5a7c;border:0;font-size:14px;font-weight:500;padding:10px 25px;line-height:inherit;height:auto;margin:-10px;border-radius:4px;background-color:transparent}.onboarding-modal__paginator .onboarding-modal__nav:hover,.onboarding-modal__paginator .onboarding-modal__nav:focus,.onboarding-modal__paginator .onboarding-modal__nav:active,.onboarding-modal__paginator .error-modal__nav:hover,.onboarding-modal__paginator .error-modal__nav:focus,.onboarding-modal__paginator .error-modal__nav:active,.error-modal__footer .onboarding-modal__nav:hover,.error-modal__footer .onboarding-modal__nav:focus,.error-modal__footer .onboarding-modal__nav:active,.error-modal__footer .error-modal__nav:hover,.error-modal__footer .error-modal__nav:focus,.error-modal__footer .error-modal__nav:active{color:#37506f;background-color:#a6b9c9}.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next,.error-modal__footer .error-modal__nav.onboarding-modal__done,.error-modal__footer .error-modal__nav.onboarding-modal__next{color:#121a24}.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:hover,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:focus,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:active,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:hover,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:focus,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:active,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:hover,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:focus,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:active,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:hover,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:focus,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:active,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:hover,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:focus,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:active,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:hover,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:focus,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:active,.error-modal__footer .error-modal__nav.onboarding-modal__done:hover,.error-modal__footer .error-modal__nav.onboarding-modal__done:focus,.error-modal__footer .error-modal__nav.onboarding-modal__done:active,.error-modal__footer .error-modal__nav.onboarding-modal__next:hover,.error-modal__footer .error-modal__nav.onboarding-modal__next:focus,.error-modal__footer .error-modal__nav.onboarding-modal__next:active{color:#192432}.error-modal__footer{justify-content:center}.onboarding-modal__dots{flex:1 1 auto;display:flex;align-items:center;justify-content:center}.onboarding-modal__dot{width:14px;height:14px;border-radius:14px;background:#a6b9c9;margin:0 3px;cursor:pointer}.onboarding-modal__dot:hover{background:#a0b4c5}.onboarding-modal__dot.active{cursor:default;background:#8da5ba}.onboarding-modal__page__wrapper{pointer-events:none;padding:25px;padding-bottom:0}.onboarding-modal__page__wrapper.onboarding-modal__page__wrapper--active{pointer-events:auto}.onboarding-modal__page{cursor:default;line-height:21px}.onboarding-modal__page h1{font-size:18px;font-weight:500;color:#121a24;margin-bottom:20px}.onboarding-modal__page a{color:#d8a070}.onboarding-modal__page a:hover,.onboarding-modal__page a:focus,.onboarding-modal__page a:active{color:#dcab80}.onboarding-modal__page .navigation-bar a{color:inherit}.onboarding-modal__page p{font-size:16px;color:#3e5a7c;margin-top:10px;margin-bottom:10px}.onboarding-modal__page p:last-child{margin-bottom:0}.onboarding-modal__page p strong{font-weight:500;background:#121a24;color:#d9e1e8;border-radius:4px;font-size:14px;padding:3px 6px}.onboarding-modal__page p strong:lang(ja){font-weight:700}.onboarding-modal__page p strong:lang(ko){font-weight:700}.onboarding-modal__page p strong:lang(zh-CN){font-weight:700}.onboarding-modal__page p strong:lang(zh-HK){font-weight:700}.onboarding-modal__page p strong:lang(zh-TW){font-weight:700}.onboarding-modal__page__wrapper-0{height:100%;padding:0}.onboarding-modal__page-one__lead{padding:65px;padding-top:45px;padding-bottom:0;margin-bottom:10px}.onboarding-modal__page-one__lead h1{font-size:26px;line-height:36px;margin-bottom:8px}.onboarding-modal__page-one__lead p{margin-bottom:0}.onboarding-modal__page-one__extra{padding-right:65px;padding-left:185px;text-align:center}.display-case{text-align:center;font-size:15px;margin-bottom:15px}.display-case__label{font-weight:500;color:#121a24;margin-bottom:5px;text-transform:uppercase;font-size:12px}.display-case__case{background:#121a24;color:#d9e1e8;font-weight:500;padding:10px;border-radius:4px}.onboarding-modal__page-two p,.onboarding-modal__page-three p,.onboarding-modal__page-four p,.onboarding-modal__page-five p{text-align:left}.onboarding-modal__page-two .figure,.onboarding-modal__page-three .figure,.onboarding-modal__page-four .figure,.onboarding-modal__page-five .figure{background:#040609;color:#d9e1e8;margin-bottom:20px;border-radius:4px;padding:10px;text-align:center;font-size:14px;box-shadow:1px 2px 6px rgba(0,0,0,.3)}.onboarding-modal__page-two .figure .onboarding-modal__image,.onboarding-modal__page-three .figure .onboarding-modal__image,.onboarding-modal__page-four .figure .onboarding-modal__image,.onboarding-modal__page-five .figure .onboarding-modal__image{border-radius:4px;margin-bottom:10px}.onboarding-modal__page-two .figure.non-interactive,.onboarding-modal__page-three .figure.non-interactive,.onboarding-modal__page-four .figure.non-interactive,.onboarding-modal__page-five .figure.non-interactive{pointer-events:none;text-align:left}.onboarding-modal__page-four__columns .row{display:flex;margin-bottom:20px}.onboarding-modal__page-four__columns .row>div{flex:1 1 0;margin:0 10px}.onboarding-modal__page-four__columns .row>div:first-child{margin-left:0}.onboarding-modal__page-four__columns .row>div:last-child{margin-right:0}.onboarding-modal__page-four__columns .row>div p{text-align:center}.onboarding-modal__page-four__columns .row:last-child{margin-bottom:0}.onboarding-modal__page-four__columns .column-header{color:#fff}@media screen and (max-width: 320px)and (max-height: 600px){.onboarding-modal__page p{font-size:14px;line-height:20px}.onboarding-modal__page-two .figure,.onboarding-modal__page-three .figure,.onboarding-modal__page-four .figure,.onboarding-modal__page-five .figure{font-size:12px;margin-bottom:10px}.onboarding-modal__page-four__columns .row{margin-bottom:10px}.onboarding-modal__page-four__columns .column-header{padding:5px;font-size:12px}}.onboard-sliders{display:inline-block;max-width:30px;max-height:auto;margin-left:10px}.boost-modal,.doodle-modal,.favourite-modal,.confirmation-modal,.report-modal,.actions-modal,.mute-modal,.block-modal{background:#f2f5f7;color:#121a24;border-radius:8px;overflow:hidden;max-width:90vw;width:480px;position:relative;flex-direction:column}.boost-modal .status__relative-time,.doodle-modal .status__relative-time,.favourite-modal .status__relative-time,.confirmation-modal .status__relative-time,.report-modal .status__relative-time,.actions-modal .status__relative-time,.mute-modal .status__relative-time,.block-modal .status__relative-time{color:#3e5a7c;float:right;font-size:14px;width:auto;margin:initial;padding:initial}.boost-modal .status__display-name,.doodle-modal .status__display-name,.favourite-modal .status__display-name,.confirmation-modal .status__display-name,.report-modal .status__display-name,.actions-modal .status__display-name,.mute-modal .status__display-name,.block-modal .status__display-name{display:flex}.boost-modal .status__avatar,.doodle-modal .status__avatar,.favourite-modal .status__avatar,.confirmation-modal .status__avatar,.report-modal .status__avatar,.actions-modal .status__avatar,.mute-modal .status__avatar,.block-modal .status__avatar{height:48px;width:48px}.boost-modal .status__content__spoiler-link,.doodle-modal .status__content__spoiler-link,.favourite-modal .status__content__spoiler-link,.confirmation-modal .status__content__spoiler-link,.report-modal .status__content__spoiler-link,.actions-modal .status__content__spoiler-link,.mute-modal .status__content__spoiler-link,.block-modal .status__content__spoiler-link{color:#f2f5f7}.actions-modal .status{background:#fff;border-bottom-color:#d9e1e8;padding-top:10px;padding-bottom:10px}.actions-modal .dropdown-menu__separator{border-bottom-color:#d9e1e8}.boost-modal__container,.favourite-modal__container{overflow-x:scroll;padding:10px}.boost-modal__container .status,.favourite-modal__container .status{user-select:text;border-bottom:0}.boost-modal__action-bar,.doodle-modal__action-bar,.favourite-modal__action-bar,.confirmation-modal__action-bar,.mute-modal__action-bar,.block-modal__action-bar{display:flex;justify-content:space-between;background:#d9e1e8;padding:10px;line-height:36px}.boost-modal__action-bar>div,.doodle-modal__action-bar>div,.favourite-modal__action-bar>div,.confirmation-modal__action-bar>div,.mute-modal__action-bar>div,.block-modal__action-bar>div{flex:1 1 auto;text-align:right;color:#3e5a7c;padding-right:10px}.boost-modal__action-bar .button,.doodle-modal__action-bar .button,.favourite-modal__action-bar .button,.confirmation-modal__action-bar .button,.mute-modal__action-bar .button,.block-modal__action-bar .button{flex:0 0 auto}.boost-modal__status-header,.favourite-modal__status-header{font-size:15px}.boost-modal__status-time,.favourite-modal__status-time{float:right;font-size:14px}.mute-modal,.block-modal{line-height:24px}.mute-modal .react-toggle,.block-modal .react-toggle{vertical-align:middle}.report-modal{width:90vw;max-width:700px}.report-modal__container{display:flex;border-top:1px solid #d9e1e8}@media screen and (max-width: 480px){.report-modal__container{flex-wrap:wrap;overflow-y:auto}}.report-modal__statuses,.report-modal__comment{box-sizing:border-box;width:50%}@media screen and (max-width: 480px){.report-modal__statuses,.report-modal__comment{width:100%}}.report-modal__statuses,.focal-point-modal__content{flex:1 1 auto;min-height:20vh;max-height:80vh;overflow-y:auto;overflow-x:hidden}.report-modal__statuses .status__content a,.focal-point-modal__content .status__content a{color:#d8a070}@media screen and (max-width: 480px){.report-modal__statuses,.focal-point-modal__content{max-height:10vh}}@media screen and (max-width: 480px){.focal-point-modal__content{max-height:40vh}}.report-modal__comment{padding:20px;border-right:1px solid #d9e1e8;max-width:320px}.report-modal__comment p{font-size:14px;line-height:20px;margin-bottom:20px}.report-modal__comment .setting-text{display:block;box-sizing:border-box;width:100%;margin:0;color:#121a24;background:#fff;padding:10px;font-family:inherit;font-size:14px;resize:none;border:0;outline:0;border-radius:4px;border:1px solid #d9e1e8;min-height:100px;max-height:50vh;margin-bottom:10px}.report-modal__comment .setting-text:focus{border:1px solid #c0cdd9}.report-modal__comment .setting-text__wrapper{background:#fff;border:1px solid #d9e1e8;margin-bottom:10px;border-radius:4px}.report-modal__comment .setting-text__wrapper .setting-text{border:0;margin-bottom:0;border-radius:0}.report-modal__comment .setting-text__wrapper .setting-text:focus{border:0}.report-modal__comment .setting-text__wrapper__modifiers{color:#121a24;font-family:inherit;font-size:14px;background:#fff}.report-modal__comment .setting-text__toolbar{display:flex;justify-content:space-between;margin-bottom:20px}.report-modal__comment .setting-text-label{display:block;color:#121a24;font-size:14px;font-weight:500;margin-bottom:10px}.report-modal__comment .setting-toggle{margin-top:20px;margin-bottom:24px}.report-modal__comment .setting-toggle__label{color:#121a24;font-size:14px}@media screen and (max-width: 480px){.report-modal__comment{padding:10px;max-width:100%;order:2}.report-modal__comment .setting-toggle{margin-bottom:4px}}.actions-modal{max-height:80vh;max-width:80vw}.actions-modal .status{overflow-y:auto;max-height:300px}.actions-modal strong{display:block;font-weight:500}.actions-modal .actions-modal__item-label{font-weight:500}.actions-modal ul{overflow-y:auto;flex-shrink:0;max-height:80vh}.actions-modal ul.with-status{max-height:calc(80vh - 75px)}.actions-modal ul li:empty{margin:0}.actions-modal ul li:not(:empty) a{color:#121a24;display:flex;padding:12px 16px;font-size:15px;align-items:center;text-decoration:none}.actions-modal ul li:not(:empty) a,.actions-modal ul li:not(:empty) a button{transition:none}.actions-modal ul li:not(:empty) a.active,.actions-modal ul li:not(:empty) a.active button,.actions-modal ul li:not(:empty) a:hover,.actions-modal ul li:not(:empty) a:hover button,.actions-modal ul li:not(:empty) a:active,.actions-modal ul li:not(:empty) a:active button,.actions-modal ul li:not(:empty) a:focus,.actions-modal ul li:not(:empty) a:focus button{background:#d8a070;color:#fff}.actions-modal ul li:not(:empty) a>.react-toggle,.actions-modal ul li:not(:empty) a>.icon,.actions-modal ul li:not(:empty) a button:first-child{margin-right:10px}.confirmation-modal__action-bar .confirmation-modal__secondary-button,.mute-modal__action-bar .confirmation-modal__secondary-button,.block-modal__action-bar .confirmation-modal__secondary-button{flex-shrink:1}.confirmation-modal__secondary-button,.confirmation-modal__cancel-button,.mute-modal__cancel-button,.block-modal__cancel-button{background-color:transparent;color:#3e5a7c;font-size:14px;font-weight:500}.confirmation-modal__secondary-button:hover,.confirmation-modal__secondary-button:focus,.confirmation-modal__secondary-button:active,.confirmation-modal__cancel-button:hover,.confirmation-modal__cancel-button:focus,.confirmation-modal__cancel-button:active,.mute-modal__cancel-button:hover,.mute-modal__cancel-button:focus,.mute-modal__cancel-button:active,.block-modal__cancel-button:hover,.block-modal__cancel-button:focus,.block-modal__cancel-button:active{color:#37506f;background-color:transparent}.confirmation-modal__do_not_ask_again{padding-left:20px;padding-right:20px;padding-bottom:10px;font-size:14px}.confirmation-modal__do_not_ask_again label,.confirmation-modal__do_not_ask_again input{vertical-align:middle}.confirmation-modal__container,.mute-modal__container,.block-modal__container,.report-modal__target{padding:30px;font-size:16px}.confirmation-modal__container strong,.mute-modal__container strong,.block-modal__container strong,.report-modal__target strong{font-weight:500}.confirmation-modal__container strong:lang(ja),.mute-modal__container strong:lang(ja),.block-modal__container strong:lang(ja),.report-modal__target strong:lang(ja){font-weight:700}.confirmation-modal__container strong:lang(ko),.mute-modal__container strong:lang(ko),.block-modal__container strong:lang(ko),.report-modal__target strong:lang(ko){font-weight:700}.confirmation-modal__container strong:lang(zh-CN),.mute-modal__container strong:lang(zh-CN),.block-modal__container strong:lang(zh-CN),.report-modal__target strong:lang(zh-CN){font-weight:700}.confirmation-modal__container strong:lang(zh-HK),.mute-modal__container strong:lang(zh-HK),.block-modal__container strong:lang(zh-HK),.report-modal__target strong:lang(zh-HK){font-weight:700}.confirmation-modal__container strong:lang(zh-TW),.mute-modal__container strong:lang(zh-TW),.block-modal__container strong:lang(zh-TW),.report-modal__target strong:lang(zh-TW){font-weight:700}.confirmation-modal__container,.report-modal__target{text-align:center}.block-modal__explanation,.mute-modal__explanation{margin-top:20px}.block-modal .setting-toggle,.mute-modal .setting-toggle{margin-top:20px;margin-bottom:24px;display:flex;align-items:center}.block-modal .setting-toggle__label,.mute-modal .setting-toggle__label{color:#121a24;margin:0;margin-left:8px}.report-modal__target{padding:15px}.report-modal__target .media-modal__close{top:14px;right:15px}.embed-modal{width:auto;max-width:80vw;max-height:80vh}.embed-modal h4{padding:30px;font-weight:500;font-size:16px;text-align:center}.embed-modal .embed-modal__container{padding:10px}.embed-modal .embed-modal__container .hint{margin-bottom:15px}.embed-modal .embed-modal__container .embed-modal__html{outline:0;box-sizing:border-box;display:block;width:100%;border:none;padding:10px;font-family:\"mastodon-font-monospace\",monospace;background:#121a24;color:#fff;font-size:14px;margin:0;margin-bottom:15px;border-radius:4px}.embed-modal .embed-modal__container .embed-modal__html::-moz-focus-inner{border:0}.embed-modal .embed-modal__container .embed-modal__html::-moz-focus-inner,.embed-modal .embed-modal__container .embed-modal__html:focus,.embed-modal .embed-modal__container .embed-modal__html:active{outline:0 !important}.embed-modal .embed-modal__container .embed-modal__html:focus{background:#192432}@media screen and (max-width: 600px){.embed-modal .embed-modal__container .embed-modal__html{font-size:16px}}.embed-modal .embed-modal__container .embed-modal__iframe{width:400px;max-width:100%;overflow:hidden;border:0;border-radius:4px}.focal-point{position:relative;cursor:move;overflow:hidden;height:100%;display:flex;justify-content:center;align-items:center;background:#000}.focal-point img,.focal-point video,.focal-point canvas{display:block;max-height:80vh;width:100%;height:auto;margin:0;object-fit:contain;background:#000}.focal-point__reticle{position:absolute;width:100px;height:100px;transform:translate(-50%, -50%);background:url(\"~images/reticle.png\") no-repeat 0 0;border-radius:50%;box-shadow:0 0 0 9999em rgba(0,0,0,.35)}.focal-point__overlay{position:absolute;width:100%;height:100%;top:0;left:0}.focal-point__preview{position:absolute;bottom:10px;right:10px;z-index:2;cursor:move;transition:opacity .1s ease}.focal-point__preview:hover{opacity:.5}.focal-point__preview strong{color:#fff;font-size:14px;font-weight:500;display:block;margin-bottom:5px}.focal-point__preview div{border-radius:4px;box-shadow:0 0 14px rgba(0,0,0,.2)}@media screen and (max-width: 480px){.focal-point img,.focal-point video{max-height:100%}.focal-point__preview{display:none}}.filtered-status-info{text-align:start}.filtered-status-info .spoiler__text{margin-top:20px}.filtered-status-info .account{border-bottom:0}.filtered-status-info .account__display-name strong{color:#121a24}.filtered-status-info .status__content__spoiler{display:none}.filtered-status-info .status__content__spoiler--visible{display:flex}.filtered-status-info ul{padding:10px;margin-left:12px;list-style:disc inside}.filtered-status-info .filtered-status-edit-link{color:#3e5a7c;text-decoration:none}.filtered-status-info .filtered-status-edit-link:hover{text-decoration:underline}.composer{padding:10px}.composer .emoji-picker-dropdown{position:absolute;top:0;right:0}.composer .emoji-picker-dropdown ::-webkit-scrollbar-track:hover,.composer .emoji-picker-dropdown ::-webkit-scrollbar-track:active{background-color:rgba(0,0,0,.3)}.character-counter{cursor:default;font-family:sans-serif,sans-serif;font-size:14px;font-weight:600;color:#3e5a7c}.character-counter.character-counter--over{color:#ff5050}.no-reduce-motion .composer--spoiler{transition:height .4s ease,opacity .4s ease}.composer--spoiler{height:0;transform-origin:bottom;opacity:0}.composer--spoiler.composer--spoiler--visible{height:36px;margin-bottom:11px;opacity:1}.composer--spoiler input{display:block;box-sizing:border-box;margin:0;border:none;border-radius:4px;padding:10px;width:100%;outline:0;color:#121a24;background:#fff;font-size:14px;font-family:inherit;resize:vertical}.composer--spoiler input::placeholder{color:#3e5a7c}.composer--spoiler input:focus{outline:0}@media screen and (max-width: 630px){.auto-columns .composer--spoiler input{font-size:16px}}.single-column .composer--spoiler input{font-size:16px}.composer--warning{color:#121a24;margin-bottom:15px;background:#9baec8;box-shadow:0 2px 6px rgba(0,0,0,.3);padding:8px 10px;border-radius:4px;font-size:13px;font-weight:400}.composer--warning a{color:#3e5a7c;font-weight:500;text-decoration:underline}.composer--warning a:active,.composer--warning a:focus,.composer--warning a:hover{text-decoration:none}.compose-form__sensitive-button{padding:10px;padding-top:0;font-size:14px;font-weight:500}.compose-form__sensitive-button.active{color:#d8a070}.compose-form__sensitive-button input[type=checkbox]{display:none}.compose-form__sensitive-button .checkbox{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-left:5px;margin-right:10px;top:-1px;border-radius:4px;vertical-align:middle}.compose-form__sensitive-button .checkbox.active{border-color:#d8a070;background:#d8a070}.composer--reply{margin:0 0 10px;border-radius:4px;padding:10px;background:#9baec8;min-height:23px;overflow-y:auto;flex:0 2 auto}.composer--reply>header{margin-bottom:5px;overflow:hidden}.composer--reply>header>.account.small{color:#121a24}.composer--reply>header>.cancel{float:right;line-height:24px}.composer--reply>.content{position:relative;margin:10px 0;padding:0 12px;font-size:14px;line-height:20px;color:#121a24;word-wrap:break-word;font-weight:400;overflow:visible;white-space:pre-wrap;padding-top:5px;overflow:hidden}.composer--reply>.content p,.composer--reply>.content pre,.composer--reply>.content blockquote{margin-bottom:20px;white-space:pre-wrap}.composer--reply>.content p:last-child,.composer--reply>.content pre:last-child,.composer--reply>.content blockquote:last-child{margin-bottom:0}.composer--reply>.content h1,.composer--reply>.content h2,.composer--reply>.content h3,.composer--reply>.content h4,.composer--reply>.content h5{margin-top:20px;margin-bottom:20px}.composer--reply>.content h1,.composer--reply>.content h2{font-weight:700;font-size:18px}.composer--reply>.content h2{font-size:16px}.composer--reply>.content h3,.composer--reply>.content h4,.composer--reply>.content h5{font-weight:500}.composer--reply>.content blockquote{padding-left:10px;border-left:3px solid #121a24;color:#121a24;white-space:normal}.composer--reply>.content blockquote p:last-child{margin-bottom:0}.composer--reply>.content b,.composer--reply>.content strong{font-weight:700}.composer--reply>.content em,.composer--reply>.content i{font-style:italic}.composer--reply>.content sub{font-size:smaller;text-align:sub}.composer--reply>.content ul,.composer--reply>.content ol{margin-left:1em}.composer--reply>.content ul p,.composer--reply>.content ol p{margin:0}.composer--reply>.content ul{list-style-type:disc}.composer--reply>.content ol{list-style-type:decimal}.composer--reply>.content a{color:#3e5a7c;text-decoration:none}.composer--reply>.content a:hover{text-decoration:underline}.composer--reply>.content a.mention:hover{text-decoration:none}.composer--reply>.content a.mention:hover span{text-decoration:underline}.composer--reply .emojione{width:20px;height:20px;margin:-5px 0 0}.compose-form__autosuggest-wrapper,.autosuggest-input{position:relative;width:100%}.compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea,.autosuggest-input label .autosuggest-textarea__textarea{display:block;box-sizing:border-box;margin:0;border:none;border-radius:4px 4px 0 0;padding:10px 32px 0 10px;width:100%;min-height:100px;outline:0;color:#121a24;background:#fff;font-size:14px;font-family:inherit;resize:none;scrollbar-color:initial}.compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea::placeholder,.autosuggest-input label .autosuggest-textarea__textarea::placeholder{color:#3e5a7c}.compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea::-webkit-scrollbar,.autosuggest-input label .autosuggest-textarea__textarea::-webkit-scrollbar{all:unset}.compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea:disabled,.autosuggest-input label .autosuggest-textarea__textarea:disabled{background:#d9e1e8}.compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea:focus,.autosuggest-input label .autosuggest-textarea__textarea:focus{outline:0}@media screen and (max-width: 630px){.auto-columns .compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea,.auto-columns .autosuggest-input label .autosuggest-textarea__textarea{font-size:16px}}.single-column .compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea,.single-column .autosuggest-input label .autosuggest-textarea__textarea{font-size:16px}@media screen and (max-width: 600px){.auto-columns .compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea,.single-column .compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea,.auto-columns .autosuggest-input label .autosuggest-textarea__textarea,.single-column .autosuggest-input label .autosuggest-textarea__textarea{height:100px !important;resize:vertical}}.composer--textarea--icons{display:block;position:absolute;top:29px;right:5px;bottom:5px;overflow:hidden}.composer--textarea--icons>.textarea_icon{display:block;margin:2px 0 0 2px;width:24px;height:24px;color:#3e5a7c;font-size:18px;line-height:24px;text-align:center;opacity:.8}.autosuggest-textarea__suggestions-wrapper{position:relative;height:0}.autosuggest-textarea__suggestions{display:block;position:absolute;box-sizing:border-box;top:100%;border-radius:0 0 4px 4px;padding:6px;width:100%;color:#121a24;background:#d9e1e8;box-shadow:4px 4px 6px rgba(0,0,0,.4);font-size:14px;z-index:99;display:none}.autosuggest-textarea__suggestions--visible{display:block}.autosuggest-textarea__suggestions__item{padding:10px;cursor:pointer;border-radius:4px}.autosuggest-textarea__suggestions__item:hover,.autosuggest-textarea__suggestions__item:focus,.autosuggest-textarea__suggestions__item:active,.autosuggest-textarea__suggestions__item.selected{background:#b9c8d5}.autosuggest-textarea__suggestions__item>.account,.autosuggest-textarea__suggestions__item>.emoji,.autosuggest-textarea__suggestions__item>.autosuggest-hashtag{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;line-height:18px;font-size:14px}.autosuggest-textarea__suggestions__item .autosuggest-hashtag{justify-content:space-between}.autosuggest-textarea__suggestions__item .autosuggest-hashtag__name{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.autosuggest-textarea__suggestions__item .autosuggest-hashtag strong{font-weight:500}.autosuggest-textarea__suggestions__item .autosuggest-hashtag__uses{flex:0 0 auto;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.autosuggest-textarea__suggestions__item>.account.small .display-name>span{color:#3e5a7c}.composer--upload_form{overflow:hidden}.composer--upload_form>.content{display:flex;flex-direction:row;flex-wrap:wrap;font-family:inherit;padding:5px;overflow:hidden}.composer--upload_form--item{flex:1 1 0;margin:5px;min-width:40%}.composer--upload_form--item>div{position:relative;border-radius:4px;height:140px;width:100%;background-color:#000;background-position:center;background-size:cover;background-repeat:no-repeat;overflow:hidden}.composer--upload_form--item>div textarea{display:block;position:absolute;box-sizing:border-box;bottom:0;left:0;margin:0;border:0;padding:10px;width:100%;color:#d9e1e8;background:linear-gradient(0deg, rgba(0, 0, 0, 0.8) 0, rgba(0, 0, 0, 0.35) 80%, transparent);font-size:14px;font-family:inherit;font-weight:500;opacity:0;z-index:2;transition:opacity .1s ease}.composer--upload_form--item>div textarea:focus{color:#fff}.composer--upload_form--item>div textarea::placeholder{opacity:.54;color:#d9e1e8}.composer--upload_form--item>div>.close{mix-blend-mode:difference}.composer--upload_form--item.active>div textarea{opacity:1}.composer--upload_form--actions{background:linear-gradient(180deg, rgba(0, 0, 0, 0.8) 0, rgba(0, 0, 0, 0.35) 80%, transparent);display:flex;align-items:flex-start;justify-content:space-between;opacity:0;transition:opacity .1s ease}.composer--upload_form--actions .icon-button{flex:0 1 auto;color:#d9e1e8;font-size:14px;font-weight:500;padding:10px;font-family:inherit}.composer--upload_form--actions .icon-button:hover,.composer--upload_form--actions .icon-button:focus,.composer--upload_form--actions .icon-button:active{color:#e6ebf0}.composer--upload_form--actions.active{opacity:1}.composer--upload_form--progress{display:flex;padding:10px;color:#9baec8;overflow:hidden}.composer--upload_form--progress>.fa{font-size:34px;margin-right:10px}.composer--upload_form--progress>.message{flex:1 1 auto}.composer--upload_form--progress>.message>span{display:block;font-size:12px;font-weight:500;text-transform:uppercase}.composer--upload_form--progress>.message>.backdrop{position:relative;margin-top:5px;border-radius:6px;width:100%;height:6px;background:#3e5a7c}.composer--upload_form--progress>.message>.backdrop>.tracker{position:absolute;top:0;left:0;height:6px;border-radius:6px;background:#d8a070}.compose-form__modifiers{color:#121a24;font-family:inherit;font-size:14px;background:#fff}.composer--options-wrapper{padding:10px;background:#ebebeb;border-radius:0 0 4px 4px;height:27px;display:flex;justify-content:space-between;flex:0 0 auto}.composer--options{display:flex;flex:0 0 auto}.composer--options>*{display:inline-block;box-sizing:content-box;padding:0 3px;height:27px;line-height:27px;vertical-align:bottom}.composer--options>hr{display:inline-block;margin:0 3px;border-width:0 0 0 1px;border-style:none none none solid;border-color:transparent transparent transparent #c2c2c2;padding:0;width:0;height:27px;background:transparent}.compose--counter-wrapper{align-self:center;margin-right:4px}.composer--options--dropdown.open>.value{border-radius:4px 4px 0 0;box-shadow:0 -4px 4px rgba(0,0,0,.1);color:#fff;background:#d8a070;transition:none}.composer--options--dropdown.open.top>.value{border-radius:0 0 4px 4px;box-shadow:0 4px 4px rgba(0,0,0,.1)}.composer--options--dropdown--content{position:absolute;border-radius:4px;box-shadow:2px 4px 15px rgba(0,0,0,.4);background:#fff;overflow:hidden;transform-origin:50% 0}.composer--options--dropdown--content--item{display:flex;align-items:center;padding:10px;color:#121a24;cursor:pointer}.composer--options--dropdown--content--item>.content{flex:1 1 auto;color:#3e5a7c}.composer--options--dropdown--content--item>.content:not(:first-child){margin-left:10px}.composer--options--dropdown--content--item>.content strong{display:block;color:#121a24;font-weight:500}.composer--options--dropdown--content--item:hover,.composer--options--dropdown--content--item.active{background:#d8a070;color:#fff}.composer--options--dropdown--content--item:hover>.content,.composer--options--dropdown--content--item.active>.content{color:#fff}.composer--options--dropdown--content--item:hover>.content strong,.composer--options--dropdown--content--item.active>.content strong{color:#fff}.composer--options--dropdown--content--item.active:hover{background:#dcab80}.composer--publisher{padding-top:10px;text-align:right;white-space:nowrap;overflow:hidden;justify-content:flex-end;flex:0 0 auto}.composer--publisher>.primary{display:inline-block;margin:0;padding:0 10px;text-align:center}.composer--publisher>.side_arm{display:inline-block;margin:0 2px;padding:0;width:36px;text-align:center}.composer--publisher.over>.count{color:#ff5050}.column__wrapper{display:flex;flex:1 1 auto;position:relative}.columns-area{display:flex;flex:1 1 auto;flex-direction:row;justify-content:flex-start;overflow-x:auto;position:relative}.columns-area__panels{display:flex;justify-content:center;width:100%;height:100%;min-height:100vh}.columns-area__panels__pane{height:100%;overflow:hidden;pointer-events:none;display:flex;justify-content:flex-end;min-width:285px}.columns-area__panels__pane--start{justify-content:flex-start}.columns-area__panels__pane__inner{position:fixed;width:285px;pointer-events:auto;height:100%}.columns-area__panels__main{box-sizing:border-box;width:100%;max-width:600px;flex:0 0 auto;display:flex;flex-direction:column}@media screen and (min-width: 415px){.columns-area__panels__main{padding:0 10px}}.tabs-bar__wrapper{background:#040609;position:sticky;top:0;z-index:2;padding-top:0}@media screen and (min-width: 415px){.tabs-bar__wrapper{padding-top:10px}}.tabs-bar__wrapper .tabs-bar{margin-bottom:0}@media screen and (min-width: 415px){.tabs-bar__wrapper .tabs-bar{margin-bottom:10px}}.react-swipeable-view-container,.react-swipeable-view-container .columns-area,.react-swipeable-view-container .column{height:100%}.react-swipeable-view-container>*{display:flex;align-items:center;justify-content:center;height:100%}.column{width:330px;position:relative;box-sizing:border-box;display:flex;flex-direction:column}.column>.scrollable{background:#121a24}.ui{flex:0 0 auto;display:flex;flex-direction:column;width:100%;height:100%}.column{overflow:hidden}.column-back-button{box-sizing:border-box;width:100%;background:#192432;color:#d8a070;cursor:pointer;flex:0 0 auto;font-size:16px;border:0;text-align:unset;padding:15px;margin:0;z-index:3}.column-back-button:hover{text-decoration:underline}.column-header__back-button{background:#192432;border:0;font-family:inherit;color:#d8a070;cursor:pointer;flex:0 0 auto;font-size:16px;padding:0 5px 0 0;z-index:3}.column-header__back-button:hover{text-decoration:underline}.column-header__back-button:last-child{padding:0 15px 0 0}.column-back-button__icon{display:inline-block;margin-right:5px}.column-back-button--slim{position:relative}.column-back-button--slim-button{cursor:pointer;flex:0 0 auto;font-size:16px;padding:15px;position:absolute;right:0;top:-48px}.column-link{background:#202e3f;color:#fff;display:block;font-size:16px;padding:15px;text-decoration:none}.column-link:hover,.column-link:focus,.column-link:active{background:#253549}.column-link:focus{outline:0}.column-link--transparent{background:transparent;color:#d9e1e8}.column-link--transparent:hover,.column-link--transparent:focus,.column-link--transparent:active{background:transparent;color:#fff}.column-link--transparent.active{color:#d8a070}.column-link__icon{display:inline-block;margin-right:5px}.column-subheading{background:#121a24;color:#3e5a7c;padding:8px 20px;font-size:12px;font-weight:500;text-transform:uppercase;cursor:default}.column-header__wrapper{position:relative;flex:0 0 auto;z-index:1}.column-header__wrapper.active{box-shadow:0 1px 0 rgba(216,160,112,.3)}.column-header__wrapper.active::before{display:block;content:\"\";position:absolute;bottom:-13px;left:0;right:0;margin:0 auto;width:60%;pointer-events:none;height:28px;z-index:1;background:radial-gradient(ellipse, rgba(216, 160, 112, 0.23) 0%, rgba(216, 160, 112, 0) 60%)}.column-header__wrapper .announcements{z-index:1;position:relative}.column-header{display:flex;font-size:16px;background:#192432;flex:0 0 auto;cursor:pointer;position:relative;z-index:2;outline:0;overflow:hidden}.column-header>button{margin:0;border:none;padding:15px;color:inherit;background:transparent;font:inherit;text-align:left;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;flex:1}.column-header>.column-header__back-button{color:#d8a070}.column-header.active .column-header__icon{color:#d8a070;text-shadow:0 0 10px rgba(216,160,112,.4)}.column-header:focus,.column-header:active{outline:0}.column{width:330px;position:relative;box-sizing:border-box;display:flex;flex-direction:column;overflow:hidden}.wide .columns-area:not(.columns-area--mobile) .column{flex:auto;min-width:330px;max-width:400px}.column>.scrollable{background:#121a24}.column-header__buttons{height:48px;display:flex;margin-left:0}.column-header__links{margin-bottom:14px}.column-header__links .text-btn{margin-right:10px}.column-header__button,.column-header__notif-cleaning-buttons button{background:#192432;border:0;color:#9baec8;cursor:pointer;font-size:16px;padding:0 15px}.column-header__button:hover,.column-header__notif-cleaning-buttons button:hover{color:#b2c1d5}.column-header__button.active,.column-header__notif-cleaning-buttons button.active{color:#fff;background:#202e3f}.column-header__button.active:hover,.column-header__notif-cleaning-buttons button.active:hover{color:#fff;background:#202e3f}.column-header__button:focus,.column-header__notif-cleaning-buttons button:focus{text-shadow:0 0 4px #d3935c}.column-header__notif-cleaning-buttons{display:flex;align-items:stretch;justify-content:space-around}.column-header__notif-cleaning-buttons button{background:transparent;text-align:center;padding:10px 0;white-space:pre-wrap}.column-header__notif-cleaning-buttons b{font-weight:bold}.column-header__collapsible-inner.nopad-drawer{padding:0}.column-header__collapsible{max-height:70vh;overflow:hidden;overflow-y:auto;color:#9baec8;transition:max-height 150ms ease-in-out,opacity 300ms linear;opacity:1;z-index:1;position:relative}.column-header__collapsible.collapsed{max-height:0;opacity:.5}.column-header__collapsible.animating{overflow-y:hidden}.column-header__collapsible hr{height:0;background:transparent;border:0;border-top:1px solid #26374d;margin:10px 0}.column-header__collapsible.ncd{transition:none}.column-header__collapsible.ncd.collapsed{max-height:0;opacity:.7}.column-header__collapsible-inner{background:#202e3f;padding:15px}.column-header__setting-btn:hover{color:#9baec8;text-decoration:underline}.column-header__setting-arrows{float:right}.column-header__setting-arrows .column-header__setting-btn{padding:0 10px}.column-header__setting-arrows .column-header__setting-btn:last-child{padding-right:0}.column-header__title{display:inline-block;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;flex:1}.column-header__icon{display:inline-block;margin-right:5px}.empty-column-indicator,.error-column,.follow_requests-unlocked_explanation{color:#3e5a7c;background:#121a24;text-align:center;padding:20px;font-size:15px;font-weight:400;cursor:default;display:flex;flex:1 1 auto;align-items:center;justify-content:center}@supports(display: grid){.empty-column-indicator,.error-column,.follow_requests-unlocked_explanation{contain:strict}}.empty-column-indicator>span,.error-column>span,.follow_requests-unlocked_explanation>span{max-width:400px}.empty-column-indicator a,.error-column a,.follow_requests-unlocked_explanation a{color:#d8a070;text-decoration:none}.empty-column-indicator a:hover,.error-column a:hover,.follow_requests-unlocked_explanation a:hover{text-decoration:underline}.follow_requests-unlocked_explanation{background:#0b1016;contain:initial}.error-column{flex-direction:column}.single-column.navbar-under .tabs-bar{margin-top:0 !important;margin-bottom:-6px !important}@media screen and (max-width: 415px){.auto-columns.navbar-under .tabs-bar{margin-top:0 !important;margin-bottom:-6px !important}}@media screen and (max-width: 415px){.auto-columns.navbar-under .react-swipeable-view-container .columns-area,.single-column.navbar-under .react-swipeable-view-container .columns-area{height:100% !important}}.column-inline-form{padding:7px 15px;padding-right:5px;display:flex;justify-content:flex-start;align-items:center;background:#192432}.column-inline-form label{flex:1 1 auto}.column-inline-form label input{width:100%;margin-bottom:6px}.column-inline-form label input:focus{outline:0}.column-inline-form .icon-button{flex:0 0 auto;margin:0 5px}.regeneration-indicator{text-align:center;font-size:16px;font-weight:500;color:#3e5a7c;background:#121a24;cursor:default;display:flex;flex:1 1 auto;flex-direction:column;align-items:center;justify-content:center;padding:20px}.regeneration-indicator__figure,.regeneration-indicator__figure img{display:block;width:auto;height:160px;margin:0}.regeneration-indicator--without-header{padding-top:68px}.regeneration-indicator__label{margin-top:30px}.regeneration-indicator__label strong{display:block;margin-bottom:10px;color:#3e5a7c}.regeneration-indicator__label span{font-size:15px;font-weight:400}.directory__list{width:100%;margin:10px 0;transition:opacity 100ms ease-in}.directory__list.loading{opacity:.7}@media screen and (max-width: 415px){.directory__list{margin:0}}.directory__card{box-sizing:border-box;margin-bottom:10px}.directory__card__img{height:125px;position:relative;background:#000;overflow:hidden}.directory__card__img img{display:block;width:100%;height:100%;margin:0;object-fit:cover}.directory__card__bar{display:flex;align-items:center;background:#192432;padding:10px}.directory__card__bar__name{flex:1 1 auto;display:flex;align-items:center;text-decoration:none;overflow:hidden}.directory__card__bar__relationship{width:23px;min-height:1px;flex:0 0 auto}.directory__card__bar .avatar{flex:0 0 auto;width:48px;height:48px;padding-top:2px}.directory__card__bar .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px;background:#040609;object-fit:cover}.directory__card__bar .display-name{margin-left:15px;text-align:left}.directory__card__bar .display-name strong{font-size:15px;color:#fff;font-weight:500;overflow:hidden;text-overflow:ellipsis}.directory__card__bar .display-name span{display:block;font-size:14px;color:#9baec8;font-weight:400;overflow:hidden;text-overflow:ellipsis}.directory__card__extra{background:#121a24;display:flex;align-items:center;justify-content:center}.directory__card__extra .accounts-table__count{width:33.33%;flex:0 0 auto;padding:15px 0}.directory__card__extra .account__header__content{box-sizing:border-box;padding:15px 10px;border-bottom:1px solid #202e3f;width:100%;min-height:48px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.directory__card__extra .account__header__content p{display:none}.directory__card__extra .account__header__content p:first-child{display:inline}.directory__card__extra .account__header__content br{display:none}.filter-form{background:#121a24}.filter-form__column{padding:10px 15px}.filter-form .radio-button{display:block}.radio-button{font-size:14px;position:relative;display:inline-block;padding:6px 0;line-height:18px;cursor:default;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer}.radio-button input[type=radio],.radio-button input[type=checkbox]{display:none}.radio-button__input{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:50%;vertical-align:middle}.radio-button__input.checked{border-color:#e1b590;background:#e1b590}.search{position:relative}.search__input{outline:0;box-sizing:border-box;width:100%;border:none;box-shadow:none;font-family:inherit;background:#121a24;color:#9baec8;font-size:14px;margin:0;display:block;padding:15px;padding-right:30px;line-height:18px;font-size:16px}.search__input::placeholder{color:#a8b9cf}.search__input::-moz-focus-inner{border:0}.search__input::-moz-focus-inner,.search__input:focus,.search__input:active{outline:0 !important}.search__input:focus{background:#192432}@media screen and (max-width: 600px){.search__input{font-size:16px}}.search__icon::-moz-focus-inner{border:0}.search__icon::-moz-focus-inner,.search__icon:focus{outline:0 !important}.search__icon .fa{position:absolute;top:16px;right:10px;z-index:2;display:inline-block;opacity:0;transition:all 100ms linear;transition-property:color,transform,opacity;font-size:18px;width:18px;height:18px;color:#d9e1e8;cursor:default;pointer-events:none}.search__icon .fa.active{pointer-events:auto;opacity:.3}.search__icon .fa-search{transform:rotate(0deg)}.search__icon .fa-search.active{pointer-events:auto;opacity:.3}.search__icon .fa-times-circle{top:17px;transform:rotate(0deg);color:#3e5a7c;cursor:pointer}.search__icon .fa-times-circle.active{transform:rotate(90deg)}.search__icon .fa-times-circle:hover{color:#4a6b94}.search-results__header{color:#3e5a7c;background:#151f2b;border-bottom:1px solid #0b1016;padding:15px 10px;font-size:14px;font-weight:500}.search-results__info{padding:20px;color:#9baec8;text-align:center}.trends__header{color:#3e5a7c;background:#151f2b;border-bottom:1px solid #0b1016;font-weight:500;padding:15px;font-size:16px;cursor:default}.trends__header .fa{display:inline-block;margin-right:5px}.trends__item{display:flex;align-items:center;padding:15px;border-bottom:1px solid #202e3f}.trends__item:last-child{border-bottom:0}.trends__item__name{flex:1 1 auto;color:#3e5a7c;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trends__item__name strong{font-weight:500}.trends__item__name a{color:#9baec8;text-decoration:none;font-size:14px;font-weight:500;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trends__item__name a:hover span,.trends__item__name a:focus span,.trends__item__name a:active span{text-decoration:underline}.trends__item__current{flex:0 0 auto;font-size:24px;line-height:36px;font-weight:500;text-align:right;padding-right:15px;margin-left:5px;color:#d9e1e8}.trends__item__sparkline{flex:0 0 auto;width:50px}.trends__item__sparkline path:first-child{fill:rgba(216,160,112,.25) !important;fill-opacity:1 !important}.trends__item__sparkline path:last-child{stroke:#dfb088 !important}.emojione{font-size:inherit;vertical-align:middle;object-fit:contain;margin:-0.2ex .15em .2ex;width:16px;height:16px}.emojione img{width:auto}.emoji-picker-dropdown__menu{background:#fff;position:absolute;box-shadow:4px 4px 6px rgba(0,0,0,.4);border-radius:4px;margin-top:5px;z-index:2}.emoji-picker-dropdown__menu .emoji-mart-scroll{transition:opacity 200ms ease}.emoji-picker-dropdown__menu.selecting .emoji-mart-scroll{opacity:.5}.emoji-picker-dropdown__modifiers{position:absolute;top:60px;right:11px;cursor:pointer}.emoji-picker-dropdown__modifiers__menu{position:absolute;z-index:4;top:-4px;left:-8px;background:#fff;border-radius:4px;box-shadow:1px 2px 6px rgba(0,0,0,.2);overflow:hidden}.emoji-picker-dropdown__modifiers__menu button{display:block;cursor:pointer;border:0;padding:4px 8px;background:transparent}.emoji-picker-dropdown__modifiers__menu button:hover,.emoji-picker-dropdown__modifiers__menu button:focus,.emoji-picker-dropdown__modifiers__menu button:active{background:rgba(217,225,232,.4)}.emoji-picker-dropdown__modifiers__menu .emoji-mart-emoji{height:22px}.emoji-mart-emoji span{background-repeat:no-repeat}.emoji-button{display:block;padding:5px 5px 2px 2px;outline:0;cursor:pointer}.emoji-button:active,.emoji-button:focus{outline:0 !important}.emoji-button img{filter:grayscale(100%);opacity:.8;display:block;margin:0;width:22px;height:22px}.emoji-button:hover img,.emoji-button:active img,.emoji-button:focus img{opacity:1;filter:none}.doodle-modal{width:unset}.doodle-modal__container{background:#d9e1e8;text-align:center;line-height:0}.doodle-modal__container canvas{border:5px solid #d9e1e8}.doodle-modal__action-bar .filler{flex-grow:1;margin:0;padding:0}.doodle-modal__action-bar .doodle-toolbar{line-height:1;display:flex;flex-direction:column;flex-grow:0;justify-content:space-around}.doodle-modal__action-bar .doodle-toolbar.with-inputs label{display:inline-block;width:70px;text-align:right;margin-right:2px}.doodle-modal__action-bar .doodle-toolbar.with-inputs input[type=number],.doodle-modal__action-bar .doodle-toolbar.with-inputs input[type=text]{width:40px}.doodle-modal__action-bar .doodle-toolbar.with-inputs span.val{display:inline-block;text-align:left;width:50px}.doodle-modal__action-bar .doodle-palette{padding-right:0 !important;border:1px solid #000;line-height:.2rem;flex-grow:0;background:#fff}.doodle-modal__action-bar .doodle-palette button{appearance:none;width:1rem;height:1rem;margin:0;padding:0;text-align:center;color:#000;text-shadow:0 0 1px #fff;cursor:pointer;box-shadow:inset 0 0 1px rgba(255,255,255,.5);border:1px solid #000;outline-offset:-1px}.doodle-modal__action-bar .doodle-palette button.foreground{outline:1px dashed #fff}.doodle-modal__action-bar .doodle-palette button.background{outline:1px dashed red}.doodle-modal__action-bar .doodle-palette button.foreground.background{outline:1px dashed red;border-color:#fff}.drawer{width:300px;box-sizing:border-box;display:flex;flex-direction:column;overflow-y:hidden;padding:10px 5px;flex:none}.drawer:first-child{padding-left:10px}.drawer:last-child{padding-right:10px}@media screen and (max-width: 630px){.auto-columns .drawer{flex:auto}}.single-column .drawer{flex:auto}@media screen and (max-width: 630px){.auto-columns .drawer,.auto-columns .drawer:first-child,.auto-columns .drawer:last-child,.single-column .drawer,.single-column .drawer:first-child,.single-column .drawer:last-child{padding:0}}.wide .drawer{min-width:300px;max-width:400px;flex:1 1 200px}@media screen and (max-width: 630px){:root .auto-columns .drawer{flex:auto;width:100%;min-width:0;max-width:none;padding:0}}:root .single-column .drawer{flex:auto;width:100%;min-width:0;max-width:none;padding:0}.react-swipeable-view-container .drawer{height:100%}.drawer--header{display:flex;flex-direction:row;margin-bottom:10px;flex:none;background:#202e3f;font-size:16px}.drawer--header>*{display:block;box-sizing:border-box;border-bottom:2px solid transparent;padding:15px 5px 13px;height:48px;flex:1 1 auto;color:#9baec8;text-align:center;text-decoration:none;cursor:pointer}.drawer--header a{transition:background 100ms ease-in}.drawer--header a:focus,.drawer--header a:hover{outline:none;background:#17212e;transition:background 200ms ease-out}.search{position:relative;margin-bottom:10px;flex:none}@media screen and (max-width: 415px){.auto-columns .search,.single-column .search{margin-bottom:0}}@media screen and (max-width: 630px){.auto-columns .search{font-size:16px}}.single-column .search{font-size:16px}.search-popout{background:#fff;border-radius:4px;padding:10px 14px;padding-bottom:14px;margin-top:10px;color:#9baec8;box-shadow:2px 4px 15px rgba(0,0,0,.4)}.search-popout h4{text-transform:uppercase;color:#9baec8;font-size:13px;font-weight:500;margin-bottom:10px}.search-popout li{padding:4px 0}.search-popout ul{margin-bottom:10px}.search-popout em{font-weight:500;color:#121a24}.drawer--account{padding:10px;color:#9baec8;display:flex;align-items:center}.drawer--account a{color:inherit;text-decoration:none}.drawer--account .acct{display:block;color:#d9e1e8;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.navigation-bar__profile{flex:1 1 auto;margin-left:8px;overflow:hidden}.drawer--results{background:#121a24;overflow-x:hidden;overflow-y:auto}.drawer--results>header{color:#3e5a7c;background:#151f2b;padding:15px;font-weight:500;font-size:16px;cursor:default}.drawer--results>header .fa{display:inline-block;margin-right:5px}.drawer--results>section{margin-bottom:5px}.drawer--results>section h5{background:#0b1016;border-bottom:1px solid #202e3f;cursor:default;display:flex;padding:15px;font-weight:500;font-size:16px;color:#3e5a7c}.drawer--results>section h5 .fa{display:inline-block;margin-right:5px}.drawer--results>section .account:last-child,.drawer--results>section>div:last-child .status{border-bottom:0}.drawer--results>section>.hashtag{display:block;padding:10px;color:#d9e1e8;text-decoration:none}.drawer--results>section>.hashtag:hover,.drawer--results>section>.hashtag:active,.drawer--results>section>.hashtag:focus{color:#e6ebf0;text-decoration:underline}.drawer__pager{box-sizing:border-box;padding:0;flex-grow:1;position:relative;overflow:hidden;display:flex}.drawer__inner{position:absolute;top:0;left:0;background:#283a50;box-sizing:border-box;padding:0;display:flex;flex-direction:column;overflow:hidden;overflow-y:auto;width:100%;height:100%}.drawer__inner.darker{background:#121a24}.drawer__inner__mastodon{background:#283a50 url('data:image/svg+xml;utf8,') no-repeat bottom/100% auto;flex:1;min-height:47px;display:none}.drawer__inner__mastodon>img{display:block;object-fit:contain;object-position:bottom left;width:85%;height:100%;pointer-events:none;user-drag:none;user-select:none}.drawer__inner__mastodon>.mastodon{display:block;width:100%;height:100%;border:none;cursor:inherit}@media screen and (min-height: 640px){.drawer__inner__mastodon{display:block}}.pseudo-drawer{background:#283a50;font-size:13px;text-align:left}.drawer__backdrop{cursor:pointer;position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5)}.video-error-cover{align-items:center;background:#000;color:#fff;cursor:pointer;display:flex;flex-direction:column;height:100%;justify-content:center;margin-top:8px;position:relative;text-align:center;z-index:100}.media-spoiler{background:#000;color:#9baec8;border:0;width:100%;height:100%}.media-spoiler:hover,.media-spoiler:active,.media-spoiler:focus{color:#b5c3d6}.status__content>.media-spoiler{margin-top:15px}.media-spoiler.full-width{margin-left:-14px;margin-right:-14px;width:inherit;max-width:none;height:250px;border-radius:0px}.media-spoiler__warning{display:block;font-size:14px}.media-spoiler__trigger{display:block;font-size:11px;font-weight:500}.media-gallery__gifv__label{display:block;position:absolute;color:#fff;background:rgba(0,0,0,.5);bottom:6px;left:6px;padding:2px 6px;border-radius:2px;font-size:11px;font-weight:600;z-index:1;pointer-events:none;opacity:.9;transition:opacity .1s ease;line-height:18px}.media-gallery__gifv:hover .media-gallery__gifv__label{opacity:1}.media-gallery__audio{height:100%;display:flex;flex-direction:column}.media-gallery__audio span{text-align:center;color:#9baec8;display:flex;height:100%;align-items:center}.media-gallery__audio span p{width:100%}.media-gallery__audio audio{width:100%}.media-gallery{box-sizing:border-box;margin-top:8px;overflow:hidden;border-radius:4px;position:relative;width:100%;height:110px}.media-gallery.full-width{margin-left:-14px;margin-right:-14px;width:inherit;max-width:none;height:250px;border-radius:0px}.media-gallery__item{border:none;box-sizing:border-box;display:block;float:left;position:relative;border-radius:4px;overflow:hidden}.full-width .media-gallery__item{border-radius:0}.media-gallery__item.standalone .media-gallery__item-gifv-thumbnail{transform:none;top:0}.media-gallery__item.letterbox{background:#000}.media-gallery__item-thumbnail{cursor:zoom-in;display:block;text-decoration:none;color:#d9e1e8;position:relative;z-index:1}.media-gallery__item-thumbnail,.media-gallery__item-thumbnail img{height:100%;width:100%;object-fit:contain}.media-gallery__item-thumbnail:not(.letterbox),.media-gallery__item-thumbnail img:not(.letterbox){height:100%;object-fit:cover}.media-gallery__preview{width:100%;height:100%;object-fit:cover;position:absolute;top:0;left:0;z-index:0;background:#000}.media-gallery__preview--hidden{display:none}.media-gallery__gifv{height:100%;overflow:hidden;position:relative;width:100%;display:flex;justify-content:center}.media-gallery__item-gifv-thumbnail{cursor:zoom-in;height:100%;width:100%;position:relative;z-index:1;object-fit:contain;user-select:none}.media-gallery__item-gifv-thumbnail:not(.letterbox){height:100%;object-fit:cover}.media-gallery__item-thumbnail-label{clip:rect(1px 1px 1px 1px);clip:rect(1px, 1px, 1px, 1px);overflow:hidden;position:absolute}.video-modal__container{max-width:100vw;max-height:100vh}.audio-modal__container{width:50vw}.media-modal{width:100%;height:100%;position:relative}.media-modal .extended-video-player{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.media-modal .extended-video-player video{max-width:100%;max-height:80%}.media-modal__closer{position:absolute;top:0;left:0;right:0;bottom:0}.media-modal__navigation{position:absolute;top:0;left:0;right:0;bottom:0;pointer-events:none;transition:opacity .3s linear;will-change:opacity}.media-modal__navigation *{pointer-events:auto}.media-modal__navigation.media-modal__navigation--hidden{opacity:0}.media-modal__navigation.media-modal__navigation--hidden *{pointer-events:none}.media-modal__nav{background:rgba(0,0,0,.5);box-sizing:border-box;border:0;color:#fff;cursor:pointer;display:flex;align-items:center;font-size:24px;height:20vmax;margin:auto 0;padding:30px 15px;position:absolute;top:0;bottom:0}.media-modal__nav--left{left:0}.media-modal__nav--right{right:0}.media-modal__pagination{width:100%;text-align:center;position:absolute;left:0;bottom:20px;pointer-events:none}.media-modal__meta{text-align:center;position:absolute;left:0;bottom:20px;width:100%;pointer-events:none}.media-modal__meta--shifted{bottom:62px}.media-modal__meta a{pointer-events:auto;text-decoration:none;font-weight:500;color:#d9e1e8}.media-modal__meta a:hover,.media-modal__meta a:focus,.media-modal__meta a:active{text-decoration:underline}.media-modal__page-dot{display:inline-block}.media-modal__button{background-color:#fff;height:12px;width:12px;border-radius:6px;margin:10px;padding:0;border:0;font-size:0}.media-modal__button--active{background-color:#d8a070}.media-modal__close{position:absolute;right:8px;top:8px;z-index:100}.detailed .video-player__volume__current,.detailed .video-player__volume::before,.fullscreen .video-player__volume__current,.fullscreen .video-player__volume::before{bottom:27px}.detailed .video-player__volume__handle,.fullscreen .video-player__volume__handle{bottom:23px}.audio-player{box-sizing:border-box;position:relative;background:#040609;border-radius:4px;padding-bottom:44px;direction:ltr}.audio-player.editable{border-radius:0;height:100%}.audio-player__waveform{padding:15px 0;position:relative;overflow:hidden}.audio-player__waveform::before{content:\"\";display:block;position:absolute;border-top:1px solid #192432;width:100%;height:0;left:0;top:calc(50% + 1px)}.audio-player__progress-placeholder{background-color:rgba(225,181,144,.5)}.audio-player__wave-placeholder{background-color:#2d415a}.audio-player .video-player__controls{padding:0 15px;padding-top:10px;background:#040609;border-top:1px solid #192432;border-radius:0 0 4px 4px}.video-player{overflow:hidden;position:relative;background:#000;max-width:100%;border-radius:4px;box-sizing:border-box;direction:ltr}.video-player.editable{border-radius:0;height:100% !important}.video-player:focus{outline:0}.detailed-status .video-player{width:100%;height:100%}.video-player.full-width{margin-left:-14px;margin-right:-14px;width:inherit;max-width:none;height:250px;border-radius:0px}.video-player video{max-width:100vw;max-height:80vh;z-index:1;position:relative}.video-player.fullscreen{width:100% !important;height:100% !important;margin:0}.video-player.fullscreen video{max-width:100% !important;max-height:100% !important;width:100% !important;height:100% !important;outline:0}.video-player.inline video{object-fit:contain;position:relative;top:50%;transform:translateY(-50%)}.video-player__controls{position:absolute;z-index:2;bottom:0;left:0;right:0;box-sizing:border-box;background:linear-gradient(0deg, rgba(0, 0, 0, 0.85) 0, rgba(0, 0, 0, 0.45) 60%, transparent);padding:0 15px;opacity:0;transition:opacity .1s ease}.video-player__controls.active{opacity:1}.video-player.inactive video,.video-player.inactive .video-player__controls{visibility:hidden}.video-player__spoiler{display:none;position:absolute;top:0;left:0;width:100%;height:100%;z-index:4;border:0;background:#000;color:#9baec8;transition:none;pointer-events:none}.video-player__spoiler.active{display:block;pointer-events:auto}.video-player__spoiler.active:hover,.video-player__spoiler.active:active,.video-player__spoiler.active:focus{color:#b2c1d5}.video-player__spoiler__title{display:block;font-size:14px}.video-player__spoiler__subtitle{display:block;font-size:11px;font-weight:500}.video-player__buttons-bar{display:flex;justify-content:space-between;padding-bottom:10px}.video-player__buttons-bar .video-player__download__icon{color:inherit}.video-player__buttons-bar .video-player__download__icon .fa,.video-player__buttons-bar .video-player__download__icon:active .fa,.video-player__buttons-bar .video-player__download__icon:hover .fa,.video-player__buttons-bar .video-player__download__icon:focus .fa{color:inherit}.video-player__buttons{font-size:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.video-player__buttons.left button{padding-left:0}.video-player__buttons.right button{padding-right:0}.video-player__buttons button{background:transparent;padding:2px 10px;font-size:16px;border:0;color:rgba(255,255,255,.75)}.video-player__buttons button:active,.video-player__buttons button:hover,.video-player__buttons button:focus{color:#fff}.video-player__time-sep,.video-player__time-total,.video-player__time-current{font-size:14px;font-weight:500}.video-player__time-current{color:#fff;margin-left:60px}.video-player__time-sep{display:inline-block;margin:0 6px}.video-player__time-sep,.video-player__time-total{color:#fff}.video-player__volume{cursor:pointer;height:24px;display:inline}.video-player__volume::before{content:\"\";width:50px;background:rgba(255,255,255,.35);border-radius:4px;display:block;position:absolute;height:4px;left:70px;bottom:20px}.video-player__volume__current{display:block;position:absolute;height:4px;border-radius:4px;left:70px;bottom:20px;background:#e1b590}.video-player__volume__handle{position:absolute;z-index:3;border-radius:50%;width:12px;height:12px;bottom:16px;left:70px;transition:opacity .1s ease;background:#e1b590;box-shadow:1px 2px 6px rgba(0,0,0,.2);pointer-events:none}.video-player__link{padding:2px 10px}.video-player__link a{text-decoration:none;font-size:14px;font-weight:500;color:#fff}.video-player__link a:hover,.video-player__link a:active,.video-player__link a:focus{text-decoration:underline}.video-player__seek{cursor:pointer;height:24px;position:relative}.video-player__seek::before{content:\"\";width:100%;background:rgba(255,255,255,.35);border-radius:4px;display:block;position:absolute;height:4px;top:10px}.video-player__seek__progress,.video-player__seek__buffer{display:block;position:absolute;height:4px;border-radius:4px;top:10px;background:#e1b590}.video-player__seek__buffer{background:rgba(255,255,255,.2)}.video-player__seek__handle{position:absolute;z-index:3;opacity:0;border-radius:50%;width:12px;height:12px;top:6px;margin-left:-6px;transition:opacity .1s ease;background:#e1b590;box-shadow:1px 2px 6px rgba(0,0,0,.2);pointer-events:none}.video-player__seek__handle.active{opacity:1}.video-player__seek:hover .video-player__seek__handle{opacity:1}.video-player.detailed .video-player__buttons button,.video-player.fullscreen .video-player__buttons button{padding-top:10px;padding-bottom:10px}.sensitive-info{display:flex;flex-direction:row;align-items:center;position:absolute;top:4px;left:4px;z-index:100}.sensitive-marker{margin:0 3px;border-radius:2px;padding:2px 6px;color:rgba(255,255,255,.8);background:rgba(0,0,0,.5);font-size:12px;line-height:18px;text-transform:uppercase;opacity:.9;transition:opacity .1s ease}.media-gallery:hover .sensitive-marker{opacity:1}.list-editor{background:#121a24;flex-direction:column;border-radius:8px;box-shadow:2px 4px 15px rgba(0,0,0,.4);width:380px;overflow:hidden}@media screen and (max-width: 420px){.list-editor{width:90%}}.list-editor h4{padding:15px 0;background:#283a50;font-weight:500;font-size:16px;text-align:center;border-radius:8px 8px 0 0}.list-editor .drawer__pager{height:50vh}.list-editor .drawer__inner{border-radius:0 0 8px 8px}.list-editor .drawer__inner.backdrop{width:calc(100% - 60px);box-shadow:2px 4px 15px rgba(0,0,0,.4);border-radius:0 0 0 8px}.list-editor__accounts{overflow-y:auto}.list-editor .account__display-name:hover strong{text-decoration:none}.list-editor .account__avatar{cursor:default}.list-editor .search{margin-bottom:0}.list-adder{background:#121a24;flex-direction:column;border-radius:8px;box-shadow:2px 4px 15px rgba(0,0,0,.4);width:380px;overflow:hidden}@media screen and (max-width: 420px){.list-adder{width:90%}}.list-adder__account{background:#283a50}.list-adder__lists{background:#283a50;height:50vh;border-radius:0 0 8px 8px;overflow-y:auto}.list-adder .list{padding:10px;border-bottom:1px solid #202e3f}.list-adder .list__wrapper{display:flex}.list-adder .list__display-name{flex:1 1 auto;overflow:hidden;text-decoration:none;font-size:16px;padding:10px}.emoji-mart{font-size:13px;display:inline-block;color:#121a24}.emoji-mart,.emoji-mart *{box-sizing:border-box;line-height:1.15}.emoji-mart .emoji-mart-emoji{padding:6px}.emoji-mart-bar{border:0 solid #c0cdd9}.emoji-mart-bar:first-child{border-bottom-width:1px;border-top-left-radius:5px;border-top-right-radius:5px;background:#d9e1e8}.emoji-mart-bar:last-child{border-top-width:1px;border-bottom-left-radius:5px;border-bottom-right-radius:5px;display:none}.emoji-mart-anchors{display:flex;justify-content:space-between;padding:0 6px;color:#3e5a7c;line-height:0}.emoji-mart-anchor{position:relative;flex:1;text-align:center;padding:12px 4px;overflow:hidden;transition:color .1s ease-out;cursor:pointer}.emoji-mart-anchor:hover{color:#37506f}.emoji-mart-anchor-selected{color:#d8a070}.emoji-mart-anchor-selected:hover{color:#d49560}.emoji-mart-anchor-selected .emoji-mart-anchor-bar{bottom:0}.emoji-mart-anchor-bar{position:absolute;bottom:-3px;left:0;width:100%;height:3px;background-color:#d59864}.emoji-mart-anchors i{display:inline-block;width:100%;max-width:22px}.emoji-mart-anchors svg{fill:currentColor;max-height:18px}.emoji-mart-scroll{overflow-y:scroll;height:270px;max-height:35vh;padding:0 6px 6px;background:#fff;will-change:transform}.emoji-mart-scroll::-webkit-scrollbar-track:hover,.emoji-mart-scroll::-webkit-scrollbar-track:active{background-color:rgba(0,0,0,.3)}.emoji-mart-search{padding:10px;padding-right:45px;background:#fff}.emoji-mart-search input{font-size:14px;font-weight:400;padding:7px 9px;font-family:inherit;display:block;width:100%;background:rgba(217,225,232,.3);color:#121a24;border:1px solid #d9e1e8;border-radius:4px}.emoji-mart-search input::-moz-focus-inner{border:0}.emoji-mart-search input::-moz-focus-inner,.emoji-mart-search input:focus,.emoji-mart-search input:active{outline:0 !important}.emoji-mart-category .emoji-mart-emoji{cursor:pointer}.emoji-mart-category .emoji-mart-emoji span{z-index:1;position:relative;text-align:center}.emoji-mart-category .emoji-mart-emoji:hover::before{z-index:0;content:\"\";position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(217,225,232,.7);border-radius:100%}.emoji-mart-category-label{z-index:2;position:relative;position:-webkit-sticky;position:sticky;top:0}.emoji-mart-category-label span{display:block;width:100%;font-weight:500;padding:5px 6px;background:#fff}.emoji-mart-emoji{position:relative;display:inline-block;font-size:0}.emoji-mart-emoji span{width:22px;height:22px}.emoji-mart-no-results{font-size:14px;text-align:center;padding-top:70px;color:#9baec8}.emoji-mart-no-results .emoji-mart-category-label{display:none}.emoji-mart-no-results .emoji-mart-no-results-label{margin-top:.2em}.emoji-mart-no-results .emoji-mart-emoji:hover::before{content:none}.emoji-mart-preview{display:none}.glitch.local-settings{position:relative;display:flex;flex-direction:row;background:#d9e1e8;color:#121a24;border-radius:8px;height:80vh;width:80vw;max-width:740px;max-height:450px;overflow:hidden}.glitch.local-settings label,.glitch.local-settings legend{display:block;font-size:14px}.glitch.local-settings .boolean label,.glitch.local-settings .radio_buttons label{position:relative;padding-left:28px;padding-top:3px}.glitch.local-settings .boolean label input,.glitch.local-settings .radio_buttons label input{position:absolute;left:0;top:0}.glitch.local-settings span.hint{display:block;color:#3e5a7c}.glitch.local-settings h1{font-size:18px;font-weight:500;line-height:24px;margin-bottom:20px}.glitch.local-settings h2{font-size:15px;font-weight:500;line-height:20px;margin-top:20px;margin-bottom:10px}.glitch.local-settings__navigation__item{display:block;padding:15px 20px;color:inherit;background:#f2f5f7;border-bottom:1px #d9e1e8 solid;cursor:pointer;text-decoration:none;outline:none;transition:background .3s}.glitch.local-settings__navigation__item .text-icon-button{color:inherit;transition:unset}.glitch.local-settings__navigation__item:hover{background:#d9e1e8}.glitch.local-settings__navigation__item.active{background:#d8a070;color:#fff}.glitch.local-settings__navigation__item.close,.glitch.local-settings__navigation__item.close:hover{background:#df405a;color:#fff}.glitch.local-settings__navigation{background:#f2f5f7;width:212px;font-size:15px;line-height:20px;overflow-y:auto}.glitch.local-settings__page{display:block;flex:auto;padding:15px 20px 15px 20px;width:360px;overflow-y:auto}.glitch.local-settings__page__item{margin-bottom:2px}.glitch.local-settings__page__item.string,.glitch.local-settings__page__item.radio_buttons{margin-top:10px;margin-bottom:10px}@media screen and (max-width: 630px){.glitch.local-settings__navigation{width:40px;flex-shrink:0}.glitch.local-settings__navigation__item{padding:10px}.glitch.local-settings__navigation__item span:last-of-type{display:none}}.error-boundary{color:#fff;font-size:15px;line-height:20px}.error-boundary h1{font-size:26px;line-height:36px;font-weight:400;margin-bottom:8px}.error-boundary a{color:#fff;text-decoration:underline}.error-boundary ul{list-style:disc;margin-left:0;padding-left:1em}.error-boundary textarea.web_app_crash-stacktrace{width:100%;resize:none;white-space:pre;font-family:monospace,monospace}.compose-panel{width:285px;margin-top:10px;display:flex;flex-direction:column;height:calc(100% - 10px);overflow-y:hidden}.compose-panel .search__input{line-height:18px;font-size:16px;padding:15px;padding-right:30px}.compose-panel .search__icon .fa{top:15px}.compose-panel .drawer--account{flex:0 1 48px}.compose-panel .flex-spacer{background:transparent}.compose-panel .composer{flex:1;overflow-y:hidden;display:flex;flex-direction:column;min-height:310px}.compose-panel .compose-form__autosuggest-wrapper{overflow-y:auto;background-color:#fff;border-radius:4px 4px 0 0;flex:0 1 auto}.compose-panel .autosuggest-textarea__textarea{overflow-y:hidden}.compose-panel .compose-form__upload-thumbnail{height:80px}.navigation-panel{margin-top:10px;margin-bottom:10px;height:calc(100% - 20px);overflow-y:auto;display:flex;flex-direction:column}.navigation-panel>a{flex:0 0 auto}.navigation-panel hr{flex:0 0 auto;border:0;background:transparent;border-top:1px solid #192432;margin:10px 0}.navigation-panel .flex-spacer{background:transparent}@media screen and (min-width: 600px){.tabs-bar__link span{display:inline}}.columns-area--mobile{flex-direction:column;width:100%;margin:0 auto}.columns-area--mobile .column,.columns-area--mobile .drawer{width:100%;height:100%;padding:0}.columns-area--mobile .directory__list{display:grid;grid-gap:10px;grid-template-columns:minmax(0, 50%) minmax(0, 50%)}@media screen and (max-width: 415px){.columns-area--mobile .directory__list{display:block}}.columns-area--mobile .directory__card{margin-bottom:0}.columns-area--mobile .filter-form{display:flex}.columns-area--mobile .autosuggest-textarea__textarea{font-size:16px}.columns-area--mobile .search__input{line-height:18px;font-size:16px;padding:15px;padding-right:30px}.columns-area--mobile .search__icon .fa{top:15px}.columns-area--mobile .scrollable{overflow:visible}@supports(display: grid){.columns-area--mobile .scrollable{contain:content}}@media screen and (min-width: 415px){.columns-area--mobile{padding:10px 0;padding-top:0}}@media screen and (min-width: 630px){.columns-area--mobile .detailed-status{padding:15px}.columns-area--mobile .detailed-status .media-gallery,.columns-area--mobile .detailed-status .video-player,.columns-area--mobile .detailed-status .audio-player{margin-top:15px}.columns-area--mobile .account__header__bar{padding:5px 10px}.columns-area--mobile .navigation-bar,.columns-area--mobile .compose-form{padding:15px}.columns-area--mobile .compose-form .compose-form__publish .compose-form__publish-button-wrapper{padding-top:15px}.columns-area--mobile .status{padding:15px;min-height:50px}.columns-area--mobile .status .media-gallery,.columns-area--mobile .status__action-bar,.columns-area--mobile .status .video-player,.columns-area--mobile .status .audio-player{margin-top:10px}.columns-area--mobile .account{padding:15px 10px}.columns-area--mobile .account__header__bio{margin:0 -10px}.columns-area--mobile .notification__message{padding-top:15px}.columns-area--mobile .notification .status{padding-top:8px}.columns-area--mobile .notification .account{padding-top:8px}}.floating-action-button{position:fixed;display:flex;justify-content:center;align-items:center;width:3.9375rem;height:3.9375rem;bottom:1.3125rem;right:1.3125rem;background:#d59864;color:#fff;border-radius:50%;font-size:21px;line-height:21px;text-decoration:none;box-shadow:2px 3px 9px rgba(0,0,0,.4)}.floating-action-button:hover,.floating-action-button:focus,.floating-action-button:active{background:#e0b38c}@media screen and (min-width: 415px){.tabs-bar{width:100%}.react-swipeable-view-container .columns-area--mobile{height:calc(100% - 10px) !important}.getting-started__wrapper,.search{margin-bottom:10px}}@media screen and (max-width: 895px){.columns-area__panels__pane--compositional{display:none}}@media screen and (min-width: 895px){.floating-action-button,.tabs-bar__link.optional{display:none}.search-page .search{display:none}}@media screen and (max-width: 1190px){.columns-area__panels__pane--navigational{display:none}}@media screen and (min-width: 1190px){.tabs-bar{display:none}}.announcements__item__content{word-wrap:break-word;overflow-y:auto}.announcements__item__content .emojione{width:20px;height:20px;margin:-3px 0 0}.announcements__item__content p{margin-bottom:10px;white-space:pre-wrap}.announcements__item__content p:last-child{margin-bottom:0}.announcements__item__content a{color:#d9e1e8;text-decoration:none}.announcements__item__content a:hover{text-decoration:underline}.announcements__item__content a.mention:hover{text-decoration:none}.announcements__item__content a.mention:hover span{text-decoration:underline}.announcements__item__content a.unhandled-link{color:#e1b590}.announcements{background:#202e3f;font-size:13px;display:flex;align-items:flex-end}.announcements__mastodon{width:124px;flex:0 0 auto}@media screen and (max-width: 424px){.announcements__mastodon{display:none}}.announcements__container{width:calc(100% - 124px);flex:0 0 auto;position:relative}@media screen and (max-width: 424px){.announcements__container{width:100%}}.announcements__item{box-sizing:border-box;width:100%;padding:15px;position:relative;font-size:15px;line-height:20px;word-wrap:break-word;font-weight:400;max-height:50vh;overflow:hidden;display:flex;flex-direction:column}.announcements__item__range{display:block;font-weight:500;margin-bottom:10px;padding-right:18px}.announcements__item__unread{position:absolute;top:19px;right:19px;display:block;background:#d8a070;border-radius:50%;width:.625rem;height:.625rem}.announcements__pagination{padding:15px;color:#9baec8;position:absolute;bottom:3px;right:0}.layout-multiple-columns .announcements__mastodon{display:none}.layout-multiple-columns .announcements__container{width:100%}.reactions-bar{display:flex;flex-wrap:wrap;align-items:center;margin-top:15px;margin-left:-2px;width:calc(100% - (90px - 33px))}.reactions-bar__item{flex-shrink:0;background:#26374d;border:0;border-radius:3px;margin:2px;cursor:pointer;user-select:none;padding:0 6px;display:flex;align-items:center;transition:all 100ms ease-in;transition-property:background-color,color}.reactions-bar__item__emoji{display:block;margin:3px 0;width:16px;height:16px}.reactions-bar__item__emoji img{display:block;margin:0;width:100%;height:100%;min-width:auto;min-height:auto;vertical-align:bottom;object-fit:contain}.reactions-bar__item__count{display:block;min-width:9px;font-size:13px;font-weight:500;text-align:center;margin-left:6px;color:#9baec8}.reactions-bar__item:hover,.reactions-bar__item:focus,.reactions-bar__item:active{background:#2d415a;transition:all 200ms ease-out;transition-property:background-color,color}.reactions-bar__item:hover__count,.reactions-bar__item:focus__count,.reactions-bar__item:active__count{color:#a8b9cf}.reactions-bar__item.active{transition:all 100ms ease-in;transition-property:background-color,color;background-color:#4a4c54}.reactions-bar__item.active .reactions-bar__item__count{color:#e1b590}.reactions-bar .emoji-picker-dropdown{margin:2px}.reactions-bar:hover .emoji-button{opacity:.85}.reactions-bar .emoji-button{color:#9baec8;margin:0;font-size:16px;width:auto;flex-shrink:0;padding:0 6px;height:22px;display:flex;align-items:center;opacity:.5;transition:all 100ms ease-in;transition-property:background-color,color}.reactions-bar .emoji-button:hover,.reactions-bar .emoji-button:active,.reactions-bar .emoji-button:focus{opacity:1;color:#a8b9cf;transition:all 200ms ease-out;transition-property:background-color,color}.reactions-bar--empty .emoji-button{padding:0}.poll{margin-top:16px;font-size:14px}.poll ul,.e-content .poll ul{margin:0;list-style:none}.poll li{margin-bottom:10px;position:relative}.poll__chart{border-radius:4px;display:block;background:#8ba1bf;height:5px;min-width:1%}.poll__chart.leading{background:#d8a070}.poll__option{position:relative;display:flex;padding:6px 0;line-height:18px;cursor:default;overflow:hidden}.poll__option__text{display:inline-block;word-wrap:break-word;overflow-wrap:break-word;max-width:calc(100% - 45px - 25px)}.poll__option input[type=radio],.poll__option input[type=checkbox]{display:none}.poll__option .autossugest-input{flex:1 1 auto}.poll__option input[type=text]{display:block;box-sizing:border-box;width:100%;font-size:14px;color:#121a24;display:block;outline:0;font-family:inherit;background:#fff;border:1px solid #dbdbdb;border-radius:4px;padding:6px 10px}.poll__option input[type=text]:focus{border-color:#d8a070}.poll__option.selectable{cursor:pointer}.poll__option.editable{display:flex;align-items:center;overflow:visible}.poll__input{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:50%;vertical-align:middle;margin-top:auto;margin-bottom:auto;flex:0 0 18px}.poll__input.checkbox{border-radius:4px}.poll__input.active{border-color:#79bd9a;background:#79bd9a}.poll__input:active,.poll__input:focus,.poll__input:hover{border-color:#acd6c1;border-width:4px}.poll__input::-moz-focus-inner{outline:0 !important;border:0}.poll__input:focus,.poll__input:active{outline:0 !important}.poll__number{display:inline-block;width:45px;font-weight:700;flex:0 0 45px}.poll__voted{padding:0 5px;display:inline-block}.poll__voted__mark{font-size:18px}.poll__footer{padding-top:6px;padding-bottom:5px;color:#3e5a7c}.poll__link{display:inline;background:transparent;padding:0;margin:0;border:0;color:#3e5a7c;text-decoration:underline;font-size:inherit}.poll__link:hover{text-decoration:none}.poll__link:active,.poll__link:focus{background-color:rgba(62,90,124,.1)}.poll .button{height:36px;padding:0 16px;margin-right:10px;font-size:14px}.compose-form__poll-wrapper{border-top:1px solid #ebebeb;overflow-x:hidden}.compose-form__poll-wrapper ul{padding:10px}.compose-form__poll-wrapper .poll__footer{border-top:1px solid #ebebeb;padding:10px;display:flex;align-items:center}.compose-form__poll-wrapper .poll__footer button,.compose-form__poll-wrapper .poll__footer select{width:100%;flex:1 1 50%}.compose-form__poll-wrapper .poll__footer button:focus,.compose-form__poll-wrapper .poll__footer select:focus{border-color:#d8a070}.compose-form__poll-wrapper .button.button-secondary{font-size:14px;font-weight:400;padding:6px 10px;height:auto;line-height:inherit;color:#3e5a7c;border-color:#3e5a7c;margin-right:5px}.compose-form__poll-wrapper li{display:flex;align-items:center}.compose-form__poll-wrapper li .poll__option{flex:0 0 auto;width:calc(100% - (23px + 6px));margin-right:6px}.compose-form__poll-wrapper select{appearance:none;box-sizing:border-box;font-size:14px;color:#121a24;display:inline-block;width:auto;outline:0;font-family:inherit;background:#fff url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center/auto 16px;border:1px solid #dbdbdb;border-radius:4px;padding:6px 10px;padding-right:30px}.compose-form__poll-wrapper .icon-button.disabled{color:#dbdbdb}.muted .poll{color:#3e5a7c}.muted .poll__chart{background:rgba(109,137,175,.2)}.muted .poll__chart.leading{background:rgba(216,160,112,.2)}.container{box-sizing:border-box;max-width:1235px;margin:0 auto;position:relative}@media screen and (max-width: 1255px){.container{width:100%;padding:0 10px}}.rich-formatting{font-family:sans-serif,sans-serif;font-size:14px;font-weight:400;line-height:1.7;word-wrap:break-word;color:#9baec8}.rich-formatting a{color:#d8a070;text-decoration:underline}.rich-formatting a:hover,.rich-formatting a:focus,.rich-formatting a:active{text-decoration:none}.rich-formatting p,.rich-formatting li{color:#9baec8}.rich-formatting p{margin-top:0;margin-bottom:.85em}.rich-formatting p:last-child{margin-bottom:0}.rich-formatting strong{font-weight:700;color:#d9e1e8}.rich-formatting em{font-style:italic;color:#d9e1e8}.rich-formatting code{font-size:.85em;background:#040609;border-radius:4px;padding:.2em .3em}.rich-formatting h1,.rich-formatting h2,.rich-formatting h3,.rich-formatting h4,.rich-formatting h5,.rich-formatting h6{font-family:sans-serif,sans-serif;margin-top:1.275em;margin-bottom:.85em;font-weight:500;color:#d9e1e8}.rich-formatting h1{font-size:2em}.rich-formatting h2{font-size:1.75em}.rich-formatting h3{font-size:1.5em}.rich-formatting h4{font-size:1.25em}.rich-formatting h5,.rich-formatting h6{font-size:1em}.rich-formatting ul{list-style:disc}.rich-formatting ol{list-style:decimal}.rich-formatting ul,.rich-formatting ol{margin:0;padding:0;padding-left:2em;margin-bottom:.85em}.rich-formatting ul[type=a],.rich-formatting ol[type=a]{list-style-type:lower-alpha}.rich-formatting ul[type=i],.rich-formatting ol[type=i]{list-style-type:lower-roman}.rich-formatting hr{width:100%;height:0;border:0;border-bottom:1px solid #192432;margin:1.7em 0}.rich-formatting hr.spacer{height:1px;border:0}.rich-formatting table{width:100%;border-collapse:collapse;break-inside:auto;margin-top:24px;margin-bottom:32px}.rich-formatting table thead tr,.rich-formatting table tbody tr{border-bottom:1px solid #192432;font-size:1em;line-height:1.625;font-weight:400;text-align:left;color:#9baec8}.rich-formatting table thead tr{border-bottom-width:2px;line-height:1.5;font-weight:500;color:#3e5a7c}.rich-formatting table th,.rich-formatting table td{padding:8px;align-self:start;align-items:start;word-break:break-all}.rich-formatting table th.nowrap,.rich-formatting table td.nowrap{width:25%;position:relative}.rich-formatting table th.nowrap::before,.rich-formatting table td.nowrap::before{content:\" \";visibility:hidden}.rich-formatting table th.nowrap span,.rich-formatting table td.nowrap span{position:absolute;left:8px;right:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rich-formatting>:first-child{margin-top:0}.information-board{background:#0b1016;padding:20px 0}.information-board .container-alt{position:relative;padding-right:295px}.information-board__sections{display:flex;justify-content:space-between;flex-wrap:wrap}.information-board__section{flex:1 0 0;font-family:sans-serif,sans-serif;font-size:16px;line-height:28px;color:#fff;text-align:right;padding:10px 15px}.information-board__section span,.information-board__section strong{display:block}.information-board__section span:last-child{color:#d9e1e8}.information-board__section strong{font-family:sans-serif,sans-serif;font-weight:500;font-size:32px;line-height:48px}@media screen and (max-width: 700px){.information-board__section{text-align:center}}.information-board .panel{position:absolute;width:280px;box-sizing:border-box;background:#040609;padding:20px;padding-top:10px;border-radius:4px 4px 0 0;right:0;bottom:-40px}.information-board .panel .panel-header{font-family:sans-serif,sans-serif;font-size:14px;line-height:24px;font-weight:500;color:#9baec8;padding-bottom:5px;margin-bottom:15px;border-bottom:1px solid #192432;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.information-board .panel .panel-header a,.information-board .panel .panel-header span{font-weight:400;color:#7a93b6}.information-board .panel .panel-header a{text-decoration:none}.information-board .owner{text-align:center}.information-board .owner .avatar{width:80px;height:80px;width:80px;height:80px;background-size:80px 80px;margin:0 auto;margin-bottom:15px}.information-board .owner .avatar img{display:block;width:80px;height:80px;border-radius:48px;border-radius:8%;background-position:50%;background-clip:padding-box}.information-board .owner .name{font-size:14px}.information-board .owner .name a{display:block;color:#fff;text-decoration:none}.information-board .owner .name a:hover .display_name{text-decoration:underline}.information-board .owner .name .username{display:block;color:#9baec8}.landing-page p,.landing-page li{font-family:sans-serif,sans-serif;font-size:16px;font-weight:400;font-size:16px;line-height:30px;margin-bottom:12px;color:#9baec8}.landing-page p a,.landing-page li a{color:#d8a070;text-decoration:underline}.landing-page em{display:inline;margin:0;padding:0;font-weight:700;background:transparent;font-family:inherit;font-size:inherit;line-height:inherit;color:#bcc9da}.landing-page h1{font-family:sans-serif,sans-serif;font-size:26px;line-height:30px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page h1 small{font-family:sans-serif,sans-serif;display:block;font-size:18px;font-weight:400;color:#bcc9da}.landing-page h2{font-family:sans-serif,sans-serif;font-size:22px;line-height:26px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page h3{font-family:sans-serif,sans-serif;font-size:18px;line-height:24px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page h4{font-family:sans-serif,sans-serif;font-size:16px;line-height:24px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page h5{font-family:sans-serif,sans-serif;font-size:14px;line-height:24px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page h6{font-family:sans-serif,sans-serif;font-size:12px;line-height:24px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page ul,.landing-page ol{margin-left:20px}.landing-page ul[type=a],.landing-page ol[type=a]{list-style-type:lower-alpha}.landing-page ul[type=i],.landing-page ol[type=i]{list-style-type:lower-roman}.landing-page ul{list-style:disc}.landing-page ol{list-style:decimal}.landing-page li>ol,.landing-page li>ul{margin-top:6px}.landing-page hr{width:100%;height:0;border:0;border-bottom:1px solid rgba(62,90,124,.6);margin:20px 0}.landing-page hr.spacer{height:1px;border:0}.landing-page__information,.landing-page__forms{padding:20px}.landing-page__call-to-action{background:#121a24;border-radius:4px;padding:25px 40px;overflow:hidden;box-sizing:border-box}.landing-page__call-to-action .row{width:100%;display:flex;flex-direction:row-reverse;flex-wrap:nowrap;justify-content:space-between;align-items:center}.landing-page__call-to-action .row__information-board{display:flex;justify-content:flex-end;align-items:flex-end}.landing-page__call-to-action .row__information-board .information-board__section{flex:1 0 auto;padding:0 10px}@media screen and (max-width: 415px){.landing-page__call-to-action .row__information-board{width:100%;justify-content:space-between}}.landing-page__call-to-action .row__mascot{flex:1;margin:10px -50px 0 0}@media screen and (max-width: 415px){.landing-page__call-to-action .row__mascot{display:none}}.landing-page__logo{margin-right:20px}.landing-page__logo img{height:50px;width:auto;mix-blend-mode:lighten}.landing-page__information{padding:45px 40px;margin-bottom:10px}.landing-page__information:last-child{margin-bottom:0}.landing-page__information strong{font-weight:500;color:#bcc9da}.landing-page__information .account{border-bottom:0;padding:0}.landing-page__information .account__display-name{align-items:center;display:flex;margin-right:5px}.landing-page__information .account div.account__display-name:hover .display-name strong{text-decoration:none}.landing-page__information .account div.account__display-name .account__avatar{cursor:default}.landing-page__information .account__avatar-wrapper{margin-left:0;flex:0 0 auto}.landing-page__information .account__avatar{width:44px;height:44px;background-size:44px 44px;width:44px;height:44px;background-size:44px 44px}.landing-page__information .account .display-name{font-size:15px}.landing-page__information .account .display-name__account{font-size:14px}@media screen and (max-width: 960px){.landing-page__information .contact{margin-top:30px}}@media screen and (max-width: 700px){.landing-page__information{padding:25px 20px}}.landing-page__information,.landing-page__forms,.landing-page #mastodon-timeline{box-sizing:border-box;background:#121a24;border-radius:4px;box-shadow:0 0 6px rgba(0,0,0,.1)}.landing-page__mascot{height:104px;position:relative;left:-40px;bottom:25px}.landing-page__mascot img{height:190px;width:auto}.landing-page__short-description .row{display:flex;flex-wrap:wrap;align-items:center;margin-bottom:40px}@media screen and (max-width: 700px){.landing-page__short-description .row{margin-bottom:20px}}.landing-page__short-description p a{color:#d9e1e8}.landing-page__short-description h1{font-weight:500;color:#fff;margin-bottom:0}.landing-page__short-description h1 small{color:#9baec8}.landing-page__short-description h1 small span{color:#d9e1e8}.landing-page__short-description p:last-child{margin-bottom:0}.landing-page__hero{margin-bottom:10px}.landing-page__hero img{display:block;margin:0;max-width:100%;height:auto;border-radius:4px}@media screen and (max-width: 840px){.landing-page .information-board .container-alt{padding-right:20px}.landing-page .information-board .panel{position:static;margin-top:20px;width:100%;border-radius:4px}.landing-page .information-board .panel .panel-header{text-align:center}}@media screen and (max-width: 675px){.landing-page .header-wrapper{padding-top:0}.landing-page .header-wrapper.compact{padding-bottom:0}.landing-page .header-wrapper.compact .hero .heading{text-align:initial}.landing-page .header .container-alt,.landing-page .features .container-alt{display:block}}.landing-page .cta{margin:20px}.landing{margin-bottom:100px}@media screen and (max-width: 738px){.landing{margin-bottom:0}}.landing__brand{display:flex;justify-content:center;align-items:center;padding:50px}.landing__brand svg{fill:#fff;height:52px}@media screen and (max-width: 415px){.landing__brand{padding:0;margin-bottom:30px}}.landing .directory{margin-top:30px;background:transparent;box-shadow:none;border-radius:0}.landing .hero-widget{margin-top:30px;margin-bottom:0}.landing .hero-widget h4{padding:10px;text-transform:uppercase;font-weight:700;font-size:13px;color:#9baec8}.landing .hero-widget__text{border-radius:0;padding-bottom:0}.landing .hero-widget__footer{background:#121a24;padding:10px;border-radius:0 0 4px 4px;display:flex}.landing .hero-widget__footer__column{flex:1 1 50%}.landing .hero-widget .account{padding:10px 0;border-bottom:0}.landing .hero-widget .account .account__display-name{display:flex;align-items:center}.landing .hero-widget .account .account__avatar{width:44px;height:44px;background-size:44px 44px}.landing .hero-widget__counter{padding:10px}.landing .hero-widget__counter strong{font-family:sans-serif,sans-serif;font-size:15px;font-weight:700;display:block}.landing .hero-widget__counter span{font-size:14px;color:#9baec8}.landing .simple_form .user_agreement .label_input>label{font-weight:400;color:#9baec8}.landing .simple_form p.lead{color:#9baec8;font-size:15px;line-height:20px;font-weight:400;margin-bottom:25px}.landing__grid{max-width:960px;margin:0 auto;display:grid;grid-template-columns:minmax(0, 50%) minmax(0, 50%);grid-gap:30px}@media screen and (max-width: 738px){.landing__grid{grid-template-columns:minmax(0, 100%);grid-gap:10px}.landing__grid__column-login{grid-row:1;display:flex;flex-direction:column}.landing__grid__column-login .box-widget{order:2;flex:0 0 auto}.landing__grid__column-login .hero-widget{margin-top:0;margin-bottom:10px;order:1;flex:0 0 auto}.landing__grid__column-registration{grid-row:2}.landing__grid .directory{margin-top:10px}}@media screen and (max-width: 415px){.landing__grid{grid-gap:0}.landing__grid .hero-widget{display:block;margin-bottom:0;box-shadow:none}.landing__grid .hero-widget__img,.landing__grid .hero-widget__img img,.landing__grid .hero-widget__footer{border-radius:0}.landing__grid .hero-widget,.landing__grid .box-widget,.landing__grid .directory__tag{border-bottom:1px solid #202e3f}.landing__grid .directory{margin-top:0}.landing__grid .directory__tag{margin-bottom:0}.landing__grid .directory__tag>a,.landing__grid .directory__tag>div{border-radius:0;box-shadow:none}.landing__grid .directory__tag:last-child{border-bottom:0}}.brand{position:relative;text-decoration:none}.brand__tagline{display:block;position:absolute;bottom:-10px;left:50px;width:300px;color:#9baec8;text-decoration:none;font-size:14px}@media screen and (max-width: 415px){.brand__tagline{position:static;width:auto;margin-top:20px;color:#3e5a7c}}.table{width:100%;max-width:100%;border-spacing:0;border-collapse:collapse}.table th,.table td{padding:8px;line-height:18px;vertical-align:top;border-top:1px solid #121a24;text-align:left;background:#0b1016}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #121a24;border-top:0;font-weight:500}.table>tbody>tr>th{font-weight:500}.table>tbody>tr:nth-child(odd)>td,.table>tbody>tr:nth-child(odd)>th{background:#121a24}.table a{color:#d8a070;text-decoration:underline}.table a:hover{text-decoration:none}.table strong{font-weight:500}.table strong:lang(ja){font-weight:700}.table strong:lang(ko){font-weight:700}.table strong:lang(zh-CN){font-weight:700}.table strong:lang(zh-HK){font-weight:700}.table strong:lang(zh-TW){font-weight:700}.table.inline-table>tbody>tr:nth-child(odd)>td,.table.inline-table>tbody>tr:nth-child(odd)>th{background:transparent}.table.inline-table>tbody>tr:first-child>td,.table.inline-table>tbody>tr:first-child>th{border-top:0}.table.batch-table>thead>tr>th{background:#121a24;border-top:1px solid #040609;border-bottom:1px solid #040609}.table.batch-table>thead>tr>th:first-child{border-radius:4px 0 0;border-left:1px solid #040609}.table.batch-table>thead>tr>th:last-child{border-radius:0 4px 0 0;border-right:1px solid #040609}.table--invites tbody td{vertical-align:middle}.table-wrapper{overflow:auto;margin-bottom:20px}samp{font-family:monospace,monospace}button.table-action-link{background:transparent;border:0;font:inherit}button.table-action-link,a.table-action-link{text-decoration:none;display:inline-block;margin-right:5px;padding:0 10px;color:#9baec8;font-weight:500}button.table-action-link:hover,a.table-action-link:hover{color:#fff}button.table-action-link i.fa,a.table-action-link i.fa{font-weight:400;margin-right:5px}button.table-action-link:first-child,a.table-action-link:first-child{padding-left:0}.batch-table__toolbar,.batch-table__row{display:flex}.batch-table__toolbar__select,.batch-table__row__select{box-sizing:border-box;padding:8px 16px;cursor:pointer;min-height:100%}.batch-table__toolbar__select input,.batch-table__row__select input{margin-top:8px}.batch-table__toolbar__select--aligned,.batch-table__row__select--aligned{display:flex;align-items:center}.batch-table__toolbar__select--aligned input,.batch-table__row__select--aligned input{margin-top:0}.batch-table__toolbar__actions,.batch-table__toolbar__content,.batch-table__row__actions,.batch-table__row__content{padding:8px 0;padding-right:16px;flex:1 1 auto}.batch-table__toolbar{border:1px solid #040609;background:#121a24;border-radius:4px 0 0;height:47px;align-items:center}.batch-table__toolbar__actions{text-align:right;padding-right:11px}.batch-table__form{padding:16px;border:1px solid #040609;border-top:0;background:#121a24}.batch-table__form .fields-row{padding-top:0;margin-bottom:0}.batch-table__row{border:1px solid #040609;border-top:0;background:#0b1016}@media screen and (max-width: 415px){.optional .batch-table__row:first-child{border-top:1px solid #040609}}.batch-table__row:hover{background:#0f151d}.batch-table__row:nth-child(even){background:#121a24}.batch-table__row:nth-child(even):hover{background:#151f2b}.batch-table__row__content{padding-top:12px;padding-bottom:16px}.batch-table__row__content--unpadded{padding:0}.batch-table__row__content--with-image{display:flex;align-items:center}.batch-table__row__content__image{flex:0 0 auto;display:flex;justify-content:center;align-items:center;margin-right:10px}.batch-table__row__content__image .emojione{width:32px;height:32px}.batch-table__row__content__text{flex:1 1 auto}.batch-table__row__content__extra{flex:0 0 auto;text-align:right;color:#9baec8;font-weight:500}.batch-table__row .directory__tag{margin:0;width:100%}.batch-table__row .directory__tag a{background:transparent;border-radius:0}@media screen and (max-width: 415px){.batch-table.optional .batch-table__toolbar,.batch-table.optional .batch-table__row__select{display:none}}.batch-table .status__content{padding-top:0}.batch-table .status__content strong{font-weight:700}.batch-table .nothing-here{border:1px solid #040609;border-top:0;box-shadow:none}@media screen and (max-width: 415px){.batch-table .nothing-here{border-top:1px solid #040609}}@media screen and (max-width: 870px){.batch-table .accounts-table tbody td.optional{display:none}}.admin-wrapper{display:flex;justify-content:center;width:100%;min-height:100vh}.admin-wrapper .sidebar-wrapper{min-height:100vh;overflow:hidden;pointer-events:none;flex:1 1 auto}.admin-wrapper .sidebar-wrapper__inner{display:flex;justify-content:flex-end;background:#121a24;height:100%}.admin-wrapper .sidebar{width:240px;padding:0;pointer-events:auto}.admin-wrapper .sidebar__toggle{display:none;background:#202e3f;height:48px}.admin-wrapper .sidebar__toggle__logo{flex:1 1 auto}.admin-wrapper .sidebar__toggle__logo a{display:inline-block;padding:15px}.admin-wrapper .sidebar__toggle__logo svg{fill:#fff;height:20px;position:relative;bottom:-2px}.admin-wrapper .sidebar__toggle__icon{display:block;color:#9baec8;text-decoration:none;flex:0 0 auto;font-size:20px;padding:15px}.admin-wrapper .sidebar__toggle a:hover,.admin-wrapper .sidebar__toggle a:focus,.admin-wrapper .sidebar__toggle a:active{background:#26374d}.admin-wrapper .sidebar .logo{display:block;margin:40px auto;width:100px;height:100px}@media screen and (max-width: 600px){.admin-wrapper .sidebar>a:first-child{display:none}}.admin-wrapper .sidebar ul{list-style:none;border-radius:4px 0 0 4px;overflow:hidden;margin-bottom:20px}@media screen and (max-width: 600px){.admin-wrapper .sidebar ul{margin-bottom:0}}.admin-wrapper .sidebar ul a{display:block;padding:15px;color:#9baec8;text-decoration:none;transition:all 200ms linear;transition-property:color,background-color;border-radius:4px 0 0 4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.admin-wrapper .sidebar ul a i.fa{margin-right:5px}.admin-wrapper .sidebar ul a:hover{color:#fff;background-color:#0a0e13;transition:all 100ms linear;transition-property:color,background-color}.admin-wrapper .sidebar ul a.selected{background:#0f151d;border-radius:4px 0 0}.admin-wrapper .sidebar ul ul{background:#0b1016;border-radius:0 0 0 4px;margin:0}.admin-wrapper .sidebar ul ul a{border:0;padding:15px 35px}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a{color:#fff;background-color:#d8a070;border-bottom:0;border-radius:0}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a:hover{background-color:#ddad84}.admin-wrapper .sidebar>ul>.simple-navigation-active-leaf a{border-radius:4px 0 0 4px}.admin-wrapper .content-wrapper{box-sizing:border-box;width:100%;max-width:840px;flex:1 1 auto}@media screen and (max-width: 1080px){.admin-wrapper .sidebar-wrapper--empty{display:none}.admin-wrapper .sidebar-wrapper{width:240px;flex:0 0 auto}}@media screen and (max-width: 600px){.admin-wrapper .sidebar-wrapper{width:100%}}.admin-wrapper .content{padding:20px 15px;padding-top:60px;padding-left:25px}@media screen and (max-width: 600px){.admin-wrapper .content{max-width:none;padding:15px;padding-top:30px}}.admin-wrapper .content-heading{display:flex;padding-bottom:40px;border-bottom:1px solid #202e3f;margin:-15px -15px 40px 0;flex-wrap:wrap;align-items:center;justify-content:space-between}.admin-wrapper .content-heading>*{margin-top:15px;margin-right:15px}.admin-wrapper .content-heading-actions{display:inline-flex}.admin-wrapper .content-heading-actions>:not(:first-child){margin-left:5px}@media screen and (max-width: 600px){.admin-wrapper .content-heading{border-bottom:0;padding-bottom:0}}.admin-wrapper .content h2{color:#d9e1e8;font-size:24px;line-height:28px;font-weight:400}@media screen and (max-width: 600px){.admin-wrapper .content h2{font-weight:700}}.admin-wrapper .content h3{color:#d9e1e8;font-size:20px;line-height:28px;font-weight:400;margin-bottom:30px}.admin-wrapper .content h4{text-transform:uppercase;font-size:13px;font-weight:700;color:#9baec8;padding-bottom:8px;margin-bottom:8px;border-bottom:1px solid #202e3f}.admin-wrapper .content h6{font-size:16px;color:#d9e1e8;line-height:28px;font-weight:500}.admin-wrapper .content .fields-group h6{color:#fff;font-weight:500}.admin-wrapper .content .directory__tag>a,.admin-wrapper .content .directory__tag>div{box-shadow:none}.admin-wrapper .content .directory__tag .table-action-link .fa{color:inherit}.admin-wrapper .content .directory__tag h4{font-size:18px;font-weight:700;color:#fff;text-transform:none;padding-bottom:0;margin-bottom:0;border-bottom:none}.admin-wrapper .content>p{font-size:14px;line-height:21px;color:#d9e1e8;margin-bottom:20px}.admin-wrapper .content>p strong{color:#fff;font-weight:500}.admin-wrapper .content>p strong:lang(ja){font-weight:700}.admin-wrapper .content>p strong:lang(ko){font-weight:700}.admin-wrapper .content>p strong:lang(zh-CN){font-weight:700}.admin-wrapper .content>p strong:lang(zh-HK){font-weight:700}.admin-wrapper .content>p strong:lang(zh-TW){font-weight:700}.admin-wrapper .content hr{width:100%;height:0;border:0;border-bottom:1px solid rgba(62,90,124,.6);margin:20px 0}.admin-wrapper .content hr.spacer{height:1px;border:0}@media screen and (max-width: 600px){.admin-wrapper{display:block}.admin-wrapper .sidebar-wrapper{min-height:0}.admin-wrapper .sidebar{width:100%;padding:0;height:auto}.admin-wrapper .sidebar__toggle{display:flex}.admin-wrapper .sidebar>ul{display:none}.admin-wrapper .sidebar ul a,.admin-wrapper .sidebar ul ul a{border-radius:0;border-bottom:1px solid #192432;transition:none}.admin-wrapper .sidebar ul a:hover,.admin-wrapper .sidebar ul ul a:hover{transition:none}.admin-wrapper .sidebar ul ul{border-radius:0}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a{border-bottom-color:#d8a070}}hr.spacer{width:100%;border:0;margin:20px 0;height:1px}body .muted-hint,.admin-wrapper .content .muted-hint{color:#9baec8}body .muted-hint a,.admin-wrapper .content .muted-hint a{color:#d8a070}body .positive-hint,.admin-wrapper .content .positive-hint{color:#79bd9a;font-weight:500}body .negative-hint,.admin-wrapper .content .negative-hint{color:#df405a;font-weight:500}body .neutral-hint,.admin-wrapper .content .neutral-hint{color:#3e5a7c;font-weight:500}body .warning-hint,.admin-wrapper .content .warning-hint{color:#ca8f04;font-weight:500}.filters{display:flex;flex-wrap:wrap}.filters .filter-subset{flex:0 0 auto;margin:0 40px 20px 0}.filters .filter-subset:last-child{margin-bottom:30px}.filters .filter-subset ul{margin-top:5px;list-style:none}.filters .filter-subset ul li{display:inline-block;margin-right:5px}.filters .filter-subset strong{font-weight:500;text-transform:uppercase;font-size:12px}.filters .filter-subset strong:lang(ja){font-weight:700}.filters .filter-subset strong:lang(ko){font-weight:700}.filters .filter-subset strong:lang(zh-CN){font-weight:700}.filters .filter-subset strong:lang(zh-HK){font-weight:700}.filters .filter-subset strong:lang(zh-TW){font-weight:700}.filters .filter-subset--with-select strong{display:block;margin-bottom:10px}.filters .filter-subset a{display:inline-block;color:#9baec8;text-decoration:none;text-transform:uppercase;font-size:12px;font-weight:500;border-bottom:2px solid #121a24}.filters .filter-subset a:hover{color:#fff;border-bottom:2px solid #1b2635}.filters .filter-subset a.selected{color:#d8a070;border-bottom:2px solid #d8a070}.flavour-screen{display:block;margin:10px auto;max-width:100%}.flavour-description{display:block;font-size:16px;margin:10px 0}.flavour-description>p{margin:10px 0}.report-accounts{display:flex;flex-wrap:wrap;margin-bottom:20px}.report-accounts__item{display:flex;flex:250px;flex-direction:column;margin:0 5px}.report-accounts__item>strong{display:block;margin:0 0 10px -5px;font-weight:500;font-size:14px;line-height:18px;color:#d9e1e8}.report-accounts__item>strong:lang(ja){font-weight:700}.report-accounts__item>strong:lang(ko){font-weight:700}.report-accounts__item>strong:lang(zh-CN){font-weight:700}.report-accounts__item>strong:lang(zh-HK){font-weight:700}.report-accounts__item>strong:lang(zh-TW){font-weight:700}.report-accounts__item .account-card{flex:1 1 auto}.report-status,.account-status{display:flex;margin-bottom:10px}.report-status .activity-stream,.account-status .activity-stream{flex:2 0 0;margin-right:20px;max-width:calc(100% - 60px)}.report-status .activity-stream .entry,.account-status .activity-stream .entry{border-radius:4px}.report-status__actions,.account-status__actions{flex:0 0 auto;display:flex;flex-direction:column}.report-status__actions .icon-button,.account-status__actions .icon-button{font-size:24px;width:24px;text-align:center;margin-bottom:10px}.simple_form.new_report_note,.simple_form.new_account_moderation_note{max-width:100%}.batch-form-box{display:flex;flex-wrap:wrap;margin-bottom:5px}.batch-form-box #form_status_batch_action{margin:0 5px 5px 0;font-size:14px}.batch-form-box input.button{margin:0 5px 5px 0}.batch-form-box .media-spoiler-toggle-buttons{margin-left:auto}.batch-form-box .media-spoiler-toggle-buttons .button{overflow:visible;margin:0 0 5px 5px;float:right}.back-link{margin-bottom:10px;font-size:14px}.back-link a{color:#d8a070;text-decoration:none}.back-link a:hover{text-decoration:underline}.spacer{flex:1 1 auto}.log-entry{line-height:20px;padding:15px 0;background:#121a24;border-bottom:1px solid #192432}.log-entry:last-child{border-bottom:0}.log-entry__header{display:flex;justify-content:flex-start;align-items:center;color:#9baec8;font-size:14px;padding:0 10px}.log-entry__avatar{margin-right:10px}.log-entry__avatar .avatar{display:block;margin:0;border-radius:50%;width:40px;height:40px}.log-entry__content{max-width:calc(100% - 90px)}.log-entry__title{word-wrap:break-word}.log-entry__timestamp{color:#3e5a7c}.log-entry a,.log-entry .username,.log-entry .target{color:#d9e1e8;text-decoration:none;font-weight:500}a.name-tag,.name-tag,a.inline-name-tag,.inline-name-tag{text-decoration:none;color:#d9e1e8}a.name-tag .username,.name-tag .username,a.inline-name-tag .username,.inline-name-tag .username{font-weight:500}a.name-tag.suspended .username,.name-tag.suspended .username,a.inline-name-tag.suspended .username,.inline-name-tag.suspended .username{text-decoration:line-through;color:#e87487}a.name-tag.suspended .avatar,.name-tag.suspended .avatar,a.inline-name-tag.suspended .avatar,.inline-name-tag.suspended .avatar{filter:grayscale(100%);opacity:.8}a.name-tag,.name-tag{display:flex;align-items:center}a.name-tag .avatar,.name-tag .avatar{display:block;margin:0;margin-right:5px;border-radius:50%}a.name-tag.suspended .avatar,.name-tag.suspended .avatar{filter:grayscale(100%);opacity:.8}.speech-bubble{margin-bottom:20px;border-left:4px solid #d8a070}.speech-bubble.positive{border-left-color:#79bd9a}.speech-bubble.negative{border-left-color:#e87487}.speech-bubble.warning{border-left-color:#ca8f04}.speech-bubble__bubble{padding:16px;padding-left:14px;font-size:15px;line-height:20px;border-radius:4px 4px 4px 0;position:relative;font-weight:500}.speech-bubble__bubble a{color:#9baec8}.speech-bubble__owner{padding:8px;padding-left:12px}.speech-bubble time{color:#3e5a7c}.report-card{background:#121a24;border-radius:4px;margin-bottom:20px}.report-card__profile{display:flex;justify-content:space-between;align-items:center;padding:15px}.report-card__profile .account{padding:0;border:0}.report-card__profile .account__avatar-wrapper{margin-left:0}.report-card__profile__stats{flex:0 0 auto;font-weight:500;color:#9baec8;text-transform:uppercase;text-align:right}.report-card__profile__stats a{color:inherit;text-decoration:none}.report-card__profile__stats a:focus,.report-card__profile__stats a:hover,.report-card__profile__stats a:active{color:#b5c3d6}.report-card__profile__stats .red{color:#df405a}.report-card__summary__item{display:flex;justify-content:flex-start;border-top:1px solid #0b1016}.report-card__summary__item:hover{background:#151f2b}.report-card__summary__item__reported-by,.report-card__summary__item__assigned{padding:15px;flex:0 0 auto;box-sizing:border-box;width:150px;color:#9baec8}.report-card__summary__item__reported-by,.report-card__summary__item__reported-by .username,.report-card__summary__item__assigned,.report-card__summary__item__assigned .username{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.report-card__summary__item__content{flex:1 1 auto;max-width:calc(100% - 300px)}.report-card__summary__item__content__icon{color:#3e5a7c;margin-right:4px;font-weight:500}.report-card__summary__item__content a{display:block;box-sizing:border-box;width:100%;padding:15px;text-decoration:none;color:#9baec8}.one-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ellipsized-ip{display:inline-block;max-width:120px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.admin-account-bio{display:flex;flex-wrap:wrap;margin:0 -5px;margin-top:20px}.admin-account-bio>div{box-sizing:border-box;padding:0 5px;margin-bottom:10px;flex:1 0 50%}.admin-account-bio .account__header__fields,.admin-account-bio .account__header__content{background:#202e3f;border-radius:4px;height:100%}.admin-account-bio .account__header__fields{margin:0;border:0}.admin-account-bio .account__header__fields a{color:#e1b590}.admin-account-bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.admin-account-bio .account__header__fields .verified a{color:#79bd9a}.admin-account-bio .account__header__content{box-sizing:border-box;padding:20px;color:#fff}.center-text{text-align:center}.announcements-list{border:1px solid #192432;border-radius:4px}.announcements-list__item{padding:15px 0;background:#121a24;border-bottom:1px solid #192432}.announcements-list__item__title{padding:0 15px;display:block;font-weight:500;font-size:18px;line-height:1.5;color:#d9e1e8;text-decoration:none;margin-bottom:10px}.announcements-list__item__title:hover,.announcements-list__item__title:focus,.announcements-list__item__title:active{color:#fff}.announcements-list__item__meta{padding:0 15px;color:#3e5a7c}.announcements-list__item__action-bar{display:flex;justify-content:space-between;align-items:center}.announcements-list__item:last-child{border-bottom:0}.emojione[title=\":wavy_dash:\"],.emojione[title=\":waving_black_flag:\"],.emojione[title=\":water_buffalo:\"],.emojione[title=\":video_game:\"],.emojione[title=\":video_camera:\"],.emojione[title=\":vhs:\"],.emojione[title=\":turkey:\"],.emojione[title=\":tophat:\"],.emojione[title=\":top:\"],.emojione[title=\":tm:\"],.emojione[title=\":telephone_receiver:\"],.emojione[title=\":spider:\"],.emojione[title=\":speaking_head_in_silhouette:\"],.emojione[title=\":spades:\"],.emojione[title=\":soon:\"],.emojione[title=\":registered:\"],.emojione[title=\":on:\"],.emojione[title=\":musical_score:\"],.emojione[title=\":movie_camera:\"],.emojione[title=\":mortar_board:\"],.emojione[title=\":microphone:\"],.emojione[title=\":male-guard:\"],.emojione[title=\":lower_left_fountain_pen:\"],.emojione[title=\":lower_left_ballpoint_pen:\"],.emojione[title=\":kaaba:\"],.emojione[title=\":joystick:\"],.emojione[title=\":hole:\"],.emojione[title=\":hocho:\"],.emojione[title=\":heavy_plus_sign:\"],.emojione[title=\":heavy_multiplication_x:\"],.emojione[title=\":heavy_minus_sign:\"],.emojione[title=\":heavy_dollar_sign:\"],.emojione[title=\":heavy_division_sign:\"],.emojione[title=\":heavy_check_mark:\"],.emojione[title=\":guardsman:\"],.emojione[title=\":gorilla:\"],.emojione[title=\":fried_egg:\"],.emojione[title=\":film_projector:\"],.emojione[title=\":female-guard:\"],.emojione[title=\":end:\"],.emojione[title=\":electric_plug:\"],.emojione[title=\":eight_pointed_black_star:\"],.emojione[title=\":dark_sunglasses:\"],.emojione[title=\":currency_exchange:\"],.emojione[title=\":curly_loop:\"],.emojione[title=\":copyright:\"],.emojione[title=\":clubs:\"],.emojione[title=\":camera_with_flash:\"],.emojione[title=\":camera:\"],.emojione[title=\":busts_in_silhouette:\"],.emojione[title=\":bust_in_silhouette:\"],.emojione[title=\":bowling:\"],.emojione[title=\":bomb:\"],.emojione[title=\":black_small_square:\"],.emojione[title=\":black_nib:\"],.emojione[title=\":black_medium_square:\"],.emojione[title=\":black_medium_small_square:\"],.emojione[title=\":black_large_square:\"],.emojione[title=\":black_heart:\"],.emojione[title=\":black_circle:\"],.emojione[title=\":back:\"],.emojione[title=\":ant:\"],.emojione[title=\":8ball:\"]{filter:drop-shadow(1px 1px 0 #ffffff) drop-shadow(-1px 1px 0 #ffffff) drop-shadow(1px -1px 0 #ffffff) drop-shadow(-1px -1px 0 #ffffff)}.hicolor-privacy-icons .status__visibility-icon.fa-globe,.hicolor-privacy-icons .composer--options--dropdown--content--item .fa-globe{color:#1976d2}.hicolor-privacy-icons .status__visibility-icon.fa-unlock,.hicolor-privacy-icons .composer--options--dropdown--content--item .fa-unlock{color:#388e3c}.hicolor-privacy-icons .status__visibility-icon.fa-lock,.hicolor-privacy-icons .composer--options--dropdown--content--item .fa-lock{color:#ffa000}.hicolor-privacy-icons .status__visibility-icon.fa-envelope,.hicolor-privacy-icons .composer--options--dropdown--content--item .fa-envelope{color:#d32f2f}body.rtl{direction:rtl}body.rtl .column-header>button{text-align:right;padding-left:0;padding-right:15px}body.rtl .radio-button__input{margin-right:0;margin-left:10px}body.rtl .directory__card__bar .display-name{margin-left:0;margin-right:15px}body.rtl .display-name{text-align:right}body.rtl .notification__message{margin-left:0;margin-right:68px}body.rtl .drawer__inner__mastodon>img{transform:scaleX(-1)}body.rtl .notification__favourite-icon-wrapper{left:auto;right:-26px}body.rtl .landing-page__logo{margin-right:0;margin-left:20px}body.rtl .landing-page .features-list .features-list__row .visual{margin-left:0;margin-right:15px}body.rtl .column-link__icon,body.rtl .column-header__icon{margin-right:0;margin-left:5px}body.rtl .compose-form .compose-form__buttons-wrapper .character-counter__wrapper{margin-right:0;margin-left:4px}body.rtl .composer--publisher{text-align:left}body.rtl .boost-modal__status-time,body.rtl .favourite-modal__status-time{float:left}body.rtl .navigation-bar__profile{margin-left:0;margin-right:8px}body.rtl .search__input{padding-right:10px;padding-left:30px}body.rtl .search__icon .fa{right:auto;left:10px}body.rtl .columns-area{direction:rtl}body.rtl .column-header__buttons{left:0;right:auto;margin-left:0;margin-right:-15px}body.rtl .column-inline-form .icon-button{margin-left:0;margin-right:5px}body.rtl .column-header__links .text-btn{margin-left:10px;margin-right:0}body.rtl .account__avatar-wrapper{float:right}body.rtl .column-header__back-button{padding-left:5px;padding-right:0}body.rtl .column-header__setting-arrows{float:left}body.rtl .setting-toggle__label{margin-left:0;margin-right:8px}body.rtl .setting-meta__label{float:left}body.rtl .status__avatar{margin-left:10px;margin-right:0;left:auto;right:10px}body.rtl .activity-stream .status.light{padding-left:10px;padding-right:68px}body.rtl .status__info .status__display-name,body.rtl .activity-stream .status.light .status__display-name{padding-left:25px;padding-right:0}body.rtl .activity-stream .pre-header{padding-right:68px;padding-left:0}body.rtl .status__prepend{margin-left:0;margin-right:58px}body.rtl .status__prepend-icon-wrapper{left:auto;right:-26px}body.rtl .activity-stream .pre-header .pre-header__icon{left:auto;right:42px}body.rtl .account__avatar-overlay-overlay{right:auto;left:0}body.rtl .column-back-button--slim-button{right:auto;left:0}body.rtl .status__relative-time,body.rtl .activity-stream .status.light .status__header .status__meta{float:left;text-align:left}body.rtl .status__action-bar__counter{margin-right:0;margin-left:11px}body.rtl .status__action-bar__counter .status__action-bar-button{margin-right:0;margin-left:4px}body.rtl .status__action-bar-button{float:right;margin-right:0;margin-left:18px}body.rtl .status__action-bar-dropdown{float:right}body.rtl .privacy-dropdown__dropdown{margin-left:0;margin-right:40px}body.rtl .privacy-dropdown__option__icon{margin-left:10px;margin-right:0}body.rtl .detailed-status__display-name .display-name{text-align:right}body.rtl .detailed-status__display-avatar{margin-right:0;margin-left:10px;float:right}body.rtl .detailed-status__favorites,body.rtl .detailed-status__reblogs{margin-left:0;margin-right:6px}body.rtl .fa-ul{margin-left:2.14285714em}body.rtl .fa-li{left:auto;right:-2.14285714em}body.rtl .admin-wrapper{direction:rtl}body.rtl .admin-wrapper .sidebar ul a i.fa,body.rtl a.table-action-link i.fa{margin-right:0;margin-left:5px}body.rtl .simple_form .check_boxes .checkbox label{padding-left:0;padding-right:25px}body.rtl .simple_form .input.with_label.boolean label.checkbox{padding-left:25px;padding-right:0}body.rtl .simple_form .check_boxes .checkbox input[type=checkbox],body.rtl .simple_form .input.boolean input[type=checkbox]{left:auto;right:0}body.rtl .simple_form .input.radio_buttons .radio{left:auto;right:0}body.rtl .simple_form .input.radio_buttons .radio>label{padding-right:28px;padding-left:0}body.rtl .simple_form .input-with-append .input input{padding-left:142px;padding-right:0}body.rtl .simple_form .input.boolean label.checkbox{left:auto;right:0}body.rtl .simple_form .input.boolean .label_input,body.rtl .simple_form .input.boolean .hint{padding-left:0;padding-right:28px}body.rtl .simple_form .label_input__append{right:auto;left:3px}body.rtl .simple_form .label_input__append::after{right:auto;left:0;background-image:linear-gradient(to left, rgba(1, 1, 2, 0), #010102)}body.rtl .simple_form select{background:#010102 url(\"data:image/svg+xml;utf8,\") no-repeat left 8px center/auto 16px}body.rtl .table th,body.rtl .table td{text-align:right}body.rtl .filters .filter-subset{margin-right:0;margin-left:45px}body.rtl .landing-page .header-wrapper .mascot{right:60px;left:auto}body.rtl .landing-page__call-to-action .row__information-board{direction:rtl}body.rtl .landing-page .header .hero .floats .float-1{left:-120px;right:auto}body.rtl .landing-page .header .hero .floats .float-2{left:210px;right:auto}body.rtl .landing-page .header .hero .floats .float-3{left:110px;right:auto}body.rtl .landing-page .header .links .brand img{left:0}body.rtl .landing-page .fa-external-link{padding-right:5px;padding-left:0 !important}body.rtl .landing-page .features #mastodon-timeline{margin-right:0;margin-left:30px}@media screen and (min-width: 631px){body.rtl .column,body.rtl .drawer{padding-left:5px;padding-right:5px}body.rtl .column:first-child,body.rtl .drawer:first-child{padding-left:5px;padding-right:10px}body.rtl .columns-area>div .column,body.rtl .columns-area>div .drawer{padding-left:5px;padding-right:5px}}body.rtl .columns-area--mobile .column,body.rtl .columns-area--mobile .drawer{padding-left:0;padding-right:0}body.rtl .public-layout .header .nav-button{margin-left:8px;margin-right:0}body.rtl .public-layout .public-account-header__tabs{margin-left:0;margin-right:20px}body.rtl .landing-page__information .account__display-name{margin-right:0;margin-left:5px}body.rtl .landing-page__information .account__avatar-wrapper{margin-left:12px;margin-right:0}body.rtl .card__bar .display-name{margin-left:0;margin-right:15px;text-align:right}body.rtl .fa-chevron-left::before{content:\"\"}body.rtl .fa-chevron-right::before{content:\"\"}body.rtl .column-back-button__icon{margin-right:0;margin-left:5px}body.rtl .column-header__setting-arrows .column-header__setting-btn:last-child{padding-left:0;padding-right:10px}body.rtl .simple_form .input.radio_buttons .radio>label input{left:auto;right:0}.dashboard__counters{display:flex;flex-wrap:wrap;margin:0 -5px;margin-bottom:20px}.dashboard__counters>div{box-sizing:border-box;flex:0 0 33.333%;padding:0 5px;margin-bottom:10px}.dashboard__counters>div>div,.dashboard__counters>div>a{padding:20px;background:#192432;border-radius:4px;box-sizing:border-box;height:100%}.dashboard__counters>div>a{text-decoration:none;color:inherit;display:block}.dashboard__counters>div>a:hover,.dashboard__counters>div>a:focus,.dashboard__counters>div>a:active{background:#202e3f}.dashboard__counters__num,.dashboard__counters__text{text-align:center;font-weight:500;font-size:24px;line-height:21px;color:#fff;font-family:sans-serif,sans-serif;margin-bottom:20px;line-height:30px}.dashboard__counters__text{font-size:18px}.dashboard__counters__label{font-size:14px;color:#9baec8;text-align:center;font-weight:500}.dashboard__widgets{display:flex;flex-wrap:wrap;margin:0 -5px}.dashboard__widgets>div{flex:0 0 33.333%;margin-bottom:20px}.dashboard__widgets>div>div{padding:0 5px}.dashboard__widgets a:not(.name-tag){color:#d9e1e8;font-weight:500;text-decoration:none}","/* http://meyerweb.com/eric/tools/css/reset/\n v2.0 | 20110126\n License: none (public domain)\n*/\n\nhtml, body, div, span, applet, object, iframe,\nh1, h2, h3, h4, h5, h6, p, blockquote, pre,\na, abbr, acronym, address, big, cite, code,\ndel, dfn, em, img, ins, kbd, q, s, samp,\nsmall, strike, strong, sub, sup, tt, var,\nb, u, i, center,\ndl, dt, dd, ol, ul, li,\nfieldset, form, label, legend,\ntable, caption, tbody, tfoot, thead, tr, th, td,\narticle, aside, canvas, details, embed,\nfigure, figcaption, footer, header, hgroup,\nmenu, nav, output, ruby, section, summary,\ntime, mark, audio, video {\n margin: 0;\n padding: 0;\n border: 0;\n font-size: 100%;\n font: inherit;\n vertical-align: baseline;\n}\n\n/* HTML5 display-role reset for older browsers */\narticle, aside, details, figcaption, figure,\nfooter, header, hgroup, menu, nav, section {\n display: block;\n}\n\nbody {\n line-height: 1;\n}\n\nol, ul {\n list-style: none;\n}\n\nblockquote, q {\n quotes: none;\n}\n\nblockquote:before, blockquote:after,\nq:before, q:after {\n content: '';\n content: none;\n}\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\nhtml {\n scrollbar-color: lighten($ui-base-color, 4%) rgba($base-overlay-background, 0.1);\n}\n\n::-webkit-scrollbar {\n width: 12px;\n height: 12px;\n}\n\n::-webkit-scrollbar-thumb {\n background: lighten($ui-base-color, 4%);\n border: 0px none $base-border-color;\n border-radius: 50px;\n}\n\n::-webkit-scrollbar-thumb:hover {\n background: lighten($ui-base-color, 6%);\n}\n\n::-webkit-scrollbar-thumb:active {\n background: lighten($ui-base-color, 4%);\n}\n\n::-webkit-scrollbar-track {\n border: 0px none $base-border-color;\n border-radius: 0;\n background: rgba($base-overlay-background, 0.1);\n}\n\n::-webkit-scrollbar-track:hover {\n background: $ui-base-color;\n}\n\n::-webkit-scrollbar-track:active {\n background: $ui-base-color;\n}\n\n::-webkit-scrollbar-corner {\n background: transparent;\n}\n","// Commonly used web colors\n$black: #000000; // Black\n$white: #ffffff; // White\n$success-green: #79bd9a; // Padua\n$error-red: #df405a; // Cerise\n$warning-red: #ff5050; // Sunset Orange\n$gold-star: #ca8f04; // Dark Goldenrod\n\n$red-bookmark: $warning-red;\n\n// Pleroma-Dark colors\n$pleroma-bg: #121a24;\n$pleroma-fg: #182230;\n$pleroma-text: #b9b9ba;\n$pleroma-links: #d8a070;\n\n// Values from the classic Mastodon UI\n$classic-base-color: $pleroma-bg;\n$classic-primary-color: #9baec8;\n$classic-secondary-color: #d9e1e8;\n$classic-highlight-color: #d8a070;\n\n// Variables for defaults in UI\n$base-shadow-color: $black !default;\n$base-overlay-background: $black !default;\n$base-border-color: $white !default;\n$simple-background-color: $white !default;\n$valid-value-color: $success-green !default;\n$error-value-color: $error-red !default;\n\n// Tell UI to use selected colors\n$ui-base-color: $classic-base-color !default; // Darkest\n$ui-base-lighter-color: lighten($ui-base-color, 26%) !default; // Lighter darkest\n$ui-primary-color: $classic-primary-color !default; // Lighter\n$ui-secondary-color: $classic-secondary-color !default; // Lightest\n$ui-highlight-color: $classic-highlight-color !default;\n\n// Variables for texts\n$primary-text-color: $white !default;\n$darker-text-color: $ui-primary-color !default;\n$dark-text-color: $ui-base-lighter-color !default;\n$secondary-text-color: $ui-secondary-color !default;\n$highlight-text-color: $ui-highlight-color !default;\n$action-button-color: $ui-base-lighter-color !default;\n// For texts on inverted backgrounds\n$inverted-text-color: $ui-base-color !default;\n$lighter-text-color: $ui-base-lighter-color !default;\n$light-text-color: $ui-primary-color !default;\n\n// Language codes that uses CJK fonts\n$cjk-langs: ja, ko, zh-CN, zh-HK, zh-TW;\n\n// Variables for components\n$media-modal-media-max-width: 100%;\n// put margins on top and bottom of image to avoid the screen covered by image.\n$media-modal-media-max-height: 80%;\n\n$no-gap-breakpoint: 415px;\n\n$font-sans-serif: sans-serif !default;\n$font-display: sans-serif !default;\n$font-monospace: monospace !default;\n\n// Avatar border size (8% default, 100% for rounded avatars)\n$ui-avatar-border-size: 8%;\n\n// More variables\n$dismiss-overlay-width: 4rem;\n","@function hex-color($color) {\n @if type-of($color) == 'color' {\n $color: str-slice(ie-hex-str($color), 4);\n }\n @return '%23' + unquote($color)\n}\n\nbody {\n font-family: $font-sans-serif, sans-serif;\n background: darken($ui-base-color, 7%);\n font-size: 13px;\n line-height: 18px;\n font-weight: 400;\n color: $primary-text-color;\n text-rendering: optimizelegibility;\n font-feature-settings: \"kern\";\n text-size-adjust: none;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n -webkit-tap-highlight-color: transparent;\n\n &.system-font {\n // system-ui => standard property (Chrome/Android WebView 56+, Opera 43+, Safari 11+)\n // -apple-system => Safari <11 specific\n // BlinkMacSystemFont => Chrome <56 on macOS specific\n // Segoe UI => Windows 7/8/10\n // Oxygen => KDE\n // Ubuntu => Unity/Ubuntu\n // Cantarell => GNOME\n // Fira Sans => Firefox OS\n // Droid Sans => Older Androids (<4.0)\n // Helvetica Neue => Older macOS <10.11\n // $font-sans-serif => web-font (Roboto) fallback and newer Androids (>=4.0)\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Oxygen\", \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", $font-sans-serif, sans-serif;\n }\n\n &.app-body {\n padding: 0;\n\n &.layout-single-column {\n height: auto;\n min-height: 100vh;\n overflow-y: scroll;\n }\n\n &.layout-multiple-columns {\n position: absolute;\n width: 100%;\n height: 100%;\n }\n\n &.with-modals--active {\n overflow-y: hidden;\n }\n }\n\n &.lighter {\n background: $ui-base-color;\n }\n\n &.with-modals {\n overflow-x: hidden;\n overflow-y: scroll;\n\n &--active {\n overflow-y: hidden;\n }\n }\n\n &.embed {\n background: lighten($ui-base-color, 4%);\n margin: 0;\n padding-bottom: 0;\n\n .container {\n position: absolute;\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n }\n\n &.admin {\n background: darken($ui-base-color, 4%);\n padding: 0;\n }\n\n &.error {\n position: absolute;\n text-align: center;\n color: $darker-text-color;\n background: $ui-base-color;\n width: 100%;\n height: 100%;\n padding: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n\n .dialog {\n vertical-align: middle;\n margin: 20px;\n\n img {\n display: block;\n max-width: 470px;\n width: 100%;\n height: auto;\n margin-top: -120px;\n }\n\n h1 {\n font-size: 20px;\n line-height: 28px;\n font-weight: 400;\n }\n }\n }\n}\n\nbutton {\n font-family: inherit;\n cursor: pointer;\n\n &:focus {\n outline: none;\n }\n}\n\n.app-holder {\n &,\n & > div {\n display: flex;\n width: 100%;\n align-items: center;\n justify-content: center;\n outline: 0 !important;\n }\n}\n\n.layout-single-column .app-holder {\n &,\n & > div {\n min-height: 100vh;\n }\n}\n\n.layout-multiple-columns .app-holder {\n &,\n & > div {\n height: 100%;\n }\n}\n",".container-alt {\n width: 700px;\n margin: 0 auto;\n margin-top: 40px;\n\n @media screen and (max-width: 740px) {\n width: 100%;\n margin: 0;\n }\n}\n\n.logo-container {\n margin: 100px auto 50px;\n\n @media screen and (max-width: 500px) {\n margin: 40px auto 0;\n }\n\n h1 {\n display: flex;\n justify-content: center;\n align-items: center;\n\n svg {\n fill: $primary-text-color;\n height: 42px;\n margin-right: 10px;\n }\n\n a {\n display: flex;\n justify-content: center;\n align-items: center;\n color: $primary-text-color;\n text-decoration: none;\n outline: 0;\n padding: 12px 16px;\n line-height: 32px;\n font-family: $font-display, sans-serif;\n font-weight: 500;\n font-size: 14px;\n }\n }\n}\n\n.compose-standalone {\n .compose-form {\n width: 400px;\n margin: 0 auto;\n padding: 20px 0;\n margin-top: 40px;\n box-sizing: border-box;\n\n @media screen and (max-width: 400px) {\n width: 100%;\n margin-top: 0;\n padding: 20px;\n }\n }\n}\n\n.account-header {\n width: 400px;\n margin: 0 auto;\n display: flex;\n font-size: 13px;\n line-height: 18px;\n box-sizing: border-box;\n padding: 20px 0;\n padding-bottom: 0;\n margin-bottom: -30px;\n margin-top: 40px;\n\n @media screen and (max-width: 440px) {\n width: 100%;\n margin: 0;\n margin-bottom: 10px;\n padding: 20px;\n padding-bottom: 0;\n }\n\n .avatar {\n width: 40px;\n height: 40px;\n @include avatar-size(40px);\n margin-right: 8px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n @include avatar-radius();\n }\n }\n\n .name {\n flex: 1 1 auto;\n color: $secondary-text-color;\n width: calc(100% - 88px);\n\n .username {\n display: block;\n font-weight: 500;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n }\n\n .logout-link {\n display: block;\n font-size: 32px;\n line-height: 40px;\n margin-left: 8px;\n }\n}\n\n.grid-3 {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: 3fr 1fr;\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-column: 1/3;\n grid-row: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 2;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1/3;\n grid-row: 3;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n grid-template-columns: minmax(0, 100%);\n\n .column-0 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .column-2 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1;\n grid-row: 4;\n }\n }\n}\n\n.grid-4 {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: repeat(4, minmax(0, 1fr));\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-column: 1 / 5;\n grid-row: 1;\n }\n\n .column-1 {\n grid-column: 1 / 4;\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 4;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 2 / 5;\n grid-row: 3;\n }\n\n .column-4 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .landing-page__call-to-action {\n min-height: 100%;\n }\n\n .flash-message {\n margin-bottom: 10px;\n }\n\n @media screen and (max-width: 738px) {\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n .landing-page__call-to-action {\n padding: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .row__information-board {\n width: 100%;\n justify-content: center;\n align-items: center;\n }\n\n .row__mascot {\n display: none;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n grid-template-columns: minmax(0, 100%);\n\n .column-0 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .column-2 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1;\n grid-row: 5;\n }\n\n .column-4 {\n grid-column: 1;\n grid-row: 4;\n }\n }\n}\n\n.public-layout {\n @media screen and (max-width: $no-gap-breakpoint) {\n padding-top: 48px;\n }\n\n .container {\n max-width: 960px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding: 0;\n }\n }\n\n .header {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n height: 48px;\n margin: 10px 0;\n display: flex;\n align-items: stretch;\n justify-content: center;\n flex-wrap: nowrap;\n overflow: hidden;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n position: fixed;\n width: 100%;\n top: 0;\n left: 0;\n margin: 0;\n border-radius: 0;\n box-shadow: none;\n z-index: 110;\n }\n\n & > div {\n flex: 1 1 33.3%;\n min-height: 1px;\n }\n\n .nav-left {\n display: flex;\n align-items: stretch;\n justify-content: flex-start;\n flex-wrap: nowrap;\n }\n\n .nav-center {\n display: flex;\n align-items: stretch;\n justify-content: center;\n flex-wrap: nowrap;\n }\n\n .nav-right {\n display: flex;\n align-items: stretch;\n justify-content: flex-end;\n flex-wrap: nowrap;\n }\n\n .brand {\n display: block;\n padding: 15px;\n\n svg {\n display: block;\n height: 18px;\n width: auto;\n position: relative;\n bottom: -2px;\n fill: $primary-text-color;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n height: 20px;\n }\n }\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 12%);\n }\n }\n\n .nav-link {\n display: flex;\n align-items: center;\n padding: 0 1rem;\n font-size: 12px;\n font-weight: 500;\n text-decoration: none;\n color: $darker-text-color;\n white-space: nowrap;\n text-align: center;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n color: $primary-text-color;\n }\n\n @media screen and (max-width: 550px) {\n &.optional {\n display: none;\n }\n }\n }\n\n .nav-button {\n background: lighten($ui-base-color, 16%);\n margin: 8px;\n margin-left: 0;\n border-radius: 4px;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n background: lighten($ui-base-color, 20%);\n }\n }\n }\n\n $no-columns-breakpoint: 600px;\n\n .grid {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(300px, 3fr) minmax(298px, 1fr);\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-row: 1;\n grid-column: 1;\n }\n\n .column-1 {\n grid-row: 1;\n grid-column: 2;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n grid-template-columns: 100%;\n grid-gap: 0;\n\n .column-1 {\n display: none;\n }\n }\n }\n\n .directory__card {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n\n .page-header {\n @media screen and (max-width: $no-gap-breakpoint) {\n border-bottom: 0;\n }\n }\n\n .public-account-header {\n overflow: hidden;\n margin-bottom: 10px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &.inactive {\n opacity: 0.5;\n\n .public-account-header__image,\n .avatar {\n filter: grayscale(100%);\n }\n\n .logo-button {\n background-color: $secondary-text-color;\n }\n }\n\n &__image {\n border-radius: 4px 4px 0 0;\n overflow: hidden;\n height: 300px;\n position: relative;\n background: darken($ui-base-color, 12%);\n\n &::after {\n content: \"\";\n display: block;\n position: absolute;\n width: 100%;\n height: 100%;\n box-shadow: inset 0 -1px 1px 1px rgba($base-shadow-color, 0.15);\n top: 0;\n left: 0;\n }\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 4px 4px 0 0;\n }\n\n @media screen and (max-width: 600px) {\n height: 200px;\n }\n }\n\n &--no-bar {\n margin-bottom: 0;\n\n .public-account-header__image,\n .public-account-header__image img {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n box-shadow: none;\n\n &__image::after {\n display: none;\n }\n\n &__image,\n &__image img {\n border-radius: 0;\n }\n }\n\n &__bar {\n position: relative;\n margin-top: -80px;\n display: flex;\n justify-content: flex-start;\n\n &::before {\n content: \"\";\n display: block;\n background: lighten($ui-base-color, 4%);\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: 60px;\n border-radius: 0 0 4px 4px;\n z-index: -1;\n }\n\n .avatar {\n display: block;\n width: 120px;\n height: 120px;\n @include avatar-size(120px);\n padding-left: 20px - 4px;\n flex: 0 0 auto;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 50%;\n border: 4px solid lighten($ui-base-color, 4%);\n background: darken($ui-base-color, 8%);\n @include avatar-radius();\n }\n }\n\n @media screen and (max-width: 600px) {\n margin-top: 0;\n background: lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n padding: 5px;\n\n &::before {\n display: none;\n }\n\n .avatar {\n width: 48px;\n height: 48px;\n @include avatar-size(48px);\n padding: 7px 0;\n padding-left: 10px;\n\n img {\n border: 0;\n border-radius: 4px;\n @include avatar-radius();\n }\n\n @media screen and (max-width: 360px) {\n display: none;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n flex-wrap: wrap;\n }\n }\n\n &__tabs {\n flex: 1 1 auto;\n margin-left: 20px;\n\n &__name {\n padding-top: 20px;\n padding-bottom: 8px;\n\n h1 {\n font-size: 20px;\n line-height: 18px * 1.5;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n text-shadow: 1px 1px 1px $base-shadow-color;\n\n small {\n display: block;\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n @media screen and (max-width: 600px) {\n margin-left: 15px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n &__name {\n padding-top: 0;\n padding-bottom: 0;\n\n h1 {\n font-size: 16px;\n line-height: 24px;\n text-shadow: none;\n\n small {\n color: $darker-text-color;\n }\n }\n }\n }\n\n &__tabs {\n display: flex;\n justify-content: flex-start;\n align-items: stretch;\n height: 58px;\n\n .details-counters {\n display: flex;\n flex-direction: row;\n min-width: 300px;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n .details-counters {\n display: none;\n }\n }\n\n .counter {\n min-width: 33.3%;\n box-sizing: border-box;\n flex: 0 0 auto;\n color: $darker-text-color;\n padding: 10px;\n border-right: 1px solid lighten($ui-base-color, 4%);\n cursor: default;\n text-align: center;\n position: relative;\n\n a {\n display: block;\n }\n\n &:last-child {\n border-right: 0;\n }\n\n &::after {\n display: block;\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n border-bottom: 4px solid $ui-primary-color;\n opacity: 0.5;\n transition: all 400ms ease;\n }\n\n &.active {\n &::after {\n border-bottom: 4px solid $highlight-text-color;\n opacity: 1;\n }\n\n &.inactive::after {\n border-bottom-color: $secondary-text-color;\n }\n }\n\n &:hover {\n &::after {\n opacity: 1;\n transition-duration: 100ms;\n }\n }\n\n a {\n text-decoration: none;\n color: inherit;\n }\n\n .counter-label {\n font-size: 12px;\n display: block;\n }\n\n .counter-number {\n font-weight: 500;\n font-size: 18px;\n margin-bottom: 5px;\n color: $primary-text-color;\n font-family: $font-display, sans-serif;\n }\n }\n\n .spacer {\n flex: 1 1 auto;\n height: 1px;\n }\n\n &__buttons {\n padding: 7px 8px;\n }\n }\n }\n\n &__extra {\n display: none;\n margin-top: 4px;\n\n .public-account-bio {\n border-radius: 0;\n box-shadow: none;\n background: transparent;\n margin: 0 -5px;\n\n .account__header__fields {\n border-top: 1px solid lighten($ui-base-color, 12%);\n }\n\n .roles {\n display: none;\n }\n }\n\n &__links {\n margin-top: -15px;\n font-size: 14px;\n color: $darker-text-color;\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n padding: 15px;\n font-weight: 500;\n\n strong {\n font-weight: 700;\n color: $primary-text-color;\n }\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n flex: 100%;\n }\n }\n }\n\n .account__section-headline {\n border-radius: 4px 4px 0 0;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n\n .detailed-status__meta {\n margin-top: 25px;\n }\n\n .public-account-bio {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n overflow: hidden;\n margin-bottom: 10px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n box-shadow: none;\n margin-bottom: 0;\n border-radius: 0;\n }\n\n .account__header__fields {\n margin: 0;\n border-top: 0;\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n\n .account__header__content {\n padding: 20px;\n padding-bottom: 0;\n color: $primary-text-color;\n }\n\n &__extra,\n .roles {\n padding: 20px;\n font-size: 14px;\n color: $darker-text-color;\n }\n\n .roles {\n padding-bottom: 0;\n }\n }\n\n .directory__list {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: block;\n }\n\n .icon-button {\n font-size: 18px;\n }\n }\n\n .directory__card {\n margin-bottom: 0;\n }\n\n .card-grid {\n display: flex;\n flex-wrap: wrap;\n min-width: 100%;\n margin: 0 -5px;\n\n & > div {\n box-sizing: border-box;\n flex: 1 0 auto;\n width: 300px;\n padding: 0 5px;\n margin-bottom: 10px;\n max-width: 33.333%;\n\n @media screen and (max-width: 900px) {\n max-width: 50%;\n }\n\n @media screen and (max-width: 600px) {\n max-width: 100%;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin: 0;\n border-top: 1px solid lighten($ui-base-color, 8%);\n\n & > div {\n width: 100%;\n padding: 0;\n margin-bottom: 0;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &:last-child {\n border-bottom: 0;\n }\n\n .card__bar {\n background: $ui-base-color;\n\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n }\n }\n }\n }\n}\n","@mixin avatar-radius() {\n border-radius: $ui-avatar-border-size;\n background-position: 50%;\n background-clip: padding-box;\n}\n\n@mixin avatar-size($size:48px) {\n width: $size;\n height: $size;\n background-size: $size $size;\n}\n\n@mixin single-column($media, $parent: '&') {\n .auto-columns #{$parent} {\n @media #{$media} {\n @content;\n }\n }\n .single-column #{$parent} {\n @content;\n }\n}\n\n@mixin limited-single-column($media, $parent: '&') {\n .auto-columns #{$parent}, .single-column #{$parent} {\n @media #{$media} {\n @content;\n }\n }\n}\n\n@mixin multi-columns($media, $parent: '&') {\n .auto-columns #{$parent} {\n @media #{$media} {\n @content;\n }\n }\n .multi-columns #{$parent} {\n @content;\n }\n}\n\n@mixin fullwidth-gallery {\n &.full-width {\n margin-left: -14px;\n margin-right: -14px;\n width: inherit;\n max-width: none;\n height: 250px;\n border-radius: 0px;\n }\n}\n\n@mixin search-input() {\n outline: 0;\n box-sizing: border-box;\n width: 100%;\n border: none;\n box-shadow: none;\n font-family: inherit;\n background: $ui-base-color;\n color: $darker-text-color;\n font-size: 14px;\n margin: 0;\n}\n\n@mixin search-popout() {\n background: $simple-background-color;\n border-radius: 4px;\n padding: 10px 14px;\n padding-bottom: 14px;\n margin-top: 10px;\n color: $light-text-color;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n\n h4 {\n text-transform: uppercase;\n color: $light-text-color;\n font-size: 13px;\n font-weight: 500;\n margin-bottom: 10px;\n }\n\n li {\n padding: 4px 0;\n }\n\n ul {\n margin-bottom: 10px;\n }\n\n em {\n font-weight: 500;\n color: $inverted-text-color;\n }\n}\n",".no-list {\n list-style: none;\n\n li {\n display: inline-block;\n margin: 0 5px;\n }\n}\n\n.recovery-codes {\n list-style: none;\n margin: 0 auto;\n\n li {\n font-size: 125%;\n line-height: 1.5;\n letter-spacing: 1px;\n }\n}\n",".modal-layout {\n background: $ui-base-color url('data:image/svg+xml;utf8,') repeat-x bottom fixed;\n display: flex;\n flex-direction: column;\n height: 100vh;\n padding: 0;\n}\n\n.modal-layout__mastodon {\n display: flex;\n flex: 1;\n flex-direction: column;\n justify-content: flex-end;\n\n > * {\n flex: 1;\n max-height: 235px;\n }\n}\n\n@media screen and (max-width: 600px) {\n .account-header {\n margin-top: 0;\n }\n}\n",".public-layout {\n .footer {\n text-align: left;\n padding-top: 20px;\n padding-bottom: 60px;\n font-size: 12px;\n color: lighten($ui-base-color, 34%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding-left: 20px;\n padding-right: 20px;\n }\n\n .grid {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: 1fr 1fr 2fr 1fr 1fr;\n\n .column-0 {\n grid-column: 1;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-1 {\n grid-column: 2;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-2 {\n grid-column: 3;\n grid-row: 1;\n min-width: 0;\n text-align: center;\n\n h4 a {\n color: lighten($ui-base-color, 34%);\n }\n }\n\n .column-3 {\n grid-column: 4;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-4 {\n grid-column: 5;\n grid-row: 1;\n min-width: 0;\n }\n\n @media screen and (max-width: 690px) {\n grid-template-columns: 1fr 2fr 1fr;\n\n .column-0,\n .column-1 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 2;\n }\n\n .column-3,\n .column-4 {\n grid-column: 3;\n }\n\n .column-4 {\n grid-row: 2;\n }\n }\n\n @media screen and (max-width: 600px) {\n .column-1 {\n display: block;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n .column-0,\n .column-1,\n .column-3,\n .column-4 {\n display: none;\n }\n }\n }\n\n h4 {\n text-transform: uppercase;\n font-weight: 700;\n margin-bottom: 8px;\n color: $darker-text-color;\n\n a {\n color: inherit;\n text-decoration: none;\n }\n }\n\n ul a {\n text-decoration: none;\n color: lighten($ui-base-color, 34%);\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n\n .brand {\n svg {\n display: block;\n height: 36px;\n width: auto;\n margin: 0 auto;\n fill: lighten($ui-base-color, 34%);\n }\n\n &:hover,\n &:focus,\n &:active {\n svg {\n fill: lighten($ui-base-color, 38%);\n }\n }\n }\n }\n}\n",".compact-header {\n h1 {\n font-size: 24px;\n line-height: 28px;\n color: $darker-text-color;\n font-weight: 500;\n margin-bottom: 20px;\n padding: 0 10px;\n word-wrap: break-word;\n\n @media screen and (max-width: 740px) {\n text-align: center;\n padding: 20px 10px 0;\n }\n\n a {\n color: inherit;\n text-decoration: none;\n }\n\n small {\n font-weight: 400;\n color: $secondary-text-color;\n }\n\n img {\n display: inline-block;\n margin-bottom: -5px;\n margin-right: 15px;\n width: 36px;\n height: 36px;\n }\n }\n}\n",".hero-widget {\n margin-bottom: 10px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &__img {\n width: 100%;\n position: relative;\n overflow: hidden;\n border-radius: 4px 4px 0 0;\n background: $base-shadow-color;\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 4px 4px 0 0;\n }\n }\n\n &__text {\n background: $ui-base-color;\n padding: 20px;\n border-radius: 0 0 4px 4px;\n font-size: 15px;\n color: $darker-text-color;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n p {\n margin-bottom: 20px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n em {\n display: inline;\n margin: 0;\n padding: 0;\n font-weight: 700;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n color: lighten($darker-text-color, 10%);\n }\n\n a {\n color: $secondary-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n}\n\n.endorsements-widget {\n margin-bottom: 10px;\n padding-bottom: 10px;\n\n h4 {\n padding: 10px;\n text-transform: uppercase;\n font-weight: 700;\n font-size: 13px;\n color: $darker-text-color;\n }\n\n .account {\n padding: 10px 0;\n\n &:last-child {\n border-bottom: 0;\n }\n\n .account__display-name {\n display: flex;\n align-items: center;\n }\n\n .account__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n }\n\n .trends__item {\n padding: 10px;\n }\n}\n\n.trends-widget {\n h4 {\n color: $darker-text-color;\n }\n}\n\n.box-widget {\n padding: 20px;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n}\n\n.placeholder-widget {\n padding: 16px;\n border-radius: 4px;\n border: 2px dashed $dark-text-color;\n text-align: center;\n color: $darker-text-color;\n margin-bottom: 10px;\n}\n\n.contact-widget {\n min-height: 100%;\n font-size: 15px;\n color: $darker-text-color;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n padding: 0;\n\n h4 {\n padding: 10px;\n text-transform: uppercase;\n font-weight: 700;\n font-size: 13px;\n color: $darker-text-color;\n }\n\n .account {\n border-bottom: 0;\n padding: 10px 0;\n padding-top: 5px;\n }\n\n & > a {\n display: inline-block;\n padding: 10px;\n padding-top: 0;\n color: $darker-text-color;\n text-decoration: none;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.moved-account-widget {\n padding: 15px;\n padding-bottom: 20px;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n color: $secondary-text-color;\n font-weight: 400;\n margin-bottom: 10px;\n\n strong,\n a {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n color: inherit;\n text-decoration: underline;\n\n &.mention {\n text-decoration: none;\n\n span {\n text-decoration: none;\n }\n\n &:focus,\n &:hover,\n &:active {\n text-decoration: none;\n\n span {\n text-decoration: underline;\n }\n }\n }\n }\n\n &__message {\n margin-bottom: 15px;\n\n .fa {\n margin-right: 5px;\n color: $darker-text-color;\n }\n }\n\n &__card {\n .detailed-status__display-avatar {\n position: relative;\n cursor: pointer;\n }\n\n .detailed-status__display-name {\n margin-bottom: 0;\n text-decoration: none;\n\n span {\n font-weight: 400;\n }\n }\n }\n}\n\n.memoriam-widget {\n padding: 20px;\n border-radius: 4px;\n background: $base-shadow-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n font-size: 14px;\n color: $darker-text-color;\n margin-bottom: 10px;\n}\n\n.page-header {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n padding: 60px 15px;\n text-align: center;\n margin: 10px 0;\n\n h1 {\n color: $primary-text-color;\n font-size: 36px;\n line-height: 1.1;\n font-weight: 700;\n margin-bottom: 10px;\n }\n\n p {\n font-size: 15px;\n color: $darker-text-color;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-top: 0;\n background: lighten($ui-base-color, 4%);\n\n h1 {\n font-size: 24px;\n }\n }\n}\n\n.directory {\n background: $ui-base-color;\n border-radius: 4px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &__tag {\n box-sizing: border-box;\n margin-bottom: 10px;\n\n & > a,\n & > div {\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: $ui-base-color;\n border-radius: 4px;\n padding: 15px;\n text-decoration: none;\n color: inherit;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n }\n\n & > a {\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 8%);\n }\n }\n\n &.active > a {\n background: $ui-highlight-color;\n cursor: default;\n }\n\n &.disabled > div {\n opacity: 0.5;\n cursor: default;\n }\n\n h4 {\n flex: 1 1 auto;\n font-size: 18px;\n font-weight: 700;\n color: $primary-text-color;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n .fa {\n color: $darker-text-color;\n }\n\n small {\n display: block;\n font-weight: 400;\n font-size: 15px;\n margin-top: 8px;\n color: $darker-text-color;\n }\n }\n\n &.active h4 {\n &,\n .fa,\n small {\n color: $primary-text-color;\n }\n }\n\n .avatar-stack {\n flex: 0 0 auto;\n width: (36px + 4px) * 3;\n }\n\n &.active .avatar-stack .account__avatar {\n border-color: $ui-highlight-color;\n }\n }\n}\n\n.avatar-stack {\n display: flex;\n justify-content: flex-end;\n\n .account__avatar {\n flex: 0 0 auto;\n width: 36px;\n height: 36px;\n border-radius: 50%;\n position: relative;\n margin-left: -10px;\n background: darken($ui-base-color, 8%);\n border: 2px solid $ui-base-color;\n\n &:nth-child(1) {\n z-index: 1;\n }\n\n &:nth-child(2) {\n z-index: 2;\n }\n\n &:nth-child(3) {\n z-index: 3;\n }\n }\n}\n\n.accounts-table {\n width: 100%;\n\n .account {\n padding: 0;\n border: 0;\n }\n\n strong {\n font-weight: 700;\n }\n\n thead th {\n text-align: center;\n text-transform: uppercase;\n color: $darker-text-color;\n font-weight: 700;\n padding: 10px;\n\n &:first-child {\n text-align: left;\n }\n }\n\n tbody td {\n padding: 15px 0;\n vertical-align: middle;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n tbody tr:last-child td {\n border-bottom: 0;\n }\n\n &__count {\n width: 120px;\n text-align: center;\n font-size: 15px;\n font-weight: 500;\n color: $primary-text-color;\n\n small {\n display: block;\n color: $darker-text-color;\n font-weight: 400;\n font-size: 14px;\n }\n }\n\n &__comment {\n width: 50%;\n vertical-align: initial !important;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n tbody td.optional {\n display: none;\n }\n }\n}\n\n.moved-account-widget,\n.memoriam-widget,\n.box-widget,\n.contact-widget,\n.landing-page__information.contact-widget,\n.directory,\n.page-header {\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n box-shadow: none;\n border-radius: 0;\n }\n}\n\n$maximum-width: 1235px;\n$fluid-breakpoint: $maximum-width + 20px;\n\n.statuses-grid {\n min-height: 600px;\n\n @media screen and (max-width: 640px) {\n width: 100% !important; // Masonry layout is unnecessary at this width\n }\n\n &__item {\n width: (960px - 20px) / 3;\n\n @media screen and (max-width: $fluid-breakpoint) {\n width: (940px - 20px) / 3;\n }\n\n @media screen and (max-width: 640px) {\n width: 100%;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n width: 100vw;\n }\n }\n\n .detailed-status {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 1px solid lighten($ui-base-color, 16%);\n }\n\n &.compact {\n .detailed-status__meta {\n margin-top: 15px;\n }\n\n .status__content {\n font-size: 15px;\n line-height: 20px;\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n .status__content__spoiler-link {\n line-height: 20px;\n margin: 0;\n }\n }\n\n .media-gallery,\n .status-card,\n .video-player {\n margin-top: 15px;\n }\n }\n }\n}\n\n.notice-widget {\n margin-bottom: 10px;\n color: $darker-text-color;\n\n p {\n margin-bottom: 10px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n font-size: 14px;\n line-height: 20px;\n }\n}\n\n.notice-widget,\n.placeholder-widget {\n a {\n text-decoration: none;\n font-weight: 500;\n color: $ui-highlight-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.table-of-contents {\n background: darken($ui-base-color, 4%);\n min-height: 100%;\n font-size: 14px;\n border-radius: 4px;\n\n li a {\n display: block;\n font-weight: 500;\n padding: 15px;\n overflow: hidden;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n text-decoration: none;\n color: $primary-text-color;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n\n li:last-child a {\n border-bottom: 0;\n }\n\n li ul {\n padding-left: 20px;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n }\n}\n","$no-columns-breakpoint: 600px;\n\ncode {\n font-family: $font-monospace, monospace;\n font-weight: 400;\n}\n\n.form-container {\n max-width: 400px;\n padding: 20px;\n margin: 0 auto;\n}\n\n.simple_form {\n .input {\n margin-bottom: 15px;\n overflow: hidden;\n\n &.hidden {\n margin: 0;\n }\n\n &.radio_buttons {\n .radio {\n margin-bottom: 15px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .radio > label {\n position: relative;\n padding-left: 28px;\n\n input {\n position: absolute;\n top: -2px;\n left: 0;\n }\n }\n }\n\n &.boolean {\n position: relative;\n margin-bottom: 0;\n\n .label_input > label {\n font-family: inherit;\n font-size: 14px;\n padding-top: 5px;\n color: $primary-text-color;\n display: block;\n width: auto;\n }\n\n .label_input,\n .hint {\n padding-left: 28px;\n }\n\n .label_input__wrapper {\n position: static;\n }\n\n label.checkbox {\n position: absolute;\n top: 2px;\n left: 0;\n }\n\n label a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: none;\n }\n }\n\n .recommended {\n position: absolute;\n margin: 0 4px;\n margin-top: -2px;\n }\n }\n }\n\n .row {\n display: flex;\n margin: 0 -5px;\n\n .input {\n box-sizing: border-box;\n flex: 1 1 auto;\n width: 50%;\n padding: 0 5px;\n }\n }\n\n .hint {\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n }\n\n code {\n border-radius: 3px;\n padding: 0.2em 0.4em;\n background: darken($ui-base-color, 12%);\n }\n }\n\n span.hint {\n display: block;\n font-size: 12px;\n margin-top: 4px;\n }\n\n p.hint {\n margin-bottom: 15px;\n color: $darker-text-color;\n\n &.subtle-hint {\n text-align: center;\n font-size: 12px;\n line-height: 18px;\n margin-top: 15px;\n margin-bottom: 0;\n }\n }\n\n .card {\n margin-bottom: 15px;\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n .input.with_floating_label {\n .label_input {\n display: flex;\n\n & > label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 500;\n min-width: 150px;\n flex: 0 0 auto;\n }\n\n input,\n select {\n flex: 1 1 auto;\n }\n }\n\n &.select .hint {\n margin-top: 6px;\n margin-left: 150px;\n }\n }\n\n .input.with_label {\n .label_input > label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: block;\n margin-bottom: 8px;\n word-wrap: break-word;\n font-weight: 500;\n }\n\n .hint {\n margin-top: 6px;\n }\n\n ul {\n flex: 390px;\n }\n }\n\n .input.with_block_label {\n max-width: none;\n\n & > label {\n font-family: inherit;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n font-weight: 500;\n padding-top: 5px;\n }\n\n .hint {\n margin-bottom: 15px;\n }\n\n ul {\n columns: 2;\n }\n }\n\n .input.datetime .label_input select {\n display: inline-block;\n width: auto;\n flex: 0;\n }\n\n .required abbr {\n text-decoration: none;\n color: lighten($error-value-color, 12%);\n }\n\n .fields-group {\n margin-bottom: 25px;\n\n .input:last-child {\n margin-bottom: 0;\n }\n }\n\n .fields-row {\n display: flex;\n margin: 0 -10px;\n padding-top: 5px;\n margin-bottom: 25px;\n\n .input {\n max-width: none;\n }\n\n &__column {\n box-sizing: border-box;\n padding: 0 10px;\n flex: 1 1 auto;\n min-height: 1px;\n\n &-6 {\n max-width: 50%;\n }\n\n .actions {\n margin-top: 27px;\n }\n }\n\n .fields-group:last-child,\n .fields-row__column.fields-group {\n margin-bottom: 0;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n margin-bottom: 0;\n\n &__column {\n max-width: none;\n }\n\n .fields-group:last-child,\n .fields-row__column.fields-group,\n .fields-row__column {\n margin-bottom: 25px;\n }\n }\n }\n\n .input.radio_buttons .radio label {\n margin-bottom: 5px;\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: block;\n width: auto;\n }\n\n .check_boxes {\n .checkbox {\n label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: inline-block;\n width: auto;\n position: relative;\n padding-top: 5px;\n padding-left: 25px;\n flex: 1 1 auto;\n }\n\n input[type=checkbox] {\n position: absolute;\n left: 0;\n top: 5px;\n margin: 0;\n }\n }\n }\n\n .input.static .label_input__wrapper {\n font-size: 16px;\n padding: 10px;\n border: 1px solid $dark-text-color;\n border-radius: 4px;\n }\n\n input[type=text],\n input[type=number],\n input[type=email],\n input[type=password],\n textarea {\n box-sizing: border-box;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n width: 100%;\n outline: 0;\n font-family: inherit;\n resize: vertical;\n background: darken($ui-base-color, 10%);\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n padding: 10px;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &:invalid {\n box-shadow: none;\n }\n\n &:focus:invalid:not(:placeholder-shown) {\n border-color: lighten($error-red, 12%);\n }\n\n &:required:valid {\n border-color: $valid-value-color;\n }\n\n &:hover {\n border-color: darken($ui-base-color, 20%);\n }\n\n &:active,\n &:focus {\n border-color: $highlight-text-color;\n background: darken($ui-base-color, 8%);\n }\n }\n\n .input.field_with_errors {\n label {\n color: lighten($error-red, 12%);\n }\n\n input[type=text],\n input[type=number],\n input[type=email],\n input[type=password],\n textarea,\n select {\n border-color: lighten($error-red, 12%);\n }\n\n .error {\n display: block;\n font-weight: 500;\n color: lighten($error-red, 12%);\n margin-top: 4px;\n }\n }\n\n .input.disabled {\n opacity: 0.5;\n }\n\n .actions {\n margin-top: 30px;\n display: flex;\n\n &.actions--top {\n margin-top: 0;\n margin-bottom: 30px;\n }\n }\n\n button,\n .button,\n .block-button {\n display: block;\n width: 100%;\n border: 0;\n border-radius: 4px;\n background: $ui-highlight-color;\n color: $primary-text-color;\n font-size: 18px;\n line-height: inherit;\n height: auto;\n padding: 10px;\n text-transform: uppercase;\n text-decoration: none;\n text-align: center;\n box-sizing: border-box;\n cursor: pointer;\n font-weight: 500;\n outline: 0;\n margin-bottom: 10px;\n margin-right: 10px;\n\n &:last-child {\n margin-right: 0;\n }\n\n &:hover {\n background-color: lighten($ui-highlight-color, 5%);\n }\n\n &:active,\n &:focus {\n background-color: darken($ui-highlight-color, 5%);\n }\n\n &:disabled:hover {\n background-color: $ui-primary-color;\n }\n\n &.negative {\n background: $error-value-color;\n\n &:hover {\n background-color: lighten($error-value-color, 5%);\n }\n\n &:active,\n &:focus {\n background-color: darken($error-value-color, 5%);\n }\n }\n }\n\n select {\n appearance: none;\n box-sizing: border-box;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n width: 100%;\n outline: 0;\n font-family: inherit;\n resize: vertical;\n background: darken($ui-base-color, 10%) url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center / auto 16px;\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n padding-left: 10px;\n padding-right: 30px;\n height: 41px;\n }\n\n h4 {\n margin-bottom: 15px !important;\n }\n\n .label_input {\n &__wrapper {\n position: relative;\n }\n\n &__append {\n position: absolute;\n right: 3px;\n top: 1px;\n padding: 10px;\n padding-bottom: 9px;\n font-size: 16px;\n color: $dark-text-color;\n font-family: inherit;\n pointer-events: none;\n cursor: default;\n max-width: 140px;\n white-space: nowrap;\n overflow: hidden;\n\n &::after {\n content: '';\n display: block;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 1px;\n width: 5px;\n background-image: linear-gradient(to right, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));\n }\n }\n }\n\n &__overlay-area {\n position: relative;\n\n &__blurred form {\n filter: blur(2px);\n }\n\n &__overlay {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n background: rgba($ui-base-color, 0.65);\n border-radius: 4px;\n margin-left: -4px;\n margin-top: -4px;\n padding: 4px;\n\n &__content {\n text-align: center;\n\n &.rich-formatting {\n &,\n p {\n color: $primary-text-color;\n }\n }\n }\n }\n }\n}\n\n.block-icon {\n display: block;\n margin: 0 auto;\n margin-bottom: 10px;\n font-size: 24px;\n}\n\n.flash-message {\n background: lighten($ui-base-color, 8%);\n color: $darker-text-color;\n border-radius: 4px;\n padding: 15px 10px;\n margin-bottom: 30px;\n text-align: center;\n\n &.notice {\n border: 1px solid rgba($valid-value-color, 0.5);\n background: rgba($valid-value-color, 0.25);\n color: $valid-value-color;\n }\n\n &.alert {\n border: 1px solid rgba($error-value-color, 0.5);\n background: rgba($error-value-color, 0.25);\n color: $error-value-color;\n }\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n\n &:hover {\n color: $primary-text-color;\n text-decoration: underline;\n }\n }\n\n p {\n margin-bottom: 15px;\n }\n\n .oauth-code {\n outline: 0;\n box-sizing: border-box;\n display: block;\n width: 100%;\n border: none;\n padding: 10px;\n font-family: $font-monospace, monospace;\n background: $ui-base-color;\n color: $primary-text-color;\n font-size: 14px;\n margin: 0;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n @media screen and (max-width: 740px) and (min-width: 441px) {\n margin-top: 40px;\n }\n}\n\n.form-footer {\n margin-top: 30px;\n text-align: center;\n\n a {\n color: $darker-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.quick-nav {\n list-style: none;\n margin-bottom: 25px;\n font-size: 14px;\n\n li {\n display: inline-block;\n margin-right: 10px;\n }\n\n a {\n color: $highlight-text-color;\n text-transform: uppercase;\n text-decoration: none;\n font-weight: 700;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($highlight-text-color, 8%);\n }\n }\n}\n\n.oauth-prompt,\n.follow-prompt {\n margin-bottom: 30px;\n color: $darker-text-color;\n\n h2 {\n font-size: 16px;\n margin-bottom: 30px;\n text-align: center;\n }\n\n strong {\n color: $secondary-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n @media screen and (max-width: 740px) and (min-width: 441px) {\n margin-top: 40px;\n }\n}\n\n.qr-wrapper {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n}\n\n.qr-code {\n flex: 0 0 auto;\n background: $simple-background-color;\n padding: 4px;\n margin: 0 10px 20px 0;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n display: inline-block;\n\n svg {\n display: block;\n margin: 0;\n }\n}\n\n.qr-alternative {\n margin-bottom: 20px;\n color: $secondary-text-color;\n flex: 150px;\n\n samp {\n display: block;\n font-size: 14px;\n }\n}\n\n.table-form {\n p {\n margin-bottom: 15px;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n }\n}\n\n.simple_form,\n.table-form {\n .warning {\n box-sizing: border-box;\n background: rgba($error-value-color, 0.5);\n color: $primary-text-color;\n text-shadow: 1px 1px 0 rgba($base-shadow-color, 0.3);\n box-shadow: 0 2px 6px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n padding: 10px;\n margin-bottom: 15px;\n\n a {\n color: $primary-text-color;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n strong {\n font-weight: 600;\n display: block;\n margin-bottom: 5px;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n\n .fa {\n font-weight: 400;\n }\n }\n }\n}\n\n.action-pagination {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n\n .actions,\n .pagination {\n flex: 1 1 auto;\n }\n\n .actions {\n padding: 30px 0;\n padding-right: 20px;\n flex: 0 0 auto;\n }\n}\n\n.post-follow-actions {\n text-align: center;\n color: $darker-text-color;\n\n div {\n margin-bottom: 4px;\n }\n}\n\n.alternative-login {\n margin-top: 20px;\n margin-bottom: 20px;\n\n h4 {\n font-size: 16px;\n color: $primary-text-color;\n text-align: center;\n margin-bottom: 20px;\n border: 0;\n padding: 0;\n }\n\n .button {\n display: block;\n }\n}\n\n.scope-danger {\n color: $warning-red;\n}\n\n.form_admin_settings_site_short_description,\n.form_admin_settings_site_description,\n.form_admin_settings_site_extended_description,\n.form_admin_settings_site_terms,\n.form_admin_settings_custom_css,\n.form_admin_settings_closed_registrations_message {\n textarea {\n font-family: $font-monospace, monospace;\n }\n}\n\n.input-copy {\n background: darken($ui-base-color, 10%);\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n display: flex;\n align-items: center;\n padding-right: 4px;\n position: relative;\n top: 1px;\n transition: border-color 300ms linear;\n\n &__wrapper {\n flex: 1 1 auto;\n }\n\n input[type=text] {\n background: transparent;\n border: 0;\n padding: 10px;\n font-size: 14px;\n font-family: $font-monospace, monospace;\n }\n\n button {\n flex: 0 0 auto;\n margin: 4px;\n text-transform: none;\n font-weight: 400;\n font-size: 14px;\n padding: 7px 18px;\n padding-bottom: 6px;\n width: auto;\n transition: background 300ms linear;\n }\n\n &.copied {\n border-color: $valid-value-color;\n transition: none;\n\n button {\n background: $valid-value-color;\n transition: none;\n }\n }\n}\n\n.connection-prompt {\n margin-bottom: 25px;\n\n .fa-link {\n background-color: darken($ui-base-color, 4%);\n border-radius: 100%;\n font-size: 24px;\n padding: 10px;\n }\n\n &__column {\n align-items: center;\n display: flex;\n flex: 1;\n flex-direction: column;\n flex-shrink: 1;\n max-width: 50%;\n\n &-sep {\n align-self: center;\n flex-grow: 0;\n overflow: visible;\n position: relative;\n z-index: 1;\n }\n\n p {\n word-break: break-word;\n }\n }\n\n .account__avatar {\n margin-bottom: 20px;\n }\n\n &__connection {\n background-color: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n padding: 25px 10px;\n position: relative;\n text-align: center;\n\n &::after {\n background-color: darken($ui-base-color, 4%);\n content: '';\n display: block;\n height: 100%;\n left: 50%;\n position: absolute;\n top: 0;\n width: 1px;\n }\n }\n\n &__row {\n align-items: flex-start;\n display: flex;\n flex-direction: row;\n }\n}\n",".card {\n & > a {\n display: block;\n text-decoration: none;\n color: inherit;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n box-shadow: none;\n }\n\n &:hover,\n &:active,\n &:focus {\n .card__bar {\n background: lighten($ui-base-color, 8%);\n }\n }\n }\n\n &__img {\n height: 130px;\n position: relative;\n background: darken($ui-base-color, 12%);\n border-radius: 4px 4px 0 0;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n object-fit: cover;\n border-radius: 4px 4px 0 0;\n }\n\n @media screen and (max-width: 600px) {\n height: 200px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n\n &__bar {\n position: relative;\n padding: 15px;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n\n .avatar {\n flex: 0 0 auto;\n width: 48px;\n height: 48px;\n @include avatar-size(48px);\n padding-top: 2px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n @include avatar-radius();\n background: darken($ui-base-color, 8%);\n object-fit: cover;\n }\n }\n\n .display-name {\n margin-left: 15px;\n text-align: left;\n\n strong {\n font-size: 15px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n span {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n}\n\n.pagination {\n padding: 30px 0;\n text-align: center;\n overflow: hidden;\n\n a,\n .current,\n .newer,\n .older,\n .page,\n .gap {\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 500;\n display: inline-block;\n padding: 6px 10px;\n text-decoration: none;\n }\n\n .current {\n background: $simple-background-color;\n border-radius: 100px;\n color: $inverted-text-color;\n cursor: default;\n margin: 0 10px;\n }\n\n .gap {\n cursor: default;\n }\n\n .older,\n .newer {\n text-transform: uppercase;\n color: $secondary-text-color;\n }\n\n .older {\n float: left;\n padding-left: 0;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n .newer {\n float: right;\n padding-right: 0;\n\n .fa {\n display: inline-block;\n margin-left: 5px;\n }\n }\n\n .disabled {\n cursor: default;\n color: lighten($inverted-text-color, 10%);\n }\n\n @media screen and (max-width: 700px) {\n padding: 30px 20px;\n\n .page {\n display: none;\n }\n\n .newer,\n .older {\n display: inline-block;\n }\n }\n}\n\n.nothing-here {\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n color: $light-text-color;\n font-size: 14px;\n font-weight: 500;\n text-align: center;\n display: flex;\n justify-content: center;\n align-items: center;\n cursor: default;\n border-radius: 4px;\n padding: 20px;\n min-height: 30vh;\n\n &--under-tabs {\n border-radius: 0 0 4px 4px;\n }\n\n &--flexible {\n box-sizing: border-box;\n min-height: 100%;\n }\n}\n\n.account-role,\n.simple_form .recommended {\n display: inline-block;\n padding: 4px 6px;\n cursor: default;\n border-radius: 3px;\n font-size: 12px;\n line-height: 12px;\n font-weight: 500;\n color: $ui-secondary-color;\n background-color: rgba($ui-secondary-color, 0.1);\n border: 1px solid rgba($ui-secondary-color, 0.5);\n\n &.moderator {\n color: $success-green;\n background-color: rgba($success-green, 0.1);\n border-color: rgba($success-green, 0.5);\n }\n\n &.admin {\n color: lighten($error-red, 12%);\n background-color: rgba(lighten($error-red, 12%), 0.1);\n border-color: rgba(lighten($error-red, 12%), 0.5);\n }\n}\n\n.account__header__fields {\n max-width: 100vw;\n padding: 0;\n margin: 15px -15px -15px;\n border: 0 none;\n border-top: 1px solid lighten($ui-base-color, 12%);\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n font-size: 14px;\n line-height: 20px;\n\n dl {\n display: flex;\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n }\n\n dt,\n dd {\n box-sizing: border-box;\n padding: 14px;\n text-align: center;\n max-height: 48px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n dt {\n font-weight: 500;\n width: 120px;\n flex: 0 0 auto;\n color: $secondary-text-color;\n background: rgba(darken($ui-base-color, 8%), 0.5);\n }\n\n dd {\n flex: 1 1 auto;\n color: $darker-text-color;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n\n .verified {\n border: 1px solid rgba($valid-value-color, 0.5);\n background: rgba($valid-value-color, 0.25);\n\n a {\n color: $valid-value-color;\n font-weight: 500;\n }\n\n &__mark {\n color: $valid-value-color;\n }\n }\n\n dl:last-child {\n border-bottom: 0;\n }\n}\n\n.directory__tag .trends__item__current {\n width: auto;\n}\n\n.pending-account {\n &__header {\n color: $darker-text-color;\n\n a {\n color: $ui-secondary-color;\n text-decoration: none;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n\n strong {\n color: $primary-text-color;\n font-weight: 700;\n }\n }\n\n &__body {\n margin-top: 10px;\n }\n}\n",".activity-stream {\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n overflow: hidden;\n margin-bottom: 10px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n border-radius: 0;\n box-shadow: none;\n }\n\n &--headless {\n border-radius: 0;\n margin: 0;\n box-shadow: none;\n\n .detailed-status,\n .status {\n border-radius: 0 !important;\n }\n }\n\n div[data-component] {\n width: 100%;\n }\n\n .entry {\n background: $ui-base-color;\n\n .detailed-status,\n .status,\n .load-more {\n animation: none;\n }\n\n &:last-child {\n .detailed-status,\n .status,\n .load-more {\n border-bottom: 0;\n border-radius: 0 0 4px 4px;\n }\n }\n\n &:first-child {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 4px 4px 0 0;\n }\n\n &:last-child {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 4px;\n }\n }\n }\n\n @media screen and (max-width: 740px) {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 0 !important;\n }\n }\n }\n\n &--highlighted .entry {\n background: lighten($ui-base-color, 8%);\n }\n}\n\n.button.logo-button {\n flex: 0 auto;\n font-size: 14px;\n background: $ui-highlight-color;\n color: $primary-text-color;\n text-transform: none;\n line-height: 36px;\n height: auto;\n padding: 3px 15px;\n border: 0;\n\n svg {\n width: 20px;\n height: auto;\n vertical-align: middle;\n margin-right: 5px;\n fill: $primary-text-color;\n }\n\n &:active,\n &:focus,\n &:hover {\n background: lighten($ui-highlight-color, 10%);\n }\n\n &:disabled,\n &.disabled {\n &:active,\n &:focus,\n &:hover {\n background: $ui-primary-color;\n }\n }\n\n &.button--destructive {\n &:active,\n &:focus,\n &:hover {\n background: $error-red;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n svg {\n display: none;\n }\n }\n}\n\n.embed,\n.public-layout {\n .detailed-status {\n padding: 15px;\n }\n\n .status {\n padding: 15px 15px 15px (48px + 15px * 2);\n min-height: 48px + 2px;\n\n &__avatar {\n left: 15px;\n top: 17px;\n }\n\n &__content {\n padding-top: 5px;\n }\n\n &__prepend {\n padding: 8px 0;\n padding-bottom: 2px;\n margin: initial;\n margin-left: 48px + 15px * 2;\n padding-top: 15px;\n }\n\n &__prepend-icon-wrapper {\n position: absolute;\n margin: initial;\n float: initial;\n width: auto;\n left: -32px;\n }\n\n .media-gallery,\n &__action-bar,\n .video-player {\n margin-top: 10px;\n }\n }\n}\n\n// Styling from upstream's WebUI, as public pages use the same layout\n.embed,\n.public-layout {\n .status {\n .status__info {\n font-size: 15px;\n display: initial;\n }\n\n .status__relative-time {\n color: $dark-text-color;\n float: right;\n font-size: 14px;\n width: auto;\n margin: initial;\n padding: initial;\n }\n\n .status__info .status__display-name {\n display: block;\n max-width: 100%;\n padding: 6px 0;\n padding-right: 25px;\n margin: initial;\n\n .display-name strong {\n display: inline;\n }\n }\n\n .status__avatar {\n height: 48px;\n position: absolute;\n width: 48px;\n margin: initial;\n }\n }\n}\n\n.rtl {\n .embed,\n .public-layout {\n .status {\n padding-left: 10px;\n padding-right: 68px;\n\n .status__info .status__display-name {\n padding-left: 25px;\n padding-right: 0;\n }\n\n .status__relative-time {\n float: left;\n }\n }\n }\n}\n\n.status__content__read-more-button {\n display: block;\n font-size: 15px;\n line-height: 20px;\n color: lighten($ui-highlight-color, 8%);\n border: 0;\n background: transparent;\n padding: 0;\n padding-top: 8px;\n text-decoration: none;\n\n &:hover,\n &:active {\n text-decoration: underline;\n }\n}\n",".app-body {\n -webkit-overflow-scrolling: touch;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n}\n\n.animated-number {\n display: inline-flex;\n flex-direction: column;\n align-items: stretch;\n overflow: hidden;\n position: relative;\n}\n\n.link-button {\n display: block;\n font-size: 15px;\n line-height: 20px;\n color: $ui-highlight-color;\n border: 0;\n background: transparent;\n padding: 0;\n cursor: pointer;\n\n &:hover,\n &:active {\n text-decoration: underline;\n }\n\n &:disabled {\n color: $ui-primary-color;\n cursor: default;\n }\n}\n\n.button {\n background-color: darken($ui-highlight-color, 3%);\n border: 10px none;\n border-radius: 4px;\n box-sizing: border-box;\n color: $primary-text-color;\n cursor: pointer;\n display: inline-block;\n font-family: inherit;\n font-size: 14px;\n font-weight: 500;\n height: 36px;\n letter-spacing: 0;\n line-height: 36px;\n overflow: hidden;\n padding: 0 16px;\n position: relative;\n text-align: center;\n text-transform: uppercase;\n text-decoration: none;\n text-overflow: ellipsis;\n transition: all 100ms ease-in;\n transition-property: background-color;\n white-space: nowrap;\n width: auto;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-highlight-color, 7%);\n transition: all 200ms ease-out;\n transition-property: background-color;\n }\n\n &--destructive {\n transition: none;\n\n &:active,\n &:focus,\n &:hover {\n background-color: $error-red;\n transition: none;\n }\n }\n\n &:disabled {\n background-color: $ui-primary-color;\n cursor: default;\n }\n\n &.button-primary,\n &.button-alternative,\n &.button-secondary,\n &.button-alternative-2 {\n font-size: 16px;\n line-height: 36px;\n height: auto;\n text-transform: none;\n padding: 4px 16px;\n }\n\n &.button-alternative {\n color: $inverted-text-color;\n background: $ui-primary-color;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-primary-color, 4%);\n }\n }\n\n &.button-alternative-2 {\n background: $ui-base-lighter-color;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-base-lighter-color, 4%);\n }\n }\n\n &.button-secondary {\n font-size: 16px;\n line-height: 36px;\n height: auto;\n color: $darker-text-color;\n text-transform: none;\n background: transparent;\n padding: 3px 15px;\n border-radius: 4px;\n border: 1px solid $ui-primary-color;\n\n &:active,\n &:focus,\n &:hover {\n border-color: lighten($ui-primary-color, 4%);\n color: lighten($darker-text-color, 4%);\n }\n\n &:disabled {\n opacity: 0.5;\n }\n }\n\n &.button--block {\n display: block;\n width: 100%;\n }\n}\n\n.icon-button {\n display: inline-block;\n padding: 0;\n color: $action-button-color;\n border: 0;\n border-radius: 4px;\n background: transparent;\n cursor: pointer;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($action-button-color, 7%);\n background-color: rgba($action-button-color, 0.15);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n }\n\n &:focus {\n background-color: rgba($action-button-color, 0.3);\n }\n\n &.disabled {\n color: darken($action-button-color, 13%);\n background-color: transparent;\n cursor: default;\n }\n\n &.active {\n color: $highlight-text-color;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &.inverted {\n color: $lighter-text-color;\n\n &:hover,\n &:active,\n &:focus {\n color: darken($lighter-text-color, 7%);\n background-color: rgba($lighter-text-color, 0.15);\n }\n\n &:focus {\n background-color: rgba($lighter-text-color, 0.3);\n }\n\n &.disabled {\n color: lighten($lighter-text-color, 7%);\n background-color: transparent;\n }\n\n &.active {\n color: $highlight-text-color;\n\n &.disabled {\n color: lighten($highlight-text-color, 13%);\n }\n }\n }\n\n &.overlayed {\n box-sizing: content-box;\n background: rgba($base-overlay-background, 0.6);\n color: rgba($primary-text-color, 0.7);\n border-radius: 4px;\n padding: 2px;\n\n &:hover {\n background: rgba($base-overlay-background, 0.9);\n }\n }\n}\n\n.text-icon-button {\n color: $lighter-text-color;\n border: 0;\n border-radius: 4px;\n background: transparent;\n cursor: pointer;\n font-weight: 600;\n font-size: 11px;\n padding: 0 3px;\n line-height: 27px;\n outline: 0;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &:hover,\n &:active,\n &:focus {\n color: darken($lighter-text-color, 7%);\n background-color: rgba($lighter-text-color, 0.15);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n }\n\n &:focus {\n background-color: rgba($lighter-text-color, 0.3);\n }\n\n &.disabled {\n color: lighten($lighter-text-color, 20%);\n background-color: transparent;\n cursor: default;\n }\n\n &.active {\n color: $highlight-text-color;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n}\n\n.dropdown-menu {\n position: absolute;\n transform-origin: 50% 0;\n}\n\n.invisible {\n font-size: 0;\n line-height: 0;\n display: inline-block;\n width: 0;\n height: 0;\n position: absolute;\n\n img,\n svg {\n margin: 0 !important;\n border: 0 !important;\n padding: 0 !important;\n width: 0 !important;\n height: 0 !important;\n }\n}\n\n.ellipsis {\n &::after {\n content: \"…\";\n }\n}\n\n.notification__favourite-icon-wrapper {\n left: 0;\n position: absolute;\n\n .fa.star-icon {\n color: $gold-star;\n }\n}\n\n.star-icon.active {\n color: $gold-star;\n}\n\n.bookmark-icon.active {\n color: $red-bookmark;\n}\n\n.no-reduce-motion .icon-button.star-icon {\n &.activate {\n & > .fa-star {\n animation: spring-rotate-in 1s linear;\n }\n }\n\n &.deactivate {\n & > .fa-star {\n animation: spring-rotate-out 1s linear;\n }\n }\n}\n\n.notification__display-name {\n color: inherit;\n font-weight: 500;\n text-decoration: none;\n\n &:hover {\n color: $primary-text-color;\n text-decoration: underline;\n }\n}\n\n.display-name {\n display: block;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n a {\n color: inherit;\n text-decoration: inherit;\n }\n\n strong {\n height: 18px;\n font-size: 16px;\n font-weight: 500;\n line-height: 18px;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n }\n\n span {\n display: block;\n height: 18px;\n font-size: 15px;\n line-height: 18px;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n }\n\n > a:hover {\n strong {\n text-decoration: underline;\n }\n }\n\n &.inline {\n padding: 0;\n height: 18px;\n font-size: 15px;\n line-height: 18px;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n\n strong {\n display: inline;\n height: auto;\n font-size: inherit;\n line-height: inherit;\n }\n\n span {\n display: inline;\n height: auto;\n font-size: inherit;\n line-height: inherit;\n }\n }\n}\n\n.display-name__html {\n font-weight: 500;\n}\n\n.display-name__account {\n font-size: 14px;\n}\n\n.image-loader {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n\n .image-loader__preview-canvas {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n background: url('~images/void.png') repeat;\n object-fit: contain;\n }\n\n .loading-bar {\n position: relative;\n }\n\n &.image-loader--amorphous .image-loader__preview-canvas {\n display: none;\n }\n}\n\n.zoomable-image {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n img {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n width: auto;\n height: auto;\n object-fit: contain;\n }\n}\n\n.dropdown {\n display: inline-block;\n}\n\n.dropdown__content {\n display: none;\n position: absolute;\n}\n\n.dropdown-menu__separator {\n border-bottom: 1px solid darken($ui-secondary-color, 8%);\n margin: 5px 7px 6px;\n height: 0;\n}\n\n.dropdown-menu {\n background: $ui-secondary-color;\n padding: 4px 0;\n border-radius: 4px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n\n ul {\n list-style: none;\n }\n}\n\n.dropdown-menu__arrow {\n position: absolute;\n width: 0;\n height: 0;\n border: 0 solid transparent;\n\n &.left {\n right: -5px;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: $ui-secondary-color;\n }\n\n &.top {\n bottom: -5px;\n margin-left: -7px;\n border-width: 5px 7px 0;\n border-top-color: $ui-secondary-color;\n }\n\n &.bottom {\n top: -5px;\n margin-left: -7px;\n border-width: 0 7px 5px;\n border-bottom-color: $ui-secondary-color;\n }\n\n &.right {\n left: -5px;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: $ui-secondary-color;\n }\n}\n\n.dropdown-menu__item {\n a {\n font-size: 13px;\n line-height: 18px;\n display: block;\n padding: 4px 14px;\n box-sizing: border-box;\n text-decoration: none;\n background: $ui-secondary-color;\n color: $inverted-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:focus,\n &:hover,\n &:active {\n background: $ui-highlight-color;\n color: $secondary-text-color;\n outline: 0;\n }\n }\n}\n\n.dropdown--active .dropdown__content {\n display: block;\n line-height: 18px;\n max-width: 311px;\n right: 0;\n text-align: left;\n z-index: 9999;\n\n & > ul {\n list-style: none;\n background: $ui-secondary-color;\n padding: 4px 0;\n border-radius: 4px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.4);\n min-width: 140px;\n position: relative;\n }\n\n &.dropdown__right {\n right: 0;\n }\n\n &.dropdown__left {\n & > ul {\n left: -98px;\n }\n }\n\n & > ul > li > a {\n font-size: 13px;\n line-height: 18px;\n display: block;\n padding: 4px 14px;\n box-sizing: border-box;\n text-decoration: none;\n background: $ui-secondary-color;\n color: $inverted-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:focus {\n outline: 0;\n }\n\n &:hover {\n background: $ui-highlight-color;\n color: $secondary-text-color;\n }\n }\n}\n\n.dropdown__icon {\n vertical-align: middle;\n}\n\n.static-content {\n padding: 10px;\n padding-top: 20px;\n color: $dark-text-color;\n\n h1 {\n font-size: 16px;\n font-weight: 500;\n margin-bottom: 40px;\n text-align: center;\n }\n\n p {\n font-size: 13px;\n margin-bottom: 20px;\n }\n}\n\n.column,\n.drawer {\n flex: 1 1 100%;\n overflow: hidden;\n}\n\n@media screen and (min-width: 631px) {\n .columns-area {\n padding: 0;\n }\n\n .column,\n .drawer {\n flex: 0 0 auto;\n padding: 10px;\n padding-left: 5px;\n padding-right: 5px;\n\n &:first-child {\n padding-left: 10px;\n }\n\n &:last-child {\n padding-right: 10px;\n }\n }\n\n .columns-area > div {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n }\n }\n}\n\n.tabs-bar {\n box-sizing: border-box;\n display: flex;\n background: lighten($ui-base-color, 8%);\n flex: 0 0 auto;\n overflow-y: auto;\n}\n\n.tabs-bar__link {\n display: block;\n flex: 1 1 auto;\n padding: 15px 10px;\n padding-bottom: 13px;\n color: $primary-text-color;\n text-decoration: none;\n text-align: center;\n font-size: 14px;\n font-weight: 500;\n border-bottom: 2px solid lighten($ui-base-color, 8%);\n transition: all 50ms linear;\n transition-property: border-bottom, background, color;\n\n .fa {\n font-weight: 400;\n font-size: 16px;\n }\n\n &:hover,\n &:focus,\n &:active {\n @include multi-columns('screen and (min-width: 631px)') {\n background: lighten($ui-base-color, 14%);\n border-bottom-color: lighten($ui-base-color, 14%);\n }\n }\n\n &.active {\n border-bottom: 2px solid $ui-highlight-color;\n color: $highlight-text-color;\n }\n\n span {\n margin-left: 5px;\n display: none;\n }\n\n span.icon {\n margin-left: 0;\n display: inline;\n }\n}\n\n.icon-with-badge {\n position: relative;\n\n &__badge {\n position: absolute;\n left: 9px;\n top: -13px;\n background: $ui-highlight-color;\n border: 2px solid lighten($ui-base-color, 8%);\n padding: 1px 6px;\n border-radius: 6px;\n font-size: 10px;\n font-weight: 500;\n line-height: 14px;\n color: $primary-text-color;\n }\n}\n\n.column-link--transparent .icon-with-badge__badge {\n border-color: darken($ui-base-color, 8%);\n}\n\n.scrollable {\n overflow-y: scroll;\n overflow-x: hidden;\n flex: 1 1 auto;\n -webkit-overflow-scrolling: touch;\n\n &.optionally-scrollable {\n overflow-y: auto;\n }\n\n @supports(display: grid) { // hack to fix Chrome <57\n contain: strict;\n }\n\n &--flex {\n display: flex;\n flex-direction: column;\n }\n\n &__append {\n flex: 1 1 auto;\n position: relative;\n min-height: 120px;\n }\n}\n\n.scrollable.fullscreen {\n @supports(display: grid) { // hack to fix Chrome <57\n contain: none;\n }\n}\n\n.react-toggle {\n display: inline-block;\n position: relative;\n cursor: pointer;\n background-color: transparent;\n border: 0;\n padding: 0;\n user-select: none;\n -webkit-tap-highlight-color: rgba($base-overlay-background, 0);\n -webkit-tap-highlight-color: transparent;\n}\n\n.react-toggle-screenreader-only {\n border: 0;\n clip: rect(0 0 0 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n}\n\n.react-toggle--disabled {\n cursor: not-allowed;\n opacity: 0.5;\n transition: opacity 0.25s;\n}\n\n.react-toggle-track {\n width: 50px;\n height: 24px;\n padding: 0;\n border-radius: 30px;\n background-color: $ui-base-color;\n transition: background-color 0.2s ease;\n}\n\n.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track {\n background-color: darken($ui-base-color, 10%);\n}\n\n.react-toggle--checked .react-toggle-track {\n background-color: $ui-highlight-color;\n}\n\n.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track {\n background-color: lighten($ui-highlight-color, 10%);\n}\n\n.react-toggle-track-check {\n position: absolute;\n width: 14px;\n height: 10px;\n top: 0;\n bottom: 0;\n margin-top: auto;\n margin-bottom: auto;\n line-height: 0;\n left: 8px;\n opacity: 0;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle--checked .react-toggle-track-check {\n opacity: 1;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle-track-x {\n position: absolute;\n width: 10px;\n height: 10px;\n top: 0;\n bottom: 0;\n margin-top: auto;\n margin-bottom: auto;\n line-height: 0;\n right: 10px;\n opacity: 1;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle--checked .react-toggle-track-x {\n opacity: 0;\n}\n\n.react-toggle-thumb {\n position: absolute;\n top: 1px;\n left: 1px;\n width: 22px;\n height: 22px;\n border: 1px solid $ui-base-color;\n border-radius: 50%;\n background-color: darken($simple-background-color, 2%);\n box-sizing: border-box;\n transition: all 0.25s ease;\n transition-property: border-color, left;\n}\n\n.react-toggle--checked .react-toggle-thumb {\n left: 27px;\n border-color: $ui-highlight-color;\n}\n\n.getting-started__wrapper,\n.getting_started,\n.flex-spacer {\n background: $ui-base-color;\n}\n\n.getting-started__wrapper {\n position: relative;\n overflow-y: auto;\n}\n\n.flex-spacer {\n flex: 1 1 auto;\n}\n\n.getting-started {\n background: $ui-base-color;\n flex: 1 0 auto;\n\n p {\n color: $secondary-text-color;\n }\n\n a {\n color: $dark-text-color;\n }\n\n &__panel {\n height: min-content;\n }\n\n &__panel,\n &__footer {\n padding: 10px;\n padding-top: 20px;\n flex: 0 1 auto;\n\n ul {\n margin-bottom: 10px;\n }\n\n ul li {\n display: inline;\n }\n\n p {\n color: $dark-text-color;\n font-size: 13px;\n\n a {\n color: $dark-text-color;\n text-decoration: underline;\n }\n }\n\n a {\n text-decoration: none;\n color: $darker-text-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n }\n\n &__trends {\n flex: 0 1 auto;\n opacity: 1;\n animation: fade 150ms linear;\n margin-top: 10px;\n\n h4 {\n font-size: 12px;\n text-transform: uppercase;\n color: $darker-text-color;\n padding: 10px;\n font-weight: 500;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n @media screen and (max-height: 810px) {\n .trends__item:nth-child(3) {\n display: none;\n }\n }\n\n @media screen and (max-height: 720px) {\n .trends__item:nth-child(2) {\n display: none;\n }\n }\n\n @media screen and (max-height: 670px) {\n display: none;\n }\n\n .trends__item {\n border-bottom: 0;\n padding: 10px;\n\n &__current {\n color: $darker-text-color;\n }\n }\n }\n}\n\n.column-link__badge {\n display: inline-block;\n border-radius: 4px;\n font-size: 12px;\n line-height: 19px;\n font-weight: 500;\n background: $ui-base-color;\n padding: 4px 8px;\n margin: -6px 10px;\n}\n\n.keyboard-shortcuts {\n padding: 8px 0 0;\n overflow: hidden;\n\n thead {\n position: absolute;\n left: -9999px;\n }\n\n td {\n padding: 0 10px 8px;\n }\n\n kbd {\n display: inline-block;\n padding: 3px 5px;\n background-color: lighten($ui-base-color, 8%);\n border: 1px solid darken($ui-base-color, 4%);\n }\n}\n\n.setting-text {\n color: $darker-text-color;\n background: transparent;\n border: none;\n border-bottom: 2px solid $ui-primary-color;\n box-sizing: border-box;\n display: block;\n font-family: inherit;\n margin-bottom: 10px;\n padding: 7px 0;\n width: 100%;\n\n &:focus,\n &:active {\n color: $primary-text-color;\n border-bottom-color: $ui-highlight-color;\n }\n\n @include limited-single-column('screen and (max-width: 600px)') {\n font-size: 16px;\n }\n\n &.light {\n color: $inverted-text-color;\n border-bottom: 2px solid lighten($ui-base-color, 27%);\n\n &:focus,\n &:active {\n color: $inverted-text-color;\n border-bottom-color: $ui-highlight-color;\n }\n }\n}\n\n.no-reduce-motion button.icon-button i.fa-retweet {\n background-position: 0 0;\n height: 19px;\n transition: background-position 0.9s steps(10);\n transition-duration: 0s;\n vertical-align: middle;\n width: 22px;\n\n &::before {\n display: none !important;\n }\n}\n\n.no-reduce-motion button.icon-button.active i.fa-retweet {\n transition-duration: 0.9s;\n background-position: 0 100%;\n}\n\n.reduce-motion button.icon-button i.fa-retweet {\n color: $action-button-color;\n transition: color 100ms ease-in;\n}\n\n.reduce-motion button.icon-button.active i.fa-retweet {\n color: $highlight-text-color;\n}\n\n.reduce-motion button.icon-button.disabled i.fa-retweet {\n color: darken($action-button-color, 13%);\n}\n\n.load-more {\n display: block;\n color: $dark-text-color;\n background-color: transparent;\n border: 0;\n font-size: inherit;\n text-align: center;\n line-height: inherit;\n margin: 0;\n padding: 15px;\n box-sizing: border-box;\n width: 100%;\n clear: both;\n text-decoration: none;\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n}\n\n.load-gap {\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n}\n\n.missing-indicator {\n padding-top: 20px + 48px;\n}\n\n.scrollable > div > :first-child .notification__dismiss-overlay > .wrappy {\n border-top: 1px solid $ui-base-color;\n}\n\n.notification__dismiss-overlay {\n overflow: hidden;\n position: absolute;\n top: 0;\n right: 0;\n bottom: -1px;\n padding-left: 15px; // space for the box shadow to be visible\n\n z-index: 999;\n align-items: center;\n justify-content: flex-end;\n cursor: pointer;\n\n display: flex;\n\n .wrappy {\n width: $dismiss-overlay-width;\n align-self: stretch;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background: lighten($ui-base-color, 8%);\n border-left: 1px solid lighten($ui-base-color, 20%);\n box-shadow: 0 0 5px black;\n border-bottom: 1px solid $ui-base-color;\n }\n\n .ckbox {\n border: 2px solid $ui-primary-color;\n border-radius: 2px;\n width: 30px;\n height: 30px;\n font-size: 20px;\n color: $darker-text-color;\n text-shadow: 0 0 5px black;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n &:focus {\n outline: 0 !important;\n\n .ckbox {\n box-shadow: 0 0 1px 1px $ui-highlight-color;\n }\n }\n}\n\n.text-btn {\n display: inline-block;\n padding: 0;\n font-family: inherit;\n font-size: inherit;\n color: inherit;\n border: 0;\n background: transparent;\n cursor: pointer;\n}\n\n.loading-indicator {\n color: $dark-text-color;\n font-size: 12px;\n font-weight: 400;\n text-transform: uppercase;\n overflow: visible;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n\n span {\n display: block;\n float: left;\n margin-left: 50%;\n transform: translateX(-50%);\n margin: 82px 0 0 50%;\n white-space: nowrap;\n }\n}\n\n.loading-indicator__figure {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 42px;\n height: 42px;\n box-sizing: border-box;\n background-color: transparent;\n border: 0 solid lighten($ui-base-color, 26%);\n border-width: 6px;\n border-radius: 50%;\n}\n\n.no-reduce-motion .loading-indicator span {\n animation: loader-label 1.15s infinite cubic-bezier(0.215, 0.610, 0.355, 1.000);\n}\n\n.no-reduce-motion .loading-indicator__figure {\n animation: loader-figure 1.15s infinite cubic-bezier(0.215, 0.610, 0.355, 1.000);\n}\n\n@keyframes spring-rotate-in {\n 0% {\n transform: rotate(0deg);\n }\n\n 30% {\n transform: rotate(-484.8deg);\n }\n\n 60% {\n transform: rotate(-316.7deg);\n }\n\n 90% {\n transform: rotate(-375deg);\n }\n\n 100% {\n transform: rotate(-360deg);\n }\n}\n\n@keyframes spring-rotate-out {\n 0% {\n transform: rotate(-360deg);\n }\n\n 30% {\n transform: rotate(124.8deg);\n }\n\n 60% {\n transform: rotate(-43.27deg);\n }\n\n 90% {\n transform: rotate(15deg);\n }\n\n 100% {\n transform: rotate(0deg);\n }\n}\n\n@keyframes loader-figure {\n 0% {\n width: 0;\n height: 0;\n background-color: lighten($ui-base-color, 26%);\n }\n\n 29% {\n background-color: lighten($ui-base-color, 26%);\n }\n\n 30% {\n width: 42px;\n height: 42px;\n background-color: transparent;\n border-width: 21px;\n opacity: 1;\n }\n\n 100% {\n width: 42px;\n height: 42px;\n border-width: 0;\n opacity: 0;\n background-color: transparent;\n }\n}\n\n@keyframes loader-label {\n 0% { opacity: 0.25; }\n 30% { opacity: 1; }\n 100% { opacity: 0.25; }\n}\n\n.spoiler-button {\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n position: absolute;\n z-index: 100;\n\n &--minified {\n display: flex;\n left: 4px;\n top: 4px;\n width: auto;\n height: auto;\n align-items: center;\n }\n\n &--click-thru {\n pointer-events: none;\n }\n\n &--hidden {\n display: none;\n }\n\n &__overlay {\n display: block;\n background: transparent;\n width: 100%;\n height: 100%;\n border: 0;\n\n &__label {\n display: inline-block;\n background: rgba($base-overlay-background, 0.5);\n border-radius: 8px;\n padding: 8px 12px;\n color: $primary-text-color;\n font-weight: 500;\n font-size: 14px;\n }\n\n &:hover,\n &:focus,\n &:active {\n .spoiler-button__overlay__label {\n background: rgba($base-overlay-background, 0.8);\n }\n }\n\n &:disabled {\n .spoiler-button__overlay__label {\n background: rgba($base-overlay-background, 0.5);\n }\n }\n }\n}\n\n.setting-toggle {\n display: block;\n line-height: 24px;\n}\n\n.setting-toggle__label,\n.setting-radio__label,\n.setting-meta__label {\n color: $darker-text-color;\n display: inline-block;\n margin-bottom: 14px;\n margin-left: 8px;\n vertical-align: middle;\n}\n\n.setting-radio {\n display: block;\n line-height: 18px;\n}\n\n.setting-radio__label {\n margin-bottom: 0;\n}\n\n.column-settings__row legend {\n color: $darker-text-color;\n cursor: default;\n display: block;\n font-weight: 500;\n margin-top: 10px;\n}\n\n.setting-radio__input {\n vertical-align: middle;\n}\n\n.setting-meta__label {\n float: right;\n}\n\n@keyframes heartbeat {\n from {\n transform: scale(1);\n transform-origin: center center;\n animation-timing-function: ease-out;\n }\n\n 10% {\n transform: scale(0.91);\n animation-timing-function: ease-in;\n }\n\n 17% {\n transform: scale(0.98);\n animation-timing-function: ease-out;\n }\n\n 33% {\n transform: scale(0.87);\n animation-timing-function: ease-in;\n }\n\n 45% {\n transform: scale(1);\n animation-timing-function: ease-out;\n }\n}\n\n.pulse-loading {\n animation: heartbeat 1.5s ease-in-out infinite both;\n}\n\n.upload-area {\n align-items: center;\n background: rgba($base-overlay-background, 0.8);\n display: flex;\n height: 100%;\n justify-content: center;\n left: 0;\n opacity: 0;\n position: absolute;\n top: 0;\n visibility: hidden;\n width: 100%;\n z-index: 2000;\n\n * {\n pointer-events: none;\n }\n}\n\n.upload-area__drop {\n width: 320px;\n height: 160px;\n display: flex;\n box-sizing: border-box;\n position: relative;\n padding: 8px;\n}\n\n.upload-area__background {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: -1;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 5px rgba($base-shadow-color, 0.2);\n}\n\n.upload-area__content {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: $secondary-text-color;\n font-size: 18px;\n font-weight: 500;\n border: 2px dashed $ui-base-lighter-color;\n border-radius: 4px;\n}\n\n.dropdown--active .emoji-button img {\n opacity: 1;\n filter: none;\n}\n\n.loading-bar {\n background-color: $ui-highlight-color;\n height: 3px;\n position: absolute;\n top: 0;\n left: 0;\n z-index: 9999;\n}\n\n.icon-badge-wrapper {\n position: relative;\n}\n\n.icon-badge {\n position: absolute;\n display: block;\n right: -.25em;\n top: -.25em;\n background-color: $ui-highlight-color;\n border-radius: 50%;\n font-size: 75%;\n width: 1em;\n height: 1em;\n}\n\n.conversation {\n display: flex;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n padding: 5px;\n padding-bottom: 0;\n\n &:focus {\n background: lighten($ui-base-color, 2%);\n outline: 0;\n }\n\n &__avatar {\n flex: 0 0 auto;\n padding: 10px;\n padding-top: 12px;\n position: relative;\n cursor: pointer;\n }\n\n &__unread {\n display: inline-block;\n background: $highlight-text-color;\n border-radius: 50%;\n width: 0.625rem;\n height: 0.625rem;\n margin: -.1ex .15em .1ex;\n }\n\n &__content {\n flex: 1 1 auto;\n padding: 10px 5px;\n padding-right: 15px;\n overflow: hidden;\n\n &__info {\n overflow: hidden;\n display: flex;\n flex-direction: row-reverse;\n justify-content: space-between;\n }\n\n &__relative-time {\n font-size: 15px;\n color: $darker-text-color;\n padding-left: 15px;\n }\n\n &__names {\n color: $darker-text-color;\n font-size: 15px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-bottom: 4px;\n flex-basis: 90px;\n flex-grow: 1;\n\n a {\n color: $primary-text-color;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n }\n\n .status__content {\n margin: 0;\n }\n }\n\n &--unread {\n background: lighten($ui-base-color, 2%);\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n .conversation__content__info {\n font-weight: 700;\n }\n\n .conversation__content__relative-time {\n color: $primary-text-color;\n }\n }\n}\n\n.ui .flash-message {\n margin-top: 10px;\n margin-left: auto;\n margin-right: auto;\n margin-bottom: 0;\n min-width: 75%;\n}\n\n::-webkit-scrollbar-thumb {\n border-radius: 0;\n}\n\nnoscript {\n text-align: center;\n\n img {\n width: 200px;\n opacity: 0.5;\n animation: flicker 4s infinite;\n }\n\n div {\n font-size: 14px;\n margin: 30px auto;\n color: $secondary-text-color;\n max-width: 400px;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n\n a {\n word-break: break-word;\n }\n }\n}\n\n@keyframes flicker {\n 0% { opacity: 1; }\n 30% { opacity: 0.75; }\n 100% { opacity: 1; }\n}\n\n@import 'boost';\n@import 'accounts';\n@import 'domains';\n@import 'status';\n@import 'modal';\n@import 'composer';\n@import 'columns';\n@import 'regeneration_indicator';\n@import 'directory';\n@import 'search';\n@import 'emoji';\n@import 'doodle';\n@import 'drawer';\n@import 'media';\n@import 'sensitive';\n@import 'lists';\n@import 'emoji_picker';\n@import 'local_settings';\n@import 'error_boundary';\n@import 'single_column';\n@import 'announcements';\n","button.icon-button i.fa-retweet {\n background-image: url(\"data:image/svg+xml;utf8,\");\n\n &:hover {\n background-image: url(\"data:image/svg+xml;utf8,\");\n }\n}\n\n// Disabled variant\nbutton.icon-button.disabled i.fa-retweet {\n &, &:hover {\n background-image: url(\"data:image/svg+xml;utf8,\");\n }\n}\n\n// Disabled variant for use with DMs\n.status-direct button.icon-button.disabled i.fa-retweet {\n &, &:hover {\n background-image: url(\"data:image/svg+xml;utf8,\");\n }\n}\n",".account {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n color: inherit;\n text-decoration: none;\n\n .account__display-name {\n flex: 1 1 auto;\n display: block;\n color: $darker-text-color;\n overflow: hidden;\n text-decoration: none;\n font-size: 14px;\n }\n\n &.small {\n border: none;\n padding: 0;\n\n & > .account__avatar-wrapper { margin: 0 8px 0 0 }\n\n & > .display-name {\n height: 24px;\n line-height: 24px;\n }\n }\n}\n\n.account__wrapper {\n display: flex;\n}\n\n.account__avatar-wrapper {\n float: left;\n margin-left: 12px;\n margin-right: 12px;\n}\n\n.account__avatar {\n @include avatar-radius();\n position: relative;\n cursor: pointer;\n\n &-inline {\n display: inline-block;\n vertical-align: middle;\n margin-right: 5px;\n }\n\n &-composite {\n @include avatar-radius;\n overflow: hidden;\n position: relative;\n\n & div {\n @include avatar-radius;\n float: left;\n position: relative;\n box-sizing: border-box;\n }\n\n &__label {\n display: block;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n color: $primary-text-color;\n text-shadow: 1px 1px 2px $base-shadow-color;\n font-weight: 700;\n font-size: 15px;\n }\n }\n}\n\n.account__avatar-overlay {\n position: relative;\n @include avatar-size(48px);\n\n &-base {\n @include avatar-radius();\n @include avatar-size(36px);\n }\n\n &-overlay {\n @include avatar-radius();\n @include avatar-size(24px);\n\n position: absolute;\n bottom: 0;\n right: 0;\n z-index: 1;\n }\n}\n\n.account__relationship {\n height: 18px;\n padding: 10px;\n white-space: nowrap;\n}\n\n.account__header__wrapper {\n flex: 0 0 auto;\n background: lighten($ui-base-color, 4%);\n}\n\n.account__disclaimer {\n padding: 10px;\n color: $dark-text-color;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n font-weight: 500;\n color: inherit;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n}\n\n.account__action-bar {\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n line-height: 36px;\n overflow: hidden;\n flex: 0 0 auto;\n display: flex;\n}\n\n.account__action-bar-links {\n display: flex;\n flex: 1 1 auto;\n line-height: 18px;\n text-align: center;\n}\n\n.account__action-bar__tab {\n text-decoration: none;\n overflow: hidden;\n flex: 0 1 100%;\n border-left: 1px solid lighten($ui-base-color, 8%);\n padding: 10px 0;\n border-bottom: 4px solid transparent;\n\n &:first-child {\n border-left: 0;\n }\n\n &.active {\n border-bottom: 4px solid $ui-highlight-color;\n }\n\n & > span {\n display: block;\n text-transform: uppercase;\n font-size: 11px;\n color: $darker-text-color;\n }\n\n strong {\n display: block;\n font-size: 15px;\n font-weight: 500;\n color: $primary-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n abbr {\n color: $highlight-text-color;\n }\n}\n\n.account-authorize {\n padding: 14px 10px;\n\n .detailed-status__display-name {\n display: block;\n margin-bottom: 15px;\n overflow: hidden;\n }\n}\n\n.account-authorize__avatar {\n float: left;\n margin-right: 10px;\n}\n\n.notification__message {\n margin-left: 42px;\n padding: 8px 0 0 26px;\n cursor: default;\n color: $darker-text-color;\n font-size: 15px;\n position: relative;\n\n .fa {\n color: $highlight-text-color;\n }\n\n > span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.account--panel {\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: row;\n padding: 10px 0;\n}\n\n.account--panel__button,\n.detailed-status__button {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.column-settings__outer {\n background: lighten($ui-base-color, 8%);\n padding: 15px;\n}\n\n.column-settings__section {\n color: $darker-text-color;\n cursor: default;\n display: block;\n font-weight: 500;\n margin-bottom: 10px;\n}\n\n.column-settings__hashtags {\n .column-settings__row {\n margin-bottom: 15px;\n }\n\n .column-select {\n &__control {\n @include search-input();\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n &__placeholder {\n color: $dark-text-color;\n padding-left: 2px;\n font-size: 12px;\n }\n\n &__value-container {\n padding-left: 6px;\n }\n\n &__multi-value {\n background: lighten($ui-base-color, 8%);\n\n &__remove {\n cursor: pointer;\n\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 12%);\n color: lighten($darker-text-color, 4%);\n }\n }\n }\n\n &__multi-value__label,\n &__input {\n color: $darker-text-color;\n }\n\n &__clear-indicator,\n &__dropdown-indicator {\n cursor: pointer;\n transition: none;\n color: $dark-text-color;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($dark-text-color, 4%);\n }\n }\n\n &__indicator-separator {\n background-color: lighten($ui-base-color, 8%);\n }\n\n &__menu {\n @include search-popout();\n padding: 0;\n background: $ui-secondary-color;\n }\n\n &__menu-list {\n padding: 6px;\n }\n\n &__option {\n color: $inverted-text-color;\n border-radius: 4px;\n font-size: 14px;\n\n &--is-focused,\n &--is-selected {\n background: darken($ui-secondary-color, 10%);\n }\n }\n }\n}\n\n.column-settings__row {\n .text-btn {\n margin-bottom: 15px;\n }\n}\n\n.relationship-tag {\n color: $primary-text-color;\n margin-bottom: 4px;\n display: block;\n vertical-align: top;\n background-color: $base-overlay-background;\n text-transform: uppercase;\n font-size: 11px;\n font-weight: 500;\n padding: 4px;\n border-radius: 4px;\n opacity: 0.7;\n\n &:hover {\n opacity: 1;\n }\n}\n\n.account-gallery__container {\n display: flex;\n flex-wrap: wrap;\n padding: 4px 2px;\n}\n\n.account-gallery__item {\n border: none;\n box-sizing: border-box;\n display: block;\n position: relative;\n border-radius: 4px;\n overflow: hidden;\n margin: 2px;\n\n &__icons {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 24px;\n }\n}\n\n.notification__filter-bar,\n.account__section-headline {\n background: darken($ui-base-color, 4%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n display: flex;\n flex-shrink: 0;\n\n button {\n background: darken($ui-base-color, 4%);\n border: 0;\n margin: 0;\n }\n\n button,\n a {\n display: block;\n flex: 1 1 auto;\n color: $darker-text-color;\n padding: 15px 0;\n font-size: 14px;\n font-weight: 500;\n text-align: center;\n text-decoration: none;\n position: relative;\n\n &.active {\n color: $secondary-text-color;\n\n &::before,\n &::after {\n display: block;\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 50%;\n width: 0;\n height: 0;\n transform: translateX(-50%);\n border-style: solid;\n border-width: 0 10px 10px;\n border-color: transparent transparent lighten($ui-base-color, 8%);\n }\n\n &::after {\n bottom: -1px;\n border-color: transparent transparent $ui-base-color;\n }\n }\n }\n\n &.directory__section-headline {\n background: darken($ui-base-color, 2%);\n border-bottom-color: transparent;\n\n a,\n button {\n &.active {\n &::before {\n display: none;\n }\n\n &::after {\n border-color: transparent transparent darken($ui-base-color, 7%);\n }\n }\n }\n }\n}\n\n.account__moved-note {\n padding: 14px 10px;\n padding-bottom: 16px;\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &__message {\n position: relative;\n margin-left: 58px;\n color: $dark-text-color;\n padding: 8px 0;\n padding-top: 0;\n padding-bottom: 4px;\n font-size: 14px;\n\n > span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n &__icon-wrapper {\n left: -26px;\n position: absolute;\n }\n\n .detailed-status__display-avatar {\n position: relative;\n }\n\n .detailed-status__display-name {\n margin-bottom: 0;\n }\n}\n\n.account__header__content {\n color: $darker-text-color;\n font-size: 14px;\n font-weight: 400;\n overflow: hidden;\n word-break: normal;\n word-wrap: break-word;\n\n p {\n margin-bottom: 20px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: inherit;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n}\n\n.account__header {\n overflow: hidden;\n\n &.inactive {\n opacity: 0.5;\n\n .account__header__image,\n .account__avatar {\n filter: grayscale(100%);\n }\n }\n\n &__info {\n position: absolute;\n top: 10px;\n left: 10px;\n }\n\n &__image {\n overflow: hidden;\n height: 145px;\n position: relative;\n background: darken($ui-base-color, 4%);\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n }\n }\n\n &__bar {\n position: relative;\n background: lighten($ui-base-color, 4%);\n padding: 5px;\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n\n .avatar {\n display: block;\n flex: 0 0 auto;\n width: 94px;\n margin-left: -2px;\n\n .account__avatar {\n background: darken($ui-base-color, 8%);\n border: 2px solid lighten($ui-base-color, 4%);\n }\n }\n }\n\n &__tabs {\n display: flex;\n align-items: flex-start;\n padding: 7px 5px;\n margin-top: -55px;\n\n &__buttons {\n display: flex;\n align-items: center;\n padding-top: 55px;\n overflow: hidden;\n\n .icon-button {\n border: 1px solid lighten($ui-base-color, 12%);\n border-radius: 4px;\n box-sizing: content-box;\n padding: 2px;\n }\n\n .button {\n margin: 0 8px;\n }\n }\n\n &__name {\n padding: 5px;\n\n .account-role {\n vertical-align: top;\n }\n\n .emojione {\n width: 22px;\n height: 22px;\n }\n\n h1 {\n font-size: 16px;\n line-height: 24px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n\n small {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n .spacer {\n flex: 1 1 auto;\n }\n }\n\n &__bio {\n overflow: hidden;\n margin: 0 -5px;\n\n .account__header__content {\n padding: 20px 15px;\n padding-bottom: 5px;\n color: $primary-text-color;\n }\n\n .account__header__fields {\n margin: 0;\n border-top: 1px solid lighten($ui-base-color, 12%);\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n }\n\n &__extra {\n margin-top: 4px;\n\n &__links {\n font-size: 14px;\n color: $darker-text-color;\n padding: 10px 0;\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n padding: 5px 10px;\n font-weight: 500;\n\n strong {\n font-weight: 700;\n color: $primary-text-color;\n }\n }\n }\n }\n}\n",".domain {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n .domain__domain-name {\n flex: 1 1 auto;\n display: block;\n color: $primary-text-color;\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n }\n}\n\n.domain__wrapper {\n display: flex;\n}\n\n.domain_buttons {\n height: 18px;\n padding: 10px;\n white-space: nowrap;\n}\n","@keyframes spring-flip-in {\n 0% {\n transform: rotate(0deg);\n }\n\n 30% {\n transform: rotate(-242.4deg);\n }\n\n 60% {\n transform: rotate(-158.35deg);\n }\n\n 90% {\n transform: rotate(-187.5deg);\n }\n\n 100% {\n transform: rotate(-180deg);\n }\n}\n\n@keyframes spring-flip-out {\n 0% {\n transform: rotate(-180deg);\n }\n\n 30% {\n transform: rotate(62.4deg);\n }\n\n 60% {\n transform: rotate(-21.635deg);\n }\n\n 90% {\n transform: rotate(7.5deg);\n }\n\n 100% {\n transform: rotate(0deg);\n }\n}\n\n.status__content--with-action {\n cursor: pointer;\n}\n\n.status__content {\n position: relative;\n margin: 10px 0;\n font-size: 15px;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n overflow: visible;\n padding-top: 5px;\n\n &:focus {\n outline: 0;\n }\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n img {\n max-width: 100%;\n max-height: 400px;\n object-fit: contain;\n }\n\n p, pre, blockquote {\n margin-bottom: 20px;\n white-space: pre-wrap;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .status__content__text,\n .e-content {\n overflow: hidden;\n\n & > ul,\n & > ol {\n margin-bottom: 20px;\n }\n\n h1, h2, h3, h4, h5 {\n margin-top: 20px;\n margin-bottom: 20px;\n }\n\n h1, h2 {\n font-weight: 700;\n font-size: 1.2em;\n }\n\n h2 {\n font-size: 1.1em;\n }\n\n h3, h4, h5 {\n font-weight: 500;\n }\n\n blockquote {\n padding-left: 10px;\n border-left: 3px solid $darker-text-color;\n color: $darker-text-color;\n white-space: normal;\n\n p:last-child {\n margin-bottom: 0;\n }\n }\n\n b, strong {\n font-weight: 700;\n }\n\n em, i {\n font-style: italic;\n }\n\n sub {\n font-size: smaller;\n text-align: sub;\n }\n\n sup {\n font-size: smaller;\n vertical-align: super;\n }\n\n ul, ol {\n margin-left: 1em;\n\n p {\n margin: 0;\n }\n }\n\n ul {\n list-style-type: disc;\n }\n\n ol {\n list-style-type: decimal;\n }\n }\n\n a {\n color: $pleroma-links;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n\n .fa {\n color: lighten($dark-text-color, 7%);\n }\n }\n\n &.mention {\n &:hover {\n text-decoration: none;\n\n span {\n text-decoration: underline;\n }\n }\n }\n\n .fa {\n color: $dark-text-color;\n }\n }\n\n .status__content__spoiler {\n display: none;\n\n &.status__content__spoiler--visible {\n display: block;\n }\n }\n\n a.unhandled-link {\n color: lighten($ui-highlight-color, 8%);\n\n .link-origin-tag {\n color: $gold-star;\n font-size: 0.8em;\n }\n }\n\n .status__content__spoiler-link {\n background: lighten($ui-base-color, 30%);\n\n &:hover {\n background: lighten($ui-base-color, 33%);\n text-decoration: none;\n }\n }\n}\n\n.status__content__spoiler-link {\n display: inline-block;\n border-radius: 2px;\n background: lighten($ui-base-color, 30%);\n border: none;\n color: $inverted-text-color;\n font-weight: 500;\n font-size: 11px;\n padding: 0 5px;\n text-transform: uppercase;\n line-height: inherit;\n cursor: pointer;\n vertical-align: bottom;\n\n &:hover {\n background: lighten($ui-base-color, 33%);\n text-decoration: none;\n }\n\n .status__content__spoiler-icon {\n display: inline-block;\n margin: 0 0 0 5px;\n border-left: 1px solid currentColor;\n padding: 0 0 0 4px;\n font-size: 16px;\n vertical-align: -2px;\n }\n}\n\n.notif-cleaning {\n .status,\n .notification-follow,\n .notification-follow-request {\n padding-right: ($dismiss-overlay-width + 0.5rem);\n }\n}\n\n.status__wrapper--filtered {\n color: $dark-text-color;\n border: 0;\n font-size: inherit;\n text-align: center;\n line-height: inherit;\n margin: 0;\n padding: 15px;\n box-sizing: border-box;\n width: 100%;\n clear: both;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n}\n\n.status__prepend-icon-wrapper {\n left: -26px;\n position: absolute;\n}\n\n.notification-follow,\n.notification-follow-request {\n position: relative;\n\n // same like Status\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n .account {\n border-bottom: 0 none;\n }\n}\n\n.focusable {\n &:focus {\n outline: 0;\n background: lighten($ui-base-color, 4%);\n\n &.status.status-direct:not(.read) {\n background: lighten($ui-base-color, 12%);\n\n &.muted {\n background: transparent;\n }\n }\n\n .detailed-status,\n .detailed-status__action-bar {\n background: lighten($ui-base-color, 8%);\n }\n }\n}\n\n.status {\n padding: 10px 14px;\n position: relative;\n height: auto;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n\n @supports (-ms-overflow-style: -ms-autohiding-scrollbar) {\n // Add margin to avoid Edge auto-hiding scrollbar appearing over content.\n // On Edge 16 this is 16px and Edge <=15 it's 12px, so aim for 16px.\n padding-right: 28px; // 12px + 16px\n }\n\n @keyframes fade {\n 0% { opacity: 0; }\n 100% { opacity: 1; }\n }\n\n opacity: 1;\n animation: fade 150ms linear;\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n }\n\n &.status-direct:not(.read) {\n background: lighten($ui-base-color, 8%);\n border-bottom-color: lighten($ui-base-color, 12%);\n }\n\n &.light {\n .status__relative-time {\n color: $lighter-text-color;\n }\n\n .status__display-name {\n color: $inverted-text-color;\n }\n\n .display-name {\n color: $light-text-color;\n\n strong {\n color: $inverted-text-color;\n }\n }\n\n .status__content {\n color: $inverted-text-color;\n\n a {\n color: $highlight-text-color;\n }\n\n a.status__content__spoiler-link {\n color: $primary-text-color;\n background: $ui-primary-color;\n\n &:hover {\n background: lighten($ui-primary-color, 8%);\n }\n }\n }\n }\n\n &.collapsed {\n background-position: center;\n background-size: cover;\n user-select: none;\n\n &.has-background::before {\n display: block;\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n background-image: linear-gradient(to bottom, rgba($base-shadow-color, .75), rgba($base-shadow-color, .65) 24px, rgba($base-shadow-color, .8));\n pointer-events: none;\n content: \"\";\n }\n\n .display-name:hover .display-name__html {\n text-decoration: none;\n }\n\n .status__content {\n height: 20px;\n overflow: hidden;\n text-overflow: ellipsis;\n padding-top: 0;\n\n &:after {\n content: \"\";\n position: absolute;\n top: 0; bottom: 0;\n left: 0; right: 0;\n background: linear-gradient(rgba($ui-base-color, 0), rgba($ui-base-color, 1));\n pointer-events: none;\n }\n \n a:hover {\n text-decoration: none;\n }\n }\n &:focus > .status__content:after {\n background: linear-gradient(rgba(lighten($ui-base-color, 4%), 0), rgba(lighten($ui-base-color, 4%), 1));\n }\n &.status-direct:not(.read)> .status__content:after {\n background: linear-gradient(rgba(lighten($ui-base-color, 8%), 0), rgba(lighten($ui-base-color, 8%), 1));\n }\n\n .notification__message {\n margin-bottom: 0;\n }\n\n .status__info .notification__message > span {\n white-space: nowrap;\n }\n }\n\n .notification__message {\n margin: -10px 0px 10px 0;\n }\n}\n\n.notification-favourite {\n .status.status-direct {\n background: transparent;\n\n .icon-button.disabled {\n color: lighten($action-button-color, 13%);\n }\n }\n}\n\n.status__relative-time {\n display: inline-block;\n flex-grow: 1;\n color: $dark-text-color;\n font-size: 14px;\n text-align: right;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.status__display-name {\n color: $dark-text-color;\n overflow: hidden;\n}\n\n.status__info__account .status__display-name {\n display: block;\n max-width: 100%;\n}\n\n.status__info {\n display: flex;\n justify-content: space-between;\n font-size: 15px;\n\n > span {\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n .notification__message > span {\n word-wrap: break-word;\n }\n}\n\n.status__info__icons {\n display: flex;\n align-items: center;\n height: 1em;\n color: $action-button-color;\n\n .status__media-icon,\n .status__visibility-icon,\n .status__reply-icon {\n padding-left: 2px;\n padding-right: 2px;\n }\n\n .status__collapse-button.active > .fa-angle-double-up {\n transform: rotate(-180deg);\n }\n}\n\n.no-reduce-motion .status__collapse-button {\n &.activate {\n & > .fa-angle-double-up {\n animation: spring-flip-in 1s linear;\n }\n }\n\n &.deactivate {\n & > .fa-angle-double-up {\n animation: spring-flip-out 1s linear;\n }\n }\n}\n\n.status__info__account {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n}\n\n.status-check-box {\n border-bottom: 1px solid $ui-secondary-color;\n display: flex;\n\n .status-check-box__status {\n margin: 10px 0 10px 10px;\n flex: 1;\n overflow: hidden;\n\n .media-gallery {\n max-width: 250px;\n }\n\n .status__content {\n padding: 0;\n white-space: normal;\n }\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n max-width: 250px;\n }\n\n .media-gallery__item-thumbnail {\n cursor: default;\n }\n }\n}\n\n.status-check-box-toggle {\n align-items: center;\n display: flex;\n flex: 0 0 auto;\n justify-content: center;\n padding: 10px;\n}\n\n.status__prepend {\n margin-top: -10px;\n margin-bottom: 10px;\n margin-left: 58px;\n color: $dark-text-color;\n padding: 8px 0;\n padding-bottom: 2px;\n font-size: 14px;\n position: relative;\n\n .status__display-name strong {\n color: $dark-text-color;\n }\n\n > span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.status__action-bar {\n align-items: center;\n display: flex;\n margin-top: 8px;\n\n &__counter {\n display: inline-flex;\n margin-right: 11px;\n align-items: center;\n\n .status__action-bar-button {\n margin-right: 4px;\n }\n\n &__label {\n display: inline-block;\n width: 14px;\n font-size: 12px;\n font-weight: 500;\n color: $action-button-color;\n }\n }\n}\n\n.status__action-bar-button {\n margin-right: 18px;\n}\n\n.status__action-bar-dropdown {\n height: 23.15px;\n width: 23.15px;\n}\n\n.detailed-status__action-bar-dropdown {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n}\n\n.detailed-status {\n background: lighten($ui-base-color, 4%);\n padding: 14px 10px;\n\n &--flex {\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n align-items: flex-start;\n\n .status__content,\n .detailed-status__meta {\n flex: 100%;\n }\n }\n\n .status__content {\n font-size: 19px;\n line-height: 24px;\n\n .emojione {\n width: 24px;\n height: 24px;\n margin: -1px 0 0;\n }\n }\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n }\n}\n\n.detailed-status__meta {\n margin-top: 15px;\n color: $dark-text-color;\n font-size: 14px;\n line-height: 18px;\n}\n\n.detailed-status__action-bar {\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: row;\n padding: 10px 0;\n}\n\n.detailed-status__link {\n color: inherit;\n text-decoration: none;\n}\n\n.detailed-status__favorites,\n.detailed-status__reblogs {\n display: inline-block;\n font-weight: 500;\n font-size: 12px;\n margin-left: 6px;\n}\n\n.status__display-name,\n.status__relative-time,\n.detailed-status__display-name,\n.detailed-status__datetime,\n.detailed-status__application,\n.account__display-name {\n text-decoration: none;\n}\n\n.status__display-name,\n.account__display-name {\n strong {\n color: $primary-text-color;\n }\n}\n\n.muted {\n .emojione {\n opacity: 0.5;\n }\n}\n\na.status__display-name,\n.reply-indicator__display-name,\n.detailed-status__display-name,\n.account__display-name {\n &:hover strong {\n text-decoration: underline;\n }\n}\n\n.account__display-name strong {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.detailed-status__application,\n.detailed-status__datetime {\n color: inherit;\n}\n\n.detailed-status .button.logo-button {\n margin-bottom: 15px;\n}\n\n.detailed-status__display-name {\n color: $secondary-text-color;\n display: block;\n line-height: 24px;\n margin-bottom: 15px;\n overflow: hidden;\n\n strong,\n span {\n display: block;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n strong {\n font-size: 16px;\n color: $primary-text-color;\n }\n}\n\n.detailed-status__display-avatar {\n float: left;\n margin-right: 10px;\n}\n\n.status__avatar {\n flex: none;\n margin: 0 10px 0 0;\n height: 48px;\n width: 48px;\n}\n\n.muted {\n .status__content,\n .status__content p,\n .status__content a,\n .status__content__text {\n color: $dark-text-color;\n }\n\n .status__display-name strong {\n color: $dark-text-color;\n }\n\n .status__avatar {\n opacity: 0.5;\n }\n\n a.status__content__spoiler-link {\n background: $ui-base-lighter-color;\n color: $inverted-text-color;\n\n &:hover {\n background: lighten($ui-base-color, 29%);\n text-decoration: none;\n }\n }\n}\n\n.status__relative-time,\n.detailed-status__datetime {\n &:hover {\n text-decoration: underline;\n }\n}\n\n.status-card {\n display: flex;\n font-size: 14px;\n border: 1px solid lighten($ui-base-color, 8%);\n border-radius: 4px;\n color: $dark-text-color;\n margin-top: 14px;\n text-decoration: none;\n overflow: hidden;\n\n &__actions {\n bottom: 0;\n left: 0;\n position: absolute;\n right: 0;\n top: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n\n & > div {\n background: rgba($base-shadow-color, 0.6);\n border-radius: 8px;\n padding: 12px 9px;\n flex: 0 0 auto;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n button,\n a {\n display: inline;\n color: $secondary-text-color;\n background: transparent;\n border: 0;\n padding: 0 8px;\n text-decoration: none;\n font-size: 18px;\n line-height: 18px;\n\n &:hover,\n &:active,\n &:focus {\n color: $primary-text-color;\n }\n }\n\n a {\n font-size: 19px;\n position: relative;\n bottom: -1px;\n }\n\n a .fa, a:hover .fa {\n color: inherit;\n }\n }\n}\n\na.status-card {\n cursor: pointer;\n\n &:hover {\n background: lighten($ui-base-color, 8%);\n }\n}\n\n.status-card-photo {\n cursor: zoom-in;\n display: block;\n text-decoration: none;\n width: 100%;\n height: auto;\n margin: 0;\n}\n\n.status-card-video {\n iframe {\n width: 100%;\n height: 100%;\n }\n}\n\n.status-card__title {\n display: block;\n font-weight: 500;\n margin-bottom: 5px;\n color: $darker-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-decoration: none;\n}\n\n.status-card__content {\n flex: 1 1 auto;\n overflow: hidden;\n padding: 14px 14px 14px 8px;\n}\n\n.status-card__description {\n color: $darker-text-color;\n}\n\n.status-card__host {\n display: block;\n margin-top: 5px;\n font-size: 13px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.status-card__image {\n flex: 0 0 100px;\n background: lighten($ui-base-color, 8%);\n position: relative;\n\n & > .fa {\n font-size: 21px;\n position: absolute;\n transform-origin: 50% 50%;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n}\n\n.status-card.horizontal {\n display: block;\n\n .status-card__image {\n width: 100%;\n }\n\n .status-card__image-image {\n border-radius: 4px 4px 0 0;\n }\n\n .status-card__title {\n white-space: inherit;\n }\n}\n\n.status-card.compact {\n border-color: lighten($ui-base-color, 4%);\n\n &.interactive {\n border: 0;\n }\n\n .status-card__content {\n padding: 8px;\n padding-top: 10px;\n }\n\n .status-card__title {\n white-space: nowrap;\n }\n\n .status-card__image {\n flex: 0 0 60px;\n }\n}\n\na.status-card.compact:hover {\n background-color: lighten($ui-base-color, 4%);\n}\n\n.status-card__image-image {\n border-radius: 4px 0 0 4px;\n display: block;\n margin: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n background-size: cover;\n background-position: center center;\n}\n\n.attachment-list {\n display: flex;\n font-size: 14px;\n border: 1px solid lighten($ui-base-color, 8%);\n border-radius: 4px;\n margin-top: 14px;\n overflow: hidden;\n\n &__icon {\n flex: 0 0 auto;\n color: $dark-text-color;\n padding: 8px 18px;\n cursor: default;\n border-right: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n font-size: 26px;\n\n .fa {\n display: block;\n }\n }\n\n &__list {\n list-style: none;\n padding: 4px 0;\n padding-left: 8px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n\n li {\n display: block;\n padding: 4px 0;\n }\n\n a {\n text-decoration: none;\n color: $dark-text-color;\n font-weight: 500;\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n &.compact {\n border: 0;\n margin-top: 4px;\n\n .attachment-list__list {\n padding: 0;\n display: block;\n }\n\n .fa {\n color: $dark-text-color;\n }\n }\n}\n\n.status__wrapper--filtered__button {\n display: inline;\n color: lighten($ui-highlight-color, 8%);\n border: 0;\n background: transparent;\n padding: 0;\n font-size: inherit;\n line-height: inherit;\n\n &:hover,\n &:active {\n text-decoration: underline;\n }\n}\n",".modal-container--preloader {\n background: lighten($ui-base-color, 8%);\n}\n\n.modal-root {\n position: relative;\n transition: opacity 0.3s linear;\n will-change: opacity;\n z-index: 9999;\n}\n\n.modal-root__overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba($base-overlay-background, 0.7);\n}\n\n.modal-root__container {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n align-content: space-around;\n z-index: 9999;\n pointer-events: none;\n user-select: none;\n}\n\n.modal-root__modal {\n pointer-events: auto;\n display: flex;\n z-index: 9999;\n}\n\n.onboarding-modal,\n.error-modal,\n.embed-modal {\n background: $ui-secondary-color;\n color: $inverted-text-color;\n border-radius: 8px;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.onboarding-modal__pager {\n height: 80vh;\n width: 80vw;\n max-width: 520px;\n max-height: 470px;\n\n .react-swipeable-view-container > div {\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n display: none;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n display: flex;\n user-select: text;\n }\n}\n\n.error-modal__body {\n height: 80vh;\n width: 80vw;\n max-width: 520px;\n max-height: 420px;\n position: relative;\n\n & > div {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n padding: 25px;\n display: none;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n display: flex;\n opacity: 0;\n user-select: text;\n }\n}\n\n.error-modal__body {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n text-align: center;\n}\n\n@media screen and (max-width: 550px) {\n .onboarding-modal {\n width: 100%;\n height: 100%;\n border-radius: 0;\n }\n\n .onboarding-modal__pager {\n width: 100%;\n height: auto;\n max-width: none;\n max-height: none;\n flex: 1 1 auto;\n }\n}\n\n.onboarding-modal__paginator,\n.error-modal__footer {\n flex: 0 0 auto;\n background: darken($ui-secondary-color, 8%);\n display: flex;\n padding: 25px;\n\n & > div {\n min-width: 33px;\n }\n\n .onboarding-modal__nav,\n .error-modal__nav {\n color: $lighter-text-color;\n border: 0;\n font-size: 14px;\n font-weight: 500;\n padding: 10px 25px;\n line-height: inherit;\n height: auto;\n margin: -10px;\n border-radius: 4px;\n background-color: transparent;\n\n &:hover,\n &:focus,\n &:active {\n color: darken($lighter-text-color, 4%);\n background-color: darken($ui-secondary-color, 16%);\n }\n\n &.onboarding-modal__done,\n &.onboarding-modal__next {\n color: $inverted-text-color;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($inverted-text-color, 4%);\n }\n }\n }\n}\n\n.error-modal__footer {\n justify-content: center;\n}\n\n.onboarding-modal__dots {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.onboarding-modal__dot {\n width: 14px;\n height: 14px;\n border-radius: 14px;\n background: darken($ui-secondary-color, 16%);\n margin: 0 3px;\n cursor: pointer;\n\n &:hover {\n background: darken($ui-secondary-color, 18%);\n }\n\n &.active {\n cursor: default;\n background: darken($ui-secondary-color, 24%);\n }\n}\n\n.onboarding-modal__page__wrapper {\n pointer-events: none;\n padding: 25px;\n padding-bottom: 0;\n\n &.onboarding-modal__page__wrapper--active {\n pointer-events: auto;\n }\n}\n\n.onboarding-modal__page {\n cursor: default;\n line-height: 21px;\n\n h1 {\n font-size: 18px;\n font-weight: 500;\n color: $inverted-text-color;\n margin-bottom: 20px;\n }\n\n a {\n color: $highlight-text-color;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($highlight-text-color, 4%);\n }\n }\n\n .navigation-bar a {\n color: inherit;\n }\n\n p {\n font-size: 16px;\n color: $lighter-text-color;\n margin-top: 10px;\n margin-bottom: 10px;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n strong {\n font-weight: 500;\n background: $ui-base-color;\n color: $secondary-text-color;\n border-radius: 4px;\n font-size: 14px;\n padding: 3px 6px;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n }\n}\n\n.onboarding-modal__page__wrapper-0 {\n height: 100%;\n padding: 0;\n}\n\n.onboarding-modal__page-one {\n &__lead {\n padding: 65px;\n padding-top: 45px;\n padding-bottom: 0;\n margin-bottom: 10px;\n\n h1 {\n font-size: 26px;\n line-height: 36px;\n margin-bottom: 8px;\n }\n\n p {\n margin-bottom: 0;\n }\n }\n\n &__extra {\n padding-right: 65px;\n padding-left: 185px;\n text-align: center;\n }\n}\n\n.display-case {\n text-align: center;\n font-size: 15px;\n margin-bottom: 15px;\n\n &__label {\n font-weight: 500;\n color: $inverted-text-color;\n margin-bottom: 5px;\n text-transform: uppercase;\n font-size: 12px;\n }\n\n &__case {\n background: $ui-base-color;\n color: $secondary-text-color;\n font-weight: 500;\n padding: 10px;\n border-radius: 4px;\n }\n}\n\n.onboarding-modal__page-two,\n.onboarding-modal__page-three,\n.onboarding-modal__page-four,\n.onboarding-modal__page-five {\n p {\n text-align: left;\n }\n\n .figure {\n background: darken($ui-base-color, 8%);\n color: $secondary-text-color;\n margin-bottom: 20px;\n border-radius: 4px;\n padding: 10px;\n text-align: center;\n font-size: 14px;\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.3);\n\n .onboarding-modal__image {\n border-radius: 4px;\n margin-bottom: 10px;\n }\n\n &.non-interactive {\n pointer-events: none;\n text-align: left;\n }\n }\n}\n\n.onboarding-modal__page-four__columns {\n .row {\n display: flex;\n margin-bottom: 20px;\n\n & > div {\n flex: 1 1 0;\n margin: 0 10px;\n\n &:first-child {\n margin-left: 0;\n }\n\n &:last-child {\n margin-right: 0;\n }\n\n p {\n text-align: center;\n }\n }\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .column-header {\n color: $primary-text-color;\n }\n}\n\n@media screen and (max-width: 320px) and (max-height: 600px) {\n .onboarding-modal__page p {\n font-size: 14px;\n line-height: 20px;\n }\n\n .onboarding-modal__page-two .figure,\n .onboarding-modal__page-three .figure,\n .onboarding-modal__page-four .figure,\n .onboarding-modal__page-five .figure {\n font-size: 12px;\n margin-bottom: 10px;\n }\n\n .onboarding-modal__page-four__columns .row {\n margin-bottom: 10px;\n }\n\n .onboarding-modal__page-four__columns .column-header {\n padding: 5px;\n font-size: 12px;\n }\n}\n\n.onboard-sliders {\n display: inline-block;\n max-width: 30px;\n max-height: auto;\n margin-left: 10px;\n}\n\n.boost-modal,\n.favourite-modal,\n.confirmation-modal,\n.report-modal,\n.actions-modal,\n.mute-modal,\n.block-modal {\n background: lighten($ui-secondary-color, 8%);\n color: $inverted-text-color;\n border-radius: 8px;\n overflow: hidden;\n max-width: 90vw;\n width: 480px;\n position: relative;\n flex-direction: column;\n\n .status__relative-time {\n color: $dark-text-color;\n float: right;\n font-size: 14px;\n width: auto;\n margin: initial;\n padding: initial;\n }\n\n .status__display-name {\n display: flex;\n }\n\n .status__avatar {\n height: 48px;\n width: 48px;\n }\n\n .status__content__spoiler-link {\n color: lighten($secondary-text-color, 8%);\n }\n}\n\n.actions-modal {\n .status {\n background: $white;\n border-bottom-color: $ui-secondary-color;\n padding-top: 10px;\n padding-bottom: 10px;\n }\n\n .dropdown-menu__separator {\n border-bottom-color: $ui-secondary-color;\n }\n}\n\n.boost-modal__container,\n.favourite-modal__container {\n overflow-x: scroll;\n padding: 10px;\n\n .status {\n user-select: text;\n border-bottom: 0;\n }\n}\n\n.boost-modal__action-bar,\n.favourite-modal__action-bar,\n.confirmation-modal__action-bar,\n.mute-modal__action-bar,\n.block-modal__action-bar {\n display: flex;\n justify-content: space-between;\n background: $ui-secondary-color;\n padding: 10px;\n line-height: 36px;\n\n & > div {\n flex: 1 1 auto;\n text-align: right;\n color: $lighter-text-color;\n padding-right: 10px;\n }\n\n .button {\n flex: 0 0 auto;\n }\n}\n\n.boost-modal__status-header,\n.favourite-modal__status-header {\n font-size: 15px;\n}\n\n.boost-modal__status-time,\n.favourite-modal__status-time {\n float: right;\n font-size: 14px;\n}\n\n.mute-modal,\n.block-modal {\n line-height: 24px;\n}\n\n.mute-modal .react-toggle,\n.block-modal .react-toggle {\n vertical-align: middle;\n}\n\n.report-modal {\n width: 90vw;\n max-width: 700px;\n}\n\n.report-modal__container {\n display: flex;\n border-top: 1px solid $ui-secondary-color;\n\n @media screen and (max-width: 480px) {\n flex-wrap: wrap;\n overflow-y: auto;\n }\n}\n\n.report-modal__statuses,\n.report-modal__comment {\n box-sizing: border-box;\n width: 50%;\n\n @media screen and (max-width: 480px) {\n width: 100%;\n }\n}\n\n.report-modal__statuses,\n.focal-point-modal__content {\n flex: 1 1 auto;\n min-height: 20vh;\n max-height: 80vh;\n overflow-y: auto;\n overflow-x: hidden;\n\n .status__content a {\n color: $highlight-text-color;\n }\n\n @media screen and (max-width: 480px) {\n max-height: 10vh;\n }\n}\n\n.focal-point-modal__content {\n @media screen and (max-width: 480px) {\n max-height: 40vh;\n }\n}\n\n.report-modal__comment {\n padding: 20px;\n border-right: 1px solid $ui-secondary-color;\n max-width: 320px;\n\n p {\n font-size: 14px;\n line-height: 20px;\n margin-bottom: 20px;\n }\n\n .setting-text {\n display: block;\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n color: $inverted-text-color;\n background: $white;\n padding: 10px;\n font-family: inherit;\n font-size: 14px;\n resize: none;\n border: 0;\n outline: 0;\n border-radius: 4px;\n border: 1px solid $ui-secondary-color;\n min-height: 100px;\n max-height: 50vh;\n margin-bottom: 10px;\n\n &:focus {\n border: 1px solid darken($ui-secondary-color, 8%);\n }\n\n &__wrapper {\n background: $white;\n border: 1px solid $ui-secondary-color;\n margin-bottom: 10px;\n border-radius: 4px;\n\n .setting-text {\n border: 0;\n margin-bottom: 0;\n border-radius: 0;\n\n &:focus {\n border: 0;\n }\n }\n\n &__modifiers {\n color: $inverted-text-color;\n font-family: inherit;\n font-size: 14px;\n background: $white;\n }\n }\n\n &__toolbar {\n display: flex;\n justify-content: space-between;\n margin-bottom: 20px;\n }\n }\n\n .setting-text-label {\n display: block;\n color: $inverted-text-color;\n font-size: 14px;\n font-weight: 500;\n margin-bottom: 10px;\n }\n\n .setting-toggle {\n margin-top: 20px;\n margin-bottom: 24px;\n\n &__label {\n color: $inverted-text-color;\n font-size: 14px;\n }\n }\n\n @media screen and (max-width: 480px) {\n padding: 10px;\n max-width: 100%;\n order: 2;\n\n .setting-toggle {\n margin-bottom: 4px;\n }\n }\n}\n\n.actions-modal {\n .status {\n overflow-y: auto;\n max-height: 300px;\n }\n\n strong {\n display: block;\n font-weight: 500;\n }\n\n max-height: 80vh;\n max-width: 80vw;\n\n .actions-modal__item-label {\n font-weight: 500;\n }\n\n ul {\n overflow-y: auto;\n flex-shrink: 0;\n max-height: 80vh;\n\n &.with-status {\n max-height: calc(80vh - 75px);\n }\n\n li:empty {\n margin: 0;\n }\n\n li:not(:empty) {\n a {\n color: $inverted-text-color;\n display: flex;\n padding: 12px 16px;\n font-size: 15px;\n align-items: center;\n text-decoration: none;\n\n &,\n button {\n transition: none;\n }\n\n &.active,\n &:hover,\n &:active,\n &:focus {\n &,\n button {\n background: $ui-highlight-color;\n color: $primary-text-color;\n }\n }\n\n & > .react-toggle,\n & > .icon,\n button:first-child {\n margin-right: 10px;\n }\n }\n }\n }\n}\n\n.confirmation-modal__action-bar,\n.mute-modal__action-bar,\n.block-modal__action-bar {\n .confirmation-modal__secondary-button {\n flex-shrink: 1;\n }\n}\n\n.confirmation-modal__secondary-button,\n.confirmation-modal__cancel-button,\n.mute-modal__cancel-button,\n.block-modal__cancel-button {\n background-color: transparent;\n color: $lighter-text-color;\n font-size: 14px;\n font-weight: 500;\n\n &:hover,\n &:focus,\n &:active {\n color: darken($lighter-text-color, 4%);\n background-color: transparent;\n }\n}\n\n.confirmation-modal__do_not_ask_again {\n padding-left: 20px;\n padding-right: 20px;\n padding-bottom: 10px;\n\n font-size: 14px;\n\n label, input {\n vertical-align: middle;\n }\n}\n\n.confirmation-modal__container,\n.mute-modal__container,\n.block-modal__container,\n.report-modal__target {\n padding: 30px;\n font-size: 16px;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n}\n\n.confirmation-modal__container,\n.report-modal__target {\n text-align: center;\n}\n\n.block-modal,\n.mute-modal {\n &__explanation {\n margin-top: 20px;\n }\n\n .setting-toggle {\n margin-top: 20px;\n margin-bottom: 24px;\n display: flex;\n align-items: center;\n\n &__label {\n color: $inverted-text-color;\n margin: 0;\n margin-left: 8px;\n }\n }\n}\n\n.report-modal__target {\n padding: 15px;\n\n .media-modal__close {\n top: 14px;\n right: 15px;\n }\n}\n\n.embed-modal {\n width: auto;\n max-width: 80vw;\n max-height: 80vh;\n\n h4 {\n padding: 30px;\n font-weight: 500;\n font-size: 16px;\n text-align: center;\n }\n\n .embed-modal__container {\n padding: 10px;\n\n .hint {\n margin-bottom: 15px;\n }\n\n .embed-modal__html {\n outline: 0;\n box-sizing: border-box;\n display: block;\n width: 100%;\n border: none;\n padding: 10px;\n font-family: 'mastodon-font-monospace', monospace;\n background: $ui-base-color;\n color: $primary-text-color;\n font-size: 14px;\n margin: 0;\n margin-bottom: 15px;\n border-radius: 4px;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n .embed-modal__iframe {\n width: 400px;\n max-width: 100%;\n overflow: hidden;\n border: 0;\n border-radius: 4px;\n }\n }\n}\n\n.focal-point {\n position: relative;\n cursor: move;\n overflow: hidden;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n background: $base-shadow-color;\n\n img,\n video,\n canvas {\n display: block;\n max-height: 80vh;\n width: 100%;\n height: auto;\n margin: 0;\n object-fit: contain;\n background: $base-shadow-color;\n }\n\n &__reticle {\n position: absolute;\n width: 100px;\n height: 100px;\n transform: translate(-50%, -50%);\n background: url('~images/reticle.png') no-repeat 0 0;\n border-radius: 50%;\n box-shadow: 0 0 0 9999em rgba($base-shadow-color, 0.35);\n }\n\n &__overlay {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n }\n\n &__preview {\n position: absolute;\n bottom: 10px;\n right: 10px;\n z-index: 2;\n cursor: move;\n transition: opacity 0.1s ease;\n\n &:hover {\n opacity: 0.5;\n }\n\n strong {\n color: $primary-text-color;\n font-size: 14px;\n font-weight: 500;\n display: block;\n margin-bottom: 5px;\n }\n\n div {\n border-radius: 4px;\n box-shadow: 0 0 14px rgba($base-shadow-color, 0.2);\n }\n }\n\n @media screen and (max-width: 480px) {\n img,\n video {\n max-height: 100%;\n }\n\n &__preview {\n display: none;\n }\n }\n}\n\n.filtered-status-info {\n text-align: start;\n\n .spoiler__text {\n margin-top: 20px;\n }\n\n .account {\n border-bottom: 0;\n }\n\n .account__display-name strong {\n color: $inverted-text-color;\n }\n\n .status__content__spoiler {\n display: none;\n\n &--visible {\n display: flex;\n }\n }\n\n ul {\n padding: 10px;\n margin-left: 12px;\n list-style: disc inside;\n }\n\n .filtered-status-edit-link {\n color: $action-button-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline\n }\n }\n}\n",".composer {\n padding: 10px;\n\n .emoji-picker-dropdown {\n position: absolute;\n top: 0;\n right: 0;\n\n ::-webkit-scrollbar-track:hover,\n ::-webkit-scrollbar-track:active {\n background-color: rgba($base-overlay-background, 0.3);\n }\n }\n}\n\n.character-counter {\n cursor: default;\n font-family: $font-sans-serif, sans-serif;\n font-size: 14px;\n font-weight: 600;\n color: $lighter-text-color;\n\n &.character-counter--over {\n color: $warning-red;\n }\n}\n\n.no-reduce-motion .composer--spoiler {\n transition: height 0.4s ease, opacity 0.4s ease;\n}\n\n.composer--spoiler {\n height: 0;\n transform-origin: bottom;\n opacity: 0.0;\n\n &.composer--spoiler--visible {\n height: 36px;\n margin-bottom: 11px;\n opacity: 1.0;\n }\n\n input {\n display: block;\n box-sizing: border-box;\n margin: 0;\n border: none;\n border-radius: 4px;\n padding: 10px;\n width: 100%;\n outline: 0;\n color: $inverted-text-color;\n background: $simple-background-color;\n font-size: 14px;\n font-family: inherit;\n resize: vertical;\n\n &::placeholder {\n color: $dark-text-color;\n }\n\n &:focus { outline: 0 }\n @include single-column('screen and (max-width: 630px)') { font-size: 16px }\n }\n}\n\n.composer--warning {\n color: $inverted-text-color;\n margin-bottom: 15px;\n background: $ui-primary-color;\n box-shadow: 0 2px 6px rgba($base-shadow-color, 0.3);\n padding: 8px 10px;\n border-radius: 4px;\n font-size: 13px;\n font-weight: 400;\n\n a {\n color: $lighter-text-color;\n font-weight: 500;\n text-decoration: underline;\n\n &:active,\n &:focus,\n &:hover { text-decoration: none }\n }\n}\n\n.compose-form__sensitive-button {\n padding: 10px;\n padding-top: 0;\n\n font-size: 14px;\n font-weight: 500;\n\n &.active {\n color: $highlight-text-color;\n }\n\n input[type=checkbox] {\n display: none;\n }\n\n .checkbox {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-left: 5px;\n margin-right: 10px;\n top: -1px;\n border-radius: 4px;\n vertical-align: middle;\n\n &.active {\n border-color: $highlight-text-color;\n background: $highlight-text-color;\n }\n }\n}\n\n.composer--reply {\n margin: 0 0 10px;\n border-radius: 4px;\n padding: 10px;\n background: $ui-primary-color;\n min-height: 23px;\n overflow-y: auto;\n flex: 0 2 auto;\n\n & > header {\n margin-bottom: 5px;\n overflow: hidden;\n\n & > .account.small { color: $inverted-text-color; }\n\n & > .cancel {\n float: right;\n line-height: 24px;\n }\n }\n\n & > .content {\n position: relative;\n margin: 10px 0;\n padding: 0 12px;\n font-size: 14px;\n line-height: 20px;\n color: $inverted-text-color;\n word-wrap: break-word;\n font-weight: 400;\n overflow: visible;\n white-space: pre-wrap;\n padding-top: 5px;\n overflow: hidden;\n\n p, pre, blockquote {\n margin-bottom: 20px;\n white-space: pre-wrap;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n h1, h2, h3, h4, h5 {\n margin-top: 20px;\n margin-bottom: 20px;\n }\n\n h1, h2 {\n font-weight: 700;\n font-size: 18px;\n }\n\n h2 {\n font-size: 16px;\n }\n\n h3, h4, h5 {\n font-weight: 500;\n }\n\n blockquote {\n padding-left: 10px;\n border-left: 3px solid $inverted-text-color;\n color: $inverted-text-color;\n white-space: normal;\n\n p:last-child {\n margin-bottom: 0;\n }\n }\n\n b, strong {\n font-weight: 700;\n }\n\n em, i {\n font-style: italic;\n }\n\n sub {\n font-size: smaller;\n text-align: sub;\n }\n\n ul, ol {\n margin-left: 1em;\n\n p {\n margin: 0;\n }\n }\n\n ul {\n list-style-type: disc;\n }\n\n ol {\n list-style-type: decimal;\n }\n\n a {\n color: $lighter-text-color;\n text-decoration: none;\n\n &:hover { text-decoration: underline }\n\n &.mention {\n &:hover {\n text-decoration: none;\n\n span { text-decoration: underline }\n }\n }\n }\n }\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -5px 0 0;\n }\n}\n\n.compose-form__autosuggest-wrapper,\n.autosuggest-input {\n position: relative;\n width: 100%;\n\n label {\n .autosuggest-textarea__textarea {\n display: block;\n box-sizing: border-box;\n margin: 0;\n border: none;\n border-radius: 4px 4px 0 0;\n padding: 10px 32px 0 10px;\n width: 100%;\n min-height: 100px;\n outline: 0;\n color: $inverted-text-color;\n background: $simple-background-color;\n font-size: 14px;\n font-family: inherit;\n resize: none;\n scrollbar-color: initial;\n\n &::placeholder {\n color: $dark-text-color;\n }\n\n &::-webkit-scrollbar {\n all: unset;\n }\n\n &:disabled { background: $ui-secondary-color }\n &:focus { outline: 0 }\n @include single-column('screen and (max-width: 630px)') { font-size: 16px }\n\n @include limited-single-column('screen and (max-width: 600px)') {\n height: 100px !important; // prevent auto-resize textarea\n resize: vertical;\n }\n }\n }\n}\n\n.composer--textarea--icons {\n display: block;\n position: absolute;\n top: 29px;\n right: 5px;\n bottom: 5px;\n overflow: hidden;\n\n & > .textarea_icon {\n display: block;\n margin: 2px 0 0 2px;\n width: 24px;\n height: 24px;\n color: $lighter-text-color;\n font-size: 18px;\n line-height: 24px;\n text-align: center;\n opacity: .8;\n }\n}\n\n.autosuggest-textarea__suggestions-wrapper {\n position: relative;\n height: 0;\n}\n\n.autosuggest-textarea__suggestions {\n display: block;\n position: absolute;\n box-sizing: border-box;\n top: 100%;\n border-radius: 0 0 4px 4px;\n padding: 6px;\n width: 100%;\n color: $inverted-text-color;\n background: $ui-secondary-color;\n box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4);\n font-size: 14px;\n z-index: 99;\n display: none;\n}\n\n.autosuggest-textarea__suggestions--visible {\n display: block;\n}\n\n.autosuggest-textarea__suggestions__item {\n padding: 10px;\n cursor: pointer;\n border-radius: 4px;\n\n &:hover,\n &:focus,\n &:active,\n &.selected { background: darken($ui-secondary-color, 10%) }\n\n > .account,\n > .emoji,\n > .autosuggest-hashtag {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: flex-start;\n line-height: 18px;\n font-size: 14px;\n }\n\n .autosuggest-hashtag {\n justify-content: space-between;\n\n &__name {\n flex: 1 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n strong {\n font-weight: 500;\n }\n\n &__uses {\n flex: 0 0 auto;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n }\n\n & > .account.small {\n .display-name {\n & > span { color: $lighter-text-color }\n }\n }\n}\n\n.composer--upload_form {\n overflow: hidden;\n\n & > .content {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n font-family: inherit;\n padding: 5px;\n overflow: hidden;\n }\n}\n\n.composer--upload_form--item {\n flex: 1 1 0;\n margin: 5px;\n min-width: 40%;\n\n & > div {\n position: relative;\n border-radius: 4px;\n height: 140px;\n width: 100%;\n background-color: $base-shadow-color;\n background-position: center;\n background-size: cover;\n background-repeat: no-repeat;\n overflow: hidden;\n\n textarea {\n display: block;\n position: absolute;\n box-sizing: border-box;\n bottom: 0;\n left: 0;\n margin: 0;\n border: 0;\n padding: 10px;\n width: 100%;\n color: $secondary-text-color;\n background: linear-gradient(0deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);\n font-size: 14px;\n font-family: inherit;\n font-weight: 500;\n opacity: 0;\n z-index: 2;\n transition: opacity .1s ease;\n\n &:focus { color: $white }\n\n &::placeholder {\n opacity: 0.54;\n color: $secondary-text-color;\n }\n }\n\n & > .close { mix-blend-mode: difference }\n }\n\n &.active {\n & > div {\n textarea { opacity: 1 }\n }\n }\n}\n\n.composer--upload_form--actions {\n background: linear-gradient(180deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n opacity: 0;\n transition: opacity .1s ease;\n\n .icon-button {\n flex: 0 1 auto;\n color: $ui-secondary-color;\n font-size: 14px;\n font-weight: 500;\n padding: 10px;\n font-family: inherit;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($ui-secondary-color, 4%);\n }\n }\n\n &.active {\n opacity: 1;\n }\n}\n\n.composer--upload_form--progress {\n display: flex;\n padding: 10px;\n color: $darker-text-color;\n overflow: hidden;\n\n & > .fa {\n font-size: 34px;\n margin-right: 10px;\n }\n\n & > .message {\n flex: 1 1 auto;\n\n & > span {\n display: block;\n font-size: 12px;\n font-weight: 500;\n text-transform: uppercase;\n }\n\n & > .backdrop {\n position: relative;\n margin-top: 5px;\n border-radius: 6px;\n width: 100%;\n height: 6px;\n background: $ui-base-lighter-color;\n\n & > .tracker {\n position: absolute;\n top: 0;\n left: 0;\n height: 6px;\n border-radius: 6px;\n background: $ui-highlight-color;\n }\n }\n }\n}\n\n.compose-form__modifiers {\n color: $inverted-text-color;\n font-family: inherit;\n font-size: 14px;\n background: $simple-background-color;\n}\n\n.composer--options-wrapper {\n padding: 10px;\n background: darken($simple-background-color, 8%);\n border-radius: 0 0 4px 4px;\n height: 27px;\n display: flex;\n justify-content: space-between;\n flex: 0 0 auto;\n}\n\n.composer--options {\n display: flex;\n flex: 0 0 auto;\n\n & > * {\n display: inline-block;\n box-sizing: content-box;\n padding: 0 3px;\n height: 27px;\n line-height: 27px;\n vertical-align: bottom;\n }\n\n & > hr {\n display: inline-block;\n margin: 0 3px;\n border-width: 0 0 0 1px;\n border-style: none none none solid;\n border-color: transparent transparent transparent darken($simple-background-color, 24%);\n padding: 0;\n width: 0;\n height: 27px;\n background: transparent;\n }\n}\n\n.compose--counter-wrapper {\n align-self: center;\n margin-right: 4px;\n}\n\n.composer--options--dropdown {\n &.open {\n & > .value {\n border-radius: 4px 4px 0 0;\n box-shadow: 0 -4px 4px rgba($base-shadow-color, 0.1);\n color: $primary-text-color;\n background: $ui-highlight-color;\n transition: none;\n }\n &.top {\n & > .value {\n border-radius: 0 0 4px 4px;\n box-shadow: 0 4px 4px rgba($base-shadow-color, 0.1);\n }\n }\n }\n}\n\n.composer--options--dropdown--content {\n position: absolute;\n border-radius: 4px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n background: $simple-background-color;\n overflow: hidden;\n transform-origin: 50% 0;\n}\n\n.composer--options--dropdown--content--item {\n display: flex;\n align-items: center;\n padding: 10px;\n color: $inverted-text-color;\n cursor: pointer;\n\n & > .content {\n flex: 1 1 auto;\n color: $lighter-text-color;\n\n &:not(:first-child) { margin-left: 10px }\n\n strong {\n display: block;\n color: $inverted-text-color;\n font-weight: 500;\n }\n }\n\n &:hover,\n &.active {\n background: $ui-highlight-color;\n color: $primary-text-color;\n\n & > .content {\n color: $primary-text-color;\n\n strong { color: $primary-text-color }\n }\n }\n\n &.active:hover { background: lighten($ui-highlight-color, 4%) }\n}\n\n.composer--publisher {\n padding-top: 10px;\n text-align: right;\n white-space: nowrap;\n overflow: hidden;\n justify-content: flex-end;\n flex: 0 0 auto;\n\n & > .primary {\n display: inline-block;\n margin: 0;\n padding: 0 10px;\n text-align: center;\n }\n\n & > .side_arm {\n display: inline-block;\n margin: 0 2px;\n padding: 0;\n width: 36px;\n text-align: center;\n }\n\n &.over {\n & > .count { color: $warning-red }\n }\n}\n",".column__wrapper {\n display: flex;\n flex: 1 1 auto;\n position: relative;\n}\n\n.columns-area {\n display: flex;\n flex: 1 1 auto;\n flex-direction: row;\n justify-content: flex-start;\n overflow-x: auto;\n position: relative;\n\n &__panels {\n display: flex;\n justify-content: center;\n width: 100%;\n height: 100%;\n min-height: 100vh;\n\n &__pane {\n height: 100%;\n overflow: hidden;\n pointer-events: none;\n display: flex;\n justify-content: flex-end;\n min-width: 285px;\n\n &--start {\n justify-content: flex-start;\n }\n\n &__inner {\n position: fixed;\n width: 285px;\n pointer-events: auto;\n height: 100%;\n }\n }\n\n &__main {\n box-sizing: border-box;\n width: 100%;\n max-width: 600px;\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding: 0 10px;\n }\n }\n }\n}\n\n.tabs-bar__wrapper {\n background: darken($ui-base-color, 8%);\n position: sticky;\n top: 0;\n z-index: 2;\n padding-top: 0;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding-top: 10px;\n }\n\n .tabs-bar {\n margin-bottom: 0;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n margin-bottom: 10px;\n }\n }\n}\n\n.react-swipeable-view-container {\n &,\n .columns-area,\n .column {\n height: 100%;\n }\n}\n\n.react-swipeable-view-container > * {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n}\n\n.column {\n width: 330px;\n position: relative;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n\n > .scrollable {\n background: $ui-base-color;\n }\n}\n\n.ui {\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n}\n\n.column {\n overflow: hidden;\n}\n\n.column-back-button {\n box-sizing: border-box;\n width: 100%;\n background: lighten($ui-base-color, 4%);\n color: $highlight-text-color;\n cursor: pointer;\n flex: 0 0 auto;\n font-size: 16px;\n border: 0;\n text-align: unset;\n padding: 15px;\n margin: 0;\n z-index: 3;\n\n &:hover {\n text-decoration: underline;\n }\n}\n\n.column-header__back-button {\n background: lighten($ui-base-color, 4%);\n border: 0;\n font-family: inherit;\n color: $highlight-text-color;\n cursor: pointer;\n flex: 0 0 auto;\n font-size: 16px;\n padding: 0 5px 0 0;\n z-index: 3;\n\n &:hover {\n text-decoration: underline;\n }\n\n &:last-child {\n padding: 0 15px 0 0;\n }\n}\n\n.column-back-button__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.column-back-button--slim {\n position: relative;\n}\n\n.column-back-button--slim-button {\n cursor: pointer;\n flex: 0 0 auto;\n font-size: 16px;\n padding: 15px;\n position: absolute;\n right: 0;\n top: -48px;\n}\n\n.column-link {\n background: lighten($ui-base-color, 8%);\n color: $primary-text-color;\n display: block;\n font-size: 16px;\n padding: 15px;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 11%);\n }\n\n &:focus {\n outline: 0;\n }\n\n &--transparent {\n background: transparent;\n color: $ui-secondary-color;\n\n &:hover,\n &:focus,\n &:active {\n background: transparent;\n color: $primary-text-color;\n }\n\n &.active {\n color: $ui-highlight-color;\n }\n }\n}\n\n.column-link__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.column-subheading {\n background: $ui-base-color;\n color: $dark-text-color;\n padding: 8px 20px;\n font-size: 12px;\n font-weight: 500;\n text-transform: uppercase;\n cursor: default;\n}\n\n.column-header__wrapper {\n position: relative;\n flex: 0 0 auto;\n z-index: 1;\n\n &.active {\n box-shadow: 0 1px 0 rgba($highlight-text-color, 0.3);\n\n &::before {\n display: block;\n content: \"\";\n position: absolute;\n bottom: -13px;\n left: 0;\n right: 0;\n margin: 0 auto;\n width: 60%;\n pointer-events: none;\n height: 28px;\n z-index: 1;\n background: radial-gradient(ellipse, rgba($ui-highlight-color, 0.23) 0%, rgba($ui-highlight-color, 0) 60%);\n }\n }\n\n .announcements {\n z-index: 1;\n position: relative;\n }\n}\n\n.column-header {\n display: flex;\n font-size: 16px;\n background: lighten($ui-base-color, 4%);\n flex: 0 0 auto;\n cursor: pointer;\n position: relative;\n z-index: 2;\n outline: 0;\n overflow: hidden;\n\n & > button {\n margin: 0;\n border: none;\n padding: 15px;\n color: inherit;\n background: transparent;\n font: inherit;\n text-align: left;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n flex: 1;\n }\n\n & > .column-header__back-button {\n color: $highlight-text-color;\n }\n\n &.active {\n .column-header__icon {\n color: $highlight-text-color;\n text-shadow: 0 0 10px rgba($ui-highlight-color, 0.4);\n }\n }\n\n &:focus,\n &:active {\n outline: 0;\n }\n}\n\n.column {\n width: 330px;\n position: relative;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n\n .wide .columns-area:not(.columns-area--mobile) & {\n flex: auto;\n min-width: 330px;\n max-width: 400px;\n }\n\n > .scrollable {\n background: $ui-base-color;\n }\n}\n\n.column-header__buttons {\n height: 48px;\n display: flex;\n margin-left: 0;\n}\n\n.column-header__links {\n margin-bottom: 14px;\n}\n\n.column-header__links .text-btn {\n margin-right: 10px;\n}\n\n.column-header__button {\n background: lighten($ui-base-color, 4%);\n border: 0;\n color: $darker-text-color;\n cursor: pointer;\n font-size: 16px;\n padding: 0 15px;\n\n &:hover {\n color: lighten($darker-text-color, 7%);\n }\n\n &.active {\n color: $primary-text-color;\n background: lighten($ui-base-color, 8%);\n\n &:hover {\n color: $primary-text-color;\n background: lighten($ui-base-color, 8%);\n }\n }\n\n // glitch - added focus ring for keyboard navigation\n &:focus {\n text-shadow: 0 0 4px darken($ui-highlight-color, 5%);\n }\n}\n\n.column-header__notif-cleaning-buttons {\n display: flex;\n align-items: stretch;\n justify-content: space-around;\n\n button {\n @extend .column-header__button;\n background: transparent;\n text-align: center;\n padding: 10px 0;\n white-space: pre-wrap;\n }\n\n b {\n font-weight: bold;\n }\n}\n\n// The notifs drawer with no padding to have more space for the buttons\n.column-header__collapsible-inner.nopad-drawer {\n padding: 0;\n}\n\n.column-header__collapsible {\n max-height: 70vh;\n overflow: hidden;\n overflow-y: auto;\n color: $darker-text-color;\n transition: max-height 150ms ease-in-out, opacity 300ms linear;\n opacity: 1;\n z-index: 1;\n position: relative;\n\n &.collapsed {\n max-height: 0;\n opacity: 0.5;\n }\n\n &.animating {\n overflow-y: hidden;\n }\n\n hr {\n height: 0;\n background: transparent;\n border: 0;\n border-top: 1px solid lighten($ui-base-color, 12%);\n margin: 10px 0;\n }\n\n // notif cleaning drawer\n &.ncd {\n transition: none;\n &.collapsed {\n max-height: 0;\n opacity: 0.7;\n }\n }\n}\n\n.column-header__collapsible-inner {\n background: lighten($ui-base-color, 8%);\n padding: 15px;\n}\n\n.column-header__setting-btn {\n &:hover {\n color: $darker-text-color;\n text-decoration: underline;\n }\n}\n\n.column-header__setting-arrows {\n float: right;\n\n .column-header__setting-btn {\n padding: 0 10px;\n\n &:last-child {\n padding-right: 0;\n }\n }\n}\n\n.column-header__title {\n display: inline-block;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n flex: 1;\n}\n\n.column-header__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.empty-column-indicator,\n.error-column,\n.follow_requests-unlocked_explanation {\n color: $dark-text-color;\n background: $ui-base-color;\n text-align: center;\n padding: 20px;\n font-size: 15px;\n font-weight: 400;\n cursor: default;\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n justify-content: center;\n @supports(display: grid) { // hack to fix Chrome <57\n contain: strict;\n }\n\n & > span {\n max-width: 400px;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.follow_requests-unlocked_explanation {\n background: darken($ui-base-color, 4%);\n contain: initial;\n}\n\n.error-column {\n flex-direction: column;\n}\n\n// more fixes for the navbar-under mode\n@mixin fix-margins-for-navbar-under {\n .tabs-bar {\n margin-top: 0 !important;\n margin-bottom: -6px !important;\n }\n}\n\n.single-column.navbar-under {\n @include fix-margins-for-navbar-under;\n}\n\n.auto-columns.navbar-under {\n @media screen and (max-width: $no-gap-breakpoint) {\n @include fix-margins-for-navbar-under;\n }\n}\n\n.auto-columns.navbar-under .react-swipeable-view-container .columns-area,\n.single-column.navbar-under .react-swipeable-view-container .columns-area {\n @media screen and (max-width: $no-gap-breakpoint) {\n height: 100% !important;\n }\n}\n\n.column-inline-form {\n padding: 7px 15px;\n padding-right: 5px;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n\n label {\n flex: 1 1 auto;\n\n input {\n width: 100%;\n margin-bottom: 6px;\n\n &:focus {\n outline: 0;\n }\n }\n }\n\n .icon-button {\n flex: 0 0 auto;\n margin: 0 5px;\n }\n}\n",".regeneration-indicator {\n text-align: center;\n font-size: 16px;\n font-weight: 500;\n color: $dark-text-color;\n background: $ui-base-color;\n cursor: default;\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 20px;\n\n &__figure {\n &,\n img {\n display: block;\n width: auto;\n height: 160px;\n margin: 0;\n }\n }\n\n &--without-header {\n padding-top: 20px + 48px;\n }\n\n &__label {\n margin-top: 30px;\n\n strong {\n display: block;\n margin-bottom: 10px;\n color: $dark-text-color;\n }\n\n span {\n font-size: 15px;\n font-weight: 400;\n }\n }\n}\n",".directory {\n &__list {\n width: 100%;\n margin: 10px 0;\n transition: opacity 100ms ease-in;\n\n &.loading {\n opacity: 0.7;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin: 0;\n }\n }\n\n &__card {\n box-sizing: border-box;\n margin-bottom: 10px;\n\n &__img {\n height: 125px;\n position: relative;\n background: darken($ui-base-color, 12%);\n overflow: hidden;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n object-fit: cover;\n }\n }\n\n &__bar {\n display: flex;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n padding: 10px;\n\n &__name {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n text-decoration: none;\n overflow: hidden;\n }\n\n &__relationship {\n width: 23px;\n min-height: 1px;\n flex: 0 0 auto;\n }\n\n .avatar {\n flex: 0 0 auto;\n width: 48px;\n height: 48px;\n padding-top: 2px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n background: darken($ui-base-color, 8%);\n object-fit: cover;\n }\n }\n\n .display-name {\n margin-left: 15px;\n text-align: left;\n\n strong {\n font-size: 15px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n span {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n &__extra {\n background: $ui-base-color;\n display: flex;\n align-items: center;\n justify-content: center;\n\n .accounts-table__count {\n width: 33.33%;\n flex: 0 0 auto;\n padding: 15px 0;\n }\n\n .account__header__content {\n box-sizing: border-box;\n padding: 15px 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n width: 100%;\n min-height: 18px + 30px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n p {\n display: none;\n\n &:first-child {\n display: inline;\n }\n }\n\n br {\n display: none;\n }\n }\n }\n }\n}\n\n.filter-form {\n background: $ui-base-color;\n\n &__column {\n padding: 10px 15px;\n }\n\n .radio-button {\n display: block;\n }\n}\n\n.radio-button {\n font-size: 14px;\n position: relative;\n display: inline-block;\n padding: 6px 0;\n line-height: 18px;\n cursor: default;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n cursor: pointer;\n\n input[type=radio],\n input[type=checkbox] {\n display: none;\n }\n\n &__input {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 50%;\n vertical-align: middle;\n\n &.checked {\n border-color: lighten($ui-highlight-color, 8%);\n background: lighten($ui-highlight-color, 8%);\n }\n }\n}\n",".search {\n position: relative;\n}\n\n.search__input {\n @include search-input();\n\n display: block;\n padding: 15px;\n padding-right: 30px;\n line-height: 18px;\n font-size: 16px;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n}\n\n.search__icon {\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus {\n outline: 0 !important;\n }\n\n .fa {\n position: absolute;\n top: 16px;\n right: 10px;\n z-index: 2;\n display: inline-block;\n opacity: 0;\n transition: all 100ms linear;\n transition-property: color, transform, opacity;\n font-size: 18px;\n width: 18px;\n height: 18px;\n color: $secondary-text-color;\n cursor: default;\n pointer-events: none;\n\n &.active {\n pointer-events: auto;\n opacity: 0.3;\n }\n }\n\n .fa-search {\n transform: rotate(0deg);\n\n &.active {\n pointer-events: auto;\n opacity: 0.3;\n }\n }\n\n .fa-times-circle {\n top: 17px;\n transform: rotate(0deg);\n color: $action-button-color;\n cursor: pointer;\n\n &.active {\n transform: rotate(90deg);\n }\n\n &:hover {\n color: lighten($action-button-color, 7%);\n }\n }\n}\n\n.search-results__header {\n color: $dark-text-color;\n background: lighten($ui-base-color, 2%);\n border-bottom: 1px solid darken($ui-base-color, 4%);\n padding: 15px 10px;\n font-size: 14px;\n font-weight: 500;\n}\n\n.search-results__info {\n padding: 20px;\n color: $darker-text-color;\n text-align: center;\n}\n\n.trends {\n &__header {\n color: $dark-text-color;\n background: lighten($ui-base-color, 2%);\n border-bottom: 1px solid darken($ui-base-color, 4%);\n font-weight: 500;\n padding: 15px;\n font-size: 16px;\n cursor: default;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n &__item {\n display: flex;\n align-items: center;\n padding: 15px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &:last-child {\n border-bottom: 0;\n }\n\n &__name {\n flex: 1 1 auto;\n color: $dark-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n strong {\n font-weight: 500;\n }\n\n a {\n color: $darker-text-color;\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:hover,\n &:focus,\n &:active {\n span {\n text-decoration: underline;\n }\n }\n }\n }\n\n &__current {\n flex: 0 0 auto;\n font-size: 24px;\n line-height: 36px;\n font-weight: 500;\n text-align: right;\n padding-right: 15px;\n margin-left: 5px;\n color: $secondary-text-color;\n }\n\n &__sparkline {\n flex: 0 0 auto;\n width: 50px;\n\n path:first-child {\n fill: rgba($highlight-text-color, 0.25) !important;\n fill-opacity: 1 !important;\n }\n\n path:last-child {\n stroke: lighten($highlight-text-color, 6%) !important;\n }\n }\n }\n}\n",null,".emojione {\n font-size: inherit;\n vertical-align: middle;\n object-fit: contain;\n margin: -.2ex .15em .2ex;\n width: 16px;\n height: 16px;\n\n img {\n width: auto;\n }\n}\n\n.emoji-picker-dropdown__menu {\n background: $simple-background-color;\n position: absolute;\n box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n margin-top: 5px;\n z-index: 2;\n\n .emoji-mart-scroll {\n transition: opacity 200ms ease;\n }\n\n &.selecting .emoji-mart-scroll {\n opacity: 0.5;\n }\n}\n\n.emoji-picker-dropdown__modifiers {\n position: absolute;\n top: 60px;\n right: 11px;\n cursor: pointer;\n}\n\n.emoji-picker-dropdown__modifiers__menu {\n position: absolute;\n z-index: 4;\n top: -4px;\n left: -8px;\n background: $simple-background-color;\n border-radius: 4px;\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n overflow: hidden;\n\n button {\n display: block;\n cursor: pointer;\n border: 0;\n padding: 4px 8px;\n background: transparent;\n\n &:hover,\n &:focus,\n &:active {\n background: rgba($ui-secondary-color, 0.4);\n }\n }\n\n .emoji-mart-emoji {\n height: 22px;\n }\n}\n\n.emoji-mart-emoji {\n span {\n background-repeat: no-repeat;\n }\n}\n\n.emoji-button {\n display: block;\n padding: 5px 5px 2px 2px;\n outline: 0;\n cursor: pointer;\n\n &:active,\n &:focus {\n outline: 0 !important;\n }\n\n img {\n filter: grayscale(100%);\n opacity: 0.8;\n display: block;\n margin: 0;\n width: 22px;\n height: 22px;\n }\n\n &:hover,\n &:active,\n &:focus {\n img {\n opacity: 1;\n filter: none;\n }\n }\n}\n","$doodleBg: #d9e1e8;\n.doodle-modal {\n @extend .boost-modal;\n width: unset;\n}\n\n.doodle-modal__container {\n background: $doodleBg;\n text-align: center;\n line-height: 0; // remove weird gap under canvas\n canvas {\n border: 5px solid $doodleBg;\n }\n}\n\n.doodle-modal__action-bar {\n @extend .boost-modal__action-bar;\n\n .filler {\n flex-grow: 1;\n margin: 0;\n padding: 0;\n }\n\n .doodle-toolbar {\n line-height: 1;\n\n display: flex;\n flex-direction: column;\n flex-grow: 0;\n justify-content: space-around;\n\n &.with-inputs {\n label {\n display: inline-block;\n width: 70px;\n text-align: right;\n margin-right: 2px;\n }\n\n input[type=\"number\"],input[type=\"text\"] {\n width: 40px;\n }\n span.val {\n display: inline-block;\n text-align: left;\n width: 50px;\n }\n }\n }\n\n .doodle-palette {\n padding-right: 0 !important;\n border: 1px solid black;\n line-height: .2rem;\n flex-grow: 0;\n background: white;\n\n button {\n appearance: none;\n width: 1rem;\n height: 1rem;\n margin: 0; padding: 0;\n text-align: center;\n color: black;\n text-shadow: 0 0 1px white;\n cursor: pointer;\n box-shadow: inset 0 0 1px rgba(white, .5);\n border: 1px solid black;\n outline-offset:-1px;\n\n &.foreground {\n outline: 1px dashed white;\n }\n\n &.background {\n outline: 1px dashed red;\n }\n\n &.foreground.background {\n outline: 1px dashed red;\n border-color: white;\n }\n }\n }\n}\n",".drawer {\n width: 300px;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n overflow-y: hidden;\n padding: 10px 5px;\n flex: none;\n\n &:first-child {\n padding-left: 10px;\n }\n\n &:last-child {\n padding-right: 10px;\n }\n\n @include single-column('screen and (max-width: 630px)') { flex: auto }\n\n @include limited-single-column('screen and (max-width: 630px)') {\n &, &:first-child, &:last-child { padding: 0 }\n }\n\n .wide & {\n min-width: 300px;\n max-width: 400px;\n flex: 1 1 200px;\n }\n\n @include single-column('screen and (max-width: 630px)') {\n :root & { // Overrides `.wide` for single-column view\n flex: auto;\n width: 100%;\n min-width: 0;\n max-width: none;\n padding: 0;\n }\n }\n\n .react-swipeable-view-container & { height: 100% }\n}\n\n.drawer--header {\n display: flex;\n flex-direction: row;\n margin-bottom: 10px;\n flex: none;\n background: lighten($ui-base-color, 8%);\n font-size: 16px;\n\n & > * {\n display: block;\n box-sizing: border-box;\n border-bottom: 2px solid transparent;\n padding: 15px 5px 13px;\n height: 48px;\n flex: 1 1 auto;\n color: $darker-text-color;\n text-align: center;\n text-decoration: none;\n cursor: pointer;\n }\n\n a {\n transition: background 100ms ease-in;\n\n &:focus,\n &:hover {\n outline: none;\n background: lighten($ui-base-color, 3%);\n transition: background 200ms ease-out;\n }\n }\n}\n\n.search {\n position: relative;\n margin-bottom: 10px;\n flex: none;\n\n @include limited-single-column('screen and (max-width: #{$no-gap-breakpoint})') { margin-bottom: 0 }\n @include single-column('screen and (max-width: 630px)') { font-size: 16px }\n}\n\n.search-popout {\n @include search-popout();\n}\n\n.drawer--account {\n padding: 10px;\n color: $darker-text-color;\n display: flex;\n align-items: center;\n\n a {\n color: inherit;\n text-decoration: none;\n }\n\n .acct {\n display: block;\n color: $secondary-text-color;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.navigation-bar__profile {\n flex: 1 1 auto;\n margin-left: 8px;\n overflow: hidden;\n}\n\n.drawer--results {\n background: $ui-base-color;\n overflow-x: hidden;\n overflow-y: auto;\n\n & > header {\n color: $dark-text-color;\n background: lighten($ui-base-color, 2%);\n padding: 15px;\n font-weight: 500;\n font-size: 16px;\n cursor: default;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n & > section {\n margin-bottom: 5px;\n\n h5 {\n background: darken($ui-base-color, 4%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n display: flex;\n padding: 15px;\n font-weight: 500;\n font-size: 16px;\n color: $dark-text-color;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n .account:last-child,\n & > div:last-child .status {\n border-bottom: 0;\n }\n\n & > .hashtag {\n display: block;\n padding: 10px;\n color: $secondary-text-color;\n text-decoration: none;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($secondary-text-color, 4%);\n text-decoration: underline;\n }\n }\n }\n}\n\n.drawer__pager {\n box-sizing: border-box;\n padding: 0;\n flex-grow: 1;\n position: relative;\n overflow: hidden;\n display: flex;\n}\n\n.drawer__inner {\n position: absolute;\n top: 0;\n left: 0;\n background: lighten($ui-base-color, 13%);\n box-sizing: border-box;\n padding: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n overflow-y: auto;\n width: 100%;\n height: 100%;\n\n &.darker {\n background: $ui-base-color;\n }\n}\n\n.drawer__inner__mastodon {\n background: lighten($ui-base-color, 13%) url('data:image/svg+xml;utf8,') no-repeat bottom / 100% auto;\n flex: 1;\n min-height: 47px;\n display: none;\n\n > img {\n display: block;\n object-fit: contain;\n object-position: bottom left;\n width: 85%;\n height: 100%;\n pointer-events: none;\n user-drag: none;\n user-select: none;\n }\n\n > .mastodon {\n display: block;\n width: 100%;\n height: 100%;\n border: none;\n cursor: inherit;\n }\n\n @media screen and (min-height: 640px) {\n display: block;\n }\n}\n\n.pseudo-drawer {\n background: lighten($ui-base-color, 13%);\n font-size: 13px;\n text-align: left;\n}\n\n.drawer__backdrop {\n cursor: pointer;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba($base-overlay-background, 0.5);\n}\n",".video-error-cover {\n align-items: center;\n background: $base-overlay-background;\n color: $primary-text-color;\n cursor: pointer;\n display: flex;\n flex-direction: column;\n height: 100%;\n justify-content: center;\n margin-top: 8px;\n position: relative;\n text-align: center;\n z-index: 100;\n}\n\n.media-spoiler {\n background: $base-overlay-background;\n color: $darker-text-color;\n border: 0;\n width: 100%;\n height: 100%;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($darker-text-color, 8%);\n }\n\n .status__content > & {\n margin-top: 15px; // Add margin when used bare for NSFW video player\n }\n @include fullwidth-gallery;\n}\n\n.media-spoiler__warning {\n display: block;\n font-size: 14px;\n}\n\n.media-spoiler__trigger {\n display: block;\n font-size: 11px;\n font-weight: 500;\n}\n\n.media-gallery__gifv__label {\n display: block;\n position: absolute;\n color: $primary-text-color;\n background: rgba($base-overlay-background, 0.5);\n bottom: 6px;\n left: 6px;\n padding: 2px 6px;\n border-radius: 2px;\n font-size: 11px;\n font-weight: 600;\n z-index: 1;\n pointer-events: none;\n opacity: 0.9;\n transition: opacity 0.1s ease;\n line-height: 18px;\n}\n\n.media-gallery__gifv {\n &:hover {\n .media-gallery__gifv__label {\n opacity: 1;\n }\n }\n}\n\n.media-gallery__audio {\n height: 100%;\n display: flex;\n flex-direction: column;\n\n span {\n text-align: center;\n color: $darker-text-color;\n display: flex;\n height: 100%;\n align-items: center;\n\n p {\n width: 100%;\n }\n }\n\n audio {\n width: 100%;\n }\n}\n\n.media-gallery {\n box-sizing: border-box;\n margin-top: 8px;\n overflow: hidden;\n border-radius: 4px;\n position: relative;\n width: 100%;\n height: 110px;\n\n @include fullwidth-gallery;\n}\n\n.media-gallery__item {\n border: none;\n box-sizing: border-box;\n display: block;\n float: left;\n position: relative;\n border-radius: 4px;\n overflow: hidden;\n\n .full-width & {\n border-radius: 0;\n }\n\n &.standalone {\n .media-gallery__item-gifv-thumbnail {\n transform: none;\n top: 0;\n }\n }\n\n &.letterbox {\n background: $base-shadow-color;\n }\n}\n\n.media-gallery__item-thumbnail {\n cursor: zoom-in;\n display: block;\n text-decoration: none;\n color: $secondary-text-color;\n position: relative;\n z-index: 1;\n\n &,\n img {\n height: 100%;\n width: 100%;\n object-fit: contain;\n\n &:not(.letterbox) {\n height: 100%;\n object-fit: cover;\n }\n }\n}\n\n.media-gallery__preview {\n width: 100%;\n height: 100%;\n object-fit: cover;\n position: absolute;\n top: 0;\n left: 0;\n z-index: 0;\n background: $base-overlay-background;\n\n &--hidden {\n display: none;\n }\n}\n\n.media-gallery__gifv {\n height: 100%;\n overflow: hidden;\n position: relative;\n width: 100%;\n display: flex;\n justify-content: center;\n}\n\n.media-gallery__item-gifv-thumbnail {\n cursor: zoom-in;\n height: 100%;\n width: 100%;\n position: relative;\n z-index: 1;\n object-fit: contain;\n user-select: none;\n\n &:not(.letterbox) {\n height: 100%;\n object-fit: cover;\n }\n}\n\n.media-gallery__item-thumbnail-label {\n clip: rect(1px 1px 1px 1px); /* IE6, IE7 */\n clip: rect(1px, 1px, 1px, 1px);\n overflow: hidden;\n position: absolute;\n}\n\n.video-modal__container {\n max-width: 100vw;\n max-height: 100vh;\n}\n\n.audio-modal__container {\n width: 50vw;\n}\n\n.media-modal {\n width: 100%;\n height: 100%;\n position: relative;\n\n .extended-video-player {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n video {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n }\n }\n}\n\n.media-modal__closer {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n}\n\n.media-modal__navigation {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n transition: opacity 0.3s linear;\n will-change: opacity;\n\n * {\n pointer-events: auto;\n }\n\n &.media-modal__navigation--hidden {\n opacity: 0;\n\n * {\n pointer-events: none;\n }\n }\n}\n\n.media-modal__nav {\n background: rgba($base-overlay-background, 0.5);\n box-sizing: border-box;\n border: 0;\n color: $primary-text-color;\n cursor: pointer;\n display: flex;\n align-items: center;\n font-size: 24px;\n height: 20vmax;\n margin: auto 0;\n padding: 30px 15px;\n position: absolute;\n top: 0;\n bottom: 0;\n}\n\n.media-modal__nav--left {\n left: 0;\n}\n\n.media-modal__nav--right {\n right: 0;\n}\n\n.media-modal__pagination {\n width: 100%;\n text-align: center;\n position: absolute;\n left: 0;\n bottom: 20px;\n pointer-events: none;\n}\n\n.media-modal__meta {\n text-align: center;\n position: absolute;\n left: 0;\n bottom: 20px;\n width: 100%;\n pointer-events: none;\n\n &--shifted {\n bottom: 62px;\n }\n\n a {\n pointer-events: auto;\n text-decoration: none;\n font-weight: 500;\n color: $ui-secondary-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.media-modal__page-dot {\n display: inline-block;\n}\n\n.media-modal__button {\n background-color: $white;\n height: 12px;\n width: 12px;\n border-radius: 6px;\n margin: 10px;\n padding: 0;\n border: 0;\n font-size: 0;\n}\n\n.media-modal__button--active {\n background-color: $ui-highlight-color;\n}\n\n.media-modal__close {\n position: absolute;\n right: 8px;\n top: 8px;\n z-index: 100;\n}\n\n.detailed,\n.fullscreen {\n .video-player__volume__current,\n .video-player__volume::before {\n bottom: 27px;\n }\n\n .video-player__volume__handle {\n bottom: 23px;\n }\n\n}\n\n.audio-player {\n box-sizing: border-box;\n position: relative;\n background: darken($ui-base-color, 8%);\n border-radius: 4px;\n padding-bottom: 44px;\n direction: ltr;\n\n &.editable {\n border-radius: 0;\n height: 100%;\n }\n\n &__waveform {\n padding: 15px 0;\n position: relative;\n overflow: hidden;\n\n &::before {\n content: \"\";\n display: block;\n position: absolute;\n border-top: 1px solid lighten($ui-base-color, 4%);\n width: 100%;\n height: 0;\n left: 0;\n top: calc(50% + 1px);\n }\n }\n\n &__progress-placeholder {\n background-color: rgba(lighten($ui-highlight-color, 8%), 0.5);\n }\n\n &__wave-placeholder {\n background-color: lighten($ui-base-color, 16%);\n }\n\n .video-player__controls {\n padding: 0 15px;\n padding-top: 10px;\n background: darken($ui-base-color, 8%);\n border-top: 1px solid lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n }\n}\n\n.video-player {\n overflow: hidden;\n position: relative;\n background: $base-shadow-color;\n max-width: 100%;\n border-radius: 4px;\n box-sizing: border-box;\n direction: ltr;\n\n &.editable {\n border-radius: 0;\n height: 100% !important;\n }\n\n &:focus {\n outline: 0;\n }\n\n .detailed-status & {\n width: 100%;\n height: 100%;\n }\n\n @include fullwidth-gallery;\n\n video {\n max-width: 100vw;\n max-height: 80vh;\n z-index: 1;\n position: relative;\n }\n\n &.fullscreen {\n width: 100% !important;\n height: 100% !important;\n margin: 0;\n\n video {\n max-width: 100% !important;\n max-height: 100% !important;\n width: 100% !important;\n height: 100% !important;\n outline: 0;\n }\n }\n\n &.inline {\n video {\n object-fit: contain;\n position: relative;\n top: 50%;\n transform: translateY(-50%);\n }\n }\n\n &__controls {\n position: absolute;\n z-index: 2;\n bottom: 0;\n left: 0;\n right: 0;\n box-sizing: border-box;\n background: linear-gradient(0deg, rgba($base-shadow-color, 0.85) 0, rgba($base-shadow-color, 0.45) 60%, transparent);\n padding: 0 15px;\n opacity: 0;\n transition: opacity .1s ease;\n\n &.active {\n opacity: 1;\n }\n }\n\n &.inactive {\n video,\n .video-player__controls {\n visibility: hidden;\n }\n }\n\n &__spoiler {\n display: none;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 4;\n border: 0;\n background: $base-shadow-color;\n color: $darker-text-color;\n transition: none;\n pointer-events: none;\n\n &.active {\n display: block;\n pointer-events: auto;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($darker-text-color, 7%);\n }\n }\n\n &__title {\n display: block;\n font-size: 14px;\n }\n\n &__subtitle {\n display: block;\n font-size: 11px;\n font-weight: 500;\n }\n }\n\n &__buttons-bar {\n display: flex;\n justify-content: space-between;\n padding-bottom: 10px;\n\n .video-player__download__icon {\n color: inherit;\n\n .fa,\n &:active .fa,\n &:hover .fa,\n &:focus .fa {\n color: inherit;\n }\n }\n }\n\n &__buttons {\n font-size: 16px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &.left {\n button {\n padding-left: 0;\n }\n }\n\n &.right {\n button {\n padding-right: 0;\n }\n }\n\n button {\n background: transparent;\n padding: 2px 10px;\n font-size: 16px;\n border: 0;\n color: rgba($white, 0.75);\n\n &:active,\n &:hover,\n &:focus {\n color: $white;\n }\n }\n }\n\n &__time-sep,\n &__time-total,\n &__time-current {\n font-size: 14px;\n font-weight: 500;\n }\n\n &__time-current {\n color: $white;\n margin-left: 60px;\n }\n\n &__time-sep {\n display: inline-block;\n margin: 0 6px;\n }\n\n &__time-sep,\n &__time-total {\n color: $white;\n }\n\n &__volume {\n cursor: pointer;\n height: 24px;\n display: inline;\n\n &::before {\n content: \"\";\n width: 50px;\n background: rgba($white, 0.35);\n border-radius: 4px;\n display: block;\n position: absolute;\n height: 4px;\n left: 70px;\n bottom: 20px;\n }\n\n &__current {\n display: block;\n position: absolute;\n height: 4px;\n border-radius: 4px;\n left: 70px;\n bottom: 20px;\n background: lighten($ui-highlight-color, 8%);\n }\n\n &__handle {\n position: absolute;\n z-index: 3;\n border-radius: 50%;\n width: 12px;\n height: 12px;\n bottom: 16px;\n left: 70px;\n transition: opacity .1s ease;\n background: lighten($ui-highlight-color, 8%);\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n pointer-events: none;\n }\n }\n\n &__link {\n padding: 2px 10px;\n\n a {\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n color: $white;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n }\n\n &__seek {\n cursor: pointer;\n height: 24px;\n position: relative;\n\n &::before {\n content: \"\";\n width: 100%;\n background: rgba($white, 0.35);\n border-radius: 4px;\n display: block;\n position: absolute;\n height: 4px;\n top: 10px;\n }\n\n &__progress,\n &__buffer {\n display: block;\n position: absolute;\n height: 4px;\n border-radius: 4px;\n top: 10px;\n background: lighten($ui-highlight-color, 8%);\n }\n\n &__buffer {\n background: rgba($white, 0.2);\n }\n\n &__handle {\n position: absolute;\n z-index: 3;\n opacity: 0;\n border-radius: 50%;\n width: 12px;\n height: 12px;\n top: 6px;\n margin-left: -6px;\n transition: opacity .1s ease;\n background: lighten($ui-highlight-color, 8%);\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n pointer-events: none;\n\n &.active {\n opacity: 1;\n }\n }\n\n &:hover {\n .video-player__seek__handle {\n opacity: 1;\n }\n }\n }\n\n &.detailed,\n &.fullscreen {\n .video-player__buttons {\n button {\n padding-top: 10px;\n padding-bottom: 10px;\n }\n }\n }\n}\n",".sensitive-info {\n display: flex;\n flex-direction: row;\n align-items: center;\n position: absolute;\n top: 4px;\n left: 4px;\n z-index: 100;\n}\n\n.sensitive-marker {\n margin: 0 3px;\n border-radius: 2px;\n padding: 2px 6px;\n color: rgba($primary-text-color, 0.8);\n background: rgba($base-overlay-background, 0.5);\n font-size: 12px;\n line-height: 18px;\n text-transform: uppercase;\n opacity: .9;\n transition: opacity .1s ease;\n\n .media-gallery:hover & { opacity: 1 }\n}\n",".list-editor {\n background: $ui-base-color;\n flex-direction: column;\n border-radius: 8px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n width: 380px;\n overflow: hidden;\n\n @media screen and (max-width: 420px) {\n width: 90%;\n }\n\n h4 {\n padding: 15px 0;\n background: lighten($ui-base-color, 13%);\n font-weight: 500;\n font-size: 16px;\n text-align: center;\n border-radius: 8px 8px 0 0;\n }\n\n .drawer__pager {\n height: 50vh;\n }\n\n .drawer__inner {\n border-radius: 0 0 8px 8px;\n\n &.backdrop {\n width: calc(100% - 60px);\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n border-radius: 0 0 0 8px;\n }\n }\n\n &__accounts {\n overflow-y: auto;\n }\n\n .account__display-name {\n &:hover strong {\n text-decoration: none;\n }\n }\n\n .account__avatar {\n cursor: default;\n }\n\n .search {\n margin-bottom: 0;\n }\n}\n\n.list-adder {\n background: $ui-base-color;\n flex-direction: column;\n border-radius: 8px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n width: 380px;\n overflow: hidden;\n\n @media screen and (max-width: 420px) {\n width: 90%;\n }\n\n &__account {\n background: lighten($ui-base-color, 13%);\n }\n\n &__lists {\n background: lighten($ui-base-color, 13%);\n height: 50vh;\n border-radius: 0 0 8px 8px;\n overflow-y: auto;\n }\n\n .list {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n .list__wrapper {\n display: flex;\n }\n\n .list__display-name {\n flex: 1 1 auto;\n overflow: hidden;\n text-decoration: none;\n font-size: 16px;\n padding: 10px;\n }\n}\n",".emoji-mart {\n &,\n * {\n box-sizing: border-box;\n line-height: 1.15;\n }\n\n font-size: 13px;\n display: inline-block;\n color: $inverted-text-color;\n\n .emoji-mart-emoji {\n padding: 6px;\n }\n}\n\n.emoji-mart-bar {\n border: 0 solid darken($ui-secondary-color, 8%);\n\n &:first-child {\n border-bottom-width: 1px;\n border-top-left-radius: 5px;\n border-top-right-radius: 5px;\n background: $ui-secondary-color;\n }\n\n &:last-child {\n border-top-width: 1px;\n border-bottom-left-radius: 5px;\n border-bottom-right-radius: 5px;\n display: none;\n }\n}\n\n.emoji-mart-anchors {\n display: flex;\n justify-content: space-between;\n padding: 0 6px;\n color: $lighter-text-color;\n line-height: 0;\n}\n\n.emoji-mart-anchor {\n position: relative;\n flex: 1;\n text-align: center;\n padding: 12px 4px;\n overflow: hidden;\n transition: color .1s ease-out;\n cursor: pointer;\n\n &:hover {\n color: darken($lighter-text-color, 4%);\n }\n}\n\n.emoji-mart-anchor-selected {\n color: $highlight-text-color;\n\n &:hover {\n color: darken($highlight-text-color, 4%);\n }\n\n .emoji-mart-anchor-bar {\n bottom: 0;\n }\n}\n\n.emoji-mart-anchor-bar {\n position: absolute;\n bottom: -3px;\n left: 0;\n width: 100%;\n height: 3px;\n background-color: darken($ui-highlight-color, 3%);\n}\n\n.emoji-mart-anchors {\n i {\n display: inline-block;\n width: 100%;\n max-width: 22px;\n }\n\n svg {\n fill: currentColor;\n max-height: 18px;\n }\n}\n\n.emoji-mart-scroll {\n overflow-y: scroll;\n height: 270px;\n max-height: 35vh;\n padding: 0 6px 6px;\n background: $simple-background-color;\n will-change: transform;\n\n &::-webkit-scrollbar-track:hover,\n &::-webkit-scrollbar-track:active {\n background-color: rgba($base-overlay-background, 0.3);\n }\n}\n\n.emoji-mart-search {\n padding: 10px;\n padding-right: 45px;\n background: $simple-background-color;\n\n input {\n font-size: 14px;\n font-weight: 400;\n padding: 7px 9px;\n font-family: inherit;\n display: block;\n width: 100%;\n background: rgba($ui-secondary-color, 0.3);\n color: $inverted-text-color;\n border: 1px solid $ui-secondary-color;\n border-radius: 4px;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n}\n\n.emoji-mart-category .emoji-mart-emoji {\n cursor: pointer;\n\n span {\n z-index: 1;\n position: relative;\n text-align: center;\n }\n\n &:hover::before {\n z-index: 0;\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba($ui-secondary-color, 0.7);\n border-radius: 100%;\n }\n}\n\n.emoji-mart-category-label {\n z-index: 2;\n position: relative;\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n\n span {\n display: block;\n width: 100%;\n font-weight: 500;\n padding: 5px 6px;\n background: $simple-background-color;\n }\n}\n\n.emoji-mart-emoji {\n position: relative;\n display: inline-block;\n font-size: 0;\n\n span {\n width: 22px;\n height: 22px;\n }\n}\n\n.emoji-mart-no-results {\n font-size: 14px;\n text-align: center;\n padding-top: 70px;\n color: $light-text-color;\n\n .emoji-mart-category-label {\n display: none;\n }\n\n .emoji-mart-no-results-label {\n margin-top: .2em;\n }\n\n .emoji-mart-emoji:hover::before {\n content: none;\n }\n}\n\n.emoji-mart-preview {\n display: none;\n}\n",".glitch.local-settings {\n position: relative;\n display: flex;\n flex-direction: row;\n background: $ui-secondary-color;\n color: $inverted-text-color;\n border-radius: 8px;\n height: 80vh;\n width: 80vw;\n max-width: 740px;\n max-height: 450px;\n overflow: hidden;\n\n label, legend {\n display: block;\n font-size: 14px;\n }\n\n .boolean label, .radio_buttons label {\n position: relative;\n padding-left: 28px;\n padding-top: 3px;\n\n input {\n position: absolute;\n left: 0;\n top: 0;\n }\n }\n\n span.hint {\n display: block;\n color: $lighter-text-color;\n }\n\n h1 {\n font-size: 18px;\n font-weight: 500;\n line-height: 24px;\n margin-bottom: 20px;\n }\n\n h2 {\n font-size: 15px;\n font-weight: 500;\n line-height: 20px;\n margin-top: 20px;\n margin-bottom: 10px;\n }\n}\n\n.glitch.local-settings__navigation__item {\n display: block;\n padding: 15px 20px;\n color: inherit;\n background: lighten($ui-secondary-color, 8%);\n border-bottom: 1px $ui-secondary-color solid;\n cursor: pointer;\n text-decoration: none;\n outline: none;\n transition: background .3s;\n\n .text-icon-button {\n color: inherit;\n transition: unset;\n }\n\n &:hover {\n background: $ui-secondary-color;\n }\n\n &.active {\n background: $ui-highlight-color;\n color: $primary-text-color;\n }\n\n &.close, &.close:hover {\n background: $error-value-color;\n color: $primary-text-color;\n }\n}\n\n.glitch.local-settings__navigation {\n background: lighten($ui-secondary-color, 8%);\n width: 212px;\n font-size: 15px;\n line-height: 20px;\n overflow-y: auto;\n}\n\n.glitch.local-settings__page {\n display: block;\n flex: auto;\n padding: 15px 20px 15px 20px;\n width: 360px;\n overflow-y: auto;\n}\n\n.glitch.local-settings__page__item {\n margin-bottom: 2px;\n}\n\n.glitch.local-settings__page__item.string,\n.glitch.local-settings__page__item.radio_buttons {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n\n@media screen and (max-width: 630px) {\n .glitch.local-settings__navigation {\n width: 40px;\n flex-shrink: 0;\n }\n\n .glitch.local-settings__navigation__item {\n padding: 10px;\n\n span:last-of-type {\n display: none;\n }\n }\n}\n",".error-boundary {\n color: $primary-text-color;\n font-size: 15px;\n line-height: 20px;\n\n h1 {\n font-size: 26px;\n line-height: 36px;\n font-weight: 400;\n margin-bottom: 8px;\n }\n\n a {\n color: $primary-text-color;\n text-decoration: underline;\n }\n\n ul {\n list-style: disc;\n margin-left: 0;\n padding-left: 1em;\n }\n\n textarea.web_app_crash-stacktrace {\n width: 100%;\n resize: none;\n white-space: pre;\n font-family: $font-monospace, monospace;\n }\n}\n",".compose-panel {\n width: 285px;\n margin-top: 10px;\n display: flex;\n flex-direction: column;\n height: calc(100% - 10px);\n overflow-y: hidden;\n\n .search__input {\n line-height: 18px;\n font-size: 16px;\n padding: 15px;\n padding-right: 30px;\n }\n\n .search__icon .fa {\n top: 15px;\n }\n\n .drawer--account {\n flex: 0 1 48px;\n }\n\n .flex-spacer {\n background: transparent;\n }\n\n .composer {\n flex: 1;\n overflow-y: hidden;\n display: flex;\n flex-direction: column;\n min-height: 310px;\n }\n\n .compose-form__autosuggest-wrapper {\n overflow-y: auto;\n background-color: $white;\n border-radius: 4px 4px 0 0;\n flex: 0 1 auto;\n }\n\n .autosuggest-textarea__textarea {\n overflow-y: hidden;\n }\n\n .compose-form__upload-thumbnail {\n height: 80px;\n }\n}\n\n.navigation-panel {\n margin-top: 10px;\n margin-bottom: 10px;\n height: calc(100% - 20px);\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n\n & > a {\n flex: 0 0 auto;\n }\n\n hr {\n flex: 0 0 auto;\n border: 0;\n background: transparent;\n border-top: 1px solid lighten($ui-base-color, 4%);\n margin: 10px 0;\n }\n\n .flex-spacer {\n background: transparent;\n }\n}\n\n@media screen and (min-width: 600px) {\n .tabs-bar__link {\n span {\n display: inline;\n }\n }\n}\n\n.columns-area--mobile {\n flex-direction: column;\n width: 100%;\n margin: 0 auto;\n\n .column,\n .drawer {\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .directory__list {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: block;\n }\n }\n\n .directory__card {\n margin-bottom: 0;\n }\n\n .filter-form {\n display: flex;\n }\n\n .autosuggest-textarea__textarea {\n font-size: 16px;\n }\n\n .search__input {\n line-height: 18px;\n font-size: 16px;\n padding: 15px;\n padding-right: 30px;\n }\n\n .search__icon .fa {\n top: 15px;\n }\n\n .scrollable {\n overflow: visible;\n\n @supports(display: grid) {\n contain: content;\n }\n }\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding: 10px 0;\n padding-top: 0;\n }\n\n @media screen and (min-width: 630px) {\n .detailed-status {\n padding: 15px;\n\n .media-gallery,\n .video-player,\n .audio-player {\n margin-top: 15px;\n }\n }\n\n .account__header__bar {\n padding: 5px 10px;\n }\n\n .navigation-bar,\n .compose-form {\n padding: 15px;\n }\n\n .compose-form .compose-form__publish .compose-form__publish-button-wrapper {\n padding-top: 15px;\n }\n\n .status {\n padding: 15px;\n min-height: 48px + 2px;\n\n .media-gallery,\n &__action-bar,\n .video-player,\n .audio-player {\n margin-top: 10px;\n }\n }\n\n .account {\n padding: 15px 10px;\n\n &__header__bio {\n margin: 0 -10px;\n }\n }\n\n .notification {\n &__message {\n padding-top: 15px;\n }\n\n .status {\n padding-top: 8px;\n }\n\n .account {\n padding-top: 8px;\n }\n }\n }\n}\n\n.floating-action-button {\n position: fixed;\n display: flex;\n justify-content: center;\n align-items: center;\n width: 3.9375rem;\n height: 3.9375rem;\n bottom: 1.3125rem;\n right: 1.3125rem;\n background: darken($ui-highlight-color, 3%);\n color: $white;\n border-radius: 50%;\n font-size: 21px;\n line-height: 21px;\n text-decoration: none;\n box-shadow: 2px 3px 9px rgba($base-shadow-color, 0.4);\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-highlight-color, 7%);\n }\n}\n\n@media screen and (min-width: $no-gap-breakpoint) {\n .tabs-bar {\n width: 100%;\n }\n\n .react-swipeable-view-container .columns-area--mobile {\n height: calc(100% - 10px) !important;\n }\n\n .getting-started__wrapper,\n .search {\n margin-bottom: 10px;\n }\n}\n\n@media screen and (max-width: 600px + (285px * 1) + (10px * 1)) {\n .columns-area__panels__pane--compositional {\n display: none;\n }\n}\n\n@media screen and (min-width: 600px + (285px * 1) + (10px * 1)) {\n .floating-action-button,\n .tabs-bar__link.optional {\n display: none;\n }\n\n .search-page .search {\n display: none;\n }\n}\n\n@media screen and (max-width: 600px + (285px * 2) + (10px * 2)) {\n .columns-area__panels__pane--navigational {\n display: none;\n }\n}\n\n@media screen and (min-width: 600px + (285px * 2) + (10px * 2)) {\n .tabs-bar {\n display: none;\n }\n}\n",".announcements__item__content {\n word-wrap: break-word;\n overflow-y: auto;\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n p {\n margin-bottom: 10px;\n white-space: pre-wrap;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: $secondary-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n\n &.mention {\n &:hover {\n text-decoration: none;\n\n span {\n text-decoration: underline;\n }\n }\n }\n\n &.unhandled-link {\n color: lighten($ui-highlight-color, 8%);\n }\n }\n}\n\n.announcements {\n background: lighten($ui-base-color, 8%);\n font-size: 13px;\n display: flex;\n align-items: flex-end;\n\n &__mastodon {\n width: 124px;\n flex: 0 0 auto;\n\n @media screen and (max-width: 124px + 300px) {\n display: none;\n }\n }\n\n &__container {\n width: calc(100% - 124px);\n flex: 0 0 auto;\n position: relative;\n\n @media screen and (max-width: 124px + 300px) {\n width: 100%;\n }\n }\n\n &__item {\n box-sizing: border-box;\n width: 100%;\n padding: 15px;\n position: relative;\n font-size: 15px;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n max-height: 50vh;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n\n &__range {\n display: block;\n font-weight: 500;\n margin-bottom: 10px;\n padding-right: 18px;\n }\n\n &__unread {\n position: absolute;\n top: 19px;\n right: 19px;\n display: block;\n background: $highlight-text-color;\n border-radius: 50%;\n width: 0.625rem;\n height: 0.625rem;\n }\n }\n\n &__pagination {\n padding: 15px;\n color: $darker-text-color;\n position: absolute;\n bottom: 3px;\n right: 0;\n }\n}\n\n.layout-multiple-columns .announcements__mastodon {\n display: none;\n}\n\n.layout-multiple-columns .announcements__container {\n width: 100%;\n}\n\n.reactions-bar {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n margin-top: 15px;\n margin-left: -2px;\n width: calc(100% - (90px - 33px));\n\n &__item {\n flex-shrink: 0;\n background: lighten($ui-base-color, 12%);\n border: 0;\n border-radius: 3px;\n margin: 2px;\n cursor: pointer;\n user-select: none;\n padding: 0 6px;\n display: flex;\n align-items: center;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &__emoji {\n display: block;\n margin: 3px 0;\n width: 16px;\n height: 16px;\n\n img {\n display: block;\n margin: 0;\n width: 100%;\n height: 100%;\n min-width: auto;\n min-height: auto;\n vertical-align: bottom;\n object-fit: contain;\n }\n }\n\n &__count {\n display: block;\n min-width: 9px;\n font-size: 13px;\n font-weight: 500;\n text-align: center;\n margin-left: 6px;\n color: $darker-text-color;\n }\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 16%);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n\n &__count {\n color: lighten($darker-text-color, 4%);\n }\n }\n\n &.active {\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n background-color: mix(lighten($ui-base-color, 12%), $ui-highlight-color, 80%);\n\n .reactions-bar__item__count {\n color: lighten($highlight-text-color, 8%);\n }\n }\n }\n\n .emoji-picker-dropdown {\n margin: 2px;\n }\n\n &:hover .emoji-button {\n opacity: 0.85;\n }\n\n .emoji-button {\n color: $darker-text-color;\n margin: 0;\n font-size: 16px;\n width: auto;\n flex-shrink: 0;\n padding: 0 6px;\n height: 22px;\n display: flex;\n align-items: center;\n opacity: 0.5;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &:hover,\n &:active,\n &:focus {\n opacity: 1;\n color: lighten($darker-text-color, 4%);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n }\n }\n\n &--empty {\n .emoji-button {\n padding: 0;\n }\n }\n}\n",".poll {\n margin-top: 16px;\n font-size: 14px;\n\n ul,\n .e-content & ul {\n margin: 0;\n list-style: none;\n }\n\n li {\n margin-bottom: 10px;\n position: relative;\n }\n\n &__chart {\n border-radius: 4px;\n display: block;\n background: darken($ui-primary-color, 5%);\n height: 5px;\n min-width: 1%;\n\n &.leading {\n background: $ui-highlight-color;\n }\n }\n\n &__option {\n position: relative;\n display: flex;\n padding: 6px 0;\n line-height: 18px;\n cursor: default;\n overflow: hidden;\n\n &__text {\n display: inline-block;\n word-wrap: break-word;\n overflow-wrap: break-word;\n max-width: calc(100% - 45px - 25px);\n }\n\n input[type=radio],\n input[type=checkbox] {\n display: none;\n }\n\n .autossugest-input {\n flex: 1 1 auto;\n }\n\n input[type=text] {\n display: block;\n box-sizing: border-box;\n width: 100%;\n font-size: 14px;\n color: $inverted-text-color;\n display: block;\n outline: 0;\n font-family: inherit;\n background: $simple-background-color;\n border: 1px solid darken($simple-background-color, 14%);\n border-radius: 4px;\n padding: 6px 10px;\n\n &:focus {\n border-color: $highlight-text-color;\n }\n }\n\n &.selectable {\n cursor: pointer;\n }\n\n &.editable {\n display: flex;\n align-items: center;\n overflow: visible;\n }\n }\n\n &__input {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 50%;\n vertical-align: middle;\n margin-top: auto;\n margin-bottom: auto;\n flex: 0 0 18px;\n\n &.checkbox {\n border-radius: 4px;\n }\n\n &.active {\n border-color: $valid-value-color;\n background: $valid-value-color;\n }\n\n &:active,\n &:focus,\n &:hover {\n border-color: lighten($valid-value-color, 15%);\n border-width: 4px;\n }\n\n &::-moz-focus-inner {\n outline: 0 !important;\n border: 0;\n }\n\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n\n &__number {\n display: inline-block;\n width: 45px;\n font-weight: 700;\n flex: 0 0 45px;\n }\n\n &__voted {\n padding: 0 5px;\n display: inline-block;\n\n &__mark {\n font-size: 18px;\n }\n }\n\n &__footer {\n padding-top: 6px;\n padding-bottom: 5px;\n color: $dark-text-color;\n }\n\n &__link {\n display: inline;\n background: transparent;\n padding: 0;\n margin: 0;\n border: 0;\n color: $dark-text-color;\n text-decoration: underline;\n font-size: inherit;\n\n &:hover {\n text-decoration: none;\n }\n\n &:active,\n &:focus {\n background-color: rgba($dark-text-color, .1);\n }\n }\n\n .button {\n height: 36px;\n padding: 0 16px;\n margin-right: 10px;\n font-size: 14px;\n }\n}\n\n.compose-form__poll-wrapper {\n border-top: 1px solid darken($simple-background-color, 8%);\n overflow-x: hidden;\n\n ul {\n padding: 10px;\n }\n\n .poll__footer {\n border-top: 1px solid darken($simple-background-color, 8%);\n padding: 10px;\n display: flex;\n align-items: center;\n\n button,\n select {\n width: 100%;\n flex: 1 1 50%;\n\n &:focus {\n border-color: $highlight-text-color;\n }\n }\n }\n\n .button.button-secondary {\n font-size: 14px;\n font-weight: 400;\n padding: 6px 10px;\n height: auto;\n line-height: inherit;\n color: $action-button-color;\n border-color: $action-button-color;\n margin-right: 5px;\n }\n\n li {\n display: flex;\n align-items: center;\n\n .poll__option {\n flex: 0 0 auto;\n width: calc(100% - (23px + 6px));\n margin-right: 6px;\n }\n }\n\n select {\n appearance: none;\n box-sizing: border-box;\n font-size: 14px;\n color: $inverted-text-color;\n display: inline-block;\n width: auto;\n outline: 0;\n font-family: inherit;\n background: $simple-background-color url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center / auto 16px;\n border: 1px solid darken($simple-background-color, 14%);\n border-radius: 4px;\n padding: 6px 10px;\n padding-right: 30px;\n }\n\n .icon-button.disabled {\n color: darken($simple-background-color, 14%);\n }\n}\n\n.muted .poll {\n color: $dark-text-color;\n\n &__chart {\n background: rgba(darken($ui-primary-color, 14%), 0.2);\n\n &.leading {\n background: rgba($ui-highlight-color, 0.2);\n }\n }\n}\n","$maximum-width: 1235px;\n$fluid-breakpoint: $maximum-width + 20px;\n$column-breakpoint: 700px;\n$small-breakpoint: 960px;\n\n.container {\n box-sizing: border-box;\n max-width: $maximum-width;\n margin: 0 auto;\n position: relative;\n\n @media screen and (max-width: $fluid-breakpoint) {\n width: 100%;\n padding: 0 10px;\n }\n}\n\n.rich-formatting {\n font-family: $font-sans-serif, sans-serif;\n font-size: 14px;\n font-weight: 400;\n line-height: 1.7;\n word-wrap: break-word;\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n p,\n li {\n color: $darker-text-color;\n }\n\n p {\n margin-top: 0;\n margin-bottom: .85em;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n strong {\n font-weight: 700;\n color: $secondary-text-color;\n }\n\n em {\n font-style: italic;\n color: $secondary-text-color;\n }\n\n code {\n font-size: 0.85em;\n background: darken($ui-base-color, 8%);\n border-radius: 4px;\n padding: 0.2em 0.3em;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n font-family: $font-display, sans-serif;\n margin-top: 1.275em;\n margin-bottom: .85em;\n font-weight: 500;\n color: $secondary-text-color;\n }\n\n h1 {\n font-size: 2em;\n }\n\n h2 {\n font-size: 1.75em;\n }\n\n h3 {\n font-size: 1.5em;\n }\n\n h4 {\n font-size: 1.25em;\n }\n\n h5,\n h6 {\n font-size: 1em;\n }\n\n ul {\n list-style: disc;\n }\n\n ol {\n list-style: decimal;\n }\n\n ul,\n ol {\n margin: 0;\n padding: 0;\n padding-left: 2em;\n margin-bottom: 0.85em;\n\n &[type='a'] {\n list-style-type: lower-alpha;\n }\n\n &[type='i'] {\n list-style-type: lower-roman;\n }\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n margin: 1.7em 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n\n table {\n width: 100%;\n border-collapse: collapse;\n break-inside: auto;\n margin-top: 24px;\n margin-bottom: 32px;\n\n thead tr,\n tbody tr {\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n font-size: 1em;\n line-height: 1.625;\n font-weight: 400;\n text-align: left;\n color: $darker-text-color;\n }\n\n thead tr {\n border-bottom-width: 2px;\n line-height: 1.5;\n font-weight: 500;\n color: $dark-text-color;\n }\n\n th,\n td {\n padding: 8px;\n align-self: start;\n align-items: start;\n word-break: break-all;\n\n &.nowrap {\n width: 25%;\n position: relative;\n\n &::before {\n content: ' ';\n visibility: hidden;\n }\n\n span {\n position: absolute;\n left: 8px;\n right: 8px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n }\n\n & > :first-child {\n margin-top: 0;\n }\n}\n\n.information-board {\n background: darken($ui-base-color, 4%);\n padding: 20px 0;\n\n .container-alt {\n position: relative;\n padding-right: 280px + 15px;\n }\n\n &__sections {\n display: flex;\n justify-content: space-between;\n flex-wrap: wrap;\n }\n\n &__section {\n flex: 1 0 0;\n font-family: $font-sans-serif, sans-serif;\n font-size: 16px;\n line-height: 28px;\n color: $primary-text-color;\n text-align: right;\n padding: 10px 15px;\n\n span,\n strong {\n display: block;\n }\n\n span {\n &:last-child {\n color: $secondary-text-color;\n }\n }\n\n strong {\n font-family: $font-display, sans-serif;\n font-weight: 500;\n font-size: 32px;\n line-height: 48px;\n }\n\n @media screen and (max-width: $column-breakpoint) {\n text-align: center;\n }\n }\n\n .panel {\n position: absolute;\n width: 280px;\n box-sizing: border-box;\n background: darken($ui-base-color, 8%);\n padding: 20px;\n padding-top: 10px;\n border-radius: 4px 4px 0 0;\n right: 0;\n bottom: -40px;\n\n .panel-header {\n font-family: $font-display, sans-serif;\n font-size: 14px;\n line-height: 24px;\n font-weight: 500;\n color: $darker-text-color;\n padding-bottom: 5px;\n margin-bottom: 15px;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n\n a,\n span {\n font-weight: 400;\n color: darken($darker-text-color, 10%);\n }\n\n a {\n text-decoration: none;\n }\n }\n }\n\n .owner {\n text-align: center;\n\n .avatar {\n width: 80px;\n height: 80px;\n @include avatar-size(80px);\n margin: 0 auto;\n margin-bottom: 15px;\n\n img {\n display: block;\n width: 80px;\n height: 80px;\n border-radius: 48px;\n @include avatar-radius();\n }\n }\n\n .name {\n font-size: 14px;\n\n a {\n display: block;\n color: $primary-text-color;\n text-decoration: none;\n\n &:hover {\n .display_name {\n text-decoration: underline;\n }\n }\n }\n\n .username {\n display: block;\n color: $darker-text-color;\n }\n }\n }\n}\n\n.landing-page {\n p,\n li {\n font-family: $font-sans-serif, sans-serif;\n font-size: 16px;\n font-weight: 400;\n font-size: 16px;\n line-height: 30px;\n margin-bottom: 12px;\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n }\n }\n\n em {\n display: inline;\n margin: 0;\n padding: 0;\n font-weight: 700;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n color: lighten($darker-text-color, 10%);\n }\n\n h1 {\n font-family: $font-display, sans-serif;\n font-size: 26px;\n line-height: 30px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n\n small {\n font-family: $font-sans-serif, sans-serif;\n display: block;\n font-size: 18px;\n font-weight: 400;\n color: lighten($darker-text-color, 10%);\n }\n }\n\n h2 {\n font-family: $font-display, sans-serif;\n font-size: 22px;\n line-height: 26px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h3 {\n font-family: $font-display, sans-serif;\n font-size: 18px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h4 {\n font-family: $font-display, sans-serif;\n font-size: 16px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h5 {\n font-family: $font-display, sans-serif;\n font-size: 14px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h6 {\n font-family: $font-display, sans-serif;\n font-size: 12px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n ul,\n ol {\n margin-left: 20px;\n\n &[type='a'] {\n list-style-type: lower-alpha;\n }\n\n &[type='i'] {\n list-style-type: lower-roman;\n }\n }\n\n ul {\n list-style: disc;\n }\n\n ol {\n list-style: decimal;\n }\n\n li > ol,\n li > ul {\n margin-top: 6px;\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid rgba($ui-base-lighter-color, .6);\n margin: 20px 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n\n &__information,\n &__forms {\n padding: 20px;\n }\n\n &__call-to-action {\n background: $ui-base-color;\n border-radius: 4px;\n padding: 25px 40px;\n overflow: hidden;\n box-sizing: border-box;\n\n .row {\n width: 100%;\n display: flex;\n flex-direction: row-reverse;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n }\n\n .row__information-board {\n display: flex;\n justify-content: flex-end;\n align-items: flex-end;\n\n .information-board__section {\n flex: 1 0 auto;\n padding: 0 10px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n width: 100%;\n justify-content: space-between;\n }\n }\n\n .row__mascot {\n flex: 1;\n margin: 10px -50px 0 0;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n }\n\n &__logo {\n margin-right: 20px;\n\n img {\n height: 50px;\n width: auto;\n mix-blend-mode: lighten;\n }\n }\n\n &__information {\n padding: 45px 40px;\n margin-bottom: 10px;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n strong {\n font-weight: 500;\n color: lighten($darker-text-color, 10%);\n }\n\n .account {\n border-bottom: 0;\n padding: 0;\n\n &__display-name {\n align-items: center;\n display: flex;\n margin-right: 5px;\n }\n\n div.account__display-name {\n &:hover {\n .display-name strong {\n text-decoration: none;\n }\n }\n\n .account__avatar {\n cursor: default;\n }\n }\n\n &__avatar-wrapper {\n margin-left: 0;\n flex: 0 0 auto;\n }\n\n &__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n @include avatar-size(44px);\n }\n\n .display-name {\n font-size: 15px;\n\n &__account {\n font-size: 14px;\n }\n }\n }\n\n @media screen and (max-width: $small-breakpoint) {\n .contact {\n margin-top: 30px;\n }\n }\n\n @media screen and (max-width: $column-breakpoint) {\n padding: 25px 20px;\n }\n }\n\n &__information,\n &__forms,\n #mastodon-timeline {\n box-sizing: border-box;\n background: $ui-base-color;\n border-radius: 4px;\n box-shadow: 0 0 6px rgba($black, 0.1);\n }\n\n &__mascot {\n height: 104px;\n position: relative;\n left: -40px;\n bottom: 25px;\n\n img {\n height: 190px;\n width: auto;\n }\n }\n\n &__short-description {\n .row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n margin-bottom: 40px;\n }\n\n @media screen and (max-width: $column-breakpoint) {\n .row {\n margin-bottom: 20px;\n }\n }\n\n p a {\n color: $secondary-text-color;\n }\n\n h1 {\n font-weight: 500;\n color: $primary-text-color;\n margin-bottom: 0;\n\n small {\n color: $darker-text-color;\n\n span {\n color: $secondary-text-color;\n }\n }\n }\n\n p:last-child {\n margin-bottom: 0;\n }\n }\n\n &__hero {\n margin-bottom: 10px;\n\n img {\n display: block;\n margin: 0;\n max-width: 100%;\n height: auto;\n border-radius: 4px;\n }\n }\n\n @media screen and (max-width: 840px) {\n .information-board {\n .container-alt {\n padding-right: 20px;\n }\n\n .panel {\n position: static;\n margin-top: 20px;\n width: 100%;\n border-radius: 4px;\n\n .panel-header {\n text-align: center;\n }\n }\n }\n }\n\n @media screen and (max-width: 675px) {\n .header-wrapper {\n padding-top: 0;\n\n &.compact {\n padding-bottom: 0;\n }\n\n &.compact .hero .heading {\n text-align: initial;\n }\n }\n\n .header .container-alt,\n .features .container-alt {\n display: block;\n }\n }\n\n .cta {\n margin: 20px;\n }\n}\n\n.landing {\n margin-bottom: 100px;\n\n @media screen and (max-width: 738px) {\n margin-bottom: 0;\n }\n\n &__brand {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 50px;\n\n svg {\n fill: $primary-text-color;\n height: 52px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding: 0;\n margin-bottom: 30px;\n }\n }\n\n .directory {\n margin-top: 30px;\n background: transparent;\n box-shadow: none;\n border-radius: 0;\n }\n\n .hero-widget {\n margin-top: 30px;\n margin-bottom: 0;\n\n h4 {\n padding: 10px;\n text-transform: uppercase;\n font-weight: 700;\n font-size: 13px;\n color: $darker-text-color;\n }\n\n &__text {\n border-radius: 0;\n padding-bottom: 0;\n }\n\n &__footer {\n background: $ui-base-color;\n padding: 10px;\n border-radius: 0 0 4px 4px;\n display: flex;\n\n &__column {\n flex: 1 1 50%;\n }\n }\n\n .account {\n padding: 10px 0;\n border-bottom: 0;\n\n .account__display-name {\n display: flex;\n align-items: center;\n }\n\n .account__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n }\n\n &__counter {\n padding: 10px;\n\n strong {\n font-family: $font-display, sans-serif;\n font-size: 15px;\n font-weight: 700;\n display: block;\n }\n\n span {\n font-size: 14px;\n color: $darker-text-color;\n }\n }\n }\n\n .simple_form .user_agreement .label_input > label {\n font-weight: 400;\n color: $darker-text-color;\n }\n\n .simple_form p.lead {\n color: $darker-text-color;\n font-size: 15px;\n line-height: 20px;\n font-weight: 400;\n margin-bottom: 25px;\n }\n\n &__grid {\n max-width: 960px;\n margin: 0 auto;\n display: grid;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n grid-gap: 30px;\n\n @media screen and (max-width: 738px) {\n grid-template-columns: minmax(0, 100%);\n grid-gap: 10px;\n\n &__column-login {\n grid-row: 1;\n display: flex;\n flex-direction: column;\n\n .box-widget {\n order: 2;\n flex: 0 0 auto;\n }\n\n .hero-widget {\n margin-top: 0;\n margin-bottom: 10px;\n order: 1;\n flex: 0 0 auto;\n }\n }\n\n &__column-registration {\n grid-row: 2;\n }\n\n .directory {\n margin-top: 10px;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n\n .hero-widget {\n display: block;\n margin-bottom: 0;\n box-shadow: none;\n\n &__img,\n &__img img,\n &__footer {\n border-radius: 0;\n }\n }\n\n .hero-widget,\n .box-widget,\n .directory__tag {\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n .directory {\n margin-top: 0;\n\n &__tag {\n margin-bottom: 0;\n\n & > a,\n & > div {\n border-radius: 0;\n box-shadow: none;\n }\n\n &:last-child {\n border-bottom: 0;\n }\n }\n }\n }\n }\n}\n\n.brand {\n position: relative;\n text-decoration: none;\n}\n\n.brand__tagline {\n display: block;\n position: absolute;\n bottom: -10px;\n left: 50px;\n width: 300px;\n color: $ui-primary-color;\n text-decoration: none;\n font-size: 14px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n position: static;\n width: auto;\n margin-top: 20px;\n color: $dark-text-color;\n }\n}\n\n",".table {\n width: 100%;\n max-width: 100%;\n border-spacing: 0;\n border-collapse: collapse;\n\n th,\n td {\n padding: 8px;\n line-height: 18px;\n vertical-align: top;\n border-top: 1px solid $ui-base-color;\n text-align: left;\n background: darken($ui-base-color, 4%);\n }\n\n & > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid $ui-base-color;\n border-top: 0;\n font-weight: 500;\n }\n\n & > tbody > tr > th {\n font-weight: 500;\n }\n\n & > tbody > tr:nth-child(odd) > td,\n & > tbody > tr:nth-child(odd) > th {\n background: $ui-base-color;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n &.inline-table {\n & > tbody > tr:nth-child(odd) {\n & > td,\n & > th {\n background: transparent;\n }\n }\n\n & > tbody > tr:first-child {\n & > td,\n & > th {\n border-top: 0;\n }\n }\n }\n\n &.batch-table {\n & > thead > tr > th {\n background: $ui-base-color;\n border-top: 1px solid darken($ui-base-color, 8%);\n border-bottom: 1px solid darken($ui-base-color, 8%);\n\n &:first-child {\n border-radius: 4px 0 0;\n border-left: 1px solid darken($ui-base-color, 8%);\n }\n\n &:last-child {\n border-radius: 0 4px 0 0;\n border-right: 1px solid darken($ui-base-color, 8%);\n }\n }\n }\n\n &--invites tbody td {\n vertical-align: middle;\n }\n}\n\n.table-wrapper {\n overflow: auto;\n margin-bottom: 20px;\n}\n\nsamp {\n font-family: $font-monospace, monospace;\n}\n\nbutton.table-action-link {\n background: transparent;\n border: 0;\n font: inherit;\n}\n\nbutton.table-action-link,\na.table-action-link {\n text-decoration: none;\n display: inline-block;\n margin-right: 5px;\n padding: 0 10px;\n color: $darker-text-color;\n font-weight: 500;\n\n &:hover {\n color: $primary-text-color;\n }\n\n i.fa {\n font-weight: 400;\n margin-right: 5px;\n }\n\n &:first-child {\n padding-left: 0;\n }\n}\n\n.batch-table {\n &__toolbar,\n &__row {\n display: flex;\n\n &__select {\n box-sizing: border-box;\n padding: 8px 16px;\n cursor: pointer;\n min-height: 100%;\n\n input {\n margin-top: 8px;\n }\n\n &--aligned {\n display: flex;\n align-items: center;\n\n input {\n margin-top: 0;\n }\n }\n }\n\n &__actions,\n &__content {\n padding: 8px 0;\n padding-right: 16px;\n flex: 1 1 auto;\n }\n }\n\n &__toolbar {\n border: 1px solid darken($ui-base-color, 8%);\n background: $ui-base-color;\n border-radius: 4px 0 0;\n height: 47px;\n align-items: center;\n\n &__actions {\n text-align: right;\n padding-right: 16px - 5px;\n }\n }\n\n &__form {\n padding: 16px;\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n background: $ui-base-color;\n\n .fields-row {\n padding-top: 0;\n margin-bottom: 0;\n }\n }\n\n &__row {\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n background: darken($ui-base-color, 4%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n .optional &:first-child {\n border-top: 1px solid darken($ui-base-color, 8%);\n }\n }\n\n &:hover {\n background: darken($ui-base-color, 2%);\n }\n\n &:nth-child(even) {\n background: $ui-base-color;\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n }\n\n &__content {\n padding-top: 12px;\n padding-bottom: 16px;\n\n &--unpadded {\n padding: 0;\n }\n\n &--with-image {\n display: flex;\n align-items: center;\n }\n\n &__image {\n flex: 0 0 auto;\n display: flex;\n justify-content: center;\n align-items: center;\n margin-right: 10px;\n\n .emojione {\n width: 32px;\n height: 32px;\n }\n }\n\n &__text {\n flex: 1 1 auto;\n }\n\n &__extra {\n flex: 0 0 auto;\n text-align: right;\n color: $darker-text-color;\n font-weight: 500;\n }\n }\n\n .directory__tag {\n margin: 0;\n width: 100%;\n\n a {\n background: transparent;\n border-radius: 0;\n }\n }\n }\n\n &.optional .batch-table__toolbar,\n &.optional .batch-table__row__select {\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n\n .status__content {\n padding-top: 0;\n\n strong {\n font-weight: 700;\n }\n }\n\n .nothing-here {\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n box-shadow: none;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 1px solid darken($ui-base-color, 8%);\n }\n }\n\n @media screen and (max-width: 870px) {\n .accounts-table tbody td.optional {\n display: none;\n }\n }\n}\n","$no-columns-breakpoint: 600px;\n$sidebar-width: 240px;\n$content-width: 840px;\n\n.admin-wrapper {\n display: flex;\n justify-content: center;\n width: 100%;\n min-height: 100vh;\n\n .sidebar-wrapper {\n min-height: 100vh;\n overflow: hidden;\n pointer-events: none;\n flex: 1 1 auto;\n\n &__inner {\n display: flex;\n justify-content: flex-end;\n background: $ui-base-color;\n height: 100%;\n }\n }\n\n .sidebar {\n width: $sidebar-width;\n padding: 0;\n pointer-events: auto;\n\n &__toggle {\n display: none;\n background: lighten($ui-base-color, 8%);\n height: 48px;\n\n &__logo {\n flex: 1 1 auto;\n\n a {\n display: inline-block;\n padding: 15px;\n }\n\n svg {\n fill: $primary-text-color;\n height: 20px;\n position: relative;\n bottom: -2px;\n }\n }\n\n &__icon {\n display: block;\n color: $darker-text-color;\n text-decoration: none;\n flex: 0 0 auto;\n font-size: 20px;\n padding: 15px;\n }\n\n a {\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 12%);\n }\n }\n }\n\n .logo {\n display: block;\n margin: 40px auto;\n width: 100px;\n height: 100px;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n & > a:first-child {\n display: none;\n }\n }\n\n ul {\n list-style: none;\n border-radius: 4px 0 0 4px;\n overflow: hidden;\n margin-bottom: 20px;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n margin-bottom: 0;\n }\n\n a {\n display: block;\n padding: 15px;\n color: $darker-text-color;\n text-decoration: none;\n transition: all 200ms linear;\n transition-property: color, background-color;\n border-radius: 4px 0 0 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n i.fa {\n margin-right: 5px;\n }\n\n &:hover {\n color: $primary-text-color;\n background-color: darken($ui-base-color, 5%);\n transition: all 100ms linear;\n transition-property: color, background-color;\n }\n\n &.selected {\n background: darken($ui-base-color, 2%);\n border-radius: 4px 0 0;\n }\n }\n\n ul {\n background: darken($ui-base-color, 4%);\n border-radius: 0 0 0 4px;\n margin: 0;\n\n a {\n border: 0;\n padding: 15px 35px;\n }\n }\n\n .simple-navigation-active-leaf a {\n color: $primary-text-color;\n background-color: $ui-highlight-color;\n border-bottom: 0;\n border-radius: 0;\n\n &:hover {\n background-color: lighten($ui-highlight-color, 5%);\n }\n }\n }\n\n & > ul > .simple-navigation-active-leaf a {\n border-radius: 4px 0 0 4px;\n }\n }\n\n .content-wrapper {\n box-sizing: border-box;\n width: 100%;\n max-width: $content-width;\n flex: 1 1 auto;\n }\n\n @media screen and (max-width: $content-width + $sidebar-width) {\n .sidebar-wrapper--empty {\n display: none;\n }\n\n .sidebar-wrapper {\n width: $sidebar-width;\n flex: 0 0 auto;\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n .sidebar-wrapper {\n width: 100%;\n }\n }\n\n .content {\n padding: 20px 15px;\n padding-top: 60px;\n padding-left: 25px;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n max-width: none;\n padding: 15px;\n padding-top: 30px;\n }\n\n &-heading {\n display: flex;\n\n padding-bottom: 40px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n margin: -15px -15px 40px 0;\n\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n\n & > * {\n margin-top: 15px;\n margin-right: 15px;\n }\n\n &-actions {\n display: inline-flex;\n\n & > :not(:first-child) {\n margin-left: 5px;\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n border-bottom: 0;\n padding-bottom: 0;\n }\n }\n\n h2 {\n color: $secondary-text-color;\n font-size: 24px;\n line-height: 28px;\n font-weight: 400;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n font-weight: 700;\n }\n }\n\n h3 {\n color: $secondary-text-color;\n font-size: 20px;\n line-height: 28px;\n font-weight: 400;\n margin-bottom: 30px;\n }\n\n h4 {\n text-transform: uppercase;\n font-size: 13px;\n font-weight: 700;\n color: $darker-text-color;\n padding-bottom: 8px;\n margin-bottom: 8px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n h6 {\n font-size: 16px;\n color: $secondary-text-color;\n line-height: 28px;\n font-weight: 500;\n }\n\n .fields-group h6 {\n color: $primary-text-color;\n font-weight: 500;\n }\n\n .directory__tag > a,\n .directory__tag > div {\n box-shadow: none;\n }\n\n .directory__tag .table-action-link .fa {\n color: inherit;\n }\n\n .directory__tag h4 {\n font-size: 18px;\n font-weight: 700;\n color: $primary-text-color;\n text-transform: none;\n padding-bottom: 0;\n margin-bottom: 0;\n border-bottom: none;\n }\n\n & > p {\n font-size: 14px;\n line-height: 21px;\n color: $secondary-text-color;\n margin-bottom: 20px;\n\n strong {\n color: $primary-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid rgba($ui-base-lighter-color, .6);\n margin: 20px 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n\n .sidebar-wrapper {\n min-height: 0;\n }\n\n .sidebar {\n width: 100%;\n padding: 0;\n height: auto;\n\n &__toggle {\n display: flex;\n }\n\n & > ul {\n display: none;\n }\n\n ul a,\n ul ul a {\n border-radius: 0;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n transition: none;\n\n &:hover {\n transition: none;\n }\n }\n\n ul ul {\n border-radius: 0;\n }\n\n ul .simple-navigation-active-leaf a {\n border-bottom-color: $ui-highlight-color;\n }\n }\n }\n}\n\nhr.spacer {\n width: 100%;\n border: 0;\n margin: 20px 0;\n height: 1px;\n}\n\nbody,\n.admin-wrapper .content {\n .muted-hint {\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n }\n }\n\n .positive-hint {\n color: $valid-value-color;\n font-weight: 500;\n }\n\n .negative-hint {\n color: $error-value-color;\n font-weight: 500;\n }\n\n .neutral-hint {\n color: $dark-text-color;\n font-weight: 500;\n }\n\n .warning-hint {\n color: $gold-star;\n font-weight: 500;\n }\n}\n\n.filters {\n display: flex;\n flex-wrap: wrap;\n\n .filter-subset {\n flex: 0 0 auto;\n margin: 0 40px 20px 0;\n\n &:last-child {\n margin-bottom: 30px;\n }\n\n ul {\n margin-top: 5px;\n list-style: none;\n\n li {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n strong {\n font-weight: 500;\n text-transform: uppercase;\n font-size: 12px;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n &--with-select strong {\n display: block;\n margin-bottom: 10px;\n }\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n text-transform: uppercase;\n font-size: 12px;\n font-weight: 500;\n border-bottom: 2px solid $ui-base-color;\n\n &:hover {\n color: $primary-text-color;\n border-bottom: 2px solid lighten($ui-base-color, 5%);\n }\n\n &.selected {\n color: $highlight-text-color;\n border-bottom: 2px solid $ui-highlight-color;\n }\n }\n }\n}\n\n.flavour-screen {\n display: block;\n margin: 10px auto;\n max-width: 100%;\n}\n\n.flavour-description {\n display: block;\n font-size: 16px;\n margin: 10px 0;\n\n & > p {\n margin: 10px 0;\n }\n}\n\n.report-accounts {\n display: flex;\n flex-wrap: wrap;\n margin-bottom: 20px;\n}\n\n.report-accounts__item {\n display: flex;\n flex: 250px;\n flex-direction: column;\n margin: 0 5px;\n\n & > strong {\n display: block;\n margin: 0 0 10px -5px;\n font-weight: 500;\n font-size: 14px;\n line-height: 18px;\n color: $secondary-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n .account-card {\n flex: 1 1 auto;\n }\n}\n\n.report-status,\n.account-status {\n display: flex;\n margin-bottom: 10px;\n\n .activity-stream {\n flex: 2 0 0;\n margin-right: 20px;\n max-width: calc(100% - 60px);\n\n .entry {\n border-radius: 4px;\n }\n }\n}\n\n.report-status__actions,\n.account-status__actions {\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n\n .icon-button {\n font-size: 24px;\n width: 24px;\n text-align: center;\n margin-bottom: 10px;\n }\n}\n\n.simple_form.new_report_note,\n.simple_form.new_account_moderation_note {\n max-width: 100%;\n}\n\n.batch-form-box {\n display: flex;\n flex-wrap: wrap;\n margin-bottom: 5px;\n\n #form_status_batch_action {\n margin: 0 5px 5px 0;\n font-size: 14px;\n }\n\n input.button {\n margin: 0 5px 5px 0;\n }\n\n .media-spoiler-toggle-buttons {\n margin-left: auto;\n\n .button {\n overflow: visible;\n margin: 0 0 5px 5px;\n float: right;\n }\n }\n}\n\n.back-link {\n margin-bottom: 10px;\n font-size: 14px;\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.spacer {\n flex: 1 1 auto;\n}\n\n.log-entry {\n line-height: 20px;\n padding: 15px 0;\n background: $ui-base-color;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n\n &:last-child {\n border-bottom: 0;\n }\n\n &__header {\n display: flex;\n justify-content: flex-start;\n align-items: center;\n color: $darker-text-color;\n font-size: 14px;\n padding: 0 10px;\n }\n\n &__avatar {\n margin-right: 10px;\n\n .avatar {\n display: block;\n margin: 0;\n border-radius: 50%;\n width: 40px;\n height: 40px;\n }\n }\n\n &__content {\n max-width: calc(100% - 90px);\n }\n\n &__title {\n word-wrap: break-word;\n }\n\n &__timestamp {\n color: $dark-text-color;\n }\n\n a,\n .username,\n .target {\n color: $secondary-text-color;\n text-decoration: none;\n font-weight: 500;\n }\n}\n\na.name-tag,\n.name-tag,\na.inline-name-tag,\n.inline-name-tag {\n text-decoration: none;\n color: $secondary-text-color;\n\n .username {\n font-weight: 500;\n }\n\n &.suspended {\n .username {\n text-decoration: line-through;\n color: lighten($error-red, 12%);\n }\n\n .avatar {\n filter: grayscale(100%);\n opacity: 0.8;\n }\n }\n}\n\na.name-tag,\n.name-tag {\n display: flex;\n align-items: center;\n\n .avatar {\n display: block;\n margin: 0;\n margin-right: 5px;\n border-radius: 50%;\n }\n\n &.suspended {\n .avatar {\n filter: grayscale(100%);\n opacity: 0.8;\n }\n }\n}\n\n.speech-bubble {\n margin-bottom: 20px;\n border-left: 4px solid $ui-highlight-color;\n\n &.positive {\n border-left-color: $success-green;\n }\n\n &.negative {\n border-left-color: lighten($error-red, 12%);\n }\n\n &.warning {\n border-left-color: $gold-star;\n }\n\n &__bubble {\n padding: 16px;\n padding-left: 14px;\n font-size: 15px;\n line-height: 20px;\n border-radius: 4px 4px 4px 0;\n position: relative;\n font-weight: 500;\n\n a {\n color: $darker-text-color;\n }\n }\n\n &__owner {\n padding: 8px;\n padding-left: 12px;\n }\n\n time {\n color: $dark-text-color;\n }\n}\n\n.report-card {\n background: $ui-base-color;\n border-radius: 4px;\n margin-bottom: 20px;\n\n &__profile {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 15px;\n\n .account {\n padding: 0;\n border: 0;\n\n &__avatar-wrapper {\n margin-left: 0;\n }\n }\n\n &__stats {\n flex: 0 0 auto;\n font-weight: 500;\n color: $darker-text-color;\n text-transform: uppercase;\n text-align: right;\n\n a {\n color: inherit;\n text-decoration: none;\n\n &:focus,\n &:hover,\n &:active {\n color: lighten($darker-text-color, 8%);\n }\n }\n\n .red {\n color: $error-value-color;\n }\n }\n }\n\n &__summary {\n &__item {\n display: flex;\n justify-content: flex-start;\n border-top: 1px solid darken($ui-base-color, 4%);\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n\n &__reported-by,\n &__assigned {\n padding: 15px;\n flex: 0 0 auto;\n box-sizing: border-box;\n width: 150px;\n color: $darker-text-color;\n\n &,\n .username {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n &__content {\n flex: 1 1 auto;\n max-width: calc(100% - 300px);\n\n &__icon {\n color: $dark-text-color;\n margin-right: 4px;\n font-weight: 500;\n }\n }\n\n &__content a {\n display: block;\n box-sizing: border-box;\n width: 100%;\n padding: 15px;\n text-decoration: none;\n color: $darker-text-color;\n }\n }\n }\n}\n\n.one-line {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.ellipsized-ip {\n display: inline-block;\n max-width: 120px;\n overflow: hidden;\n text-overflow: ellipsis;\n vertical-align: middle;\n}\n\n.admin-account-bio {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n margin-top: 20px;\n\n > div {\n box-sizing: border-box;\n padding: 0 5px;\n margin-bottom: 10px;\n flex: 1 0 50%;\n }\n\n .account__header__fields,\n .account__header__content {\n background: lighten($ui-base-color, 8%);\n border-radius: 4px;\n height: 100%;\n }\n\n .account__header__fields {\n margin: 0;\n border: 0;\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n\n .account__header__content {\n box-sizing: border-box;\n padding: 20px;\n color: $primary-text-color;\n }\n}\n\n.center-text {\n text-align: center;\n}\n\n.announcements-list {\n border: 1px solid lighten($ui-base-color, 4%);\n border-radius: 4px;\n\n &__item {\n padding: 15px 0;\n background: $ui-base-color;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n\n &__title {\n padding: 0 15px;\n display: block;\n font-weight: 500;\n font-size: 18px;\n line-height: 1.5;\n color: $secondary-text-color;\n text-decoration: none;\n margin-bottom: 10px;\n\n &:hover,\n &:focus,\n &:active {\n color: $primary-text-color;\n }\n }\n\n &__meta {\n padding: 0 15px;\n color: $dark-text-color;\n }\n\n &__action-bar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n &:last-child {\n border-bottom: 0;\n }\n }\n}\n","$emojis-requiring-outlines: '8ball' 'ant' 'back' 'black_circle' 'black_heart' 'black_large_square' 'black_medium_small_square' 'black_medium_square' 'black_nib' 'black_small_square' 'bomb' 'bowling' 'bust_in_silhouette' 'busts_in_silhouette' 'camera' 'camera_with_flash' 'clubs' 'copyright' 'curly_loop' 'currency_exchange' 'dark_sunglasses' 'eight_pointed_black_star' 'electric_plug' 'end' 'female-guard' 'film_projector' 'fried_egg' 'gorilla' 'guardsman' 'heavy_check_mark' 'heavy_division_sign' 'heavy_dollar_sign' 'heavy_minus_sign' 'heavy_multiplication_x' 'heavy_plus_sign' 'hocho' 'hole' 'joystick' 'kaaba' 'lower_left_ballpoint_pen' 'lower_left_fountain_pen' 'male-guard' 'microphone' 'mortar_board' 'movie_camera' 'musical_score' 'on' 'registered' 'soon' 'spades' 'speaking_head_in_silhouette' 'spider' 'telephone_receiver' 'tm' 'top' 'tophat' 'turkey' 'vhs' 'video_camera' 'video_game' 'water_buffalo' 'waving_black_flag' 'wavy_dash' !default;\n\n%emoji-outline {\n filter: drop-shadow(1px 1px 0 $primary-text-color) drop-shadow(-1px 1px 0 $primary-text-color) drop-shadow(1px -1px 0 $primary-text-color) drop-shadow(-1px -1px 0 $primary-text-color);\n}\n\n.emojione {\n @each $emoji in $emojis-requiring-outlines {\n &[title=':#{$emoji}:'] {\n @extend %emoji-outline;\n }\n }\n}\n\n.hicolor-privacy-icons {\n .status__visibility-icon.fa-globe,\n .composer--options--dropdown--content--item .fa-globe {\n color: #1976D2;\n }\n\n .status__visibility-icon.fa-unlock,\n .composer--options--dropdown--content--item .fa-unlock {\n color: #388E3C;\n }\n\n .status__visibility-icon.fa-lock,\n .composer--options--dropdown--content--item .fa-lock {\n color: #FFA000;\n }\n\n .status__visibility-icon.fa-envelope,\n .composer--options--dropdown--content--item .fa-envelope {\n color: #D32F2F;\n }\n}\n","body.rtl {\n direction: rtl;\n\n .column-header > button {\n text-align: right;\n padding-left: 0;\n padding-right: 15px;\n }\n\n .radio-button__input {\n margin-right: 0;\n margin-left: 10px;\n }\n\n .directory__card__bar .display-name {\n margin-left: 0;\n margin-right: 15px;\n }\n\n .display-name {\n text-align: right;\n }\n\n .notification__message {\n margin-left: 0;\n margin-right: 68px;\n }\n\n .drawer__inner__mastodon > img {\n transform: scaleX(-1);\n }\n\n .notification__favourite-icon-wrapper {\n left: auto;\n right: -26px;\n }\n\n .landing-page__logo {\n margin-right: 0;\n margin-left: 20px;\n }\n\n .landing-page .features-list .features-list__row .visual {\n margin-left: 0;\n margin-right: 15px;\n }\n\n .column-link__icon,\n .column-header__icon {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .compose-form .compose-form__buttons-wrapper .character-counter__wrapper {\n margin-right: 0;\n margin-left: 4px;\n }\n\n .composer--publisher {\n text-align: left;\n }\n\n .boost-modal__status-time,\n .favourite-modal__status-time {\n float: left;\n }\n\n .navigation-bar__profile {\n margin-left: 0;\n margin-right: 8px;\n }\n\n .search__input {\n padding-right: 10px;\n padding-left: 30px;\n }\n\n .search__icon .fa {\n right: auto;\n left: 10px;\n }\n\n .columns-area {\n direction: rtl;\n }\n\n .column-header__buttons {\n left: 0;\n right: auto;\n margin-left: 0;\n margin-right: -15px;\n }\n\n .column-inline-form .icon-button {\n margin-left: 0;\n margin-right: 5px;\n }\n\n .column-header__links .text-btn {\n margin-left: 10px;\n margin-right: 0;\n }\n\n .account__avatar-wrapper {\n float: right;\n }\n\n .column-header__back-button {\n padding-left: 5px;\n padding-right: 0;\n }\n\n .column-header__setting-arrows {\n float: left;\n }\n\n .setting-toggle__label {\n margin-left: 0;\n margin-right: 8px;\n }\n\n .setting-meta__label {\n float: left;\n }\n\n .status__avatar {\n margin-left: 10px;\n margin-right: 0;\n\n // Those are used for public pages\n left: auto;\n right: 10px;\n }\n\n .activity-stream .status.light {\n padding-left: 10px;\n padding-right: 68px;\n }\n\n .status__info .status__display-name,\n .activity-stream .status.light .status__display-name {\n padding-left: 25px;\n padding-right: 0;\n }\n\n .activity-stream .pre-header {\n padding-right: 68px;\n padding-left: 0;\n }\n\n .status__prepend {\n margin-left: 0;\n margin-right: 58px;\n }\n\n .status__prepend-icon-wrapper {\n left: auto;\n right: -26px;\n }\n\n .activity-stream .pre-header .pre-header__icon {\n left: auto;\n right: 42px;\n }\n\n .account__avatar-overlay-overlay {\n right: auto;\n left: 0;\n }\n\n .column-back-button--slim-button {\n right: auto;\n left: 0;\n }\n\n .status__relative-time,\n .activity-stream .status.light .status__header .status__meta {\n float: left;\n text-align: left;\n }\n\n .status__action-bar {\n &__counter {\n margin-right: 0;\n margin-left: 11px;\n\n .status__action-bar-button {\n margin-right: 0;\n margin-left: 4px;\n }\n }\n }\n\n .status__action-bar-button {\n float: right;\n margin-right: 0;\n margin-left: 18px;\n }\n\n .status__action-bar-dropdown {\n float: right;\n }\n\n .privacy-dropdown__dropdown {\n margin-left: 0;\n margin-right: 40px;\n }\n\n .privacy-dropdown__option__icon {\n margin-left: 10px;\n margin-right: 0;\n }\n\n .detailed-status__display-name .display-name {\n text-align: right;\n }\n\n .detailed-status__display-avatar {\n margin-right: 0;\n margin-left: 10px;\n float: right;\n }\n\n .detailed-status__favorites,\n .detailed-status__reblogs {\n margin-left: 0;\n margin-right: 6px;\n }\n\n .fa-ul {\n margin-left: 2.14285714em;\n }\n\n .fa-li {\n left: auto;\n right: -2.14285714em;\n }\n\n .admin-wrapper {\n direction: rtl;\n }\n\n .admin-wrapper .sidebar ul a i.fa,\n a.table-action-link i.fa {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .simple_form .check_boxes .checkbox label {\n padding-left: 0;\n padding-right: 25px;\n }\n\n .simple_form .input.with_label.boolean label.checkbox {\n padding-left: 25px;\n padding-right: 0;\n }\n\n .simple_form .check_boxes .checkbox input[type=\"checkbox\"],\n .simple_form .input.boolean input[type=\"checkbox\"] {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.radio_buttons .radio {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.radio_buttons .radio > label {\n padding-right: 28px;\n padding-left: 0;\n }\n\n .simple_form .input-with-append .input input {\n padding-left: 142px;\n padding-right: 0;\n }\n\n .simple_form .input.boolean label.checkbox {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.boolean .label_input,\n .simple_form .input.boolean .hint {\n padding-left: 0;\n padding-right: 28px;\n }\n\n .simple_form .label_input__append {\n right: auto;\n left: 3px;\n\n &::after {\n right: auto;\n left: 0;\n background-image: linear-gradient(to left, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));\n }\n }\n\n .simple_form select {\n background: darken($ui-base-color, 10%) url(\"data:image/svg+xml;utf8,\") no-repeat left 8px center / auto 16px;\n }\n\n .table th,\n .table td {\n text-align: right;\n }\n\n .filters .filter-subset {\n margin-right: 0;\n margin-left: 45px;\n }\n\n .landing-page .header-wrapper .mascot {\n right: 60px;\n left: auto;\n }\n\n .landing-page__call-to-action .row__information-board {\n direction: rtl;\n }\n\n .landing-page .header .hero .floats .float-1 {\n left: -120px;\n right: auto;\n }\n\n .landing-page .header .hero .floats .float-2 {\n left: 210px;\n right: auto;\n }\n\n .landing-page .header .hero .floats .float-3 {\n left: 110px;\n right: auto;\n }\n\n .landing-page .header .links .brand img {\n left: 0;\n }\n\n .landing-page .fa-external-link {\n padding-right: 5px;\n padding-left: 0 !important;\n }\n\n .landing-page .features #mastodon-timeline {\n margin-right: 0;\n margin-left: 30px;\n }\n\n @media screen and (min-width: 631px) {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n\n &:first-child {\n padding-left: 5px;\n padding-right: 10px;\n }\n }\n\n .columns-area > div {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n }\n }\n }\n\n .columns-area--mobile .column,\n .columns-area--mobile .drawer {\n padding-left: 0;\n padding-right: 0;\n }\n\n .public-layout {\n .header {\n .nav-button {\n margin-left: 8px;\n margin-right: 0;\n }\n }\n\n .public-account-header__tabs {\n margin-left: 0;\n margin-right: 20px;\n }\n }\n\n .landing-page__information {\n .account__display-name {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .account__avatar-wrapper {\n margin-left: 12px;\n margin-right: 0;\n }\n }\n\n .card__bar .display-name {\n margin-left: 0;\n margin-right: 15px;\n text-align: right;\n }\n\n .fa-chevron-left::before {\n content: \"\\F054\";\n }\n\n .fa-chevron-right::before {\n content: \"\\F053\";\n }\n\n .column-back-button__icon {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .column-header__setting-arrows .column-header__setting-btn:last-child {\n padding-left: 0;\n padding-right: 10px;\n }\n\n .simple_form .input.radio_buttons .radio > label input {\n left: auto;\n right: 0;\n }\n}\n",".dashboard__counters {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n margin-bottom: 20px;\n\n & > div {\n box-sizing: border-box;\n flex: 0 0 33.333%;\n padding: 0 5px;\n margin-bottom: 10px;\n\n & > div,\n & > a {\n padding: 20px;\n background: lighten($ui-base-color, 4%);\n border-radius: 4px;\n box-sizing: border-box;\n height: 100%;\n }\n\n & > a {\n text-decoration: none;\n color: inherit;\n display: block;\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 8%);\n }\n }\n }\n\n &__num,\n &__text {\n text-align: center;\n font-weight: 500;\n font-size: 24px;\n line-height: 21px;\n color: $primary-text-color;\n font-family: $font-display, sans-serif;\n margin-bottom: 20px;\n line-height: 30px;\n }\n\n &__text {\n font-size: 18px;\n }\n\n &__label {\n font-size: 14px;\n color: $darker-text-color;\n text-align: center;\n font-weight: 500;\n }\n}\n\n.dashboard__widgets {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n\n & > div {\n flex: 0 0 33.333%;\n margin-bottom: 20px;\n\n & > div {\n padding: 0 5px;\n }\n }\n\n a:not(.name-tag) {\n color: $ui-secondary-color;\n font-weight: 500;\n text-decoration: none;\n }\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/packs/flavours/glitch/common.js b/priv/static/packs/flavours/glitch/common.js index ac5adaf84..6535dc828 100644 Binary files a/priv/static/packs/flavours/glitch/common.js and b/priv/static/packs/flavours/glitch/common.js differ diff --git a/priv/static/packs/flavours/glitch/common.js.map b/priv/static/packs/flavours/glitch/common.js.map index f079b32e5..4090e336c 100644 Binary files a/priv/static/packs/flavours/glitch/common.js.map and b/priv/static/packs/flavours/glitch/common.js.map differ diff --git a/priv/static/packs/flavours/glitch/embed.js b/priv/static/packs/flavours/glitch/embed.js index d72d5eb4a..fa84055a4 100644 Binary files a/priv/static/packs/flavours/glitch/embed.js and b/priv/static/packs/flavours/glitch/embed.js differ diff --git a/priv/static/packs/flavours/glitch/admin.js.LICENSE b/priv/static/packs/flavours/glitch/embed.js.LICENSE.txt similarity index 91% rename from priv/static/packs/flavours/glitch/admin.js.LICENSE rename to priv/static/packs/flavours/glitch/embed.js.LICENSE.txt index 448b94017..2196b2def 100644 --- a/priv/static/packs/flavours/glitch/admin.js.LICENSE +++ b/priv/static/packs/flavours/glitch/embed.js.LICENSE.txt @@ -1,22 +1,10 @@ -/** @license React v16.12.0 - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/ -/** @license React v16.12.0 - * react-dom.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -/** @license React v0.18.0 +/** @license React v0.19.0 * scheduler.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. @@ -34,8 +22,20 @@ * LICENSE file in the root directory of this source tree. */ -/* -object-assign -(c) Sindre Sorhus -@license MIT -*/ +/** @license React v16.13.0 + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** @license React v16.13.1 + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ diff --git a/priv/static/packs/flavours/glitch/embed.js.map b/priv/static/packs/flavours/glitch/embed.js.map index 72ef31ea0..18537f622 100644 Binary files a/priv/static/packs/flavours/glitch/embed.js.map and b/priv/static/packs/flavours/glitch/embed.js.map differ diff --git a/priv/static/packs/flavours/glitch/error.js b/priv/static/packs/flavours/glitch/error.js index 6cd2b3257..4b17ae7a4 100644 Binary files a/priv/static/packs/flavours/glitch/error.js and b/priv/static/packs/flavours/glitch/error.js differ diff --git a/priv/static/packs/flavours/glitch/home.js b/priv/static/packs/flavours/glitch/home.js index b1d7f479a..030a30c4d 100644 Binary files a/priv/static/packs/flavours/glitch/home.js and b/priv/static/packs/flavours/glitch/home.js differ diff --git a/priv/static/packs/flavours/glitch/home.js.LICENSE b/priv/static/packs/flavours/glitch/home.js.LICENSE.txt similarity index 98% rename from priv/static/packs/flavours/glitch/home.js.LICENSE rename to priv/static/packs/flavours/glitch/home.js.LICENSE.txt index c81616ce6..41a8734c9 100644 --- a/priv/static/packs/flavours/glitch/home.js.LICENSE +++ b/priv/static/packs/flavours/glitch/home.js.LICENSE.txt @@ -1,3 +1,9 @@ +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/ + /*! Copyright (c) 2017 Jed Watson. Licensed under the MIT License (MIT), see @@ -12,31 +18,152 @@ * MIT Licensed */ -/* -object-assign -(c) Sindre Sorhus -@license MIT -*/ - -/** @license React v16.12.0 - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. +/*! + * wavesurfer.js 3.3.1 (2020-01-14) + * https://github.com/katspaugh/wavesurfer.js + * @license BSD-3-Clause */ -/** @license React v16.12.0 - * react-dom.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. +/*! ./ajax */ + +/*! ./drawer */ + +/*! ./drawer.canvasentry */ + +/*! ./drawer.multicanvas */ + +/*! ./extend */ + +/*! ./fetch */ + +/*! ./frame */ + +/*! ./get-id */ + +/*! ./max */ + +/*! ./mediaelement */ + +/*! ./mediaelement-webaudio */ + +/*! ./min */ + +/*! ./observer */ + +/*! ./peakcache */ + +/*! ./prevent-click */ + +/*! ./request-animation-frame */ + +/*! ./style */ + +/*! ./util */ + +/*! ./util/get-id */ + +/*! ./util/style */ + +/*! ./webaudio */ + +/*! debounce */ + +/*! https://mths.be/punycode v1.4.1 by @mathias */ + +/*! no static exports found */ + +/*!***********************!*\ + !*** ./src/drawer.js ***! + \***********************/ + +/*!*************************!*\ + !*** ./src/util/max.js ***! + \*************************/ + +/*!*************************!*\ + !*** ./src/util/min.js ***! + \*************************/ + +/*!*************************!*\ + !*** ./src/webaudio.js ***! + \*************************/ + +/*!**************************!*\ + !*** ./src/peakcache.js ***! + \**************************/ + +/*!**************************!*\ + !*** ./src/util/ajax.js ***! + \**************************/ + +/*!***************************!*\ + !*** ./src/util/fetch.js ***! + \***************************/ + +/*!***************************!*\ + !*** ./src/util/frame.js ***! + \***************************/ + +/*!***************************!*\ + !*** ./src/util/index.js ***! + \***************************/ + +/*!***************************!*\ + !*** ./src/util/style.js ***! + \***************************/ + +/*!***************************!*\ + !*** ./src/wavesurfer.js ***! + \***************************/ + +/*!****************************!*\ + !*** ./src/util/extend.js ***! + \****************************/ + +/*!****************************!*\ + !*** ./src/util/get-id.js ***! + \****************************/ + +/*!*****************************!*\ + !*** ./src/mediaelement.js ***! + \*****************************/ + +/*!******************************!*\ + !*** ./src/util/observer.js ***! + \******************************/ + +/*!***********************************!*\ + !*** ./src/drawer.canvasentry.js ***! + \***********************************/ + +/*!***********************************!*\ + !*** ./src/drawer.multicanvas.js ***! + \***********************************/ + +/*!***********************************!*\ + !*** ./src/util/prevent-click.js ***! + \***********************************/ + +/*!**************************************!*\ + !*** ./src/mediaelement-webaudio.js ***! + \**************************************/ + +/*!****************************************!*\ + !*** ./node_modules/debounce/index.js ***! + \****************************************/ + +/*!*********************************************!*\ + !*** ./src/util/request-animation-frame.js ***! + \*********************************************/ + +/** + * @license MIT + * @fileOverview Favico animations + * @author Miroslav Magda, http://blog.ejci.net + * @version 0.3.10 */ -/** @license React v0.18.0 +/** @license React v0.19.0 * scheduler.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. @@ -54,149 +181,22 @@ object-assign * LICENSE file in the root directory of this source tree. */ -/*! - * wavesurfer.js 3.3.1 (2020-01-14) - * https://github.com/katspaugh/wavesurfer.js - * @license BSD-3-Clause +/** @license React v16.13.0 + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. */ -/*!****************************************!*\ - !*** ./node_modules/debounce/index.js ***! - \****************************************/ - -/*! no static exports found */ - -/*!***********************************!*\ - !*** ./src/drawer.canvasentry.js ***! - \***********************************/ - -/*! ./util/style */ - -/*! ./util/get-id */ - -/*!***********************!*\ - !*** ./src/drawer.js ***! - \***********************/ - -/*! ./util */ - -/*!***********************************!*\ - !*** ./src/drawer.multicanvas.js ***! - \***********************************/ - -/*! ./drawer */ - -/*! ./drawer.canvasentry */ - -/*!**************************************!*\ - !*** ./src/mediaelement-webaudio.js ***! - \**************************************/ - -/*! ./mediaelement */ - -/*!*****************************!*\ - !*** ./src/mediaelement.js ***! - \*****************************/ - -/*! ./webaudio */ - -/*!**************************!*\ - !*** ./src/peakcache.js ***! - \**************************/ - -/*!**************************!*\ - !*** ./src/util/ajax.js ***! - \**************************/ - -/*! ./observer */ - -/*!****************************!*\ - !*** ./src/util/extend.js ***! - \****************************/ - -/*!***************************!*\ - !*** ./src/util/fetch.js ***! - \***************************/ - -/*!***************************!*\ - !*** ./src/util/frame.js ***! - \***************************/ - -/*! ./request-animation-frame */ - -/*!****************************!*\ - !*** ./src/util/get-id.js ***! - \****************************/ - -/*!***************************!*\ - !*** ./src/util/index.js ***! - \***************************/ - -/*! ./ajax */ - -/*! ./get-id */ - -/*! ./max */ - -/*! ./min */ - -/*! ./extend */ - -/*! ./style */ - -/*! ./frame */ - -/*! debounce */ - -/*! ./prevent-click */ - -/*! ./fetch */ - -/*!*************************!*\ - !*** ./src/util/max.js ***! - \*************************/ - -/*!*************************!*\ - !*** ./src/util/min.js ***! - \*************************/ - -/*!******************************!*\ - !*** ./src/util/observer.js ***! - \******************************/ - -/*!***********************************!*\ - !*** ./src/util/prevent-click.js ***! - \***********************************/ - -/*!*********************************************!*\ - !*** ./src/util/request-animation-frame.js ***! - \*********************************************/ - -/*!***************************!*\ - !*** ./src/util/style.js ***! - \***************************/ - -/*!***************************!*\ - !*** ./src/wavesurfer.js ***! - \***************************/ - -/*! ./drawer.multicanvas */ - -/*! ./peakcache */ - -/*! ./mediaelement-webaudio */ - -/*!*************************!*\ - !*** ./src/webaudio.js ***! - \*************************/ - -/*! https://mths.be/punycode v1.4.1 by @mathias */ - -/** - * @license MIT - * @fileOverview Favico animations - * @author Miroslav Magda, http://blog.ejci.net - * @version 0.3.10 +/** @license React v16.13.1 + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. */ /*@cc_on!@*/ diff --git a/priv/static/packs/flavours/glitch/home.js.map b/priv/static/packs/flavours/glitch/home.js.map index 09e328ab8..5a58c58f0 100644 Binary files a/priv/static/packs/flavours/glitch/home.js.map and b/priv/static/packs/flavours/glitch/home.js.map differ diff --git a/priv/static/packs/flavours/glitch/public.js b/priv/static/packs/flavours/glitch/public.js index 4bef46655..c983e7f64 100644 Binary files a/priv/static/packs/flavours/glitch/public.js and b/priv/static/packs/flavours/glitch/public.js differ diff --git a/priv/static/packs/flavours/glitch/public.js.LICENSE b/priv/static/packs/flavours/glitch/public.js.LICENSE.txt similarity index 91% rename from priv/static/packs/flavours/glitch/public.js.LICENSE rename to priv/static/packs/flavours/glitch/public.js.LICENSE.txt index 448b94017..2196b2def 100644 --- a/priv/static/packs/flavours/glitch/public.js.LICENSE +++ b/priv/static/packs/flavours/glitch/public.js.LICENSE.txt @@ -1,22 +1,10 @@ -/** @license React v16.12.0 - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/ -/** @license React v16.12.0 - * react-dom.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -/** @license React v0.18.0 +/** @license React v0.19.0 * scheduler.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. @@ -34,8 +22,20 @@ * LICENSE file in the root directory of this source tree. */ -/* -object-assign -(c) Sindre Sorhus -@license MIT -*/ +/** @license React v16.13.0 + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** @license React v16.13.1 + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ diff --git a/priv/static/packs/flavours/glitch/public.js.map b/priv/static/packs/flavours/glitch/public.js.map index d55977ee9..b34718a35 100644 Binary files a/priv/static/packs/flavours/glitch/public.js.map and b/priv/static/packs/flavours/glitch/public.js.map differ diff --git a/priv/static/packs/flavours/glitch/settings.js b/priv/static/packs/flavours/glitch/settings.js index 1a4cc7926..2cf26d61e 100644 Binary files a/priv/static/packs/flavours/glitch/settings.js and b/priv/static/packs/flavours/glitch/settings.js differ diff --git a/priv/static/packs/flavours/glitch/settings.js.map b/priv/static/packs/flavours/glitch/settings.js.map index a787cb63f..41ba698a5 100644 Binary files a/priv/static/packs/flavours/glitch/settings.js.map and b/priv/static/packs/flavours/glitch/settings.js.map differ diff --git a/priv/static/packs/flavours/glitch/share.js b/priv/static/packs/flavours/glitch/share.js index 7af26420d..67e6ff793 100644 Binary files a/priv/static/packs/flavours/glitch/share.js and b/priv/static/packs/flavours/glitch/share.js differ diff --git a/priv/static/packs/flavours/vanilla/home.js.LICENSE b/priv/static/packs/flavours/glitch/share.js.LICENSE.txt similarity index 98% rename from priv/static/packs/flavours/vanilla/home.js.LICENSE rename to priv/static/packs/flavours/glitch/share.js.LICENSE.txt index 0a0301353..90a9a7678 100644 --- a/priv/static/packs/flavours/vanilla/home.js.LICENSE +++ b/priv/static/packs/flavours/glitch/share.js.LICENSE.txt @@ -1,3 +1,9 @@ +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/ + /*! Copyright (c) 2017 Jed Watson. Licensed under the MIT License (MIT), see @@ -12,31 +18,145 @@ * MIT Licensed */ -/* -object-assign -(c) Sindre Sorhus -@license MIT -*/ - -/** @license React v16.12.0 - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. +/*! + * wavesurfer.js 3.3.1 (2020-01-14) + * https://github.com/katspaugh/wavesurfer.js + * @license BSD-3-Clause */ -/** @license React v16.12.0 - * react-dom.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ +/*! ./ajax */ -/** @license React v0.18.0 +/*! ./drawer */ + +/*! ./drawer.canvasentry */ + +/*! ./drawer.multicanvas */ + +/*! ./extend */ + +/*! ./fetch */ + +/*! ./frame */ + +/*! ./get-id */ + +/*! ./max */ + +/*! ./mediaelement */ + +/*! ./mediaelement-webaudio */ + +/*! ./min */ + +/*! ./observer */ + +/*! ./peakcache */ + +/*! ./prevent-click */ + +/*! ./request-animation-frame */ + +/*! ./style */ + +/*! ./util */ + +/*! ./util/get-id */ + +/*! ./util/style */ + +/*! ./webaudio */ + +/*! debounce */ + +/*! https://mths.be/punycode v1.4.1 by @mathias */ + +/*! no static exports found */ + +/*!***********************!*\ + !*** ./src/drawer.js ***! + \***********************/ + +/*!*************************!*\ + !*** ./src/util/max.js ***! + \*************************/ + +/*!*************************!*\ + !*** ./src/util/min.js ***! + \*************************/ + +/*!*************************!*\ + !*** ./src/webaudio.js ***! + \*************************/ + +/*!**************************!*\ + !*** ./src/peakcache.js ***! + \**************************/ + +/*!**************************!*\ + !*** ./src/util/ajax.js ***! + \**************************/ + +/*!***************************!*\ + !*** ./src/util/fetch.js ***! + \***************************/ + +/*!***************************!*\ + !*** ./src/util/frame.js ***! + \***************************/ + +/*!***************************!*\ + !*** ./src/util/index.js ***! + \***************************/ + +/*!***************************!*\ + !*** ./src/util/style.js ***! + \***************************/ + +/*!***************************!*\ + !*** ./src/wavesurfer.js ***! + \***************************/ + +/*!****************************!*\ + !*** ./src/util/extend.js ***! + \****************************/ + +/*!****************************!*\ + !*** ./src/util/get-id.js ***! + \****************************/ + +/*!*****************************!*\ + !*** ./src/mediaelement.js ***! + \*****************************/ + +/*!******************************!*\ + !*** ./src/util/observer.js ***! + \******************************/ + +/*!***********************************!*\ + !*** ./src/drawer.canvasentry.js ***! + \***********************************/ + +/*!***********************************!*\ + !*** ./src/drawer.multicanvas.js ***! + \***********************************/ + +/*!***********************************!*\ + !*** ./src/util/prevent-click.js ***! + \***********************************/ + +/*!**************************************!*\ + !*** ./src/mediaelement-webaudio.js ***! + \**************************************/ + +/*!****************************************!*\ + !*** ./node_modules/debounce/index.js ***! + \****************************************/ + +/*!*********************************************!*\ + !*** ./src/util/request-animation-frame.js ***! + \*********************************************/ + +/** @license React v0.19.0 * scheduler.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. @@ -54,140 +174,20 @@ object-assign * LICENSE file in the root directory of this source tree. */ -/*! - * wavesurfer.js 3.3.1 (2020-01-14) - * https://github.com/katspaugh/wavesurfer.js - * @license BSD-3-Clause +/** @license React v16.13.0 + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. */ -/*!****************************************!*\ - !*** ./node_modules/debounce/index.js ***! - \****************************************/ - -/*! no static exports found */ - -/*!***********************************!*\ - !*** ./src/drawer.canvasentry.js ***! - \***********************************/ - -/*! ./util/style */ - -/*! ./util/get-id */ - -/*!***********************!*\ - !*** ./src/drawer.js ***! - \***********************/ - -/*! ./util */ - -/*!***********************************!*\ - !*** ./src/drawer.multicanvas.js ***! - \***********************************/ - -/*! ./drawer */ - -/*! ./drawer.canvasentry */ - -/*!**************************************!*\ - !*** ./src/mediaelement-webaudio.js ***! - \**************************************/ - -/*! ./mediaelement */ - -/*!*****************************!*\ - !*** ./src/mediaelement.js ***! - \*****************************/ - -/*! ./webaudio */ - -/*!**************************!*\ - !*** ./src/peakcache.js ***! - \**************************/ - -/*!**************************!*\ - !*** ./src/util/ajax.js ***! - \**************************/ - -/*! ./observer */ - -/*!****************************!*\ - !*** ./src/util/extend.js ***! - \****************************/ - -/*!***************************!*\ - !*** ./src/util/fetch.js ***! - \***************************/ - -/*!***************************!*\ - !*** ./src/util/frame.js ***! - \***************************/ - -/*! ./request-animation-frame */ - -/*!****************************!*\ - !*** ./src/util/get-id.js ***! - \****************************/ - -/*!***************************!*\ - !*** ./src/util/index.js ***! - \***************************/ - -/*! ./ajax */ - -/*! ./get-id */ - -/*! ./max */ - -/*! ./min */ - -/*! ./extend */ - -/*! ./style */ - -/*! ./frame */ - -/*! debounce */ - -/*! ./prevent-click */ - -/*! ./fetch */ - -/*!*************************!*\ - !*** ./src/util/max.js ***! - \*************************/ - -/*!*************************!*\ - !*** ./src/util/min.js ***! - \*************************/ - -/*!******************************!*\ - !*** ./src/util/observer.js ***! - \******************************/ - -/*!***********************************!*\ - !*** ./src/util/prevent-click.js ***! - \***********************************/ - -/*!*********************************************!*\ - !*** ./src/util/request-animation-frame.js ***! - \*********************************************/ - -/*!***************************!*\ - !*** ./src/util/style.js ***! - \***************************/ - -/*!***************************!*\ - !*** ./src/wavesurfer.js ***! - \***************************/ - -/*! ./drawer.multicanvas */ - -/*! ./peakcache */ - -/*! ./mediaelement-webaudio */ - -/*!*************************!*\ - !*** ./src/webaudio.js ***! - \*************************/ - -/*! https://mths.be/punycode v1.4.1 by @mathias */ +/** @license React v16.13.1 + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ diff --git a/priv/static/packs/flavours/glitch/share.js.map b/priv/static/packs/flavours/glitch/share.js.map index 7e35c663a..92384b100 100644 Binary files a/priv/static/packs/flavours/glitch/share.js.map and b/priv/static/packs/flavours/glitch/share.js.map differ diff --git a/priv/static/packs/flavours/vanilla/about.js b/priv/static/packs/flavours/vanilla/about.js index be2b2196b..715247a5e 100644 Binary files a/priv/static/packs/flavours/vanilla/about.js and b/priv/static/packs/flavours/vanilla/about.js differ diff --git a/priv/static/packs/flavours/glitch/share.js.LICENSE b/priv/static/packs/flavours/vanilla/about.js.LICENSE.txt similarity index 98% rename from priv/static/packs/flavours/glitch/share.js.LICENSE rename to priv/static/packs/flavours/vanilla/about.js.LICENSE.txt index 0a0301353..90a9a7678 100644 --- a/priv/static/packs/flavours/glitch/share.js.LICENSE +++ b/priv/static/packs/flavours/vanilla/about.js.LICENSE.txt @@ -1,3 +1,9 @@ +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/ + /*! Copyright (c) 2017 Jed Watson. Licensed under the MIT License (MIT), see @@ -12,31 +18,145 @@ * MIT Licensed */ -/* -object-assign -(c) Sindre Sorhus -@license MIT -*/ - -/** @license React v16.12.0 - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. +/*! + * wavesurfer.js 3.3.1 (2020-01-14) + * https://github.com/katspaugh/wavesurfer.js + * @license BSD-3-Clause */ -/** @license React v16.12.0 - * react-dom.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ +/*! ./ajax */ -/** @license React v0.18.0 +/*! ./drawer */ + +/*! ./drawer.canvasentry */ + +/*! ./drawer.multicanvas */ + +/*! ./extend */ + +/*! ./fetch */ + +/*! ./frame */ + +/*! ./get-id */ + +/*! ./max */ + +/*! ./mediaelement */ + +/*! ./mediaelement-webaudio */ + +/*! ./min */ + +/*! ./observer */ + +/*! ./peakcache */ + +/*! ./prevent-click */ + +/*! ./request-animation-frame */ + +/*! ./style */ + +/*! ./util */ + +/*! ./util/get-id */ + +/*! ./util/style */ + +/*! ./webaudio */ + +/*! debounce */ + +/*! https://mths.be/punycode v1.4.1 by @mathias */ + +/*! no static exports found */ + +/*!***********************!*\ + !*** ./src/drawer.js ***! + \***********************/ + +/*!*************************!*\ + !*** ./src/util/max.js ***! + \*************************/ + +/*!*************************!*\ + !*** ./src/util/min.js ***! + \*************************/ + +/*!*************************!*\ + !*** ./src/webaudio.js ***! + \*************************/ + +/*!**************************!*\ + !*** ./src/peakcache.js ***! + \**************************/ + +/*!**************************!*\ + !*** ./src/util/ajax.js ***! + \**************************/ + +/*!***************************!*\ + !*** ./src/util/fetch.js ***! + \***************************/ + +/*!***************************!*\ + !*** ./src/util/frame.js ***! + \***************************/ + +/*!***************************!*\ + !*** ./src/util/index.js ***! + \***************************/ + +/*!***************************!*\ + !*** ./src/util/style.js ***! + \***************************/ + +/*!***************************!*\ + !*** ./src/wavesurfer.js ***! + \***************************/ + +/*!****************************!*\ + !*** ./src/util/extend.js ***! + \****************************/ + +/*!****************************!*\ + !*** ./src/util/get-id.js ***! + \****************************/ + +/*!*****************************!*\ + !*** ./src/mediaelement.js ***! + \*****************************/ + +/*!******************************!*\ + !*** ./src/util/observer.js ***! + \******************************/ + +/*!***********************************!*\ + !*** ./src/drawer.canvasentry.js ***! + \***********************************/ + +/*!***********************************!*\ + !*** ./src/drawer.multicanvas.js ***! + \***********************************/ + +/*!***********************************!*\ + !*** ./src/util/prevent-click.js ***! + \***********************************/ + +/*!**************************************!*\ + !*** ./src/mediaelement-webaudio.js ***! + \**************************************/ + +/*!****************************************!*\ + !*** ./node_modules/debounce/index.js ***! + \****************************************/ + +/*!*********************************************!*\ + !*** ./src/util/request-animation-frame.js ***! + \*********************************************/ + +/** @license React v0.19.0 * scheduler.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. @@ -54,140 +174,20 @@ object-assign * LICENSE file in the root directory of this source tree. */ -/*! - * wavesurfer.js 3.3.1 (2020-01-14) - * https://github.com/katspaugh/wavesurfer.js - * @license BSD-3-Clause +/** @license React v16.13.0 + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. */ -/*!****************************************!*\ - !*** ./node_modules/debounce/index.js ***! - \****************************************/ - -/*! no static exports found */ - -/*!***********************************!*\ - !*** ./src/drawer.canvasentry.js ***! - \***********************************/ - -/*! ./util/style */ - -/*! ./util/get-id */ - -/*!***********************!*\ - !*** ./src/drawer.js ***! - \***********************/ - -/*! ./util */ - -/*!***********************************!*\ - !*** ./src/drawer.multicanvas.js ***! - \***********************************/ - -/*! ./drawer */ - -/*! ./drawer.canvasentry */ - -/*!**************************************!*\ - !*** ./src/mediaelement-webaudio.js ***! - \**************************************/ - -/*! ./mediaelement */ - -/*!*****************************!*\ - !*** ./src/mediaelement.js ***! - \*****************************/ - -/*! ./webaudio */ - -/*!**************************!*\ - !*** ./src/peakcache.js ***! - \**************************/ - -/*!**************************!*\ - !*** ./src/util/ajax.js ***! - \**************************/ - -/*! ./observer */ - -/*!****************************!*\ - !*** ./src/util/extend.js ***! - \****************************/ - -/*!***************************!*\ - !*** ./src/util/fetch.js ***! - \***************************/ - -/*!***************************!*\ - !*** ./src/util/frame.js ***! - \***************************/ - -/*! ./request-animation-frame */ - -/*!****************************!*\ - !*** ./src/util/get-id.js ***! - \****************************/ - -/*!***************************!*\ - !*** ./src/util/index.js ***! - \***************************/ - -/*! ./ajax */ - -/*! ./get-id */ - -/*! ./max */ - -/*! ./min */ - -/*! ./extend */ - -/*! ./style */ - -/*! ./frame */ - -/*! debounce */ - -/*! ./prevent-click */ - -/*! ./fetch */ - -/*!*************************!*\ - !*** ./src/util/max.js ***! - \*************************/ - -/*!*************************!*\ - !*** ./src/util/min.js ***! - \*************************/ - -/*!******************************!*\ - !*** ./src/util/observer.js ***! - \******************************/ - -/*!***********************************!*\ - !*** ./src/util/prevent-click.js ***! - \***********************************/ - -/*!*********************************************!*\ - !*** ./src/util/request-animation-frame.js ***! - \*********************************************/ - -/*!***************************!*\ - !*** ./src/util/style.js ***! - \***************************/ - -/*!***************************!*\ - !*** ./src/wavesurfer.js ***! - \***************************/ - -/*! ./drawer.multicanvas */ - -/*! ./peakcache */ - -/*! ./mediaelement-webaudio */ - -/*!*************************!*\ - !*** ./src/webaudio.js ***! - \*************************/ - -/*! https://mths.be/punycode v1.4.1 by @mathias */ +/** @license React v16.13.1 + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ diff --git a/priv/static/packs/flavours/vanilla/about.js.map b/priv/static/packs/flavours/vanilla/about.js.map index df789e98d..42e76990e 100644 Binary files a/priv/static/packs/flavours/vanilla/about.js.map and b/priv/static/packs/flavours/vanilla/about.js.map differ diff --git a/priv/static/packs/flavours/vanilla/admin.js b/priv/static/packs/flavours/vanilla/admin.js index 1187d5f1d..5fbc17639 100644 Binary files a/priv/static/packs/flavours/vanilla/admin.js and b/priv/static/packs/flavours/vanilla/admin.js differ diff --git a/priv/static/packs/flavours/vanilla/admin.js.LICENSE b/priv/static/packs/flavours/vanilla/admin.js.LICENSE.txt similarity index 91% rename from priv/static/packs/flavours/vanilla/admin.js.LICENSE rename to priv/static/packs/flavours/vanilla/admin.js.LICENSE.txt index 487bc60d8..2196b2def 100644 --- a/priv/static/packs/flavours/vanilla/admin.js.LICENSE +++ b/priv/static/packs/flavours/vanilla/admin.js.LICENSE.txt @@ -4,25 +4,7 @@ object-assign @license MIT */ -/** @license React v16.12.0 - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -/** @license React v16.12.0 - * react-dom.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -/** @license React v0.18.0 +/** @license React v0.19.0 * scheduler.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. @@ -39,3 +21,21 @@ object-assign * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ + +/** @license React v16.13.0 + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** @license React v16.13.1 + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ diff --git a/priv/static/packs/flavours/vanilla/admin.js.map b/priv/static/packs/flavours/vanilla/admin.js.map index 742c31b83..781e07de0 100644 Binary files a/priv/static/packs/flavours/vanilla/admin.js.map and b/priv/static/packs/flavours/vanilla/admin.js.map differ diff --git a/priv/static/packs/flavours/vanilla/common.css b/priv/static/packs/flavours/vanilla/common.css index ce2318757..5f844cca6 100644 Binary files a/priv/static/packs/flavours/vanilla/common.css and b/priv/static/packs/flavours/vanilla/common.css differ diff --git a/priv/static/packs/flavours/vanilla/common.css.map b/priv/static/packs/flavours/vanilla/common.css.map index 4a6d0a5e6..9f54b0023 100644 --- a/priv/static/packs/flavours/vanilla/common.css.map +++ b/priv/static/packs/flavours/vanilla/common.css.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///application.scss","webpack:///./app/javascript/styles/mastodon/reset.scss","webpack:///./app/javascript/styles/mastodon/variables.scss","webpack:///./app/javascript/styles/mastodon/basics.scss","webpack:///./app/javascript/styles/mastodon/containers.scss","webpack:///./app/javascript/styles/mastodon/lists.scss","webpack:///./app/javascript/styles/mastodon/footer.scss","webpack:///./app/javascript/styles/mastodon/compact_header.scss","webpack:///./app/javascript/styles/mastodon/widgets.scss","webpack:///./app/javascript/styles/mastodon/forms.scss","webpack:///./app/javascript/styles/mastodon/accounts.scss","webpack:///./app/javascript/styles/mastodon/statuses.scss","webpack:///./app/javascript/styles/mastodon/boost.scss","webpack:///./app/javascript/styles/mastodon/components.scss","webpack:///","webpack:///./app/javascript/styles/mastodon/_mixins.scss","webpack:///./app/javascript/styles/mastodon/polls.scss","webpack:///./app/javascript/styles/mastodon/modal.scss","webpack:///./app/javascript/styles/mastodon/emoji_picker.scss","webpack:///./app/javascript/styles/mastodon/about.scss","webpack:///./app/javascript/styles/mastodon/tables.scss","webpack:///./app/javascript/styles/mastodon/admin.scss","webpack:///./app/javascript/styles/mastodon/dashboard.scss","webpack:///./app/javascript/styles/mastodon/rtl.scss","webpack:///./app/javascript/styles/mastodon/accessibility.scss"],"names":[],"mappings":"AAAA,2ZCKA,QAaE,UACA,SACA,eACA,aACA,wBACA,+EAIF,aAEE,MAGF,aACE,OAGF,eACE,cAGF,WACE,qDAGF,UAEE,aACA,OAGF,wBACE,iBACA,MAGF,sCACE,qBAGF,UACE,YACA,2BAGF,kBACE,cACA,mBACA,iCAGF,kBACE,kCAGF,kBACE,2BAGF,aACE,gBACA,0BACA,CCtEW,iED6Eb,kBC7Ea,4BDiFb,sBACE,MErFF,iDACE,mBACA,eACA,iBACA,gBACA,WDXM,kCCaN,6BACA,8BACA,CADA,0BACA,CADA,yBACA,CADA,qBACA,0CACA,wCACA,kBAEA,iKAYE,eAGF,SACE,oCAEA,WACE,iBACA,kBACA,uCAGF,iBACE,WACA,YACA,mCAGF,iBACE,cAIJ,kBD7CW,kBCiDX,iBACE,kBACA,0BAEA,iBACE,aAIJ,iBACE,YAGF,kBACE,SACA,iBACA,uBAEA,iBACE,WACA,YACA,gBACA,YAIJ,kBACE,UACA,YAGF,iBACE,kBACA,cD3EoB,mBAPX,WCqFT,YACA,UACA,aACA,uBACA,mBACA,oBAEA,qBACE,YACA,sCAGE,aACE,gBACA,WACA,YACA,kBACA,uBAIJ,cACE,iBACA,gBACA,QAMR,mBACE,eACA,cAEA,YACE,kDAKF,YAGE,WACA,mBACA,uBACA,oBACA,sBAGF,YACE,yEAKF,gBAEE,+EAKF,WAEE,sCAIJ,qBAEE,eACA,gBACA,gBACA,cACA,kBACA,8CAEA,eACE,0CAGF,mBACE,gEAEA,eACE,0CAIJ,aDtKwB,kKCyKtB,oBAGE,sDAIJ,aDpKsB,eCsKpB,0DAEA,aDxKoB,oDC6KtB,cACE,SACA,uBACA,cDhLoB,aCkLpB,UACA,SACA,oBACA,eACA,UACA,4BACA,0BACA,gMAEA,oBAGE,kEAGF,aD9NY,gBCgOV,gBCnON,WACE,CACA,kBACA,qCAEA,eALF,UAMI,SACA,kBAIJ,sBACE,qCAEA,gBAHF,kBAII,qBAGF,YACE,uBACA,mBACA,wBAEA,SFrBI,YEuBF,kBACA,sBAGF,YACE,uBACA,mBACA,WF9BE,qBEgCF,UACA,kBACA,iBACA,6CACA,gBACA,eACA,mCAMJ,WACE,CACA,cACA,mBACA,sBACA,qCAEA,kCAPF,UAQI,aACA,aACA,kBAKN,WACE,CACA,YACA,eACA,iBACA,sBACA,CACA,gBACA,CACA,sBACA,qCAEA,gBAZF,UAaI,CACA,eACA,CACA,mBACA,0BAGF,UACE,YACA,iBACA,6BAEA,UACE,YACA,cACA,SACA,kBACA,uBAIJ,aACE,cF7EsB,wBE+EtB,iCAEA,aACE,gBACA,uBACA,gBACA,8BAIJ,aACE,eACA,iBACA,gBACA,SAIJ,YACE,cACA,8BACA,sBACA,mCACA,CADA,0BACA,mBAEA,eACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,eACE,WACA,qCAGF,QA3BF,UA4BI,qCACA,mBAEA,aACE,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,UAKN,YACE,cACA,8CACA,sBACA,mCACA,CADA,0BACA,mBAEA,eACE,WACA,mBAGF,eACE,WACA,mBAGF,aACE,WACA,mBAGF,eACE,WACA,mBAGF,aACE,WACA,uCAGF,eACE,wBAGF,kBACE,qCAGF,QAxCF,iDAyCI,uCAEA,YACE,aACA,mBACA,uBACA,iCAGF,UACE,uBACA,mBACA,sBAGF,YACE,sCAIJ,QA7DF,UA8DI,qCACA,mBAEA,aACE,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,sCAMJ,eADF,gBAEI,4BAGF,eACE,qCAEA,0BAHF,SAII,yBAIJ,kBACE,mCACA,kBACA,YACA,cACA,aACA,oBACA,uBACA,iBACA,gBACA,qCAEA,uBAZF,cAaI,WACA,MACA,OACA,SACA,gBACA,gBACA,YACA,6BAGF,cACE,eACA,kCAGF,YACE,oBACA,2BACA,iBACA,oCAGF,YACE,oBACA,uBACA,iBACA,mCAGF,YACE,oBACA,yBACA,iBACA,+BAGF,aACE,aACA,mCAEA,aACE,YACA,WACA,kBACA,YACA,UFxUA,qCE2UA,kCARF,WASI,+GAIJ,kBAGE,kCAIJ,YACE,mBACA,eACA,eACA,gBACA,qBACA,cF7UkB,mBE+UlB,kBACA,uHAEA,yBAGE,WFrWA,qCEyWF,0CACE,YACE,qCAKN,kBACE,CACA,oBACA,kBACA,6HAEA,oBAGE,mBACA,sBAON,YACE,cACA,0DACA,sBACA,mCACA,CADA,0BACA,gCAEA,UACE,cACA,gCAGF,UACE,cACA,qCAGF,qBAjBF,0BAkBI,WACA,gCAEA,YACE,kCAKN,iBACE,qCAEA,gCAHF,eAII,sCAKF,4BADF,eAEI,wCAIJ,eACE,mBACA,mCACA,gDAEA,UACE,qIAEA,8BAEE,CAFF,sBAEE,6DAGF,wBFtaoB,8CE2atB,yBACE,gBACA,aACA,kBACA,gBACA,oDAEA,UACE,cACA,kBACA,WACA,YACA,gDACA,MACA,OACA,kDAGF,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,0BACA,qCAGF,6CA3BF,YA4BI,gDAIJ,eACE,6JAEA,iBAEE,qCAEA,4JAJF,eAKI,sCAKN,sCA/DF,eAgEI,gBACA,oDAEA,YACE,+FAGF,eAEE,6CAIJ,iBACE,iBACA,aACA,2BACA,mDAEA,UACE,cACA,mBACA,kBACA,SACA,OACA,QACA,YACA,0BACA,WACA,oDAGF,aACE,YACA,aACA,kBACA,cACA,wDAEA,aACE,WACA,YACA,SACA,kBACA,yBACA,mBACA,qCAIJ,2CArCF,YAsCI,mBACA,0BACA,YACA,mDAEA,YACE,oDAGF,UACE,YACA,CACA,sBACA,wDAEA,QACE,kBACA,2DAGF,mDAXF,YAYI,sCAKN,2CAhEF,eAiEI,sCAGF,2CApEF,cAqEI,8CAIJ,aACE,iBACA,mDAEA,gBACE,mBACA,sDAEA,cACE,iBACA,WF1kBF,gBE4kBE,gBACA,mBACA,uBACA,6BACA,4DAEA,aACE,eACA,WFplBJ,gBEslBI,gBACA,uBACA,qCAKN,4CA7BF,gBA8BI,aACA,8BACA,mBACA,mDAEA,aACE,iBACA,sDAEA,cACE,iBACA,iBACA,4DAEA,aF5lBY,oDEmmBlB,YACE,2BACA,oBACA,YACA,qEAEA,YACE,mBACA,gBACA,qCAGF,oEACE,YACE,6DAIJ,eACE,sBACA,cACA,cFxnBc,aE0nBd,+BACA,eACA,kBACA,kBACA,8DAEA,aACE,uEAGF,cACE,kEAGF,aACE,WACA,kBACA,SACA,OACA,WACA,gCACA,WACA,wBACA,yEAIA,+BACE,UACA,kFAGF,2BFzpBc,wEE+pBd,SACE,wBACA,8DAIJ,oBACE,cACA,2EAGF,cACE,cACA,4EAGF,eACE,eACA,kBACA,WFnsBJ,6CEqsBI,2DAIJ,aACE,WACA,4DAGF,eACE,8CAKN,YACE,eACA,kEAEA,eACE,gBACA,uBACA,cACA,2FAEA,4BACE,yEAGF,YACE,qDAIJ,gBACE,eACA,cFztBgB,uDE4tBhB,oBACE,cF7tBc,qBE+tBd,aACA,gBACA,8DAEA,eACE,WFpvBJ,qCE0vBF,6CAtCF,aAuCI,UACA,4CAKN,yBACE,qCAEA,0CAHF,eAII,wCAIJ,eACE,oCAGF,kBACE,mCACA,kBACA,gBACA,mBACA,qCAEA,mCAPF,eAQI,gBACA,gBACA,8DAGF,QACE,aACA,+DAEA,aACE,sFAGF,uBACE,yEAGF,aFryBU,8DE2yBV,mBACA,WF7yBE,qFEizBJ,YAEE,eACA,cFpyBkB,2CEwyBpB,gBACE,iCAIJ,YACE,cACA,kDACA,qCAEA,gCALF,aAMI,+CAGF,cACE,iCAIJ,eACE,2BAGF,YACE,eACA,eACA,cACA,+BAEA,qBACE,cACA,YACA,cACA,mBACA,kBACA,qCAEA,8BARF,aASI,sCAGF,8BAZF,cAaI,sCAIJ,0BAvBF,QAwBI,6BACA,+BAEA,UACE,UACA,gBACA,gCACA,0CAEA,eACE,0CAGF,kBF32BK,+IE82BH,kBAGE,WC53BZ,eACE,aAEA,oBACE,aACA,iBAIJ,eACE,cACA,oBAEA,cACE,gBACA,mBACA,wBCfF,eACE,iBACA,oBACA,eACA,cACA,qCAEA,uBAPF,iBAQI,mBACA,+BAGF,YACE,cACA,0CACA,wCAEA,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,kBACA,6CAEA,aACE,wCAIJ,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,qCAGF,6BAxCF,iCAyCI,+EAEA,aAEE,wCAGF,UACE,wCAGF,aACE,+EAGF,aAEE,wCAGF,UACE,sCAIJ,uCACE,aACE,sCAIJ,4JACE,YAIE,4BAKN,eACE,kBACA,cJ/EkB,6BIkFlB,aACE,qBACA,6BAIJ,oBACE,cACA,wGAEA,yBAGE,mCAKF,aACE,YACA,WACA,cACA,aACA,0HAMA,YACE,oBCjIR,cACE,iBACA,cLeoB,gBKbpB,mBACA,eACA,qBACA,qCAEA,mBATF,iBAUI,oBACA,uBAGF,aACE,qBACA,0BAGF,eACE,cLFoB,wBKMtB,oBACE,mBACA,kBACA,WACA,YACA,cC9BN,kBACE,mCACA,mBAEA,UACE,kBACA,gBACA,0BACA,gBNPI,uBMUJ,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,0BACA,oBAIJ,kBNVW,aMYT,0BACA,eACA,cNPoB,iBMSpB,qBACA,gBACA,8BAEA,UACE,YACA,gBACA,sBAGF,kBACE,iCAEA,eACE,uBAIJ,cACE,SACA,UACA,gBACA,uBACA,oBACA,kBACA,oBACA,cACA,sBAGF,aNtCsB,qBMwCpB,4BAEA,yBACE,qCAKN,aAnEF,YAoEI,uBAIJ,kBACE,oBACA,yBAEA,YACE,gBACA,eACA,cN7DoB,+BMiEtB,cACE,0CAEA,eACE,sDAGF,YACE,mBACA,gDAGF,UACE,YACA,0BACA,oCAIJ,YACE,mBAKF,aN1FsB,aM+FxB,YACE,kBACA,mBNxGW,mCM0GX,qBAGF,YACE,kBACA,0BACA,kBACA,cN1GsB,mBM4GtB,iBAGF,eACE,eACA,cNjHsB,iBMmHtB,qBACA,gBACA,UACA,oBAEA,YACE,gBACA,eACA,cN3HoB,0BM+HtB,eACE,CACA,kBACA,mBAGF,oBACE,CACA,mBACA,cNxIoB,qBM0IpB,mBACA,gBACA,uBACA,0EAEA,yBAGE,uBAMJ,sBACA,kBACA,mBNjKW,mCMmKX,cN3JwB,gBM6JxB,mBACA,sDAEA,eAEE,CAII,qXADF,eACE,yBAKN,aACE,0BACA,CAMI,wLAGF,oBAGE,mIAEA,yBACE,gCAMR,kBACE,oCAEA,gBACE,cNvMkB,8DM6MpB,iBACE,eACA,4DAGF,eACE,qBACA,iEAEA,eACE,kBAMR,YACE,CACA,eNhPM,CMkPN,cACA,cNlOsB,mBMoOtB,+BANA,iBACA,CNhPM,kCM8PN,CATA,aAGF,kBACE,CAEA,iBACA,kBACA,cACA,iBAEA,UN/PM,eMiQJ,gBACA,gBACA,mBACA,gBAGF,cACE,cNxPoB,qCM4PtB,aArBF,YAsBI,mBACA,iBAEA,cACE,aAKN,kBN7Qa,kBM+QX,mCACA,iBAEA,qBACE,mBACA,uCAEA,YAEE,mBACA,8BACA,mBN1RO,kBM4RP,aACA,qBACA,cACA,mCACA,0EAIA,kBAGE,0BAIJ,kBNlSsB,eMoSpB,8BAGF,UACE,eACA,oBAGF,aACE,eACA,gBACA,WNjUE,mBMmUF,gBACA,uBACA,wBAEA,aNvTkB,0BM2TlB,aACE,gBACA,eACA,eACA,cN/TgB,0IMqUlB,UNrVE,+BM6VJ,aACE,YACA,uDAGF,oBNhVsB,wCMoVtB,eACE,eAKN,YACE,yBACA,gCAEA,aACE,WACA,YACA,kBACA,kBACA,kBACA,mBACA,yBACA,4CAEA,SACE,6CAGF,SACE,6CAGF,SACE,iBAKN,UACE,0BAEA,SACE,SACA,wBAGF,eACE,0BAGF,iBACE,cNrYoB,gBMuYpB,aACA,sCAEA,eACE,0BAIJ,cACE,sBACA,gCACA,wCAGF,eACE,wBAGF,WACE,kBACA,eACA,gBACA,WN7aI,8BMgbJ,aACE,cNjakB,gBMmalB,eACA,0BAIJ,SACE,iCACA,qCAGF,kCACE,YACE,sCAYJ,qIAPF,eAQI,gBACA,gBACA,iBAOJ,gBACE,qCAEA,eAHF,oBAII,uBAGF,sBACE,sCAEA,qBAHF,sBAII,sCAGF,qBAPF,UAQI,sCAGF,qBAXF,WAYI,kCAIJ,iBACE,qCAEA,gCAHF,4BAII,iEAIA,eACE,0DAGF,cACE,iBACA,oEAEA,UACE,YACA,gBACA,yFAGF,gBACE,SACA,mKAIJ,eAGE,gBAON,aNlgBsB,iCMigBxB,kBAKI,6BAEA,eACE,kBAIJ,cACE,iBACA,wCAMF,oBACE,gBACA,cNrhBsB,4JMwhBtB,yBAGE,oBAKN,kBACE,gBACA,eACA,kBACA,yBAEA,aACE,gBACA,aACA,CACA,kBACA,gBACA,uBACA,qBACA,WNhkBI,gCMkkBJ,4FAEA,yBAGE,oCAIJ,eACE,0BAGF,iBACE,gCACA,MCjlBJ,+CACE,gBACA,iBAGF,eACE,aACA,cACA,qBAIA,kBACE,gBACA,4BAEA,QACE,0CAIA,kBACE,qDAEA,eACE,gDAIJ,iBACE,kBACA,sDAEA,iBACE,SACA,OACA,6BAKN,iBACE,gBACA,gDAEA,mBACE,eACA,gBACA,WPhDA,cOkDA,WACA,4EAGF,iBAEE,mDAGF,eACE,4CAGF,iBACE,QACA,OACA,qCAGF,aPnDoB,0BOqDlB,gIAEA,oBAGE,0CAIJ,iBACE,CACA,iBACA,mBAKN,YACE,cACA,0BAEA,qBACE,cACA,UACA,cACA,oBAIJ,aPpFsB,sBOuFpB,aPrFsB,yBOyFtB,iBACE,kBACA,gBACA,uBAGF,eACE,iBACA,sBAIJ,kBACE,wBAGF,aACE,eACA,eACA,qBAGF,kBACE,cPlHoB,iCOqHpB,iBACE,eACA,iBACA,gBACA,gBACA,oBAIJ,kBACE,qBAGF,eACE,CAII,0JADF,eACE,sDAMJ,YACE,4DAEA,mBACE,eACA,WPlKA,gBOoKA,gBACA,cACA,wHAGF,aAEE,sDAIJ,cACE,kBACA,mDAKF,mBACE,eACA,WPxLE,cO0LF,kBACA,qBACA,gBACA,sCAGF,cACE,mCAGF,UACE,sCAIJ,cACE,4CAEA,mBACE,eACA,WP9ME,cOgNF,gBACA,gBACA,4CAGF,kBACE,yCAGF,cACE,CADF,cACE,6BAIJ,oBACE,cACA,4BAGF,kBACE,8CAEA,eACE,0BAIJ,YACE,CACA,eACA,oBACA,iCAEA,cACE,kCAGF,qBACE,eACA,cACA,eACA,oCAEA,aACE,2CAGF,eACE,6GAIJ,eAEE,qCAGF,yBA9BF,aA+BI,gBACA,kCAEA,cACE,0JAGF,kBAGE,iDAKN,iBACE,oBACA,eACA,WP5RI,cO8RJ,WACA,2CAKE,mBACE,eACA,WPtSA,qBOwSA,WACA,kBACA,gBACA,kBACA,cACA,0DAGF,iBACE,OACA,QACA,SACA,kDAKN,cACE,aACA,yBACA,kBACA,sJAGF,qBAKE,eACA,WPtUI,cOwUJ,WACA,UACA,oBACA,gBACA,mBACA,sBACA,kBACA,aACA,6RAEA,aACE,CAHF,+OAEA,aACE,CAHF,mQAEA,aACE,CAHF,wQAEA,aACE,CAHF,sNAEA,aACE,8LAGF,eACE,oVAGF,oBACE,iOAGF,oBP7VY,oLOiWZ,iBACE,4WAGF,oBPpVsB,mBOuVpB,6CAKF,aACE,gUAGF,oBAME,8CAGF,aACE,gBACA,cACA,eACA,8BAIJ,UACE,uBAGF,eACE,aACA,oCAEA,YACE,mBACA,qEAIJ,aAGE,WACA,SACA,kBACA,mBPrYsB,WAlBlB,eO0ZJ,oBACA,YACA,aACA,qBACA,kBACA,sBACA,eACA,gBACA,UACA,mBACA,kBACA,sGAEA,cACE,uFAGF,wBACE,gLAGF,wBAEE,kHAGF,wBPpaoB,gGOwapB,kBPtbQ,kHOybN,wBACE,sOAGF,wBAEE,qBAKN,uBACE,CADF,oBACE,CADF,eACE,sBACA,eACA,WPzcI,cO2cJ,WACA,UACA,oBACA,gBACA,wXACA,sBACA,kBACA,kBACA,mBACA,YACA,iBAGF,4BACE,oCAIA,iBACE,mCAGF,iBACE,UACA,QACA,CACA,qBACA,eACA,cPzckB,oBO2clB,oBACA,eACA,gBACA,mBACA,gBACA,yCAEA,UACE,cACA,kBACA,MACA,QACA,WACA,UACA,8DACA,4BAKN,iBACE,0CAEA,wBACE,CADF,gBACE,qCAGF,iBACE,MACA,OACA,WACA,YACA,aACA,uBACA,mBACA,8BACA,kBACA,iBACA,gBACA,YACA,8CAEA,iBACE,6HAGE,UPvhBF,aOiiBR,aACE,CACA,kBACA,eACA,gBAGF,kBACE,cPzhBsB,kBO2hBtB,kBACA,mBACA,kBACA,uBAEA,qCACE,iCACA,cPjjBY,sBOqjBd,mCACE,+BACA,cPtjBQ,kBO0jBV,oBACE,cP7iBoB,qBO+iBpB,wBAEA,UPjkBI,0BOmkBF,kBAIJ,kBACE,4BAGF,SACE,sBACA,cACA,WACA,SACA,aACA,gDACA,mBPzkBS,WATL,eOqlBJ,SACA,8CAEA,QACE,iHAGF,mBAGE,kCAGF,kBACE,uBAIJ,eACE,CAII,oKADF,eACE,0DAKN,eAzEF,eA0EI,eAIJ,eACE,kBACA,gBAEA,aP1mBsB,qBO4mBpB,sBAEA,yBACE,YAKN,eACE,mBACA,eACA,eAEA,oBACE,kBACA,cAGF,aP5nBwB,qBO8nBtB,gBACA,2DAEA,aAGE,8BAKN,kBAEE,cP7oBsB,oCOgpBtB,cACE,mBACA,kBACA,4CAGF,aPrpBwB,gBOupBtB,CAII,mUADF,eACE,0DAKN,6BAtBF,eAuBI,cAIJ,YACE,eACA,uBACA,UAGF,aACE,gBP7rBM,YO+rBN,qBACA,mCACA,qBACA,cAEA,aACE,SACA,iBAIJ,kBACE,cP1rBwB,WO4rBxB,sBAEA,aACE,eACA,eAKF,kBACE,sBAEA,eACE,CAII,+JADF,eACE,4CASR,qBACE,8BACA,WPzuBI,qCO2uBJ,oCACA,kBACA,aACA,mBACA,gDAEA,UPjvBI,0BOmvBF,oLAEA,oBAGE,0DAIJ,eACE,cACA,kBACA,CAII,yYADF,eACE,kEAIJ,eACE,oBAMR,YACE,eACA,mBACA,4DAEA,aAEE,6BAIA,wBACA,cACA,sBAIJ,iBACE,cPhxBsB,0BOmxBtB,iBACE,oBAIJ,eACE,mBACA,uBAEA,cACE,WP7yBI,kBO+yBJ,mBACA,SACA,UACA,4BAGF,aACE,eAIJ,aPvzBc,0SOi0BZ,+CACE,aAIJ,kBACE,sBACA,kBACA,aACA,mBACA,kBACA,kBACA,QACA,mCACA,sBAEA,aACE,8BAGF,sBACE,SACA,aACA,eACA,gDACA,oBAGF,aACE,WACA,oBACA,gBACA,eACA,CACA,oBACA,WACA,iCACA,oBAGF,oBP32Bc,gBO62BZ,2BAEA,kBP/2BY,gBOi3BV,oBAKN,kBACE,6BAEA,wBACE,mBACA,eACA,aACA,4BAGF,kBACE,aACA,OACA,sBACA,cACA,cACA,gCAEA,iBACE,YACA,iBACA,kBACA,UACA,8BAGF,qBACE,qCAIJ,kBACE,gCAGF,wBACE,mCACA,kBACA,kBACA,kBACA,kBACA,sCAEA,wBACE,WACA,cACA,YACA,SACA,kBACA,MACA,UACA,yBAIJ,sBACE,aACA,mBACA,SCl7BF,aACE,qBACA,cACA,mCACA,qCAEA,QANF,eAOI,8EAMA,kBACE,YAKN,YACE,kBACA,gBACA,0BACA,gBAEA,aACE,WACA,YACA,SACA,oBACA,CADA,8BACA,CADA,gBACA,0BACA,qCAGF,WAfF,YAgBI,sCAGF,WAnBF,YAoBI,aAIJ,iBACE,aACA,aACA,2BACA,mBACA,mBACA,0BACA,qCAEA,WATF,eAUI,qBAGF,aACE,WACA,YACA,gBACA,wBAEA,UACE,YACA,cACA,SACA,kBACA,mBACA,oBACA,CADA,8BACA,CADA,gBACA,0BAIJ,gBACE,gBACA,iCAEA,cACE,WR7EA,gBQ+EA,gBACA,uBACA,+BAGF,aACE,eACA,cRtEgB,gBQwEhB,gBACA,uBACA,aAMR,cACE,kBACA,gBACA,6GAEA,cAME,WR3GI,gBQ6GJ,qBACA,iBACA,qBACA,sBAGF,eRnHM,oBQqHJ,cR5GS,eQ8GT,cACA,kBAGF,cACE,uCAGF,aR9GwB,oBQmHxB,UACE,eACA,wBAEA,oBACE,iBACA,oBAIJ,WACE,gBACA,wBAEA,oBACE,gBACA,uBAIJ,cACE,cACA,qCAGF,YA7DF,iBA8DI,mBAEA,YACE,uCAGF,oBAEE,gBAKN,kBRlKa,mCQoKX,cR7JsB,eQ+JtB,gBACA,kBACA,aACA,uBACA,mBACA,eACA,kBACA,aACA,gBACA,2BAEA,yBACE,yBAGF,qBACE,gBACA,yCAIJ,oBAEE,gBACA,eACA,kBACA,eACA,iBACA,gBACA,cR3LwB,sCQ6LxB,sCACA,6DAEA,aRhNc,sCQkNZ,kCACA,qDAGF,aACE,sCACA,kCACA,0BAIJ,eACE,UACA,wBACA,gBACA,CADA,YACA,CACA,iCACA,CADA,uBACA,CADA,kBACA,eACA,iBACA,6BAEA,YACE,gCACA,yDAGF,qBAEE,aACA,kBACA,gBACA,gBACA,mBACA,uBACA,6BAGF,eACE,YACA,cACA,cR1OsB,0BQ4OtB,6BAGF,aACE,cRjPoB,4BQqPtB,aRnPwB,qBQqPtB,qGAEA,yBAGE,oCAIJ,qCACE,iCACA,sCAEA,aRnRY,gBQqRV,0CAGF,aRxRY,wCQ6Rd,eACE,wCAIJ,UACE,0BAIA,aRxRsB,4BQ2RpB,aR1RsB,qBQ4RpB,qGAEA,yBAGE,iCAIJ,URtTI,gBQwTF,wBAIJ,eACE,kBC/TJ,kCACE,kBACA,gBACA,mBACA,8BAEA,yBACE,qCAGF,iBAVF,eAWI,gBACA,gBACA,6BAGF,eACE,SACA,gBACA,gFAEA,yBAEE,sCAIJ,UACE,yBAGF,kBTpBW,6GSuBT,sBAGE,CAHF,cAGE,8IAIA,eAGE,0BACA,iJAKF,yBAGE,kLAIA,iBAGE,qCAKN,4GACE,yBAGE,uCAKN,kBACE,qBAIJ,WACE,eACA,mBT7DwB,WAlBlB,oBSkFN,iBACA,YACA,iBACA,SACA,yBAEA,UACE,YACA,sBACA,iBACA,UT5FI,gFSgGN,kBAGE,qNAKA,kBTxFoB,4ISgGpB,kBT9GQ,qCSqHV,wBACE,YACE,0DAOJ,YACE,uCAGF,2BACE,gBACA,uDAEA,SACE,SACA,yDAGF,eACE,yDAGF,gBACE,iBACA,mFAGF,UACE,qMAGF,eAGE,iCC/JN,u+KACE,uCAEA,u+KACE,0CAIJ,u+KACE,WCTF,gCACE,4CACA,cAGF,aACE,eACA,iBACA,cXYwB,SWVxB,uBACA,UACA,eACA,wCAEA,yBAEE,uBAGF,aXFsB,eWIpB,SAIJ,wBXN0B,YWQxB,kBACA,sBACA,WX5BM,eW8BN,qBACA,oBACA,eACA,gBACA,YACA,iBACA,iBACA,gBACA,eACA,kBACA,kBACA,qBACA,uBACA,2BACA,mBACA,WACA,4CAEA,wBAGE,4BACA,sBAGF,eACE,mFAEA,wBXxDQ,gBW4DN,mCAIJ,wBXlDsB,eWqDpB,2BAGF,QACE,wDAGF,mBAGE,yGAGF,cAIE,iBACA,YACA,oBACA,iBACA,4BAGF,aXpFW,mBAOW,qGWiFpB,wBAGE,8BAIJ,kBX1EsB,2GW6EpB,wBAGE,0BAIJ,aXlGsB,uBWoGpB,iBACA,yBACA,+FAEA,oBAGE,cACA,mCAGF,UACE,uBAIJ,aACE,WACA,kBAIJ,YACE,cACA,kBACA,cAGF,oBACE,UACA,cXpHsB,SWsHtB,kBACA,uBACA,eACA,2BACA,2CACA,2DAEA,aAGE,qCACA,4BACA,2CACA,oBAGF,mCACE,uBAGF,aACE,6BACA,eACA,qBAGF,aX5JwB,gCWgKxB,QACE,uEAGF,mBAGE,uBAGF,aX9JsB,sFWiKpB,aAGE,qCACA,6BAGF,mCACE,gCAGF,aACE,6BACA,8BAGF,aX7LsB,uCWgMpB,aACE,wBAKN,sBACE,0BACA,yBACA,kBACA,YACA,8BAEA,yBACE,mBAKN,aXvMwB,SWyMtB,kBACA,uBACA,eACA,gBACA,eACA,cACA,iBACA,UACA,2BACA,2CACA,0EAEA,aAGE,qCACA,4BACA,2CACA,yBAGF,mCACE,4BAGF,aACE,6BACA,eACA,0BAGF,aXpPwB,qCWwPxB,QACE,sFAGF,mBAGE,CAKF,0BADF,iBAUE,CATA,WAGF,WACE,cACA,qBACA,QACA,SAEA,+BAEA,kBAEE,mBACA,oBACA,kBACA,mBACA,iBAKF,WACE,eAIJ,YACE,iCAGE,mBACA,eAEA,gBACA,wCAEA,aXzSsB,sDW6StB,YACE,2CAGF,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,kDAEA,oBX9ToB,yDWqUxB,aX9UW,mBWgVT,mBXzUoB,oCW2UpB,iBACA,kBACA,eACA,gBACA,6CAEA,aXxVS,gBW0VP,CAII,kRADF,eACE,wCAKN,aX9UoB,gBWgVlB,0BACA,yIAEA,oBAGE,sCAKN,iBACE,QACA,UACA,kDAGF,iBACE,mGAGF,iBAGE,WACA,8BAGF,QACE,wBACA,UACA,qDAEA,WACE,mBACA,UACA,mFAIJ,aAEE,sBACA,WACA,SACA,cXlZS,gBATL,aW8ZJ,oBACA,eACA,gBACA,SACA,UACA,yIAEA,aXvYoB,CWqYpB,sHAEA,aXvYoB,CWqYpB,8HAEA,aXvYoB,CWqYpB,gIAEA,aXvYoB,CWqYpB,4GAEA,aXvYoB,+FW2YpB,SACE,qCAGF,kFAvBF,cAwBI,sCAIJ,iBACE,+CAGF,gBACE,0BACA,iBACA,mBACA,YACA,qBACA,kEAEA,SACE,qCAGF,8CAZF,sBAaI,gBACA,2DAIJ,iBACE,SACA,kDAGF,qBACE,aACA,kBACA,SACA,WACA,WACA,sCACA,mBXncsB,0BWqctB,cX7cS,eW+cT,YACA,6FAEA,aACE,wDAIJ,YACE,eACA,kBACA,yPAEA,kBAIE,wGAIJ,YAGE,mBACA,mBACA,2BACA,iBACA,eACA,oCAGF,6BACE,0CAEA,aACE,gBACA,uBACA,mBACA,2CAGF,eACE,0CAGF,aACE,iBACA,gBACA,uBACA,mBACA,8EAIJ,aAEE,iBACA,WACA,YACA,2DAGF,aXzfsB,wCW6ftB,aXlhBW,oBWohBT,eACA,gBX9hBI,sEWiiBJ,eACE,uEAGF,YACE,mBACA,YACA,eACA,8DAGF,UACE,cACA,WACA,uEAEA,iFACE,aACA,uBACA,8BACA,UACA,4BACA,oFAEA,aACE,cXziBgB,eW2iBhB,gBACA,aACA,oBACA,6QAEA,aAGE,8EAIJ,SACE,0EAIJ,iBACE,UACA,SACA,OACA,QACA,sBACA,gFACA,aACA,UACA,4BACA,mFAEA,sBACE,cXzkBgB,SW2kBhB,UACA,SACA,WACA,oBACA,eACA,gBACA,yFAEA,UXpmBF,8GWwmBE,WACE,cXxlBc,CAjBlB,oGWwmBE,WACE,cXxlBc,CAjBlB,wGWwmBE,WACE,cXxlBc,CAjBlB,yGWwmBE,WACE,cXxlBc,CAjBlB,+FWwmBE,WACE,cXxlBc,iFW6lBlB,SACE,wEAKN,iBACE,sBXtnBE,wBWwnBF,sBACA,4BACA,aACA,WACA,gBACA,8CAIJ,YACE,mBACA,0BACA,aACA,8BACA,cACA,qEAEA,YACE,uGAEA,gBACE,qGAGF,YACE,6IAEA,aACE,2IAGF,gBACE,0HAKN,sBAEE,cACA,0EAGF,iBACE,iBACA,sCAIJ,YACE,yBACA,YACA,cACA,4EAEA,eACE,iBACA,oBAKN,cACE,kDACA,eACA,gBACA,cX3pBsB,4CW8pBtB,aXzrBY,kCW8rBd,2CACE,WCpsBF,8DDysBE,sBACA,CADA,kBACA,wBACA,WACA,YACA,eAEA,UACE,kBAIJ,iBACE,mBACA,mBXpsBsB,aWssBtB,gBACA,gBACA,cACA,0BAGF,iBACE,gBACA,0BAGF,WACE,iBACA,gCAGF,aX7tBa,cW+tBX,eACA,iBACA,gBACA,mBACA,qBACA,kCAGF,UACE,iBACA,+BAGF,cACE,4CAGF,iBAEE,eACA,iBACA,qBACA,gBACA,gBACA,uBACA,gBACA,WXlwBM,wDWqwBN,SACE,wGAGF,kBACE,sJAEA,oBACE,gEAIJ,UACE,YACA,gBACA,oDAGF,cACE,iBACA,sBACA,CADA,gCACA,CADA,kBACA,gDAGF,kBACE,qBACA,sEAEA,eACE,gDAIJ,aX1xBc,qBW4xBZ,4DAEA,yBACE,oEAEA,aACE,4EAKF,oBACE,sFAEA,yBACE,wDAKN,aX9xBoB,8EWmyBtB,aACE,0GAGF,kBXvyBsB,sHW0yBpB,kBACE,qBACA,8IAGF,QACE,0XAGF,mBAGE,0FAIJ,YACE,wJAEA,aACE,6CAKN,gBACE,oCAGF,aACE,eACA,iBACA,cACA,SACA,uBACA,CACA,eACA,oFAEA,yBAEE,gCAIJ,oBACE,kBACA,uBACA,SACA,cXh3BW,gBWk3BX,eACA,cACA,iBACA,eACA,sBACA,4BAGF,aXr2BwB,SWu2BtB,kBACA,kBACA,oBACA,SACA,aACA,sBACA,WACA,WACA,gCACA,+BAGF,UACE,kBACA,kBAIA,SACE,mBACA,wCAEA,kBACE,8CAEA,sBACE,iFAIJ,kBAEE,SAMJ,yBACA,kBACA,gBACA,gCACA,eACA,UAaA,mCACA,CADA,0BACA,wDAZA,QARF,kBAWI,0BAGF,GACE,aACA,WALA,gBAGF,GACE,aACA,uDAMF,cAEE,kCAGF,kBACE,4BACA,sCAIA,aX37BoB,CAPX,uEW28BP,aX38BO,kCW+8BP,aXx8BkB,gCW68BpB,aXp9BS,kCWu9BP,aX98BoB,gEWk9BpB,UXp+BE,mBAgBgB,sEWw9BhB,kBACE,+CAQR,sBACE,qEAEA,aACE,qDAKN,aX59BwB,YW+9BtB,eACA,uBAGF,aXn+BwB,qCWu+BxB,aACE,eACA,mBACA,eAGF,cACE,mBAGF,+BACE,aACA,6CAEA,uBACE,OACA,4DAEA,eACE,8DAGF,SACE,mBACA,qHAGF,cAEE,gBACA,4EAGF,cACE,0BAKN,kBACE,aACA,cACA,uBACA,aACA,kBAGF,gBACE,cXvhCsB,CWyhCtB,iBACA,eACA,kBACA,+CAEA,aX9hCsB,uBWkiCtB,aACE,gBACA,uBACA,qBAIJ,kBACE,aACA,eACA,8BAEA,mBACE,kBACA,mBACA,yDAEA,gBACE,qCAGF,oBACE,WACA,eACA,gBACA,cX3jCkB,4BWikCxB,iBACE,8BAGF,cACE,cACA,uCAGF,aACE,aACA,mBACA,uBACA,kBACA,kBAGF,kBACE,kBACA,wBAEA,YACE,eACA,8BACA,uBACA,uFAEA,SAEE,mCAIJ,cACE,iBACA,6CAEA,UACE,YACA,gBACA,kEAGF,gBACE,gBACA,+DAIJ,cAEE,wBAIJ,eACE,cXznCsB,eW2nCtB,iBACA,8BAGF,kBACE,6BACA,gCACA,aACA,mBACA,eACA,wBAGF,aACE,qBACA,uDAGF,oBAEE,gBACA,eACA,gBACA,2BAGF,aX1qCa,eW4qCX,6BAEA,aXzpCsB,SW8pCxB,YACE,gCACA,8BAEA,aACE,cACA,WXlsCI,qBWosCJ,eACA,gBACA,kBAIJ,YACE,iBAGF,WACE,aACA,mBACA,UAGF,YACE,gCACA,kBAEA,SACE,gBACA,2CAEA,aACE,iCAIJ,aACE,cACA,cXntCoB,gBWqtCpB,qBACA,eACA,mBAIJ,YACE,0BAGF,UACE,iBACA,kBACA,kBAGF,iBEtvCE,iCACA,wBACA,4BACA,kBFqvCA,yBAEA,oBACE,sBACA,iBACA,4BAGF,iBEhwCA,iCACA,wBACA,4BACA,kBF+vCE,gBACA,kBACA,eACA,gCAEA,UACE,kBACA,sBACA,mCAGF,aACE,kBACA,QACA,SACA,+BACA,WXjxCE,6BWmxCF,gBACA,eACA,oBAKN,cACE,0BAGF,UACuB,sCEvxCrB,+BFyxCA,iBElyCA,iCACA,wBACA,4BACA,WFiyCuB,sCE3xCvB,kCF8xCA,iBEvyCA,iCACA,wBACA,4BACA,WFsyCuB,sCEhyCvB,kBFkyCE,SACA,QACA,UACA,wBAIJ,WACE,aACA,mBACA,sBAGF,YACE,6BACA,cX3xCsB,6BW8xCtB,eACE,CAII,kMADF,eACE,wBAKN,eACE,cACA,0BACA,yFAEA,oBAGE,sBAKN,4BACE,gCACA,iBACA,gBACA,cACA,aACA,+BAGF,YACE,4CAEA,qBACE,oFAIA,QACE,WACA,uDAGF,WACE,iBACA,gBACA,WACA,4BAKN,YACE,cACA,iBACA,kBACA,2BAGF,oBACE,gBACA,cACA,+BACA,eACA,oCACA,kCAEA,+BACE,gCAGF,aACE,eACA,cXv3CoB,kCW23CtB,aACE,eACA,gBACA,WX94CI,CWm5CA,2NADF,eACE,oBAMR,iBACE,mDAEA,aACE,mBACA,gBACA,4BAIJ,UACE,kBACA,6JAGF,oBAME,4DAKA,UXn7CM,kBWy7CN,UACE,iKAQF,yBACE,+BAIJ,aACE,gBACA,uBACA,0DAGF,aAEE,sCAGF,kBACE,gCAGF,aXr8C0B,cWu8CxB,iBACA,mBACA,gBACA,2EAEA,aAEE,uBACA,gBACA,uCAGF,cACE,WXr+CI,kCW0+CR,UACE,kBACA,iBAGF,WACE,UACA,kBACA,SACA,WACA,iBAGF,UACE,kBACA,OACA,MACA,YACA,eACA,CX/9CsB,gHWy+CtB,aXz+CsB,wBW6+CtB,UACE,wCAGF,kBXj/CsB,cArBX,8CW0gDT,kBACE,qBACA,wBAKN,oBACE,gBACA,eACA,cX7gDsB,eW+gDtB,iBACA,kBACA,4BAEA,aXjhDwB,6BWqhDxB,cACE,gBACA,uBACA,uCAIJ,UACE,kBACA,CX5iDU,mEWmjDZ,aXnjDY,uBWujDZ,aXxjDc,4DW8jDV,4CACE,CADF,oCACE,8DAKF,6CACE,CADF,qCACE,6BAKN,aACE,gBACA,qBACA,mCAEA,UXllDM,0BWolDJ,8BAIJ,WACE,eAGF,aACE,eACA,gBACA,uBACA,mBACA,qBAGF,eACE,wBAGF,cACE,+DAKA,yBACE,eAIJ,iBACE,WACA,YACA,aACA,mBACA,uBACA,sBACA,6CAEA,cXzkD4B,eAEC,0DW0kD3B,sBACA,CADA,gCACA,CADA,kBACA,4BAGF,iBACE,qEAGF,YACE,iBAIJ,iBACE,WACA,YACA,aACA,mBACA,uBACA,qBAEA,cXjmD4B,eAEC,WWkmD3B,YACA,sBACA,CADA,gCACA,CADA,kBACA,iBAIJ,YACE,aACA,mBACA,cACA,eACA,cXlpDsB,wBWqpDtB,aXppDwB,mBWwpDxB,aACE,4BAGF,oBACE,0CAGF,iBACE,6DAEA,iBACE,oBACA,qCACA,UACA,4EAGF,mBACE,gCACA,UACA,0BAKN,aACE,gBACA,iBACA,gBACA,gBACA,kCAGF,aACE,gBACA,gBACA,uBACA,+BAGF,aACE,qBACA,WAGF,oBACE,oBAGF,YACE,kBACA,2BAGF,+BACE,mBACA,SACA,gBAGF,kBXrtD0B,cWutDxB,kBACA,uCACA,aACA,mBAEA,eACE,qBAGF,yBACE,oBAGF,yBACE,uBAGF,sBACE,sBAGF,sBACE,uBAIJ,iBACE,QACA,SACA,2BACA,4BAEA,UACE,gBACA,2BACA,0BX1vDsB,2BW8vDxB,WACE,iBACA,uBACA,yBXjwDsB,8BWqwDxB,QACE,iBACA,uBACA,4BXxwDsB,6BW4wDxB,SACE,gBACA,2BACA,2BX/wDsB,wBWqxDxB,cACE,iBACA,cACA,iBACA,sBACA,qBACA,mBX3xDsB,cARb,gBWsyDT,uBACA,mBACA,yFAEA,kBXjyDsB,cADA,UWuyDpB,sCAKN,aACE,iBACA,gBACA,QACA,gBACA,aACA,yCAEA,eACE,mBXrzDsB,cWuzDtB,kBACA,mCACA,gBACA,kBACA,sDAGF,OACE,wDAIA,UACE,8CAIJ,cACE,iBACA,cACA,iBACA,sBACA,qBACA,mBX90DsB,cARb,gBWy1DT,uBACA,mBACA,oDAEA,SACE,oDAGF,kBXx1DsB,cADA,iBWg2D1B,qBACE,eAGF,YACE,cACA,mBACA,2BACA,gBACA,kBACA,4BAEA,iBACE,uBAGF,YACE,uBACA,WACA,YACA,iBACA,6BAEA,WACE,gBACA,oBACA,aACA,yBACA,gBACA,oCAEA,0BACE,oCAGF,cACE,YACA,oBACA,YACA,6BAIJ,qBACE,WACA,gBACA,cACA,aACA,sBACA,qCAEA,4BARF,cASI,qBAMR,kBACE,wBACA,CADA,eACA,MACA,UACA,cACA,qCAEA,mBAPF,gBAQI,+BAGF,eACE,qCAEA,6BAHF,kBAII,gKAMJ,WAIE,mCAIJ,YACE,mBACA,uBACA,YACA,SAGF,WACE,kBACA,sBACA,aACA,sBACA,qBAEA,kBX78DW,8BW+8DT,+BACA,KAIJ,aACE,CACA,qBACA,WACA,YACA,aAJA,YAYA,CARA,QAGF,WACE,sBACA,CACA,qBACA,kBACA,cAGF,aACE,cACA,sBACA,cXh+DsB,qBWk+DtB,kBACA,eACA,oCACA,iBAGF,aAEE,gBACA,qCAGF,cACE,SACE,iBAGF,aAEE,CAEA,gBACA,yCAEA,iBACE,uCAGF,kBACE,qDAKF,gBAEE,kBACA,YAKN,qBACE,aACA,mBACA,cACA,gBACA,iBAGF,aACE,cACA,CACA,sBACA,WXxiEM,qBW0iEN,kBACA,eACA,gBACA,gCACA,2BACA,mDACA,qBAEA,eACE,eACA,qCAMA,mEAHF,kBAII,4BACA,yBAIJ,+BACE,cX/iEsB,sBWmjExB,eACE,aACA,qCAIJ,qBAEI,cACE,wBAKN,qBACE,WACA,YACA,cACA,6DAEA,UAEE,YACA,UACA,wCAGF,YACE,cACA,kDACA,qCAEA,uCALF,aAMI,yCAIJ,eACE,oCAGF,YACE,uDAGF,cACE,sCAGF,gBACE,eACA,CACA,2BACA,yCAGF,QACE,mCAGF,gBACE,yBAEA,kCAHF,eAII,sCAIJ,sBACE,gBACA,sCAGF,uCACE,YACE,iKAEA,eAGE,6CAIJ,gBACE,2EAGF,YAEE,kGAGF,gBACE,+BAGF,2BACE,gBACA,uCAEA,SACE,SACA,wCAGF,eACE,wCAGF,gBACE,iBACA,qDAGF,UACE,gLAGF,eAIE,gCAIJ,iBACE,6CAEA,cACE,8CAKF,gBACE,iBACA,6DAGF,UACE,CAIA,yFAGF,eACE,8DAGF,gBACE,kBACA,0BAMR,cACE,aACA,uBACA,mBACA,gBACA,iBACA,iBACA,gBACA,mBACA,WX/uEM,kBWivEN,eACA,iBACA,qBACA,sCACA,4FAEA,kBAGE,qCAIJ,UACE,UACE,uDAGF,kCACE,4DAGF,kBAGE,yBAGF,aACE,iBAGF,eAEE,sCAIJ,2CACE,YACE,sCAOA,sEAGF,YACE,uCAIJ,0CACE,YACE,uCAIJ,UACE,YACE,mBAIJ,iBACE,yBAEA,iBACE,SACA,UACA,mBXxyEsB,yBW0yEtB,gBACA,kBACA,eACA,gBACA,iBACA,WXj0EI,mDWs0ER,oBACE,gBAGF,WACE,gBACA,aACA,sBACA,yBACA,kBACA,gCAEA,gBACE,oBACA,cACA,gBACA,6BAGF,sBACE,8BAGF,MACE,kBACA,aACA,sBACA,iBACA,oBACA,oBACA,mDAGF,eACE,sBXx2EI,0BW02EJ,cACA,gDAGF,iBACE,gDAGF,WACE,mBAIJ,eACE,mBACA,yBACA,gBACA,aACA,sBACA,qBAEA,aACE,sBAGF,aACE,SACA,CACA,4BACA,cACA,qDAHA,sBAOA,gBAMF,WACA,kBAGA,+BANF,qBACE,UACA,CAEA,eACA,aAiBA,CAhBA,eAGF,iBACE,MACA,OACA,mBACA,CAGA,qBACA,CACA,eACA,WACA,YACA,kBACA,uBAEA,kBX/5EW,0BWo6Eb,u1BACE,OACA,gBACA,aACA,8BAEA,aACE,sBACA,CADA,4DACA,CADA,kBACA,+BACA,CADA,2BACA,WACA,YACA,oBACA,eACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,sCAGF,yBAjBF,aAkBI,iBAIJ,kBACE,eACA,gBACA,iBAGF,aACE,eACA,mBACA,mBACA,aACA,mBACA,kBACA,mBAEA,iCACE,yBAEA,kBACE,mCACA,aAKN,iBACE,kBACA,cACA,iCACA,mCAEA,eACE,yBAGF,YAVF,cAWI,oBAGF,YACE,sBACA,qBAGF,aACE,kBACA,iBACA,yBAKF,uBADF,YAEI,sBAIJ,qBACE,WACA,mBACA,cX7+EwB,eW++ExB,cACA,eACA,oBACA,SACA,iBACA,aACA,SACA,UACA,UACA,2BAEA,yBACE,6BAIJ,kBACE,SACA,oBACA,cXlgFwB,eWogFxB,mBACA,eACA,kBACA,UACA,mCAEA,yBACE,wCAGF,kBACE,2BAIJ,oBACE,iBACA,2BAGF,iBACE,kCAGF,cACE,cACA,eACA,aACA,kBACA,QACA,UACA,eAGF,oBACE,kBACA,eACA,6BACA,SACA,UACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,0CACA,wCACA,iCAGF,QACE,mBACA,WACA,YACA,gBACA,UACA,kBACA,UACA,yBAGF,kBACE,WACA,wBACA,qBAGF,UACE,YACA,UACA,mBACA,yBXhlFW,qCWklFX,sEAGF,wBACE,4CAGF,wBXhlF0B,+EWolF1B,wBACE,2BAGF,iBACE,WACA,YACA,MACA,SACA,gBACA,mBACA,cACA,SACA,UACA,6BACA,CAKA,uEAFF,SACE,6BAeA,CAdA,sBAGF,iBACE,WACA,YACA,MACA,SACA,gBACA,mBACA,cACA,WAGA,8CAGF,SACE,qBAGF,iBACE,QACA,SACA,WACA,YACA,yBACA,kBACA,yBACA,sBACA,yBACA,sCACA,4CAGF,SACE,qBX5oFwB,cWgpF1B,kBACE,WXnqFM,cWqqFN,eACA,aACA,qBACA,2DAEA,kBAGE,oBAGF,SACE,2BAGF,sBACE,cXpqFsB,kGWuqFtB,sBAGE,WX3rFE,kCW+rFJ,aX7qFsB,oBWmrF1B,oBACE,iBACA,qBAGF,oBACE,kBACA,eACA,iBACA,gBACA,mBXtsFW,gBWwsFX,iBACA,oBAGF,kBX5sFa,cAqBW,iBW0rFtB,eACA,gBACA,eACA,yDAGF,kBXrtFa,cW2tFb,aACE,kBAGF,aX1sFwB,cW4sFtB,8BACA,+BACA,4EAEA,0BAGE,CAHF,uBAGE,CAHF,kBAGE,kDAMA,sBACA,YACA,wDAEA,kBACE,8DAGF,cACE,sDAGF,cACE,0DAEA,aXxuFkB,0BW0uFhB,sDAIJ,oBACE,cX7vFkB,sMWgwFlB,yBAGE,oDAKN,aX1vFsB,0BWgwFtB,aACE,UACA,mCACA,CADA,0BACA,gBACA,6BAEA,cACE,cXrxFkB,aWuxFlB,gBACA,gCACA,sCAGF,oDACE,YACE,uCAIJ,oDACE,YACE,uCAIJ,yBA1BF,YA2BI,yCAGF,eACE,aACA,iDAEA,aXhzFkB,qBWuzFxB,eACE,gBACA,2BAEA,iBACE,aACA,wBAGF,kBACE,yBAGF,oBACE,gBACA,yBACA,yBACA,eAIJ,aACE,sBACA,WACA,SACA,cXv1FW,gBATL,aWm2FN,oBACA,eACA,gBACA,SACA,UACA,kBACA,qBAEA,SACE,qCAGF,cAnBF,cAoBI,oDAIJ,uBACE,YACA,6CACA,uBACA,sBACA,WACA,0DAEA,sBACE,0DAKJ,uBACE,2BACA,gDAGF,aXz2FwB,6BW22FtB,uDAGF,aX13F0B,cW83F1B,YACE,eACA,yBACA,kBACA,cXt3FsB,gBWw3FtB,qBACA,gBACA,uBAEA,QACE,OACA,kBACA,QACA,MAIA,iDAHA,YACA,uBACA,mBAUE,CATF,0BAEA,yBACE,kBACA,iBACA,cAIA,sDAGF,cAEE,cX/5FoB,uBWi6FpB,SACA,cACA,qBACA,eACA,iBACA,sMAEA,UXz7FE,yBWg8FJ,cACE,kBACA,YACA,eAKN,cACE,qBAEA,kBACE,oBAIJ,cACE,cACA,qBACA,WACA,YACA,SACA,2BAIA,UACE,YACA,qBAIJ,aACE,gBACA,kBACA,cXn9FsB,gBWq9FtB,uBACA,mBACA,qBACA,uBAGF,aACE,gBACA,2BACA,2BAGF,aXj+FwB,oBWq+FxB,aACE,eACA,eACA,gBACA,uBACA,mBACA,qBAGF,cACE,mBACA,kBACA,yBAEA,cACE,kBACA,yBACA,QACA,SACA,+BACA,yBAIJ,aACE,6CAEA,UACE,mDAGF,yBACE,6CAGF,mBACE,sBAIJ,oBACE,kCAEA,QACE,4CAIA,oBACA,0CAGF,kBACE,0CAGF,aACE,6BAIJ,wBACE,2BAGF,yBACE,cACA,SACA,WACA,YACA,oBACA,CADA,8BACA,CADA,gBACA,sBACA,wBACA,YAGF,aACE,cXpiGsB,6BWsiGtB,SACA,kBACA,kBACA,oBACA,SACA,aACA,sBACA,WACA,WACA,qBACA,kBAEA,kBACE,WAIJ,+BACE,yBAGF,iBACE,eACA,gBACA,cX9jGsB,mBArBX,eWslGX,aACA,cACA,sBACA,mBACA,uBACA,aACA,qEAGE,aAEE,WACA,aACA,SACA,yCAIJ,gBACE,gCAGF,eACE,uCAEA,aACE,mBACA,cX5lGkB,qCWgmGpB,cACE,gBACA,yBAKN,iBACE,cACA,uCAGE,aACE,WACA,kBACA,SACA,OACA,QACA,cACA,UACA,oBACA,YACA,UACA,oFACA,gBAKN,YACE,eACA,mBACA,cACA,eACA,kBACA,UACA,UACA,gBACA,2BACA,4BACA,uBAEA,QACE,SACA,yBACA,cACA,uBACA,aACA,gBACA,uBACA,gBACA,mBACA,OACA,4CAGF,aXpqGwB,uBWwqGxB,uCACE,4CAEA,aX3qGsB,0CW6qGpB,4CAIJ,SAEE,yBAIJ,WACE,aACA,uBAGF,kBACE,iCAGF,iBACE,wBAGF,kBACE,SACA,cXxsGsB,eW0sGtB,eACA,eACA,8BAEA,aACE,CAKA,kEAEA,UXtuGI,mBWwuGF,6BAKN,eACE,gBACA,gBACA,cXhuGsB,0DWkuGtB,UACA,uCAEA,YACE,WACA,uCAGF,iBACE,gCAGF,QACE,uBACA,SACA,6BACA,cACA,mCAIJ,kBACE,aACA,mCAIA,aX7vGsB,0BW+vGpB,gCAIJ,WACE,4DAEA,cACE,uEAEA,eACE,WAKN,oBACE,UACA,oBACA,kBACA,cACA,SACA,uBACA,eACA,sBAGF,oBACE,iBACA,oBAGF,aXjxGwB,eWmxGtB,gBACA,iBACA,kBACA,QACA,SACA,+BACA,yBAEA,aACE,WACA,CACA,0BACA,oBACA,mBACA,4BAIJ,iBACE,QACA,SACA,+BACA,WACA,YACA,sBACA,6BACA,CACA,wBACA,kBACA,2CAGF,2EACE,CADF,mEACE,8CAGF,4EACE,CADF,oEACE,qCAGF,GACE,sBACE,KAGF,2BACE,KAGF,2BACE,KAGF,yBACE,IAGF,wBACE,EArBF,4BAGF,GACE,sBACE,KAGF,2BACE,KAGF,2BACE,KAGF,yBACE,IAGF,wBACE,uCAIJ,GACE,wBACE,KAGF,0BACE,KAGF,2BACE,KAGF,uBACE,IAGF,sBACE,EAtBA,6BAIJ,GACE,wBACE,KAGF,0BACE,KAGF,2BACE,KAGF,uBACE,IAGF,sBACE,mCAIJ,GACE,OACE,SACA,yBACA,KAGF,wBACE,KAGF,UACE,YACA,6BACA,kBACA,UACA,IAGF,UACE,YACA,eACA,UACA,6BACA,EA5BA,yBAIJ,GACE,OACE,SACA,yBACA,KAGF,wBACE,KAGF,UACE,YACA,6BACA,kBACA,UACA,IAGF,UACE,YACA,eACA,UACA,6BACA,kCAIJ,GACE,gBACA,aACA,aAPE,wBAIJ,GACE,gBACA,aACA,gCAGF,kBACE,gBXz6GM,WACA,eW26GN,aACA,sBACA,YACA,uBACA,eACA,kBACA,kBACA,YACA,gBAGF,eXv7GQ,cAiBgB,SWy6GtB,UACA,WACA,YACA,kBACA,wBACA,CADA,oBACA,CADA,eACA,iEAEA,SAGE,cACA,yBAIJ,aACE,eACA,yBAGF,aACE,eACA,gBACA,iBAGF,KACE,OACA,WACA,YACA,kBACA,YACA,2BAEA,aACE,SACA,QACA,WACA,YACA,6BAGF,mBACE,yBAGF,YACE,0BAGF,aACE,uBACA,WACA,YACA,SACA,iCAEA,oBACE,0BACA,kBACA,iBACA,WXt/GE,gBWw/GF,eACA,+LAMA,yBACE,mEAKF,yBACE,6BAMR,kBACE,iBAGF,kBACE,6BACA,gCACA,aACA,mBACA,eACA,kDAGF,aAEE,kBACA,yBAGF,kBACE,aACA,2BAGF,aXphHwB,eWshHtB,cACA,gBACA,mBACA,kDAIA,kBACE,oDAIA,SEtiHF,sBACA,WACA,SACA,gBACA,oBACA,mBbRW,cAOW,eaItB,SACA,+EFgiHI,aACE,CEjiHN,qEFgiHI,aACE,CEjiHN,yEFgiHI,aACE,CEjiHN,0EFgiHI,aACE,CEjiHN,gEFgiHI,aACE,sEAGF,QACE,yLAGF,mBAGE,0DAGF,kBACE,qCAGF,mDArBF,cAsBI,yDAIJ,aX9iHoB,iBWgjHlB,eACA,4DAGF,gBACE,wDAGF,kBACE,gEAEA,cACE,iNAEA,kBAGE,cACA,gHAKN,aXrlHoB,0HW0lHpB,cAEE,gBACA,cX/kHkB,kZWklHlB,aAGE,gEAIJ,wBACE,iDAGF,eX3nHI,kBa0BN,CAEA,eACA,cbbsB,uCaetB,UF8lHI,mBX5mHoB,oDagBxB,abjBsB,eamBpB,gBACA,mBACA,oDAGF,aACE,oDAGF,kBACE,oDAGF,eACE,cbxCS,sDWwnHT,WACE,mDAGF,aX5nHS,kBW8nHP,eACA,8HAEA,kBAEE,iCAON,kBACE,mBAIJ,UXxpHQ,kBW0pHN,cACA,mBACA,sBX7pHM,eW+pHN,gBACA,YACA,kBACA,WACA,yBAEA,SACE,iBAIJ,aACE,iBACA,wBAGF,aX9pHwB,qBWgqHtB,mBACA,gBACA,sBACA,uCAGF,aXxpHwB,mBArBX,kBWirHX,aACA,eACA,gBACA,eACA,aACA,cACA,mBACA,uBACA,yBAEA,sCAdF,cAeI,kDAGF,eACE,2CAGF,aX1rHwB,qBW4rHtB,uDAEA,yBACE,eAKN,qBACE,8BAGF,GACE,kBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,oBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,kBACE,2CACA,CADA,kCACA,EA1BF,qBAGF,GACE,kBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,oBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,kBACE,2CACA,CADA,kCACA,mCAIJ,8BACE,2DACA,CADA,kDACA,iCAGF,MACE,sBAEE,0BACA,KAGF,sBACE,aAGF,uBAGE,aAGF,sBAGE,KAGF,uBACE,KAGF,sBACE,EA/BF,wBAGF,MACE,sBAEE,0BACA,KAGF,sBACE,aAGF,uBAGE,aAGF,sBAGE,KAGF,uBACE,KAGF,sBACE,kCAIJ,yBACE,8EACA,CADA,qEACA,8BAGF,eX/xHQ,kBWiyHN,sCACA,kBACA,eACA,UACA,iDAEA,2BACE,2DAGF,UACE,mCAIJ,iBACE,SACA,WACA,eACA,yCAGF,iBACE,UACA,SACA,UACA,gBX3zHM,kBW6zHN,sCACA,gBACA,gDAEA,aACE,eACA,SACA,gBACA,uBACA,iKAEA,+BAGE,2DAIJ,WACE,wBAKF,2BACE,cAIJ,kBACE,0BACA,aACA,YACA,uBACA,OACA,UACA,kBACA,MACA,kBACA,WACA,aACA,gBAEA,mBACE,oBAIJ,WACE,aACA,aACA,sBACA,kBACA,YACA,0BAGF,iBACE,MACA,QACA,SACA,OACA,WACA,kBACA,mBXp3HW,kCWs3HX,uBAGF,MACE,aACA,mBACA,uBACA,cXr3HwB,eWu3HxB,gBACA,0BACA,kBACA,kBAGF,YACE,cXj3HsB,gBWm3HtB,aACA,sBAEA,cACE,kBACA,uBAGF,cACE,gBACA,cACA,0BAIJ,aACE,4BAGF,UACE,WACA,kBACA,mBXz4HsB,kBW24HtB,eACA,2BAGF,iBACE,OACA,MACA,WACA,mBX/5HwB,kBWi6HxB,eAGF,aACE,eACA,iBACA,gBACA,WACA,UACA,eACA,0CAEA,mBAEE,mBAGF,8BACE,CADF,sBACE,WACA,cACA,CACA,UACA,YACA,eACA,CAQE,6GAKN,SACE,oBACA,CADA,WACA,6BAGF,iBACE,gBX99HM,uCWg+HN,kBACA,iBACA,gBACA,iCAEA,yBACE,oCAGF,sBACE,2BAIJ,aXr+Ha,aWu+HX,eACA,aACA,kEAEA,kBXl+HwB,WAlBlB,UWw/HJ,CXx/HI,4RW6/HF,UX7/HE,wCWmgIN,kBACE,iCAIJ,YACE,mBACA,uBACA,kBACA,oCAGF,aACE,cXl/HsB,2CWq/HtB,eACE,cACA,cX5gIS,CWihIL,wQADF,eACE,mDAON,eXjiIM,0BWmiIJ,qCACA,gEAEA,eACE,0DAGF,kBXxhIsB,uEW2hIpB,UX7iIE,uDWmjIN,yBACE,sDAGF,aACE,sCACA,SAIJ,iBACE,gBAGF,SErjIE,sBACA,WACA,SACA,gBACA,oBACA,mBbRW,cAOW,eaItB,SACA,cF+iIA,CACA,2BACA,iBACA,eACA,2CAEA,aACE,CAHF,iCAEA,aACE,CAHF,qCAEA,aACE,CAHF,sCAEA,aACE,CAHF,4BAEA,aACE,kCAGF,QACE,6EAGF,mBAGE,sBAGF,kBACE,qCAGF,eA3BF,cA4BI,kCAKF,QACE,qDAGF,mBAEE,mBAGF,iBACE,SACA,WACA,UACA,qBACA,UACA,0BACA,sCACA,eACA,WACA,YACA,cXrmIsB,eWumItB,oBACA,0BAEA,mBACE,WACA,0BAIJ,uBACE,iCAEA,mBACE,uBACA,gCAIJ,QACE,uBACA,cX9mIoB,eWgnIpB,uCAEA,uBACE,sCAGF,aACE,yBAKN,aX5nIwB,mBW8nItB,aACA,gBACA,eACA,eACA,6BAEA,oBACE,iBACA,0BAIJ,iBACE,6BAEA,kBACE,gCACA,eACA,aACA,aACA,gBACA,eACA,cXppIoB,iCWupIpB,oBACE,iBACA,8FAIJ,eAEE,0BAIJ,aACE,aACA,cXlrIwB,qBWorIxB,+FAEA,aAGE,0BACA,uBAIJ,YACE,cXhsIsB,kBWksItB,aAGF,iBACE,8BACA,oBACA,aACA,sBAGF,cACE,MACA,OACA,QACA,SACA,0BACA,wBAGF,cACE,MACA,OACA,WACA,YACA,aACA,sBACA,mBACA,uBACA,2BACA,aACA,oBACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,oBAGF,mBACE,aACA,aACA,yBAGF,eACE,iBACA,yBAGF,UACE,cAGF,UACE,YACA,kBACA,qCAEA,UACE,YACA,aACA,mBACA,uBACA,2CAEA,cX7tI0B,eAEC,CWuuI7B,8CALF,iBACE,MACA,OACA,QACA,SAYA,CAXA,yBAQA,mBACA,8BACA,oBACA,4BAEA,mBACE,0DAGF,SACE,4DAEA,mBACE,mBAKN,yBACE,sBACA,SACA,WXzzIM,eW2zIN,aACA,mBACA,eACA,cACA,cACA,kBACA,kBACA,MACA,SACA,yBAGF,MACE,0BAGF,OACE,CASA,4CANF,UACE,kBACA,kBACA,OACA,YACA,oBAUA,6BAEA,WACE,sBAGF,mBACE,qBACA,gBACA,cXt1IsB,mFWy1ItB,yBAGE,wBAKN,oBACE,sBAGF,qBXt3IQ,YWw3IN,WACA,kBACA,YACA,UACA,SACA,YACA,8BAGF,wBX/2I0B,qBWm3I1B,iBACE,UACA,QACA,YACA,6CAGF,kBX33I0B,cARb,kBWw4IX,gBACA,aACA,sBACA,oBAGF,WACE,WACA,gBACA,iBACA,kBACA,wBAEA,iBACE,MACA,OACA,WACA,YACA,sBACA,aACA,aACA,CAGA,YACA,UACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,2CANA,qBACA,mBACA,uBAaF,CATE,mBAIJ,YACE,CAGA,iBACA,mDAGF,aAEE,mBACA,aACA,aACA,2DAEA,cACE,uLAGF,aXr6IsB,SWw6IpB,eACA,gBACA,kBACA,oBACA,YACA,aACA,kBACA,6BACA,+mBAEA,aAGE,yBACA,qiBAGF,aX98IS,qwDWk9IP,aAGE,sBAMR,sBACE,eAGF,iBACE,eACA,mBACA,sBAEA,eACE,cXr+IS,kBWu+IT,eACA,qBAGF,kBX3+IW,cAQa,gBWs+ItB,aACA,kBACA,kBAIJ,oBACE,eACA,gBACA,iBACA,wFAGF,kBAME,cXjgJW,kBWmgJX,gBACA,eACA,YACA,kBACA,sBACA,4NAEA,aACE,eACA,mBACA,wLAGF,WACE,UACA,kBACA,SACA,WACA,kRAGF,aACE,wBAKF,eXviJM,CAiBkB,gBWyhJtB,oBACA,iEX3iJI,2BAiBkB,yBWkiJ1B,iBACE,aACA,iCAEA,wBACE,CADF,qBACE,CADF,oBACE,CADF,gBACE,gBACA,2GAIJ,YAIE,8BACA,mBXjjJwB,aWmjJxB,iBACA,2HAEA,aACE,iBACA,cX3iJoB,mBW6iJpB,2IAGF,aACE,6BAIJ,cACE,2BAGF,WACE,eACA,0BAGF,gBAEE,sDAGF,qBAEE,eAGF,UACE,gBACA,0BAGF,YACE,6BACA,qCAEA,yBAJF,cAKI,gBACA,iDAIJ,qBAEE,UACA,qCAEA,+CALF,UAMI,sDAIJ,aAEE,gBACA,gBACA,gBACA,kBACA,2FAEA,aXrnJwB,iLWynJxB,aXloJW,qCWuoJX,oDAjBF,eAkBI,sCAKF,4BADF,eAEI,yBAIJ,YACE,+BACA,gBACA,0BAEA,cACE,iBACA,mBACA,sCAGF,aACE,sBACA,WACA,CACA,aXjqJS,gBATL,aW6qJJ,oBACA,eACA,YACA,CACA,SACA,kBACA,yBACA,iBACA,gBACA,gBACA,4CAEA,wBACE,+CAGF,eX7rJI,yBW+rJF,mBACA,kBACA,6DAEA,QACE,gBACA,gBACA,mEAEA,QACE,0DAIJ,aXpsJO,oBWssJL,eACA,gBXhtJA,+CWqtJJ,YACE,8BACA,mBACA,4CAIJ,aACE,cXptJS,eWstJT,gBACA,mBACA,wCAGF,eACE,mBACA,+CAEA,aX/tJS,eWiuJP,qCAIJ,uBAnFF,YAoFI,eACA,QACA,wCAEA,iBACE,iBAKN,eACE,eACA,wBAEA,eACE,iBACA,2CAGF,eACE,mBAGF,eACE,cACA,gBACA,+BAEA,4BACE,4BAGF,QACE,oCAIA,aX3wJO,aW6wJL,kBACA,eACA,mBACA,qBACA,8EAEA,eAEE,yWAOA,kBXnxJgB,WAlBlB,uDW4yJA,iBACE,oMAUR,aACE,iIAIJ,4BAIE,cXlyJsB,eWoyJtB,gBACA,6cAEA,aAGE,6BACA,qGAIJ,YAIE,eACA,iIAEA,eACE,CAII,w1BADF,eACE,sDAMR,iBAEE,oDAKA,eACE,0DAGF,eACE,mBACA,aACA,mBACA,wEAEA,aXv2JS,CWy2JP,gBACA,uBAKN,YACE,2CAEA,QACE,WACA,cAIJ,wBX/2J0B,WWi3JxB,kBACA,MACA,OACA,aACA,6BAGF,aACE,kBACA,WX54JM,0BW84JN,WACA,SACA,gBACA,kBACA,eACA,gBACA,UACA,oBACA,WACA,4BACA,iBACA,2DAKE,YACE,wDAKF,SACE,uBAKN,eACE,6BAEA,UACE,kBAIJ,YACE,eACA,yBACA,kBACA,gBACA,gBACA,wBAEA,aACE,cX75JoB,iBW+5JpB,eACA,+BACA,aACA,sBACA,mBACA,uBACA,eACA,4BAEA,aACE,wBAIJ,eACE,CACA,qBACA,aACA,sBACA,uBACA,2BAEA,aACE,cACA,0BAGF,oBACE,cX37JkB,gBW67JlB,gCAEA,yBACE,0BAKN,QACE,eACA,iDAEA,SACE,cACA,8BAGF,aX98JoB,gBWs9JtB,cACA,CACA,iBACA,CACA,UACA,qCANF,qBACE,CACA,eACA,CACA,iBAYA,CAVA,qBAGF,QACE,CACA,aACA,WACA,CACA,iBAEA,qEAGE,cACE,MACA,gCAKN,cACE,cACA,qBACA,cX//JwB,kBWigKxB,UACA,mEAEA,WAEE,WACA,CAIA,2DADF,mBACE,CADF,8BACE,CADF,gBX5hKM,CW6hKJ,wBAIJ,UACE,YACA,CACA,iBACA,MACA,OACA,UACA,gBXxiKM,iCW2iKN,YACE,sBAIJ,WACE,gBACA,kBACA,WACA,qCAGF,cACE,YACA,oBACA,CADA,8BACA,CADA,gBACA,kBACA,QACA,2BACA,WACA,UACA,sCAGF,0BACE,2BACA,gBACA,kBACA,qKAMA,WAEE,mFAGF,WACE,eAKJ,qBACE,kBACA,mBACA,kBACA,oBACA,cACA,wBAEA,eACE,YACA,yBAGF,cACE,kBACA,gBACA,gCAEA,UACE,cACA,kBACA,6BACA,WACA,SACA,OACA,oBACA,qCAIJ,qCACE,iCAGF,wBACE,uCAIA,mBACA,mBACA,6BACA,0BACA,eAIJ,eACE,kBACA,gBXxoKM,eW0oKN,kBACA,sBACA,cACA,wBAEA,eACE,sBACA,qBAGF,SACE,qBAGF,eACE,gBACA,UACA,0BAGF,oBACE,sBACA,SACA,gCAEA,wBACE,0BACA,qBACA,sBACA,UACA,4BAKF,qBACE,CADF,gCACE,CADF,kBACE,kBACA,QACA,2BACA,yBAIJ,iBACE,UACA,SACA,OACA,QACA,sBACA,iFACA,eACA,UACA,4BACA,gCAEA,SACE,6EAKF,iBAEE,wBAIJ,YACE,kBACA,MACA,OACA,WACA,YACA,UACA,SACA,gBXrtKI,cAiBgB,gBWusKpB,oBACA,+BAEA,aACE,oBACA,8GAEA,aAGE,+BAIJ,aACE,eACA,kCAGF,aACE,eACA,gBACA,4BAIJ,YACE,8BACA,oBACA,0DAEA,aACE,wBAIJ,cACE,mBACA,gBACA,uBACA,oCAGE,cACE,qCAKF,eACE,+BAIJ,sBACE,iBACA,eACA,SACA,0BACA,8GAEA,UXpxKE,+EW4xKN,cAGE,gBACA,6BAGF,UXnyKM,iBWqyKJ,yBAGF,oBACE,aACA,mDAGF,UX7yKM,uBWkzKN,cACE,YACA,eACA,8BAEA,UACE,WACA,+BAOA,6DANA,iBACA,cACA,kBACA,WACA,UACA,YAWA,CAVA,+BASA,kBACA,+BAGF,iBACE,UACA,kBACA,WACA,YACA,YACA,UACA,4BACA,mBACA,sCACA,oBACA,qBAIJ,gBACE,uBAEA,oBACE,eACA,gBACA,WXl2KE,sFWq2KF,yBAGE,qBAKN,cACE,YACA,kBACA,4BAEA,UACE,WACA,+BACA,kBACA,cACA,kBACA,WACA,SACA,2DAGF,aAEE,kBACA,WACA,kBACA,SACA,mBACA,6BAGF,6BACE,6BAGF,iBACE,UACA,UACA,kBACA,WACA,YACA,QACA,iBACA,4BACA,mBACA,sCACA,oBACA,CAGE,yFAKF,SACE,6GAQF,gBACE,oBACA,kBAON,UACE,cACA,+BACA,0BAEA,UACE,qCAGF,iBATF,QAUI,mBAIJ,qBACE,mBACA,uBAEA,YACE,kBACA,gBACA,gBACA,2BAEA,aACE,WACA,YACA,SACA,oBACA,CADA,8BACA,CADA,gBACA,uBAIJ,YACE,mBACA,mBACA,aACA,6BAEA,aACE,aACA,mBACA,qBACA,gBACA,qCAGF,UACE,eACA,cACA,+BAGF,aACE,WACA,YACA,gBACA,mCAEA,UACE,YACA,cACA,SACA,kBACA,mBACA,oBACA,CADA,8BACA,CADA,gBACA,qCAIJ,gBACE,gBACA,4CAEA,cACE,WX5/KF,gBW8/KE,gBACA,uBACA,0CAGF,aACE,eACA,cXr/Kc,gBWu/Kd,gBACA,uBACA,yBAKN,kBXrgLS,aWugLP,mBACA,uBACA,gDAEA,YACE,cACA,eACA,mDAGF,qBACE,kBACA,gCACA,WACA,gBACA,mBACA,gBACA,uBACA,qDAEA,YACE,iEAEA,cACE,sDAIJ,YACE,6BAOV,YACE,eACA,gBACA,wBAGF,QACE,sBACA,cACA,kBACA,kBACA,gBACA,WACA,+BAEA,iBACE,QACA,SACA,+BACA,eACA,sDAIJ,kBAEE,gCACA,eACA,aACA,cACA,oEAEA,kBACE,SACA,SACA,6HAGF,aAEE,cACA,cX7kLoB,eW+kLpB,eACA,gBACA,kBACA,qBACA,kBACA,yJAEA,aXrlLsB,qWWwlLpB,aAEE,WACA,kBACA,SACA,SACA,QACA,SACA,2BACA,CAEA,4CACA,CADA,kBACA,CADA,wBACA,iLAGF,WACE,6CACA,8GAKN,kBACE,gCACA,qSAKI,YACE,iSAGF,4CACE,cAOV,kBXzoLa,sBW4oLX,iBACE,4BAGF,aACE,eAIJ,cACE,kBACA,qBACA,cACA,iBACA,eACA,mBACA,gBACA,uBACA,eACA,oEAEA,YAEE,sBAGF,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,8BAEA,oBACE,mBACA,2BAKN,eACE,gBAGF,eXvsLQ,kBa0BN,CACA,sBACA,gBACA,cbbsB,uCaetB,mBAEA,abjBsB,eamBpB,gBACA,mBACA,mBAGF,aACE,mBAGF,kBACE,mBAGF,eACE,cbxCS,UWksLb,iBACE,cAEA,WACE,WACA,sCACA,CADA,6BACA,cAGF,cACE,iBACA,cXrsLsB,gBWusLtB,gBAEA,aXxsLsB,0BW0sLpB,sBAEA,oBACE,4BAMR,GACE,cACA,eACA,WATM,mBAMR,GACE,cACA,eACA,qEAGF,kBAIE,sBAEE,8BACA,iBAGF,0BACE,kCACA,+BAIA,qDACE,uEACA,+CAGF,sBACE,8BACA,6DAIA,6BACE,6CACA,4EAIF,6BACE,6CACA,+CAOJ,gBAEE,+BAGF,gBACE,6CAEA,0BACE,wDAGF,eACE,6DAGF,iBACE,iBACA,2EAIA,mBACE,UACA,gCACA,WACA,0FAGF,mBACE,UACA,oCACA,eAOV,UACE,eACA,gBACA,iBAEA,YACE,gBACA,eACA,kBACA,sCAGF,YACE,4CAEA,kBACE,yDAGF,SACE,sBACA,cACA,WACA,SACA,aACA,gDACA,mBX70LO,WATL,eWy1LF,CACA,eACA,kBACA,2EAEA,QACE,wMAGF,mBAGE,+DAGF,kBACE,qCAGF,wDA7BF,cA8BI,4DAIJ,WACE,eACA,gBACA,SACA,kBACA,sBAMJ,sBACA,mBACA,6BACA,gCACA,+BAEA,iBACE,iBACA,cXt2LoB,CWy2LpB,eACA,eACA,oCAEA,aACE,gBACA,uBACA,oCAIJ,UACE,kBACA,uDAGF,iBACE,qDAGF,eACE,qBAKF,wBACA,aACA,2BACA,mBACA,mBACA,2BAEA,aACE,iCAEA,UACE,uCAEA,SACE,kCAKN,aACE,cACA,mBAIJ,cACE,kBACA,MACA,OACA,WACA,YACA,0BACA,cAGF,kBX37La,sBW67LX,kBACA,uCACA,YACA,gBACA,qCAEA,aARF,SASI,kBAGF,cACE,mBACA,gBACA,eACA,kBACA,0BACA,6BAGF,WACE,6BAGF,yBACE,sCAEA,uBACE,uCACA,wBACA,wBAIJ,eACE,kDAIA,oBACE,+BAIJ,cACE,sBAGF,eACE,aAIJ,kBXj/La,sBWm/LX,kBACA,uCACA,YACA,gBACA,qCAEA,YARF,SASI,uBAGF,kBACE,oBAGF,kBACE,YACA,0BACA,gBACA,mBAGF,YACE,gCACA,4BAGF,YACE,iCAGF,aACE,gBACA,qBACA,eACA,aACA,cAIJ,iBACE,YACA,gBACA,YACA,aACA,uBACA,mBACA,gBX3iMM,yDW8iMN,aAGE,gBACA,WACA,YACA,SACA,sBACA,CADA,gCACA,CADA,kBACA,gBXtjMI,uBW0jMN,iBACE,YACA,aACA,+BACA,iEACA,kBACA,wCACA,uBAGF,iBACE,WACA,YACA,MACA,OACA,uBAGF,iBACE,YACA,WACA,UACA,YACA,4BACA,6BAEA,UACE,8BAGF,UXvlMI,eWylMF,gBACA,cACA,kBACA,2BAGF,iBACE,mCACA,qCAIJ,oCACE,eAEE,uBAGF,YACE,4BAKN,aXjmMwB,eWmmMtB,gBACA,gBACA,kBACA,qBACA,6BAEA,kBACE,wCAEA,eACE,6BAIJ,aACE,0BACA,mCAEA,oBACE,kBAKN,eACE,2BAEA,UACE,8FAEA,8BAEE,CAFF,sBAEE,wBAIJ,iBACE,SACA,UACA,yBAGF,eACE,aACA,kBACA,mBACA,6BAEA,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,uBAIJ,iBACE,mBACA,YACA,gCACA,+BAEA,aACE,cACA,WACA,iBACA,gDAEA,kBACE,yBACA,wBAKN,YACE,uBACA,gBACA,iBACA,iCAEA,YACE,mBACA,iBACA,gBACA,8CAEA,wBACE,kBACA,uBACA,YACA,yCAGF,YACE,8BAIJ,WACE,4CAEA,kBACE,wCAGF,UACE,YACA,iCAGF,cACE,iBACA,WXruMA,gBWuuMA,gBACA,mBACA,uBACA,uCAEA,aACE,eACA,cX9tMc,gBWguMd,gBACA,uBACA,gCAKN,aACE,uBAIJ,eACE,cACA,iDAGE,qBACA,WXlwME,gDWswMJ,QACE,6BACA,kDAEA,aACE,yEAGF,uBACE,4DAGF,aXjxMU,yBWuxMd,cACE,gCAEA,cACE,cX5wMkB,eW8wMlB,kCAEA,oBACE,cXjxMgB,qBWmxMhB,iBACA,gBACA,yCAEA,eACE,WXxyMF,iBWizMN,aXnxMsB,mBWqxMpB,gCACA,gBACA,aACA,eACA,eACA,qBAEA,oBACE,iBACA,eAIJ,YACE,mBACA,aACA,gCACA,0BAEA,eACE,qBAGF,aACE,cX7yMkB,gBW+yMlB,uBACA,mBACA,4BAEA,eACE,uBAGF,aXr0MkB,qBWu0MhB,eACA,gBACA,cACA,gBACA,uBACA,mBACA,qGAKE,yBACE,wBAMR,aACE,eACA,iBACA,gBACA,iBACA,mBACA,gBACA,cX/1MoB,0BWm2MtB,aACE,WACA,2CAEA,oCACE,yBACA,0CAGF,wBACE,eAMR,YACE,gCACA,CACA,iBACA,qBAEA,kBACE,UACA,uBAGF,aACE,CACA,sBACA,kBACA,uBAGF,oBACE,mBXr4MsB,kBWu4MtB,cACA,eACA,wBACA,wBAGF,aACE,CACA,0BACA,gBACA,8BAEA,eACE,aACA,2BACA,8BACA,uCAGF,cACE,cX75MkB,kBW+5MlB,+BAGF,aXl6MoB,eWo6MlB,mBACA,gBACA,uBACA,kBACA,gBACA,YACA,iCAEA,UX57ME,qBW87MA,oHAEA,yBAGE,0BAKN,qBACE,uBAIJ,kBACE,6BAEA,kBACE,oDAGF,eACE,6DAGF,UXx9MI,OcFR,eACE,eACA,UAEA,kBACE,kBACA,cAGF,iBACE,MACA,OACA,YACA,qBACA,kBACA,mBACA,sBAEA,kBdEsB,acGxB,iBACE,aACA,cACA,iBACA,eACA,gBACA,gEAEA,YAEE,gCAGF,aACE,8BAGF,aACE,sBACA,WACA,eACA,cdjCO,UcmCP,oBACA,gBd7CE,yBc+CF,kBACA,iBACA,oCAEA,oBdjCoB,wBcsCtB,cACE,sBAGF,YACE,mBACA,iBACA,cAIJ,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,gBACA,mBACA,cACA,uBAEA,iBACE,qBAGF,oBdtFY,8Ec2FZ,gBAGE,gBACA,gCAGF,mBACE,SACA,wCAGF,mBAEE,eAIJ,oBACE,WACA,gBACA,CACA,oBACA,iBACA,gBACA,mBACA,cACA,mBAGF,UACE,iBACA,eAGF,eACE,mBACA,cdnGoB,acuGtB,cACE,uBACA,UACA,SACA,SACA,cd5GoB,0Bc8GpB,kBACA,mBAEA,oBACE,sCAGF,mCAEE,eAIJ,WACE,eACA,kBACA,eACA,6BAIJ,4BACE,gCAEA,YACE,2CAGF,4BACE,aACA,aACA,mBACA,mGAEA,YAEE,+GAEA,oBdhKoB,sDcsKxB,cACE,gBACA,iBACA,YACA,oBACA,cd/JoB,sCckKpB,gCAGF,YACE,mBACA,4CAEA,aACE,wBACA,iBACA,oCAIJ,uBACE,CADF,oBACE,CADF,eACE,sBACA,eACA,cdxMS,qBc0MT,WACA,UACA,oBACA,qXACA,yBACA,kBACA,CACA,yBACA,mDAGF,aACE,cAIJ,adrMwB,qBcwMtB,+BACE,6BAEA,+BACE,eC5ON,k1BACE,aACA,sBACA,aACA,UACA,yBAGF,YACE,OACA,sBACA,yBACA,2BAEA,MACE,iBACA,qCAIJ,gBACE,YACE,cCtBJ,cACE,qBACA,chBSW,2BgBNX,qBAEE,iBACA,+BAGF,WACE,iBAIJ,sBACE,6BAEA,uBACE,2BACA,4BACA,mBhBHsB,4BgBOxB,oBACE,8BACA,+BACA,aACA,qBAIJ,YACE,8BACA,cACA,chBLsB,cgBOtB,oBAGF,iBACE,OACA,kBACA,iBACA,gBACA,8BACA,eACA,0BAEA,aACE,6BAIJ,ahBpC0B,mCgBuCxB,aACE,oDAGF,WACE,wBAIJ,iBACE,YACA,OACA,WACA,WACA,yBhBrDwB,uBgB0DxB,oBACE,WACA,eACA,yBAGF,iBACE,gBACA,oBAIJ,iBACE,aACA,gBACA,kBACA,gBhB5FM,sBgB8FN,sGAEA,+BAEE,oBAKF,2BACA,gBhBxGM,0BgB2GN,cACE,gBACA,gBACA,oBACA,cACA,WACA,gCACA,chBzGS,yBgB2GT,kBACA,4CAEA,QACE,2GAGF,mBAGE,wCAKN,cACE,6CAEA,SACE,kBACA,kBACA,qDAGF,SACE,WACA,kBACA,MACA,OACA,WACA,YACA,sCACA,mBACA,4BAIJ,SACE,kBACA,wBACA,gBACA,MACA,iCAEA,aACE,WACA,gBACA,gBACA,gBhBpKI,mBgByKR,iBACE,qBACA,YACA,wBAEA,UACE,YACA,wBAIJ,cACE,kBACA,iBACA,chBvKsB,mDgB0KtB,YACE,qDAGF,eACE,uDAGF,YACE,qBAIJ,YACE,YCrMF,qBACE,iBANc,cAQd,kBACA,sCAEA,WANF,UAOI,eACA,mBAIJ,iDACE,eACA,gBACA,gBACA,qBACA,cjBJsB,oBiBOtB,ajBLwB,0BiBOtB,6EAEA,oBAGE,wCAIJ,ajBlBsB,oBiBuBtB,YACE,oBACA,+BAEA,eACE,yBAIJ,eACE,cjBhCsB,qBiBoCxB,iBACE,cjBrCsB,uBiByCxB,eACE,mBACA,kBACA,kBACA,yHAGF,4CAME,mBACA,oBACA,gBACA,cjBzDsB,qBiB6DxB,aACE,qBAGF,gBACE,qBAGF,eACE,qBAGF,gBACE,yCAGF,aAEE,qBAGF,eACE,qBAGF,kBACE,yCAMA,iBACA,iBACA,yDAEA,2BACE,yDAGF,2BACE,qBAIJ,UACE,SACA,SACA,gCACA,eACA,4BAEA,UACE,SACA,wBAIJ,UACE,yBACA,8BACA,CADA,iBACA,gBACA,mBACA,iEAEA,+BAEE,cACA,kBACA,gBACA,gBACA,cjBrIkB,iCiByIpB,uBACE,gBACA,gBACA,cjB9HkB,qDiBkIpB,WAEE,iBACA,kBACA,qBACA,mEAEA,SACE,kBACA,iFAEA,gBACE,kBACA,6EAGF,iBACE,SACA,UACA,mBACA,gBACA,uBACA,+BAMR,YACE,oBAIJ,kBACE,eACA,mCAEA,iBACE,oBACA,8BAGF,YACE,8BACA,eACA,6BAGF,UACE,kDACA,eACA,iBACA,WjBpNI,iBiBsNJ,kBACA,qEAEA,aAEE,6CAIA,ajB9MoB,oCiBmNtB,4CACE,gBACA,eACA,iBACA,qCAGF,4BA3BF,iBA4BI,4BAIJ,iBACE,YACA,sBACA,mBACA,CACA,sBACA,0BACA,QACA,aACA,yCAEA,4CACE,eACA,iBACA,gBACA,cjB/OkB,mBiBiPlB,mBACA,gCACA,uBACA,mBACA,gBACA,wFAEA,eAEE,cACA,2CAGF,oBACE,2BAKN,iBACE,mCAEA,UACE,YACA,CACA,kBACA,uCAEA,aACE,WACA,YACA,mBACA,iCAIJ,cACE,mCAEA,aACE,WjBzSA,qBiB2SA,uDAGE,yBACE,2CAKN,aACE,cjBrSgB,kCiB6StB,iDAEE,CACA,eACA,eACA,iBACA,mBACA,cjBpToB,sCiBuTpB,ajBrTsB,0BiBuTpB,kBAIJ,cACE,SACA,UACA,gBACA,uBACA,oBACA,kBACA,oBACA,cACA,kBAGF,4CACE,eACA,iBACA,gBACA,mBACA,cjB7UsB,wBiBgVtB,iDACE,cACA,eACA,gBACA,cACA,kBAIJ,4CACE,eACA,iBACA,gBACA,mBACA,cjB9VsB,kBiBmWtB,cjBnWsB,mCiBkWxB,4CACE,CACA,gBACA,gBACA,mBACA,cjBvWsB,kBiB4WtB,cjB5WsB,kBiBqXtB,cjBrXsB,mCiBoXxB,4CACE,CACA,gBACA,gBACA,mBACA,cjBzXsB,kBiB8XtB,cjB9XsB,mCiBsYxB,gBAEE,mDAEA,2BACE,mDAGF,2BACE,kBAIJ,eACE,kBAGF,kBACE,yCAGF,cAEE,kBAGF,UACE,SACA,SACA,2CACA,cACA,yBAEA,UACE,SACA,iDAIJ,YAEE,+BAGF,kBjB1bW,kBiB4bT,kBACA,gBACA,sBACA,oCAEA,UACE,aACA,2BACA,iBACA,8BACA,mBACA,uDAGF,YACE,yBACA,qBACA,mFAEA,aACE,eACA,qCAGF,sDAVF,UAWI,8BACA,6CAIJ,MACE,sBACA,qCAEA,2CAJF,YAKI,sBAKN,iBACE,yBAEA,WACE,WACA,uBACA,4BAIJ,iBACE,mBACA,uCAEA,eACE,mCAGF,eACE,cACA,qCAGF,eACE,UACA,mDAEA,kBACE,aACA,iBACA,0FAKE,oBACE,gFAIJ,cACE,qDAIJ,aACE,cACA,6CAGF,UACE,YACA,0BACA,mDAGF,cACE,4DAEA,cACE,qCAKN,oCACE,eACE,sCAIJ,2BA7DF,iBA8DI,mFAIJ,qBAGE,mBjBnjBS,kBiBqjBT,kCACA,uBAGF,YACE,kBACA,WACA,YACA,2BAEA,YACE,WACA,uCAKF,YACE,eACA,mBACA,mBACA,qCAGF,sCACE,kBACE,uCAIJ,ajB3kBsB,qCiB+kBtB,eACE,WjBjmBE,gBiBmmBF,2CAEA,ajBrlBkB,gDiBwlBhB,ajBvlBkB,+CiB6lBtB,eACE,qBAIJ,kBACE,yBAEA,aACE,SACA,eACA,YACA,kBACA,qCAIJ,gDAEI,kBACE,yCAGF,eACE,gBACA,WACA,kBACA,uDAEA,iBACE,sCAMR,8BACE,aACE,uCAEA,gBACE,sDAGF,kBACE,6EAIJ,aAEE,qBAIJ,WACE,UAIJ,mBACE,qCAEA,SAHF,eAII,kBAGF,YACE,uBACA,mBACA,aACA,qBAEA,SjBvrBI,YiByrBF,qCAGF,gBAXF,SAYI,mBACA,sBAIJ,eACE,uBACA,gBACA,gBACA,uBAGF,eACE,gBACA,0BAEA,YACE,gBACA,eACA,cjBhsBkB,6BiBosBpB,eACE,iBACA,+BAGF,kBjBhtBS,aiBktBP,0BACA,aACA,uCAEA,YACE,gCAIJ,cACE,gBACA,uDAEA,YACE,mBACA,iDAGF,UACE,YACA,0BACA,gCAIJ,YACE,uCAEA,4CACE,eACA,gBACA,cACA,qCAGF,cACE,cjB/uBgB,uFiBqvBtB,eACE,cASA,CjB/vBoB,2CiB4vBpB,iBACA,CACA,kBACA,gBAGF,eACE,cACA,aACA,kDACA,cACA,qCAEA,eAPF,oCAQI,cACA,8BAEA,UACE,aACA,sBACA,0CAEA,OACE,cACA,2CAGF,YACE,mBACA,QACA,cACA,qCAIJ,UACE,2BAGF,eACE,sCAIJ,eAtCF,UAuCI,6BAEA,aACE,gBACA,gBACA,2GAEA,eAGE,uFAIJ,+BAGE,2BAGF,YACE,gCAEA,eACE,qEAEA,eAEE,gBACA,2CAGF,eACE,SAQZ,iBACE,qBACA,iBAGF,aACE,kBACA,aACA,UACA,YACA,cjB51BsB,qBiB81BtB,eACA,qCAEA,gBAVF,eAWI,WACA,gBACA,cjBt1BoB,SkBhCxB,UACE,eACA,iBACA,yBACA,qBAEA,WAEE,iBACA,mBACA,6BACA,gBACA,mBACA,oBAGF,qBACE,gCACA,aACA,gBACA,oBAGF,eACE,qEAGF,kBlBhBW,UkBqBX,alBZwB,0BkBctB,gBAEA,oBACE,eAIJ,eACE,CAII,4HADF,eACE,+FAOF,sBAEE,yFAKF,YAEE,gCAMJ,kBlBzDS,6BkB2DP,gCACA,4CAEA,qBACE,8BACA,2CAGF,uBACE,+BACA,0BAKN,qBACE,gBAIJ,aACE,mBACA,MAGF,+CACE,0BAGF,sBACE,SACA,aACA,8CAGF,oBAEE,qBACA,iBACA,eACA,clB5FsB,gBkB8FtB,0DAEA,UlBhHM,wDkBoHN,eACE,iBACA,sEAGF,cACE,yCAKF,YAEE,yDAEA,qBACE,iBACA,eACA,gBACA,qEAEA,cACE,2EAGF,YACE,mBACA,uFAEA,YACE,qHAOJ,sBACA,cACA,uBAIJ,wBACE,mBlBvJS,sBkByJT,YACA,mBACA,gCAEA,gBACE,mBACA,oBAIJ,YACE,yBACA,aACA,mBlBtKS,gCkByKT,aACE,gBACA,mBAIJ,wBACE,aACA,mBACA,qCAEA,wCACE,4BACE,0BAIJ,kBACE,iCAGF,kBlB9LS,uCkBiMP,kBACE,4BAIJ,gBACE,oBACA,sCAEA,SACE,wCAGF,YACE,mBACA,mCAGF,aACE,aACA,uBACA,mBACA,kBACA,6CAEA,UACE,YACA,kCAIJ,aACE,mCAGF,aACE,iBACA,clB/NgB,gBkBiOhB,mCAIJ,QACE,WACA,qCAEA,sBACE,gBACA,qCAOJ,4FAFF,YAGI,gCAIJ,aACE,uCAEA,iBACE,sCAGF,eACE,4BAIJ,wBACE,aACA,gBACA,qCAEA,2BALF,4BAMI,sCAIJ,+CACE,YACE,iBC7RN,YACE,uBACA,WACA,iBACA,iCAEA,gBACE,gBACA,oBACA,cACA,wCAEA,YACE,yBACA,mBnBPO,YmBSP,yBAIJ,WAvBc,UAyBZ,oBACA,iCAEA,YACE,mBACA,YACA,uCAEA,aACE,yCAEA,oBACE,aACA,2CAGF,SnBxCA,YmB0CE,kBACA,YACA,uCAIJ,aACE,cnBjCgB,qBmBmChB,cACA,eACA,aACA,0HAIA,kBAGE,+BAKN,aACE,iBACA,YACA,aACA,qCAGF,sCACE,YACE,6BAIJ,eACE,0BACA,gBACA,mBACA,qCAEA,2BANF,eAOI,+BAGF,aACE,aACA,cnB3EgB,qBmB6EhB,0BACA,2CACA,0BACA,mBACA,gBACA,uBACA,mCAEA,gBACE,oCAGF,UnBzGA,yBmB2GE,0BACA,2CACA,uCAGF,kBACE,sBACA,+BAIJ,kBACE,wBACA,SACA,iCAEA,QACE,kBACA,6DAIJ,UnBjIE,yBAkBkB,gBmBkHlB,gBACA,mEAEA,wBACE,6DAKN,yBACE,iCAIJ,qBACE,WACA,gBApJY,cAsJZ,sCAGF,uCACE,YACE,iCAGF,WA/JY,cAiKV,sCAIJ,gCACE,UACE,0BAMF,2BACA,qCAEA,wBALF,cAMI,CACA,sBACA,kCAGF,YACE,oBAEA,gCACA,0BAEA,eAEA,mBACA,8BACA,mCAEA,eACE,kBACA,yCAGF,mBACE,4DAEA,eACE,qCAIJ,gCAzBF,eA0BI,iBACA,6BAIJ,anBnMsB,emBqMpB,iBACA,gBACA,qCAEA,2BANF,eAOI,6BAIJ,anB9MsB,emBgNpB,iBACA,gBACA,mBACA,4BAGF,cACE,gBACA,cnBzNkB,mBmB2NlB,kBACA,gCACA,4BAGF,cACE,cnBhOoB,iBmBkOpB,gBACA,0CAGF,UnBvPI,gBmByPF,uFAGF,eAEE,gEAGF,aACE,4CAGF,cACE,gBACA,WnBvQE,oBmByQF,iBACA,gBACA,gBACA,2BAGF,cACE,iBACA,cnBhQoB,mBmBkQpB,kCAEA,UnBrRE,gBmBuRA,CAII,2NADF,eACE,4BAMR,UACE,SACA,SACA,2CACA,cACA,mCAEA,UACE,SACA,qCAKN,eA7SF,aA8SI,iCAEA,YACE,yBAGF,UACE,UACA,YACA,iCAEA,YACE,4BAGF,YACE,8DAGF,eAEE,gCACA,gBACA,0EAEA,eACE,+BAIJ,eACE,6DAGF,2BnBhUoB,YmBuU1B,UACE,SACA,cACA,WACA,sDAKA,anBlVsB,0DmBqVpB,anBnVsB,4DmBwVxB,anBzWc,gBmB2WZ,4DAGF,anB7WU,gBmB+WR,0DAGF,anBtVsB,gBmBwVpB,0DAGF,anBrXU,gBmBuXR,UAIJ,YACE,eACA,yBAEA,aACE,qBACA,oCAEA,kBACE,4BAGF,cACE,gBACA,+BAEA,oBACE,iBACA,gCAIJ,eACE,eACA,CAII,iNADF,eACE,2BAKN,oBACE,cnBjZkB,qBmBmZlB,eACA,gBACA,gCACA,iCAEA,UnBxaE,gCmB0aA,oCAGF,anB3ZoB,gCmB6ZlB,CAkBJ,gBAIJ,aACE,iBACA,eACA,sBAGF,aACE,eACA,cACA,wBAEA,aACE,kBAIJ,YACE,eACA,mBACA,wBAGF,YACE,WACA,sBACA,aACA,+BAEA,aACE,qBACA,gBACA,eACA,iBACA,cnBrdsB,CmB0dlB,4MADF,eACE,sCAKN,aACE,gCAIJ,YAEE,mBACA,kEAEA,UACE,kBACA,4BACA,gFAEA,iBACE,kDAKN,aAEE,aACA,sBACA,4EAEA,cACE,WACA,kBACA,mBACA,uEAIJ,cAEE,iBAGF,YACE,eACA,kBACA,2CAEA,kBACE,eACA,8BAGF,kBACE,+CAGF,gBACE,uDAEA,gBACE,mBACA,YACA,YAKN,kBACE,eACA,cAEA,anBniBwB,qBmBqiBtB,oBAEA,yBACE,SAKN,aACE,YAGF,kBACE,iBACA,oBAEA,YACE,2BACA,mBACA,aACA,mBnBlkBS,cAOW,0BmB8jBpB,eACA,kBACA,oBAGF,iBACE,4BAEA,aACE,SACA,kBACA,WACA,YACA,qBAIJ,2BACE,mBAGF,oBACE,uBAGF,anBzkBsB,oBmB6kBtB,kBACE,0BACA,aACA,cnB9lBoB,gDmBgmBpB,eACA,qBACA,gBACA,kBAGF,cACE,kBACA,cnB1lBoB,2BmB8lBtB,iBACE,SACA,WACA,WACA,YACA,kBACA,oCAEA,kBnBnoBY,oCmBuoBZ,kBACE,mCAGF,kBnB1nBsB,sDmB+nBxB,anBhoBwB,qBmBooBtB,gBACA,sBAGF,aACE,0BAGF,anB5oBwB,sBmBgpBxB,anBhqBc,yDmBqqBhB,oBAIE,cnBzpBwB,iGmB4pBxB,eACE,yIAIA,4BACE,cACA,iIAGF,8BACE,CADF,sBACE,WACA,sBAKN,YAEE,mBACA,sCAEA,aACE,CACA,gBACA,kBACA,0DAIA,8BACE,CADF,sBACE,WACA,gBAKN,kBACE,8BACA,yBAEA,yBnBrtBc,yBmBytBd,yBACE,wBAGF,yBnB1tBU,wBmB+tBR,2BACA,eACA,iBACA,4BACA,kBACA,gBACA,0BAEA,anB3tBoB,uBmBiuBpB,wBACA,qBAGF,anBvtBsB,cmB4tBxB,kBnBjvBa,kBmBmvBX,mBACA,uBAEA,YACE,8BACA,mBACA,aACA,gCAEA,SACE,SACA,gDAEA,aACE,8BAIJ,aACE,gBACA,cnBhwBkB,iBmBkwBlB,gCAEA,aACE,qBACA,iHAEA,aAGE,mCAIJ,anB7xBM,6BmBoyBR,YACE,2BACA,6BACA,mCAEA,kBACE,gFAGF,YAEE,cACA,sBACA,YACA,cnBpyBgB,mLmBuyBhB,kBAEE,gBACA,uBACA,sCAIJ,aACE,6BACA,4CAEA,anBryBgB,iBmBuyBd,gBACA,wCAIJ,aACE,sBACA,WACA,aACA,qBACA,cnB/zBgB,WmBs0BxB,kBAGE,0BAFA,eACA,uBASA,CARA,eAGF,oBACE,gBACA,CAEA,qBACA,oBAGF,YACE,eACA,CACA,kBACA,wBAEA,qBACE,cACA,mBACA,aACA,0FAGF,kBAEE,kBACA,YACA,6CAGF,QACE,SACA,+CAEA,aACE,sEAGF,uBACE,yDAGF,anBn4BY,8CmBw4Bd,qBACE,aACA,WnB34BI,cmBg5BR,iBACE,sBCn5BF,YACE,eACA,CACA,kBACA,0BAEA,qBACE,iBACA,cACA,mBACA,yDAEA,YAEE,mBACA,kBACA,sBACA,YACA,4BAGF,oBACE,cACA,cACA,qGAEA,kBAGE,sDAKN,iBAEE,gBACA,eACA,iBACA,WpBrCI,6CoBuCJ,mBACA,iBACA,4BAGF,cACE,6BAGF,cACE,cpBjCoB,kBoBmCpB,gBACA,qBAIJ,YACE,eACA,cACA,yBAEA,gBACE,mBACA,6BAEA,aACE,sCAIJ,apBrDwB,gBoBuDtB,qBACA,UC3EJ,aACE,gCAEA,gBACE,eACA,mBACA,+BAGF,cACE,iBACA,8CAGF,aACE,kBACA,wBAGF,gBACE,iCAGF,aACE,kBACA,uCAGF,oBACE,gDAGF,SACE,YACA,8BAGF,cACE,iBACA,mEAGF,aACE,kBACA,2DAGF,cAEE,gBACA,mFAGF,cACE,gBACA,mCAGF,aACE,iBACA,yBAGF,kBACE,kBACA,4BAGF,UACE,UACA,wBAGF,aACE,kCAGF,MACE,WACA,cACA,mBACA,2CAGF,aACE,iBACA,0CAGF,gBACE,eACA,mCAGF,WACE,sCAGF,gBACE,gBACA,yCAGF,UACE,iCAGF,aACE,iBACA,0BAGF,SACE,WACA,0DAGF,iBAEE,mBACA,4GAGF,iBAEE,gBACA,uCAGF,kBACE,eACA,2BAGF,aACE,kBACA,wCAGF,SACE,YACA,yDAGF,SACE,WACA,CAKA,oFAGF,UACE,OACA,uGAGF,UAEE,uCAIA,cACE,iBACA,kEAEA,cACE,gBACA,qCAKN,WACE,eACA,iBACA,uCAGF,WACE,sCAGF,aACE,kBACA,0CAGF,gBACE,eACA,uDAGF,gBACE,2CAGF,cACE,iBACA,YACA,yEAGF,aAEE,iBACA,iBAGF,wBACE,iBAGF,SACE,oBACA,yBAGF,aACE,8EAGF,cAEE,gBACA,oDAGF,cACE,mBACA,gEAGF,iBACE,gBACA,CAMA,8KAGF,SACE,QACA,yDAGF,kBACE,eACA,uDAGF,kBACE,gBACA,qDAGF,SACE,QACA,8FAGF,cAEE,mBACA,4CAGF,UACE,SACA,kDAEA,UACE,OACA,+DACA,8BAIJ,sXACE,uCAGF,gBAEE,kCAGF,cACE,iBACA,gDAGF,UACE,UACA,gEAGF,aACE,uDAGF,WACE,WACA,uDAGF,UACE,WACA,uDAGF,UACE,WACA,kDAGF,MACE,0CAGF,iBACE,yBACA,qDAGF,cACE,iBACA,qCAGF,kCACE,gBAEE,kBACA,2DAEA,gBACE,mBACA,uEAKF,gBAEE,kBACA,gFAKN,cAEE,gBACA,6CAKE,eACE,eACA,sDAIJ,aACE,kBACA,4DAKF,cACE,gBACA,8DAGF,gBACE,eACA,mCAIJ,aACE,kBACA,iBACA,kCAGF,WACE,mCAGF,WACE,oCAGF,cACE,gBACA,gFAGF,cACE,mBACA,+DAGF,SACE,QACA,kkEC7ZJ,kIACE,CADF,sIACE,qBACA,0D","file":"flavours/vanilla/common.css","sourcesContent":["html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:\"\";content:none}table{border-collapse:collapse;border-spacing:0}html{scrollbar-color:#192432 rgba(0,0,0,.1)}::-webkit-scrollbar{width:12px;height:12px}::-webkit-scrollbar-thumb{background:#192432;border:0px none #fff;border-radius:50px}::-webkit-scrollbar-thumb:hover{background:#1c2938}::-webkit-scrollbar-thumb:active{background:#192432}::-webkit-scrollbar-track{border:0px none #fff;border-radius:0;background:rgba(0,0,0,.1)}::-webkit-scrollbar-track:hover{background:#121a24}::-webkit-scrollbar-track:active{background:#121a24}::-webkit-scrollbar-corner{background:transparent}body{font-family:\"mastodon-font-sans-serif\",sans-serif;background:#06090c;font-size:13px;line-height:18px;font-weight:400;color:#fff;text-rendering:optimizelegibility;font-feature-settings:\"kern\";text-size-adjust:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-tap-highlight-color:transparent}body.system-font{font-family:system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"Oxygen\",\"Ubuntu\",\"Cantarell\",\"Fira Sans\",\"Droid Sans\",\"Helvetica Neue\",\"mastodon-font-sans-serif\",sans-serif}body.app-body{padding:0}body.app-body.layout-single-column{height:auto;min-height:100vh;overflow-y:scroll}body.app-body.layout-multiple-columns{position:absolute;width:100%;height:100%}body.app-body.with-modals--active{overflow-y:hidden}body.lighter{background:#121a24}body.with-modals{overflow-x:hidden;overflow-y:scroll}body.with-modals--active{overflow-y:hidden}body.player{text-align:center}body.embed{background:#192432;margin:0;padding-bottom:0}body.embed .container{position:absolute;width:100%;height:100%;overflow:hidden}body.admin{background:#0b1016;padding:0}body.error{position:absolute;text-align:center;color:#9baec8;background:#121a24;width:100%;height:100%;padding:0;display:flex;justify-content:center;align-items:center}body.error .dialog{vertical-align:middle;margin:20px}body.error .dialog__illustration img{display:block;max-width:470px;width:100%;height:auto;margin-top:-120px}body.error .dialog h1{font-size:20px;line-height:28px;font-weight:400}button{font-family:inherit;cursor:pointer}button:focus{outline:none}.app-holder,.app-holder>div,.app-holder>noscript{display:flex;width:100%;align-items:center;justify-content:center;outline:0 !important}.app-holder>noscript{height:100vh}.layout-single-column .app-holder,.layout-single-column .app-holder>div{min-height:100vh}.layout-multiple-columns .app-holder,.layout-multiple-columns .app-holder>div{height:100%}.error-boundary,.app-holder noscript{flex-direction:column;font-size:16px;font-weight:400;line-height:1.7;color:#e25169;text-align:center}.error-boundary>div,.app-holder noscript>div{max-width:500px}.error-boundary p,.app-holder noscript p{margin-bottom:.85em}.error-boundary p:last-child,.app-holder noscript p:last-child{margin-bottom:0}.error-boundary a,.app-holder noscript a{color:#d8a070}.error-boundary a:hover,.error-boundary a:focus,.error-boundary a:active,.app-holder noscript a:hover,.app-holder noscript a:focus,.app-holder noscript a:active{text-decoration:none}.error-boundary__footer,.app-holder noscript__footer{color:#3e5a7c;font-size:13px}.error-boundary__footer a,.app-holder noscript__footer a{color:#3e5a7c}.error-boundary button,.app-holder noscript button{display:inline;border:0;background:transparent;color:#3e5a7c;font:inherit;padding:0;margin:0;line-height:inherit;cursor:pointer;outline:0;transition:color 300ms linear;text-decoration:underline}.error-boundary button:hover,.error-boundary button:focus,.error-boundary button:active,.app-holder noscript button:hover,.app-holder noscript button:focus,.app-holder noscript button:active{text-decoration:none}.error-boundary button.copied,.app-holder noscript button.copied{color:#79bd9a;transition:none}.container-alt{width:700px;margin:0 auto;margin-top:40px}@media screen and (max-width: 740px){.container-alt{width:100%;margin:0}}.logo-container{margin:100px auto 50px}@media screen and (max-width: 500px){.logo-container{margin:40px auto 0}}.logo-container h1{display:flex;justify-content:center;align-items:center}.logo-container h1 svg{fill:#fff;height:42px;margin-right:10px}.logo-container h1 a{display:flex;justify-content:center;align-items:center;color:#fff;text-decoration:none;outline:0;padding:12px 16px;line-height:32px;font-family:\"mastodon-font-display\",sans-serif;font-weight:500;font-size:14px}.compose-standalone .compose-form{width:400px;margin:0 auto;padding:20px 0;margin-top:40px;box-sizing:border-box}@media screen and (max-width: 400px){.compose-standalone .compose-form{width:100%;margin-top:0;padding:20px}}.account-header{width:400px;margin:0 auto;display:flex;font-size:13px;line-height:18px;box-sizing:border-box;padding:20px 0;padding-bottom:0;margin-bottom:-30px;margin-top:40px}@media screen and (max-width: 440px){.account-header{width:100%;margin:0;margin-bottom:10px;padding:20px;padding-bottom:0}}.account-header .avatar{width:40px;height:40px;margin-right:8px}.account-header .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px}.account-header .name{flex:1 1 auto;color:#d9e1e8;width:calc(100% - 88px)}.account-header .name .username{display:block;font-weight:500;text-overflow:ellipsis;overflow:hidden}.account-header .logout-link{display:block;font-size:32px;line-height:40px;margin-left:8px}.grid-3{display:grid;grid-gap:10px;grid-template-columns:3fr 1fr;grid-auto-columns:25%;grid-auto-rows:max-content}.grid-3 .column-0{grid-column:1/3;grid-row:1}.grid-3 .column-1{grid-column:1;grid-row:2}.grid-3 .column-2{grid-column:2;grid-row:2}.grid-3 .column-3{grid-column:1/3;grid-row:3}@media screen and (max-width: 415px){.grid-3{grid-gap:0;grid-template-columns:minmax(0, 100%)}.grid-3 .column-0{grid-column:1}.grid-3 .column-1{grid-column:1;grid-row:3}.grid-3 .column-2{grid-column:1;grid-row:2}.grid-3 .column-3{grid-column:1;grid-row:4}}.grid-4{display:grid;grid-gap:10px;grid-template-columns:repeat(4, minmax(0, 1fr));grid-auto-columns:25%;grid-auto-rows:max-content}.grid-4 .column-0{grid-column:1/5;grid-row:1}.grid-4 .column-1{grid-column:1/4;grid-row:2}.grid-4 .column-2{grid-column:4;grid-row:2}.grid-4 .column-3{grid-column:2/5;grid-row:3}.grid-4 .column-4{grid-column:1;grid-row:3}.grid-4 .landing-page__call-to-action{min-height:100%}.grid-4 .flash-message{margin-bottom:10px}@media screen and (max-width: 738px){.grid-4{grid-template-columns:minmax(0, 50%) minmax(0, 50%)}.grid-4 .landing-page__call-to-action{padding:20px;display:flex;align-items:center;justify-content:center}.grid-4 .row__information-board{width:100%;justify-content:center;align-items:center}.grid-4 .row__mascot{display:none}}@media screen and (max-width: 415px){.grid-4{grid-gap:0;grid-template-columns:minmax(0, 100%)}.grid-4 .column-0{grid-column:1}.grid-4 .column-1{grid-column:1;grid-row:3}.grid-4 .column-2{grid-column:1;grid-row:2}.grid-4 .column-3{grid-column:1;grid-row:5}.grid-4 .column-4{grid-column:1;grid-row:4}}@media screen and (max-width: 415px){.public-layout{padding-top:48px}}.public-layout .container{max-width:960px}@media screen and (max-width: 415px){.public-layout .container{padding:0}}.public-layout .header{background:#202e3f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;height:48px;margin:10px 0;display:flex;align-items:stretch;justify-content:center;flex-wrap:nowrap;overflow:hidden}@media screen and (max-width: 415px){.public-layout .header{position:fixed;width:100%;top:0;left:0;margin:0;border-radius:0;box-shadow:none;z-index:110}}.public-layout .header>div{flex:1 1 33.3%;min-height:1px}.public-layout .header .nav-left{display:flex;align-items:stretch;justify-content:flex-start;flex-wrap:nowrap}.public-layout .header .nav-center{display:flex;align-items:stretch;justify-content:center;flex-wrap:nowrap}.public-layout .header .nav-right{display:flex;align-items:stretch;justify-content:flex-end;flex-wrap:nowrap}.public-layout .header .brand{display:block;padding:15px}.public-layout .header .brand svg{display:block;height:18px;width:auto;position:relative;bottom:-2px;fill:#fff}@media screen and (max-width: 415px){.public-layout .header .brand svg{height:20px}}.public-layout .header .brand:hover,.public-layout .header .brand:focus,.public-layout .header .brand:active{background:#26374d}.public-layout .header .nav-link{display:flex;align-items:center;padding:0 1rem;font-size:12px;font-weight:500;text-decoration:none;color:#9baec8;white-space:nowrap;text-align:center}.public-layout .header .nav-link:hover,.public-layout .header .nav-link:focus,.public-layout .header .nav-link:active{text-decoration:underline;color:#fff}@media screen and (max-width: 550px){.public-layout .header .nav-link.optional{display:none}}.public-layout .header .nav-button{background:#2d415a;margin:8px;margin-left:0;border-radius:4px}.public-layout .header .nav-button:hover,.public-layout .header .nav-button:focus,.public-layout .header .nav-button:active{text-decoration:none;background:#344b68}.public-layout .grid{display:grid;grid-gap:10px;grid-template-columns:minmax(300px, 3fr) minmax(298px, 1fr);grid-auto-columns:25%;grid-auto-rows:max-content}.public-layout .grid .column-0{grid-row:1;grid-column:1}.public-layout .grid .column-1{grid-row:1;grid-column:2}@media screen and (max-width: 600px){.public-layout .grid{grid-template-columns:100%;grid-gap:0}.public-layout .grid .column-1{display:none}}.public-layout .directory__card{border-radius:4px}@media screen and (max-width: 415px){.public-layout .directory__card{border-radius:0}}@media screen and (max-width: 415px){.public-layout .page-header{border-bottom:0}}.public-layout .public-account-header{overflow:hidden;margin-bottom:10px;box-shadow:0 0 15px rgba(0,0,0,.2)}.public-layout .public-account-header.inactive{opacity:.5}.public-layout .public-account-header.inactive .public-account-header__image,.public-layout .public-account-header.inactive .avatar{filter:grayscale(100%)}.public-layout .public-account-header.inactive .logo-button{background-color:#d9e1e8}.public-layout .public-account-header__image{border-radius:4px 4px 0 0;overflow:hidden;height:300px;position:relative;background:#000}.public-layout .public-account-header__image::after{content:\"\";display:block;position:absolute;width:100%;height:100%;box-shadow:inset 0 -1px 1px 1px rgba(0,0,0,.15);top:0;left:0}.public-layout .public-account-header__image img{object-fit:cover;display:block;width:100%;height:100%;margin:0;border-radius:4px 4px 0 0}@media screen and (max-width: 600px){.public-layout .public-account-header__image{height:200px}}.public-layout .public-account-header--no-bar{margin-bottom:0}.public-layout .public-account-header--no-bar .public-account-header__image,.public-layout .public-account-header--no-bar .public-account-header__image img{border-radius:4px}@media screen and (max-width: 415px){.public-layout .public-account-header--no-bar .public-account-header__image,.public-layout .public-account-header--no-bar .public-account-header__image img{border-radius:0}}@media screen and (max-width: 415px){.public-layout .public-account-header{margin-bottom:0;box-shadow:none}.public-layout .public-account-header__image::after{display:none}.public-layout .public-account-header__image,.public-layout .public-account-header__image img{border-radius:0}}.public-layout .public-account-header__bar{position:relative;margin-top:-80px;display:flex;justify-content:flex-start}.public-layout .public-account-header__bar::before{content:\"\";display:block;background:#192432;position:absolute;bottom:0;left:0;right:0;height:60px;border-radius:0 0 4px 4px;z-index:-1}.public-layout .public-account-header__bar .avatar{display:block;width:120px;height:120px;padding-left:16px;flex:0 0 auto}.public-layout .public-account-header__bar .avatar img{display:block;width:100%;height:100%;margin:0;border-radius:50%;border:4px solid #192432;background:#040609}@media screen and (max-width: 600px){.public-layout .public-account-header__bar{margin-top:0;background:#192432;border-radius:0 0 4px 4px;padding:5px}.public-layout .public-account-header__bar::before{display:none}.public-layout .public-account-header__bar .avatar{width:48px;height:48px;padding:7px 0;padding-left:10px}.public-layout .public-account-header__bar .avatar img{border:0;border-radius:4px}}@media screen and (max-width: 600px)and (max-width: 360px){.public-layout .public-account-header__bar .avatar{display:none}}@media screen and (max-width: 415px){.public-layout .public-account-header__bar{border-radius:0}}@media screen and (max-width: 600px){.public-layout .public-account-header__bar{flex-wrap:wrap}}.public-layout .public-account-header__tabs{flex:1 1 auto;margin-left:20px}.public-layout .public-account-header__tabs__name{padding-top:20px;padding-bottom:8px}.public-layout .public-account-header__tabs__name h1{font-size:20px;line-height:27px;color:#fff;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-shadow:1px 1px 1px #000}.public-layout .public-account-header__tabs__name h1 small{display:block;font-size:14px;color:#fff;font-weight:400;overflow:hidden;text-overflow:ellipsis}@media screen and (max-width: 600px){.public-layout .public-account-header__tabs{margin-left:15px;display:flex;justify-content:space-between;align-items:center}.public-layout .public-account-header__tabs__name{padding-top:0;padding-bottom:0}.public-layout .public-account-header__tabs__name h1{font-size:16px;line-height:24px;text-shadow:none}.public-layout .public-account-header__tabs__name h1 small{color:#9baec8}}.public-layout .public-account-header__tabs__tabs{display:flex;justify-content:flex-start;align-items:stretch;height:58px}.public-layout .public-account-header__tabs__tabs .details-counters{display:flex;flex-direction:row;min-width:300px}@media screen and (max-width: 600px){.public-layout .public-account-header__tabs__tabs .details-counters{display:none}}.public-layout .public-account-header__tabs__tabs .counter{min-width:33.3%;box-sizing:border-box;flex:0 0 auto;color:#9baec8;padding:10px;border-right:1px solid #192432;cursor:default;text-align:center;position:relative}.public-layout .public-account-header__tabs__tabs .counter a{display:block}.public-layout .public-account-header__tabs__tabs .counter:last-child{border-right:0}.public-layout .public-account-header__tabs__tabs .counter::after{display:block;content:\"\";position:absolute;bottom:0;left:0;width:100%;border-bottom:4px solid #9baec8;opacity:.5;transition:all 400ms ease}.public-layout .public-account-header__tabs__tabs .counter.active::after{border-bottom:4px solid #d8a070;opacity:1}.public-layout .public-account-header__tabs__tabs .counter.active.inactive::after{border-bottom-color:#d9e1e8}.public-layout .public-account-header__tabs__tabs .counter:hover::after{opacity:1;transition-duration:100ms}.public-layout .public-account-header__tabs__tabs .counter a{text-decoration:none;color:inherit}.public-layout .public-account-header__tabs__tabs .counter .counter-label{font-size:12px;display:block}.public-layout .public-account-header__tabs__tabs .counter .counter-number{font-weight:500;font-size:18px;margin-bottom:5px;color:#fff;font-family:\"mastodon-font-display\",sans-serif}.public-layout .public-account-header__tabs__tabs .spacer{flex:1 1 auto;height:1px}.public-layout .public-account-header__tabs__tabs__buttons{padding:7px 8px}.public-layout .public-account-header__extra{display:none;margin-top:4px}.public-layout .public-account-header__extra .public-account-bio{border-radius:0;box-shadow:none;background:transparent;margin:0 -5px}.public-layout .public-account-header__extra .public-account-bio .account__header__fields{border-top:1px solid #26374d}.public-layout .public-account-header__extra .public-account-bio .roles{display:none}.public-layout .public-account-header__extra__links{margin-top:-15px;font-size:14px;color:#9baec8}.public-layout .public-account-header__extra__links a{display:inline-block;color:#9baec8;text-decoration:none;padding:15px;font-weight:500}.public-layout .public-account-header__extra__links a strong{font-weight:700;color:#fff}@media screen and (max-width: 600px){.public-layout .public-account-header__extra{display:block;flex:100%}}.public-layout .account__section-headline{border-radius:4px 4px 0 0}@media screen and (max-width: 415px){.public-layout .account__section-headline{border-radius:0}}.public-layout .detailed-status__meta{margin-top:25px}.public-layout .public-account-bio{background:#202e3f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;overflow:hidden;margin-bottom:10px}@media screen and (max-width: 415px){.public-layout .public-account-bio{box-shadow:none;margin-bottom:0;border-radius:0}}.public-layout .public-account-bio .account__header__fields{margin:0;border-top:0}.public-layout .public-account-bio .account__header__fields a{color:#e1b590}.public-layout .public-account-bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.public-layout .public-account-bio .account__header__fields .verified a{color:#79bd9a}.public-layout .public-account-bio .account__header__content{padding:20px;padding-bottom:0;color:#fff}.public-layout .public-account-bio__extra,.public-layout .public-account-bio .roles{padding:20px;font-size:14px;color:#9baec8}.public-layout .public-account-bio .roles{padding-bottom:0}.public-layout .directory__list{display:grid;grid-gap:10px;grid-template-columns:minmax(0, 50%) minmax(0, 50%)}@media screen and (max-width: 415px){.public-layout .directory__list{display:block}}.public-layout .directory__list .icon-button{font-size:18px}.public-layout .directory__card{margin-bottom:0}.public-layout .card-grid{display:flex;flex-wrap:wrap;min-width:100%;margin:0 -5px}.public-layout .card-grid>div{box-sizing:border-box;flex:1 0 auto;width:300px;padding:0 5px;margin-bottom:10px;max-width:33.333%}@media screen and (max-width: 900px){.public-layout .card-grid>div{max-width:50%}}@media screen and (max-width: 600px){.public-layout .card-grid>div{max-width:100%}}@media screen and (max-width: 415px){.public-layout .card-grid{margin:0;border-top:1px solid #202e3f}.public-layout .card-grid>div{width:100%;padding:0;margin-bottom:0;border-bottom:1px solid #202e3f}.public-layout .card-grid>div:last-child{border-bottom:0}.public-layout .card-grid>div .card__bar{background:#121a24}.public-layout .card-grid>div .card__bar:hover,.public-layout .card-grid>div .card__bar:active,.public-layout .card-grid>div .card__bar:focus{background:#192432}}.no-list{list-style:none}.no-list li{display:inline-block;margin:0 5px}.recovery-codes{list-style:none;margin:0 auto}.recovery-codes li{font-size:125%;line-height:1.5;letter-spacing:1px}.public-layout .footer{text-align:left;padding-top:20px;padding-bottom:60px;font-size:12px;color:#4c6d98}@media screen and (max-width: 415px){.public-layout .footer{padding-left:20px;padding-right:20px}}.public-layout .footer .grid{display:grid;grid-gap:10px;grid-template-columns:1fr 1fr 2fr 1fr 1fr}.public-layout .footer .grid .column-0{grid-column:1;grid-row:1;min-width:0}.public-layout .footer .grid .column-1{grid-column:2;grid-row:1;min-width:0}.public-layout .footer .grid .column-2{grid-column:3;grid-row:1;min-width:0;text-align:center}.public-layout .footer .grid .column-2 h4 a{color:#4c6d98}.public-layout .footer .grid .column-3{grid-column:4;grid-row:1;min-width:0}.public-layout .footer .grid .column-4{grid-column:5;grid-row:1;min-width:0}@media screen and (max-width: 690px){.public-layout .footer .grid{grid-template-columns:1fr 2fr 1fr}.public-layout .footer .grid .column-0,.public-layout .footer .grid .column-1{grid-column:1}.public-layout .footer .grid .column-1{grid-row:2}.public-layout .footer .grid .column-2{grid-column:2}.public-layout .footer .grid .column-3,.public-layout .footer .grid .column-4{grid-column:3}.public-layout .footer .grid .column-4{grid-row:2}}@media screen and (max-width: 600px){.public-layout .footer .grid .column-1{display:block}}@media screen and (max-width: 415px){.public-layout .footer .grid .column-0,.public-layout .footer .grid .column-1,.public-layout .footer .grid .column-3,.public-layout .footer .grid .column-4{display:none}}.public-layout .footer h4{font-weight:700;margin-bottom:8px;color:#9baec8}.public-layout .footer h4 a{color:inherit;text-decoration:none}.public-layout .footer ul a{text-decoration:none;color:#4c6d98}.public-layout .footer ul a:hover,.public-layout .footer ul a:active,.public-layout .footer ul a:focus{text-decoration:underline}.public-layout .footer .brand svg{display:block;height:36px;width:auto;margin:0 auto;fill:#4c6d98}.public-layout .footer .brand:hover svg,.public-layout .footer .brand:focus svg,.public-layout .footer .brand:active svg{fill:#5377a5}.compact-header h1{font-size:24px;line-height:28px;color:#9baec8;font-weight:500;margin-bottom:20px;padding:0 10px;word-wrap:break-word}@media screen and (max-width: 740px){.compact-header h1{text-align:center;padding:20px 10px 0}}.compact-header h1 a{color:inherit;text-decoration:none}.compact-header h1 small{font-weight:400;color:#d9e1e8}.compact-header h1 img{display:inline-block;margin-bottom:-5px;margin-right:15px;width:36px;height:36px}.hero-widget{margin-bottom:10px;box-shadow:0 0 15px rgba(0,0,0,.2)}.hero-widget__img{width:100%;position:relative;overflow:hidden;border-radius:4px 4px 0 0;background:#000}.hero-widget__img img{object-fit:cover;display:block;width:100%;height:100%;margin:0;border-radius:4px 4px 0 0}.hero-widget__text{background:#121a24;padding:20px;border-radius:0 0 4px 4px;font-size:15px;color:#9baec8;line-height:20px;word-wrap:break-word;font-weight:400}.hero-widget__text .emojione{width:20px;height:20px;margin:-3px 0 0}.hero-widget__text p{margin-bottom:20px}.hero-widget__text p:last-child{margin-bottom:0}.hero-widget__text em{display:inline;margin:0;padding:0;font-weight:700;background:transparent;font-family:inherit;font-size:inherit;line-height:inherit;color:#bcc9da}.hero-widget__text a{color:#d9e1e8;text-decoration:none}.hero-widget__text a:hover{text-decoration:underline}@media screen and (max-width: 415px){.hero-widget{display:none}}.endorsements-widget{margin-bottom:10px;padding-bottom:10px}.endorsements-widget h4{padding:10px;font-weight:700;font-size:14px;color:#9baec8}.endorsements-widget .account{padding:10px 0}.endorsements-widget .account:last-child{border-bottom:0}.endorsements-widget .account .account__display-name{display:flex;align-items:center}.endorsements-widget .account .account__avatar{width:44px;height:44px;background-size:44px 44px}.endorsements-widget .trends__item{padding:10px}.trends-widget h4{color:#9baec8}.box-widget{padding:20px;border-radius:4px;background:#121a24;box-shadow:0 0 15px rgba(0,0,0,.2)}.placeholder-widget{padding:16px;border-radius:4px;border:2px dashed #3e5a7c;text-align:center;color:#9baec8;margin-bottom:10px}.contact-widget{min-height:100%;font-size:15px;color:#9baec8;line-height:20px;word-wrap:break-word;font-weight:400;padding:0}.contact-widget h4{padding:10px;font-weight:700;font-size:14px;color:#9baec8}.contact-widget .account{border-bottom:0;padding:10px 0;padding-top:5px}.contact-widget>a{display:inline-block;padding:10px;padding-top:0;color:#9baec8;text-decoration:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.contact-widget>a:hover,.contact-widget>a:focus,.contact-widget>a:active{text-decoration:underline}.moved-account-widget{padding:15px;padding-bottom:20px;border-radius:4px;background:#121a24;box-shadow:0 0 15px rgba(0,0,0,.2);color:#d9e1e8;font-weight:400;margin-bottom:10px}.moved-account-widget strong,.moved-account-widget a{font-weight:500}.moved-account-widget strong:lang(ja),.moved-account-widget a:lang(ja){font-weight:700}.moved-account-widget strong:lang(ko),.moved-account-widget a:lang(ko){font-weight:700}.moved-account-widget strong:lang(zh-CN),.moved-account-widget a:lang(zh-CN){font-weight:700}.moved-account-widget strong:lang(zh-HK),.moved-account-widget a:lang(zh-HK){font-weight:700}.moved-account-widget strong:lang(zh-TW),.moved-account-widget a:lang(zh-TW){font-weight:700}.moved-account-widget a{color:inherit;text-decoration:underline}.moved-account-widget a.mention{text-decoration:none}.moved-account-widget a.mention span{text-decoration:none}.moved-account-widget a.mention:focus,.moved-account-widget a.mention:hover,.moved-account-widget a.mention:active{text-decoration:none}.moved-account-widget a.mention:focus span,.moved-account-widget a.mention:hover span,.moved-account-widget a.mention:active span{text-decoration:underline}.moved-account-widget__message{margin-bottom:15px}.moved-account-widget__message .fa{margin-right:5px;color:#9baec8}.moved-account-widget__card .detailed-status__display-avatar{position:relative;cursor:pointer}.moved-account-widget__card .detailed-status__display-name{margin-bottom:0;text-decoration:none}.moved-account-widget__card .detailed-status__display-name span{font-weight:400}.memoriam-widget{padding:20px;border-radius:4px;background:#000;box-shadow:0 0 15px rgba(0,0,0,.2);font-size:14px;color:#9baec8;margin-bottom:10px}.page-header{background:#202e3f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;padding:60px 15px;text-align:center;margin:10px 0}.page-header h1{color:#fff;font-size:36px;line-height:1.1;font-weight:700;margin-bottom:10px}.page-header p{font-size:15px;color:#9baec8}@media screen and (max-width: 415px){.page-header{margin-top:0;background:#192432}.page-header h1{font-size:24px}}.directory{background:#121a24;border-radius:4px;box-shadow:0 0 15px rgba(0,0,0,.2)}.directory__tag{box-sizing:border-box;margin-bottom:10px}.directory__tag>a,.directory__tag>div{display:flex;align-items:center;justify-content:space-between;background:#121a24;border-radius:4px;padding:15px;text-decoration:none;color:inherit;box-shadow:0 0 15px rgba(0,0,0,.2)}.directory__tag>a:hover,.directory__tag>a:active,.directory__tag>a:focus{background:#202e3f}.directory__tag.active>a{background:#d8a070;cursor:default}.directory__tag.disabled>div{opacity:.5;cursor:default}.directory__tag h4{flex:1 1 auto;font-size:18px;font-weight:700;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.directory__tag h4 .fa{color:#9baec8}.directory__tag h4 small{display:block;font-weight:400;font-size:15px;margin-top:8px;color:#9baec8}.directory__tag.active h4,.directory__tag.active h4 .fa,.directory__tag.active h4 small,.directory__tag.active h4 .trends__item__current{color:#fff}.directory__tag .avatar-stack{flex:0 0 auto;width:120px}.directory__tag.active .avatar-stack .account__avatar{border-color:#d8a070}.directory__tag .trends__item__current{padding-right:0}.avatar-stack{display:flex;justify-content:flex-end}.avatar-stack .account__avatar{flex:0 0 auto;width:36px;height:36px;border-radius:50%;position:relative;margin-left:-10px;background:#040609;border:2px solid #121a24}.avatar-stack .account__avatar:nth-child(1){z-index:1}.avatar-stack .account__avatar:nth-child(2){z-index:2}.avatar-stack .account__avatar:nth-child(3){z-index:3}.accounts-table{width:100%}.accounts-table .account{padding:0;border:0}.accounts-table strong{font-weight:700}.accounts-table thead th{text-align:center;color:#9baec8;font-weight:700;padding:10px}.accounts-table thead th:first-child{text-align:left}.accounts-table tbody td{padding:15px 0;vertical-align:middle;border-bottom:1px solid #202e3f}.accounts-table tbody tr:last-child td{border-bottom:0}.accounts-table__count{width:120px;text-align:center;font-size:15px;font-weight:500;color:#fff}.accounts-table__count small{display:block;color:#9baec8;font-weight:400;font-size:14px}.accounts-table__comment{width:50%;vertical-align:initial !important}@media screen and (max-width: 415px){.accounts-table tbody td.optional{display:none}}@media screen and (max-width: 415px){.moved-account-widget,.memoriam-widget,.box-widget,.contact-widget,.landing-page__information.contact-widget,.directory,.page-header{margin-bottom:0;box-shadow:none;border-radius:0}}.statuses-grid{min-height:600px}@media screen and (max-width: 640px){.statuses-grid{width:100% !important}}.statuses-grid__item{width:313.3333333333px}@media screen and (max-width: 1255px){.statuses-grid__item{width:306.6666666667px}}@media screen and (max-width: 640px){.statuses-grid__item{width:100%}}@media screen and (max-width: 415px){.statuses-grid__item{width:100vw}}.statuses-grid .detailed-status{border-radius:4px}@media screen and (max-width: 415px){.statuses-grid .detailed-status{border-top:1px solid #2d415a}}.statuses-grid .detailed-status.compact .detailed-status__meta{margin-top:15px}.statuses-grid .detailed-status.compact .status__content{font-size:15px;line-height:20px}.statuses-grid .detailed-status.compact .status__content .emojione{width:20px;height:20px;margin:-3px 0 0}.statuses-grid .detailed-status.compact .status__content .status__content__spoiler-link{line-height:20px;margin:0}.statuses-grid .detailed-status.compact .media-gallery,.statuses-grid .detailed-status.compact .status-card,.statuses-grid .detailed-status.compact .video-player{margin-top:15px}.notice-widget{margin-bottom:10px;color:#9baec8}.notice-widget p{margin-bottom:10px}.notice-widget p:last-child{margin-bottom:0}.notice-widget a{font-size:14px;line-height:20px}.notice-widget a,.placeholder-widget a{text-decoration:none;font-weight:500;color:#d8a070}.notice-widget a:hover,.notice-widget a:focus,.notice-widget a:active,.placeholder-widget a:hover,.placeholder-widget a:focus,.placeholder-widget a:active{text-decoration:underline}.table-of-contents{background:#0b1016;min-height:100%;font-size:14px;border-radius:4px}.table-of-contents li a{display:block;font-weight:500;padding:15px;overflow:hidden;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-decoration:none;color:#fff;border-bottom:1px solid #192432}.table-of-contents li a:hover,.table-of-contents li a:focus,.table-of-contents li a:active{text-decoration:underline}.table-of-contents li:last-child a{border-bottom:0}.table-of-contents li ul{padding-left:20px;border-bottom:1px solid #192432}code{font-family:\"mastodon-font-monospace\",monospace;font-weight:400}.form-container{max-width:400px;padding:20px;margin:0 auto}.simple_form .input{margin-bottom:15px;overflow:hidden}.simple_form .input.hidden{margin:0}.simple_form .input.radio_buttons .radio{margin-bottom:15px}.simple_form .input.radio_buttons .radio:last-child{margin-bottom:0}.simple_form .input.radio_buttons .radio>label{position:relative;padding-left:28px}.simple_form .input.radio_buttons .radio>label input{position:absolute;top:-2px;left:0}.simple_form .input.boolean{position:relative;margin-bottom:0}.simple_form .input.boolean .label_input>label{font-family:inherit;font-size:14px;padding-top:5px;color:#fff;display:block;width:auto}.simple_form .input.boolean .label_input,.simple_form .input.boolean .hint{padding-left:28px}.simple_form .input.boolean .label_input__wrapper{position:static}.simple_form .input.boolean label.checkbox{position:absolute;top:2px;left:0}.simple_form .input.boolean label a{color:#d8a070;text-decoration:underline}.simple_form .input.boolean label a:hover,.simple_form .input.boolean label a:active,.simple_form .input.boolean label a:focus{text-decoration:none}.simple_form .input.boolean .recommended{position:absolute;margin:0 4px;margin-top:-2px}.simple_form .row{display:flex;margin:0 -5px}.simple_form .row .input{box-sizing:border-box;flex:1 1 auto;width:50%;padding:0 5px}.simple_form .hint{color:#9baec8}.simple_form .hint a{color:#d8a070}.simple_form .hint code{border-radius:3px;padding:.2em .4em;background:#000}.simple_form .hint li{list-style:disc;margin-left:18px}.simple_form ul.hint{margin-bottom:15px}.simple_form span.hint{display:block;font-size:12px;margin-top:4px}.simple_form p.hint{margin-bottom:15px;color:#9baec8}.simple_form p.hint.subtle-hint{text-align:center;font-size:12px;line-height:18px;margin-top:15px;margin-bottom:0}.simple_form .card{margin-bottom:15px}.simple_form strong{font-weight:500}.simple_form strong:lang(ja){font-weight:700}.simple_form strong:lang(ko){font-weight:700}.simple_form strong:lang(zh-CN){font-weight:700}.simple_form strong:lang(zh-HK){font-weight:700}.simple_form strong:lang(zh-TW){font-weight:700}.simple_form .input.with_floating_label .label_input{display:flex}.simple_form .input.with_floating_label .label_input>label{font-family:inherit;font-size:14px;color:#fff;font-weight:500;min-width:150px;flex:0 0 auto}.simple_form .input.with_floating_label .label_input input,.simple_form .input.with_floating_label .label_input select{flex:1 1 auto}.simple_form .input.with_floating_label.select .hint{margin-top:6px;margin-left:150px}.simple_form .input.with_label .label_input>label{font-family:inherit;font-size:14px;color:#fff;display:block;margin-bottom:8px;word-wrap:break-word;font-weight:500}.simple_form .input.with_label .hint{margin-top:6px}.simple_form .input.with_label ul{flex:390px}.simple_form .input.with_block_label{max-width:none}.simple_form .input.with_block_label>label{font-family:inherit;font-size:16px;color:#fff;display:block;font-weight:500;padding-top:5px}.simple_form .input.with_block_label .hint{margin-bottom:15px}.simple_form .input.with_block_label ul{columns:2}.simple_form .required abbr{text-decoration:none;color:#e87487}.simple_form .fields-group{margin-bottom:25px}.simple_form .fields-group .input:last-child{margin-bottom:0}.simple_form .fields-row{display:flex;margin:0 -10px;padding-top:5px;margin-bottom:25px}.simple_form .fields-row .input{max-width:none}.simple_form .fields-row__column{box-sizing:border-box;padding:0 10px;flex:1 1 auto;min-height:1px}.simple_form .fields-row__column-6{max-width:50%}.simple_form .fields-row__column .actions{margin-top:27px}.simple_form .fields-row .fields-group:last-child,.simple_form .fields-row .fields-row__column.fields-group{margin-bottom:0}@media screen and (max-width: 600px){.simple_form .fields-row{display:block;margin-bottom:0}.simple_form .fields-row__column{max-width:none}.simple_form .fields-row .fields-group:last-child,.simple_form .fields-row .fields-row__column.fields-group,.simple_form .fields-row .fields-row__column{margin-bottom:25px}}.simple_form .input.radio_buttons .radio label{margin-bottom:5px;font-family:inherit;font-size:14px;color:#fff;display:block;width:auto}.simple_form .check_boxes .checkbox label{font-family:inherit;font-size:14px;color:#fff;display:inline-block;width:auto;position:relative;padding-top:5px;padding-left:25px;flex:1 1 auto}.simple_form .check_boxes .checkbox input[type=checkbox]{position:absolute;left:0;top:5px;margin:0}.simple_form .input.static .label_input__wrapper{font-size:16px;padding:10px;border:1px solid #3e5a7c;border-radius:4px}.simple_form input[type=text],.simple_form input[type=number],.simple_form input[type=email],.simple_form input[type=password],.simple_form textarea{box-sizing:border-box;font-size:16px;color:#fff;display:block;width:100%;outline:0;font-family:inherit;resize:vertical;background:#010102;border:1px solid #000;border-radius:4px;padding:10px}.simple_form input[type=text]::placeholder,.simple_form input[type=number]::placeholder,.simple_form input[type=email]::placeholder,.simple_form input[type=password]::placeholder,.simple_form textarea::placeholder{color:#a8b9cf}.simple_form input[type=text]:invalid,.simple_form input[type=number]:invalid,.simple_form input[type=email]:invalid,.simple_form input[type=password]:invalid,.simple_form textarea:invalid{box-shadow:none}.simple_form input[type=text]:focus:invalid:not(:placeholder-shown),.simple_form input[type=number]:focus:invalid:not(:placeholder-shown),.simple_form input[type=email]:focus:invalid:not(:placeholder-shown),.simple_form input[type=password]:focus:invalid:not(:placeholder-shown),.simple_form textarea:focus:invalid:not(:placeholder-shown){border-color:#e87487}.simple_form input[type=text]:required:valid,.simple_form input[type=number]:required:valid,.simple_form input[type=email]:required:valid,.simple_form input[type=password]:required:valid,.simple_form textarea:required:valid{border-color:#79bd9a}.simple_form input[type=text]:hover,.simple_form input[type=number]:hover,.simple_form input[type=email]:hover,.simple_form input[type=password]:hover,.simple_form textarea:hover{border-color:#000}.simple_form input[type=text]:active,.simple_form input[type=text]:focus,.simple_form input[type=number]:active,.simple_form input[type=number]:focus,.simple_form input[type=email]:active,.simple_form input[type=email]:focus,.simple_form input[type=password]:active,.simple_form input[type=password]:focus,.simple_form textarea:active,.simple_form textarea:focus{border-color:#d8a070;background:#040609}.simple_form .input.field_with_errors label{color:#e87487}.simple_form .input.field_with_errors input[type=text],.simple_form .input.field_with_errors input[type=number],.simple_form .input.field_with_errors input[type=email],.simple_form .input.field_with_errors input[type=password],.simple_form .input.field_with_errors textarea,.simple_form .input.field_with_errors select{border-color:#e87487}.simple_form .input.field_with_errors .error{display:block;font-weight:500;color:#e87487;margin-top:4px}.simple_form .input.disabled{opacity:.5}.simple_form .actions{margin-top:30px;display:flex}.simple_form .actions.actions--top{margin-top:0;margin-bottom:30px}.simple_form button,.simple_form .button,.simple_form .block-button{display:block;width:100%;border:0;border-radius:4px;background:#d8a070;color:#fff;font-size:18px;line-height:inherit;height:auto;padding:10px;text-decoration:none;text-align:center;box-sizing:border-box;cursor:pointer;font-weight:500;outline:0;margin-bottom:10px;margin-right:10px}.simple_form button:last-child,.simple_form .button:last-child,.simple_form .block-button:last-child{margin-right:0}.simple_form button:hover,.simple_form .button:hover,.simple_form .block-button:hover{background-color:#ddad84}.simple_form button:active,.simple_form button:focus,.simple_form .button:active,.simple_form .button:focus,.simple_form .block-button:active,.simple_form .block-button:focus{background-color:#d3935c}.simple_form button:disabled:hover,.simple_form .button:disabled:hover,.simple_form .block-button:disabled:hover{background-color:#9baec8}.simple_form button.negative,.simple_form .button.negative,.simple_form .block-button.negative{background:#df405a}.simple_form button.negative:hover,.simple_form .button.negative:hover,.simple_form .block-button.negative:hover{background-color:#e3566d}.simple_form button.negative:active,.simple_form button.negative:focus,.simple_form .button.negative:active,.simple_form .button.negative:focus,.simple_form .block-button.negative:active,.simple_form .block-button.negative:focus{background-color:#db2a47}.simple_form select{appearance:none;box-sizing:border-box;font-size:16px;color:#fff;display:block;width:100%;outline:0;font-family:inherit;resize:vertical;background:#010102 url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center/auto 16px;border:1px solid #000;border-radius:4px;padding-left:10px;padding-right:30px;height:41px}.simple_form h4{margin-bottom:15px !important}.simple_form .label_input__wrapper{position:relative}.simple_form .label_input__append{position:absolute;right:3px;top:1px;padding:10px;padding-bottom:9px;font-size:16px;color:#3e5a7c;font-family:inherit;pointer-events:none;cursor:default;max-width:140px;white-space:nowrap;overflow:hidden}.simple_form .label_input__append::after{content:\"\";display:block;position:absolute;top:0;right:0;bottom:1px;width:5px;background-image:linear-gradient(to right, rgba(1, 1, 2, 0), #010102)}.simple_form__overlay-area{position:relative}.simple_form__overlay-area__blurred form{filter:blur(2px)}.simple_form__overlay-area__overlay{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;background:rgba(18,26,36,.65);border-radius:4px;margin-left:-4px;margin-top:-4px;padding:4px}.simple_form__overlay-area__overlay__content{text-align:center}.simple_form__overlay-area__overlay__content.rich-formatting,.simple_form__overlay-area__overlay__content.rich-formatting p{color:#fff}.block-icon{display:block;margin:0 auto;margin-bottom:10px;font-size:24px}.flash-message{background:#202e3f;color:#9baec8;border-radius:4px;padding:15px 10px;margin-bottom:30px;text-align:center}.flash-message.notice{border:1px solid rgba(121,189,154,.5);background:rgba(121,189,154,.25);color:#79bd9a}.flash-message.alert{border:1px solid rgba(223,64,90,.5);background:rgba(223,64,90,.25);color:#df405a}.flash-message a{display:inline-block;color:#9baec8;text-decoration:none}.flash-message a:hover{color:#fff;text-decoration:underline}.flash-message p{margin-bottom:15px}.flash-message .oauth-code{outline:0;box-sizing:border-box;display:block;width:100%;border:0;padding:10px;font-family:\"mastodon-font-monospace\",monospace;background:#121a24;color:#fff;font-size:14px;margin:0}.flash-message .oauth-code::-moz-focus-inner{border:0}.flash-message .oauth-code::-moz-focus-inner,.flash-message .oauth-code:focus,.flash-message .oauth-code:active{outline:0 !important}.flash-message .oauth-code:focus{background:#192432}.flash-message strong{font-weight:500}.flash-message strong:lang(ja){font-weight:700}.flash-message strong:lang(ko){font-weight:700}.flash-message strong:lang(zh-CN){font-weight:700}.flash-message strong:lang(zh-HK){font-weight:700}.flash-message strong:lang(zh-TW){font-weight:700}@media screen and (max-width: 740px)and (min-width: 441px){.flash-message{margin-top:40px}}.form-footer{margin-top:30px;text-align:center}.form-footer a{color:#9baec8;text-decoration:none}.form-footer a:hover{text-decoration:underline}.quick-nav{list-style:none;margin-bottom:25px;font-size:14px}.quick-nav li{display:inline-block;margin-right:10px}.quick-nav a{color:#d8a070;text-decoration:none;font-weight:700}.quick-nav a:hover,.quick-nav a:focus,.quick-nav a:active{color:#e1b590}.oauth-prompt,.follow-prompt{margin-bottom:30px;color:#9baec8}.oauth-prompt h2,.follow-prompt h2{font-size:16px;margin-bottom:30px;text-align:center}.oauth-prompt strong,.follow-prompt strong{color:#d9e1e8;font-weight:500}.oauth-prompt strong:lang(ja),.follow-prompt strong:lang(ja){font-weight:700}.oauth-prompt strong:lang(ko),.follow-prompt strong:lang(ko){font-weight:700}.oauth-prompt strong:lang(zh-CN),.follow-prompt strong:lang(zh-CN){font-weight:700}.oauth-prompt strong:lang(zh-HK),.follow-prompt strong:lang(zh-HK){font-weight:700}.oauth-prompt strong:lang(zh-TW),.follow-prompt strong:lang(zh-TW){font-weight:700}@media screen and (max-width: 740px)and (min-width: 441px){.oauth-prompt,.follow-prompt{margin-top:40px}}.qr-wrapper{display:flex;flex-wrap:wrap;align-items:flex-start}.qr-code{flex:0 0 auto;background:#fff;padding:4px;margin:0 10px 20px 0;box-shadow:0 0 15px rgba(0,0,0,.2);display:inline-block}.qr-code svg{display:block;margin:0}.qr-alternative{margin-bottom:20px;color:#d9e1e8;flex:150px}.qr-alternative samp{display:block;font-size:14px}.table-form p{margin-bottom:15px}.table-form p strong{font-weight:500}.table-form p strong:lang(ja){font-weight:700}.table-form p strong:lang(ko){font-weight:700}.table-form p strong:lang(zh-CN){font-weight:700}.table-form p strong:lang(zh-HK){font-weight:700}.table-form p strong:lang(zh-TW){font-weight:700}.simple_form .warning,.table-form .warning{box-sizing:border-box;background:rgba(223,64,90,.5);color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,.3);box-shadow:0 2px 6px rgba(0,0,0,.4);border-radius:4px;padding:10px;margin-bottom:15px}.simple_form .warning a,.table-form .warning a{color:#fff;text-decoration:underline}.simple_form .warning a:hover,.simple_form .warning a:focus,.simple_form .warning a:active,.table-form .warning a:hover,.table-form .warning a:focus,.table-form .warning a:active{text-decoration:none}.simple_form .warning strong,.table-form .warning strong{font-weight:600;display:block;margin-bottom:5px}.simple_form .warning strong:lang(ja),.table-form .warning strong:lang(ja){font-weight:700}.simple_form .warning strong:lang(ko),.table-form .warning strong:lang(ko){font-weight:700}.simple_form .warning strong:lang(zh-CN),.table-form .warning strong:lang(zh-CN){font-weight:700}.simple_form .warning strong:lang(zh-HK),.table-form .warning strong:lang(zh-HK){font-weight:700}.simple_form .warning strong:lang(zh-TW),.table-form .warning strong:lang(zh-TW){font-weight:700}.simple_form .warning strong .fa,.table-form .warning strong .fa{font-weight:400}.action-pagination{display:flex;flex-wrap:wrap;align-items:center}.action-pagination .actions,.action-pagination .pagination{flex:1 1 auto}.action-pagination .actions{padding:30px 0;padding-right:20px;flex:0 0 auto}.post-follow-actions{text-align:center;color:#9baec8}.post-follow-actions div{margin-bottom:4px}.alternative-login{margin-top:20px;margin-bottom:20px}.alternative-login h4{font-size:16px;color:#fff;text-align:center;margin-bottom:20px;border:0;padding:0}.alternative-login .button{display:block}.scope-danger{color:#ff5050}.form_admin_settings_site_short_description textarea,.form_admin_settings_site_description textarea,.form_admin_settings_site_extended_description textarea,.form_admin_settings_site_terms textarea,.form_admin_settings_custom_css textarea,.form_admin_settings_closed_registrations_message textarea{font-family:\"mastodon-font-monospace\",monospace}.input-copy{background:#010102;border:1px solid #000;border-radius:4px;display:flex;align-items:center;padding-right:4px;position:relative;top:1px;transition:border-color 300ms linear}.input-copy__wrapper{flex:1 1 auto}.input-copy input[type=text]{background:transparent;border:0;padding:10px;font-size:14px;font-family:\"mastodon-font-monospace\",monospace}.input-copy button{flex:0 0 auto;margin:4px;text-transform:none;font-weight:400;font-size:14px;padding:7px 18px;padding-bottom:6px;width:auto;transition:background 300ms linear}.input-copy.copied{border-color:#79bd9a;transition:none}.input-copy.copied button{background:#79bd9a;transition:none}.connection-prompt{margin-bottom:25px}.connection-prompt .fa-link{background-color:#0b1016;border-radius:100%;font-size:24px;padding:10px}.connection-prompt__column{align-items:center;display:flex;flex:1;flex-direction:column;flex-shrink:1;max-width:50%}.connection-prompt__column-sep{align-self:center;flex-grow:0;overflow:visible;position:relative;z-index:1}.connection-prompt__column p{word-break:break-word}.connection-prompt .account__avatar{margin-bottom:20px}.connection-prompt__connection{background-color:#202e3f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;padding:25px 10px;position:relative;text-align:center}.connection-prompt__connection::after{background-color:#0b1016;content:\"\";display:block;height:100%;left:50%;position:absolute;top:0;width:1px}.connection-prompt__row{align-items:flex-start;display:flex;flex-direction:row}.card>a{display:block;text-decoration:none;color:inherit;box-shadow:0 0 15px rgba(0,0,0,.2)}@media screen and (max-width: 415px){.card>a{box-shadow:none}}.card>a:hover .card__bar,.card>a:active .card__bar,.card>a:focus .card__bar{background:#202e3f}.card__img{height:130px;position:relative;background:#000;border-radius:4px 4px 0 0}.card__img img{display:block;width:100%;height:100%;margin:0;object-fit:cover;border-radius:4px 4px 0 0}@media screen and (max-width: 600px){.card__img{height:200px}}@media screen and (max-width: 415px){.card__img{display:none}}.card__bar{position:relative;padding:15px;display:flex;justify-content:flex-start;align-items:center;background:#192432;border-radius:0 0 4px 4px}@media screen and (max-width: 415px){.card__bar{border-radius:0}}.card__bar .avatar{flex:0 0 auto;width:48px;height:48px;padding-top:2px}.card__bar .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px;background:#040609;object-fit:cover}.card__bar .display-name{margin-left:15px;text-align:left}.card__bar .display-name strong{font-size:15px;color:#fff;font-weight:500;overflow:hidden;text-overflow:ellipsis}.card__bar .display-name span{display:block;font-size:14px;color:#9baec8;font-weight:400;overflow:hidden;text-overflow:ellipsis}.pagination{padding:30px 0;text-align:center;overflow:hidden}.pagination a,.pagination .current,.pagination .newer,.pagination .older,.pagination .page,.pagination .gap{font-size:14px;color:#fff;font-weight:500;display:inline-block;padding:6px 10px;text-decoration:none}.pagination .current{background:#fff;border-radius:100px;color:#121a24;cursor:default;margin:0 10px}.pagination .gap{cursor:default}.pagination .older,.pagination .newer{color:#d9e1e8}.pagination .older{float:left;padding-left:0}.pagination .older .fa{display:inline-block;margin-right:5px}.pagination .newer{float:right;padding-right:0}.pagination .newer .fa{display:inline-block;margin-left:5px}.pagination .disabled{cursor:default;color:#233346}@media screen and (max-width: 700px){.pagination{padding:30px 20px}.pagination .page{display:none}.pagination .newer,.pagination .older{display:inline-block}}.nothing-here{background:#121a24;box-shadow:0 0 15px rgba(0,0,0,.2);color:#9baec8;font-size:14px;font-weight:500;text-align:center;display:flex;justify-content:center;align-items:center;cursor:default;border-radius:4px;padding:20px;min-height:30vh}.nothing-here--under-tabs{border-radius:0 0 4px 4px}.nothing-here--flexible{box-sizing:border-box;min-height:100%}.account-role,.simple_form .recommended{display:inline-block;padding:4px 6px;cursor:default;border-radius:3px;font-size:12px;line-height:12px;font-weight:500;color:#d9e1e8;background-color:rgba(217,225,232,.1);border:1px solid rgba(217,225,232,.5)}.account-role.moderator,.simple_form .recommended.moderator{color:#79bd9a;background-color:rgba(121,189,154,.1);border-color:rgba(121,189,154,.5)}.account-role.admin,.simple_form .recommended.admin{color:#e87487;background-color:rgba(232,116,135,.1);border-color:rgba(232,116,135,.5)}.account__header__fields{max-width:100vw;padding:0;margin:15px -15px -15px;border:0 none;border-top:1px solid #26374d;border-bottom:1px solid #26374d;font-size:14px;line-height:20px}.account__header__fields dl{display:flex;border-bottom:1px solid #26374d}.account__header__fields dt,.account__header__fields dd{box-sizing:border-box;padding:14px;text-align:center;max-height:48px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.account__header__fields dt{font-weight:500;width:120px;flex:0 0 auto;color:#d9e1e8;background:rgba(4,6,9,.5)}.account__header__fields dd{flex:1 1 auto;color:#9baec8}.account__header__fields a{color:#d8a070;text-decoration:none}.account__header__fields a:hover,.account__header__fields a:focus,.account__header__fields a:active{text-decoration:underline}.account__header__fields .verified{border:1px solid rgba(121,189,154,.5);background:rgba(121,189,154,.25)}.account__header__fields .verified a{color:#79bd9a;font-weight:500}.account__header__fields .verified__mark{color:#79bd9a}.account__header__fields dl:last-child{border-bottom:0}.directory__tag .trends__item__current{width:auto}.pending-account__header{color:#9baec8}.pending-account__header a{color:#d9e1e8;text-decoration:none}.pending-account__header a:hover,.pending-account__header a:active,.pending-account__header a:focus{text-decoration:underline}.pending-account__header strong{color:#fff;font-weight:700}.pending-account__body{margin-top:10px}.activity-stream{box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;overflow:hidden;margin-bottom:10px}.activity-stream--under-tabs{border-radius:0 0 4px 4px}@media screen and (max-width: 415px){.activity-stream{margin-bottom:0;border-radius:0;box-shadow:none}}.activity-stream--headless{border-radius:0;margin:0;box-shadow:none}.activity-stream--headless .detailed-status,.activity-stream--headless .status{border-radius:0 !important}.activity-stream div[data-component]{width:100%}.activity-stream .entry{background:#121a24}.activity-stream .entry .detailed-status,.activity-stream .entry .status,.activity-stream .entry .load-more{animation:none}.activity-stream .entry:last-child .detailed-status,.activity-stream .entry:last-child .status,.activity-stream .entry:last-child .load-more{border-bottom:0;border-radius:0 0 4px 4px}.activity-stream .entry:first-child .detailed-status,.activity-stream .entry:first-child .status,.activity-stream .entry:first-child .load-more{border-radius:4px 4px 0 0}.activity-stream .entry:first-child:last-child .detailed-status,.activity-stream .entry:first-child:last-child .status,.activity-stream .entry:first-child:last-child .load-more{border-radius:4px}@media screen and (max-width: 740px){.activity-stream .entry .detailed-status,.activity-stream .entry .status,.activity-stream .entry .load-more{border-radius:0 !important}}.activity-stream--highlighted .entry{background:#202e3f}.button.logo-button{flex:0 auto;font-size:14px;background:#d8a070;color:#fff;text-transform:none;line-height:36px;height:auto;padding:3px 15px;border:0}.button.logo-button svg{width:20px;height:auto;vertical-align:middle;margin-right:5px;fill:#fff}.button.logo-button:active,.button.logo-button:focus,.button.logo-button:hover{background:#e3bb98}.button.logo-button:disabled:active,.button.logo-button:disabled:focus,.button.logo-button:disabled:hover,.button.logo-button.disabled:active,.button.logo-button.disabled:focus,.button.logo-button.disabled:hover{background:#9baec8}.button.logo-button.button--destructive:active,.button.logo-button.button--destructive:focus,.button.logo-button.button--destructive:hover{background:#df405a}@media screen and (max-width: 415px){.button.logo-button svg{display:none}}.embed .detailed-status,.public-layout .detailed-status{padding:15px}.embed .status,.public-layout .status{padding:15px 15px 15px 78px;min-height:50px}.embed .status__avatar,.public-layout .status__avatar{left:15px;top:17px}.embed .status__content,.public-layout .status__content{padding-top:5px}.embed .status__prepend,.public-layout .status__prepend{margin-left:78px;padding-top:15px}.embed .status__prepend-icon-wrapper,.public-layout .status__prepend-icon-wrapper{left:-32px}.embed .status .media-gallery,.embed .status__action-bar,.embed .status .video-player,.public-layout .status .media-gallery,.public-layout .status__action-bar,.public-layout .status .video-player{margin-top:10px}button.icon-button i.fa-retweet{background-image:url(\"data:image/svg+xml;utf8,\")}button.icon-button i.fa-retweet:hover{background-image:url(\"data:image/svg+xml;utf8,\")}button.icon-button.disabled i.fa-retweet{background-image:url(\"data:image/svg+xml;utf8,\")}.app-body{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.link-button{display:block;font-size:15px;line-height:20px;color:#d8a070;border:0;background:transparent;padding:0;cursor:pointer}.link-button:hover,.link-button:active{text-decoration:underline}.link-button:disabled{color:#9baec8;cursor:default}.button{background-color:#d8a070;border:10px none;border-radius:4px;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-family:inherit;font-size:15px;font-weight:500;height:36px;letter-spacing:0;line-height:36px;overflow:hidden;padding:0 16px;position:relative;text-align:center;text-decoration:none;text-overflow:ellipsis;transition:all 100ms ease-in;white-space:nowrap;width:auto}.button:active,.button:focus,.button:hover{background-color:#e3bb98;transition:all 200ms ease-out}.button--destructive{transition:none}.button--destructive:active,.button--destructive:focus,.button--destructive:hover{background-color:#df405a;transition:none}.button:disabled,.button.disabled{background-color:#9baec8;cursor:default}.button::-moz-focus-inner{border:0}.button::-moz-focus-inner,.button:focus,.button:active{outline:0 !important}.button.button-primary,.button.button-alternative,.button.button-secondary,.button.button-alternative-2{font-size:16px;line-height:36px;height:auto;text-transform:none;padding:4px 16px}.button.button-alternative{color:#121a24;background:#9baec8}.button.button-alternative:active,.button.button-alternative:focus,.button.button-alternative:hover{background-color:#a8b9cf}.button.button-alternative-2{background:#3e5a7c}.button.button-alternative-2:active,.button.button-alternative-2:focus,.button.button-alternative-2:hover{background-color:#45648a}.button.button-secondary{color:#9baec8;background:transparent;padding:3px 15px;border:1px solid #9baec8}.button.button-secondary:active,.button.button-secondary:focus,.button.button-secondary:hover{border-color:#a8b9cf;color:#a8b9cf}.button.button-secondary:disabled{opacity:.5}.button.button--block{display:block;width:100%}.column__wrapper{display:flex;flex:1 1 auto;position:relative}.icon-button{display:inline-block;padding:0;color:#3e5a7c;border:0;border-radius:4px;background:transparent;cursor:pointer;transition:all 100ms ease-in;transition-property:background-color,color}.icon-button:hover,.icon-button:active,.icon-button:focus{color:#4a6b94;background-color:rgba(62,90,124,.15);transition:all 200ms ease-out;transition-property:background-color,color}.icon-button:focus{background-color:rgba(62,90,124,.3)}.icon-button.disabled{color:#283a50;background-color:transparent;cursor:default}.icon-button.active{color:#d8a070}.icon-button::-moz-focus-inner{border:0}.icon-button::-moz-focus-inner,.icon-button:focus,.icon-button:active{outline:0 !important}.icon-button.inverted{color:#3e5a7c}.icon-button.inverted:hover,.icon-button.inverted:active,.icon-button.inverted:focus{color:#324965;background-color:rgba(62,90,124,.15)}.icon-button.inverted:focus{background-color:rgba(62,90,124,.3)}.icon-button.inverted.disabled{color:#4a6b94;background-color:transparent}.icon-button.inverted.active{color:#d8a070}.icon-button.inverted.active.disabled{color:#e6c3a4}.icon-button.overlayed{box-sizing:content-box;background:rgba(0,0,0,.6);color:rgba(255,255,255,.7);border-radius:4px;padding:2px}.icon-button.overlayed:hover{background:rgba(0,0,0,.9)}.text-icon-button{color:#3e5a7c;border:0;border-radius:4px;background:transparent;cursor:pointer;font-weight:600;font-size:11px;padding:0 3px;line-height:27px;outline:0;transition:all 100ms ease-in;transition-property:background-color,color}.text-icon-button:hover,.text-icon-button:active,.text-icon-button:focus{color:#324965;background-color:rgba(62,90,124,.15);transition:all 200ms ease-out;transition-property:background-color,color}.text-icon-button:focus{background-color:rgba(62,90,124,.3)}.text-icon-button.disabled{color:#6b8cb5;background-color:transparent;cursor:default}.text-icon-button.active{color:#d8a070}.text-icon-button::-moz-focus-inner{border:0}.text-icon-button::-moz-focus-inner,.text-icon-button:focus,.text-icon-button:active{outline:0 !important}.dropdown-menu{position:absolute}.invisible{font-size:0;line-height:0;display:inline-block;width:0;height:0;position:absolute}.invisible img,.invisible svg{margin:0 !important;border:0 !important;padding:0 !important;width:0 !important;height:0 !important}.ellipsis::after{content:\"…\"}.compose-form{padding:10px}.compose-form__sensitive-button{padding:10px;padding-top:0;font-size:14px;font-weight:500}.compose-form__sensitive-button.active{color:#d8a070}.compose-form__sensitive-button input[type=checkbox]{display:none}.compose-form__sensitive-button .checkbox{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:4px;vertical-align:middle}.compose-form__sensitive-button .checkbox.active{border-color:#d8a070;background:#d8a070}.compose-form .compose-form__warning{color:#121a24;margin-bottom:10px;background:#9baec8;box-shadow:0 2px 6px rgba(0,0,0,.3);padding:8px 10px;border-radius:4px;font-size:13px;font-weight:400}.compose-form .compose-form__warning strong{color:#121a24;font-weight:500}.compose-form .compose-form__warning strong:lang(ja){font-weight:700}.compose-form .compose-form__warning strong:lang(ko){font-weight:700}.compose-form .compose-form__warning strong:lang(zh-CN){font-weight:700}.compose-form .compose-form__warning strong:lang(zh-HK){font-weight:700}.compose-form .compose-form__warning strong:lang(zh-TW){font-weight:700}.compose-form .compose-form__warning a{color:#3e5a7c;font-weight:500;text-decoration:underline}.compose-form .compose-form__warning a:hover,.compose-form .compose-form__warning a:active,.compose-form .compose-form__warning a:focus{text-decoration:none}.compose-form .emoji-picker-dropdown{position:absolute;top:5px;right:5px}.compose-form .compose-form__autosuggest-wrapper{position:relative}.compose-form .autosuggest-textarea,.compose-form .autosuggest-input,.compose-form .spoiler-input{position:relative;width:100%}.compose-form .spoiler-input{height:0;transform-origin:bottom;opacity:0}.compose-form .spoiler-input.spoiler-input--visible{height:36px;margin-bottom:11px;opacity:1}.compose-form .autosuggest-textarea__textarea,.compose-form .spoiler-input__input{display:block;box-sizing:border-box;width:100%;margin:0;color:#121a24;background:#fff;padding:10px;font-family:inherit;font-size:14px;resize:vertical;border:0;outline:0}.compose-form .autosuggest-textarea__textarea::placeholder,.compose-form .spoiler-input__input::placeholder{color:#3e5a7c}.compose-form .autosuggest-textarea__textarea:focus,.compose-form .spoiler-input__input:focus{outline:0}@media screen and (max-width: 600px){.compose-form .autosuggest-textarea__textarea,.compose-form .spoiler-input__input{font-size:16px}}.compose-form .spoiler-input__input{border-radius:4px}.compose-form .autosuggest-textarea__textarea{min-height:100px;border-radius:4px 4px 0 0;padding-bottom:0;padding-right:32px;resize:none;scrollbar-color:initial}.compose-form .autosuggest-textarea__textarea::-webkit-scrollbar{all:unset}@media screen and (max-width: 600px){.compose-form .autosuggest-textarea__textarea{height:100px !important;resize:vertical}}.compose-form .autosuggest-textarea__suggestions-wrapper{position:relative;height:0}.compose-form .autosuggest-textarea__suggestions{box-sizing:border-box;display:none;position:absolute;top:100%;width:100%;z-index:99;box-shadow:4px 4px 6px rgba(0,0,0,.4);background:#d9e1e8;border-radius:0 0 4px 4px;color:#121a24;font-size:14px;padding:6px}.compose-form .autosuggest-textarea__suggestions.autosuggest-textarea__suggestions--visible{display:block}.compose-form .autosuggest-textarea__suggestions__item{padding:10px;cursor:pointer;border-radius:4px}.compose-form .autosuggest-textarea__suggestions__item:hover,.compose-form .autosuggest-textarea__suggestions__item:focus,.compose-form .autosuggest-textarea__suggestions__item:active,.compose-form .autosuggest-textarea__suggestions__item.selected{background:#b9c8d5}.compose-form .autosuggest-account,.compose-form .autosuggest-emoji,.compose-form .autosuggest-hashtag{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;line-height:18px;font-size:14px}.compose-form .autosuggest-hashtag{justify-content:space-between}.compose-form .autosuggest-hashtag__name{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.compose-form .autosuggest-hashtag strong{font-weight:500}.compose-form .autosuggest-hashtag__uses{flex:0 0 auto;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.compose-form .autosuggest-account-icon,.compose-form .autosuggest-emoji img{display:block;margin-right:8px;width:16px;height:16px}.compose-form .autosuggest-account .display-name__account{color:#3e5a7c}.compose-form .compose-form__modifiers{color:#121a24;font-family:inherit;font-size:14px;background:#fff}.compose-form .compose-form__modifiers .compose-form__upload-wrapper{overflow:hidden}.compose-form .compose-form__modifiers .compose-form__uploads-wrapper{display:flex;flex-direction:row;padding:5px;flex-wrap:wrap}.compose-form .compose-form__modifiers .compose-form__upload{flex:1 1 0;min-width:40%;margin:5px}.compose-form .compose-form__modifiers .compose-form__upload__actions{background:linear-gradient(180deg, rgba(0, 0, 0, 0.8) 0, rgba(0, 0, 0, 0.35) 80%, transparent);display:flex;align-items:flex-start;justify-content:space-between;opacity:0;transition:opacity .1s ease}.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button{flex:0 1 auto;color:#d9e1e8;font-size:14px;font-weight:500;padding:10px;font-family:inherit}.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button:hover,.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button:focus,.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button:active{color:#eff3f5}.compose-form .compose-form__modifiers .compose-form__upload__actions.active{opacity:1}.compose-form .compose-form__modifiers .compose-form__upload-description{position:absolute;z-index:2;bottom:0;left:0;right:0;box-sizing:border-box;background:linear-gradient(0deg, rgba(0, 0, 0, 0.8) 0, rgba(0, 0, 0, 0.35) 80%, transparent);padding:10px;opacity:0;transition:opacity .1s ease}.compose-form .compose-form__modifiers .compose-form__upload-description textarea{background:transparent;color:#d9e1e8;border:0;padding:0;margin:0;width:100%;font-family:inherit;font-size:14px;font-weight:500}.compose-form .compose-form__modifiers .compose-form__upload-description textarea:focus{color:#fff}.compose-form .compose-form__modifiers .compose-form__upload-description textarea::placeholder{opacity:.75;color:#d9e1e8}.compose-form .compose-form__modifiers .compose-form__upload-description.active{opacity:1}.compose-form .compose-form__modifiers .compose-form__upload-thumbnail{border-radius:4px;background-color:#000;background-position:center;background-size:cover;background-repeat:no-repeat;height:140px;width:100%;overflow:hidden}.compose-form .compose-form__buttons-wrapper{padding:10px;background:#ebebeb;border-radius:0 0 4px 4px;display:flex;justify-content:space-between;flex:0 0 auto}.compose-form .compose-form__buttons-wrapper .compose-form__buttons{display:flex}.compose-form .compose-form__buttons-wrapper .compose-form__buttons .compose-form__upload-button-icon{line-height:27px}.compose-form .compose-form__buttons-wrapper .compose-form__buttons .compose-form__sensitive-button{display:none}.compose-form .compose-form__buttons-wrapper .compose-form__buttons .compose-form__sensitive-button.compose-form__sensitive-button--visible{display:block}.compose-form .compose-form__buttons-wrapper .compose-form__buttons .compose-form__sensitive-button .compose-form__sensitive-button__icon{line-height:27px}.compose-form .compose-form__buttons-wrapper .icon-button,.compose-form .compose-form__buttons-wrapper .text-icon-button{box-sizing:content-box;padding:0 3px}.compose-form .compose-form__buttons-wrapper .character-counter__wrapper{align-self:center;margin-right:4px}.compose-form .compose-form__publish{display:flex;justify-content:flex-end;min-width:0;flex:0 0 auto}.compose-form .compose-form__publish .compose-form__publish-button-wrapper{overflow:hidden;padding-top:10px}.character-counter{cursor:default;font-family:\"mastodon-font-sans-serif\",sans-serif;font-size:14px;font-weight:600;color:#3e5a7c}.character-counter.character-counter--over{color:#ff5050}.no-reduce-motion .spoiler-input{transition:height .4s ease,opacity .4s ease}.emojione{font-size:inherit;vertical-align:middle;object-fit:contain;margin:-0.2ex .15em .2ex;width:16px;height:16px}.emojione img{width:auto}.reply-indicator{border-radius:4px;margin-bottom:10px;background:#9baec8;padding:10px;min-height:23px;overflow-y:auto;flex:0 2 auto}.reply-indicator__header{margin-bottom:5px;overflow:hidden}.reply-indicator__cancel{float:right;line-height:24px}.reply-indicator__display-name{color:#121a24;display:block;max-width:100%;line-height:24px;overflow:hidden;padding-right:25px;text-decoration:none}.reply-indicator__display-avatar{float:left;margin-right:5px}.status__content--with-action{cursor:pointer}.status__content,.reply-indicator__content{position:relative;font-size:15px;line-height:20px;word-wrap:break-word;font-weight:400;overflow:hidden;text-overflow:ellipsis;padding-top:2px;color:#fff}.status__content:focus,.reply-indicator__content:focus{outline:0}.status__content.status__content--with-spoiler,.reply-indicator__content.status__content--with-spoiler{white-space:normal}.status__content.status__content--with-spoiler .status__content__text,.reply-indicator__content.status__content--with-spoiler .status__content__text{white-space:pre-wrap}.status__content .emojione,.reply-indicator__content .emojione{width:20px;height:20px;margin:-3px 0 0}.status__content img,.reply-indicator__content img{max-width:100%;max-height:400px;object-fit:contain}.status__content p,.reply-indicator__content p{margin-bottom:20px;white-space:pre-wrap}.status__content p:last-child,.reply-indicator__content p:last-child{margin-bottom:0}.status__content a,.reply-indicator__content a{color:#d8a070;text-decoration:none}.status__content a:hover,.reply-indicator__content a:hover{text-decoration:underline}.status__content a:hover .fa,.reply-indicator__content a:hover .fa{color:#4a6b94}.status__content a.mention:hover,.reply-indicator__content a.mention:hover{text-decoration:none}.status__content a.mention:hover span,.reply-indicator__content a.mention:hover span{text-decoration:underline}.status__content a .fa,.reply-indicator__content a .fa{color:#3e5a7c}.status__content a.unhandled-link,.reply-indicator__content a.unhandled-link{color:#e1b590}.status__content .status__content__spoiler-link,.reply-indicator__content .status__content__spoiler-link{background:#3e5a7c}.status__content .status__content__spoiler-link:hover,.reply-indicator__content .status__content__spoiler-link:hover{background:#4a6b94;text-decoration:none}.status__content .status__content__spoiler-link::-moz-focus-inner,.reply-indicator__content .status__content__spoiler-link::-moz-focus-inner{border:0}.status__content .status__content__spoiler-link::-moz-focus-inner,.status__content .status__content__spoiler-link:focus,.status__content .status__content__spoiler-link:active,.reply-indicator__content .status__content__spoiler-link::-moz-focus-inner,.reply-indicator__content .status__content__spoiler-link:focus,.reply-indicator__content .status__content__spoiler-link:active{outline:0 !important}.status__content .status__content__text,.reply-indicator__content .status__content__text{display:none}.status__content .status__content__text.status__content__text--visible,.reply-indicator__content .status__content__text.status__content__text--visible{display:block}.status__content.status__content--collapsed{max-height:300px}.status__content__read-more-button{display:block;font-size:15px;line-height:20px;color:#e1b590;border:0;background:transparent;padding:0;padding-top:8px}.status__content__read-more-button:hover,.status__content__read-more-button:active{text-decoration:underline}.status__content__spoiler-link{display:inline-block;border-radius:2px;background:transparent;border:0;color:#121a24;font-weight:700;font-size:12px;padding:0 6px;line-height:20px;cursor:pointer;vertical-align:middle}.status__wrapper--filtered{color:#3e5a7c;border:0;font-size:inherit;text-align:center;line-height:inherit;margin:0;padding:15px;box-sizing:border-box;width:100%;clear:both;border-bottom:1px solid #202e3f}.status__prepend-icon-wrapper{left:-26px;position:absolute}.focusable:focus{outline:0;background:#192432}.focusable:focus .status.status-direct{background:#26374d}.focusable:focus .status.status-direct.muted{background:transparent}.focusable:focus .detailed-status,.focusable:focus .detailed-status__action-bar{background:#202e3f}.status{padding:8px 10px;padding-left:68px;position:relative;min-height:54px;border-bottom:1px solid #202e3f;cursor:default;opacity:1;animation:fade 150ms linear}@supports(-ms-overflow-style: -ms-autohiding-scrollbar){.status{padding-right:26px}}@keyframes fade{0%{opacity:0}100%{opacity:1}}.status .video-player,.status .audio-player{margin-top:8px}.status.status-direct:not(.read){background:#202e3f;border-bottom-color:#26374d}.status.light .status__relative-time{color:#9baec8}.status.light .status__display-name{color:#121a24}.status.light .display-name strong{color:#121a24}.status.light .display-name span{color:#9baec8}.status.light .status__content{color:#121a24}.status.light .status__content a{color:#d8a070}.status.light .status__content a.status__content__spoiler-link{color:#fff;background:#9baec8}.status.light .status__content a.status__content__spoiler-link:hover{background:#b5c3d6}.notification-favourite .status.status-direct{background:transparent}.notification-favourite .status.status-direct .icon-button.disabled{color:#547aa9}.status__relative-time,.notification__relative_time{color:#3e5a7c;float:right;font-size:14px}.status__display-name{color:#3e5a7c}.status__info .status__display-name{display:block;max-width:100%;padding-right:25px}.status__info{font-size:15px}.status-check-box{border-bottom:1px solid #d9e1e8;display:flex}.status-check-box .status-check-box__status{margin:10px 0 10px 10px;flex:1}.status-check-box .status-check-box__status .media-gallery{max-width:250px}.status-check-box .status-check-box__status .status__content{padding:0;white-space:normal}.status-check-box .status-check-box__status .video-player,.status-check-box .status-check-box__status .audio-player{margin-top:8px;max-width:250px}.status-check-box .status-check-box__status .media-gallery__item-thumbnail{cursor:default}.status-check-box-toggle{align-items:center;display:flex;flex:0 0 auto;justify-content:center;padding:10px}.status__prepend{margin-left:68px;color:#3e5a7c;padding:8px 0;padding-bottom:2px;font-size:14px;position:relative}.status__prepend .status__display-name strong{color:#3e5a7c}.status__prepend>span{display:block;overflow:hidden;text-overflow:ellipsis}.status__action-bar{align-items:center;display:flex;margin-top:8px}.status__action-bar__counter{display:inline-flex;margin-right:11px;align-items:center}.status__action-bar__counter .status__action-bar-button{margin-right:4px}.status__action-bar__counter__label{display:inline-block;width:14px;font-size:12px;font-weight:500;color:#3e5a7c}.status__action-bar-button{margin-right:18px}.status__action-bar-dropdown{height:23.15px;width:23.15px}.detailed-status__action-bar-dropdown{flex:1 1 auto;display:flex;align-items:center;justify-content:center;position:relative}.detailed-status{background:#192432;padding:14px 10px}.detailed-status--flex{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-start}.detailed-status--flex .status__content,.detailed-status--flex .detailed-status__meta{flex:100%}.detailed-status .status__content{font-size:19px;line-height:24px}.detailed-status .status__content .emojione{width:24px;height:24px;margin:-1px 0 0}.detailed-status .status__content .status__content__spoiler-link{line-height:24px;margin:-1px 0 0}.detailed-status .video-player,.detailed-status .audio-player{margin-top:8px}.detailed-status__meta{margin-top:15px;color:#3e5a7c;font-size:14px;line-height:18px}.detailed-status__action-bar{background:#192432;border-top:1px solid #202e3f;border-bottom:1px solid #202e3f;display:flex;flex-direction:row;padding:10px 0}.detailed-status__link{color:inherit;text-decoration:none}.detailed-status__favorites,.detailed-status__reblogs{display:inline-block;font-weight:500;font-size:12px;margin-left:6px}.reply-indicator__content{color:#121a24;font-size:14px}.reply-indicator__content a{color:#3e5a7c}.domain{padding:10px;border-bottom:1px solid #202e3f}.domain .domain__domain-name{flex:1 1 auto;display:block;color:#fff;text-decoration:none;font-size:14px;font-weight:500}.domain__wrapper{display:flex}.domain_buttons{height:18px;padding:10px;white-space:nowrap}.account{padding:10px;border-bottom:1px solid #202e3f}.account.compact{padding:0;border-bottom:0}.account.compact .account__avatar-wrapper{margin-left:0}.account .account__display-name{flex:1 1 auto;display:block;color:#9baec8;overflow:hidden;text-decoration:none;font-size:14px}.account__wrapper{display:flex}.account__avatar-wrapper{float:left;margin-left:12px;margin-right:12px}.account__avatar{border-radius:4px;background:transparent no-repeat;background-position:50%;background-clip:padding-box;position:relative}.account__avatar-inline{display:inline-block;vertical-align:middle;margin-right:5px}.account__avatar-composite{border-radius:4px;background:transparent no-repeat;background-position:50%;background-clip:padding-box;border-radius:50%;overflow:hidden;position:relative;cursor:default}.account__avatar-composite>div{float:left;position:relative;box-sizing:border-box}.account__avatar-composite__label{display:block;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);color:#fff;text-shadow:1px 1px 2px #000;font-weight:700;font-size:15px}a .account__avatar{cursor:pointer}.account__avatar-overlay{width:48px;height:48px;background-size:48px 48px}.account__avatar-overlay-base{border-radius:4px;background:transparent no-repeat;background-position:50%;background-clip:padding-box;width:36px;height:36px;background-size:36px 36px}.account__avatar-overlay-overlay{border-radius:4px;background:transparent no-repeat;background-position:50%;background-clip:padding-box;width:24px;height:24px;background-size:24px 24px;position:absolute;bottom:0;right:0;z-index:1}.account__relationship{height:18px;padding:10px;white-space:nowrap}.account__disclaimer{padding:10px;border-top:1px solid #202e3f;color:#3e5a7c}.account__disclaimer strong{font-weight:500}.account__disclaimer strong:lang(ja){font-weight:700}.account__disclaimer strong:lang(ko){font-weight:700}.account__disclaimer strong:lang(zh-CN){font-weight:700}.account__disclaimer strong:lang(zh-HK){font-weight:700}.account__disclaimer strong:lang(zh-TW){font-weight:700}.account__disclaimer a{font-weight:500;color:inherit;text-decoration:underline}.account__disclaimer a:hover,.account__disclaimer a:focus,.account__disclaimer a:active{text-decoration:none}.account__action-bar{border-top:1px solid #202e3f;border-bottom:1px solid #202e3f;line-height:36px;overflow:hidden;flex:0 0 auto;display:flex}.account__action-bar-dropdown{padding:10px}.account__action-bar-dropdown .icon-button{vertical-align:middle}.account__action-bar-dropdown .dropdown--active .dropdown__content.dropdown__right{left:6px;right:initial}.account__action-bar-dropdown .dropdown--active::after{bottom:initial;margin-left:11px;margin-top:-7px;right:initial}.account__action-bar-links{display:flex;flex:1 1 auto;line-height:18px;text-align:center}.account__action-bar__tab{text-decoration:none;overflow:hidden;flex:0 1 100%;border-right:1px solid #202e3f;padding:10px 0;border-bottom:4px solid transparent}.account__action-bar__tab.active{border-bottom:4px solid #d8a070}.account__action-bar__tab>span{display:block;font-size:12px;color:#9baec8}.account__action-bar__tab strong{display:block;font-size:15px;font-weight:500;color:#fff}.account__action-bar__tab strong:lang(ja){font-weight:700}.account__action-bar__tab strong:lang(ko){font-weight:700}.account__action-bar__tab strong:lang(zh-CN){font-weight:700}.account__action-bar__tab strong:lang(zh-HK){font-weight:700}.account__action-bar__tab strong:lang(zh-TW){font-weight:700}.account-authorize{padding:14px 10px}.account-authorize .detailed-status__display-name{display:block;margin-bottom:15px;overflow:hidden}.account-authorize__avatar{float:left;margin-right:10px}.status__display-name,.status__relative-time,.detailed-status__display-name,.detailed-status__datetime,.detailed-status__application,.account__display-name{text-decoration:none}.status__display-name strong,.account__display-name strong{color:#fff}.muted .emojione{opacity:.5}.status__display-name:hover strong,.reply-indicator__display-name:hover strong,.detailed-status__display-name:hover strong,a.account__display-name:hover strong{text-decoration:underline}.account__display-name strong{display:block;overflow:hidden;text-overflow:ellipsis}.detailed-status__application,.detailed-status__datetime{color:inherit}.detailed-status .button.logo-button{margin-bottom:15px}.detailed-status__display-name{color:#d9e1e8;display:block;line-height:24px;margin-bottom:15px;overflow:hidden}.detailed-status__display-name strong,.detailed-status__display-name span{display:block;text-overflow:ellipsis;overflow:hidden}.detailed-status__display-name strong{font-size:16px;color:#fff}.detailed-status__display-avatar{float:left;margin-right:10px}.status__avatar{height:48px;left:10px;position:absolute;top:10px;width:48px}.status__expand{width:68px;position:absolute;left:0;top:0;height:100%;cursor:pointer}.muted .status__content,.muted .status__content p,.muted .status__content a{color:#3e5a7c}.muted .status__display-name strong{color:#3e5a7c}.muted .status__avatar{opacity:.5}.muted a.status__content__spoiler-link{background:#3e5a7c;color:#121a24}.muted a.status__content__spoiler-link:hover{background:#4a6b94;text-decoration:none}.notification__message{margin:0 10px 0 68px;padding:8px 0 0;cursor:default;color:#9baec8;font-size:15px;line-height:22px;position:relative}.notification__message .fa{color:#d8a070}.notification__message>span{display:inline;overflow:hidden;text-overflow:ellipsis}.notification__favourite-icon-wrapper{left:-26px;position:absolute}.notification__favourite-icon-wrapper .star-icon{color:#ca8f04}.star-icon.active{color:#ca8f04}.bookmark-icon.active{color:#ff5050}.no-reduce-motion .icon-button.star-icon.activate>.fa-star{animation:spring-rotate-in 1s linear}.no-reduce-motion .icon-button.star-icon.deactivate>.fa-star{animation:spring-rotate-out 1s linear}.notification__display-name{color:inherit;font-weight:500;text-decoration:none}.notification__display-name:hover{color:#fff;text-decoration:underline}.notification__relative_time{float:right}.display-name{display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.display-name__html{font-weight:500}.display-name__account{font-size:14px}.status__relative-time:hover,.detailed-status__datetime:hover{text-decoration:underline}.image-loader{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center;flex-direction:column}.image-loader .image-loader__preview-canvas{max-width:100%;max-height:80%;background:url(\"~images/void.png\") repeat;object-fit:contain}.image-loader .loading-bar{position:relative}.image-loader.image-loader--amorphous .image-loader__preview-canvas{display:none}.zoomable-image{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center}.zoomable-image img{max-width:100%;max-height:80%;width:auto;height:auto;object-fit:contain}.navigation-bar{padding:10px;display:flex;align-items:center;flex-shrink:0;cursor:default;color:#9baec8}.navigation-bar strong{color:#d9e1e8}.navigation-bar a{color:inherit}.navigation-bar .permalink{text-decoration:none}.navigation-bar .navigation-bar__actions{position:relative}.navigation-bar .navigation-bar__actions .icon-button.close{position:absolute;pointer-events:none;transform:scale(0, 1) translate(-100%, 0);opacity:0}.navigation-bar .navigation-bar__actions .compose__action-bar .icon-button{pointer-events:auto;transform:scale(1, 1) translate(0, 0);opacity:1}.navigation-bar__profile{flex:1 1 auto;margin-left:8px;line-height:20px;margin-top:-1px;overflow:hidden}.navigation-bar__profile-account{display:block;font-weight:500;overflow:hidden;text-overflow:ellipsis}.navigation-bar__profile-edit{color:inherit;text-decoration:none}.dropdown{display:inline-block}.dropdown__content{display:none;position:absolute}.dropdown-menu__separator{border-bottom:1px solid #c0cdd9;margin:5px 7px 6px;height:0}.dropdown-menu{background:#d9e1e8;padding:4px 0;border-radius:4px;box-shadow:2px 4px 15px rgba(0,0,0,.4);z-index:9999}.dropdown-menu ul{list-style:none}.dropdown-menu.left{transform-origin:100% 50%}.dropdown-menu.top{transform-origin:50% 100%}.dropdown-menu.bottom{transform-origin:50% 0}.dropdown-menu.right{transform-origin:0 50%}.dropdown-menu__arrow{position:absolute;width:0;height:0;border:0 solid transparent}.dropdown-menu__arrow.left{right:-5px;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#d9e1e8}.dropdown-menu__arrow.top{bottom:-5px;margin-left:-7px;border-width:5px 7px 0;border-top-color:#d9e1e8}.dropdown-menu__arrow.bottom{top:-5px;margin-left:-7px;border-width:0 7px 5px;border-bottom-color:#d9e1e8}.dropdown-menu__arrow.right{left:-5px;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#d9e1e8}.dropdown-menu__item a{font-size:13px;line-height:18px;display:block;padding:4px 14px;box-sizing:border-box;text-decoration:none;background:#d9e1e8;color:#121a24;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown-menu__item a:focus,.dropdown-menu__item a:hover,.dropdown-menu__item a:active{background:#d8a070;color:#d9e1e8;outline:0}.dropdown--active .dropdown__content{display:block;line-height:18px;max-width:311px;right:0;text-align:left;z-index:9999}.dropdown--active .dropdown__content>ul{list-style:none;background:#d9e1e8;padding:4px 0;border-radius:4px;box-shadow:0 0 15px rgba(0,0,0,.4);min-width:140px;position:relative}.dropdown--active .dropdown__content.dropdown__right{right:0}.dropdown--active .dropdown__content.dropdown__left>ul{left:-98px}.dropdown--active .dropdown__content>ul>li>a{font-size:13px;line-height:18px;display:block;padding:4px 14px;box-sizing:border-box;text-decoration:none;background:#d9e1e8;color:#121a24;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown--active .dropdown__content>ul>li>a:focus{outline:0}.dropdown--active .dropdown__content>ul>li>a:hover{background:#d8a070;color:#d9e1e8}.dropdown__icon{vertical-align:middle}.columns-area{display:flex;flex:1 1 auto;flex-direction:row;justify-content:flex-start;overflow-x:auto;position:relative}.columns-area.unscrollable{overflow-x:hidden}.columns-area__panels{display:flex;justify-content:center;width:100%;height:100%;min-height:100vh}.columns-area__panels__pane{height:100%;overflow:hidden;pointer-events:none;display:flex;justify-content:flex-end;min-width:285px}.columns-area__panels__pane--start{justify-content:flex-start}.columns-area__panels__pane__inner{position:fixed;width:285px;pointer-events:auto;height:100%}.columns-area__panels__main{box-sizing:border-box;width:100%;max-width:600px;flex:0 0 auto;display:flex;flex-direction:column}@media screen and (min-width: 415px){.columns-area__panels__main{padding:0 10px}}.tabs-bar__wrapper{background:#040609;position:sticky;top:0;z-index:2;padding-top:0}@media screen and (min-width: 415px){.tabs-bar__wrapper{padding-top:10px}}.tabs-bar__wrapper .tabs-bar{margin-bottom:0}@media screen and (min-width: 415px){.tabs-bar__wrapper .tabs-bar{margin-bottom:10px}}.react-swipeable-view-container,.react-swipeable-view-container .columns-area,.react-swipeable-view-container .drawer,.react-swipeable-view-container .column{height:100%}.react-swipeable-view-container>*{display:flex;align-items:center;justify-content:center;height:100%}.column{width:350px;position:relative;box-sizing:border-box;display:flex;flex-direction:column}.column>.scrollable{background:#121a24;border-bottom-left-radius:2px;border-bottom-right-radius:2px}.ui{flex:0 0 auto;display:flex;flex-direction:column;width:100%;height:100%}.drawer{width:330px;box-sizing:border-box;display:flex;flex-direction:column;overflow-y:hidden}.drawer__tab{display:block;flex:1 1 auto;padding:15px 5px 13px;color:#9baec8;text-decoration:none;text-align:center;font-size:16px;border-bottom:2px solid transparent}.column,.drawer{flex:1 1 auto;overflow:hidden}@media screen and (min-width: 631px){.columns-area{padding:0}.column,.drawer{flex:0 0 auto;padding:10px;padding-left:5px;padding-right:5px}.column:first-child,.drawer:first-child{padding-left:10px}.column:last-child,.drawer:last-child{padding-right:10px}.columns-area>div .column,.columns-area>div .drawer{padding-left:5px;padding-right:5px}}.tabs-bar{box-sizing:border-box;display:flex;background:#202e3f;flex:0 0 auto;overflow-y:auto}.tabs-bar__link{display:block;flex:1 1 auto;padding:15px 10px;padding-bottom:13px;color:#fff;text-decoration:none;text-align:center;font-size:14px;font-weight:500;border-bottom:2px solid #202e3f;transition:all 50ms linear;transition-property:border-bottom,background,color}.tabs-bar__link .fa{font-weight:400;font-size:16px}@media screen and (min-width: 631px){.tabs-bar__link:hover,.tabs-bar__link:focus,.tabs-bar__link:active{background:#2a3c54;border-bottom-color:#2a3c54}}.tabs-bar__link.active{border-bottom:2px solid #d8a070;color:#d8a070}.tabs-bar__link span{margin-left:5px;display:none}@media screen and (min-width: 600px){.tabs-bar__link span{display:inline}}.columns-area--mobile{flex-direction:column;width:100%;height:100%;margin:0 auto}.columns-area--mobile .column,.columns-area--mobile .drawer{width:100%;height:100%;padding:0}.columns-area--mobile .directory__list{display:grid;grid-gap:10px;grid-template-columns:minmax(0, 50%) minmax(0, 50%)}@media screen and (max-width: 415px){.columns-area--mobile .directory__list{display:block}}.columns-area--mobile .directory__card{margin-bottom:0}.columns-area--mobile .filter-form{display:flex}.columns-area--mobile .autosuggest-textarea__textarea{font-size:16px}.columns-area--mobile .search__input{line-height:18px;font-size:16px;padding:15px;padding-right:30px}.columns-area--mobile .search__icon .fa{top:15px}.columns-area--mobile .scrollable{overflow:visible}@supports(display: grid){.columns-area--mobile .scrollable{contain:content}}@media screen and (min-width: 415px){.columns-area--mobile{padding:10px 0;padding-top:0}}@media screen and (min-width: 630px){.columns-area--mobile .detailed-status{padding:15px}.columns-area--mobile .detailed-status .media-gallery,.columns-area--mobile .detailed-status .video-player,.columns-area--mobile .detailed-status .audio-player{margin-top:15px}.columns-area--mobile .account__header__bar{padding:5px 10px}.columns-area--mobile .navigation-bar,.columns-area--mobile .compose-form{padding:15px}.columns-area--mobile .compose-form .compose-form__publish .compose-form__publish-button-wrapper{padding-top:15px}.columns-area--mobile .status{padding:15px 15px 15px 78px;min-height:50px}.columns-area--mobile .status__avatar{left:15px;top:17px}.columns-area--mobile .status__content{padding-top:5px}.columns-area--mobile .status__prepend{margin-left:78px;padding-top:15px}.columns-area--mobile .status__prepend-icon-wrapper{left:-32px}.columns-area--mobile .status .media-gallery,.columns-area--mobile .status__action-bar,.columns-area--mobile .status .video-player,.columns-area--mobile .status .audio-player{margin-top:10px}.columns-area--mobile .account{padding:15px 10px}.columns-area--mobile .account__header__bio{margin:0 -10px}.columns-area--mobile .notification__message{margin-left:78px;padding-top:15px}.columns-area--mobile .notification__favourite-icon-wrapper{left:-32px}.columns-area--mobile .notification .status{padding-top:8px}.columns-area--mobile .notification .account{padding-top:8px}.columns-area--mobile .notification .account__avatar-wrapper{margin-left:17px;margin-right:15px}}.floating-action-button{position:fixed;display:flex;justify-content:center;align-items:center;width:3.9375rem;height:3.9375rem;bottom:1.3125rem;right:1.3125rem;background:#d59864;color:#fff;border-radius:50%;font-size:21px;line-height:21px;text-decoration:none;box-shadow:2px 3px 9px rgba(0,0,0,.4)}.floating-action-button:hover,.floating-action-button:focus,.floating-action-button:active{background:#e0b38c}@media screen and (min-width: 415px){.tabs-bar{width:100%}.react-swipeable-view-container .columns-area--mobile{height:calc(100% - 10px) !important}.getting-started__wrapper,.getting-started__trends,.search{margin-bottom:10px}.getting-started__panel{margin:10px 0}.column,.drawer{min-width:330px}}@media screen and (max-width: 895px){.columns-area__panels__pane--compositional{display:none}}@media screen and (min-width: 895px){.floating-action-button,.tabs-bar__link.optional{display:none}.search-page .search{display:none}}@media screen and (max-width: 1190px){.columns-area__panels__pane--navigational{display:none}}@media screen and (min-width: 1190px){.tabs-bar{display:none}}.icon-with-badge{position:relative}.icon-with-badge__badge{position:absolute;left:9px;top:-13px;background:#d8a070;border:2px solid #202e3f;padding:1px 6px;border-radius:6px;font-size:10px;font-weight:500;line-height:14px;color:#fff}.column-link--transparent .icon-with-badge__badge{border-color:#040609}.compose-panel{width:285px;margin-top:10px;display:flex;flex-direction:column;height:calc(100% - 10px);overflow-y:hidden}.compose-panel .navigation-bar{padding-top:20px;padding-bottom:20px;flex:0 1 48px;min-height:20px}.compose-panel .flex-spacer{background:transparent}.compose-panel .compose-form{flex:1;overflow-y:hidden;display:flex;flex-direction:column;min-height:310px;padding-bottom:71px;margin-bottom:-71px}.compose-panel .compose-form__autosuggest-wrapper{overflow-y:auto;background-color:#fff;border-radius:4px 4px 0 0;flex:0 1 auto}.compose-panel .autosuggest-textarea__textarea{overflow-y:hidden}.compose-panel .compose-form__upload-thumbnail{height:80px}.navigation-panel{margin-top:10px;margin-bottom:10px;height:calc(100% - 20px);overflow-y:auto;display:flex;flex-direction:column}.navigation-panel>a{flex:0 0 auto}.navigation-panel hr{flex:0 0 auto;border:0;background:transparent;border-top:1px solid #192432;margin:10px 0}.navigation-panel .flex-spacer{background:transparent}.drawer__pager{box-sizing:border-box;padding:0;flex-grow:1;position:relative;overflow:hidden;display:flex}.drawer__inner{position:absolute;top:0;left:0;background:#283a50;box-sizing:border-box;padding:0;display:flex;flex-direction:column;overflow:hidden;overflow-y:auto;width:100%;height:100%;border-radius:2px}.drawer__inner.darker{background:#121a24}.drawer__inner__mastodon{background:#283a50 url('data:image/svg+xml;utf8,') no-repeat bottom/100% auto;flex:1;min-height:47px;display:none}.drawer__inner__mastodon>img{display:block;object-fit:contain;object-position:bottom left;width:100%;height:100%;pointer-events:none;user-drag:none;user-select:none}@media screen and (min-height: 640px){.drawer__inner__mastodon{display:block}}.pseudo-drawer{background:#283a50;font-size:13px;text-align:left}.drawer__header{flex:0 0 auto;font-size:16px;background:#202e3f;margin-bottom:10px;display:flex;flex-direction:row;border-radius:2px}.drawer__header a{transition:background 100ms ease-in}.drawer__header a:hover{background:#17212e;transition:background 200ms ease-out}.scrollable{overflow-y:scroll;overflow-x:hidden;flex:1 1 auto;-webkit-overflow-scrolling:touch}.scrollable.optionally-scrollable{overflow-y:auto}@supports(display: grid){.scrollable{contain:strict}}.scrollable--flex{display:flex;flex-direction:column}.scrollable__append{flex:1 1 auto;position:relative;min-height:120px}@supports(display: grid){.scrollable.fullscreen{contain:none}}.column-back-button{box-sizing:border-box;width:100%;background:#192432;color:#d8a070;cursor:pointer;flex:0 0 auto;font-size:16px;line-height:inherit;border:0;text-align:unset;padding:15px;margin:0;z-index:3;outline:0}.column-back-button:hover{text-decoration:underline}.column-header__back-button{background:#192432;border:0;font-family:inherit;color:#d8a070;cursor:pointer;white-space:nowrap;font-size:16px;padding:0 5px 0 0;z-index:3}.column-header__back-button:hover{text-decoration:underline}.column-header__back-button:last-child{padding:0 15px 0 0}.column-back-button__icon{display:inline-block;margin-right:5px}.column-back-button--slim{position:relative}.column-back-button--slim-button{cursor:pointer;flex:0 0 auto;font-size:16px;padding:15px;position:absolute;right:0;top:-48px}.react-toggle{display:inline-block;position:relative;cursor:pointer;background-color:transparent;border:0;padding:0;user-select:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-tap-highlight-color:transparent}.react-toggle-screenreader-only{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.react-toggle--disabled{cursor:not-allowed;opacity:.5;transition:opacity .25s}.react-toggle-track{width:50px;height:24px;padding:0;border-radius:30px;background-color:#121a24;transition:background-color .2s ease}.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track{background-color:#010102}.react-toggle--checked .react-toggle-track{background-color:#d8a070}.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track{background-color:#e3bb98}.react-toggle-track-check{position:absolute;width:14px;height:10px;top:0;bottom:0;margin-top:auto;margin-bottom:auto;line-height:0;left:8px;opacity:0;transition:opacity .25s ease}.react-toggle--checked .react-toggle-track-check{opacity:1;transition:opacity .25s ease}.react-toggle-track-x{position:absolute;width:10px;height:10px;top:0;bottom:0;margin-top:auto;margin-bottom:auto;line-height:0;right:10px;opacity:1;transition:opacity .25s ease}.react-toggle--checked .react-toggle-track-x{opacity:0}.react-toggle-thumb{position:absolute;top:1px;left:1px;width:22px;height:22px;border:1px solid #121a24;border-radius:50%;background-color:#fafafa;box-sizing:border-box;transition:all .25s ease;transition-property:border-color,left}.react-toggle--checked .react-toggle-thumb{left:27px;border-color:#d8a070}.column-link{background:#202e3f;color:#fff;display:block;font-size:16px;padding:15px;text-decoration:none}.column-link:hover,.column-link:focus,.column-link:active{background:#253549}.column-link:focus{outline:0}.column-link--transparent{background:transparent;color:#d9e1e8}.column-link--transparent:hover,.column-link--transparent:focus,.column-link--transparent:active{background:transparent;color:#fff}.column-link--transparent.active{color:#d8a070}.column-link__icon{display:inline-block;margin-right:5px}.column-link__badge{display:inline-block;border-radius:4px;font-size:12px;line-height:19px;font-weight:500;background:#121a24;padding:4px 8px;margin:-6px 10px}.column-subheading{background:#121a24;color:#3e5a7c;padding:8px 20px;font-size:13px;font-weight:500;cursor:default}.getting-started__wrapper,.getting-started,.flex-spacer{background:#121a24}.flex-spacer{flex:1 1 auto}.getting-started{color:#3e5a7c;overflow:auto;border-bottom-left-radius:2px;border-bottom-right-radius:2px}.getting-started__wrapper,.getting-started__panel,.getting-started__footer{height:min-content}.getting-started__panel,.getting-started__footer{padding:10px;padding-top:20px;flex-grow:0}.getting-started__panel ul,.getting-started__footer ul{margin-bottom:10px}.getting-started__panel ul li,.getting-started__footer ul li{display:inline}.getting-started__panel p,.getting-started__footer p{font-size:13px}.getting-started__panel p a,.getting-started__footer p a{color:#3e5a7c;text-decoration:underline}.getting-started__panel a,.getting-started__footer a{text-decoration:none;color:#9baec8}.getting-started__panel a:hover,.getting-started__panel a:focus,.getting-started__panel a:active,.getting-started__footer a:hover,.getting-started__footer a:focus,.getting-started__footer a:active{text-decoration:underline}.getting-started__wrapper,.getting-started__footer{color:#3e5a7c}.getting-started__trends{flex:0 1 auto;opacity:1;animation:fade 150ms linear;margin-top:10px}.getting-started__trends h4{font-size:13px;color:#9baec8;padding:10px;font-weight:500;border-bottom:1px solid #202e3f}@media screen and (max-height: 810px){.getting-started__trends .trends__item:nth-child(3){display:none}}@media screen and (max-height: 720px){.getting-started__trends .trends__item:nth-child(2){display:none}}@media screen and (max-height: 670px){.getting-started__trends{display:none}}.getting-started__trends .trends__item{border-bottom:0;padding:10px}.getting-started__trends .trends__item__current{color:#9baec8}.keyboard-shortcuts{padding:8px 0 0;overflow:hidden}.keyboard-shortcuts thead{position:absolute;left:-9999px}.keyboard-shortcuts td{padding:0 10px 8px}.keyboard-shortcuts kbd{display:inline-block;padding:3px 5px;background-color:#202e3f;border:1px solid #0b1016}.setting-text{display:block;box-sizing:border-box;width:100%;margin:0;color:#121a24;background:#fff;padding:10px;font-family:inherit;font-size:14px;resize:vertical;border:0;outline:0;border-radius:4px}.setting-text:focus{outline:0}@media screen and (max-width: 600px){.setting-text{font-size:16px}}.no-reduce-motion button.icon-button i.fa-retweet{background-position:0 0;height:19px;transition:background-position .9s steps(10);transition-duration:0s;vertical-align:middle;width:22px}.no-reduce-motion button.icon-button i.fa-retweet::before{display:none !important}.no-reduce-motion button.icon-button.active i.fa-retweet{transition-duration:.9s;background-position:0 100%}.reduce-motion button.icon-button i.fa-retweet{color:#3e5a7c;transition:color 100ms ease-in}.reduce-motion button.icon-button.active i.fa-retweet{color:#d8a070}.status-card{display:flex;font-size:14px;border:1px solid #202e3f;border-radius:4px;color:#3e5a7c;margin-top:14px;text-decoration:none;overflow:hidden}.status-card__actions{bottom:0;left:0;position:absolute;right:0;top:0;display:flex;justify-content:center;align-items:center}.status-card__actions>div{background:rgba(0,0,0,.6);border-radius:8px;padding:12px 9px;flex:0 0 auto;display:flex;justify-content:center;align-items:center}.status-card__actions button,.status-card__actions a{display:inline;color:#d9e1e8;background:transparent;border:0;padding:0 8px;text-decoration:none;font-size:18px;line-height:18px}.status-card__actions button:hover,.status-card__actions button:active,.status-card__actions button:focus,.status-card__actions a:hover,.status-card__actions a:active,.status-card__actions a:focus{color:#fff}.status-card__actions a{font-size:19px;position:relative;bottom:-1px}a.status-card{cursor:pointer}a.status-card:hover{background:#202e3f}.status-card-photo{cursor:zoom-in;display:block;text-decoration:none;width:100%;height:auto;margin:0}.status-card-video iframe{width:100%;height:100%}.status-card__title{display:block;font-weight:500;margin-bottom:5px;color:#9baec8;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-decoration:none}.status-card__content{flex:1 1 auto;overflow:hidden;padding:14px 14px 14px 8px}.status-card__description{color:#9baec8}.status-card__host{display:block;margin-top:5px;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-card__image{flex:0 0 100px;background:#202e3f;position:relative}.status-card__image>.fa{font-size:21px;position:absolute;transform-origin:50% 50%;top:50%;left:50%;transform:translate(-50%, -50%)}.status-card.horizontal{display:block}.status-card.horizontal .status-card__image{width:100%}.status-card.horizontal .status-card__image-image{border-radius:4px 4px 0 0}.status-card.horizontal .status-card__title{white-space:inherit}.status-card.compact{border-color:#192432}.status-card.compact.interactive{border:0}.status-card.compact .status-card__content{padding:8px;padding-top:10px}.status-card.compact .status-card__title{white-space:nowrap}.status-card.compact .status-card__image{flex:0 0 60px}a.status-card.compact:hover{background-color:#192432}.status-card__image-image{border-radius:4px 0 0 4px;display:block;margin:0;width:100%;height:100%;object-fit:cover;background-size:cover;background-position:center center}.load-more{display:block;color:#3e5a7c;background-color:transparent;border:0;font-size:inherit;text-align:center;line-height:inherit;margin:0;padding:15px;box-sizing:border-box;width:100%;clear:both;text-decoration:none}.load-more:hover{background:#151f2b}.load-gap{border-bottom:1px solid #202e3f}.regeneration-indicator{text-align:center;font-size:16px;font-weight:500;color:#3e5a7c;background:#121a24;cursor:default;display:flex;flex:1 1 auto;flex-direction:column;align-items:center;justify-content:center;padding:20px}.regeneration-indicator__figure,.regeneration-indicator__figure img{display:block;width:auto;height:160px;margin:0}.regeneration-indicator--without-header{padding-top:68px}.regeneration-indicator__label{margin-top:30px}.regeneration-indicator__label strong{display:block;margin-bottom:10px;color:#3e5a7c}.regeneration-indicator__label span{font-size:15px;font-weight:400}.column-header__wrapper{position:relative;flex:0 0 auto}.column-header__wrapper.active::before{display:block;content:\"\";position:absolute;top:35px;left:0;right:0;margin:0 auto;width:60%;pointer-events:none;height:28px;z-index:1;background:radial-gradient(ellipse, rgba(216, 160, 112, 0.23) 0%, rgba(216, 160, 112, 0) 60%)}.column-header{display:flex;font-size:16px;background:#192432;flex:0 0 auto;cursor:pointer;position:relative;z-index:2;outline:0;overflow:hidden;border-top-left-radius:2px;border-top-right-radius:2px}.column-header>button{margin:0;border:0;padding:15px 0 15px 15px;color:inherit;background:transparent;font:inherit;text-align:left;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;flex:1}.column-header>.column-header__back-button{color:#d8a070}.column-header.active{box-shadow:0 1px 0 rgba(216,160,112,.3)}.column-header.active .column-header__icon{color:#d8a070;text-shadow:0 0 10px rgba(216,160,112,.4)}.column-header:focus,.column-header:active{outline:0}.column-header__buttons{height:48px;display:flex}.column-header__links{margin-bottom:14px}.column-header__links .text-btn{margin-right:10px}.column-header__button{background:#192432;border:0;color:#9baec8;cursor:pointer;font-size:16px;padding:0 15px}.column-header__button:hover{color:#b2c1d5}.column-header__button.active{color:#fff;background:#202e3f}.column-header__button.active:hover{color:#fff;background:#202e3f}.column-header__collapsible{max-height:70vh;overflow:hidden;overflow-y:auto;color:#9baec8;transition:max-height 150ms ease-in-out,opacity 300ms linear;opacity:1}.column-header__collapsible.collapsed{max-height:0;opacity:.5}.column-header__collapsible.animating{overflow-y:hidden}.column-header__collapsible hr{height:0;background:transparent;border:0;border-top:1px solid #26374d;margin:10px 0}.column-header__collapsible-inner{background:#202e3f;padding:15px}.column-header__setting-btn:hover{color:#9baec8;text-decoration:underline}.column-header__setting-arrows{float:right}.column-header__setting-arrows .column-header__setting-btn{padding:0 10px}.column-header__setting-arrows .column-header__setting-btn:last-child{padding-right:0}.text-btn{display:inline-block;padding:0;font-family:inherit;font-size:inherit;color:inherit;border:0;background:transparent;cursor:pointer}.column-header__icon{display:inline-block;margin-right:5px}.loading-indicator{color:#3e5a7c;font-size:13px;font-weight:400;overflow:visible;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.loading-indicator span{display:block;float:left;margin-left:50%;transform:translateX(-50%);margin:82px 0 0 50%;white-space:nowrap}.loading-indicator__figure{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);width:42px;height:42px;box-sizing:border-box;background-color:transparent;border:0 solid #3e5a7c;border-width:6px;border-radius:50%}.no-reduce-motion .loading-indicator span{animation:loader-label 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1)}.no-reduce-motion .loading-indicator__figure{animation:loader-figure 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1)}@keyframes spring-rotate-in{0%{transform:rotate(0deg)}30%{transform:rotate(-484.8deg)}60%{transform:rotate(-316.7deg)}90%{transform:rotate(-375deg)}100%{transform:rotate(-360deg)}}@keyframes spring-rotate-out{0%{transform:rotate(-360deg)}30%{transform:rotate(124.8deg)}60%{transform:rotate(-43.27deg)}90%{transform:rotate(15deg)}100%{transform:rotate(0deg)}}@keyframes loader-figure{0%{width:0;height:0;background-color:#3e5a7c}29%{background-color:#3e5a7c}30%{width:42px;height:42px;background-color:transparent;border-width:21px;opacity:1}100%{width:42px;height:42px;border-width:0;opacity:0;background-color:transparent}}@keyframes loader-label{0%{opacity:.25}30%{opacity:1}100%{opacity:.25}}.video-error-cover{align-items:center;background:#000;color:#fff;cursor:pointer;display:flex;flex-direction:column;height:100%;justify-content:center;margin-top:8px;position:relative;text-align:center;z-index:100}.media-spoiler{background:#000;color:#9baec8;border:0;padding:0;width:100%;height:100%;border-radius:4px;appearance:none}.media-spoiler:hover,.media-spoiler:active,.media-spoiler:focus{padding:0;color:#b5c3d6}.media-spoiler__warning{display:block;font-size:14px}.media-spoiler__trigger{display:block;font-size:11px;font-weight:700}.spoiler-button{top:0;left:0;width:100%;height:100%;position:absolute;z-index:100}.spoiler-button--minified{display:block;left:4px;top:4px;width:auto;height:auto}.spoiler-button--click-thru{pointer-events:none}.spoiler-button--hidden{display:none}.spoiler-button__overlay{display:block;background:transparent;width:100%;height:100%;border:0}.spoiler-button__overlay__label{display:inline-block;background:rgba(0,0,0,.5);border-radius:8px;padding:8px 12px;color:#fff;font-weight:500;font-size:14px}.spoiler-button__overlay:hover .spoiler-button__overlay__label,.spoiler-button__overlay:focus .spoiler-button__overlay__label,.spoiler-button__overlay:active .spoiler-button__overlay__label{background:rgba(0,0,0,.8)}.spoiler-button__overlay:disabled .spoiler-button__overlay__label{background:rgba(0,0,0,.5)}.modal-container--preloader{background:#202e3f}.account--panel{background:#192432;border-top:1px solid #202e3f;border-bottom:1px solid #202e3f;display:flex;flex-direction:row;padding:10px 0}.account--panel__button,.detailed-status__button{flex:1 1 auto;text-align:center}.column-settings__outer{background:#202e3f;padding:15px}.column-settings__section{color:#9baec8;cursor:default;display:block;font-weight:500;margin-bottom:10px}.column-settings__hashtags .column-settings__row{margin-bottom:15px}.column-settings__hashtags .column-select__control{outline:0;box-sizing:border-box;width:100%;border:0;box-shadow:none;font-family:inherit;background:#121a24;color:#9baec8;font-size:14px;margin:0}.column-settings__hashtags .column-select__control::placeholder{color:#a8b9cf}.column-settings__hashtags .column-select__control::-moz-focus-inner{border:0}.column-settings__hashtags .column-select__control::-moz-focus-inner,.column-settings__hashtags .column-select__control:focus,.column-settings__hashtags .column-select__control:active{outline:0 !important}.column-settings__hashtags .column-select__control:focus{background:#192432}@media screen and (max-width: 600px){.column-settings__hashtags .column-select__control{font-size:16px}}.column-settings__hashtags .column-select__placeholder{color:#3e5a7c;padding-left:2px;font-size:12px}.column-settings__hashtags .column-select__value-container{padding-left:6px}.column-settings__hashtags .column-select__multi-value{background:#202e3f}.column-settings__hashtags .column-select__multi-value__remove{cursor:pointer}.column-settings__hashtags .column-select__multi-value__remove:hover,.column-settings__hashtags .column-select__multi-value__remove:active,.column-settings__hashtags .column-select__multi-value__remove:focus{background:#26374d;color:#a8b9cf}.column-settings__hashtags .column-select__multi-value__label,.column-settings__hashtags .column-select__input{color:#9baec8}.column-settings__hashtags .column-select__clear-indicator,.column-settings__hashtags .column-select__dropdown-indicator{cursor:pointer;transition:none;color:#3e5a7c}.column-settings__hashtags .column-select__clear-indicator:hover,.column-settings__hashtags .column-select__clear-indicator:active,.column-settings__hashtags .column-select__clear-indicator:focus,.column-settings__hashtags .column-select__dropdown-indicator:hover,.column-settings__hashtags .column-select__dropdown-indicator:active,.column-settings__hashtags .column-select__dropdown-indicator:focus{color:#45648a}.column-settings__hashtags .column-select__indicator-separator{background-color:#202e3f}.column-settings__hashtags .column-select__menu{background:#fff;border-radius:4px;padding:10px 14px;padding-bottom:14px;margin-top:10px;color:#9baec8;box-shadow:2px 4px 15px rgba(0,0,0,.4);padding:0;background:#d9e1e8}.column-settings__hashtags .column-select__menu h4{color:#9baec8;font-size:14px;font-weight:500;margin-bottom:10px}.column-settings__hashtags .column-select__menu li{padding:4px 0}.column-settings__hashtags .column-select__menu ul{margin-bottom:10px}.column-settings__hashtags .column-select__menu em{font-weight:500;color:#121a24}.column-settings__hashtags .column-select__menu-list{padding:6px}.column-settings__hashtags .column-select__option{color:#121a24;border-radius:4px;font-size:14px}.column-settings__hashtags .column-select__option--is-focused,.column-settings__hashtags .column-select__option--is-selected{background:#b9c8d5}.column-settings__row .text-btn{margin-bottom:15px}.relationship-tag{color:#fff;margin-bottom:4px;display:block;vertical-align:top;background-color:#000;font-size:12px;font-weight:500;padding:4px;border-radius:4px;opacity:.7}.relationship-tag:hover{opacity:1}.setting-toggle{display:block;line-height:24px}.setting-toggle__label{color:#9baec8;display:inline-block;margin-bottom:14px;margin-left:8px;vertical-align:middle}.empty-column-indicator,.error-column{color:#3e5a7c;background:#121a24;text-align:center;padding:20px;font-size:15px;font-weight:400;cursor:default;display:flex;flex:1 1 auto;align-items:center;justify-content:center}@supports(display: grid){.empty-column-indicator,.error-column{contain:strict}}.empty-column-indicator>span,.error-column>span{max-width:400px}.empty-column-indicator a,.error-column a{color:#d8a070;text-decoration:none}.empty-column-indicator a:hover,.error-column a:hover{text-decoration:underline}.error-column{flex-direction:column}@keyframes heartbeat{from{transform:scale(1);animation-timing-function:ease-out}10%{transform:scale(0.91);animation-timing-function:ease-in}17%{transform:scale(0.98);animation-timing-function:ease-out}33%{transform:scale(0.87);animation-timing-function:ease-in}45%{transform:scale(1);animation-timing-function:ease-out}}.no-reduce-motion .pulse-loading{transform-origin:center center;animation:heartbeat 1.5s ease-in-out infinite both}@keyframes shake-bottom{0%,100%{transform:rotate(0deg);transform-origin:50% 100%}10%{transform:rotate(2deg)}20%,40%,60%{transform:rotate(-4deg)}30%,50%,70%{transform:rotate(4deg)}80%{transform:rotate(-2deg)}90%{transform:rotate(2deg)}}.no-reduce-motion .shake-bottom{transform-origin:50% 100%;animation:shake-bottom .8s cubic-bezier(0.455, 0.03, 0.515, 0.955) 2s 2 both}.emoji-picker-dropdown__menu{background:#fff;position:absolute;box-shadow:4px 4px 6px rgba(0,0,0,.4);border-radius:4px;margin-top:5px;z-index:2}.emoji-picker-dropdown__menu .emoji-mart-scroll{transition:opacity 200ms ease}.emoji-picker-dropdown__menu.selecting .emoji-mart-scroll{opacity:.5}.emoji-picker-dropdown__modifiers{position:absolute;top:60px;right:11px;cursor:pointer}.emoji-picker-dropdown__modifiers__menu{position:absolute;z-index:4;top:-4px;left:-8px;background:#fff;border-radius:4px;box-shadow:1px 2px 6px rgba(0,0,0,.2);overflow:hidden}.emoji-picker-dropdown__modifiers__menu button{display:block;cursor:pointer;border:0;padding:4px 8px;background:transparent}.emoji-picker-dropdown__modifiers__menu button:hover,.emoji-picker-dropdown__modifiers__menu button:focus,.emoji-picker-dropdown__modifiers__menu button:active{background:rgba(217,225,232,.4)}.emoji-picker-dropdown__modifiers__menu .emoji-mart-emoji{height:22px}.emoji-mart-emoji span{background-repeat:no-repeat}.upload-area{align-items:center;background:rgba(0,0,0,.8);display:flex;height:100%;justify-content:center;left:0;opacity:0;position:absolute;top:0;visibility:hidden;width:100%;z-index:2000}.upload-area *{pointer-events:none}.upload-area__drop{width:320px;height:160px;display:flex;box-sizing:border-box;position:relative;padding:8px}.upload-area__background{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;border-radius:4px;background:#121a24;box-shadow:0 0 5px rgba(0,0,0,.2)}.upload-area__content{flex:1;display:flex;align-items:center;justify-content:center;color:#d9e1e8;font-size:18px;font-weight:500;border:2px dashed #3e5a7c;border-radius:4px}.upload-progress{padding:10px;color:#3e5a7c;overflow:hidden;display:flex}.upload-progress .fa{font-size:34px;margin-right:10px}.upload-progress span{font-size:13px;font-weight:500;display:block}.upload-progess__message{flex:1 1 auto}.upload-progress__backdrop{width:100%;height:6px;border-radius:6px;background:#3e5a7c;position:relative;margin-top:5px}.upload-progress__tracker{position:absolute;left:0;top:0;height:6px;background:#d8a070;border-radius:6px}.emoji-button{display:block;font-size:24px;line-height:24px;margin-left:2px;width:24px;outline:0;cursor:pointer}.emoji-button:active,.emoji-button:focus{outline:0 !important}.emoji-button img{filter:grayscale(100%);opacity:.8;display:block;margin:0;width:22px;height:22px;margin-top:2px}.emoji-button:hover img,.emoji-button:active img,.emoji-button:focus img{opacity:1;filter:none}.dropdown--active .emoji-button img{opacity:1;filter:none}.privacy-dropdown__dropdown{position:absolute;background:#fff;box-shadow:2px 4px 15px rgba(0,0,0,.4);border-radius:4px;margin-left:40px;overflow:hidden}.privacy-dropdown__dropdown.top{transform-origin:50% 100%}.privacy-dropdown__dropdown.bottom{transform-origin:50% 0}.privacy-dropdown__option{color:#121a24;padding:10px;cursor:pointer;display:flex}.privacy-dropdown__option:hover,.privacy-dropdown__option.active{background:#d8a070;color:#fff;outline:0}.privacy-dropdown__option:hover .privacy-dropdown__option__content,.privacy-dropdown__option.active .privacy-dropdown__option__content{color:#fff}.privacy-dropdown__option:hover .privacy-dropdown__option__content strong,.privacy-dropdown__option.active .privacy-dropdown__option__content strong{color:#fff}.privacy-dropdown__option.active:hover{background:#dcab80}.privacy-dropdown__option__icon{display:flex;align-items:center;justify-content:center;margin-right:10px}.privacy-dropdown__option__content{flex:1 1 auto;color:#3e5a7c}.privacy-dropdown__option__content strong{font-weight:500;display:block;color:#121a24}.privacy-dropdown__option__content strong:lang(ja){font-weight:700}.privacy-dropdown__option__content strong:lang(ko){font-weight:700}.privacy-dropdown__option__content strong:lang(zh-CN){font-weight:700}.privacy-dropdown__option__content strong:lang(zh-HK){font-weight:700}.privacy-dropdown__option__content strong:lang(zh-TW){font-weight:700}.privacy-dropdown.active .privacy-dropdown__value{background:#fff;border-radius:4px 4px 0 0;box-shadow:0 -4px 4px rgba(0,0,0,.1)}.privacy-dropdown.active .privacy-dropdown__value .icon-button{transition:none}.privacy-dropdown.active .privacy-dropdown__value.active{background:#d8a070}.privacy-dropdown.active .privacy-dropdown__value.active .icon-button{color:#fff}.privacy-dropdown.active.top .privacy-dropdown__value{border-radius:0 0 4px 4px}.privacy-dropdown.active .privacy-dropdown__dropdown{display:block;box-shadow:2px 4px 6px rgba(0,0,0,.1)}.search{position:relative}.search__input{outline:0;box-sizing:border-box;width:100%;border:0;box-shadow:none;font-family:inherit;background:#121a24;color:#9baec8;font-size:14px;margin:0;display:block;padding:15px;padding-right:30px;line-height:18px;font-size:16px}.search__input::placeholder{color:#a8b9cf}.search__input::-moz-focus-inner{border:0}.search__input::-moz-focus-inner,.search__input:focus,.search__input:active{outline:0 !important}.search__input:focus{background:#192432}@media screen and (max-width: 600px){.search__input{font-size:16px}}.search__icon::-moz-focus-inner{border:0}.search__icon::-moz-focus-inner,.search__icon:focus{outline:0 !important}.search__icon .fa{position:absolute;top:16px;right:10px;z-index:2;display:inline-block;opacity:0;transition:all 100ms linear;transition-property:transform,opacity;font-size:18px;width:18px;height:18px;color:#d9e1e8;cursor:default;pointer-events:none}.search__icon .fa.active{pointer-events:auto;opacity:.3}.search__icon .fa-search{transform:rotate(90deg)}.search__icon .fa-search.active{pointer-events:none;transform:rotate(0deg)}.search__icon .fa-times-circle{top:17px;transform:rotate(0deg);color:#3e5a7c;cursor:pointer}.search__icon .fa-times-circle.active{transform:rotate(90deg)}.search__icon .fa-times-circle:hover{color:#4a6b94}.search-results__header{color:#3e5a7c;background:#151f2b;padding:15px;font-weight:500;font-size:16px;cursor:default}.search-results__header .fa{display:inline-block;margin-right:5px}.search-results__section{margin-bottom:5px}.search-results__section h5{background:#0b1016;border-bottom:1px solid #202e3f;cursor:default;display:flex;padding:15px;font-weight:500;font-size:16px;color:#3e5a7c}.search-results__section h5 .fa{display:inline-block;margin-right:5px}.search-results__section .account:last-child,.search-results__section>div:last-child .status{border-bottom:0}.search-results__hashtag{display:block;padding:10px;color:#d9e1e8;text-decoration:none}.search-results__hashtag:hover,.search-results__hashtag:active,.search-results__hashtag:focus{color:#e6ebf0;text-decoration:underline}.search-results__info{padding:20px;color:#9baec8;text-align:center}.modal-root{position:relative;transition:opacity .3s linear;will-change:opacity;z-index:9999}.modal-root__overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.7)}.modal-root__container{position:fixed;top:0;left:0;width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;align-content:space-around;z-index:9999;pointer-events:none;user-select:none}.modal-root__modal{pointer-events:auto;display:flex;z-index:9999}.video-modal__container{max-width:100vw;max-height:100vh}.audio-modal__container{width:50vw}.media-modal{width:100%;height:100%;position:relative}.media-modal .extended-video-player{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.media-modal .extended-video-player video{max-width:100%;max-height:80%}.media-modal__closer{position:absolute;top:0;left:0;right:0;bottom:0}.media-modal__navigation{position:absolute;top:0;left:0;right:0;bottom:0;pointer-events:none;transition:opacity .3s linear;will-change:opacity}.media-modal__navigation *{pointer-events:auto}.media-modal__navigation.media-modal__navigation--hidden{opacity:0}.media-modal__navigation.media-modal__navigation--hidden *{pointer-events:none}.media-modal__nav{background:rgba(0,0,0,.5);box-sizing:border-box;border:0;color:#fff;cursor:pointer;display:flex;align-items:center;font-size:24px;height:20vmax;margin:auto 0;padding:30px 15px;position:absolute;top:0;bottom:0}.media-modal__nav--left{left:0}.media-modal__nav--right{right:0}.media-modal__pagination{width:100%;text-align:center;position:absolute;left:0;bottom:20px;pointer-events:none}.media-modal__meta{text-align:center;position:absolute;left:0;bottom:20px;width:100%;pointer-events:none}.media-modal__meta--shifted{bottom:62px}.media-modal__meta a{pointer-events:auto;text-decoration:none;font-weight:500;color:#d9e1e8}.media-modal__meta a:hover,.media-modal__meta a:focus,.media-modal__meta a:active{text-decoration:underline}.media-modal__page-dot{display:inline-block}.media-modal__button{background-color:#fff;height:12px;width:12px;border-radius:6px;margin:10px;padding:0;border:0;font-size:0}.media-modal__button--active{background-color:#d8a070}.media-modal__close{position:absolute;right:8px;top:8px;z-index:100}.onboarding-modal,.error-modal,.embed-modal{background:#d9e1e8;color:#121a24;border-radius:8px;overflow:hidden;display:flex;flex-direction:column}.error-modal__body{height:80vh;width:80vw;max-width:520px;max-height:420px;position:relative}.error-modal__body>div{position:absolute;top:0;left:0;width:100%;height:100%;box-sizing:border-box;padding:25px;display:none;flex-direction:column;align-items:center;justify-content:center;display:flex;opacity:0;user-select:text}.error-modal__body{display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center}.onboarding-modal__paginator,.error-modal__footer{flex:0 0 auto;background:#c0cdd9;display:flex;padding:25px}.onboarding-modal__paginator>div,.error-modal__footer>div{min-width:33px}.onboarding-modal__paginator .onboarding-modal__nav,.onboarding-modal__paginator .error-modal__nav,.error-modal__footer .onboarding-modal__nav,.error-modal__footer .error-modal__nav{color:#3e5a7c;border:0;font-size:14px;font-weight:500;padding:10px 25px;line-height:inherit;height:auto;margin:-10px;border-radius:4px;background-color:transparent}.onboarding-modal__paginator .onboarding-modal__nav:hover,.onboarding-modal__paginator .onboarding-modal__nav:focus,.onboarding-modal__paginator .onboarding-modal__nav:active,.onboarding-modal__paginator .error-modal__nav:hover,.onboarding-modal__paginator .error-modal__nav:focus,.onboarding-modal__paginator .error-modal__nav:active,.error-modal__footer .onboarding-modal__nav:hover,.error-modal__footer .onboarding-modal__nav:focus,.error-modal__footer .onboarding-modal__nav:active,.error-modal__footer .error-modal__nav:hover,.error-modal__footer .error-modal__nav:focus,.error-modal__footer .error-modal__nav:active{color:#37506f;background-color:#a6b9c9}.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next,.error-modal__footer .error-modal__nav.onboarding-modal__done,.error-modal__footer .error-modal__nav.onboarding-modal__next{color:#121a24}.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:hover,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:focus,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:active,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:hover,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:focus,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:active,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:hover,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:focus,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:active,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:hover,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:focus,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:active,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:hover,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:focus,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:active,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:hover,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:focus,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:active,.error-modal__footer .error-modal__nav.onboarding-modal__done:hover,.error-modal__footer .error-modal__nav.onboarding-modal__done:focus,.error-modal__footer .error-modal__nav.onboarding-modal__done:active,.error-modal__footer .error-modal__nav.onboarding-modal__next:hover,.error-modal__footer .error-modal__nav.onboarding-modal__next:focus,.error-modal__footer .error-modal__nav.onboarding-modal__next:active{color:#192432}.error-modal__footer{justify-content:center}.display-case{text-align:center;font-size:15px;margin-bottom:15px}.display-case__label{font-weight:500;color:#121a24;margin-bottom:5px;font-size:13px}.display-case__case{background:#121a24;color:#d9e1e8;font-weight:500;padding:10px;border-radius:4px}.onboard-sliders{display:inline-block;max-width:30px;max-height:auto;margin-left:10px}.boost-modal,.confirmation-modal,.report-modal,.actions-modal,.mute-modal,.block-modal{background:#f2f5f7;color:#121a24;border-radius:8px;overflow:hidden;max-width:90vw;width:480px;position:relative;flex-direction:column}.boost-modal .status__display-name,.confirmation-modal .status__display-name,.report-modal .status__display-name,.actions-modal .status__display-name,.mute-modal .status__display-name,.block-modal .status__display-name{display:block;max-width:100%;padding-right:25px}.boost-modal .status__avatar,.confirmation-modal .status__avatar,.report-modal .status__avatar,.actions-modal .status__avatar,.mute-modal .status__avatar,.block-modal .status__avatar{height:28px;left:10px;position:absolute;top:10px;width:48px}.boost-modal .status__content__spoiler-link,.confirmation-modal .status__content__spoiler-link,.report-modal .status__content__spoiler-link,.actions-modal .status__content__spoiler-link,.mute-modal .status__content__spoiler-link,.block-modal .status__content__spoiler-link{color:#f2f5f7}.actions-modal .status{background:#fff;border-bottom-color:#d9e1e8;padding-top:10px;padding-bottom:10px}.actions-modal .dropdown-menu__separator{border-bottom-color:#d9e1e8}.boost-modal__container{overflow-x:scroll;padding:10px}.boost-modal__container .status{user-select:text;border-bottom:0}.boost-modal__action-bar,.confirmation-modal__action-bar,.mute-modal__action-bar,.block-modal__action-bar{display:flex;justify-content:space-between;background:#d9e1e8;padding:10px;line-height:36px}.boost-modal__action-bar>div,.confirmation-modal__action-bar>div,.mute-modal__action-bar>div,.block-modal__action-bar>div{flex:1 1 auto;text-align:right;color:#3e5a7c;padding-right:10px}.boost-modal__action-bar .button,.confirmation-modal__action-bar .button,.mute-modal__action-bar .button,.block-modal__action-bar .button{flex:0 0 auto}.boost-modal__status-header{font-size:15px}.boost-modal__status-time{float:right;font-size:14px}.mute-modal,.block-modal{line-height:24px}.mute-modal .react-toggle,.block-modal .react-toggle{vertical-align:middle}.report-modal{width:90vw;max-width:700px}.report-modal__container{display:flex;border-top:1px solid #d9e1e8}@media screen and (max-width: 480px){.report-modal__container{flex-wrap:wrap;overflow-y:auto}}.report-modal__statuses,.report-modal__comment{box-sizing:border-box;width:50%}@media screen and (max-width: 480px){.report-modal__statuses,.report-modal__comment{width:100%}}.report-modal__statuses,.focal-point-modal__content{flex:1 1 auto;min-height:20vh;max-height:80vh;overflow-y:auto;overflow-x:hidden}.report-modal__statuses .status__content a,.focal-point-modal__content .status__content a{color:#d8a070}.report-modal__statuses .status__content,.report-modal__statuses .status__content p,.focal-point-modal__content .status__content,.focal-point-modal__content .status__content p{color:#121a24}@media screen and (max-width: 480px){.report-modal__statuses,.focal-point-modal__content{max-height:10vh}}@media screen and (max-width: 480px){.focal-point-modal__content{max-height:40vh}}.report-modal__comment{padding:20px;border-right:1px solid #d9e1e8;max-width:320px}.report-modal__comment p{font-size:14px;line-height:20px;margin-bottom:20px}.report-modal__comment .setting-text{display:block;box-sizing:border-box;width:100%;margin:0;color:#121a24;background:#fff;padding:10px;font-family:inherit;font-size:14px;resize:none;border:0;outline:0;border-radius:4px;border:1px solid #d9e1e8;min-height:100px;max-height:50vh;margin-bottom:10px}.report-modal__comment .setting-text:focus{border:1px solid #c0cdd9}.report-modal__comment .setting-text__wrapper{background:#fff;border:1px solid #d9e1e8;margin-bottom:10px;border-radius:4px}.report-modal__comment .setting-text__wrapper .setting-text{border:0;margin-bottom:0;border-radius:0}.report-modal__comment .setting-text__wrapper .setting-text:focus{border:0}.report-modal__comment .setting-text__wrapper__modifiers{color:#121a24;font-family:inherit;font-size:14px;background:#fff}.report-modal__comment .setting-text__toolbar{display:flex;justify-content:space-between;margin-bottom:20px}.report-modal__comment .setting-text-label{display:block;color:#121a24;font-size:14px;font-weight:500;margin-bottom:10px}.report-modal__comment .setting-toggle{margin-top:20px;margin-bottom:24px}.report-modal__comment .setting-toggle__label{color:#121a24;font-size:14px}@media screen and (max-width: 480px){.report-modal__comment{padding:10px;max-width:100%;order:2}.report-modal__comment .setting-toggle{margin-bottom:4px}}.actions-modal{max-height:80vh;max-width:80vw}.actions-modal .status{overflow-y:auto;max-height:300px}.actions-modal .actions-modal__item-label{font-weight:500}.actions-modal ul{overflow-y:auto;flex-shrink:0;max-height:80vh}.actions-modal ul.with-status{max-height:calc(80vh - 75px)}.actions-modal ul li:empty{margin:0}.actions-modal ul li:not(:empty) a{color:#121a24;display:flex;padding:12px 16px;font-size:15px;align-items:center;text-decoration:none}.actions-modal ul li:not(:empty) a,.actions-modal ul li:not(:empty) a button{transition:none}.actions-modal ul li:not(:empty) a.active,.actions-modal ul li:not(:empty) a.active button,.actions-modal ul li:not(:empty) a:hover,.actions-modal ul li:not(:empty) a:hover button,.actions-modal ul li:not(:empty) a:active,.actions-modal ul li:not(:empty) a:active button,.actions-modal ul li:not(:empty) a:focus,.actions-modal ul li:not(:empty) a:focus button{background:#d8a070;color:#fff}.actions-modal ul li:not(:empty) a button:first-child{margin-right:10px}.confirmation-modal__action-bar .confirmation-modal__secondary-button,.mute-modal__action-bar .confirmation-modal__secondary-button,.block-modal__action-bar .confirmation-modal__secondary-button{flex-shrink:1}.confirmation-modal__secondary-button,.confirmation-modal__cancel-button,.mute-modal__cancel-button,.block-modal__cancel-button{background-color:transparent;color:#3e5a7c;font-size:14px;font-weight:500}.confirmation-modal__secondary-button:hover,.confirmation-modal__secondary-button:focus,.confirmation-modal__secondary-button:active,.confirmation-modal__cancel-button:hover,.confirmation-modal__cancel-button:focus,.confirmation-modal__cancel-button:active,.mute-modal__cancel-button:hover,.mute-modal__cancel-button:focus,.mute-modal__cancel-button:active,.block-modal__cancel-button:hover,.block-modal__cancel-button:focus,.block-modal__cancel-button:active{color:#37506f;background-color:transparent}.confirmation-modal__container,.mute-modal__container,.block-modal__container,.report-modal__target{padding:30px;font-size:16px}.confirmation-modal__container strong,.mute-modal__container strong,.block-modal__container strong,.report-modal__target strong{font-weight:500}.confirmation-modal__container strong:lang(ja),.mute-modal__container strong:lang(ja),.block-modal__container strong:lang(ja),.report-modal__target strong:lang(ja){font-weight:700}.confirmation-modal__container strong:lang(ko),.mute-modal__container strong:lang(ko),.block-modal__container strong:lang(ko),.report-modal__target strong:lang(ko){font-weight:700}.confirmation-modal__container strong:lang(zh-CN),.mute-modal__container strong:lang(zh-CN),.block-modal__container strong:lang(zh-CN),.report-modal__target strong:lang(zh-CN){font-weight:700}.confirmation-modal__container strong:lang(zh-HK),.mute-modal__container strong:lang(zh-HK),.block-modal__container strong:lang(zh-HK),.report-modal__target strong:lang(zh-HK){font-weight:700}.confirmation-modal__container strong:lang(zh-TW),.mute-modal__container strong:lang(zh-TW),.block-modal__container strong:lang(zh-TW),.report-modal__target strong:lang(zh-TW){font-weight:700}.confirmation-modal__container,.report-modal__target{text-align:center}.block-modal__explanation,.mute-modal__explanation{margin-top:20px}.block-modal .setting-toggle,.mute-modal .setting-toggle{margin-top:20px;margin-bottom:24px;display:flex;align-items:center}.block-modal .setting-toggle__label,.mute-modal .setting-toggle__label{color:#121a24;margin:0;margin-left:8px}.report-modal__target{padding:15px}.report-modal__target .media-modal__close{top:14px;right:15px}.loading-bar{background-color:#d8a070;height:3px;position:absolute;top:0;left:0;z-index:9999}.media-gallery__gifv__label{display:block;position:absolute;color:#fff;background:rgba(0,0,0,.5);bottom:6px;left:6px;padding:2px 6px;border-radius:2px;font-size:11px;font-weight:600;z-index:1;pointer-events:none;opacity:.9;transition:opacity .1s ease;line-height:18px}.media-gallery__gifv.autoplay .media-gallery__gifv__label{display:none}.media-gallery__gifv:hover .media-gallery__gifv__label{opacity:1}.media-gallery__audio{margin-top:32px}.media-gallery__audio audio{width:100%}.attachment-list{display:flex;font-size:14px;border:1px solid #202e3f;border-radius:4px;margin-top:14px;overflow:hidden}.attachment-list__icon{flex:0 0 auto;color:#3e5a7c;padding:8px 18px;cursor:default;border-right:1px solid #202e3f;display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:26px}.attachment-list__icon .fa{display:block}.attachment-list__list{list-style:none;padding:4px 0;padding-left:8px;display:flex;flex-direction:column;justify-content:center}.attachment-list__list li{display:block;padding:4px 0}.attachment-list__list a{text-decoration:none;color:#3e5a7c;font-weight:500}.attachment-list__list a:hover{text-decoration:underline}.attachment-list.compact{border:0;margin-top:4px}.attachment-list.compact .attachment-list__list{padding:0;display:block}.attachment-list.compact .fa{color:#3e5a7c}.media-gallery{box-sizing:border-box;margin-top:8px;overflow:hidden;border-radius:4px;position:relative;width:100%}.media-gallery__item{border:0;box-sizing:border-box;display:block;float:left;position:relative;border-radius:4px;overflow:hidden}.media-gallery__item.standalone .media-gallery__item-gifv-thumbnail{transform:none;top:0}.media-gallery__item-thumbnail{cursor:zoom-in;display:block;text-decoration:none;color:#d9e1e8;position:relative;z-index:1}.media-gallery__item-thumbnail,.media-gallery__item-thumbnail img{height:100%;width:100%}.media-gallery__item-thumbnail img{object-fit:cover}.media-gallery__preview{width:100%;height:100%;object-fit:cover;position:absolute;top:0;left:0;z-index:0;background:#000}.media-gallery__preview--hidden{display:none}.media-gallery__gifv{height:100%;overflow:hidden;position:relative;width:100%}.media-gallery__item-gifv-thumbnail{cursor:zoom-in;height:100%;object-fit:cover;position:relative;top:50%;transform:translateY(-50%);width:100%;z-index:1}.media-gallery__item-thumbnail-label{clip:rect(1px 1px 1px 1px);clip:rect(1px, 1px, 1px, 1px);overflow:hidden;position:absolute}.detailed .video-player__volume__current,.detailed .video-player__volume::before,.fullscreen .video-player__volume__current,.fullscreen .video-player__volume::before{bottom:27px}.detailed .video-player__volume__handle,.fullscreen .video-player__volume__handle{bottom:23px}.audio-player{box-sizing:border-box;position:relative;background:#040609;border-radius:4px;padding-bottom:44px;direction:ltr}.audio-player.editable{border-radius:0;height:100%}.audio-player__waveform{padding:15px 0;position:relative;overflow:hidden}.audio-player__waveform::before{content:\"\";display:block;position:absolute;border-top:1px solid #192432;width:100%;height:0;left:0;top:calc(50% + 1px)}.audio-player__progress-placeholder{background-color:rgba(225,181,144,.5)}.audio-player__wave-placeholder{background-color:#2d415a}.audio-player .video-player__controls{padding:0 15px;padding-top:10px;background:#040609;border-top:1px solid #192432;border-radius:0 0 4px 4px}.video-player{overflow:hidden;position:relative;background:#000;max-width:100%;border-radius:4px;box-sizing:border-box;direction:ltr}.video-player.editable{border-radius:0;height:100% !important}.video-player:focus{outline:0}.video-player video{max-width:100vw;max-height:80vh;z-index:1}.video-player.fullscreen{width:100% !important;height:100% !important;margin:0}.video-player.fullscreen video{max-width:100% !important;max-height:100% !important;width:100% !important;height:100% !important;outline:0}.video-player.inline video{object-fit:contain;position:relative;top:50%;transform:translateY(-50%)}.video-player__controls{position:absolute;z-index:2;bottom:0;left:0;right:0;box-sizing:border-box;background:linear-gradient(0deg, rgba(0, 0, 0, 0.85) 0, rgba(0, 0, 0, 0.45) 60%, transparent);padding:0 15px;opacity:0;transition:opacity .1s ease}.video-player__controls.active{opacity:1}.video-player.inactive video,.video-player.inactive .video-player__controls{visibility:hidden}.video-player__spoiler{display:none;position:absolute;top:0;left:0;width:100%;height:100%;z-index:4;border:0;background:#000;color:#9baec8;transition:none;pointer-events:none}.video-player__spoiler.active{display:block;pointer-events:auto}.video-player__spoiler.active:hover,.video-player__spoiler.active:active,.video-player__spoiler.active:focus{color:#b2c1d5}.video-player__spoiler__title{display:block;font-size:14px}.video-player__spoiler__subtitle{display:block;font-size:11px;font-weight:500}.video-player__buttons-bar{display:flex;justify-content:space-between;padding-bottom:10px}.video-player__buttons-bar .video-player__download__icon{color:inherit}.video-player__buttons{font-size:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.video-player__buttons.left button{padding-left:0}.video-player__buttons.right button{padding-right:0}.video-player__buttons button{background:transparent;padding:2px 10px;font-size:16px;border:0;color:rgba(255,255,255,.75)}.video-player__buttons button:active,.video-player__buttons button:hover,.video-player__buttons button:focus{color:#fff}.video-player__time-sep,.video-player__time-total,.video-player__time-current{font-size:14px;font-weight:500}.video-player__time-current{color:#fff;margin-left:60px}.video-player__time-sep{display:inline-block;margin:0 6px}.video-player__time-sep,.video-player__time-total{color:#fff}.video-player__volume{cursor:pointer;height:24px;display:inline}.video-player__volume::before{content:\"\";width:50px;background:rgba(255,255,255,.35);border-radius:4px;display:block;position:absolute;height:4px;left:70px;bottom:20px}.video-player__volume__current{display:block;position:absolute;height:4px;border-radius:4px;left:70px;bottom:20px;background:#e1b590}.video-player__volume__handle{position:absolute;z-index:3;border-radius:50%;width:12px;height:12px;bottom:16px;left:70px;transition:opacity .1s ease;background:#e1b590;box-shadow:1px 2px 6px rgba(0,0,0,.2);pointer-events:none}.video-player__link{padding:2px 10px}.video-player__link a{text-decoration:none;font-size:14px;font-weight:500;color:#fff}.video-player__link a:hover,.video-player__link a:active,.video-player__link a:focus{text-decoration:underline}.video-player__seek{cursor:pointer;height:24px;position:relative}.video-player__seek::before{content:\"\";width:100%;background:rgba(255,255,255,.35);border-radius:4px;display:block;position:absolute;height:4px;top:10px}.video-player__seek__progress,.video-player__seek__buffer{display:block;position:absolute;height:4px;border-radius:4px;top:10px;background:#e1b590}.video-player__seek__buffer{background:rgba(255,255,255,.2)}.video-player__seek__handle{position:absolute;z-index:3;opacity:0;border-radius:50%;width:12px;height:12px;top:6px;margin-left:-6px;transition:opacity .1s ease;background:#e1b590;box-shadow:1px 2px 6px rgba(0,0,0,.2);pointer-events:none}.video-player__seek__handle.active{opacity:1}.video-player__seek:hover .video-player__seek__handle{opacity:1}.video-player.detailed .video-player__buttons button,.video-player.fullscreen .video-player__buttons button{padding-top:10px;padding-bottom:10px}.directory__list{width:100%;margin:10px 0;transition:opacity 100ms ease-in}.directory__list.loading{opacity:.7}@media screen and (max-width: 415px){.directory__list{margin:0}}.directory__card{box-sizing:border-box;margin-bottom:10px}.directory__card__img{height:125px;position:relative;background:#000;overflow:hidden}.directory__card__img img{display:block;width:100%;height:100%;margin:0;object-fit:cover}.directory__card__bar{display:flex;align-items:center;background:#192432;padding:10px}.directory__card__bar__name{flex:1 1 auto;display:flex;align-items:center;text-decoration:none;overflow:hidden}.directory__card__bar__relationship{width:23px;min-height:1px;flex:0 0 auto}.directory__card__bar .avatar{flex:0 0 auto;width:48px;height:48px;padding-top:2px}.directory__card__bar .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px;background:#040609;object-fit:cover}.directory__card__bar .display-name{margin-left:15px;text-align:left}.directory__card__bar .display-name strong{font-size:15px;color:#fff;font-weight:500;overflow:hidden;text-overflow:ellipsis}.directory__card__bar .display-name span{display:block;font-size:14px;color:#9baec8;font-weight:400;overflow:hidden;text-overflow:ellipsis}.directory__card__extra{background:#121a24;display:flex;align-items:center;justify-content:center}.directory__card__extra .accounts-table__count{width:33.33%;flex:0 0 auto;padding:15px 0}.directory__card__extra .account__header__content{box-sizing:border-box;padding:15px 10px;border-bottom:1px solid #202e3f;width:100%;min-height:48px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.directory__card__extra .account__header__content p{display:none}.directory__card__extra .account__header__content p:first-child{display:inline}.directory__card__extra .account__header__content br{display:none}.account-gallery__container{display:flex;flex-wrap:wrap;padding:4px 2px}.account-gallery__item{border:0;box-sizing:border-box;display:block;position:relative;border-radius:4px;overflow:hidden;margin:2px}.account-gallery__item__icons{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);font-size:24px}.notification__filter-bar,.account__section-headline{background:#0b1016;border-bottom:1px solid #202e3f;cursor:default;display:flex;flex-shrink:0}.notification__filter-bar button,.account__section-headline button{background:#0b1016;border:0;margin:0}.notification__filter-bar button,.notification__filter-bar a,.account__section-headline button,.account__section-headline a{display:block;flex:1 1 auto;color:#9baec8;padding:15px 0;font-size:14px;font-weight:500;text-align:center;text-decoration:none;position:relative}.notification__filter-bar button.active,.notification__filter-bar a.active,.account__section-headline button.active,.account__section-headline a.active{color:#d9e1e8}.notification__filter-bar button.active::before,.notification__filter-bar button.active::after,.notification__filter-bar a.active::before,.notification__filter-bar a.active::after,.account__section-headline button.active::before,.account__section-headline button.active::after,.account__section-headline a.active::before,.account__section-headline a.active::after{display:block;content:\"\";position:absolute;bottom:0;left:50%;width:0;height:0;transform:translateX(-50%);border-style:solid;border-width:0 10px 10px;border-color:transparent transparent #202e3f}.notification__filter-bar button.active::after,.notification__filter-bar a.active::after,.account__section-headline button.active::after,.account__section-headline a.active::after{bottom:-1px;border-color:transparent transparent #121a24}.notification__filter-bar.directory__section-headline,.account__section-headline.directory__section-headline{background:#0f151d;border-bottom-color:transparent}.notification__filter-bar.directory__section-headline a.active::before,.notification__filter-bar.directory__section-headline button.active::before,.account__section-headline.directory__section-headline a.active::before,.account__section-headline.directory__section-headline button.active::before{display:none}.notification__filter-bar.directory__section-headline a.active::after,.notification__filter-bar.directory__section-headline button.active::after,.account__section-headline.directory__section-headline a.active::after,.account__section-headline.directory__section-headline button.active::after{border-color:transparent transparent #06090c}.filter-form{background:#121a24}.filter-form__column{padding:10px 15px}.filter-form .radio-button{display:block}.radio-button{font-size:14px;position:relative;display:inline-block;padding:6px 0;line-height:18px;cursor:default;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer}.radio-button input[type=radio],.radio-button input[type=checkbox]{display:none}.radio-button__input{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:50%;vertical-align:middle}.radio-button__input.checked{border-color:#e1b590;background:#e1b590}::-webkit-scrollbar-thumb{border-radius:0}.search-popout{background:#fff;border-radius:4px;padding:10px 14px;padding-bottom:14px;margin-top:10px;color:#9baec8;box-shadow:2px 4px 15px rgba(0,0,0,.4)}.search-popout h4{color:#9baec8;font-size:14px;font-weight:500;margin-bottom:10px}.search-popout li{padding:4px 0}.search-popout ul{margin-bottom:10px}.search-popout em{font-weight:500;color:#121a24}noscript{text-align:center}noscript img{width:200px;opacity:.5;animation:flicker 4s infinite}noscript div{font-size:14px;margin:30px auto;color:#d9e1e8;max-width:400px}noscript div a{color:#d8a070;text-decoration:underline}noscript div a:hover{text-decoration:none}@keyframes flicker{0%{opacity:1}30%{opacity:.75}100%{opacity:1}}@media screen and (max-width: 630px)and (max-height: 400px){.tabs-bar,.search{will-change:margin-top;transition:margin-top 400ms 100ms}.navigation-bar{will-change:padding-bottom;transition:padding-bottom 400ms 100ms}.navigation-bar>a:first-child{will-change:margin-top,margin-left,margin-right,width;transition:margin-top 400ms 100ms,margin-left 400ms 500ms,margin-right 400ms 500ms}.navigation-bar>.navigation-bar__profile-edit{will-change:margin-top;transition:margin-top 400ms 100ms}.navigation-bar .navigation-bar__actions>.icon-button.close{will-change:opacity transform;transition:opacity 200ms 100ms,transform 400ms 100ms}.navigation-bar .navigation-bar__actions>.compose__action-bar .icon-button{will-change:opacity transform;transition:opacity 200ms 300ms,transform 400ms 100ms}.is-composing .tabs-bar,.is-composing .search{margin-top:-50px}.is-composing .navigation-bar{padding-bottom:0}.is-composing .navigation-bar>a:first-child{margin:-100px 10px 0 -50px}.is-composing .navigation-bar .navigation-bar__profile{padding-top:2px}.is-composing .navigation-bar .navigation-bar__profile-edit{position:absolute;margin-top:-60px}.is-composing .navigation-bar .navigation-bar__actions .icon-button.close{pointer-events:auto;opacity:1;transform:scale(1, 1) translate(0, 0);bottom:5px}.is-composing .navigation-bar .navigation-bar__actions .compose__action-bar .icon-button{pointer-events:none;opacity:0;transform:scale(0, 1) translate(100%, 0)}}.embed-modal{width:auto;max-width:80vw;max-height:80vh}.embed-modal h4{padding:30px;font-weight:500;font-size:16px;text-align:center}.embed-modal .embed-modal__container{padding:10px}.embed-modal .embed-modal__container .hint{margin-bottom:15px}.embed-modal .embed-modal__container .embed-modal__html{outline:0;box-sizing:border-box;display:block;width:100%;border:0;padding:10px;font-family:\"mastodon-font-monospace\",monospace;background:#121a24;color:#fff;font-size:14px;margin:0;margin-bottom:15px;border-radius:4px}.embed-modal .embed-modal__container .embed-modal__html::-moz-focus-inner{border:0}.embed-modal .embed-modal__container .embed-modal__html::-moz-focus-inner,.embed-modal .embed-modal__container .embed-modal__html:focus,.embed-modal .embed-modal__container .embed-modal__html:active{outline:0 !important}.embed-modal .embed-modal__container .embed-modal__html:focus{background:#192432}@media screen and (max-width: 600px){.embed-modal .embed-modal__container .embed-modal__html{font-size:16px}}.embed-modal .embed-modal__container .embed-modal__iframe{width:400px;max-width:100%;overflow:hidden;border:0;border-radius:4px}.account__moved-note{padding:14px 10px;padding-bottom:16px;background:#192432;border-top:1px solid #202e3f;border-bottom:1px solid #202e3f}.account__moved-note__message{position:relative;margin-left:58px;color:#3e5a7c;padding:8px 0;padding-top:0;padding-bottom:4px;font-size:14px}.account__moved-note__message>span{display:block;overflow:hidden;text-overflow:ellipsis}.account__moved-note__icon-wrapper{left:-26px;position:absolute}.account__moved-note .detailed-status__display-avatar{position:relative}.account__moved-note .detailed-status__display-name{margin-bottom:0}.column-inline-form{padding:15px;padding-right:0;display:flex;justify-content:flex-start;align-items:center;background:#192432}.column-inline-form label{flex:1 1 auto}.column-inline-form label input{width:100%}.column-inline-form label input:focus{outline:0}.column-inline-form .icon-button{flex:0 0 auto;margin:0 10px}.drawer__backdrop{cursor:pointer;position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5)}.list-editor{background:#121a24;flex-direction:column;border-radius:8px;box-shadow:2px 4px 15px rgba(0,0,0,.4);width:380px;overflow:hidden}@media screen and (max-width: 420px){.list-editor{width:90%}}.list-editor h4{padding:15px 0;background:#283a50;font-weight:500;font-size:16px;text-align:center;border-radius:8px 8px 0 0}.list-editor .drawer__pager{height:50vh}.list-editor .drawer__inner{border-radius:0 0 8px 8px}.list-editor .drawer__inner.backdrop{width:calc(100% - 60px);box-shadow:2px 4px 15px rgba(0,0,0,.4);border-radius:0 0 0 8px}.list-editor__accounts{overflow-y:auto}.list-editor .account__display-name:hover strong{text-decoration:none}.list-editor .account__avatar{cursor:default}.list-editor .search{margin-bottom:0}.list-adder{background:#121a24;flex-direction:column;border-radius:8px;box-shadow:2px 4px 15px rgba(0,0,0,.4);width:380px;overflow:hidden}@media screen and (max-width: 420px){.list-adder{width:90%}}.list-adder__account{background:#283a50}.list-adder__lists{background:#283a50;height:50vh;border-radius:0 0 8px 8px;overflow-y:auto}.list-adder .list{padding:10px;border-bottom:1px solid #202e3f}.list-adder .list__wrapper{display:flex}.list-adder .list__display-name{flex:1 1 auto;overflow:hidden;text-decoration:none;font-size:16px;padding:10px}.focal-point{position:relative;cursor:move;overflow:hidden;height:100%;display:flex;justify-content:center;align-items:center;background:#000}.focal-point img,.focal-point video,.focal-point canvas{display:block;max-height:80vh;width:100%;height:auto;margin:0;object-fit:contain;background:#000}.focal-point__reticle{position:absolute;width:100px;height:100px;transform:translate(-50%, -50%);background:url(\"~images/reticle.png\") no-repeat 0 0;border-radius:50%;box-shadow:0 0 0 9999em rgba(0,0,0,.35)}.focal-point__overlay{position:absolute;width:100%;height:100%;top:0;left:0}.focal-point__preview{position:absolute;bottom:10px;right:10px;z-index:2;cursor:move;transition:opacity .1s ease}.focal-point__preview:hover{opacity:.5}.focal-point__preview strong{color:#fff;font-size:14px;font-weight:500;display:block;margin-bottom:5px}.focal-point__preview div{border-radius:4px;box-shadow:0 0 14px rgba(0,0,0,.2)}@media screen and (max-width: 480px){.focal-point img,.focal-point video{max-height:100%}.focal-point__preview{display:none}}.account__header__content{color:#9baec8;font-size:14px;font-weight:400;overflow:hidden;word-break:normal;word-wrap:break-word}.account__header__content p{margin-bottom:20px}.account__header__content p:last-child{margin-bottom:0}.account__header__content a{color:inherit;text-decoration:underline}.account__header__content a:hover{text-decoration:none}.account__header{overflow:hidden}.account__header.inactive{opacity:.5}.account__header.inactive .account__header__image,.account__header.inactive .account__avatar{filter:grayscale(100%)}.account__header__info{position:absolute;top:10px;left:10px}.account__header__image{overflow:hidden;height:145px;position:relative;background:#0b1016}.account__header__image img{object-fit:cover;display:block;width:100%;height:100%;margin:0}.account__header__bar{position:relative;background:#192432;padding:5px;border-bottom:1px solid #26374d}.account__header__bar .avatar{display:block;flex:0 0 auto;width:94px;margin-left:-2px}.account__header__bar .avatar .account__avatar{background:#040609;border:2px solid #192432}.account__header__tabs{display:flex;align-items:flex-start;padding:7px 5px;margin-top:-55px}.account__header__tabs__buttons{display:flex;align-items:center;padding-top:55px;overflow:hidden}.account__header__tabs__buttons .icon-button{border:1px solid #26374d;border-radius:4px;box-sizing:content-box;padding:2px}.account__header__tabs__buttons .button{margin:0 8px}.account__header__tabs__name{padding:5px}.account__header__tabs__name .account-role{vertical-align:top}.account__header__tabs__name .emojione{width:22px;height:22px}.account__header__tabs__name h1{font-size:16px;line-height:24px;color:#fff;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.account__header__tabs__name h1 small{display:block;font-size:14px;color:#9baec8;font-weight:400;overflow:hidden;text-overflow:ellipsis}.account__header__tabs .spacer{flex:1 1 auto}.account__header__bio{overflow:hidden;margin:0 -5px}.account__header__bio .account__header__content{padding:20px 15px;padding-bottom:5px;color:#fff}.account__header__bio .account__header__fields{margin:0;border-top:1px solid #26374d}.account__header__bio .account__header__fields a{color:#e1b590}.account__header__bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.account__header__bio .account__header__fields .verified a{color:#79bd9a}.account__header__extra{margin-top:4px}.account__header__extra__links{font-size:14px;color:#9baec8;padding:10px 0}.account__header__extra__links a{display:inline-block;color:#9baec8;text-decoration:none;padding:5px 10px;font-weight:500}.account__header__extra__links a strong{font-weight:700;color:#fff}.trends__header{color:#3e5a7c;background:#151f2b;border-bottom:1px solid #0b1016;font-weight:500;padding:15px;font-size:16px;cursor:default}.trends__header .fa{display:inline-block;margin-right:5px}.trends__item{display:flex;align-items:center;padding:15px;border-bottom:1px solid #202e3f}.trends__item:last-child{border-bottom:0}.trends__item__name{flex:1 1 auto;color:#3e5a7c;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trends__item__name strong{font-weight:500}.trends__item__name a{color:#9baec8;text-decoration:none;font-size:14px;font-weight:500;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trends__item__name a:hover span,.trends__item__name a:focus span,.trends__item__name a:active span{text-decoration:underline}.trends__item__current{flex:0 0 auto;font-size:24px;line-height:36px;font-weight:500;text-align:right;padding-right:15px;margin-left:5px;color:#d9e1e8}.trends__item__sparkline{flex:0 0 auto;width:50px}.trends__item__sparkline path:first-child{fill:rgba(216,160,112,.25) !important;fill-opacity:1 !important}.trends__item__sparkline path:last-child{stroke:#dfb088 !important}.conversation{display:flex;border-bottom:1px solid #202e3f;padding:5px;padding-bottom:0}.conversation:focus{background:#151f2b;outline:0}.conversation__avatar{flex:0 0 auto;padding:10px;padding-top:12px;position:relative}.conversation__unread{display:inline-block;background:#d8a070;border-radius:50%;width:.625rem;height:.625rem;margin:-0.1ex .15em .1ex}.conversation__content{flex:1 1 auto;padding:10px 5px;padding-right:15px;overflow:hidden}.conversation__content__info{overflow:hidden;display:flex;flex-direction:row-reverse;justify-content:space-between}.conversation__content__relative-time{font-size:15px;color:#9baec8;padding-left:15px}.conversation__content__names{color:#9baec8;font-size:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:4px;flex-basis:90px;flex-grow:1}.conversation__content__names a{color:#fff;text-decoration:none}.conversation__content__names a:hover,.conversation__content__names a:focus,.conversation__content__names a:active{text-decoration:underline}.conversation__content a{word-break:break-word}.conversation--unread{background:#151f2b}.conversation--unread:focus{background:#192432}.conversation--unread .conversation__content__info{font-weight:700}.conversation--unread .conversation__content__relative-time{color:#fff}.poll{margin-top:16px;font-size:14px}.poll li{margin-bottom:10px;position:relative}.poll__chart{position:absolute;top:0;left:0;height:100%;display:inline-block;border-radius:4px;background:#6d89af}.poll__chart.leading{background:#d8a070}.poll__text{position:relative;display:flex;padding:6px 0;line-height:18px;cursor:default;overflow:hidden}.poll__text input[type=radio],.poll__text input[type=checkbox]{display:none}.poll__text .autossugest-input{flex:1 1 auto}.poll__text input[type=text]{display:block;box-sizing:border-box;width:100%;font-size:14px;color:#121a24;outline:0;font-family:inherit;background:#fff;border:1px solid #dbdbdb;border-radius:4px;padding:6px 10px}.poll__text input[type=text]:focus{border-color:#d8a070}.poll__text.selectable{cursor:pointer}.poll__text.editable{display:flex;align-items:center;overflow:visible}.poll__input{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:50%;vertical-align:middle;margin-top:auto;margin-bottom:auto;flex:0 0 18px}.poll__input.checkbox{border-radius:4px}.poll__input.active{border-color:#79bd9a;background:#79bd9a}.poll__input:active,.poll__input:focus,.poll__input:hover{border-width:4px;background:none}.poll__input::-moz-focus-inner{outline:0 !important;border:0}.poll__input:focus,.poll__input:active{outline:0 !important}.poll__number{display:inline-block;width:52px;font-weight:700;padding:0 10px;padding-left:8px;text-align:right;margin-top:auto;margin-bottom:auto;flex:0 0 52px}.poll__vote__mark{float:left;line-height:18px}.poll__footer{padding-top:6px;padding-bottom:5px;color:#3e5a7c}.poll__link{display:inline;background:transparent;padding:0;margin:0;border:0;color:#3e5a7c;text-decoration:underline;font-size:inherit}.poll__link:hover{text-decoration:none}.poll__link:active,.poll__link:focus{background-color:rgba(62,90,124,.1)}.poll .button{height:36px;padding:0 16px;margin-right:10px;font-size:14px}.compose-form__poll-wrapper{border-top:1px solid #ebebeb}.compose-form__poll-wrapper ul{padding:10px}.compose-form__poll-wrapper .poll__footer{border-top:1px solid #ebebeb;padding:10px;display:flex;align-items:center}.compose-form__poll-wrapper .poll__footer button,.compose-form__poll-wrapper .poll__footer select{flex:1 1 50%}.compose-form__poll-wrapper .poll__footer button:focus,.compose-form__poll-wrapper .poll__footer select:focus{border-color:#d8a070}.compose-form__poll-wrapper .button.button-secondary{font-size:14px;font-weight:400;padding:6px 10px;height:auto;line-height:inherit;color:#3e5a7c;border-color:#3e5a7c;margin-right:5px}.compose-form__poll-wrapper li{display:flex;align-items:center}.compose-form__poll-wrapper li .poll__text{flex:0 0 auto;width:calc(100% - (23px + 6px));margin-right:6px}.compose-form__poll-wrapper select{appearance:none;box-sizing:border-box;font-size:14px;color:#121a24;display:inline-block;width:auto;outline:0;font-family:inherit;background:#fff url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center/auto 16px;border:1px solid #dbdbdb;border-radius:4px;padding:6px 10px;padding-right:30px}.compose-form__poll-wrapper .icon-button.disabled{color:#dbdbdb}.muted .poll{color:#3e5a7c}.muted .poll__chart{background:rgba(109,137,175,.2)}.muted .poll__chart.leading{background:rgba(216,160,112,.2)}.modal-layout{background:#121a24 url('data:image/svg+xml;utf8,') repeat-x bottom fixed;display:flex;flex-direction:column;height:100vh;padding:0}.modal-layout__mastodon{display:flex;flex:1;flex-direction:column;justify-content:flex-end}.modal-layout__mastodon>*{flex:1;max-height:235px}@media screen and (max-width: 600px){.account-header{margin-top:0}}.emoji-mart{font-size:13px;display:inline-block;color:#121a24}.emoji-mart,.emoji-mart *{box-sizing:border-box;line-height:1.15}.emoji-mart .emoji-mart-emoji{padding:6px}.emoji-mart-bar{border:0 solid #c0cdd9}.emoji-mart-bar:first-child{border-bottom-width:1px;border-top-left-radius:5px;border-top-right-radius:5px;background:#d9e1e8}.emoji-mart-bar:last-child{border-top-width:1px;border-bottom-left-radius:5px;border-bottom-right-radius:5px;display:none}.emoji-mart-anchors{display:flex;justify-content:space-between;padding:0 6px;color:#3e5a7c;line-height:0}.emoji-mart-anchor{position:relative;flex:1;text-align:center;padding:12px 4px;overflow:hidden;transition:color .1s ease-out;cursor:pointer}.emoji-mart-anchor:hover{color:#37506f}.emoji-mart-anchor-selected{color:#d8a070}.emoji-mart-anchor-selected:hover{color:#d49560}.emoji-mart-anchor-selected .emoji-mart-anchor-bar{bottom:-1px}.emoji-mart-anchor-bar{position:absolute;bottom:-5px;left:0;width:100%;height:4px;background-color:#d8a070}.emoji-mart-anchors i{display:inline-block;width:100%;max-width:22px}.emoji-mart-anchors svg{fill:currentColor;max-height:18px}.emoji-mart-scroll{overflow-y:scroll;height:270px;max-height:35vh;padding:0 6px 6px;background:#fff;will-change:transform}.emoji-mart-scroll::-webkit-scrollbar-track:hover,.emoji-mart-scroll::-webkit-scrollbar-track:active{background-color:rgba(0,0,0,.3)}.emoji-mart-search{padding:10px;padding-right:45px;background:#fff}.emoji-mart-search input{font-size:14px;font-weight:400;padding:7px 9px;font-family:inherit;display:block;width:100%;background:rgba(217,225,232,.3);color:#121a24;border:1px solid #d9e1e8;border-radius:4px}.emoji-mart-search input::-moz-focus-inner{border:0}.emoji-mart-search input::-moz-focus-inner,.emoji-mart-search input:focus,.emoji-mart-search input:active{outline:0 !important}.emoji-mart-category .emoji-mart-emoji{cursor:pointer}.emoji-mart-category .emoji-mart-emoji span{z-index:1;position:relative;text-align:center}.emoji-mart-category .emoji-mart-emoji:hover::before{z-index:0;content:\"\";position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(217,225,232,.7);border-radius:100%}.emoji-mart-category-label{z-index:2;position:relative;position:-webkit-sticky;position:sticky;top:0}.emoji-mart-category-label span{display:block;width:100%;font-weight:500;padding:5px 6px;background:#fff}.emoji-mart-emoji{position:relative;display:inline-block;font-size:0}.emoji-mart-emoji span{width:22px;height:22px}.emoji-mart-no-results{font-size:14px;text-align:center;padding-top:70px;color:#9baec8}.emoji-mart-no-results .emoji-mart-category-label{display:none}.emoji-mart-no-results .emoji-mart-no-results-label{margin-top:.2em}.emoji-mart-no-results .emoji-mart-emoji:hover::before{content:none}.emoji-mart-preview{display:none}.container{box-sizing:border-box;max-width:1235px;margin:0 auto;position:relative}@media screen and (max-width: 1255px){.container{width:100%;padding:0 10px}}.rich-formatting{font-family:\"mastodon-font-sans-serif\",sans-serif;font-size:14px;font-weight:400;line-height:1.7;word-wrap:break-word;color:#9baec8}.rich-formatting a{color:#d8a070;text-decoration:underline}.rich-formatting a:hover,.rich-formatting a:focus,.rich-formatting a:active{text-decoration:none}.rich-formatting p,.rich-formatting li{color:#9baec8}.rich-formatting p{margin-top:0;margin-bottom:.85em}.rich-formatting p:last-child{margin-bottom:0}.rich-formatting strong{font-weight:700;color:#d9e1e8}.rich-formatting em{font-style:italic;color:#d9e1e8}.rich-formatting code{font-size:.85em;background:#040609;border-radius:4px;padding:.2em .3em}.rich-formatting h1,.rich-formatting h2,.rich-formatting h3,.rich-formatting h4,.rich-formatting h5,.rich-formatting h6{font-family:\"mastodon-font-display\",sans-serif;margin-top:1.275em;margin-bottom:.85em;font-weight:500;color:#d9e1e8}.rich-formatting h1{font-size:2em}.rich-formatting h2{font-size:1.75em}.rich-formatting h3{font-size:1.5em}.rich-formatting h4{font-size:1.25em}.rich-formatting h5,.rich-formatting h6{font-size:1em}.rich-formatting ul{list-style:disc}.rich-formatting ol{list-style:decimal}.rich-formatting ul,.rich-formatting ol{margin:0;padding:0;padding-left:2em;margin-bottom:.85em}.rich-formatting ul[type=a],.rich-formatting ol[type=a]{list-style-type:lower-alpha}.rich-formatting ul[type=i],.rich-formatting ol[type=i]{list-style-type:lower-roman}.rich-formatting hr{width:100%;height:0;border:0;border-bottom:1px solid #192432;margin:1.7em 0}.rich-formatting hr.spacer{height:1px;border:0}.rich-formatting table{width:100%;border-collapse:collapse;break-inside:auto;margin-top:24px;margin-bottom:32px}.rich-formatting table thead tr,.rich-formatting table tbody tr{border-bottom:1px solid #192432;font-size:1em;line-height:1.625;font-weight:400;text-align:left;color:#9baec8}.rich-formatting table thead tr{border-bottom-width:2px;line-height:1.5;font-weight:500;color:#3e5a7c}.rich-formatting table th,.rich-formatting table td{padding:8px;align-self:start;align-items:start;word-break:break-all}.rich-formatting table th.nowrap,.rich-formatting table td.nowrap{width:25%;position:relative}.rich-formatting table th.nowrap::before,.rich-formatting table td.nowrap::before{content:\" \";visibility:hidden}.rich-formatting table th.nowrap span,.rich-formatting table td.nowrap span{position:absolute;left:8px;right:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rich-formatting>:first-child{margin-top:0}.information-board{background:#0b1016;padding:20px 0}.information-board .container-alt{position:relative;padding-right:295px}.information-board__sections{display:flex;justify-content:space-between;flex-wrap:wrap}.information-board__section{flex:1 0 0;font-family:\"mastodon-font-sans-serif\",sans-serif;font-size:16px;line-height:28px;color:#fff;text-align:right;padding:10px 15px}.information-board__section span,.information-board__section strong{display:block}.information-board__section span:last-child{color:#d9e1e8}.information-board__section strong{font-family:\"mastodon-font-display\",sans-serif;font-weight:500;font-size:32px;line-height:48px}@media screen and (max-width: 700px){.information-board__section{text-align:center}}.information-board .panel{position:absolute;width:280px;box-sizing:border-box;background:#040609;padding:20px;padding-top:10px;border-radius:4px 4px 0 0;right:0;bottom:-40px}.information-board .panel .panel-header{font-family:\"mastodon-font-display\",sans-serif;font-size:14px;line-height:24px;font-weight:500;color:#9baec8;padding-bottom:5px;margin-bottom:15px;border-bottom:1px solid #192432;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.information-board .panel .panel-header a,.information-board .panel .panel-header span{font-weight:400;color:#7a93b6}.information-board .panel .panel-header a{text-decoration:none}.information-board .owner{text-align:center}.information-board .owner .avatar{width:80px;height:80px;margin:0 auto;margin-bottom:15px}.information-board .owner .avatar img{display:block;width:80px;height:80px;border-radius:48px}.information-board .owner .name{font-size:14px}.information-board .owner .name a{display:block;color:#fff;text-decoration:none}.information-board .owner .name a:hover .display_name{text-decoration:underline}.information-board .owner .name .username{display:block;color:#9baec8}.landing-page p,.landing-page li{font-family:\"mastodon-font-sans-serif\",sans-serif;font-size:16px;font-weight:400;font-size:16px;line-height:30px;margin-bottom:12px;color:#9baec8}.landing-page p a,.landing-page li a{color:#d8a070;text-decoration:underline}.landing-page em{display:inline;margin:0;padding:0;font-weight:700;background:transparent;font-family:inherit;font-size:inherit;line-height:inherit;color:#bcc9da}.landing-page h1{font-family:\"mastodon-font-display\",sans-serif;font-size:26px;line-height:30px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page h1 small{font-family:\"mastodon-font-sans-serif\",sans-serif;display:block;font-size:18px;font-weight:400;color:#bcc9da}.landing-page h2{font-family:\"mastodon-font-display\",sans-serif;font-size:22px;line-height:26px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page h3{font-family:\"mastodon-font-display\",sans-serif;font-size:18px;line-height:24px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page h4{font-family:\"mastodon-font-display\",sans-serif;font-size:16px;line-height:24px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page h5{font-family:\"mastodon-font-display\",sans-serif;font-size:14px;line-height:24px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page h6{font-family:\"mastodon-font-display\",sans-serif;font-size:12px;line-height:24px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page ul,.landing-page ol{margin-left:20px}.landing-page ul[type=a],.landing-page ol[type=a]{list-style-type:lower-alpha}.landing-page ul[type=i],.landing-page ol[type=i]{list-style-type:lower-roman}.landing-page ul{list-style:disc}.landing-page ol{list-style:decimal}.landing-page li>ol,.landing-page li>ul{margin-top:6px}.landing-page hr{width:100%;height:0;border:0;border-bottom:1px solid rgba(62,90,124,.6);margin:20px 0}.landing-page hr.spacer{height:1px;border:0}.landing-page__information,.landing-page__forms{padding:20px}.landing-page__call-to-action{background:#121a24;border-radius:4px;padding:25px 40px;overflow:hidden;box-sizing:border-box}.landing-page__call-to-action .row{width:100%;display:flex;flex-direction:row-reverse;flex-wrap:nowrap;justify-content:space-between;align-items:center}.landing-page__call-to-action .row__information-board{display:flex;justify-content:flex-end;align-items:flex-end}.landing-page__call-to-action .row__information-board .information-board__section{flex:1 0 auto;padding:0 10px}@media screen and (max-width: 415px){.landing-page__call-to-action .row__information-board{width:100%;justify-content:space-between}}.landing-page__call-to-action .row__mascot{flex:1;margin:10px -50px 0 0}@media screen and (max-width: 415px){.landing-page__call-to-action .row__mascot{display:none}}.landing-page__logo{margin-right:20px}.landing-page__logo img{height:50px;width:auto;mix-blend-mode:lighten}.landing-page__information{padding:45px 40px;margin-bottom:10px}.landing-page__information:last-child{margin-bottom:0}.landing-page__information strong{font-weight:500;color:#bcc9da}.landing-page__information .account{border-bottom:0;padding:0}.landing-page__information .account__display-name{align-items:center;display:flex;margin-right:5px}.landing-page__information .account div.account__display-name:hover .display-name strong{text-decoration:none}.landing-page__information .account div.account__display-name .account__avatar{cursor:default}.landing-page__information .account__avatar-wrapper{margin-left:0;flex:0 0 auto}.landing-page__information .account__avatar{width:44px;height:44px;background-size:44px 44px}.landing-page__information .account .display-name{font-size:15px}.landing-page__information .account .display-name__account{font-size:14px}@media screen and (max-width: 960px){.landing-page__information .contact{margin-top:30px}}@media screen and (max-width: 700px){.landing-page__information{padding:25px 20px}}.landing-page__information,.landing-page__forms,.landing-page #mastodon-timeline{box-sizing:border-box;background:#121a24;border-radius:4px;box-shadow:0 0 6px rgba(0,0,0,.1)}.landing-page__mascot{height:104px;position:relative;left:-40px;bottom:25px}.landing-page__mascot img{height:190px;width:auto}.landing-page__short-description .row{display:flex;flex-wrap:wrap;align-items:center;margin-bottom:40px}@media screen and (max-width: 700px){.landing-page__short-description .row{margin-bottom:20px}}.landing-page__short-description p a{color:#d9e1e8}.landing-page__short-description h1{font-weight:500;color:#fff;margin-bottom:0}.landing-page__short-description h1 small{color:#9baec8}.landing-page__short-description h1 small span{color:#d9e1e8}.landing-page__short-description p:last-child{margin-bottom:0}.landing-page__hero{margin-bottom:10px}.landing-page__hero img{display:block;margin:0;max-width:100%;height:auto;border-radius:4px}@media screen and (max-width: 840px){.landing-page .information-board .container-alt{padding-right:20px}.landing-page .information-board .panel{position:static;margin-top:20px;width:100%;border-radius:4px}.landing-page .information-board .panel .panel-header{text-align:center}}@media screen and (max-width: 675px){.landing-page .header-wrapper{padding-top:0}.landing-page .header-wrapper.compact{padding-bottom:0}.landing-page .header-wrapper.compact .hero .heading{text-align:initial}.landing-page .header .container-alt,.landing-page .features .container-alt{display:block}}.landing-page .cta{margin:20px}.landing{margin-bottom:100px}@media screen and (max-width: 738px){.landing{margin-bottom:0}}.landing__brand{display:flex;justify-content:center;align-items:center;padding:50px}.landing__brand svg{fill:#fff;height:52px}@media screen and (max-width: 415px){.landing__brand{padding:0;margin-bottom:30px}}.landing .directory{margin-top:30px;background:transparent;box-shadow:none;border-radius:0}.landing .hero-widget{margin-top:30px;margin-bottom:0}.landing .hero-widget h4{padding:10px;font-weight:700;font-size:14px;color:#9baec8}.landing .hero-widget__text{border-radius:0;padding-bottom:0}.landing .hero-widget__footer{background:#121a24;padding:10px;border-radius:0 0 4px 4px;display:flex}.landing .hero-widget__footer__column{flex:1 1 50%}.landing .hero-widget .account{padding:10px 0;border-bottom:0}.landing .hero-widget .account .account__display-name{display:flex;align-items:center}.landing .hero-widget .account .account__avatar{width:44px;height:44px;background-size:44px 44px}.landing .hero-widget__counter{padding:10px}.landing .hero-widget__counter strong{font-family:\"mastodon-font-display\",sans-serif;font-size:15px;font-weight:700;display:block}.landing .hero-widget__counter span{font-size:14px;color:#9baec8}.landing .simple_form .user_agreement .label_input>label{font-weight:400;color:#9baec8}.landing .simple_form p.lead{color:#9baec8;font-size:15px;line-height:20px;font-weight:400;margin-bottom:25px}.landing__grid{max-width:960px;margin:0 auto;display:grid;grid-template-columns:minmax(0, 50%) minmax(0, 50%);grid-gap:30px}@media screen and (max-width: 738px){.landing__grid{grid-template-columns:minmax(0, 100%);grid-gap:10px}.landing__grid__column-login{grid-row:1;display:flex;flex-direction:column}.landing__grid__column-login .box-widget{order:2;flex:0 0 auto}.landing__grid__column-login .hero-widget{margin-top:0;margin-bottom:10px;order:1;flex:0 0 auto}.landing__grid__column-registration{grid-row:2}.landing__grid .directory{margin-top:10px}}@media screen and (max-width: 415px){.landing__grid{grid-gap:0}.landing__grid .hero-widget{display:block;margin-bottom:0;box-shadow:none}.landing__grid .hero-widget__img,.landing__grid .hero-widget__img img,.landing__grid .hero-widget__footer{border-radius:0}.landing__grid .hero-widget,.landing__grid .box-widget,.landing__grid .directory__tag{border-bottom:1px solid #202e3f}.landing__grid .directory{margin-top:0}.landing__grid .directory__tag{margin-bottom:0}.landing__grid .directory__tag>a,.landing__grid .directory__tag>div{border-radius:0;box-shadow:none}.landing__grid .directory__tag:last-child{border-bottom:0}}.brand{position:relative;text-decoration:none}.brand__tagline{display:block;position:absolute;bottom:-10px;left:50px;width:300px;color:#9baec8;text-decoration:none;font-size:14px}@media screen and (max-width: 415px){.brand__tagline{position:static;width:auto;margin-top:20px;color:#3e5a7c}}.table{width:100%;max-width:100%;border-spacing:0;border-collapse:collapse}.table th,.table td{padding:8px;line-height:18px;vertical-align:top;border-top:1px solid #121a24;text-align:left;background:#0b1016}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #121a24;border-top:0;font-weight:500}.table>tbody>tr>th{font-weight:500}.table>tbody>tr:nth-child(odd)>td,.table>tbody>tr:nth-child(odd)>th{background:#121a24}.table a{color:#d8a070;text-decoration:underline}.table a:hover{text-decoration:none}.table strong{font-weight:500}.table strong:lang(ja){font-weight:700}.table strong:lang(ko){font-weight:700}.table strong:lang(zh-CN){font-weight:700}.table strong:lang(zh-HK){font-weight:700}.table strong:lang(zh-TW){font-weight:700}.table.inline-table>tbody>tr:nth-child(odd)>td,.table.inline-table>tbody>tr:nth-child(odd)>th{background:transparent}.table.inline-table>tbody>tr:first-child>td,.table.inline-table>tbody>tr:first-child>th{border-top:0}.table.batch-table>thead>tr>th{background:#121a24;border-top:1px solid #040609;border-bottom:1px solid #040609}.table.batch-table>thead>tr>th:first-child{border-radius:4px 0 0;border-left:1px solid #040609}.table.batch-table>thead>tr>th:last-child{border-radius:0 4px 0 0;border-right:1px solid #040609}.table--invites tbody td{vertical-align:middle}.table-wrapper{overflow:auto;margin-bottom:20px}samp{font-family:\"mastodon-font-monospace\",monospace}button.table-action-link{background:transparent;border:0;font:inherit}button.table-action-link,a.table-action-link{text-decoration:none;display:inline-block;margin-right:5px;padding:0 10px;color:#9baec8;font-weight:500}button.table-action-link:hover,a.table-action-link:hover{color:#fff}button.table-action-link i.fa,a.table-action-link i.fa{font-weight:400;margin-right:5px}button.table-action-link:first-child,a.table-action-link:first-child{padding-left:0}.batch-table__toolbar,.batch-table__row{display:flex}.batch-table__toolbar__select,.batch-table__row__select{box-sizing:border-box;padding:8px 16px;cursor:pointer;min-height:100%}.batch-table__toolbar__select input,.batch-table__row__select input{margin-top:8px}.batch-table__toolbar__select--aligned,.batch-table__row__select--aligned{display:flex;align-items:center}.batch-table__toolbar__select--aligned input,.batch-table__row__select--aligned input{margin-top:0}.batch-table__toolbar__actions,.batch-table__toolbar__content,.batch-table__row__actions,.batch-table__row__content{padding:8px 0;padding-right:16px;flex:1 1 auto}.batch-table__toolbar{border:1px solid #040609;background:#121a24;border-radius:4px 0 0;height:47px;align-items:center}.batch-table__toolbar__actions{text-align:right;padding-right:11px}.batch-table__form{padding:16px;border:1px solid #040609;border-top:0;background:#121a24}.batch-table__form .fields-row{padding-top:0;margin-bottom:0}.batch-table__row{border:1px solid #040609;border-top:0;background:#0b1016}@media screen and (max-width: 415px){.optional .batch-table__row:first-child{border-top:1px solid #040609}}.batch-table__row:hover{background:#0f151d}.batch-table__row:nth-child(even){background:#121a24}.batch-table__row:nth-child(even):hover{background:#151f2b}.batch-table__row__content{padding-top:12px;padding-bottom:16px}.batch-table__row__content--unpadded{padding:0}.batch-table__row__content--with-image{display:flex;align-items:center}.batch-table__row__content__image{flex:0 0 auto;display:flex;justify-content:center;align-items:center;margin-right:10px}.batch-table__row__content__image .emojione{width:32px;height:32px}.batch-table__row__content__text{flex:1 1 auto}.batch-table__row__content__extra{flex:0 0 auto;text-align:right;color:#9baec8;font-weight:500}.batch-table__row .directory__tag{margin:0;width:100%}.batch-table__row .directory__tag a{background:transparent;border-radius:0}@media screen and (max-width: 415px){.batch-table.optional .batch-table__toolbar,.batch-table.optional .batch-table__row__select{display:none}}.batch-table .status__content{padding-top:0}.batch-table .status__content summary{display:list-item}.batch-table .status__content strong{font-weight:700}.batch-table .nothing-here{border:1px solid #040609;border-top:0;box-shadow:none}@media screen and (max-width: 415px){.batch-table .nothing-here{border-top:1px solid #040609}}@media screen and (max-width: 870px){.batch-table .accounts-table tbody td.optional{display:none}}.admin-wrapper{display:flex;justify-content:center;width:100%;min-height:100vh}.admin-wrapper .sidebar-wrapper{min-height:100vh;overflow:hidden;pointer-events:none;flex:1 1 auto}.admin-wrapper .sidebar-wrapper__inner{display:flex;justify-content:flex-end;background:#121a24;height:100%}.admin-wrapper .sidebar{width:240px;padding:0;pointer-events:auto}.admin-wrapper .sidebar__toggle{display:none;background:#202e3f;height:48px}.admin-wrapper .sidebar__toggle__logo{flex:1 1 auto}.admin-wrapper .sidebar__toggle__logo a{display:inline-block;padding:15px}.admin-wrapper .sidebar__toggle__logo svg{fill:#fff;height:20px;position:relative;bottom:-2px}.admin-wrapper .sidebar__toggle__icon{display:block;color:#9baec8;text-decoration:none;flex:0 0 auto;font-size:20px;padding:15px}.admin-wrapper .sidebar__toggle a:hover,.admin-wrapper .sidebar__toggle a:focus,.admin-wrapper .sidebar__toggle a:active{background:#26374d}.admin-wrapper .sidebar .logo{display:block;margin:40px auto;width:100px;height:100px}@media screen and (max-width: 600px){.admin-wrapper .sidebar>a:first-child{display:none}}.admin-wrapper .sidebar ul{list-style:none;border-radius:4px 0 0 4px;overflow:hidden;margin-bottom:20px}@media screen and (max-width: 600px){.admin-wrapper .sidebar ul{margin-bottom:0}}.admin-wrapper .sidebar ul a{display:block;padding:15px;color:#9baec8;text-decoration:none;transition:all 200ms linear;transition-property:color,background-color;border-radius:4px 0 0 4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.admin-wrapper .sidebar ul a i.fa{margin-right:5px}.admin-wrapper .sidebar ul a:hover{color:#fff;background-color:#0a0e13;transition:all 100ms linear;transition-property:color,background-color}.admin-wrapper .sidebar ul a.selected{background:#0f151d;border-radius:4px 0 0}.admin-wrapper .sidebar ul ul{background:#0b1016;border-radius:0 0 0 4px;margin:0}.admin-wrapper .sidebar ul ul a{border:0;padding:15px 35px}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a{color:#fff;background-color:#d8a070;border-bottom:0;border-radius:0}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a:hover{background-color:#ddad84}.admin-wrapper .sidebar>ul>.simple-navigation-active-leaf a{border-radius:4px 0 0 4px}.admin-wrapper .content-wrapper{box-sizing:border-box;width:100%;max-width:840px;flex:1 1 auto}@media screen and (max-width: 1080px){.admin-wrapper .sidebar-wrapper--empty{display:none}.admin-wrapper .sidebar-wrapper{width:240px;flex:0 0 auto}}@media screen and (max-width: 600px){.admin-wrapper .sidebar-wrapper{width:100%}}.admin-wrapper .content{padding:20px 15px;padding-top:60px;padding-left:25px}@media screen and (max-width: 600px){.admin-wrapper .content{max-width:none;padding:15px;padding-top:30px}}.admin-wrapper .content-heading{display:flex;padding-bottom:40px;border-bottom:1px solid #202e3f;margin:-15px -15px 40px 0;flex-wrap:wrap;align-items:center;justify-content:space-between}.admin-wrapper .content-heading>*{margin-top:15px;margin-right:15px}.admin-wrapper .content-heading-actions{display:inline-flex}.admin-wrapper .content-heading-actions>:not(:first-child){margin-left:5px}@media screen and (max-width: 600px){.admin-wrapper .content-heading{border-bottom:0;padding-bottom:0}}.admin-wrapper .content h2{color:#d9e1e8;font-size:24px;line-height:28px;font-weight:400}@media screen and (max-width: 600px){.admin-wrapper .content h2{font-weight:700}}.admin-wrapper .content h3{color:#d9e1e8;font-size:20px;line-height:28px;font-weight:400;margin-bottom:30px}.admin-wrapper .content h4{font-size:14px;font-weight:700;color:#9baec8;padding-bottom:8px;margin-bottom:8px;border-bottom:1px solid #202e3f}.admin-wrapper .content h6{font-size:16px;color:#d9e1e8;line-height:28px;font-weight:500}.admin-wrapper .content .fields-group h6{color:#fff;font-weight:500}.admin-wrapper .content .directory__tag>a,.admin-wrapper .content .directory__tag>div{box-shadow:none}.admin-wrapper .content .directory__tag .table-action-link .fa{color:inherit}.admin-wrapper .content .directory__tag h4{font-size:18px;font-weight:700;color:#fff;text-transform:none;padding-bottom:0;margin-bottom:0;border-bottom:0}.admin-wrapper .content>p{font-size:14px;line-height:21px;color:#d9e1e8;margin-bottom:20px}.admin-wrapper .content>p strong{color:#fff;font-weight:500}.admin-wrapper .content>p strong:lang(ja){font-weight:700}.admin-wrapper .content>p strong:lang(ko){font-weight:700}.admin-wrapper .content>p strong:lang(zh-CN){font-weight:700}.admin-wrapper .content>p strong:lang(zh-HK){font-weight:700}.admin-wrapper .content>p strong:lang(zh-TW){font-weight:700}.admin-wrapper .content hr{width:100%;height:0;border:0;border-bottom:1px solid rgba(62,90,124,.6);margin:20px 0}.admin-wrapper .content hr.spacer{height:1px;border:0}@media screen and (max-width: 600px){.admin-wrapper{display:block}.admin-wrapper .sidebar-wrapper{min-height:0}.admin-wrapper .sidebar{width:100%;padding:0;height:auto}.admin-wrapper .sidebar__toggle{display:flex}.admin-wrapper .sidebar>ul{display:none}.admin-wrapper .sidebar ul a,.admin-wrapper .sidebar ul ul a{border-radius:0;border-bottom:1px solid #192432;transition:none}.admin-wrapper .sidebar ul a:hover,.admin-wrapper .sidebar ul ul a:hover{transition:none}.admin-wrapper .sidebar ul ul{border-radius:0}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a{border-bottom-color:#d8a070}}hr.spacer{width:100%;border:0;margin:20px 0;height:1px}body .muted-hint,.admin-wrapper .content .muted-hint{color:#9baec8}body .muted-hint a,.admin-wrapper .content .muted-hint a{color:#d8a070}body .positive-hint,.admin-wrapper .content .positive-hint{color:#79bd9a;font-weight:500}body .negative-hint,.admin-wrapper .content .negative-hint{color:#df405a;font-weight:500}body .neutral-hint,.admin-wrapper .content .neutral-hint{color:#3e5a7c;font-weight:500}body .warning-hint,.admin-wrapper .content .warning-hint{color:#ca8f04;font-weight:500}.filters{display:flex;flex-wrap:wrap}.filters .filter-subset{flex:0 0 auto;margin:0 40px 20px 0}.filters .filter-subset:last-child{margin-bottom:30px}.filters .filter-subset ul{margin-top:5px;list-style:none}.filters .filter-subset ul li{display:inline-block;margin-right:5px}.filters .filter-subset strong{font-weight:500;font-size:13px}.filters .filter-subset strong:lang(ja){font-weight:700}.filters .filter-subset strong:lang(ko){font-weight:700}.filters .filter-subset strong:lang(zh-CN){font-weight:700}.filters .filter-subset strong:lang(zh-HK){font-weight:700}.filters .filter-subset strong:lang(zh-TW){font-weight:700}.filters .filter-subset a{display:inline-block;color:#9baec8;text-decoration:none;font-size:13px;font-weight:500;border-bottom:2px solid #121a24}.filters .filter-subset a:hover{color:#fff;border-bottom:2px solid #1b2635}.filters .filter-subset a.selected{color:#d8a070;border-bottom:2px solid #d8a070}.flavour-screen{display:block;margin:10px auto;max-width:100%}.flavour-description{display:block;font-size:16px;margin:10px 0}.flavour-description>p{margin:10px 0}.flavour-screen{display:block;margin:10px auto;max-width:100%}.flavour-description{display:block;font-size:16px;margin:10px 0}.flavour-description>p{margin:10px 0}.report-accounts{display:flex;flex-wrap:wrap;margin-bottom:20px}.report-accounts__item{display:flex;flex:250px;flex-direction:column;margin:0 5px}.report-accounts__item>strong{display:block;margin:0 0 10px -5px;font-weight:500;font-size:14px;line-height:18px;color:#d9e1e8}.report-accounts__item>strong:lang(ja){font-weight:700}.report-accounts__item>strong:lang(ko){font-weight:700}.report-accounts__item>strong:lang(zh-CN){font-weight:700}.report-accounts__item>strong:lang(zh-HK){font-weight:700}.report-accounts__item>strong:lang(zh-TW){font-weight:700}.report-accounts__item .account-card{flex:1 1 auto}.report-status,.account-status{display:flex;margin-bottom:10px}.report-status .activity-stream,.account-status .activity-stream{flex:2 0 0;margin-right:20px;max-width:calc(100% - 60px)}.report-status .activity-stream .entry,.account-status .activity-stream .entry{border-radius:4px}.report-status__actions,.account-status__actions{flex:0 0 auto;display:flex;flex-direction:column}.report-status__actions .icon-button,.account-status__actions .icon-button{font-size:24px;width:24px;text-align:center;margin-bottom:10px}.simple_form.new_report_note,.simple_form.new_account_moderation_note{max-width:100%}.batch-form-box{display:flex;flex-wrap:wrap;margin-bottom:5px}.batch-form-box #form_status_batch_action{margin:0 5px 5px 0;font-size:14px}.batch-form-box input.button{margin:0 5px 5px 0}.batch-form-box .media-spoiler-toggle-buttons{margin-left:auto}.batch-form-box .media-spoiler-toggle-buttons .button{overflow:visible;margin:0 0 5px 5px;float:right}.back-link{margin-bottom:10px;font-size:14px}.back-link a{color:#d8a070;text-decoration:none}.back-link a:hover{text-decoration:underline}.spacer{flex:1 1 auto}.log-entry{margin-bottom:20px;line-height:20px}.log-entry__header{display:flex;justify-content:flex-start;align-items:center;padding:10px;background:#121a24;color:#9baec8;border-radius:4px 4px 0 0;font-size:14px;position:relative}.log-entry__avatar{margin-right:10px}.log-entry__avatar .avatar{display:block;margin:0;border-radius:50%;width:40px;height:40px}.log-entry__content{max-width:calc(100% - 90px)}.log-entry__title{word-wrap:break-word}.log-entry__timestamp{color:#3e5a7c}.log-entry__extras{background:#1c2938;border-radius:0 0 4px 4px;padding:10px;color:#9baec8;font-family:\"mastodon-font-monospace\",monospace;font-size:12px;word-wrap:break-word;min-height:20px}.log-entry__icon{font-size:28px;margin-right:10px;color:#3e5a7c}.log-entry__icon__overlay{position:absolute;top:10px;right:10px;width:10px;height:10px;border-radius:50%}.log-entry__icon__overlay.positive{background:#79bd9a}.log-entry__icon__overlay.negative{background:#e87487}.log-entry__icon__overlay.neutral{background:#d8a070}.log-entry a,.log-entry .username,.log-entry .target{color:#d9e1e8;text-decoration:none;font-weight:500}.log-entry .diff-old{color:#e87487}.log-entry .diff-neutral{color:#d9e1e8}.log-entry .diff-new{color:#79bd9a}a.name-tag,.name-tag,a.inline-name-tag,.inline-name-tag{text-decoration:none;color:#d9e1e8}a.name-tag .username,.name-tag .username,a.inline-name-tag .username,.inline-name-tag .username{font-weight:500}a.name-tag.suspended .username,.name-tag.suspended .username,a.inline-name-tag.suspended .username,.inline-name-tag.suspended .username{text-decoration:line-through;color:#e87487}a.name-tag.suspended .avatar,.name-tag.suspended .avatar,a.inline-name-tag.suspended .avatar,.inline-name-tag.suspended .avatar{filter:grayscale(100%);opacity:.8}a.name-tag,.name-tag{display:flex;align-items:center}a.name-tag .avatar,.name-tag .avatar{display:block;margin:0;margin-right:5px;border-radius:50%}a.name-tag.suspended .avatar,.name-tag.suspended .avatar{filter:grayscale(100%);opacity:.8}.speech-bubble{margin-bottom:20px;border-left:4px solid #d8a070}.speech-bubble.positive{border-left-color:#79bd9a}.speech-bubble.negative{border-left-color:#e87487}.speech-bubble.warning{border-left-color:#ca8f04}.speech-bubble__bubble{padding:16px;padding-left:14px;font-size:15px;line-height:20px;border-radius:4px 4px 4px 0;position:relative;font-weight:500}.speech-bubble__bubble a{color:#9baec8}.speech-bubble__owner{padding:8px;padding-left:12px}.speech-bubble time{color:#3e5a7c}.report-card{background:#121a24;border-radius:4px;margin-bottom:20px}.report-card__profile{display:flex;justify-content:space-between;align-items:center;padding:15px}.report-card__profile .account{padding:0;border:0}.report-card__profile .account__avatar-wrapper{margin-left:0}.report-card__profile__stats{flex:0 0 auto;font-weight:500;color:#9baec8;text-align:right}.report-card__profile__stats a{color:inherit;text-decoration:none}.report-card__profile__stats a:focus,.report-card__profile__stats a:hover,.report-card__profile__stats a:active{color:#b5c3d6}.report-card__profile__stats .red{color:#df405a}.report-card__summary__item{display:flex;justify-content:flex-start;border-top:1px solid #0b1016}.report-card__summary__item:hover{background:#151f2b}.report-card__summary__item__reported-by,.report-card__summary__item__assigned{padding:15px;flex:0 0 auto;box-sizing:border-box;width:150px;color:#9baec8}.report-card__summary__item__reported-by,.report-card__summary__item__reported-by .username,.report-card__summary__item__assigned,.report-card__summary__item__assigned .username{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.report-card__summary__item__content{flex:1 1 auto;max-width:calc(100% - 300px)}.report-card__summary__item__content__icon{color:#3e5a7c;margin-right:4px;font-weight:500}.report-card__summary__item__content a{display:block;box-sizing:border-box;width:100%;padding:15px;text-decoration:none;color:#9baec8}.one-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ellipsized-ip{display:inline-block;max-width:120px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.admin-account-bio{display:flex;flex-wrap:wrap;margin:0 -5px;margin-top:20px}.admin-account-bio>div{box-sizing:border-box;padding:0 5px;margin-bottom:10px;flex:1 0 50%}.admin-account-bio .account__header__fields,.admin-account-bio .account__header__content{background:#202e3f;border-radius:4px;height:100%}.admin-account-bio .account__header__fields{margin:0;border:0}.admin-account-bio .account__header__fields a{color:#e1b590}.admin-account-bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.admin-account-bio .account__header__fields .verified a{color:#79bd9a}.admin-account-bio .account__header__content{box-sizing:border-box;padding:20px;color:#fff}.center-text{text-align:center}.dashboard__counters{display:flex;flex-wrap:wrap;margin:0 -5px;margin-bottom:20px}.dashboard__counters>div{box-sizing:border-box;flex:0 0 33.333%;padding:0 5px;margin-bottom:10px}.dashboard__counters>div>div,.dashboard__counters>div>a{padding:20px;background:#192432;border-radius:4px;box-sizing:border-box;height:100%}.dashboard__counters>div>a{text-decoration:none;color:inherit;display:block}.dashboard__counters>div>a:hover,.dashboard__counters>div>a:focus,.dashboard__counters>div>a:active{background:#202e3f}.dashboard__counters__num,.dashboard__counters__text{text-align:center;font-weight:500;font-size:24px;line-height:21px;color:#fff;font-family:\"mastodon-font-display\",sans-serif;margin-bottom:20px;line-height:30px}.dashboard__counters__text{font-size:18px}.dashboard__counters__label{font-size:14px;color:#9baec8;text-align:center;font-weight:500}.dashboard__widgets{display:flex;flex-wrap:wrap;margin:0 -5px}.dashboard__widgets>div{flex:0 0 33.333%;margin-bottom:20px}.dashboard__widgets>div>div{padding:0 5px}.dashboard__widgets a:not(.name-tag){color:#d9e1e8;font-weight:500;text-decoration:none}body.rtl{direction:rtl}body.rtl .column-header>button{text-align:right;padding-left:0;padding-right:15px}body.rtl .radio-button__input{margin-right:0;margin-left:10px}body.rtl .directory__card__bar .display-name{margin-left:0;margin-right:15px}body.rtl .display-name{text-align:right}body.rtl .notification__message{margin-left:0;margin-right:68px}body.rtl .drawer__inner__mastodon>img{transform:scaleX(-1)}body.rtl .notification__favourite-icon-wrapper{left:auto;right:-26px}body.rtl .landing-page__logo{margin-right:0;margin-left:20px}body.rtl .landing-page .features-list .features-list__row .visual{margin-left:0;margin-right:15px}body.rtl .column-link__icon,body.rtl .column-header__icon{margin-right:0;margin-left:5px}body.rtl .compose-form .compose-form__buttons-wrapper .character-counter__wrapper{margin-right:0;margin-left:4px}body.rtl .navigation-bar__profile{margin-left:0;margin-right:8px}body.rtl .search__input{padding-right:10px;padding-left:30px}body.rtl .search__icon .fa{right:auto;left:10px}body.rtl .columns-area{direction:rtl}body.rtl .column-header__buttons{left:0;right:auto;margin-left:0;margin-right:-15px}body.rtl .column-inline-form .icon-button{margin-left:0;margin-right:5px}body.rtl .column-header__links .text-btn{margin-left:10px;margin-right:0}body.rtl .account__avatar-wrapper{float:right}body.rtl .column-header__back-button{padding-left:5px;padding-right:0}body.rtl .column-header__setting-arrows{float:left}body.rtl .setting-toggle__label{margin-left:0;margin-right:8px}body.rtl .status__avatar{left:auto;right:10px}body.rtl .status,body.rtl .activity-stream .status.light{padding-left:10px;padding-right:68px}body.rtl .status__info .status__display-name,body.rtl .activity-stream .status.light .status__display-name{padding-left:25px;padding-right:0}body.rtl .activity-stream .pre-header{padding-right:68px;padding-left:0}body.rtl .status__prepend{margin-left:0;margin-right:68px}body.rtl .status__prepend-icon-wrapper{left:auto;right:-26px}body.rtl .activity-stream .pre-header .pre-header__icon{left:auto;right:42px}body.rtl .account__avatar-overlay-overlay{right:auto;left:0}body.rtl .column-back-button--slim-button{right:auto;left:0}body.rtl .status__relative-time,body.rtl .activity-stream .status.light .status__header .status__meta{float:left}body.rtl .status__action-bar__counter{margin-right:0;margin-left:11px}body.rtl .status__action-bar__counter .status__action-bar-button{margin-right:0;margin-left:4px}body.rtl .status__action-bar-button{float:right;margin-right:0;margin-left:18px}body.rtl .status__action-bar-dropdown{float:right}body.rtl .privacy-dropdown__dropdown{margin-left:0;margin-right:40px}body.rtl .privacy-dropdown__option__icon{margin-left:10px;margin-right:0}body.rtl .detailed-status__display-name .display-name{text-align:right}body.rtl .detailed-status__display-avatar{margin-right:0;margin-left:10px;float:right}body.rtl .detailed-status__favorites,body.rtl .detailed-status__reblogs{margin-left:0;margin-right:6px}body.rtl .fa-ul{margin-left:2.14285714em}body.rtl .fa-li{left:auto;right:-2.14285714em}body.rtl .admin-wrapper{direction:rtl}body.rtl .admin-wrapper .sidebar ul a i.fa,body.rtl a.table-action-link i.fa{margin-right:0;margin-left:5px}body.rtl .simple_form .check_boxes .checkbox label{padding-left:0;padding-right:25px}body.rtl .simple_form .input.with_label.boolean label.checkbox{padding-left:25px;padding-right:0}body.rtl .simple_form .check_boxes .checkbox input[type=checkbox],body.rtl .simple_form .input.boolean input[type=checkbox]{left:auto;right:0}body.rtl .simple_form .input.radio_buttons .radio{left:auto;right:0}body.rtl .simple_form .input.radio_buttons .radio>label{padding-right:28px;padding-left:0}body.rtl .simple_form .input-with-append .input input{padding-left:142px;padding-right:0}body.rtl .simple_form .input.boolean label.checkbox{left:auto;right:0}body.rtl .simple_form .input.boolean .label_input,body.rtl .simple_form .input.boolean .hint{padding-left:0;padding-right:28px}body.rtl .simple_form .label_input__append{right:auto;left:3px}body.rtl .simple_form .label_input__append::after{right:auto;left:0;background-image:linear-gradient(to left, rgba(1, 1, 2, 0), #010102)}body.rtl .simple_form select{background:#010102 url(\"data:image/svg+xml;utf8,\") no-repeat left 8px center/auto 16px}body.rtl .table th,body.rtl .table td{text-align:right}body.rtl .filters .filter-subset{margin-right:0;margin-left:45px}body.rtl .landing-page .header-wrapper .mascot{right:60px;left:auto}body.rtl .landing-page__call-to-action .row__information-board{direction:rtl}body.rtl .landing-page .header .hero .floats .float-1{left:-120px;right:auto}body.rtl .landing-page .header .hero .floats .float-2{left:210px;right:auto}body.rtl .landing-page .header .hero .floats .float-3{left:110px;right:auto}body.rtl .landing-page .header .links .brand img{left:0}body.rtl .landing-page .fa-external-link{padding-right:5px;padding-left:0 !important}body.rtl .landing-page .features #mastodon-timeline{margin-right:0;margin-left:30px}@media screen and (min-width: 631px){body.rtl .column,body.rtl .drawer{padding-left:5px;padding-right:5px}body.rtl .column:first-child,body.rtl .drawer:first-child{padding-left:5px;padding-right:10px}body.rtl .columns-area>div .column,body.rtl .columns-area>div .drawer{padding-left:5px;padding-right:5px}}body.rtl .columns-area--mobile .column,body.rtl .columns-area--mobile .drawer{padding-left:0;padding-right:0}body.rtl .public-layout .header .nav-button{margin-left:8px;margin-right:0}body.rtl .public-layout .public-account-header__tabs{margin-left:0;margin-right:20px}body.rtl .landing-page__information .account__display-name{margin-right:0;margin-left:5px}body.rtl .landing-page__information .account__avatar-wrapper{margin-left:12px;margin-right:0}body.rtl .card__bar .display-name{margin-left:0;margin-right:15px;text-align:right}body.rtl .fa-chevron-left::before{content:\"\"}body.rtl .fa-chevron-right::before{content:\"\"}body.rtl .column-back-button__icon{margin-right:0;margin-left:5px}body.rtl .column-header__setting-arrows .column-header__setting-btn:last-child{padding-left:0;padding-right:10px}body.rtl .simple_form .input.radio_buttons .radio>label input{left:auto;right:0}.emojione[title=\":wavy_dash:\"],.emojione[title=\":waving_black_flag:\"],.emojione[title=\":water_buffalo:\"],.emojione[title=\":video_game:\"],.emojione[title=\":video_camera:\"],.emojione[title=\":vhs:\"],.emojione[title=\":turkey:\"],.emojione[title=\":tophat:\"],.emojione[title=\":top:\"],.emojione[title=\":tm:\"],.emojione[title=\":telephone_receiver:\"],.emojione[title=\":spider:\"],.emojione[title=\":speaking_head_in_silhouette:\"],.emojione[title=\":spades:\"],.emojione[title=\":soon:\"],.emojione[title=\":registered:\"],.emojione[title=\":on:\"],.emojione[title=\":musical_score:\"],.emojione[title=\":movie_camera:\"],.emojione[title=\":mortar_board:\"],.emojione[title=\":microphone:\"],.emojione[title=\":male-guard:\"],.emojione[title=\":lower_left_fountain_pen:\"],.emojione[title=\":lower_left_ballpoint_pen:\"],.emojione[title=\":kaaba:\"],.emojione[title=\":joystick:\"],.emojione[title=\":hole:\"],.emojione[title=\":hocho:\"],.emojione[title=\":heavy_plus_sign:\"],.emojione[title=\":heavy_multiplication_x:\"],.emojione[title=\":heavy_minus_sign:\"],.emojione[title=\":heavy_dollar_sign:\"],.emojione[title=\":heavy_division_sign:\"],.emojione[title=\":heavy_check_mark:\"],.emojione[title=\":guardsman:\"],.emojione[title=\":gorilla:\"],.emojione[title=\":fried_egg:\"],.emojione[title=\":film_projector:\"],.emojione[title=\":female-guard:\"],.emojione[title=\":end:\"],.emojione[title=\":electric_plug:\"],.emojione[title=\":eight_pointed_black_star:\"],.emojione[title=\":dark_sunglasses:\"],.emojione[title=\":currency_exchange:\"],.emojione[title=\":curly_loop:\"],.emojione[title=\":copyright:\"],.emojione[title=\":clubs:\"],.emojione[title=\":camera_with_flash:\"],.emojione[title=\":camera:\"],.emojione[title=\":busts_in_silhouette:\"],.emojione[title=\":bust_in_silhouette:\"],.emojione[title=\":bowling:\"],.emojione[title=\":bomb:\"],.emojione[title=\":black_small_square:\"],.emojione[title=\":black_nib:\"],.emojione[title=\":black_medium_square:\"],.emojione[title=\":black_medium_small_square:\"],.emojione[title=\":black_large_square:\"],.emojione[title=\":black_heart:\"],.emojione[title=\":black_circle:\"],.emojione[title=\":back:\"],.emojione[title=\":ant:\"],.emojione[title=\":8ball:\"]{filter:drop-shadow(1px 1px 0 #ffffff) drop-shadow(-1px 1px 0 #ffffff) drop-shadow(1px -1px 0 #ffffff) drop-shadow(-1px -1px 0 #ffffff);transform:scale(0.71)}","/* http://meyerweb.com/eric/tools/css/reset/\n v2.0 | 20110126\n License: none (public domain)\n*/\n\nhtml, body, div, span, applet, object, iframe,\nh1, h2, h3, h4, h5, h6, p, blockquote, pre,\na, abbr, acronym, address, big, cite, code,\ndel, dfn, em, img, ins, kbd, q, s, samp,\nsmall, strike, strong, sub, sup, tt, var,\nb, u, i, center,\ndl, dt, dd, ol, ul, li,\nfieldset, form, label, legend,\ntable, caption, tbody, tfoot, thead, tr, th, td,\narticle, aside, canvas, details, embed,\nfigure, figcaption, footer, header, hgroup,\nmenu, nav, output, ruby, section, summary,\ntime, mark, audio, video {\n margin: 0;\n padding: 0;\n border: 0;\n font-size: 100%;\n font: inherit;\n vertical-align: baseline;\n}\n\n/* HTML5 display-role reset for older browsers */\narticle, aside, details, figcaption, figure,\nfooter, header, hgroup, menu, nav, section {\n display: block;\n}\n\nbody {\n line-height: 1;\n}\n\nol, ul {\n list-style: none;\n}\n\nblockquote, q {\n quotes: none;\n}\n\nblockquote:before, blockquote:after,\nq:before, q:after {\n content: '';\n content: none;\n}\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\nhtml {\n scrollbar-color: lighten($ui-base-color, 4%) rgba($base-overlay-background, 0.1);\n}\n\n::-webkit-scrollbar {\n width: 12px;\n height: 12px;\n}\n\n::-webkit-scrollbar-thumb {\n background: lighten($ui-base-color, 4%);\n border: 0px none $base-border-color;\n border-radius: 50px;\n}\n\n::-webkit-scrollbar-thumb:hover {\n background: lighten($ui-base-color, 6%);\n}\n\n::-webkit-scrollbar-thumb:active {\n background: lighten($ui-base-color, 4%);\n}\n\n::-webkit-scrollbar-track {\n border: 0px none $base-border-color;\n border-radius: 0;\n background: rgba($base-overlay-background, 0.1);\n}\n\n::-webkit-scrollbar-track:hover {\n background: $ui-base-color;\n}\n\n::-webkit-scrollbar-track:active {\n background: $ui-base-color;\n}\n\n::-webkit-scrollbar-corner {\n background: transparent;\n}\n","// Commonly used web colors\n$black: #000000; // Black\n$white: #ffffff; // White\n$success-green: #79bd9a !default; // Padua\n$error-red: #df405a !default; // Cerise\n$warning-red: #ff5050 !default; // Sunset Orange\n$gold-star: #ca8f04 !default; // Dark Goldenrod\n\n$red-bookmark: $warning-red;\n\n// Pleroma-Dark colors\n$pleroma-bg: #121a24;\n$pleroma-fg: #182230;\n$pleroma-text: #b9b9ba;\n$pleroma-links: #d8a070;\n\n// Values from the classic Mastodon UI\n$classic-base-color: $pleroma-bg;\n$classic-primary-color: #9baec8;\n$classic-secondary-color: #d9e1e8;\n$classic-highlight-color: #d8a070;\n\n// Variables for defaults in UI\n$base-shadow-color: $black !default;\n$base-overlay-background: $black !default;\n$base-border-color: $white !default;\n$simple-background-color: $white !default;\n$valid-value-color: $success-green !default;\n$error-value-color: $error-red !default;\n\n// Tell UI to use selected colors\n$ui-base-color: $classic-base-color !default; // Darkest\n$ui-base-lighter-color: lighten($ui-base-color, 26%) !default; // Lighter darkest\n$ui-primary-color: $classic-primary-color !default; // Lighter\n$ui-secondary-color: $classic-secondary-color !default; // Lightest\n$ui-highlight-color: $classic-highlight-color !default;\n\n// Variables for texts\n$primary-text-color: $white !default;\n$darker-text-color: $ui-primary-color !default;\n$dark-text-color: $ui-base-lighter-color !default;\n$secondary-text-color: $ui-secondary-color !default;\n$highlight-text-color: $ui-highlight-color !default;\n$action-button-color: $ui-base-lighter-color !default;\n// For texts on inverted backgrounds\n$inverted-text-color: $ui-base-color !default;\n$lighter-text-color: $ui-base-lighter-color !default;\n$light-text-color: $ui-primary-color !default;\n\n// Language codes that uses CJK fonts\n$cjk-langs: ja, ko, zh-CN, zh-HK, zh-TW;\n\n// Variables for components\n$media-modal-media-max-width: 100%;\n// put margins on top and bottom of image to avoid the screen covered by image.\n$media-modal-media-max-height: 80%;\n\n$no-gap-breakpoint: 415px;\n\n$font-sans-serif: 'mastodon-font-sans-serif' !default;\n$font-display: 'mastodon-font-display' !default;\n$font-monospace: 'mastodon-font-monospace' !default;\n","@function hex-color($color) {\n @if type-of($color) == 'color' {\n $color: str-slice(ie-hex-str($color), 4);\n }\n\n @return '%23' + unquote($color);\n}\n\nbody {\n font-family: $font-sans-serif, sans-serif;\n background: darken($ui-base-color, 7%);\n font-size: 13px;\n line-height: 18px;\n font-weight: 400;\n color: $primary-text-color;\n text-rendering: optimizelegibility;\n font-feature-settings: \"kern\";\n text-size-adjust: none;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n -webkit-tap-highlight-color: transparent;\n\n &.system-font {\n // system-ui => standard property (Chrome/Android WebView 56+, Opera 43+, Safari 11+)\n // -apple-system => Safari <11 specific\n // BlinkMacSystemFont => Chrome <56 on macOS specific\n // Segoe UI => Windows 7/8/10\n // Oxygen => KDE\n // Ubuntu => Unity/Ubuntu\n // Cantarell => GNOME\n // Fira Sans => Firefox OS\n // Droid Sans => Older Androids (<4.0)\n // Helvetica Neue => Older macOS <10.11\n // $font-sans-serif => web-font (Roboto) fallback and newer Androids (>=4.0)\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Oxygen\", \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", $font-sans-serif, sans-serif;\n }\n\n &.app-body {\n padding: 0;\n\n &.layout-single-column {\n height: auto;\n min-height: 100vh;\n overflow-y: scroll;\n }\n\n &.layout-multiple-columns {\n position: absolute;\n width: 100%;\n height: 100%;\n }\n\n &.with-modals--active {\n overflow-y: hidden;\n }\n }\n\n &.lighter {\n background: $ui-base-color;\n }\n\n &.with-modals {\n overflow-x: hidden;\n overflow-y: scroll;\n\n &--active {\n overflow-y: hidden;\n }\n }\n\n &.player {\n text-align: center;\n }\n\n &.embed {\n background: lighten($ui-base-color, 4%);\n margin: 0;\n padding-bottom: 0;\n\n .container {\n position: absolute;\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n }\n\n &.admin {\n background: darken($ui-base-color, 4%);\n padding: 0;\n }\n\n &.error {\n position: absolute;\n text-align: center;\n color: $darker-text-color;\n background: $ui-base-color;\n width: 100%;\n height: 100%;\n padding: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n\n .dialog {\n vertical-align: middle;\n margin: 20px;\n\n &__illustration {\n img {\n display: block;\n max-width: 470px;\n width: 100%;\n height: auto;\n margin-top: -120px;\n }\n }\n\n h1 {\n font-size: 20px;\n line-height: 28px;\n font-weight: 400;\n }\n }\n }\n}\n\nbutton {\n font-family: inherit;\n cursor: pointer;\n\n &:focus {\n outline: none;\n }\n}\n\n.app-holder {\n &,\n & > div,\n & > noscript {\n display: flex;\n width: 100%;\n align-items: center;\n justify-content: center;\n outline: 0 !important;\n }\n\n & > noscript {\n height: 100vh;\n }\n}\n\n.layout-single-column .app-holder {\n &,\n & > div {\n min-height: 100vh;\n }\n}\n\n.layout-multiple-columns .app-holder {\n &,\n & > div {\n height: 100%;\n }\n}\n\n.error-boundary,\n.app-holder noscript {\n flex-direction: column;\n font-size: 16px;\n font-weight: 400;\n line-height: 1.7;\n color: lighten($error-red, 4%);\n text-align: center;\n\n & > div {\n max-width: 500px;\n }\n\n p {\n margin-bottom: .85em;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: $highlight-text-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n &__footer {\n color: $dark-text-color;\n font-size: 13px;\n\n a {\n color: $dark-text-color;\n }\n }\n\n button {\n display: inline;\n border: 0;\n background: transparent;\n color: $dark-text-color;\n font: inherit;\n padding: 0;\n margin: 0;\n line-height: inherit;\n cursor: pointer;\n outline: 0;\n transition: color 300ms linear;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n\n &.copied {\n color: $valid-value-color;\n transition: none;\n }\n }\n}\n",".container-alt {\n width: 700px;\n margin: 0 auto;\n margin-top: 40px;\n\n @media screen and (max-width: 740px) {\n width: 100%;\n margin: 0;\n }\n}\n\n.logo-container {\n margin: 100px auto 50px;\n\n @media screen and (max-width: 500px) {\n margin: 40px auto 0;\n }\n\n h1 {\n display: flex;\n justify-content: center;\n align-items: center;\n\n svg {\n fill: $primary-text-color;\n height: 42px;\n margin-right: 10px;\n }\n\n a {\n display: flex;\n justify-content: center;\n align-items: center;\n color: $primary-text-color;\n text-decoration: none;\n outline: 0;\n padding: 12px 16px;\n line-height: 32px;\n font-family: $font-display, sans-serif;\n font-weight: 500;\n font-size: 14px;\n }\n }\n}\n\n.compose-standalone {\n .compose-form {\n width: 400px;\n margin: 0 auto;\n padding: 20px 0;\n margin-top: 40px;\n box-sizing: border-box;\n\n @media screen and (max-width: 400px) {\n width: 100%;\n margin-top: 0;\n padding: 20px;\n }\n }\n}\n\n.account-header {\n width: 400px;\n margin: 0 auto;\n display: flex;\n font-size: 13px;\n line-height: 18px;\n box-sizing: border-box;\n padding: 20px 0;\n padding-bottom: 0;\n margin-bottom: -30px;\n margin-top: 40px;\n\n @media screen and (max-width: 440px) {\n width: 100%;\n margin: 0;\n margin-bottom: 10px;\n padding: 20px;\n padding-bottom: 0;\n }\n\n .avatar {\n width: 40px;\n height: 40px;\n margin-right: 8px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n }\n }\n\n .name {\n flex: 1 1 auto;\n color: $secondary-text-color;\n width: calc(100% - 88px);\n\n .username {\n display: block;\n font-weight: 500;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n }\n\n .logout-link {\n display: block;\n font-size: 32px;\n line-height: 40px;\n margin-left: 8px;\n }\n}\n\n.grid-3 {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: 3fr 1fr;\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-column: 1 / 3;\n grid-row: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 2;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1 / 3;\n grid-row: 3;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n grid-template-columns: minmax(0, 100%);\n\n .column-0 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .column-2 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1;\n grid-row: 4;\n }\n }\n}\n\n.grid-4 {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: repeat(4, minmax(0, 1fr));\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-column: 1 / 5;\n grid-row: 1;\n }\n\n .column-1 {\n grid-column: 1 / 4;\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 4;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 2 / 5;\n grid-row: 3;\n }\n\n .column-4 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .landing-page__call-to-action {\n min-height: 100%;\n }\n\n .flash-message {\n margin-bottom: 10px;\n }\n\n @media screen and (max-width: 738px) {\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n .landing-page__call-to-action {\n padding: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .row__information-board {\n width: 100%;\n justify-content: center;\n align-items: center;\n }\n\n .row__mascot {\n display: none;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n grid-template-columns: minmax(0, 100%);\n\n .column-0 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .column-2 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1;\n grid-row: 5;\n }\n\n .column-4 {\n grid-column: 1;\n grid-row: 4;\n }\n }\n}\n\n.public-layout {\n @media screen and (max-width: $no-gap-breakpoint) {\n padding-top: 48px;\n }\n\n .container {\n max-width: 960px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding: 0;\n }\n }\n\n .header {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n height: 48px;\n margin: 10px 0;\n display: flex;\n align-items: stretch;\n justify-content: center;\n flex-wrap: nowrap;\n overflow: hidden;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n position: fixed;\n width: 100%;\n top: 0;\n left: 0;\n margin: 0;\n border-radius: 0;\n box-shadow: none;\n z-index: 110;\n }\n\n & > div {\n flex: 1 1 33.3%;\n min-height: 1px;\n }\n\n .nav-left {\n display: flex;\n align-items: stretch;\n justify-content: flex-start;\n flex-wrap: nowrap;\n }\n\n .nav-center {\n display: flex;\n align-items: stretch;\n justify-content: center;\n flex-wrap: nowrap;\n }\n\n .nav-right {\n display: flex;\n align-items: stretch;\n justify-content: flex-end;\n flex-wrap: nowrap;\n }\n\n .brand {\n display: block;\n padding: 15px;\n\n svg {\n display: block;\n height: 18px;\n width: auto;\n position: relative;\n bottom: -2px;\n fill: $primary-text-color;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n height: 20px;\n }\n }\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 12%);\n }\n }\n\n .nav-link {\n display: flex;\n align-items: center;\n padding: 0 1rem;\n font-size: 12px;\n font-weight: 500;\n text-decoration: none;\n color: $darker-text-color;\n white-space: nowrap;\n text-align: center;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n color: $primary-text-color;\n }\n\n @media screen and (max-width: 550px) {\n &.optional {\n display: none;\n }\n }\n }\n\n .nav-button {\n background: lighten($ui-base-color, 16%);\n margin: 8px;\n margin-left: 0;\n border-radius: 4px;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n background: lighten($ui-base-color, 20%);\n }\n }\n }\n\n $no-columns-breakpoint: 600px;\n\n .grid {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(300px, 3fr) minmax(298px, 1fr);\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-row: 1;\n grid-column: 1;\n }\n\n .column-1 {\n grid-row: 1;\n grid-column: 2;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n grid-template-columns: 100%;\n grid-gap: 0;\n\n .column-1 {\n display: none;\n }\n }\n }\n\n .directory__card {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n\n .page-header {\n @media screen and (max-width: $no-gap-breakpoint) {\n border-bottom: 0;\n }\n }\n\n .public-account-header {\n overflow: hidden;\n margin-bottom: 10px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &.inactive {\n opacity: 0.5;\n\n .public-account-header__image,\n .avatar {\n filter: grayscale(100%);\n }\n\n .logo-button {\n background-color: $secondary-text-color;\n }\n }\n\n &__image {\n border-radius: 4px 4px 0 0;\n overflow: hidden;\n height: 300px;\n position: relative;\n background: darken($ui-base-color, 12%);\n\n &::after {\n content: \"\";\n display: block;\n position: absolute;\n width: 100%;\n height: 100%;\n box-shadow: inset 0 -1px 1px 1px rgba($base-shadow-color, 0.15);\n top: 0;\n left: 0;\n }\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 4px 4px 0 0;\n }\n\n @media screen and (max-width: 600px) {\n height: 200px;\n }\n }\n\n &--no-bar {\n margin-bottom: 0;\n\n .public-account-header__image,\n .public-account-header__image img {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n box-shadow: none;\n\n &__image::after {\n display: none;\n }\n\n &__image,\n &__image img {\n border-radius: 0;\n }\n }\n\n &__bar {\n position: relative;\n margin-top: -80px;\n display: flex;\n justify-content: flex-start;\n\n &::before {\n content: \"\";\n display: block;\n background: lighten($ui-base-color, 4%);\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: 60px;\n border-radius: 0 0 4px 4px;\n z-index: -1;\n }\n\n .avatar {\n display: block;\n width: 120px;\n height: 120px;\n padding-left: 20px - 4px;\n flex: 0 0 auto;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 50%;\n border: 4px solid lighten($ui-base-color, 4%);\n background: darken($ui-base-color, 8%);\n }\n }\n\n @media screen and (max-width: 600px) {\n margin-top: 0;\n background: lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n padding: 5px;\n\n &::before {\n display: none;\n }\n\n .avatar {\n width: 48px;\n height: 48px;\n padding: 7px 0;\n padding-left: 10px;\n\n img {\n border: 0;\n border-radius: 4px;\n }\n\n @media screen and (max-width: 360px) {\n display: none;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n flex-wrap: wrap;\n }\n }\n\n &__tabs {\n flex: 1 1 auto;\n margin-left: 20px;\n\n &__name {\n padding-top: 20px;\n padding-bottom: 8px;\n\n h1 {\n font-size: 20px;\n line-height: 18px * 1.5;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n text-shadow: 1px 1px 1px $base-shadow-color;\n\n small {\n display: block;\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n @media screen and (max-width: 600px) {\n margin-left: 15px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n &__name {\n padding-top: 0;\n padding-bottom: 0;\n\n h1 {\n font-size: 16px;\n line-height: 24px;\n text-shadow: none;\n\n small {\n color: $darker-text-color;\n }\n }\n }\n }\n\n &__tabs {\n display: flex;\n justify-content: flex-start;\n align-items: stretch;\n height: 58px;\n\n .details-counters {\n display: flex;\n flex-direction: row;\n min-width: 300px;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n .details-counters {\n display: none;\n }\n }\n\n .counter {\n min-width: 33.3%;\n box-sizing: border-box;\n flex: 0 0 auto;\n color: $darker-text-color;\n padding: 10px;\n border-right: 1px solid lighten($ui-base-color, 4%);\n cursor: default;\n text-align: center;\n position: relative;\n\n a {\n display: block;\n }\n\n &:last-child {\n border-right: 0;\n }\n\n &::after {\n display: block;\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n border-bottom: 4px solid $ui-primary-color;\n opacity: 0.5;\n transition: all 400ms ease;\n }\n\n &.active {\n &::after {\n border-bottom: 4px solid $highlight-text-color;\n opacity: 1;\n }\n\n &.inactive::after {\n border-bottom-color: $secondary-text-color;\n }\n }\n\n &:hover {\n &::after {\n opacity: 1;\n transition-duration: 100ms;\n }\n }\n\n a {\n text-decoration: none;\n color: inherit;\n }\n\n .counter-label {\n font-size: 12px;\n display: block;\n }\n\n .counter-number {\n font-weight: 500;\n font-size: 18px;\n margin-bottom: 5px;\n color: $primary-text-color;\n font-family: $font-display, sans-serif;\n }\n }\n\n .spacer {\n flex: 1 1 auto;\n height: 1px;\n }\n\n &__buttons {\n padding: 7px 8px;\n }\n }\n }\n\n &__extra {\n display: none;\n margin-top: 4px;\n\n .public-account-bio {\n border-radius: 0;\n box-shadow: none;\n background: transparent;\n margin: 0 -5px;\n\n .account__header__fields {\n border-top: 1px solid lighten($ui-base-color, 12%);\n }\n\n .roles {\n display: none;\n }\n }\n\n &__links {\n margin-top: -15px;\n font-size: 14px;\n color: $darker-text-color;\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n padding: 15px;\n font-weight: 500;\n\n strong {\n font-weight: 700;\n color: $primary-text-color;\n }\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n flex: 100%;\n }\n }\n }\n\n .account__section-headline {\n border-radius: 4px 4px 0 0;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n\n .detailed-status__meta {\n margin-top: 25px;\n }\n\n .public-account-bio {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n overflow: hidden;\n margin-bottom: 10px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n box-shadow: none;\n margin-bottom: 0;\n border-radius: 0;\n }\n\n .account__header__fields {\n margin: 0;\n border-top: 0;\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n\n .account__header__content {\n padding: 20px;\n padding-bottom: 0;\n color: $primary-text-color;\n }\n\n &__extra,\n .roles {\n padding: 20px;\n font-size: 14px;\n color: $darker-text-color;\n }\n\n .roles {\n padding-bottom: 0;\n }\n }\n\n .directory__list {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: block;\n }\n\n .icon-button {\n font-size: 18px;\n }\n }\n\n .directory__card {\n margin-bottom: 0;\n }\n\n .card-grid {\n display: flex;\n flex-wrap: wrap;\n min-width: 100%;\n margin: 0 -5px;\n\n & > div {\n box-sizing: border-box;\n flex: 1 0 auto;\n width: 300px;\n padding: 0 5px;\n margin-bottom: 10px;\n max-width: 33.333%;\n\n @media screen and (max-width: 900px) {\n max-width: 50%;\n }\n\n @media screen and (max-width: 600px) {\n max-width: 100%;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin: 0;\n border-top: 1px solid lighten($ui-base-color, 8%);\n\n & > div {\n width: 100%;\n padding: 0;\n margin-bottom: 0;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &:last-child {\n border-bottom: 0;\n }\n\n .card__bar {\n background: $ui-base-color;\n\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n }\n }\n }\n }\n}\n",".no-list {\n list-style: none;\n\n li {\n display: inline-block;\n margin: 0 5px;\n }\n}\n\n.recovery-codes {\n list-style: none;\n margin: 0 auto;\n\n li {\n font-size: 125%;\n line-height: 1.5;\n letter-spacing: 1px;\n }\n}\n",".public-layout {\n .footer {\n text-align: left;\n padding-top: 20px;\n padding-bottom: 60px;\n font-size: 12px;\n color: lighten($ui-base-color, 34%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding-left: 20px;\n padding-right: 20px;\n }\n\n .grid {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: 1fr 1fr 2fr 1fr 1fr;\n\n .column-0 {\n grid-column: 1;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-1 {\n grid-column: 2;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-2 {\n grid-column: 3;\n grid-row: 1;\n min-width: 0;\n text-align: center;\n\n h4 a {\n color: lighten($ui-base-color, 34%);\n }\n }\n\n .column-3 {\n grid-column: 4;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-4 {\n grid-column: 5;\n grid-row: 1;\n min-width: 0;\n }\n\n @media screen and (max-width: 690px) {\n grid-template-columns: 1fr 2fr 1fr;\n\n .column-0,\n .column-1 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 2;\n }\n\n .column-3,\n .column-4 {\n grid-column: 3;\n }\n\n .column-4 {\n grid-row: 2;\n }\n }\n\n @media screen and (max-width: 600px) {\n .column-1 {\n display: block;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n .column-0,\n .column-1,\n .column-3,\n .column-4 {\n display: none;\n }\n }\n }\n\n h4 {\n font-weight: 700;\n margin-bottom: 8px;\n color: $darker-text-color;\n\n a {\n color: inherit;\n text-decoration: none;\n }\n }\n\n ul a {\n text-decoration: none;\n color: lighten($ui-base-color, 34%);\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n\n .brand {\n svg {\n display: block;\n height: 36px;\n width: auto;\n margin: 0 auto;\n fill: lighten($ui-base-color, 34%);\n }\n\n &:hover,\n &:focus,\n &:active {\n svg {\n fill: lighten($ui-base-color, 38%);\n }\n }\n }\n }\n}\n",".compact-header {\n h1 {\n font-size: 24px;\n line-height: 28px;\n color: $darker-text-color;\n font-weight: 500;\n margin-bottom: 20px;\n padding: 0 10px;\n word-wrap: break-word;\n\n @media screen and (max-width: 740px) {\n text-align: center;\n padding: 20px 10px 0;\n }\n\n a {\n color: inherit;\n text-decoration: none;\n }\n\n small {\n font-weight: 400;\n color: $secondary-text-color;\n }\n\n img {\n display: inline-block;\n margin-bottom: -5px;\n margin-right: 15px;\n width: 36px;\n height: 36px;\n }\n }\n}\n",".hero-widget {\n margin-bottom: 10px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &__img {\n width: 100%;\n position: relative;\n overflow: hidden;\n border-radius: 4px 4px 0 0;\n background: $base-shadow-color;\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 4px 4px 0 0;\n }\n }\n\n &__text {\n background: $ui-base-color;\n padding: 20px;\n border-radius: 0 0 4px 4px;\n font-size: 15px;\n color: $darker-text-color;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n p {\n margin-bottom: 20px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n em {\n display: inline;\n margin: 0;\n padding: 0;\n font-weight: 700;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n color: lighten($darker-text-color, 10%);\n }\n\n a {\n color: $secondary-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n}\n\n.endorsements-widget {\n margin-bottom: 10px;\n padding-bottom: 10px;\n\n h4 {\n padding: 10px;\n font-weight: 700;\n font-size: 14px;\n color: $darker-text-color;\n }\n\n .account {\n padding: 10px 0;\n\n &:last-child {\n border-bottom: 0;\n }\n\n .account__display-name {\n display: flex;\n align-items: center;\n }\n\n .account__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n }\n\n .trends__item {\n padding: 10px;\n }\n}\n\n.trends-widget {\n h4 {\n color: $darker-text-color;\n }\n}\n\n.box-widget {\n padding: 20px;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n}\n\n.placeholder-widget {\n padding: 16px;\n border-radius: 4px;\n border: 2px dashed $dark-text-color;\n text-align: center;\n color: $darker-text-color;\n margin-bottom: 10px;\n}\n\n.contact-widget {\n min-height: 100%;\n font-size: 15px;\n color: $darker-text-color;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n padding: 0;\n\n h4 {\n padding: 10px;\n font-weight: 700;\n font-size: 14px;\n color: $darker-text-color;\n }\n\n .account {\n border-bottom: 0;\n padding: 10px 0;\n padding-top: 5px;\n }\n\n & > a {\n display: inline-block;\n padding: 10px;\n padding-top: 0;\n color: $darker-text-color;\n text-decoration: none;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.moved-account-widget {\n padding: 15px;\n padding-bottom: 20px;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n color: $secondary-text-color;\n font-weight: 400;\n margin-bottom: 10px;\n\n strong,\n a {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n color: inherit;\n text-decoration: underline;\n\n &.mention {\n text-decoration: none;\n\n span {\n text-decoration: none;\n }\n\n &:focus,\n &:hover,\n &:active {\n text-decoration: none;\n\n span {\n text-decoration: underline;\n }\n }\n }\n }\n\n &__message {\n margin-bottom: 15px;\n\n .fa {\n margin-right: 5px;\n color: $darker-text-color;\n }\n }\n\n &__card {\n .detailed-status__display-avatar {\n position: relative;\n cursor: pointer;\n }\n\n .detailed-status__display-name {\n margin-bottom: 0;\n text-decoration: none;\n\n span {\n font-weight: 400;\n }\n }\n }\n}\n\n.memoriam-widget {\n padding: 20px;\n border-radius: 4px;\n background: $base-shadow-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n font-size: 14px;\n color: $darker-text-color;\n margin-bottom: 10px;\n}\n\n.page-header {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n padding: 60px 15px;\n text-align: center;\n margin: 10px 0;\n\n h1 {\n color: $primary-text-color;\n font-size: 36px;\n line-height: 1.1;\n font-weight: 700;\n margin-bottom: 10px;\n }\n\n p {\n font-size: 15px;\n color: $darker-text-color;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-top: 0;\n background: lighten($ui-base-color, 4%);\n\n h1 {\n font-size: 24px;\n }\n }\n}\n\n.directory {\n background: $ui-base-color;\n border-radius: 4px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &__tag {\n box-sizing: border-box;\n margin-bottom: 10px;\n\n & > a,\n & > div {\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: $ui-base-color;\n border-radius: 4px;\n padding: 15px;\n text-decoration: none;\n color: inherit;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n }\n\n & > a {\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 8%);\n }\n }\n\n &.active > a {\n background: $ui-highlight-color;\n cursor: default;\n }\n\n &.disabled > div {\n opacity: 0.5;\n cursor: default;\n }\n\n h4 {\n flex: 1 1 auto;\n font-size: 18px;\n font-weight: 700;\n color: $primary-text-color;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n .fa {\n color: $darker-text-color;\n }\n\n small {\n display: block;\n font-weight: 400;\n font-size: 15px;\n margin-top: 8px;\n color: $darker-text-color;\n }\n }\n\n &.active h4 {\n &,\n .fa,\n small,\n .trends__item__current {\n color: $primary-text-color;\n }\n }\n\n .avatar-stack {\n flex: 0 0 auto;\n width: (36px + 4px) * 3;\n }\n\n &.active .avatar-stack .account__avatar {\n border-color: $ui-highlight-color;\n }\n\n .trends__item__current {\n padding-right: 0;\n }\n }\n}\n\n.avatar-stack {\n display: flex;\n justify-content: flex-end;\n\n .account__avatar {\n flex: 0 0 auto;\n width: 36px;\n height: 36px;\n border-radius: 50%;\n position: relative;\n margin-left: -10px;\n background: darken($ui-base-color, 8%);\n border: 2px solid $ui-base-color;\n\n &:nth-child(1) {\n z-index: 1;\n }\n\n &:nth-child(2) {\n z-index: 2;\n }\n\n &:nth-child(3) {\n z-index: 3;\n }\n }\n}\n\n.accounts-table {\n width: 100%;\n\n .account {\n padding: 0;\n border: 0;\n }\n\n strong {\n font-weight: 700;\n }\n\n thead th {\n text-align: center;\n color: $darker-text-color;\n font-weight: 700;\n padding: 10px;\n\n &:first-child {\n text-align: left;\n }\n }\n\n tbody td {\n padding: 15px 0;\n vertical-align: middle;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n tbody tr:last-child td {\n border-bottom: 0;\n }\n\n &__count {\n width: 120px;\n text-align: center;\n font-size: 15px;\n font-weight: 500;\n color: $primary-text-color;\n\n small {\n display: block;\n color: $darker-text-color;\n font-weight: 400;\n font-size: 14px;\n }\n }\n\n &__comment {\n width: 50%;\n vertical-align: initial !important;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n tbody td.optional {\n display: none;\n }\n }\n}\n\n.moved-account-widget,\n.memoriam-widget,\n.box-widget,\n.contact-widget,\n.landing-page__information.contact-widget,\n.directory,\n.page-header {\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n box-shadow: none;\n border-radius: 0;\n }\n}\n\n$maximum-width: 1235px;\n$fluid-breakpoint: $maximum-width + 20px;\n\n.statuses-grid {\n min-height: 600px;\n\n @media screen and (max-width: 640px) {\n width: 100% !important; // Masonry layout is unnecessary at this width\n }\n\n &__item {\n width: (960px - 20px) / 3;\n\n @media screen and (max-width: $fluid-breakpoint) {\n width: (940px - 20px) / 3;\n }\n\n @media screen and (max-width: 640px) {\n width: 100%;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n width: 100vw;\n }\n }\n\n .detailed-status {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 1px solid lighten($ui-base-color, 16%);\n }\n\n &.compact {\n .detailed-status__meta {\n margin-top: 15px;\n }\n\n .status__content {\n font-size: 15px;\n line-height: 20px;\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n .status__content__spoiler-link {\n line-height: 20px;\n margin: 0;\n }\n }\n\n .media-gallery,\n .status-card,\n .video-player {\n margin-top: 15px;\n }\n }\n }\n}\n\n.notice-widget {\n margin-bottom: 10px;\n color: $darker-text-color;\n\n p {\n margin-bottom: 10px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n font-size: 14px;\n line-height: 20px;\n }\n}\n\n.notice-widget,\n.placeholder-widget {\n a {\n text-decoration: none;\n font-weight: 500;\n color: $ui-highlight-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.table-of-contents {\n background: darken($ui-base-color, 4%);\n min-height: 100%;\n font-size: 14px;\n border-radius: 4px;\n\n li a {\n display: block;\n font-weight: 500;\n padding: 15px;\n overflow: hidden;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n text-decoration: none;\n color: $primary-text-color;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n\n li:last-child a {\n border-bottom: 0;\n }\n\n li ul {\n padding-left: 20px;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n }\n}\n","$no-columns-breakpoint: 600px;\n\ncode {\n font-family: $font-monospace, monospace;\n font-weight: 400;\n}\n\n.form-container {\n max-width: 400px;\n padding: 20px;\n margin: 0 auto;\n}\n\n.simple_form {\n .input {\n margin-bottom: 15px;\n overflow: hidden;\n\n &.hidden {\n margin: 0;\n }\n\n &.radio_buttons {\n .radio {\n margin-bottom: 15px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .radio > label {\n position: relative;\n padding-left: 28px;\n\n input {\n position: absolute;\n top: -2px;\n left: 0;\n }\n }\n }\n\n &.boolean {\n position: relative;\n margin-bottom: 0;\n\n .label_input > label {\n font-family: inherit;\n font-size: 14px;\n padding-top: 5px;\n color: $primary-text-color;\n display: block;\n width: auto;\n }\n\n .label_input,\n .hint {\n padding-left: 28px;\n }\n\n .label_input__wrapper {\n position: static;\n }\n\n label.checkbox {\n position: absolute;\n top: 2px;\n left: 0;\n }\n\n label a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: none;\n }\n }\n\n .recommended {\n position: absolute;\n margin: 0 4px;\n margin-top: -2px;\n }\n }\n }\n\n .row {\n display: flex;\n margin: 0 -5px;\n\n .input {\n box-sizing: border-box;\n flex: 1 1 auto;\n width: 50%;\n padding: 0 5px;\n }\n }\n\n .hint {\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n }\n\n code {\n border-radius: 3px;\n padding: 0.2em 0.4em;\n background: darken($ui-base-color, 12%);\n }\n\n li {\n list-style: disc;\n margin-left: 18px;\n }\n }\n\n ul.hint {\n margin-bottom: 15px;\n }\n\n span.hint {\n display: block;\n font-size: 12px;\n margin-top: 4px;\n }\n\n p.hint {\n margin-bottom: 15px;\n color: $darker-text-color;\n\n &.subtle-hint {\n text-align: center;\n font-size: 12px;\n line-height: 18px;\n margin-top: 15px;\n margin-bottom: 0;\n }\n }\n\n .card {\n margin-bottom: 15px;\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n .input.with_floating_label {\n .label_input {\n display: flex;\n\n & > label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 500;\n min-width: 150px;\n flex: 0 0 auto;\n }\n\n input,\n select {\n flex: 1 1 auto;\n }\n }\n\n &.select .hint {\n margin-top: 6px;\n margin-left: 150px;\n }\n }\n\n .input.with_label {\n .label_input > label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: block;\n margin-bottom: 8px;\n word-wrap: break-word;\n font-weight: 500;\n }\n\n .hint {\n margin-top: 6px;\n }\n\n ul {\n flex: 390px;\n }\n }\n\n .input.with_block_label {\n max-width: none;\n\n & > label {\n font-family: inherit;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n font-weight: 500;\n padding-top: 5px;\n }\n\n .hint {\n margin-bottom: 15px;\n }\n\n ul {\n columns: 2;\n }\n }\n\n .required abbr {\n text-decoration: none;\n color: lighten($error-value-color, 12%);\n }\n\n .fields-group {\n margin-bottom: 25px;\n\n .input:last-child {\n margin-bottom: 0;\n }\n }\n\n .fields-row {\n display: flex;\n margin: 0 -10px;\n padding-top: 5px;\n margin-bottom: 25px;\n\n .input {\n max-width: none;\n }\n\n &__column {\n box-sizing: border-box;\n padding: 0 10px;\n flex: 1 1 auto;\n min-height: 1px;\n\n &-6 {\n max-width: 50%;\n }\n\n .actions {\n margin-top: 27px;\n }\n }\n\n .fields-group:last-child,\n .fields-row__column.fields-group {\n margin-bottom: 0;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n margin-bottom: 0;\n\n &__column {\n max-width: none;\n }\n\n .fields-group:last-child,\n .fields-row__column.fields-group,\n .fields-row__column {\n margin-bottom: 25px;\n }\n }\n }\n\n .input.radio_buttons .radio label {\n margin-bottom: 5px;\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: block;\n width: auto;\n }\n\n .check_boxes {\n .checkbox {\n label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: inline-block;\n width: auto;\n position: relative;\n padding-top: 5px;\n padding-left: 25px;\n flex: 1 1 auto;\n }\n\n input[type=checkbox] {\n position: absolute;\n left: 0;\n top: 5px;\n margin: 0;\n }\n }\n }\n\n .input.static .label_input__wrapper {\n font-size: 16px;\n padding: 10px;\n border: 1px solid $dark-text-color;\n border-radius: 4px;\n }\n\n input[type=text],\n input[type=number],\n input[type=email],\n input[type=password],\n textarea {\n box-sizing: border-box;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n width: 100%;\n outline: 0;\n font-family: inherit;\n resize: vertical;\n background: darken($ui-base-color, 10%);\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n padding: 10px;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &:invalid {\n box-shadow: none;\n }\n\n &:focus:invalid:not(:placeholder-shown) {\n border-color: lighten($error-red, 12%);\n }\n\n &:required:valid {\n border-color: $valid-value-color;\n }\n\n &:hover {\n border-color: darken($ui-base-color, 20%);\n }\n\n &:active,\n &:focus {\n border-color: $highlight-text-color;\n background: darken($ui-base-color, 8%);\n }\n }\n\n .input.field_with_errors {\n label {\n color: lighten($error-red, 12%);\n }\n\n input[type=text],\n input[type=number],\n input[type=email],\n input[type=password],\n textarea,\n select {\n border-color: lighten($error-red, 12%);\n }\n\n .error {\n display: block;\n font-weight: 500;\n color: lighten($error-red, 12%);\n margin-top: 4px;\n }\n }\n\n .input.disabled {\n opacity: 0.5;\n }\n\n .actions {\n margin-top: 30px;\n display: flex;\n\n &.actions--top {\n margin-top: 0;\n margin-bottom: 30px;\n }\n }\n\n button,\n .button,\n .block-button {\n display: block;\n width: 100%;\n border: 0;\n border-radius: 4px;\n background: $ui-highlight-color;\n color: $primary-text-color;\n font-size: 18px;\n line-height: inherit;\n height: auto;\n padding: 10px;\n text-decoration: none;\n text-align: center;\n box-sizing: border-box;\n cursor: pointer;\n font-weight: 500;\n outline: 0;\n margin-bottom: 10px;\n margin-right: 10px;\n\n &:last-child {\n margin-right: 0;\n }\n\n &:hover {\n background-color: lighten($ui-highlight-color, 5%);\n }\n\n &:active,\n &:focus {\n background-color: darken($ui-highlight-color, 5%);\n }\n\n &:disabled:hover {\n background-color: $ui-primary-color;\n }\n\n &.negative {\n background: $error-value-color;\n\n &:hover {\n background-color: lighten($error-value-color, 5%);\n }\n\n &:active,\n &:focus {\n background-color: darken($error-value-color, 5%);\n }\n }\n }\n\n select {\n appearance: none;\n box-sizing: border-box;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n width: 100%;\n outline: 0;\n font-family: inherit;\n resize: vertical;\n background: darken($ui-base-color, 10%) url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center / auto 16px;\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n padding-left: 10px;\n padding-right: 30px;\n height: 41px;\n }\n\n h4 {\n margin-bottom: 15px !important;\n }\n\n .label_input {\n &__wrapper {\n position: relative;\n }\n\n &__append {\n position: absolute;\n right: 3px;\n top: 1px;\n padding: 10px;\n padding-bottom: 9px;\n font-size: 16px;\n color: $dark-text-color;\n font-family: inherit;\n pointer-events: none;\n cursor: default;\n max-width: 140px;\n white-space: nowrap;\n overflow: hidden;\n\n &::after {\n content: '';\n display: block;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 1px;\n width: 5px;\n background-image: linear-gradient(to right, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));\n }\n }\n }\n\n &__overlay-area {\n position: relative;\n\n &__blurred form {\n filter: blur(2px);\n }\n\n &__overlay {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n background: rgba($ui-base-color, 0.65);\n border-radius: 4px;\n margin-left: -4px;\n margin-top: -4px;\n padding: 4px;\n\n &__content {\n text-align: center;\n\n &.rich-formatting {\n &,\n p {\n color: $primary-text-color;\n }\n }\n }\n }\n }\n}\n\n.block-icon {\n display: block;\n margin: 0 auto;\n margin-bottom: 10px;\n font-size: 24px;\n}\n\n.flash-message {\n background: lighten($ui-base-color, 8%);\n color: $darker-text-color;\n border-radius: 4px;\n padding: 15px 10px;\n margin-bottom: 30px;\n text-align: center;\n\n &.notice {\n border: 1px solid rgba($valid-value-color, 0.5);\n background: rgba($valid-value-color, 0.25);\n color: $valid-value-color;\n }\n\n &.alert {\n border: 1px solid rgba($error-value-color, 0.5);\n background: rgba($error-value-color, 0.25);\n color: $error-value-color;\n }\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n\n &:hover {\n color: $primary-text-color;\n text-decoration: underline;\n }\n }\n\n p {\n margin-bottom: 15px;\n }\n\n .oauth-code {\n outline: 0;\n box-sizing: border-box;\n display: block;\n width: 100%;\n border: 0;\n padding: 10px;\n font-family: $font-monospace, monospace;\n background: $ui-base-color;\n color: $primary-text-color;\n font-size: 14px;\n margin: 0;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n @media screen and (max-width: 740px) and (min-width: 441px) {\n margin-top: 40px;\n }\n}\n\n.form-footer {\n margin-top: 30px;\n text-align: center;\n\n a {\n color: $darker-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.quick-nav {\n list-style: none;\n margin-bottom: 25px;\n font-size: 14px;\n\n li {\n display: inline-block;\n margin-right: 10px;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n font-weight: 700;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($highlight-text-color, 8%);\n }\n }\n}\n\n.oauth-prompt,\n.follow-prompt {\n margin-bottom: 30px;\n color: $darker-text-color;\n\n h2 {\n font-size: 16px;\n margin-bottom: 30px;\n text-align: center;\n }\n\n strong {\n color: $secondary-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n @media screen and (max-width: 740px) and (min-width: 441px) {\n margin-top: 40px;\n }\n}\n\n.qr-wrapper {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n}\n\n.qr-code {\n flex: 0 0 auto;\n background: $simple-background-color;\n padding: 4px;\n margin: 0 10px 20px 0;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n display: inline-block;\n\n svg {\n display: block;\n margin: 0;\n }\n}\n\n.qr-alternative {\n margin-bottom: 20px;\n color: $secondary-text-color;\n flex: 150px;\n\n samp {\n display: block;\n font-size: 14px;\n }\n}\n\n.table-form {\n p {\n margin-bottom: 15px;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n }\n}\n\n.simple_form,\n.table-form {\n .warning {\n box-sizing: border-box;\n background: rgba($error-value-color, 0.5);\n color: $primary-text-color;\n text-shadow: 1px 1px 0 rgba($base-shadow-color, 0.3);\n box-shadow: 0 2px 6px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n padding: 10px;\n margin-bottom: 15px;\n\n a {\n color: $primary-text-color;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n strong {\n font-weight: 600;\n display: block;\n margin-bottom: 5px;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n\n .fa {\n font-weight: 400;\n }\n }\n }\n}\n\n.action-pagination {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n\n .actions,\n .pagination {\n flex: 1 1 auto;\n }\n\n .actions {\n padding: 30px 0;\n padding-right: 20px;\n flex: 0 0 auto;\n }\n}\n\n.post-follow-actions {\n text-align: center;\n color: $darker-text-color;\n\n div {\n margin-bottom: 4px;\n }\n}\n\n.alternative-login {\n margin-top: 20px;\n margin-bottom: 20px;\n\n h4 {\n font-size: 16px;\n color: $primary-text-color;\n text-align: center;\n margin-bottom: 20px;\n border: 0;\n padding: 0;\n }\n\n .button {\n display: block;\n }\n}\n\n.scope-danger {\n color: $warning-red;\n}\n\n.form_admin_settings_site_short_description,\n.form_admin_settings_site_description,\n.form_admin_settings_site_extended_description,\n.form_admin_settings_site_terms,\n.form_admin_settings_custom_css,\n.form_admin_settings_closed_registrations_message {\n textarea {\n font-family: $font-monospace, monospace;\n }\n}\n\n.input-copy {\n background: darken($ui-base-color, 10%);\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n display: flex;\n align-items: center;\n padding-right: 4px;\n position: relative;\n top: 1px;\n transition: border-color 300ms linear;\n\n &__wrapper {\n flex: 1 1 auto;\n }\n\n input[type=text] {\n background: transparent;\n border: 0;\n padding: 10px;\n font-size: 14px;\n font-family: $font-monospace, monospace;\n }\n\n button {\n flex: 0 0 auto;\n margin: 4px;\n text-transform: none;\n font-weight: 400;\n font-size: 14px;\n padding: 7px 18px;\n padding-bottom: 6px;\n width: auto;\n transition: background 300ms linear;\n }\n\n &.copied {\n border-color: $valid-value-color;\n transition: none;\n\n button {\n background: $valid-value-color;\n transition: none;\n }\n }\n}\n\n.connection-prompt {\n margin-bottom: 25px;\n\n .fa-link {\n background-color: darken($ui-base-color, 4%);\n border-radius: 100%;\n font-size: 24px;\n padding: 10px;\n }\n\n &__column {\n align-items: center;\n display: flex;\n flex: 1;\n flex-direction: column;\n flex-shrink: 1;\n max-width: 50%;\n\n &-sep {\n align-self: center;\n flex-grow: 0;\n overflow: visible;\n position: relative;\n z-index: 1;\n }\n\n p {\n word-break: break-word;\n }\n }\n\n .account__avatar {\n margin-bottom: 20px;\n }\n\n &__connection {\n background-color: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n padding: 25px 10px;\n position: relative;\n text-align: center;\n\n &::after {\n background-color: darken($ui-base-color, 4%);\n content: '';\n display: block;\n height: 100%;\n left: 50%;\n position: absolute;\n top: 0;\n width: 1px;\n }\n }\n\n &__row {\n align-items: flex-start;\n display: flex;\n flex-direction: row;\n }\n}\n",".card {\n & > a {\n display: block;\n text-decoration: none;\n color: inherit;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n box-shadow: none;\n }\n\n &:hover,\n &:active,\n &:focus {\n .card__bar {\n background: lighten($ui-base-color, 8%);\n }\n }\n }\n\n &__img {\n height: 130px;\n position: relative;\n background: darken($ui-base-color, 12%);\n border-radius: 4px 4px 0 0;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n object-fit: cover;\n border-radius: 4px 4px 0 0;\n }\n\n @media screen and (max-width: 600px) {\n height: 200px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n\n &__bar {\n position: relative;\n padding: 15px;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n\n .avatar {\n flex: 0 0 auto;\n width: 48px;\n height: 48px;\n padding-top: 2px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n background: darken($ui-base-color, 8%);\n object-fit: cover;\n }\n }\n\n .display-name {\n margin-left: 15px;\n text-align: left;\n\n strong {\n font-size: 15px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n span {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n}\n\n.pagination {\n padding: 30px 0;\n text-align: center;\n overflow: hidden;\n\n a,\n .current,\n .newer,\n .older,\n .page,\n .gap {\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 500;\n display: inline-block;\n padding: 6px 10px;\n text-decoration: none;\n }\n\n .current {\n background: $simple-background-color;\n border-radius: 100px;\n color: $inverted-text-color;\n cursor: default;\n margin: 0 10px;\n }\n\n .gap {\n cursor: default;\n }\n\n .older,\n .newer {\n color: $secondary-text-color;\n }\n\n .older {\n float: left;\n padding-left: 0;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n .newer {\n float: right;\n padding-right: 0;\n\n .fa {\n display: inline-block;\n margin-left: 5px;\n }\n }\n\n .disabled {\n cursor: default;\n color: lighten($inverted-text-color, 10%);\n }\n\n @media screen and (max-width: 700px) {\n padding: 30px 20px;\n\n .page {\n display: none;\n }\n\n .newer,\n .older {\n display: inline-block;\n }\n }\n}\n\n.nothing-here {\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n color: $light-text-color;\n font-size: 14px;\n font-weight: 500;\n text-align: center;\n display: flex;\n justify-content: center;\n align-items: center;\n cursor: default;\n border-radius: 4px;\n padding: 20px;\n min-height: 30vh;\n\n &--under-tabs {\n border-radius: 0 0 4px 4px;\n }\n\n &--flexible {\n box-sizing: border-box;\n min-height: 100%;\n }\n}\n\n.account-role,\n.simple_form .recommended {\n display: inline-block;\n padding: 4px 6px;\n cursor: default;\n border-radius: 3px;\n font-size: 12px;\n line-height: 12px;\n font-weight: 500;\n color: $ui-secondary-color;\n background-color: rgba($ui-secondary-color, 0.1);\n border: 1px solid rgba($ui-secondary-color, 0.5);\n\n &.moderator {\n color: $success-green;\n background-color: rgba($success-green, 0.1);\n border-color: rgba($success-green, 0.5);\n }\n\n &.admin {\n color: lighten($error-red, 12%);\n background-color: rgba(lighten($error-red, 12%), 0.1);\n border-color: rgba(lighten($error-red, 12%), 0.5);\n }\n}\n\n.account__header__fields {\n max-width: 100vw;\n padding: 0;\n margin: 15px -15px -15px;\n border: 0 none;\n border-top: 1px solid lighten($ui-base-color, 12%);\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n font-size: 14px;\n line-height: 20px;\n\n dl {\n display: flex;\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n }\n\n dt,\n dd {\n box-sizing: border-box;\n padding: 14px;\n text-align: center;\n max-height: 48px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n dt {\n font-weight: 500;\n width: 120px;\n flex: 0 0 auto;\n color: $secondary-text-color;\n background: rgba(darken($ui-base-color, 8%), 0.5);\n }\n\n dd {\n flex: 1 1 auto;\n color: $darker-text-color;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n\n .verified {\n border: 1px solid rgba($valid-value-color, 0.5);\n background: rgba($valid-value-color, 0.25);\n\n a {\n color: $valid-value-color;\n font-weight: 500;\n }\n\n &__mark {\n color: $valid-value-color;\n }\n }\n\n dl:last-child {\n border-bottom: 0;\n }\n}\n\n.directory__tag .trends__item__current {\n width: auto;\n}\n\n.pending-account {\n &__header {\n color: $darker-text-color;\n\n a {\n color: $ui-secondary-color;\n text-decoration: none;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n\n strong {\n color: $primary-text-color;\n font-weight: 700;\n }\n }\n\n &__body {\n margin-top: 10px;\n }\n}\n",".activity-stream {\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n overflow: hidden;\n margin-bottom: 10px;\n\n &--under-tabs {\n border-radius: 0 0 4px 4px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n border-radius: 0;\n box-shadow: none;\n }\n\n &--headless {\n border-radius: 0;\n margin: 0;\n box-shadow: none;\n\n .detailed-status,\n .status {\n border-radius: 0 !important;\n }\n }\n\n div[data-component] {\n width: 100%;\n }\n\n .entry {\n background: $ui-base-color;\n\n .detailed-status,\n .status,\n .load-more {\n animation: none;\n }\n\n &:last-child {\n .detailed-status,\n .status,\n .load-more {\n border-bottom: 0;\n border-radius: 0 0 4px 4px;\n }\n }\n\n &:first-child {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 4px 4px 0 0;\n }\n\n &:last-child {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 4px;\n }\n }\n }\n\n @media screen and (max-width: 740px) {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 0 !important;\n }\n }\n }\n\n &--highlighted .entry {\n background: lighten($ui-base-color, 8%);\n }\n}\n\n.button.logo-button {\n flex: 0 auto;\n font-size: 14px;\n background: $ui-highlight-color;\n color: $primary-text-color;\n text-transform: none;\n line-height: 36px;\n height: auto;\n padding: 3px 15px;\n border: 0;\n\n svg {\n width: 20px;\n height: auto;\n vertical-align: middle;\n margin-right: 5px;\n fill: $primary-text-color;\n }\n\n &:active,\n &:focus,\n &:hover {\n background: lighten($ui-highlight-color, 10%);\n }\n\n &:disabled,\n &.disabled {\n &:active,\n &:focus,\n &:hover {\n background: $ui-primary-color;\n }\n }\n\n &.button--destructive {\n &:active,\n &:focus,\n &:hover {\n background: $error-red;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n svg {\n display: none;\n }\n }\n}\n\n.embed,\n.public-layout {\n .detailed-status {\n padding: 15px;\n }\n\n .status {\n padding: 15px 15px 15px (48px + 15px * 2);\n min-height: 48px + 2px;\n\n &__avatar {\n left: 15px;\n top: 17px;\n }\n\n &__content {\n padding-top: 5px;\n }\n\n &__prepend {\n margin-left: 48px + 15px * 2;\n padding-top: 15px;\n }\n\n &__prepend-icon-wrapper {\n left: -32px;\n }\n\n .media-gallery,\n &__action-bar,\n .video-player {\n margin-top: 10px;\n }\n }\n}\n","button.icon-button i.fa-retweet {\n background-image: url(\"data:image/svg+xml;utf8,\");\n\n &:hover {\n background-image: url(\"data:image/svg+xml;utf8,\");\n }\n}\n\nbutton.icon-button.disabled i.fa-retweet {\n background-image: url(\"data:image/svg+xml;utf8,\");\n}\n",".app-body {\n -webkit-overflow-scrolling: touch;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n}\n\n.link-button {\n display: block;\n font-size: 15px;\n line-height: 20px;\n color: $ui-highlight-color;\n border: 0;\n background: transparent;\n padding: 0;\n cursor: pointer;\n\n &:hover,\n &:active {\n text-decoration: underline;\n }\n\n &:disabled {\n color: $ui-primary-color;\n cursor: default;\n }\n}\n\n.button {\n background-color: $ui-highlight-color;\n border: 10px none;\n border-radius: 4px;\n box-sizing: border-box;\n color: $primary-text-color;\n cursor: pointer;\n display: inline-block;\n font-family: inherit;\n font-size: 15px;\n font-weight: 500;\n height: 36px;\n letter-spacing: 0;\n line-height: 36px;\n overflow: hidden;\n padding: 0 16px;\n position: relative;\n text-align: center;\n text-decoration: none;\n text-overflow: ellipsis;\n transition: all 100ms ease-in;\n white-space: nowrap;\n width: auto;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-highlight-color, 10%);\n transition: all 200ms ease-out;\n }\n\n &--destructive {\n transition: none;\n\n &:active,\n &:focus,\n &:hover {\n background-color: $error-red;\n transition: none;\n }\n }\n\n &:disabled,\n &.disabled {\n background-color: $ui-primary-color;\n cursor: default;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &.button-primary,\n &.button-alternative,\n &.button-secondary,\n &.button-alternative-2 {\n font-size: 16px;\n line-height: 36px;\n height: auto;\n text-transform: none;\n padding: 4px 16px;\n }\n\n &.button-alternative {\n color: $inverted-text-color;\n background: $ui-primary-color;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-primary-color, 4%);\n }\n }\n\n &.button-alternative-2 {\n background: $ui-base-lighter-color;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-base-lighter-color, 4%);\n }\n }\n\n &.button-secondary {\n color: $darker-text-color;\n background: transparent;\n padding: 3px 15px;\n border: 1px solid $ui-primary-color;\n\n &:active,\n &:focus,\n &:hover {\n border-color: lighten($ui-primary-color, 4%);\n color: lighten($darker-text-color, 4%);\n }\n\n &:disabled {\n opacity: 0.5;\n }\n }\n\n &.button--block {\n display: block;\n width: 100%;\n }\n}\n\n.column__wrapper {\n display: flex;\n flex: 1 1 auto;\n position: relative;\n}\n\n.icon-button {\n display: inline-block;\n padding: 0;\n color: $action-button-color;\n border: 0;\n border-radius: 4px;\n background: transparent;\n cursor: pointer;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($action-button-color, 7%);\n background-color: rgba($action-button-color, 0.15);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n }\n\n &:focus {\n background-color: rgba($action-button-color, 0.3);\n }\n\n &.disabled {\n color: darken($action-button-color, 13%);\n background-color: transparent;\n cursor: default;\n }\n\n &.active {\n color: $highlight-text-color;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &.inverted {\n color: $lighter-text-color;\n\n &:hover,\n &:active,\n &:focus {\n color: darken($lighter-text-color, 7%);\n background-color: rgba($lighter-text-color, 0.15);\n }\n\n &:focus {\n background-color: rgba($lighter-text-color, 0.3);\n }\n\n &.disabled {\n color: lighten($lighter-text-color, 7%);\n background-color: transparent;\n }\n\n &.active {\n color: $highlight-text-color;\n\n &.disabled {\n color: lighten($highlight-text-color, 13%);\n }\n }\n }\n\n &.overlayed {\n box-sizing: content-box;\n background: rgba($base-overlay-background, 0.6);\n color: rgba($primary-text-color, 0.7);\n border-radius: 4px;\n padding: 2px;\n\n &:hover {\n background: rgba($base-overlay-background, 0.9);\n }\n }\n}\n\n.text-icon-button {\n color: $lighter-text-color;\n border: 0;\n border-radius: 4px;\n background: transparent;\n cursor: pointer;\n font-weight: 600;\n font-size: 11px;\n padding: 0 3px;\n line-height: 27px;\n outline: 0;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &:hover,\n &:active,\n &:focus {\n color: darken($lighter-text-color, 7%);\n background-color: rgba($lighter-text-color, 0.15);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n }\n\n &:focus {\n background-color: rgba($lighter-text-color, 0.3);\n }\n\n &.disabled {\n color: lighten($lighter-text-color, 20%);\n background-color: transparent;\n cursor: default;\n }\n\n &.active {\n color: $highlight-text-color;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n}\n\n.dropdown-menu {\n position: absolute;\n}\n\n.invisible {\n font-size: 0;\n line-height: 0;\n display: inline-block;\n width: 0;\n height: 0;\n position: absolute;\n\n img,\n svg {\n margin: 0 !important;\n border: 0 !important;\n padding: 0 !important;\n width: 0 !important;\n height: 0 !important;\n }\n}\n\n.ellipsis {\n &::after {\n content: \"…\";\n }\n}\n\n.compose-form {\n padding: 10px;\n\n &__sensitive-button {\n padding: 10px;\n padding-top: 0;\n\n font-size: 14px;\n font-weight: 500;\n\n &.active {\n color: $highlight-text-color;\n }\n\n input[type=checkbox] {\n display: none;\n }\n\n .checkbox {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 4px;\n vertical-align: middle;\n\n &.active {\n border-color: $highlight-text-color;\n background: $highlight-text-color;\n }\n }\n }\n\n .compose-form__warning {\n color: $inverted-text-color;\n margin-bottom: 10px;\n background: $ui-primary-color;\n box-shadow: 0 2px 6px rgba($base-shadow-color, 0.3);\n padding: 8px 10px;\n border-radius: 4px;\n font-size: 13px;\n font-weight: 400;\n\n strong {\n color: $inverted-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n color: $lighter-text-color;\n font-weight: 500;\n text-decoration: underline;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: none;\n }\n }\n }\n\n .emoji-picker-dropdown {\n position: absolute;\n top: 5px;\n right: 5px;\n }\n\n .compose-form__autosuggest-wrapper {\n position: relative;\n }\n\n .autosuggest-textarea,\n .autosuggest-input,\n .spoiler-input {\n position: relative;\n width: 100%;\n }\n\n .spoiler-input {\n height: 0;\n transform-origin: bottom;\n opacity: 0;\n\n &.spoiler-input--visible {\n height: 36px;\n margin-bottom: 11px;\n opacity: 1;\n }\n }\n\n .autosuggest-textarea__textarea,\n .spoiler-input__input {\n display: block;\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n color: $inverted-text-color;\n background: $simple-background-color;\n padding: 10px;\n font-family: inherit;\n font-size: 14px;\n resize: vertical;\n border: 0;\n outline: 0;\n\n &::placeholder {\n color: $dark-text-color;\n }\n\n &:focus {\n outline: 0;\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n .spoiler-input__input {\n border-radius: 4px;\n }\n\n .autosuggest-textarea__textarea {\n min-height: 100px;\n border-radius: 4px 4px 0 0;\n padding-bottom: 0;\n padding-right: 10px + 22px;\n resize: none;\n scrollbar-color: initial;\n\n &::-webkit-scrollbar {\n all: unset;\n }\n\n @media screen and (max-width: 600px) {\n height: 100px !important; // prevent auto-resize textarea\n resize: vertical;\n }\n }\n\n .autosuggest-textarea__suggestions-wrapper {\n position: relative;\n height: 0;\n }\n\n .autosuggest-textarea__suggestions {\n box-sizing: border-box;\n display: none;\n position: absolute;\n top: 100%;\n width: 100%;\n z-index: 99;\n box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4);\n background: $ui-secondary-color;\n border-radius: 0 0 4px 4px;\n color: $inverted-text-color;\n font-size: 14px;\n padding: 6px;\n\n &.autosuggest-textarea__suggestions--visible {\n display: block;\n }\n }\n\n .autosuggest-textarea__suggestions__item {\n padding: 10px;\n cursor: pointer;\n border-radius: 4px;\n\n &:hover,\n &:focus,\n &:active,\n &.selected {\n background: darken($ui-secondary-color, 10%);\n }\n }\n\n .autosuggest-account,\n .autosuggest-emoji,\n .autosuggest-hashtag {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: flex-start;\n line-height: 18px;\n font-size: 14px;\n }\n\n .autosuggest-hashtag {\n justify-content: space-between;\n\n &__name {\n flex: 1 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n strong {\n font-weight: 500;\n }\n\n &__uses {\n flex: 0 0 auto;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n }\n\n .autosuggest-account-icon,\n .autosuggest-emoji img {\n display: block;\n margin-right: 8px;\n width: 16px;\n height: 16px;\n }\n\n .autosuggest-account .display-name__account {\n color: $lighter-text-color;\n }\n\n .compose-form__modifiers {\n color: $inverted-text-color;\n font-family: inherit;\n font-size: 14px;\n background: $simple-background-color;\n\n .compose-form__upload-wrapper {\n overflow: hidden;\n }\n\n .compose-form__uploads-wrapper {\n display: flex;\n flex-direction: row;\n padding: 5px;\n flex-wrap: wrap;\n }\n\n .compose-form__upload {\n flex: 1 1 0;\n min-width: 40%;\n margin: 5px;\n\n &__actions {\n background: linear-gradient(180deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n opacity: 0;\n transition: opacity .1s ease;\n\n .icon-button {\n flex: 0 1 auto;\n color: $secondary-text-color;\n font-size: 14px;\n font-weight: 500;\n padding: 10px;\n font-family: inherit;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($secondary-text-color, 7%);\n }\n }\n\n &.active {\n opacity: 1;\n }\n }\n\n &-description {\n position: absolute;\n z-index: 2;\n bottom: 0;\n left: 0;\n right: 0;\n box-sizing: border-box;\n background: linear-gradient(0deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);\n padding: 10px;\n opacity: 0;\n transition: opacity .1s ease;\n\n textarea {\n background: transparent;\n color: $secondary-text-color;\n border: 0;\n padding: 0;\n margin: 0;\n width: 100%;\n font-family: inherit;\n font-size: 14px;\n font-weight: 500;\n\n &:focus {\n color: $white;\n }\n\n &::placeholder {\n opacity: 0.75;\n color: $secondary-text-color;\n }\n }\n\n &.active {\n opacity: 1;\n }\n }\n }\n\n .compose-form__upload-thumbnail {\n border-radius: 4px;\n background-color: $base-shadow-color;\n background-position: center;\n background-size: cover;\n background-repeat: no-repeat;\n height: 140px;\n width: 100%;\n overflow: hidden;\n }\n }\n\n .compose-form__buttons-wrapper {\n padding: 10px;\n background: darken($simple-background-color, 8%);\n border-radius: 0 0 4px 4px;\n display: flex;\n justify-content: space-between;\n flex: 0 0 auto;\n\n .compose-form__buttons {\n display: flex;\n\n .compose-form__upload-button-icon {\n line-height: 27px;\n }\n\n .compose-form__sensitive-button {\n display: none;\n\n &.compose-form__sensitive-button--visible {\n display: block;\n }\n\n .compose-form__sensitive-button__icon {\n line-height: 27px;\n }\n }\n }\n\n .icon-button,\n .text-icon-button {\n box-sizing: content-box;\n padding: 0 3px;\n }\n\n .character-counter__wrapper {\n align-self: center;\n margin-right: 4px;\n }\n }\n\n .compose-form__publish {\n display: flex;\n justify-content: flex-end;\n min-width: 0;\n flex: 0 0 auto;\n\n .compose-form__publish-button-wrapper {\n overflow: hidden;\n padding-top: 10px;\n }\n }\n}\n\n.character-counter {\n cursor: default;\n font-family: $font-sans-serif, sans-serif;\n font-size: 14px;\n font-weight: 600;\n color: $lighter-text-color;\n\n &.character-counter--over {\n color: $warning-red;\n }\n}\n\n.no-reduce-motion .spoiler-input {\n transition: height 0.4s ease, opacity 0.4s ease;\n}\n\n.emojione {\n font-size: inherit;\n vertical-align: middle;\n object-fit: contain;\n margin: -.2ex .15em .2ex;\n width: 16px;\n height: 16px;\n\n img {\n width: auto;\n }\n}\n\n.reply-indicator {\n border-radius: 4px;\n margin-bottom: 10px;\n background: $ui-primary-color;\n padding: 10px;\n min-height: 23px;\n overflow-y: auto;\n flex: 0 2 auto;\n}\n\n.reply-indicator__header {\n margin-bottom: 5px;\n overflow: hidden;\n}\n\n.reply-indicator__cancel {\n float: right;\n line-height: 24px;\n}\n\n.reply-indicator__display-name {\n color: $inverted-text-color;\n display: block;\n max-width: 100%;\n line-height: 24px;\n overflow: hidden;\n padding-right: 25px;\n text-decoration: none;\n}\n\n.reply-indicator__display-avatar {\n float: left;\n margin-right: 5px;\n}\n\n.status__content--with-action {\n cursor: pointer;\n}\n\n.status__content,\n.reply-indicator__content {\n position: relative;\n font-size: 15px;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n padding-top: 2px;\n color: $primary-text-color;\n\n &:focus {\n outline: 0;\n }\n\n &.status__content--with-spoiler {\n white-space: normal;\n\n .status__content__text {\n white-space: pre-wrap;\n }\n }\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n img {\n max-width: 100%;\n max-height: 400px;\n object-fit: contain;\n }\n\n p {\n margin-bottom: 20px;\n white-space: pre-wrap;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: $pleroma-links;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n\n .fa {\n color: lighten($dark-text-color, 7%);\n }\n }\n\n &.mention {\n &:hover {\n text-decoration: none;\n\n span {\n text-decoration: underline;\n }\n }\n }\n\n .fa {\n color: $dark-text-color;\n }\n }\n\n a.unhandled-link {\n color: lighten($ui-highlight-color, 8%);\n }\n\n .status__content__spoiler-link {\n background: $action-button-color;\n\n &:hover {\n background: lighten($action-button-color, 7%);\n text-decoration: none;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n\n .status__content__text {\n display: none;\n\n &.status__content__text--visible {\n display: block;\n }\n }\n}\n\n.status__content.status__content--collapsed {\n max-height: 20px * 15; // 15 lines is roughly above 500 characters\n}\n\n.status__content__read-more-button {\n display: block;\n font-size: 15px;\n line-height: 20px;\n color: lighten($ui-highlight-color, 8%);\n border: 0;\n background: transparent;\n padding: 0;\n padding-top: 8px;\n\n &:hover,\n &:active {\n text-decoration: underline;\n }\n}\n\n.status__content__spoiler-link {\n display: inline-block;\n border-radius: 2px;\n background: transparent;\n border: 0;\n color: $inverted-text-color;\n font-weight: 700;\n font-size: 12px;\n padding: 0 6px;\n line-height: 20px;\n cursor: pointer;\n vertical-align: middle;\n}\n\n.status__wrapper--filtered {\n color: $dark-text-color;\n border: 0;\n font-size: inherit;\n text-align: center;\n line-height: inherit;\n margin: 0;\n padding: 15px;\n box-sizing: border-box;\n width: 100%;\n clear: both;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n}\n\n.status__prepend-icon-wrapper {\n left: -26px;\n position: absolute;\n}\n\n.focusable {\n &:focus {\n outline: 0;\n background: lighten($ui-base-color, 4%);\n\n .status.status-direct {\n background: lighten($ui-base-color, 12%);\n\n &.muted {\n background: transparent;\n }\n }\n\n .detailed-status,\n .detailed-status__action-bar {\n background: lighten($ui-base-color, 8%);\n }\n }\n}\n\n.status {\n padding: 8px 10px;\n padding-left: 68px;\n position: relative;\n min-height: 54px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n\n @supports (-ms-overflow-style: -ms-autohiding-scrollbar) {\n // Add margin to avoid Edge auto-hiding scrollbar appearing over content.\n // On Edge 16 this is 16px and Edge <=15 it's 12px, so aim for 16px.\n padding-right: 26px; // 10px + 16px\n }\n\n @keyframes fade {\n 0% { opacity: 0; }\n 100% { opacity: 1; }\n }\n\n opacity: 1;\n animation: fade 150ms linear;\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n }\n\n &.status-direct:not(.read) {\n background: lighten($ui-base-color, 8%);\n border-bottom-color: lighten($ui-base-color, 12%);\n }\n\n &.light {\n .status__relative-time {\n color: $light-text-color;\n }\n\n .status__display-name {\n color: $inverted-text-color;\n }\n\n .display-name {\n strong {\n color: $inverted-text-color;\n }\n\n span {\n color: $light-text-color;\n }\n }\n\n .status__content {\n color: $inverted-text-color;\n\n a {\n color: $highlight-text-color;\n }\n\n a.status__content__spoiler-link {\n color: $primary-text-color;\n background: $ui-primary-color;\n\n &:hover {\n background: lighten($ui-primary-color, 8%);\n }\n }\n }\n }\n}\n\n.notification-favourite {\n .status.status-direct {\n background: transparent;\n\n .icon-button.disabled {\n color: lighten($action-button-color, 13%);\n }\n }\n}\n\n.status__relative-time,\n.notification__relative_time {\n color: $dark-text-color;\n float: right;\n font-size: 14px;\n}\n\n.status__display-name {\n color: $dark-text-color;\n}\n\n.status__info .status__display-name {\n display: block;\n max-width: 100%;\n padding-right: 25px;\n}\n\n.status__info {\n font-size: 15px;\n}\n\n.status-check-box {\n border-bottom: 1px solid $ui-secondary-color;\n display: flex;\n\n .status-check-box__status {\n margin: 10px 0 10px 10px;\n flex: 1;\n\n .media-gallery {\n max-width: 250px;\n }\n\n .status__content {\n padding: 0;\n white-space: normal;\n }\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n max-width: 250px;\n }\n\n .media-gallery__item-thumbnail {\n cursor: default;\n }\n }\n}\n\n.status-check-box-toggle {\n align-items: center;\n display: flex;\n flex: 0 0 auto;\n justify-content: center;\n padding: 10px;\n}\n\n.status__prepend {\n margin-left: 68px;\n color: $dark-text-color;\n padding: 8px 0;\n padding-bottom: 2px;\n font-size: 14px;\n position: relative;\n\n .status__display-name strong {\n color: $dark-text-color;\n }\n\n > span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.status__action-bar {\n align-items: center;\n display: flex;\n margin-top: 8px;\n\n &__counter {\n display: inline-flex;\n margin-right: 11px;\n align-items: center;\n\n .status__action-bar-button {\n margin-right: 4px;\n }\n\n &__label {\n display: inline-block;\n width: 14px;\n font-size: 12px;\n font-weight: 500;\n color: $action-button-color;\n }\n }\n}\n\n.status__action-bar-button {\n margin-right: 18px;\n}\n\n.status__action-bar-dropdown {\n height: 23.15px;\n width: 23.15px;\n}\n\n.detailed-status__action-bar-dropdown {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n}\n\n.detailed-status {\n background: lighten($ui-base-color, 4%);\n padding: 14px 10px;\n\n &--flex {\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n align-items: flex-start;\n\n .status__content,\n .detailed-status__meta {\n flex: 100%;\n }\n }\n\n .status__content {\n font-size: 19px;\n line-height: 24px;\n\n .emojione {\n width: 24px;\n height: 24px;\n margin: -1px 0 0;\n }\n\n .status__content__spoiler-link {\n line-height: 24px;\n margin: -1px 0 0;\n }\n }\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n }\n}\n\n.detailed-status__meta {\n margin-top: 15px;\n color: $dark-text-color;\n font-size: 14px;\n line-height: 18px;\n}\n\n.detailed-status__action-bar {\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: row;\n padding: 10px 0;\n}\n\n.detailed-status__link {\n color: inherit;\n text-decoration: none;\n}\n\n.detailed-status__favorites,\n.detailed-status__reblogs {\n display: inline-block;\n font-weight: 500;\n font-size: 12px;\n margin-left: 6px;\n}\n\n.reply-indicator__content {\n color: $inverted-text-color;\n font-size: 14px;\n\n a {\n color: $lighter-text-color;\n }\n}\n\n.domain {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n .domain__domain-name {\n flex: 1 1 auto;\n display: block;\n color: $primary-text-color;\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n }\n}\n\n.domain__wrapper {\n display: flex;\n}\n\n.domain_buttons {\n height: 18px;\n padding: 10px;\n white-space: nowrap;\n}\n\n.account {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &.compact {\n padding: 0;\n border-bottom: 0;\n\n .account__avatar-wrapper {\n margin-left: 0;\n }\n }\n\n .account__display-name {\n flex: 1 1 auto;\n display: block;\n color: $darker-text-color;\n overflow: hidden;\n text-decoration: none;\n font-size: 14px;\n }\n}\n\n.account__wrapper {\n display: flex;\n}\n\n.account__avatar-wrapper {\n float: left;\n margin-left: 12px;\n margin-right: 12px;\n}\n\n.account__avatar {\n @include avatar-radius;\n position: relative;\n\n &-inline {\n display: inline-block;\n vertical-align: middle;\n margin-right: 5px;\n }\n\n &-composite {\n @include avatar-radius;\n border-radius: 50%;\n overflow: hidden;\n position: relative;\n cursor: default;\n\n & > div {\n float: left;\n position: relative;\n box-sizing: border-box;\n }\n\n &__label {\n display: block;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n color: $primary-text-color;\n text-shadow: 1px 1px 2px $base-shadow-color;\n font-weight: 700;\n font-size: 15px;\n }\n }\n}\n\na .account__avatar {\n cursor: pointer;\n}\n\n.account__avatar-overlay {\n @include avatar-size(48px);\n\n &-base {\n @include avatar-radius;\n @include avatar-size(36px);\n }\n\n &-overlay {\n @include avatar-radius;\n @include avatar-size(24px);\n\n position: absolute;\n bottom: 0;\n right: 0;\n z-index: 1;\n }\n}\n\n.account__relationship {\n height: 18px;\n padding: 10px;\n white-space: nowrap;\n}\n\n.account__disclaimer {\n padding: 10px;\n border-top: 1px solid lighten($ui-base-color, 8%);\n color: $dark-text-color;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n font-weight: 500;\n color: inherit;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n}\n\n.account__action-bar {\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n line-height: 36px;\n overflow: hidden;\n flex: 0 0 auto;\n display: flex;\n}\n\n.account__action-bar-dropdown {\n padding: 10px;\n\n .icon-button {\n vertical-align: middle;\n }\n\n .dropdown--active {\n .dropdown__content.dropdown__right {\n left: 6px;\n right: initial;\n }\n\n &::after {\n bottom: initial;\n margin-left: 11px;\n margin-top: -7px;\n right: initial;\n }\n }\n}\n\n.account__action-bar-links {\n display: flex;\n flex: 1 1 auto;\n line-height: 18px;\n text-align: center;\n}\n\n.account__action-bar__tab {\n text-decoration: none;\n overflow: hidden;\n flex: 0 1 100%;\n border-right: 1px solid lighten($ui-base-color, 8%);\n padding: 10px 0;\n border-bottom: 4px solid transparent;\n\n &.active {\n border-bottom: 4px solid $ui-highlight-color;\n }\n\n & > span {\n display: block;\n font-size: 12px;\n color: $darker-text-color;\n }\n\n strong {\n display: block;\n font-size: 15px;\n font-weight: 500;\n color: $primary-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n}\n\n.account-authorize {\n padding: 14px 10px;\n\n .detailed-status__display-name {\n display: block;\n margin-bottom: 15px;\n overflow: hidden;\n }\n}\n\n.account-authorize__avatar {\n float: left;\n margin-right: 10px;\n}\n\n.status__display-name,\n.status__relative-time,\n.detailed-status__display-name,\n.detailed-status__datetime,\n.detailed-status__application,\n.account__display-name {\n text-decoration: none;\n}\n\n.status__display-name,\n.account__display-name {\n strong {\n color: $primary-text-color;\n }\n}\n\n.muted {\n .emojione {\n opacity: 0.5;\n }\n}\n\n.status__display-name,\n.reply-indicator__display-name,\n.detailed-status__display-name,\na.account__display-name {\n &:hover strong {\n text-decoration: underline;\n }\n}\n\n.account__display-name strong {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.detailed-status__application,\n.detailed-status__datetime {\n color: inherit;\n}\n\n.detailed-status .button.logo-button {\n margin-bottom: 15px;\n}\n\n.detailed-status__display-name {\n color: $secondary-text-color;\n display: block;\n line-height: 24px;\n margin-bottom: 15px;\n overflow: hidden;\n\n strong,\n span {\n display: block;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n strong {\n font-size: 16px;\n color: $primary-text-color;\n }\n}\n\n.detailed-status__display-avatar {\n float: left;\n margin-right: 10px;\n}\n\n.status__avatar {\n height: 48px;\n left: 10px;\n position: absolute;\n top: 10px;\n width: 48px;\n}\n\n.status__expand {\n width: 68px;\n position: absolute;\n left: 0;\n top: 0;\n height: 100%;\n cursor: pointer;\n}\n\n.muted {\n .status__content,\n .status__content p,\n .status__content a {\n color: $dark-text-color;\n }\n\n .status__display-name strong {\n color: $dark-text-color;\n }\n\n .status__avatar {\n opacity: 0.5;\n }\n\n a.status__content__spoiler-link {\n background: $ui-base-lighter-color;\n color: $inverted-text-color;\n\n &:hover {\n background: lighten($ui-base-lighter-color, 7%);\n text-decoration: none;\n }\n }\n}\n\n.notification__message {\n margin: 0 10px 0 68px;\n padding: 8px 0 0;\n cursor: default;\n color: $darker-text-color;\n font-size: 15px;\n line-height: 22px;\n position: relative;\n\n .fa {\n color: $highlight-text-color;\n }\n\n > span {\n display: inline;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.notification__favourite-icon-wrapper {\n left: -26px;\n position: absolute;\n\n .star-icon {\n color: $gold-star;\n }\n}\n\n.star-icon.active {\n color: $gold-star;\n}\n\n.bookmark-icon.active {\n color: $red-bookmark;\n}\n\n.no-reduce-motion .icon-button.star-icon {\n &.activate {\n & > .fa-star {\n animation: spring-rotate-in 1s linear;\n }\n }\n\n &.deactivate {\n & > .fa-star {\n animation: spring-rotate-out 1s linear;\n }\n }\n}\n\n.notification__display-name {\n color: inherit;\n font-weight: 500;\n text-decoration: none;\n\n &:hover {\n color: $primary-text-color;\n text-decoration: underline;\n }\n}\n\n.notification__relative_time {\n float: right;\n}\n\n.display-name {\n display: block;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.display-name__html {\n font-weight: 500;\n}\n\n.display-name__account {\n font-size: 14px;\n}\n\n.status__relative-time,\n.detailed-status__datetime {\n &:hover {\n text-decoration: underline;\n }\n}\n\n.image-loader {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n\n .image-loader__preview-canvas {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n background: url('~images/void.png') repeat;\n object-fit: contain;\n }\n\n .loading-bar {\n position: relative;\n }\n\n &.image-loader--amorphous .image-loader__preview-canvas {\n display: none;\n }\n}\n\n.zoomable-image {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n img {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n width: auto;\n height: auto;\n object-fit: contain;\n }\n}\n\n.navigation-bar {\n padding: 10px;\n display: flex;\n align-items: center;\n flex-shrink: 0;\n cursor: default;\n color: $darker-text-color;\n\n strong {\n color: $secondary-text-color;\n }\n\n a {\n color: inherit;\n }\n\n .permalink {\n text-decoration: none;\n }\n\n .navigation-bar__actions {\n position: relative;\n\n .icon-button.close {\n position: absolute;\n pointer-events: none;\n transform: scale(0, 1) translate(-100%, 0);\n opacity: 0;\n }\n\n .compose__action-bar .icon-button {\n pointer-events: auto;\n transform: scale(1, 1) translate(0, 0);\n opacity: 1;\n }\n }\n}\n\n.navigation-bar__profile {\n flex: 1 1 auto;\n margin-left: 8px;\n line-height: 20px;\n margin-top: -1px;\n overflow: hidden;\n}\n\n.navigation-bar__profile-account {\n display: block;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.navigation-bar__profile-edit {\n color: inherit;\n text-decoration: none;\n}\n\n.dropdown {\n display: inline-block;\n}\n\n.dropdown__content {\n display: none;\n position: absolute;\n}\n\n.dropdown-menu__separator {\n border-bottom: 1px solid darken($ui-secondary-color, 8%);\n margin: 5px 7px 6px;\n height: 0;\n}\n\n.dropdown-menu {\n background: $ui-secondary-color;\n padding: 4px 0;\n border-radius: 4px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n z-index: 9999;\n\n ul {\n list-style: none;\n }\n\n &.left {\n transform-origin: 100% 50%;\n }\n\n &.top {\n transform-origin: 50% 100%;\n }\n\n &.bottom {\n transform-origin: 50% 0;\n }\n\n &.right {\n transform-origin: 0 50%;\n }\n}\n\n.dropdown-menu__arrow {\n position: absolute;\n width: 0;\n height: 0;\n border: 0 solid transparent;\n\n &.left {\n right: -5px;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: $ui-secondary-color;\n }\n\n &.top {\n bottom: -5px;\n margin-left: -7px;\n border-width: 5px 7px 0;\n border-top-color: $ui-secondary-color;\n }\n\n &.bottom {\n top: -5px;\n margin-left: -7px;\n border-width: 0 7px 5px;\n border-bottom-color: $ui-secondary-color;\n }\n\n &.right {\n left: -5px;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: $ui-secondary-color;\n }\n}\n\n.dropdown-menu__item {\n a {\n font-size: 13px;\n line-height: 18px;\n display: block;\n padding: 4px 14px;\n box-sizing: border-box;\n text-decoration: none;\n background: $ui-secondary-color;\n color: $inverted-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:focus,\n &:hover,\n &:active {\n background: $ui-highlight-color;\n color: $secondary-text-color;\n outline: 0;\n }\n }\n}\n\n.dropdown--active .dropdown__content {\n display: block;\n line-height: 18px;\n max-width: 311px;\n right: 0;\n text-align: left;\n z-index: 9999;\n\n & > ul {\n list-style: none;\n background: $ui-secondary-color;\n padding: 4px 0;\n border-radius: 4px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.4);\n min-width: 140px;\n position: relative;\n }\n\n &.dropdown__right {\n right: 0;\n }\n\n &.dropdown__left {\n & > ul {\n left: -98px;\n }\n }\n\n & > ul > li > a {\n font-size: 13px;\n line-height: 18px;\n display: block;\n padding: 4px 14px;\n box-sizing: border-box;\n text-decoration: none;\n background: $ui-secondary-color;\n color: $inverted-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:focus {\n outline: 0;\n }\n\n &:hover {\n background: $ui-highlight-color;\n color: $secondary-text-color;\n }\n }\n}\n\n.dropdown__icon {\n vertical-align: middle;\n}\n\n.columns-area {\n display: flex;\n flex: 1 1 auto;\n flex-direction: row;\n justify-content: flex-start;\n overflow-x: auto;\n position: relative;\n\n &.unscrollable {\n overflow-x: hidden;\n }\n\n &__panels {\n display: flex;\n justify-content: center;\n width: 100%;\n height: 100%;\n min-height: 100vh;\n\n &__pane {\n height: 100%;\n overflow: hidden;\n pointer-events: none;\n display: flex;\n justify-content: flex-end;\n min-width: 285px;\n\n &--start {\n justify-content: flex-start;\n }\n\n &__inner {\n position: fixed;\n width: 285px;\n pointer-events: auto;\n height: 100%;\n }\n }\n\n &__main {\n box-sizing: border-box;\n width: 100%;\n max-width: 600px;\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding: 0 10px;\n }\n }\n }\n}\n\n.tabs-bar__wrapper {\n background: darken($ui-base-color, 8%);\n position: sticky;\n top: 0;\n z-index: 2;\n padding-top: 0;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding-top: 10px;\n }\n\n .tabs-bar {\n margin-bottom: 0;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n margin-bottom: 10px;\n }\n }\n}\n\n.react-swipeable-view-container {\n &,\n .columns-area,\n .drawer,\n .column {\n height: 100%;\n }\n}\n\n.react-swipeable-view-container > * {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n}\n\n.column {\n width: 350px;\n position: relative;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n\n > .scrollable {\n background: $ui-base-color;\n border-bottom-left-radius: 2px;\n border-bottom-right-radius: 2px;\n }\n}\n\n.ui {\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n}\n\n.drawer {\n width: 330px;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n overflow-y: hidden;\n}\n\n.drawer__tab {\n display: block;\n flex: 1 1 auto;\n padding: 15px 5px 13px;\n color: $darker-text-color;\n text-decoration: none;\n text-align: center;\n font-size: 16px;\n border-bottom: 2px solid transparent;\n}\n\n.column,\n.drawer {\n flex: 1 1 auto;\n overflow: hidden;\n}\n\n@media screen and (min-width: 631px) {\n .columns-area {\n padding: 0;\n }\n\n .column,\n .drawer {\n flex: 0 0 auto;\n padding: 10px;\n padding-left: 5px;\n padding-right: 5px;\n\n &:first-child {\n padding-left: 10px;\n }\n\n &:last-child {\n padding-right: 10px;\n }\n }\n\n .columns-area > div {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n }\n }\n}\n\n.tabs-bar {\n box-sizing: border-box;\n display: flex;\n background: lighten($ui-base-color, 8%);\n flex: 0 0 auto;\n overflow-y: auto;\n}\n\n.tabs-bar__link {\n display: block;\n flex: 1 1 auto;\n padding: 15px 10px;\n padding-bottom: 13px;\n color: $primary-text-color;\n text-decoration: none;\n text-align: center;\n font-size: 14px;\n font-weight: 500;\n border-bottom: 2px solid lighten($ui-base-color, 8%);\n transition: all 50ms linear;\n transition-property: border-bottom, background, color;\n\n .fa {\n font-weight: 400;\n font-size: 16px;\n }\n\n &:hover,\n &:focus,\n &:active {\n @media screen and (min-width: 631px) {\n background: lighten($ui-base-color, 14%);\n border-bottom-color: lighten($ui-base-color, 14%);\n }\n }\n\n &.active {\n border-bottom: 2px solid $highlight-text-color;\n color: $highlight-text-color;\n }\n\n span {\n margin-left: 5px;\n display: none;\n }\n}\n\n@media screen and (min-width: 600px) {\n .tabs-bar__link {\n span {\n display: inline;\n }\n }\n}\n\n.columns-area--mobile {\n flex-direction: column;\n width: 100%;\n height: 100%;\n margin: 0 auto;\n\n .column,\n .drawer {\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .directory__list {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: block;\n }\n }\n\n .directory__card {\n margin-bottom: 0;\n }\n\n .filter-form {\n display: flex;\n }\n\n .autosuggest-textarea__textarea {\n font-size: 16px;\n }\n\n .search__input {\n line-height: 18px;\n font-size: 16px;\n padding: 15px;\n padding-right: 30px;\n }\n\n .search__icon .fa {\n top: 15px;\n }\n\n .scrollable {\n overflow: visible;\n\n @supports(display: grid) {\n contain: content;\n }\n }\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding: 10px 0;\n padding-top: 0;\n }\n\n @media screen and (min-width: 630px) {\n .detailed-status {\n padding: 15px;\n\n .media-gallery,\n .video-player,\n .audio-player {\n margin-top: 15px;\n }\n }\n\n .account__header__bar {\n padding: 5px 10px;\n }\n\n .navigation-bar,\n .compose-form {\n padding: 15px;\n }\n\n .compose-form .compose-form__publish .compose-form__publish-button-wrapper {\n padding-top: 15px;\n }\n\n .status {\n padding: 15px 15px 15px (48px + 15px * 2);\n min-height: 48px + 2px;\n\n &__avatar {\n left: 15px;\n top: 17px;\n }\n\n &__content {\n padding-top: 5px;\n }\n\n &__prepend {\n margin-left: 48px + 15px * 2;\n padding-top: 15px;\n }\n\n &__prepend-icon-wrapper {\n left: -32px;\n }\n\n .media-gallery,\n &__action-bar,\n .video-player,\n .audio-player {\n margin-top: 10px;\n }\n }\n\n .account {\n padding: 15px 10px;\n\n &__header__bio {\n margin: 0 -10px;\n }\n }\n\n .notification {\n &__message {\n margin-left: 48px + 15px * 2;\n padding-top: 15px;\n }\n\n &__favourite-icon-wrapper {\n left: -32px;\n }\n\n .status {\n padding-top: 8px;\n }\n\n .account {\n padding-top: 8px;\n }\n\n .account__avatar-wrapper {\n margin-left: 17px;\n margin-right: 15px;\n }\n }\n }\n}\n\n.floating-action-button {\n position: fixed;\n display: flex;\n justify-content: center;\n align-items: center;\n width: 3.9375rem;\n height: 3.9375rem;\n bottom: 1.3125rem;\n right: 1.3125rem;\n background: darken($ui-highlight-color, 3%);\n color: $white;\n border-radius: 50%;\n font-size: 21px;\n line-height: 21px;\n text-decoration: none;\n box-shadow: 2px 3px 9px rgba($base-shadow-color, 0.4);\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-highlight-color, 7%);\n }\n}\n\n@media screen and (min-width: $no-gap-breakpoint) {\n .tabs-bar {\n width: 100%;\n }\n\n .react-swipeable-view-container .columns-area--mobile {\n height: calc(100% - 10px) !important;\n }\n\n .getting-started__wrapper,\n .getting-started__trends,\n .search {\n margin-bottom: 10px;\n }\n\n .getting-started__panel {\n margin: 10px 0;\n }\n\n .column,\n .drawer {\n min-width: 330px;\n }\n}\n\n@media screen and (max-width: 600px + (285px * 1) + (10px * 1)) {\n .columns-area__panels__pane--compositional {\n display: none;\n }\n}\n\n@media screen and (min-width: 600px + (285px * 1) + (10px * 1)) {\n .floating-action-button,\n .tabs-bar__link.optional {\n display: none;\n }\n\n .search-page .search {\n display: none;\n }\n}\n\n@media screen and (max-width: 600px + (285px * 2) + (10px * 2)) {\n .columns-area__panels__pane--navigational {\n display: none;\n }\n}\n\n@media screen and (min-width: 600px + (285px * 2) + (10px * 2)) {\n .tabs-bar {\n display: none;\n }\n}\n\n.icon-with-badge {\n position: relative;\n\n &__badge {\n position: absolute;\n left: 9px;\n top: -13px;\n background: $ui-highlight-color;\n border: 2px solid lighten($ui-base-color, 8%);\n padding: 1px 6px;\n border-radius: 6px;\n font-size: 10px;\n font-weight: 500;\n line-height: 14px;\n color: $primary-text-color;\n }\n}\n\n.column-link--transparent .icon-with-badge__badge {\n border-color: darken($ui-base-color, 8%);\n}\n\n.compose-panel {\n width: 285px;\n margin-top: 10px;\n display: flex;\n flex-direction: column;\n height: calc(100% - 10px);\n overflow-y: hidden;\n\n .navigation-bar {\n padding-top: 20px;\n padding-bottom: 20px;\n flex: 0 1 48px;\n min-height: 20px;\n }\n\n .flex-spacer {\n background: transparent;\n }\n\n .compose-form {\n flex: 1;\n overflow-y: hidden;\n display: flex;\n flex-direction: column;\n min-height: 310px;\n padding-bottom: 71px;\n margin-bottom: -71px;\n }\n\n .compose-form__autosuggest-wrapper {\n overflow-y: auto;\n background-color: $white;\n border-radius: 4px 4px 0 0;\n flex: 0 1 auto;\n }\n\n .autosuggest-textarea__textarea {\n overflow-y: hidden;\n }\n\n .compose-form__upload-thumbnail {\n height: 80px;\n }\n}\n\n.navigation-panel {\n margin-top: 10px;\n margin-bottom: 10px;\n height: calc(100% - 20px);\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n\n & > a {\n flex: 0 0 auto;\n }\n\n hr {\n flex: 0 0 auto;\n border: 0;\n background: transparent;\n border-top: 1px solid lighten($ui-base-color, 4%);\n margin: 10px 0;\n }\n\n .flex-spacer {\n background: transparent;\n }\n}\n\n.drawer__pager {\n box-sizing: border-box;\n padding: 0;\n flex-grow: 1;\n position: relative;\n overflow: hidden;\n display: flex;\n}\n\n.drawer__inner {\n position: absolute;\n top: 0;\n left: 0;\n background: lighten($ui-base-color, 13%);\n box-sizing: border-box;\n padding: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n overflow-y: auto;\n width: 100%;\n height: 100%;\n border-radius: 2px;\n\n &.darker {\n background: $ui-base-color;\n }\n}\n\n.drawer__inner__mastodon {\n background: lighten($ui-base-color, 13%) url('data:image/svg+xml;utf8,') no-repeat bottom / 100% auto;\n flex: 1;\n min-height: 47px;\n display: none;\n\n > img {\n display: block;\n object-fit: contain;\n object-position: bottom left;\n width: 100%;\n height: 100%;\n pointer-events: none;\n user-drag: none;\n user-select: none;\n }\n\n @media screen and (min-height: 640px) {\n display: block;\n }\n}\n\n.pseudo-drawer {\n background: lighten($ui-base-color, 13%);\n font-size: 13px;\n text-align: left;\n}\n\n.drawer__header {\n flex: 0 0 auto;\n font-size: 16px;\n background: lighten($ui-base-color, 8%);\n margin-bottom: 10px;\n display: flex;\n flex-direction: row;\n border-radius: 2px;\n\n a {\n transition: background 100ms ease-in;\n\n &:hover {\n background: lighten($ui-base-color, 3%);\n transition: background 200ms ease-out;\n }\n }\n}\n\n.scrollable {\n overflow-y: scroll;\n overflow-x: hidden;\n flex: 1 1 auto;\n -webkit-overflow-scrolling: touch;\n\n &.optionally-scrollable {\n overflow-y: auto;\n }\n\n @supports(display: grid) { // hack to fix Chrome <57\n contain: strict;\n }\n\n &--flex {\n display: flex;\n flex-direction: column;\n }\n\n &__append {\n flex: 1 1 auto;\n position: relative;\n min-height: 120px;\n }\n}\n\n.scrollable.fullscreen {\n @supports(display: grid) { // hack to fix Chrome <57\n contain: none;\n }\n}\n\n.column-back-button {\n box-sizing: border-box;\n width: 100%;\n background: lighten($ui-base-color, 4%);\n color: $highlight-text-color;\n cursor: pointer;\n flex: 0 0 auto;\n font-size: 16px;\n line-height: inherit;\n border: 0;\n text-align: unset;\n padding: 15px;\n margin: 0;\n z-index: 3;\n outline: 0;\n\n &:hover {\n text-decoration: underline;\n }\n}\n\n.column-header__back-button {\n background: lighten($ui-base-color, 4%);\n border: 0;\n font-family: inherit;\n color: $highlight-text-color;\n cursor: pointer;\n white-space: nowrap;\n font-size: 16px;\n padding: 0 5px 0 0;\n z-index: 3;\n\n &:hover {\n text-decoration: underline;\n }\n\n &:last-child {\n padding: 0 15px 0 0;\n }\n}\n\n.column-back-button__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.column-back-button--slim {\n position: relative;\n}\n\n.column-back-button--slim-button {\n cursor: pointer;\n flex: 0 0 auto;\n font-size: 16px;\n padding: 15px;\n position: absolute;\n right: 0;\n top: -48px;\n}\n\n.react-toggle {\n display: inline-block;\n position: relative;\n cursor: pointer;\n background-color: transparent;\n border: 0;\n padding: 0;\n user-select: none;\n -webkit-tap-highlight-color: rgba($base-overlay-background, 0);\n -webkit-tap-highlight-color: transparent;\n}\n\n.react-toggle-screenreader-only {\n border: 0;\n clip: rect(0 0 0 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n}\n\n.react-toggle--disabled {\n cursor: not-allowed;\n opacity: 0.5;\n transition: opacity 0.25s;\n}\n\n.react-toggle-track {\n width: 50px;\n height: 24px;\n padding: 0;\n border-radius: 30px;\n background-color: $ui-base-color;\n transition: background-color 0.2s ease;\n}\n\n.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track {\n background-color: darken($ui-base-color, 10%);\n}\n\n.react-toggle--checked .react-toggle-track {\n background-color: $ui-highlight-color;\n}\n\n.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track {\n background-color: lighten($ui-highlight-color, 10%);\n}\n\n.react-toggle-track-check {\n position: absolute;\n width: 14px;\n height: 10px;\n top: 0;\n bottom: 0;\n margin-top: auto;\n margin-bottom: auto;\n line-height: 0;\n left: 8px;\n opacity: 0;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle--checked .react-toggle-track-check {\n opacity: 1;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle-track-x {\n position: absolute;\n width: 10px;\n height: 10px;\n top: 0;\n bottom: 0;\n margin-top: auto;\n margin-bottom: auto;\n line-height: 0;\n right: 10px;\n opacity: 1;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle--checked .react-toggle-track-x {\n opacity: 0;\n}\n\n.react-toggle-thumb {\n position: absolute;\n top: 1px;\n left: 1px;\n width: 22px;\n height: 22px;\n border: 1px solid $ui-base-color;\n border-radius: 50%;\n background-color: darken($simple-background-color, 2%);\n box-sizing: border-box;\n transition: all 0.25s ease;\n transition-property: border-color, left;\n}\n\n.react-toggle--checked .react-toggle-thumb {\n left: 27px;\n border-color: $ui-highlight-color;\n}\n\n.column-link {\n background: lighten($ui-base-color, 8%);\n color: $primary-text-color;\n display: block;\n font-size: 16px;\n padding: 15px;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 11%);\n }\n\n &:focus {\n outline: 0;\n }\n\n &--transparent {\n background: transparent;\n color: $ui-secondary-color;\n\n &:hover,\n &:focus,\n &:active {\n background: transparent;\n color: $primary-text-color;\n }\n\n &.active {\n color: $ui-highlight-color;\n }\n }\n}\n\n.column-link__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.column-link__badge {\n display: inline-block;\n border-radius: 4px;\n font-size: 12px;\n line-height: 19px;\n font-weight: 500;\n background: $ui-base-color;\n padding: 4px 8px;\n margin: -6px 10px;\n}\n\n.column-subheading {\n background: $ui-base-color;\n color: $dark-text-color;\n padding: 8px 20px;\n font-size: 13px;\n font-weight: 500;\n cursor: default;\n}\n\n.getting-started__wrapper,\n.getting-started,\n.flex-spacer {\n background: $ui-base-color;\n}\n\n.flex-spacer {\n flex: 1 1 auto;\n}\n\n.getting-started {\n color: $dark-text-color;\n overflow: auto;\n border-bottom-left-radius: 2px;\n border-bottom-right-radius: 2px;\n\n &__wrapper,\n &__panel,\n &__footer {\n height: min-content;\n }\n\n &__panel,\n &__footer\n {\n padding: 10px;\n padding-top: 20px;\n flex-grow: 0;\n\n ul {\n margin-bottom: 10px;\n }\n\n ul li {\n display: inline;\n }\n\n p {\n font-size: 13px;\n\n a {\n color: $dark-text-color;\n text-decoration: underline;\n }\n }\n\n a {\n text-decoration: none;\n color: $darker-text-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n }\n\n &__wrapper,\n &__footer\n {\n color: $dark-text-color;\n }\n\n &__trends {\n flex: 0 1 auto;\n opacity: 1;\n animation: fade 150ms linear;\n margin-top: 10px;\n\n h4 {\n font-size: 13px;\n color: $darker-text-color;\n padding: 10px;\n font-weight: 500;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n @media screen and (max-height: 810px) {\n .trends__item:nth-child(3) {\n display: none;\n }\n }\n\n @media screen and (max-height: 720px) {\n .trends__item:nth-child(2) {\n display: none;\n }\n }\n\n @media screen and (max-height: 670px) {\n display: none;\n }\n\n .trends__item {\n border-bottom: 0;\n padding: 10px;\n\n &__current {\n color: $darker-text-color;\n }\n }\n }\n}\n\n.keyboard-shortcuts {\n padding: 8px 0 0;\n overflow: hidden;\n\n thead {\n position: absolute;\n left: -9999px;\n }\n\n td {\n padding: 0 10px 8px;\n }\n\n kbd {\n display: inline-block;\n padding: 3px 5px;\n background-color: lighten($ui-base-color, 8%);\n border: 1px solid darken($ui-base-color, 4%);\n }\n}\n\n.setting-text {\n display: block;\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n color: $inverted-text-color;\n background: $simple-background-color;\n padding: 10px;\n font-family: inherit;\n font-size: 14px;\n resize: vertical;\n border: 0;\n outline: 0;\n border-radius: 4px;\n\n &:focus {\n outline: 0;\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n}\n\n.no-reduce-motion button.icon-button i.fa-retweet {\n background-position: 0 0;\n height: 19px;\n transition: background-position 0.9s steps(10);\n transition-duration: 0s;\n vertical-align: middle;\n width: 22px;\n\n &::before {\n display: none !important;\n }\n\n}\n\n.no-reduce-motion button.icon-button.active i.fa-retweet {\n transition-duration: 0.9s;\n background-position: 0 100%;\n}\n\n.reduce-motion button.icon-button i.fa-retweet {\n color: $action-button-color;\n transition: color 100ms ease-in;\n}\n\n.reduce-motion button.icon-button.active i.fa-retweet {\n color: $highlight-text-color;\n}\n\n.status-card {\n display: flex;\n font-size: 14px;\n border: 1px solid lighten($ui-base-color, 8%);\n border-radius: 4px;\n color: $dark-text-color;\n margin-top: 14px;\n text-decoration: none;\n overflow: hidden;\n\n &__actions {\n bottom: 0;\n left: 0;\n position: absolute;\n right: 0;\n top: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n\n & > div {\n background: rgba($base-shadow-color, 0.6);\n border-radius: 8px;\n padding: 12px 9px;\n flex: 0 0 auto;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n button,\n a {\n display: inline;\n color: $secondary-text-color;\n background: transparent;\n border: 0;\n padding: 0 8px;\n text-decoration: none;\n font-size: 18px;\n line-height: 18px;\n\n &:hover,\n &:active,\n &:focus {\n color: $primary-text-color;\n }\n }\n\n a {\n font-size: 19px;\n position: relative;\n bottom: -1px;\n }\n }\n}\n\na.status-card {\n cursor: pointer;\n\n &:hover {\n background: lighten($ui-base-color, 8%);\n }\n}\n\n.status-card-photo {\n cursor: zoom-in;\n display: block;\n text-decoration: none;\n width: 100%;\n height: auto;\n margin: 0;\n}\n\n.status-card-video {\n iframe {\n width: 100%;\n height: 100%;\n }\n}\n\n.status-card__title {\n display: block;\n font-weight: 500;\n margin-bottom: 5px;\n color: $darker-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-decoration: none;\n}\n\n.status-card__content {\n flex: 1 1 auto;\n overflow: hidden;\n padding: 14px 14px 14px 8px;\n}\n\n.status-card__description {\n color: $darker-text-color;\n}\n\n.status-card__host {\n display: block;\n margin-top: 5px;\n font-size: 13px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.status-card__image {\n flex: 0 0 100px;\n background: lighten($ui-base-color, 8%);\n position: relative;\n\n & > .fa {\n font-size: 21px;\n position: absolute;\n transform-origin: 50% 50%;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n}\n\n.status-card.horizontal {\n display: block;\n\n .status-card__image {\n width: 100%;\n }\n\n .status-card__image-image {\n border-radius: 4px 4px 0 0;\n }\n\n .status-card__title {\n white-space: inherit;\n }\n}\n\n.status-card.compact {\n border-color: lighten($ui-base-color, 4%);\n\n &.interactive {\n border: 0;\n }\n\n .status-card__content {\n padding: 8px;\n padding-top: 10px;\n }\n\n .status-card__title {\n white-space: nowrap;\n }\n\n .status-card__image {\n flex: 0 0 60px;\n }\n}\n\na.status-card.compact:hover {\n background-color: lighten($ui-base-color, 4%);\n}\n\n.status-card__image-image {\n border-radius: 4px 0 0 4px;\n display: block;\n margin: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n background-size: cover;\n background-position: center center;\n}\n\n.load-more {\n display: block;\n color: $dark-text-color;\n background-color: transparent;\n border: 0;\n font-size: inherit;\n text-align: center;\n line-height: inherit;\n margin: 0;\n padding: 15px;\n box-sizing: border-box;\n width: 100%;\n clear: both;\n text-decoration: none;\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n}\n\n.load-gap {\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n}\n\n.regeneration-indicator {\n text-align: center;\n font-size: 16px;\n font-weight: 500;\n color: $dark-text-color;\n background: $ui-base-color;\n cursor: default;\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 20px;\n\n &__figure {\n &,\n img {\n display: block;\n width: auto;\n height: 160px;\n margin: 0;\n }\n }\n\n &--without-header {\n padding-top: 20px + 48px;\n }\n\n &__label {\n margin-top: 30px;\n\n strong {\n display: block;\n margin-bottom: 10px;\n color: $dark-text-color;\n }\n\n span {\n font-size: 15px;\n font-weight: 400;\n }\n }\n}\n\n.column-header__wrapper {\n position: relative;\n flex: 0 0 auto;\n\n &.active {\n &::before {\n display: block;\n content: \"\";\n position: absolute;\n top: 35px;\n left: 0;\n right: 0;\n margin: 0 auto;\n width: 60%;\n pointer-events: none;\n height: 28px;\n z-index: 1;\n background: radial-gradient(ellipse, rgba($ui-highlight-color, 0.23) 0%, rgba($ui-highlight-color, 0) 60%);\n }\n }\n}\n\n.column-header {\n display: flex;\n font-size: 16px;\n background: lighten($ui-base-color, 4%);\n flex: 0 0 auto;\n cursor: pointer;\n position: relative;\n z-index: 2;\n outline: 0;\n overflow: hidden;\n border-top-left-radius: 2px;\n border-top-right-radius: 2px;\n\n & > button {\n margin: 0;\n border: 0;\n padding: 15px 0 15px 15px;\n color: inherit;\n background: transparent;\n font: inherit;\n text-align: left;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n flex: 1;\n }\n\n & > .column-header__back-button {\n color: $highlight-text-color;\n }\n\n &.active {\n box-shadow: 0 1px 0 rgba($highlight-text-color, 0.3);\n\n .column-header__icon {\n color: $highlight-text-color;\n text-shadow: 0 0 10px rgba($highlight-text-color, 0.4);\n }\n }\n\n &:focus,\n &:active {\n outline: 0;\n }\n}\n\n.column-header__buttons {\n height: 48px;\n display: flex;\n}\n\n.column-header__links {\n margin-bottom: 14px;\n}\n\n.column-header__links .text-btn {\n margin-right: 10px;\n}\n\n.column-header__button {\n background: lighten($ui-base-color, 4%);\n border: 0;\n color: $darker-text-color;\n cursor: pointer;\n font-size: 16px;\n padding: 0 15px;\n\n &:hover {\n color: lighten($darker-text-color, 7%);\n }\n\n &.active {\n color: $primary-text-color;\n background: lighten($ui-base-color, 8%);\n\n &:hover {\n color: $primary-text-color;\n background: lighten($ui-base-color, 8%);\n }\n }\n}\n\n.column-header__collapsible {\n max-height: 70vh;\n overflow: hidden;\n overflow-y: auto;\n color: $darker-text-color;\n transition: max-height 150ms ease-in-out, opacity 300ms linear;\n opacity: 1;\n\n &.collapsed {\n max-height: 0;\n opacity: 0.5;\n }\n\n &.animating {\n overflow-y: hidden;\n }\n\n hr {\n height: 0;\n background: transparent;\n border: 0;\n border-top: 1px solid lighten($ui-base-color, 12%);\n margin: 10px 0;\n }\n}\n\n.column-header__collapsible-inner {\n background: lighten($ui-base-color, 8%);\n padding: 15px;\n}\n\n.column-header__setting-btn {\n &:hover {\n color: $darker-text-color;\n text-decoration: underline;\n }\n}\n\n.column-header__setting-arrows {\n float: right;\n\n .column-header__setting-btn {\n padding: 0 10px;\n\n &:last-child {\n padding-right: 0;\n }\n }\n}\n\n.text-btn {\n display: inline-block;\n padding: 0;\n font-family: inherit;\n font-size: inherit;\n color: inherit;\n border: 0;\n background: transparent;\n cursor: pointer;\n}\n\n.column-header__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.loading-indicator {\n color: $dark-text-color;\n font-size: 13px;\n font-weight: 400;\n overflow: visible;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n\n span {\n display: block;\n float: left;\n margin-left: 50%;\n transform: translateX(-50%);\n margin: 82px 0 0 50%;\n white-space: nowrap;\n }\n}\n\n.loading-indicator__figure {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 42px;\n height: 42px;\n box-sizing: border-box;\n background-color: transparent;\n border: 0 solid lighten($ui-base-color, 26%);\n border-width: 6px;\n border-radius: 50%;\n}\n\n.no-reduce-motion .loading-indicator span {\n animation: loader-label 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1);\n}\n\n.no-reduce-motion .loading-indicator__figure {\n animation: loader-figure 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1);\n}\n\n@keyframes spring-rotate-in {\n 0% {\n transform: rotate(0deg);\n }\n\n 30% {\n transform: rotate(-484.8deg);\n }\n\n 60% {\n transform: rotate(-316.7deg);\n }\n\n 90% {\n transform: rotate(-375deg);\n }\n\n 100% {\n transform: rotate(-360deg);\n }\n}\n\n@keyframes spring-rotate-out {\n 0% {\n transform: rotate(-360deg);\n }\n\n 30% {\n transform: rotate(124.8deg);\n }\n\n 60% {\n transform: rotate(-43.27deg);\n }\n\n 90% {\n transform: rotate(15deg);\n }\n\n 100% {\n transform: rotate(0deg);\n }\n}\n\n@keyframes loader-figure {\n 0% {\n width: 0;\n height: 0;\n background-color: lighten($ui-base-color, 26%);\n }\n\n 29% {\n background-color: lighten($ui-base-color, 26%);\n }\n\n 30% {\n width: 42px;\n height: 42px;\n background-color: transparent;\n border-width: 21px;\n opacity: 1;\n }\n\n 100% {\n width: 42px;\n height: 42px;\n border-width: 0;\n opacity: 0;\n background-color: transparent;\n }\n}\n\n@keyframes loader-label {\n 0% { opacity: 0.25; }\n 30% { opacity: 1; }\n 100% { opacity: 0.25; }\n}\n\n.video-error-cover {\n align-items: center;\n background: $base-overlay-background;\n color: $primary-text-color;\n cursor: pointer;\n display: flex;\n flex-direction: column;\n height: 100%;\n justify-content: center;\n margin-top: 8px;\n position: relative;\n text-align: center;\n z-index: 100;\n}\n\n.media-spoiler {\n background: $base-overlay-background;\n color: $darker-text-color;\n border: 0;\n padding: 0;\n width: 100%;\n height: 100%;\n border-radius: 4px;\n appearance: none;\n\n &:hover,\n &:active,\n &:focus {\n padding: 0;\n color: lighten($darker-text-color, 8%);\n }\n}\n\n.media-spoiler__warning {\n display: block;\n font-size: 14px;\n}\n\n.media-spoiler__trigger {\n display: block;\n font-size: 11px;\n font-weight: 700;\n}\n\n.spoiler-button {\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n position: absolute;\n z-index: 100;\n\n &--minified {\n display: block;\n left: 4px;\n top: 4px;\n width: auto;\n height: auto;\n }\n\n &--click-thru {\n pointer-events: none;\n }\n\n &--hidden {\n display: none;\n }\n\n &__overlay {\n display: block;\n background: transparent;\n width: 100%;\n height: 100%;\n border: 0;\n\n &__label {\n display: inline-block;\n background: rgba($base-overlay-background, 0.5);\n border-radius: 8px;\n padding: 8px 12px;\n color: $primary-text-color;\n font-weight: 500;\n font-size: 14px;\n }\n\n &:hover,\n &:focus,\n &:active {\n .spoiler-button__overlay__label {\n background: rgba($base-overlay-background, 0.8);\n }\n }\n\n &:disabled {\n .spoiler-button__overlay__label {\n background: rgba($base-overlay-background, 0.5);\n }\n }\n }\n}\n\n.modal-container--preloader {\n background: lighten($ui-base-color, 8%);\n}\n\n.account--panel {\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: row;\n padding: 10px 0;\n}\n\n.account--panel__button,\n.detailed-status__button {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.column-settings__outer {\n background: lighten($ui-base-color, 8%);\n padding: 15px;\n}\n\n.column-settings__section {\n color: $darker-text-color;\n cursor: default;\n display: block;\n font-weight: 500;\n margin-bottom: 10px;\n}\n\n.column-settings__hashtags {\n .column-settings__row {\n margin-bottom: 15px;\n }\n\n .column-select {\n &__control {\n @include search-input;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n &__placeholder {\n color: $dark-text-color;\n padding-left: 2px;\n font-size: 12px;\n }\n\n &__value-container {\n padding-left: 6px;\n }\n\n &__multi-value {\n background: lighten($ui-base-color, 8%);\n\n &__remove {\n cursor: pointer;\n\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 12%);\n color: lighten($darker-text-color, 4%);\n }\n }\n }\n\n &__multi-value__label,\n &__input {\n color: $darker-text-color;\n }\n\n &__clear-indicator,\n &__dropdown-indicator {\n cursor: pointer;\n transition: none;\n color: $dark-text-color;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($dark-text-color, 4%);\n }\n }\n\n &__indicator-separator {\n background-color: lighten($ui-base-color, 8%);\n }\n\n &__menu {\n @include search-popout;\n padding: 0;\n background: $ui-secondary-color;\n }\n\n &__menu-list {\n padding: 6px;\n }\n\n &__option {\n color: $inverted-text-color;\n border-radius: 4px;\n font-size: 14px;\n\n &--is-focused,\n &--is-selected {\n background: darken($ui-secondary-color, 10%);\n }\n }\n }\n}\n\n.column-settings__row {\n .text-btn {\n margin-bottom: 15px;\n }\n}\n\n.relationship-tag {\n color: $primary-text-color;\n margin-bottom: 4px;\n display: block;\n vertical-align: top;\n background-color: $base-overlay-background;\n font-size: 12px;\n font-weight: 500;\n padding: 4px;\n border-radius: 4px;\n opacity: 0.7;\n\n &:hover {\n opacity: 1;\n }\n}\n\n.setting-toggle {\n display: block;\n line-height: 24px;\n}\n\n.setting-toggle__label {\n color: $darker-text-color;\n display: inline-block;\n margin-bottom: 14px;\n margin-left: 8px;\n vertical-align: middle;\n}\n\n.empty-column-indicator,\n.error-column {\n color: $dark-text-color;\n background: $ui-base-color;\n text-align: center;\n padding: 20px;\n font-size: 15px;\n font-weight: 400;\n cursor: default;\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n justify-content: center;\n\n @supports(display: grid) { // hack to fix Chrome <57\n contain: strict;\n }\n\n & > span {\n max-width: 400px;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.error-column {\n flex-direction: column;\n}\n\n@keyframes heartbeat {\n from {\n transform: scale(1);\n animation-timing-function: ease-out;\n }\n\n 10% {\n transform: scale(0.91);\n animation-timing-function: ease-in;\n }\n\n 17% {\n transform: scale(0.98);\n animation-timing-function: ease-out;\n }\n\n 33% {\n transform: scale(0.87);\n animation-timing-function: ease-in;\n }\n\n 45% {\n transform: scale(1);\n animation-timing-function: ease-out;\n }\n}\n\n.no-reduce-motion .pulse-loading {\n transform-origin: center center;\n animation: heartbeat 1.5s ease-in-out infinite both;\n}\n\n@keyframes shake-bottom {\n 0%,\n 100% {\n transform: rotate(0deg);\n transform-origin: 50% 100%;\n }\n\n 10% {\n transform: rotate(2deg);\n }\n\n 20%,\n 40%,\n 60% {\n transform: rotate(-4deg);\n }\n\n 30%,\n 50%,\n 70% {\n transform: rotate(4deg);\n }\n\n 80% {\n transform: rotate(-2deg);\n }\n\n 90% {\n transform: rotate(2deg);\n }\n}\n\n.no-reduce-motion .shake-bottom {\n transform-origin: 50% 100%;\n animation: shake-bottom 0.8s cubic-bezier(0.455, 0.03, 0.515, 0.955) 2s 2 both;\n}\n\n.emoji-picker-dropdown__menu {\n background: $simple-background-color;\n position: absolute;\n box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n margin-top: 5px;\n z-index: 2;\n\n .emoji-mart-scroll {\n transition: opacity 200ms ease;\n }\n\n &.selecting .emoji-mart-scroll {\n opacity: 0.5;\n }\n}\n\n.emoji-picker-dropdown__modifiers {\n position: absolute;\n top: 60px;\n right: 11px;\n cursor: pointer;\n}\n\n.emoji-picker-dropdown__modifiers__menu {\n position: absolute;\n z-index: 4;\n top: -4px;\n left: -8px;\n background: $simple-background-color;\n border-radius: 4px;\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n overflow: hidden;\n\n button {\n display: block;\n cursor: pointer;\n border: 0;\n padding: 4px 8px;\n background: transparent;\n\n &:hover,\n &:focus,\n &:active {\n background: rgba($ui-secondary-color, 0.4);\n }\n }\n\n .emoji-mart-emoji {\n height: 22px;\n }\n}\n\n.emoji-mart-emoji {\n span {\n background-repeat: no-repeat;\n }\n}\n\n.upload-area {\n align-items: center;\n background: rgba($base-overlay-background, 0.8);\n display: flex;\n height: 100%;\n justify-content: center;\n left: 0;\n opacity: 0;\n position: absolute;\n top: 0;\n visibility: hidden;\n width: 100%;\n z-index: 2000;\n\n * {\n pointer-events: none;\n }\n}\n\n.upload-area__drop {\n width: 320px;\n height: 160px;\n display: flex;\n box-sizing: border-box;\n position: relative;\n padding: 8px;\n}\n\n.upload-area__background {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: -1;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 5px rgba($base-shadow-color, 0.2);\n}\n\n.upload-area__content {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: $secondary-text-color;\n font-size: 18px;\n font-weight: 500;\n border: 2px dashed $ui-base-lighter-color;\n border-radius: 4px;\n}\n\n.upload-progress {\n padding: 10px;\n color: $lighter-text-color;\n overflow: hidden;\n display: flex;\n\n .fa {\n font-size: 34px;\n margin-right: 10px;\n }\n\n span {\n font-size: 13px;\n font-weight: 500;\n display: block;\n }\n}\n\n.upload-progess__message {\n flex: 1 1 auto;\n}\n\n.upload-progress__backdrop {\n width: 100%;\n height: 6px;\n border-radius: 6px;\n background: $ui-base-lighter-color;\n position: relative;\n margin-top: 5px;\n}\n\n.upload-progress__tracker {\n position: absolute;\n left: 0;\n top: 0;\n height: 6px;\n background: $ui-highlight-color;\n border-radius: 6px;\n}\n\n.emoji-button {\n display: block;\n font-size: 24px;\n line-height: 24px;\n margin-left: 2px;\n width: 24px;\n outline: 0;\n cursor: pointer;\n\n &:active,\n &:focus {\n outline: 0 !important;\n }\n\n img {\n filter: grayscale(100%);\n opacity: 0.8;\n display: block;\n margin: 0;\n width: 22px;\n height: 22px;\n margin-top: 2px;\n }\n\n &:hover,\n &:active,\n &:focus {\n img {\n opacity: 1;\n filter: none;\n }\n }\n}\n\n.dropdown--active .emoji-button img {\n opacity: 1;\n filter: none;\n}\n\n.privacy-dropdown__dropdown {\n position: absolute;\n background: $simple-background-color;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n margin-left: 40px;\n overflow: hidden;\n\n &.top {\n transform-origin: 50% 100%;\n }\n\n &.bottom {\n transform-origin: 50% 0;\n }\n}\n\n.privacy-dropdown__option {\n color: $inverted-text-color;\n padding: 10px;\n cursor: pointer;\n display: flex;\n\n &:hover,\n &.active {\n background: $ui-highlight-color;\n color: $primary-text-color;\n outline: 0;\n\n .privacy-dropdown__option__content {\n color: $primary-text-color;\n\n strong {\n color: $primary-text-color;\n }\n }\n }\n\n &.active:hover {\n background: lighten($ui-highlight-color, 4%);\n }\n}\n\n.privacy-dropdown__option__icon {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 10px;\n}\n\n.privacy-dropdown__option__content {\n flex: 1 1 auto;\n color: $lighter-text-color;\n\n strong {\n font-weight: 500;\n display: block;\n color: $inverted-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n}\n\n.privacy-dropdown.active {\n .privacy-dropdown__value {\n background: $simple-background-color;\n border-radius: 4px 4px 0 0;\n box-shadow: 0 -4px 4px rgba($base-shadow-color, 0.1);\n\n .icon-button {\n transition: none;\n }\n\n &.active {\n background: $ui-highlight-color;\n\n .icon-button {\n color: $primary-text-color;\n }\n }\n }\n\n &.top .privacy-dropdown__value {\n border-radius: 0 0 4px 4px;\n }\n\n .privacy-dropdown__dropdown {\n display: block;\n box-shadow: 2px 4px 6px rgba($base-shadow-color, 0.1);\n }\n}\n\n.search {\n position: relative;\n}\n\n.search__input {\n @include search-input;\n\n display: block;\n padding: 15px;\n padding-right: 30px;\n line-height: 18px;\n font-size: 16px;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n}\n\n.search__icon {\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus {\n outline: 0 !important;\n }\n\n .fa {\n position: absolute;\n top: 16px;\n right: 10px;\n z-index: 2;\n display: inline-block;\n opacity: 0;\n transition: all 100ms linear;\n transition-property: transform, opacity;\n font-size: 18px;\n width: 18px;\n height: 18px;\n color: $secondary-text-color;\n cursor: default;\n pointer-events: none;\n\n &.active {\n pointer-events: auto;\n opacity: 0.3;\n }\n }\n\n .fa-search {\n transform: rotate(90deg);\n\n &.active {\n pointer-events: none;\n transform: rotate(0deg);\n }\n }\n\n .fa-times-circle {\n top: 17px;\n transform: rotate(0deg);\n color: $action-button-color;\n cursor: pointer;\n\n &.active {\n transform: rotate(90deg);\n }\n\n &:hover {\n color: lighten($action-button-color, 7%);\n }\n }\n}\n\n.search-results__header {\n color: $dark-text-color;\n background: lighten($ui-base-color, 2%);\n padding: 15px;\n font-weight: 500;\n font-size: 16px;\n cursor: default;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n}\n\n.search-results__section {\n margin-bottom: 5px;\n\n h5 {\n background: darken($ui-base-color, 4%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n display: flex;\n padding: 15px;\n font-weight: 500;\n font-size: 16px;\n color: $dark-text-color;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n .account:last-child,\n & > div:last-child .status {\n border-bottom: 0;\n }\n}\n\n.search-results__hashtag {\n display: block;\n padding: 10px;\n color: $secondary-text-color;\n text-decoration: none;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($secondary-text-color, 4%);\n text-decoration: underline;\n }\n}\n\n.search-results__info {\n padding: 20px;\n color: $darker-text-color;\n text-align: center;\n}\n\n.modal-root {\n position: relative;\n transition: opacity 0.3s linear;\n will-change: opacity;\n z-index: 9999;\n}\n\n.modal-root__overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba($base-overlay-background, 0.7);\n}\n\n.modal-root__container {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n align-content: space-around;\n z-index: 9999;\n pointer-events: none;\n user-select: none;\n}\n\n.modal-root__modal {\n pointer-events: auto;\n display: flex;\n z-index: 9999;\n}\n\n.video-modal__container {\n max-width: 100vw;\n max-height: 100vh;\n}\n\n.audio-modal__container {\n width: 50vw;\n}\n\n.media-modal {\n width: 100%;\n height: 100%;\n position: relative;\n\n .extended-video-player {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n video {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n }\n }\n}\n\n.media-modal__closer {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n}\n\n.media-modal__navigation {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n transition: opacity 0.3s linear;\n will-change: opacity;\n\n * {\n pointer-events: auto;\n }\n\n &.media-modal__navigation--hidden {\n opacity: 0;\n\n * {\n pointer-events: none;\n }\n }\n}\n\n.media-modal__nav {\n background: rgba($base-overlay-background, 0.5);\n box-sizing: border-box;\n border: 0;\n color: $primary-text-color;\n cursor: pointer;\n display: flex;\n align-items: center;\n font-size: 24px;\n height: 20vmax;\n margin: auto 0;\n padding: 30px 15px;\n position: absolute;\n top: 0;\n bottom: 0;\n}\n\n.media-modal__nav--left {\n left: 0;\n}\n\n.media-modal__nav--right {\n right: 0;\n}\n\n.media-modal__pagination {\n width: 100%;\n text-align: center;\n position: absolute;\n left: 0;\n bottom: 20px;\n pointer-events: none;\n}\n\n.media-modal__meta {\n text-align: center;\n position: absolute;\n left: 0;\n bottom: 20px;\n width: 100%;\n pointer-events: none;\n\n &--shifted {\n bottom: 62px;\n }\n\n a {\n pointer-events: auto;\n text-decoration: none;\n font-weight: 500;\n color: $ui-secondary-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.media-modal__page-dot {\n display: inline-block;\n}\n\n.media-modal__button {\n background-color: $primary-text-color;\n height: 12px;\n width: 12px;\n border-radius: 6px;\n margin: 10px;\n padding: 0;\n border: 0;\n font-size: 0;\n}\n\n.media-modal__button--active {\n background-color: $highlight-text-color;\n}\n\n.media-modal__close {\n position: absolute;\n right: 8px;\n top: 8px;\n z-index: 100;\n}\n\n.onboarding-modal,\n.error-modal,\n.embed-modal {\n background: $ui-secondary-color;\n color: $inverted-text-color;\n border-radius: 8px;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.error-modal__body {\n height: 80vh;\n width: 80vw;\n max-width: 520px;\n max-height: 420px;\n position: relative;\n\n & > div {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n padding: 25px;\n display: none;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n display: flex;\n opacity: 0;\n user-select: text;\n }\n}\n\n.error-modal__body {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n text-align: center;\n}\n\n.onboarding-modal__paginator,\n.error-modal__footer {\n flex: 0 0 auto;\n background: darken($ui-secondary-color, 8%);\n display: flex;\n padding: 25px;\n\n & > div {\n min-width: 33px;\n }\n\n .onboarding-modal__nav,\n .error-modal__nav {\n color: $lighter-text-color;\n border: 0;\n font-size: 14px;\n font-weight: 500;\n padding: 10px 25px;\n line-height: inherit;\n height: auto;\n margin: -10px;\n border-radius: 4px;\n background-color: transparent;\n\n &:hover,\n &:focus,\n &:active {\n color: darken($lighter-text-color, 4%);\n background-color: darken($ui-secondary-color, 16%);\n }\n\n &.onboarding-modal__done,\n &.onboarding-modal__next {\n color: $inverted-text-color;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($inverted-text-color, 4%);\n }\n }\n }\n}\n\n.error-modal__footer {\n justify-content: center;\n}\n\n.display-case {\n text-align: center;\n font-size: 15px;\n margin-bottom: 15px;\n\n &__label {\n font-weight: 500;\n color: $inverted-text-color;\n margin-bottom: 5px;\n font-size: 13px;\n }\n\n &__case {\n background: $ui-base-color;\n color: $secondary-text-color;\n font-weight: 500;\n padding: 10px;\n border-radius: 4px;\n }\n}\n\n.onboard-sliders {\n display: inline-block;\n max-width: 30px;\n max-height: auto;\n margin-left: 10px;\n}\n\n.boost-modal,\n.confirmation-modal,\n.report-modal,\n.actions-modal,\n.mute-modal,\n.block-modal {\n background: lighten($ui-secondary-color, 8%);\n color: $inverted-text-color;\n border-radius: 8px;\n overflow: hidden;\n max-width: 90vw;\n width: 480px;\n position: relative;\n flex-direction: column;\n\n .status__display-name {\n display: block;\n max-width: 100%;\n padding-right: 25px;\n }\n\n .status__avatar {\n height: 28px;\n left: 10px;\n position: absolute;\n top: 10px;\n width: 48px;\n }\n\n .status__content__spoiler-link {\n color: lighten($secondary-text-color, 8%);\n }\n}\n\n.actions-modal {\n .status {\n background: $white;\n border-bottom-color: $ui-secondary-color;\n padding-top: 10px;\n padding-bottom: 10px;\n }\n\n .dropdown-menu__separator {\n border-bottom-color: $ui-secondary-color;\n }\n}\n\n.boost-modal__container {\n overflow-x: scroll;\n padding: 10px;\n\n .status {\n user-select: text;\n border-bottom: 0;\n }\n}\n\n.boost-modal__action-bar,\n.confirmation-modal__action-bar,\n.mute-modal__action-bar,\n.block-modal__action-bar {\n display: flex;\n justify-content: space-between;\n background: $ui-secondary-color;\n padding: 10px;\n line-height: 36px;\n\n & > div {\n flex: 1 1 auto;\n text-align: right;\n color: $lighter-text-color;\n padding-right: 10px;\n }\n\n .button {\n flex: 0 0 auto;\n }\n}\n\n.boost-modal__status-header {\n font-size: 15px;\n}\n\n.boost-modal__status-time {\n float: right;\n font-size: 14px;\n}\n\n.mute-modal,\n.block-modal {\n line-height: 24px;\n}\n\n.mute-modal .react-toggle,\n.block-modal .react-toggle {\n vertical-align: middle;\n}\n\n.report-modal {\n width: 90vw;\n max-width: 700px;\n}\n\n.report-modal__container {\n display: flex;\n border-top: 1px solid $ui-secondary-color;\n\n @media screen and (max-width: 480px) {\n flex-wrap: wrap;\n overflow-y: auto;\n }\n}\n\n.report-modal__statuses,\n.report-modal__comment {\n box-sizing: border-box;\n width: 50%;\n\n @media screen and (max-width: 480px) {\n width: 100%;\n }\n}\n\n.report-modal__statuses,\n.focal-point-modal__content {\n flex: 1 1 auto;\n min-height: 20vh;\n max-height: 80vh;\n overflow-y: auto;\n overflow-x: hidden;\n\n .status__content a {\n color: $highlight-text-color;\n }\n\n .status__content,\n .status__content p {\n color: $inverted-text-color;\n }\n\n @media screen and (max-width: 480px) {\n max-height: 10vh;\n }\n}\n\n.focal-point-modal__content {\n @media screen and (max-width: 480px) {\n max-height: 40vh;\n }\n}\n\n.report-modal__comment {\n padding: 20px;\n border-right: 1px solid $ui-secondary-color;\n max-width: 320px;\n\n p {\n font-size: 14px;\n line-height: 20px;\n margin-bottom: 20px;\n }\n\n .setting-text {\n display: block;\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n color: $inverted-text-color;\n background: $white;\n padding: 10px;\n font-family: inherit;\n font-size: 14px;\n resize: none;\n border: 0;\n outline: 0;\n border-radius: 4px;\n border: 1px solid $ui-secondary-color;\n min-height: 100px;\n max-height: 50vh;\n margin-bottom: 10px;\n\n &:focus {\n border: 1px solid darken($ui-secondary-color, 8%);\n }\n\n &__wrapper {\n background: $white;\n border: 1px solid $ui-secondary-color;\n margin-bottom: 10px;\n border-radius: 4px;\n\n .setting-text {\n border: 0;\n margin-bottom: 0;\n border-radius: 0;\n\n &:focus {\n border: 0;\n }\n }\n\n &__modifiers {\n color: $inverted-text-color;\n font-family: inherit;\n font-size: 14px;\n background: $white;\n }\n }\n\n &__toolbar {\n display: flex;\n justify-content: space-between;\n margin-bottom: 20px;\n }\n }\n\n .setting-text-label {\n display: block;\n color: $inverted-text-color;\n font-size: 14px;\n font-weight: 500;\n margin-bottom: 10px;\n }\n\n .setting-toggle {\n margin-top: 20px;\n margin-bottom: 24px;\n\n &__label {\n color: $inverted-text-color;\n font-size: 14px;\n }\n }\n\n @media screen and (max-width: 480px) {\n padding: 10px;\n max-width: 100%;\n order: 2;\n\n .setting-toggle {\n margin-bottom: 4px;\n }\n }\n}\n\n.actions-modal {\n max-height: 80vh;\n max-width: 80vw;\n\n .status {\n overflow-y: auto;\n max-height: 300px;\n }\n\n .actions-modal__item-label {\n font-weight: 500;\n }\n\n ul {\n overflow-y: auto;\n flex-shrink: 0;\n max-height: 80vh;\n\n &.with-status {\n max-height: calc(80vh - 75px);\n }\n\n li:empty {\n margin: 0;\n }\n\n li:not(:empty) {\n a {\n color: $inverted-text-color;\n display: flex;\n padding: 12px 16px;\n font-size: 15px;\n align-items: center;\n text-decoration: none;\n\n &,\n button {\n transition: none;\n }\n\n &.active,\n &:hover,\n &:active,\n &:focus {\n &,\n button {\n background: $ui-highlight-color;\n color: $primary-text-color;\n }\n }\n\n button:first-child {\n margin-right: 10px;\n }\n }\n }\n }\n}\n\n.confirmation-modal__action-bar,\n.mute-modal__action-bar,\n.block-modal__action-bar {\n .confirmation-modal__secondary-button {\n flex-shrink: 1;\n }\n}\n\n.confirmation-modal__secondary-button,\n.confirmation-modal__cancel-button,\n.mute-modal__cancel-button,\n.block-modal__cancel-button {\n background-color: transparent;\n color: $lighter-text-color;\n font-size: 14px;\n font-weight: 500;\n\n &:hover,\n &:focus,\n &:active {\n color: darken($lighter-text-color, 4%);\n background-color: transparent;\n }\n}\n\n.confirmation-modal__container,\n.mute-modal__container,\n.block-modal__container,\n.report-modal__target {\n padding: 30px;\n font-size: 16px;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n}\n\n.confirmation-modal__container,\n.report-modal__target {\n text-align: center;\n}\n\n.block-modal,\n.mute-modal {\n &__explanation {\n margin-top: 20px;\n }\n\n .setting-toggle {\n margin-top: 20px;\n margin-bottom: 24px;\n display: flex;\n align-items: center;\n\n &__label {\n color: $inverted-text-color;\n margin: 0;\n margin-left: 8px;\n }\n }\n}\n\n.report-modal__target {\n padding: 15px;\n\n .media-modal__close {\n top: 14px;\n right: 15px;\n }\n}\n\n.loading-bar {\n background-color: $highlight-text-color;\n height: 3px;\n position: absolute;\n top: 0;\n left: 0;\n z-index: 9999;\n}\n\n.media-gallery__gifv__label {\n display: block;\n position: absolute;\n color: $primary-text-color;\n background: rgba($base-overlay-background, 0.5);\n bottom: 6px;\n left: 6px;\n padding: 2px 6px;\n border-radius: 2px;\n font-size: 11px;\n font-weight: 600;\n z-index: 1;\n pointer-events: none;\n opacity: 0.9;\n transition: opacity 0.1s ease;\n line-height: 18px;\n}\n\n.media-gallery__gifv {\n &.autoplay {\n .media-gallery__gifv__label {\n display: none;\n }\n }\n\n &:hover {\n .media-gallery__gifv__label {\n opacity: 1;\n }\n }\n}\n\n.media-gallery__audio {\n margin-top: 32px;\n\n audio {\n width: 100%;\n }\n}\n\n.attachment-list {\n display: flex;\n font-size: 14px;\n border: 1px solid lighten($ui-base-color, 8%);\n border-radius: 4px;\n margin-top: 14px;\n overflow: hidden;\n\n &__icon {\n flex: 0 0 auto;\n color: $dark-text-color;\n padding: 8px 18px;\n cursor: default;\n border-right: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n font-size: 26px;\n\n .fa {\n display: block;\n }\n }\n\n &__list {\n list-style: none;\n padding: 4px 0;\n padding-left: 8px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n\n li {\n display: block;\n padding: 4px 0;\n }\n\n a {\n text-decoration: none;\n color: $dark-text-color;\n font-weight: 500;\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n &.compact {\n border: 0;\n margin-top: 4px;\n\n .attachment-list__list {\n padding: 0;\n display: block;\n }\n\n .fa {\n color: $dark-text-color;\n }\n }\n}\n\n/* Media Gallery */\n.media-gallery {\n box-sizing: border-box;\n margin-top: 8px;\n overflow: hidden;\n border-radius: 4px;\n position: relative;\n width: 100%;\n}\n\n.media-gallery__item {\n border: 0;\n box-sizing: border-box;\n display: block;\n float: left;\n position: relative;\n border-radius: 4px;\n overflow: hidden;\n\n &.standalone {\n .media-gallery__item-gifv-thumbnail {\n transform: none;\n top: 0;\n }\n }\n}\n\n.media-gallery__item-thumbnail {\n cursor: zoom-in;\n display: block;\n text-decoration: none;\n color: $secondary-text-color;\n position: relative;\n z-index: 1;\n\n &,\n img {\n height: 100%;\n width: 100%;\n }\n\n img {\n object-fit: cover;\n }\n}\n\n.media-gallery__preview {\n width: 100%;\n height: 100%;\n object-fit: cover;\n position: absolute;\n top: 0;\n left: 0;\n z-index: 0;\n background: $base-overlay-background;\n\n &--hidden {\n display: none;\n }\n}\n\n.media-gallery__gifv {\n height: 100%;\n overflow: hidden;\n position: relative;\n width: 100%;\n}\n\n.media-gallery__item-gifv-thumbnail {\n cursor: zoom-in;\n height: 100%;\n object-fit: cover;\n position: relative;\n top: 50%;\n transform: translateY(-50%);\n width: 100%;\n z-index: 1;\n}\n\n.media-gallery__item-thumbnail-label {\n clip: rect(1px 1px 1px 1px); /* IE6, IE7 */\n clip: rect(1px, 1px, 1px, 1px);\n overflow: hidden;\n position: absolute;\n}\n/* End Media Gallery */\n\n.detailed,\n.fullscreen {\n .video-player__volume__current,\n .video-player__volume::before {\n bottom: 27px;\n }\n\n .video-player__volume__handle {\n bottom: 23px;\n }\n\n}\n\n.audio-player {\n box-sizing: border-box;\n position: relative;\n background: darken($ui-base-color, 8%);\n border-radius: 4px;\n padding-bottom: 44px;\n direction: ltr;\n\n &.editable {\n border-radius: 0;\n height: 100%;\n }\n\n &__waveform {\n padding: 15px 0;\n position: relative;\n overflow: hidden;\n\n &::before {\n content: \"\";\n display: block;\n position: absolute;\n border-top: 1px solid lighten($ui-base-color, 4%);\n width: 100%;\n height: 0;\n left: 0;\n top: calc(50% + 1px);\n }\n }\n\n &__progress-placeholder {\n background-color: rgba(lighten($ui-highlight-color, 8%), 0.5);\n }\n\n &__wave-placeholder {\n background-color: lighten($ui-base-color, 16%);\n }\n\n .video-player__controls {\n padding: 0 15px;\n padding-top: 10px;\n background: darken($ui-base-color, 8%);\n border-top: 1px solid lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n }\n}\n\n.video-player {\n overflow: hidden;\n position: relative;\n background: $base-shadow-color;\n max-width: 100%;\n border-radius: 4px;\n box-sizing: border-box;\n direction: ltr;\n\n &.editable {\n border-radius: 0;\n height: 100% !important;\n }\n\n &:focus {\n outline: 0;\n }\n\n video {\n max-width: 100vw;\n max-height: 80vh;\n z-index: 1;\n }\n\n &.fullscreen {\n width: 100% !important;\n height: 100% !important;\n margin: 0;\n\n video {\n max-width: 100% !important;\n max-height: 100% !important;\n width: 100% !important;\n height: 100% !important;\n outline: 0;\n }\n }\n\n &.inline {\n video {\n object-fit: contain;\n position: relative;\n top: 50%;\n transform: translateY(-50%);\n }\n }\n\n &__controls {\n position: absolute;\n z-index: 2;\n bottom: 0;\n left: 0;\n right: 0;\n box-sizing: border-box;\n background: linear-gradient(0deg, rgba($base-shadow-color, 0.85) 0, rgba($base-shadow-color, 0.45) 60%, transparent);\n padding: 0 15px;\n opacity: 0;\n transition: opacity .1s ease;\n\n &.active {\n opacity: 1;\n }\n }\n\n &.inactive {\n video,\n .video-player__controls {\n visibility: hidden;\n }\n }\n\n &__spoiler {\n display: none;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 4;\n border: 0;\n background: $base-overlay-background;\n color: $darker-text-color;\n transition: none;\n pointer-events: none;\n\n &.active {\n display: block;\n pointer-events: auto;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($darker-text-color, 7%);\n }\n }\n\n &__title {\n display: block;\n font-size: 14px;\n }\n\n &__subtitle {\n display: block;\n font-size: 11px;\n font-weight: 500;\n }\n }\n\n &__buttons-bar {\n display: flex;\n justify-content: space-between;\n padding-bottom: 10px;\n\n .video-player__download__icon {\n color: inherit;\n }\n }\n\n &__buttons {\n font-size: 16px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &.left {\n button {\n padding-left: 0;\n }\n }\n\n &.right {\n button {\n padding-right: 0;\n }\n }\n\n button {\n background: transparent;\n padding: 2px 10px;\n font-size: 16px;\n border: 0;\n color: rgba($white, 0.75);\n\n &:active,\n &:hover,\n &:focus {\n color: $white;\n }\n }\n }\n\n &__time-sep,\n &__time-total,\n &__time-current {\n font-size: 14px;\n font-weight: 500;\n }\n\n &__time-current {\n color: $white;\n margin-left: 60px;\n }\n\n &__time-sep {\n display: inline-block;\n margin: 0 6px;\n }\n\n &__time-sep,\n &__time-total {\n color: $white;\n }\n\n &__volume {\n cursor: pointer;\n height: 24px;\n display: inline;\n\n &::before {\n content: \"\";\n width: 50px;\n background: rgba($white, 0.35);\n border-radius: 4px;\n display: block;\n position: absolute;\n height: 4px;\n left: 70px;\n bottom: 20px;\n }\n\n &__current {\n display: block;\n position: absolute;\n height: 4px;\n border-radius: 4px;\n left: 70px;\n bottom: 20px;\n background: lighten($ui-highlight-color, 8%);\n }\n\n &__handle {\n position: absolute;\n z-index: 3;\n border-radius: 50%;\n width: 12px;\n height: 12px;\n bottom: 16px;\n left: 70px;\n transition: opacity .1s ease;\n background: lighten($ui-highlight-color, 8%);\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n pointer-events: none;\n }\n }\n\n &__link {\n padding: 2px 10px;\n\n a {\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n color: $white;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n }\n\n &__seek {\n cursor: pointer;\n height: 24px;\n position: relative;\n\n &::before {\n content: \"\";\n width: 100%;\n background: rgba($white, 0.35);\n border-radius: 4px;\n display: block;\n position: absolute;\n height: 4px;\n top: 10px;\n }\n\n &__progress,\n &__buffer {\n display: block;\n position: absolute;\n height: 4px;\n border-radius: 4px;\n top: 10px;\n background: lighten($ui-highlight-color, 8%);\n }\n\n &__buffer {\n background: rgba($white, 0.2);\n }\n\n &__handle {\n position: absolute;\n z-index: 3;\n opacity: 0;\n border-radius: 50%;\n width: 12px;\n height: 12px;\n top: 6px;\n margin-left: -6px;\n transition: opacity .1s ease;\n background: lighten($ui-highlight-color, 8%);\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n pointer-events: none;\n\n &.active {\n opacity: 1;\n }\n }\n\n &:hover {\n .video-player__seek__handle {\n opacity: 1;\n }\n }\n }\n\n &.detailed,\n &.fullscreen {\n .video-player__buttons {\n button {\n padding-top: 10px;\n padding-bottom: 10px;\n }\n }\n }\n}\n\n.directory {\n &__list {\n width: 100%;\n margin: 10px 0;\n transition: opacity 100ms ease-in;\n\n &.loading {\n opacity: 0.7;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin: 0;\n }\n }\n\n &__card {\n box-sizing: border-box;\n margin-bottom: 10px;\n\n &__img {\n height: 125px;\n position: relative;\n background: darken($ui-base-color, 12%);\n overflow: hidden;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n object-fit: cover;\n }\n }\n\n &__bar {\n display: flex;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n padding: 10px;\n\n &__name {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n text-decoration: none;\n overflow: hidden;\n }\n\n &__relationship {\n width: 23px;\n min-height: 1px;\n flex: 0 0 auto;\n }\n\n .avatar {\n flex: 0 0 auto;\n width: 48px;\n height: 48px;\n padding-top: 2px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n background: darken($ui-base-color, 8%);\n object-fit: cover;\n }\n }\n\n .display-name {\n margin-left: 15px;\n text-align: left;\n\n strong {\n font-size: 15px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n span {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n &__extra {\n background: $ui-base-color;\n display: flex;\n align-items: center;\n justify-content: center;\n\n .accounts-table__count {\n width: 33.33%;\n flex: 0 0 auto;\n padding: 15px 0;\n }\n\n .account__header__content {\n box-sizing: border-box;\n padding: 15px 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n width: 100%;\n min-height: 18px + 30px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n p {\n display: none;\n\n &:first-child {\n display: inline;\n }\n }\n\n br {\n display: none;\n }\n }\n }\n }\n}\n\n.account-gallery__container {\n display: flex;\n flex-wrap: wrap;\n padding: 4px 2px;\n}\n\n.account-gallery__item {\n border: 0;\n box-sizing: border-box;\n display: block;\n position: relative;\n border-radius: 4px;\n overflow: hidden;\n margin: 2px;\n\n &__icons {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 24px;\n }\n}\n\n.notification__filter-bar,\n.account__section-headline {\n background: darken($ui-base-color, 4%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n display: flex;\n flex-shrink: 0;\n\n button {\n background: darken($ui-base-color, 4%);\n border: 0;\n margin: 0;\n }\n\n button,\n a {\n display: block;\n flex: 1 1 auto;\n color: $darker-text-color;\n padding: 15px 0;\n font-size: 14px;\n font-weight: 500;\n text-align: center;\n text-decoration: none;\n position: relative;\n\n &.active {\n color: $secondary-text-color;\n\n &::before,\n &::after {\n display: block;\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 50%;\n width: 0;\n height: 0;\n transform: translateX(-50%);\n border-style: solid;\n border-width: 0 10px 10px;\n border-color: transparent transparent lighten($ui-base-color, 8%);\n }\n\n &::after {\n bottom: -1px;\n border-color: transparent transparent $ui-base-color;\n }\n }\n }\n\n &.directory__section-headline {\n background: darken($ui-base-color, 2%);\n border-bottom-color: transparent;\n\n a,\n button {\n &.active {\n &::before {\n display: none;\n }\n\n &::after {\n border-color: transparent transparent darken($ui-base-color, 7%);\n }\n }\n }\n }\n}\n\n.filter-form {\n background: $ui-base-color;\n\n &__column {\n padding: 10px 15px;\n }\n\n .radio-button {\n display: block;\n }\n}\n\n.radio-button {\n font-size: 14px;\n position: relative;\n display: inline-block;\n padding: 6px 0;\n line-height: 18px;\n cursor: default;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n cursor: pointer;\n\n input[type=radio],\n input[type=checkbox] {\n display: none;\n }\n\n &__input {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 50%;\n vertical-align: middle;\n\n &.checked {\n border-color: lighten($ui-highlight-color, 8%);\n background: lighten($ui-highlight-color, 8%);\n }\n }\n}\n\n::-webkit-scrollbar-thumb {\n border-radius: 0;\n}\n\n.search-popout {\n @include search-popout;\n}\n\nnoscript {\n text-align: center;\n\n img {\n width: 200px;\n opacity: 0.5;\n animation: flicker 4s infinite;\n }\n\n div {\n font-size: 14px;\n margin: 30px auto;\n color: $secondary-text-color;\n max-width: 400px;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n }\n}\n\n@keyframes flicker {\n 0% { opacity: 1; }\n 30% { opacity: 0.75; }\n 100% { opacity: 1; }\n}\n\n@media screen and (max-width: 630px) and (max-height: 400px) {\n $duration: 400ms;\n $delay: 100ms;\n\n .tabs-bar,\n .search {\n will-change: margin-top;\n transition: margin-top $duration $delay;\n }\n\n .navigation-bar {\n will-change: padding-bottom;\n transition: padding-bottom $duration $delay;\n }\n\n .navigation-bar {\n & > a:first-child {\n will-change: margin-top, margin-left, margin-right, width;\n transition: margin-top $duration $delay, margin-left $duration ($duration + $delay), margin-right $duration ($duration + $delay);\n }\n\n & > .navigation-bar__profile-edit {\n will-change: margin-top;\n transition: margin-top $duration $delay;\n }\n\n .navigation-bar__actions {\n & > .icon-button.close {\n will-change: opacity transform;\n transition: opacity $duration * 0.5 $delay,\n transform $duration $delay;\n }\n\n & > .compose__action-bar .icon-button {\n will-change: opacity transform;\n transition: opacity $duration * 0.5 $delay + $duration * 0.5,\n transform $duration $delay;\n }\n }\n }\n\n .is-composing {\n .tabs-bar,\n .search {\n margin-top: -50px;\n }\n\n .navigation-bar {\n padding-bottom: 0;\n\n & > a:first-child {\n margin: -100px 10px 0 -50px;\n }\n\n .navigation-bar__profile {\n padding-top: 2px;\n }\n\n .navigation-bar__profile-edit {\n position: absolute;\n margin-top: -60px;\n }\n\n .navigation-bar__actions {\n .icon-button.close {\n pointer-events: auto;\n opacity: 1;\n transform: scale(1, 1) translate(0, 0);\n bottom: 5px;\n }\n\n .compose__action-bar .icon-button {\n pointer-events: none;\n opacity: 0;\n transform: scale(0, 1) translate(100%, 0);\n }\n }\n }\n }\n}\n\n.embed-modal {\n width: auto;\n max-width: 80vw;\n max-height: 80vh;\n\n h4 {\n padding: 30px;\n font-weight: 500;\n font-size: 16px;\n text-align: center;\n }\n\n .embed-modal__container {\n padding: 10px;\n\n .hint {\n margin-bottom: 15px;\n }\n\n .embed-modal__html {\n outline: 0;\n box-sizing: border-box;\n display: block;\n width: 100%;\n border: 0;\n padding: 10px;\n font-family: $font-monospace, monospace;\n background: $ui-base-color;\n color: $primary-text-color;\n font-size: 14px;\n margin: 0;\n margin-bottom: 15px;\n border-radius: 4px;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n .embed-modal__iframe {\n width: 400px;\n max-width: 100%;\n overflow: hidden;\n border: 0;\n border-radius: 4px;\n }\n }\n}\n\n.account__moved-note {\n padding: 14px 10px;\n padding-bottom: 16px;\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &__message {\n position: relative;\n margin-left: 58px;\n color: $dark-text-color;\n padding: 8px 0;\n padding-top: 0;\n padding-bottom: 4px;\n font-size: 14px;\n\n > span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n &__icon-wrapper {\n left: -26px;\n position: absolute;\n }\n\n .detailed-status__display-avatar {\n position: relative;\n }\n\n .detailed-status__display-name {\n margin-bottom: 0;\n }\n}\n\n.column-inline-form {\n padding: 15px;\n padding-right: 0;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n\n label {\n flex: 1 1 auto;\n\n input {\n width: 100%;\n\n &:focus {\n outline: 0;\n }\n }\n }\n\n .icon-button {\n flex: 0 0 auto;\n margin: 0 10px;\n }\n}\n\n.drawer__backdrop {\n cursor: pointer;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba($base-overlay-background, 0.5);\n}\n\n.list-editor {\n background: $ui-base-color;\n flex-direction: column;\n border-radius: 8px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n width: 380px;\n overflow: hidden;\n\n @media screen and (max-width: 420px) {\n width: 90%;\n }\n\n h4 {\n padding: 15px 0;\n background: lighten($ui-base-color, 13%);\n font-weight: 500;\n font-size: 16px;\n text-align: center;\n border-radius: 8px 8px 0 0;\n }\n\n .drawer__pager {\n height: 50vh;\n }\n\n .drawer__inner {\n border-radius: 0 0 8px 8px;\n\n &.backdrop {\n width: calc(100% - 60px);\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n border-radius: 0 0 0 8px;\n }\n }\n\n &__accounts {\n overflow-y: auto;\n }\n\n .account__display-name {\n &:hover strong {\n text-decoration: none;\n }\n }\n\n .account__avatar {\n cursor: default;\n }\n\n .search {\n margin-bottom: 0;\n }\n}\n\n.list-adder {\n background: $ui-base-color;\n flex-direction: column;\n border-radius: 8px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n width: 380px;\n overflow: hidden;\n\n @media screen and (max-width: 420px) {\n width: 90%;\n }\n\n &__account {\n background: lighten($ui-base-color, 13%);\n }\n\n &__lists {\n background: lighten($ui-base-color, 13%);\n height: 50vh;\n border-radius: 0 0 8px 8px;\n overflow-y: auto;\n }\n\n .list {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n .list__wrapper {\n display: flex;\n }\n\n .list__display-name {\n flex: 1 1 auto;\n overflow: hidden;\n text-decoration: none;\n font-size: 16px;\n padding: 10px;\n }\n}\n\n.focal-point {\n position: relative;\n cursor: move;\n overflow: hidden;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n background: $base-shadow-color;\n\n img,\n video,\n canvas {\n display: block;\n max-height: 80vh;\n width: 100%;\n height: auto;\n margin: 0;\n object-fit: contain;\n background: $base-shadow-color;\n }\n\n &__reticle {\n position: absolute;\n width: 100px;\n height: 100px;\n transform: translate(-50%, -50%);\n background: url('~images/reticle.png') no-repeat 0 0;\n border-radius: 50%;\n box-shadow: 0 0 0 9999em rgba($base-shadow-color, 0.35);\n }\n\n &__overlay {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n }\n\n &__preview {\n position: absolute;\n bottom: 10px;\n right: 10px;\n z-index: 2;\n cursor: move;\n transition: opacity 0.1s ease;\n\n &:hover {\n opacity: 0.5;\n }\n\n strong {\n color: $primary-text-color;\n font-size: 14px;\n font-weight: 500;\n display: block;\n margin-bottom: 5px;\n }\n\n div {\n border-radius: 4px;\n box-shadow: 0 0 14px rgba($base-shadow-color, 0.2);\n }\n }\n\n @media screen and (max-width: 480px) {\n img,\n video {\n max-height: 100%;\n }\n\n &__preview {\n display: none;\n }\n }\n}\n\n.account__header__content {\n color: $darker-text-color;\n font-size: 14px;\n font-weight: 400;\n overflow: hidden;\n word-break: normal;\n word-wrap: break-word;\n\n p {\n margin-bottom: 20px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: inherit;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n}\n\n.account__header {\n overflow: hidden;\n\n &.inactive {\n opacity: 0.5;\n\n .account__header__image,\n .account__avatar {\n filter: grayscale(100%);\n }\n }\n\n &__info {\n position: absolute;\n top: 10px;\n left: 10px;\n }\n\n &__image {\n overflow: hidden;\n height: 145px;\n position: relative;\n background: darken($ui-base-color, 4%);\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n }\n }\n\n &__bar {\n position: relative;\n background: lighten($ui-base-color, 4%);\n padding: 5px;\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n\n .avatar {\n display: block;\n flex: 0 0 auto;\n width: 94px;\n margin-left: -2px;\n\n .account__avatar {\n background: darken($ui-base-color, 8%);\n border: 2px solid lighten($ui-base-color, 4%);\n }\n }\n }\n\n &__tabs {\n display: flex;\n align-items: flex-start;\n padding: 7px 5px;\n margin-top: -55px;\n\n &__buttons {\n display: flex;\n align-items: center;\n padding-top: 55px;\n overflow: hidden;\n\n .icon-button {\n border: 1px solid lighten($ui-base-color, 12%);\n border-radius: 4px;\n box-sizing: content-box;\n padding: 2px;\n }\n\n .button {\n margin: 0 8px;\n }\n }\n\n &__name {\n padding: 5px;\n\n .account-role {\n vertical-align: top;\n }\n\n .emojione {\n width: 22px;\n height: 22px;\n }\n\n h1 {\n font-size: 16px;\n line-height: 24px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n\n small {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n .spacer {\n flex: 1 1 auto;\n }\n }\n\n &__bio {\n overflow: hidden;\n margin: 0 -5px;\n\n .account__header__content {\n padding: 20px 15px;\n padding-bottom: 5px;\n color: $primary-text-color;\n }\n\n .account__header__fields {\n margin: 0;\n border-top: 1px solid lighten($ui-base-color, 12%);\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n }\n\n &__extra {\n margin-top: 4px;\n\n &__links {\n font-size: 14px;\n color: $darker-text-color;\n padding: 10px 0;\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n padding: 5px 10px;\n font-weight: 500;\n\n strong {\n font-weight: 700;\n color: $primary-text-color;\n }\n }\n }\n }\n}\n\n.trends {\n &__header {\n color: $dark-text-color;\n background: lighten($ui-base-color, 2%);\n border-bottom: 1px solid darken($ui-base-color, 4%);\n font-weight: 500;\n padding: 15px;\n font-size: 16px;\n cursor: default;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n &__item {\n display: flex;\n align-items: center;\n padding: 15px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &:last-child {\n border-bottom: 0;\n }\n\n &__name {\n flex: 1 1 auto;\n color: $dark-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n strong {\n font-weight: 500;\n }\n\n a {\n color: $darker-text-color;\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:hover,\n &:focus,\n &:active {\n span {\n text-decoration: underline;\n }\n }\n }\n }\n\n &__current {\n flex: 0 0 auto;\n font-size: 24px;\n line-height: 36px;\n font-weight: 500;\n text-align: right;\n padding-right: 15px;\n margin-left: 5px;\n color: $secondary-text-color;\n }\n\n &__sparkline {\n flex: 0 0 auto;\n width: 50px;\n\n path:first-child {\n fill: rgba($highlight-text-color, 0.25) !important;\n fill-opacity: 1 !important;\n }\n\n path:last-child {\n stroke: lighten($highlight-text-color, 6%) !important;\n }\n }\n }\n}\n\n.conversation {\n display: flex;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n padding: 5px;\n padding-bottom: 0;\n\n &:focus {\n background: lighten($ui-base-color, 2%);\n outline: 0;\n }\n\n &__avatar {\n flex: 0 0 auto;\n padding: 10px;\n padding-top: 12px;\n position: relative;\n }\n\n &__unread {\n display: inline-block;\n background: $highlight-text-color;\n border-radius: 50%;\n width: 0.625rem;\n height: 0.625rem;\n margin: -.1ex .15em .1ex;\n }\n\n &__content {\n flex: 1 1 auto;\n padding: 10px 5px;\n padding-right: 15px;\n overflow: hidden;\n\n &__info {\n overflow: hidden;\n display: flex;\n flex-direction: row-reverse;\n justify-content: space-between;\n }\n\n &__relative-time {\n font-size: 15px;\n color: $darker-text-color;\n padding-left: 15px;\n }\n\n &__names {\n color: $darker-text-color;\n font-size: 15px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-bottom: 4px;\n flex-basis: 90px;\n flex-grow: 1;\n\n a {\n color: $primary-text-color;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n }\n\n a {\n word-break: break-word;\n }\n }\n\n &--unread {\n background: lighten($ui-base-color, 2%);\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n .conversation__content__info {\n font-weight: 700;\n }\n\n .conversation__content__relative-time {\n color: $primary-text-color;\n }\n }\n}\n",null,"@mixin avatar-radius {\n border-radius: 4px;\n background: transparent no-repeat;\n background-position: 50%;\n background-clip: padding-box;\n}\n\n@mixin avatar-size($size: 48px) {\n width: $size;\n height: $size;\n background-size: $size $size;\n}\n\n@mixin search-input {\n outline: 0;\n box-sizing: border-box;\n width: 100%;\n border: 0;\n box-shadow: none;\n font-family: inherit;\n background: $ui-base-color;\n color: $darker-text-color;\n font-size: 14px;\n margin: 0;\n}\n\n@mixin search-popout {\n background: $simple-background-color;\n border-radius: 4px;\n padding: 10px 14px;\n padding-bottom: 14px;\n margin-top: 10px;\n color: $light-text-color;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n\n h4 {\n color: $light-text-color;\n font-size: 14px;\n font-weight: 500;\n margin-bottom: 10px;\n }\n\n li {\n padding: 4px 0;\n }\n\n ul {\n margin-bottom: 10px;\n }\n\n em {\n font-weight: 500;\n color: $inverted-text-color;\n }\n}\n",".poll {\n margin-top: 16px;\n font-size: 14px;\n\n li {\n margin-bottom: 10px;\n position: relative;\n }\n\n &__chart {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n display: inline-block;\n border-radius: 4px;\n background: darken($ui-primary-color, 14%);\n\n &.leading {\n background: $ui-highlight-color;\n }\n }\n\n &__text {\n position: relative;\n display: flex;\n padding: 6px 0;\n line-height: 18px;\n cursor: default;\n overflow: hidden;\n\n input[type=radio],\n input[type=checkbox] {\n display: none;\n }\n\n .autossugest-input {\n flex: 1 1 auto;\n }\n\n input[type=text] {\n display: block;\n box-sizing: border-box;\n width: 100%;\n font-size: 14px;\n color: $inverted-text-color;\n outline: 0;\n font-family: inherit;\n background: $simple-background-color;\n border: 1px solid darken($simple-background-color, 14%);\n border-radius: 4px;\n padding: 6px 10px;\n\n &:focus {\n border-color: $highlight-text-color;\n }\n }\n\n &.selectable {\n cursor: pointer;\n }\n\n &.editable {\n display: flex;\n align-items: center;\n overflow: visible;\n }\n }\n\n &__input {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 50%;\n vertical-align: middle;\n margin-top: auto;\n margin-bottom: auto;\n flex: 0 0 18px;\n\n &.checkbox {\n border-radius: 4px;\n }\n\n &.active {\n border-color: $valid-value-color;\n background: $valid-value-color;\n }\n\n &:active,\n &:focus,\n &:hover {\n border-width: 4px;\n background: none;\n }\n\n &::-moz-focus-inner {\n outline: 0 !important;\n border: 0;\n }\n\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n\n &__number {\n display: inline-block;\n width: 52px;\n font-weight: 700;\n padding: 0 10px;\n padding-left: 8px;\n text-align: right;\n margin-top: auto;\n margin-bottom: auto;\n flex: 0 0 52px;\n }\n\n &__vote__mark {\n float: left;\n line-height: 18px;\n }\n\n &__footer {\n padding-top: 6px;\n padding-bottom: 5px;\n color: $dark-text-color;\n }\n\n &__link {\n display: inline;\n background: transparent;\n padding: 0;\n margin: 0;\n border: 0;\n color: $dark-text-color;\n text-decoration: underline;\n font-size: inherit;\n\n &:hover {\n text-decoration: none;\n }\n\n &:active,\n &:focus {\n background-color: rgba($dark-text-color, .1);\n }\n }\n\n .button {\n height: 36px;\n padding: 0 16px;\n margin-right: 10px;\n font-size: 14px;\n }\n}\n\n.compose-form__poll-wrapper {\n border-top: 1px solid darken($simple-background-color, 8%);\n\n ul {\n padding: 10px;\n }\n\n .poll__footer {\n border-top: 1px solid darken($simple-background-color, 8%);\n padding: 10px;\n display: flex;\n align-items: center;\n\n button,\n select {\n flex: 1 1 50%;\n\n &:focus {\n border-color: $highlight-text-color;\n }\n }\n }\n\n .button.button-secondary {\n font-size: 14px;\n font-weight: 400;\n padding: 6px 10px;\n height: auto;\n line-height: inherit;\n color: $action-button-color;\n border-color: $action-button-color;\n margin-right: 5px;\n }\n\n li {\n display: flex;\n align-items: center;\n\n .poll__text {\n flex: 0 0 auto;\n width: calc(100% - (23px + 6px));\n margin-right: 6px;\n }\n }\n\n select {\n appearance: none;\n box-sizing: border-box;\n font-size: 14px;\n color: $inverted-text-color;\n display: inline-block;\n width: auto;\n outline: 0;\n font-family: inherit;\n background: $simple-background-color url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center / auto 16px;\n border: 1px solid darken($simple-background-color, 14%);\n border-radius: 4px;\n padding: 6px 10px;\n padding-right: 30px;\n }\n\n .icon-button.disabled {\n color: darken($simple-background-color, 14%);\n }\n}\n\n.muted .poll {\n color: $dark-text-color;\n\n &__chart {\n background: rgba(darken($ui-primary-color, 14%), 0.2);\n\n &.leading {\n background: rgba($ui-highlight-color, 0.2);\n }\n }\n}\n",".modal-layout {\n background: $ui-base-color url('data:image/svg+xml;utf8,') repeat-x bottom fixed;\n display: flex;\n flex-direction: column;\n height: 100vh;\n padding: 0;\n}\n\n.modal-layout__mastodon {\n display: flex;\n flex: 1;\n flex-direction: column;\n justify-content: flex-end;\n\n > * {\n flex: 1;\n max-height: 235px;\n }\n}\n\n@media screen and (max-width: 600px) {\n .account-header {\n margin-top: 0;\n }\n}\n",".emoji-mart {\n font-size: 13px;\n display: inline-block;\n color: $inverted-text-color;\n\n &,\n * {\n box-sizing: border-box;\n line-height: 1.15;\n }\n\n .emoji-mart-emoji {\n padding: 6px;\n }\n}\n\n.emoji-mart-bar {\n border: 0 solid darken($ui-secondary-color, 8%);\n\n &:first-child {\n border-bottom-width: 1px;\n border-top-left-radius: 5px;\n border-top-right-radius: 5px;\n background: $ui-secondary-color;\n }\n\n &:last-child {\n border-top-width: 1px;\n border-bottom-left-radius: 5px;\n border-bottom-right-radius: 5px;\n display: none;\n }\n}\n\n.emoji-mart-anchors {\n display: flex;\n justify-content: space-between;\n padding: 0 6px;\n color: $lighter-text-color;\n line-height: 0;\n}\n\n.emoji-mart-anchor {\n position: relative;\n flex: 1;\n text-align: center;\n padding: 12px 4px;\n overflow: hidden;\n transition: color .1s ease-out;\n cursor: pointer;\n\n &:hover {\n color: darken($lighter-text-color, 4%);\n }\n}\n\n.emoji-mart-anchor-selected {\n color: $highlight-text-color;\n\n &:hover {\n color: darken($highlight-text-color, 4%);\n }\n\n .emoji-mart-anchor-bar {\n bottom: -1px;\n }\n}\n\n.emoji-mart-anchor-bar {\n position: absolute;\n bottom: -5px;\n left: 0;\n width: 100%;\n height: 4px;\n background-color: $highlight-text-color;\n}\n\n.emoji-mart-anchors {\n i {\n display: inline-block;\n width: 100%;\n max-width: 22px;\n }\n\n svg {\n fill: currentColor;\n max-height: 18px;\n }\n}\n\n.emoji-mart-scroll {\n overflow-y: scroll;\n height: 270px;\n max-height: 35vh;\n padding: 0 6px 6px;\n background: $simple-background-color;\n will-change: transform;\n\n &::-webkit-scrollbar-track:hover,\n &::-webkit-scrollbar-track:active {\n background-color: rgba($base-overlay-background, 0.3);\n }\n}\n\n.emoji-mart-search {\n padding: 10px;\n padding-right: 45px;\n background: $simple-background-color;\n\n input {\n font-size: 14px;\n font-weight: 400;\n padding: 7px 9px;\n font-family: inherit;\n display: block;\n width: 100%;\n background: rgba($ui-secondary-color, 0.3);\n color: $inverted-text-color;\n border: 1px solid $ui-secondary-color;\n border-radius: 4px;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n}\n\n.emoji-mart-category .emoji-mart-emoji {\n cursor: pointer;\n\n span {\n z-index: 1;\n position: relative;\n text-align: center;\n }\n\n &:hover::before {\n z-index: 0;\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba($ui-secondary-color, 0.7);\n border-radius: 100%;\n }\n}\n\n.emoji-mart-category-label {\n z-index: 2;\n position: relative;\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n\n span {\n display: block;\n width: 100%;\n font-weight: 500;\n padding: 5px 6px;\n background: $simple-background-color;\n }\n}\n\n.emoji-mart-emoji {\n position: relative;\n display: inline-block;\n font-size: 0;\n\n span {\n width: 22px;\n height: 22px;\n }\n}\n\n.emoji-mart-no-results {\n font-size: 14px;\n text-align: center;\n padding-top: 70px;\n color: $light-text-color;\n\n .emoji-mart-category-label {\n display: none;\n }\n\n .emoji-mart-no-results-label {\n margin-top: .2em;\n }\n\n .emoji-mart-emoji:hover::before {\n content: none;\n }\n}\n\n.emoji-mart-preview {\n display: none;\n}\n","$maximum-width: 1235px;\n$fluid-breakpoint: $maximum-width + 20px;\n$column-breakpoint: 700px;\n$small-breakpoint: 960px;\n\n.container {\n box-sizing: border-box;\n max-width: $maximum-width;\n margin: 0 auto;\n position: relative;\n\n @media screen and (max-width: $fluid-breakpoint) {\n width: 100%;\n padding: 0 10px;\n }\n}\n\n.rich-formatting {\n font-family: $font-sans-serif, sans-serif;\n font-size: 14px;\n font-weight: 400;\n line-height: 1.7;\n word-wrap: break-word;\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n p,\n li {\n color: $darker-text-color;\n }\n\n p {\n margin-top: 0;\n margin-bottom: .85em;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n strong {\n font-weight: 700;\n color: $secondary-text-color;\n }\n\n em {\n font-style: italic;\n color: $secondary-text-color;\n }\n\n code {\n font-size: 0.85em;\n background: darken($ui-base-color, 8%);\n border-radius: 4px;\n padding: 0.2em 0.3em;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n font-family: $font-display, sans-serif;\n margin-top: 1.275em;\n margin-bottom: .85em;\n font-weight: 500;\n color: $secondary-text-color;\n }\n\n h1 {\n font-size: 2em;\n }\n\n h2 {\n font-size: 1.75em;\n }\n\n h3 {\n font-size: 1.5em;\n }\n\n h4 {\n font-size: 1.25em;\n }\n\n h5,\n h6 {\n font-size: 1em;\n }\n\n ul {\n list-style: disc;\n }\n\n ol {\n list-style: decimal;\n }\n\n ul,\n ol {\n margin: 0;\n padding: 0;\n padding-left: 2em;\n margin-bottom: 0.85em;\n\n &[type='a'] {\n list-style-type: lower-alpha;\n }\n\n &[type='i'] {\n list-style-type: lower-roman;\n }\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n margin: 1.7em 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n\n table {\n width: 100%;\n border-collapse: collapse;\n break-inside: auto;\n margin-top: 24px;\n margin-bottom: 32px;\n\n thead tr,\n tbody tr {\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n font-size: 1em;\n line-height: 1.625;\n font-weight: 400;\n text-align: left;\n color: $darker-text-color;\n }\n\n thead tr {\n border-bottom-width: 2px;\n line-height: 1.5;\n font-weight: 500;\n color: $dark-text-color;\n }\n\n th,\n td {\n padding: 8px;\n align-self: start;\n align-items: start;\n word-break: break-all;\n\n &.nowrap {\n width: 25%;\n position: relative;\n\n &::before {\n content: ' ';\n visibility: hidden;\n }\n\n span {\n position: absolute;\n left: 8px;\n right: 8px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n }\n\n & > :first-child {\n margin-top: 0;\n }\n}\n\n.information-board {\n background: darken($ui-base-color, 4%);\n padding: 20px 0;\n\n .container-alt {\n position: relative;\n padding-right: 280px + 15px;\n }\n\n &__sections {\n display: flex;\n justify-content: space-between;\n flex-wrap: wrap;\n }\n\n &__section {\n flex: 1 0 0;\n font-family: $font-sans-serif, sans-serif;\n font-size: 16px;\n line-height: 28px;\n color: $primary-text-color;\n text-align: right;\n padding: 10px 15px;\n\n span,\n strong {\n display: block;\n }\n\n span {\n &:last-child {\n color: $secondary-text-color;\n }\n }\n\n strong {\n font-family: $font-display, sans-serif;\n font-weight: 500;\n font-size: 32px;\n line-height: 48px;\n }\n\n @media screen and (max-width: $column-breakpoint) {\n text-align: center;\n }\n }\n\n .panel {\n position: absolute;\n width: 280px;\n box-sizing: border-box;\n background: darken($ui-base-color, 8%);\n padding: 20px;\n padding-top: 10px;\n border-radius: 4px 4px 0 0;\n right: 0;\n bottom: -40px;\n\n .panel-header {\n font-family: $font-display, sans-serif;\n font-size: 14px;\n line-height: 24px;\n font-weight: 500;\n color: $darker-text-color;\n padding-bottom: 5px;\n margin-bottom: 15px;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n\n a,\n span {\n font-weight: 400;\n color: darken($darker-text-color, 10%);\n }\n\n a {\n text-decoration: none;\n }\n }\n }\n\n .owner {\n text-align: center;\n\n .avatar {\n width: 80px;\n height: 80px;\n margin: 0 auto;\n margin-bottom: 15px;\n\n img {\n display: block;\n width: 80px;\n height: 80px;\n border-radius: 48px;\n }\n }\n\n .name {\n font-size: 14px;\n\n a {\n display: block;\n color: $primary-text-color;\n text-decoration: none;\n\n &:hover {\n .display_name {\n text-decoration: underline;\n }\n }\n }\n\n .username {\n display: block;\n color: $darker-text-color;\n }\n }\n }\n}\n\n.landing-page {\n p,\n li {\n font-family: $font-sans-serif, sans-serif;\n font-size: 16px;\n font-weight: 400;\n font-size: 16px;\n line-height: 30px;\n margin-bottom: 12px;\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n }\n }\n\n em {\n display: inline;\n margin: 0;\n padding: 0;\n font-weight: 700;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n color: lighten($darker-text-color, 10%);\n }\n\n h1 {\n font-family: $font-display, sans-serif;\n font-size: 26px;\n line-height: 30px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n\n small {\n font-family: $font-sans-serif, sans-serif;\n display: block;\n font-size: 18px;\n font-weight: 400;\n color: lighten($darker-text-color, 10%);\n }\n }\n\n h2 {\n font-family: $font-display, sans-serif;\n font-size: 22px;\n line-height: 26px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h3 {\n font-family: $font-display, sans-serif;\n font-size: 18px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h4 {\n font-family: $font-display, sans-serif;\n font-size: 16px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h5 {\n font-family: $font-display, sans-serif;\n font-size: 14px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h6 {\n font-family: $font-display, sans-serif;\n font-size: 12px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n ul,\n ol {\n margin-left: 20px;\n\n &[type='a'] {\n list-style-type: lower-alpha;\n }\n\n &[type='i'] {\n list-style-type: lower-roman;\n }\n }\n\n ul {\n list-style: disc;\n }\n\n ol {\n list-style: decimal;\n }\n\n li > ol,\n li > ul {\n margin-top: 6px;\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid rgba($ui-base-lighter-color, .6);\n margin: 20px 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n\n &__information,\n &__forms {\n padding: 20px;\n }\n\n &__call-to-action {\n background: $ui-base-color;\n border-radius: 4px;\n padding: 25px 40px;\n overflow: hidden;\n box-sizing: border-box;\n\n .row {\n width: 100%;\n display: flex;\n flex-direction: row-reverse;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n }\n\n .row__information-board {\n display: flex;\n justify-content: flex-end;\n align-items: flex-end;\n\n .information-board__section {\n flex: 1 0 auto;\n padding: 0 10px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n width: 100%;\n justify-content: space-between;\n }\n }\n\n .row__mascot {\n flex: 1;\n margin: 10px -50px 0 0;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n }\n\n &__logo {\n margin-right: 20px;\n\n img {\n height: 50px;\n width: auto;\n mix-blend-mode: lighten;\n }\n }\n\n &__information {\n padding: 45px 40px;\n margin-bottom: 10px;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n strong {\n font-weight: 500;\n color: lighten($darker-text-color, 10%);\n }\n\n .account {\n border-bottom: 0;\n padding: 0;\n\n &__display-name {\n align-items: center;\n display: flex;\n margin-right: 5px;\n }\n\n div.account__display-name {\n &:hover {\n .display-name strong {\n text-decoration: none;\n }\n }\n\n .account__avatar {\n cursor: default;\n }\n }\n\n &__avatar-wrapper {\n margin-left: 0;\n flex: 0 0 auto;\n }\n\n &__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n\n .display-name {\n font-size: 15px;\n\n &__account {\n font-size: 14px;\n }\n }\n }\n\n @media screen and (max-width: $small-breakpoint) {\n .contact {\n margin-top: 30px;\n }\n }\n\n @media screen and (max-width: $column-breakpoint) {\n padding: 25px 20px;\n }\n }\n\n &__information,\n &__forms,\n #mastodon-timeline {\n box-sizing: border-box;\n background: $ui-base-color;\n border-radius: 4px;\n box-shadow: 0 0 6px rgba($black, 0.1);\n }\n\n &__mascot {\n height: 104px;\n position: relative;\n left: -40px;\n bottom: 25px;\n\n img {\n height: 190px;\n width: auto;\n }\n }\n\n &__short-description {\n .row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n margin-bottom: 40px;\n }\n\n @media screen and (max-width: $column-breakpoint) {\n .row {\n margin-bottom: 20px;\n }\n }\n\n p a {\n color: $secondary-text-color;\n }\n\n h1 {\n font-weight: 500;\n color: $primary-text-color;\n margin-bottom: 0;\n\n small {\n color: $darker-text-color;\n\n span {\n color: $secondary-text-color;\n }\n }\n }\n\n p:last-child {\n margin-bottom: 0;\n }\n }\n\n &__hero {\n margin-bottom: 10px;\n\n img {\n display: block;\n margin: 0;\n max-width: 100%;\n height: auto;\n border-radius: 4px;\n }\n }\n\n @media screen and (max-width: 840px) {\n .information-board {\n .container-alt {\n padding-right: 20px;\n }\n\n .panel {\n position: static;\n margin-top: 20px;\n width: 100%;\n border-radius: 4px;\n\n .panel-header {\n text-align: center;\n }\n }\n }\n }\n\n @media screen and (max-width: 675px) {\n .header-wrapper {\n padding-top: 0;\n\n &.compact {\n padding-bottom: 0;\n }\n\n &.compact .hero .heading {\n text-align: initial;\n }\n }\n\n .header .container-alt,\n .features .container-alt {\n display: block;\n }\n }\n\n .cta {\n margin: 20px;\n }\n}\n\n.landing {\n margin-bottom: 100px;\n\n @media screen and (max-width: 738px) {\n margin-bottom: 0;\n }\n\n &__brand {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 50px;\n\n svg {\n fill: $primary-text-color;\n height: 52px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding: 0;\n margin-bottom: 30px;\n }\n }\n\n .directory {\n margin-top: 30px;\n background: transparent;\n box-shadow: none;\n border-radius: 0;\n }\n\n .hero-widget {\n margin-top: 30px;\n margin-bottom: 0;\n\n h4 {\n padding: 10px;\n font-weight: 700;\n font-size: 14px;\n color: $darker-text-color;\n }\n\n &__text {\n border-radius: 0;\n padding-bottom: 0;\n }\n\n &__footer {\n background: $ui-base-color;\n padding: 10px;\n border-radius: 0 0 4px 4px;\n display: flex;\n\n &__column {\n flex: 1 1 50%;\n }\n }\n\n .account {\n padding: 10px 0;\n border-bottom: 0;\n\n .account__display-name {\n display: flex;\n align-items: center;\n }\n\n .account__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n }\n\n &__counter {\n padding: 10px;\n\n strong {\n font-family: $font-display, sans-serif;\n font-size: 15px;\n font-weight: 700;\n display: block;\n }\n\n span {\n font-size: 14px;\n color: $darker-text-color;\n }\n }\n }\n\n .simple_form .user_agreement .label_input > label {\n font-weight: 400;\n color: $darker-text-color;\n }\n\n .simple_form p.lead {\n color: $darker-text-color;\n font-size: 15px;\n line-height: 20px;\n font-weight: 400;\n margin-bottom: 25px;\n }\n\n &__grid {\n max-width: 960px;\n margin: 0 auto;\n display: grid;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n grid-gap: 30px;\n\n @media screen and (max-width: 738px) {\n grid-template-columns: minmax(0, 100%);\n grid-gap: 10px;\n\n &__column-login {\n grid-row: 1;\n display: flex;\n flex-direction: column;\n\n .box-widget {\n order: 2;\n flex: 0 0 auto;\n }\n\n .hero-widget {\n margin-top: 0;\n margin-bottom: 10px;\n order: 1;\n flex: 0 0 auto;\n }\n }\n\n &__column-registration {\n grid-row: 2;\n }\n\n .directory {\n margin-top: 10px;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n\n .hero-widget {\n display: block;\n margin-bottom: 0;\n box-shadow: none;\n\n &__img,\n &__img img,\n &__footer {\n border-radius: 0;\n }\n }\n\n .hero-widget,\n .box-widget,\n .directory__tag {\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n .directory {\n margin-top: 0;\n\n &__tag {\n margin-bottom: 0;\n\n & > a,\n & > div {\n border-radius: 0;\n box-shadow: none;\n }\n\n &:last-child {\n border-bottom: 0;\n }\n }\n }\n }\n }\n}\n\n.brand {\n position: relative;\n text-decoration: none;\n}\n\n.brand__tagline {\n display: block;\n position: absolute;\n bottom: -10px;\n left: 50px;\n width: 300px;\n color: $ui-primary-color;\n text-decoration: none;\n font-size: 14px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n position: static;\n width: auto;\n margin-top: 20px;\n color: $dark-text-color;\n }\n}\n\n",".table {\n width: 100%;\n max-width: 100%;\n border-spacing: 0;\n border-collapse: collapse;\n\n th,\n td {\n padding: 8px;\n line-height: 18px;\n vertical-align: top;\n border-top: 1px solid $ui-base-color;\n text-align: left;\n background: darken($ui-base-color, 4%);\n }\n\n & > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid $ui-base-color;\n border-top: 0;\n font-weight: 500;\n }\n\n & > tbody > tr > th {\n font-weight: 500;\n }\n\n & > tbody > tr:nth-child(odd) > td,\n & > tbody > tr:nth-child(odd) > th {\n background: $ui-base-color;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n &.inline-table {\n & > tbody > tr:nth-child(odd) {\n & > td,\n & > th {\n background: transparent;\n }\n }\n\n & > tbody > tr:first-child {\n & > td,\n & > th {\n border-top: 0;\n }\n }\n }\n\n &.batch-table {\n & > thead > tr > th {\n background: $ui-base-color;\n border-top: 1px solid darken($ui-base-color, 8%);\n border-bottom: 1px solid darken($ui-base-color, 8%);\n\n &:first-child {\n border-radius: 4px 0 0;\n border-left: 1px solid darken($ui-base-color, 8%);\n }\n\n &:last-child {\n border-radius: 0 4px 0 0;\n border-right: 1px solid darken($ui-base-color, 8%);\n }\n }\n }\n\n &--invites tbody td {\n vertical-align: middle;\n }\n}\n\n.table-wrapper {\n overflow: auto;\n margin-bottom: 20px;\n}\n\nsamp {\n font-family: $font-monospace, monospace;\n}\n\nbutton.table-action-link {\n background: transparent;\n border: 0;\n font: inherit;\n}\n\nbutton.table-action-link,\na.table-action-link {\n text-decoration: none;\n display: inline-block;\n margin-right: 5px;\n padding: 0 10px;\n color: $darker-text-color;\n font-weight: 500;\n\n &:hover {\n color: $primary-text-color;\n }\n\n i.fa {\n font-weight: 400;\n margin-right: 5px;\n }\n\n &:first-child {\n padding-left: 0;\n }\n}\n\n.batch-table {\n &__toolbar,\n &__row {\n display: flex;\n\n &__select {\n box-sizing: border-box;\n padding: 8px 16px;\n cursor: pointer;\n min-height: 100%;\n\n input {\n margin-top: 8px;\n }\n\n &--aligned {\n display: flex;\n align-items: center;\n\n input {\n margin-top: 0;\n }\n }\n }\n\n &__actions,\n &__content {\n padding: 8px 0;\n padding-right: 16px;\n flex: 1 1 auto;\n }\n }\n\n &__toolbar {\n border: 1px solid darken($ui-base-color, 8%);\n background: $ui-base-color;\n border-radius: 4px 0 0;\n height: 47px;\n align-items: center;\n\n &__actions {\n text-align: right;\n padding-right: 16px - 5px;\n }\n }\n\n &__form {\n padding: 16px;\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n background: $ui-base-color;\n\n .fields-row {\n padding-top: 0;\n margin-bottom: 0;\n }\n }\n\n &__row {\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n background: darken($ui-base-color, 4%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n .optional &:first-child {\n border-top: 1px solid darken($ui-base-color, 8%);\n }\n }\n\n &:hover {\n background: darken($ui-base-color, 2%);\n }\n\n &:nth-child(even) {\n background: $ui-base-color;\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n }\n\n &__content {\n padding-top: 12px;\n padding-bottom: 16px;\n\n &--unpadded {\n padding: 0;\n }\n\n &--with-image {\n display: flex;\n align-items: center;\n }\n\n &__image {\n flex: 0 0 auto;\n display: flex;\n justify-content: center;\n align-items: center;\n margin-right: 10px;\n\n .emojione {\n width: 32px;\n height: 32px;\n }\n }\n\n &__text {\n flex: 1 1 auto;\n }\n\n &__extra {\n flex: 0 0 auto;\n text-align: right;\n color: $darker-text-color;\n font-weight: 500;\n }\n }\n\n .directory__tag {\n margin: 0;\n width: 100%;\n\n a {\n background: transparent;\n border-radius: 0;\n }\n }\n }\n\n &.optional .batch-table__toolbar,\n &.optional .batch-table__row__select {\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n\n .status__content {\n padding-top: 0;\n\n summary {\n display: list-item;\n }\n\n strong {\n font-weight: 700;\n }\n }\n\n .nothing-here {\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n box-shadow: none;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 1px solid darken($ui-base-color, 8%);\n }\n }\n\n @media screen and (max-width: 870px) {\n .accounts-table tbody td.optional {\n display: none;\n }\n }\n}\n","$no-columns-breakpoint: 600px;\n$sidebar-width: 240px;\n$content-width: 840px;\n\n.admin-wrapper {\n display: flex;\n justify-content: center;\n width: 100%;\n min-height: 100vh;\n\n .sidebar-wrapper {\n min-height: 100vh;\n overflow: hidden;\n pointer-events: none;\n flex: 1 1 auto;\n\n &__inner {\n display: flex;\n justify-content: flex-end;\n background: $ui-base-color;\n height: 100%;\n }\n }\n\n .sidebar {\n width: $sidebar-width;\n padding: 0;\n pointer-events: auto;\n\n &__toggle {\n display: none;\n background: lighten($ui-base-color, 8%);\n height: 48px;\n\n &__logo {\n flex: 1 1 auto;\n\n a {\n display: inline-block;\n padding: 15px;\n }\n\n svg {\n fill: $primary-text-color;\n height: 20px;\n position: relative;\n bottom: -2px;\n }\n }\n\n &__icon {\n display: block;\n color: $darker-text-color;\n text-decoration: none;\n flex: 0 0 auto;\n font-size: 20px;\n padding: 15px;\n }\n\n a {\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 12%);\n }\n }\n }\n\n .logo {\n display: block;\n margin: 40px auto;\n width: 100px;\n height: 100px;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n & > a:first-child {\n display: none;\n }\n }\n\n ul {\n list-style: none;\n border-radius: 4px 0 0 4px;\n overflow: hidden;\n margin-bottom: 20px;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n margin-bottom: 0;\n }\n\n a {\n display: block;\n padding: 15px;\n color: $darker-text-color;\n text-decoration: none;\n transition: all 200ms linear;\n transition-property: color, background-color;\n border-radius: 4px 0 0 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n i.fa {\n margin-right: 5px;\n }\n\n &:hover {\n color: $primary-text-color;\n background-color: darken($ui-base-color, 5%);\n transition: all 100ms linear;\n transition-property: color, background-color;\n }\n\n &.selected {\n background: darken($ui-base-color, 2%);\n border-radius: 4px 0 0;\n }\n }\n\n ul {\n background: darken($ui-base-color, 4%);\n border-radius: 0 0 0 4px;\n margin: 0;\n\n a {\n border: 0;\n padding: 15px 35px;\n }\n }\n\n .simple-navigation-active-leaf a {\n color: $primary-text-color;\n background-color: $ui-highlight-color;\n border-bottom: 0;\n border-radius: 0;\n\n &:hover {\n background-color: lighten($ui-highlight-color, 5%);\n }\n }\n }\n\n & > ul > .simple-navigation-active-leaf a {\n border-radius: 4px 0 0 4px;\n }\n }\n\n .content-wrapper {\n box-sizing: border-box;\n width: 100%;\n max-width: $content-width;\n flex: 1 1 auto;\n }\n\n @media screen and (max-width: $content-width + $sidebar-width) {\n .sidebar-wrapper--empty {\n display: none;\n }\n\n .sidebar-wrapper {\n width: $sidebar-width;\n flex: 0 0 auto;\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n .sidebar-wrapper {\n width: 100%;\n }\n }\n\n .content {\n padding: 20px 15px;\n padding-top: 60px;\n padding-left: 25px;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n max-width: none;\n padding: 15px;\n padding-top: 30px;\n }\n\n &-heading {\n display: flex;\n\n padding-bottom: 40px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n margin: -15px -15px 40px 0;\n\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n\n & > * {\n margin-top: 15px;\n margin-right: 15px;\n }\n\n &-actions {\n display: inline-flex;\n\n & > :not(:first-child) {\n margin-left: 5px;\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n border-bottom: 0;\n padding-bottom: 0;\n }\n }\n\n h2 {\n color: $secondary-text-color;\n font-size: 24px;\n line-height: 28px;\n font-weight: 400;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n font-weight: 700;\n }\n }\n\n h3 {\n color: $secondary-text-color;\n font-size: 20px;\n line-height: 28px;\n font-weight: 400;\n margin-bottom: 30px;\n }\n\n h4 {\n font-size: 14px;\n font-weight: 700;\n color: $darker-text-color;\n padding-bottom: 8px;\n margin-bottom: 8px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n h6 {\n font-size: 16px;\n color: $secondary-text-color;\n line-height: 28px;\n font-weight: 500;\n }\n\n .fields-group h6 {\n color: $primary-text-color;\n font-weight: 500;\n }\n\n .directory__tag > a,\n .directory__tag > div {\n box-shadow: none;\n }\n\n .directory__tag .table-action-link .fa {\n color: inherit;\n }\n\n .directory__tag h4 {\n font-size: 18px;\n font-weight: 700;\n color: $primary-text-color;\n text-transform: none;\n padding-bottom: 0;\n margin-bottom: 0;\n border-bottom: 0;\n }\n\n & > p {\n font-size: 14px;\n line-height: 21px;\n color: $secondary-text-color;\n margin-bottom: 20px;\n\n strong {\n color: $primary-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid rgba($ui-base-lighter-color, .6);\n margin: 20px 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n\n .sidebar-wrapper {\n min-height: 0;\n }\n\n .sidebar {\n width: 100%;\n padding: 0;\n height: auto;\n\n &__toggle {\n display: flex;\n }\n\n & > ul {\n display: none;\n }\n\n ul a,\n ul ul a {\n border-radius: 0;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n transition: none;\n\n &:hover {\n transition: none;\n }\n }\n\n ul ul {\n border-radius: 0;\n }\n\n ul .simple-navigation-active-leaf a {\n border-bottom-color: $ui-highlight-color;\n }\n }\n }\n}\n\nhr.spacer {\n width: 100%;\n border: 0;\n margin: 20px 0;\n height: 1px;\n}\n\nbody,\n.admin-wrapper .content {\n .muted-hint {\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n }\n }\n\n .positive-hint {\n color: $valid-value-color;\n font-weight: 500;\n }\n\n .negative-hint {\n color: $error-value-color;\n font-weight: 500;\n }\n\n .neutral-hint {\n color: $dark-text-color;\n font-weight: 500;\n }\n\n .warning-hint {\n color: $gold-star;\n font-weight: 500;\n }\n}\n\n.filters {\n display: flex;\n flex-wrap: wrap;\n\n .filter-subset {\n flex: 0 0 auto;\n margin: 0 40px 20px 0;\n\n &:last-child {\n margin-bottom: 30px;\n }\n\n ul {\n margin-top: 5px;\n list-style: none;\n\n li {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n strong {\n font-weight: 500;\n font-size: 13px;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n font-size: 13px;\n font-weight: 500;\n border-bottom: 2px solid $ui-base-color;\n\n &:hover {\n color: $primary-text-color;\n border-bottom: 2px solid lighten($ui-base-color, 5%);\n }\n\n &.selected {\n color: $highlight-text-color;\n border-bottom: 2px solid $ui-highlight-color;\n }\n }\n }\n}\n\n.flavour-screen {\n display: block;\n margin: 10px auto;\n max-width: 100%;\n}\n\n.flavour-description {\n display: block;\n font-size: 16px;\n margin: 10px 0;\n\n & > p {\n margin: 10px 0;\n }\n}\n\n.flavour-screen {\n display: block;\n margin: 10px auto;\n max-width: 100%;\n}\n\n.flavour-description {\n display: block;\n font-size: 16px;\n margin: 10px 0;\n\n & > p {\n margin: 10px 0;\n }\n}\n\n.report-accounts {\n display: flex;\n flex-wrap: wrap;\n margin-bottom: 20px;\n}\n\n.report-accounts__item {\n display: flex;\n flex: 250px;\n flex-direction: column;\n margin: 0 5px;\n\n & > strong {\n display: block;\n margin: 0 0 10px -5px;\n font-weight: 500;\n font-size: 14px;\n line-height: 18px;\n color: $secondary-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n .account-card {\n flex: 1 1 auto;\n }\n}\n\n.report-status,\n.account-status {\n display: flex;\n margin-bottom: 10px;\n\n .activity-stream {\n flex: 2 0 0;\n margin-right: 20px;\n max-width: calc(100% - 60px);\n\n .entry {\n border-radius: 4px;\n }\n }\n}\n\n.report-status__actions,\n.account-status__actions {\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n\n .icon-button {\n font-size: 24px;\n width: 24px;\n text-align: center;\n margin-bottom: 10px;\n }\n}\n\n.simple_form.new_report_note,\n.simple_form.new_account_moderation_note {\n max-width: 100%;\n}\n\n.batch-form-box {\n display: flex;\n flex-wrap: wrap;\n margin-bottom: 5px;\n\n #form_status_batch_action {\n margin: 0 5px 5px 0;\n font-size: 14px;\n }\n\n input.button {\n margin: 0 5px 5px 0;\n }\n\n .media-spoiler-toggle-buttons {\n margin-left: auto;\n\n .button {\n overflow: visible;\n margin: 0 0 5px 5px;\n float: right;\n }\n }\n}\n\n.back-link {\n margin-bottom: 10px;\n font-size: 14px;\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.spacer {\n flex: 1 1 auto;\n}\n\n.log-entry {\n margin-bottom: 20px;\n line-height: 20px;\n\n &__header {\n display: flex;\n justify-content: flex-start;\n align-items: center;\n padding: 10px;\n background: $ui-base-color;\n color: $darker-text-color;\n border-radius: 4px 4px 0 0;\n font-size: 14px;\n position: relative;\n }\n\n &__avatar {\n margin-right: 10px;\n\n .avatar {\n display: block;\n margin: 0;\n border-radius: 50%;\n width: 40px;\n height: 40px;\n }\n }\n\n &__content {\n max-width: calc(100% - 90px);\n }\n\n &__title {\n word-wrap: break-word;\n }\n\n &__timestamp {\n color: $dark-text-color;\n }\n\n &__extras {\n background: lighten($ui-base-color, 6%);\n border-radius: 0 0 4px 4px;\n padding: 10px;\n color: $darker-text-color;\n font-family: $font-monospace, monospace;\n font-size: 12px;\n word-wrap: break-word;\n min-height: 20px;\n }\n\n &__icon {\n font-size: 28px;\n margin-right: 10px;\n color: $dark-text-color;\n }\n\n &__icon__overlay {\n position: absolute;\n top: 10px;\n right: 10px;\n width: 10px;\n height: 10px;\n border-radius: 50%;\n\n &.positive {\n background: $success-green;\n }\n\n &.negative {\n background: lighten($error-red, 12%);\n }\n\n &.neutral {\n background: $ui-highlight-color;\n }\n }\n\n a,\n .username,\n .target {\n color: $secondary-text-color;\n text-decoration: none;\n font-weight: 500;\n }\n\n .diff-old {\n color: lighten($error-red, 12%);\n }\n\n .diff-neutral {\n color: $secondary-text-color;\n }\n\n .diff-new {\n color: $success-green;\n }\n}\n\na.name-tag,\n.name-tag,\na.inline-name-tag,\n.inline-name-tag {\n text-decoration: none;\n color: $secondary-text-color;\n\n .username {\n font-weight: 500;\n }\n\n &.suspended {\n .username {\n text-decoration: line-through;\n color: lighten($error-red, 12%);\n }\n\n .avatar {\n filter: grayscale(100%);\n opacity: 0.8;\n }\n }\n}\n\na.name-tag,\n.name-tag {\n display: flex;\n align-items: center;\n\n .avatar {\n display: block;\n margin: 0;\n margin-right: 5px;\n border-radius: 50%;\n }\n\n &.suspended {\n .avatar {\n filter: grayscale(100%);\n opacity: 0.8;\n }\n }\n}\n\n.speech-bubble {\n margin-bottom: 20px;\n border-left: 4px solid $ui-highlight-color;\n\n &.positive {\n border-left-color: $success-green;\n }\n\n &.negative {\n border-left-color: lighten($error-red, 12%);\n }\n\n &.warning {\n border-left-color: $gold-star;\n }\n\n &__bubble {\n padding: 16px;\n padding-left: 14px;\n font-size: 15px;\n line-height: 20px;\n border-radius: 4px 4px 4px 0;\n position: relative;\n font-weight: 500;\n\n a {\n color: $darker-text-color;\n }\n }\n\n &__owner {\n padding: 8px;\n padding-left: 12px;\n }\n\n time {\n color: $dark-text-color;\n }\n}\n\n.report-card {\n background: $ui-base-color;\n border-radius: 4px;\n margin-bottom: 20px;\n\n &__profile {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 15px;\n\n .account {\n padding: 0;\n border: 0;\n\n &__avatar-wrapper {\n margin-left: 0;\n }\n }\n\n &__stats {\n flex: 0 0 auto;\n font-weight: 500;\n color: $darker-text-color;\n text-align: right;\n\n a {\n color: inherit;\n text-decoration: none;\n\n &:focus,\n &:hover,\n &:active {\n color: lighten($darker-text-color, 8%);\n }\n }\n\n .red {\n color: $error-value-color;\n }\n }\n }\n\n &__summary {\n &__item {\n display: flex;\n justify-content: flex-start;\n border-top: 1px solid darken($ui-base-color, 4%);\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n\n &__reported-by,\n &__assigned {\n padding: 15px;\n flex: 0 0 auto;\n box-sizing: border-box;\n width: 150px;\n color: $darker-text-color;\n\n &,\n .username {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n &__content {\n flex: 1 1 auto;\n max-width: calc(100% - 300px);\n\n &__icon {\n color: $dark-text-color;\n margin-right: 4px;\n font-weight: 500;\n }\n }\n\n &__content a {\n display: block;\n box-sizing: border-box;\n width: 100%;\n padding: 15px;\n text-decoration: none;\n color: $darker-text-color;\n }\n }\n }\n}\n\n.one-line {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.ellipsized-ip {\n display: inline-block;\n max-width: 120px;\n overflow: hidden;\n text-overflow: ellipsis;\n vertical-align: middle;\n}\n\n.admin-account-bio {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n margin-top: 20px;\n\n > div {\n box-sizing: border-box;\n padding: 0 5px;\n margin-bottom: 10px;\n flex: 1 0 50%;\n }\n\n .account__header__fields,\n .account__header__content {\n background: lighten($ui-base-color, 8%);\n border-radius: 4px;\n height: 100%;\n }\n\n .account__header__fields {\n margin: 0;\n border: 0;\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n\n .account__header__content {\n box-sizing: border-box;\n padding: 20px;\n color: $primary-text-color;\n }\n}\n\n.center-text {\n text-align: center;\n}\n",".dashboard__counters {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n margin-bottom: 20px;\n\n & > div {\n box-sizing: border-box;\n flex: 0 0 33.333%;\n padding: 0 5px;\n margin-bottom: 10px;\n\n & > div,\n & > a {\n padding: 20px;\n background: lighten($ui-base-color, 4%);\n border-radius: 4px;\n box-sizing: border-box;\n height: 100%;\n }\n\n & > a {\n text-decoration: none;\n color: inherit;\n display: block;\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 8%);\n }\n }\n }\n\n &__num,\n &__text {\n text-align: center;\n font-weight: 500;\n font-size: 24px;\n line-height: 21px;\n color: $primary-text-color;\n font-family: $font-display, sans-serif;\n margin-bottom: 20px;\n line-height: 30px;\n }\n\n &__text {\n font-size: 18px;\n }\n\n &__label {\n font-size: 14px;\n color: $darker-text-color;\n text-align: center;\n font-weight: 500;\n }\n}\n\n.dashboard__widgets {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n\n & > div {\n flex: 0 0 33.333%;\n margin-bottom: 20px;\n\n & > div {\n padding: 0 5px;\n }\n }\n\n a:not(.name-tag) {\n color: $ui-secondary-color;\n font-weight: 500;\n text-decoration: none;\n }\n}\n","body.rtl {\n direction: rtl;\n\n .column-header > button {\n text-align: right;\n padding-left: 0;\n padding-right: 15px;\n }\n\n .radio-button__input {\n margin-right: 0;\n margin-left: 10px;\n }\n\n .directory__card__bar .display-name {\n margin-left: 0;\n margin-right: 15px;\n }\n\n .display-name {\n text-align: right;\n }\n\n .notification__message {\n margin-left: 0;\n margin-right: 68px;\n }\n\n .drawer__inner__mastodon > img {\n transform: scaleX(-1);\n }\n\n .notification__favourite-icon-wrapper {\n left: auto;\n right: -26px;\n }\n\n .landing-page__logo {\n margin-right: 0;\n margin-left: 20px;\n }\n\n .landing-page .features-list .features-list__row .visual {\n margin-left: 0;\n margin-right: 15px;\n }\n\n .column-link__icon,\n .column-header__icon {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .compose-form .compose-form__buttons-wrapper .character-counter__wrapper {\n margin-right: 0;\n margin-left: 4px;\n }\n\n .navigation-bar__profile {\n margin-left: 0;\n margin-right: 8px;\n }\n\n .search__input {\n padding-right: 10px;\n padding-left: 30px;\n }\n\n .search__icon .fa {\n right: auto;\n left: 10px;\n }\n\n .columns-area {\n direction: rtl;\n }\n\n .column-header__buttons {\n left: 0;\n right: auto;\n margin-left: 0;\n margin-right: -15px;\n }\n\n .column-inline-form .icon-button {\n margin-left: 0;\n margin-right: 5px;\n }\n\n .column-header__links .text-btn {\n margin-left: 10px;\n margin-right: 0;\n }\n\n .account__avatar-wrapper {\n float: right;\n }\n\n .column-header__back-button {\n padding-left: 5px;\n padding-right: 0;\n }\n\n .column-header__setting-arrows {\n float: left;\n }\n\n .setting-toggle__label {\n margin-left: 0;\n margin-right: 8px;\n }\n\n .status__avatar {\n left: auto;\n right: 10px;\n }\n\n .status,\n .activity-stream .status.light {\n padding-left: 10px;\n padding-right: 68px;\n }\n\n .status__info .status__display-name,\n .activity-stream .status.light .status__display-name {\n padding-left: 25px;\n padding-right: 0;\n }\n\n .activity-stream .pre-header {\n padding-right: 68px;\n padding-left: 0;\n }\n\n .status__prepend {\n margin-left: 0;\n margin-right: 68px;\n }\n\n .status__prepend-icon-wrapper {\n left: auto;\n right: -26px;\n }\n\n .activity-stream .pre-header .pre-header__icon {\n left: auto;\n right: 42px;\n }\n\n .account__avatar-overlay-overlay {\n right: auto;\n left: 0;\n }\n\n .column-back-button--slim-button {\n right: auto;\n left: 0;\n }\n\n .status__relative-time,\n .activity-stream .status.light .status__header .status__meta {\n float: left;\n }\n\n .status__action-bar {\n &__counter {\n margin-right: 0;\n margin-left: 11px;\n\n .status__action-bar-button {\n margin-right: 0;\n margin-left: 4px;\n }\n }\n }\n\n .status__action-bar-button {\n float: right;\n margin-right: 0;\n margin-left: 18px;\n }\n\n .status__action-bar-dropdown {\n float: right;\n }\n\n .privacy-dropdown__dropdown {\n margin-left: 0;\n margin-right: 40px;\n }\n\n .privacy-dropdown__option__icon {\n margin-left: 10px;\n margin-right: 0;\n }\n\n .detailed-status__display-name .display-name {\n text-align: right;\n }\n\n .detailed-status__display-avatar {\n margin-right: 0;\n margin-left: 10px;\n float: right;\n }\n\n .detailed-status__favorites,\n .detailed-status__reblogs {\n margin-left: 0;\n margin-right: 6px;\n }\n\n .fa-ul {\n margin-left: 2.14285714em;\n }\n\n .fa-li {\n left: auto;\n right: -2.14285714em;\n }\n\n .admin-wrapper {\n direction: rtl;\n }\n\n .admin-wrapper .sidebar ul a i.fa,\n a.table-action-link i.fa {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .simple_form .check_boxes .checkbox label {\n padding-left: 0;\n padding-right: 25px;\n }\n\n .simple_form .input.with_label.boolean label.checkbox {\n padding-left: 25px;\n padding-right: 0;\n }\n\n .simple_form .check_boxes .checkbox input[type=\"checkbox\"],\n .simple_form .input.boolean input[type=\"checkbox\"] {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.radio_buttons .radio {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.radio_buttons .radio > label {\n padding-right: 28px;\n padding-left: 0;\n }\n\n .simple_form .input-with-append .input input {\n padding-left: 142px;\n padding-right: 0;\n }\n\n .simple_form .input.boolean label.checkbox {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.boolean .label_input,\n .simple_form .input.boolean .hint {\n padding-left: 0;\n padding-right: 28px;\n }\n\n .simple_form .label_input__append {\n right: auto;\n left: 3px;\n\n &::after {\n right: auto;\n left: 0;\n background-image: linear-gradient(to left, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));\n }\n }\n\n .simple_form select {\n background: darken($ui-base-color, 10%) url(\"data:image/svg+xml;utf8,\") no-repeat left 8px center / auto 16px;\n }\n\n .table th,\n .table td {\n text-align: right;\n }\n\n .filters .filter-subset {\n margin-right: 0;\n margin-left: 45px;\n }\n\n .landing-page .header-wrapper .mascot {\n right: 60px;\n left: auto;\n }\n\n .landing-page__call-to-action .row__information-board {\n direction: rtl;\n }\n\n .landing-page .header .hero .floats .float-1 {\n left: -120px;\n right: auto;\n }\n\n .landing-page .header .hero .floats .float-2 {\n left: 210px;\n right: auto;\n }\n\n .landing-page .header .hero .floats .float-3 {\n left: 110px;\n right: auto;\n }\n\n .landing-page .header .links .brand img {\n left: 0;\n }\n\n .landing-page .fa-external-link {\n padding-right: 5px;\n padding-left: 0 !important;\n }\n\n .landing-page .features #mastodon-timeline {\n margin-right: 0;\n margin-left: 30px;\n }\n\n @media screen and (min-width: 631px) {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n\n &:first-child {\n padding-left: 5px;\n padding-right: 10px;\n }\n }\n\n .columns-area > div {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n }\n }\n }\n\n .columns-area--mobile .column,\n .columns-area--mobile .drawer {\n padding-left: 0;\n padding-right: 0;\n }\n\n .public-layout {\n .header {\n .nav-button {\n margin-left: 8px;\n margin-right: 0;\n }\n }\n\n .public-account-header__tabs {\n margin-left: 0;\n margin-right: 20px;\n }\n }\n\n .landing-page__information {\n .account__display-name {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .account__avatar-wrapper {\n margin-left: 12px;\n margin-right: 0;\n }\n }\n\n .card__bar .display-name {\n margin-left: 0;\n margin-right: 15px;\n text-align: right;\n }\n\n .fa-chevron-left::before {\n content: \"\\F054\";\n }\n\n .fa-chevron-right::before {\n content: \"\\F053\";\n }\n\n .column-back-button__icon {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .column-header__setting-arrows .column-header__setting-btn:last-child {\n padding-left: 0;\n padding-right: 10px;\n }\n\n .simple_form .input.radio_buttons .radio > label input {\n left: auto;\n right: 0;\n }\n}\n","$black-emojis: '8ball' 'ant' 'back' 'black_circle' 'black_heart' 'black_large_square' 'black_medium_small_square' 'black_medium_square' 'black_nib' 'black_small_square' 'bomb' 'bowling' 'bust_in_silhouette' 'busts_in_silhouette' 'camera' 'camera_with_flash' 'clubs' 'copyright' 'curly_loop' 'currency_exchange' 'dark_sunglasses' 'eight_pointed_black_star' 'electric_plug' 'end' 'female-guard' 'film_projector' 'fried_egg' 'gorilla' 'guardsman' 'heavy_check_mark' 'heavy_division_sign' 'heavy_dollar_sign' 'heavy_minus_sign' 'heavy_multiplication_x' 'heavy_plus_sign' 'hocho' 'hole' 'joystick' 'kaaba' 'lower_left_ballpoint_pen' 'lower_left_fountain_pen' 'male-guard' 'microphone' 'mortar_board' 'movie_camera' 'musical_score' 'on' 'registered' 'soon' 'spades' 'speaking_head_in_silhouette' 'spider' 'telephone_receiver' 'tm' 'top' 'tophat' 'turkey' 'vhs' 'video_camera' 'video_game' 'water_buffalo' 'waving_black_flag' 'wavy_dash';\n\n%white-emoji-outline {\n filter: drop-shadow(1px 1px 0 $white) drop-shadow(-1px 1px 0 $white) drop-shadow(1px -1px 0 $white) drop-shadow(-1px -1px 0 $white);\n transform: scale(.71);\n}\n\n.emojione {\n @each $emoji in $black-emojis {\n &[title=':#{$emoji}:'] {\n @extend %white-emoji-outline;\n }\n }\n}\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///application.scss","webpack:///./app/javascript/styles/mastodon/reset.scss","webpack:///./app/javascript/styles/mastodon/variables.scss","webpack:///./app/javascript/styles/mastodon/basics.scss","webpack:///./app/javascript/styles/mastodon/containers.scss","webpack:///./app/javascript/styles/mastodon/lists.scss","webpack:///./app/javascript/styles/mastodon/footer.scss","webpack:///./app/javascript/styles/mastodon/compact_header.scss","webpack:///./app/javascript/styles/mastodon/widgets.scss","webpack:///./app/javascript/styles/mastodon/forms.scss","webpack:///./app/javascript/styles/mastodon/accounts.scss","webpack:///./app/javascript/styles/mastodon/statuses.scss","webpack:///./app/javascript/styles/mastodon/boost.scss","webpack:///./app/javascript/styles/mastodon/components.scss","webpack:///","webpack:///./app/javascript/styles/mastodon/_mixins.scss","webpack:///./app/javascript/styles/mastodon/polls.scss","webpack:///./app/javascript/styles/mastodon/modal.scss","webpack:///./app/javascript/styles/mastodon/emoji_picker.scss","webpack:///./app/javascript/styles/mastodon/about.scss","webpack:///./app/javascript/styles/mastodon/tables.scss","webpack:///./app/javascript/styles/mastodon/admin.scss","webpack:///./app/javascript/styles/mastodon/dashboard.scss","webpack:///./app/javascript/styles/mastodon/rtl.scss","webpack:///./app/javascript/styles/mastodon/accessibility.scss"],"names":[],"mappings":"AAAA,2ZCKA,QAaE,UACA,SACA,eACA,aACA,wBACA,+EAIF,aAEE,MAGF,aACE,OAGF,eACE,cAGF,WACE,qDAGF,UAEE,aACA,OAGF,wBACE,iBACA,MAGF,sCACE,qBAGF,UACE,YACA,2BAGF,kBACE,cACA,mBACA,iCAGF,kBACE,kCAGF,kBACE,2BAGF,aACE,gBACA,0BACA,CCtEW,iED6Eb,kBC7Ea,4BDiFb,sBACE,MErFF,iDACE,mBACA,eACA,iBACA,gBACA,WDXM,kCCaN,6BACA,8BACA,CADA,0BACA,CADA,qBACA,0CACA,wCACA,kBAEA,iKAYE,eAGF,SACE,oCAEA,WACE,iBACA,kBACA,uCAGF,iBACE,WACA,YACA,mCAGF,iBACE,cAIJ,kBD7CW,kBCiDX,iBACE,kBACA,0BAEA,iBACE,aAIJ,iBACE,YAGF,kBACE,SACA,iBACA,uBAEA,iBACE,WACA,YACA,gBACA,YAIJ,kBACE,UACA,YAGF,iBACE,kBACA,cD3EoB,mBAPX,WCqFT,YACA,UACA,aACA,uBACA,mBACA,oBAEA,qBACE,YACA,sCAGE,aACE,gBACA,WACA,YACA,kBACA,uBAIJ,cACE,iBACA,gBACA,QAMR,mBACE,eACA,cAEA,YACE,kDAKF,YAGE,WACA,mBACA,uBACA,oBACA,sBAGF,YACE,yEAKF,gBAEE,+EAKF,WAEE,sCAIJ,qBAEE,eACA,gBACA,gBACA,cACA,kBACA,8CAEA,eACE,0CAGF,mBACE,gEAEA,eACE,0CAIJ,aDtKwB,kKCyKtB,oBAGE,sDAIJ,aDpKsB,eCsKpB,0DAEA,aDxKoB,oDC6KtB,cACE,SACA,uBACA,cDhLoB,aCkLpB,UACA,SACA,oBACA,eACA,UACA,4BACA,0BACA,gMAEA,oBAGE,kEAGF,aD9NY,gBCgOV,gBCnON,WACE,CACA,kBACA,qCAEA,eALF,UAMI,SACA,kBAIJ,sBACE,qCAEA,gBAHF,kBAII,qBAGF,YACE,uBACA,mBACA,wBAEA,SFrBI,YEuBF,kBACA,sBAGF,YACE,uBACA,mBACA,WF9BE,qBEgCF,UACA,kBACA,iBACA,6CACA,gBACA,eACA,mCAMJ,WACE,CACA,cACA,mBACA,sBACA,qCAEA,kCAPF,UAQI,aACA,aACA,kBAKN,WACE,CACA,YACA,eACA,iBACA,sBACA,CACA,gBACA,CACA,sBACA,qCAEA,gBAZF,UAaI,CACA,eACA,CACA,mBACA,0BAGF,UACE,YACA,iBACA,6BAEA,UACE,YACA,cACA,SACA,kBACA,uBAIJ,aACE,cF7EsB,wBE+EtB,iCAEA,aACE,gBACA,uBACA,gBACA,8BAIJ,aACE,eACA,iBACA,gBACA,SAIJ,YACE,cACA,8BACA,sBACA,mCACA,CADA,0BACA,mBAEA,eACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,eACE,WACA,qCAGF,QA3BF,UA4BI,qCACA,mBAEA,aACE,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,UAKN,YACE,cACA,8CACA,sBACA,mCACA,CADA,0BACA,mBAEA,eACE,WACA,mBAGF,eACE,WACA,mBAGF,aACE,WACA,mBAGF,eACE,WACA,mBAGF,aACE,WACA,uCAGF,eACE,wBAGF,kBACE,qCAGF,QAxCF,iDAyCI,uCAEA,YACE,aACA,mBACA,uBACA,iCAGF,UACE,uBACA,mBACA,sBAGF,YACE,sCAIJ,QA7DF,UA8DI,qCACA,mBAEA,aACE,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,sCAMJ,eADF,gBAEI,4BAGF,eACE,qCAEA,0BAHF,SAII,yBAIJ,kBACE,mCACA,kBACA,YACA,cACA,aACA,oBACA,uBACA,iBACA,gBACA,qCAEA,uBAZF,cAaI,WACA,MACA,OACA,SACA,gBACA,gBACA,YACA,6BAGF,cACE,eACA,kCAGF,YACE,oBACA,2BACA,iBACA,oCAGF,YACE,oBACA,uBACA,iBACA,mCAGF,YACE,oBACA,yBACA,iBACA,+BAGF,aACE,aACA,mCAEA,aACE,YACA,WACA,kBACA,YACA,UFxUA,qCE2UA,kCARF,WASI,+GAIJ,kBAGE,kCAIJ,YACE,mBACA,eACA,eACA,gBACA,qBACA,cF7UkB,mBE+UlB,kBACA,uHAEA,yBAGE,WFrWA,qCEyWF,0CACE,YACE,qCAKN,kBACE,CACA,oBACA,kBACA,6HAEA,oBAGE,mBACA,sBAON,YACE,cACA,0DACA,sBACA,mCACA,CADA,0BACA,gCAEA,UACE,cACA,gCAGF,UACE,cACA,qCAGF,qBAjBF,0BAkBI,WACA,gCAEA,YACE,kCAKN,iBACE,qCAEA,gCAHF,eAII,sCAKF,4BADF,eAEI,wCAIJ,eACE,mBACA,mCACA,gDAEA,UACE,qIAEA,8BAEE,CAFF,sBAEE,6DAGF,wBFtaoB,8CE2atB,yBACE,gBACA,aACA,kBACA,gBACA,oDAEA,UACE,cACA,kBACA,WACA,YACA,gDACA,MACA,OACA,kDAGF,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,0BACA,qCAGF,6CA3BF,YA4BI,gDAIJ,eACE,6JAEA,iBAEE,qCAEA,4JAJF,eAKI,sCAKN,sCA/DF,eAgEI,gBACA,oDAEA,YACE,+FAGF,eAEE,6CAIJ,iBACE,iBACA,aACA,2BACA,mDAEA,UACE,cACA,mBACA,kBACA,SACA,OACA,QACA,YACA,0BACA,WACA,oDAGF,aACE,YACA,aACA,kBACA,cACA,wDAEA,aACE,WACA,YACA,SACA,kBACA,yBACA,mBACA,qCAIJ,2CArCF,YAsCI,mBACA,0BACA,YACA,mDAEA,YACE,oDAGF,UACE,YACA,CACA,sBACA,wDAEA,QACE,kBACA,2DAGF,mDAXF,YAYI,sCAKN,2CAhEF,eAiEI,sCAGF,2CApEF,cAqEI,8CAIJ,aACE,iBACA,mDAEA,gBACE,mBACA,sDAEA,cACE,iBACA,WF1kBF,gBE4kBE,gBACA,mBACA,uBACA,6BACA,4DAEA,aACE,eACA,WFplBJ,gBEslBI,gBACA,uBACA,qCAKN,4CA7BF,gBA8BI,aACA,8BACA,mBACA,mDAEA,aACE,iBACA,sDAEA,cACE,iBACA,iBACA,4DAEA,aF5lBY,oDEmmBlB,YACE,2BACA,oBACA,YACA,qEAEA,YACE,mBACA,gBACA,qCAGF,oEACE,YACE,6DAIJ,eACE,sBACA,cACA,cFxnBc,aE0nBd,+BACA,eACA,kBACA,kBACA,8DAEA,aACE,uEAGF,cACE,kEAGF,aACE,WACA,kBACA,SACA,OACA,WACA,gCACA,WACA,wBACA,yEAIA,+BACE,UACA,kFAGF,2BFzpBc,wEE+pBd,SACE,wBACA,8DAIJ,oBACE,cACA,2EAGF,cACE,cACA,4EAGF,eACE,eACA,kBACA,WFnsBJ,6CEqsBI,2DAIJ,aACE,WACA,4DAGF,eACE,8CAKN,YACE,eACA,kEAEA,eACE,gBACA,uBACA,cACA,2FAEA,4BACE,yEAGF,YACE,qDAIJ,gBACE,eACA,cFztBgB,uDE4tBhB,oBACE,cF7tBc,qBE+tBd,aACA,gBACA,8DAEA,eACE,WFpvBJ,qCE0vBF,6CAtCF,aAuCI,UACA,4CAKN,yBACE,qCAEA,0CAHF,eAII,wCAIJ,eACE,oCAGF,kBACE,mCACA,kBACA,gBACA,mBACA,qCAEA,mCAPF,eAQI,gBACA,gBACA,8DAGF,QACE,aACA,+DAEA,aACE,sFAGF,uBACE,yEAGF,aFryBU,8DE2yBV,mBACA,WF7yBE,qFEizBJ,YAEE,eACA,cFpyBkB,2CEwyBpB,gBACE,iCAIJ,YACE,cACA,kDACA,qCAEA,gCALF,aAMI,+CAGF,cACE,iCAIJ,eACE,2BAGF,YACE,eACA,eACA,cACA,+BAEA,qBACE,cACA,YACA,cACA,mBACA,kBACA,qCAEA,8BARF,aASI,sCAGF,8BAZF,cAaI,sCAIJ,0BAvBF,QAwBI,6BACA,+BAEA,UACE,UACA,gBACA,gCACA,0CAEA,eACE,0CAGF,kBF32BK,+IE82BH,kBAGE,WC53BZ,eACE,aAEA,oBACE,aACA,iBAIJ,eACE,cACA,oBAEA,cACE,gBACA,mBACA,wBCfF,eACE,iBACA,oBACA,eACA,cACA,qCAEA,uBAPF,iBAQI,mBACA,+BAGF,YACE,cACA,0CACA,wCAEA,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,kBACA,6CAEA,aACE,wCAIJ,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,qCAGF,6BAxCF,iCAyCI,+EAEA,aAEE,wCAGF,UACE,wCAGF,aACE,+EAGF,aAEE,wCAGF,UACE,sCAIJ,uCACE,aACE,sCAIJ,4JACE,YAIE,4BAKN,wBACE,gBACA,kBACA,cJhFkB,6BImFlB,aACE,qBACA,6BAIJ,oBACE,cACA,wGAEA,yBAGE,mCAKF,aACE,YACA,WACA,cACA,aACA,0HAMA,YACE,oBClIR,cACE,iBACA,cLeoB,gBKbpB,mBACA,eACA,qBACA,qCAEA,mBATF,iBAUI,oBACA,uBAGF,aACE,qBACA,0BAGF,eACE,cLFoB,wBKMtB,oBACE,mBACA,kBACA,WACA,YACA,cC9BN,kBACE,mCACA,mBAEA,UACE,kBACA,gBACA,0BACA,gBNPI,uBMUJ,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,0BACA,oBAIJ,kBNVW,aMYT,0BACA,eACA,cNPoB,iBMSpB,qBACA,gBACA,8BAEA,UACE,YACA,gBACA,sBAGF,kBACE,iCAEA,eACE,uBAIJ,cACE,SACA,UACA,gBACA,uBACA,oBACA,kBACA,oBACA,cACA,sBAGF,aNtCsB,qBMwCpB,4BAEA,yBACE,qCAKN,aAnEF,YAoEI,uBAIJ,kBACE,oBACA,yBAEA,YACE,yBACA,gBACA,eACA,cN9DoB,+BMkEtB,cACE,0CAEA,eACE,sDAGF,YACE,mBACA,gDAGF,UACE,YACA,0BACA,oCAIJ,YACE,mBAKF,aN3FsB,aMgGxB,YACE,kBACA,mBNzGW,mCM2GX,qBAGF,YACE,kBACA,0BACA,kBACA,cN3GsB,mBM6GtB,iBAGF,eACE,eACA,cNlHsB,iBMoHtB,qBACA,gBACA,UACA,oBAEA,YACE,yBACA,gBACA,eACA,cN7HoB,0BMiItB,eACE,CACA,kBACA,mBAGF,oBACE,CACA,mBACA,cN1IoB,qBM4IpB,mBACA,gBACA,uBACA,0EAEA,yBAGE,uBAMJ,sBACA,kBACA,mBNnKW,mCMqKX,cN7JwB,gBM+JxB,mBACA,sDAEA,eAEE,CAII,qXADF,eACE,yBAKN,aACE,0BACA,CAMI,wLAGF,oBAGE,mIAEA,yBACE,gCAMR,kBACE,oCAEA,gBACE,cNzMkB,8DM+MpB,iBACE,eACA,4DAGF,eACE,qBACA,iEAEA,eACE,kBAMR,YACE,CACA,eNlPM,CMoPN,cACA,cNpOsB,mBMsOtB,+BANA,iBACA,CNlPM,kCMgQN,CATA,aAGF,kBACE,CAEA,iBACA,kBACA,cACA,iBAEA,UNjQM,eMmQJ,gBACA,gBACA,mBACA,gBAGF,cACE,cN1PoB,qCM8PtB,aArBF,YAsBI,mBACA,iBAEA,cACE,aAKN,kBN/Qa,kBMiRX,mCACA,iBAEA,qBACE,mBACA,uCAEA,YAEE,mBACA,8BACA,mBN5RO,kBM8RP,aACA,qBACA,cACA,mCACA,0EAIA,kBAGE,0BAIJ,kBNpSsB,eMsSpB,8BAGF,UACE,eACA,oBAGF,aACE,eACA,gBACA,WNnUE,mBMqUF,gBACA,uBACA,wBAEA,aNzTkB,0BM6TlB,aACE,gBACA,eACA,eACA,cNjUgB,0IMuUlB,UNvVE,+BM+VJ,aACE,YACA,uDAGF,oBNlVsB,wCMsVtB,eACE,eAKN,YACE,yBACA,gCAEA,aACE,WACA,YACA,kBACA,kBACA,kBACA,mBACA,yBACA,4CAEA,SACE,6CAGF,SACE,6CAGF,SACE,iBAKN,UACE,0BAEA,SACE,SACA,wBAGF,eACE,0BAGF,iBACE,yBACA,cNxYoB,gBM0YpB,aACA,sCAEA,eACE,0BAIJ,cACE,sBACA,gCACA,wCAGF,eACE,wBAGF,WACE,kBACA,eACA,gBACA,WNhbI,8BMmbJ,aACE,cNpakB,gBMsalB,eACA,0BAIJ,SACE,iCACA,qCAGF,kCACE,YACE,sCAYJ,qIAPF,eAQI,gBACA,gBACA,iBAOJ,gBACE,qCAEA,eAHF,oBAII,uBAGF,sBACE,sCAEA,qBAHF,sBAII,sCAGF,qBAPF,UAQI,sCAGF,qBAXF,WAYI,kCAIJ,iBACE,qCAEA,gCAHF,4BAII,iEAIA,eACE,0DAGF,cACE,iBACA,oEAEA,UACE,YACA,gBACA,yFAGF,gBACE,SACA,mKAIJ,eAGE,gBAON,aNrgBsB,iCMogBxB,kBAKI,6BAEA,eACE,kBAIJ,cACE,iBACA,wCAMF,oBACE,gBACA,cNxhBsB,4JM2hBtB,yBAGE,oBAKN,kBACE,gBACA,eACA,kBACA,yBAEA,aACE,gBACA,aACA,CACA,kBACA,gBACA,uBACA,qBACA,WNnkBI,gCMqkBJ,4FAEA,yBAGE,oCAIJ,eACE,0BAGF,iBACE,gCACA,MCplBJ,+CACE,gBACA,iBAGF,eACE,aACA,cACA,qBAIA,kBACE,gBACA,4BAEA,QACE,0CAIA,kBACE,qDAEA,eACE,gDAIJ,iBACE,kBACA,sDAEA,iBACE,SACA,OACA,6BAKN,iBACE,gBACA,gDAEA,mBACE,eACA,gBACA,WPhDA,cOkDA,WACA,4EAGF,iBAEE,mDAGF,eACE,4CAGF,iBACE,QACA,OACA,qCAGF,aPnDoB,0BOqDlB,gIAEA,oBAGE,0CAIJ,iBACE,CACA,iBACA,mBAKN,YACE,cACA,0BAEA,qBACE,cACA,UACA,cACA,oBAIJ,aPpFsB,sBOuFpB,aPrFsB,yBOyFtB,iBACE,kBACA,gBACA,uBAGF,eACE,iBACA,sBAIJ,kBACE,wBAGF,aACE,eACA,eACA,qBAGF,kBACE,cPlHoB,iCOqHpB,iBACE,eACA,iBACA,gBACA,gBACA,oBAIJ,kBACE,qBAGF,eACE,CAII,0JADF,eACE,sDAMJ,YACE,4DAEA,mBACE,eACA,WPlKA,gBOoKA,gBACA,cACA,wHAGF,aAEE,sDAIJ,cACE,kBACA,mDAKF,mBACE,eACA,WPxLE,cO0LF,kBACA,qBACA,gBACA,sCAGF,cACE,mCAGF,UACE,sCAIJ,cACE,4CAEA,mBACE,eACA,WP9ME,cOgNF,gBACA,gBACA,4CAGF,kBACE,yCAGF,cACE,CADF,cACE,kDAIJ,oBACE,WACA,OACA,6BAGF,oBACE,cACA,4BAGF,kBACE,8CAEA,eACE,0BAIJ,YACE,CACA,eACA,oBACA,iCAEA,cACE,kCAGF,qBACE,eACA,cACA,eACA,oCAEA,aACE,2CAGF,eACE,6GAIJ,eAEE,qCAGF,yBA9BF,aA+BI,gBACA,kCAEA,cACE,0JAGF,kBAGE,iDAKN,iBACE,oBACA,eACA,WPlSI,cOoSJ,WACA,2CAKE,mBACE,eACA,WP5SA,qBO8SA,WACA,kBACA,gBACA,kBACA,cACA,0DAGF,iBACE,OACA,QACA,SACA,kDAKN,cACE,aACA,yBACA,kBACA,sJAGF,qBAKE,eACA,WP5UI,cO8UJ,WACA,UACA,oBACA,gBACA,mBACA,sBACA,kBACA,aACA,6RAEA,aACE,CAHF,+OAEA,aACE,CAHF,mQAEA,aACE,CAHF,sNAEA,aACE,8LAGF,eACE,oVAGF,oBACE,iOAGF,oBPnWY,oLOuWZ,iBACE,4WAGF,oBP1VsB,mBO6VpB,6CAKF,aACE,gUAGF,oBAME,8CAGF,aACE,gBACA,cACA,eACA,8BAIJ,UACE,uBAGF,eACE,aACA,oCAEA,YACE,mBACA,qEAIJ,aAGE,WACA,SACA,kBACA,mBP3YsB,WAlBlB,eOgaJ,oBACA,YACA,aACA,yBACA,qBACA,kBACA,sBACA,eACA,gBACA,UACA,mBACA,kBACA,sGAEA,cACE,uFAGF,wBACE,gLAGF,wBAEE,kHAGF,wBP3aoB,gGO+apB,kBP7bQ,kHOgcN,wBACE,sOAGF,wBAEE,qBAKN,uBACE,CADF,oBACE,CADF,eACE,sBACA,eACA,WPhdI,cOkdJ,WACA,UACA,oBACA,gBACA,wXACA,sBACA,kBACA,kBACA,mBACA,YACA,iBAGF,4BACE,oCAIA,iBACE,mCAGF,iBACE,UACA,QACA,CACA,qBACA,eACA,cPhdkB,oBOkdlB,oBACA,eACA,gBACA,mBACA,gBACA,yCAEA,UACE,cACA,kBACA,MACA,QACA,WACA,UACA,8DACA,4BAKN,iBACE,0CAEA,wBACE,CADF,gBACE,qCAGF,iBACE,MACA,OACA,WACA,YACA,aACA,uBACA,mBACA,8BACA,kBACA,iBACA,gBACA,YACA,8CAEA,iBACE,6HAGE,UP9hBF,aOwiBR,aACE,CACA,kBACA,eACA,gBAGF,kBACE,cPhiBsB,kBOkiBtB,kBACA,mBACA,kBACA,uBAEA,qCACE,iCACA,cPxjBY,sBO4jBd,mCACE,+BACA,cP7jBQ,kBOikBV,oBACE,cPpjBoB,qBOsjBpB,wBAEA,UPxkBI,0BO0kBF,kBAIJ,kBACE,4BAGF,SACE,sBACA,cACA,WACA,SACA,aACA,gDACA,mBPhlBS,WATL,eO4lBJ,SACA,8CAEA,QACE,iHAGF,mBAGE,kCAGF,kBACE,uBAIJ,eACE,CAII,oKADF,eACE,0DAKN,eAzEF,eA0EI,eAIJ,eACE,kBACA,gBAEA,aPjnBsB,qBOmnBpB,sBAEA,yBACE,YAKN,eACE,mBACA,eACA,eAEA,oBACE,kBACA,cAGF,aPnoBwB,yBOqoBtB,qBACA,gBACA,2DAEA,aAGE,8BAKN,kBAEE,cPrpBsB,oCOwpBtB,cACE,mBACA,kBACA,4CAGF,aP7pBwB,gBO+pBtB,CAII,mUADF,eACE,0DAKN,6BAtBF,eAuBI,cAIJ,YACE,eACA,uBACA,UAGF,aACE,gBPrsBM,YOusBN,qBACA,mCACA,qBACA,cAEA,aACE,SACA,iBAIJ,kBACE,cPlsBwB,WOosBxB,sBAEA,aACE,eACA,eAKF,kBACE,sBAEA,eACE,CAII,+JADF,eACE,4CASR,qBACE,8BACA,WPjvBI,qCOmvBJ,oCACA,kBACA,aACA,mBACA,gDAEA,UPzvBI,0BO2vBF,oLAEA,oBAGE,0DAIJ,eACE,cACA,kBACA,CAII,yYADF,eACE,kEAIJ,eACE,oBAMR,YACE,eACA,mBACA,4DAEA,aAEE,6BAIA,wBACA,cACA,sBAIJ,iBACE,cPxxBsB,0BO2xBtB,iBACE,oBAIJ,eACE,mBACA,uBAEA,cACE,WPrzBI,kBOuzBJ,mBACA,SACA,UACA,4BAGF,aACE,eAIJ,aP/zBc,0SOy0BZ,+CACE,aAIJ,kBACE,sBACA,kBACA,aACA,mBACA,kBACA,kBACA,QACA,mCACA,sBAEA,aACE,8BAGF,sBACE,SACA,aACA,eACA,gDACA,oBAGF,aACE,WACA,oBACA,gBACA,eACA,CACA,oBACA,WACA,iCACA,oBAGF,oBPn3Bc,gBOq3BZ,2BAEA,kBPv3BY,gBOy3BV,oBAKN,kBACE,6BAEA,wBACE,mBACA,eACA,aACA,4BAGF,kBACE,aACA,OACA,sBACA,cACA,cACA,gCAEA,iBACE,YACA,iBACA,kBACA,UACA,8BAGF,qBACE,qCAIJ,kBACE,gCAGF,wBACE,mCACA,kBACA,kBACA,kBACA,kBACA,sCAEA,wBACE,WACA,cACA,YACA,SACA,kBACA,MACA,UACA,yBAIJ,sBACE,aACA,mBACA,SC17BF,aACE,qBACA,cACA,mCACA,qCAEA,QANF,eAOI,8EAMA,kBACE,YAKN,YACE,kBACA,gBACA,0BACA,gBAEA,aACE,WACA,YACA,SACA,oBACA,CADA,8BACA,CADA,gBACA,0BACA,qCAGF,WAfF,YAgBI,sCAGF,WAnBF,YAoBI,aAIJ,iBACE,aACA,aACA,2BACA,mBACA,mBACA,0BACA,qCAEA,WATF,eAUI,qBAGF,aACE,WACA,YACA,gBACA,wBAEA,UACE,YACA,cACA,SACA,kBACA,mBACA,oBACA,CADA,8BACA,CADA,gBACA,0BAIJ,gBACE,gBACA,iCAEA,cACE,WR7EA,gBQ+EA,gBACA,uBACA,+BAGF,aACE,eACA,cRtEgB,gBQwEhB,gBACA,uBACA,aAMR,cACE,kBACA,gBACA,6GAEA,cAME,WR3GI,gBQ6GJ,qBACA,iBACA,qBACA,sBAGF,eRnHM,oBQqHJ,cR5GS,eQ8GT,cACA,kBAGF,cACE,uCAGF,wBAEE,cRhHsB,oBQoHxB,UACE,eACA,wBAEA,oBACE,iBACA,oBAIJ,WACE,gBACA,wBAEA,oBACE,gBACA,uBAIJ,cACE,cACA,qCAGF,YA9DF,iBA+DI,mBAEA,YACE,uCAGF,oBAEE,gBAKN,kBRnKa,mCQqKX,cR9JsB,eQgKtB,gBACA,kBACA,aACA,uBACA,mBACA,eACA,kBACA,aACA,gBACA,2BAEA,yBACE,yBAGF,qBACE,gBACA,yCAIJ,oBAEE,gBACA,eACA,kBACA,eACA,iBACA,gBACA,cR5LwB,sCQ8LxB,sCACA,6DAEA,aRjNc,sCQmNZ,kCACA,qDAGF,aACE,sCACA,kCACA,0BAIJ,eACE,UACA,wBACA,gBACA,CADA,YACA,CACA,iCACA,CADA,uBACA,CADA,kBACA,eACA,iBACA,6BAEA,YACE,gCACA,yDAGF,qBAEE,aACA,kBACA,gBACA,gBACA,mBACA,uBACA,6BAGF,eACE,YACA,cACA,cR3OsB,0BQ6OtB,6BAGF,aACE,cRlPoB,4BQsPtB,aRpPwB,qBQsPtB,qGAEA,yBAGE,oCAIJ,qCACE,iCACA,sCAEA,aRpRY,gBQsRV,0CAGF,aRzRY,wCQ8Rd,eACE,wCAIJ,UACE,0BAIA,aRzRsB,4BQ4RpB,aR3RsB,qBQ6RpB,qGAEA,yBAGE,iCAIJ,URvTI,gBQyTF,wBAIJ,eACE,kBChUJ,kCACE,kBACA,gBACA,mBACA,8BAEA,yBACE,qCAGF,iBAVF,eAWI,gBACA,gBACA,6BAGF,eACE,SACA,gBACA,gFAEA,yBAEE,sCAIJ,UACE,yBAGF,kBTpBW,6GSuBT,sBAGE,CAHF,cAGE,8IAIA,eAGE,0BACA,iJAKF,yBAGE,kLAIA,iBAGE,qCAKN,4GACE,yBAGE,uCAKN,kBACE,qBAIJ,WACE,eACA,mBT7DwB,WAlBlB,oBSkFN,iBACA,YACA,iBACA,SACA,yBAEA,UACE,YACA,sBACA,iBACA,UT5FI,gFSgGN,kBAGE,qNAKA,kBTxFoB,4ISgGpB,kBT9GQ,qCSqHV,wBACE,YACE,0DAOJ,YACE,uCAGF,2BACE,gBACA,uDAEA,SACE,SACA,yDAGF,eACE,yDAGF,gBACE,iBACA,mFAGF,UACE,qMAGF,eAGE,iCC/JN,u+KACE,uCAEA,u+KACE,0CAIJ,u+KACE,WCTF,gCACE,4CACA,kBAGF,mBACE,sBACA,oBACA,gBACA,kBACA,cAGF,aACE,eACA,iBACA,cXIwB,SWFxB,uBACA,UACA,eACA,wCAEA,yBAEE,uBAGF,aXVsB,eWYpB,SAIJ,wBXd0B,YWgBxB,kBACA,sBACA,WXpCM,eWsCN,qBACA,oBACA,eACA,gBACA,YACA,iBACA,iBACA,gBACA,eACA,kBACA,kBACA,yBACA,qBACA,uBACA,2BACA,mBACA,WACA,4CAEA,wBAGE,4BACA,sBAGF,eACE,mFAEA,wBXjEQ,gBWqEN,mCAIJ,wBX3DsB,eW8DpB,2BAGF,QACE,wDAGF,mBAGE,yGAGF,cAIE,iBACA,YACA,oBACA,iBACA,4BAGF,aX7FW,mBAOW,qGW0FpB,wBAGE,8BAIJ,kBXnFsB,2GWsFpB,wBAGE,0BAIJ,aX3GsB,uBW6GpB,iBACA,yBACA,+FAEA,oBAGE,cACA,mCAGF,UACE,uBAIJ,aACE,WACA,kBAIJ,YACE,cACA,kBACA,cAGF,oBACE,UACA,cX7HsB,SW+HtB,kBACA,uBACA,eACA,2BACA,2CACA,2DAEA,aAGE,qCACA,4BACA,2CACA,oBAGF,mCACE,uBAGF,aACE,6BACA,eACA,qBAGF,aXrKwB,gCWyKxB,QACE,uEAGF,mBAGE,uBAGF,aXvKsB,sFW0KpB,aAGE,qCACA,6BAGF,mCACE,gCAGF,aACE,6BACA,8BAGF,aXtMsB,uCWyMpB,aACE,wBAKN,sBACE,0BACA,yBACA,kBACA,YACA,8BAEA,yBACE,mBAKN,aXhNwB,SWkNtB,kBACA,uBACA,eACA,gBACA,eACA,cACA,iBACA,UACA,2BACA,2CACA,0EAEA,aAGE,qCACA,4BACA,2CACA,yBAGF,mCACE,4BAGF,aACE,6BACA,eACA,0BAGF,aX7PwB,qCWiQxB,QACE,sFAGF,mBAGE,CAKF,0BADF,iBAUE,CATA,WAGF,WACE,cACA,qBACA,QACA,SAEA,+BAEA,kBAEE,mBACA,oBACA,kBACA,mBACA,iBAKF,WACE,eAIJ,YACE,iCAGE,mBACA,eAEA,gBACA,wCAEA,aXlTsB,sDWsTtB,YACE,2CAGF,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,kDAEA,oBXvUoB,yDW8UxB,aXvVW,mBWyVT,mBXlVoB,oCWoVpB,iBACA,kBACA,eACA,gBACA,6CAEA,aXjWS,gBWmWP,CAII,kRADF,eACE,wCAKN,aXvVoB,gBWyVlB,0BACA,yIAEA,oBAGE,sCAKN,iBACE,MACA,QACA,kDAGF,iBACE,mGAGF,iBAGE,WACA,8BAGF,QACE,wBACA,UACA,qDAEA,WACE,mBACA,UACA,mFAIJ,aAEE,sBACA,WACA,SACA,cX3ZS,gBATL,aWuaJ,oBACA,eACA,gBACA,SACA,UACA,yIAEA,aXhZoB,CW8YpB,sHAEA,aXhZoB,CW8YpB,8HAEA,aXhZoB,CW8YpB,4GAEA,aXhZoB,+FWoZpB,SACE,qCAGF,kFAvBF,cAwBI,sCAIJ,iBACE,+CAGF,gBACE,0BACA,iBACA,mBACA,YACA,qBACA,kEAEA,SACE,qCAGF,8CAZF,sBAaI,gBACA,2DAIJ,iBACE,SACA,kDAGF,qBACE,aACA,kBACA,SACA,WACA,WACA,sCACA,mBX5csB,0BW8ctB,cXtdS,eWwdT,YACA,6FAEA,aACE,wDAIJ,YACE,eACA,kBACA,yPAEA,kBAIE,wGAIJ,YAGE,mBACA,mBACA,2BACA,iBACA,eACA,oCAGF,6BACE,0CAEA,aACE,gBACA,uBACA,mBACA,2CAGF,eACE,0CAGF,aACE,iBACA,gBACA,uBACA,mBACA,8EAIJ,aAEE,iBACA,WACA,YACA,2DAGF,aXlgBsB,wCWsgBtB,aX3hBW,oBW6hBT,eACA,gBXviBI,sEW0iBJ,eACE,uEAGF,YACE,mBACA,YACA,eACA,8DAGF,UACE,cACA,WACA,uEAEA,iFACE,aACA,uBACA,8BACA,UACA,4BACA,oFAEA,aACE,cXljBgB,eWojBhB,gBACA,aACA,oBACA,6QAEA,aAGE,8EAIJ,SACE,0EAIJ,iBACE,UACA,SACA,OACA,QACA,sBACA,gFACA,aACA,UACA,4BACA,mFAEA,sBACE,cXllBgB,SWolBhB,UACA,SACA,WACA,oBACA,eACA,gBACA,yFAEA,UX7mBF,8GWinBE,WACE,cXjmBc,CAjBlB,oGWinBE,WACE,cXjmBc,CAjBlB,wGWinBE,WACE,cXjmBc,CAjBlB,+FWinBE,WACE,cXjmBc,iFWsmBlB,SACE,wEAKN,iBACE,sBX/nBE,wBWioBF,sBACA,4BACA,aACA,WACA,gBACA,8CAIJ,YACE,mBACA,0BACA,aACA,8BACA,cACA,qEAEA,YACE,uGAEA,gBACE,qGAGF,YACE,6IAEA,aACE,2IAGF,gBACE,0HAKN,sBAEE,cACA,0EAGF,iBACE,iBACA,sCAIJ,YACE,yBACA,YACA,cACA,4EAEA,eACE,iBACA,oBAKN,cACE,kDACA,eACA,gBACA,cXpqBsB,4CWuqBtB,aXlsBY,kCWusBd,2CACE,WC7sBF,8DDktBE,sBACA,CADA,kBACA,wBACA,WACA,YACA,eAEA,UACE,kBAIJ,iBACE,mBACA,mBX7sBsB,aW+sBtB,gBACA,gBACA,cACA,0BAGF,iBACE,gBACA,0BAGF,WACE,iBACA,gCAGF,aXtuBa,cWwuBX,eACA,iBACA,gBACA,mBACA,qBACA,kCAGF,UACE,iBACA,+BAGF,cACE,4CAGF,iBAEE,eACA,iBACA,qBACA,gBACA,gBACA,uBACA,gBACA,WX3wBM,wDW8wBN,SACE,wGAGF,kBACE,sJAEA,oBACE,gEAIJ,UACE,YACA,gBACA,oDAGF,cACE,iBACA,sBACA,CADA,gCACA,CADA,kBACA,gDAGF,kBACE,qBACA,sEAEA,eACE,gDAIJ,aXnyBc,qBWqyBZ,4DAEA,yBACE,oEAEA,aACE,4EAKF,oBACE,sFAEA,yBACE,wDAKN,aXvyBoB,8EW4yBtB,aACE,0GAGF,kBXhzBsB,sHWmzBpB,kBACE,qBACA,8IAGF,QACE,0XAGF,mBAGE,0FAIJ,YACE,wJAEA,aACE,+BAKN,oBACE,gBACA,yCAEA,UACE,YACA,gBACA,iCAGF,kBACE,qBACA,4CAEA,eACE,iCAIJ,aX52BwB,qBW82BtB,uCAEA,yBACE,+CAIA,oBACE,oDAEA,yBACE,gDAKN,aACE,6CAKN,gBACE,oCAGF,aACE,eACA,iBACA,cACA,SACA,uBACA,CACA,eACA,qBACA,oFAEA,yBAEE,gCAIJ,oBACE,kBACA,uBACA,SACA,cXr6BW,gBWu6BX,eACA,cACA,yBACA,iBACA,eACA,sBACA,4BAGF,aX35BwB,SW65BtB,kBACA,kBACA,oBACA,SACA,aACA,sBACA,WACA,WACA,gCACA,+BAGF,UACE,kBACA,kBAIA,SACE,mBACA,wCAEA,kBACE,8CAEA,sBACE,iFAIJ,kBAEE,SAMJ,yBACA,kBACA,gBACA,gCACA,eACA,UAaA,mCACA,CADA,0BACA,wDAZA,QARF,kBAWI,0BAGF,GACE,aACA,WALA,gBAGF,GACE,aACA,uDAMF,cAEE,kCAGF,kBACE,4BACA,sCAIA,aXj/BoB,qCWq/BpB,aX5/BS,6BWggCT,aXz/BoB,CAPX,kEWwgCT,aXxgCS,kCW2gCP,aXlgCoB,gEWsgCpB,UXxhCE,mBAgBgB,sEW4gChB,kBACE,+CAQR,sBACE,qEAEA,aACE,qDAKN,aXhhCwB,YWmhCtB,eACA,uBAGF,aXvhCwB,qCW2hCxB,aACE,eACA,mBACA,eAGF,cACE,mBAGF,+BACE,aACA,6CAEA,uBACE,OACA,gBACA,4DAEA,eACE,8DAGF,SACE,mBACA,qHAGF,cAEE,gBACA,4EAGF,cACE,0BAKN,kBACE,aACA,cACA,uBACA,aACA,kBAGF,gBACE,cX5kCsB,CW8kCtB,iBACA,eACA,kBACA,+CAEA,aXnlCsB,uBWulCtB,aACE,gBACA,uBACA,qBAIJ,kBACE,aACA,eACA,8BAEA,mBACE,kBACA,mBACA,yDAEA,gBACE,qCAGF,oBACE,WACA,eACA,gBACA,cXhnCkB,4BWsnCxB,iBACE,8BAGF,cACE,cACA,uCAGF,aACE,aACA,mBACA,uBACA,kBACA,kBAGF,kBACE,kBACA,wBAEA,YACE,eACA,8BACA,uBACA,uFAEA,SAEE,mCAIJ,cACE,iBACA,6CAEA,UACE,YACA,gBACA,kEAGF,gBACE,gBACA,+DAIJ,cAEE,wBAIJ,eACE,cX9qCsB,eWgrCtB,iBACA,8BAGF,kBACE,6BACA,gCACA,aACA,mBACA,eACA,wBAGF,aACE,qBACA,uDAGF,oBAEE,gBACA,eACA,gBACA,2BAGF,aX/tCa,eWiuCX,6BAEA,aX9sCsB,SWmtCxB,YACE,gCACA,8BAEA,aACE,cACA,WXvvCI,qBWyvCJ,eACA,gBACA,kBAIJ,YACE,iBAGF,WACE,aACA,mBACA,UAGF,YACE,gCACA,kBAEA,SACE,gBACA,2CAEA,aACE,iCAIJ,aACE,cACA,cXxwCoB,gBW0wCpB,qBACA,eACA,mBAIJ,YACE,0BAGF,UACE,iBACA,kBACA,kBAGF,iBE3yCE,iCACA,wBACA,4BACA,kBF0yCA,yBAEA,oBACE,sBACA,iBACA,4BAGF,iBErzCA,iCACA,wBACA,4BACA,kBFozCE,gBACA,kBACA,gCAEA,UACE,kBACA,sBACA,mCAGF,aACE,kBACA,QACA,SACA,+BACA,WXr0CE,6BWu0CF,gBACA,eACA,oBAKN,cACE,0BAGF,UACuB,sCE30CrB,+BF60CA,iBEt1CA,iCACA,wBACA,4BACA,WFq1CuB,sCE/0CvB,kCFk1CA,iBE31CA,iCACA,wBACA,4BACA,WF01CuB,sCEp1CvB,kBFs1CE,SACA,QACA,UACA,wBAIJ,WACE,aACA,mBACA,sBAGF,YACE,6BACA,cX/0CsB,6BWk1CtB,eACE,CAII,kMADF,eACE,wBAKN,eACE,cACA,0BACA,yFAEA,oBAGE,sBAKN,4BACE,gCACA,iBACA,gBACA,cACA,aACA,+BAGF,YACE,4CAEA,qBACE,oFAIA,QACE,WACA,uDAGF,WACE,iBACA,gBACA,WACA,4BAKN,YACE,cACA,iBACA,kBACA,2BAGF,oBACE,gBACA,cACA,+BACA,eACA,oCACA,kCAEA,+BACE,gCAGF,aACE,yBACA,eACA,cX56CoB,kCWg7CtB,aACE,eACA,gBACA,WXn8CI,CWw8CA,2NADF,eACE,oBAMR,iBACE,mDAEA,aACE,mBACA,gBACA,4BAIJ,UACE,kBACA,6JAGF,oBAME,4DAKA,UXx+CM,kBW8+CN,UACE,iKAQF,yBACE,+BAIJ,aACE,gBACA,uBACA,0DAGF,aAEE,sCAGF,kBACE,gCAGF,aX1/C0B,cW4/CxB,iBACA,mBACA,gBACA,2EAEA,aAEE,uBACA,gBACA,uCAGF,cACE,WX1hDI,kCW+hDR,UACE,kBACA,iBAGF,WACE,UACA,kBACA,SACA,WACA,iBAGF,UACE,kBACA,OACA,MACA,YACA,eACA,CXphDsB,gHW8hDtB,aX9hDsB,wBWkiDtB,UACE,wCAGF,kBXtiDsB,cArBX,8CW+jDT,kBACE,qBACA,wBAKN,oBACE,gBACA,eACA,cXlkDsB,eWokDtB,iBACA,kBACA,4BAEA,aXtkDwB,6BW0kDxB,cACE,gBACA,uBACA,uCAIJ,UACE,kBACA,CXjmDU,mEWwmDZ,aXxmDY,uBW4mDZ,aX7mDc,4DWmnDV,4CACE,CADF,oCACE,8DAKF,6CACE,CADF,qCACE,6BAKN,aACE,gBACA,qBACA,mCAEA,UXvoDM,0BWyoDJ,8BAIJ,WACE,eAGF,aACE,eACA,gBACA,uBACA,mBACA,qBAGF,eACE,wBAGF,cACE,+DAKA,yBACE,eAIJ,iBACE,WACA,YACA,aACA,mBACA,uBACA,sBACA,6CAEA,cX9nD4B,eAEC,0DW+nD3B,sBACA,CADA,gCACA,CADA,kBACA,4BAGF,iBACE,qEAGF,YACE,iBAIJ,iBACE,WACA,YACA,aACA,mBACA,uBACA,qBAEA,cXtpD4B,eAEC,WWupD3B,YACA,sBACA,CADA,gCACA,CADA,kBACA,iBAIJ,YACE,aACA,mBACA,cACA,eACA,cXvsDsB,wBW0sDtB,aXzsDwB,mBW6sDxB,aACE,4BAGF,oBACE,0CAGF,iBACE,6DAEA,iBACE,oBACA,qCACA,UACA,4EAGF,mBACE,gCACA,UACA,0BAKN,aACE,gBACA,iBACA,gBACA,gBACA,kCAGF,aACE,gBACA,gBACA,uBACA,+BAGF,aACE,qBACA,WAGF,oBACE,oBAGF,YACE,kBACA,2BAGF,+BACE,mBACA,SACA,gBAGF,kBX1wD0B,cW4wDxB,kBACA,uCACA,aACA,mBAEA,eACE,qBAGF,yBACE,oBAGF,yBACE,uBAGF,sBACE,sBAGF,sBACE,uBAIJ,iBACE,QACA,SACA,2BACA,4BAEA,UACE,gBACA,2BACA,0BX/yDsB,2BWmzDxB,WACE,iBACA,uBACA,yBXtzDsB,8BW0zDxB,QACE,iBACA,uBACA,4BX7zDsB,6BWi0DxB,SACE,gBACA,2BACA,2BXp0DsB,wBW00DxB,cACE,iBACA,cACA,iBACA,sBACA,qBACA,mBXh1DsB,cARb,gBW21DT,uBACA,mBACA,yFAEA,kBXt1DsB,cADA,UW41DpB,sCAKN,aACE,iBACA,gBACA,QACA,gBACA,aACA,yCAEA,eACE,mBX12DsB,cW42DtB,kBACA,mCACA,gBACA,kBACA,sDAGF,OACE,wDAIA,UACE,8CAIJ,cACE,iBACA,cACA,iBACA,sBACA,qBACA,mBXn4DsB,cARb,gBW84DT,uBACA,mBACA,oDAEA,SACE,oDAGF,kBX74DsB,cADA,iBWq5D1B,qBACE,eAGF,YACE,cACA,mBACA,2BACA,gBACA,kBACA,4BAEA,iBACE,uBAGF,YACE,uBACA,WACA,YACA,iBACA,6BAEA,WACE,gBACA,oBACA,aACA,yBACA,gBACA,oCAEA,0BACE,oCAGF,cACE,YACA,oBACA,YACA,6BAIJ,qBACE,WACA,gBACA,cACA,aACA,sBACA,qCAEA,4BARF,cASI,qBAMR,kBACE,wBACA,CADA,eACA,MACA,UACA,cACA,qCAEA,mBAPF,gBAQI,+BAGF,eACE,qCAEA,6BAHF,kBAII,gKAMJ,WAIE,mCAIJ,YACE,mBACA,uBACA,YACA,SAGF,WACE,kBACA,sBACA,aACA,sBACA,qBAEA,kBXlgEW,8BWogET,+BACA,KAIJ,aACE,CACA,qBACA,WACA,YACA,aAJA,YAYA,CARA,QAGF,WACE,sBACA,CACA,qBACA,kBACA,cAGF,aACE,cACA,sBACA,cXrhEsB,qBWuhEtB,kBACA,eACA,oCACA,iBAGF,aAEE,gBACA,qCAGF,cACE,SACE,iBAGF,aAEE,CAEA,gBACA,yCAEA,iBACE,uCAGF,kBACE,qDAKF,gBAEE,kBACA,YAKN,qBACE,aACA,mBACA,cACA,gBACA,iBAGF,aACE,cACA,CACA,sBACA,WX7lEM,qBW+lEN,kBACA,eACA,gBACA,gCACA,2BACA,mDACA,qBAEA,eACE,eACA,qCAMA,mEAHF,kBAII,4BACA,yBAIJ,+BACE,cXpmEsB,sBWwmExB,eACE,aACA,qCAIJ,qBAEI,cACE,wBAKN,qBACE,WACA,YACA,cACA,6DAEA,UAEE,YACA,UACA,wCAGF,YACE,cACA,kDACA,qCAEA,uCALF,aAMI,yCAIJ,eACE,oCAGF,YACE,uDAGF,cACE,sCAGF,gBACE,eACA,CACA,2BACA,yCAGF,QACE,mCAGF,gBACE,yBAEA,kCAHF,eAII,sCAIJ,sBACE,gBACA,sCAGF,uCACE,YACE,iKAEA,eAGE,6CAIJ,gBACE,2EAGF,YAEE,kGAGF,gBACE,+BAGF,2BACE,gBACA,uCAEA,SACE,SACA,wCAGF,eACE,wCAGF,gBACE,iBACA,qDAGF,UACE,gLAGF,eAIE,gCAIJ,iBACE,6CAEA,cACE,8CAKF,gBACE,iBACA,6DAGF,UACE,CAIA,yFAGF,eACE,8DAGF,gBACE,kBACA,0BAMR,cACE,aACA,uBACA,mBACA,gBACA,iBACA,iBACA,gBACA,mBACA,WXpyEM,kBWsyEN,eACA,iBACA,qBACA,sCACA,4FAEA,kBAGE,qCAIJ,UACE,UACE,uDAGF,kCACE,4DAGF,kBAGE,yBAGF,aACE,iBAGF,eAEE,sCAIJ,2CACE,YACE,sCAOA,sEAGF,YACE,uCAIJ,0CACE,YACE,uCAIJ,UACE,YACE,mBAIJ,iBACE,yBAEA,iBACE,SACA,UACA,mBX71EsB,yBW+1EtB,gBACA,kBACA,eACA,gBACA,iBACA,WXt3EI,mDW23ER,oBACE,gBAGF,WACE,gBACA,aACA,sBACA,yBACA,kBACA,gCAEA,gBACE,oBACA,cACA,gBACA,6BAGF,sBACE,8BAGF,MACE,kBACA,aACA,sBACA,iBACA,oBACA,oBACA,mDAGF,eACE,sBX75EI,0BW+5EJ,cACA,gDAGF,iBACE,gDAGF,WACE,mBAIJ,eACE,mBACA,yBACA,gBACA,aACA,sBACA,qBAEA,aACE,sBAGF,aACE,SACA,CACA,4BACA,cACA,qDAHA,sBAOA,gBAMF,WACA,kBAGA,+BANF,qBACE,UACA,CAEA,eACA,aAiBA,CAhBA,eAGF,iBACE,MACA,OACA,mBACA,CAGA,qBACA,CACA,eACA,WACA,YACA,kBACA,uBAEA,kBXp9EW,0BWy9Eb,u1BACE,OACA,gBACA,aACA,8BAEA,aACE,sBACA,CADA,4DACA,CADA,kBACA,+BACA,CADA,2BACA,UACA,YACA,oBACA,eACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,sCAGF,yBAjBF,aAkBI,iBAIJ,kBACE,eACA,gBACA,iBAGF,aACE,eACA,mBACA,mBACA,aACA,mBACA,kBACA,mBAEA,iCACE,yBAEA,kBACE,mCACA,aAKN,iBACE,kBACA,cACA,iCACA,mCAEA,eACE,yBAGF,YAVF,cAWI,oBAGF,YACE,sBACA,qBAGF,aACE,kBACA,iBACA,yBAKF,uBADF,YAEI,sBAIJ,qBACE,WACA,mBACA,cXliFwB,eWoiFxB,cACA,eACA,oBACA,SACA,iBACA,aACA,SACA,UACA,UACA,2BAEA,yBACE,6BAIJ,kBACE,SACA,oBACA,cXvjFwB,eWyjFxB,mBACA,eACA,kBACA,UACA,mCAEA,yBACE,wCAGF,kBACE,2BAIJ,oBACE,iBACA,2BAGF,iBACE,kCAGF,cACE,cACA,eACA,aACA,kBACA,QACA,UACA,eAGF,oBACE,kBACA,eACA,6BACA,SACA,UACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,0CACA,wCACA,iCAGF,QACE,mBACA,WACA,YACA,gBACA,UACA,kBACA,UACA,yBAGF,kBACE,WACA,wBACA,qBAGF,UACE,YACA,UACA,mBACA,yBXroFW,qCWuoFX,sEAGF,wBACE,4CAGF,wBXroF0B,+EWyoF1B,wBACE,2BAGF,iBACE,WACA,YACA,MACA,SACA,gBACA,mBACA,cACA,SACA,UACA,6BACA,CAKA,uEAFF,SACE,6BAeA,CAdA,sBAGF,iBACE,WACA,YACA,MACA,SACA,gBACA,mBACA,cACA,WAGA,8CAGF,SACE,qBAGF,iBACE,QACA,SACA,WACA,YACA,yBACA,kBACA,yBACA,sBACA,yBACA,sCACA,4CAGF,SACE,qBXjsFwB,cWqsF1B,kBACE,WXxtFM,cW0tFN,eACA,aACA,qBACA,2DAEA,kBAGE,oBAGF,SACE,2BAGF,sBACE,cXztFsB,kGW4tFtB,sBAGE,WXhvFE,kCWovFJ,aXluFsB,oBWwuF1B,oBACE,iBACA,qBAGF,oBACE,kBACA,CACA,gBACA,CX1vFW,eW6vFX,iBACA,wCANA,cACA,CACA,eACA,mBAaA,CAVA,mBX9vFW,aAqBW,iBW+uFtB,CAEA,wBACA,eACA,yDAGF,kBX3wFa,cWixFb,aACE,kBAGF,aXhwFwB,cWkwFtB,8BACA,+BACA,4EAEA,0BAGE,CAHF,uBAGE,CAHF,kBAGE,kDAMA,sBACA,YACA,wDAEA,kBACE,8DAGF,cACE,sDAGF,cACE,0DAEA,aX9xFkB,0BWgyFhB,sDAIJ,oBACE,cXnzFkB,sMWszFlB,yBAGE,oDAKN,aXhzFsB,0BWszFtB,aACE,UACA,mCACA,CADA,0BACA,gBACA,6BAEA,cACE,yBACA,cX50FkB,aW80FlB,gBACA,gCACA,sCAGF,oDACE,YACE,uCAIJ,oDACE,YACE,uCAIJ,yBA3BF,YA4BI,yCAGF,eACE,aACA,iDAEA,aXv2FkB,qBW82FxB,eACE,gBACA,2BAEA,iBACE,aACA,wBAGF,kBACE,yBAGF,oBACE,gBACA,yBACA,yBACA,eAIJ,aACE,sBACA,WACA,SACA,cX94FW,gBATL,aW05FN,oBACA,eACA,gBACA,SACA,UACA,kBACA,qBAEA,SACE,qCAGF,cAnBF,cAoBI,oDAIJ,uBACE,YACA,6CACA,uBACA,sBACA,WACA,0DAEA,sBACE,0DAKJ,uBACE,2BACA,gDAGF,aXh6FwB,6BWk6FtB,uDAGF,aXj7F0B,cWq7F1B,YACE,eACA,yBACA,kBACA,cX76FsB,gBW+6FtB,qBACA,gBACA,uBAEA,QACE,OACA,kBACA,QACA,MAIA,iDAHA,YACA,uBACA,mBAUE,CATF,0BAEA,yBACE,kBACA,iBACA,cAIA,sDAGF,cAEE,cXt9FoB,uBWw9FpB,SACA,cACA,qBACA,eACA,iBACA,sMAEA,UXh/FE,yBWu/FJ,cACE,kBACA,YACA,eAKN,cACE,qBAEA,kBACE,oBAIJ,cACE,cACA,qBACA,WACA,YACA,SACA,2BAIA,UACE,YACA,qBAIJ,aACE,gBACA,kBACA,cX1gGsB,gBW4gGtB,uBACA,mBACA,qBACA,uBAGF,aACE,gBACA,2BACA,2BAGF,aXxhGwB,oBW4hGxB,aACE,eACA,eACA,gBACA,uBACA,mBACA,qBAGF,cACE,mBACA,kBACA,yBAEA,cACE,kBACA,yBACA,QACA,SACA,+BACA,yBAIJ,aACE,6CAEA,UACE,mDAGF,yBACE,6CAGF,mBACE,sBAIJ,oBACE,kCAEA,QACE,4CAIA,oBACA,0CAGF,kBACE,0CAGF,aACE,6BAIJ,wBACE,2BAGF,yBACE,cACA,SACA,WACA,YACA,oBACA,CADA,8BACA,CADA,gBACA,sBACA,wBACA,YAGF,aACE,cX3lGsB,6BW6lGtB,SACA,kBACA,kBACA,oBACA,SACA,aACA,sBACA,WACA,WACA,qBACA,kBAEA,kBACE,WAIJ,+BACE,yBAGF,iBACE,eACA,gBACA,cXrnGsB,mBArBX,eW6oGX,aACA,cACA,sBACA,mBACA,uBACA,aACA,qEAGE,aAEE,WACA,aACA,SACA,yCAIJ,gBACE,gCAGF,eACE,uCAEA,aACE,mBACA,cXnpGkB,qCWupGpB,cACE,gBACA,yBAKN,iBACE,cACA,UACA,gCAEA,uCACE,uCAEA,aACE,WACA,kBACA,aACA,OACA,QACA,cACA,UACA,oBACA,YACA,UACA,oFACA,wCAIJ,SACE,kBACA,gBAIJ,YACE,eACA,mBACA,cACA,eACA,kBACA,UACA,UACA,gBACA,2BACA,4BACA,uBAEA,QACE,SACA,yBACA,cACA,uBACA,aACA,gBACA,uBACA,gBACA,mBACA,OACA,4CAGF,aXnuGwB,4CWwuGtB,aXxuGsB,0CW0uGpB,4CAIJ,SAEE,yBAIJ,WACE,aACA,uBAGF,kBACE,iCAGF,iBACE,wBAGF,kBACE,SACA,cXrwGsB,eWuwGtB,eACA,eACA,8BAEA,aACE,CAKA,kEAEA,UXnyGI,mBWqyGF,6BAKN,eACE,gBACA,gBACA,cX7xGsB,0DW+xGtB,UACA,UACA,kBACA,uCAEA,YACE,WACA,uCAGF,iBACE,gCAGF,QACE,uBACA,SACA,6BACA,cACA,mCAIJ,kBACE,aACA,mCAIA,aX5zGsB,0BW8zGpB,gCAIJ,WACE,4DAEA,cACE,uEAEA,eACE,WAKN,oBACE,UACA,oBACA,kBACA,cACA,SACA,uBACA,eACA,sBAGF,oBACE,iBACA,oBAGF,aXh1GwB,eWk1GtB,gBACA,yBACA,iBACA,kBACA,QACA,SACA,+BACA,yBAEA,aACE,WACA,CACA,0BACA,oBACA,mBACA,4BAIJ,iBACE,QACA,SACA,+BACA,WACA,YACA,sBACA,6BACA,CACA,wBACA,kBACA,2CAGF,2EACE,CADF,mEACE,8CAGF,4EACE,CADF,oEACE,qCAGF,GACE,sBACE,KAGF,2BACE,KAGF,2BACE,KAGF,yBACE,IAGF,wBACE,EArBF,4BAGF,GACE,sBACE,KAGF,2BACE,KAGF,2BACE,KAGF,yBACE,IAGF,wBACE,uCAIJ,GACE,wBACE,KAGF,0BACE,KAGF,2BACE,KAGF,uBACE,IAGF,sBACE,EAtBA,6BAIJ,GACE,wBACE,KAGF,0BACE,KAGF,2BACE,KAGF,uBACE,IAGF,sBACE,mCAIJ,GACE,OACE,SACA,yBACA,KAGF,wBACE,KAGF,UACE,YACA,6BACA,kBACA,UACA,IAGF,UACE,YACA,eACA,UACA,6BACA,EA5BA,yBAIJ,GACE,OACE,SACA,yBACA,KAGF,wBACE,KAGF,UACE,YACA,6BACA,kBACA,UACA,IAGF,UACE,YACA,eACA,UACA,6BACA,kCAIJ,GACE,gBACA,aACA,aAPE,wBAIJ,GACE,gBACA,aACA,gCAGF,kBACE,gBXz+GM,WACA,eW2+GN,aACA,sBACA,YACA,uBACA,eACA,kBACA,kBACA,YACA,gBAGF,eXv/GQ,cAiBgB,SWy+GtB,UACA,WACA,YACA,kBACA,wBACA,CADA,oBACA,CADA,eACA,iEAEA,SAGE,cACA,yBAIJ,aACE,eACA,yBAGF,aACE,eACA,gBACA,iBAGF,KACE,OACA,WACA,YACA,kBACA,YACA,2BAEA,aACE,SACA,QACA,WACA,YACA,6BAGF,mBACE,yBAGF,YACE,0BAGF,aACE,uBACA,WACA,YACA,SACA,iCAEA,oBACE,0BACA,kBACA,iBACA,WXtjHE,gBWwjHF,eACA,+LAMA,yBACE,mEAKF,yBACE,6BAMR,kBACE,iBAGF,kBACE,6BACA,gCACA,aACA,mBACA,eACA,kDAGF,aAEE,kBACA,yBAGF,kBACE,aACA,2BAGF,aXplHwB,eWslHtB,cACA,gBACA,mBACA,kDAIA,kBACE,oDAIA,SEtmHF,sBACA,WACA,SACA,gBACA,oBACA,mBbRW,cAOW,eaItB,SACA,+EFgmHI,aACE,CEjmHN,qEFgmHI,aACE,CEjmHN,yEFgmHI,aACE,CEjmHN,gEFgmHI,aACE,sEAGF,QACE,yLAGF,mBAGE,0DAGF,kBACE,qCAGF,mDArBF,cAsBI,yDAIJ,aX9mHoB,iBWgnHlB,eACA,4DAGF,gBACE,wDAGF,kBACE,gEAEA,cACE,iNAEA,kBAGE,cACA,gHAKN,aXrpHoB,0HW0pHpB,cAEE,gBACA,cX/oHkB,kZWkpHlB,aAGE,gEAIJ,wBACE,iDAGF,eX3rHI,kBa0BN,CAEA,eACA,cbbsB,uCaetB,UF8pHI,mBX5qHoB,oDagBxB,wBACE,cblBoB,eaoBpB,gBACA,mBACA,oDAGF,aACE,oDAGF,kBACE,oDAGF,eACE,cbzCS,sDWwrHT,WACE,mDAGF,aX5rHS,kBW8rHP,eACA,8HAEA,kBAEE,iCAON,kBACE,mBAIJ,UXxtHQ,kBW0tHN,cACA,mBACA,sBX7tHM,yBW+tHN,eACA,gBACA,YACA,kBACA,WACA,yBAEA,SACE,iBAIJ,aACE,iBACA,wBAGF,aX/tHwB,qBWiuHtB,mBACA,gBACA,sBACA,6EAGF,aXztHwB,mBArBX,kBWmvHX,aACA,eACA,gBACA,eACA,aACA,cACA,mBACA,uBACA,yBAEA,4EAfF,cAgBI,6FAGF,eACE,mFAGF,aX5vHwB,qBW8vHtB,qGAEA,yBACE,uCAKN,kBACE,aACA,eAGF,qBACE,8BAGF,GACE,kBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,oBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,kBACE,2CACA,CADA,kCACA,EA1BF,qBAGF,GACE,kBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,oBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,kBACE,2CACA,CADA,kCACA,mCAIJ,8BACE,2DACA,CADA,kDACA,iCAGF,MACE,sBAEE,0BACA,KAGF,sBACE,aAGF,uBAGE,aAGF,sBAGE,KAGF,uBACE,KAGF,sBACE,EA/BF,wBAGF,MACE,sBAEE,0BACA,KAGF,sBACE,aAGF,uBAGE,aAGF,sBAGE,KAGF,uBACE,KAGF,sBACE,kCAIJ,yBACE,8EACA,CADA,qEACA,8BAGF,eXt2HQ,kBWw2HN,sCACA,kBACA,eACA,UACA,iDAEA,2BACE,2DAGF,UACE,mCAIJ,iBACE,SACA,WACA,eACA,yCAGF,iBACE,UACA,SACA,UACA,gBXl4HM,kBWo4HN,sCACA,gBACA,gDAEA,aACE,eACA,SACA,gBACA,uBACA,iKAEA,+BAGE,2DAIJ,WACE,wBAKF,2BACE,cAIJ,kBACE,0BACA,aACA,YACA,uBACA,OACA,UACA,kBACA,MACA,kBACA,WACA,aACA,gBAEA,mBACE,oBAIJ,WACE,aACA,aACA,sBACA,kBACA,YACA,0BAGF,iBACE,MACA,QACA,SACA,OACA,WACA,kBACA,mBX37HW,kCW67HX,uBAGF,MACE,aACA,mBACA,uBACA,cX57HwB,eW87HxB,gBACA,0BACA,kBACA,kBAGF,YACE,cXx7HsB,gBW07HtB,aACA,sBAEA,cACE,kBACA,uBAGF,cACE,yBACA,gBACA,cACA,0BAIJ,aACE,4BAGF,UACE,WACA,kBACA,mBXj9HsB,kBWm9HtB,eACA,2BAGF,iBACE,OACA,MACA,WACA,mBXv+HwB,kBWy+HxB,eAGF,aACE,wBACA,UACA,eACA,0CAEA,mBAEE,mBAGF,8BACE,CADF,sBACE,WACA,cACA,SACA,WACA,YACA,CAQE,6GAKN,SACE,oBACA,CADA,WACA,6BAGF,iBACE,gBXliIM,uCWoiIN,kBACA,iBACA,gBACA,iCAEA,yBACE,oCAGF,sBACE,2BAIJ,aXziIa,aW2iIX,eACA,aACA,kEAEA,kBXtiIwB,WAlBlB,UW4jIJ,CX5jII,4RWikIF,UXjkIE,wCWukIN,kBACE,iCAIJ,YACE,mBACA,uBACA,kBACA,oCAGF,aACE,cXtjIsB,2CWyjItB,eACE,cACA,cXhlIS,CWqlIL,wQADF,eACE,mDAON,eXrmIM,0BWumIJ,qCACA,gEAEA,eACE,0DAGF,kBX5lIsB,uEW+lIpB,UXjnIE,uDWunIN,yBACE,sDAGF,aACE,sCACA,SAIJ,iBACE,gBAGF,SEznIE,sBACA,WACA,SACA,gBACA,oBACA,mBbRW,cAOW,eaItB,SACA,cFmnIA,CACA,2BACA,iBACA,eACA,2CAEA,aACE,CAHF,iCAEA,aACE,CAHF,qCAEA,aACE,CAHF,4BAEA,aACE,kCAGF,QACE,6EAGF,mBAGE,sBAGF,kBACE,qCAGF,eA3BF,cA4BI,kCAKF,QACE,qDAGF,mBAEE,mBAGF,iBACE,SACA,WACA,UACA,qBACA,UACA,0BACA,sCACA,eACA,WACA,YACA,cXzqIsB,eW2qItB,oBACA,0BAEA,mBACE,WACA,0BAIJ,uBACE,iCAEA,mBACE,uBACA,gCAIJ,QACE,uBACA,cXlrIoB,eWorIpB,uCAEA,uBACE,sCAGF,aACE,yBAKN,aXhsIwB,mBWksItB,aACA,gBACA,eACA,eACA,6BAEA,oBACE,iBACA,0BAIJ,iBACE,6BAEA,kBACE,gCACA,eACA,aACA,aACA,gBACA,eACA,cXxtIoB,iCW2tIpB,oBACE,iBACA,8FAIJ,eAEE,0BAIJ,aACE,aACA,cXtvIwB,qBWwvIxB,+FAEA,aAGE,0BACA,uBAIJ,YACE,cXpwIsB,kBWswItB,aAGF,iBACE,8BACA,oBACA,aACA,sBAGF,cACE,MACA,OACA,QACA,SACA,0BACA,wBAGF,cACE,MACA,OACA,WACA,YACA,aACA,sBACA,mBACA,uBACA,2BACA,aACA,oBACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,oBAGF,mBACE,aACA,aACA,yBAGF,eACE,iBACA,yBAGF,UACE,cAGF,UACE,YACA,kBACA,qCAEA,UACE,YACA,aACA,mBACA,uBACA,2CAEA,cXjyI0B,eAEC,CW2yI7B,8CALF,iBACE,MACA,OACA,QACA,SAYA,CAXA,yBAQA,mBACA,8BACA,oBACA,4BAEA,mBACE,0DAGF,SACE,4DAEA,mBACE,mBAKN,yBACE,sBACA,SACA,WX73IM,eW+3IN,aACA,mBACA,eACA,cACA,cACA,kBACA,kBACA,MACA,SACA,yBAGF,MACE,0BAGF,OACE,CASA,4CANF,UACE,kBACA,kBACA,OACA,YACA,oBAUA,6BAEA,WACE,sBAGF,mBACE,qBACA,gBACA,cX15IsB,mFW65ItB,yBAGE,wBAKN,oBACE,sBAGF,qBX17IQ,YW47IN,WACA,kBACA,YACA,UACA,SACA,YACA,8BAGF,wBXn7I0B,qBWu7I1B,iBACE,UACA,QACA,YACA,6CAGF,kBX/7I0B,cARb,kBW48IX,gBACA,aACA,sBACA,oBAGF,WACE,WACA,gBACA,iBACA,kBACA,wBAEA,iBACE,MACA,OACA,WACA,YACA,sBACA,aACA,aACA,CAGA,YACA,UACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,2CANA,qBACA,mBACA,uBAaF,CATE,mBAIJ,YACE,CAGA,iBACA,mDAGF,aAEE,mBACA,aACA,aACA,2DAEA,cACE,uLAGF,aXz+IsB,SW4+IpB,eACA,gBACA,kBACA,oBACA,YACA,aACA,kBACA,6BACA,+mBAEA,aAGE,yBACA,qiBAGF,aXlhJS,qwDWshJP,aAGE,sBAMR,sBACE,eAGF,iBACE,eACA,mBACA,sBAEA,eACE,cXziJS,kBW2iJT,yBACA,eACA,qBAGF,kBXhjJW,cAQa,gBW2iJtB,aACA,kBACA,kBAIJ,oBACE,eACA,gBACA,iBACA,wFAGF,kBAME,cXtkJW,kBWwkJX,gBACA,eACA,YACA,kBACA,sBACA,4NAEA,aACE,eACA,mBACA,wLAGF,WACE,UACA,kBACA,SACA,WACA,kRAGF,aACE,wBAKF,eX5mJM,CAiBkB,gBW8lJtB,oBACA,iEXhnJI,2BAiBkB,yBWumJ1B,iBACE,aACA,iCAEA,wBACE,CADF,qBACE,CADF,oBACE,CADF,gBACE,gBACA,2GAIJ,YAIE,8BACA,mBXtnJwB,aWwnJxB,iBACA,2HAEA,aACE,iBACA,cXhnJoB,mBWknJpB,2IAGF,aACE,6BAIJ,cACE,2BAGF,WACE,eACA,0BAGF,gBAEE,sDAGF,qBAEE,eAGF,UACE,gBACA,0BAGF,YACE,6BACA,qCAEA,yBAJF,cAKI,gBACA,iDAIJ,qBAEE,UACA,qCAEA,+CALF,UAMI,sDAIJ,aAEE,gBACA,gBACA,gBACA,kBACA,2FAEA,aX1rJwB,iLW8rJxB,aXvsJW,qCW4sJX,oDAjBF,eAkBI,sCAKF,4BADF,eAEI,yBAIJ,YACE,+BACA,gBACA,0BAEA,cACE,iBACA,mBACA,sCAGF,aACE,sBACA,WACA,CACA,aXtuJS,gBATL,aWkvJJ,oBACA,eACA,YACA,CACA,SACA,kBACA,yBACA,iBACA,gBACA,gBACA,4CAEA,wBACE,+CAGF,eXlwJI,yBWowJF,mBACA,kBACA,6DAEA,QACE,gBACA,gBACA,mEAEA,QACE,0DAIJ,aXzwJO,oBW2wJL,eACA,gBXrxJA,+CW0xJJ,YACE,8BACA,mBACA,4CAIJ,aACE,cXzxJS,eW2xJT,gBACA,mBACA,wCAGF,eACE,mBACA,+CAEA,aXpyJS,eWsyJP,qCAIJ,uBAnFF,YAoFI,eACA,QACA,wCAEA,iBACE,iBAKN,eACE,eACA,wBAEA,eACE,iBACA,2CAGF,eACE,mBAGF,eACE,cACA,gBACA,+BAEA,4BACE,4BAGF,QACE,oCAIA,aXh1JO,aWk1JL,kBACA,eACA,mBACA,qBACA,8EAEA,eAEE,yWAOA,kBXx1JgB,WAlBlB,uDWi3JA,iBACE,oMAUR,aACE,iIAIJ,4BAIE,cXv2JsB,eWy2JtB,gBACA,6cAEA,aAGE,6BACA,qGAIJ,YAIE,eACA,iIAEA,eACE,CAII,w1BADF,eACE,sDAMR,iBAEE,oDAKA,eACE,0DAGF,eACE,mBACA,aACA,mBACA,wEAEA,aX56JS,CW86JP,gBACA,uBAKN,YACE,2CAEA,QACE,WACA,cAIJ,wBXp7J0B,WWs7JxB,kBACA,MACA,OACA,aACA,6BAGF,aACE,kBACA,WXj9JM,0BWm9JN,WACA,SACA,gBACA,kBACA,eACA,gBACA,UACA,oBACA,WACA,4BACA,iBACA,wDAKE,SACE,uBAKN,eACE,6BAEA,UACE,kBAIJ,YACE,eACA,yBACA,kBACA,gBACA,gBACA,wBAEA,aACE,cX59JoB,iBW89JpB,eACA,+BACA,aACA,sBACA,mBACA,uBACA,eACA,4BAEA,aACE,wBAIJ,eACE,CACA,qBACA,aACA,sBACA,uBACA,2BAEA,aACE,cACA,0BAGF,oBACE,cX1/JkB,gBW4/JlB,gCAEA,yBACE,0BAKN,QACE,eACA,iDAEA,SACE,cACA,8BAGF,aX7gKoB,gBWqhKtB,cACA,CACA,iBACA,CACA,UACA,qCANF,qBACE,CACA,eACA,CACA,iBAYA,CAVA,qBAGF,QACE,CACA,aACA,WACA,CACA,iBAEA,qEAGE,cACE,MACA,gCAKN,cACE,cACA,qBACA,cX9jKwB,kBWgkKxB,UACA,mEAEA,WAEE,WACA,CAIA,2DADF,mBACE,CADF,8BACE,CADF,gBX3lKM,CW4lKJ,wBAIJ,UACE,YACA,CACA,iBACA,MACA,OACA,UACA,gBXvmKM,iCW0mKN,YACE,sBAIJ,WACE,gBACA,kBACA,WACA,qCAGF,cACE,YACA,oBACA,CADA,8BACA,CADA,gBACA,kBACA,QACA,2BACA,WACA,UACA,sCAGF,0BACE,2BACA,gBACA,kBACA,qKAMA,WAEE,mFAGF,WACE,eAKJ,qBACE,kBACA,mBACA,kBACA,oBACA,cACA,wBAEA,eACE,YACA,yBAGF,cACE,kBACA,gBACA,gCAEA,UACE,cACA,kBACA,6BACA,WACA,SACA,OACA,oBACA,qCAIJ,qCACE,iCAGF,wBACE,uCAIA,mBACA,mBACA,6BACA,0BACA,eAIJ,eACE,kBACA,gBXvsKM,eWysKN,kBACA,sBACA,cACA,wBAEA,eACE,sBACA,qBAGF,SACE,qBAGF,eACE,gBACA,UACA,0BAGF,oBACE,sBACA,SACA,gCAEA,wBACE,0BACA,qBACA,sBACA,UACA,4BAKF,qBACE,CADF,gCACE,CADF,kBACE,kBACA,QACA,2BACA,yBAIJ,iBACE,UACA,SACA,OACA,QACA,sBACA,iFACA,eACA,UACA,4BACA,gCAEA,SACE,6EAKF,iBAEE,wBAIJ,YACE,kBACA,MACA,OACA,WACA,YACA,UACA,SACA,gBXpxKI,cAiBgB,gBWswKpB,oBACA,+BAEA,aACE,oBACA,8GAEA,aAGE,+BAIJ,aACE,eACA,kCAGF,aACE,eACA,gBACA,4BAIJ,YACE,8BACA,oBACA,0DAEA,aACE,wBAIJ,cACE,mBACA,gBACA,uBACA,oCAGE,cACE,qCAKF,eACE,+BAIJ,sBACE,iBACA,eACA,SACA,0BACA,8GAEA,UXn1KE,+EW21KN,cAGE,gBACA,6BAGF,UXl2KM,iBWo2KJ,yBAGF,oBACE,aACA,mDAGF,UX52KM,uBWi3KN,cACE,YACA,eACA,8BAEA,UACE,WACA,+BAOA,6DANA,iBACA,cACA,kBACA,WACA,UACA,YAWA,CAVA,+BASA,kBACA,+BAGF,iBACE,UACA,kBACA,WACA,YACA,YACA,UACA,4BACA,mBACA,sCACA,oBACA,qBAIJ,gBACE,uBAEA,oBACE,eACA,gBACA,WXj6KE,sFWo6KF,yBAGE,qBAKN,cACE,YACA,kBACA,4BAEA,UACE,WACA,+BACA,kBACA,cACA,kBACA,WACA,SACA,2DAGF,aAEE,kBACA,WACA,kBACA,SACA,mBACA,6BAGF,6BACE,6BAGF,iBACE,UACA,UACA,kBACA,WACA,YACA,QACA,iBACA,4BACA,mBACA,sCACA,oBACA,CAGE,yFAKF,SACE,6GAQF,gBACE,oBACA,kBAON,UACE,cACA,+BACA,0BAEA,UACE,qCAGF,iBATF,QAUI,mBAIJ,qBACE,mBACA,uBAEA,YACE,kBACA,gBACA,gBACA,2BAEA,aACE,WACA,YACA,SACA,oBACA,CADA,8BACA,CADA,gBACA,uBAIJ,YACE,mBACA,mBACA,aACA,6BAEA,aACE,aACA,mBACA,qBACA,gBACA,qCAGF,UACE,eACA,cACA,+BAGF,aACE,WACA,YACA,gBACA,mCAEA,UACE,YACA,cACA,SACA,kBACA,mBACA,oBACA,CADA,8BACA,CADA,gBACA,qCAIJ,gBACE,gBACA,4CAEA,cACE,WX3jLF,gBW6jLE,gBACA,uBACA,0CAGF,aACE,eACA,cXpjLc,gBWsjLd,gBACA,uBACA,yBAKN,kBXpkLS,aWskLP,mBACA,uBACA,gDAEA,YACE,cACA,eACA,mDAGF,qBACE,kBACA,gCACA,WACA,gBACA,mBACA,gBACA,uBACA,qDAEA,YACE,iEAEA,cACE,sDAIJ,YACE,6BAOV,YACE,eACA,gBACA,wBAGF,QACE,sBACA,cACA,kBACA,kBACA,gBACA,WACA,+BAEA,iBACE,QACA,SACA,+BACA,eACA,sDAIJ,kBAEE,gCACA,eACA,aACA,cACA,oEAEA,kBACE,SACA,SACA,6HAGF,aAEE,cACA,cX5oLoB,eW8oLpB,eACA,gBACA,kBACA,qBACA,kBACA,WACA,mBACA,yJAEA,aXtpLsB,qWWypLpB,aAEE,WACA,kBACA,SACA,SACA,QACA,SACA,2BACA,CAEA,4CACA,CADA,kBACA,CADA,wBACA,iLAGF,WACE,6CACA,8GAKN,kBACE,gCACA,qSAKI,YACE,iSAGF,4CACE,cAOV,kBX1sLa,sBW6sLX,iBACE,4BAGF,aACE,eAIJ,cACE,kBACA,qBACA,cACA,iBACA,eACA,mBACA,gBACA,uBACA,eACA,oEAEA,YAEE,sBAGF,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,8BAEA,oBACE,mBACA,2BAKN,eACE,gBAGF,eXxwLQ,kBa0BN,CACA,sBACA,gBACA,cbbsB,uCaetB,mBAEA,wBACE,cblBoB,eaoBpB,gBACA,mBACA,mBAGF,aACE,mBAGF,kBACE,mBAGF,eACE,cbzCS,UWmwLb,iBACE,cAEA,WACE,WACA,sCACA,CADA,6BACA,cAGF,cACE,iBACA,cXtwLsB,gBWwwLtB,gBAEA,aXzwLsB,0BW2wLpB,sBAEA,oBACE,4BAMR,GACE,cACA,eACA,WATM,mBAMR,GACE,cACA,eACA,qEAGF,kBAIE,sBAEE,8BACA,iBAGF,0BACE,kCACA,+BAIA,qDACE,uEACA,+CAGF,sBACE,8BACA,6DAIA,6BACE,6CACA,4EAIF,6BACE,6CACA,+CAOJ,gBAEE,+BAGF,gBACE,6CAEA,0BACE,wDAGF,eACE,6DAGF,iBACE,iBACA,2EAIA,mBACE,UACA,gCACA,WACA,0FAGF,mBACE,UACA,oCACA,eAOV,UACE,eACA,gBACA,iBAEA,YACE,gBACA,eACA,kBACA,sCAGF,YACE,4CAEA,kBACE,yDAGF,SACE,sBACA,cACA,WACA,SACA,aACA,gDACA,mBX94LO,WATL,eW05LF,CACA,eACA,kBACA,2EAEA,QACE,wMAGF,mBAGE,+DAGF,kBACE,qCAGF,wDA7BF,cA8BI,4DAIJ,WACE,eACA,gBACA,SACA,kBACA,sBAMJ,sBACA,mBACA,6BACA,gCACA,+BAEA,iBACE,iBACA,cXv6LoB,CW06LpB,eACA,eACA,oCAEA,aACE,gBACA,uBACA,oCAIJ,UACE,kBACA,uDAGF,iBACE,qDAGF,eACE,qBAKF,wBACA,aACA,2BACA,mBACA,mBACA,2BAEA,aACE,iCAEA,UACE,uCAEA,SACE,kCAKN,aACE,cACA,mBAIJ,cACE,kBACA,MACA,OACA,WACA,YACA,0BACA,cAGF,kBX5/La,sBW8/LX,kBACA,uCACA,YACA,gBACA,qCAEA,aARF,SASI,kBAGF,cACE,mBACA,gBACA,eACA,kBACA,0BACA,6BAGF,WACE,6BAGF,yBACE,sCAEA,uBACE,uCACA,wBACA,wBAIJ,eACE,kDAIA,oBACE,+BAIJ,cACE,sBAGF,eACE,aAIJ,kBXljMa,sBWojMX,kBACA,uCACA,YACA,gBACA,qCAEA,YARF,SASI,uBAGF,kBACE,oBAGF,kBACE,YACA,0BACA,gBACA,mBAGF,YACE,gCACA,4BAGF,YACE,iCAGF,aACE,gBACA,qBACA,eACA,aACA,cAIJ,iBACE,YACA,gBACA,YACA,aACA,uBACA,mBACA,gBX5mMM,yDW+mMN,aAGE,gBACA,WACA,YACA,SACA,sBACA,CADA,gCACA,CADA,kBACA,gBXvnMI,uBW2nMN,iBACE,YACA,aACA,+BACA,iEACA,kBACA,wCACA,uBAGF,iBACE,WACA,YACA,MACA,OACA,uBAGF,iBACE,YACA,WACA,UACA,YACA,4BACA,6BAEA,UACE,8BAGF,UXxpMI,eW0pMF,gBACA,cACA,kBACA,2BAGF,iBACE,mCACA,qCAIJ,oCACE,eAEE,uBAGF,YACE,4BAKN,aXlqMwB,eWoqMtB,gBACA,gBACA,kBACA,qBACA,6BAEA,kBACE,wCAEA,eACE,6BAIJ,aACE,0BACA,mCAEA,oBACE,kBAKN,eACE,2BAEA,UACE,8FAEA,8BAEE,CAFF,sBAEE,wBAIJ,iBACE,SACA,UACA,yBAGF,eACE,aACA,kBACA,mBACA,6BAEA,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,uBAIJ,iBACE,mBACA,YACA,gCACA,+BAEA,aACE,cACA,WACA,iBACA,gDAEA,kBACE,yBACA,wBAKN,YACE,uBACA,gBACA,iBACA,iCAEA,YACE,mBACA,iBACA,gBACA,8CAEA,wBACE,kBACA,uBACA,YACA,yCAGF,YACE,8BAIJ,WACE,4CAEA,kBACE,wCAGF,UACE,YACA,iCAGF,cACE,iBACA,WXtyMA,gBWwyMA,gBACA,mBACA,uBACA,uCAEA,aACE,eACA,cX/xMc,gBWiyMd,gBACA,uBACA,gCAKN,aACE,uBAIJ,eACE,cACA,iDAGE,qBACA,WXn0ME,gDWu0MJ,QACE,6BACA,kDAEA,aACE,yEAGF,uBACE,4DAGF,aXl1MU,yBWw1Md,cACE,gCAEA,cACE,cX70MkB,eW+0MlB,kCAEA,oBACE,cXl1MgB,qBWo1MhB,iBACA,gBACA,yCAEA,eACE,WXz2MF,iBWk3MN,aXp1MsB,mBWs1MpB,gCACA,gBACA,aACA,eACA,eACA,qBAEA,oBACE,iBACA,eAIJ,YACE,mBACA,aACA,gCACA,0BAEA,eACE,qBAGF,aACE,cX92MkB,gBWg3MlB,uBACA,mBACA,4BAEA,eACE,uBAGF,aXt4MkB,qBWw4MhB,eACA,gBACA,cACA,gBACA,uBACA,mBACA,qGAKE,yBACE,wBAMR,aACE,eACA,iBACA,gBACA,iBACA,mBACA,gBACA,cXh6MoB,0BWo6MtB,aACE,WACA,2CAEA,oCACE,yBACA,0CAGF,wBACE,eAMR,YACE,gCACA,CACA,iBACA,qBAEA,kBACE,UACA,uBAGF,aACE,CACA,sBACA,kBACA,eACA,uBAGF,oBACE,mBXv8MsB,kBWy8MtB,cACA,eACA,wBACA,wBAGF,aACE,CACA,0BACA,gBACA,8BAEA,eACE,aACA,2BACA,8BACA,uCAGF,cACE,cX/9MkB,kBWi+MlB,+BAGF,aXp+MoB,eWs+MlB,mBACA,gBACA,uBACA,kBACA,gBACA,YACA,iCAEA,UX9/ME,qBWggNA,oHAEA,yBAGE,0BAKN,qBACE,uBAIJ,kBACE,6BAEA,kBACE,oDAGF,eACE,6DAGF,UX1hNI,gBWgiNR,kBACE,eACA,aACA,qBACA,0BAEA,WACE,cACA,qCAEA,yBAJF,YAKI,4BAIJ,wBACE,cACA,kBACA,qCAEA,0BALF,UAMI,uBAIJ,qBACE,WACA,aACA,kBACA,eACA,iBACA,qBACA,gBACA,gBACA,gBACA,aACA,sBACA,6BAEA,aACE,gBACA,mBACA,mBACA,8BAGF,iBACE,SACA,WACA,cACA,mBXhkNoB,kBWkkNpB,cACA,eACA,4BAIJ,YACE,cX3kNoB,kBW6kNpB,WACA,QACA,mDAIJ,YACE,oDAGF,UACE,gBAGF,YACE,eACA,mBACA,gBACA,iBACA,wBACA,sBAEA,aACE,mBACA,SACA,kBACA,WACA,eACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,cACA,aACA,mBACA,2BACA,2CACA,6BAEA,aACE,aACA,WACA,YACA,iCAEA,aACE,SACA,WACA,YACA,eACA,gBACA,sBACA,sBACA,CADA,gCACA,CADA,kBACA,6BAIJ,aACE,cACA,eACA,gBACA,kBACA,gBACA,cXzoNkB,mFW6oNpB,kBAGE,4BACA,2CACA,wGAEA,aACE,6BAIJ,0BACE,2CACA,yBACA,yDAEA,aACE,uCAKN,UACE,oCAGF,WACE,8BAGF,aX5qNsB,SW8qNpB,eACA,WACA,cACA,cACA,YACA,aACA,mBACA,WACA,2BACA,2CACA,2GAEA,SAGE,cACA,4BACA,2CACA,qCAKF,SACE,OGxtNN,eACE,eACA,UAEA,kBACE,kBACA,cAGF,iBACE,cACA,mBACA,WACA,aACA,sBAEA,kBdIsB,ecCxB,iBACE,aACA,cACA,iBACA,eACA,gBACA,qBAEA,oBACE,qBACA,yBACA,4BACA,oEAGF,YAEE,kCAGF,aACE,gCAGF,aACE,sBACA,WACA,eACA,cdtCO,UcwCP,oBACA,gBdlDE,yBcoDF,kBACA,iBACA,sCAEA,oBdtCoB,0Bc2CtB,cACE,wBAGF,YACE,mBACA,iBACA,cAIJ,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,gBACA,mBACA,cACA,uBAEA,iBACE,qBAGF,oBd3FY,8EcgGZ,oBAGE,iBACA,gCAGF,mBACE,SACA,wCAGF,mBAEE,eAIJ,oBACE,WACA,gBACA,cACA,cAGF,aACE,qBACA,oBAEA,cACE,eAIJ,eACE,mBACA,cdvGoB,ac2GtB,cACE,uBACA,UACA,SACA,SACA,cdhHoB,0BckHpB,kBACA,mBAEA,oBACE,sCAGF,mCAEE,eAIJ,WACE,eACA,kBACA,eACA,6BAIJ,4BACE,gCAEA,YACE,2CAGF,4BACE,aACA,aACA,mBACA,mGAEA,YAEE,+GAEA,oBdpKoB,sDc0KxB,cACE,gBACA,iBACA,YACA,oBACA,cdnKoB,sCcsKpB,gCAGF,YACE,mBACA,8CAEA,aACE,wBACA,iBACA,oCAIJ,uBACE,CADF,oBACE,CADF,eACE,sBACA,eACA,cd5MS,qBc8MT,WACA,UACA,oBACA,qXACA,yBACA,kBACA,CACA,yBACA,mDAGF,aACE,cAIJ,adzMwB,qBc4MtB,+BACE,6BAEA,+BACE,eChPN,k1BACE,aACA,sBACA,aACA,UACA,yBAGF,YACE,OACA,sBACA,yBACA,2BAEA,MACE,iBACA,qCAIJ,gBACE,YACE,cCtBJ,cACE,qBACA,chBSW,2BgBNX,qBAEE,iBACA,+BAGF,WACE,iBAIJ,sBACE,6BAEA,uBACE,2BACA,4BACA,mBhBHsB,4BgBOxB,oBACE,8BACA,+BACA,aACA,qBAIJ,YACE,8BACA,cACA,chBLsB,cgBOtB,oBAGF,iBACE,OACA,kBACA,iBACA,gBACA,8BACA,eACA,0BAEA,aACE,6BAIJ,ahBpC0B,mCgBuCxB,aACE,oDAGF,WACE,wBAIJ,iBACE,YACA,OACA,WACA,WACA,yBhBrDwB,uBgB0DxB,oBACE,WACA,eACA,yBAGF,iBACE,gBACA,oBAIJ,iBACE,aACA,gBACA,kBACA,gBhB5FM,sBgB8FN,sGAEA,+BAEE,oBAKF,2BACA,gBhBxGM,0BgB2GN,cACE,gBACA,gBACA,oBACA,cACA,WACA,gCACA,chBzGS,yBgB2GT,kBACA,4CAEA,QACE,2GAGF,mBAGE,wCAKN,cACE,6CAEA,SACE,kBACA,kBACA,qDAGF,SACE,WACA,kBACA,MACA,OACA,WACA,YACA,sCACA,mBACA,4BAIJ,SACE,kBACA,wBACA,gBACA,MACA,iCAEA,aACE,WACA,gBACA,gBACA,gBhBpKI,mBgByKR,iBACE,qBACA,YACA,wBAEA,UACE,YACA,wBAIJ,cACE,kBACA,iBACA,chBvKsB,mDgB0KtB,YACE,qDAGF,eACE,uDAGF,YACE,qBAIJ,YACE,YCrMF,qBACE,iBANc,cAQd,kBACA,sCAEA,WANF,UAOI,eACA,mBAIJ,iDACE,eACA,gBACA,gBACA,qBACA,cjBJsB,oBiBOtB,ajBLwB,0BiBOtB,6EAEA,oBAGE,wCAIJ,ajBlBsB,oBiBuBtB,YACE,oBACA,+BAEA,eACE,yBAIJ,eACE,cjBhCsB,qBiBoCxB,iBACE,cjBrCsB,uBiByCxB,eACE,mBACA,kBACA,kBACA,yHAGF,4CAME,mBACA,oBACA,gBACA,cjBzDsB,qBiB6DxB,aACE,qBAGF,gBACE,qBAGF,eACE,qBAGF,gBACE,yCAGF,aAEE,qBAGF,eACE,qBAGF,kBACE,yCAMA,iBACA,iBACA,yDAEA,2BACE,yDAGF,2BACE,qBAIJ,UACE,SACA,SACA,gCACA,eACA,4BAEA,UACE,SACA,wBAIJ,UACE,yBACA,8BACA,CADA,iBACA,gBACA,mBACA,iEAEA,+BAEE,cACA,kBACA,gBACA,gBACA,cjBrIkB,iCiByIpB,uBACE,gBACA,gBACA,cjB9HkB,qDiBkIpB,WAEE,iBACA,kBACA,qBACA,mEAEA,SACE,kBACA,iFAEA,gBACE,kBACA,6EAGF,iBACE,SACA,UACA,mBACA,gBACA,uBACA,+BAMR,YACE,oBAIJ,kBACE,eACA,mCAEA,iBACE,oBACA,8BAGF,YACE,8BACA,eACA,6BAGF,UACE,kDACA,eACA,iBACA,WjBpNI,iBiBsNJ,kBACA,qEAEA,aAEE,6CAIA,ajB9MoB,oCiBmNtB,4CACE,gBACA,eACA,iBACA,qCAGF,4BA3BF,iBA4BI,4BAIJ,iBACE,YACA,sBACA,mBACA,CACA,sBACA,0BACA,QACA,aACA,yCAEA,4CACE,eACA,iBACA,gBACA,cjB/OkB,mBiBiPlB,mBACA,gCACA,uBACA,mBACA,gBACA,wFAEA,eAEE,cACA,2CAGF,oBACE,2BAKN,iBACE,mCAEA,UACE,YACA,CACA,kBACA,uCAEA,aACE,WACA,YACA,mBACA,iCAIJ,cACE,mCAEA,aACE,WjBzSA,qBiB2SA,uDAGE,yBACE,2CAKN,aACE,cjBrSgB,kCiB6StB,iDAEE,CACA,eACA,eACA,iBACA,mBACA,cjBpToB,sCiBuTpB,ajBrTsB,0BiBuTpB,kBAIJ,cACE,SACA,UACA,gBACA,uBACA,oBACA,kBACA,oBACA,cACA,kBAGF,4CACE,eACA,iBACA,gBACA,mBACA,cjB7UsB,wBiBgVtB,iDACE,cACA,eACA,gBACA,cACA,kBAIJ,4CACE,eACA,iBACA,gBACA,mBACA,cjB9VsB,kBiBmWtB,cjBnWsB,mCiBkWxB,4CACE,CACA,gBACA,gBACA,mBACA,cjBvWsB,kBiB4WtB,cjB5WsB,kBiBqXtB,cjBrXsB,mCiBoXxB,4CACE,CACA,gBACA,gBACA,mBACA,cjBzXsB,kBiB8XtB,cjB9XsB,mCiBsYxB,gBAEE,mDAEA,2BACE,mDAGF,2BACE,kBAIJ,eACE,kBAGF,kBACE,yCAGF,cAEE,kBAGF,UACE,SACA,SACA,2CACA,cACA,yBAEA,UACE,SACA,iDAIJ,YAEE,+BAGF,kBjB1bW,kBiB4bT,kBACA,gBACA,sBACA,oCAEA,UACE,aACA,2BACA,iBACA,8BACA,mBACA,uDAGF,YACE,yBACA,qBACA,mFAEA,aACE,eACA,qCAGF,sDAVF,UAWI,8BACA,6CAIJ,MACE,sBACA,qCAEA,2CAJF,YAKI,sBAKN,iBACE,yBAEA,WACE,WACA,uBACA,4BAIJ,iBACE,mBACA,uCAEA,eACE,mCAGF,eACE,cACA,qCAGF,eACE,UACA,mDAEA,kBACE,aACA,iBACA,0FAKE,oBACE,gFAIJ,cACE,qDAIJ,aACE,cACA,6CAGF,UACE,YACA,0BACA,mDAGF,cACE,4DAEA,cACE,qCAKN,oCACE,eACE,sCAIJ,2BA7DF,iBA8DI,mFAIJ,qBAGE,mBjBnjBS,kBiBqjBT,kCACA,uBAGF,YACE,kBACA,WACA,YACA,2BAEA,YACE,WACA,uCAKF,YACE,eACA,mBACA,mBACA,qCAGF,sCACE,kBACE,uCAIJ,ajB3kBsB,qCiB+kBtB,eACE,WjBjmBE,gBiBmmBF,2CAEA,ajBrlBkB,gDiBwlBhB,ajBvlBkB,+CiB6lBtB,eACE,qBAIJ,kBACE,yBAEA,aACE,SACA,eACA,YACA,kBACA,qCAIJ,gDAEI,kBACE,yCAGF,eACE,gBACA,WACA,kBACA,uDAEA,iBACE,sCAMR,8BACE,aACE,uCAEA,gBACE,sDAGF,kBACE,6EAIJ,aAEE,qBAIJ,WACE,UAIJ,mBACE,qCAEA,SAHF,eAII,kBAGF,YACE,uBACA,mBACA,aACA,qBAEA,SjBvrBI,YiByrBF,qCAGF,gBAXF,SAYI,mBACA,sBAIJ,eACE,uBACA,gBACA,gBACA,uBAGF,eACE,gBACA,0BAEA,YACE,yBACA,gBACA,eACA,cjBjsBkB,6BiBqsBpB,eACE,iBACA,+BAGF,kBjBjtBS,aiBmtBP,0BACA,aACA,uCAEA,YACE,gCAIJ,cACE,gBACA,uDAEA,YACE,mBACA,iDAGF,UACE,YACA,0BACA,gCAIJ,YACE,uCAEA,4CACE,eACA,gBACA,cACA,qCAGF,cACE,cjBhvBgB,uFiBsvBtB,eACE,cASA,CjBhwBoB,2CiB6vBpB,iBACA,CACA,kBACA,gBAGF,eACE,cACA,aACA,kDACA,cACA,qCAEA,eAPF,oCAQI,cACA,8BAEA,UACE,aACA,sBACA,0CAEA,OACE,cACA,2CAGF,YACE,mBACA,QACA,cACA,qCAIJ,UACE,2BAGF,eACE,sCAIJ,eAtCF,UAuCI,6BAEA,aACE,gBACA,gBACA,2GAEA,eAGE,uFAIJ,+BAGE,2BAGF,YACE,gCAEA,eACE,qEAEA,eAEE,gBACA,2CAGF,eACE,SAQZ,iBACE,qBACA,iBAGF,aACE,kBACA,aACA,UACA,YACA,cjB71BsB,qBiB+1BtB,eACA,qCAEA,gBAVF,eAWI,WACA,gBACA,cjBv1BoB,SkBhCxB,UACE,eACA,iBACA,yBACA,qBAEA,WAEE,iBACA,mBACA,6BACA,gBACA,mBACA,oBAGF,qBACE,gCACA,aACA,gBACA,oBAGF,eACE,qEAGF,kBlBhBW,UkBqBX,alBZwB,0BkBctB,gBAEA,oBACE,eAIJ,eACE,CAII,4HADF,eACE,+FAOF,sBAEE,yFAKF,YAEE,gCAMJ,kBlBzDS,6BkB2DP,gCACA,4CAEA,qBACE,8BACA,2CAGF,uBACE,+BACA,0BAKN,qBACE,gBAIJ,aACE,mBACA,MAGF,+CACE,0BAGF,sBACE,SACA,aACA,8CAGF,oBAEE,qBACA,iBACA,eACA,clB5FsB,gBkB8FtB,0DAEA,UlBhHM,wDkBoHN,eACE,iBACA,sEAGF,cACE,yCAKF,YAEE,yDAEA,qBACE,iBACA,eACA,gBACA,qEAEA,cACE,2EAGF,YACE,mBACA,uFAEA,YACE,qHAOJ,sBACA,cACA,uBAIJ,wBACE,mBlBvJS,sBkByJT,YACA,mBACA,gCAEA,gBACE,mBACA,oBAIJ,YACE,yBACA,aACA,mBlBtKS,gCkByKT,aACE,gBACA,mBAIJ,wBACE,aACA,mBACA,qCAEA,wCACE,4BACE,0BAIJ,kBACE,iCAGF,kBlB9LS,uCkBiMP,kBACE,4BAIJ,gBACE,oBACA,sCAEA,SACE,wCAGF,YACE,mBACA,mCAGF,aACE,aACA,uBACA,mBACA,kBACA,6CAEA,UACE,YACA,kCAIJ,aACE,mCAGF,aACE,iBACA,clB/NgB,gBkBiOhB,mCAIJ,QACE,WACA,qCAEA,sBACE,gBACA,qCAOJ,4FAFF,YAGI,gCAIJ,aACE,uCAEA,iBACE,sCAGF,eACE,4BAIJ,wBACE,aACA,gBACA,qCAEA,2BALF,4BAMI,sCAIJ,+CACE,YACE,iBC7RN,YACE,uBACA,WACA,iBACA,iCAEA,gBACE,gBACA,oBACA,cACA,wCAEA,YACE,yBACA,mBnBPO,YmBSP,yBAIJ,WAvBc,UAyBZ,oBACA,iCAEA,YACE,mBACA,YACA,uCAEA,aACE,yCAEA,oBACE,aACA,2CAGF,SnBxCA,YmB0CE,kBACA,YACA,uCAIJ,aACE,cnBjCgB,qBmBmChB,cACA,eACA,aACA,0HAIA,kBAGE,+BAKN,aACE,iBACA,YACA,aACA,qCAGF,sCACE,YACE,6BAIJ,eACE,0BACA,gBACA,mBACA,qCAEA,2BANF,eAOI,+BAGF,aACE,aACA,cnB3EgB,qBmB6EhB,0BACA,2CACA,0BACA,mBACA,gBACA,uBACA,mCAEA,gBACE,oCAGF,UnBzGA,yBmB2GE,0BACA,2CACA,uCAGF,kBACE,sBACA,+BAIJ,kBACE,wBACA,SACA,iCAEA,QACE,kBACA,6DAIJ,UnBjIE,yBAkBkB,gBmBkHlB,gBACA,mEAEA,wBACE,6DAKN,yBACE,iCAIJ,qBACE,WACA,gBApJY,cAsJZ,sCAGF,uCACE,YACE,iCAGF,WA/JY,cAiKV,sCAIJ,gCACE,UACE,0BAMF,2BACA,qCAEA,wBALF,cAMI,CACA,sBACA,kCAGF,YACE,oBAEA,gCACA,0BAEA,eAEA,mBACA,8BACA,mCAEA,eACE,kBACA,yCAGF,mBACE,4DAEA,eACE,qCAIJ,gCAzBF,eA0BI,iBACA,6BAIJ,anBnMsB,emBqMpB,iBACA,gBACA,qCAEA,2BANF,eAOI,6BAIJ,anB9MsB,emBgNpB,iBACA,gBACA,mBACA,4BAGF,wBACE,eACA,gBACA,cnB1NkB,mBmB4NlB,kBACA,gCACA,4BAGF,cACE,cnBjOoB,iBmBmOpB,gBACA,0CAGF,UnBxPI,gBmB0PF,uFAGF,eAEE,gEAGF,aACE,4CAGF,cACE,gBACA,WnBxQE,oBmB0QF,iBACA,gBACA,gBACA,2BAGF,cACE,iBACA,cnBjQoB,mBmBmQpB,kCAEA,UnBtRE,gBmBwRA,CAII,2NADF,eACE,4BAMR,UACE,SACA,SACA,2CACA,cACA,mCAEA,UACE,SACA,qCAKN,eA9SF,aA+SI,iCAEA,YACE,yBAGF,UACE,UACA,YACA,iCAEA,YACE,4BAGF,YACE,8DAGF,eAEE,gCACA,gBACA,0EAEA,eACE,+BAIJ,eACE,6DAGF,2BnBjUoB,YmBwU1B,UACE,SACA,cACA,WACA,sDAKA,anBnVsB,0DmBsVpB,anBpVsB,4DmByVxB,anB1Wc,gBmB4WZ,4DAGF,anB9WU,gBmBgXR,0DAGF,anBvVsB,gBmByVpB,0DAGF,anBtXU,gBmBwXR,UAIJ,YACE,eACA,yBAEA,aACE,qBACA,oCAEA,kBACE,4BAGF,cACE,gBACA,+BAEA,oBACE,iBACA,gCAIJ,eACE,yBACA,eACA,CAII,iNADF,eACE,6CAKN,aACE,mBACA,2BAGF,oBACE,cnBxZkB,qBmB0ZlB,yBACA,eACA,gBACA,gCACA,iCAEA,UnBhbE,gCmBkbA,oCAGF,anBnaoB,gCmBqalB,CAkBJ,gBAIJ,aACE,iBACA,eACA,sBAGF,aACE,eACA,cACA,wBAEA,aACE,kBAIJ,YACE,eACA,mBACA,wBAGF,YACE,WACA,sBACA,aACA,+BAEA,aACE,qBACA,gBACA,eACA,iBACA,cnB7dsB,CmBkelB,4MADF,eACE,sCAKN,aACE,gCAIJ,YAEE,mBACA,kEAEA,UACE,kBACA,4BACA,gFAEA,iBACE,kDAKN,aAEE,aACA,sBACA,4EAEA,cACE,WACA,kBACA,mBACA,uEAIJ,cAEE,iBAGF,YACE,eACA,kBACA,2CAEA,kBACE,eACA,8BAGF,kBACE,+CAGF,gBACE,uDAEA,gBACE,mBACA,YACA,YAKN,kBACE,eACA,cAEA,anB3iBwB,qBmB6iBtB,oBAEA,yBACE,SAKN,aACE,YAGF,gBACE,eACA,mBnBpkBW,gCmBskBX,uBAEA,eACE,oBAGF,YACE,2BACA,mBACA,cnBxkBoB,emB0kBpB,eACA,oBAGF,iBACE,4BAEA,aACE,SACA,kBACA,WACA,YACA,qBAIJ,2BACE,mBAGF,oBACE,uBAGF,anBplBsB,sDmBwlBtB,anBrmBwB,qBmBymBtB,gBACA,yDAIJ,oBAIE,cnBlnBwB,iGmBqnBxB,eACE,yIAIA,4BACE,cACA,iIAGF,8BACE,CADF,sBACE,WACA,sBAKN,YAEE,mBACA,sCAEA,aACE,CACA,gBACA,kBACA,0DAIA,8BACE,CADF,sBACE,WACA,gBAKN,kBACE,8BACA,yBAEA,yBnB9qBc,yBmBkrBd,yBACE,wBAGF,yBnBnrBU,wBmBwrBR,2BACA,eACA,iBACA,4BACA,kBACA,gBACA,0BAEA,anBprBoB,uBmB0rBpB,wBACA,qBAGF,anBhrBsB,cmBqrBxB,kBnB1sBa,kBmB4sBX,mBACA,uBAEA,YACE,8BACA,mBACA,aACA,gCAEA,SACE,SACA,gDAEA,aACE,8BAIJ,aACE,gBACA,cnBztBkB,yBmB2tBlB,iBACA,gCAEA,aACE,qBACA,iHAEA,aAGE,mCAIJ,anBvvBM,6BmB8vBR,YACE,2BACA,6BACA,mCAEA,kBACE,gFAGF,YAEE,cACA,sBACA,YACA,cnB9vBgB,mLmBiwBhB,kBAEE,gBACA,uBACA,sCAIJ,aACE,6BACA,4CAEA,anB/vBgB,iBmBiwBd,gBACA,wCAIJ,aACE,sBACA,WACA,aACA,qBACA,cnBzxBgB,WmBgyBxB,kBAGE,0BAFA,eACA,uBASA,CARA,eAGF,oBACE,gBACA,CAEA,qBACA,oBAGF,YACE,eACA,CACA,kBACA,wBAEA,qBACE,cACA,mBACA,aACA,0FAGF,kBAEE,kBACA,YACA,6CAGF,QACE,SACA,+CAEA,aACE,sEAGF,uBACE,yDAGF,anB71BY,8CmBk2Bd,qBACE,aACA,WnBr2BI,cmB02BR,iBACE,qBAGF,wBACE,kBACA,2BAEA,cACE,mBnB12BS,gCmB42BT,kCAEA,cACE,cACA,gBACA,eACA,gBACA,cnB32BoB,qBmB62BpB,mBACA,uHAEA,UnBj4BE,iCmBw4BJ,cACE,cnB32BkB,uCmB+2BpB,YACE,8BACA,mBACA,sCAGF,eACE,sBCt5BN,YACE,eACA,CACA,kBACA,0BAEA,qBACE,iBACA,cACA,mBACA,yDAEA,YAEE,mBACA,kBACA,sBACA,YACA,4BAGF,oBACE,cACA,cACA,qGAEA,kBAGE,sDAKN,iBAEE,gBACA,eACA,iBACA,WpBrCI,6CoBuCJ,mBACA,iBACA,4BAGF,cACE,6BAGF,cACE,cpBjCoB,kBoBmCpB,gBACA,qBAIJ,YACE,eACA,cACA,yBAEA,gBACE,mBACA,6BAEA,aACE,sCAIJ,apBrDwB,gBoBuDtB,qBACA,UC3EJ,aACE,gCAEA,gBACE,eACA,mBACA,+BAGF,cACE,iBACA,8CAGF,aACE,kBACA,wBAGF,gBACE,iCAGF,aACE,kBACA,uCAGF,oBACE,gDAGF,SACE,YACA,8BAGF,cACE,iBACA,mEAGF,aACE,kBACA,2DAGF,cAEE,gBACA,mFAGF,cACE,gBACA,mCAGF,aACE,iBACA,yBAGF,kBACE,kBACA,4BAGF,UACE,UACA,wBAGF,aACE,kCAGF,MACE,WACA,cACA,mBACA,2CAGF,aACE,iBACA,0CAGF,gBACE,eACA,mCAGF,WACE,sCAGF,gBACE,gBACA,yCAGF,UACE,iCAGF,aACE,iBACA,0BAGF,SACE,WACA,0DAGF,iBAEE,mBACA,4GAGF,iBAEE,gBACA,uCAGF,kBACE,eACA,2BAGF,aACE,kBACA,wCAGF,SACE,YACA,yDAGF,SACE,WACA,CAKA,oFAGF,UACE,OACA,uGAGF,UAEE,uCAIA,cACE,iBACA,kEAEA,cACE,gBACA,qCAKN,WACE,eACA,iBACA,uCAGF,WACE,sCAGF,aACE,kBACA,0CAGF,gBACE,eACA,uDAGF,gBACE,2CAGF,cACE,iBACA,YACA,yEAGF,aAEE,iBACA,iBAGF,wBACE,iBAGF,SACE,oBACA,yBAGF,aACE,8EAGF,cAEE,gBACA,oDAGF,cACE,mBACA,gEAGF,iBACE,gBACA,CAMA,8KAGF,SACE,QACA,yDAGF,kBACE,eACA,uDAGF,kBACE,gBACA,qDAGF,SACE,QACA,8FAGF,cAEE,mBACA,4CAGF,UACE,SACA,kDAEA,UACE,OACA,+DACA,8BAIJ,sXACE,uCAGF,gBAEE,kCAGF,cACE,iBACA,gDAGF,UACE,UACA,gEAGF,aACE,uDAGF,WACE,WACA,uDAGF,UACE,WACA,uDAGF,UACE,WACA,kDAGF,MACE,0CAGF,iBACE,yBACA,qDAGF,cACE,iBACA,qCAGF,kCACE,gBAEE,kBACA,2DAEA,gBACE,mBACA,uEAKF,gBAEE,kBACA,gFAKN,cAEE,gBACA,6CAKE,eACE,eACA,sDAIJ,aACE,kBACA,4DAKF,cACE,gBACA,8DAGF,gBACE,eACA,mCAIJ,aACE,kBACA,iBACA,kCAGF,WACE,mCAGF,WACE,oCAGF,cACE,gBACA,gFAGF,cACE,mBACA,+DAGF,SACE,QACA,kkEC7ZJ,kIACE,CADF,sIACE,qBACA,0D","file":"flavours/vanilla/common.css","sourcesContent":["html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:\"\";content:none}table{border-collapse:collapse;border-spacing:0}html{scrollbar-color:#192432 rgba(0,0,0,.1)}::-webkit-scrollbar{width:12px;height:12px}::-webkit-scrollbar-thumb{background:#192432;border:0px none #fff;border-radius:50px}::-webkit-scrollbar-thumb:hover{background:#1c2938}::-webkit-scrollbar-thumb:active{background:#192432}::-webkit-scrollbar-track{border:0px none #fff;border-radius:0;background:rgba(0,0,0,.1)}::-webkit-scrollbar-track:hover{background:#121a24}::-webkit-scrollbar-track:active{background:#121a24}::-webkit-scrollbar-corner{background:transparent}body{font-family:\"mastodon-font-sans-serif\",sans-serif;background:#06090c;font-size:13px;line-height:18px;font-weight:400;color:#fff;text-rendering:optimizelegibility;font-feature-settings:\"kern\";text-size-adjust:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-tap-highlight-color:transparent}body.system-font{font-family:system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"Oxygen\",\"Ubuntu\",\"Cantarell\",\"Fira Sans\",\"Droid Sans\",\"Helvetica Neue\",\"mastodon-font-sans-serif\",sans-serif}body.app-body{padding:0}body.app-body.layout-single-column{height:auto;min-height:100vh;overflow-y:scroll}body.app-body.layout-multiple-columns{position:absolute;width:100%;height:100%}body.app-body.with-modals--active{overflow-y:hidden}body.lighter{background:#121a24}body.with-modals{overflow-x:hidden;overflow-y:scroll}body.with-modals--active{overflow-y:hidden}body.player{text-align:center}body.embed{background:#192432;margin:0;padding-bottom:0}body.embed .container{position:absolute;width:100%;height:100%;overflow:hidden}body.admin{background:#0b1016;padding:0}body.error{position:absolute;text-align:center;color:#9baec8;background:#121a24;width:100%;height:100%;padding:0;display:flex;justify-content:center;align-items:center}body.error .dialog{vertical-align:middle;margin:20px}body.error .dialog__illustration img{display:block;max-width:470px;width:100%;height:auto;margin-top:-120px}body.error .dialog h1{font-size:20px;line-height:28px;font-weight:400}button{font-family:inherit;cursor:pointer}button:focus{outline:none}.app-holder,.app-holder>div,.app-holder>noscript{display:flex;width:100%;align-items:center;justify-content:center;outline:0 !important}.app-holder>noscript{height:100vh}.layout-single-column .app-holder,.layout-single-column .app-holder>div{min-height:100vh}.layout-multiple-columns .app-holder,.layout-multiple-columns .app-holder>div{height:100%}.error-boundary,.app-holder noscript{flex-direction:column;font-size:16px;font-weight:400;line-height:1.7;color:#e25169;text-align:center}.error-boundary>div,.app-holder noscript>div{max-width:500px}.error-boundary p,.app-holder noscript p{margin-bottom:.85em}.error-boundary p:last-child,.app-holder noscript p:last-child{margin-bottom:0}.error-boundary a,.app-holder noscript a{color:#d8a070}.error-boundary a:hover,.error-boundary a:focus,.error-boundary a:active,.app-holder noscript a:hover,.app-holder noscript a:focus,.app-holder noscript a:active{text-decoration:none}.error-boundary__footer,.app-holder noscript__footer{color:#3e5a7c;font-size:13px}.error-boundary__footer a,.app-holder noscript__footer a{color:#3e5a7c}.error-boundary button,.app-holder noscript button{display:inline;border:0;background:transparent;color:#3e5a7c;font:inherit;padding:0;margin:0;line-height:inherit;cursor:pointer;outline:0;transition:color 300ms linear;text-decoration:underline}.error-boundary button:hover,.error-boundary button:focus,.error-boundary button:active,.app-holder noscript button:hover,.app-holder noscript button:focus,.app-holder noscript button:active{text-decoration:none}.error-boundary button.copied,.app-holder noscript button.copied{color:#79bd9a;transition:none}.container-alt{width:700px;margin:0 auto;margin-top:40px}@media screen and (max-width: 740px){.container-alt{width:100%;margin:0}}.logo-container{margin:100px auto 50px}@media screen and (max-width: 500px){.logo-container{margin:40px auto 0}}.logo-container h1{display:flex;justify-content:center;align-items:center}.logo-container h1 svg{fill:#fff;height:42px;margin-right:10px}.logo-container h1 a{display:flex;justify-content:center;align-items:center;color:#fff;text-decoration:none;outline:0;padding:12px 16px;line-height:32px;font-family:\"mastodon-font-display\",sans-serif;font-weight:500;font-size:14px}.compose-standalone .compose-form{width:400px;margin:0 auto;padding:20px 0;margin-top:40px;box-sizing:border-box}@media screen and (max-width: 400px){.compose-standalone .compose-form{width:100%;margin-top:0;padding:20px}}.account-header{width:400px;margin:0 auto;display:flex;font-size:13px;line-height:18px;box-sizing:border-box;padding:20px 0;padding-bottom:0;margin-bottom:-30px;margin-top:40px}@media screen and (max-width: 440px){.account-header{width:100%;margin:0;margin-bottom:10px;padding:20px;padding-bottom:0}}.account-header .avatar{width:40px;height:40px;margin-right:8px}.account-header .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px}.account-header .name{flex:1 1 auto;color:#d9e1e8;width:calc(100% - 88px)}.account-header .name .username{display:block;font-weight:500;text-overflow:ellipsis;overflow:hidden}.account-header .logout-link{display:block;font-size:32px;line-height:40px;margin-left:8px}.grid-3{display:grid;grid-gap:10px;grid-template-columns:3fr 1fr;grid-auto-columns:25%;grid-auto-rows:max-content}.grid-3 .column-0{grid-column:1/3;grid-row:1}.grid-3 .column-1{grid-column:1;grid-row:2}.grid-3 .column-2{grid-column:2;grid-row:2}.grid-3 .column-3{grid-column:1/3;grid-row:3}@media screen and (max-width: 415px){.grid-3{grid-gap:0;grid-template-columns:minmax(0, 100%)}.grid-3 .column-0{grid-column:1}.grid-3 .column-1{grid-column:1;grid-row:3}.grid-3 .column-2{grid-column:1;grid-row:2}.grid-3 .column-3{grid-column:1;grid-row:4}}.grid-4{display:grid;grid-gap:10px;grid-template-columns:repeat(4, minmax(0, 1fr));grid-auto-columns:25%;grid-auto-rows:max-content}.grid-4 .column-0{grid-column:1/5;grid-row:1}.grid-4 .column-1{grid-column:1/4;grid-row:2}.grid-4 .column-2{grid-column:4;grid-row:2}.grid-4 .column-3{grid-column:2/5;grid-row:3}.grid-4 .column-4{grid-column:1;grid-row:3}.grid-4 .landing-page__call-to-action{min-height:100%}.grid-4 .flash-message{margin-bottom:10px}@media screen and (max-width: 738px){.grid-4{grid-template-columns:minmax(0, 50%) minmax(0, 50%)}.grid-4 .landing-page__call-to-action{padding:20px;display:flex;align-items:center;justify-content:center}.grid-4 .row__information-board{width:100%;justify-content:center;align-items:center}.grid-4 .row__mascot{display:none}}@media screen and (max-width: 415px){.grid-4{grid-gap:0;grid-template-columns:minmax(0, 100%)}.grid-4 .column-0{grid-column:1}.grid-4 .column-1{grid-column:1;grid-row:3}.grid-4 .column-2{grid-column:1;grid-row:2}.grid-4 .column-3{grid-column:1;grid-row:5}.grid-4 .column-4{grid-column:1;grid-row:4}}@media screen and (max-width: 415px){.public-layout{padding-top:48px}}.public-layout .container{max-width:960px}@media screen and (max-width: 415px){.public-layout .container{padding:0}}.public-layout .header{background:#202e3f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;height:48px;margin:10px 0;display:flex;align-items:stretch;justify-content:center;flex-wrap:nowrap;overflow:hidden}@media screen and (max-width: 415px){.public-layout .header{position:fixed;width:100%;top:0;left:0;margin:0;border-radius:0;box-shadow:none;z-index:110}}.public-layout .header>div{flex:1 1 33.3%;min-height:1px}.public-layout .header .nav-left{display:flex;align-items:stretch;justify-content:flex-start;flex-wrap:nowrap}.public-layout .header .nav-center{display:flex;align-items:stretch;justify-content:center;flex-wrap:nowrap}.public-layout .header .nav-right{display:flex;align-items:stretch;justify-content:flex-end;flex-wrap:nowrap}.public-layout .header .brand{display:block;padding:15px}.public-layout .header .brand svg{display:block;height:18px;width:auto;position:relative;bottom:-2px;fill:#fff}@media screen and (max-width: 415px){.public-layout .header .brand svg{height:20px}}.public-layout .header .brand:hover,.public-layout .header .brand:focus,.public-layout .header .brand:active{background:#26374d}.public-layout .header .nav-link{display:flex;align-items:center;padding:0 1rem;font-size:12px;font-weight:500;text-decoration:none;color:#9baec8;white-space:nowrap;text-align:center}.public-layout .header .nav-link:hover,.public-layout .header .nav-link:focus,.public-layout .header .nav-link:active{text-decoration:underline;color:#fff}@media screen and (max-width: 550px){.public-layout .header .nav-link.optional{display:none}}.public-layout .header .nav-button{background:#2d415a;margin:8px;margin-left:0;border-radius:4px}.public-layout .header .nav-button:hover,.public-layout .header .nav-button:focus,.public-layout .header .nav-button:active{text-decoration:none;background:#344b68}.public-layout .grid{display:grid;grid-gap:10px;grid-template-columns:minmax(300px, 3fr) minmax(298px, 1fr);grid-auto-columns:25%;grid-auto-rows:max-content}.public-layout .grid .column-0{grid-row:1;grid-column:1}.public-layout .grid .column-1{grid-row:1;grid-column:2}@media screen and (max-width: 600px){.public-layout .grid{grid-template-columns:100%;grid-gap:0}.public-layout .grid .column-1{display:none}}.public-layout .directory__card{border-radius:4px}@media screen and (max-width: 415px){.public-layout .directory__card{border-radius:0}}@media screen and (max-width: 415px){.public-layout .page-header{border-bottom:0}}.public-layout .public-account-header{overflow:hidden;margin-bottom:10px;box-shadow:0 0 15px rgba(0,0,0,.2)}.public-layout .public-account-header.inactive{opacity:.5}.public-layout .public-account-header.inactive .public-account-header__image,.public-layout .public-account-header.inactive .avatar{filter:grayscale(100%)}.public-layout .public-account-header.inactive .logo-button{background-color:#d9e1e8}.public-layout .public-account-header__image{border-radius:4px 4px 0 0;overflow:hidden;height:300px;position:relative;background:#000}.public-layout .public-account-header__image::after{content:\"\";display:block;position:absolute;width:100%;height:100%;box-shadow:inset 0 -1px 1px 1px rgba(0,0,0,.15);top:0;left:0}.public-layout .public-account-header__image img{object-fit:cover;display:block;width:100%;height:100%;margin:0;border-radius:4px 4px 0 0}@media screen and (max-width: 600px){.public-layout .public-account-header__image{height:200px}}.public-layout .public-account-header--no-bar{margin-bottom:0}.public-layout .public-account-header--no-bar .public-account-header__image,.public-layout .public-account-header--no-bar .public-account-header__image img{border-radius:4px}@media screen and (max-width: 415px){.public-layout .public-account-header--no-bar .public-account-header__image,.public-layout .public-account-header--no-bar .public-account-header__image img{border-radius:0}}@media screen and (max-width: 415px){.public-layout .public-account-header{margin-bottom:0;box-shadow:none}.public-layout .public-account-header__image::after{display:none}.public-layout .public-account-header__image,.public-layout .public-account-header__image img{border-radius:0}}.public-layout .public-account-header__bar{position:relative;margin-top:-80px;display:flex;justify-content:flex-start}.public-layout .public-account-header__bar::before{content:\"\";display:block;background:#192432;position:absolute;bottom:0;left:0;right:0;height:60px;border-radius:0 0 4px 4px;z-index:-1}.public-layout .public-account-header__bar .avatar{display:block;width:120px;height:120px;padding-left:16px;flex:0 0 auto}.public-layout .public-account-header__bar .avatar img{display:block;width:100%;height:100%;margin:0;border-radius:50%;border:4px solid #192432;background:#040609}@media screen and (max-width: 600px){.public-layout .public-account-header__bar{margin-top:0;background:#192432;border-radius:0 0 4px 4px;padding:5px}.public-layout .public-account-header__bar::before{display:none}.public-layout .public-account-header__bar .avatar{width:48px;height:48px;padding:7px 0;padding-left:10px}.public-layout .public-account-header__bar .avatar img{border:0;border-radius:4px}}@media screen and (max-width: 600px)and (max-width: 360px){.public-layout .public-account-header__bar .avatar{display:none}}@media screen and (max-width: 415px){.public-layout .public-account-header__bar{border-radius:0}}@media screen and (max-width: 600px){.public-layout .public-account-header__bar{flex-wrap:wrap}}.public-layout .public-account-header__tabs{flex:1 1 auto;margin-left:20px}.public-layout .public-account-header__tabs__name{padding-top:20px;padding-bottom:8px}.public-layout .public-account-header__tabs__name h1{font-size:20px;line-height:27px;color:#fff;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-shadow:1px 1px 1px #000}.public-layout .public-account-header__tabs__name h1 small{display:block;font-size:14px;color:#fff;font-weight:400;overflow:hidden;text-overflow:ellipsis}@media screen and (max-width: 600px){.public-layout .public-account-header__tabs{margin-left:15px;display:flex;justify-content:space-between;align-items:center}.public-layout .public-account-header__tabs__name{padding-top:0;padding-bottom:0}.public-layout .public-account-header__tabs__name h1{font-size:16px;line-height:24px;text-shadow:none}.public-layout .public-account-header__tabs__name h1 small{color:#9baec8}}.public-layout .public-account-header__tabs__tabs{display:flex;justify-content:flex-start;align-items:stretch;height:58px}.public-layout .public-account-header__tabs__tabs .details-counters{display:flex;flex-direction:row;min-width:300px}@media screen and (max-width: 600px){.public-layout .public-account-header__tabs__tabs .details-counters{display:none}}.public-layout .public-account-header__tabs__tabs .counter{min-width:33.3%;box-sizing:border-box;flex:0 0 auto;color:#9baec8;padding:10px;border-right:1px solid #192432;cursor:default;text-align:center;position:relative}.public-layout .public-account-header__tabs__tabs .counter a{display:block}.public-layout .public-account-header__tabs__tabs .counter:last-child{border-right:0}.public-layout .public-account-header__tabs__tabs .counter::after{display:block;content:\"\";position:absolute;bottom:0;left:0;width:100%;border-bottom:4px solid #9baec8;opacity:.5;transition:all 400ms ease}.public-layout .public-account-header__tabs__tabs .counter.active::after{border-bottom:4px solid #d8a070;opacity:1}.public-layout .public-account-header__tabs__tabs .counter.active.inactive::after{border-bottom-color:#d9e1e8}.public-layout .public-account-header__tabs__tabs .counter:hover::after{opacity:1;transition-duration:100ms}.public-layout .public-account-header__tabs__tabs .counter a{text-decoration:none;color:inherit}.public-layout .public-account-header__tabs__tabs .counter .counter-label{font-size:12px;display:block}.public-layout .public-account-header__tabs__tabs .counter .counter-number{font-weight:500;font-size:18px;margin-bottom:5px;color:#fff;font-family:\"mastodon-font-display\",sans-serif}.public-layout .public-account-header__tabs__tabs .spacer{flex:1 1 auto;height:1px}.public-layout .public-account-header__tabs__tabs__buttons{padding:7px 8px}.public-layout .public-account-header__extra{display:none;margin-top:4px}.public-layout .public-account-header__extra .public-account-bio{border-radius:0;box-shadow:none;background:transparent;margin:0 -5px}.public-layout .public-account-header__extra .public-account-bio .account__header__fields{border-top:1px solid #26374d}.public-layout .public-account-header__extra .public-account-bio .roles{display:none}.public-layout .public-account-header__extra__links{margin-top:-15px;font-size:14px;color:#9baec8}.public-layout .public-account-header__extra__links a{display:inline-block;color:#9baec8;text-decoration:none;padding:15px;font-weight:500}.public-layout .public-account-header__extra__links a strong{font-weight:700;color:#fff}@media screen and (max-width: 600px){.public-layout .public-account-header__extra{display:block;flex:100%}}.public-layout .account__section-headline{border-radius:4px 4px 0 0}@media screen and (max-width: 415px){.public-layout .account__section-headline{border-radius:0}}.public-layout .detailed-status__meta{margin-top:25px}.public-layout .public-account-bio{background:#202e3f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;overflow:hidden;margin-bottom:10px}@media screen and (max-width: 415px){.public-layout .public-account-bio{box-shadow:none;margin-bottom:0;border-radius:0}}.public-layout .public-account-bio .account__header__fields{margin:0;border-top:0}.public-layout .public-account-bio .account__header__fields a{color:#e1b590}.public-layout .public-account-bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.public-layout .public-account-bio .account__header__fields .verified a{color:#79bd9a}.public-layout .public-account-bio .account__header__content{padding:20px;padding-bottom:0;color:#fff}.public-layout .public-account-bio__extra,.public-layout .public-account-bio .roles{padding:20px;font-size:14px;color:#9baec8}.public-layout .public-account-bio .roles{padding-bottom:0}.public-layout .directory__list{display:grid;grid-gap:10px;grid-template-columns:minmax(0, 50%) minmax(0, 50%)}@media screen and (max-width: 415px){.public-layout .directory__list{display:block}}.public-layout .directory__list .icon-button{font-size:18px}.public-layout .directory__card{margin-bottom:0}.public-layout .card-grid{display:flex;flex-wrap:wrap;min-width:100%;margin:0 -5px}.public-layout .card-grid>div{box-sizing:border-box;flex:1 0 auto;width:300px;padding:0 5px;margin-bottom:10px;max-width:33.333%}@media screen and (max-width: 900px){.public-layout .card-grid>div{max-width:50%}}@media screen and (max-width: 600px){.public-layout .card-grid>div{max-width:100%}}@media screen and (max-width: 415px){.public-layout .card-grid{margin:0;border-top:1px solid #202e3f}.public-layout .card-grid>div{width:100%;padding:0;margin-bottom:0;border-bottom:1px solid #202e3f}.public-layout .card-grid>div:last-child{border-bottom:0}.public-layout .card-grid>div .card__bar{background:#121a24}.public-layout .card-grid>div .card__bar:hover,.public-layout .card-grid>div .card__bar:active,.public-layout .card-grid>div .card__bar:focus{background:#192432}}.no-list{list-style:none}.no-list li{display:inline-block;margin:0 5px}.recovery-codes{list-style:none;margin:0 auto}.recovery-codes li{font-size:125%;line-height:1.5;letter-spacing:1px}.public-layout .footer{text-align:left;padding-top:20px;padding-bottom:60px;font-size:12px;color:#4c6d98}@media screen and (max-width: 415px){.public-layout .footer{padding-left:20px;padding-right:20px}}.public-layout .footer .grid{display:grid;grid-gap:10px;grid-template-columns:1fr 1fr 2fr 1fr 1fr}.public-layout .footer .grid .column-0{grid-column:1;grid-row:1;min-width:0}.public-layout .footer .grid .column-1{grid-column:2;grid-row:1;min-width:0}.public-layout .footer .grid .column-2{grid-column:3;grid-row:1;min-width:0;text-align:center}.public-layout .footer .grid .column-2 h4 a{color:#4c6d98}.public-layout .footer .grid .column-3{grid-column:4;grid-row:1;min-width:0}.public-layout .footer .grid .column-4{grid-column:5;grid-row:1;min-width:0}@media screen and (max-width: 690px){.public-layout .footer .grid{grid-template-columns:1fr 2fr 1fr}.public-layout .footer .grid .column-0,.public-layout .footer .grid .column-1{grid-column:1}.public-layout .footer .grid .column-1{grid-row:2}.public-layout .footer .grid .column-2{grid-column:2}.public-layout .footer .grid .column-3,.public-layout .footer .grid .column-4{grid-column:3}.public-layout .footer .grid .column-4{grid-row:2}}@media screen and (max-width: 600px){.public-layout .footer .grid .column-1{display:block}}@media screen and (max-width: 415px){.public-layout .footer .grid .column-0,.public-layout .footer .grid .column-1,.public-layout .footer .grid .column-3,.public-layout .footer .grid .column-4{display:none}}.public-layout .footer h4{text-transform:uppercase;font-weight:700;margin-bottom:8px;color:#9baec8}.public-layout .footer h4 a{color:inherit;text-decoration:none}.public-layout .footer ul a{text-decoration:none;color:#4c6d98}.public-layout .footer ul a:hover,.public-layout .footer ul a:active,.public-layout .footer ul a:focus{text-decoration:underline}.public-layout .footer .brand svg{display:block;height:36px;width:auto;margin:0 auto;fill:#4c6d98}.public-layout .footer .brand:hover svg,.public-layout .footer .brand:focus svg,.public-layout .footer .brand:active svg{fill:#5377a5}.compact-header h1{font-size:24px;line-height:28px;color:#9baec8;font-weight:500;margin-bottom:20px;padding:0 10px;word-wrap:break-word}@media screen and (max-width: 740px){.compact-header h1{text-align:center;padding:20px 10px 0}}.compact-header h1 a{color:inherit;text-decoration:none}.compact-header h1 small{font-weight:400;color:#d9e1e8}.compact-header h1 img{display:inline-block;margin-bottom:-5px;margin-right:15px;width:36px;height:36px}.hero-widget{margin-bottom:10px;box-shadow:0 0 15px rgba(0,0,0,.2)}.hero-widget__img{width:100%;position:relative;overflow:hidden;border-radius:4px 4px 0 0;background:#000}.hero-widget__img img{object-fit:cover;display:block;width:100%;height:100%;margin:0;border-radius:4px 4px 0 0}.hero-widget__text{background:#121a24;padding:20px;border-radius:0 0 4px 4px;font-size:15px;color:#9baec8;line-height:20px;word-wrap:break-word;font-weight:400}.hero-widget__text .emojione{width:20px;height:20px;margin:-3px 0 0}.hero-widget__text p{margin-bottom:20px}.hero-widget__text p:last-child{margin-bottom:0}.hero-widget__text em{display:inline;margin:0;padding:0;font-weight:700;background:transparent;font-family:inherit;font-size:inherit;line-height:inherit;color:#bcc9da}.hero-widget__text a{color:#d9e1e8;text-decoration:none}.hero-widget__text a:hover{text-decoration:underline}@media screen and (max-width: 415px){.hero-widget{display:none}}.endorsements-widget{margin-bottom:10px;padding-bottom:10px}.endorsements-widget h4{padding:10px;text-transform:uppercase;font-weight:700;font-size:13px;color:#9baec8}.endorsements-widget .account{padding:10px 0}.endorsements-widget .account:last-child{border-bottom:0}.endorsements-widget .account .account__display-name{display:flex;align-items:center}.endorsements-widget .account .account__avatar{width:44px;height:44px;background-size:44px 44px}.endorsements-widget .trends__item{padding:10px}.trends-widget h4{color:#9baec8}.box-widget{padding:20px;border-radius:4px;background:#121a24;box-shadow:0 0 15px rgba(0,0,0,.2)}.placeholder-widget{padding:16px;border-radius:4px;border:2px dashed #3e5a7c;text-align:center;color:#9baec8;margin-bottom:10px}.contact-widget{min-height:100%;font-size:15px;color:#9baec8;line-height:20px;word-wrap:break-word;font-weight:400;padding:0}.contact-widget h4{padding:10px;text-transform:uppercase;font-weight:700;font-size:13px;color:#9baec8}.contact-widget .account{border-bottom:0;padding:10px 0;padding-top:5px}.contact-widget>a{display:inline-block;padding:10px;padding-top:0;color:#9baec8;text-decoration:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.contact-widget>a:hover,.contact-widget>a:focus,.contact-widget>a:active{text-decoration:underline}.moved-account-widget{padding:15px;padding-bottom:20px;border-radius:4px;background:#121a24;box-shadow:0 0 15px rgba(0,0,0,.2);color:#d9e1e8;font-weight:400;margin-bottom:10px}.moved-account-widget strong,.moved-account-widget a{font-weight:500}.moved-account-widget strong:lang(ja),.moved-account-widget a:lang(ja){font-weight:700}.moved-account-widget strong:lang(ko),.moved-account-widget a:lang(ko){font-weight:700}.moved-account-widget strong:lang(zh-CN),.moved-account-widget a:lang(zh-CN){font-weight:700}.moved-account-widget strong:lang(zh-HK),.moved-account-widget a:lang(zh-HK){font-weight:700}.moved-account-widget strong:lang(zh-TW),.moved-account-widget a:lang(zh-TW){font-weight:700}.moved-account-widget a{color:inherit;text-decoration:underline}.moved-account-widget a.mention{text-decoration:none}.moved-account-widget a.mention span{text-decoration:none}.moved-account-widget a.mention:focus,.moved-account-widget a.mention:hover,.moved-account-widget a.mention:active{text-decoration:none}.moved-account-widget a.mention:focus span,.moved-account-widget a.mention:hover span,.moved-account-widget a.mention:active span{text-decoration:underline}.moved-account-widget__message{margin-bottom:15px}.moved-account-widget__message .fa{margin-right:5px;color:#9baec8}.moved-account-widget__card .detailed-status__display-avatar{position:relative;cursor:pointer}.moved-account-widget__card .detailed-status__display-name{margin-bottom:0;text-decoration:none}.moved-account-widget__card .detailed-status__display-name span{font-weight:400}.memoriam-widget{padding:20px;border-radius:4px;background:#000;box-shadow:0 0 15px rgba(0,0,0,.2);font-size:14px;color:#9baec8;margin-bottom:10px}.page-header{background:#202e3f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;padding:60px 15px;text-align:center;margin:10px 0}.page-header h1{color:#fff;font-size:36px;line-height:1.1;font-weight:700;margin-bottom:10px}.page-header p{font-size:15px;color:#9baec8}@media screen and (max-width: 415px){.page-header{margin-top:0;background:#192432}.page-header h1{font-size:24px}}.directory{background:#121a24;border-radius:4px;box-shadow:0 0 15px rgba(0,0,0,.2)}.directory__tag{box-sizing:border-box;margin-bottom:10px}.directory__tag>a,.directory__tag>div{display:flex;align-items:center;justify-content:space-between;background:#121a24;border-radius:4px;padding:15px;text-decoration:none;color:inherit;box-shadow:0 0 15px rgba(0,0,0,.2)}.directory__tag>a:hover,.directory__tag>a:active,.directory__tag>a:focus{background:#202e3f}.directory__tag.active>a{background:#d8a070;cursor:default}.directory__tag.disabled>div{opacity:.5;cursor:default}.directory__tag h4{flex:1 1 auto;font-size:18px;font-weight:700;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.directory__tag h4 .fa{color:#9baec8}.directory__tag h4 small{display:block;font-weight:400;font-size:15px;margin-top:8px;color:#9baec8}.directory__tag.active h4,.directory__tag.active h4 .fa,.directory__tag.active h4 small,.directory__tag.active h4 .trends__item__current{color:#fff}.directory__tag .avatar-stack{flex:0 0 auto;width:120px}.directory__tag.active .avatar-stack .account__avatar{border-color:#d8a070}.directory__tag .trends__item__current{padding-right:0}.avatar-stack{display:flex;justify-content:flex-end}.avatar-stack .account__avatar{flex:0 0 auto;width:36px;height:36px;border-radius:50%;position:relative;margin-left:-10px;background:#040609;border:2px solid #121a24}.avatar-stack .account__avatar:nth-child(1){z-index:1}.avatar-stack .account__avatar:nth-child(2){z-index:2}.avatar-stack .account__avatar:nth-child(3){z-index:3}.accounts-table{width:100%}.accounts-table .account{padding:0;border:0}.accounts-table strong{font-weight:700}.accounts-table thead th{text-align:center;text-transform:uppercase;color:#9baec8;font-weight:700;padding:10px}.accounts-table thead th:first-child{text-align:left}.accounts-table tbody td{padding:15px 0;vertical-align:middle;border-bottom:1px solid #202e3f}.accounts-table tbody tr:last-child td{border-bottom:0}.accounts-table__count{width:120px;text-align:center;font-size:15px;font-weight:500;color:#fff}.accounts-table__count small{display:block;color:#9baec8;font-weight:400;font-size:14px}.accounts-table__comment{width:50%;vertical-align:initial !important}@media screen and (max-width: 415px){.accounts-table tbody td.optional{display:none}}@media screen and (max-width: 415px){.moved-account-widget,.memoriam-widget,.box-widget,.contact-widget,.landing-page__information.contact-widget,.directory,.page-header{margin-bottom:0;box-shadow:none;border-radius:0}}.statuses-grid{min-height:600px}@media screen and (max-width: 640px){.statuses-grid{width:100% !important}}.statuses-grid__item{width:313.3333333333px}@media screen and (max-width: 1255px){.statuses-grid__item{width:306.6666666667px}}@media screen and (max-width: 640px){.statuses-grid__item{width:100%}}@media screen and (max-width: 415px){.statuses-grid__item{width:100vw}}.statuses-grid .detailed-status{border-radius:4px}@media screen and (max-width: 415px){.statuses-grid .detailed-status{border-top:1px solid #2d415a}}.statuses-grid .detailed-status.compact .detailed-status__meta{margin-top:15px}.statuses-grid .detailed-status.compact .status__content{font-size:15px;line-height:20px}.statuses-grid .detailed-status.compact .status__content .emojione{width:20px;height:20px;margin:-3px 0 0}.statuses-grid .detailed-status.compact .status__content .status__content__spoiler-link{line-height:20px;margin:0}.statuses-grid .detailed-status.compact .media-gallery,.statuses-grid .detailed-status.compact .status-card,.statuses-grid .detailed-status.compact .video-player{margin-top:15px}.notice-widget{margin-bottom:10px;color:#9baec8}.notice-widget p{margin-bottom:10px}.notice-widget p:last-child{margin-bottom:0}.notice-widget a{font-size:14px;line-height:20px}.notice-widget a,.placeholder-widget a{text-decoration:none;font-weight:500;color:#d8a070}.notice-widget a:hover,.notice-widget a:focus,.notice-widget a:active,.placeholder-widget a:hover,.placeholder-widget a:focus,.placeholder-widget a:active{text-decoration:underline}.table-of-contents{background:#0b1016;min-height:100%;font-size:14px;border-radius:4px}.table-of-contents li a{display:block;font-weight:500;padding:15px;overflow:hidden;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-decoration:none;color:#fff;border-bottom:1px solid #192432}.table-of-contents li a:hover,.table-of-contents li a:focus,.table-of-contents li a:active{text-decoration:underline}.table-of-contents li:last-child a{border-bottom:0}.table-of-contents li ul{padding-left:20px;border-bottom:1px solid #192432}code{font-family:\"mastodon-font-monospace\",monospace;font-weight:400}.form-container{max-width:400px;padding:20px;margin:0 auto}.simple_form .input{margin-bottom:15px;overflow:hidden}.simple_form .input.hidden{margin:0}.simple_form .input.radio_buttons .radio{margin-bottom:15px}.simple_form .input.radio_buttons .radio:last-child{margin-bottom:0}.simple_form .input.radio_buttons .radio>label{position:relative;padding-left:28px}.simple_form .input.radio_buttons .radio>label input{position:absolute;top:-2px;left:0}.simple_form .input.boolean{position:relative;margin-bottom:0}.simple_form .input.boolean .label_input>label{font-family:inherit;font-size:14px;padding-top:5px;color:#fff;display:block;width:auto}.simple_form .input.boolean .label_input,.simple_form .input.boolean .hint{padding-left:28px}.simple_form .input.boolean .label_input__wrapper{position:static}.simple_form .input.boolean label.checkbox{position:absolute;top:2px;left:0}.simple_form .input.boolean label a{color:#d8a070;text-decoration:underline}.simple_form .input.boolean label a:hover,.simple_form .input.boolean label a:active,.simple_form .input.boolean label a:focus{text-decoration:none}.simple_form .input.boolean .recommended{position:absolute;margin:0 4px;margin-top:-2px}.simple_form .row{display:flex;margin:0 -5px}.simple_form .row .input{box-sizing:border-box;flex:1 1 auto;width:50%;padding:0 5px}.simple_form .hint{color:#9baec8}.simple_form .hint a{color:#d8a070}.simple_form .hint code{border-radius:3px;padding:.2em .4em;background:#000}.simple_form .hint li{list-style:disc;margin-left:18px}.simple_form ul.hint{margin-bottom:15px}.simple_form span.hint{display:block;font-size:12px;margin-top:4px}.simple_form p.hint{margin-bottom:15px;color:#9baec8}.simple_form p.hint.subtle-hint{text-align:center;font-size:12px;line-height:18px;margin-top:15px;margin-bottom:0}.simple_form .card{margin-bottom:15px}.simple_form strong{font-weight:500}.simple_form strong:lang(ja){font-weight:700}.simple_form strong:lang(ko){font-weight:700}.simple_form strong:lang(zh-CN){font-weight:700}.simple_form strong:lang(zh-HK){font-weight:700}.simple_form strong:lang(zh-TW){font-weight:700}.simple_form .input.with_floating_label .label_input{display:flex}.simple_form .input.with_floating_label .label_input>label{font-family:inherit;font-size:14px;color:#fff;font-weight:500;min-width:150px;flex:0 0 auto}.simple_form .input.with_floating_label .label_input input,.simple_form .input.with_floating_label .label_input select{flex:1 1 auto}.simple_form .input.with_floating_label.select .hint{margin-top:6px;margin-left:150px}.simple_form .input.with_label .label_input>label{font-family:inherit;font-size:14px;color:#fff;display:block;margin-bottom:8px;word-wrap:break-word;font-weight:500}.simple_form .input.with_label .hint{margin-top:6px}.simple_form .input.with_label ul{flex:390px}.simple_form .input.with_block_label{max-width:none}.simple_form .input.with_block_label>label{font-family:inherit;font-size:16px;color:#fff;display:block;font-weight:500;padding-top:5px}.simple_form .input.with_block_label .hint{margin-bottom:15px}.simple_form .input.with_block_label ul{columns:2}.simple_form .input.datetime .label_input select{display:inline-block;width:auto;flex:0}.simple_form .required abbr{text-decoration:none;color:#e87487}.simple_form .fields-group{margin-bottom:25px}.simple_form .fields-group .input:last-child{margin-bottom:0}.simple_form .fields-row{display:flex;margin:0 -10px;padding-top:5px;margin-bottom:25px}.simple_form .fields-row .input{max-width:none}.simple_form .fields-row__column{box-sizing:border-box;padding:0 10px;flex:1 1 auto;min-height:1px}.simple_form .fields-row__column-6{max-width:50%}.simple_form .fields-row__column .actions{margin-top:27px}.simple_form .fields-row .fields-group:last-child,.simple_form .fields-row .fields-row__column.fields-group{margin-bottom:0}@media screen and (max-width: 600px){.simple_form .fields-row{display:block;margin-bottom:0}.simple_form .fields-row__column{max-width:none}.simple_form .fields-row .fields-group:last-child,.simple_form .fields-row .fields-row__column.fields-group,.simple_form .fields-row .fields-row__column{margin-bottom:25px}}.simple_form .input.radio_buttons .radio label{margin-bottom:5px;font-family:inherit;font-size:14px;color:#fff;display:block;width:auto}.simple_form .check_boxes .checkbox label{font-family:inherit;font-size:14px;color:#fff;display:inline-block;width:auto;position:relative;padding-top:5px;padding-left:25px;flex:1 1 auto}.simple_form .check_boxes .checkbox input[type=checkbox]{position:absolute;left:0;top:5px;margin:0}.simple_form .input.static .label_input__wrapper{font-size:16px;padding:10px;border:1px solid #3e5a7c;border-radius:4px}.simple_form input[type=text],.simple_form input[type=number],.simple_form input[type=email],.simple_form input[type=password],.simple_form textarea{box-sizing:border-box;font-size:16px;color:#fff;display:block;width:100%;outline:0;font-family:inherit;resize:vertical;background:#010102;border:1px solid #000;border-radius:4px;padding:10px}.simple_form input[type=text]::placeholder,.simple_form input[type=number]::placeholder,.simple_form input[type=email]::placeholder,.simple_form input[type=password]::placeholder,.simple_form textarea::placeholder{color:#a8b9cf}.simple_form input[type=text]:invalid,.simple_form input[type=number]:invalid,.simple_form input[type=email]:invalid,.simple_form input[type=password]:invalid,.simple_form textarea:invalid{box-shadow:none}.simple_form input[type=text]:focus:invalid:not(:placeholder-shown),.simple_form input[type=number]:focus:invalid:not(:placeholder-shown),.simple_form input[type=email]:focus:invalid:not(:placeholder-shown),.simple_form input[type=password]:focus:invalid:not(:placeholder-shown),.simple_form textarea:focus:invalid:not(:placeholder-shown){border-color:#e87487}.simple_form input[type=text]:required:valid,.simple_form input[type=number]:required:valid,.simple_form input[type=email]:required:valid,.simple_form input[type=password]:required:valid,.simple_form textarea:required:valid{border-color:#79bd9a}.simple_form input[type=text]:hover,.simple_form input[type=number]:hover,.simple_form input[type=email]:hover,.simple_form input[type=password]:hover,.simple_form textarea:hover{border-color:#000}.simple_form input[type=text]:active,.simple_form input[type=text]:focus,.simple_form input[type=number]:active,.simple_form input[type=number]:focus,.simple_form input[type=email]:active,.simple_form input[type=email]:focus,.simple_form input[type=password]:active,.simple_form input[type=password]:focus,.simple_form textarea:active,.simple_form textarea:focus{border-color:#d8a070;background:#040609}.simple_form .input.field_with_errors label{color:#e87487}.simple_form .input.field_with_errors input[type=text],.simple_form .input.field_with_errors input[type=number],.simple_form .input.field_with_errors input[type=email],.simple_form .input.field_with_errors input[type=password],.simple_form .input.field_with_errors textarea,.simple_form .input.field_with_errors select{border-color:#e87487}.simple_form .input.field_with_errors .error{display:block;font-weight:500;color:#e87487;margin-top:4px}.simple_form .input.disabled{opacity:.5}.simple_form .actions{margin-top:30px;display:flex}.simple_form .actions.actions--top{margin-top:0;margin-bottom:30px}.simple_form button,.simple_form .button,.simple_form .block-button{display:block;width:100%;border:0;border-radius:4px;background:#d8a070;color:#fff;font-size:18px;line-height:inherit;height:auto;padding:10px;text-transform:uppercase;text-decoration:none;text-align:center;box-sizing:border-box;cursor:pointer;font-weight:500;outline:0;margin-bottom:10px;margin-right:10px}.simple_form button:last-child,.simple_form .button:last-child,.simple_form .block-button:last-child{margin-right:0}.simple_form button:hover,.simple_form .button:hover,.simple_form .block-button:hover{background-color:#ddad84}.simple_form button:active,.simple_form button:focus,.simple_form .button:active,.simple_form .button:focus,.simple_form .block-button:active,.simple_form .block-button:focus{background-color:#d3935c}.simple_form button:disabled:hover,.simple_form .button:disabled:hover,.simple_form .block-button:disabled:hover{background-color:#9baec8}.simple_form button.negative,.simple_form .button.negative,.simple_form .block-button.negative{background:#df405a}.simple_form button.negative:hover,.simple_form .button.negative:hover,.simple_form .block-button.negative:hover{background-color:#e3566d}.simple_form button.negative:active,.simple_form button.negative:focus,.simple_form .button.negative:active,.simple_form .button.negative:focus,.simple_form .block-button.negative:active,.simple_form .block-button.negative:focus{background-color:#db2a47}.simple_form select{appearance:none;box-sizing:border-box;font-size:16px;color:#fff;display:block;width:100%;outline:0;font-family:inherit;resize:vertical;background:#010102 url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center/auto 16px;border:1px solid #000;border-radius:4px;padding-left:10px;padding-right:30px;height:41px}.simple_form h4{margin-bottom:15px !important}.simple_form .label_input__wrapper{position:relative}.simple_form .label_input__append{position:absolute;right:3px;top:1px;padding:10px;padding-bottom:9px;font-size:16px;color:#3e5a7c;font-family:inherit;pointer-events:none;cursor:default;max-width:140px;white-space:nowrap;overflow:hidden}.simple_form .label_input__append::after{content:\"\";display:block;position:absolute;top:0;right:0;bottom:1px;width:5px;background-image:linear-gradient(to right, rgba(1, 1, 2, 0), #010102)}.simple_form__overlay-area{position:relative}.simple_form__overlay-area__blurred form{filter:blur(2px)}.simple_form__overlay-area__overlay{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;background:rgba(18,26,36,.65);border-radius:4px;margin-left:-4px;margin-top:-4px;padding:4px}.simple_form__overlay-area__overlay__content{text-align:center}.simple_form__overlay-area__overlay__content.rich-formatting,.simple_form__overlay-area__overlay__content.rich-formatting p{color:#fff}.block-icon{display:block;margin:0 auto;margin-bottom:10px;font-size:24px}.flash-message{background:#202e3f;color:#9baec8;border-radius:4px;padding:15px 10px;margin-bottom:30px;text-align:center}.flash-message.notice{border:1px solid rgba(121,189,154,.5);background:rgba(121,189,154,.25);color:#79bd9a}.flash-message.alert{border:1px solid rgba(223,64,90,.5);background:rgba(223,64,90,.25);color:#df405a}.flash-message a{display:inline-block;color:#9baec8;text-decoration:none}.flash-message a:hover{color:#fff;text-decoration:underline}.flash-message p{margin-bottom:15px}.flash-message .oauth-code{outline:0;box-sizing:border-box;display:block;width:100%;border:0;padding:10px;font-family:\"mastodon-font-monospace\",monospace;background:#121a24;color:#fff;font-size:14px;margin:0}.flash-message .oauth-code::-moz-focus-inner{border:0}.flash-message .oauth-code::-moz-focus-inner,.flash-message .oauth-code:focus,.flash-message .oauth-code:active{outline:0 !important}.flash-message .oauth-code:focus{background:#192432}.flash-message strong{font-weight:500}.flash-message strong:lang(ja){font-weight:700}.flash-message strong:lang(ko){font-weight:700}.flash-message strong:lang(zh-CN){font-weight:700}.flash-message strong:lang(zh-HK){font-weight:700}.flash-message strong:lang(zh-TW){font-weight:700}@media screen and (max-width: 740px)and (min-width: 441px){.flash-message{margin-top:40px}}.form-footer{margin-top:30px;text-align:center}.form-footer a{color:#9baec8;text-decoration:none}.form-footer a:hover{text-decoration:underline}.quick-nav{list-style:none;margin-bottom:25px;font-size:14px}.quick-nav li{display:inline-block;margin-right:10px}.quick-nav a{color:#d8a070;text-transform:uppercase;text-decoration:none;font-weight:700}.quick-nav a:hover,.quick-nav a:focus,.quick-nav a:active{color:#e1b590}.oauth-prompt,.follow-prompt{margin-bottom:30px;color:#9baec8}.oauth-prompt h2,.follow-prompt h2{font-size:16px;margin-bottom:30px;text-align:center}.oauth-prompt strong,.follow-prompt strong{color:#d9e1e8;font-weight:500}.oauth-prompt strong:lang(ja),.follow-prompt strong:lang(ja){font-weight:700}.oauth-prompt strong:lang(ko),.follow-prompt strong:lang(ko){font-weight:700}.oauth-prompt strong:lang(zh-CN),.follow-prompt strong:lang(zh-CN){font-weight:700}.oauth-prompt strong:lang(zh-HK),.follow-prompt strong:lang(zh-HK){font-weight:700}.oauth-prompt strong:lang(zh-TW),.follow-prompt strong:lang(zh-TW){font-weight:700}@media screen and (max-width: 740px)and (min-width: 441px){.oauth-prompt,.follow-prompt{margin-top:40px}}.qr-wrapper{display:flex;flex-wrap:wrap;align-items:flex-start}.qr-code{flex:0 0 auto;background:#fff;padding:4px;margin:0 10px 20px 0;box-shadow:0 0 15px rgba(0,0,0,.2);display:inline-block}.qr-code svg{display:block;margin:0}.qr-alternative{margin-bottom:20px;color:#d9e1e8;flex:150px}.qr-alternative samp{display:block;font-size:14px}.table-form p{margin-bottom:15px}.table-form p strong{font-weight:500}.table-form p strong:lang(ja){font-weight:700}.table-form p strong:lang(ko){font-weight:700}.table-form p strong:lang(zh-CN){font-weight:700}.table-form p strong:lang(zh-HK){font-weight:700}.table-form p strong:lang(zh-TW){font-weight:700}.simple_form .warning,.table-form .warning{box-sizing:border-box;background:rgba(223,64,90,.5);color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,.3);box-shadow:0 2px 6px rgba(0,0,0,.4);border-radius:4px;padding:10px;margin-bottom:15px}.simple_form .warning a,.table-form .warning a{color:#fff;text-decoration:underline}.simple_form .warning a:hover,.simple_form .warning a:focus,.simple_form .warning a:active,.table-form .warning a:hover,.table-form .warning a:focus,.table-form .warning a:active{text-decoration:none}.simple_form .warning strong,.table-form .warning strong{font-weight:600;display:block;margin-bottom:5px}.simple_form .warning strong:lang(ja),.table-form .warning strong:lang(ja){font-weight:700}.simple_form .warning strong:lang(ko),.table-form .warning strong:lang(ko){font-weight:700}.simple_form .warning strong:lang(zh-CN),.table-form .warning strong:lang(zh-CN){font-weight:700}.simple_form .warning strong:lang(zh-HK),.table-form .warning strong:lang(zh-HK){font-weight:700}.simple_form .warning strong:lang(zh-TW),.table-form .warning strong:lang(zh-TW){font-weight:700}.simple_form .warning strong .fa,.table-form .warning strong .fa{font-weight:400}.action-pagination{display:flex;flex-wrap:wrap;align-items:center}.action-pagination .actions,.action-pagination .pagination{flex:1 1 auto}.action-pagination .actions{padding:30px 0;padding-right:20px;flex:0 0 auto}.post-follow-actions{text-align:center;color:#9baec8}.post-follow-actions div{margin-bottom:4px}.alternative-login{margin-top:20px;margin-bottom:20px}.alternative-login h4{font-size:16px;color:#fff;text-align:center;margin-bottom:20px;border:0;padding:0}.alternative-login .button{display:block}.scope-danger{color:#ff5050}.form_admin_settings_site_short_description textarea,.form_admin_settings_site_description textarea,.form_admin_settings_site_extended_description textarea,.form_admin_settings_site_terms textarea,.form_admin_settings_custom_css textarea,.form_admin_settings_closed_registrations_message textarea{font-family:\"mastodon-font-monospace\",monospace}.input-copy{background:#010102;border:1px solid #000;border-radius:4px;display:flex;align-items:center;padding-right:4px;position:relative;top:1px;transition:border-color 300ms linear}.input-copy__wrapper{flex:1 1 auto}.input-copy input[type=text]{background:transparent;border:0;padding:10px;font-size:14px;font-family:\"mastodon-font-monospace\",monospace}.input-copy button{flex:0 0 auto;margin:4px;text-transform:none;font-weight:400;font-size:14px;padding:7px 18px;padding-bottom:6px;width:auto;transition:background 300ms linear}.input-copy.copied{border-color:#79bd9a;transition:none}.input-copy.copied button{background:#79bd9a;transition:none}.connection-prompt{margin-bottom:25px}.connection-prompt .fa-link{background-color:#0b1016;border-radius:100%;font-size:24px;padding:10px}.connection-prompt__column{align-items:center;display:flex;flex:1;flex-direction:column;flex-shrink:1;max-width:50%}.connection-prompt__column-sep{align-self:center;flex-grow:0;overflow:visible;position:relative;z-index:1}.connection-prompt__column p{word-break:break-word}.connection-prompt .account__avatar{margin-bottom:20px}.connection-prompt__connection{background-color:#202e3f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;padding:25px 10px;position:relative;text-align:center}.connection-prompt__connection::after{background-color:#0b1016;content:\"\";display:block;height:100%;left:50%;position:absolute;top:0;width:1px}.connection-prompt__row{align-items:flex-start;display:flex;flex-direction:row}.card>a{display:block;text-decoration:none;color:inherit;box-shadow:0 0 15px rgba(0,0,0,.2)}@media screen and (max-width: 415px){.card>a{box-shadow:none}}.card>a:hover .card__bar,.card>a:active .card__bar,.card>a:focus .card__bar{background:#202e3f}.card__img{height:130px;position:relative;background:#000;border-radius:4px 4px 0 0}.card__img img{display:block;width:100%;height:100%;margin:0;object-fit:cover;border-radius:4px 4px 0 0}@media screen and (max-width: 600px){.card__img{height:200px}}@media screen and (max-width: 415px){.card__img{display:none}}.card__bar{position:relative;padding:15px;display:flex;justify-content:flex-start;align-items:center;background:#192432;border-radius:0 0 4px 4px}@media screen and (max-width: 415px){.card__bar{border-radius:0}}.card__bar .avatar{flex:0 0 auto;width:48px;height:48px;padding-top:2px}.card__bar .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px;background:#040609;object-fit:cover}.card__bar .display-name{margin-left:15px;text-align:left}.card__bar .display-name strong{font-size:15px;color:#fff;font-weight:500;overflow:hidden;text-overflow:ellipsis}.card__bar .display-name span{display:block;font-size:14px;color:#9baec8;font-weight:400;overflow:hidden;text-overflow:ellipsis}.pagination{padding:30px 0;text-align:center;overflow:hidden}.pagination a,.pagination .current,.pagination .newer,.pagination .older,.pagination .page,.pagination .gap{font-size:14px;color:#fff;font-weight:500;display:inline-block;padding:6px 10px;text-decoration:none}.pagination .current{background:#fff;border-radius:100px;color:#121a24;cursor:default;margin:0 10px}.pagination .gap{cursor:default}.pagination .older,.pagination .newer{text-transform:uppercase;color:#d9e1e8}.pagination .older{float:left;padding-left:0}.pagination .older .fa{display:inline-block;margin-right:5px}.pagination .newer{float:right;padding-right:0}.pagination .newer .fa{display:inline-block;margin-left:5px}.pagination .disabled{cursor:default;color:#233346}@media screen and (max-width: 700px){.pagination{padding:30px 20px}.pagination .page{display:none}.pagination .newer,.pagination .older{display:inline-block}}.nothing-here{background:#121a24;box-shadow:0 0 15px rgba(0,0,0,.2);color:#9baec8;font-size:14px;font-weight:500;text-align:center;display:flex;justify-content:center;align-items:center;cursor:default;border-radius:4px;padding:20px;min-height:30vh}.nothing-here--under-tabs{border-radius:0 0 4px 4px}.nothing-here--flexible{box-sizing:border-box;min-height:100%}.account-role,.simple_form .recommended{display:inline-block;padding:4px 6px;cursor:default;border-radius:3px;font-size:12px;line-height:12px;font-weight:500;color:#d9e1e8;background-color:rgba(217,225,232,.1);border:1px solid rgba(217,225,232,.5)}.account-role.moderator,.simple_form .recommended.moderator{color:#79bd9a;background-color:rgba(121,189,154,.1);border-color:rgba(121,189,154,.5)}.account-role.admin,.simple_form .recommended.admin{color:#e87487;background-color:rgba(232,116,135,.1);border-color:rgba(232,116,135,.5)}.account__header__fields{max-width:100vw;padding:0;margin:15px -15px -15px;border:0 none;border-top:1px solid #26374d;border-bottom:1px solid #26374d;font-size:14px;line-height:20px}.account__header__fields dl{display:flex;border-bottom:1px solid #26374d}.account__header__fields dt,.account__header__fields dd{box-sizing:border-box;padding:14px;text-align:center;max-height:48px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.account__header__fields dt{font-weight:500;width:120px;flex:0 0 auto;color:#d9e1e8;background:rgba(4,6,9,.5)}.account__header__fields dd{flex:1 1 auto;color:#9baec8}.account__header__fields a{color:#d8a070;text-decoration:none}.account__header__fields a:hover,.account__header__fields a:focus,.account__header__fields a:active{text-decoration:underline}.account__header__fields .verified{border:1px solid rgba(121,189,154,.5);background:rgba(121,189,154,.25)}.account__header__fields .verified a{color:#79bd9a;font-weight:500}.account__header__fields .verified__mark{color:#79bd9a}.account__header__fields dl:last-child{border-bottom:0}.directory__tag .trends__item__current{width:auto}.pending-account__header{color:#9baec8}.pending-account__header a{color:#d9e1e8;text-decoration:none}.pending-account__header a:hover,.pending-account__header a:active,.pending-account__header a:focus{text-decoration:underline}.pending-account__header strong{color:#fff;font-weight:700}.pending-account__body{margin-top:10px}.activity-stream{box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;overflow:hidden;margin-bottom:10px}.activity-stream--under-tabs{border-radius:0 0 4px 4px}@media screen and (max-width: 415px){.activity-stream{margin-bottom:0;border-radius:0;box-shadow:none}}.activity-stream--headless{border-radius:0;margin:0;box-shadow:none}.activity-stream--headless .detailed-status,.activity-stream--headless .status{border-radius:0 !important}.activity-stream div[data-component]{width:100%}.activity-stream .entry{background:#121a24}.activity-stream .entry .detailed-status,.activity-stream .entry .status,.activity-stream .entry .load-more{animation:none}.activity-stream .entry:last-child .detailed-status,.activity-stream .entry:last-child .status,.activity-stream .entry:last-child .load-more{border-bottom:0;border-radius:0 0 4px 4px}.activity-stream .entry:first-child .detailed-status,.activity-stream .entry:first-child .status,.activity-stream .entry:first-child .load-more{border-radius:4px 4px 0 0}.activity-stream .entry:first-child:last-child .detailed-status,.activity-stream .entry:first-child:last-child .status,.activity-stream .entry:first-child:last-child .load-more{border-radius:4px}@media screen and (max-width: 740px){.activity-stream .entry .detailed-status,.activity-stream .entry .status,.activity-stream .entry .load-more{border-radius:0 !important}}.activity-stream--highlighted .entry{background:#202e3f}.button.logo-button{flex:0 auto;font-size:14px;background:#d8a070;color:#fff;text-transform:none;line-height:36px;height:auto;padding:3px 15px;border:0}.button.logo-button svg{width:20px;height:auto;vertical-align:middle;margin-right:5px;fill:#fff}.button.logo-button:active,.button.logo-button:focus,.button.logo-button:hover{background:#e3bb98}.button.logo-button:disabled:active,.button.logo-button:disabled:focus,.button.logo-button:disabled:hover,.button.logo-button.disabled:active,.button.logo-button.disabled:focus,.button.logo-button.disabled:hover{background:#9baec8}.button.logo-button.button--destructive:active,.button.logo-button.button--destructive:focus,.button.logo-button.button--destructive:hover{background:#df405a}@media screen and (max-width: 415px){.button.logo-button svg{display:none}}.embed .detailed-status,.public-layout .detailed-status{padding:15px}.embed .status,.public-layout .status{padding:15px 15px 15px 78px;min-height:50px}.embed .status__avatar,.public-layout .status__avatar{left:15px;top:17px}.embed .status__content,.public-layout .status__content{padding-top:5px}.embed .status__prepend,.public-layout .status__prepend{margin-left:78px;padding-top:15px}.embed .status__prepend-icon-wrapper,.public-layout .status__prepend-icon-wrapper{left:-32px}.embed .status .media-gallery,.embed .status__action-bar,.embed .status .video-player,.public-layout .status .media-gallery,.public-layout .status__action-bar,.public-layout .status .video-player{margin-top:10px}button.icon-button i.fa-retweet{background-image:url(\"data:image/svg+xml;utf8,\")}button.icon-button i.fa-retweet:hover{background-image:url(\"data:image/svg+xml;utf8,\")}button.icon-button.disabled i.fa-retweet{background-image:url(\"data:image/svg+xml;utf8,\")}.app-body{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.animated-number{display:inline-flex;flex-direction:column;align-items:stretch;overflow:hidden;position:relative}.link-button{display:block;font-size:15px;line-height:20px;color:#d8a070;border:0;background:transparent;padding:0;cursor:pointer}.link-button:hover,.link-button:active{text-decoration:underline}.link-button:disabled{color:#9baec8;cursor:default}.button{background-color:#d8a070;border:10px none;border-radius:4px;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-family:inherit;font-size:14px;font-weight:500;height:36px;letter-spacing:0;line-height:36px;overflow:hidden;padding:0 16px;position:relative;text-align:center;text-transform:uppercase;text-decoration:none;text-overflow:ellipsis;transition:all 100ms ease-in;white-space:nowrap;width:auto}.button:active,.button:focus,.button:hover{background-color:#e3bb98;transition:all 200ms ease-out}.button--destructive{transition:none}.button--destructive:active,.button--destructive:focus,.button--destructive:hover{background-color:#df405a;transition:none}.button:disabled,.button.disabled{background-color:#9baec8;cursor:default}.button::-moz-focus-inner{border:0}.button::-moz-focus-inner,.button:focus,.button:active{outline:0 !important}.button.button-primary,.button.button-alternative,.button.button-secondary,.button.button-alternative-2{font-size:16px;line-height:36px;height:auto;text-transform:none;padding:4px 16px}.button.button-alternative{color:#121a24;background:#9baec8}.button.button-alternative:active,.button.button-alternative:focus,.button.button-alternative:hover{background-color:#a8b9cf}.button.button-alternative-2{background:#3e5a7c}.button.button-alternative-2:active,.button.button-alternative-2:focus,.button.button-alternative-2:hover{background-color:#45648a}.button.button-secondary{color:#9baec8;background:transparent;padding:3px 15px;border:1px solid #9baec8}.button.button-secondary:active,.button.button-secondary:focus,.button.button-secondary:hover{border-color:#a8b9cf;color:#a8b9cf}.button.button-secondary:disabled{opacity:.5}.button.button--block{display:block;width:100%}.column__wrapper{display:flex;flex:1 1 auto;position:relative}.icon-button{display:inline-block;padding:0;color:#3e5a7c;border:0;border-radius:4px;background:transparent;cursor:pointer;transition:all 100ms ease-in;transition-property:background-color,color}.icon-button:hover,.icon-button:active,.icon-button:focus{color:#4a6b94;background-color:rgba(62,90,124,.15);transition:all 200ms ease-out;transition-property:background-color,color}.icon-button:focus{background-color:rgba(62,90,124,.3)}.icon-button.disabled{color:#283a50;background-color:transparent;cursor:default}.icon-button.active{color:#d8a070}.icon-button::-moz-focus-inner{border:0}.icon-button::-moz-focus-inner,.icon-button:focus,.icon-button:active{outline:0 !important}.icon-button.inverted{color:#3e5a7c}.icon-button.inverted:hover,.icon-button.inverted:active,.icon-button.inverted:focus{color:#324965;background-color:rgba(62,90,124,.15)}.icon-button.inverted:focus{background-color:rgba(62,90,124,.3)}.icon-button.inverted.disabled{color:#4a6b94;background-color:transparent}.icon-button.inverted.active{color:#d8a070}.icon-button.inverted.active.disabled{color:#e6c3a4}.icon-button.overlayed{box-sizing:content-box;background:rgba(0,0,0,.6);color:rgba(255,255,255,.7);border-radius:4px;padding:2px}.icon-button.overlayed:hover{background:rgba(0,0,0,.9)}.text-icon-button{color:#3e5a7c;border:0;border-radius:4px;background:transparent;cursor:pointer;font-weight:600;font-size:11px;padding:0 3px;line-height:27px;outline:0;transition:all 100ms ease-in;transition-property:background-color,color}.text-icon-button:hover,.text-icon-button:active,.text-icon-button:focus{color:#324965;background-color:rgba(62,90,124,.15);transition:all 200ms ease-out;transition-property:background-color,color}.text-icon-button:focus{background-color:rgba(62,90,124,.3)}.text-icon-button.disabled{color:#6b8cb5;background-color:transparent;cursor:default}.text-icon-button.active{color:#d8a070}.text-icon-button::-moz-focus-inner{border:0}.text-icon-button::-moz-focus-inner,.text-icon-button:focus,.text-icon-button:active{outline:0 !important}.dropdown-menu{position:absolute}.invisible{font-size:0;line-height:0;display:inline-block;width:0;height:0;position:absolute}.invisible img,.invisible svg{margin:0 !important;border:0 !important;padding:0 !important;width:0 !important;height:0 !important}.ellipsis::after{content:\"…\"}.compose-form{padding:10px}.compose-form__sensitive-button{padding:10px;padding-top:0;font-size:14px;font-weight:500}.compose-form__sensitive-button.active{color:#d8a070}.compose-form__sensitive-button input[type=checkbox]{display:none}.compose-form__sensitive-button .checkbox{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:4px;vertical-align:middle}.compose-form__sensitive-button .checkbox.active{border-color:#d8a070;background:#d8a070}.compose-form .compose-form__warning{color:#121a24;margin-bottom:10px;background:#9baec8;box-shadow:0 2px 6px rgba(0,0,0,.3);padding:8px 10px;border-radius:4px;font-size:13px;font-weight:400}.compose-form .compose-form__warning strong{color:#121a24;font-weight:500}.compose-form .compose-form__warning strong:lang(ja){font-weight:700}.compose-form .compose-form__warning strong:lang(ko){font-weight:700}.compose-form .compose-form__warning strong:lang(zh-CN){font-weight:700}.compose-form .compose-form__warning strong:lang(zh-HK){font-weight:700}.compose-form .compose-form__warning strong:lang(zh-TW){font-weight:700}.compose-form .compose-form__warning a{color:#3e5a7c;font-weight:500;text-decoration:underline}.compose-form .compose-form__warning a:hover,.compose-form .compose-form__warning a:active,.compose-form .compose-form__warning a:focus{text-decoration:none}.compose-form .emoji-picker-dropdown{position:absolute;top:0;right:0}.compose-form .compose-form__autosuggest-wrapper{position:relative}.compose-form .autosuggest-textarea,.compose-form .autosuggest-input,.compose-form .spoiler-input{position:relative;width:100%}.compose-form .spoiler-input{height:0;transform-origin:bottom;opacity:0}.compose-form .spoiler-input.spoiler-input--visible{height:36px;margin-bottom:11px;opacity:1}.compose-form .autosuggest-textarea__textarea,.compose-form .spoiler-input__input{display:block;box-sizing:border-box;width:100%;margin:0;color:#121a24;background:#fff;padding:10px;font-family:inherit;font-size:14px;resize:vertical;border:0;outline:0}.compose-form .autosuggest-textarea__textarea::placeholder,.compose-form .spoiler-input__input::placeholder{color:#3e5a7c}.compose-form .autosuggest-textarea__textarea:focus,.compose-form .spoiler-input__input:focus{outline:0}@media screen and (max-width: 600px){.compose-form .autosuggest-textarea__textarea,.compose-form .spoiler-input__input{font-size:16px}}.compose-form .spoiler-input__input{border-radius:4px}.compose-form .autosuggest-textarea__textarea{min-height:100px;border-radius:4px 4px 0 0;padding-bottom:0;padding-right:32px;resize:none;scrollbar-color:initial}.compose-form .autosuggest-textarea__textarea::-webkit-scrollbar{all:unset}@media screen and (max-width: 600px){.compose-form .autosuggest-textarea__textarea{height:100px !important;resize:vertical}}.compose-form .autosuggest-textarea__suggestions-wrapper{position:relative;height:0}.compose-form .autosuggest-textarea__suggestions{box-sizing:border-box;display:none;position:absolute;top:100%;width:100%;z-index:99;box-shadow:4px 4px 6px rgba(0,0,0,.4);background:#d9e1e8;border-radius:0 0 4px 4px;color:#121a24;font-size:14px;padding:6px}.compose-form .autosuggest-textarea__suggestions.autosuggest-textarea__suggestions--visible{display:block}.compose-form .autosuggest-textarea__suggestions__item{padding:10px;cursor:pointer;border-radius:4px}.compose-form .autosuggest-textarea__suggestions__item:hover,.compose-form .autosuggest-textarea__suggestions__item:focus,.compose-form .autosuggest-textarea__suggestions__item:active,.compose-form .autosuggest-textarea__suggestions__item.selected{background:#b9c8d5}.compose-form .autosuggest-account,.compose-form .autosuggest-emoji,.compose-form .autosuggest-hashtag{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;line-height:18px;font-size:14px}.compose-form .autosuggest-hashtag{justify-content:space-between}.compose-form .autosuggest-hashtag__name{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.compose-form .autosuggest-hashtag strong{font-weight:500}.compose-form .autosuggest-hashtag__uses{flex:0 0 auto;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.compose-form .autosuggest-account-icon,.compose-form .autosuggest-emoji img{display:block;margin-right:8px;width:16px;height:16px}.compose-form .autosuggest-account .display-name__account{color:#3e5a7c}.compose-form .compose-form__modifiers{color:#121a24;font-family:inherit;font-size:14px;background:#fff}.compose-form .compose-form__modifiers .compose-form__upload-wrapper{overflow:hidden}.compose-form .compose-form__modifiers .compose-form__uploads-wrapper{display:flex;flex-direction:row;padding:5px;flex-wrap:wrap}.compose-form .compose-form__modifiers .compose-form__upload{flex:1 1 0;min-width:40%;margin:5px}.compose-form .compose-form__modifiers .compose-form__upload__actions{background:linear-gradient(180deg, rgba(0, 0, 0, 0.8) 0, rgba(0, 0, 0, 0.35) 80%, transparent);display:flex;align-items:flex-start;justify-content:space-between;opacity:0;transition:opacity .1s ease}.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button{flex:0 1 auto;color:#d9e1e8;font-size:14px;font-weight:500;padding:10px;font-family:inherit}.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button:hover,.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button:focus,.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button:active{color:#eff3f5}.compose-form .compose-form__modifiers .compose-form__upload__actions.active{opacity:1}.compose-form .compose-form__modifiers .compose-form__upload-description{position:absolute;z-index:2;bottom:0;left:0;right:0;box-sizing:border-box;background:linear-gradient(0deg, rgba(0, 0, 0, 0.8) 0, rgba(0, 0, 0, 0.35) 80%, transparent);padding:10px;opacity:0;transition:opacity .1s ease}.compose-form .compose-form__modifiers .compose-form__upload-description textarea{background:transparent;color:#d9e1e8;border:0;padding:0;margin:0;width:100%;font-family:inherit;font-size:14px;font-weight:500}.compose-form .compose-form__modifiers .compose-form__upload-description textarea:focus{color:#fff}.compose-form .compose-form__modifiers .compose-form__upload-description textarea::placeholder{opacity:.75;color:#d9e1e8}.compose-form .compose-form__modifiers .compose-form__upload-description.active{opacity:1}.compose-form .compose-form__modifiers .compose-form__upload-thumbnail{border-radius:4px;background-color:#000;background-position:center;background-size:cover;background-repeat:no-repeat;height:140px;width:100%;overflow:hidden}.compose-form .compose-form__buttons-wrapper{padding:10px;background:#ebebeb;border-radius:0 0 4px 4px;display:flex;justify-content:space-between;flex:0 0 auto}.compose-form .compose-form__buttons-wrapper .compose-form__buttons{display:flex}.compose-form .compose-form__buttons-wrapper .compose-form__buttons .compose-form__upload-button-icon{line-height:27px}.compose-form .compose-form__buttons-wrapper .compose-form__buttons .compose-form__sensitive-button{display:none}.compose-form .compose-form__buttons-wrapper .compose-form__buttons .compose-form__sensitive-button.compose-form__sensitive-button--visible{display:block}.compose-form .compose-form__buttons-wrapper .compose-form__buttons .compose-form__sensitive-button .compose-form__sensitive-button__icon{line-height:27px}.compose-form .compose-form__buttons-wrapper .icon-button,.compose-form .compose-form__buttons-wrapper .text-icon-button{box-sizing:content-box;padding:0 3px}.compose-form .compose-form__buttons-wrapper .character-counter__wrapper{align-self:center;margin-right:4px}.compose-form .compose-form__publish{display:flex;justify-content:flex-end;min-width:0;flex:0 0 auto}.compose-form .compose-form__publish .compose-form__publish-button-wrapper{overflow:hidden;padding-top:10px}.character-counter{cursor:default;font-family:\"mastodon-font-sans-serif\",sans-serif;font-size:14px;font-weight:600;color:#3e5a7c}.character-counter.character-counter--over{color:#ff5050}.no-reduce-motion .spoiler-input{transition:height .4s ease,opacity .4s ease}.emojione{font-size:inherit;vertical-align:middle;object-fit:contain;margin:-0.2ex .15em .2ex;width:16px;height:16px}.emojione img{width:auto}.reply-indicator{border-radius:4px;margin-bottom:10px;background:#9baec8;padding:10px;min-height:23px;overflow-y:auto;flex:0 2 auto}.reply-indicator__header{margin-bottom:5px;overflow:hidden}.reply-indicator__cancel{float:right;line-height:24px}.reply-indicator__display-name{color:#121a24;display:block;max-width:100%;line-height:24px;overflow:hidden;padding-right:25px;text-decoration:none}.reply-indicator__display-avatar{float:left;margin-right:5px}.status__content--with-action{cursor:pointer}.status__content,.reply-indicator__content{position:relative;font-size:15px;line-height:20px;word-wrap:break-word;font-weight:400;overflow:hidden;text-overflow:ellipsis;padding-top:2px;color:#fff}.status__content:focus,.reply-indicator__content:focus{outline:0}.status__content.status__content--with-spoiler,.reply-indicator__content.status__content--with-spoiler{white-space:normal}.status__content.status__content--with-spoiler .status__content__text,.reply-indicator__content.status__content--with-spoiler .status__content__text{white-space:pre-wrap}.status__content .emojione,.reply-indicator__content .emojione{width:20px;height:20px;margin:-3px 0 0}.status__content img,.reply-indicator__content img{max-width:100%;max-height:400px;object-fit:contain}.status__content p,.reply-indicator__content p{margin-bottom:20px;white-space:pre-wrap}.status__content p:last-child,.reply-indicator__content p:last-child{margin-bottom:0}.status__content a,.reply-indicator__content a{color:#d8a070;text-decoration:none}.status__content a:hover,.reply-indicator__content a:hover{text-decoration:underline}.status__content a:hover .fa,.reply-indicator__content a:hover .fa{color:#4a6b94}.status__content a.mention:hover,.reply-indicator__content a.mention:hover{text-decoration:none}.status__content a.mention:hover span,.reply-indicator__content a.mention:hover span{text-decoration:underline}.status__content a .fa,.reply-indicator__content a .fa{color:#3e5a7c}.status__content a.unhandled-link,.reply-indicator__content a.unhandled-link{color:#e1b590}.status__content .status__content__spoiler-link,.reply-indicator__content .status__content__spoiler-link{background:#3e5a7c}.status__content .status__content__spoiler-link:hover,.reply-indicator__content .status__content__spoiler-link:hover{background:#4a6b94;text-decoration:none}.status__content .status__content__spoiler-link::-moz-focus-inner,.reply-indicator__content .status__content__spoiler-link::-moz-focus-inner{border:0}.status__content .status__content__spoiler-link::-moz-focus-inner,.status__content .status__content__spoiler-link:focus,.status__content .status__content__spoiler-link:active,.reply-indicator__content .status__content__spoiler-link::-moz-focus-inner,.reply-indicator__content .status__content__spoiler-link:focus,.reply-indicator__content .status__content__spoiler-link:active{outline:0 !important}.status__content .status__content__text,.reply-indicator__content .status__content__text{display:none}.status__content .status__content__text.status__content__text--visible,.reply-indicator__content .status__content__text.status__content__text--visible{display:block}.announcements__item__content{word-wrap:break-word;overflow-y:auto}.announcements__item__content .emojione{width:20px;height:20px;margin:-3px 0 0}.announcements__item__content p{margin-bottom:10px;white-space:pre-wrap}.announcements__item__content p:last-child{margin-bottom:0}.announcements__item__content a{color:#d9e1e8;text-decoration:none}.announcements__item__content a:hover{text-decoration:underline}.announcements__item__content a.mention:hover{text-decoration:none}.announcements__item__content a.mention:hover span{text-decoration:underline}.announcements__item__content a.unhandled-link{color:#e1b590}.status__content.status__content--collapsed{max-height:300px}.status__content__read-more-button{display:block;font-size:15px;line-height:20px;color:#e1b590;border:0;background:transparent;padding:0;padding-top:8px;text-decoration:none}.status__content__read-more-button:hover,.status__content__read-more-button:active{text-decoration:underline}.status__content__spoiler-link{display:inline-block;border-radius:2px;background:transparent;border:0;color:#121a24;font-weight:700;font-size:11px;padding:0 6px;text-transform:uppercase;line-height:20px;cursor:pointer;vertical-align:middle}.status__wrapper--filtered{color:#3e5a7c;border:0;font-size:inherit;text-align:center;line-height:inherit;margin:0;padding:15px;box-sizing:border-box;width:100%;clear:both;border-bottom:1px solid #202e3f}.status__prepend-icon-wrapper{left:-26px;position:absolute}.focusable:focus{outline:0;background:#192432}.focusable:focus .status.status-direct{background:#26374d}.focusable:focus .status.status-direct.muted{background:transparent}.focusable:focus .detailed-status,.focusable:focus .detailed-status__action-bar{background:#202e3f}.status{padding:8px 10px;padding-left:68px;position:relative;min-height:54px;border-bottom:1px solid #202e3f;cursor:default;opacity:1;animation:fade 150ms linear}@supports(-ms-overflow-style: -ms-autohiding-scrollbar){.status{padding-right:26px}}@keyframes fade{0%{opacity:0}100%{opacity:1}}.status .video-player,.status .audio-player{margin-top:8px}.status.status-direct:not(.read){background:#202e3f;border-bottom-color:#26374d}.status.light .status__relative-time{color:#9baec8}.status.light .status__display-name{color:#121a24}.status.light .display-name{color:#9baec8}.status.light .display-name strong{color:#121a24}.status.light .status__content{color:#121a24}.status.light .status__content a{color:#d8a070}.status.light .status__content a.status__content__spoiler-link{color:#fff;background:#9baec8}.status.light .status__content a.status__content__spoiler-link:hover{background:#b5c3d6}.notification-favourite .status.status-direct{background:transparent}.notification-favourite .status.status-direct .icon-button.disabled{color:#547aa9}.status__relative-time,.notification__relative_time{color:#3e5a7c;float:right;font-size:14px}.status__display-name{color:#3e5a7c}.status__info .status__display-name{display:block;max-width:100%;padding-right:25px}.status__info{font-size:15px}.status-check-box{border-bottom:1px solid #d9e1e8;display:flex}.status-check-box .status-check-box__status{margin:10px 0 10px 10px;flex:1;overflow:hidden}.status-check-box .status-check-box__status .media-gallery{max-width:250px}.status-check-box .status-check-box__status .status__content{padding:0;white-space:normal}.status-check-box .status-check-box__status .video-player,.status-check-box .status-check-box__status .audio-player{margin-top:8px;max-width:250px}.status-check-box .status-check-box__status .media-gallery__item-thumbnail{cursor:default}.status-check-box-toggle{align-items:center;display:flex;flex:0 0 auto;justify-content:center;padding:10px}.status__prepend{margin-left:68px;color:#3e5a7c;padding:8px 0;padding-bottom:2px;font-size:14px;position:relative}.status__prepend .status__display-name strong{color:#3e5a7c}.status__prepend>span{display:block;overflow:hidden;text-overflow:ellipsis}.status__action-bar{align-items:center;display:flex;margin-top:8px}.status__action-bar__counter{display:inline-flex;margin-right:11px;align-items:center}.status__action-bar__counter .status__action-bar-button{margin-right:4px}.status__action-bar__counter__label{display:inline-block;width:14px;font-size:12px;font-weight:500;color:#3e5a7c}.status__action-bar-button{margin-right:18px}.status__action-bar-dropdown{height:23.15px;width:23.15px}.detailed-status__action-bar-dropdown{flex:1 1 auto;display:flex;align-items:center;justify-content:center;position:relative}.detailed-status{background:#192432;padding:14px 10px}.detailed-status--flex{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-start}.detailed-status--flex .status__content,.detailed-status--flex .detailed-status__meta{flex:100%}.detailed-status .status__content{font-size:19px;line-height:24px}.detailed-status .status__content .emojione{width:24px;height:24px;margin:-1px 0 0}.detailed-status .status__content .status__content__spoiler-link{line-height:24px;margin:-1px 0 0}.detailed-status .video-player,.detailed-status .audio-player{margin-top:8px}.detailed-status__meta{margin-top:15px;color:#3e5a7c;font-size:14px;line-height:18px}.detailed-status__action-bar{background:#192432;border-top:1px solid #202e3f;border-bottom:1px solid #202e3f;display:flex;flex-direction:row;padding:10px 0}.detailed-status__link{color:inherit;text-decoration:none}.detailed-status__favorites,.detailed-status__reblogs{display:inline-block;font-weight:500;font-size:12px;margin-left:6px}.reply-indicator__content{color:#121a24;font-size:14px}.reply-indicator__content a{color:#3e5a7c}.domain{padding:10px;border-bottom:1px solid #202e3f}.domain .domain__domain-name{flex:1 1 auto;display:block;color:#fff;text-decoration:none;font-size:14px;font-weight:500}.domain__wrapper{display:flex}.domain_buttons{height:18px;padding:10px;white-space:nowrap}.account{padding:10px;border-bottom:1px solid #202e3f}.account.compact{padding:0;border-bottom:0}.account.compact .account__avatar-wrapper{margin-left:0}.account .account__display-name{flex:1 1 auto;display:block;color:#9baec8;overflow:hidden;text-decoration:none;font-size:14px}.account__wrapper{display:flex}.account__avatar-wrapper{float:left;margin-left:12px;margin-right:12px}.account__avatar{border-radius:4px;background:transparent no-repeat;background-position:50%;background-clip:padding-box;position:relative}.account__avatar-inline{display:inline-block;vertical-align:middle;margin-right:5px}.account__avatar-composite{border-radius:4px;background:transparent no-repeat;background-position:50%;background-clip:padding-box;border-radius:50%;overflow:hidden;position:relative}.account__avatar-composite>div{float:left;position:relative;box-sizing:border-box}.account__avatar-composite__label{display:block;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);color:#fff;text-shadow:1px 1px 2px #000;font-weight:700;font-size:15px}a .account__avatar{cursor:pointer}.account__avatar-overlay{width:48px;height:48px;background-size:48px 48px}.account__avatar-overlay-base{border-radius:4px;background:transparent no-repeat;background-position:50%;background-clip:padding-box;width:36px;height:36px;background-size:36px 36px}.account__avatar-overlay-overlay{border-radius:4px;background:transparent no-repeat;background-position:50%;background-clip:padding-box;width:24px;height:24px;background-size:24px 24px;position:absolute;bottom:0;right:0;z-index:1}.account__relationship{height:18px;padding:10px;white-space:nowrap}.account__disclaimer{padding:10px;border-top:1px solid #202e3f;color:#3e5a7c}.account__disclaimer strong{font-weight:500}.account__disclaimer strong:lang(ja){font-weight:700}.account__disclaimer strong:lang(ko){font-weight:700}.account__disclaimer strong:lang(zh-CN){font-weight:700}.account__disclaimer strong:lang(zh-HK){font-weight:700}.account__disclaimer strong:lang(zh-TW){font-weight:700}.account__disclaimer a{font-weight:500;color:inherit;text-decoration:underline}.account__disclaimer a:hover,.account__disclaimer a:focus,.account__disclaimer a:active{text-decoration:none}.account__action-bar{border-top:1px solid #202e3f;border-bottom:1px solid #202e3f;line-height:36px;overflow:hidden;flex:0 0 auto;display:flex}.account__action-bar-dropdown{padding:10px}.account__action-bar-dropdown .icon-button{vertical-align:middle}.account__action-bar-dropdown .dropdown--active .dropdown__content.dropdown__right{left:6px;right:initial}.account__action-bar-dropdown .dropdown--active::after{bottom:initial;margin-left:11px;margin-top:-7px;right:initial}.account__action-bar-links{display:flex;flex:1 1 auto;line-height:18px;text-align:center}.account__action-bar__tab{text-decoration:none;overflow:hidden;flex:0 1 100%;border-right:1px solid #202e3f;padding:10px 0;border-bottom:4px solid transparent}.account__action-bar__tab.active{border-bottom:4px solid #d8a070}.account__action-bar__tab>span{display:block;text-transform:uppercase;font-size:11px;color:#9baec8}.account__action-bar__tab strong{display:block;font-size:15px;font-weight:500;color:#fff}.account__action-bar__tab strong:lang(ja){font-weight:700}.account__action-bar__tab strong:lang(ko){font-weight:700}.account__action-bar__tab strong:lang(zh-CN){font-weight:700}.account__action-bar__tab strong:lang(zh-HK){font-weight:700}.account__action-bar__tab strong:lang(zh-TW){font-weight:700}.account-authorize{padding:14px 10px}.account-authorize .detailed-status__display-name{display:block;margin-bottom:15px;overflow:hidden}.account-authorize__avatar{float:left;margin-right:10px}.status__display-name,.status__relative-time,.detailed-status__display-name,.detailed-status__datetime,.detailed-status__application,.account__display-name{text-decoration:none}.status__display-name strong,.account__display-name strong{color:#fff}.muted .emojione{opacity:.5}.status__display-name:hover strong,.reply-indicator__display-name:hover strong,.detailed-status__display-name:hover strong,a.account__display-name:hover strong{text-decoration:underline}.account__display-name strong{display:block;overflow:hidden;text-overflow:ellipsis}.detailed-status__application,.detailed-status__datetime{color:inherit}.detailed-status .button.logo-button{margin-bottom:15px}.detailed-status__display-name{color:#d9e1e8;display:block;line-height:24px;margin-bottom:15px;overflow:hidden}.detailed-status__display-name strong,.detailed-status__display-name span{display:block;text-overflow:ellipsis;overflow:hidden}.detailed-status__display-name strong{font-size:16px;color:#fff}.detailed-status__display-avatar{float:left;margin-right:10px}.status__avatar{height:48px;left:10px;position:absolute;top:10px;width:48px}.status__expand{width:68px;position:absolute;left:0;top:0;height:100%;cursor:pointer}.muted .status__content,.muted .status__content p,.muted .status__content a{color:#3e5a7c}.muted .status__display-name strong{color:#3e5a7c}.muted .status__avatar{opacity:.5}.muted a.status__content__spoiler-link{background:#3e5a7c;color:#121a24}.muted a.status__content__spoiler-link:hover{background:#4a6b94;text-decoration:none}.notification__message{margin:0 10px 0 68px;padding:8px 0 0;cursor:default;color:#9baec8;font-size:15px;line-height:22px;position:relative}.notification__message .fa{color:#d8a070}.notification__message>span{display:inline;overflow:hidden;text-overflow:ellipsis}.notification__favourite-icon-wrapper{left:-26px;position:absolute}.notification__favourite-icon-wrapper .star-icon{color:#ca8f04}.star-icon.active{color:#ca8f04}.bookmark-icon.active{color:#ff5050}.no-reduce-motion .icon-button.star-icon.activate>.fa-star{animation:spring-rotate-in 1s linear}.no-reduce-motion .icon-button.star-icon.deactivate>.fa-star{animation:spring-rotate-out 1s linear}.notification__display-name{color:inherit;font-weight:500;text-decoration:none}.notification__display-name:hover{color:#fff;text-decoration:underline}.notification__relative_time{float:right}.display-name{display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.display-name__html{font-weight:500}.display-name__account{font-size:14px}.status__relative-time:hover,.detailed-status__datetime:hover{text-decoration:underline}.image-loader{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center;flex-direction:column}.image-loader .image-loader__preview-canvas{max-width:100%;max-height:80%;background:url(\"~images/void.png\") repeat;object-fit:contain}.image-loader .loading-bar{position:relative}.image-loader.image-loader--amorphous .image-loader__preview-canvas{display:none}.zoomable-image{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center}.zoomable-image img{max-width:100%;max-height:80%;width:auto;height:auto;object-fit:contain}.navigation-bar{padding:10px;display:flex;align-items:center;flex-shrink:0;cursor:default;color:#9baec8}.navigation-bar strong{color:#d9e1e8}.navigation-bar a{color:inherit}.navigation-bar .permalink{text-decoration:none}.navigation-bar .navigation-bar__actions{position:relative}.navigation-bar .navigation-bar__actions .icon-button.close{position:absolute;pointer-events:none;transform:scale(0, 1) translate(-100%, 0);opacity:0}.navigation-bar .navigation-bar__actions .compose__action-bar .icon-button{pointer-events:auto;transform:scale(1, 1) translate(0, 0);opacity:1}.navigation-bar__profile{flex:1 1 auto;margin-left:8px;line-height:20px;margin-top:-1px;overflow:hidden}.navigation-bar__profile-account{display:block;font-weight:500;overflow:hidden;text-overflow:ellipsis}.navigation-bar__profile-edit{color:inherit;text-decoration:none}.dropdown{display:inline-block}.dropdown__content{display:none;position:absolute}.dropdown-menu__separator{border-bottom:1px solid #c0cdd9;margin:5px 7px 6px;height:0}.dropdown-menu{background:#d9e1e8;padding:4px 0;border-radius:4px;box-shadow:2px 4px 15px rgba(0,0,0,.4);z-index:9999}.dropdown-menu ul{list-style:none}.dropdown-menu.left{transform-origin:100% 50%}.dropdown-menu.top{transform-origin:50% 100%}.dropdown-menu.bottom{transform-origin:50% 0}.dropdown-menu.right{transform-origin:0 50%}.dropdown-menu__arrow{position:absolute;width:0;height:0;border:0 solid transparent}.dropdown-menu__arrow.left{right:-5px;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#d9e1e8}.dropdown-menu__arrow.top{bottom:-5px;margin-left:-7px;border-width:5px 7px 0;border-top-color:#d9e1e8}.dropdown-menu__arrow.bottom{top:-5px;margin-left:-7px;border-width:0 7px 5px;border-bottom-color:#d9e1e8}.dropdown-menu__arrow.right{left:-5px;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#d9e1e8}.dropdown-menu__item a{font-size:13px;line-height:18px;display:block;padding:4px 14px;box-sizing:border-box;text-decoration:none;background:#d9e1e8;color:#121a24;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown-menu__item a:focus,.dropdown-menu__item a:hover,.dropdown-menu__item a:active{background:#d8a070;color:#d9e1e8;outline:0}.dropdown--active .dropdown__content{display:block;line-height:18px;max-width:311px;right:0;text-align:left;z-index:9999}.dropdown--active .dropdown__content>ul{list-style:none;background:#d9e1e8;padding:4px 0;border-radius:4px;box-shadow:0 0 15px rgba(0,0,0,.4);min-width:140px;position:relative}.dropdown--active .dropdown__content.dropdown__right{right:0}.dropdown--active .dropdown__content.dropdown__left>ul{left:-98px}.dropdown--active .dropdown__content>ul>li>a{font-size:13px;line-height:18px;display:block;padding:4px 14px;box-sizing:border-box;text-decoration:none;background:#d9e1e8;color:#121a24;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown--active .dropdown__content>ul>li>a:focus{outline:0}.dropdown--active .dropdown__content>ul>li>a:hover{background:#d8a070;color:#d9e1e8}.dropdown__icon{vertical-align:middle}.columns-area{display:flex;flex:1 1 auto;flex-direction:row;justify-content:flex-start;overflow-x:auto;position:relative}.columns-area.unscrollable{overflow-x:hidden}.columns-area__panels{display:flex;justify-content:center;width:100%;height:100%;min-height:100vh}.columns-area__panels__pane{height:100%;overflow:hidden;pointer-events:none;display:flex;justify-content:flex-end;min-width:285px}.columns-area__panels__pane--start{justify-content:flex-start}.columns-area__panels__pane__inner{position:fixed;width:285px;pointer-events:auto;height:100%}.columns-area__panels__main{box-sizing:border-box;width:100%;max-width:600px;flex:0 0 auto;display:flex;flex-direction:column}@media screen and (min-width: 415px){.columns-area__panels__main{padding:0 10px}}.tabs-bar__wrapper{background:#040609;position:sticky;top:0;z-index:2;padding-top:0}@media screen and (min-width: 415px){.tabs-bar__wrapper{padding-top:10px}}.tabs-bar__wrapper .tabs-bar{margin-bottom:0}@media screen and (min-width: 415px){.tabs-bar__wrapper .tabs-bar{margin-bottom:10px}}.react-swipeable-view-container,.react-swipeable-view-container .columns-area,.react-swipeable-view-container .drawer,.react-swipeable-view-container .column{height:100%}.react-swipeable-view-container>*{display:flex;align-items:center;justify-content:center;height:100%}.column{width:350px;position:relative;box-sizing:border-box;display:flex;flex-direction:column}.column>.scrollable{background:#121a24;border-bottom-left-radius:2px;border-bottom-right-radius:2px}.ui{flex:0 0 auto;display:flex;flex-direction:column;width:100%;height:100%}.drawer{width:330px;box-sizing:border-box;display:flex;flex-direction:column;overflow-y:hidden}.drawer__tab{display:block;flex:1 1 auto;padding:15px 5px 13px;color:#9baec8;text-decoration:none;text-align:center;font-size:16px;border-bottom:2px solid transparent}.column,.drawer{flex:1 1 auto;overflow:hidden}@media screen and (min-width: 631px){.columns-area{padding:0}.column,.drawer{flex:0 0 auto;padding:10px;padding-left:5px;padding-right:5px}.column:first-child,.drawer:first-child{padding-left:10px}.column:last-child,.drawer:last-child{padding-right:10px}.columns-area>div .column,.columns-area>div .drawer{padding-left:5px;padding-right:5px}}.tabs-bar{box-sizing:border-box;display:flex;background:#202e3f;flex:0 0 auto;overflow-y:auto}.tabs-bar__link{display:block;flex:1 1 auto;padding:15px 10px;padding-bottom:13px;color:#fff;text-decoration:none;text-align:center;font-size:14px;font-weight:500;border-bottom:2px solid #202e3f;transition:all 50ms linear;transition-property:border-bottom,background,color}.tabs-bar__link .fa{font-weight:400;font-size:16px}@media screen and (min-width: 631px){.tabs-bar__link:hover,.tabs-bar__link:focus,.tabs-bar__link:active{background:#2a3c54;border-bottom-color:#2a3c54}}.tabs-bar__link.active{border-bottom:2px solid #d8a070;color:#d8a070}.tabs-bar__link span{margin-left:5px;display:none}@media screen and (min-width: 600px){.tabs-bar__link span{display:inline}}.columns-area--mobile{flex-direction:column;width:100%;height:100%;margin:0 auto}.columns-area--mobile .column,.columns-area--mobile .drawer{width:100%;height:100%;padding:0}.columns-area--mobile .directory__list{display:grid;grid-gap:10px;grid-template-columns:minmax(0, 50%) minmax(0, 50%)}@media screen and (max-width: 415px){.columns-area--mobile .directory__list{display:block}}.columns-area--mobile .directory__card{margin-bottom:0}.columns-area--mobile .filter-form{display:flex}.columns-area--mobile .autosuggest-textarea__textarea{font-size:16px}.columns-area--mobile .search__input{line-height:18px;font-size:16px;padding:15px;padding-right:30px}.columns-area--mobile .search__icon .fa{top:15px}.columns-area--mobile .scrollable{overflow:visible}@supports(display: grid){.columns-area--mobile .scrollable{contain:content}}@media screen and (min-width: 415px){.columns-area--mobile{padding:10px 0;padding-top:0}}@media screen and (min-width: 630px){.columns-area--mobile .detailed-status{padding:15px}.columns-area--mobile .detailed-status .media-gallery,.columns-area--mobile .detailed-status .video-player,.columns-area--mobile .detailed-status .audio-player{margin-top:15px}.columns-area--mobile .account__header__bar{padding:5px 10px}.columns-area--mobile .navigation-bar,.columns-area--mobile .compose-form{padding:15px}.columns-area--mobile .compose-form .compose-form__publish .compose-form__publish-button-wrapper{padding-top:15px}.columns-area--mobile .status{padding:15px 15px 15px 78px;min-height:50px}.columns-area--mobile .status__avatar{left:15px;top:17px}.columns-area--mobile .status__content{padding-top:5px}.columns-area--mobile .status__prepend{margin-left:78px;padding-top:15px}.columns-area--mobile .status__prepend-icon-wrapper{left:-32px}.columns-area--mobile .status .media-gallery,.columns-area--mobile .status__action-bar,.columns-area--mobile .status .video-player,.columns-area--mobile .status .audio-player{margin-top:10px}.columns-area--mobile .account{padding:15px 10px}.columns-area--mobile .account__header__bio{margin:0 -10px}.columns-area--mobile .notification__message{margin-left:78px;padding-top:15px}.columns-area--mobile .notification__favourite-icon-wrapper{left:-32px}.columns-area--mobile .notification .status{padding-top:8px}.columns-area--mobile .notification .account{padding-top:8px}.columns-area--mobile .notification .account__avatar-wrapper{margin-left:17px;margin-right:15px}}.floating-action-button{position:fixed;display:flex;justify-content:center;align-items:center;width:3.9375rem;height:3.9375rem;bottom:1.3125rem;right:1.3125rem;background:#d59864;color:#fff;border-radius:50%;font-size:21px;line-height:21px;text-decoration:none;box-shadow:2px 3px 9px rgba(0,0,0,.4)}.floating-action-button:hover,.floating-action-button:focus,.floating-action-button:active{background:#e0b38c}@media screen and (min-width: 415px){.tabs-bar{width:100%}.react-swipeable-view-container .columns-area--mobile{height:calc(100% - 10px) !important}.getting-started__wrapper,.getting-started__trends,.search{margin-bottom:10px}.getting-started__panel{margin:10px 0}.column,.drawer{min-width:330px}}@media screen and (max-width: 895px){.columns-area__panels__pane--compositional{display:none}}@media screen and (min-width: 895px){.floating-action-button,.tabs-bar__link.optional{display:none}.search-page .search{display:none}}@media screen and (max-width: 1190px){.columns-area__panels__pane--navigational{display:none}}@media screen and (min-width: 1190px){.tabs-bar{display:none}}.icon-with-badge{position:relative}.icon-with-badge__badge{position:absolute;left:9px;top:-13px;background:#d8a070;border:2px solid #202e3f;padding:1px 6px;border-radius:6px;font-size:10px;font-weight:500;line-height:14px;color:#fff}.column-link--transparent .icon-with-badge__badge{border-color:#040609}.compose-panel{width:285px;margin-top:10px;display:flex;flex-direction:column;height:calc(100% - 10px);overflow-y:hidden}.compose-panel .navigation-bar{padding-top:20px;padding-bottom:20px;flex:0 1 48px;min-height:20px}.compose-panel .flex-spacer{background:transparent}.compose-panel .compose-form{flex:1;overflow-y:hidden;display:flex;flex-direction:column;min-height:310px;padding-bottom:71px;margin-bottom:-71px}.compose-panel .compose-form__autosuggest-wrapper{overflow-y:auto;background-color:#fff;border-radius:4px 4px 0 0;flex:0 1 auto}.compose-panel .autosuggest-textarea__textarea{overflow-y:hidden}.compose-panel .compose-form__upload-thumbnail{height:80px}.navigation-panel{margin-top:10px;margin-bottom:10px;height:calc(100% - 20px);overflow-y:auto;display:flex;flex-direction:column}.navigation-panel>a{flex:0 0 auto}.navigation-panel hr{flex:0 0 auto;border:0;background:transparent;border-top:1px solid #192432;margin:10px 0}.navigation-panel .flex-spacer{background:transparent}.drawer__pager{box-sizing:border-box;padding:0;flex-grow:1;position:relative;overflow:hidden;display:flex}.drawer__inner{position:absolute;top:0;left:0;background:#283a50;box-sizing:border-box;padding:0;display:flex;flex-direction:column;overflow:hidden;overflow-y:auto;width:100%;height:100%;border-radius:2px}.drawer__inner.darker{background:#121a24}.drawer__inner__mastodon{background:#283a50 url('data:image/svg+xml;utf8,') no-repeat bottom/100% auto;flex:1;min-height:47px;display:none}.drawer__inner__mastodon>img{display:block;object-fit:contain;object-position:bottom left;width:85%;height:100%;pointer-events:none;user-drag:none;user-select:none}@media screen and (min-height: 640px){.drawer__inner__mastodon{display:block}}.pseudo-drawer{background:#283a50;font-size:13px;text-align:left}.drawer__header{flex:0 0 auto;font-size:16px;background:#202e3f;margin-bottom:10px;display:flex;flex-direction:row;border-radius:2px}.drawer__header a{transition:background 100ms ease-in}.drawer__header a:hover{background:#17212e;transition:background 200ms ease-out}.scrollable{overflow-y:scroll;overflow-x:hidden;flex:1 1 auto;-webkit-overflow-scrolling:touch}.scrollable.optionally-scrollable{overflow-y:auto}@supports(display: grid){.scrollable{contain:strict}}.scrollable--flex{display:flex;flex-direction:column}.scrollable__append{flex:1 1 auto;position:relative;min-height:120px}@supports(display: grid){.scrollable.fullscreen{contain:none}}.column-back-button{box-sizing:border-box;width:100%;background:#192432;color:#d8a070;cursor:pointer;flex:0 0 auto;font-size:16px;line-height:inherit;border:0;text-align:unset;padding:15px;margin:0;z-index:3;outline:0}.column-back-button:hover{text-decoration:underline}.column-header__back-button{background:#192432;border:0;font-family:inherit;color:#d8a070;cursor:pointer;white-space:nowrap;font-size:16px;padding:0 5px 0 0;z-index:3}.column-header__back-button:hover{text-decoration:underline}.column-header__back-button:last-child{padding:0 15px 0 0}.column-back-button__icon{display:inline-block;margin-right:5px}.column-back-button--slim{position:relative}.column-back-button--slim-button{cursor:pointer;flex:0 0 auto;font-size:16px;padding:15px;position:absolute;right:0;top:-48px}.react-toggle{display:inline-block;position:relative;cursor:pointer;background-color:transparent;border:0;padding:0;user-select:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-tap-highlight-color:transparent}.react-toggle-screenreader-only{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.react-toggle--disabled{cursor:not-allowed;opacity:.5;transition:opacity .25s}.react-toggle-track{width:50px;height:24px;padding:0;border-radius:30px;background-color:#121a24;transition:background-color .2s ease}.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track{background-color:#010102}.react-toggle--checked .react-toggle-track{background-color:#d8a070}.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track{background-color:#e3bb98}.react-toggle-track-check{position:absolute;width:14px;height:10px;top:0;bottom:0;margin-top:auto;margin-bottom:auto;line-height:0;left:8px;opacity:0;transition:opacity .25s ease}.react-toggle--checked .react-toggle-track-check{opacity:1;transition:opacity .25s ease}.react-toggle-track-x{position:absolute;width:10px;height:10px;top:0;bottom:0;margin-top:auto;margin-bottom:auto;line-height:0;right:10px;opacity:1;transition:opacity .25s ease}.react-toggle--checked .react-toggle-track-x{opacity:0}.react-toggle-thumb{position:absolute;top:1px;left:1px;width:22px;height:22px;border:1px solid #121a24;border-radius:50%;background-color:#fafafa;box-sizing:border-box;transition:all .25s ease;transition-property:border-color,left}.react-toggle--checked .react-toggle-thumb{left:27px;border-color:#d8a070}.column-link{background:#202e3f;color:#fff;display:block;font-size:16px;padding:15px;text-decoration:none}.column-link:hover,.column-link:focus,.column-link:active{background:#253549}.column-link:focus{outline:0}.column-link--transparent{background:transparent;color:#d9e1e8}.column-link--transparent:hover,.column-link--transparent:focus,.column-link--transparent:active{background:transparent;color:#fff}.column-link--transparent.active{color:#d8a070}.column-link__icon{display:inline-block;margin-right:5px}.column-link__badge{display:inline-block;border-radius:4px;font-size:12px;line-height:19px;font-weight:500;background:#121a24;padding:4px 8px;margin:-6px 10px}.column-subheading{background:#121a24;color:#3e5a7c;padding:8px 20px;font-size:12px;font-weight:500;text-transform:uppercase;cursor:default}.getting-started__wrapper,.getting-started,.flex-spacer{background:#121a24}.flex-spacer{flex:1 1 auto}.getting-started{color:#3e5a7c;overflow:auto;border-bottom-left-radius:2px;border-bottom-right-radius:2px}.getting-started__wrapper,.getting-started__panel,.getting-started__footer{height:min-content}.getting-started__panel,.getting-started__footer{padding:10px;padding-top:20px;flex-grow:0}.getting-started__panel ul,.getting-started__footer ul{margin-bottom:10px}.getting-started__panel ul li,.getting-started__footer ul li{display:inline}.getting-started__panel p,.getting-started__footer p{font-size:13px}.getting-started__panel p a,.getting-started__footer p a{color:#3e5a7c;text-decoration:underline}.getting-started__panel a,.getting-started__footer a{text-decoration:none;color:#9baec8}.getting-started__panel a:hover,.getting-started__panel a:focus,.getting-started__panel a:active,.getting-started__footer a:hover,.getting-started__footer a:focus,.getting-started__footer a:active{text-decoration:underline}.getting-started__wrapper,.getting-started__footer{color:#3e5a7c}.getting-started__trends{flex:0 1 auto;opacity:1;animation:fade 150ms linear;margin-top:10px}.getting-started__trends h4{font-size:12px;text-transform:uppercase;color:#9baec8;padding:10px;font-weight:500;border-bottom:1px solid #202e3f}@media screen and (max-height: 810px){.getting-started__trends .trends__item:nth-child(3){display:none}}@media screen and (max-height: 720px){.getting-started__trends .trends__item:nth-child(2){display:none}}@media screen and (max-height: 670px){.getting-started__trends{display:none}}.getting-started__trends .trends__item{border-bottom:0;padding:10px}.getting-started__trends .trends__item__current{color:#9baec8}.keyboard-shortcuts{padding:8px 0 0;overflow:hidden}.keyboard-shortcuts thead{position:absolute;left:-9999px}.keyboard-shortcuts td{padding:0 10px 8px}.keyboard-shortcuts kbd{display:inline-block;padding:3px 5px;background-color:#202e3f;border:1px solid #0b1016}.setting-text{display:block;box-sizing:border-box;width:100%;margin:0;color:#121a24;background:#fff;padding:10px;font-family:inherit;font-size:14px;resize:vertical;border:0;outline:0;border-radius:4px}.setting-text:focus{outline:0}@media screen and (max-width: 600px){.setting-text{font-size:16px}}.no-reduce-motion button.icon-button i.fa-retweet{background-position:0 0;height:19px;transition:background-position .9s steps(10);transition-duration:0s;vertical-align:middle;width:22px}.no-reduce-motion button.icon-button i.fa-retweet::before{display:none !important}.no-reduce-motion button.icon-button.active i.fa-retweet{transition-duration:.9s;background-position:0 100%}.reduce-motion button.icon-button i.fa-retweet{color:#3e5a7c;transition:color 100ms ease-in}.reduce-motion button.icon-button.active i.fa-retweet{color:#d8a070}.status-card{display:flex;font-size:14px;border:1px solid #202e3f;border-radius:4px;color:#3e5a7c;margin-top:14px;text-decoration:none;overflow:hidden}.status-card__actions{bottom:0;left:0;position:absolute;right:0;top:0;display:flex;justify-content:center;align-items:center}.status-card__actions>div{background:rgba(0,0,0,.6);border-radius:8px;padding:12px 9px;flex:0 0 auto;display:flex;justify-content:center;align-items:center}.status-card__actions button,.status-card__actions a{display:inline;color:#d9e1e8;background:transparent;border:0;padding:0 8px;text-decoration:none;font-size:18px;line-height:18px}.status-card__actions button:hover,.status-card__actions button:active,.status-card__actions button:focus,.status-card__actions a:hover,.status-card__actions a:active,.status-card__actions a:focus{color:#fff}.status-card__actions a{font-size:19px;position:relative;bottom:-1px}a.status-card{cursor:pointer}a.status-card:hover{background:#202e3f}.status-card-photo{cursor:zoom-in;display:block;text-decoration:none;width:100%;height:auto;margin:0}.status-card-video iframe{width:100%;height:100%}.status-card__title{display:block;font-weight:500;margin-bottom:5px;color:#9baec8;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-decoration:none}.status-card__content{flex:1 1 auto;overflow:hidden;padding:14px 14px 14px 8px}.status-card__description{color:#9baec8}.status-card__host{display:block;margin-top:5px;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-card__image{flex:0 0 100px;background:#202e3f;position:relative}.status-card__image>.fa{font-size:21px;position:absolute;transform-origin:50% 50%;top:50%;left:50%;transform:translate(-50%, -50%)}.status-card.horizontal{display:block}.status-card.horizontal .status-card__image{width:100%}.status-card.horizontal .status-card__image-image{border-radius:4px 4px 0 0}.status-card.horizontal .status-card__title{white-space:inherit}.status-card.compact{border-color:#192432}.status-card.compact.interactive{border:0}.status-card.compact .status-card__content{padding:8px;padding-top:10px}.status-card.compact .status-card__title{white-space:nowrap}.status-card.compact .status-card__image{flex:0 0 60px}a.status-card.compact:hover{background-color:#192432}.status-card__image-image{border-radius:4px 0 0 4px;display:block;margin:0;width:100%;height:100%;object-fit:cover;background-size:cover;background-position:center center}.load-more{display:block;color:#3e5a7c;background-color:transparent;border:0;font-size:inherit;text-align:center;line-height:inherit;margin:0;padding:15px;box-sizing:border-box;width:100%;clear:both;text-decoration:none}.load-more:hover{background:#151f2b}.load-gap{border-bottom:1px solid #202e3f}.regeneration-indicator{text-align:center;font-size:16px;font-weight:500;color:#3e5a7c;background:#121a24;cursor:default;display:flex;flex:1 1 auto;flex-direction:column;align-items:center;justify-content:center;padding:20px}.regeneration-indicator__figure,.regeneration-indicator__figure img{display:block;width:auto;height:160px;margin:0}.regeneration-indicator--without-header{padding-top:68px}.regeneration-indicator__label{margin-top:30px}.regeneration-indicator__label strong{display:block;margin-bottom:10px;color:#3e5a7c}.regeneration-indicator__label span{font-size:15px;font-weight:400}.column-header__wrapper{position:relative;flex:0 0 auto;z-index:1}.column-header__wrapper.active{box-shadow:0 1px 0 rgba(216,160,112,.3)}.column-header__wrapper.active::before{display:block;content:\"\";position:absolute;bottom:-13px;left:0;right:0;margin:0 auto;width:60%;pointer-events:none;height:28px;z-index:1;background:radial-gradient(ellipse, rgba(216, 160, 112, 0.23) 0%, rgba(216, 160, 112, 0) 60%)}.column-header__wrapper .announcements{z-index:1;position:relative}.column-header{display:flex;font-size:16px;background:#192432;flex:0 0 auto;cursor:pointer;position:relative;z-index:2;outline:0;overflow:hidden;border-top-left-radius:2px;border-top-right-radius:2px}.column-header>button{margin:0;border:0;padding:15px 0 15px 15px;color:inherit;background:transparent;font:inherit;text-align:left;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;flex:1}.column-header>.column-header__back-button{color:#d8a070}.column-header.active .column-header__icon{color:#d8a070;text-shadow:0 0 10px rgba(216,160,112,.4)}.column-header:focus,.column-header:active{outline:0}.column-header__buttons{height:48px;display:flex}.column-header__links{margin-bottom:14px}.column-header__links .text-btn{margin-right:10px}.column-header__button{background:#192432;border:0;color:#9baec8;cursor:pointer;font-size:16px;padding:0 15px}.column-header__button:hover{color:#b2c1d5}.column-header__button.active{color:#fff;background:#202e3f}.column-header__button.active:hover{color:#fff;background:#202e3f}.column-header__collapsible{max-height:70vh;overflow:hidden;overflow-y:auto;color:#9baec8;transition:max-height 150ms ease-in-out,opacity 300ms linear;opacity:1;z-index:1;position:relative}.column-header__collapsible.collapsed{max-height:0;opacity:.5}.column-header__collapsible.animating{overflow-y:hidden}.column-header__collapsible hr{height:0;background:transparent;border:0;border-top:1px solid #26374d;margin:10px 0}.column-header__collapsible-inner{background:#202e3f;padding:15px}.column-header__setting-btn:hover{color:#9baec8;text-decoration:underline}.column-header__setting-arrows{float:right}.column-header__setting-arrows .column-header__setting-btn{padding:0 10px}.column-header__setting-arrows .column-header__setting-btn:last-child{padding-right:0}.text-btn{display:inline-block;padding:0;font-family:inherit;font-size:inherit;color:inherit;border:0;background:transparent;cursor:pointer}.column-header__icon{display:inline-block;margin-right:5px}.loading-indicator{color:#3e5a7c;font-size:12px;font-weight:400;text-transform:uppercase;overflow:visible;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.loading-indicator span{display:block;float:left;margin-left:50%;transform:translateX(-50%);margin:82px 0 0 50%;white-space:nowrap}.loading-indicator__figure{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);width:42px;height:42px;box-sizing:border-box;background-color:transparent;border:0 solid #3e5a7c;border-width:6px;border-radius:50%}.no-reduce-motion .loading-indicator span{animation:loader-label 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1)}.no-reduce-motion .loading-indicator__figure{animation:loader-figure 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1)}@keyframes spring-rotate-in{0%{transform:rotate(0deg)}30%{transform:rotate(-484.8deg)}60%{transform:rotate(-316.7deg)}90%{transform:rotate(-375deg)}100%{transform:rotate(-360deg)}}@keyframes spring-rotate-out{0%{transform:rotate(-360deg)}30%{transform:rotate(124.8deg)}60%{transform:rotate(-43.27deg)}90%{transform:rotate(15deg)}100%{transform:rotate(0deg)}}@keyframes loader-figure{0%{width:0;height:0;background-color:#3e5a7c}29%{background-color:#3e5a7c}30%{width:42px;height:42px;background-color:transparent;border-width:21px;opacity:1}100%{width:42px;height:42px;border-width:0;opacity:0;background-color:transparent}}@keyframes loader-label{0%{opacity:.25}30%{opacity:1}100%{opacity:.25}}.video-error-cover{align-items:center;background:#000;color:#fff;cursor:pointer;display:flex;flex-direction:column;height:100%;justify-content:center;margin-top:8px;position:relative;text-align:center;z-index:100}.media-spoiler{background:#000;color:#9baec8;border:0;padding:0;width:100%;height:100%;border-radius:4px;appearance:none}.media-spoiler:hover,.media-spoiler:active,.media-spoiler:focus{padding:0;color:#b5c3d6}.media-spoiler__warning{display:block;font-size:14px}.media-spoiler__trigger{display:block;font-size:11px;font-weight:700}.spoiler-button{top:0;left:0;width:100%;height:100%;position:absolute;z-index:100}.spoiler-button--minified{display:block;left:4px;top:4px;width:auto;height:auto}.spoiler-button--click-thru{pointer-events:none}.spoiler-button--hidden{display:none}.spoiler-button__overlay{display:block;background:transparent;width:100%;height:100%;border:0}.spoiler-button__overlay__label{display:inline-block;background:rgba(0,0,0,.5);border-radius:8px;padding:8px 12px;color:#fff;font-weight:500;font-size:14px}.spoiler-button__overlay:hover .spoiler-button__overlay__label,.spoiler-button__overlay:focus .spoiler-button__overlay__label,.spoiler-button__overlay:active .spoiler-button__overlay__label{background:rgba(0,0,0,.8)}.spoiler-button__overlay:disabled .spoiler-button__overlay__label{background:rgba(0,0,0,.5)}.modal-container--preloader{background:#202e3f}.account--panel{background:#192432;border-top:1px solid #202e3f;border-bottom:1px solid #202e3f;display:flex;flex-direction:row;padding:10px 0}.account--panel__button,.detailed-status__button{flex:1 1 auto;text-align:center}.column-settings__outer{background:#202e3f;padding:15px}.column-settings__section{color:#9baec8;cursor:default;display:block;font-weight:500;margin-bottom:10px}.column-settings__hashtags .column-settings__row{margin-bottom:15px}.column-settings__hashtags .column-select__control{outline:0;box-sizing:border-box;width:100%;border:0;box-shadow:none;font-family:inherit;background:#121a24;color:#9baec8;font-size:14px;margin:0}.column-settings__hashtags .column-select__control::placeholder{color:#a8b9cf}.column-settings__hashtags .column-select__control::-moz-focus-inner{border:0}.column-settings__hashtags .column-select__control::-moz-focus-inner,.column-settings__hashtags .column-select__control:focus,.column-settings__hashtags .column-select__control:active{outline:0 !important}.column-settings__hashtags .column-select__control:focus{background:#192432}@media screen and (max-width: 600px){.column-settings__hashtags .column-select__control{font-size:16px}}.column-settings__hashtags .column-select__placeholder{color:#3e5a7c;padding-left:2px;font-size:12px}.column-settings__hashtags .column-select__value-container{padding-left:6px}.column-settings__hashtags .column-select__multi-value{background:#202e3f}.column-settings__hashtags .column-select__multi-value__remove{cursor:pointer}.column-settings__hashtags .column-select__multi-value__remove:hover,.column-settings__hashtags .column-select__multi-value__remove:active,.column-settings__hashtags .column-select__multi-value__remove:focus{background:#26374d;color:#a8b9cf}.column-settings__hashtags .column-select__multi-value__label,.column-settings__hashtags .column-select__input{color:#9baec8}.column-settings__hashtags .column-select__clear-indicator,.column-settings__hashtags .column-select__dropdown-indicator{cursor:pointer;transition:none;color:#3e5a7c}.column-settings__hashtags .column-select__clear-indicator:hover,.column-settings__hashtags .column-select__clear-indicator:active,.column-settings__hashtags .column-select__clear-indicator:focus,.column-settings__hashtags .column-select__dropdown-indicator:hover,.column-settings__hashtags .column-select__dropdown-indicator:active,.column-settings__hashtags .column-select__dropdown-indicator:focus{color:#45648a}.column-settings__hashtags .column-select__indicator-separator{background-color:#202e3f}.column-settings__hashtags .column-select__menu{background:#fff;border-radius:4px;padding:10px 14px;padding-bottom:14px;margin-top:10px;color:#9baec8;box-shadow:2px 4px 15px rgba(0,0,0,.4);padding:0;background:#d9e1e8}.column-settings__hashtags .column-select__menu h4{text-transform:uppercase;color:#9baec8;font-size:13px;font-weight:500;margin-bottom:10px}.column-settings__hashtags .column-select__menu li{padding:4px 0}.column-settings__hashtags .column-select__menu ul{margin-bottom:10px}.column-settings__hashtags .column-select__menu em{font-weight:500;color:#121a24}.column-settings__hashtags .column-select__menu-list{padding:6px}.column-settings__hashtags .column-select__option{color:#121a24;border-radius:4px;font-size:14px}.column-settings__hashtags .column-select__option--is-focused,.column-settings__hashtags .column-select__option--is-selected{background:#b9c8d5}.column-settings__row .text-btn{margin-bottom:15px}.relationship-tag{color:#fff;margin-bottom:4px;display:block;vertical-align:top;background-color:#000;text-transform:uppercase;font-size:11px;font-weight:500;padding:4px;border-radius:4px;opacity:.7}.relationship-tag:hover{opacity:1}.setting-toggle{display:block;line-height:24px}.setting-toggle__label{color:#9baec8;display:inline-block;margin-bottom:14px;margin-left:8px;vertical-align:middle}.empty-column-indicator,.error-column,.follow_requests-unlocked_explanation{color:#3e5a7c;background:#121a24;text-align:center;padding:20px;font-size:15px;font-weight:400;cursor:default;display:flex;flex:1 1 auto;align-items:center;justify-content:center}@supports(display: grid){.empty-column-indicator,.error-column,.follow_requests-unlocked_explanation{contain:strict}}.empty-column-indicator>span,.error-column>span,.follow_requests-unlocked_explanation>span{max-width:400px}.empty-column-indicator a,.error-column a,.follow_requests-unlocked_explanation a{color:#d8a070;text-decoration:none}.empty-column-indicator a:hover,.error-column a:hover,.follow_requests-unlocked_explanation a:hover{text-decoration:underline}.follow_requests-unlocked_explanation{background:#0b1016;contain:initial}.error-column{flex-direction:column}@keyframes heartbeat{from{transform:scale(1);animation-timing-function:ease-out}10%{transform:scale(0.91);animation-timing-function:ease-in}17%{transform:scale(0.98);animation-timing-function:ease-out}33%{transform:scale(0.87);animation-timing-function:ease-in}45%{transform:scale(1);animation-timing-function:ease-out}}.no-reduce-motion .pulse-loading{transform-origin:center center;animation:heartbeat 1.5s ease-in-out infinite both}@keyframes shake-bottom{0%,100%{transform:rotate(0deg);transform-origin:50% 100%}10%{transform:rotate(2deg)}20%,40%,60%{transform:rotate(-4deg)}30%,50%,70%{transform:rotate(4deg)}80%{transform:rotate(-2deg)}90%{transform:rotate(2deg)}}.no-reduce-motion .shake-bottom{transform-origin:50% 100%;animation:shake-bottom .8s cubic-bezier(0.455, 0.03, 0.515, 0.955) 2s 2 both}.emoji-picker-dropdown__menu{background:#fff;position:absolute;box-shadow:4px 4px 6px rgba(0,0,0,.4);border-radius:4px;margin-top:5px;z-index:2}.emoji-picker-dropdown__menu .emoji-mart-scroll{transition:opacity 200ms ease}.emoji-picker-dropdown__menu.selecting .emoji-mart-scroll{opacity:.5}.emoji-picker-dropdown__modifiers{position:absolute;top:60px;right:11px;cursor:pointer}.emoji-picker-dropdown__modifiers__menu{position:absolute;z-index:4;top:-4px;left:-8px;background:#fff;border-radius:4px;box-shadow:1px 2px 6px rgba(0,0,0,.2);overflow:hidden}.emoji-picker-dropdown__modifiers__menu button{display:block;cursor:pointer;border:0;padding:4px 8px;background:transparent}.emoji-picker-dropdown__modifiers__menu button:hover,.emoji-picker-dropdown__modifiers__menu button:focus,.emoji-picker-dropdown__modifiers__menu button:active{background:rgba(217,225,232,.4)}.emoji-picker-dropdown__modifiers__menu .emoji-mart-emoji{height:22px}.emoji-mart-emoji span{background-repeat:no-repeat}.upload-area{align-items:center;background:rgba(0,0,0,.8);display:flex;height:100%;justify-content:center;left:0;opacity:0;position:absolute;top:0;visibility:hidden;width:100%;z-index:2000}.upload-area *{pointer-events:none}.upload-area__drop{width:320px;height:160px;display:flex;box-sizing:border-box;position:relative;padding:8px}.upload-area__background{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;border-radius:4px;background:#121a24;box-shadow:0 0 5px rgba(0,0,0,.2)}.upload-area__content{flex:1;display:flex;align-items:center;justify-content:center;color:#d9e1e8;font-size:18px;font-weight:500;border:2px dashed #3e5a7c;border-radius:4px}.upload-progress{padding:10px;color:#3e5a7c;overflow:hidden;display:flex}.upload-progress .fa{font-size:34px;margin-right:10px}.upload-progress span{font-size:12px;text-transform:uppercase;font-weight:500;display:block}.upload-progess__message{flex:1 1 auto}.upload-progress__backdrop{width:100%;height:6px;border-radius:6px;background:#3e5a7c;position:relative;margin-top:5px}.upload-progress__tracker{position:absolute;left:0;top:0;height:6px;background:#d8a070;border-radius:6px}.emoji-button{display:block;padding:5px 5px 2px 2px;outline:0;cursor:pointer}.emoji-button:active,.emoji-button:focus{outline:0 !important}.emoji-button img{filter:grayscale(100%);opacity:.8;display:block;margin:0;width:22px;height:22px}.emoji-button:hover img,.emoji-button:active img,.emoji-button:focus img{opacity:1;filter:none}.dropdown--active .emoji-button img{opacity:1;filter:none}.privacy-dropdown__dropdown{position:absolute;background:#fff;box-shadow:2px 4px 15px rgba(0,0,0,.4);border-radius:4px;margin-left:40px;overflow:hidden}.privacy-dropdown__dropdown.top{transform-origin:50% 100%}.privacy-dropdown__dropdown.bottom{transform-origin:50% 0}.privacy-dropdown__option{color:#121a24;padding:10px;cursor:pointer;display:flex}.privacy-dropdown__option:hover,.privacy-dropdown__option.active{background:#d8a070;color:#fff;outline:0}.privacy-dropdown__option:hover .privacy-dropdown__option__content,.privacy-dropdown__option.active .privacy-dropdown__option__content{color:#fff}.privacy-dropdown__option:hover .privacy-dropdown__option__content strong,.privacy-dropdown__option.active .privacy-dropdown__option__content strong{color:#fff}.privacy-dropdown__option.active:hover{background:#dcab80}.privacy-dropdown__option__icon{display:flex;align-items:center;justify-content:center;margin-right:10px}.privacy-dropdown__option__content{flex:1 1 auto;color:#3e5a7c}.privacy-dropdown__option__content strong{font-weight:500;display:block;color:#121a24}.privacy-dropdown__option__content strong:lang(ja){font-weight:700}.privacy-dropdown__option__content strong:lang(ko){font-weight:700}.privacy-dropdown__option__content strong:lang(zh-CN){font-weight:700}.privacy-dropdown__option__content strong:lang(zh-HK){font-weight:700}.privacy-dropdown__option__content strong:lang(zh-TW){font-weight:700}.privacy-dropdown.active .privacy-dropdown__value{background:#fff;border-radius:4px 4px 0 0;box-shadow:0 -4px 4px rgba(0,0,0,.1)}.privacy-dropdown.active .privacy-dropdown__value .icon-button{transition:none}.privacy-dropdown.active .privacy-dropdown__value.active{background:#d8a070}.privacy-dropdown.active .privacy-dropdown__value.active .icon-button{color:#fff}.privacy-dropdown.active.top .privacy-dropdown__value{border-radius:0 0 4px 4px}.privacy-dropdown.active .privacy-dropdown__dropdown{display:block;box-shadow:2px 4px 6px rgba(0,0,0,.1)}.search{position:relative}.search__input{outline:0;box-sizing:border-box;width:100%;border:0;box-shadow:none;font-family:inherit;background:#121a24;color:#9baec8;font-size:14px;margin:0;display:block;padding:15px;padding-right:30px;line-height:18px;font-size:16px}.search__input::placeholder{color:#a8b9cf}.search__input::-moz-focus-inner{border:0}.search__input::-moz-focus-inner,.search__input:focus,.search__input:active{outline:0 !important}.search__input:focus{background:#192432}@media screen and (max-width: 600px){.search__input{font-size:16px}}.search__icon::-moz-focus-inner{border:0}.search__icon::-moz-focus-inner,.search__icon:focus{outline:0 !important}.search__icon .fa{position:absolute;top:16px;right:10px;z-index:2;display:inline-block;opacity:0;transition:all 100ms linear;transition-property:transform,opacity;font-size:18px;width:18px;height:18px;color:#d9e1e8;cursor:default;pointer-events:none}.search__icon .fa.active{pointer-events:auto;opacity:.3}.search__icon .fa-search{transform:rotate(90deg)}.search__icon .fa-search.active{pointer-events:none;transform:rotate(0deg)}.search__icon .fa-times-circle{top:17px;transform:rotate(0deg);color:#3e5a7c;cursor:pointer}.search__icon .fa-times-circle.active{transform:rotate(90deg)}.search__icon .fa-times-circle:hover{color:#4a6b94}.search-results__header{color:#3e5a7c;background:#151f2b;padding:15px;font-weight:500;font-size:16px;cursor:default}.search-results__header .fa{display:inline-block;margin-right:5px}.search-results__section{margin-bottom:5px}.search-results__section h5{background:#0b1016;border-bottom:1px solid #202e3f;cursor:default;display:flex;padding:15px;font-weight:500;font-size:16px;color:#3e5a7c}.search-results__section h5 .fa{display:inline-block;margin-right:5px}.search-results__section .account:last-child,.search-results__section>div:last-child .status{border-bottom:0}.search-results__hashtag{display:block;padding:10px;color:#d9e1e8;text-decoration:none}.search-results__hashtag:hover,.search-results__hashtag:active,.search-results__hashtag:focus{color:#e6ebf0;text-decoration:underline}.search-results__info{padding:20px;color:#9baec8;text-align:center}.modal-root{position:relative;transition:opacity .3s linear;will-change:opacity;z-index:9999}.modal-root__overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.7)}.modal-root__container{position:fixed;top:0;left:0;width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;align-content:space-around;z-index:9999;pointer-events:none;user-select:none}.modal-root__modal{pointer-events:auto;display:flex;z-index:9999}.video-modal__container{max-width:100vw;max-height:100vh}.audio-modal__container{width:50vw}.media-modal{width:100%;height:100%;position:relative}.media-modal .extended-video-player{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.media-modal .extended-video-player video{max-width:100%;max-height:80%}.media-modal__closer{position:absolute;top:0;left:0;right:0;bottom:0}.media-modal__navigation{position:absolute;top:0;left:0;right:0;bottom:0;pointer-events:none;transition:opacity .3s linear;will-change:opacity}.media-modal__navigation *{pointer-events:auto}.media-modal__navigation.media-modal__navigation--hidden{opacity:0}.media-modal__navigation.media-modal__navigation--hidden *{pointer-events:none}.media-modal__nav{background:rgba(0,0,0,.5);box-sizing:border-box;border:0;color:#fff;cursor:pointer;display:flex;align-items:center;font-size:24px;height:20vmax;margin:auto 0;padding:30px 15px;position:absolute;top:0;bottom:0}.media-modal__nav--left{left:0}.media-modal__nav--right{right:0}.media-modal__pagination{width:100%;text-align:center;position:absolute;left:0;bottom:20px;pointer-events:none}.media-modal__meta{text-align:center;position:absolute;left:0;bottom:20px;width:100%;pointer-events:none}.media-modal__meta--shifted{bottom:62px}.media-modal__meta a{pointer-events:auto;text-decoration:none;font-weight:500;color:#d9e1e8}.media-modal__meta a:hover,.media-modal__meta a:focus,.media-modal__meta a:active{text-decoration:underline}.media-modal__page-dot{display:inline-block}.media-modal__button{background-color:#fff;height:12px;width:12px;border-radius:6px;margin:10px;padding:0;border:0;font-size:0}.media-modal__button--active{background-color:#d8a070}.media-modal__close{position:absolute;right:8px;top:8px;z-index:100}.onboarding-modal,.error-modal,.embed-modal{background:#d9e1e8;color:#121a24;border-radius:8px;overflow:hidden;display:flex;flex-direction:column}.error-modal__body{height:80vh;width:80vw;max-width:520px;max-height:420px;position:relative}.error-modal__body>div{position:absolute;top:0;left:0;width:100%;height:100%;box-sizing:border-box;padding:25px;display:none;flex-direction:column;align-items:center;justify-content:center;display:flex;opacity:0;user-select:text}.error-modal__body{display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center}.onboarding-modal__paginator,.error-modal__footer{flex:0 0 auto;background:#c0cdd9;display:flex;padding:25px}.onboarding-modal__paginator>div,.error-modal__footer>div{min-width:33px}.onboarding-modal__paginator .onboarding-modal__nav,.onboarding-modal__paginator .error-modal__nav,.error-modal__footer .onboarding-modal__nav,.error-modal__footer .error-modal__nav{color:#3e5a7c;border:0;font-size:14px;font-weight:500;padding:10px 25px;line-height:inherit;height:auto;margin:-10px;border-radius:4px;background-color:transparent}.onboarding-modal__paginator .onboarding-modal__nav:hover,.onboarding-modal__paginator .onboarding-modal__nav:focus,.onboarding-modal__paginator .onboarding-modal__nav:active,.onboarding-modal__paginator .error-modal__nav:hover,.onboarding-modal__paginator .error-modal__nav:focus,.onboarding-modal__paginator .error-modal__nav:active,.error-modal__footer .onboarding-modal__nav:hover,.error-modal__footer .onboarding-modal__nav:focus,.error-modal__footer .onboarding-modal__nav:active,.error-modal__footer .error-modal__nav:hover,.error-modal__footer .error-modal__nav:focus,.error-modal__footer .error-modal__nav:active{color:#37506f;background-color:#a6b9c9}.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next,.error-modal__footer .error-modal__nav.onboarding-modal__done,.error-modal__footer .error-modal__nav.onboarding-modal__next{color:#121a24}.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:hover,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:focus,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:active,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:hover,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:focus,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:active,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:hover,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:focus,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:active,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:hover,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:focus,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:active,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:hover,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:focus,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:active,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:hover,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:focus,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:active,.error-modal__footer .error-modal__nav.onboarding-modal__done:hover,.error-modal__footer .error-modal__nav.onboarding-modal__done:focus,.error-modal__footer .error-modal__nav.onboarding-modal__done:active,.error-modal__footer .error-modal__nav.onboarding-modal__next:hover,.error-modal__footer .error-modal__nav.onboarding-modal__next:focus,.error-modal__footer .error-modal__nav.onboarding-modal__next:active{color:#192432}.error-modal__footer{justify-content:center}.display-case{text-align:center;font-size:15px;margin-bottom:15px}.display-case__label{font-weight:500;color:#121a24;margin-bottom:5px;text-transform:uppercase;font-size:12px}.display-case__case{background:#121a24;color:#d9e1e8;font-weight:500;padding:10px;border-radius:4px}.onboard-sliders{display:inline-block;max-width:30px;max-height:auto;margin-left:10px}.boost-modal,.confirmation-modal,.report-modal,.actions-modal,.mute-modal,.block-modal{background:#f2f5f7;color:#121a24;border-radius:8px;overflow:hidden;max-width:90vw;width:480px;position:relative;flex-direction:column}.boost-modal .status__display-name,.confirmation-modal .status__display-name,.report-modal .status__display-name,.actions-modal .status__display-name,.mute-modal .status__display-name,.block-modal .status__display-name{display:block;max-width:100%;padding-right:25px}.boost-modal .status__avatar,.confirmation-modal .status__avatar,.report-modal .status__avatar,.actions-modal .status__avatar,.mute-modal .status__avatar,.block-modal .status__avatar{height:28px;left:10px;position:absolute;top:10px;width:48px}.boost-modal .status__content__spoiler-link,.confirmation-modal .status__content__spoiler-link,.report-modal .status__content__spoiler-link,.actions-modal .status__content__spoiler-link,.mute-modal .status__content__spoiler-link,.block-modal .status__content__spoiler-link{color:#f2f5f7}.actions-modal .status{background:#fff;border-bottom-color:#d9e1e8;padding-top:10px;padding-bottom:10px}.actions-modal .dropdown-menu__separator{border-bottom-color:#d9e1e8}.boost-modal__container{overflow-x:scroll;padding:10px}.boost-modal__container .status{user-select:text;border-bottom:0}.boost-modal__action-bar,.confirmation-modal__action-bar,.mute-modal__action-bar,.block-modal__action-bar{display:flex;justify-content:space-between;background:#d9e1e8;padding:10px;line-height:36px}.boost-modal__action-bar>div,.confirmation-modal__action-bar>div,.mute-modal__action-bar>div,.block-modal__action-bar>div{flex:1 1 auto;text-align:right;color:#3e5a7c;padding-right:10px}.boost-modal__action-bar .button,.confirmation-modal__action-bar .button,.mute-modal__action-bar .button,.block-modal__action-bar .button{flex:0 0 auto}.boost-modal__status-header{font-size:15px}.boost-modal__status-time{float:right;font-size:14px}.mute-modal,.block-modal{line-height:24px}.mute-modal .react-toggle,.block-modal .react-toggle{vertical-align:middle}.report-modal{width:90vw;max-width:700px}.report-modal__container{display:flex;border-top:1px solid #d9e1e8}@media screen and (max-width: 480px){.report-modal__container{flex-wrap:wrap;overflow-y:auto}}.report-modal__statuses,.report-modal__comment{box-sizing:border-box;width:50%}@media screen and (max-width: 480px){.report-modal__statuses,.report-modal__comment{width:100%}}.report-modal__statuses,.focal-point-modal__content{flex:1 1 auto;min-height:20vh;max-height:80vh;overflow-y:auto;overflow-x:hidden}.report-modal__statuses .status__content a,.focal-point-modal__content .status__content a{color:#d8a070}.report-modal__statuses .status__content,.report-modal__statuses .status__content p,.focal-point-modal__content .status__content,.focal-point-modal__content .status__content p{color:#121a24}@media screen and (max-width: 480px){.report-modal__statuses,.focal-point-modal__content{max-height:10vh}}@media screen and (max-width: 480px){.focal-point-modal__content{max-height:40vh}}.report-modal__comment{padding:20px;border-right:1px solid #d9e1e8;max-width:320px}.report-modal__comment p{font-size:14px;line-height:20px;margin-bottom:20px}.report-modal__comment .setting-text{display:block;box-sizing:border-box;width:100%;margin:0;color:#121a24;background:#fff;padding:10px;font-family:inherit;font-size:14px;resize:none;border:0;outline:0;border-radius:4px;border:1px solid #d9e1e8;min-height:100px;max-height:50vh;margin-bottom:10px}.report-modal__comment .setting-text:focus{border:1px solid #c0cdd9}.report-modal__comment .setting-text__wrapper{background:#fff;border:1px solid #d9e1e8;margin-bottom:10px;border-radius:4px}.report-modal__comment .setting-text__wrapper .setting-text{border:0;margin-bottom:0;border-radius:0}.report-modal__comment .setting-text__wrapper .setting-text:focus{border:0}.report-modal__comment .setting-text__wrapper__modifiers{color:#121a24;font-family:inherit;font-size:14px;background:#fff}.report-modal__comment .setting-text__toolbar{display:flex;justify-content:space-between;margin-bottom:20px}.report-modal__comment .setting-text-label{display:block;color:#121a24;font-size:14px;font-weight:500;margin-bottom:10px}.report-modal__comment .setting-toggle{margin-top:20px;margin-bottom:24px}.report-modal__comment .setting-toggle__label{color:#121a24;font-size:14px}@media screen and (max-width: 480px){.report-modal__comment{padding:10px;max-width:100%;order:2}.report-modal__comment .setting-toggle{margin-bottom:4px}}.actions-modal{max-height:80vh;max-width:80vw}.actions-modal .status{overflow-y:auto;max-height:300px}.actions-modal .actions-modal__item-label{font-weight:500}.actions-modal ul{overflow-y:auto;flex-shrink:0;max-height:80vh}.actions-modal ul.with-status{max-height:calc(80vh - 75px)}.actions-modal ul li:empty{margin:0}.actions-modal ul li:not(:empty) a{color:#121a24;display:flex;padding:12px 16px;font-size:15px;align-items:center;text-decoration:none}.actions-modal ul li:not(:empty) a,.actions-modal ul li:not(:empty) a button{transition:none}.actions-modal ul li:not(:empty) a.active,.actions-modal ul li:not(:empty) a.active button,.actions-modal ul li:not(:empty) a:hover,.actions-modal ul li:not(:empty) a:hover button,.actions-modal ul li:not(:empty) a:active,.actions-modal ul li:not(:empty) a:active button,.actions-modal ul li:not(:empty) a:focus,.actions-modal ul li:not(:empty) a:focus button{background:#d8a070;color:#fff}.actions-modal ul li:not(:empty) a button:first-child{margin-right:10px}.confirmation-modal__action-bar .confirmation-modal__secondary-button,.mute-modal__action-bar .confirmation-modal__secondary-button,.block-modal__action-bar .confirmation-modal__secondary-button{flex-shrink:1}.confirmation-modal__secondary-button,.confirmation-modal__cancel-button,.mute-modal__cancel-button,.block-modal__cancel-button{background-color:transparent;color:#3e5a7c;font-size:14px;font-weight:500}.confirmation-modal__secondary-button:hover,.confirmation-modal__secondary-button:focus,.confirmation-modal__secondary-button:active,.confirmation-modal__cancel-button:hover,.confirmation-modal__cancel-button:focus,.confirmation-modal__cancel-button:active,.mute-modal__cancel-button:hover,.mute-modal__cancel-button:focus,.mute-modal__cancel-button:active,.block-modal__cancel-button:hover,.block-modal__cancel-button:focus,.block-modal__cancel-button:active{color:#37506f;background-color:transparent}.confirmation-modal__container,.mute-modal__container,.block-modal__container,.report-modal__target{padding:30px;font-size:16px}.confirmation-modal__container strong,.mute-modal__container strong,.block-modal__container strong,.report-modal__target strong{font-weight:500}.confirmation-modal__container strong:lang(ja),.mute-modal__container strong:lang(ja),.block-modal__container strong:lang(ja),.report-modal__target strong:lang(ja){font-weight:700}.confirmation-modal__container strong:lang(ko),.mute-modal__container strong:lang(ko),.block-modal__container strong:lang(ko),.report-modal__target strong:lang(ko){font-weight:700}.confirmation-modal__container strong:lang(zh-CN),.mute-modal__container strong:lang(zh-CN),.block-modal__container strong:lang(zh-CN),.report-modal__target strong:lang(zh-CN){font-weight:700}.confirmation-modal__container strong:lang(zh-HK),.mute-modal__container strong:lang(zh-HK),.block-modal__container strong:lang(zh-HK),.report-modal__target strong:lang(zh-HK){font-weight:700}.confirmation-modal__container strong:lang(zh-TW),.mute-modal__container strong:lang(zh-TW),.block-modal__container strong:lang(zh-TW),.report-modal__target strong:lang(zh-TW){font-weight:700}.confirmation-modal__container,.report-modal__target{text-align:center}.block-modal__explanation,.mute-modal__explanation{margin-top:20px}.block-modal .setting-toggle,.mute-modal .setting-toggle{margin-top:20px;margin-bottom:24px;display:flex;align-items:center}.block-modal .setting-toggle__label,.mute-modal .setting-toggle__label{color:#121a24;margin:0;margin-left:8px}.report-modal__target{padding:15px}.report-modal__target .media-modal__close{top:14px;right:15px}.loading-bar{background-color:#d8a070;height:3px;position:absolute;top:0;left:0;z-index:9999}.media-gallery__gifv__label{display:block;position:absolute;color:#fff;background:rgba(0,0,0,.5);bottom:6px;left:6px;padding:2px 6px;border-radius:2px;font-size:11px;font-weight:600;z-index:1;pointer-events:none;opacity:.9;transition:opacity .1s ease;line-height:18px}.media-gallery__gifv:hover .media-gallery__gifv__label{opacity:1}.media-gallery__audio{margin-top:32px}.media-gallery__audio audio{width:100%}.attachment-list{display:flex;font-size:14px;border:1px solid #202e3f;border-radius:4px;margin-top:14px;overflow:hidden}.attachment-list__icon{flex:0 0 auto;color:#3e5a7c;padding:8px 18px;cursor:default;border-right:1px solid #202e3f;display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:26px}.attachment-list__icon .fa{display:block}.attachment-list__list{list-style:none;padding:4px 0;padding-left:8px;display:flex;flex-direction:column;justify-content:center}.attachment-list__list li{display:block;padding:4px 0}.attachment-list__list a{text-decoration:none;color:#3e5a7c;font-weight:500}.attachment-list__list a:hover{text-decoration:underline}.attachment-list.compact{border:0;margin-top:4px}.attachment-list.compact .attachment-list__list{padding:0;display:block}.attachment-list.compact .fa{color:#3e5a7c}.media-gallery{box-sizing:border-box;margin-top:8px;overflow:hidden;border-radius:4px;position:relative;width:100%}.media-gallery__item{border:0;box-sizing:border-box;display:block;float:left;position:relative;border-radius:4px;overflow:hidden}.media-gallery__item.standalone .media-gallery__item-gifv-thumbnail{transform:none;top:0}.media-gallery__item-thumbnail{cursor:zoom-in;display:block;text-decoration:none;color:#d9e1e8;position:relative;z-index:1}.media-gallery__item-thumbnail,.media-gallery__item-thumbnail img{height:100%;width:100%}.media-gallery__item-thumbnail img{object-fit:cover}.media-gallery__preview{width:100%;height:100%;object-fit:cover;position:absolute;top:0;left:0;z-index:0;background:#000}.media-gallery__preview--hidden{display:none}.media-gallery__gifv{height:100%;overflow:hidden;position:relative;width:100%}.media-gallery__item-gifv-thumbnail{cursor:zoom-in;height:100%;object-fit:cover;position:relative;top:50%;transform:translateY(-50%);width:100%;z-index:1}.media-gallery__item-thumbnail-label{clip:rect(1px 1px 1px 1px);clip:rect(1px, 1px, 1px, 1px);overflow:hidden;position:absolute}.detailed .video-player__volume__current,.detailed .video-player__volume::before,.fullscreen .video-player__volume__current,.fullscreen .video-player__volume::before{bottom:27px}.detailed .video-player__volume__handle,.fullscreen .video-player__volume__handle{bottom:23px}.audio-player{box-sizing:border-box;position:relative;background:#040609;border-radius:4px;padding-bottom:44px;direction:ltr}.audio-player.editable{border-radius:0;height:100%}.audio-player__waveform{padding:15px 0;position:relative;overflow:hidden}.audio-player__waveform::before{content:\"\";display:block;position:absolute;border-top:1px solid #192432;width:100%;height:0;left:0;top:calc(50% + 1px)}.audio-player__progress-placeholder{background-color:rgba(225,181,144,.5)}.audio-player__wave-placeholder{background-color:#2d415a}.audio-player .video-player__controls{padding:0 15px;padding-top:10px;background:#040609;border-top:1px solid #192432;border-radius:0 0 4px 4px}.video-player{overflow:hidden;position:relative;background:#000;max-width:100%;border-radius:4px;box-sizing:border-box;direction:ltr}.video-player.editable{border-radius:0;height:100% !important}.video-player:focus{outline:0}.video-player video{max-width:100vw;max-height:80vh;z-index:1}.video-player.fullscreen{width:100% !important;height:100% !important;margin:0}.video-player.fullscreen video{max-width:100% !important;max-height:100% !important;width:100% !important;height:100% !important;outline:0}.video-player.inline video{object-fit:contain;position:relative;top:50%;transform:translateY(-50%)}.video-player__controls{position:absolute;z-index:2;bottom:0;left:0;right:0;box-sizing:border-box;background:linear-gradient(0deg, rgba(0, 0, 0, 0.85) 0, rgba(0, 0, 0, 0.45) 60%, transparent);padding:0 15px;opacity:0;transition:opacity .1s ease}.video-player__controls.active{opacity:1}.video-player.inactive video,.video-player.inactive .video-player__controls{visibility:hidden}.video-player__spoiler{display:none;position:absolute;top:0;left:0;width:100%;height:100%;z-index:4;border:0;background:#000;color:#9baec8;transition:none;pointer-events:none}.video-player__spoiler.active{display:block;pointer-events:auto}.video-player__spoiler.active:hover,.video-player__spoiler.active:active,.video-player__spoiler.active:focus{color:#b2c1d5}.video-player__spoiler__title{display:block;font-size:14px}.video-player__spoiler__subtitle{display:block;font-size:11px;font-weight:500}.video-player__buttons-bar{display:flex;justify-content:space-between;padding-bottom:10px}.video-player__buttons-bar .video-player__download__icon{color:inherit}.video-player__buttons{font-size:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.video-player__buttons.left button{padding-left:0}.video-player__buttons.right button{padding-right:0}.video-player__buttons button{background:transparent;padding:2px 10px;font-size:16px;border:0;color:rgba(255,255,255,.75)}.video-player__buttons button:active,.video-player__buttons button:hover,.video-player__buttons button:focus{color:#fff}.video-player__time-sep,.video-player__time-total,.video-player__time-current{font-size:14px;font-weight:500}.video-player__time-current{color:#fff;margin-left:60px}.video-player__time-sep{display:inline-block;margin:0 6px}.video-player__time-sep,.video-player__time-total{color:#fff}.video-player__volume{cursor:pointer;height:24px;display:inline}.video-player__volume::before{content:\"\";width:50px;background:rgba(255,255,255,.35);border-radius:4px;display:block;position:absolute;height:4px;left:70px;bottom:20px}.video-player__volume__current{display:block;position:absolute;height:4px;border-radius:4px;left:70px;bottom:20px;background:#e1b590}.video-player__volume__handle{position:absolute;z-index:3;border-radius:50%;width:12px;height:12px;bottom:16px;left:70px;transition:opacity .1s ease;background:#e1b590;box-shadow:1px 2px 6px rgba(0,0,0,.2);pointer-events:none}.video-player__link{padding:2px 10px}.video-player__link a{text-decoration:none;font-size:14px;font-weight:500;color:#fff}.video-player__link a:hover,.video-player__link a:active,.video-player__link a:focus{text-decoration:underline}.video-player__seek{cursor:pointer;height:24px;position:relative}.video-player__seek::before{content:\"\";width:100%;background:rgba(255,255,255,.35);border-radius:4px;display:block;position:absolute;height:4px;top:10px}.video-player__seek__progress,.video-player__seek__buffer{display:block;position:absolute;height:4px;border-radius:4px;top:10px;background:#e1b590}.video-player__seek__buffer{background:rgba(255,255,255,.2)}.video-player__seek__handle{position:absolute;z-index:3;opacity:0;border-radius:50%;width:12px;height:12px;top:6px;margin-left:-6px;transition:opacity .1s ease;background:#e1b590;box-shadow:1px 2px 6px rgba(0,0,0,.2);pointer-events:none}.video-player__seek__handle.active{opacity:1}.video-player__seek:hover .video-player__seek__handle{opacity:1}.video-player.detailed .video-player__buttons button,.video-player.fullscreen .video-player__buttons button{padding-top:10px;padding-bottom:10px}.directory__list{width:100%;margin:10px 0;transition:opacity 100ms ease-in}.directory__list.loading{opacity:.7}@media screen and (max-width: 415px){.directory__list{margin:0}}.directory__card{box-sizing:border-box;margin-bottom:10px}.directory__card__img{height:125px;position:relative;background:#000;overflow:hidden}.directory__card__img img{display:block;width:100%;height:100%;margin:0;object-fit:cover}.directory__card__bar{display:flex;align-items:center;background:#192432;padding:10px}.directory__card__bar__name{flex:1 1 auto;display:flex;align-items:center;text-decoration:none;overflow:hidden}.directory__card__bar__relationship{width:23px;min-height:1px;flex:0 0 auto}.directory__card__bar .avatar{flex:0 0 auto;width:48px;height:48px;padding-top:2px}.directory__card__bar .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px;background:#040609;object-fit:cover}.directory__card__bar .display-name{margin-left:15px;text-align:left}.directory__card__bar .display-name strong{font-size:15px;color:#fff;font-weight:500;overflow:hidden;text-overflow:ellipsis}.directory__card__bar .display-name span{display:block;font-size:14px;color:#9baec8;font-weight:400;overflow:hidden;text-overflow:ellipsis}.directory__card__extra{background:#121a24;display:flex;align-items:center;justify-content:center}.directory__card__extra .accounts-table__count{width:33.33%;flex:0 0 auto;padding:15px 0}.directory__card__extra .account__header__content{box-sizing:border-box;padding:15px 10px;border-bottom:1px solid #202e3f;width:100%;min-height:48px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.directory__card__extra .account__header__content p{display:none}.directory__card__extra .account__header__content p:first-child{display:inline}.directory__card__extra .account__header__content br{display:none}.account-gallery__container{display:flex;flex-wrap:wrap;padding:4px 2px}.account-gallery__item{border:0;box-sizing:border-box;display:block;position:relative;border-radius:4px;overflow:hidden;margin:2px}.account-gallery__item__icons{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);font-size:24px}.notification__filter-bar,.account__section-headline{background:#0b1016;border-bottom:1px solid #202e3f;cursor:default;display:flex;flex-shrink:0}.notification__filter-bar button,.account__section-headline button{background:#0b1016;border:0;margin:0}.notification__filter-bar button,.notification__filter-bar a,.account__section-headline button,.account__section-headline a{display:block;flex:1 1 auto;color:#9baec8;padding:15px 0;font-size:14px;font-weight:500;text-align:center;text-decoration:none;position:relative;width:100%;white-space:nowrap}.notification__filter-bar button.active,.notification__filter-bar a.active,.account__section-headline button.active,.account__section-headline a.active{color:#d9e1e8}.notification__filter-bar button.active::before,.notification__filter-bar button.active::after,.notification__filter-bar a.active::before,.notification__filter-bar a.active::after,.account__section-headline button.active::before,.account__section-headline button.active::after,.account__section-headline a.active::before,.account__section-headline a.active::after{display:block;content:\"\";position:absolute;bottom:0;left:50%;width:0;height:0;transform:translateX(-50%);border-style:solid;border-width:0 10px 10px;border-color:transparent transparent #202e3f}.notification__filter-bar button.active::after,.notification__filter-bar a.active::after,.account__section-headline button.active::after,.account__section-headline a.active::after{bottom:-1px;border-color:transparent transparent #121a24}.notification__filter-bar.directory__section-headline,.account__section-headline.directory__section-headline{background:#0f151d;border-bottom-color:transparent}.notification__filter-bar.directory__section-headline a.active::before,.notification__filter-bar.directory__section-headline button.active::before,.account__section-headline.directory__section-headline a.active::before,.account__section-headline.directory__section-headline button.active::before{display:none}.notification__filter-bar.directory__section-headline a.active::after,.notification__filter-bar.directory__section-headline button.active::after,.account__section-headline.directory__section-headline a.active::after,.account__section-headline.directory__section-headline button.active::after{border-color:transparent transparent #06090c}.filter-form{background:#121a24}.filter-form__column{padding:10px 15px}.filter-form .radio-button{display:block}.radio-button{font-size:14px;position:relative;display:inline-block;padding:6px 0;line-height:18px;cursor:default;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer}.radio-button input[type=radio],.radio-button input[type=checkbox]{display:none}.radio-button__input{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:50%;vertical-align:middle}.radio-button__input.checked{border-color:#e1b590;background:#e1b590}::-webkit-scrollbar-thumb{border-radius:0}.search-popout{background:#fff;border-radius:4px;padding:10px 14px;padding-bottom:14px;margin-top:10px;color:#9baec8;box-shadow:2px 4px 15px rgba(0,0,0,.4)}.search-popout h4{text-transform:uppercase;color:#9baec8;font-size:13px;font-weight:500;margin-bottom:10px}.search-popout li{padding:4px 0}.search-popout ul{margin-bottom:10px}.search-popout em{font-weight:500;color:#121a24}noscript{text-align:center}noscript img{width:200px;opacity:.5;animation:flicker 4s infinite}noscript div{font-size:14px;margin:30px auto;color:#d9e1e8;max-width:400px}noscript div a{color:#d8a070;text-decoration:underline}noscript div a:hover{text-decoration:none}@keyframes flicker{0%{opacity:1}30%{opacity:.75}100%{opacity:1}}@media screen and (max-width: 630px)and (max-height: 400px){.tabs-bar,.search{will-change:margin-top;transition:margin-top 400ms 100ms}.navigation-bar{will-change:padding-bottom;transition:padding-bottom 400ms 100ms}.navigation-bar>a:first-child{will-change:margin-top,margin-left,margin-right,width;transition:margin-top 400ms 100ms,margin-left 400ms 500ms,margin-right 400ms 500ms}.navigation-bar>.navigation-bar__profile-edit{will-change:margin-top;transition:margin-top 400ms 100ms}.navigation-bar .navigation-bar__actions>.icon-button.close{will-change:opacity transform;transition:opacity 200ms 100ms,transform 400ms 100ms}.navigation-bar .navigation-bar__actions>.compose__action-bar .icon-button{will-change:opacity transform;transition:opacity 200ms 300ms,transform 400ms 100ms}.is-composing .tabs-bar,.is-composing .search{margin-top:-50px}.is-composing .navigation-bar{padding-bottom:0}.is-composing .navigation-bar>a:first-child{margin:-100px 10px 0 -50px}.is-composing .navigation-bar .navigation-bar__profile{padding-top:2px}.is-composing .navigation-bar .navigation-bar__profile-edit{position:absolute;margin-top:-60px}.is-composing .navigation-bar .navigation-bar__actions .icon-button.close{pointer-events:auto;opacity:1;transform:scale(1, 1) translate(0, 0);bottom:5px}.is-composing .navigation-bar .navigation-bar__actions .compose__action-bar .icon-button{pointer-events:none;opacity:0;transform:scale(0, 1) translate(100%, 0)}}.embed-modal{width:auto;max-width:80vw;max-height:80vh}.embed-modal h4{padding:30px;font-weight:500;font-size:16px;text-align:center}.embed-modal .embed-modal__container{padding:10px}.embed-modal .embed-modal__container .hint{margin-bottom:15px}.embed-modal .embed-modal__container .embed-modal__html{outline:0;box-sizing:border-box;display:block;width:100%;border:0;padding:10px;font-family:\"mastodon-font-monospace\",monospace;background:#121a24;color:#fff;font-size:14px;margin:0;margin-bottom:15px;border-radius:4px}.embed-modal .embed-modal__container .embed-modal__html::-moz-focus-inner{border:0}.embed-modal .embed-modal__container .embed-modal__html::-moz-focus-inner,.embed-modal .embed-modal__container .embed-modal__html:focus,.embed-modal .embed-modal__container .embed-modal__html:active{outline:0 !important}.embed-modal .embed-modal__container .embed-modal__html:focus{background:#192432}@media screen and (max-width: 600px){.embed-modal .embed-modal__container .embed-modal__html{font-size:16px}}.embed-modal .embed-modal__container .embed-modal__iframe{width:400px;max-width:100%;overflow:hidden;border:0;border-radius:4px}.account__moved-note{padding:14px 10px;padding-bottom:16px;background:#192432;border-top:1px solid #202e3f;border-bottom:1px solid #202e3f}.account__moved-note__message{position:relative;margin-left:58px;color:#3e5a7c;padding:8px 0;padding-top:0;padding-bottom:4px;font-size:14px}.account__moved-note__message>span{display:block;overflow:hidden;text-overflow:ellipsis}.account__moved-note__icon-wrapper{left:-26px;position:absolute}.account__moved-note .detailed-status__display-avatar{position:relative}.account__moved-note .detailed-status__display-name{margin-bottom:0}.column-inline-form{padding:15px;padding-right:0;display:flex;justify-content:flex-start;align-items:center;background:#192432}.column-inline-form label{flex:1 1 auto}.column-inline-form label input{width:100%}.column-inline-form label input:focus{outline:0}.column-inline-form .icon-button{flex:0 0 auto;margin:0 10px}.drawer__backdrop{cursor:pointer;position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5)}.list-editor{background:#121a24;flex-direction:column;border-radius:8px;box-shadow:2px 4px 15px rgba(0,0,0,.4);width:380px;overflow:hidden}@media screen and (max-width: 420px){.list-editor{width:90%}}.list-editor h4{padding:15px 0;background:#283a50;font-weight:500;font-size:16px;text-align:center;border-radius:8px 8px 0 0}.list-editor .drawer__pager{height:50vh}.list-editor .drawer__inner{border-radius:0 0 8px 8px}.list-editor .drawer__inner.backdrop{width:calc(100% - 60px);box-shadow:2px 4px 15px rgba(0,0,0,.4);border-radius:0 0 0 8px}.list-editor__accounts{overflow-y:auto}.list-editor .account__display-name:hover strong{text-decoration:none}.list-editor .account__avatar{cursor:default}.list-editor .search{margin-bottom:0}.list-adder{background:#121a24;flex-direction:column;border-radius:8px;box-shadow:2px 4px 15px rgba(0,0,0,.4);width:380px;overflow:hidden}@media screen and (max-width: 420px){.list-adder{width:90%}}.list-adder__account{background:#283a50}.list-adder__lists{background:#283a50;height:50vh;border-radius:0 0 8px 8px;overflow-y:auto}.list-adder .list{padding:10px;border-bottom:1px solid #202e3f}.list-adder .list__wrapper{display:flex}.list-adder .list__display-name{flex:1 1 auto;overflow:hidden;text-decoration:none;font-size:16px;padding:10px}.focal-point{position:relative;cursor:move;overflow:hidden;height:100%;display:flex;justify-content:center;align-items:center;background:#000}.focal-point img,.focal-point video,.focal-point canvas{display:block;max-height:80vh;width:100%;height:auto;margin:0;object-fit:contain;background:#000}.focal-point__reticle{position:absolute;width:100px;height:100px;transform:translate(-50%, -50%);background:url(\"~images/reticle.png\") no-repeat 0 0;border-radius:50%;box-shadow:0 0 0 9999em rgba(0,0,0,.35)}.focal-point__overlay{position:absolute;width:100%;height:100%;top:0;left:0}.focal-point__preview{position:absolute;bottom:10px;right:10px;z-index:2;cursor:move;transition:opacity .1s ease}.focal-point__preview:hover{opacity:.5}.focal-point__preview strong{color:#fff;font-size:14px;font-weight:500;display:block;margin-bottom:5px}.focal-point__preview div{border-radius:4px;box-shadow:0 0 14px rgba(0,0,0,.2)}@media screen and (max-width: 480px){.focal-point img,.focal-point video{max-height:100%}.focal-point__preview{display:none}}.account__header__content{color:#9baec8;font-size:14px;font-weight:400;overflow:hidden;word-break:normal;word-wrap:break-word}.account__header__content p{margin-bottom:20px}.account__header__content p:last-child{margin-bottom:0}.account__header__content a{color:inherit;text-decoration:underline}.account__header__content a:hover{text-decoration:none}.account__header{overflow:hidden}.account__header.inactive{opacity:.5}.account__header.inactive .account__header__image,.account__header.inactive .account__avatar{filter:grayscale(100%)}.account__header__info{position:absolute;top:10px;left:10px}.account__header__image{overflow:hidden;height:145px;position:relative;background:#0b1016}.account__header__image img{object-fit:cover;display:block;width:100%;height:100%;margin:0}.account__header__bar{position:relative;background:#192432;padding:5px;border-bottom:1px solid #26374d}.account__header__bar .avatar{display:block;flex:0 0 auto;width:94px;margin-left:-2px}.account__header__bar .avatar .account__avatar{background:#040609;border:2px solid #192432}.account__header__tabs{display:flex;align-items:flex-start;padding:7px 5px;margin-top:-55px}.account__header__tabs__buttons{display:flex;align-items:center;padding-top:55px;overflow:hidden}.account__header__tabs__buttons .icon-button{border:1px solid #26374d;border-radius:4px;box-sizing:content-box;padding:2px}.account__header__tabs__buttons .button{margin:0 8px}.account__header__tabs__name{padding:5px}.account__header__tabs__name .account-role{vertical-align:top}.account__header__tabs__name .emojione{width:22px;height:22px}.account__header__tabs__name h1{font-size:16px;line-height:24px;color:#fff;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.account__header__tabs__name h1 small{display:block;font-size:14px;color:#9baec8;font-weight:400;overflow:hidden;text-overflow:ellipsis}.account__header__tabs .spacer{flex:1 1 auto}.account__header__bio{overflow:hidden;margin:0 -5px}.account__header__bio .account__header__content{padding:20px 15px;padding-bottom:5px;color:#fff}.account__header__bio .account__header__fields{margin:0;border-top:1px solid #26374d}.account__header__bio .account__header__fields a{color:#e1b590}.account__header__bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.account__header__bio .account__header__fields .verified a{color:#79bd9a}.account__header__extra{margin-top:4px}.account__header__extra__links{font-size:14px;color:#9baec8;padding:10px 0}.account__header__extra__links a{display:inline-block;color:#9baec8;text-decoration:none;padding:5px 10px;font-weight:500}.account__header__extra__links a strong{font-weight:700;color:#fff}.trends__header{color:#3e5a7c;background:#151f2b;border-bottom:1px solid #0b1016;font-weight:500;padding:15px;font-size:16px;cursor:default}.trends__header .fa{display:inline-block;margin-right:5px}.trends__item{display:flex;align-items:center;padding:15px;border-bottom:1px solid #202e3f}.trends__item:last-child{border-bottom:0}.trends__item__name{flex:1 1 auto;color:#3e5a7c;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trends__item__name strong{font-weight:500}.trends__item__name a{color:#9baec8;text-decoration:none;font-size:14px;font-weight:500;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trends__item__name a:hover span,.trends__item__name a:focus span,.trends__item__name a:active span{text-decoration:underline}.trends__item__current{flex:0 0 auto;font-size:24px;line-height:36px;font-weight:500;text-align:right;padding-right:15px;margin-left:5px;color:#d9e1e8}.trends__item__sparkline{flex:0 0 auto;width:50px}.trends__item__sparkline path:first-child{fill:rgba(216,160,112,.25) !important;fill-opacity:1 !important}.trends__item__sparkline path:last-child{stroke:#dfb088 !important}.conversation{display:flex;border-bottom:1px solid #202e3f;padding:5px;padding-bottom:0}.conversation:focus{background:#151f2b;outline:0}.conversation__avatar{flex:0 0 auto;padding:10px;padding-top:12px;position:relative;cursor:pointer}.conversation__unread{display:inline-block;background:#d8a070;border-radius:50%;width:.625rem;height:.625rem;margin:-0.1ex .15em .1ex}.conversation__content{flex:1 1 auto;padding:10px 5px;padding-right:15px;overflow:hidden}.conversation__content__info{overflow:hidden;display:flex;flex-direction:row-reverse;justify-content:space-between}.conversation__content__relative-time{font-size:15px;color:#9baec8;padding-left:15px}.conversation__content__names{color:#9baec8;font-size:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:4px;flex-basis:90px;flex-grow:1}.conversation__content__names a{color:#fff;text-decoration:none}.conversation__content__names a:hover,.conversation__content__names a:focus,.conversation__content__names a:active{text-decoration:underline}.conversation__content a{word-break:break-word}.conversation--unread{background:#151f2b}.conversation--unread:focus{background:#192432}.conversation--unread .conversation__content__info{font-weight:700}.conversation--unread .conversation__content__relative-time{color:#fff}.announcements{background:#202e3f;font-size:13px;display:flex;align-items:flex-end}.announcements__mastodon{width:124px;flex:0 0 auto}@media screen and (max-width: 424px){.announcements__mastodon{display:none}}.announcements__container{width:calc(100% - 124px);flex:0 0 auto;position:relative}@media screen and (max-width: 424px){.announcements__container{width:100%}}.announcements__item{box-sizing:border-box;width:100%;padding:15px;position:relative;font-size:15px;line-height:20px;word-wrap:break-word;font-weight:400;max-height:50vh;overflow:hidden;display:flex;flex-direction:column}.announcements__item__range{display:block;font-weight:500;margin-bottom:10px;padding-right:18px}.announcements__item__unread{position:absolute;top:19px;right:19px;display:block;background:#d8a070;border-radius:50%;width:.625rem;height:.625rem}.announcements__pagination{padding:15px;color:#9baec8;position:absolute;bottom:3px;right:0}.layout-multiple-columns .announcements__mastodon{display:none}.layout-multiple-columns .announcements__container{width:100%}.reactions-bar{display:flex;flex-wrap:wrap;align-items:center;margin-top:15px;margin-left:-2px;width:calc(100% - (90px - 33px))}.reactions-bar__item{flex-shrink:0;background:#26374d;border:0;border-radius:3px;margin:2px;cursor:pointer;user-select:none;padding:0 6px;display:flex;align-items:center;transition:all 100ms ease-in;transition-property:background-color,color}.reactions-bar__item__emoji{display:block;margin:3px 0;width:16px;height:16px}.reactions-bar__item__emoji img{display:block;margin:0;width:100%;height:100%;min-width:auto;min-height:auto;vertical-align:bottom;object-fit:contain}.reactions-bar__item__count{display:block;min-width:9px;font-size:13px;font-weight:500;text-align:center;margin-left:6px;color:#9baec8}.reactions-bar__item:hover,.reactions-bar__item:focus,.reactions-bar__item:active{background:#2d415a;transition:all 200ms ease-out;transition-property:background-color,color}.reactions-bar__item:hover__count,.reactions-bar__item:focus__count,.reactions-bar__item:active__count{color:#a8b9cf}.reactions-bar__item.active{transition:all 100ms ease-in;transition-property:background-color,color;background-color:#4a4c54}.reactions-bar__item.active .reactions-bar__item__count{color:#e1b590}.reactions-bar .emoji-picker-dropdown{margin:2px}.reactions-bar:hover .emoji-button{opacity:.85}.reactions-bar .emoji-button{color:#9baec8;margin:0;font-size:16px;width:auto;flex-shrink:0;padding:0 6px;height:22px;display:flex;align-items:center;opacity:.5;transition:all 100ms ease-in;transition-property:background-color,color}.reactions-bar .emoji-button:hover,.reactions-bar .emoji-button:active,.reactions-bar .emoji-button:focus{opacity:1;color:#a8b9cf;transition:all 200ms ease-out;transition-property:background-color,color}.reactions-bar--empty .emoji-button{padding:0}.poll{margin-top:16px;font-size:14px}.poll li{margin-bottom:10px;position:relative}.poll__chart{border-radius:4px;display:block;background:#8ba1bf;height:5px;min-width:1%}.poll__chart.leading{background:#d8a070}.poll__option{position:relative;display:flex;padding:6px 0;line-height:18px;cursor:default;overflow:hidden}.poll__option__text{display:inline-block;word-wrap:break-word;overflow-wrap:break-word;max-width:calc(100% - 45px - 25px)}.poll__option input[type=radio],.poll__option input[type=checkbox]{display:none}.poll__option .autossugest-input{flex:1 1 auto}.poll__option input[type=text]{display:block;box-sizing:border-box;width:100%;font-size:14px;color:#121a24;outline:0;font-family:inherit;background:#fff;border:1px solid #dbdbdb;border-radius:4px;padding:6px 10px}.poll__option input[type=text]:focus{border-color:#d8a070}.poll__option.selectable{cursor:pointer}.poll__option.editable{display:flex;align-items:center;overflow:visible}.poll__input{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:50%;vertical-align:middle;margin-top:auto;margin-bottom:auto;flex:0 0 18px}.poll__input.checkbox{border-radius:4px}.poll__input.active{border-color:#79bd9a;background:#79bd9a}.poll__input:active,.poll__input:focus,.poll__input:hover{border-color:#acd6c1;border-width:4px}.poll__input::-moz-focus-inner{outline:0 !important;border:0}.poll__input:focus,.poll__input:active{outline:0 !important}.poll__number{display:inline-block;width:45px;font-weight:700;flex:0 0 45px}.poll__voted{padding:0 5px;display:inline-block}.poll__voted__mark{font-size:18px}.poll__footer{padding-top:6px;padding-bottom:5px;color:#3e5a7c}.poll__link{display:inline;background:transparent;padding:0;margin:0;border:0;color:#3e5a7c;text-decoration:underline;font-size:inherit}.poll__link:hover{text-decoration:none}.poll__link:active,.poll__link:focus{background-color:rgba(62,90,124,.1)}.poll .button{height:36px;padding:0 16px;margin-right:10px;font-size:14px}.compose-form__poll-wrapper{border-top:1px solid #ebebeb}.compose-form__poll-wrapper ul{padding:10px}.compose-form__poll-wrapper .poll__footer{border-top:1px solid #ebebeb;padding:10px;display:flex;align-items:center}.compose-form__poll-wrapper .poll__footer button,.compose-form__poll-wrapper .poll__footer select{flex:1 1 50%}.compose-form__poll-wrapper .poll__footer button:focus,.compose-form__poll-wrapper .poll__footer select:focus{border-color:#d8a070}.compose-form__poll-wrapper .button.button-secondary{font-size:14px;font-weight:400;padding:6px 10px;height:auto;line-height:inherit;color:#3e5a7c;border-color:#3e5a7c;margin-right:5px}.compose-form__poll-wrapper li{display:flex;align-items:center}.compose-form__poll-wrapper li .poll__option{flex:0 0 auto;width:calc(100% - (23px + 6px));margin-right:6px}.compose-form__poll-wrapper select{appearance:none;box-sizing:border-box;font-size:14px;color:#121a24;display:inline-block;width:auto;outline:0;font-family:inherit;background:#fff url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center/auto 16px;border:1px solid #dbdbdb;border-radius:4px;padding:6px 10px;padding-right:30px}.compose-form__poll-wrapper .icon-button.disabled{color:#dbdbdb}.muted .poll{color:#3e5a7c}.muted .poll__chart{background:rgba(109,137,175,.2)}.muted .poll__chart.leading{background:rgba(216,160,112,.2)}.modal-layout{background:#121a24 url('data:image/svg+xml;utf8,') repeat-x bottom fixed;display:flex;flex-direction:column;height:100vh;padding:0}.modal-layout__mastodon{display:flex;flex:1;flex-direction:column;justify-content:flex-end}.modal-layout__mastodon>*{flex:1;max-height:235px}@media screen and (max-width: 600px){.account-header{margin-top:0}}.emoji-mart{font-size:13px;display:inline-block;color:#121a24}.emoji-mart,.emoji-mart *{box-sizing:border-box;line-height:1.15}.emoji-mart .emoji-mart-emoji{padding:6px}.emoji-mart-bar{border:0 solid #c0cdd9}.emoji-mart-bar:first-child{border-bottom-width:1px;border-top-left-radius:5px;border-top-right-radius:5px;background:#d9e1e8}.emoji-mart-bar:last-child{border-top-width:1px;border-bottom-left-radius:5px;border-bottom-right-radius:5px;display:none}.emoji-mart-anchors{display:flex;justify-content:space-between;padding:0 6px;color:#3e5a7c;line-height:0}.emoji-mart-anchor{position:relative;flex:1;text-align:center;padding:12px 4px;overflow:hidden;transition:color .1s ease-out;cursor:pointer}.emoji-mart-anchor:hover{color:#37506f}.emoji-mart-anchor-selected{color:#d8a070}.emoji-mart-anchor-selected:hover{color:#d49560}.emoji-mart-anchor-selected .emoji-mart-anchor-bar{bottom:-1px}.emoji-mart-anchor-bar{position:absolute;bottom:-5px;left:0;width:100%;height:4px;background-color:#d8a070}.emoji-mart-anchors i{display:inline-block;width:100%;max-width:22px}.emoji-mart-anchors svg{fill:currentColor;max-height:18px}.emoji-mart-scroll{overflow-y:scroll;height:270px;max-height:35vh;padding:0 6px 6px;background:#fff;will-change:transform}.emoji-mart-scroll::-webkit-scrollbar-track:hover,.emoji-mart-scroll::-webkit-scrollbar-track:active{background-color:rgba(0,0,0,.3)}.emoji-mart-search{padding:10px;padding-right:45px;background:#fff}.emoji-mart-search input{font-size:14px;font-weight:400;padding:7px 9px;font-family:inherit;display:block;width:100%;background:rgba(217,225,232,.3);color:#121a24;border:1px solid #d9e1e8;border-radius:4px}.emoji-mart-search input::-moz-focus-inner{border:0}.emoji-mart-search input::-moz-focus-inner,.emoji-mart-search input:focus,.emoji-mart-search input:active{outline:0 !important}.emoji-mart-category .emoji-mart-emoji{cursor:pointer}.emoji-mart-category .emoji-mart-emoji span{z-index:1;position:relative;text-align:center}.emoji-mart-category .emoji-mart-emoji:hover::before{z-index:0;content:\"\";position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(217,225,232,.7);border-radius:100%}.emoji-mart-category-label{z-index:2;position:relative;position:-webkit-sticky;position:sticky;top:0}.emoji-mart-category-label span{display:block;width:100%;font-weight:500;padding:5px 6px;background:#fff}.emoji-mart-emoji{position:relative;display:inline-block;font-size:0}.emoji-mart-emoji span{width:22px;height:22px}.emoji-mart-no-results{font-size:14px;text-align:center;padding-top:70px;color:#9baec8}.emoji-mart-no-results .emoji-mart-category-label{display:none}.emoji-mart-no-results .emoji-mart-no-results-label{margin-top:.2em}.emoji-mart-no-results .emoji-mart-emoji:hover::before{content:none}.emoji-mart-preview{display:none}.container{box-sizing:border-box;max-width:1235px;margin:0 auto;position:relative}@media screen and (max-width: 1255px){.container{width:100%;padding:0 10px}}.rich-formatting{font-family:\"mastodon-font-sans-serif\",sans-serif;font-size:14px;font-weight:400;line-height:1.7;word-wrap:break-word;color:#9baec8}.rich-formatting a{color:#d8a070;text-decoration:underline}.rich-formatting a:hover,.rich-formatting a:focus,.rich-formatting a:active{text-decoration:none}.rich-formatting p,.rich-formatting li{color:#9baec8}.rich-formatting p{margin-top:0;margin-bottom:.85em}.rich-formatting p:last-child{margin-bottom:0}.rich-formatting strong{font-weight:700;color:#d9e1e8}.rich-formatting em{font-style:italic;color:#d9e1e8}.rich-formatting code{font-size:.85em;background:#040609;border-radius:4px;padding:.2em .3em}.rich-formatting h1,.rich-formatting h2,.rich-formatting h3,.rich-formatting h4,.rich-formatting h5,.rich-formatting h6{font-family:\"mastodon-font-display\",sans-serif;margin-top:1.275em;margin-bottom:.85em;font-weight:500;color:#d9e1e8}.rich-formatting h1{font-size:2em}.rich-formatting h2{font-size:1.75em}.rich-formatting h3{font-size:1.5em}.rich-formatting h4{font-size:1.25em}.rich-formatting h5,.rich-formatting h6{font-size:1em}.rich-formatting ul{list-style:disc}.rich-formatting ol{list-style:decimal}.rich-formatting ul,.rich-formatting ol{margin:0;padding:0;padding-left:2em;margin-bottom:.85em}.rich-formatting ul[type=a],.rich-formatting ol[type=a]{list-style-type:lower-alpha}.rich-formatting ul[type=i],.rich-formatting ol[type=i]{list-style-type:lower-roman}.rich-formatting hr{width:100%;height:0;border:0;border-bottom:1px solid #192432;margin:1.7em 0}.rich-formatting hr.spacer{height:1px;border:0}.rich-formatting table{width:100%;border-collapse:collapse;break-inside:auto;margin-top:24px;margin-bottom:32px}.rich-formatting table thead tr,.rich-formatting table tbody tr{border-bottom:1px solid #192432;font-size:1em;line-height:1.625;font-weight:400;text-align:left;color:#9baec8}.rich-formatting table thead tr{border-bottom-width:2px;line-height:1.5;font-weight:500;color:#3e5a7c}.rich-formatting table th,.rich-formatting table td{padding:8px;align-self:start;align-items:start;word-break:break-all}.rich-formatting table th.nowrap,.rich-formatting table td.nowrap{width:25%;position:relative}.rich-formatting table th.nowrap::before,.rich-formatting table td.nowrap::before{content:\" \";visibility:hidden}.rich-formatting table th.nowrap span,.rich-formatting table td.nowrap span{position:absolute;left:8px;right:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rich-formatting>:first-child{margin-top:0}.information-board{background:#0b1016;padding:20px 0}.information-board .container-alt{position:relative;padding-right:295px}.information-board__sections{display:flex;justify-content:space-between;flex-wrap:wrap}.information-board__section{flex:1 0 0;font-family:\"mastodon-font-sans-serif\",sans-serif;font-size:16px;line-height:28px;color:#fff;text-align:right;padding:10px 15px}.information-board__section span,.information-board__section strong{display:block}.information-board__section span:last-child{color:#d9e1e8}.information-board__section strong{font-family:\"mastodon-font-display\",sans-serif;font-weight:500;font-size:32px;line-height:48px}@media screen and (max-width: 700px){.information-board__section{text-align:center}}.information-board .panel{position:absolute;width:280px;box-sizing:border-box;background:#040609;padding:20px;padding-top:10px;border-radius:4px 4px 0 0;right:0;bottom:-40px}.information-board .panel .panel-header{font-family:\"mastodon-font-display\",sans-serif;font-size:14px;line-height:24px;font-weight:500;color:#9baec8;padding-bottom:5px;margin-bottom:15px;border-bottom:1px solid #192432;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.information-board .panel .panel-header a,.information-board .panel .panel-header span{font-weight:400;color:#7a93b6}.information-board .panel .panel-header a{text-decoration:none}.information-board .owner{text-align:center}.information-board .owner .avatar{width:80px;height:80px;margin:0 auto;margin-bottom:15px}.information-board .owner .avatar img{display:block;width:80px;height:80px;border-radius:48px}.information-board .owner .name{font-size:14px}.information-board .owner .name a{display:block;color:#fff;text-decoration:none}.information-board .owner .name a:hover .display_name{text-decoration:underline}.information-board .owner .name .username{display:block;color:#9baec8}.landing-page p,.landing-page li{font-family:\"mastodon-font-sans-serif\",sans-serif;font-size:16px;font-weight:400;font-size:16px;line-height:30px;margin-bottom:12px;color:#9baec8}.landing-page p a,.landing-page li a{color:#d8a070;text-decoration:underline}.landing-page em{display:inline;margin:0;padding:0;font-weight:700;background:transparent;font-family:inherit;font-size:inherit;line-height:inherit;color:#bcc9da}.landing-page h1{font-family:\"mastodon-font-display\",sans-serif;font-size:26px;line-height:30px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page h1 small{font-family:\"mastodon-font-sans-serif\",sans-serif;display:block;font-size:18px;font-weight:400;color:#bcc9da}.landing-page h2{font-family:\"mastodon-font-display\",sans-serif;font-size:22px;line-height:26px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page h3{font-family:\"mastodon-font-display\",sans-serif;font-size:18px;line-height:24px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page h4{font-family:\"mastodon-font-display\",sans-serif;font-size:16px;line-height:24px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page h5{font-family:\"mastodon-font-display\",sans-serif;font-size:14px;line-height:24px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page h6{font-family:\"mastodon-font-display\",sans-serif;font-size:12px;line-height:24px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page ul,.landing-page ol{margin-left:20px}.landing-page ul[type=a],.landing-page ol[type=a]{list-style-type:lower-alpha}.landing-page ul[type=i],.landing-page ol[type=i]{list-style-type:lower-roman}.landing-page ul{list-style:disc}.landing-page ol{list-style:decimal}.landing-page li>ol,.landing-page li>ul{margin-top:6px}.landing-page hr{width:100%;height:0;border:0;border-bottom:1px solid rgba(62,90,124,.6);margin:20px 0}.landing-page hr.spacer{height:1px;border:0}.landing-page__information,.landing-page__forms{padding:20px}.landing-page__call-to-action{background:#121a24;border-radius:4px;padding:25px 40px;overflow:hidden;box-sizing:border-box}.landing-page__call-to-action .row{width:100%;display:flex;flex-direction:row-reverse;flex-wrap:nowrap;justify-content:space-between;align-items:center}.landing-page__call-to-action .row__information-board{display:flex;justify-content:flex-end;align-items:flex-end}.landing-page__call-to-action .row__information-board .information-board__section{flex:1 0 auto;padding:0 10px}@media screen and (max-width: 415px){.landing-page__call-to-action .row__information-board{width:100%;justify-content:space-between}}.landing-page__call-to-action .row__mascot{flex:1;margin:10px -50px 0 0}@media screen and (max-width: 415px){.landing-page__call-to-action .row__mascot{display:none}}.landing-page__logo{margin-right:20px}.landing-page__logo img{height:50px;width:auto;mix-blend-mode:lighten}.landing-page__information{padding:45px 40px;margin-bottom:10px}.landing-page__information:last-child{margin-bottom:0}.landing-page__information strong{font-weight:500;color:#bcc9da}.landing-page__information .account{border-bottom:0;padding:0}.landing-page__information .account__display-name{align-items:center;display:flex;margin-right:5px}.landing-page__information .account div.account__display-name:hover .display-name strong{text-decoration:none}.landing-page__information .account div.account__display-name .account__avatar{cursor:default}.landing-page__information .account__avatar-wrapper{margin-left:0;flex:0 0 auto}.landing-page__information .account__avatar{width:44px;height:44px;background-size:44px 44px}.landing-page__information .account .display-name{font-size:15px}.landing-page__information .account .display-name__account{font-size:14px}@media screen and (max-width: 960px){.landing-page__information .contact{margin-top:30px}}@media screen and (max-width: 700px){.landing-page__information{padding:25px 20px}}.landing-page__information,.landing-page__forms,.landing-page #mastodon-timeline{box-sizing:border-box;background:#121a24;border-radius:4px;box-shadow:0 0 6px rgba(0,0,0,.1)}.landing-page__mascot{height:104px;position:relative;left:-40px;bottom:25px}.landing-page__mascot img{height:190px;width:auto}.landing-page__short-description .row{display:flex;flex-wrap:wrap;align-items:center;margin-bottom:40px}@media screen and (max-width: 700px){.landing-page__short-description .row{margin-bottom:20px}}.landing-page__short-description p a{color:#d9e1e8}.landing-page__short-description h1{font-weight:500;color:#fff;margin-bottom:0}.landing-page__short-description h1 small{color:#9baec8}.landing-page__short-description h1 small span{color:#d9e1e8}.landing-page__short-description p:last-child{margin-bottom:0}.landing-page__hero{margin-bottom:10px}.landing-page__hero img{display:block;margin:0;max-width:100%;height:auto;border-radius:4px}@media screen and (max-width: 840px){.landing-page .information-board .container-alt{padding-right:20px}.landing-page .information-board .panel{position:static;margin-top:20px;width:100%;border-radius:4px}.landing-page .information-board .panel .panel-header{text-align:center}}@media screen and (max-width: 675px){.landing-page .header-wrapper{padding-top:0}.landing-page .header-wrapper.compact{padding-bottom:0}.landing-page .header-wrapper.compact .hero .heading{text-align:initial}.landing-page .header .container-alt,.landing-page .features .container-alt{display:block}}.landing-page .cta{margin:20px}.landing{margin-bottom:100px}@media screen and (max-width: 738px){.landing{margin-bottom:0}}.landing__brand{display:flex;justify-content:center;align-items:center;padding:50px}.landing__brand svg{fill:#fff;height:52px}@media screen and (max-width: 415px){.landing__brand{padding:0;margin-bottom:30px}}.landing .directory{margin-top:30px;background:transparent;box-shadow:none;border-radius:0}.landing .hero-widget{margin-top:30px;margin-bottom:0}.landing .hero-widget h4{padding:10px;text-transform:uppercase;font-weight:700;font-size:13px;color:#9baec8}.landing .hero-widget__text{border-radius:0;padding-bottom:0}.landing .hero-widget__footer{background:#121a24;padding:10px;border-radius:0 0 4px 4px;display:flex}.landing .hero-widget__footer__column{flex:1 1 50%}.landing .hero-widget .account{padding:10px 0;border-bottom:0}.landing .hero-widget .account .account__display-name{display:flex;align-items:center}.landing .hero-widget .account .account__avatar{width:44px;height:44px;background-size:44px 44px}.landing .hero-widget__counter{padding:10px}.landing .hero-widget__counter strong{font-family:\"mastodon-font-display\",sans-serif;font-size:15px;font-weight:700;display:block}.landing .hero-widget__counter span{font-size:14px;color:#9baec8}.landing .simple_form .user_agreement .label_input>label{font-weight:400;color:#9baec8}.landing .simple_form p.lead{color:#9baec8;font-size:15px;line-height:20px;font-weight:400;margin-bottom:25px}.landing__grid{max-width:960px;margin:0 auto;display:grid;grid-template-columns:minmax(0, 50%) minmax(0, 50%);grid-gap:30px}@media screen and (max-width: 738px){.landing__grid{grid-template-columns:minmax(0, 100%);grid-gap:10px}.landing__grid__column-login{grid-row:1;display:flex;flex-direction:column}.landing__grid__column-login .box-widget{order:2;flex:0 0 auto}.landing__grid__column-login .hero-widget{margin-top:0;margin-bottom:10px;order:1;flex:0 0 auto}.landing__grid__column-registration{grid-row:2}.landing__grid .directory{margin-top:10px}}@media screen and (max-width: 415px){.landing__grid{grid-gap:0}.landing__grid .hero-widget{display:block;margin-bottom:0;box-shadow:none}.landing__grid .hero-widget__img,.landing__grid .hero-widget__img img,.landing__grid .hero-widget__footer{border-radius:0}.landing__grid .hero-widget,.landing__grid .box-widget,.landing__grid .directory__tag{border-bottom:1px solid #202e3f}.landing__grid .directory{margin-top:0}.landing__grid .directory__tag{margin-bottom:0}.landing__grid .directory__tag>a,.landing__grid .directory__tag>div{border-radius:0;box-shadow:none}.landing__grid .directory__tag:last-child{border-bottom:0}}.brand{position:relative;text-decoration:none}.brand__tagline{display:block;position:absolute;bottom:-10px;left:50px;width:300px;color:#9baec8;text-decoration:none;font-size:14px}@media screen and (max-width: 415px){.brand__tagline{position:static;width:auto;margin-top:20px;color:#3e5a7c}}.table{width:100%;max-width:100%;border-spacing:0;border-collapse:collapse}.table th,.table td{padding:8px;line-height:18px;vertical-align:top;border-top:1px solid #121a24;text-align:left;background:#0b1016}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #121a24;border-top:0;font-weight:500}.table>tbody>tr>th{font-weight:500}.table>tbody>tr:nth-child(odd)>td,.table>tbody>tr:nth-child(odd)>th{background:#121a24}.table a{color:#d8a070;text-decoration:underline}.table a:hover{text-decoration:none}.table strong{font-weight:500}.table strong:lang(ja){font-weight:700}.table strong:lang(ko){font-weight:700}.table strong:lang(zh-CN){font-weight:700}.table strong:lang(zh-HK){font-weight:700}.table strong:lang(zh-TW){font-weight:700}.table.inline-table>tbody>tr:nth-child(odd)>td,.table.inline-table>tbody>tr:nth-child(odd)>th{background:transparent}.table.inline-table>tbody>tr:first-child>td,.table.inline-table>tbody>tr:first-child>th{border-top:0}.table.batch-table>thead>tr>th{background:#121a24;border-top:1px solid #040609;border-bottom:1px solid #040609}.table.batch-table>thead>tr>th:first-child{border-radius:4px 0 0;border-left:1px solid #040609}.table.batch-table>thead>tr>th:last-child{border-radius:0 4px 0 0;border-right:1px solid #040609}.table--invites tbody td{vertical-align:middle}.table-wrapper{overflow:auto;margin-bottom:20px}samp{font-family:\"mastodon-font-monospace\",monospace}button.table-action-link{background:transparent;border:0;font:inherit}button.table-action-link,a.table-action-link{text-decoration:none;display:inline-block;margin-right:5px;padding:0 10px;color:#9baec8;font-weight:500}button.table-action-link:hover,a.table-action-link:hover{color:#fff}button.table-action-link i.fa,a.table-action-link i.fa{font-weight:400;margin-right:5px}button.table-action-link:first-child,a.table-action-link:first-child{padding-left:0}.batch-table__toolbar,.batch-table__row{display:flex}.batch-table__toolbar__select,.batch-table__row__select{box-sizing:border-box;padding:8px 16px;cursor:pointer;min-height:100%}.batch-table__toolbar__select input,.batch-table__row__select input{margin-top:8px}.batch-table__toolbar__select--aligned,.batch-table__row__select--aligned{display:flex;align-items:center}.batch-table__toolbar__select--aligned input,.batch-table__row__select--aligned input{margin-top:0}.batch-table__toolbar__actions,.batch-table__toolbar__content,.batch-table__row__actions,.batch-table__row__content{padding:8px 0;padding-right:16px;flex:1 1 auto}.batch-table__toolbar{border:1px solid #040609;background:#121a24;border-radius:4px 0 0;height:47px;align-items:center}.batch-table__toolbar__actions{text-align:right;padding-right:11px}.batch-table__form{padding:16px;border:1px solid #040609;border-top:0;background:#121a24}.batch-table__form .fields-row{padding-top:0;margin-bottom:0}.batch-table__row{border:1px solid #040609;border-top:0;background:#0b1016}@media screen and (max-width: 415px){.optional .batch-table__row:first-child{border-top:1px solid #040609}}.batch-table__row:hover{background:#0f151d}.batch-table__row:nth-child(even){background:#121a24}.batch-table__row:nth-child(even):hover{background:#151f2b}.batch-table__row__content{padding-top:12px;padding-bottom:16px}.batch-table__row__content--unpadded{padding:0}.batch-table__row__content--with-image{display:flex;align-items:center}.batch-table__row__content__image{flex:0 0 auto;display:flex;justify-content:center;align-items:center;margin-right:10px}.batch-table__row__content__image .emojione{width:32px;height:32px}.batch-table__row__content__text{flex:1 1 auto}.batch-table__row__content__extra{flex:0 0 auto;text-align:right;color:#9baec8;font-weight:500}.batch-table__row .directory__tag{margin:0;width:100%}.batch-table__row .directory__tag a{background:transparent;border-radius:0}@media screen and (max-width: 415px){.batch-table.optional .batch-table__toolbar,.batch-table.optional .batch-table__row__select{display:none}}.batch-table .status__content{padding-top:0}.batch-table .status__content summary{display:list-item}.batch-table .status__content strong{font-weight:700}.batch-table .nothing-here{border:1px solid #040609;border-top:0;box-shadow:none}@media screen and (max-width: 415px){.batch-table .nothing-here{border-top:1px solid #040609}}@media screen and (max-width: 870px){.batch-table .accounts-table tbody td.optional{display:none}}.admin-wrapper{display:flex;justify-content:center;width:100%;min-height:100vh}.admin-wrapper .sidebar-wrapper{min-height:100vh;overflow:hidden;pointer-events:none;flex:1 1 auto}.admin-wrapper .sidebar-wrapper__inner{display:flex;justify-content:flex-end;background:#121a24;height:100%}.admin-wrapper .sidebar{width:240px;padding:0;pointer-events:auto}.admin-wrapper .sidebar__toggle{display:none;background:#202e3f;height:48px}.admin-wrapper .sidebar__toggle__logo{flex:1 1 auto}.admin-wrapper .sidebar__toggle__logo a{display:inline-block;padding:15px}.admin-wrapper .sidebar__toggle__logo svg{fill:#fff;height:20px;position:relative;bottom:-2px}.admin-wrapper .sidebar__toggle__icon{display:block;color:#9baec8;text-decoration:none;flex:0 0 auto;font-size:20px;padding:15px}.admin-wrapper .sidebar__toggle a:hover,.admin-wrapper .sidebar__toggle a:focus,.admin-wrapper .sidebar__toggle a:active{background:#26374d}.admin-wrapper .sidebar .logo{display:block;margin:40px auto;width:100px;height:100px}@media screen and (max-width: 600px){.admin-wrapper .sidebar>a:first-child{display:none}}.admin-wrapper .sidebar ul{list-style:none;border-radius:4px 0 0 4px;overflow:hidden;margin-bottom:20px}@media screen and (max-width: 600px){.admin-wrapper .sidebar ul{margin-bottom:0}}.admin-wrapper .sidebar ul a{display:block;padding:15px;color:#9baec8;text-decoration:none;transition:all 200ms linear;transition-property:color,background-color;border-radius:4px 0 0 4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.admin-wrapper .sidebar ul a i.fa{margin-right:5px}.admin-wrapper .sidebar ul a:hover{color:#fff;background-color:#0a0e13;transition:all 100ms linear;transition-property:color,background-color}.admin-wrapper .sidebar ul a.selected{background:#0f151d;border-radius:4px 0 0}.admin-wrapper .sidebar ul ul{background:#0b1016;border-radius:0 0 0 4px;margin:0}.admin-wrapper .sidebar ul ul a{border:0;padding:15px 35px}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a{color:#fff;background-color:#d8a070;border-bottom:0;border-radius:0}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a:hover{background-color:#ddad84}.admin-wrapper .sidebar>ul>.simple-navigation-active-leaf a{border-radius:4px 0 0 4px}.admin-wrapper .content-wrapper{box-sizing:border-box;width:100%;max-width:840px;flex:1 1 auto}@media screen and (max-width: 1080px){.admin-wrapper .sidebar-wrapper--empty{display:none}.admin-wrapper .sidebar-wrapper{width:240px;flex:0 0 auto}}@media screen and (max-width: 600px){.admin-wrapper .sidebar-wrapper{width:100%}}.admin-wrapper .content{padding:20px 15px;padding-top:60px;padding-left:25px}@media screen and (max-width: 600px){.admin-wrapper .content{max-width:none;padding:15px;padding-top:30px}}.admin-wrapper .content-heading{display:flex;padding-bottom:40px;border-bottom:1px solid #202e3f;margin:-15px -15px 40px 0;flex-wrap:wrap;align-items:center;justify-content:space-between}.admin-wrapper .content-heading>*{margin-top:15px;margin-right:15px}.admin-wrapper .content-heading-actions{display:inline-flex}.admin-wrapper .content-heading-actions>:not(:first-child){margin-left:5px}@media screen and (max-width: 600px){.admin-wrapper .content-heading{border-bottom:0;padding-bottom:0}}.admin-wrapper .content h2{color:#d9e1e8;font-size:24px;line-height:28px;font-weight:400}@media screen and (max-width: 600px){.admin-wrapper .content h2{font-weight:700}}.admin-wrapper .content h3{color:#d9e1e8;font-size:20px;line-height:28px;font-weight:400;margin-bottom:30px}.admin-wrapper .content h4{text-transform:uppercase;font-size:13px;font-weight:700;color:#9baec8;padding-bottom:8px;margin-bottom:8px;border-bottom:1px solid #202e3f}.admin-wrapper .content h6{font-size:16px;color:#d9e1e8;line-height:28px;font-weight:500}.admin-wrapper .content .fields-group h6{color:#fff;font-weight:500}.admin-wrapper .content .directory__tag>a,.admin-wrapper .content .directory__tag>div{box-shadow:none}.admin-wrapper .content .directory__tag .table-action-link .fa{color:inherit}.admin-wrapper .content .directory__tag h4{font-size:18px;font-weight:700;color:#fff;text-transform:none;padding-bottom:0;margin-bottom:0;border-bottom:0}.admin-wrapper .content>p{font-size:14px;line-height:21px;color:#d9e1e8;margin-bottom:20px}.admin-wrapper .content>p strong{color:#fff;font-weight:500}.admin-wrapper .content>p strong:lang(ja){font-weight:700}.admin-wrapper .content>p strong:lang(ko){font-weight:700}.admin-wrapper .content>p strong:lang(zh-CN){font-weight:700}.admin-wrapper .content>p strong:lang(zh-HK){font-weight:700}.admin-wrapper .content>p strong:lang(zh-TW){font-weight:700}.admin-wrapper .content hr{width:100%;height:0;border:0;border-bottom:1px solid rgba(62,90,124,.6);margin:20px 0}.admin-wrapper .content hr.spacer{height:1px;border:0}@media screen and (max-width: 600px){.admin-wrapper{display:block}.admin-wrapper .sidebar-wrapper{min-height:0}.admin-wrapper .sidebar{width:100%;padding:0;height:auto}.admin-wrapper .sidebar__toggle{display:flex}.admin-wrapper .sidebar>ul{display:none}.admin-wrapper .sidebar ul a,.admin-wrapper .sidebar ul ul a{border-radius:0;border-bottom:1px solid #192432;transition:none}.admin-wrapper .sidebar ul a:hover,.admin-wrapper .sidebar ul ul a:hover{transition:none}.admin-wrapper .sidebar ul ul{border-radius:0}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a{border-bottom-color:#d8a070}}hr.spacer{width:100%;border:0;margin:20px 0;height:1px}body .muted-hint,.admin-wrapper .content .muted-hint{color:#9baec8}body .muted-hint a,.admin-wrapper .content .muted-hint a{color:#d8a070}body .positive-hint,.admin-wrapper .content .positive-hint{color:#79bd9a;font-weight:500}body .negative-hint,.admin-wrapper .content .negative-hint{color:#df405a;font-weight:500}body .neutral-hint,.admin-wrapper .content .neutral-hint{color:#3e5a7c;font-weight:500}body .warning-hint,.admin-wrapper .content .warning-hint{color:#ca8f04;font-weight:500}.filters{display:flex;flex-wrap:wrap}.filters .filter-subset{flex:0 0 auto;margin:0 40px 20px 0}.filters .filter-subset:last-child{margin-bottom:30px}.filters .filter-subset ul{margin-top:5px;list-style:none}.filters .filter-subset ul li{display:inline-block;margin-right:5px}.filters .filter-subset strong{font-weight:500;text-transform:uppercase;font-size:12px}.filters .filter-subset strong:lang(ja){font-weight:700}.filters .filter-subset strong:lang(ko){font-weight:700}.filters .filter-subset strong:lang(zh-CN){font-weight:700}.filters .filter-subset strong:lang(zh-HK){font-weight:700}.filters .filter-subset strong:lang(zh-TW){font-weight:700}.filters .filter-subset--with-select strong{display:block;margin-bottom:10px}.filters .filter-subset a{display:inline-block;color:#9baec8;text-decoration:none;text-transform:uppercase;font-size:12px;font-weight:500;border-bottom:2px solid #121a24}.filters .filter-subset a:hover{color:#fff;border-bottom:2px solid #1b2635}.filters .filter-subset a.selected{color:#d8a070;border-bottom:2px solid #d8a070}.flavour-screen{display:block;margin:10px auto;max-width:100%}.flavour-description{display:block;font-size:16px;margin:10px 0}.flavour-description>p{margin:10px 0}.flavour-screen{display:block;margin:10px auto;max-width:100%}.flavour-description{display:block;font-size:16px;margin:10px 0}.flavour-description>p{margin:10px 0}.report-accounts{display:flex;flex-wrap:wrap;margin-bottom:20px}.report-accounts__item{display:flex;flex:250px;flex-direction:column;margin:0 5px}.report-accounts__item>strong{display:block;margin:0 0 10px -5px;font-weight:500;font-size:14px;line-height:18px;color:#d9e1e8}.report-accounts__item>strong:lang(ja){font-weight:700}.report-accounts__item>strong:lang(ko){font-weight:700}.report-accounts__item>strong:lang(zh-CN){font-weight:700}.report-accounts__item>strong:lang(zh-HK){font-weight:700}.report-accounts__item>strong:lang(zh-TW){font-weight:700}.report-accounts__item .account-card{flex:1 1 auto}.report-status,.account-status{display:flex;margin-bottom:10px}.report-status .activity-stream,.account-status .activity-stream{flex:2 0 0;margin-right:20px;max-width:calc(100% - 60px)}.report-status .activity-stream .entry,.account-status .activity-stream .entry{border-radius:4px}.report-status__actions,.account-status__actions{flex:0 0 auto;display:flex;flex-direction:column}.report-status__actions .icon-button,.account-status__actions .icon-button{font-size:24px;width:24px;text-align:center;margin-bottom:10px}.simple_form.new_report_note,.simple_form.new_account_moderation_note{max-width:100%}.batch-form-box{display:flex;flex-wrap:wrap;margin-bottom:5px}.batch-form-box #form_status_batch_action{margin:0 5px 5px 0;font-size:14px}.batch-form-box input.button{margin:0 5px 5px 0}.batch-form-box .media-spoiler-toggle-buttons{margin-left:auto}.batch-form-box .media-spoiler-toggle-buttons .button{overflow:visible;margin:0 0 5px 5px;float:right}.back-link{margin-bottom:10px;font-size:14px}.back-link a{color:#d8a070;text-decoration:none}.back-link a:hover{text-decoration:underline}.spacer{flex:1 1 auto}.log-entry{line-height:20px;padding:15px 0;background:#121a24;border-bottom:1px solid #192432}.log-entry:last-child{border-bottom:0}.log-entry__header{display:flex;justify-content:flex-start;align-items:center;color:#9baec8;font-size:14px;padding:0 10px}.log-entry__avatar{margin-right:10px}.log-entry__avatar .avatar{display:block;margin:0;border-radius:50%;width:40px;height:40px}.log-entry__content{max-width:calc(100% - 90px)}.log-entry__title{word-wrap:break-word}.log-entry__timestamp{color:#3e5a7c}.log-entry a,.log-entry .username,.log-entry .target{color:#d9e1e8;text-decoration:none;font-weight:500}a.name-tag,.name-tag,a.inline-name-tag,.inline-name-tag{text-decoration:none;color:#d9e1e8}a.name-tag .username,.name-tag .username,a.inline-name-tag .username,.inline-name-tag .username{font-weight:500}a.name-tag.suspended .username,.name-tag.suspended .username,a.inline-name-tag.suspended .username,.inline-name-tag.suspended .username{text-decoration:line-through;color:#e87487}a.name-tag.suspended .avatar,.name-tag.suspended .avatar,a.inline-name-tag.suspended .avatar,.inline-name-tag.suspended .avatar{filter:grayscale(100%);opacity:.8}a.name-tag,.name-tag{display:flex;align-items:center}a.name-tag .avatar,.name-tag .avatar{display:block;margin:0;margin-right:5px;border-radius:50%}a.name-tag.suspended .avatar,.name-tag.suspended .avatar{filter:grayscale(100%);opacity:.8}.speech-bubble{margin-bottom:20px;border-left:4px solid #d8a070}.speech-bubble.positive{border-left-color:#79bd9a}.speech-bubble.negative{border-left-color:#e87487}.speech-bubble.warning{border-left-color:#ca8f04}.speech-bubble__bubble{padding:16px;padding-left:14px;font-size:15px;line-height:20px;border-radius:4px 4px 4px 0;position:relative;font-weight:500}.speech-bubble__bubble a{color:#9baec8}.speech-bubble__owner{padding:8px;padding-left:12px}.speech-bubble time{color:#3e5a7c}.report-card{background:#121a24;border-radius:4px;margin-bottom:20px}.report-card__profile{display:flex;justify-content:space-between;align-items:center;padding:15px}.report-card__profile .account{padding:0;border:0}.report-card__profile .account__avatar-wrapper{margin-left:0}.report-card__profile__stats{flex:0 0 auto;font-weight:500;color:#9baec8;text-transform:uppercase;text-align:right}.report-card__profile__stats a{color:inherit;text-decoration:none}.report-card__profile__stats a:focus,.report-card__profile__stats a:hover,.report-card__profile__stats a:active{color:#b5c3d6}.report-card__profile__stats .red{color:#df405a}.report-card__summary__item{display:flex;justify-content:flex-start;border-top:1px solid #0b1016}.report-card__summary__item:hover{background:#151f2b}.report-card__summary__item__reported-by,.report-card__summary__item__assigned{padding:15px;flex:0 0 auto;box-sizing:border-box;width:150px;color:#9baec8}.report-card__summary__item__reported-by,.report-card__summary__item__reported-by .username,.report-card__summary__item__assigned,.report-card__summary__item__assigned .username{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.report-card__summary__item__content{flex:1 1 auto;max-width:calc(100% - 300px)}.report-card__summary__item__content__icon{color:#3e5a7c;margin-right:4px;font-weight:500}.report-card__summary__item__content a{display:block;box-sizing:border-box;width:100%;padding:15px;text-decoration:none;color:#9baec8}.one-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ellipsized-ip{display:inline-block;max-width:120px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.admin-account-bio{display:flex;flex-wrap:wrap;margin:0 -5px;margin-top:20px}.admin-account-bio>div{box-sizing:border-box;padding:0 5px;margin-bottom:10px;flex:1 0 50%}.admin-account-bio .account__header__fields,.admin-account-bio .account__header__content{background:#202e3f;border-radius:4px;height:100%}.admin-account-bio .account__header__fields{margin:0;border:0}.admin-account-bio .account__header__fields a{color:#e1b590}.admin-account-bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.admin-account-bio .account__header__fields .verified a{color:#79bd9a}.admin-account-bio .account__header__content{box-sizing:border-box;padding:20px;color:#fff}.center-text{text-align:center}.announcements-list{border:1px solid #192432;border-radius:4px}.announcements-list__item{padding:15px 0;background:#121a24;border-bottom:1px solid #192432}.announcements-list__item__title{padding:0 15px;display:block;font-weight:500;font-size:18px;line-height:1.5;color:#d9e1e8;text-decoration:none;margin-bottom:10px}.announcements-list__item__title:hover,.announcements-list__item__title:focus,.announcements-list__item__title:active{color:#fff}.announcements-list__item__meta{padding:0 15px;color:#3e5a7c}.announcements-list__item__action-bar{display:flex;justify-content:space-between;align-items:center}.announcements-list__item:last-child{border-bottom:0}.dashboard__counters{display:flex;flex-wrap:wrap;margin:0 -5px;margin-bottom:20px}.dashboard__counters>div{box-sizing:border-box;flex:0 0 33.333%;padding:0 5px;margin-bottom:10px}.dashboard__counters>div>div,.dashboard__counters>div>a{padding:20px;background:#192432;border-radius:4px;box-sizing:border-box;height:100%}.dashboard__counters>div>a{text-decoration:none;color:inherit;display:block}.dashboard__counters>div>a:hover,.dashboard__counters>div>a:focus,.dashboard__counters>div>a:active{background:#202e3f}.dashboard__counters__num,.dashboard__counters__text{text-align:center;font-weight:500;font-size:24px;line-height:21px;color:#fff;font-family:\"mastodon-font-display\",sans-serif;margin-bottom:20px;line-height:30px}.dashboard__counters__text{font-size:18px}.dashboard__counters__label{font-size:14px;color:#9baec8;text-align:center;font-weight:500}.dashboard__widgets{display:flex;flex-wrap:wrap;margin:0 -5px}.dashboard__widgets>div{flex:0 0 33.333%;margin-bottom:20px}.dashboard__widgets>div>div{padding:0 5px}.dashboard__widgets a:not(.name-tag){color:#d9e1e8;font-weight:500;text-decoration:none}body.rtl{direction:rtl}body.rtl .column-header>button{text-align:right;padding-left:0;padding-right:15px}body.rtl .radio-button__input{margin-right:0;margin-left:10px}body.rtl .directory__card__bar .display-name{margin-left:0;margin-right:15px}body.rtl .display-name{text-align:right}body.rtl .notification__message{margin-left:0;margin-right:68px}body.rtl .drawer__inner__mastodon>img{transform:scaleX(-1)}body.rtl .notification__favourite-icon-wrapper{left:auto;right:-26px}body.rtl .landing-page__logo{margin-right:0;margin-left:20px}body.rtl .landing-page .features-list .features-list__row .visual{margin-left:0;margin-right:15px}body.rtl .column-link__icon,body.rtl .column-header__icon{margin-right:0;margin-left:5px}body.rtl .compose-form .compose-form__buttons-wrapper .character-counter__wrapper{margin-right:0;margin-left:4px}body.rtl .navigation-bar__profile{margin-left:0;margin-right:8px}body.rtl .search__input{padding-right:10px;padding-left:30px}body.rtl .search__icon .fa{right:auto;left:10px}body.rtl .columns-area{direction:rtl}body.rtl .column-header__buttons{left:0;right:auto;margin-left:0;margin-right:-15px}body.rtl .column-inline-form .icon-button{margin-left:0;margin-right:5px}body.rtl .column-header__links .text-btn{margin-left:10px;margin-right:0}body.rtl .account__avatar-wrapper{float:right}body.rtl .column-header__back-button{padding-left:5px;padding-right:0}body.rtl .column-header__setting-arrows{float:left}body.rtl .setting-toggle__label{margin-left:0;margin-right:8px}body.rtl .status__avatar{left:auto;right:10px}body.rtl .status,body.rtl .activity-stream .status.light{padding-left:10px;padding-right:68px}body.rtl .status__info .status__display-name,body.rtl .activity-stream .status.light .status__display-name{padding-left:25px;padding-right:0}body.rtl .activity-stream .pre-header{padding-right:68px;padding-left:0}body.rtl .status__prepend{margin-left:0;margin-right:68px}body.rtl .status__prepend-icon-wrapper{left:auto;right:-26px}body.rtl .activity-stream .pre-header .pre-header__icon{left:auto;right:42px}body.rtl .account__avatar-overlay-overlay{right:auto;left:0}body.rtl .column-back-button--slim-button{right:auto;left:0}body.rtl .status__relative-time,body.rtl .activity-stream .status.light .status__header .status__meta{float:left}body.rtl .status__action-bar__counter{margin-right:0;margin-left:11px}body.rtl .status__action-bar__counter .status__action-bar-button{margin-right:0;margin-left:4px}body.rtl .status__action-bar-button{float:right;margin-right:0;margin-left:18px}body.rtl .status__action-bar-dropdown{float:right}body.rtl .privacy-dropdown__dropdown{margin-left:0;margin-right:40px}body.rtl .privacy-dropdown__option__icon{margin-left:10px;margin-right:0}body.rtl .detailed-status__display-name .display-name{text-align:right}body.rtl .detailed-status__display-avatar{margin-right:0;margin-left:10px;float:right}body.rtl .detailed-status__favorites,body.rtl .detailed-status__reblogs{margin-left:0;margin-right:6px}body.rtl .fa-ul{margin-left:2.14285714em}body.rtl .fa-li{left:auto;right:-2.14285714em}body.rtl .admin-wrapper{direction:rtl}body.rtl .admin-wrapper .sidebar ul a i.fa,body.rtl a.table-action-link i.fa{margin-right:0;margin-left:5px}body.rtl .simple_form .check_boxes .checkbox label{padding-left:0;padding-right:25px}body.rtl .simple_form .input.with_label.boolean label.checkbox{padding-left:25px;padding-right:0}body.rtl .simple_form .check_boxes .checkbox input[type=checkbox],body.rtl .simple_form .input.boolean input[type=checkbox]{left:auto;right:0}body.rtl .simple_form .input.radio_buttons .radio{left:auto;right:0}body.rtl .simple_form .input.radio_buttons .radio>label{padding-right:28px;padding-left:0}body.rtl .simple_form .input-with-append .input input{padding-left:142px;padding-right:0}body.rtl .simple_form .input.boolean label.checkbox{left:auto;right:0}body.rtl .simple_form .input.boolean .label_input,body.rtl .simple_form .input.boolean .hint{padding-left:0;padding-right:28px}body.rtl .simple_form .label_input__append{right:auto;left:3px}body.rtl .simple_form .label_input__append::after{right:auto;left:0;background-image:linear-gradient(to left, rgba(1, 1, 2, 0), #010102)}body.rtl .simple_form select{background:#010102 url(\"data:image/svg+xml;utf8,\") no-repeat left 8px center/auto 16px}body.rtl .table th,body.rtl .table td{text-align:right}body.rtl .filters .filter-subset{margin-right:0;margin-left:45px}body.rtl .landing-page .header-wrapper .mascot{right:60px;left:auto}body.rtl .landing-page__call-to-action .row__information-board{direction:rtl}body.rtl .landing-page .header .hero .floats .float-1{left:-120px;right:auto}body.rtl .landing-page .header .hero .floats .float-2{left:210px;right:auto}body.rtl .landing-page .header .hero .floats .float-3{left:110px;right:auto}body.rtl .landing-page .header .links .brand img{left:0}body.rtl .landing-page .fa-external-link{padding-right:5px;padding-left:0 !important}body.rtl .landing-page .features #mastodon-timeline{margin-right:0;margin-left:30px}@media screen and (min-width: 631px){body.rtl .column,body.rtl .drawer{padding-left:5px;padding-right:5px}body.rtl .column:first-child,body.rtl .drawer:first-child{padding-left:5px;padding-right:10px}body.rtl .columns-area>div .column,body.rtl .columns-area>div .drawer{padding-left:5px;padding-right:5px}}body.rtl .columns-area--mobile .column,body.rtl .columns-area--mobile .drawer{padding-left:0;padding-right:0}body.rtl .public-layout .header .nav-button{margin-left:8px;margin-right:0}body.rtl .public-layout .public-account-header__tabs{margin-left:0;margin-right:20px}body.rtl .landing-page__information .account__display-name{margin-right:0;margin-left:5px}body.rtl .landing-page__information .account__avatar-wrapper{margin-left:12px;margin-right:0}body.rtl .card__bar .display-name{margin-left:0;margin-right:15px;text-align:right}body.rtl .fa-chevron-left::before{content:\"\"}body.rtl .fa-chevron-right::before{content:\"\"}body.rtl .column-back-button__icon{margin-right:0;margin-left:5px}body.rtl .column-header__setting-arrows .column-header__setting-btn:last-child{padding-left:0;padding-right:10px}body.rtl .simple_form .input.radio_buttons .radio>label input{left:auto;right:0}.emojione[title=\":wavy_dash:\"],.emojione[title=\":waving_black_flag:\"],.emojione[title=\":water_buffalo:\"],.emojione[title=\":video_game:\"],.emojione[title=\":video_camera:\"],.emojione[title=\":vhs:\"],.emojione[title=\":turkey:\"],.emojione[title=\":tophat:\"],.emojione[title=\":top:\"],.emojione[title=\":tm:\"],.emojione[title=\":telephone_receiver:\"],.emojione[title=\":spider:\"],.emojione[title=\":speaking_head_in_silhouette:\"],.emojione[title=\":spades:\"],.emojione[title=\":soon:\"],.emojione[title=\":registered:\"],.emojione[title=\":on:\"],.emojione[title=\":musical_score:\"],.emojione[title=\":movie_camera:\"],.emojione[title=\":mortar_board:\"],.emojione[title=\":microphone:\"],.emojione[title=\":male-guard:\"],.emojione[title=\":lower_left_fountain_pen:\"],.emojione[title=\":lower_left_ballpoint_pen:\"],.emojione[title=\":kaaba:\"],.emojione[title=\":joystick:\"],.emojione[title=\":hole:\"],.emojione[title=\":hocho:\"],.emojione[title=\":heavy_plus_sign:\"],.emojione[title=\":heavy_multiplication_x:\"],.emojione[title=\":heavy_minus_sign:\"],.emojione[title=\":heavy_dollar_sign:\"],.emojione[title=\":heavy_division_sign:\"],.emojione[title=\":heavy_check_mark:\"],.emojione[title=\":guardsman:\"],.emojione[title=\":gorilla:\"],.emojione[title=\":fried_egg:\"],.emojione[title=\":film_projector:\"],.emojione[title=\":female-guard:\"],.emojione[title=\":end:\"],.emojione[title=\":electric_plug:\"],.emojione[title=\":eight_pointed_black_star:\"],.emojione[title=\":dark_sunglasses:\"],.emojione[title=\":currency_exchange:\"],.emojione[title=\":curly_loop:\"],.emojione[title=\":copyright:\"],.emojione[title=\":clubs:\"],.emojione[title=\":camera_with_flash:\"],.emojione[title=\":camera:\"],.emojione[title=\":busts_in_silhouette:\"],.emojione[title=\":bust_in_silhouette:\"],.emojione[title=\":bowling:\"],.emojione[title=\":bomb:\"],.emojione[title=\":black_small_square:\"],.emojione[title=\":black_nib:\"],.emojione[title=\":black_medium_square:\"],.emojione[title=\":black_medium_small_square:\"],.emojione[title=\":black_large_square:\"],.emojione[title=\":black_heart:\"],.emojione[title=\":black_circle:\"],.emojione[title=\":back:\"],.emojione[title=\":ant:\"],.emojione[title=\":8ball:\"]{filter:drop-shadow(1px 1px 0 #ffffff) drop-shadow(-1px 1px 0 #ffffff) drop-shadow(1px -1px 0 #ffffff) drop-shadow(-1px -1px 0 #ffffff);transform:scale(0.71)}","/* http://meyerweb.com/eric/tools/css/reset/\n v2.0 | 20110126\n License: none (public domain)\n*/\n\nhtml, body, div, span, applet, object, iframe,\nh1, h2, h3, h4, h5, h6, p, blockquote, pre,\na, abbr, acronym, address, big, cite, code,\ndel, dfn, em, img, ins, kbd, q, s, samp,\nsmall, strike, strong, sub, sup, tt, var,\nb, u, i, center,\ndl, dt, dd, ol, ul, li,\nfieldset, form, label, legend,\ntable, caption, tbody, tfoot, thead, tr, th, td,\narticle, aside, canvas, details, embed,\nfigure, figcaption, footer, header, hgroup,\nmenu, nav, output, ruby, section, summary,\ntime, mark, audio, video {\n margin: 0;\n padding: 0;\n border: 0;\n font-size: 100%;\n font: inherit;\n vertical-align: baseline;\n}\n\n/* HTML5 display-role reset for older browsers */\narticle, aside, details, figcaption, figure,\nfooter, header, hgroup, menu, nav, section {\n display: block;\n}\n\nbody {\n line-height: 1;\n}\n\nol, ul {\n list-style: none;\n}\n\nblockquote, q {\n quotes: none;\n}\n\nblockquote:before, blockquote:after,\nq:before, q:after {\n content: '';\n content: none;\n}\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\nhtml {\n scrollbar-color: lighten($ui-base-color, 4%) rgba($base-overlay-background, 0.1);\n}\n\n::-webkit-scrollbar {\n width: 12px;\n height: 12px;\n}\n\n::-webkit-scrollbar-thumb {\n background: lighten($ui-base-color, 4%);\n border: 0px none $base-border-color;\n border-radius: 50px;\n}\n\n::-webkit-scrollbar-thumb:hover {\n background: lighten($ui-base-color, 6%);\n}\n\n::-webkit-scrollbar-thumb:active {\n background: lighten($ui-base-color, 4%);\n}\n\n::-webkit-scrollbar-track {\n border: 0px none $base-border-color;\n border-radius: 0;\n background: rgba($base-overlay-background, 0.1);\n}\n\n::-webkit-scrollbar-track:hover {\n background: $ui-base-color;\n}\n\n::-webkit-scrollbar-track:active {\n background: $ui-base-color;\n}\n\n::-webkit-scrollbar-corner {\n background: transparent;\n}\n","// Commonly used web colors\n$black: #000000; // Black\n$white: #ffffff; // White\n$success-green: #79bd9a !default; // Padua\n$error-red: #df405a !default; // Cerise\n$warning-red: #ff5050 !default; // Sunset Orange\n$gold-star: #ca8f04 !default; // Dark Goldenrod\n\n$red-bookmark: $warning-red;\n\n// Pleroma-Dark colors\n$pleroma-bg: #121a24;\n$pleroma-fg: #182230;\n$pleroma-text: #b9b9ba;\n$pleroma-links: #d8a070;\n\n// Values from the classic Mastodon UI\n$classic-base-color: $pleroma-bg;\n$classic-primary-color: #9baec8;\n$classic-secondary-color: #d9e1e8;\n$classic-highlight-color: #d8a070;\n\n// Variables for defaults in UI\n$base-shadow-color: $black !default;\n$base-overlay-background: $black !default;\n$base-border-color: $white !default;\n$simple-background-color: $white !default;\n$valid-value-color: $success-green !default;\n$error-value-color: $error-red !default;\n\n// Tell UI to use selected colors\n$ui-base-color: $classic-base-color !default; // Darkest\n$ui-base-lighter-color: lighten($ui-base-color, 26%) !default; // Lighter darkest\n$ui-primary-color: $classic-primary-color !default; // Lighter\n$ui-secondary-color: $classic-secondary-color !default; // Lightest\n$ui-highlight-color: $classic-highlight-color !default;\n\n// Variables for texts\n$primary-text-color: $white !default;\n$darker-text-color: $ui-primary-color !default;\n$dark-text-color: $ui-base-lighter-color !default;\n$secondary-text-color: $ui-secondary-color !default;\n$highlight-text-color: $ui-highlight-color !default;\n$action-button-color: $ui-base-lighter-color !default;\n// For texts on inverted backgrounds\n$inverted-text-color: $ui-base-color !default;\n$lighter-text-color: $ui-base-lighter-color !default;\n$light-text-color: $ui-primary-color !default;\n\n// Language codes that uses CJK fonts\n$cjk-langs: ja, ko, zh-CN, zh-HK, zh-TW;\n\n// Variables for components\n$media-modal-media-max-width: 100%;\n// put margins on top and bottom of image to avoid the screen covered by image.\n$media-modal-media-max-height: 80%;\n\n$no-gap-breakpoint: 415px;\n\n$font-sans-serif: 'mastodon-font-sans-serif' !default;\n$font-display: 'mastodon-font-display' !default;\n$font-monospace: 'mastodon-font-monospace' !default;\n","@function hex-color($color) {\n @if type-of($color) == 'color' {\n $color: str-slice(ie-hex-str($color), 4);\n }\n\n @return '%23' + unquote($color);\n}\n\nbody {\n font-family: $font-sans-serif, sans-serif;\n background: darken($ui-base-color, 7%);\n font-size: 13px;\n line-height: 18px;\n font-weight: 400;\n color: $primary-text-color;\n text-rendering: optimizelegibility;\n font-feature-settings: \"kern\";\n text-size-adjust: none;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n -webkit-tap-highlight-color: transparent;\n\n &.system-font {\n // system-ui => standard property (Chrome/Android WebView 56+, Opera 43+, Safari 11+)\n // -apple-system => Safari <11 specific\n // BlinkMacSystemFont => Chrome <56 on macOS specific\n // Segoe UI => Windows 7/8/10\n // Oxygen => KDE\n // Ubuntu => Unity/Ubuntu\n // Cantarell => GNOME\n // Fira Sans => Firefox OS\n // Droid Sans => Older Androids (<4.0)\n // Helvetica Neue => Older macOS <10.11\n // $font-sans-serif => web-font (Roboto) fallback and newer Androids (>=4.0)\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Oxygen\", \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", $font-sans-serif, sans-serif;\n }\n\n &.app-body {\n padding: 0;\n\n &.layout-single-column {\n height: auto;\n min-height: 100vh;\n overflow-y: scroll;\n }\n\n &.layout-multiple-columns {\n position: absolute;\n width: 100%;\n height: 100%;\n }\n\n &.with-modals--active {\n overflow-y: hidden;\n }\n }\n\n &.lighter {\n background: $ui-base-color;\n }\n\n &.with-modals {\n overflow-x: hidden;\n overflow-y: scroll;\n\n &--active {\n overflow-y: hidden;\n }\n }\n\n &.player {\n text-align: center;\n }\n\n &.embed {\n background: lighten($ui-base-color, 4%);\n margin: 0;\n padding-bottom: 0;\n\n .container {\n position: absolute;\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n }\n\n &.admin {\n background: darken($ui-base-color, 4%);\n padding: 0;\n }\n\n &.error {\n position: absolute;\n text-align: center;\n color: $darker-text-color;\n background: $ui-base-color;\n width: 100%;\n height: 100%;\n padding: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n\n .dialog {\n vertical-align: middle;\n margin: 20px;\n\n &__illustration {\n img {\n display: block;\n max-width: 470px;\n width: 100%;\n height: auto;\n margin-top: -120px;\n }\n }\n\n h1 {\n font-size: 20px;\n line-height: 28px;\n font-weight: 400;\n }\n }\n }\n}\n\nbutton {\n font-family: inherit;\n cursor: pointer;\n\n &:focus {\n outline: none;\n }\n}\n\n.app-holder {\n &,\n & > div,\n & > noscript {\n display: flex;\n width: 100%;\n align-items: center;\n justify-content: center;\n outline: 0 !important;\n }\n\n & > noscript {\n height: 100vh;\n }\n}\n\n.layout-single-column .app-holder {\n &,\n & > div {\n min-height: 100vh;\n }\n}\n\n.layout-multiple-columns .app-holder {\n &,\n & > div {\n height: 100%;\n }\n}\n\n.error-boundary,\n.app-holder noscript {\n flex-direction: column;\n font-size: 16px;\n font-weight: 400;\n line-height: 1.7;\n color: lighten($error-red, 4%);\n text-align: center;\n\n & > div {\n max-width: 500px;\n }\n\n p {\n margin-bottom: .85em;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: $highlight-text-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n &__footer {\n color: $dark-text-color;\n font-size: 13px;\n\n a {\n color: $dark-text-color;\n }\n }\n\n button {\n display: inline;\n border: 0;\n background: transparent;\n color: $dark-text-color;\n font: inherit;\n padding: 0;\n margin: 0;\n line-height: inherit;\n cursor: pointer;\n outline: 0;\n transition: color 300ms linear;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n\n &.copied {\n color: $valid-value-color;\n transition: none;\n }\n }\n}\n",".container-alt {\n width: 700px;\n margin: 0 auto;\n margin-top: 40px;\n\n @media screen and (max-width: 740px) {\n width: 100%;\n margin: 0;\n }\n}\n\n.logo-container {\n margin: 100px auto 50px;\n\n @media screen and (max-width: 500px) {\n margin: 40px auto 0;\n }\n\n h1 {\n display: flex;\n justify-content: center;\n align-items: center;\n\n svg {\n fill: $primary-text-color;\n height: 42px;\n margin-right: 10px;\n }\n\n a {\n display: flex;\n justify-content: center;\n align-items: center;\n color: $primary-text-color;\n text-decoration: none;\n outline: 0;\n padding: 12px 16px;\n line-height: 32px;\n font-family: $font-display, sans-serif;\n font-weight: 500;\n font-size: 14px;\n }\n }\n}\n\n.compose-standalone {\n .compose-form {\n width: 400px;\n margin: 0 auto;\n padding: 20px 0;\n margin-top: 40px;\n box-sizing: border-box;\n\n @media screen and (max-width: 400px) {\n width: 100%;\n margin-top: 0;\n padding: 20px;\n }\n }\n}\n\n.account-header {\n width: 400px;\n margin: 0 auto;\n display: flex;\n font-size: 13px;\n line-height: 18px;\n box-sizing: border-box;\n padding: 20px 0;\n padding-bottom: 0;\n margin-bottom: -30px;\n margin-top: 40px;\n\n @media screen and (max-width: 440px) {\n width: 100%;\n margin: 0;\n margin-bottom: 10px;\n padding: 20px;\n padding-bottom: 0;\n }\n\n .avatar {\n width: 40px;\n height: 40px;\n margin-right: 8px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n }\n }\n\n .name {\n flex: 1 1 auto;\n color: $secondary-text-color;\n width: calc(100% - 88px);\n\n .username {\n display: block;\n font-weight: 500;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n }\n\n .logout-link {\n display: block;\n font-size: 32px;\n line-height: 40px;\n margin-left: 8px;\n }\n}\n\n.grid-3 {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: 3fr 1fr;\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-column: 1 / 3;\n grid-row: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 2;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1 / 3;\n grid-row: 3;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n grid-template-columns: minmax(0, 100%);\n\n .column-0 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .column-2 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1;\n grid-row: 4;\n }\n }\n}\n\n.grid-4 {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: repeat(4, minmax(0, 1fr));\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-column: 1 / 5;\n grid-row: 1;\n }\n\n .column-1 {\n grid-column: 1 / 4;\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 4;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 2 / 5;\n grid-row: 3;\n }\n\n .column-4 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .landing-page__call-to-action {\n min-height: 100%;\n }\n\n .flash-message {\n margin-bottom: 10px;\n }\n\n @media screen and (max-width: 738px) {\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n .landing-page__call-to-action {\n padding: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .row__information-board {\n width: 100%;\n justify-content: center;\n align-items: center;\n }\n\n .row__mascot {\n display: none;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n grid-template-columns: minmax(0, 100%);\n\n .column-0 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .column-2 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1;\n grid-row: 5;\n }\n\n .column-4 {\n grid-column: 1;\n grid-row: 4;\n }\n }\n}\n\n.public-layout {\n @media screen and (max-width: $no-gap-breakpoint) {\n padding-top: 48px;\n }\n\n .container {\n max-width: 960px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding: 0;\n }\n }\n\n .header {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n height: 48px;\n margin: 10px 0;\n display: flex;\n align-items: stretch;\n justify-content: center;\n flex-wrap: nowrap;\n overflow: hidden;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n position: fixed;\n width: 100%;\n top: 0;\n left: 0;\n margin: 0;\n border-radius: 0;\n box-shadow: none;\n z-index: 110;\n }\n\n & > div {\n flex: 1 1 33.3%;\n min-height: 1px;\n }\n\n .nav-left {\n display: flex;\n align-items: stretch;\n justify-content: flex-start;\n flex-wrap: nowrap;\n }\n\n .nav-center {\n display: flex;\n align-items: stretch;\n justify-content: center;\n flex-wrap: nowrap;\n }\n\n .nav-right {\n display: flex;\n align-items: stretch;\n justify-content: flex-end;\n flex-wrap: nowrap;\n }\n\n .brand {\n display: block;\n padding: 15px;\n\n svg {\n display: block;\n height: 18px;\n width: auto;\n position: relative;\n bottom: -2px;\n fill: $primary-text-color;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n height: 20px;\n }\n }\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 12%);\n }\n }\n\n .nav-link {\n display: flex;\n align-items: center;\n padding: 0 1rem;\n font-size: 12px;\n font-weight: 500;\n text-decoration: none;\n color: $darker-text-color;\n white-space: nowrap;\n text-align: center;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n color: $primary-text-color;\n }\n\n @media screen and (max-width: 550px) {\n &.optional {\n display: none;\n }\n }\n }\n\n .nav-button {\n background: lighten($ui-base-color, 16%);\n margin: 8px;\n margin-left: 0;\n border-radius: 4px;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n background: lighten($ui-base-color, 20%);\n }\n }\n }\n\n $no-columns-breakpoint: 600px;\n\n .grid {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(300px, 3fr) minmax(298px, 1fr);\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-row: 1;\n grid-column: 1;\n }\n\n .column-1 {\n grid-row: 1;\n grid-column: 2;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n grid-template-columns: 100%;\n grid-gap: 0;\n\n .column-1 {\n display: none;\n }\n }\n }\n\n .directory__card {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n\n .page-header {\n @media screen and (max-width: $no-gap-breakpoint) {\n border-bottom: 0;\n }\n }\n\n .public-account-header {\n overflow: hidden;\n margin-bottom: 10px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &.inactive {\n opacity: 0.5;\n\n .public-account-header__image,\n .avatar {\n filter: grayscale(100%);\n }\n\n .logo-button {\n background-color: $secondary-text-color;\n }\n }\n\n &__image {\n border-radius: 4px 4px 0 0;\n overflow: hidden;\n height: 300px;\n position: relative;\n background: darken($ui-base-color, 12%);\n\n &::after {\n content: \"\";\n display: block;\n position: absolute;\n width: 100%;\n height: 100%;\n box-shadow: inset 0 -1px 1px 1px rgba($base-shadow-color, 0.15);\n top: 0;\n left: 0;\n }\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 4px 4px 0 0;\n }\n\n @media screen and (max-width: 600px) {\n height: 200px;\n }\n }\n\n &--no-bar {\n margin-bottom: 0;\n\n .public-account-header__image,\n .public-account-header__image img {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n box-shadow: none;\n\n &__image::after {\n display: none;\n }\n\n &__image,\n &__image img {\n border-radius: 0;\n }\n }\n\n &__bar {\n position: relative;\n margin-top: -80px;\n display: flex;\n justify-content: flex-start;\n\n &::before {\n content: \"\";\n display: block;\n background: lighten($ui-base-color, 4%);\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: 60px;\n border-radius: 0 0 4px 4px;\n z-index: -1;\n }\n\n .avatar {\n display: block;\n width: 120px;\n height: 120px;\n padding-left: 20px - 4px;\n flex: 0 0 auto;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 50%;\n border: 4px solid lighten($ui-base-color, 4%);\n background: darken($ui-base-color, 8%);\n }\n }\n\n @media screen and (max-width: 600px) {\n margin-top: 0;\n background: lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n padding: 5px;\n\n &::before {\n display: none;\n }\n\n .avatar {\n width: 48px;\n height: 48px;\n padding: 7px 0;\n padding-left: 10px;\n\n img {\n border: 0;\n border-radius: 4px;\n }\n\n @media screen and (max-width: 360px) {\n display: none;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n flex-wrap: wrap;\n }\n }\n\n &__tabs {\n flex: 1 1 auto;\n margin-left: 20px;\n\n &__name {\n padding-top: 20px;\n padding-bottom: 8px;\n\n h1 {\n font-size: 20px;\n line-height: 18px * 1.5;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n text-shadow: 1px 1px 1px $base-shadow-color;\n\n small {\n display: block;\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n @media screen and (max-width: 600px) {\n margin-left: 15px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n &__name {\n padding-top: 0;\n padding-bottom: 0;\n\n h1 {\n font-size: 16px;\n line-height: 24px;\n text-shadow: none;\n\n small {\n color: $darker-text-color;\n }\n }\n }\n }\n\n &__tabs {\n display: flex;\n justify-content: flex-start;\n align-items: stretch;\n height: 58px;\n\n .details-counters {\n display: flex;\n flex-direction: row;\n min-width: 300px;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n .details-counters {\n display: none;\n }\n }\n\n .counter {\n min-width: 33.3%;\n box-sizing: border-box;\n flex: 0 0 auto;\n color: $darker-text-color;\n padding: 10px;\n border-right: 1px solid lighten($ui-base-color, 4%);\n cursor: default;\n text-align: center;\n position: relative;\n\n a {\n display: block;\n }\n\n &:last-child {\n border-right: 0;\n }\n\n &::after {\n display: block;\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n border-bottom: 4px solid $ui-primary-color;\n opacity: 0.5;\n transition: all 400ms ease;\n }\n\n &.active {\n &::after {\n border-bottom: 4px solid $highlight-text-color;\n opacity: 1;\n }\n\n &.inactive::after {\n border-bottom-color: $secondary-text-color;\n }\n }\n\n &:hover {\n &::after {\n opacity: 1;\n transition-duration: 100ms;\n }\n }\n\n a {\n text-decoration: none;\n color: inherit;\n }\n\n .counter-label {\n font-size: 12px;\n display: block;\n }\n\n .counter-number {\n font-weight: 500;\n font-size: 18px;\n margin-bottom: 5px;\n color: $primary-text-color;\n font-family: $font-display, sans-serif;\n }\n }\n\n .spacer {\n flex: 1 1 auto;\n height: 1px;\n }\n\n &__buttons {\n padding: 7px 8px;\n }\n }\n }\n\n &__extra {\n display: none;\n margin-top: 4px;\n\n .public-account-bio {\n border-radius: 0;\n box-shadow: none;\n background: transparent;\n margin: 0 -5px;\n\n .account__header__fields {\n border-top: 1px solid lighten($ui-base-color, 12%);\n }\n\n .roles {\n display: none;\n }\n }\n\n &__links {\n margin-top: -15px;\n font-size: 14px;\n color: $darker-text-color;\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n padding: 15px;\n font-weight: 500;\n\n strong {\n font-weight: 700;\n color: $primary-text-color;\n }\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n flex: 100%;\n }\n }\n }\n\n .account__section-headline {\n border-radius: 4px 4px 0 0;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n\n .detailed-status__meta {\n margin-top: 25px;\n }\n\n .public-account-bio {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n overflow: hidden;\n margin-bottom: 10px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n box-shadow: none;\n margin-bottom: 0;\n border-radius: 0;\n }\n\n .account__header__fields {\n margin: 0;\n border-top: 0;\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n\n .account__header__content {\n padding: 20px;\n padding-bottom: 0;\n color: $primary-text-color;\n }\n\n &__extra,\n .roles {\n padding: 20px;\n font-size: 14px;\n color: $darker-text-color;\n }\n\n .roles {\n padding-bottom: 0;\n }\n }\n\n .directory__list {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: block;\n }\n\n .icon-button {\n font-size: 18px;\n }\n }\n\n .directory__card {\n margin-bottom: 0;\n }\n\n .card-grid {\n display: flex;\n flex-wrap: wrap;\n min-width: 100%;\n margin: 0 -5px;\n\n & > div {\n box-sizing: border-box;\n flex: 1 0 auto;\n width: 300px;\n padding: 0 5px;\n margin-bottom: 10px;\n max-width: 33.333%;\n\n @media screen and (max-width: 900px) {\n max-width: 50%;\n }\n\n @media screen and (max-width: 600px) {\n max-width: 100%;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin: 0;\n border-top: 1px solid lighten($ui-base-color, 8%);\n\n & > div {\n width: 100%;\n padding: 0;\n margin-bottom: 0;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &:last-child {\n border-bottom: 0;\n }\n\n .card__bar {\n background: $ui-base-color;\n\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n }\n }\n }\n }\n}\n",".no-list {\n list-style: none;\n\n li {\n display: inline-block;\n margin: 0 5px;\n }\n}\n\n.recovery-codes {\n list-style: none;\n margin: 0 auto;\n\n li {\n font-size: 125%;\n line-height: 1.5;\n letter-spacing: 1px;\n }\n}\n",".public-layout {\n .footer {\n text-align: left;\n padding-top: 20px;\n padding-bottom: 60px;\n font-size: 12px;\n color: lighten($ui-base-color, 34%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding-left: 20px;\n padding-right: 20px;\n }\n\n .grid {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: 1fr 1fr 2fr 1fr 1fr;\n\n .column-0 {\n grid-column: 1;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-1 {\n grid-column: 2;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-2 {\n grid-column: 3;\n grid-row: 1;\n min-width: 0;\n text-align: center;\n\n h4 a {\n color: lighten($ui-base-color, 34%);\n }\n }\n\n .column-3 {\n grid-column: 4;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-4 {\n grid-column: 5;\n grid-row: 1;\n min-width: 0;\n }\n\n @media screen and (max-width: 690px) {\n grid-template-columns: 1fr 2fr 1fr;\n\n .column-0,\n .column-1 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 2;\n }\n\n .column-3,\n .column-4 {\n grid-column: 3;\n }\n\n .column-4 {\n grid-row: 2;\n }\n }\n\n @media screen and (max-width: 600px) {\n .column-1 {\n display: block;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n .column-0,\n .column-1,\n .column-3,\n .column-4 {\n display: none;\n }\n }\n }\n\n h4 {\n text-transform: uppercase;\n font-weight: 700;\n margin-bottom: 8px;\n color: $darker-text-color;\n\n a {\n color: inherit;\n text-decoration: none;\n }\n }\n\n ul a {\n text-decoration: none;\n color: lighten($ui-base-color, 34%);\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n\n .brand {\n svg {\n display: block;\n height: 36px;\n width: auto;\n margin: 0 auto;\n fill: lighten($ui-base-color, 34%);\n }\n\n &:hover,\n &:focus,\n &:active {\n svg {\n fill: lighten($ui-base-color, 38%);\n }\n }\n }\n }\n}\n",".compact-header {\n h1 {\n font-size: 24px;\n line-height: 28px;\n color: $darker-text-color;\n font-weight: 500;\n margin-bottom: 20px;\n padding: 0 10px;\n word-wrap: break-word;\n\n @media screen and (max-width: 740px) {\n text-align: center;\n padding: 20px 10px 0;\n }\n\n a {\n color: inherit;\n text-decoration: none;\n }\n\n small {\n font-weight: 400;\n color: $secondary-text-color;\n }\n\n img {\n display: inline-block;\n margin-bottom: -5px;\n margin-right: 15px;\n width: 36px;\n height: 36px;\n }\n }\n}\n",".hero-widget {\n margin-bottom: 10px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &__img {\n width: 100%;\n position: relative;\n overflow: hidden;\n border-radius: 4px 4px 0 0;\n background: $base-shadow-color;\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 4px 4px 0 0;\n }\n }\n\n &__text {\n background: $ui-base-color;\n padding: 20px;\n border-radius: 0 0 4px 4px;\n font-size: 15px;\n color: $darker-text-color;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n p {\n margin-bottom: 20px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n em {\n display: inline;\n margin: 0;\n padding: 0;\n font-weight: 700;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n color: lighten($darker-text-color, 10%);\n }\n\n a {\n color: $secondary-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n}\n\n.endorsements-widget {\n margin-bottom: 10px;\n padding-bottom: 10px;\n\n h4 {\n padding: 10px;\n text-transform: uppercase;\n font-weight: 700;\n font-size: 13px;\n color: $darker-text-color;\n }\n\n .account {\n padding: 10px 0;\n\n &:last-child {\n border-bottom: 0;\n }\n\n .account__display-name {\n display: flex;\n align-items: center;\n }\n\n .account__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n }\n\n .trends__item {\n padding: 10px;\n }\n}\n\n.trends-widget {\n h4 {\n color: $darker-text-color;\n }\n}\n\n.box-widget {\n padding: 20px;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n}\n\n.placeholder-widget {\n padding: 16px;\n border-radius: 4px;\n border: 2px dashed $dark-text-color;\n text-align: center;\n color: $darker-text-color;\n margin-bottom: 10px;\n}\n\n.contact-widget {\n min-height: 100%;\n font-size: 15px;\n color: $darker-text-color;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n padding: 0;\n\n h4 {\n padding: 10px;\n text-transform: uppercase;\n font-weight: 700;\n font-size: 13px;\n color: $darker-text-color;\n }\n\n .account {\n border-bottom: 0;\n padding: 10px 0;\n padding-top: 5px;\n }\n\n & > a {\n display: inline-block;\n padding: 10px;\n padding-top: 0;\n color: $darker-text-color;\n text-decoration: none;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.moved-account-widget {\n padding: 15px;\n padding-bottom: 20px;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n color: $secondary-text-color;\n font-weight: 400;\n margin-bottom: 10px;\n\n strong,\n a {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n color: inherit;\n text-decoration: underline;\n\n &.mention {\n text-decoration: none;\n\n span {\n text-decoration: none;\n }\n\n &:focus,\n &:hover,\n &:active {\n text-decoration: none;\n\n span {\n text-decoration: underline;\n }\n }\n }\n }\n\n &__message {\n margin-bottom: 15px;\n\n .fa {\n margin-right: 5px;\n color: $darker-text-color;\n }\n }\n\n &__card {\n .detailed-status__display-avatar {\n position: relative;\n cursor: pointer;\n }\n\n .detailed-status__display-name {\n margin-bottom: 0;\n text-decoration: none;\n\n span {\n font-weight: 400;\n }\n }\n }\n}\n\n.memoriam-widget {\n padding: 20px;\n border-radius: 4px;\n background: $base-shadow-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n font-size: 14px;\n color: $darker-text-color;\n margin-bottom: 10px;\n}\n\n.page-header {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n padding: 60px 15px;\n text-align: center;\n margin: 10px 0;\n\n h1 {\n color: $primary-text-color;\n font-size: 36px;\n line-height: 1.1;\n font-weight: 700;\n margin-bottom: 10px;\n }\n\n p {\n font-size: 15px;\n color: $darker-text-color;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-top: 0;\n background: lighten($ui-base-color, 4%);\n\n h1 {\n font-size: 24px;\n }\n }\n}\n\n.directory {\n background: $ui-base-color;\n border-radius: 4px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &__tag {\n box-sizing: border-box;\n margin-bottom: 10px;\n\n & > a,\n & > div {\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: $ui-base-color;\n border-radius: 4px;\n padding: 15px;\n text-decoration: none;\n color: inherit;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n }\n\n & > a {\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 8%);\n }\n }\n\n &.active > a {\n background: $ui-highlight-color;\n cursor: default;\n }\n\n &.disabled > div {\n opacity: 0.5;\n cursor: default;\n }\n\n h4 {\n flex: 1 1 auto;\n font-size: 18px;\n font-weight: 700;\n color: $primary-text-color;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n .fa {\n color: $darker-text-color;\n }\n\n small {\n display: block;\n font-weight: 400;\n font-size: 15px;\n margin-top: 8px;\n color: $darker-text-color;\n }\n }\n\n &.active h4 {\n &,\n .fa,\n small,\n .trends__item__current {\n color: $primary-text-color;\n }\n }\n\n .avatar-stack {\n flex: 0 0 auto;\n width: (36px + 4px) * 3;\n }\n\n &.active .avatar-stack .account__avatar {\n border-color: $ui-highlight-color;\n }\n\n .trends__item__current {\n padding-right: 0;\n }\n }\n}\n\n.avatar-stack {\n display: flex;\n justify-content: flex-end;\n\n .account__avatar {\n flex: 0 0 auto;\n width: 36px;\n height: 36px;\n border-radius: 50%;\n position: relative;\n margin-left: -10px;\n background: darken($ui-base-color, 8%);\n border: 2px solid $ui-base-color;\n\n &:nth-child(1) {\n z-index: 1;\n }\n\n &:nth-child(2) {\n z-index: 2;\n }\n\n &:nth-child(3) {\n z-index: 3;\n }\n }\n}\n\n.accounts-table {\n width: 100%;\n\n .account {\n padding: 0;\n border: 0;\n }\n\n strong {\n font-weight: 700;\n }\n\n thead th {\n text-align: center;\n text-transform: uppercase;\n color: $darker-text-color;\n font-weight: 700;\n padding: 10px;\n\n &:first-child {\n text-align: left;\n }\n }\n\n tbody td {\n padding: 15px 0;\n vertical-align: middle;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n tbody tr:last-child td {\n border-bottom: 0;\n }\n\n &__count {\n width: 120px;\n text-align: center;\n font-size: 15px;\n font-weight: 500;\n color: $primary-text-color;\n\n small {\n display: block;\n color: $darker-text-color;\n font-weight: 400;\n font-size: 14px;\n }\n }\n\n &__comment {\n width: 50%;\n vertical-align: initial !important;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n tbody td.optional {\n display: none;\n }\n }\n}\n\n.moved-account-widget,\n.memoriam-widget,\n.box-widget,\n.contact-widget,\n.landing-page__information.contact-widget,\n.directory,\n.page-header {\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n box-shadow: none;\n border-radius: 0;\n }\n}\n\n$maximum-width: 1235px;\n$fluid-breakpoint: $maximum-width + 20px;\n\n.statuses-grid {\n min-height: 600px;\n\n @media screen and (max-width: 640px) {\n width: 100% !important; // Masonry layout is unnecessary at this width\n }\n\n &__item {\n width: (960px - 20px) / 3;\n\n @media screen and (max-width: $fluid-breakpoint) {\n width: (940px - 20px) / 3;\n }\n\n @media screen and (max-width: 640px) {\n width: 100%;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n width: 100vw;\n }\n }\n\n .detailed-status {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 1px solid lighten($ui-base-color, 16%);\n }\n\n &.compact {\n .detailed-status__meta {\n margin-top: 15px;\n }\n\n .status__content {\n font-size: 15px;\n line-height: 20px;\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n .status__content__spoiler-link {\n line-height: 20px;\n margin: 0;\n }\n }\n\n .media-gallery,\n .status-card,\n .video-player {\n margin-top: 15px;\n }\n }\n }\n}\n\n.notice-widget {\n margin-bottom: 10px;\n color: $darker-text-color;\n\n p {\n margin-bottom: 10px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n font-size: 14px;\n line-height: 20px;\n }\n}\n\n.notice-widget,\n.placeholder-widget {\n a {\n text-decoration: none;\n font-weight: 500;\n color: $ui-highlight-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.table-of-contents {\n background: darken($ui-base-color, 4%);\n min-height: 100%;\n font-size: 14px;\n border-radius: 4px;\n\n li a {\n display: block;\n font-weight: 500;\n padding: 15px;\n overflow: hidden;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n text-decoration: none;\n color: $primary-text-color;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n\n li:last-child a {\n border-bottom: 0;\n }\n\n li ul {\n padding-left: 20px;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n }\n}\n","$no-columns-breakpoint: 600px;\n\ncode {\n font-family: $font-monospace, monospace;\n font-weight: 400;\n}\n\n.form-container {\n max-width: 400px;\n padding: 20px;\n margin: 0 auto;\n}\n\n.simple_form {\n .input {\n margin-bottom: 15px;\n overflow: hidden;\n\n &.hidden {\n margin: 0;\n }\n\n &.radio_buttons {\n .radio {\n margin-bottom: 15px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .radio > label {\n position: relative;\n padding-left: 28px;\n\n input {\n position: absolute;\n top: -2px;\n left: 0;\n }\n }\n }\n\n &.boolean {\n position: relative;\n margin-bottom: 0;\n\n .label_input > label {\n font-family: inherit;\n font-size: 14px;\n padding-top: 5px;\n color: $primary-text-color;\n display: block;\n width: auto;\n }\n\n .label_input,\n .hint {\n padding-left: 28px;\n }\n\n .label_input__wrapper {\n position: static;\n }\n\n label.checkbox {\n position: absolute;\n top: 2px;\n left: 0;\n }\n\n label a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: none;\n }\n }\n\n .recommended {\n position: absolute;\n margin: 0 4px;\n margin-top: -2px;\n }\n }\n }\n\n .row {\n display: flex;\n margin: 0 -5px;\n\n .input {\n box-sizing: border-box;\n flex: 1 1 auto;\n width: 50%;\n padding: 0 5px;\n }\n }\n\n .hint {\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n }\n\n code {\n border-radius: 3px;\n padding: 0.2em 0.4em;\n background: darken($ui-base-color, 12%);\n }\n\n li {\n list-style: disc;\n margin-left: 18px;\n }\n }\n\n ul.hint {\n margin-bottom: 15px;\n }\n\n span.hint {\n display: block;\n font-size: 12px;\n margin-top: 4px;\n }\n\n p.hint {\n margin-bottom: 15px;\n color: $darker-text-color;\n\n &.subtle-hint {\n text-align: center;\n font-size: 12px;\n line-height: 18px;\n margin-top: 15px;\n margin-bottom: 0;\n }\n }\n\n .card {\n margin-bottom: 15px;\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n .input.with_floating_label {\n .label_input {\n display: flex;\n\n & > label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 500;\n min-width: 150px;\n flex: 0 0 auto;\n }\n\n input,\n select {\n flex: 1 1 auto;\n }\n }\n\n &.select .hint {\n margin-top: 6px;\n margin-left: 150px;\n }\n }\n\n .input.with_label {\n .label_input > label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: block;\n margin-bottom: 8px;\n word-wrap: break-word;\n font-weight: 500;\n }\n\n .hint {\n margin-top: 6px;\n }\n\n ul {\n flex: 390px;\n }\n }\n\n .input.with_block_label {\n max-width: none;\n\n & > label {\n font-family: inherit;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n font-weight: 500;\n padding-top: 5px;\n }\n\n .hint {\n margin-bottom: 15px;\n }\n\n ul {\n columns: 2;\n }\n }\n\n .input.datetime .label_input select {\n display: inline-block;\n width: auto;\n flex: 0;\n }\n\n .required abbr {\n text-decoration: none;\n color: lighten($error-value-color, 12%);\n }\n\n .fields-group {\n margin-bottom: 25px;\n\n .input:last-child {\n margin-bottom: 0;\n }\n }\n\n .fields-row {\n display: flex;\n margin: 0 -10px;\n padding-top: 5px;\n margin-bottom: 25px;\n\n .input {\n max-width: none;\n }\n\n &__column {\n box-sizing: border-box;\n padding: 0 10px;\n flex: 1 1 auto;\n min-height: 1px;\n\n &-6 {\n max-width: 50%;\n }\n\n .actions {\n margin-top: 27px;\n }\n }\n\n .fields-group:last-child,\n .fields-row__column.fields-group {\n margin-bottom: 0;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n margin-bottom: 0;\n\n &__column {\n max-width: none;\n }\n\n .fields-group:last-child,\n .fields-row__column.fields-group,\n .fields-row__column {\n margin-bottom: 25px;\n }\n }\n }\n\n .input.radio_buttons .radio label {\n margin-bottom: 5px;\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: block;\n width: auto;\n }\n\n .check_boxes {\n .checkbox {\n label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: inline-block;\n width: auto;\n position: relative;\n padding-top: 5px;\n padding-left: 25px;\n flex: 1 1 auto;\n }\n\n input[type=checkbox] {\n position: absolute;\n left: 0;\n top: 5px;\n margin: 0;\n }\n }\n }\n\n .input.static .label_input__wrapper {\n font-size: 16px;\n padding: 10px;\n border: 1px solid $dark-text-color;\n border-radius: 4px;\n }\n\n input[type=text],\n input[type=number],\n input[type=email],\n input[type=password],\n textarea {\n box-sizing: border-box;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n width: 100%;\n outline: 0;\n font-family: inherit;\n resize: vertical;\n background: darken($ui-base-color, 10%);\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n padding: 10px;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &:invalid {\n box-shadow: none;\n }\n\n &:focus:invalid:not(:placeholder-shown) {\n border-color: lighten($error-red, 12%);\n }\n\n &:required:valid {\n border-color: $valid-value-color;\n }\n\n &:hover {\n border-color: darken($ui-base-color, 20%);\n }\n\n &:active,\n &:focus {\n border-color: $highlight-text-color;\n background: darken($ui-base-color, 8%);\n }\n }\n\n .input.field_with_errors {\n label {\n color: lighten($error-red, 12%);\n }\n\n input[type=text],\n input[type=number],\n input[type=email],\n input[type=password],\n textarea,\n select {\n border-color: lighten($error-red, 12%);\n }\n\n .error {\n display: block;\n font-weight: 500;\n color: lighten($error-red, 12%);\n margin-top: 4px;\n }\n }\n\n .input.disabled {\n opacity: 0.5;\n }\n\n .actions {\n margin-top: 30px;\n display: flex;\n\n &.actions--top {\n margin-top: 0;\n margin-bottom: 30px;\n }\n }\n\n button,\n .button,\n .block-button {\n display: block;\n width: 100%;\n border: 0;\n border-radius: 4px;\n background: $ui-highlight-color;\n color: $primary-text-color;\n font-size: 18px;\n line-height: inherit;\n height: auto;\n padding: 10px;\n text-transform: uppercase;\n text-decoration: none;\n text-align: center;\n box-sizing: border-box;\n cursor: pointer;\n font-weight: 500;\n outline: 0;\n margin-bottom: 10px;\n margin-right: 10px;\n\n &:last-child {\n margin-right: 0;\n }\n\n &:hover {\n background-color: lighten($ui-highlight-color, 5%);\n }\n\n &:active,\n &:focus {\n background-color: darken($ui-highlight-color, 5%);\n }\n\n &:disabled:hover {\n background-color: $ui-primary-color;\n }\n\n &.negative {\n background: $error-value-color;\n\n &:hover {\n background-color: lighten($error-value-color, 5%);\n }\n\n &:active,\n &:focus {\n background-color: darken($error-value-color, 5%);\n }\n }\n }\n\n select {\n appearance: none;\n box-sizing: border-box;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n width: 100%;\n outline: 0;\n font-family: inherit;\n resize: vertical;\n background: darken($ui-base-color, 10%) url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center / auto 16px;\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n padding-left: 10px;\n padding-right: 30px;\n height: 41px;\n }\n\n h4 {\n margin-bottom: 15px !important;\n }\n\n .label_input {\n &__wrapper {\n position: relative;\n }\n\n &__append {\n position: absolute;\n right: 3px;\n top: 1px;\n padding: 10px;\n padding-bottom: 9px;\n font-size: 16px;\n color: $dark-text-color;\n font-family: inherit;\n pointer-events: none;\n cursor: default;\n max-width: 140px;\n white-space: nowrap;\n overflow: hidden;\n\n &::after {\n content: '';\n display: block;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 1px;\n width: 5px;\n background-image: linear-gradient(to right, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));\n }\n }\n }\n\n &__overlay-area {\n position: relative;\n\n &__blurred form {\n filter: blur(2px);\n }\n\n &__overlay {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n background: rgba($ui-base-color, 0.65);\n border-radius: 4px;\n margin-left: -4px;\n margin-top: -4px;\n padding: 4px;\n\n &__content {\n text-align: center;\n\n &.rich-formatting {\n &,\n p {\n color: $primary-text-color;\n }\n }\n }\n }\n }\n}\n\n.block-icon {\n display: block;\n margin: 0 auto;\n margin-bottom: 10px;\n font-size: 24px;\n}\n\n.flash-message {\n background: lighten($ui-base-color, 8%);\n color: $darker-text-color;\n border-radius: 4px;\n padding: 15px 10px;\n margin-bottom: 30px;\n text-align: center;\n\n &.notice {\n border: 1px solid rgba($valid-value-color, 0.5);\n background: rgba($valid-value-color, 0.25);\n color: $valid-value-color;\n }\n\n &.alert {\n border: 1px solid rgba($error-value-color, 0.5);\n background: rgba($error-value-color, 0.25);\n color: $error-value-color;\n }\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n\n &:hover {\n color: $primary-text-color;\n text-decoration: underline;\n }\n }\n\n p {\n margin-bottom: 15px;\n }\n\n .oauth-code {\n outline: 0;\n box-sizing: border-box;\n display: block;\n width: 100%;\n border: 0;\n padding: 10px;\n font-family: $font-monospace, monospace;\n background: $ui-base-color;\n color: $primary-text-color;\n font-size: 14px;\n margin: 0;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n @media screen and (max-width: 740px) and (min-width: 441px) {\n margin-top: 40px;\n }\n}\n\n.form-footer {\n margin-top: 30px;\n text-align: center;\n\n a {\n color: $darker-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.quick-nav {\n list-style: none;\n margin-bottom: 25px;\n font-size: 14px;\n\n li {\n display: inline-block;\n margin-right: 10px;\n }\n\n a {\n color: $highlight-text-color;\n text-transform: uppercase;\n text-decoration: none;\n font-weight: 700;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($highlight-text-color, 8%);\n }\n }\n}\n\n.oauth-prompt,\n.follow-prompt {\n margin-bottom: 30px;\n color: $darker-text-color;\n\n h2 {\n font-size: 16px;\n margin-bottom: 30px;\n text-align: center;\n }\n\n strong {\n color: $secondary-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n @media screen and (max-width: 740px) and (min-width: 441px) {\n margin-top: 40px;\n }\n}\n\n.qr-wrapper {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n}\n\n.qr-code {\n flex: 0 0 auto;\n background: $simple-background-color;\n padding: 4px;\n margin: 0 10px 20px 0;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n display: inline-block;\n\n svg {\n display: block;\n margin: 0;\n }\n}\n\n.qr-alternative {\n margin-bottom: 20px;\n color: $secondary-text-color;\n flex: 150px;\n\n samp {\n display: block;\n font-size: 14px;\n }\n}\n\n.table-form {\n p {\n margin-bottom: 15px;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n }\n}\n\n.simple_form,\n.table-form {\n .warning {\n box-sizing: border-box;\n background: rgba($error-value-color, 0.5);\n color: $primary-text-color;\n text-shadow: 1px 1px 0 rgba($base-shadow-color, 0.3);\n box-shadow: 0 2px 6px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n padding: 10px;\n margin-bottom: 15px;\n\n a {\n color: $primary-text-color;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n strong {\n font-weight: 600;\n display: block;\n margin-bottom: 5px;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n\n .fa {\n font-weight: 400;\n }\n }\n }\n}\n\n.action-pagination {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n\n .actions,\n .pagination {\n flex: 1 1 auto;\n }\n\n .actions {\n padding: 30px 0;\n padding-right: 20px;\n flex: 0 0 auto;\n }\n}\n\n.post-follow-actions {\n text-align: center;\n color: $darker-text-color;\n\n div {\n margin-bottom: 4px;\n }\n}\n\n.alternative-login {\n margin-top: 20px;\n margin-bottom: 20px;\n\n h4 {\n font-size: 16px;\n color: $primary-text-color;\n text-align: center;\n margin-bottom: 20px;\n border: 0;\n padding: 0;\n }\n\n .button {\n display: block;\n }\n}\n\n.scope-danger {\n color: $warning-red;\n}\n\n.form_admin_settings_site_short_description,\n.form_admin_settings_site_description,\n.form_admin_settings_site_extended_description,\n.form_admin_settings_site_terms,\n.form_admin_settings_custom_css,\n.form_admin_settings_closed_registrations_message {\n textarea {\n font-family: $font-monospace, monospace;\n }\n}\n\n.input-copy {\n background: darken($ui-base-color, 10%);\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n display: flex;\n align-items: center;\n padding-right: 4px;\n position: relative;\n top: 1px;\n transition: border-color 300ms linear;\n\n &__wrapper {\n flex: 1 1 auto;\n }\n\n input[type=text] {\n background: transparent;\n border: 0;\n padding: 10px;\n font-size: 14px;\n font-family: $font-monospace, monospace;\n }\n\n button {\n flex: 0 0 auto;\n margin: 4px;\n text-transform: none;\n font-weight: 400;\n font-size: 14px;\n padding: 7px 18px;\n padding-bottom: 6px;\n width: auto;\n transition: background 300ms linear;\n }\n\n &.copied {\n border-color: $valid-value-color;\n transition: none;\n\n button {\n background: $valid-value-color;\n transition: none;\n }\n }\n}\n\n.connection-prompt {\n margin-bottom: 25px;\n\n .fa-link {\n background-color: darken($ui-base-color, 4%);\n border-radius: 100%;\n font-size: 24px;\n padding: 10px;\n }\n\n &__column {\n align-items: center;\n display: flex;\n flex: 1;\n flex-direction: column;\n flex-shrink: 1;\n max-width: 50%;\n\n &-sep {\n align-self: center;\n flex-grow: 0;\n overflow: visible;\n position: relative;\n z-index: 1;\n }\n\n p {\n word-break: break-word;\n }\n }\n\n .account__avatar {\n margin-bottom: 20px;\n }\n\n &__connection {\n background-color: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n padding: 25px 10px;\n position: relative;\n text-align: center;\n\n &::after {\n background-color: darken($ui-base-color, 4%);\n content: '';\n display: block;\n height: 100%;\n left: 50%;\n position: absolute;\n top: 0;\n width: 1px;\n }\n }\n\n &__row {\n align-items: flex-start;\n display: flex;\n flex-direction: row;\n }\n}\n",".card {\n & > a {\n display: block;\n text-decoration: none;\n color: inherit;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n box-shadow: none;\n }\n\n &:hover,\n &:active,\n &:focus {\n .card__bar {\n background: lighten($ui-base-color, 8%);\n }\n }\n }\n\n &__img {\n height: 130px;\n position: relative;\n background: darken($ui-base-color, 12%);\n border-radius: 4px 4px 0 0;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n object-fit: cover;\n border-radius: 4px 4px 0 0;\n }\n\n @media screen and (max-width: 600px) {\n height: 200px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n\n &__bar {\n position: relative;\n padding: 15px;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n\n .avatar {\n flex: 0 0 auto;\n width: 48px;\n height: 48px;\n padding-top: 2px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n background: darken($ui-base-color, 8%);\n object-fit: cover;\n }\n }\n\n .display-name {\n margin-left: 15px;\n text-align: left;\n\n strong {\n font-size: 15px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n span {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n}\n\n.pagination {\n padding: 30px 0;\n text-align: center;\n overflow: hidden;\n\n a,\n .current,\n .newer,\n .older,\n .page,\n .gap {\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 500;\n display: inline-block;\n padding: 6px 10px;\n text-decoration: none;\n }\n\n .current {\n background: $simple-background-color;\n border-radius: 100px;\n color: $inverted-text-color;\n cursor: default;\n margin: 0 10px;\n }\n\n .gap {\n cursor: default;\n }\n\n .older,\n .newer {\n text-transform: uppercase;\n color: $secondary-text-color;\n }\n\n .older {\n float: left;\n padding-left: 0;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n .newer {\n float: right;\n padding-right: 0;\n\n .fa {\n display: inline-block;\n margin-left: 5px;\n }\n }\n\n .disabled {\n cursor: default;\n color: lighten($inverted-text-color, 10%);\n }\n\n @media screen and (max-width: 700px) {\n padding: 30px 20px;\n\n .page {\n display: none;\n }\n\n .newer,\n .older {\n display: inline-block;\n }\n }\n}\n\n.nothing-here {\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n color: $light-text-color;\n font-size: 14px;\n font-weight: 500;\n text-align: center;\n display: flex;\n justify-content: center;\n align-items: center;\n cursor: default;\n border-radius: 4px;\n padding: 20px;\n min-height: 30vh;\n\n &--under-tabs {\n border-radius: 0 0 4px 4px;\n }\n\n &--flexible {\n box-sizing: border-box;\n min-height: 100%;\n }\n}\n\n.account-role,\n.simple_form .recommended {\n display: inline-block;\n padding: 4px 6px;\n cursor: default;\n border-radius: 3px;\n font-size: 12px;\n line-height: 12px;\n font-weight: 500;\n color: $ui-secondary-color;\n background-color: rgba($ui-secondary-color, 0.1);\n border: 1px solid rgba($ui-secondary-color, 0.5);\n\n &.moderator {\n color: $success-green;\n background-color: rgba($success-green, 0.1);\n border-color: rgba($success-green, 0.5);\n }\n\n &.admin {\n color: lighten($error-red, 12%);\n background-color: rgba(lighten($error-red, 12%), 0.1);\n border-color: rgba(lighten($error-red, 12%), 0.5);\n }\n}\n\n.account__header__fields {\n max-width: 100vw;\n padding: 0;\n margin: 15px -15px -15px;\n border: 0 none;\n border-top: 1px solid lighten($ui-base-color, 12%);\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n font-size: 14px;\n line-height: 20px;\n\n dl {\n display: flex;\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n }\n\n dt,\n dd {\n box-sizing: border-box;\n padding: 14px;\n text-align: center;\n max-height: 48px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n dt {\n font-weight: 500;\n width: 120px;\n flex: 0 0 auto;\n color: $secondary-text-color;\n background: rgba(darken($ui-base-color, 8%), 0.5);\n }\n\n dd {\n flex: 1 1 auto;\n color: $darker-text-color;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n\n .verified {\n border: 1px solid rgba($valid-value-color, 0.5);\n background: rgba($valid-value-color, 0.25);\n\n a {\n color: $valid-value-color;\n font-weight: 500;\n }\n\n &__mark {\n color: $valid-value-color;\n }\n }\n\n dl:last-child {\n border-bottom: 0;\n }\n}\n\n.directory__tag .trends__item__current {\n width: auto;\n}\n\n.pending-account {\n &__header {\n color: $darker-text-color;\n\n a {\n color: $ui-secondary-color;\n text-decoration: none;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n\n strong {\n color: $primary-text-color;\n font-weight: 700;\n }\n }\n\n &__body {\n margin-top: 10px;\n }\n}\n",".activity-stream {\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n overflow: hidden;\n margin-bottom: 10px;\n\n &--under-tabs {\n border-radius: 0 0 4px 4px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n border-radius: 0;\n box-shadow: none;\n }\n\n &--headless {\n border-radius: 0;\n margin: 0;\n box-shadow: none;\n\n .detailed-status,\n .status {\n border-radius: 0 !important;\n }\n }\n\n div[data-component] {\n width: 100%;\n }\n\n .entry {\n background: $ui-base-color;\n\n .detailed-status,\n .status,\n .load-more {\n animation: none;\n }\n\n &:last-child {\n .detailed-status,\n .status,\n .load-more {\n border-bottom: 0;\n border-radius: 0 0 4px 4px;\n }\n }\n\n &:first-child {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 4px 4px 0 0;\n }\n\n &:last-child {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 4px;\n }\n }\n }\n\n @media screen and (max-width: 740px) {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 0 !important;\n }\n }\n }\n\n &--highlighted .entry {\n background: lighten($ui-base-color, 8%);\n }\n}\n\n.button.logo-button {\n flex: 0 auto;\n font-size: 14px;\n background: $ui-highlight-color;\n color: $primary-text-color;\n text-transform: none;\n line-height: 36px;\n height: auto;\n padding: 3px 15px;\n border: 0;\n\n svg {\n width: 20px;\n height: auto;\n vertical-align: middle;\n margin-right: 5px;\n fill: $primary-text-color;\n }\n\n &:active,\n &:focus,\n &:hover {\n background: lighten($ui-highlight-color, 10%);\n }\n\n &:disabled,\n &.disabled {\n &:active,\n &:focus,\n &:hover {\n background: $ui-primary-color;\n }\n }\n\n &.button--destructive {\n &:active,\n &:focus,\n &:hover {\n background: $error-red;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n svg {\n display: none;\n }\n }\n}\n\n.embed,\n.public-layout {\n .detailed-status {\n padding: 15px;\n }\n\n .status {\n padding: 15px 15px 15px (48px + 15px * 2);\n min-height: 48px + 2px;\n\n &__avatar {\n left: 15px;\n top: 17px;\n }\n\n &__content {\n padding-top: 5px;\n }\n\n &__prepend {\n margin-left: 48px + 15px * 2;\n padding-top: 15px;\n }\n\n &__prepend-icon-wrapper {\n left: -32px;\n }\n\n .media-gallery,\n &__action-bar,\n .video-player {\n margin-top: 10px;\n }\n }\n}\n","button.icon-button i.fa-retweet {\n background-image: url(\"data:image/svg+xml;utf8,\");\n\n &:hover {\n background-image: url(\"data:image/svg+xml;utf8,\");\n }\n}\n\nbutton.icon-button.disabled i.fa-retweet {\n background-image: url(\"data:image/svg+xml;utf8,\");\n}\n",".app-body {\n -webkit-overflow-scrolling: touch;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n}\n\n.animated-number {\n display: inline-flex;\n flex-direction: column;\n align-items: stretch;\n overflow: hidden;\n position: relative;\n}\n\n.link-button {\n display: block;\n font-size: 15px;\n line-height: 20px;\n color: $ui-highlight-color;\n border: 0;\n background: transparent;\n padding: 0;\n cursor: pointer;\n\n &:hover,\n &:active {\n text-decoration: underline;\n }\n\n &:disabled {\n color: $ui-primary-color;\n cursor: default;\n }\n}\n\n.button {\n background-color: $ui-highlight-color;\n border: 10px none;\n border-radius: 4px;\n box-sizing: border-box;\n color: $primary-text-color;\n cursor: pointer;\n display: inline-block;\n font-family: inherit;\n font-size: 14px;\n font-weight: 500;\n height: 36px;\n letter-spacing: 0;\n line-height: 36px;\n overflow: hidden;\n padding: 0 16px;\n position: relative;\n text-align: center;\n text-transform: uppercase;\n text-decoration: none;\n text-overflow: ellipsis;\n transition: all 100ms ease-in;\n white-space: nowrap;\n width: auto;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-highlight-color, 10%);\n transition: all 200ms ease-out;\n }\n\n &--destructive {\n transition: none;\n\n &:active,\n &:focus,\n &:hover {\n background-color: $error-red;\n transition: none;\n }\n }\n\n &:disabled,\n &.disabled {\n background-color: $ui-primary-color;\n cursor: default;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &.button-primary,\n &.button-alternative,\n &.button-secondary,\n &.button-alternative-2 {\n font-size: 16px;\n line-height: 36px;\n height: auto;\n text-transform: none;\n padding: 4px 16px;\n }\n\n &.button-alternative {\n color: $inverted-text-color;\n background: $ui-primary-color;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-primary-color, 4%);\n }\n }\n\n &.button-alternative-2 {\n background: $ui-base-lighter-color;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-base-lighter-color, 4%);\n }\n }\n\n &.button-secondary {\n color: $darker-text-color;\n background: transparent;\n padding: 3px 15px;\n border: 1px solid $ui-primary-color;\n\n &:active,\n &:focus,\n &:hover {\n border-color: lighten($ui-primary-color, 4%);\n color: lighten($darker-text-color, 4%);\n }\n\n &:disabled {\n opacity: 0.5;\n }\n }\n\n &.button--block {\n display: block;\n width: 100%;\n }\n}\n\n.column__wrapper {\n display: flex;\n flex: 1 1 auto;\n position: relative;\n}\n\n.icon-button {\n display: inline-block;\n padding: 0;\n color: $action-button-color;\n border: 0;\n border-radius: 4px;\n background: transparent;\n cursor: pointer;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($action-button-color, 7%);\n background-color: rgba($action-button-color, 0.15);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n }\n\n &:focus {\n background-color: rgba($action-button-color, 0.3);\n }\n\n &.disabled {\n color: darken($action-button-color, 13%);\n background-color: transparent;\n cursor: default;\n }\n\n &.active {\n color: $highlight-text-color;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &.inverted {\n color: $lighter-text-color;\n\n &:hover,\n &:active,\n &:focus {\n color: darken($lighter-text-color, 7%);\n background-color: rgba($lighter-text-color, 0.15);\n }\n\n &:focus {\n background-color: rgba($lighter-text-color, 0.3);\n }\n\n &.disabled {\n color: lighten($lighter-text-color, 7%);\n background-color: transparent;\n }\n\n &.active {\n color: $highlight-text-color;\n\n &.disabled {\n color: lighten($highlight-text-color, 13%);\n }\n }\n }\n\n &.overlayed {\n box-sizing: content-box;\n background: rgba($base-overlay-background, 0.6);\n color: rgba($primary-text-color, 0.7);\n border-radius: 4px;\n padding: 2px;\n\n &:hover {\n background: rgba($base-overlay-background, 0.9);\n }\n }\n}\n\n.text-icon-button {\n color: $lighter-text-color;\n border: 0;\n border-radius: 4px;\n background: transparent;\n cursor: pointer;\n font-weight: 600;\n font-size: 11px;\n padding: 0 3px;\n line-height: 27px;\n outline: 0;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &:hover,\n &:active,\n &:focus {\n color: darken($lighter-text-color, 7%);\n background-color: rgba($lighter-text-color, 0.15);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n }\n\n &:focus {\n background-color: rgba($lighter-text-color, 0.3);\n }\n\n &.disabled {\n color: lighten($lighter-text-color, 20%);\n background-color: transparent;\n cursor: default;\n }\n\n &.active {\n color: $highlight-text-color;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n}\n\n.dropdown-menu {\n position: absolute;\n}\n\n.invisible {\n font-size: 0;\n line-height: 0;\n display: inline-block;\n width: 0;\n height: 0;\n position: absolute;\n\n img,\n svg {\n margin: 0 !important;\n border: 0 !important;\n padding: 0 !important;\n width: 0 !important;\n height: 0 !important;\n }\n}\n\n.ellipsis {\n &::after {\n content: \"…\";\n }\n}\n\n.compose-form {\n padding: 10px;\n\n &__sensitive-button {\n padding: 10px;\n padding-top: 0;\n\n font-size: 14px;\n font-weight: 500;\n\n &.active {\n color: $highlight-text-color;\n }\n\n input[type=checkbox] {\n display: none;\n }\n\n .checkbox {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 4px;\n vertical-align: middle;\n\n &.active {\n border-color: $highlight-text-color;\n background: $highlight-text-color;\n }\n }\n }\n\n .compose-form__warning {\n color: $inverted-text-color;\n margin-bottom: 10px;\n background: $ui-primary-color;\n box-shadow: 0 2px 6px rgba($base-shadow-color, 0.3);\n padding: 8px 10px;\n border-radius: 4px;\n font-size: 13px;\n font-weight: 400;\n\n strong {\n color: $inverted-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n color: $lighter-text-color;\n font-weight: 500;\n text-decoration: underline;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: none;\n }\n }\n }\n\n .emoji-picker-dropdown {\n position: absolute;\n top: 0;\n right: 0;\n }\n\n .compose-form__autosuggest-wrapper {\n position: relative;\n }\n\n .autosuggest-textarea,\n .autosuggest-input,\n .spoiler-input {\n position: relative;\n width: 100%;\n }\n\n .spoiler-input {\n height: 0;\n transform-origin: bottom;\n opacity: 0;\n\n &.spoiler-input--visible {\n height: 36px;\n margin-bottom: 11px;\n opacity: 1;\n }\n }\n\n .autosuggest-textarea__textarea,\n .spoiler-input__input {\n display: block;\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n color: $inverted-text-color;\n background: $simple-background-color;\n padding: 10px;\n font-family: inherit;\n font-size: 14px;\n resize: vertical;\n border: 0;\n outline: 0;\n\n &::placeholder {\n color: $dark-text-color;\n }\n\n &:focus {\n outline: 0;\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n .spoiler-input__input {\n border-radius: 4px;\n }\n\n .autosuggest-textarea__textarea {\n min-height: 100px;\n border-radius: 4px 4px 0 0;\n padding-bottom: 0;\n padding-right: 10px + 22px;\n resize: none;\n scrollbar-color: initial;\n\n &::-webkit-scrollbar {\n all: unset;\n }\n\n @media screen and (max-width: 600px) {\n height: 100px !important; // prevent auto-resize textarea\n resize: vertical;\n }\n }\n\n .autosuggest-textarea__suggestions-wrapper {\n position: relative;\n height: 0;\n }\n\n .autosuggest-textarea__suggestions {\n box-sizing: border-box;\n display: none;\n position: absolute;\n top: 100%;\n width: 100%;\n z-index: 99;\n box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4);\n background: $ui-secondary-color;\n border-radius: 0 0 4px 4px;\n color: $inverted-text-color;\n font-size: 14px;\n padding: 6px;\n\n &.autosuggest-textarea__suggestions--visible {\n display: block;\n }\n }\n\n .autosuggest-textarea__suggestions__item {\n padding: 10px;\n cursor: pointer;\n border-radius: 4px;\n\n &:hover,\n &:focus,\n &:active,\n &.selected {\n background: darken($ui-secondary-color, 10%);\n }\n }\n\n .autosuggest-account,\n .autosuggest-emoji,\n .autosuggest-hashtag {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: flex-start;\n line-height: 18px;\n font-size: 14px;\n }\n\n .autosuggest-hashtag {\n justify-content: space-between;\n\n &__name {\n flex: 1 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n strong {\n font-weight: 500;\n }\n\n &__uses {\n flex: 0 0 auto;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n }\n\n .autosuggest-account-icon,\n .autosuggest-emoji img {\n display: block;\n margin-right: 8px;\n width: 16px;\n height: 16px;\n }\n\n .autosuggest-account .display-name__account {\n color: $lighter-text-color;\n }\n\n .compose-form__modifiers {\n color: $inverted-text-color;\n font-family: inherit;\n font-size: 14px;\n background: $simple-background-color;\n\n .compose-form__upload-wrapper {\n overflow: hidden;\n }\n\n .compose-form__uploads-wrapper {\n display: flex;\n flex-direction: row;\n padding: 5px;\n flex-wrap: wrap;\n }\n\n .compose-form__upload {\n flex: 1 1 0;\n min-width: 40%;\n margin: 5px;\n\n &__actions {\n background: linear-gradient(180deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n opacity: 0;\n transition: opacity .1s ease;\n\n .icon-button {\n flex: 0 1 auto;\n color: $secondary-text-color;\n font-size: 14px;\n font-weight: 500;\n padding: 10px;\n font-family: inherit;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($secondary-text-color, 7%);\n }\n }\n\n &.active {\n opacity: 1;\n }\n }\n\n &-description {\n position: absolute;\n z-index: 2;\n bottom: 0;\n left: 0;\n right: 0;\n box-sizing: border-box;\n background: linear-gradient(0deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);\n padding: 10px;\n opacity: 0;\n transition: opacity .1s ease;\n\n textarea {\n background: transparent;\n color: $secondary-text-color;\n border: 0;\n padding: 0;\n margin: 0;\n width: 100%;\n font-family: inherit;\n font-size: 14px;\n font-weight: 500;\n\n &:focus {\n color: $white;\n }\n\n &::placeholder {\n opacity: 0.75;\n color: $secondary-text-color;\n }\n }\n\n &.active {\n opacity: 1;\n }\n }\n }\n\n .compose-form__upload-thumbnail {\n border-radius: 4px;\n background-color: $base-shadow-color;\n background-position: center;\n background-size: cover;\n background-repeat: no-repeat;\n height: 140px;\n width: 100%;\n overflow: hidden;\n }\n }\n\n .compose-form__buttons-wrapper {\n padding: 10px;\n background: darken($simple-background-color, 8%);\n border-radius: 0 0 4px 4px;\n display: flex;\n justify-content: space-between;\n flex: 0 0 auto;\n\n .compose-form__buttons {\n display: flex;\n\n .compose-form__upload-button-icon {\n line-height: 27px;\n }\n\n .compose-form__sensitive-button {\n display: none;\n\n &.compose-form__sensitive-button--visible {\n display: block;\n }\n\n .compose-form__sensitive-button__icon {\n line-height: 27px;\n }\n }\n }\n\n .icon-button,\n .text-icon-button {\n box-sizing: content-box;\n padding: 0 3px;\n }\n\n .character-counter__wrapper {\n align-self: center;\n margin-right: 4px;\n }\n }\n\n .compose-form__publish {\n display: flex;\n justify-content: flex-end;\n min-width: 0;\n flex: 0 0 auto;\n\n .compose-form__publish-button-wrapper {\n overflow: hidden;\n padding-top: 10px;\n }\n }\n}\n\n.character-counter {\n cursor: default;\n font-family: $font-sans-serif, sans-serif;\n font-size: 14px;\n font-weight: 600;\n color: $lighter-text-color;\n\n &.character-counter--over {\n color: $warning-red;\n }\n}\n\n.no-reduce-motion .spoiler-input {\n transition: height 0.4s ease, opacity 0.4s ease;\n}\n\n.emojione {\n font-size: inherit;\n vertical-align: middle;\n object-fit: contain;\n margin: -.2ex .15em .2ex;\n width: 16px;\n height: 16px;\n\n img {\n width: auto;\n }\n}\n\n.reply-indicator {\n border-radius: 4px;\n margin-bottom: 10px;\n background: $ui-primary-color;\n padding: 10px;\n min-height: 23px;\n overflow-y: auto;\n flex: 0 2 auto;\n}\n\n.reply-indicator__header {\n margin-bottom: 5px;\n overflow: hidden;\n}\n\n.reply-indicator__cancel {\n float: right;\n line-height: 24px;\n}\n\n.reply-indicator__display-name {\n color: $inverted-text-color;\n display: block;\n max-width: 100%;\n line-height: 24px;\n overflow: hidden;\n padding-right: 25px;\n text-decoration: none;\n}\n\n.reply-indicator__display-avatar {\n float: left;\n margin-right: 5px;\n}\n\n.status__content--with-action {\n cursor: pointer;\n}\n\n.status__content,\n.reply-indicator__content {\n position: relative;\n font-size: 15px;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n padding-top: 2px;\n color: $primary-text-color;\n\n &:focus {\n outline: 0;\n }\n\n &.status__content--with-spoiler {\n white-space: normal;\n\n .status__content__text {\n white-space: pre-wrap;\n }\n }\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n img {\n max-width: 100%;\n max-height: 400px;\n object-fit: contain;\n }\n\n p {\n margin-bottom: 20px;\n white-space: pre-wrap;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: $pleroma-links;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n\n .fa {\n color: lighten($dark-text-color, 7%);\n }\n }\n\n &.mention {\n &:hover {\n text-decoration: none;\n\n span {\n text-decoration: underline;\n }\n }\n }\n\n .fa {\n color: $dark-text-color;\n }\n }\n\n a.unhandled-link {\n color: lighten($ui-highlight-color, 8%);\n }\n\n .status__content__spoiler-link {\n background: $action-button-color;\n\n &:hover {\n background: lighten($action-button-color, 7%);\n text-decoration: none;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n\n .status__content__text {\n display: none;\n\n &.status__content__text--visible {\n display: block;\n }\n }\n}\n\n.announcements__item__content {\n word-wrap: break-word;\n overflow-y: auto;\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n p {\n margin-bottom: 10px;\n white-space: pre-wrap;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: $secondary-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n\n &.mention {\n &:hover {\n text-decoration: none;\n\n span {\n text-decoration: underline;\n }\n }\n }\n\n &.unhandled-link {\n color: lighten($ui-highlight-color, 8%);\n }\n }\n}\n\n.status__content.status__content--collapsed {\n max-height: 20px * 15; // 15 lines is roughly above 500 characters\n}\n\n.status__content__read-more-button {\n display: block;\n font-size: 15px;\n line-height: 20px;\n color: lighten($ui-highlight-color, 8%);\n border: 0;\n background: transparent;\n padding: 0;\n padding-top: 8px;\n text-decoration: none;\n\n &:hover,\n &:active {\n text-decoration: underline;\n }\n}\n\n.status__content__spoiler-link {\n display: inline-block;\n border-radius: 2px;\n background: transparent;\n border: 0;\n color: $inverted-text-color;\n font-weight: 700;\n font-size: 11px;\n padding: 0 6px;\n text-transform: uppercase;\n line-height: 20px;\n cursor: pointer;\n vertical-align: middle;\n}\n\n.status__wrapper--filtered {\n color: $dark-text-color;\n border: 0;\n font-size: inherit;\n text-align: center;\n line-height: inherit;\n margin: 0;\n padding: 15px;\n box-sizing: border-box;\n width: 100%;\n clear: both;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n}\n\n.status__prepend-icon-wrapper {\n left: -26px;\n position: absolute;\n}\n\n.focusable {\n &:focus {\n outline: 0;\n background: lighten($ui-base-color, 4%);\n\n .status.status-direct {\n background: lighten($ui-base-color, 12%);\n\n &.muted {\n background: transparent;\n }\n }\n\n .detailed-status,\n .detailed-status__action-bar {\n background: lighten($ui-base-color, 8%);\n }\n }\n}\n\n.status {\n padding: 8px 10px;\n padding-left: 68px;\n position: relative;\n min-height: 54px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n\n @supports (-ms-overflow-style: -ms-autohiding-scrollbar) {\n // Add margin to avoid Edge auto-hiding scrollbar appearing over content.\n // On Edge 16 this is 16px and Edge <=15 it's 12px, so aim for 16px.\n padding-right: 26px; // 10px + 16px\n }\n\n @keyframes fade {\n 0% { opacity: 0; }\n 100% { opacity: 1; }\n }\n\n opacity: 1;\n animation: fade 150ms linear;\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n }\n\n &.status-direct:not(.read) {\n background: lighten($ui-base-color, 8%);\n border-bottom-color: lighten($ui-base-color, 12%);\n }\n\n &.light {\n .status__relative-time {\n color: $light-text-color;\n }\n\n .status__display-name {\n color: $inverted-text-color;\n }\n\n .display-name {\n color: $light-text-color;\n\n strong {\n color: $inverted-text-color;\n }\n }\n\n .status__content {\n color: $inverted-text-color;\n\n a {\n color: $highlight-text-color;\n }\n\n a.status__content__spoiler-link {\n color: $primary-text-color;\n background: $ui-primary-color;\n\n &:hover {\n background: lighten($ui-primary-color, 8%);\n }\n }\n }\n }\n}\n\n.notification-favourite {\n .status.status-direct {\n background: transparent;\n\n .icon-button.disabled {\n color: lighten($action-button-color, 13%);\n }\n }\n}\n\n.status__relative-time,\n.notification__relative_time {\n color: $dark-text-color;\n float: right;\n font-size: 14px;\n}\n\n.status__display-name {\n color: $dark-text-color;\n}\n\n.status__info .status__display-name {\n display: block;\n max-width: 100%;\n padding-right: 25px;\n}\n\n.status__info {\n font-size: 15px;\n}\n\n.status-check-box {\n border-bottom: 1px solid $ui-secondary-color;\n display: flex;\n\n .status-check-box__status {\n margin: 10px 0 10px 10px;\n flex: 1;\n overflow: hidden;\n\n .media-gallery {\n max-width: 250px;\n }\n\n .status__content {\n padding: 0;\n white-space: normal;\n }\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n max-width: 250px;\n }\n\n .media-gallery__item-thumbnail {\n cursor: default;\n }\n }\n}\n\n.status-check-box-toggle {\n align-items: center;\n display: flex;\n flex: 0 0 auto;\n justify-content: center;\n padding: 10px;\n}\n\n.status__prepend {\n margin-left: 68px;\n color: $dark-text-color;\n padding: 8px 0;\n padding-bottom: 2px;\n font-size: 14px;\n position: relative;\n\n .status__display-name strong {\n color: $dark-text-color;\n }\n\n > span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.status__action-bar {\n align-items: center;\n display: flex;\n margin-top: 8px;\n\n &__counter {\n display: inline-flex;\n margin-right: 11px;\n align-items: center;\n\n .status__action-bar-button {\n margin-right: 4px;\n }\n\n &__label {\n display: inline-block;\n width: 14px;\n font-size: 12px;\n font-weight: 500;\n color: $action-button-color;\n }\n }\n}\n\n.status__action-bar-button {\n margin-right: 18px;\n}\n\n.status__action-bar-dropdown {\n height: 23.15px;\n width: 23.15px;\n}\n\n.detailed-status__action-bar-dropdown {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n}\n\n.detailed-status {\n background: lighten($ui-base-color, 4%);\n padding: 14px 10px;\n\n &--flex {\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n align-items: flex-start;\n\n .status__content,\n .detailed-status__meta {\n flex: 100%;\n }\n }\n\n .status__content {\n font-size: 19px;\n line-height: 24px;\n\n .emojione {\n width: 24px;\n height: 24px;\n margin: -1px 0 0;\n }\n\n .status__content__spoiler-link {\n line-height: 24px;\n margin: -1px 0 0;\n }\n }\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n }\n}\n\n.detailed-status__meta {\n margin-top: 15px;\n color: $dark-text-color;\n font-size: 14px;\n line-height: 18px;\n}\n\n.detailed-status__action-bar {\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: row;\n padding: 10px 0;\n}\n\n.detailed-status__link {\n color: inherit;\n text-decoration: none;\n}\n\n.detailed-status__favorites,\n.detailed-status__reblogs {\n display: inline-block;\n font-weight: 500;\n font-size: 12px;\n margin-left: 6px;\n}\n\n.reply-indicator__content {\n color: $inverted-text-color;\n font-size: 14px;\n\n a {\n color: $lighter-text-color;\n }\n}\n\n.domain {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n .domain__domain-name {\n flex: 1 1 auto;\n display: block;\n color: $primary-text-color;\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n }\n}\n\n.domain__wrapper {\n display: flex;\n}\n\n.domain_buttons {\n height: 18px;\n padding: 10px;\n white-space: nowrap;\n}\n\n.account {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &.compact {\n padding: 0;\n border-bottom: 0;\n\n .account__avatar-wrapper {\n margin-left: 0;\n }\n }\n\n .account__display-name {\n flex: 1 1 auto;\n display: block;\n color: $darker-text-color;\n overflow: hidden;\n text-decoration: none;\n font-size: 14px;\n }\n}\n\n.account__wrapper {\n display: flex;\n}\n\n.account__avatar-wrapper {\n float: left;\n margin-left: 12px;\n margin-right: 12px;\n}\n\n.account__avatar {\n @include avatar-radius;\n position: relative;\n\n &-inline {\n display: inline-block;\n vertical-align: middle;\n margin-right: 5px;\n }\n\n &-composite {\n @include avatar-radius;\n border-radius: 50%;\n overflow: hidden;\n position: relative;\n\n & > div {\n float: left;\n position: relative;\n box-sizing: border-box;\n }\n\n &__label {\n display: block;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n color: $primary-text-color;\n text-shadow: 1px 1px 2px $base-shadow-color;\n font-weight: 700;\n font-size: 15px;\n }\n }\n}\n\na .account__avatar {\n cursor: pointer;\n}\n\n.account__avatar-overlay {\n @include avatar-size(48px);\n\n &-base {\n @include avatar-radius;\n @include avatar-size(36px);\n }\n\n &-overlay {\n @include avatar-radius;\n @include avatar-size(24px);\n\n position: absolute;\n bottom: 0;\n right: 0;\n z-index: 1;\n }\n}\n\n.account__relationship {\n height: 18px;\n padding: 10px;\n white-space: nowrap;\n}\n\n.account__disclaimer {\n padding: 10px;\n border-top: 1px solid lighten($ui-base-color, 8%);\n color: $dark-text-color;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n font-weight: 500;\n color: inherit;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n}\n\n.account__action-bar {\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n line-height: 36px;\n overflow: hidden;\n flex: 0 0 auto;\n display: flex;\n}\n\n.account__action-bar-dropdown {\n padding: 10px;\n\n .icon-button {\n vertical-align: middle;\n }\n\n .dropdown--active {\n .dropdown__content.dropdown__right {\n left: 6px;\n right: initial;\n }\n\n &::after {\n bottom: initial;\n margin-left: 11px;\n margin-top: -7px;\n right: initial;\n }\n }\n}\n\n.account__action-bar-links {\n display: flex;\n flex: 1 1 auto;\n line-height: 18px;\n text-align: center;\n}\n\n.account__action-bar__tab {\n text-decoration: none;\n overflow: hidden;\n flex: 0 1 100%;\n border-right: 1px solid lighten($ui-base-color, 8%);\n padding: 10px 0;\n border-bottom: 4px solid transparent;\n\n &.active {\n border-bottom: 4px solid $ui-highlight-color;\n }\n\n & > span {\n display: block;\n text-transform: uppercase;\n font-size: 11px;\n color: $darker-text-color;\n }\n\n strong {\n display: block;\n font-size: 15px;\n font-weight: 500;\n color: $primary-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n}\n\n.account-authorize {\n padding: 14px 10px;\n\n .detailed-status__display-name {\n display: block;\n margin-bottom: 15px;\n overflow: hidden;\n }\n}\n\n.account-authorize__avatar {\n float: left;\n margin-right: 10px;\n}\n\n.status__display-name,\n.status__relative-time,\n.detailed-status__display-name,\n.detailed-status__datetime,\n.detailed-status__application,\n.account__display-name {\n text-decoration: none;\n}\n\n.status__display-name,\n.account__display-name {\n strong {\n color: $primary-text-color;\n }\n}\n\n.muted {\n .emojione {\n opacity: 0.5;\n }\n}\n\n.status__display-name,\n.reply-indicator__display-name,\n.detailed-status__display-name,\na.account__display-name {\n &:hover strong {\n text-decoration: underline;\n }\n}\n\n.account__display-name strong {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.detailed-status__application,\n.detailed-status__datetime {\n color: inherit;\n}\n\n.detailed-status .button.logo-button {\n margin-bottom: 15px;\n}\n\n.detailed-status__display-name {\n color: $secondary-text-color;\n display: block;\n line-height: 24px;\n margin-bottom: 15px;\n overflow: hidden;\n\n strong,\n span {\n display: block;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n strong {\n font-size: 16px;\n color: $primary-text-color;\n }\n}\n\n.detailed-status__display-avatar {\n float: left;\n margin-right: 10px;\n}\n\n.status__avatar {\n height: 48px;\n left: 10px;\n position: absolute;\n top: 10px;\n width: 48px;\n}\n\n.status__expand {\n width: 68px;\n position: absolute;\n left: 0;\n top: 0;\n height: 100%;\n cursor: pointer;\n}\n\n.muted {\n .status__content,\n .status__content p,\n .status__content a {\n color: $dark-text-color;\n }\n\n .status__display-name strong {\n color: $dark-text-color;\n }\n\n .status__avatar {\n opacity: 0.5;\n }\n\n a.status__content__spoiler-link {\n background: $ui-base-lighter-color;\n color: $inverted-text-color;\n\n &:hover {\n background: lighten($ui-base-lighter-color, 7%);\n text-decoration: none;\n }\n }\n}\n\n.notification__message {\n margin: 0 10px 0 68px;\n padding: 8px 0 0;\n cursor: default;\n color: $darker-text-color;\n font-size: 15px;\n line-height: 22px;\n position: relative;\n\n .fa {\n color: $highlight-text-color;\n }\n\n > span {\n display: inline;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.notification__favourite-icon-wrapper {\n left: -26px;\n position: absolute;\n\n .star-icon {\n color: $gold-star;\n }\n}\n\n.star-icon.active {\n color: $gold-star;\n}\n\n.bookmark-icon.active {\n color: $red-bookmark;\n}\n\n.no-reduce-motion .icon-button.star-icon {\n &.activate {\n & > .fa-star {\n animation: spring-rotate-in 1s linear;\n }\n }\n\n &.deactivate {\n & > .fa-star {\n animation: spring-rotate-out 1s linear;\n }\n }\n}\n\n.notification__display-name {\n color: inherit;\n font-weight: 500;\n text-decoration: none;\n\n &:hover {\n color: $primary-text-color;\n text-decoration: underline;\n }\n}\n\n.notification__relative_time {\n float: right;\n}\n\n.display-name {\n display: block;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.display-name__html {\n font-weight: 500;\n}\n\n.display-name__account {\n font-size: 14px;\n}\n\n.status__relative-time,\n.detailed-status__datetime {\n &:hover {\n text-decoration: underline;\n }\n}\n\n.image-loader {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n\n .image-loader__preview-canvas {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n background: url('~images/void.png') repeat;\n object-fit: contain;\n }\n\n .loading-bar {\n position: relative;\n }\n\n &.image-loader--amorphous .image-loader__preview-canvas {\n display: none;\n }\n}\n\n.zoomable-image {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n img {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n width: auto;\n height: auto;\n object-fit: contain;\n }\n}\n\n.navigation-bar {\n padding: 10px;\n display: flex;\n align-items: center;\n flex-shrink: 0;\n cursor: default;\n color: $darker-text-color;\n\n strong {\n color: $secondary-text-color;\n }\n\n a {\n color: inherit;\n }\n\n .permalink {\n text-decoration: none;\n }\n\n .navigation-bar__actions {\n position: relative;\n\n .icon-button.close {\n position: absolute;\n pointer-events: none;\n transform: scale(0, 1) translate(-100%, 0);\n opacity: 0;\n }\n\n .compose__action-bar .icon-button {\n pointer-events: auto;\n transform: scale(1, 1) translate(0, 0);\n opacity: 1;\n }\n }\n}\n\n.navigation-bar__profile {\n flex: 1 1 auto;\n margin-left: 8px;\n line-height: 20px;\n margin-top: -1px;\n overflow: hidden;\n}\n\n.navigation-bar__profile-account {\n display: block;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.navigation-bar__profile-edit {\n color: inherit;\n text-decoration: none;\n}\n\n.dropdown {\n display: inline-block;\n}\n\n.dropdown__content {\n display: none;\n position: absolute;\n}\n\n.dropdown-menu__separator {\n border-bottom: 1px solid darken($ui-secondary-color, 8%);\n margin: 5px 7px 6px;\n height: 0;\n}\n\n.dropdown-menu {\n background: $ui-secondary-color;\n padding: 4px 0;\n border-radius: 4px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n z-index: 9999;\n\n ul {\n list-style: none;\n }\n\n &.left {\n transform-origin: 100% 50%;\n }\n\n &.top {\n transform-origin: 50% 100%;\n }\n\n &.bottom {\n transform-origin: 50% 0;\n }\n\n &.right {\n transform-origin: 0 50%;\n }\n}\n\n.dropdown-menu__arrow {\n position: absolute;\n width: 0;\n height: 0;\n border: 0 solid transparent;\n\n &.left {\n right: -5px;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: $ui-secondary-color;\n }\n\n &.top {\n bottom: -5px;\n margin-left: -7px;\n border-width: 5px 7px 0;\n border-top-color: $ui-secondary-color;\n }\n\n &.bottom {\n top: -5px;\n margin-left: -7px;\n border-width: 0 7px 5px;\n border-bottom-color: $ui-secondary-color;\n }\n\n &.right {\n left: -5px;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: $ui-secondary-color;\n }\n}\n\n.dropdown-menu__item {\n a {\n font-size: 13px;\n line-height: 18px;\n display: block;\n padding: 4px 14px;\n box-sizing: border-box;\n text-decoration: none;\n background: $ui-secondary-color;\n color: $inverted-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:focus,\n &:hover,\n &:active {\n background: $ui-highlight-color;\n color: $secondary-text-color;\n outline: 0;\n }\n }\n}\n\n.dropdown--active .dropdown__content {\n display: block;\n line-height: 18px;\n max-width: 311px;\n right: 0;\n text-align: left;\n z-index: 9999;\n\n & > ul {\n list-style: none;\n background: $ui-secondary-color;\n padding: 4px 0;\n border-radius: 4px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.4);\n min-width: 140px;\n position: relative;\n }\n\n &.dropdown__right {\n right: 0;\n }\n\n &.dropdown__left {\n & > ul {\n left: -98px;\n }\n }\n\n & > ul > li > a {\n font-size: 13px;\n line-height: 18px;\n display: block;\n padding: 4px 14px;\n box-sizing: border-box;\n text-decoration: none;\n background: $ui-secondary-color;\n color: $inverted-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:focus {\n outline: 0;\n }\n\n &:hover {\n background: $ui-highlight-color;\n color: $secondary-text-color;\n }\n }\n}\n\n.dropdown__icon {\n vertical-align: middle;\n}\n\n.columns-area {\n display: flex;\n flex: 1 1 auto;\n flex-direction: row;\n justify-content: flex-start;\n overflow-x: auto;\n position: relative;\n\n &.unscrollable {\n overflow-x: hidden;\n }\n\n &__panels {\n display: flex;\n justify-content: center;\n width: 100%;\n height: 100%;\n min-height: 100vh;\n\n &__pane {\n height: 100%;\n overflow: hidden;\n pointer-events: none;\n display: flex;\n justify-content: flex-end;\n min-width: 285px;\n\n &--start {\n justify-content: flex-start;\n }\n\n &__inner {\n position: fixed;\n width: 285px;\n pointer-events: auto;\n height: 100%;\n }\n }\n\n &__main {\n box-sizing: border-box;\n width: 100%;\n max-width: 600px;\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding: 0 10px;\n }\n }\n }\n}\n\n.tabs-bar__wrapper {\n background: darken($ui-base-color, 8%);\n position: sticky;\n top: 0;\n z-index: 2;\n padding-top: 0;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding-top: 10px;\n }\n\n .tabs-bar {\n margin-bottom: 0;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n margin-bottom: 10px;\n }\n }\n}\n\n.react-swipeable-view-container {\n &,\n .columns-area,\n .drawer,\n .column {\n height: 100%;\n }\n}\n\n.react-swipeable-view-container > * {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n}\n\n.column {\n width: 350px;\n position: relative;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n\n > .scrollable {\n background: $ui-base-color;\n border-bottom-left-radius: 2px;\n border-bottom-right-radius: 2px;\n }\n}\n\n.ui {\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n}\n\n.drawer {\n width: 330px;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n overflow-y: hidden;\n}\n\n.drawer__tab {\n display: block;\n flex: 1 1 auto;\n padding: 15px 5px 13px;\n color: $darker-text-color;\n text-decoration: none;\n text-align: center;\n font-size: 16px;\n border-bottom: 2px solid transparent;\n}\n\n.column,\n.drawer {\n flex: 1 1 auto;\n overflow: hidden;\n}\n\n@media screen and (min-width: 631px) {\n .columns-area {\n padding: 0;\n }\n\n .column,\n .drawer {\n flex: 0 0 auto;\n padding: 10px;\n padding-left: 5px;\n padding-right: 5px;\n\n &:first-child {\n padding-left: 10px;\n }\n\n &:last-child {\n padding-right: 10px;\n }\n }\n\n .columns-area > div {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n }\n }\n}\n\n.tabs-bar {\n box-sizing: border-box;\n display: flex;\n background: lighten($ui-base-color, 8%);\n flex: 0 0 auto;\n overflow-y: auto;\n}\n\n.tabs-bar__link {\n display: block;\n flex: 1 1 auto;\n padding: 15px 10px;\n padding-bottom: 13px;\n color: $primary-text-color;\n text-decoration: none;\n text-align: center;\n font-size: 14px;\n font-weight: 500;\n border-bottom: 2px solid lighten($ui-base-color, 8%);\n transition: all 50ms linear;\n transition-property: border-bottom, background, color;\n\n .fa {\n font-weight: 400;\n font-size: 16px;\n }\n\n &:hover,\n &:focus,\n &:active {\n @media screen and (min-width: 631px) {\n background: lighten($ui-base-color, 14%);\n border-bottom-color: lighten($ui-base-color, 14%);\n }\n }\n\n &.active {\n border-bottom: 2px solid $highlight-text-color;\n color: $highlight-text-color;\n }\n\n span {\n margin-left: 5px;\n display: none;\n }\n}\n\n@media screen and (min-width: 600px) {\n .tabs-bar__link {\n span {\n display: inline;\n }\n }\n}\n\n.columns-area--mobile {\n flex-direction: column;\n width: 100%;\n height: 100%;\n margin: 0 auto;\n\n .column,\n .drawer {\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .directory__list {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: block;\n }\n }\n\n .directory__card {\n margin-bottom: 0;\n }\n\n .filter-form {\n display: flex;\n }\n\n .autosuggest-textarea__textarea {\n font-size: 16px;\n }\n\n .search__input {\n line-height: 18px;\n font-size: 16px;\n padding: 15px;\n padding-right: 30px;\n }\n\n .search__icon .fa {\n top: 15px;\n }\n\n .scrollable {\n overflow: visible;\n\n @supports(display: grid) {\n contain: content;\n }\n }\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding: 10px 0;\n padding-top: 0;\n }\n\n @media screen and (min-width: 630px) {\n .detailed-status {\n padding: 15px;\n\n .media-gallery,\n .video-player,\n .audio-player {\n margin-top: 15px;\n }\n }\n\n .account__header__bar {\n padding: 5px 10px;\n }\n\n .navigation-bar,\n .compose-form {\n padding: 15px;\n }\n\n .compose-form .compose-form__publish .compose-form__publish-button-wrapper {\n padding-top: 15px;\n }\n\n .status {\n padding: 15px 15px 15px (48px + 15px * 2);\n min-height: 48px + 2px;\n\n &__avatar {\n left: 15px;\n top: 17px;\n }\n\n &__content {\n padding-top: 5px;\n }\n\n &__prepend {\n margin-left: 48px + 15px * 2;\n padding-top: 15px;\n }\n\n &__prepend-icon-wrapper {\n left: -32px;\n }\n\n .media-gallery,\n &__action-bar,\n .video-player,\n .audio-player {\n margin-top: 10px;\n }\n }\n\n .account {\n padding: 15px 10px;\n\n &__header__bio {\n margin: 0 -10px;\n }\n }\n\n .notification {\n &__message {\n margin-left: 48px + 15px * 2;\n padding-top: 15px;\n }\n\n &__favourite-icon-wrapper {\n left: -32px;\n }\n\n .status {\n padding-top: 8px;\n }\n\n .account {\n padding-top: 8px;\n }\n\n .account__avatar-wrapper {\n margin-left: 17px;\n margin-right: 15px;\n }\n }\n }\n}\n\n.floating-action-button {\n position: fixed;\n display: flex;\n justify-content: center;\n align-items: center;\n width: 3.9375rem;\n height: 3.9375rem;\n bottom: 1.3125rem;\n right: 1.3125rem;\n background: darken($ui-highlight-color, 3%);\n color: $white;\n border-radius: 50%;\n font-size: 21px;\n line-height: 21px;\n text-decoration: none;\n box-shadow: 2px 3px 9px rgba($base-shadow-color, 0.4);\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-highlight-color, 7%);\n }\n}\n\n@media screen and (min-width: $no-gap-breakpoint) {\n .tabs-bar {\n width: 100%;\n }\n\n .react-swipeable-view-container .columns-area--mobile {\n height: calc(100% - 10px) !important;\n }\n\n .getting-started__wrapper,\n .getting-started__trends,\n .search {\n margin-bottom: 10px;\n }\n\n .getting-started__panel {\n margin: 10px 0;\n }\n\n .column,\n .drawer {\n min-width: 330px;\n }\n}\n\n@media screen and (max-width: 600px + (285px * 1) + (10px * 1)) {\n .columns-area__panels__pane--compositional {\n display: none;\n }\n}\n\n@media screen and (min-width: 600px + (285px * 1) + (10px * 1)) {\n .floating-action-button,\n .tabs-bar__link.optional {\n display: none;\n }\n\n .search-page .search {\n display: none;\n }\n}\n\n@media screen and (max-width: 600px + (285px * 2) + (10px * 2)) {\n .columns-area__panels__pane--navigational {\n display: none;\n }\n}\n\n@media screen and (min-width: 600px + (285px * 2) + (10px * 2)) {\n .tabs-bar {\n display: none;\n }\n}\n\n.icon-with-badge {\n position: relative;\n\n &__badge {\n position: absolute;\n left: 9px;\n top: -13px;\n background: $ui-highlight-color;\n border: 2px solid lighten($ui-base-color, 8%);\n padding: 1px 6px;\n border-radius: 6px;\n font-size: 10px;\n font-weight: 500;\n line-height: 14px;\n color: $primary-text-color;\n }\n}\n\n.column-link--transparent .icon-with-badge__badge {\n border-color: darken($ui-base-color, 8%);\n}\n\n.compose-panel {\n width: 285px;\n margin-top: 10px;\n display: flex;\n flex-direction: column;\n height: calc(100% - 10px);\n overflow-y: hidden;\n\n .navigation-bar {\n padding-top: 20px;\n padding-bottom: 20px;\n flex: 0 1 48px;\n min-height: 20px;\n }\n\n .flex-spacer {\n background: transparent;\n }\n\n .compose-form {\n flex: 1;\n overflow-y: hidden;\n display: flex;\n flex-direction: column;\n min-height: 310px;\n padding-bottom: 71px;\n margin-bottom: -71px;\n }\n\n .compose-form__autosuggest-wrapper {\n overflow-y: auto;\n background-color: $white;\n border-radius: 4px 4px 0 0;\n flex: 0 1 auto;\n }\n\n .autosuggest-textarea__textarea {\n overflow-y: hidden;\n }\n\n .compose-form__upload-thumbnail {\n height: 80px;\n }\n}\n\n.navigation-panel {\n margin-top: 10px;\n margin-bottom: 10px;\n height: calc(100% - 20px);\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n\n & > a {\n flex: 0 0 auto;\n }\n\n hr {\n flex: 0 0 auto;\n border: 0;\n background: transparent;\n border-top: 1px solid lighten($ui-base-color, 4%);\n margin: 10px 0;\n }\n\n .flex-spacer {\n background: transparent;\n }\n}\n\n.drawer__pager {\n box-sizing: border-box;\n padding: 0;\n flex-grow: 1;\n position: relative;\n overflow: hidden;\n display: flex;\n}\n\n.drawer__inner {\n position: absolute;\n top: 0;\n left: 0;\n background: lighten($ui-base-color, 13%);\n box-sizing: border-box;\n padding: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n overflow-y: auto;\n width: 100%;\n height: 100%;\n border-radius: 2px;\n\n &.darker {\n background: $ui-base-color;\n }\n}\n\n.drawer__inner__mastodon {\n background: lighten($ui-base-color, 13%) url('data:image/svg+xml;utf8,') no-repeat bottom / 100% auto;\n flex: 1;\n min-height: 47px;\n display: none;\n\n > img {\n display: block;\n object-fit: contain;\n object-position: bottom left;\n width: 85%;\n height: 100%;\n pointer-events: none;\n user-drag: none;\n user-select: none;\n }\n\n @media screen and (min-height: 640px) {\n display: block;\n }\n}\n\n.pseudo-drawer {\n background: lighten($ui-base-color, 13%);\n font-size: 13px;\n text-align: left;\n}\n\n.drawer__header {\n flex: 0 0 auto;\n font-size: 16px;\n background: lighten($ui-base-color, 8%);\n margin-bottom: 10px;\n display: flex;\n flex-direction: row;\n border-radius: 2px;\n\n a {\n transition: background 100ms ease-in;\n\n &:hover {\n background: lighten($ui-base-color, 3%);\n transition: background 200ms ease-out;\n }\n }\n}\n\n.scrollable {\n overflow-y: scroll;\n overflow-x: hidden;\n flex: 1 1 auto;\n -webkit-overflow-scrolling: touch;\n\n &.optionally-scrollable {\n overflow-y: auto;\n }\n\n @supports(display: grid) { // hack to fix Chrome <57\n contain: strict;\n }\n\n &--flex {\n display: flex;\n flex-direction: column;\n }\n\n &__append {\n flex: 1 1 auto;\n position: relative;\n min-height: 120px;\n }\n}\n\n.scrollable.fullscreen {\n @supports(display: grid) { // hack to fix Chrome <57\n contain: none;\n }\n}\n\n.column-back-button {\n box-sizing: border-box;\n width: 100%;\n background: lighten($ui-base-color, 4%);\n color: $highlight-text-color;\n cursor: pointer;\n flex: 0 0 auto;\n font-size: 16px;\n line-height: inherit;\n border: 0;\n text-align: unset;\n padding: 15px;\n margin: 0;\n z-index: 3;\n outline: 0;\n\n &:hover {\n text-decoration: underline;\n }\n}\n\n.column-header__back-button {\n background: lighten($ui-base-color, 4%);\n border: 0;\n font-family: inherit;\n color: $highlight-text-color;\n cursor: pointer;\n white-space: nowrap;\n font-size: 16px;\n padding: 0 5px 0 0;\n z-index: 3;\n\n &:hover {\n text-decoration: underline;\n }\n\n &:last-child {\n padding: 0 15px 0 0;\n }\n}\n\n.column-back-button__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.column-back-button--slim {\n position: relative;\n}\n\n.column-back-button--slim-button {\n cursor: pointer;\n flex: 0 0 auto;\n font-size: 16px;\n padding: 15px;\n position: absolute;\n right: 0;\n top: -48px;\n}\n\n.react-toggle {\n display: inline-block;\n position: relative;\n cursor: pointer;\n background-color: transparent;\n border: 0;\n padding: 0;\n user-select: none;\n -webkit-tap-highlight-color: rgba($base-overlay-background, 0);\n -webkit-tap-highlight-color: transparent;\n}\n\n.react-toggle-screenreader-only {\n border: 0;\n clip: rect(0 0 0 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n}\n\n.react-toggle--disabled {\n cursor: not-allowed;\n opacity: 0.5;\n transition: opacity 0.25s;\n}\n\n.react-toggle-track {\n width: 50px;\n height: 24px;\n padding: 0;\n border-radius: 30px;\n background-color: $ui-base-color;\n transition: background-color 0.2s ease;\n}\n\n.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track {\n background-color: darken($ui-base-color, 10%);\n}\n\n.react-toggle--checked .react-toggle-track {\n background-color: $ui-highlight-color;\n}\n\n.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track {\n background-color: lighten($ui-highlight-color, 10%);\n}\n\n.react-toggle-track-check {\n position: absolute;\n width: 14px;\n height: 10px;\n top: 0;\n bottom: 0;\n margin-top: auto;\n margin-bottom: auto;\n line-height: 0;\n left: 8px;\n opacity: 0;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle--checked .react-toggle-track-check {\n opacity: 1;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle-track-x {\n position: absolute;\n width: 10px;\n height: 10px;\n top: 0;\n bottom: 0;\n margin-top: auto;\n margin-bottom: auto;\n line-height: 0;\n right: 10px;\n opacity: 1;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle--checked .react-toggle-track-x {\n opacity: 0;\n}\n\n.react-toggle-thumb {\n position: absolute;\n top: 1px;\n left: 1px;\n width: 22px;\n height: 22px;\n border: 1px solid $ui-base-color;\n border-radius: 50%;\n background-color: darken($simple-background-color, 2%);\n box-sizing: border-box;\n transition: all 0.25s ease;\n transition-property: border-color, left;\n}\n\n.react-toggle--checked .react-toggle-thumb {\n left: 27px;\n border-color: $ui-highlight-color;\n}\n\n.column-link {\n background: lighten($ui-base-color, 8%);\n color: $primary-text-color;\n display: block;\n font-size: 16px;\n padding: 15px;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 11%);\n }\n\n &:focus {\n outline: 0;\n }\n\n &--transparent {\n background: transparent;\n color: $ui-secondary-color;\n\n &:hover,\n &:focus,\n &:active {\n background: transparent;\n color: $primary-text-color;\n }\n\n &.active {\n color: $ui-highlight-color;\n }\n }\n}\n\n.column-link__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.column-link__badge {\n display: inline-block;\n border-radius: 4px;\n font-size: 12px;\n line-height: 19px;\n font-weight: 500;\n background: $ui-base-color;\n padding: 4px 8px;\n margin: -6px 10px;\n}\n\n.column-subheading {\n background: $ui-base-color;\n color: $dark-text-color;\n padding: 8px 20px;\n font-size: 12px;\n font-weight: 500;\n text-transform: uppercase;\n cursor: default;\n}\n\n.getting-started__wrapper,\n.getting-started,\n.flex-spacer {\n background: $ui-base-color;\n}\n\n.flex-spacer {\n flex: 1 1 auto;\n}\n\n.getting-started {\n color: $dark-text-color;\n overflow: auto;\n border-bottom-left-radius: 2px;\n border-bottom-right-radius: 2px;\n\n &__wrapper,\n &__panel,\n &__footer {\n height: min-content;\n }\n\n &__panel,\n &__footer\n {\n padding: 10px;\n padding-top: 20px;\n flex-grow: 0;\n\n ul {\n margin-bottom: 10px;\n }\n\n ul li {\n display: inline;\n }\n\n p {\n font-size: 13px;\n\n a {\n color: $dark-text-color;\n text-decoration: underline;\n }\n }\n\n a {\n text-decoration: none;\n color: $darker-text-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n }\n\n &__wrapper,\n &__footer\n {\n color: $dark-text-color;\n }\n\n &__trends {\n flex: 0 1 auto;\n opacity: 1;\n animation: fade 150ms linear;\n margin-top: 10px;\n\n h4 {\n font-size: 12px;\n text-transform: uppercase;\n color: $darker-text-color;\n padding: 10px;\n font-weight: 500;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n @media screen and (max-height: 810px) {\n .trends__item:nth-child(3) {\n display: none;\n }\n }\n\n @media screen and (max-height: 720px) {\n .trends__item:nth-child(2) {\n display: none;\n }\n }\n\n @media screen and (max-height: 670px) {\n display: none;\n }\n\n .trends__item {\n border-bottom: 0;\n padding: 10px;\n\n &__current {\n color: $darker-text-color;\n }\n }\n }\n}\n\n.keyboard-shortcuts {\n padding: 8px 0 0;\n overflow: hidden;\n\n thead {\n position: absolute;\n left: -9999px;\n }\n\n td {\n padding: 0 10px 8px;\n }\n\n kbd {\n display: inline-block;\n padding: 3px 5px;\n background-color: lighten($ui-base-color, 8%);\n border: 1px solid darken($ui-base-color, 4%);\n }\n}\n\n.setting-text {\n display: block;\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n color: $inverted-text-color;\n background: $simple-background-color;\n padding: 10px;\n font-family: inherit;\n font-size: 14px;\n resize: vertical;\n border: 0;\n outline: 0;\n border-radius: 4px;\n\n &:focus {\n outline: 0;\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n}\n\n.no-reduce-motion button.icon-button i.fa-retweet {\n background-position: 0 0;\n height: 19px;\n transition: background-position 0.9s steps(10);\n transition-duration: 0s;\n vertical-align: middle;\n width: 22px;\n\n &::before {\n display: none !important;\n }\n\n}\n\n.no-reduce-motion button.icon-button.active i.fa-retweet {\n transition-duration: 0.9s;\n background-position: 0 100%;\n}\n\n.reduce-motion button.icon-button i.fa-retweet {\n color: $action-button-color;\n transition: color 100ms ease-in;\n}\n\n.reduce-motion button.icon-button.active i.fa-retweet {\n color: $highlight-text-color;\n}\n\n.status-card {\n display: flex;\n font-size: 14px;\n border: 1px solid lighten($ui-base-color, 8%);\n border-radius: 4px;\n color: $dark-text-color;\n margin-top: 14px;\n text-decoration: none;\n overflow: hidden;\n\n &__actions {\n bottom: 0;\n left: 0;\n position: absolute;\n right: 0;\n top: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n\n & > div {\n background: rgba($base-shadow-color, 0.6);\n border-radius: 8px;\n padding: 12px 9px;\n flex: 0 0 auto;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n button,\n a {\n display: inline;\n color: $secondary-text-color;\n background: transparent;\n border: 0;\n padding: 0 8px;\n text-decoration: none;\n font-size: 18px;\n line-height: 18px;\n\n &:hover,\n &:active,\n &:focus {\n color: $primary-text-color;\n }\n }\n\n a {\n font-size: 19px;\n position: relative;\n bottom: -1px;\n }\n }\n}\n\na.status-card {\n cursor: pointer;\n\n &:hover {\n background: lighten($ui-base-color, 8%);\n }\n}\n\n.status-card-photo {\n cursor: zoom-in;\n display: block;\n text-decoration: none;\n width: 100%;\n height: auto;\n margin: 0;\n}\n\n.status-card-video {\n iframe {\n width: 100%;\n height: 100%;\n }\n}\n\n.status-card__title {\n display: block;\n font-weight: 500;\n margin-bottom: 5px;\n color: $darker-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-decoration: none;\n}\n\n.status-card__content {\n flex: 1 1 auto;\n overflow: hidden;\n padding: 14px 14px 14px 8px;\n}\n\n.status-card__description {\n color: $darker-text-color;\n}\n\n.status-card__host {\n display: block;\n margin-top: 5px;\n font-size: 13px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.status-card__image {\n flex: 0 0 100px;\n background: lighten($ui-base-color, 8%);\n position: relative;\n\n & > .fa {\n font-size: 21px;\n position: absolute;\n transform-origin: 50% 50%;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n}\n\n.status-card.horizontal {\n display: block;\n\n .status-card__image {\n width: 100%;\n }\n\n .status-card__image-image {\n border-radius: 4px 4px 0 0;\n }\n\n .status-card__title {\n white-space: inherit;\n }\n}\n\n.status-card.compact {\n border-color: lighten($ui-base-color, 4%);\n\n &.interactive {\n border: 0;\n }\n\n .status-card__content {\n padding: 8px;\n padding-top: 10px;\n }\n\n .status-card__title {\n white-space: nowrap;\n }\n\n .status-card__image {\n flex: 0 0 60px;\n }\n}\n\na.status-card.compact:hover {\n background-color: lighten($ui-base-color, 4%);\n}\n\n.status-card__image-image {\n border-radius: 4px 0 0 4px;\n display: block;\n margin: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n background-size: cover;\n background-position: center center;\n}\n\n.load-more {\n display: block;\n color: $dark-text-color;\n background-color: transparent;\n border: 0;\n font-size: inherit;\n text-align: center;\n line-height: inherit;\n margin: 0;\n padding: 15px;\n box-sizing: border-box;\n width: 100%;\n clear: both;\n text-decoration: none;\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n}\n\n.load-gap {\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n}\n\n.regeneration-indicator {\n text-align: center;\n font-size: 16px;\n font-weight: 500;\n color: $dark-text-color;\n background: $ui-base-color;\n cursor: default;\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 20px;\n\n &__figure {\n &,\n img {\n display: block;\n width: auto;\n height: 160px;\n margin: 0;\n }\n }\n\n &--without-header {\n padding-top: 20px + 48px;\n }\n\n &__label {\n margin-top: 30px;\n\n strong {\n display: block;\n margin-bottom: 10px;\n color: $dark-text-color;\n }\n\n span {\n font-size: 15px;\n font-weight: 400;\n }\n }\n}\n\n.column-header__wrapper {\n position: relative;\n flex: 0 0 auto;\n z-index: 1;\n\n &.active {\n box-shadow: 0 1px 0 rgba($highlight-text-color, 0.3);\n\n &::before {\n display: block;\n content: \"\";\n position: absolute;\n bottom: -13px;\n left: 0;\n right: 0;\n margin: 0 auto;\n width: 60%;\n pointer-events: none;\n height: 28px;\n z-index: 1;\n background: radial-gradient(ellipse, rgba($ui-highlight-color, 0.23) 0%, rgba($ui-highlight-color, 0) 60%);\n }\n }\n\n .announcements {\n z-index: 1;\n position: relative;\n }\n}\n\n.column-header {\n display: flex;\n font-size: 16px;\n background: lighten($ui-base-color, 4%);\n flex: 0 0 auto;\n cursor: pointer;\n position: relative;\n z-index: 2;\n outline: 0;\n overflow: hidden;\n border-top-left-radius: 2px;\n border-top-right-radius: 2px;\n\n & > button {\n margin: 0;\n border: 0;\n padding: 15px 0 15px 15px;\n color: inherit;\n background: transparent;\n font: inherit;\n text-align: left;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n flex: 1;\n }\n\n & > .column-header__back-button {\n color: $highlight-text-color;\n }\n\n &.active {\n .column-header__icon {\n color: $highlight-text-color;\n text-shadow: 0 0 10px rgba($highlight-text-color, 0.4);\n }\n }\n\n &:focus,\n &:active {\n outline: 0;\n }\n}\n\n.column-header__buttons {\n height: 48px;\n display: flex;\n}\n\n.column-header__links {\n margin-bottom: 14px;\n}\n\n.column-header__links .text-btn {\n margin-right: 10px;\n}\n\n.column-header__button {\n background: lighten($ui-base-color, 4%);\n border: 0;\n color: $darker-text-color;\n cursor: pointer;\n font-size: 16px;\n padding: 0 15px;\n\n &:hover {\n color: lighten($darker-text-color, 7%);\n }\n\n &.active {\n color: $primary-text-color;\n background: lighten($ui-base-color, 8%);\n\n &:hover {\n color: $primary-text-color;\n background: lighten($ui-base-color, 8%);\n }\n }\n}\n\n.column-header__collapsible {\n max-height: 70vh;\n overflow: hidden;\n overflow-y: auto;\n color: $darker-text-color;\n transition: max-height 150ms ease-in-out, opacity 300ms linear;\n opacity: 1;\n z-index: 1;\n position: relative;\n\n &.collapsed {\n max-height: 0;\n opacity: 0.5;\n }\n\n &.animating {\n overflow-y: hidden;\n }\n\n hr {\n height: 0;\n background: transparent;\n border: 0;\n border-top: 1px solid lighten($ui-base-color, 12%);\n margin: 10px 0;\n }\n}\n\n.column-header__collapsible-inner {\n background: lighten($ui-base-color, 8%);\n padding: 15px;\n}\n\n.column-header__setting-btn {\n &:hover {\n color: $darker-text-color;\n text-decoration: underline;\n }\n}\n\n.column-header__setting-arrows {\n float: right;\n\n .column-header__setting-btn {\n padding: 0 10px;\n\n &:last-child {\n padding-right: 0;\n }\n }\n}\n\n.text-btn {\n display: inline-block;\n padding: 0;\n font-family: inherit;\n font-size: inherit;\n color: inherit;\n border: 0;\n background: transparent;\n cursor: pointer;\n}\n\n.column-header__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.loading-indicator {\n color: $dark-text-color;\n font-size: 12px;\n font-weight: 400;\n text-transform: uppercase;\n overflow: visible;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n\n span {\n display: block;\n float: left;\n margin-left: 50%;\n transform: translateX(-50%);\n margin: 82px 0 0 50%;\n white-space: nowrap;\n }\n}\n\n.loading-indicator__figure {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 42px;\n height: 42px;\n box-sizing: border-box;\n background-color: transparent;\n border: 0 solid lighten($ui-base-color, 26%);\n border-width: 6px;\n border-radius: 50%;\n}\n\n.no-reduce-motion .loading-indicator span {\n animation: loader-label 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1);\n}\n\n.no-reduce-motion .loading-indicator__figure {\n animation: loader-figure 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1);\n}\n\n@keyframes spring-rotate-in {\n 0% {\n transform: rotate(0deg);\n }\n\n 30% {\n transform: rotate(-484.8deg);\n }\n\n 60% {\n transform: rotate(-316.7deg);\n }\n\n 90% {\n transform: rotate(-375deg);\n }\n\n 100% {\n transform: rotate(-360deg);\n }\n}\n\n@keyframes spring-rotate-out {\n 0% {\n transform: rotate(-360deg);\n }\n\n 30% {\n transform: rotate(124.8deg);\n }\n\n 60% {\n transform: rotate(-43.27deg);\n }\n\n 90% {\n transform: rotate(15deg);\n }\n\n 100% {\n transform: rotate(0deg);\n }\n}\n\n@keyframes loader-figure {\n 0% {\n width: 0;\n height: 0;\n background-color: lighten($ui-base-color, 26%);\n }\n\n 29% {\n background-color: lighten($ui-base-color, 26%);\n }\n\n 30% {\n width: 42px;\n height: 42px;\n background-color: transparent;\n border-width: 21px;\n opacity: 1;\n }\n\n 100% {\n width: 42px;\n height: 42px;\n border-width: 0;\n opacity: 0;\n background-color: transparent;\n }\n}\n\n@keyframes loader-label {\n 0% { opacity: 0.25; }\n 30% { opacity: 1; }\n 100% { opacity: 0.25; }\n}\n\n.video-error-cover {\n align-items: center;\n background: $base-overlay-background;\n color: $primary-text-color;\n cursor: pointer;\n display: flex;\n flex-direction: column;\n height: 100%;\n justify-content: center;\n margin-top: 8px;\n position: relative;\n text-align: center;\n z-index: 100;\n}\n\n.media-spoiler {\n background: $base-overlay-background;\n color: $darker-text-color;\n border: 0;\n padding: 0;\n width: 100%;\n height: 100%;\n border-radius: 4px;\n appearance: none;\n\n &:hover,\n &:active,\n &:focus {\n padding: 0;\n color: lighten($darker-text-color, 8%);\n }\n}\n\n.media-spoiler__warning {\n display: block;\n font-size: 14px;\n}\n\n.media-spoiler__trigger {\n display: block;\n font-size: 11px;\n font-weight: 700;\n}\n\n.spoiler-button {\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n position: absolute;\n z-index: 100;\n\n &--minified {\n display: block;\n left: 4px;\n top: 4px;\n width: auto;\n height: auto;\n }\n\n &--click-thru {\n pointer-events: none;\n }\n\n &--hidden {\n display: none;\n }\n\n &__overlay {\n display: block;\n background: transparent;\n width: 100%;\n height: 100%;\n border: 0;\n\n &__label {\n display: inline-block;\n background: rgba($base-overlay-background, 0.5);\n border-radius: 8px;\n padding: 8px 12px;\n color: $primary-text-color;\n font-weight: 500;\n font-size: 14px;\n }\n\n &:hover,\n &:focus,\n &:active {\n .spoiler-button__overlay__label {\n background: rgba($base-overlay-background, 0.8);\n }\n }\n\n &:disabled {\n .spoiler-button__overlay__label {\n background: rgba($base-overlay-background, 0.5);\n }\n }\n }\n}\n\n.modal-container--preloader {\n background: lighten($ui-base-color, 8%);\n}\n\n.account--panel {\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: row;\n padding: 10px 0;\n}\n\n.account--panel__button,\n.detailed-status__button {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.column-settings__outer {\n background: lighten($ui-base-color, 8%);\n padding: 15px;\n}\n\n.column-settings__section {\n color: $darker-text-color;\n cursor: default;\n display: block;\n font-weight: 500;\n margin-bottom: 10px;\n}\n\n.column-settings__hashtags {\n .column-settings__row {\n margin-bottom: 15px;\n }\n\n .column-select {\n &__control {\n @include search-input;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n &__placeholder {\n color: $dark-text-color;\n padding-left: 2px;\n font-size: 12px;\n }\n\n &__value-container {\n padding-left: 6px;\n }\n\n &__multi-value {\n background: lighten($ui-base-color, 8%);\n\n &__remove {\n cursor: pointer;\n\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 12%);\n color: lighten($darker-text-color, 4%);\n }\n }\n }\n\n &__multi-value__label,\n &__input {\n color: $darker-text-color;\n }\n\n &__clear-indicator,\n &__dropdown-indicator {\n cursor: pointer;\n transition: none;\n color: $dark-text-color;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($dark-text-color, 4%);\n }\n }\n\n &__indicator-separator {\n background-color: lighten($ui-base-color, 8%);\n }\n\n &__menu {\n @include search-popout;\n padding: 0;\n background: $ui-secondary-color;\n }\n\n &__menu-list {\n padding: 6px;\n }\n\n &__option {\n color: $inverted-text-color;\n border-radius: 4px;\n font-size: 14px;\n\n &--is-focused,\n &--is-selected {\n background: darken($ui-secondary-color, 10%);\n }\n }\n }\n}\n\n.column-settings__row {\n .text-btn {\n margin-bottom: 15px;\n }\n}\n\n.relationship-tag {\n color: $primary-text-color;\n margin-bottom: 4px;\n display: block;\n vertical-align: top;\n background-color: $base-overlay-background;\n text-transform: uppercase;\n font-size: 11px;\n font-weight: 500;\n padding: 4px;\n border-radius: 4px;\n opacity: 0.7;\n\n &:hover {\n opacity: 1;\n }\n}\n\n.setting-toggle {\n display: block;\n line-height: 24px;\n}\n\n.setting-toggle__label {\n color: $darker-text-color;\n display: inline-block;\n margin-bottom: 14px;\n margin-left: 8px;\n vertical-align: middle;\n}\n\n.empty-column-indicator,\n.error-column,\n.follow_requests-unlocked_explanation {\n color: $dark-text-color;\n background: $ui-base-color;\n text-align: center;\n padding: 20px;\n font-size: 15px;\n font-weight: 400;\n cursor: default;\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n justify-content: center;\n\n @supports(display: grid) { // hack to fix Chrome <57\n contain: strict;\n }\n\n & > span {\n max-width: 400px;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.follow_requests-unlocked_explanation {\n background: darken($ui-base-color, 4%);\n contain: initial;\n}\n\n.error-column {\n flex-direction: column;\n}\n\n@keyframes heartbeat {\n from {\n transform: scale(1);\n animation-timing-function: ease-out;\n }\n\n 10% {\n transform: scale(0.91);\n animation-timing-function: ease-in;\n }\n\n 17% {\n transform: scale(0.98);\n animation-timing-function: ease-out;\n }\n\n 33% {\n transform: scale(0.87);\n animation-timing-function: ease-in;\n }\n\n 45% {\n transform: scale(1);\n animation-timing-function: ease-out;\n }\n}\n\n.no-reduce-motion .pulse-loading {\n transform-origin: center center;\n animation: heartbeat 1.5s ease-in-out infinite both;\n}\n\n@keyframes shake-bottom {\n 0%,\n 100% {\n transform: rotate(0deg);\n transform-origin: 50% 100%;\n }\n\n 10% {\n transform: rotate(2deg);\n }\n\n 20%,\n 40%,\n 60% {\n transform: rotate(-4deg);\n }\n\n 30%,\n 50%,\n 70% {\n transform: rotate(4deg);\n }\n\n 80% {\n transform: rotate(-2deg);\n }\n\n 90% {\n transform: rotate(2deg);\n }\n}\n\n.no-reduce-motion .shake-bottom {\n transform-origin: 50% 100%;\n animation: shake-bottom 0.8s cubic-bezier(0.455, 0.03, 0.515, 0.955) 2s 2 both;\n}\n\n.emoji-picker-dropdown__menu {\n background: $simple-background-color;\n position: absolute;\n box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n margin-top: 5px;\n z-index: 2;\n\n .emoji-mart-scroll {\n transition: opacity 200ms ease;\n }\n\n &.selecting .emoji-mart-scroll {\n opacity: 0.5;\n }\n}\n\n.emoji-picker-dropdown__modifiers {\n position: absolute;\n top: 60px;\n right: 11px;\n cursor: pointer;\n}\n\n.emoji-picker-dropdown__modifiers__menu {\n position: absolute;\n z-index: 4;\n top: -4px;\n left: -8px;\n background: $simple-background-color;\n border-radius: 4px;\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n overflow: hidden;\n\n button {\n display: block;\n cursor: pointer;\n border: 0;\n padding: 4px 8px;\n background: transparent;\n\n &:hover,\n &:focus,\n &:active {\n background: rgba($ui-secondary-color, 0.4);\n }\n }\n\n .emoji-mart-emoji {\n height: 22px;\n }\n}\n\n.emoji-mart-emoji {\n span {\n background-repeat: no-repeat;\n }\n}\n\n.upload-area {\n align-items: center;\n background: rgba($base-overlay-background, 0.8);\n display: flex;\n height: 100%;\n justify-content: center;\n left: 0;\n opacity: 0;\n position: absolute;\n top: 0;\n visibility: hidden;\n width: 100%;\n z-index: 2000;\n\n * {\n pointer-events: none;\n }\n}\n\n.upload-area__drop {\n width: 320px;\n height: 160px;\n display: flex;\n box-sizing: border-box;\n position: relative;\n padding: 8px;\n}\n\n.upload-area__background {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: -1;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 5px rgba($base-shadow-color, 0.2);\n}\n\n.upload-area__content {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: $secondary-text-color;\n font-size: 18px;\n font-weight: 500;\n border: 2px dashed $ui-base-lighter-color;\n border-radius: 4px;\n}\n\n.upload-progress {\n padding: 10px;\n color: $lighter-text-color;\n overflow: hidden;\n display: flex;\n\n .fa {\n font-size: 34px;\n margin-right: 10px;\n }\n\n span {\n font-size: 12px;\n text-transform: uppercase;\n font-weight: 500;\n display: block;\n }\n}\n\n.upload-progess__message {\n flex: 1 1 auto;\n}\n\n.upload-progress__backdrop {\n width: 100%;\n height: 6px;\n border-radius: 6px;\n background: $ui-base-lighter-color;\n position: relative;\n margin-top: 5px;\n}\n\n.upload-progress__tracker {\n position: absolute;\n left: 0;\n top: 0;\n height: 6px;\n background: $ui-highlight-color;\n border-radius: 6px;\n}\n\n.emoji-button {\n display: block;\n padding: 5px 5px 2px 2px;\n outline: 0;\n cursor: pointer;\n\n &:active,\n &:focus {\n outline: 0 !important;\n }\n\n img {\n filter: grayscale(100%);\n opacity: 0.8;\n display: block;\n margin: 0;\n width: 22px;\n height: 22px;\n }\n\n &:hover,\n &:active,\n &:focus {\n img {\n opacity: 1;\n filter: none;\n }\n }\n}\n\n.dropdown--active .emoji-button img {\n opacity: 1;\n filter: none;\n}\n\n.privacy-dropdown__dropdown {\n position: absolute;\n background: $simple-background-color;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n margin-left: 40px;\n overflow: hidden;\n\n &.top {\n transform-origin: 50% 100%;\n }\n\n &.bottom {\n transform-origin: 50% 0;\n }\n}\n\n.privacy-dropdown__option {\n color: $inverted-text-color;\n padding: 10px;\n cursor: pointer;\n display: flex;\n\n &:hover,\n &.active {\n background: $ui-highlight-color;\n color: $primary-text-color;\n outline: 0;\n\n .privacy-dropdown__option__content {\n color: $primary-text-color;\n\n strong {\n color: $primary-text-color;\n }\n }\n }\n\n &.active:hover {\n background: lighten($ui-highlight-color, 4%);\n }\n}\n\n.privacy-dropdown__option__icon {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 10px;\n}\n\n.privacy-dropdown__option__content {\n flex: 1 1 auto;\n color: $lighter-text-color;\n\n strong {\n font-weight: 500;\n display: block;\n color: $inverted-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n}\n\n.privacy-dropdown.active {\n .privacy-dropdown__value {\n background: $simple-background-color;\n border-radius: 4px 4px 0 0;\n box-shadow: 0 -4px 4px rgba($base-shadow-color, 0.1);\n\n .icon-button {\n transition: none;\n }\n\n &.active {\n background: $ui-highlight-color;\n\n .icon-button {\n color: $primary-text-color;\n }\n }\n }\n\n &.top .privacy-dropdown__value {\n border-radius: 0 0 4px 4px;\n }\n\n .privacy-dropdown__dropdown {\n display: block;\n box-shadow: 2px 4px 6px rgba($base-shadow-color, 0.1);\n }\n}\n\n.search {\n position: relative;\n}\n\n.search__input {\n @include search-input;\n\n display: block;\n padding: 15px;\n padding-right: 30px;\n line-height: 18px;\n font-size: 16px;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n}\n\n.search__icon {\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus {\n outline: 0 !important;\n }\n\n .fa {\n position: absolute;\n top: 16px;\n right: 10px;\n z-index: 2;\n display: inline-block;\n opacity: 0;\n transition: all 100ms linear;\n transition-property: transform, opacity;\n font-size: 18px;\n width: 18px;\n height: 18px;\n color: $secondary-text-color;\n cursor: default;\n pointer-events: none;\n\n &.active {\n pointer-events: auto;\n opacity: 0.3;\n }\n }\n\n .fa-search {\n transform: rotate(90deg);\n\n &.active {\n pointer-events: none;\n transform: rotate(0deg);\n }\n }\n\n .fa-times-circle {\n top: 17px;\n transform: rotate(0deg);\n color: $action-button-color;\n cursor: pointer;\n\n &.active {\n transform: rotate(90deg);\n }\n\n &:hover {\n color: lighten($action-button-color, 7%);\n }\n }\n}\n\n.search-results__header {\n color: $dark-text-color;\n background: lighten($ui-base-color, 2%);\n padding: 15px;\n font-weight: 500;\n font-size: 16px;\n cursor: default;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n}\n\n.search-results__section {\n margin-bottom: 5px;\n\n h5 {\n background: darken($ui-base-color, 4%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n display: flex;\n padding: 15px;\n font-weight: 500;\n font-size: 16px;\n color: $dark-text-color;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n .account:last-child,\n & > div:last-child .status {\n border-bottom: 0;\n }\n}\n\n.search-results__hashtag {\n display: block;\n padding: 10px;\n color: $secondary-text-color;\n text-decoration: none;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($secondary-text-color, 4%);\n text-decoration: underline;\n }\n}\n\n.search-results__info {\n padding: 20px;\n color: $darker-text-color;\n text-align: center;\n}\n\n.modal-root {\n position: relative;\n transition: opacity 0.3s linear;\n will-change: opacity;\n z-index: 9999;\n}\n\n.modal-root__overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba($base-overlay-background, 0.7);\n}\n\n.modal-root__container {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n align-content: space-around;\n z-index: 9999;\n pointer-events: none;\n user-select: none;\n}\n\n.modal-root__modal {\n pointer-events: auto;\n display: flex;\n z-index: 9999;\n}\n\n.video-modal__container {\n max-width: 100vw;\n max-height: 100vh;\n}\n\n.audio-modal__container {\n width: 50vw;\n}\n\n.media-modal {\n width: 100%;\n height: 100%;\n position: relative;\n\n .extended-video-player {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n video {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n }\n }\n}\n\n.media-modal__closer {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n}\n\n.media-modal__navigation {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n transition: opacity 0.3s linear;\n will-change: opacity;\n\n * {\n pointer-events: auto;\n }\n\n &.media-modal__navigation--hidden {\n opacity: 0;\n\n * {\n pointer-events: none;\n }\n }\n}\n\n.media-modal__nav {\n background: rgba($base-overlay-background, 0.5);\n box-sizing: border-box;\n border: 0;\n color: $primary-text-color;\n cursor: pointer;\n display: flex;\n align-items: center;\n font-size: 24px;\n height: 20vmax;\n margin: auto 0;\n padding: 30px 15px;\n position: absolute;\n top: 0;\n bottom: 0;\n}\n\n.media-modal__nav--left {\n left: 0;\n}\n\n.media-modal__nav--right {\n right: 0;\n}\n\n.media-modal__pagination {\n width: 100%;\n text-align: center;\n position: absolute;\n left: 0;\n bottom: 20px;\n pointer-events: none;\n}\n\n.media-modal__meta {\n text-align: center;\n position: absolute;\n left: 0;\n bottom: 20px;\n width: 100%;\n pointer-events: none;\n\n &--shifted {\n bottom: 62px;\n }\n\n a {\n pointer-events: auto;\n text-decoration: none;\n font-weight: 500;\n color: $ui-secondary-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.media-modal__page-dot {\n display: inline-block;\n}\n\n.media-modal__button {\n background-color: $primary-text-color;\n height: 12px;\n width: 12px;\n border-radius: 6px;\n margin: 10px;\n padding: 0;\n border: 0;\n font-size: 0;\n}\n\n.media-modal__button--active {\n background-color: $highlight-text-color;\n}\n\n.media-modal__close {\n position: absolute;\n right: 8px;\n top: 8px;\n z-index: 100;\n}\n\n.onboarding-modal,\n.error-modal,\n.embed-modal {\n background: $ui-secondary-color;\n color: $inverted-text-color;\n border-radius: 8px;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.error-modal__body {\n height: 80vh;\n width: 80vw;\n max-width: 520px;\n max-height: 420px;\n position: relative;\n\n & > div {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n padding: 25px;\n display: none;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n display: flex;\n opacity: 0;\n user-select: text;\n }\n}\n\n.error-modal__body {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n text-align: center;\n}\n\n.onboarding-modal__paginator,\n.error-modal__footer {\n flex: 0 0 auto;\n background: darken($ui-secondary-color, 8%);\n display: flex;\n padding: 25px;\n\n & > div {\n min-width: 33px;\n }\n\n .onboarding-modal__nav,\n .error-modal__nav {\n color: $lighter-text-color;\n border: 0;\n font-size: 14px;\n font-weight: 500;\n padding: 10px 25px;\n line-height: inherit;\n height: auto;\n margin: -10px;\n border-radius: 4px;\n background-color: transparent;\n\n &:hover,\n &:focus,\n &:active {\n color: darken($lighter-text-color, 4%);\n background-color: darken($ui-secondary-color, 16%);\n }\n\n &.onboarding-modal__done,\n &.onboarding-modal__next {\n color: $inverted-text-color;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($inverted-text-color, 4%);\n }\n }\n }\n}\n\n.error-modal__footer {\n justify-content: center;\n}\n\n.display-case {\n text-align: center;\n font-size: 15px;\n margin-bottom: 15px;\n\n &__label {\n font-weight: 500;\n color: $inverted-text-color;\n margin-bottom: 5px;\n text-transform: uppercase;\n font-size: 12px;\n }\n\n &__case {\n background: $ui-base-color;\n color: $secondary-text-color;\n font-weight: 500;\n padding: 10px;\n border-radius: 4px;\n }\n}\n\n.onboard-sliders {\n display: inline-block;\n max-width: 30px;\n max-height: auto;\n margin-left: 10px;\n}\n\n.boost-modal,\n.confirmation-modal,\n.report-modal,\n.actions-modal,\n.mute-modal,\n.block-modal {\n background: lighten($ui-secondary-color, 8%);\n color: $inverted-text-color;\n border-radius: 8px;\n overflow: hidden;\n max-width: 90vw;\n width: 480px;\n position: relative;\n flex-direction: column;\n\n .status__display-name {\n display: block;\n max-width: 100%;\n padding-right: 25px;\n }\n\n .status__avatar {\n height: 28px;\n left: 10px;\n position: absolute;\n top: 10px;\n width: 48px;\n }\n\n .status__content__spoiler-link {\n color: lighten($secondary-text-color, 8%);\n }\n}\n\n.actions-modal {\n .status {\n background: $white;\n border-bottom-color: $ui-secondary-color;\n padding-top: 10px;\n padding-bottom: 10px;\n }\n\n .dropdown-menu__separator {\n border-bottom-color: $ui-secondary-color;\n }\n}\n\n.boost-modal__container {\n overflow-x: scroll;\n padding: 10px;\n\n .status {\n user-select: text;\n border-bottom: 0;\n }\n}\n\n.boost-modal__action-bar,\n.confirmation-modal__action-bar,\n.mute-modal__action-bar,\n.block-modal__action-bar {\n display: flex;\n justify-content: space-between;\n background: $ui-secondary-color;\n padding: 10px;\n line-height: 36px;\n\n & > div {\n flex: 1 1 auto;\n text-align: right;\n color: $lighter-text-color;\n padding-right: 10px;\n }\n\n .button {\n flex: 0 0 auto;\n }\n}\n\n.boost-modal__status-header {\n font-size: 15px;\n}\n\n.boost-modal__status-time {\n float: right;\n font-size: 14px;\n}\n\n.mute-modal,\n.block-modal {\n line-height: 24px;\n}\n\n.mute-modal .react-toggle,\n.block-modal .react-toggle {\n vertical-align: middle;\n}\n\n.report-modal {\n width: 90vw;\n max-width: 700px;\n}\n\n.report-modal__container {\n display: flex;\n border-top: 1px solid $ui-secondary-color;\n\n @media screen and (max-width: 480px) {\n flex-wrap: wrap;\n overflow-y: auto;\n }\n}\n\n.report-modal__statuses,\n.report-modal__comment {\n box-sizing: border-box;\n width: 50%;\n\n @media screen and (max-width: 480px) {\n width: 100%;\n }\n}\n\n.report-modal__statuses,\n.focal-point-modal__content {\n flex: 1 1 auto;\n min-height: 20vh;\n max-height: 80vh;\n overflow-y: auto;\n overflow-x: hidden;\n\n .status__content a {\n color: $highlight-text-color;\n }\n\n .status__content,\n .status__content p {\n color: $inverted-text-color;\n }\n\n @media screen and (max-width: 480px) {\n max-height: 10vh;\n }\n}\n\n.focal-point-modal__content {\n @media screen and (max-width: 480px) {\n max-height: 40vh;\n }\n}\n\n.report-modal__comment {\n padding: 20px;\n border-right: 1px solid $ui-secondary-color;\n max-width: 320px;\n\n p {\n font-size: 14px;\n line-height: 20px;\n margin-bottom: 20px;\n }\n\n .setting-text {\n display: block;\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n color: $inverted-text-color;\n background: $white;\n padding: 10px;\n font-family: inherit;\n font-size: 14px;\n resize: none;\n border: 0;\n outline: 0;\n border-radius: 4px;\n border: 1px solid $ui-secondary-color;\n min-height: 100px;\n max-height: 50vh;\n margin-bottom: 10px;\n\n &:focus {\n border: 1px solid darken($ui-secondary-color, 8%);\n }\n\n &__wrapper {\n background: $white;\n border: 1px solid $ui-secondary-color;\n margin-bottom: 10px;\n border-radius: 4px;\n\n .setting-text {\n border: 0;\n margin-bottom: 0;\n border-radius: 0;\n\n &:focus {\n border: 0;\n }\n }\n\n &__modifiers {\n color: $inverted-text-color;\n font-family: inherit;\n font-size: 14px;\n background: $white;\n }\n }\n\n &__toolbar {\n display: flex;\n justify-content: space-between;\n margin-bottom: 20px;\n }\n }\n\n .setting-text-label {\n display: block;\n color: $inverted-text-color;\n font-size: 14px;\n font-weight: 500;\n margin-bottom: 10px;\n }\n\n .setting-toggle {\n margin-top: 20px;\n margin-bottom: 24px;\n\n &__label {\n color: $inverted-text-color;\n font-size: 14px;\n }\n }\n\n @media screen and (max-width: 480px) {\n padding: 10px;\n max-width: 100%;\n order: 2;\n\n .setting-toggle {\n margin-bottom: 4px;\n }\n }\n}\n\n.actions-modal {\n max-height: 80vh;\n max-width: 80vw;\n\n .status {\n overflow-y: auto;\n max-height: 300px;\n }\n\n .actions-modal__item-label {\n font-weight: 500;\n }\n\n ul {\n overflow-y: auto;\n flex-shrink: 0;\n max-height: 80vh;\n\n &.with-status {\n max-height: calc(80vh - 75px);\n }\n\n li:empty {\n margin: 0;\n }\n\n li:not(:empty) {\n a {\n color: $inverted-text-color;\n display: flex;\n padding: 12px 16px;\n font-size: 15px;\n align-items: center;\n text-decoration: none;\n\n &,\n button {\n transition: none;\n }\n\n &.active,\n &:hover,\n &:active,\n &:focus {\n &,\n button {\n background: $ui-highlight-color;\n color: $primary-text-color;\n }\n }\n\n button:first-child {\n margin-right: 10px;\n }\n }\n }\n }\n}\n\n.confirmation-modal__action-bar,\n.mute-modal__action-bar,\n.block-modal__action-bar {\n .confirmation-modal__secondary-button {\n flex-shrink: 1;\n }\n}\n\n.confirmation-modal__secondary-button,\n.confirmation-modal__cancel-button,\n.mute-modal__cancel-button,\n.block-modal__cancel-button {\n background-color: transparent;\n color: $lighter-text-color;\n font-size: 14px;\n font-weight: 500;\n\n &:hover,\n &:focus,\n &:active {\n color: darken($lighter-text-color, 4%);\n background-color: transparent;\n }\n}\n\n.confirmation-modal__container,\n.mute-modal__container,\n.block-modal__container,\n.report-modal__target {\n padding: 30px;\n font-size: 16px;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n}\n\n.confirmation-modal__container,\n.report-modal__target {\n text-align: center;\n}\n\n.block-modal,\n.mute-modal {\n &__explanation {\n margin-top: 20px;\n }\n\n .setting-toggle {\n margin-top: 20px;\n margin-bottom: 24px;\n display: flex;\n align-items: center;\n\n &__label {\n color: $inverted-text-color;\n margin: 0;\n margin-left: 8px;\n }\n }\n}\n\n.report-modal__target {\n padding: 15px;\n\n .media-modal__close {\n top: 14px;\n right: 15px;\n }\n}\n\n.loading-bar {\n background-color: $highlight-text-color;\n height: 3px;\n position: absolute;\n top: 0;\n left: 0;\n z-index: 9999;\n}\n\n.media-gallery__gifv__label {\n display: block;\n position: absolute;\n color: $primary-text-color;\n background: rgba($base-overlay-background, 0.5);\n bottom: 6px;\n left: 6px;\n padding: 2px 6px;\n border-radius: 2px;\n font-size: 11px;\n font-weight: 600;\n z-index: 1;\n pointer-events: none;\n opacity: 0.9;\n transition: opacity 0.1s ease;\n line-height: 18px;\n}\n\n.media-gallery__gifv {\n &:hover {\n .media-gallery__gifv__label {\n opacity: 1;\n }\n }\n}\n\n.media-gallery__audio {\n margin-top: 32px;\n\n audio {\n width: 100%;\n }\n}\n\n.attachment-list {\n display: flex;\n font-size: 14px;\n border: 1px solid lighten($ui-base-color, 8%);\n border-radius: 4px;\n margin-top: 14px;\n overflow: hidden;\n\n &__icon {\n flex: 0 0 auto;\n color: $dark-text-color;\n padding: 8px 18px;\n cursor: default;\n border-right: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n font-size: 26px;\n\n .fa {\n display: block;\n }\n }\n\n &__list {\n list-style: none;\n padding: 4px 0;\n padding-left: 8px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n\n li {\n display: block;\n padding: 4px 0;\n }\n\n a {\n text-decoration: none;\n color: $dark-text-color;\n font-weight: 500;\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n &.compact {\n border: 0;\n margin-top: 4px;\n\n .attachment-list__list {\n padding: 0;\n display: block;\n }\n\n .fa {\n color: $dark-text-color;\n }\n }\n}\n\n/* Media Gallery */\n.media-gallery {\n box-sizing: border-box;\n margin-top: 8px;\n overflow: hidden;\n border-radius: 4px;\n position: relative;\n width: 100%;\n}\n\n.media-gallery__item {\n border: 0;\n box-sizing: border-box;\n display: block;\n float: left;\n position: relative;\n border-radius: 4px;\n overflow: hidden;\n\n &.standalone {\n .media-gallery__item-gifv-thumbnail {\n transform: none;\n top: 0;\n }\n }\n}\n\n.media-gallery__item-thumbnail {\n cursor: zoom-in;\n display: block;\n text-decoration: none;\n color: $secondary-text-color;\n position: relative;\n z-index: 1;\n\n &,\n img {\n height: 100%;\n width: 100%;\n }\n\n img {\n object-fit: cover;\n }\n}\n\n.media-gallery__preview {\n width: 100%;\n height: 100%;\n object-fit: cover;\n position: absolute;\n top: 0;\n left: 0;\n z-index: 0;\n background: $base-overlay-background;\n\n &--hidden {\n display: none;\n }\n}\n\n.media-gallery__gifv {\n height: 100%;\n overflow: hidden;\n position: relative;\n width: 100%;\n}\n\n.media-gallery__item-gifv-thumbnail {\n cursor: zoom-in;\n height: 100%;\n object-fit: cover;\n position: relative;\n top: 50%;\n transform: translateY(-50%);\n width: 100%;\n z-index: 1;\n}\n\n.media-gallery__item-thumbnail-label {\n clip: rect(1px 1px 1px 1px); /* IE6, IE7 */\n clip: rect(1px, 1px, 1px, 1px);\n overflow: hidden;\n position: absolute;\n}\n/* End Media Gallery */\n\n.detailed,\n.fullscreen {\n .video-player__volume__current,\n .video-player__volume::before {\n bottom: 27px;\n }\n\n .video-player__volume__handle {\n bottom: 23px;\n }\n\n}\n\n.audio-player {\n box-sizing: border-box;\n position: relative;\n background: darken($ui-base-color, 8%);\n border-radius: 4px;\n padding-bottom: 44px;\n direction: ltr;\n\n &.editable {\n border-radius: 0;\n height: 100%;\n }\n\n &__waveform {\n padding: 15px 0;\n position: relative;\n overflow: hidden;\n\n &::before {\n content: \"\";\n display: block;\n position: absolute;\n border-top: 1px solid lighten($ui-base-color, 4%);\n width: 100%;\n height: 0;\n left: 0;\n top: calc(50% + 1px);\n }\n }\n\n &__progress-placeholder {\n background-color: rgba(lighten($ui-highlight-color, 8%), 0.5);\n }\n\n &__wave-placeholder {\n background-color: lighten($ui-base-color, 16%);\n }\n\n .video-player__controls {\n padding: 0 15px;\n padding-top: 10px;\n background: darken($ui-base-color, 8%);\n border-top: 1px solid lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n }\n}\n\n.video-player {\n overflow: hidden;\n position: relative;\n background: $base-shadow-color;\n max-width: 100%;\n border-radius: 4px;\n box-sizing: border-box;\n direction: ltr;\n\n &.editable {\n border-radius: 0;\n height: 100% !important;\n }\n\n &:focus {\n outline: 0;\n }\n\n video {\n max-width: 100vw;\n max-height: 80vh;\n z-index: 1;\n }\n\n &.fullscreen {\n width: 100% !important;\n height: 100% !important;\n margin: 0;\n\n video {\n max-width: 100% !important;\n max-height: 100% !important;\n width: 100% !important;\n height: 100% !important;\n outline: 0;\n }\n }\n\n &.inline {\n video {\n object-fit: contain;\n position: relative;\n top: 50%;\n transform: translateY(-50%);\n }\n }\n\n &__controls {\n position: absolute;\n z-index: 2;\n bottom: 0;\n left: 0;\n right: 0;\n box-sizing: border-box;\n background: linear-gradient(0deg, rgba($base-shadow-color, 0.85) 0, rgba($base-shadow-color, 0.45) 60%, transparent);\n padding: 0 15px;\n opacity: 0;\n transition: opacity .1s ease;\n\n &.active {\n opacity: 1;\n }\n }\n\n &.inactive {\n video,\n .video-player__controls {\n visibility: hidden;\n }\n }\n\n &__spoiler {\n display: none;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 4;\n border: 0;\n background: $base-overlay-background;\n color: $darker-text-color;\n transition: none;\n pointer-events: none;\n\n &.active {\n display: block;\n pointer-events: auto;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($darker-text-color, 7%);\n }\n }\n\n &__title {\n display: block;\n font-size: 14px;\n }\n\n &__subtitle {\n display: block;\n font-size: 11px;\n font-weight: 500;\n }\n }\n\n &__buttons-bar {\n display: flex;\n justify-content: space-between;\n padding-bottom: 10px;\n\n .video-player__download__icon {\n color: inherit;\n }\n }\n\n &__buttons {\n font-size: 16px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &.left {\n button {\n padding-left: 0;\n }\n }\n\n &.right {\n button {\n padding-right: 0;\n }\n }\n\n button {\n background: transparent;\n padding: 2px 10px;\n font-size: 16px;\n border: 0;\n color: rgba($white, 0.75);\n\n &:active,\n &:hover,\n &:focus {\n color: $white;\n }\n }\n }\n\n &__time-sep,\n &__time-total,\n &__time-current {\n font-size: 14px;\n font-weight: 500;\n }\n\n &__time-current {\n color: $white;\n margin-left: 60px;\n }\n\n &__time-sep {\n display: inline-block;\n margin: 0 6px;\n }\n\n &__time-sep,\n &__time-total {\n color: $white;\n }\n\n &__volume {\n cursor: pointer;\n height: 24px;\n display: inline;\n\n &::before {\n content: \"\";\n width: 50px;\n background: rgba($white, 0.35);\n border-radius: 4px;\n display: block;\n position: absolute;\n height: 4px;\n left: 70px;\n bottom: 20px;\n }\n\n &__current {\n display: block;\n position: absolute;\n height: 4px;\n border-radius: 4px;\n left: 70px;\n bottom: 20px;\n background: lighten($ui-highlight-color, 8%);\n }\n\n &__handle {\n position: absolute;\n z-index: 3;\n border-radius: 50%;\n width: 12px;\n height: 12px;\n bottom: 16px;\n left: 70px;\n transition: opacity .1s ease;\n background: lighten($ui-highlight-color, 8%);\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n pointer-events: none;\n }\n }\n\n &__link {\n padding: 2px 10px;\n\n a {\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n color: $white;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n }\n\n &__seek {\n cursor: pointer;\n height: 24px;\n position: relative;\n\n &::before {\n content: \"\";\n width: 100%;\n background: rgba($white, 0.35);\n border-radius: 4px;\n display: block;\n position: absolute;\n height: 4px;\n top: 10px;\n }\n\n &__progress,\n &__buffer {\n display: block;\n position: absolute;\n height: 4px;\n border-radius: 4px;\n top: 10px;\n background: lighten($ui-highlight-color, 8%);\n }\n\n &__buffer {\n background: rgba($white, 0.2);\n }\n\n &__handle {\n position: absolute;\n z-index: 3;\n opacity: 0;\n border-radius: 50%;\n width: 12px;\n height: 12px;\n top: 6px;\n margin-left: -6px;\n transition: opacity .1s ease;\n background: lighten($ui-highlight-color, 8%);\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n pointer-events: none;\n\n &.active {\n opacity: 1;\n }\n }\n\n &:hover {\n .video-player__seek__handle {\n opacity: 1;\n }\n }\n }\n\n &.detailed,\n &.fullscreen {\n .video-player__buttons {\n button {\n padding-top: 10px;\n padding-bottom: 10px;\n }\n }\n }\n}\n\n.directory {\n &__list {\n width: 100%;\n margin: 10px 0;\n transition: opacity 100ms ease-in;\n\n &.loading {\n opacity: 0.7;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin: 0;\n }\n }\n\n &__card {\n box-sizing: border-box;\n margin-bottom: 10px;\n\n &__img {\n height: 125px;\n position: relative;\n background: darken($ui-base-color, 12%);\n overflow: hidden;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n object-fit: cover;\n }\n }\n\n &__bar {\n display: flex;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n padding: 10px;\n\n &__name {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n text-decoration: none;\n overflow: hidden;\n }\n\n &__relationship {\n width: 23px;\n min-height: 1px;\n flex: 0 0 auto;\n }\n\n .avatar {\n flex: 0 0 auto;\n width: 48px;\n height: 48px;\n padding-top: 2px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n background: darken($ui-base-color, 8%);\n object-fit: cover;\n }\n }\n\n .display-name {\n margin-left: 15px;\n text-align: left;\n\n strong {\n font-size: 15px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n span {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n &__extra {\n background: $ui-base-color;\n display: flex;\n align-items: center;\n justify-content: center;\n\n .accounts-table__count {\n width: 33.33%;\n flex: 0 0 auto;\n padding: 15px 0;\n }\n\n .account__header__content {\n box-sizing: border-box;\n padding: 15px 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n width: 100%;\n min-height: 18px + 30px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n p {\n display: none;\n\n &:first-child {\n display: inline;\n }\n }\n\n br {\n display: none;\n }\n }\n }\n }\n}\n\n.account-gallery__container {\n display: flex;\n flex-wrap: wrap;\n padding: 4px 2px;\n}\n\n.account-gallery__item {\n border: 0;\n box-sizing: border-box;\n display: block;\n position: relative;\n border-radius: 4px;\n overflow: hidden;\n margin: 2px;\n\n &__icons {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 24px;\n }\n}\n\n.notification__filter-bar,\n.account__section-headline {\n background: darken($ui-base-color, 4%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n display: flex;\n flex-shrink: 0;\n\n button {\n background: darken($ui-base-color, 4%);\n border: 0;\n margin: 0;\n }\n\n button,\n a {\n display: block;\n flex: 1 1 auto;\n color: $darker-text-color;\n padding: 15px 0;\n font-size: 14px;\n font-weight: 500;\n text-align: center;\n text-decoration: none;\n position: relative;\n width: 100%;\n white-space: nowrap;\n\n &.active {\n color: $secondary-text-color;\n\n &::before,\n &::after {\n display: block;\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 50%;\n width: 0;\n height: 0;\n transform: translateX(-50%);\n border-style: solid;\n border-width: 0 10px 10px;\n border-color: transparent transparent lighten($ui-base-color, 8%);\n }\n\n &::after {\n bottom: -1px;\n border-color: transparent transparent $ui-base-color;\n }\n }\n }\n\n &.directory__section-headline {\n background: darken($ui-base-color, 2%);\n border-bottom-color: transparent;\n\n a,\n button {\n &.active {\n &::before {\n display: none;\n }\n\n &::after {\n border-color: transparent transparent darken($ui-base-color, 7%);\n }\n }\n }\n }\n}\n\n.filter-form {\n background: $ui-base-color;\n\n &__column {\n padding: 10px 15px;\n }\n\n .radio-button {\n display: block;\n }\n}\n\n.radio-button {\n font-size: 14px;\n position: relative;\n display: inline-block;\n padding: 6px 0;\n line-height: 18px;\n cursor: default;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n cursor: pointer;\n\n input[type=radio],\n input[type=checkbox] {\n display: none;\n }\n\n &__input {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 50%;\n vertical-align: middle;\n\n &.checked {\n border-color: lighten($ui-highlight-color, 8%);\n background: lighten($ui-highlight-color, 8%);\n }\n }\n}\n\n::-webkit-scrollbar-thumb {\n border-radius: 0;\n}\n\n.search-popout {\n @include search-popout;\n}\n\nnoscript {\n text-align: center;\n\n img {\n width: 200px;\n opacity: 0.5;\n animation: flicker 4s infinite;\n }\n\n div {\n font-size: 14px;\n margin: 30px auto;\n color: $secondary-text-color;\n max-width: 400px;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n }\n}\n\n@keyframes flicker {\n 0% { opacity: 1; }\n 30% { opacity: 0.75; }\n 100% { opacity: 1; }\n}\n\n@media screen and (max-width: 630px) and (max-height: 400px) {\n $duration: 400ms;\n $delay: 100ms;\n\n .tabs-bar,\n .search {\n will-change: margin-top;\n transition: margin-top $duration $delay;\n }\n\n .navigation-bar {\n will-change: padding-bottom;\n transition: padding-bottom $duration $delay;\n }\n\n .navigation-bar {\n & > a:first-child {\n will-change: margin-top, margin-left, margin-right, width;\n transition: margin-top $duration $delay, margin-left $duration ($duration + $delay), margin-right $duration ($duration + $delay);\n }\n\n & > .navigation-bar__profile-edit {\n will-change: margin-top;\n transition: margin-top $duration $delay;\n }\n\n .navigation-bar__actions {\n & > .icon-button.close {\n will-change: opacity transform;\n transition: opacity $duration * 0.5 $delay,\n transform $duration $delay;\n }\n\n & > .compose__action-bar .icon-button {\n will-change: opacity transform;\n transition: opacity $duration * 0.5 $delay + $duration * 0.5,\n transform $duration $delay;\n }\n }\n }\n\n .is-composing {\n .tabs-bar,\n .search {\n margin-top: -50px;\n }\n\n .navigation-bar {\n padding-bottom: 0;\n\n & > a:first-child {\n margin: -100px 10px 0 -50px;\n }\n\n .navigation-bar__profile {\n padding-top: 2px;\n }\n\n .navigation-bar__profile-edit {\n position: absolute;\n margin-top: -60px;\n }\n\n .navigation-bar__actions {\n .icon-button.close {\n pointer-events: auto;\n opacity: 1;\n transform: scale(1, 1) translate(0, 0);\n bottom: 5px;\n }\n\n .compose__action-bar .icon-button {\n pointer-events: none;\n opacity: 0;\n transform: scale(0, 1) translate(100%, 0);\n }\n }\n }\n }\n}\n\n.embed-modal {\n width: auto;\n max-width: 80vw;\n max-height: 80vh;\n\n h4 {\n padding: 30px;\n font-weight: 500;\n font-size: 16px;\n text-align: center;\n }\n\n .embed-modal__container {\n padding: 10px;\n\n .hint {\n margin-bottom: 15px;\n }\n\n .embed-modal__html {\n outline: 0;\n box-sizing: border-box;\n display: block;\n width: 100%;\n border: 0;\n padding: 10px;\n font-family: $font-monospace, monospace;\n background: $ui-base-color;\n color: $primary-text-color;\n font-size: 14px;\n margin: 0;\n margin-bottom: 15px;\n border-radius: 4px;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n .embed-modal__iframe {\n width: 400px;\n max-width: 100%;\n overflow: hidden;\n border: 0;\n border-radius: 4px;\n }\n }\n}\n\n.account__moved-note {\n padding: 14px 10px;\n padding-bottom: 16px;\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &__message {\n position: relative;\n margin-left: 58px;\n color: $dark-text-color;\n padding: 8px 0;\n padding-top: 0;\n padding-bottom: 4px;\n font-size: 14px;\n\n > span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n &__icon-wrapper {\n left: -26px;\n position: absolute;\n }\n\n .detailed-status__display-avatar {\n position: relative;\n }\n\n .detailed-status__display-name {\n margin-bottom: 0;\n }\n}\n\n.column-inline-form {\n padding: 15px;\n padding-right: 0;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n\n label {\n flex: 1 1 auto;\n\n input {\n width: 100%;\n\n &:focus {\n outline: 0;\n }\n }\n }\n\n .icon-button {\n flex: 0 0 auto;\n margin: 0 10px;\n }\n}\n\n.drawer__backdrop {\n cursor: pointer;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba($base-overlay-background, 0.5);\n}\n\n.list-editor {\n background: $ui-base-color;\n flex-direction: column;\n border-radius: 8px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n width: 380px;\n overflow: hidden;\n\n @media screen and (max-width: 420px) {\n width: 90%;\n }\n\n h4 {\n padding: 15px 0;\n background: lighten($ui-base-color, 13%);\n font-weight: 500;\n font-size: 16px;\n text-align: center;\n border-radius: 8px 8px 0 0;\n }\n\n .drawer__pager {\n height: 50vh;\n }\n\n .drawer__inner {\n border-radius: 0 0 8px 8px;\n\n &.backdrop {\n width: calc(100% - 60px);\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n border-radius: 0 0 0 8px;\n }\n }\n\n &__accounts {\n overflow-y: auto;\n }\n\n .account__display-name {\n &:hover strong {\n text-decoration: none;\n }\n }\n\n .account__avatar {\n cursor: default;\n }\n\n .search {\n margin-bottom: 0;\n }\n}\n\n.list-adder {\n background: $ui-base-color;\n flex-direction: column;\n border-radius: 8px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n width: 380px;\n overflow: hidden;\n\n @media screen and (max-width: 420px) {\n width: 90%;\n }\n\n &__account {\n background: lighten($ui-base-color, 13%);\n }\n\n &__lists {\n background: lighten($ui-base-color, 13%);\n height: 50vh;\n border-radius: 0 0 8px 8px;\n overflow-y: auto;\n }\n\n .list {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n .list__wrapper {\n display: flex;\n }\n\n .list__display-name {\n flex: 1 1 auto;\n overflow: hidden;\n text-decoration: none;\n font-size: 16px;\n padding: 10px;\n }\n}\n\n.focal-point {\n position: relative;\n cursor: move;\n overflow: hidden;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n background: $base-shadow-color;\n\n img,\n video,\n canvas {\n display: block;\n max-height: 80vh;\n width: 100%;\n height: auto;\n margin: 0;\n object-fit: contain;\n background: $base-shadow-color;\n }\n\n &__reticle {\n position: absolute;\n width: 100px;\n height: 100px;\n transform: translate(-50%, -50%);\n background: url('~images/reticle.png') no-repeat 0 0;\n border-radius: 50%;\n box-shadow: 0 0 0 9999em rgba($base-shadow-color, 0.35);\n }\n\n &__overlay {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n }\n\n &__preview {\n position: absolute;\n bottom: 10px;\n right: 10px;\n z-index: 2;\n cursor: move;\n transition: opacity 0.1s ease;\n\n &:hover {\n opacity: 0.5;\n }\n\n strong {\n color: $primary-text-color;\n font-size: 14px;\n font-weight: 500;\n display: block;\n margin-bottom: 5px;\n }\n\n div {\n border-radius: 4px;\n box-shadow: 0 0 14px rgba($base-shadow-color, 0.2);\n }\n }\n\n @media screen and (max-width: 480px) {\n img,\n video {\n max-height: 100%;\n }\n\n &__preview {\n display: none;\n }\n }\n}\n\n.account__header__content {\n color: $darker-text-color;\n font-size: 14px;\n font-weight: 400;\n overflow: hidden;\n word-break: normal;\n word-wrap: break-word;\n\n p {\n margin-bottom: 20px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: inherit;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n}\n\n.account__header {\n overflow: hidden;\n\n &.inactive {\n opacity: 0.5;\n\n .account__header__image,\n .account__avatar {\n filter: grayscale(100%);\n }\n }\n\n &__info {\n position: absolute;\n top: 10px;\n left: 10px;\n }\n\n &__image {\n overflow: hidden;\n height: 145px;\n position: relative;\n background: darken($ui-base-color, 4%);\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n }\n }\n\n &__bar {\n position: relative;\n background: lighten($ui-base-color, 4%);\n padding: 5px;\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n\n .avatar {\n display: block;\n flex: 0 0 auto;\n width: 94px;\n margin-left: -2px;\n\n .account__avatar {\n background: darken($ui-base-color, 8%);\n border: 2px solid lighten($ui-base-color, 4%);\n }\n }\n }\n\n &__tabs {\n display: flex;\n align-items: flex-start;\n padding: 7px 5px;\n margin-top: -55px;\n\n &__buttons {\n display: flex;\n align-items: center;\n padding-top: 55px;\n overflow: hidden;\n\n .icon-button {\n border: 1px solid lighten($ui-base-color, 12%);\n border-radius: 4px;\n box-sizing: content-box;\n padding: 2px;\n }\n\n .button {\n margin: 0 8px;\n }\n }\n\n &__name {\n padding: 5px;\n\n .account-role {\n vertical-align: top;\n }\n\n .emojione {\n width: 22px;\n height: 22px;\n }\n\n h1 {\n font-size: 16px;\n line-height: 24px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n\n small {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n .spacer {\n flex: 1 1 auto;\n }\n }\n\n &__bio {\n overflow: hidden;\n margin: 0 -5px;\n\n .account__header__content {\n padding: 20px 15px;\n padding-bottom: 5px;\n color: $primary-text-color;\n }\n\n .account__header__fields {\n margin: 0;\n border-top: 1px solid lighten($ui-base-color, 12%);\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n }\n\n &__extra {\n margin-top: 4px;\n\n &__links {\n font-size: 14px;\n color: $darker-text-color;\n padding: 10px 0;\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n padding: 5px 10px;\n font-weight: 500;\n\n strong {\n font-weight: 700;\n color: $primary-text-color;\n }\n }\n }\n }\n}\n\n.trends {\n &__header {\n color: $dark-text-color;\n background: lighten($ui-base-color, 2%);\n border-bottom: 1px solid darken($ui-base-color, 4%);\n font-weight: 500;\n padding: 15px;\n font-size: 16px;\n cursor: default;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n &__item {\n display: flex;\n align-items: center;\n padding: 15px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &:last-child {\n border-bottom: 0;\n }\n\n &__name {\n flex: 1 1 auto;\n color: $dark-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n strong {\n font-weight: 500;\n }\n\n a {\n color: $darker-text-color;\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:hover,\n &:focus,\n &:active {\n span {\n text-decoration: underline;\n }\n }\n }\n }\n\n &__current {\n flex: 0 0 auto;\n font-size: 24px;\n line-height: 36px;\n font-weight: 500;\n text-align: right;\n padding-right: 15px;\n margin-left: 5px;\n color: $secondary-text-color;\n }\n\n &__sparkline {\n flex: 0 0 auto;\n width: 50px;\n\n path:first-child {\n fill: rgba($highlight-text-color, 0.25) !important;\n fill-opacity: 1 !important;\n }\n\n path:last-child {\n stroke: lighten($highlight-text-color, 6%) !important;\n }\n }\n }\n}\n\n.conversation {\n display: flex;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n padding: 5px;\n padding-bottom: 0;\n\n &:focus {\n background: lighten($ui-base-color, 2%);\n outline: 0;\n }\n\n &__avatar {\n flex: 0 0 auto;\n padding: 10px;\n padding-top: 12px;\n position: relative;\n cursor: pointer;\n }\n\n &__unread {\n display: inline-block;\n background: $highlight-text-color;\n border-radius: 50%;\n width: 0.625rem;\n height: 0.625rem;\n margin: -.1ex .15em .1ex;\n }\n\n &__content {\n flex: 1 1 auto;\n padding: 10px 5px;\n padding-right: 15px;\n overflow: hidden;\n\n &__info {\n overflow: hidden;\n display: flex;\n flex-direction: row-reverse;\n justify-content: space-between;\n }\n\n &__relative-time {\n font-size: 15px;\n color: $darker-text-color;\n padding-left: 15px;\n }\n\n &__names {\n color: $darker-text-color;\n font-size: 15px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-bottom: 4px;\n flex-basis: 90px;\n flex-grow: 1;\n\n a {\n color: $primary-text-color;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n }\n\n a {\n word-break: break-word;\n }\n }\n\n &--unread {\n background: lighten($ui-base-color, 2%);\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n .conversation__content__info {\n font-weight: 700;\n }\n\n .conversation__content__relative-time {\n color: $primary-text-color;\n }\n }\n}\n\n.announcements {\n background: lighten($ui-base-color, 8%);\n font-size: 13px;\n display: flex;\n align-items: flex-end;\n\n &__mastodon {\n width: 124px;\n flex: 0 0 auto;\n\n @media screen and (max-width: 124px + 300px) {\n display: none;\n }\n }\n\n &__container {\n width: calc(100% - 124px);\n flex: 0 0 auto;\n position: relative;\n\n @media screen and (max-width: 124px + 300px) {\n width: 100%;\n }\n }\n\n &__item {\n box-sizing: border-box;\n width: 100%;\n padding: 15px;\n position: relative;\n font-size: 15px;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n max-height: 50vh;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n\n &__range {\n display: block;\n font-weight: 500;\n margin-bottom: 10px;\n padding-right: 18px;\n }\n\n &__unread {\n position: absolute;\n top: 19px;\n right: 19px;\n display: block;\n background: $highlight-text-color;\n border-radius: 50%;\n width: 0.625rem;\n height: 0.625rem;\n }\n }\n\n &__pagination {\n padding: 15px;\n color: $darker-text-color;\n position: absolute;\n bottom: 3px;\n right: 0;\n }\n}\n\n.layout-multiple-columns .announcements__mastodon {\n display: none;\n}\n\n.layout-multiple-columns .announcements__container {\n width: 100%;\n}\n\n.reactions-bar {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n margin-top: 15px;\n margin-left: -2px;\n width: calc(100% - (90px - 33px));\n\n &__item {\n flex-shrink: 0;\n background: lighten($ui-base-color, 12%);\n border: 0;\n border-radius: 3px;\n margin: 2px;\n cursor: pointer;\n user-select: none;\n padding: 0 6px;\n display: flex;\n align-items: center;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &__emoji {\n display: block;\n margin: 3px 0;\n width: 16px;\n height: 16px;\n\n img {\n display: block;\n margin: 0;\n width: 100%;\n height: 100%;\n min-width: auto;\n min-height: auto;\n vertical-align: bottom;\n object-fit: contain;\n }\n }\n\n &__count {\n display: block;\n min-width: 9px;\n font-size: 13px;\n font-weight: 500;\n text-align: center;\n margin-left: 6px;\n color: $darker-text-color;\n }\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 16%);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n\n &__count {\n color: lighten($darker-text-color, 4%);\n }\n }\n\n &.active {\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n background-color: mix(lighten($ui-base-color, 12%), $ui-highlight-color, 80%);\n\n .reactions-bar__item__count {\n color: lighten($highlight-text-color, 8%);\n }\n }\n }\n\n .emoji-picker-dropdown {\n margin: 2px;\n }\n\n &:hover .emoji-button {\n opacity: 0.85;\n }\n\n .emoji-button {\n color: $darker-text-color;\n margin: 0;\n font-size: 16px;\n width: auto;\n flex-shrink: 0;\n padding: 0 6px;\n height: 22px;\n display: flex;\n align-items: center;\n opacity: 0.5;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &:hover,\n &:active,\n &:focus {\n opacity: 1;\n color: lighten($darker-text-color, 4%);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n }\n }\n\n &--empty {\n .emoji-button {\n padding: 0;\n }\n }\n}\n",null,"@mixin avatar-radius {\n border-radius: 4px;\n background: transparent no-repeat;\n background-position: 50%;\n background-clip: padding-box;\n}\n\n@mixin avatar-size($size: 48px) {\n width: $size;\n height: $size;\n background-size: $size $size;\n}\n\n@mixin search-input {\n outline: 0;\n box-sizing: border-box;\n width: 100%;\n border: 0;\n box-shadow: none;\n font-family: inherit;\n background: $ui-base-color;\n color: $darker-text-color;\n font-size: 14px;\n margin: 0;\n}\n\n@mixin search-popout {\n background: $simple-background-color;\n border-radius: 4px;\n padding: 10px 14px;\n padding-bottom: 14px;\n margin-top: 10px;\n color: $light-text-color;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n\n h4 {\n text-transform: uppercase;\n color: $light-text-color;\n font-size: 13px;\n font-weight: 500;\n margin-bottom: 10px;\n }\n\n li {\n padding: 4px 0;\n }\n\n ul {\n margin-bottom: 10px;\n }\n\n em {\n font-weight: 500;\n color: $inverted-text-color;\n }\n}\n",".poll {\n margin-top: 16px;\n font-size: 14px;\n\n li {\n margin-bottom: 10px;\n position: relative;\n }\n\n &__chart {\n border-radius: 4px;\n display: block;\n background: darken($ui-primary-color, 5%);\n height: 5px;\n min-width: 1%;\n\n &.leading {\n background: $ui-highlight-color;\n }\n }\n\n &__option {\n position: relative;\n display: flex;\n padding: 6px 0;\n line-height: 18px;\n cursor: default;\n overflow: hidden;\n\n &__text {\n display: inline-block;\n word-wrap: break-word;\n overflow-wrap: break-word;\n max-width: calc(100% - 45px - 25px);\n }\n\n input[type=radio],\n input[type=checkbox] {\n display: none;\n }\n\n .autossugest-input {\n flex: 1 1 auto;\n }\n\n input[type=text] {\n display: block;\n box-sizing: border-box;\n width: 100%;\n font-size: 14px;\n color: $inverted-text-color;\n outline: 0;\n font-family: inherit;\n background: $simple-background-color;\n border: 1px solid darken($simple-background-color, 14%);\n border-radius: 4px;\n padding: 6px 10px;\n\n &:focus {\n border-color: $highlight-text-color;\n }\n }\n\n &.selectable {\n cursor: pointer;\n }\n\n &.editable {\n display: flex;\n align-items: center;\n overflow: visible;\n }\n }\n\n &__input {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 50%;\n vertical-align: middle;\n margin-top: auto;\n margin-bottom: auto;\n flex: 0 0 18px;\n\n &.checkbox {\n border-radius: 4px;\n }\n\n &.active {\n border-color: $valid-value-color;\n background: $valid-value-color;\n }\n\n &:active,\n &:focus,\n &:hover {\n border-color: lighten($valid-value-color, 15%);\n border-width: 4px;\n }\n\n &::-moz-focus-inner {\n outline: 0 !important;\n border: 0;\n }\n\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n\n &__number {\n display: inline-block;\n width: 45px;\n font-weight: 700;\n flex: 0 0 45px;\n }\n\n &__voted {\n padding: 0 5px;\n display: inline-block;\n\n &__mark {\n font-size: 18px;\n }\n }\n\n &__footer {\n padding-top: 6px;\n padding-bottom: 5px;\n color: $dark-text-color;\n }\n\n &__link {\n display: inline;\n background: transparent;\n padding: 0;\n margin: 0;\n border: 0;\n color: $dark-text-color;\n text-decoration: underline;\n font-size: inherit;\n\n &:hover {\n text-decoration: none;\n }\n\n &:active,\n &:focus {\n background-color: rgba($dark-text-color, .1);\n }\n }\n\n .button {\n height: 36px;\n padding: 0 16px;\n margin-right: 10px;\n font-size: 14px;\n }\n}\n\n.compose-form__poll-wrapper {\n border-top: 1px solid darken($simple-background-color, 8%);\n\n ul {\n padding: 10px;\n }\n\n .poll__footer {\n border-top: 1px solid darken($simple-background-color, 8%);\n padding: 10px;\n display: flex;\n align-items: center;\n\n button,\n select {\n flex: 1 1 50%;\n\n &:focus {\n border-color: $highlight-text-color;\n }\n }\n }\n\n .button.button-secondary {\n font-size: 14px;\n font-weight: 400;\n padding: 6px 10px;\n height: auto;\n line-height: inherit;\n color: $action-button-color;\n border-color: $action-button-color;\n margin-right: 5px;\n }\n\n li {\n display: flex;\n align-items: center;\n\n .poll__option {\n flex: 0 0 auto;\n width: calc(100% - (23px + 6px));\n margin-right: 6px;\n }\n }\n\n select {\n appearance: none;\n box-sizing: border-box;\n font-size: 14px;\n color: $inverted-text-color;\n display: inline-block;\n width: auto;\n outline: 0;\n font-family: inherit;\n background: $simple-background-color url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center / auto 16px;\n border: 1px solid darken($simple-background-color, 14%);\n border-radius: 4px;\n padding: 6px 10px;\n padding-right: 30px;\n }\n\n .icon-button.disabled {\n color: darken($simple-background-color, 14%);\n }\n}\n\n.muted .poll {\n color: $dark-text-color;\n\n &__chart {\n background: rgba(darken($ui-primary-color, 14%), 0.2);\n\n &.leading {\n background: rgba($ui-highlight-color, 0.2);\n }\n }\n}\n",".modal-layout {\n background: $ui-base-color url('data:image/svg+xml;utf8,') repeat-x bottom fixed;\n display: flex;\n flex-direction: column;\n height: 100vh;\n padding: 0;\n}\n\n.modal-layout__mastodon {\n display: flex;\n flex: 1;\n flex-direction: column;\n justify-content: flex-end;\n\n > * {\n flex: 1;\n max-height: 235px;\n }\n}\n\n@media screen and (max-width: 600px) {\n .account-header {\n margin-top: 0;\n }\n}\n",".emoji-mart {\n font-size: 13px;\n display: inline-block;\n color: $inverted-text-color;\n\n &,\n * {\n box-sizing: border-box;\n line-height: 1.15;\n }\n\n .emoji-mart-emoji {\n padding: 6px;\n }\n}\n\n.emoji-mart-bar {\n border: 0 solid darken($ui-secondary-color, 8%);\n\n &:first-child {\n border-bottom-width: 1px;\n border-top-left-radius: 5px;\n border-top-right-radius: 5px;\n background: $ui-secondary-color;\n }\n\n &:last-child {\n border-top-width: 1px;\n border-bottom-left-radius: 5px;\n border-bottom-right-radius: 5px;\n display: none;\n }\n}\n\n.emoji-mart-anchors {\n display: flex;\n justify-content: space-between;\n padding: 0 6px;\n color: $lighter-text-color;\n line-height: 0;\n}\n\n.emoji-mart-anchor {\n position: relative;\n flex: 1;\n text-align: center;\n padding: 12px 4px;\n overflow: hidden;\n transition: color .1s ease-out;\n cursor: pointer;\n\n &:hover {\n color: darken($lighter-text-color, 4%);\n }\n}\n\n.emoji-mart-anchor-selected {\n color: $highlight-text-color;\n\n &:hover {\n color: darken($highlight-text-color, 4%);\n }\n\n .emoji-mart-anchor-bar {\n bottom: -1px;\n }\n}\n\n.emoji-mart-anchor-bar {\n position: absolute;\n bottom: -5px;\n left: 0;\n width: 100%;\n height: 4px;\n background-color: $highlight-text-color;\n}\n\n.emoji-mart-anchors {\n i {\n display: inline-block;\n width: 100%;\n max-width: 22px;\n }\n\n svg {\n fill: currentColor;\n max-height: 18px;\n }\n}\n\n.emoji-mart-scroll {\n overflow-y: scroll;\n height: 270px;\n max-height: 35vh;\n padding: 0 6px 6px;\n background: $simple-background-color;\n will-change: transform;\n\n &::-webkit-scrollbar-track:hover,\n &::-webkit-scrollbar-track:active {\n background-color: rgba($base-overlay-background, 0.3);\n }\n}\n\n.emoji-mart-search {\n padding: 10px;\n padding-right: 45px;\n background: $simple-background-color;\n\n input {\n font-size: 14px;\n font-weight: 400;\n padding: 7px 9px;\n font-family: inherit;\n display: block;\n width: 100%;\n background: rgba($ui-secondary-color, 0.3);\n color: $inverted-text-color;\n border: 1px solid $ui-secondary-color;\n border-radius: 4px;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n}\n\n.emoji-mart-category .emoji-mart-emoji {\n cursor: pointer;\n\n span {\n z-index: 1;\n position: relative;\n text-align: center;\n }\n\n &:hover::before {\n z-index: 0;\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba($ui-secondary-color, 0.7);\n border-radius: 100%;\n }\n}\n\n.emoji-mart-category-label {\n z-index: 2;\n position: relative;\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n\n span {\n display: block;\n width: 100%;\n font-weight: 500;\n padding: 5px 6px;\n background: $simple-background-color;\n }\n}\n\n.emoji-mart-emoji {\n position: relative;\n display: inline-block;\n font-size: 0;\n\n span {\n width: 22px;\n height: 22px;\n }\n}\n\n.emoji-mart-no-results {\n font-size: 14px;\n text-align: center;\n padding-top: 70px;\n color: $light-text-color;\n\n .emoji-mart-category-label {\n display: none;\n }\n\n .emoji-mart-no-results-label {\n margin-top: .2em;\n }\n\n .emoji-mart-emoji:hover::before {\n content: none;\n }\n}\n\n.emoji-mart-preview {\n display: none;\n}\n","$maximum-width: 1235px;\n$fluid-breakpoint: $maximum-width + 20px;\n$column-breakpoint: 700px;\n$small-breakpoint: 960px;\n\n.container {\n box-sizing: border-box;\n max-width: $maximum-width;\n margin: 0 auto;\n position: relative;\n\n @media screen and (max-width: $fluid-breakpoint) {\n width: 100%;\n padding: 0 10px;\n }\n}\n\n.rich-formatting {\n font-family: $font-sans-serif, sans-serif;\n font-size: 14px;\n font-weight: 400;\n line-height: 1.7;\n word-wrap: break-word;\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n p,\n li {\n color: $darker-text-color;\n }\n\n p {\n margin-top: 0;\n margin-bottom: .85em;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n strong {\n font-weight: 700;\n color: $secondary-text-color;\n }\n\n em {\n font-style: italic;\n color: $secondary-text-color;\n }\n\n code {\n font-size: 0.85em;\n background: darken($ui-base-color, 8%);\n border-radius: 4px;\n padding: 0.2em 0.3em;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n font-family: $font-display, sans-serif;\n margin-top: 1.275em;\n margin-bottom: .85em;\n font-weight: 500;\n color: $secondary-text-color;\n }\n\n h1 {\n font-size: 2em;\n }\n\n h2 {\n font-size: 1.75em;\n }\n\n h3 {\n font-size: 1.5em;\n }\n\n h4 {\n font-size: 1.25em;\n }\n\n h5,\n h6 {\n font-size: 1em;\n }\n\n ul {\n list-style: disc;\n }\n\n ol {\n list-style: decimal;\n }\n\n ul,\n ol {\n margin: 0;\n padding: 0;\n padding-left: 2em;\n margin-bottom: 0.85em;\n\n &[type='a'] {\n list-style-type: lower-alpha;\n }\n\n &[type='i'] {\n list-style-type: lower-roman;\n }\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n margin: 1.7em 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n\n table {\n width: 100%;\n border-collapse: collapse;\n break-inside: auto;\n margin-top: 24px;\n margin-bottom: 32px;\n\n thead tr,\n tbody tr {\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n font-size: 1em;\n line-height: 1.625;\n font-weight: 400;\n text-align: left;\n color: $darker-text-color;\n }\n\n thead tr {\n border-bottom-width: 2px;\n line-height: 1.5;\n font-weight: 500;\n color: $dark-text-color;\n }\n\n th,\n td {\n padding: 8px;\n align-self: start;\n align-items: start;\n word-break: break-all;\n\n &.nowrap {\n width: 25%;\n position: relative;\n\n &::before {\n content: ' ';\n visibility: hidden;\n }\n\n span {\n position: absolute;\n left: 8px;\n right: 8px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n }\n\n & > :first-child {\n margin-top: 0;\n }\n}\n\n.information-board {\n background: darken($ui-base-color, 4%);\n padding: 20px 0;\n\n .container-alt {\n position: relative;\n padding-right: 280px + 15px;\n }\n\n &__sections {\n display: flex;\n justify-content: space-between;\n flex-wrap: wrap;\n }\n\n &__section {\n flex: 1 0 0;\n font-family: $font-sans-serif, sans-serif;\n font-size: 16px;\n line-height: 28px;\n color: $primary-text-color;\n text-align: right;\n padding: 10px 15px;\n\n span,\n strong {\n display: block;\n }\n\n span {\n &:last-child {\n color: $secondary-text-color;\n }\n }\n\n strong {\n font-family: $font-display, sans-serif;\n font-weight: 500;\n font-size: 32px;\n line-height: 48px;\n }\n\n @media screen and (max-width: $column-breakpoint) {\n text-align: center;\n }\n }\n\n .panel {\n position: absolute;\n width: 280px;\n box-sizing: border-box;\n background: darken($ui-base-color, 8%);\n padding: 20px;\n padding-top: 10px;\n border-radius: 4px 4px 0 0;\n right: 0;\n bottom: -40px;\n\n .panel-header {\n font-family: $font-display, sans-serif;\n font-size: 14px;\n line-height: 24px;\n font-weight: 500;\n color: $darker-text-color;\n padding-bottom: 5px;\n margin-bottom: 15px;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n\n a,\n span {\n font-weight: 400;\n color: darken($darker-text-color, 10%);\n }\n\n a {\n text-decoration: none;\n }\n }\n }\n\n .owner {\n text-align: center;\n\n .avatar {\n width: 80px;\n height: 80px;\n margin: 0 auto;\n margin-bottom: 15px;\n\n img {\n display: block;\n width: 80px;\n height: 80px;\n border-radius: 48px;\n }\n }\n\n .name {\n font-size: 14px;\n\n a {\n display: block;\n color: $primary-text-color;\n text-decoration: none;\n\n &:hover {\n .display_name {\n text-decoration: underline;\n }\n }\n }\n\n .username {\n display: block;\n color: $darker-text-color;\n }\n }\n }\n}\n\n.landing-page {\n p,\n li {\n font-family: $font-sans-serif, sans-serif;\n font-size: 16px;\n font-weight: 400;\n font-size: 16px;\n line-height: 30px;\n margin-bottom: 12px;\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n }\n }\n\n em {\n display: inline;\n margin: 0;\n padding: 0;\n font-weight: 700;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n color: lighten($darker-text-color, 10%);\n }\n\n h1 {\n font-family: $font-display, sans-serif;\n font-size: 26px;\n line-height: 30px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n\n small {\n font-family: $font-sans-serif, sans-serif;\n display: block;\n font-size: 18px;\n font-weight: 400;\n color: lighten($darker-text-color, 10%);\n }\n }\n\n h2 {\n font-family: $font-display, sans-serif;\n font-size: 22px;\n line-height: 26px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h3 {\n font-family: $font-display, sans-serif;\n font-size: 18px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h4 {\n font-family: $font-display, sans-serif;\n font-size: 16px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h5 {\n font-family: $font-display, sans-serif;\n font-size: 14px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h6 {\n font-family: $font-display, sans-serif;\n font-size: 12px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n ul,\n ol {\n margin-left: 20px;\n\n &[type='a'] {\n list-style-type: lower-alpha;\n }\n\n &[type='i'] {\n list-style-type: lower-roman;\n }\n }\n\n ul {\n list-style: disc;\n }\n\n ol {\n list-style: decimal;\n }\n\n li > ol,\n li > ul {\n margin-top: 6px;\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid rgba($ui-base-lighter-color, .6);\n margin: 20px 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n\n &__information,\n &__forms {\n padding: 20px;\n }\n\n &__call-to-action {\n background: $ui-base-color;\n border-radius: 4px;\n padding: 25px 40px;\n overflow: hidden;\n box-sizing: border-box;\n\n .row {\n width: 100%;\n display: flex;\n flex-direction: row-reverse;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n }\n\n .row__information-board {\n display: flex;\n justify-content: flex-end;\n align-items: flex-end;\n\n .information-board__section {\n flex: 1 0 auto;\n padding: 0 10px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n width: 100%;\n justify-content: space-between;\n }\n }\n\n .row__mascot {\n flex: 1;\n margin: 10px -50px 0 0;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n }\n\n &__logo {\n margin-right: 20px;\n\n img {\n height: 50px;\n width: auto;\n mix-blend-mode: lighten;\n }\n }\n\n &__information {\n padding: 45px 40px;\n margin-bottom: 10px;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n strong {\n font-weight: 500;\n color: lighten($darker-text-color, 10%);\n }\n\n .account {\n border-bottom: 0;\n padding: 0;\n\n &__display-name {\n align-items: center;\n display: flex;\n margin-right: 5px;\n }\n\n div.account__display-name {\n &:hover {\n .display-name strong {\n text-decoration: none;\n }\n }\n\n .account__avatar {\n cursor: default;\n }\n }\n\n &__avatar-wrapper {\n margin-left: 0;\n flex: 0 0 auto;\n }\n\n &__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n\n .display-name {\n font-size: 15px;\n\n &__account {\n font-size: 14px;\n }\n }\n }\n\n @media screen and (max-width: $small-breakpoint) {\n .contact {\n margin-top: 30px;\n }\n }\n\n @media screen and (max-width: $column-breakpoint) {\n padding: 25px 20px;\n }\n }\n\n &__information,\n &__forms,\n #mastodon-timeline {\n box-sizing: border-box;\n background: $ui-base-color;\n border-radius: 4px;\n box-shadow: 0 0 6px rgba($black, 0.1);\n }\n\n &__mascot {\n height: 104px;\n position: relative;\n left: -40px;\n bottom: 25px;\n\n img {\n height: 190px;\n width: auto;\n }\n }\n\n &__short-description {\n .row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n margin-bottom: 40px;\n }\n\n @media screen and (max-width: $column-breakpoint) {\n .row {\n margin-bottom: 20px;\n }\n }\n\n p a {\n color: $secondary-text-color;\n }\n\n h1 {\n font-weight: 500;\n color: $primary-text-color;\n margin-bottom: 0;\n\n small {\n color: $darker-text-color;\n\n span {\n color: $secondary-text-color;\n }\n }\n }\n\n p:last-child {\n margin-bottom: 0;\n }\n }\n\n &__hero {\n margin-bottom: 10px;\n\n img {\n display: block;\n margin: 0;\n max-width: 100%;\n height: auto;\n border-radius: 4px;\n }\n }\n\n @media screen and (max-width: 840px) {\n .information-board {\n .container-alt {\n padding-right: 20px;\n }\n\n .panel {\n position: static;\n margin-top: 20px;\n width: 100%;\n border-radius: 4px;\n\n .panel-header {\n text-align: center;\n }\n }\n }\n }\n\n @media screen and (max-width: 675px) {\n .header-wrapper {\n padding-top: 0;\n\n &.compact {\n padding-bottom: 0;\n }\n\n &.compact .hero .heading {\n text-align: initial;\n }\n }\n\n .header .container-alt,\n .features .container-alt {\n display: block;\n }\n }\n\n .cta {\n margin: 20px;\n }\n}\n\n.landing {\n margin-bottom: 100px;\n\n @media screen and (max-width: 738px) {\n margin-bottom: 0;\n }\n\n &__brand {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 50px;\n\n svg {\n fill: $primary-text-color;\n height: 52px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding: 0;\n margin-bottom: 30px;\n }\n }\n\n .directory {\n margin-top: 30px;\n background: transparent;\n box-shadow: none;\n border-radius: 0;\n }\n\n .hero-widget {\n margin-top: 30px;\n margin-bottom: 0;\n\n h4 {\n padding: 10px;\n text-transform: uppercase;\n font-weight: 700;\n font-size: 13px;\n color: $darker-text-color;\n }\n\n &__text {\n border-radius: 0;\n padding-bottom: 0;\n }\n\n &__footer {\n background: $ui-base-color;\n padding: 10px;\n border-radius: 0 0 4px 4px;\n display: flex;\n\n &__column {\n flex: 1 1 50%;\n }\n }\n\n .account {\n padding: 10px 0;\n border-bottom: 0;\n\n .account__display-name {\n display: flex;\n align-items: center;\n }\n\n .account__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n }\n\n &__counter {\n padding: 10px;\n\n strong {\n font-family: $font-display, sans-serif;\n font-size: 15px;\n font-weight: 700;\n display: block;\n }\n\n span {\n font-size: 14px;\n color: $darker-text-color;\n }\n }\n }\n\n .simple_form .user_agreement .label_input > label {\n font-weight: 400;\n color: $darker-text-color;\n }\n\n .simple_form p.lead {\n color: $darker-text-color;\n font-size: 15px;\n line-height: 20px;\n font-weight: 400;\n margin-bottom: 25px;\n }\n\n &__grid {\n max-width: 960px;\n margin: 0 auto;\n display: grid;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n grid-gap: 30px;\n\n @media screen and (max-width: 738px) {\n grid-template-columns: minmax(0, 100%);\n grid-gap: 10px;\n\n &__column-login {\n grid-row: 1;\n display: flex;\n flex-direction: column;\n\n .box-widget {\n order: 2;\n flex: 0 0 auto;\n }\n\n .hero-widget {\n margin-top: 0;\n margin-bottom: 10px;\n order: 1;\n flex: 0 0 auto;\n }\n }\n\n &__column-registration {\n grid-row: 2;\n }\n\n .directory {\n margin-top: 10px;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n\n .hero-widget {\n display: block;\n margin-bottom: 0;\n box-shadow: none;\n\n &__img,\n &__img img,\n &__footer {\n border-radius: 0;\n }\n }\n\n .hero-widget,\n .box-widget,\n .directory__tag {\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n .directory {\n margin-top: 0;\n\n &__tag {\n margin-bottom: 0;\n\n & > a,\n & > div {\n border-radius: 0;\n box-shadow: none;\n }\n\n &:last-child {\n border-bottom: 0;\n }\n }\n }\n }\n }\n}\n\n.brand {\n position: relative;\n text-decoration: none;\n}\n\n.brand__tagline {\n display: block;\n position: absolute;\n bottom: -10px;\n left: 50px;\n width: 300px;\n color: $ui-primary-color;\n text-decoration: none;\n font-size: 14px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n position: static;\n width: auto;\n margin-top: 20px;\n color: $dark-text-color;\n }\n}\n\n",".table {\n width: 100%;\n max-width: 100%;\n border-spacing: 0;\n border-collapse: collapse;\n\n th,\n td {\n padding: 8px;\n line-height: 18px;\n vertical-align: top;\n border-top: 1px solid $ui-base-color;\n text-align: left;\n background: darken($ui-base-color, 4%);\n }\n\n & > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid $ui-base-color;\n border-top: 0;\n font-weight: 500;\n }\n\n & > tbody > tr > th {\n font-weight: 500;\n }\n\n & > tbody > tr:nth-child(odd) > td,\n & > tbody > tr:nth-child(odd) > th {\n background: $ui-base-color;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n &.inline-table {\n & > tbody > tr:nth-child(odd) {\n & > td,\n & > th {\n background: transparent;\n }\n }\n\n & > tbody > tr:first-child {\n & > td,\n & > th {\n border-top: 0;\n }\n }\n }\n\n &.batch-table {\n & > thead > tr > th {\n background: $ui-base-color;\n border-top: 1px solid darken($ui-base-color, 8%);\n border-bottom: 1px solid darken($ui-base-color, 8%);\n\n &:first-child {\n border-radius: 4px 0 0;\n border-left: 1px solid darken($ui-base-color, 8%);\n }\n\n &:last-child {\n border-radius: 0 4px 0 0;\n border-right: 1px solid darken($ui-base-color, 8%);\n }\n }\n }\n\n &--invites tbody td {\n vertical-align: middle;\n }\n}\n\n.table-wrapper {\n overflow: auto;\n margin-bottom: 20px;\n}\n\nsamp {\n font-family: $font-monospace, monospace;\n}\n\nbutton.table-action-link {\n background: transparent;\n border: 0;\n font: inherit;\n}\n\nbutton.table-action-link,\na.table-action-link {\n text-decoration: none;\n display: inline-block;\n margin-right: 5px;\n padding: 0 10px;\n color: $darker-text-color;\n font-weight: 500;\n\n &:hover {\n color: $primary-text-color;\n }\n\n i.fa {\n font-weight: 400;\n margin-right: 5px;\n }\n\n &:first-child {\n padding-left: 0;\n }\n}\n\n.batch-table {\n &__toolbar,\n &__row {\n display: flex;\n\n &__select {\n box-sizing: border-box;\n padding: 8px 16px;\n cursor: pointer;\n min-height: 100%;\n\n input {\n margin-top: 8px;\n }\n\n &--aligned {\n display: flex;\n align-items: center;\n\n input {\n margin-top: 0;\n }\n }\n }\n\n &__actions,\n &__content {\n padding: 8px 0;\n padding-right: 16px;\n flex: 1 1 auto;\n }\n }\n\n &__toolbar {\n border: 1px solid darken($ui-base-color, 8%);\n background: $ui-base-color;\n border-radius: 4px 0 0;\n height: 47px;\n align-items: center;\n\n &__actions {\n text-align: right;\n padding-right: 16px - 5px;\n }\n }\n\n &__form {\n padding: 16px;\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n background: $ui-base-color;\n\n .fields-row {\n padding-top: 0;\n margin-bottom: 0;\n }\n }\n\n &__row {\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n background: darken($ui-base-color, 4%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n .optional &:first-child {\n border-top: 1px solid darken($ui-base-color, 8%);\n }\n }\n\n &:hover {\n background: darken($ui-base-color, 2%);\n }\n\n &:nth-child(even) {\n background: $ui-base-color;\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n }\n\n &__content {\n padding-top: 12px;\n padding-bottom: 16px;\n\n &--unpadded {\n padding: 0;\n }\n\n &--with-image {\n display: flex;\n align-items: center;\n }\n\n &__image {\n flex: 0 0 auto;\n display: flex;\n justify-content: center;\n align-items: center;\n margin-right: 10px;\n\n .emojione {\n width: 32px;\n height: 32px;\n }\n }\n\n &__text {\n flex: 1 1 auto;\n }\n\n &__extra {\n flex: 0 0 auto;\n text-align: right;\n color: $darker-text-color;\n font-weight: 500;\n }\n }\n\n .directory__tag {\n margin: 0;\n width: 100%;\n\n a {\n background: transparent;\n border-radius: 0;\n }\n }\n }\n\n &.optional .batch-table__toolbar,\n &.optional .batch-table__row__select {\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n\n .status__content {\n padding-top: 0;\n\n summary {\n display: list-item;\n }\n\n strong {\n font-weight: 700;\n }\n }\n\n .nothing-here {\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n box-shadow: none;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 1px solid darken($ui-base-color, 8%);\n }\n }\n\n @media screen and (max-width: 870px) {\n .accounts-table tbody td.optional {\n display: none;\n }\n }\n}\n","$no-columns-breakpoint: 600px;\n$sidebar-width: 240px;\n$content-width: 840px;\n\n.admin-wrapper {\n display: flex;\n justify-content: center;\n width: 100%;\n min-height: 100vh;\n\n .sidebar-wrapper {\n min-height: 100vh;\n overflow: hidden;\n pointer-events: none;\n flex: 1 1 auto;\n\n &__inner {\n display: flex;\n justify-content: flex-end;\n background: $ui-base-color;\n height: 100%;\n }\n }\n\n .sidebar {\n width: $sidebar-width;\n padding: 0;\n pointer-events: auto;\n\n &__toggle {\n display: none;\n background: lighten($ui-base-color, 8%);\n height: 48px;\n\n &__logo {\n flex: 1 1 auto;\n\n a {\n display: inline-block;\n padding: 15px;\n }\n\n svg {\n fill: $primary-text-color;\n height: 20px;\n position: relative;\n bottom: -2px;\n }\n }\n\n &__icon {\n display: block;\n color: $darker-text-color;\n text-decoration: none;\n flex: 0 0 auto;\n font-size: 20px;\n padding: 15px;\n }\n\n a {\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 12%);\n }\n }\n }\n\n .logo {\n display: block;\n margin: 40px auto;\n width: 100px;\n height: 100px;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n & > a:first-child {\n display: none;\n }\n }\n\n ul {\n list-style: none;\n border-radius: 4px 0 0 4px;\n overflow: hidden;\n margin-bottom: 20px;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n margin-bottom: 0;\n }\n\n a {\n display: block;\n padding: 15px;\n color: $darker-text-color;\n text-decoration: none;\n transition: all 200ms linear;\n transition-property: color, background-color;\n border-radius: 4px 0 0 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n i.fa {\n margin-right: 5px;\n }\n\n &:hover {\n color: $primary-text-color;\n background-color: darken($ui-base-color, 5%);\n transition: all 100ms linear;\n transition-property: color, background-color;\n }\n\n &.selected {\n background: darken($ui-base-color, 2%);\n border-radius: 4px 0 0;\n }\n }\n\n ul {\n background: darken($ui-base-color, 4%);\n border-radius: 0 0 0 4px;\n margin: 0;\n\n a {\n border: 0;\n padding: 15px 35px;\n }\n }\n\n .simple-navigation-active-leaf a {\n color: $primary-text-color;\n background-color: $ui-highlight-color;\n border-bottom: 0;\n border-radius: 0;\n\n &:hover {\n background-color: lighten($ui-highlight-color, 5%);\n }\n }\n }\n\n & > ul > .simple-navigation-active-leaf a {\n border-radius: 4px 0 0 4px;\n }\n }\n\n .content-wrapper {\n box-sizing: border-box;\n width: 100%;\n max-width: $content-width;\n flex: 1 1 auto;\n }\n\n @media screen and (max-width: $content-width + $sidebar-width) {\n .sidebar-wrapper--empty {\n display: none;\n }\n\n .sidebar-wrapper {\n width: $sidebar-width;\n flex: 0 0 auto;\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n .sidebar-wrapper {\n width: 100%;\n }\n }\n\n .content {\n padding: 20px 15px;\n padding-top: 60px;\n padding-left: 25px;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n max-width: none;\n padding: 15px;\n padding-top: 30px;\n }\n\n &-heading {\n display: flex;\n\n padding-bottom: 40px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n margin: -15px -15px 40px 0;\n\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n\n & > * {\n margin-top: 15px;\n margin-right: 15px;\n }\n\n &-actions {\n display: inline-flex;\n\n & > :not(:first-child) {\n margin-left: 5px;\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n border-bottom: 0;\n padding-bottom: 0;\n }\n }\n\n h2 {\n color: $secondary-text-color;\n font-size: 24px;\n line-height: 28px;\n font-weight: 400;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n font-weight: 700;\n }\n }\n\n h3 {\n color: $secondary-text-color;\n font-size: 20px;\n line-height: 28px;\n font-weight: 400;\n margin-bottom: 30px;\n }\n\n h4 {\n text-transform: uppercase;\n font-size: 13px;\n font-weight: 700;\n color: $darker-text-color;\n padding-bottom: 8px;\n margin-bottom: 8px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n h6 {\n font-size: 16px;\n color: $secondary-text-color;\n line-height: 28px;\n font-weight: 500;\n }\n\n .fields-group h6 {\n color: $primary-text-color;\n font-weight: 500;\n }\n\n .directory__tag > a,\n .directory__tag > div {\n box-shadow: none;\n }\n\n .directory__tag .table-action-link .fa {\n color: inherit;\n }\n\n .directory__tag h4 {\n font-size: 18px;\n font-weight: 700;\n color: $primary-text-color;\n text-transform: none;\n padding-bottom: 0;\n margin-bottom: 0;\n border-bottom: 0;\n }\n\n & > p {\n font-size: 14px;\n line-height: 21px;\n color: $secondary-text-color;\n margin-bottom: 20px;\n\n strong {\n color: $primary-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid rgba($ui-base-lighter-color, .6);\n margin: 20px 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n\n .sidebar-wrapper {\n min-height: 0;\n }\n\n .sidebar {\n width: 100%;\n padding: 0;\n height: auto;\n\n &__toggle {\n display: flex;\n }\n\n & > ul {\n display: none;\n }\n\n ul a,\n ul ul a {\n border-radius: 0;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n transition: none;\n\n &:hover {\n transition: none;\n }\n }\n\n ul ul {\n border-radius: 0;\n }\n\n ul .simple-navigation-active-leaf a {\n border-bottom-color: $ui-highlight-color;\n }\n }\n }\n}\n\nhr.spacer {\n width: 100%;\n border: 0;\n margin: 20px 0;\n height: 1px;\n}\n\nbody,\n.admin-wrapper .content {\n .muted-hint {\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n }\n }\n\n .positive-hint {\n color: $valid-value-color;\n font-weight: 500;\n }\n\n .negative-hint {\n color: $error-value-color;\n font-weight: 500;\n }\n\n .neutral-hint {\n color: $dark-text-color;\n font-weight: 500;\n }\n\n .warning-hint {\n color: $gold-star;\n font-weight: 500;\n }\n}\n\n.filters {\n display: flex;\n flex-wrap: wrap;\n\n .filter-subset {\n flex: 0 0 auto;\n margin: 0 40px 20px 0;\n\n &:last-child {\n margin-bottom: 30px;\n }\n\n ul {\n margin-top: 5px;\n list-style: none;\n\n li {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n strong {\n font-weight: 500;\n text-transform: uppercase;\n font-size: 12px;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n &--with-select strong {\n display: block;\n margin-bottom: 10px;\n }\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n text-transform: uppercase;\n font-size: 12px;\n font-weight: 500;\n border-bottom: 2px solid $ui-base-color;\n\n &:hover {\n color: $primary-text-color;\n border-bottom: 2px solid lighten($ui-base-color, 5%);\n }\n\n &.selected {\n color: $highlight-text-color;\n border-bottom: 2px solid $ui-highlight-color;\n }\n }\n }\n}\n\n.flavour-screen {\n display: block;\n margin: 10px auto;\n max-width: 100%;\n}\n\n.flavour-description {\n display: block;\n font-size: 16px;\n margin: 10px 0;\n\n & > p {\n margin: 10px 0;\n }\n}\n\n.flavour-screen {\n display: block;\n margin: 10px auto;\n max-width: 100%;\n}\n\n.flavour-description {\n display: block;\n font-size: 16px;\n margin: 10px 0;\n\n & > p {\n margin: 10px 0;\n }\n}\n\n.report-accounts {\n display: flex;\n flex-wrap: wrap;\n margin-bottom: 20px;\n}\n\n.report-accounts__item {\n display: flex;\n flex: 250px;\n flex-direction: column;\n margin: 0 5px;\n\n & > strong {\n display: block;\n margin: 0 0 10px -5px;\n font-weight: 500;\n font-size: 14px;\n line-height: 18px;\n color: $secondary-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n .account-card {\n flex: 1 1 auto;\n }\n}\n\n.report-status,\n.account-status {\n display: flex;\n margin-bottom: 10px;\n\n .activity-stream {\n flex: 2 0 0;\n margin-right: 20px;\n max-width: calc(100% - 60px);\n\n .entry {\n border-radius: 4px;\n }\n }\n}\n\n.report-status__actions,\n.account-status__actions {\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n\n .icon-button {\n font-size: 24px;\n width: 24px;\n text-align: center;\n margin-bottom: 10px;\n }\n}\n\n.simple_form.new_report_note,\n.simple_form.new_account_moderation_note {\n max-width: 100%;\n}\n\n.batch-form-box {\n display: flex;\n flex-wrap: wrap;\n margin-bottom: 5px;\n\n #form_status_batch_action {\n margin: 0 5px 5px 0;\n font-size: 14px;\n }\n\n input.button {\n margin: 0 5px 5px 0;\n }\n\n .media-spoiler-toggle-buttons {\n margin-left: auto;\n\n .button {\n overflow: visible;\n margin: 0 0 5px 5px;\n float: right;\n }\n }\n}\n\n.back-link {\n margin-bottom: 10px;\n font-size: 14px;\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.spacer {\n flex: 1 1 auto;\n}\n\n.log-entry {\n line-height: 20px;\n padding: 15px 0;\n background: $ui-base-color;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n\n &:last-child {\n border-bottom: 0;\n }\n\n &__header {\n display: flex;\n justify-content: flex-start;\n align-items: center;\n color: $darker-text-color;\n font-size: 14px;\n padding: 0 10px;\n }\n\n &__avatar {\n margin-right: 10px;\n\n .avatar {\n display: block;\n margin: 0;\n border-radius: 50%;\n width: 40px;\n height: 40px;\n }\n }\n\n &__content {\n max-width: calc(100% - 90px);\n }\n\n &__title {\n word-wrap: break-word;\n }\n\n &__timestamp {\n color: $dark-text-color;\n }\n\n a,\n .username,\n .target {\n color: $secondary-text-color;\n text-decoration: none;\n font-weight: 500;\n }\n}\n\na.name-tag,\n.name-tag,\na.inline-name-tag,\n.inline-name-tag {\n text-decoration: none;\n color: $secondary-text-color;\n\n .username {\n font-weight: 500;\n }\n\n &.suspended {\n .username {\n text-decoration: line-through;\n color: lighten($error-red, 12%);\n }\n\n .avatar {\n filter: grayscale(100%);\n opacity: 0.8;\n }\n }\n}\n\na.name-tag,\n.name-tag {\n display: flex;\n align-items: center;\n\n .avatar {\n display: block;\n margin: 0;\n margin-right: 5px;\n border-radius: 50%;\n }\n\n &.suspended {\n .avatar {\n filter: grayscale(100%);\n opacity: 0.8;\n }\n }\n}\n\n.speech-bubble {\n margin-bottom: 20px;\n border-left: 4px solid $ui-highlight-color;\n\n &.positive {\n border-left-color: $success-green;\n }\n\n &.negative {\n border-left-color: lighten($error-red, 12%);\n }\n\n &.warning {\n border-left-color: $gold-star;\n }\n\n &__bubble {\n padding: 16px;\n padding-left: 14px;\n font-size: 15px;\n line-height: 20px;\n border-radius: 4px 4px 4px 0;\n position: relative;\n font-weight: 500;\n\n a {\n color: $darker-text-color;\n }\n }\n\n &__owner {\n padding: 8px;\n padding-left: 12px;\n }\n\n time {\n color: $dark-text-color;\n }\n}\n\n.report-card {\n background: $ui-base-color;\n border-radius: 4px;\n margin-bottom: 20px;\n\n &__profile {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 15px;\n\n .account {\n padding: 0;\n border: 0;\n\n &__avatar-wrapper {\n margin-left: 0;\n }\n }\n\n &__stats {\n flex: 0 0 auto;\n font-weight: 500;\n color: $darker-text-color;\n text-transform: uppercase;\n text-align: right;\n\n a {\n color: inherit;\n text-decoration: none;\n\n &:focus,\n &:hover,\n &:active {\n color: lighten($darker-text-color, 8%);\n }\n }\n\n .red {\n color: $error-value-color;\n }\n }\n }\n\n &__summary {\n &__item {\n display: flex;\n justify-content: flex-start;\n border-top: 1px solid darken($ui-base-color, 4%);\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n\n &__reported-by,\n &__assigned {\n padding: 15px;\n flex: 0 0 auto;\n box-sizing: border-box;\n width: 150px;\n color: $darker-text-color;\n\n &,\n .username {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n &__content {\n flex: 1 1 auto;\n max-width: calc(100% - 300px);\n\n &__icon {\n color: $dark-text-color;\n margin-right: 4px;\n font-weight: 500;\n }\n }\n\n &__content a {\n display: block;\n box-sizing: border-box;\n width: 100%;\n padding: 15px;\n text-decoration: none;\n color: $darker-text-color;\n }\n }\n }\n}\n\n.one-line {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.ellipsized-ip {\n display: inline-block;\n max-width: 120px;\n overflow: hidden;\n text-overflow: ellipsis;\n vertical-align: middle;\n}\n\n.admin-account-bio {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n margin-top: 20px;\n\n > div {\n box-sizing: border-box;\n padding: 0 5px;\n margin-bottom: 10px;\n flex: 1 0 50%;\n }\n\n .account__header__fields,\n .account__header__content {\n background: lighten($ui-base-color, 8%);\n border-radius: 4px;\n height: 100%;\n }\n\n .account__header__fields {\n margin: 0;\n border: 0;\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n\n .account__header__content {\n box-sizing: border-box;\n padding: 20px;\n color: $primary-text-color;\n }\n}\n\n.center-text {\n text-align: center;\n}\n\n.announcements-list {\n border: 1px solid lighten($ui-base-color, 4%);\n border-radius: 4px;\n\n &__item {\n padding: 15px 0;\n background: $ui-base-color;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n\n &__title {\n padding: 0 15px;\n display: block;\n font-weight: 500;\n font-size: 18px;\n line-height: 1.5;\n color: $secondary-text-color;\n text-decoration: none;\n margin-bottom: 10px;\n\n &:hover,\n &:focus,\n &:active {\n color: $primary-text-color;\n }\n }\n\n &__meta {\n padding: 0 15px;\n color: $dark-text-color;\n }\n\n &__action-bar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n &:last-child {\n border-bottom: 0;\n }\n }\n}\n",".dashboard__counters {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n margin-bottom: 20px;\n\n & > div {\n box-sizing: border-box;\n flex: 0 0 33.333%;\n padding: 0 5px;\n margin-bottom: 10px;\n\n & > div,\n & > a {\n padding: 20px;\n background: lighten($ui-base-color, 4%);\n border-radius: 4px;\n box-sizing: border-box;\n height: 100%;\n }\n\n & > a {\n text-decoration: none;\n color: inherit;\n display: block;\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 8%);\n }\n }\n }\n\n &__num,\n &__text {\n text-align: center;\n font-weight: 500;\n font-size: 24px;\n line-height: 21px;\n color: $primary-text-color;\n font-family: $font-display, sans-serif;\n margin-bottom: 20px;\n line-height: 30px;\n }\n\n &__text {\n font-size: 18px;\n }\n\n &__label {\n font-size: 14px;\n color: $darker-text-color;\n text-align: center;\n font-weight: 500;\n }\n}\n\n.dashboard__widgets {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n\n & > div {\n flex: 0 0 33.333%;\n margin-bottom: 20px;\n\n & > div {\n padding: 0 5px;\n }\n }\n\n a:not(.name-tag) {\n color: $ui-secondary-color;\n font-weight: 500;\n text-decoration: none;\n }\n}\n","body.rtl {\n direction: rtl;\n\n .column-header > button {\n text-align: right;\n padding-left: 0;\n padding-right: 15px;\n }\n\n .radio-button__input {\n margin-right: 0;\n margin-left: 10px;\n }\n\n .directory__card__bar .display-name {\n margin-left: 0;\n margin-right: 15px;\n }\n\n .display-name {\n text-align: right;\n }\n\n .notification__message {\n margin-left: 0;\n margin-right: 68px;\n }\n\n .drawer__inner__mastodon > img {\n transform: scaleX(-1);\n }\n\n .notification__favourite-icon-wrapper {\n left: auto;\n right: -26px;\n }\n\n .landing-page__logo {\n margin-right: 0;\n margin-left: 20px;\n }\n\n .landing-page .features-list .features-list__row .visual {\n margin-left: 0;\n margin-right: 15px;\n }\n\n .column-link__icon,\n .column-header__icon {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .compose-form .compose-form__buttons-wrapper .character-counter__wrapper {\n margin-right: 0;\n margin-left: 4px;\n }\n\n .navigation-bar__profile {\n margin-left: 0;\n margin-right: 8px;\n }\n\n .search__input {\n padding-right: 10px;\n padding-left: 30px;\n }\n\n .search__icon .fa {\n right: auto;\n left: 10px;\n }\n\n .columns-area {\n direction: rtl;\n }\n\n .column-header__buttons {\n left: 0;\n right: auto;\n margin-left: 0;\n margin-right: -15px;\n }\n\n .column-inline-form .icon-button {\n margin-left: 0;\n margin-right: 5px;\n }\n\n .column-header__links .text-btn {\n margin-left: 10px;\n margin-right: 0;\n }\n\n .account__avatar-wrapper {\n float: right;\n }\n\n .column-header__back-button {\n padding-left: 5px;\n padding-right: 0;\n }\n\n .column-header__setting-arrows {\n float: left;\n }\n\n .setting-toggle__label {\n margin-left: 0;\n margin-right: 8px;\n }\n\n .status__avatar {\n left: auto;\n right: 10px;\n }\n\n .status,\n .activity-stream .status.light {\n padding-left: 10px;\n padding-right: 68px;\n }\n\n .status__info .status__display-name,\n .activity-stream .status.light .status__display-name {\n padding-left: 25px;\n padding-right: 0;\n }\n\n .activity-stream .pre-header {\n padding-right: 68px;\n padding-left: 0;\n }\n\n .status__prepend {\n margin-left: 0;\n margin-right: 68px;\n }\n\n .status__prepend-icon-wrapper {\n left: auto;\n right: -26px;\n }\n\n .activity-stream .pre-header .pre-header__icon {\n left: auto;\n right: 42px;\n }\n\n .account__avatar-overlay-overlay {\n right: auto;\n left: 0;\n }\n\n .column-back-button--slim-button {\n right: auto;\n left: 0;\n }\n\n .status__relative-time,\n .activity-stream .status.light .status__header .status__meta {\n float: left;\n }\n\n .status__action-bar {\n &__counter {\n margin-right: 0;\n margin-left: 11px;\n\n .status__action-bar-button {\n margin-right: 0;\n margin-left: 4px;\n }\n }\n }\n\n .status__action-bar-button {\n float: right;\n margin-right: 0;\n margin-left: 18px;\n }\n\n .status__action-bar-dropdown {\n float: right;\n }\n\n .privacy-dropdown__dropdown {\n margin-left: 0;\n margin-right: 40px;\n }\n\n .privacy-dropdown__option__icon {\n margin-left: 10px;\n margin-right: 0;\n }\n\n .detailed-status__display-name .display-name {\n text-align: right;\n }\n\n .detailed-status__display-avatar {\n margin-right: 0;\n margin-left: 10px;\n float: right;\n }\n\n .detailed-status__favorites,\n .detailed-status__reblogs {\n margin-left: 0;\n margin-right: 6px;\n }\n\n .fa-ul {\n margin-left: 2.14285714em;\n }\n\n .fa-li {\n left: auto;\n right: -2.14285714em;\n }\n\n .admin-wrapper {\n direction: rtl;\n }\n\n .admin-wrapper .sidebar ul a i.fa,\n a.table-action-link i.fa {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .simple_form .check_boxes .checkbox label {\n padding-left: 0;\n padding-right: 25px;\n }\n\n .simple_form .input.with_label.boolean label.checkbox {\n padding-left: 25px;\n padding-right: 0;\n }\n\n .simple_form .check_boxes .checkbox input[type=\"checkbox\"],\n .simple_form .input.boolean input[type=\"checkbox\"] {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.radio_buttons .radio {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.radio_buttons .radio > label {\n padding-right: 28px;\n padding-left: 0;\n }\n\n .simple_form .input-with-append .input input {\n padding-left: 142px;\n padding-right: 0;\n }\n\n .simple_form .input.boolean label.checkbox {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.boolean .label_input,\n .simple_form .input.boolean .hint {\n padding-left: 0;\n padding-right: 28px;\n }\n\n .simple_form .label_input__append {\n right: auto;\n left: 3px;\n\n &::after {\n right: auto;\n left: 0;\n background-image: linear-gradient(to left, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));\n }\n }\n\n .simple_form select {\n background: darken($ui-base-color, 10%) url(\"data:image/svg+xml;utf8,\") no-repeat left 8px center / auto 16px;\n }\n\n .table th,\n .table td {\n text-align: right;\n }\n\n .filters .filter-subset {\n margin-right: 0;\n margin-left: 45px;\n }\n\n .landing-page .header-wrapper .mascot {\n right: 60px;\n left: auto;\n }\n\n .landing-page__call-to-action .row__information-board {\n direction: rtl;\n }\n\n .landing-page .header .hero .floats .float-1 {\n left: -120px;\n right: auto;\n }\n\n .landing-page .header .hero .floats .float-2 {\n left: 210px;\n right: auto;\n }\n\n .landing-page .header .hero .floats .float-3 {\n left: 110px;\n right: auto;\n }\n\n .landing-page .header .links .brand img {\n left: 0;\n }\n\n .landing-page .fa-external-link {\n padding-right: 5px;\n padding-left: 0 !important;\n }\n\n .landing-page .features #mastodon-timeline {\n margin-right: 0;\n margin-left: 30px;\n }\n\n @media screen and (min-width: 631px) {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n\n &:first-child {\n padding-left: 5px;\n padding-right: 10px;\n }\n }\n\n .columns-area > div {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n }\n }\n }\n\n .columns-area--mobile .column,\n .columns-area--mobile .drawer {\n padding-left: 0;\n padding-right: 0;\n }\n\n .public-layout {\n .header {\n .nav-button {\n margin-left: 8px;\n margin-right: 0;\n }\n }\n\n .public-account-header__tabs {\n margin-left: 0;\n margin-right: 20px;\n }\n }\n\n .landing-page__information {\n .account__display-name {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .account__avatar-wrapper {\n margin-left: 12px;\n margin-right: 0;\n }\n }\n\n .card__bar .display-name {\n margin-left: 0;\n margin-right: 15px;\n text-align: right;\n }\n\n .fa-chevron-left::before {\n content: \"\\F054\";\n }\n\n .fa-chevron-right::before {\n content: \"\\F053\";\n }\n\n .column-back-button__icon {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .column-header__setting-arrows .column-header__setting-btn:last-child {\n padding-left: 0;\n padding-right: 10px;\n }\n\n .simple_form .input.radio_buttons .radio > label input {\n left: auto;\n right: 0;\n }\n}\n","$black-emojis: '8ball' 'ant' 'back' 'black_circle' 'black_heart' 'black_large_square' 'black_medium_small_square' 'black_medium_square' 'black_nib' 'black_small_square' 'bomb' 'bowling' 'bust_in_silhouette' 'busts_in_silhouette' 'camera' 'camera_with_flash' 'clubs' 'copyright' 'curly_loop' 'currency_exchange' 'dark_sunglasses' 'eight_pointed_black_star' 'electric_plug' 'end' 'female-guard' 'film_projector' 'fried_egg' 'gorilla' 'guardsman' 'heavy_check_mark' 'heavy_division_sign' 'heavy_dollar_sign' 'heavy_minus_sign' 'heavy_multiplication_x' 'heavy_plus_sign' 'hocho' 'hole' 'joystick' 'kaaba' 'lower_left_ballpoint_pen' 'lower_left_fountain_pen' 'male-guard' 'microphone' 'mortar_board' 'movie_camera' 'musical_score' 'on' 'registered' 'soon' 'spades' 'speaking_head_in_silhouette' 'spider' 'telephone_receiver' 'tm' 'top' 'tophat' 'turkey' 'vhs' 'video_camera' 'video_game' 'water_buffalo' 'waving_black_flag' 'wavy_dash';\n\n%white-emoji-outline {\n filter: drop-shadow(1px 1px 0 $white) drop-shadow(-1px 1px 0 $white) drop-shadow(1px -1px 0 $white) drop-shadow(-1px -1px 0 $white);\n transform: scale(.71);\n}\n\n.emojione {\n @each $emoji in $black-emojis {\n &[title=':#{$emoji}:'] {\n @extend %white-emoji-outline;\n }\n }\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/packs/flavours/vanilla/common.js b/priv/static/packs/flavours/vanilla/common.js index 9918570ee..a69c77f8c 100644 Binary files a/priv/static/packs/flavours/vanilla/common.js and b/priv/static/packs/flavours/vanilla/common.js differ diff --git a/priv/static/packs/flavours/vanilla/embed.js b/priv/static/packs/flavours/vanilla/embed.js index d715c4ce0..428bde4a8 100644 Binary files a/priv/static/packs/flavours/vanilla/embed.js and b/priv/static/packs/flavours/vanilla/embed.js differ diff --git a/priv/static/packs/flavours/vanilla/embed.js.LICENSE b/priv/static/packs/flavours/vanilla/embed.js.LICENSE deleted file mode 100644 index 487bc60d8..000000000 --- a/priv/static/packs/flavours/vanilla/embed.js.LICENSE +++ /dev/null @@ -1,41 +0,0 @@ -/* -object-assign -(c) Sindre Sorhus -@license MIT -*/ - -/** @license React v16.12.0 - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -/** @license React v16.12.0 - * react-dom.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -/** @license React v0.18.0 - * scheduler.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -/** @license React v16.12.0 - * react-is.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ diff --git a/priv/static/packs/flavours/vanilla/embed.js.LICENSE.txt b/priv/static/packs/flavours/vanilla/embed.js.LICENSE.txt new file mode 100644 index 000000000..2196b2def --- /dev/null +++ b/priv/static/packs/flavours/vanilla/embed.js.LICENSE.txt @@ -0,0 +1,41 @@ +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/ + +/** @license React v0.19.0 + * scheduler.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** @license React v16.12.0 + * react-is.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** @license React v16.13.0 + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** @license React v16.13.1 + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ diff --git a/priv/static/packs/flavours/vanilla/embed.js.map b/priv/static/packs/flavours/vanilla/embed.js.map index 99939ba39..11aaa64bb 100644 Binary files a/priv/static/packs/flavours/vanilla/embed.js.map and b/priv/static/packs/flavours/vanilla/embed.js.map differ diff --git a/priv/static/packs/flavours/vanilla/error.js b/priv/static/packs/flavours/vanilla/error.js index bb2bd90b3..7a5535676 100644 Binary files a/priv/static/packs/flavours/vanilla/error.js and b/priv/static/packs/flavours/vanilla/error.js differ diff --git a/priv/static/packs/flavours/vanilla/home.js b/priv/static/packs/flavours/vanilla/home.js index d3fdeb2aa..2412557a6 100644 Binary files a/priv/static/packs/flavours/vanilla/home.js and b/priv/static/packs/flavours/vanilla/home.js differ diff --git a/priv/static/packs/flavours/vanilla/about.js.LICENSE b/priv/static/packs/flavours/vanilla/home.js.LICENSE.txt similarity index 98% rename from priv/static/packs/flavours/vanilla/about.js.LICENSE rename to priv/static/packs/flavours/vanilla/home.js.LICENSE.txt index 0a0301353..90a9a7678 100644 --- a/priv/static/packs/flavours/vanilla/about.js.LICENSE +++ b/priv/static/packs/flavours/vanilla/home.js.LICENSE.txt @@ -1,3 +1,9 @@ +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/ + /*! Copyright (c) 2017 Jed Watson. Licensed under the MIT License (MIT), see @@ -12,31 +18,145 @@ * MIT Licensed */ -/* -object-assign -(c) Sindre Sorhus -@license MIT -*/ - -/** @license React v16.12.0 - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. +/*! + * wavesurfer.js 3.3.1 (2020-01-14) + * https://github.com/katspaugh/wavesurfer.js + * @license BSD-3-Clause */ -/** @license React v16.12.0 - * react-dom.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ +/*! ./ajax */ -/** @license React v0.18.0 +/*! ./drawer */ + +/*! ./drawer.canvasentry */ + +/*! ./drawer.multicanvas */ + +/*! ./extend */ + +/*! ./fetch */ + +/*! ./frame */ + +/*! ./get-id */ + +/*! ./max */ + +/*! ./mediaelement */ + +/*! ./mediaelement-webaudio */ + +/*! ./min */ + +/*! ./observer */ + +/*! ./peakcache */ + +/*! ./prevent-click */ + +/*! ./request-animation-frame */ + +/*! ./style */ + +/*! ./util */ + +/*! ./util/get-id */ + +/*! ./util/style */ + +/*! ./webaudio */ + +/*! debounce */ + +/*! https://mths.be/punycode v1.4.1 by @mathias */ + +/*! no static exports found */ + +/*!***********************!*\ + !*** ./src/drawer.js ***! + \***********************/ + +/*!*************************!*\ + !*** ./src/util/max.js ***! + \*************************/ + +/*!*************************!*\ + !*** ./src/util/min.js ***! + \*************************/ + +/*!*************************!*\ + !*** ./src/webaudio.js ***! + \*************************/ + +/*!**************************!*\ + !*** ./src/peakcache.js ***! + \**************************/ + +/*!**************************!*\ + !*** ./src/util/ajax.js ***! + \**************************/ + +/*!***************************!*\ + !*** ./src/util/fetch.js ***! + \***************************/ + +/*!***************************!*\ + !*** ./src/util/frame.js ***! + \***************************/ + +/*!***************************!*\ + !*** ./src/util/index.js ***! + \***************************/ + +/*!***************************!*\ + !*** ./src/util/style.js ***! + \***************************/ + +/*!***************************!*\ + !*** ./src/wavesurfer.js ***! + \***************************/ + +/*!****************************!*\ + !*** ./src/util/extend.js ***! + \****************************/ + +/*!****************************!*\ + !*** ./src/util/get-id.js ***! + \****************************/ + +/*!*****************************!*\ + !*** ./src/mediaelement.js ***! + \*****************************/ + +/*!******************************!*\ + !*** ./src/util/observer.js ***! + \******************************/ + +/*!***********************************!*\ + !*** ./src/drawer.canvasentry.js ***! + \***********************************/ + +/*!***********************************!*\ + !*** ./src/drawer.multicanvas.js ***! + \***********************************/ + +/*!***********************************!*\ + !*** ./src/util/prevent-click.js ***! + \***********************************/ + +/*!**************************************!*\ + !*** ./src/mediaelement-webaudio.js ***! + \**************************************/ + +/*!****************************************!*\ + !*** ./node_modules/debounce/index.js ***! + \****************************************/ + +/*!*********************************************!*\ + !*** ./src/util/request-animation-frame.js ***! + \*********************************************/ + +/** @license React v0.19.0 * scheduler.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. @@ -54,140 +174,20 @@ object-assign * LICENSE file in the root directory of this source tree. */ -/*! - * wavesurfer.js 3.3.1 (2020-01-14) - * https://github.com/katspaugh/wavesurfer.js - * @license BSD-3-Clause +/** @license React v16.13.0 + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. */ -/*!****************************************!*\ - !*** ./node_modules/debounce/index.js ***! - \****************************************/ - -/*! no static exports found */ - -/*!***********************************!*\ - !*** ./src/drawer.canvasentry.js ***! - \***********************************/ - -/*! ./util/style */ - -/*! ./util/get-id */ - -/*!***********************!*\ - !*** ./src/drawer.js ***! - \***********************/ - -/*! ./util */ - -/*!***********************************!*\ - !*** ./src/drawer.multicanvas.js ***! - \***********************************/ - -/*! ./drawer */ - -/*! ./drawer.canvasentry */ - -/*!**************************************!*\ - !*** ./src/mediaelement-webaudio.js ***! - \**************************************/ - -/*! ./mediaelement */ - -/*!*****************************!*\ - !*** ./src/mediaelement.js ***! - \*****************************/ - -/*! ./webaudio */ - -/*!**************************!*\ - !*** ./src/peakcache.js ***! - \**************************/ - -/*!**************************!*\ - !*** ./src/util/ajax.js ***! - \**************************/ - -/*! ./observer */ - -/*!****************************!*\ - !*** ./src/util/extend.js ***! - \****************************/ - -/*!***************************!*\ - !*** ./src/util/fetch.js ***! - \***************************/ - -/*!***************************!*\ - !*** ./src/util/frame.js ***! - \***************************/ - -/*! ./request-animation-frame */ - -/*!****************************!*\ - !*** ./src/util/get-id.js ***! - \****************************/ - -/*!***************************!*\ - !*** ./src/util/index.js ***! - \***************************/ - -/*! ./ajax */ - -/*! ./get-id */ - -/*! ./max */ - -/*! ./min */ - -/*! ./extend */ - -/*! ./style */ - -/*! ./frame */ - -/*! debounce */ - -/*! ./prevent-click */ - -/*! ./fetch */ - -/*!*************************!*\ - !*** ./src/util/max.js ***! - \*************************/ - -/*!*************************!*\ - !*** ./src/util/min.js ***! - \*************************/ - -/*!******************************!*\ - !*** ./src/util/observer.js ***! - \******************************/ - -/*!***********************************!*\ - !*** ./src/util/prevent-click.js ***! - \***********************************/ - -/*!*********************************************!*\ - !*** ./src/util/request-animation-frame.js ***! - \*********************************************/ - -/*!***************************!*\ - !*** ./src/util/style.js ***! - \***************************/ - -/*!***************************!*\ - !*** ./src/wavesurfer.js ***! - \***************************/ - -/*! ./drawer.multicanvas */ - -/*! ./peakcache */ - -/*! ./mediaelement-webaudio */ - -/*!*************************!*\ - !*** ./src/webaudio.js ***! - \*************************/ - -/*! https://mths.be/punycode v1.4.1 by @mathias */ +/** @license React v16.13.1 + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ diff --git a/priv/static/packs/flavours/vanilla/home.js.map b/priv/static/packs/flavours/vanilla/home.js.map index a32b3005b..28aab11ac 100644 Binary files a/priv/static/packs/flavours/vanilla/home.js.map and b/priv/static/packs/flavours/vanilla/home.js.map differ diff --git a/priv/static/packs/flavours/vanilla/public.js b/priv/static/packs/flavours/vanilla/public.js index 6810fccc7..7f1a585ee 100644 Binary files a/priv/static/packs/flavours/vanilla/public.js and b/priv/static/packs/flavours/vanilla/public.js differ diff --git a/priv/static/packs/flavours/vanilla/public.js.LICENSE b/priv/static/packs/flavours/vanilla/public.js.LICENSE deleted file mode 100644 index 487bc60d8..000000000 --- a/priv/static/packs/flavours/vanilla/public.js.LICENSE +++ /dev/null @@ -1,41 +0,0 @@ -/* -object-assign -(c) Sindre Sorhus -@license MIT -*/ - -/** @license React v16.12.0 - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -/** @license React v16.12.0 - * react-dom.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -/** @license React v0.18.0 - * scheduler.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -/** @license React v16.12.0 - * react-is.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ diff --git a/priv/static/packs/flavours/vanilla/public.js.LICENSE.txt b/priv/static/packs/flavours/vanilla/public.js.LICENSE.txt new file mode 100644 index 000000000..2196b2def --- /dev/null +++ b/priv/static/packs/flavours/vanilla/public.js.LICENSE.txt @@ -0,0 +1,41 @@ +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/ + +/** @license React v0.19.0 + * scheduler.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** @license React v16.12.0 + * react-is.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** @license React v16.13.0 + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** @license React v16.13.1 + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ diff --git a/priv/static/packs/flavours/vanilla/public.js.map b/priv/static/packs/flavours/vanilla/public.js.map index 18eb23360..df384658a 100644 Binary files a/priv/static/packs/flavours/vanilla/public.js.map and b/priv/static/packs/flavours/vanilla/public.js.map differ diff --git a/priv/static/packs/flavours/vanilla/settings.js b/priv/static/packs/flavours/vanilla/settings.js index cd7983274..21cfd13f4 100644 Binary files a/priv/static/packs/flavours/vanilla/settings.js and b/priv/static/packs/flavours/vanilla/settings.js differ diff --git a/priv/static/packs/flavours/vanilla/settings.js.LICENSE b/priv/static/packs/flavours/vanilla/settings.js.LICENSE deleted file mode 100644 index 487bc60d8..000000000 --- a/priv/static/packs/flavours/vanilla/settings.js.LICENSE +++ /dev/null @@ -1,41 +0,0 @@ -/* -object-assign -(c) Sindre Sorhus -@license MIT -*/ - -/** @license React v16.12.0 - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -/** @license React v16.12.0 - * react-dom.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -/** @license React v0.18.0 - * scheduler.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -/** @license React v16.12.0 - * react-is.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ diff --git a/priv/static/packs/flavours/vanilla/settings.js.LICENSE.txt b/priv/static/packs/flavours/vanilla/settings.js.LICENSE.txt new file mode 100644 index 000000000..2196b2def --- /dev/null +++ b/priv/static/packs/flavours/vanilla/settings.js.LICENSE.txt @@ -0,0 +1,41 @@ +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/ + +/** @license React v0.19.0 + * scheduler.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** @license React v16.12.0 + * react-is.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** @license React v16.13.0 + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** @license React v16.13.1 + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ diff --git a/priv/static/packs/flavours/vanilla/settings.js.map b/priv/static/packs/flavours/vanilla/settings.js.map index d2789d073..92c015611 100644 Binary files a/priv/static/packs/flavours/vanilla/settings.js.map and b/priv/static/packs/flavours/vanilla/settings.js.map differ diff --git a/priv/static/packs/flavours/vanilla/share.js b/priv/static/packs/flavours/vanilla/share.js index 7efe63b00..fdfa039cb 100644 Binary files a/priv/static/packs/flavours/vanilla/share.js and b/priv/static/packs/flavours/vanilla/share.js differ diff --git a/priv/static/packs/flavours/vanilla/share.js.LICENSE b/priv/static/packs/flavours/vanilla/share.js.LICENSE.txt similarity index 98% rename from priv/static/packs/flavours/vanilla/share.js.LICENSE rename to priv/static/packs/flavours/vanilla/share.js.LICENSE.txt index 58e46bc71..2ea8cbae4 100644 --- a/priv/static/packs/flavours/vanilla/share.js.LICENSE +++ b/priv/static/packs/flavours/vanilla/share.js.LICENSE.txt @@ -1,3 +1,9 @@ +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/ + /*! Copyright (c) 2017 Jed Watson. Licensed under the MIT License (MIT), see @@ -12,31 +18,143 @@ * MIT Licensed */ -/* -object-assign -(c) Sindre Sorhus -@license MIT -*/ - -/** @license React v16.12.0 - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. +/*! + * wavesurfer.js 3.3.1 (2020-01-14) + * https://github.com/katspaugh/wavesurfer.js + * @license BSD-3-Clause */ -/** @license React v16.12.0 - * react-dom.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ +/*! ./ajax */ -/** @license React v0.18.0 +/*! ./drawer */ + +/*! ./drawer.canvasentry */ + +/*! ./drawer.multicanvas */ + +/*! ./extend */ + +/*! ./fetch */ + +/*! ./frame */ + +/*! ./get-id */ + +/*! ./max */ + +/*! ./mediaelement */ + +/*! ./mediaelement-webaudio */ + +/*! ./min */ + +/*! ./observer */ + +/*! ./peakcache */ + +/*! ./prevent-click */ + +/*! ./request-animation-frame */ + +/*! ./style */ + +/*! ./util */ + +/*! ./util/get-id */ + +/*! ./util/style */ + +/*! ./webaudio */ + +/*! debounce */ + +/*! no static exports found */ + +/*!***********************!*\ + !*** ./src/drawer.js ***! + \***********************/ + +/*!*************************!*\ + !*** ./src/util/max.js ***! + \*************************/ + +/*!*************************!*\ + !*** ./src/util/min.js ***! + \*************************/ + +/*!*************************!*\ + !*** ./src/webaudio.js ***! + \*************************/ + +/*!**************************!*\ + !*** ./src/peakcache.js ***! + \**************************/ + +/*!**************************!*\ + !*** ./src/util/ajax.js ***! + \**************************/ + +/*!***************************!*\ + !*** ./src/util/fetch.js ***! + \***************************/ + +/*!***************************!*\ + !*** ./src/util/frame.js ***! + \***************************/ + +/*!***************************!*\ + !*** ./src/util/index.js ***! + \***************************/ + +/*!***************************!*\ + !*** ./src/util/style.js ***! + \***************************/ + +/*!***************************!*\ + !*** ./src/wavesurfer.js ***! + \***************************/ + +/*!****************************!*\ + !*** ./src/util/extend.js ***! + \****************************/ + +/*!****************************!*\ + !*** ./src/util/get-id.js ***! + \****************************/ + +/*!*****************************!*\ + !*** ./src/mediaelement.js ***! + \*****************************/ + +/*!******************************!*\ + !*** ./src/util/observer.js ***! + \******************************/ + +/*!***********************************!*\ + !*** ./src/drawer.canvasentry.js ***! + \***********************************/ + +/*!***********************************!*\ + !*** ./src/drawer.multicanvas.js ***! + \***********************************/ + +/*!***********************************!*\ + !*** ./src/util/prevent-click.js ***! + \***********************************/ + +/*!**************************************!*\ + !*** ./src/mediaelement-webaudio.js ***! + \**************************************/ + +/*!****************************************!*\ + !*** ./node_modules/debounce/index.js ***! + \****************************************/ + +/*!*********************************************!*\ + !*** ./src/util/request-animation-frame.js ***! + \*********************************************/ + +/** @license React v0.19.0 * scheduler.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. @@ -54,138 +172,20 @@ object-assign * LICENSE file in the root directory of this source tree. */ -/*! - * wavesurfer.js 3.3.1 (2020-01-14) - * https://github.com/katspaugh/wavesurfer.js - * @license BSD-3-Clause +/** @license React v16.13.0 + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. */ -/*!****************************************!*\ - !*** ./node_modules/debounce/index.js ***! - \****************************************/ - -/*! no static exports found */ - -/*!***********************************!*\ - !*** ./src/drawer.canvasentry.js ***! - \***********************************/ - -/*! ./util/style */ - -/*! ./util/get-id */ - -/*!***********************!*\ - !*** ./src/drawer.js ***! - \***********************/ - -/*! ./util */ - -/*!***********************************!*\ - !*** ./src/drawer.multicanvas.js ***! - \***********************************/ - -/*! ./drawer */ - -/*! ./drawer.canvasentry */ - -/*!**************************************!*\ - !*** ./src/mediaelement-webaudio.js ***! - \**************************************/ - -/*! ./mediaelement */ - -/*!*****************************!*\ - !*** ./src/mediaelement.js ***! - \*****************************/ - -/*! ./webaudio */ - -/*!**************************!*\ - !*** ./src/peakcache.js ***! - \**************************/ - -/*!**************************!*\ - !*** ./src/util/ajax.js ***! - \**************************/ - -/*! ./observer */ - -/*!****************************!*\ - !*** ./src/util/extend.js ***! - \****************************/ - -/*!***************************!*\ - !*** ./src/util/fetch.js ***! - \***************************/ - -/*!***************************!*\ - !*** ./src/util/frame.js ***! - \***************************/ - -/*! ./request-animation-frame */ - -/*!****************************!*\ - !*** ./src/util/get-id.js ***! - \****************************/ - -/*!***************************!*\ - !*** ./src/util/index.js ***! - \***************************/ - -/*! ./ajax */ - -/*! ./get-id */ - -/*! ./max */ - -/*! ./min */ - -/*! ./extend */ - -/*! ./style */ - -/*! ./frame */ - -/*! debounce */ - -/*! ./prevent-click */ - -/*! ./fetch */ - -/*!*************************!*\ - !*** ./src/util/max.js ***! - \*************************/ - -/*!*************************!*\ - !*** ./src/util/min.js ***! - \*************************/ - -/*!******************************!*\ - !*** ./src/util/observer.js ***! - \******************************/ - -/*!***********************************!*\ - !*** ./src/util/prevent-click.js ***! - \***********************************/ - -/*!*********************************************!*\ - !*** ./src/util/request-animation-frame.js ***! - \*********************************************/ - -/*!***************************!*\ - !*** ./src/util/style.js ***! - \***************************/ - -/*!***************************!*\ - !*** ./src/wavesurfer.js ***! - \***************************/ - -/*! ./drawer.multicanvas */ - -/*! ./peakcache */ - -/*! ./mediaelement-webaudio */ - -/*!*************************!*\ - !*** ./src/webaudio.js ***! - \*************************/ +/** @license React v16.13.1 + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ diff --git a/priv/static/packs/flavours/vanilla/share.js.map b/priv/static/packs/flavours/vanilla/share.js.map index 52c37a2a1..8aefdd1c4 100644 Binary files a/priv/static/packs/flavours/vanilla/share.js.map and b/priv/static/packs/flavours/vanilla/share.js.map differ diff --git a/priv/static/packs/locales.js b/priv/static/packs/locales.js index 433c0d429..ad614f53b 100644 Binary files a/priv/static/packs/locales.js and b/priv/static/packs/locales.js differ diff --git a/priv/static/packs/locales.js.map b/priv/static/packs/locales.js.map index 134ab600d..45f8b2b61 100644 Binary files a/priv/static/packs/locales.js.map and b/priv/static/packs/locales.js.map differ diff --git a/priv/static/packs/locales/glitch/ar.js b/priv/static/packs/locales/glitch/ar.js index 8a0ba7b46..d99aca589 100644 Binary files a/priv/static/packs/locales/glitch/ar.js and b/priv/static/packs/locales/glitch/ar.js differ diff --git a/priv/static/packs/locales/glitch/ar.js.map b/priv/static/packs/locales/glitch/ar.js.map index c7eb80c27..86279ae70 100644 Binary files a/priv/static/packs/locales/glitch/ar.js.map and b/priv/static/packs/locales/glitch/ar.js.map differ diff --git a/priv/static/packs/locales/glitch/ast.js b/priv/static/packs/locales/glitch/ast.js index 85c8d227f..692011d30 100644 Binary files a/priv/static/packs/locales/glitch/ast.js and b/priv/static/packs/locales/glitch/ast.js differ diff --git a/priv/static/packs/locales/glitch/ast.js.map b/priv/static/packs/locales/glitch/ast.js.map index 7ae4686eb..7c0782e9d 100644 Binary files a/priv/static/packs/locales/glitch/ast.js.map and b/priv/static/packs/locales/glitch/ast.js.map differ diff --git a/priv/static/packs/locales/glitch/bg.js b/priv/static/packs/locales/glitch/bg.js index 5f093fc35..f657dbfdd 100644 Binary files a/priv/static/packs/locales/glitch/bg.js and b/priv/static/packs/locales/glitch/bg.js differ diff --git a/priv/static/packs/locales/glitch/bg.js.map b/priv/static/packs/locales/glitch/bg.js.map index 785293b7f..d881df95c 100644 Binary files a/priv/static/packs/locales/glitch/bg.js.map and b/priv/static/packs/locales/glitch/bg.js.map differ diff --git a/priv/static/packs/locales/glitch/bn.js b/priv/static/packs/locales/glitch/bn.js index af813f4f6..961c6ac85 100644 Binary files a/priv/static/packs/locales/glitch/bn.js and b/priv/static/packs/locales/glitch/bn.js differ diff --git a/priv/static/packs/locales/glitch/bn.js.map b/priv/static/packs/locales/glitch/bn.js.map index 319ae3adf..5af427b0f 100644 Binary files a/priv/static/packs/locales/glitch/bn.js.map and b/priv/static/packs/locales/glitch/bn.js.map differ diff --git a/priv/static/packs/locales/glitch/br.js b/priv/static/packs/locales/glitch/br.js index b4f8b1411..6db685b77 100644 Binary files a/priv/static/packs/locales/glitch/br.js and b/priv/static/packs/locales/glitch/br.js differ diff --git a/priv/static/packs/locales/glitch/br.js.map b/priv/static/packs/locales/glitch/br.js.map index ccef003ef..f1a4aa7fc 100644 Binary files a/priv/static/packs/locales/glitch/br.js.map and b/priv/static/packs/locales/glitch/br.js.map differ diff --git a/priv/static/packs/locales/glitch/ca.js b/priv/static/packs/locales/glitch/ca.js index 3f4a2544e..23b6e5a69 100644 Binary files a/priv/static/packs/locales/glitch/ca.js and b/priv/static/packs/locales/glitch/ca.js differ diff --git a/priv/static/packs/locales/glitch/ca.js.map b/priv/static/packs/locales/glitch/ca.js.map index 9322ae353..94b5ce457 100644 Binary files a/priv/static/packs/locales/glitch/ca.js.map and b/priv/static/packs/locales/glitch/ca.js.map differ diff --git a/priv/static/packs/locales/glitch/co.js b/priv/static/packs/locales/glitch/co.js index a9c0fdd98..986d0b547 100644 Binary files a/priv/static/packs/locales/glitch/co.js and b/priv/static/packs/locales/glitch/co.js differ diff --git a/priv/static/packs/locales/glitch/co.js.map b/priv/static/packs/locales/glitch/co.js.map index b959be024..e263b0566 100644 Binary files a/priv/static/packs/locales/glitch/co.js.map and b/priv/static/packs/locales/glitch/co.js.map differ diff --git a/priv/static/packs/locales/glitch/cs.js b/priv/static/packs/locales/glitch/cs.js index 1163f6e44..41b8c5938 100644 Binary files a/priv/static/packs/locales/glitch/cs.js and b/priv/static/packs/locales/glitch/cs.js differ diff --git a/priv/static/packs/locales/glitch/cs.js.map b/priv/static/packs/locales/glitch/cs.js.map index 9b382546f..04c3961a2 100644 Binary files a/priv/static/packs/locales/glitch/cs.js.map and b/priv/static/packs/locales/glitch/cs.js.map differ diff --git a/priv/static/packs/locales/glitch/cy.js b/priv/static/packs/locales/glitch/cy.js index b563d99c7..353d89efc 100644 Binary files a/priv/static/packs/locales/glitch/cy.js and b/priv/static/packs/locales/glitch/cy.js differ diff --git a/priv/static/packs/locales/glitch/cy.js.map b/priv/static/packs/locales/glitch/cy.js.map index 3ecea7c82..9f6f51fae 100644 Binary files a/priv/static/packs/locales/glitch/cy.js.map and b/priv/static/packs/locales/glitch/cy.js.map differ diff --git a/priv/static/packs/locales/glitch/da.js b/priv/static/packs/locales/glitch/da.js index c92db7ce5..6089d5e67 100644 Binary files a/priv/static/packs/locales/glitch/da.js and b/priv/static/packs/locales/glitch/da.js differ diff --git a/priv/static/packs/locales/glitch/da.js.map b/priv/static/packs/locales/glitch/da.js.map index ac132c436..4123e5095 100644 Binary files a/priv/static/packs/locales/glitch/da.js.map and b/priv/static/packs/locales/glitch/da.js.map differ diff --git a/priv/static/packs/locales/glitch/de.js b/priv/static/packs/locales/glitch/de.js index 7108ca09e..3692ac715 100644 Binary files a/priv/static/packs/locales/glitch/de.js and b/priv/static/packs/locales/glitch/de.js differ diff --git a/priv/static/packs/locales/glitch/de.js.map b/priv/static/packs/locales/glitch/de.js.map index 0f60052e3..0b379b1c0 100644 Binary files a/priv/static/packs/locales/glitch/de.js.map and b/priv/static/packs/locales/glitch/de.js.map differ diff --git a/priv/static/packs/locales/glitch/el.js b/priv/static/packs/locales/glitch/el.js index 65ca11a6e..2aa456032 100644 Binary files a/priv/static/packs/locales/glitch/el.js and b/priv/static/packs/locales/glitch/el.js differ diff --git a/priv/static/packs/locales/glitch/el.js.map b/priv/static/packs/locales/glitch/el.js.map index bb34a1d6e..628818b30 100644 Binary files a/priv/static/packs/locales/glitch/el.js.map and b/priv/static/packs/locales/glitch/el.js.map differ diff --git a/priv/static/packs/locales/glitch/en.js b/priv/static/packs/locales/glitch/en.js index 2c366a501..de94c6aa0 100644 Binary files a/priv/static/packs/locales/glitch/en.js and b/priv/static/packs/locales/glitch/en.js differ diff --git a/priv/static/packs/locales/glitch/en.js.map b/priv/static/packs/locales/glitch/en.js.map index cb9057773..a543edf11 100644 Binary files a/priv/static/packs/locales/glitch/en.js.map and b/priv/static/packs/locales/glitch/en.js.map differ diff --git a/priv/static/packs/locales/glitch/eo.js b/priv/static/packs/locales/glitch/eo.js index efa3859f4..406eb79cc 100644 Binary files a/priv/static/packs/locales/glitch/eo.js and b/priv/static/packs/locales/glitch/eo.js differ diff --git a/priv/static/packs/locales/glitch/eo.js.map b/priv/static/packs/locales/glitch/eo.js.map index 1b659c2f8..7e2ed6dfd 100644 Binary files a/priv/static/packs/locales/glitch/eo.js.map and b/priv/static/packs/locales/glitch/eo.js.map differ diff --git a/priv/static/packs/locales/glitch/es-AR.js b/priv/static/packs/locales/glitch/es-AR.js index f838642ef..b841aaaa6 100644 Binary files a/priv/static/packs/locales/glitch/es-AR.js and b/priv/static/packs/locales/glitch/es-AR.js differ diff --git a/priv/static/packs/locales/glitch/es-AR.js.map b/priv/static/packs/locales/glitch/es-AR.js.map index a0975a92e..414744318 100644 Binary files a/priv/static/packs/locales/glitch/es-AR.js.map and b/priv/static/packs/locales/glitch/es-AR.js.map differ diff --git a/priv/static/packs/locales/glitch/es.js b/priv/static/packs/locales/glitch/es.js index 4cbaa8f21..2395c7620 100644 Binary files a/priv/static/packs/locales/glitch/es.js and b/priv/static/packs/locales/glitch/es.js differ diff --git a/priv/static/packs/locales/glitch/es.js.map b/priv/static/packs/locales/glitch/es.js.map index 55feaa6f0..9f904dbd1 100644 Binary files a/priv/static/packs/locales/glitch/es.js.map and b/priv/static/packs/locales/glitch/es.js.map differ diff --git a/priv/static/packs/locales/glitch/et.js b/priv/static/packs/locales/glitch/et.js index d4ba1fe29..301d249d8 100644 Binary files a/priv/static/packs/locales/glitch/et.js and b/priv/static/packs/locales/glitch/et.js differ diff --git a/priv/static/packs/locales/glitch/et.js.map b/priv/static/packs/locales/glitch/et.js.map index 977da58e6..1ebdeed17 100644 Binary files a/priv/static/packs/locales/glitch/et.js.map and b/priv/static/packs/locales/glitch/et.js.map differ diff --git a/priv/static/packs/locales/glitch/eu.js b/priv/static/packs/locales/glitch/eu.js index 241b6563a..e4a114489 100644 Binary files a/priv/static/packs/locales/glitch/eu.js and b/priv/static/packs/locales/glitch/eu.js differ diff --git a/priv/static/packs/locales/glitch/eu.js.map b/priv/static/packs/locales/glitch/eu.js.map index 4f3ebea43..e19dfafed 100644 Binary files a/priv/static/packs/locales/glitch/eu.js.map and b/priv/static/packs/locales/glitch/eu.js.map differ diff --git a/priv/static/packs/locales/glitch/fa.js b/priv/static/packs/locales/glitch/fa.js index 7d80b332b..b39d7c8be 100644 Binary files a/priv/static/packs/locales/glitch/fa.js and b/priv/static/packs/locales/glitch/fa.js differ diff --git a/priv/static/packs/locales/glitch/fa.js.map b/priv/static/packs/locales/glitch/fa.js.map index a7d10fba0..9dc4cadc5 100644 Binary files a/priv/static/packs/locales/glitch/fa.js.map and b/priv/static/packs/locales/glitch/fa.js.map differ diff --git a/priv/static/packs/locales/glitch/fi.js b/priv/static/packs/locales/glitch/fi.js index f44bef546..891d5f510 100644 Binary files a/priv/static/packs/locales/glitch/fi.js and b/priv/static/packs/locales/glitch/fi.js differ diff --git a/priv/static/packs/locales/glitch/fi.js.map b/priv/static/packs/locales/glitch/fi.js.map index a1fd351f5..5257a095d 100644 Binary files a/priv/static/packs/locales/glitch/fi.js.map and b/priv/static/packs/locales/glitch/fi.js.map differ diff --git a/priv/static/packs/locales/glitch/fr.js b/priv/static/packs/locales/glitch/fr.js index 7b000a883..a347e27ca 100644 Binary files a/priv/static/packs/locales/glitch/fr.js and b/priv/static/packs/locales/glitch/fr.js differ diff --git a/priv/static/packs/locales/glitch/fr.js.map b/priv/static/packs/locales/glitch/fr.js.map index bc2b07d02..51f5f7911 100644 Binary files a/priv/static/packs/locales/glitch/fr.js.map and b/priv/static/packs/locales/glitch/fr.js.map differ diff --git a/priv/static/packs/locales/glitch/ga.js b/priv/static/packs/locales/glitch/ga.js index 927e24296..699637416 100644 Binary files a/priv/static/packs/locales/glitch/ga.js and b/priv/static/packs/locales/glitch/ga.js differ diff --git a/priv/static/packs/locales/glitch/ga.js.map b/priv/static/packs/locales/glitch/ga.js.map index 973a6b1d8..cd7be7d00 100644 Binary files a/priv/static/packs/locales/glitch/ga.js.map and b/priv/static/packs/locales/glitch/ga.js.map differ diff --git a/priv/static/packs/locales/glitch/gl.js b/priv/static/packs/locales/glitch/gl.js index 964b54a5b..f4194822b 100644 Binary files a/priv/static/packs/locales/glitch/gl.js and b/priv/static/packs/locales/glitch/gl.js differ diff --git a/priv/static/packs/locales/glitch/gl.js.map b/priv/static/packs/locales/glitch/gl.js.map index e87ec9a7b..3e6f840bd 100644 Binary files a/priv/static/packs/locales/glitch/gl.js.map and b/priv/static/packs/locales/glitch/gl.js.map differ diff --git a/priv/static/packs/locales/glitch/he.js b/priv/static/packs/locales/glitch/he.js index e433e68dc..76bf1117e 100644 Binary files a/priv/static/packs/locales/glitch/he.js and b/priv/static/packs/locales/glitch/he.js differ diff --git a/priv/static/packs/locales/glitch/he.js.map b/priv/static/packs/locales/glitch/he.js.map index c0c5bc33d..112537ef6 100644 Binary files a/priv/static/packs/locales/glitch/he.js.map and b/priv/static/packs/locales/glitch/he.js.map differ diff --git a/priv/static/packs/locales/glitch/hi.js b/priv/static/packs/locales/glitch/hi.js index db38a62b8..31abe01f0 100644 Binary files a/priv/static/packs/locales/glitch/hi.js and b/priv/static/packs/locales/glitch/hi.js differ diff --git a/priv/static/packs/locales/glitch/hi.js.map b/priv/static/packs/locales/glitch/hi.js.map index 4a944f819..b5417c255 100644 Binary files a/priv/static/packs/locales/glitch/hi.js.map and b/priv/static/packs/locales/glitch/hi.js.map differ diff --git a/priv/static/packs/locales/glitch/hr.js b/priv/static/packs/locales/glitch/hr.js index 1230ef6bd..fe52cd08c 100644 Binary files a/priv/static/packs/locales/glitch/hr.js and b/priv/static/packs/locales/glitch/hr.js differ diff --git a/priv/static/packs/locales/glitch/hr.js.map b/priv/static/packs/locales/glitch/hr.js.map index 8279a2ee3..fb5486977 100644 Binary files a/priv/static/packs/locales/glitch/hr.js.map and b/priv/static/packs/locales/glitch/hr.js.map differ diff --git a/priv/static/packs/locales/glitch/hu.js b/priv/static/packs/locales/glitch/hu.js index cb3f8fdc2..682ca2159 100644 Binary files a/priv/static/packs/locales/glitch/hu.js and b/priv/static/packs/locales/glitch/hu.js differ diff --git a/priv/static/packs/locales/glitch/hu.js.map b/priv/static/packs/locales/glitch/hu.js.map index 6cf72dd63..127ec071b 100644 Binary files a/priv/static/packs/locales/glitch/hu.js.map and b/priv/static/packs/locales/glitch/hu.js.map differ diff --git a/priv/static/packs/locales/glitch/hy.js b/priv/static/packs/locales/glitch/hy.js index cc7b75474..f2011b0e3 100644 Binary files a/priv/static/packs/locales/glitch/hy.js and b/priv/static/packs/locales/glitch/hy.js differ diff --git a/priv/static/packs/locales/glitch/hy.js.map b/priv/static/packs/locales/glitch/hy.js.map index 312575745..db9fdc1f9 100644 Binary files a/priv/static/packs/locales/glitch/hy.js.map and b/priv/static/packs/locales/glitch/hy.js.map differ diff --git a/priv/static/packs/locales/glitch/id.js b/priv/static/packs/locales/glitch/id.js index b6404585b..6ca78b22c 100644 Binary files a/priv/static/packs/locales/glitch/id.js and b/priv/static/packs/locales/glitch/id.js differ diff --git a/priv/static/packs/locales/glitch/id.js.map b/priv/static/packs/locales/glitch/id.js.map index b4dcf75b2..ab59c6e02 100644 Binary files a/priv/static/packs/locales/glitch/id.js.map and b/priv/static/packs/locales/glitch/id.js.map differ diff --git a/priv/static/packs/locales/glitch/io.js b/priv/static/packs/locales/glitch/io.js index 97a6738a0..074da73b8 100644 Binary files a/priv/static/packs/locales/glitch/io.js and b/priv/static/packs/locales/glitch/io.js differ diff --git a/priv/static/packs/locales/glitch/io.js.map b/priv/static/packs/locales/glitch/io.js.map index 5dab3979d..89999c4c1 100644 Binary files a/priv/static/packs/locales/glitch/io.js.map and b/priv/static/packs/locales/glitch/io.js.map differ diff --git a/priv/static/packs/locales/glitch/is.js b/priv/static/packs/locales/glitch/is.js index bc9b34f29..ec9436d27 100644 Binary files a/priv/static/packs/locales/glitch/is.js and b/priv/static/packs/locales/glitch/is.js differ diff --git a/priv/static/packs/locales/glitch/is.js.map b/priv/static/packs/locales/glitch/is.js.map index 30afc9926..054176ba2 100644 Binary files a/priv/static/packs/locales/glitch/is.js.map and b/priv/static/packs/locales/glitch/is.js.map differ diff --git a/priv/static/packs/locales/glitch/it.js b/priv/static/packs/locales/glitch/it.js index 9fbb63879..d43b84c3b 100644 Binary files a/priv/static/packs/locales/glitch/it.js and b/priv/static/packs/locales/glitch/it.js differ diff --git a/priv/static/packs/locales/glitch/it.js.map b/priv/static/packs/locales/glitch/it.js.map index 1b8965bcc..54575e8f4 100644 Binary files a/priv/static/packs/locales/glitch/it.js.map and b/priv/static/packs/locales/glitch/it.js.map differ diff --git a/priv/static/packs/locales/glitch/ja.js b/priv/static/packs/locales/glitch/ja.js index bb38c4897..a3b5e4e67 100644 Binary files a/priv/static/packs/locales/glitch/ja.js and b/priv/static/packs/locales/glitch/ja.js differ diff --git a/priv/static/packs/locales/glitch/ja.js.map b/priv/static/packs/locales/glitch/ja.js.map index 6cb25f836..85cff94e4 100644 Binary files a/priv/static/packs/locales/glitch/ja.js.map and b/priv/static/packs/locales/glitch/ja.js.map differ diff --git a/priv/static/packs/locales/glitch/ka.js b/priv/static/packs/locales/glitch/ka.js index e4b32a068..c68203d60 100644 Binary files a/priv/static/packs/locales/glitch/ka.js and b/priv/static/packs/locales/glitch/ka.js differ diff --git a/priv/static/packs/locales/glitch/ka.js.map b/priv/static/packs/locales/glitch/ka.js.map index 0e49e8a7a..51ec3c320 100644 Binary files a/priv/static/packs/locales/glitch/ka.js.map and b/priv/static/packs/locales/glitch/ka.js.map differ diff --git a/priv/static/packs/locales/glitch/kab.js b/priv/static/packs/locales/glitch/kab.js index 6cbce4c04..38367c712 100644 Binary files a/priv/static/packs/locales/glitch/kab.js and b/priv/static/packs/locales/glitch/kab.js differ diff --git a/priv/static/packs/locales/glitch/kab.js.map b/priv/static/packs/locales/glitch/kab.js.map index 28eed3207..0fb9d18d9 100644 Binary files a/priv/static/packs/locales/glitch/kab.js.map and b/priv/static/packs/locales/glitch/kab.js.map differ diff --git a/priv/static/packs/locales/glitch/kk.js b/priv/static/packs/locales/glitch/kk.js index 0faca2334..328c5caef 100644 Binary files a/priv/static/packs/locales/glitch/kk.js and b/priv/static/packs/locales/glitch/kk.js differ diff --git a/priv/static/packs/locales/glitch/kk.js.map b/priv/static/packs/locales/glitch/kk.js.map index e802ba374..71a3e55fd 100644 Binary files a/priv/static/packs/locales/glitch/kk.js.map and b/priv/static/packs/locales/glitch/kk.js.map differ diff --git a/priv/static/packs/locales/glitch/kn.js b/priv/static/packs/locales/glitch/kn.js index aeed46c13..d6920594d 100644 Binary files a/priv/static/packs/locales/glitch/kn.js and b/priv/static/packs/locales/glitch/kn.js differ diff --git a/priv/static/packs/locales/glitch/kn.js.map b/priv/static/packs/locales/glitch/kn.js.map index 77cb0271c..1d2cfb6e2 100644 Binary files a/priv/static/packs/locales/glitch/kn.js.map and b/priv/static/packs/locales/glitch/kn.js.map differ diff --git a/priv/static/packs/locales/glitch/ko.js b/priv/static/packs/locales/glitch/ko.js index 4600783d6..8ee071c52 100644 Binary files a/priv/static/packs/locales/glitch/ko.js and b/priv/static/packs/locales/glitch/ko.js differ diff --git a/priv/static/packs/locales/glitch/ko.js.map b/priv/static/packs/locales/glitch/ko.js.map index 4ced3f971..b3c6ad083 100644 Binary files a/priv/static/packs/locales/glitch/ko.js.map and b/priv/static/packs/locales/glitch/ko.js.map differ diff --git a/priv/static/packs/locales/glitch/lt.js b/priv/static/packs/locales/glitch/lt.js index 9c3f5bd03..f8374f9d2 100644 Binary files a/priv/static/packs/locales/glitch/lt.js and b/priv/static/packs/locales/glitch/lt.js differ diff --git a/priv/static/packs/locales/glitch/lt.js.map b/priv/static/packs/locales/glitch/lt.js.map index 7c0fc3d5b..93f2b59df 100644 Binary files a/priv/static/packs/locales/glitch/lt.js.map and b/priv/static/packs/locales/glitch/lt.js.map differ diff --git a/priv/static/packs/locales/glitch/lv.js b/priv/static/packs/locales/glitch/lv.js index 96162a9eb..a625417cd 100644 Binary files a/priv/static/packs/locales/glitch/lv.js and b/priv/static/packs/locales/glitch/lv.js differ diff --git a/priv/static/packs/locales/glitch/lv.js.map b/priv/static/packs/locales/glitch/lv.js.map index 0601ecdb6..034556730 100644 Binary files a/priv/static/packs/locales/glitch/lv.js.map and b/priv/static/packs/locales/glitch/lv.js.map differ diff --git a/priv/static/packs/locales/glitch/mk.js b/priv/static/packs/locales/glitch/mk.js index 3ab2cdcb2..d1aa2c57d 100644 Binary files a/priv/static/packs/locales/glitch/mk.js and b/priv/static/packs/locales/glitch/mk.js differ diff --git a/priv/static/packs/locales/glitch/mk.js.map b/priv/static/packs/locales/glitch/mk.js.map index 915ef6d06..650c0520c 100644 Binary files a/priv/static/packs/locales/glitch/mk.js.map and b/priv/static/packs/locales/glitch/mk.js.map differ diff --git a/priv/static/packs/locales/glitch/ml.js b/priv/static/packs/locales/glitch/ml.js index 28123c440..817c72647 100644 Binary files a/priv/static/packs/locales/glitch/ml.js and b/priv/static/packs/locales/glitch/ml.js differ diff --git a/priv/static/packs/locales/glitch/ml.js.map b/priv/static/packs/locales/glitch/ml.js.map index 3711ae7df..319cca685 100644 Binary files a/priv/static/packs/locales/glitch/ml.js.map and b/priv/static/packs/locales/glitch/ml.js.map differ diff --git a/priv/static/packs/locales/glitch/mr.js b/priv/static/packs/locales/glitch/mr.js index 7f30dc141..73ede96fe 100644 Binary files a/priv/static/packs/locales/glitch/mr.js and b/priv/static/packs/locales/glitch/mr.js differ diff --git a/priv/static/packs/locales/glitch/mr.js.map b/priv/static/packs/locales/glitch/mr.js.map index 87356e45b..f6ee01063 100644 Binary files a/priv/static/packs/locales/glitch/mr.js.map and b/priv/static/packs/locales/glitch/mr.js.map differ diff --git a/priv/static/packs/locales/glitch/ms.js b/priv/static/packs/locales/glitch/ms.js index 6f4a4f059..549ef5cdc 100644 Binary files a/priv/static/packs/locales/glitch/ms.js and b/priv/static/packs/locales/glitch/ms.js differ diff --git a/priv/static/packs/locales/glitch/ms.js.map b/priv/static/packs/locales/glitch/ms.js.map index 7ab26e470..c3814701a 100644 Binary files a/priv/static/packs/locales/glitch/ms.js.map and b/priv/static/packs/locales/glitch/ms.js.map differ diff --git a/priv/static/packs/locales/glitch/nl.js b/priv/static/packs/locales/glitch/nl.js index 59c26947e..e38907733 100644 Binary files a/priv/static/packs/locales/glitch/nl.js and b/priv/static/packs/locales/glitch/nl.js differ diff --git a/priv/static/packs/locales/glitch/nl.js.map b/priv/static/packs/locales/glitch/nl.js.map index 501dd33b9..f975976d6 100644 Binary files a/priv/static/packs/locales/glitch/nl.js.map and b/priv/static/packs/locales/glitch/nl.js.map differ diff --git a/priv/static/packs/locales/glitch/nn.js b/priv/static/packs/locales/glitch/nn.js index b58e0e0e9..3aefbec9c 100644 Binary files a/priv/static/packs/locales/glitch/nn.js and b/priv/static/packs/locales/glitch/nn.js differ diff --git a/priv/static/packs/locales/glitch/nn.js.map b/priv/static/packs/locales/glitch/nn.js.map index ef2bd2759..fc106bc1a 100644 Binary files a/priv/static/packs/locales/glitch/nn.js.map and b/priv/static/packs/locales/glitch/nn.js.map differ diff --git a/priv/static/packs/locales/glitch/no.js b/priv/static/packs/locales/glitch/no.js index 6f372666b..d386209be 100644 Binary files a/priv/static/packs/locales/glitch/no.js and b/priv/static/packs/locales/glitch/no.js differ diff --git a/priv/static/packs/locales/glitch/no.js.map b/priv/static/packs/locales/glitch/no.js.map index 375fb7e7f..f1b9b20c9 100644 Binary files a/priv/static/packs/locales/glitch/no.js.map and b/priv/static/packs/locales/glitch/no.js.map differ diff --git a/priv/static/packs/locales/glitch/oc.js b/priv/static/packs/locales/glitch/oc.js index 56bed8938..820d2dc81 100644 Binary files a/priv/static/packs/locales/glitch/oc.js and b/priv/static/packs/locales/glitch/oc.js differ diff --git a/priv/static/packs/locales/glitch/oc.js.map b/priv/static/packs/locales/glitch/oc.js.map index 24974675c..29b6cbdb1 100644 Binary files a/priv/static/packs/locales/glitch/oc.js.map and b/priv/static/packs/locales/glitch/oc.js.map differ diff --git a/priv/static/packs/locales/glitch/pl.js b/priv/static/packs/locales/glitch/pl.js index d1684d3a2..7bdeb1088 100644 Binary files a/priv/static/packs/locales/glitch/pl.js and b/priv/static/packs/locales/glitch/pl.js differ diff --git a/priv/static/packs/locales/glitch/pl.js.map b/priv/static/packs/locales/glitch/pl.js.map index 7bfd358ee..470de5ebe 100644 Binary files a/priv/static/packs/locales/glitch/pl.js.map and b/priv/static/packs/locales/glitch/pl.js.map differ diff --git a/priv/static/packs/locales/glitch/pt-BR.js b/priv/static/packs/locales/glitch/pt-BR.js index dbd2e04c9..08950cd4d 100644 Binary files a/priv/static/packs/locales/glitch/pt-BR.js and b/priv/static/packs/locales/glitch/pt-BR.js differ diff --git a/priv/static/packs/locales/glitch/pt-BR.js.map b/priv/static/packs/locales/glitch/pt-BR.js.map index b27f848cc..584e0e410 100644 Binary files a/priv/static/packs/locales/glitch/pt-BR.js.map and b/priv/static/packs/locales/glitch/pt-BR.js.map differ diff --git a/priv/static/packs/locales/glitch/pt-PT.js b/priv/static/packs/locales/glitch/pt-PT.js index 09f100392..83d72b3fc 100644 Binary files a/priv/static/packs/locales/glitch/pt-PT.js and b/priv/static/packs/locales/glitch/pt-PT.js differ diff --git a/priv/static/packs/locales/glitch/pt-PT.js.map b/priv/static/packs/locales/glitch/pt-PT.js.map index f3f1d1200..51a2aa03f 100644 Binary files a/priv/static/packs/locales/glitch/pt-PT.js.map and b/priv/static/packs/locales/glitch/pt-PT.js.map differ diff --git a/priv/static/packs/locales/glitch/ro.js b/priv/static/packs/locales/glitch/ro.js index 2bec5b1d1..667af3651 100644 Binary files a/priv/static/packs/locales/glitch/ro.js and b/priv/static/packs/locales/glitch/ro.js differ diff --git a/priv/static/packs/locales/glitch/ro.js.map b/priv/static/packs/locales/glitch/ro.js.map index fccc7736d..3fd116429 100644 Binary files a/priv/static/packs/locales/glitch/ro.js.map and b/priv/static/packs/locales/glitch/ro.js.map differ diff --git a/priv/static/packs/locales/glitch/ru.js b/priv/static/packs/locales/glitch/ru.js index 6caa8d668..44c66bd7d 100644 Binary files a/priv/static/packs/locales/glitch/ru.js and b/priv/static/packs/locales/glitch/ru.js differ diff --git a/priv/static/packs/locales/glitch/ru.js.map b/priv/static/packs/locales/glitch/ru.js.map index 88dba64a9..f4bcd78fb 100644 Binary files a/priv/static/packs/locales/glitch/ru.js.map and b/priv/static/packs/locales/glitch/ru.js.map differ diff --git a/priv/static/packs/locales/glitch/sk.js b/priv/static/packs/locales/glitch/sk.js index 65e1e5e8a..9476a2f58 100644 Binary files a/priv/static/packs/locales/glitch/sk.js and b/priv/static/packs/locales/glitch/sk.js differ diff --git a/priv/static/packs/locales/glitch/sk.js.map b/priv/static/packs/locales/glitch/sk.js.map index a6f88af3c..747cb346d 100644 Binary files a/priv/static/packs/locales/glitch/sk.js.map and b/priv/static/packs/locales/glitch/sk.js.map differ diff --git a/priv/static/packs/locales/glitch/sl.js b/priv/static/packs/locales/glitch/sl.js index 6e1e09a12..4d99f2414 100644 Binary files a/priv/static/packs/locales/glitch/sl.js and b/priv/static/packs/locales/glitch/sl.js differ diff --git a/priv/static/packs/locales/glitch/sl.js.map b/priv/static/packs/locales/glitch/sl.js.map index ab1bc4134..805563fa1 100644 Binary files a/priv/static/packs/locales/glitch/sl.js.map and b/priv/static/packs/locales/glitch/sl.js.map differ diff --git a/priv/static/packs/locales/glitch/sq.js b/priv/static/packs/locales/glitch/sq.js index 3c01b8e28..3b0bcce3b 100644 Binary files a/priv/static/packs/locales/glitch/sq.js and b/priv/static/packs/locales/glitch/sq.js differ diff --git a/priv/static/packs/locales/glitch/sq.js.map b/priv/static/packs/locales/glitch/sq.js.map index d2f5392e3..17be693bf 100644 Binary files a/priv/static/packs/locales/glitch/sq.js.map and b/priv/static/packs/locales/glitch/sq.js.map differ diff --git a/priv/static/packs/locales/glitch/sr-Latn.js b/priv/static/packs/locales/glitch/sr-Latn.js index fb2be7e67..7613638cb 100644 Binary files a/priv/static/packs/locales/glitch/sr-Latn.js and b/priv/static/packs/locales/glitch/sr-Latn.js differ diff --git a/priv/static/packs/locales/glitch/sr-Latn.js.map b/priv/static/packs/locales/glitch/sr-Latn.js.map index 3557bb908..89ab44978 100644 Binary files a/priv/static/packs/locales/glitch/sr-Latn.js.map and b/priv/static/packs/locales/glitch/sr-Latn.js.map differ diff --git a/priv/static/packs/locales/glitch/sr.js b/priv/static/packs/locales/glitch/sr.js index 7d9c50942..e772dda4f 100644 Binary files a/priv/static/packs/locales/glitch/sr.js and b/priv/static/packs/locales/glitch/sr.js differ diff --git a/priv/static/packs/locales/glitch/sr.js.map b/priv/static/packs/locales/glitch/sr.js.map index 44f0dbb70..cf7001869 100644 Binary files a/priv/static/packs/locales/glitch/sr.js.map and b/priv/static/packs/locales/glitch/sr.js.map differ diff --git a/priv/static/packs/locales/glitch/sv.js b/priv/static/packs/locales/glitch/sv.js index feda6682c..549120a2a 100644 Binary files a/priv/static/packs/locales/glitch/sv.js and b/priv/static/packs/locales/glitch/sv.js differ diff --git a/priv/static/packs/locales/glitch/sv.js.map b/priv/static/packs/locales/glitch/sv.js.map index 367a2e89c..6db7b18b9 100644 Binary files a/priv/static/packs/locales/glitch/sv.js.map and b/priv/static/packs/locales/glitch/sv.js.map differ diff --git a/priv/static/packs/locales/glitch/ta.js b/priv/static/packs/locales/glitch/ta.js index 81fe1ff5e..ec8b2b111 100644 Binary files a/priv/static/packs/locales/glitch/ta.js and b/priv/static/packs/locales/glitch/ta.js differ diff --git a/priv/static/packs/locales/glitch/ta.js.map b/priv/static/packs/locales/glitch/ta.js.map index a67fb4e1f..b7e271261 100644 Binary files a/priv/static/packs/locales/glitch/ta.js.map and b/priv/static/packs/locales/glitch/ta.js.map differ diff --git a/priv/static/packs/locales/glitch/te.js b/priv/static/packs/locales/glitch/te.js index 9ff95c237..d7e85ee36 100644 Binary files a/priv/static/packs/locales/glitch/te.js and b/priv/static/packs/locales/glitch/te.js differ diff --git a/priv/static/packs/locales/glitch/te.js.map b/priv/static/packs/locales/glitch/te.js.map index a5f81b52a..a58e520cb 100644 Binary files a/priv/static/packs/locales/glitch/te.js.map and b/priv/static/packs/locales/glitch/te.js.map differ diff --git a/priv/static/packs/locales/glitch/th.js b/priv/static/packs/locales/glitch/th.js index d86f43e10..4cbdcbcf5 100644 Binary files a/priv/static/packs/locales/glitch/th.js and b/priv/static/packs/locales/glitch/th.js differ diff --git a/priv/static/packs/locales/glitch/th.js.map b/priv/static/packs/locales/glitch/th.js.map index 4e17eb892..65e5c656b 100644 Binary files a/priv/static/packs/locales/glitch/th.js.map and b/priv/static/packs/locales/glitch/th.js.map differ diff --git a/priv/static/packs/locales/glitch/tr.js b/priv/static/packs/locales/glitch/tr.js index 091ec391b..5c6386138 100644 Binary files a/priv/static/packs/locales/glitch/tr.js and b/priv/static/packs/locales/glitch/tr.js differ diff --git a/priv/static/packs/locales/glitch/tr.js.map b/priv/static/packs/locales/glitch/tr.js.map index b8ab1f599..0ed931331 100644 Binary files a/priv/static/packs/locales/glitch/tr.js.map and b/priv/static/packs/locales/glitch/tr.js.map differ diff --git a/priv/static/packs/locales/glitch/uk.js b/priv/static/packs/locales/glitch/uk.js index fc00bdc76..04388c934 100644 Binary files a/priv/static/packs/locales/glitch/uk.js and b/priv/static/packs/locales/glitch/uk.js differ diff --git a/priv/static/packs/locales/glitch/uk.js.map b/priv/static/packs/locales/glitch/uk.js.map index 7ec9350cf..803672f6f 100644 Binary files a/priv/static/packs/locales/glitch/uk.js.map and b/priv/static/packs/locales/glitch/uk.js.map differ diff --git a/priv/static/packs/locales/glitch/ur.js b/priv/static/packs/locales/glitch/ur.js index c365028a1..cb9988dd4 100644 Binary files a/priv/static/packs/locales/glitch/ur.js and b/priv/static/packs/locales/glitch/ur.js differ diff --git a/priv/static/packs/locales/glitch/ur.js.map b/priv/static/packs/locales/glitch/ur.js.map index 8df87f4e4..204bc365f 100644 Binary files a/priv/static/packs/locales/glitch/ur.js.map and b/priv/static/packs/locales/glitch/ur.js.map differ diff --git a/priv/static/packs/locales/glitch/vi.js b/priv/static/packs/locales/glitch/vi.js index c881b97ff..b45ffbc87 100644 Binary files a/priv/static/packs/locales/glitch/vi.js and b/priv/static/packs/locales/glitch/vi.js differ diff --git a/priv/static/packs/locales/glitch/vi.js.map b/priv/static/packs/locales/glitch/vi.js.map index 6b0faec01..11fc5629a 100644 Binary files a/priv/static/packs/locales/glitch/vi.js.map and b/priv/static/packs/locales/glitch/vi.js.map differ diff --git a/priv/static/packs/locales/glitch/zh-CN.js b/priv/static/packs/locales/glitch/zh-CN.js index c6ed12a3a..e3fbce7e1 100644 Binary files a/priv/static/packs/locales/glitch/zh-CN.js and b/priv/static/packs/locales/glitch/zh-CN.js differ diff --git a/priv/static/packs/locales/glitch/zh-CN.js.map b/priv/static/packs/locales/glitch/zh-CN.js.map index 024666d64..96a461367 100644 Binary files a/priv/static/packs/locales/glitch/zh-CN.js.map and b/priv/static/packs/locales/glitch/zh-CN.js.map differ diff --git a/priv/static/packs/locales/glitch/zh-HK.js b/priv/static/packs/locales/glitch/zh-HK.js index 79aafff13..0690558e6 100644 Binary files a/priv/static/packs/locales/glitch/zh-HK.js and b/priv/static/packs/locales/glitch/zh-HK.js differ diff --git a/priv/static/packs/locales/glitch/zh-HK.js.map b/priv/static/packs/locales/glitch/zh-HK.js.map index 18dd8ffad..1b64d826f 100644 Binary files a/priv/static/packs/locales/glitch/zh-HK.js.map and b/priv/static/packs/locales/glitch/zh-HK.js.map differ diff --git a/priv/static/packs/locales/glitch/zh-TW.js b/priv/static/packs/locales/glitch/zh-TW.js index 5ec359e10..4a9ec7186 100644 Binary files a/priv/static/packs/locales/glitch/zh-TW.js and b/priv/static/packs/locales/glitch/zh-TW.js differ diff --git a/priv/static/packs/locales/glitch/zh-TW.js.map b/priv/static/packs/locales/glitch/zh-TW.js.map index bb0634947..ef62a54ff 100644 Binary files a/priv/static/packs/locales/glitch/zh-TW.js.map and b/priv/static/packs/locales/glitch/zh-TW.js.map differ diff --git a/priv/static/packs/locales/vanilla/ar.js b/priv/static/packs/locales/vanilla/ar.js index 1dd13b40f..6b4181bd5 100644 Binary files a/priv/static/packs/locales/vanilla/ar.js and b/priv/static/packs/locales/vanilla/ar.js differ diff --git a/priv/static/packs/locales/vanilla/ar.js.map b/priv/static/packs/locales/vanilla/ar.js.map index 7e305f0cf..1802fd3f8 100644 Binary files a/priv/static/packs/locales/vanilla/ar.js.map and b/priv/static/packs/locales/vanilla/ar.js.map differ diff --git a/priv/static/packs/locales/vanilla/ast.js b/priv/static/packs/locales/vanilla/ast.js index 0b505c496..376afbe70 100644 Binary files a/priv/static/packs/locales/vanilla/ast.js and b/priv/static/packs/locales/vanilla/ast.js differ diff --git a/priv/static/packs/locales/vanilla/ast.js.map b/priv/static/packs/locales/vanilla/ast.js.map index dae5f5c19..ac9e083d8 100644 Binary files a/priv/static/packs/locales/vanilla/ast.js.map and b/priv/static/packs/locales/vanilla/ast.js.map differ diff --git a/priv/static/packs/locales/vanilla/bg.js b/priv/static/packs/locales/vanilla/bg.js index a2389e8f1..272033cc2 100644 Binary files a/priv/static/packs/locales/vanilla/bg.js and b/priv/static/packs/locales/vanilla/bg.js differ diff --git a/priv/static/packs/locales/vanilla/bg.js.map b/priv/static/packs/locales/vanilla/bg.js.map index 0df1dbb7e..ec253ea61 100644 Binary files a/priv/static/packs/locales/vanilla/bg.js.map and b/priv/static/packs/locales/vanilla/bg.js.map differ diff --git a/priv/static/packs/locales/vanilla/bn.js b/priv/static/packs/locales/vanilla/bn.js index 24f8b350f..ebdf68537 100644 Binary files a/priv/static/packs/locales/vanilla/bn.js and b/priv/static/packs/locales/vanilla/bn.js differ diff --git a/priv/static/packs/locales/vanilla/bn.js.map b/priv/static/packs/locales/vanilla/bn.js.map index deb68b0a5..45a9c014e 100644 Binary files a/priv/static/packs/locales/vanilla/bn.js.map and b/priv/static/packs/locales/vanilla/bn.js.map differ diff --git a/priv/static/packs/locales/vanilla/br.js b/priv/static/packs/locales/vanilla/br.js index 741262bf4..f6ab20245 100644 Binary files a/priv/static/packs/locales/vanilla/br.js and b/priv/static/packs/locales/vanilla/br.js differ diff --git a/priv/static/packs/locales/vanilla/br.js.map b/priv/static/packs/locales/vanilla/br.js.map index 994a36723..6d53acc51 100644 Binary files a/priv/static/packs/locales/vanilla/br.js.map and b/priv/static/packs/locales/vanilla/br.js.map differ diff --git a/priv/static/packs/locales/vanilla/ca.js b/priv/static/packs/locales/vanilla/ca.js index 2b5adff9d..e8453b5b9 100644 Binary files a/priv/static/packs/locales/vanilla/ca.js and b/priv/static/packs/locales/vanilla/ca.js differ diff --git a/priv/static/packs/locales/vanilla/ca.js.map b/priv/static/packs/locales/vanilla/ca.js.map index 35c2ed352..b0f1a6789 100644 Binary files a/priv/static/packs/locales/vanilla/ca.js.map and b/priv/static/packs/locales/vanilla/ca.js.map differ diff --git a/priv/static/packs/locales/vanilla/co.js b/priv/static/packs/locales/vanilla/co.js index c2bf0f920..9bbc5f461 100644 Binary files a/priv/static/packs/locales/vanilla/co.js and b/priv/static/packs/locales/vanilla/co.js differ diff --git a/priv/static/packs/locales/vanilla/co.js.map b/priv/static/packs/locales/vanilla/co.js.map index ec94caa16..303dbdf41 100644 Binary files a/priv/static/packs/locales/vanilla/co.js.map and b/priv/static/packs/locales/vanilla/co.js.map differ diff --git a/priv/static/packs/locales/vanilla/cs.js b/priv/static/packs/locales/vanilla/cs.js index 1272736fd..d5ea53c06 100644 Binary files a/priv/static/packs/locales/vanilla/cs.js and b/priv/static/packs/locales/vanilla/cs.js differ diff --git a/priv/static/packs/locales/vanilla/cs.js.map b/priv/static/packs/locales/vanilla/cs.js.map index 2fcac0fd2..253a990b7 100644 Binary files a/priv/static/packs/locales/vanilla/cs.js.map and b/priv/static/packs/locales/vanilla/cs.js.map differ diff --git a/priv/static/packs/locales/vanilla/cy.js b/priv/static/packs/locales/vanilla/cy.js index d6edb602c..9c41b6da4 100644 Binary files a/priv/static/packs/locales/vanilla/cy.js and b/priv/static/packs/locales/vanilla/cy.js differ diff --git a/priv/static/packs/locales/vanilla/cy.js.map b/priv/static/packs/locales/vanilla/cy.js.map index 83b72c10b..33ea782c7 100644 Binary files a/priv/static/packs/locales/vanilla/cy.js.map and b/priv/static/packs/locales/vanilla/cy.js.map differ diff --git a/priv/static/packs/locales/vanilla/da.js b/priv/static/packs/locales/vanilla/da.js index 139341108..6f12d46dc 100644 Binary files a/priv/static/packs/locales/vanilla/da.js and b/priv/static/packs/locales/vanilla/da.js differ diff --git a/priv/static/packs/locales/vanilla/da.js.map b/priv/static/packs/locales/vanilla/da.js.map index 0f8da806a..c3d938e88 100644 Binary files a/priv/static/packs/locales/vanilla/da.js.map and b/priv/static/packs/locales/vanilla/da.js.map differ diff --git a/priv/static/packs/locales/vanilla/de.js b/priv/static/packs/locales/vanilla/de.js index fe0e254e4..268accd2f 100644 Binary files a/priv/static/packs/locales/vanilla/de.js and b/priv/static/packs/locales/vanilla/de.js differ diff --git a/priv/static/packs/locales/vanilla/de.js.map b/priv/static/packs/locales/vanilla/de.js.map index a33f920c0..3b1203043 100644 Binary files a/priv/static/packs/locales/vanilla/de.js.map and b/priv/static/packs/locales/vanilla/de.js.map differ diff --git a/priv/static/packs/locales/vanilla/el.js b/priv/static/packs/locales/vanilla/el.js index 57efdd693..2dd5a9895 100644 Binary files a/priv/static/packs/locales/vanilla/el.js and b/priv/static/packs/locales/vanilla/el.js differ diff --git a/priv/static/packs/locales/vanilla/el.js.map b/priv/static/packs/locales/vanilla/el.js.map index a0b0f7f07..612980507 100644 Binary files a/priv/static/packs/locales/vanilla/el.js.map and b/priv/static/packs/locales/vanilla/el.js.map differ diff --git a/priv/static/packs/locales/vanilla/en.js b/priv/static/packs/locales/vanilla/en.js index ff8617a8f..226dde828 100644 Binary files a/priv/static/packs/locales/vanilla/en.js and b/priv/static/packs/locales/vanilla/en.js differ diff --git a/priv/static/packs/locales/vanilla/en.js.map b/priv/static/packs/locales/vanilla/en.js.map index 6c29e9803..2c5d92626 100644 Binary files a/priv/static/packs/locales/vanilla/en.js.map and b/priv/static/packs/locales/vanilla/en.js.map differ diff --git a/priv/static/packs/locales/vanilla/eo.js b/priv/static/packs/locales/vanilla/eo.js index c92427011..74d3bf896 100644 Binary files a/priv/static/packs/locales/vanilla/eo.js and b/priv/static/packs/locales/vanilla/eo.js differ diff --git a/priv/static/packs/locales/vanilla/eo.js.map b/priv/static/packs/locales/vanilla/eo.js.map index d271c3a2a..4aa69e848 100644 Binary files a/priv/static/packs/locales/vanilla/eo.js.map and b/priv/static/packs/locales/vanilla/eo.js.map differ diff --git a/priv/static/packs/locales/vanilla/es-AR.js b/priv/static/packs/locales/vanilla/es-AR.js index 6552d0ce3..1cd0935b2 100644 Binary files a/priv/static/packs/locales/vanilla/es-AR.js and b/priv/static/packs/locales/vanilla/es-AR.js differ diff --git a/priv/static/packs/locales/vanilla/es-AR.js.map b/priv/static/packs/locales/vanilla/es-AR.js.map index 297ef325e..9fdd3bde5 100644 Binary files a/priv/static/packs/locales/vanilla/es-AR.js.map and b/priv/static/packs/locales/vanilla/es-AR.js.map differ diff --git a/priv/static/packs/locales/vanilla/es.js b/priv/static/packs/locales/vanilla/es.js index ed37b0006..b2079bd66 100644 Binary files a/priv/static/packs/locales/vanilla/es.js and b/priv/static/packs/locales/vanilla/es.js differ diff --git a/priv/static/packs/locales/vanilla/es.js.map b/priv/static/packs/locales/vanilla/es.js.map index 38d258c9a..7f6210e0b 100644 Binary files a/priv/static/packs/locales/vanilla/es.js.map and b/priv/static/packs/locales/vanilla/es.js.map differ diff --git a/priv/static/packs/locales/vanilla/et.js b/priv/static/packs/locales/vanilla/et.js index b3df9d742..34a94d107 100644 Binary files a/priv/static/packs/locales/vanilla/et.js and b/priv/static/packs/locales/vanilla/et.js differ diff --git a/priv/static/packs/locales/vanilla/et.js.map b/priv/static/packs/locales/vanilla/et.js.map index a61d60808..394bb7428 100644 Binary files a/priv/static/packs/locales/vanilla/et.js.map and b/priv/static/packs/locales/vanilla/et.js.map differ diff --git a/priv/static/packs/locales/vanilla/eu.js b/priv/static/packs/locales/vanilla/eu.js index b448e0fc3..30cd4e43c 100644 Binary files a/priv/static/packs/locales/vanilla/eu.js and b/priv/static/packs/locales/vanilla/eu.js differ diff --git a/priv/static/packs/locales/vanilla/eu.js.map b/priv/static/packs/locales/vanilla/eu.js.map index 17dc81b17..e22dd44c5 100644 Binary files a/priv/static/packs/locales/vanilla/eu.js.map and b/priv/static/packs/locales/vanilla/eu.js.map differ diff --git a/priv/static/packs/locales/vanilla/fa.js b/priv/static/packs/locales/vanilla/fa.js index 8646e092d..b616d72a6 100644 Binary files a/priv/static/packs/locales/vanilla/fa.js and b/priv/static/packs/locales/vanilla/fa.js differ diff --git a/priv/static/packs/locales/vanilla/fa.js.map b/priv/static/packs/locales/vanilla/fa.js.map index b5cd146cb..3ec9c2377 100644 Binary files a/priv/static/packs/locales/vanilla/fa.js.map and b/priv/static/packs/locales/vanilla/fa.js.map differ diff --git a/priv/static/packs/locales/vanilla/fi.js b/priv/static/packs/locales/vanilla/fi.js index 43aa01ba3..4a1631a4d 100644 Binary files a/priv/static/packs/locales/vanilla/fi.js and b/priv/static/packs/locales/vanilla/fi.js differ diff --git a/priv/static/packs/locales/vanilla/fi.js.map b/priv/static/packs/locales/vanilla/fi.js.map index 752201541..debb697d9 100644 Binary files a/priv/static/packs/locales/vanilla/fi.js.map and b/priv/static/packs/locales/vanilla/fi.js.map differ diff --git a/priv/static/packs/locales/vanilla/fr.js b/priv/static/packs/locales/vanilla/fr.js index 96d12e8f5..431bd4ae7 100644 Binary files a/priv/static/packs/locales/vanilla/fr.js and b/priv/static/packs/locales/vanilla/fr.js differ diff --git a/priv/static/packs/locales/vanilla/fr.js.map b/priv/static/packs/locales/vanilla/fr.js.map index ea38b4b8c..b6324ca17 100644 Binary files a/priv/static/packs/locales/vanilla/fr.js.map and b/priv/static/packs/locales/vanilla/fr.js.map differ diff --git a/priv/static/packs/locales/vanilla/ga.js b/priv/static/packs/locales/vanilla/ga.js index 75596c19f..8b98545b3 100644 Binary files a/priv/static/packs/locales/vanilla/ga.js and b/priv/static/packs/locales/vanilla/ga.js differ diff --git a/priv/static/packs/locales/vanilla/ga.js.map b/priv/static/packs/locales/vanilla/ga.js.map index 04c200127..c0303f4f9 100644 Binary files a/priv/static/packs/locales/vanilla/ga.js.map and b/priv/static/packs/locales/vanilla/ga.js.map differ diff --git a/priv/static/packs/locales/vanilla/gl.js b/priv/static/packs/locales/vanilla/gl.js index 0cc410ca4..e0c3e6a38 100644 Binary files a/priv/static/packs/locales/vanilla/gl.js and b/priv/static/packs/locales/vanilla/gl.js differ diff --git a/priv/static/packs/locales/vanilla/gl.js.map b/priv/static/packs/locales/vanilla/gl.js.map index 100c44bb0..9f305218a 100644 Binary files a/priv/static/packs/locales/vanilla/gl.js.map and b/priv/static/packs/locales/vanilla/gl.js.map differ diff --git a/priv/static/packs/locales/vanilla/he.js b/priv/static/packs/locales/vanilla/he.js index 44cb712d9..73d91419a 100644 Binary files a/priv/static/packs/locales/vanilla/he.js and b/priv/static/packs/locales/vanilla/he.js differ diff --git a/priv/static/packs/locales/vanilla/he.js.map b/priv/static/packs/locales/vanilla/he.js.map index cd36595c2..c98587628 100644 Binary files a/priv/static/packs/locales/vanilla/he.js.map and b/priv/static/packs/locales/vanilla/he.js.map differ diff --git a/priv/static/packs/locales/vanilla/hi.js b/priv/static/packs/locales/vanilla/hi.js index 8ce3abc13..27a6eb946 100644 Binary files a/priv/static/packs/locales/vanilla/hi.js and b/priv/static/packs/locales/vanilla/hi.js differ diff --git a/priv/static/packs/locales/vanilla/hi.js.map b/priv/static/packs/locales/vanilla/hi.js.map index 088cac143..7a5858596 100644 Binary files a/priv/static/packs/locales/vanilla/hi.js.map and b/priv/static/packs/locales/vanilla/hi.js.map differ diff --git a/priv/static/packs/locales/vanilla/hr.js b/priv/static/packs/locales/vanilla/hr.js index 5e81ef38e..d8d788315 100644 Binary files a/priv/static/packs/locales/vanilla/hr.js and b/priv/static/packs/locales/vanilla/hr.js differ diff --git a/priv/static/packs/locales/vanilla/hr.js.map b/priv/static/packs/locales/vanilla/hr.js.map index 61803b58f..f9c432fb6 100644 Binary files a/priv/static/packs/locales/vanilla/hr.js.map and b/priv/static/packs/locales/vanilla/hr.js.map differ diff --git a/priv/static/packs/locales/vanilla/hu.js b/priv/static/packs/locales/vanilla/hu.js index df5aec299..f1e7682d6 100644 Binary files a/priv/static/packs/locales/vanilla/hu.js and b/priv/static/packs/locales/vanilla/hu.js differ diff --git a/priv/static/packs/locales/vanilla/hu.js.map b/priv/static/packs/locales/vanilla/hu.js.map index 37d4b7e91..220a6e92b 100644 Binary files a/priv/static/packs/locales/vanilla/hu.js.map and b/priv/static/packs/locales/vanilla/hu.js.map differ diff --git a/priv/static/packs/locales/vanilla/hy.js b/priv/static/packs/locales/vanilla/hy.js index 0ee6fe350..f21e393eb 100644 Binary files a/priv/static/packs/locales/vanilla/hy.js and b/priv/static/packs/locales/vanilla/hy.js differ diff --git a/priv/static/packs/locales/vanilla/hy.js.map b/priv/static/packs/locales/vanilla/hy.js.map index 1647a44dd..a395c87fe 100644 Binary files a/priv/static/packs/locales/vanilla/hy.js.map and b/priv/static/packs/locales/vanilla/hy.js.map differ diff --git a/priv/static/packs/locales/vanilla/id.js b/priv/static/packs/locales/vanilla/id.js index 0bf8d76cd..6591b818a 100644 Binary files a/priv/static/packs/locales/vanilla/id.js and b/priv/static/packs/locales/vanilla/id.js differ diff --git a/priv/static/packs/locales/vanilla/id.js.map b/priv/static/packs/locales/vanilla/id.js.map index 3bad1633a..d0f909013 100644 Binary files a/priv/static/packs/locales/vanilla/id.js.map and b/priv/static/packs/locales/vanilla/id.js.map differ diff --git a/priv/static/packs/locales/vanilla/io.js b/priv/static/packs/locales/vanilla/io.js index 204797e62..22f39d73a 100644 Binary files a/priv/static/packs/locales/vanilla/io.js and b/priv/static/packs/locales/vanilla/io.js differ diff --git a/priv/static/packs/locales/vanilla/io.js.map b/priv/static/packs/locales/vanilla/io.js.map index 358b74e3a..11d01d926 100644 Binary files a/priv/static/packs/locales/vanilla/io.js.map and b/priv/static/packs/locales/vanilla/io.js.map differ diff --git a/priv/static/packs/locales/vanilla/is.js b/priv/static/packs/locales/vanilla/is.js index a5002812b..05db56dfd 100644 Binary files a/priv/static/packs/locales/vanilla/is.js and b/priv/static/packs/locales/vanilla/is.js differ diff --git a/priv/static/packs/locales/vanilla/is.js.map b/priv/static/packs/locales/vanilla/is.js.map index 0da088d4d..e45da8547 100644 Binary files a/priv/static/packs/locales/vanilla/is.js.map and b/priv/static/packs/locales/vanilla/is.js.map differ diff --git a/priv/static/packs/locales/vanilla/it.js b/priv/static/packs/locales/vanilla/it.js index 4779ebdbb..f8877398f 100644 Binary files a/priv/static/packs/locales/vanilla/it.js and b/priv/static/packs/locales/vanilla/it.js differ diff --git a/priv/static/packs/locales/vanilla/it.js.map b/priv/static/packs/locales/vanilla/it.js.map index 1cc7b2ef4..79aed8726 100644 Binary files a/priv/static/packs/locales/vanilla/it.js.map and b/priv/static/packs/locales/vanilla/it.js.map differ diff --git a/priv/static/packs/locales/vanilla/ja.js b/priv/static/packs/locales/vanilla/ja.js index c45f7b0fe..99efb72a3 100644 Binary files a/priv/static/packs/locales/vanilla/ja.js and b/priv/static/packs/locales/vanilla/ja.js differ diff --git a/priv/static/packs/locales/vanilla/ja.js.map b/priv/static/packs/locales/vanilla/ja.js.map index df85f46fc..8a7d4edb0 100644 Binary files a/priv/static/packs/locales/vanilla/ja.js.map and b/priv/static/packs/locales/vanilla/ja.js.map differ diff --git a/priv/static/packs/locales/vanilla/ka.js b/priv/static/packs/locales/vanilla/ka.js index e0670762a..6091581a1 100644 Binary files a/priv/static/packs/locales/vanilla/ka.js and b/priv/static/packs/locales/vanilla/ka.js differ diff --git a/priv/static/packs/locales/vanilla/ka.js.map b/priv/static/packs/locales/vanilla/ka.js.map index 4e4743f35..aa254d9ab 100644 Binary files a/priv/static/packs/locales/vanilla/ka.js.map and b/priv/static/packs/locales/vanilla/ka.js.map differ diff --git a/priv/static/packs/locales/vanilla/kab.js b/priv/static/packs/locales/vanilla/kab.js index b6082022e..b9001a1cc 100644 Binary files a/priv/static/packs/locales/vanilla/kab.js and b/priv/static/packs/locales/vanilla/kab.js differ diff --git a/priv/static/packs/locales/vanilla/kab.js.map b/priv/static/packs/locales/vanilla/kab.js.map index 86bf00317..148c3351a 100644 Binary files a/priv/static/packs/locales/vanilla/kab.js.map and b/priv/static/packs/locales/vanilla/kab.js.map differ diff --git a/priv/static/packs/locales/vanilla/kk.js b/priv/static/packs/locales/vanilla/kk.js index bc99a54bb..f74b2cb3d 100644 Binary files a/priv/static/packs/locales/vanilla/kk.js and b/priv/static/packs/locales/vanilla/kk.js differ diff --git a/priv/static/packs/locales/vanilla/kk.js.map b/priv/static/packs/locales/vanilla/kk.js.map index 357325795..ced32c979 100644 Binary files a/priv/static/packs/locales/vanilla/kk.js.map and b/priv/static/packs/locales/vanilla/kk.js.map differ diff --git a/priv/static/packs/locales/vanilla/kn.js b/priv/static/packs/locales/vanilla/kn.js index 170fab533..a8be6ca7c 100644 Binary files a/priv/static/packs/locales/vanilla/kn.js and b/priv/static/packs/locales/vanilla/kn.js differ diff --git a/priv/static/packs/locales/vanilla/kn.js.map b/priv/static/packs/locales/vanilla/kn.js.map index a817395c8..c7f28697d 100644 Binary files a/priv/static/packs/locales/vanilla/kn.js.map and b/priv/static/packs/locales/vanilla/kn.js.map differ diff --git a/priv/static/packs/locales/vanilla/ko.js b/priv/static/packs/locales/vanilla/ko.js index 8ca8e8473..8940912cd 100644 Binary files a/priv/static/packs/locales/vanilla/ko.js and b/priv/static/packs/locales/vanilla/ko.js differ diff --git a/priv/static/packs/locales/vanilla/ko.js.map b/priv/static/packs/locales/vanilla/ko.js.map index aed5a710a..781e7af50 100644 Binary files a/priv/static/packs/locales/vanilla/ko.js.map and b/priv/static/packs/locales/vanilla/ko.js.map differ diff --git a/priv/static/packs/locales/vanilla/lt.js b/priv/static/packs/locales/vanilla/lt.js index 14c75f1b8..540f622a3 100644 Binary files a/priv/static/packs/locales/vanilla/lt.js and b/priv/static/packs/locales/vanilla/lt.js differ diff --git a/priv/static/packs/locales/vanilla/lt.js.map b/priv/static/packs/locales/vanilla/lt.js.map index b9e31d3fc..0ad385eaf 100644 Binary files a/priv/static/packs/locales/vanilla/lt.js.map and b/priv/static/packs/locales/vanilla/lt.js.map differ diff --git a/priv/static/packs/locales/vanilla/lv.js b/priv/static/packs/locales/vanilla/lv.js index 0960392ff..b58d988c1 100644 Binary files a/priv/static/packs/locales/vanilla/lv.js and b/priv/static/packs/locales/vanilla/lv.js differ diff --git a/priv/static/packs/locales/vanilla/lv.js.map b/priv/static/packs/locales/vanilla/lv.js.map index 9a81fb657..f448f8432 100644 Binary files a/priv/static/packs/locales/vanilla/lv.js.map and b/priv/static/packs/locales/vanilla/lv.js.map differ diff --git a/priv/static/packs/locales/vanilla/mk.js b/priv/static/packs/locales/vanilla/mk.js index 1788d66cf..205f06f17 100644 Binary files a/priv/static/packs/locales/vanilla/mk.js and b/priv/static/packs/locales/vanilla/mk.js differ diff --git a/priv/static/packs/locales/vanilla/mk.js.map b/priv/static/packs/locales/vanilla/mk.js.map index 70f8d8747..470d982ec 100644 Binary files a/priv/static/packs/locales/vanilla/mk.js.map and b/priv/static/packs/locales/vanilla/mk.js.map differ diff --git a/priv/static/packs/locales/vanilla/ml.js b/priv/static/packs/locales/vanilla/ml.js index e7beaf740..010562bb8 100644 Binary files a/priv/static/packs/locales/vanilla/ml.js and b/priv/static/packs/locales/vanilla/ml.js differ diff --git a/priv/static/packs/locales/vanilla/ml.js.map b/priv/static/packs/locales/vanilla/ml.js.map index 547658dcb..1be28164c 100644 Binary files a/priv/static/packs/locales/vanilla/ml.js.map and b/priv/static/packs/locales/vanilla/ml.js.map differ diff --git a/priv/static/packs/locales/vanilla/mr.js b/priv/static/packs/locales/vanilla/mr.js index 291b8054b..5fd186344 100644 Binary files a/priv/static/packs/locales/vanilla/mr.js and b/priv/static/packs/locales/vanilla/mr.js differ diff --git a/priv/static/packs/locales/vanilla/mr.js.map b/priv/static/packs/locales/vanilla/mr.js.map index cd29ccccf..cf404625f 100644 Binary files a/priv/static/packs/locales/vanilla/mr.js.map and b/priv/static/packs/locales/vanilla/mr.js.map differ diff --git a/priv/static/packs/locales/vanilla/ms.js b/priv/static/packs/locales/vanilla/ms.js index 7d40a3be9..aea0ef4c3 100644 Binary files a/priv/static/packs/locales/vanilla/ms.js and b/priv/static/packs/locales/vanilla/ms.js differ diff --git a/priv/static/packs/locales/vanilla/ms.js.map b/priv/static/packs/locales/vanilla/ms.js.map index 228f13cd7..897a1b7f8 100644 Binary files a/priv/static/packs/locales/vanilla/ms.js.map and b/priv/static/packs/locales/vanilla/ms.js.map differ diff --git a/priv/static/packs/locales/vanilla/nl.js b/priv/static/packs/locales/vanilla/nl.js index f24cd1d6b..84b479dd8 100644 Binary files a/priv/static/packs/locales/vanilla/nl.js and b/priv/static/packs/locales/vanilla/nl.js differ diff --git a/priv/static/packs/locales/vanilla/nl.js.map b/priv/static/packs/locales/vanilla/nl.js.map index 7f984bbee..677ff9cc5 100644 Binary files a/priv/static/packs/locales/vanilla/nl.js.map and b/priv/static/packs/locales/vanilla/nl.js.map differ diff --git a/priv/static/packs/locales/vanilla/nn.js b/priv/static/packs/locales/vanilla/nn.js index 7e4f9ff90..a015c275e 100644 Binary files a/priv/static/packs/locales/vanilla/nn.js and b/priv/static/packs/locales/vanilla/nn.js differ diff --git a/priv/static/packs/locales/vanilla/nn.js.map b/priv/static/packs/locales/vanilla/nn.js.map index 8ef48ff9f..01dfd6647 100644 Binary files a/priv/static/packs/locales/vanilla/nn.js.map and b/priv/static/packs/locales/vanilla/nn.js.map differ diff --git a/priv/static/packs/locales/vanilla/no.js b/priv/static/packs/locales/vanilla/no.js index d4a853588..19eeca907 100644 Binary files a/priv/static/packs/locales/vanilla/no.js and b/priv/static/packs/locales/vanilla/no.js differ diff --git a/priv/static/packs/locales/vanilla/no.js.map b/priv/static/packs/locales/vanilla/no.js.map index b469881f6..97d18247c 100644 Binary files a/priv/static/packs/locales/vanilla/no.js.map and b/priv/static/packs/locales/vanilla/no.js.map differ diff --git a/priv/static/packs/locales/vanilla/oc.js b/priv/static/packs/locales/vanilla/oc.js index e8580a16b..25d9e5663 100644 Binary files a/priv/static/packs/locales/vanilla/oc.js and b/priv/static/packs/locales/vanilla/oc.js differ diff --git a/priv/static/packs/locales/vanilla/oc.js.map b/priv/static/packs/locales/vanilla/oc.js.map index bc1dd8aa6..1890f6364 100644 Binary files a/priv/static/packs/locales/vanilla/oc.js.map and b/priv/static/packs/locales/vanilla/oc.js.map differ diff --git a/priv/static/packs/locales/vanilla/pl.js b/priv/static/packs/locales/vanilla/pl.js index 97f15bf38..f0b6e02ff 100644 Binary files a/priv/static/packs/locales/vanilla/pl.js and b/priv/static/packs/locales/vanilla/pl.js differ diff --git a/priv/static/packs/locales/vanilla/pl.js.map b/priv/static/packs/locales/vanilla/pl.js.map index 85145e5a6..5ce3d9490 100644 Binary files a/priv/static/packs/locales/vanilla/pl.js.map and b/priv/static/packs/locales/vanilla/pl.js.map differ diff --git a/priv/static/packs/locales/vanilla/pt-BR.js b/priv/static/packs/locales/vanilla/pt-BR.js index 7550603cc..bc1bf0707 100644 Binary files a/priv/static/packs/locales/vanilla/pt-BR.js and b/priv/static/packs/locales/vanilla/pt-BR.js differ diff --git a/priv/static/packs/locales/vanilla/pt-BR.js.map b/priv/static/packs/locales/vanilla/pt-BR.js.map index 267a7ef8b..99718f8e3 100644 Binary files a/priv/static/packs/locales/vanilla/pt-BR.js.map and b/priv/static/packs/locales/vanilla/pt-BR.js.map differ diff --git a/priv/static/packs/locales/vanilla/pt-PT.js b/priv/static/packs/locales/vanilla/pt-PT.js index 6895c5c7b..1400d34d0 100644 Binary files a/priv/static/packs/locales/vanilla/pt-PT.js and b/priv/static/packs/locales/vanilla/pt-PT.js differ diff --git a/priv/static/packs/locales/vanilla/pt-PT.js.map b/priv/static/packs/locales/vanilla/pt-PT.js.map index bab41c08a..65881dc14 100644 Binary files a/priv/static/packs/locales/vanilla/pt-PT.js.map and b/priv/static/packs/locales/vanilla/pt-PT.js.map differ diff --git a/priv/static/packs/locales/vanilla/ro.js b/priv/static/packs/locales/vanilla/ro.js index 481554f9f..6c786214d 100644 Binary files a/priv/static/packs/locales/vanilla/ro.js and b/priv/static/packs/locales/vanilla/ro.js differ diff --git a/priv/static/packs/locales/vanilla/ro.js.map b/priv/static/packs/locales/vanilla/ro.js.map index 3986b97e5..816cec77c 100644 Binary files a/priv/static/packs/locales/vanilla/ro.js.map and b/priv/static/packs/locales/vanilla/ro.js.map differ diff --git a/priv/static/packs/locales/vanilla/ru.js b/priv/static/packs/locales/vanilla/ru.js index 0bbdc37ab..9ae59768e 100644 Binary files a/priv/static/packs/locales/vanilla/ru.js and b/priv/static/packs/locales/vanilla/ru.js differ diff --git a/priv/static/packs/locales/vanilla/ru.js.map b/priv/static/packs/locales/vanilla/ru.js.map index c1f831ec3..1ce82af25 100644 Binary files a/priv/static/packs/locales/vanilla/ru.js.map and b/priv/static/packs/locales/vanilla/ru.js.map differ diff --git a/priv/static/packs/locales/vanilla/sk.js b/priv/static/packs/locales/vanilla/sk.js index 2ef30e303..2bfc244c5 100644 Binary files a/priv/static/packs/locales/vanilla/sk.js and b/priv/static/packs/locales/vanilla/sk.js differ diff --git a/priv/static/packs/locales/vanilla/sk.js.map b/priv/static/packs/locales/vanilla/sk.js.map index 083c50619..78be422ca 100644 Binary files a/priv/static/packs/locales/vanilla/sk.js.map and b/priv/static/packs/locales/vanilla/sk.js.map differ diff --git a/priv/static/packs/locales/vanilla/sl.js b/priv/static/packs/locales/vanilla/sl.js index 896523275..a91f08ff0 100644 Binary files a/priv/static/packs/locales/vanilla/sl.js and b/priv/static/packs/locales/vanilla/sl.js differ diff --git a/priv/static/packs/locales/vanilla/sl.js.map b/priv/static/packs/locales/vanilla/sl.js.map index e6d452df9..2a5f516d5 100644 Binary files a/priv/static/packs/locales/vanilla/sl.js.map and b/priv/static/packs/locales/vanilla/sl.js.map differ diff --git a/priv/static/packs/locales/vanilla/sq.js b/priv/static/packs/locales/vanilla/sq.js index 0d2c41318..2077d9e64 100644 Binary files a/priv/static/packs/locales/vanilla/sq.js and b/priv/static/packs/locales/vanilla/sq.js differ diff --git a/priv/static/packs/locales/vanilla/sq.js.map b/priv/static/packs/locales/vanilla/sq.js.map index 8eaf76d44..034c534ba 100644 Binary files a/priv/static/packs/locales/vanilla/sq.js.map and b/priv/static/packs/locales/vanilla/sq.js.map differ diff --git a/priv/static/packs/locales/vanilla/sr-Latn.js b/priv/static/packs/locales/vanilla/sr-Latn.js index d2ebf8e5e..c6ba642c9 100644 Binary files a/priv/static/packs/locales/vanilla/sr-Latn.js and b/priv/static/packs/locales/vanilla/sr-Latn.js differ diff --git a/priv/static/packs/locales/vanilla/sr-Latn.js.map b/priv/static/packs/locales/vanilla/sr-Latn.js.map index 86dd4c8f2..23a189d12 100644 Binary files a/priv/static/packs/locales/vanilla/sr-Latn.js.map and b/priv/static/packs/locales/vanilla/sr-Latn.js.map differ diff --git a/priv/static/packs/locales/vanilla/sr.js b/priv/static/packs/locales/vanilla/sr.js index 1a0aa8fc0..c70e85181 100644 Binary files a/priv/static/packs/locales/vanilla/sr.js and b/priv/static/packs/locales/vanilla/sr.js differ diff --git a/priv/static/packs/locales/vanilla/sr.js.map b/priv/static/packs/locales/vanilla/sr.js.map index ff378b7d5..34d0058c0 100644 Binary files a/priv/static/packs/locales/vanilla/sr.js.map and b/priv/static/packs/locales/vanilla/sr.js.map differ diff --git a/priv/static/packs/locales/vanilla/sv.js b/priv/static/packs/locales/vanilla/sv.js index 68b96c657..c9edf7b80 100644 Binary files a/priv/static/packs/locales/vanilla/sv.js and b/priv/static/packs/locales/vanilla/sv.js differ diff --git a/priv/static/packs/locales/vanilla/sv.js.map b/priv/static/packs/locales/vanilla/sv.js.map index b7c53c0f4..b0ca89829 100644 Binary files a/priv/static/packs/locales/vanilla/sv.js.map and b/priv/static/packs/locales/vanilla/sv.js.map differ diff --git a/priv/static/packs/locales/vanilla/ta.js b/priv/static/packs/locales/vanilla/ta.js index 88dabb897..2d274230d 100644 Binary files a/priv/static/packs/locales/vanilla/ta.js and b/priv/static/packs/locales/vanilla/ta.js differ diff --git a/priv/static/packs/locales/vanilla/ta.js.map b/priv/static/packs/locales/vanilla/ta.js.map index de245f786..ffebb252a 100644 Binary files a/priv/static/packs/locales/vanilla/ta.js.map and b/priv/static/packs/locales/vanilla/ta.js.map differ diff --git a/priv/static/packs/locales/vanilla/te.js b/priv/static/packs/locales/vanilla/te.js index eefd698ec..a9548c9f3 100644 Binary files a/priv/static/packs/locales/vanilla/te.js and b/priv/static/packs/locales/vanilla/te.js differ diff --git a/priv/static/packs/locales/vanilla/te.js.map b/priv/static/packs/locales/vanilla/te.js.map index 62232430e..d6f33a0b9 100644 Binary files a/priv/static/packs/locales/vanilla/te.js.map and b/priv/static/packs/locales/vanilla/te.js.map differ diff --git a/priv/static/packs/locales/vanilla/th.js b/priv/static/packs/locales/vanilla/th.js index 5230f7ed0..5fd67d669 100644 Binary files a/priv/static/packs/locales/vanilla/th.js and b/priv/static/packs/locales/vanilla/th.js differ diff --git a/priv/static/packs/locales/vanilla/th.js.map b/priv/static/packs/locales/vanilla/th.js.map index 20e4a78eb..25c2c4641 100644 Binary files a/priv/static/packs/locales/vanilla/th.js.map and b/priv/static/packs/locales/vanilla/th.js.map differ diff --git a/priv/static/packs/locales/vanilla/tr.js b/priv/static/packs/locales/vanilla/tr.js index 04ca75e3b..0e245a4ec 100644 Binary files a/priv/static/packs/locales/vanilla/tr.js and b/priv/static/packs/locales/vanilla/tr.js differ diff --git a/priv/static/packs/locales/vanilla/tr.js.map b/priv/static/packs/locales/vanilla/tr.js.map index 4eaf7717f..fb38b5cde 100644 Binary files a/priv/static/packs/locales/vanilla/tr.js.map and b/priv/static/packs/locales/vanilla/tr.js.map differ diff --git a/priv/static/packs/locales/vanilla/uk.js b/priv/static/packs/locales/vanilla/uk.js index 8b22d2c84..ea579e1a9 100644 Binary files a/priv/static/packs/locales/vanilla/uk.js and b/priv/static/packs/locales/vanilla/uk.js differ diff --git a/priv/static/packs/locales/vanilla/uk.js.map b/priv/static/packs/locales/vanilla/uk.js.map index aed57a251..e11d638c8 100644 Binary files a/priv/static/packs/locales/vanilla/uk.js.map and b/priv/static/packs/locales/vanilla/uk.js.map differ diff --git a/priv/static/packs/locales/vanilla/ur.js b/priv/static/packs/locales/vanilla/ur.js index 507ca10a0..fd92d1ab0 100644 Binary files a/priv/static/packs/locales/vanilla/ur.js and b/priv/static/packs/locales/vanilla/ur.js differ diff --git a/priv/static/packs/locales/vanilla/ur.js.map b/priv/static/packs/locales/vanilla/ur.js.map index 1e1f29498..7aa1dc75c 100644 Binary files a/priv/static/packs/locales/vanilla/ur.js.map and b/priv/static/packs/locales/vanilla/ur.js.map differ diff --git a/priv/static/packs/locales/vanilla/vi.js b/priv/static/packs/locales/vanilla/vi.js index f7964f810..74b75f64e 100644 Binary files a/priv/static/packs/locales/vanilla/vi.js and b/priv/static/packs/locales/vanilla/vi.js differ diff --git a/priv/static/packs/locales/vanilla/vi.js.map b/priv/static/packs/locales/vanilla/vi.js.map index e3a49bb69..ea34ab185 100644 Binary files a/priv/static/packs/locales/vanilla/vi.js.map and b/priv/static/packs/locales/vanilla/vi.js.map differ diff --git a/priv/static/packs/locales/vanilla/zh-CN.js b/priv/static/packs/locales/vanilla/zh-CN.js index 1c6668c14..35514a2ee 100644 Binary files a/priv/static/packs/locales/vanilla/zh-CN.js and b/priv/static/packs/locales/vanilla/zh-CN.js differ diff --git a/priv/static/packs/locales/vanilla/zh-CN.js.map b/priv/static/packs/locales/vanilla/zh-CN.js.map index c8a4f1f4a..e619f8655 100644 Binary files a/priv/static/packs/locales/vanilla/zh-CN.js.map and b/priv/static/packs/locales/vanilla/zh-CN.js.map differ diff --git a/priv/static/packs/locales/vanilla/zh-HK.js b/priv/static/packs/locales/vanilla/zh-HK.js index 4e6a49912..a0eb66b6e 100644 Binary files a/priv/static/packs/locales/vanilla/zh-HK.js and b/priv/static/packs/locales/vanilla/zh-HK.js differ diff --git a/priv/static/packs/locales/vanilla/zh-HK.js.map b/priv/static/packs/locales/vanilla/zh-HK.js.map index 5ccfee79b..aac2821fa 100644 Binary files a/priv/static/packs/locales/vanilla/zh-HK.js.map and b/priv/static/packs/locales/vanilla/zh-HK.js.map differ diff --git a/priv/static/packs/locales/vanilla/zh-TW.js b/priv/static/packs/locales/vanilla/zh-TW.js index 03165b6da..585a10947 100644 Binary files a/priv/static/packs/locales/vanilla/zh-TW.js and b/priv/static/packs/locales/vanilla/zh-TW.js differ diff --git a/priv/static/packs/locales/vanilla/zh-TW.js.map b/priv/static/packs/locales/vanilla/zh-TW.js.map index 5a5dc377b..9ae897a48 100644 Binary files a/priv/static/packs/locales/vanilla/zh-TW.js.map and b/priv/static/packs/locales/vanilla/zh-TW.js.map differ diff --git a/priv/static/packs/modals/block_modal.js b/priv/static/packs/modals/block_modal.js index 90c88d163..b74a7a3d0 100644 Binary files a/priv/static/packs/modals/block_modal.js and b/priv/static/packs/modals/block_modal.js differ diff --git a/priv/static/packs/modals/block_modal.js.map b/priv/static/packs/modals/block_modal.js.map index 406846735..2796f6af6 100644 Binary files a/priv/static/packs/modals/block_modal.js.map and b/priv/static/packs/modals/block_modal.js.map differ diff --git a/priv/static/packs/modals/embed_modal.js b/priv/static/packs/modals/embed_modal.js index 21ab12b50..9092bee72 100644 Binary files a/priv/static/packs/modals/embed_modal.js and b/priv/static/packs/modals/embed_modal.js differ diff --git a/priv/static/packs/modals/embed_modal.js.map b/priv/static/packs/modals/embed_modal.js.map index c2c70ba99..0fd5ad06d 100644 Binary files a/priv/static/packs/modals/embed_modal.js.map and b/priv/static/packs/modals/embed_modal.js.map differ diff --git a/priv/static/packs/modals/mute_modal.js b/priv/static/packs/modals/mute_modal.js index df9cdcb60..d239d0dab 100644 Binary files a/priv/static/packs/modals/mute_modal.js and b/priv/static/packs/modals/mute_modal.js differ diff --git a/priv/static/packs/modals/mute_modal.js.map b/priv/static/packs/modals/mute_modal.js.map index ac6f90cad..8a2885173 100644 Binary files a/priv/static/packs/modals/mute_modal.js.map and b/priv/static/packs/modals/mute_modal.js.map differ diff --git a/priv/static/packs/modals/report_modal.js b/priv/static/packs/modals/report_modal.js index 004baf326..cc6d7904f 100644 Binary files a/priv/static/packs/modals/report_modal.js and b/priv/static/packs/modals/report_modal.js differ diff --git a/priv/static/packs/modals/report_modal.js.map b/priv/static/packs/modals/report_modal.js.map index 079fd6be6..d695d2a81 100644 Binary files a/priv/static/packs/modals/report_modal.js.map and b/priv/static/packs/modals/report_modal.js.map differ diff --git a/priv/static/packs/skins/glitch/contrast/common.css b/priv/static/packs/skins/glitch/contrast/common.css index 79ea1f515..748cdc91f 100644 Binary files a/priv/static/packs/skins/glitch/contrast/common.css and b/priv/static/packs/skins/glitch/contrast/common.css differ diff --git a/priv/static/packs/skins/glitch/contrast/common.css.map b/priv/static/packs/skins/glitch/contrast/common.css.map index 0fe13838c..2869e4adc 100644 --- a/priv/static/packs/skins/glitch/contrast/common.css.map +++ b/priv/static/packs/skins/glitch/contrast/common.css.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///common.scss","webpack:///./app/javascript/flavours/glitch/styles/reset.scss","webpack:///./app/javascript/flavours/glitch/styles/contrast/variables.scss","webpack:///./app/javascript/flavours/glitch/styles/basics.scss","webpack:///./app/javascript/flavours/glitch/styles/variables.scss","webpack:///./app/javascript/flavours/glitch/styles/containers.scss","webpack:///./app/javascript/flavours/glitch/styles/_mixins.scss","webpack:///./app/javascript/flavours/glitch/styles/lists.scss","webpack:///./app/javascript/flavours/glitch/styles/modal.scss","webpack:///./app/javascript/flavours/glitch/styles/footer.scss","webpack:///./app/javascript/flavours/glitch/styles/compact_header.scss","webpack:///./app/javascript/flavours/glitch/styles/widgets.scss","webpack:///./app/javascript/flavours/glitch/styles/forms.scss","webpack:///./app/javascript/flavours/glitch/styles/accounts.scss","webpack:///./app/javascript/flavours/glitch/styles/statuses.scss","webpack:///./app/javascript/flavours/glitch/styles/components/index.scss","webpack:///./app/javascript/flavours/glitch/styles/components/boost.scss","webpack:///./app/javascript/flavours/glitch/styles/components/accounts.scss","webpack:///./app/javascript/flavours/glitch/styles/components/domains.scss","webpack:///./app/javascript/flavours/glitch/styles/components/status.scss","webpack:///./app/javascript/flavours/glitch/styles/components/modal.scss","webpack:///./app/javascript/flavours/glitch/styles/components/composer.scss","webpack:///./app/javascript/flavours/glitch/styles/components/columns.scss","webpack:///./app/javascript/flavours/glitch/styles/components/regeneration_indicator.scss","webpack:///./app/javascript/flavours/glitch/styles/components/directory.scss","webpack:///./app/javascript/flavours/glitch/styles/components/search.scss","webpack:///","webpack:///./app/javascript/flavours/glitch/styles/components/emoji.scss","webpack:///./app/javascript/flavours/glitch/styles/components/doodle.scss","webpack:///./app/javascript/flavours/glitch/styles/components/drawer.scss","webpack:///./app/javascript/flavours/glitch/styles/components/media.scss","webpack:///./app/javascript/flavours/glitch/styles/components/sensitive.scss","webpack:///./app/javascript/flavours/glitch/styles/components/lists.scss","webpack:///./app/javascript/flavours/glitch/styles/components/emoji_picker.scss","webpack:///./app/javascript/flavours/glitch/styles/components/local_settings.scss","webpack:///./app/javascript/flavours/glitch/styles/components/error_boundary.scss","webpack:///./app/javascript/flavours/glitch/styles/components/single_column.scss","webpack:///./app/javascript/flavours/glitch/styles/polls.scss","webpack:///./app/javascript/flavours/glitch/styles/about.scss","webpack:///./app/javascript/flavours/glitch/styles/tables.scss","webpack:///./app/javascript/flavours/glitch/styles/admin.scss","webpack:///./app/javascript/flavours/glitch/styles/accessibility.scss","webpack:///./app/javascript/flavours/glitch/styles/rtl.scss","webpack:///./app/javascript/flavours/glitch/styles/dashboard.scss","webpack:///./app/javascript/flavours/glitch/styles/contrast/diff.scss"],"names":[],"mappings":"AAAA,2ZCKA,QAaE,UACA,SACA,eACA,aACA,wBACA,+EAIF,aAEE,MAGF,aACE,OAGF,eACE,cAGF,WACE,qDAGF,UAEE,aACA,OAGF,wBACE,iBACA,MAGF,sCACE,qBAGF,UACE,YACA,2BAGF,kBACE,cACA,mBACA,iCAGF,kBACE,kCAGF,kBACE,2BAGF,aACE,gBACA,0BACA,CC9EmB,iEDqFrB,kBCrFqB,4BDyFrB,sBACE,MEtFF,sBACE,mBACA,eACA,iBACA,gBACA,WCVM,kCDYN,6BACA,8BACA,CADA,0BACA,CADA,yBACA,CADA,qBACA,0CACA,wCACA,kBAEA,sIAYE,eAGF,SACE,oCAEA,WACE,iBACA,kBACA,uCAGF,iBACE,WACA,YACA,mCAGF,iBACE,cAIJ,kBDpDmB,kBCwDnB,iBACE,kBACA,0BAEA,iBACE,YAIJ,kBACE,SACA,iBACA,uBAEA,iBACE,WACA,YACA,gBACA,YAIJ,kBACE,UACA,YAGF,iBACE,kBACA,cDzEgB,mBAZC,WCwFjB,YACA,UACA,aACA,uBACA,mBACA,oBAEA,qBACE,YACA,wBAEA,aACE,gBACA,WACA,YACA,kBACA,uBAGF,cACE,iBACA,gBACA,QAMR,mBACE,eACA,cAEA,YACE,6BAKF,YAEE,WACA,mBACA,uBACA,oBACA,yEAKF,gBAEE,+EAKF,WAEE,gBErJJ,WACE,CACA,kBACA,qCAEA,eALF,UAMI,SACA,kBAIJ,sBACE,qCAEA,gBAHF,kBAII,qBAGF,YACE,uBACA,mBACA,wBAEA,SDrBI,YCuBF,kBACA,sBAGF,YACE,uBACA,mBACA,WD9BE,qBCgCF,UACA,kBACA,iBACA,uBACA,gBACA,eACA,mCAMJ,WACE,CACA,cACA,mBACA,sBACA,qCAEA,kCAPF,UAQI,aACA,aACA,kBAKN,WACE,CACA,YACA,eACA,iBACA,sBACA,CACA,gBACA,CACA,sBACA,qCAEA,gBAZF,UAaI,CACA,eACA,CACA,mBACA,0BAKA,UACqB,sCC3EvB,iBD4EE,6BAEA,UACE,YACA,cACA,SACA,kBACA,iBD5BkB,wBE9DtB,4BACA,uBD8FA,aACE,cHjFmB,wBGmFnB,iCAEA,aACE,gBACA,uBACA,gBACA,8BAIJ,aACE,eACA,iBACA,gBACA,SAIJ,YACE,cACA,8BACA,sBACA,mCACA,CADA,0BACA,mBAEA,eACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,eACE,WACA,qCAGF,QA3BF,UA4BI,qCACA,mBAEA,aACE,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,UAKN,YACE,cACA,8CACA,sBACA,mCACA,CADA,0BACA,mBAEA,eACE,WACA,mBAGF,eACE,WACA,mBAGF,aACE,WACA,mBAGF,eACE,WACA,mBAGF,aACE,WACA,uCAGF,eACE,wBAGF,kBACE,qCAGF,QAxCF,iDAyCI,uCAEA,YACE,aACA,mBACA,uBACA,iCAGF,UACE,uBACA,mBACA,sBAGF,YACE,sCAIJ,QA7DF,UA8DI,qCACA,mBAEA,aACE,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,sCAMJ,eADF,gBAEI,4BAGF,eACE,qCAEA,0BAHF,SAII,yBAIJ,kBACE,mCACA,kBACA,YACA,cACA,aACA,oBACA,uBACA,iBACA,gBACA,qCAEA,uBAZF,cAaI,WACA,MACA,OACA,SACA,gBACA,gBACA,YACA,6BAGF,cACE,eACA,kCAGF,YACE,oBACA,2BACA,iBACA,oCAGF,YACE,oBACA,uBACA,iBACA,mCAGF,YACE,oBACA,yBACA,iBACA,+BAGF,aACE,aACA,mCAEA,aACE,YACA,WACA,kBACA,YACA,UD1UA,qCC6UA,kCARF,WASI,+GAIJ,kBAGE,kCAIJ,YACE,mBACA,eACA,eACA,gBACA,qBACA,cHlVc,mBGoVd,kBACA,uHAEA,yBAGE,WDvWA,qCC2WF,0CACE,YACE,qCAKN,kBACE,CACA,oBACA,kBACA,6HAEA,oBAGE,mBACA,sBAON,YACE,cACA,0DACA,sBACA,mCACA,CADA,0BACA,gCAEA,UACE,cACA,gCAGF,UACE,cACA,qCAGF,qBAjBF,0BAkBI,WACA,gCAEA,YACE,kCAKN,iBACE,qCAEA,gCAHF,eAII,sCAKF,4BADF,eAEI,wCAIJ,eACE,mBACA,mCACA,gDAEA,UACE,qIAEA,8BAEE,CAFF,sBAEE,6DAGF,wBH1aiB,8CG+anB,yBACE,gBACA,aACA,kBACA,mBACA,oDAEA,UACE,cACA,kBACA,WACA,YACA,gDACA,MACA,OACA,kDAGF,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,0BACA,qCAGF,6CA3BF,YA4BI,gDAIJ,eACE,6JAEA,iBAEE,qCAEA,4JAJF,eAKI,sCAKN,sCA/DF,eAgEI,gBACA,oDAEA,YACE,+FAGF,eAEE,6CAIJ,iBACE,iBACA,aACA,2BACA,mDAEA,UACE,cACA,mBACA,kBACA,SACA,OACA,QACA,YACA,0BACA,WACA,oDAGF,aACE,CAEA,WACqB,yCCzgB3B,kBD0gBM,cACA,wDAEA,aACE,WACA,YACA,SACA,kBACA,yBACA,mBACA,iBD7dc,wBE9DtB,4BACA,qCD+hBI,2CAvCF,YAwCI,mBACA,0BACA,YACA,mDAEA,YACE,oDAKA,UACqB,sCCtiB7B,CDuiBQ,sBACA,wDAEA,QACE,kBACA,iBDrfY,wBE9DtB,4BACA,2DDsjBQ,mDAbF,YAcI,sCAKN,2CApEF,eAqEI,sCAGF,2CAxEF,cAyEI,8CAIJ,aACE,iBACA,mDAEA,gBACE,mBACA,sDAEA,cACE,iBACA,WDhlBF,gBCklBE,gBACA,mBACA,uBACA,6BACA,4DAEA,aACE,eACA,WD1lBJ,gBC4lBI,gBACA,uBACA,qCAKN,4CA7BF,gBA8BI,aACA,8BACA,mBACA,mDAEA,aACE,iBACA,sDAEA,cACE,iBACA,iBACA,4DAEA,aHrmBQ,oDG4mBd,YACE,2BACA,oBACA,YACA,qEAEA,YACE,mBACA,gBACA,qCAGF,oEACE,YACE,6DAIJ,eACE,sBACA,cACA,cHjoBU,aGmoBV,+BACA,eACA,kBACA,kBACA,8DAEA,aACE,uEAGF,cACE,kEAGF,aACE,WACA,kBACA,SACA,OACA,WACA,gCACA,WACA,wBACA,yEAIA,+BACE,UACA,kFAGF,2BHjqBW,wEGuqBX,SACE,wBACA,8DAIJ,oBACE,cACA,2EAGF,cACE,cACA,4EAGF,eACE,eACA,kBACA,WDzsBJ,uBC2sBI,2DAIJ,aACE,WACA,4DAGF,eACE,8CAKN,YACE,eACA,kEAEA,eACE,gBACA,uBACA,cACA,2FAEA,4BACE,yEAGF,YACE,qDAIJ,gBACE,eACA,cHluBY,uDGquBZ,oBACE,cHtuBU,qBGwuBV,aACA,gBACA,8DAEA,eACE,WD1vBJ,qCCgwBF,6CAtCF,aAuCI,UACA,4CAKN,yBACE,qCAEA,0CAHF,eAII,wCAIJ,eACE,oCAGF,kBACE,mCACA,kBACA,gBACA,mBACA,qCAEA,mCAPF,eAQI,gBACA,gBACA,8DAGF,QACE,aACA,+DAEA,aACE,sFAGF,uBACE,yEAGF,aD3yBU,8DCizBV,mBACA,WDnzBE,qFCuzBJ,YAEE,eACA,cH7yBc,2CGizBhB,gBACE,iCAIJ,YACE,cACA,kDACA,qCAEA,gCALF,aAMI,+CAGF,cACE,iCAIJ,eACE,2BAGF,YACE,eACA,eACA,cACA,+BAEA,qBACE,cACA,YACA,cACA,mBACA,kBACA,qCAEA,8BARF,aASI,sCAGF,8BAZF,cAaI,sCAIJ,0BAvBF,QAwBI,6BACA,+BAEA,UACE,UACA,gBACA,gCACA,0CAEA,eACE,0CAGF,kBHz3Ba,+IG43BX,kBAGE,WEl4BZ,eACE,aAEA,oBACE,aACA,iBAIJ,eACE,cACA,oBAEA,cACE,gBACA,mBACA,eChBJ,k1BACE,aACA,sBACA,aACA,UACA,yBAGF,YACE,OACA,sBACA,yBACA,2BAEA,MACE,iBACA,qCAIJ,gBACE,YACE,yBCrBF,eACE,iBACA,oBACA,eACA,cACA,qCAEA,uBAPF,iBAQI,mBACA,+BAGF,YACE,cACA,0CACA,wCAEA,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,kBACA,6CAEA,aACE,wCAIJ,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,qCAGF,6BAxCF,iCAyCI,+EAEA,aAEE,wCAGF,UACE,wCAGF,aACE,+EAGF,aAEE,wCAGF,UACE,sCAIJ,uCACE,aACE,sCAIJ,4JACE,YAIE,4BAKN,wBACE,gBACA,kBACA,cPnFc,6BOsFd,aACE,qBACA,6BAIJ,oBACE,cACA,wGAEA,yBAGE,mCAKF,aACE,YACA,WACA,cACA,aACA,0HAMA,YACE,oBClIR,cACE,iBACA,cRYgB,gBQVhB,mBACA,eACA,qBACA,qCAEA,mBATF,iBAUI,oBACA,uBAGF,aACE,qBACA,0BAGF,eACE,cRJiB,wBQQnB,oBACE,mBACA,kBACA,WACA,YACA,cC9BN,kBACE,mCACA,mBAEA,UACE,kBACA,gBACA,0BACA,gBPPI,uBOUJ,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,0BACA,oBAIJ,kBTlBmB,aSoBjB,0BACA,eACA,cTVgB,iBSYhB,qBACA,gBACA,8BAEA,UACE,YACA,gBACA,sBAGF,kBACE,iCAEA,eACE,uBAIJ,cACE,SACA,UACA,gBACA,uBACA,oBACA,kBACA,oBACA,cACA,sBAGF,aTxCmB,qBS0CjB,4BAEA,yBACE,qCAKN,aAnEF,YAoEI,uBAIJ,kBACE,oBACA,yBAEA,YACE,yBACA,gBACA,eACA,cTjEgB,+BSqElB,cACE,0CAEA,eACE,sDAGF,YACE,mBACA,gDAGF,UACE,YACA,0BACA,oCAIJ,YACE,mBAKF,aT9FkB,aSmGpB,YACE,kBACA,mBTjHmB,mCSmHnB,qBAGF,YACE,kBACA,0BACA,kBACA,cT9GkB,mBSgHlB,iBAGF,eACE,eACA,cTrHkB,iBSuHlB,qBACA,gBACA,UACA,oBAEA,YACE,yBACA,gBACA,eACA,cThIgB,0BSoIlB,eACE,CACA,kBACA,mBAGF,oBACE,CACA,mBACA,cT7IgB,qBS+IhB,mBACA,gBACA,uBACA,0EAEA,yBAGE,uBAMJ,sBACA,kBACA,mBT3KmB,mCS6KnB,cT/JqB,gBSiKrB,mBACA,sDAEA,eAEE,CAII,qXADF,eACE,yBAKN,aACE,0BACA,CAMI,wLAGF,oBAGE,mIAEA,yBACE,gCAMR,kBACE,oCAEA,gBACE,cT5Mc,8DSkNhB,iBACE,eACA,4DAGF,eACE,qBACA,iEAEA,eACE,kBAMR,YACE,CACA,ePlPM,COoPN,cACA,cTvOkB,mBSyOlB,+BANA,iBACA,CPlPM,kCOgQN,CATA,aAGF,kBACE,CAEA,iBACA,kBACA,cACA,iBAEA,UPjQM,eOmQJ,gBACA,gBACA,mBACA,gBAGF,cACE,cT7PgB,qCSiQlB,aArBF,YAsBI,mBACA,iBAEA,cACE,aAKN,kBTvRqB,kBSyRnB,mCACA,iBAEA,qBACE,mBACA,uCAEA,YAEE,mBACA,8BACA,mBTpSe,kBSsSf,aACA,qBACA,cACA,mCACA,0EAIA,kBAGE,0BAIJ,kBT3SiB,eS6Sf,8BAGF,UACE,eACA,oBAGF,aACE,eACA,gBACA,WPnUE,mBOqUF,gBACA,uBACA,wBAEA,aT5Tc,0BSgUd,aACE,gBACA,eACA,eACA,cTpUY,yFS0Ud,UPvVE,+BO8VJ,aACE,YACA,uDAGF,oBTxViB,eS8VrB,YACE,yBACA,gCAEA,aACE,WACA,YACA,kBACA,kBACA,kBACA,mBACA,yBACA,4CAEA,SACE,6CAGF,SACE,6CAGF,SACE,iBAKN,UACE,0BAEA,SACE,SACA,wBAGF,eACE,0BAGF,iBACE,yBACA,cTtYgB,gBSwYhB,aACA,sCAEA,eACE,0BAIJ,cACE,sBACA,gCACA,wCAGF,eACE,wBAGF,WACE,kBACA,eACA,gBACA,WP3aI,8BO8aJ,aACE,cTlac,gBSoad,eACA,0BAIJ,SACE,iCACA,qCAGF,kCACE,YACE,sCAYJ,qIAPF,eAQI,gBACA,gBACA,iBAOJ,gBACE,qCAEA,eAHF,oBAII,uBAGF,sBACE,sCAEA,qBAHF,sBAII,sCAGF,qBAPF,UAQI,sCAGF,qBAXF,WAYI,kCAIJ,iBACE,qCAEA,gCAHF,4BAII,iEAIA,eACE,0DAGF,cACE,iBACA,oEAEA,UACE,YACA,gBACA,yFAGF,gBACE,SACA,mKAIJ,eAGE,gBAON,aTngBkB,iCSkgBpB,kBAKI,6BAEA,eACE,kBAIJ,cACE,iBACA,wCAMF,oBACE,gBACA,cT1hBiB,4JS6hBjB,yBAGE,oBAKN,kBACE,gBACA,eACA,kBACA,yBAEA,aACE,gBACA,aACA,CACA,kBACA,gBACA,uBACA,qBACA,WP9jBI,gCOgkBJ,4FAEA,yBAGE,oCAIJ,eACE,0BAGF,iBACE,gCACA,MC/kBJ,+BACE,gBACA,iBAGF,eACE,aACA,cACA,qBAIA,kBACE,gBACA,4BAEA,QACE,0CAIA,kBACE,qDAEA,eACE,gDAIJ,iBACE,kBACA,sDAEA,iBACE,SACA,OACA,6BAKN,iBACE,gBACA,gDAEA,mBACE,eACA,gBACA,WRhDA,cQkDA,WACA,4EAGF,iBAEE,mDAGF,eACE,4CAGF,iBACE,QACA,OACA,qCAGF,aVjEoB,0BUmElB,gIAEA,oBAGE,0CAIJ,iBACE,CACA,iBACA,mBAKN,YACE,cACA,0BAEA,qBACE,cACA,UACA,cACA,oBAIJ,aVvFkB,sBU0FhB,aVnGsB,yBUuGtB,iBACE,kBACA,mBACA,wBAIJ,aACE,eACA,eACA,qBAGF,kBACE,cV5GgB,iCU+GhB,iBACE,eACA,iBACA,gBACA,gBACA,oBAIJ,kBACE,qBAGF,eACE,CAII,0JADF,eACE,sDAMJ,YACE,4DAEA,mBACE,eACA,WRzJA,gBQ2JA,gBACA,cACA,wHAGF,aAEE,sDAIJ,cACE,kBACA,mDAKF,mBACE,eACA,WR/KE,cQiLF,kBACA,qBACA,gBACA,sCAGF,cACE,mCAGF,UACE,sCAIJ,cACE,4CAEA,mBACE,eACA,WRrME,cQuMF,gBACA,gBACA,4CAGF,kBACE,yCAGF,cACE,CADF,cACE,6BAIJ,oBACE,cACA,4BAGF,kBACE,8CAEA,eACE,0BAIJ,YACE,CACA,eACA,oBACA,iCAEA,cACE,kCAGF,qBACE,eACA,cACA,eACA,oCAEA,aACE,2CAGF,eACE,6GAIJ,eAEE,qCAGF,yBA9BF,aA+BI,gBACA,kCAEA,cACE,0JAGF,kBAGE,iDAKN,iBACE,oBACA,eACA,WRnRI,cQqRJ,WACA,2CAKE,mBACE,eACA,WR7RA,qBQ+RA,WACA,kBACA,gBACA,kBACA,cACA,0DAGF,iBACE,OACA,QACA,SACA,kDAKN,cACE,aACA,yBACA,kBACA,sJAGF,qBAKE,eACA,WR7TI,cQ+TJ,WACA,UACA,oBACA,gBACA,mBACA,yBACA,kBACA,aACA,6RAEA,aACE,CAHF,+OAEA,aACE,CAHF,mQAEA,aACE,CAHF,wQAEA,aACE,CAHF,sNAEA,aACE,8LAGF,eACE,oVAGF,oBACE,iOAGF,oBRpVY,oLQwVZ,iBACE,4WAGF,oBVzVsB,mBU4VpB,6CAKF,aACE,gUAGF,oBAME,8CAGF,aACE,gBACA,cACA,eACA,8BAIJ,UACE,uBAGF,eACE,aACA,oCAEA,YACE,mBACA,qEAIJ,aAGE,WACA,SACA,kBACA,mBVnYiB,WEXb,eQiZJ,oBACA,YACA,aACA,yBACA,qBACA,kBACA,sBACA,eACA,gBACA,UACA,mBACA,kBACA,sGAEA,cACE,uFAGF,wBACE,gLAGF,wBAEE,kHAGF,wBV1aoB,gGU8apB,kBR9aQ,kHQibN,wBACE,sOAGF,wBAEE,qBAKN,uBACE,CADF,oBACE,CADF,eACE,sBACA,eACA,WRjcI,cQmcJ,WACA,UACA,oBACA,gBACA,wXACA,yBACA,kBACA,kBACA,mBACA,YACA,iBAGF,4BACE,oCAIA,iBACE,mCAGF,iBACE,UACA,QACA,CACA,qBACA,eACA,cVjdY,oBUmdZ,oBACA,eACA,gBACA,mBACA,gBACA,yCAEA,UACE,cACA,kBACA,MACA,QACA,WACA,UACA,iEACA,4BAKN,iBACE,0CAEA,wBACE,CADF,gBACE,qCAGF,iBACE,MACA,OACA,WACA,YACA,aACA,uBACA,mBACA,8BACA,kBACA,iBACA,gBACA,YACA,8CAEA,iBACE,6HAGE,UR/gBF,aQyhBR,aACE,CACA,kBACA,eACA,gBAGF,kBACE,cVphBkB,kBUshBlB,kBACA,mBACA,kBACA,uBAEA,qCACE,iCACA,cRziBY,sBQ6iBd,mCACE,+BACA,cR9iBQ,kBQkjBV,oBACE,cVxiBgB,qBU0iBhB,wBAEA,URzjBI,0BQ2jBF,kBAIJ,kBACE,4BAGF,SACE,sBACA,cACA,WACA,YACA,aACA,gCACA,mBVzkBiB,WEDb,eQ6kBJ,SACA,8CAEA,QACE,iHAGF,mBAGE,kCAGF,kBACE,uBAIJ,eACE,CAII,oKADF,eACE,0DAKN,eAzEF,eA0EI,eAIJ,eACE,kBACA,gBAEA,aVrmBkB,qBUumBhB,sBAEA,yBACE,YAKN,eACE,mBACA,eACA,eAEA,oBACE,kBACA,cAGF,aVloBwB,yBUooBtB,qBACA,gBACA,2DAEA,aAGE,8BAKN,kBAEE,cVzoBkB,oCU4oBlB,cACE,mBACA,kBACA,4CAGF,aVhpBqB,gBUkpBnB,CAII,mUADF,eACE,0DAKN,6BAtBF,eAuBI,cAIJ,YACE,eACA,uBACA,UAGF,aACE,gBRtrBM,YQwrBN,qBACA,mCACA,qBACA,cAEA,aACE,SACA,iBAIJ,kBACE,cVrrBqB,WUurBrB,sBAEA,aACE,eACA,eAKF,kBACE,sBAEA,eACE,CAII,+JADF,eACE,4CASR,qBACE,8BACA,WRluBI,qCQouBJ,oCACA,kBACA,aACA,mBACA,gDAEA,UR1uBI,0BQ4uBF,oLAEA,oBAGE,0DAIJ,eACE,cACA,kBACA,CAII,yYADF,eACE,kEAIJ,eACE,oBAMR,YACE,eACA,mBACA,4DAEA,aAEE,6BAIA,wBACA,cACA,sBAIJ,iBACE,cV5wBkB,0BU+wBlB,iBACE,oBAIJ,eACE,mBACA,uBAEA,cACE,WRtyBI,kBQwyBJ,mBACA,SACA,UACA,4BAGF,aACE,eAIJ,aRhzBc,0SQ0zBZ,+BACE,aAIJ,kBACE,yBACA,kBACA,aACA,mBACA,kBACA,kBACA,QACA,mCACA,sBAEA,aACE,8BAGF,sBACE,SACA,aACA,eACA,gCACA,oBAGF,aACE,WACA,oBACA,gBACA,eACA,CACA,oBACA,WACA,iCACA,oBAGF,oBRp2Bc,gBQs2BZ,2BAEA,kBRx2BY,gBQ02BV,oBAKN,kBACE,6BAEA,wBACE,mBACA,eACA,aACA,4BAGF,kBACE,aACA,OACA,sBACA,cACA,cACA,gCAEA,iBACE,YACA,iBACA,kBACA,UACA,8BAGF,qBACE,qCAIJ,kBACE,gCAGF,wBACE,mCACA,kBACA,kBACA,kBACA,kBACA,sCAEA,wBACE,WACA,cACA,YACA,SACA,kBACA,MACA,UACA,yBAIJ,sBACE,aACA,mBACA,SC36BF,aACE,qBACA,cACA,mCACA,qCAEA,QANF,eAOI,8EAMA,kBACE,YAKN,YACE,kBACA,mBACA,0BACA,gBAEA,aACE,WACA,YACA,SACA,oBACA,CADA,8BACA,CADA,gBACA,0BACA,qCAGF,WAfF,YAgBI,sCAGF,WAnBF,YAoBI,aAIJ,iBACE,aACA,aACA,2BACA,mBACA,mBACA,0BACA,qCAEA,WATF,eAUI,qBAGF,aACE,CAEA,UACqB,sCPpDzB,gBOqDI,wBAEA,UACE,YACA,cACA,SACA,kBACA,iBTLgB,wBE9DtB,4BACA,mBOoEM,oBACA,CADA,8BACA,CADA,gBACA,0BAIJ,gBACE,gBACA,iCAEA,cACE,WT/EA,gBSiFA,gBACA,uBACA,+BAGF,aACE,eACA,cX3EY,gBW6EZ,gBACA,uBACA,aAMR,cACE,kBACA,gBACA,6GAEA,cAME,WT7GI,gBS+GJ,qBACA,iBACA,qBACA,sBAGF,eTrHM,oBSuHJ,WXxHI,eW0HJ,cACA,kBAGF,cACE,uCAGF,wBAEE,cXpHmB,oBWwHrB,UACE,eACA,wBAEA,oBACE,iBACA,oBAIJ,WACE,gBACA,wBAEA,oBACE,gBACA,uBAIJ,cACE,cACA,qCAGF,YA9DF,iBA+DI,mBAEA,YACE,uCAGF,oBAEE,gBAKN,kBX7KqB,mCW+KnB,cX3JiB,eW6JjB,gBACA,kBACA,aACA,uBACA,mBACA,eACA,kBACA,aACA,gBACA,2BAEA,yBACE,yBAGF,qBACE,gBACA,yCAIJ,oBAEE,gBACA,eACA,kBACA,eACA,iBACA,gBACA,cX5MwB,sCW8MxB,sCACA,6DAEA,aTnNc,sCSqNZ,kCACA,qDAGF,aACE,sCACA,kCACA,0BAIJ,eACE,UACA,wBACA,gBACA,CADA,YACA,CACA,iCACA,CADA,uBACA,CADA,kBACA,eACA,iBACA,6BAEA,YACE,gCACA,yDAGF,qBAEE,aACA,kBACA,gBACA,gBACA,mBACA,uBACA,6BAGF,eACE,YACA,cACA,cX/OmB,6BWiPnB,6BAGF,aACE,cXvPgB,4BW2PlB,aXpQwB,qBWsQtB,qGAEA,yBAGE,oCAIJ,qCACE,iCACA,sCAEA,aTtRY,gBSwRV,0CAGF,aT3RY,wCSgSd,eACE,wCAIJ,UACE,0BAIA,aX9RkB,4BWiShB,aX3SsB,qBW6SpB,qGAEA,yBAGE,iCAIJ,UTzTI,gBS2TF,wBAIJ,eACE,kBClUJ,kCACE,kBACA,gBACA,mBACA,qCAEA,iBANF,eAOI,gBACA,gBACA,6BAGF,eACE,SACA,gBACA,gFAEA,yBAEE,sCAIJ,UACE,yBAGF,kBZxBmB,6GY2BjB,sBAGE,CAHF,cAGE,8IAIA,eAGE,0BACA,iJAKF,yBAGE,kLAIA,iBAGE,qCAKN,4GACE,yBAGE,uCAKN,kBACE,qBAIJ,WACE,eACA,mBZhEmB,WEXb,oBU8EN,iBACA,YACA,iBACA,SACA,yBAEA,UACE,YACA,sBACA,iBACA,UVxFI,gFU4FN,kBAGE,qNAKA,kBZlGoB,4IY0GpB,kBV1GQ,qCUiHV,wBACE,YACE,0DAOJ,YACE,uCAGF,2BACE,gBACA,uDAEA,SACE,SACA,yDAGF,eACE,yDAKA,cACA,iBACA,mBACA,mFAGF,iBACE,eACA,WACA,WACA,WACA,qMAGF,eAGE,mEASF,cACE,gBACA,qFAGF,aZhKc,YYkKZ,eACA,WACA,eACA,gBACA,+GAGF,aACE,eACA,CACA,sBACA,eACA,yJAEA,cACE,uEAIJ,WACE,kBACA,WACA,eACA,iDAQF,iBACE,mBACA,yHAEA,iBACE,gBACA,+FAGF,UACE,WC3NR,gCACE,4CACA,cAGF,aACE,eACA,iBACA,cbKmB,SaHnB,uBACA,UACA,eACA,wCAEA,yBAEE,uBAGF,abhBsB,eakBpB,SAIJ,wBACE,YACA,kBACA,sBACA,WX5BM,eW8BN,qBACA,oBACA,eACA,gBACA,YACA,iBACA,iBACA,gBACA,eACA,kBACA,kBACA,yBACA,qBACA,uBACA,2BACA,qCACA,mBACA,WACA,4CAEA,wBAGE,4BACA,qCACA,sBAGF,eACE,mFAEA,wBX3DQ,gBW+DN,kBAIJ,wBbnEsB,eaqEpB,yGAGF,cAIE,iBACA,YACA,oBACA,iBACA,4BAGF,UbtFM,mBAGgB,qGauFpB,wBAGE,8BAIJ,kBXlEsB,2GWqEpB,wBAGE,0BAIJ,cACE,iBACA,YACA,cbhGgB,oBakGhB,uBACA,iBACA,kBACA,yBACA,+FAEA,oBAGE,cACA,mCAGF,UACE,uBAIJ,aACE,WACA,cAIJ,oBACE,UACA,cbxHoB,Sa0HpB,kBACA,uBACA,eACA,2BACA,2CACA,2DAEA,aAGE,uCACA,4BACA,2CACA,oBAGF,qCACE,uBAGF,aACE,6BACA,eACA,qBAGF,abjKwB,gCaqKxB,QACE,uEAGF,mBAGE,uBAGF,ab/JmB,sFakKjB,aAGE,oCACA,6BAGF,kCACE,gCAGF,aACE,6BACA,8BAGF,ablMsB,uCaqMpB,aACE,wBAKN,sBACE,0BACA,yBACA,kBACA,YACA,8BAEA,yBACE,mBAKN,abxMqB,Sa0MnB,kBACA,uBACA,eACA,gBACA,eACA,cACA,iBACA,UACA,2BACA,2CACA,0EAEA,aAGE,oCACA,4BACA,2CACA,yBAGF,kCACE,4BAGF,aACE,6BACA,eACA,0BAGF,abzPwB,qCa6PxB,QACE,sFAGF,mBAGE,gBAIJ,iBACE,uBACA,YAGF,WACE,cACA,qBACA,QACA,SACA,kBACA,+BAEA,kBAEE,mBACA,oBACA,kBACA,mBACA,iBAKF,WACE,uCAIJ,MACE,kBACA,CXvSU,sEW8SZ,aX9SY,uBWkTZ,aXnTc,4DWyTV,4CACE,CADF,oCACE,8DAKF,6CACE,CADF,qCACE,6BAKN,aACE,gBACA,qBACA,mCAEA,UX7UM,0BW+UJ,eAIJ,aACE,eACA,gBACA,uBACA,mBACA,iBAEA,aACE,wBACA,sBAIA,cACA,gBAKA,yCAPF,WACE,CAEA,gBACA,uBACA,gBACA,mBAWA,CAVA,mBAGF,aACE,CACA,cAKA,8BAIA,yBACE,sBAIJ,SACE,YACA,eACA,iBACA,uBACA,mBACA,gBACA,CAME,sDAGF,cACE,YACA,kBACA,oBACA,qBAKN,eACE,wBAGF,cACE,eAGF,iBACE,WACA,YACA,aACA,mBACA,uBACA,sBACA,6CAEA,cXhX4B,eAEC,0DWiX3B,sBACA,CADA,gCACA,CADA,kBACA,4BAGF,iBACE,qEAGF,YACE,iBAIJ,iBACE,WACA,YACA,aACA,mBACA,uBACA,qBAEA,cXxY4B,eAEC,WWyY3B,YACA,sBACA,CADA,gCACA,CADA,kBACA,WAIJ,oBACE,oBAGF,YACE,kBACA,2BAGF,+BACE,mBACA,SACA,gBAGF,kBbhd0B,cakdxB,kBACA,uCACA,mBAEA,eACE,uBAIJ,iBACE,QACA,SACA,2BACA,4BAEA,UACE,gBACA,2BACA,0BbpesB,2BawexB,WACE,iBACA,uBACA,yBb3esB,8Ba+exB,QACE,iBACA,uBACA,4BblfsB,6BasfxB,SACE,gBACA,2BACA,2BbzfsB,wBa+fxB,cACE,iBACA,cACA,iBACA,sBACA,qBACA,mBbrgBsB,WAJlB,gBa4gBJ,uBACA,mBACA,yFAEA,kBbpgBiB,cAIE,UaqgBjB,sCAKN,aACE,iBACA,gBACA,QACA,gBACA,aACA,yCAEA,eACE,mBb/hBsB,caiiBtB,kBACA,mCACA,gBACA,kBACA,sDAGF,OACE,wDAIA,UACE,8CAIJ,cACE,iBACA,cACA,iBACA,sBACA,qBACA,mBbxjBsB,WAJlB,gBa+jBJ,uBACA,mBACA,oDAEA,SACE,oDAGF,kBb3jBiB,cAIE,iBa8jBvB,qBACE,iBAIA,sBACA,cbrkBgB,oBawkBhB,cACE,gBACA,mBACA,kBACA,mBAGF,cACE,mBACA,iBAIJ,aAEE,gBACA,qCAGF,cACE,SACE,iBAGF,aAEE,CAEA,gBACA,yCAEA,iBACE,uCAGF,kBACE,qDAKF,gBAEE,kBACA,YAKN,qBACE,aACA,mBACA,cACA,gBACA,iBAGF,aACE,cACA,CACA,sBACA,WXnpBM,qBWqpBN,kBACA,eACA,gBACA,gCACA,2BACA,mDACA,qBAEA,eACE,eACA,qCThoBA,6GADF,kBSwoBI,4BACA,kHTpoBJ,kBSmoBI,4BACA,wBAIJ,+BACE,cbxqBsB,sBa4qBxB,eACE,aACA,2BAGF,aACE,eACA,kBAIJ,iBACE,yBAEA,iBACE,SACA,UACA,mBbtrBiB,yBawrBjB,gBACA,kBACA,eACA,gBACA,iBACA,WXxsBI,mDW6sBR,oBACE,aAGF,iBACE,kBACA,cACA,iCACA,mCAEA,eACE,yBAGF,YAVF,cAWI,oBAGF,YACE,sBACA,qBAGF,aACE,kBACA,iBACA,yBAKF,uBADF,YAEI,gBAIJ,oBACE,kBACA,eACA,6BACA,SACA,UACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,0CACA,wCACA,iCAGF,QACE,mBACA,WACA,YACA,gBACA,UACA,kBACA,UACA,yBAGF,kBACE,WACA,wBACA,qBAGF,UACE,YACA,UACA,mBACA,yBbjxBmB,qCamxBnB,sEAGF,wBACE,4CAGF,wBbhxBqB,+EaoxBrB,wBACE,2BAGF,iBACE,WACA,YACA,MACA,SACA,gBACA,mBACA,cACA,SACA,UACA,6BACA,CAKA,uEAFF,SACE,6BAeA,CAdA,sBAGF,iBACE,WACA,YACA,MACA,SACA,gBACA,mBACA,cACA,WAGA,8CAGF,SACE,qBAGF,iBACE,QACA,SACA,WACA,YACA,yBACA,kBACA,yBACA,sBACA,yBACA,sCACA,4CAGF,SACE,qBb50BmB,yDag1BrB,kBb11BqB,2Bag2BrB,iBACE,gBACA,cAGF,aACE,kBAGF,kBbz2BqB,ca22BnB,oBAEA,ab/1BqB,oBam2BrB,abp2BgB,yBaw2BhB,0BACE,CADF,uBACE,CADF,kBACE,kDAKA,sBACA,cACA,wDAEA,kBACE,8DAGF,cACE,sDAGF,ab13Bc,ea43BZ,0DAEA,ab93BY,0Bag4BV,sDAIJ,oBACE,cbt4Bc,sMay4Bd,yBAGE,0BAKN,aACE,UACA,mCACA,CADA,0BACA,gBACA,6BAEA,cACE,yBACA,cbz5Bc,aa25Bd,gBACA,gCACA,sCAGF,oDACE,YACE,uCAIJ,oDACE,YACE,uCAIJ,yBA3BF,YA4BI,yCAGF,eACE,aACA,iDAEA,abp7Bc,qBa27BpB,oBACE,kBACA,eACA,iBACA,gBACA,mBb58BmB,gBa88BnB,iBACA,qBAGF,eACE,gBACA,2BAEA,iBACE,aACA,wBAGF,kBACE,yBAGF,oBACE,gBACA,yBACA,yBACA,eAIJ,ab39BoB,uBa69BlB,CACA,WACA,CADA,+BACA,sBACA,cACA,oBACA,mBACA,cACA,WACA,0CAEA,UXp/BM,4BFWa,qCIYjB,yDADF,cSq+BE,sBAGF,Ub//BM,gCaigCJ,sDAEA,UbngCI,4BAYa,mDa+/BrB,uBACE,YACA,6CACA,uBACA,sBACA,WACA,0DAEA,sBACE,0DAIJ,uBACE,2BACA,gDAGF,ab3gCsB,6Ba6gCpB,uDAGF,ab7hC0B,yDaiiC1B,aACE,YAGF,aACE,cb5hCgB,6Ba8hChB,SACA,kBACA,kBACA,oBACA,SACA,aACA,sBACA,WACA,WACA,qBACA,kBAEA,kBACE,WAIJ,+BACE,oBAGF,gBACE,qEAGF,4BACE,gCAGF,eACE,kBACA,MACA,QACA,YACA,kBACA,YAEA,mBACA,yBACA,eACA,aAEA,wCAEA,UXvhCsB,mBWyhCpB,aACA,sBACA,mBACA,uBACA,mBACA,8BACA,wBACA,gCACA,uCAGF,wBACE,kBACA,WACA,YACA,eACA,cb7lCgB,yBa+lChB,aACA,uBACA,mBACA,sCAGF,mBACE,6CAEA,8BACE,WAKN,oBACE,UACA,oBACA,kBACA,cACA,SACA,uBACA,eACA,oBAGF,abxnCkB,ea0nChB,gBACA,yBACA,iBACA,kBACA,QACA,SACA,+BACA,yBAEA,aACE,WACA,CACA,0BACA,oBACA,mBACA,4BAIJ,iBACE,QACA,SACA,+BACA,WACA,YACA,sBACA,6BACA,CACA,wBACA,kBACA,2CAGF,2EACE,CADF,mEACE,8CAGF,4EACE,CADF,oEACE,qCAGF,GACE,sBACE,KAGF,2BACE,KAGF,2BACE,KAGF,yBACE,IAGF,wBACE,EArBF,4BAGF,GACE,sBACE,KAGF,2BACE,KAGF,2BACE,KAGF,yBACE,IAGF,wBACE,uCAIJ,GACE,wBACE,KAGF,0BACE,KAGF,2BACE,KAGF,uBACE,IAGF,sBACE,EAtBA,6BAIJ,GACE,wBACE,KAGF,0BACE,KAGF,2BACE,KAGF,uBACE,IAGF,sBACE,mCAIJ,GACE,OACE,SACA,yBACA,KAGF,wBACE,KAGF,UACE,YACA,6BACA,kBACA,UACA,IAGF,UACE,YACA,eACA,UACA,6BACA,EA5BA,yBAIJ,GACE,OACE,SACA,yBACA,KAGF,wBACE,KAGF,UACE,YACA,6BACA,kBACA,UACA,IAGF,UACE,YACA,eACA,UACA,6BACA,kCAIJ,GACE,gBACA,aACA,aAPE,wBAIJ,GACE,gBACA,aACA,6BAGF,KACE,OACA,WACA,YACA,kBACA,YACA,2BAEA,YACE,SACA,QACA,WACA,YACA,mBACA,6BAGF,mBACE,yBAGF,YACE,0BAGF,aACE,uBACA,WACA,YACA,SACA,iCAEA,oBACE,0BACA,kBACA,iBACA,WXnyCE,gBWqyCF,eACA,+LAMA,yBACE,mEAKF,yBACE,iBAMR,aACE,iBACA,mEAGF,abjzCoB,qBaqzClB,mBACA,gBACA,sBACA,gBAGF,aACE,iBACA,uBAGF,eACE,8BAGF,abp0CoB,eas0ClB,cACA,gBACA,gBACA,uBAGF,qBACE,sBAGF,WACE,8BAGF,GACE,kBACE,+BACA,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,oBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,kBACE,2CACA,CADA,kCACA,EA3BF,qBAGF,GACE,kBACE,+BACA,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,oBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,kBACE,2CACA,CADA,kCACA,iBAIJ,0DACE,CADF,kDACE,cAGF,kBACE,0BACA,aACA,YACA,uBACA,OACA,UACA,kBACA,MACA,kBACA,WACA,aACA,gBAEA,mBACE,oBAIJ,WACE,aACA,aACA,sBACA,kBACA,YACA,0BAGF,iBACE,MACA,QACA,SACA,OACA,WACA,kBACA,mBbn6CmB,kCaq6CnB,uBAGF,MACE,aACA,mBACA,uBACA,cb95CqB,eag6CrB,gBACA,0BACA,kBACA,qCAGF,SACE,oBACA,CADA,WACA,cAGF,wBb/6CqB,Wai7CnB,kBACA,MACA,OACA,aACA,qBAGF,iBACE,aAGF,iBACE,cACA,aACA,WACA,yBbh8CmB,kBak8CnB,cACA,UACA,WACA,eAGF,YACE,gCACA,CACA,iBACA,qBAEA,kBACE,UACA,uBAGF,aACE,CACA,sBACA,kBACA,uBAGF,oBACE,mBbl+CsB,kBao+CtB,cACA,eACA,wBACA,wBAGF,aACE,CACA,0BACA,gBACA,8BAEA,eACE,aACA,2BACA,8BACA,uCAGF,cACE,cb/+Cc,kBai/Cd,+BAGF,abp/CgB,eas/Cd,mBACA,gBACA,uBACA,kBACA,gBACA,YACA,iCAEA,UX3gDE,qBW6gDA,oHAEA,yBAGE,yCAKN,QACE,uBAIJ,kBACE,6BAEA,kBACE,oDAGF,eACE,6DAGF,UXviDI,oBWgjDN,kBACA,cACA,2BAGF,eACE,UAGF,iBACE,cAEA,WACE,WACA,sCACA,CADA,6BACA,cAGF,cACE,iBACA,cbrjDmB,gBaujDnB,gBAEA,abpkDsB,0BaskDpB,sBAEA,oBACE,gBAIJ,qBACE,4BAKN,GACE,cACA,eACA,WARI,mBAKN,GACE,cACA,eACA,2CC5lDF,u+KACE,uCAEA,u+KACE,CAOA,8MAMF,okBACE,UClBJ,YACE,gCACA,cACA,qBACA,iCAEA,aACE,cACA,cfOgB,gBeLhB,qBACA,eACA,gBAGF,WACE,UACA,yCAEA,8CAEA,WACE,iBACA,mBAKN,YACE,0BAGF,UACE,iBACA,kBACA,kBAGF,gBb0BwB,wBE9DtB,4BACA,kBWqCA,eACA,yBAEA,oBACE,sBACA,iBACA,4BX3CF,eWgDE,CACA,cACA,2DAJF,gBbesB,wBE9DtB,4BACA,CWgDE,iBAQE,CANF,+BXlDF,UWsDI,CACA,qBACA,mCAGF,aACE,kBACA,QACA,SACA,+BACA,WbjEE,6BamEF,gBACA,eACA,0BAKN,iBACE,WACqB,sCXrErB,+BANA,UW+EuB,sCXzEvB,gEWuEA,gBbhBsB,wBE9DtB,4BW0FE,CXnFF,iCANA,UWoFuB,sCX9EvB,kBWgFE,SACA,QACA,UACA,wBAIJ,WACE,aACA,mBACA,2BAGF,aACE,mBACA,sBAGF,YACE,cf5FgB,6Be+FhB,eACE,CAII,kMADF,eACE,wBAKN,eACE,cACA,0BACA,yFAEA,oBAGE,sBAKN,4BACE,gCACA,iBACA,gBACA,cACA,aACA,4BAGF,YACE,cACA,iBACA,kBACA,2BAGF,oBACE,gBACA,cACA,8BACA,eACA,oCACA,uCAEA,aACE,kCAGF,+BACE,gCAGF,aACE,yBACA,eACA,cf1JgB,kCe8JlB,aACE,eACA,gBACA,Wb9KI,CamLA,2NADF,eACE,gCAKN,afpLwB,oBeyL1B,iBACE,mDAEA,aACE,mBACA,gBACA,4BAIJ,UACE,kBACA,wBAGF,gBACE,qBACA,eACA,cflMkB,eeoMlB,kBACA,4BAEA,afhNwB,6BeoNxB,aACE,gBACA,uBACA,iBAIJ,kBACE,6BACA,gCACA,aACA,mBACA,eACA,kDAGF,aAEE,kBACA,yBAGF,kBACE,aACA,2BAGF,aftOoB,eewOlB,cACA,gBACA,mBACA,kDAIA,kBACE,oDAIA,SX7MF,sBACA,WACA,YACA,gBACA,oBACA,mBJxDmB,cAYD,eI+ClB,SACA,+EWuMI,aACE,CXxMN,qEWuMI,aACE,CXxMN,yEWuMI,aACE,CXxMN,0EWuMI,aACE,CXxMN,gEWuMI,aACE,sEAGF,QACE,yLAGF,mBAGE,0DAGF,kBACE,qCAGF,mDArBF,cAsBI,yDAIJ,af7Qc,iBe+QZ,eACA,4DAGF,gBACE,wDAGF,kBACE,gEAEA,cACE,iNAEA,kBAGE,cACA,gHAKN,afvSgB,0He4ShB,cAEE,gBACA,cf9SY,kZeiTZ,aAGE,gEAIJ,wBACE,iDAGF,eb1UI,kBEkEN,CAEA,eACA,cJhDiB,uCIkDjB,UWqQI,mBfzUoB,oDIsExB,wBACE,cJrDe,eIuDf,gBACA,mBACA,oDAGF,aACE,oDAGF,kBACE,oDAGF,eACE,WJ3FI,sDeiVJ,WACE,mDAGF,UfrVI,kBeuVF,eACA,8HAEA,kBAEE,iCAON,kBACE,mBAIJ,UbvWQ,kBayWN,cACA,mBACA,sBb5WM,yBa8WN,eACA,gBACA,YACA,kBACA,WACA,yBAEA,SACE,6BAIJ,YACE,eACA,gBACA,wBAGF,WACE,sBACA,cACA,kBACA,kBACA,gBACA,WACA,+BAEA,iBACE,QACA,SACA,+BACA,eACA,sDAIJ,kBAEE,gCACA,eACA,aACA,cACA,oEAEA,kBACE,SACA,SACA,6HAGF,aAEE,cACA,cfrZgB,eeuZhB,eACA,gBACA,kBACA,qBACA,kBACA,yJAEA,af5ZmB,qWe+ZjB,aAEE,WACA,kBACA,SACA,SACA,QACA,SACA,2BACA,CAEA,4CACA,CADA,kBACA,CADA,wBACA,iLAGF,WACE,6CACA,8GAKN,kBACE,gCACA,qSAKI,YACE,iSAGF,4CACE,sBAQR,sBACA,mBACA,6BACA,gCACA,+BAEA,iBACE,iBACA,cfldc,Ceqdd,eACA,eACA,oCAEA,aACE,gBACA,uBACA,oCAIJ,UACE,kBACA,uDAGF,iBACE,qDAGF,eACE,2BAIJ,af/eoB,eeiflB,gBACA,gBACA,kBACA,qBACA,6BAEA,kBACE,wCAEA,eACE,6BAIJ,aACE,0BACA,mCAEA,oBACE,kBAKN,eACE,2BAEA,UACE,8FAEA,8BAEE,CAFF,sBAEE,wBAIJ,iBACE,SACA,UACA,yBAGF,eACE,aACA,kBACA,mBACA,6BAEA,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,uBAIJ,iBACE,mBACA,YACA,gCACA,+BAEA,aACE,cACA,WACA,iBACA,gDAEA,kBACE,yBACA,wBAKN,YACE,uBACA,gBACA,iBACA,iCAEA,YACE,mBACA,iBACA,gBACA,8CAEA,wBACE,kBACA,uBACA,YACA,yCAGF,YACE,8BAIJ,WACE,4CAEA,kBACE,wCAGF,UACE,YACA,iCAGF,cACE,iBACA,WbhnBA,gBaknBA,gBACA,mBACA,uBACA,uCAEA,aACE,eACA,cf5mBU,gBe8mBV,gBACA,uBACA,gCAKN,aACE,uBAIJ,eACE,cACA,iDAGE,qBACA,Wb7oBE,gDaipBJ,QACE,6BACA,kDAEA,aACE,yEAGF,uBACE,4DAGF,ab5pBU,yBakqBd,cACE,gCAEA,cACE,cf1pBc,ee4pBd,kCAEA,oBACE,cf/pBY,qBeiqBZ,iBACA,gBACA,yCAEA,eACE,WbnrBF,ScFR,YACE,gCACA,8BAEA,aACE,cACA,WdJI,qBcMJ,eACA,gBACA,kBAIJ,YACE,iBAGF,WACE,aACA,mBACA,mCCrBF,GACE,sBACE,KAGF,2BACE,KAGF,4BACE,KAGF,2BACE,IAGF,yBACE,EDGF,0BCrBF,GACE,sBACE,KAGF,2BACE,KAGF,4BACE,KAGF,2BACE,IAGF,yBACE,qCAIJ,GACE,yBACE,KAGF,yBACE,KAGF,4BACE,KAGF,wBACE,IAGF,sBACE,EAtBA,2BAIJ,GACE,yBACE,KAGF,yBACE,KAGF,4BACE,KAGF,wBACE,IAGF,sBACE,gCAIJ,cACE,kBAGF,iBACE,cACA,eACA,iBACA,qBACA,gBACA,iBACA,gBACA,wBAEA,SACE,4BAGF,UACE,YACA,gBACA,sBAGF,cACE,iBACA,sBACA,CADA,gCACA,CADA,kBACA,qEAGF,kBACE,qBACA,sGAEA,eACE,qEAIJ,eAEE,qJAEA,kBAEE,mXAGF,eACE,mBACA,qJAGF,eACE,gBACA,2EAGF,eACE,+NAGF,eACE,2FAGF,iBACE,8BACA,cjBjGc,mBiBmGd,qHAEA,eACE,2JAIJ,eACE,mJAGF,iBACE,6EAGF,iBACE,eACA,6EAGF,iBACE,qBACA,qJAGF,eACE,6JAEA,QACE,2EAIJ,oBACE,2EAGF,uBACE,oBAIJ,af9Ic,qBegJZ,0BAEA,yBACE,8BAEA,aACE,kCAKF,oBACE,uCAEA,yBACE,wBAKN,ajBlKc,4CiBuKhB,YACE,8EAEA,aACE,mCAIJ,aACE,oDAEA,af5LQ,ee8LN,iDAIJ,kBACE,uDAEA,kBACE,qBACA,gCAKN,oBACE,kBACA,mBACA,YACA,WjBrNM,gBiBuNN,eACA,cACA,yBACA,oBACA,eACA,sBACA,sCAEA,kBACE,qBACA,+DAGF,oBACE,iBACA,sBACA,kBACA,eACA,oBACA,2GAKF,oBAGE,4BAIJ,ajBvOkB,SiByOhB,kBACA,kBACA,oBACA,SACA,aACA,sBACA,WACA,WACA,gCACA,+BAGF,UACE,kBACA,mDAGF,iBAEE,gCAGA,qEAEA,eACE,kBAKF,SACE,mBACA,kDAEA,kBACE,wDAEA,sBACE,iFAIJ,kBAEE,SAKN,iBACE,kBACA,YACA,gCACA,eACA,UAaA,mCACA,CADA,0BACA,wDAZA,QAPF,kBAUI,0BAGF,GACE,aACA,WALA,gBAGF,GACE,aACA,uDAMF,cAEE,kCAGF,kBACE,4BACA,sCAIA,ajBpTiB,CArBb,uEiBkVF,UjBlVE,kCiBsVF,ajBjUe,gCiBsUjB,UjB3VI,kCiB8VF,ajBzVoB,gEiB6VpB,UfjWE,mBFEgB,sEiBmWhB,kBACE,mBAMR,uBACE,sBACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,yCAEA,aACE,kBACA,OACA,QACA,MACA,SACA,6FACA,oBACA,WACA,2DAGF,oBACE,oCAGF,WACE,gBACA,uBACA,cACA,0CAEA,UACE,kBACA,MACA,gBACA,6DACA,oBACA,4CAGF,oBACE,gDAGJ,oDACE,mEAEF,oDACE,0CAGF,eACE,6DAGF,kBACE,gCAIJ,mBACE,+CAKF,sBACE,qEAEA,aACE,wBAKN,oBACE,YACA,CjBvagB,ciByahB,iBACA,mBACA,CACA,sBACA,8CANA,ajBvagB,CiB2ahB,eAOA,8CAGF,aACE,eACA,eAGF,YACE,8BACA,eACA,oBAEA,sBACE,gBACA,2CAGF,oBACE,sBAIJ,YACE,mBACA,WACA,cjBzcoB,iIiB4cpB,gBAGE,kBACA,0EAGF,yBACE,yEAMA,0CACE,CADF,kCACE,2EAKF,2CACE,CADF,mCACE,wBAKN,YACE,mBACA,2BACA,mBAGF,+BACE,aACA,6CAEA,uBACE,OACA,4DAEA,eACE,8DAGF,SACE,mBACA,qHAGF,cAEE,gBACA,4EAGF,cACE,0BAKN,kBACE,aACA,cACA,uBACA,aACA,kBAGF,gBACE,mBACA,iBACA,cjBvhBgB,CiByhBhB,iBACA,eACA,kBACA,+CAEA,ajB9hBgB,uBiBkiBhB,aACE,gBACA,uBACA,qBAIJ,kBACE,aACA,eACA,8BAEA,mBACE,kBACA,mBACA,yDAEA,gBACE,qCAGF,oBACE,WACA,eACA,gBACA,cjBxjBgB,4BiB8jBtB,iBACE,8BAGF,cACE,cACA,uCAGF,aACE,aACA,mBACA,uBACA,kBACA,kBAGF,kBACE,kBACA,wBAEA,YACE,eACA,8BACA,uBACA,uFAEA,SAEE,mCAIJ,cACE,iBACA,6CAEA,UACE,YACA,gBACA,+DAIJ,cAEE,wBAIJ,eACE,cjBpnBgB,eiBsnBhB,iBACA,8BAGF,kBACE,6BACA,gCACA,aACA,mBACA,eACA,wBAGF,aACE,qBACA,uDAGF,oBAEE,gBACA,eACA,gBACA,6JAGF,oBAME,4DAKA,UfzqBM,kBe+qBN,UACE,iKAQF,yBACE,+BAIJ,aACE,gBACA,uBACA,0DAGF,aAEE,sCAGF,kBACE,gCAGF,ajB7rBuB,ciB+rBrB,iBACA,mBACA,gBACA,2EAEA,aAEE,uBACA,gBACA,uCAGF,cACE,Wf3tBI,kCeguBR,UACE,kBACA,iBAGF,SACE,kBACA,YACA,WACA,CjB3tBgB,8IiBsuBhB,ajBtuBgB,wBiB0uBhB,UACE,wCAGF,kBf9tBsB,WF/BhB,8CiBiwBJ,kBACE,qBACA,+DAOJ,yBACE,cAIJ,YACE,eACA,yBACA,kBACA,cjBpwBgB,gBiBswBhB,qBACA,gBACA,uBAEA,QACE,OACA,kBACA,QACA,MAIA,iDAHA,YACA,uBACA,mBAUE,CATF,0BAEA,yBACE,kBACA,iBACA,cAIA,sDAGF,cAEE,cjB/xBiB,uBiBiyBjB,SACA,cACA,qBACA,eACA,iBACA,sMAEA,UfvzBE,yBe8zBJ,cACE,kBACA,YACA,+DAGF,aACE,eAKN,cACE,qBAEA,kBACE,oBAIJ,cACE,cACA,qBACA,WACE,YACA,SACA,2BAIF,UACE,YACA,qBAIJ,aACE,gBACA,kBACA,cjBx1BkB,gBiB01BlB,uBACA,mBACA,qBACA,uBAGF,aACE,gBACA,2BACA,2BAGF,ajBt2BoB,oBiB02BpB,aACE,eACA,eACA,gBACA,uBACA,mBACA,qBAGF,cACE,mBACA,kBACA,yBAEA,cACE,kBACA,yBACA,QACA,SACA,+BACA,yBAIJ,aACE,6CAEA,UACE,mDAGF,yBACE,6CAGF,mBACE,sBAIJ,oBACE,kCAEA,QACE,4CAIA,oBACA,0CAGF,kBACE,0CAGF,aACE,6BAIJ,wBACE,2BAGF,yBACE,cACA,SACA,WACA,YACA,oBACA,CADA,8BACA,CADA,gBACA,sBACA,wBACA,kBAGF,YACE,eACA,yBACA,kBACA,gBACA,gBACA,wBAEA,aACE,cjB97Bc,iBiBg8Bd,eACA,+BACA,aACA,sBACA,mBACA,uBACA,eACA,4BAEA,aACE,wBAIJ,eACE,CACA,qBACA,aACA,sBACA,uBACA,2BAEA,aACE,cACA,0BAGF,oBACE,cjB59BY,gBiB89BZ,gCAEA,yBACE,0BAKN,QACE,eACA,iDAEA,SACE,cACA,8BAGF,ajB/+Bc,oCiBq/BlB,cACE,cACA,SACA,uBACA,UACA,kBACA,oBACA,oFAEA,yBAEE,6BChhCJ,kBACE,aAGF,iBACE,8BACA,oBACA,aACA,sBAGF,cACE,MACA,OACA,QACA,SACA,0BACA,wBAGF,cACE,MACA,OACA,WACA,YACA,aACA,sBACA,mBACA,uBACA,2BACA,aACA,oBACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,oBAGF,mBACE,aACA,aACA,6CAGF,kBlBrC0B,WAJlB,kBkB8CN,gBACA,aACA,sBACA,0BAGF,WACE,WACA,gBACA,iBACA,8DAEA,UACE,YACA,sBACA,aACA,sBACA,mBACA,uBACA,aACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,oBAIJ,WACE,WACA,gBACA,iBACA,kBACA,wBAEA,iBACE,MACA,OACA,WACA,YACA,sBACA,aACA,aACA,CAGA,YACA,UACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,2CANA,qBACA,mBACA,uBAaF,CATE,mBAIJ,YACE,CAGA,iBACA,qCAGF,kBACE,UACE,YACA,gBACA,0BAGF,UACE,YACA,eACA,gBACA,cACA,oDAIJ,aAEE,mBACA,aACA,aACA,2DAEA,cACE,uLAGF,alB9GmB,SkBiHjB,eACA,gBACA,kBACA,oBACA,YACA,aACA,kBACA,6BACA,+mBAEA,aAGE,yBACA,qiBAGF,UlBvJI,qwDkB2JF,aAGE,sBAMR,sBACE,yBAGF,aACE,aACA,mBACA,uBACA,wBAGF,UACE,YACA,mBACA,mBACA,aACA,eACA,8BAEA,kBACE,+BAGF,cACE,mBACA,kCAIJ,mBACE,CACA,mBACA,0EAEA,mBACE,yBAIJ,cACE,iBACA,4BAEA,cACE,gBACA,WlBjNI,mBkBmNJ,2BAGF,alBjNwB,kGkBoNtB,aAGE,2CAIJ,aACE,2BAGF,cACE,clBhNiB,gBkBkNjB,mBACA,sCAEA,eACE,kCAGF,eACE,mBlB7Oe,cAcE,kBkBkOjB,eACA,gBACA,CAII,2NADF,eACE,oCAOV,WACE,UACA,mCAME,mBACA,mBACA,sCAEA,cACE,iBACA,kBACA,qCAGF,eACE,oCAIJ,kBACE,mBACA,kBACA,eAIJ,iBACE,eACA,mBACA,sBAEA,eACE,WlBnSI,kBkBqSJ,yBACA,eACA,qBAGF,kBlBxSmB,cAcE,gBkB6RnB,aACA,kBACA,6HAQF,eACE,qJAGF,kBACE,clB5SmB,mBkB8SnB,kBACA,aACA,kBACA,eACA,sCACA,yPAEA,iBACE,mBACA,qNAGF,mBACE,gBACA,4CAMJ,YACE,mBACA,gDAEA,UACE,cACA,4DAEA,aACE,2DAGF,cACE,kDAGF,iBACE,uDAIJ,eACE,sDAIJ,UhB3WM,2DgBgXR,0BACE,cACE,iBACA,qJAGF,cAIE,mBACA,4CAGF,kBACE,sDAGF,WACE,eACA,mBAIJ,oBACE,eACA,gBACA,iBACA,uHAGF,kBAOE,WlBvZM,kBkByZN,gBACA,eACA,YACA,kBACA,sBACA,+SAEA,alBjZgB,YkBmZd,eACA,WACA,eACA,gBACA,uSAGF,YACE,uPAGF,WACE,WACA,+WAGF,UACE,wBAKF,ehBvbM,CFGkB,gBkBubtB,oBACA,iEhB3bI,2BFGkB,qDkBgc1B,iBAEE,aACA,qEAEA,wBACE,CADF,qBACE,CADF,oBACE,CADF,gBACE,gBACA,kKAIJ,YAKE,8BACA,mBlBjdwB,akBmdxB,iBACA,0LAEA,aACE,iBACA,clBvciB,mBkBycjB,kNAGF,aACE,6DAIJ,cAEE,yDAGF,WAEE,eACA,0BAGF,gBAEE,sDAGF,qBAEE,eAGF,UACE,gBACA,0BAGF,YACE,6BACA,qCAEA,yBAJF,cAKI,gBACA,iDAIJ,qBAEE,UACA,qCAEA,+CALF,UAMI,sDAIJ,aAEE,gBACA,gBACA,gBACA,kBACA,2FAEA,alBvhBwB,qCkB2hBxB,oDAZF,eAaI,sCAKF,4BADF,eAEI,yBAIJ,YACE,+BACA,gBACA,0BAEA,cACE,iBACA,mBACA,sCAGF,aACE,sBACA,WACA,CACA,UlB1jBI,gBECA,agB4jBJ,oBACA,eACA,YACA,CACA,SACA,kBACA,yBACA,iBACA,gBACA,gBACA,4CAEA,wBACE,+CAGF,ehB5kBI,yBgB8kBF,mBACA,kBACA,6DAEA,QACE,gBACA,gBACA,mEAEA,QACE,0DAIJ,UlB7lBE,oBkB+lBA,eACA,gBhB/lBA,+CgBomBJ,YACE,8BACA,mBACA,4CAIJ,aACE,WlB7mBI,ekB+mBJ,gBACA,mBACA,wCAGF,eACE,mBACA,+CAEA,UlBxnBI,ekB0nBF,qCAIJ,uBAnFF,YAoFI,eACA,QACA,wCAEA,iBACE,iBAKN,eAWE,eACA,wBAXA,eACE,iBACA,uBAGF,aACE,gBACA,2CAMF,eACE,mBAGF,eACE,cACA,gBACA,+BAEA,4BACE,4BAGF,QACE,oCAIA,UlBzqBE,akB2qBA,kBACA,eACA,mBACA,qBACA,8EAEA,eAEE,yWAOA,kBlB9qBW,WEXb,iJgBgsBA,iBAGE,oMAUR,aACE,iIAIJ,4BAIE,clBlsBmB,ekBosBnB,gBACA,6cAEA,aAGE,6BACA,uCAIJ,iBACE,mBACA,oBACA,eAEA,yFAEA,qBACE,qGAIJ,YAIE,eACA,iIAEA,eACE,CAII,w1BADF,eACE,sDAMR,iBAEE,oDAKA,eACE,0DAGF,eACE,mBACA,aACA,mBACA,wEAEA,UlBnxBI,CkBqxBF,gBACA,uBAKN,YACE,2CAEA,QACE,WACA,cAIJ,UACE,eACA,gBACA,iBAEA,YACE,gBACA,eACA,kBACA,sCAGF,YACE,4CAEA,kBACE,yDAGF,SACE,sBACA,cACA,WACA,YACA,aACA,gDACA,mBlB5zBe,WEDb,egBg0BF,CACA,eACA,kBACA,2EAEA,QACE,wMAGF,mBAGE,+DAGF,kBACE,qCAGF,wDA7BF,cA8BI,4DAIJ,WACE,eACA,gBACA,SACA,kBACA,cAKN,iBACE,YACA,gBACA,YACA,aACA,uBACA,mBACA,gBhB12BM,yDgB62BN,aAGE,gBACA,WACA,YACA,SACA,sBACA,CADA,gCACA,CADA,kBACA,gBhBr3BI,uBgBy3BN,iBACE,YACA,aACA,+BACA,iEACA,kBACA,wCACA,uBAGF,iBACE,WACA,YACA,MACA,OACA,uBAGF,iBACE,YACA,WACA,UACA,YACA,4BACA,6BAEA,UACE,8BAGF,UhBt5BI,egBw5BF,gBACA,cACA,kBACA,2BAGF,iBACE,mCACA,qCAIJ,oCACE,eAEE,uBAGF,YACE,wBAKN,gBACE,sCAEA,eACE,gCAGF,eACE,qDAGF,UlB57BM,iDkBg8BN,YACE,0DAEA,YACE,0BAIJ,YACE,iBACA,uBACA,kDAGF,alB57BoB,qBkB87BlB,wDAEA,yBACE,WCp9BN,YACE,oBAGF,cACE,uBACA,eACA,gBACA,cnBcmB,4CmBXnB,ajBNY,sCiBWd,2CACE,oBAGF,QACE,wBACA,UACA,+CAEA,WACE,mBACA,UACA,0BAGF,aACE,sBACA,SACA,YACA,kBACA,aACA,WACA,UACA,WnBtCI,gBECA,eiBwCJ,oBACA,gBACA,qDAEA,anB9Bc,CmB4Bd,2CAEA,anB9Bc,CmB4Bd,+CAEA,anB9Bc,CmB4Bd,gDAEA,anB9Bc,CmB4Bd,sCAEA,anB9Bc,gCmBkCd,8CfpCA,uCADF,cesC4D,0CfjC5D,ceiC4D,oBAI9D,UnBtDQ,mBmBwDN,mBnBrDsB,oCmBuDtB,iBACA,kBACA,eACA,gBACA,sBAEA,anB3CmB,gBmB6CjB,0BACA,mFAEA,oBAEU,iCAKZ,mBACA,eAEA,gBACA,wCAEA,anB7EwB,sDmBiFxB,YACE,2CAGF,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,gBACA,kBACA,SACA,kBACA,sBACA,kDAEA,oBnBnGsB,qCmB0G1B,eACE,kBACA,aACA,mBnB/GsB,gBmBiHtB,gBACA,cACA,yBAEA,iBACE,gBACA,wCAEA,UnB5HI,iCmB8HJ,WACE,iBACA,2BAIJ,iBACE,cACA,CACA,cACA,iBACA,WnBzII,qBmB2IJ,gBACA,iBACA,qBACA,mBACA,gBACA,gGAEA,kBACE,qBACA,iIAEA,eACE,kJAIJ,eACE,mBACA,2DAGF,eACE,eACA,8BAGF,cACE,wFAGF,eACE,sCAGF,iBACE,2BACA,WnB/KE,mBmBiLF,mDAEA,eACE,8DAIJ,eACE,0DAGF,iBACE,+BAGF,iBACE,eACA,2DAGF,eACE,+DAEA,QACE,8BAIJ,oBACE,8BAGF,uBACE,6BAGF,anBhMiB,qBmBkMf,mCAEA,oEAGE,oBACE,gDAEA,qDAMR,UACE,YACA,gBACA,wBAIJ,iBACE,UACA,QACA,gHAEA,+BAEE,uDAIJ,iBAEE,WACA,mIAGE,aACE,sBACA,SACA,YACA,0BACA,yBACA,WACA,iBACA,UACA,WnBtQE,gBECA,eiBwQF,oBACA,YACA,qBACA,yLAEA,anB/PY,CmB6PZ,sKAEA,anB/PY,CmB6PZ,8KAEA,anB/PY,CmB6PZ,gLAEA,anB/PY,CmB6PZ,4JAEA,anB/PY,yKmBmQZ,SACE,qJAGF,kBnBlRoB,+ImBmRpB,8Cf1QF,8JADF,ce4Q8D,kKfvQ9D,ceuQ8D,qCfhQ5D,8TADF,sBeoQM,gBACA,6BAMR,aACE,kBACA,SACA,UACA,WACA,gBACA,2CAEA,aACE,mBACA,WACA,YACA,cnBzRiB,emB2RjB,iBACA,kBACA,WACA,4CAIJ,iBACE,SACA,oCAGF,aACE,kBACA,sBACA,SACA,0BACA,YACA,WACA,WnBnUM,mBAIkB,sCmBkUxB,eACA,WACA,aACA,6CAGF,aACE,0CAGF,YACE,eACA,kBACA,iMAEA,kBAGa,iKAEb,YAGE,mBACA,mBACA,2BACA,iBACA,eACA,+DAGF,6BACE,qEAEA,aACE,gBACA,uBACA,mBACA,sEAGF,eACE,qEAGF,aACE,iBACA,gBACA,uBACA,mBACA,4EAMA,anBzWe,wBmB8WrB,eACE,iCAEA,YACE,mBACA,eACA,oBACA,YACA,gBACA,8BAIJ,UACE,WACA,cACA,kCAEA,iBACE,kBACA,aACA,WACA,sBjBzZI,wBiB2ZJ,sBACA,4BACA,gBACA,2CAEA,aACE,kBACA,sBACA,SACA,OACA,SACA,SACA,aACA,WACA,cnBzZiB,gFmB2ZjB,eACA,oBACA,gBACA,UACA,UACA,4BACA,iDAEA,UjBlbE,sEiBobF,WACE,cnBtae,CEff,4DiBobF,WACE,cnBtae,CEff,gEiBobF,WACE,cnBtae,CEff,iEiBobF,WACE,cnBtae,CEff,uDiBobF,WACE,cnBtae,yCmB2anB,2EAKE,0CAKN,iFACE,aACA,uBACA,8BACA,UACA,4BACA,8CAEA,aACE,cnB1csB,emB4ctB,gBACA,aACA,oBACA,2JAEA,aAGE,wCAIJ,SACE,kCAIJ,YACE,aACA,cnBrdkB,gBmBudlB,sCAEA,cACE,kBACA,2CAGF,aACE,gDAEA,aACE,eACA,gBACA,yBACA,qDAGF,iBACE,eACA,kBACA,WACA,WACA,mBjB5dkB,8DiB+dlB,iBACE,MACA,OACA,WACA,kBACA,mBnBvfa,0BmB8frB,UnB1gBQ,oBmB4gBN,eACA,gBjB5gBM,4BiBghBR,YACE,mBACA,0BACA,YACA,aACA,8BACA,cACA,oBAGF,YACE,cACA,sBAEA,oBACE,uBACA,cACA,YACA,iBACA,sBACA,uBAGF,oBACE,aACA,CAEA,oBACA,CADA,6BACA,UACA,QACA,YACA,uBACA,2BAIJ,iBACE,iBACA,0CAKE,yBACE,qCACA,WjB7jBE,mBFWa,gBmBqjBf,8CAGA,yBACE,oCACA,uCAMR,iBACE,kBACA,uCACA,gBjB9kBM,gBiBglBN,uBACA,6CAGF,YACE,mBACA,aACA,WnBxlBM,emB0lBN,sDAEA,aACE,cnBxkBiB,wEmB2kBjB,6EAEA,aACE,WnBnmBE,gBmBqmBF,sGAIJ,kBnB7lBmB,WEXb,6PiBgnBF,UjBhnBE,0DiBonBN,wCAGF,gBACE,iBACA,mBACA,gBACA,yBACA,cACA,+BAEA,oBACE,SACA,eACA,kBACA,gCAGF,oBACE,aACA,UACA,WACA,kBACA,kCAIA,ajB5oBU,CkBFZ,+BAHF,YACE,cACA,kBAUA,CATA,cAKA,kBACA,2BACA,gBAEA,uBAEA,YACE,uBACA,WACA,YACA,iBACA,6BAEA,WACE,gBACA,oBACA,aACA,yBACA,gBACA,oCAEA,0BACE,oCAGF,cACE,YACA,oBACA,YACA,6BAIJ,qBACE,WACA,gBACA,cACA,aACA,sBACA,qCAEA,4BARF,cASI,qBAMR,kBACE,wBACA,CADA,eACA,MACA,UACA,cACA,qCAEA,mBAPF,gBAQI,+BAGF,eACE,qCAEA,6BAHF,kBAII,wHAMJ,WAGE,mCAIJ,YACE,mBACA,uBACA,YACA,CpBrFmB,IoBoGrB,aACE,aACA,sBACA,WACA,YACA,CAIA,oBAGF,qBACE,WACA,mBACA,cpBhHwB,eoBkHxB,cACA,eACA,SACA,iBACA,aACA,SACA,UACA,2BAEA,yBACE,6BAIJ,kBACE,SACA,oBACA,cpBnIwB,eoBqIxB,cACA,eACA,kBACA,UACA,mCAEA,yBACE,wCAGF,kBACE,2BAIJ,oBACE,iBACA,2BAGF,iBACE,kCAGF,cACE,cACA,eACA,aACA,kBACA,QACA,UACA,cAGF,kBACE,WlB5KM,ckB8KN,eACA,aACA,qBACA,2DAEA,kBAGE,oBAGF,SACE,2BAGF,sBACE,cpB3LsB,kGoB8LtB,sBAGE,WlBpME,kCkBwMJ,apB7LiB,oBoBmMrB,oBACE,iBACA,oBAGF,kBpBlNqB,cAaH,iBoBwMhB,eACA,gBACA,yBACA,eACA,yBAGF,iBACE,cACA,uCAGE,aACE,WACA,kBACA,SACA,OACA,QACA,cACA,UACA,oBACA,YACA,UACA,gFACA,gBAKN,YACE,eACA,mBACA,cACA,eACA,kBACA,UACA,UACA,gBACA,uBAEA,QACE,YACA,aACA,cACA,uBACA,aACA,gBACA,uBACA,gBACA,mBACA,OACA,4CAGF,apBxQwB,uBoB4QxB,qCACE,4CAEA,apB/QsB,wCoBiRpB,4CAIJ,SAEE,SAIJ,WACE,kBACA,sBACA,aACA,sBACA,gBACA,wDAEA,SACE,gBACA,gBACA,qBAGF,kBpB5SmB,yBoBiTrB,WACE,aACA,cACA,uBAGF,kBACE,iCAGF,iBACE,sEAGF,kBACE,SACA,cpBrTkB,eoBuTlB,eACA,eACA,kFAEA,aACE,CAKA,kLAEA,UlBhVI,mBkBkVF,kFAKJ,2BACE,wCAIJ,YACE,oBACA,6BACA,+CAEA,sBAEE,kBACA,eACA,qBACA,0CAGF,eACE,gDAKJ,SACE,6BAGF,eACE,gBACA,gBACA,cpBzWkB,0DoB2WlB,UACA,uCAEA,YACE,WACA,uCAGF,iBACE,gCAGF,QACE,uBACA,SACA,6BACA,cACA,iCAIF,eACE,2CACA,YACE,WACA,mCAKN,kBACE,aACA,mCAIA,apB/YkB,0BoBiZhB,gCAIJ,WACE,4DAEA,cACE,uEAEA,eACE,uBAKN,oBACE,uBACA,gBACA,mBACA,OACA,sBAGF,oBACE,iBACA,uCAGF,apB7akB,mBAbG,kBoB8bnB,aACA,eACA,gBACA,eACA,aACA,cACA,mBACA,uBACA,yBACA,sCAbF,cAcI,kDAGF,eACE,2CAGF,apB5cwB,qBoB8ctB,uDAEA,yBACE,eAKN,qBACE,uCAKA,sBACE,6BACA,qCASF,qCAXA,sBACE,6BACA,sCAgBF,mJAFF,qBAGI,sBAKF,wBACA,aACA,2BACA,mBACA,mBACA,2BAEA,aACE,iCAEA,UACE,kBACA,uCAEA,SACE,kCAKN,aACE,aACA,yBChhBJ,iBACE,eACA,gBACA,crBagB,mBAbG,eqBGnB,aACA,cACA,sBACA,mBACA,uBACA,aACA,qEAGE,aAEE,WACA,aACA,SACA,yCAIJ,gBACE,gCAGF,eACE,uCAEA,aACE,mBACA,crBjBY,qCqBqBd,cACE,gBACA,kBCtCJ,UACE,cACA,+BACA,0BAEA,UACE,qCAGF,iBATF,QAUI,mBAIJ,qBACE,mBACA,uBAEA,YACE,kBACA,mBACA,gBACA,2BAEA,aACE,WACA,YACA,SACA,oBACA,CADA,8BACA,CADA,gBACA,uBAIJ,YACE,mBACA,mBACA,aACA,6BAEA,aACE,aACA,mBACA,qBACA,gBACA,qCAGF,UACE,eACA,cACA,+BAGF,aACE,WACA,YACA,gBACA,mCAEA,UACE,YACA,cACA,SACA,kBACA,mBACA,oBACA,CADA,8BACA,CADA,gBACA,qCAIJ,gBACE,gBACA,4CAEA,cACE,WpB1EF,gBoB4EE,gBACA,uBACA,0CAGF,aACE,eACA,ctBtEU,gBsBwEV,gBACA,uBACA,yBAKN,kBtB3FiB,asB6Ff,mBACA,uBACA,gDAEA,YACE,cACA,eACA,mDAGF,qBACE,kBACA,gCACA,WACA,gBACA,mBACA,gBACA,uBACA,qDAEA,YACE,iEAEA,cACE,sDAIJ,YACE,cAOV,kBtBjIqB,sBsBoInB,iBACE,4BAGF,aACE,eAIJ,cACE,kBACA,qBACA,cACA,iBACA,eACA,mBACA,gBACA,uBACA,eACA,oEAEA,YAEE,sBAGF,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,8BAEA,oBACE,mBACA,CC/KJ,eAGF,SnBkDE,sBACA,WACA,YACA,gBACA,oBACA,mBJxDmB,cAYD,eI+ClB,SACA,cmBxDA,CACA,2BACA,iBACA,eACA,2CAEA,aACE,CAHF,iCAEA,aACE,CAHF,qCAEA,aACE,CAHF,sCAEA,aACE,CAHF,4BAEA,aACE,kCAGF,QACE,6EAGF,mBAGE,sBAGF,kBACE,qCAGF,eA3BF,cA4BI,kCAKF,QACE,qDAGF,mBAEE,mBAGF,iBACE,SACA,WACA,UACA,qBACA,UACA,0BACA,4CACA,eACA,WACA,YACA,cvBxCmB,euB0CnB,oBACA,0BAEA,mBACE,WACA,0BAIJ,sBACE,iCAEA,mBACE,WACA,gCAIJ,QACE,uBACA,cvB5DkB,euB8DlB,uCAEA,uBACE,sCAGF,aACE,yBAKN,avB7EkB,mBuB+EhB,gCACA,kBACA,eACA,gBACA,uBAGF,YACE,cvBxFkB,kBuB0FlB,iBAIA,avB7FgB,mBuB+Fd,gCACA,gBACA,aACA,eACA,eACA,qBAEA,oBACE,iBACA,eAIJ,YACE,mBACA,aACA,gCACA,0BAEA,eACE,qBAGF,aACE,cvBvHY,gBuByHZ,uBACA,mBACA,4BAEA,eACE,uBAGF,avBlIc,qBuBoIZ,eACA,gBACA,cACA,gBACA,uBACA,mBACA,qGAKE,yBACE,wBAMR,aACE,eACA,iBACA,gBACA,iBACA,mBACA,gBACA,cvB3JiB,0BuB+JnB,aACE,WACA,2CAEA,mCACE,yBACA,0CAGF,wBACE,WC1LR,yCCCE,qBACA,sBACA,CADA,kBACA,wBACA,WACA,YACA,eAEA,UACE,8BAIJ,evBXQ,kBuBaN,sCACA,kBACA,eACA,UACA,iDAEA,2BACE,2DAGF,UACE,mCAIJ,iBACE,SACA,WACA,eACA,yCAGF,iBACE,UACA,SACA,UACA,gBvBvCM,kBuByCN,sCACA,gBACA,gDAEA,aACE,eACA,SACA,gBACA,uBACA,iKAEA,+BAGE,2DAIJ,WACE,wBAKF,2BACE,eAIJ,aACE,eACA,iBACA,gBACA,WACA,UACA,eACA,0CAEA,mBAEE,mBAGF,8BACE,CADF,sBACE,WACA,cACA,CACA,UACA,YACA,eACA,0EAMA,SACE,oBACA,CADA,WACA,eCpGN,WAEE,0BAGF,kBANW,kBAQT,cACA,iCACA,wBACE,mCAOF,WACE,SACA,UACA,2CAGF,aACE,aAEA,sBACA,YACA,6BACA,6DAGE,oBACE,WACA,iBACA,iBACA,iJAGF,UACE,gEAEF,oBACE,gBACA,WACA,2CAKN,yBACE,sBACA,kBACA,YACA,gBACA,kDAEA,uBACE,CADF,oBACE,CADF,eACE,WACA,YACA,SACA,4BACA,WACA,yBACA,eACA,4CACA,sBACA,oBACA,6DAEA,uBACE,6DAGF,sBACE,wEAGF,sBACE,kBACA,SCjFR,WACE,sBACA,aACA,sBACA,kBACA,iBACA,UACA,qBAEA,iBACE,oBAGF,kBACE,2DvBDF,SuBI0D,yBvBC1D,SuBD0D,qCvBQxD,qLuBLA,yBAGF,eACE,gBACA,eACA,qCvBZA,4BuBgBA,SACE,WACA,YACA,eACA,UACA,+BALF,SACE,WACA,YACA,eACA,UACA,yCAIJ,4BAGF,YACE,mBACA,mBACA,UACA,mBACA,eACA,mBAEA,aACE,sBACA,oCACA,sBACA,YACA,cACA,c3BzCgB,kB2B2ChB,qBACA,eACA,mBAGF,iCACE,iDAEA,YAEE,mBACA,mCACA,SAKN,iBACE,mBACA,UACA,qCvBrDE,6CADF,euBwDkF,sCvBlEhF,sBADF,cuBoE0D,yBvB/D1D,cuB+D0D,gBAG5D,ezBlFQ,kBEkEN,CACA,sBACA,gBACA,cJhDiB,uCIkDjB,mBAEA,wBACE,cJrDe,eIuDf,gBACA,mBACA,mBAGF,aACE,mBAGF,kBACE,mBAGF,eACE,WJ3FI,kB2BuFR,YACE,c3B1EkB,a2B4ElB,mBACA,oBAEA,aACE,qBACA,wBAGF,aACE,c3BnFmB,gB2BqFnB,mBACA,gBACA,uBACA,0BAIJ,aACE,gBACA,gBACA,kBAGF,kB3BhHqB,kB2BkHnB,gBACA,yBAEA,a3BxGgB,mB2B0Gd,aACA,gBACA,eACA,eACA,6BAEA,oBACE,iBACA,0BAIJ,iBACE,6BAEA,kBACE,gCACA,eACA,aACA,aACA,gBACA,eACA,c3BhIY,iC2BmIZ,oBACE,iBACA,8FAIJ,eAEE,mCAGF,aACE,aACA,c3B/IiB,qB2BiJjB,0HAEA,aAGE,0BACA,gBAQN,WACA,kBAGA,+BANF,qBACE,UACA,CAEA,eACA,aAgBA,CAfA,eAGF,iBACE,MACA,OACA,mBACA,CAGA,qBACA,CACA,eACA,WACA,YACA,uBAEA,kB3BlMmB,0B2BuMrB,u1BACE,OACA,gBACA,aACA,8BAEA,aACE,sBACA,CADA,4DACA,CADA,kBACA,+BACA,CADA,2BACA,WACA,YACA,oBACA,eACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,oCAGF,aACE,WACA,YACA,YACA,eACA,sCAGF,yBAzBF,aA0BI,iBAIJ,kBACE,eACA,gBACA,mBAGF,cACE,kBACA,MACA,OACA,WACA,YACA,0BACA,oBCrPF,kBACE,gB1BAM,WACA,e0BEN,aACA,sBACA,YACA,uBACA,eACA,kBACA,kBACA,YACA,gBAGF,e1BdQ,cFcY,S4BGlB,WACA,YACA,iEAEA,aAGE,iCAGF,eACE,2BxBcF,iBACE,mBACA,cACA,eACA,aACA,gBACA,yBwBfJ,aACE,eACA,yBAGF,aACE,eACA,gBACA,6BAGF,aACE,kBACA,W1B7CM,0B0B+CN,WACA,SACA,gBACA,kBACA,eACA,gBACA,UACA,oBACA,WACA,4BACA,iBACA,2DAKE,YACE,wDAKF,SACE,uBAKN,WACE,aACA,sBACA,4BAEA,iBACE,c5BpEgB,a4BsEhB,YACA,mBACA,CAGE,yDAIJ,UACE,gBAIJ,qBACE,eACA,gBACA,kBACA,kBACA,WACA,aACA,2BxB/DA,iBACE,mBACA,cACA,eACA,aACA,gBACA,sBwB8DJ,WACE,sBACA,cACA,WACA,kBACA,kBACA,gBACA,kCAEA,eACE,qEAIA,cACE,MACA,gCAIJ,e1BlIM,gC0BuIR,cACE,cACA,qBACA,c5B1HqB,kB4B4HrB,UACA,mEAEA,WAEE,WACA,sBACA,CADA,gCACA,CADA,kBACA,CAIE,0HAFF,WACE,oBACA,CADA,8BACA,CADA,gB1BtJE,C0BuJF,wBAKN,UACE,CAEA,iBACA,MACA,OACA,UACA,gB1BnKM,iC0BsKN,YACE,sBAIJ,WACE,gBACA,kBACA,WACA,aACA,uBACA,qCAGF,cACE,YACA,WACA,kBACA,UACA,sBACA,CADA,gCACA,CADA,kBACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,qDAEA,WACE,oBACA,CADA,8BACA,CADA,gBACA,sCAIJ,0BACE,2BACA,gBACA,kBACA,yBAGF,eACE,iBACA,yBAGF,UACE,cAGF,UACE,YACA,kBACA,qCAEA,UACE,YACA,aACA,mBACA,uBACA,2CAEA,c1B3K0B,eAEC,C0BqL7B,8CALF,iBACE,MACA,OACA,QACA,SAYA,CAXA,yBAQA,mBACA,8BACA,oBACA,4BAEA,mBACE,0DAGF,SACE,4DAEA,mBACE,mBAKN,yBACE,sBACA,SACA,W1BvQM,e0ByQN,aACA,mBACA,eACA,cACA,cACA,kBACA,kBACA,MACA,SACA,yBAGF,MACE,0BAGF,OACE,CASA,4CANF,UACE,kBACA,kBACA,OACA,YACA,oBAUA,6BAEA,WACE,sBAGF,mBACE,qBACA,gBACA,c5BlTsB,mF4BqTtB,yBAGE,wBAKN,oBACE,sBAGF,qB1BpUQ,Y0BsUN,WACA,kBACA,YACA,UACA,SACA,YACA,8BAGF,wB5BpUqB,qB4BwUrB,iBACE,UACA,QACA,YACA,qKAKA,WAEE,mFAGF,WACE,eAKJ,qBACE,kBACA,mBACA,kBACA,oBACA,cACA,wBAEA,eACE,YACA,yBAGF,cACE,kBACA,gBACA,gCAEA,UACE,cACA,kBACA,6BACA,WACA,SACA,OACA,oBACA,qCAIJ,oCACE,iCAGF,wBACE,uCAIA,mBACA,mBACA,6BACA,0BACA,eAIJ,eACE,kBACA,gB1BzZM,e0B2ZN,kBACA,sBACA,cACA,wBAEA,eACE,sBACA,qBAGF,SACE,gCAGF,UACE,YACA,0BxBjYF,iBACE,mBACA,cACA,eACA,aACA,gBACA,qBwBgYF,eACE,gBACA,UACA,kBACA,0BAGF,oBACE,sBACA,SACA,gCAEA,wBACE,0BACA,qBACA,sBACA,UACA,4BAKF,qBACE,CADF,gCACE,CADF,kBACE,kBACA,QACA,2BACA,yBAIJ,iBACE,UACA,SACA,OACA,QACA,sBACA,iFACA,eACA,UACA,4BACA,gCAEA,SACE,6EAKF,iBAEE,wBAIJ,YACE,kBACA,MACA,OACA,WACA,YACA,UACA,SACA,gB1B9eI,cFcY,gB4BmehB,oBACA,+BAEA,aACE,oBACA,8GAEA,aAGE,+BAIJ,aACE,eACA,kCAGF,aACE,eACA,gBACA,4BAIJ,YACE,8BACA,oBACA,CAGE,gUAEA,aAIE,wBAKN,cACE,mBACA,gBACA,uBACA,oCAGE,cACE,qCAKF,eACE,+BAIJ,sBACE,iBACA,eACA,SACA,0BACA,8GAEA,U1BpjBE,+E0B4jBN,cAGE,gBACA,6BAGF,U1BnkBM,iB0BqkBJ,yBAGF,oBACE,aACA,mDAGF,U1B7kBM,uB0BklBN,cACE,YACA,eACA,8BAEA,UACE,WACA,+BAOA,6DANA,iBACA,cACA,kBACA,WACA,UACA,YAWA,CAVA,+BASA,kBACA,+BAGF,iBACE,UACA,kBACA,WACA,YACA,YACA,UACA,4BACA,mBACA,sCACA,oBACA,qBAIJ,gBACE,uBAEA,oBACE,eACA,gBACA,W1BloBE,sF0BqoBF,yBAGE,qBAKN,cACE,YACA,kBACA,4BAEA,UACE,WACA,+BACA,kBACA,cACA,kBACA,WACA,SACA,2DAGF,aAEE,kBACA,WACA,kBACA,SACA,mBACA,6BAGF,6BACE,6BAGF,iBACE,UACA,UACA,kBACA,WACA,YACA,QACA,iBACA,4BACA,mBACA,sCACA,oBACA,CAGE,yFAKF,SACE,6GAQF,gBACE,oBACA,iBC5sBR,YACE,mBACA,mBACA,kBACA,QACA,SACA,YACA,mBAGF,YACE,kBACA,gBACA,yBACA,0BACA,eACA,iBACA,yBACA,WACA,4BACA,wCAEA,uBCtBF,kB9BGqB,sB8BDnB,kBACA,uCACA,YACA,gBACA,qCAEA,aARF,SASI,kBAGF,cACE,mBACA,gBACA,eACA,kBACA,0BACA,6BAGF,WACE,6BAGF,yBACE,sCAEA,uBACE,uCACA,wBACA,wBAIJ,eACE,kDAIA,oBACE,+BAIJ,cACE,sBAGF,eACE,aAIJ,kB9BnDqB,sB8BqDnB,kBACA,uCACA,YACA,gBACA,qCAEA,YARF,SASI,uBAGF,kBACE,oBAGF,kBACE,YACA,0BACA,gBACA,mBAGF,YACE,gCACA,4BAGF,YACE,iCAGF,aACE,gBACA,qBACA,eACA,aACA,aC3FJ,cAOE,qBACA,W/BPM,gD+BEJ,iBACA,+BAOF,WACE,iBAIJ,sBACE,6BAEA,uBACE,2BACA,4BACA,mB/BjBsB,4B+BqBxB,oBACE,8BACA,+BACA,aACA,qBAIJ,YACE,8BACA,cACA,c/BfmB,c+BiBnB,oBAGF,iBACE,OACA,kBACA,iBACA,gBACA,8BACA,eACA,0BAEA,aACE,6BAIJ,a/BlD0B,mC+BqDxB,aACE,oDAGF,QACE,wBAIJ,iBACE,YACA,OACA,WACA,WACA,yBACA,uBAIA,oBACE,WACA,eACA,yBAGF,iBACE,gBACA,oBAIJ,iBACE,aACA,gBACA,kBACA,gB7B5FM,sB6B8FN,sGAEA,+BAEE,oBAKF,2BACA,gB7BxGM,0B6B2GN,cACE,gBACA,gBACA,oBACA,cACA,WACA,gCACA,W/BnHI,yB+BqHJ,kBACA,4CAEA,QACE,2GAGF,mBAGE,wCAKN,cACE,6CAEA,SACE,kBACA,kBACA,qDAGF,SACE,WACA,kBACA,MACA,OACA,WACA,YACA,sCACA,mBACA,4BAIJ,SACE,kBACA,wBACA,gBACA,MACA,iCAEA,aACE,WACA,gBACA,gBACA,gB7BpKI,mB6ByKR,iBACE,qBACA,YACA,wBAEA,UACE,YACA,wBAIJ,cACE,kBACA,iBACA,c/BlKiB,mD+BqKjB,YACE,qDAGF,eACE,uDAGF,YACE,qBAIJ,YACE,wBC1MF,iBACE,aACA,mBACA,mBhCEwB,WAJlB,kBgCKN,YACA,WACA,gBACA,iBACA,gBACA,4DAEA,aACE,eACA,mFAGF,iBACE,kBACA,gBACA,+FAEA,iBACE,OACA,MACA,kCAIJ,aACE,chCTiB,2BgCanB,cACE,gBACA,iBACA,mBACA,2BAGF,cACE,gBACA,iBACA,gBACA,mBACA,0CAIJ,aACE,kBACA,cACA,mBACA,gCACA,eACA,qBACA,aACA,0BACA,4DAEA,aACE,iBACA,gDAGF,kBhC9DwB,iDgCkExB,kBhC1DmB,WEXb,qG8B0EN,kB9BxEU,WAFJ,oC8BgFR,kBACE,YACA,eACA,iBACA,gBACA,8BAGF,aACE,UACA,kBACA,YACA,gBACA,oCAGF,iBACE,4FAGF,eAEE,mBACA,qCAGF,mCACE,UACE,cACA,0CAGF,YACE,4DAEA,YACE,kBCtHN,U/BEQ,gC+BCN,oBAEA,cACE,iBACA,gBACA,kBACA,mBAGF,U/BVM,0B+BYJ,oBAGF,eACE,cACA,iBACA,mDAGF,UACE,YACA,gBACA,gCACA,gBC3BJ,WACE,gBACA,aACA,sBACA,yBACA,kBACA,+BAEA,gBACE,eACA,CACA,2BACA,kCAGF,QACE,iCAGF,aACE,6BAGF,sBACE,0BAGF,MACE,kBACA,aACA,sBACA,iBACA,mDAGF,eACE,sBhClCI,0BgCoCJ,cACA,gDAGF,iBACE,gDAGF,WACE,mBAIJ,eACE,mBACA,yBACA,gBACA,aACA,sBACA,qBAEA,aACE,sBAGF,aACE,SACA,CACA,4BACA,cACA,qDAHA,sBAOA,qCAIJ,qBAEI,cACE,wBAKN,qBACE,WACA,cACA,6DAEA,UAEE,YACA,UACA,wCAGF,YACE,cACA,kDACA,qCAEA,uCALF,aAMI,yCAIJ,eACE,oCAGF,YACE,uDAGF,cACE,sCAGF,gBACE,eACA,CACA,2BACA,yCAGF,QACE,mCAGF,gBACE,yBAEA,kCAHF,eAII,sCAIJ,sBACE,gBACA,sCAGF,uCACE,YACE,iKAEA,eAGE,6CAIJ,gBACE,2EAGF,YAEE,kGAGF,gBACE,+BAGF,YACE,gBACA,gLAEA,eAIE,gCAIJ,iBACE,6CAEA,cACE,8CAKF,gBACE,CAIA,yFAGF,eACE,0BAMR,cACE,aACA,uBACA,mBACA,gBACA,iBACA,iBACA,gBACA,mBACA,WhCjNM,kBgCmNN,eACA,iBACA,qBACA,sCACA,4FAEA,kBAGE,qCAIJ,UACE,UACE,uDAGF,kCACE,mCAGF,kBAEE,sCAIJ,2CACE,YACE,sCAOA,sEAGF,YACE,uCAIJ,0CACE,YACE,uCAIJ,UACE,YACE,QC1QJ,eACE,eACA,8BAEA,QAEE,gBACA,UAGF,kBACE,kBACA,cAGF,iBACE,MACA,OACA,YACA,qBACA,kBACA,mBACA,sBAEA,kBnCXiB,amCgBnB,iBACE,aACA,cACA,iBACA,eACA,gBACA,gEAEA,YAEE,gCAGF,aACE,8BAIA,qBACA,WACA,eACA,WnCjDE,cmCmDF,UACA,oBACA,gBjCpDE,yBiCsDF,kBACA,iBACA,oCAEA,oBnCtDoB,wBmC2DtB,cACE,sBAGF,YACE,mBACA,iBACA,cAIJ,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,gBACA,mBACA,cACA,uBAEA,iBACE,qBAGF,oBjC7FY,8EiCkGZ,gBAGE,gBACA,gCAGF,mBACE,SACA,wCAGF,mBAEE,eAIJ,oBACE,WACA,gBACA,CACA,oBACA,iBACA,gBACA,mBACA,cACA,mBAGF,UACE,iBACA,eAGF,eACE,mBACA,cnC1Hc,amC8HhB,cACE,uBACA,UACA,SACA,SACA,cnCnIc,0BmCqId,kBACA,mBAEA,oBACE,sCAGF,qCAEE,eAIJ,WACE,eACA,kBACA,eACA,6BAIJ,4BACE,gCAEA,YACE,2CAGF,4BACE,aACA,aACA,mBACA,mGAEA,UAEE,aACA,+GAEA,oBnCtLoB,sDmC4LxB,cACE,gBACA,iBACA,YACA,oBACA,cnCpLkB,sCmCuLlB,gCAGF,YACE,mBACA,4CAEA,aACE,wBACA,iBACA,oCAIJ,uBACE,CADF,oBACE,CADF,eACE,sBACA,eACA,WnC1NI,qBmC4NJ,WACA,UACA,oBACA,qXACA,yBACA,kBACA,CACA,yBACA,mDAGF,aACE,cAIJ,anC7NkB,qBmCgOhB,+BACE,6BAEA,6BACE,YC/ON,qBACE,iBANc,cAQd,kBACA,sCAEA,WANF,UAOI,eACA,mBAIJ,sBACE,eACA,gBACA,gBACA,qBACA,cpCPkB,oBoCUlB,apCnBwB,0BoCqBtB,6EAEA,oBAGE,wCAIJ,apCrBkB,oBoC0BlB,YACE,oBACA,+BAEA,eACE,yBAIJ,eACE,cpClCmB,qBoCsCrB,iBACE,cpCvCmB,uBoC2CrB,eACE,mBACA,kBACA,kBACA,yHAGF,sBAME,mBACA,oBACA,gBACA,cpC3DmB,qBoC+DrB,aACE,qBAGF,gBACE,qBAGF,eACE,qBAGF,gBACE,yCAGF,aAEE,qBAGF,eACE,qBAGF,kBACE,yCAMA,iBACA,iBACA,yDAEA,2BACE,yDAGF,2BACE,qBAIJ,UACE,SACA,SACA,gCACA,eACA,4BAEA,UACE,SACA,wBAIJ,UACE,yBACA,8BACA,CADA,iBACA,gBACA,mBACA,iEAEA,+BAEE,cACA,kBACA,gBACA,gBACA,cpCxIc,iCoC4IhB,uBACE,gBACA,gBACA,cpC9IY,qDoCkJd,WAEE,iBACA,kBACA,qBACA,mEAEA,SACE,kBACA,iFAEA,gBACE,kBACA,6EAGF,iBACE,SACA,UACA,mBACA,gBACA,uBACA,+BAMR,YACE,oBAIJ,kBACE,eACA,mCAEA,iBACE,oBACA,8BAGF,YACE,8BACA,eACA,6BAGF,UACE,uBACA,eACA,iBACA,WlCpNI,iBkCsNJ,kBACA,qEAEA,aAEE,6CAIA,apChNiB,oCoCqNnB,sBACE,gBACA,eACA,iBACA,qCAGF,4BA3BF,iBA4BI,4BAIJ,iBACE,YACA,sBACA,mBACA,CACA,sBACA,0BACA,QACA,aACA,yCAEA,sBACE,eACA,iBACA,gBACA,cpClPc,mBoCoPd,mBACA,gCACA,uBACA,mBACA,gBACA,wFAEA,eAEE,cACA,2CAGF,oBACE,2BAKN,iBACE,mCAIE,UACqB,sChCnRzB,CgCoRI,kBACA,uCAEA,aACE,WACA,YACA,mBACA,iBlCpOgB,wBE9DtB,4BACA,iCgCsSE,cACE,mCAEA,aACE,WlC3SA,qBkC6SA,uDAGE,yBACE,2CAKN,aACE,cpC1SY,kCoCkTlB,sBAEE,CACA,eACA,eACA,iBACA,mBACA,cpCzTgB,sCoC4ThB,apCrUsB,0BoCuUpB,kBAIJ,cACE,SACA,UACA,gBACA,uBACA,oBACA,kBACA,oBACA,cACA,kBAGF,sBACE,eACA,iBACA,gBACA,mBACA,cpCjVmB,wBoCoVnB,sBACE,cACA,eACA,gBACA,cACA,kBAKF,cACA,iBpC/VmB,mCoC6VrB,sBACE,CAEA,eACA,mBACA,cpClWmB,kBoCuWnB,cACA,iBpCxWmB,kBoCgXnB,cpChXmB,mCoC+WrB,sBACE,CACA,gBACA,gBACA,mBACA,cpCpXmB,kBoCyXnB,cpCzXmB,kBoCiYrB,sBACE,eACA,iBACA,gBACA,mBACA,cpCtYmB,mCoC0YrB,gBAEE,mDAEA,2BACE,mDAGF,2BACE,kBAIJ,eACE,kBAGF,kBACE,yCAGF,cAEE,kBAGF,UACE,SACA,SACA,4CACA,cACA,yBAEA,UACE,SACA,iDAIJ,YAEE,+BAGF,kBpCpcmB,kBoCscjB,kBACA,gBACA,sBACA,oCAEA,UACE,aACA,2BACA,iBACA,8BACA,mBACA,uDAGF,YACE,yBACA,qBACA,mFAEA,aACE,eACA,qCAGF,sDAVF,UAWI,8BACA,6CAIJ,MACE,sBACA,qCAEA,2CAJF,YAKI,sBAKN,iBACE,yBAEA,WACE,WACA,uBACA,4BAIJ,iBACE,mBACA,uCAEA,eACE,mCAGF,eACE,cACA,qCAGF,eACE,UACA,mDAEA,kBACE,aACA,iBACA,0FAKE,oBACE,gFAIJ,cACE,qDAIJ,aACE,cACA,6CAMA,UACqB,sChC9hB3B,mDgCiiBI,cACE,4DAEA,cACE,qCAKN,oCACE,eACE,sCAIJ,2BA9DF,iBA+DI,mFAIJ,qBAGE,mBpC9jBiB,kBoCgkBjB,kCACA,uBAGF,YACE,kBACA,WACA,YACA,2BAEA,YACE,WACA,uCAKF,YACE,eACA,mBACA,mBACA,qCAGF,sCACE,kBACE,uCAIJ,apChlBmB,qCoColBnB,eACE,WlCpmBE,gBkCsmBF,2CAEA,apC3lBc,gDoC8lBZ,apC5lBe,+CoCkmBnB,eACE,qBAIJ,kBACE,yBAEA,aACE,SACA,eACA,YACA,kBACA,qCAIJ,gDAEI,kBACE,yCAGF,eACE,gBACA,WACA,kBACA,uDAEA,iBACE,sCAMR,8BACE,aACE,uCAEA,gBACE,sDAGF,kBACE,6EAIJ,aAEE,qBAIJ,WACE,UAIJ,mBACE,qCAEA,SAHF,eAII,kBAGF,YACE,uBACA,mBACA,aACA,qBAEA,SlC1rBI,YkC4rBF,qCAGF,gBAXF,SAYI,mBACA,sBAIJ,eACE,uBACA,gBACA,gBACA,uBAGF,eACE,gBACA,0BAEA,YACE,yBACA,gBACA,eACA,cpCvsBc,6BoC2sBhB,eACE,iBACA,+BAGF,kBpC5tBiB,aoC8tBf,0BACA,aACA,uCAEA,YACE,gCAIJ,cACE,gBACA,uDAEA,YACE,mBACA,iDAGF,UACE,YACA,0BACA,gCAIJ,YACE,uCAEA,sBACE,eACA,gBACA,cACA,qCAGF,cACE,cpCtvBY,uFoC4vBlB,eACE,cASA,CpCtwBgB,2CoCmwBhB,iBACA,CACA,kBACA,gBAGF,eACE,cACA,aACA,kDACA,cACA,qCAEA,eAPF,oCAQI,cACA,8BAEA,UACE,aACA,sBACA,0CAEA,OACE,cACA,2CAGF,YACE,mBACA,QACA,cACA,qCAIJ,UACE,2BAGF,eACE,sCAIJ,eAtCF,UAuCI,6BAEA,aACE,gBACA,gBACA,2GAEA,eAGE,uFAIJ,+BAGE,2BAGF,YACE,gCAEA,eACE,qEAEA,eAEE,gBACA,2CAGF,eACE,SAQZ,iBACE,qBACA,iBAGF,aACE,kBACA,aACA,UACA,YACA,cpC92BsB,qBoCg3BtB,eACA,qCAEA,gBAVF,eAWI,WACA,gBACA,cpC12Bc,SqChBlB,UACE,eACA,iBACA,yBACA,qBAEA,WAEE,iBACA,mBACA,6BACA,gBACA,mBACA,oBAGF,qBACE,gCACA,aACA,gBACA,oBAGF,eACE,qEAGF,kBrCxBmB,UqC6BnB,arC1BwB,0BqC4BtB,gBAEA,oBACE,eAIJ,eACE,CAII,4HADF,eACE,+FAOF,sBAEE,yFAKF,YAEE,gCAMJ,kBrCjEiB,6BqCmEf,gCACA,4CAEA,qBACE,8BACA,2CAGF,uBACE,+BACA,0BAKN,qBACE,gBAIJ,aACE,mBACA,MAGF,+BACE,0BAGF,sBACE,SACA,aACA,8CAGF,oBAEE,qBACA,iBACA,eACA,crC/FkB,gBqCiGlB,0DAEA,UnChHM,wDmCoHN,eACE,iBACA,sEAGF,cACE,yCAKF,YAEE,yDAEA,qBACE,iBACA,eACA,gBACA,qEAEA,cACE,2EAGF,YACE,mBACA,uFAEA,YACE,qHAOJ,sBACA,cACA,uBAIJ,wBACE,mBrC/JiB,sBqCiKjB,YACA,mBACA,gCAEA,gBACE,mBACA,oBAIJ,YACE,yBACA,aACA,mBrC9KiB,gCqCiLjB,aACE,gBACA,mBAIJ,wBACE,aACA,mBACA,qCAEA,wCACE,4BACE,0BAIJ,kBACE,iCAGF,kBrCtMiB,uCqCyMf,kBACE,4BAIJ,gBACE,oBACA,sCAEA,SACE,wCAGF,YACE,mBACA,mCAGF,aACE,aACA,uBACA,mBACA,kBACA,6CAEA,UACE,YACA,kCAIJ,aACE,mCAGF,aACE,iBACA,crClOY,gBqCoOZ,mCAIJ,QACE,WACA,qCAEA,sBACE,gBACA,qCAOJ,4FAFF,YAGI,gCAIJ,aACE,sCAEA,eACE,4BAIJ,wBACE,aACA,gBACA,qCAEA,2BALF,4BAMI,sCAIJ,+CACE,YACE,iBCzRN,YACE,uBACA,WACA,iBACA,iCAEA,gBACE,gBACA,oBACA,cACA,wCAEA,YACE,yBACA,mBtCfe,YsCiBf,yBAIJ,WAvBc,UAyBZ,oBACA,iCAEA,YACE,mBACA,YACA,uCAEA,aACE,yCAEA,oBACE,aACA,2CAGF,SpCxCA,YoC0CE,kBACA,YACA,uCAIJ,aACE,ctCpCY,qBsCsCZ,cACA,eACA,aACA,0HAIA,kBAGE,+BAKN,aACE,iBACA,YACA,aACA,qCAGF,sCACE,YACE,6BAIJ,eACE,0BACA,gBACA,mBACA,qCAEA,2BANF,eAOI,+BAGF,aACE,aACA,ctC9EY,qBsCgFZ,0BACA,2CACA,0BACA,mBACA,gBACA,uBACA,mCAEA,gBACE,oCAGF,UpCzGA,yBoC2GE,0BACA,2CACA,uCAGF,kBACE,sBACA,+BAIJ,kBACE,wBACA,SACA,iCAEA,QACE,kBACA,6DAIJ,UpCjIE,yBFWa,gBsCyHb,gBACA,mEAEA,wBACE,6DAKN,yBACE,iCAIJ,qBACE,WACA,gBApJY,cAsJZ,sCAGF,uCACE,YACE,iCAGF,WA/JY,cAiKV,sCAIJ,gCACE,UACE,0BAMF,2BACA,qCAEA,wBALF,cAMI,CACA,sBACA,kCAGF,YACE,oBAEA,gCACA,0BAEA,eAEA,mBACA,8BACA,mCAEA,eACE,kBACA,yCAGF,mBACE,4DAEA,eACE,qCAIJ,gCAzBF,eA0BI,iBACA,6BAIJ,atCrMmB,esCuMjB,iBACA,gBACA,qCAEA,2BANF,eAOI,6BAIJ,atChNmB,esCkNjB,iBACA,gBACA,mBACA,4BAGF,wBACE,eACA,gBACA,ctC7Nc,mBsC+Nd,kBACA,gCACA,4BAGF,cACE,ctCnOiB,iBsCqOjB,gBACA,0CAGF,UpCxPI,gBoC0PF,uFAGF,eAEE,gEAGF,aACE,4CAGF,cACE,gBACA,WpCxQE,oBoC0QF,iBACA,gBACA,mBACA,2BAGF,cACE,iBACA,ctCnQiB,mBsCqQjB,kCAEA,UpCtRE,gBoCwRA,CAII,2NADF,eACE,4BAMR,UACE,SACA,SACA,4CACA,cACA,mCAEA,UACE,SACA,qCAKN,eA9SF,aA+SI,iCAEA,YACE,yBAGF,UACE,UACA,YACA,iCAEA,YACE,4BAGF,YACE,8DAGF,eAEE,gCACA,gBACA,0EAEA,eACE,+BAIJ,eACE,6DAGF,2BtCxUe,YsC+UrB,UACE,SACA,cACA,WACA,sDAKA,atCtVkB,0DsCyVhB,atClWsB,4DsCuWxB,apC1Wc,gBoC4WZ,4DAGF,apC9WU,gBoCgXR,0DAGF,atCvWgB,gBsCyWd,0DAGF,apCtXU,gBoCwXR,UAIJ,YACE,eACA,yBAEA,aACE,qBACA,oCAEA,kBACE,4BAGF,cACE,gBACA,+BAEA,oBACE,iBACA,gCAIJ,eACE,yBACA,eACA,CAII,iNADF,eACE,2BAKN,oBACE,ctCtZc,qBsCwZd,yBACA,eACA,gBACA,gCACA,iCAEA,UpC3aE,gCoC6aA,oCAGF,atC5aoB,gCsC8alB,iBAMR,aACE,iBACA,eACA,sBAGF,aACE,eACA,cACA,wBAEA,aACE,kBAIJ,YACE,eACA,mBACA,wBAGF,YACE,WACA,sBACA,aACA,+BAEA,aACE,qBACA,gBACA,eACA,iBACA,ctC1cmB,CsC+cf,4MADF,eACE,sCAKN,aACE,gCAIJ,YAEE,mBACA,kEAEA,UACE,kBACA,4BACA,gFAEA,iBACE,kDAKN,aAEE,aACA,sBACA,4EAEA,cACE,WACA,kBACA,mBACA,uEAIJ,cAEE,iBAGF,YACE,eACA,kBACA,2CAEA,kBACE,eACA,8BAGF,kBACE,+CAGF,gBACE,uDAEA,gBACE,mBACA,YACA,YAKN,kBACE,eACA,cAEA,atCpiBwB,qBsCsiBtB,oBAEA,yBACE,SAKN,aACE,YAGF,kBACE,iBACA,oBAEA,YACE,2BACA,mBACA,aACA,mBtC7jBiB,cAYD,0BsCojBhB,eACA,kBACA,oBAGF,iBACE,4BAEA,aACE,SACA,kBACA,WACA,YACA,qBAIJ,2BACE,mBAGF,oBACE,uBAGF,atC5kBgB,oBsCglBhB,kBACE,0BACA,aACA,ctCplBgB,gCsCslBhB,eACA,qBACA,gBACA,kBAGF,cACE,kBACA,ctC7lBc,2BsCimBhB,iBACE,SACA,WACA,WACA,YACA,kBACA,oCAEA,kBpCtnBY,oCoC0nBZ,kBACE,mCAGF,kBtCpnBiB,sDsCynBnB,atCrnBqB,qBsCynBnB,gBACA,sBAGF,aACE,0BAGF,atCjoBqB,sBsCqoBrB,apCnpBc,yDoCwpBhB,oBAIE,ctC9oBqB,iGsCipBrB,eACE,yIAIA,4BACE,cACA,iIAGF,8BACE,CADF,sBACE,WACA,sBAKN,YAEE,mBACA,sCAEA,aACE,CACA,gBACA,kBACA,0DAIA,8BACE,CADF,sBACE,WACA,gBAKN,kBACE,8BACA,yBAEA,yBpCxsBc,yBoC4sBd,yBACE,wBAGF,yBpC7sBU,wBoCktBR,2BACA,eACA,iBACA,4BACA,kBACA,gBACA,0BAEA,atCjtBgB,uBsCutBhB,wBACA,qBAGF,atC1tBgB,csC+tBlB,kBtC5uBqB,kBsC8uBnB,mBACA,uBAEA,YACE,8BACA,mBACA,aACA,gCAEA,SACE,SACA,gDAEA,aACE,8BAIJ,aACE,gBACA,ctCtvBc,yBsCwvBd,iBACA,gCAEA,aACE,qBACA,iHAEA,aAGE,mCAIJ,apCjxBM,6BoCwxBR,YACE,2BACA,6BACA,mCAEA,kBACE,gFAGF,YAEE,cACA,sBACA,YACA,ctC3xBY,mLsC8xBZ,kBAEE,gBACA,uBACA,sCAIJ,aACE,6BACA,4CAEA,atCzyBU,iBsC2yBR,gBACA,wCAIJ,aACE,sBACA,WACA,aACA,qBACA,ctCtzBY,WsC6zBpB,kBAGE,0BAFA,eACA,uBASA,CARA,eAGF,oBACE,gBACA,CAEA,qBACA,oBAGF,YACE,eACA,CACA,kBACA,wBAEA,qBACE,cACA,mBACA,aACA,0FAGF,kBAEE,kBACA,YACA,6CAGF,QACE,SACA,+CAEA,aACE,sEAGF,uBACE,yDAGF,apCv3BY,8CoC43Bd,qBACE,aACA,WpC/3BI,coCo4BR,iBACE,kkECr4BF,kIACE,CADF,sIACE,uIAYA,aAEE,yIAGF,aAEE,qIAGF,aAEE,6IAGF,aAEE,UChCJ,aACE,gCAEA,gBACE,eACA,mBACA,+BAGF,cACE,iBACA,8CAGF,aACE,kBACA,wBAGF,gBACE,iCAGF,aACE,kBACA,uCAGF,oBACE,gDAGF,SACE,YACA,8BAGF,cACE,iBACA,mEAGF,aACE,kBACA,2DAGF,cAEE,gBACA,mFAGF,cACE,gBACA,+BAGF,eACE,2EAGF,UAEE,mCAGF,aACE,iBACA,yBAGF,kBACE,kBACA,4BAGF,UACE,UACA,wBAGF,aACE,kCAGF,MACE,WACA,cACA,mBACA,2CAGF,aACE,iBACA,0CAGF,gBACE,eACA,mCAGF,WACE,sCAGF,gBACE,gBACA,yCAGF,UACE,iCAGF,aACE,iBACA,+BAGF,UACE,0BAGF,gBACE,eACA,UAGA,WACA,yCAGF,iBACE,mBACA,4GAGF,iBAEE,gBACA,uCAGF,kBACE,eACA,2BAGF,aACE,kBACA,wCAGF,SACE,YACA,yDAGF,SACE,WACA,CAKA,oFAGF,UACE,OACA,uGAGF,UAEE,gBACA,uCAIA,cACE,iBACA,kEAEA,cACE,gBACA,qCAKN,WACE,eACA,iBACA,uCAGF,WACE,sCAGF,aACE,kBACA,0CAGF,gBACE,eACA,uDAGF,gBACE,2CAGF,cACE,iBACA,YACA,yEAGF,aAEE,iBACA,iBAGF,wBACE,iBAGF,SACE,oBACA,yBAGF,aACE,8EAGF,cAEE,gBACA,oDAGF,cACE,mBACA,gEAGF,iBACE,gBACA,CAMA,8KAGF,SACE,QACA,yDAGF,kBACE,eACA,uDAGF,kBACE,gBACA,qDAGF,SACE,QACA,8FAGF,cAEE,mBACA,4CAGF,UACE,SACA,kDAEA,UACE,OACA,kEACA,8BAIJ,sXACE,uCAGF,gBAEE,kCAGF,cACE,iBACA,gDAGF,UACE,UACA,gEAGF,aACE,uDAGF,WACE,WACA,uDAGF,UACE,WACA,uDAGF,UACE,WACA,kDAGF,MACE,0CAGF,iBACE,yBACA,qDAGF,cACE,iBACA,qCAGF,kCACE,gBAEE,kBACA,2DAEA,gBACE,mBACA,uEAKF,gBAEE,kBACA,gFAKN,cAEE,gBACA,6CAKE,eACE,eACA,sDAIJ,aACE,kBACA,4DAKF,cACE,gBACA,8DAGF,gBACE,eACA,mCAIJ,aACE,kBACA,iBACA,kCAGF,WACE,mCAGF,WACE,oCAGF,cACE,gBACA,gFAGF,cACE,mBACA,+DAGF,SACE,QACA,sBChbJ,YACE,eACA,CACA,kBACA,0BAEA,qBACE,iBACA,cACA,mBACA,yDAEA,YAEE,mBACA,kBACA,sBACA,YACA,4BAGF,oBACE,cACA,cACA,qGAEA,kBAGE,sDAKN,iBAEE,gBACA,eACA,iBACA,WvCrCI,uBuCuCJ,mBACA,iBACA,4BAGF,cACE,6BAGF,cACE,czCpCgB,kByCsChB,gBACA,qBAIJ,YACE,eACA,cACA,yBAEA,gBACE,mBACA,6BAEA,aACE,sCAIJ,azCnEwB,gByCqEtB,qBACA,2GCrEM,SACE,CDoER,iGCrEM,SACE,CDoER,qGCrEM,SACE,CDoER,sGCrEM,SACE,CDoER,4FCrEM,SACE,mJAQZ,aAME,0BACA,mMAEA,oBACE,iOAGF,yBACE,CAKE,0zCAIJ,oBAGE,uUAGF,a1C3BqB,qB0C6BnB,oCAIJ,yBACE,6HAEA,oBAGE,4BAIJ,yBACE,qGAEA,oBAGE,eAIJ,a1CvDoB,yE0C2DpB,+BACE,0D","file":"skins/glitch/contrast/common.css","sourcesContent":["html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:\"\";content:none}table{border-collapse:collapse;border-spacing:0}html{scrollbar-color:#313543 rgba(0,0,0,.1)}::-webkit-scrollbar{width:12px;height:12px}::-webkit-scrollbar-thumb{background:#313543;border:0px none #fff;border-radius:50px}::-webkit-scrollbar-thumb:hover{background:#353a49}::-webkit-scrollbar-thumb:active{background:#313543}::-webkit-scrollbar-track{border:0px none #fff;border-radius:0;background:rgba(0,0,0,.1)}::-webkit-scrollbar-track:hover{background:#282c37}::-webkit-scrollbar-track:active{background:#282c37}::-webkit-scrollbar-corner{background:transparent}body{font-family:sans-serif,sans-serif;background:#191b22;font-size:13px;line-height:18px;font-weight:400;color:#fff;text-rendering:optimizelegibility;font-feature-settings:\"kern\";text-size-adjust:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-tap-highlight-color:transparent}body.system-font{font-family:system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"Oxygen\",\"Ubuntu\",\"Cantarell\",\"Fira Sans\",\"Droid Sans\",\"Helvetica Neue\",sans-serif,sans-serif}body.app-body{padding:0}body.app-body.layout-single-column{height:auto;min-height:100vh;overflow-y:scroll}body.app-body.layout-multiple-columns{position:absolute;width:100%;height:100%}body.app-body.with-modals--active{overflow-y:hidden}body.lighter{background:#282c37}body.with-modals{overflow-x:hidden;overflow-y:scroll}body.with-modals--active{overflow-y:hidden}body.embed{background:#313543;margin:0;padding-bottom:0}body.embed .container{position:absolute;width:100%;height:100%;overflow:hidden}body.admin{background:#1f232b;padding:0}body.error{position:absolute;text-align:center;color:#dde3ec;background:#282c37;width:100%;height:100%;padding:0;display:flex;justify-content:center;align-items:center}body.error .dialog{vertical-align:middle;margin:20px}body.error .dialog img{display:block;max-width:470px;width:100%;height:auto;margin-top:-120px}body.error .dialog h1{font-size:20px;line-height:28px;font-weight:400}button{font-family:inherit;cursor:pointer}button:focus{outline:none}.app-holder,.app-holder>div{display:flex;width:100%;align-items:center;justify-content:center;outline:0 !important}.layout-single-column .app-holder,.layout-single-column .app-holder>div{min-height:100vh}.layout-multiple-columns .app-holder,.layout-multiple-columns .app-holder>div{height:100%}.container-alt{width:700px;margin:0 auto;margin-top:40px}@media screen and (max-width: 740px){.container-alt{width:100%;margin:0}}.logo-container{margin:100px auto 50px}@media screen and (max-width: 500px){.logo-container{margin:40px auto 0}}.logo-container h1{display:flex;justify-content:center;align-items:center}.logo-container h1 svg{fill:#fff;height:42px;margin-right:10px}.logo-container h1 a{display:flex;justify-content:center;align-items:center;color:#fff;text-decoration:none;outline:0;padding:12px 16px;line-height:32px;font-family:sans-serif,sans-serif;font-weight:500;font-size:14px}.compose-standalone .compose-form{width:400px;margin:0 auto;padding:20px 0;margin-top:40px;box-sizing:border-box}@media screen and (max-width: 400px){.compose-standalone .compose-form{width:100%;margin-top:0;padding:20px}}.account-header{width:400px;margin:0 auto;display:flex;font-size:13px;line-height:18px;box-sizing:border-box;padding:20px 0;padding-bottom:0;margin-bottom:-30px;margin-top:40px}@media screen and (max-width: 440px){.account-header{width:100%;margin:0;margin-bottom:10px;padding:20px;padding-bottom:0}}.account-header .avatar{width:40px;height:40px;width:40px;height:40px;background-size:40px 40px;margin-right:8px}.account-header .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px;border-radius:8%;background-position:50%;background-clip:padding-box}.account-header .name{flex:1 1 auto;color:#ecf0f4;width:calc(100% - 88px)}.account-header .name .username{display:block;font-weight:500;text-overflow:ellipsis;overflow:hidden}.account-header .logout-link{display:block;font-size:32px;line-height:40px;margin-left:8px}.grid-3{display:grid;grid-gap:10px;grid-template-columns:3fr 1fr;grid-auto-columns:25%;grid-auto-rows:max-content}.grid-3 .column-0{grid-column:1/3;grid-row:1}.grid-3 .column-1{grid-column:1;grid-row:2}.grid-3 .column-2{grid-column:2;grid-row:2}.grid-3 .column-3{grid-column:1/3;grid-row:3}@media screen and (max-width: 415px){.grid-3{grid-gap:0;grid-template-columns:minmax(0, 100%)}.grid-3 .column-0{grid-column:1}.grid-3 .column-1{grid-column:1;grid-row:3}.grid-3 .column-2{grid-column:1;grid-row:2}.grid-3 .column-3{grid-column:1;grid-row:4}}.grid-4{display:grid;grid-gap:10px;grid-template-columns:repeat(4, minmax(0, 1fr));grid-auto-columns:25%;grid-auto-rows:max-content}.grid-4 .column-0{grid-column:1/5;grid-row:1}.grid-4 .column-1{grid-column:1/4;grid-row:2}.grid-4 .column-2{grid-column:4;grid-row:2}.grid-4 .column-3{grid-column:2/5;grid-row:3}.grid-4 .column-4{grid-column:1;grid-row:3}.grid-4 .landing-page__call-to-action{min-height:100%}.grid-4 .flash-message{margin-bottom:10px}@media screen and (max-width: 738px){.grid-4{grid-template-columns:minmax(0, 50%) minmax(0, 50%)}.grid-4 .landing-page__call-to-action{padding:20px;display:flex;align-items:center;justify-content:center}.grid-4 .row__information-board{width:100%;justify-content:center;align-items:center}.grid-4 .row__mascot{display:none}}@media screen and (max-width: 415px){.grid-4{grid-gap:0;grid-template-columns:minmax(0, 100%)}.grid-4 .column-0{grid-column:1}.grid-4 .column-1{grid-column:1;grid-row:3}.grid-4 .column-2{grid-column:1;grid-row:2}.grid-4 .column-3{grid-column:1;grid-row:5}.grid-4 .column-4{grid-column:1;grid-row:4}}@media screen and (max-width: 415px){.public-layout{padding-top:48px}}.public-layout .container{max-width:960px}@media screen and (max-width: 415px){.public-layout .container{padding:0}}.public-layout .header{background:#393f4f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;height:48px;margin:10px 0;display:flex;align-items:stretch;justify-content:center;flex-wrap:nowrap;overflow:hidden}@media screen and (max-width: 415px){.public-layout .header{position:fixed;width:100%;top:0;left:0;margin:0;border-radius:0;box-shadow:none;z-index:110}}.public-layout .header>div{flex:1 1 33.3%;min-height:1px}.public-layout .header .nav-left{display:flex;align-items:stretch;justify-content:flex-start;flex-wrap:nowrap}.public-layout .header .nav-center{display:flex;align-items:stretch;justify-content:center;flex-wrap:nowrap}.public-layout .header .nav-right{display:flex;align-items:stretch;justify-content:flex-end;flex-wrap:nowrap}.public-layout .header .brand{display:block;padding:15px}.public-layout .header .brand svg{display:block;height:18px;width:auto;position:relative;bottom:-2px;fill:#fff}@media screen and (max-width: 415px){.public-layout .header .brand svg{height:20px}}.public-layout .header .brand:hover,.public-layout .header .brand:focus,.public-layout .header .brand:active{background:#42485a}.public-layout .header .nav-link{display:flex;align-items:center;padding:0 1rem;font-size:12px;font-weight:500;text-decoration:none;color:#dde3ec;white-space:nowrap;text-align:center}.public-layout .header .nav-link:hover,.public-layout .header .nav-link:focus,.public-layout .header .nav-link:active{text-decoration:underline;color:#fff}@media screen and (max-width: 550px){.public-layout .header .nav-link.optional{display:none}}.public-layout .header .nav-button{background:#4a5266;margin:8px;margin-left:0;border-radius:4px}.public-layout .header .nav-button:hover,.public-layout .header .nav-button:focus,.public-layout .header .nav-button:active{text-decoration:none;background:#535b72}.public-layout .grid{display:grid;grid-gap:10px;grid-template-columns:minmax(300px, 3fr) minmax(298px, 1fr);grid-auto-columns:25%;grid-auto-rows:max-content}.public-layout .grid .column-0{grid-row:1;grid-column:1}.public-layout .grid .column-1{grid-row:1;grid-column:2}@media screen and (max-width: 600px){.public-layout .grid{grid-template-columns:100%;grid-gap:0}.public-layout .grid .column-1{display:none}}.public-layout .directory__card{border-radius:4px}@media screen and (max-width: 415px){.public-layout .directory__card{border-radius:0}}@media screen and (max-width: 415px){.public-layout .page-header{border-bottom:0}}.public-layout .public-account-header{overflow:hidden;margin-bottom:10px;box-shadow:0 0 15px rgba(0,0,0,.2)}.public-layout .public-account-header.inactive{opacity:.5}.public-layout .public-account-header.inactive .public-account-header__image,.public-layout .public-account-header.inactive .avatar{filter:grayscale(100%)}.public-layout .public-account-header.inactive .logo-button{background-color:#ecf0f4}.public-layout .public-account-header__image{border-radius:4px 4px 0 0;overflow:hidden;height:300px;position:relative;background:#0e1014}.public-layout .public-account-header__image::after{content:\"\";display:block;position:absolute;width:100%;height:100%;box-shadow:inset 0 -1px 1px 1px rgba(0,0,0,.15);top:0;left:0}.public-layout .public-account-header__image img{object-fit:cover;display:block;width:100%;height:100%;margin:0;border-radius:4px 4px 0 0}@media screen and (max-width: 600px){.public-layout .public-account-header__image{height:200px}}.public-layout .public-account-header--no-bar{margin-bottom:0}.public-layout .public-account-header--no-bar .public-account-header__image,.public-layout .public-account-header--no-bar .public-account-header__image img{border-radius:4px}@media screen and (max-width: 415px){.public-layout .public-account-header--no-bar .public-account-header__image,.public-layout .public-account-header--no-bar .public-account-header__image img{border-radius:0}}@media screen and (max-width: 415px){.public-layout .public-account-header{margin-bottom:0;box-shadow:none}.public-layout .public-account-header__image::after{display:none}.public-layout .public-account-header__image,.public-layout .public-account-header__image img{border-radius:0}}.public-layout .public-account-header__bar{position:relative;margin-top:-80px;display:flex;justify-content:flex-start}.public-layout .public-account-header__bar::before{content:\"\";display:block;background:#313543;position:absolute;bottom:0;left:0;right:0;height:60px;border-radius:0 0 4px 4px;z-index:-1}.public-layout .public-account-header__bar .avatar{display:block;width:120px;height:120px;width:120px;height:120px;background-size:120px 120px;padding-left:16px;flex:0 0 auto}.public-layout .public-account-header__bar .avatar img{display:block;width:100%;height:100%;margin:0;border-radius:50%;border:4px solid #313543;background:#17191f;border-radius:8%;background-position:50%;background-clip:padding-box}@media screen and (max-width: 600px){.public-layout .public-account-header__bar{margin-top:0;background:#313543;border-radius:0 0 4px 4px;padding:5px}.public-layout .public-account-header__bar::before{display:none}.public-layout .public-account-header__bar .avatar{width:48px;height:48px;width:48px;height:48px;background-size:48px 48px;padding:7px 0;padding-left:10px}.public-layout .public-account-header__bar .avatar img{border:0;border-radius:4px;border-radius:8%;background-position:50%;background-clip:padding-box}}@media screen and (max-width: 600px)and (max-width: 360px){.public-layout .public-account-header__bar .avatar{display:none}}@media screen and (max-width: 415px){.public-layout .public-account-header__bar{border-radius:0}}@media screen and (max-width: 600px){.public-layout .public-account-header__bar{flex-wrap:wrap}}.public-layout .public-account-header__tabs{flex:1 1 auto;margin-left:20px}.public-layout .public-account-header__tabs__name{padding-top:20px;padding-bottom:8px}.public-layout .public-account-header__tabs__name h1{font-size:20px;line-height:27px;color:#fff;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-shadow:1px 1px 1px #000}.public-layout .public-account-header__tabs__name h1 small{display:block;font-size:14px;color:#fff;font-weight:400;overflow:hidden;text-overflow:ellipsis}@media screen and (max-width: 600px){.public-layout .public-account-header__tabs{margin-left:15px;display:flex;justify-content:space-between;align-items:center}.public-layout .public-account-header__tabs__name{padding-top:0;padding-bottom:0}.public-layout .public-account-header__tabs__name h1{font-size:16px;line-height:24px;text-shadow:none}.public-layout .public-account-header__tabs__name h1 small{color:#dde3ec}}.public-layout .public-account-header__tabs__tabs{display:flex;justify-content:flex-start;align-items:stretch;height:58px}.public-layout .public-account-header__tabs__tabs .details-counters{display:flex;flex-direction:row;min-width:300px}@media screen and (max-width: 600px){.public-layout .public-account-header__tabs__tabs .details-counters{display:none}}.public-layout .public-account-header__tabs__tabs .counter{min-width:33.3%;box-sizing:border-box;flex:0 0 auto;color:#dde3ec;padding:10px;border-right:1px solid #313543;cursor:default;text-align:center;position:relative}.public-layout .public-account-header__tabs__tabs .counter a{display:block}.public-layout .public-account-header__tabs__tabs .counter:last-child{border-right:0}.public-layout .public-account-header__tabs__tabs .counter::after{display:block;content:\"\";position:absolute;bottom:0;left:0;width:100%;border-bottom:4px solid #9baec8;opacity:.5;transition:all 400ms ease}.public-layout .public-account-header__tabs__tabs .counter.active::after{border-bottom:4px solid #2b90d9;opacity:1}.public-layout .public-account-header__tabs__tabs .counter.active.inactive::after{border-bottom-color:#ecf0f4}.public-layout .public-account-header__tabs__tabs .counter:hover::after{opacity:1;transition-duration:100ms}.public-layout .public-account-header__tabs__tabs .counter a{text-decoration:none;color:inherit}.public-layout .public-account-header__tabs__tabs .counter .counter-label{font-size:12px;display:block}.public-layout .public-account-header__tabs__tabs .counter .counter-number{font-weight:500;font-size:18px;margin-bottom:5px;color:#fff;font-family:sans-serif,sans-serif}.public-layout .public-account-header__tabs__tabs .spacer{flex:1 1 auto;height:1px}.public-layout .public-account-header__tabs__tabs__buttons{padding:7px 8px}.public-layout .public-account-header__extra{display:none;margin-top:4px}.public-layout .public-account-header__extra .public-account-bio{border-radius:0;box-shadow:none;background:transparent;margin:0 -5px}.public-layout .public-account-header__extra .public-account-bio .account__header__fields{border-top:1px solid #42485a}.public-layout .public-account-header__extra .public-account-bio .roles{display:none}.public-layout .public-account-header__extra__links{margin-top:-15px;font-size:14px;color:#dde3ec}.public-layout .public-account-header__extra__links a{display:inline-block;color:#dde3ec;text-decoration:none;padding:15px;font-weight:500}.public-layout .public-account-header__extra__links a strong{font-weight:700;color:#fff}@media screen and (max-width: 600px){.public-layout .public-account-header__extra{display:block;flex:100%}}.public-layout .account__section-headline{border-radius:4px 4px 0 0}@media screen and (max-width: 415px){.public-layout .account__section-headline{border-radius:0}}.public-layout .detailed-status__meta{margin-top:25px}.public-layout .public-account-bio{background:#393f4f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;overflow:hidden;margin-bottom:10px}@media screen and (max-width: 415px){.public-layout .public-account-bio{box-shadow:none;margin-bottom:0;border-radius:0}}.public-layout .public-account-bio .account__header__fields{margin:0;border-top:0}.public-layout .public-account-bio .account__header__fields a{color:#4e79df}.public-layout .public-account-bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.public-layout .public-account-bio .account__header__fields .verified a{color:#79bd9a}.public-layout .public-account-bio .account__header__content{padding:20px;padding-bottom:0;color:#fff}.public-layout .public-account-bio__extra,.public-layout .public-account-bio .roles{padding:20px;font-size:14px;color:#dde3ec}.public-layout .public-account-bio .roles{padding-bottom:0}.public-layout .directory__list{display:grid;grid-gap:10px;grid-template-columns:minmax(0, 50%) minmax(0, 50%)}@media screen and (max-width: 415px){.public-layout .directory__list{display:block}}.public-layout .directory__list .icon-button{font-size:18px}.public-layout .directory__card{margin-bottom:0}.public-layout .card-grid{display:flex;flex-wrap:wrap;min-width:100%;margin:0 -5px}.public-layout .card-grid>div{box-sizing:border-box;flex:1 0 auto;width:300px;padding:0 5px;margin-bottom:10px;max-width:33.333%}@media screen and (max-width: 900px){.public-layout .card-grid>div{max-width:50%}}@media screen and (max-width: 600px){.public-layout .card-grid>div{max-width:100%}}@media screen and (max-width: 415px){.public-layout .card-grid{margin:0;border-top:1px solid #393f4f}.public-layout .card-grid>div{width:100%;padding:0;margin-bottom:0;border-bottom:1px solid #393f4f}.public-layout .card-grid>div:last-child{border-bottom:0}.public-layout .card-grid>div .card__bar{background:#282c37}.public-layout .card-grid>div .card__bar:hover,.public-layout .card-grid>div .card__bar:active,.public-layout .card-grid>div .card__bar:focus{background:#313543}}.no-list{list-style:none}.no-list li{display:inline-block;margin:0 5px}.recovery-codes{list-style:none;margin:0 auto}.recovery-codes li{font-size:125%;line-height:1.5;letter-spacing:1px}.modal-layout{background:#282c37 url('data:image/svg+xml;utf8,') repeat-x bottom fixed;display:flex;flex-direction:column;height:100vh;padding:0}.modal-layout__mastodon{display:flex;flex:1;flex-direction:column;justify-content:flex-end}.modal-layout__mastodon>*{flex:1;max-height:235px}@media screen and (max-width: 600px){.account-header{margin-top:0}}.public-layout .footer{text-align:left;padding-top:20px;padding-bottom:60px;font-size:12px;color:#737d99}@media screen and (max-width: 415px){.public-layout .footer{padding-left:20px;padding-right:20px}}.public-layout .footer .grid{display:grid;grid-gap:10px;grid-template-columns:1fr 1fr 2fr 1fr 1fr}.public-layout .footer .grid .column-0{grid-column:1;grid-row:1;min-width:0}.public-layout .footer .grid .column-1{grid-column:2;grid-row:1;min-width:0}.public-layout .footer .grid .column-2{grid-column:3;grid-row:1;min-width:0;text-align:center}.public-layout .footer .grid .column-2 h4 a{color:#737d99}.public-layout .footer .grid .column-3{grid-column:4;grid-row:1;min-width:0}.public-layout .footer .grid .column-4{grid-column:5;grid-row:1;min-width:0}@media screen and (max-width: 690px){.public-layout .footer .grid{grid-template-columns:1fr 2fr 1fr}.public-layout .footer .grid .column-0,.public-layout .footer .grid .column-1{grid-column:1}.public-layout .footer .grid .column-1{grid-row:2}.public-layout .footer .grid .column-2{grid-column:2}.public-layout .footer .grid .column-3,.public-layout .footer .grid .column-4{grid-column:3}.public-layout .footer .grid .column-4{grid-row:2}}@media screen and (max-width: 600px){.public-layout .footer .grid .column-1{display:block}}@media screen and (max-width: 415px){.public-layout .footer .grid .column-0,.public-layout .footer .grid .column-1,.public-layout .footer .grid .column-3,.public-layout .footer .grid .column-4{display:none}}.public-layout .footer h4{text-transform:uppercase;font-weight:700;margin-bottom:8px;color:#dde3ec}.public-layout .footer h4 a{color:inherit;text-decoration:none}.public-layout .footer ul a{text-decoration:none;color:#737d99}.public-layout .footer ul a:hover,.public-layout .footer ul a:active,.public-layout .footer ul a:focus{text-decoration:underline}.public-layout .footer .brand svg{display:block;height:36px;width:auto;margin:0 auto;fill:#737d99}.public-layout .footer .brand:hover svg,.public-layout .footer .brand:focus svg,.public-layout .footer .brand:active svg{fill:#7f88a2}.compact-header h1{font-size:24px;line-height:28px;color:#dde3ec;font-weight:500;margin-bottom:20px;padding:0 10px;word-wrap:break-word}@media screen and (max-width: 740px){.compact-header h1{text-align:center;padding:20px 10px 0}}.compact-header h1 a{color:inherit;text-decoration:none}.compact-header h1 small{font-weight:400;color:#ecf0f4}.compact-header h1 img{display:inline-block;margin-bottom:-5px;margin-right:15px;width:36px;height:36px}.hero-widget{margin-bottom:10px;box-shadow:0 0 15px rgba(0,0,0,.2)}.hero-widget__img{width:100%;position:relative;overflow:hidden;border-radius:4px 4px 0 0;background:#000}.hero-widget__img img{object-fit:cover;display:block;width:100%;height:100%;margin:0;border-radius:4px 4px 0 0}.hero-widget__text{background:#282c37;padding:20px;border-radius:0 0 4px 4px;font-size:15px;color:#dde3ec;line-height:20px;word-wrap:break-word;font-weight:400}.hero-widget__text .emojione{width:20px;height:20px;margin:-3px 0 0}.hero-widget__text p{margin-bottom:20px}.hero-widget__text p:last-child{margin-bottom:0}.hero-widget__text em{display:inline;margin:0;padding:0;font-weight:700;background:transparent;font-family:inherit;font-size:inherit;line-height:inherit;color:#fefefe}.hero-widget__text a{color:#ecf0f4;text-decoration:none}.hero-widget__text a:hover{text-decoration:underline}@media screen and (max-width: 415px){.hero-widget{display:none}}.endorsements-widget{margin-bottom:10px;padding-bottom:10px}.endorsements-widget h4{padding:10px;text-transform:uppercase;font-weight:700;font-size:13px;color:#dde3ec}.endorsements-widget .account{padding:10px 0}.endorsements-widget .account:last-child{border-bottom:0}.endorsements-widget .account .account__display-name{display:flex;align-items:center}.endorsements-widget .account .account__avatar{width:44px;height:44px;background-size:44px 44px}.endorsements-widget .trends__item{padding:10px}.trends-widget h4{color:#dde3ec}.box-widget{padding:20px;border-radius:4px;background:#282c37;box-shadow:0 0 15px rgba(0,0,0,.2)}.placeholder-widget{padding:16px;border-radius:4px;border:2px dashed #c2cede;text-align:center;color:#dde3ec;margin-bottom:10px}.contact-widget{min-height:100%;font-size:15px;color:#dde3ec;line-height:20px;word-wrap:break-word;font-weight:400;padding:0}.contact-widget h4{padding:10px;text-transform:uppercase;font-weight:700;font-size:13px;color:#dde3ec}.contact-widget .account{border-bottom:0;padding:10px 0;padding-top:5px}.contact-widget>a{display:inline-block;padding:10px;padding-top:0;color:#dde3ec;text-decoration:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.contact-widget>a:hover,.contact-widget>a:focus,.contact-widget>a:active{text-decoration:underline}.moved-account-widget{padding:15px;padding-bottom:20px;border-radius:4px;background:#282c37;box-shadow:0 0 15px rgba(0,0,0,.2);color:#ecf0f4;font-weight:400;margin-bottom:10px}.moved-account-widget strong,.moved-account-widget a{font-weight:500}.moved-account-widget strong:lang(ja),.moved-account-widget a:lang(ja){font-weight:700}.moved-account-widget strong:lang(ko),.moved-account-widget a:lang(ko){font-weight:700}.moved-account-widget strong:lang(zh-CN),.moved-account-widget a:lang(zh-CN){font-weight:700}.moved-account-widget strong:lang(zh-HK),.moved-account-widget a:lang(zh-HK){font-weight:700}.moved-account-widget strong:lang(zh-TW),.moved-account-widget a:lang(zh-TW){font-weight:700}.moved-account-widget a{color:inherit;text-decoration:underline}.moved-account-widget a.mention{text-decoration:none}.moved-account-widget a.mention span{text-decoration:none}.moved-account-widget a.mention:focus,.moved-account-widget a.mention:hover,.moved-account-widget a.mention:active{text-decoration:none}.moved-account-widget a.mention:focus span,.moved-account-widget a.mention:hover span,.moved-account-widget a.mention:active span{text-decoration:underline}.moved-account-widget__message{margin-bottom:15px}.moved-account-widget__message .fa{margin-right:5px;color:#dde3ec}.moved-account-widget__card .detailed-status__display-avatar{position:relative;cursor:pointer}.moved-account-widget__card .detailed-status__display-name{margin-bottom:0;text-decoration:none}.moved-account-widget__card .detailed-status__display-name span{font-weight:400}.memoriam-widget{padding:20px;border-radius:4px;background:#000;box-shadow:0 0 15px rgba(0,0,0,.2);font-size:14px;color:#dde3ec;margin-bottom:10px}.page-header{background:#393f4f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;padding:60px 15px;text-align:center;margin:10px 0}.page-header h1{color:#fff;font-size:36px;line-height:1.1;font-weight:700;margin-bottom:10px}.page-header p{font-size:15px;color:#dde3ec}@media screen and (max-width: 415px){.page-header{margin-top:0;background:#313543}.page-header h1{font-size:24px}}.directory{background:#282c37;border-radius:4px;box-shadow:0 0 15px rgba(0,0,0,.2)}.directory__tag{box-sizing:border-box;margin-bottom:10px}.directory__tag>a,.directory__tag>div{display:flex;align-items:center;justify-content:space-between;background:#282c37;border-radius:4px;padding:15px;text-decoration:none;color:inherit;box-shadow:0 0 15px rgba(0,0,0,.2)}.directory__tag>a:hover,.directory__tag>a:active,.directory__tag>a:focus{background:#393f4f}.directory__tag.active>a{background:#2b5fd9;cursor:default}.directory__tag.disabled>div{opacity:.5;cursor:default}.directory__tag h4{flex:1 1 auto;font-size:18px;font-weight:700;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.directory__tag h4 .fa{color:#dde3ec}.directory__tag h4 small{display:block;font-weight:400;font-size:15px;margin-top:8px;color:#dde3ec}.directory__tag.active h4,.directory__tag.active h4 .fa,.directory__tag.active h4 small{color:#fff}.directory__tag .avatar-stack{flex:0 0 auto;width:120px}.directory__tag.active .avatar-stack .account__avatar{border-color:#2b5fd9}.avatar-stack{display:flex;justify-content:flex-end}.avatar-stack .account__avatar{flex:0 0 auto;width:36px;height:36px;border-radius:50%;position:relative;margin-left:-10px;background:#17191f;border:2px solid #282c37}.avatar-stack .account__avatar:nth-child(1){z-index:1}.avatar-stack .account__avatar:nth-child(2){z-index:2}.avatar-stack .account__avatar:nth-child(3){z-index:3}.accounts-table{width:100%}.accounts-table .account{padding:0;border:0}.accounts-table strong{font-weight:700}.accounts-table thead th{text-align:center;text-transform:uppercase;color:#dde3ec;font-weight:700;padding:10px}.accounts-table thead th:first-child{text-align:left}.accounts-table tbody td{padding:15px 0;vertical-align:middle;border-bottom:1px solid #393f4f}.accounts-table tbody tr:last-child td{border-bottom:0}.accounts-table__count{width:120px;text-align:center;font-size:15px;font-weight:500;color:#fff}.accounts-table__count small{display:block;color:#dde3ec;font-weight:400;font-size:14px}.accounts-table__comment{width:50%;vertical-align:initial !important}@media screen and (max-width: 415px){.accounts-table tbody td.optional{display:none}}@media screen and (max-width: 415px){.moved-account-widget,.memoriam-widget,.box-widget,.contact-widget,.landing-page__information.contact-widget,.directory,.page-header{margin-bottom:0;box-shadow:none;border-radius:0}}.statuses-grid{min-height:600px}@media screen and (max-width: 640px){.statuses-grid{width:100% !important}}.statuses-grid__item{width:313.3333333333px}@media screen and (max-width: 1255px){.statuses-grid__item{width:306.6666666667px}}@media screen and (max-width: 640px){.statuses-grid__item{width:100%}}@media screen and (max-width: 415px){.statuses-grid__item{width:100vw}}.statuses-grid .detailed-status{border-radius:4px}@media screen and (max-width: 415px){.statuses-grid .detailed-status{border-top:1px solid #4a5266}}.statuses-grid .detailed-status.compact .detailed-status__meta{margin-top:15px}.statuses-grid .detailed-status.compact .status__content{font-size:15px;line-height:20px}.statuses-grid .detailed-status.compact .status__content .emojione{width:20px;height:20px;margin:-3px 0 0}.statuses-grid .detailed-status.compact .status__content .status__content__spoiler-link{line-height:20px;margin:0}.statuses-grid .detailed-status.compact .media-gallery,.statuses-grid .detailed-status.compact .status-card,.statuses-grid .detailed-status.compact .video-player{margin-top:15px}.notice-widget{margin-bottom:10px;color:#dde3ec}.notice-widget p{margin-bottom:10px}.notice-widget p:last-child{margin-bottom:0}.notice-widget a{font-size:14px;line-height:20px}.notice-widget a,.placeholder-widget a{text-decoration:none;font-weight:500;color:#2b5fd9}.notice-widget a:hover,.notice-widget a:focus,.notice-widget a:active,.placeholder-widget a:hover,.placeholder-widget a:focus,.placeholder-widget a:active{text-decoration:underline}.table-of-contents{background:#1f232b;min-height:100%;font-size:14px;border-radius:4px}.table-of-contents li a{display:block;font-weight:500;padding:15px;overflow:hidden;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-decoration:none;color:#fff;border-bottom:1px solid #313543}.table-of-contents li a:hover,.table-of-contents li a:focus,.table-of-contents li a:active{text-decoration:underline}.table-of-contents li:last-child a{border-bottom:0}.table-of-contents li ul{padding-left:20px;border-bottom:1px solid #313543}code{font-family:monospace,monospace;font-weight:400}.form-container{max-width:400px;padding:20px;margin:0 auto}.simple_form .input{margin-bottom:15px;overflow:hidden}.simple_form .input.hidden{margin:0}.simple_form .input.radio_buttons .radio{margin-bottom:15px}.simple_form .input.radio_buttons .radio:last-child{margin-bottom:0}.simple_form .input.radio_buttons .radio>label{position:relative;padding-left:28px}.simple_form .input.radio_buttons .radio>label input{position:absolute;top:-2px;left:0}.simple_form .input.boolean{position:relative;margin-bottom:0}.simple_form .input.boolean .label_input>label{font-family:inherit;font-size:14px;padding-top:5px;color:#fff;display:block;width:auto}.simple_form .input.boolean .label_input,.simple_form .input.boolean .hint{padding-left:28px}.simple_form .input.boolean .label_input__wrapper{position:static}.simple_form .input.boolean label.checkbox{position:absolute;top:2px;left:0}.simple_form .input.boolean label a{color:#2b90d9;text-decoration:underline}.simple_form .input.boolean label a:hover,.simple_form .input.boolean label a:active,.simple_form .input.boolean label a:focus{text-decoration:none}.simple_form .input.boolean .recommended{position:absolute;margin:0 4px;margin-top:-2px}.simple_form .row{display:flex;margin:0 -5px}.simple_form .row .input{box-sizing:border-box;flex:1 1 auto;width:50%;padding:0 5px}.simple_form .hint{color:#dde3ec}.simple_form .hint a{color:#2b90d9}.simple_form .hint code{border-radius:3px;padding:.2em .4em;background:#0e1014}.simple_form span.hint{display:block;font-size:12px;margin-top:4px}.simple_form p.hint{margin-bottom:15px;color:#dde3ec}.simple_form p.hint.subtle-hint{text-align:center;font-size:12px;line-height:18px;margin-top:15px;margin-bottom:0}.simple_form .card{margin-bottom:15px}.simple_form strong{font-weight:500}.simple_form strong:lang(ja){font-weight:700}.simple_form strong:lang(ko){font-weight:700}.simple_form strong:lang(zh-CN){font-weight:700}.simple_form strong:lang(zh-HK){font-weight:700}.simple_form strong:lang(zh-TW){font-weight:700}.simple_form .input.with_floating_label .label_input{display:flex}.simple_form .input.with_floating_label .label_input>label{font-family:inherit;font-size:14px;color:#fff;font-weight:500;min-width:150px;flex:0 0 auto}.simple_form .input.with_floating_label .label_input input,.simple_form .input.with_floating_label .label_input select{flex:1 1 auto}.simple_form .input.with_floating_label.select .hint{margin-top:6px;margin-left:150px}.simple_form .input.with_label .label_input>label{font-family:inherit;font-size:14px;color:#fff;display:block;margin-bottom:8px;word-wrap:break-word;font-weight:500}.simple_form .input.with_label .hint{margin-top:6px}.simple_form .input.with_label ul{flex:390px}.simple_form .input.with_block_label{max-width:none}.simple_form .input.with_block_label>label{font-family:inherit;font-size:16px;color:#fff;display:block;font-weight:500;padding-top:5px}.simple_form .input.with_block_label .hint{margin-bottom:15px}.simple_form .input.with_block_label ul{columns:2}.simple_form .required abbr{text-decoration:none;color:#e87487}.simple_form .fields-group{margin-bottom:25px}.simple_form .fields-group .input:last-child{margin-bottom:0}.simple_form .fields-row{display:flex;margin:0 -10px;padding-top:5px;margin-bottom:25px}.simple_form .fields-row .input{max-width:none}.simple_form .fields-row__column{box-sizing:border-box;padding:0 10px;flex:1 1 auto;min-height:1px}.simple_form .fields-row__column-6{max-width:50%}.simple_form .fields-row__column .actions{margin-top:27px}.simple_form .fields-row .fields-group:last-child,.simple_form .fields-row .fields-row__column.fields-group{margin-bottom:0}@media screen and (max-width: 600px){.simple_form .fields-row{display:block;margin-bottom:0}.simple_form .fields-row__column{max-width:none}.simple_form .fields-row .fields-group:last-child,.simple_form .fields-row .fields-row__column.fields-group,.simple_form .fields-row .fields-row__column{margin-bottom:25px}}.simple_form .input.radio_buttons .radio label{margin-bottom:5px;font-family:inherit;font-size:14px;color:#fff;display:block;width:auto}.simple_form .check_boxes .checkbox label{font-family:inherit;font-size:14px;color:#fff;display:inline-block;width:auto;position:relative;padding-top:5px;padding-left:25px;flex:1 1 auto}.simple_form .check_boxes .checkbox input[type=checkbox]{position:absolute;left:0;top:5px;margin:0}.simple_form .input.static .label_input__wrapper{font-size:16px;padding:10px;border:1px solid #c2cede;border-radius:4px}.simple_form input[type=text],.simple_form input[type=number],.simple_form input[type=email],.simple_form input[type=password],.simple_form textarea{box-sizing:border-box;font-size:16px;color:#fff;display:block;width:100%;outline:0;font-family:inherit;resize:vertical;background:#131419;border:1px solid #0a0b0e;border-radius:4px;padding:10px}.simple_form input[type=text]::placeholder,.simple_form input[type=number]::placeholder,.simple_form input[type=email]::placeholder,.simple_form input[type=password]::placeholder,.simple_form textarea::placeholder{color:#eaeef3}.simple_form input[type=text]:invalid,.simple_form input[type=number]:invalid,.simple_form input[type=email]:invalid,.simple_form input[type=password]:invalid,.simple_form textarea:invalid{box-shadow:none}.simple_form input[type=text]:focus:invalid:not(:placeholder-shown),.simple_form input[type=number]:focus:invalid:not(:placeholder-shown),.simple_form input[type=email]:focus:invalid:not(:placeholder-shown),.simple_form input[type=password]:focus:invalid:not(:placeholder-shown),.simple_form textarea:focus:invalid:not(:placeholder-shown){border-color:#e87487}.simple_form input[type=text]:required:valid,.simple_form input[type=number]:required:valid,.simple_form input[type=email]:required:valid,.simple_form input[type=password]:required:valid,.simple_form textarea:required:valid{border-color:#79bd9a}.simple_form input[type=text]:hover,.simple_form input[type=number]:hover,.simple_form input[type=email]:hover,.simple_form input[type=password]:hover,.simple_form textarea:hover{border-color:#000}.simple_form input[type=text]:active,.simple_form input[type=text]:focus,.simple_form input[type=number]:active,.simple_form input[type=number]:focus,.simple_form input[type=email]:active,.simple_form input[type=email]:focus,.simple_form input[type=password]:active,.simple_form input[type=password]:focus,.simple_form textarea:active,.simple_form textarea:focus{border-color:#2b90d9;background:#17191f}.simple_form .input.field_with_errors label{color:#e87487}.simple_form .input.field_with_errors input[type=text],.simple_form .input.field_with_errors input[type=number],.simple_form .input.field_with_errors input[type=email],.simple_form .input.field_with_errors input[type=password],.simple_form .input.field_with_errors textarea,.simple_form .input.field_with_errors select{border-color:#e87487}.simple_form .input.field_with_errors .error{display:block;font-weight:500;color:#e87487;margin-top:4px}.simple_form .input.disabled{opacity:.5}.simple_form .actions{margin-top:30px;display:flex}.simple_form .actions.actions--top{margin-top:0;margin-bottom:30px}.simple_form button,.simple_form .button,.simple_form .block-button{display:block;width:100%;border:0;border-radius:4px;background:#2b5fd9;color:#fff;font-size:18px;line-height:inherit;height:auto;padding:10px;text-transform:uppercase;text-decoration:none;text-align:center;box-sizing:border-box;cursor:pointer;font-weight:500;outline:0;margin-bottom:10px;margin-right:10px}.simple_form button:last-child,.simple_form .button:last-child,.simple_form .block-button:last-child{margin-right:0}.simple_form button:hover,.simple_form .button:hover,.simple_form .block-button:hover{background-color:#416fdd}.simple_form button:active,.simple_form button:focus,.simple_form .button:active,.simple_form .button:focus,.simple_form .block-button:active,.simple_form .block-button:focus{background-color:#2454c7}.simple_form button:disabled:hover,.simple_form .button:disabled:hover,.simple_form .block-button:disabled:hover{background-color:#9baec8}.simple_form button.negative,.simple_form .button.negative,.simple_form .block-button.negative{background:#df405a}.simple_form button.negative:hover,.simple_form .button.negative:hover,.simple_form .block-button.negative:hover{background-color:#e3566d}.simple_form button.negative:active,.simple_form button.negative:focus,.simple_form .button.negative:active,.simple_form .button.negative:focus,.simple_form .block-button.negative:active,.simple_form .block-button.negative:focus{background-color:#db2a47}.simple_form select{appearance:none;box-sizing:border-box;font-size:16px;color:#fff;display:block;width:100%;outline:0;font-family:inherit;resize:vertical;background:#131419 url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center/auto 16px;border:1px solid #0a0b0e;border-radius:4px;padding-left:10px;padding-right:30px;height:41px}.simple_form h4{margin-bottom:15px !important}.simple_form .label_input__wrapper{position:relative}.simple_form .label_input__append{position:absolute;right:3px;top:1px;padding:10px;padding-bottom:9px;font-size:16px;color:#c2cede;font-family:inherit;pointer-events:none;cursor:default;max-width:140px;white-space:nowrap;overflow:hidden}.simple_form .label_input__append::after{content:\"\";display:block;position:absolute;top:0;right:0;bottom:1px;width:5px;background-image:linear-gradient(to right, rgba(19, 20, 25, 0), #131419)}.simple_form__overlay-area{position:relative}.simple_form__overlay-area__blurred form{filter:blur(2px)}.simple_form__overlay-area__overlay{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;background:rgba(40,44,55,.65);border-radius:4px;margin-left:-4px;margin-top:-4px;padding:4px}.simple_form__overlay-area__overlay__content{text-align:center}.simple_form__overlay-area__overlay__content.rich-formatting,.simple_form__overlay-area__overlay__content.rich-formatting p{color:#fff}.block-icon{display:block;margin:0 auto;margin-bottom:10px;font-size:24px}.flash-message{background:#393f4f;color:#dde3ec;border-radius:4px;padding:15px 10px;margin-bottom:30px;text-align:center}.flash-message.notice{border:1px solid rgba(121,189,154,.5);background:rgba(121,189,154,.25);color:#79bd9a}.flash-message.alert{border:1px solid rgba(223,64,90,.5);background:rgba(223,64,90,.25);color:#df405a}.flash-message a{display:inline-block;color:#dde3ec;text-decoration:none}.flash-message a:hover{color:#fff;text-decoration:underline}.flash-message p{margin-bottom:15px}.flash-message .oauth-code{outline:0;box-sizing:border-box;display:block;width:100%;border:none;padding:10px;font-family:monospace,monospace;background:#282c37;color:#fff;font-size:14px;margin:0}.flash-message .oauth-code::-moz-focus-inner{border:0}.flash-message .oauth-code::-moz-focus-inner,.flash-message .oauth-code:focus,.flash-message .oauth-code:active{outline:0 !important}.flash-message .oauth-code:focus{background:#313543}.flash-message strong{font-weight:500}.flash-message strong:lang(ja){font-weight:700}.flash-message strong:lang(ko){font-weight:700}.flash-message strong:lang(zh-CN){font-weight:700}.flash-message strong:lang(zh-HK){font-weight:700}.flash-message strong:lang(zh-TW){font-weight:700}@media screen and (max-width: 740px)and (min-width: 441px){.flash-message{margin-top:40px}}.form-footer{margin-top:30px;text-align:center}.form-footer a{color:#dde3ec;text-decoration:none}.form-footer a:hover{text-decoration:underline}.quick-nav{list-style:none;margin-bottom:25px;font-size:14px}.quick-nav li{display:inline-block;margin-right:10px}.quick-nav a{color:#2b90d9;text-transform:uppercase;text-decoration:none;font-weight:700}.quick-nav a:hover,.quick-nav a:focus,.quick-nav a:active{color:#4ea2df}.oauth-prompt,.follow-prompt{margin-bottom:30px;color:#dde3ec}.oauth-prompt h2,.follow-prompt h2{font-size:16px;margin-bottom:30px;text-align:center}.oauth-prompt strong,.follow-prompt strong{color:#ecf0f4;font-weight:500}.oauth-prompt strong:lang(ja),.follow-prompt strong:lang(ja){font-weight:700}.oauth-prompt strong:lang(ko),.follow-prompt strong:lang(ko){font-weight:700}.oauth-prompt strong:lang(zh-CN),.follow-prompt strong:lang(zh-CN){font-weight:700}.oauth-prompt strong:lang(zh-HK),.follow-prompt strong:lang(zh-HK){font-weight:700}.oauth-prompt strong:lang(zh-TW),.follow-prompt strong:lang(zh-TW){font-weight:700}@media screen and (max-width: 740px)and (min-width: 441px){.oauth-prompt,.follow-prompt{margin-top:40px}}.qr-wrapper{display:flex;flex-wrap:wrap;align-items:flex-start}.qr-code{flex:0 0 auto;background:#fff;padding:4px;margin:0 10px 20px 0;box-shadow:0 0 15px rgba(0,0,0,.2);display:inline-block}.qr-code svg{display:block;margin:0}.qr-alternative{margin-bottom:20px;color:#ecf0f4;flex:150px}.qr-alternative samp{display:block;font-size:14px}.table-form p{margin-bottom:15px}.table-form p strong{font-weight:500}.table-form p strong:lang(ja){font-weight:700}.table-form p strong:lang(ko){font-weight:700}.table-form p strong:lang(zh-CN){font-weight:700}.table-form p strong:lang(zh-HK){font-weight:700}.table-form p strong:lang(zh-TW){font-weight:700}.simple_form .warning,.table-form .warning{box-sizing:border-box;background:rgba(223,64,90,.5);color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,.3);box-shadow:0 2px 6px rgba(0,0,0,.4);border-radius:4px;padding:10px;margin-bottom:15px}.simple_form .warning a,.table-form .warning a{color:#fff;text-decoration:underline}.simple_form .warning a:hover,.simple_form .warning a:focus,.simple_form .warning a:active,.table-form .warning a:hover,.table-form .warning a:focus,.table-form .warning a:active{text-decoration:none}.simple_form .warning strong,.table-form .warning strong{font-weight:600;display:block;margin-bottom:5px}.simple_form .warning strong:lang(ja),.table-form .warning strong:lang(ja){font-weight:700}.simple_form .warning strong:lang(ko),.table-form .warning strong:lang(ko){font-weight:700}.simple_form .warning strong:lang(zh-CN),.table-form .warning strong:lang(zh-CN){font-weight:700}.simple_form .warning strong:lang(zh-HK),.table-form .warning strong:lang(zh-HK){font-weight:700}.simple_form .warning strong:lang(zh-TW),.table-form .warning strong:lang(zh-TW){font-weight:700}.simple_form .warning strong .fa,.table-form .warning strong .fa{font-weight:400}.action-pagination{display:flex;flex-wrap:wrap;align-items:center}.action-pagination .actions,.action-pagination .pagination{flex:1 1 auto}.action-pagination .actions{padding:30px 0;padding-right:20px;flex:0 0 auto}.post-follow-actions{text-align:center;color:#dde3ec}.post-follow-actions div{margin-bottom:4px}.alternative-login{margin-top:20px;margin-bottom:20px}.alternative-login h4{font-size:16px;color:#fff;text-align:center;margin-bottom:20px;border:0;padding:0}.alternative-login .button{display:block}.scope-danger{color:#ff5050}.form_admin_settings_site_short_description textarea,.form_admin_settings_site_description textarea,.form_admin_settings_site_extended_description textarea,.form_admin_settings_site_terms textarea,.form_admin_settings_custom_css textarea,.form_admin_settings_closed_registrations_message textarea{font-family:monospace,monospace}.input-copy{background:#131419;border:1px solid #0a0b0e;border-radius:4px;display:flex;align-items:center;padding-right:4px;position:relative;top:1px;transition:border-color 300ms linear}.input-copy__wrapper{flex:1 1 auto}.input-copy input[type=text]{background:transparent;border:0;padding:10px;font-size:14px;font-family:monospace,monospace}.input-copy button{flex:0 0 auto;margin:4px;text-transform:none;font-weight:400;font-size:14px;padding:7px 18px;padding-bottom:6px;width:auto;transition:background 300ms linear}.input-copy.copied{border-color:#79bd9a;transition:none}.input-copy.copied button{background:#79bd9a;transition:none}.connection-prompt{margin-bottom:25px}.connection-prompt .fa-link{background-color:#1f232b;border-radius:100%;font-size:24px;padding:10px}.connection-prompt__column{align-items:center;display:flex;flex:1;flex-direction:column;flex-shrink:1;max-width:50%}.connection-prompt__column-sep{align-self:center;flex-grow:0;overflow:visible;position:relative;z-index:1}.connection-prompt__column p{word-break:break-word}.connection-prompt .account__avatar{margin-bottom:20px}.connection-prompt__connection{background-color:#393f4f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;padding:25px 10px;position:relative;text-align:center}.connection-prompt__connection::after{background-color:#1f232b;content:\"\";display:block;height:100%;left:50%;position:absolute;top:0;width:1px}.connection-prompt__row{align-items:flex-start;display:flex;flex-direction:row}.card>a{display:block;text-decoration:none;color:inherit;box-shadow:0 0 15px rgba(0,0,0,.2)}@media screen and (max-width: 415px){.card>a{box-shadow:none}}.card>a:hover .card__bar,.card>a:active .card__bar,.card>a:focus .card__bar{background:#393f4f}.card__img{height:130px;position:relative;background:#0e1014;border-radius:4px 4px 0 0}.card__img img{display:block;width:100%;height:100%;margin:0;object-fit:cover;border-radius:4px 4px 0 0}@media screen and (max-width: 600px){.card__img{height:200px}}@media screen and (max-width: 415px){.card__img{display:none}}.card__bar{position:relative;padding:15px;display:flex;justify-content:flex-start;align-items:center;background:#313543;border-radius:0 0 4px 4px}@media screen and (max-width: 415px){.card__bar{border-radius:0}}.card__bar .avatar{flex:0 0 auto;width:48px;height:48px;width:48px;height:48px;background-size:48px 48px;padding-top:2px}.card__bar .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px;border-radius:8%;background-position:50%;background-clip:padding-box;background:#17191f;object-fit:cover}.card__bar .display-name{margin-left:15px;text-align:left}.card__bar .display-name strong{font-size:15px;color:#fff;font-weight:500;overflow:hidden;text-overflow:ellipsis}.card__bar .display-name span{display:block;font-size:14px;color:#dde3ec;font-weight:400;overflow:hidden;text-overflow:ellipsis}.pagination{padding:30px 0;text-align:center;overflow:hidden}.pagination a,.pagination .current,.pagination .newer,.pagination .older,.pagination .page,.pagination .gap{font-size:14px;color:#fff;font-weight:500;display:inline-block;padding:6px 10px;text-decoration:none}.pagination .current{background:#fff;border-radius:100px;color:#000;cursor:default;margin:0 10px}.pagination .gap{cursor:default}.pagination .older,.pagination .newer{text-transform:uppercase;color:#ecf0f4}.pagination .older{float:left;padding-left:0}.pagination .older .fa{display:inline-block;margin-right:5px}.pagination .newer{float:right;padding-right:0}.pagination .newer .fa{display:inline-block;margin-left:5px}.pagination .disabled{cursor:default;color:#1a1a1a}@media screen and (max-width: 700px){.pagination{padding:30px 20px}.pagination .page{display:none}.pagination .newer,.pagination .older{display:inline-block}}.nothing-here{background:#282c37;box-shadow:0 0 15px rgba(0,0,0,.2);color:#364861;font-size:14px;font-weight:500;text-align:center;display:flex;justify-content:center;align-items:center;cursor:default;border-radius:4px;padding:20px;min-height:30vh}.nothing-here--under-tabs{border-radius:0 0 4px 4px}.nothing-here--flexible{box-sizing:border-box;min-height:100%}.account-role,.simple_form .recommended{display:inline-block;padding:4px 6px;cursor:default;border-radius:3px;font-size:12px;line-height:12px;font-weight:500;color:#d9e1e8;background-color:rgba(217,225,232,.1);border:1px solid rgba(217,225,232,.5)}.account-role.moderator,.simple_form .recommended.moderator{color:#79bd9a;background-color:rgba(121,189,154,.1);border-color:rgba(121,189,154,.5)}.account-role.admin,.simple_form .recommended.admin{color:#e87487;background-color:rgba(232,116,135,.1);border-color:rgba(232,116,135,.5)}.account__header__fields{max-width:100vw;padding:0;margin:15px -15px -15px;border:0 none;border-top:1px solid #42485a;border-bottom:1px solid #42485a;font-size:14px;line-height:20px}.account__header__fields dl{display:flex;border-bottom:1px solid #42485a}.account__header__fields dt,.account__header__fields dd{box-sizing:border-box;padding:14px;text-align:center;max-height:48px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.account__header__fields dt{font-weight:500;width:120px;flex:0 0 auto;color:#ecf0f4;background:rgba(23,25,31,.5)}.account__header__fields dd{flex:1 1 auto;color:#dde3ec}.account__header__fields a{color:#2b90d9;text-decoration:none}.account__header__fields a:hover,.account__header__fields a:focus,.account__header__fields a:active{text-decoration:underline}.account__header__fields .verified{border:1px solid rgba(121,189,154,.5);background:rgba(121,189,154,.25)}.account__header__fields .verified a{color:#79bd9a;font-weight:500}.account__header__fields .verified__mark{color:#79bd9a}.account__header__fields dl:last-child{border-bottom:0}.directory__tag .trends__item__current{width:auto}.pending-account__header{color:#dde3ec}.pending-account__header a{color:#d9e1e8;text-decoration:none}.pending-account__header a:hover,.pending-account__header a:active,.pending-account__header a:focus{text-decoration:underline}.pending-account__header strong{color:#fff;font-weight:700}.pending-account__body{margin-top:10px}.activity-stream{box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;overflow:hidden;margin-bottom:10px}@media screen and (max-width: 415px){.activity-stream{margin-bottom:0;border-radius:0;box-shadow:none}}.activity-stream--headless{border-radius:0;margin:0;box-shadow:none}.activity-stream--headless .detailed-status,.activity-stream--headless .status{border-radius:0 !important}.activity-stream div[data-component]{width:100%}.activity-stream .entry{background:#282c37}.activity-stream .entry .detailed-status,.activity-stream .entry .status,.activity-stream .entry .load-more{animation:none}.activity-stream .entry:last-child .detailed-status,.activity-stream .entry:last-child .status,.activity-stream .entry:last-child .load-more{border-bottom:0;border-radius:0 0 4px 4px}.activity-stream .entry:first-child .detailed-status,.activity-stream .entry:first-child .status,.activity-stream .entry:first-child .load-more{border-radius:4px 4px 0 0}.activity-stream .entry:first-child:last-child .detailed-status,.activity-stream .entry:first-child:last-child .status,.activity-stream .entry:first-child:last-child .load-more{border-radius:4px}@media screen and (max-width: 740px){.activity-stream .entry .detailed-status,.activity-stream .entry .status,.activity-stream .entry .load-more{border-radius:0 !important}}.activity-stream--highlighted .entry{background:#393f4f}.button.logo-button{flex:0 auto;font-size:14px;background:#2b5fd9;color:#fff;text-transform:none;line-height:36px;height:auto;padding:3px 15px;border:0}.button.logo-button svg{width:20px;height:auto;vertical-align:middle;margin-right:5px;fill:#fff}.button.logo-button:active,.button.logo-button:focus,.button.logo-button:hover{background:#5680e1}.button.logo-button:disabled:active,.button.logo-button:disabled:focus,.button.logo-button:disabled:hover,.button.logo-button.disabled:active,.button.logo-button.disabled:focus,.button.logo-button.disabled:hover{background:#9baec8}.button.logo-button.button--destructive:active,.button.logo-button.button--destructive:focus,.button.logo-button.button--destructive:hover{background:#df405a}@media screen and (max-width: 415px){.button.logo-button svg{display:none}}.embed .detailed-status,.public-layout .detailed-status{padding:15px}.embed .status,.public-layout .status{padding:15px 15px 15px 78px;min-height:50px}.embed .status__avatar,.public-layout .status__avatar{left:15px;top:17px}.embed .status__content,.public-layout .status__content{padding-top:5px}.embed .status__prepend,.public-layout .status__prepend{padding:8px 0;padding-bottom:2px;margin:initial;margin-left:78px;padding-top:15px}.embed .status__prepend-icon-wrapper,.public-layout .status__prepend-icon-wrapper{position:absolute;margin:initial;float:initial;width:auto;left:-32px}.embed .status .media-gallery,.embed .status__action-bar,.embed .status .video-player,.public-layout .status .media-gallery,.public-layout .status__action-bar,.public-layout .status .video-player{margin-top:10px}.embed .status .status__info,.public-layout .status .status__info{font-size:15px;display:initial}.embed .status .status__relative-time,.public-layout .status .status__relative-time{color:#c2cede;float:right;font-size:14px;width:auto;margin:initial;padding:initial}.embed .status .status__info .status__display-name,.public-layout .status .status__info .status__display-name{display:block;max-width:100%;padding:6px 0;padding-right:25px;margin:initial}.embed .status .status__info .status__display-name .display-name strong,.public-layout .status .status__info .status__display-name .display-name strong{display:inline}.embed .status .status__avatar,.public-layout .status .status__avatar{height:48px;position:absolute;width:48px;margin:initial}.rtl .embed .status,.rtl .public-layout .status{padding-left:10px;padding-right:68px}.rtl .embed .status .status__info .status__display-name,.rtl .public-layout .status .status__info .status__display-name{padding-left:25px;padding-right:0}.rtl .embed .status .status__relative-time,.rtl .public-layout .status .status__relative-time{float:left}.app-body{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.link-button{display:block;font-size:15px;line-height:20px;color:#2b5fd9;border:0;background:transparent;padding:0;cursor:pointer}.link-button:hover,.link-button:active{text-decoration:underline}.link-button:disabled{color:#9baec8;cursor:default}.button{background-color:#2558d0;border:10px none;border-radius:4px;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-family:inherit;font-size:14px;font-weight:500;height:36px;letter-spacing:0;line-height:36px;overflow:hidden;padding:0 16px;position:relative;text-align:center;text-transform:uppercase;text-decoration:none;text-overflow:ellipsis;transition:all 100ms ease-in;transition-property:background-color;white-space:nowrap;width:auto}.button:active,.button:focus,.button:hover{background-color:#4976de;transition:all 200ms ease-out;transition-property:background-color}.button--destructive{transition:none}.button--destructive:active,.button--destructive:focus,.button--destructive:hover{background-color:#df405a;transition:none}.button:disabled{background-color:#9baec8;cursor:default}.button.button-primary,.button.button-alternative,.button.button-secondary,.button.button-alternative-2{font-size:16px;line-height:36px;height:auto;text-transform:none;padding:4px 16px}.button.button-alternative{color:#000;background:#9baec8}.button.button-alternative:active,.button.button-alternative:focus,.button.button-alternative:hover{background-color:#a8b9cf}.button.button-alternative-2{background:#606984}.button.button-alternative-2:active,.button.button-alternative-2:focus,.button.button-alternative-2:hover{background-color:#687390}.button.button-secondary{font-size:16px;line-height:36px;height:auto;color:#dde3ec;text-transform:none;background:transparent;padding:3px 15px;border-radius:4px;border:1px solid #9baec8}.button.button-secondary:active,.button.button-secondary:focus,.button.button-secondary:hover{border-color:#a8b9cf;color:#eaeef3}.button.button-secondary:disabled{opacity:.5}.button.button--block{display:block;width:100%}.icon-button{display:inline-block;padding:0;color:#8d9ac2;border:0;border-radius:4px;background:transparent;cursor:pointer;transition:all 100ms ease-in;transition-property:background-color,color}.icon-button:hover,.icon-button:active,.icon-button:focus{color:#a4afce;background-color:rgba(141,154,194,.15);transition:all 200ms ease-out;transition-property:background-color,color}.icon-button:focus{background-color:rgba(141,154,194,.3)}.icon-button.disabled{color:#6274ab;background-color:transparent;cursor:default}.icon-button.active{color:#2b90d9}.icon-button::-moz-focus-inner{border:0}.icon-button::-moz-focus-inner,.icon-button:focus,.icon-button:active{outline:0 !important}.icon-button.inverted{color:#1b1e25}.icon-button.inverted:hover,.icon-button.inverted:active,.icon-button.inverted:focus{color:#0c0d11;background-color:rgba(27,30,37,.15)}.icon-button.inverted:focus{background-color:rgba(27,30,37,.3)}.icon-button.inverted.disabled{color:#2a2e3a;background-color:transparent}.icon-button.inverted.active{color:#2b90d9}.icon-button.inverted.active.disabled{color:#63ade3}.icon-button.overlayed{box-sizing:content-box;background:rgba(0,0,0,.6);color:rgba(255,255,255,.7);border-radius:4px;padding:2px}.icon-button.overlayed:hover{background:rgba(0,0,0,.9)}.text-icon-button{color:#1b1e25;border:0;border-radius:4px;background:transparent;cursor:pointer;font-weight:600;font-size:11px;padding:0 3px;line-height:27px;outline:0;transition:all 100ms ease-in;transition-property:background-color,color}.text-icon-button:hover,.text-icon-button:active,.text-icon-button:focus{color:#0c0d11;background-color:rgba(27,30,37,.15);transition:all 200ms ease-out;transition-property:background-color,color}.text-icon-button:focus{background-color:rgba(27,30,37,.3)}.text-icon-button.disabled{color:#464d60;background-color:transparent;cursor:default}.text-icon-button.active{color:#2b90d9}.text-icon-button::-moz-focus-inner{border:0}.text-icon-button::-moz-focus-inner,.text-icon-button:focus,.text-icon-button:active{outline:0 !important}.dropdown-menu{position:absolute;transform-origin:50% 0}.invisible{font-size:0;line-height:0;display:inline-block;width:0;height:0;position:absolute}.invisible img,.invisible svg{margin:0 !important;border:0 !important;padding:0 !important;width:0 !important;height:0 !important}.ellipsis::after{content:\"…\"}.notification__favourite-icon-wrapper{left:0;position:absolute}.notification__favourite-icon-wrapper .fa.star-icon{color:#ca8f04}.star-icon.active{color:#ca8f04}.bookmark-icon.active{color:#ff5050}.no-reduce-motion .icon-button.star-icon.activate>.fa-star{animation:spring-rotate-in 1s linear}.no-reduce-motion .icon-button.star-icon.deactivate>.fa-star{animation:spring-rotate-out 1s linear}.notification__display-name{color:inherit;font-weight:500;text-decoration:none}.notification__display-name:hover{color:#fff;text-decoration:underline}.display-name{display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.display-name a{color:inherit;text-decoration:inherit}.display-name strong{height:18px;font-size:16px;font-weight:500;line-height:18px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.display-name span{display:block;height:18px;font-size:15px;line-height:18px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.display-name>a:hover strong{text-decoration:underline}.display-name.inline{padding:0;height:18px;font-size:15px;line-height:18px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.display-name.inline strong{display:inline;height:auto;font-size:inherit;line-height:inherit}.display-name.inline span{display:inline;height:auto;font-size:inherit;line-height:inherit}.display-name__html{font-weight:500}.display-name__account{font-size:14px}.image-loader{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center;flex-direction:column}.image-loader .image-loader__preview-canvas{max-width:100%;max-height:80%;background:url(\"~images/void.png\") repeat;object-fit:contain}.image-loader .loading-bar{position:relative}.image-loader.image-loader--amorphous .image-loader__preview-canvas{display:none}.zoomable-image{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center}.zoomable-image img{max-width:100%;max-height:80%;width:auto;height:auto;object-fit:contain}.dropdown{display:inline-block}.dropdown__content{display:none;position:absolute}.dropdown-menu__separator{border-bottom:1px solid #c0cdd9;margin:5px 7px 6px;height:0}.dropdown-menu{background:#d9e1e8;padding:4px 0;border-radius:4px;box-shadow:2px 4px 15px rgba(0,0,0,.4)}.dropdown-menu ul{list-style:none}.dropdown-menu__arrow{position:absolute;width:0;height:0;border:0 solid transparent}.dropdown-menu__arrow.left{right:-5px;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#d9e1e8}.dropdown-menu__arrow.top{bottom:-5px;margin-left:-7px;border-width:5px 7px 0;border-top-color:#d9e1e8}.dropdown-menu__arrow.bottom{top:-5px;margin-left:-7px;border-width:0 7px 5px;border-bottom-color:#d9e1e8}.dropdown-menu__arrow.right{left:-5px;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#d9e1e8}.dropdown-menu__item a{font-size:13px;line-height:18px;display:block;padding:4px 14px;box-sizing:border-box;text-decoration:none;background:#d9e1e8;color:#000;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown-menu__item a:focus,.dropdown-menu__item a:hover,.dropdown-menu__item a:active{background:#2b5fd9;color:#ecf0f4;outline:0}.dropdown--active .dropdown__content{display:block;line-height:18px;max-width:311px;right:0;text-align:left;z-index:9999}.dropdown--active .dropdown__content>ul{list-style:none;background:#d9e1e8;padding:4px 0;border-radius:4px;box-shadow:0 0 15px rgba(0,0,0,.4);min-width:140px;position:relative}.dropdown--active .dropdown__content.dropdown__right{right:0}.dropdown--active .dropdown__content.dropdown__left>ul{left:-98px}.dropdown--active .dropdown__content>ul>li>a{font-size:13px;line-height:18px;display:block;padding:4px 14px;box-sizing:border-box;text-decoration:none;background:#d9e1e8;color:#000;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown--active .dropdown__content>ul>li>a:focus{outline:0}.dropdown--active .dropdown__content>ul>li>a:hover{background:#2b5fd9;color:#ecf0f4}.dropdown__icon{vertical-align:middle}.static-content{padding:10px;padding-top:20px;color:#c2cede}.static-content h1{font-size:16px;font-weight:500;margin-bottom:40px;text-align:center}.static-content p{font-size:13px;margin-bottom:20px}.column,.drawer{flex:1 1 100%;overflow:hidden}@media screen and (min-width: 631px){.columns-area{padding:0}.column,.drawer{flex:0 0 auto;padding:10px;padding-left:5px;padding-right:5px}.column:first-child,.drawer:first-child{padding-left:10px}.column:last-child,.drawer:last-child{padding-right:10px}.columns-area>div .column,.columns-area>div .drawer{padding-left:5px;padding-right:5px}}.tabs-bar{box-sizing:border-box;display:flex;background:#393f4f;flex:0 0 auto;overflow-y:auto}.tabs-bar__link{display:block;flex:1 1 auto;padding:15px 10px;padding-bottom:13px;color:#fff;text-decoration:none;text-align:center;font-size:14px;font-weight:500;border-bottom:2px solid #393f4f;transition:all 50ms linear;transition-property:border-bottom,background,color}.tabs-bar__link .fa{font-weight:400;font-size:16px}@media screen and (min-width: 631px){.auto-columns .tabs-bar__link:hover,.auto-columns .tabs-bar__link:focus,.auto-columns .tabs-bar__link:active{background:#464d60;border-bottom-color:#464d60}}.multi-columns .tabs-bar__link:hover,.multi-columns .tabs-bar__link:focus,.multi-columns .tabs-bar__link:active{background:#464d60;border-bottom-color:#464d60}.tabs-bar__link.active{border-bottom:2px solid #2b5fd9;color:#2b90d9}.tabs-bar__link span{margin-left:5px;display:none}.tabs-bar__link span.icon{margin-left:0;display:inline}.icon-with-badge{position:relative}.icon-with-badge__badge{position:absolute;left:9px;top:-13px;background:#2b5fd9;border:2px solid #393f4f;padding:1px 6px;border-radius:6px;font-size:10px;font-weight:500;line-height:14px;color:#fff}.column-link--transparent .icon-with-badge__badge{border-color:#17191f}.scrollable{overflow-y:scroll;overflow-x:hidden;flex:1 1 auto;-webkit-overflow-scrolling:touch}.scrollable.optionally-scrollable{overflow-y:auto}@supports(display: grid){.scrollable{contain:strict}}.scrollable--flex{display:flex;flex-direction:column}.scrollable__append{flex:1 1 auto;position:relative;min-height:120px}@supports(display: grid){.scrollable.fullscreen{contain:none}}.react-toggle{display:inline-block;position:relative;cursor:pointer;background-color:transparent;border:0;padding:0;user-select:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-tap-highlight-color:transparent}.react-toggle-screenreader-only{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.react-toggle--disabled{cursor:not-allowed;opacity:.5;transition:opacity .25s}.react-toggle-track{width:50px;height:24px;padding:0;border-radius:30px;background-color:#282c37;transition:background-color .2s ease}.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track{background-color:#131419}.react-toggle--checked .react-toggle-track{background-color:#2b5fd9}.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track{background-color:#5680e1}.react-toggle-track-check{position:absolute;width:14px;height:10px;top:0;bottom:0;margin-top:auto;margin-bottom:auto;line-height:0;left:8px;opacity:0;transition:opacity .25s ease}.react-toggle--checked .react-toggle-track-check{opacity:1;transition:opacity .25s ease}.react-toggle-track-x{position:absolute;width:10px;height:10px;top:0;bottom:0;margin-top:auto;margin-bottom:auto;line-height:0;right:10px;opacity:1;transition:opacity .25s ease}.react-toggle--checked .react-toggle-track-x{opacity:0}.react-toggle-thumb{position:absolute;top:1px;left:1px;width:22px;height:22px;border:1px solid #282c37;border-radius:50%;background-color:#fafafa;box-sizing:border-box;transition:all .25s ease;transition-property:border-color,left}.react-toggle--checked .react-toggle-thumb{left:27px;border-color:#2b5fd9}.getting-started__wrapper,.getting_started,.flex-spacer{background:#282c37}.getting-started__wrapper{position:relative;overflow-y:auto}.flex-spacer{flex:1 1 auto}.getting-started{background:#282c37;flex:1 0 auto}.getting-started p{color:#ecf0f4}.getting-started a{color:#c2cede}.getting-started__panel{height:min-content}.getting-started__panel,.getting-started__footer{padding:10px;padding-top:20px;flex:0 1 auto}.getting-started__panel ul,.getting-started__footer ul{margin-bottom:10px}.getting-started__panel ul li,.getting-started__footer ul li{display:inline}.getting-started__panel p,.getting-started__footer p{color:#c2cede;font-size:13px}.getting-started__panel p a,.getting-started__footer p a{color:#c2cede;text-decoration:underline}.getting-started__panel a,.getting-started__footer a{text-decoration:none;color:#dde3ec}.getting-started__panel a:hover,.getting-started__panel a:focus,.getting-started__panel a:active,.getting-started__footer a:hover,.getting-started__footer a:focus,.getting-started__footer a:active{text-decoration:underline}.getting-started__trends{flex:0 1 auto;opacity:1;animation:fade 150ms linear;margin-top:10px}.getting-started__trends h4{font-size:12px;text-transform:uppercase;color:#dde3ec;padding:10px;font-weight:500;border-bottom:1px solid #393f4f}@media screen and (max-height: 810px){.getting-started__trends .trends__item:nth-child(3){display:none}}@media screen and (max-height: 720px){.getting-started__trends .trends__item:nth-child(2){display:none}}@media screen and (max-height: 670px){.getting-started__trends{display:none}}.getting-started__trends .trends__item{border-bottom:0;padding:10px}.getting-started__trends .trends__item__current{color:#dde3ec}.column-link__badge{display:inline-block;border-radius:4px;font-size:12px;line-height:19px;font-weight:500;background:#282c37;padding:4px 8px;margin:-6px 10px}.keyboard-shortcuts{padding:8px 0 0;overflow:hidden}.keyboard-shortcuts thead{position:absolute;left:-9999px}.keyboard-shortcuts td{padding:0 10px 8px}.keyboard-shortcuts kbd{display:inline-block;padding:3px 5px;background-color:#393f4f;border:1px solid #1f232b}.setting-text{color:#dde3ec;background:transparent;border:none;border-bottom:2px solid #9baec8;box-sizing:border-box;display:block;font-family:inherit;margin-bottom:10px;padding:7px 0;width:100%}.setting-text:focus,.setting-text:active{color:#fff;border-bottom-color:#2b5fd9}@media screen and (max-width: 600px){.auto-columns .setting-text,.single-column .setting-text{font-size:16px}}.setting-text.light{color:#000;border-bottom:2px solid #626c87}.setting-text.light:focus,.setting-text.light:active{color:#000;border-bottom-color:#2b5fd9}.no-reduce-motion button.icon-button i.fa-retweet{background-position:0 0;height:19px;transition:background-position .9s steps(10);transition-duration:0s;vertical-align:middle;width:22px}.no-reduce-motion button.icon-button i.fa-retweet::before{display:none !important}.no-reduce-motion button.icon-button.active i.fa-retweet{transition-duration:.9s;background-position:0 100%}.reduce-motion button.icon-button i.fa-retweet{color:#8d9ac2;transition:color 100ms ease-in}.reduce-motion button.icon-button.active i.fa-retweet{color:#2b90d9}.reduce-motion button.icon-button.disabled i.fa-retweet{color:#6274ab}.load-more{display:block;color:#c2cede;background-color:transparent;border:0;font-size:inherit;text-align:center;line-height:inherit;margin:0;padding:15px;box-sizing:border-box;width:100%;clear:both;text-decoration:none}.load-more:hover{background:#2c313d}.load-gap{border-bottom:1px solid #393f4f}.missing-indicator{padding-top:68px}.scrollable>div>:first-child .notification__dismiss-overlay>.wrappy{border-top:1px solid #282c37}.notification__dismiss-overlay{overflow:hidden;position:absolute;top:0;right:0;bottom:-1px;padding-left:15px;z-index:999;align-items:center;justify-content:flex-end;cursor:pointer;display:flex}.notification__dismiss-overlay .wrappy{width:4rem;align-self:stretch;display:flex;flex-direction:column;align-items:center;justify-content:center;background:#393f4f;border-left:1px solid #535b72;box-shadow:0 0 5px #000;border-bottom:1px solid #282c37}.notification__dismiss-overlay .ckbox{border:2px solid #9baec8;border-radius:2px;width:30px;height:30px;font-size:20px;color:#dde3ec;text-shadow:0 0 5px #000;display:flex;justify-content:center;align-items:center}.notification__dismiss-overlay:focus{outline:0 !important}.notification__dismiss-overlay:focus .ckbox{box-shadow:0 0 1px 1px #2b5fd9}.text-btn{display:inline-block;padding:0;font-family:inherit;font-size:inherit;color:inherit;border:0;background:transparent;cursor:pointer}.loading-indicator{color:#c2cede;font-size:12px;font-weight:400;text-transform:uppercase;overflow:visible;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.loading-indicator span{display:block;float:left;margin-left:50%;transform:translateX(-50%);margin:82px 0 0 50%;white-space:nowrap}.loading-indicator__figure{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);width:42px;height:42px;box-sizing:border-box;background-color:transparent;border:0 solid #606984;border-width:6px;border-radius:50%}.no-reduce-motion .loading-indicator span{animation:loader-label 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1)}.no-reduce-motion .loading-indicator__figure{animation:loader-figure 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1)}@keyframes spring-rotate-in{0%{transform:rotate(0deg)}30%{transform:rotate(-484.8deg)}60%{transform:rotate(-316.7deg)}90%{transform:rotate(-375deg)}100%{transform:rotate(-360deg)}}@keyframes spring-rotate-out{0%{transform:rotate(-360deg)}30%{transform:rotate(124.8deg)}60%{transform:rotate(-43.27deg)}90%{transform:rotate(15deg)}100%{transform:rotate(0deg)}}@keyframes loader-figure{0%{width:0;height:0;background-color:#606984}29%{background-color:#606984}30%{width:42px;height:42px;background-color:transparent;border-width:21px;opacity:1}100%{width:42px;height:42px;border-width:0;opacity:0;background-color:transparent}}@keyframes loader-label{0%{opacity:.25}30%{opacity:1}100%{opacity:.25}}.spoiler-button{top:0;left:0;width:100%;height:100%;position:absolute;z-index:100}.spoiler-button--minified{display:flex;left:4px;top:4px;width:auto;height:auto;align-items:center}.spoiler-button--click-thru{pointer-events:none}.spoiler-button--hidden{display:none}.spoiler-button__overlay{display:block;background:transparent;width:100%;height:100%;border:0}.spoiler-button__overlay__label{display:inline-block;background:rgba(0,0,0,.5);border-radius:8px;padding:8px 12px;color:#fff;font-weight:500;font-size:14px}.spoiler-button__overlay:hover .spoiler-button__overlay__label,.spoiler-button__overlay:focus .spoiler-button__overlay__label,.spoiler-button__overlay:active .spoiler-button__overlay__label{background:rgba(0,0,0,.8)}.spoiler-button__overlay:disabled .spoiler-button__overlay__label{background:rgba(0,0,0,.5)}.setting-toggle{display:block;line-height:24px}.setting-toggle__label,.setting-radio__label,.setting-meta__label{color:#dde3ec;display:inline-block;margin-bottom:14px;margin-left:8px;vertical-align:middle}.setting-radio{display:block;line-height:18px}.setting-radio__label{margin-bottom:0}.column-settings__row legend{color:#dde3ec;cursor:default;display:block;font-weight:500;margin-top:10px}.setting-radio__input{vertical-align:middle}.setting-meta__label{float:right}@keyframes heartbeat{from{transform:scale(1);transform-origin:center center;animation-timing-function:ease-out}10%{transform:scale(0.91);animation-timing-function:ease-in}17%{transform:scale(0.98);animation-timing-function:ease-out}33%{transform:scale(0.87);animation-timing-function:ease-in}45%{transform:scale(1);animation-timing-function:ease-out}}.pulse-loading{animation:heartbeat 1.5s ease-in-out infinite both}.upload-area{align-items:center;background:rgba(0,0,0,.8);display:flex;height:100%;justify-content:center;left:0;opacity:0;position:absolute;top:0;visibility:hidden;width:100%;z-index:2000}.upload-area *{pointer-events:none}.upload-area__drop{width:320px;height:160px;display:flex;box-sizing:border-box;position:relative;padding:8px}.upload-area__background{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;border-radius:4px;background:#282c37;box-shadow:0 0 5px rgba(0,0,0,.2)}.upload-area__content{flex:1;display:flex;align-items:center;justify-content:center;color:#ecf0f4;font-size:18px;font-weight:500;border:2px dashed #606984;border-radius:4px}.dropdown--active .emoji-button img{opacity:1;filter:none}.loading-bar{background-color:#2b5fd9;height:3px;position:absolute;top:0;left:0;z-index:9999}.icon-badge-wrapper{position:relative}.icon-badge{position:absolute;display:block;right:-0.25em;top:-0.25em;background-color:#2b5fd9;border-radius:50%;font-size:75%;width:1em;height:1em}.conversation{display:flex;border-bottom:1px solid #393f4f;padding:5px;padding-bottom:0}.conversation:focus{background:#2c313d;outline:0}.conversation__avatar{flex:0 0 auto;padding:10px;padding-top:12px;position:relative}.conversation__unread{display:inline-block;background:#2b90d9;border-radius:50%;width:.625rem;height:.625rem;margin:-0.1ex .15em .1ex}.conversation__content{flex:1 1 auto;padding:10px 5px;padding-right:15px;overflow:hidden}.conversation__content__info{overflow:hidden;display:flex;flex-direction:row-reverse;justify-content:space-between}.conversation__content__relative-time{font-size:15px;color:#dde3ec;padding-left:15px}.conversation__content__names{color:#dde3ec;font-size:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:4px;flex-basis:90px;flex-grow:1}.conversation__content__names a{color:#fff;text-decoration:none}.conversation__content__names a:hover,.conversation__content__names a:focus,.conversation__content__names a:active{text-decoration:underline}.conversation__content .status__content{margin:0}.conversation--unread{background:#2c313d}.conversation--unread:focus{background:#313543}.conversation--unread .conversation__content__info{font-weight:700}.conversation--unread .conversation__content__relative-time{color:#fff}.ui .flash-message{margin-top:10px;margin-left:auto;margin-right:auto;margin-bottom:0;min-width:75%}::-webkit-scrollbar-thumb{border-radius:0}noscript{text-align:center}noscript img{width:200px;opacity:.5;animation:flicker 4s infinite}noscript div{font-size:14px;margin:30px auto;color:#ecf0f4;max-width:400px}noscript div a{color:#2b90d9;text-decoration:underline}noscript div a:hover{text-decoration:none}noscript div a{word-break:break-word}@keyframes flicker{0%{opacity:1}30%{opacity:.75}100%{opacity:1}}button.icon-button i.fa-retweet{background-image:url(\"data:image/svg+xml;utf8,\")}button.icon-button i.fa-retweet:hover{background-image:url(\"data:image/svg+xml;utf8,\")}button.icon-button.disabled i.fa-retweet,button.icon-button.disabled i.fa-retweet:hover{background-image:url(\"data:image/svg+xml;utf8,\")}.status-direct button.icon-button.disabled i.fa-retweet,.status-direct button.icon-button.disabled i.fa-retweet:hover{background-image:url(\"data:image/svg+xml;utf8,\")}.account{padding:10px;border-bottom:1px solid #393f4f;color:inherit;text-decoration:none}.account .account__display-name{flex:1 1 auto;display:block;color:#dde3ec;overflow:hidden;text-decoration:none;font-size:14px}.account.small{border:none;padding:0}.account.small>.account__avatar-wrapper{margin:0 8px 0 0}.account.small>.display-name{height:24px;line-height:24px}.account__wrapper{display:flex}.account__avatar-wrapper{float:left;margin-left:12px;margin-right:12px}.account__avatar{border-radius:8%;background-position:50%;background-clip:padding-box;position:relative;cursor:pointer}.account__avatar-inline{display:inline-block;vertical-align:middle;margin-right:5px}.account__avatar-composite{border-radius:8%;background-position:50%;background-clip:padding-box;overflow:hidden;position:relative;cursor:default}.account__avatar-composite div{border-radius:8%;background-position:50%;background-clip:padding-box;float:left;position:relative;box-sizing:border-box}.account__avatar-composite__label{display:block;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);color:#fff;text-shadow:1px 1px 2px #000;font-weight:700;font-size:15px}.account__avatar-overlay{position:relative;width:48px;height:48px;background-size:48px 48px}.account__avatar-overlay-base{border-radius:8%;background-position:50%;background-clip:padding-box;width:36px;height:36px;background-size:36px 36px}.account__avatar-overlay-overlay{border-radius:8%;background-position:50%;background-clip:padding-box;width:24px;height:24px;background-size:24px 24px;position:absolute;bottom:0;right:0;z-index:1}.account__relationship{height:18px;padding:10px;white-space:nowrap}.account__header__wrapper{flex:0 0 auto;background:#313543}.account__disclaimer{padding:10px;color:#c2cede}.account__disclaimer strong{font-weight:500}.account__disclaimer strong:lang(ja){font-weight:700}.account__disclaimer strong:lang(ko){font-weight:700}.account__disclaimer strong:lang(zh-CN){font-weight:700}.account__disclaimer strong:lang(zh-HK){font-weight:700}.account__disclaimer strong:lang(zh-TW){font-weight:700}.account__disclaimer a{font-weight:500;color:inherit;text-decoration:underline}.account__disclaimer a:hover,.account__disclaimer a:focus,.account__disclaimer a:active{text-decoration:none}.account__action-bar{border-top:1px solid #393f4f;border-bottom:1px solid #393f4f;line-height:36px;overflow:hidden;flex:0 0 auto;display:flex}.account__action-bar-links{display:flex;flex:1 1 auto;line-height:18px;text-align:center}.account__action-bar__tab{text-decoration:none;overflow:hidden;flex:0 1 100%;border-left:1px solid #393f4f;padding:10px 0;border-bottom:4px solid transparent}.account__action-bar__tab:first-child{border-left:0}.account__action-bar__tab.active{border-bottom:4px solid #2b5fd9}.account__action-bar__tab>span{display:block;text-transform:uppercase;font-size:11px;color:#dde3ec}.account__action-bar__tab strong{display:block;font-size:15px;font-weight:500;color:#fff}.account__action-bar__tab strong:lang(ja){font-weight:700}.account__action-bar__tab strong:lang(ko){font-weight:700}.account__action-bar__tab strong:lang(zh-CN){font-weight:700}.account__action-bar__tab strong:lang(zh-HK){font-weight:700}.account__action-bar__tab strong:lang(zh-TW){font-weight:700}.account__action-bar__tab abbr{color:#2b90d9}.account-authorize{padding:14px 10px}.account-authorize .detailed-status__display-name{display:block;margin-bottom:15px;overflow:hidden}.account-authorize__avatar{float:left;margin-right:10px}.notification__message{margin-left:42px;padding:8px 0 0 26px;cursor:default;color:#dde3ec;font-size:15px;position:relative}.notification__message .fa{color:#2b90d9}.notification__message>span{display:block;overflow:hidden;text-overflow:ellipsis}.account--panel{background:#313543;border-top:1px solid #393f4f;border-bottom:1px solid #393f4f;display:flex;flex-direction:row;padding:10px 0}.account--panel__button,.detailed-status__button{flex:1 1 auto;text-align:center}.column-settings__outer{background:#393f4f;padding:15px}.column-settings__section{color:#dde3ec;cursor:default;display:block;font-weight:500;margin-bottom:10px}.column-settings__hashtags .column-settings__row{margin-bottom:15px}.column-settings__hashtags .column-select__control{outline:0;box-sizing:border-box;width:100%;border:none;box-shadow:none;font-family:inherit;background:#282c37;color:#dde3ec;font-size:14px;margin:0}.column-settings__hashtags .column-select__control::placeholder{color:#eaeef3}.column-settings__hashtags .column-select__control::-moz-focus-inner{border:0}.column-settings__hashtags .column-select__control::-moz-focus-inner,.column-settings__hashtags .column-select__control:focus,.column-settings__hashtags .column-select__control:active{outline:0 !important}.column-settings__hashtags .column-select__control:focus{background:#313543}@media screen and (max-width: 600px){.column-settings__hashtags .column-select__control{font-size:16px}}.column-settings__hashtags .column-select__placeholder{color:#c2cede;padding-left:2px;font-size:12px}.column-settings__hashtags .column-select__value-container{padding-left:6px}.column-settings__hashtags .column-select__multi-value{background:#393f4f}.column-settings__hashtags .column-select__multi-value__remove{cursor:pointer}.column-settings__hashtags .column-select__multi-value__remove:hover,.column-settings__hashtags .column-select__multi-value__remove:active,.column-settings__hashtags .column-select__multi-value__remove:focus{background:#42485a;color:#eaeef3}.column-settings__hashtags .column-select__multi-value__label,.column-settings__hashtags .column-select__input{color:#dde3ec}.column-settings__hashtags .column-select__clear-indicator,.column-settings__hashtags .column-select__dropdown-indicator{cursor:pointer;transition:none;color:#c2cede}.column-settings__hashtags .column-select__clear-indicator:hover,.column-settings__hashtags .column-select__clear-indicator:active,.column-settings__hashtags .column-select__clear-indicator:focus,.column-settings__hashtags .column-select__dropdown-indicator:hover,.column-settings__hashtags .column-select__dropdown-indicator:active,.column-settings__hashtags .column-select__dropdown-indicator:focus{color:#d0d9e5}.column-settings__hashtags .column-select__indicator-separator{background-color:#393f4f}.column-settings__hashtags .column-select__menu{background:#fff;border-radius:4px;padding:10px 14px;padding-bottom:14px;margin-top:10px;color:#364861;box-shadow:2px 4px 15px rgba(0,0,0,.4);padding:0;background:#d9e1e8}.column-settings__hashtags .column-select__menu h4{text-transform:uppercase;color:#364861;font-size:13px;font-weight:500;margin-bottom:10px}.column-settings__hashtags .column-select__menu li{padding:4px 0}.column-settings__hashtags .column-select__menu ul{margin-bottom:10px}.column-settings__hashtags .column-select__menu em{font-weight:500;color:#000}.column-settings__hashtags .column-select__menu-list{padding:6px}.column-settings__hashtags .column-select__option{color:#000;border-radius:4px;font-size:14px}.column-settings__hashtags .column-select__option--is-focused,.column-settings__hashtags .column-select__option--is-selected{background:#b9c8d5}.column-settings__row .text-btn{margin-bottom:15px}.relationship-tag{color:#fff;margin-bottom:4px;display:block;vertical-align:top;background-color:#000;text-transform:uppercase;font-size:11px;font-weight:500;padding:4px;border-radius:4px;opacity:.7}.relationship-tag:hover{opacity:1}.account-gallery__container{display:flex;flex-wrap:wrap;padding:4px 2px}.account-gallery__item{border:none;box-sizing:border-box;display:block;position:relative;border-radius:4px;overflow:hidden;margin:2px}.account-gallery__item__icons{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);font-size:24px}.notification__filter-bar,.account__section-headline{background:#1f232b;border-bottom:1px solid #393f4f;cursor:default;display:flex;flex-shrink:0}.notification__filter-bar button,.account__section-headline button{background:#1f232b;border:0;margin:0}.notification__filter-bar button,.notification__filter-bar a,.account__section-headline button,.account__section-headline a{display:block;flex:1 1 auto;color:#dde3ec;padding:15px 0;font-size:14px;font-weight:500;text-align:center;text-decoration:none;position:relative}.notification__filter-bar button.active,.notification__filter-bar a.active,.account__section-headline button.active,.account__section-headline a.active{color:#ecf0f4}.notification__filter-bar button.active::before,.notification__filter-bar button.active::after,.notification__filter-bar a.active::before,.notification__filter-bar a.active::after,.account__section-headline button.active::before,.account__section-headline button.active::after,.account__section-headline a.active::before,.account__section-headline a.active::after{display:block;content:\"\";position:absolute;bottom:0;left:50%;width:0;height:0;transform:translateX(-50%);border-style:solid;border-width:0 10px 10px;border-color:transparent transparent #393f4f}.notification__filter-bar button.active::after,.notification__filter-bar a.active::after,.account__section-headline button.active::after,.account__section-headline a.active::after{bottom:-1px;border-color:transparent transparent #282c37}.notification__filter-bar.directory__section-headline,.account__section-headline.directory__section-headline{background:#242731;border-bottom-color:transparent}.notification__filter-bar.directory__section-headline a.active::before,.notification__filter-bar.directory__section-headline button.active::before,.account__section-headline.directory__section-headline a.active::before,.account__section-headline.directory__section-headline button.active::before{display:none}.notification__filter-bar.directory__section-headline a.active::after,.notification__filter-bar.directory__section-headline button.active::after,.account__section-headline.directory__section-headline a.active::after,.account__section-headline.directory__section-headline button.active::after{border-color:transparent transparent #191b22}.account__moved-note{padding:14px 10px;padding-bottom:16px;background:#313543;border-top:1px solid #393f4f;border-bottom:1px solid #393f4f}.account__moved-note__message{position:relative;margin-left:58px;color:#c2cede;padding:8px 0;padding-top:0;padding-bottom:4px;font-size:14px}.account__moved-note__message>span{display:block;overflow:hidden;text-overflow:ellipsis}.account__moved-note__icon-wrapper{left:-26px;position:absolute}.account__moved-note .detailed-status__display-avatar{position:relative}.account__moved-note .detailed-status__display-name{margin-bottom:0}.account__header__content{color:#dde3ec;font-size:14px;font-weight:400;overflow:hidden;word-break:normal;word-wrap:break-word}.account__header__content p{margin-bottom:20px}.account__header__content p:last-child{margin-bottom:0}.account__header__content a{color:inherit;text-decoration:underline}.account__header__content a:hover{text-decoration:none}.account__header{overflow:hidden}.account__header.inactive{opacity:.5}.account__header.inactive .account__header__image,.account__header.inactive .account__avatar{filter:grayscale(100%)}.account__header__info{position:absolute;top:10px;left:10px}.account__header__image{overflow:hidden;height:145px;position:relative;background:#1f232b}.account__header__image img{object-fit:cover;display:block;width:100%;height:100%;margin:0}.account__header__bar{position:relative;background:#313543;padding:5px;border-bottom:1px solid #42485a}.account__header__bar .avatar{display:block;flex:0 0 auto;width:94px;margin-left:-2px}.account__header__bar .avatar .account__avatar{background:#17191f;border:2px solid #313543}.account__header__tabs{display:flex;align-items:flex-start;padding:7px 5px;margin-top:-55px}.account__header__tabs__buttons{display:flex;align-items:center;padding-top:55px;overflow:hidden}.account__header__tabs__buttons .icon-button{border:1px solid #42485a;border-radius:4px;box-sizing:content-box;padding:2px}.account__header__tabs__buttons .button{margin:0 8px}.account__header__tabs__name{padding:5px}.account__header__tabs__name .account-role{vertical-align:top}.account__header__tabs__name .emojione{width:22px;height:22px}.account__header__tabs__name h1{font-size:16px;line-height:24px;color:#fff;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.account__header__tabs__name h1 small{display:block;font-size:14px;color:#dde3ec;font-weight:400;overflow:hidden;text-overflow:ellipsis}.account__header__tabs .spacer{flex:1 1 auto}.account__header__bio{overflow:hidden;margin:0 -5px}.account__header__bio .account__header__content{padding:20px 15px;padding-bottom:5px;color:#fff}.account__header__bio .account__header__fields{margin:0;border-top:1px solid #42485a}.account__header__bio .account__header__fields a{color:#4e79df}.account__header__bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.account__header__bio .account__header__fields .verified a{color:#79bd9a}.account__header__extra{margin-top:4px}.account__header__extra__links{font-size:14px;color:#dde3ec;padding:10px 0}.account__header__extra__links a{display:inline-block;color:#dde3ec;text-decoration:none;padding:5px 10px;font-weight:500}.account__header__extra__links a strong{font-weight:700;color:#fff}.domain{padding:10px;border-bottom:1px solid #393f4f}.domain .domain__domain-name{flex:1 1 auto;display:block;color:#fff;text-decoration:none;font-size:14px;font-weight:500}.domain__wrapper{display:flex}.domain_buttons{height:18px;padding:10px;white-space:nowrap}@keyframes spring-flip-in{0%{transform:rotate(0deg)}30%{transform:rotate(-242.4deg)}60%{transform:rotate(-158.35deg)}90%{transform:rotate(-187.5deg)}100%{transform:rotate(-180deg)}}@keyframes spring-flip-out{0%{transform:rotate(-180deg)}30%{transform:rotate(62.4deg)}60%{transform:rotate(-21.635deg)}90%{transform:rotate(7.5deg)}100%{transform:rotate(0deg)}}.status__content--with-action{cursor:pointer}.status__content{position:relative;margin:10px 0;font-size:15px;line-height:20px;word-wrap:break-word;font-weight:400;overflow:visible;padding-top:5px}.status__content:focus{outline:0}.status__content .emojione{width:20px;height:20px;margin:-3px 0 0}.status__content img{max-width:100%;max-height:400px;object-fit:contain}.status__content p,.status__content pre,.status__content blockquote{margin-bottom:20px;white-space:pre-wrap}.status__content p:last-child,.status__content pre:last-child,.status__content blockquote:last-child{margin-bottom:0}.status__content .status__content__text,.status__content .e-content{overflow:hidden}.status__content .status__content__text>ul,.status__content .status__content__text>ol,.status__content .e-content>ul,.status__content .e-content>ol{margin-bottom:20px}.status__content .status__content__text h1,.status__content .status__content__text h2,.status__content .status__content__text h3,.status__content .status__content__text h4,.status__content .status__content__text h5,.status__content .e-content h1,.status__content .e-content h2,.status__content .e-content h3,.status__content .e-content h4,.status__content .e-content h5{margin-top:20px;margin-bottom:20px}.status__content .status__content__text h1,.status__content .status__content__text h2,.status__content .e-content h1,.status__content .e-content h2{font-weight:700;font-size:1.2em}.status__content .status__content__text h2,.status__content .e-content h2{font-size:1.1em}.status__content .status__content__text h3,.status__content .status__content__text h4,.status__content .status__content__text h5,.status__content .e-content h3,.status__content .e-content h4,.status__content .e-content h5{font-weight:500}.status__content .status__content__text blockquote,.status__content .e-content blockquote{padding-left:10px;border-left:3px solid #dde3ec;color:#dde3ec;white-space:normal}.status__content .status__content__text blockquote p:last-child,.status__content .e-content blockquote p:last-child{margin-bottom:0}.status__content .status__content__text b,.status__content .status__content__text strong,.status__content .e-content b,.status__content .e-content strong{font-weight:700}.status__content .status__content__text em,.status__content .status__content__text i,.status__content .e-content em,.status__content .e-content i{font-style:italic}.status__content .status__content__text sub,.status__content .e-content sub{font-size:smaller;text-align:sub}.status__content .status__content__text sup,.status__content .e-content sup{font-size:smaller;vertical-align:super}.status__content .status__content__text ul,.status__content .status__content__text ol,.status__content .e-content ul,.status__content .e-content ol{margin-left:1em}.status__content .status__content__text ul p,.status__content .status__content__text ol p,.status__content .e-content ul p,.status__content .e-content ol p{margin:0}.status__content .status__content__text ul,.status__content .e-content ul{list-style-type:disc}.status__content .status__content__text ol,.status__content .e-content ol{list-style-type:decimal}.status__content a{color:#d8a070;text-decoration:none}.status__content a:hover{text-decoration:underline}.status__content a:hover .fa{color:#dae1ea}.status__content a.mention:hover{text-decoration:none}.status__content a.mention:hover span{text-decoration:underline}.status__content a .fa{color:#c2cede}.status__content .status__content__spoiler{display:none}.status__content .status__content__spoiler.status__content__spoiler--visible{display:block}.status__content a.unhandled-link{color:#4e79df}.status__content a.unhandled-link .link-origin-tag{color:#ca8f04;font-size:.8em}.status__content .status__content__spoiler-link{background:#687390}.status__content .status__content__spoiler-link:hover{background:#707b97;text-decoration:none}.status__content__spoiler-link{display:inline-block;border-radius:2px;background:#687390;border:none;color:#000;font-weight:500;font-size:11px;padding:0 5px;text-transform:uppercase;line-height:inherit;cursor:pointer;vertical-align:bottom}.status__content__spoiler-link:hover{background:#707b97;text-decoration:none}.status__content__spoiler-link .status__content__spoiler-icon{display:inline-block;margin:0 0 0 5px;border-left:1px solid currentColor;padding:0 0 0 4px;font-size:16px;vertical-align:-2px}.notif-cleaning .status,.notif-cleaning .notification-follow,.notif-cleaning .notification-follow-request{padding-right:4.5rem}.status__wrapper--filtered{color:#c2cede;border:0;font-size:inherit;text-align:center;line-height:inherit;margin:0;padding:15px;box-sizing:border-box;width:100%;clear:both;border-bottom:1px solid #393f4f}.status__prepend-icon-wrapper{left:-26px;position:absolute}.notification-follow,.notification-follow-request{position:relative;border-bottom:1px solid #393f4f}.notification-follow .account,.notification-follow-request .account{border-bottom:0 none}.focusable:focus{outline:0;background:#313543}.focusable:focus.status.status-direct:not(.read){background:#42485a}.focusable:focus.status.status-direct:not(.read).muted{background:transparent}.focusable:focus .detailed-status,.focusable:focus .detailed-status__action-bar{background:#393f4f}.status{padding:10px 14px;position:relative;height:auto;border-bottom:1px solid #393f4f;cursor:default;opacity:1;animation:fade 150ms linear}@supports(-ms-overflow-style: -ms-autohiding-scrollbar){.status{padding-right:28px}}@keyframes fade{0%{opacity:0}100%{opacity:1}}.status .video-player,.status .audio-player{margin-top:8px}.status.status-direct:not(.read){background:#393f4f;border-bottom-color:#42485a}.status.light .status__relative-time{color:#1b1e25}.status.light .status__display-name{color:#000}.status.light .display-name strong{color:#000}.status.light .display-name span{color:#1b1e25}.status.light .status__content{color:#000}.status.light .status__content a{color:#2b90d9}.status.light .status__content a.status__content__spoiler-link{color:#fff;background:#9baec8}.status.light .status__content a.status__content__spoiler-link:hover{background:#b5c3d6}.status.collapsed{background-position:center;background-size:cover;user-select:none}.status.collapsed.has-background::before{display:block;position:absolute;left:0;right:0;top:0;bottom:0;background-image:linear-gradient(to bottom, rgba(0, 0, 0, 0.75), rgba(0, 0, 0, 0.65) 24px, rgba(0, 0, 0, 0.8));pointer-events:none;content:\"\"}.status.collapsed .display-name:hover .display-name__html{text-decoration:none}.status.collapsed .status__content{height:20px;overflow:hidden;text-overflow:ellipsis;padding-top:0}.status.collapsed .status__content:after{content:\"\";position:absolute;top:0;bottom:0;left:0;right:0;background:linear-gradient(rgba(40, 44, 55, 0), #282c37);pointer-events:none}.status.collapsed .status__content a:hover{text-decoration:none}.status.collapsed:focus>.status__content:after{background:linear-gradient(rgba(49, 53, 67, 0), #313543)}.status.collapsed.status-direct:not(.read)>.status__content:after{background:linear-gradient(rgba(57, 63, 79, 0), #393f4f)}.status.collapsed .notification__message{margin-bottom:0}.status.collapsed .status__info .notification__message>span{white-space:nowrap}.status .notification__message{margin:-10px 0px 10px 0}.notification-favourite .status.status-direct{background:transparent}.notification-favourite .status.status-direct .icon-button.disabled{color:#b8c0d9}.status__relative-time{display:inline-block;flex-grow:1;color:#c2cede;font-size:14px;text-align:right;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.status__display-name{color:#c2cede;overflow:hidden}.status__info__account .status__display-name{display:block;max-width:100%}.status__info{display:flex;justify-content:space-between;font-size:15px}.status__info>span{text-overflow:ellipsis;overflow:hidden}.status__info .notification__message>span{word-wrap:break-word}.status__info__icons{display:flex;align-items:center;height:1em;color:#8d9ac2}.status__info__icons .status__media-icon,.status__info__icons .status__visibility-icon,.status__info__icons .status__reply-icon{padding-left:2px;padding-right:2px}.status__info__icons .status__collapse-button.active>.fa-angle-double-up{transform:rotate(-180deg)}.no-reduce-motion .status__collapse-button.activate>.fa-angle-double-up{animation:spring-flip-in 1s linear}.no-reduce-motion .status__collapse-button.deactivate>.fa-angle-double-up{animation:spring-flip-out 1s linear}.status__info__account{display:flex;align-items:center;justify-content:flex-start}.status-check-box{border-bottom:1px solid #d9e1e8;display:flex}.status-check-box .status-check-box__status{margin:10px 0 10px 10px;flex:1}.status-check-box .status-check-box__status .media-gallery{max-width:250px}.status-check-box .status-check-box__status .status__content{padding:0;white-space:normal}.status-check-box .status-check-box__status .video-player,.status-check-box .status-check-box__status .audio-player{margin-top:8px;max-width:250px}.status-check-box .status-check-box__status .media-gallery__item-thumbnail{cursor:default}.status-check-box-toggle{align-items:center;display:flex;flex:0 0 auto;justify-content:center;padding:10px}.status__prepend{margin-top:-10px;margin-bottom:10px;margin-left:58px;color:#c2cede;padding:8px 0;padding-bottom:2px;font-size:14px;position:relative}.status__prepend .status__display-name strong{color:#c2cede}.status__prepend>span{display:block;overflow:hidden;text-overflow:ellipsis}.status__action-bar{align-items:center;display:flex;margin-top:8px}.status__action-bar__counter{display:inline-flex;margin-right:11px;align-items:center}.status__action-bar__counter .status__action-bar-button{margin-right:4px}.status__action-bar__counter__label{display:inline-block;width:14px;font-size:12px;font-weight:500;color:#8d9ac2}.status__action-bar-button{margin-right:18px}.status__action-bar-dropdown{height:23.15px;width:23.15px}.detailed-status__action-bar-dropdown{flex:1 1 auto;display:flex;align-items:center;justify-content:center;position:relative}.detailed-status{background:#313543;padding:14px 10px}.detailed-status--flex{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-start}.detailed-status--flex .status__content,.detailed-status--flex .detailed-status__meta{flex:100%}.detailed-status .status__content{font-size:19px;line-height:24px}.detailed-status .status__content .emojione{width:24px;height:24px;margin:-1px 0 0}.detailed-status .video-player,.detailed-status .audio-player{margin-top:8px}.detailed-status__meta{margin-top:15px;color:#c2cede;font-size:14px;line-height:18px}.detailed-status__action-bar{background:#313543;border-top:1px solid #393f4f;border-bottom:1px solid #393f4f;display:flex;flex-direction:row;padding:10px 0}.detailed-status__link{color:inherit;text-decoration:none}.detailed-status__favorites,.detailed-status__reblogs{display:inline-block;font-weight:500;font-size:12px;margin-left:6px}.status__display-name,.status__relative-time,.detailed-status__display-name,.detailed-status__datetime,.detailed-status__application,.account__display-name{text-decoration:none}.status__display-name strong,.account__display-name strong{color:#fff}.muted .emojione{opacity:.5}a.status__display-name:hover strong,.reply-indicator__display-name:hover strong,.detailed-status__display-name:hover strong,.account__display-name:hover strong{text-decoration:underline}.account__display-name strong{display:block;overflow:hidden;text-overflow:ellipsis}.detailed-status__application,.detailed-status__datetime{color:inherit}.detailed-status .button.logo-button{margin-bottom:15px}.detailed-status__display-name{color:#ecf0f4;display:block;line-height:24px;margin-bottom:15px;overflow:hidden}.detailed-status__display-name strong,.detailed-status__display-name span{display:block;text-overflow:ellipsis;overflow:hidden}.detailed-status__display-name strong{font-size:16px;color:#fff}.detailed-status__display-avatar{float:left;margin-right:10px}.status__avatar{flex:none;margin:0 10px 0 0;height:48px;width:48px}.muted .status__content,.muted .status__content p,.muted .status__content a,.muted .status__content__text{color:#c2cede}.muted .status__display-name strong{color:#c2cede}.muted .status__avatar{opacity:.5}.muted a.status__content__spoiler-link{background:#606984;color:#000}.muted a.status__content__spoiler-link:hover{background:#66718d;text-decoration:none}.status__relative-time:hover,.detailed-status__datetime:hover{text-decoration:underline}.status-card{display:flex;font-size:14px;border:1px solid #393f4f;border-radius:4px;color:#c2cede;margin-top:14px;text-decoration:none;overflow:hidden}.status-card__actions{bottom:0;left:0;position:absolute;right:0;top:0;display:flex;justify-content:center;align-items:center}.status-card__actions>div{background:rgba(0,0,0,.6);border-radius:8px;padding:12px 9px;flex:0 0 auto;display:flex;justify-content:center;align-items:center}.status-card__actions button,.status-card__actions a{display:inline;color:#ecf0f4;background:transparent;border:0;padding:0 8px;text-decoration:none;font-size:18px;line-height:18px}.status-card__actions button:hover,.status-card__actions button:active,.status-card__actions button:focus,.status-card__actions a:hover,.status-card__actions a:active,.status-card__actions a:focus{color:#fff}.status-card__actions a{font-size:19px;position:relative;bottom:-1px}.status-card__actions a .fa,.status-card__actions a:hover .fa{color:inherit}a.status-card{cursor:pointer}a.status-card:hover{background:#393f4f}.status-card-photo{cursor:zoom-in;display:block;text-decoration:none;width:100%;height:auto;margin:0}.status-card-video iframe{width:100%;height:100%}.status-card__title{display:block;font-weight:500;margin-bottom:5px;color:#dde3ec;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-decoration:none}.status-card__content{flex:1 1 auto;overflow:hidden;padding:14px 14px 14px 8px}.status-card__description{color:#dde3ec}.status-card__host{display:block;margin-top:5px;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-card__image{flex:0 0 100px;background:#393f4f;position:relative}.status-card__image>.fa{font-size:21px;position:absolute;transform-origin:50% 50%;top:50%;left:50%;transform:translate(-50%, -50%)}.status-card.horizontal{display:block}.status-card.horizontal .status-card__image{width:100%}.status-card.horizontal .status-card__image-image{border-radius:4px 4px 0 0}.status-card.horizontal .status-card__title{white-space:inherit}.status-card.compact{border-color:#313543}.status-card.compact.interactive{border:0}.status-card.compact .status-card__content{padding:8px;padding-top:10px}.status-card.compact .status-card__title{white-space:nowrap}.status-card.compact .status-card__image{flex:0 0 60px}a.status-card.compact:hover{background-color:#313543}.status-card__image-image{border-radius:4px 0 0 4px;display:block;margin:0;width:100%;height:100%;object-fit:cover;background-size:cover;background-position:center center}.attachment-list{display:flex;font-size:14px;border:1px solid #393f4f;border-radius:4px;margin-top:14px;overflow:hidden}.attachment-list__icon{flex:0 0 auto;color:#c2cede;padding:8px 18px;cursor:default;border-right:1px solid #393f4f;display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:26px}.attachment-list__icon .fa{display:block}.attachment-list__list{list-style:none;padding:4px 0;padding-left:8px;display:flex;flex-direction:column;justify-content:center}.attachment-list__list li{display:block;padding:4px 0}.attachment-list__list a{text-decoration:none;color:#c2cede;font-weight:500}.attachment-list__list a:hover{text-decoration:underline}.attachment-list.compact{border:0;margin-top:4px}.attachment-list.compact .attachment-list__list{padding:0;display:block}.attachment-list.compact .fa{color:#c2cede}.status__wrapper--filtered__button{display:inline;color:#4e79df;border:0;background:transparent;padding:0;font-size:inherit;line-height:inherit}.status__wrapper--filtered__button:hover,.status__wrapper--filtered__button:active{text-decoration:underline}.modal-container--preloader{background:#393f4f}.modal-root{position:relative;transition:opacity .3s linear;will-change:opacity;z-index:9999}.modal-root__overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.7)}.modal-root__container{position:fixed;top:0;left:0;width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;align-content:space-around;z-index:9999;pointer-events:none;user-select:none}.modal-root__modal{pointer-events:auto;display:flex;z-index:9999}.onboarding-modal,.error-modal,.embed-modal{background:#d9e1e8;color:#000;border-radius:8px;overflow:hidden;display:flex;flex-direction:column}.onboarding-modal__pager{height:80vh;width:80vw;max-width:520px;max-height:470px}.onboarding-modal__pager .react-swipeable-view-container>div{width:100%;height:100%;box-sizing:border-box;display:none;flex-direction:column;align-items:center;justify-content:center;display:flex;user-select:text}.error-modal__body{height:80vh;width:80vw;max-width:520px;max-height:420px;position:relative}.error-modal__body>div{position:absolute;top:0;left:0;width:100%;height:100%;box-sizing:border-box;padding:25px;display:none;flex-direction:column;align-items:center;justify-content:center;display:flex;opacity:0;user-select:text}.error-modal__body{display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center}@media screen and (max-width: 550px){.onboarding-modal{width:100%;height:100%;border-radius:0}.onboarding-modal__pager{width:100%;height:auto;max-width:none;max-height:none;flex:1 1 auto}}.onboarding-modal__paginator,.error-modal__footer{flex:0 0 auto;background:#c0cdd9;display:flex;padding:25px}.onboarding-modal__paginator>div,.error-modal__footer>div{min-width:33px}.onboarding-modal__paginator .onboarding-modal__nav,.onboarding-modal__paginator .error-modal__nav,.error-modal__footer .onboarding-modal__nav,.error-modal__footer .error-modal__nav{color:#1b1e25;border:0;font-size:14px;font-weight:500;padding:10px 25px;line-height:inherit;height:auto;margin:-10px;border-radius:4px;background-color:transparent}.onboarding-modal__paginator .onboarding-modal__nav:hover,.onboarding-modal__paginator .onboarding-modal__nav:focus,.onboarding-modal__paginator .onboarding-modal__nav:active,.onboarding-modal__paginator .error-modal__nav:hover,.onboarding-modal__paginator .error-modal__nav:focus,.onboarding-modal__paginator .error-modal__nav:active,.error-modal__footer .onboarding-modal__nav:hover,.error-modal__footer .onboarding-modal__nav:focus,.error-modal__footer .onboarding-modal__nav:active,.error-modal__footer .error-modal__nav:hover,.error-modal__footer .error-modal__nav:focus,.error-modal__footer .error-modal__nav:active{color:#131419;background-color:#a6b9c9}.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next,.error-modal__footer .error-modal__nav.onboarding-modal__done,.error-modal__footer .error-modal__nav.onboarding-modal__next{color:#000}.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:hover,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:focus,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:active,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:hover,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:focus,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:active,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:hover,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:focus,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:active,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:hover,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:focus,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:active,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:hover,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:focus,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:active,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:hover,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:focus,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:active,.error-modal__footer .error-modal__nav.onboarding-modal__done:hover,.error-modal__footer .error-modal__nav.onboarding-modal__done:focus,.error-modal__footer .error-modal__nav.onboarding-modal__done:active,.error-modal__footer .error-modal__nav.onboarding-modal__next:hover,.error-modal__footer .error-modal__nav.onboarding-modal__next:focus,.error-modal__footer .error-modal__nav.onboarding-modal__next:active{color:#0a0a0a}.error-modal__footer{justify-content:center}.onboarding-modal__dots{flex:1 1 auto;display:flex;align-items:center;justify-content:center}.onboarding-modal__dot{width:14px;height:14px;border-radius:14px;background:#a6b9c9;margin:0 3px;cursor:pointer}.onboarding-modal__dot:hover{background:#a0b4c5}.onboarding-modal__dot.active{cursor:default;background:#8da5ba}.onboarding-modal__page__wrapper{pointer-events:none;padding:25px;padding-bottom:0}.onboarding-modal__page__wrapper.onboarding-modal__page__wrapper--active{pointer-events:auto}.onboarding-modal__page{cursor:default;line-height:21px}.onboarding-modal__page h1{font-size:18px;font-weight:500;color:#000;margin-bottom:20px}.onboarding-modal__page a{color:#2b90d9}.onboarding-modal__page a:hover,.onboarding-modal__page a:focus,.onboarding-modal__page a:active{color:#3c99dc}.onboarding-modal__page .navigation-bar a{color:inherit}.onboarding-modal__page p{font-size:16px;color:#1b1e25;margin-top:10px;margin-bottom:10px}.onboarding-modal__page p:last-child{margin-bottom:0}.onboarding-modal__page p strong{font-weight:500;background:#282c37;color:#ecf0f4;border-radius:4px;font-size:14px;padding:3px 6px}.onboarding-modal__page p strong:lang(ja){font-weight:700}.onboarding-modal__page p strong:lang(ko){font-weight:700}.onboarding-modal__page p strong:lang(zh-CN){font-weight:700}.onboarding-modal__page p strong:lang(zh-HK){font-weight:700}.onboarding-modal__page p strong:lang(zh-TW){font-weight:700}.onboarding-modal__page__wrapper-0{height:100%;padding:0}.onboarding-modal__page-one__lead{padding:65px;padding-top:45px;padding-bottom:0;margin-bottom:10px}.onboarding-modal__page-one__lead h1{font-size:26px;line-height:36px;margin-bottom:8px}.onboarding-modal__page-one__lead p{margin-bottom:0}.onboarding-modal__page-one__extra{padding-right:65px;padding-left:185px;text-align:center}.display-case{text-align:center;font-size:15px;margin-bottom:15px}.display-case__label{font-weight:500;color:#000;margin-bottom:5px;text-transform:uppercase;font-size:12px}.display-case__case{background:#282c37;color:#ecf0f4;font-weight:500;padding:10px;border-radius:4px}.onboarding-modal__page-two p,.onboarding-modal__page-three p,.onboarding-modal__page-four p,.onboarding-modal__page-five p{text-align:left}.onboarding-modal__page-two .figure,.onboarding-modal__page-three .figure,.onboarding-modal__page-four .figure,.onboarding-modal__page-five .figure{background:#17191f;color:#ecf0f4;margin-bottom:20px;border-radius:4px;padding:10px;text-align:center;font-size:14px;box-shadow:1px 2px 6px rgba(0,0,0,.3)}.onboarding-modal__page-two .figure .onboarding-modal__image,.onboarding-modal__page-three .figure .onboarding-modal__image,.onboarding-modal__page-four .figure .onboarding-modal__image,.onboarding-modal__page-five .figure .onboarding-modal__image{border-radius:4px;margin-bottom:10px}.onboarding-modal__page-two .figure.non-interactive,.onboarding-modal__page-three .figure.non-interactive,.onboarding-modal__page-four .figure.non-interactive,.onboarding-modal__page-five .figure.non-interactive{pointer-events:none;text-align:left}.onboarding-modal__page-four__columns .row{display:flex;margin-bottom:20px}.onboarding-modal__page-four__columns .row>div{flex:1 1 0;margin:0 10px}.onboarding-modal__page-four__columns .row>div:first-child{margin-left:0}.onboarding-modal__page-four__columns .row>div:last-child{margin-right:0}.onboarding-modal__page-four__columns .row>div p{text-align:center}.onboarding-modal__page-four__columns .row:last-child{margin-bottom:0}.onboarding-modal__page-four__columns .column-header{color:#fff}@media screen and (max-width: 320px)and (max-height: 600px){.onboarding-modal__page p{font-size:14px;line-height:20px}.onboarding-modal__page-two .figure,.onboarding-modal__page-three .figure,.onboarding-modal__page-four .figure,.onboarding-modal__page-five .figure{font-size:12px;margin-bottom:10px}.onboarding-modal__page-four__columns .row{margin-bottom:10px}.onboarding-modal__page-four__columns .column-header{padding:5px;font-size:12px}}.onboard-sliders{display:inline-block;max-width:30px;max-height:auto;margin-left:10px}.boost-modal,.doodle-modal,.favourite-modal,.confirmation-modal,.report-modal,.actions-modal,.mute-modal,.block-modal{background:#f2f5f7;color:#000;border-radius:8px;overflow:hidden;max-width:90vw;width:480px;position:relative;flex-direction:column}.boost-modal .status__relative-time,.doodle-modal .status__relative-time,.favourite-modal .status__relative-time,.confirmation-modal .status__relative-time,.report-modal .status__relative-time,.actions-modal .status__relative-time,.mute-modal .status__relative-time,.block-modal .status__relative-time{color:#c2cede;float:right;font-size:14px;width:auto;margin:initial;padding:initial}.boost-modal .status__display-name,.doodle-modal .status__display-name,.favourite-modal .status__display-name,.confirmation-modal .status__display-name,.report-modal .status__display-name,.actions-modal .status__display-name,.mute-modal .status__display-name,.block-modal .status__display-name{display:flex}.boost-modal .status__avatar,.doodle-modal .status__avatar,.favourite-modal .status__avatar,.confirmation-modal .status__avatar,.report-modal .status__avatar,.actions-modal .status__avatar,.mute-modal .status__avatar,.block-modal .status__avatar{height:48px;width:48px}.boost-modal .status__content__spoiler-link,.doodle-modal .status__content__spoiler-link,.favourite-modal .status__content__spoiler-link,.confirmation-modal .status__content__spoiler-link,.report-modal .status__content__spoiler-link,.actions-modal .status__content__spoiler-link,.mute-modal .status__content__spoiler-link,.block-modal .status__content__spoiler-link{color:#fff}.actions-modal .status{background:#fff;border-bottom-color:#d9e1e8;padding-top:10px;padding-bottom:10px}.actions-modal .dropdown-menu__separator{border-bottom-color:#d9e1e8}.boost-modal__container,.favourite-modal__container{overflow-x:scroll;padding:10px}.boost-modal__container .status,.favourite-modal__container .status{user-select:text;border-bottom:0}.boost-modal__action-bar,.doodle-modal__action-bar,.favourite-modal__action-bar,.confirmation-modal__action-bar,.mute-modal__action-bar,.block-modal__action-bar{display:flex;justify-content:space-between;background:#d9e1e8;padding:10px;line-height:36px}.boost-modal__action-bar>div,.doodle-modal__action-bar>div,.favourite-modal__action-bar>div,.confirmation-modal__action-bar>div,.mute-modal__action-bar>div,.block-modal__action-bar>div{flex:1 1 auto;text-align:right;color:#1b1e25;padding-right:10px}.boost-modal__action-bar .button,.doodle-modal__action-bar .button,.favourite-modal__action-bar .button,.confirmation-modal__action-bar .button,.mute-modal__action-bar .button,.block-modal__action-bar .button{flex:0 0 auto}.boost-modal__status-header,.favourite-modal__status-header{font-size:15px}.boost-modal__status-time,.favourite-modal__status-time{float:right;font-size:14px}.mute-modal,.block-modal{line-height:24px}.mute-modal .react-toggle,.block-modal .react-toggle{vertical-align:middle}.report-modal{width:90vw;max-width:700px}.report-modal__container{display:flex;border-top:1px solid #d9e1e8}@media screen and (max-width: 480px){.report-modal__container{flex-wrap:wrap;overflow-y:auto}}.report-modal__statuses,.report-modal__comment{box-sizing:border-box;width:50%}@media screen and (max-width: 480px){.report-modal__statuses,.report-modal__comment{width:100%}}.report-modal__statuses,.focal-point-modal__content{flex:1 1 auto;min-height:20vh;max-height:80vh;overflow-y:auto;overflow-x:hidden}.report-modal__statuses .status__content a,.focal-point-modal__content .status__content a{color:#2b90d9}@media screen and (max-width: 480px){.report-modal__statuses,.focal-point-modal__content{max-height:10vh}}@media screen and (max-width: 480px){.focal-point-modal__content{max-height:40vh}}.report-modal__comment{padding:20px;border-right:1px solid #d9e1e8;max-width:320px}.report-modal__comment p{font-size:14px;line-height:20px;margin-bottom:20px}.report-modal__comment .setting-text{display:block;box-sizing:border-box;width:100%;margin:0;color:#000;background:#fff;padding:10px;font-family:inherit;font-size:14px;resize:none;border:0;outline:0;border-radius:4px;border:1px solid #d9e1e8;min-height:100px;max-height:50vh;margin-bottom:10px}.report-modal__comment .setting-text:focus{border:1px solid #c0cdd9}.report-modal__comment .setting-text__wrapper{background:#fff;border:1px solid #d9e1e8;margin-bottom:10px;border-radius:4px}.report-modal__comment .setting-text__wrapper .setting-text{border:0;margin-bottom:0;border-radius:0}.report-modal__comment .setting-text__wrapper .setting-text:focus{border:0}.report-modal__comment .setting-text__wrapper__modifiers{color:#000;font-family:inherit;font-size:14px;background:#fff}.report-modal__comment .setting-text__toolbar{display:flex;justify-content:space-between;margin-bottom:20px}.report-modal__comment .setting-text-label{display:block;color:#000;font-size:14px;font-weight:500;margin-bottom:10px}.report-modal__comment .setting-toggle{margin-top:20px;margin-bottom:24px}.report-modal__comment .setting-toggle__label{color:#000;font-size:14px}@media screen and (max-width: 480px){.report-modal__comment{padding:10px;max-width:100%;order:2}.report-modal__comment .setting-toggle{margin-bottom:4px}}.actions-modal{max-height:80vh;max-width:80vw}.actions-modal .status{overflow-y:auto;max-height:300px}.actions-modal strong{display:block;font-weight:500}.actions-modal .actions-modal__item-label{font-weight:500}.actions-modal ul{overflow-y:auto;flex-shrink:0;max-height:80vh}.actions-modal ul.with-status{max-height:calc(80vh - 75px)}.actions-modal ul li:empty{margin:0}.actions-modal ul li:not(:empty) a{color:#000;display:flex;padding:12px 16px;font-size:15px;align-items:center;text-decoration:none}.actions-modal ul li:not(:empty) a,.actions-modal ul li:not(:empty) a button{transition:none}.actions-modal ul li:not(:empty) a.active,.actions-modal ul li:not(:empty) a.active button,.actions-modal ul li:not(:empty) a:hover,.actions-modal ul li:not(:empty) a:hover button,.actions-modal ul li:not(:empty) a:active,.actions-modal ul li:not(:empty) a:active button,.actions-modal ul li:not(:empty) a:focus,.actions-modal ul li:not(:empty) a:focus button{background:#2b5fd9;color:#fff}.actions-modal ul li:not(:empty) a>.react-toggle,.actions-modal ul li:not(:empty) a>.icon,.actions-modal ul li:not(:empty) a button:first-child{margin-right:10px}.confirmation-modal__action-bar .confirmation-modal__secondary-button,.mute-modal__action-bar .confirmation-modal__secondary-button,.block-modal__action-bar .confirmation-modal__secondary-button{flex-shrink:1}.confirmation-modal__secondary-button,.confirmation-modal__cancel-button,.mute-modal__cancel-button,.block-modal__cancel-button{background-color:transparent;color:#1b1e25;font-size:14px;font-weight:500}.confirmation-modal__secondary-button:hover,.confirmation-modal__secondary-button:focus,.confirmation-modal__secondary-button:active,.confirmation-modal__cancel-button:hover,.confirmation-modal__cancel-button:focus,.confirmation-modal__cancel-button:active,.mute-modal__cancel-button:hover,.mute-modal__cancel-button:focus,.mute-modal__cancel-button:active,.block-modal__cancel-button:hover,.block-modal__cancel-button:focus,.block-modal__cancel-button:active{color:#131419;background-color:transparent}.confirmation-modal__do_not_ask_again{padding-left:20px;padding-right:20px;padding-bottom:10px;font-size:14px}.confirmation-modal__do_not_ask_again label,.confirmation-modal__do_not_ask_again input{vertical-align:middle}.confirmation-modal__container,.mute-modal__container,.block-modal__container,.report-modal__target{padding:30px;font-size:16px}.confirmation-modal__container strong,.mute-modal__container strong,.block-modal__container strong,.report-modal__target strong{font-weight:500}.confirmation-modal__container strong:lang(ja),.mute-modal__container strong:lang(ja),.block-modal__container strong:lang(ja),.report-modal__target strong:lang(ja){font-weight:700}.confirmation-modal__container strong:lang(ko),.mute-modal__container strong:lang(ko),.block-modal__container strong:lang(ko),.report-modal__target strong:lang(ko){font-weight:700}.confirmation-modal__container strong:lang(zh-CN),.mute-modal__container strong:lang(zh-CN),.block-modal__container strong:lang(zh-CN),.report-modal__target strong:lang(zh-CN){font-weight:700}.confirmation-modal__container strong:lang(zh-HK),.mute-modal__container strong:lang(zh-HK),.block-modal__container strong:lang(zh-HK),.report-modal__target strong:lang(zh-HK){font-weight:700}.confirmation-modal__container strong:lang(zh-TW),.mute-modal__container strong:lang(zh-TW),.block-modal__container strong:lang(zh-TW),.report-modal__target strong:lang(zh-TW){font-weight:700}.confirmation-modal__container,.report-modal__target{text-align:center}.block-modal__explanation,.mute-modal__explanation{margin-top:20px}.block-modal .setting-toggle,.mute-modal .setting-toggle{margin-top:20px;margin-bottom:24px;display:flex;align-items:center}.block-modal .setting-toggle__label,.mute-modal .setting-toggle__label{color:#000;margin:0;margin-left:8px}.report-modal__target{padding:15px}.report-modal__target .media-modal__close{top:14px;right:15px}.embed-modal{width:auto;max-width:80vw;max-height:80vh}.embed-modal h4{padding:30px;font-weight:500;font-size:16px;text-align:center}.embed-modal .embed-modal__container{padding:10px}.embed-modal .embed-modal__container .hint{margin-bottom:15px}.embed-modal .embed-modal__container .embed-modal__html{outline:0;box-sizing:border-box;display:block;width:100%;border:none;padding:10px;font-family:\"mastodon-font-monospace\",monospace;background:#282c37;color:#fff;font-size:14px;margin:0;margin-bottom:15px;border-radius:4px}.embed-modal .embed-modal__container .embed-modal__html::-moz-focus-inner{border:0}.embed-modal .embed-modal__container .embed-modal__html::-moz-focus-inner,.embed-modal .embed-modal__container .embed-modal__html:focus,.embed-modal .embed-modal__container .embed-modal__html:active{outline:0 !important}.embed-modal .embed-modal__container .embed-modal__html:focus{background:#313543}@media screen and (max-width: 600px){.embed-modal .embed-modal__container .embed-modal__html{font-size:16px}}.embed-modal .embed-modal__container .embed-modal__iframe{width:400px;max-width:100%;overflow:hidden;border:0;border-radius:4px}.focal-point{position:relative;cursor:move;overflow:hidden;height:100%;display:flex;justify-content:center;align-items:center;background:#000}.focal-point img,.focal-point video,.focal-point canvas{display:block;max-height:80vh;width:100%;height:auto;margin:0;object-fit:contain;background:#000}.focal-point__reticle{position:absolute;width:100px;height:100px;transform:translate(-50%, -50%);background:url(\"~images/reticle.png\") no-repeat 0 0;border-radius:50%;box-shadow:0 0 0 9999em rgba(0,0,0,.35)}.focal-point__overlay{position:absolute;width:100%;height:100%;top:0;left:0}.focal-point__preview{position:absolute;bottom:10px;right:10px;z-index:2;cursor:move;transition:opacity .1s ease}.focal-point__preview:hover{opacity:.5}.focal-point__preview strong{color:#fff;font-size:14px;font-weight:500;display:block;margin-bottom:5px}.focal-point__preview div{border-radius:4px;box-shadow:0 0 14px rgba(0,0,0,.2)}@media screen and (max-width: 480px){.focal-point img,.focal-point video{max-height:100%}.focal-point__preview{display:none}}.filtered-status-info{text-align:start}.filtered-status-info .spoiler__text{margin-top:20px}.filtered-status-info .account{border-bottom:0}.filtered-status-info .account__display-name strong{color:#000}.filtered-status-info .status__content__spoiler{display:none}.filtered-status-info .status__content__spoiler--visible{display:flex}.filtered-status-info ul{padding:10px;margin-left:12px;list-style:disc inside}.filtered-status-info .filtered-status-edit-link{color:#8d9ac2;text-decoration:none}.filtered-status-info .filtered-status-edit-link:hover{text-decoration:underline}.composer{padding:10px}.character-counter{cursor:default;font-family:sans-serif,sans-serif;font-size:14px;font-weight:600;color:#1b1e25}.character-counter.character-counter--over{color:#ff5050}.no-reduce-motion .composer--spoiler{transition:height .4s ease,opacity .4s ease}.composer--spoiler{height:0;transform-origin:bottom;opacity:0}.composer--spoiler.composer--spoiler--visible{height:36px;margin-bottom:11px;opacity:1}.composer--spoiler input{display:block;box-sizing:border-box;margin:0;border:none;border-radius:4px;padding:10px;width:100%;outline:0;color:#000;background:#fff;font-size:14px;font-family:inherit;resize:vertical}.composer--spoiler input::placeholder{color:#c2cede}.composer--spoiler input:focus{outline:0}@media screen and (max-width: 630px){.auto-columns .composer--spoiler input{font-size:16px}}.single-column .composer--spoiler input{font-size:16px}.composer--warning{color:#000;margin-bottom:15px;background:#9baec8;box-shadow:0 2px 6px rgba(0,0,0,.3);padding:8px 10px;border-radius:4px;font-size:13px;font-weight:400}.composer--warning a{color:#1b1e25;font-weight:500;text-decoration:underline}.composer--warning a:active,.composer--warning a:focus,.composer--warning a:hover{text-decoration:none}.compose-form__sensitive-button{padding:10px;padding-top:0;font-size:14px;font-weight:500}.compose-form__sensitive-button.active{color:#2b90d9}.compose-form__sensitive-button input[type=checkbox]{display:none}.compose-form__sensitive-button .checkbox{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-left:5px;margin-right:10px;top:-1px;border-radius:4px;vertical-align:middle}.compose-form__sensitive-button .checkbox.active{border-color:#2b90d9;background:#2b90d9}.composer--reply{margin:0 0 10px;border-radius:4px;padding:10px;background:#9baec8;min-height:23px;overflow-y:auto;flex:0 2 auto}.composer--reply>header{margin-bottom:5px;overflow:hidden}.composer--reply>header>.account.small{color:#000}.composer--reply>header>.cancel{float:right;line-height:24px}.composer--reply>.content{position:relative;margin:10px 0;padding:0 12px;font-size:14px;line-height:20px;color:#000;word-wrap:break-word;font-weight:400;overflow:visible;white-space:pre-wrap;padding-top:5px;overflow:hidden}.composer--reply>.content p,.composer--reply>.content pre,.composer--reply>.content blockquote{margin-bottom:20px;white-space:pre-wrap}.composer--reply>.content p:last-child,.composer--reply>.content pre:last-child,.composer--reply>.content blockquote:last-child{margin-bottom:0}.composer--reply>.content h1,.composer--reply>.content h2,.composer--reply>.content h3,.composer--reply>.content h4,.composer--reply>.content h5{margin-top:20px;margin-bottom:20px}.composer--reply>.content h1,.composer--reply>.content h2{font-weight:700;font-size:18px}.composer--reply>.content h2{font-size:16px}.composer--reply>.content h3,.composer--reply>.content h4,.composer--reply>.content h5{font-weight:500}.composer--reply>.content blockquote{padding-left:10px;border-left:3px solid #000;color:#000;white-space:normal}.composer--reply>.content blockquote p:last-child{margin-bottom:0}.composer--reply>.content b,.composer--reply>.content strong{font-weight:700}.composer--reply>.content em,.composer--reply>.content i{font-style:italic}.composer--reply>.content sub{font-size:smaller;text-align:sub}.composer--reply>.content ul,.composer--reply>.content ol{margin-left:1em}.composer--reply>.content ul p,.composer--reply>.content ol p{margin:0}.composer--reply>.content ul{list-style-type:disc}.composer--reply>.content ol{list-style-type:decimal}.composer--reply>.content a{color:#1b1e25;text-decoration:none}.composer--reply>.content a:hover{text-decoration:underline}.composer--reply>.content a.mention:hover{text-decoration:none}.composer--reply>.content a.mention:hover span{text-decoration:underline}.composer--reply .emojione{width:20px;height:20px;margin:-5px 0 0}.emoji-picker-dropdown{position:absolute;right:5px;top:5px}.emoji-picker-dropdown ::-webkit-scrollbar-track:hover,.emoji-picker-dropdown ::-webkit-scrollbar-track:active{background-color:rgba(0,0,0,.3)}.compose-form__autosuggest-wrapper,.autosuggest-input{position:relative;width:100%}.compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea,.autosuggest-input label .autosuggest-textarea__textarea{display:block;box-sizing:border-box;margin:0;border:none;border-radius:4px 4px 0 0;padding:10px 32px 0 10px;width:100%;min-height:100px;outline:0;color:#000;background:#fff;font-size:14px;font-family:inherit;resize:none;scrollbar-color:initial}.compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea::placeholder,.autosuggest-input label .autosuggest-textarea__textarea::placeholder{color:#c2cede}.compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea::-webkit-scrollbar,.autosuggest-input label .autosuggest-textarea__textarea::-webkit-scrollbar{all:unset}.compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea:disabled,.autosuggest-input label .autosuggest-textarea__textarea:disabled{background:#d9e1e8}.compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea:focus,.autosuggest-input label .autosuggest-textarea__textarea:focus{outline:0}@media screen and (max-width: 630px){.auto-columns .compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea,.auto-columns .autosuggest-input label .autosuggest-textarea__textarea{font-size:16px}}.single-column .compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea,.single-column .autosuggest-input label .autosuggest-textarea__textarea{font-size:16px}@media screen and (max-width: 600px){.auto-columns .compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea,.single-column .compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea,.auto-columns .autosuggest-input label .autosuggest-textarea__textarea,.single-column .autosuggest-input label .autosuggest-textarea__textarea{height:100px !important;resize:vertical}}.composer--textarea--icons{display:block;position:absolute;top:29px;right:5px;bottom:5px;overflow:hidden}.composer--textarea--icons>.textarea_icon{display:block;margin:2px 0 0 2px;width:24px;height:24px;color:#1b1e25;font-size:18px;line-height:24px;text-align:center;opacity:.8}.autosuggest-textarea__suggestions-wrapper{position:relative;height:0}.autosuggest-textarea__suggestions{display:block;position:absolute;box-sizing:border-box;top:100%;border-radius:0 0 4px 4px;padding:6px;width:100%;color:#000;background:#d9e1e8;box-shadow:4px 4px 6px rgba(0,0,0,.4);font-size:14px;z-index:99;display:none}.autosuggest-textarea__suggestions--visible{display:block}.autosuggest-textarea__suggestions__item{padding:10px;cursor:pointer;border-radius:4px}.autosuggest-textarea__suggestions__item:hover,.autosuggest-textarea__suggestions__item:focus,.autosuggest-textarea__suggestions__item:active,.autosuggest-textarea__suggestions__item.selected{background:#b9c8d5}.autosuggest-textarea__suggestions__item>.account,.autosuggest-textarea__suggestions__item>.emoji,.autosuggest-textarea__suggestions__item>.autosuggest-hashtag{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;line-height:18px;font-size:14px}.autosuggest-textarea__suggestions__item .autosuggest-hashtag{justify-content:space-between}.autosuggest-textarea__suggestions__item .autosuggest-hashtag__name{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.autosuggest-textarea__suggestions__item .autosuggest-hashtag strong{font-weight:500}.autosuggest-textarea__suggestions__item .autosuggest-hashtag__uses{flex:0 0 auto;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.autosuggest-textarea__suggestions__item>.account.small .display-name>span{color:#1b1e25}.composer--upload_form{overflow:hidden}.composer--upload_form>.content{display:flex;flex-direction:row;flex-wrap:wrap;font-family:inherit;padding:5px;overflow:hidden}.composer--upload_form--item{flex:1 1 0;margin:5px;min-width:40%}.composer--upload_form--item>div{position:relative;border-radius:4px;height:140px;width:100%;background-color:#000;background-position:center;background-size:cover;background-repeat:no-repeat;overflow:hidden}.composer--upload_form--item>div textarea{display:block;position:absolute;box-sizing:border-box;bottom:0;left:0;margin:0;border:0;padding:10px;width:100%;color:#ecf0f4;background:linear-gradient(0deg, rgba(0, 0, 0, 0.8) 0, rgba(0, 0, 0, 0.35) 80%, transparent);font-size:14px;font-family:inherit;font-weight:500;opacity:0;z-index:2;transition:opacity .1s ease}.composer--upload_form--item>div textarea:focus{color:#fff}.composer--upload_form--item>div textarea::placeholder{opacity:.54;color:#ecf0f4}.composer--upload_form--item>div>.close{mix-blend-mode:difference}.composer--upload_form--item.active>div textarea{opacity:1}.composer--upload_form--actions{background:linear-gradient(180deg, rgba(0, 0, 0, 0.8) 0, rgba(0, 0, 0, 0.35) 80%, transparent);display:flex;align-items:flex-start;justify-content:space-between;opacity:0;transition:opacity .1s ease}.composer--upload_form--actions .icon-button{flex:0 1 auto;color:#d9e1e8;font-size:14px;font-weight:500;padding:10px;font-family:inherit}.composer--upload_form--actions .icon-button:hover,.composer--upload_form--actions .icon-button:focus,.composer--upload_form--actions .icon-button:active{color:#e6ebf0}.composer--upload_form--actions.active{opacity:1}.composer--upload_form--progress{display:flex;padding:10px;color:#dde3ec;overflow:hidden}.composer--upload_form--progress>.fa{font-size:34px;margin-right:10px}.composer--upload_form--progress>.message{flex:1 1 auto}.composer--upload_form--progress>.message>span{display:block;font-size:12px;font-weight:500;text-transform:uppercase}.composer--upload_form--progress>.message>.backdrop{position:relative;margin-top:5px;border-radius:6px;width:100%;height:6px;background:#606984}.composer--upload_form--progress>.message>.backdrop>.tracker{position:absolute;top:0;left:0;height:6px;border-radius:6px;background:#2b5fd9}.compose-form__modifiers{color:#000;font-family:inherit;font-size:14px;background:#fff}.composer--options-wrapper{padding:10px;background:#ebebeb;border-radius:0 0 4px 4px;height:27px;display:flex;justify-content:space-between;flex:0 0 auto}.composer--options{display:flex;flex:0 0 auto}.composer--options>*{display:inline-block;box-sizing:content-box;padding:0 3px;height:27px;line-height:27px;vertical-align:bottom}.composer--options>hr{display:inline-block;margin:0 3px;border-width:0 0 0 1px;border-style:none none none solid;border-color:transparent transparent transparent #c2c2c2;padding:0;width:0;height:27px;background:transparent}.compose--counter-wrapper{align-self:center;margin-right:4px}.composer--options--dropdown.open>.value{border-radius:4px 4px 0 0;box-shadow:0 -4px 4px rgba(0,0,0,.1);color:#fff;background:#2b5fd9;transition:none}.composer--options--dropdown.open.top>.value{border-radius:0 0 4px 4px;box-shadow:0 4px 4px rgba(0,0,0,.1)}.composer--options--dropdown--content{position:absolute;border-radius:4px;box-shadow:2px 4px 15px rgba(0,0,0,.4);background:#fff;overflow:hidden;transform-origin:50% 0}.composer--options--dropdown--content--item{display:flex;align-items:center;padding:10px;color:#000;cursor:pointer}.composer--options--dropdown--content--item>.content{flex:1 1 auto;color:#1b1e25}.composer--options--dropdown--content--item>.content:not(:first-child){margin-left:10px}.composer--options--dropdown--content--item>.content strong{display:block;color:#000;font-weight:500}.composer--options--dropdown--content--item:hover,.composer--options--dropdown--content--item.active{background:#2b5fd9;color:#fff}.composer--options--dropdown--content--item:hover>.content,.composer--options--dropdown--content--item.active>.content{color:#fff}.composer--options--dropdown--content--item:hover>.content strong,.composer--options--dropdown--content--item.active>.content strong{color:#fff}.composer--options--dropdown--content--item.active:hover{background:#3c6cdc}.composer--publisher{padding-top:10px;text-align:right;white-space:nowrap;overflow:hidden;justify-content:flex-end;flex:0 0 auto}.composer--publisher>.primary{display:inline-block;margin:0;padding:0 10px;text-align:center}.composer--publisher>.side_arm{display:inline-block;margin:0 2px;padding:0;width:36px;text-align:center}.composer--publisher.over>.count{color:#ff5050}.column__wrapper{display:flex;flex:1 1 auto;position:relative}.columns-area{display:flex;flex:1 1 auto;flex-direction:row;justify-content:flex-start;overflow-x:auto;position:relative}.columns-area__panels{display:flex;justify-content:center;width:100%;height:100%;min-height:100vh}.columns-area__panels__pane{height:100%;overflow:hidden;pointer-events:none;display:flex;justify-content:flex-end;min-width:285px}.columns-area__panels__pane--start{justify-content:flex-start}.columns-area__panels__pane__inner{position:fixed;width:285px;pointer-events:auto;height:100%}.columns-area__panels__main{box-sizing:border-box;width:100%;max-width:600px;flex:0 0 auto;display:flex;flex-direction:column}@media screen and (min-width: 415px){.columns-area__panels__main{padding:0 10px}}.tabs-bar__wrapper{background:#17191f;position:sticky;top:0;z-index:2;padding-top:0}@media screen and (min-width: 415px){.tabs-bar__wrapper{padding-top:10px}}.tabs-bar__wrapper .tabs-bar{margin-bottom:0}@media screen and (min-width: 415px){.tabs-bar__wrapper .tabs-bar{margin-bottom:10px}}.react-swipeable-view-container,.react-swipeable-view-container .columns-area,.react-swipeable-view-container .column{height:100%}.react-swipeable-view-container>*{display:flex;align-items:center;justify-content:center;height:100%}.column{width:330px;position:relative;box-sizing:border-box;display:flex;flex-direction:column}.column>.scrollable{background:#282c37}.ui{flex:0 0 auto;display:flex;flex-direction:column;width:100%;height:100%}.column{overflow:hidden}.column-back-button{box-sizing:border-box;width:100%;background:#313543;color:#2b90d9;cursor:pointer;flex:0 0 auto;font-size:16px;border:0;text-align:unset;padding:15px;margin:0;z-index:3}.column-back-button:hover{text-decoration:underline}.column-header__back-button{background:#313543;border:0;font-family:inherit;color:#2b90d9;cursor:pointer;flex:0 0 auto;font-size:16px;padding:0 5px 0 0;z-index:3}.column-header__back-button:hover{text-decoration:underline}.column-header__back-button:last-child{padding:0 15px 0 0}.column-back-button__icon{display:inline-block;margin-right:5px}.column-back-button--slim{position:relative}.column-back-button--slim-button{cursor:pointer;flex:0 0 auto;font-size:16px;padding:15px;position:absolute;right:0;top:-48px}.column-link{background:#393f4f;color:#fff;display:block;font-size:16px;padding:15px;text-decoration:none}.column-link:hover,.column-link:focus,.column-link:active{background:#404657}.column-link:focus{outline:0}.column-link--transparent{background:transparent;color:#d9e1e8}.column-link--transparent:hover,.column-link--transparent:focus,.column-link--transparent:active{background:transparent;color:#fff}.column-link--transparent.active{color:#2b5fd9}.column-link__icon{display:inline-block;margin-right:5px}.column-subheading{background:#282c37;color:#c2cede;padding:8px 20px;font-size:12px;font-weight:500;text-transform:uppercase;cursor:default}.column-header__wrapper{position:relative;flex:0 0 auto}.column-header__wrapper.active::before{display:block;content:\"\";position:absolute;top:35px;left:0;right:0;margin:0 auto;width:60%;pointer-events:none;height:28px;z-index:1;background:radial-gradient(ellipse, rgba(43, 95, 217, 0.23) 0%, rgba(43, 95, 217, 0) 60%)}.column-header{display:flex;font-size:16px;background:#313543;flex:0 0 auto;cursor:pointer;position:relative;z-index:2;outline:0;overflow:hidden}.column-header>button{margin:0;border:none;padding:15px;color:inherit;background:transparent;font:inherit;text-align:left;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;flex:1}.column-header>.column-header__back-button{color:#2b90d9}.column-header.active{box-shadow:0 1px 0 rgba(43,95,217,.3)}.column-header.active .column-header__icon{color:#2b90d9;text-shadow:0 0 10px rgba(43,95,217,.4)}.column-header:focus,.column-header:active{outline:0}.column{width:330px;position:relative;box-sizing:border-box;display:flex;flex-direction:column;overflow:hidden}.wide .columns-area:not(.columns-area--mobile) .column{flex:auto;min-width:330px;max-width:400px}.column>.scrollable{background:#282c37}.column-header__buttons{height:48px;display:flex;margin-left:0}.column-header__links{margin-bottom:14px}.column-header__links .text-btn{margin-right:10px}.column-header__button,.column-header__notif-cleaning-buttons button{background:#313543;border:0;color:#dde3ec;cursor:pointer;font-size:16px;padding:0 15px}.column-header__button:hover,.column-header__notif-cleaning-buttons button:hover{color:#f4f6f9}.column-header__button.active,.column-header__notif-cleaning-buttons button.active{color:#fff;background:#393f4f}.column-header__button.active:hover,.column-header__notif-cleaning-buttons button.active:hover{color:#fff;background:#393f4f}.column-header__button:focus,.column-header__notif-cleaning-buttons button:focus{text-shadow:0 0 4px #2454c7}.column-header__notif-cleaning-buttons{display:flex;align-items:stretch;justify-content:space-around}.column-header__notif-cleaning-buttons button{background:transparent;text-align:center;padding:10px 0;white-space:pre-wrap}.column-header__notif-cleaning-buttons b{font-weight:bold}.column-header__collapsible-inner.nopad-drawer{padding:0}.column-header__collapsible{max-height:70vh;overflow:hidden;overflow-y:auto;color:#dde3ec;transition:max-height 150ms ease-in-out,opacity 300ms linear;opacity:1}.column-header__collapsible.collapsed{max-height:0;opacity:.5}.column-header__collapsible.animating{overflow-y:hidden}.column-header__collapsible hr{height:0;background:transparent;border:0;border-top:1px solid #42485a;margin:10px 0}.column-header__collapsible.ncd{transition:none}.column-header__collapsible.ncd.collapsed{max-height:0;opacity:.7}.column-header__collapsible-inner{background:#393f4f;padding:15px}.column-header__setting-btn:hover{color:#dde3ec;text-decoration:underline}.column-header__setting-arrows{float:right}.column-header__setting-arrows .column-header__setting-btn{padding:0 10px}.column-header__setting-arrows .column-header__setting-btn:last-child{padding-right:0}.column-header__title{display:inline-block;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;flex:1}.column-header__icon{display:inline-block;margin-right:5px}.empty-column-indicator,.error-column{color:#c2cede;background:#282c37;text-align:center;padding:20px;font-size:15px;font-weight:400;cursor:default;display:flex;flex:1 1 auto;align-items:center;justify-content:center}@supports(display: grid){.empty-column-indicator,.error-column{contain:strict}}.empty-column-indicator>span,.error-column>span{max-width:400px}.empty-column-indicator a,.error-column a{color:#2b90d9;text-decoration:none}.empty-column-indicator a:hover,.error-column a:hover{text-decoration:underline}.error-column{flex-direction:column}.single-column.navbar-under .tabs-bar{margin-top:0 !important;margin-bottom:-6px !important}@media screen and (max-width: 415px){.auto-columns.navbar-under .tabs-bar{margin-top:0 !important;margin-bottom:-6px !important}}@media screen and (max-width: 415px){.auto-columns.navbar-under .react-swipeable-view-container .columns-area,.single-column.navbar-under .react-swipeable-view-container .columns-area{height:100% !important}}.column-inline-form{padding:7px 15px;padding-right:5px;display:flex;justify-content:flex-start;align-items:center;background:#313543}.column-inline-form label{flex:1 1 auto}.column-inline-form label input{width:100%;margin-bottom:6px}.column-inline-form label input:focus{outline:0}.column-inline-form .icon-button{flex:0 0 auto;margin:0 5px}.regeneration-indicator{text-align:center;font-size:16px;font-weight:500;color:#c2cede;background:#282c37;cursor:default;display:flex;flex:1 1 auto;flex-direction:column;align-items:center;justify-content:center;padding:20px}.regeneration-indicator__figure,.regeneration-indicator__figure img{display:block;width:auto;height:160px;margin:0}.regeneration-indicator--without-header{padding-top:68px}.regeneration-indicator__label{margin-top:30px}.regeneration-indicator__label strong{display:block;margin-bottom:10px;color:#c2cede}.regeneration-indicator__label span{font-size:15px;font-weight:400}.directory__list{width:100%;margin:10px 0;transition:opacity 100ms ease-in}.directory__list.loading{opacity:.7}@media screen and (max-width: 415px){.directory__list{margin:0}}.directory__card{box-sizing:border-box;margin-bottom:10px}.directory__card__img{height:125px;position:relative;background:#0e1014;overflow:hidden}.directory__card__img img{display:block;width:100%;height:100%;margin:0;object-fit:cover}.directory__card__bar{display:flex;align-items:center;background:#313543;padding:10px}.directory__card__bar__name{flex:1 1 auto;display:flex;align-items:center;text-decoration:none;overflow:hidden}.directory__card__bar__relationship{width:23px;min-height:1px;flex:0 0 auto}.directory__card__bar .avatar{flex:0 0 auto;width:48px;height:48px;padding-top:2px}.directory__card__bar .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px;background:#17191f;object-fit:cover}.directory__card__bar .display-name{margin-left:15px;text-align:left}.directory__card__bar .display-name strong{font-size:15px;color:#fff;font-weight:500;overflow:hidden;text-overflow:ellipsis}.directory__card__bar .display-name span{display:block;font-size:14px;color:#dde3ec;font-weight:400;overflow:hidden;text-overflow:ellipsis}.directory__card__extra{background:#282c37;display:flex;align-items:center;justify-content:center}.directory__card__extra .accounts-table__count{width:33.33%;flex:0 0 auto;padding:15px 0}.directory__card__extra .account__header__content{box-sizing:border-box;padding:15px 10px;border-bottom:1px solid #393f4f;width:100%;min-height:48px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.directory__card__extra .account__header__content p{display:none}.directory__card__extra .account__header__content p:first-child{display:inline}.directory__card__extra .account__header__content br{display:none}.filter-form{background:#282c37}.filter-form__column{padding:10px 15px}.filter-form .radio-button{display:block}.radio-button{font-size:14px;position:relative;display:inline-block;padding:6px 0;line-height:18px;cursor:default;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer}.radio-button input[type=radio],.radio-button input[type=checkbox]{display:none}.radio-button__input{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:50%;vertical-align:middle}.radio-button__input.checked{border-color:#4e79df;background:#4e79df}.search{position:relative}.search__input{outline:0;box-sizing:border-box;width:100%;border:none;box-shadow:none;font-family:inherit;background:#282c37;color:#dde3ec;font-size:14px;margin:0;display:block;padding:15px;padding-right:30px;line-height:18px;font-size:16px}.search__input::placeholder{color:#eaeef3}.search__input::-moz-focus-inner{border:0}.search__input::-moz-focus-inner,.search__input:focus,.search__input:active{outline:0 !important}.search__input:focus{background:#313543}@media screen and (max-width: 600px){.search__input{font-size:16px}}.search__icon::-moz-focus-inner{border:0}.search__icon::-moz-focus-inner,.search__icon:focus{outline:0 !important}.search__icon .fa{position:absolute;top:16px;right:10px;z-index:2;display:inline-block;opacity:0;transition:all 100ms linear;transition-property:color,transform,opacity;font-size:18px;width:18px;height:18px;color:#ecf0f4;cursor:default;pointer-events:none}.search__icon .fa.active{pointer-events:auto;opacity:.3}.search__icon .fa-search{transform:rotate(0deg)}.search__icon .fa-search.active{pointer-events:auto;opacity:.3}.search__icon .fa-times-circle{top:17px;transform:rotate(0deg);color:#8d9ac2;cursor:pointer}.search__icon .fa-times-circle.active{transform:rotate(90deg)}.search__icon .fa-times-circle:hover{color:#a4afce}.search-results__header{color:#c2cede;background:#2c313d;border-bottom:1px solid #1f232b;padding:15px 10px;font-size:14px;font-weight:500}.search-results__info{padding:20px;color:#dde3ec;text-align:center}.trends__header{color:#c2cede;background:#2c313d;border-bottom:1px solid #1f232b;font-weight:500;padding:15px;font-size:16px;cursor:default}.trends__header .fa{display:inline-block;margin-right:5px}.trends__item{display:flex;align-items:center;padding:15px;border-bottom:1px solid #393f4f}.trends__item:last-child{border-bottom:0}.trends__item__name{flex:1 1 auto;color:#c2cede;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trends__item__name strong{font-weight:500}.trends__item__name a{color:#dde3ec;text-decoration:none;font-size:14px;font-weight:500;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trends__item__name a:hover span,.trends__item__name a:focus span,.trends__item__name a:active span{text-decoration:underline}.trends__item__current{flex:0 0 auto;font-size:24px;line-height:36px;font-weight:500;text-align:right;padding-right:15px;margin-left:5px;color:#ecf0f4}.trends__item__sparkline{flex:0 0 auto;width:50px}.trends__item__sparkline path:first-child{fill:rgba(43,144,217,.25) !important;fill-opacity:1 !important}.trends__item__sparkline path:last-child{stroke:#459ede !important}.emojione{font-size:inherit;vertical-align:middle;object-fit:contain;margin:-0.2ex .15em .2ex;width:16px;height:16px}.emojione img{width:auto}.emoji-picker-dropdown__menu{background:#fff;position:absolute;box-shadow:4px 4px 6px rgba(0,0,0,.4);border-radius:4px;margin-top:5px;z-index:2}.emoji-picker-dropdown__menu .emoji-mart-scroll{transition:opacity 200ms ease}.emoji-picker-dropdown__menu.selecting .emoji-mart-scroll{opacity:.5}.emoji-picker-dropdown__modifiers{position:absolute;top:60px;right:11px;cursor:pointer}.emoji-picker-dropdown__modifiers__menu{position:absolute;z-index:4;top:-4px;left:-8px;background:#fff;border-radius:4px;box-shadow:1px 2px 6px rgba(0,0,0,.2);overflow:hidden}.emoji-picker-dropdown__modifiers__menu button{display:block;cursor:pointer;border:0;padding:4px 8px;background:transparent}.emoji-picker-dropdown__modifiers__menu button:hover,.emoji-picker-dropdown__modifiers__menu button:focus,.emoji-picker-dropdown__modifiers__menu button:active{background:rgba(217,225,232,.4)}.emoji-picker-dropdown__modifiers__menu .emoji-mart-emoji{height:22px}.emoji-mart-emoji span{background-repeat:no-repeat}.emoji-button{display:block;font-size:24px;line-height:24px;margin-left:2px;width:24px;outline:0;cursor:pointer}.emoji-button:active,.emoji-button:focus{outline:0 !important}.emoji-button img{filter:grayscale(100%);opacity:.8;display:block;margin:0;width:22px;height:22px;margin-top:2px}.emoji-button:hover img,.emoji-button:active img,.emoji-button:focus img{opacity:1;filter:none}.doodle-modal{width:unset}.doodle-modal__container{background:#d9e1e8;text-align:center;line-height:0}.doodle-modal__container canvas{border:5px solid #d9e1e8}.doodle-modal__action-bar .filler{flex-grow:1;margin:0;padding:0}.doodle-modal__action-bar .doodle-toolbar{line-height:1;display:flex;flex-direction:column;flex-grow:0;justify-content:space-around}.doodle-modal__action-bar .doodle-toolbar.with-inputs label{display:inline-block;width:70px;text-align:right;margin-right:2px}.doodle-modal__action-bar .doodle-toolbar.with-inputs input[type=number],.doodle-modal__action-bar .doodle-toolbar.with-inputs input[type=text]{width:40px}.doodle-modal__action-bar .doodle-toolbar.with-inputs span.val{display:inline-block;text-align:left;width:50px}.doodle-modal__action-bar .doodle-palette{padding-right:0 !important;border:1px solid #000;line-height:.2rem;flex-grow:0;background:#fff}.doodle-modal__action-bar .doodle-palette button{appearance:none;width:1rem;height:1rem;margin:0;padding:0;text-align:center;color:#000;text-shadow:0 0 1px #fff;cursor:pointer;box-shadow:inset 0 0 1px rgba(255,255,255,.5);border:1px solid #000;outline-offset:-1px}.doodle-modal__action-bar .doodle-palette button.foreground{outline:1px dashed #fff}.doodle-modal__action-bar .doodle-palette button.background{outline:1px dashed red}.doodle-modal__action-bar .doodle-palette button.foreground.background{outline:1px dashed red;border-color:#fff}.drawer{width:300px;box-sizing:border-box;display:flex;flex-direction:column;overflow-y:hidden;padding:10px 5px;flex:none}.drawer:first-child{padding-left:10px}.drawer:last-child{padding-right:10px}@media screen and (max-width: 630px){.auto-columns .drawer{flex:auto}}.single-column .drawer{flex:auto}@media screen and (max-width: 630px){.auto-columns .drawer,.auto-columns .drawer:first-child,.auto-columns .drawer:last-child,.single-column .drawer,.single-column .drawer:first-child,.single-column .drawer:last-child{padding:0}}.wide .drawer{min-width:300px;max-width:400px;flex:1 1 200px}@media screen and (max-width: 630px){:root .auto-columns .drawer{flex:auto;width:100%;min-width:0;max-width:none;padding:0}}:root .single-column .drawer{flex:auto;width:100%;min-width:0;max-width:none;padding:0}.react-swipeable-view-container .drawer{height:100%}.drawer--header{display:flex;flex-direction:row;margin-bottom:10px;flex:none;background:#393f4f;font-size:16px}.drawer--header>*{display:block;box-sizing:border-box;border-bottom:2px solid transparent;padding:15px 5px 13px;height:48px;flex:1 1 auto;color:#dde3ec;text-align:center;text-decoration:none;cursor:pointer}.drawer--header a{transition:background 100ms ease-in}.drawer--header a:focus,.drawer--header a:hover{outline:none;background:#2e3340;transition:background 200ms ease-out}.search{position:relative;margin-bottom:10px;flex:none}@media screen and (max-width: 415px){.auto-columns .search,.single-column .search{margin-bottom:0}}@media screen and (max-width: 630px){.auto-columns .search{font-size:16px}}.single-column .search{font-size:16px}.search-popout{background:#fff;border-radius:4px;padding:10px 14px;padding-bottom:14px;margin-top:10px;color:#364861;box-shadow:2px 4px 15px rgba(0,0,0,.4)}.search-popout h4{text-transform:uppercase;color:#364861;font-size:13px;font-weight:500;margin-bottom:10px}.search-popout li{padding:4px 0}.search-popout ul{margin-bottom:10px}.search-popout em{font-weight:500;color:#000}.drawer--account{padding:10px;color:#dde3ec;display:flex;align-items:center}.drawer--account a{color:inherit;text-decoration:none}.drawer--account .acct{display:block;color:#ecf0f4;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.navigation-bar__profile{flex:1 1 auto;margin-left:8px;overflow:hidden}.drawer--results{background:#282c37;overflow-x:hidden;overflow-y:auto}.drawer--results>header{color:#c2cede;background:#2c313d;padding:15px;font-weight:500;font-size:16px;cursor:default}.drawer--results>header .fa{display:inline-block;margin-right:5px}.drawer--results>section{margin-bottom:5px}.drawer--results>section h5{background:#1f232b;border-bottom:1px solid #393f4f;cursor:default;display:flex;padding:15px;font-weight:500;font-size:16px;color:#c2cede}.drawer--results>section h5 .fa{display:inline-block;margin-right:5px}.drawer--results>section .account:last-child,.drawer--results>section>div:last-child .status{border-bottom:0}.drawer--results>section>.hashtag{display:block;padding:10px;color:#ecf0f4;text-decoration:none}.drawer--results>section>.hashtag:hover,.drawer--results>section>.hashtag:active,.drawer--results>section>.hashtag:focus{color:#f9fafb;text-decoration:underline}.drawer__pager{box-sizing:border-box;padding:0;flex-grow:1;position:relative;overflow:hidden;display:flex}.drawer__inner{position:absolute;top:0;left:0;background:#444b5d;box-sizing:border-box;padding:0;display:flex;flex-direction:column;overflow:hidden;overflow-y:auto;width:100%;height:100%}.drawer__inner.darker{background:#282c37}.drawer__inner__mastodon{background:#444b5d url('data:image/svg+xml;utf8,') no-repeat bottom/100% auto;flex:1;min-height:47px;display:none}.drawer__inner__mastodon>img{display:block;object-fit:contain;object-position:bottom left;width:100%;height:100%;pointer-events:none;user-drag:none;user-select:none}.drawer__inner__mastodon>.mastodon{display:block;width:100%;height:100%;border:none;cursor:inherit}@media screen and (min-height: 640px){.drawer__inner__mastodon{display:block}}.pseudo-drawer{background:#444b5d;font-size:13px;text-align:left}.drawer__backdrop{cursor:pointer;position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5)}.video-error-cover{align-items:center;background:#000;color:#fff;cursor:pointer;display:flex;flex-direction:column;height:100%;justify-content:center;margin-top:8px;position:relative;text-align:center;z-index:100}.media-spoiler{background:#000;color:#dde3ec;border:0;width:100%;height:100%}.media-spoiler:hover,.media-spoiler:active,.media-spoiler:focus{color:#f7f9fb}.status__content>.media-spoiler{margin-top:15px}.media-spoiler.full-width{margin-left:-14px;margin-right:-14px;width:inherit;max-width:none;height:250px;border-radius:0px}.media-spoiler__warning{display:block;font-size:14px}.media-spoiler__trigger{display:block;font-size:11px;font-weight:500}.media-gallery__gifv__label{display:block;position:absolute;color:#fff;background:rgba(0,0,0,.5);bottom:6px;left:6px;padding:2px 6px;border-radius:2px;font-size:11px;font-weight:600;z-index:1;pointer-events:none;opacity:.9;transition:opacity .1s ease;line-height:18px}.media-gallery__gifv.autoplay .media-gallery__gifv__label{display:none}.media-gallery__gifv:hover .media-gallery__gifv__label{opacity:1}.media-gallery__audio{height:100%;display:flex;flex-direction:column}.media-gallery__audio span{text-align:center;color:#dde3ec;display:flex;height:100%;align-items:center}.media-gallery__audio span p{width:100%}.media-gallery__audio audio{width:100%}.media-gallery{box-sizing:border-box;margin-top:8px;overflow:hidden;border-radius:4px;position:relative;width:100%;height:110px}.media-gallery.full-width{margin-left:-14px;margin-right:-14px;width:inherit;max-width:none;height:250px;border-radius:0px}.media-gallery__item{border:none;box-sizing:border-box;display:block;float:left;position:relative;border-radius:4px;overflow:hidden}.full-width .media-gallery__item{border-radius:0}.media-gallery__item.standalone .media-gallery__item-gifv-thumbnail{transform:none;top:0}.media-gallery__item.letterbox{background:#000}.media-gallery__item-thumbnail{cursor:zoom-in;display:block;text-decoration:none;color:#ecf0f4;position:relative;z-index:1}.media-gallery__item-thumbnail,.media-gallery__item-thumbnail img{height:100%;width:100%;object-fit:contain}.media-gallery__item-thumbnail:not(.letterbox),.media-gallery__item-thumbnail img:not(.letterbox){height:100%;object-fit:cover}.media-gallery__preview{width:100%;height:100%;object-fit:cover;position:absolute;top:0;left:0;z-index:0;background:#000}.media-gallery__preview--hidden{display:none}.media-gallery__gifv{height:100%;overflow:hidden;position:relative;width:100%;display:flex;justify-content:center}.media-gallery__item-gifv-thumbnail{cursor:zoom-in;height:100%;width:100%;position:relative;z-index:1;object-fit:contain;user-select:none}.media-gallery__item-gifv-thumbnail:not(.letterbox){height:100%;object-fit:cover}.media-gallery__item-thumbnail-label{clip:rect(1px 1px 1px 1px);clip:rect(1px, 1px, 1px, 1px);overflow:hidden;position:absolute}.video-modal__container{max-width:100vw;max-height:100vh}.audio-modal__container{width:50vw}.media-modal{width:100%;height:100%;position:relative}.media-modal .extended-video-player{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.media-modal .extended-video-player video{max-width:100%;max-height:80%}.media-modal__closer{position:absolute;top:0;left:0;right:0;bottom:0}.media-modal__navigation{position:absolute;top:0;left:0;right:0;bottom:0;pointer-events:none;transition:opacity .3s linear;will-change:opacity}.media-modal__navigation *{pointer-events:auto}.media-modal__navigation.media-modal__navigation--hidden{opacity:0}.media-modal__navigation.media-modal__navigation--hidden *{pointer-events:none}.media-modal__nav{background:rgba(0,0,0,.5);box-sizing:border-box;border:0;color:#fff;cursor:pointer;display:flex;align-items:center;font-size:24px;height:20vmax;margin:auto 0;padding:30px 15px;position:absolute;top:0;bottom:0}.media-modal__nav--left{left:0}.media-modal__nav--right{right:0}.media-modal__pagination{width:100%;text-align:center;position:absolute;left:0;bottom:20px;pointer-events:none}.media-modal__meta{text-align:center;position:absolute;left:0;bottom:20px;width:100%;pointer-events:none}.media-modal__meta--shifted{bottom:62px}.media-modal__meta a{pointer-events:auto;text-decoration:none;font-weight:500;color:#d9e1e8}.media-modal__meta a:hover,.media-modal__meta a:focus,.media-modal__meta a:active{text-decoration:underline}.media-modal__page-dot{display:inline-block}.media-modal__button{background-color:#fff;height:12px;width:12px;border-radius:6px;margin:10px;padding:0;border:0;font-size:0}.media-modal__button--active{background-color:#2b5fd9}.media-modal__close{position:absolute;right:8px;top:8px;z-index:100}.detailed .video-player__volume__current,.detailed .video-player__volume::before,.fullscreen .video-player__volume__current,.fullscreen .video-player__volume::before{bottom:27px}.detailed .video-player__volume__handle,.fullscreen .video-player__volume__handle{bottom:23px}.audio-player{box-sizing:border-box;position:relative;background:#17191f;border-radius:4px;padding-bottom:44px;direction:ltr}.audio-player.editable{border-radius:0;height:100%}.audio-player__waveform{padding:15px 0;position:relative;overflow:hidden}.audio-player__waveform::before{content:\"\";display:block;position:absolute;border-top:1px solid #313543;width:100%;height:0;left:0;top:calc(50% + 1px)}.audio-player__progress-placeholder{background-color:rgba(78,121,223,.5)}.audio-player__wave-placeholder{background-color:#4a5266}.audio-player .video-player__controls{padding:0 15px;padding-top:10px;background:#17191f;border-top:1px solid #313543;border-radius:0 0 4px 4px}.video-player{overflow:hidden;position:relative;background:#000;max-width:100%;border-radius:4px;box-sizing:border-box;direction:ltr}.video-player.editable{border-radius:0;height:100% !important}.video-player:focus{outline:0}.detailed-status .video-player{width:100%;height:100%}.video-player.full-width{margin-left:-14px;margin-right:-14px;width:inherit;max-width:none;height:250px;border-radius:0px}.video-player video{max-width:100vw;max-height:80vh;z-index:1;position:relative}.video-player.fullscreen{width:100% !important;height:100% !important;margin:0}.video-player.fullscreen video{max-width:100% !important;max-height:100% !important;width:100% !important;height:100% !important;outline:0}.video-player.inline video{object-fit:contain;position:relative;top:50%;transform:translateY(-50%)}.video-player__controls{position:absolute;z-index:2;bottom:0;left:0;right:0;box-sizing:border-box;background:linear-gradient(0deg, rgba(0, 0, 0, 0.85) 0, rgba(0, 0, 0, 0.45) 60%, transparent);padding:0 15px;opacity:0;transition:opacity .1s ease}.video-player__controls.active{opacity:1}.video-player.inactive video,.video-player.inactive .video-player__controls{visibility:hidden}.video-player__spoiler{display:none;position:absolute;top:0;left:0;width:100%;height:100%;z-index:4;border:0;background:#000;color:#dde3ec;transition:none;pointer-events:none}.video-player__spoiler.active{display:block;pointer-events:auto}.video-player__spoiler.active:hover,.video-player__spoiler.active:active,.video-player__spoiler.active:focus{color:#f4f6f9}.video-player__spoiler__title{display:block;font-size:14px}.video-player__spoiler__subtitle{display:block;font-size:11px;font-weight:500}.video-player__buttons-bar{display:flex;justify-content:space-between;padding-bottom:10px}.video-player__buttons-bar .video-player__download__icon{color:inherit}.video-player__buttons-bar .video-player__download__icon .fa,.video-player__buttons-bar .video-player__download__icon:active .fa,.video-player__buttons-bar .video-player__download__icon:hover .fa,.video-player__buttons-bar .video-player__download__icon:focus .fa{color:inherit}.video-player__buttons{font-size:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.video-player__buttons.left button{padding-left:0}.video-player__buttons.right button{padding-right:0}.video-player__buttons button{background:transparent;padding:2px 10px;font-size:16px;border:0;color:rgba(255,255,255,.75)}.video-player__buttons button:active,.video-player__buttons button:hover,.video-player__buttons button:focus{color:#fff}.video-player__time-sep,.video-player__time-total,.video-player__time-current{font-size:14px;font-weight:500}.video-player__time-current{color:#fff;margin-left:60px}.video-player__time-sep{display:inline-block;margin:0 6px}.video-player__time-sep,.video-player__time-total{color:#fff}.video-player__volume{cursor:pointer;height:24px;display:inline}.video-player__volume::before{content:\"\";width:50px;background:rgba(255,255,255,.35);border-radius:4px;display:block;position:absolute;height:4px;left:70px;bottom:20px}.video-player__volume__current{display:block;position:absolute;height:4px;border-radius:4px;left:70px;bottom:20px;background:#4e79df}.video-player__volume__handle{position:absolute;z-index:3;border-radius:50%;width:12px;height:12px;bottom:16px;left:70px;transition:opacity .1s ease;background:#4e79df;box-shadow:1px 2px 6px rgba(0,0,0,.2);pointer-events:none}.video-player__link{padding:2px 10px}.video-player__link a{text-decoration:none;font-size:14px;font-weight:500;color:#fff}.video-player__link a:hover,.video-player__link a:active,.video-player__link a:focus{text-decoration:underline}.video-player__seek{cursor:pointer;height:24px;position:relative}.video-player__seek::before{content:\"\";width:100%;background:rgba(255,255,255,.35);border-radius:4px;display:block;position:absolute;height:4px;top:10px}.video-player__seek__progress,.video-player__seek__buffer{display:block;position:absolute;height:4px;border-radius:4px;top:10px;background:#4e79df}.video-player__seek__buffer{background:rgba(255,255,255,.2)}.video-player__seek__handle{position:absolute;z-index:3;opacity:0;border-radius:50%;width:12px;height:12px;top:6px;margin-left:-6px;transition:opacity .1s ease;background:#4e79df;box-shadow:1px 2px 6px rgba(0,0,0,.2);pointer-events:none}.video-player__seek__handle.active{opacity:1}.video-player__seek:hover .video-player__seek__handle{opacity:1}.video-player.detailed .video-player__buttons button,.video-player.fullscreen .video-player__buttons button{padding-top:10px;padding-bottom:10px}.sensitive-info{display:flex;flex-direction:row;align-items:center;position:absolute;top:4px;left:4px;z-index:100}.sensitive-marker{margin:0 3px;border-radius:2px;padding:2px 6px;color:rgba(255,255,255,.8);background:rgba(0,0,0,.5);font-size:12px;line-height:18px;text-transform:uppercase;opacity:.9;transition:opacity .1s ease}.media-gallery:hover .sensitive-marker{opacity:1}.list-editor{background:#282c37;flex-direction:column;border-radius:8px;box-shadow:2px 4px 15px rgba(0,0,0,.4);width:380px;overflow:hidden}@media screen and (max-width: 420px){.list-editor{width:90%}}.list-editor h4{padding:15px 0;background:#444b5d;font-weight:500;font-size:16px;text-align:center;border-radius:8px 8px 0 0}.list-editor .drawer__pager{height:50vh}.list-editor .drawer__inner{border-radius:0 0 8px 8px}.list-editor .drawer__inner.backdrop{width:calc(100% - 60px);box-shadow:2px 4px 15px rgba(0,0,0,.4);border-radius:0 0 0 8px}.list-editor__accounts{overflow-y:auto}.list-editor .account__display-name:hover strong{text-decoration:none}.list-editor .account__avatar{cursor:default}.list-editor .search{margin-bottom:0}.list-adder{background:#282c37;flex-direction:column;border-radius:8px;box-shadow:2px 4px 15px rgba(0,0,0,.4);width:380px;overflow:hidden}@media screen and (max-width: 420px){.list-adder{width:90%}}.list-adder__account{background:#444b5d}.list-adder__lists{background:#444b5d;height:50vh;border-radius:0 0 8px 8px;overflow-y:auto}.list-adder .list{padding:10px;border-bottom:1px solid #393f4f}.list-adder .list__wrapper{display:flex}.list-adder .list__display-name{flex:1 1 auto;overflow:hidden;text-decoration:none;font-size:16px;padding:10px}.emoji-mart{font-size:13px;display:inline-block;color:#000}.emoji-mart,.emoji-mart *{box-sizing:border-box;line-height:1.15}.emoji-mart .emoji-mart-emoji{padding:6px}.emoji-mart-bar{border:0 solid #c0cdd9}.emoji-mart-bar:first-child{border-bottom-width:1px;border-top-left-radius:5px;border-top-right-radius:5px;background:#d9e1e8}.emoji-mart-bar:last-child{border-top-width:1px;border-bottom-left-radius:5px;border-bottom-right-radius:5px;display:none}.emoji-mart-anchors{display:flex;justify-content:space-between;padding:0 6px;color:#1b1e25;line-height:0}.emoji-mart-anchor{position:relative;flex:1;text-align:center;padding:12px 4px;overflow:hidden;transition:color .1s ease-out;cursor:pointer}.emoji-mart-anchor:hover{color:#131419}.emoji-mart-anchor-selected{color:#2b90d9}.emoji-mart-anchor-selected:hover{color:#2485cb}.emoji-mart-anchor-selected .emoji-mart-anchor-bar{bottom:0}.emoji-mart-anchor-bar{position:absolute;bottom:-3px;left:0;width:100%;height:3px;background-color:#2558d0}.emoji-mart-anchors i{display:inline-block;width:100%;max-width:22px}.emoji-mart-anchors svg{fill:currentColor;max-height:18px}.emoji-mart-scroll{overflow-y:scroll;height:270px;max-height:35vh;padding:0 6px 6px;background:#fff;will-change:transform}.emoji-mart-scroll::-webkit-scrollbar-track:hover,.emoji-mart-scroll::-webkit-scrollbar-track:active{background-color:rgba(0,0,0,.3)}.emoji-mart-search{padding:10px;padding-right:45px;background:#fff}.emoji-mart-search input{font-size:14px;font-weight:400;padding:7px 9px;font-family:inherit;display:block;width:100%;background:rgba(217,225,232,.3);color:#000;border:1px solid #d9e1e8;border-radius:4px}.emoji-mart-search input::-moz-focus-inner{border:0}.emoji-mart-search input::-moz-focus-inner,.emoji-mart-search input:focus,.emoji-mart-search input:active{outline:0 !important}.emoji-mart-category .emoji-mart-emoji{cursor:pointer}.emoji-mart-category .emoji-mart-emoji span{z-index:1;position:relative;text-align:center}.emoji-mart-category .emoji-mart-emoji:hover::before{z-index:0;content:\"\";position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(217,225,232,.7);border-radius:100%}.emoji-mart-category-label{z-index:2;position:relative;position:-webkit-sticky;position:sticky;top:0}.emoji-mart-category-label span{display:block;width:100%;font-weight:500;padding:5px 6px;background:#fff}.emoji-mart-emoji{position:relative;display:inline-block;font-size:0}.emoji-mart-emoji span{width:22px;height:22px}.emoji-mart-no-results{font-size:14px;text-align:center;padding-top:70px;color:#364861}.emoji-mart-no-results .emoji-mart-category-label{display:none}.emoji-mart-no-results .emoji-mart-no-results-label{margin-top:.2em}.emoji-mart-no-results .emoji-mart-emoji:hover::before{content:none}.emoji-mart-preview{display:none}.glitch.local-settings{position:relative;display:flex;flex-direction:row;background:#d9e1e8;color:#000;border-radius:8px;height:80vh;width:80vw;max-width:740px;max-height:450px;overflow:hidden}.glitch.local-settings label,.glitch.local-settings legend{display:block;font-size:14px}.glitch.local-settings .boolean label,.glitch.local-settings .radio_buttons label{position:relative;padding-left:28px;padding-top:3px}.glitch.local-settings .boolean label input,.glitch.local-settings .radio_buttons label input{position:absolute;left:0;top:0}.glitch.local-settings span.hint{display:block;color:#1b1e25}.glitch.local-settings h1{font-size:18px;font-weight:500;line-height:24px;margin-bottom:20px}.glitch.local-settings h2{font-size:15px;font-weight:500;line-height:20px;margin-top:20px;margin-bottom:10px}.glitch.local-settings__navigation__item{display:block;padding:15px 20px;color:inherit;background:#f2f5f7;border-bottom:1px #d9e1e8 solid;cursor:pointer;text-decoration:none;outline:none;transition:background .3s}.glitch.local-settings__navigation__item .text-icon-button{color:inherit;transition:unset}.glitch.local-settings__navigation__item:hover{background:#d9e1e8}.glitch.local-settings__navigation__item.active{background:#2b5fd9;color:#fff}.glitch.local-settings__navigation__item.close,.glitch.local-settings__navigation__item.close:hover{background:#df405a;color:#fff}.glitch.local-settings__navigation{background:#f2f5f7;width:212px;font-size:15px;line-height:20px;overflow-y:auto}.glitch.local-settings__page{display:block;flex:auto;padding:15px 20px 15px 20px;width:360px;overflow-y:auto}.glitch.local-settings__page__item{margin-bottom:2px}.glitch.local-settings__page__item.string,.glitch.local-settings__page__item.radio_buttons{margin-top:10px;margin-bottom:10px}@media screen and (max-width: 630px){.glitch.local-settings__navigation{width:40px;flex-shrink:0}.glitch.local-settings__navigation__item{padding:10px}.glitch.local-settings__navigation__item span:last-of-type{display:none}}.error-boundary{color:#fff;font-size:15px;line-height:20px}.error-boundary h1{font-size:26px;line-height:36px;font-weight:400;margin-bottom:8px}.error-boundary a{color:#fff;text-decoration:underline}.error-boundary ul{list-style:disc;margin-left:0;padding-left:1em}.error-boundary textarea.web_app_crash-stacktrace{width:100%;resize:none;white-space:pre;font-family:monospace,monospace}.compose-panel{width:285px;margin-top:10px;display:flex;flex-direction:column;height:calc(100% - 10px);overflow-y:hidden}.compose-panel .search__input{line-height:18px;font-size:16px;padding:15px;padding-right:30px}.compose-panel .search__icon .fa{top:15px}.compose-panel .drawer--account{flex:0 1 48px}.compose-panel .flex-spacer{background:transparent}.compose-panel .composer{flex:1;overflow-y:hidden;display:flex;flex-direction:column;min-height:310px}.compose-panel .compose-form__autosuggest-wrapper{overflow-y:auto;background-color:#fff;border-radius:4px 4px 0 0;flex:0 1 auto}.compose-panel .autosuggest-textarea__textarea{overflow-y:hidden}.compose-panel .compose-form__upload-thumbnail{height:80px}.navigation-panel{margin-top:10px;margin-bottom:10px;height:calc(100% - 20px);overflow-y:auto;display:flex;flex-direction:column}.navigation-panel>a{flex:0 0 auto}.navigation-panel hr{flex:0 0 auto;border:0;background:transparent;border-top:1px solid #313543;margin:10px 0}.navigation-panel .flex-spacer{background:transparent}@media screen and (min-width: 600px){.tabs-bar__link span{display:inline}}.columns-area--mobile{flex-direction:column;width:100%;margin:0 auto}.columns-area--mobile .column,.columns-area--mobile .drawer{width:100%;height:100%;padding:0}.columns-area--mobile .directory__list{display:grid;grid-gap:10px;grid-template-columns:minmax(0, 50%) minmax(0, 50%)}@media screen and (max-width: 415px){.columns-area--mobile .directory__list{display:block}}.columns-area--mobile .directory__card{margin-bottom:0}.columns-area--mobile .filter-form{display:flex}.columns-area--mobile .autosuggest-textarea__textarea{font-size:16px}.columns-area--mobile .search__input{line-height:18px;font-size:16px;padding:15px;padding-right:30px}.columns-area--mobile .search__icon .fa{top:15px}.columns-area--mobile .scrollable{overflow:visible}@supports(display: grid){.columns-area--mobile .scrollable{contain:content}}@media screen and (min-width: 415px){.columns-area--mobile{padding:10px 0;padding-top:0}}@media screen and (min-width: 630px){.columns-area--mobile .detailed-status{padding:15px}.columns-area--mobile .detailed-status .media-gallery,.columns-area--mobile .detailed-status .video-player,.columns-area--mobile .detailed-status .audio-player{margin-top:15px}.columns-area--mobile .account__header__bar{padding:5px 10px}.columns-area--mobile .navigation-bar,.columns-area--mobile .compose-form{padding:15px}.columns-area--mobile .compose-form .compose-form__publish .compose-form__publish-button-wrapper{padding-top:15px}.columns-area--mobile .status{padding:15px;min-height:50px}.columns-area--mobile .status .media-gallery,.columns-area--mobile .status__action-bar,.columns-area--mobile .status .video-player,.columns-area--mobile .status .audio-player{margin-top:10px}.columns-area--mobile .account{padding:15px 10px}.columns-area--mobile .account__header__bio{margin:0 -10px}.columns-area--mobile .notification__message{padding-top:15px}.columns-area--mobile .notification .status{padding-top:8px}.columns-area--mobile .notification .account{padding-top:8px}}.floating-action-button{position:fixed;display:flex;justify-content:center;align-items:center;width:3.9375rem;height:3.9375rem;bottom:1.3125rem;right:1.3125rem;background:#2558d0;color:#fff;border-radius:50%;font-size:21px;line-height:21px;text-decoration:none;box-shadow:2px 3px 9px rgba(0,0,0,.4)}.floating-action-button:hover,.floating-action-button:focus,.floating-action-button:active{background:#4976de}@media screen and (min-width: 415px){.tabs-bar{width:100%}.react-swipeable-view-container .columns-area--mobile{height:calc(100% - 10px) !important}.getting-started__wrapper,.search{margin-bottom:10px}}@media screen and (max-width: 895px){.columns-area__panels__pane--compositional{display:none}}@media screen and (min-width: 895px){.floating-action-button,.tabs-bar__link.optional{display:none}.search-page .search{display:none}}@media screen and (max-width: 1190px){.columns-area__panels__pane--navigational{display:none}}@media screen and (min-width: 1190px){.tabs-bar{display:none}}.poll{margin-top:16px;font-size:14px}.poll ul,.e-content .poll ul{margin:0;list-style:none}.poll li{margin-bottom:10px;position:relative}.poll__chart{position:absolute;top:0;left:0;height:100%;display:inline-block;border-radius:4px;background:#6d89af}.poll__chart.leading{background:#2b5fd9}.poll__text{position:relative;display:flex;padding:6px 0;line-height:18px;cursor:default;overflow:hidden}.poll__text input[type=radio],.poll__text input[type=checkbox]{display:none}.poll__text .autossugest-input{flex:1 1 auto}.poll__text input[type=text]{display:block;box-sizing:border-box;width:100%;font-size:14px;color:#000;display:block;outline:0;font-family:inherit;background:#fff;border:1px solid #dbdbdb;border-radius:4px;padding:6px 10px}.poll__text input[type=text]:focus{border-color:#2b90d9}.poll__text.selectable{cursor:pointer}.poll__text.editable{display:flex;align-items:center;overflow:visible}.poll__input{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:50%;vertical-align:middle;margin-top:auto;margin-bottom:auto;flex:0 0 18px}.poll__input.checkbox{border-radius:4px}.poll__input.active{border-color:#79bd9a;background:#79bd9a}.poll__input:active,.poll__input:focus,.poll__input:hover{border-width:4px;background:none}.poll__input::-moz-focus-inner{outline:0 !important;border:0}.poll__input:focus,.poll__input:active{outline:0 !important}.poll__number{display:inline-block;width:52px;font-weight:700;padding:0 10px;padding-left:8px;text-align:right;margin-top:auto;margin-bottom:auto;flex:0 0 52px}.poll__vote__mark{float:left;line-height:18px}.poll__footer{padding-top:6px;padding-bottom:5px;color:#c2cede}.poll__link{display:inline;background:transparent;padding:0;margin:0;border:0;color:#c2cede;text-decoration:underline;font-size:inherit}.poll__link:hover{text-decoration:none}.poll__link:active,.poll__link:focus{background-color:rgba(194,206,222,.1)}.poll .button{height:36px;padding:0 16px;margin-right:10px;font-size:14px}.compose-form__poll-wrapper{border-top:1px solid #ebebeb}.compose-form__poll-wrapper ul{padding:10px}.compose-form__poll-wrapper .poll__footer{border-top:1px solid #ebebeb;padding:10px;display:flex;align-items:center}.compose-form__poll-wrapper .poll__footer button,.compose-form__poll-wrapper .poll__footer select{width:100%;flex:1 1 50%}.compose-form__poll-wrapper .poll__footer button:focus,.compose-form__poll-wrapper .poll__footer select:focus{border-color:#2b90d9}.compose-form__poll-wrapper .button.button-secondary{font-size:14px;font-weight:400;padding:6px 10px;height:auto;line-height:inherit;color:#8d9ac2;border-color:#8d9ac2;margin-right:5px}.compose-form__poll-wrapper li{display:flex;align-items:center}.compose-form__poll-wrapper li .poll__text{flex:0 0 auto;width:calc(100% - (23px + 6px));margin-right:6px}.compose-form__poll-wrapper select{appearance:none;box-sizing:border-box;font-size:14px;color:#000;display:inline-block;width:auto;outline:0;font-family:inherit;background:#fff url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center/auto 16px;border:1px solid #dbdbdb;border-radius:4px;padding:6px 10px;padding-right:30px}.compose-form__poll-wrapper .icon-button.disabled{color:#dbdbdb}.muted .poll{color:#c2cede}.muted .poll__chart{background:rgba(109,137,175,.2)}.muted .poll__chart.leading{background:rgba(43,95,217,.2)}.container{box-sizing:border-box;max-width:1235px;margin:0 auto;position:relative}@media screen and (max-width: 1255px){.container{width:100%;padding:0 10px}}.rich-formatting{font-family:sans-serif,sans-serif;font-size:14px;font-weight:400;line-height:1.7;word-wrap:break-word;color:#dde3ec}.rich-formatting a{color:#2b90d9;text-decoration:underline}.rich-formatting a:hover,.rich-formatting a:focus,.rich-formatting a:active{text-decoration:none}.rich-formatting p,.rich-formatting li{color:#dde3ec}.rich-formatting p{margin-top:0;margin-bottom:.85em}.rich-formatting p:last-child{margin-bottom:0}.rich-formatting strong{font-weight:700;color:#ecf0f4}.rich-formatting em{font-style:italic;color:#ecf0f4}.rich-formatting code{font-size:.85em;background:#17191f;border-radius:4px;padding:.2em .3em}.rich-formatting h1,.rich-formatting h2,.rich-formatting h3,.rich-formatting h4,.rich-formatting h5,.rich-formatting h6{font-family:sans-serif,sans-serif;margin-top:1.275em;margin-bottom:.85em;font-weight:500;color:#ecf0f4}.rich-formatting h1{font-size:2em}.rich-formatting h2{font-size:1.75em}.rich-formatting h3{font-size:1.5em}.rich-formatting h4{font-size:1.25em}.rich-formatting h5,.rich-formatting h6{font-size:1em}.rich-formatting ul{list-style:disc}.rich-formatting ol{list-style:decimal}.rich-formatting ul,.rich-formatting ol{margin:0;padding:0;padding-left:2em;margin-bottom:.85em}.rich-formatting ul[type=a],.rich-formatting ol[type=a]{list-style-type:lower-alpha}.rich-formatting ul[type=i],.rich-formatting ol[type=i]{list-style-type:lower-roman}.rich-formatting hr{width:100%;height:0;border:0;border-bottom:1px solid #313543;margin:1.7em 0}.rich-formatting hr.spacer{height:1px;border:0}.rich-formatting table{width:100%;border-collapse:collapse;break-inside:auto;margin-top:24px;margin-bottom:32px}.rich-formatting table thead tr,.rich-formatting table tbody tr{border-bottom:1px solid #313543;font-size:1em;line-height:1.625;font-weight:400;text-align:left;color:#dde3ec}.rich-formatting table thead tr{border-bottom-width:2px;line-height:1.5;font-weight:500;color:#c2cede}.rich-formatting table th,.rich-formatting table td{padding:8px;align-self:start;align-items:start;word-break:break-all}.rich-formatting table th.nowrap,.rich-formatting table td.nowrap{width:25%;position:relative}.rich-formatting table th.nowrap::before,.rich-formatting table td.nowrap::before{content:\" \";visibility:hidden}.rich-formatting table th.nowrap span,.rich-formatting table td.nowrap span{position:absolute;left:8px;right:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rich-formatting>:first-child{margin-top:0}.information-board{background:#1f232b;padding:20px 0}.information-board .container-alt{position:relative;padding-right:295px}.information-board__sections{display:flex;justify-content:space-between;flex-wrap:wrap}.information-board__section{flex:1 0 0;font-family:sans-serif,sans-serif;font-size:16px;line-height:28px;color:#fff;text-align:right;padding:10px 15px}.information-board__section span,.information-board__section strong{display:block}.information-board__section span:last-child{color:#ecf0f4}.information-board__section strong{font-family:sans-serif,sans-serif;font-weight:500;font-size:32px;line-height:48px}@media screen and (max-width: 700px){.information-board__section{text-align:center}}.information-board .panel{position:absolute;width:280px;box-sizing:border-box;background:#17191f;padding:20px;padding-top:10px;border-radius:4px 4px 0 0;right:0;bottom:-40px}.information-board .panel .panel-header{font-family:sans-serif,sans-serif;font-size:14px;line-height:24px;font-weight:500;color:#dde3ec;padding-bottom:5px;margin-bottom:15px;border-bottom:1px solid #313543;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.information-board .panel .panel-header a,.information-board .panel .panel-header span{font-weight:400;color:#bcc9da}.information-board .panel .panel-header a{text-decoration:none}.information-board .owner{text-align:center}.information-board .owner .avatar{width:80px;height:80px;width:80px;height:80px;background-size:80px 80px;margin:0 auto;margin-bottom:15px}.information-board .owner .avatar img{display:block;width:80px;height:80px;border-radius:48px;border-radius:8%;background-position:50%;background-clip:padding-box}.information-board .owner .name{font-size:14px}.information-board .owner .name a{display:block;color:#fff;text-decoration:none}.information-board .owner .name a:hover .display_name{text-decoration:underline}.information-board .owner .name .username{display:block;color:#dde3ec}.landing-page p,.landing-page li{font-family:sans-serif,sans-serif;font-size:16px;font-weight:400;font-size:16px;line-height:30px;margin-bottom:12px;color:#dde3ec}.landing-page p a,.landing-page li a{color:#2b90d9;text-decoration:underline}.landing-page em{display:inline;margin:0;padding:0;font-weight:700;background:transparent;font-family:inherit;font-size:inherit;line-height:inherit;color:#fefefe}.landing-page h1{font-family:sans-serif,sans-serif;font-size:26px;line-height:30px;font-weight:500;margin-bottom:20px;color:#ecf0f4}.landing-page h1 small{font-family:sans-serif,sans-serif;display:block;font-size:18px;font-weight:400;color:#fefefe}.landing-page h2{font-family:sans-serif,sans-serif;font-size:22px;line-height:26px;font-weight:500;margin-bottom:20px;color:#ecf0f4}.landing-page h3{font-family:sans-serif,sans-serif;font-size:18px;line-height:24px;font-weight:500;margin-bottom:20px;color:#ecf0f4}.landing-page h4{font-family:sans-serif,sans-serif;font-size:16px;line-height:24px;font-weight:500;margin-bottom:20px;color:#ecf0f4}.landing-page h5{font-family:sans-serif,sans-serif;font-size:14px;line-height:24px;font-weight:500;margin-bottom:20px;color:#ecf0f4}.landing-page h6{font-family:sans-serif,sans-serif;font-size:12px;line-height:24px;font-weight:500;margin-bottom:20px;color:#ecf0f4}.landing-page ul,.landing-page ol{margin-left:20px}.landing-page ul[type=a],.landing-page ol[type=a]{list-style-type:lower-alpha}.landing-page ul[type=i],.landing-page ol[type=i]{list-style-type:lower-roman}.landing-page ul{list-style:disc}.landing-page ol{list-style:decimal}.landing-page li>ol,.landing-page li>ul{margin-top:6px}.landing-page hr{width:100%;height:0;border:0;border-bottom:1px solid rgba(96,105,132,.6);margin:20px 0}.landing-page hr.spacer{height:1px;border:0}.landing-page__information,.landing-page__forms{padding:20px}.landing-page__call-to-action{background:#282c37;border-radius:4px;padding:25px 40px;overflow:hidden;box-sizing:border-box}.landing-page__call-to-action .row{width:100%;display:flex;flex-direction:row-reverse;flex-wrap:nowrap;justify-content:space-between;align-items:center}.landing-page__call-to-action .row__information-board{display:flex;justify-content:flex-end;align-items:flex-end}.landing-page__call-to-action .row__information-board .information-board__section{flex:1 0 auto;padding:0 10px}@media screen and (max-width: 415px){.landing-page__call-to-action .row__information-board{width:100%;justify-content:space-between}}.landing-page__call-to-action .row__mascot{flex:1;margin:10px -50px 0 0}@media screen and (max-width: 415px){.landing-page__call-to-action .row__mascot{display:none}}.landing-page__logo{margin-right:20px}.landing-page__logo img{height:50px;width:auto;mix-blend-mode:lighten}.landing-page__information{padding:45px 40px;margin-bottom:10px}.landing-page__information:last-child{margin-bottom:0}.landing-page__information strong{font-weight:500;color:#fefefe}.landing-page__information .account{border-bottom:0;padding:0}.landing-page__information .account__display-name{align-items:center;display:flex;margin-right:5px}.landing-page__information .account div.account__display-name:hover .display-name strong{text-decoration:none}.landing-page__information .account div.account__display-name .account__avatar{cursor:default}.landing-page__information .account__avatar-wrapper{margin-left:0;flex:0 0 auto}.landing-page__information .account__avatar{width:44px;height:44px;background-size:44px 44px;width:44px;height:44px;background-size:44px 44px}.landing-page__information .account .display-name{font-size:15px}.landing-page__information .account .display-name__account{font-size:14px}@media screen and (max-width: 960px){.landing-page__information .contact{margin-top:30px}}@media screen and (max-width: 700px){.landing-page__information{padding:25px 20px}}.landing-page__information,.landing-page__forms,.landing-page #mastodon-timeline{box-sizing:border-box;background:#282c37;border-radius:4px;box-shadow:0 0 6px rgba(0,0,0,.1)}.landing-page__mascot{height:104px;position:relative;left:-40px;bottom:25px}.landing-page__mascot img{height:190px;width:auto}.landing-page__short-description .row{display:flex;flex-wrap:wrap;align-items:center;margin-bottom:40px}@media screen and (max-width: 700px){.landing-page__short-description .row{margin-bottom:20px}}.landing-page__short-description p a{color:#ecf0f4}.landing-page__short-description h1{font-weight:500;color:#fff;margin-bottom:0}.landing-page__short-description h1 small{color:#dde3ec}.landing-page__short-description h1 small span{color:#ecf0f4}.landing-page__short-description p:last-child{margin-bottom:0}.landing-page__hero{margin-bottom:10px}.landing-page__hero img{display:block;margin:0;max-width:100%;height:auto;border-radius:4px}@media screen and (max-width: 840px){.landing-page .information-board .container-alt{padding-right:20px}.landing-page .information-board .panel{position:static;margin-top:20px;width:100%;border-radius:4px}.landing-page .information-board .panel .panel-header{text-align:center}}@media screen and (max-width: 675px){.landing-page .header-wrapper{padding-top:0}.landing-page .header-wrapper.compact{padding-bottom:0}.landing-page .header-wrapper.compact .hero .heading{text-align:initial}.landing-page .header .container-alt,.landing-page .features .container-alt{display:block}}.landing-page .cta{margin:20px}.landing{margin-bottom:100px}@media screen and (max-width: 738px){.landing{margin-bottom:0}}.landing__brand{display:flex;justify-content:center;align-items:center;padding:50px}.landing__brand svg{fill:#fff;height:52px}@media screen and (max-width: 415px){.landing__brand{padding:0;margin-bottom:30px}}.landing .directory{margin-top:30px;background:transparent;box-shadow:none;border-radius:0}.landing .hero-widget{margin-top:30px;margin-bottom:0}.landing .hero-widget h4{padding:10px;text-transform:uppercase;font-weight:700;font-size:13px;color:#dde3ec}.landing .hero-widget__text{border-radius:0;padding-bottom:0}.landing .hero-widget__footer{background:#282c37;padding:10px;border-radius:0 0 4px 4px;display:flex}.landing .hero-widget__footer__column{flex:1 1 50%}.landing .hero-widget .account{padding:10px 0;border-bottom:0}.landing .hero-widget .account .account__display-name{display:flex;align-items:center}.landing .hero-widget .account .account__avatar{width:44px;height:44px;background-size:44px 44px}.landing .hero-widget__counter{padding:10px}.landing .hero-widget__counter strong{font-family:sans-serif,sans-serif;font-size:15px;font-weight:700;display:block}.landing .hero-widget__counter span{font-size:14px;color:#dde3ec}.landing .simple_form .user_agreement .label_input>label{font-weight:400;color:#dde3ec}.landing .simple_form p.lead{color:#dde3ec;font-size:15px;line-height:20px;font-weight:400;margin-bottom:25px}.landing__grid{max-width:960px;margin:0 auto;display:grid;grid-template-columns:minmax(0, 50%) minmax(0, 50%);grid-gap:30px}@media screen and (max-width: 738px){.landing__grid{grid-template-columns:minmax(0, 100%);grid-gap:10px}.landing__grid__column-login{grid-row:1;display:flex;flex-direction:column}.landing__grid__column-login .box-widget{order:2;flex:0 0 auto}.landing__grid__column-login .hero-widget{margin-top:0;margin-bottom:10px;order:1;flex:0 0 auto}.landing__grid__column-registration{grid-row:2}.landing__grid .directory{margin-top:10px}}@media screen and (max-width: 415px){.landing__grid{grid-gap:0}.landing__grid .hero-widget{display:block;margin-bottom:0;box-shadow:none}.landing__grid .hero-widget__img,.landing__grid .hero-widget__img img,.landing__grid .hero-widget__footer{border-radius:0}.landing__grid .hero-widget,.landing__grid .box-widget,.landing__grid .directory__tag{border-bottom:1px solid #393f4f}.landing__grid .directory{margin-top:0}.landing__grid .directory__tag{margin-bottom:0}.landing__grid .directory__tag>a,.landing__grid .directory__tag>div{border-radius:0;box-shadow:none}.landing__grid .directory__tag:last-child{border-bottom:0}}.brand{position:relative;text-decoration:none}.brand__tagline{display:block;position:absolute;bottom:-10px;left:50px;width:300px;color:#9baec8;text-decoration:none;font-size:14px}@media screen and (max-width: 415px){.brand__tagline{position:static;width:auto;margin-top:20px;color:#c2cede}}.table{width:100%;max-width:100%;border-spacing:0;border-collapse:collapse}.table th,.table td{padding:8px;line-height:18px;vertical-align:top;border-top:1px solid #282c37;text-align:left;background:#1f232b}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #282c37;border-top:0;font-weight:500}.table>tbody>tr>th{font-weight:500}.table>tbody>tr:nth-child(odd)>td,.table>tbody>tr:nth-child(odd)>th{background:#282c37}.table a{color:#2b90d9;text-decoration:underline}.table a:hover{text-decoration:none}.table strong{font-weight:500}.table strong:lang(ja){font-weight:700}.table strong:lang(ko){font-weight:700}.table strong:lang(zh-CN){font-weight:700}.table strong:lang(zh-HK){font-weight:700}.table strong:lang(zh-TW){font-weight:700}.table.inline-table>tbody>tr:nth-child(odd)>td,.table.inline-table>tbody>tr:nth-child(odd)>th{background:transparent}.table.inline-table>tbody>tr:first-child>td,.table.inline-table>tbody>tr:first-child>th{border-top:0}.table.batch-table>thead>tr>th{background:#282c37;border-top:1px solid #17191f;border-bottom:1px solid #17191f}.table.batch-table>thead>tr>th:first-child{border-radius:4px 0 0;border-left:1px solid #17191f}.table.batch-table>thead>tr>th:last-child{border-radius:0 4px 0 0;border-right:1px solid #17191f}.table--invites tbody td{vertical-align:middle}.table-wrapper{overflow:auto;margin-bottom:20px}samp{font-family:monospace,monospace}button.table-action-link{background:transparent;border:0;font:inherit}button.table-action-link,a.table-action-link{text-decoration:none;display:inline-block;margin-right:5px;padding:0 10px;color:#dde3ec;font-weight:500}button.table-action-link:hover,a.table-action-link:hover{color:#fff}button.table-action-link i.fa,a.table-action-link i.fa{font-weight:400;margin-right:5px}button.table-action-link:first-child,a.table-action-link:first-child{padding-left:0}.batch-table__toolbar,.batch-table__row{display:flex}.batch-table__toolbar__select,.batch-table__row__select{box-sizing:border-box;padding:8px 16px;cursor:pointer;min-height:100%}.batch-table__toolbar__select input,.batch-table__row__select input{margin-top:8px}.batch-table__toolbar__select--aligned,.batch-table__row__select--aligned{display:flex;align-items:center}.batch-table__toolbar__select--aligned input,.batch-table__row__select--aligned input{margin-top:0}.batch-table__toolbar__actions,.batch-table__toolbar__content,.batch-table__row__actions,.batch-table__row__content{padding:8px 0;padding-right:16px;flex:1 1 auto}.batch-table__toolbar{border:1px solid #17191f;background:#282c37;border-radius:4px 0 0;height:47px;align-items:center}.batch-table__toolbar__actions{text-align:right;padding-right:11px}.batch-table__form{padding:16px;border:1px solid #17191f;border-top:0;background:#282c37}.batch-table__form .fields-row{padding-top:0;margin-bottom:0}.batch-table__row{border:1px solid #17191f;border-top:0;background:#1f232b}@media screen and (max-width: 415px){.optional .batch-table__row:first-child{border-top:1px solid #17191f}}.batch-table__row:hover{background:#242731}.batch-table__row:nth-child(even){background:#282c37}.batch-table__row:nth-child(even):hover{background:#2c313d}.batch-table__row__content{padding-top:12px;padding-bottom:16px}.batch-table__row__content--unpadded{padding:0}.batch-table__row__content--with-image{display:flex;align-items:center}.batch-table__row__content__image{flex:0 0 auto;display:flex;justify-content:center;align-items:center;margin-right:10px}.batch-table__row__content__image .emojione{width:32px;height:32px}.batch-table__row__content__text{flex:1 1 auto}.batch-table__row__content__extra{flex:0 0 auto;text-align:right;color:#dde3ec;font-weight:500}.batch-table__row .directory__tag{margin:0;width:100%}.batch-table__row .directory__tag a{background:transparent;border-radius:0}@media screen and (max-width: 415px){.batch-table.optional .batch-table__toolbar,.batch-table.optional .batch-table__row__select{display:none}}.batch-table .status__content{padding-top:0}.batch-table .status__content strong{font-weight:700}.batch-table .nothing-here{border:1px solid #17191f;border-top:0;box-shadow:none}@media screen and (max-width: 415px){.batch-table .nothing-here{border-top:1px solid #17191f}}@media screen and (max-width: 870px){.batch-table .accounts-table tbody td.optional{display:none}}.admin-wrapper{display:flex;justify-content:center;width:100%;min-height:100vh}.admin-wrapper .sidebar-wrapper{min-height:100vh;overflow:hidden;pointer-events:none;flex:1 1 auto}.admin-wrapper .sidebar-wrapper__inner{display:flex;justify-content:flex-end;background:#282c37;height:100%}.admin-wrapper .sidebar{width:240px;padding:0;pointer-events:auto}.admin-wrapper .sidebar__toggle{display:none;background:#393f4f;height:48px}.admin-wrapper .sidebar__toggle__logo{flex:1 1 auto}.admin-wrapper .sidebar__toggle__logo a{display:inline-block;padding:15px}.admin-wrapper .sidebar__toggle__logo svg{fill:#fff;height:20px;position:relative;bottom:-2px}.admin-wrapper .sidebar__toggle__icon{display:block;color:#dde3ec;text-decoration:none;flex:0 0 auto;font-size:20px;padding:15px}.admin-wrapper .sidebar__toggle a:hover,.admin-wrapper .sidebar__toggle a:focus,.admin-wrapper .sidebar__toggle a:active{background:#42485a}.admin-wrapper .sidebar .logo{display:block;margin:40px auto;width:100px;height:100px}@media screen and (max-width: 600px){.admin-wrapper .sidebar>a:first-child{display:none}}.admin-wrapper .sidebar ul{list-style:none;border-radius:4px 0 0 4px;overflow:hidden;margin-bottom:20px}@media screen and (max-width: 600px){.admin-wrapper .sidebar ul{margin-bottom:0}}.admin-wrapper .sidebar ul a{display:block;padding:15px;color:#dde3ec;text-decoration:none;transition:all 200ms linear;transition-property:color,background-color;border-radius:4px 0 0 4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.admin-wrapper .sidebar ul a i.fa{margin-right:5px}.admin-wrapper .sidebar ul a:hover{color:#fff;background-color:#1d2028;transition:all 100ms linear;transition-property:color,background-color}.admin-wrapper .sidebar ul a.selected{background:#242731;border-radius:4px 0 0}.admin-wrapper .sidebar ul ul{background:#1f232b;border-radius:0 0 0 4px;margin:0}.admin-wrapper .sidebar ul ul a{border:0;padding:15px 35px}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a{color:#fff;background-color:#2b5fd9;border-bottom:0;border-radius:0}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a:hover{background-color:#416fdd}.admin-wrapper .sidebar>ul>.simple-navigation-active-leaf a{border-radius:4px 0 0 4px}.admin-wrapper .content-wrapper{box-sizing:border-box;width:100%;max-width:840px;flex:1 1 auto}@media screen and (max-width: 1080px){.admin-wrapper .sidebar-wrapper--empty{display:none}.admin-wrapper .sidebar-wrapper{width:240px;flex:0 0 auto}}@media screen and (max-width: 600px){.admin-wrapper .sidebar-wrapper{width:100%}}.admin-wrapper .content{padding:20px 15px;padding-top:60px;padding-left:25px}@media screen and (max-width: 600px){.admin-wrapper .content{max-width:none;padding:15px;padding-top:30px}}.admin-wrapper .content-heading{display:flex;padding-bottom:40px;border-bottom:1px solid #393f4f;margin:-15px -15px 40px 0;flex-wrap:wrap;align-items:center;justify-content:space-between}.admin-wrapper .content-heading>*{margin-top:15px;margin-right:15px}.admin-wrapper .content-heading-actions{display:inline-flex}.admin-wrapper .content-heading-actions>:not(:first-child){margin-left:5px}@media screen and (max-width: 600px){.admin-wrapper .content-heading{border-bottom:0;padding-bottom:0}}.admin-wrapper .content h2{color:#ecf0f4;font-size:24px;line-height:28px;font-weight:400}@media screen and (max-width: 600px){.admin-wrapper .content h2{font-weight:700}}.admin-wrapper .content h3{color:#ecf0f4;font-size:20px;line-height:28px;font-weight:400;margin-bottom:30px}.admin-wrapper .content h4{text-transform:uppercase;font-size:13px;font-weight:700;color:#dde3ec;padding-bottom:8px;margin-bottom:8px;border-bottom:1px solid #393f4f}.admin-wrapper .content h6{font-size:16px;color:#ecf0f4;line-height:28px;font-weight:500}.admin-wrapper .content .fields-group h6{color:#fff;font-weight:500}.admin-wrapper .content .directory__tag>a,.admin-wrapper .content .directory__tag>div{box-shadow:none}.admin-wrapper .content .directory__tag .table-action-link .fa{color:inherit}.admin-wrapper .content .directory__tag h4{font-size:18px;font-weight:700;color:#fff;text-transform:none;padding-bottom:0;margin-bottom:0;border-bottom:none}.admin-wrapper .content>p{font-size:14px;line-height:21px;color:#ecf0f4;margin-bottom:20px}.admin-wrapper .content>p strong{color:#fff;font-weight:500}.admin-wrapper .content>p strong:lang(ja){font-weight:700}.admin-wrapper .content>p strong:lang(ko){font-weight:700}.admin-wrapper .content>p strong:lang(zh-CN){font-weight:700}.admin-wrapper .content>p strong:lang(zh-HK){font-weight:700}.admin-wrapper .content>p strong:lang(zh-TW){font-weight:700}.admin-wrapper .content hr{width:100%;height:0;border:0;border-bottom:1px solid rgba(96,105,132,.6);margin:20px 0}.admin-wrapper .content hr.spacer{height:1px;border:0}@media screen and (max-width: 600px){.admin-wrapper{display:block}.admin-wrapper .sidebar-wrapper{min-height:0}.admin-wrapper .sidebar{width:100%;padding:0;height:auto}.admin-wrapper .sidebar__toggle{display:flex}.admin-wrapper .sidebar>ul{display:none}.admin-wrapper .sidebar ul a,.admin-wrapper .sidebar ul ul a{border-radius:0;border-bottom:1px solid #313543;transition:none}.admin-wrapper .sidebar ul a:hover,.admin-wrapper .sidebar ul ul a:hover{transition:none}.admin-wrapper .sidebar ul ul{border-radius:0}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a{border-bottom-color:#2b5fd9}}hr.spacer{width:100%;border:0;margin:20px 0;height:1px}body .muted-hint,.admin-wrapper .content .muted-hint{color:#dde3ec}body .muted-hint a,.admin-wrapper .content .muted-hint a{color:#2b90d9}body .positive-hint,.admin-wrapper .content .positive-hint{color:#79bd9a;font-weight:500}body .negative-hint,.admin-wrapper .content .negative-hint{color:#df405a;font-weight:500}body .neutral-hint,.admin-wrapper .content .neutral-hint{color:#c2cede;font-weight:500}body .warning-hint,.admin-wrapper .content .warning-hint{color:#ca8f04;font-weight:500}.filters{display:flex;flex-wrap:wrap}.filters .filter-subset{flex:0 0 auto;margin:0 40px 20px 0}.filters .filter-subset:last-child{margin-bottom:30px}.filters .filter-subset ul{margin-top:5px;list-style:none}.filters .filter-subset ul li{display:inline-block;margin-right:5px}.filters .filter-subset strong{font-weight:500;text-transform:uppercase;font-size:12px}.filters .filter-subset strong:lang(ja){font-weight:700}.filters .filter-subset strong:lang(ko){font-weight:700}.filters .filter-subset strong:lang(zh-CN){font-weight:700}.filters .filter-subset strong:lang(zh-HK){font-weight:700}.filters .filter-subset strong:lang(zh-TW){font-weight:700}.filters .filter-subset a{display:inline-block;color:#dde3ec;text-decoration:none;text-transform:uppercase;font-size:12px;font-weight:500;border-bottom:2px solid #282c37}.filters .filter-subset a:hover{color:#fff;border-bottom:2px solid #333846}.filters .filter-subset a.selected{color:#2b90d9;border-bottom:2px solid #2b5fd9}.flavour-screen{display:block;margin:10px auto;max-width:100%}.flavour-description{display:block;font-size:16px;margin:10px 0}.flavour-description>p{margin:10px 0}.report-accounts{display:flex;flex-wrap:wrap;margin-bottom:20px}.report-accounts__item{display:flex;flex:250px;flex-direction:column;margin:0 5px}.report-accounts__item>strong{display:block;margin:0 0 10px -5px;font-weight:500;font-size:14px;line-height:18px;color:#ecf0f4}.report-accounts__item>strong:lang(ja){font-weight:700}.report-accounts__item>strong:lang(ko){font-weight:700}.report-accounts__item>strong:lang(zh-CN){font-weight:700}.report-accounts__item>strong:lang(zh-HK){font-weight:700}.report-accounts__item>strong:lang(zh-TW){font-weight:700}.report-accounts__item .account-card{flex:1 1 auto}.report-status,.account-status{display:flex;margin-bottom:10px}.report-status .activity-stream,.account-status .activity-stream{flex:2 0 0;margin-right:20px;max-width:calc(100% - 60px)}.report-status .activity-stream .entry,.account-status .activity-stream .entry{border-radius:4px}.report-status__actions,.account-status__actions{flex:0 0 auto;display:flex;flex-direction:column}.report-status__actions .icon-button,.account-status__actions .icon-button{font-size:24px;width:24px;text-align:center;margin-bottom:10px}.simple_form.new_report_note,.simple_form.new_account_moderation_note{max-width:100%}.batch-form-box{display:flex;flex-wrap:wrap;margin-bottom:5px}.batch-form-box #form_status_batch_action{margin:0 5px 5px 0;font-size:14px}.batch-form-box input.button{margin:0 5px 5px 0}.batch-form-box .media-spoiler-toggle-buttons{margin-left:auto}.batch-form-box .media-spoiler-toggle-buttons .button{overflow:visible;margin:0 0 5px 5px;float:right}.back-link{margin-bottom:10px;font-size:14px}.back-link a{color:#2b90d9;text-decoration:none}.back-link a:hover{text-decoration:underline}.spacer{flex:1 1 auto}.log-entry{margin-bottom:20px;line-height:20px}.log-entry__header{display:flex;justify-content:flex-start;align-items:center;padding:10px;background:#282c37;color:#dde3ec;border-radius:4px 4px 0 0;font-size:14px;position:relative}.log-entry__avatar{margin-right:10px}.log-entry__avatar .avatar{display:block;margin:0;border-radius:50%;width:40px;height:40px}.log-entry__content{max-width:calc(100% - 90px)}.log-entry__title{word-wrap:break-word}.log-entry__timestamp{color:#c2cede}.log-entry__extras{background:#353a49;border-radius:0 0 4px 4px;padding:10px;color:#dde3ec;font-family:monospace,monospace;font-size:12px;word-wrap:break-word;min-height:20px}.log-entry__icon{font-size:28px;margin-right:10px;color:#c2cede}.log-entry__icon__overlay{position:absolute;top:10px;right:10px;width:10px;height:10px;border-radius:50%}.log-entry__icon__overlay.positive{background:#79bd9a}.log-entry__icon__overlay.negative{background:#e87487}.log-entry__icon__overlay.neutral{background:#2b5fd9}.log-entry a,.log-entry .username,.log-entry .target{color:#ecf0f4;text-decoration:none;font-weight:500}.log-entry .diff-old{color:#e87487}.log-entry .diff-neutral{color:#ecf0f4}.log-entry .diff-new{color:#79bd9a}a.name-tag,.name-tag,a.inline-name-tag,.inline-name-tag{text-decoration:none;color:#ecf0f4}a.name-tag .username,.name-tag .username,a.inline-name-tag .username,.inline-name-tag .username{font-weight:500}a.name-tag.suspended .username,.name-tag.suspended .username,a.inline-name-tag.suspended .username,.inline-name-tag.suspended .username{text-decoration:line-through;color:#e87487}a.name-tag.suspended .avatar,.name-tag.suspended .avatar,a.inline-name-tag.suspended .avatar,.inline-name-tag.suspended .avatar{filter:grayscale(100%);opacity:.8}a.name-tag,.name-tag{display:flex;align-items:center}a.name-tag .avatar,.name-tag .avatar{display:block;margin:0;margin-right:5px;border-radius:50%}a.name-tag.suspended .avatar,.name-tag.suspended .avatar{filter:grayscale(100%);opacity:.8}.speech-bubble{margin-bottom:20px;border-left:4px solid #2b5fd9}.speech-bubble.positive{border-left-color:#79bd9a}.speech-bubble.negative{border-left-color:#e87487}.speech-bubble.warning{border-left-color:#ca8f04}.speech-bubble__bubble{padding:16px;padding-left:14px;font-size:15px;line-height:20px;border-radius:4px 4px 4px 0;position:relative;font-weight:500}.speech-bubble__bubble a{color:#dde3ec}.speech-bubble__owner{padding:8px;padding-left:12px}.speech-bubble time{color:#c2cede}.report-card{background:#282c37;border-radius:4px;margin-bottom:20px}.report-card__profile{display:flex;justify-content:space-between;align-items:center;padding:15px}.report-card__profile .account{padding:0;border:0}.report-card__profile .account__avatar-wrapper{margin-left:0}.report-card__profile__stats{flex:0 0 auto;font-weight:500;color:#dde3ec;text-transform:uppercase;text-align:right}.report-card__profile__stats a{color:inherit;text-decoration:none}.report-card__profile__stats a:focus,.report-card__profile__stats a:hover,.report-card__profile__stats a:active{color:#f7f9fb}.report-card__profile__stats .red{color:#df405a}.report-card__summary__item{display:flex;justify-content:flex-start;border-top:1px solid #1f232b}.report-card__summary__item:hover{background:#2c313d}.report-card__summary__item__reported-by,.report-card__summary__item__assigned{padding:15px;flex:0 0 auto;box-sizing:border-box;width:150px;color:#dde3ec}.report-card__summary__item__reported-by,.report-card__summary__item__reported-by .username,.report-card__summary__item__assigned,.report-card__summary__item__assigned .username{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.report-card__summary__item__content{flex:1 1 auto;max-width:calc(100% - 300px)}.report-card__summary__item__content__icon{color:#c2cede;margin-right:4px;font-weight:500}.report-card__summary__item__content a{display:block;box-sizing:border-box;width:100%;padding:15px;text-decoration:none;color:#dde3ec}.one-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ellipsized-ip{display:inline-block;max-width:120px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.admin-account-bio{display:flex;flex-wrap:wrap;margin:0 -5px;margin-top:20px}.admin-account-bio>div{box-sizing:border-box;padding:0 5px;margin-bottom:10px;flex:1 0 50%}.admin-account-bio .account__header__fields,.admin-account-bio .account__header__content{background:#393f4f;border-radius:4px;height:100%}.admin-account-bio .account__header__fields{margin:0;border:0}.admin-account-bio .account__header__fields a{color:#4e79df}.admin-account-bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.admin-account-bio .account__header__fields .verified a{color:#79bd9a}.admin-account-bio .account__header__content{box-sizing:border-box;padding:20px;color:#fff}.center-text{text-align:center}.emojione[title=\":wavy_dash:\"],.emojione[title=\":waving_black_flag:\"],.emojione[title=\":water_buffalo:\"],.emojione[title=\":video_game:\"],.emojione[title=\":video_camera:\"],.emojione[title=\":vhs:\"],.emojione[title=\":turkey:\"],.emojione[title=\":tophat:\"],.emojione[title=\":top:\"],.emojione[title=\":tm:\"],.emojione[title=\":telephone_receiver:\"],.emojione[title=\":spider:\"],.emojione[title=\":speaking_head_in_silhouette:\"],.emojione[title=\":spades:\"],.emojione[title=\":soon:\"],.emojione[title=\":registered:\"],.emojione[title=\":on:\"],.emojione[title=\":musical_score:\"],.emojione[title=\":movie_camera:\"],.emojione[title=\":mortar_board:\"],.emojione[title=\":microphone:\"],.emojione[title=\":male-guard:\"],.emojione[title=\":lower_left_fountain_pen:\"],.emojione[title=\":lower_left_ballpoint_pen:\"],.emojione[title=\":kaaba:\"],.emojione[title=\":joystick:\"],.emojione[title=\":hole:\"],.emojione[title=\":hocho:\"],.emojione[title=\":heavy_plus_sign:\"],.emojione[title=\":heavy_multiplication_x:\"],.emojione[title=\":heavy_minus_sign:\"],.emojione[title=\":heavy_dollar_sign:\"],.emojione[title=\":heavy_division_sign:\"],.emojione[title=\":heavy_check_mark:\"],.emojione[title=\":guardsman:\"],.emojione[title=\":gorilla:\"],.emojione[title=\":fried_egg:\"],.emojione[title=\":film_projector:\"],.emojione[title=\":female-guard:\"],.emojione[title=\":end:\"],.emojione[title=\":electric_plug:\"],.emojione[title=\":eight_pointed_black_star:\"],.emojione[title=\":dark_sunglasses:\"],.emojione[title=\":currency_exchange:\"],.emojione[title=\":curly_loop:\"],.emojione[title=\":copyright:\"],.emojione[title=\":clubs:\"],.emojione[title=\":camera_with_flash:\"],.emojione[title=\":camera:\"],.emojione[title=\":busts_in_silhouette:\"],.emojione[title=\":bust_in_silhouette:\"],.emojione[title=\":bowling:\"],.emojione[title=\":bomb:\"],.emojione[title=\":black_small_square:\"],.emojione[title=\":black_nib:\"],.emojione[title=\":black_medium_square:\"],.emojione[title=\":black_medium_small_square:\"],.emojione[title=\":black_large_square:\"],.emojione[title=\":black_heart:\"],.emojione[title=\":black_circle:\"],.emojione[title=\":back:\"],.emojione[title=\":ant:\"],.emojione[title=\":8ball:\"]{filter:drop-shadow(1px 1px 0 #ffffff) drop-shadow(-1px 1px 0 #ffffff) drop-shadow(1px -1px 0 #ffffff) drop-shadow(-1px -1px 0 #ffffff)}.hicolor-privacy-icons .status__visibility-icon.fa-globe,.hicolor-privacy-icons .composer--options--dropdown--content--item .fa-globe{color:#1976d2}.hicolor-privacy-icons .status__visibility-icon.fa-unlock,.hicolor-privacy-icons .composer--options--dropdown--content--item .fa-unlock{color:#388e3c}.hicolor-privacy-icons .status__visibility-icon.fa-lock,.hicolor-privacy-icons .composer--options--dropdown--content--item .fa-lock{color:#ffa000}.hicolor-privacy-icons .status__visibility-icon.fa-envelope,.hicolor-privacy-icons .composer--options--dropdown--content--item .fa-envelope{color:#d32f2f}body.rtl{direction:rtl}body.rtl .column-header>button{text-align:right;padding-left:0;padding-right:15px}body.rtl .radio-button__input{margin-right:0;margin-left:10px}body.rtl .directory__card__bar .display-name{margin-left:0;margin-right:15px}body.rtl .display-name{text-align:right}body.rtl .notification__message{margin-left:0;margin-right:68px}body.rtl .drawer__inner__mastodon>img{transform:scaleX(-1)}body.rtl .notification__favourite-icon-wrapper{left:auto;right:-26px}body.rtl .landing-page__logo{margin-right:0;margin-left:20px}body.rtl .landing-page .features-list .features-list__row .visual{margin-left:0;margin-right:15px}body.rtl .column-link__icon,body.rtl .column-header__icon{margin-right:0;margin-left:5px}body.rtl .compose-form .compose-form__buttons-wrapper .character-counter__wrapper{margin-right:0;margin-left:4px}body.rtl .composer--publisher{text-align:left}body.rtl .boost-modal__status-time,body.rtl .favourite-modal__status-time{float:left}body.rtl .navigation-bar__profile{margin-left:0;margin-right:8px}body.rtl .search__input{padding-right:10px;padding-left:30px}body.rtl .search__icon .fa{right:auto;left:10px}body.rtl .columns-area{direction:rtl}body.rtl .column-header__buttons{left:0;right:auto;margin-left:0;margin-right:-15px}body.rtl .column-inline-form .icon-button{margin-left:0;margin-right:5px}body.rtl .column-header__links .text-btn{margin-left:10px;margin-right:0}body.rtl .account__avatar-wrapper{float:right}body.rtl .column-header__back-button{padding-left:5px;padding-right:0}body.rtl .column-header__setting-arrows{float:left}body.rtl .setting-toggle__label{margin-left:0;margin-right:8px}body.rtl .setting-meta__label{float:left}body.rtl .status__avatar{margin-left:10px;margin-right:0;left:auto;right:10px}body.rtl .activity-stream .status.light{padding-left:10px;padding-right:68px}body.rtl .status__info .status__display-name,body.rtl .activity-stream .status.light .status__display-name{padding-left:25px;padding-right:0}body.rtl .activity-stream .pre-header{padding-right:68px;padding-left:0}body.rtl .status__prepend{margin-left:0;margin-right:58px}body.rtl .status__prepend-icon-wrapper{left:auto;right:-26px}body.rtl .activity-stream .pre-header .pre-header__icon{left:auto;right:42px}body.rtl .account__avatar-overlay-overlay{right:auto;left:0}body.rtl .column-back-button--slim-button{right:auto;left:0}body.rtl .status__relative-time,body.rtl .activity-stream .status.light .status__header .status__meta{float:left;text-align:left}body.rtl .status__action-bar__counter{margin-right:0;margin-left:11px}body.rtl .status__action-bar__counter .status__action-bar-button{margin-right:0;margin-left:4px}body.rtl .status__action-bar-button{float:right;margin-right:0;margin-left:18px}body.rtl .status__action-bar-dropdown{float:right}body.rtl .privacy-dropdown__dropdown{margin-left:0;margin-right:40px}body.rtl .privacy-dropdown__option__icon{margin-left:10px;margin-right:0}body.rtl .detailed-status__display-name .display-name{text-align:right}body.rtl .detailed-status__display-avatar{margin-right:0;margin-left:10px;float:right}body.rtl .detailed-status__favorites,body.rtl .detailed-status__reblogs{margin-left:0;margin-right:6px}body.rtl .fa-ul{margin-left:2.14285714em}body.rtl .fa-li{left:auto;right:-2.14285714em}body.rtl .admin-wrapper{direction:rtl}body.rtl .admin-wrapper .sidebar ul a i.fa,body.rtl a.table-action-link i.fa{margin-right:0;margin-left:5px}body.rtl .simple_form .check_boxes .checkbox label{padding-left:0;padding-right:25px}body.rtl .simple_form .input.with_label.boolean label.checkbox{padding-left:25px;padding-right:0}body.rtl .simple_form .check_boxes .checkbox input[type=checkbox],body.rtl .simple_form .input.boolean input[type=checkbox]{left:auto;right:0}body.rtl .simple_form .input.radio_buttons .radio{left:auto;right:0}body.rtl .simple_form .input.radio_buttons .radio>label{padding-right:28px;padding-left:0}body.rtl .simple_form .input-with-append .input input{padding-left:142px;padding-right:0}body.rtl .simple_form .input.boolean label.checkbox{left:auto;right:0}body.rtl .simple_form .input.boolean .label_input,body.rtl .simple_form .input.boolean .hint{padding-left:0;padding-right:28px}body.rtl .simple_form .label_input__append{right:auto;left:3px}body.rtl .simple_form .label_input__append::after{right:auto;left:0;background-image:linear-gradient(to left, rgba(19, 20, 25, 0), #131419)}body.rtl .simple_form select{background:#131419 url(\"data:image/svg+xml;utf8,\") no-repeat left 8px center/auto 16px}body.rtl .table th,body.rtl .table td{text-align:right}body.rtl .filters .filter-subset{margin-right:0;margin-left:45px}body.rtl .landing-page .header-wrapper .mascot{right:60px;left:auto}body.rtl .landing-page__call-to-action .row__information-board{direction:rtl}body.rtl .landing-page .header .hero .floats .float-1{left:-120px;right:auto}body.rtl .landing-page .header .hero .floats .float-2{left:210px;right:auto}body.rtl .landing-page .header .hero .floats .float-3{left:110px;right:auto}body.rtl .landing-page .header .links .brand img{left:0}body.rtl .landing-page .fa-external-link{padding-right:5px;padding-left:0 !important}body.rtl .landing-page .features #mastodon-timeline{margin-right:0;margin-left:30px}@media screen and (min-width: 631px){body.rtl .column,body.rtl .drawer{padding-left:5px;padding-right:5px}body.rtl .column:first-child,body.rtl .drawer:first-child{padding-left:5px;padding-right:10px}body.rtl .columns-area>div .column,body.rtl .columns-area>div .drawer{padding-left:5px;padding-right:5px}}body.rtl .columns-area--mobile .column,body.rtl .columns-area--mobile .drawer{padding-left:0;padding-right:0}body.rtl .public-layout .header .nav-button{margin-left:8px;margin-right:0}body.rtl .public-layout .public-account-header__tabs{margin-left:0;margin-right:20px}body.rtl .landing-page__information .account__display-name{margin-right:0;margin-left:5px}body.rtl .landing-page__information .account__avatar-wrapper{margin-left:12px;margin-right:0}body.rtl .card__bar .display-name{margin-left:0;margin-right:15px;text-align:right}body.rtl .fa-chevron-left::before{content:\"\"}body.rtl .fa-chevron-right::before{content:\"\"}body.rtl .column-back-button__icon{margin-right:0;margin-left:5px}body.rtl .column-header__setting-arrows .column-header__setting-btn:last-child{padding-left:0;padding-right:10px}body.rtl .simple_form .input.radio_buttons .radio>label input{left:auto;right:0}.dashboard__counters{display:flex;flex-wrap:wrap;margin:0 -5px;margin-bottom:20px}.dashboard__counters>div{box-sizing:border-box;flex:0 0 33.333%;padding:0 5px;margin-bottom:10px}.dashboard__counters>div>div,.dashboard__counters>div>a{padding:20px;background:#313543;border-radius:4px;box-sizing:border-box;height:100%}.dashboard__counters>div>a{text-decoration:none;color:inherit;display:block}.dashboard__counters>div>a:hover,.dashboard__counters>div>a:focus,.dashboard__counters>div>a:active{background:#393f4f}.dashboard__counters__num,.dashboard__counters__text{text-align:center;font-weight:500;font-size:24px;line-height:21px;color:#fff;font-family:sans-serif,sans-serif;margin-bottom:20px;line-height:30px}.dashboard__counters__text{font-size:18px}.dashboard__counters__label{font-size:14px;color:#dde3ec;text-align:center;font-weight:500}.dashboard__widgets{display:flex;flex-wrap:wrap;margin:0 -5px}.dashboard__widgets>div{flex:0 0 33.333%;margin-bottom:20px}.dashboard__widgets>div>div{padding:0 5px}.dashboard__widgets a:not(.name-tag){color:#d9e1e8;font-weight:500;text-decoration:none}.compose-form .compose-form__modifiers .compose-form__upload-description input::placeholder{opacity:1}.rich-formatting a,.rich-formatting p a,.rich-formatting li a,.landing-page__short-description p a,.status__content a,.reply-indicator__content a{color:#5f86e2;text-decoration:underline}.rich-formatting a.mention,.rich-formatting p a.mention,.rich-formatting li a.mention,.landing-page__short-description p a.mention,.status__content a.mention,.reply-indicator__content a.mention{text-decoration:none}.rich-formatting a.mention span,.rich-formatting p a.mention span,.rich-formatting li a.mention span,.landing-page__short-description p a.mention span,.status__content a.mention span,.reply-indicator__content a.mention span{text-decoration:underline}.rich-formatting a.mention span:hover,.rich-formatting a.mention span:focus,.rich-formatting a.mention span:active,.rich-formatting p a.mention span:hover,.rich-formatting p a.mention span:focus,.rich-formatting p a.mention span:active,.rich-formatting li a.mention span:hover,.rich-formatting li a.mention span:focus,.rich-formatting li a.mention span:active,.landing-page__short-description p a.mention span:hover,.landing-page__short-description p a.mention span:focus,.landing-page__short-description p a.mention span:active,.status__content a.mention span:hover,.status__content a.mention span:focus,.status__content a.mention span:active,.reply-indicator__content a.mention span:hover,.reply-indicator__content a.mention span:focus,.reply-indicator__content a.mention span:active{text-decoration:none}.rich-formatting a:hover,.rich-formatting a:focus,.rich-formatting a:active,.rich-formatting p a:hover,.rich-formatting p a:focus,.rich-formatting p a:active,.rich-formatting li a:hover,.rich-formatting li a:focus,.rich-formatting li a:active,.landing-page__short-description p a:hover,.landing-page__short-description p a:focus,.landing-page__short-description p a:active,.status__content a:hover,.status__content a:focus,.status__content a:active,.reply-indicator__content a:hover,.reply-indicator__content a:focus,.reply-indicator__content a:active{text-decoration:none}.rich-formatting a.status__content__spoiler-link,.rich-formatting p a.status__content__spoiler-link,.rich-formatting li a.status__content__spoiler-link,.landing-page__short-description p a.status__content__spoiler-link,.status__content a.status__content__spoiler-link,.reply-indicator__content a.status__content__spoiler-link{color:#ecf0f4;text-decoration:none}.status__content__read-more-button{text-decoration:underline}.status__content__read-more-button:hover,.status__content__read-more-button:focus,.status__content__read-more-button:active{text-decoration:none}.getting-started__footer a{text-decoration:underline}.getting-started__footer a:hover,.getting-started__footer a:focus,.getting-started__footer a:active{text-decoration:none}.nothing-here{color:#dde3ec}.public-layout .public-account-header__tabs__tabs .counter.active::after{border-bottom:4px solid #2b5fd9}","/* http://meyerweb.com/eric/tools/css/reset/\n v2.0 | 20110126\n License: none (public domain)\n*/\n\nhtml, body, div, span, applet, object, iframe,\nh1, h2, h3, h4, h5, h6, p, blockquote, pre,\na, abbr, acronym, address, big, cite, code,\ndel, dfn, em, img, ins, kbd, q, s, samp,\nsmall, strike, strong, sub, sup, tt, var,\nb, u, i, center,\ndl, dt, dd, ol, ul, li,\nfieldset, form, label, legend,\ntable, caption, tbody, tfoot, thead, tr, th, td,\narticle, aside, canvas, details, embed,\nfigure, figcaption, footer, header, hgroup,\nmenu, nav, output, ruby, section, summary,\ntime, mark, audio, video {\n margin: 0;\n padding: 0;\n border: 0;\n font-size: 100%;\n font: inherit;\n vertical-align: baseline;\n}\n\n/* HTML5 display-role reset for older browsers */\narticle, aside, details, figcaption, figure,\nfooter, header, hgroup, menu, nav, section {\n display: block;\n}\n\nbody {\n line-height: 1;\n}\n\nol, ul {\n list-style: none;\n}\n\nblockquote, q {\n quotes: none;\n}\n\nblockquote:before, blockquote:after,\nq:before, q:after {\n content: '';\n content: none;\n}\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\nhtml {\n scrollbar-color: lighten($ui-base-color, 4%) rgba($base-overlay-background, 0.1);\n}\n\n::-webkit-scrollbar {\n width: 12px;\n height: 12px;\n}\n\n::-webkit-scrollbar-thumb {\n background: lighten($ui-base-color, 4%);\n border: 0px none $base-border-color;\n border-radius: 50px;\n}\n\n::-webkit-scrollbar-thumb:hover {\n background: lighten($ui-base-color, 6%);\n}\n\n::-webkit-scrollbar-thumb:active {\n background: lighten($ui-base-color, 4%);\n}\n\n::-webkit-scrollbar-track {\n border: 0px none $base-border-color;\n border-radius: 0;\n background: rgba($base-overlay-background, 0.1);\n}\n\n::-webkit-scrollbar-track:hover {\n background: $ui-base-color;\n}\n\n::-webkit-scrollbar-track:active {\n background: $ui-base-color;\n}\n\n::-webkit-scrollbar-corner {\n background: transparent;\n}\n","// Dependent colors\n$black: #000000;\n\n$classic-base-color: #282c37;\n$classic-primary-color: #9baec8;\n$classic-secondary-color: #d9e1e8;\n$classic-highlight-color: #2b90d9;\n\n$ui-base-color: $classic-base-color !default;\n$ui-primary-color: $classic-primary-color !default;\n$ui-secondary-color: $classic-secondary-color !default;\n\n// Differences\n$ui-highlight-color: #2b5fd9;\n\n$darker-text-color: lighten($ui-primary-color, 20%) !default;\n$dark-text-color: lighten($ui-primary-color, 12%) !default;\n$secondary-text-color: lighten($ui-secondary-color, 6%) !default;\n$highlight-text-color: $classic-highlight-color !default;\n$action-button-color: #8d9ac2;\n\n$inverted-text-color: $black !default;\n$lighter-text-color: darken($ui-base-color,6%) !default;\n$light-text-color: darken($ui-primary-color, 40%) !default;\n","@function hex-color($color) {\n @if type-of($color) == 'color' {\n $color: str-slice(ie-hex-str($color), 4);\n }\n @return '%23' + unquote($color)\n}\n\nbody {\n font-family: $font-sans-serif, sans-serif;\n background: darken($ui-base-color, 7%);\n font-size: 13px;\n line-height: 18px;\n font-weight: 400;\n color: $primary-text-color;\n text-rendering: optimizelegibility;\n font-feature-settings: \"kern\";\n text-size-adjust: none;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n -webkit-tap-highlight-color: transparent;\n\n &.system-font {\n // system-ui => standard property (Chrome/Android WebView 56+, Opera 43+, Safari 11+)\n // -apple-system => Safari <11 specific\n // BlinkMacSystemFont => Chrome <56 on macOS specific\n // Segoe UI => Windows 7/8/10\n // Oxygen => KDE\n // Ubuntu => Unity/Ubuntu\n // Cantarell => GNOME\n // Fira Sans => Firefox OS\n // Droid Sans => Older Androids (<4.0)\n // Helvetica Neue => Older macOS <10.11\n // $font-sans-serif => web-font (Roboto) fallback and newer Androids (>=4.0)\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Oxygen\", \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", $font-sans-serif, sans-serif;\n }\n\n &.app-body {\n padding: 0;\n\n &.layout-single-column {\n height: auto;\n min-height: 100vh;\n overflow-y: scroll;\n }\n\n &.layout-multiple-columns {\n position: absolute;\n width: 100%;\n height: 100%;\n }\n\n &.with-modals--active {\n overflow-y: hidden;\n }\n }\n\n &.lighter {\n background: $ui-base-color;\n }\n\n &.with-modals {\n overflow-x: hidden;\n overflow-y: scroll;\n\n &--active {\n overflow-y: hidden;\n }\n }\n\n &.embed {\n background: lighten($ui-base-color, 4%);\n margin: 0;\n padding-bottom: 0;\n\n .container {\n position: absolute;\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n }\n\n &.admin {\n background: darken($ui-base-color, 4%);\n padding: 0;\n }\n\n &.error {\n position: absolute;\n text-align: center;\n color: $darker-text-color;\n background: $ui-base-color;\n width: 100%;\n height: 100%;\n padding: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n\n .dialog {\n vertical-align: middle;\n margin: 20px;\n\n img {\n display: block;\n max-width: 470px;\n width: 100%;\n height: auto;\n margin-top: -120px;\n }\n\n h1 {\n font-size: 20px;\n line-height: 28px;\n font-weight: 400;\n }\n }\n }\n}\n\nbutton {\n font-family: inherit;\n cursor: pointer;\n\n &:focus {\n outline: none;\n }\n}\n\n.app-holder {\n &,\n & > div {\n display: flex;\n width: 100%;\n align-items: center;\n justify-content: center;\n outline: 0 !important;\n }\n}\n\n.layout-single-column .app-holder {\n &,\n & > div {\n min-height: 100vh;\n }\n}\n\n.layout-multiple-columns .app-holder {\n &,\n & > div {\n height: 100%;\n }\n}\n","// Commonly used web colors\n$black: #000000; // Black\n$white: #ffffff; // White\n$success-green: #79bd9a; // Padua\n$error-red: #df405a; // Cerise\n$warning-red: #ff5050; // Sunset Orange\n$gold-star: #ca8f04; // Dark Goldenrod\n\n$red-bookmark: $warning-red;\n\n// Pleroma-Dark colors\n$pleroma-bg: #121a24;\n$pleroma-fg: #182230;\n$pleroma-text: #b9b9ba;\n$pleroma-links: #d8a070;\n\n// Values from the classic Mastodon UI\n$classic-base-color: $pleroma-bg;\n$classic-primary-color: #9baec8;\n$classic-secondary-color: #d9e1e8;\n$classic-highlight-color: #d8a070;\n\n// Variables for defaults in UI\n$base-shadow-color: $black !default;\n$base-overlay-background: $black !default;\n$base-border-color: $white !default;\n$simple-background-color: $white !default;\n$valid-value-color: $success-green !default;\n$error-value-color: $error-red !default;\n\n// Tell UI to use selected colors\n$ui-base-color: $classic-base-color !default; // Darkest\n$ui-base-lighter-color: lighten($ui-base-color, 26%) !default; // Lighter darkest\n$ui-primary-color: $classic-primary-color !default; // Lighter\n$ui-secondary-color: $classic-secondary-color !default; // Lightest\n$ui-highlight-color: $classic-highlight-color !default;\n\n// Variables for texts\n$primary-text-color: $white !default;\n$darker-text-color: $ui-primary-color !default;\n$dark-text-color: $ui-base-lighter-color !default;\n$secondary-text-color: $ui-secondary-color !default;\n$highlight-text-color: $ui-highlight-color !default;\n$action-button-color: $ui-base-lighter-color !default;\n// For texts on inverted backgrounds\n$inverted-text-color: $ui-base-color !default;\n$lighter-text-color: $ui-base-lighter-color !default;\n$light-text-color: $ui-primary-color !default;\n\n// Language codes that uses CJK fonts\n$cjk-langs: ja, ko, zh-CN, zh-HK, zh-TW;\n\n// Variables for components\n$media-modal-media-max-width: 100%;\n// put margins on top and bottom of image to avoid the screen covered by image.\n$media-modal-media-max-height: 80%;\n\n$no-gap-breakpoint: 415px;\n\n$font-sans-serif: sans-serif !default;\n$font-display: sans-serif !default;\n$font-monospace: monospace !default;\n\n// Avatar border size (8% default, 100% for rounded avatars)\n$ui-avatar-border-size: 8%;\n\n// More variables\n$dismiss-overlay-width: 4rem;\n",".container-alt {\n width: 700px;\n margin: 0 auto;\n margin-top: 40px;\n\n @media screen and (max-width: 740px) {\n width: 100%;\n margin: 0;\n }\n}\n\n.logo-container {\n margin: 100px auto 50px;\n\n @media screen and (max-width: 500px) {\n margin: 40px auto 0;\n }\n\n h1 {\n display: flex;\n justify-content: center;\n align-items: center;\n\n svg {\n fill: $primary-text-color;\n height: 42px;\n margin-right: 10px;\n }\n\n a {\n display: flex;\n justify-content: center;\n align-items: center;\n color: $primary-text-color;\n text-decoration: none;\n outline: 0;\n padding: 12px 16px;\n line-height: 32px;\n font-family: $font-display, sans-serif;\n font-weight: 500;\n font-size: 14px;\n }\n }\n}\n\n.compose-standalone {\n .compose-form {\n width: 400px;\n margin: 0 auto;\n padding: 20px 0;\n margin-top: 40px;\n box-sizing: border-box;\n\n @media screen and (max-width: 400px) {\n width: 100%;\n margin-top: 0;\n padding: 20px;\n }\n }\n}\n\n.account-header {\n width: 400px;\n margin: 0 auto;\n display: flex;\n font-size: 13px;\n line-height: 18px;\n box-sizing: border-box;\n padding: 20px 0;\n padding-bottom: 0;\n margin-bottom: -30px;\n margin-top: 40px;\n\n @media screen and (max-width: 440px) {\n width: 100%;\n margin: 0;\n margin-bottom: 10px;\n padding: 20px;\n padding-bottom: 0;\n }\n\n .avatar {\n width: 40px;\n height: 40px;\n @include avatar-size(40px);\n margin-right: 8px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n @include avatar-radius();\n }\n }\n\n .name {\n flex: 1 1 auto;\n color: $secondary-text-color;\n width: calc(100% - 88px);\n\n .username {\n display: block;\n font-weight: 500;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n }\n\n .logout-link {\n display: block;\n font-size: 32px;\n line-height: 40px;\n margin-left: 8px;\n }\n}\n\n.grid-3 {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: 3fr 1fr;\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-column: 1/3;\n grid-row: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 2;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1/3;\n grid-row: 3;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n grid-template-columns: minmax(0, 100%);\n\n .column-0 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .column-2 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1;\n grid-row: 4;\n }\n }\n}\n\n.grid-4 {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: repeat(4, minmax(0, 1fr));\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-column: 1 / 5;\n grid-row: 1;\n }\n\n .column-1 {\n grid-column: 1 / 4;\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 4;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 2 / 5;\n grid-row: 3;\n }\n\n .column-4 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .landing-page__call-to-action {\n min-height: 100%;\n }\n\n .flash-message {\n margin-bottom: 10px;\n }\n\n @media screen and (max-width: 738px) {\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n .landing-page__call-to-action {\n padding: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .row__information-board {\n width: 100%;\n justify-content: center;\n align-items: center;\n }\n\n .row__mascot {\n display: none;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n grid-template-columns: minmax(0, 100%);\n\n .column-0 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .column-2 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1;\n grid-row: 5;\n }\n\n .column-4 {\n grid-column: 1;\n grid-row: 4;\n }\n }\n}\n\n.public-layout {\n @media screen and (max-width: $no-gap-breakpoint) {\n padding-top: 48px;\n }\n\n .container {\n max-width: 960px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding: 0;\n }\n }\n\n .header {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n height: 48px;\n margin: 10px 0;\n display: flex;\n align-items: stretch;\n justify-content: center;\n flex-wrap: nowrap;\n overflow: hidden;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n position: fixed;\n width: 100%;\n top: 0;\n left: 0;\n margin: 0;\n border-radius: 0;\n box-shadow: none;\n z-index: 110;\n }\n\n & > div {\n flex: 1 1 33.3%;\n min-height: 1px;\n }\n\n .nav-left {\n display: flex;\n align-items: stretch;\n justify-content: flex-start;\n flex-wrap: nowrap;\n }\n\n .nav-center {\n display: flex;\n align-items: stretch;\n justify-content: center;\n flex-wrap: nowrap;\n }\n\n .nav-right {\n display: flex;\n align-items: stretch;\n justify-content: flex-end;\n flex-wrap: nowrap;\n }\n\n .brand {\n display: block;\n padding: 15px;\n\n svg {\n display: block;\n height: 18px;\n width: auto;\n position: relative;\n bottom: -2px;\n fill: $primary-text-color;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n height: 20px;\n }\n }\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 12%);\n }\n }\n\n .nav-link {\n display: flex;\n align-items: center;\n padding: 0 1rem;\n font-size: 12px;\n font-weight: 500;\n text-decoration: none;\n color: $darker-text-color;\n white-space: nowrap;\n text-align: center;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n color: $primary-text-color;\n }\n\n @media screen and (max-width: 550px) {\n &.optional {\n display: none;\n }\n }\n }\n\n .nav-button {\n background: lighten($ui-base-color, 16%);\n margin: 8px;\n margin-left: 0;\n border-radius: 4px;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n background: lighten($ui-base-color, 20%);\n }\n }\n }\n\n $no-columns-breakpoint: 600px;\n\n .grid {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(300px, 3fr) minmax(298px, 1fr);\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-row: 1;\n grid-column: 1;\n }\n\n .column-1 {\n grid-row: 1;\n grid-column: 2;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n grid-template-columns: 100%;\n grid-gap: 0;\n\n .column-1 {\n display: none;\n }\n }\n }\n\n .directory__card {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n\n .page-header {\n @media screen and (max-width: $no-gap-breakpoint) {\n border-bottom: 0;\n }\n }\n\n .public-account-header {\n overflow: hidden;\n margin-bottom: 10px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &.inactive {\n opacity: 0.5;\n\n .public-account-header__image,\n .avatar {\n filter: grayscale(100%);\n }\n\n .logo-button {\n background-color: $secondary-text-color;\n }\n }\n\n &__image {\n border-radius: 4px 4px 0 0;\n overflow: hidden;\n height: 300px;\n position: relative;\n background: darken($ui-base-color, 12%);\n\n &::after {\n content: \"\";\n display: block;\n position: absolute;\n width: 100%;\n height: 100%;\n box-shadow: inset 0 -1px 1px 1px rgba($base-shadow-color, 0.15);\n top: 0;\n left: 0;\n }\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 4px 4px 0 0;\n }\n\n @media screen and (max-width: 600px) {\n height: 200px;\n }\n }\n\n &--no-bar {\n margin-bottom: 0;\n\n .public-account-header__image,\n .public-account-header__image img {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n box-shadow: none;\n\n &__image::after {\n display: none;\n }\n\n &__image,\n &__image img {\n border-radius: 0;\n }\n }\n\n &__bar {\n position: relative;\n margin-top: -80px;\n display: flex;\n justify-content: flex-start;\n\n &::before {\n content: \"\";\n display: block;\n background: lighten($ui-base-color, 4%);\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: 60px;\n border-radius: 0 0 4px 4px;\n z-index: -1;\n }\n\n .avatar {\n display: block;\n width: 120px;\n height: 120px;\n @include avatar-size(120px);\n padding-left: 20px - 4px;\n flex: 0 0 auto;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 50%;\n border: 4px solid lighten($ui-base-color, 4%);\n background: darken($ui-base-color, 8%);\n @include avatar-radius();\n }\n }\n\n @media screen and (max-width: 600px) {\n margin-top: 0;\n background: lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n padding: 5px;\n\n &::before {\n display: none;\n }\n\n .avatar {\n width: 48px;\n height: 48px;\n @include avatar-size(48px);\n padding: 7px 0;\n padding-left: 10px;\n\n img {\n border: 0;\n border-radius: 4px;\n @include avatar-radius();\n }\n\n @media screen and (max-width: 360px) {\n display: none;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n flex-wrap: wrap;\n }\n }\n\n &__tabs {\n flex: 1 1 auto;\n margin-left: 20px;\n\n &__name {\n padding-top: 20px;\n padding-bottom: 8px;\n\n h1 {\n font-size: 20px;\n line-height: 18px * 1.5;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n text-shadow: 1px 1px 1px $base-shadow-color;\n\n small {\n display: block;\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n @media screen and (max-width: 600px) {\n margin-left: 15px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n &__name {\n padding-top: 0;\n padding-bottom: 0;\n\n h1 {\n font-size: 16px;\n line-height: 24px;\n text-shadow: none;\n\n small {\n color: $darker-text-color;\n }\n }\n }\n }\n\n &__tabs {\n display: flex;\n justify-content: flex-start;\n align-items: stretch;\n height: 58px;\n\n .details-counters {\n display: flex;\n flex-direction: row;\n min-width: 300px;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n .details-counters {\n display: none;\n }\n }\n\n .counter {\n min-width: 33.3%;\n box-sizing: border-box;\n flex: 0 0 auto;\n color: $darker-text-color;\n padding: 10px;\n border-right: 1px solid lighten($ui-base-color, 4%);\n cursor: default;\n text-align: center;\n position: relative;\n\n a {\n display: block;\n }\n\n &:last-child {\n border-right: 0;\n }\n\n &::after {\n display: block;\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n border-bottom: 4px solid $ui-primary-color;\n opacity: 0.5;\n transition: all 400ms ease;\n }\n\n &.active {\n &::after {\n border-bottom: 4px solid $highlight-text-color;\n opacity: 1;\n }\n\n &.inactive::after {\n border-bottom-color: $secondary-text-color;\n }\n }\n\n &:hover {\n &::after {\n opacity: 1;\n transition-duration: 100ms;\n }\n }\n\n a {\n text-decoration: none;\n color: inherit;\n }\n\n .counter-label {\n font-size: 12px;\n display: block;\n }\n\n .counter-number {\n font-weight: 500;\n font-size: 18px;\n margin-bottom: 5px;\n color: $primary-text-color;\n font-family: $font-display, sans-serif;\n }\n }\n\n .spacer {\n flex: 1 1 auto;\n height: 1px;\n }\n\n &__buttons {\n padding: 7px 8px;\n }\n }\n }\n\n &__extra {\n display: none;\n margin-top: 4px;\n\n .public-account-bio {\n border-radius: 0;\n box-shadow: none;\n background: transparent;\n margin: 0 -5px;\n\n .account__header__fields {\n border-top: 1px solid lighten($ui-base-color, 12%);\n }\n\n .roles {\n display: none;\n }\n }\n\n &__links {\n margin-top: -15px;\n font-size: 14px;\n color: $darker-text-color;\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n padding: 15px;\n font-weight: 500;\n\n strong {\n font-weight: 700;\n color: $primary-text-color;\n }\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n flex: 100%;\n }\n }\n }\n\n .account__section-headline {\n border-radius: 4px 4px 0 0;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n\n .detailed-status__meta {\n margin-top: 25px;\n }\n\n .public-account-bio {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n overflow: hidden;\n margin-bottom: 10px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n box-shadow: none;\n margin-bottom: 0;\n border-radius: 0;\n }\n\n .account__header__fields {\n margin: 0;\n border-top: 0;\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n\n .account__header__content {\n padding: 20px;\n padding-bottom: 0;\n color: $primary-text-color;\n }\n\n &__extra,\n .roles {\n padding: 20px;\n font-size: 14px;\n color: $darker-text-color;\n }\n\n .roles {\n padding-bottom: 0;\n }\n }\n\n .directory__list {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: block;\n }\n\n .icon-button {\n font-size: 18px;\n }\n }\n\n .directory__card {\n margin-bottom: 0;\n }\n\n .card-grid {\n display: flex;\n flex-wrap: wrap;\n min-width: 100%;\n margin: 0 -5px;\n\n & > div {\n box-sizing: border-box;\n flex: 1 0 auto;\n width: 300px;\n padding: 0 5px;\n margin-bottom: 10px;\n max-width: 33.333%;\n\n @media screen and (max-width: 900px) {\n max-width: 50%;\n }\n\n @media screen and (max-width: 600px) {\n max-width: 100%;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin: 0;\n border-top: 1px solid lighten($ui-base-color, 8%);\n\n & > div {\n width: 100%;\n padding: 0;\n margin-bottom: 0;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &:last-child {\n border-bottom: 0;\n }\n\n .card__bar {\n background: $ui-base-color;\n\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n }\n }\n }\n }\n}\n","@mixin avatar-radius() {\n border-radius: $ui-avatar-border-size;\n background-position: 50%;\n background-clip: padding-box;\n}\n\n@mixin avatar-size($size:48px) {\n width: $size;\n height: $size;\n background-size: $size $size;\n}\n\n@mixin single-column($media, $parent: '&') {\n .auto-columns #{$parent} {\n @media #{$media} {\n @content;\n }\n }\n .single-column #{$parent} {\n @content;\n }\n}\n\n@mixin limited-single-column($media, $parent: '&') {\n .auto-columns #{$parent}, .single-column #{$parent} {\n @media #{$media} {\n @content;\n }\n }\n}\n\n@mixin multi-columns($media, $parent: '&') {\n .auto-columns #{$parent} {\n @media #{$media} {\n @content;\n }\n }\n .multi-columns #{$parent} {\n @content;\n }\n}\n\n@mixin fullwidth-gallery {\n &.full-width {\n margin-left: -14px;\n margin-right: -14px;\n width: inherit;\n max-width: none;\n height: 250px;\n border-radius: 0px;\n }\n}\n\n@mixin search-input() {\n outline: 0;\n box-sizing: border-box;\n width: 100%;\n border: none;\n box-shadow: none;\n font-family: inherit;\n background: $ui-base-color;\n color: $darker-text-color;\n font-size: 14px;\n margin: 0;\n}\n\n@mixin search-popout() {\n background: $simple-background-color;\n border-radius: 4px;\n padding: 10px 14px;\n padding-bottom: 14px;\n margin-top: 10px;\n color: $light-text-color;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n\n h4 {\n text-transform: uppercase;\n color: $light-text-color;\n font-size: 13px;\n font-weight: 500;\n margin-bottom: 10px;\n }\n\n li {\n padding: 4px 0;\n }\n\n ul {\n margin-bottom: 10px;\n }\n\n em {\n font-weight: 500;\n color: $inverted-text-color;\n }\n}\n",".no-list {\n list-style: none;\n\n li {\n display: inline-block;\n margin: 0 5px;\n }\n}\n\n.recovery-codes {\n list-style: none;\n margin: 0 auto;\n\n li {\n font-size: 125%;\n line-height: 1.5;\n letter-spacing: 1px;\n }\n}\n",".modal-layout {\n background: $ui-base-color url('data:image/svg+xml;utf8,') repeat-x bottom fixed;\n display: flex;\n flex-direction: column;\n height: 100vh;\n padding: 0;\n}\n\n.modal-layout__mastodon {\n display: flex;\n flex: 1;\n flex-direction: column;\n justify-content: flex-end;\n\n > * {\n flex: 1;\n max-height: 235px;\n }\n}\n\n@media screen and (max-width: 600px) {\n .account-header {\n margin-top: 0;\n }\n}\n",".public-layout {\n .footer {\n text-align: left;\n padding-top: 20px;\n padding-bottom: 60px;\n font-size: 12px;\n color: lighten($ui-base-color, 34%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding-left: 20px;\n padding-right: 20px;\n }\n\n .grid {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: 1fr 1fr 2fr 1fr 1fr;\n\n .column-0 {\n grid-column: 1;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-1 {\n grid-column: 2;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-2 {\n grid-column: 3;\n grid-row: 1;\n min-width: 0;\n text-align: center;\n\n h4 a {\n color: lighten($ui-base-color, 34%);\n }\n }\n\n .column-3 {\n grid-column: 4;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-4 {\n grid-column: 5;\n grid-row: 1;\n min-width: 0;\n }\n\n @media screen and (max-width: 690px) {\n grid-template-columns: 1fr 2fr 1fr;\n\n .column-0,\n .column-1 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 2;\n }\n\n .column-3,\n .column-4 {\n grid-column: 3;\n }\n\n .column-4 {\n grid-row: 2;\n }\n }\n\n @media screen and (max-width: 600px) {\n .column-1 {\n display: block;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n .column-0,\n .column-1,\n .column-3,\n .column-4 {\n display: none;\n }\n }\n }\n\n h4 {\n text-transform: uppercase;\n font-weight: 700;\n margin-bottom: 8px;\n color: $darker-text-color;\n\n a {\n color: inherit;\n text-decoration: none;\n }\n }\n\n ul a {\n text-decoration: none;\n color: lighten($ui-base-color, 34%);\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n\n .brand {\n svg {\n display: block;\n height: 36px;\n width: auto;\n margin: 0 auto;\n fill: lighten($ui-base-color, 34%);\n }\n\n &:hover,\n &:focus,\n &:active {\n svg {\n fill: lighten($ui-base-color, 38%);\n }\n }\n }\n }\n}\n",".compact-header {\n h1 {\n font-size: 24px;\n line-height: 28px;\n color: $darker-text-color;\n font-weight: 500;\n margin-bottom: 20px;\n padding: 0 10px;\n word-wrap: break-word;\n\n @media screen and (max-width: 740px) {\n text-align: center;\n padding: 20px 10px 0;\n }\n\n a {\n color: inherit;\n text-decoration: none;\n }\n\n small {\n font-weight: 400;\n color: $secondary-text-color;\n }\n\n img {\n display: inline-block;\n margin-bottom: -5px;\n margin-right: 15px;\n width: 36px;\n height: 36px;\n }\n }\n}\n",".hero-widget {\n margin-bottom: 10px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &__img {\n width: 100%;\n position: relative;\n overflow: hidden;\n border-radius: 4px 4px 0 0;\n background: $base-shadow-color;\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 4px 4px 0 0;\n }\n }\n\n &__text {\n background: $ui-base-color;\n padding: 20px;\n border-radius: 0 0 4px 4px;\n font-size: 15px;\n color: $darker-text-color;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n p {\n margin-bottom: 20px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n em {\n display: inline;\n margin: 0;\n padding: 0;\n font-weight: 700;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n color: lighten($darker-text-color, 10%);\n }\n\n a {\n color: $secondary-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n}\n\n.endorsements-widget {\n margin-bottom: 10px;\n padding-bottom: 10px;\n\n h4 {\n padding: 10px;\n text-transform: uppercase;\n font-weight: 700;\n font-size: 13px;\n color: $darker-text-color;\n }\n\n .account {\n padding: 10px 0;\n\n &:last-child {\n border-bottom: 0;\n }\n\n .account__display-name {\n display: flex;\n align-items: center;\n }\n\n .account__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n }\n\n .trends__item {\n padding: 10px;\n }\n}\n\n.trends-widget {\n h4 {\n color: $darker-text-color;\n }\n}\n\n.box-widget {\n padding: 20px;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n}\n\n.placeholder-widget {\n padding: 16px;\n border-radius: 4px;\n border: 2px dashed $dark-text-color;\n text-align: center;\n color: $darker-text-color;\n margin-bottom: 10px;\n}\n\n.contact-widget {\n min-height: 100%;\n font-size: 15px;\n color: $darker-text-color;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n padding: 0;\n\n h4 {\n padding: 10px;\n text-transform: uppercase;\n font-weight: 700;\n font-size: 13px;\n color: $darker-text-color;\n }\n\n .account {\n border-bottom: 0;\n padding: 10px 0;\n padding-top: 5px;\n }\n\n & > a {\n display: inline-block;\n padding: 10px;\n padding-top: 0;\n color: $darker-text-color;\n text-decoration: none;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.moved-account-widget {\n padding: 15px;\n padding-bottom: 20px;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n color: $secondary-text-color;\n font-weight: 400;\n margin-bottom: 10px;\n\n strong,\n a {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n color: inherit;\n text-decoration: underline;\n\n &.mention {\n text-decoration: none;\n\n span {\n text-decoration: none;\n }\n\n &:focus,\n &:hover,\n &:active {\n text-decoration: none;\n\n span {\n text-decoration: underline;\n }\n }\n }\n }\n\n &__message {\n margin-bottom: 15px;\n\n .fa {\n margin-right: 5px;\n color: $darker-text-color;\n }\n }\n\n &__card {\n .detailed-status__display-avatar {\n position: relative;\n cursor: pointer;\n }\n\n .detailed-status__display-name {\n margin-bottom: 0;\n text-decoration: none;\n\n span {\n font-weight: 400;\n }\n }\n }\n}\n\n.memoriam-widget {\n padding: 20px;\n border-radius: 4px;\n background: $base-shadow-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n font-size: 14px;\n color: $darker-text-color;\n margin-bottom: 10px;\n}\n\n.page-header {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n padding: 60px 15px;\n text-align: center;\n margin: 10px 0;\n\n h1 {\n color: $primary-text-color;\n font-size: 36px;\n line-height: 1.1;\n font-weight: 700;\n margin-bottom: 10px;\n }\n\n p {\n font-size: 15px;\n color: $darker-text-color;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-top: 0;\n background: lighten($ui-base-color, 4%);\n\n h1 {\n font-size: 24px;\n }\n }\n}\n\n.directory {\n background: $ui-base-color;\n border-radius: 4px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &__tag {\n box-sizing: border-box;\n margin-bottom: 10px;\n\n & > a,\n & > div {\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: $ui-base-color;\n border-radius: 4px;\n padding: 15px;\n text-decoration: none;\n color: inherit;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n }\n\n & > a {\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 8%);\n }\n }\n\n &.active > a {\n background: $ui-highlight-color;\n cursor: default;\n }\n\n &.disabled > div {\n opacity: 0.5;\n cursor: default;\n }\n\n h4 {\n flex: 1 1 auto;\n font-size: 18px;\n font-weight: 700;\n color: $primary-text-color;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n .fa {\n color: $darker-text-color;\n }\n\n small {\n display: block;\n font-weight: 400;\n font-size: 15px;\n margin-top: 8px;\n color: $darker-text-color;\n }\n }\n\n &.active h4 {\n &,\n .fa,\n small {\n color: $primary-text-color;\n }\n }\n\n .avatar-stack {\n flex: 0 0 auto;\n width: (36px + 4px) * 3;\n }\n\n &.active .avatar-stack .account__avatar {\n border-color: $ui-highlight-color;\n }\n }\n}\n\n.avatar-stack {\n display: flex;\n justify-content: flex-end;\n\n .account__avatar {\n flex: 0 0 auto;\n width: 36px;\n height: 36px;\n border-radius: 50%;\n position: relative;\n margin-left: -10px;\n background: darken($ui-base-color, 8%);\n border: 2px solid $ui-base-color;\n\n &:nth-child(1) {\n z-index: 1;\n }\n\n &:nth-child(2) {\n z-index: 2;\n }\n\n &:nth-child(3) {\n z-index: 3;\n }\n }\n}\n\n.accounts-table {\n width: 100%;\n\n .account {\n padding: 0;\n border: 0;\n }\n\n strong {\n font-weight: 700;\n }\n\n thead th {\n text-align: center;\n text-transform: uppercase;\n color: $darker-text-color;\n font-weight: 700;\n padding: 10px;\n\n &:first-child {\n text-align: left;\n }\n }\n\n tbody td {\n padding: 15px 0;\n vertical-align: middle;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n tbody tr:last-child td {\n border-bottom: 0;\n }\n\n &__count {\n width: 120px;\n text-align: center;\n font-size: 15px;\n font-weight: 500;\n color: $primary-text-color;\n\n small {\n display: block;\n color: $darker-text-color;\n font-weight: 400;\n font-size: 14px;\n }\n }\n\n &__comment {\n width: 50%;\n vertical-align: initial !important;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n tbody td.optional {\n display: none;\n }\n }\n}\n\n.moved-account-widget,\n.memoriam-widget,\n.box-widget,\n.contact-widget,\n.landing-page__information.contact-widget,\n.directory,\n.page-header {\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n box-shadow: none;\n border-radius: 0;\n }\n}\n\n$maximum-width: 1235px;\n$fluid-breakpoint: $maximum-width + 20px;\n\n.statuses-grid {\n min-height: 600px;\n\n @media screen and (max-width: 640px) {\n width: 100% !important; // Masonry layout is unnecessary at this width\n }\n\n &__item {\n width: (960px - 20px) / 3;\n\n @media screen and (max-width: $fluid-breakpoint) {\n width: (940px - 20px) / 3;\n }\n\n @media screen and (max-width: 640px) {\n width: 100%;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n width: 100vw;\n }\n }\n\n .detailed-status {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 1px solid lighten($ui-base-color, 16%);\n }\n\n &.compact {\n .detailed-status__meta {\n margin-top: 15px;\n }\n\n .status__content {\n font-size: 15px;\n line-height: 20px;\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n .status__content__spoiler-link {\n line-height: 20px;\n margin: 0;\n }\n }\n\n .media-gallery,\n .status-card,\n .video-player {\n margin-top: 15px;\n }\n }\n }\n}\n\n.notice-widget {\n margin-bottom: 10px;\n color: $darker-text-color;\n\n p {\n margin-bottom: 10px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n font-size: 14px;\n line-height: 20px;\n }\n}\n\n.notice-widget,\n.placeholder-widget {\n a {\n text-decoration: none;\n font-weight: 500;\n color: $ui-highlight-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.table-of-contents {\n background: darken($ui-base-color, 4%);\n min-height: 100%;\n font-size: 14px;\n border-radius: 4px;\n\n li a {\n display: block;\n font-weight: 500;\n padding: 15px;\n overflow: hidden;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n text-decoration: none;\n color: $primary-text-color;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n\n li:last-child a {\n border-bottom: 0;\n }\n\n li ul {\n padding-left: 20px;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n }\n}\n","$no-columns-breakpoint: 600px;\n\ncode {\n font-family: $font-monospace, monospace;\n font-weight: 400;\n}\n\n.form-container {\n max-width: 400px;\n padding: 20px;\n margin: 0 auto;\n}\n\n.simple_form {\n .input {\n margin-bottom: 15px;\n overflow: hidden;\n\n &.hidden {\n margin: 0;\n }\n\n &.radio_buttons {\n .radio {\n margin-bottom: 15px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .radio > label {\n position: relative;\n padding-left: 28px;\n\n input {\n position: absolute;\n top: -2px;\n left: 0;\n }\n }\n }\n\n &.boolean {\n position: relative;\n margin-bottom: 0;\n\n .label_input > label {\n font-family: inherit;\n font-size: 14px;\n padding-top: 5px;\n color: $primary-text-color;\n display: block;\n width: auto;\n }\n\n .label_input,\n .hint {\n padding-left: 28px;\n }\n\n .label_input__wrapper {\n position: static;\n }\n\n label.checkbox {\n position: absolute;\n top: 2px;\n left: 0;\n }\n\n label a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: none;\n }\n }\n\n .recommended {\n position: absolute;\n margin: 0 4px;\n margin-top: -2px;\n }\n }\n }\n\n .row {\n display: flex;\n margin: 0 -5px;\n\n .input {\n box-sizing: border-box;\n flex: 1 1 auto;\n width: 50%;\n padding: 0 5px;\n }\n }\n\n .hint {\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n }\n\n code {\n border-radius: 3px;\n padding: 0.2em 0.4em;\n background: darken($ui-base-color, 12%);\n }\n }\n\n span.hint {\n display: block;\n font-size: 12px;\n margin-top: 4px;\n }\n\n p.hint {\n margin-bottom: 15px;\n color: $darker-text-color;\n\n &.subtle-hint {\n text-align: center;\n font-size: 12px;\n line-height: 18px;\n margin-top: 15px;\n margin-bottom: 0;\n }\n }\n\n .card {\n margin-bottom: 15px;\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n .input.with_floating_label {\n .label_input {\n display: flex;\n\n & > label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 500;\n min-width: 150px;\n flex: 0 0 auto;\n }\n\n input,\n select {\n flex: 1 1 auto;\n }\n }\n\n &.select .hint {\n margin-top: 6px;\n margin-left: 150px;\n }\n }\n\n .input.with_label {\n .label_input > label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: block;\n margin-bottom: 8px;\n word-wrap: break-word;\n font-weight: 500;\n }\n\n .hint {\n margin-top: 6px;\n }\n\n ul {\n flex: 390px;\n }\n }\n\n .input.with_block_label {\n max-width: none;\n\n & > label {\n font-family: inherit;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n font-weight: 500;\n padding-top: 5px;\n }\n\n .hint {\n margin-bottom: 15px;\n }\n\n ul {\n columns: 2;\n }\n }\n\n .required abbr {\n text-decoration: none;\n color: lighten($error-value-color, 12%);\n }\n\n .fields-group {\n margin-bottom: 25px;\n\n .input:last-child {\n margin-bottom: 0;\n }\n }\n\n .fields-row {\n display: flex;\n margin: 0 -10px;\n padding-top: 5px;\n margin-bottom: 25px;\n\n .input {\n max-width: none;\n }\n\n &__column {\n box-sizing: border-box;\n padding: 0 10px;\n flex: 1 1 auto;\n min-height: 1px;\n\n &-6 {\n max-width: 50%;\n }\n\n .actions {\n margin-top: 27px;\n }\n }\n\n .fields-group:last-child,\n .fields-row__column.fields-group {\n margin-bottom: 0;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n margin-bottom: 0;\n\n &__column {\n max-width: none;\n }\n\n .fields-group:last-child,\n .fields-row__column.fields-group,\n .fields-row__column {\n margin-bottom: 25px;\n }\n }\n }\n\n .input.radio_buttons .radio label {\n margin-bottom: 5px;\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: block;\n width: auto;\n }\n\n .check_boxes {\n .checkbox {\n label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: inline-block;\n width: auto;\n position: relative;\n padding-top: 5px;\n padding-left: 25px;\n flex: 1 1 auto;\n }\n\n input[type=checkbox] {\n position: absolute;\n left: 0;\n top: 5px;\n margin: 0;\n }\n }\n }\n\n .input.static .label_input__wrapper {\n font-size: 16px;\n padding: 10px;\n border: 1px solid $dark-text-color;\n border-radius: 4px;\n }\n\n input[type=text],\n input[type=number],\n input[type=email],\n input[type=password],\n textarea {\n box-sizing: border-box;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n width: 100%;\n outline: 0;\n font-family: inherit;\n resize: vertical;\n background: darken($ui-base-color, 10%);\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n padding: 10px;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &:invalid {\n box-shadow: none;\n }\n\n &:focus:invalid:not(:placeholder-shown) {\n border-color: lighten($error-red, 12%);\n }\n\n &:required:valid {\n border-color: $valid-value-color;\n }\n\n &:hover {\n border-color: darken($ui-base-color, 20%);\n }\n\n &:active,\n &:focus {\n border-color: $highlight-text-color;\n background: darken($ui-base-color, 8%);\n }\n }\n\n .input.field_with_errors {\n label {\n color: lighten($error-red, 12%);\n }\n\n input[type=text],\n input[type=number],\n input[type=email],\n input[type=password],\n textarea,\n select {\n border-color: lighten($error-red, 12%);\n }\n\n .error {\n display: block;\n font-weight: 500;\n color: lighten($error-red, 12%);\n margin-top: 4px;\n }\n }\n\n .input.disabled {\n opacity: 0.5;\n }\n\n .actions {\n margin-top: 30px;\n display: flex;\n\n &.actions--top {\n margin-top: 0;\n margin-bottom: 30px;\n }\n }\n\n button,\n .button,\n .block-button {\n display: block;\n width: 100%;\n border: 0;\n border-radius: 4px;\n background: $ui-highlight-color;\n color: $primary-text-color;\n font-size: 18px;\n line-height: inherit;\n height: auto;\n padding: 10px;\n text-transform: uppercase;\n text-decoration: none;\n text-align: center;\n box-sizing: border-box;\n cursor: pointer;\n font-weight: 500;\n outline: 0;\n margin-bottom: 10px;\n margin-right: 10px;\n\n &:last-child {\n margin-right: 0;\n }\n\n &:hover {\n background-color: lighten($ui-highlight-color, 5%);\n }\n\n &:active,\n &:focus {\n background-color: darken($ui-highlight-color, 5%);\n }\n\n &:disabled:hover {\n background-color: $ui-primary-color;\n }\n\n &.negative {\n background: $error-value-color;\n\n &:hover {\n background-color: lighten($error-value-color, 5%);\n }\n\n &:active,\n &:focus {\n background-color: darken($error-value-color, 5%);\n }\n }\n }\n\n select {\n appearance: none;\n box-sizing: border-box;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n width: 100%;\n outline: 0;\n font-family: inherit;\n resize: vertical;\n background: darken($ui-base-color, 10%) url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center / auto 16px;\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n padding-left: 10px;\n padding-right: 30px;\n height: 41px;\n }\n\n h4 {\n margin-bottom: 15px !important;\n }\n\n .label_input {\n &__wrapper {\n position: relative;\n }\n\n &__append {\n position: absolute;\n right: 3px;\n top: 1px;\n padding: 10px;\n padding-bottom: 9px;\n font-size: 16px;\n color: $dark-text-color;\n font-family: inherit;\n pointer-events: none;\n cursor: default;\n max-width: 140px;\n white-space: nowrap;\n overflow: hidden;\n\n &::after {\n content: '';\n display: block;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 1px;\n width: 5px;\n background-image: linear-gradient(to right, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));\n }\n }\n }\n\n &__overlay-area {\n position: relative;\n\n &__blurred form {\n filter: blur(2px);\n }\n\n &__overlay {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n background: rgba($ui-base-color, 0.65);\n border-radius: 4px;\n margin-left: -4px;\n margin-top: -4px;\n padding: 4px;\n\n &__content {\n text-align: center;\n\n &.rich-formatting {\n &,\n p {\n color: $primary-text-color;\n }\n }\n }\n }\n }\n}\n\n.block-icon {\n display: block;\n margin: 0 auto;\n margin-bottom: 10px;\n font-size: 24px;\n}\n\n.flash-message {\n background: lighten($ui-base-color, 8%);\n color: $darker-text-color;\n border-radius: 4px;\n padding: 15px 10px;\n margin-bottom: 30px;\n text-align: center;\n\n &.notice {\n border: 1px solid rgba($valid-value-color, 0.5);\n background: rgba($valid-value-color, 0.25);\n color: $valid-value-color;\n }\n\n &.alert {\n border: 1px solid rgba($error-value-color, 0.5);\n background: rgba($error-value-color, 0.25);\n color: $error-value-color;\n }\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n\n &:hover {\n color: $primary-text-color;\n text-decoration: underline;\n }\n }\n\n p {\n margin-bottom: 15px;\n }\n\n .oauth-code {\n outline: 0;\n box-sizing: border-box;\n display: block;\n width: 100%;\n border: none;\n padding: 10px;\n font-family: $font-monospace, monospace;\n background: $ui-base-color;\n color: $primary-text-color;\n font-size: 14px;\n margin: 0;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n @media screen and (max-width: 740px) and (min-width: 441px) {\n margin-top: 40px;\n }\n}\n\n.form-footer {\n margin-top: 30px;\n text-align: center;\n\n a {\n color: $darker-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.quick-nav {\n list-style: none;\n margin-bottom: 25px;\n font-size: 14px;\n\n li {\n display: inline-block;\n margin-right: 10px;\n }\n\n a {\n color: $highlight-text-color;\n text-transform: uppercase;\n text-decoration: none;\n font-weight: 700;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($highlight-text-color, 8%);\n }\n }\n}\n\n.oauth-prompt,\n.follow-prompt {\n margin-bottom: 30px;\n color: $darker-text-color;\n\n h2 {\n font-size: 16px;\n margin-bottom: 30px;\n text-align: center;\n }\n\n strong {\n color: $secondary-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n @media screen and (max-width: 740px) and (min-width: 441px) {\n margin-top: 40px;\n }\n}\n\n.qr-wrapper {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n}\n\n.qr-code {\n flex: 0 0 auto;\n background: $simple-background-color;\n padding: 4px;\n margin: 0 10px 20px 0;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n display: inline-block;\n\n svg {\n display: block;\n margin: 0;\n }\n}\n\n.qr-alternative {\n margin-bottom: 20px;\n color: $secondary-text-color;\n flex: 150px;\n\n samp {\n display: block;\n font-size: 14px;\n }\n}\n\n.table-form {\n p {\n margin-bottom: 15px;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n }\n}\n\n.simple_form,\n.table-form {\n .warning {\n box-sizing: border-box;\n background: rgba($error-value-color, 0.5);\n color: $primary-text-color;\n text-shadow: 1px 1px 0 rgba($base-shadow-color, 0.3);\n box-shadow: 0 2px 6px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n padding: 10px;\n margin-bottom: 15px;\n\n a {\n color: $primary-text-color;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n strong {\n font-weight: 600;\n display: block;\n margin-bottom: 5px;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n\n .fa {\n font-weight: 400;\n }\n }\n }\n}\n\n.action-pagination {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n\n .actions,\n .pagination {\n flex: 1 1 auto;\n }\n\n .actions {\n padding: 30px 0;\n padding-right: 20px;\n flex: 0 0 auto;\n }\n}\n\n.post-follow-actions {\n text-align: center;\n color: $darker-text-color;\n\n div {\n margin-bottom: 4px;\n }\n}\n\n.alternative-login {\n margin-top: 20px;\n margin-bottom: 20px;\n\n h4 {\n font-size: 16px;\n color: $primary-text-color;\n text-align: center;\n margin-bottom: 20px;\n border: 0;\n padding: 0;\n }\n\n .button {\n display: block;\n }\n}\n\n.scope-danger {\n color: $warning-red;\n}\n\n.form_admin_settings_site_short_description,\n.form_admin_settings_site_description,\n.form_admin_settings_site_extended_description,\n.form_admin_settings_site_terms,\n.form_admin_settings_custom_css,\n.form_admin_settings_closed_registrations_message {\n textarea {\n font-family: $font-monospace, monospace;\n }\n}\n\n.input-copy {\n background: darken($ui-base-color, 10%);\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n display: flex;\n align-items: center;\n padding-right: 4px;\n position: relative;\n top: 1px;\n transition: border-color 300ms linear;\n\n &__wrapper {\n flex: 1 1 auto;\n }\n\n input[type=text] {\n background: transparent;\n border: 0;\n padding: 10px;\n font-size: 14px;\n font-family: $font-monospace, monospace;\n }\n\n button {\n flex: 0 0 auto;\n margin: 4px;\n text-transform: none;\n font-weight: 400;\n font-size: 14px;\n padding: 7px 18px;\n padding-bottom: 6px;\n width: auto;\n transition: background 300ms linear;\n }\n\n &.copied {\n border-color: $valid-value-color;\n transition: none;\n\n button {\n background: $valid-value-color;\n transition: none;\n }\n }\n}\n\n.connection-prompt {\n margin-bottom: 25px;\n\n .fa-link {\n background-color: darken($ui-base-color, 4%);\n border-radius: 100%;\n font-size: 24px;\n padding: 10px;\n }\n\n &__column {\n align-items: center;\n display: flex;\n flex: 1;\n flex-direction: column;\n flex-shrink: 1;\n max-width: 50%;\n\n &-sep {\n align-self: center;\n flex-grow: 0;\n overflow: visible;\n position: relative;\n z-index: 1;\n }\n\n p {\n word-break: break-word;\n }\n }\n\n .account__avatar {\n margin-bottom: 20px;\n }\n\n &__connection {\n background-color: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n padding: 25px 10px;\n position: relative;\n text-align: center;\n\n &::after {\n background-color: darken($ui-base-color, 4%);\n content: '';\n display: block;\n height: 100%;\n left: 50%;\n position: absolute;\n top: 0;\n width: 1px;\n }\n }\n\n &__row {\n align-items: flex-start;\n display: flex;\n flex-direction: row;\n }\n}\n",".card {\n & > a {\n display: block;\n text-decoration: none;\n color: inherit;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n box-shadow: none;\n }\n\n &:hover,\n &:active,\n &:focus {\n .card__bar {\n background: lighten($ui-base-color, 8%);\n }\n }\n }\n\n &__img {\n height: 130px;\n position: relative;\n background: darken($ui-base-color, 12%);\n border-radius: 4px 4px 0 0;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n object-fit: cover;\n border-radius: 4px 4px 0 0;\n }\n\n @media screen and (max-width: 600px) {\n height: 200px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n\n &__bar {\n position: relative;\n padding: 15px;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n\n .avatar {\n flex: 0 0 auto;\n width: 48px;\n height: 48px;\n @include avatar-size(48px);\n padding-top: 2px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n @include avatar-radius();\n background: darken($ui-base-color, 8%);\n object-fit: cover;\n }\n }\n\n .display-name {\n margin-left: 15px;\n text-align: left;\n\n strong {\n font-size: 15px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n span {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n}\n\n.pagination {\n padding: 30px 0;\n text-align: center;\n overflow: hidden;\n\n a,\n .current,\n .newer,\n .older,\n .page,\n .gap {\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 500;\n display: inline-block;\n padding: 6px 10px;\n text-decoration: none;\n }\n\n .current {\n background: $simple-background-color;\n border-radius: 100px;\n color: $inverted-text-color;\n cursor: default;\n margin: 0 10px;\n }\n\n .gap {\n cursor: default;\n }\n\n .older,\n .newer {\n text-transform: uppercase;\n color: $secondary-text-color;\n }\n\n .older {\n float: left;\n padding-left: 0;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n .newer {\n float: right;\n padding-right: 0;\n\n .fa {\n display: inline-block;\n margin-left: 5px;\n }\n }\n\n .disabled {\n cursor: default;\n color: lighten($inverted-text-color, 10%);\n }\n\n @media screen and (max-width: 700px) {\n padding: 30px 20px;\n\n .page {\n display: none;\n }\n\n .newer,\n .older {\n display: inline-block;\n }\n }\n}\n\n.nothing-here {\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n color: $light-text-color;\n font-size: 14px;\n font-weight: 500;\n text-align: center;\n display: flex;\n justify-content: center;\n align-items: center;\n cursor: default;\n border-radius: 4px;\n padding: 20px;\n min-height: 30vh;\n\n &--under-tabs {\n border-radius: 0 0 4px 4px;\n }\n\n &--flexible {\n box-sizing: border-box;\n min-height: 100%;\n }\n}\n\n.account-role,\n.simple_form .recommended {\n display: inline-block;\n padding: 4px 6px;\n cursor: default;\n border-radius: 3px;\n font-size: 12px;\n line-height: 12px;\n font-weight: 500;\n color: $ui-secondary-color;\n background-color: rgba($ui-secondary-color, 0.1);\n border: 1px solid rgba($ui-secondary-color, 0.5);\n\n &.moderator {\n color: $success-green;\n background-color: rgba($success-green, 0.1);\n border-color: rgba($success-green, 0.5);\n }\n\n &.admin {\n color: lighten($error-red, 12%);\n background-color: rgba(lighten($error-red, 12%), 0.1);\n border-color: rgba(lighten($error-red, 12%), 0.5);\n }\n}\n\n.account__header__fields {\n max-width: 100vw;\n padding: 0;\n margin: 15px -15px -15px;\n border: 0 none;\n border-top: 1px solid lighten($ui-base-color, 12%);\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n font-size: 14px;\n line-height: 20px;\n\n dl {\n display: flex;\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n }\n\n dt,\n dd {\n box-sizing: border-box;\n padding: 14px;\n text-align: center;\n max-height: 48px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n dt {\n font-weight: 500;\n width: 120px;\n flex: 0 0 auto;\n color: $secondary-text-color;\n background: rgba(darken($ui-base-color, 8%), 0.5);\n }\n\n dd {\n flex: 1 1 auto;\n color: $darker-text-color;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n\n .verified {\n border: 1px solid rgba($valid-value-color, 0.5);\n background: rgba($valid-value-color, 0.25);\n\n a {\n color: $valid-value-color;\n font-weight: 500;\n }\n\n &__mark {\n color: $valid-value-color;\n }\n }\n\n dl:last-child {\n border-bottom: 0;\n }\n}\n\n.directory__tag .trends__item__current {\n width: auto;\n}\n\n.pending-account {\n &__header {\n color: $darker-text-color;\n\n a {\n color: $ui-secondary-color;\n text-decoration: none;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n\n strong {\n color: $primary-text-color;\n font-weight: 700;\n }\n }\n\n &__body {\n margin-top: 10px;\n }\n}\n",".activity-stream {\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n overflow: hidden;\n margin-bottom: 10px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n border-radius: 0;\n box-shadow: none;\n }\n\n &--headless {\n border-radius: 0;\n margin: 0;\n box-shadow: none;\n\n .detailed-status,\n .status {\n border-radius: 0 !important;\n }\n }\n\n div[data-component] {\n width: 100%;\n }\n\n .entry {\n background: $ui-base-color;\n\n .detailed-status,\n .status,\n .load-more {\n animation: none;\n }\n\n &:last-child {\n .detailed-status,\n .status,\n .load-more {\n border-bottom: 0;\n border-radius: 0 0 4px 4px;\n }\n }\n\n &:first-child {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 4px 4px 0 0;\n }\n\n &:last-child {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 4px;\n }\n }\n }\n\n @media screen and (max-width: 740px) {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 0 !important;\n }\n }\n }\n\n &--highlighted .entry {\n background: lighten($ui-base-color, 8%);\n }\n}\n\n.button.logo-button {\n flex: 0 auto;\n font-size: 14px;\n background: $ui-highlight-color;\n color: $primary-text-color;\n text-transform: none;\n line-height: 36px;\n height: auto;\n padding: 3px 15px;\n border: 0;\n\n svg {\n width: 20px;\n height: auto;\n vertical-align: middle;\n margin-right: 5px;\n fill: $primary-text-color;\n }\n\n &:active,\n &:focus,\n &:hover {\n background: lighten($ui-highlight-color, 10%);\n }\n\n &:disabled,\n &.disabled {\n &:active,\n &:focus,\n &:hover {\n background: $ui-primary-color;\n }\n }\n\n &.button--destructive {\n &:active,\n &:focus,\n &:hover {\n background: $error-red;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n svg {\n display: none;\n }\n }\n}\n\n.embed,\n.public-layout {\n .detailed-status {\n padding: 15px;\n }\n\n .status {\n padding: 15px 15px 15px (48px + 15px * 2);\n min-height: 48px + 2px;\n\n &__avatar {\n left: 15px;\n top: 17px;\n }\n\n &__content {\n padding-top: 5px;\n }\n\n &__prepend {\n padding: 8px 0;\n padding-bottom: 2px;\n margin: initial;\n margin-left: 48px + 15px * 2;\n padding-top: 15px;\n }\n\n &__prepend-icon-wrapper {\n position: absolute;\n margin: initial;\n float: initial;\n width: auto;\n left: -32px;\n }\n\n .media-gallery,\n &__action-bar,\n .video-player {\n margin-top: 10px;\n }\n }\n}\n\n// Styling from upstream's WebUI, as public pages use the same layout\n.embed,\n.public-layout {\n .status {\n .status__info {\n font-size: 15px;\n display: initial;\n }\n\n .status__relative-time {\n color: $dark-text-color;\n float: right;\n font-size: 14px;\n width: auto;\n margin: initial;\n padding: initial;\n }\n\n .status__info .status__display-name {\n display: block;\n max-width: 100%;\n padding: 6px 0;\n padding-right: 25px;\n margin: initial;\n\n .display-name strong {\n display: inline;\n }\n }\n\n .status__avatar {\n height: 48px;\n position: absolute;\n width: 48px;\n margin: initial;\n }\n }\n}\n\n.rtl {\n .embed,\n .public-layout {\n .status {\n padding-left: 10px;\n padding-right: 68px;\n\n .status__info .status__display-name {\n padding-left: 25px;\n padding-right: 0;\n }\n\n .status__relative-time {\n float: left;\n }\n }\n }\n}\n",".app-body {\n -webkit-overflow-scrolling: touch;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n}\n\n.link-button {\n display: block;\n font-size: 15px;\n line-height: 20px;\n color: $ui-highlight-color;\n border: 0;\n background: transparent;\n padding: 0;\n cursor: pointer;\n\n &:hover,\n &:active {\n text-decoration: underline;\n }\n\n &:disabled {\n color: $ui-primary-color;\n cursor: default;\n }\n}\n\n.button {\n background-color: darken($ui-highlight-color, 3%);\n border: 10px none;\n border-radius: 4px;\n box-sizing: border-box;\n color: $primary-text-color;\n cursor: pointer;\n display: inline-block;\n font-family: inherit;\n font-size: 14px;\n font-weight: 500;\n height: 36px;\n letter-spacing: 0;\n line-height: 36px;\n overflow: hidden;\n padding: 0 16px;\n position: relative;\n text-align: center;\n text-transform: uppercase;\n text-decoration: none;\n text-overflow: ellipsis;\n transition: all 100ms ease-in;\n transition-property: background-color;\n white-space: nowrap;\n width: auto;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-highlight-color, 7%);\n transition: all 200ms ease-out;\n transition-property: background-color;\n }\n\n &--destructive {\n transition: none;\n\n &:active,\n &:focus,\n &:hover {\n background-color: $error-red;\n transition: none;\n }\n }\n\n &:disabled {\n background-color: $ui-primary-color;\n cursor: default;\n }\n\n &.button-primary,\n &.button-alternative,\n &.button-secondary,\n &.button-alternative-2 {\n font-size: 16px;\n line-height: 36px;\n height: auto;\n text-transform: none;\n padding: 4px 16px;\n }\n\n &.button-alternative {\n color: $inverted-text-color;\n background: $ui-primary-color;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-primary-color, 4%);\n }\n }\n\n &.button-alternative-2 {\n background: $ui-base-lighter-color;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-base-lighter-color, 4%);\n }\n }\n\n &.button-secondary {\n font-size: 16px;\n line-height: 36px;\n height: auto;\n color: $darker-text-color;\n text-transform: none;\n background: transparent;\n padding: 3px 15px;\n border-radius: 4px;\n border: 1px solid $ui-primary-color;\n\n &:active,\n &:focus,\n &:hover {\n border-color: lighten($ui-primary-color, 4%);\n color: lighten($darker-text-color, 4%);\n }\n\n &:disabled {\n opacity: 0.5;\n }\n }\n\n &.button--block {\n display: block;\n width: 100%;\n }\n}\n\n.icon-button {\n display: inline-block;\n padding: 0;\n color: $action-button-color;\n border: 0;\n border-radius: 4px;\n background: transparent;\n cursor: pointer;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($action-button-color, 7%);\n background-color: rgba($action-button-color, 0.15);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n }\n\n &:focus {\n background-color: rgba($action-button-color, 0.3);\n }\n\n &.disabled {\n color: darken($action-button-color, 13%);\n background-color: transparent;\n cursor: default;\n }\n\n &.active {\n color: $highlight-text-color;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &.inverted {\n color: $lighter-text-color;\n\n &:hover,\n &:active,\n &:focus {\n color: darken($lighter-text-color, 7%);\n background-color: rgba($lighter-text-color, 0.15);\n }\n\n &:focus {\n background-color: rgba($lighter-text-color, 0.3);\n }\n\n &.disabled {\n color: lighten($lighter-text-color, 7%);\n background-color: transparent;\n }\n\n &.active {\n color: $highlight-text-color;\n\n &.disabled {\n color: lighten($highlight-text-color, 13%);\n }\n }\n }\n\n &.overlayed {\n box-sizing: content-box;\n background: rgba($base-overlay-background, 0.6);\n color: rgba($primary-text-color, 0.7);\n border-radius: 4px;\n padding: 2px;\n\n &:hover {\n background: rgba($base-overlay-background, 0.9);\n }\n }\n}\n\n.text-icon-button {\n color: $lighter-text-color;\n border: 0;\n border-radius: 4px;\n background: transparent;\n cursor: pointer;\n font-weight: 600;\n font-size: 11px;\n padding: 0 3px;\n line-height: 27px;\n outline: 0;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &:hover,\n &:active,\n &:focus {\n color: darken($lighter-text-color, 7%);\n background-color: rgba($lighter-text-color, 0.15);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n }\n\n &:focus {\n background-color: rgba($lighter-text-color, 0.3);\n }\n\n &.disabled {\n color: lighten($lighter-text-color, 20%);\n background-color: transparent;\n cursor: default;\n }\n\n &.active {\n color: $highlight-text-color;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n}\n\n.dropdown-menu {\n position: absolute;\n transform-origin: 50% 0;\n}\n\n.invisible {\n font-size: 0;\n line-height: 0;\n display: inline-block;\n width: 0;\n height: 0;\n position: absolute;\n\n img,\n svg {\n margin: 0 !important;\n border: 0 !important;\n padding: 0 !important;\n width: 0 !important;\n height: 0 !important;\n }\n}\n\n.ellipsis {\n &::after {\n content: \"…\";\n }\n}\n\n.notification__favourite-icon-wrapper {\n left: 0;\n position: absolute;\n\n .fa.star-icon {\n color: $gold-star;\n }\n}\n\n.star-icon.active {\n color: $gold-star;\n}\n\n.bookmark-icon.active {\n color: $red-bookmark;\n}\n\n.no-reduce-motion .icon-button.star-icon {\n &.activate {\n & > .fa-star {\n animation: spring-rotate-in 1s linear;\n }\n }\n\n &.deactivate {\n & > .fa-star {\n animation: spring-rotate-out 1s linear;\n }\n }\n}\n\n.notification__display-name {\n color: inherit;\n font-weight: 500;\n text-decoration: none;\n\n &:hover {\n color: $primary-text-color;\n text-decoration: underline;\n }\n}\n\n.display-name {\n display: block;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n a {\n color: inherit;\n text-decoration: inherit;\n }\n\n strong {\n height: 18px;\n font-size: 16px;\n font-weight: 500;\n line-height: 18px;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n }\n\n span {\n display: block;\n height: 18px;\n font-size: 15px;\n line-height: 18px;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n }\n\n > a:hover {\n strong {\n text-decoration: underline;\n }\n }\n\n &.inline {\n padding: 0;\n height: 18px;\n font-size: 15px;\n line-height: 18px;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n\n strong {\n display: inline;\n height: auto;\n font-size: inherit;\n line-height: inherit;\n }\n\n span {\n display: inline;\n height: auto;\n font-size: inherit;\n line-height: inherit;\n }\n }\n}\n\n.display-name__html {\n font-weight: 500;\n}\n\n.display-name__account {\n font-size: 14px;\n}\n\n.image-loader {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n\n .image-loader__preview-canvas {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n background: url('~images/void.png') repeat;\n object-fit: contain;\n }\n\n .loading-bar {\n position: relative;\n }\n\n &.image-loader--amorphous .image-loader__preview-canvas {\n display: none;\n }\n}\n\n.zoomable-image {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n img {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n width: auto;\n height: auto;\n object-fit: contain;\n }\n}\n\n.dropdown {\n display: inline-block;\n}\n\n.dropdown__content {\n display: none;\n position: absolute;\n}\n\n.dropdown-menu__separator {\n border-bottom: 1px solid darken($ui-secondary-color, 8%);\n margin: 5px 7px 6px;\n height: 0;\n}\n\n.dropdown-menu {\n background: $ui-secondary-color;\n padding: 4px 0;\n border-radius: 4px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n\n ul {\n list-style: none;\n }\n}\n\n.dropdown-menu__arrow {\n position: absolute;\n width: 0;\n height: 0;\n border: 0 solid transparent;\n\n &.left {\n right: -5px;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: $ui-secondary-color;\n }\n\n &.top {\n bottom: -5px;\n margin-left: -7px;\n border-width: 5px 7px 0;\n border-top-color: $ui-secondary-color;\n }\n\n &.bottom {\n top: -5px;\n margin-left: -7px;\n border-width: 0 7px 5px;\n border-bottom-color: $ui-secondary-color;\n }\n\n &.right {\n left: -5px;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: $ui-secondary-color;\n }\n}\n\n.dropdown-menu__item {\n a {\n font-size: 13px;\n line-height: 18px;\n display: block;\n padding: 4px 14px;\n box-sizing: border-box;\n text-decoration: none;\n background: $ui-secondary-color;\n color: $inverted-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:focus,\n &:hover,\n &:active {\n background: $ui-highlight-color;\n color: $secondary-text-color;\n outline: 0;\n }\n }\n}\n\n.dropdown--active .dropdown__content {\n display: block;\n line-height: 18px;\n max-width: 311px;\n right: 0;\n text-align: left;\n z-index: 9999;\n\n & > ul {\n list-style: none;\n background: $ui-secondary-color;\n padding: 4px 0;\n border-radius: 4px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.4);\n min-width: 140px;\n position: relative;\n }\n\n &.dropdown__right {\n right: 0;\n }\n\n &.dropdown__left {\n & > ul {\n left: -98px;\n }\n }\n\n & > ul > li > a {\n font-size: 13px;\n line-height: 18px;\n display: block;\n padding: 4px 14px;\n box-sizing: border-box;\n text-decoration: none;\n background: $ui-secondary-color;\n color: $inverted-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:focus {\n outline: 0;\n }\n\n &:hover {\n background: $ui-highlight-color;\n color: $secondary-text-color;\n }\n }\n}\n\n.dropdown__icon {\n vertical-align: middle;\n}\n\n.static-content {\n padding: 10px;\n padding-top: 20px;\n color: $dark-text-color;\n\n h1 {\n font-size: 16px;\n font-weight: 500;\n margin-bottom: 40px;\n text-align: center;\n }\n\n p {\n font-size: 13px;\n margin-bottom: 20px;\n }\n}\n\n.column,\n.drawer {\n flex: 1 1 100%;\n overflow: hidden;\n}\n\n@media screen and (min-width: 631px) {\n .columns-area {\n padding: 0;\n }\n\n .column,\n .drawer {\n flex: 0 0 auto;\n padding: 10px;\n padding-left: 5px;\n padding-right: 5px;\n\n &:first-child {\n padding-left: 10px;\n }\n\n &:last-child {\n padding-right: 10px;\n }\n }\n\n .columns-area > div {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n }\n }\n}\n\n.tabs-bar {\n box-sizing: border-box;\n display: flex;\n background: lighten($ui-base-color, 8%);\n flex: 0 0 auto;\n overflow-y: auto;\n}\n\n.tabs-bar__link {\n display: block;\n flex: 1 1 auto;\n padding: 15px 10px;\n padding-bottom: 13px;\n color: $primary-text-color;\n text-decoration: none;\n text-align: center;\n font-size: 14px;\n font-weight: 500;\n border-bottom: 2px solid lighten($ui-base-color, 8%);\n transition: all 50ms linear;\n transition-property: border-bottom, background, color;\n\n .fa {\n font-weight: 400;\n font-size: 16px;\n }\n\n &:hover,\n &:focus,\n &:active {\n @include multi-columns('screen and (min-width: 631px)') {\n background: lighten($ui-base-color, 14%);\n border-bottom-color: lighten($ui-base-color, 14%);\n }\n }\n\n &.active {\n border-bottom: 2px solid $ui-highlight-color;\n color: $highlight-text-color;\n }\n\n span {\n margin-left: 5px;\n display: none;\n }\n\n span.icon {\n margin-left: 0;\n display: inline;\n }\n}\n\n.icon-with-badge {\n position: relative;\n\n &__badge {\n position: absolute;\n left: 9px;\n top: -13px;\n background: $ui-highlight-color;\n border: 2px solid lighten($ui-base-color, 8%);\n padding: 1px 6px;\n border-radius: 6px;\n font-size: 10px;\n font-weight: 500;\n line-height: 14px;\n color: $primary-text-color;\n }\n}\n\n.column-link--transparent .icon-with-badge__badge {\n border-color: darken($ui-base-color, 8%);\n}\n\n.scrollable {\n overflow-y: scroll;\n overflow-x: hidden;\n flex: 1 1 auto;\n -webkit-overflow-scrolling: touch;\n\n &.optionally-scrollable {\n overflow-y: auto;\n }\n\n @supports(display: grid) { // hack to fix Chrome <57\n contain: strict;\n }\n\n &--flex {\n display: flex;\n flex-direction: column;\n }\n\n &__append {\n flex: 1 1 auto;\n position: relative;\n min-height: 120px;\n }\n}\n\n.scrollable.fullscreen {\n @supports(display: grid) { // hack to fix Chrome <57\n contain: none;\n }\n}\n\n.react-toggle {\n display: inline-block;\n position: relative;\n cursor: pointer;\n background-color: transparent;\n border: 0;\n padding: 0;\n user-select: none;\n -webkit-tap-highlight-color: rgba($base-overlay-background, 0);\n -webkit-tap-highlight-color: transparent;\n}\n\n.react-toggle-screenreader-only {\n border: 0;\n clip: rect(0 0 0 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n}\n\n.react-toggle--disabled {\n cursor: not-allowed;\n opacity: 0.5;\n transition: opacity 0.25s;\n}\n\n.react-toggle-track {\n width: 50px;\n height: 24px;\n padding: 0;\n border-radius: 30px;\n background-color: $ui-base-color;\n transition: background-color 0.2s ease;\n}\n\n.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track {\n background-color: darken($ui-base-color, 10%);\n}\n\n.react-toggle--checked .react-toggle-track {\n background-color: $ui-highlight-color;\n}\n\n.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track {\n background-color: lighten($ui-highlight-color, 10%);\n}\n\n.react-toggle-track-check {\n position: absolute;\n width: 14px;\n height: 10px;\n top: 0;\n bottom: 0;\n margin-top: auto;\n margin-bottom: auto;\n line-height: 0;\n left: 8px;\n opacity: 0;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle--checked .react-toggle-track-check {\n opacity: 1;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle-track-x {\n position: absolute;\n width: 10px;\n height: 10px;\n top: 0;\n bottom: 0;\n margin-top: auto;\n margin-bottom: auto;\n line-height: 0;\n right: 10px;\n opacity: 1;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle--checked .react-toggle-track-x {\n opacity: 0;\n}\n\n.react-toggle-thumb {\n position: absolute;\n top: 1px;\n left: 1px;\n width: 22px;\n height: 22px;\n border: 1px solid $ui-base-color;\n border-radius: 50%;\n background-color: darken($simple-background-color, 2%);\n box-sizing: border-box;\n transition: all 0.25s ease;\n transition-property: border-color, left;\n}\n\n.react-toggle--checked .react-toggle-thumb {\n left: 27px;\n border-color: $ui-highlight-color;\n}\n\n.getting-started__wrapper,\n.getting_started,\n.flex-spacer {\n background: $ui-base-color;\n}\n\n.getting-started__wrapper {\n position: relative;\n overflow-y: auto;\n}\n\n.flex-spacer {\n flex: 1 1 auto;\n}\n\n.getting-started {\n background: $ui-base-color;\n flex: 1 0 auto;\n\n p {\n color: $secondary-text-color;\n }\n\n a {\n color: $dark-text-color;\n }\n\n &__panel {\n height: min-content;\n }\n\n &__panel,\n &__footer {\n padding: 10px;\n padding-top: 20px;\n flex: 0 1 auto;\n\n ul {\n margin-bottom: 10px;\n }\n\n ul li {\n display: inline;\n }\n\n p {\n color: $dark-text-color;\n font-size: 13px;\n\n a {\n color: $dark-text-color;\n text-decoration: underline;\n }\n }\n\n a {\n text-decoration: none;\n color: $darker-text-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n }\n\n &__trends {\n flex: 0 1 auto;\n opacity: 1;\n animation: fade 150ms linear;\n margin-top: 10px;\n\n h4 {\n font-size: 12px;\n text-transform: uppercase;\n color: $darker-text-color;\n padding: 10px;\n font-weight: 500;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n @media screen and (max-height: 810px) {\n .trends__item:nth-child(3) {\n display: none;\n }\n }\n\n @media screen and (max-height: 720px) {\n .trends__item:nth-child(2) {\n display: none;\n }\n }\n\n @media screen and (max-height: 670px) {\n display: none;\n }\n\n .trends__item {\n border-bottom: 0;\n padding: 10px;\n\n &__current {\n color: $darker-text-color;\n }\n }\n }\n}\n\n.column-link__badge {\n display: inline-block;\n border-radius: 4px;\n font-size: 12px;\n line-height: 19px;\n font-weight: 500;\n background: $ui-base-color;\n padding: 4px 8px;\n margin: -6px 10px;\n}\n\n.keyboard-shortcuts {\n padding: 8px 0 0;\n overflow: hidden;\n\n thead {\n position: absolute;\n left: -9999px;\n }\n\n td {\n padding: 0 10px 8px;\n }\n\n kbd {\n display: inline-block;\n padding: 3px 5px;\n background-color: lighten($ui-base-color, 8%);\n border: 1px solid darken($ui-base-color, 4%);\n }\n}\n\n.setting-text {\n color: $darker-text-color;\n background: transparent;\n border: none;\n border-bottom: 2px solid $ui-primary-color;\n box-sizing: border-box;\n display: block;\n font-family: inherit;\n margin-bottom: 10px;\n padding: 7px 0;\n width: 100%;\n\n &:focus,\n &:active {\n color: $primary-text-color;\n border-bottom-color: $ui-highlight-color;\n }\n\n @include limited-single-column('screen and (max-width: 600px)') {\n font-size: 16px;\n }\n\n &.light {\n color: $inverted-text-color;\n border-bottom: 2px solid lighten($ui-base-color, 27%);\n\n &:focus,\n &:active {\n color: $inverted-text-color;\n border-bottom-color: $ui-highlight-color;\n }\n }\n}\n\n.no-reduce-motion button.icon-button i.fa-retweet {\n background-position: 0 0;\n height: 19px;\n transition: background-position 0.9s steps(10);\n transition-duration: 0s;\n vertical-align: middle;\n width: 22px;\n\n &::before {\n display: none !important;\n }\n}\n\n.no-reduce-motion button.icon-button.active i.fa-retweet {\n transition-duration: 0.9s;\n background-position: 0 100%;\n}\n\n.reduce-motion button.icon-button i.fa-retweet {\n color: $action-button-color;\n transition: color 100ms ease-in;\n}\n\n.reduce-motion button.icon-button.active i.fa-retweet {\n color: $highlight-text-color;\n}\n\n.reduce-motion button.icon-button.disabled i.fa-retweet {\n color: darken($action-button-color, 13%);\n}\n\n.load-more {\n display: block;\n color: $dark-text-color;\n background-color: transparent;\n border: 0;\n font-size: inherit;\n text-align: center;\n line-height: inherit;\n margin: 0;\n padding: 15px;\n box-sizing: border-box;\n width: 100%;\n clear: both;\n text-decoration: none;\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n}\n\n.load-gap {\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n}\n\n.missing-indicator {\n padding-top: 20px + 48px;\n}\n\n.scrollable > div > :first-child .notification__dismiss-overlay > .wrappy {\n border-top: 1px solid $ui-base-color;\n}\n\n.notification__dismiss-overlay {\n overflow: hidden;\n position: absolute;\n top: 0;\n right: 0;\n bottom: -1px;\n padding-left: 15px; // space for the box shadow to be visible\n\n z-index: 999;\n align-items: center;\n justify-content: flex-end;\n cursor: pointer;\n\n display: flex;\n\n .wrappy {\n width: $dismiss-overlay-width;\n align-self: stretch;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background: lighten($ui-base-color, 8%);\n border-left: 1px solid lighten($ui-base-color, 20%);\n box-shadow: 0 0 5px black;\n border-bottom: 1px solid $ui-base-color;\n }\n\n .ckbox {\n border: 2px solid $ui-primary-color;\n border-radius: 2px;\n width: 30px;\n height: 30px;\n font-size: 20px;\n color: $darker-text-color;\n text-shadow: 0 0 5px black;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n &:focus {\n outline: 0 !important;\n\n .ckbox {\n box-shadow: 0 0 1px 1px $ui-highlight-color;\n }\n }\n}\n\n.text-btn {\n display: inline-block;\n padding: 0;\n font-family: inherit;\n font-size: inherit;\n color: inherit;\n border: 0;\n background: transparent;\n cursor: pointer;\n}\n\n.loading-indicator {\n color: $dark-text-color;\n font-size: 12px;\n font-weight: 400;\n text-transform: uppercase;\n overflow: visible;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n\n span {\n display: block;\n float: left;\n margin-left: 50%;\n transform: translateX(-50%);\n margin: 82px 0 0 50%;\n white-space: nowrap;\n }\n}\n\n.loading-indicator__figure {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 42px;\n height: 42px;\n box-sizing: border-box;\n background-color: transparent;\n border: 0 solid lighten($ui-base-color, 26%);\n border-width: 6px;\n border-radius: 50%;\n}\n\n.no-reduce-motion .loading-indicator span {\n animation: loader-label 1.15s infinite cubic-bezier(0.215, 0.610, 0.355, 1.000);\n}\n\n.no-reduce-motion .loading-indicator__figure {\n animation: loader-figure 1.15s infinite cubic-bezier(0.215, 0.610, 0.355, 1.000);\n}\n\n@keyframes spring-rotate-in {\n 0% {\n transform: rotate(0deg);\n }\n\n 30% {\n transform: rotate(-484.8deg);\n }\n\n 60% {\n transform: rotate(-316.7deg);\n }\n\n 90% {\n transform: rotate(-375deg);\n }\n\n 100% {\n transform: rotate(-360deg);\n }\n}\n\n@keyframes spring-rotate-out {\n 0% {\n transform: rotate(-360deg);\n }\n\n 30% {\n transform: rotate(124.8deg);\n }\n\n 60% {\n transform: rotate(-43.27deg);\n }\n\n 90% {\n transform: rotate(15deg);\n }\n\n 100% {\n transform: rotate(0deg);\n }\n}\n\n@keyframes loader-figure {\n 0% {\n width: 0;\n height: 0;\n background-color: lighten($ui-base-color, 26%);\n }\n\n 29% {\n background-color: lighten($ui-base-color, 26%);\n }\n\n 30% {\n width: 42px;\n height: 42px;\n background-color: transparent;\n border-width: 21px;\n opacity: 1;\n }\n\n 100% {\n width: 42px;\n height: 42px;\n border-width: 0;\n opacity: 0;\n background-color: transparent;\n }\n}\n\n@keyframes loader-label {\n 0% { opacity: 0.25; }\n 30% { opacity: 1; }\n 100% { opacity: 0.25; }\n}\n\n.spoiler-button {\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n position: absolute;\n z-index: 100;\n\n &--minified {\n display: flex;\n left: 4px;\n top: 4px;\n width: auto;\n height: auto;\n align-items: center;\n }\n\n &--click-thru {\n pointer-events: none;\n }\n\n &--hidden {\n display: none;\n }\n\n &__overlay {\n display: block;\n background: transparent;\n width: 100%;\n height: 100%;\n border: 0;\n\n &__label {\n display: inline-block;\n background: rgba($base-overlay-background, 0.5);\n border-radius: 8px;\n padding: 8px 12px;\n color: $primary-text-color;\n font-weight: 500;\n font-size: 14px;\n }\n\n &:hover,\n &:focus,\n &:active {\n .spoiler-button__overlay__label {\n background: rgba($base-overlay-background, 0.8);\n }\n }\n\n &:disabled {\n .spoiler-button__overlay__label {\n background: rgba($base-overlay-background, 0.5);\n }\n }\n }\n}\n\n.setting-toggle {\n display: block;\n line-height: 24px;\n}\n\n.setting-toggle__label,\n.setting-radio__label,\n.setting-meta__label {\n color: $darker-text-color;\n display: inline-block;\n margin-bottom: 14px;\n margin-left: 8px;\n vertical-align: middle;\n}\n\n.setting-radio {\n display: block;\n line-height: 18px;\n}\n\n.setting-radio__label {\n margin-bottom: 0;\n}\n\n.column-settings__row legend {\n color: $darker-text-color;\n cursor: default;\n display: block;\n font-weight: 500;\n margin-top: 10px;\n}\n\n.setting-radio__input {\n vertical-align: middle;\n}\n\n.setting-meta__label {\n float: right;\n}\n\n@keyframes heartbeat {\n from {\n transform: scale(1);\n transform-origin: center center;\n animation-timing-function: ease-out;\n }\n\n 10% {\n transform: scale(0.91);\n animation-timing-function: ease-in;\n }\n\n 17% {\n transform: scale(0.98);\n animation-timing-function: ease-out;\n }\n\n 33% {\n transform: scale(0.87);\n animation-timing-function: ease-in;\n }\n\n 45% {\n transform: scale(1);\n animation-timing-function: ease-out;\n }\n}\n\n.pulse-loading {\n animation: heartbeat 1.5s ease-in-out infinite both;\n}\n\n.upload-area {\n align-items: center;\n background: rgba($base-overlay-background, 0.8);\n display: flex;\n height: 100%;\n justify-content: center;\n left: 0;\n opacity: 0;\n position: absolute;\n top: 0;\n visibility: hidden;\n width: 100%;\n z-index: 2000;\n\n * {\n pointer-events: none;\n }\n}\n\n.upload-area__drop {\n width: 320px;\n height: 160px;\n display: flex;\n box-sizing: border-box;\n position: relative;\n padding: 8px;\n}\n\n.upload-area__background {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: -1;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 5px rgba($base-shadow-color, 0.2);\n}\n\n.upload-area__content {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: $secondary-text-color;\n font-size: 18px;\n font-weight: 500;\n border: 2px dashed $ui-base-lighter-color;\n border-radius: 4px;\n}\n\n.dropdown--active .emoji-button img {\n opacity: 1;\n filter: none;\n}\n\n.loading-bar {\n background-color: $ui-highlight-color;\n height: 3px;\n position: absolute;\n top: 0;\n left: 0;\n z-index: 9999;\n}\n\n.icon-badge-wrapper {\n position: relative;\n}\n\n.icon-badge {\n position: absolute;\n display: block;\n right: -.25em;\n top: -.25em;\n background-color: $ui-highlight-color;\n border-radius: 50%;\n font-size: 75%;\n width: 1em;\n height: 1em;\n}\n\n.conversation {\n display: flex;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n padding: 5px;\n padding-bottom: 0;\n\n &:focus {\n background: lighten($ui-base-color, 2%);\n outline: 0;\n }\n\n &__avatar {\n flex: 0 0 auto;\n padding: 10px;\n padding-top: 12px;\n position: relative;\n }\n\n &__unread {\n display: inline-block;\n background: $highlight-text-color;\n border-radius: 50%;\n width: 0.625rem;\n height: 0.625rem;\n margin: -.1ex .15em .1ex;\n }\n\n &__content {\n flex: 1 1 auto;\n padding: 10px 5px;\n padding-right: 15px;\n overflow: hidden;\n\n &__info {\n overflow: hidden;\n display: flex;\n flex-direction: row-reverse;\n justify-content: space-between;\n }\n\n &__relative-time {\n font-size: 15px;\n color: $darker-text-color;\n padding-left: 15px;\n }\n\n &__names {\n color: $darker-text-color;\n font-size: 15px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-bottom: 4px;\n flex-basis: 90px;\n flex-grow: 1;\n\n a {\n color: $primary-text-color;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n }\n\n .status__content {\n margin: 0;\n }\n }\n\n &--unread {\n background: lighten($ui-base-color, 2%);\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n .conversation__content__info {\n font-weight: 700;\n }\n\n .conversation__content__relative-time {\n color: $primary-text-color;\n }\n }\n}\n\n.ui .flash-message {\n margin-top: 10px;\n margin-left: auto;\n margin-right: auto;\n margin-bottom: 0;\n min-width: 75%;\n}\n\n::-webkit-scrollbar-thumb {\n border-radius: 0;\n}\n\nnoscript {\n text-align: center;\n\n img {\n width: 200px;\n opacity: 0.5;\n animation: flicker 4s infinite;\n }\n\n div {\n font-size: 14px;\n margin: 30px auto;\n color: $secondary-text-color;\n max-width: 400px;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n\n a {\n word-break: break-word;\n }\n }\n}\n\n@keyframes flicker {\n 0% { opacity: 1; }\n 30% { opacity: 0.75; }\n 100% { opacity: 1; }\n}\n\n@import 'boost';\n@import 'accounts';\n@import 'domains';\n@import 'status';\n@import 'modal';\n@import 'composer';\n@import 'columns';\n@import 'regeneration_indicator';\n@import 'directory';\n@import 'search';\n@import 'emoji';\n@import 'doodle';\n@import 'drawer';\n@import 'media';\n@import 'sensitive';\n@import 'lists';\n@import 'emoji_picker';\n@import 'local_settings';\n@import 'error_boundary';\n@import 'single_column';\n","button.icon-button i.fa-retweet {\n background-image: url(\"data:image/svg+xml;utf8,\");\n\n &:hover {\n background-image: url(\"data:image/svg+xml;utf8,\");\n }\n}\n\n// Disabled variant\nbutton.icon-button.disabled i.fa-retweet {\n &, &:hover {\n background-image: url(\"data:image/svg+xml;utf8,\");\n }\n}\n\n// Disabled variant for use with DMs\n.status-direct button.icon-button.disabled i.fa-retweet {\n &, &:hover {\n background-image: url(\"data:image/svg+xml;utf8,\");\n }\n}\n",".account {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n color: inherit;\n text-decoration: none;\n\n .account__display-name {\n flex: 1 1 auto;\n display: block;\n color: $darker-text-color;\n overflow: hidden;\n text-decoration: none;\n font-size: 14px;\n }\n\n &.small {\n border: none;\n padding: 0;\n\n & > .account__avatar-wrapper { margin: 0 8px 0 0 }\n\n & > .display-name {\n height: 24px;\n line-height: 24px;\n }\n }\n}\n\n.account__wrapper {\n display: flex;\n}\n\n.account__avatar-wrapper {\n float: left;\n margin-left: 12px;\n margin-right: 12px;\n}\n\n.account__avatar {\n @include avatar-radius();\n position: relative;\n cursor: pointer;\n\n &-inline {\n display: inline-block;\n vertical-align: middle;\n margin-right: 5px;\n }\n\n &-composite {\n @include avatar-radius;\n overflow: hidden;\n position: relative;\n cursor: default;\n\n & div {\n @include avatar-radius;\n float: left;\n position: relative;\n box-sizing: border-box;\n }\n\n &__label {\n display: block;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n color: $primary-text-color;\n text-shadow: 1px 1px 2px $base-shadow-color;\n font-weight: 700;\n font-size: 15px;\n }\n }\n}\n\n.account__avatar-overlay {\n position: relative;\n @include avatar-size(48px);\n\n &-base {\n @include avatar-radius();\n @include avatar-size(36px);\n }\n\n &-overlay {\n @include avatar-radius();\n @include avatar-size(24px);\n\n position: absolute;\n bottom: 0;\n right: 0;\n z-index: 1;\n }\n}\n\n.account__relationship {\n height: 18px;\n padding: 10px;\n white-space: nowrap;\n}\n\n.account__header__wrapper {\n flex: 0 0 auto;\n background: lighten($ui-base-color, 4%);\n}\n\n.account__disclaimer {\n padding: 10px;\n color: $dark-text-color;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n font-weight: 500;\n color: inherit;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n}\n\n.account__action-bar {\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n line-height: 36px;\n overflow: hidden;\n flex: 0 0 auto;\n display: flex;\n}\n\n.account__action-bar-links {\n display: flex;\n flex: 1 1 auto;\n line-height: 18px;\n text-align: center;\n}\n\n.account__action-bar__tab {\n text-decoration: none;\n overflow: hidden;\n flex: 0 1 100%;\n border-left: 1px solid lighten($ui-base-color, 8%);\n padding: 10px 0;\n border-bottom: 4px solid transparent;\n\n &:first-child {\n border-left: 0;\n }\n\n &.active {\n border-bottom: 4px solid $ui-highlight-color;\n }\n\n & > span {\n display: block;\n text-transform: uppercase;\n font-size: 11px;\n color: $darker-text-color;\n }\n\n strong {\n display: block;\n font-size: 15px;\n font-weight: 500;\n color: $primary-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n abbr {\n color: $highlight-text-color;\n }\n}\n\n.account-authorize {\n padding: 14px 10px;\n\n .detailed-status__display-name {\n display: block;\n margin-bottom: 15px;\n overflow: hidden;\n }\n}\n\n.account-authorize__avatar {\n float: left;\n margin-right: 10px;\n}\n\n.notification__message {\n margin-left: 42px;\n padding: 8px 0 0 26px;\n cursor: default;\n color: $darker-text-color;\n font-size: 15px;\n position: relative;\n\n .fa {\n color: $highlight-text-color;\n }\n\n > span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.account--panel {\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: row;\n padding: 10px 0;\n}\n\n.account--panel__button,\n.detailed-status__button {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.column-settings__outer {\n background: lighten($ui-base-color, 8%);\n padding: 15px;\n}\n\n.column-settings__section {\n color: $darker-text-color;\n cursor: default;\n display: block;\n font-weight: 500;\n margin-bottom: 10px;\n}\n\n.column-settings__hashtags {\n .column-settings__row {\n margin-bottom: 15px;\n }\n\n .column-select {\n &__control {\n @include search-input();\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n &__placeholder {\n color: $dark-text-color;\n padding-left: 2px;\n font-size: 12px;\n }\n\n &__value-container {\n padding-left: 6px;\n }\n\n &__multi-value {\n background: lighten($ui-base-color, 8%);\n\n &__remove {\n cursor: pointer;\n\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 12%);\n color: lighten($darker-text-color, 4%);\n }\n }\n }\n\n &__multi-value__label,\n &__input {\n color: $darker-text-color;\n }\n\n &__clear-indicator,\n &__dropdown-indicator {\n cursor: pointer;\n transition: none;\n color: $dark-text-color;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($dark-text-color, 4%);\n }\n }\n\n &__indicator-separator {\n background-color: lighten($ui-base-color, 8%);\n }\n\n &__menu {\n @include search-popout();\n padding: 0;\n background: $ui-secondary-color;\n }\n\n &__menu-list {\n padding: 6px;\n }\n\n &__option {\n color: $inverted-text-color;\n border-radius: 4px;\n font-size: 14px;\n\n &--is-focused,\n &--is-selected {\n background: darken($ui-secondary-color, 10%);\n }\n }\n }\n}\n\n.column-settings__row {\n .text-btn {\n margin-bottom: 15px;\n }\n}\n\n.relationship-tag {\n color: $primary-text-color;\n margin-bottom: 4px;\n display: block;\n vertical-align: top;\n background-color: $base-overlay-background;\n text-transform: uppercase;\n font-size: 11px;\n font-weight: 500;\n padding: 4px;\n border-radius: 4px;\n opacity: 0.7;\n\n &:hover {\n opacity: 1;\n }\n}\n\n.account-gallery__container {\n display: flex;\n flex-wrap: wrap;\n padding: 4px 2px;\n}\n\n.account-gallery__item {\n border: none;\n box-sizing: border-box;\n display: block;\n position: relative;\n border-radius: 4px;\n overflow: hidden;\n margin: 2px;\n\n &__icons {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 24px;\n }\n}\n\n.notification__filter-bar,\n.account__section-headline {\n background: darken($ui-base-color, 4%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n display: flex;\n flex-shrink: 0;\n\n button {\n background: darken($ui-base-color, 4%);\n border: 0;\n margin: 0;\n }\n\n button,\n a {\n display: block;\n flex: 1 1 auto;\n color: $darker-text-color;\n padding: 15px 0;\n font-size: 14px;\n font-weight: 500;\n text-align: center;\n text-decoration: none;\n position: relative;\n\n &.active {\n color: $secondary-text-color;\n\n &::before,\n &::after {\n display: block;\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 50%;\n width: 0;\n height: 0;\n transform: translateX(-50%);\n border-style: solid;\n border-width: 0 10px 10px;\n border-color: transparent transparent lighten($ui-base-color, 8%);\n }\n\n &::after {\n bottom: -1px;\n border-color: transparent transparent $ui-base-color;\n }\n }\n }\n\n &.directory__section-headline {\n background: darken($ui-base-color, 2%);\n border-bottom-color: transparent;\n\n a,\n button {\n &.active {\n &::before {\n display: none;\n }\n\n &::after {\n border-color: transparent transparent darken($ui-base-color, 7%);\n }\n }\n }\n }\n}\n\n.account__moved-note {\n padding: 14px 10px;\n padding-bottom: 16px;\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &__message {\n position: relative;\n margin-left: 58px;\n color: $dark-text-color;\n padding: 8px 0;\n padding-top: 0;\n padding-bottom: 4px;\n font-size: 14px;\n\n > span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n &__icon-wrapper {\n left: -26px;\n position: absolute;\n }\n\n .detailed-status__display-avatar {\n position: relative;\n }\n\n .detailed-status__display-name {\n margin-bottom: 0;\n }\n}\n\n.account__header__content {\n color: $darker-text-color;\n font-size: 14px;\n font-weight: 400;\n overflow: hidden;\n word-break: normal;\n word-wrap: break-word;\n\n p {\n margin-bottom: 20px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: inherit;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n}\n\n.account__header {\n overflow: hidden;\n\n &.inactive {\n opacity: 0.5;\n\n .account__header__image,\n .account__avatar {\n filter: grayscale(100%);\n }\n }\n\n &__info {\n position: absolute;\n top: 10px;\n left: 10px;\n }\n\n &__image {\n overflow: hidden;\n height: 145px;\n position: relative;\n background: darken($ui-base-color, 4%);\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n }\n }\n\n &__bar {\n position: relative;\n background: lighten($ui-base-color, 4%);\n padding: 5px;\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n\n .avatar {\n display: block;\n flex: 0 0 auto;\n width: 94px;\n margin-left: -2px;\n\n .account__avatar {\n background: darken($ui-base-color, 8%);\n border: 2px solid lighten($ui-base-color, 4%);\n }\n }\n }\n\n &__tabs {\n display: flex;\n align-items: flex-start;\n padding: 7px 5px;\n margin-top: -55px;\n\n &__buttons {\n display: flex;\n align-items: center;\n padding-top: 55px;\n overflow: hidden;\n\n .icon-button {\n border: 1px solid lighten($ui-base-color, 12%);\n border-radius: 4px;\n box-sizing: content-box;\n padding: 2px;\n }\n\n .button {\n margin: 0 8px;\n }\n }\n\n &__name {\n padding: 5px;\n\n .account-role {\n vertical-align: top;\n }\n\n .emojione {\n width: 22px;\n height: 22px;\n }\n\n h1 {\n font-size: 16px;\n line-height: 24px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n\n small {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n .spacer {\n flex: 1 1 auto;\n }\n }\n\n &__bio {\n overflow: hidden;\n margin: 0 -5px;\n\n .account__header__content {\n padding: 20px 15px;\n padding-bottom: 5px;\n color: $primary-text-color;\n }\n\n .account__header__fields {\n margin: 0;\n border-top: 1px solid lighten($ui-base-color, 12%);\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n }\n\n &__extra {\n margin-top: 4px;\n\n &__links {\n font-size: 14px;\n color: $darker-text-color;\n padding: 10px 0;\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n padding: 5px 10px;\n font-weight: 500;\n\n strong {\n font-weight: 700;\n color: $primary-text-color;\n }\n }\n }\n }\n}\n",".domain {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n .domain__domain-name {\n flex: 1 1 auto;\n display: block;\n color: $primary-text-color;\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n }\n}\n\n.domain__wrapper {\n display: flex;\n}\n\n.domain_buttons {\n height: 18px;\n padding: 10px;\n white-space: nowrap;\n}\n","@keyframes spring-flip-in {\n 0% {\n transform: rotate(0deg);\n }\n\n 30% {\n transform: rotate(-242.4deg);\n }\n\n 60% {\n transform: rotate(-158.35deg);\n }\n\n 90% {\n transform: rotate(-187.5deg);\n }\n\n 100% {\n transform: rotate(-180deg);\n }\n}\n\n@keyframes spring-flip-out {\n 0% {\n transform: rotate(-180deg);\n }\n\n 30% {\n transform: rotate(62.4deg);\n }\n\n 60% {\n transform: rotate(-21.635deg);\n }\n\n 90% {\n transform: rotate(7.5deg);\n }\n\n 100% {\n transform: rotate(0deg);\n }\n}\n\n.status__content--with-action {\n cursor: pointer;\n}\n\n.status__content {\n position: relative;\n margin: 10px 0;\n font-size: 15px;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n overflow: visible;\n padding-top: 5px;\n\n &:focus {\n outline: 0;\n }\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n img {\n max-width: 100%;\n max-height: 400px;\n object-fit: contain;\n }\n\n p, pre, blockquote {\n margin-bottom: 20px;\n white-space: pre-wrap;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .status__content__text,\n .e-content {\n overflow: hidden;\n\n & > ul,\n & > ol {\n margin-bottom: 20px;\n }\n\n h1, h2, h3, h4, h5 {\n margin-top: 20px;\n margin-bottom: 20px;\n }\n\n h1, h2 {\n font-weight: 700;\n font-size: 1.2em;\n }\n\n h2 {\n font-size: 1.1em;\n }\n\n h3, h4, h5 {\n font-weight: 500;\n }\n\n blockquote {\n padding-left: 10px;\n border-left: 3px solid $darker-text-color;\n color: $darker-text-color;\n white-space: normal;\n\n p:last-child {\n margin-bottom: 0;\n }\n }\n\n b, strong {\n font-weight: 700;\n }\n\n em, i {\n font-style: italic;\n }\n\n sub {\n font-size: smaller;\n text-align: sub;\n }\n\n sup {\n font-size: smaller;\n vertical-align: super;\n }\n\n ul, ol {\n margin-left: 1em;\n\n p {\n margin: 0;\n }\n }\n\n ul {\n list-style-type: disc;\n }\n\n ol {\n list-style-type: decimal;\n }\n }\n\n a {\n color: $pleroma-links;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n\n .fa {\n color: lighten($dark-text-color, 7%);\n }\n }\n\n &.mention {\n &:hover {\n text-decoration: none;\n\n span {\n text-decoration: underline;\n }\n }\n }\n\n .fa {\n color: $dark-text-color;\n }\n }\n\n .status__content__spoiler {\n display: none;\n\n &.status__content__spoiler--visible {\n display: block;\n }\n }\n\n a.unhandled-link {\n color: lighten($ui-highlight-color, 8%);\n\n .link-origin-tag {\n color: $gold-star;\n font-size: 0.8em;\n }\n }\n\n .status__content__spoiler-link {\n background: lighten($ui-base-color, 30%);\n\n &:hover {\n background: lighten($ui-base-color, 33%);\n text-decoration: none;\n }\n }\n}\n\n.status__content__spoiler-link {\n display: inline-block;\n border-radius: 2px;\n background: lighten($ui-base-color, 30%);\n border: none;\n color: $inverted-text-color;\n font-weight: 500;\n font-size: 11px;\n padding: 0 5px;\n text-transform: uppercase;\n line-height: inherit;\n cursor: pointer;\n vertical-align: bottom;\n\n &:hover {\n background: lighten($ui-base-color, 33%);\n text-decoration: none;\n }\n\n .status__content__spoiler-icon {\n display: inline-block;\n margin: 0 0 0 5px;\n border-left: 1px solid currentColor;\n padding: 0 0 0 4px;\n font-size: 16px;\n vertical-align: -2px;\n }\n}\n\n.notif-cleaning {\n .status,\n .notification-follow,\n .notification-follow-request {\n padding-right: ($dismiss-overlay-width + 0.5rem);\n }\n}\n\n.status__wrapper--filtered {\n color: $dark-text-color;\n border: 0;\n font-size: inherit;\n text-align: center;\n line-height: inherit;\n margin: 0;\n padding: 15px;\n box-sizing: border-box;\n width: 100%;\n clear: both;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n}\n\n.status__prepend-icon-wrapper {\n left: -26px;\n position: absolute;\n}\n\n.notification-follow,\n.notification-follow-request {\n position: relative;\n\n // same like Status\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n .account {\n border-bottom: 0 none;\n }\n}\n\n.focusable {\n &:focus {\n outline: 0;\n background: lighten($ui-base-color, 4%);\n\n &.status.status-direct:not(.read) {\n background: lighten($ui-base-color, 12%);\n\n &.muted {\n background: transparent;\n }\n }\n\n .detailed-status,\n .detailed-status__action-bar {\n background: lighten($ui-base-color, 8%);\n }\n }\n}\n\n.status {\n padding: 10px 14px;\n position: relative;\n height: auto;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n\n @supports (-ms-overflow-style: -ms-autohiding-scrollbar) {\n // Add margin to avoid Edge auto-hiding scrollbar appearing over content.\n // On Edge 16 this is 16px and Edge <=15 it's 12px, so aim for 16px.\n padding-right: 28px; // 12px + 16px\n }\n\n @keyframes fade {\n 0% { opacity: 0; }\n 100% { opacity: 1; }\n }\n\n opacity: 1;\n animation: fade 150ms linear;\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n }\n\n &.status-direct:not(.read) {\n background: lighten($ui-base-color, 8%);\n border-bottom-color: lighten($ui-base-color, 12%);\n }\n\n &.light {\n .status__relative-time {\n color: $lighter-text-color;\n }\n\n .status__display-name {\n color: $inverted-text-color;\n }\n\n .display-name {\n strong {\n color: $inverted-text-color;\n }\n\n span {\n color: $lighter-text-color;\n }\n }\n\n .status__content {\n color: $inverted-text-color;\n\n a {\n color: $highlight-text-color;\n }\n\n a.status__content__spoiler-link {\n color: $primary-text-color;\n background: $ui-primary-color;\n\n &:hover {\n background: lighten($ui-primary-color, 8%);\n }\n }\n }\n }\n\n &.collapsed {\n background-position: center;\n background-size: cover;\n user-select: none;\n\n &.has-background::before {\n display: block;\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n background-image: linear-gradient(to bottom, rgba($base-shadow-color, .75), rgba($base-shadow-color, .65) 24px, rgba($base-shadow-color, .8));\n pointer-events: none;\n content: \"\";\n }\n\n .display-name:hover .display-name__html {\n text-decoration: none;\n }\n\n .status__content {\n height: 20px;\n overflow: hidden;\n text-overflow: ellipsis;\n padding-top: 0;\n\n &:after {\n content: \"\";\n position: absolute;\n top: 0; bottom: 0;\n left: 0; right: 0;\n background: linear-gradient(rgba($ui-base-color, 0), rgba($ui-base-color, 1));\n pointer-events: none;\n }\n \n a:hover {\n text-decoration: none;\n }\n }\n &:focus > .status__content:after {\n background: linear-gradient(rgba(lighten($ui-base-color, 4%), 0), rgba(lighten($ui-base-color, 4%), 1));\n }\n &.status-direct:not(.read)> .status__content:after {\n background: linear-gradient(rgba(lighten($ui-base-color, 8%), 0), rgba(lighten($ui-base-color, 8%), 1));\n }\n\n .notification__message {\n margin-bottom: 0;\n }\n\n .status__info .notification__message > span {\n white-space: nowrap;\n }\n }\n\n .notification__message {\n margin: -10px 0px 10px 0;\n }\n}\n\n.notification-favourite {\n .status.status-direct {\n background: transparent;\n\n .icon-button.disabled {\n color: lighten($action-button-color, 13%);\n }\n }\n}\n\n.status__relative-time {\n display: inline-block;\n flex-grow: 1;\n color: $dark-text-color;\n font-size: 14px;\n text-align: right;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.status__display-name {\n color: $dark-text-color;\n overflow: hidden;\n}\n\n.status__info__account .status__display-name {\n display: block;\n max-width: 100%;\n}\n\n.status__info {\n display: flex;\n justify-content: space-between;\n font-size: 15px;\n\n > span {\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n .notification__message > span {\n word-wrap: break-word;\n }\n}\n\n.status__info__icons {\n display: flex;\n align-items: center;\n height: 1em;\n color: $action-button-color;\n\n .status__media-icon,\n .status__visibility-icon,\n .status__reply-icon {\n padding-left: 2px;\n padding-right: 2px;\n }\n\n .status__collapse-button.active > .fa-angle-double-up {\n transform: rotate(-180deg);\n }\n}\n\n.no-reduce-motion .status__collapse-button {\n &.activate {\n & > .fa-angle-double-up {\n animation: spring-flip-in 1s linear;\n }\n }\n\n &.deactivate {\n & > .fa-angle-double-up {\n animation: spring-flip-out 1s linear;\n }\n }\n}\n\n.status__info__account {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n}\n\n.status-check-box {\n border-bottom: 1px solid $ui-secondary-color;\n display: flex;\n\n .status-check-box__status {\n margin: 10px 0 10px 10px;\n flex: 1;\n\n .media-gallery {\n max-width: 250px;\n }\n\n .status__content {\n padding: 0;\n white-space: normal;\n }\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n max-width: 250px;\n }\n\n .media-gallery__item-thumbnail {\n cursor: default;\n }\n }\n}\n\n.status-check-box-toggle {\n align-items: center;\n display: flex;\n flex: 0 0 auto;\n justify-content: center;\n padding: 10px;\n}\n\n.status__prepend {\n margin-top: -10px;\n margin-bottom: 10px;\n margin-left: 58px;\n color: $dark-text-color;\n padding: 8px 0;\n padding-bottom: 2px;\n font-size: 14px;\n position: relative;\n\n .status__display-name strong {\n color: $dark-text-color;\n }\n\n > span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.status__action-bar {\n align-items: center;\n display: flex;\n margin-top: 8px;\n\n &__counter {\n display: inline-flex;\n margin-right: 11px;\n align-items: center;\n\n .status__action-bar-button {\n margin-right: 4px;\n }\n\n &__label {\n display: inline-block;\n width: 14px;\n font-size: 12px;\n font-weight: 500;\n color: $action-button-color;\n }\n }\n}\n\n.status__action-bar-button {\n margin-right: 18px;\n}\n\n.status__action-bar-dropdown {\n height: 23.15px;\n width: 23.15px;\n}\n\n.detailed-status__action-bar-dropdown {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n}\n\n.detailed-status {\n background: lighten($ui-base-color, 4%);\n padding: 14px 10px;\n\n &--flex {\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n align-items: flex-start;\n\n .status__content,\n .detailed-status__meta {\n flex: 100%;\n }\n }\n\n .status__content {\n font-size: 19px;\n line-height: 24px;\n\n .emojione {\n width: 24px;\n height: 24px;\n margin: -1px 0 0;\n }\n }\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n }\n}\n\n.detailed-status__meta {\n margin-top: 15px;\n color: $dark-text-color;\n font-size: 14px;\n line-height: 18px;\n}\n\n.detailed-status__action-bar {\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: row;\n padding: 10px 0;\n}\n\n.detailed-status__link {\n color: inherit;\n text-decoration: none;\n}\n\n.detailed-status__favorites,\n.detailed-status__reblogs {\n display: inline-block;\n font-weight: 500;\n font-size: 12px;\n margin-left: 6px;\n}\n\n.status__display-name,\n.status__relative-time,\n.detailed-status__display-name,\n.detailed-status__datetime,\n.detailed-status__application,\n.account__display-name {\n text-decoration: none;\n}\n\n.status__display-name,\n.account__display-name {\n strong {\n color: $primary-text-color;\n }\n}\n\n.muted {\n .emojione {\n opacity: 0.5;\n }\n}\n\na.status__display-name,\n.reply-indicator__display-name,\n.detailed-status__display-name,\n.account__display-name {\n &:hover strong {\n text-decoration: underline;\n }\n}\n\n.account__display-name strong {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.detailed-status__application,\n.detailed-status__datetime {\n color: inherit;\n}\n\n.detailed-status .button.logo-button {\n margin-bottom: 15px;\n}\n\n.detailed-status__display-name {\n color: $secondary-text-color;\n display: block;\n line-height: 24px;\n margin-bottom: 15px;\n overflow: hidden;\n\n strong,\n span {\n display: block;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n strong {\n font-size: 16px;\n color: $primary-text-color;\n }\n}\n\n.detailed-status__display-avatar {\n float: left;\n margin-right: 10px;\n}\n\n.status__avatar {\n flex: none;\n margin: 0 10px 0 0;\n height: 48px;\n width: 48px;\n}\n\n.muted {\n .status__content,\n .status__content p,\n .status__content a,\n .status__content__text {\n color: $dark-text-color;\n }\n\n .status__display-name strong {\n color: $dark-text-color;\n }\n\n .status__avatar {\n opacity: 0.5;\n }\n\n a.status__content__spoiler-link {\n background: $ui-base-lighter-color;\n color: $inverted-text-color;\n\n &:hover {\n background: lighten($ui-base-color, 29%);\n text-decoration: none;\n }\n }\n}\n\n.status__relative-time,\n.detailed-status__datetime {\n &:hover {\n text-decoration: underline;\n }\n}\n\n.status-card {\n display: flex;\n font-size: 14px;\n border: 1px solid lighten($ui-base-color, 8%);\n border-radius: 4px;\n color: $dark-text-color;\n margin-top: 14px;\n text-decoration: none;\n overflow: hidden;\n\n &__actions {\n bottom: 0;\n left: 0;\n position: absolute;\n right: 0;\n top: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n\n & > div {\n background: rgba($base-shadow-color, 0.6);\n border-radius: 8px;\n padding: 12px 9px;\n flex: 0 0 auto;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n button,\n a {\n display: inline;\n color: $secondary-text-color;\n background: transparent;\n border: 0;\n padding: 0 8px;\n text-decoration: none;\n font-size: 18px;\n line-height: 18px;\n\n &:hover,\n &:active,\n &:focus {\n color: $primary-text-color;\n }\n }\n\n a {\n font-size: 19px;\n position: relative;\n bottom: -1px;\n }\n\n a .fa, a:hover .fa {\n color: inherit;\n }\n }\n}\n\na.status-card {\n cursor: pointer;\n\n &:hover {\n background: lighten($ui-base-color, 8%);\n }\n}\n\n.status-card-photo {\n cursor: zoom-in;\n display: block;\n text-decoration: none;\n width: 100%;\n height: auto;\n margin: 0;\n}\n\n.status-card-video {\n iframe {\n width: 100%;\n height: 100%;\n }\n}\n\n.status-card__title {\n display: block;\n font-weight: 500;\n margin-bottom: 5px;\n color: $darker-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-decoration: none;\n}\n\n.status-card__content {\n flex: 1 1 auto;\n overflow: hidden;\n padding: 14px 14px 14px 8px;\n}\n\n.status-card__description {\n color: $darker-text-color;\n}\n\n.status-card__host {\n display: block;\n margin-top: 5px;\n font-size: 13px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.status-card__image {\n flex: 0 0 100px;\n background: lighten($ui-base-color, 8%);\n position: relative;\n\n & > .fa {\n font-size: 21px;\n position: absolute;\n transform-origin: 50% 50%;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n}\n\n.status-card.horizontal {\n display: block;\n\n .status-card__image {\n width: 100%;\n }\n\n .status-card__image-image {\n border-radius: 4px 4px 0 0;\n }\n\n .status-card__title {\n white-space: inherit;\n }\n}\n\n.status-card.compact {\n border-color: lighten($ui-base-color, 4%);\n\n &.interactive {\n border: 0;\n }\n\n .status-card__content {\n padding: 8px;\n padding-top: 10px;\n }\n\n .status-card__title {\n white-space: nowrap;\n }\n\n .status-card__image {\n flex: 0 0 60px;\n }\n}\n\na.status-card.compact:hover {\n background-color: lighten($ui-base-color, 4%);\n}\n\n.status-card__image-image {\n border-radius: 4px 0 0 4px;\n display: block;\n margin: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n background-size: cover;\n background-position: center center;\n}\n\n.attachment-list {\n display: flex;\n font-size: 14px;\n border: 1px solid lighten($ui-base-color, 8%);\n border-radius: 4px;\n margin-top: 14px;\n overflow: hidden;\n\n &__icon {\n flex: 0 0 auto;\n color: $dark-text-color;\n padding: 8px 18px;\n cursor: default;\n border-right: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n font-size: 26px;\n\n .fa {\n display: block;\n }\n }\n\n &__list {\n list-style: none;\n padding: 4px 0;\n padding-left: 8px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n\n li {\n display: block;\n padding: 4px 0;\n }\n\n a {\n text-decoration: none;\n color: $dark-text-color;\n font-weight: 500;\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n &.compact {\n border: 0;\n margin-top: 4px;\n\n .attachment-list__list {\n padding: 0;\n display: block;\n }\n\n .fa {\n color: $dark-text-color;\n }\n }\n}\n\n.status__wrapper--filtered__button {\n display: inline;\n color: lighten($ui-highlight-color, 8%);\n border: 0;\n background: transparent;\n padding: 0;\n font-size: inherit;\n line-height: inherit;\n\n &:hover,\n &:active {\n text-decoration: underline;\n }\n}\n",".modal-container--preloader {\n background: lighten($ui-base-color, 8%);\n}\n\n.modal-root {\n position: relative;\n transition: opacity 0.3s linear;\n will-change: opacity;\n z-index: 9999;\n}\n\n.modal-root__overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba($base-overlay-background, 0.7);\n}\n\n.modal-root__container {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n align-content: space-around;\n z-index: 9999;\n pointer-events: none;\n user-select: none;\n}\n\n.modal-root__modal {\n pointer-events: auto;\n display: flex;\n z-index: 9999;\n}\n\n.onboarding-modal,\n.error-modal,\n.embed-modal {\n background: $ui-secondary-color;\n color: $inverted-text-color;\n border-radius: 8px;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.onboarding-modal__pager {\n height: 80vh;\n width: 80vw;\n max-width: 520px;\n max-height: 470px;\n\n .react-swipeable-view-container > div {\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n display: none;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n display: flex;\n user-select: text;\n }\n}\n\n.error-modal__body {\n height: 80vh;\n width: 80vw;\n max-width: 520px;\n max-height: 420px;\n position: relative;\n\n & > div {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n padding: 25px;\n display: none;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n display: flex;\n opacity: 0;\n user-select: text;\n }\n}\n\n.error-modal__body {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n text-align: center;\n}\n\n@media screen and (max-width: 550px) {\n .onboarding-modal {\n width: 100%;\n height: 100%;\n border-radius: 0;\n }\n\n .onboarding-modal__pager {\n width: 100%;\n height: auto;\n max-width: none;\n max-height: none;\n flex: 1 1 auto;\n }\n}\n\n.onboarding-modal__paginator,\n.error-modal__footer {\n flex: 0 0 auto;\n background: darken($ui-secondary-color, 8%);\n display: flex;\n padding: 25px;\n\n & > div {\n min-width: 33px;\n }\n\n .onboarding-modal__nav,\n .error-modal__nav {\n color: $lighter-text-color;\n border: 0;\n font-size: 14px;\n font-weight: 500;\n padding: 10px 25px;\n line-height: inherit;\n height: auto;\n margin: -10px;\n border-radius: 4px;\n background-color: transparent;\n\n &:hover,\n &:focus,\n &:active {\n color: darken($lighter-text-color, 4%);\n background-color: darken($ui-secondary-color, 16%);\n }\n\n &.onboarding-modal__done,\n &.onboarding-modal__next {\n color: $inverted-text-color;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($inverted-text-color, 4%);\n }\n }\n }\n}\n\n.error-modal__footer {\n justify-content: center;\n}\n\n.onboarding-modal__dots {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.onboarding-modal__dot {\n width: 14px;\n height: 14px;\n border-radius: 14px;\n background: darken($ui-secondary-color, 16%);\n margin: 0 3px;\n cursor: pointer;\n\n &:hover {\n background: darken($ui-secondary-color, 18%);\n }\n\n &.active {\n cursor: default;\n background: darken($ui-secondary-color, 24%);\n }\n}\n\n.onboarding-modal__page__wrapper {\n pointer-events: none;\n padding: 25px;\n padding-bottom: 0;\n\n &.onboarding-modal__page__wrapper--active {\n pointer-events: auto;\n }\n}\n\n.onboarding-modal__page {\n cursor: default;\n line-height: 21px;\n\n h1 {\n font-size: 18px;\n font-weight: 500;\n color: $inverted-text-color;\n margin-bottom: 20px;\n }\n\n a {\n color: $highlight-text-color;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($highlight-text-color, 4%);\n }\n }\n\n .navigation-bar a {\n color: inherit;\n }\n\n p {\n font-size: 16px;\n color: $lighter-text-color;\n margin-top: 10px;\n margin-bottom: 10px;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n strong {\n font-weight: 500;\n background: $ui-base-color;\n color: $secondary-text-color;\n border-radius: 4px;\n font-size: 14px;\n padding: 3px 6px;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n }\n}\n\n.onboarding-modal__page__wrapper-0 {\n height: 100%;\n padding: 0;\n}\n\n.onboarding-modal__page-one {\n &__lead {\n padding: 65px;\n padding-top: 45px;\n padding-bottom: 0;\n margin-bottom: 10px;\n\n h1 {\n font-size: 26px;\n line-height: 36px;\n margin-bottom: 8px;\n }\n\n p {\n margin-bottom: 0;\n }\n }\n\n &__extra {\n padding-right: 65px;\n padding-left: 185px;\n text-align: center;\n }\n}\n\n.display-case {\n text-align: center;\n font-size: 15px;\n margin-bottom: 15px;\n\n &__label {\n font-weight: 500;\n color: $inverted-text-color;\n margin-bottom: 5px;\n text-transform: uppercase;\n font-size: 12px;\n }\n\n &__case {\n background: $ui-base-color;\n color: $secondary-text-color;\n font-weight: 500;\n padding: 10px;\n border-radius: 4px;\n }\n}\n\n.onboarding-modal__page-two,\n.onboarding-modal__page-three,\n.onboarding-modal__page-four,\n.onboarding-modal__page-five {\n p {\n text-align: left;\n }\n\n .figure {\n background: darken($ui-base-color, 8%);\n color: $secondary-text-color;\n margin-bottom: 20px;\n border-radius: 4px;\n padding: 10px;\n text-align: center;\n font-size: 14px;\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.3);\n\n .onboarding-modal__image {\n border-radius: 4px;\n margin-bottom: 10px;\n }\n\n &.non-interactive {\n pointer-events: none;\n text-align: left;\n }\n }\n}\n\n.onboarding-modal__page-four__columns {\n .row {\n display: flex;\n margin-bottom: 20px;\n\n & > div {\n flex: 1 1 0;\n margin: 0 10px;\n\n &:first-child {\n margin-left: 0;\n }\n\n &:last-child {\n margin-right: 0;\n }\n\n p {\n text-align: center;\n }\n }\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .column-header {\n color: $primary-text-color;\n }\n}\n\n@media screen and (max-width: 320px) and (max-height: 600px) {\n .onboarding-modal__page p {\n font-size: 14px;\n line-height: 20px;\n }\n\n .onboarding-modal__page-two .figure,\n .onboarding-modal__page-three .figure,\n .onboarding-modal__page-four .figure,\n .onboarding-modal__page-five .figure {\n font-size: 12px;\n margin-bottom: 10px;\n }\n\n .onboarding-modal__page-four__columns .row {\n margin-bottom: 10px;\n }\n\n .onboarding-modal__page-four__columns .column-header {\n padding: 5px;\n font-size: 12px;\n }\n}\n\n.onboard-sliders {\n display: inline-block;\n max-width: 30px;\n max-height: auto;\n margin-left: 10px;\n}\n\n.boost-modal,\n.favourite-modal,\n.confirmation-modal,\n.report-modal,\n.actions-modal,\n.mute-modal,\n.block-modal {\n background: lighten($ui-secondary-color, 8%);\n color: $inverted-text-color;\n border-radius: 8px;\n overflow: hidden;\n max-width: 90vw;\n width: 480px;\n position: relative;\n flex-direction: column;\n\n .status__relative-time {\n color: $dark-text-color;\n float: right;\n font-size: 14px;\n width: auto;\n margin: initial;\n padding: initial;\n }\n\n .status__display-name {\n display: flex;\n }\n\n .status__avatar {\n height: 48px;\n width: 48px;\n }\n\n .status__content__spoiler-link {\n color: lighten($secondary-text-color, 8%);\n }\n}\n\n.actions-modal {\n .status {\n background: $white;\n border-bottom-color: $ui-secondary-color;\n padding-top: 10px;\n padding-bottom: 10px;\n }\n\n .dropdown-menu__separator {\n border-bottom-color: $ui-secondary-color;\n }\n}\n\n.boost-modal__container,\n.favourite-modal__container {\n overflow-x: scroll;\n padding: 10px;\n\n .status {\n user-select: text;\n border-bottom: 0;\n }\n}\n\n.boost-modal__action-bar,\n.favourite-modal__action-bar,\n.confirmation-modal__action-bar,\n.mute-modal__action-bar,\n.block-modal__action-bar {\n display: flex;\n justify-content: space-between;\n background: $ui-secondary-color;\n padding: 10px;\n line-height: 36px;\n\n & > div {\n flex: 1 1 auto;\n text-align: right;\n color: $lighter-text-color;\n padding-right: 10px;\n }\n\n .button {\n flex: 0 0 auto;\n }\n}\n\n.boost-modal__status-header,\n.favourite-modal__status-header {\n font-size: 15px;\n}\n\n.boost-modal__status-time,\n.favourite-modal__status-time {\n float: right;\n font-size: 14px;\n}\n\n.mute-modal,\n.block-modal {\n line-height: 24px;\n}\n\n.mute-modal .react-toggle,\n.block-modal .react-toggle {\n vertical-align: middle;\n}\n\n.report-modal {\n width: 90vw;\n max-width: 700px;\n}\n\n.report-modal__container {\n display: flex;\n border-top: 1px solid $ui-secondary-color;\n\n @media screen and (max-width: 480px) {\n flex-wrap: wrap;\n overflow-y: auto;\n }\n}\n\n.report-modal__statuses,\n.report-modal__comment {\n box-sizing: border-box;\n width: 50%;\n\n @media screen and (max-width: 480px) {\n width: 100%;\n }\n}\n\n.report-modal__statuses,\n.focal-point-modal__content {\n flex: 1 1 auto;\n min-height: 20vh;\n max-height: 80vh;\n overflow-y: auto;\n overflow-x: hidden;\n\n .status__content a {\n color: $highlight-text-color;\n }\n\n @media screen and (max-width: 480px) {\n max-height: 10vh;\n }\n}\n\n.focal-point-modal__content {\n @media screen and (max-width: 480px) {\n max-height: 40vh;\n }\n}\n\n.report-modal__comment {\n padding: 20px;\n border-right: 1px solid $ui-secondary-color;\n max-width: 320px;\n\n p {\n font-size: 14px;\n line-height: 20px;\n margin-bottom: 20px;\n }\n\n .setting-text {\n display: block;\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n color: $inverted-text-color;\n background: $white;\n padding: 10px;\n font-family: inherit;\n font-size: 14px;\n resize: none;\n border: 0;\n outline: 0;\n border-radius: 4px;\n border: 1px solid $ui-secondary-color;\n min-height: 100px;\n max-height: 50vh;\n margin-bottom: 10px;\n\n &:focus {\n border: 1px solid darken($ui-secondary-color, 8%);\n }\n\n &__wrapper {\n background: $white;\n border: 1px solid $ui-secondary-color;\n margin-bottom: 10px;\n border-radius: 4px;\n\n .setting-text {\n border: 0;\n margin-bottom: 0;\n border-radius: 0;\n\n &:focus {\n border: 0;\n }\n }\n\n &__modifiers {\n color: $inverted-text-color;\n font-family: inherit;\n font-size: 14px;\n background: $white;\n }\n }\n\n &__toolbar {\n display: flex;\n justify-content: space-between;\n margin-bottom: 20px;\n }\n }\n\n .setting-text-label {\n display: block;\n color: $inverted-text-color;\n font-size: 14px;\n font-weight: 500;\n margin-bottom: 10px;\n }\n\n .setting-toggle {\n margin-top: 20px;\n margin-bottom: 24px;\n\n &__label {\n color: $inverted-text-color;\n font-size: 14px;\n }\n }\n\n @media screen and (max-width: 480px) {\n padding: 10px;\n max-width: 100%;\n order: 2;\n\n .setting-toggle {\n margin-bottom: 4px;\n }\n }\n}\n\n.actions-modal {\n .status {\n overflow-y: auto;\n max-height: 300px;\n }\n\n strong {\n display: block;\n font-weight: 500;\n }\n\n max-height: 80vh;\n max-width: 80vw;\n\n .actions-modal__item-label {\n font-weight: 500;\n }\n\n ul {\n overflow-y: auto;\n flex-shrink: 0;\n max-height: 80vh;\n\n &.with-status {\n max-height: calc(80vh - 75px);\n }\n\n li:empty {\n margin: 0;\n }\n\n li:not(:empty) {\n a {\n color: $inverted-text-color;\n display: flex;\n padding: 12px 16px;\n font-size: 15px;\n align-items: center;\n text-decoration: none;\n\n &,\n button {\n transition: none;\n }\n\n &.active,\n &:hover,\n &:active,\n &:focus {\n &,\n button {\n background: $ui-highlight-color;\n color: $primary-text-color;\n }\n }\n\n & > .react-toggle,\n & > .icon,\n button:first-child {\n margin-right: 10px;\n }\n }\n }\n }\n}\n\n.confirmation-modal__action-bar,\n.mute-modal__action-bar,\n.block-modal__action-bar {\n .confirmation-modal__secondary-button {\n flex-shrink: 1;\n }\n}\n\n.confirmation-modal__secondary-button,\n.confirmation-modal__cancel-button,\n.mute-modal__cancel-button,\n.block-modal__cancel-button {\n background-color: transparent;\n color: $lighter-text-color;\n font-size: 14px;\n font-weight: 500;\n\n &:hover,\n &:focus,\n &:active {\n color: darken($lighter-text-color, 4%);\n background-color: transparent;\n }\n}\n\n.confirmation-modal__do_not_ask_again {\n padding-left: 20px;\n padding-right: 20px;\n padding-bottom: 10px;\n\n font-size: 14px;\n\n label, input {\n vertical-align: middle;\n }\n}\n\n.confirmation-modal__container,\n.mute-modal__container,\n.block-modal__container,\n.report-modal__target {\n padding: 30px;\n font-size: 16px;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n}\n\n.confirmation-modal__container,\n.report-modal__target {\n text-align: center;\n}\n\n.block-modal,\n.mute-modal {\n &__explanation {\n margin-top: 20px;\n }\n\n .setting-toggle {\n margin-top: 20px;\n margin-bottom: 24px;\n display: flex;\n align-items: center;\n\n &__label {\n color: $inverted-text-color;\n margin: 0;\n margin-left: 8px;\n }\n }\n}\n\n.report-modal__target {\n padding: 15px;\n\n .media-modal__close {\n top: 14px;\n right: 15px;\n }\n}\n\n.embed-modal {\n width: auto;\n max-width: 80vw;\n max-height: 80vh;\n\n h4 {\n padding: 30px;\n font-weight: 500;\n font-size: 16px;\n text-align: center;\n }\n\n .embed-modal__container {\n padding: 10px;\n\n .hint {\n margin-bottom: 15px;\n }\n\n .embed-modal__html {\n outline: 0;\n box-sizing: border-box;\n display: block;\n width: 100%;\n border: none;\n padding: 10px;\n font-family: 'mastodon-font-monospace', monospace;\n background: $ui-base-color;\n color: $primary-text-color;\n font-size: 14px;\n margin: 0;\n margin-bottom: 15px;\n border-radius: 4px;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n .embed-modal__iframe {\n width: 400px;\n max-width: 100%;\n overflow: hidden;\n border: 0;\n border-radius: 4px;\n }\n }\n}\n\n.focal-point {\n position: relative;\n cursor: move;\n overflow: hidden;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n background: $base-shadow-color;\n\n img,\n video,\n canvas {\n display: block;\n max-height: 80vh;\n width: 100%;\n height: auto;\n margin: 0;\n object-fit: contain;\n background: $base-shadow-color;\n }\n\n &__reticle {\n position: absolute;\n width: 100px;\n height: 100px;\n transform: translate(-50%, -50%);\n background: url('~images/reticle.png') no-repeat 0 0;\n border-radius: 50%;\n box-shadow: 0 0 0 9999em rgba($base-shadow-color, 0.35);\n }\n\n &__overlay {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n }\n\n &__preview {\n position: absolute;\n bottom: 10px;\n right: 10px;\n z-index: 2;\n cursor: move;\n transition: opacity 0.1s ease;\n\n &:hover {\n opacity: 0.5;\n }\n\n strong {\n color: $primary-text-color;\n font-size: 14px;\n font-weight: 500;\n display: block;\n margin-bottom: 5px;\n }\n\n div {\n border-radius: 4px;\n box-shadow: 0 0 14px rgba($base-shadow-color, 0.2);\n }\n }\n\n @media screen and (max-width: 480px) {\n img,\n video {\n max-height: 100%;\n }\n\n &__preview {\n display: none;\n }\n }\n}\n\n.filtered-status-info {\n text-align: start;\n\n .spoiler__text {\n margin-top: 20px;\n }\n\n .account {\n border-bottom: 0;\n }\n\n .account__display-name strong {\n color: $inverted-text-color;\n }\n\n .status__content__spoiler {\n display: none;\n\n &--visible {\n display: flex;\n }\n }\n\n ul {\n padding: 10px;\n margin-left: 12px;\n list-style: disc inside;\n }\n\n .filtered-status-edit-link {\n color: $action-button-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline\n }\n }\n}\n",".composer {\n padding: 10px;\n}\n\n.character-counter {\n cursor: default;\n font-family: $font-sans-serif, sans-serif;\n font-size: 14px;\n font-weight: 600;\n color: $lighter-text-color;\n\n &.character-counter--over {\n color: $warning-red;\n }\n}\n\n.no-reduce-motion .composer--spoiler {\n transition: height 0.4s ease, opacity 0.4s ease;\n}\n\n.composer--spoiler {\n height: 0;\n transform-origin: bottom;\n opacity: 0.0;\n\n &.composer--spoiler--visible {\n height: 36px;\n margin-bottom: 11px;\n opacity: 1.0;\n }\n\n input {\n display: block;\n box-sizing: border-box;\n margin: 0;\n border: none;\n border-radius: 4px;\n padding: 10px;\n width: 100%;\n outline: 0;\n color: $inverted-text-color;\n background: $simple-background-color;\n font-size: 14px;\n font-family: inherit;\n resize: vertical;\n\n &::placeholder {\n color: $dark-text-color;\n }\n\n &:focus { outline: 0 }\n @include single-column('screen and (max-width: 630px)') { font-size: 16px }\n }\n}\n\n.composer--warning {\n color: $inverted-text-color;\n margin-bottom: 15px;\n background: $ui-primary-color;\n box-shadow: 0 2px 6px rgba($base-shadow-color, 0.3);\n padding: 8px 10px;\n border-radius: 4px;\n font-size: 13px;\n font-weight: 400;\n\n a {\n color: $lighter-text-color;\n font-weight: 500;\n text-decoration: underline;\n\n &:active,\n &:focus,\n &:hover { text-decoration: none }\n }\n}\n\n.compose-form__sensitive-button {\n padding: 10px;\n padding-top: 0;\n\n font-size: 14px;\n font-weight: 500;\n\n &.active {\n color: $highlight-text-color;\n }\n\n input[type=checkbox] {\n display: none;\n }\n\n .checkbox {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-left: 5px;\n margin-right: 10px;\n top: -1px;\n border-radius: 4px;\n vertical-align: middle;\n\n &.active {\n border-color: $highlight-text-color;\n background: $highlight-text-color;\n }\n }\n}\n\n.composer--reply {\n margin: 0 0 10px;\n border-radius: 4px;\n padding: 10px;\n background: $ui-primary-color;\n min-height: 23px;\n overflow-y: auto;\n flex: 0 2 auto;\n\n & > header {\n margin-bottom: 5px;\n overflow: hidden;\n\n & > .account.small { color: $inverted-text-color; }\n\n & > .cancel {\n float: right;\n line-height: 24px;\n }\n }\n\n & > .content {\n position: relative;\n margin: 10px 0;\n padding: 0 12px;\n font-size: 14px;\n line-height: 20px;\n color: $inverted-text-color;\n word-wrap: break-word;\n font-weight: 400;\n overflow: visible;\n white-space: pre-wrap;\n padding-top: 5px;\n overflow: hidden;\n\n p, pre, blockquote {\n margin-bottom: 20px;\n white-space: pre-wrap;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n h1, h2, h3, h4, h5 {\n margin-top: 20px;\n margin-bottom: 20px;\n }\n\n h1, h2 {\n font-weight: 700;\n font-size: 18px;\n }\n\n h2 {\n font-size: 16px;\n }\n\n h3, h4, h5 {\n font-weight: 500;\n }\n\n blockquote {\n padding-left: 10px;\n border-left: 3px solid $inverted-text-color;\n color: $inverted-text-color;\n white-space: normal;\n\n p:last-child {\n margin-bottom: 0;\n }\n }\n\n b, strong {\n font-weight: 700;\n }\n\n em, i {\n font-style: italic;\n }\n\n sub {\n font-size: smaller;\n text-align: sub;\n }\n\n ul, ol {\n margin-left: 1em;\n\n p {\n margin: 0;\n }\n }\n\n ul {\n list-style-type: disc;\n }\n\n ol {\n list-style-type: decimal;\n }\n\n a {\n color: $lighter-text-color;\n text-decoration: none;\n\n &:hover { text-decoration: underline }\n\n &.mention {\n &:hover {\n text-decoration: none;\n\n span { text-decoration: underline }\n }\n }\n }\n }\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -5px 0 0;\n }\n}\n\n.emoji-picker-dropdown {\n position: absolute;\n right: 5px;\n top: 5px;\n\n ::-webkit-scrollbar-track:hover,\n ::-webkit-scrollbar-track:active {\n background-color: rgba($base-overlay-background, 0.3);\n }\n}\n\n.compose-form__autosuggest-wrapper,\n.autosuggest-input {\n position: relative;\n width: 100%;\n\n label {\n .autosuggest-textarea__textarea {\n display: block;\n box-sizing: border-box;\n margin: 0;\n border: none;\n border-radius: 4px 4px 0 0;\n padding: 10px 32px 0 10px;\n width: 100%;\n min-height: 100px;\n outline: 0;\n color: $inverted-text-color;\n background: $simple-background-color;\n font-size: 14px;\n font-family: inherit;\n resize: none;\n scrollbar-color: initial;\n\n &::placeholder {\n color: $dark-text-color;\n }\n\n &::-webkit-scrollbar {\n all: unset;\n }\n\n &:disabled { background: $ui-secondary-color }\n &:focus { outline: 0 }\n @include single-column('screen and (max-width: 630px)') { font-size: 16px }\n\n @include limited-single-column('screen and (max-width: 600px)') {\n height: 100px !important; // prevent auto-resize textarea\n resize: vertical;\n }\n }\n }\n}\n\n.composer--textarea--icons {\n display: block;\n position: absolute;\n top: 29px;\n right: 5px;\n bottom: 5px;\n overflow: hidden;\n\n & > .textarea_icon {\n display: block;\n margin: 2px 0 0 2px;\n width: 24px;\n height: 24px;\n color: $lighter-text-color;\n font-size: 18px;\n line-height: 24px;\n text-align: center;\n opacity: .8;\n }\n}\n\n.autosuggest-textarea__suggestions-wrapper {\n position: relative;\n height: 0;\n}\n\n.autosuggest-textarea__suggestions {\n display: block;\n position: absolute;\n box-sizing: border-box;\n top: 100%;\n border-radius: 0 0 4px 4px;\n padding: 6px;\n width: 100%;\n color: $inverted-text-color;\n background: $ui-secondary-color;\n box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4);\n font-size: 14px;\n z-index: 99;\n display: none;\n}\n\n.autosuggest-textarea__suggestions--visible {\n display: block;\n}\n\n.autosuggest-textarea__suggestions__item {\n padding: 10px;\n cursor: pointer;\n border-radius: 4px;\n\n &:hover,\n &:focus,\n &:active,\n &.selected { background: darken($ui-secondary-color, 10%) }\n\n > .account,\n > .emoji,\n > .autosuggest-hashtag {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: flex-start;\n line-height: 18px;\n font-size: 14px;\n }\n\n .autosuggest-hashtag {\n justify-content: space-between;\n\n &__name {\n flex: 1 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n strong {\n font-weight: 500;\n }\n\n &__uses {\n flex: 0 0 auto;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n }\n\n & > .account.small {\n .display-name {\n & > span { color: $lighter-text-color }\n }\n }\n}\n\n.composer--upload_form {\n overflow: hidden;\n\n & > .content {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n font-family: inherit;\n padding: 5px;\n overflow: hidden;\n }\n}\n\n.composer--upload_form--item {\n flex: 1 1 0;\n margin: 5px;\n min-width: 40%;\n\n & > div {\n position: relative;\n border-radius: 4px;\n height: 140px;\n width: 100%;\n background-color: $base-shadow-color;\n background-position: center;\n background-size: cover;\n background-repeat: no-repeat;\n overflow: hidden;\n\n textarea {\n display: block;\n position: absolute;\n box-sizing: border-box;\n bottom: 0;\n left: 0;\n margin: 0;\n border: 0;\n padding: 10px;\n width: 100%;\n color: $secondary-text-color;\n background: linear-gradient(0deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);\n font-size: 14px;\n font-family: inherit;\n font-weight: 500;\n opacity: 0;\n z-index: 2;\n transition: opacity .1s ease;\n\n &:focus { color: $white }\n\n &::placeholder {\n opacity: 0.54;\n color: $secondary-text-color;\n }\n }\n\n & > .close { mix-blend-mode: difference }\n }\n\n &.active {\n & > div {\n textarea { opacity: 1 }\n }\n }\n}\n\n.composer--upload_form--actions {\n background: linear-gradient(180deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n opacity: 0;\n transition: opacity .1s ease;\n\n .icon-button {\n flex: 0 1 auto;\n color: $ui-secondary-color;\n font-size: 14px;\n font-weight: 500;\n padding: 10px;\n font-family: inherit;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($ui-secondary-color, 4%);\n }\n }\n\n &.active {\n opacity: 1;\n }\n}\n\n.composer--upload_form--progress {\n display: flex;\n padding: 10px;\n color: $darker-text-color;\n overflow: hidden;\n\n & > .fa {\n font-size: 34px;\n margin-right: 10px;\n }\n\n & > .message {\n flex: 1 1 auto;\n\n & > span {\n display: block;\n font-size: 12px;\n font-weight: 500;\n text-transform: uppercase;\n }\n\n & > .backdrop {\n position: relative;\n margin-top: 5px;\n border-radius: 6px;\n width: 100%;\n height: 6px;\n background: $ui-base-lighter-color;\n\n & > .tracker {\n position: absolute;\n top: 0;\n left: 0;\n height: 6px;\n border-radius: 6px;\n background: $ui-highlight-color;\n }\n }\n }\n}\n\n.compose-form__modifiers {\n color: $inverted-text-color;\n font-family: inherit;\n font-size: 14px;\n background: $simple-background-color;\n}\n\n.composer--options-wrapper {\n padding: 10px;\n background: darken($simple-background-color, 8%);\n border-radius: 0 0 4px 4px;\n height: 27px;\n display: flex;\n justify-content: space-between;\n flex: 0 0 auto;\n}\n\n.composer--options {\n display: flex;\n flex: 0 0 auto;\n\n & > * {\n display: inline-block;\n box-sizing: content-box;\n padding: 0 3px;\n height: 27px;\n line-height: 27px;\n vertical-align: bottom;\n }\n\n & > hr {\n display: inline-block;\n margin: 0 3px;\n border-width: 0 0 0 1px;\n border-style: none none none solid;\n border-color: transparent transparent transparent darken($simple-background-color, 24%);\n padding: 0;\n width: 0;\n height: 27px;\n background: transparent;\n }\n}\n\n.compose--counter-wrapper {\n align-self: center;\n margin-right: 4px;\n}\n\n.composer--options--dropdown {\n &.open {\n & > .value {\n border-radius: 4px 4px 0 0;\n box-shadow: 0 -4px 4px rgba($base-shadow-color, 0.1);\n color: $primary-text-color;\n background: $ui-highlight-color;\n transition: none;\n }\n &.top {\n & > .value {\n border-radius: 0 0 4px 4px;\n box-shadow: 0 4px 4px rgba($base-shadow-color, 0.1);\n }\n }\n }\n}\n\n.composer--options--dropdown--content {\n position: absolute;\n border-radius: 4px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n background: $simple-background-color;\n overflow: hidden;\n transform-origin: 50% 0;\n}\n\n.composer--options--dropdown--content--item {\n display: flex;\n align-items: center;\n padding: 10px;\n color: $inverted-text-color;\n cursor: pointer;\n\n & > .content {\n flex: 1 1 auto;\n color: $lighter-text-color;\n\n &:not(:first-child) { margin-left: 10px }\n\n strong {\n display: block;\n color: $inverted-text-color;\n font-weight: 500;\n }\n }\n\n &:hover,\n &.active {\n background: $ui-highlight-color;\n color: $primary-text-color;\n\n & > .content {\n color: $primary-text-color;\n\n strong { color: $primary-text-color }\n }\n }\n\n &.active:hover { background: lighten($ui-highlight-color, 4%) }\n}\n\n.composer--publisher {\n padding-top: 10px;\n text-align: right;\n white-space: nowrap;\n overflow: hidden;\n justify-content: flex-end;\n flex: 0 0 auto;\n\n & > .primary {\n display: inline-block;\n margin: 0;\n padding: 0 10px;\n text-align: center;\n }\n\n & > .side_arm {\n display: inline-block;\n margin: 0 2px;\n padding: 0;\n width: 36px;\n text-align: center;\n }\n\n &.over {\n & > .count { color: $warning-red }\n }\n}\n",".column__wrapper {\n display: flex;\n flex: 1 1 auto;\n position: relative;\n}\n\n.columns-area {\n display: flex;\n flex: 1 1 auto;\n flex-direction: row;\n justify-content: flex-start;\n overflow-x: auto;\n position: relative;\n\n &__panels {\n display: flex;\n justify-content: center;\n width: 100%;\n height: 100%;\n min-height: 100vh;\n\n &__pane {\n height: 100%;\n overflow: hidden;\n pointer-events: none;\n display: flex;\n justify-content: flex-end;\n min-width: 285px;\n\n &--start {\n justify-content: flex-start;\n }\n\n &__inner {\n position: fixed;\n width: 285px;\n pointer-events: auto;\n height: 100%;\n }\n }\n\n &__main {\n box-sizing: border-box;\n width: 100%;\n max-width: 600px;\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding: 0 10px;\n }\n }\n }\n}\n\n.tabs-bar__wrapper {\n background: darken($ui-base-color, 8%);\n position: sticky;\n top: 0;\n z-index: 2;\n padding-top: 0;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding-top: 10px;\n }\n\n .tabs-bar {\n margin-bottom: 0;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n margin-bottom: 10px;\n }\n }\n}\n\n.react-swipeable-view-container {\n &,\n .columns-area,\n .column {\n height: 100%;\n }\n}\n\n.react-swipeable-view-container > * {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n}\n\n.column {\n width: 330px;\n position: relative;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n\n > .scrollable {\n background: $ui-base-color;\n }\n}\n\n.ui {\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n}\n\n.column {\n overflow: hidden;\n}\n\n.column-back-button {\n box-sizing: border-box;\n width: 100%;\n background: lighten($ui-base-color, 4%);\n color: $highlight-text-color;\n cursor: pointer;\n flex: 0 0 auto;\n font-size: 16px;\n border: 0;\n text-align: unset;\n padding: 15px;\n margin: 0;\n z-index: 3;\n\n &:hover {\n text-decoration: underline;\n }\n}\n\n.column-header__back-button {\n background: lighten($ui-base-color, 4%);\n border: 0;\n font-family: inherit;\n color: $highlight-text-color;\n cursor: pointer;\n flex: 0 0 auto;\n font-size: 16px;\n padding: 0 5px 0 0;\n z-index: 3;\n\n &:hover {\n text-decoration: underline;\n }\n\n &:last-child {\n padding: 0 15px 0 0;\n }\n}\n\n.column-back-button__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.column-back-button--slim {\n position: relative;\n}\n\n.column-back-button--slim-button {\n cursor: pointer;\n flex: 0 0 auto;\n font-size: 16px;\n padding: 15px;\n position: absolute;\n right: 0;\n top: -48px;\n}\n\n.column-link {\n background: lighten($ui-base-color, 8%);\n color: $primary-text-color;\n display: block;\n font-size: 16px;\n padding: 15px;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 11%);\n }\n\n &:focus {\n outline: 0;\n }\n\n &--transparent {\n background: transparent;\n color: $ui-secondary-color;\n\n &:hover,\n &:focus,\n &:active {\n background: transparent;\n color: $primary-text-color;\n }\n\n &.active {\n color: $ui-highlight-color;\n }\n }\n}\n\n.column-link__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.column-subheading {\n background: $ui-base-color;\n color: $dark-text-color;\n padding: 8px 20px;\n font-size: 12px;\n font-weight: 500;\n text-transform: uppercase;\n cursor: default;\n}\n\n.column-header__wrapper {\n position: relative;\n flex: 0 0 auto;\n\n &.active {\n &::before {\n display: block;\n content: \"\";\n position: absolute;\n top: 35px;\n left: 0;\n right: 0;\n margin: 0 auto;\n width: 60%;\n pointer-events: none;\n height: 28px;\n z-index: 1;\n background: radial-gradient(ellipse, rgba($ui-highlight-color, 0.23) 0%, rgba($ui-highlight-color, 0) 60%);\n }\n }\n}\n\n.column-header {\n display: flex;\n font-size: 16px;\n background: lighten($ui-base-color, 4%);\n flex: 0 0 auto;\n cursor: pointer;\n position: relative;\n z-index: 2;\n outline: 0;\n overflow: hidden;\n\n & > button {\n margin: 0;\n border: none;\n padding: 15px;\n color: inherit;\n background: transparent;\n font: inherit;\n text-align: left;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n flex: 1;\n }\n\n & > .column-header__back-button {\n color: $highlight-text-color;\n }\n\n &.active {\n box-shadow: 0 1px 0 rgba($ui-highlight-color, 0.3);\n\n .column-header__icon {\n color: $highlight-text-color;\n text-shadow: 0 0 10px rgba($ui-highlight-color, 0.4);\n }\n }\n\n &:focus,\n &:active {\n outline: 0;\n }\n}\n\n.column {\n width: 330px;\n position: relative;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n\n .wide .columns-area:not(.columns-area--mobile) & {\n flex: auto;\n min-width: 330px;\n max-width: 400px;\n }\n\n > .scrollable {\n background: $ui-base-color;\n }\n}\n\n.column-header__buttons {\n height: 48px;\n display: flex;\n margin-left: 0;\n}\n\n.column-header__links {\n margin-bottom: 14px;\n}\n\n.column-header__links .text-btn {\n margin-right: 10px;\n}\n\n.column-header__button {\n background: lighten($ui-base-color, 4%);\n border: 0;\n color: $darker-text-color;\n cursor: pointer;\n font-size: 16px;\n padding: 0 15px;\n\n &:hover {\n color: lighten($darker-text-color, 7%);\n }\n\n &.active {\n color: $primary-text-color;\n background: lighten($ui-base-color, 8%);\n\n &:hover {\n color: $primary-text-color;\n background: lighten($ui-base-color, 8%);\n }\n }\n\n // glitch - added focus ring for keyboard navigation\n &:focus {\n text-shadow: 0 0 4px darken($ui-highlight-color, 5%);\n }\n}\n\n.column-header__notif-cleaning-buttons {\n display: flex;\n align-items: stretch;\n justify-content: space-around;\n\n button {\n @extend .column-header__button;\n background: transparent;\n text-align: center;\n padding: 10px 0;\n white-space: pre-wrap;\n }\n\n b {\n font-weight: bold;\n }\n}\n\n// The notifs drawer with no padding to have more space for the buttons\n.column-header__collapsible-inner.nopad-drawer {\n padding: 0;\n}\n\n.column-header__collapsible {\n max-height: 70vh;\n overflow: hidden;\n overflow-y: auto;\n color: $darker-text-color;\n transition: max-height 150ms ease-in-out, opacity 300ms linear;\n opacity: 1;\n\n &.collapsed {\n max-height: 0;\n opacity: 0.5;\n }\n\n &.animating {\n overflow-y: hidden;\n }\n\n hr {\n height: 0;\n background: transparent;\n border: 0;\n border-top: 1px solid lighten($ui-base-color, 12%);\n margin: 10px 0;\n }\n\n // notif cleaning drawer\n &.ncd {\n transition: none;\n &.collapsed {\n max-height: 0;\n opacity: 0.7;\n }\n }\n}\n\n.column-header__collapsible-inner {\n background: lighten($ui-base-color, 8%);\n padding: 15px;\n}\n\n.column-header__setting-btn {\n &:hover {\n color: $darker-text-color;\n text-decoration: underline;\n }\n}\n\n.column-header__setting-arrows {\n float: right;\n\n .column-header__setting-btn {\n padding: 0 10px;\n\n &:last-child {\n padding-right: 0;\n }\n }\n}\n\n.column-header__title {\n display: inline-block;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n flex: 1;\n}\n\n.column-header__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.empty-column-indicator,\n.error-column {\n color: $dark-text-color;\n background: $ui-base-color;\n text-align: center;\n padding: 20px;\n font-size: 15px;\n font-weight: 400;\n cursor: default;\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n justify-content: center;\n @supports(display: grid) { // hack to fix Chrome <57\n contain: strict;\n }\n\n & > span {\n max-width: 400px;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.error-column {\n flex-direction: column;\n}\n\n// more fixes for the navbar-under mode\n@mixin fix-margins-for-navbar-under {\n .tabs-bar {\n margin-top: 0 !important;\n margin-bottom: -6px !important;\n }\n}\n\n.single-column.navbar-under {\n @include fix-margins-for-navbar-under;\n}\n\n.auto-columns.navbar-under {\n @media screen and (max-width: $no-gap-breakpoint) {\n @include fix-margins-for-navbar-under;\n }\n}\n\n.auto-columns.navbar-under .react-swipeable-view-container .columns-area,\n.single-column.navbar-under .react-swipeable-view-container .columns-area {\n @media screen and (max-width: $no-gap-breakpoint) {\n height: 100% !important;\n }\n}\n\n.column-inline-form {\n padding: 7px 15px;\n padding-right: 5px;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n\n label {\n flex: 1 1 auto;\n\n input {\n width: 100%;\n margin-bottom: 6px;\n\n &:focus {\n outline: 0;\n }\n }\n }\n\n .icon-button {\n flex: 0 0 auto;\n margin: 0 5px;\n }\n}\n",".regeneration-indicator {\n text-align: center;\n font-size: 16px;\n font-weight: 500;\n color: $dark-text-color;\n background: $ui-base-color;\n cursor: default;\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 20px;\n\n &__figure {\n &,\n img {\n display: block;\n width: auto;\n height: 160px;\n margin: 0;\n }\n }\n\n &--without-header {\n padding-top: 20px + 48px;\n }\n\n &__label {\n margin-top: 30px;\n\n strong {\n display: block;\n margin-bottom: 10px;\n color: $dark-text-color;\n }\n\n span {\n font-size: 15px;\n font-weight: 400;\n }\n }\n}\n",".directory {\n &__list {\n width: 100%;\n margin: 10px 0;\n transition: opacity 100ms ease-in;\n\n &.loading {\n opacity: 0.7;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin: 0;\n }\n }\n\n &__card {\n box-sizing: border-box;\n margin-bottom: 10px;\n\n &__img {\n height: 125px;\n position: relative;\n background: darken($ui-base-color, 12%);\n overflow: hidden;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n object-fit: cover;\n }\n }\n\n &__bar {\n display: flex;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n padding: 10px;\n\n &__name {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n text-decoration: none;\n overflow: hidden;\n }\n\n &__relationship {\n width: 23px;\n min-height: 1px;\n flex: 0 0 auto;\n }\n\n .avatar {\n flex: 0 0 auto;\n width: 48px;\n height: 48px;\n padding-top: 2px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n background: darken($ui-base-color, 8%);\n object-fit: cover;\n }\n }\n\n .display-name {\n margin-left: 15px;\n text-align: left;\n\n strong {\n font-size: 15px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n span {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n &__extra {\n background: $ui-base-color;\n display: flex;\n align-items: center;\n justify-content: center;\n\n .accounts-table__count {\n width: 33.33%;\n flex: 0 0 auto;\n padding: 15px 0;\n }\n\n .account__header__content {\n box-sizing: border-box;\n padding: 15px 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n width: 100%;\n min-height: 18px + 30px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n p {\n display: none;\n\n &:first-child {\n display: inline;\n }\n }\n\n br {\n display: none;\n }\n }\n }\n }\n}\n\n.filter-form {\n background: $ui-base-color;\n\n &__column {\n padding: 10px 15px;\n }\n\n .radio-button {\n display: block;\n }\n}\n\n.radio-button {\n font-size: 14px;\n position: relative;\n display: inline-block;\n padding: 6px 0;\n line-height: 18px;\n cursor: default;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n cursor: pointer;\n\n input[type=radio],\n input[type=checkbox] {\n display: none;\n }\n\n &__input {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 50%;\n vertical-align: middle;\n\n &.checked {\n border-color: lighten($ui-highlight-color, 8%);\n background: lighten($ui-highlight-color, 8%);\n }\n }\n}\n",".search {\n position: relative;\n}\n\n.search__input {\n @include search-input();\n\n display: block;\n padding: 15px;\n padding-right: 30px;\n line-height: 18px;\n font-size: 16px;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n}\n\n.search__icon {\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus {\n outline: 0 !important;\n }\n\n .fa {\n position: absolute;\n top: 16px;\n right: 10px;\n z-index: 2;\n display: inline-block;\n opacity: 0;\n transition: all 100ms linear;\n transition-property: color, transform, opacity;\n font-size: 18px;\n width: 18px;\n height: 18px;\n color: $secondary-text-color;\n cursor: default;\n pointer-events: none;\n\n &.active {\n pointer-events: auto;\n opacity: 0.3;\n }\n }\n\n .fa-search {\n transform: rotate(0deg);\n\n &.active {\n pointer-events: auto;\n opacity: 0.3;\n }\n }\n\n .fa-times-circle {\n top: 17px;\n transform: rotate(0deg);\n color: $action-button-color;\n cursor: pointer;\n\n &.active {\n transform: rotate(90deg);\n }\n\n &:hover {\n color: lighten($action-button-color, 7%);\n }\n }\n}\n\n.search-results__header {\n color: $dark-text-color;\n background: lighten($ui-base-color, 2%);\n border-bottom: 1px solid darken($ui-base-color, 4%);\n padding: 15px 10px;\n font-size: 14px;\n font-weight: 500;\n}\n\n.search-results__info {\n padding: 20px;\n color: $darker-text-color;\n text-align: center;\n}\n\n.trends {\n &__header {\n color: $dark-text-color;\n background: lighten($ui-base-color, 2%);\n border-bottom: 1px solid darken($ui-base-color, 4%);\n font-weight: 500;\n padding: 15px;\n font-size: 16px;\n cursor: default;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n &__item {\n display: flex;\n align-items: center;\n padding: 15px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &:last-child {\n border-bottom: 0;\n }\n\n &__name {\n flex: 1 1 auto;\n color: $dark-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n strong {\n font-weight: 500;\n }\n\n a {\n color: $darker-text-color;\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:hover,\n &:focus,\n &:active {\n span {\n text-decoration: underline;\n }\n }\n }\n }\n\n &__current {\n flex: 0 0 auto;\n font-size: 24px;\n line-height: 36px;\n font-weight: 500;\n text-align: right;\n padding-right: 15px;\n margin-left: 5px;\n color: $secondary-text-color;\n }\n\n &__sparkline {\n flex: 0 0 auto;\n width: 50px;\n\n path:first-child {\n fill: rgba($highlight-text-color, 0.25) !important;\n fill-opacity: 1 !important;\n }\n\n path:last-child {\n stroke: lighten($highlight-text-color, 6%) !important;\n }\n }\n }\n}\n",null,".emojione {\n font-size: inherit;\n vertical-align: middle;\n object-fit: contain;\n margin: -.2ex .15em .2ex;\n width: 16px;\n height: 16px;\n\n img {\n width: auto;\n }\n}\n\n.emoji-picker-dropdown__menu {\n background: $simple-background-color;\n position: absolute;\n box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n margin-top: 5px;\n z-index: 2;\n\n .emoji-mart-scroll {\n transition: opacity 200ms ease;\n }\n\n &.selecting .emoji-mart-scroll {\n opacity: 0.5;\n }\n}\n\n.emoji-picker-dropdown__modifiers {\n position: absolute;\n top: 60px;\n right: 11px;\n cursor: pointer;\n}\n\n.emoji-picker-dropdown__modifiers__menu {\n position: absolute;\n z-index: 4;\n top: -4px;\n left: -8px;\n background: $simple-background-color;\n border-radius: 4px;\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n overflow: hidden;\n\n button {\n display: block;\n cursor: pointer;\n border: 0;\n padding: 4px 8px;\n background: transparent;\n\n &:hover,\n &:focus,\n &:active {\n background: rgba($ui-secondary-color, 0.4);\n }\n }\n\n .emoji-mart-emoji {\n height: 22px;\n }\n}\n\n.emoji-mart-emoji {\n span {\n background-repeat: no-repeat;\n }\n}\n\n.emoji-button {\n display: block;\n font-size: 24px;\n line-height: 24px;\n margin-left: 2px;\n width: 24px;\n outline: 0;\n cursor: pointer;\n\n &:active,\n &:focus {\n outline: 0 !important;\n }\n\n img {\n filter: grayscale(100%);\n opacity: 0.8;\n display: block;\n margin: 0;\n width: 22px;\n height: 22px;\n margin-top: 2px;\n }\n\n &:hover,\n &:active,\n &:focus {\n img {\n opacity: 1;\n filter: none;\n }\n }\n}\n","$doodleBg: #d9e1e8;\n.doodle-modal {\n @extend .boost-modal;\n width: unset;\n}\n\n.doodle-modal__container {\n background: $doodleBg;\n text-align: center;\n line-height: 0; // remove weird gap under canvas\n canvas {\n border: 5px solid $doodleBg;\n }\n}\n\n.doodle-modal__action-bar {\n @extend .boost-modal__action-bar;\n\n .filler {\n flex-grow: 1;\n margin: 0;\n padding: 0;\n }\n\n .doodle-toolbar {\n line-height: 1;\n\n display: flex;\n flex-direction: column;\n flex-grow: 0;\n justify-content: space-around;\n\n &.with-inputs {\n label {\n display: inline-block;\n width: 70px;\n text-align: right;\n margin-right: 2px;\n }\n\n input[type=\"number\"],input[type=\"text\"] {\n width: 40px;\n }\n span.val {\n display: inline-block;\n text-align: left;\n width: 50px;\n }\n }\n }\n\n .doodle-palette {\n padding-right: 0 !important;\n border: 1px solid black;\n line-height: .2rem;\n flex-grow: 0;\n background: white;\n\n button {\n appearance: none;\n width: 1rem;\n height: 1rem;\n margin: 0; padding: 0;\n text-align: center;\n color: black;\n text-shadow: 0 0 1px white;\n cursor: pointer;\n box-shadow: inset 0 0 1px rgba(white, .5);\n border: 1px solid black;\n outline-offset:-1px;\n\n &.foreground {\n outline: 1px dashed white;\n }\n\n &.background {\n outline: 1px dashed red;\n }\n\n &.foreground.background {\n outline: 1px dashed red;\n border-color: white;\n }\n }\n }\n}\n",".drawer {\n width: 300px;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n overflow-y: hidden;\n padding: 10px 5px;\n flex: none;\n\n &:first-child {\n padding-left: 10px;\n }\n\n &:last-child {\n padding-right: 10px;\n }\n\n @include single-column('screen and (max-width: 630px)') { flex: auto }\n\n @include limited-single-column('screen and (max-width: 630px)') {\n &, &:first-child, &:last-child { padding: 0 }\n }\n\n .wide & {\n min-width: 300px;\n max-width: 400px;\n flex: 1 1 200px;\n }\n\n @include single-column('screen and (max-width: 630px)') {\n :root & { // Overrides `.wide` for single-column view\n flex: auto;\n width: 100%;\n min-width: 0;\n max-width: none;\n padding: 0;\n }\n }\n\n .react-swipeable-view-container & { height: 100% }\n}\n\n.drawer--header {\n display: flex;\n flex-direction: row;\n margin-bottom: 10px;\n flex: none;\n background: lighten($ui-base-color, 8%);\n font-size: 16px;\n\n & > * {\n display: block;\n box-sizing: border-box;\n border-bottom: 2px solid transparent;\n padding: 15px 5px 13px;\n height: 48px;\n flex: 1 1 auto;\n color: $darker-text-color;\n text-align: center;\n text-decoration: none;\n cursor: pointer;\n }\n\n a {\n transition: background 100ms ease-in;\n\n &:focus,\n &:hover {\n outline: none;\n background: lighten($ui-base-color, 3%);\n transition: background 200ms ease-out;\n }\n }\n}\n\n.search {\n position: relative;\n margin-bottom: 10px;\n flex: none;\n\n @include limited-single-column('screen and (max-width: #{$no-gap-breakpoint})') { margin-bottom: 0 }\n @include single-column('screen and (max-width: 630px)') { font-size: 16px }\n}\n\n.search-popout {\n @include search-popout();\n}\n\n.drawer--account {\n padding: 10px;\n color: $darker-text-color;\n display: flex;\n align-items: center;\n\n a {\n color: inherit;\n text-decoration: none;\n }\n\n .acct {\n display: block;\n color: $secondary-text-color;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.navigation-bar__profile {\n flex: 1 1 auto;\n margin-left: 8px;\n overflow: hidden;\n}\n\n.drawer--results {\n background: $ui-base-color;\n overflow-x: hidden;\n overflow-y: auto;\n\n & > header {\n color: $dark-text-color;\n background: lighten($ui-base-color, 2%);\n padding: 15px;\n font-weight: 500;\n font-size: 16px;\n cursor: default;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n & > section {\n margin-bottom: 5px;\n\n h5 {\n background: darken($ui-base-color, 4%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n display: flex;\n padding: 15px;\n font-weight: 500;\n font-size: 16px;\n color: $dark-text-color;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n .account:last-child,\n & > div:last-child .status {\n border-bottom: 0;\n }\n\n & > .hashtag {\n display: block;\n padding: 10px;\n color: $secondary-text-color;\n text-decoration: none;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($secondary-text-color, 4%);\n text-decoration: underline;\n }\n }\n }\n}\n\n.drawer__pager {\n box-sizing: border-box;\n padding: 0;\n flex-grow: 1;\n position: relative;\n overflow: hidden;\n display: flex;\n}\n\n.drawer__inner {\n position: absolute;\n top: 0;\n left: 0;\n background: lighten($ui-base-color, 13%);\n box-sizing: border-box;\n padding: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n overflow-y: auto;\n width: 100%;\n height: 100%;\n\n &.darker {\n background: $ui-base-color;\n }\n}\n\n.drawer__inner__mastodon {\n background: lighten($ui-base-color, 13%) url('data:image/svg+xml;utf8,') no-repeat bottom / 100% auto;\n flex: 1;\n min-height: 47px;\n display: none;\n\n > img {\n display: block;\n object-fit: contain;\n object-position: bottom left;\n width: 100%;\n height: 100%;\n pointer-events: none;\n user-drag: none;\n user-select: none;\n }\n\n > .mastodon {\n display: block;\n width: 100%;\n height: 100%;\n border: none;\n cursor: inherit;\n }\n\n @media screen and (min-height: 640px) {\n display: block;\n }\n}\n\n.pseudo-drawer {\n background: lighten($ui-base-color, 13%);\n font-size: 13px;\n text-align: left;\n}\n\n.drawer__backdrop {\n cursor: pointer;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba($base-overlay-background, 0.5);\n}\n",".video-error-cover {\n align-items: center;\n background: $base-overlay-background;\n color: $primary-text-color;\n cursor: pointer;\n display: flex;\n flex-direction: column;\n height: 100%;\n justify-content: center;\n margin-top: 8px;\n position: relative;\n text-align: center;\n z-index: 100;\n}\n\n.media-spoiler {\n background: $base-overlay-background;\n color: $darker-text-color;\n border: 0;\n width: 100%;\n height: 100%;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($darker-text-color, 8%);\n }\n\n .status__content > & {\n margin-top: 15px; // Add margin when used bare for NSFW video player\n }\n @include fullwidth-gallery;\n}\n\n.media-spoiler__warning {\n display: block;\n font-size: 14px;\n}\n\n.media-spoiler__trigger {\n display: block;\n font-size: 11px;\n font-weight: 500;\n}\n\n.media-gallery__gifv__label {\n display: block;\n position: absolute;\n color: $primary-text-color;\n background: rgba($base-overlay-background, 0.5);\n bottom: 6px;\n left: 6px;\n padding: 2px 6px;\n border-radius: 2px;\n font-size: 11px;\n font-weight: 600;\n z-index: 1;\n pointer-events: none;\n opacity: 0.9;\n transition: opacity 0.1s ease;\n line-height: 18px;\n}\n\n.media-gallery__gifv {\n &.autoplay {\n .media-gallery__gifv__label {\n display: none;\n }\n }\n\n &:hover {\n .media-gallery__gifv__label {\n opacity: 1;\n }\n }\n}\n\n.media-gallery__audio {\n height: 100%;\n display: flex;\n flex-direction: column;\n\n span {\n text-align: center;\n color: $darker-text-color;\n display: flex;\n height: 100%;\n align-items: center;\n\n p {\n width: 100%;\n }\n }\n\n audio {\n width: 100%;\n }\n}\n\n.media-gallery {\n box-sizing: border-box;\n margin-top: 8px;\n overflow: hidden;\n border-radius: 4px;\n position: relative;\n width: 100%;\n height: 110px;\n\n @include fullwidth-gallery;\n}\n\n.media-gallery__item {\n border: none;\n box-sizing: border-box;\n display: block;\n float: left;\n position: relative;\n border-radius: 4px;\n overflow: hidden;\n\n .full-width & {\n border-radius: 0;\n }\n\n &.standalone {\n .media-gallery__item-gifv-thumbnail {\n transform: none;\n top: 0;\n }\n }\n\n &.letterbox {\n background: $base-shadow-color;\n }\n}\n\n.media-gallery__item-thumbnail {\n cursor: zoom-in;\n display: block;\n text-decoration: none;\n color: $secondary-text-color;\n position: relative;\n z-index: 1;\n\n &,\n img {\n height: 100%;\n width: 100%;\n object-fit: contain;\n\n &:not(.letterbox) {\n height: 100%;\n object-fit: cover;\n }\n }\n}\n\n.media-gallery__preview {\n width: 100%;\n height: 100%;\n object-fit: cover;\n position: absolute;\n top: 0;\n left: 0;\n z-index: 0;\n background: $base-overlay-background;\n\n &--hidden {\n display: none;\n }\n}\n\n.media-gallery__gifv {\n height: 100%;\n overflow: hidden;\n position: relative;\n width: 100%;\n display: flex;\n justify-content: center;\n}\n\n.media-gallery__item-gifv-thumbnail {\n cursor: zoom-in;\n height: 100%;\n width: 100%;\n position: relative;\n z-index: 1;\n object-fit: contain;\n user-select: none;\n\n &:not(.letterbox) {\n height: 100%;\n object-fit: cover;\n }\n}\n\n.media-gallery__item-thumbnail-label {\n clip: rect(1px 1px 1px 1px); /* IE6, IE7 */\n clip: rect(1px, 1px, 1px, 1px);\n overflow: hidden;\n position: absolute;\n}\n\n.video-modal__container {\n max-width: 100vw;\n max-height: 100vh;\n}\n\n.audio-modal__container {\n width: 50vw;\n}\n\n.media-modal {\n width: 100%;\n height: 100%;\n position: relative;\n\n .extended-video-player {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n video {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n }\n }\n}\n\n.media-modal__closer {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n}\n\n.media-modal__navigation {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n transition: opacity 0.3s linear;\n will-change: opacity;\n\n * {\n pointer-events: auto;\n }\n\n &.media-modal__navigation--hidden {\n opacity: 0;\n\n * {\n pointer-events: none;\n }\n }\n}\n\n.media-modal__nav {\n background: rgba($base-overlay-background, 0.5);\n box-sizing: border-box;\n border: 0;\n color: $primary-text-color;\n cursor: pointer;\n display: flex;\n align-items: center;\n font-size: 24px;\n height: 20vmax;\n margin: auto 0;\n padding: 30px 15px;\n position: absolute;\n top: 0;\n bottom: 0;\n}\n\n.media-modal__nav--left {\n left: 0;\n}\n\n.media-modal__nav--right {\n right: 0;\n}\n\n.media-modal__pagination {\n width: 100%;\n text-align: center;\n position: absolute;\n left: 0;\n bottom: 20px;\n pointer-events: none;\n}\n\n.media-modal__meta {\n text-align: center;\n position: absolute;\n left: 0;\n bottom: 20px;\n width: 100%;\n pointer-events: none;\n\n &--shifted {\n bottom: 62px;\n }\n\n a {\n pointer-events: auto;\n text-decoration: none;\n font-weight: 500;\n color: $ui-secondary-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.media-modal__page-dot {\n display: inline-block;\n}\n\n.media-modal__button {\n background-color: $white;\n height: 12px;\n width: 12px;\n border-radius: 6px;\n margin: 10px;\n padding: 0;\n border: 0;\n font-size: 0;\n}\n\n.media-modal__button--active {\n background-color: $ui-highlight-color;\n}\n\n.media-modal__close {\n position: absolute;\n right: 8px;\n top: 8px;\n z-index: 100;\n}\n\n.detailed,\n.fullscreen {\n .video-player__volume__current,\n .video-player__volume::before {\n bottom: 27px;\n }\n\n .video-player__volume__handle {\n bottom: 23px;\n }\n\n}\n\n.audio-player {\n box-sizing: border-box;\n position: relative;\n background: darken($ui-base-color, 8%);\n border-radius: 4px;\n padding-bottom: 44px;\n direction: ltr;\n\n &.editable {\n border-radius: 0;\n height: 100%;\n }\n\n &__waveform {\n padding: 15px 0;\n position: relative;\n overflow: hidden;\n\n &::before {\n content: \"\";\n display: block;\n position: absolute;\n border-top: 1px solid lighten($ui-base-color, 4%);\n width: 100%;\n height: 0;\n left: 0;\n top: calc(50% + 1px);\n }\n }\n\n &__progress-placeholder {\n background-color: rgba(lighten($ui-highlight-color, 8%), 0.5);\n }\n\n &__wave-placeholder {\n background-color: lighten($ui-base-color, 16%);\n }\n\n .video-player__controls {\n padding: 0 15px;\n padding-top: 10px;\n background: darken($ui-base-color, 8%);\n border-top: 1px solid lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n }\n}\n\n.video-player {\n overflow: hidden;\n position: relative;\n background: $base-shadow-color;\n max-width: 100%;\n border-radius: 4px;\n box-sizing: border-box;\n direction: ltr;\n\n &.editable {\n border-radius: 0;\n height: 100% !important;\n }\n\n &:focus {\n outline: 0;\n }\n\n .detailed-status & {\n width: 100%;\n height: 100%;\n }\n\n @include fullwidth-gallery;\n\n video {\n max-width: 100vw;\n max-height: 80vh;\n z-index: 1;\n position: relative;\n }\n\n &.fullscreen {\n width: 100% !important;\n height: 100% !important;\n margin: 0;\n\n video {\n max-width: 100% !important;\n max-height: 100% !important;\n width: 100% !important;\n height: 100% !important;\n outline: 0;\n }\n }\n\n &.inline {\n video {\n object-fit: contain;\n position: relative;\n top: 50%;\n transform: translateY(-50%);\n }\n }\n\n &__controls {\n position: absolute;\n z-index: 2;\n bottom: 0;\n left: 0;\n right: 0;\n box-sizing: border-box;\n background: linear-gradient(0deg, rgba($base-shadow-color, 0.85) 0, rgba($base-shadow-color, 0.45) 60%, transparent);\n padding: 0 15px;\n opacity: 0;\n transition: opacity .1s ease;\n\n &.active {\n opacity: 1;\n }\n }\n\n &.inactive {\n video,\n .video-player__controls {\n visibility: hidden;\n }\n }\n\n &__spoiler {\n display: none;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 4;\n border: 0;\n background: $base-shadow-color;\n color: $darker-text-color;\n transition: none;\n pointer-events: none;\n\n &.active {\n display: block;\n pointer-events: auto;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($darker-text-color, 7%);\n }\n }\n\n &__title {\n display: block;\n font-size: 14px;\n }\n\n &__subtitle {\n display: block;\n font-size: 11px;\n font-weight: 500;\n }\n }\n\n &__buttons-bar {\n display: flex;\n justify-content: space-between;\n padding-bottom: 10px;\n\n .video-player__download__icon {\n color: inherit;\n\n .fa,\n &:active .fa,\n &:hover .fa,\n &:focus .fa {\n color: inherit;\n }\n }\n }\n\n &__buttons {\n font-size: 16px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &.left {\n button {\n padding-left: 0;\n }\n }\n\n &.right {\n button {\n padding-right: 0;\n }\n }\n\n button {\n background: transparent;\n padding: 2px 10px;\n font-size: 16px;\n border: 0;\n color: rgba($white, 0.75);\n\n &:active,\n &:hover,\n &:focus {\n color: $white;\n }\n }\n }\n\n &__time-sep,\n &__time-total,\n &__time-current {\n font-size: 14px;\n font-weight: 500;\n }\n\n &__time-current {\n color: $white;\n margin-left: 60px;\n }\n\n &__time-sep {\n display: inline-block;\n margin: 0 6px;\n }\n\n &__time-sep,\n &__time-total {\n color: $white;\n }\n\n &__volume {\n cursor: pointer;\n height: 24px;\n display: inline;\n\n &::before {\n content: \"\";\n width: 50px;\n background: rgba($white, 0.35);\n border-radius: 4px;\n display: block;\n position: absolute;\n height: 4px;\n left: 70px;\n bottom: 20px;\n }\n\n &__current {\n display: block;\n position: absolute;\n height: 4px;\n border-radius: 4px;\n left: 70px;\n bottom: 20px;\n background: lighten($ui-highlight-color, 8%);\n }\n\n &__handle {\n position: absolute;\n z-index: 3;\n border-radius: 50%;\n width: 12px;\n height: 12px;\n bottom: 16px;\n left: 70px;\n transition: opacity .1s ease;\n background: lighten($ui-highlight-color, 8%);\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n pointer-events: none;\n }\n }\n\n &__link {\n padding: 2px 10px;\n\n a {\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n color: $white;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n }\n\n &__seek {\n cursor: pointer;\n height: 24px;\n position: relative;\n\n &::before {\n content: \"\";\n width: 100%;\n background: rgba($white, 0.35);\n border-radius: 4px;\n display: block;\n position: absolute;\n height: 4px;\n top: 10px;\n }\n\n &__progress,\n &__buffer {\n display: block;\n position: absolute;\n height: 4px;\n border-radius: 4px;\n top: 10px;\n background: lighten($ui-highlight-color, 8%);\n }\n\n &__buffer {\n background: rgba($white, 0.2);\n }\n\n &__handle {\n position: absolute;\n z-index: 3;\n opacity: 0;\n border-radius: 50%;\n width: 12px;\n height: 12px;\n top: 6px;\n margin-left: -6px;\n transition: opacity .1s ease;\n background: lighten($ui-highlight-color, 8%);\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n pointer-events: none;\n\n &.active {\n opacity: 1;\n }\n }\n\n &:hover {\n .video-player__seek__handle {\n opacity: 1;\n }\n }\n }\n\n &.detailed,\n &.fullscreen {\n .video-player__buttons {\n button {\n padding-top: 10px;\n padding-bottom: 10px;\n }\n }\n }\n}\n",".sensitive-info {\n display: flex;\n flex-direction: row;\n align-items: center;\n position: absolute;\n top: 4px;\n left: 4px;\n z-index: 100;\n}\n\n.sensitive-marker {\n margin: 0 3px;\n border-radius: 2px;\n padding: 2px 6px;\n color: rgba($primary-text-color, 0.8);\n background: rgba($base-overlay-background, 0.5);\n font-size: 12px;\n line-height: 18px;\n text-transform: uppercase;\n opacity: .9;\n transition: opacity .1s ease;\n\n .media-gallery:hover & { opacity: 1 }\n}\n",".list-editor {\n background: $ui-base-color;\n flex-direction: column;\n border-radius: 8px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n width: 380px;\n overflow: hidden;\n\n @media screen and (max-width: 420px) {\n width: 90%;\n }\n\n h4 {\n padding: 15px 0;\n background: lighten($ui-base-color, 13%);\n font-weight: 500;\n font-size: 16px;\n text-align: center;\n border-radius: 8px 8px 0 0;\n }\n\n .drawer__pager {\n height: 50vh;\n }\n\n .drawer__inner {\n border-radius: 0 0 8px 8px;\n\n &.backdrop {\n width: calc(100% - 60px);\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n border-radius: 0 0 0 8px;\n }\n }\n\n &__accounts {\n overflow-y: auto;\n }\n\n .account__display-name {\n &:hover strong {\n text-decoration: none;\n }\n }\n\n .account__avatar {\n cursor: default;\n }\n\n .search {\n margin-bottom: 0;\n }\n}\n\n.list-adder {\n background: $ui-base-color;\n flex-direction: column;\n border-radius: 8px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n width: 380px;\n overflow: hidden;\n\n @media screen and (max-width: 420px) {\n width: 90%;\n }\n\n &__account {\n background: lighten($ui-base-color, 13%);\n }\n\n &__lists {\n background: lighten($ui-base-color, 13%);\n height: 50vh;\n border-radius: 0 0 8px 8px;\n overflow-y: auto;\n }\n\n .list {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n .list__wrapper {\n display: flex;\n }\n\n .list__display-name {\n flex: 1 1 auto;\n overflow: hidden;\n text-decoration: none;\n font-size: 16px;\n padding: 10px;\n }\n}\n",".emoji-mart {\n &,\n * {\n box-sizing: border-box;\n line-height: 1.15;\n }\n\n font-size: 13px;\n display: inline-block;\n color: $inverted-text-color;\n\n .emoji-mart-emoji {\n padding: 6px;\n }\n}\n\n.emoji-mart-bar {\n border: 0 solid darken($ui-secondary-color, 8%);\n\n &:first-child {\n border-bottom-width: 1px;\n border-top-left-radius: 5px;\n border-top-right-radius: 5px;\n background: $ui-secondary-color;\n }\n\n &:last-child {\n border-top-width: 1px;\n border-bottom-left-radius: 5px;\n border-bottom-right-radius: 5px;\n display: none;\n }\n}\n\n.emoji-mart-anchors {\n display: flex;\n justify-content: space-between;\n padding: 0 6px;\n color: $lighter-text-color;\n line-height: 0;\n}\n\n.emoji-mart-anchor {\n position: relative;\n flex: 1;\n text-align: center;\n padding: 12px 4px;\n overflow: hidden;\n transition: color .1s ease-out;\n cursor: pointer;\n\n &:hover {\n color: darken($lighter-text-color, 4%);\n }\n}\n\n.emoji-mart-anchor-selected {\n color: $highlight-text-color;\n\n &:hover {\n color: darken($highlight-text-color, 4%);\n }\n\n .emoji-mart-anchor-bar {\n bottom: 0;\n }\n}\n\n.emoji-mart-anchor-bar {\n position: absolute;\n bottom: -3px;\n left: 0;\n width: 100%;\n height: 3px;\n background-color: darken($ui-highlight-color, 3%);\n}\n\n.emoji-mart-anchors {\n i {\n display: inline-block;\n width: 100%;\n max-width: 22px;\n }\n\n svg {\n fill: currentColor;\n max-height: 18px;\n }\n}\n\n.emoji-mart-scroll {\n overflow-y: scroll;\n height: 270px;\n max-height: 35vh;\n padding: 0 6px 6px;\n background: $simple-background-color;\n will-change: transform;\n\n &::-webkit-scrollbar-track:hover,\n &::-webkit-scrollbar-track:active {\n background-color: rgba($base-overlay-background, 0.3);\n }\n}\n\n.emoji-mart-search {\n padding: 10px;\n padding-right: 45px;\n background: $simple-background-color;\n\n input {\n font-size: 14px;\n font-weight: 400;\n padding: 7px 9px;\n font-family: inherit;\n display: block;\n width: 100%;\n background: rgba($ui-secondary-color, 0.3);\n color: $inverted-text-color;\n border: 1px solid $ui-secondary-color;\n border-radius: 4px;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n}\n\n.emoji-mart-category .emoji-mart-emoji {\n cursor: pointer;\n\n span {\n z-index: 1;\n position: relative;\n text-align: center;\n }\n\n &:hover::before {\n z-index: 0;\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba($ui-secondary-color, 0.7);\n border-radius: 100%;\n }\n}\n\n.emoji-mart-category-label {\n z-index: 2;\n position: relative;\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n\n span {\n display: block;\n width: 100%;\n font-weight: 500;\n padding: 5px 6px;\n background: $simple-background-color;\n }\n}\n\n.emoji-mart-emoji {\n position: relative;\n display: inline-block;\n font-size: 0;\n\n span {\n width: 22px;\n height: 22px;\n }\n}\n\n.emoji-mart-no-results {\n font-size: 14px;\n text-align: center;\n padding-top: 70px;\n color: $light-text-color;\n\n .emoji-mart-category-label {\n display: none;\n }\n\n .emoji-mart-no-results-label {\n margin-top: .2em;\n }\n\n .emoji-mart-emoji:hover::before {\n content: none;\n }\n}\n\n.emoji-mart-preview {\n display: none;\n}\n",".glitch.local-settings {\n position: relative;\n display: flex;\n flex-direction: row;\n background: $ui-secondary-color;\n color: $inverted-text-color;\n border-radius: 8px;\n height: 80vh;\n width: 80vw;\n max-width: 740px;\n max-height: 450px;\n overflow: hidden;\n\n label, legend {\n display: block;\n font-size: 14px;\n }\n\n .boolean label, .radio_buttons label {\n position: relative;\n padding-left: 28px;\n padding-top: 3px;\n\n input {\n position: absolute;\n left: 0;\n top: 0;\n }\n }\n\n span.hint {\n display: block;\n color: $lighter-text-color;\n }\n\n h1 {\n font-size: 18px;\n font-weight: 500;\n line-height: 24px;\n margin-bottom: 20px;\n }\n\n h2 {\n font-size: 15px;\n font-weight: 500;\n line-height: 20px;\n margin-top: 20px;\n margin-bottom: 10px;\n }\n}\n\n.glitch.local-settings__navigation__item {\n display: block;\n padding: 15px 20px;\n color: inherit;\n background: lighten($ui-secondary-color, 8%);\n border-bottom: 1px $ui-secondary-color solid;\n cursor: pointer;\n text-decoration: none;\n outline: none;\n transition: background .3s;\n\n .text-icon-button {\n color: inherit;\n transition: unset;\n }\n\n &:hover {\n background: $ui-secondary-color;\n }\n\n &.active {\n background: $ui-highlight-color;\n color: $primary-text-color;\n }\n\n &.close, &.close:hover {\n background: $error-value-color;\n color: $primary-text-color;\n }\n}\n\n.glitch.local-settings__navigation {\n background: lighten($ui-secondary-color, 8%);\n width: 212px;\n font-size: 15px;\n line-height: 20px;\n overflow-y: auto;\n}\n\n.glitch.local-settings__page {\n display: block;\n flex: auto;\n padding: 15px 20px 15px 20px;\n width: 360px;\n overflow-y: auto;\n}\n\n.glitch.local-settings__page__item {\n margin-bottom: 2px;\n}\n\n.glitch.local-settings__page__item.string,\n.glitch.local-settings__page__item.radio_buttons {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n\n@media screen and (max-width: 630px) {\n .glitch.local-settings__navigation {\n width: 40px;\n flex-shrink: 0;\n }\n\n .glitch.local-settings__navigation__item {\n padding: 10px;\n\n span:last-of-type {\n display: none;\n }\n }\n}\n",".error-boundary {\n color: $primary-text-color;\n font-size: 15px;\n line-height: 20px;\n\n h1 {\n font-size: 26px;\n line-height: 36px;\n font-weight: 400;\n margin-bottom: 8px;\n }\n\n a {\n color: $primary-text-color;\n text-decoration: underline;\n }\n\n ul {\n list-style: disc;\n margin-left: 0;\n padding-left: 1em;\n }\n\n textarea.web_app_crash-stacktrace {\n width: 100%;\n resize: none;\n white-space: pre;\n font-family: $font-monospace, monospace;\n }\n}\n",".compose-panel {\n width: 285px;\n margin-top: 10px;\n display: flex;\n flex-direction: column;\n height: calc(100% - 10px);\n overflow-y: hidden;\n\n .search__input {\n line-height: 18px;\n font-size: 16px;\n padding: 15px;\n padding-right: 30px;\n }\n\n .search__icon .fa {\n top: 15px;\n }\n\n .drawer--account {\n flex: 0 1 48px;\n }\n\n .flex-spacer {\n background: transparent;\n }\n\n .composer {\n flex: 1;\n overflow-y: hidden;\n display: flex;\n flex-direction: column;\n min-height: 310px;\n }\n\n .compose-form__autosuggest-wrapper {\n overflow-y: auto;\n background-color: $white;\n border-radius: 4px 4px 0 0;\n flex: 0 1 auto;\n }\n\n .autosuggest-textarea__textarea {\n overflow-y: hidden;\n }\n\n .compose-form__upload-thumbnail {\n height: 80px;\n }\n}\n\n.navigation-panel {\n margin-top: 10px;\n margin-bottom: 10px;\n height: calc(100% - 20px);\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n\n & > a {\n flex: 0 0 auto;\n }\n\n hr {\n flex: 0 0 auto;\n border: 0;\n background: transparent;\n border-top: 1px solid lighten($ui-base-color, 4%);\n margin: 10px 0;\n }\n\n .flex-spacer {\n background: transparent;\n }\n}\n\n@media screen and (min-width: 600px) {\n .tabs-bar__link {\n span {\n display: inline;\n }\n }\n}\n\n.columns-area--mobile {\n flex-direction: column;\n width: 100%;\n margin: 0 auto;\n\n .column,\n .drawer {\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .directory__list {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: block;\n }\n }\n\n .directory__card {\n margin-bottom: 0;\n }\n\n .filter-form {\n display: flex;\n }\n\n .autosuggest-textarea__textarea {\n font-size: 16px;\n }\n\n .search__input {\n line-height: 18px;\n font-size: 16px;\n padding: 15px;\n padding-right: 30px;\n }\n\n .search__icon .fa {\n top: 15px;\n }\n\n .scrollable {\n overflow: visible;\n\n @supports(display: grid) {\n contain: content;\n }\n }\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding: 10px 0;\n padding-top: 0;\n }\n\n @media screen and (min-width: 630px) {\n .detailed-status {\n padding: 15px;\n\n .media-gallery,\n .video-player,\n .audio-player {\n margin-top: 15px;\n }\n }\n\n .account__header__bar {\n padding: 5px 10px;\n }\n\n .navigation-bar,\n .compose-form {\n padding: 15px;\n }\n\n .compose-form .compose-form__publish .compose-form__publish-button-wrapper {\n padding-top: 15px;\n }\n\n .status {\n padding: 15px;\n min-height: 48px + 2px;\n\n .media-gallery,\n &__action-bar,\n .video-player,\n .audio-player {\n margin-top: 10px;\n }\n }\n\n .account {\n padding: 15px 10px;\n\n &__header__bio {\n margin: 0 -10px;\n }\n }\n\n .notification {\n &__message {\n padding-top: 15px;\n }\n\n .status {\n padding-top: 8px;\n }\n\n .account {\n padding-top: 8px;\n }\n }\n }\n}\n\n.floating-action-button {\n position: fixed;\n display: flex;\n justify-content: center;\n align-items: center;\n width: 3.9375rem;\n height: 3.9375rem;\n bottom: 1.3125rem;\n right: 1.3125rem;\n background: darken($ui-highlight-color, 3%);\n color: $white;\n border-radius: 50%;\n font-size: 21px;\n line-height: 21px;\n text-decoration: none;\n box-shadow: 2px 3px 9px rgba($base-shadow-color, 0.4);\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-highlight-color, 7%);\n }\n}\n\n@media screen and (min-width: $no-gap-breakpoint) {\n .tabs-bar {\n width: 100%;\n }\n\n .react-swipeable-view-container .columns-area--mobile {\n height: calc(100% - 10px) !important;\n }\n\n .getting-started__wrapper,\n .search {\n margin-bottom: 10px;\n }\n}\n\n@media screen and (max-width: 600px + (285px * 1) + (10px * 1)) {\n .columns-area__panels__pane--compositional {\n display: none;\n }\n}\n\n@media screen and (min-width: 600px + (285px * 1) + (10px * 1)) {\n .floating-action-button,\n .tabs-bar__link.optional {\n display: none;\n }\n\n .search-page .search {\n display: none;\n }\n}\n\n@media screen and (max-width: 600px + (285px * 2) + (10px * 2)) {\n .columns-area__panels__pane--navigational {\n display: none;\n }\n}\n\n@media screen and (min-width: 600px + (285px * 2) + (10px * 2)) {\n .tabs-bar {\n display: none;\n }\n}\n",".poll {\n margin-top: 16px;\n font-size: 14px;\n\n ul,\n .e-content & ul {\n margin: 0;\n list-style: none;\n }\n\n li {\n margin-bottom: 10px;\n position: relative;\n }\n\n &__chart {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n display: inline-block;\n border-radius: 4px;\n background: darken($ui-primary-color, 14%);\n\n &.leading {\n background: $ui-highlight-color;\n }\n }\n\n &__text {\n position: relative;\n display: flex;\n padding: 6px 0;\n line-height: 18px;\n cursor: default;\n overflow: hidden;\n\n input[type=radio],\n input[type=checkbox] {\n display: none;\n }\n\n .autossugest-input {\n flex: 1 1 auto;\n }\n\n input[type=text] {\n display: block;\n box-sizing: border-box;\n width: 100%;\n font-size: 14px;\n color: $inverted-text-color;\n display: block;\n outline: 0;\n font-family: inherit;\n background: $simple-background-color;\n border: 1px solid darken($simple-background-color, 14%);\n border-radius: 4px;\n padding: 6px 10px;\n\n &:focus {\n border-color: $highlight-text-color;\n }\n }\n\n &.selectable {\n cursor: pointer;\n }\n\n &.editable {\n display: flex;\n align-items: center;\n overflow: visible;\n }\n }\n\n &__input {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 50%;\n vertical-align: middle;\n margin-top: auto;\n margin-bottom: auto;\n flex: 0 0 18px;\n\n &.checkbox {\n border-radius: 4px;\n }\n\n &.active {\n border-color: $valid-value-color;\n background: $valid-value-color;\n }\n\n &:active,\n &:focus,\n &:hover {\n border-width: 4px;\n background: none;\n }\n\n &::-moz-focus-inner {\n outline: 0 !important;\n border: 0;\n }\n\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n\n &__number {\n display: inline-block;\n width: 52px;\n font-weight: 700;\n padding: 0 10px;\n padding-left: 8px;\n text-align: right;\n margin-top: auto;\n margin-bottom: auto;\n flex: 0 0 52px;\n }\n\n &__vote__mark {\n float: left;\n line-height: 18px;\n }\n\n &__footer {\n padding-top: 6px;\n padding-bottom: 5px;\n color: $dark-text-color;\n }\n\n &__link {\n display: inline;\n background: transparent;\n padding: 0;\n margin: 0;\n border: 0;\n color: $dark-text-color;\n text-decoration: underline;\n font-size: inherit;\n\n &:hover {\n text-decoration: none;\n }\n\n &:active,\n &:focus {\n background-color: rgba($dark-text-color, .1);\n }\n }\n\n .button {\n height: 36px;\n padding: 0 16px;\n margin-right: 10px;\n font-size: 14px;\n }\n}\n\n.compose-form__poll-wrapper {\n border-top: 1px solid darken($simple-background-color, 8%);\n\n ul {\n padding: 10px;\n }\n\n .poll__footer {\n border-top: 1px solid darken($simple-background-color, 8%);\n padding: 10px;\n display: flex;\n align-items: center;\n\n button,\n select {\n width: 100%;\n flex: 1 1 50%;\n\n &:focus {\n border-color: $highlight-text-color;\n }\n }\n }\n\n .button.button-secondary {\n font-size: 14px;\n font-weight: 400;\n padding: 6px 10px;\n height: auto;\n line-height: inherit;\n color: $action-button-color;\n border-color: $action-button-color;\n margin-right: 5px;\n }\n\n li {\n display: flex;\n align-items: center;\n\n .poll__text {\n flex: 0 0 auto;\n width: calc(100% - (23px + 6px));\n margin-right: 6px;\n }\n }\n\n select {\n appearance: none;\n box-sizing: border-box;\n font-size: 14px;\n color: $inverted-text-color;\n display: inline-block;\n width: auto;\n outline: 0;\n font-family: inherit;\n background: $simple-background-color url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center / auto 16px;\n border: 1px solid darken($simple-background-color, 14%);\n border-radius: 4px;\n padding: 6px 10px;\n padding-right: 30px;\n }\n\n .icon-button.disabled {\n color: darken($simple-background-color, 14%);\n }\n}\n\n.muted .poll {\n color: $dark-text-color;\n\n &__chart {\n background: rgba(darken($ui-primary-color, 14%), 0.2);\n\n &.leading {\n background: rgba($ui-highlight-color, 0.2);\n }\n }\n}\n","$maximum-width: 1235px;\n$fluid-breakpoint: $maximum-width + 20px;\n$column-breakpoint: 700px;\n$small-breakpoint: 960px;\n\n.container {\n box-sizing: border-box;\n max-width: $maximum-width;\n margin: 0 auto;\n position: relative;\n\n @media screen and (max-width: $fluid-breakpoint) {\n width: 100%;\n padding: 0 10px;\n }\n}\n\n.rich-formatting {\n font-family: $font-sans-serif, sans-serif;\n font-size: 14px;\n font-weight: 400;\n line-height: 1.7;\n word-wrap: break-word;\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n p,\n li {\n color: $darker-text-color;\n }\n\n p {\n margin-top: 0;\n margin-bottom: .85em;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n strong {\n font-weight: 700;\n color: $secondary-text-color;\n }\n\n em {\n font-style: italic;\n color: $secondary-text-color;\n }\n\n code {\n font-size: 0.85em;\n background: darken($ui-base-color, 8%);\n border-radius: 4px;\n padding: 0.2em 0.3em;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n font-family: $font-display, sans-serif;\n margin-top: 1.275em;\n margin-bottom: .85em;\n font-weight: 500;\n color: $secondary-text-color;\n }\n\n h1 {\n font-size: 2em;\n }\n\n h2 {\n font-size: 1.75em;\n }\n\n h3 {\n font-size: 1.5em;\n }\n\n h4 {\n font-size: 1.25em;\n }\n\n h5,\n h6 {\n font-size: 1em;\n }\n\n ul {\n list-style: disc;\n }\n\n ol {\n list-style: decimal;\n }\n\n ul,\n ol {\n margin: 0;\n padding: 0;\n padding-left: 2em;\n margin-bottom: 0.85em;\n\n &[type='a'] {\n list-style-type: lower-alpha;\n }\n\n &[type='i'] {\n list-style-type: lower-roman;\n }\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n margin: 1.7em 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n\n table {\n width: 100%;\n border-collapse: collapse;\n break-inside: auto;\n margin-top: 24px;\n margin-bottom: 32px;\n\n thead tr,\n tbody tr {\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n font-size: 1em;\n line-height: 1.625;\n font-weight: 400;\n text-align: left;\n color: $darker-text-color;\n }\n\n thead tr {\n border-bottom-width: 2px;\n line-height: 1.5;\n font-weight: 500;\n color: $dark-text-color;\n }\n\n th,\n td {\n padding: 8px;\n align-self: start;\n align-items: start;\n word-break: break-all;\n\n &.nowrap {\n width: 25%;\n position: relative;\n\n &::before {\n content: ' ';\n visibility: hidden;\n }\n\n span {\n position: absolute;\n left: 8px;\n right: 8px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n }\n\n & > :first-child {\n margin-top: 0;\n }\n}\n\n.information-board {\n background: darken($ui-base-color, 4%);\n padding: 20px 0;\n\n .container-alt {\n position: relative;\n padding-right: 280px + 15px;\n }\n\n &__sections {\n display: flex;\n justify-content: space-between;\n flex-wrap: wrap;\n }\n\n &__section {\n flex: 1 0 0;\n font-family: $font-sans-serif, sans-serif;\n font-size: 16px;\n line-height: 28px;\n color: $primary-text-color;\n text-align: right;\n padding: 10px 15px;\n\n span,\n strong {\n display: block;\n }\n\n span {\n &:last-child {\n color: $secondary-text-color;\n }\n }\n\n strong {\n font-family: $font-display, sans-serif;\n font-weight: 500;\n font-size: 32px;\n line-height: 48px;\n }\n\n @media screen and (max-width: $column-breakpoint) {\n text-align: center;\n }\n }\n\n .panel {\n position: absolute;\n width: 280px;\n box-sizing: border-box;\n background: darken($ui-base-color, 8%);\n padding: 20px;\n padding-top: 10px;\n border-radius: 4px 4px 0 0;\n right: 0;\n bottom: -40px;\n\n .panel-header {\n font-family: $font-display, sans-serif;\n font-size: 14px;\n line-height: 24px;\n font-weight: 500;\n color: $darker-text-color;\n padding-bottom: 5px;\n margin-bottom: 15px;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n\n a,\n span {\n font-weight: 400;\n color: darken($darker-text-color, 10%);\n }\n\n a {\n text-decoration: none;\n }\n }\n }\n\n .owner {\n text-align: center;\n\n .avatar {\n width: 80px;\n height: 80px;\n @include avatar-size(80px);\n margin: 0 auto;\n margin-bottom: 15px;\n\n img {\n display: block;\n width: 80px;\n height: 80px;\n border-radius: 48px;\n @include avatar-radius();\n }\n }\n\n .name {\n font-size: 14px;\n\n a {\n display: block;\n color: $primary-text-color;\n text-decoration: none;\n\n &:hover {\n .display_name {\n text-decoration: underline;\n }\n }\n }\n\n .username {\n display: block;\n color: $darker-text-color;\n }\n }\n }\n}\n\n.landing-page {\n p,\n li {\n font-family: $font-sans-serif, sans-serif;\n font-size: 16px;\n font-weight: 400;\n font-size: 16px;\n line-height: 30px;\n margin-bottom: 12px;\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n }\n }\n\n em {\n display: inline;\n margin: 0;\n padding: 0;\n font-weight: 700;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n color: lighten($darker-text-color, 10%);\n }\n\n h1 {\n font-family: $font-display, sans-serif;\n font-size: 26px;\n line-height: 30px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n\n small {\n font-family: $font-sans-serif, sans-serif;\n display: block;\n font-size: 18px;\n font-weight: 400;\n color: lighten($darker-text-color, 10%);\n }\n }\n\n h2 {\n font-family: $font-display, sans-serif;\n font-size: 22px;\n line-height: 26px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h3 {\n font-family: $font-display, sans-serif;\n font-size: 18px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h4 {\n font-family: $font-display, sans-serif;\n font-size: 16px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h5 {\n font-family: $font-display, sans-serif;\n font-size: 14px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h6 {\n font-family: $font-display, sans-serif;\n font-size: 12px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n ul,\n ol {\n margin-left: 20px;\n\n &[type='a'] {\n list-style-type: lower-alpha;\n }\n\n &[type='i'] {\n list-style-type: lower-roman;\n }\n }\n\n ul {\n list-style: disc;\n }\n\n ol {\n list-style: decimal;\n }\n\n li > ol,\n li > ul {\n margin-top: 6px;\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid rgba($ui-base-lighter-color, .6);\n margin: 20px 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n\n &__information,\n &__forms {\n padding: 20px;\n }\n\n &__call-to-action {\n background: $ui-base-color;\n border-radius: 4px;\n padding: 25px 40px;\n overflow: hidden;\n box-sizing: border-box;\n\n .row {\n width: 100%;\n display: flex;\n flex-direction: row-reverse;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n }\n\n .row__information-board {\n display: flex;\n justify-content: flex-end;\n align-items: flex-end;\n\n .information-board__section {\n flex: 1 0 auto;\n padding: 0 10px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n width: 100%;\n justify-content: space-between;\n }\n }\n\n .row__mascot {\n flex: 1;\n margin: 10px -50px 0 0;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n }\n\n &__logo {\n margin-right: 20px;\n\n img {\n height: 50px;\n width: auto;\n mix-blend-mode: lighten;\n }\n }\n\n &__information {\n padding: 45px 40px;\n margin-bottom: 10px;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n strong {\n font-weight: 500;\n color: lighten($darker-text-color, 10%);\n }\n\n .account {\n border-bottom: 0;\n padding: 0;\n\n &__display-name {\n align-items: center;\n display: flex;\n margin-right: 5px;\n }\n\n div.account__display-name {\n &:hover {\n .display-name strong {\n text-decoration: none;\n }\n }\n\n .account__avatar {\n cursor: default;\n }\n }\n\n &__avatar-wrapper {\n margin-left: 0;\n flex: 0 0 auto;\n }\n\n &__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n @include avatar-size(44px);\n }\n\n .display-name {\n font-size: 15px;\n\n &__account {\n font-size: 14px;\n }\n }\n }\n\n @media screen and (max-width: $small-breakpoint) {\n .contact {\n margin-top: 30px;\n }\n }\n\n @media screen and (max-width: $column-breakpoint) {\n padding: 25px 20px;\n }\n }\n\n &__information,\n &__forms,\n #mastodon-timeline {\n box-sizing: border-box;\n background: $ui-base-color;\n border-radius: 4px;\n box-shadow: 0 0 6px rgba($black, 0.1);\n }\n\n &__mascot {\n height: 104px;\n position: relative;\n left: -40px;\n bottom: 25px;\n\n img {\n height: 190px;\n width: auto;\n }\n }\n\n &__short-description {\n .row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n margin-bottom: 40px;\n }\n\n @media screen and (max-width: $column-breakpoint) {\n .row {\n margin-bottom: 20px;\n }\n }\n\n p a {\n color: $secondary-text-color;\n }\n\n h1 {\n font-weight: 500;\n color: $primary-text-color;\n margin-bottom: 0;\n\n small {\n color: $darker-text-color;\n\n span {\n color: $secondary-text-color;\n }\n }\n }\n\n p:last-child {\n margin-bottom: 0;\n }\n }\n\n &__hero {\n margin-bottom: 10px;\n\n img {\n display: block;\n margin: 0;\n max-width: 100%;\n height: auto;\n border-radius: 4px;\n }\n }\n\n @media screen and (max-width: 840px) {\n .information-board {\n .container-alt {\n padding-right: 20px;\n }\n\n .panel {\n position: static;\n margin-top: 20px;\n width: 100%;\n border-radius: 4px;\n\n .panel-header {\n text-align: center;\n }\n }\n }\n }\n\n @media screen and (max-width: 675px) {\n .header-wrapper {\n padding-top: 0;\n\n &.compact {\n padding-bottom: 0;\n }\n\n &.compact .hero .heading {\n text-align: initial;\n }\n }\n\n .header .container-alt,\n .features .container-alt {\n display: block;\n }\n }\n\n .cta {\n margin: 20px;\n }\n}\n\n.landing {\n margin-bottom: 100px;\n\n @media screen and (max-width: 738px) {\n margin-bottom: 0;\n }\n\n &__brand {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 50px;\n\n svg {\n fill: $primary-text-color;\n height: 52px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding: 0;\n margin-bottom: 30px;\n }\n }\n\n .directory {\n margin-top: 30px;\n background: transparent;\n box-shadow: none;\n border-radius: 0;\n }\n\n .hero-widget {\n margin-top: 30px;\n margin-bottom: 0;\n\n h4 {\n padding: 10px;\n text-transform: uppercase;\n font-weight: 700;\n font-size: 13px;\n color: $darker-text-color;\n }\n\n &__text {\n border-radius: 0;\n padding-bottom: 0;\n }\n\n &__footer {\n background: $ui-base-color;\n padding: 10px;\n border-radius: 0 0 4px 4px;\n display: flex;\n\n &__column {\n flex: 1 1 50%;\n }\n }\n\n .account {\n padding: 10px 0;\n border-bottom: 0;\n\n .account__display-name {\n display: flex;\n align-items: center;\n }\n\n .account__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n }\n\n &__counter {\n padding: 10px;\n\n strong {\n font-family: $font-display, sans-serif;\n font-size: 15px;\n font-weight: 700;\n display: block;\n }\n\n span {\n font-size: 14px;\n color: $darker-text-color;\n }\n }\n }\n\n .simple_form .user_agreement .label_input > label {\n font-weight: 400;\n color: $darker-text-color;\n }\n\n .simple_form p.lead {\n color: $darker-text-color;\n font-size: 15px;\n line-height: 20px;\n font-weight: 400;\n margin-bottom: 25px;\n }\n\n &__grid {\n max-width: 960px;\n margin: 0 auto;\n display: grid;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n grid-gap: 30px;\n\n @media screen and (max-width: 738px) {\n grid-template-columns: minmax(0, 100%);\n grid-gap: 10px;\n\n &__column-login {\n grid-row: 1;\n display: flex;\n flex-direction: column;\n\n .box-widget {\n order: 2;\n flex: 0 0 auto;\n }\n\n .hero-widget {\n margin-top: 0;\n margin-bottom: 10px;\n order: 1;\n flex: 0 0 auto;\n }\n }\n\n &__column-registration {\n grid-row: 2;\n }\n\n .directory {\n margin-top: 10px;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n\n .hero-widget {\n display: block;\n margin-bottom: 0;\n box-shadow: none;\n\n &__img,\n &__img img,\n &__footer {\n border-radius: 0;\n }\n }\n\n .hero-widget,\n .box-widget,\n .directory__tag {\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n .directory {\n margin-top: 0;\n\n &__tag {\n margin-bottom: 0;\n\n & > a,\n & > div {\n border-radius: 0;\n box-shadow: none;\n }\n\n &:last-child {\n border-bottom: 0;\n }\n }\n }\n }\n }\n}\n\n.brand {\n position: relative;\n text-decoration: none;\n}\n\n.brand__tagline {\n display: block;\n position: absolute;\n bottom: -10px;\n left: 50px;\n width: 300px;\n color: $ui-primary-color;\n text-decoration: none;\n font-size: 14px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n position: static;\n width: auto;\n margin-top: 20px;\n color: $dark-text-color;\n }\n}\n\n",".table {\n width: 100%;\n max-width: 100%;\n border-spacing: 0;\n border-collapse: collapse;\n\n th,\n td {\n padding: 8px;\n line-height: 18px;\n vertical-align: top;\n border-top: 1px solid $ui-base-color;\n text-align: left;\n background: darken($ui-base-color, 4%);\n }\n\n & > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid $ui-base-color;\n border-top: 0;\n font-weight: 500;\n }\n\n & > tbody > tr > th {\n font-weight: 500;\n }\n\n & > tbody > tr:nth-child(odd) > td,\n & > tbody > tr:nth-child(odd) > th {\n background: $ui-base-color;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n &.inline-table {\n & > tbody > tr:nth-child(odd) {\n & > td,\n & > th {\n background: transparent;\n }\n }\n\n & > tbody > tr:first-child {\n & > td,\n & > th {\n border-top: 0;\n }\n }\n }\n\n &.batch-table {\n & > thead > tr > th {\n background: $ui-base-color;\n border-top: 1px solid darken($ui-base-color, 8%);\n border-bottom: 1px solid darken($ui-base-color, 8%);\n\n &:first-child {\n border-radius: 4px 0 0;\n border-left: 1px solid darken($ui-base-color, 8%);\n }\n\n &:last-child {\n border-radius: 0 4px 0 0;\n border-right: 1px solid darken($ui-base-color, 8%);\n }\n }\n }\n\n &--invites tbody td {\n vertical-align: middle;\n }\n}\n\n.table-wrapper {\n overflow: auto;\n margin-bottom: 20px;\n}\n\nsamp {\n font-family: $font-monospace, monospace;\n}\n\nbutton.table-action-link {\n background: transparent;\n border: 0;\n font: inherit;\n}\n\nbutton.table-action-link,\na.table-action-link {\n text-decoration: none;\n display: inline-block;\n margin-right: 5px;\n padding: 0 10px;\n color: $darker-text-color;\n font-weight: 500;\n\n &:hover {\n color: $primary-text-color;\n }\n\n i.fa {\n font-weight: 400;\n margin-right: 5px;\n }\n\n &:first-child {\n padding-left: 0;\n }\n}\n\n.batch-table {\n &__toolbar,\n &__row {\n display: flex;\n\n &__select {\n box-sizing: border-box;\n padding: 8px 16px;\n cursor: pointer;\n min-height: 100%;\n\n input {\n margin-top: 8px;\n }\n\n &--aligned {\n display: flex;\n align-items: center;\n\n input {\n margin-top: 0;\n }\n }\n }\n\n &__actions,\n &__content {\n padding: 8px 0;\n padding-right: 16px;\n flex: 1 1 auto;\n }\n }\n\n &__toolbar {\n border: 1px solid darken($ui-base-color, 8%);\n background: $ui-base-color;\n border-radius: 4px 0 0;\n height: 47px;\n align-items: center;\n\n &__actions {\n text-align: right;\n padding-right: 16px - 5px;\n }\n }\n\n &__form {\n padding: 16px;\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n background: $ui-base-color;\n\n .fields-row {\n padding-top: 0;\n margin-bottom: 0;\n }\n }\n\n &__row {\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n background: darken($ui-base-color, 4%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n .optional &:first-child {\n border-top: 1px solid darken($ui-base-color, 8%);\n }\n }\n\n &:hover {\n background: darken($ui-base-color, 2%);\n }\n\n &:nth-child(even) {\n background: $ui-base-color;\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n }\n\n &__content {\n padding-top: 12px;\n padding-bottom: 16px;\n\n &--unpadded {\n padding: 0;\n }\n\n &--with-image {\n display: flex;\n align-items: center;\n }\n\n &__image {\n flex: 0 0 auto;\n display: flex;\n justify-content: center;\n align-items: center;\n margin-right: 10px;\n\n .emojione {\n width: 32px;\n height: 32px;\n }\n }\n\n &__text {\n flex: 1 1 auto;\n }\n\n &__extra {\n flex: 0 0 auto;\n text-align: right;\n color: $darker-text-color;\n font-weight: 500;\n }\n }\n\n .directory__tag {\n margin: 0;\n width: 100%;\n\n a {\n background: transparent;\n border-radius: 0;\n }\n }\n }\n\n &.optional .batch-table__toolbar,\n &.optional .batch-table__row__select {\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n\n .status__content {\n padding-top: 0;\n\n strong {\n font-weight: 700;\n }\n }\n\n .nothing-here {\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n box-shadow: none;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 1px solid darken($ui-base-color, 8%);\n }\n }\n\n @media screen and (max-width: 870px) {\n .accounts-table tbody td.optional {\n display: none;\n }\n }\n}\n","$no-columns-breakpoint: 600px;\n$sidebar-width: 240px;\n$content-width: 840px;\n\n.admin-wrapper {\n display: flex;\n justify-content: center;\n width: 100%;\n min-height: 100vh;\n\n .sidebar-wrapper {\n min-height: 100vh;\n overflow: hidden;\n pointer-events: none;\n flex: 1 1 auto;\n\n &__inner {\n display: flex;\n justify-content: flex-end;\n background: $ui-base-color;\n height: 100%;\n }\n }\n\n .sidebar {\n width: $sidebar-width;\n padding: 0;\n pointer-events: auto;\n\n &__toggle {\n display: none;\n background: lighten($ui-base-color, 8%);\n height: 48px;\n\n &__logo {\n flex: 1 1 auto;\n\n a {\n display: inline-block;\n padding: 15px;\n }\n\n svg {\n fill: $primary-text-color;\n height: 20px;\n position: relative;\n bottom: -2px;\n }\n }\n\n &__icon {\n display: block;\n color: $darker-text-color;\n text-decoration: none;\n flex: 0 0 auto;\n font-size: 20px;\n padding: 15px;\n }\n\n a {\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 12%);\n }\n }\n }\n\n .logo {\n display: block;\n margin: 40px auto;\n width: 100px;\n height: 100px;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n & > a:first-child {\n display: none;\n }\n }\n\n ul {\n list-style: none;\n border-radius: 4px 0 0 4px;\n overflow: hidden;\n margin-bottom: 20px;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n margin-bottom: 0;\n }\n\n a {\n display: block;\n padding: 15px;\n color: $darker-text-color;\n text-decoration: none;\n transition: all 200ms linear;\n transition-property: color, background-color;\n border-radius: 4px 0 0 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n i.fa {\n margin-right: 5px;\n }\n\n &:hover {\n color: $primary-text-color;\n background-color: darken($ui-base-color, 5%);\n transition: all 100ms linear;\n transition-property: color, background-color;\n }\n\n &.selected {\n background: darken($ui-base-color, 2%);\n border-radius: 4px 0 0;\n }\n }\n\n ul {\n background: darken($ui-base-color, 4%);\n border-radius: 0 0 0 4px;\n margin: 0;\n\n a {\n border: 0;\n padding: 15px 35px;\n }\n }\n\n .simple-navigation-active-leaf a {\n color: $primary-text-color;\n background-color: $ui-highlight-color;\n border-bottom: 0;\n border-radius: 0;\n\n &:hover {\n background-color: lighten($ui-highlight-color, 5%);\n }\n }\n }\n\n & > ul > .simple-navigation-active-leaf a {\n border-radius: 4px 0 0 4px;\n }\n }\n\n .content-wrapper {\n box-sizing: border-box;\n width: 100%;\n max-width: $content-width;\n flex: 1 1 auto;\n }\n\n @media screen and (max-width: $content-width + $sidebar-width) {\n .sidebar-wrapper--empty {\n display: none;\n }\n\n .sidebar-wrapper {\n width: $sidebar-width;\n flex: 0 0 auto;\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n .sidebar-wrapper {\n width: 100%;\n }\n }\n\n .content {\n padding: 20px 15px;\n padding-top: 60px;\n padding-left: 25px;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n max-width: none;\n padding: 15px;\n padding-top: 30px;\n }\n\n &-heading {\n display: flex;\n\n padding-bottom: 40px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n margin: -15px -15px 40px 0;\n\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n\n & > * {\n margin-top: 15px;\n margin-right: 15px;\n }\n\n &-actions {\n display: inline-flex;\n\n & > :not(:first-child) {\n margin-left: 5px;\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n border-bottom: 0;\n padding-bottom: 0;\n }\n }\n\n h2 {\n color: $secondary-text-color;\n font-size: 24px;\n line-height: 28px;\n font-weight: 400;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n font-weight: 700;\n }\n }\n\n h3 {\n color: $secondary-text-color;\n font-size: 20px;\n line-height: 28px;\n font-weight: 400;\n margin-bottom: 30px;\n }\n\n h4 {\n text-transform: uppercase;\n font-size: 13px;\n font-weight: 700;\n color: $darker-text-color;\n padding-bottom: 8px;\n margin-bottom: 8px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n h6 {\n font-size: 16px;\n color: $secondary-text-color;\n line-height: 28px;\n font-weight: 500;\n }\n\n .fields-group h6 {\n color: $primary-text-color;\n font-weight: 500;\n }\n\n .directory__tag > a,\n .directory__tag > div {\n box-shadow: none;\n }\n\n .directory__tag .table-action-link .fa {\n color: inherit;\n }\n\n .directory__tag h4 {\n font-size: 18px;\n font-weight: 700;\n color: $primary-text-color;\n text-transform: none;\n padding-bottom: 0;\n margin-bottom: 0;\n border-bottom: none;\n }\n\n & > p {\n font-size: 14px;\n line-height: 21px;\n color: $secondary-text-color;\n margin-bottom: 20px;\n\n strong {\n color: $primary-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid rgba($ui-base-lighter-color, .6);\n margin: 20px 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n\n .sidebar-wrapper {\n min-height: 0;\n }\n\n .sidebar {\n width: 100%;\n padding: 0;\n height: auto;\n\n &__toggle {\n display: flex;\n }\n\n & > ul {\n display: none;\n }\n\n ul a,\n ul ul a {\n border-radius: 0;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n transition: none;\n\n &:hover {\n transition: none;\n }\n }\n\n ul ul {\n border-radius: 0;\n }\n\n ul .simple-navigation-active-leaf a {\n border-bottom-color: $ui-highlight-color;\n }\n }\n }\n}\n\nhr.spacer {\n width: 100%;\n border: 0;\n margin: 20px 0;\n height: 1px;\n}\n\nbody,\n.admin-wrapper .content {\n .muted-hint {\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n }\n }\n\n .positive-hint {\n color: $valid-value-color;\n font-weight: 500;\n }\n\n .negative-hint {\n color: $error-value-color;\n font-weight: 500;\n }\n\n .neutral-hint {\n color: $dark-text-color;\n font-weight: 500;\n }\n\n .warning-hint {\n color: $gold-star;\n font-weight: 500;\n }\n}\n\n.filters {\n display: flex;\n flex-wrap: wrap;\n\n .filter-subset {\n flex: 0 0 auto;\n margin: 0 40px 20px 0;\n\n &:last-child {\n margin-bottom: 30px;\n }\n\n ul {\n margin-top: 5px;\n list-style: none;\n\n li {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n strong {\n font-weight: 500;\n text-transform: uppercase;\n font-size: 12px;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n text-transform: uppercase;\n font-size: 12px;\n font-weight: 500;\n border-bottom: 2px solid $ui-base-color;\n\n &:hover {\n color: $primary-text-color;\n border-bottom: 2px solid lighten($ui-base-color, 5%);\n }\n\n &.selected {\n color: $highlight-text-color;\n border-bottom: 2px solid $ui-highlight-color;\n }\n }\n }\n}\n\n.flavour-screen {\n display: block;\n margin: 10px auto;\n max-width: 100%;\n}\n\n.flavour-description {\n display: block;\n font-size: 16px;\n margin: 10px 0;\n\n & > p {\n margin: 10px 0;\n }\n}\n\n.report-accounts {\n display: flex;\n flex-wrap: wrap;\n margin-bottom: 20px;\n}\n\n.report-accounts__item {\n display: flex;\n flex: 250px;\n flex-direction: column;\n margin: 0 5px;\n\n & > strong {\n display: block;\n margin: 0 0 10px -5px;\n font-weight: 500;\n font-size: 14px;\n line-height: 18px;\n color: $secondary-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n .account-card {\n flex: 1 1 auto;\n }\n}\n\n.report-status,\n.account-status {\n display: flex;\n margin-bottom: 10px;\n\n .activity-stream {\n flex: 2 0 0;\n margin-right: 20px;\n max-width: calc(100% - 60px);\n\n .entry {\n border-radius: 4px;\n }\n }\n}\n\n.report-status__actions,\n.account-status__actions {\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n\n .icon-button {\n font-size: 24px;\n width: 24px;\n text-align: center;\n margin-bottom: 10px;\n }\n}\n\n.simple_form.new_report_note,\n.simple_form.new_account_moderation_note {\n max-width: 100%;\n}\n\n.batch-form-box {\n display: flex;\n flex-wrap: wrap;\n margin-bottom: 5px;\n\n #form_status_batch_action {\n margin: 0 5px 5px 0;\n font-size: 14px;\n }\n\n input.button {\n margin: 0 5px 5px 0;\n }\n\n .media-spoiler-toggle-buttons {\n margin-left: auto;\n\n .button {\n overflow: visible;\n margin: 0 0 5px 5px;\n float: right;\n }\n }\n}\n\n.back-link {\n margin-bottom: 10px;\n font-size: 14px;\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.spacer {\n flex: 1 1 auto;\n}\n\n.log-entry {\n margin-bottom: 20px;\n line-height: 20px;\n\n &__header {\n display: flex;\n justify-content: flex-start;\n align-items: center;\n padding: 10px;\n background: $ui-base-color;\n color: $darker-text-color;\n border-radius: 4px 4px 0 0;\n font-size: 14px;\n position: relative;\n }\n\n &__avatar {\n margin-right: 10px;\n\n .avatar {\n display: block;\n margin: 0;\n border-radius: 50%;\n width: 40px;\n height: 40px;\n }\n }\n\n &__content {\n max-width: calc(100% - 90px);\n }\n\n &__title {\n word-wrap: break-word;\n }\n\n &__timestamp {\n color: $dark-text-color;\n }\n\n &__extras {\n background: lighten($ui-base-color, 6%);\n border-radius: 0 0 4px 4px;\n padding: 10px;\n color: $darker-text-color;\n font-family: $font-monospace, monospace;\n font-size: 12px;\n word-wrap: break-word;\n min-height: 20px;\n }\n\n &__icon {\n font-size: 28px;\n margin-right: 10px;\n color: $dark-text-color;\n }\n\n &__icon__overlay {\n position: absolute;\n top: 10px;\n right: 10px;\n width: 10px;\n height: 10px;\n border-radius: 50%;\n\n &.positive {\n background: $success-green;\n }\n\n &.negative {\n background: lighten($error-red, 12%);\n }\n\n &.neutral {\n background: $ui-highlight-color;\n }\n }\n\n a,\n .username,\n .target {\n color: $secondary-text-color;\n text-decoration: none;\n font-weight: 500;\n }\n\n .diff-old {\n color: lighten($error-red, 12%);\n }\n\n .diff-neutral {\n color: $secondary-text-color;\n }\n\n .diff-new {\n color: $success-green;\n }\n}\n\na.name-tag,\n.name-tag,\na.inline-name-tag,\n.inline-name-tag {\n text-decoration: none;\n color: $secondary-text-color;\n\n .username {\n font-weight: 500;\n }\n\n &.suspended {\n .username {\n text-decoration: line-through;\n color: lighten($error-red, 12%);\n }\n\n .avatar {\n filter: grayscale(100%);\n opacity: 0.8;\n }\n }\n}\n\na.name-tag,\n.name-tag {\n display: flex;\n align-items: center;\n\n .avatar {\n display: block;\n margin: 0;\n margin-right: 5px;\n border-radius: 50%;\n }\n\n &.suspended {\n .avatar {\n filter: grayscale(100%);\n opacity: 0.8;\n }\n }\n}\n\n.speech-bubble {\n margin-bottom: 20px;\n border-left: 4px solid $ui-highlight-color;\n\n &.positive {\n border-left-color: $success-green;\n }\n\n &.negative {\n border-left-color: lighten($error-red, 12%);\n }\n\n &.warning {\n border-left-color: $gold-star;\n }\n\n &__bubble {\n padding: 16px;\n padding-left: 14px;\n font-size: 15px;\n line-height: 20px;\n border-radius: 4px 4px 4px 0;\n position: relative;\n font-weight: 500;\n\n a {\n color: $darker-text-color;\n }\n }\n\n &__owner {\n padding: 8px;\n padding-left: 12px;\n }\n\n time {\n color: $dark-text-color;\n }\n}\n\n.report-card {\n background: $ui-base-color;\n border-radius: 4px;\n margin-bottom: 20px;\n\n &__profile {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 15px;\n\n .account {\n padding: 0;\n border: 0;\n\n &__avatar-wrapper {\n margin-left: 0;\n }\n }\n\n &__stats {\n flex: 0 0 auto;\n font-weight: 500;\n color: $darker-text-color;\n text-transform: uppercase;\n text-align: right;\n\n a {\n color: inherit;\n text-decoration: none;\n\n &:focus,\n &:hover,\n &:active {\n color: lighten($darker-text-color, 8%);\n }\n }\n\n .red {\n color: $error-value-color;\n }\n }\n }\n\n &__summary {\n &__item {\n display: flex;\n justify-content: flex-start;\n border-top: 1px solid darken($ui-base-color, 4%);\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n\n &__reported-by,\n &__assigned {\n padding: 15px;\n flex: 0 0 auto;\n box-sizing: border-box;\n width: 150px;\n color: $darker-text-color;\n\n &,\n .username {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n &__content {\n flex: 1 1 auto;\n max-width: calc(100% - 300px);\n\n &__icon {\n color: $dark-text-color;\n margin-right: 4px;\n font-weight: 500;\n }\n }\n\n &__content a {\n display: block;\n box-sizing: border-box;\n width: 100%;\n padding: 15px;\n text-decoration: none;\n color: $darker-text-color;\n }\n }\n }\n}\n\n.one-line {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.ellipsized-ip {\n display: inline-block;\n max-width: 120px;\n overflow: hidden;\n text-overflow: ellipsis;\n vertical-align: middle;\n}\n\n.admin-account-bio {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n margin-top: 20px;\n\n > div {\n box-sizing: border-box;\n padding: 0 5px;\n margin-bottom: 10px;\n flex: 1 0 50%;\n }\n\n .account__header__fields,\n .account__header__content {\n background: lighten($ui-base-color, 8%);\n border-radius: 4px;\n height: 100%;\n }\n\n .account__header__fields {\n margin: 0;\n border: 0;\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n\n .account__header__content {\n box-sizing: border-box;\n padding: 20px;\n color: $primary-text-color;\n }\n}\n\n.center-text {\n text-align: center;\n}\n","$emojis-requiring-outlines: '8ball' 'ant' 'back' 'black_circle' 'black_heart' 'black_large_square' 'black_medium_small_square' 'black_medium_square' 'black_nib' 'black_small_square' 'bomb' 'bowling' 'bust_in_silhouette' 'busts_in_silhouette' 'camera' 'camera_with_flash' 'clubs' 'copyright' 'curly_loop' 'currency_exchange' 'dark_sunglasses' 'eight_pointed_black_star' 'electric_plug' 'end' 'female-guard' 'film_projector' 'fried_egg' 'gorilla' 'guardsman' 'heavy_check_mark' 'heavy_division_sign' 'heavy_dollar_sign' 'heavy_minus_sign' 'heavy_multiplication_x' 'heavy_plus_sign' 'hocho' 'hole' 'joystick' 'kaaba' 'lower_left_ballpoint_pen' 'lower_left_fountain_pen' 'male-guard' 'microphone' 'mortar_board' 'movie_camera' 'musical_score' 'on' 'registered' 'soon' 'spades' 'speaking_head_in_silhouette' 'spider' 'telephone_receiver' 'tm' 'top' 'tophat' 'turkey' 'vhs' 'video_camera' 'video_game' 'water_buffalo' 'waving_black_flag' 'wavy_dash' !default;\n\n%emoji-outline {\n filter: drop-shadow(1px 1px 0 $primary-text-color) drop-shadow(-1px 1px 0 $primary-text-color) drop-shadow(1px -1px 0 $primary-text-color) drop-shadow(-1px -1px 0 $primary-text-color);\n}\n\n.emojione {\n @each $emoji in $emojis-requiring-outlines {\n &[title=':#{$emoji}:'] {\n @extend %emoji-outline;\n }\n }\n}\n\n.hicolor-privacy-icons {\n .status__visibility-icon.fa-globe,\n .composer--options--dropdown--content--item .fa-globe {\n color: #1976D2;\n }\n\n .status__visibility-icon.fa-unlock,\n .composer--options--dropdown--content--item .fa-unlock {\n color: #388E3C;\n }\n\n .status__visibility-icon.fa-lock,\n .composer--options--dropdown--content--item .fa-lock {\n color: #FFA000;\n }\n\n .status__visibility-icon.fa-envelope,\n .composer--options--dropdown--content--item .fa-envelope {\n color: #D32F2F;\n }\n}\n","body.rtl {\n direction: rtl;\n\n .column-header > button {\n text-align: right;\n padding-left: 0;\n padding-right: 15px;\n }\n\n .radio-button__input {\n margin-right: 0;\n margin-left: 10px;\n }\n\n .directory__card__bar .display-name {\n margin-left: 0;\n margin-right: 15px;\n }\n\n .display-name {\n text-align: right;\n }\n\n .notification__message {\n margin-left: 0;\n margin-right: 68px;\n }\n\n .drawer__inner__mastodon > img {\n transform: scaleX(-1);\n }\n\n .notification__favourite-icon-wrapper {\n left: auto;\n right: -26px;\n }\n\n .landing-page__logo {\n margin-right: 0;\n margin-left: 20px;\n }\n\n .landing-page .features-list .features-list__row .visual {\n margin-left: 0;\n margin-right: 15px;\n }\n\n .column-link__icon,\n .column-header__icon {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .compose-form .compose-form__buttons-wrapper .character-counter__wrapper {\n margin-right: 0;\n margin-left: 4px;\n }\n\n .composer--publisher {\n text-align: left;\n }\n\n .boost-modal__status-time,\n .favourite-modal__status-time {\n float: left;\n }\n\n .navigation-bar__profile {\n margin-left: 0;\n margin-right: 8px;\n }\n\n .search__input {\n padding-right: 10px;\n padding-left: 30px;\n }\n\n .search__icon .fa {\n right: auto;\n left: 10px;\n }\n\n .columns-area {\n direction: rtl;\n }\n\n .column-header__buttons {\n left: 0;\n right: auto;\n margin-left: 0;\n margin-right: -15px;\n }\n\n .column-inline-form .icon-button {\n margin-left: 0;\n margin-right: 5px;\n }\n\n .column-header__links .text-btn {\n margin-left: 10px;\n margin-right: 0;\n }\n\n .account__avatar-wrapper {\n float: right;\n }\n\n .column-header__back-button {\n padding-left: 5px;\n padding-right: 0;\n }\n\n .column-header__setting-arrows {\n float: left;\n }\n\n .setting-toggle__label {\n margin-left: 0;\n margin-right: 8px;\n }\n\n .setting-meta__label {\n float: left;\n }\n\n .status__avatar {\n margin-left: 10px;\n margin-right: 0;\n\n // Those are used for public pages\n left: auto;\n right: 10px;\n }\n\n .activity-stream .status.light {\n padding-left: 10px;\n padding-right: 68px;\n }\n\n .status__info .status__display-name,\n .activity-stream .status.light .status__display-name {\n padding-left: 25px;\n padding-right: 0;\n }\n\n .activity-stream .pre-header {\n padding-right: 68px;\n padding-left: 0;\n }\n\n .status__prepend {\n margin-left: 0;\n margin-right: 58px;\n }\n\n .status__prepend-icon-wrapper {\n left: auto;\n right: -26px;\n }\n\n .activity-stream .pre-header .pre-header__icon {\n left: auto;\n right: 42px;\n }\n\n .account__avatar-overlay-overlay {\n right: auto;\n left: 0;\n }\n\n .column-back-button--slim-button {\n right: auto;\n left: 0;\n }\n\n .status__relative-time,\n .activity-stream .status.light .status__header .status__meta {\n float: left;\n text-align: left;\n }\n\n .status__action-bar {\n &__counter {\n margin-right: 0;\n margin-left: 11px;\n\n .status__action-bar-button {\n margin-right: 0;\n margin-left: 4px;\n }\n }\n }\n\n .status__action-bar-button {\n float: right;\n margin-right: 0;\n margin-left: 18px;\n }\n\n .status__action-bar-dropdown {\n float: right;\n }\n\n .privacy-dropdown__dropdown {\n margin-left: 0;\n margin-right: 40px;\n }\n\n .privacy-dropdown__option__icon {\n margin-left: 10px;\n margin-right: 0;\n }\n\n .detailed-status__display-name .display-name {\n text-align: right;\n }\n\n .detailed-status__display-avatar {\n margin-right: 0;\n margin-left: 10px;\n float: right;\n }\n\n .detailed-status__favorites,\n .detailed-status__reblogs {\n margin-left: 0;\n margin-right: 6px;\n }\n\n .fa-ul {\n margin-left: 2.14285714em;\n }\n\n .fa-li {\n left: auto;\n right: -2.14285714em;\n }\n\n .admin-wrapper {\n direction: rtl;\n }\n\n .admin-wrapper .sidebar ul a i.fa,\n a.table-action-link i.fa {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .simple_form .check_boxes .checkbox label {\n padding-left: 0;\n padding-right: 25px;\n }\n\n .simple_form .input.with_label.boolean label.checkbox {\n padding-left: 25px;\n padding-right: 0;\n }\n\n .simple_form .check_boxes .checkbox input[type=\"checkbox\"],\n .simple_form .input.boolean input[type=\"checkbox\"] {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.radio_buttons .radio {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.radio_buttons .radio > label {\n padding-right: 28px;\n padding-left: 0;\n }\n\n .simple_form .input-with-append .input input {\n padding-left: 142px;\n padding-right: 0;\n }\n\n .simple_form .input.boolean label.checkbox {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.boolean .label_input,\n .simple_form .input.boolean .hint {\n padding-left: 0;\n padding-right: 28px;\n }\n\n .simple_form .label_input__append {\n right: auto;\n left: 3px;\n\n &::after {\n right: auto;\n left: 0;\n background-image: linear-gradient(to left, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));\n }\n }\n\n .simple_form select {\n background: darken($ui-base-color, 10%) url(\"data:image/svg+xml;utf8,\") no-repeat left 8px center / auto 16px;\n }\n\n .table th,\n .table td {\n text-align: right;\n }\n\n .filters .filter-subset {\n margin-right: 0;\n margin-left: 45px;\n }\n\n .landing-page .header-wrapper .mascot {\n right: 60px;\n left: auto;\n }\n\n .landing-page__call-to-action .row__information-board {\n direction: rtl;\n }\n\n .landing-page .header .hero .floats .float-1 {\n left: -120px;\n right: auto;\n }\n\n .landing-page .header .hero .floats .float-2 {\n left: 210px;\n right: auto;\n }\n\n .landing-page .header .hero .floats .float-3 {\n left: 110px;\n right: auto;\n }\n\n .landing-page .header .links .brand img {\n left: 0;\n }\n\n .landing-page .fa-external-link {\n padding-right: 5px;\n padding-left: 0 !important;\n }\n\n .landing-page .features #mastodon-timeline {\n margin-right: 0;\n margin-left: 30px;\n }\n\n @media screen and (min-width: 631px) {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n\n &:first-child {\n padding-left: 5px;\n padding-right: 10px;\n }\n }\n\n .columns-area > div {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n }\n }\n }\n\n .columns-area--mobile .column,\n .columns-area--mobile .drawer {\n padding-left: 0;\n padding-right: 0;\n }\n\n .public-layout {\n .header {\n .nav-button {\n margin-left: 8px;\n margin-right: 0;\n }\n }\n\n .public-account-header__tabs {\n margin-left: 0;\n margin-right: 20px;\n }\n }\n\n .landing-page__information {\n .account__display-name {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .account__avatar-wrapper {\n margin-left: 12px;\n margin-right: 0;\n }\n }\n\n .card__bar .display-name {\n margin-left: 0;\n margin-right: 15px;\n text-align: right;\n }\n\n .fa-chevron-left::before {\n content: \"\\F054\";\n }\n\n .fa-chevron-right::before {\n content: \"\\F053\";\n }\n\n .column-back-button__icon {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .column-header__setting-arrows .column-header__setting-btn:last-child {\n padding-left: 0;\n padding-right: 10px;\n }\n\n .simple_form .input.radio_buttons .radio > label input {\n left: auto;\n right: 0;\n }\n}\n",".dashboard__counters {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n margin-bottom: 20px;\n\n & > div {\n box-sizing: border-box;\n flex: 0 0 33.333%;\n padding: 0 5px;\n margin-bottom: 10px;\n\n & > div,\n & > a {\n padding: 20px;\n background: lighten($ui-base-color, 4%);\n border-radius: 4px;\n box-sizing: border-box;\n height: 100%;\n }\n\n & > a {\n text-decoration: none;\n color: inherit;\n display: block;\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 8%);\n }\n }\n }\n\n &__num,\n &__text {\n text-align: center;\n font-weight: 500;\n font-size: 24px;\n line-height: 21px;\n color: $primary-text-color;\n font-family: $font-display, sans-serif;\n margin-bottom: 20px;\n line-height: 30px;\n }\n\n &__text {\n font-size: 18px;\n }\n\n &__label {\n font-size: 14px;\n color: $darker-text-color;\n text-align: center;\n font-weight: 500;\n }\n}\n\n.dashboard__widgets {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n\n & > div {\n flex: 0 0 33.333%;\n margin-bottom: 20px;\n\n & > div {\n padding: 0 5px;\n }\n }\n\n a:not(.name-tag) {\n color: $ui-secondary-color;\n font-weight: 500;\n text-decoration: none;\n }\n}\n","// components.scss\n.compose-form {\n .compose-form__modifiers {\n .compose-form__upload {\n &-description {\n input {\n &::placeholder {\n opacity: 1.0;\n }\n }\n }\n }\n }\n}\n\n.rich-formatting a,\n.rich-formatting p a,\n.rich-formatting li a,\n.landing-page__short-description p a,\n.status__content a,\n.reply-indicator__content a {\n color: lighten($ui-highlight-color, 12%);\n text-decoration: underline;\n\n &.mention {\n text-decoration: none;\n }\n\n &.mention span {\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n\n &.status__content__spoiler-link {\n color: $secondary-text-color;\n text-decoration: none;\n }\n}\n\n.status__content__read-more-button {\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n}\n\n.getting-started__footer a {\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n}\n\n.nothing-here {\n color: $darker-text-color;\n}\n\n.public-layout .public-account-header__tabs__tabs .counter.active::after {\n border-bottom: 4px solid $ui-highlight-color;\n}\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///common.scss","webpack:///./app/javascript/flavours/glitch/styles/reset.scss","webpack:///./app/javascript/flavours/glitch/styles/contrast/variables.scss","webpack:///./app/javascript/flavours/glitch/styles/basics.scss","webpack:///./app/javascript/flavours/glitch/styles/variables.scss","webpack:///./app/javascript/flavours/glitch/styles/containers.scss","webpack:///./app/javascript/flavours/glitch/styles/_mixins.scss","webpack:///./app/javascript/flavours/glitch/styles/lists.scss","webpack:///./app/javascript/flavours/glitch/styles/modal.scss","webpack:///./app/javascript/flavours/glitch/styles/footer.scss","webpack:///./app/javascript/flavours/glitch/styles/compact_header.scss","webpack:///./app/javascript/flavours/glitch/styles/widgets.scss","webpack:///./app/javascript/flavours/glitch/styles/forms.scss","webpack:///./app/javascript/flavours/glitch/styles/accounts.scss","webpack:///./app/javascript/flavours/glitch/styles/statuses.scss","webpack:///./app/javascript/flavours/glitch/styles/components/index.scss","webpack:///./app/javascript/flavours/glitch/styles/components/boost.scss","webpack:///./app/javascript/flavours/glitch/styles/components/accounts.scss","webpack:///./app/javascript/flavours/glitch/styles/components/domains.scss","webpack:///./app/javascript/flavours/glitch/styles/components/status.scss","webpack:///./app/javascript/flavours/glitch/styles/components/modal.scss","webpack:///./app/javascript/flavours/glitch/styles/components/composer.scss","webpack:///./app/javascript/flavours/glitch/styles/components/columns.scss","webpack:///./app/javascript/flavours/glitch/styles/components/regeneration_indicator.scss","webpack:///./app/javascript/flavours/glitch/styles/components/directory.scss","webpack:///./app/javascript/flavours/glitch/styles/components/search.scss","webpack:///","webpack:///./app/javascript/flavours/glitch/styles/components/emoji.scss","webpack:///./app/javascript/flavours/glitch/styles/components/doodle.scss","webpack:///./app/javascript/flavours/glitch/styles/components/drawer.scss","webpack:///./app/javascript/flavours/glitch/styles/components/media.scss","webpack:///./app/javascript/flavours/glitch/styles/components/sensitive.scss","webpack:///./app/javascript/flavours/glitch/styles/components/lists.scss","webpack:///./app/javascript/flavours/glitch/styles/components/emoji_picker.scss","webpack:///./app/javascript/flavours/glitch/styles/components/local_settings.scss","webpack:///./app/javascript/flavours/glitch/styles/components/error_boundary.scss","webpack:///./app/javascript/flavours/glitch/styles/components/single_column.scss","webpack:///./app/javascript/flavours/glitch/styles/components/announcements.scss","webpack:///./app/javascript/flavours/glitch/styles/polls.scss","webpack:///./app/javascript/flavours/glitch/styles/about.scss","webpack:///./app/javascript/flavours/glitch/styles/tables.scss","webpack:///./app/javascript/flavours/glitch/styles/admin.scss","webpack:///./app/javascript/flavours/glitch/styles/accessibility.scss","webpack:///./app/javascript/flavours/glitch/styles/rtl.scss","webpack:///./app/javascript/flavours/glitch/styles/dashboard.scss","webpack:///./app/javascript/flavours/glitch/styles/contrast/diff.scss"],"names":[],"mappings":"AAAA,2ZCKA,QAaE,UACA,SACA,eACA,aACA,wBACA,+EAIF,aAEE,MAGF,aACE,OAGF,eACE,cAGF,WACE,qDAGF,UAEE,aACA,OAGF,wBACE,iBACA,MAGF,sCACE,qBAGF,UACE,YACA,2BAGF,kBACE,cACA,mBACA,iCAGF,kBACE,kCAGF,kBACE,2BAGF,aACE,gBACA,0BACA,CC9EmB,iEDqFrB,kBCrFqB,4BDyFrB,sBACE,MEtFF,sBACE,mBACA,eACA,iBACA,gBACA,WCVM,kCDYN,6BACA,8BACA,CADA,0BACA,CADA,qBACA,0CACA,wCACA,kBAEA,sIAYE,eAGF,SACE,oCAEA,WACE,iBACA,kBACA,uCAGF,iBACE,WACA,YACA,mCAGF,iBACE,cAIJ,kBDpDmB,kBCwDnB,iBACE,kBACA,0BAEA,iBACE,YAIJ,kBACE,SACA,iBACA,uBAEA,iBACE,WACA,YACA,gBACA,YAIJ,kBACE,UACA,YAGF,iBACE,kBACA,cDzEgB,mBAZC,WCwFjB,YACA,UACA,aACA,uBACA,mBACA,oBAEA,qBACE,YACA,wBAEA,aACE,gBACA,WACA,YACA,kBACA,uBAGF,cACE,iBACA,gBACA,QAMR,mBACE,eACA,cAEA,YACE,6BAKF,YAEE,WACA,mBACA,uBACA,oBACA,yEAKF,gBAEE,+EAKF,WAEE,gBErJJ,WACE,CACA,kBACA,qCAEA,eALF,UAMI,SACA,kBAIJ,sBACE,qCAEA,gBAHF,kBAII,qBAGF,YACE,uBACA,mBACA,wBAEA,SDrBI,YCuBF,kBACA,sBAGF,YACE,uBACA,mBACA,WD9BE,qBCgCF,UACA,kBACA,iBACA,uBACA,gBACA,eACA,mCAMJ,WACE,CACA,cACA,mBACA,sBACA,qCAEA,kCAPF,UAQI,aACA,aACA,kBAKN,WACE,CACA,YACA,eACA,iBACA,sBACA,CACA,gBACA,CACA,sBACA,qCAEA,gBAZF,UAaI,CACA,eACA,CACA,mBACA,0BAKA,UACqB,sCC3EvB,iBD4EE,6BAEA,UACE,YACA,cACA,SACA,kBACA,iBD5BkB,wBE9DtB,4BACA,uBD8FA,aACE,cHjFmB,wBGmFnB,iCAEA,aACE,gBACA,uBACA,gBACA,8BAIJ,aACE,eACA,iBACA,gBACA,SAIJ,YACE,cACA,8BACA,sBACA,mCACA,CADA,0BACA,mBAEA,eACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,eACE,WACA,qCAGF,QA3BF,UA4BI,qCACA,mBAEA,aACE,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,UAKN,YACE,cACA,8CACA,sBACA,mCACA,CADA,0BACA,mBAEA,eACE,WACA,mBAGF,eACE,WACA,mBAGF,aACE,WACA,mBAGF,eACE,WACA,mBAGF,aACE,WACA,uCAGF,eACE,wBAGF,kBACE,qCAGF,QAxCF,iDAyCI,uCAEA,YACE,aACA,mBACA,uBACA,iCAGF,UACE,uBACA,mBACA,sBAGF,YACE,sCAIJ,QA7DF,UA8DI,qCACA,mBAEA,aACE,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,sCAMJ,eADF,gBAEI,4BAGF,eACE,qCAEA,0BAHF,SAII,yBAIJ,kBACE,mCACA,kBACA,YACA,cACA,aACA,oBACA,uBACA,iBACA,gBACA,qCAEA,uBAZF,cAaI,WACA,MACA,OACA,SACA,gBACA,gBACA,YACA,6BAGF,cACE,eACA,kCAGF,YACE,oBACA,2BACA,iBACA,oCAGF,YACE,oBACA,uBACA,iBACA,mCAGF,YACE,oBACA,yBACA,iBACA,+BAGF,aACE,aACA,mCAEA,aACE,YACA,WACA,kBACA,YACA,UD1UA,qCC6UA,kCARF,WASI,+GAIJ,kBAGE,kCAIJ,YACE,mBACA,eACA,eACA,gBACA,qBACA,cHlVc,mBGoVd,kBACA,uHAEA,yBAGE,WDvWA,qCC2WF,0CACE,YACE,qCAKN,kBACE,CACA,oBACA,kBACA,6HAEA,oBAGE,mBACA,sBAON,YACE,cACA,0DACA,sBACA,mCACA,CADA,0BACA,gCAEA,UACE,cACA,gCAGF,UACE,cACA,qCAGF,qBAjBF,0BAkBI,WACA,gCAEA,YACE,kCAKN,iBACE,qCAEA,gCAHF,eAII,sCAKF,4BADF,eAEI,wCAIJ,eACE,mBACA,mCACA,gDAEA,UACE,qIAEA,8BAEE,CAFF,sBAEE,6DAGF,wBH1aiB,8CG+anB,yBACE,gBACA,aACA,kBACA,mBACA,oDAEA,UACE,cACA,kBACA,WACA,YACA,gDACA,MACA,OACA,kDAGF,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,0BACA,qCAGF,6CA3BF,YA4BI,gDAIJ,eACE,6JAEA,iBAEE,qCAEA,4JAJF,eAKI,sCAKN,sCA/DF,eAgEI,gBACA,oDAEA,YACE,+FAGF,eAEE,6CAIJ,iBACE,iBACA,aACA,2BACA,mDAEA,UACE,cACA,mBACA,kBACA,SACA,OACA,QACA,YACA,0BACA,WACA,oDAGF,aACE,CAEA,WACqB,yCCzgB3B,kBD0gBM,cACA,wDAEA,aACE,WACA,YACA,SACA,kBACA,yBACA,mBACA,iBD7dc,wBE9DtB,4BACA,qCD+hBI,2CAvCF,YAwCI,mBACA,0BACA,YACA,mDAEA,YACE,oDAKA,UACqB,sCCtiB7B,CDuiBQ,sBACA,wDAEA,QACE,kBACA,iBDrfY,wBE9DtB,4BACA,2DDsjBQ,mDAbF,YAcI,sCAKN,2CApEF,eAqEI,sCAGF,2CAxEF,cAyEI,8CAIJ,aACE,iBACA,mDAEA,gBACE,mBACA,sDAEA,cACE,iBACA,WDhlBF,gBCklBE,gBACA,mBACA,uBACA,6BACA,4DAEA,aACE,eACA,WD1lBJ,gBC4lBI,gBACA,uBACA,qCAKN,4CA7BF,gBA8BI,aACA,8BACA,mBACA,mDAEA,aACE,iBACA,sDAEA,cACE,iBACA,iBACA,4DAEA,aHrmBQ,oDG4mBd,YACE,2BACA,oBACA,YACA,qEAEA,YACE,mBACA,gBACA,qCAGF,oEACE,YACE,6DAIJ,eACE,sBACA,cACA,cHjoBU,aGmoBV,+BACA,eACA,kBACA,kBACA,8DAEA,aACE,uEAGF,cACE,kEAGF,aACE,WACA,kBACA,SACA,OACA,WACA,gCACA,WACA,wBACA,yEAIA,+BACE,UACA,kFAGF,2BHjqBW,wEGuqBX,SACE,wBACA,8DAIJ,oBACE,cACA,2EAGF,cACE,cACA,4EAGF,eACE,eACA,kBACA,WDzsBJ,uBC2sBI,2DAIJ,aACE,WACA,4DAGF,eACE,8CAKN,YACE,eACA,kEAEA,eACE,gBACA,uBACA,cACA,2FAEA,4BACE,yEAGF,YACE,qDAIJ,gBACE,eACA,cHluBY,uDGquBZ,oBACE,cHtuBU,qBGwuBV,aACA,gBACA,8DAEA,eACE,WD1vBJ,qCCgwBF,6CAtCF,aAuCI,UACA,4CAKN,yBACE,qCAEA,0CAHF,eAII,wCAIJ,eACE,oCAGF,kBACE,mCACA,kBACA,gBACA,mBACA,qCAEA,mCAPF,eAQI,gBACA,gBACA,8DAGF,QACE,aACA,+DAEA,aACE,sFAGF,uBACE,yEAGF,aD3yBU,8DCizBV,mBACA,WDnzBE,qFCuzBJ,YAEE,eACA,cH7yBc,2CGizBhB,gBACE,iCAIJ,YACE,cACA,kDACA,qCAEA,gCALF,aAMI,+CAGF,cACE,iCAIJ,eACE,2BAGF,YACE,eACA,eACA,cACA,+BAEA,qBACE,cACA,YACA,cACA,mBACA,kBACA,qCAEA,8BARF,aASI,sCAGF,8BAZF,cAaI,sCAIJ,0BAvBF,QAwBI,6BACA,+BAEA,UACE,UACA,gBACA,gCACA,0CAEA,eACE,0CAGF,kBHz3Ba,+IG43BX,kBAGE,WEl4BZ,eACE,aAEA,oBACE,aACA,iBAIJ,eACE,cACA,oBAEA,cACE,gBACA,mBACA,eChBJ,k1BACE,aACA,sBACA,aACA,UACA,yBAGF,YACE,OACA,sBACA,yBACA,2BAEA,MACE,iBACA,qCAIJ,gBACE,YACE,yBCrBF,eACE,iBACA,oBACA,eACA,cACA,qCAEA,uBAPF,iBAQI,mBACA,+BAGF,YACE,cACA,0CACA,wCAEA,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,kBACA,6CAEA,aACE,wCAIJ,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,qCAGF,6BAxCF,iCAyCI,+EAEA,aAEE,wCAGF,UACE,wCAGF,aACE,+EAGF,aAEE,wCAGF,UACE,sCAIJ,uCACE,aACE,sCAIJ,4JACE,YAIE,4BAKN,wBACE,gBACA,kBACA,cPnFc,6BOsFd,aACE,qBACA,6BAIJ,oBACE,cACA,wGAEA,yBAGE,mCAKF,aACE,YACA,WACA,cACA,aACA,0HAMA,YACE,oBClIR,cACE,iBACA,cRYgB,gBQVhB,mBACA,eACA,qBACA,qCAEA,mBATF,iBAUI,oBACA,uBAGF,aACE,qBACA,0BAGF,eACE,cRJiB,wBQQnB,oBACE,mBACA,kBACA,WACA,YACA,cC9BN,kBACE,mCACA,mBAEA,UACE,kBACA,gBACA,0BACA,gBPPI,uBOUJ,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,0BACA,oBAIJ,kBTlBmB,aSoBjB,0BACA,eACA,cTVgB,iBSYhB,qBACA,gBACA,8BAEA,UACE,YACA,gBACA,sBAGF,kBACE,iCAEA,eACE,uBAIJ,cACE,SACA,UACA,gBACA,uBACA,oBACA,kBACA,oBACA,cACA,sBAGF,aTxCmB,qBS0CjB,4BAEA,yBACE,qCAKN,aAnEF,YAoEI,uBAIJ,kBACE,oBACA,yBAEA,YACE,yBACA,gBACA,eACA,cTjEgB,+BSqElB,cACE,0CAEA,eACE,sDAGF,YACE,mBACA,gDAGF,UACE,YACA,0BACA,oCAIJ,YACE,mBAKF,aT9FkB,aSmGpB,YACE,kBACA,mBTjHmB,mCSmHnB,qBAGF,YACE,kBACA,0BACA,kBACA,cT9GkB,mBSgHlB,iBAGF,eACE,eACA,cTrHkB,iBSuHlB,qBACA,gBACA,UACA,oBAEA,YACE,yBACA,gBACA,eACA,cThIgB,0BSoIlB,eACE,CACA,kBACA,mBAGF,oBACE,CACA,mBACA,cT7IgB,qBS+IhB,mBACA,gBACA,uBACA,0EAEA,yBAGE,uBAMJ,sBACA,kBACA,mBT3KmB,mCS6KnB,cT/JqB,gBSiKrB,mBACA,sDAEA,eAEE,CAII,qXADF,eACE,yBAKN,aACE,0BACA,CAMI,wLAGF,oBAGE,mIAEA,yBACE,gCAMR,kBACE,oCAEA,gBACE,cT5Mc,8DSkNhB,iBACE,eACA,4DAGF,eACE,qBACA,iEAEA,eACE,kBAMR,YACE,CACA,ePlPM,COoPN,cACA,cTvOkB,mBSyOlB,+BANA,iBACA,CPlPM,kCOgQN,CATA,aAGF,kBACE,CAEA,iBACA,kBACA,cACA,iBAEA,UPjQM,eOmQJ,gBACA,gBACA,mBACA,gBAGF,cACE,cT7PgB,qCSiQlB,aArBF,YAsBI,mBACA,iBAEA,cACE,aAKN,kBTvRqB,kBSyRnB,mCACA,iBAEA,qBACE,mBACA,uCAEA,YAEE,mBACA,8BACA,mBTpSe,kBSsSf,aACA,qBACA,cACA,mCACA,0EAIA,kBAGE,0BAIJ,kBT3SiB,eS6Sf,8BAGF,UACE,eACA,oBAGF,aACE,eACA,gBACA,WPnUE,mBOqUF,gBACA,uBACA,wBAEA,aT5Tc,0BSgUd,aACE,gBACA,eACA,eACA,cTpUY,yFS0Ud,UPvVE,+BO8VJ,aACE,YACA,uDAGF,oBTxViB,eS8VrB,YACE,yBACA,gCAEA,aACE,WACA,YACA,kBACA,kBACA,kBACA,mBACA,yBACA,4CAEA,SACE,6CAGF,SACE,6CAGF,SACE,iBAKN,UACE,0BAEA,SACE,SACA,wBAGF,eACE,0BAGF,iBACE,yBACA,cTtYgB,gBSwYhB,aACA,sCAEA,eACE,0BAIJ,cACE,sBACA,gCACA,wCAGF,eACE,wBAGF,WACE,kBACA,eACA,gBACA,WP3aI,8BO8aJ,aACE,cTlac,gBSoad,eACA,0BAIJ,SACE,iCACA,qCAGF,kCACE,YACE,sCAYJ,qIAPF,eAQI,gBACA,gBACA,iBAOJ,gBACE,qCAEA,eAHF,oBAII,uBAGF,sBACE,sCAEA,qBAHF,sBAII,sCAGF,qBAPF,UAQI,sCAGF,qBAXF,WAYI,kCAIJ,iBACE,qCAEA,gCAHF,4BAII,iEAIA,eACE,0DAGF,cACE,iBACA,oEAEA,UACE,YACA,gBACA,yFAGF,gBACE,SACA,mKAIJ,eAGE,gBAON,aTngBkB,iCSkgBpB,kBAKI,6BAEA,eACE,kBAIJ,cACE,iBACA,wCAMF,oBACE,gBACA,cT1hBiB,4JS6hBjB,yBAGE,oBAKN,kBACE,gBACA,eACA,kBACA,yBAEA,aACE,gBACA,aACA,CACA,kBACA,gBACA,uBACA,qBACA,WP9jBI,gCOgkBJ,4FAEA,yBAGE,oCAIJ,eACE,0BAGF,iBACE,gCACA,MC/kBJ,+BACE,gBACA,iBAGF,eACE,aACA,cACA,qBAIA,kBACE,gBACA,4BAEA,QACE,0CAIA,kBACE,qDAEA,eACE,gDAIJ,iBACE,kBACA,sDAEA,iBACE,SACA,OACA,6BAKN,iBACE,gBACA,gDAEA,mBACE,eACA,gBACA,WRhDA,cQkDA,WACA,4EAGF,iBAEE,mDAGF,eACE,4CAGF,iBACE,QACA,OACA,qCAGF,aVjEoB,0BUmElB,gIAEA,oBAGE,0CAIJ,iBACE,CACA,iBACA,mBAKN,YACE,cACA,0BAEA,qBACE,cACA,UACA,cACA,oBAIJ,aVvFkB,sBU0FhB,aVnGsB,yBUuGtB,iBACE,kBACA,mBACA,wBAIJ,aACE,eACA,eACA,qBAGF,kBACE,cV5GgB,iCU+GhB,iBACE,eACA,iBACA,gBACA,gBACA,oBAIJ,kBACE,qBAGF,eACE,CAII,0JADF,eACE,sDAMJ,YACE,4DAEA,mBACE,eACA,WRzJA,gBQ2JA,gBACA,cACA,wHAGF,aAEE,sDAIJ,cACE,kBACA,mDAKF,mBACE,eACA,WR/KE,cQiLF,kBACA,qBACA,gBACA,sCAGF,cACE,mCAGF,UACE,sCAIJ,cACE,4CAEA,mBACE,eACA,WRrME,cQuMF,gBACA,gBACA,4CAGF,kBACE,yCAGF,cACE,CADF,cACE,kDAIJ,oBACE,WACA,OACA,6BAGF,oBACE,cACA,4BAGF,kBACE,8CAEA,eACE,0BAIJ,YACE,CACA,eACA,oBACA,iCAEA,cACE,kCAGF,qBACE,eACA,cACA,eACA,oCAEA,aACE,2CAGF,eACE,6GAIJ,eAEE,qCAGF,yBA9BF,aA+BI,gBACA,kCAEA,cACE,0JAGF,kBAGE,iDAKN,iBACE,oBACA,eACA,WRzRI,cQ2RJ,WACA,2CAKE,mBACE,eACA,WRnSA,qBQqSA,WACA,kBACA,gBACA,kBACA,cACA,0DAGF,iBACE,OACA,QACA,SACA,kDAKN,cACE,aACA,yBACA,kBACA,sJAGF,qBAKE,eACA,WRnUI,cQqUJ,WACA,UACA,oBACA,gBACA,mBACA,yBACA,kBACA,aACA,6RAEA,aACE,CAHF,+OAEA,aACE,CAHF,mQAEA,aACE,CAHF,sNAEA,aACE,8LAGF,eACE,oVAGF,oBACE,iOAGF,oBR1VY,oLQ8VZ,iBACE,4WAGF,oBV/VsB,mBUkWpB,6CAKF,aACE,gUAGF,oBAME,8CAGF,aACE,gBACA,cACA,eACA,8BAIJ,UACE,uBAGF,eACE,aACA,oCAEA,YACE,mBACA,qEAIJ,aAGE,WACA,SACA,kBACA,mBVzYiB,WEXb,eQuZJ,oBACA,YACA,aACA,yBACA,qBACA,kBACA,sBACA,eACA,gBACA,UACA,mBACA,kBACA,sGAEA,cACE,uFAGF,wBACE,gLAGF,wBAEE,kHAGF,wBVhboB,gGUobpB,kBRpbQ,kHQubN,wBACE,sOAGF,wBAEE,qBAKN,uBACE,CADF,oBACE,CADF,eACE,sBACA,eACA,WRvcI,cQycJ,WACA,UACA,oBACA,gBACA,wXACA,yBACA,kBACA,kBACA,mBACA,YACA,iBAGF,4BACE,oCAIA,iBACE,mCAGF,iBACE,UACA,QACA,CACA,qBACA,eACA,cVvdY,oBUydZ,oBACA,eACA,gBACA,mBACA,gBACA,yCAEA,UACE,cACA,kBACA,MACA,QACA,WACA,UACA,iEACA,4BAKN,iBACE,0CAEA,wBACE,CADF,gBACE,qCAGF,iBACE,MACA,OACA,WACA,YACA,aACA,uBACA,mBACA,8BACA,kBACA,iBACA,gBACA,YACA,8CAEA,iBACE,6HAGE,URrhBF,aQ+hBR,aACE,CACA,kBACA,eACA,gBAGF,kBACE,cV1hBkB,kBU4hBlB,kBACA,mBACA,kBACA,uBAEA,qCACE,iCACA,cR/iBY,sBQmjBd,mCACE,+BACA,cRpjBQ,kBQwjBV,oBACE,cV9iBgB,qBUgjBhB,wBAEA,UR/jBI,0BQikBF,kBAIJ,kBACE,4BAGF,SACE,sBACA,cACA,WACA,YACA,aACA,gCACA,mBV/kBiB,WEDb,eQmlBJ,SACA,8CAEA,QACE,iHAGF,mBAGE,kCAGF,kBACE,uBAIJ,eACE,CAII,oKADF,eACE,0DAKN,eAzEF,eA0EI,eAIJ,eACE,kBACA,gBAEA,aV3mBkB,qBU6mBhB,sBAEA,yBACE,YAKN,eACE,mBACA,eACA,eAEA,oBACE,kBACA,cAGF,aVxoBwB,yBU0oBtB,qBACA,gBACA,2DAEA,aAGE,8BAKN,kBAEE,cV/oBkB,oCUkpBlB,cACE,mBACA,kBACA,4CAGF,aVtpBqB,gBUwpBnB,CAII,mUADF,eACE,0DAKN,6BAtBF,eAuBI,cAIJ,YACE,eACA,uBACA,UAGF,aACE,gBR5rBM,YQ8rBN,qBACA,mCACA,qBACA,cAEA,aACE,SACA,iBAIJ,kBACE,cV3rBqB,WU6rBrB,sBAEA,aACE,eACA,eAKF,kBACE,sBAEA,eACE,CAII,+JADF,eACE,4CASR,qBACE,8BACA,WRxuBI,qCQ0uBJ,oCACA,kBACA,aACA,mBACA,gDAEA,URhvBI,0BQkvBF,oLAEA,oBAGE,0DAIJ,eACE,cACA,kBACA,CAII,yYADF,eACE,kEAIJ,eACE,oBAMR,YACE,eACA,mBACA,4DAEA,aAEE,6BAIA,wBACA,cACA,sBAIJ,iBACE,cVlxBkB,0BUqxBlB,iBACE,oBAIJ,eACE,mBACA,uBAEA,cACE,WR5yBI,kBQ8yBJ,mBACA,SACA,UACA,4BAGF,aACE,eAIJ,aRtzBc,0SQg0BZ,+BACE,aAIJ,kBACE,yBACA,kBACA,aACA,mBACA,kBACA,kBACA,QACA,mCACA,sBAEA,aACE,8BAGF,sBACE,SACA,aACA,eACA,gCACA,oBAGF,aACE,WACA,oBACA,gBACA,eACA,CACA,oBACA,WACA,iCACA,oBAGF,oBR12Bc,gBQ42BZ,2BAEA,kBR92BY,gBQg3BV,oBAKN,kBACE,6BAEA,wBACE,mBACA,eACA,aACA,4BAGF,kBACE,aACA,OACA,sBACA,cACA,cACA,gCAEA,iBACE,YACA,iBACA,kBACA,UACA,8BAGF,qBACE,qCAIJ,kBACE,gCAGF,wBACE,mCACA,kBACA,kBACA,kBACA,kBACA,sCAEA,wBACE,WACA,cACA,YACA,SACA,kBACA,MACA,UACA,yBAIJ,sBACE,aACA,mBACA,SCj7BF,aACE,qBACA,cACA,mCACA,qCAEA,QANF,eAOI,8EAMA,kBACE,YAKN,YACE,kBACA,mBACA,0BACA,gBAEA,aACE,WACA,YACA,SACA,oBACA,CADA,8BACA,CADA,gBACA,0BACA,qCAGF,WAfF,YAgBI,sCAGF,WAnBF,YAoBI,aAIJ,iBACE,aACA,aACA,2BACA,mBACA,mBACA,0BACA,qCAEA,WATF,eAUI,qBAGF,aACE,CAEA,UACqB,sCPpDzB,gBOqDI,wBAEA,UACE,YACA,cACA,SACA,kBACA,iBTLgB,wBE9DtB,4BACA,mBOoEM,oBACA,CADA,8BACA,CADA,gBACA,0BAIJ,gBACE,gBACA,iCAEA,cACE,WT/EA,gBSiFA,gBACA,uBACA,+BAGF,aACE,eACA,cX3EY,gBW6EZ,gBACA,uBACA,aAMR,cACE,kBACA,gBACA,6GAEA,cAME,WT7GI,gBS+GJ,qBACA,iBACA,qBACA,sBAGF,eTrHM,oBSuHJ,WXxHI,eW0HJ,cACA,kBAGF,cACE,uCAGF,wBAEE,cXpHmB,oBWwHrB,UACE,eACA,wBAEA,oBACE,iBACA,oBAIJ,WACE,gBACA,wBAEA,oBACE,gBACA,uBAIJ,cACE,cACA,qCAGF,YA9DF,iBA+DI,mBAEA,YACE,uCAGF,oBAEE,gBAKN,kBX7KqB,mCW+KnB,cX3JiB,eW6JjB,gBACA,kBACA,aACA,uBACA,mBACA,eACA,kBACA,aACA,gBACA,2BAEA,yBACE,yBAGF,qBACE,gBACA,yCAIJ,oBAEE,gBACA,eACA,kBACA,eACA,iBACA,gBACA,cX5MwB,sCW8MxB,sCACA,6DAEA,aTnNc,sCSqNZ,kCACA,qDAGF,aACE,sCACA,kCACA,0BAIJ,eACE,UACA,wBACA,gBACA,CADA,YACA,CACA,iCACA,CADA,uBACA,CADA,kBACA,eACA,iBACA,6BAEA,YACE,gCACA,yDAGF,qBAEE,aACA,kBACA,gBACA,gBACA,mBACA,uBACA,6BAGF,eACE,YACA,cACA,cX/OmB,6BWiPnB,6BAGF,aACE,cXvPgB,4BW2PlB,aXpQwB,qBWsQtB,qGAEA,yBAGE,oCAIJ,qCACE,iCACA,sCAEA,aTtRY,gBSwRV,0CAGF,aT3RY,wCSgSd,eACE,wCAIJ,UACE,0BAIA,aX9RkB,4BWiShB,aX3SsB,qBW6SpB,qGAEA,yBAGE,iCAIJ,UTzTI,gBS2TF,wBAIJ,eACE,kBClUJ,kCACE,kBACA,gBACA,mBACA,qCAEA,iBANF,eAOI,gBACA,gBACA,6BAGF,eACE,SACA,gBACA,gFAEA,yBAEE,sCAIJ,UACE,yBAGF,kBZxBmB,6GY2BjB,sBAGE,CAHF,cAGE,8IAIA,eAGE,0BACA,iJAKF,yBAGE,kLAIA,iBAGE,qCAKN,4GACE,yBAGE,uCAKN,kBACE,qBAIJ,WACE,eACA,mBZhEmB,WEXb,oBU8EN,iBACA,YACA,iBACA,SACA,yBAEA,UACE,YACA,sBACA,iBACA,UVxFI,gFU4FN,kBAGE,qNAKA,kBZlGoB,4IY0GpB,kBV1GQ,qCUiHV,wBACE,YACE,0DAOJ,YACE,uCAGF,2BACE,gBACA,uDAEA,SACE,SACA,yDAGF,eACE,yDAKA,cACA,iBACA,mBACA,mFAGF,iBACE,eACA,WACA,WACA,WACA,qMAGF,eAGE,mEASF,cACE,gBACA,qFAGF,aZhKc,YYkKZ,eACA,WACA,eACA,gBACA,+GAGF,aACE,eACA,CACA,sBACA,eACA,yJAEA,cACE,uEAIJ,WACE,kBACA,WACA,eACA,iDAQF,iBACE,mBACA,yHAEA,iBACE,gBACA,+FAGF,UACE,oCAMR,aACE,eACA,iBACA,cACA,SACA,uBACA,CACA,eACA,qBACA,oFAEA,yBAEE,WC9OJ,gCACE,4CACA,kBAGF,mBACE,sBACA,oBACA,gBACA,kBACA,cAGF,aACE,eACA,iBACA,cbHmB,SaKnB,uBACA,UACA,eACA,wCAEA,yBAEE,uBAGF,abxBsB,ea0BpB,SAIJ,wBACE,YACA,kBACA,sBACA,WXpCM,eWsCN,qBACA,oBACA,eACA,gBACA,YACA,iBACA,iBACA,gBACA,eACA,kBACA,kBACA,yBACA,qBACA,uBACA,2BACA,qCACA,mBACA,WACA,4CAEA,wBAGE,4BACA,qCACA,sBAGF,eACE,mFAEA,wBXnEQ,gBWuEN,kBAIJ,wBb3EsB,ea6EpB,yGAGF,cAIE,iBACA,YACA,oBACA,iBACA,4BAGF,Ub9FM,mBAGgB,qGa+FpB,wBAGE,8BAIJ,kBX1EsB,2GW6EpB,wBAGE,0BAIJ,cACE,iBACA,YACA,cbxGgB,oBa0GhB,uBACA,iBACA,kBACA,yBACA,+FAEA,oBAGE,cACA,mCAGF,UACE,uBAIJ,aACE,WACA,cAIJ,oBACE,UACA,cbhIoB,SakIpB,kBACA,uBACA,eACA,2BACA,2CACA,2DAEA,aAGE,uCACA,4BACA,2CACA,oBAGF,qCACE,uBAGF,aACE,6BACA,eACA,qBAGF,abzKwB,gCa6KxB,QACE,uEAGF,mBAGE,uBAGF,abvKmB,sFa0KjB,aAGE,oCACA,6BAGF,kCACE,gCAGF,aACE,6BACA,8BAGF,ab1MsB,uCa6MpB,aACE,wBAKN,sBACE,0BACA,yBACA,kBACA,YACA,8BAEA,yBACE,mBAKN,abhNqB,SakNnB,kBACA,uBACA,eACA,gBACA,eACA,cACA,iBACA,UACA,2BACA,2CACA,0EAEA,aAGE,oCACA,4BACA,2CACA,yBAGF,kCACE,4BAGF,aACE,6BACA,eACA,0BAGF,abjQwB,qCaqQxB,QACE,sFAGF,mBAGE,gBAIJ,iBACE,uBACA,YAGF,WACE,cACA,qBACA,QACA,SACA,kBACA,+BAEA,kBAEE,mBACA,oBACA,kBACA,mBACA,iBAKF,WACE,uCAIJ,MACE,kBACA,CX/SU,sEWsTZ,aXtTY,uBW0TZ,aX3Tc,4DWiUV,4CACE,CADF,oCACE,8DAKF,6CACE,CADF,qCACE,6BAKN,aACE,gBACA,qBACA,mCAEA,UXrVM,0BWuVJ,eAIJ,aACE,eACA,gBACA,uBACA,mBACA,iBAEA,aACE,wBACA,sBAIA,cACA,gBAKA,yCAPF,WACE,CAEA,gBACA,uBACA,gBACA,mBAWA,CAVA,mBAGF,aACE,CACA,cAKA,8BAIA,yBACE,sBAIJ,SACE,YACA,eACA,iBACA,uBACA,mBACA,gBACA,CAME,sDAGF,cACE,YACA,kBACA,oBACA,qBAKN,eACE,wBAGF,cACE,eAGF,iBACE,WACA,YACA,aACA,mBACA,uBACA,sBACA,6CAEA,cXxX4B,eAEC,0DWyX3B,sBACA,CADA,gCACA,CADA,kBACA,4BAGF,iBACE,qEAGF,YACE,iBAIJ,iBACE,WACA,YACA,aACA,mBACA,uBACA,qBAEA,cXhZ4B,eAEC,WWiZ3B,YACA,sBACA,CADA,gCACA,CADA,kBACA,WAIJ,oBACE,oBAGF,YACE,kBACA,2BAGF,+BACE,mBACA,SACA,gBAGF,kBbxd0B,ca0dxB,kBACA,uCACA,mBAEA,eACE,uBAIJ,iBACE,QACA,SACA,2BACA,4BAEA,UACE,gBACA,2BACA,0Bb5esB,2BagfxB,WACE,iBACA,uBACA,yBbnfsB,8BaufxB,QACE,iBACA,uBACA,4Bb1fsB,6Ba8fxB,SACE,gBACA,2BACA,2BbjgBsB,wBaugBxB,cACE,iBACA,cACA,iBACA,sBACA,qBACA,mBb7gBsB,WAJlB,gBaohBJ,uBACA,mBACA,yFAEA,kBb5gBiB,cAIE,Ua6gBjB,sCAKN,aACE,iBACA,gBACA,QACA,gBACA,aACA,yCAEA,eACE,mBbviBsB,cayiBtB,kBACA,mCACA,gBACA,kBACA,sDAGF,OACE,wDAIA,UACE,8CAIJ,cACE,iBACA,cACA,iBACA,sBACA,qBACA,mBbhkBsB,WAJlB,gBaukBJ,uBACA,mBACA,oDAEA,SACE,oDAGF,kBbnkBiB,cAIE,iBaskBvB,qBACE,iBAIA,sBACA,cb7kBgB,oBaglBhB,cACE,gBACA,mBACA,kBACA,mBAGF,cACE,mBACA,iBAIJ,aAEE,gBACA,qCAGF,cACE,SACE,iBAGF,aAEE,CAEA,gBACA,yCAEA,iBACE,uCAGF,kBACE,qDAKF,gBAEE,kBACA,YAKN,qBACE,aACA,mBACA,cACA,gBACA,iBAGF,aACE,cACA,CACA,sBACA,WX3pBM,qBW6pBN,kBACA,eACA,gBACA,gCACA,2BACA,mDACA,qBAEA,eACE,eACA,qCTxoBA,6GADF,kBSgpBI,4BACA,kHT5oBJ,kBS2oBI,4BACA,wBAIJ,+BACE,cbhrBsB,sBaorBxB,eACE,aACA,2BAGF,aACE,eACA,kBAIJ,iBACE,yBAEA,iBACE,SACA,UACA,mBb9rBiB,yBagsBjB,gBACA,kBACA,eACA,gBACA,iBACA,WXhtBI,mDWqtBR,oBACE,aAGF,iBACE,kBACA,cACA,iCACA,mCAEA,eACE,yBAGF,YAVF,cAWI,oBAGF,YACE,sBACA,qBAGF,aACE,kBACA,iBACA,yBAKF,uBADF,YAEI,gBAIJ,oBACE,kBACA,eACA,6BACA,SACA,UACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,0CACA,wCACA,iCAGF,QACE,mBACA,WACA,YACA,gBACA,UACA,kBACA,UACA,yBAGF,kBACE,WACA,wBACA,qBAGF,UACE,YACA,UACA,mBACA,yBbzxBmB,qCa2xBnB,sEAGF,wBACE,4CAGF,wBbxxBqB,+Ea4xBrB,wBACE,2BAGF,iBACE,WACA,YACA,MACA,SACA,gBACA,mBACA,cACA,SACA,UACA,6BACA,CAKA,uEAFF,SACE,6BAeA,CAdA,sBAGF,iBACE,WACA,YACA,MACA,SACA,gBACA,mBACA,cACA,WAGA,8CAGF,SACE,qBAGF,iBACE,QACA,SACA,WACA,YACA,yBACA,kBACA,yBACA,sBACA,yBACA,sCACA,4CAGF,SACE,qBbp1BmB,yDaw1BrB,kBbl2BqB,2Baw2BrB,iBACE,gBACA,cAGF,aACE,kBAGF,kBbj3BqB,cam3BnB,oBAEA,abv2BqB,oBa22BrB,ab52BgB,yBag3BhB,0BACE,CADF,uBACE,CADF,kBACE,kDAKA,sBACA,cACA,wDAEA,kBACE,8DAGF,cACE,sDAGF,abl4Bc,eao4BZ,0DAEA,abt4BY,0Baw4BV,sDAIJ,oBACE,cb94Bc,sMai5Bd,yBAGE,0BAKN,aACE,UACA,mCACA,CADA,0BACA,gBACA,6BAEA,cACE,yBACA,cbj6Bc,aam6Bd,gBACA,gCACA,sCAGF,oDACE,YACE,uCAIJ,oDACE,YACE,uCAIJ,yBA3BF,YA4BI,yCAGF,eACE,aACA,iDAEA,ab57Bc,qBam8BpB,oBACE,kBACA,eACA,iBACA,gBACA,mBbp9BmB,gBas9BnB,iBACA,qBAGF,eACE,gBACA,2BAEA,iBACE,aACA,wBAGF,kBACE,yBAGF,oBACE,gBACA,yBACA,yBACA,eAIJ,abn+BoB,uBaq+BlB,CACA,WACA,CADA,+BACA,sBACA,cACA,oBACA,mBACA,cACA,WACA,0CAEA,UX5/BM,4BFWa,qCIYjB,yDADF,cS6+BE,sBAGF,UbvgCM,gCaygCJ,sDAEA,Ub3gCI,4BAYa,mDaugCrB,uBACE,YACA,6CACA,uBACA,sBACA,WACA,0DAEA,sBACE,0DAIJ,uBACE,2BACA,gDAGF,abnhCsB,6BaqhCpB,uDAGF,abriC0B,yDayiC1B,aACE,YAGF,aACE,cbpiCgB,6BasiChB,SACA,kBACA,kBACA,oBACA,SACA,aACA,sBACA,WACA,WACA,qBACA,kBAEA,kBACE,WAIJ,+BACE,oBAGF,gBACE,qEAGF,4BACE,gCAGF,eACE,kBACA,MACA,QACA,YACA,kBACA,YAEA,mBACA,yBACA,eACA,aAEA,wCAEA,UX/hCsB,mBWiiCpB,aACA,sBACA,mBACA,uBACA,mBACA,8BACA,wBACA,gCACA,uCAGF,wBACE,kBACA,WACA,YACA,eACA,cbrmCgB,yBaumChB,aACA,uBACA,mBACA,sCAGF,mBACE,6CAEA,8BACE,WAKN,oBACE,UACA,oBACA,kBACA,cACA,SACA,uBACA,eACA,oBAGF,abhoCkB,eakoChB,gBACA,yBACA,iBACA,kBACA,QACA,SACA,+BACA,yBAEA,aACE,WACA,CACA,0BACA,oBACA,mBACA,4BAIJ,iBACE,QACA,SACA,+BACA,WACA,YACA,sBACA,6BACA,CACA,wBACA,kBACA,2CAGF,2EACE,CADF,mEACE,8CAGF,4EACE,CADF,oEACE,qCAGF,GACE,sBACE,KAGF,2BACE,KAGF,2BACE,KAGF,yBACE,IAGF,wBACE,EArBF,4BAGF,GACE,sBACE,KAGF,2BACE,KAGF,2BACE,KAGF,yBACE,IAGF,wBACE,uCAIJ,GACE,wBACE,KAGF,0BACE,KAGF,2BACE,KAGF,uBACE,IAGF,sBACE,EAtBA,6BAIJ,GACE,wBACE,KAGF,0BACE,KAGF,2BACE,KAGF,uBACE,IAGF,sBACE,mCAIJ,GACE,OACE,SACA,yBACA,KAGF,wBACE,KAGF,UACE,YACA,6BACA,kBACA,UACA,IAGF,UACE,YACA,eACA,UACA,6BACA,EA5BA,yBAIJ,GACE,OACE,SACA,yBACA,KAGF,wBACE,KAGF,UACE,YACA,6BACA,kBACA,UACA,IAGF,UACE,YACA,eACA,UACA,6BACA,kCAIJ,GACE,gBACA,aACA,aAPE,wBAIJ,GACE,gBACA,aACA,6BAGF,KACE,OACA,WACA,YACA,kBACA,YACA,2BAEA,YACE,SACA,QACA,WACA,YACA,mBACA,6BAGF,mBACE,yBAGF,YACE,0BAGF,aACE,uBACA,WACA,YACA,SACA,iCAEA,oBACE,0BACA,kBACA,iBACA,WX3yCE,gBW6yCF,eACA,+LAMA,yBACE,mEAKF,yBACE,iBAMR,aACE,iBACA,mEAGF,abzzCoB,qBa6zClB,mBACA,gBACA,sBACA,gBAGF,aACE,iBACA,uBAGF,eACE,8BAGF,ab50CoB,ea80ClB,cACA,gBACA,gBACA,uBAGF,qBACE,sBAGF,WACE,8BAGF,GACE,kBACE,+BACA,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,oBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,kBACE,2CACA,CADA,kCACA,EA3BF,qBAGF,GACE,kBACE,+BACA,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,oBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,kBACE,2CACA,CADA,kCACA,iBAIJ,0DACE,CADF,kDACE,cAGF,kBACE,0BACA,aACA,YACA,uBACA,OACA,UACA,kBACA,MACA,kBACA,WACA,aACA,gBAEA,mBACE,oBAIJ,WACE,aACA,aACA,sBACA,kBACA,YACA,0BAGF,iBACE,MACA,QACA,SACA,OACA,WACA,kBACA,mBb36CmB,kCa66CnB,uBAGF,MACE,aACA,mBACA,uBACA,cbt6CqB,eaw6CrB,gBACA,0BACA,kBACA,qCAGF,SACE,oBACA,CADA,WACA,cAGF,wBbv7CqB,Way7CnB,kBACA,MACA,OACA,aACA,qBAGF,iBACE,aAGF,iBACE,cACA,aACA,WACA,yBbx8CmB,kBa08CnB,cACA,UACA,WACA,eAGF,YACE,gCACA,CACA,iBACA,qBAEA,kBACE,UACA,uBAGF,aACE,CACA,sBACA,kBACA,eACA,uBAGF,oBACE,mBb3+CsB,kBa6+CtB,cACA,eACA,wBACA,wBAGF,aACE,CACA,0BACA,gBACA,8BAEA,eACE,aACA,2BACA,8BACA,uCAGF,cACE,cbx/Cc,kBa0/Cd,+BAGF,ab7/CgB,ea+/Cd,mBACA,gBACA,uBACA,kBACA,gBACA,YACA,iCAEA,UXphDE,qBWshDA,oHAEA,yBAGE,yCAKN,QACE,uBAIJ,kBACE,6BAEA,kBACE,oDAGF,eACE,6DAGF,UXhjDI,oBWyjDN,kBACA,cACA,2BAGF,eACE,UAGF,iBACE,cAEA,WACE,WACA,sCACA,CADA,6BACA,cAGF,cACE,iBACA,cb9jDmB,gBagkDnB,gBAEA,ab7kDsB,0Ba+kDpB,sBAEA,oBACE,gBAIJ,qBACE,4BAKN,GACE,cACA,eACA,WARI,mBAKN,GACE,cACA,eACA,2CCrmDF,u+KACE,uCAEA,u+KACE,CAOA,8MAMF,okBACE,UClBJ,YACE,gCACA,cACA,qBACA,iCAEA,aACE,cACA,cfOgB,gBeLhB,qBACA,eACA,gBAGF,WACE,UACA,yCAEA,8CAEA,WACE,iBACA,mBAKN,YACE,0BAGF,UACE,iBACA,kBACA,kBAGF,gBb0BwB,wBE9DtB,4BACA,kBWqCA,eACA,yBAEA,oBACE,sBACA,iBACA,4BX3CF,eWiDE,2DAHF,gBbesB,wBE9DtB,4BACA,CWgDE,iBAOE,CANF,+BXjDF,UWqDI,CACA,qBACA,mCAGF,aACE,kBACA,QACA,SACA,+BACA,WbhEE,6BakEF,gBACA,eACA,0BAKN,iBACE,WACqB,sCXpErB,+BANA,UW8EuB,sCXxEvB,gEWsEA,gBbfsB,wBE9DtB,4BWyFE,CXlFF,iCANA,UWmFuB,sCX7EvB,kBW+EE,SACA,QACA,UACA,wBAIJ,WACE,aACA,mBACA,2BAGF,aACE,mBACA,sBAGF,YACE,cf3FgB,6Be8FhB,eACE,CAII,kMADF,eACE,wBAKN,eACE,cACA,0BACA,yFAEA,oBAGE,sBAKN,4BACE,gCACA,iBACA,gBACA,cACA,aACA,4BAGF,YACE,cACA,iBACA,kBACA,2BAGF,oBACE,gBACA,cACA,8BACA,eACA,oCACA,uCAEA,aACE,kCAGF,+BACE,gCAGF,aACE,yBACA,eACA,cfzJgB,kCe6JlB,aACE,eACA,gBACA,Wb7KI,CakLA,2NADF,eACE,gCAKN,afnLwB,oBewL1B,iBACE,mDAEA,aACE,mBACA,gBACA,4BAIJ,UACE,kBACA,wBAGF,gBACE,qBACA,eACA,cfjMkB,eemMlB,kBACA,4BAEA,af/MwB,6BemNxB,aACE,gBACA,uBACA,iBAIJ,kBACE,6BACA,gCACA,aACA,mBACA,eACA,kDAGF,aAEE,kBACA,yBAGF,kBACE,aACA,2BAGF,afrOoB,eeuOlB,cACA,gBACA,mBACA,kDAIA,kBACE,oDAIA,SX5MF,sBACA,WACA,YACA,gBACA,oBACA,mBJxDmB,cAYD,eI+ClB,SACA,+EWsMI,aACE,CXvMN,qEWsMI,aACE,CXvMN,yEWsMI,aACE,CXvMN,gEWsMI,aACE,sEAGF,QACE,yLAGF,mBAGE,0DAGF,kBACE,qCAGF,mDArBF,cAsBI,yDAIJ,af5Qc,iBe8QZ,eACA,4DAGF,gBACE,wDAGF,kBACE,gEAEA,cACE,iNAEA,kBAGE,cACA,gHAKN,aftSgB,0He2ShB,cAEE,gBACA,cf7SY,kZegTZ,aAGE,gEAIJ,wBACE,iDAGF,ebzUI,kBEkEN,CAEA,eACA,cJhDiB,uCIkDjB,UWoQI,mBfxUoB,oDIsExB,wBACE,cJrDe,eIuDf,gBACA,mBACA,oDAGF,aACE,oDAGF,kBACE,oDAGF,eACE,WJ3FI,sDegVJ,WACE,mDAGF,UfpVI,kBesVF,eACA,8HAEA,kBAEE,iCAON,kBACE,mBAIJ,UbtWQ,kBawWN,cACA,mBACA,sBb3WM,yBa6WN,eACA,gBACA,YACA,kBACA,WACA,yBAEA,SACE,6BAIJ,YACE,eACA,gBACA,wBAGF,WACE,sBACA,cACA,kBACA,kBACA,gBACA,WACA,+BAEA,iBACE,QACA,SACA,+BACA,eACA,sDAIJ,kBAEE,gCACA,eACA,aACA,cACA,oEAEA,kBACE,SACA,SACA,6HAGF,aAEE,cACA,cfpZgB,eesZhB,eACA,gBACA,kBACA,qBACA,kBACA,yJAEA,af3ZmB,qWe8ZjB,aAEE,WACA,kBACA,SACA,SACA,QACA,SACA,2BACA,CAEA,4CACA,CADA,kBACA,CADA,wBACA,iLAGF,WACE,6CACA,8GAKN,kBACE,gCACA,qSAKI,YACE,iSAGF,4CACE,sBAQR,sBACA,mBACA,6BACA,gCACA,+BAEA,iBACE,iBACA,cfjdc,Ceodd,eACA,eACA,oCAEA,aACE,gBACA,uBACA,oCAIJ,UACE,kBACA,uDAGF,iBACE,qDAGF,eACE,2BAIJ,af9eoB,eegflB,gBACA,gBACA,kBACA,qBACA,6BAEA,kBACE,wCAEA,eACE,6BAIJ,aACE,0BACA,mCAEA,oBACE,kBAKN,eACE,2BAEA,UACE,8FAEA,8BAEE,CAFF,sBAEE,wBAIJ,iBACE,SACA,UACA,yBAGF,eACE,aACA,kBACA,mBACA,6BAEA,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,uBAIJ,iBACE,mBACA,YACA,gCACA,+BAEA,aACE,cACA,WACA,iBACA,gDAEA,kBACE,yBACA,wBAKN,YACE,uBACA,gBACA,iBACA,iCAEA,YACE,mBACA,iBACA,gBACA,8CAEA,wBACE,kBACA,uBACA,YACA,yCAGF,YACE,8BAIJ,WACE,4CAEA,kBACE,wCAGF,UACE,YACA,iCAGF,cACE,iBACA,Wb/mBA,gBainBA,gBACA,mBACA,uBACA,uCAEA,aACE,eACA,cf3mBU,gBe6mBV,gBACA,uBACA,gCAKN,aACE,uBAIJ,eACE,cACA,iDAGE,qBACA,Wb5oBE,gDagpBJ,QACE,6BACA,kDAEA,aACE,yEAGF,uBACE,4DAGF,ab3pBU,yBaiqBd,cACE,gCAEA,cACE,cfzpBc,ee2pBd,kCAEA,oBACE,cf9pBY,qBegqBZ,iBACA,gBACA,yCAEA,eACE,WblrBF,ScFR,YACE,gCACA,8BAEA,aACE,cACA,WdJI,qBcMJ,eACA,gBACA,kBAIJ,YACE,iBAGF,WACE,aACA,mBACA,mCCrBF,GACE,sBACE,KAGF,2BACE,KAGF,4BACE,KAGF,2BACE,IAGF,yBACE,EDGF,0BCrBF,GACE,sBACE,KAGF,2BACE,KAGF,4BACE,KAGF,2BACE,IAGF,yBACE,qCAIJ,GACE,yBACE,KAGF,yBACE,KAGF,4BACE,KAGF,wBACE,IAGF,sBACE,EAtBA,2BAIJ,GACE,yBACE,KAGF,yBACE,KAGF,4BACE,KAGF,wBACE,IAGF,sBACE,gCAIJ,cACE,kBAGF,iBACE,cACA,eACA,iBACA,qBACA,gBACA,iBACA,gBACA,wBAEA,SACE,4BAGF,UACE,YACA,gBACA,sBAGF,cACE,iBACA,sBACA,CADA,gCACA,CADA,kBACA,qEAGF,kBACE,qBACA,sGAEA,eACE,qEAIJ,eAEE,qJAEA,kBAEE,mXAGF,eACE,mBACA,qJAGF,eACE,gBACA,2EAGF,eACE,+NAGF,eACE,2FAGF,iBACE,8BACA,cjBjGc,mBiBmGd,qHAEA,eACE,2JAIJ,eACE,mJAGF,iBACE,6EAGF,iBACE,eACA,6EAGF,iBACE,qBACA,qJAGF,eACE,6JAEA,QACE,2EAIJ,oBACE,2EAGF,uBACE,oBAIJ,af9Ic,qBegJZ,0BAEA,yBACE,8BAEA,aACE,kCAKF,oBACE,uCAEA,yBACE,wBAKN,ajBlKc,4CiBuKhB,YACE,8EAEA,aACE,mCAIJ,aACE,oDAEA,af5LQ,ee8LN,iDAIJ,kBACE,uDAEA,kBACE,qBACA,gCAKN,oBACE,kBACA,mBACA,YACA,WjBrNM,gBiBuNN,eACA,cACA,yBACA,oBACA,eACA,sBACA,sCAEA,kBACE,qBACA,+DAGF,oBACE,iBACA,sBACA,kBACA,eACA,oBACA,2GAKF,oBAGE,4BAIJ,ajBvOkB,SiByOhB,kBACA,kBACA,oBACA,SACA,aACA,sBACA,WACA,WACA,gCACA,+BAGF,UACE,kBACA,mDAGF,iBAEE,gCAGA,qEAEA,eACE,kBAKF,SACE,mBACA,kDAEA,kBACE,wDAEA,sBACE,iFAIJ,kBAEE,SAKN,iBACE,kBACA,YACA,gCACA,eACA,UAaA,mCACA,CADA,0BACA,wDAZA,QAPF,kBAUI,0BAGF,GACE,aACA,WALA,gBAGF,GACE,aACA,uDAMF,cAEE,kCAGF,kBACE,4BACA,sCAIA,ajBpTiB,qCiBwTjB,UjB7UI,6BiBiVJ,ajB3Te,CAtBX,kEiByVJ,UjBzVI,kCiB4VF,ajBvVoB,gEiB2VpB,Uf/VE,mBFEgB,sEiBiWhB,kBACE,mBAMR,uBACE,sBACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,yCAEA,aACE,kBACA,OACA,QACA,MACA,SACA,6FACA,oBACA,WACA,2DAGF,oBACE,oCAGF,WACE,gBACA,uBACA,cACA,0CAEA,UACE,kBACA,MACA,gBACA,6DACA,oBACA,4CAGF,oBACE,gDAGJ,oDACE,mEAEF,oDACE,0CAGF,eACE,6DAGF,kBACE,gCAIJ,mBACE,+CAKF,sBACE,qEAEA,aACE,wBAKN,oBACE,YACA,CjBragB,ciBuahB,iBACA,mBACA,CACA,sBACA,8CANA,ajBragB,CiByahB,eAOA,8CAGF,aACE,eACA,eAGF,YACE,8BACA,eACA,oBAEA,sBACE,gBACA,2CAGF,oBACE,sBAIJ,YACE,mBACA,WACA,cjBvcoB,iIiB0cpB,gBAGE,kBACA,0EAGF,yBACE,yEAMA,0CACE,CADF,kCACE,2EAKF,2CACE,CADF,mCACE,wBAKN,YACE,mBACA,2BACA,mBAGF,+BACE,aACA,6CAEA,uBACE,OACA,gBACA,4DAEA,eACE,8DAGF,SACE,mBACA,qHAGF,cAEE,gBACA,4EAGF,cACE,0BAKN,kBACE,aACA,cACA,uBACA,aACA,kBAGF,gBACE,mBACA,iBACA,cjBthBgB,CiBwhBhB,iBACA,eACA,kBACA,+CAEA,ajB7hBgB,uBiBiiBhB,aACE,gBACA,uBACA,qBAIJ,kBACE,aACA,eACA,8BAEA,mBACE,kBACA,mBACA,yDAEA,gBACE,qCAGF,oBACE,WACA,eACA,gBACA,cjBvjBgB,4BiB6jBtB,iBACE,8BAGF,cACE,cACA,uCAGF,aACE,aACA,mBACA,uBACA,kBACA,kBAGF,kBACE,kBACA,wBAEA,YACE,eACA,8BACA,uBACA,uFAEA,SAEE,mCAIJ,cACE,iBACA,6CAEA,UACE,YACA,gBACA,+DAIJ,cAEE,wBAIJ,eACE,cjBnnBgB,eiBqnBhB,iBACA,8BAGF,kBACE,6BACA,gCACA,aACA,mBACA,eACA,wBAGF,aACE,qBACA,uDAGF,oBAEE,gBACA,eACA,gBACA,6JAGF,oBAME,4DAKA,UfxqBM,kBe8qBN,UACE,iKAQF,yBACE,+BAIJ,aACE,gBACA,uBACA,0DAGF,aAEE,sCAGF,kBACE,gCAGF,ajB5rBuB,ciB8rBrB,iBACA,mBACA,gBACA,2EAEA,aAEE,uBACA,gBACA,uCAGF,cACE,Wf1tBI,kCe+tBR,UACE,kBACA,iBAGF,SACE,kBACA,YACA,WACA,CjB1tBgB,8IiBquBhB,ajBruBgB,wBiByuBhB,UACE,wCAGF,kBf7tBsB,WF/BhB,8CiBgwBJ,kBACE,qBACA,+DAOJ,yBACE,cAIJ,YACE,eACA,yBACA,kBACA,cjBnwBgB,gBiBqwBhB,qBACA,gBACA,uBAEA,QACE,OACA,kBACA,QACA,MAIA,iDAHA,YACA,uBACA,mBAUE,CATF,0BAEA,yBACE,kBACA,iBACA,cAIA,sDAGF,cAEE,cjB9xBiB,uBiBgyBjB,SACA,cACA,qBACA,eACA,iBACA,sMAEA,UftzBE,yBe6zBJ,cACE,kBACA,YACA,+DAGF,aACE,eAKN,cACE,qBAEA,kBACE,oBAIJ,cACE,cACA,qBACA,WACE,YACA,SACA,2BAIF,UACE,YACA,qBAIJ,aACE,gBACA,kBACA,cjBv1BkB,gBiBy1BlB,uBACA,mBACA,qBACA,uBAGF,aACE,gBACA,2BACA,2BAGF,ajBr2BoB,oBiBy2BpB,aACE,eACA,eACA,gBACA,uBACA,mBACA,qBAGF,cACE,mBACA,kBACA,yBAEA,cACE,kBACA,yBACA,QACA,SACA,+BACA,yBAIJ,aACE,6CAEA,UACE,mDAGF,yBACE,6CAGF,mBACE,sBAIJ,oBACE,kCAEA,QACE,4CAIA,oBACA,0CAGF,kBACE,0CAGF,aACE,6BAIJ,wBACE,2BAGF,yBACE,cACA,SACA,WACA,YACA,oBACA,CADA,8BACA,CADA,gBACA,sBACA,wBACA,kBAGF,YACE,eACA,yBACA,kBACA,gBACA,gBACA,wBAEA,aACE,cjB77Bc,iBiB+7Bd,eACA,+BACA,aACA,sBACA,mBACA,uBACA,eACA,4BAEA,aACE,wBAIJ,eACE,CACA,qBACA,aACA,sBACA,uBACA,2BAEA,aACE,cACA,0BAGF,oBACE,cjB39BY,gBiB69BZ,gCAEA,yBACE,0BAKN,QACE,eACA,iDAEA,SACE,cACA,8BAGF,ajB9+Bc,oCiBo/BlB,cACE,cACA,SACA,uBACA,UACA,kBACA,oBACA,oFAEA,yBAEE,6BC/gCJ,kBACE,aAGF,iBACE,8BACA,oBACA,aACA,sBAGF,cACE,MACA,OACA,QACA,SACA,0BACA,wBAGF,cACE,MACA,OACA,WACA,YACA,aACA,sBACA,mBACA,uBACA,2BACA,aACA,oBACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,oBAGF,mBACE,aACA,aACA,6CAGF,kBlBrC0B,WAJlB,kBkB8CN,gBACA,aACA,sBACA,0BAGF,WACE,WACA,gBACA,iBACA,8DAEA,UACE,YACA,sBACA,aACA,sBACA,mBACA,uBACA,aACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,oBAIJ,WACE,WACA,gBACA,iBACA,kBACA,wBAEA,iBACE,MACA,OACA,WACA,YACA,sBACA,aACA,aACA,CAGA,YACA,UACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,2CANA,qBACA,mBACA,uBAaF,CATE,mBAIJ,YACE,CAGA,iBACA,qCAGF,kBACE,UACE,YACA,gBACA,0BAGF,UACE,YACA,eACA,gBACA,cACA,oDAIJ,aAEE,mBACA,aACA,aACA,2DAEA,cACE,uLAGF,alB9GmB,SkBiHjB,eACA,gBACA,kBACA,oBACA,YACA,aACA,kBACA,6BACA,+mBAEA,aAGE,yBACA,qiBAGF,UlBvJI,qwDkB2JF,aAGE,sBAMR,sBACE,yBAGF,aACE,aACA,mBACA,uBACA,wBAGF,UACE,YACA,mBACA,mBACA,aACA,eACA,8BAEA,kBACE,+BAGF,cACE,mBACA,kCAIJ,mBACE,CACA,mBACA,0EAEA,mBACE,yBAIJ,cACE,iBACA,4BAEA,cACE,gBACA,WlBjNI,mBkBmNJ,2BAGF,alBjNwB,kGkBoNtB,aAGE,2CAIJ,aACE,2BAGF,cACE,clBhNiB,gBkBkNjB,mBACA,sCAEA,eACE,kCAGF,eACE,mBlB7Oe,cAcE,kBkBkOjB,eACA,gBACA,CAII,2NADF,eACE,oCAOV,WACE,UACA,mCAME,mBACA,mBACA,sCAEA,cACE,iBACA,kBACA,qCAGF,eACE,oCAIJ,kBACE,mBACA,kBACA,eAIJ,iBACE,eACA,mBACA,sBAEA,eACE,WlBnSI,kBkBqSJ,yBACA,eACA,qBAGF,kBlBxSmB,cAcE,gBkB6RnB,aACA,kBACA,6HAQF,eACE,qJAGF,kBACE,clB5SmB,mBkB8SnB,kBACA,aACA,kBACA,eACA,sCACA,yPAEA,iBACE,mBACA,qNAGF,mBACE,gBACA,4CAMJ,YACE,mBACA,gDAEA,UACE,cACA,4DAEA,aACE,2DAGF,cACE,kDAGF,iBACE,uDAIJ,eACE,sDAIJ,UhB3WM,2DgBgXR,0BACE,cACE,iBACA,qJAGF,cAIE,mBACA,4CAGF,kBACE,sDAGF,WACE,eACA,mBAIJ,oBACE,eACA,gBACA,iBACA,uHAGF,kBAOE,WlBvZM,kBkByZN,gBACA,eACA,YACA,kBACA,sBACA,+SAEA,alBjZgB,YkBmZd,eACA,WACA,eACA,gBACA,uSAGF,YACE,uPAGF,WACE,WACA,+WAGF,UACE,wBAKF,ehBvbM,CFGkB,gBkBubtB,oBACA,iEhB3bI,2BFGkB,qDkBgc1B,iBAEE,aACA,qEAEA,wBACE,CADF,qBACE,CADF,oBACE,CADF,gBACE,gBACA,kKAIJ,YAKE,8BACA,mBlBjdwB,akBmdxB,iBACA,0LAEA,aACE,iBACA,clBvciB,mBkBycjB,kNAGF,aACE,6DAIJ,cAEE,yDAGF,WAEE,eACA,0BAGF,gBAEE,sDAGF,qBAEE,eAGF,UACE,gBACA,0BAGF,YACE,6BACA,qCAEA,yBAJF,cAKI,gBACA,iDAIJ,qBAEE,UACA,qCAEA,+CALF,UAMI,sDAIJ,aAEE,gBACA,gBACA,gBACA,kBACA,2FAEA,alBvhBwB,qCkB2hBxB,oDAZF,eAaI,sCAKF,4BADF,eAEI,yBAIJ,YACE,+BACA,gBACA,0BAEA,cACE,iBACA,mBACA,sCAGF,aACE,sBACA,WACA,CACA,UlB1jBI,gBECA,agB4jBJ,oBACA,eACA,YACA,CACA,SACA,kBACA,yBACA,iBACA,gBACA,gBACA,4CAEA,wBACE,+CAGF,ehB5kBI,yBgB8kBF,mBACA,kBACA,6DAEA,QACE,gBACA,gBACA,mEAEA,QACE,0DAIJ,UlB7lBE,oBkB+lBA,eACA,gBhB/lBA,+CgBomBJ,YACE,8BACA,mBACA,4CAIJ,aACE,WlB7mBI,ekB+mBJ,gBACA,mBACA,wCAGF,eACE,mBACA,+CAEA,UlBxnBI,ekB0nBF,qCAIJ,uBAnFF,YAoFI,eACA,QACA,wCAEA,iBACE,iBAKN,eAWE,eACA,wBAXA,eACE,iBACA,uBAGF,aACE,gBACA,2CAMF,eACE,mBAGF,eACE,cACA,gBACA,+BAEA,4BACE,4BAGF,QACE,oCAIA,UlBzqBE,akB2qBA,kBACA,eACA,mBACA,qBACA,8EAEA,eAEE,yWAOA,kBlB9qBW,WEXb,iJgBgsBA,iBAGE,oMAUR,aACE,iIAIJ,4BAIE,clBlsBmB,ekBosBnB,gBACA,6cAEA,aAGE,6BACA,uCAIJ,iBACE,mBACA,oBACA,eAEA,yFAEA,qBACE,qGAIJ,YAIE,eACA,iIAEA,eACE,CAII,w1BADF,eACE,sDAMR,iBAEE,oDAKA,eACE,0DAGF,eACE,mBACA,aACA,mBACA,wEAEA,UlBnxBI,CkBqxBF,gBACA,uBAKN,YACE,2CAEA,QACE,WACA,cAIJ,UACE,eACA,gBACA,iBAEA,YACE,gBACA,eACA,kBACA,sCAGF,YACE,4CAEA,kBACE,yDAGF,SACE,sBACA,cACA,WACA,YACA,aACA,gDACA,mBlB5zBe,WEDb,egBg0BF,CACA,eACA,kBACA,2EAEA,QACE,wMAGF,mBAGE,+DAGF,kBACE,qCAGF,wDA7BF,cA8BI,4DAIJ,WACE,eACA,gBACA,SACA,kBACA,cAKN,iBACE,YACA,gBACA,YACA,aACA,uBACA,mBACA,gBhB12BM,yDgB62BN,aAGE,gBACA,WACA,YACA,SACA,sBACA,CADA,gCACA,CADA,kBACA,gBhBr3BI,uBgBy3BN,iBACE,YACA,aACA,+BACA,iEACA,kBACA,wCACA,uBAGF,iBACE,WACA,YACA,MACA,OACA,uBAGF,iBACE,YACA,WACA,UACA,YACA,4BACA,6BAEA,UACE,8BAGF,UhBt5BI,egBw5BF,gBACA,cACA,kBACA,2BAGF,iBACE,mCACA,qCAIJ,oCACE,eAEE,uBAGF,YACE,wBAKN,gBACE,sCAEA,eACE,gCAGF,eACE,qDAGF,UlB57BM,iDkBg8BN,YACE,0DAEA,YACE,0BAIJ,YACE,iBACA,uBACA,kDAGF,alB57BoB,qBkB87BlB,wDAEA,yBACE,WCp9BN,YACE,kCAEA,iBACE,MACA,QACA,oIAEA,+BAEE,oBAKN,cACE,uBACA,eACA,gBACA,cnBGmB,yDEjBP,sCiBsBd,2CACE,oBAGF,QACE,wBACA,UACA,+CAEA,WACE,mBACA,UACA,0BAGF,aACE,sBACA,SACA,YACA,kBACA,aACA,WACA,UACA,WnBjDI,gBECA,eiBmDJ,oBACA,gBACA,qDAEA,anBzCc,CmBuCd,2CAEA,anBzCc,CmBuCd,+CAEA,anBzCc,CmBuCd,sCAEA,anBzCc,gCmB6Cd,8Cf/CA,uCADF,ceiD4D,0Cf5C5D,ce4C4D,oBAI9D,UnBjEQ,mBmBmEN,mBnBhEsB,oCmBkEtB,iBACA,kBACA,eACA,gBACA,sBAEA,anBtDmB,gBmBwDjB,0BACA,mFAEA,oBAEU,iCAKZ,mBACA,eAEA,gBACA,wCAEA,anBxFwB,sDmB4FxB,YACE,2CAGF,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,gBACA,kBACA,SACA,kBACA,sBACA,kDAEA,oBnB9GsB,qCmBqH1B,eACE,kBACA,aACA,mBnB1HsB,gBmB4HtB,gBACA,cACA,yBAEA,iBACE,gBACA,wCAEA,UnBvII,iCmByIJ,WACE,iBACA,2BAIJ,iBACE,cACA,CACA,cACA,iBACA,WnBpJI,qBmBsJJ,gBACA,iBACA,qBACA,mBACA,gBACA,gGAEA,kBACE,qBACA,iIAEA,eACE,kJAIJ,eACE,mBACA,2DAGF,eACE,eACA,8BAGF,cACE,wFAGF,eACE,sCAGF,iBACE,2BACA,WnB1LE,mBmB4LF,mDAEA,eACE,8DAIJ,eACE,0DAGF,iBACE,+BAGF,iBACE,eACA,2DAGF,eACE,+DAEA,QACE,8BAIJ,oBACE,8BAGF,uBACE,6BAGF,anB3MiB,qBmB6Mf,mCAEA,oEAGE,oBACE,gDAEA,qDAMR,UACE,YACA,gBACA,uDAIJ,iBAEE,WACA,mIAGE,aACE,sBACA,SACA,YACA,0BACA,yBACA,WACA,iBACA,UACA,WnBtQE,gBECA,eiBwQF,oBACA,YACA,qBACA,yLAEA,anB/PY,CmB6PZ,sKAEA,anB/PY,CmB6PZ,8KAEA,anB/PY,CmB6PZ,4JAEA,anB/PY,yKmBmQZ,SACE,qJAGF,kBnBlRoB,+ImBmRpB,8Cf1QF,8JADF,ce4Q8D,kKfvQ9D,ceuQ8D,qCfhQ5D,8TADF,sBeoQM,gBACA,6BAMR,aACE,kBACA,SACA,UACA,WACA,gBACA,2CAEA,aACE,mBACA,WACA,YACA,cnBzRiB,emB2RjB,iBACA,kBACA,WACA,4CAIJ,iBACE,SACA,oCAGF,aACE,kBACA,sBACA,SACA,0BACA,YACA,WACA,WnBnUM,mBAIkB,sCmBkUxB,eACA,WACA,aACA,6CAGF,aACE,0CAGF,YACE,eACA,kBACA,iMAEA,kBAGa,iKAEb,YAGE,mBACA,mBACA,2BACA,iBACA,eACA,+DAGF,6BACE,qEAEA,aACE,gBACA,uBACA,mBACA,sEAGF,eACE,qEAGF,aACE,iBACA,gBACA,uBACA,mBACA,4EAMA,anBzWe,wBmB8WrB,eACE,iCAEA,YACE,mBACA,eACA,oBACA,YACA,gBACA,8BAIJ,UACE,WACA,cACA,kCAEA,iBACE,kBACA,aACA,WACA,sBjBzZI,wBiB2ZJ,sBACA,4BACA,gBACA,2CAEA,aACE,kBACA,sBACA,SACA,OACA,SACA,SACA,aACA,WACA,cnBzZiB,gFmB2ZjB,eACA,oBACA,gBACA,UACA,UACA,4BACA,iDAEA,UjBlbE,sEiBobF,WACE,cnBtae,CEff,4DiBobF,WACE,cnBtae,CEff,gEiBobF,WACE,cnBtae,CEff,uDiBobF,WACE,cnBtae,yCmB2anB,2EAKE,0CAKN,iFACE,aACA,uBACA,8BACA,UACA,4BACA,8CAEA,aACE,cnB1csB,emB4ctB,gBACA,aACA,oBACA,2JAEA,aAGE,wCAIJ,SACE,kCAIJ,YACE,aACA,cnBrdkB,gBmBudlB,sCAEA,cACE,kBACA,2CAGF,aACE,gDAEA,aACE,eACA,gBACA,yBACA,qDAGF,iBACE,eACA,kBACA,WACA,WACA,mBjB5dkB,8DiB+dlB,iBACE,MACA,OACA,WACA,kBACA,mBnBvfa,0BmB8frB,UnB1gBQ,oBmB4gBN,eACA,gBjB5gBM,4BiBghBR,YACE,mBACA,0BACA,YACA,aACA,8BACA,cACA,oBAGF,YACE,cACA,sBAEA,oBACE,uBACA,cACA,YACA,iBACA,sBACA,uBAGF,oBACE,aACA,CAEA,oBACA,CADA,6BACA,UACA,QACA,YACA,uBACA,2BAIJ,iBACE,iBACA,0CAKE,yBACE,qCACA,WjB7jBE,mBFWa,gBmBqjBf,8CAGA,yBACE,oCACA,uCAMR,iBACE,kBACA,uCACA,gBjB9kBM,gBiBglBN,uBACA,6CAGF,YACE,mBACA,aACA,WnBxlBM,emB0lBN,sDAEA,aACE,cnBxkBiB,wEmB2kBjB,6EAEA,aACE,WnBnmBE,gBmBqmBF,sGAIJ,kBnB7lBmB,WEXb,6PiBgnBF,UjBhnBE,0DiBonBN,wCAGF,gBACE,iBACA,mBACA,gBACA,yBACA,cACA,+BAEA,oBACE,SACA,eACA,kBACA,gCAGF,oBACE,aACA,UACA,WACA,kBACA,kCAIA,ajB5oBU,CkBFZ,+BAHF,YACE,cACA,kBAUA,CATA,cAKA,kBACA,2BACA,gBAEA,uBAEA,YACE,uBACA,WACA,YACA,iBACA,6BAEA,WACE,gBACA,oBACA,aACA,yBACA,gBACA,oCAEA,0BACE,oCAGF,cACE,YACA,oBACA,YACA,6BAIJ,qBACE,WACA,gBACA,cACA,aACA,sBACA,qCAEA,4BARF,cASI,qBAMR,kBACE,wBACA,CADA,eACA,MACA,UACA,cACA,qCAEA,mBAPF,gBAQI,+BAGF,eACE,qCAEA,6BAHF,kBAII,wHAMJ,WAGE,mCAIJ,YACE,mBACA,uBACA,YACA,CpBrFmB,IoBoGrB,aACE,aACA,sBACA,WACA,YACA,CAIA,oBAGF,qBACE,WACA,mBACA,cpBhHwB,eoBkHxB,cACA,eACA,SACA,iBACA,aACA,SACA,UACA,2BAEA,yBACE,6BAIJ,kBACE,SACA,oBACA,cpBnIwB,eoBqIxB,cACA,eACA,kBACA,UACA,mCAEA,yBACE,wCAGF,kBACE,2BAIJ,oBACE,iBACA,2BAGF,iBACE,kCAGF,cACE,cACA,eACA,aACA,kBACA,QACA,UACA,cAGF,kBACE,WlB5KM,ckB8KN,eACA,aACA,qBACA,2DAEA,kBAGE,oBAGF,SACE,2BAGF,sBACE,cpB3LsB,kGoB8LtB,sBAGE,WlBpME,kCkBwMJ,apB7LiB,oBoBmMrB,oBACE,iBACA,oBAGF,kBpBlNqB,cAaH,iBoBwMhB,eACA,gBACA,yBACA,eACA,yBAGF,iBACE,cACA,UACA,gCAEA,sCACE,uCAEA,aACE,WACA,kBACA,aACA,OACA,QACA,cACA,UACA,oBACA,YACA,UACA,gFACA,wCAIJ,SACE,kBACA,gBAIJ,YACE,eACA,mBACA,cACA,eACA,kBACA,UACA,UACA,gBACA,uBAEA,QACE,YACA,aACA,cACA,uBACA,aACA,gBACA,uBACA,gBACA,mBACA,OACA,4CAGF,apBhRwB,4CoBqRtB,apBrRsB,wCoBuRpB,4CAIJ,SAEE,SAIJ,WACE,kBACA,sBACA,aACA,sBACA,gBACA,wDAEA,SACE,gBACA,gBACA,qBAGF,kBpBlTmB,yBoBuTrB,WACE,aACA,cACA,uBAGF,kBACE,iCAGF,iBACE,sEAGF,kBACE,SACA,cpB3TkB,eoB6TlB,eACA,eACA,kFAEA,aACE,CAKA,kLAEA,UlBtVI,mBkBwVF,kFAKJ,2BACE,wCAIJ,YACE,oBACA,6BACA,+CAEA,sBAEE,kBACA,eACA,qBACA,0CAGF,eACE,gDAKJ,SACE,6BAGF,eACE,gBACA,gBACA,cpB/WkB,0DoBiXlB,UACA,UACA,kBACA,uCAEA,YACE,WACA,uCAGF,iBACE,gCAGF,QACE,uBACA,SACA,6BACA,cACA,iCAIF,eACE,2CACA,YACE,WACA,mCAKN,kBACE,aACA,mCAIA,apBvZkB,0BoByZhB,gCAIJ,WACE,4DAEA,cACE,uEAEA,eACE,uBAKN,oBACE,uBACA,gBACA,mBACA,OACA,sBAGF,oBACE,iBACA,6EAGF,apBrbkB,mBAbG,kBoBucnB,aACA,eACA,gBACA,eACA,aACA,cACA,mBACA,uBACA,yBACA,4EAdF,cAeI,6FAGF,eACE,mFAGF,apBrdwB,qBoBudtB,qGAEA,yBACE,uCAKN,kBACE,aACA,eAGF,qBACE,uCAKA,sBACE,6BACA,qCASF,qCAXA,sBACE,6BACA,sCAgBF,mJAFF,qBAGI,sBAKF,wBACA,aACA,2BACA,mBACA,mBACA,2BAEA,aACE,iCAEA,UACE,kBACA,uCAEA,SACE,kCAKN,aACE,aACA,yBC9hBJ,iBACE,eACA,gBACA,crBagB,mBAbG,eqBGnB,aACA,cACA,sBACA,mBACA,uBACA,aACA,qEAGE,aAEE,WACA,aACA,SACA,yCAIJ,gBACE,gCAGF,eACE,uCAEA,aACE,mBACA,crBjBY,qCqBqBd,cACE,gBACA,kBCtCJ,UACE,cACA,+BACA,0BAEA,UACE,qCAGF,iBATF,QAUI,mBAIJ,qBACE,mBACA,uBAEA,YACE,kBACA,mBACA,gBACA,2BAEA,aACE,WACA,YACA,SACA,oBACA,CADA,8BACA,CADA,gBACA,uBAIJ,YACE,mBACA,mBACA,aACA,6BAEA,aACE,aACA,mBACA,qBACA,gBACA,qCAGF,UACE,eACA,cACA,+BAGF,aACE,WACA,YACA,gBACA,mCAEA,UACE,YACA,cACA,SACA,kBACA,mBACA,oBACA,CADA,8BACA,CADA,gBACA,qCAIJ,gBACE,gBACA,4CAEA,cACE,WpB1EF,gBoB4EE,gBACA,uBACA,0CAGF,aACE,eACA,ctBtEU,gBsBwEV,gBACA,uBACA,yBAKN,kBtB3FiB,asB6Ff,mBACA,uBACA,gDAEA,YACE,cACA,eACA,mDAGF,qBACE,kBACA,gCACA,WACA,gBACA,mBACA,gBACA,uBACA,qDAEA,YACE,iEAEA,cACE,sDAIJ,YACE,cAOV,kBtBjIqB,sBsBoInB,iBACE,4BAGF,aACE,eAIJ,cACE,kBACA,qBACA,cACA,iBACA,eACA,mBACA,gBACA,uBACA,eACA,oEAEA,YAEE,sBAGF,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,8BAEA,oBACE,mBACA,CC/KJ,eAGF,SnBkDE,sBACA,WACA,YACA,gBACA,oBACA,mBJxDmB,cAYD,eI+ClB,SACA,cmBxDA,CACA,2BACA,iBACA,eACA,2CAEA,aACE,CAHF,iCAEA,aACE,CAHF,qCAEA,aACE,CAHF,4BAEA,aACE,kCAGF,QACE,6EAGF,mBAGE,sBAGF,kBACE,qCAGF,eA3BF,cA4BI,kCAKF,QACE,qDAGF,mBAEE,mBAGF,iBACE,SACA,WACA,UACA,qBACA,UACA,0BACA,4CACA,eACA,WACA,YACA,cvBxCmB,euB0CnB,oBACA,0BAEA,mBACE,WACA,0BAIJ,sBACE,iCAEA,mBACE,WACA,gCAIJ,QACE,uBACA,cvB5DkB,euB8DlB,uCAEA,uBACE,sCAGF,aACE,yBAKN,avB7EkB,mBuB+EhB,gCACA,kBACA,eACA,gBACA,uBAGF,YACE,cvBxFkB,kBuB0FlB,iBAIA,avB7FgB,mBuB+Fd,gCACA,gBACA,aACA,eACA,eACA,qBAEA,oBACE,iBACA,eAIJ,YACE,mBACA,aACA,gCACA,0BAEA,eACE,qBAGF,aACE,cvBvHY,gBuByHZ,uBACA,mBACA,4BAEA,eACE,uBAGF,avBlIc,qBuBoIZ,eACA,gBACA,cACA,gBACA,uBACA,mBACA,qGAKE,yBACE,wBAMR,aACE,eACA,iBACA,gBACA,iBACA,mBACA,gBACA,cvB3JiB,0BuB+JnB,aACE,WACA,2CAEA,mCACE,yBACA,0CAGF,wBACE,WC1LR,yCCCE,qBACA,sBACA,CADA,kBACA,wBACA,WACA,YACA,eAEA,UACE,8BAIJ,evBXQ,kBuBaN,sCACA,kBACA,eACA,UACA,iDAEA,2BACE,2DAGF,UACE,mCAIJ,iBACE,SACA,WACA,eACA,yCAGF,iBACE,UACA,SACA,UACA,gBvBvCM,kBuByCN,sCACA,gBACA,gDAEA,aACE,eACA,SACA,gBACA,uBACA,iKAEA,+BAGE,2DAIJ,WACE,wBAKF,2BACE,eAIJ,aACE,wBACA,UACA,eACA,0CAEA,mBAEE,mBAGF,8BACE,CADF,sBACE,WACA,cACA,SACA,WACA,YACA,0EAMA,SACE,oBACA,CADA,WACA,eChGN,WAEE,0BAGF,kBANW,kBAQT,cACA,iCACA,wBACE,mCAOF,WACE,SACA,UACA,2CAGF,aACE,aAEA,sBACA,YACA,6BACA,6DAGE,oBACE,WACA,iBACA,iBACA,iJAGF,UACE,gEAEF,oBACE,gBACA,WACA,2CAKN,yBACE,sBACA,kBACA,YACA,gBACA,kDAEA,uBACE,CADF,oBACE,CADF,eACE,WACA,YACA,SACA,4BACA,WACA,yBACA,eACA,4CACA,sBACA,oBACA,6DAEA,uBACE,6DAGF,sBACE,wEAGF,sBACE,kBACA,SCjFR,WACE,sBACA,aACA,sBACA,kBACA,iBACA,UACA,qBAEA,iBACE,oBAGF,kBACE,2DvBDF,SuBI0D,yBvBC1D,SuBD0D,qCvBQxD,qLuBLA,yBAGF,eACE,gBACA,eACA,qCvBZA,4BuBgBA,SACE,WACA,YACA,eACA,UACA,+BALF,SACE,WACA,YACA,eACA,UACA,yCAIJ,4BAGF,YACE,mBACA,mBACA,UACA,mBACA,eACA,mBAEA,aACE,sBACA,oCACA,sBACA,YACA,cACA,c3BzCgB,kB2B2ChB,qBACA,eACA,mBAGF,iCACE,iDAEA,YAEE,mBACA,mCACA,SAKN,iBACE,mBACA,UACA,qCvBrDE,6CADF,euBwDkF,sCvBlEhF,sBADF,cuBoE0D,yBvB/D1D,cuB+D0D,gBAG5D,ezBlFQ,kBEkEN,CACA,sBACA,gBACA,cJhDiB,uCIkDjB,mBAEA,wBACE,cJrDe,eIuDf,gBACA,mBACA,mBAGF,aACE,mBAGF,kBACE,mBAGF,eACE,WJ3FI,kB2BuFR,YACE,c3B1EkB,a2B4ElB,mBACA,oBAEA,aACE,qBACA,wBAGF,aACE,c3BnFmB,gB2BqFnB,mBACA,gBACA,uBACA,0BAIJ,aACE,gBACA,gBACA,kBAGF,kB3BhHqB,kB2BkHnB,gBACA,yBAEA,a3BxGgB,mB2B0Gd,aACA,gBACA,eACA,eACA,6BAEA,oBACE,iBACA,0BAIJ,iBACE,6BAEA,kBACE,gCACA,eACA,aACA,aACA,gBACA,eACA,c3BhIY,iC2BmIZ,oBACE,iBACA,8FAIJ,eAEE,mCAGF,aACE,aACA,c3B/IiB,qB2BiJjB,0HAEA,aAGE,0BACA,gBAQN,WACA,kBAGA,+BANF,qBACE,UACA,CAEA,eACA,aAgBA,CAfA,eAGF,iBACE,MACA,OACA,mBACA,CAGA,qBACA,CACA,eACA,WACA,YACA,uBAEA,kB3BlMmB,0B2BuMrB,u1BACE,OACA,gBACA,aACA,8BAEA,aACE,sBACA,CADA,4DACA,CADA,kBACA,+BACA,CADA,2BACA,UACA,YACA,oBACA,eACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,oCAGF,aACE,WACA,YACA,YACA,eACA,sCAGF,yBAzBF,aA0BI,iBAIJ,kBACE,eACA,gBACA,mBAGF,cACE,kBACA,MACA,OACA,WACA,YACA,0BACA,oBCrPF,kBACE,gB1BAM,WACA,e0BEN,aACA,sBACA,YACA,uBACA,eACA,kBACA,kBACA,YACA,gBAGF,e1BdQ,cFcY,S4BGlB,WACA,YACA,iEAEA,aAGE,iCAGF,eACE,2BxBcF,iBACE,mBACA,cACA,eACA,aACA,gBACA,yBwBfJ,aACE,eACA,yBAGF,aACE,eACA,gBACA,6BAGF,aACE,kBACA,W1B7CM,0B0B+CN,WACA,SACA,gBACA,kBACA,eACA,gBACA,UACA,oBACA,WACA,4BACA,iBACA,wDAKE,SACE,uBAKN,WACE,aACA,sBACA,4BAEA,iBACE,c5B9DgB,a4BgEhB,YACA,mBACA,CAGE,yDAIJ,UACE,gBAIJ,qBACE,eACA,gBACA,kBACA,kBACA,WACA,aACA,2BxBzDA,iBACE,mBACA,cACA,eACA,aACA,gBACA,sBwBwDJ,WACE,sBACA,cACA,WACA,kBACA,kBACA,gBACA,kCAEA,eACE,qEAIA,cACE,MACA,gCAIJ,e1B5HM,gC0BiIR,cACE,cACA,qBACA,c5BpHqB,kB4BsHrB,UACA,mEAEA,WAEE,WACA,sBACA,CADA,gCACA,CADA,kBACA,CAIE,0HAFF,WACE,oBACA,CADA,8BACA,CADA,gB1BhJE,C0BiJF,wBAKN,UACE,CAEA,iBACA,MACA,OACA,UACA,gB1B7JM,iC0BgKN,YACE,sBAIJ,WACE,gBACA,kBACA,WACA,aACA,uBACA,qCAGF,cACE,YACA,WACA,kBACA,UACA,sBACA,CADA,gCACA,CADA,kBACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,qDAEA,WACE,oBACA,CADA,8BACA,CADA,gBACA,sCAIJ,0BACE,2BACA,gBACA,kBACA,yBAGF,eACE,iBACA,yBAGF,UACE,cAGF,UACE,YACA,kBACA,qCAEA,UACE,YACA,aACA,mBACA,uBACA,2CAEA,c1BrK0B,eAEC,C0B+K7B,8CALF,iBACE,MACA,OACA,QACA,SAYA,CAXA,yBAQA,mBACA,8BACA,oBACA,4BAEA,mBACE,0DAGF,SACE,4DAEA,mBACE,mBAKN,yBACE,sBACA,SACA,W1BjQM,e0BmQN,aACA,mBACA,eACA,cACA,cACA,kBACA,kBACA,MACA,SACA,yBAGF,MACE,0BAGF,OACE,CASA,4CANF,UACE,kBACA,kBACA,OACA,YACA,oBAUA,6BAEA,WACE,sBAGF,mBACE,qBACA,gBACA,c5B5SsB,mF4B+StB,yBAGE,wBAKN,oBACE,sBAGF,qB1B9TQ,Y0BgUN,WACA,kBACA,YACA,UACA,SACA,YACA,8BAGF,wB5B9TqB,qB4BkUrB,iBACE,UACA,QACA,YACA,qKAKA,WAEE,mFAGF,WACE,eAKJ,qBACE,kBACA,mBACA,kBACA,oBACA,cACA,wBAEA,eACE,YACA,yBAGF,cACE,kBACA,gBACA,gCAEA,UACE,cACA,kBACA,6BACA,WACA,SACA,OACA,oBACA,qCAIJ,oCACE,iCAGF,wBACE,uCAIA,mBACA,mBACA,6BACA,0BACA,eAIJ,eACE,kBACA,gB1BnZM,e0BqZN,kBACA,sBACA,cACA,wBAEA,eACE,sBACA,qBAGF,SACE,gCAGF,UACE,YACA,0BxB3XF,iBACE,mBACA,cACA,eACA,aACA,gBACA,qBwB0XF,eACE,gBACA,UACA,kBACA,0BAGF,oBACE,sBACA,SACA,gCAEA,wBACE,0BACA,qBACA,sBACA,UACA,4BAKF,qBACE,CADF,gCACE,CADF,kBACE,kBACA,QACA,2BACA,yBAIJ,iBACE,UACA,SACA,OACA,QACA,sBACA,iFACA,eACA,UACA,4BACA,gCAEA,SACE,6EAKF,iBAEE,wBAIJ,YACE,kBACA,MACA,OACA,WACA,YACA,UACA,SACA,gB1BxeI,cFcY,gB4B6dhB,oBACA,+BAEA,aACE,oBACA,8GAEA,aAGE,+BAIJ,aACE,eACA,kCAGF,aACE,eACA,gBACA,4BAIJ,YACE,8BACA,oBACA,CAGE,gUAEA,aAIE,wBAKN,cACE,mBACA,gBACA,uBACA,oCAGE,cACE,qCAKF,eACE,+BAIJ,sBACE,iBACA,eACA,SACA,0BACA,8GAEA,U1B9iBE,+E0BsjBN,cAGE,gBACA,6BAGF,U1B7jBM,iB0B+jBJ,yBAGF,oBACE,aACA,mDAGF,U1BvkBM,uB0B4kBN,cACE,YACA,eACA,8BAEA,UACE,WACA,+BAOA,6DANA,iBACA,cACA,kBACA,WACA,UACA,YAWA,CAVA,+BASA,kBACA,+BAGF,iBACE,UACA,kBACA,WACA,YACA,YACA,UACA,4BACA,mBACA,sCACA,oBACA,qBAIJ,gBACE,uBAEA,oBACE,eACA,gBACA,W1B5nBE,sF0B+nBF,yBAGE,qBAKN,cACE,YACA,kBACA,4BAEA,UACE,WACA,+BACA,kBACA,cACA,kBACA,WACA,SACA,2DAGF,aAEE,kBACA,WACA,kBACA,SACA,mBACA,6BAGF,6BACE,6BAGF,iBACE,UACA,UACA,kBACA,WACA,YACA,QACA,iBACA,4BACA,mBACA,sCACA,oBACA,CAGE,yFAKF,SACE,6GAQF,gBACE,oBACA,iBCtsBR,YACE,mBACA,mBACA,kBACA,QACA,SACA,YACA,mBAGF,YACE,kBACA,gBACA,yBACA,0BACA,eACA,iBACA,yBACA,WACA,4BACA,wCAEA,uBCtBF,kB9BGqB,sB8BDnB,kBACA,uCACA,YACA,gBACA,qCAEA,aARF,SASI,kBAGF,cACE,mBACA,gBACA,eACA,kBACA,0BACA,6BAGF,WACE,6BAGF,yBACE,sCAEA,uBACE,uCACA,wBACA,wBAIJ,eACE,kDAIA,oBACE,+BAIJ,cACE,sBAGF,eACE,aAIJ,kB9BnDqB,sB8BqDnB,kBACA,uCACA,YACA,gBACA,qCAEA,YARF,SASI,uBAGF,kBACE,oBAGF,kBACE,YACA,0BACA,gBACA,mBAGF,YACE,gCACA,4BAGF,YACE,iCAGF,aACE,gBACA,qBACA,eACA,aACA,aC3FJ,cAOE,qBACA,W/BPM,gD+BEJ,iBACA,+BAOF,WACE,iBAIJ,sBACE,6BAEA,uBACE,2BACA,4BACA,mB/BjBsB,4B+BqBxB,oBACE,8BACA,+BACA,aACA,qBAIJ,YACE,8BACA,cACA,c/BfmB,c+BiBnB,oBAGF,iBACE,OACA,kBACA,iBACA,gBACA,8BACA,eACA,0BAEA,aACE,6BAIJ,a/BlD0B,mC+BqDxB,aACE,oDAGF,QACE,wBAIJ,iBACE,YACA,OACA,WACA,WACA,yBACA,uBAIA,oBACE,WACA,eACA,yBAGF,iBACE,gBACA,oBAIJ,iBACE,aACA,gBACA,kBACA,gB7B5FM,sB6B8FN,sGAEA,+BAEE,oBAKF,2BACA,gB7BxGM,0B6B2GN,cACE,gBACA,gBACA,oBACA,cACA,WACA,gCACA,W/BnHI,yB+BqHJ,kBACA,4CAEA,QACE,2GAGF,mBAGE,wCAKN,cACE,6CAEA,SACE,kBACA,kBACA,qDAGF,SACE,WACA,kBACA,MACA,OACA,WACA,YACA,sCACA,mBACA,4BAIJ,SACE,kBACA,wBACA,gBACA,MACA,iCAEA,aACE,WACA,gBACA,gBACA,gB7BpKI,mB6ByKR,iBACE,qBACA,YACA,wBAEA,UACE,YACA,wBAIJ,cACE,kBACA,iBACA,c/BlKiB,mD+BqKjB,YACE,qDAGF,eACE,uDAGF,YACE,qBAIJ,YACE,wBC1MF,iBACE,aACA,mBACA,mBhCEwB,WAJlB,kBgCKN,YACA,WACA,gBACA,iBACA,gBACA,4DAEA,aACE,eACA,mFAGF,iBACE,kBACA,gBACA,+FAEA,iBACE,OACA,MACA,kCAIJ,aACE,chCTiB,2BgCanB,cACE,gBACA,iBACA,mBACA,2BAGF,cACE,gBACA,iBACA,gBACA,mBACA,0CAIJ,aACE,kBACA,cACA,mBACA,gCACA,eACA,qBACA,aACA,0BACA,4DAEA,aACE,iBACA,gDAGF,kBhC9DwB,iDgCkExB,kBhC1DmB,WEXb,qG8B0EN,kB9BxEU,WAFJ,oC8BgFR,kBACE,YACA,eACA,iBACA,gBACA,8BAGF,aACE,UACA,kBACA,YACA,gBACA,oCAGF,iBACE,4FAGF,eAEE,mBACA,qCAGF,mCACE,UACE,cACA,0CAGF,YACE,4DAEA,YACE,kBCtHN,U/BEQ,gC+BCN,oBAEA,cACE,iBACA,gBACA,kBACA,mBAGF,U/BVM,0B+BYJ,oBAGF,eACE,cACA,iBACA,mDAGF,UACE,YACA,gBACA,gCACA,gBC3BJ,WACE,gBACA,aACA,sBACA,yBACA,kBACA,+BAEA,gBACE,eACA,CACA,2BACA,kCAGF,QACE,iCAGF,aACE,6BAGF,sBACE,0BAGF,MACE,kBACA,aACA,sBACA,iBACA,mDAGF,eACE,sBhClCI,0BgCoCJ,cACA,gDAGF,iBACE,gDAGF,WACE,mBAIJ,eACE,mBACA,yBACA,gBACA,aACA,sBACA,qBAEA,aACE,sBAGF,aACE,SACA,CACA,4BACA,cACA,qDAHA,sBAOA,qCAIJ,qBAEI,cACE,wBAKN,qBACE,WACA,cACA,6DAEA,UAEE,YACA,UACA,wCAGF,YACE,cACA,kDACA,qCAEA,uCALF,aAMI,yCAIJ,eACE,oCAGF,YACE,uDAGF,cACE,sCAGF,gBACE,eACA,CACA,2BACA,yCAGF,QACE,mCAGF,gBACE,yBAEA,kCAHF,eAII,sCAIJ,sBACE,gBACA,sCAGF,uCACE,YACE,iKAEA,eAGE,6CAIJ,gBACE,2EAGF,YAEE,kGAGF,gBACE,+BAGF,YACE,gBACA,gLAEA,eAIE,gCAIJ,iBACE,6CAEA,cACE,8CAKF,gBACE,CAIA,yFAGF,eACE,0BAMR,cACE,aACA,uBACA,mBACA,gBACA,iBACA,iBACA,gBACA,mBACA,WhCjNM,kBgCmNN,eACA,iBACA,qBACA,sCACA,4FAEA,kBAGE,qCAIJ,UACE,UACE,uDAGF,kCACE,mCAGF,kBAEE,sCAIJ,2CACE,YACE,sCAOA,sEAGF,YACE,uCAIJ,0CACE,YACE,uCAIJ,UACE,YACE,gCC1QJ,oBACE,gBACA,yCAEA,UACE,YACA,gBACA,iCAGF,kBACE,qBACA,4CAEA,eACE,iCAIJ,anCFqB,qBmCInB,uCAEA,yBACE,+CAIA,oBACE,oDAEA,yBACE,gDAKN,aACE,gBAKN,kBACE,eACA,aACA,qBACA,0BAEA,WACE,cACA,qCAEA,yBAJF,YAKI,4BAIJ,wBACE,cACA,kBACA,qCAEA,0BALF,UAMI,uBAIJ,qBACE,WACA,aACA,kBACA,eACA,iBACA,qBACA,gBACA,gBACA,gBACA,aACA,sBACA,6BAEA,aACE,gBACA,mBACA,mBACA,8BAGF,iBACE,SACA,WACA,cACA,mBnCvFoB,kBmCyFpB,cACA,eACA,4BAIJ,YACE,cnCvFgB,kBmCyFhB,WACA,QACA,mDAIJ,YACE,oDAGF,UACE,gBAGF,YACE,eACA,mBACA,gBACA,iBACA,wBACA,sBAEA,aACE,mBACA,SACA,kBACA,WACA,eACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,cACA,aACA,mBACA,2BACA,2CACA,6BAEA,aACE,aACA,WACA,YACA,iCAEA,aACE,SACA,WACA,YACA,eACA,gBACA,sBACA,sBACA,CADA,gCACA,CADA,kBACA,6BAIJ,aACE,cACA,eACA,gBACA,kBACA,gBACA,cnCrJc,mFmCyJhB,kBAGE,4BACA,2CACA,wGAEA,aACE,6BAIJ,0BACE,2CACA,yBACA,yDAEA,aACE,uCAKN,UACE,oCAGF,WACE,8BAGF,anCxLkB,SmC0LhB,eACA,WACA,cACA,cACA,YACA,aACA,mBACA,WACA,2BACA,2CACA,2GAEA,SAGE,cACA,4BACA,2CACA,qCAKF,SACE,OCjON,eACE,eACA,8BAEA,QAEE,gBACA,UAGF,kBACE,kBACA,cAGF,iBACE,cACA,mBACA,WACA,aACA,sBAEA,kBpCTiB,eoCcnB,iBACE,aACA,cACA,iBACA,eACA,gBACA,qBAEA,oBACE,qBACA,yBACA,4BACA,oEAGF,YAEE,kCAGF,aACE,gCAIA,qBACA,WACA,eACA,WpCtDE,coCwDF,UACA,oBACA,gBlCzDE,yBkC2DF,kBACA,iBACA,sCAEA,oBpC3DoB,0BoCgEtB,cACE,wBAGF,YACE,mBACA,iBACA,cAIJ,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,gBACA,mBACA,cACA,uBAEA,iBACE,qBAGF,oBlClGY,8EkCuGZ,oBAGE,iBACA,gCAGF,mBACE,SACA,wCAGF,mBAEE,eAIJ,oBACE,WACA,gBACA,cACA,cAGF,aACE,qBACA,oBAEA,cACE,eAIJ,eACE,mBACA,cpC9Hc,aoCkIhB,cACE,uBACA,UACA,SACA,SACA,cpCvIc,0BoCyId,kBACA,mBAEA,oBACE,sCAGF,qCAEE,eAIJ,WACE,eACA,kBACA,eACA,6BAIJ,4BACE,kBACA,gCAEA,YACE,2CAGF,4BACE,aACA,aACA,mBACA,mGAEA,UAEE,aACA,+GAEA,oBpC3LoB,sDoCiMxB,cACE,gBACA,iBACA,YACA,oBACA,cpCzLkB,sCoC4LlB,gCAGF,YACE,mBACA,8CAEA,aACE,wBACA,iBACA,oCAIJ,uBACE,CADF,oBACE,CADF,eACE,sBACA,eACA,WpC/NI,qBoCiOJ,WACA,UACA,oBACA,qXACA,yBACA,kBACA,CACA,yBACA,mDAGF,aACE,cAIJ,apClOkB,qBoCqOhB,+BACE,6BAEA,6BACE,YCpPN,qBACE,iBANc,cAQd,kBACA,sCAEA,WANF,UAOI,eACA,mBAIJ,sBACE,eACA,gBACA,gBACA,qBACA,crCPkB,oBqCUlB,arCnBwB,0BqCqBtB,6EAEA,oBAGE,wCAIJ,arCrBkB,oBqC0BlB,YACE,oBACA,+BAEA,eACE,yBAIJ,eACE,crClCmB,qBqCsCrB,iBACE,crCvCmB,uBqC2CrB,eACE,mBACA,kBACA,kBACA,yHAGF,sBAME,mBACA,oBACA,gBACA,crC3DmB,qBqC+DrB,aACE,qBAGF,gBACE,qBAGF,eACE,qBAGF,gBACE,yCAGF,aAEE,qBAGF,eACE,qBAGF,kBACE,yCAMA,iBACA,iBACA,yDAEA,2BACE,yDAGF,2BACE,qBAIJ,UACE,SACA,SACA,gCACA,eACA,4BAEA,UACE,SACA,wBAIJ,UACE,yBACA,8BACA,CADA,iBACA,gBACA,mBACA,iEAEA,+BAEE,cACA,kBACA,gBACA,gBACA,crCxIc,iCqC4IhB,uBACE,gBACA,gBACA,crC9IY,qDqCkJd,WAEE,iBACA,kBACA,qBACA,mEAEA,SACE,kBACA,iFAEA,gBACE,kBACA,6EAGF,iBACE,SACA,UACA,mBACA,gBACA,uBACA,+BAMR,YACE,oBAIJ,kBACE,eACA,mCAEA,iBACE,oBACA,8BAGF,YACE,8BACA,eACA,6BAGF,UACE,uBACA,eACA,iBACA,WnCpNI,iBmCsNJ,kBACA,qEAEA,aAEE,6CAIA,arChNiB,oCqCqNnB,sBACE,gBACA,eACA,iBACA,qCAGF,4BA3BF,iBA4BI,4BAIJ,iBACE,YACA,sBACA,mBACA,CACA,sBACA,0BACA,QACA,aACA,yCAEA,sBACE,eACA,iBACA,gBACA,crClPc,mBqCoPd,mBACA,gCACA,uBACA,mBACA,gBACA,wFAEA,eAEE,cACA,2CAGF,oBACE,2BAKN,iBACE,mCAIE,UACqB,sCjCnRzB,CiCoRI,kBACA,uCAEA,aACE,WACA,YACA,mBACA,iBnCpOgB,wBE9DtB,4BACA,iCiCsSE,cACE,mCAEA,aACE,WnC3SA,qBmC6SA,uDAGE,yBACE,2CAKN,aACE,crC1SY,kCqCkTlB,sBAEE,CACA,eACA,eACA,iBACA,mBACA,crCzTgB,sCqC4ThB,arCrUsB,0BqCuUpB,kBAIJ,cACE,SACA,UACA,gBACA,uBACA,oBACA,kBACA,oBACA,cACA,kBAGF,sBACE,eACA,iBACA,gBACA,mBACA,crCjVmB,wBqCoVnB,sBACE,cACA,eACA,gBACA,cACA,kBAKF,cACA,iBrC/VmB,mCqC6VrB,sBACE,CAEA,eACA,mBACA,crClWmB,kBqCuWnB,cACA,iBrCxWmB,kBqCgXnB,crChXmB,mCqC+WrB,sBACE,CACA,gBACA,gBACA,mBACA,crCpXmB,kBqCyXnB,crCzXmB,kBqCiYrB,sBACE,eACA,iBACA,gBACA,mBACA,crCtYmB,mCqC0YrB,gBAEE,mDAEA,2BACE,mDAGF,2BACE,kBAIJ,eACE,kBAGF,kBACE,yCAGF,cAEE,kBAGF,UACE,SACA,SACA,4CACA,cACA,yBAEA,UACE,SACA,iDAIJ,YAEE,+BAGF,kBrCpcmB,kBqCscjB,kBACA,gBACA,sBACA,oCAEA,UACE,aACA,2BACA,iBACA,8BACA,mBACA,uDAGF,YACE,yBACA,qBACA,mFAEA,aACE,eACA,qCAGF,sDAVF,UAWI,8BACA,6CAIJ,MACE,sBACA,qCAEA,2CAJF,YAKI,sBAKN,iBACE,yBAEA,WACE,WACA,uBACA,4BAIJ,iBACE,mBACA,uCAEA,eACE,mCAGF,eACE,cACA,qCAGF,eACE,UACA,mDAEA,kBACE,aACA,iBACA,0FAKE,oBACE,gFAIJ,cACE,qDAIJ,aACE,cACA,6CAMA,UACqB,sCjC9hB3B,mDiCiiBI,cACE,4DAEA,cACE,qCAKN,oCACE,eACE,sCAIJ,2BA9DF,iBA+DI,mFAIJ,qBAGE,mBrC9jBiB,kBqCgkBjB,kCACA,uBAGF,YACE,kBACA,WACA,YACA,2BAEA,YACE,WACA,uCAKF,YACE,eACA,mBACA,mBACA,qCAGF,sCACE,kBACE,uCAIJ,arChlBmB,qCqColBnB,eACE,WnCpmBE,gBmCsmBF,2CAEA,arC3lBc,gDqC8lBZ,arC5lBe,+CqCkmBnB,eACE,qBAIJ,kBACE,yBAEA,aACE,SACA,eACA,YACA,kBACA,qCAIJ,gDAEI,kBACE,yCAGF,eACE,gBACA,WACA,kBACA,uDAEA,iBACE,sCAMR,8BACE,aACE,uCAEA,gBACE,sDAGF,kBACE,6EAIJ,aAEE,qBAIJ,WACE,UAIJ,mBACE,qCAEA,SAHF,eAII,kBAGF,YACE,uBACA,mBACA,aACA,qBAEA,SnC1rBI,YmC4rBF,qCAGF,gBAXF,SAYI,mBACA,sBAIJ,eACE,uBACA,gBACA,gBACA,uBAGF,eACE,gBACA,0BAEA,YACE,yBACA,gBACA,eACA,crCvsBc,6BqC2sBhB,eACE,iBACA,+BAGF,kBrC5tBiB,aqC8tBf,0BACA,aACA,uCAEA,YACE,gCAIJ,cACE,gBACA,uDAEA,YACE,mBACA,iDAGF,UACE,YACA,0BACA,gCAIJ,YACE,uCAEA,sBACE,eACA,gBACA,cACA,qCAGF,cACE,crCtvBY,uFqC4vBlB,eACE,cASA,CrCtwBgB,2CqCmwBhB,iBACA,CACA,kBACA,gBAGF,eACE,cACA,aACA,kDACA,cACA,qCAEA,eAPF,oCAQI,cACA,8BAEA,UACE,aACA,sBACA,0CAEA,OACE,cACA,2CAGF,YACE,mBACA,QACA,cACA,qCAIJ,UACE,2BAGF,eACE,sCAIJ,eAtCF,UAuCI,6BAEA,aACE,gBACA,gBACA,2GAEA,eAGE,uFAIJ,+BAGE,2BAGF,YACE,gCAEA,eACE,qEAEA,eAEE,gBACA,2CAGF,eACE,SAQZ,iBACE,qBACA,iBAGF,aACE,kBACA,aACA,UACA,YACA,crC92BsB,qBqCg3BtB,eACA,qCAEA,gBAVF,eAWI,WACA,gBACA,crC12Bc,SsChBlB,UACE,eACA,iBACA,yBACA,qBAEA,WAEE,iBACA,mBACA,6BACA,gBACA,mBACA,oBAGF,qBACE,gCACA,aACA,gBACA,oBAGF,eACE,qEAGF,kBtCxBmB,UsC6BnB,atC1BwB,0BsC4BtB,gBAEA,oBACE,eAIJ,eACE,CAII,4HADF,eACE,+FAOF,sBAEE,yFAKF,YAEE,gCAMJ,kBtCjEiB,6BsCmEf,gCACA,4CAEA,qBACE,8BACA,2CAGF,uBACE,+BACA,0BAKN,qBACE,gBAIJ,aACE,mBACA,MAGF,+BACE,0BAGF,sBACE,SACA,aACA,8CAGF,oBAEE,qBACA,iBACA,eACA,ctC/FkB,gBsCiGlB,0DAEA,UpChHM,wDoCoHN,eACE,iBACA,sEAGF,cACE,yCAKF,YAEE,yDAEA,qBACE,iBACA,eACA,gBACA,qEAEA,cACE,2EAGF,YACE,mBACA,uFAEA,YACE,qHAOJ,sBACA,cACA,uBAIJ,wBACE,mBtC/JiB,sBsCiKjB,YACA,mBACA,gCAEA,gBACE,mBACA,oBAIJ,YACE,yBACA,aACA,mBtC9KiB,gCsCiLjB,aACE,gBACA,mBAIJ,wBACE,aACA,mBACA,qCAEA,wCACE,4BACE,0BAIJ,kBACE,iCAGF,kBtCtMiB,uCsCyMf,kBACE,4BAIJ,gBACE,oBACA,sCAEA,SACE,wCAGF,YACE,mBACA,mCAGF,aACE,aACA,uBACA,mBACA,kBACA,6CAEA,UACE,YACA,kCAIJ,aACE,mCAGF,aACE,iBACA,ctClOY,gBsCoOZ,mCAIJ,QACE,WACA,qCAEA,sBACE,gBACA,qCAOJ,4FAFF,YAGI,gCAIJ,aACE,sCAEA,eACE,4BAIJ,wBACE,aACA,gBACA,qCAEA,2BALF,4BAMI,sCAIJ,+CACE,YACE,iBCzRN,YACE,uBACA,WACA,iBACA,iCAEA,gBACE,gBACA,oBACA,cACA,wCAEA,YACE,yBACA,mBvCfe,YuCiBf,yBAIJ,WAvBc,UAyBZ,oBACA,iCAEA,YACE,mBACA,YACA,uCAEA,aACE,yCAEA,oBACE,aACA,2CAGF,SrCxCA,YqC0CE,kBACA,YACA,uCAIJ,aACE,cvCpCY,qBuCsCZ,cACA,eACA,aACA,0HAIA,kBAGE,+BAKN,aACE,iBACA,YACA,aACA,qCAGF,sCACE,YACE,6BAIJ,eACE,0BACA,gBACA,mBACA,qCAEA,2BANF,eAOI,+BAGF,aACE,aACA,cvC9EY,qBuCgFZ,0BACA,2CACA,0BACA,mBACA,gBACA,uBACA,mCAEA,gBACE,oCAGF,UrCzGA,yBqC2GE,0BACA,2CACA,uCAGF,kBACE,sBACA,+BAIJ,kBACE,wBACA,SACA,iCAEA,QACE,kBACA,6DAIJ,UrCjIE,yBFWa,gBuCyHb,gBACA,mEAEA,wBACE,6DAKN,yBACE,iCAIJ,qBACE,WACA,gBApJY,cAsJZ,sCAGF,uCACE,YACE,iCAGF,WA/JY,cAiKV,sCAIJ,gCACE,UACE,0BAMF,2BACA,qCAEA,wBALF,cAMI,CACA,sBACA,kCAGF,YACE,oBAEA,gCACA,0BAEA,eAEA,mBACA,8BACA,mCAEA,eACE,kBACA,yCAGF,mBACE,4DAEA,eACE,qCAIJ,gCAzBF,eA0BI,iBACA,6BAIJ,avCrMmB,euCuMjB,iBACA,gBACA,qCAEA,2BANF,eAOI,6BAIJ,avChNmB,euCkNjB,iBACA,gBACA,mBACA,4BAGF,wBACE,eACA,gBACA,cvC7Nc,mBuC+Nd,kBACA,gCACA,4BAGF,cACE,cvCnOiB,iBuCqOjB,gBACA,0CAGF,UrCxPI,gBqC0PF,uFAGF,eAEE,gEAGF,aACE,4CAGF,cACE,gBACA,WrCxQE,oBqC0QF,iBACA,gBACA,mBACA,2BAGF,cACE,iBACA,cvCnQiB,mBuCqQjB,kCAEA,UrCtRE,gBqCwRA,CAII,2NADF,eACE,4BAMR,UACE,SACA,SACA,4CACA,cACA,mCAEA,UACE,SACA,qCAKN,eA9SF,aA+SI,iCAEA,YACE,yBAGF,UACE,UACA,YACA,iCAEA,YACE,4BAGF,YACE,8DAGF,eAEE,gCACA,gBACA,0EAEA,eACE,+BAIJ,eACE,6DAGF,2BvCxUe,YuC+UrB,UACE,SACA,cACA,WACA,sDAKA,avCtVkB,0DuCyVhB,avClWsB,4DuCuWxB,arC1Wc,gBqC4WZ,4DAGF,arC9WU,gBqCgXR,0DAGF,avCvWgB,gBuCyWd,0DAGF,arCtXU,gBqCwXR,UAIJ,YACE,eACA,yBAEA,aACE,qBACA,oCAEA,kBACE,4BAGF,cACE,gBACA,+BAEA,oBACE,iBACA,gCAIJ,eACE,yBACA,eACA,CAII,iNADF,eACE,6CAKN,aACE,mBACA,2BAGF,oBACE,cvC3Zc,qBuC6Zd,yBACA,eACA,gBACA,gCACA,iCAEA,UrChbE,gCqCkbA,oCAGF,avCjboB,gCuCmblB,iBAMR,aACE,iBACA,eACA,sBAGF,aACE,eACA,cACA,wBAEA,aACE,kBAIJ,YACE,eACA,mBACA,wBAGF,YACE,WACA,sBACA,aACA,+BAEA,aACE,qBACA,gBACA,eACA,iBACA,cvC/cmB,CuCodf,4MADF,eACE,sCAKN,aACE,gCAIJ,YAEE,mBACA,kEAEA,UACE,kBACA,4BACA,gFAEA,iBACE,kDAKN,aAEE,aACA,sBACA,4EAEA,cACE,WACA,kBACA,mBACA,uEAIJ,cAEE,iBAGF,YACE,eACA,kBACA,2CAEA,kBACE,eACA,8BAGF,kBACE,+CAGF,gBACE,uDAEA,gBACE,mBACA,YACA,YAKN,kBACE,eACA,cAEA,avCziBwB,qBuC2iBtB,oBAEA,yBACE,SAKN,aACE,YAGF,gBACE,eACA,mBvC5jBmB,gCuC8jBnB,uBAEA,eACE,oBAGF,YACE,2BACA,mBACA,cvC3jBgB,euC6jBhB,eACA,oBAGF,iBACE,4BAEA,aACE,SACA,kBACA,WACA,YACA,qBAIJ,2BACE,mBAGF,oBACE,uBAGF,avCplBgB,sDuCwlBhB,avCvlBqB,qBuC2lBnB,gBACA,yDAIJ,oBAIE,cvCpmBqB,iGuCumBrB,eACE,yIAIA,4BACE,cACA,iIAGF,8BACE,CADF,sBACE,WACA,sBAKN,YAEE,mBACA,sCAEA,aACE,CACA,gBACA,kBACA,0DAIA,8BACE,CADF,sBACE,WACA,gBAKN,kBACE,8BACA,yBAEA,yBrC9pBc,yBqCkqBd,yBACE,wBAGF,yBrCnqBU,wBqCwqBR,2BACA,eACA,iBACA,4BACA,kBACA,gBACA,0BAEA,avCvqBgB,uBuC6qBhB,wBACA,qBAGF,avChrBgB,cuCqrBlB,kBvClsBqB,kBuCosBnB,mBACA,uBAEA,YACE,8BACA,mBACA,aACA,gCAEA,SACE,SACA,gDAEA,aACE,8BAIJ,aACE,gBACA,cvC5sBc,yBuC8sBd,iBACA,gCAEA,aACE,qBACA,iHAEA,aAGE,mCAIJ,arCvuBM,6BqC8uBR,YACE,2BACA,6BACA,mCAEA,kBACE,gFAGF,YAEE,cACA,sBACA,YACA,cvCjvBY,mLuCovBZ,kBAEE,gBACA,uBACA,sCAIJ,aACE,6BACA,4CAEA,avC/vBU,iBuCiwBR,gBACA,wCAIJ,aACE,sBACA,WACA,aACA,qBACA,cvC5wBY,WuCmxBpB,kBAGE,0BAFA,eACA,uBASA,CARA,eAGF,oBACE,gBACA,CAEA,qBACA,oBAGF,YACE,eACA,CACA,kBACA,wBAEA,qBACE,cACA,mBACA,aACA,0FAGF,kBAEE,kBACA,YACA,6CAGF,QACE,SACA,+CAEA,aACE,sEAGF,uBACE,yDAGF,arC70BY,8CqCk1Bd,qBACE,aACA,WrCr1BI,cqC01BR,iBACE,qBAGF,wBACE,kBACA,2BAEA,cACE,mBvCl2BiB,gCuCo2BjB,kCAEA,cACE,cACA,gBACA,eACA,gBACA,cvC71BiB,qBuC+1BjB,mBACA,uHAEA,UrCj3BE,iCqCw3BJ,cACE,cvC32BY,uCuC+2Bd,YACE,8BACA,mBACA,sCAGF,eACE,kkECp4BN,kIACE,CADF,sIACE,uIAYA,aAEE,yIAGF,aAEE,qIAGF,aAEE,6IAGF,aAEE,UChCJ,aACE,gCAEA,gBACE,eACA,mBACA,+BAGF,cACE,iBACA,8CAGF,aACE,kBACA,wBAGF,gBACE,iCAGF,aACE,kBACA,uCAGF,oBACE,gDAGF,SACE,YACA,8BAGF,cACE,iBACA,mEAGF,aACE,kBACA,2DAGF,cAEE,gBACA,mFAGF,cACE,gBACA,+BAGF,eACE,2EAGF,UAEE,mCAGF,aACE,iBACA,yBAGF,kBACE,kBACA,4BAGF,UACE,UACA,wBAGF,aACE,kCAGF,MACE,WACA,cACA,mBACA,2CAGF,aACE,iBACA,0CAGF,gBACE,eACA,mCAGF,WACE,sCAGF,gBACE,gBACA,yCAGF,UACE,iCAGF,aACE,iBACA,+BAGF,UACE,0BAGF,gBACE,eACA,UAGA,WACA,yCAGF,iBACE,mBACA,4GAGF,iBAEE,gBACA,uCAGF,kBACE,eACA,2BAGF,aACE,kBACA,wCAGF,SACE,YACA,yDAGF,SACE,WACA,CAKA,oFAGF,UACE,OACA,uGAGF,UAEE,gBACA,uCAIA,cACE,iBACA,kEAEA,cACE,gBACA,qCAKN,WACE,eACA,iBACA,uCAGF,WACE,sCAGF,aACE,kBACA,0CAGF,gBACE,eACA,uDAGF,gBACE,2CAGF,cACE,iBACA,YACA,yEAGF,aAEE,iBACA,iBAGF,wBACE,iBAGF,SACE,oBACA,yBAGF,aACE,8EAGF,cAEE,gBACA,oDAGF,cACE,mBACA,gEAGF,iBACE,gBACA,CAMA,8KAGF,SACE,QACA,yDAGF,kBACE,eACA,uDAGF,kBACE,gBACA,qDAGF,SACE,QACA,8FAGF,cAEE,mBACA,4CAGF,UACE,SACA,kDAEA,UACE,OACA,kEACA,8BAIJ,sXACE,uCAGF,gBAEE,kCAGF,cACE,iBACA,gDAGF,UACE,UACA,gEAGF,aACE,uDAGF,WACE,WACA,uDAGF,UACE,WACA,uDAGF,UACE,WACA,kDAGF,MACE,0CAGF,iBACE,yBACA,qDAGF,cACE,iBACA,qCAGF,kCACE,gBAEE,kBACA,2DAEA,gBACE,mBACA,uEAKF,gBAEE,kBACA,gFAKN,cAEE,gBACA,6CAKE,eACE,eACA,sDAIJ,aACE,kBACA,4DAKF,cACE,gBACA,8DAGF,gBACE,eACA,mCAIJ,aACE,kBACA,iBACA,kCAGF,WACE,mCAGF,WACE,oCAGF,cACE,gBACA,gFAGF,cACE,mBACA,+DAGF,SACE,QACA,sBChbJ,YACE,eACA,CACA,kBACA,0BAEA,qBACE,iBACA,cACA,mBACA,yDAEA,YAEE,mBACA,kBACA,sBACA,YACA,4BAGF,oBACE,cACA,cACA,qGAEA,kBAGE,sDAKN,iBAEE,gBACA,eACA,iBACA,WxCrCI,uBwCuCJ,mBACA,iBACA,4BAGF,cACE,6BAGF,cACE,c1CpCgB,kB0CsChB,gBACA,qBAIJ,YACE,eACA,cACA,yBAEA,gBACE,mBACA,6BAEA,aACE,sCAIJ,a1CnEwB,gB0CqEtB,qBACA,2GCrEM,SACE,CDoER,iGCrEM,SACE,CDoER,qGCrEM,SACE,CDoER,4FCrEM,SACE,mJAQZ,aAME,0BACA,mMAEA,oBACE,iOAGF,yBACE,CAKE,0zCAIJ,oBAGE,uUAGF,a3C3BqB,qB2C6BnB,oCAIJ,yBACE,6HAEA,oBAGE,4BAIJ,yBACE,qGAEA,oBAGE,eAIJ,a3CvDoB,yE2C2DpB,+BACE,0D","file":"skins/glitch/contrast/common.css","sourcesContent":["html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:\"\";content:none}table{border-collapse:collapse;border-spacing:0}html{scrollbar-color:#313543 rgba(0,0,0,.1)}::-webkit-scrollbar{width:12px;height:12px}::-webkit-scrollbar-thumb{background:#313543;border:0px none #fff;border-radius:50px}::-webkit-scrollbar-thumb:hover{background:#353a49}::-webkit-scrollbar-thumb:active{background:#313543}::-webkit-scrollbar-track{border:0px none #fff;border-radius:0;background:rgba(0,0,0,.1)}::-webkit-scrollbar-track:hover{background:#282c37}::-webkit-scrollbar-track:active{background:#282c37}::-webkit-scrollbar-corner{background:transparent}body{font-family:sans-serif,sans-serif;background:#191b22;font-size:13px;line-height:18px;font-weight:400;color:#fff;text-rendering:optimizelegibility;font-feature-settings:\"kern\";text-size-adjust:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-tap-highlight-color:transparent}body.system-font{font-family:system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"Oxygen\",\"Ubuntu\",\"Cantarell\",\"Fira Sans\",\"Droid Sans\",\"Helvetica Neue\",sans-serif,sans-serif}body.app-body{padding:0}body.app-body.layout-single-column{height:auto;min-height:100vh;overflow-y:scroll}body.app-body.layout-multiple-columns{position:absolute;width:100%;height:100%}body.app-body.with-modals--active{overflow-y:hidden}body.lighter{background:#282c37}body.with-modals{overflow-x:hidden;overflow-y:scroll}body.with-modals--active{overflow-y:hidden}body.embed{background:#313543;margin:0;padding-bottom:0}body.embed .container{position:absolute;width:100%;height:100%;overflow:hidden}body.admin{background:#1f232b;padding:0}body.error{position:absolute;text-align:center;color:#dde3ec;background:#282c37;width:100%;height:100%;padding:0;display:flex;justify-content:center;align-items:center}body.error .dialog{vertical-align:middle;margin:20px}body.error .dialog img{display:block;max-width:470px;width:100%;height:auto;margin-top:-120px}body.error .dialog h1{font-size:20px;line-height:28px;font-weight:400}button{font-family:inherit;cursor:pointer}button:focus{outline:none}.app-holder,.app-holder>div{display:flex;width:100%;align-items:center;justify-content:center;outline:0 !important}.layout-single-column .app-holder,.layout-single-column .app-holder>div{min-height:100vh}.layout-multiple-columns .app-holder,.layout-multiple-columns .app-holder>div{height:100%}.container-alt{width:700px;margin:0 auto;margin-top:40px}@media screen and (max-width: 740px){.container-alt{width:100%;margin:0}}.logo-container{margin:100px auto 50px}@media screen and (max-width: 500px){.logo-container{margin:40px auto 0}}.logo-container h1{display:flex;justify-content:center;align-items:center}.logo-container h1 svg{fill:#fff;height:42px;margin-right:10px}.logo-container h1 a{display:flex;justify-content:center;align-items:center;color:#fff;text-decoration:none;outline:0;padding:12px 16px;line-height:32px;font-family:sans-serif,sans-serif;font-weight:500;font-size:14px}.compose-standalone .compose-form{width:400px;margin:0 auto;padding:20px 0;margin-top:40px;box-sizing:border-box}@media screen and (max-width: 400px){.compose-standalone .compose-form{width:100%;margin-top:0;padding:20px}}.account-header{width:400px;margin:0 auto;display:flex;font-size:13px;line-height:18px;box-sizing:border-box;padding:20px 0;padding-bottom:0;margin-bottom:-30px;margin-top:40px}@media screen and (max-width: 440px){.account-header{width:100%;margin:0;margin-bottom:10px;padding:20px;padding-bottom:0}}.account-header .avatar{width:40px;height:40px;width:40px;height:40px;background-size:40px 40px;margin-right:8px}.account-header .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px;border-radius:8%;background-position:50%;background-clip:padding-box}.account-header .name{flex:1 1 auto;color:#ecf0f4;width:calc(100% - 88px)}.account-header .name .username{display:block;font-weight:500;text-overflow:ellipsis;overflow:hidden}.account-header .logout-link{display:block;font-size:32px;line-height:40px;margin-left:8px}.grid-3{display:grid;grid-gap:10px;grid-template-columns:3fr 1fr;grid-auto-columns:25%;grid-auto-rows:max-content}.grid-3 .column-0{grid-column:1/3;grid-row:1}.grid-3 .column-1{grid-column:1;grid-row:2}.grid-3 .column-2{grid-column:2;grid-row:2}.grid-3 .column-3{grid-column:1/3;grid-row:3}@media screen and (max-width: 415px){.grid-3{grid-gap:0;grid-template-columns:minmax(0, 100%)}.grid-3 .column-0{grid-column:1}.grid-3 .column-1{grid-column:1;grid-row:3}.grid-3 .column-2{grid-column:1;grid-row:2}.grid-3 .column-3{grid-column:1;grid-row:4}}.grid-4{display:grid;grid-gap:10px;grid-template-columns:repeat(4, minmax(0, 1fr));grid-auto-columns:25%;grid-auto-rows:max-content}.grid-4 .column-0{grid-column:1/5;grid-row:1}.grid-4 .column-1{grid-column:1/4;grid-row:2}.grid-4 .column-2{grid-column:4;grid-row:2}.grid-4 .column-3{grid-column:2/5;grid-row:3}.grid-4 .column-4{grid-column:1;grid-row:3}.grid-4 .landing-page__call-to-action{min-height:100%}.grid-4 .flash-message{margin-bottom:10px}@media screen and (max-width: 738px){.grid-4{grid-template-columns:minmax(0, 50%) minmax(0, 50%)}.grid-4 .landing-page__call-to-action{padding:20px;display:flex;align-items:center;justify-content:center}.grid-4 .row__information-board{width:100%;justify-content:center;align-items:center}.grid-4 .row__mascot{display:none}}@media screen and (max-width: 415px){.grid-4{grid-gap:0;grid-template-columns:minmax(0, 100%)}.grid-4 .column-0{grid-column:1}.grid-4 .column-1{grid-column:1;grid-row:3}.grid-4 .column-2{grid-column:1;grid-row:2}.grid-4 .column-3{grid-column:1;grid-row:5}.grid-4 .column-4{grid-column:1;grid-row:4}}@media screen and (max-width: 415px){.public-layout{padding-top:48px}}.public-layout .container{max-width:960px}@media screen and (max-width: 415px){.public-layout .container{padding:0}}.public-layout .header{background:#393f4f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;height:48px;margin:10px 0;display:flex;align-items:stretch;justify-content:center;flex-wrap:nowrap;overflow:hidden}@media screen and (max-width: 415px){.public-layout .header{position:fixed;width:100%;top:0;left:0;margin:0;border-radius:0;box-shadow:none;z-index:110}}.public-layout .header>div{flex:1 1 33.3%;min-height:1px}.public-layout .header .nav-left{display:flex;align-items:stretch;justify-content:flex-start;flex-wrap:nowrap}.public-layout .header .nav-center{display:flex;align-items:stretch;justify-content:center;flex-wrap:nowrap}.public-layout .header .nav-right{display:flex;align-items:stretch;justify-content:flex-end;flex-wrap:nowrap}.public-layout .header .brand{display:block;padding:15px}.public-layout .header .brand svg{display:block;height:18px;width:auto;position:relative;bottom:-2px;fill:#fff}@media screen and (max-width: 415px){.public-layout .header .brand svg{height:20px}}.public-layout .header .brand:hover,.public-layout .header .brand:focus,.public-layout .header .brand:active{background:#42485a}.public-layout .header .nav-link{display:flex;align-items:center;padding:0 1rem;font-size:12px;font-weight:500;text-decoration:none;color:#dde3ec;white-space:nowrap;text-align:center}.public-layout .header .nav-link:hover,.public-layout .header .nav-link:focus,.public-layout .header .nav-link:active{text-decoration:underline;color:#fff}@media screen and (max-width: 550px){.public-layout .header .nav-link.optional{display:none}}.public-layout .header .nav-button{background:#4a5266;margin:8px;margin-left:0;border-radius:4px}.public-layout .header .nav-button:hover,.public-layout .header .nav-button:focus,.public-layout .header .nav-button:active{text-decoration:none;background:#535b72}.public-layout .grid{display:grid;grid-gap:10px;grid-template-columns:minmax(300px, 3fr) minmax(298px, 1fr);grid-auto-columns:25%;grid-auto-rows:max-content}.public-layout .grid .column-0{grid-row:1;grid-column:1}.public-layout .grid .column-1{grid-row:1;grid-column:2}@media screen and (max-width: 600px){.public-layout .grid{grid-template-columns:100%;grid-gap:0}.public-layout .grid .column-1{display:none}}.public-layout .directory__card{border-radius:4px}@media screen and (max-width: 415px){.public-layout .directory__card{border-radius:0}}@media screen and (max-width: 415px){.public-layout .page-header{border-bottom:0}}.public-layout .public-account-header{overflow:hidden;margin-bottom:10px;box-shadow:0 0 15px rgba(0,0,0,.2)}.public-layout .public-account-header.inactive{opacity:.5}.public-layout .public-account-header.inactive .public-account-header__image,.public-layout .public-account-header.inactive .avatar{filter:grayscale(100%)}.public-layout .public-account-header.inactive .logo-button{background-color:#ecf0f4}.public-layout .public-account-header__image{border-radius:4px 4px 0 0;overflow:hidden;height:300px;position:relative;background:#0e1014}.public-layout .public-account-header__image::after{content:\"\";display:block;position:absolute;width:100%;height:100%;box-shadow:inset 0 -1px 1px 1px rgba(0,0,0,.15);top:0;left:0}.public-layout .public-account-header__image img{object-fit:cover;display:block;width:100%;height:100%;margin:0;border-radius:4px 4px 0 0}@media screen and (max-width: 600px){.public-layout .public-account-header__image{height:200px}}.public-layout .public-account-header--no-bar{margin-bottom:0}.public-layout .public-account-header--no-bar .public-account-header__image,.public-layout .public-account-header--no-bar .public-account-header__image img{border-radius:4px}@media screen and (max-width: 415px){.public-layout .public-account-header--no-bar .public-account-header__image,.public-layout .public-account-header--no-bar .public-account-header__image img{border-radius:0}}@media screen and (max-width: 415px){.public-layout .public-account-header{margin-bottom:0;box-shadow:none}.public-layout .public-account-header__image::after{display:none}.public-layout .public-account-header__image,.public-layout .public-account-header__image img{border-radius:0}}.public-layout .public-account-header__bar{position:relative;margin-top:-80px;display:flex;justify-content:flex-start}.public-layout .public-account-header__bar::before{content:\"\";display:block;background:#313543;position:absolute;bottom:0;left:0;right:0;height:60px;border-radius:0 0 4px 4px;z-index:-1}.public-layout .public-account-header__bar .avatar{display:block;width:120px;height:120px;width:120px;height:120px;background-size:120px 120px;padding-left:16px;flex:0 0 auto}.public-layout .public-account-header__bar .avatar img{display:block;width:100%;height:100%;margin:0;border-radius:50%;border:4px solid #313543;background:#17191f;border-radius:8%;background-position:50%;background-clip:padding-box}@media screen and (max-width: 600px){.public-layout .public-account-header__bar{margin-top:0;background:#313543;border-radius:0 0 4px 4px;padding:5px}.public-layout .public-account-header__bar::before{display:none}.public-layout .public-account-header__bar .avatar{width:48px;height:48px;width:48px;height:48px;background-size:48px 48px;padding:7px 0;padding-left:10px}.public-layout .public-account-header__bar .avatar img{border:0;border-radius:4px;border-radius:8%;background-position:50%;background-clip:padding-box}}@media screen and (max-width: 600px)and (max-width: 360px){.public-layout .public-account-header__bar .avatar{display:none}}@media screen and (max-width: 415px){.public-layout .public-account-header__bar{border-radius:0}}@media screen and (max-width: 600px){.public-layout .public-account-header__bar{flex-wrap:wrap}}.public-layout .public-account-header__tabs{flex:1 1 auto;margin-left:20px}.public-layout .public-account-header__tabs__name{padding-top:20px;padding-bottom:8px}.public-layout .public-account-header__tabs__name h1{font-size:20px;line-height:27px;color:#fff;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-shadow:1px 1px 1px #000}.public-layout .public-account-header__tabs__name h1 small{display:block;font-size:14px;color:#fff;font-weight:400;overflow:hidden;text-overflow:ellipsis}@media screen and (max-width: 600px){.public-layout .public-account-header__tabs{margin-left:15px;display:flex;justify-content:space-between;align-items:center}.public-layout .public-account-header__tabs__name{padding-top:0;padding-bottom:0}.public-layout .public-account-header__tabs__name h1{font-size:16px;line-height:24px;text-shadow:none}.public-layout .public-account-header__tabs__name h1 small{color:#dde3ec}}.public-layout .public-account-header__tabs__tabs{display:flex;justify-content:flex-start;align-items:stretch;height:58px}.public-layout .public-account-header__tabs__tabs .details-counters{display:flex;flex-direction:row;min-width:300px}@media screen and (max-width: 600px){.public-layout .public-account-header__tabs__tabs .details-counters{display:none}}.public-layout .public-account-header__tabs__tabs .counter{min-width:33.3%;box-sizing:border-box;flex:0 0 auto;color:#dde3ec;padding:10px;border-right:1px solid #313543;cursor:default;text-align:center;position:relative}.public-layout .public-account-header__tabs__tabs .counter a{display:block}.public-layout .public-account-header__tabs__tabs .counter:last-child{border-right:0}.public-layout .public-account-header__tabs__tabs .counter::after{display:block;content:\"\";position:absolute;bottom:0;left:0;width:100%;border-bottom:4px solid #9baec8;opacity:.5;transition:all 400ms ease}.public-layout .public-account-header__tabs__tabs .counter.active::after{border-bottom:4px solid #2b90d9;opacity:1}.public-layout .public-account-header__tabs__tabs .counter.active.inactive::after{border-bottom-color:#ecf0f4}.public-layout .public-account-header__tabs__tabs .counter:hover::after{opacity:1;transition-duration:100ms}.public-layout .public-account-header__tabs__tabs .counter a{text-decoration:none;color:inherit}.public-layout .public-account-header__tabs__tabs .counter .counter-label{font-size:12px;display:block}.public-layout .public-account-header__tabs__tabs .counter .counter-number{font-weight:500;font-size:18px;margin-bottom:5px;color:#fff;font-family:sans-serif,sans-serif}.public-layout .public-account-header__tabs__tabs .spacer{flex:1 1 auto;height:1px}.public-layout .public-account-header__tabs__tabs__buttons{padding:7px 8px}.public-layout .public-account-header__extra{display:none;margin-top:4px}.public-layout .public-account-header__extra .public-account-bio{border-radius:0;box-shadow:none;background:transparent;margin:0 -5px}.public-layout .public-account-header__extra .public-account-bio .account__header__fields{border-top:1px solid #42485a}.public-layout .public-account-header__extra .public-account-bio .roles{display:none}.public-layout .public-account-header__extra__links{margin-top:-15px;font-size:14px;color:#dde3ec}.public-layout .public-account-header__extra__links a{display:inline-block;color:#dde3ec;text-decoration:none;padding:15px;font-weight:500}.public-layout .public-account-header__extra__links a strong{font-weight:700;color:#fff}@media screen and (max-width: 600px){.public-layout .public-account-header__extra{display:block;flex:100%}}.public-layout .account__section-headline{border-radius:4px 4px 0 0}@media screen and (max-width: 415px){.public-layout .account__section-headline{border-radius:0}}.public-layout .detailed-status__meta{margin-top:25px}.public-layout .public-account-bio{background:#393f4f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;overflow:hidden;margin-bottom:10px}@media screen and (max-width: 415px){.public-layout .public-account-bio{box-shadow:none;margin-bottom:0;border-radius:0}}.public-layout .public-account-bio .account__header__fields{margin:0;border-top:0}.public-layout .public-account-bio .account__header__fields a{color:#4e79df}.public-layout .public-account-bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.public-layout .public-account-bio .account__header__fields .verified a{color:#79bd9a}.public-layout .public-account-bio .account__header__content{padding:20px;padding-bottom:0;color:#fff}.public-layout .public-account-bio__extra,.public-layout .public-account-bio .roles{padding:20px;font-size:14px;color:#dde3ec}.public-layout .public-account-bio .roles{padding-bottom:0}.public-layout .directory__list{display:grid;grid-gap:10px;grid-template-columns:minmax(0, 50%) minmax(0, 50%)}@media screen and (max-width: 415px){.public-layout .directory__list{display:block}}.public-layout .directory__list .icon-button{font-size:18px}.public-layout .directory__card{margin-bottom:0}.public-layout .card-grid{display:flex;flex-wrap:wrap;min-width:100%;margin:0 -5px}.public-layout .card-grid>div{box-sizing:border-box;flex:1 0 auto;width:300px;padding:0 5px;margin-bottom:10px;max-width:33.333%}@media screen and (max-width: 900px){.public-layout .card-grid>div{max-width:50%}}@media screen and (max-width: 600px){.public-layout .card-grid>div{max-width:100%}}@media screen and (max-width: 415px){.public-layout .card-grid{margin:0;border-top:1px solid #393f4f}.public-layout .card-grid>div{width:100%;padding:0;margin-bottom:0;border-bottom:1px solid #393f4f}.public-layout .card-grid>div:last-child{border-bottom:0}.public-layout .card-grid>div .card__bar{background:#282c37}.public-layout .card-grid>div .card__bar:hover,.public-layout .card-grid>div .card__bar:active,.public-layout .card-grid>div .card__bar:focus{background:#313543}}.no-list{list-style:none}.no-list li{display:inline-block;margin:0 5px}.recovery-codes{list-style:none;margin:0 auto}.recovery-codes li{font-size:125%;line-height:1.5;letter-spacing:1px}.modal-layout{background:#282c37 url('data:image/svg+xml;utf8,') repeat-x bottom fixed;display:flex;flex-direction:column;height:100vh;padding:0}.modal-layout__mastodon{display:flex;flex:1;flex-direction:column;justify-content:flex-end}.modal-layout__mastodon>*{flex:1;max-height:235px}@media screen and (max-width: 600px){.account-header{margin-top:0}}.public-layout .footer{text-align:left;padding-top:20px;padding-bottom:60px;font-size:12px;color:#737d99}@media screen and (max-width: 415px){.public-layout .footer{padding-left:20px;padding-right:20px}}.public-layout .footer .grid{display:grid;grid-gap:10px;grid-template-columns:1fr 1fr 2fr 1fr 1fr}.public-layout .footer .grid .column-0{grid-column:1;grid-row:1;min-width:0}.public-layout .footer .grid .column-1{grid-column:2;grid-row:1;min-width:0}.public-layout .footer .grid .column-2{grid-column:3;grid-row:1;min-width:0;text-align:center}.public-layout .footer .grid .column-2 h4 a{color:#737d99}.public-layout .footer .grid .column-3{grid-column:4;grid-row:1;min-width:0}.public-layout .footer .grid .column-4{grid-column:5;grid-row:1;min-width:0}@media screen and (max-width: 690px){.public-layout .footer .grid{grid-template-columns:1fr 2fr 1fr}.public-layout .footer .grid .column-0,.public-layout .footer .grid .column-1{grid-column:1}.public-layout .footer .grid .column-1{grid-row:2}.public-layout .footer .grid .column-2{grid-column:2}.public-layout .footer .grid .column-3,.public-layout .footer .grid .column-4{grid-column:3}.public-layout .footer .grid .column-4{grid-row:2}}@media screen and (max-width: 600px){.public-layout .footer .grid .column-1{display:block}}@media screen and (max-width: 415px){.public-layout .footer .grid .column-0,.public-layout .footer .grid .column-1,.public-layout .footer .grid .column-3,.public-layout .footer .grid .column-4{display:none}}.public-layout .footer h4{text-transform:uppercase;font-weight:700;margin-bottom:8px;color:#dde3ec}.public-layout .footer h4 a{color:inherit;text-decoration:none}.public-layout .footer ul a{text-decoration:none;color:#737d99}.public-layout .footer ul a:hover,.public-layout .footer ul a:active,.public-layout .footer ul a:focus{text-decoration:underline}.public-layout .footer .brand svg{display:block;height:36px;width:auto;margin:0 auto;fill:#737d99}.public-layout .footer .brand:hover svg,.public-layout .footer .brand:focus svg,.public-layout .footer .brand:active svg{fill:#7f88a2}.compact-header h1{font-size:24px;line-height:28px;color:#dde3ec;font-weight:500;margin-bottom:20px;padding:0 10px;word-wrap:break-word}@media screen and (max-width: 740px){.compact-header h1{text-align:center;padding:20px 10px 0}}.compact-header h1 a{color:inherit;text-decoration:none}.compact-header h1 small{font-weight:400;color:#ecf0f4}.compact-header h1 img{display:inline-block;margin-bottom:-5px;margin-right:15px;width:36px;height:36px}.hero-widget{margin-bottom:10px;box-shadow:0 0 15px rgba(0,0,0,.2)}.hero-widget__img{width:100%;position:relative;overflow:hidden;border-radius:4px 4px 0 0;background:#000}.hero-widget__img img{object-fit:cover;display:block;width:100%;height:100%;margin:0;border-radius:4px 4px 0 0}.hero-widget__text{background:#282c37;padding:20px;border-radius:0 0 4px 4px;font-size:15px;color:#dde3ec;line-height:20px;word-wrap:break-word;font-weight:400}.hero-widget__text .emojione{width:20px;height:20px;margin:-3px 0 0}.hero-widget__text p{margin-bottom:20px}.hero-widget__text p:last-child{margin-bottom:0}.hero-widget__text em{display:inline;margin:0;padding:0;font-weight:700;background:transparent;font-family:inherit;font-size:inherit;line-height:inherit;color:#fefefe}.hero-widget__text a{color:#ecf0f4;text-decoration:none}.hero-widget__text a:hover{text-decoration:underline}@media screen and (max-width: 415px){.hero-widget{display:none}}.endorsements-widget{margin-bottom:10px;padding-bottom:10px}.endorsements-widget h4{padding:10px;text-transform:uppercase;font-weight:700;font-size:13px;color:#dde3ec}.endorsements-widget .account{padding:10px 0}.endorsements-widget .account:last-child{border-bottom:0}.endorsements-widget .account .account__display-name{display:flex;align-items:center}.endorsements-widget .account .account__avatar{width:44px;height:44px;background-size:44px 44px}.endorsements-widget .trends__item{padding:10px}.trends-widget h4{color:#dde3ec}.box-widget{padding:20px;border-radius:4px;background:#282c37;box-shadow:0 0 15px rgba(0,0,0,.2)}.placeholder-widget{padding:16px;border-radius:4px;border:2px dashed #c2cede;text-align:center;color:#dde3ec;margin-bottom:10px}.contact-widget{min-height:100%;font-size:15px;color:#dde3ec;line-height:20px;word-wrap:break-word;font-weight:400;padding:0}.contact-widget h4{padding:10px;text-transform:uppercase;font-weight:700;font-size:13px;color:#dde3ec}.contact-widget .account{border-bottom:0;padding:10px 0;padding-top:5px}.contact-widget>a{display:inline-block;padding:10px;padding-top:0;color:#dde3ec;text-decoration:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.contact-widget>a:hover,.contact-widget>a:focus,.contact-widget>a:active{text-decoration:underline}.moved-account-widget{padding:15px;padding-bottom:20px;border-radius:4px;background:#282c37;box-shadow:0 0 15px rgba(0,0,0,.2);color:#ecf0f4;font-weight:400;margin-bottom:10px}.moved-account-widget strong,.moved-account-widget a{font-weight:500}.moved-account-widget strong:lang(ja),.moved-account-widget a:lang(ja){font-weight:700}.moved-account-widget strong:lang(ko),.moved-account-widget a:lang(ko){font-weight:700}.moved-account-widget strong:lang(zh-CN),.moved-account-widget a:lang(zh-CN){font-weight:700}.moved-account-widget strong:lang(zh-HK),.moved-account-widget a:lang(zh-HK){font-weight:700}.moved-account-widget strong:lang(zh-TW),.moved-account-widget a:lang(zh-TW){font-weight:700}.moved-account-widget a{color:inherit;text-decoration:underline}.moved-account-widget a.mention{text-decoration:none}.moved-account-widget a.mention span{text-decoration:none}.moved-account-widget a.mention:focus,.moved-account-widget a.mention:hover,.moved-account-widget a.mention:active{text-decoration:none}.moved-account-widget a.mention:focus span,.moved-account-widget a.mention:hover span,.moved-account-widget a.mention:active span{text-decoration:underline}.moved-account-widget__message{margin-bottom:15px}.moved-account-widget__message .fa{margin-right:5px;color:#dde3ec}.moved-account-widget__card .detailed-status__display-avatar{position:relative;cursor:pointer}.moved-account-widget__card .detailed-status__display-name{margin-bottom:0;text-decoration:none}.moved-account-widget__card .detailed-status__display-name span{font-weight:400}.memoriam-widget{padding:20px;border-radius:4px;background:#000;box-shadow:0 0 15px rgba(0,0,0,.2);font-size:14px;color:#dde3ec;margin-bottom:10px}.page-header{background:#393f4f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;padding:60px 15px;text-align:center;margin:10px 0}.page-header h1{color:#fff;font-size:36px;line-height:1.1;font-weight:700;margin-bottom:10px}.page-header p{font-size:15px;color:#dde3ec}@media screen and (max-width: 415px){.page-header{margin-top:0;background:#313543}.page-header h1{font-size:24px}}.directory{background:#282c37;border-radius:4px;box-shadow:0 0 15px rgba(0,0,0,.2)}.directory__tag{box-sizing:border-box;margin-bottom:10px}.directory__tag>a,.directory__tag>div{display:flex;align-items:center;justify-content:space-between;background:#282c37;border-radius:4px;padding:15px;text-decoration:none;color:inherit;box-shadow:0 0 15px rgba(0,0,0,.2)}.directory__tag>a:hover,.directory__tag>a:active,.directory__tag>a:focus{background:#393f4f}.directory__tag.active>a{background:#2b5fd9;cursor:default}.directory__tag.disabled>div{opacity:.5;cursor:default}.directory__tag h4{flex:1 1 auto;font-size:18px;font-weight:700;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.directory__tag h4 .fa{color:#dde3ec}.directory__tag h4 small{display:block;font-weight:400;font-size:15px;margin-top:8px;color:#dde3ec}.directory__tag.active h4,.directory__tag.active h4 .fa,.directory__tag.active h4 small{color:#fff}.directory__tag .avatar-stack{flex:0 0 auto;width:120px}.directory__tag.active .avatar-stack .account__avatar{border-color:#2b5fd9}.avatar-stack{display:flex;justify-content:flex-end}.avatar-stack .account__avatar{flex:0 0 auto;width:36px;height:36px;border-radius:50%;position:relative;margin-left:-10px;background:#17191f;border:2px solid #282c37}.avatar-stack .account__avatar:nth-child(1){z-index:1}.avatar-stack .account__avatar:nth-child(2){z-index:2}.avatar-stack .account__avatar:nth-child(3){z-index:3}.accounts-table{width:100%}.accounts-table .account{padding:0;border:0}.accounts-table strong{font-weight:700}.accounts-table thead th{text-align:center;text-transform:uppercase;color:#dde3ec;font-weight:700;padding:10px}.accounts-table thead th:first-child{text-align:left}.accounts-table tbody td{padding:15px 0;vertical-align:middle;border-bottom:1px solid #393f4f}.accounts-table tbody tr:last-child td{border-bottom:0}.accounts-table__count{width:120px;text-align:center;font-size:15px;font-weight:500;color:#fff}.accounts-table__count small{display:block;color:#dde3ec;font-weight:400;font-size:14px}.accounts-table__comment{width:50%;vertical-align:initial !important}@media screen and (max-width: 415px){.accounts-table tbody td.optional{display:none}}@media screen and (max-width: 415px){.moved-account-widget,.memoriam-widget,.box-widget,.contact-widget,.landing-page__information.contact-widget,.directory,.page-header{margin-bottom:0;box-shadow:none;border-radius:0}}.statuses-grid{min-height:600px}@media screen and (max-width: 640px){.statuses-grid{width:100% !important}}.statuses-grid__item{width:313.3333333333px}@media screen and (max-width: 1255px){.statuses-grid__item{width:306.6666666667px}}@media screen and (max-width: 640px){.statuses-grid__item{width:100%}}@media screen and (max-width: 415px){.statuses-grid__item{width:100vw}}.statuses-grid .detailed-status{border-radius:4px}@media screen and (max-width: 415px){.statuses-grid .detailed-status{border-top:1px solid #4a5266}}.statuses-grid .detailed-status.compact .detailed-status__meta{margin-top:15px}.statuses-grid .detailed-status.compact .status__content{font-size:15px;line-height:20px}.statuses-grid .detailed-status.compact .status__content .emojione{width:20px;height:20px;margin:-3px 0 0}.statuses-grid .detailed-status.compact .status__content .status__content__spoiler-link{line-height:20px;margin:0}.statuses-grid .detailed-status.compact .media-gallery,.statuses-grid .detailed-status.compact .status-card,.statuses-grid .detailed-status.compact .video-player{margin-top:15px}.notice-widget{margin-bottom:10px;color:#dde3ec}.notice-widget p{margin-bottom:10px}.notice-widget p:last-child{margin-bottom:0}.notice-widget a{font-size:14px;line-height:20px}.notice-widget a,.placeholder-widget a{text-decoration:none;font-weight:500;color:#2b5fd9}.notice-widget a:hover,.notice-widget a:focus,.notice-widget a:active,.placeholder-widget a:hover,.placeholder-widget a:focus,.placeholder-widget a:active{text-decoration:underline}.table-of-contents{background:#1f232b;min-height:100%;font-size:14px;border-radius:4px}.table-of-contents li a{display:block;font-weight:500;padding:15px;overflow:hidden;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-decoration:none;color:#fff;border-bottom:1px solid #313543}.table-of-contents li a:hover,.table-of-contents li a:focus,.table-of-contents li a:active{text-decoration:underline}.table-of-contents li:last-child a{border-bottom:0}.table-of-contents li ul{padding-left:20px;border-bottom:1px solid #313543}code{font-family:monospace,monospace;font-weight:400}.form-container{max-width:400px;padding:20px;margin:0 auto}.simple_form .input{margin-bottom:15px;overflow:hidden}.simple_form .input.hidden{margin:0}.simple_form .input.radio_buttons .radio{margin-bottom:15px}.simple_form .input.radio_buttons .radio:last-child{margin-bottom:0}.simple_form .input.radio_buttons .radio>label{position:relative;padding-left:28px}.simple_form .input.radio_buttons .radio>label input{position:absolute;top:-2px;left:0}.simple_form .input.boolean{position:relative;margin-bottom:0}.simple_form .input.boolean .label_input>label{font-family:inherit;font-size:14px;padding-top:5px;color:#fff;display:block;width:auto}.simple_form .input.boolean .label_input,.simple_form .input.boolean .hint{padding-left:28px}.simple_form .input.boolean .label_input__wrapper{position:static}.simple_form .input.boolean label.checkbox{position:absolute;top:2px;left:0}.simple_form .input.boolean label a{color:#2b90d9;text-decoration:underline}.simple_form .input.boolean label a:hover,.simple_form .input.boolean label a:active,.simple_form .input.boolean label a:focus{text-decoration:none}.simple_form .input.boolean .recommended{position:absolute;margin:0 4px;margin-top:-2px}.simple_form .row{display:flex;margin:0 -5px}.simple_form .row .input{box-sizing:border-box;flex:1 1 auto;width:50%;padding:0 5px}.simple_form .hint{color:#dde3ec}.simple_form .hint a{color:#2b90d9}.simple_form .hint code{border-radius:3px;padding:.2em .4em;background:#0e1014}.simple_form span.hint{display:block;font-size:12px;margin-top:4px}.simple_form p.hint{margin-bottom:15px;color:#dde3ec}.simple_form p.hint.subtle-hint{text-align:center;font-size:12px;line-height:18px;margin-top:15px;margin-bottom:0}.simple_form .card{margin-bottom:15px}.simple_form strong{font-weight:500}.simple_form strong:lang(ja){font-weight:700}.simple_form strong:lang(ko){font-weight:700}.simple_form strong:lang(zh-CN){font-weight:700}.simple_form strong:lang(zh-HK){font-weight:700}.simple_form strong:lang(zh-TW){font-weight:700}.simple_form .input.with_floating_label .label_input{display:flex}.simple_form .input.with_floating_label .label_input>label{font-family:inherit;font-size:14px;color:#fff;font-weight:500;min-width:150px;flex:0 0 auto}.simple_form .input.with_floating_label .label_input input,.simple_form .input.with_floating_label .label_input select{flex:1 1 auto}.simple_form .input.with_floating_label.select .hint{margin-top:6px;margin-left:150px}.simple_form .input.with_label .label_input>label{font-family:inherit;font-size:14px;color:#fff;display:block;margin-bottom:8px;word-wrap:break-word;font-weight:500}.simple_form .input.with_label .hint{margin-top:6px}.simple_form .input.with_label ul{flex:390px}.simple_form .input.with_block_label{max-width:none}.simple_form .input.with_block_label>label{font-family:inherit;font-size:16px;color:#fff;display:block;font-weight:500;padding-top:5px}.simple_form .input.with_block_label .hint{margin-bottom:15px}.simple_form .input.with_block_label ul{columns:2}.simple_form .input.datetime .label_input select{display:inline-block;width:auto;flex:0}.simple_form .required abbr{text-decoration:none;color:#e87487}.simple_form .fields-group{margin-bottom:25px}.simple_form .fields-group .input:last-child{margin-bottom:0}.simple_form .fields-row{display:flex;margin:0 -10px;padding-top:5px;margin-bottom:25px}.simple_form .fields-row .input{max-width:none}.simple_form .fields-row__column{box-sizing:border-box;padding:0 10px;flex:1 1 auto;min-height:1px}.simple_form .fields-row__column-6{max-width:50%}.simple_form .fields-row__column .actions{margin-top:27px}.simple_form .fields-row .fields-group:last-child,.simple_form .fields-row .fields-row__column.fields-group{margin-bottom:0}@media screen and (max-width: 600px){.simple_form .fields-row{display:block;margin-bottom:0}.simple_form .fields-row__column{max-width:none}.simple_form .fields-row .fields-group:last-child,.simple_form .fields-row .fields-row__column.fields-group,.simple_form .fields-row .fields-row__column{margin-bottom:25px}}.simple_form .input.radio_buttons .radio label{margin-bottom:5px;font-family:inherit;font-size:14px;color:#fff;display:block;width:auto}.simple_form .check_boxes .checkbox label{font-family:inherit;font-size:14px;color:#fff;display:inline-block;width:auto;position:relative;padding-top:5px;padding-left:25px;flex:1 1 auto}.simple_form .check_boxes .checkbox input[type=checkbox]{position:absolute;left:0;top:5px;margin:0}.simple_form .input.static .label_input__wrapper{font-size:16px;padding:10px;border:1px solid #c2cede;border-radius:4px}.simple_form input[type=text],.simple_form input[type=number],.simple_form input[type=email],.simple_form input[type=password],.simple_form textarea{box-sizing:border-box;font-size:16px;color:#fff;display:block;width:100%;outline:0;font-family:inherit;resize:vertical;background:#131419;border:1px solid #0a0b0e;border-radius:4px;padding:10px}.simple_form input[type=text]::placeholder,.simple_form input[type=number]::placeholder,.simple_form input[type=email]::placeholder,.simple_form input[type=password]::placeholder,.simple_form textarea::placeholder{color:#eaeef3}.simple_form input[type=text]:invalid,.simple_form input[type=number]:invalid,.simple_form input[type=email]:invalid,.simple_form input[type=password]:invalid,.simple_form textarea:invalid{box-shadow:none}.simple_form input[type=text]:focus:invalid:not(:placeholder-shown),.simple_form input[type=number]:focus:invalid:not(:placeholder-shown),.simple_form input[type=email]:focus:invalid:not(:placeholder-shown),.simple_form input[type=password]:focus:invalid:not(:placeholder-shown),.simple_form textarea:focus:invalid:not(:placeholder-shown){border-color:#e87487}.simple_form input[type=text]:required:valid,.simple_form input[type=number]:required:valid,.simple_form input[type=email]:required:valid,.simple_form input[type=password]:required:valid,.simple_form textarea:required:valid{border-color:#79bd9a}.simple_form input[type=text]:hover,.simple_form input[type=number]:hover,.simple_form input[type=email]:hover,.simple_form input[type=password]:hover,.simple_form textarea:hover{border-color:#000}.simple_form input[type=text]:active,.simple_form input[type=text]:focus,.simple_form input[type=number]:active,.simple_form input[type=number]:focus,.simple_form input[type=email]:active,.simple_form input[type=email]:focus,.simple_form input[type=password]:active,.simple_form input[type=password]:focus,.simple_form textarea:active,.simple_form textarea:focus{border-color:#2b90d9;background:#17191f}.simple_form .input.field_with_errors label{color:#e87487}.simple_form .input.field_with_errors input[type=text],.simple_form .input.field_with_errors input[type=number],.simple_form .input.field_with_errors input[type=email],.simple_form .input.field_with_errors input[type=password],.simple_form .input.field_with_errors textarea,.simple_form .input.field_with_errors select{border-color:#e87487}.simple_form .input.field_with_errors .error{display:block;font-weight:500;color:#e87487;margin-top:4px}.simple_form .input.disabled{opacity:.5}.simple_form .actions{margin-top:30px;display:flex}.simple_form .actions.actions--top{margin-top:0;margin-bottom:30px}.simple_form button,.simple_form .button,.simple_form .block-button{display:block;width:100%;border:0;border-radius:4px;background:#2b5fd9;color:#fff;font-size:18px;line-height:inherit;height:auto;padding:10px;text-transform:uppercase;text-decoration:none;text-align:center;box-sizing:border-box;cursor:pointer;font-weight:500;outline:0;margin-bottom:10px;margin-right:10px}.simple_form button:last-child,.simple_form .button:last-child,.simple_form .block-button:last-child{margin-right:0}.simple_form button:hover,.simple_form .button:hover,.simple_form .block-button:hover{background-color:#416fdd}.simple_form button:active,.simple_form button:focus,.simple_form .button:active,.simple_form .button:focus,.simple_form .block-button:active,.simple_form .block-button:focus{background-color:#2454c7}.simple_form button:disabled:hover,.simple_form .button:disabled:hover,.simple_form .block-button:disabled:hover{background-color:#9baec8}.simple_form button.negative,.simple_form .button.negative,.simple_form .block-button.negative{background:#df405a}.simple_form button.negative:hover,.simple_form .button.negative:hover,.simple_form .block-button.negative:hover{background-color:#e3566d}.simple_form button.negative:active,.simple_form button.negative:focus,.simple_form .button.negative:active,.simple_form .button.negative:focus,.simple_form .block-button.negative:active,.simple_form .block-button.negative:focus{background-color:#db2a47}.simple_form select{appearance:none;box-sizing:border-box;font-size:16px;color:#fff;display:block;width:100%;outline:0;font-family:inherit;resize:vertical;background:#131419 url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center/auto 16px;border:1px solid #0a0b0e;border-radius:4px;padding-left:10px;padding-right:30px;height:41px}.simple_form h4{margin-bottom:15px !important}.simple_form .label_input__wrapper{position:relative}.simple_form .label_input__append{position:absolute;right:3px;top:1px;padding:10px;padding-bottom:9px;font-size:16px;color:#c2cede;font-family:inherit;pointer-events:none;cursor:default;max-width:140px;white-space:nowrap;overflow:hidden}.simple_form .label_input__append::after{content:\"\";display:block;position:absolute;top:0;right:0;bottom:1px;width:5px;background-image:linear-gradient(to right, rgba(19, 20, 25, 0), #131419)}.simple_form__overlay-area{position:relative}.simple_form__overlay-area__blurred form{filter:blur(2px)}.simple_form__overlay-area__overlay{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;background:rgba(40,44,55,.65);border-radius:4px;margin-left:-4px;margin-top:-4px;padding:4px}.simple_form__overlay-area__overlay__content{text-align:center}.simple_form__overlay-area__overlay__content.rich-formatting,.simple_form__overlay-area__overlay__content.rich-formatting p{color:#fff}.block-icon{display:block;margin:0 auto;margin-bottom:10px;font-size:24px}.flash-message{background:#393f4f;color:#dde3ec;border-radius:4px;padding:15px 10px;margin-bottom:30px;text-align:center}.flash-message.notice{border:1px solid rgba(121,189,154,.5);background:rgba(121,189,154,.25);color:#79bd9a}.flash-message.alert{border:1px solid rgba(223,64,90,.5);background:rgba(223,64,90,.25);color:#df405a}.flash-message a{display:inline-block;color:#dde3ec;text-decoration:none}.flash-message a:hover{color:#fff;text-decoration:underline}.flash-message p{margin-bottom:15px}.flash-message .oauth-code{outline:0;box-sizing:border-box;display:block;width:100%;border:none;padding:10px;font-family:monospace,monospace;background:#282c37;color:#fff;font-size:14px;margin:0}.flash-message .oauth-code::-moz-focus-inner{border:0}.flash-message .oauth-code::-moz-focus-inner,.flash-message .oauth-code:focus,.flash-message .oauth-code:active{outline:0 !important}.flash-message .oauth-code:focus{background:#313543}.flash-message strong{font-weight:500}.flash-message strong:lang(ja){font-weight:700}.flash-message strong:lang(ko){font-weight:700}.flash-message strong:lang(zh-CN){font-weight:700}.flash-message strong:lang(zh-HK){font-weight:700}.flash-message strong:lang(zh-TW){font-weight:700}@media screen and (max-width: 740px)and (min-width: 441px){.flash-message{margin-top:40px}}.form-footer{margin-top:30px;text-align:center}.form-footer a{color:#dde3ec;text-decoration:none}.form-footer a:hover{text-decoration:underline}.quick-nav{list-style:none;margin-bottom:25px;font-size:14px}.quick-nav li{display:inline-block;margin-right:10px}.quick-nav a{color:#2b90d9;text-transform:uppercase;text-decoration:none;font-weight:700}.quick-nav a:hover,.quick-nav a:focus,.quick-nav a:active{color:#4ea2df}.oauth-prompt,.follow-prompt{margin-bottom:30px;color:#dde3ec}.oauth-prompt h2,.follow-prompt h2{font-size:16px;margin-bottom:30px;text-align:center}.oauth-prompt strong,.follow-prompt strong{color:#ecf0f4;font-weight:500}.oauth-prompt strong:lang(ja),.follow-prompt strong:lang(ja){font-weight:700}.oauth-prompt strong:lang(ko),.follow-prompt strong:lang(ko){font-weight:700}.oauth-prompt strong:lang(zh-CN),.follow-prompt strong:lang(zh-CN){font-weight:700}.oauth-prompt strong:lang(zh-HK),.follow-prompt strong:lang(zh-HK){font-weight:700}.oauth-prompt strong:lang(zh-TW),.follow-prompt strong:lang(zh-TW){font-weight:700}@media screen and (max-width: 740px)and (min-width: 441px){.oauth-prompt,.follow-prompt{margin-top:40px}}.qr-wrapper{display:flex;flex-wrap:wrap;align-items:flex-start}.qr-code{flex:0 0 auto;background:#fff;padding:4px;margin:0 10px 20px 0;box-shadow:0 0 15px rgba(0,0,0,.2);display:inline-block}.qr-code svg{display:block;margin:0}.qr-alternative{margin-bottom:20px;color:#ecf0f4;flex:150px}.qr-alternative samp{display:block;font-size:14px}.table-form p{margin-bottom:15px}.table-form p strong{font-weight:500}.table-form p strong:lang(ja){font-weight:700}.table-form p strong:lang(ko){font-weight:700}.table-form p strong:lang(zh-CN){font-weight:700}.table-form p strong:lang(zh-HK){font-weight:700}.table-form p strong:lang(zh-TW){font-weight:700}.simple_form .warning,.table-form .warning{box-sizing:border-box;background:rgba(223,64,90,.5);color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,.3);box-shadow:0 2px 6px rgba(0,0,0,.4);border-radius:4px;padding:10px;margin-bottom:15px}.simple_form .warning a,.table-form .warning a{color:#fff;text-decoration:underline}.simple_form .warning a:hover,.simple_form .warning a:focus,.simple_form .warning a:active,.table-form .warning a:hover,.table-form .warning a:focus,.table-form .warning a:active{text-decoration:none}.simple_form .warning strong,.table-form .warning strong{font-weight:600;display:block;margin-bottom:5px}.simple_form .warning strong:lang(ja),.table-form .warning strong:lang(ja){font-weight:700}.simple_form .warning strong:lang(ko),.table-form .warning strong:lang(ko){font-weight:700}.simple_form .warning strong:lang(zh-CN),.table-form .warning strong:lang(zh-CN){font-weight:700}.simple_form .warning strong:lang(zh-HK),.table-form .warning strong:lang(zh-HK){font-weight:700}.simple_form .warning strong:lang(zh-TW),.table-form .warning strong:lang(zh-TW){font-weight:700}.simple_form .warning strong .fa,.table-form .warning strong .fa{font-weight:400}.action-pagination{display:flex;flex-wrap:wrap;align-items:center}.action-pagination .actions,.action-pagination .pagination{flex:1 1 auto}.action-pagination .actions{padding:30px 0;padding-right:20px;flex:0 0 auto}.post-follow-actions{text-align:center;color:#dde3ec}.post-follow-actions div{margin-bottom:4px}.alternative-login{margin-top:20px;margin-bottom:20px}.alternative-login h4{font-size:16px;color:#fff;text-align:center;margin-bottom:20px;border:0;padding:0}.alternative-login .button{display:block}.scope-danger{color:#ff5050}.form_admin_settings_site_short_description textarea,.form_admin_settings_site_description textarea,.form_admin_settings_site_extended_description textarea,.form_admin_settings_site_terms textarea,.form_admin_settings_custom_css textarea,.form_admin_settings_closed_registrations_message textarea{font-family:monospace,monospace}.input-copy{background:#131419;border:1px solid #0a0b0e;border-radius:4px;display:flex;align-items:center;padding-right:4px;position:relative;top:1px;transition:border-color 300ms linear}.input-copy__wrapper{flex:1 1 auto}.input-copy input[type=text]{background:transparent;border:0;padding:10px;font-size:14px;font-family:monospace,monospace}.input-copy button{flex:0 0 auto;margin:4px;text-transform:none;font-weight:400;font-size:14px;padding:7px 18px;padding-bottom:6px;width:auto;transition:background 300ms linear}.input-copy.copied{border-color:#79bd9a;transition:none}.input-copy.copied button{background:#79bd9a;transition:none}.connection-prompt{margin-bottom:25px}.connection-prompt .fa-link{background-color:#1f232b;border-radius:100%;font-size:24px;padding:10px}.connection-prompt__column{align-items:center;display:flex;flex:1;flex-direction:column;flex-shrink:1;max-width:50%}.connection-prompt__column-sep{align-self:center;flex-grow:0;overflow:visible;position:relative;z-index:1}.connection-prompt__column p{word-break:break-word}.connection-prompt .account__avatar{margin-bottom:20px}.connection-prompt__connection{background-color:#393f4f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;padding:25px 10px;position:relative;text-align:center}.connection-prompt__connection::after{background-color:#1f232b;content:\"\";display:block;height:100%;left:50%;position:absolute;top:0;width:1px}.connection-prompt__row{align-items:flex-start;display:flex;flex-direction:row}.card>a{display:block;text-decoration:none;color:inherit;box-shadow:0 0 15px rgba(0,0,0,.2)}@media screen and (max-width: 415px){.card>a{box-shadow:none}}.card>a:hover .card__bar,.card>a:active .card__bar,.card>a:focus .card__bar{background:#393f4f}.card__img{height:130px;position:relative;background:#0e1014;border-radius:4px 4px 0 0}.card__img img{display:block;width:100%;height:100%;margin:0;object-fit:cover;border-radius:4px 4px 0 0}@media screen and (max-width: 600px){.card__img{height:200px}}@media screen and (max-width: 415px){.card__img{display:none}}.card__bar{position:relative;padding:15px;display:flex;justify-content:flex-start;align-items:center;background:#313543;border-radius:0 0 4px 4px}@media screen and (max-width: 415px){.card__bar{border-radius:0}}.card__bar .avatar{flex:0 0 auto;width:48px;height:48px;width:48px;height:48px;background-size:48px 48px;padding-top:2px}.card__bar .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px;border-radius:8%;background-position:50%;background-clip:padding-box;background:#17191f;object-fit:cover}.card__bar .display-name{margin-left:15px;text-align:left}.card__bar .display-name strong{font-size:15px;color:#fff;font-weight:500;overflow:hidden;text-overflow:ellipsis}.card__bar .display-name span{display:block;font-size:14px;color:#dde3ec;font-weight:400;overflow:hidden;text-overflow:ellipsis}.pagination{padding:30px 0;text-align:center;overflow:hidden}.pagination a,.pagination .current,.pagination .newer,.pagination .older,.pagination .page,.pagination .gap{font-size:14px;color:#fff;font-weight:500;display:inline-block;padding:6px 10px;text-decoration:none}.pagination .current{background:#fff;border-radius:100px;color:#000;cursor:default;margin:0 10px}.pagination .gap{cursor:default}.pagination .older,.pagination .newer{text-transform:uppercase;color:#ecf0f4}.pagination .older{float:left;padding-left:0}.pagination .older .fa{display:inline-block;margin-right:5px}.pagination .newer{float:right;padding-right:0}.pagination .newer .fa{display:inline-block;margin-left:5px}.pagination .disabled{cursor:default;color:#1a1a1a}@media screen and (max-width: 700px){.pagination{padding:30px 20px}.pagination .page{display:none}.pagination .newer,.pagination .older{display:inline-block}}.nothing-here{background:#282c37;box-shadow:0 0 15px rgba(0,0,0,.2);color:#364861;font-size:14px;font-weight:500;text-align:center;display:flex;justify-content:center;align-items:center;cursor:default;border-radius:4px;padding:20px;min-height:30vh}.nothing-here--under-tabs{border-radius:0 0 4px 4px}.nothing-here--flexible{box-sizing:border-box;min-height:100%}.account-role,.simple_form .recommended{display:inline-block;padding:4px 6px;cursor:default;border-radius:3px;font-size:12px;line-height:12px;font-weight:500;color:#d9e1e8;background-color:rgba(217,225,232,.1);border:1px solid rgba(217,225,232,.5)}.account-role.moderator,.simple_form .recommended.moderator{color:#79bd9a;background-color:rgba(121,189,154,.1);border-color:rgba(121,189,154,.5)}.account-role.admin,.simple_form .recommended.admin{color:#e87487;background-color:rgba(232,116,135,.1);border-color:rgba(232,116,135,.5)}.account__header__fields{max-width:100vw;padding:0;margin:15px -15px -15px;border:0 none;border-top:1px solid #42485a;border-bottom:1px solid #42485a;font-size:14px;line-height:20px}.account__header__fields dl{display:flex;border-bottom:1px solid #42485a}.account__header__fields dt,.account__header__fields dd{box-sizing:border-box;padding:14px;text-align:center;max-height:48px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.account__header__fields dt{font-weight:500;width:120px;flex:0 0 auto;color:#ecf0f4;background:rgba(23,25,31,.5)}.account__header__fields dd{flex:1 1 auto;color:#dde3ec}.account__header__fields a{color:#2b90d9;text-decoration:none}.account__header__fields a:hover,.account__header__fields a:focus,.account__header__fields a:active{text-decoration:underline}.account__header__fields .verified{border:1px solid rgba(121,189,154,.5);background:rgba(121,189,154,.25)}.account__header__fields .verified a{color:#79bd9a;font-weight:500}.account__header__fields .verified__mark{color:#79bd9a}.account__header__fields dl:last-child{border-bottom:0}.directory__tag .trends__item__current{width:auto}.pending-account__header{color:#dde3ec}.pending-account__header a{color:#d9e1e8;text-decoration:none}.pending-account__header a:hover,.pending-account__header a:active,.pending-account__header a:focus{text-decoration:underline}.pending-account__header strong{color:#fff;font-weight:700}.pending-account__body{margin-top:10px}.activity-stream{box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;overflow:hidden;margin-bottom:10px}@media screen and (max-width: 415px){.activity-stream{margin-bottom:0;border-radius:0;box-shadow:none}}.activity-stream--headless{border-radius:0;margin:0;box-shadow:none}.activity-stream--headless .detailed-status,.activity-stream--headless .status{border-radius:0 !important}.activity-stream div[data-component]{width:100%}.activity-stream .entry{background:#282c37}.activity-stream .entry .detailed-status,.activity-stream .entry .status,.activity-stream .entry .load-more{animation:none}.activity-stream .entry:last-child .detailed-status,.activity-stream .entry:last-child .status,.activity-stream .entry:last-child .load-more{border-bottom:0;border-radius:0 0 4px 4px}.activity-stream .entry:first-child .detailed-status,.activity-stream .entry:first-child .status,.activity-stream .entry:first-child .load-more{border-radius:4px 4px 0 0}.activity-stream .entry:first-child:last-child .detailed-status,.activity-stream .entry:first-child:last-child .status,.activity-stream .entry:first-child:last-child .load-more{border-radius:4px}@media screen and (max-width: 740px){.activity-stream .entry .detailed-status,.activity-stream .entry .status,.activity-stream .entry .load-more{border-radius:0 !important}}.activity-stream--highlighted .entry{background:#393f4f}.button.logo-button{flex:0 auto;font-size:14px;background:#2b5fd9;color:#fff;text-transform:none;line-height:36px;height:auto;padding:3px 15px;border:0}.button.logo-button svg{width:20px;height:auto;vertical-align:middle;margin-right:5px;fill:#fff}.button.logo-button:active,.button.logo-button:focus,.button.logo-button:hover{background:#5680e1}.button.logo-button:disabled:active,.button.logo-button:disabled:focus,.button.logo-button:disabled:hover,.button.logo-button.disabled:active,.button.logo-button.disabled:focus,.button.logo-button.disabled:hover{background:#9baec8}.button.logo-button.button--destructive:active,.button.logo-button.button--destructive:focus,.button.logo-button.button--destructive:hover{background:#df405a}@media screen and (max-width: 415px){.button.logo-button svg{display:none}}.embed .detailed-status,.public-layout .detailed-status{padding:15px}.embed .status,.public-layout .status{padding:15px 15px 15px 78px;min-height:50px}.embed .status__avatar,.public-layout .status__avatar{left:15px;top:17px}.embed .status__content,.public-layout .status__content{padding-top:5px}.embed .status__prepend,.public-layout .status__prepend{padding:8px 0;padding-bottom:2px;margin:initial;margin-left:78px;padding-top:15px}.embed .status__prepend-icon-wrapper,.public-layout .status__prepend-icon-wrapper{position:absolute;margin:initial;float:initial;width:auto;left:-32px}.embed .status .media-gallery,.embed .status__action-bar,.embed .status .video-player,.public-layout .status .media-gallery,.public-layout .status__action-bar,.public-layout .status .video-player{margin-top:10px}.embed .status .status__info,.public-layout .status .status__info{font-size:15px;display:initial}.embed .status .status__relative-time,.public-layout .status .status__relative-time{color:#c2cede;float:right;font-size:14px;width:auto;margin:initial;padding:initial}.embed .status .status__info .status__display-name,.public-layout .status .status__info .status__display-name{display:block;max-width:100%;padding:6px 0;padding-right:25px;margin:initial}.embed .status .status__info .status__display-name .display-name strong,.public-layout .status .status__info .status__display-name .display-name strong{display:inline}.embed .status .status__avatar,.public-layout .status .status__avatar{height:48px;position:absolute;width:48px;margin:initial}.rtl .embed .status,.rtl .public-layout .status{padding-left:10px;padding-right:68px}.rtl .embed .status .status__info .status__display-name,.rtl .public-layout .status .status__info .status__display-name{padding-left:25px;padding-right:0}.rtl .embed .status .status__relative-time,.rtl .public-layout .status .status__relative-time{float:left}.status__content__read-more-button{display:block;font-size:15px;line-height:20px;color:#4e79df;border:0;background:transparent;padding:0;padding-top:8px;text-decoration:none}.status__content__read-more-button:hover,.status__content__read-more-button:active{text-decoration:underline}.app-body{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.animated-number{display:inline-flex;flex-direction:column;align-items:stretch;overflow:hidden;position:relative}.link-button{display:block;font-size:15px;line-height:20px;color:#2b5fd9;border:0;background:transparent;padding:0;cursor:pointer}.link-button:hover,.link-button:active{text-decoration:underline}.link-button:disabled{color:#9baec8;cursor:default}.button{background-color:#2558d0;border:10px none;border-radius:4px;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-family:inherit;font-size:14px;font-weight:500;height:36px;letter-spacing:0;line-height:36px;overflow:hidden;padding:0 16px;position:relative;text-align:center;text-transform:uppercase;text-decoration:none;text-overflow:ellipsis;transition:all 100ms ease-in;transition-property:background-color;white-space:nowrap;width:auto}.button:active,.button:focus,.button:hover{background-color:#4976de;transition:all 200ms ease-out;transition-property:background-color}.button--destructive{transition:none}.button--destructive:active,.button--destructive:focus,.button--destructive:hover{background-color:#df405a;transition:none}.button:disabled{background-color:#9baec8;cursor:default}.button.button-primary,.button.button-alternative,.button.button-secondary,.button.button-alternative-2{font-size:16px;line-height:36px;height:auto;text-transform:none;padding:4px 16px}.button.button-alternative{color:#000;background:#9baec8}.button.button-alternative:active,.button.button-alternative:focus,.button.button-alternative:hover{background-color:#a8b9cf}.button.button-alternative-2{background:#606984}.button.button-alternative-2:active,.button.button-alternative-2:focus,.button.button-alternative-2:hover{background-color:#687390}.button.button-secondary{font-size:16px;line-height:36px;height:auto;color:#dde3ec;text-transform:none;background:transparent;padding:3px 15px;border-radius:4px;border:1px solid #9baec8}.button.button-secondary:active,.button.button-secondary:focus,.button.button-secondary:hover{border-color:#a8b9cf;color:#eaeef3}.button.button-secondary:disabled{opacity:.5}.button.button--block{display:block;width:100%}.icon-button{display:inline-block;padding:0;color:#8d9ac2;border:0;border-radius:4px;background:transparent;cursor:pointer;transition:all 100ms ease-in;transition-property:background-color,color}.icon-button:hover,.icon-button:active,.icon-button:focus{color:#a4afce;background-color:rgba(141,154,194,.15);transition:all 200ms ease-out;transition-property:background-color,color}.icon-button:focus{background-color:rgba(141,154,194,.3)}.icon-button.disabled{color:#6274ab;background-color:transparent;cursor:default}.icon-button.active{color:#2b90d9}.icon-button::-moz-focus-inner{border:0}.icon-button::-moz-focus-inner,.icon-button:focus,.icon-button:active{outline:0 !important}.icon-button.inverted{color:#1b1e25}.icon-button.inverted:hover,.icon-button.inverted:active,.icon-button.inverted:focus{color:#0c0d11;background-color:rgba(27,30,37,.15)}.icon-button.inverted:focus{background-color:rgba(27,30,37,.3)}.icon-button.inverted.disabled{color:#2a2e3a;background-color:transparent}.icon-button.inverted.active{color:#2b90d9}.icon-button.inverted.active.disabled{color:#63ade3}.icon-button.overlayed{box-sizing:content-box;background:rgba(0,0,0,.6);color:rgba(255,255,255,.7);border-radius:4px;padding:2px}.icon-button.overlayed:hover{background:rgba(0,0,0,.9)}.text-icon-button{color:#1b1e25;border:0;border-radius:4px;background:transparent;cursor:pointer;font-weight:600;font-size:11px;padding:0 3px;line-height:27px;outline:0;transition:all 100ms ease-in;transition-property:background-color,color}.text-icon-button:hover,.text-icon-button:active,.text-icon-button:focus{color:#0c0d11;background-color:rgba(27,30,37,.15);transition:all 200ms ease-out;transition-property:background-color,color}.text-icon-button:focus{background-color:rgba(27,30,37,.3)}.text-icon-button.disabled{color:#464d60;background-color:transparent;cursor:default}.text-icon-button.active{color:#2b90d9}.text-icon-button::-moz-focus-inner{border:0}.text-icon-button::-moz-focus-inner,.text-icon-button:focus,.text-icon-button:active{outline:0 !important}.dropdown-menu{position:absolute;transform-origin:50% 0}.invisible{font-size:0;line-height:0;display:inline-block;width:0;height:0;position:absolute}.invisible img,.invisible svg{margin:0 !important;border:0 !important;padding:0 !important;width:0 !important;height:0 !important}.ellipsis::after{content:\"…\"}.notification__favourite-icon-wrapper{left:0;position:absolute}.notification__favourite-icon-wrapper .fa.star-icon{color:#ca8f04}.star-icon.active{color:#ca8f04}.bookmark-icon.active{color:#ff5050}.no-reduce-motion .icon-button.star-icon.activate>.fa-star{animation:spring-rotate-in 1s linear}.no-reduce-motion .icon-button.star-icon.deactivate>.fa-star{animation:spring-rotate-out 1s linear}.notification__display-name{color:inherit;font-weight:500;text-decoration:none}.notification__display-name:hover{color:#fff;text-decoration:underline}.display-name{display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.display-name a{color:inherit;text-decoration:inherit}.display-name strong{height:18px;font-size:16px;font-weight:500;line-height:18px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.display-name span{display:block;height:18px;font-size:15px;line-height:18px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.display-name>a:hover strong{text-decoration:underline}.display-name.inline{padding:0;height:18px;font-size:15px;line-height:18px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.display-name.inline strong{display:inline;height:auto;font-size:inherit;line-height:inherit}.display-name.inline span{display:inline;height:auto;font-size:inherit;line-height:inherit}.display-name__html{font-weight:500}.display-name__account{font-size:14px}.image-loader{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center;flex-direction:column}.image-loader .image-loader__preview-canvas{max-width:100%;max-height:80%;background:url(\"~images/void.png\") repeat;object-fit:contain}.image-loader .loading-bar{position:relative}.image-loader.image-loader--amorphous .image-loader__preview-canvas{display:none}.zoomable-image{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center}.zoomable-image img{max-width:100%;max-height:80%;width:auto;height:auto;object-fit:contain}.dropdown{display:inline-block}.dropdown__content{display:none;position:absolute}.dropdown-menu__separator{border-bottom:1px solid #c0cdd9;margin:5px 7px 6px;height:0}.dropdown-menu{background:#d9e1e8;padding:4px 0;border-radius:4px;box-shadow:2px 4px 15px rgba(0,0,0,.4)}.dropdown-menu ul{list-style:none}.dropdown-menu__arrow{position:absolute;width:0;height:0;border:0 solid transparent}.dropdown-menu__arrow.left{right:-5px;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#d9e1e8}.dropdown-menu__arrow.top{bottom:-5px;margin-left:-7px;border-width:5px 7px 0;border-top-color:#d9e1e8}.dropdown-menu__arrow.bottom{top:-5px;margin-left:-7px;border-width:0 7px 5px;border-bottom-color:#d9e1e8}.dropdown-menu__arrow.right{left:-5px;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#d9e1e8}.dropdown-menu__item a{font-size:13px;line-height:18px;display:block;padding:4px 14px;box-sizing:border-box;text-decoration:none;background:#d9e1e8;color:#000;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown-menu__item a:focus,.dropdown-menu__item a:hover,.dropdown-menu__item a:active{background:#2b5fd9;color:#ecf0f4;outline:0}.dropdown--active .dropdown__content{display:block;line-height:18px;max-width:311px;right:0;text-align:left;z-index:9999}.dropdown--active .dropdown__content>ul{list-style:none;background:#d9e1e8;padding:4px 0;border-radius:4px;box-shadow:0 0 15px rgba(0,0,0,.4);min-width:140px;position:relative}.dropdown--active .dropdown__content.dropdown__right{right:0}.dropdown--active .dropdown__content.dropdown__left>ul{left:-98px}.dropdown--active .dropdown__content>ul>li>a{font-size:13px;line-height:18px;display:block;padding:4px 14px;box-sizing:border-box;text-decoration:none;background:#d9e1e8;color:#000;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown--active .dropdown__content>ul>li>a:focus{outline:0}.dropdown--active .dropdown__content>ul>li>a:hover{background:#2b5fd9;color:#ecf0f4}.dropdown__icon{vertical-align:middle}.static-content{padding:10px;padding-top:20px;color:#c2cede}.static-content h1{font-size:16px;font-weight:500;margin-bottom:40px;text-align:center}.static-content p{font-size:13px;margin-bottom:20px}.column,.drawer{flex:1 1 100%;overflow:hidden}@media screen and (min-width: 631px){.columns-area{padding:0}.column,.drawer{flex:0 0 auto;padding:10px;padding-left:5px;padding-right:5px}.column:first-child,.drawer:first-child{padding-left:10px}.column:last-child,.drawer:last-child{padding-right:10px}.columns-area>div .column,.columns-area>div .drawer{padding-left:5px;padding-right:5px}}.tabs-bar{box-sizing:border-box;display:flex;background:#393f4f;flex:0 0 auto;overflow-y:auto}.tabs-bar__link{display:block;flex:1 1 auto;padding:15px 10px;padding-bottom:13px;color:#fff;text-decoration:none;text-align:center;font-size:14px;font-weight:500;border-bottom:2px solid #393f4f;transition:all 50ms linear;transition-property:border-bottom,background,color}.tabs-bar__link .fa{font-weight:400;font-size:16px}@media screen and (min-width: 631px){.auto-columns .tabs-bar__link:hover,.auto-columns .tabs-bar__link:focus,.auto-columns .tabs-bar__link:active{background:#464d60;border-bottom-color:#464d60}}.multi-columns .tabs-bar__link:hover,.multi-columns .tabs-bar__link:focus,.multi-columns .tabs-bar__link:active{background:#464d60;border-bottom-color:#464d60}.tabs-bar__link.active{border-bottom:2px solid #2b5fd9;color:#2b90d9}.tabs-bar__link span{margin-left:5px;display:none}.tabs-bar__link span.icon{margin-left:0;display:inline}.icon-with-badge{position:relative}.icon-with-badge__badge{position:absolute;left:9px;top:-13px;background:#2b5fd9;border:2px solid #393f4f;padding:1px 6px;border-radius:6px;font-size:10px;font-weight:500;line-height:14px;color:#fff}.column-link--transparent .icon-with-badge__badge{border-color:#17191f}.scrollable{overflow-y:scroll;overflow-x:hidden;flex:1 1 auto;-webkit-overflow-scrolling:touch}.scrollable.optionally-scrollable{overflow-y:auto}@supports(display: grid){.scrollable{contain:strict}}.scrollable--flex{display:flex;flex-direction:column}.scrollable__append{flex:1 1 auto;position:relative;min-height:120px}@supports(display: grid){.scrollable.fullscreen{contain:none}}.react-toggle{display:inline-block;position:relative;cursor:pointer;background-color:transparent;border:0;padding:0;user-select:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-tap-highlight-color:transparent}.react-toggle-screenreader-only{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.react-toggle--disabled{cursor:not-allowed;opacity:.5;transition:opacity .25s}.react-toggle-track{width:50px;height:24px;padding:0;border-radius:30px;background-color:#282c37;transition:background-color .2s ease}.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track{background-color:#131419}.react-toggle--checked .react-toggle-track{background-color:#2b5fd9}.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track{background-color:#5680e1}.react-toggle-track-check{position:absolute;width:14px;height:10px;top:0;bottom:0;margin-top:auto;margin-bottom:auto;line-height:0;left:8px;opacity:0;transition:opacity .25s ease}.react-toggle--checked .react-toggle-track-check{opacity:1;transition:opacity .25s ease}.react-toggle-track-x{position:absolute;width:10px;height:10px;top:0;bottom:0;margin-top:auto;margin-bottom:auto;line-height:0;right:10px;opacity:1;transition:opacity .25s ease}.react-toggle--checked .react-toggle-track-x{opacity:0}.react-toggle-thumb{position:absolute;top:1px;left:1px;width:22px;height:22px;border:1px solid #282c37;border-radius:50%;background-color:#fafafa;box-sizing:border-box;transition:all .25s ease;transition-property:border-color,left}.react-toggle--checked .react-toggle-thumb{left:27px;border-color:#2b5fd9}.getting-started__wrapper,.getting_started,.flex-spacer{background:#282c37}.getting-started__wrapper{position:relative;overflow-y:auto}.flex-spacer{flex:1 1 auto}.getting-started{background:#282c37;flex:1 0 auto}.getting-started p{color:#ecf0f4}.getting-started a{color:#c2cede}.getting-started__panel{height:min-content}.getting-started__panel,.getting-started__footer{padding:10px;padding-top:20px;flex:0 1 auto}.getting-started__panel ul,.getting-started__footer ul{margin-bottom:10px}.getting-started__panel ul li,.getting-started__footer ul li{display:inline}.getting-started__panel p,.getting-started__footer p{color:#c2cede;font-size:13px}.getting-started__panel p a,.getting-started__footer p a{color:#c2cede;text-decoration:underline}.getting-started__panel a,.getting-started__footer a{text-decoration:none;color:#dde3ec}.getting-started__panel a:hover,.getting-started__panel a:focus,.getting-started__panel a:active,.getting-started__footer a:hover,.getting-started__footer a:focus,.getting-started__footer a:active{text-decoration:underline}.getting-started__trends{flex:0 1 auto;opacity:1;animation:fade 150ms linear;margin-top:10px}.getting-started__trends h4{font-size:12px;text-transform:uppercase;color:#dde3ec;padding:10px;font-weight:500;border-bottom:1px solid #393f4f}@media screen and (max-height: 810px){.getting-started__trends .trends__item:nth-child(3){display:none}}@media screen and (max-height: 720px){.getting-started__trends .trends__item:nth-child(2){display:none}}@media screen and (max-height: 670px){.getting-started__trends{display:none}}.getting-started__trends .trends__item{border-bottom:0;padding:10px}.getting-started__trends .trends__item__current{color:#dde3ec}.column-link__badge{display:inline-block;border-radius:4px;font-size:12px;line-height:19px;font-weight:500;background:#282c37;padding:4px 8px;margin:-6px 10px}.keyboard-shortcuts{padding:8px 0 0;overflow:hidden}.keyboard-shortcuts thead{position:absolute;left:-9999px}.keyboard-shortcuts td{padding:0 10px 8px}.keyboard-shortcuts kbd{display:inline-block;padding:3px 5px;background-color:#393f4f;border:1px solid #1f232b}.setting-text{color:#dde3ec;background:transparent;border:none;border-bottom:2px solid #9baec8;box-sizing:border-box;display:block;font-family:inherit;margin-bottom:10px;padding:7px 0;width:100%}.setting-text:focus,.setting-text:active{color:#fff;border-bottom-color:#2b5fd9}@media screen and (max-width: 600px){.auto-columns .setting-text,.single-column .setting-text{font-size:16px}}.setting-text.light{color:#000;border-bottom:2px solid #626c87}.setting-text.light:focus,.setting-text.light:active{color:#000;border-bottom-color:#2b5fd9}.no-reduce-motion button.icon-button i.fa-retweet{background-position:0 0;height:19px;transition:background-position .9s steps(10);transition-duration:0s;vertical-align:middle;width:22px}.no-reduce-motion button.icon-button i.fa-retweet::before{display:none !important}.no-reduce-motion button.icon-button.active i.fa-retweet{transition-duration:.9s;background-position:0 100%}.reduce-motion button.icon-button i.fa-retweet{color:#8d9ac2;transition:color 100ms ease-in}.reduce-motion button.icon-button.active i.fa-retweet{color:#2b90d9}.reduce-motion button.icon-button.disabled i.fa-retweet{color:#6274ab}.load-more{display:block;color:#c2cede;background-color:transparent;border:0;font-size:inherit;text-align:center;line-height:inherit;margin:0;padding:15px;box-sizing:border-box;width:100%;clear:both;text-decoration:none}.load-more:hover{background:#2c313d}.load-gap{border-bottom:1px solid #393f4f}.missing-indicator{padding-top:68px}.scrollable>div>:first-child .notification__dismiss-overlay>.wrappy{border-top:1px solid #282c37}.notification__dismiss-overlay{overflow:hidden;position:absolute;top:0;right:0;bottom:-1px;padding-left:15px;z-index:999;align-items:center;justify-content:flex-end;cursor:pointer;display:flex}.notification__dismiss-overlay .wrappy{width:4rem;align-self:stretch;display:flex;flex-direction:column;align-items:center;justify-content:center;background:#393f4f;border-left:1px solid #535b72;box-shadow:0 0 5px #000;border-bottom:1px solid #282c37}.notification__dismiss-overlay .ckbox{border:2px solid #9baec8;border-radius:2px;width:30px;height:30px;font-size:20px;color:#dde3ec;text-shadow:0 0 5px #000;display:flex;justify-content:center;align-items:center}.notification__dismiss-overlay:focus{outline:0 !important}.notification__dismiss-overlay:focus .ckbox{box-shadow:0 0 1px 1px #2b5fd9}.text-btn{display:inline-block;padding:0;font-family:inherit;font-size:inherit;color:inherit;border:0;background:transparent;cursor:pointer}.loading-indicator{color:#c2cede;font-size:12px;font-weight:400;text-transform:uppercase;overflow:visible;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.loading-indicator span{display:block;float:left;margin-left:50%;transform:translateX(-50%);margin:82px 0 0 50%;white-space:nowrap}.loading-indicator__figure{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);width:42px;height:42px;box-sizing:border-box;background-color:transparent;border:0 solid #606984;border-width:6px;border-radius:50%}.no-reduce-motion .loading-indicator span{animation:loader-label 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1)}.no-reduce-motion .loading-indicator__figure{animation:loader-figure 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1)}@keyframes spring-rotate-in{0%{transform:rotate(0deg)}30%{transform:rotate(-484.8deg)}60%{transform:rotate(-316.7deg)}90%{transform:rotate(-375deg)}100%{transform:rotate(-360deg)}}@keyframes spring-rotate-out{0%{transform:rotate(-360deg)}30%{transform:rotate(124.8deg)}60%{transform:rotate(-43.27deg)}90%{transform:rotate(15deg)}100%{transform:rotate(0deg)}}@keyframes loader-figure{0%{width:0;height:0;background-color:#606984}29%{background-color:#606984}30%{width:42px;height:42px;background-color:transparent;border-width:21px;opacity:1}100%{width:42px;height:42px;border-width:0;opacity:0;background-color:transparent}}@keyframes loader-label{0%{opacity:.25}30%{opacity:1}100%{opacity:.25}}.spoiler-button{top:0;left:0;width:100%;height:100%;position:absolute;z-index:100}.spoiler-button--minified{display:flex;left:4px;top:4px;width:auto;height:auto;align-items:center}.spoiler-button--click-thru{pointer-events:none}.spoiler-button--hidden{display:none}.spoiler-button__overlay{display:block;background:transparent;width:100%;height:100%;border:0}.spoiler-button__overlay__label{display:inline-block;background:rgba(0,0,0,.5);border-radius:8px;padding:8px 12px;color:#fff;font-weight:500;font-size:14px}.spoiler-button__overlay:hover .spoiler-button__overlay__label,.spoiler-button__overlay:focus .spoiler-button__overlay__label,.spoiler-button__overlay:active .spoiler-button__overlay__label{background:rgba(0,0,0,.8)}.spoiler-button__overlay:disabled .spoiler-button__overlay__label{background:rgba(0,0,0,.5)}.setting-toggle{display:block;line-height:24px}.setting-toggle__label,.setting-radio__label,.setting-meta__label{color:#dde3ec;display:inline-block;margin-bottom:14px;margin-left:8px;vertical-align:middle}.setting-radio{display:block;line-height:18px}.setting-radio__label{margin-bottom:0}.column-settings__row legend{color:#dde3ec;cursor:default;display:block;font-weight:500;margin-top:10px}.setting-radio__input{vertical-align:middle}.setting-meta__label{float:right}@keyframes heartbeat{from{transform:scale(1);transform-origin:center center;animation-timing-function:ease-out}10%{transform:scale(0.91);animation-timing-function:ease-in}17%{transform:scale(0.98);animation-timing-function:ease-out}33%{transform:scale(0.87);animation-timing-function:ease-in}45%{transform:scale(1);animation-timing-function:ease-out}}.pulse-loading{animation:heartbeat 1.5s ease-in-out infinite both}.upload-area{align-items:center;background:rgba(0,0,0,.8);display:flex;height:100%;justify-content:center;left:0;opacity:0;position:absolute;top:0;visibility:hidden;width:100%;z-index:2000}.upload-area *{pointer-events:none}.upload-area__drop{width:320px;height:160px;display:flex;box-sizing:border-box;position:relative;padding:8px}.upload-area__background{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;border-radius:4px;background:#282c37;box-shadow:0 0 5px rgba(0,0,0,.2)}.upload-area__content{flex:1;display:flex;align-items:center;justify-content:center;color:#ecf0f4;font-size:18px;font-weight:500;border:2px dashed #606984;border-radius:4px}.dropdown--active .emoji-button img{opacity:1;filter:none}.loading-bar{background-color:#2b5fd9;height:3px;position:absolute;top:0;left:0;z-index:9999}.icon-badge-wrapper{position:relative}.icon-badge{position:absolute;display:block;right:-0.25em;top:-0.25em;background-color:#2b5fd9;border-radius:50%;font-size:75%;width:1em;height:1em}.conversation{display:flex;border-bottom:1px solid #393f4f;padding:5px;padding-bottom:0}.conversation:focus{background:#2c313d;outline:0}.conversation__avatar{flex:0 0 auto;padding:10px;padding-top:12px;position:relative;cursor:pointer}.conversation__unread{display:inline-block;background:#2b90d9;border-radius:50%;width:.625rem;height:.625rem;margin:-0.1ex .15em .1ex}.conversation__content{flex:1 1 auto;padding:10px 5px;padding-right:15px;overflow:hidden}.conversation__content__info{overflow:hidden;display:flex;flex-direction:row-reverse;justify-content:space-between}.conversation__content__relative-time{font-size:15px;color:#dde3ec;padding-left:15px}.conversation__content__names{color:#dde3ec;font-size:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:4px;flex-basis:90px;flex-grow:1}.conversation__content__names a{color:#fff;text-decoration:none}.conversation__content__names a:hover,.conversation__content__names a:focus,.conversation__content__names a:active{text-decoration:underline}.conversation__content .status__content{margin:0}.conversation--unread{background:#2c313d}.conversation--unread:focus{background:#313543}.conversation--unread .conversation__content__info{font-weight:700}.conversation--unread .conversation__content__relative-time{color:#fff}.ui .flash-message{margin-top:10px;margin-left:auto;margin-right:auto;margin-bottom:0;min-width:75%}::-webkit-scrollbar-thumb{border-radius:0}noscript{text-align:center}noscript img{width:200px;opacity:.5;animation:flicker 4s infinite}noscript div{font-size:14px;margin:30px auto;color:#ecf0f4;max-width:400px}noscript div a{color:#2b90d9;text-decoration:underline}noscript div a:hover{text-decoration:none}noscript div a{word-break:break-word}@keyframes flicker{0%{opacity:1}30%{opacity:.75}100%{opacity:1}}button.icon-button i.fa-retweet{background-image:url(\"data:image/svg+xml;utf8,\")}button.icon-button i.fa-retweet:hover{background-image:url(\"data:image/svg+xml;utf8,\")}button.icon-button.disabled i.fa-retweet,button.icon-button.disabled i.fa-retweet:hover{background-image:url(\"data:image/svg+xml;utf8,\")}.status-direct button.icon-button.disabled i.fa-retweet,.status-direct button.icon-button.disabled i.fa-retweet:hover{background-image:url(\"data:image/svg+xml;utf8,\")}.account{padding:10px;border-bottom:1px solid #393f4f;color:inherit;text-decoration:none}.account .account__display-name{flex:1 1 auto;display:block;color:#dde3ec;overflow:hidden;text-decoration:none;font-size:14px}.account.small{border:none;padding:0}.account.small>.account__avatar-wrapper{margin:0 8px 0 0}.account.small>.display-name{height:24px;line-height:24px}.account__wrapper{display:flex}.account__avatar-wrapper{float:left;margin-left:12px;margin-right:12px}.account__avatar{border-radius:8%;background-position:50%;background-clip:padding-box;position:relative;cursor:pointer}.account__avatar-inline{display:inline-block;vertical-align:middle;margin-right:5px}.account__avatar-composite{border-radius:8%;background-position:50%;background-clip:padding-box;overflow:hidden;position:relative}.account__avatar-composite div{border-radius:8%;background-position:50%;background-clip:padding-box;float:left;position:relative;box-sizing:border-box}.account__avatar-composite__label{display:block;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);color:#fff;text-shadow:1px 1px 2px #000;font-weight:700;font-size:15px}.account__avatar-overlay{position:relative;width:48px;height:48px;background-size:48px 48px}.account__avatar-overlay-base{border-radius:8%;background-position:50%;background-clip:padding-box;width:36px;height:36px;background-size:36px 36px}.account__avatar-overlay-overlay{border-radius:8%;background-position:50%;background-clip:padding-box;width:24px;height:24px;background-size:24px 24px;position:absolute;bottom:0;right:0;z-index:1}.account__relationship{height:18px;padding:10px;white-space:nowrap}.account__header__wrapper{flex:0 0 auto;background:#313543}.account__disclaimer{padding:10px;color:#c2cede}.account__disclaimer strong{font-weight:500}.account__disclaimer strong:lang(ja){font-weight:700}.account__disclaimer strong:lang(ko){font-weight:700}.account__disclaimer strong:lang(zh-CN){font-weight:700}.account__disclaimer strong:lang(zh-HK){font-weight:700}.account__disclaimer strong:lang(zh-TW){font-weight:700}.account__disclaimer a{font-weight:500;color:inherit;text-decoration:underline}.account__disclaimer a:hover,.account__disclaimer a:focus,.account__disclaimer a:active{text-decoration:none}.account__action-bar{border-top:1px solid #393f4f;border-bottom:1px solid #393f4f;line-height:36px;overflow:hidden;flex:0 0 auto;display:flex}.account__action-bar-links{display:flex;flex:1 1 auto;line-height:18px;text-align:center}.account__action-bar__tab{text-decoration:none;overflow:hidden;flex:0 1 100%;border-left:1px solid #393f4f;padding:10px 0;border-bottom:4px solid transparent}.account__action-bar__tab:first-child{border-left:0}.account__action-bar__tab.active{border-bottom:4px solid #2b5fd9}.account__action-bar__tab>span{display:block;text-transform:uppercase;font-size:11px;color:#dde3ec}.account__action-bar__tab strong{display:block;font-size:15px;font-weight:500;color:#fff}.account__action-bar__tab strong:lang(ja){font-weight:700}.account__action-bar__tab strong:lang(ko){font-weight:700}.account__action-bar__tab strong:lang(zh-CN){font-weight:700}.account__action-bar__tab strong:lang(zh-HK){font-weight:700}.account__action-bar__tab strong:lang(zh-TW){font-weight:700}.account__action-bar__tab abbr{color:#2b90d9}.account-authorize{padding:14px 10px}.account-authorize .detailed-status__display-name{display:block;margin-bottom:15px;overflow:hidden}.account-authorize__avatar{float:left;margin-right:10px}.notification__message{margin-left:42px;padding:8px 0 0 26px;cursor:default;color:#dde3ec;font-size:15px;position:relative}.notification__message .fa{color:#2b90d9}.notification__message>span{display:block;overflow:hidden;text-overflow:ellipsis}.account--panel{background:#313543;border-top:1px solid #393f4f;border-bottom:1px solid #393f4f;display:flex;flex-direction:row;padding:10px 0}.account--panel__button,.detailed-status__button{flex:1 1 auto;text-align:center}.column-settings__outer{background:#393f4f;padding:15px}.column-settings__section{color:#dde3ec;cursor:default;display:block;font-weight:500;margin-bottom:10px}.column-settings__hashtags .column-settings__row{margin-bottom:15px}.column-settings__hashtags .column-select__control{outline:0;box-sizing:border-box;width:100%;border:none;box-shadow:none;font-family:inherit;background:#282c37;color:#dde3ec;font-size:14px;margin:0}.column-settings__hashtags .column-select__control::placeholder{color:#eaeef3}.column-settings__hashtags .column-select__control::-moz-focus-inner{border:0}.column-settings__hashtags .column-select__control::-moz-focus-inner,.column-settings__hashtags .column-select__control:focus,.column-settings__hashtags .column-select__control:active{outline:0 !important}.column-settings__hashtags .column-select__control:focus{background:#313543}@media screen and (max-width: 600px){.column-settings__hashtags .column-select__control{font-size:16px}}.column-settings__hashtags .column-select__placeholder{color:#c2cede;padding-left:2px;font-size:12px}.column-settings__hashtags .column-select__value-container{padding-left:6px}.column-settings__hashtags .column-select__multi-value{background:#393f4f}.column-settings__hashtags .column-select__multi-value__remove{cursor:pointer}.column-settings__hashtags .column-select__multi-value__remove:hover,.column-settings__hashtags .column-select__multi-value__remove:active,.column-settings__hashtags .column-select__multi-value__remove:focus{background:#42485a;color:#eaeef3}.column-settings__hashtags .column-select__multi-value__label,.column-settings__hashtags .column-select__input{color:#dde3ec}.column-settings__hashtags .column-select__clear-indicator,.column-settings__hashtags .column-select__dropdown-indicator{cursor:pointer;transition:none;color:#c2cede}.column-settings__hashtags .column-select__clear-indicator:hover,.column-settings__hashtags .column-select__clear-indicator:active,.column-settings__hashtags .column-select__clear-indicator:focus,.column-settings__hashtags .column-select__dropdown-indicator:hover,.column-settings__hashtags .column-select__dropdown-indicator:active,.column-settings__hashtags .column-select__dropdown-indicator:focus{color:#d0d9e5}.column-settings__hashtags .column-select__indicator-separator{background-color:#393f4f}.column-settings__hashtags .column-select__menu{background:#fff;border-radius:4px;padding:10px 14px;padding-bottom:14px;margin-top:10px;color:#364861;box-shadow:2px 4px 15px rgba(0,0,0,.4);padding:0;background:#d9e1e8}.column-settings__hashtags .column-select__menu h4{text-transform:uppercase;color:#364861;font-size:13px;font-weight:500;margin-bottom:10px}.column-settings__hashtags .column-select__menu li{padding:4px 0}.column-settings__hashtags .column-select__menu ul{margin-bottom:10px}.column-settings__hashtags .column-select__menu em{font-weight:500;color:#000}.column-settings__hashtags .column-select__menu-list{padding:6px}.column-settings__hashtags .column-select__option{color:#000;border-radius:4px;font-size:14px}.column-settings__hashtags .column-select__option--is-focused,.column-settings__hashtags .column-select__option--is-selected{background:#b9c8d5}.column-settings__row .text-btn{margin-bottom:15px}.relationship-tag{color:#fff;margin-bottom:4px;display:block;vertical-align:top;background-color:#000;text-transform:uppercase;font-size:11px;font-weight:500;padding:4px;border-radius:4px;opacity:.7}.relationship-tag:hover{opacity:1}.account-gallery__container{display:flex;flex-wrap:wrap;padding:4px 2px}.account-gallery__item{border:none;box-sizing:border-box;display:block;position:relative;border-radius:4px;overflow:hidden;margin:2px}.account-gallery__item__icons{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);font-size:24px}.notification__filter-bar,.account__section-headline{background:#1f232b;border-bottom:1px solid #393f4f;cursor:default;display:flex;flex-shrink:0}.notification__filter-bar button,.account__section-headline button{background:#1f232b;border:0;margin:0}.notification__filter-bar button,.notification__filter-bar a,.account__section-headline button,.account__section-headline a{display:block;flex:1 1 auto;color:#dde3ec;padding:15px 0;font-size:14px;font-weight:500;text-align:center;text-decoration:none;position:relative}.notification__filter-bar button.active,.notification__filter-bar a.active,.account__section-headline button.active,.account__section-headline a.active{color:#ecf0f4}.notification__filter-bar button.active::before,.notification__filter-bar button.active::after,.notification__filter-bar a.active::before,.notification__filter-bar a.active::after,.account__section-headline button.active::before,.account__section-headline button.active::after,.account__section-headline a.active::before,.account__section-headline a.active::after{display:block;content:\"\";position:absolute;bottom:0;left:50%;width:0;height:0;transform:translateX(-50%);border-style:solid;border-width:0 10px 10px;border-color:transparent transparent #393f4f}.notification__filter-bar button.active::after,.notification__filter-bar a.active::after,.account__section-headline button.active::after,.account__section-headline a.active::after{bottom:-1px;border-color:transparent transparent #282c37}.notification__filter-bar.directory__section-headline,.account__section-headline.directory__section-headline{background:#242731;border-bottom-color:transparent}.notification__filter-bar.directory__section-headline a.active::before,.notification__filter-bar.directory__section-headline button.active::before,.account__section-headline.directory__section-headline a.active::before,.account__section-headline.directory__section-headline button.active::before{display:none}.notification__filter-bar.directory__section-headline a.active::after,.notification__filter-bar.directory__section-headline button.active::after,.account__section-headline.directory__section-headline a.active::after,.account__section-headline.directory__section-headline button.active::after{border-color:transparent transparent #191b22}.account__moved-note{padding:14px 10px;padding-bottom:16px;background:#313543;border-top:1px solid #393f4f;border-bottom:1px solid #393f4f}.account__moved-note__message{position:relative;margin-left:58px;color:#c2cede;padding:8px 0;padding-top:0;padding-bottom:4px;font-size:14px}.account__moved-note__message>span{display:block;overflow:hidden;text-overflow:ellipsis}.account__moved-note__icon-wrapper{left:-26px;position:absolute}.account__moved-note .detailed-status__display-avatar{position:relative}.account__moved-note .detailed-status__display-name{margin-bottom:0}.account__header__content{color:#dde3ec;font-size:14px;font-weight:400;overflow:hidden;word-break:normal;word-wrap:break-word}.account__header__content p{margin-bottom:20px}.account__header__content p:last-child{margin-bottom:0}.account__header__content a{color:inherit;text-decoration:underline}.account__header__content a:hover{text-decoration:none}.account__header{overflow:hidden}.account__header.inactive{opacity:.5}.account__header.inactive .account__header__image,.account__header.inactive .account__avatar{filter:grayscale(100%)}.account__header__info{position:absolute;top:10px;left:10px}.account__header__image{overflow:hidden;height:145px;position:relative;background:#1f232b}.account__header__image img{object-fit:cover;display:block;width:100%;height:100%;margin:0}.account__header__bar{position:relative;background:#313543;padding:5px;border-bottom:1px solid #42485a}.account__header__bar .avatar{display:block;flex:0 0 auto;width:94px;margin-left:-2px}.account__header__bar .avatar .account__avatar{background:#17191f;border:2px solid #313543}.account__header__tabs{display:flex;align-items:flex-start;padding:7px 5px;margin-top:-55px}.account__header__tabs__buttons{display:flex;align-items:center;padding-top:55px;overflow:hidden}.account__header__tabs__buttons .icon-button{border:1px solid #42485a;border-radius:4px;box-sizing:content-box;padding:2px}.account__header__tabs__buttons .button{margin:0 8px}.account__header__tabs__name{padding:5px}.account__header__tabs__name .account-role{vertical-align:top}.account__header__tabs__name .emojione{width:22px;height:22px}.account__header__tabs__name h1{font-size:16px;line-height:24px;color:#fff;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.account__header__tabs__name h1 small{display:block;font-size:14px;color:#dde3ec;font-weight:400;overflow:hidden;text-overflow:ellipsis}.account__header__tabs .spacer{flex:1 1 auto}.account__header__bio{overflow:hidden;margin:0 -5px}.account__header__bio .account__header__content{padding:20px 15px;padding-bottom:5px;color:#fff}.account__header__bio .account__header__fields{margin:0;border-top:1px solid #42485a}.account__header__bio .account__header__fields a{color:#4e79df}.account__header__bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.account__header__bio .account__header__fields .verified a{color:#79bd9a}.account__header__extra{margin-top:4px}.account__header__extra__links{font-size:14px;color:#dde3ec;padding:10px 0}.account__header__extra__links a{display:inline-block;color:#dde3ec;text-decoration:none;padding:5px 10px;font-weight:500}.account__header__extra__links a strong{font-weight:700;color:#fff}.domain{padding:10px;border-bottom:1px solid #393f4f}.domain .domain__domain-name{flex:1 1 auto;display:block;color:#fff;text-decoration:none;font-size:14px;font-weight:500}.domain__wrapper{display:flex}.domain_buttons{height:18px;padding:10px;white-space:nowrap}@keyframes spring-flip-in{0%{transform:rotate(0deg)}30%{transform:rotate(-242.4deg)}60%{transform:rotate(-158.35deg)}90%{transform:rotate(-187.5deg)}100%{transform:rotate(-180deg)}}@keyframes spring-flip-out{0%{transform:rotate(-180deg)}30%{transform:rotate(62.4deg)}60%{transform:rotate(-21.635deg)}90%{transform:rotate(7.5deg)}100%{transform:rotate(0deg)}}.status__content--with-action{cursor:pointer}.status__content{position:relative;margin:10px 0;font-size:15px;line-height:20px;word-wrap:break-word;font-weight:400;overflow:visible;padding-top:5px}.status__content:focus{outline:0}.status__content .emojione{width:20px;height:20px;margin:-3px 0 0}.status__content img{max-width:100%;max-height:400px;object-fit:contain}.status__content p,.status__content pre,.status__content blockquote{margin-bottom:20px;white-space:pre-wrap}.status__content p:last-child,.status__content pre:last-child,.status__content blockquote:last-child{margin-bottom:0}.status__content .status__content__text,.status__content .e-content{overflow:hidden}.status__content .status__content__text>ul,.status__content .status__content__text>ol,.status__content .e-content>ul,.status__content .e-content>ol{margin-bottom:20px}.status__content .status__content__text h1,.status__content .status__content__text h2,.status__content .status__content__text h3,.status__content .status__content__text h4,.status__content .status__content__text h5,.status__content .e-content h1,.status__content .e-content h2,.status__content .e-content h3,.status__content .e-content h4,.status__content .e-content h5{margin-top:20px;margin-bottom:20px}.status__content .status__content__text h1,.status__content .status__content__text h2,.status__content .e-content h1,.status__content .e-content h2{font-weight:700;font-size:1.2em}.status__content .status__content__text h2,.status__content .e-content h2{font-size:1.1em}.status__content .status__content__text h3,.status__content .status__content__text h4,.status__content .status__content__text h5,.status__content .e-content h3,.status__content .e-content h4,.status__content .e-content h5{font-weight:500}.status__content .status__content__text blockquote,.status__content .e-content blockquote{padding-left:10px;border-left:3px solid #dde3ec;color:#dde3ec;white-space:normal}.status__content .status__content__text blockquote p:last-child,.status__content .e-content blockquote p:last-child{margin-bottom:0}.status__content .status__content__text b,.status__content .status__content__text strong,.status__content .e-content b,.status__content .e-content strong{font-weight:700}.status__content .status__content__text em,.status__content .status__content__text i,.status__content .e-content em,.status__content .e-content i{font-style:italic}.status__content .status__content__text sub,.status__content .e-content sub{font-size:smaller;text-align:sub}.status__content .status__content__text sup,.status__content .e-content sup{font-size:smaller;vertical-align:super}.status__content .status__content__text ul,.status__content .status__content__text ol,.status__content .e-content ul,.status__content .e-content ol{margin-left:1em}.status__content .status__content__text ul p,.status__content .status__content__text ol p,.status__content .e-content ul p,.status__content .e-content ol p{margin:0}.status__content .status__content__text ul,.status__content .e-content ul{list-style-type:disc}.status__content .status__content__text ol,.status__content .e-content ol{list-style-type:decimal}.status__content a{color:#d8a070;text-decoration:none}.status__content a:hover{text-decoration:underline}.status__content a:hover .fa{color:#dae1ea}.status__content a.mention:hover{text-decoration:none}.status__content a.mention:hover span{text-decoration:underline}.status__content a .fa{color:#c2cede}.status__content .status__content__spoiler{display:none}.status__content .status__content__spoiler.status__content__spoiler--visible{display:block}.status__content a.unhandled-link{color:#4e79df}.status__content a.unhandled-link .link-origin-tag{color:#ca8f04;font-size:.8em}.status__content .status__content__spoiler-link{background:#687390}.status__content .status__content__spoiler-link:hover{background:#707b97;text-decoration:none}.status__content__spoiler-link{display:inline-block;border-radius:2px;background:#687390;border:none;color:#000;font-weight:500;font-size:11px;padding:0 5px;text-transform:uppercase;line-height:inherit;cursor:pointer;vertical-align:bottom}.status__content__spoiler-link:hover{background:#707b97;text-decoration:none}.status__content__spoiler-link .status__content__spoiler-icon{display:inline-block;margin:0 0 0 5px;border-left:1px solid currentColor;padding:0 0 0 4px;font-size:16px;vertical-align:-2px}.notif-cleaning .status,.notif-cleaning .notification-follow,.notif-cleaning .notification-follow-request{padding-right:4.5rem}.status__wrapper--filtered{color:#c2cede;border:0;font-size:inherit;text-align:center;line-height:inherit;margin:0;padding:15px;box-sizing:border-box;width:100%;clear:both;border-bottom:1px solid #393f4f}.status__prepend-icon-wrapper{left:-26px;position:absolute}.notification-follow,.notification-follow-request{position:relative;border-bottom:1px solid #393f4f}.notification-follow .account,.notification-follow-request .account{border-bottom:0 none}.focusable:focus{outline:0;background:#313543}.focusable:focus.status.status-direct:not(.read){background:#42485a}.focusable:focus.status.status-direct:not(.read).muted{background:transparent}.focusable:focus .detailed-status,.focusable:focus .detailed-status__action-bar{background:#393f4f}.status{padding:10px 14px;position:relative;height:auto;border-bottom:1px solid #393f4f;cursor:default;opacity:1;animation:fade 150ms linear}@supports(-ms-overflow-style: -ms-autohiding-scrollbar){.status{padding-right:28px}}@keyframes fade{0%{opacity:0}100%{opacity:1}}.status .video-player,.status .audio-player{margin-top:8px}.status.status-direct:not(.read){background:#393f4f;border-bottom-color:#42485a}.status.light .status__relative-time{color:#1b1e25}.status.light .status__display-name{color:#000}.status.light .display-name{color:#364861}.status.light .display-name strong{color:#000}.status.light .status__content{color:#000}.status.light .status__content a{color:#2b90d9}.status.light .status__content a.status__content__spoiler-link{color:#fff;background:#9baec8}.status.light .status__content a.status__content__spoiler-link:hover{background:#b5c3d6}.status.collapsed{background-position:center;background-size:cover;user-select:none}.status.collapsed.has-background::before{display:block;position:absolute;left:0;right:0;top:0;bottom:0;background-image:linear-gradient(to bottom, rgba(0, 0, 0, 0.75), rgba(0, 0, 0, 0.65) 24px, rgba(0, 0, 0, 0.8));pointer-events:none;content:\"\"}.status.collapsed .display-name:hover .display-name__html{text-decoration:none}.status.collapsed .status__content{height:20px;overflow:hidden;text-overflow:ellipsis;padding-top:0}.status.collapsed .status__content:after{content:\"\";position:absolute;top:0;bottom:0;left:0;right:0;background:linear-gradient(rgba(40, 44, 55, 0), #282c37);pointer-events:none}.status.collapsed .status__content a:hover{text-decoration:none}.status.collapsed:focus>.status__content:after{background:linear-gradient(rgba(49, 53, 67, 0), #313543)}.status.collapsed.status-direct:not(.read)>.status__content:after{background:linear-gradient(rgba(57, 63, 79, 0), #393f4f)}.status.collapsed .notification__message{margin-bottom:0}.status.collapsed .status__info .notification__message>span{white-space:nowrap}.status .notification__message{margin:-10px 0px 10px 0}.notification-favourite .status.status-direct{background:transparent}.notification-favourite .status.status-direct .icon-button.disabled{color:#b8c0d9}.status__relative-time{display:inline-block;flex-grow:1;color:#c2cede;font-size:14px;text-align:right;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.status__display-name{color:#c2cede;overflow:hidden}.status__info__account .status__display-name{display:block;max-width:100%}.status__info{display:flex;justify-content:space-between;font-size:15px}.status__info>span{text-overflow:ellipsis;overflow:hidden}.status__info .notification__message>span{word-wrap:break-word}.status__info__icons{display:flex;align-items:center;height:1em;color:#8d9ac2}.status__info__icons .status__media-icon,.status__info__icons .status__visibility-icon,.status__info__icons .status__reply-icon{padding-left:2px;padding-right:2px}.status__info__icons .status__collapse-button.active>.fa-angle-double-up{transform:rotate(-180deg)}.no-reduce-motion .status__collapse-button.activate>.fa-angle-double-up{animation:spring-flip-in 1s linear}.no-reduce-motion .status__collapse-button.deactivate>.fa-angle-double-up{animation:spring-flip-out 1s linear}.status__info__account{display:flex;align-items:center;justify-content:flex-start}.status-check-box{border-bottom:1px solid #d9e1e8;display:flex}.status-check-box .status-check-box__status{margin:10px 0 10px 10px;flex:1;overflow:hidden}.status-check-box .status-check-box__status .media-gallery{max-width:250px}.status-check-box .status-check-box__status .status__content{padding:0;white-space:normal}.status-check-box .status-check-box__status .video-player,.status-check-box .status-check-box__status .audio-player{margin-top:8px;max-width:250px}.status-check-box .status-check-box__status .media-gallery__item-thumbnail{cursor:default}.status-check-box-toggle{align-items:center;display:flex;flex:0 0 auto;justify-content:center;padding:10px}.status__prepend{margin-top:-10px;margin-bottom:10px;margin-left:58px;color:#c2cede;padding:8px 0;padding-bottom:2px;font-size:14px;position:relative}.status__prepend .status__display-name strong{color:#c2cede}.status__prepend>span{display:block;overflow:hidden;text-overflow:ellipsis}.status__action-bar{align-items:center;display:flex;margin-top:8px}.status__action-bar__counter{display:inline-flex;margin-right:11px;align-items:center}.status__action-bar__counter .status__action-bar-button{margin-right:4px}.status__action-bar__counter__label{display:inline-block;width:14px;font-size:12px;font-weight:500;color:#8d9ac2}.status__action-bar-button{margin-right:18px}.status__action-bar-dropdown{height:23.15px;width:23.15px}.detailed-status__action-bar-dropdown{flex:1 1 auto;display:flex;align-items:center;justify-content:center;position:relative}.detailed-status{background:#313543;padding:14px 10px}.detailed-status--flex{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-start}.detailed-status--flex .status__content,.detailed-status--flex .detailed-status__meta{flex:100%}.detailed-status .status__content{font-size:19px;line-height:24px}.detailed-status .status__content .emojione{width:24px;height:24px;margin:-1px 0 0}.detailed-status .video-player,.detailed-status .audio-player{margin-top:8px}.detailed-status__meta{margin-top:15px;color:#c2cede;font-size:14px;line-height:18px}.detailed-status__action-bar{background:#313543;border-top:1px solid #393f4f;border-bottom:1px solid #393f4f;display:flex;flex-direction:row;padding:10px 0}.detailed-status__link{color:inherit;text-decoration:none}.detailed-status__favorites,.detailed-status__reblogs{display:inline-block;font-weight:500;font-size:12px;margin-left:6px}.status__display-name,.status__relative-time,.detailed-status__display-name,.detailed-status__datetime,.detailed-status__application,.account__display-name{text-decoration:none}.status__display-name strong,.account__display-name strong{color:#fff}.muted .emojione{opacity:.5}a.status__display-name:hover strong,.reply-indicator__display-name:hover strong,.detailed-status__display-name:hover strong,.account__display-name:hover strong{text-decoration:underline}.account__display-name strong{display:block;overflow:hidden;text-overflow:ellipsis}.detailed-status__application,.detailed-status__datetime{color:inherit}.detailed-status .button.logo-button{margin-bottom:15px}.detailed-status__display-name{color:#ecf0f4;display:block;line-height:24px;margin-bottom:15px;overflow:hidden}.detailed-status__display-name strong,.detailed-status__display-name span{display:block;text-overflow:ellipsis;overflow:hidden}.detailed-status__display-name strong{font-size:16px;color:#fff}.detailed-status__display-avatar{float:left;margin-right:10px}.status__avatar{flex:none;margin:0 10px 0 0;height:48px;width:48px}.muted .status__content,.muted .status__content p,.muted .status__content a,.muted .status__content__text{color:#c2cede}.muted .status__display-name strong{color:#c2cede}.muted .status__avatar{opacity:.5}.muted a.status__content__spoiler-link{background:#606984;color:#000}.muted a.status__content__spoiler-link:hover{background:#66718d;text-decoration:none}.status__relative-time:hover,.detailed-status__datetime:hover{text-decoration:underline}.status-card{display:flex;font-size:14px;border:1px solid #393f4f;border-radius:4px;color:#c2cede;margin-top:14px;text-decoration:none;overflow:hidden}.status-card__actions{bottom:0;left:0;position:absolute;right:0;top:0;display:flex;justify-content:center;align-items:center}.status-card__actions>div{background:rgba(0,0,0,.6);border-radius:8px;padding:12px 9px;flex:0 0 auto;display:flex;justify-content:center;align-items:center}.status-card__actions button,.status-card__actions a{display:inline;color:#ecf0f4;background:transparent;border:0;padding:0 8px;text-decoration:none;font-size:18px;line-height:18px}.status-card__actions button:hover,.status-card__actions button:active,.status-card__actions button:focus,.status-card__actions a:hover,.status-card__actions a:active,.status-card__actions a:focus{color:#fff}.status-card__actions a{font-size:19px;position:relative;bottom:-1px}.status-card__actions a .fa,.status-card__actions a:hover .fa{color:inherit}a.status-card{cursor:pointer}a.status-card:hover{background:#393f4f}.status-card-photo{cursor:zoom-in;display:block;text-decoration:none;width:100%;height:auto;margin:0}.status-card-video iframe{width:100%;height:100%}.status-card__title{display:block;font-weight:500;margin-bottom:5px;color:#dde3ec;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-decoration:none}.status-card__content{flex:1 1 auto;overflow:hidden;padding:14px 14px 14px 8px}.status-card__description{color:#dde3ec}.status-card__host{display:block;margin-top:5px;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-card__image{flex:0 0 100px;background:#393f4f;position:relative}.status-card__image>.fa{font-size:21px;position:absolute;transform-origin:50% 50%;top:50%;left:50%;transform:translate(-50%, -50%)}.status-card.horizontal{display:block}.status-card.horizontal .status-card__image{width:100%}.status-card.horizontal .status-card__image-image{border-radius:4px 4px 0 0}.status-card.horizontal .status-card__title{white-space:inherit}.status-card.compact{border-color:#313543}.status-card.compact.interactive{border:0}.status-card.compact .status-card__content{padding:8px;padding-top:10px}.status-card.compact .status-card__title{white-space:nowrap}.status-card.compact .status-card__image{flex:0 0 60px}a.status-card.compact:hover{background-color:#313543}.status-card__image-image{border-radius:4px 0 0 4px;display:block;margin:0;width:100%;height:100%;object-fit:cover;background-size:cover;background-position:center center}.attachment-list{display:flex;font-size:14px;border:1px solid #393f4f;border-radius:4px;margin-top:14px;overflow:hidden}.attachment-list__icon{flex:0 0 auto;color:#c2cede;padding:8px 18px;cursor:default;border-right:1px solid #393f4f;display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:26px}.attachment-list__icon .fa{display:block}.attachment-list__list{list-style:none;padding:4px 0;padding-left:8px;display:flex;flex-direction:column;justify-content:center}.attachment-list__list li{display:block;padding:4px 0}.attachment-list__list a{text-decoration:none;color:#c2cede;font-weight:500}.attachment-list__list a:hover{text-decoration:underline}.attachment-list.compact{border:0;margin-top:4px}.attachment-list.compact .attachment-list__list{padding:0;display:block}.attachment-list.compact .fa{color:#c2cede}.status__wrapper--filtered__button{display:inline;color:#4e79df;border:0;background:transparent;padding:0;font-size:inherit;line-height:inherit}.status__wrapper--filtered__button:hover,.status__wrapper--filtered__button:active{text-decoration:underline}.modal-container--preloader{background:#393f4f}.modal-root{position:relative;transition:opacity .3s linear;will-change:opacity;z-index:9999}.modal-root__overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.7)}.modal-root__container{position:fixed;top:0;left:0;width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;align-content:space-around;z-index:9999;pointer-events:none;user-select:none}.modal-root__modal{pointer-events:auto;display:flex;z-index:9999}.onboarding-modal,.error-modal,.embed-modal{background:#d9e1e8;color:#000;border-radius:8px;overflow:hidden;display:flex;flex-direction:column}.onboarding-modal__pager{height:80vh;width:80vw;max-width:520px;max-height:470px}.onboarding-modal__pager .react-swipeable-view-container>div{width:100%;height:100%;box-sizing:border-box;display:none;flex-direction:column;align-items:center;justify-content:center;display:flex;user-select:text}.error-modal__body{height:80vh;width:80vw;max-width:520px;max-height:420px;position:relative}.error-modal__body>div{position:absolute;top:0;left:0;width:100%;height:100%;box-sizing:border-box;padding:25px;display:none;flex-direction:column;align-items:center;justify-content:center;display:flex;opacity:0;user-select:text}.error-modal__body{display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center}@media screen and (max-width: 550px){.onboarding-modal{width:100%;height:100%;border-radius:0}.onboarding-modal__pager{width:100%;height:auto;max-width:none;max-height:none;flex:1 1 auto}}.onboarding-modal__paginator,.error-modal__footer{flex:0 0 auto;background:#c0cdd9;display:flex;padding:25px}.onboarding-modal__paginator>div,.error-modal__footer>div{min-width:33px}.onboarding-modal__paginator .onboarding-modal__nav,.onboarding-modal__paginator .error-modal__nav,.error-modal__footer .onboarding-modal__nav,.error-modal__footer .error-modal__nav{color:#1b1e25;border:0;font-size:14px;font-weight:500;padding:10px 25px;line-height:inherit;height:auto;margin:-10px;border-radius:4px;background-color:transparent}.onboarding-modal__paginator .onboarding-modal__nav:hover,.onboarding-modal__paginator .onboarding-modal__nav:focus,.onboarding-modal__paginator .onboarding-modal__nav:active,.onboarding-modal__paginator .error-modal__nav:hover,.onboarding-modal__paginator .error-modal__nav:focus,.onboarding-modal__paginator .error-modal__nav:active,.error-modal__footer .onboarding-modal__nav:hover,.error-modal__footer .onboarding-modal__nav:focus,.error-modal__footer .onboarding-modal__nav:active,.error-modal__footer .error-modal__nav:hover,.error-modal__footer .error-modal__nav:focus,.error-modal__footer .error-modal__nav:active{color:#131419;background-color:#a6b9c9}.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next,.error-modal__footer .error-modal__nav.onboarding-modal__done,.error-modal__footer .error-modal__nav.onboarding-modal__next{color:#000}.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:hover,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:focus,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:active,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:hover,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:focus,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:active,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:hover,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:focus,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:active,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:hover,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:focus,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:active,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:hover,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:focus,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:active,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:hover,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:focus,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:active,.error-modal__footer .error-modal__nav.onboarding-modal__done:hover,.error-modal__footer .error-modal__nav.onboarding-modal__done:focus,.error-modal__footer .error-modal__nav.onboarding-modal__done:active,.error-modal__footer .error-modal__nav.onboarding-modal__next:hover,.error-modal__footer .error-modal__nav.onboarding-modal__next:focus,.error-modal__footer .error-modal__nav.onboarding-modal__next:active{color:#0a0a0a}.error-modal__footer{justify-content:center}.onboarding-modal__dots{flex:1 1 auto;display:flex;align-items:center;justify-content:center}.onboarding-modal__dot{width:14px;height:14px;border-radius:14px;background:#a6b9c9;margin:0 3px;cursor:pointer}.onboarding-modal__dot:hover{background:#a0b4c5}.onboarding-modal__dot.active{cursor:default;background:#8da5ba}.onboarding-modal__page__wrapper{pointer-events:none;padding:25px;padding-bottom:0}.onboarding-modal__page__wrapper.onboarding-modal__page__wrapper--active{pointer-events:auto}.onboarding-modal__page{cursor:default;line-height:21px}.onboarding-modal__page h1{font-size:18px;font-weight:500;color:#000;margin-bottom:20px}.onboarding-modal__page a{color:#2b90d9}.onboarding-modal__page a:hover,.onboarding-modal__page a:focus,.onboarding-modal__page a:active{color:#3c99dc}.onboarding-modal__page .navigation-bar a{color:inherit}.onboarding-modal__page p{font-size:16px;color:#1b1e25;margin-top:10px;margin-bottom:10px}.onboarding-modal__page p:last-child{margin-bottom:0}.onboarding-modal__page p strong{font-weight:500;background:#282c37;color:#ecf0f4;border-radius:4px;font-size:14px;padding:3px 6px}.onboarding-modal__page p strong:lang(ja){font-weight:700}.onboarding-modal__page p strong:lang(ko){font-weight:700}.onboarding-modal__page p strong:lang(zh-CN){font-weight:700}.onboarding-modal__page p strong:lang(zh-HK){font-weight:700}.onboarding-modal__page p strong:lang(zh-TW){font-weight:700}.onboarding-modal__page__wrapper-0{height:100%;padding:0}.onboarding-modal__page-one__lead{padding:65px;padding-top:45px;padding-bottom:0;margin-bottom:10px}.onboarding-modal__page-one__lead h1{font-size:26px;line-height:36px;margin-bottom:8px}.onboarding-modal__page-one__lead p{margin-bottom:0}.onboarding-modal__page-one__extra{padding-right:65px;padding-left:185px;text-align:center}.display-case{text-align:center;font-size:15px;margin-bottom:15px}.display-case__label{font-weight:500;color:#000;margin-bottom:5px;text-transform:uppercase;font-size:12px}.display-case__case{background:#282c37;color:#ecf0f4;font-weight:500;padding:10px;border-radius:4px}.onboarding-modal__page-two p,.onboarding-modal__page-three p,.onboarding-modal__page-four p,.onboarding-modal__page-five p{text-align:left}.onboarding-modal__page-two .figure,.onboarding-modal__page-three .figure,.onboarding-modal__page-four .figure,.onboarding-modal__page-five .figure{background:#17191f;color:#ecf0f4;margin-bottom:20px;border-radius:4px;padding:10px;text-align:center;font-size:14px;box-shadow:1px 2px 6px rgba(0,0,0,.3)}.onboarding-modal__page-two .figure .onboarding-modal__image,.onboarding-modal__page-three .figure .onboarding-modal__image,.onboarding-modal__page-four .figure .onboarding-modal__image,.onboarding-modal__page-five .figure .onboarding-modal__image{border-radius:4px;margin-bottom:10px}.onboarding-modal__page-two .figure.non-interactive,.onboarding-modal__page-three .figure.non-interactive,.onboarding-modal__page-four .figure.non-interactive,.onboarding-modal__page-five .figure.non-interactive{pointer-events:none;text-align:left}.onboarding-modal__page-four__columns .row{display:flex;margin-bottom:20px}.onboarding-modal__page-four__columns .row>div{flex:1 1 0;margin:0 10px}.onboarding-modal__page-four__columns .row>div:first-child{margin-left:0}.onboarding-modal__page-four__columns .row>div:last-child{margin-right:0}.onboarding-modal__page-four__columns .row>div p{text-align:center}.onboarding-modal__page-four__columns .row:last-child{margin-bottom:0}.onboarding-modal__page-four__columns .column-header{color:#fff}@media screen and (max-width: 320px)and (max-height: 600px){.onboarding-modal__page p{font-size:14px;line-height:20px}.onboarding-modal__page-two .figure,.onboarding-modal__page-three .figure,.onboarding-modal__page-four .figure,.onboarding-modal__page-five .figure{font-size:12px;margin-bottom:10px}.onboarding-modal__page-four__columns .row{margin-bottom:10px}.onboarding-modal__page-four__columns .column-header{padding:5px;font-size:12px}}.onboard-sliders{display:inline-block;max-width:30px;max-height:auto;margin-left:10px}.boost-modal,.doodle-modal,.favourite-modal,.confirmation-modal,.report-modal,.actions-modal,.mute-modal,.block-modal{background:#f2f5f7;color:#000;border-radius:8px;overflow:hidden;max-width:90vw;width:480px;position:relative;flex-direction:column}.boost-modal .status__relative-time,.doodle-modal .status__relative-time,.favourite-modal .status__relative-time,.confirmation-modal .status__relative-time,.report-modal .status__relative-time,.actions-modal .status__relative-time,.mute-modal .status__relative-time,.block-modal .status__relative-time{color:#c2cede;float:right;font-size:14px;width:auto;margin:initial;padding:initial}.boost-modal .status__display-name,.doodle-modal .status__display-name,.favourite-modal .status__display-name,.confirmation-modal .status__display-name,.report-modal .status__display-name,.actions-modal .status__display-name,.mute-modal .status__display-name,.block-modal .status__display-name{display:flex}.boost-modal .status__avatar,.doodle-modal .status__avatar,.favourite-modal .status__avatar,.confirmation-modal .status__avatar,.report-modal .status__avatar,.actions-modal .status__avatar,.mute-modal .status__avatar,.block-modal .status__avatar{height:48px;width:48px}.boost-modal .status__content__spoiler-link,.doodle-modal .status__content__spoiler-link,.favourite-modal .status__content__spoiler-link,.confirmation-modal .status__content__spoiler-link,.report-modal .status__content__spoiler-link,.actions-modal .status__content__spoiler-link,.mute-modal .status__content__spoiler-link,.block-modal .status__content__spoiler-link{color:#fff}.actions-modal .status{background:#fff;border-bottom-color:#d9e1e8;padding-top:10px;padding-bottom:10px}.actions-modal .dropdown-menu__separator{border-bottom-color:#d9e1e8}.boost-modal__container,.favourite-modal__container{overflow-x:scroll;padding:10px}.boost-modal__container .status,.favourite-modal__container .status{user-select:text;border-bottom:0}.boost-modal__action-bar,.doodle-modal__action-bar,.favourite-modal__action-bar,.confirmation-modal__action-bar,.mute-modal__action-bar,.block-modal__action-bar{display:flex;justify-content:space-between;background:#d9e1e8;padding:10px;line-height:36px}.boost-modal__action-bar>div,.doodle-modal__action-bar>div,.favourite-modal__action-bar>div,.confirmation-modal__action-bar>div,.mute-modal__action-bar>div,.block-modal__action-bar>div{flex:1 1 auto;text-align:right;color:#1b1e25;padding-right:10px}.boost-modal__action-bar .button,.doodle-modal__action-bar .button,.favourite-modal__action-bar .button,.confirmation-modal__action-bar .button,.mute-modal__action-bar .button,.block-modal__action-bar .button{flex:0 0 auto}.boost-modal__status-header,.favourite-modal__status-header{font-size:15px}.boost-modal__status-time,.favourite-modal__status-time{float:right;font-size:14px}.mute-modal,.block-modal{line-height:24px}.mute-modal .react-toggle,.block-modal .react-toggle{vertical-align:middle}.report-modal{width:90vw;max-width:700px}.report-modal__container{display:flex;border-top:1px solid #d9e1e8}@media screen and (max-width: 480px){.report-modal__container{flex-wrap:wrap;overflow-y:auto}}.report-modal__statuses,.report-modal__comment{box-sizing:border-box;width:50%}@media screen and (max-width: 480px){.report-modal__statuses,.report-modal__comment{width:100%}}.report-modal__statuses,.focal-point-modal__content{flex:1 1 auto;min-height:20vh;max-height:80vh;overflow-y:auto;overflow-x:hidden}.report-modal__statuses .status__content a,.focal-point-modal__content .status__content a{color:#2b90d9}@media screen and (max-width: 480px){.report-modal__statuses,.focal-point-modal__content{max-height:10vh}}@media screen and (max-width: 480px){.focal-point-modal__content{max-height:40vh}}.report-modal__comment{padding:20px;border-right:1px solid #d9e1e8;max-width:320px}.report-modal__comment p{font-size:14px;line-height:20px;margin-bottom:20px}.report-modal__comment .setting-text{display:block;box-sizing:border-box;width:100%;margin:0;color:#000;background:#fff;padding:10px;font-family:inherit;font-size:14px;resize:none;border:0;outline:0;border-radius:4px;border:1px solid #d9e1e8;min-height:100px;max-height:50vh;margin-bottom:10px}.report-modal__comment .setting-text:focus{border:1px solid #c0cdd9}.report-modal__comment .setting-text__wrapper{background:#fff;border:1px solid #d9e1e8;margin-bottom:10px;border-radius:4px}.report-modal__comment .setting-text__wrapper .setting-text{border:0;margin-bottom:0;border-radius:0}.report-modal__comment .setting-text__wrapper .setting-text:focus{border:0}.report-modal__comment .setting-text__wrapper__modifiers{color:#000;font-family:inherit;font-size:14px;background:#fff}.report-modal__comment .setting-text__toolbar{display:flex;justify-content:space-between;margin-bottom:20px}.report-modal__comment .setting-text-label{display:block;color:#000;font-size:14px;font-weight:500;margin-bottom:10px}.report-modal__comment .setting-toggle{margin-top:20px;margin-bottom:24px}.report-modal__comment .setting-toggle__label{color:#000;font-size:14px}@media screen and (max-width: 480px){.report-modal__comment{padding:10px;max-width:100%;order:2}.report-modal__comment .setting-toggle{margin-bottom:4px}}.actions-modal{max-height:80vh;max-width:80vw}.actions-modal .status{overflow-y:auto;max-height:300px}.actions-modal strong{display:block;font-weight:500}.actions-modal .actions-modal__item-label{font-weight:500}.actions-modal ul{overflow-y:auto;flex-shrink:0;max-height:80vh}.actions-modal ul.with-status{max-height:calc(80vh - 75px)}.actions-modal ul li:empty{margin:0}.actions-modal ul li:not(:empty) a{color:#000;display:flex;padding:12px 16px;font-size:15px;align-items:center;text-decoration:none}.actions-modal ul li:not(:empty) a,.actions-modal ul li:not(:empty) a button{transition:none}.actions-modal ul li:not(:empty) a.active,.actions-modal ul li:not(:empty) a.active button,.actions-modal ul li:not(:empty) a:hover,.actions-modal ul li:not(:empty) a:hover button,.actions-modal ul li:not(:empty) a:active,.actions-modal ul li:not(:empty) a:active button,.actions-modal ul li:not(:empty) a:focus,.actions-modal ul li:not(:empty) a:focus button{background:#2b5fd9;color:#fff}.actions-modal ul li:not(:empty) a>.react-toggle,.actions-modal ul li:not(:empty) a>.icon,.actions-modal ul li:not(:empty) a button:first-child{margin-right:10px}.confirmation-modal__action-bar .confirmation-modal__secondary-button,.mute-modal__action-bar .confirmation-modal__secondary-button,.block-modal__action-bar .confirmation-modal__secondary-button{flex-shrink:1}.confirmation-modal__secondary-button,.confirmation-modal__cancel-button,.mute-modal__cancel-button,.block-modal__cancel-button{background-color:transparent;color:#1b1e25;font-size:14px;font-weight:500}.confirmation-modal__secondary-button:hover,.confirmation-modal__secondary-button:focus,.confirmation-modal__secondary-button:active,.confirmation-modal__cancel-button:hover,.confirmation-modal__cancel-button:focus,.confirmation-modal__cancel-button:active,.mute-modal__cancel-button:hover,.mute-modal__cancel-button:focus,.mute-modal__cancel-button:active,.block-modal__cancel-button:hover,.block-modal__cancel-button:focus,.block-modal__cancel-button:active{color:#131419;background-color:transparent}.confirmation-modal__do_not_ask_again{padding-left:20px;padding-right:20px;padding-bottom:10px;font-size:14px}.confirmation-modal__do_not_ask_again label,.confirmation-modal__do_not_ask_again input{vertical-align:middle}.confirmation-modal__container,.mute-modal__container,.block-modal__container,.report-modal__target{padding:30px;font-size:16px}.confirmation-modal__container strong,.mute-modal__container strong,.block-modal__container strong,.report-modal__target strong{font-weight:500}.confirmation-modal__container strong:lang(ja),.mute-modal__container strong:lang(ja),.block-modal__container strong:lang(ja),.report-modal__target strong:lang(ja){font-weight:700}.confirmation-modal__container strong:lang(ko),.mute-modal__container strong:lang(ko),.block-modal__container strong:lang(ko),.report-modal__target strong:lang(ko){font-weight:700}.confirmation-modal__container strong:lang(zh-CN),.mute-modal__container strong:lang(zh-CN),.block-modal__container strong:lang(zh-CN),.report-modal__target strong:lang(zh-CN){font-weight:700}.confirmation-modal__container strong:lang(zh-HK),.mute-modal__container strong:lang(zh-HK),.block-modal__container strong:lang(zh-HK),.report-modal__target strong:lang(zh-HK){font-weight:700}.confirmation-modal__container strong:lang(zh-TW),.mute-modal__container strong:lang(zh-TW),.block-modal__container strong:lang(zh-TW),.report-modal__target strong:lang(zh-TW){font-weight:700}.confirmation-modal__container,.report-modal__target{text-align:center}.block-modal__explanation,.mute-modal__explanation{margin-top:20px}.block-modal .setting-toggle,.mute-modal .setting-toggle{margin-top:20px;margin-bottom:24px;display:flex;align-items:center}.block-modal .setting-toggle__label,.mute-modal .setting-toggle__label{color:#000;margin:0;margin-left:8px}.report-modal__target{padding:15px}.report-modal__target .media-modal__close{top:14px;right:15px}.embed-modal{width:auto;max-width:80vw;max-height:80vh}.embed-modal h4{padding:30px;font-weight:500;font-size:16px;text-align:center}.embed-modal .embed-modal__container{padding:10px}.embed-modal .embed-modal__container .hint{margin-bottom:15px}.embed-modal .embed-modal__container .embed-modal__html{outline:0;box-sizing:border-box;display:block;width:100%;border:none;padding:10px;font-family:\"mastodon-font-monospace\",monospace;background:#282c37;color:#fff;font-size:14px;margin:0;margin-bottom:15px;border-radius:4px}.embed-modal .embed-modal__container .embed-modal__html::-moz-focus-inner{border:0}.embed-modal .embed-modal__container .embed-modal__html::-moz-focus-inner,.embed-modal .embed-modal__container .embed-modal__html:focus,.embed-modal .embed-modal__container .embed-modal__html:active{outline:0 !important}.embed-modal .embed-modal__container .embed-modal__html:focus{background:#313543}@media screen and (max-width: 600px){.embed-modal .embed-modal__container .embed-modal__html{font-size:16px}}.embed-modal .embed-modal__container .embed-modal__iframe{width:400px;max-width:100%;overflow:hidden;border:0;border-radius:4px}.focal-point{position:relative;cursor:move;overflow:hidden;height:100%;display:flex;justify-content:center;align-items:center;background:#000}.focal-point img,.focal-point video,.focal-point canvas{display:block;max-height:80vh;width:100%;height:auto;margin:0;object-fit:contain;background:#000}.focal-point__reticle{position:absolute;width:100px;height:100px;transform:translate(-50%, -50%);background:url(\"~images/reticle.png\") no-repeat 0 0;border-radius:50%;box-shadow:0 0 0 9999em rgba(0,0,0,.35)}.focal-point__overlay{position:absolute;width:100%;height:100%;top:0;left:0}.focal-point__preview{position:absolute;bottom:10px;right:10px;z-index:2;cursor:move;transition:opacity .1s ease}.focal-point__preview:hover{opacity:.5}.focal-point__preview strong{color:#fff;font-size:14px;font-weight:500;display:block;margin-bottom:5px}.focal-point__preview div{border-radius:4px;box-shadow:0 0 14px rgba(0,0,0,.2)}@media screen and (max-width: 480px){.focal-point img,.focal-point video{max-height:100%}.focal-point__preview{display:none}}.filtered-status-info{text-align:start}.filtered-status-info .spoiler__text{margin-top:20px}.filtered-status-info .account{border-bottom:0}.filtered-status-info .account__display-name strong{color:#000}.filtered-status-info .status__content__spoiler{display:none}.filtered-status-info .status__content__spoiler--visible{display:flex}.filtered-status-info ul{padding:10px;margin-left:12px;list-style:disc inside}.filtered-status-info .filtered-status-edit-link{color:#8d9ac2;text-decoration:none}.filtered-status-info .filtered-status-edit-link:hover{text-decoration:underline}.composer{padding:10px}.composer .emoji-picker-dropdown{position:absolute;top:0;right:0}.composer .emoji-picker-dropdown ::-webkit-scrollbar-track:hover,.composer .emoji-picker-dropdown ::-webkit-scrollbar-track:active{background-color:rgba(0,0,0,.3)}.character-counter{cursor:default;font-family:sans-serif,sans-serif;font-size:14px;font-weight:600;color:#1b1e25}.character-counter.character-counter--over{color:#ff5050}.no-reduce-motion .composer--spoiler{transition:height .4s ease,opacity .4s ease}.composer--spoiler{height:0;transform-origin:bottom;opacity:0}.composer--spoiler.composer--spoiler--visible{height:36px;margin-bottom:11px;opacity:1}.composer--spoiler input{display:block;box-sizing:border-box;margin:0;border:none;border-radius:4px;padding:10px;width:100%;outline:0;color:#000;background:#fff;font-size:14px;font-family:inherit;resize:vertical}.composer--spoiler input::placeholder{color:#c2cede}.composer--spoiler input:focus{outline:0}@media screen and (max-width: 630px){.auto-columns .composer--spoiler input{font-size:16px}}.single-column .composer--spoiler input{font-size:16px}.composer--warning{color:#000;margin-bottom:15px;background:#9baec8;box-shadow:0 2px 6px rgba(0,0,0,.3);padding:8px 10px;border-radius:4px;font-size:13px;font-weight:400}.composer--warning a{color:#1b1e25;font-weight:500;text-decoration:underline}.composer--warning a:active,.composer--warning a:focus,.composer--warning a:hover{text-decoration:none}.compose-form__sensitive-button{padding:10px;padding-top:0;font-size:14px;font-weight:500}.compose-form__sensitive-button.active{color:#2b90d9}.compose-form__sensitive-button input[type=checkbox]{display:none}.compose-form__sensitive-button .checkbox{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-left:5px;margin-right:10px;top:-1px;border-radius:4px;vertical-align:middle}.compose-form__sensitive-button .checkbox.active{border-color:#2b90d9;background:#2b90d9}.composer--reply{margin:0 0 10px;border-radius:4px;padding:10px;background:#9baec8;min-height:23px;overflow-y:auto;flex:0 2 auto}.composer--reply>header{margin-bottom:5px;overflow:hidden}.composer--reply>header>.account.small{color:#000}.composer--reply>header>.cancel{float:right;line-height:24px}.composer--reply>.content{position:relative;margin:10px 0;padding:0 12px;font-size:14px;line-height:20px;color:#000;word-wrap:break-word;font-weight:400;overflow:visible;white-space:pre-wrap;padding-top:5px;overflow:hidden}.composer--reply>.content p,.composer--reply>.content pre,.composer--reply>.content blockquote{margin-bottom:20px;white-space:pre-wrap}.composer--reply>.content p:last-child,.composer--reply>.content pre:last-child,.composer--reply>.content blockquote:last-child{margin-bottom:0}.composer--reply>.content h1,.composer--reply>.content h2,.composer--reply>.content h3,.composer--reply>.content h4,.composer--reply>.content h5{margin-top:20px;margin-bottom:20px}.composer--reply>.content h1,.composer--reply>.content h2{font-weight:700;font-size:18px}.composer--reply>.content h2{font-size:16px}.composer--reply>.content h3,.composer--reply>.content h4,.composer--reply>.content h5{font-weight:500}.composer--reply>.content blockquote{padding-left:10px;border-left:3px solid #000;color:#000;white-space:normal}.composer--reply>.content blockquote p:last-child{margin-bottom:0}.composer--reply>.content b,.composer--reply>.content strong{font-weight:700}.composer--reply>.content em,.composer--reply>.content i{font-style:italic}.composer--reply>.content sub{font-size:smaller;text-align:sub}.composer--reply>.content ul,.composer--reply>.content ol{margin-left:1em}.composer--reply>.content ul p,.composer--reply>.content ol p{margin:0}.composer--reply>.content ul{list-style-type:disc}.composer--reply>.content ol{list-style-type:decimal}.composer--reply>.content a{color:#1b1e25;text-decoration:none}.composer--reply>.content a:hover{text-decoration:underline}.composer--reply>.content a.mention:hover{text-decoration:none}.composer--reply>.content a.mention:hover span{text-decoration:underline}.composer--reply .emojione{width:20px;height:20px;margin:-5px 0 0}.compose-form__autosuggest-wrapper,.autosuggest-input{position:relative;width:100%}.compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea,.autosuggest-input label .autosuggest-textarea__textarea{display:block;box-sizing:border-box;margin:0;border:none;border-radius:4px 4px 0 0;padding:10px 32px 0 10px;width:100%;min-height:100px;outline:0;color:#000;background:#fff;font-size:14px;font-family:inherit;resize:none;scrollbar-color:initial}.compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea::placeholder,.autosuggest-input label .autosuggest-textarea__textarea::placeholder{color:#c2cede}.compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea::-webkit-scrollbar,.autosuggest-input label .autosuggest-textarea__textarea::-webkit-scrollbar{all:unset}.compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea:disabled,.autosuggest-input label .autosuggest-textarea__textarea:disabled{background:#d9e1e8}.compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea:focus,.autosuggest-input label .autosuggest-textarea__textarea:focus{outline:0}@media screen and (max-width: 630px){.auto-columns .compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea,.auto-columns .autosuggest-input label .autosuggest-textarea__textarea{font-size:16px}}.single-column .compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea,.single-column .autosuggest-input label .autosuggest-textarea__textarea{font-size:16px}@media screen and (max-width: 600px){.auto-columns .compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea,.single-column .compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea,.auto-columns .autosuggest-input label .autosuggest-textarea__textarea,.single-column .autosuggest-input label .autosuggest-textarea__textarea{height:100px !important;resize:vertical}}.composer--textarea--icons{display:block;position:absolute;top:29px;right:5px;bottom:5px;overflow:hidden}.composer--textarea--icons>.textarea_icon{display:block;margin:2px 0 0 2px;width:24px;height:24px;color:#1b1e25;font-size:18px;line-height:24px;text-align:center;opacity:.8}.autosuggest-textarea__suggestions-wrapper{position:relative;height:0}.autosuggest-textarea__suggestions{display:block;position:absolute;box-sizing:border-box;top:100%;border-radius:0 0 4px 4px;padding:6px;width:100%;color:#000;background:#d9e1e8;box-shadow:4px 4px 6px rgba(0,0,0,.4);font-size:14px;z-index:99;display:none}.autosuggest-textarea__suggestions--visible{display:block}.autosuggest-textarea__suggestions__item{padding:10px;cursor:pointer;border-radius:4px}.autosuggest-textarea__suggestions__item:hover,.autosuggest-textarea__suggestions__item:focus,.autosuggest-textarea__suggestions__item:active,.autosuggest-textarea__suggestions__item.selected{background:#b9c8d5}.autosuggest-textarea__suggestions__item>.account,.autosuggest-textarea__suggestions__item>.emoji,.autosuggest-textarea__suggestions__item>.autosuggest-hashtag{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;line-height:18px;font-size:14px}.autosuggest-textarea__suggestions__item .autosuggest-hashtag{justify-content:space-between}.autosuggest-textarea__suggestions__item .autosuggest-hashtag__name{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.autosuggest-textarea__suggestions__item .autosuggest-hashtag strong{font-weight:500}.autosuggest-textarea__suggestions__item .autosuggest-hashtag__uses{flex:0 0 auto;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.autosuggest-textarea__suggestions__item>.account.small .display-name>span{color:#1b1e25}.composer--upload_form{overflow:hidden}.composer--upload_form>.content{display:flex;flex-direction:row;flex-wrap:wrap;font-family:inherit;padding:5px;overflow:hidden}.composer--upload_form--item{flex:1 1 0;margin:5px;min-width:40%}.composer--upload_form--item>div{position:relative;border-radius:4px;height:140px;width:100%;background-color:#000;background-position:center;background-size:cover;background-repeat:no-repeat;overflow:hidden}.composer--upload_form--item>div textarea{display:block;position:absolute;box-sizing:border-box;bottom:0;left:0;margin:0;border:0;padding:10px;width:100%;color:#ecf0f4;background:linear-gradient(0deg, rgba(0, 0, 0, 0.8) 0, rgba(0, 0, 0, 0.35) 80%, transparent);font-size:14px;font-family:inherit;font-weight:500;opacity:0;z-index:2;transition:opacity .1s ease}.composer--upload_form--item>div textarea:focus{color:#fff}.composer--upload_form--item>div textarea::placeholder{opacity:.54;color:#ecf0f4}.composer--upload_form--item>div>.close{mix-blend-mode:difference}.composer--upload_form--item.active>div textarea{opacity:1}.composer--upload_form--actions{background:linear-gradient(180deg, rgba(0, 0, 0, 0.8) 0, rgba(0, 0, 0, 0.35) 80%, transparent);display:flex;align-items:flex-start;justify-content:space-between;opacity:0;transition:opacity .1s ease}.composer--upload_form--actions .icon-button{flex:0 1 auto;color:#d9e1e8;font-size:14px;font-weight:500;padding:10px;font-family:inherit}.composer--upload_form--actions .icon-button:hover,.composer--upload_form--actions .icon-button:focus,.composer--upload_form--actions .icon-button:active{color:#e6ebf0}.composer--upload_form--actions.active{opacity:1}.composer--upload_form--progress{display:flex;padding:10px;color:#dde3ec;overflow:hidden}.composer--upload_form--progress>.fa{font-size:34px;margin-right:10px}.composer--upload_form--progress>.message{flex:1 1 auto}.composer--upload_form--progress>.message>span{display:block;font-size:12px;font-weight:500;text-transform:uppercase}.composer--upload_form--progress>.message>.backdrop{position:relative;margin-top:5px;border-radius:6px;width:100%;height:6px;background:#606984}.composer--upload_form--progress>.message>.backdrop>.tracker{position:absolute;top:0;left:0;height:6px;border-radius:6px;background:#2b5fd9}.compose-form__modifiers{color:#000;font-family:inherit;font-size:14px;background:#fff}.composer--options-wrapper{padding:10px;background:#ebebeb;border-radius:0 0 4px 4px;height:27px;display:flex;justify-content:space-between;flex:0 0 auto}.composer--options{display:flex;flex:0 0 auto}.composer--options>*{display:inline-block;box-sizing:content-box;padding:0 3px;height:27px;line-height:27px;vertical-align:bottom}.composer--options>hr{display:inline-block;margin:0 3px;border-width:0 0 0 1px;border-style:none none none solid;border-color:transparent transparent transparent #c2c2c2;padding:0;width:0;height:27px;background:transparent}.compose--counter-wrapper{align-self:center;margin-right:4px}.composer--options--dropdown.open>.value{border-radius:4px 4px 0 0;box-shadow:0 -4px 4px rgba(0,0,0,.1);color:#fff;background:#2b5fd9;transition:none}.composer--options--dropdown.open.top>.value{border-radius:0 0 4px 4px;box-shadow:0 4px 4px rgba(0,0,0,.1)}.composer--options--dropdown--content{position:absolute;border-radius:4px;box-shadow:2px 4px 15px rgba(0,0,0,.4);background:#fff;overflow:hidden;transform-origin:50% 0}.composer--options--dropdown--content--item{display:flex;align-items:center;padding:10px;color:#000;cursor:pointer}.composer--options--dropdown--content--item>.content{flex:1 1 auto;color:#1b1e25}.composer--options--dropdown--content--item>.content:not(:first-child){margin-left:10px}.composer--options--dropdown--content--item>.content strong{display:block;color:#000;font-weight:500}.composer--options--dropdown--content--item:hover,.composer--options--dropdown--content--item.active{background:#2b5fd9;color:#fff}.composer--options--dropdown--content--item:hover>.content,.composer--options--dropdown--content--item.active>.content{color:#fff}.composer--options--dropdown--content--item:hover>.content strong,.composer--options--dropdown--content--item.active>.content strong{color:#fff}.composer--options--dropdown--content--item.active:hover{background:#3c6cdc}.composer--publisher{padding-top:10px;text-align:right;white-space:nowrap;overflow:hidden;justify-content:flex-end;flex:0 0 auto}.composer--publisher>.primary{display:inline-block;margin:0;padding:0 10px;text-align:center}.composer--publisher>.side_arm{display:inline-block;margin:0 2px;padding:0;width:36px;text-align:center}.composer--publisher.over>.count{color:#ff5050}.column__wrapper{display:flex;flex:1 1 auto;position:relative}.columns-area{display:flex;flex:1 1 auto;flex-direction:row;justify-content:flex-start;overflow-x:auto;position:relative}.columns-area__panels{display:flex;justify-content:center;width:100%;height:100%;min-height:100vh}.columns-area__panels__pane{height:100%;overflow:hidden;pointer-events:none;display:flex;justify-content:flex-end;min-width:285px}.columns-area__panels__pane--start{justify-content:flex-start}.columns-area__panels__pane__inner{position:fixed;width:285px;pointer-events:auto;height:100%}.columns-area__panels__main{box-sizing:border-box;width:100%;max-width:600px;flex:0 0 auto;display:flex;flex-direction:column}@media screen and (min-width: 415px){.columns-area__panels__main{padding:0 10px}}.tabs-bar__wrapper{background:#17191f;position:sticky;top:0;z-index:2;padding-top:0}@media screen and (min-width: 415px){.tabs-bar__wrapper{padding-top:10px}}.tabs-bar__wrapper .tabs-bar{margin-bottom:0}@media screen and (min-width: 415px){.tabs-bar__wrapper .tabs-bar{margin-bottom:10px}}.react-swipeable-view-container,.react-swipeable-view-container .columns-area,.react-swipeable-view-container .column{height:100%}.react-swipeable-view-container>*{display:flex;align-items:center;justify-content:center;height:100%}.column{width:330px;position:relative;box-sizing:border-box;display:flex;flex-direction:column}.column>.scrollable{background:#282c37}.ui{flex:0 0 auto;display:flex;flex-direction:column;width:100%;height:100%}.column{overflow:hidden}.column-back-button{box-sizing:border-box;width:100%;background:#313543;color:#2b90d9;cursor:pointer;flex:0 0 auto;font-size:16px;border:0;text-align:unset;padding:15px;margin:0;z-index:3}.column-back-button:hover{text-decoration:underline}.column-header__back-button{background:#313543;border:0;font-family:inherit;color:#2b90d9;cursor:pointer;flex:0 0 auto;font-size:16px;padding:0 5px 0 0;z-index:3}.column-header__back-button:hover{text-decoration:underline}.column-header__back-button:last-child{padding:0 15px 0 0}.column-back-button__icon{display:inline-block;margin-right:5px}.column-back-button--slim{position:relative}.column-back-button--slim-button{cursor:pointer;flex:0 0 auto;font-size:16px;padding:15px;position:absolute;right:0;top:-48px}.column-link{background:#393f4f;color:#fff;display:block;font-size:16px;padding:15px;text-decoration:none}.column-link:hover,.column-link:focus,.column-link:active{background:#404657}.column-link:focus{outline:0}.column-link--transparent{background:transparent;color:#d9e1e8}.column-link--transparent:hover,.column-link--transparent:focus,.column-link--transparent:active{background:transparent;color:#fff}.column-link--transparent.active{color:#2b5fd9}.column-link__icon{display:inline-block;margin-right:5px}.column-subheading{background:#282c37;color:#c2cede;padding:8px 20px;font-size:12px;font-weight:500;text-transform:uppercase;cursor:default}.column-header__wrapper{position:relative;flex:0 0 auto;z-index:1}.column-header__wrapper.active{box-shadow:0 1px 0 rgba(43,144,217,.3)}.column-header__wrapper.active::before{display:block;content:\"\";position:absolute;bottom:-13px;left:0;right:0;margin:0 auto;width:60%;pointer-events:none;height:28px;z-index:1;background:radial-gradient(ellipse, rgba(43, 95, 217, 0.23) 0%, rgba(43, 95, 217, 0) 60%)}.column-header__wrapper .announcements{z-index:1;position:relative}.column-header{display:flex;font-size:16px;background:#313543;flex:0 0 auto;cursor:pointer;position:relative;z-index:2;outline:0;overflow:hidden}.column-header>button{margin:0;border:none;padding:15px;color:inherit;background:transparent;font:inherit;text-align:left;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;flex:1}.column-header>.column-header__back-button{color:#2b90d9}.column-header.active .column-header__icon{color:#2b90d9;text-shadow:0 0 10px rgba(43,95,217,.4)}.column-header:focus,.column-header:active{outline:0}.column{width:330px;position:relative;box-sizing:border-box;display:flex;flex-direction:column;overflow:hidden}.wide .columns-area:not(.columns-area--mobile) .column{flex:auto;min-width:330px;max-width:400px}.column>.scrollable{background:#282c37}.column-header__buttons{height:48px;display:flex;margin-left:0}.column-header__links{margin-bottom:14px}.column-header__links .text-btn{margin-right:10px}.column-header__button,.column-header__notif-cleaning-buttons button{background:#313543;border:0;color:#dde3ec;cursor:pointer;font-size:16px;padding:0 15px}.column-header__button:hover,.column-header__notif-cleaning-buttons button:hover{color:#f4f6f9}.column-header__button.active,.column-header__notif-cleaning-buttons button.active{color:#fff;background:#393f4f}.column-header__button.active:hover,.column-header__notif-cleaning-buttons button.active:hover{color:#fff;background:#393f4f}.column-header__button:focus,.column-header__notif-cleaning-buttons button:focus{text-shadow:0 0 4px #2454c7}.column-header__notif-cleaning-buttons{display:flex;align-items:stretch;justify-content:space-around}.column-header__notif-cleaning-buttons button{background:transparent;text-align:center;padding:10px 0;white-space:pre-wrap}.column-header__notif-cleaning-buttons b{font-weight:bold}.column-header__collapsible-inner.nopad-drawer{padding:0}.column-header__collapsible{max-height:70vh;overflow:hidden;overflow-y:auto;color:#dde3ec;transition:max-height 150ms ease-in-out,opacity 300ms linear;opacity:1;z-index:1;position:relative}.column-header__collapsible.collapsed{max-height:0;opacity:.5}.column-header__collapsible.animating{overflow-y:hidden}.column-header__collapsible hr{height:0;background:transparent;border:0;border-top:1px solid #42485a;margin:10px 0}.column-header__collapsible.ncd{transition:none}.column-header__collapsible.ncd.collapsed{max-height:0;opacity:.7}.column-header__collapsible-inner{background:#393f4f;padding:15px}.column-header__setting-btn:hover{color:#dde3ec;text-decoration:underline}.column-header__setting-arrows{float:right}.column-header__setting-arrows .column-header__setting-btn{padding:0 10px}.column-header__setting-arrows .column-header__setting-btn:last-child{padding-right:0}.column-header__title{display:inline-block;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;flex:1}.column-header__icon{display:inline-block;margin-right:5px}.empty-column-indicator,.error-column,.follow_requests-unlocked_explanation{color:#c2cede;background:#282c37;text-align:center;padding:20px;font-size:15px;font-weight:400;cursor:default;display:flex;flex:1 1 auto;align-items:center;justify-content:center}@supports(display: grid){.empty-column-indicator,.error-column,.follow_requests-unlocked_explanation{contain:strict}}.empty-column-indicator>span,.error-column>span,.follow_requests-unlocked_explanation>span{max-width:400px}.empty-column-indicator a,.error-column a,.follow_requests-unlocked_explanation a{color:#2b90d9;text-decoration:none}.empty-column-indicator a:hover,.error-column a:hover,.follow_requests-unlocked_explanation a:hover{text-decoration:underline}.follow_requests-unlocked_explanation{background:#1f232b;contain:initial}.error-column{flex-direction:column}.single-column.navbar-under .tabs-bar{margin-top:0 !important;margin-bottom:-6px !important}@media screen and (max-width: 415px){.auto-columns.navbar-under .tabs-bar{margin-top:0 !important;margin-bottom:-6px !important}}@media screen and (max-width: 415px){.auto-columns.navbar-under .react-swipeable-view-container .columns-area,.single-column.navbar-under .react-swipeable-view-container .columns-area{height:100% !important}}.column-inline-form{padding:7px 15px;padding-right:5px;display:flex;justify-content:flex-start;align-items:center;background:#313543}.column-inline-form label{flex:1 1 auto}.column-inline-form label input{width:100%;margin-bottom:6px}.column-inline-form label input:focus{outline:0}.column-inline-form .icon-button{flex:0 0 auto;margin:0 5px}.regeneration-indicator{text-align:center;font-size:16px;font-weight:500;color:#c2cede;background:#282c37;cursor:default;display:flex;flex:1 1 auto;flex-direction:column;align-items:center;justify-content:center;padding:20px}.regeneration-indicator__figure,.regeneration-indicator__figure img{display:block;width:auto;height:160px;margin:0}.regeneration-indicator--without-header{padding-top:68px}.regeneration-indicator__label{margin-top:30px}.regeneration-indicator__label strong{display:block;margin-bottom:10px;color:#c2cede}.regeneration-indicator__label span{font-size:15px;font-weight:400}.directory__list{width:100%;margin:10px 0;transition:opacity 100ms ease-in}.directory__list.loading{opacity:.7}@media screen and (max-width: 415px){.directory__list{margin:0}}.directory__card{box-sizing:border-box;margin-bottom:10px}.directory__card__img{height:125px;position:relative;background:#0e1014;overflow:hidden}.directory__card__img img{display:block;width:100%;height:100%;margin:0;object-fit:cover}.directory__card__bar{display:flex;align-items:center;background:#313543;padding:10px}.directory__card__bar__name{flex:1 1 auto;display:flex;align-items:center;text-decoration:none;overflow:hidden}.directory__card__bar__relationship{width:23px;min-height:1px;flex:0 0 auto}.directory__card__bar .avatar{flex:0 0 auto;width:48px;height:48px;padding-top:2px}.directory__card__bar .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px;background:#17191f;object-fit:cover}.directory__card__bar .display-name{margin-left:15px;text-align:left}.directory__card__bar .display-name strong{font-size:15px;color:#fff;font-weight:500;overflow:hidden;text-overflow:ellipsis}.directory__card__bar .display-name span{display:block;font-size:14px;color:#dde3ec;font-weight:400;overflow:hidden;text-overflow:ellipsis}.directory__card__extra{background:#282c37;display:flex;align-items:center;justify-content:center}.directory__card__extra .accounts-table__count{width:33.33%;flex:0 0 auto;padding:15px 0}.directory__card__extra .account__header__content{box-sizing:border-box;padding:15px 10px;border-bottom:1px solid #393f4f;width:100%;min-height:48px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.directory__card__extra .account__header__content p{display:none}.directory__card__extra .account__header__content p:first-child{display:inline}.directory__card__extra .account__header__content br{display:none}.filter-form{background:#282c37}.filter-form__column{padding:10px 15px}.filter-form .radio-button{display:block}.radio-button{font-size:14px;position:relative;display:inline-block;padding:6px 0;line-height:18px;cursor:default;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer}.radio-button input[type=radio],.radio-button input[type=checkbox]{display:none}.radio-button__input{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:50%;vertical-align:middle}.radio-button__input.checked{border-color:#4e79df;background:#4e79df}.search{position:relative}.search__input{outline:0;box-sizing:border-box;width:100%;border:none;box-shadow:none;font-family:inherit;background:#282c37;color:#dde3ec;font-size:14px;margin:0;display:block;padding:15px;padding-right:30px;line-height:18px;font-size:16px}.search__input::placeholder{color:#eaeef3}.search__input::-moz-focus-inner{border:0}.search__input::-moz-focus-inner,.search__input:focus,.search__input:active{outline:0 !important}.search__input:focus{background:#313543}@media screen and (max-width: 600px){.search__input{font-size:16px}}.search__icon::-moz-focus-inner{border:0}.search__icon::-moz-focus-inner,.search__icon:focus{outline:0 !important}.search__icon .fa{position:absolute;top:16px;right:10px;z-index:2;display:inline-block;opacity:0;transition:all 100ms linear;transition-property:color,transform,opacity;font-size:18px;width:18px;height:18px;color:#ecf0f4;cursor:default;pointer-events:none}.search__icon .fa.active{pointer-events:auto;opacity:.3}.search__icon .fa-search{transform:rotate(0deg)}.search__icon .fa-search.active{pointer-events:auto;opacity:.3}.search__icon .fa-times-circle{top:17px;transform:rotate(0deg);color:#8d9ac2;cursor:pointer}.search__icon .fa-times-circle.active{transform:rotate(90deg)}.search__icon .fa-times-circle:hover{color:#a4afce}.search-results__header{color:#c2cede;background:#2c313d;border-bottom:1px solid #1f232b;padding:15px 10px;font-size:14px;font-weight:500}.search-results__info{padding:20px;color:#dde3ec;text-align:center}.trends__header{color:#c2cede;background:#2c313d;border-bottom:1px solid #1f232b;font-weight:500;padding:15px;font-size:16px;cursor:default}.trends__header .fa{display:inline-block;margin-right:5px}.trends__item{display:flex;align-items:center;padding:15px;border-bottom:1px solid #393f4f}.trends__item:last-child{border-bottom:0}.trends__item__name{flex:1 1 auto;color:#c2cede;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trends__item__name strong{font-weight:500}.trends__item__name a{color:#dde3ec;text-decoration:none;font-size:14px;font-weight:500;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trends__item__name a:hover span,.trends__item__name a:focus span,.trends__item__name a:active span{text-decoration:underline}.trends__item__current{flex:0 0 auto;font-size:24px;line-height:36px;font-weight:500;text-align:right;padding-right:15px;margin-left:5px;color:#ecf0f4}.trends__item__sparkline{flex:0 0 auto;width:50px}.trends__item__sparkline path:first-child{fill:rgba(43,144,217,.25) !important;fill-opacity:1 !important}.trends__item__sparkline path:last-child{stroke:#459ede !important}.emojione{font-size:inherit;vertical-align:middle;object-fit:contain;margin:-0.2ex .15em .2ex;width:16px;height:16px}.emojione img{width:auto}.emoji-picker-dropdown__menu{background:#fff;position:absolute;box-shadow:4px 4px 6px rgba(0,0,0,.4);border-radius:4px;margin-top:5px;z-index:2}.emoji-picker-dropdown__menu .emoji-mart-scroll{transition:opacity 200ms ease}.emoji-picker-dropdown__menu.selecting .emoji-mart-scroll{opacity:.5}.emoji-picker-dropdown__modifiers{position:absolute;top:60px;right:11px;cursor:pointer}.emoji-picker-dropdown__modifiers__menu{position:absolute;z-index:4;top:-4px;left:-8px;background:#fff;border-radius:4px;box-shadow:1px 2px 6px rgba(0,0,0,.2);overflow:hidden}.emoji-picker-dropdown__modifiers__menu button{display:block;cursor:pointer;border:0;padding:4px 8px;background:transparent}.emoji-picker-dropdown__modifiers__menu button:hover,.emoji-picker-dropdown__modifiers__menu button:focus,.emoji-picker-dropdown__modifiers__menu button:active{background:rgba(217,225,232,.4)}.emoji-picker-dropdown__modifiers__menu .emoji-mart-emoji{height:22px}.emoji-mart-emoji span{background-repeat:no-repeat}.emoji-button{display:block;padding:5px 5px 2px 2px;outline:0;cursor:pointer}.emoji-button:active,.emoji-button:focus{outline:0 !important}.emoji-button img{filter:grayscale(100%);opacity:.8;display:block;margin:0;width:22px;height:22px}.emoji-button:hover img,.emoji-button:active img,.emoji-button:focus img{opacity:1;filter:none}.doodle-modal{width:unset}.doodle-modal__container{background:#d9e1e8;text-align:center;line-height:0}.doodle-modal__container canvas{border:5px solid #d9e1e8}.doodle-modal__action-bar .filler{flex-grow:1;margin:0;padding:0}.doodle-modal__action-bar .doodle-toolbar{line-height:1;display:flex;flex-direction:column;flex-grow:0;justify-content:space-around}.doodle-modal__action-bar .doodle-toolbar.with-inputs label{display:inline-block;width:70px;text-align:right;margin-right:2px}.doodle-modal__action-bar .doodle-toolbar.with-inputs input[type=number],.doodle-modal__action-bar .doodle-toolbar.with-inputs input[type=text]{width:40px}.doodle-modal__action-bar .doodle-toolbar.with-inputs span.val{display:inline-block;text-align:left;width:50px}.doodle-modal__action-bar .doodle-palette{padding-right:0 !important;border:1px solid #000;line-height:.2rem;flex-grow:0;background:#fff}.doodle-modal__action-bar .doodle-palette button{appearance:none;width:1rem;height:1rem;margin:0;padding:0;text-align:center;color:#000;text-shadow:0 0 1px #fff;cursor:pointer;box-shadow:inset 0 0 1px rgba(255,255,255,.5);border:1px solid #000;outline-offset:-1px}.doodle-modal__action-bar .doodle-palette button.foreground{outline:1px dashed #fff}.doodle-modal__action-bar .doodle-palette button.background{outline:1px dashed red}.doodle-modal__action-bar .doodle-palette button.foreground.background{outline:1px dashed red;border-color:#fff}.drawer{width:300px;box-sizing:border-box;display:flex;flex-direction:column;overflow-y:hidden;padding:10px 5px;flex:none}.drawer:first-child{padding-left:10px}.drawer:last-child{padding-right:10px}@media screen and (max-width: 630px){.auto-columns .drawer{flex:auto}}.single-column .drawer{flex:auto}@media screen and (max-width: 630px){.auto-columns .drawer,.auto-columns .drawer:first-child,.auto-columns .drawer:last-child,.single-column .drawer,.single-column .drawer:first-child,.single-column .drawer:last-child{padding:0}}.wide .drawer{min-width:300px;max-width:400px;flex:1 1 200px}@media screen and (max-width: 630px){:root .auto-columns .drawer{flex:auto;width:100%;min-width:0;max-width:none;padding:0}}:root .single-column .drawer{flex:auto;width:100%;min-width:0;max-width:none;padding:0}.react-swipeable-view-container .drawer{height:100%}.drawer--header{display:flex;flex-direction:row;margin-bottom:10px;flex:none;background:#393f4f;font-size:16px}.drawer--header>*{display:block;box-sizing:border-box;border-bottom:2px solid transparent;padding:15px 5px 13px;height:48px;flex:1 1 auto;color:#dde3ec;text-align:center;text-decoration:none;cursor:pointer}.drawer--header a{transition:background 100ms ease-in}.drawer--header a:focus,.drawer--header a:hover{outline:none;background:#2e3340;transition:background 200ms ease-out}.search{position:relative;margin-bottom:10px;flex:none}@media screen and (max-width: 415px){.auto-columns .search,.single-column .search{margin-bottom:0}}@media screen and (max-width: 630px){.auto-columns .search{font-size:16px}}.single-column .search{font-size:16px}.search-popout{background:#fff;border-radius:4px;padding:10px 14px;padding-bottom:14px;margin-top:10px;color:#364861;box-shadow:2px 4px 15px rgba(0,0,0,.4)}.search-popout h4{text-transform:uppercase;color:#364861;font-size:13px;font-weight:500;margin-bottom:10px}.search-popout li{padding:4px 0}.search-popout ul{margin-bottom:10px}.search-popout em{font-weight:500;color:#000}.drawer--account{padding:10px;color:#dde3ec;display:flex;align-items:center}.drawer--account a{color:inherit;text-decoration:none}.drawer--account .acct{display:block;color:#ecf0f4;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.navigation-bar__profile{flex:1 1 auto;margin-left:8px;overflow:hidden}.drawer--results{background:#282c37;overflow-x:hidden;overflow-y:auto}.drawer--results>header{color:#c2cede;background:#2c313d;padding:15px;font-weight:500;font-size:16px;cursor:default}.drawer--results>header .fa{display:inline-block;margin-right:5px}.drawer--results>section{margin-bottom:5px}.drawer--results>section h5{background:#1f232b;border-bottom:1px solid #393f4f;cursor:default;display:flex;padding:15px;font-weight:500;font-size:16px;color:#c2cede}.drawer--results>section h5 .fa{display:inline-block;margin-right:5px}.drawer--results>section .account:last-child,.drawer--results>section>div:last-child .status{border-bottom:0}.drawer--results>section>.hashtag{display:block;padding:10px;color:#ecf0f4;text-decoration:none}.drawer--results>section>.hashtag:hover,.drawer--results>section>.hashtag:active,.drawer--results>section>.hashtag:focus{color:#f9fafb;text-decoration:underline}.drawer__pager{box-sizing:border-box;padding:0;flex-grow:1;position:relative;overflow:hidden;display:flex}.drawer__inner{position:absolute;top:0;left:0;background:#444b5d;box-sizing:border-box;padding:0;display:flex;flex-direction:column;overflow:hidden;overflow-y:auto;width:100%;height:100%}.drawer__inner.darker{background:#282c37}.drawer__inner__mastodon{background:#444b5d url('data:image/svg+xml;utf8,') no-repeat bottom/100% auto;flex:1;min-height:47px;display:none}.drawer__inner__mastodon>img{display:block;object-fit:contain;object-position:bottom left;width:85%;height:100%;pointer-events:none;user-drag:none;user-select:none}.drawer__inner__mastodon>.mastodon{display:block;width:100%;height:100%;border:none;cursor:inherit}@media screen and (min-height: 640px){.drawer__inner__mastodon{display:block}}.pseudo-drawer{background:#444b5d;font-size:13px;text-align:left}.drawer__backdrop{cursor:pointer;position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5)}.video-error-cover{align-items:center;background:#000;color:#fff;cursor:pointer;display:flex;flex-direction:column;height:100%;justify-content:center;margin-top:8px;position:relative;text-align:center;z-index:100}.media-spoiler{background:#000;color:#dde3ec;border:0;width:100%;height:100%}.media-spoiler:hover,.media-spoiler:active,.media-spoiler:focus{color:#f7f9fb}.status__content>.media-spoiler{margin-top:15px}.media-spoiler.full-width{margin-left:-14px;margin-right:-14px;width:inherit;max-width:none;height:250px;border-radius:0px}.media-spoiler__warning{display:block;font-size:14px}.media-spoiler__trigger{display:block;font-size:11px;font-weight:500}.media-gallery__gifv__label{display:block;position:absolute;color:#fff;background:rgba(0,0,0,.5);bottom:6px;left:6px;padding:2px 6px;border-radius:2px;font-size:11px;font-weight:600;z-index:1;pointer-events:none;opacity:.9;transition:opacity .1s ease;line-height:18px}.media-gallery__gifv:hover .media-gallery__gifv__label{opacity:1}.media-gallery__audio{height:100%;display:flex;flex-direction:column}.media-gallery__audio span{text-align:center;color:#dde3ec;display:flex;height:100%;align-items:center}.media-gallery__audio span p{width:100%}.media-gallery__audio audio{width:100%}.media-gallery{box-sizing:border-box;margin-top:8px;overflow:hidden;border-radius:4px;position:relative;width:100%;height:110px}.media-gallery.full-width{margin-left:-14px;margin-right:-14px;width:inherit;max-width:none;height:250px;border-radius:0px}.media-gallery__item{border:none;box-sizing:border-box;display:block;float:left;position:relative;border-radius:4px;overflow:hidden}.full-width .media-gallery__item{border-radius:0}.media-gallery__item.standalone .media-gallery__item-gifv-thumbnail{transform:none;top:0}.media-gallery__item.letterbox{background:#000}.media-gallery__item-thumbnail{cursor:zoom-in;display:block;text-decoration:none;color:#ecf0f4;position:relative;z-index:1}.media-gallery__item-thumbnail,.media-gallery__item-thumbnail img{height:100%;width:100%;object-fit:contain}.media-gallery__item-thumbnail:not(.letterbox),.media-gallery__item-thumbnail img:not(.letterbox){height:100%;object-fit:cover}.media-gallery__preview{width:100%;height:100%;object-fit:cover;position:absolute;top:0;left:0;z-index:0;background:#000}.media-gallery__preview--hidden{display:none}.media-gallery__gifv{height:100%;overflow:hidden;position:relative;width:100%;display:flex;justify-content:center}.media-gallery__item-gifv-thumbnail{cursor:zoom-in;height:100%;width:100%;position:relative;z-index:1;object-fit:contain;user-select:none}.media-gallery__item-gifv-thumbnail:not(.letterbox){height:100%;object-fit:cover}.media-gallery__item-thumbnail-label{clip:rect(1px 1px 1px 1px);clip:rect(1px, 1px, 1px, 1px);overflow:hidden;position:absolute}.video-modal__container{max-width:100vw;max-height:100vh}.audio-modal__container{width:50vw}.media-modal{width:100%;height:100%;position:relative}.media-modal .extended-video-player{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.media-modal .extended-video-player video{max-width:100%;max-height:80%}.media-modal__closer{position:absolute;top:0;left:0;right:0;bottom:0}.media-modal__navigation{position:absolute;top:0;left:0;right:0;bottom:0;pointer-events:none;transition:opacity .3s linear;will-change:opacity}.media-modal__navigation *{pointer-events:auto}.media-modal__navigation.media-modal__navigation--hidden{opacity:0}.media-modal__navigation.media-modal__navigation--hidden *{pointer-events:none}.media-modal__nav{background:rgba(0,0,0,.5);box-sizing:border-box;border:0;color:#fff;cursor:pointer;display:flex;align-items:center;font-size:24px;height:20vmax;margin:auto 0;padding:30px 15px;position:absolute;top:0;bottom:0}.media-modal__nav--left{left:0}.media-modal__nav--right{right:0}.media-modal__pagination{width:100%;text-align:center;position:absolute;left:0;bottom:20px;pointer-events:none}.media-modal__meta{text-align:center;position:absolute;left:0;bottom:20px;width:100%;pointer-events:none}.media-modal__meta--shifted{bottom:62px}.media-modal__meta a{pointer-events:auto;text-decoration:none;font-weight:500;color:#d9e1e8}.media-modal__meta a:hover,.media-modal__meta a:focus,.media-modal__meta a:active{text-decoration:underline}.media-modal__page-dot{display:inline-block}.media-modal__button{background-color:#fff;height:12px;width:12px;border-radius:6px;margin:10px;padding:0;border:0;font-size:0}.media-modal__button--active{background-color:#2b5fd9}.media-modal__close{position:absolute;right:8px;top:8px;z-index:100}.detailed .video-player__volume__current,.detailed .video-player__volume::before,.fullscreen .video-player__volume__current,.fullscreen .video-player__volume::before{bottom:27px}.detailed .video-player__volume__handle,.fullscreen .video-player__volume__handle{bottom:23px}.audio-player{box-sizing:border-box;position:relative;background:#17191f;border-radius:4px;padding-bottom:44px;direction:ltr}.audio-player.editable{border-radius:0;height:100%}.audio-player__waveform{padding:15px 0;position:relative;overflow:hidden}.audio-player__waveform::before{content:\"\";display:block;position:absolute;border-top:1px solid #313543;width:100%;height:0;left:0;top:calc(50% + 1px)}.audio-player__progress-placeholder{background-color:rgba(78,121,223,.5)}.audio-player__wave-placeholder{background-color:#4a5266}.audio-player .video-player__controls{padding:0 15px;padding-top:10px;background:#17191f;border-top:1px solid #313543;border-radius:0 0 4px 4px}.video-player{overflow:hidden;position:relative;background:#000;max-width:100%;border-radius:4px;box-sizing:border-box;direction:ltr}.video-player.editable{border-radius:0;height:100% !important}.video-player:focus{outline:0}.detailed-status .video-player{width:100%;height:100%}.video-player.full-width{margin-left:-14px;margin-right:-14px;width:inherit;max-width:none;height:250px;border-radius:0px}.video-player video{max-width:100vw;max-height:80vh;z-index:1;position:relative}.video-player.fullscreen{width:100% !important;height:100% !important;margin:0}.video-player.fullscreen video{max-width:100% !important;max-height:100% !important;width:100% !important;height:100% !important;outline:0}.video-player.inline video{object-fit:contain;position:relative;top:50%;transform:translateY(-50%)}.video-player__controls{position:absolute;z-index:2;bottom:0;left:0;right:0;box-sizing:border-box;background:linear-gradient(0deg, rgba(0, 0, 0, 0.85) 0, rgba(0, 0, 0, 0.45) 60%, transparent);padding:0 15px;opacity:0;transition:opacity .1s ease}.video-player__controls.active{opacity:1}.video-player.inactive video,.video-player.inactive .video-player__controls{visibility:hidden}.video-player__spoiler{display:none;position:absolute;top:0;left:0;width:100%;height:100%;z-index:4;border:0;background:#000;color:#dde3ec;transition:none;pointer-events:none}.video-player__spoiler.active{display:block;pointer-events:auto}.video-player__spoiler.active:hover,.video-player__spoiler.active:active,.video-player__spoiler.active:focus{color:#f4f6f9}.video-player__spoiler__title{display:block;font-size:14px}.video-player__spoiler__subtitle{display:block;font-size:11px;font-weight:500}.video-player__buttons-bar{display:flex;justify-content:space-between;padding-bottom:10px}.video-player__buttons-bar .video-player__download__icon{color:inherit}.video-player__buttons-bar .video-player__download__icon .fa,.video-player__buttons-bar .video-player__download__icon:active .fa,.video-player__buttons-bar .video-player__download__icon:hover .fa,.video-player__buttons-bar .video-player__download__icon:focus .fa{color:inherit}.video-player__buttons{font-size:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.video-player__buttons.left button{padding-left:0}.video-player__buttons.right button{padding-right:0}.video-player__buttons button{background:transparent;padding:2px 10px;font-size:16px;border:0;color:rgba(255,255,255,.75)}.video-player__buttons button:active,.video-player__buttons button:hover,.video-player__buttons button:focus{color:#fff}.video-player__time-sep,.video-player__time-total,.video-player__time-current{font-size:14px;font-weight:500}.video-player__time-current{color:#fff;margin-left:60px}.video-player__time-sep{display:inline-block;margin:0 6px}.video-player__time-sep,.video-player__time-total{color:#fff}.video-player__volume{cursor:pointer;height:24px;display:inline}.video-player__volume::before{content:\"\";width:50px;background:rgba(255,255,255,.35);border-radius:4px;display:block;position:absolute;height:4px;left:70px;bottom:20px}.video-player__volume__current{display:block;position:absolute;height:4px;border-radius:4px;left:70px;bottom:20px;background:#4e79df}.video-player__volume__handle{position:absolute;z-index:3;border-radius:50%;width:12px;height:12px;bottom:16px;left:70px;transition:opacity .1s ease;background:#4e79df;box-shadow:1px 2px 6px rgba(0,0,0,.2);pointer-events:none}.video-player__link{padding:2px 10px}.video-player__link a{text-decoration:none;font-size:14px;font-weight:500;color:#fff}.video-player__link a:hover,.video-player__link a:active,.video-player__link a:focus{text-decoration:underline}.video-player__seek{cursor:pointer;height:24px;position:relative}.video-player__seek::before{content:\"\";width:100%;background:rgba(255,255,255,.35);border-radius:4px;display:block;position:absolute;height:4px;top:10px}.video-player__seek__progress,.video-player__seek__buffer{display:block;position:absolute;height:4px;border-radius:4px;top:10px;background:#4e79df}.video-player__seek__buffer{background:rgba(255,255,255,.2)}.video-player__seek__handle{position:absolute;z-index:3;opacity:0;border-radius:50%;width:12px;height:12px;top:6px;margin-left:-6px;transition:opacity .1s ease;background:#4e79df;box-shadow:1px 2px 6px rgba(0,0,0,.2);pointer-events:none}.video-player__seek__handle.active{opacity:1}.video-player__seek:hover .video-player__seek__handle{opacity:1}.video-player.detailed .video-player__buttons button,.video-player.fullscreen .video-player__buttons button{padding-top:10px;padding-bottom:10px}.sensitive-info{display:flex;flex-direction:row;align-items:center;position:absolute;top:4px;left:4px;z-index:100}.sensitive-marker{margin:0 3px;border-radius:2px;padding:2px 6px;color:rgba(255,255,255,.8);background:rgba(0,0,0,.5);font-size:12px;line-height:18px;text-transform:uppercase;opacity:.9;transition:opacity .1s ease}.media-gallery:hover .sensitive-marker{opacity:1}.list-editor{background:#282c37;flex-direction:column;border-radius:8px;box-shadow:2px 4px 15px rgba(0,0,0,.4);width:380px;overflow:hidden}@media screen and (max-width: 420px){.list-editor{width:90%}}.list-editor h4{padding:15px 0;background:#444b5d;font-weight:500;font-size:16px;text-align:center;border-radius:8px 8px 0 0}.list-editor .drawer__pager{height:50vh}.list-editor .drawer__inner{border-radius:0 0 8px 8px}.list-editor .drawer__inner.backdrop{width:calc(100% - 60px);box-shadow:2px 4px 15px rgba(0,0,0,.4);border-radius:0 0 0 8px}.list-editor__accounts{overflow-y:auto}.list-editor .account__display-name:hover strong{text-decoration:none}.list-editor .account__avatar{cursor:default}.list-editor .search{margin-bottom:0}.list-adder{background:#282c37;flex-direction:column;border-radius:8px;box-shadow:2px 4px 15px rgba(0,0,0,.4);width:380px;overflow:hidden}@media screen and (max-width: 420px){.list-adder{width:90%}}.list-adder__account{background:#444b5d}.list-adder__lists{background:#444b5d;height:50vh;border-radius:0 0 8px 8px;overflow-y:auto}.list-adder .list{padding:10px;border-bottom:1px solid #393f4f}.list-adder .list__wrapper{display:flex}.list-adder .list__display-name{flex:1 1 auto;overflow:hidden;text-decoration:none;font-size:16px;padding:10px}.emoji-mart{font-size:13px;display:inline-block;color:#000}.emoji-mart,.emoji-mart *{box-sizing:border-box;line-height:1.15}.emoji-mart .emoji-mart-emoji{padding:6px}.emoji-mart-bar{border:0 solid #c0cdd9}.emoji-mart-bar:first-child{border-bottom-width:1px;border-top-left-radius:5px;border-top-right-radius:5px;background:#d9e1e8}.emoji-mart-bar:last-child{border-top-width:1px;border-bottom-left-radius:5px;border-bottom-right-radius:5px;display:none}.emoji-mart-anchors{display:flex;justify-content:space-between;padding:0 6px;color:#1b1e25;line-height:0}.emoji-mart-anchor{position:relative;flex:1;text-align:center;padding:12px 4px;overflow:hidden;transition:color .1s ease-out;cursor:pointer}.emoji-mart-anchor:hover{color:#131419}.emoji-mart-anchor-selected{color:#2b90d9}.emoji-mart-anchor-selected:hover{color:#2485cb}.emoji-mart-anchor-selected .emoji-mart-anchor-bar{bottom:0}.emoji-mart-anchor-bar{position:absolute;bottom:-3px;left:0;width:100%;height:3px;background-color:#2558d0}.emoji-mart-anchors i{display:inline-block;width:100%;max-width:22px}.emoji-mart-anchors svg{fill:currentColor;max-height:18px}.emoji-mart-scroll{overflow-y:scroll;height:270px;max-height:35vh;padding:0 6px 6px;background:#fff;will-change:transform}.emoji-mart-scroll::-webkit-scrollbar-track:hover,.emoji-mart-scroll::-webkit-scrollbar-track:active{background-color:rgba(0,0,0,.3)}.emoji-mart-search{padding:10px;padding-right:45px;background:#fff}.emoji-mart-search input{font-size:14px;font-weight:400;padding:7px 9px;font-family:inherit;display:block;width:100%;background:rgba(217,225,232,.3);color:#000;border:1px solid #d9e1e8;border-radius:4px}.emoji-mart-search input::-moz-focus-inner{border:0}.emoji-mart-search input::-moz-focus-inner,.emoji-mart-search input:focus,.emoji-mart-search input:active{outline:0 !important}.emoji-mart-category .emoji-mart-emoji{cursor:pointer}.emoji-mart-category .emoji-mart-emoji span{z-index:1;position:relative;text-align:center}.emoji-mart-category .emoji-mart-emoji:hover::before{z-index:0;content:\"\";position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(217,225,232,.7);border-radius:100%}.emoji-mart-category-label{z-index:2;position:relative;position:-webkit-sticky;position:sticky;top:0}.emoji-mart-category-label span{display:block;width:100%;font-weight:500;padding:5px 6px;background:#fff}.emoji-mart-emoji{position:relative;display:inline-block;font-size:0}.emoji-mart-emoji span{width:22px;height:22px}.emoji-mart-no-results{font-size:14px;text-align:center;padding-top:70px;color:#364861}.emoji-mart-no-results .emoji-mart-category-label{display:none}.emoji-mart-no-results .emoji-mart-no-results-label{margin-top:.2em}.emoji-mart-no-results .emoji-mart-emoji:hover::before{content:none}.emoji-mart-preview{display:none}.glitch.local-settings{position:relative;display:flex;flex-direction:row;background:#d9e1e8;color:#000;border-radius:8px;height:80vh;width:80vw;max-width:740px;max-height:450px;overflow:hidden}.glitch.local-settings label,.glitch.local-settings legend{display:block;font-size:14px}.glitch.local-settings .boolean label,.glitch.local-settings .radio_buttons label{position:relative;padding-left:28px;padding-top:3px}.glitch.local-settings .boolean label input,.glitch.local-settings .radio_buttons label input{position:absolute;left:0;top:0}.glitch.local-settings span.hint{display:block;color:#1b1e25}.glitch.local-settings h1{font-size:18px;font-weight:500;line-height:24px;margin-bottom:20px}.glitch.local-settings h2{font-size:15px;font-weight:500;line-height:20px;margin-top:20px;margin-bottom:10px}.glitch.local-settings__navigation__item{display:block;padding:15px 20px;color:inherit;background:#f2f5f7;border-bottom:1px #d9e1e8 solid;cursor:pointer;text-decoration:none;outline:none;transition:background .3s}.glitch.local-settings__navigation__item .text-icon-button{color:inherit;transition:unset}.glitch.local-settings__navigation__item:hover{background:#d9e1e8}.glitch.local-settings__navigation__item.active{background:#2b5fd9;color:#fff}.glitch.local-settings__navigation__item.close,.glitch.local-settings__navigation__item.close:hover{background:#df405a;color:#fff}.glitch.local-settings__navigation{background:#f2f5f7;width:212px;font-size:15px;line-height:20px;overflow-y:auto}.glitch.local-settings__page{display:block;flex:auto;padding:15px 20px 15px 20px;width:360px;overflow-y:auto}.glitch.local-settings__page__item{margin-bottom:2px}.glitch.local-settings__page__item.string,.glitch.local-settings__page__item.radio_buttons{margin-top:10px;margin-bottom:10px}@media screen and (max-width: 630px){.glitch.local-settings__navigation{width:40px;flex-shrink:0}.glitch.local-settings__navigation__item{padding:10px}.glitch.local-settings__navigation__item span:last-of-type{display:none}}.error-boundary{color:#fff;font-size:15px;line-height:20px}.error-boundary h1{font-size:26px;line-height:36px;font-weight:400;margin-bottom:8px}.error-boundary a{color:#fff;text-decoration:underline}.error-boundary ul{list-style:disc;margin-left:0;padding-left:1em}.error-boundary textarea.web_app_crash-stacktrace{width:100%;resize:none;white-space:pre;font-family:monospace,monospace}.compose-panel{width:285px;margin-top:10px;display:flex;flex-direction:column;height:calc(100% - 10px);overflow-y:hidden}.compose-panel .search__input{line-height:18px;font-size:16px;padding:15px;padding-right:30px}.compose-panel .search__icon .fa{top:15px}.compose-panel .drawer--account{flex:0 1 48px}.compose-panel .flex-spacer{background:transparent}.compose-panel .composer{flex:1;overflow-y:hidden;display:flex;flex-direction:column;min-height:310px}.compose-panel .compose-form__autosuggest-wrapper{overflow-y:auto;background-color:#fff;border-radius:4px 4px 0 0;flex:0 1 auto}.compose-panel .autosuggest-textarea__textarea{overflow-y:hidden}.compose-panel .compose-form__upload-thumbnail{height:80px}.navigation-panel{margin-top:10px;margin-bottom:10px;height:calc(100% - 20px);overflow-y:auto;display:flex;flex-direction:column}.navigation-panel>a{flex:0 0 auto}.navigation-panel hr{flex:0 0 auto;border:0;background:transparent;border-top:1px solid #313543;margin:10px 0}.navigation-panel .flex-spacer{background:transparent}@media screen and (min-width: 600px){.tabs-bar__link span{display:inline}}.columns-area--mobile{flex-direction:column;width:100%;margin:0 auto}.columns-area--mobile .column,.columns-area--mobile .drawer{width:100%;height:100%;padding:0}.columns-area--mobile .directory__list{display:grid;grid-gap:10px;grid-template-columns:minmax(0, 50%) minmax(0, 50%)}@media screen and (max-width: 415px){.columns-area--mobile .directory__list{display:block}}.columns-area--mobile .directory__card{margin-bottom:0}.columns-area--mobile .filter-form{display:flex}.columns-area--mobile .autosuggest-textarea__textarea{font-size:16px}.columns-area--mobile .search__input{line-height:18px;font-size:16px;padding:15px;padding-right:30px}.columns-area--mobile .search__icon .fa{top:15px}.columns-area--mobile .scrollable{overflow:visible}@supports(display: grid){.columns-area--mobile .scrollable{contain:content}}@media screen and (min-width: 415px){.columns-area--mobile{padding:10px 0;padding-top:0}}@media screen and (min-width: 630px){.columns-area--mobile .detailed-status{padding:15px}.columns-area--mobile .detailed-status .media-gallery,.columns-area--mobile .detailed-status .video-player,.columns-area--mobile .detailed-status .audio-player{margin-top:15px}.columns-area--mobile .account__header__bar{padding:5px 10px}.columns-area--mobile .navigation-bar,.columns-area--mobile .compose-form{padding:15px}.columns-area--mobile .compose-form .compose-form__publish .compose-form__publish-button-wrapper{padding-top:15px}.columns-area--mobile .status{padding:15px;min-height:50px}.columns-area--mobile .status .media-gallery,.columns-area--mobile .status__action-bar,.columns-area--mobile .status .video-player,.columns-area--mobile .status .audio-player{margin-top:10px}.columns-area--mobile .account{padding:15px 10px}.columns-area--mobile .account__header__bio{margin:0 -10px}.columns-area--mobile .notification__message{padding-top:15px}.columns-area--mobile .notification .status{padding-top:8px}.columns-area--mobile .notification .account{padding-top:8px}}.floating-action-button{position:fixed;display:flex;justify-content:center;align-items:center;width:3.9375rem;height:3.9375rem;bottom:1.3125rem;right:1.3125rem;background:#2558d0;color:#fff;border-radius:50%;font-size:21px;line-height:21px;text-decoration:none;box-shadow:2px 3px 9px rgba(0,0,0,.4)}.floating-action-button:hover,.floating-action-button:focus,.floating-action-button:active{background:#4976de}@media screen and (min-width: 415px){.tabs-bar{width:100%}.react-swipeable-view-container .columns-area--mobile{height:calc(100% - 10px) !important}.getting-started__wrapper,.search{margin-bottom:10px}}@media screen and (max-width: 895px){.columns-area__panels__pane--compositional{display:none}}@media screen and (min-width: 895px){.floating-action-button,.tabs-bar__link.optional{display:none}.search-page .search{display:none}}@media screen and (max-width: 1190px){.columns-area__panels__pane--navigational{display:none}}@media screen and (min-width: 1190px){.tabs-bar{display:none}}.announcements__item__content{word-wrap:break-word;overflow-y:auto}.announcements__item__content .emojione{width:20px;height:20px;margin:-3px 0 0}.announcements__item__content p{margin-bottom:10px;white-space:pre-wrap}.announcements__item__content p:last-child{margin-bottom:0}.announcements__item__content a{color:#ecf0f4;text-decoration:none}.announcements__item__content a:hover{text-decoration:underline}.announcements__item__content a.mention:hover{text-decoration:none}.announcements__item__content a.mention:hover span{text-decoration:underline}.announcements__item__content a.unhandled-link{color:#4e79df}.announcements{background:#393f4f;font-size:13px;display:flex;align-items:flex-end}.announcements__mastodon{width:124px;flex:0 0 auto}@media screen and (max-width: 424px){.announcements__mastodon{display:none}}.announcements__container{width:calc(100% - 124px);flex:0 0 auto;position:relative}@media screen and (max-width: 424px){.announcements__container{width:100%}}.announcements__item{box-sizing:border-box;width:100%;padding:15px;position:relative;font-size:15px;line-height:20px;word-wrap:break-word;font-weight:400;max-height:50vh;overflow:hidden;display:flex;flex-direction:column}.announcements__item__range{display:block;font-weight:500;margin-bottom:10px;padding-right:18px}.announcements__item__unread{position:absolute;top:19px;right:19px;display:block;background:#2b90d9;border-radius:50%;width:.625rem;height:.625rem}.announcements__pagination{padding:15px;color:#dde3ec;position:absolute;bottom:3px;right:0}.layout-multiple-columns .announcements__mastodon{display:none}.layout-multiple-columns .announcements__container{width:100%}.reactions-bar{display:flex;flex-wrap:wrap;align-items:center;margin-top:15px;margin-left:-2px;width:calc(100% - (90px - 33px))}.reactions-bar__item{flex-shrink:0;background:#42485a;border:0;border-radius:3px;margin:2px;cursor:pointer;user-select:none;padding:0 6px;display:flex;align-items:center;transition:all 100ms ease-in;transition-property:background-color,color}.reactions-bar__item__emoji{display:block;margin:3px 0;width:16px;height:16px}.reactions-bar__item__emoji img{display:block;margin:0;width:100%;height:100%;min-width:auto;min-height:auto;vertical-align:bottom;object-fit:contain}.reactions-bar__item__count{display:block;min-width:9px;font-size:13px;font-weight:500;text-align:center;margin-left:6px;color:#dde3ec}.reactions-bar__item:hover,.reactions-bar__item:focus,.reactions-bar__item:active{background:#4a5266;transition:all 200ms ease-out;transition-property:background-color,color}.reactions-bar__item:hover__count,.reactions-bar__item:focus__count,.reactions-bar__item:active__count{color:#eaeef3}.reactions-bar__item.active{transition:all 100ms ease-in;transition-property:background-color,color;background-color:#3d4d73}.reactions-bar__item.active .reactions-bar__item__count{color:#4ea2df}.reactions-bar .emoji-picker-dropdown{margin:2px}.reactions-bar:hover .emoji-button{opacity:.85}.reactions-bar .emoji-button{color:#dde3ec;margin:0;font-size:16px;width:auto;flex-shrink:0;padding:0 6px;height:22px;display:flex;align-items:center;opacity:.5;transition:all 100ms ease-in;transition-property:background-color,color}.reactions-bar .emoji-button:hover,.reactions-bar .emoji-button:active,.reactions-bar .emoji-button:focus{opacity:1;color:#eaeef3;transition:all 200ms ease-out;transition-property:background-color,color}.reactions-bar--empty .emoji-button{padding:0}.poll{margin-top:16px;font-size:14px}.poll ul,.e-content .poll ul{margin:0;list-style:none}.poll li{margin-bottom:10px;position:relative}.poll__chart{border-radius:4px;display:block;background:#8ba1bf;height:5px;min-width:1%}.poll__chart.leading{background:#2b5fd9}.poll__option{position:relative;display:flex;padding:6px 0;line-height:18px;cursor:default;overflow:hidden}.poll__option__text{display:inline-block;word-wrap:break-word;overflow-wrap:break-word;max-width:calc(100% - 45px - 25px)}.poll__option input[type=radio],.poll__option input[type=checkbox]{display:none}.poll__option .autossugest-input{flex:1 1 auto}.poll__option input[type=text]{display:block;box-sizing:border-box;width:100%;font-size:14px;color:#000;display:block;outline:0;font-family:inherit;background:#fff;border:1px solid #dbdbdb;border-radius:4px;padding:6px 10px}.poll__option input[type=text]:focus{border-color:#2b90d9}.poll__option.selectable{cursor:pointer}.poll__option.editable{display:flex;align-items:center;overflow:visible}.poll__input{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:50%;vertical-align:middle;margin-top:auto;margin-bottom:auto;flex:0 0 18px}.poll__input.checkbox{border-radius:4px}.poll__input.active{border-color:#79bd9a;background:#79bd9a}.poll__input:active,.poll__input:focus,.poll__input:hover{border-color:#acd6c1;border-width:4px}.poll__input::-moz-focus-inner{outline:0 !important;border:0}.poll__input:focus,.poll__input:active{outline:0 !important}.poll__number{display:inline-block;width:45px;font-weight:700;flex:0 0 45px}.poll__voted{padding:0 5px;display:inline-block}.poll__voted__mark{font-size:18px}.poll__footer{padding-top:6px;padding-bottom:5px;color:#c2cede}.poll__link{display:inline;background:transparent;padding:0;margin:0;border:0;color:#c2cede;text-decoration:underline;font-size:inherit}.poll__link:hover{text-decoration:none}.poll__link:active,.poll__link:focus{background-color:rgba(194,206,222,.1)}.poll .button{height:36px;padding:0 16px;margin-right:10px;font-size:14px}.compose-form__poll-wrapper{border-top:1px solid #ebebeb;overflow-x:hidden}.compose-form__poll-wrapper ul{padding:10px}.compose-form__poll-wrapper .poll__footer{border-top:1px solid #ebebeb;padding:10px;display:flex;align-items:center}.compose-form__poll-wrapper .poll__footer button,.compose-form__poll-wrapper .poll__footer select{width:100%;flex:1 1 50%}.compose-form__poll-wrapper .poll__footer button:focus,.compose-form__poll-wrapper .poll__footer select:focus{border-color:#2b90d9}.compose-form__poll-wrapper .button.button-secondary{font-size:14px;font-weight:400;padding:6px 10px;height:auto;line-height:inherit;color:#8d9ac2;border-color:#8d9ac2;margin-right:5px}.compose-form__poll-wrapper li{display:flex;align-items:center}.compose-form__poll-wrapper li .poll__option{flex:0 0 auto;width:calc(100% - (23px + 6px));margin-right:6px}.compose-form__poll-wrapper select{appearance:none;box-sizing:border-box;font-size:14px;color:#000;display:inline-block;width:auto;outline:0;font-family:inherit;background:#fff url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center/auto 16px;border:1px solid #dbdbdb;border-radius:4px;padding:6px 10px;padding-right:30px}.compose-form__poll-wrapper .icon-button.disabled{color:#dbdbdb}.muted .poll{color:#c2cede}.muted .poll__chart{background:rgba(109,137,175,.2)}.muted .poll__chart.leading{background:rgba(43,95,217,.2)}.container{box-sizing:border-box;max-width:1235px;margin:0 auto;position:relative}@media screen and (max-width: 1255px){.container{width:100%;padding:0 10px}}.rich-formatting{font-family:sans-serif,sans-serif;font-size:14px;font-weight:400;line-height:1.7;word-wrap:break-word;color:#dde3ec}.rich-formatting a{color:#2b90d9;text-decoration:underline}.rich-formatting a:hover,.rich-formatting a:focus,.rich-formatting a:active{text-decoration:none}.rich-formatting p,.rich-formatting li{color:#dde3ec}.rich-formatting p{margin-top:0;margin-bottom:.85em}.rich-formatting p:last-child{margin-bottom:0}.rich-formatting strong{font-weight:700;color:#ecf0f4}.rich-formatting em{font-style:italic;color:#ecf0f4}.rich-formatting code{font-size:.85em;background:#17191f;border-radius:4px;padding:.2em .3em}.rich-formatting h1,.rich-formatting h2,.rich-formatting h3,.rich-formatting h4,.rich-formatting h5,.rich-formatting h6{font-family:sans-serif,sans-serif;margin-top:1.275em;margin-bottom:.85em;font-weight:500;color:#ecf0f4}.rich-formatting h1{font-size:2em}.rich-formatting h2{font-size:1.75em}.rich-formatting h3{font-size:1.5em}.rich-formatting h4{font-size:1.25em}.rich-formatting h5,.rich-formatting h6{font-size:1em}.rich-formatting ul{list-style:disc}.rich-formatting ol{list-style:decimal}.rich-formatting ul,.rich-formatting ol{margin:0;padding:0;padding-left:2em;margin-bottom:.85em}.rich-formatting ul[type=a],.rich-formatting ol[type=a]{list-style-type:lower-alpha}.rich-formatting ul[type=i],.rich-formatting ol[type=i]{list-style-type:lower-roman}.rich-formatting hr{width:100%;height:0;border:0;border-bottom:1px solid #313543;margin:1.7em 0}.rich-formatting hr.spacer{height:1px;border:0}.rich-formatting table{width:100%;border-collapse:collapse;break-inside:auto;margin-top:24px;margin-bottom:32px}.rich-formatting table thead tr,.rich-formatting table tbody tr{border-bottom:1px solid #313543;font-size:1em;line-height:1.625;font-weight:400;text-align:left;color:#dde3ec}.rich-formatting table thead tr{border-bottom-width:2px;line-height:1.5;font-weight:500;color:#c2cede}.rich-formatting table th,.rich-formatting table td{padding:8px;align-self:start;align-items:start;word-break:break-all}.rich-formatting table th.nowrap,.rich-formatting table td.nowrap{width:25%;position:relative}.rich-formatting table th.nowrap::before,.rich-formatting table td.nowrap::before{content:\" \";visibility:hidden}.rich-formatting table th.nowrap span,.rich-formatting table td.nowrap span{position:absolute;left:8px;right:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rich-formatting>:first-child{margin-top:0}.information-board{background:#1f232b;padding:20px 0}.information-board .container-alt{position:relative;padding-right:295px}.information-board__sections{display:flex;justify-content:space-between;flex-wrap:wrap}.information-board__section{flex:1 0 0;font-family:sans-serif,sans-serif;font-size:16px;line-height:28px;color:#fff;text-align:right;padding:10px 15px}.information-board__section span,.information-board__section strong{display:block}.information-board__section span:last-child{color:#ecf0f4}.information-board__section strong{font-family:sans-serif,sans-serif;font-weight:500;font-size:32px;line-height:48px}@media screen and (max-width: 700px){.information-board__section{text-align:center}}.information-board .panel{position:absolute;width:280px;box-sizing:border-box;background:#17191f;padding:20px;padding-top:10px;border-radius:4px 4px 0 0;right:0;bottom:-40px}.information-board .panel .panel-header{font-family:sans-serif,sans-serif;font-size:14px;line-height:24px;font-weight:500;color:#dde3ec;padding-bottom:5px;margin-bottom:15px;border-bottom:1px solid #313543;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.information-board .panel .panel-header a,.information-board .panel .panel-header span{font-weight:400;color:#bcc9da}.information-board .panel .panel-header a{text-decoration:none}.information-board .owner{text-align:center}.information-board .owner .avatar{width:80px;height:80px;width:80px;height:80px;background-size:80px 80px;margin:0 auto;margin-bottom:15px}.information-board .owner .avatar img{display:block;width:80px;height:80px;border-radius:48px;border-radius:8%;background-position:50%;background-clip:padding-box}.information-board .owner .name{font-size:14px}.information-board .owner .name a{display:block;color:#fff;text-decoration:none}.information-board .owner .name a:hover .display_name{text-decoration:underline}.information-board .owner .name .username{display:block;color:#dde3ec}.landing-page p,.landing-page li{font-family:sans-serif,sans-serif;font-size:16px;font-weight:400;font-size:16px;line-height:30px;margin-bottom:12px;color:#dde3ec}.landing-page p a,.landing-page li a{color:#2b90d9;text-decoration:underline}.landing-page em{display:inline;margin:0;padding:0;font-weight:700;background:transparent;font-family:inherit;font-size:inherit;line-height:inherit;color:#fefefe}.landing-page h1{font-family:sans-serif,sans-serif;font-size:26px;line-height:30px;font-weight:500;margin-bottom:20px;color:#ecf0f4}.landing-page h1 small{font-family:sans-serif,sans-serif;display:block;font-size:18px;font-weight:400;color:#fefefe}.landing-page h2{font-family:sans-serif,sans-serif;font-size:22px;line-height:26px;font-weight:500;margin-bottom:20px;color:#ecf0f4}.landing-page h3{font-family:sans-serif,sans-serif;font-size:18px;line-height:24px;font-weight:500;margin-bottom:20px;color:#ecf0f4}.landing-page h4{font-family:sans-serif,sans-serif;font-size:16px;line-height:24px;font-weight:500;margin-bottom:20px;color:#ecf0f4}.landing-page h5{font-family:sans-serif,sans-serif;font-size:14px;line-height:24px;font-weight:500;margin-bottom:20px;color:#ecf0f4}.landing-page h6{font-family:sans-serif,sans-serif;font-size:12px;line-height:24px;font-weight:500;margin-bottom:20px;color:#ecf0f4}.landing-page ul,.landing-page ol{margin-left:20px}.landing-page ul[type=a],.landing-page ol[type=a]{list-style-type:lower-alpha}.landing-page ul[type=i],.landing-page ol[type=i]{list-style-type:lower-roman}.landing-page ul{list-style:disc}.landing-page ol{list-style:decimal}.landing-page li>ol,.landing-page li>ul{margin-top:6px}.landing-page hr{width:100%;height:0;border:0;border-bottom:1px solid rgba(96,105,132,.6);margin:20px 0}.landing-page hr.spacer{height:1px;border:0}.landing-page__information,.landing-page__forms{padding:20px}.landing-page__call-to-action{background:#282c37;border-radius:4px;padding:25px 40px;overflow:hidden;box-sizing:border-box}.landing-page__call-to-action .row{width:100%;display:flex;flex-direction:row-reverse;flex-wrap:nowrap;justify-content:space-between;align-items:center}.landing-page__call-to-action .row__information-board{display:flex;justify-content:flex-end;align-items:flex-end}.landing-page__call-to-action .row__information-board .information-board__section{flex:1 0 auto;padding:0 10px}@media screen and (max-width: 415px){.landing-page__call-to-action .row__information-board{width:100%;justify-content:space-between}}.landing-page__call-to-action .row__mascot{flex:1;margin:10px -50px 0 0}@media screen and (max-width: 415px){.landing-page__call-to-action .row__mascot{display:none}}.landing-page__logo{margin-right:20px}.landing-page__logo img{height:50px;width:auto;mix-blend-mode:lighten}.landing-page__information{padding:45px 40px;margin-bottom:10px}.landing-page__information:last-child{margin-bottom:0}.landing-page__information strong{font-weight:500;color:#fefefe}.landing-page__information .account{border-bottom:0;padding:0}.landing-page__information .account__display-name{align-items:center;display:flex;margin-right:5px}.landing-page__information .account div.account__display-name:hover .display-name strong{text-decoration:none}.landing-page__information .account div.account__display-name .account__avatar{cursor:default}.landing-page__information .account__avatar-wrapper{margin-left:0;flex:0 0 auto}.landing-page__information .account__avatar{width:44px;height:44px;background-size:44px 44px;width:44px;height:44px;background-size:44px 44px}.landing-page__information .account .display-name{font-size:15px}.landing-page__information .account .display-name__account{font-size:14px}@media screen and (max-width: 960px){.landing-page__information .contact{margin-top:30px}}@media screen and (max-width: 700px){.landing-page__information{padding:25px 20px}}.landing-page__information,.landing-page__forms,.landing-page #mastodon-timeline{box-sizing:border-box;background:#282c37;border-radius:4px;box-shadow:0 0 6px rgba(0,0,0,.1)}.landing-page__mascot{height:104px;position:relative;left:-40px;bottom:25px}.landing-page__mascot img{height:190px;width:auto}.landing-page__short-description .row{display:flex;flex-wrap:wrap;align-items:center;margin-bottom:40px}@media screen and (max-width: 700px){.landing-page__short-description .row{margin-bottom:20px}}.landing-page__short-description p a{color:#ecf0f4}.landing-page__short-description h1{font-weight:500;color:#fff;margin-bottom:0}.landing-page__short-description h1 small{color:#dde3ec}.landing-page__short-description h1 small span{color:#ecf0f4}.landing-page__short-description p:last-child{margin-bottom:0}.landing-page__hero{margin-bottom:10px}.landing-page__hero img{display:block;margin:0;max-width:100%;height:auto;border-radius:4px}@media screen and (max-width: 840px){.landing-page .information-board .container-alt{padding-right:20px}.landing-page .information-board .panel{position:static;margin-top:20px;width:100%;border-radius:4px}.landing-page .information-board .panel .panel-header{text-align:center}}@media screen and (max-width: 675px){.landing-page .header-wrapper{padding-top:0}.landing-page .header-wrapper.compact{padding-bottom:0}.landing-page .header-wrapper.compact .hero .heading{text-align:initial}.landing-page .header .container-alt,.landing-page .features .container-alt{display:block}}.landing-page .cta{margin:20px}.landing{margin-bottom:100px}@media screen and (max-width: 738px){.landing{margin-bottom:0}}.landing__brand{display:flex;justify-content:center;align-items:center;padding:50px}.landing__brand svg{fill:#fff;height:52px}@media screen and (max-width: 415px){.landing__brand{padding:0;margin-bottom:30px}}.landing .directory{margin-top:30px;background:transparent;box-shadow:none;border-radius:0}.landing .hero-widget{margin-top:30px;margin-bottom:0}.landing .hero-widget h4{padding:10px;text-transform:uppercase;font-weight:700;font-size:13px;color:#dde3ec}.landing .hero-widget__text{border-radius:0;padding-bottom:0}.landing .hero-widget__footer{background:#282c37;padding:10px;border-radius:0 0 4px 4px;display:flex}.landing .hero-widget__footer__column{flex:1 1 50%}.landing .hero-widget .account{padding:10px 0;border-bottom:0}.landing .hero-widget .account .account__display-name{display:flex;align-items:center}.landing .hero-widget .account .account__avatar{width:44px;height:44px;background-size:44px 44px}.landing .hero-widget__counter{padding:10px}.landing .hero-widget__counter strong{font-family:sans-serif,sans-serif;font-size:15px;font-weight:700;display:block}.landing .hero-widget__counter span{font-size:14px;color:#dde3ec}.landing .simple_form .user_agreement .label_input>label{font-weight:400;color:#dde3ec}.landing .simple_form p.lead{color:#dde3ec;font-size:15px;line-height:20px;font-weight:400;margin-bottom:25px}.landing__grid{max-width:960px;margin:0 auto;display:grid;grid-template-columns:minmax(0, 50%) minmax(0, 50%);grid-gap:30px}@media screen and (max-width: 738px){.landing__grid{grid-template-columns:minmax(0, 100%);grid-gap:10px}.landing__grid__column-login{grid-row:1;display:flex;flex-direction:column}.landing__grid__column-login .box-widget{order:2;flex:0 0 auto}.landing__grid__column-login .hero-widget{margin-top:0;margin-bottom:10px;order:1;flex:0 0 auto}.landing__grid__column-registration{grid-row:2}.landing__grid .directory{margin-top:10px}}@media screen and (max-width: 415px){.landing__grid{grid-gap:0}.landing__grid .hero-widget{display:block;margin-bottom:0;box-shadow:none}.landing__grid .hero-widget__img,.landing__grid .hero-widget__img img,.landing__grid .hero-widget__footer{border-radius:0}.landing__grid .hero-widget,.landing__grid .box-widget,.landing__grid .directory__tag{border-bottom:1px solid #393f4f}.landing__grid .directory{margin-top:0}.landing__grid .directory__tag{margin-bottom:0}.landing__grid .directory__tag>a,.landing__grid .directory__tag>div{border-radius:0;box-shadow:none}.landing__grid .directory__tag:last-child{border-bottom:0}}.brand{position:relative;text-decoration:none}.brand__tagline{display:block;position:absolute;bottom:-10px;left:50px;width:300px;color:#9baec8;text-decoration:none;font-size:14px}@media screen and (max-width: 415px){.brand__tagline{position:static;width:auto;margin-top:20px;color:#c2cede}}.table{width:100%;max-width:100%;border-spacing:0;border-collapse:collapse}.table th,.table td{padding:8px;line-height:18px;vertical-align:top;border-top:1px solid #282c37;text-align:left;background:#1f232b}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #282c37;border-top:0;font-weight:500}.table>tbody>tr>th{font-weight:500}.table>tbody>tr:nth-child(odd)>td,.table>tbody>tr:nth-child(odd)>th{background:#282c37}.table a{color:#2b90d9;text-decoration:underline}.table a:hover{text-decoration:none}.table strong{font-weight:500}.table strong:lang(ja){font-weight:700}.table strong:lang(ko){font-weight:700}.table strong:lang(zh-CN){font-weight:700}.table strong:lang(zh-HK){font-weight:700}.table strong:lang(zh-TW){font-weight:700}.table.inline-table>tbody>tr:nth-child(odd)>td,.table.inline-table>tbody>tr:nth-child(odd)>th{background:transparent}.table.inline-table>tbody>tr:first-child>td,.table.inline-table>tbody>tr:first-child>th{border-top:0}.table.batch-table>thead>tr>th{background:#282c37;border-top:1px solid #17191f;border-bottom:1px solid #17191f}.table.batch-table>thead>tr>th:first-child{border-radius:4px 0 0;border-left:1px solid #17191f}.table.batch-table>thead>tr>th:last-child{border-radius:0 4px 0 0;border-right:1px solid #17191f}.table--invites tbody td{vertical-align:middle}.table-wrapper{overflow:auto;margin-bottom:20px}samp{font-family:monospace,monospace}button.table-action-link{background:transparent;border:0;font:inherit}button.table-action-link,a.table-action-link{text-decoration:none;display:inline-block;margin-right:5px;padding:0 10px;color:#dde3ec;font-weight:500}button.table-action-link:hover,a.table-action-link:hover{color:#fff}button.table-action-link i.fa,a.table-action-link i.fa{font-weight:400;margin-right:5px}button.table-action-link:first-child,a.table-action-link:first-child{padding-left:0}.batch-table__toolbar,.batch-table__row{display:flex}.batch-table__toolbar__select,.batch-table__row__select{box-sizing:border-box;padding:8px 16px;cursor:pointer;min-height:100%}.batch-table__toolbar__select input,.batch-table__row__select input{margin-top:8px}.batch-table__toolbar__select--aligned,.batch-table__row__select--aligned{display:flex;align-items:center}.batch-table__toolbar__select--aligned input,.batch-table__row__select--aligned input{margin-top:0}.batch-table__toolbar__actions,.batch-table__toolbar__content,.batch-table__row__actions,.batch-table__row__content{padding:8px 0;padding-right:16px;flex:1 1 auto}.batch-table__toolbar{border:1px solid #17191f;background:#282c37;border-radius:4px 0 0;height:47px;align-items:center}.batch-table__toolbar__actions{text-align:right;padding-right:11px}.batch-table__form{padding:16px;border:1px solid #17191f;border-top:0;background:#282c37}.batch-table__form .fields-row{padding-top:0;margin-bottom:0}.batch-table__row{border:1px solid #17191f;border-top:0;background:#1f232b}@media screen and (max-width: 415px){.optional .batch-table__row:first-child{border-top:1px solid #17191f}}.batch-table__row:hover{background:#242731}.batch-table__row:nth-child(even){background:#282c37}.batch-table__row:nth-child(even):hover{background:#2c313d}.batch-table__row__content{padding-top:12px;padding-bottom:16px}.batch-table__row__content--unpadded{padding:0}.batch-table__row__content--with-image{display:flex;align-items:center}.batch-table__row__content__image{flex:0 0 auto;display:flex;justify-content:center;align-items:center;margin-right:10px}.batch-table__row__content__image .emojione{width:32px;height:32px}.batch-table__row__content__text{flex:1 1 auto}.batch-table__row__content__extra{flex:0 0 auto;text-align:right;color:#dde3ec;font-weight:500}.batch-table__row .directory__tag{margin:0;width:100%}.batch-table__row .directory__tag a{background:transparent;border-radius:0}@media screen and (max-width: 415px){.batch-table.optional .batch-table__toolbar,.batch-table.optional .batch-table__row__select{display:none}}.batch-table .status__content{padding-top:0}.batch-table .status__content strong{font-weight:700}.batch-table .nothing-here{border:1px solid #17191f;border-top:0;box-shadow:none}@media screen and (max-width: 415px){.batch-table .nothing-here{border-top:1px solid #17191f}}@media screen and (max-width: 870px){.batch-table .accounts-table tbody td.optional{display:none}}.admin-wrapper{display:flex;justify-content:center;width:100%;min-height:100vh}.admin-wrapper .sidebar-wrapper{min-height:100vh;overflow:hidden;pointer-events:none;flex:1 1 auto}.admin-wrapper .sidebar-wrapper__inner{display:flex;justify-content:flex-end;background:#282c37;height:100%}.admin-wrapper .sidebar{width:240px;padding:0;pointer-events:auto}.admin-wrapper .sidebar__toggle{display:none;background:#393f4f;height:48px}.admin-wrapper .sidebar__toggle__logo{flex:1 1 auto}.admin-wrapper .sidebar__toggle__logo a{display:inline-block;padding:15px}.admin-wrapper .sidebar__toggle__logo svg{fill:#fff;height:20px;position:relative;bottom:-2px}.admin-wrapper .sidebar__toggle__icon{display:block;color:#dde3ec;text-decoration:none;flex:0 0 auto;font-size:20px;padding:15px}.admin-wrapper .sidebar__toggle a:hover,.admin-wrapper .sidebar__toggle a:focus,.admin-wrapper .sidebar__toggle a:active{background:#42485a}.admin-wrapper .sidebar .logo{display:block;margin:40px auto;width:100px;height:100px}@media screen and (max-width: 600px){.admin-wrapper .sidebar>a:first-child{display:none}}.admin-wrapper .sidebar ul{list-style:none;border-radius:4px 0 0 4px;overflow:hidden;margin-bottom:20px}@media screen and (max-width: 600px){.admin-wrapper .sidebar ul{margin-bottom:0}}.admin-wrapper .sidebar ul a{display:block;padding:15px;color:#dde3ec;text-decoration:none;transition:all 200ms linear;transition-property:color,background-color;border-radius:4px 0 0 4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.admin-wrapper .sidebar ul a i.fa{margin-right:5px}.admin-wrapper .sidebar ul a:hover{color:#fff;background-color:#1d2028;transition:all 100ms linear;transition-property:color,background-color}.admin-wrapper .sidebar ul a.selected{background:#242731;border-radius:4px 0 0}.admin-wrapper .sidebar ul ul{background:#1f232b;border-radius:0 0 0 4px;margin:0}.admin-wrapper .sidebar ul ul a{border:0;padding:15px 35px}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a{color:#fff;background-color:#2b5fd9;border-bottom:0;border-radius:0}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a:hover{background-color:#416fdd}.admin-wrapper .sidebar>ul>.simple-navigation-active-leaf a{border-radius:4px 0 0 4px}.admin-wrapper .content-wrapper{box-sizing:border-box;width:100%;max-width:840px;flex:1 1 auto}@media screen and (max-width: 1080px){.admin-wrapper .sidebar-wrapper--empty{display:none}.admin-wrapper .sidebar-wrapper{width:240px;flex:0 0 auto}}@media screen and (max-width: 600px){.admin-wrapper .sidebar-wrapper{width:100%}}.admin-wrapper .content{padding:20px 15px;padding-top:60px;padding-left:25px}@media screen and (max-width: 600px){.admin-wrapper .content{max-width:none;padding:15px;padding-top:30px}}.admin-wrapper .content-heading{display:flex;padding-bottom:40px;border-bottom:1px solid #393f4f;margin:-15px -15px 40px 0;flex-wrap:wrap;align-items:center;justify-content:space-between}.admin-wrapper .content-heading>*{margin-top:15px;margin-right:15px}.admin-wrapper .content-heading-actions{display:inline-flex}.admin-wrapper .content-heading-actions>:not(:first-child){margin-left:5px}@media screen and (max-width: 600px){.admin-wrapper .content-heading{border-bottom:0;padding-bottom:0}}.admin-wrapper .content h2{color:#ecf0f4;font-size:24px;line-height:28px;font-weight:400}@media screen and (max-width: 600px){.admin-wrapper .content h2{font-weight:700}}.admin-wrapper .content h3{color:#ecf0f4;font-size:20px;line-height:28px;font-weight:400;margin-bottom:30px}.admin-wrapper .content h4{text-transform:uppercase;font-size:13px;font-weight:700;color:#dde3ec;padding-bottom:8px;margin-bottom:8px;border-bottom:1px solid #393f4f}.admin-wrapper .content h6{font-size:16px;color:#ecf0f4;line-height:28px;font-weight:500}.admin-wrapper .content .fields-group h6{color:#fff;font-weight:500}.admin-wrapper .content .directory__tag>a,.admin-wrapper .content .directory__tag>div{box-shadow:none}.admin-wrapper .content .directory__tag .table-action-link .fa{color:inherit}.admin-wrapper .content .directory__tag h4{font-size:18px;font-weight:700;color:#fff;text-transform:none;padding-bottom:0;margin-bottom:0;border-bottom:none}.admin-wrapper .content>p{font-size:14px;line-height:21px;color:#ecf0f4;margin-bottom:20px}.admin-wrapper .content>p strong{color:#fff;font-weight:500}.admin-wrapper .content>p strong:lang(ja){font-weight:700}.admin-wrapper .content>p strong:lang(ko){font-weight:700}.admin-wrapper .content>p strong:lang(zh-CN){font-weight:700}.admin-wrapper .content>p strong:lang(zh-HK){font-weight:700}.admin-wrapper .content>p strong:lang(zh-TW){font-weight:700}.admin-wrapper .content hr{width:100%;height:0;border:0;border-bottom:1px solid rgba(96,105,132,.6);margin:20px 0}.admin-wrapper .content hr.spacer{height:1px;border:0}@media screen and (max-width: 600px){.admin-wrapper{display:block}.admin-wrapper .sidebar-wrapper{min-height:0}.admin-wrapper .sidebar{width:100%;padding:0;height:auto}.admin-wrapper .sidebar__toggle{display:flex}.admin-wrapper .sidebar>ul{display:none}.admin-wrapper .sidebar ul a,.admin-wrapper .sidebar ul ul a{border-radius:0;border-bottom:1px solid #313543;transition:none}.admin-wrapper .sidebar ul a:hover,.admin-wrapper .sidebar ul ul a:hover{transition:none}.admin-wrapper .sidebar ul ul{border-radius:0}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a{border-bottom-color:#2b5fd9}}hr.spacer{width:100%;border:0;margin:20px 0;height:1px}body .muted-hint,.admin-wrapper .content .muted-hint{color:#dde3ec}body .muted-hint a,.admin-wrapper .content .muted-hint a{color:#2b90d9}body .positive-hint,.admin-wrapper .content .positive-hint{color:#79bd9a;font-weight:500}body .negative-hint,.admin-wrapper .content .negative-hint{color:#df405a;font-weight:500}body .neutral-hint,.admin-wrapper .content .neutral-hint{color:#c2cede;font-weight:500}body .warning-hint,.admin-wrapper .content .warning-hint{color:#ca8f04;font-weight:500}.filters{display:flex;flex-wrap:wrap}.filters .filter-subset{flex:0 0 auto;margin:0 40px 20px 0}.filters .filter-subset:last-child{margin-bottom:30px}.filters .filter-subset ul{margin-top:5px;list-style:none}.filters .filter-subset ul li{display:inline-block;margin-right:5px}.filters .filter-subset strong{font-weight:500;text-transform:uppercase;font-size:12px}.filters .filter-subset strong:lang(ja){font-weight:700}.filters .filter-subset strong:lang(ko){font-weight:700}.filters .filter-subset strong:lang(zh-CN){font-weight:700}.filters .filter-subset strong:lang(zh-HK){font-weight:700}.filters .filter-subset strong:lang(zh-TW){font-weight:700}.filters .filter-subset--with-select strong{display:block;margin-bottom:10px}.filters .filter-subset a{display:inline-block;color:#dde3ec;text-decoration:none;text-transform:uppercase;font-size:12px;font-weight:500;border-bottom:2px solid #282c37}.filters .filter-subset a:hover{color:#fff;border-bottom:2px solid #333846}.filters .filter-subset a.selected{color:#2b90d9;border-bottom:2px solid #2b5fd9}.flavour-screen{display:block;margin:10px auto;max-width:100%}.flavour-description{display:block;font-size:16px;margin:10px 0}.flavour-description>p{margin:10px 0}.report-accounts{display:flex;flex-wrap:wrap;margin-bottom:20px}.report-accounts__item{display:flex;flex:250px;flex-direction:column;margin:0 5px}.report-accounts__item>strong{display:block;margin:0 0 10px -5px;font-weight:500;font-size:14px;line-height:18px;color:#ecf0f4}.report-accounts__item>strong:lang(ja){font-weight:700}.report-accounts__item>strong:lang(ko){font-weight:700}.report-accounts__item>strong:lang(zh-CN){font-weight:700}.report-accounts__item>strong:lang(zh-HK){font-weight:700}.report-accounts__item>strong:lang(zh-TW){font-weight:700}.report-accounts__item .account-card{flex:1 1 auto}.report-status,.account-status{display:flex;margin-bottom:10px}.report-status .activity-stream,.account-status .activity-stream{flex:2 0 0;margin-right:20px;max-width:calc(100% - 60px)}.report-status .activity-stream .entry,.account-status .activity-stream .entry{border-radius:4px}.report-status__actions,.account-status__actions{flex:0 0 auto;display:flex;flex-direction:column}.report-status__actions .icon-button,.account-status__actions .icon-button{font-size:24px;width:24px;text-align:center;margin-bottom:10px}.simple_form.new_report_note,.simple_form.new_account_moderation_note{max-width:100%}.batch-form-box{display:flex;flex-wrap:wrap;margin-bottom:5px}.batch-form-box #form_status_batch_action{margin:0 5px 5px 0;font-size:14px}.batch-form-box input.button{margin:0 5px 5px 0}.batch-form-box .media-spoiler-toggle-buttons{margin-left:auto}.batch-form-box .media-spoiler-toggle-buttons .button{overflow:visible;margin:0 0 5px 5px;float:right}.back-link{margin-bottom:10px;font-size:14px}.back-link a{color:#2b90d9;text-decoration:none}.back-link a:hover{text-decoration:underline}.spacer{flex:1 1 auto}.log-entry{line-height:20px;padding:15px 0;background:#282c37;border-bottom:1px solid #313543}.log-entry:last-child{border-bottom:0}.log-entry__header{display:flex;justify-content:flex-start;align-items:center;color:#dde3ec;font-size:14px;padding:0 10px}.log-entry__avatar{margin-right:10px}.log-entry__avatar .avatar{display:block;margin:0;border-radius:50%;width:40px;height:40px}.log-entry__content{max-width:calc(100% - 90px)}.log-entry__title{word-wrap:break-word}.log-entry__timestamp{color:#c2cede}.log-entry a,.log-entry .username,.log-entry .target{color:#ecf0f4;text-decoration:none;font-weight:500}a.name-tag,.name-tag,a.inline-name-tag,.inline-name-tag{text-decoration:none;color:#ecf0f4}a.name-tag .username,.name-tag .username,a.inline-name-tag .username,.inline-name-tag .username{font-weight:500}a.name-tag.suspended .username,.name-tag.suspended .username,a.inline-name-tag.suspended .username,.inline-name-tag.suspended .username{text-decoration:line-through;color:#e87487}a.name-tag.suspended .avatar,.name-tag.suspended .avatar,a.inline-name-tag.suspended .avatar,.inline-name-tag.suspended .avatar{filter:grayscale(100%);opacity:.8}a.name-tag,.name-tag{display:flex;align-items:center}a.name-tag .avatar,.name-tag .avatar{display:block;margin:0;margin-right:5px;border-radius:50%}a.name-tag.suspended .avatar,.name-tag.suspended .avatar{filter:grayscale(100%);opacity:.8}.speech-bubble{margin-bottom:20px;border-left:4px solid #2b5fd9}.speech-bubble.positive{border-left-color:#79bd9a}.speech-bubble.negative{border-left-color:#e87487}.speech-bubble.warning{border-left-color:#ca8f04}.speech-bubble__bubble{padding:16px;padding-left:14px;font-size:15px;line-height:20px;border-radius:4px 4px 4px 0;position:relative;font-weight:500}.speech-bubble__bubble a{color:#dde3ec}.speech-bubble__owner{padding:8px;padding-left:12px}.speech-bubble time{color:#c2cede}.report-card{background:#282c37;border-radius:4px;margin-bottom:20px}.report-card__profile{display:flex;justify-content:space-between;align-items:center;padding:15px}.report-card__profile .account{padding:0;border:0}.report-card__profile .account__avatar-wrapper{margin-left:0}.report-card__profile__stats{flex:0 0 auto;font-weight:500;color:#dde3ec;text-transform:uppercase;text-align:right}.report-card__profile__stats a{color:inherit;text-decoration:none}.report-card__profile__stats a:focus,.report-card__profile__stats a:hover,.report-card__profile__stats a:active{color:#f7f9fb}.report-card__profile__stats .red{color:#df405a}.report-card__summary__item{display:flex;justify-content:flex-start;border-top:1px solid #1f232b}.report-card__summary__item:hover{background:#2c313d}.report-card__summary__item__reported-by,.report-card__summary__item__assigned{padding:15px;flex:0 0 auto;box-sizing:border-box;width:150px;color:#dde3ec}.report-card__summary__item__reported-by,.report-card__summary__item__reported-by .username,.report-card__summary__item__assigned,.report-card__summary__item__assigned .username{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.report-card__summary__item__content{flex:1 1 auto;max-width:calc(100% - 300px)}.report-card__summary__item__content__icon{color:#c2cede;margin-right:4px;font-weight:500}.report-card__summary__item__content a{display:block;box-sizing:border-box;width:100%;padding:15px;text-decoration:none;color:#dde3ec}.one-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ellipsized-ip{display:inline-block;max-width:120px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.admin-account-bio{display:flex;flex-wrap:wrap;margin:0 -5px;margin-top:20px}.admin-account-bio>div{box-sizing:border-box;padding:0 5px;margin-bottom:10px;flex:1 0 50%}.admin-account-bio .account__header__fields,.admin-account-bio .account__header__content{background:#393f4f;border-radius:4px;height:100%}.admin-account-bio .account__header__fields{margin:0;border:0}.admin-account-bio .account__header__fields a{color:#4e79df}.admin-account-bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.admin-account-bio .account__header__fields .verified a{color:#79bd9a}.admin-account-bio .account__header__content{box-sizing:border-box;padding:20px;color:#fff}.center-text{text-align:center}.announcements-list{border:1px solid #313543;border-radius:4px}.announcements-list__item{padding:15px 0;background:#282c37;border-bottom:1px solid #313543}.announcements-list__item__title{padding:0 15px;display:block;font-weight:500;font-size:18px;line-height:1.5;color:#ecf0f4;text-decoration:none;margin-bottom:10px}.announcements-list__item__title:hover,.announcements-list__item__title:focus,.announcements-list__item__title:active{color:#fff}.announcements-list__item__meta{padding:0 15px;color:#c2cede}.announcements-list__item__action-bar{display:flex;justify-content:space-between;align-items:center}.announcements-list__item:last-child{border-bottom:0}.emojione[title=\":wavy_dash:\"],.emojione[title=\":waving_black_flag:\"],.emojione[title=\":water_buffalo:\"],.emojione[title=\":video_game:\"],.emojione[title=\":video_camera:\"],.emojione[title=\":vhs:\"],.emojione[title=\":turkey:\"],.emojione[title=\":tophat:\"],.emojione[title=\":top:\"],.emojione[title=\":tm:\"],.emojione[title=\":telephone_receiver:\"],.emojione[title=\":spider:\"],.emojione[title=\":speaking_head_in_silhouette:\"],.emojione[title=\":spades:\"],.emojione[title=\":soon:\"],.emojione[title=\":registered:\"],.emojione[title=\":on:\"],.emojione[title=\":musical_score:\"],.emojione[title=\":movie_camera:\"],.emojione[title=\":mortar_board:\"],.emojione[title=\":microphone:\"],.emojione[title=\":male-guard:\"],.emojione[title=\":lower_left_fountain_pen:\"],.emojione[title=\":lower_left_ballpoint_pen:\"],.emojione[title=\":kaaba:\"],.emojione[title=\":joystick:\"],.emojione[title=\":hole:\"],.emojione[title=\":hocho:\"],.emojione[title=\":heavy_plus_sign:\"],.emojione[title=\":heavy_multiplication_x:\"],.emojione[title=\":heavy_minus_sign:\"],.emojione[title=\":heavy_dollar_sign:\"],.emojione[title=\":heavy_division_sign:\"],.emojione[title=\":heavy_check_mark:\"],.emojione[title=\":guardsman:\"],.emojione[title=\":gorilla:\"],.emojione[title=\":fried_egg:\"],.emojione[title=\":film_projector:\"],.emojione[title=\":female-guard:\"],.emojione[title=\":end:\"],.emojione[title=\":electric_plug:\"],.emojione[title=\":eight_pointed_black_star:\"],.emojione[title=\":dark_sunglasses:\"],.emojione[title=\":currency_exchange:\"],.emojione[title=\":curly_loop:\"],.emojione[title=\":copyright:\"],.emojione[title=\":clubs:\"],.emojione[title=\":camera_with_flash:\"],.emojione[title=\":camera:\"],.emojione[title=\":busts_in_silhouette:\"],.emojione[title=\":bust_in_silhouette:\"],.emojione[title=\":bowling:\"],.emojione[title=\":bomb:\"],.emojione[title=\":black_small_square:\"],.emojione[title=\":black_nib:\"],.emojione[title=\":black_medium_square:\"],.emojione[title=\":black_medium_small_square:\"],.emojione[title=\":black_large_square:\"],.emojione[title=\":black_heart:\"],.emojione[title=\":black_circle:\"],.emojione[title=\":back:\"],.emojione[title=\":ant:\"],.emojione[title=\":8ball:\"]{filter:drop-shadow(1px 1px 0 #ffffff) drop-shadow(-1px 1px 0 #ffffff) drop-shadow(1px -1px 0 #ffffff) drop-shadow(-1px -1px 0 #ffffff)}.hicolor-privacy-icons .status__visibility-icon.fa-globe,.hicolor-privacy-icons .composer--options--dropdown--content--item .fa-globe{color:#1976d2}.hicolor-privacy-icons .status__visibility-icon.fa-unlock,.hicolor-privacy-icons .composer--options--dropdown--content--item .fa-unlock{color:#388e3c}.hicolor-privacy-icons .status__visibility-icon.fa-lock,.hicolor-privacy-icons .composer--options--dropdown--content--item .fa-lock{color:#ffa000}.hicolor-privacy-icons .status__visibility-icon.fa-envelope,.hicolor-privacy-icons .composer--options--dropdown--content--item .fa-envelope{color:#d32f2f}body.rtl{direction:rtl}body.rtl .column-header>button{text-align:right;padding-left:0;padding-right:15px}body.rtl .radio-button__input{margin-right:0;margin-left:10px}body.rtl .directory__card__bar .display-name{margin-left:0;margin-right:15px}body.rtl .display-name{text-align:right}body.rtl .notification__message{margin-left:0;margin-right:68px}body.rtl .drawer__inner__mastodon>img{transform:scaleX(-1)}body.rtl .notification__favourite-icon-wrapper{left:auto;right:-26px}body.rtl .landing-page__logo{margin-right:0;margin-left:20px}body.rtl .landing-page .features-list .features-list__row .visual{margin-left:0;margin-right:15px}body.rtl .column-link__icon,body.rtl .column-header__icon{margin-right:0;margin-left:5px}body.rtl .compose-form .compose-form__buttons-wrapper .character-counter__wrapper{margin-right:0;margin-left:4px}body.rtl .composer--publisher{text-align:left}body.rtl .boost-modal__status-time,body.rtl .favourite-modal__status-time{float:left}body.rtl .navigation-bar__profile{margin-left:0;margin-right:8px}body.rtl .search__input{padding-right:10px;padding-left:30px}body.rtl .search__icon .fa{right:auto;left:10px}body.rtl .columns-area{direction:rtl}body.rtl .column-header__buttons{left:0;right:auto;margin-left:0;margin-right:-15px}body.rtl .column-inline-form .icon-button{margin-left:0;margin-right:5px}body.rtl .column-header__links .text-btn{margin-left:10px;margin-right:0}body.rtl .account__avatar-wrapper{float:right}body.rtl .column-header__back-button{padding-left:5px;padding-right:0}body.rtl .column-header__setting-arrows{float:left}body.rtl .setting-toggle__label{margin-left:0;margin-right:8px}body.rtl .setting-meta__label{float:left}body.rtl .status__avatar{margin-left:10px;margin-right:0;left:auto;right:10px}body.rtl .activity-stream .status.light{padding-left:10px;padding-right:68px}body.rtl .status__info .status__display-name,body.rtl .activity-stream .status.light .status__display-name{padding-left:25px;padding-right:0}body.rtl .activity-stream .pre-header{padding-right:68px;padding-left:0}body.rtl .status__prepend{margin-left:0;margin-right:58px}body.rtl .status__prepend-icon-wrapper{left:auto;right:-26px}body.rtl .activity-stream .pre-header .pre-header__icon{left:auto;right:42px}body.rtl .account__avatar-overlay-overlay{right:auto;left:0}body.rtl .column-back-button--slim-button{right:auto;left:0}body.rtl .status__relative-time,body.rtl .activity-stream .status.light .status__header .status__meta{float:left;text-align:left}body.rtl .status__action-bar__counter{margin-right:0;margin-left:11px}body.rtl .status__action-bar__counter .status__action-bar-button{margin-right:0;margin-left:4px}body.rtl .status__action-bar-button{float:right;margin-right:0;margin-left:18px}body.rtl .status__action-bar-dropdown{float:right}body.rtl .privacy-dropdown__dropdown{margin-left:0;margin-right:40px}body.rtl .privacy-dropdown__option__icon{margin-left:10px;margin-right:0}body.rtl .detailed-status__display-name .display-name{text-align:right}body.rtl .detailed-status__display-avatar{margin-right:0;margin-left:10px;float:right}body.rtl .detailed-status__favorites,body.rtl .detailed-status__reblogs{margin-left:0;margin-right:6px}body.rtl .fa-ul{margin-left:2.14285714em}body.rtl .fa-li{left:auto;right:-2.14285714em}body.rtl .admin-wrapper{direction:rtl}body.rtl .admin-wrapper .sidebar ul a i.fa,body.rtl a.table-action-link i.fa{margin-right:0;margin-left:5px}body.rtl .simple_form .check_boxes .checkbox label{padding-left:0;padding-right:25px}body.rtl .simple_form .input.with_label.boolean label.checkbox{padding-left:25px;padding-right:0}body.rtl .simple_form .check_boxes .checkbox input[type=checkbox],body.rtl .simple_form .input.boolean input[type=checkbox]{left:auto;right:0}body.rtl .simple_form .input.radio_buttons .radio{left:auto;right:0}body.rtl .simple_form .input.radio_buttons .radio>label{padding-right:28px;padding-left:0}body.rtl .simple_form .input-with-append .input input{padding-left:142px;padding-right:0}body.rtl .simple_form .input.boolean label.checkbox{left:auto;right:0}body.rtl .simple_form .input.boolean .label_input,body.rtl .simple_form .input.boolean .hint{padding-left:0;padding-right:28px}body.rtl .simple_form .label_input__append{right:auto;left:3px}body.rtl .simple_form .label_input__append::after{right:auto;left:0;background-image:linear-gradient(to left, rgba(19, 20, 25, 0), #131419)}body.rtl .simple_form select{background:#131419 url(\"data:image/svg+xml;utf8,\") no-repeat left 8px center/auto 16px}body.rtl .table th,body.rtl .table td{text-align:right}body.rtl .filters .filter-subset{margin-right:0;margin-left:45px}body.rtl .landing-page .header-wrapper .mascot{right:60px;left:auto}body.rtl .landing-page__call-to-action .row__information-board{direction:rtl}body.rtl .landing-page .header .hero .floats .float-1{left:-120px;right:auto}body.rtl .landing-page .header .hero .floats .float-2{left:210px;right:auto}body.rtl .landing-page .header .hero .floats .float-3{left:110px;right:auto}body.rtl .landing-page .header .links .brand img{left:0}body.rtl .landing-page .fa-external-link{padding-right:5px;padding-left:0 !important}body.rtl .landing-page .features #mastodon-timeline{margin-right:0;margin-left:30px}@media screen and (min-width: 631px){body.rtl .column,body.rtl .drawer{padding-left:5px;padding-right:5px}body.rtl .column:first-child,body.rtl .drawer:first-child{padding-left:5px;padding-right:10px}body.rtl .columns-area>div .column,body.rtl .columns-area>div .drawer{padding-left:5px;padding-right:5px}}body.rtl .columns-area--mobile .column,body.rtl .columns-area--mobile .drawer{padding-left:0;padding-right:0}body.rtl .public-layout .header .nav-button{margin-left:8px;margin-right:0}body.rtl .public-layout .public-account-header__tabs{margin-left:0;margin-right:20px}body.rtl .landing-page__information .account__display-name{margin-right:0;margin-left:5px}body.rtl .landing-page__information .account__avatar-wrapper{margin-left:12px;margin-right:0}body.rtl .card__bar .display-name{margin-left:0;margin-right:15px;text-align:right}body.rtl .fa-chevron-left::before{content:\"\"}body.rtl .fa-chevron-right::before{content:\"\"}body.rtl .column-back-button__icon{margin-right:0;margin-left:5px}body.rtl .column-header__setting-arrows .column-header__setting-btn:last-child{padding-left:0;padding-right:10px}body.rtl .simple_form .input.radio_buttons .radio>label input{left:auto;right:0}.dashboard__counters{display:flex;flex-wrap:wrap;margin:0 -5px;margin-bottom:20px}.dashboard__counters>div{box-sizing:border-box;flex:0 0 33.333%;padding:0 5px;margin-bottom:10px}.dashboard__counters>div>div,.dashboard__counters>div>a{padding:20px;background:#313543;border-radius:4px;box-sizing:border-box;height:100%}.dashboard__counters>div>a{text-decoration:none;color:inherit;display:block}.dashboard__counters>div>a:hover,.dashboard__counters>div>a:focus,.dashboard__counters>div>a:active{background:#393f4f}.dashboard__counters__num,.dashboard__counters__text{text-align:center;font-weight:500;font-size:24px;line-height:21px;color:#fff;font-family:sans-serif,sans-serif;margin-bottom:20px;line-height:30px}.dashboard__counters__text{font-size:18px}.dashboard__counters__label{font-size:14px;color:#dde3ec;text-align:center;font-weight:500}.dashboard__widgets{display:flex;flex-wrap:wrap;margin:0 -5px}.dashboard__widgets>div{flex:0 0 33.333%;margin-bottom:20px}.dashboard__widgets>div>div{padding:0 5px}.dashboard__widgets a:not(.name-tag){color:#d9e1e8;font-weight:500;text-decoration:none}.compose-form .compose-form__modifiers .compose-form__upload-description input::placeholder{opacity:1}.rich-formatting a,.rich-formatting p a,.rich-formatting li a,.landing-page__short-description p a,.status__content a,.reply-indicator__content a{color:#5f86e2;text-decoration:underline}.rich-formatting a.mention,.rich-formatting p a.mention,.rich-formatting li a.mention,.landing-page__short-description p a.mention,.status__content a.mention,.reply-indicator__content a.mention{text-decoration:none}.rich-formatting a.mention span,.rich-formatting p a.mention span,.rich-formatting li a.mention span,.landing-page__short-description p a.mention span,.status__content a.mention span,.reply-indicator__content a.mention span{text-decoration:underline}.rich-formatting a.mention span:hover,.rich-formatting a.mention span:focus,.rich-formatting a.mention span:active,.rich-formatting p a.mention span:hover,.rich-formatting p a.mention span:focus,.rich-formatting p a.mention span:active,.rich-formatting li a.mention span:hover,.rich-formatting li a.mention span:focus,.rich-formatting li a.mention span:active,.landing-page__short-description p a.mention span:hover,.landing-page__short-description p a.mention span:focus,.landing-page__short-description p a.mention span:active,.status__content a.mention span:hover,.status__content a.mention span:focus,.status__content a.mention span:active,.reply-indicator__content a.mention span:hover,.reply-indicator__content a.mention span:focus,.reply-indicator__content a.mention span:active{text-decoration:none}.rich-formatting a:hover,.rich-formatting a:focus,.rich-formatting a:active,.rich-formatting p a:hover,.rich-formatting p a:focus,.rich-formatting p a:active,.rich-formatting li a:hover,.rich-formatting li a:focus,.rich-formatting li a:active,.landing-page__short-description p a:hover,.landing-page__short-description p a:focus,.landing-page__short-description p a:active,.status__content a:hover,.status__content a:focus,.status__content a:active,.reply-indicator__content a:hover,.reply-indicator__content a:focus,.reply-indicator__content a:active{text-decoration:none}.rich-formatting a.status__content__spoiler-link,.rich-formatting p a.status__content__spoiler-link,.rich-formatting li a.status__content__spoiler-link,.landing-page__short-description p a.status__content__spoiler-link,.status__content a.status__content__spoiler-link,.reply-indicator__content a.status__content__spoiler-link{color:#ecf0f4;text-decoration:none}.status__content__read-more-button{text-decoration:underline}.status__content__read-more-button:hover,.status__content__read-more-button:focus,.status__content__read-more-button:active{text-decoration:none}.getting-started__footer a{text-decoration:underline}.getting-started__footer a:hover,.getting-started__footer a:focus,.getting-started__footer a:active{text-decoration:none}.nothing-here{color:#dde3ec}.public-layout .public-account-header__tabs__tabs .counter.active::after{border-bottom:4px solid #2b5fd9}","/* http://meyerweb.com/eric/tools/css/reset/\n v2.0 | 20110126\n License: none (public domain)\n*/\n\nhtml, body, div, span, applet, object, iframe,\nh1, h2, h3, h4, h5, h6, p, blockquote, pre,\na, abbr, acronym, address, big, cite, code,\ndel, dfn, em, img, ins, kbd, q, s, samp,\nsmall, strike, strong, sub, sup, tt, var,\nb, u, i, center,\ndl, dt, dd, ol, ul, li,\nfieldset, form, label, legend,\ntable, caption, tbody, tfoot, thead, tr, th, td,\narticle, aside, canvas, details, embed,\nfigure, figcaption, footer, header, hgroup,\nmenu, nav, output, ruby, section, summary,\ntime, mark, audio, video {\n margin: 0;\n padding: 0;\n border: 0;\n font-size: 100%;\n font: inherit;\n vertical-align: baseline;\n}\n\n/* HTML5 display-role reset for older browsers */\narticle, aside, details, figcaption, figure,\nfooter, header, hgroup, menu, nav, section {\n display: block;\n}\n\nbody {\n line-height: 1;\n}\n\nol, ul {\n list-style: none;\n}\n\nblockquote, q {\n quotes: none;\n}\n\nblockquote:before, blockquote:after,\nq:before, q:after {\n content: '';\n content: none;\n}\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\nhtml {\n scrollbar-color: lighten($ui-base-color, 4%) rgba($base-overlay-background, 0.1);\n}\n\n::-webkit-scrollbar {\n width: 12px;\n height: 12px;\n}\n\n::-webkit-scrollbar-thumb {\n background: lighten($ui-base-color, 4%);\n border: 0px none $base-border-color;\n border-radius: 50px;\n}\n\n::-webkit-scrollbar-thumb:hover {\n background: lighten($ui-base-color, 6%);\n}\n\n::-webkit-scrollbar-thumb:active {\n background: lighten($ui-base-color, 4%);\n}\n\n::-webkit-scrollbar-track {\n border: 0px none $base-border-color;\n border-radius: 0;\n background: rgba($base-overlay-background, 0.1);\n}\n\n::-webkit-scrollbar-track:hover {\n background: $ui-base-color;\n}\n\n::-webkit-scrollbar-track:active {\n background: $ui-base-color;\n}\n\n::-webkit-scrollbar-corner {\n background: transparent;\n}\n","// Dependent colors\n$black: #000000;\n\n$classic-base-color: #282c37;\n$classic-primary-color: #9baec8;\n$classic-secondary-color: #d9e1e8;\n$classic-highlight-color: #2b90d9;\n\n$ui-base-color: $classic-base-color !default;\n$ui-primary-color: $classic-primary-color !default;\n$ui-secondary-color: $classic-secondary-color !default;\n\n// Differences\n$ui-highlight-color: #2b5fd9;\n\n$darker-text-color: lighten($ui-primary-color, 20%) !default;\n$dark-text-color: lighten($ui-primary-color, 12%) !default;\n$secondary-text-color: lighten($ui-secondary-color, 6%) !default;\n$highlight-text-color: $classic-highlight-color !default;\n$action-button-color: #8d9ac2;\n\n$inverted-text-color: $black !default;\n$lighter-text-color: darken($ui-base-color,6%) !default;\n$light-text-color: darken($ui-primary-color, 40%) !default;\n","@function hex-color($color) {\n @if type-of($color) == 'color' {\n $color: str-slice(ie-hex-str($color), 4);\n }\n @return '%23' + unquote($color)\n}\n\nbody {\n font-family: $font-sans-serif, sans-serif;\n background: darken($ui-base-color, 7%);\n font-size: 13px;\n line-height: 18px;\n font-weight: 400;\n color: $primary-text-color;\n text-rendering: optimizelegibility;\n font-feature-settings: \"kern\";\n text-size-adjust: none;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n -webkit-tap-highlight-color: transparent;\n\n &.system-font {\n // system-ui => standard property (Chrome/Android WebView 56+, Opera 43+, Safari 11+)\n // -apple-system => Safari <11 specific\n // BlinkMacSystemFont => Chrome <56 on macOS specific\n // Segoe UI => Windows 7/8/10\n // Oxygen => KDE\n // Ubuntu => Unity/Ubuntu\n // Cantarell => GNOME\n // Fira Sans => Firefox OS\n // Droid Sans => Older Androids (<4.0)\n // Helvetica Neue => Older macOS <10.11\n // $font-sans-serif => web-font (Roboto) fallback and newer Androids (>=4.0)\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Oxygen\", \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", $font-sans-serif, sans-serif;\n }\n\n &.app-body {\n padding: 0;\n\n &.layout-single-column {\n height: auto;\n min-height: 100vh;\n overflow-y: scroll;\n }\n\n &.layout-multiple-columns {\n position: absolute;\n width: 100%;\n height: 100%;\n }\n\n &.with-modals--active {\n overflow-y: hidden;\n }\n }\n\n &.lighter {\n background: $ui-base-color;\n }\n\n &.with-modals {\n overflow-x: hidden;\n overflow-y: scroll;\n\n &--active {\n overflow-y: hidden;\n }\n }\n\n &.embed {\n background: lighten($ui-base-color, 4%);\n margin: 0;\n padding-bottom: 0;\n\n .container {\n position: absolute;\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n }\n\n &.admin {\n background: darken($ui-base-color, 4%);\n padding: 0;\n }\n\n &.error {\n position: absolute;\n text-align: center;\n color: $darker-text-color;\n background: $ui-base-color;\n width: 100%;\n height: 100%;\n padding: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n\n .dialog {\n vertical-align: middle;\n margin: 20px;\n\n img {\n display: block;\n max-width: 470px;\n width: 100%;\n height: auto;\n margin-top: -120px;\n }\n\n h1 {\n font-size: 20px;\n line-height: 28px;\n font-weight: 400;\n }\n }\n }\n}\n\nbutton {\n font-family: inherit;\n cursor: pointer;\n\n &:focus {\n outline: none;\n }\n}\n\n.app-holder {\n &,\n & > div {\n display: flex;\n width: 100%;\n align-items: center;\n justify-content: center;\n outline: 0 !important;\n }\n}\n\n.layout-single-column .app-holder {\n &,\n & > div {\n min-height: 100vh;\n }\n}\n\n.layout-multiple-columns .app-holder {\n &,\n & > div {\n height: 100%;\n }\n}\n","// Commonly used web colors\n$black: #000000; // Black\n$white: #ffffff; // White\n$success-green: #79bd9a; // Padua\n$error-red: #df405a; // Cerise\n$warning-red: #ff5050; // Sunset Orange\n$gold-star: #ca8f04; // Dark Goldenrod\n\n$red-bookmark: $warning-red;\n\n// Pleroma-Dark colors\n$pleroma-bg: #121a24;\n$pleroma-fg: #182230;\n$pleroma-text: #b9b9ba;\n$pleroma-links: #d8a070;\n\n// Values from the classic Mastodon UI\n$classic-base-color: $pleroma-bg;\n$classic-primary-color: #9baec8;\n$classic-secondary-color: #d9e1e8;\n$classic-highlight-color: #d8a070;\n\n// Variables for defaults in UI\n$base-shadow-color: $black !default;\n$base-overlay-background: $black !default;\n$base-border-color: $white !default;\n$simple-background-color: $white !default;\n$valid-value-color: $success-green !default;\n$error-value-color: $error-red !default;\n\n// Tell UI to use selected colors\n$ui-base-color: $classic-base-color !default; // Darkest\n$ui-base-lighter-color: lighten($ui-base-color, 26%) !default; // Lighter darkest\n$ui-primary-color: $classic-primary-color !default; // Lighter\n$ui-secondary-color: $classic-secondary-color !default; // Lightest\n$ui-highlight-color: $classic-highlight-color !default;\n\n// Variables for texts\n$primary-text-color: $white !default;\n$darker-text-color: $ui-primary-color !default;\n$dark-text-color: $ui-base-lighter-color !default;\n$secondary-text-color: $ui-secondary-color !default;\n$highlight-text-color: $ui-highlight-color !default;\n$action-button-color: $ui-base-lighter-color !default;\n// For texts on inverted backgrounds\n$inverted-text-color: $ui-base-color !default;\n$lighter-text-color: $ui-base-lighter-color !default;\n$light-text-color: $ui-primary-color !default;\n\n// Language codes that uses CJK fonts\n$cjk-langs: ja, ko, zh-CN, zh-HK, zh-TW;\n\n// Variables for components\n$media-modal-media-max-width: 100%;\n// put margins on top and bottom of image to avoid the screen covered by image.\n$media-modal-media-max-height: 80%;\n\n$no-gap-breakpoint: 415px;\n\n$font-sans-serif: sans-serif !default;\n$font-display: sans-serif !default;\n$font-monospace: monospace !default;\n\n// Avatar border size (8% default, 100% for rounded avatars)\n$ui-avatar-border-size: 8%;\n\n// More variables\n$dismiss-overlay-width: 4rem;\n",".container-alt {\n width: 700px;\n margin: 0 auto;\n margin-top: 40px;\n\n @media screen and (max-width: 740px) {\n width: 100%;\n margin: 0;\n }\n}\n\n.logo-container {\n margin: 100px auto 50px;\n\n @media screen and (max-width: 500px) {\n margin: 40px auto 0;\n }\n\n h1 {\n display: flex;\n justify-content: center;\n align-items: center;\n\n svg {\n fill: $primary-text-color;\n height: 42px;\n margin-right: 10px;\n }\n\n a {\n display: flex;\n justify-content: center;\n align-items: center;\n color: $primary-text-color;\n text-decoration: none;\n outline: 0;\n padding: 12px 16px;\n line-height: 32px;\n font-family: $font-display, sans-serif;\n font-weight: 500;\n font-size: 14px;\n }\n }\n}\n\n.compose-standalone {\n .compose-form {\n width: 400px;\n margin: 0 auto;\n padding: 20px 0;\n margin-top: 40px;\n box-sizing: border-box;\n\n @media screen and (max-width: 400px) {\n width: 100%;\n margin-top: 0;\n padding: 20px;\n }\n }\n}\n\n.account-header {\n width: 400px;\n margin: 0 auto;\n display: flex;\n font-size: 13px;\n line-height: 18px;\n box-sizing: border-box;\n padding: 20px 0;\n padding-bottom: 0;\n margin-bottom: -30px;\n margin-top: 40px;\n\n @media screen and (max-width: 440px) {\n width: 100%;\n margin: 0;\n margin-bottom: 10px;\n padding: 20px;\n padding-bottom: 0;\n }\n\n .avatar {\n width: 40px;\n height: 40px;\n @include avatar-size(40px);\n margin-right: 8px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n @include avatar-radius();\n }\n }\n\n .name {\n flex: 1 1 auto;\n color: $secondary-text-color;\n width: calc(100% - 88px);\n\n .username {\n display: block;\n font-weight: 500;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n }\n\n .logout-link {\n display: block;\n font-size: 32px;\n line-height: 40px;\n margin-left: 8px;\n }\n}\n\n.grid-3 {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: 3fr 1fr;\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-column: 1/3;\n grid-row: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 2;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1/3;\n grid-row: 3;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n grid-template-columns: minmax(0, 100%);\n\n .column-0 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .column-2 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1;\n grid-row: 4;\n }\n }\n}\n\n.grid-4 {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: repeat(4, minmax(0, 1fr));\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-column: 1 / 5;\n grid-row: 1;\n }\n\n .column-1 {\n grid-column: 1 / 4;\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 4;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 2 / 5;\n grid-row: 3;\n }\n\n .column-4 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .landing-page__call-to-action {\n min-height: 100%;\n }\n\n .flash-message {\n margin-bottom: 10px;\n }\n\n @media screen and (max-width: 738px) {\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n .landing-page__call-to-action {\n padding: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .row__information-board {\n width: 100%;\n justify-content: center;\n align-items: center;\n }\n\n .row__mascot {\n display: none;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n grid-template-columns: minmax(0, 100%);\n\n .column-0 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .column-2 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1;\n grid-row: 5;\n }\n\n .column-4 {\n grid-column: 1;\n grid-row: 4;\n }\n }\n}\n\n.public-layout {\n @media screen and (max-width: $no-gap-breakpoint) {\n padding-top: 48px;\n }\n\n .container {\n max-width: 960px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding: 0;\n }\n }\n\n .header {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n height: 48px;\n margin: 10px 0;\n display: flex;\n align-items: stretch;\n justify-content: center;\n flex-wrap: nowrap;\n overflow: hidden;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n position: fixed;\n width: 100%;\n top: 0;\n left: 0;\n margin: 0;\n border-radius: 0;\n box-shadow: none;\n z-index: 110;\n }\n\n & > div {\n flex: 1 1 33.3%;\n min-height: 1px;\n }\n\n .nav-left {\n display: flex;\n align-items: stretch;\n justify-content: flex-start;\n flex-wrap: nowrap;\n }\n\n .nav-center {\n display: flex;\n align-items: stretch;\n justify-content: center;\n flex-wrap: nowrap;\n }\n\n .nav-right {\n display: flex;\n align-items: stretch;\n justify-content: flex-end;\n flex-wrap: nowrap;\n }\n\n .brand {\n display: block;\n padding: 15px;\n\n svg {\n display: block;\n height: 18px;\n width: auto;\n position: relative;\n bottom: -2px;\n fill: $primary-text-color;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n height: 20px;\n }\n }\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 12%);\n }\n }\n\n .nav-link {\n display: flex;\n align-items: center;\n padding: 0 1rem;\n font-size: 12px;\n font-weight: 500;\n text-decoration: none;\n color: $darker-text-color;\n white-space: nowrap;\n text-align: center;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n color: $primary-text-color;\n }\n\n @media screen and (max-width: 550px) {\n &.optional {\n display: none;\n }\n }\n }\n\n .nav-button {\n background: lighten($ui-base-color, 16%);\n margin: 8px;\n margin-left: 0;\n border-radius: 4px;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n background: lighten($ui-base-color, 20%);\n }\n }\n }\n\n $no-columns-breakpoint: 600px;\n\n .grid {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(300px, 3fr) minmax(298px, 1fr);\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-row: 1;\n grid-column: 1;\n }\n\n .column-1 {\n grid-row: 1;\n grid-column: 2;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n grid-template-columns: 100%;\n grid-gap: 0;\n\n .column-1 {\n display: none;\n }\n }\n }\n\n .directory__card {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n\n .page-header {\n @media screen and (max-width: $no-gap-breakpoint) {\n border-bottom: 0;\n }\n }\n\n .public-account-header {\n overflow: hidden;\n margin-bottom: 10px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &.inactive {\n opacity: 0.5;\n\n .public-account-header__image,\n .avatar {\n filter: grayscale(100%);\n }\n\n .logo-button {\n background-color: $secondary-text-color;\n }\n }\n\n &__image {\n border-radius: 4px 4px 0 0;\n overflow: hidden;\n height: 300px;\n position: relative;\n background: darken($ui-base-color, 12%);\n\n &::after {\n content: \"\";\n display: block;\n position: absolute;\n width: 100%;\n height: 100%;\n box-shadow: inset 0 -1px 1px 1px rgba($base-shadow-color, 0.15);\n top: 0;\n left: 0;\n }\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 4px 4px 0 0;\n }\n\n @media screen and (max-width: 600px) {\n height: 200px;\n }\n }\n\n &--no-bar {\n margin-bottom: 0;\n\n .public-account-header__image,\n .public-account-header__image img {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n box-shadow: none;\n\n &__image::after {\n display: none;\n }\n\n &__image,\n &__image img {\n border-radius: 0;\n }\n }\n\n &__bar {\n position: relative;\n margin-top: -80px;\n display: flex;\n justify-content: flex-start;\n\n &::before {\n content: \"\";\n display: block;\n background: lighten($ui-base-color, 4%);\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: 60px;\n border-radius: 0 0 4px 4px;\n z-index: -1;\n }\n\n .avatar {\n display: block;\n width: 120px;\n height: 120px;\n @include avatar-size(120px);\n padding-left: 20px - 4px;\n flex: 0 0 auto;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 50%;\n border: 4px solid lighten($ui-base-color, 4%);\n background: darken($ui-base-color, 8%);\n @include avatar-radius();\n }\n }\n\n @media screen and (max-width: 600px) {\n margin-top: 0;\n background: lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n padding: 5px;\n\n &::before {\n display: none;\n }\n\n .avatar {\n width: 48px;\n height: 48px;\n @include avatar-size(48px);\n padding: 7px 0;\n padding-left: 10px;\n\n img {\n border: 0;\n border-radius: 4px;\n @include avatar-radius();\n }\n\n @media screen and (max-width: 360px) {\n display: none;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n flex-wrap: wrap;\n }\n }\n\n &__tabs {\n flex: 1 1 auto;\n margin-left: 20px;\n\n &__name {\n padding-top: 20px;\n padding-bottom: 8px;\n\n h1 {\n font-size: 20px;\n line-height: 18px * 1.5;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n text-shadow: 1px 1px 1px $base-shadow-color;\n\n small {\n display: block;\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n @media screen and (max-width: 600px) {\n margin-left: 15px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n &__name {\n padding-top: 0;\n padding-bottom: 0;\n\n h1 {\n font-size: 16px;\n line-height: 24px;\n text-shadow: none;\n\n small {\n color: $darker-text-color;\n }\n }\n }\n }\n\n &__tabs {\n display: flex;\n justify-content: flex-start;\n align-items: stretch;\n height: 58px;\n\n .details-counters {\n display: flex;\n flex-direction: row;\n min-width: 300px;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n .details-counters {\n display: none;\n }\n }\n\n .counter {\n min-width: 33.3%;\n box-sizing: border-box;\n flex: 0 0 auto;\n color: $darker-text-color;\n padding: 10px;\n border-right: 1px solid lighten($ui-base-color, 4%);\n cursor: default;\n text-align: center;\n position: relative;\n\n a {\n display: block;\n }\n\n &:last-child {\n border-right: 0;\n }\n\n &::after {\n display: block;\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n border-bottom: 4px solid $ui-primary-color;\n opacity: 0.5;\n transition: all 400ms ease;\n }\n\n &.active {\n &::after {\n border-bottom: 4px solid $highlight-text-color;\n opacity: 1;\n }\n\n &.inactive::after {\n border-bottom-color: $secondary-text-color;\n }\n }\n\n &:hover {\n &::after {\n opacity: 1;\n transition-duration: 100ms;\n }\n }\n\n a {\n text-decoration: none;\n color: inherit;\n }\n\n .counter-label {\n font-size: 12px;\n display: block;\n }\n\n .counter-number {\n font-weight: 500;\n font-size: 18px;\n margin-bottom: 5px;\n color: $primary-text-color;\n font-family: $font-display, sans-serif;\n }\n }\n\n .spacer {\n flex: 1 1 auto;\n height: 1px;\n }\n\n &__buttons {\n padding: 7px 8px;\n }\n }\n }\n\n &__extra {\n display: none;\n margin-top: 4px;\n\n .public-account-bio {\n border-radius: 0;\n box-shadow: none;\n background: transparent;\n margin: 0 -5px;\n\n .account__header__fields {\n border-top: 1px solid lighten($ui-base-color, 12%);\n }\n\n .roles {\n display: none;\n }\n }\n\n &__links {\n margin-top: -15px;\n font-size: 14px;\n color: $darker-text-color;\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n padding: 15px;\n font-weight: 500;\n\n strong {\n font-weight: 700;\n color: $primary-text-color;\n }\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n flex: 100%;\n }\n }\n }\n\n .account__section-headline {\n border-radius: 4px 4px 0 0;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n\n .detailed-status__meta {\n margin-top: 25px;\n }\n\n .public-account-bio {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n overflow: hidden;\n margin-bottom: 10px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n box-shadow: none;\n margin-bottom: 0;\n border-radius: 0;\n }\n\n .account__header__fields {\n margin: 0;\n border-top: 0;\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n\n .account__header__content {\n padding: 20px;\n padding-bottom: 0;\n color: $primary-text-color;\n }\n\n &__extra,\n .roles {\n padding: 20px;\n font-size: 14px;\n color: $darker-text-color;\n }\n\n .roles {\n padding-bottom: 0;\n }\n }\n\n .directory__list {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: block;\n }\n\n .icon-button {\n font-size: 18px;\n }\n }\n\n .directory__card {\n margin-bottom: 0;\n }\n\n .card-grid {\n display: flex;\n flex-wrap: wrap;\n min-width: 100%;\n margin: 0 -5px;\n\n & > div {\n box-sizing: border-box;\n flex: 1 0 auto;\n width: 300px;\n padding: 0 5px;\n margin-bottom: 10px;\n max-width: 33.333%;\n\n @media screen and (max-width: 900px) {\n max-width: 50%;\n }\n\n @media screen and (max-width: 600px) {\n max-width: 100%;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin: 0;\n border-top: 1px solid lighten($ui-base-color, 8%);\n\n & > div {\n width: 100%;\n padding: 0;\n margin-bottom: 0;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &:last-child {\n border-bottom: 0;\n }\n\n .card__bar {\n background: $ui-base-color;\n\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n }\n }\n }\n }\n}\n","@mixin avatar-radius() {\n border-radius: $ui-avatar-border-size;\n background-position: 50%;\n background-clip: padding-box;\n}\n\n@mixin avatar-size($size:48px) {\n width: $size;\n height: $size;\n background-size: $size $size;\n}\n\n@mixin single-column($media, $parent: '&') {\n .auto-columns #{$parent} {\n @media #{$media} {\n @content;\n }\n }\n .single-column #{$parent} {\n @content;\n }\n}\n\n@mixin limited-single-column($media, $parent: '&') {\n .auto-columns #{$parent}, .single-column #{$parent} {\n @media #{$media} {\n @content;\n }\n }\n}\n\n@mixin multi-columns($media, $parent: '&') {\n .auto-columns #{$parent} {\n @media #{$media} {\n @content;\n }\n }\n .multi-columns #{$parent} {\n @content;\n }\n}\n\n@mixin fullwidth-gallery {\n &.full-width {\n margin-left: -14px;\n margin-right: -14px;\n width: inherit;\n max-width: none;\n height: 250px;\n border-radius: 0px;\n }\n}\n\n@mixin search-input() {\n outline: 0;\n box-sizing: border-box;\n width: 100%;\n border: none;\n box-shadow: none;\n font-family: inherit;\n background: $ui-base-color;\n color: $darker-text-color;\n font-size: 14px;\n margin: 0;\n}\n\n@mixin search-popout() {\n background: $simple-background-color;\n border-radius: 4px;\n padding: 10px 14px;\n padding-bottom: 14px;\n margin-top: 10px;\n color: $light-text-color;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n\n h4 {\n text-transform: uppercase;\n color: $light-text-color;\n font-size: 13px;\n font-weight: 500;\n margin-bottom: 10px;\n }\n\n li {\n padding: 4px 0;\n }\n\n ul {\n margin-bottom: 10px;\n }\n\n em {\n font-weight: 500;\n color: $inverted-text-color;\n }\n}\n",".no-list {\n list-style: none;\n\n li {\n display: inline-block;\n margin: 0 5px;\n }\n}\n\n.recovery-codes {\n list-style: none;\n margin: 0 auto;\n\n li {\n font-size: 125%;\n line-height: 1.5;\n letter-spacing: 1px;\n }\n}\n",".modal-layout {\n background: $ui-base-color url('data:image/svg+xml;utf8,') repeat-x bottom fixed;\n display: flex;\n flex-direction: column;\n height: 100vh;\n padding: 0;\n}\n\n.modal-layout__mastodon {\n display: flex;\n flex: 1;\n flex-direction: column;\n justify-content: flex-end;\n\n > * {\n flex: 1;\n max-height: 235px;\n }\n}\n\n@media screen and (max-width: 600px) {\n .account-header {\n margin-top: 0;\n }\n}\n",".public-layout {\n .footer {\n text-align: left;\n padding-top: 20px;\n padding-bottom: 60px;\n font-size: 12px;\n color: lighten($ui-base-color, 34%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding-left: 20px;\n padding-right: 20px;\n }\n\n .grid {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: 1fr 1fr 2fr 1fr 1fr;\n\n .column-0 {\n grid-column: 1;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-1 {\n grid-column: 2;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-2 {\n grid-column: 3;\n grid-row: 1;\n min-width: 0;\n text-align: center;\n\n h4 a {\n color: lighten($ui-base-color, 34%);\n }\n }\n\n .column-3 {\n grid-column: 4;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-4 {\n grid-column: 5;\n grid-row: 1;\n min-width: 0;\n }\n\n @media screen and (max-width: 690px) {\n grid-template-columns: 1fr 2fr 1fr;\n\n .column-0,\n .column-1 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 2;\n }\n\n .column-3,\n .column-4 {\n grid-column: 3;\n }\n\n .column-4 {\n grid-row: 2;\n }\n }\n\n @media screen and (max-width: 600px) {\n .column-1 {\n display: block;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n .column-0,\n .column-1,\n .column-3,\n .column-4 {\n display: none;\n }\n }\n }\n\n h4 {\n text-transform: uppercase;\n font-weight: 700;\n margin-bottom: 8px;\n color: $darker-text-color;\n\n a {\n color: inherit;\n text-decoration: none;\n }\n }\n\n ul a {\n text-decoration: none;\n color: lighten($ui-base-color, 34%);\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n\n .brand {\n svg {\n display: block;\n height: 36px;\n width: auto;\n margin: 0 auto;\n fill: lighten($ui-base-color, 34%);\n }\n\n &:hover,\n &:focus,\n &:active {\n svg {\n fill: lighten($ui-base-color, 38%);\n }\n }\n }\n }\n}\n",".compact-header {\n h1 {\n font-size: 24px;\n line-height: 28px;\n color: $darker-text-color;\n font-weight: 500;\n margin-bottom: 20px;\n padding: 0 10px;\n word-wrap: break-word;\n\n @media screen and (max-width: 740px) {\n text-align: center;\n padding: 20px 10px 0;\n }\n\n a {\n color: inherit;\n text-decoration: none;\n }\n\n small {\n font-weight: 400;\n color: $secondary-text-color;\n }\n\n img {\n display: inline-block;\n margin-bottom: -5px;\n margin-right: 15px;\n width: 36px;\n height: 36px;\n }\n }\n}\n",".hero-widget {\n margin-bottom: 10px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &__img {\n width: 100%;\n position: relative;\n overflow: hidden;\n border-radius: 4px 4px 0 0;\n background: $base-shadow-color;\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 4px 4px 0 0;\n }\n }\n\n &__text {\n background: $ui-base-color;\n padding: 20px;\n border-radius: 0 0 4px 4px;\n font-size: 15px;\n color: $darker-text-color;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n p {\n margin-bottom: 20px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n em {\n display: inline;\n margin: 0;\n padding: 0;\n font-weight: 700;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n color: lighten($darker-text-color, 10%);\n }\n\n a {\n color: $secondary-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n}\n\n.endorsements-widget {\n margin-bottom: 10px;\n padding-bottom: 10px;\n\n h4 {\n padding: 10px;\n text-transform: uppercase;\n font-weight: 700;\n font-size: 13px;\n color: $darker-text-color;\n }\n\n .account {\n padding: 10px 0;\n\n &:last-child {\n border-bottom: 0;\n }\n\n .account__display-name {\n display: flex;\n align-items: center;\n }\n\n .account__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n }\n\n .trends__item {\n padding: 10px;\n }\n}\n\n.trends-widget {\n h4 {\n color: $darker-text-color;\n }\n}\n\n.box-widget {\n padding: 20px;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n}\n\n.placeholder-widget {\n padding: 16px;\n border-radius: 4px;\n border: 2px dashed $dark-text-color;\n text-align: center;\n color: $darker-text-color;\n margin-bottom: 10px;\n}\n\n.contact-widget {\n min-height: 100%;\n font-size: 15px;\n color: $darker-text-color;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n padding: 0;\n\n h4 {\n padding: 10px;\n text-transform: uppercase;\n font-weight: 700;\n font-size: 13px;\n color: $darker-text-color;\n }\n\n .account {\n border-bottom: 0;\n padding: 10px 0;\n padding-top: 5px;\n }\n\n & > a {\n display: inline-block;\n padding: 10px;\n padding-top: 0;\n color: $darker-text-color;\n text-decoration: none;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.moved-account-widget {\n padding: 15px;\n padding-bottom: 20px;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n color: $secondary-text-color;\n font-weight: 400;\n margin-bottom: 10px;\n\n strong,\n a {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n color: inherit;\n text-decoration: underline;\n\n &.mention {\n text-decoration: none;\n\n span {\n text-decoration: none;\n }\n\n &:focus,\n &:hover,\n &:active {\n text-decoration: none;\n\n span {\n text-decoration: underline;\n }\n }\n }\n }\n\n &__message {\n margin-bottom: 15px;\n\n .fa {\n margin-right: 5px;\n color: $darker-text-color;\n }\n }\n\n &__card {\n .detailed-status__display-avatar {\n position: relative;\n cursor: pointer;\n }\n\n .detailed-status__display-name {\n margin-bottom: 0;\n text-decoration: none;\n\n span {\n font-weight: 400;\n }\n }\n }\n}\n\n.memoriam-widget {\n padding: 20px;\n border-radius: 4px;\n background: $base-shadow-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n font-size: 14px;\n color: $darker-text-color;\n margin-bottom: 10px;\n}\n\n.page-header {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n padding: 60px 15px;\n text-align: center;\n margin: 10px 0;\n\n h1 {\n color: $primary-text-color;\n font-size: 36px;\n line-height: 1.1;\n font-weight: 700;\n margin-bottom: 10px;\n }\n\n p {\n font-size: 15px;\n color: $darker-text-color;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-top: 0;\n background: lighten($ui-base-color, 4%);\n\n h1 {\n font-size: 24px;\n }\n }\n}\n\n.directory {\n background: $ui-base-color;\n border-radius: 4px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &__tag {\n box-sizing: border-box;\n margin-bottom: 10px;\n\n & > a,\n & > div {\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: $ui-base-color;\n border-radius: 4px;\n padding: 15px;\n text-decoration: none;\n color: inherit;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n }\n\n & > a {\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 8%);\n }\n }\n\n &.active > a {\n background: $ui-highlight-color;\n cursor: default;\n }\n\n &.disabled > div {\n opacity: 0.5;\n cursor: default;\n }\n\n h4 {\n flex: 1 1 auto;\n font-size: 18px;\n font-weight: 700;\n color: $primary-text-color;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n .fa {\n color: $darker-text-color;\n }\n\n small {\n display: block;\n font-weight: 400;\n font-size: 15px;\n margin-top: 8px;\n color: $darker-text-color;\n }\n }\n\n &.active h4 {\n &,\n .fa,\n small {\n color: $primary-text-color;\n }\n }\n\n .avatar-stack {\n flex: 0 0 auto;\n width: (36px + 4px) * 3;\n }\n\n &.active .avatar-stack .account__avatar {\n border-color: $ui-highlight-color;\n }\n }\n}\n\n.avatar-stack {\n display: flex;\n justify-content: flex-end;\n\n .account__avatar {\n flex: 0 0 auto;\n width: 36px;\n height: 36px;\n border-radius: 50%;\n position: relative;\n margin-left: -10px;\n background: darken($ui-base-color, 8%);\n border: 2px solid $ui-base-color;\n\n &:nth-child(1) {\n z-index: 1;\n }\n\n &:nth-child(2) {\n z-index: 2;\n }\n\n &:nth-child(3) {\n z-index: 3;\n }\n }\n}\n\n.accounts-table {\n width: 100%;\n\n .account {\n padding: 0;\n border: 0;\n }\n\n strong {\n font-weight: 700;\n }\n\n thead th {\n text-align: center;\n text-transform: uppercase;\n color: $darker-text-color;\n font-weight: 700;\n padding: 10px;\n\n &:first-child {\n text-align: left;\n }\n }\n\n tbody td {\n padding: 15px 0;\n vertical-align: middle;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n tbody tr:last-child td {\n border-bottom: 0;\n }\n\n &__count {\n width: 120px;\n text-align: center;\n font-size: 15px;\n font-weight: 500;\n color: $primary-text-color;\n\n small {\n display: block;\n color: $darker-text-color;\n font-weight: 400;\n font-size: 14px;\n }\n }\n\n &__comment {\n width: 50%;\n vertical-align: initial !important;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n tbody td.optional {\n display: none;\n }\n }\n}\n\n.moved-account-widget,\n.memoriam-widget,\n.box-widget,\n.contact-widget,\n.landing-page__information.contact-widget,\n.directory,\n.page-header {\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n box-shadow: none;\n border-radius: 0;\n }\n}\n\n$maximum-width: 1235px;\n$fluid-breakpoint: $maximum-width + 20px;\n\n.statuses-grid {\n min-height: 600px;\n\n @media screen and (max-width: 640px) {\n width: 100% !important; // Masonry layout is unnecessary at this width\n }\n\n &__item {\n width: (960px - 20px) / 3;\n\n @media screen and (max-width: $fluid-breakpoint) {\n width: (940px - 20px) / 3;\n }\n\n @media screen and (max-width: 640px) {\n width: 100%;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n width: 100vw;\n }\n }\n\n .detailed-status {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 1px solid lighten($ui-base-color, 16%);\n }\n\n &.compact {\n .detailed-status__meta {\n margin-top: 15px;\n }\n\n .status__content {\n font-size: 15px;\n line-height: 20px;\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n .status__content__spoiler-link {\n line-height: 20px;\n margin: 0;\n }\n }\n\n .media-gallery,\n .status-card,\n .video-player {\n margin-top: 15px;\n }\n }\n }\n}\n\n.notice-widget {\n margin-bottom: 10px;\n color: $darker-text-color;\n\n p {\n margin-bottom: 10px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n font-size: 14px;\n line-height: 20px;\n }\n}\n\n.notice-widget,\n.placeholder-widget {\n a {\n text-decoration: none;\n font-weight: 500;\n color: $ui-highlight-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.table-of-contents {\n background: darken($ui-base-color, 4%);\n min-height: 100%;\n font-size: 14px;\n border-radius: 4px;\n\n li a {\n display: block;\n font-weight: 500;\n padding: 15px;\n overflow: hidden;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n text-decoration: none;\n color: $primary-text-color;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n\n li:last-child a {\n border-bottom: 0;\n }\n\n li ul {\n padding-left: 20px;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n }\n}\n","$no-columns-breakpoint: 600px;\n\ncode {\n font-family: $font-monospace, monospace;\n font-weight: 400;\n}\n\n.form-container {\n max-width: 400px;\n padding: 20px;\n margin: 0 auto;\n}\n\n.simple_form {\n .input {\n margin-bottom: 15px;\n overflow: hidden;\n\n &.hidden {\n margin: 0;\n }\n\n &.radio_buttons {\n .radio {\n margin-bottom: 15px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .radio > label {\n position: relative;\n padding-left: 28px;\n\n input {\n position: absolute;\n top: -2px;\n left: 0;\n }\n }\n }\n\n &.boolean {\n position: relative;\n margin-bottom: 0;\n\n .label_input > label {\n font-family: inherit;\n font-size: 14px;\n padding-top: 5px;\n color: $primary-text-color;\n display: block;\n width: auto;\n }\n\n .label_input,\n .hint {\n padding-left: 28px;\n }\n\n .label_input__wrapper {\n position: static;\n }\n\n label.checkbox {\n position: absolute;\n top: 2px;\n left: 0;\n }\n\n label a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: none;\n }\n }\n\n .recommended {\n position: absolute;\n margin: 0 4px;\n margin-top: -2px;\n }\n }\n }\n\n .row {\n display: flex;\n margin: 0 -5px;\n\n .input {\n box-sizing: border-box;\n flex: 1 1 auto;\n width: 50%;\n padding: 0 5px;\n }\n }\n\n .hint {\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n }\n\n code {\n border-radius: 3px;\n padding: 0.2em 0.4em;\n background: darken($ui-base-color, 12%);\n }\n }\n\n span.hint {\n display: block;\n font-size: 12px;\n margin-top: 4px;\n }\n\n p.hint {\n margin-bottom: 15px;\n color: $darker-text-color;\n\n &.subtle-hint {\n text-align: center;\n font-size: 12px;\n line-height: 18px;\n margin-top: 15px;\n margin-bottom: 0;\n }\n }\n\n .card {\n margin-bottom: 15px;\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n .input.with_floating_label {\n .label_input {\n display: flex;\n\n & > label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 500;\n min-width: 150px;\n flex: 0 0 auto;\n }\n\n input,\n select {\n flex: 1 1 auto;\n }\n }\n\n &.select .hint {\n margin-top: 6px;\n margin-left: 150px;\n }\n }\n\n .input.with_label {\n .label_input > label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: block;\n margin-bottom: 8px;\n word-wrap: break-word;\n font-weight: 500;\n }\n\n .hint {\n margin-top: 6px;\n }\n\n ul {\n flex: 390px;\n }\n }\n\n .input.with_block_label {\n max-width: none;\n\n & > label {\n font-family: inherit;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n font-weight: 500;\n padding-top: 5px;\n }\n\n .hint {\n margin-bottom: 15px;\n }\n\n ul {\n columns: 2;\n }\n }\n\n .input.datetime .label_input select {\n display: inline-block;\n width: auto;\n flex: 0;\n }\n\n .required abbr {\n text-decoration: none;\n color: lighten($error-value-color, 12%);\n }\n\n .fields-group {\n margin-bottom: 25px;\n\n .input:last-child {\n margin-bottom: 0;\n }\n }\n\n .fields-row {\n display: flex;\n margin: 0 -10px;\n padding-top: 5px;\n margin-bottom: 25px;\n\n .input {\n max-width: none;\n }\n\n &__column {\n box-sizing: border-box;\n padding: 0 10px;\n flex: 1 1 auto;\n min-height: 1px;\n\n &-6 {\n max-width: 50%;\n }\n\n .actions {\n margin-top: 27px;\n }\n }\n\n .fields-group:last-child,\n .fields-row__column.fields-group {\n margin-bottom: 0;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n margin-bottom: 0;\n\n &__column {\n max-width: none;\n }\n\n .fields-group:last-child,\n .fields-row__column.fields-group,\n .fields-row__column {\n margin-bottom: 25px;\n }\n }\n }\n\n .input.radio_buttons .radio label {\n margin-bottom: 5px;\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: block;\n width: auto;\n }\n\n .check_boxes {\n .checkbox {\n label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: inline-block;\n width: auto;\n position: relative;\n padding-top: 5px;\n padding-left: 25px;\n flex: 1 1 auto;\n }\n\n input[type=checkbox] {\n position: absolute;\n left: 0;\n top: 5px;\n margin: 0;\n }\n }\n }\n\n .input.static .label_input__wrapper {\n font-size: 16px;\n padding: 10px;\n border: 1px solid $dark-text-color;\n border-radius: 4px;\n }\n\n input[type=text],\n input[type=number],\n input[type=email],\n input[type=password],\n textarea {\n box-sizing: border-box;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n width: 100%;\n outline: 0;\n font-family: inherit;\n resize: vertical;\n background: darken($ui-base-color, 10%);\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n padding: 10px;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &:invalid {\n box-shadow: none;\n }\n\n &:focus:invalid:not(:placeholder-shown) {\n border-color: lighten($error-red, 12%);\n }\n\n &:required:valid {\n border-color: $valid-value-color;\n }\n\n &:hover {\n border-color: darken($ui-base-color, 20%);\n }\n\n &:active,\n &:focus {\n border-color: $highlight-text-color;\n background: darken($ui-base-color, 8%);\n }\n }\n\n .input.field_with_errors {\n label {\n color: lighten($error-red, 12%);\n }\n\n input[type=text],\n input[type=number],\n input[type=email],\n input[type=password],\n textarea,\n select {\n border-color: lighten($error-red, 12%);\n }\n\n .error {\n display: block;\n font-weight: 500;\n color: lighten($error-red, 12%);\n margin-top: 4px;\n }\n }\n\n .input.disabled {\n opacity: 0.5;\n }\n\n .actions {\n margin-top: 30px;\n display: flex;\n\n &.actions--top {\n margin-top: 0;\n margin-bottom: 30px;\n }\n }\n\n button,\n .button,\n .block-button {\n display: block;\n width: 100%;\n border: 0;\n border-radius: 4px;\n background: $ui-highlight-color;\n color: $primary-text-color;\n font-size: 18px;\n line-height: inherit;\n height: auto;\n padding: 10px;\n text-transform: uppercase;\n text-decoration: none;\n text-align: center;\n box-sizing: border-box;\n cursor: pointer;\n font-weight: 500;\n outline: 0;\n margin-bottom: 10px;\n margin-right: 10px;\n\n &:last-child {\n margin-right: 0;\n }\n\n &:hover {\n background-color: lighten($ui-highlight-color, 5%);\n }\n\n &:active,\n &:focus {\n background-color: darken($ui-highlight-color, 5%);\n }\n\n &:disabled:hover {\n background-color: $ui-primary-color;\n }\n\n &.negative {\n background: $error-value-color;\n\n &:hover {\n background-color: lighten($error-value-color, 5%);\n }\n\n &:active,\n &:focus {\n background-color: darken($error-value-color, 5%);\n }\n }\n }\n\n select {\n appearance: none;\n box-sizing: border-box;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n width: 100%;\n outline: 0;\n font-family: inherit;\n resize: vertical;\n background: darken($ui-base-color, 10%) url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center / auto 16px;\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n padding-left: 10px;\n padding-right: 30px;\n height: 41px;\n }\n\n h4 {\n margin-bottom: 15px !important;\n }\n\n .label_input {\n &__wrapper {\n position: relative;\n }\n\n &__append {\n position: absolute;\n right: 3px;\n top: 1px;\n padding: 10px;\n padding-bottom: 9px;\n font-size: 16px;\n color: $dark-text-color;\n font-family: inherit;\n pointer-events: none;\n cursor: default;\n max-width: 140px;\n white-space: nowrap;\n overflow: hidden;\n\n &::after {\n content: '';\n display: block;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 1px;\n width: 5px;\n background-image: linear-gradient(to right, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));\n }\n }\n }\n\n &__overlay-area {\n position: relative;\n\n &__blurred form {\n filter: blur(2px);\n }\n\n &__overlay {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n background: rgba($ui-base-color, 0.65);\n border-radius: 4px;\n margin-left: -4px;\n margin-top: -4px;\n padding: 4px;\n\n &__content {\n text-align: center;\n\n &.rich-formatting {\n &,\n p {\n color: $primary-text-color;\n }\n }\n }\n }\n }\n}\n\n.block-icon {\n display: block;\n margin: 0 auto;\n margin-bottom: 10px;\n font-size: 24px;\n}\n\n.flash-message {\n background: lighten($ui-base-color, 8%);\n color: $darker-text-color;\n border-radius: 4px;\n padding: 15px 10px;\n margin-bottom: 30px;\n text-align: center;\n\n &.notice {\n border: 1px solid rgba($valid-value-color, 0.5);\n background: rgba($valid-value-color, 0.25);\n color: $valid-value-color;\n }\n\n &.alert {\n border: 1px solid rgba($error-value-color, 0.5);\n background: rgba($error-value-color, 0.25);\n color: $error-value-color;\n }\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n\n &:hover {\n color: $primary-text-color;\n text-decoration: underline;\n }\n }\n\n p {\n margin-bottom: 15px;\n }\n\n .oauth-code {\n outline: 0;\n box-sizing: border-box;\n display: block;\n width: 100%;\n border: none;\n padding: 10px;\n font-family: $font-monospace, monospace;\n background: $ui-base-color;\n color: $primary-text-color;\n font-size: 14px;\n margin: 0;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n @media screen and (max-width: 740px) and (min-width: 441px) {\n margin-top: 40px;\n }\n}\n\n.form-footer {\n margin-top: 30px;\n text-align: center;\n\n a {\n color: $darker-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.quick-nav {\n list-style: none;\n margin-bottom: 25px;\n font-size: 14px;\n\n li {\n display: inline-block;\n margin-right: 10px;\n }\n\n a {\n color: $highlight-text-color;\n text-transform: uppercase;\n text-decoration: none;\n font-weight: 700;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($highlight-text-color, 8%);\n }\n }\n}\n\n.oauth-prompt,\n.follow-prompt {\n margin-bottom: 30px;\n color: $darker-text-color;\n\n h2 {\n font-size: 16px;\n margin-bottom: 30px;\n text-align: center;\n }\n\n strong {\n color: $secondary-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n @media screen and (max-width: 740px) and (min-width: 441px) {\n margin-top: 40px;\n }\n}\n\n.qr-wrapper {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n}\n\n.qr-code {\n flex: 0 0 auto;\n background: $simple-background-color;\n padding: 4px;\n margin: 0 10px 20px 0;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n display: inline-block;\n\n svg {\n display: block;\n margin: 0;\n }\n}\n\n.qr-alternative {\n margin-bottom: 20px;\n color: $secondary-text-color;\n flex: 150px;\n\n samp {\n display: block;\n font-size: 14px;\n }\n}\n\n.table-form {\n p {\n margin-bottom: 15px;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n }\n}\n\n.simple_form,\n.table-form {\n .warning {\n box-sizing: border-box;\n background: rgba($error-value-color, 0.5);\n color: $primary-text-color;\n text-shadow: 1px 1px 0 rgba($base-shadow-color, 0.3);\n box-shadow: 0 2px 6px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n padding: 10px;\n margin-bottom: 15px;\n\n a {\n color: $primary-text-color;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n strong {\n font-weight: 600;\n display: block;\n margin-bottom: 5px;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n\n .fa {\n font-weight: 400;\n }\n }\n }\n}\n\n.action-pagination {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n\n .actions,\n .pagination {\n flex: 1 1 auto;\n }\n\n .actions {\n padding: 30px 0;\n padding-right: 20px;\n flex: 0 0 auto;\n }\n}\n\n.post-follow-actions {\n text-align: center;\n color: $darker-text-color;\n\n div {\n margin-bottom: 4px;\n }\n}\n\n.alternative-login {\n margin-top: 20px;\n margin-bottom: 20px;\n\n h4 {\n font-size: 16px;\n color: $primary-text-color;\n text-align: center;\n margin-bottom: 20px;\n border: 0;\n padding: 0;\n }\n\n .button {\n display: block;\n }\n}\n\n.scope-danger {\n color: $warning-red;\n}\n\n.form_admin_settings_site_short_description,\n.form_admin_settings_site_description,\n.form_admin_settings_site_extended_description,\n.form_admin_settings_site_terms,\n.form_admin_settings_custom_css,\n.form_admin_settings_closed_registrations_message {\n textarea {\n font-family: $font-monospace, monospace;\n }\n}\n\n.input-copy {\n background: darken($ui-base-color, 10%);\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n display: flex;\n align-items: center;\n padding-right: 4px;\n position: relative;\n top: 1px;\n transition: border-color 300ms linear;\n\n &__wrapper {\n flex: 1 1 auto;\n }\n\n input[type=text] {\n background: transparent;\n border: 0;\n padding: 10px;\n font-size: 14px;\n font-family: $font-monospace, monospace;\n }\n\n button {\n flex: 0 0 auto;\n margin: 4px;\n text-transform: none;\n font-weight: 400;\n font-size: 14px;\n padding: 7px 18px;\n padding-bottom: 6px;\n width: auto;\n transition: background 300ms linear;\n }\n\n &.copied {\n border-color: $valid-value-color;\n transition: none;\n\n button {\n background: $valid-value-color;\n transition: none;\n }\n }\n}\n\n.connection-prompt {\n margin-bottom: 25px;\n\n .fa-link {\n background-color: darken($ui-base-color, 4%);\n border-radius: 100%;\n font-size: 24px;\n padding: 10px;\n }\n\n &__column {\n align-items: center;\n display: flex;\n flex: 1;\n flex-direction: column;\n flex-shrink: 1;\n max-width: 50%;\n\n &-sep {\n align-self: center;\n flex-grow: 0;\n overflow: visible;\n position: relative;\n z-index: 1;\n }\n\n p {\n word-break: break-word;\n }\n }\n\n .account__avatar {\n margin-bottom: 20px;\n }\n\n &__connection {\n background-color: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n padding: 25px 10px;\n position: relative;\n text-align: center;\n\n &::after {\n background-color: darken($ui-base-color, 4%);\n content: '';\n display: block;\n height: 100%;\n left: 50%;\n position: absolute;\n top: 0;\n width: 1px;\n }\n }\n\n &__row {\n align-items: flex-start;\n display: flex;\n flex-direction: row;\n }\n}\n",".card {\n & > a {\n display: block;\n text-decoration: none;\n color: inherit;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n box-shadow: none;\n }\n\n &:hover,\n &:active,\n &:focus {\n .card__bar {\n background: lighten($ui-base-color, 8%);\n }\n }\n }\n\n &__img {\n height: 130px;\n position: relative;\n background: darken($ui-base-color, 12%);\n border-radius: 4px 4px 0 0;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n object-fit: cover;\n border-radius: 4px 4px 0 0;\n }\n\n @media screen and (max-width: 600px) {\n height: 200px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n\n &__bar {\n position: relative;\n padding: 15px;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n\n .avatar {\n flex: 0 0 auto;\n width: 48px;\n height: 48px;\n @include avatar-size(48px);\n padding-top: 2px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n @include avatar-radius();\n background: darken($ui-base-color, 8%);\n object-fit: cover;\n }\n }\n\n .display-name {\n margin-left: 15px;\n text-align: left;\n\n strong {\n font-size: 15px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n span {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n}\n\n.pagination {\n padding: 30px 0;\n text-align: center;\n overflow: hidden;\n\n a,\n .current,\n .newer,\n .older,\n .page,\n .gap {\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 500;\n display: inline-block;\n padding: 6px 10px;\n text-decoration: none;\n }\n\n .current {\n background: $simple-background-color;\n border-radius: 100px;\n color: $inverted-text-color;\n cursor: default;\n margin: 0 10px;\n }\n\n .gap {\n cursor: default;\n }\n\n .older,\n .newer {\n text-transform: uppercase;\n color: $secondary-text-color;\n }\n\n .older {\n float: left;\n padding-left: 0;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n .newer {\n float: right;\n padding-right: 0;\n\n .fa {\n display: inline-block;\n margin-left: 5px;\n }\n }\n\n .disabled {\n cursor: default;\n color: lighten($inverted-text-color, 10%);\n }\n\n @media screen and (max-width: 700px) {\n padding: 30px 20px;\n\n .page {\n display: none;\n }\n\n .newer,\n .older {\n display: inline-block;\n }\n }\n}\n\n.nothing-here {\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n color: $light-text-color;\n font-size: 14px;\n font-weight: 500;\n text-align: center;\n display: flex;\n justify-content: center;\n align-items: center;\n cursor: default;\n border-radius: 4px;\n padding: 20px;\n min-height: 30vh;\n\n &--under-tabs {\n border-radius: 0 0 4px 4px;\n }\n\n &--flexible {\n box-sizing: border-box;\n min-height: 100%;\n }\n}\n\n.account-role,\n.simple_form .recommended {\n display: inline-block;\n padding: 4px 6px;\n cursor: default;\n border-radius: 3px;\n font-size: 12px;\n line-height: 12px;\n font-weight: 500;\n color: $ui-secondary-color;\n background-color: rgba($ui-secondary-color, 0.1);\n border: 1px solid rgba($ui-secondary-color, 0.5);\n\n &.moderator {\n color: $success-green;\n background-color: rgba($success-green, 0.1);\n border-color: rgba($success-green, 0.5);\n }\n\n &.admin {\n color: lighten($error-red, 12%);\n background-color: rgba(lighten($error-red, 12%), 0.1);\n border-color: rgba(lighten($error-red, 12%), 0.5);\n }\n}\n\n.account__header__fields {\n max-width: 100vw;\n padding: 0;\n margin: 15px -15px -15px;\n border: 0 none;\n border-top: 1px solid lighten($ui-base-color, 12%);\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n font-size: 14px;\n line-height: 20px;\n\n dl {\n display: flex;\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n }\n\n dt,\n dd {\n box-sizing: border-box;\n padding: 14px;\n text-align: center;\n max-height: 48px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n dt {\n font-weight: 500;\n width: 120px;\n flex: 0 0 auto;\n color: $secondary-text-color;\n background: rgba(darken($ui-base-color, 8%), 0.5);\n }\n\n dd {\n flex: 1 1 auto;\n color: $darker-text-color;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n\n .verified {\n border: 1px solid rgba($valid-value-color, 0.5);\n background: rgba($valid-value-color, 0.25);\n\n a {\n color: $valid-value-color;\n font-weight: 500;\n }\n\n &__mark {\n color: $valid-value-color;\n }\n }\n\n dl:last-child {\n border-bottom: 0;\n }\n}\n\n.directory__tag .trends__item__current {\n width: auto;\n}\n\n.pending-account {\n &__header {\n color: $darker-text-color;\n\n a {\n color: $ui-secondary-color;\n text-decoration: none;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n\n strong {\n color: $primary-text-color;\n font-weight: 700;\n }\n }\n\n &__body {\n margin-top: 10px;\n }\n}\n",".activity-stream {\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n overflow: hidden;\n margin-bottom: 10px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n border-radius: 0;\n box-shadow: none;\n }\n\n &--headless {\n border-radius: 0;\n margin: 0;\n box-shadow: none;\n\n .detailed-status,\n .status {\n border-radius: 0 !important;\n }\n }\n\n div[data-component] {\n width: 100%;\n }\n\n .entry {\n background: $ui-base-color;\n\n .detailed-status,\n .status,\n .load-more {\n animation: none;\n }\n\n &:last-child {\n .detailed-status,\n .status,\n .load-more {\n border-bottom: 0;\n border-radius: 0 0 4px 4px;\n }\n }\n\n &:first-child {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 4px 4px 0 0;\n }\n\n &:last-child {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 4px;\n }\n }\n }\n\n @media screen and (max-width: 740px) {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 0 !important;\n }\n }\n }\n\n &--highlighted .entry {\n background: lighten($ui-base-color, 8%);\n }\n}\n\n.button.logo-button {\n flex: 0 auto;\n font-size: 14px;\n background: $ui-highlight-color;\n color: $primary-text-color;\n text-transform: none;\n line-height: 36px;\n height: auto;\n padding: 3px 15px;\n border: 0;\n\n svg {\n width: 20px;\n height: auto;\n vertical-align: middle;\n margin-right: 5px;\n fill: $primary-text-color;\n }\n\n &:active,\n &:focus,\n &:hover {\n background: lighten($ui-highlight-color, 10%);\n }\n\n &:disabled,\n &.disabled {\n &:active,\n &:focus,\n &:hover {\n background: $ui-primary-color;\n }\n }\n\n &.button--destructive {\n &:active,\n &:focus,\n &:hover {\n background: $error-red;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n svg {\n display: none;\n }\n }\n}\n\n.embed,\n.public-layout {\n .detailed-status {\n padding: 15px;\n }\n\n .status {\n padding: 15px 15px 15px (48px + 15px * 2);\n min-height: 48px + 2px;\n\n &__avatar {\n left: 15px;\n top: 17px;\n }\n\n &__content {\n padding-top: 5px;\n }\n\n &__prepend {\n padding: 8px 0;\n padding-bottom: 2px;\n margin: initial;\n margin-left: 48px + 15px * 2;\n padding-top: 15px;\n }\n\n &__prepend-icon-wrapper {\n position: absolute;\n margin: initial;\n float: initial;\n width: auto;\n left: -32px;\n }\n\n .media-gallery,\n &__action-bar,\n .video-player {\n margin-top: 10px;\n }\n }\n}\n\n// Styling from upstream's WebUI, as public pages use the same layout\n.embed,\n.public-layout {\n .status {\n .status__info {\n font-size: 15px;\n display: initial;\n }\n\n .status__relative-time {\n color: $dark-text-color;\n float: right;\n font-size: 14px;\n width: auto;\n margin: initial;\n padding: initial;\n }\n\n .status__info .status__display-name {\n display: block;\n max-width: 100%;\n padding: 6px 0;\n padding-right: 25px;\n margin: initial;\n\n .display-name strong {\n display: inline;\n }\n }\n\n .status__avatar {\n height: 48px;\n position: absolute;\n width: 48px;\n margin: initial;\n }\n }\n}\n\n.rtl {\n .embed,\n .public-layout {\n .status {\n padding-left: 10px;\n padding-right: 68px;\n\n .status__info .status__display-name {\n padding-left: 25px;\n padding-right: 0;\n }\n\n .status__relative-time {\n float: left;\n }\n }\n }\n}\n\n.status__content__read-more-button {\n display: block;\n font-size: 15px;\n line-height: 20px;\n color: lighten($ui-highlight-color, 8%);\n border: 0;\n background: transparent;\n padding: 0;\n padding-top: 8px;\n text-decoration: none;\n\n &:hover,\n &:active {\n text-decoration: underline;\n }\n}\n",".app-body {\n -webkit-overflow-scrolling: touch;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n}\n\n.animated-number {\n display: inline-flex;\n flex-direction: column;\n align-items: stretch;\n overflow: hidden;\n position: relative;\n}\n\n.link-button {\n display: block;\n font-size: 15px;\n line-height: 20px;\n color: $ui-highlight-color;\n border: 0;\n background: transparent;\n padding: 0;\n cursor: pointer;\n\n &:hover,\n &:active {\n text-decoration: underline;\n }\n\n &:disabled {\n color: $ui-primary-color;\n cursor: default;\n }\n}\n\n.button {\n background-color: darken($ui-highlight-color, 3%);\n border: 10px none;\n border-radius: 4px;\n box-sizing: border-box;\n color: $primary-text-color;\n cursor: pointer;\n display: inline-block;\n font-family: inherit;\n font-size: 14px;\n font-weight: 500;\n height: 36px;\n letter-spacing: 0;\n line-height: 36px;\n overflow: hidden;\n padding: 0 16px;\n position: relative;\n text-align: center;\n text-transform: uppercase;\n text-decoration: none;\n text-overflow: ellipsis;\n transition: all 100ms ease-in;\n transition-property: background-color;\n white-space: nowrap;\n width: auto;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-highlight-color, 7%);\n transition: all 200ms ease-out;\n transition-property: background-color;\n }\n\n &--destructive {\n transition: none;\n\n &:active,\n &:focus,\n &:hover {\n background-color: $error-red;\n transition: none;\n }\n }\n\n &:disabled {\n background-color: $ui-primary-color;\n cursor: default;\n }\n\n &.button-primary,\n &.button-alternative,\n &.button-secondary,\n &.button-alternative-2 {\n font-size: 16px;\n line-height: 36px;\n height: auto;\n text-transform: none;\n padding: 4px 16px;\n }\n\n &.button-alternative {\n color: $inverted-text-color;\n background: $ui-primary-color;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-primary-color, 4%);\n }\n }\n\n &.button-alternative-2 {\n background: $ui-base-lighter-color;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-base-lighter-color, 4%);\n }\n }\n\n &.button-secondary {\n font-size: 16px;\n line-height: 36px;\n height: auto;\n color: $darker-text-color;\n text-transform: none;\n background: transparent;\n padding: 3px 15px;\n border-radius: 4px;\n border: 1px solid $ui-primary-color;\n\n &:active,\n &:focus,\n &:hover {\n border-color: lighten($ui-primary-color, 4%);\n color: lighten($darker-text-color, 4%);\n }\n\n &:disabled {\n opacity: 0.5;\n }\n }\n\n &.button--block {\n display: block;\n width: 100%;\n }\n}\n\n.icon-button {\n display: inline-block;\n padding: 0;\n color: $action-button-color;\n border: 0;\n border-radius: 4px;\n background: transparent;\n cursor: pointer;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($action-button-color, 7%);\n background-color: rgba($action-button-color, 0.15);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n }\n\n &:focus {\n background-color: rgba($action-button-color, 0.3);\n }\n\n &.disabled {\n color: darken($action-button-color, 13%);\n background-color: transparent;\n cursor: default;\n }\n\n &.active {\n color: $highlight-text-color;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &.inverted {\n color: $lighter-text-color;\n\n &:hover,\n &:active,\n &:focus {\n color: darken($lighter-text-color, 7%);\n background-color: rgba($lighter-text-color, 0.15);\n }\n\n &:focus {\n background-color: rgba($lighter-text-color, 0.3);\n }\n\n &.disabled {\n color: lighten($lighter-text-color, 7%);\n background-color: transparent;\n }\n\n &.active {\n color: $highlight-text-color;\n\n &.disabled {\n color: lighten($highlight-text-color, 13%);\n }\n }\n }\n\n &.overlayed {\n box-sizing: content-box;\n background: rgba($base-overlay-background, 0.6);\n color: rgba($primary-text-color, 0.7);\n border-radius: 4px;\n padding: 2px;\n\n &:hover {\n background: rgba($base-overlay-background, 0.9);\n }\n }\n}\n\n.text-icon-button {\n color: $lighter-text-color;\n border: 0;\n border-radius: 4px;\n background: transparent;\n cursor: pointer;\n font-weight: 600;\n font-size: 11px;\n padding: 0 3px;\n line-height: 27px;\n outline: 0;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &:hover,\n &:active,\n &:focus {\n color: darken($lighter-text-color, 7%);\n background-color: rgba($lighter-text-color, 0.15);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n }\n\n &:focus {\n background-color: rgba($lighter-text-color, 0.3);\n }\n\n &.disabled {\n color: lighten($lighter-text-color, 20%);\n background-color: transparent;\n cursor: default;\n }\n\n &.active {\n color: $highlight-text-color;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n}\n\n.dropdown-menu {\n position: absolute;\n transform-origin: 50% 0;\n}\n\n.invisible {\n font-size: 0;\n line-height: 0;\n display: inline-block;\n width: 0;\n height: 0;\n position: absolute;\n\n img,\n svg {\n margin: 0 !important;\n border: 0 !important;\n padding: 0 !important;\n width: 0 !important;\n height: 0 !important;\n }\n}\n\n.ellipsis {\n &::after {\n content: \"…\";\n }\n}\n\n.notification__favourite-icon-wrapper {\n left: 0;\n position: absolute;\n\n .fa.star-icon {\n color: $gold-star;\n }\n}\n\n.star-icon.active {\n color: $gold-star;\n}\n\n.bookmark-icon.active {\n color: $red-bookmark;\n}\n\n.no-reduce-motion .icon-button.star-icon {\n &.activate {\n & > .fa-star {\n animation: spring-rotate-in 1s linear;\n }\n }\n\n &.deactivate {\n & > .fa-star {\n animation: spring-rotate-out 1s linear;\n }\n }\n}\n\n.notification__display-name {\n color: inherit;\n font-weight: 500;\n text-decoration: none;\n\n &:hover {\n color: $primary-text-color;\n text-decoration: underline;\n }\n}\n\n.display-name {\n display: block;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n a {\n color: inherit;\n text-decoration: inherit;\n }\n\n strong {\n height: 18px;\n font-size: 16px;\n font-weight: 500;\n line-height: 18px;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n }\n\n span {\n display: block;\n height: 18px;\n font-size: 15px;\n line-height: 18px;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n }\n\n > a:hover {\n strong {\n text-decoration: underline;\n }\n }\n\n &.inline {\n padding: 0;\n height: 18px;\n font-size: 15px;\n line-height: 18px;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n\n strong {\n display: inline;\n height: auto;\n font-size: inherit;\n line-height: inherit;\n }\n\n span {\n display: inline;\n height: auto;\n font-size: inherit;\n line-height: inherit;\n }\n }\n}\n\n.display-name__html {\n font-weight: 500;\n}\n\n.display-name__account {\n font-size: 14px;\n}\n\n.image-loader {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n\n .image-loader__preview-canvas {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n background: url('~images/void.png') repeat;\n object-fit: contain;\n }\n\n .loading-bar {\n position: relative;\n }\n\n &.image-loader--amorphous .image-loader__preview-canvas {\n display: none;\n }\n}\n\n.zoomable-image {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n img {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n width: auto;\n height: auto;\n object-fit: contain;\n }\n}\n\n.dropdown {\n display: inline-block;\n}\n\n.dropdown__content {\n display: none;\n position: absolute;\n}\n\n.dropdown-menu__separator {\n border-bottom: 1px solid darken($ui-secondary-color, 8%);\n margin: 5px 7px 6px;\n height: 0;\n}\n\n.dropdown-menu {\n background: $ui-secondary-color;\n padding: 4px 0;\n border-radius: 4px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n\n ul {\n list-style: none;\n }\n}\n\n.dropdown-menu__arrow {\n position: absolute;\n width: 0;\n height: 0;\n border: 0 solid transparent;\n\n &.left {\n right: -5px;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: $ui-secondary-color;\n }\n\n &.top {\n bottom: -5px;\n margin-left: -7px;\n border-width: 5px 7px 0;\n border-top-color: $ui-secondary-color;\n }\n\n &.bottom {\n top: -5px;\n margin-left: -7px;\n border-width: 0 7px 5px;\n border-bottom-color: $ui-secondary-color;\n }\n\n &.right {\n left: -5px;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: $ui-secondary-color;\n }\n}\n\n.dropdown-menu__item {\n a {\n font-size: 13px;\n line-height: 18px;\n display: block;\n padding: 4px 14px;\n box-sizing: border-box;\n text-decoration: none;\n background: $ui-secondary-color;\n color: $inverted-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:focus,\n &:hover,\n &:active {\n background: $ui-highlight-color;\n color: $secondary-text-color;\n outline: 0;\n }\n }\n}\n\n.dropdown--active .dropdown__content {\n display: block;\n line-height: 18px;\n max-width: 311px;\n right: 0;\n text-align: left;\n z-index: 9999;\n\n & > ul {\n list-style: none;\n background: $ui-secondary-color;\n padding: 4px 0;\n border-radius: 4px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.4);\n min-width: 140px;\n position: relative;\n }\n\n &.dropdown__right {\n right: 0;\n }\n\n &.dropdown__left {\n & > ul {\n left: -98px;\n }\n }\n\n & > ul > li > a {\n font-size: 13px;\n line-height: 18px;\n display: block;\n padding: 4px 14px;\n box-sizing: border-box;\n text-decoration: none;\n background: $ui-secondary-color;\n color: $inverted-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:focus {\n outline: 0;\n }\n\n &:hover {\n background: $ui-highlight-color;\n color: $secondary-text-color;\n }\n }\n}\n\n.dropdown__icon {\n vertical-align: middle;\n}\n\n.static-content {\n padding: 10px;\n padding-top: 20px;\n color: $dark-text-color;\n\n h1 {\n font-size: 16px;\n font-weight: 500;\n margin-bottom: 40px;\n text-align: center;\n }\n\n p {\n font-size: 13px;\n margin-bottom: 20px;\n }\n}\n\n.column,\n.drawer {\n flex: 1 1 100%;\n overflow: hidden;\n}\n\n@media screen and (min-width: 631px) {\n .columns-area {\n padding: 0;\n }\n\n .column,\n .drawer {\n flex: 0 0 auto;\n padding: 10px;\n padding-left: 5px;\n padding-right: 5px;\n\n &:first-child {\n padding-left: 10px;\n }\n\n &:last-child {\n padding-right: 10px;\n }\n }\n\n .columns-area > div {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n }\n }\n}\n\n.tabs-bar {\n box-sizing: border-box;\n display: flex;\n background: lighten($ui-base-color, 8%);\n flex: 0 0 auto;\n overflow-y: auto;\n}\n\n.tabs-bar__link {\n display: block;\n flex: 1 1 auto;\n padding: 15px 10px;\n padding-bottom: 13px;\n color: $primary-text-color;\n text-decoration: none;\n text-align: center;\n font-size: 14px;\n font-weight: 500;\n border-bottom: 2px solid lighten($ui-base-color, 8%);\n transition: all 50ms linear;\n transition-property: border-bottom, background, color;\n\n .fa {\n font-weight: 400;\n font-size: 16px;\n }\n\n &:hover,\n &:focus,\n &:active {\n @include multi-columns('screen and (min-width: 631px)') {\n background: lighten($ui-base-color, 14%);\n border-bottom-color: lighten($ui-base-color, 14%);\n }\n }\n\n &.active {\n border-bottom: 2px solid $ui-highlight-color;\n color: $highlight-text-color;\n }\n\n span {\n margin-left: 5px;\n display: none;\n }\n\n span.icon {\n margin-left: 0;\n display: inline;\n }\n}\n\n.icon-with-badge {\n position: relative;\n\n &__badge {\n position: absolute;\n left: 9px;\n top: -13px;\n background: $ui-highlight-color;\n border: 2px solid lighten($ui-base-color, 8%);\n padding: 1px 6px;\n border-radius: 6px;\n font-size: 10px;\n font-weight: 500;\n line-height: 14px;\n color: $primary-text-color;\n }\n}\n\n.column-link--transparent .icon-with-badge__badge {\n border-color: darken($ui-base-color, 8%);\n}\n\n.scrollable {\n overflow-y: scroll;\n overflow-x: hidden;\n flex: 1 1 auto;\n -webkit-overflow-scrolling: touch;\n\n &.optionally-scrollable {\n overflow-y: auto;\n }\n\n @supports(display: grid) { // hack to fix Chrome <57\n contain: strict;\n }\n\n &--flex {\n display: flex;\n flex-direction: column;\n }\n\n &__append {\n flex: 1 1 auto;\n position: relative;\n min-height: 120px;\n }\n}\n\n.scrollable.fullscreen {\n @supports(display: grid) { // hack to fix Chrome <57\n contain: none;\n }\n}\n\n.react-toggle {\n display: inline-block;\n position: relative;\n cursor: pointer;\n background-color: transparent;\n border: 0;\n padding: 0;\n user-select: none;\n -webkit-tap-highlight-color: rgba($base-overlay-background, 0);\n -webkit-tap-highlight-color: transparent;\n}\n\n.react-toggle-screenreader-only {\n border: 0;\n clip: rect(0 0 0 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n}\n\n.react-toggle--disabled {\n cursor: not-allowed;\n opacity: 0.5;\n transition: opacity 0.25s;\n}\n\n.react-toggle-track {\n width: 50px;\n height: 24px;\n padding: 0;\n border-radius: 30px;\n background-color: $ui-base-color;\n transition: background-color 0.2s ease;\n}\n\n.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track {\n background-color: darken($ui-base-color, 10%);\n}\n\n.react-toggle--checked .react-toggle-track {\n background-color: $ui-highlight-color;\n}\n\n.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track {\n background-color: lighten($ui-highlight-color, 10%);\n}\n\n.react-toggle-track-check {\n position: absolute;\n width: 14px;\n height: 10px;\n top: 0;\n bottom: 0;\n margin-top: auto;\n margin-bottom: auto;\n line-height: 0;\n left: 8px;\n opacity: 0;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle--checked .react-toggle-track-check {\n opacity: 1;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle-track-x {\n position: absolute;\n width: 10px;\n height: 10px;\n top: 0;\n bottom: 0;\n margin-top: auto;\n margin-bottom: auto;\n line-height: 0;\n right: 10px;\n opacity: 1;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle--checked .react-toggle-track-x {\n opacity: 0;\n}\n\n.react-toggle-thumb {\n position: absolute;\n top: 1px;\n left: 1px;\n width: 22px;\n height: 22px;\n border: 1px solid $ui-base-color;\n border-radius: 50%;\n background-color: darken($simple-background-color, 2%);\n box-sizing: border-box;\n transition: all 0.25s ease;\n transition-property: border-color, left;\n}\n\n.react-toggle--checked .react-toggle-thumb {\n left: 27px;\n border-color: $ui-highlight-color;\n}\n\n.getting-started__wrapper,\n.getting_started,\n.flex-spacer {\n background: $ui-base-color;\n}\n\n.getting-started__wrapper {\n position: relative;\n overflow-y: auto;\n}\n\n.flex-spacer {\n flex: 1 1 auto;\n}\n\n.getting-started {\n background: $ui-base-color;\n flex: 1 0 auto;\n\n p {\n color: $secondary-text-color;\n }\n\n a {\n color: $dark-text-color;\n }\n\n &__panel {\n height: min-content;\n }\n\n &__panel,\n &__footer {\n padding: 10px;\n padding-top: 20px;\n flex: 0 1 auto;\n\n ul {\n margin-bottom: 10px;\n }\n\n ul li {\n display: inline;\n }\n\n p {\n color: $dark-text-color;\n font-size: 13px;\n\n a {\n color: $dark-text-color;\n text-decoration: underline;\n }\n }\n\n a {\n text-decoration: none;\n color: $darker-text-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n }\n\n &__trends {\n flex: 0 1 auto;\n opacity: 1;\n animation: fade 150ms linear;\n margin-top: 10px;\n\n h4 {\n font-size: 12px;\n text-transform: uppercase;\n color: $darker-text-color;\n padding: 10px;\n font-weight: 500;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n @media screen and (max-height: 810px) {\n .trends__item:nth-child(3) {\n display: none;\n }\n }\n\n @media screen and (max-height: 720px) {\n .trends__item:nth-child(2) {\n display: none;\n }\n }\n\n @media screen and (max-height: 670px) {\n display: none;\n }\n\n .trends__item {\n border-bottom: 0;\n padding: 10px;\n\n &__current {\n color: $darker-text-color;\n }\n }\n }\n}\n\n.column-link__badge {\n display: inline-block;\n border-radius: 4px;\n font-size: 12px;\n line-height: 19px;\n font-weight: 500;\n background: $ui-base-color;\n padding: 4px 8px;\n margin: -6px 10px;\n}\n\n.keyboard-shortcuts {\n padding: 8px 0 0;\n overflow: hidden;\n\n thead {\n position: absolute;\n left: -9999px;\n }\n\n td {\n padding: 0 10px 8px;\n }\n\n kbd {\n display: inline-block;\n padding: 3px 5px;\n background-color: lighten($ui-base-color, 8%);\n border: 1px solid darken($ui-base-color, 4%);\n }\n}\n\n.setting-text {\n color: $darker-text-color;\n background: transparent;\n border: none;\n border-bottom: 2px solid $ui-primary-color;\n box-sizing: border-box;\n display: block;\n font-family: inherit;\n margin-bottom: 10px;\n padding: 7px 0;\n width: 100%;\n\n &:focus,\n &:active {\n color: $primary-text-color;\n border-bottom-color: $ui-highlight-color;\n }\n\n @include limited-single-column('screen and (max-width: 600px)') {\n font-size: 16px;\n }\n\n &.light {\n color: $inverted-text-color;\n border-bottom: 2px solid lighten($ui-base-color, 27%);\n\n &:focus,\n &:active {\n color: $inverted-text-color;\n border-bottom-color: $ui-highlight-color;\n }\n }\n}\n\n.no-reduce-motion button.icon-button i.fa-retweet {\n background-position: 0 0;\n height: 19px;\n transition: background-position 0.9s steps(10);\n transition-duration: 0s;\n vertical-align: middle;\n width: 22px;\n\n &::before {\n display: none !important;\n }\n}\n\n.no-reduce-motion button.icon-button.active i.fa-retweet {\n transition-duration: 0.9s;\n background-position: 0 100%;\n}\n\n.reduce-motion button.icon-button i.fa-retweet {\n color: $action-button-color;\n transition: color 100ms ease-in;\n}\n\n.reduce-motion button.icon-button.active i.fa-retweet {\n color: $highlight-text-color;\n}\n\n.reduce-motion button.icon-button.disabled i.fa-retweet {\n color: darken($action-button-color, 13%);\n}\n\n.load-more {\n display: block;\n color: $dark-text-color;\n background-color: transparent;\n border: 0;\n font-size: inherit;\n text-align: center;\n line-height: inherit;\n margin: 0;\n padding: 15px;\n box-sizing: border-box;\n width: 100%;\n clear: both;\n text-decoration: none;\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n}\n\n.load-gap {\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n}\n\n.missing-indicator {\n padding-top: 20px + 48px;\n}\n\n.scrollable > div > :first-child .notification__dismiss-overlay > .wrappy {\n border-top: 1px solid $ui-base-color;\n}\n\n.notification__dismiss-overlay {\n overflow: hidden;\n position: absolute;\n top: 0;\n right: 0;\n bottom: -1px;\n padding-left: 15px; // space for the box shadow to be visible\n\n z-index: 999;\n align-items: center;\n justify-content: flex-end;\n cursor: pointer;\n\n display: flex;\n\n .wrappy {\n width: $dismiss-overlay-width;\n align-self: stretch;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background: lighten($ui-base-color, 8%);\n border-left: 1px solid lighten($ui-base-color, 20%);\n box-shadow: 0 0 5px black;\n border-bottom: 1px solid $ui-base-color;\n }\n\n .ckbox {\n border: 2px solid $ui-primary-color;\n border-radius: 2px;\n width: 30px;\n height: 30px;\n font-size: 20px;\n color: $darker-text-color;\n text-shadow: 0 0 5px black;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n &:focus {\n outline: 0 !important;\n\n .ckbox {\n box-shadow: 0 0 1px 1px $ui-highlight-color;\n }\n }\n}\n\n.text-btn {\n display: inline-block;\n padding: 0;\n font-family: inherit;\n font-size: inherit;\n color: inherit;\n border: 0;\n background: transparent;\n cursor: pointer;\n}\n\n.loading-indicator {\n color: $dark-text-color;\n font-size: 12px;\n font-weight: 400;\n text-transform: uppercase;\n overflow: visible;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n\n span {\n display: block;\n float: left;\n margin-left: 50%;\n transform: translateX(-50%);\n margin: 82px 0 0 50%;\n white-space: nowrap;\n }\n}\n\n.loading-indicator__figure {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 42px;\n height: 42px;\n box-sizing: border-box;\n background-color: transparent;\n border: 0 solid lighten($ui-base-color, 26%);\n border-width: 6px;\n border-radius: 50%;\n}\n\n.no-reduce-motion .loading-indicator span {\n animation: loader-label 1.15s infinite cubic-bezier(0.215, 0.610, 0.355, 1.000);\n}\n\n.no-reduce-motion .loading-indicator__figure {\n animation: loader-figure 1.15s infinite cubic-bezier(0.215, 0.610, 0.355, 1.000);\n}\n\n@keyframes spring-rotate-in {\n 0% {\n transform: rotate(0deg);\n }\n\n 30% {\n transform: rotate(-484.8deg);\n }\n\n 60% {\n transform: rotate(-316.7deg);\n }\n\n 90% {\n transform: rotate(-375deg);\n }\n\n 100% {\n transform: rotate(-360deg);\n }\n}\n\n@keyframes spring-rotate-out {\n 0% {\n transform: rotate(-360deg);\n }\n\n 30% {\n transform: rotate(124.8deg);\n }\n\n 60% {\n transform: rotate(-43.27deg);\n }\n\n 90% {\n transform: rotate(15deg);\n }\n\n 100% {\n transform: rotate(0deg);\n }\n}\n\n@keyframes loader-figure {\n 0% {\n width: 0;\n height: 0;\n background-color: lighten($ui-base-color, 26%);\n }\n\n 29% {\n background-color: lighten($ui-base-color, 26%);\n }\n\n 30% {\n width: 42px;\n height: 42px;\n background-color: transparent;\n border-width: 21px;\n opacity: 1;\n }\n\n 100% {\n width: 42px;\n height: 42px;\n border-width: 0;\n opacity: 0;\n background-color: transparent;\n }\n}\n\n@keyframes loader-label {\n 0% { opacity: 0.25; }\n 30% { opacity: 1; }\n 100% { opacity: 0.25; }\n}\n\n.spoiler-button {\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n position: absolute;\n z-index: 100;\n\n &--minified {\n display: flex;\n left: 4px;\n top: 4px;\n width: auto;\n height: auto;\n align-items: center;\n }\n\n &--click-thru {\n pointer-events: none;\n }\n\n &--hidden {\n display: none;\n }\n\n &__overlay {\n display: block;\n background: transparent;\n width: 100%;\n height: 100%;\n border: 0;\n\n &__label {\n display: inline-block;\n background: rgba($base-overlay-background, 0.5);\n border-radius: 8px;\n padding: 8px 12px;\n color: $primary-text-color;\n font-weight: 500;\n font-size: 14px;\n }\n\n &:hover,\n &:focus,\n &:active {\n .spoiler-button__overlay__label {\n background: rgba($base-overlay-background, 0.8);\n }\n }\n\n &:disabled {\n .spoiler-button__overlay__label {\n background: rgba($base-overlay-background, 0.5);\n }\n }\n }\n}\n\n.setting-toggle {\n display: block;\n line-height: 24px;\n}\n\n.setting-toggle__label,\n.setting-radio__label,\n.setting-meta__label {\n color: $darker-text-color;\n display: inline-block;\n margin-bottom: 14px;\n margin-left: 8px;\n vertical-align: middle;\n}\n\n.setting-radio {\n display: block;\n line-height: 18px;\n}\n\n.setting-radio__label {\n margin-bottom: 0;\n}\n\n.column-settings__row legend {\n color: $darker-text-color;\n cursor: default;\n display: block;\n font-weight: 500;\n margin-top: 10px;\n}\n\n.setting-radio__input {\n vertical-align: middle;\n}\n\n.setting-meta__label {\n float: right;\n}\n\n@keyframes heartbeat {\n from {\n transform: scale(1);\n transform-origin: center center;\n animation-timing-function: ease-out;\n }\n\n 10% {\n transform: scale(0.91);\n animation-timing-function: ease-in;\n }\n\n 17% {\n transform: scale(0.98);\n animation-timing-function: ease-out;\n }\n\n 33% {\n transform: scale(0.87);\n animation-timing-function: ease-in;\n }\n\n 45% {\n transform: scale(1);\n animation-timing-function: ease-out;\n }\n}\n\n.pulse-loading {\n animation: heartbeat 1.5s ease-in-out infinite both;\n}\n\n.upload-area {\n align-items: center;\n background: rgba($base-overlay-background, 0.8);\n display: flex;\n height: 100%;\n justify-content: center;\n left: 0;\n opacity: 0;\n position: absolute;\n top: 0;\n visibility: hidden;\n width: 100%;\n z-index: 2000;\n\n * {\n pointer-events: none;\n }\n}\n\n.upload-area__drop {\n width: 320px;\n height: 160px;\n display: flex;\n box-sizing: border-box;\n position: relative;\n padding: 8px;\n}\n\n.upload-area__background {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: -1;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 5px rgba($base-shadow-color, 0.2);\n}\n\n.upload-area__content {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: $secondary-text-color;\n font-size: 18px;\n font-weight: 500;\n border: 2px dashed $ui-base-lighter-color;\n border-radius: 4px;\n}\n\n.dropdown--active .emoji-button img {\n opacity: 1;\n filter: none;\n}\n\n.loading-bar {\n background-color: $ui-highlight-color;\n height: 3px;\n position: absolute;\n top: 0;\n left: 0;\n z-index: 9999;\n}\n\n.icon-badge-wrapper {\n position: relative;\n}\n\n.icon-badge {\n position: absolute;\n display: block;\n right: -.25em;\n top: -.25em;\n background-color: $ui-highlight-color;\n border-radius: 50%;\n font-size: 75%;\n width: 1em;\n height: 1em;\n}\n\n.conversation {\n display: flex;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n padding: 5px;\n padding-bottom: 0;\n\n &:focus {\n background: lighten($ui-base-color, 2%);\n outline: 0;\n }\n\n &__avatar {\n flex: 0 0 auto;\n padding: 10px;\n padding-top: 12px;\n position: relative;\n cursor: pointer;\n }\n\n &__unread {\n display: inline-block;\n background: $highlight-text-color;\n border-radius: 50%;\n width: 0.625rem;\n height: 0.625rem;\n margin: -.1ex .15em .1ex;\n }\n\n &__content {\n flex: 1 1 auto;\n padding: 10px 5px;\n padding-right: 15px;\n overflow: hidden;\n\n &__info {\n overflow: hidden;\n display: flex;\n flex-direction: row-reverse;\n justify-content: space-between;\n }\n\n &__relative-time {\n font-size: 15px;\n color: $darker-text-color;\n padding-left: 15px;\n }\n\n &__names {\n color: $darker-text-color;\n font-size: 15px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-bottom: 4px;\n flex-basis: 90px;\n flex-grow: 1;\n\n a {\n color: $primary-text-color;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n }\n\n .status__content {\n margin: 0;\n }\n }\n\n &--unread {\n background: lighten($ui-base-color, 2%);\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n .conversation__content__info {\n font-weight: 700;\n }\n\n .conversation__content__relative-time {\n color: $primary-text-color;\n }\n }\n}\n\n.ui .flash-message {\n margin-top: 10px;\n margin-left: auto;\n margin-right: auto;\n margin-bottom: 0;\n min-width: 75%;\n}\n\n::-webkit-scrollbar-thumb {\n border-radius: 0;\n}\n\nnoscript {\n text-align: center;\n\n img {\n width: 200px;\n opacity: 0.5;\n animation: flicker 4s infinite;\n }\n\n div {\n font-size: 14px;\n margin: 30px auto;\n color: $secondary-text-color;\n max-width: 400px;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n\n a {\n word-break: break-word;\n }\n }\n}\n\n@keyframes flicker {\n 0% { opacity: 1; }\n 30% { opacity: 0.75; }\n 100% { opacity: 1; }\n}\n\n@import 'boost';\n@import 'accounts';\n@import 'domains';\n@import 'status';\n@import 'modal';\n@import 'composer';\n@import 'columns';\n@import 'regeneration_indicator';\n@import 'directory';\n@import 'search';\n@import 'emoji';\n@import 'doodle';\n@import 'drawer';\n@import 'media';\n@import 'sensitive';\n@import 'lists';\n@import 'emoji_picker';\n@import 'local_settings';\n@import 'error_boundary';\n@import 'single_column';\n@import 'announcements';\n","button.icon-button i.fa-retweet {\n background-image: url(\"data:image/svg+xml;utf8,\");\n\n &:hover {\n background-image: url(\"data:image/svg+xml;utf8,\");\n }\n}\n\n// Disabled variant\nbutton.icon-button.disabled i.fa-retweet {\n &, &:hover {\n background-image: url(\"data:image/svg+xml;utf8,\");\n }\n}\n\n// Disabled variant for use with DMs\n.status-direct button.icon-button.disabled i.fa-retweet {\n &, &:hover {\n background-image: url(\"data:image/svg+xml;utf8,\");\n }\n}\n",".account {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n color: inherit;\n text-decoration: none;\n\n .account__display-name {\n flex: 1 1 auto;\n display: block;\n color: $darker-text-color;\n overflow: hidden;\n text-decoration: none;\n font-size: 14px;\n }\n\n &.small {\n border: none;\n padding: 0;\n\n & > .account__avatar-wrapper { margin: 0 8px 0 0 }\n\n & > .display-name {\n height: 24px;\n line-height: 24px;\n }\n }\n}\n\n.account__wrapper {\n display: flex;\n}\n\n.account__avatar-wrapper {\n float: left;\n margin-left: 12px;\n margin-right: 12px;\n}\n\n.account__avatar {\n @include avatar-radius();\n position: relative;\n cursor: pointer;\n\n &-inline {\n display: inline-block;\n vertical-align: middle;\n margin-right: 5px;\n }\n\n &-composite {\n @include avatar-radius;\n overflow: hidden;\n position: relative;\n\n & div {\n @include avatar-radius;\n float: left;\n position: relative;\n box-sizing: border-box;\n }\n\n &__label {\n display: block;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n color: $primary-text-color;\n text-shadow: 1px 1px 2px $base-shadow-color;\n font-weight: 700;\n font-size: 15px;\n }\n }\n}\n\n.account__avatar-overlay {\n position: relative;\n @include avatar-size(48px);\n\n &-base {\n @include avatar-radius();\n @include avatar-size(36px);\n }\n\n &-overlay {\n @include avatar-radius();\n @include avatar-size(24px);\n\n position: absolute;\n bottom: 0;\n right: 0;\n z-index: 1;\n }\n}\n\n.account__relationship {\n height: 18px;\n padding: 10px;\n white-space: nowrap;\n}\n\n.account__header__wrapper {\n flex: 0 0 auto;\n background: lighten($ui-base-color, 4%);\n}\n\n.account__disclaimer {\n padding: 10px;\n color: $dark-text-color;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n font-weight: 500;\n color: inherit;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n}\n\n.account__action-bar {\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n line-height: 36px;\n overflow: hidden;\n flex: 0 0 auto;\n display: flex;\n}\n\n.account__action-bar-links {\n display: flex;\n flex: 1 1 auto;\n line-height: 18px;\n text-align: center;\n}\n\n.account__action-bar__tab {\n text-decoration: none;\n overflow: hidden;\n flex: 0 1 100%;\n border-left: 1px solid lighten($ui-base-color, 8%);\n padding: 10px 0;\n border-bottom: 4px solid transparent;\n\n &:first-child {\n border-left: 0;\n }\n\n &.active {\n border-bottom: 4px solid $ui-highlight-color;\n }\n\n & > span {\n display: block;\n text-transform: uppercase;\n font-size: 11px;\n color: $darker-text-color;\n }\n\n strong {\n display: block;\n font-size: 15px;\n font-weight: 500;\n color: $primary-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n abbr {\n color: $highlight-text-color;\n }\n}\n\n.account-authorize {\n padding: 14px 10px;\n\n .detailed-status__display-name {\n display: block;\n margin-bottom: 15px;\n overflow: hidden;\n }\n}\n\n.account-authorize__avatar {\n float: left;\n margin-right: 10px;\n}\n\n.notification__message {\n margin-left: 42px;\n padding: 8px 0 0 26px;\n cursor: default;\n color: $darker-text-color;\n font-size: 15px;\n position: relative;\n\n .fa {\n color: $highlight-text-color;\n }\n\n > span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.account--panel {\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: row;\n padding: 10px 0;\n}\n\n.account--panel__button,\n.detailed-status__button {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.column-settings__outer {\n background: lighten($ui-base-color, 8%);\n padding: 15px;\n}\n\n.column-settings__section {\n color: $darker-text-color;\n cursor: default;\n display: block;\n font-weight: 500;\n margin-bottom: 10px;\n}\n\n.column-settings__hashtags {\n .column-settings__row {\n margin-bottom: 15px;\n }\n\n .column-select {\n &__control {\n @include search-input();\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n &__placeholder {\n color: $dark-text-color;\n padding-left: 2px;\n font-size: 12px;\n }\n\n &__value-container {\n padding-left: 6px;\n }\n\n &__multi-value {\n background: lighten($ui-base-color, 8%);\n\n &__remove {\n cursor: pointer;\n\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 12%);\n color: lighten($darker-text-color, 4%);\n }\n }\n }\n\n &__multi-value__label,\n &__input {\n color: $darker-text-color;\n }\n\n &__clear-indicator,\n &__dropdown-indicator {\n cursor: pointer;\n transition: none;\n color: $dark-text-color;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($dark-text-color, 4%);\n }\n }\n\n &__indicator-separator {\n background-color: lighten($ui-base-color, 8%);\n }\n\n &__menu {\n @include search-popout();\n padding: 0;\n background: $ui-secondary-color;\n }\n\n &__menu-list {\n padding: 6px;\n }\n\n &__option {\n color: $inverted-text-color;\n border-radius: 4px;\n font-size: 14px;\n\n &--is-focused,\n &--is-selected {\n background: darken($ui-secondary-color, 10%);\n }\n }\n }\n}\n\n.column-settings__row {\n .text-btn {\n margin-bottom: 15px;\n }\n}\n\n.relationship-tag {\n color: $primary-text-color;\n margin-bottom: 4px;\n display: block;\n vertical-align: top;\n background-color: $base-overlay-background;\n text-transform: uppercase;\n font-size: 11px;\n font-weight: 500;\n padding: 4px;\n border-radius: 4px;\n opacity: 0.7;\n\n &:hover {\n opacity: 1;\n }\n}\n\n.account-gallery__container {\n display: flex;\n flex-wrap: wrap;\n padding: 4px 2px;\n}\n\n.account-gallery__item {\n border: none;\n box-sizing: border-box;\n display: block;\n position: relative;\n border-radius: 4px;\n overflow: hidden;\n margin: 2px;\n\n &__icons {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 24px;\n }\n}\n\n.notification__filter-bar,\n.account__section-headline {\n background: darken($ui-base-color, 4%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n display: flex;\n flex-shrink: 0;\n\n button {\n background: darken($ui-base-color, 4%);\n border: 0;\n margin: 0;\n }\n\n button,\n a {\n display: block;\n flex: 1 1 auto;\n color: $darker-text-color;\n padding: 15px 0;\n font-size: 14px;\n font-weight: 500;\n text-align: center;\n text-decoration: none;\n position: relative;\n\n &.active {\n color: $secondary-text-color;\n\n &::before,\n &::after {\n display: block;\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 50%;\n width: 0;\n height: 0;\n transform: translateX(-50%);\n border-style: solid;\n border-width: 0 10px 10px;\n border-color: transparent transparent lighten($ui-base-color, 8%);\n }\n\n &::after {\n bottom: -1px;\n border-color: transparent transparent $ui-base-color;\n }\n }\n }\n\n &.directory__section-headline {\n background: darken($ui-base-color, 2%);\n border-bottom-color: transparent;\n\n a,\n button {\n &.active {\n &::before {\n display: none;\n }\n\n &::after {\n border-color: transparent transparent darken($ui-base-color, 7%);\n }\n }\n }\n }\n}\n\n.account__moved-note {\n padding: 14px 10px;\n padding-bottom: 16px;\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &__message {\n position: relative;\n margin-left: 58px;\n color: $dark-text-color;\n padding: 8px 0;\n padding-top: 0;\n padding-bottom: 4px;\n font-size: 14px;\n\n > span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n &__icon-wrapper {\n left: -26px;\n position: absolute;\n }\n\n .detailed-status__display-avatar {\n position: relative;\n }\n\n .detailed-status__display-name {\n margin-bottom: 0;\n }\n}\n\n.account__header__content {\n color: $darker-text-color;\n font-size: 14px;\n font-weight: 400;\n overflow: hidden;\n word-break: normal;\n word-wrap: break-word;\n\n p {\n margin-bottom: 20px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: inherit;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n}\n\n.account__header {\n overflow: hidden;\n\n &.inactive {\n opacity: 0.5;\n\n .account__header__image,\n .account__avatar {\n filter: grayscale(100%);\n }\n }\n\n &__info {\n position: absolute;\n top: 10px;\n left: 10px;\n }\n\n &__image {\n overflow: hidden;\n height: 145px;\n position: relative;\n background: darken($ui-base-color, 4%);\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n }\n }\n\n &__bar {\n position: relative;\n background: lighten($ui-base-color, 4%);\n padding: 5px;\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n\n .avatar {\n display: block;\n flex: 0 0 auto;\n width: 94px;\n margin-left: -2px;\n\n .account__avatar {\n background: darken($ui-base-color, 8%);\n border: 2px solid lighten($ui-base-color, 4%);\n }\n }\n }\n\n &__tabs {\n display: flex;\n align-items: flex-start;\n padding: 7px 5px;\n margin-top: -55px;\n\n &__buttons {\n display: flex;\n align-items: center;\n padding-top: 55px;\n overflow: hidden;\n\n .icon-button {\n border: 1px solid lighten($ui-base-color, 12%);\n border-radius: 4px;\n box-sizing: content-box;\n padding: 2px;\n }\n\n .button {\n margin: 0 8px;\n }\n }\n\n &__name {\n padding: 5px;\n\n .account-role {\n vertical-align: top;\n }\n\n .emojione {\n width: 22px;\n height: 22px;\n }\n\n h1 {\n font-size: 16px;\n line-height: 24px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n\n small {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n .spacer {\n flex: 1 1 auto;\n }\n }\n\n &__bio {\n overflow: hidden;\n margin: 0 -5px;\n\n .account__header__content {\n padding: 20px 15px;\n padding-bottom: 5px;\n color: $primary-text-color;\n }\n\n .account__header__fields {\n margin: 0;\n border-top: 1px solid lighten($ui-base-color, 12%);\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n }\n\n &__extra {\n margin-top: 4px;\n\n &__links {\n font-size: 14px;\n color: $darker-text-color;\n padding: 10px 0;\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n padding: 5px 10px;\n font-weight: 500;\n\n strong {\n font-weight: 700;\n color: $primary-text-color;\n }\n }\n }\n }\n}\n",".domain {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n .domain__domain-name {\n flex: 1 1 auto;\n display: block;\n color: $primary-text-color;\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n }\n}\n\n.domain__wrapper {\n display: flex;\n}\n\n.domain_buttons {\n height: 18px;\n padding: 10px;\n white-space: nowrap;\n}\n","@keyframes spring-flip-in {\n 0% {\n transform: rotate(0deg);\n }\n\n 30% {\n transform: rotate(-242.4deg);\n }\n\n 60% {\n transform: rotate(-158.35deg);\n }\n\n 90% {\n transform: rotate(-187.5deg);\n }\n\n 100% {\n transform: rotate(-180deg);\n }\n}\n\n@keyframes spring-flip-out {\n 0% {\n transform: rotate(-180deg);\n }\n\n 30% {\n transform: rotate(62.4deg);\n }\n\n 60% {\n transform: rotate(-21.635deg);\n }\n\n 90% {\n transform: rotate(7.5deg);\n }\n\n 100% {\n transform: rotate(0deg);\n }\n}\n\n.status__content--with-action {\n cursor: pointer;\n}\n\n.status__content {\n position: relative;\n margin: 10px 0;\n font-size: 15px;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n overflow: visible;\n padding-top: 5px;\n\n &:focus {\n outline: 0;\n }\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n img {\n max-width: 100%;\n max-height: 400px;\n object-fit: contain;\n }\n\n p, pre, blockquote {\n margin-bottom: 20px;\n white-space: pre-wrap;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .status__content__text,\n .e-content {\n overflow: hidden;\n\n & > ul,\n & > ol {\n margin-bottom: 20px;\n }\n\n h1, h2, h3, h4, h5 {\n margin-top: 20px;\n margin-bottom: 20px;\n }\n\n h1, h2 {\n font-weight: 700;\n font-size: 1.2em;\n }\n\n h2 {\n font-size: 1.1em;\n }\n\n h3, h4, h5 {\n font-weight: 500;\n }\n\n blockquote {\n padding-left: 10px;\n border-left: 3px solid $darker-text-color;\n color: $darker-text-color;\n white-space: normal;\n\n p:last-child {\n margin-bottom: 0;\n }\n }\n\n b, strong {\n font-weight: 700;\n }\n\n em, i {\n font-style: italic;\n }\n\n sub {\n font-size: smaller;\n text-align: sub;\n }\n\n sup {\n font-size: smaller;\n vertical-align: super;\n }\n\n ul, ol {\n margin-left: 1em;\n\n p {\n margin: 0;\n }\n }\n\n ul {\n list-style-type: disc;\n }\n\n ol {\n list-style-type: decimal;\n }\n }\n\n a {\n color: $pleroma-links;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n\n .fa {\n color: lighten($dark-text-color, 7%);\n }\n }\n\n &.mention {\n &:hover {\n text-decoration: none;\n\n span {\n text-decoration: underline;\n }\n }\n }\n\n .fa {\n color: $dark-text-color;\n }\n }\n\n .status__content__spoiler {\n display: none;\n\n &.status__content__spoiler--visible {\n display: block;\n }\n }\n\n a.unhandled-link {\n color: lighten($ui-highlight-color, 8%);\n\n .link-origin-tag {\n color: $gold-star;\n font-size: 0.8em;\n }\n }\n\n .status__content__spoiler-link {\n background: lighten($ui-base-color, 30%);\n\n &:hover {\n background: lighten($ui-base-color, 33%);\n text-decoration: none;\n }\n }\n}\n\n.status__content__spoiler-link {\n display: inline-block;\n border-radius: 2px;\n background: lighten($ui-base-color, 30%);\n border: none;\n color: $inverted-text-color;\n font-weight: 500;\n font-size: 11px;\n padding: 0 5px;\n text-transform: uppercase;\n line-height: inherit;\n cursor: pointer;\n vertical-align: bottom;\n\n &:hover {\n background: lighten($ui-base-color, 33%);\n text-decoration: none;\n }\n\n .status__content__spoiler-icon {\n display: inline-block;\n margin: 0 0 0 5px;\n border-left: 1px solid currentColor;\n padding: 0 0 0 4px;\n font-size: 16px;\n vertical-align: -2px;\n }\n}\n\n.notif-cleaning {\n .status,\n .notification-follow,\n .notification-follow-request {\n padding-right: ($dismiss-overlay-width + 0.5rem);\n }\n}\n\n.status__wrapper--filtered {\n color: $dark-text-color;\n border: 0;\n font-size: inherit;\n text-align: center;\n line-height: inherit;\n margin: 0;\n padding: 15px;\n box-sizing: border-box;\n width: 100%;\n clear: both;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n}\n\n.status__prepend-icon-wrapper {\n left: -26px;\n position: absolute;\n}\n\n.notification-follow,\n.notification-follow-request {\n position: relative;\n\n // same like Status\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n .account {\n border-bottom: 0 none;\n }\n}\n\n.focusable {\n &:focus {\n outline: 0;\n background: lighten($ui-base-color, 4%);\n\n &.status.status-direct:not(.read) {\n background: lighten($ui-base-color, 12%);\n\n &.muted {\n background: transparent;\n }\n }\n\n .detailed-status,\n .detailed-status__action-bar {\n background: lighten($ui-base-color, 8%);\n }\n }\n}\n\n.status {\n padding: 10px 14px;\n position: relative;\n height: auto;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n\n @supports (-ms-overflow-style: -ms-autohiding-scrollbar) {\n // Add margin to avoid Edge auto-hiding scrollbar appearing over content.\n // On Edge 16 this is 16px and Edge <=15 it's 12px, so aim for 16px.\n padding-right: 28px; // 12px + 16px\n }\n\n @keyframes fade {\n 0% { opacity: 0; }\n 100% { opacity: 1; }\n }\n\n opacity: 1;\n animation: fade 150ms linear;\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n }\n\n &.status-direct:not(.read) {\n background: lighten($ui-base-color, 8%);\n border-bottom-color: lighten($ui-base-color, 12%);\n }\n\n &.light {\n .status__relative-time {\n color: $lighter-text-color;\n }\n\n .status__display-name {\n color: $inverted-text-color;\n }\n\n .display-name {\n color: $light-text-color;\n\n strong {\n color: $inverted-text-color;\n }\n }\n\n .status__content {\n color: $inverted-text-color;\n\n a {\n color: $highlight-text-color;\n }\n\n a.status__content__spoiler-link {\n color: $primary-text-color;\n background: $ui-primary-color;\n\n &:hover {\n background: lighten($ui-primary-color, 8%);\n }\n }\n }\n }\n\n &.collapsed {\n background-position: center;\n background-size: cover;\n user-select: none;\n\n &.has-background::before {\n display: block;\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n background-image: linear-gradient(to bottom, rgba($base-shadow-color, .75), rgba($base-shadow-color, .65) 24px, rgba($base-shadow-color, .8));\n pointer-events: none;\n content: \"\";\n }\n\n .display-name:hover .display-name__html {\n text-decoration: none;\n }\n\n .status__content {\n height: 20px;\n overflow: hidden;\n text-overflow: ellipsis;\n padding-top: 0;\n\n &:after {\n content: \"\";\n position: absolute;\n top: 0; bottom: 0;\n left: 0; right: 0;\n background: linear-gradient(rgba($ui-base-color, 0), rgba($ui-base-color, 1));\n pointer-events: none;\n }\n \n a:hover {\n text-decoration: none;\n }\n }\n &:focus > .status__content:after {\n background: linear-gradient(rgba(lighten($ui-base-color, 4%), 0), rgba(lighten($ui-base-color, 4%), 1));\n }\n &.status-direct:not(.read)> .status__content:after {\n background: linear-gradient(rgba(lighten($ui-base-color, 8%), 0), rgba(lighten($ui-base-color, 8%), 1));\n }\n\n .notification__message {\n margin-bottom: 0;\n }\n\n .status__info .notification__message > span {\n white-space: nowrap;\n }\n }\n\n .notification__message {\n margin: -10px 0px 10px 0;\n }\n}\n\n.notification-favourite {\n .status.status-direct {\n background: transparent;\n\n .icon-button.disabled {\n color: lighten($action-button-color, 13%);\n }\n }\n}\n\n.status__relative-time {\n display: inline-block;\n flex-grow: 1;\n color: $dark-text-color;\n font-size: 14px;\n text-align: right;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.status__display-name {\n color: $dark-text-color;\n overflow: hidden;\n}\n\n.status__info__account .status__display-name {\n display: block;\n max-width: 100%;\n}\n\n.status__info {\n display: flex;\n justify-content: space-between;\n font-size: 15px;\n\n > span {\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n .notification__message > span {\n word-wrap: break-word;\n }\n}\n\n.status__info__icons {\n display: flex;\n align-items: center;\n height: 1em;\n color: $action-button-color;\n\n .status__media-icon,\n .status__visibility-icon,\n .status__reply-icon {\n padding-left: 2px;\n padding-right: 2px;\n }\n\n .status__collapse-button.active > .fa-angle-double-up {\n transform: rotate(-180deg);\n }\n}\n\n.no-reduce-motion .status__collapse-button {\n &.activate {\n & > .fa-angle-double-up {\n animation: spring-flip-in 1s linear;\n }\n }\n\n &.deactivate {\n & > .fa-angle-double-up {\n animation: spring-flip-out 1s linear;\n }\n }\n}\n\n.status__info__account {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n}\n\n.status-check-box {\n border-bottom: 1px solid $ui-secondary-color;\n display: flex;\n\n .status-check-box__status {\n margin: 10px 0 10px 10px;\n flex: 1;\n overflow: hidden;\n\n .media-gallery {\n max-width: 250px;\n }\n\n .status__content {\n padding: 0;\n white-space: normal;\n }\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n max-width: 250px;\n }\n\n .media-gallery__item-thumbnail {\n cursor: default;\n }\n }\n}\n\n.status-check-box-toggle {\n align-items: center;\n display: flex;\n flex: 0 0 auto;\n justify-content: center;\n padding: 10px;\n}\n\n.status__prepend {\n margin-top: -10px;\n margin-bottom: 10px;\n margin-left: 58px;\n color: $dark-text-color;\n padding: 8px 0;\n padding-bottom: 2px;\n font-size: 14px;\n position: relative;\n\n .status__display-name strong {\n color: $dark-text-color;\n }\n\n > span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.status__action-bar {\n align-items: center;\n display: flex;\n margin-top: 8px;\n\n &__counter {\n display: inline-flex;\n margin-right: 11px;\n align-items: center;\n\n .status__action-bar-button {\n margin-right: 4px;\n }\n\n &__label {\n display: inline-block;\n width: 14px;\n font-size: 12px;\n font-weight: 500;\n color: $action-button-color;\n }\n }\n}\n\n.status__action-bar-button {\n margin-right: 18px;\n}\n\n.status__action-bar-dropdown {\n height: 23.15px;\n width: 23.15px;\n}\n\n.detailed-status__action-bar-dropdown {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n}\n\n.detailed-status {\n background: lighten($ui-base-color, 4%);\n padding: 14px 10px;\n\n &--flex {\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n align-items: flex-start;\n\n .status__content,\n .detailed-status__meta {\n flex: 100%;\n }\n }\n\n .status__content {\n font-size: 19px;\n line-height: 24px;\n\n .emojione {\n width: 24px;\n height: 24px;\n margin: -1px 0 0;\n }\n }\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n }\n}\n\n.detailed-status__meta {\n margin-top: 15px;\n color: $dark-text-color;\n font-size: 14px;\n line-height: 18px;\n}\n\n.detailed-status__action-bar {\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: row;\n padding: 10px 0;\n}\n\n.detailed-status__link {\n color: inherit;\n text-decoration: none;\n}\n\n.detailed-status__favorites,\n.detailed-status__reblogs {\n display: inline-block;\n font-weight: 500;\n font-size: 12px;\n margin-left: 6px;\n}\n\n.status__display-name,\n.status__relative-time,\n.detailed-status__display-name,\n.detailed-status__datetime,\n.detailed-status__application,\n.account__display-name {\n text-decoration: none;\n}\n\n.status__display-name,\n.account__display-name {\n strong {\n color: $primary-text-color;\n }\n}\n\n.muted {\n .emojione {\n opacity: 0.5;\n }\n}\n\na.status__display-name,\n.reply-indicator__display-name,\n.detailed-status__display-name,\n.account__display-name {\n &:hover strong {\n text-decoration: underline;\n }\n}\n\n.account__display-name strong {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.detailed-status__application,\n.detailed-status__datetime {\n color: inherit;\n}\n\n.detailed-status .button.logo-button {\n margin-bottom: 15px;\n}\n\n.detailed-status__display-name {\n color: $secondary-text-color;\n display: block;\n line-height: 24px;\n margin-bottom: 15px;\n overflow: hidden;\n\n strong,\n span {\n display: block;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n strong {\n font-size: 16px;\n color: $primary-text-color;\n }\n}\n\n.detailed-status__display-avatar {\n float: left;\n margin-right: 10px;\n}\n\n.status__avatar {\n flex: none;\n margin: 0 10px 0 0;\n height: 48px;\n width: 48px;\n}\n\n.muted {\n .status__content,\n .status__content p,\n .status__content a,\n .status__content__text {\n color: $dark-text-color;\n }\n\n .status__display-name strong {\n color: $dark-text-color;\n }\n\n .status__avatar {\n opacity: 0.5;\n }\n\n a.status__content__spoiler-link {\n background: $ui-base-lighter-color;\n color: $inverted-text-color;\n\n &:hover {\n background: lighten($ui-base-color, 29%);\n text-decoration: none;\n }\n }\n}\n\n.status__relative-time,\n.detailed-status__datetime {\n &:hover {\n text-decoration: underline;\n }\n}\n\n.status-card {\n display: flex;\n font-size: 14px;\n border: 1px solid lighten($ui-base-color, 8%);\n border-radius: 4px;\n color: $dark-text-color;\n margin-top: 14px;\n text-decoration: none;\n overflow: hidden;\n\n &__actions {\n bottom: 0;\n left: 0;\n position: absolute;\n right: 0;\n top: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n\n & > div {\n background: rgba($base-shadow-color, 0.6);\n border-radius: 8px;\n padding: 12px 9px;\n flex: 0 0 auto;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n button,\n a {\n display: inline;\n color: $secondary-text-color;\n background: transparent;\n border: 0;\n padding: 0 8px;\n text-decoration: none;\n font-size: 18px;\n line-height: 18px;\n\n &:hover,\n &:active,\n &:focus {\n color: $primary-text-color;\n }\n }\n\n a {\n font-size: 19px;\n position: relative;\n bottom: -1px;\n }\n\n a .fa, a:hover .fa {\n color: inherit;\n }\n }\n}\n\na.status-card {\n cursor: pointer;\n\n &:hover {\n background: lighten($ui-base-color, 8%);\n }\n}\n\n.status-card-photo {\n cursor: zoom-in;\n display: block;\n text-decoration: none;\n width: 100%;\n height: auto;\n margin: 0;\n}\n\n.status-card-video {\n iframe {\n width: 100%;\n height: 100%;\n }\n}\n\n.status-card__title {\n display: block;\n font-weight: 500;\n margin-bottom: 5px;\n color: $darker-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-decoration: none;\n}\n\n.status-card__content {\n flex: 1 1 auto;\n overflow: hidden;\n padding: 14px 14px 14px 8px;\n}\n\n.status-card__description {\n color: $darker-text-color;\n}\n\n.status-card__host {\n display: block;\n margin-top: 5px;\n font-size: 13px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.status-card__image {\n flex: 0 0 100px;\n background: lighten($ui-base-color, 8%);\n position: relative;\n\n & > .fa {\n font-size: 21px;\n position: absolute;\n transform-origin: 50% 50%;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n}\n\n.status-card.horizontal {\n display: block;\n\n .status-card__image {\n width: 100%;\n }\n\n .status-card__image-image {\n border-radius: 4px 4px 0 0;\n }\n\n .status-card__title {\n white-space: inherit;\n }\n}\n\n.status-card.compact {\n border-color: lighten($ui-base-color, 4%);\n\n &.interactive {\n border: 0;\n }\n\n .status-card__content {\n padding: 8px;\n padding-top: 10px;\n }\n\n .status-card__title {\n white-space: nowrap;\n }\n\n .status-card__image {\n flex: 0 0 60px;\n }\n}\n\na.status-card.compact:hover {\n background-color: lighten($ui-base-color, 4%);\n}\n\n.status-card__image-image {\n border-radius: 4px 0 0 4px;\n display: block;\n margin: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n background-size: cover;\n background-position: center center;\n}\n\n.attachment-list {\n display: flex;\n font-size: 14px;\n border: 1px solid lighten($ui-base-color, 8%);\n border-radius: 4px;\n margin-top: 14px;\n overflow: hidden;\n\n &__icon {\n flex: 0 0 auto;\n color: $dark-text-color;\n padding: 8px 18px;\n cursor: default;\n border-right: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n font-size: 26px;\n\n .fa {\n display: block;\n }\n }\n\n &__list {\n list-style: none;\n padding: 4px 0;\n padding-left: 8px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n\n li {\n display: block;\n padding: 4px 0;\n }\n\n a {\n text-decoration: none;\n color: $dark-text-color;\n font-weight: 500;\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n &.compact {\n border: 0;\n margin-top: 4px;\n\n .attachment-list__list {\n padding: 0;\n display: block;\n }\n\n .fa {\n color: $dark-text-color;\n }\n }\n}\n\n.status__wrapper--filtered__button {\n display: inline;\n color: lighten($ui-highlight-color, 8%);\n border: 0;\n background: transparent;\n padding: 0;\n font-size: inherit;\n line-height: inherit;\n\n &:hover,\n &:active {\n text-decoration: underline;\n }\n}\n",".modal-container--preloader {\n background: lighten($ui-base-color, 8%);\n}\n\n.modal-root {\n position: relative;\n transition: opacity 0.3s linear;\n will-change: opacity;\n z-index: 9999;\n}\n\n.modal-root__overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba($base-overlay-background, 0.7);\n}\n\n.modal-root__container {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n align-content: space-around;\n z-index: 9999;\n pointer-events: none;\n user-select: none;\n}\n\n.modal-root__modal {\n pointer-events: auto;\n display: flex;\n z-index: 9999;\n}\n\n.onboarding-modal,\n.error-modal,\n.embed-modal {\n background: $ui-secondary-color;\n color: $inverted-text-color;\n border-radius: 8px;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.onboarding-modal__pager {\n height: 80vh;\n width: 80vw;\n max-width: 520px;\n max-height: 470px;\n\n .react-swipeable-view-container > div {\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n display: none;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n display: flex;\n user-select: text;\n }\n}\n\n.error-modal__body {\n height: 80vh;\n width: 80vw;\n max-width: 520px;\n max-height: 420px;\n position: relative;\n\n & > div {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n padding: 25px;\n display: none;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n display: flex;\n opacity: 0;\n user-select: text;\n }\n}\n\n.error-modal__body {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n text-align: center;\n}\n\n@media screen and (max-width: 550px) {\n .onboarding-modal {\n width: 100%;\n height: 100%;\n border-radius: 0;\n }\n\n .onboarding-modal__pager {\n width: 100%;\n height: auto;\n max-width: none;\n max-height: none;\n flex: 1 1 auto;\n }\n}\n\n.onboarding-modal__paginator,\n.error-modal__footer {\n flex: 0 0 auto;\n background: darken($ui-secondary-color, 8%);\n display: flex;\n padding: 25px;\n\n & > div {\n min-width: 33px;\n }\n\n .onboarding-modal__nav,\n .error-modal__nav {\n color: $lighter-text-color;\n border: 0;\n font-size: 14px;\n font-weight: 500;\n padding: 10px 25px;\n line-height: inherit;\n height: auto;\n margin: -10px;\n border-radius: 4px;\n background-color: transparent;\n\n &:hover,\n &:focus,\n &:active {\n color: darken($lighter-text-color, 4%);\n background-color: darken($ui-secondary-color, 16%);\n }\n\n &.onboarding-modal__done,\n &.onboarding-modal__next {\n color: $inverted-text-color;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($inverted-text-color, 4%);\n }\n }\n }\n}\n\n.error-modal__footer {\n justify-content: center;\n}\n\n.onboarding-modal__dots {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.onboarding-modal__dot {\n width: 14px;\n height: 14px;\n border-radius: 14px;\n background: darken($ui-secondary-color, 16%);\n margin: 0 3px;\n cursor: pointer;\n\n &:hover {\n background: darken($ui-secondary-color, 18%);\n }\n\n &.active {\n cursor: default;\n background: darken($ui-secondary-color, 24%);\n }\n}\n\n.onboarding-modal__page__wrapper {\n pointer-events: none;\n padding: 25px;\n padding-bottom: 0;\n\n &.onboarding-modal__page__wrapper--active {\n pointer-events: auto;\n }\n}\n\n.onboarding-modal__page {\n cursor: default;\n line-height: 21px;\n\n h1 {\n font-size: 18px;\n font-weight: 500;\n color: $inverted-text-color;\n margin-bottom: 20px;\n }\n\n a {\n color: $highlight-text-color;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($highlight-text-color, 4%);\n }\n }\n\n .navigation-bar a {\n color: inherit;\n }\n\n p {\n font-size: 16px;\n color: $lighter-text-color;\n margin-top: 10px;\n margin-bottom: 10px;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n strong {\n font-weight: 500;\n background: $ui-base-color;\n color: $secondary-text-color;\n border-radius: 4px;\n font-size: 14px;\n padding: 3px 6px;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n }\n}\n\n.onboarding-modal__page__wrapper-0 {\n height: 100%;\n padding: 0;\n}\n\n.onboarding-modal__page-one {\n &__lead {\n padding: 65px;\n padding-top: 45px;\n padding-bottom: 0;\n margin-bottom: 10px;\n\n h1 {\n font-size: 26px;\n line-height: 36px;\n margin-bottom: 8px;\n }\n\n p {\n margin-bottom: 0;\n }\n }\n\n &__extra {\n padding-right: 65px;\n padding-left: 185px;\n text-align: center;\n }\n}\n\n.display-case {\n text-align: center;\n font-size: 15px;\n margin-bottom: 15px;\n\n &__label {\n font-weight: 500;\n color: $inverted-text-color;\n margin-bottom: 5px;\n text-transform: uppercase;\n font-size: 12px;\n }\n\n &__case {\n background: $ui-base-color;\n color: $secondary-text-color;\n font-weight: 500;\n padding: 10px;\n border-radius: 4px;\n }\n}\n\n.onboarding-modal__page-two,\n.onboarding-modal__page-three,\n.onboarding-modal__page-four,\n.onboarding-modal__page-five {\n p {\n text-align: left;\n }\n\n .figure {\n background: darken($ui-base-color, 8%);\n color: $secondary-text-color;\n margin-bottom: 20px;\n border-radius: 4px;\n padding: 10px;\n text-align: center;\n font-size: 14px;\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.3);\n\n .onboarding-modal__image {\n border-radius: 4px;\n margin-bottom: 10px;\n }\n\n &.non-interactive {\n pointer-events: none;\n text-align: left;\n }\n }\n}\n\n.onboarding-modal__page-four__columns {\n .row {\n display: flex;\n margin-bottom: 20px;\n\n & > div {\n flex: 1 1 0;\n margin: 0 10px;\n\n &:first-child {\n margin-left: 0;\n }\n\n &:last-child {\n margin-right: 0;\n }\n\n p {\n text-align: center;\n }\n }\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .column-header {\n color: $primary-text-color;\n }\n}\n\n@media screen and (max-width: 320px) and (max-height: 600px) {\n .onboarding-modal__page p {\n font-size: 14px;\n line-height: 20px;\n }\n\n .onboarding-modal__page-two .figure,\n .onboarding-modal__page-three .figure,\n .onboarding-modal__page-four .figure,\n .onboarding-modal__page-five .figure {\n font-size: 12px;\n margin-bottom: 10px;\n }\n\n .onboarding-modal__page-four__columns .row {\n margin-bottom: 10px;\n }\n\n .onboarding-modal__page-four__columns .column-header {\n padding: 5px;\n font-size: 12px;\n }\n}\n\n.onboard-sliders {\n display: inline-block;\n max-width: 30px;\n max-height: auto;\n margin-left: 10px;\n}\n\n.boost-modal,\n.favourite-modal,\n.confirmation-modal,\n.report-modal,\n.actions-modal,\n.mute-modal,\n.block-modal {\n background: lighten($ui-secondary-color, 8%);\n color: $inverted-text-color;\n border-radius: 8px;\n overflow: hidden;\n max-width: 90vw;\n width: 480px;\n position: relative;\n flex-direction: column;\n\n .status__relative-time {\n color: $dark-text-color;\n float: right;\n font-size: 14px;\n width: auto;\n margin: initial;\n padding: initial;\n }\n\n .status__display-name {\n display: flex;\n }\n\n .status__avatar {\n height: 48px;\n width: 48px;\n }\n\n .status__content__spoiler-link {\n color: lighten($secondary-text-color, 8%);\n }\n}\n\n.actions-modal {\n .status {\n background: $white;\n border-bottom-color: $ui-secondary-color;\n padding-top: 10px;\n padding-bottom: 10px;\n }\n\n .dropdown-menu__separator {\n border-bottom-color: $ui-secondary-color;\n }\n}\n\n.boost-modal__container,\n.favourite-modal__container {\n overflow-x: scroll;\n padding: 10px;\n\n .status {\n user-select: text;\n border-bottom: 0;\n }\n}\n\n.boost-modal__action-bar,\n.favourite-modal__action-bar,\n.confirmation-modal__action-bar,\n.mute-modal__action-bar,\n.block-modal__action-bar {\n display: flex;\n justify-content: space-between;\n background: $ui-secondary-color;\n padding: 10px;\n line-height: 36px;\n\n & > div {\n flex: 1 1 auto;\n text-align: right;\n color: $lighter-text-color;\n padding-right: 10px;\n }\n\n .button {\n flex: 0 0 auto;\n }\n}\n\n.boost-modal__status-header,\n.favourite-modal__status-header {\n font-size: 15px;\n}\n\n.boost-modal__status-time,\n.favourite-modal__status-time {\n float: right;\n font-size: 14px;\n}\n\n.mute-modal,\n.block-modal {\n line-height: 24px;\n}\n\n.mute-modal .react-toggle,\n.block-modal .react-toggle {\n vertical-align: middle;\n}\n\n.report-modal {\n width: 90vw;\n max-width: 700px;\n}\n\n.report-modal__container {\n display: flex;\n border-top: 1px solid $ui-secondary-color;\n\n @media screen and (max-width: 480px) {\n flex-wrap: wrap;\n overflow-y: auto;\n }\n}\n\n.report-modal__statuses,\n.report-modal__comment {\n box-sizing: border-box;\n width: 50%;\n\n @media screen and (max-width: 480px) {\n width: 100%;\n }\n}\n\n.report-modal__statuses,\n.focal-point-modal__content {\n flex: 1 1 auto;\n min-height: 20vh;\n max-height: 80vh;\n overflow-y: auto;\n overflow-x: hidden;\n\n .status__content a {\n color: $highlight-text-color;\n }\n\n @media screen and (max-width: 480px) {\n max-height: 10vh;\n }\n}\n\n.focal-point-modal__content {\n @media screen and (max-width: 480px) {\n max-height: 40vh;\n }\n}\n\n.report-modal__comment {\n padding: 20px;\n border-right: 1px solid $ui-secondary-color;\n max-width: 320px;\n\n p {\n font-size: 14px;\n line-height: 20px;\n margin-bottom: 20px;\n }\n\n .setting-text {\n display: block;\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n color: $inverted-text-color;\n background: $white;\n padding: 10px;\n font-family: inherit;\n font-size: 14px;\n resize: none;\n border: 0;\n outline: 0;\n border-radius: 4px;\n border: 1px solid $ui-secondary-color;\n min-height: 100px;\n max-height: 50vh;\n margin-bottom: 10px;\n\n &:focus {\n border: 1px solid darken($ui-secondary-color, 8%);\n }\n\n &__wrapper {\n background: $white;\n border: 1px solid $ui-secondary-color;\n margin-bottom: 10px;\n border-radius: 4px;\n\n .setting-text {\n border: 0;\n margin-bottom: 0;\n border-radius: 0;\n\n &:focus {\n border: 0;\n }\n }\n\n &__modifiers {\n color: $inverted-text-color;\n font-family: inherit;\n font-size: 14px;\n background: $white;\n }\n }\n\n &__toolbar {\n display: flex;\n justify-content: space-between;\n margin-bottom: 20px;\n }\n }\n\n .setting-text-label {\n display: block;\n color: $inverted-text-color;\n font-size: 14px;\n font-weight: 500;\n margin-bottom: 10px;\n }\n\n .setting-toggle {\n margin-top: 20px;\n margin-bottom: 24px;\n\n &__label {\n color: $inverted-text-color;\n font-size: 14px;\n }\n }\n\n @media screen and (max-width: 480px) {\n padding: 10px;\n max-width: 100%;\n order: 2;\n\n .setting-toggle {\n margin-bottom: 4px;\n }\n }\n}\n\n.actions-modal {\n .status {\n overflow-y: auto;\n max-height: 300px;\n }\n\n strong {\n display: block;\n font-weight: 500;\n }\n\n max-height: 80vh;\n max-width: 80vw;\n\n .actions-modal__item-label {\n font-weight: 500;\n }\n\n ul {\n overflow-y: auto;\n flex-shrink: 0;\n max-height: 80vh;\n\n &.with-status {\n max-height: calc(80vh - 75px);\n }\n\n li:empty {\n margin: 0;\n }\n\n li:not(:empty) {\n a {\n color: $inverted-text-color;\n display: flex;\n padding: 12px 16px;\n font-size: 15px;\n align-items: center;\n text-decoration: none;\n\n &,\n button {\n transition: none;\n }\n\n &.active,\n &:hover,\n &:active,\n &:focus {\n &,\n button {\n background: $ui-highlight-color;\n color: $primary-text-color;\n }\n }\n\n & > .react-toggle,\n & > .icon,\n button:first-child {\n margin-right: 10px;\n }\n }\n }\n }\n}\n\n.confirmation-modal__action-bar,\n.mute-modal__action-bar,\n.block-modal__action-bar {\n .confirmation-modal__secondary-button {\n flex-shrink: 1;\n }\n}\n\n.confirmation-modal__secondary-button,\n.confirmation-modal__cancel-button,\n.mute-modal__cancel-button,\n.block-modal__cancel-button {\n background-color: transparent;\n color: $lighter-text-color;\n font-size: 14px;\n font-weight: 500;\n\n &:hover,\n &:focus,\n &:active {\n color: darken($lighter-text-color, 4%);\n background-color: transparent;\n }\n}\n\n.confirmation-modal__do_not_ask_again {\n padding-left: 20px;\n padding-right: 20px;\n padding-bottom: 10px;\n\n font-size: 14px;\n\n label, input {\n vertical-align: middle;\n }\n}\n\n.confirmation-modal__container,\n.mute-modal__container,\n.block-modal__container,\n.report-modal__target {\n padding: 30px;\n font-size: 16px;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n}\n\n.confirmation-modal__container,\n.report-modal__target {\n text-align: center;\n}\n\n.block-modal,\n.mute-modal {\n &__explanation {\n margin-top: 20px;\n }\n\n .setting-toggle {\n margin-top: 20px;\n margin-bottom: 24px;\n display: flex;\n align-items: center;\n\n &__label {\n color: $inverted-text-color;\n margin: 0;\n margin-left: 8px;\n }\n }\n}\n\n.report-modal__target {\n padding: 15px;\n\n .media-modal__close {\n top: 14px;\n right: 15px;\n }\n}\n\n.embed-modal {\n width: auto;\n max-width: 80vw;\n max-height: 80vh;\n\n h4 {\n padding: 30px;\n font-weight: 500;\n font-size: 16px;\n text-align: center;\n }\n\n .embed-modal__container {\n padding: 10px;\n\n .hint {\n margin-bottom: 15px;\n }\n\n .embed-modal__html {\n outline: 0;\n box-sizing: border-box;\n display: block;\n width: 100%;\n border: none;\n padding: 10px;\n font-family: 'mastodon-font-monospace', monospace;\n background: $ui-base-color;\n color: $primary-text-color;\n font-size: 14px;\n margin: 0;\n margin-bottom: 15px;\n border-radius: 4px;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n .embed-modal__iframe {\n width: 400px;\n max-width: 100%;\n overflow: hidden;\n border: 0;\n border-radius: 4px;\n }\n }\n}\n\n.focal-point {\n position: relative;\n cursor: move;\n overflow: hidden;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n background: $base-shadow-color;\n\n img,\n video,\n canvas {\n display: block;\n max-height: 80vh;\n width: 100%;\n height: auto;\n margin: 0;\n object-fit: contain;\n background: $base-shadow-color;\n }\n\n &__reticle {\n position: absolute;\n width: 100px;\n height: 100px;\n transform: translate(-50%, -50%);\n background: url('~images/reticle.png') no-repeat 0 0;\n border-radius: 50%;\n box-shadow: 0 0 0 9999em rgba($base-shadow-color, 0.35);\n }\n\n &__overlay {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n }\n\n &__preview {\n position: absolute;\n bottom: 10px;\n right: 10px;\n z-index: 2;\n cursor: move;\n transition: opacity 0.1s ease;\n\n &:hover {\n opacity: 0.5;\n }\n\n strong {\n color: $primary-text-color;\n font-size: 14px;\n font-weight: 500;\n display: block;\n margin-bottom: 5px;\n }\n\n div {\n border-radius: 4px;\n box-shadow: 0 0 14px rgba($base-shadow-color, 0.2);\n }\n }\n\n @media screen and (max-width: 480px) {\n img,\n video {\n max-height: 100%;\n }\n\n &__preview {\n display: none;\n }\n }\n}\n\n.filtered-status-info {\n text-align: start;\n\n .spoiler__text {\n margin-top: 20px;\n }\n\n .account {\n border-bottom: 0;\n }\n\n .account__display-name strong {\n color: $inverted-text-color;\n }\n\n .status__content__spoiler {\n display: none;\n\n &--visible {\n display: flex;\n }\n }\n\n ul {\n padding: 10px;\n margin-left: 12px;\n list-style: disc inside;\n }\n\n .filtered-status-edit-link {\n color: $action-button-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline\n }\n }\n}\n",".composer {\n padding: 10px;\n\n .emoji-picker-dropdown {\n position: absolute;\n top: 0;\n right: 0;\n\n ::-webkit-scrollbar-track:hover,\n ::-webkit-scrollbar-track:active {\n background-color: rgba($base-overlay-background, 0.3);\n }\n }\n}\n\n.character-counter {\n cursor: default;\n font-family: $font-sans-serif, sans-serif;\n font-size: 14px;\n font-weight: 600;\n color: $lighter-text-color;\n\n &.character-counter--over {\n color: $warning-red;\n }\n}\n\n.no-reduce-motion .composer--spoiler {\n transition: height 0.4s ease, opacity 0.4s ease;\n}\n\n.composer--spoiler {\n height: 0;\n transform-origin: bottom;\n opacity: 0.0;\n\n &.composer--spoiler--visible {\n height: 36px;\n margin-bottom: 11px;\n opacity: 1.0;\n }\n\n input {\n display: block;\n box-sizing: border-box;\n margin: 0;\n border: none;\n border-radius: 4px;\n padding: 10px;\n width: 100%;\n outline: 0;\n color: $inverted-text-color;\n background: $simple-background-color;\n font-size: 14px;\n font-family: inherit;\n resize: vertical;\n\n &::placeholder {\n color: $dark-text-color;\n }\n\n &:focus { outline: 0 }\n @include single-column('screen and (max-width: 630px)') { font-size: 16px }\n }\n}\n\n.composer--warning {\n color: $inverted-text-color;\n margin-bottom: 15px;\n background: $ui-primary-color;\n box-shadow: 0 2px 6px rgba($base-shadow-color, 0.3);\n padding: 8px 10px;\n border-radius: 4px;\n font-size: 13px;\n font-weight: 400;\n\n a {\n color: $lighter-text-color;\n font-weight: 500;\n text-decoration: underline;\n\n &:active,\n &:focus,\n &:hover { text-decoration: none }\n }\n}\n\n.compose-form__sensitive-button {\n padding: 10px;\n padding-top: 0;\n\n font-size: 14px;\n font-weight: 500;\n\n &.active {\n color: $highlight-text-color;\n }\n\n input[type=checkbox] {\n display: none;\n }\n\n .checkbox {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-left: 5px;\n margin-right: 10px;\n top: -1px;\n border-radius: 4px;\n vertical-align: middle;\n\n &.active {\n border-color: $highlight-text-color;\n background: $highlight-text-color;\n }\n }\n}\n\n.composer--reply {\n margin: 0 0 10px;\n border-radius: 4px;\n padding: 10px;\n background: $ui-primary-color;\n min-height: 23px;\n overflow-y: auto;\n flex: 0 2 auto;\n\n & > header {\n margin-bottom: 5px;\n overflow: hidden;\n\n & > .account.small { color: $inverted-text-color; }\n\n & > .cancel {\n float: right;\n line-height: 24px;\n }\n }\n\n & > .content {\n position: relative;\n margin: 10px 0;\n padding: 0 12px;\n font-size: 14px;\n line-height: 20px;\n color: $inverted-text-color;\n word-wrap: break-word;\n font-weight: 400;\n overflow: visible;\n white-space: pre-wrap;\n padding-top: 5px;\n overflow: hidden;\n\n p, pre, blockquote {\n margin-bottom: 20px;\n white-space: pre-wrap;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n h1, h2, h3, h4, h5 {\n margin-top: 20px;\n margin-bottom: 20px;\n }\n\n h1, h2 {\n font-weight: 700;\n font-size: 18px;\n }\n\n h2 {\n font-size: 16px;\n }\n\n h3, h4, h5 {\n font-weight: 500;\n }\n\n blockquote {\n padding-left: 10px;\n border-left: 3px solid $inverted-text-color;\n color: $inverted-text-color;\n white-space: normal;\n\n p:last-child {\n margin-bottom: 0;\n }\n }\n\n b, strong {\n font-weight: 700;\n }\n\n em, i {\n font-style: italic;\n }\n\n sub {\n font-size: smaller;\n text-align: sub;\n }\n\n ul, ol {\n margin-left: 1em;\n\n p {\n margin: 0;\n }\n }\n\n ul {\n list-style-type: disc;\n }\n\n ol {\n list-style-type: decimal;\n }\n\n a {\n color: $lighter-text-color;\n text-decoration: none;\n\n &:hover { text-decoration: underline }\n\n &.mention {\n &:hover {\n text-decoration: none;\n\n span { text-decoration: underline }\n }\n }\n }\n }\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -5px 0 0;\n }\n}\n\n.compose-form__autosuggest-wrapper,\n.autosuggest-input {\n position: relative;\n width: 100%;\n\n label {\n .autosuggest-textarea__textarea {\n display: block;\n box-sizing: border-box;\n margin: 0;\n border: none;\n border-radius: 4px 4px 0 0;\n padding: 10px 32px 0 10px;\n width: 100%;\n min-height: 100px;\n outline: 0;\n color: $inverted-text-color;\n background: $simple-background-color;\n font-size: 14px;\n font-family: inherit;\n resize: none;\n scrollbar-color: initial;\n\n &::placeholder {\n color: $dark-text-color;\n }\n\n &::-webkit-scrollbar {\n all: unset;\n }\n\n &:disabled { background: $ui-secondary-color }\n &:focus { outline: 0 }\n @include single-column('screen and (max-width: 630px)') { font-size: 16px }\n\n @include limited-single-column('screen and (max-width: 600px)') {\n height: 100px !important; // prevent auto-resize textarea\n resize: vertical;\n }\n }\n }\n}\n\n.composer--textarea--icons {\n display: block;\n position: absolute;\n top: 29px;\n right: 5px;\n bottom: 5px;\n overflow: hidden;\n\n & > .textarea_icon {\n display: block;\n margin: 2px 0 0 2px;\n width: 24px;\n height: 24px;\n color: $lighter-text-color;\n font-size: 18px;\n line-height: 24px;\n text-align: center;\n opacity: .8;\n }\n}\n\n.autosuggest-textarea__suggestions-wrapper {\n position: relative;\n height: 0;\n}\n\n.autosuggest-textarea__suggestions {\n display: block;\n position: absolute;\n box-sizing: border-box;\n top: 100%;\n border-radius: 0 0 4px 4px;\n padding: 6px;\n width: 100%;\n color: $inverted-text-color;\n background: $ui-secondary-color;\n box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4);\n font-size: 14px;\n z-index: 99;\n display: none;\n}\n\n.autosuggest-textarea__suggestions--visible {\n display: block;\n}\n\n.autosuggest-textarea__suggestions__item {\n padding: 10px;\n cursor: pointer;\n border-radius: 4px;\n\n &:hover,\n &:focus,\n &:active,\n &.selected { background: darken($ui-secondary-color, 10%) }\n\n > .account,\n > .emoji,\n > .autosuggest-hashtag {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: flex-start;\n line-height: 18px;\n font-size: 14px;\n }\n\n .autosuggest-hashtag {\n justify-content: space-between;\n\n &__name {\n flex: 1 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n strong {\n font-weight: 500;\n }\n\n &__uses {\n flex: 0 0 auto;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n }\n\n & > .account.small {\n .display-name {\n & > span { color: $lighter-text-color }\n }\n }\n}\n\n.composer--upload_form {\n overflow: hidden;\n\n & > .content {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n font-family: inherit;\n padding: 5px;\n overflow: hidden;\n }\n}\n\n.composer--upload_form--item {\n flex: 1 1 0;\n margin: 5px;\n min-width: 40%;\n\n & > div {\n position: relative;\n border-radius: 4px;\n height: 140px;\n width: 100%;\n background-color: $base-shadow-color;\n background-position: center;\n background-size: cover;\n background-repeat: no-repeat;\n overflow: hidden;\n\n textarea {\n display: block;\n position: absolute;\n box-sizing: border-box;\n bottom: 0;\n left: 0;\n margin: 0;\n border: 0;\n padding: 10px;\n width: 100%;\n color: $secondary-text-color;\n background: linear-gradient(0deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);\n font-size: 14px;\n font-family: inherit;\n font-weight: 500;\n opacity: 0;\n z-index: 2;\n transition: opacity .1s ease;\n\n &:focus { color: $white }\n\n &::placeholder {\n opacity: 0.54;\n color: $secondary-text-color;\n }\n }\n\n & > .close { mix-blend-mode: difference }\n }\n\n &.active {\n & > div {\n textarea { opacity: 1 }\n }\n }\n}\n\n.composer--upload_form--actions {\n background: linear-gradient(180deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n opacity: 0;\n transition: opacity .1s ease;\n\n .icon-button {\n flex: 0 1 auto;\n color: $ui-secondary-color;\n font-size: 14px;\n font-weight: 500;\n padding: 10px;\n font-family: inherit;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($ui-secondary-color, 4%);\n }\n }\n\n &.active {\n opacity: 1;\n }\n}\n\n.composer--upload_form--progress {\n display: flex;\n padding: 10px;\n color: $darker-text-color;\n overflow: hidden;\n\n & > .fa {\n font-size: 34px;\n margin-right: 10px;\n }\n\n & > .message {\n flex: 1 1 auto;\n\n & > span {\n display: block;\n font-size: 12px;\n font-weight: 500;\n text-transform: uppercase;\n }\n\n & > .backdrop {\n position: relative;\n margin-top: 5px;\n border-radius: 6px;\n width: 100%;\n height: 6px;\n background: $ui-base-lighter-color;\n\n & > .tracker {\n position: absolute;\n top: 0;\n left: 0;\n height: 6px;\n border-radius: 6px;\n background: $ui-highlight-color;\n }\n }\n }\n}\n\n.compose-form__modifiers {\n color: $inverted-text-color;\n font-family: inherit;\n font-size: 14px;\n background: $simple-background-color;\n}\n\n.composer--options-wrapper {\n padding: 10px;\n background: darken($simple-background-color, 8%);\n border-radius: 0 0 4px 4px;\n height: 27px;\n display: flex;\n justify-content: space-between;\n flex: 0 0 auto;\n}\n\n.composer--options {\n display: flex;\n flex: 0 0 auto;\n\n & > * {\n display: inline-block;\n box-sizing: content-box;\n padding: 0 3px;\n height: 27px;\n line-height: 27px;\n vertical-align: bottom;\n }\n\n & > hr {\n display: inline-block;\n margin: 0 3px;\n border-width: 0 0 0 1px;\n border-style: none none none solid;\n border-color: transparent transparent transparent darken($simple-background-color, 24%);\n padding: 0;\n width: 0;\n height: 27px;\n background: transparent;\n }\n}\n\n.compose--counter-wrapper {\n align-self: center;\n margin-right: 4px;\n}\n\n.composer--options--dropdown {\n &.open {\n & > .value {\n border-radius: 4px 4px 0 0;\n box-shadow: 0 -4px 4px rgba($base-shadow-color, 0.1);\n color: $primary-text-color;\n background: $ui-highlight-color;\n transition: none;\n }\n &.top {\n & > .value {\n border-radius: 0 0 4px 4px;\n box-shadow: 0 4px 4px rgba($base-shadow-color, 0.1);\n }\n }\n }\n}\n\n.composer--options--dropdown--content {\n position: absolute;\n border-radius: 4px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n background: $simple-background-color;\n overflow: hidden;\n transform-origin: 50% 0;\n}\n\n.composer--options--dropdown--content--item {\n display: flex;\n align-items: center;\n padding: 10px;\n color: $inverted-text-color;\n cursor: pointer;\n\n & > .content {\n flex: 1 1 auto;\n color: $lighter-text-color;\n\n &:not(:first-child) { margin-left: 10px }\n\n strong {\n display: block;\n color: $inverted-text-color;\n font-weight: 500;\n }\n }\n\n &:hover,\n &.active {\n background: $ui-highlight-color;\n color: $primary-text-color;\n\n & > .content {\n color: $primary-text-color;\n\n strong { color: $primary-text-color }\n }\n }\n\n &.active:hover { background: lighten($ui-highlight-color, 4%) }\n}\n\n.composer--publisher {\n padding-top: 10px;\n text-align: right;\n white-space: nowrap;\n overflow: hidden;\n justify-content: flex-end;\n flex: 0 0 auto;\n\n & > .primary {\n display: inline-block;\n margin: 0;\n padding: 0 10px;\n text-align: center;\n }\n\n & > .side_arm {\n display: inline-block;\n margin: 0 2px;\n padding: 0;\n width: 36px;\n text-align: center;\n }\n\n &.over {\n & > .count { color: $warning-red }\n }\n}\n",".column__wrapper {\n display: flex;\n flex: 1 1 auto;\n position: relative;\n}\n\n.columns-area {\n display: flex;\n flex: 1 1 auto;\n flex-direction: row;\n justify-content: flex-start;\n overflow-x: auto;\n position: relative;\n\n &__panels {\n display: flex;\n justify-content: center;\n width: 100%;\n height: 100%;\n min-height: 100vh;\n\n &__pane {\n height: 100%;\n overflow: hidden;\n pointer-events: none;\n display: flex;\n justify-content: flex-end;\n min-width: 285px;\n\n &--start {\n justify-content: flex-start;\n }\n\n &__inner {\n position: fixed;\n width: 285px;\n pointer-events: auto;\n height: 100%;\n }\n }\n\n &__main {\n box-sizing: border-box;\n width: 100%;\n max-width: 600px;\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding: 0 10px;\n }\n }\n }\n}\n\n.tabs-bar__wrapper {\n background: darken($ui-base-color, 8%);\n position: sticky;\n top: 0;\n z-index: 2;\n padding-top: 0;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding-top: 10px;\n }\n\n .tabs-bar {\n margin-bottom: 0;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n margin-bottom: 10px;\n }\n }\n}\n\n.react-swipeable-view-container {\n &,\n .columns-area,\n .column {\n height: 100%;\n }\n}\n\n.react-swipeable-view-container > * {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n}\n\n.column {\n width: 330px;\n position: relative;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n\n > .scrollable {\n background: $ui-base-color;\n }\n}\n\n.ui {\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n}\n\n.column {\n overflow: hidden;\n}\n\n.column-back-button {\n box-sizing: border-box;\n width: 100%;\n background: lighten($ui-base-color, 4%);\n color: $highlight-text-color;\n cursor: pointer;\n flex: 0 0 auto;\n font-size: 16px;\n border: 0;\n text-align: unset;\n padding: 15px;\n margin: 0;\n z-index: 3;\n\n &:hover {\n text-decoration: underline;\n }\n}\n\n.column-header__back-button {\n background: lighten($ui-base-color, 4%);\n border: 0;\n font-family: inherit;\n color: $highlight-text-color;\n cursor: pointer;\n flex: 0 0 auto;\n font-size: 16px;\n padding: 0 5px 0 0;\n z-index: 3;\n\n &:hover {\n text-decoration: underline;\n }\n\n &:last-child {\n padding: 0 15px 0 0;\n }\n}\n\n.column-back-button__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.column-back-button--slim {\n position: relative;\n}\n\n.column-back-button--slim-button {\n cursor: pointer;\n flex: 0 0 auto;\n font-size: 16px;\n padding: 15px;\n position: absolute;\n right: 0;\n top: -48px;\n}\n\n.column-link {\n background: lighten($ui-base-color, 8%);\n color: $primary-text-color;\n display: block;\n font-size: 16px;\n padding: 15px;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 11%);\n }\n\n &:focus {\n outline: 0;\n }\n\n &--transparent {\n background: transparent;\n color: $ui-secondary-color;\n\n &:hover,\n &:focus,\n &:active {\n background: transparent;\n color: $primary-text-color;\n }\n\n &.active {\n color: $ui-highlight-color;\n }\n }\n}\n\n.column-link__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.column-subheading {\n background: $ui-base-color;\n color: $dark-text-color;\n padding: 8px 20px;\n font-size: 12px;\n font-weight: 500;\n text-transform: uppercase;\n cursor: default;\n}\n\n.column-header__wrapper {\n position: relative;\n flex: 0 0 auto;\n z-index: 1;\n\n &.active {\n box-shadow: 0 1px 0 rgba($highlight-text-color, 0.3);\n\n &::before {\n display: block;\n content: \"\";\n position: absolute;\n bottom: -13px;\n left: 0;\n right: 0;\n margin: 0 auto;\n width: 60%;\n pointer-events: none;\n height: 28px;\n z-index: 1;\n background: radial-gradient(ellipse, rgba($ui-highlight-color, 0.23) 0%, rgba($ui-highlight-color, 0) 60%);\n }\n }\n\n .announcements {\n z-index: 1;\n position: relative;\n }\n}\n\n.column-header {\n display: flex;\n font-size: 16px;\n background: lighten($ui-base-color, 4%);\n flex: 0 0 auto;\n cursor: pointer;\n position: relative;\n z-index: 2;\n outline: 0;\n overflow: hidden;\n\n & > button {\n margin: 0;\n border: none;\n padding: 15px;\n color: inherit;\n background: transparent;\n font: inherit;\n text-align: left;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n flex: 1;\n }\n\n & > .column-header__back-button {\n color: $highlight-text-color;\n }\n\n &.active {\n .column-header__icon {\n color: $highlight-text-color;\n text-shadow: 0 0 10px rgba($ui-highlight-color, 0.4);\n }\n }\n\n &:focus,\n &:active {\n outline: 0;\n }\n}\n\n.column {\n width: 330px;\n position: relative;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n\n .wide .columns-area:not(.columns-area--mobile) & {\n flex: auto;\n min-width: 330px;\n max-width: 400px;\n }\n\n > .scrollable {\n background: $ui-base-color;\n }\n}\n\n.column-header__buttons {\n height: 48px;\n display: flex;\n margin-left: 0;\n}\n\n.column-header__links {\n margin-bottom: 14px;\n}\n\n.column-header__links .text-btn {\n margin-right: 10px;\n}\n\n.column-header__button {\n background: lighten($ui-base-color, 4%);\n border: 0;\n color: $darker-text-color;\n cursor: pointer;\n font-size: 16px;\n padding: 0 15px;\n\n &:hover {\n color: lighten($darker-text-color, 7%);\n }\n\n &.active {\n color: $primary-text-color;\n background: lighten($ui-base-color, 8%);\n\n &:hover {\n color: $primary-text-color;\n background: lighten($ui-base-color, 8%);\n }\n }\n\n // glitch - added focus ring for keyboard navigation\n &:focus {\n text-shadow: 0 0 4px darken($ui-highlight-color, 5%);\n }\n}\n\n.column-header__notif-cleaning-buttons {\n display: flex;\n align-items: stretch;\n justify-content: space-around;\n\n button {\n @extend .column-header__button;\n background: transparent;\n text-align: center;\n padding: 10px 0;\n white-space: pre-wrap;\n }\n\n b {\n font-weight: bold;\n }\n}\n\n// The notifs drawer with no padding to have more space for the buttons\n.column-header__collapsible-inner.nopad-drawer {\n padding: 0;\n}\n\n.column-header__collapsible {\n max-height: 70vh;\n overflow: hidden;\n overflow-y: auto;\n color: $darker-text-color;\n transition: max-height 150ms ease-in-out, opacity 300ms linear;\n opacity: 1;\n z-index: 1;\n position: relative;\n\n &.collapsed {\n max-height: 0;\n opacity: 0.5;\n }\n\n &.animating {\n overflow-y: hidden;\n }\n\n hr {\n height: 0;\n background: transparent;\n border: 0;\n border-top: 1px solid lighten($ui-base-color, 12%);\n margin: 10px 0;\n }\n\n // notif cleaning drawer\n &.ncd {\n transition: none;\n &.collapsed {\n max-height: 0;\n opacity: 0.7;\n }\n }\n}\n\n.column-header__collapsible-inner {\n background: lighten($ui-base-color, 8%);\n padding: 15px;\n}\n\n.column-header__setting-btn {\n &:hover {\n color: $darker-text-color;\n text-decoration: underline;\n }\n}\n\n.column-header__setting-arrows {\n float: right;\n\n .column-header__setting-btn {\n padding: 0 10px;\n\n &:last-child {\n padding-right: 0;\n }\n }\n}\n\n.column-header__title {\n display: inline-block;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n flex: 1;\n}\n\n.column-header__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.empty-column-indicator,\n.error-column,\n.follow_requests-unlocked_explanation {\n color: $dark-text-color;\n background: $ui-base-color;\n text-align: center;\n padding: 20px;\n font-size: 15px;\n font-weight: 400;\n cursor: default;\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n justify-content: center;\n @supports(display: grid) { // hack to fix Chrome <57\n contain: strict;\n }\n\n & > span {\n max-width: 400px;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.follow_requests-unlocked_explanation {\n background: darken($ui-base-color, 4%);\n contain: initial;\n}\n\n.error-column {\n flex-direction: column;\n}\n\n// more fixes for the navbar-under mode\n@mixin fix-margins-for-navbar-under {\n .tabs-bar {\n margin-top: 0 !important;\n margin-bottom: -6px !important;\n }\n}\n\n.single-column.navbar-under {\n @include fix-margins-for-navbar-under;\n}\n\n.auto-columns.navbar-under {\n @media screen and (max-width: $no-gap-breakpoint) {\n @include fix-margins-for-navbar-under;\n }\n}\n\n.auto-columns.navbar-under .react-swipeable-view-container .columns-area,\n.single-column.navbar-under .react-swipeable-view-container .columns-area {\n @media screen and (max-width: $no-gap-breakpoint) {\n height: 100% !important;\n }\n}\n\n.column-inline-form {\n padding: 7px 15px;\n padding-right: 5px;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n\n label {\n flex: 1 1 auto;\n\n input {\n width: 100%;\n margin-bottom: 6px;\n\n &:focus {\n outline: 0;\n }\n }\n }\n\n .icon-button {\n flex: 0 0 auto;\n margin: 0 5px;\n }\n}\n",".regeneration-indicator {\n text-align: center;\n font-size: 16px;\n font-weight: 500;\n color: $dark-text-color;\n background: $ui-base-color;\n cursor: default;\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 20px;\n\n &__figure {\n &,\n img {\n display: block;\n width: auto;\n height: 160px;\n margin: 0;\n }\n }\n\n &--without-header {\n padding-top: 20px + 48px;\n }\n\n &__label {\n margin-top: 30px;\n\n strong {\n display: block;\n margin-bottom: 10px;\n color: $dark-text-color;\n }\n\n span {\n font-size: 15px;\n font-weight: 400;\n }\n }\n}\n",".directory {\n &__list {\n width: 100%;\n margin: 10px 0;\n transition: opacity 100ms ease-in;\n\n &.loading {\n opacity: 0.7;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin: 0;\n }\n }\n\n &__card {\n box-sizing: border-box;\n margin-bottom: 10px;\n\n &__img {\n height: 125px;\n position: relative;\n background: darken($ui-base-color, 12%);\n overflow: hidden;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n object-fit: cover;\n }\n }\n\n &__bar {\n display: flex;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n padding: 10px;\n\n &__name {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n text-decoration: none;\n overflow: hidden;\n }\n\n &__relationship {\n width: 23px;\n min-height: 1px;\n flex: 0 0 auto;\n }\n\n .avatar {\n flex: 0 0 auto;\n width: 48px;\n height: 48px;\n padding-top: 2px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n background: darken($ui-base-color, 8%);\n object-fit: cover;\n }\n }\n\n .display-name {\n margin-left: 15px;\n text-align: left;\n\n strong {\n font-size: 15px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n span {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n &__extra {\n background: $ui-base-color;\n display: flex;\n align-items: center;\n justify-content: center;\n\n .accounts-table__count {\n width: 33.33%;\n flex: 0 0 auto;\n padding: 15px 0;\n }\n\n .account__header__content {\n box-sizing: border-box;\n padding: 15px 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n width: 100%;\n min-height: 18px + 30px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n p {\n display: none;\n\n &:first-child {\n display: inline;\n }\n }\n\n br {\n display: none;\n }\n }\n }\n }\n}\n\n.filter-form {\n background: $ui-base-color;\n\n &__column {\n padding: 10px 15px;\n }\n\n .radio-button {\n display: block;\n }\n}\n\n.radio-button {\n font-size: 14px;\n position: relative;\n display: inline-block;\n padding: 6px 0;\n line-height: 18px;\n cursor: default;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n cursor: pointer;\n\n input[type=radio],\n input[type=checkbox] {\n display: none;\n }\n\n &__input {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 50%;\n vertical-align: middle;\n\n &.checked {\n border-color: lighten($ui-highlight-color, 8%);\n background: lighten($ui-highlight-color, 8%);\n }\n }\n}\n",".search {\n position: relative;\n}\n\n.search__input {\n @include search-input();\n\n display: block;\n padding: 15px;\n padding-right: 30px;\n line-height: 18px;\n font-size: 16px;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n}\n\n.search__icon {\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus {\n outline: 0 !important;\n }\n\n .fa {\n position: absolute;\n top: 16px;\n right: 10px;\n z-index: 2;\n display: inline-block;\n opacity: 0;\n transition: all 100ms linear;\n transition-property: color, transform, opacity;\n font-size: 18px;\n width: 18px;\n height: 18px;\n color: $secondary-text-color;\n cursor: default;\n pointer-events: none;\n\n &.active {\n pointer-events: auto;\n opacity: 0.3;\n }\n }\n\n .fa-search {\n transform: rotate(0deg);\n\n &.active {\n pointer-events: auto;\n opacity: 0.3;\n }\n }\n\n .fa-times-circle {\n top: 17px;\n transform: rotate(0deg);\n color: $action-button-color;\n cursor: pointer;\n\n &.active {\n transform: rotate(90deg);\n }\n\n &:hover {\n color: lighten($action-button-color, 7%);\n }\n }\n}\n\n.search-results__header {\n color: $dark-text-color;\n background: lighten($ui-base-color, 2%);\n border-bottom: 1px solid darken($ui-base-color, 4%);\n padding: 15px 10px;\n font-size: 14px;\n font-weight: 500;\n}\n\n.search-results__info {\n padding: 20px;\n color: $darker-text-color;\n text-align: center;\n}\n\n.trends {\n &__header {\n color: $dark-text-color;\n background: lighten($ui-base-color, 2%);\n border-bottom: 1px solid darken($ui-base-color, 4%);\n font-weight: 500;\n padding: 15px;\n font-size: 16px;\n cursor: default;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n &__item {\n display: flex;\n align-items: center;\n padding: 15px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &:last-child {\n border-bottom: 0;\n }\n\n &__name {\n flex: 1 1 auto;\n color: $dark-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n strong {\n font-weight: 500;\n }\n\n a {\n color: $darker-text-color;\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:hover,\n &:focus,\n &:active {\n span {\n text-decoration: underline;\n }\n }\n }\n }\n\n &__current {\n flex: 0 0 auto;\n font-size: 24px;\n line-height: 36px;\n font-weight: 500;\n text-align: right;\n padding-right: 15px;\n margin-left: 5px;\n color: $secondary-text-color;\n }\n\n &__sparkline {\n flex: 0 0 auto;\n width: 50px;\n\n path:first-child {\n fill: rgba($highlight-text-color, 0.25) !important;\n fill-opacity: 1 !important;\n }\n\n path:last-child {\n stroke: lighten($highlight-text-color, 6%) !important;\n }\n }\n }\n}\n",null,".emojione {\n font-size: inherit;\n vertical-align: middle;\n object-fit: contain;\n margin: -.2ex .15em .2ex;\n width: 16px;\n height: 16px;\n\n img {\n width: auto;\n }\n}\n\n.emoji-picker-dropdown__menu {\n background: $simple-background-color;\n position: absolute;\n box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n margin-top: 5px;\n z-index: 2;\n\n .emoji-mart-scroll {\n transition: opacity 200ms ease;\n }\n\n &.selecting .emoji-mart-scroll {\n opacity: 0.5;\n }\n}\n\n.emoji-picker-dropdown__modifiers {\n position: absolute;\n top: 60px;\n right: 11px;\n cursor: pointer;\n}\n\n.emoji-picker-dropdown__modifiers__menu {\n position: absolute;\n z-index: 4;\n top: -4px;\n left: -8px;\n background: $simple-background-color;\n border-radius: 4px;\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n overflow: hidden;\n\n button {\n display: block;\n cursor: pointer;\n border: 0;\n padding: 4px 8px;\n background: transparent;\n\n &:hover,\n &:focus,\n &:active {\n background: rgba($ui-secondary-color, 0.4);\n }\n }\n\n .emoji-mart-emoji {\n height: 22px;\n }\n}\n\n.emoji-mart-emoji {\n span {\n background-repeat: no-repeat;\n }\n}\n\n.emoji-button {\n display: block;\n padding: 5px 5px 2px 2px;\n outline: 0;\n cursor: pointer;\n\n &:active,\n &:focus {\n outline: 0 !important;\n }\n\n img {\n filter: grayscale(100%);\n opacity: 0.8;\n display: block;\n margin: 0;\n width: 22px;\n height: 22px;\n }\n\n &:hover,\n &:active,\n &:focus {\n img {\n opacity: 1;\n filter: none;\n }\n }\n}\n","$doodleBg: #d9e1e8;\n.doodle-modal {\n @extend .boost-modal;\n width: unset;\n}\n\n.doodle-modal__container {\n background: $doodleBg;\n text-align: center;\n line-height: 0; // remove weird gap under canvas\n canvas {\n border: 5px solid $doodleBg;\n }\n}\n\n.doodle-modal__action-bar {\n @extend .boost-modal__action-bar;\n\n .filler {\n flex-grow: 1;\n margin: 0;\n padding: 0;\n }\n\n .doodle-toolbar {\n line-height: 1;\n\n display: flex;\n flex-direction: column;\n flex-grow: 0;\n justify-content: space-around;\n\n &.with-inputs {\n label {\n display: inline-block;\n width: 70px;\n text-align: right;\n margin-right: 2px;\n }\n\n input[type=\"number\"],input[type=\"text\"] {\n width: 40px;\n }\n span.val {\n display: inline-block;\n text-align: left;\n width: 50px;\n }\n }\n }\n\n .doodle-palette {\n padding-right: 0 !important;\n border: 1px solid black;\n line-height: .2rem;\n flex-grow: 0;\n background: white;\n\n button {\n appearance: none;\n width: 1rem;\n height: 1rem;\n margin: 0; padding: 0;\n text-align: center;\n color: black;\n text-shadow: 0 0 1px white;\n cursor: pointer;\n box-shadow: inset 0 0 1px rgba(white, .5);\n border: 1px solid black;\n outline-offset:-1px;\n\n &.foreground {\n outline: 1px dashed white;\n }\n\n &.background {\n outline: 1px dashed red;\n }\n\n &.foreground.background {\n outline: 1px dashed red;\n border-color: white;\n }\n }\n }\n}\n",".drawer {\n width: 300px;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n overflow-y: hidden;\n padding: 10px 5px;\n flex: none;\n\n &:first-child {\n padding-left: 10px;\n }\n\n &:last-child {\n padding-right: 10px;\n }\n\n @include single-column('screen and (max-width: 630px)') { flex: auto }\n\n @include limited-single-column('screen and (max-width: 630px)') {\n &, &:first-child, &:last-child { padding: 0 }\n }\n\n .wide & {\n min-width: 300px;\n max-width: 400px;\n flex: 1 1 200px;\n }\n\n @include single-column('screen and (max-width: 630px)') {\n :root & { // Overrides `.wide` for single-column view\n flex: auto;\n width: 100%;\n min-width: 0;\n max-width: none;\n padding: 0;\n }\n }\n\n .react-swipeable-view-container & { height: 100% }\n}\n\n.drawer--header {\n display: flex;\n flex-direction: row;\n margin-bottom: 10px;\n flex: none;\n background: lighten($ui-base-color, 8%);\n font-size: 16px;\n\n & > * {\n display: block;\n box-sizing: border-box;\n border-bottom: 2px solid transparent;\n padding: 15px 5px 13px;\n height: 48px;\n flex: 1 1 auto;\n color: $darker-text-color;\n text-align: center;\n text-decoration: none;\n cursor: pointer;\n }\n\n a {\n transition: background 100ms ease-in;\n\n &:focus,\n &:hover {\n outline: none;\n background: lighten($ui-base-color, 3%);\n transition: background 200ms ease-out;\n }\n }\n}\n\n.search {\n position: relative;\n margin-bottom: 10px;\n flex: none;\n\n @include limited-single-column('screen and (max-width: #{$no-gap-breakpoint})') { margin-bottom: 0 }\n @include single-column('screen and (max-width: 630px)') { font-size: 16px }\n}\n\n.search-popout {\n @include search-popout();\n}\n\n.drawer--account {\n padding: 10px;\n color: $darker-text-color;\n display: flex;\n align-items: center;\n\n a {\n color: inherit;\n text-decoration: none;\n }\n\n .acct {\n display: block;\n color: $secondary-text-color;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.navigation-bar__profile {\n flex: 1 1 auto;\n margin-left: 8px;\n overflow: hidden;\n}\n\n.drawer--results {\n background: $ui-base-color;\n overflow-x: hidden;\n overflow-y: auto;\n\n & > header {\n color: $dark-text-color;\n background: lighten($ui-base-color, 2%);\n padding: 15px;\n font-weight: 500;\n font-size: 16px;\n cursor: default;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n & > section {\n margin-bottom: 5px;\n\n h5 {\n background: darken($ui-base-color, 4%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n display: flex;\n padding: 15px;\n font-weight: 500;\n font-size: 16px;\n color: $dark-text-color;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n .account:last-child,\n & > div:last-child .status {\n border-bottom: 0;\n }\n\n & > .hashtag {\n display: block;\n padding: 10px;\n color: $secondary-text-color;\n text-decoration: none;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($secondary-text-color, 4%);\n text-decoration: underline;\n }\n }\n }\n}\n\n.drawer__pager {\n box-sizing: border-box;\n padding: 0;\n flex-grow: 1;\n position: relative;\n overflow: hidden;\n display: flex;\n}\n\n.drawer__inner {\n position: absolute;\n top: 0;\n left: 0;\n background: lighten($ui-base-color, 13%);\n box-sizing: border-box;\n padding: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n overflow-y: auto;\n width: 100%;\n height: 100%;\n\n &.darker {\n background: $ui-base-color;\n }\n}\n\n.drawer__inner__mastodon {\n background: lighten($ui-base-color, 13%) url('data:image/svg+xml;utf8,') no-repeat bottom / 100% auto;\n flex: 1;\n min-height: 47px;\n display: none;\n\n > img {\n display: block;\n object-fit: contain;\n object-position: bottom left;\n width: 85%;\n height: 100%;\n pointer-events: none;\n user-drag: none;\n user-select: none;\n }\n\n > .mastodon {\n display: block;\n width: 100%;\n height: 100%;\n border: none;\n cursor: inherit;\n }\n\n @media screen and (min-height: 640px) {\n display: block;\n }\n}\n\n.pseudo-drawer {\n background: lighten($ui-base-color, 13%);\n font-size: 13px;\n text-align: left;\n}\n\n.drawer__backdrop {\n cursor: pointer;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba($base-overlay-background, 0.5);\n}\n",".video-error-cover {\n align-items: center;\n background: $base-overlay-background;\n color: $primary-text-color;\n cursor: pointer;\n display: flex;\n flex-direction: column;\n height: 100%;\n justify-content: center;\n margin-top: 8px;\n position: relative;\n text-align: center;\n z-index: 100;\n}\n\n.media-spoiler {\n background: $base-overlay-background;\n color: $darker-text-color;\n border: 0;\n width: 100%;\n height: 100%;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($darker-text-color, 8%);\n }\n\n .status__content > & {\n margin-top: 15px; // Add margin when used bare for NSFW video player\n }\n @include fullwidth-gallery;\n}\n\n.media-spoiler__warning {\n display: block;\n font-size: 14px;\n}\n\n.media-spoiler__trigger {\n display: block;\n font-size: 11px;\n font-weight: 500;\n}\n\n.media-gallery__gifv__label {\n display: block;\n position: absolute;\n color: $primary-text-color;\n background: rgba($base-overlay-background, 0.5);\n bottom: 6px;\n left: 6px;\n padding: 2px 6px;\n border-radius: 2px;\n font-size: 11px;\n font-weight: 600;\n z-index: 1;\n pointer-events: none;\n opacity: 0.9;\n transition: opacity 0.1s ease;\n line-height: 18px;\n}\n\n.media-gallery__gifv {\n &:hover {\n .media-gallery__gifv__label {\n opacity: 1;\n }\n }\n}\n\n.media-gallery__audio {\n height: 100%;\n display: flex;\n flex-direction: column;\n\n span {\n text-align: center;\n color: $darker-text-color;\n display: flex;\n height: 100%;\n align-items: center;\n\n p {\n width: 100%;\n }\n }\n\n audio {\n width: 100%;\n }\n}\n\n.media-gallery {\n box-sizing: border-box;\n margin-top: 8px;\n overflow: hidden;\n border-radius: 4px;\n position: relative;\n width: 100%;\n height: 110px;\n\n @include fullwidth-gallery;\n}\n\n.media-gallery__item {\n border: none;\n box-sizing: border-box;\n display: block;\n float: left;\n position: relative;\n border-radius: 4px;\n overflow: hidden;\n\n .full-width & {\n border-radius: 0;\n }\n\n &.standalone {\n .media-gallery__item-gifv-thumbnail {\n transform: none;\n top: 0;\n }\n }\n\n &.letterbox {\n background: $base-shadow-color;\n }\n}\n\n.media-gallery__item-thumbnail {\n cursor: zoom-in;\n display: block;\n text-decoration: none;\n color: $secondary-text-color;\n position: relative;\n z-index: 1;\n\n &,\n img {\n height: 100%;\n width: 100%;\n object-fit: contain;\n\n &:not(.letterbox) {\n height: 100%;\n object-fit: cover;\n }\n }\n}\n\n.media-gallery__preview {\n width: 100%;\n height: 100%;\n object-fit: cover;\n position: absolute;\n top: 0;\n left: 0;\n z-index: 0;\n background: $base-overlay-background;\n\n &--hidden {\n display: none;\n }\n}\n\n.media-gallery__gifv {\n height: 100%;\n overflow: hidden;\n position: relative;\n width: 100%;\n display: flex;\n justify-content: center;\n}\n\n.media-gallery__item-gifv-thumbnail {\n cursor: zoom-in;\n height: 100%;\n width: 100%;\n position: relative;\n z-index: 1;\n object-fit: contain;\n user-select: none;\n\n &:not(.letterbox) {\n height: 100%;\n object-fit: cover;\n }\n}\n\n.media-gallery__item-thumbnail-label {\n clip: rect(1px 1px 1px 1px); /* IE6, IE7 */\n clip: rect(1px, 1px, 1px, 1px);\n overflow: hidden;\n position: absolute;\n}\n\n.video-modal__container {\n max-width: 100vw;\n max-height: 100vh;\n}\n\n.audio-modal__container {\n width: 50vw;\n}\n\n.media-modal {\n width: 100%;\n height: 100%;\n position: relative;\n\n .extended-video-player {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n video {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n }\n }\n}\n\n.media-modal__closer {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n}\n\n.media-modal__navigation {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n transition: opacity 0.3s linear;\n will-change: opacity;\n\n * {\n pointer-events: auto;\n }\n\n &.media-modal__navigation--hidden {\n opacity: 0;\n\n * {\n pointer-events: none;\n }\n }\n}\n\n.media-modal__nav {\n background: rgba($base-overlay-background, 0.5);\n box-sizing: border-box;\n border: 0;\n color: $primary-text-color;\n cursor: pointer;\n display: flex;\n align-items: center;\n font-size: 24px;\n height: 20vmax;\n margin: auto 0;\n padding: 30px 15px;\n position: absolute;\n top: 0;\n bottom: 0;\n}\n\n.media-modal__nav--left {\n left: 0;\n}\n\n.media-modal__nav--right {\n right: 0;\n}\n\n.media-modal__pagination {\n width: 100%;\n text-align: center;\n position: absolute;\n left: 0;\n bottom: 20px;\n pointer-events: none;\n}\n\n.media-modal__meta {\n text-align: center;\n position: absolute;\n left: 0;\n bottom: 20px;\n width: 100%;\n pointer-events: none;\n\n &--shifted {\n bottom: 62px;\n }\n\n a {\n pointer-events: auto;\n text-decoration: none;\n font-weight: 500;\n color: $ui-secondary-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.media-modal__page-dot {\n display: inline-block;\n}\n\n.media-modal__button {\n background-color: $white;\n height: 12px;\n width: 12px;\n border-radius: 6px;\n margin: 10px;\n padding: 0;\n border: 0;\n font-size: 0;\n}\n\n.media-modal__button--active {\n background-color: $ui-highlight-color;\n}\n\n.media-modal__close {\n position: absolute;\n right: 8px;\n top: 8px;\n z-index: 100;\n}\n\n.detailed,\n.fullscreen {\n .video-player__volume__current,\n .video-player__volume::before {\n bottom: 27px;\n }\n\n .video-player__volume__handle {\n bottom: 23px;\n }\n\n}\n\n.audio-player {\n box-sizing: border-box;\n position: relative;\n background: darken($ui-base-color, 8%);\n border-radius: 4px;\n padding-bottom: 44px;\n direction: ltr;\n\n &.editable {\n border-radius: 0;\n height: 100%;\n }\n\n &__waveform {\n padding: 15px 0;\n position: relative;\n overflow: hidden;\n\n &::before {\n content: \"\";\n display: block;\n position: absolute;\n border-top: 1px solid lighten($ui-base-color, 4%);\n width: 100%;\n height: 0;\n left: 0;\n top: calc(50% + 1px);\n }\n }\n\n &__progress-placeholder {\n background-color: rgba(lighten($ui-highlight-color, 8%), 0.5);\n }\n\n &__wave-placeholder {\n background-color: lighten($ui-base-color, 16%);\n }\n\n .video-player__controls {\n padding: 0 15px;\n padding-top: 10px;\n background: darken($ui-base-color, 8%);\n border-top: 1px solid lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n }\n}\n\n.video-player {\n overflow: hidden;\n position: relative;\n background: $base-shadow-color;\n max-width: 100%;\n border-radius: 4px;\n box-sizing: border-box;\n direction: ltr;\n\n &.editable {\n border-radius: 0;\n height: 100% !important;\n }\n\n &:focus {\n outline: 0;\n }\n\n .detailed-status & {\n width: 100%;\n height: 100%;\n }\n\n @include fullwidth-gallery;\n\n video {\n max-width: 100vw;\n max-height: 80vh;\n z-index: 1;\n position: relative;\n }\n\n &.fullscreen {\n width: 100% !important;\n height: 100% !important;\n margin: 0;\n\n video {\n max-width: 100% !important;\n max-height: 100% !important;\n width: 100% !important;\n height: 100% !important;\n outline: 0;\n }\n }\n\n &.inline {\n video {\n object-fit: contain;\n position: relative;\n top: 50%;\n transform: translateY(-50%);\n }\n }\n\n &__controls {\n position: absolute;\n z-index: 2;\n bottom: 0;\n left: 0;\n right: 0;\n box-sizing: border-box;\n background: linear-gradient(0deg, rgba($base-shadow-color, 0.85) 0, rgba($base-shadow-color, 0.45) 60%, transparent);\n padding: 0 15px;\n opacity: 0;\n transition: opacity .1s ease;\n\n &.active {\n opacity: 1;\n }\n }\n\n &.inactive {\n video,\n .video-player__controls {\n visibility: hidden;\n }\n }\n\n &__spoiler {\n display: none;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 4;\n border: 0;\n background: $base-shadow-color;\n color: $darker-text-color;\n transition: none;\n pointer-events: none;\n\n &.active {\n display: block;\n pointer-events: auto;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($darker-text-color, 7%);\n }\n }\n\n &__title {\n display: block;\n font-size: 14px;\n }\n\n &__subtitle {\n display: block;\n font-size: 11px;\n font-weight: 500;\n }\n }\n\n &__buttons-bar {\n display: flex;\n justify-content: space-between;\n padding-bottom: 10px;\n\n .video-player__download__icon {\n color: inherit;\n\n .fa,\n &:active .fa,\n &:hover .fa,\n &:focus .fa {\n color: inherit;\n }\n }\n }\n\n &__buttons {\n font-size: 16px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &.left {\n button {\n padding-left: 0;\n }\n }\n\n &.right {\n button {\n padding-right: 0;\n }\n }\n\n button {\n background: transparent;\n padding: 2px 10px;\n font-size: 16px;\n border: 0;\n color: rgba($white, 0.75);\n\n &:active,\n &:hover,\n &:focus {\n color: $white;\n }\n }\n }\n\n &__time-sep,\n &__time-total,\n &__time-current {\n font-size: 14px;\n font-weight: 500;\n }\n\n &__time-current {\n color: $white;\n margin-left: 60px;\n }\n\n &__time-sep {\n display: inline-block;\n margin: 0 6px;\n }\n\n &__time-sep,\n &__time-total {\n color: $white;\n }\n\n &__volume {\n cursor: pointer;\n height: 24px;\n display: inline;\n\n &::before {\n content: \"\";\n width: 50px;\n background: rgba($white, 0.35);\n border-radius: 4px;\n display: block;\n position: absolute;\n height: 4px;\n left: 70px;\n bottom: 20px;\n }\n\n &__current {\n display: block;\n position: absolute;\n height: 4px;\n border-radius: 4px;\n left: 70px;\n bottom: 20px;\n background: lighten($ui-highlight-color, 8%);\n }\n\n &__handle {\n position: absolute;\n z-index: 3;\n border-radius: 50%;\n width: 12px;\n height: 12px;\n bottom: 16px;\n left: 70px;\n transition: opacity .1s ease;\n background: lighten($ui-highlight-color, 8%);\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n pointer-events: none;\n }\n }\n\n &__link {\n padding: 2px 10px;\n\n a {\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n color: $white;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n }\n\n &__seek {\n cursor: pointer;\n height: 24px;\n position: relative;\n\n &::before {\n content: \"\";\n width: 100%;\n background: rgba($white, 0.35);\n border-radius: 4px;\n display: block;\n position: absolute;\n height: 4px;\n top: 10px;\n }\n\n &__progress,\n &__buffer {\n display: block;\n position: absolute;\n height: 4px;\n border-radius: 4px;\n top: 10px;\n background: lighten($ui-highlight-color, 8%);\n }\n\n &__buffer {\n background: rgba($white, 0.2);\n }\n\n &__handle {\n position: absolute;\n z-index: 3;\n opacity: 0;\n border-radius: 50%;\n width: 12px;\n height: 12px;\n top: 6px;\n margin-left: -6px;\n transition: opacity .1s ease;\n background: lighten($ui-highlight-color, 8%);\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n pointer-events: none;\n\n &.active {\n opacity: 1;\n }\n }\n\n &:hover {\n .video-player__seek__handle {\n opacity: 1;\n }\n }\n }\n\n &.detailed,\n &.fullscreen {\n .video-player__buttons {\n button {\n padding-top: 10px;\n padding-bottom: 10px;\n }\n }\n }\n}\n",".sensitive-info {\n display: flex;\n flex-direction: row;\n align-items: center;\n position: absolute;\n top: 4px;\n left: 4px;\n z-index: 100;\n}\n\n.sensitive-marker {\n margin: 0 3px;\n border-radius: 2px;\n padding: 2px 6px;\n color: rgba($primary-text-color, 0.8);\n background: rgba($base-overlay-background, 0.5);\n font-size: 12px;\n line-height: 18px;\n text-transform: uppercase;\n opacity: .9;\n transition: opacity .1s ease;\n\n .media-gallery:hover & { opacity: 1 }\n}\n",".list-editor {\n background: $ui-base-color;\n flex-direction: column;\n border-radius: 8px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n width: 380px;\n overflow: hidden;\n\n @media screen and (max-width: 420px) {\n width: 90%;\n }\n\n h4 {\n padding: 15px 0;\n background: lighten($ui-base-color, 13%);\n font-weight: 500;\n font-size: 16px;\n text-align: center;\n border-radius: 8px 8px 0 0;\n }\n\n .drawer__pager {\n height: 50vh;\n }\n\n .drawer__inner {\n border-radius: 0 0 8px 8px;\n\n &.backdrop {\n width: calc(100% - 60px);\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n border-radius: 0 0 0 8px;\n }\n }\n\n &__accounts {\n overflow-y: auto;\n }\n\n .account__display-name {\n &:hover strong {\n text-decoration: none;\n }\n }\n\n .account__avatar {\n cursor: default;\n }\n\n .search {\n margin-bottom: 0;\n }\n}\n\n.list-adder {\n background: $ui-base-color;\n flex-direction: column;\n border-radius: 8px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n width: 380px;\n overflow: hidden;\n\n @media screen and (max-width: 420px) {\n width: 90%;\n }\n\n &__account {\n background: lighten($ui-base-color, 13%);\n }\n\n &__lists {\n background: lighten($ui-base-color, 13%);\n height: 50vh;\n border-radius: 0 0 8px 8px;\n overflow-y: auto;\n }\n\n .list {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n .list__wrapper {\n display: flex;\n }\n\n .list__display-name {\n flex: 1 1 auto;\n overflow: hidden;\n text-decoration: none;\n font-size: 16px;\n padding: 10px;\n }\n}\n",".emoji-mart {\n &,\n * {\n box-sizing: border-box;\n line-height: 1.15;\n }\n\n font-size: 13px;\n display: inline-block;\n color: $inverted-text-color;\n\n .emoji-mart-emoji {\n padding: 6px;\n }\n}\n\n.emoji-mart-bar {\n border: 0 solid darken($ui-secondary-color, 8%);\n\n &:first-child {\n border-bottom-width: 1px;\n border-top-left-radius: 5px;\n border-top-right-radius: 5px;\n background: $ui-secondary-color;\n }\n\n &:last-child {\n border-top-width: 1px;\n border-bottom-left-radius: 5px;\n border-bottom-right-radius: 5px;\n display: none;\n }\n}\n\n.emoji-mart-anchors {\n display: flex;\n justify-content: space-between;\n padding: 0 6px;\n color: $lighter-text-color;\n line-height: 0;\n}\n\n.emoji-mart-anchor {\n position: relative;\n flex: 1;\n text-align: center;\n padding: 12px 4px;\n overflow: hidden;\n transition: color .1s ease-out;\n cursor: pointer;\n\n &:hover {\n color: darken($lighter-text-color, 4%);\n }\n}\n\n.emoji-mart-anchor-selected {\n color: $highlight-text-color;\n\n &:hover {\n color: darken($highlight-text-color, 4%);\n }\n\n .emoji-mart-anchor-bar {\n bottom: 0;\n }\n}\n\n.emoji-mart-anchor-bar {\n position: absolute;\n bottom: -3px;\n left: 0;\n width: 100%;\n height: 3px;\n background-color: darken($ui-highlight-color, 3%);\n}\n\n.emoji-mart-anchors {\n i {\n display: inline-block;\n width: 100%;\n max-width: 22px;\n }\n\n svg {\n fill: currentColor;\n max-height: 18px;\n }\n}\n\n.emoji-mart-scroll {\n overflow-y: scroll;\n height: 270px;\n max-height: 35vh;\n padding: 0 6px 6px;\n background: $simple-background-color;\n will-change: transform;\n\n &::-webkit-scrollbar-track:hover,\n &::-webkit-scrollbar-track:active {\n background-color: rgba($base-overlay-background, 0.3);\n }\n}\n\n.emoji-mart-search {\n padding: 10px;\n padding-right: 45px;\n background: $simple-background-color;\n\n input {\n font-size: 14px;\n font-weight: 400;\n padding: 7px 9px;\n font-family: inherit;\n display: block;\n width: 100%;\n background: rgba($ui-secondary-color, 0.3);\n color: $inverted-text-color;\n border: 1px solid $ui-secondary-color;\n border-radius: 4px;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n}\n\n.emoji-mart-category .emoji-mart-emoji {\n cursor: pointer;\n\n span {\n z-index: 1;\n position: relative;\n text-align: center;\n }\n\n &:hover::before {\n z-index: 0;\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba($ui-secondary-color, 0.7);\n border-radius: 100%;\n }\n}\n\n.emoji-mart-category-label {\n z-index: 2;\n position: relative;\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n\n span {\n display: block;\n width: 100%;\n font-weight: 500;\n padding: 5px 6px;\n background: $simple-background-color;\n }\n}\n\n.emoji-mart-emoji {\n position: relative;\n display: inline-block;\n font-size: 0;\n\n span {\n width: 22px;\n height: 22px;\n }\n}\n\n.emoji-mart-no-results {\n font-size: 14px;\n text-align: center;\n padding-top: 70px;\n color: $light-text-color;\n\n .emoji-mart-category-label {\n display: none;\n }\n\n .emoji-mart-no-results-label {\n margin-top: .2em;\n }\n\n .emoji-mart-emoji:hover::before {\n content: none;\n }\n}\n\n.emoji-mart-preview {\n display: none;\n}\n",".glitch.local-settings {\n position: relative;\n display: flex;\n flex-direction: row;\n background: $ui-secondary-color;\n color: $inverted-text-color;\n border-radius: 8px;\n height: 80vh;\n width: 80vw;\n max-width: 740px;\n max-height: 450px;\n overflow: hidden;\n\n label, legend {\n display: block;\n font-size: 14px;\n }\n\n .boolean label, .radio_buttons label {\n position: relative;\n padding-left: 28px;\n padding-top: 3px;\n\n input {\n position: absolute;\n left: 0;\n top: 0;\n }\n }\n\n span.hint {\n display: block;\n color: $lighter-text-color;\n }\n\n h1 {\n font-size: 18px;\n font-weight: 500;\n line-height: 24px;\n margin-bottom: 20px;\n }\n\n h2 {\n font-size: 15px;\n font-weight: 500;\n line-height: 20px;\n margin-top: 20px;\n margin-bottom: 10px;\n }\n}\n\n.glitch.local-settings__navigation__item {\n display: block;\n padding: 15px 20px;\n color: inherit;\n background: lighten($ui-secondary-color, 8%);\n border-bottom: 1px $ui-secondary-color solid;\n cursor: pointer;\n text-decoration: none;\n outline: none;\n transition: background .3s;\n\n .text-icon-button {\n color: inherit;\n transition: unset;\n }\n\n &:hover {\n background: $ui-secondary-color;\n }\n\n &.active {\n background: $ui-highlight-color;\n color: $primary-text-color;\n }\n\n &.close, &.close:hover {\n background: $error-value-color;\n color: $primary-text-color;\n }\n}\n\n.glitch.local-settings__navigation {\n background: lighten($ui-secondary-color, 8%);\n width: 212px;\n font-size: 15px;\n line-height: 20px;\n overflow-y: auto;\n}\n\n.glitch.local-settings__page {\n display: block;\n flex: auto;\n padding: 15px 20px 15px 20px;\n width: 360px;\n overflow-y: auto;\n}\n\n.glitch.local-settings__page__item {\n margin-bottom: 2px;\n}\n\n.glitch.local-settings__page__item.string,\n.glitch.local-settings__page__item.radio_buttons {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n\n@media screen and (max-width: 630px) {\n .glitch.local-settings__navigation {\n width: 40px;\n flex-shrink: 0;\n }\n\n .glitch.local-settings__navigation__item {\n padding: 10px;\n\n span:last-of-type {\n display: none;\n }\n }\n}\n",".error-boundary {\n color: $primary-text-color;\n font-size: 15px;\n line-height: 20px;\n\n h1 {\n font-size: 26px;\n line-height: 36px;\n font-weight: 400;\n margin-bottom: 8px;\n }\n\n a {\n color: $primary-text-color;\n text-decoration: underline;\n }\n\n ul {\n list-style: disc;\n margin-left: 0;\n padding-left: 1em;\n }\n\n textarea.web_app_crash-stacktrace {\n width: 100%;\n resize: none;\n white-space: pre;\n font-family: $font-monospace, monospace;\n }\n}\n",".compose-panel {\n width: 285px;\n margin-top: 10px;\n display: flex;\n flex-direction: column;\n height: calc(100% - 10px);\n overflow-y: hidden;\n\n .search__input {\n line-height: 18px;\n font-size: 16px;\n padding: 15px;\n padding-right: 30px;\n }\n\n .search__icon .fa {\n top: 15px;\n }\n\n .drawer--account {\n flex: 0 1 48px;\n }\n\n .flex-spacer {\n background: transparent;\n }\n\n .composer {\n flex: 1;\n overflow-y: hidden;\n display: flex;\n flex-direction: column;\n min-height: 310px;\n }\n\n .compose-form__autosuggest-wrapper {\n overflow-y: auto;\n background-color: $white;\n border-radius: 4px 4px 0 0;\n flex: 0 1 auto;\n }\n\n .autosuggest-textarea__textarea {\n overflow-y: hidden;\n }\n\n .compose-form__upload-thumbnail {\n height: 80px;\n }\n}\n\n.navigation-panel {\n margin-top: 10px;\n margin-bottom: 10px;\n height: calc(100% - 20px);\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n\n & > a {\n flex: 0 0 auto;\n }\n\n hr {\n flex: 0 0 auto;\n border: 0;\n background: transparent;\n border-top: 1px solid lighten($ui-base-color, 4%);\n margin: 10px 0;\n }\n\n .flex-spacer {\n background: transparent;\n }\n}\n\n@media screen and (min-width: 600px) {\n .tabs-bar__link {\n span {\n display: inline;\n }\n }\n}\n\n.columns-area--mobile {\n flex-direction: column;\n width: 100%;\n margin: 0 auto;\n\n .column,\n .drawer {\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .directory__list {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: block;\n }\n }\n\n .directory__card {\n margin-bottom: 0;\n }\n\n .filter-form {\n display: flex;\n }\n\n .autosuggest-textarea__textarea {\n font-size: 16px;\n }\n\n .search__input {\n line-height: 18px;\n font-size: 16px;\n padding: 15px;\n padding-right: 30px;\n }\n\n .search__icon .fa {\n top: 15px;\n }\n\n .scrollable {\n overflow: visible;\n\n @supports(display: grid) {\n contain: content;\n }\n }\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding: 10px 0;\n padding-top: 0;\n }\n\n @media screen and (min-width: 630px) {\n .detailed-status {\n padding: 15px;\n\n .media-gallery,\n .video-player,\n .audio-player {\n margin-top: 15px;\n }\n }\n\n .account__header__bar {\n padding: 5px 10px;\n }\n\n .navigation-bar,\n .compose-form {\n padding: 15px;\n }\n\n .compose-form .compose-form__publish .compose-form__publish-button-wrapper {\n padding-top: 15px;\n }\n\n .status {\n padding: 15px;\n min-height: 48px + 2px;\n\n .media-gallery,\n &__action-bar,\n .video-player,\n .audio-player {\n margin-top: 10px;\n }\n }\n\n .account {\n padding: 15px 10px;\n\n &__header__bio {\n margin: 0 -10px;\n }\n }\n\n .notification {\n &__message {\n padding-top: 15px;\n }\n\n .status {\n padding-top: 8px;\n }\n\n .account {\n padding-top: 8px;\n }\n }\n }\n}\n\n.floating-action-button {\n position: fixed;\n display: flex;\n justify-content: center;\n align-items: center;\n width: 3.9375rem;\n height: 3.9375rem;\n bottom: 1.3125rem;\n right: 1.3125rem;\n background: darken($ui-highlight-color, 3%);\n color: $white;\n border-radius: 50%;\n font-size: 21px;\n line-height: 21px;\n text-decoration: none;\n box-shadow: 2px 3px 9px rgba($base-shadow-color, 0.4);\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-highlight-color, 7%);\n }\n}\n\n@media screen and (min-width: $no-gap-breakpoint) {\n .tabs-bar {\n width: 100%;\n }\n\n .react-swipeable-view-container .columns-area--mobile {\n height: calc(100% - 10px) !important;\n }\n\n .getting-started__wrapper,\n .search {\n margin-bottom: 10px;\n }\n}\n\n@media screen and (max-width: 600px + (285px * 1) + (10px * 1)) {\n .columns-area__panels__pane--compositional {\n display: none;\n }\n}\n\n@media screen and (min-width: 600px + (285px * 1) + (10px * 1)) {\n .floating-action-button,\n .tabs-bar__link.optional {\n display: none;\n }\n\n .search-page .search {\n display: none;\n }\n}\n\n@media screen and (max-width: 600px + (285px * 2) + (10px * 2)) {\n .columns-area__panels__pane--navigational {\n display: none;\n }\n}\n\n@media screen and (min-width: 600px + (285px * 2) + (10px * 2)) {\n .tabs-bar {\n display: none;\n }\n}\n",".announcements__item__content {\n word-wrap: break-word;\n overflow-y: auto;\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n p {\n margin-bottom: 10px;\n white-space: pre-wrap;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: $secondary-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n\n &.mention {\n &:hover {\n text-decoration: none;\n\n span {\n text-decoration: underline;\n }\n }\n }\n\n &.unhandled-link {\n color: lighten($ui-highlight-color, 8%);\n }\n }\n}\n\n.announcements {\n background: lighten($ui-base-color, 8%);\n font-size: 13px;\n display: flex;\n align-items: flex-end;\n\n &__mastodon {\n width: 124px;\n flex: 0 0 auto;\n\n @media screen and (max-width: 124px + 300px) {\n display: none;\n }\n }\n\n &__container {\n width: calc(100% - 124px);\n flex: 0 0 auto;\n position: relative;\n\n @media screen and (max-width: 124px + 300px) {\n width: 100%;\n }\n }\n\n &__item {\n box-sizing: border-box;\n width: 100%;\n padding: 15px;\n position: relative;\n font-size: 15px;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n max-height: 50vh;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n\n &__range {\n display: block;\n font-weight: 500;\n margin-bottom: 10px;\n padding-right: 18px;\n }\n\n &__unread {\n position: absolute;\n top: 19px;\n right: 19px;\n display: block;\n background: $highlight-text-color;\n border-radius: 50%;\n width: 0.625rem;\n height: 0.625rem;\n }\n }\n\n &__pagination {\n padding: 15px;\n color: $darker-text-color;\n position: absolute;\n bottom: 3px;\n right: 0;\n }\n}\n\n.layout-multiple-columns .announcements__mastodon {\n display: none;\n}\n\n.layout-multiple-columns .announcements__container {\n width: 100%;\n}\n\n.reactions-bar {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n margin-top: 15px;\n margin-left: -2px;\n width: calc(100% - (90px - 33px));\n\n &__item {\n flex-shrink: 0;\n background: lighten($ui-base-color, 12%);\n border: 0;\n border-radius: 3px;\n margin: 2px;\n cursor: pointer;\n user-select: none;\n padding: 0 6px;\n display: flex;\n align-items: center;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &__emoji {\n display: block;\n margin: 3px 0;\n width: 16px;\n height: 16px;\n\n img {\n display: block;\n margin: 0;\n width: 100%;\n height: 100%;\n min-width: auto;\n min-height: auto;\n vertical-align: bottom;\n object-fit: contain;\n }\n }\n\n &__count {\n display: block;\n min-width: 9px;\n font-size: 13px;\n font-weight: 500;\n text-align: center;\n margin-left: 6px;\n color: $darker-text-color;\n }\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 16%);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n\n &__count {\n color: lighten($darker-text-color, 4%);\n }\n }\n\n &.active {\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n background-color: mix(lighten($ui-base-color, 12%), $ui-highlight-color, 80%);\n\n .reactions-bar__item__count {\n color: lighten($highlight-text-color, 8%);\n }\n }\n }\n\n .emoji-picker-dropdown {\n margin: 2px;\n }\n\n &:hover .emoji-button {\n opacity: 0.85;\n }\n\n .emoji-button {\n color: $darker-text-color;\n margin: 0;\n font-size: 16px;\n width: auto;\n flex-shrink: 0;\n padding: 0 6px;\n height: 22px;\n display: flex;\n align-items: center;\n opacity: 0.5;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &:hover,\n &:active,\n &:focus {\n opacity: 1;\n color: lighten($darker-text-color, 4%);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n }\n }\n\n &--empty {\n .emoji-button {\n padding: 0;\n }\n }\n}\n",".poll {\n margin-top: 16px;\n font-size: 14px;\n\n ul,\n .e-content & ul {\n margin: 0;\n list-style: none;\n }\n\n li {\n margin-bottom: 10px;\n position: relative;\n }\n\n &__chart {\n border-radius: 4px;\n display: block;\n background: darken($ui-primary-color, 5%);\n height: 5px;\n min-width: 1%;\n\n &.leading {\n background: $ui-highlight-color;\n }\n }\n\n &__option {\n position: relative;\n display: flex;\n padding: 6px 0;\n line-height: 18px;\n cursor: default;\n overflow: hidden;\n\n &__text {\n display: inline-block;\n word-wrap: break-word;\n overflow-wrap: break-word;\n max-width: calc(100% - 45px - 25px);\n }\n\n input[type=radio],\n input[type=checkbox] {\n display: none;\n }\n\n .autossugest-input {\n flex: 1 1 auto;\n }\n\n input[type=text] {\n display: block;\n box-sizing: border-box;\n width: 100%;\n font-size: 14px;\n color: $inverted-text-color;\n display: block;\n outline: 0;\n font-family: inherit;\n background: $simple-background-color;\n border: 1px solid darken($simple-background-color, 14%);\n border-radius: 4px;\n padding: 6px 10px;\n\n &:focus {\n border-color: $highlight-text-color;\n }\n }\n\n &.selectable {\n cursor: pointer;\n }\n\n &.editable {\n display: flex;\n align-items: center;\n overflow: visible;\n }\n }\n\n &__input {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 50%;\n vertical-align: middle;\n margin-top: auto;\n margin-bottom: auto;\n flex: 0 0 18px;\n\n &.checkbox {\n border-radius: 4px;\n }\n\n &.active {\n border-color: $valid-value-color;\n background: $valid-value-color;\n }\n\n &:active,\n &:focus,\n &:hover {\n border-color: lighten($valid-value-color, 15%);\n border-width: 4px;\n }\n\n &::-moz-focus-inner {\n outline: 0 !important;\n border: 0;\n }\n\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n\n &__number {\n display: inline-block;\n width: 45px;\n font-weight: 700;\n flex: 0 0 45px;\n }\n\n &__voted {\n padding: 0 5px;\n display: inline-block;\n\n &__mark {\n font-size: 18px;\n }\n }\n\n &__footer {\n padding-top: 6px;\n padding-bottom: 5px;\n color: $dark-text-color;\n }\n\n &__link {\n display: inline;\n background: transparent;\n padding: 0;\n margin: 0;\n border: 0;\n color: $dark-text-color;\n text-decoration: underline;\n font-size: inherit;\n\n &:hover {\n text-decoration: none;\n }\n\n &:active,\n &:focus {\n background-color: rgba($dark-text-color, .1);\n }\n }\n\n .button {\n height: 36px;\n padding: 0 16px;\n margin-right: 10px;\n font-size: 14px;\n }\n}\n\n.compose-form__poll-wrapper {\n border-top: 1px solid darken($simple-background-color, 8%);\n overflow-x: hidden;\n\n ul {\n padding: 10px;\n }\n\n .poll__footer {\n border-top: 1px solid darken($simple-background-color, 8%);\n padding: 10px;\n display: flex;\n align-items: center;\n\n button,\n select {\n width: 100%;\n flex: 1 1 50%;\n\n &:focus {\n border-color: $highlight-text-color;\n }\n }\n }\n\n .button.button-secondary {\n font-size: 14px;\n font-weight: 400;\n padding: 6px 10px;\n height: auto;\n line-height: inherit;\n color: $action-button-color;\n border-color: $action-button-color;\n margin-right: 5px;\n }\n\n li {\n display: flex;\n align-items: center;\n\n .poll__option {\n flex: 0 0 auto;\n width: calc(100% - (23px + 6px));\n margin-right: 6px;\n }\n }\n\n select {\n appearance: none;\n box-sizing: border-box;\n font-size: 14px;\n color: $inverted-text-color;\n display: inline-block;\n width: auto;\n outline: 0;\n font-family: inherit;\n background: $simple-background-color url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center / auto 16px;\n border: 1px solid darken($simple-background-color, 14%);\n border-radius: 4px;\n padding: 6px 10px;\n padding-right: 30px;\n }\n\n .icon-button.disabled {\n color: darken($simple-background-color, 14%);\n }\n}\n\n.muted .poll {\n color: $dark-text-color;\n\n &__chart {\n background: rgba(darken($ui-primary-color, 14%), 0.2);\n\n &.leading {\n background: rgba($ui-highlight-color, 0.2);\n }\n }\n}\n","$maximum-width: 1235px;\n$fluid-breakpoint: $maximum-width + 20px;\n$column-breakpoint: 700px;\n$small-breakpoint: 960px;\n\n.container {\n box-sizing: border-box;\n max-width: $maximum-width;\n margin: 0 auto;\n position: relative;\n\n @media screen and (max-width: $fluid-breakpoint) {\n width: 100%;\n padding: 0 10px;\n }\n}\n\n.rich-formatting {\n font-family: $font-sans-serif, sans-serif;\n font-size: 14px;\n font-weight: 400;\n line-height: 1.7;\n word-wrap: break-word;\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n p,\n li {\n color: $darker-text-color;\n }\n\n p {\n margin-top: 0;\n margin-bottom: .85em;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n strong {\n font-weight: 700;\n color: $secondary-text-color;\n }\n\n em {\n font-style: italic;\n color: $secondary-text-color;\n }\n\n code {\n font-size: 0.85em;\n background: darken($ui-base-color, 8%);\n border-radius: 4px;\n padding: 0.2em 0.3em;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n font-family: $font-display, sans-serif;\n margin-top: 1.275em;\n margin-bottom: .85em;\n font-weight: 500;\n color: $secondary-text-color;\n }\n\n h1 {\n font-size: 2em;\n }\n\n h2 {\n font-size: 1.75em;\n }\n\n h3 {\n font-size: 1.5em;\n }\n\n h4 {\n font-size: 1.25em;\n }\n\n h5,\n h6 {\n font-size: 1em;\n }\n\n ul {\n list-style: disc;\n }\n\n ol {\n list-style: decimal;\n }\n\n ul,\n ol {\n margin: 0;\n padding: 0;\n padding-left: 2em;\n margin-bottom: 0.85em;\n\n &[type='a'] {\n list-style-type: lower-alpha;\n }\n\n &[type='i'] {\n list-style-type: lower-roman;\n }\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n margin: 1.7em 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n\n table {\n width: 100%;\n border-collapse: collapse;\n break-inside: auto;\n margin-top: 24px;\n margin-bottom: 32px;\n\n thead tr,\n tbody tr {\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n font-size: 1em;\n line-height: 1.625;\n font-weight: 400;\n text-align: left;\n color: $darker-text-color;\n }\n\n thead tr {\n border-bottom-width: 2px;\n line-height: 1.5;\n font-weight: 500;\n color: $dark-text-color;\n }\n\n th,\n td {\n padding: 8px;\n align-self: start;\n align-items: start;\n word-break: break-all;\n\n &.nowrap {\n width: 25%;\n position: relative;\n\n &::before {\n content: ' ';\n visibility: hidden;\n }\n\n span {\n position: absolute;\n left: 8px;\n right: 8px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n }\n\n & > :first-child {\n margin-top: 0;\n }\n}\n\n.information-board {\n background: darken($ui-base-color, 4%);\n padding: 20px 0;\n\n .container-alt {\n position: relative;\n padding-right: 280px + 15px;\n }\n\n &__sections {\n display: flex;\n justify-content: space-between;\n flex-wrap: wrap;\n }\n\n &__section {\n flex: 1 0 0;\n font-family: $font-sans-serif, sans-serif;\n font-size: 16px;\n line-height: 28px;\n color: $primary-text-color;\n text-align: right;\n padding: 10px 15px;\n\n span,\n strong {\n display: block;\n }\n\n span {\n &:last-child {\n color: $secondary-text-color;\n }\n }\n\n strong {\n font-family: $font-display, sans-serif;\n font-weight: 500;\n font-size: 32px;\n line-height: 48px;\n }\n\n @media screen and (max-width: $column-breakpoint) {\n text-align: center;\n }\n }\n\n .panel {\n position: absolute;\n width: 280px;\n box-sizing: border-box;\n background: darken($ui-base-color, 8%);\n padding: 20px;\n padding-top: 10px;\n border-radius: 4px 4px 0 0;\n right: 0;\n bottom: -40px;\n\n .panel-header {\n font-family: $font-display, sans-serif;\n font-size: 14px;\n line-height: 24px;\n font-weight: 500;\n color: $darker-text-color;\n padding-bottom: 5px;\n margin-bottom: 15px;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n\n a,\n span {\n font-weight: 400;\n color: darken($darker-text-color, 10%);\n }\n\n a {\n text-decoration: none;\n }\n }\n }\n\n .owner {\n text-align: center;\n\n .avatar {\n width: 80px;\n height: 80px;\n @include avatar-size(80px);\n margin: 0 auto;\n margin-bottom: 15px;\n\n img {\n display: block;\n width: 80px;\n height: 80px;\n border-radius: 48px;\n @include avatar-radius();\n }\n }\n\n .name {\n font-size: 14px;\n\n a {\n display: block;\n color: $primary-text-color;\n text-decoration: none;\n\n &:hover {\n .display_name {\n text-decoration: underline;\n }\n }\n }\n\n .username {\n display: block;\n color: $darker-text-color;\n }\n }\n }\n}\n\n.landing-page {\n p,\n li {\n font-family: $font-sans-serif, sans-serif;\n font-size: 16px;\n font-weight: 400;\n font-size: 16px;\n line-height: 30px;\n margin-bottom: 12px;\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n }\n }\n\n em {\n display: inline;\n margin: 0;\n padding: 0;\n font-weight: 700;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n color: lighten($darker-text-color, 10%);\n }\n\n h1 {\n font-family: $font-display, sans-serif;\n font-size: 26px;\n line-height: 30px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n\n small {\n font-family: $font-sans-serif, sans-serif;\n display: block;\n font-size: 18px;\n font-weight: 400;\n color: lighten($darker-text-color, 10%);\n }\n }\n\n h2 {\n font-family: $font-display, sans-serif;\n font-size: 22px;\n line-height: 26px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h3 {\n font-family: $font-display, sans-serif;\n font-size: 18px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h4 {\n font-family: $font-display, sans-serif;\n font-size: 16px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h5 {\n font-family: $font-display, sans-serif;\n font-size: 14px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h6 {\n font-family: $font-display, sans-serif;\n font-size: 12px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n ul,\n ol {\n margin-left: 20px;\n\n &[type='a'] {\n list-style-type: lower-alpha;\n }\n\n &[type='i'] {\n list-style-type: lower-roman;\n }\n }\n\n ul {\n list-style: disc;\n }\n\n ol {\n list-style: decimal;\n }\n\n li > ol,\n li > ul {\n margin-top: 6px;\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid rgba($ui-base-lighter-color, .6);\n margin: 20px 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n\n &__information,\n &__forms {\n padding: 20px;\n }\n\n &__call-to-action {\n background: $ui-base-color;\n border-radius: 4px;\n padding: 25px 40px;\n overflow: hidden;\n box-sizing: border-box;\n\n .row {\n width: 100%;\n display: flex;\n flex-direction: row-reverse;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n }\n\n .row__information-board {\n display: flex;\n justify-content: flex-end;\n align-items: flex-end;\n\n .information-board__section {\n flex: 1 0 auto;\n padding: 0 10px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n width: 100%;\n justify-content: space-between;\n }\n }\n\n .row__mascot {\n flex: 1;\n margin: 10px -50px 0 0;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n }\n\n &__logo {\n margin-right: 20px;\n\n img {\n height: 50px;\n width: auto;\n mix-blend-mode: lighten;\n }\n }\n\n &__information {\n padding: 45px 40px;\n margin-bottom: 10px;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n strong {\n font-weight: 500;\n color: lighten($darker-text-color, 10%);\n }\n\n .account {\n border-bottom: 0;\n padding: 0;\n\n &__display-name {\n align-items: center;\n display: flex;\n margin-right: 5px;\n }\n\n div.account__display-name {\n &:hover {\n .display-name strong {\n text-decoration: none;\n }\n }\n\n .account__avatar {\n cursor: default;\n }\n }\n\n &__avatar-wrapper {\n margin-left: 0;\n flex: 0 0 auto;\n }\n\n &__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n @include avatar-size(44px);\n }\n\n .display-name {\n font-size: 15px;\n\n &__account {\n font-size: 14px;\n }\n }\n }\n\n @media screen and (max-width: $small-breakpoint) {\n .contact {\n margin-top: 30px;\n }\n }\n\n @media screen and (max-width: $column-breakpoint) {\n padding: 25px 20px;\n }\n }\n\n &__information,\n &__forms,\n #mastodon-timeline {\n box-sizing: border-box;\n background: $ui-base-color;\n border-radius: 4px;\n box-shadow: 0 0 6px rgba($black, 0.1);\n }\n\n &__mascot {\n height: 104px;\n position: relative;\n left: -40px;\n bottom: 25px;\n\n img {\n height: 190px;\n width: auto;\n }\n }\n\n &__short-description {\n .row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n margin-bottom: 40px;\n }\n\n @media screen and (max-width: $column-breakpoint) {\n .row {\n margin-bottom: 20px;\n }\n }\n\n p a {\n color: $secondary-text-color;\n }\n\n h1 {\n font-weight: 500;\n color: $primary-text-color;\n margin-bottom: 0;\n\n small {\n color: $darker-text-color;\n\n span {\n color: $secondary-text-color;\n }\n }\n }\n\n p:last-child {\n margin-bottom: 0;\n }\n }\n\n &__hero {\n margin-bottom: 10px;\n\n img {\n display: block;\n margin: 0;\n max-width: 100%;\n height: auto;\n border-radius: 4px;\n }\n }\n\n @media screen and (max-width: 840px) {\n .information-board {\n .container-alt {\n padding-right: 20px;\n }\n\n .panel {\n position: static;\n margin-top: 20px;\n width: 100%;\n border-radius: 4px;\n\n .panel-header {\n text-align: center;\n }\n }\n }\n }\n\n @media screen and (max-width: 675px) {\n .header-wrapper {\n padding-top: 0;\n\n &.compact {\n padding-bottom: 0;\n }\n\n &.compact .hero .heading {\n text-align: initial;\n }\n }\n\n .header .container-alt,\n .features .container-alt {\n display: block;\n }\n }\n\n .cta {\n margin: 20px;\n }\n}\n\n.landing {\n margin-bottom: 100px;\n\n @media screen and (max-width: 738px) {\n margin-bottom: 0;\n }\n\n &__brand {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 50px;\n\n svg {\n fill: $primary-text-color;\n height: 52px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding: 0;\n margin-bottom: 30px;\n }\n }\n\n .directory {\n margin-top: 30px;\n background: transparent;\n box-shadow: none;\n border-radius: 0;\n }\n\n .hero-widget {\n margin-top: 30px;\n margin-bottom: 0;\n\n h4 {\n padding: 10px;\n text-transform: uppercase;\n font-weight: 700;\n font-size: 13px;\n color: $darker-text-color;\n }\n\n &__text {\n border-radius: 0;\n padding-bottom: 0;\n }\n\n &__footer {\n background: $ui-base-color;\n padding: 10px;\n border-radius: 0 0 4px 4px;\n display: flex;\n\n &__column {\n flex: 1 1 50%;\n }\n }\n\n .account {\n padding: 10px 0;\n border-bottom: 0;\n\n .account__display-name {\n display: flex;\n align-items: center;\n }\n\n .account__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n }\n\n &__counter {\n padding: 10px;\n\n strong {\n font-family: $font-display, sans-serif;\n font-size: 15px;\n font-weight: 700;\n display: block;\n }\n\n span {\n font-size: 14px;\n color: $darker-text-color;\n }\n }\n }\n\n .simple_form .user_agreement .label_input > label {\n font-weight: 400;\n color: $darker-text-color;\n }\n\n .simple_form p.lead {\n color: $darker-text-color;\n font-size: 15px;\n line-height: 20px;\n font-weight: 400;\n margin-bottom: 25px;\n }\n\n &__grid {\n max-width: 960px;\n margin: 0 auto;\n display: grid;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n grid-gap: 30px;\n\n @media screen and (max-width: 738px) {\n grid-template-columns: minmax(0, 100%);\n grid-gap: 10px;\n\n &__column-login {\n grid-row: 1;\n display: flex;\n flex-direction: column;\n\n .box-widget {\n order: 2;\n flex: 0 0 auto;\n }\n\n .hero-widget {\n margin-top: 0;\n margin-bottom: 10px;\n order: 1;\n flex: 0 0 auto;\n }\n }\n\n &__column-registration {\n grid-row: 2;\n }\n\n .directory {\n margin-top: 10px;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n\n .hero-widget {\n display: block;\n margin-bottom: 0;\n box-shadow: none;\n\n &__img,\n &__img img,\n &__footer {\n border-radius: 0;\n }\n }\n\n .hero-widget,\n .box-widget,\n .directory__tag {\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n .directory {\n margin-top: 0;\n\n &__tag {\n margin-bottom: 0;\n\n & > a,\n & > div {\n border-radius: 0;\n box-shadow: none;\n }\n\n &:last-child {\n border-bottom: 0;\n }\n }\n }\n }\n }\n}\n\n.brand {\n position: relative;\n text-decoration: none;\n}\n\n.brand__tagline {\n display: block;\n position: absolute;\n bottom: -10px;\n left: 50px;\n width: 300px;\n color: $ui-primary-color;\n text-decoration: none;\n font-size: 14px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n position: static;\n width: auto;\n margin-top: 20px;\n color: $dark-text-color;\n }\n}\n\n",".table {\n width: 100%;\n max-width: 100%;\n border-spacing: 0;\n border-collapse: collapse;\n\n th,\n td {\n padding: 8px;\n line-height: 18px;\n vertical-align: top;\n border-top: 1px solid $ui-base-color;\n text-align: left;\n background: darken($ui-base-color, 4%);\n }\n\n & > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid $ui-base-color;\n border-top: 0;\n font-weight: 500;\n }\n\n & > tbody > tr > th {\n font-weight: 500;\n }\n\n & > tbody > tr:nth-child(odd) > td,\n & > tbody > tr:nth-child(odd) > th {\n background: $ui-base-color;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n &.inline-table {\n & > tbody > tr:nth-child(odd) {\n & > td,\n & > th {\n background: transparent;\n }\n }\n\n & > tbody > tr:first-child {\n & > td,\n & > th {\n border-top: 0;\n }\n }\n }\n\n &.batch-table {\n & > thead > tr > th {\n background: $ui-base-color;\n border-top: 1px solid darken($ui-base-color, 8%);\n border-bottom: 1px solid darken($ui-base-color, 8%);\n\n &:first-child {\n border-radius: 4px 0 0;\n border-left: 1px solid darken($ui-base-color, 8%);\n }\n\n &:last-child {\n border-radius: 0 4px 0 0;\n border-right: 1px solid darken($ui-base-color, 8%);\n }\n }\n }\n\n &--invites tbody td {\n vertical-align: middle;\n }\n}\n\n.table-wrapper {\n overflow: auto;\n margin-bottom: 20px;\n}\n\nsamp {\n font-family: $font-monospace, monospace;\n}\n\nbutton.table-action-link {\n background: transparent;\n border: 0;\n font: inherit;\n}\n\nbutton.table-action-link,\na.table-action-link {\n text-decoration: none;\n display: inline-block;\n margin-right: 5px;\n padding: 0 10px;\n color: $darker-text-color;\n font-weight: 500;\n\n &:hover {\n color: $primary-text-color;\n }\n\n i.fa {\n font-weight: 400;\n margin-right: 5px;\n }\n\n &:first-child {\n padding-left: 0;\n }\n}\n\n.batch-table {\n &__toolbar,\n &__row {\n display: flex;\n\n &__select {\n box-sizing: border-box;\n padding: 8px 16px;\n cursor: pointer;\n min-height: 100%;\n\n input {\n margin-top: 8px;\n }\n\n &--aligned {\n display: flex;\n align-items: center;\n\n input {\n margin-top: 0;\n }\n }\n }\n\n &__actions,\n &__content {\n padding: 8px 0;\n padding-right: 16px;\n flex: 1 1 auto;\n }\n }\n\n &__toolbar {\n border: 1px solid darken($ui-base-color, 8%);\n background: $ui-base-color;\n border-radius: 4px 0 0;\n height: 47px;\n align-items: center;\n\n &__actions {\n text-align: right;\n padding-right: 16px - 5px;\n }\n }\n\n &__form {\n padding: 16px;\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n background: $ui-base-color;\n\n .fields-row {\n padding-top: 0;\n margin-bottom: 0;\n }\n }\n\n &__row {\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n background: darken($ui-base-color, 4%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n .optional &:first-child {\n border-top: 1px solid darken($ui-base-color, 8%);\n }\n }\n\n &:hover {\n background: darken($ui-base-color, 2%);\n }\n\n &:nth-child(even) {\n background: $ui-base-color;\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n }\n\n &__content {\n padding-top: 12px;\n padding-bottom: 16px;\n\n &--unpadded {\n padding: 0;\n }\n\n &--with-image {\n display: flex;\n align-items: center;\n }\n\n &__image {\n flex: 0 0 auto;\n display: flex;\n justify-content: center;\n align-items: center;\n margin-right: 10px;\n\n .emojione {\n width: 32px;\n height: 32px;\n }\n }\n\n &__text {\n flex: 1 1 auto;\n }\n\n &__extra {\n flex: 0 0 auto;\n text-align: right;\n color: $darker-text-color;\n font-weight: 500;\n }\n }\n\n .directory__tag {\n margin: 0;\n width: 100%;\n\n a {\n background: transparent;\n border-radius: 0;\n }\n }\n }\n\n &.optional .batch-table__toolbar,\n &.optional .batch-table__row__select {\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n\n .status__content {\n padding-top: 0;\n\n strong {\n font-weight: 700;\n }\n }\n\n .nothing-here {\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n box-shadow: none;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 1px solid darken($ui-base-color, 8%);\n }\n }\n\n @media screen and (max-width: 870px) {\n .accounts-table tbody td.optional {\n display: none;\n }\n }\n}\n","$no-columns-breakpoint: 600px;\n$sidebar-width: 240px;\n$content-width: 840px;\n\n.admin-wrapper {\n display: flex;\n justify-content: center;\n width: 100%;\n min-height: 100vh;\n\n .sidebar-wrapper {\n min-height: 100vh;\n overflow: hidden;\n pointer-events: none;\n flex: 1 1 auto;\n\n &__inner {\n display: flex;\n justify-content: flex-end;\n background: $ui-base-color;\n height: 100%;\n }\n }\n\n .sidebar {\n width: $sidebar-width;\n padding: 0;\n pointer-events: auto;\n\n &__toggle {\n display: none;\n background: lighten($ui-base-color, 8%);\n height: 48px;\n\n &__logo {\n flex: 1 1 auto;\n\n a {\n display: inline-block;\n padding: 15px;\n }\n\n svg {\n fill: $primary-text-color;\n height: 20px;\n position: relative;\n bottom: -2px;\n }\n }\n\n &__icon {\n display: block;\n color: $darker-text-color;\n text-decoration: none;\n flex: 0 0 auto;\n font-size: 20px;\n padding: 15px;\n }\n\n a {\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 12%);\n }\n }\n }\n\n .logo {\n display: block;\n margin: 40px auto;\n width: 100px;\n height: 100px;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n & > a:first-child {\n display: none;\n }\n }\n\n ul {\n list-style: none;\n border-radius: 4px 0 0 4px;\n overflow: hidden;\n margin-bottom: 20px;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n margin-bottom: 0;\n }\n\n a {\n display: block;\n padding: 15px;\n color: $darker-text-color;\n text-decoration: none;\n transition: all 200ms linear;\n transition-property: color, background-color;\n border-radius: 4px 0 0 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n i.fa {\n margin-right: 5px;\n }\n\n &:hover {\n color: $primary-text-color;\n background-color: darken($ui-base-color, 5%);\n transition: all 100ms linear;\n transition-property: color, background-color;\n }\n\n &.selected {\n background: darken($ui-base-color, 2%);\n border-radius: 4px 0 0;\n }\n }\n\n ul {\n background: darken($ui-base-color, 4%);\n border-radius: 0 0 0 4px;\n margin: 0;\n\n a {\n border: 0;\n padding: 15px 35px;\n }\n }\n\n .simple-navigation-active-leaf a {\n color: $primary-text-color;\n background-color: $ui-highlight-color;\n border-bottom: 0;\n border-radius: 0;\n\n &:hover {\n background-color: lighten($ui-highlight-color, 5%);\n }\n }\n }\n\n & > ul > .simple-navigation-active-leaf a {\n border-radius: 4px 0 0 4px;\n }\n }\n\n .content-wrapper {\n box-sizing: border-box;\n width: 100%;\n max-width: $content-width;\n flex: 1 1 auto;\n }\n\n @media screen and (max-width: $content-width + $sidebar-width) {\n .sidebar-wrapper--empty {\n display: none;\n }\n\n .sidebar-wrapper {\n width: $sidebar-width;\n flex: 0 0 auto;\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n .sidebar-wrapper {\n width: 100%;\n }\n }\n\n .content {\n padding: 20px 15px;\n padding-top: 60px;\n padding-left: 25px;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n max-width: none;\n padding: 15px;\n padding-top: 30px;\n }\n\n &-heading {\n display: flex;\n\n padding-bottom: 40px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n margin: -15px -15px 40px 0;\n\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n\n & > * {\n margin-top: 15px;\n margin-right: 15px;\n }\n\n &-actions {\n display: inline-flex;\n\n & > :not(:first-child) {\n margin-left: 5px;\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n border-bottom: 0;\n padding-bottom: 0;\n }\n }\n\n h2 {\n color: $secondary-text-color;\n font-size: 24px;\n line-height: 28px;\n font-weight: 400;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n font-weight: 700;\n }\n }\n\n h3 {\n color: $secondary-text-color;\n font-size: 20px;\n line-height: 28px;\n font-weight: 400;\n margin-bottom: 30px;\n }\n\n h4 {\n text-transform: uppercase;\n font-size: 13px;\n font-weight: 700;\n color: $darker-text-color;\n padding-bottom: 8px;\n margin-bottom: 8px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n h6 {\n font-size: 16px;\n color: $secondary-text-color;\n line-height: 28px;\n font-weight: 500;\n }\n\n .fields-group h6 {\n color: $primary-text-color;\n font-weight: 500;\n }\n\n .directory__tag > a,\n .directory__tag > div {\n box-shadow: none;\n }\n\n .directory__tag .table-action-link .fa {\n color: inherit;\n }\n\n .directory__tag h4 {\n font-size: 18px;\n font-weight: 700;\n color: $primary-text-color;\n text-transform: none;\n padding-bottom: 0;\n margin-bottom: 0;\n border-bottom: none;\n }\n\n & > p {\n font-size: 14px;\n line-height: 21px;\n color: $secondary-text-color;\n margin-bottom: 20px;\n\n strong {\n color: $primary-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid rgba($ui-base-lighter-color, .6);\n margin: 20px 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n\n .sidebar-wrapper {\n min-height: 0;\n }\n\n .sidebar {\n width: 100%;\n padding: 0;\n height: auto;\n\n &__toggle {\n display: flex;\n }\n\n & > ul {\n display: none;\n }\n\n ul a,\n ul ul a {\n border-radius: 0;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n transition: none;\n\n &:hover {\n transition: none;\n }\n }\n\n ul ul {\n border-radius: 0;\n }\n\n ul .simple-navigation-active-leaf a {\n border-bottom-color: $ui-highlight-color;\n }\n }\n }\n}\n\nhr.spacer {\n width: 100%;\n border: 0;\n margin: 20px 0;\n height: 1px;\n}\n\nbody,\n.admin-wrapper .content {\n .muted-hint {\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n }\n }\n\n .positive-hint {\n color: $valid-value-color;\n font-weight: 500;\n }\n\n .negative-hint {\n color: $error-value-color;\n font-weight: 500;\n }\n\n .neutral-hint {\n color: $dark-text-color;\n font-weight: 500;\n }\n\n .warning-hint {\n color: $gold-star;\n font-weight: 500;\n }\n}\n\n.filters {\n display: flex;\n flex-wrap: wrap;\n\n .filter-subset {\n flex: 0 0 auto;\n margin: 0 40px 20px 0;\n\n &:last-child {\n margin-bottom: 30px;\n }\n\n ul {\n margin-top: 5px;\n list-style: none;\n\n li {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n strong {\n font-weight: 500;\n text-transform: uppercase;\n font-size: 12px;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n &--with-select strong {\n display: block;\n margin-bottom: 10px;\n }\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n text-transform: uppercase;\n font-size: 12px;\n font-weight: 500;\n border-bottom: 2px solid $ui-base-color;\n\n &:hover {\n color: $primary-text-color;\n border-bottom: 2px solid lighten($ui-base-color, 5%);\n }\n\n &.selected {\n color: $highlight-text-color;\n border-bottom: 2px solid $ui-highlight-color;\n }\n }\n }\n}\n\n.flavour-screen {\n display: block;\n margin: 10px auto;\n max-width: 100%;\n}\n\n.flavour-description {\n display: block;\n font-size: 16px;\n margin: 10px 0;\n\n & > p {\n margin: 10px 0;\n }\n}\n\n.report-accounts {\n display: flex;\n flex-wrap: wrap;\n margin-bottom: 20px;\n}\n\n.report-accounts__item {\n display: flex;\n flex: 250px;\n flex-direction: column;\n margin: 0 5px;\n\n & > strong {\n display: block;\n margin: 0 0 10px -5px;\n font-weight: 500;\n font-size: 14px;\n line-height: 18px;\n color: $secondary-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n .account-card {\n flex: 1 1 auto;\n }\n}\n\n.report-status,\n.account-status {\n display: flex;\n margin-bottom: 10px;\n\n .activity-stream {\n flex: 2 0 0;\n margin-right: 20px;\n max-width: calc(100% - 60px);\n\n .entry {\n border-radius: 4px;\n }\n }\n}\n\n.report-status__actions,\n.account-status__actions {\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n\n .icon-button {\n font-size: 24px;\n width: 24px;\n text-align: center;\n margin-bottom: 10px;\n }\n}\n\n.simple_form.new_report_note,\n.simple_form.new_account_moderation_note {\n max-width: 100%;\n}\n\n.batch-form-box {\n display: flex;\n flex-wrap: wrap;\n margin-bottom: 5px;\n\n #form_status_batch_action {\n margin: 0 5px 5px 0;\n font-size: 14px;\n }\n\n input.button {\n margin: 0 5px 5px 0;\n }\n\n .media-spoiler-toggle-buttons {\n margin-left: auto;\n\n .button {\n overflow: visible;\n margin: 0 0 5px 5px;\n float: right;\n }\n }\n}\n\n.back-link {\n margin-bottom: 10px;\n font-size: 14px;\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.spacer {\n flex: 1 1 auto;\n}\n\n.log-entry {\n line-height: 20px;\n padding: 15px 0;\n background: $ui-base-color;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n\n &:last-child {\n border-bottom: 0;\n }\n\n &__header {\n display: flex;\n justify-content: flex-start;\n align-items: center;\n color: $darker-text-color;\n font-size: 14px;\n padding: 0 10px;\n }\n\n &__avatar {\n margin-right: 10px;\n\n .avatar {\n display: block;\n margin: 0;\n border-radius: 50%;\n width: 40px;\n height: 40px;\n }\n }\n\n &__content {\n max-width: calc(100% - 90px);\n }\n\n &__title {\n word-wrap: break-word;\n }\n\n &__timestamp {\n color: $dark-text-color;\n }\n\n a,\n .username,\n .target {\n color: $secondary-text-color;\n text-decoration: none;\n font-weight: 500;\n }\n}\n\na.name-tag,\n.name-tag,\na.inline-name-tag,\n.inline-name-tag {\n text-decoration: none;\n color: $secondary-text-color;\n\n .username {\n font-weight: 500;\n }\n\n &.suspended {\n .username {\n text-decoration: line-through;\n color: lighten($error-red, 12%);\n }\n\n .avatar {\n filter: grayscale(100%);\n opacity: 0.8;\n }\n }\n}\n\na.name-tag,\n.name-tag {\n display: flex;\n align-items: center;\n\n .avatar {\n display: block;\n margin: 0;\n margin-right: 5px;\n border-radius: 50%;\n }\n\n &.suspended {\n .avatar {\n filter: grayscale(100%);\n opacity: 0.8;\n }\n }\n}\n\n.speech-bubble {\n margin-bottom: 20px;\n border-left: 4px solid $ui-highlight-color;\n\n &.positive {\n border-left-color: $success-green;\n }\n\n &.negative {\n border-left-color: lighten($error-red, 12%);\n }\n\n &.warning {\n border-left-color: $gold-star;\n }\n\n &__bubble {\n padding: 16px;\n padding-left: 14px;\n font-size: 15px;\n line-height: 20px;\n border-radius: 4px 4px 4px 0;\n position: relative;\n font-weight: 500;\n\n a {\n color: $darker-text-color;\n }\n }\n\n &__owner {\n padding: 8px;\n padding-left: 12px;\n }\n\n time {\n color: $dark-text-color;\n }\n}\n\n.report-card {\n background: $ui-base-color;\n border-radius: 4px;\n margin-bottom: 20px;\n\n &__profile {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 15px;\n\n .account {\n padding: 0;\n border: 0;\n\n &__avatar-wrapper {\n margin-left: 0;\n }\n }\n\n &__stats {\n flex: 0 0 auto;\n font-weight: 500;\n color: $darker-text-color;\n text-transform: uppercase;\n text-align: right;\n\n a {\n color: inherit;\n text-decoration: none;\n\n &:focus,\n &:hover,\n &:active {\n color: lighten($darker-text-color, 8%);\n }\n }\n\n .red {\n color: $error-value-color;\n }\n }\n }\n\n &__summary {\n &__item {\n display: flex;\n justify-content: flex-start;\n border-top: 1px solid darken($ui-base-color, 4%);\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n\n &__reported-by,\n &__assigned {\n padding: 15px;\n flex: 0 0 auto;\n box-sizing: border-box;\n width: 150px;\n color: $darker-text-color;\n\n &,\n .username {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n &__content {\n flex: 1 1 auto;\n max-width: calc(100% - 300px);\n\n &__icon {\n color: $dark-text-color;\n margin-right: 4px;\n font-weight: 500;\n }\n }\n\n &__content a {\n display: block;\n box-sizing: border-box;\n width: 100%;\n padding: 15px;\n text-decoration: none;\n color: $darker-text-color;\n }\n }\n }\n}\n\n.one-line {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.ellipsized-ip {\n display: inline-block;\n max-width: 120px;\n overflow: hidden;\n text-overflow: ellipsis;\n vertical-align: middle;\n}\n\n.admin-account-bio {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n margin-top: 20px;\n\n > div {\n box-sizing: border-box;\n padding: 0 5px;\n margin-bottom: 10px;\n flex: 1 0 50%;\n }\n\n .account__header__fields,\n .account__header__content {\n background: lighten($ui-base-color, 8%);\n border-radius: 4px;\n height: 100%;\n }\n\n .account__header__fields {\n margin: 0;\n border: 0;\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n\n .account__header__content {\n box-sizing: border-box;\n padding: 20px;\n color: $primary-text-color;\n }\n}\n\n.center-text {\n text-align: center;\n}\n\n.announcements-list {\n border: 1px solid lighten($ui-base-color, 4%);\n border-radius: 4px;\n\n &__item {\n padding: 15px 0;\n background: $ui-base-color;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n\n &__title {\n padding: 0 15px;\n display: block;\n font-weight: 500;\n font-size: 18px;\n line-height: 1.5;\n color: $secondary-text-color;\n text-decoration: none;\n margin-bottom: 10px;\n\n &:hover,\n &:focus,\n &:active {\n color: $primary-text-color;\n }\n }\n\n &__meta {\n padding: 0 15px;\n color: $dark-text-color;\n }\n\n &__action-bar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n &:last-child {\n border-bottom: 0;\n }\n }\n}\n","$emojis-requiring-outlines: '8ball' 'ant' 'back' 'black_circle' 'black_heart' 'black_large_square' 'black_medium_small_square' 'black_medium_square' 'black_nib' 'black_small_square' 'bomb' 'bowling' 'bust_in_silhouette' 'busts_in_silhouette' 'camera' 'camera_with_flash' 'clubs' 'copyright' 'curly_loop' 'currency_exchange' 'dark_sunglasses' 'eight_pointed_black_star' 'electric_plug' 'end' 'female-guard' 'film_projector' 'fried_egg' 'gorilla' 'guardsman' 'heavy_check_mark' 'heavy_division_sign' 'heavy_dollar_sign' 'heavy_minus_sign' 'heavy_multiplication_x' 'heavy_plus_sign' 'hocho' 'hole' 'joystick' 'kaaba' 'lower_left_ballpoint_pen' 'lower_left_fountain_pen' 'male-guard' 'microphone' 'mortar_board' 'movie_camera' 'musical_score' 'on' 'registered' 'soon' 'spades' 'speaking_head_in_silhouette' 'spider' 'telephone_receiver' 'tm' 'top' 'tophat' 'turkey' 'vhs' 'video_camera' 'video_game' 'water_buffalo' 'waving_black_flag' 'wavy_dash' !default;\n\n%emoji-outline {\n filter: drop-shadow(1px 1px 0 $primary-text-color) drop-shadow(-1px 1px 0 $primary-text-color) drop-shadow(1px -1px 0 $primary-text-color) drop-shadow(-1px -1px 0 $primary-text-color);\n}\n\n.emojione {\n @each $emoji in $emojis-requiring-outlines {\n &[title=':#{$emoji}:'] {\n @extend %emoji-outline;\n }\n }\n}\n\n.hicolor-privacy-icons {\n .status__visibility-icon.fa-globe,\n .composer--options--dropdown--content--item .fa-globe {\n color: #1976D2;\n }\n\n .status__visibility-icon.fa-unlock,\n .composer--options--dropdown--content--item .fa-unlock {\n color: #388E3C;\n }\n\n .status__visibility-icon.fa-lock,\n .composer--options--dropdown--content--item .fa-lock {\n color: #FFA000;\n }\n\n .status__visibility-icon.fa-envelope,\n .composer--options--dropdown--content--item .fa-envelope {\n color: #D32F2F;\n }\n}\n","body.rtl {\n direction: rtl;\n\n .column-header > button {\n text-align: right;\n padding-left: 0;\n padding-right: 15px;\n }\n\n .radio-button__input {\n margin-right: 0;\n margin-left: 10px;\n }\n\n .directory__card__bar .display-name {\n margin-left: 0;\n margin-right: 15px;\n }\n\n .display-name {\n text-align: right;\n }\n\n .notification__message {\n margin-left: 0;\n margin-right: 68px;\n }\n\n .drawer__inner__mastodon > img {\n transform: scaleX(-1);\n }\n\n .notification__favourite-icon-wrapper {\n left: auto;\n right: -26px;\n }\n\n .landing-page__logo {\n margin-right: 0;\n margin-left: 20px;\n }\n\n .landing-page .features-list .features-list__row .visual {\n margin-left: 0;\n margin-right: 15px;\n }\n\n .column-link__icon,\n .column-header__icon {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .compose-form .compose-form__buttons-wrapper .character-counter__wrapper {\n margin-right: 0;\n margin-left: 4px;\n }\n\n .composer--publisher {\n text-align: left;\n }\n\n .boost-modal__status-time,\n .favourite-modal__status-time {\n float: left;\n }\n\n .navigation-bar__profile {\n margin-left: 0;\n margin-right: 8px;\n }\n\n .search__input {\n padding-right: 10px;\n padding-left: 30px;\n }\n\n .search__icon .fa {\n right: auto;\n left: 10px;\n }\n\n .columns-area {\n direction: rtl;\n }\n\n .column-header__buttons {\n left: 0;\n right: auto;\n margin-left: 0;\n margin-right: -15px;\n }\n\n .column-inline-form .icon-button {\n margin-left: 0;\n margin-right: 5px;\n }\n\n .column-header__links .text-btn {\n margin-left: 10px;\n margin-right: 0;\n }\n\n .account__avatar-wrapper {\n float: right;\n }\n\n .column-header__back-button {\n padding-left: 5px;\n padding-right: 0;\n }\n\n .column-header__setting-arrows {\n float: left;\n }\n\n .setting-toggle__label {\n margin-left: 0;\n margin-right: 8px;\n }\n\n .setting-meta__label {\n float: left;\n }\n\n .status__avatar {\n margin-left: 10px;\n margin-right: 0;\n\n // Those are used for public pages\n left: auto;\n right: 10px;\n }\n\n .activity-stream .status.light {\n padding-left: 10px;\n padding-right: 68px;\n }\n\n .status__info .status__display-name,\n .activity-stream .status.light .status__display-name {\n padding-left: 25px;\n padding-right: 0;\n }\n\n .activity-stream .pre-header {\n padding-right: 68px;\n padding-left: 0;\n }\n\n .status__prepend {\n margin-left: 0;\n margin-right: 58px;\n }\n\n .status__prepend-icon-wrapper {\n left: auto;\n right: -26px;\n }\n\n .activity-stream .pre-header .pre-header__icon {\n left: auto;\n right: 42px;\n }\n\n .account__avatar-overlay-overlay {\n right: auto;\n left: 0;\n }\n\n .column-back-button--slim-button {\n right: auto;\n left: 0;\n }\n\n .status__relative-time,\n .activity-stream .status.light .status__header .status__meta {\n float: left;\n text-align: left;\n }\n\n .status__action-bar {\n &__counter {\n margin-right: 0;\n margin-left: 11px;\n\n .status__action-bar-button {\n margin-right: 0;\n margin-left: 4px;\n }\n }\n }\n\n .status__action-bar-button {\n float: right;\n margin-right: 0;\n margin-left: 18px;\n }\n\n .status__action-bar-dropdown {\n float: right;\n }\n\n .privacy-dropdown__dropdown {\n margin-left: 0;\n margin-right: 40px;\n }\n\n .privacy-dropdown__option__icon {\n margin-left: 10px;\n margin-right: 0;\n }\n\n .detailed-status__display-name .display-name {\n text-align: right;\n }\n\n .detailed-status__display-avatar {\n margin-right: 0;\n margin-left: 10px;\n float: right;\n }\n\n .detailed-status__favorites,\n .detailed-status__reblogs {\n margin-left: 0;\n margin-right: 6px;\n }\n\n .fa-ul {\n margin-left: 2.14285714em;\n }\n\n .fa-li {\n left: auto;\n right: -2.14285714em;\n }\n\n .admin-wrapper {\n direction: rtl;\n }\n\n .admin-wrapper .sidebar ul a i.fa,\n a.table-action-link i.fa {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .simple_form .check_boxes .checkbox label {\n padding-left: 0;\n padding-right: 25px;\n }\n\n .simple_form .input.with_label.boolean label.checkbox {\n padding-left: 25px;\n padding-right: 0;\n }\n\n .simple_form .check_boxes .checkbox input[type=\"checkbox\"],\n .simple_form .input.boolean input[type=\"checkbox\"] {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.radio_buttons .radio {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.radio_buttons .radio > label {\n padding-right: 28px;\n padding-left: 0;\n }\n\n .simple_form .input-with-append .input input {\n padding-left: 142px;\n padding-right: 0;\n }\n\n .simple_form .input.boolean label.checkbox {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.boolean .label_input,\n .simple_form .input.boolean .hint {\n padding-left: 0;\n padding-right: 28px;\n }\n\n .simple_form .label_input__append {\n right: auto;\n left: 3px;\n\n &::after {\n right: auto;\n left: 0;\n background-image: linear-gradient(to left, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));\n }\n }\n\n .simple_form select {\n background: darken($ui-base-color, 10%) url(\"data:image/svg+xml;utf8,\") no-repeat left 8px center / auto 16px;\n }\n\n .table th,\n .table td {\n text-align: right;\n }\n\n .filters .filter-subset {\n margin-right: 0;\n margin-left: 45px;\n }\n\n .landing-page .header-wrapper .mascot {\n right: 60px;\n left: auto;\n }\n\n .landing-page__call-to-action .row__information-board {\n direction: rtl;\n }\n\n .landing-page .header .hero .floats .float-1 {\n left: -120px;\n right: auto;\n }\n\n .landing-page .header .hero .floats .float-2 {\n left: 210px;\n right: auto;\n }\n\n .landing-page .header .hero .floats .float-3 {\n left: 110px;\n right: auto;\n }\n\n .landing-page .header .links .brand img {\n left: 0;\n }\n\n .landing-page .fa-external-link {\n padding-right: 5px;\n padding-left: 0 !important;\n }\n\n .landing-page .features #mastodon-timeline {\n margin-right: 0;\n margin-left: 30px;\n }\n\n @media screen and (min-width: 631px) {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n\n &:first-child {\n padding-left: 5px;\n padding-right: 10px;\n }\n }\n\n .columns-area > div {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n }\n }\n }\n\n .columns-area--mobile .column,\n .columns-area--mobile .drawer {\n padding-left: 0;\n padding-right: 0;\n }\n\n .public-layout {\n .header {\n .nav-button {\n margin-left: 8px;\n margin-right: 0;\n }\n }\n\n .public-account-header__tabs {\n margin-left: 0;\n margin-right: 20px;\n }\n }\n\n .landing-page__information {\n .account__display-name {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .account__avatar-wrapper {\n margin-left: 12px;\n margin-right: 0;\n }\n }\n\n .card__bar .display-name {\n margin-left: 0;\n margin-right: 15px;\n text-align: right;\n }\n\n .fa-chevron-left::before {\n content: \"\\F054\";\n }\n\n .fa-chevron-right::before {\n content: \"\\F053\";\n }\n\n .column-back-button__icon {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .column-header__setting-arrows .column-header__setting-btn:last-child {\n padding-left: 0;\n padding-right: 10px;\n }\n\n .simple_form .input.radio_buttons .radio > label input {\n left: auto;\n right: 0;\n }\n}\n",".dashboard__counters {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n margin-bottom: 20px;\n\n & > div {\n box-sizing: border-box;\n flex: 0 0 33.333%;\n padding: 0 5px;\n margin-bottom: 10px;\n\n & > div,\n & > a {\n padding: 20px;\n background: lighten($ui-base-color, 4%);\n border-radius: 4px;\n box-sizing: border-box;\n height: 100%;\n }\n\n & > a {\n text-decoration: none;\n color: inherit;\n display: block;\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 8%);\n }\n }\n }\n\n &__num,\n &__text {\n text-align: center;\n font-weight: 500;\n font-size: 24px;\n line-height: 21px;\n color: $primary-text-color;\n font-family: $font-display, sans-serif;\n margin-bottom: 20px;\n line-height: 30px;\n }\n\n &__text {\n font-size: 18px;\n }\n\n &__label {\n font-size: 14px;\n color: $darker-text-color;\n text-align: center;\n font-weight: 500;\n }\n}\n\n.dashboard__widgets {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n\n & > div {\n flex: 0 0 33.333%;\n margin-bottom: 20px;\n\n & > div {\n padding: 0 5px;\n }\n }\n\n a:not(.name-tag) {\n color: $ui-secondary-color;\n font-weight: 500;\n text-decoration: none;\n }\n}\n","// components.scss\n.compose-form {\n .compose-form__modifiers {\n .compose-form__upload {\n &-description {\n input {\n &::placeholder {\n opacity: 1.0;\n }\n }\n }\n }\n }\n}\n\n.rich-formatting a,\n.rich-formatting p a,\n.rich-formatting li a,\n.landing-page__short-description p a,\n.status__content a,\n.reply-indicator__content a {\n color: lighten($ui-highlight-color, 12%);\n text-decoration: underline;\n\n &.mention {\n text-decoration: none;\n }\n\n &.mention span {\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n\n &.status__content__spoiler-link {\n color: $secondary-text-color;\n text-decoration: none;\n }\n}\n\n.status__content__read-more-button {\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n}\n\n.getting-started__footer a {\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n}\n\n.nothing-here {\n color: $darker-text-color;\n}\n\n.public-layout .public-account-header__tabs__tabs .counter.active::after {\n border-bottom: 4px solid $ui-highlight-color;\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/packs/skins/glitch/contrast/common.js b/priv/static/packs/skins/glitch/contrast/common.js index af82696b8..adca386cf 100644 Binary files a/priv/static/packs/skins/glitch/contrast/common.js and b/priv/static/packs/skins/glitch/contrast/common.js differ diff --git a/priv/static/packs/skins/glitch/mastodon-light/common.css b/priv/static/packs/skins/glitch/mastodon-light/common.css index 4f1274786..90aa2181c 100644 Binary files a/priv/static/packs/skins/glitch/mastodon-light/common.css and b/priv/static/packs/skins/glitch/mastodon-light/common.css differ diff --git a/priv/static/packs/skins/glitch/mastodon-light/common.css.map b/priv/static/packs/skins/glitch/mastodon-light/common.css.map index 049a2d972..88fa5f09b 100644 --- a/priv/static/packs/skins/glitch/mastodon-light/common.css.map +++ b/priv/static/packs/skins/glitch/mastodon-light/common.css.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///common.scss","webpack:///./app/javascript/flavours/glitch/styles/reset.scss","webpack:///./app/javascript/flavours/glitch/styles/mastodon-light/variables.scss","webpack:///./app/javascript/flavours/glitch/styles/basics.scss","webpack:///./app/javascript/flavours/glitch/styles/containers.scss","webpack:///./app/javascript/flavours/glitch/styles/_mixins.scss","webpack:///./app/javascript/flavours/glitch/styles/variables.scss","webpack:///./app/javascript/flavours/glitch/styles/lists.scss","webpack:///./app/javascript/flavours/glitch/styles/modal.scss","webpack:///./app/javascript/flavours/glitch/styles/footer.scss","webpack:///./app/javascript/flavours/glitch/styles/compact_header.scss","webpack:///./app/javascript/flavours/glitch/styles/widgets.scss","webpack:///./app/javascript/flavours/glitch/styles/forms.scss","webpack:///./app/javascript/flavours/glitch/styles/accounts.scss","webpack:///./app/javascript/flavours/glitch/styles/statuses.scss","webpack:///./app/javascript/flavours/glitch/styles/components/index.scss","webpack:///./app/javascript/flavours/glitch/styles/components/boost.scss","webpack:///./app/javascript/flavours/glitch/styles/components/accounts.scss","webpack:///./app/javascript/flavours/glitch/styles/components/domains.scss","webpack:///./app/javascript/flavours/glitch/styles/components/status.scss","webpack:///./app/javascript/flavours/glitch/styles/components/modal.scss","webpack:///./app/javascript/flavours/glitch/styles/components/composer.scss","webpack:///./app/javascript/flavours/glitch/styles/components/columns.scss","webpack:///./app/javascript/flavours/glitch/styles/components/regeneration_indicator.scss","webpack:///./app/javascript/flavours/glitch/styles/components/directory.scss","webpack:///./app/javascript/flavours/glitch/styles/components/search.scss","webpack:///","webpack:///./app/javascript/flavours/glitch/styles/components/emoji.scss","webpack:///./app/javascript/flavours/glitch/styles/components/doodle.scss","webpack:///./app/javascript/flavours/glitch/styles/components/drawer.scss","webpack:///./app/javascript/flavours/glitch/styles/components/media.scss","webpack:///./app/javascript/flavours/glitch/styles/components/sensitive.scss","webpack:///./app/javascript/flavours/glitch/styles/components/lists.scss","webpack:///./app/javascript/flavours/glitch/styles/components/emoji_picker.scss","webpack:///./app/javascript/flavours/glitch/styles/components/local_settings.scss","webpack:///./app/javascript/flavours/glitch/styles/components/error_boundary.scss","webpack:///./app/javascript/flavours/glitch/styles/components/single_column.scss","webpack:///./app/javascript/flavours/glitch/styles/polls.scss","webpack:///./app/javascript/flavours/glitch/styles/about.scss","webpack:///./app/javascript/flavours/glitch/styles/tables.scss","webpack:///./app/javascript/flavours/glitch/styles/admin.scss","webpack:///./app/javascript/flavours/glitch/styles/accessibility.scss","webpack:///./app/javascript/flavours/glitch/styles/rtl.scss","webpack:///./app/javascript/flavours/glitch/styles/dashboard.scss","webpack:///./app/javascript/flavours/glitch/styles/mastodon-light/diff.scss"],"names":[],"mappings":"AAAA,2ZCKA,QAaE,UACA,SACA,eACA,aACA,wBACA,+EAIF,aAEE,MAGF,aACE,OAGF,eACE,cAGF,WACE,qDAGF,UAEE,aACA,OAGF,wBACE,iBACA,MAGF,0CACE,qBAGF,UACE,YACA,2BAGF,kBACE,cACA,mBACA,iCAGF,kBACE,kCAGF,kBACE,2BAGF,aACE,gBACA,8BACA,CC3EwB,iEDkF1B,kBClF0B,4BDsF1B,sBACE,MEtFF,sBACE,mBACA,eACA,iBACA,gBACA,WDXM,kCCaN,6BACA,8BACA,CADA,0BACA,CADA,yBACA,CADA,qBACA,0CACA,wCACA,kBAEA,sIAYE,eAGF,SACE,oCAEA,WACE,iBACA,kBACA,uCAGF,iBACE,WACA,YACA,mCAGF,iBACE,cAIJ,kBDjDwB,kBCqDxB,iBACE,kBACA,0BAEA,iBACE,YAIJ,kBACE,SACA,iBACA,uBAEA,iBACE,WACA,YACA,gBACA,YAIJ,kBACE,UACA,YAGF,iBACE,kBACA,cDpFiB,mBAEK,WCqFtB,YACA,UACA,aACA,uBACA,mBACA,oBAEA,qBACE,YACA,wBAEA,aACE,gBACA,WACA,YACA,kBACA,uBAGF,cACE,iBACA,gBACA,QAMR,mBACE,eACA,cAEA,YACE,6BAKF,YAEE,WACA,mBACA,uBACA,oBACA,yEAKF,gBAEE,+EAKF,WAEE,gBCrJJ,WACE,CACA,kBACA,qCAEA,eALF,UAMI,SACA,kBAIJ,sBACE,qCAEA,gBAHF,kBAII,qBAGF,YACE,uBACA,mBACA,wBAEA,SFtBI,YEwBF,kBACA,sBAGF,YACE,uBACA,mBACA,WF/BE,qBEiCF,UACA,kBACA,iBACA,uBACA,gBACA,eACA,mCAMJ,WACE,CACA,cACA,mBACA,sBACA,qCAEA,kCAPF,UAQI,aACA,aACA,kBAKN,WACE,CACA,YACA,eACA,iBACA,sBACA,CACA,gBACA,CACA,sBACA,qCAEA,gBAZF,UAaI,CACA,eACA,CACA,mBACA,0BAKA,UACqB,sCC3EvB,iBD4EE,6BAEA,UACE,YACA,cACA,SACA,kBACA,iBE5BkB,wBD9DtB,4BACA,uBD8FA,aACE,cF9FiB,wBEgGjB,iCAEA,aACE,gBACA,uBACA,gBACA,8BAIJ,aACE,eACA,iBACA,gBACA,SAIJ,YACE,cACA,8BACA,sBACA,mCACA,CADA,0BACA,mBAEA,eACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,eACE,WACA,qCAGF,QA3BF,UA4BI,qCACA,mBAEA,aACE,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,UAKN,YACE,cACA,8CACA,sBACA,mCACA,CADA,0BACA,mBAEA,eACE,WACA,mBAGF,eACE,WACA,mBAGF,aACE,WACA,mBAGF,eACE,WACA,mBAGF,aACE,WACA,uCAGF,eACE,wBAGF,kBACE,qCAGF,QAxCF,iDAyCI,uCAEA,YACE,aACA,mBACA,uBACA,iCAGF,UACE,uBACA,mBACA,sBAGF,YACE,sCAIJ,QA7DF,UA8DI,qCACA,mBAEA,aACE,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,sCAMJ,eADF,gBAEI,4BAGF,eACE,qCAEA,0BAHF,SAII,yBAIJ,kBACE,mCACA,kBACA,YACA,cACA,aACA,oBACA,uBACA,iBACA,gBACA,qCAEA,uBAZF,cAaI,WACA,MACA,OACA,SACA,gBACA,gBACA,YACA,6BAGF,cACE,eACA,kCAGF,YACE,oBACA,2BACA,iBACA,oCAGF,YACE,oBACA,uBACA,iBACA,mCAGF,YACE,oBACA,yBACA,iBACA,+BAGF,aACE,aACA,mCAEA,aACE,YACA,WACA,kBACA,YACA,UF3UA,qCE8UA,kCARF,WASI,+GAIJ,kBAGE,kCAIJ,YACE,mBACA,eACA,eACA,gBACA,qBACA,cF7Ve,mBE+Vf,kBACA,uHAEA,yBAGE,WFxWA,qCE4WF,0CACE,YACE,qCAKN,kBACE,CACA,oBACA,kBACA,6HAEA,oBAGE,mBACA,sBAON,YACE,cACA,0DACA,sBACA,mCACA,CADA,0BACA,gCAEA,UACE,cACA,gCAGF,UACE,cACA,qCAGF,qBAjBF,0BAkBI,WACA,gCAEA,YACE,kCAKN,iBACE,qCAEA,gCAHF,eAII,sCAKF,4BADF,eAEI,wCAIJ,eACE,mBACA,mCACA,gDAEA,UACE,qIAEA,8BAEE,CAFF,sBAEE,6DAGF,wBFvbe,8CE4bjB,yBACE,gBACA,aACA,kBACA,gBACA,oDAEA,UACE,cACA,kBACA,WACA,YACA,gDACA,MACA,OACA,kDAGF,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,0BACA,qCAGF,6CA3BF,YA4BI,gDAIJ,eACE,6JAEA,iBAEE,qCAEA,4JAJF,eAKI,sCAKN,sCA/DF,eAgEI,gBACA,oDAEA,YACE,+FAGF,eAEE,6CAIJ,iBACE,iBACA,aACA,2BACA,mDAEA,UACE,cACA,mBACA,kBACA,SACA,OACA,QACA,YACA,0BACA,WACA,oDAGF,aACE,CAEA,WACqB,yCCzgB3B,kBD0gBM,cACA,wDAEA,aACE,WACA,YACA,SACA,kBACA,yBACA,mBACA,iBE7dc,wBD9DtB,4BACA,qCD+hBI,2CAvCF,YAwCI,mBACA,0BACA,YACA,mDAEA,YACE,oDAKA,UACqB,sCCtiB7B,CDuiBQ,sBACA,wDAEA,QACE,kBACA,iBErfY,wBD9DtB,4BACA,2DDsjBQ,mDAbF,YAcI,sCAKN,2CApEF,eAqEI,sCAGF,2CAxEF,cAyEI,8CAIJ,aACE,iBACA,mDAEA,gBACE,mBACA,sDAEA,cACE,iBACA,WFjlBF,gBEmlBE,gBACA,mBACA,uBACA,6BACA,4DAEA,aACE,eACA,WF3lBJ,gBE6lBI,gBACA,uBACA,qCAKN,4CA7BF,gBA8BI,aACA,8BACA,mBACA,mDAEA,aACE,iBACA,sDAEA,cACE,iBACA,iBACA,4DAEA,aFhnBS,oDEunBf,YACE,2BACA,oBACA,YACA,qEAEA,YACE,mBACA,gBACA,qCAGF,oEACE,YACE,6DAIJ,eACE,sBACA,cACA,cF5oBW,aE8oBX,+BACA,eACA,kBACA,kBACA,8DAEA,aACE,uEAGF,cACE,kEAGF,aACE,WACA,kBACA,SACA,OACA,WACA,gCACA,WACA,wBACA,yEAIA,+BACE,UACA,kFAGF,2BF9qBS,wEEorBT,SACE,wBACA,8DAIJ,oBACE,cACA,2EAGF,cACE,cACA,4EAGF,eACE,eACA,kBACA,WF1sBJ,uBE4sBI,2DAIJ,aACE,WACA,4DAGF,eACE,8CAKN,YACE,eACA,kEAEA,eACE,gBACA,uBACA,cACA,2FAEA,4BACE,yEAGF,YACE,qDAIJ,gBACE,eACA,cF7uBa,uDEgvBb,oBACE,cFjvBW,qBEmvBX,aACA,gBACA,8DAEA,eACE,WF3vBJ,qCEiwBF,6CAtCF,aAuCI,UACA,4CAKN,yBACE,qCAEA,0CAHF,eAII,wCAIJ,eACE,oCAGF,kBACE,mCACA,kBACA,gBACA,mBACA,qCAEA,mCAPF,eAQI,gBACA,gBACA,8DAGF,QACE,aACA,+DAEA,aACE,sFAGF,uBACE,yEAGF,aE3yBU,8DFizBV,mBACA,WFpzBE,qFEwzBJ,YAEE,eACA,cFxzBe,2CE4zBjB,gBACE,iCAIJ,YACE,cACA,kDACA,qCAEA,gCALF,aAMI,+CAGF,cACE,iCAIJ,eACE,2BAGF,YACE,eACA,eACA,cACA,+BAEA,qBACE,cACA,YACA,cACA,mBACA,kBACA,qCAEA,8BARF,aASI,sCAGF,8BAZF,cAaI,sCAIJ,0BAvBF,QAwBI,6BACA,+BAEA,UACE,UACA,gBACA,gCACA,0CAEA,eACE,0CAGF,kBFt3BkB,+IEy3BhB,kBAGE,WGl4BZ,eACE,aAEA,oBACE,aACA,iBAIJ,eACE,cACA,oBAEA,cACE,gBACA,mBACA,eChBJ,k1BACE,aACA,sBACA,aACA,UACA,yBAGF,YACE,OACA,sBACA,yBACA,2BAEA,MACE,iBACA,qCAIJ,gBACE,YACE,yBCrBF,eACE,iBACA,oBACA,eACA,cACA,qCAEA,uBAPF,iBAQI,mBACA,+BAGF,YACE,cACA,0CACA,wCAEA,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,kBACA,6CAEA,aACE,wCAIJ,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,qCAGF,6BAxCF,iCAyCI,+EAEA,aAEE,wCAGF,UACE,wCAGF,aACE,+EAGF,aAEE,wCAGF,UACE,sCAIJ,uCACE,aACE,sCAIJ,4JACE,YAIE,4BAKN,wBACE,gBACA,kBACA,cP9Fe,6BOiGf,aACE,qBACA,6BAIJ,oBACE,cACA,wGAEA,yBAGE,mCAKF,aACE,YACA,WACA,cACA,aACA,0HAMA,YACE,oBClIR,cACE,iBACA,cACA,gBACA,mBACA,eACA,qBACA,qCAEA,mBATF,iBAUI,oBACA,uBAGF,aACE,qBACA,0BAGF,eACE,cRjBe,wBQqBjB,oBACE,mBACA,kBACA,WACA,YACA,cC9BN,kBACE,mCACA,mBAEA,UACE,kBACA,gBACA,0BACA,gBLPI,uBKUJ,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,0BACA,oBAIJ,kBTfwB,aSiBtB,0BACA,eACA,cTrBiB,iBSuBjB,qBACA,gBACA,8BAEA,UACE,YACA,gBACA,sBAGF,kBACE,iCAEA,eACE,uBAIJ,cACE,SACA,UACA,gBACA,uBACA,oBACA,kBACA,oBACA,cACA,sBAGF,aTrDiB,qBSuDf,4BAEA,yBACE,qCAKN,aAnEF,YAoEI,uBAIJ,kBACE,oBACA,yBAEA,YACE,yBACA,gBACA,eACA,cT5EiB,+BSgFnB,cACE,0CAEA,eACE,sDAGF,YACE,mBACA,gDAGF,UACE,YACA,0BACA,oCAIJ,YACE,mBAKF,aTzGmB,aS8GrB,YACE,kBACA,mBT9GwB,mCSgHxB,qBAGF,YACE,kBACA,0BACA,kBACA,cTzHmB,mBS2HnB,iBAGF,eACE,eACA,cThImB,iBSkInB,qBACA,gBACA,UACA,oBAEA,YACE,yBACA,gBACA,eACA,cT3IiB,0BS+InB,eACE,CACA,kBACA,mBAGF,oBACE,CACA,mBACA,cTxJiB,qBS0JjB,mBACA,gBACA,uBACA,0EAEA,yBAGE,uBAMJ,sBACA,kBACA,mBTxKwB,mCS0KxB,cT5KmB,gBS8KnB,mBACA,sDAEA,eAEE,CAII,qXADF,eACE,yBAKN,aACE,0BACA,CAMI,wLAGF,oBAGE,mIAEA,yBACE,gCAMR,kBACE,oCAEA,gBACE,cTvNe,8DS6NjB,iBACE,eACA,4DAGF,eACE,qBACA,iEAEA,eACE,kBAMR,YACE,CACA,eLlPM,CKoPN,cACA,cTlPmB,mBSoPnB,+BANA,iBACA,CLlPM,kCKgQN,CATA,aAGF,kBACE,CAEA,iBACA,kBACA,cACA,iBAEA,UTlQM,eSoQJ,gBACA,gBACA,mBACA,gBAGF,cACE,cTxQiB,qCS4QnB,aArBF,YAsBI,mBACA,iBAEA,cACE,aAKN,kBTpR0B,kBSsRxB,mCACA,iBAEA,qBACE,mBACA,uCAEA,YAEE,mBACA,8BACA,mBTjSoB,kBSmSpB,aACA,qBACA,cACA,mCACA,0EAIA,kBAGE,0BAIJ,kBTjTsB,eSmTpB,8BAGF,UACE,eACA,oBAGF,aACE,eACA,gBACA,WTpUE,mBSsUF,gBACA,uBACA,wBAEA,aTvUe,0BS2Uf,aACE,gBACA,eACA,eACA,cT/Ua,yFSqVf,UTxVE,+BS+VJ,aACE,YACA,uDAGF,oBT9VsB,eSoW1B,YACE,yBACA,gCAEA,aACE,WACA,YACA,kBACA,kBACA,kBACA,mBACA,yBACA,4CAEA,SACE,6CAGF,SACE,6CAGF,SACE,iBAKN,UACE,0BAEA,SACE,SACA,wBAGF,eACE,0BAGF,iBACE,yBACA,cTjZiB,gBSmZjB,aACA,sCAEA,eACE,0BAIJ,cACE,sBACA,gCACA,wCAGF,eACE,wBAGF,WACE,kBACA,eACA,gBACA,WT5aI,8BS+aJ,aACE,cT7ae,gBS+af,eACA,0BAIJ,SACE,iCACA,qCAGF,kCACE,YACE,sCAYJ,qIAPF,eAQI,gBACA,gBACA,iBAOJ,gBACE,qCAEA,eAHF,oBAII,uBAGF,sBACE,sCAEA,qBAHF,sBAII,sCAGF,qBAPF,UAQI,sCAGF,qBAXF,WAYI,kCAIJ,iBACE,qCAEA,gCAHF,4BAII,iEAIA,eACE,0DAGF,cACE,iBACA,oEAEA,UACE,YACA,gBACA,yFAGF,gBACE,SACA,mKAIJ,eAGE,gBAON,aT9gBmB,iCS6gBrB,kBAKI,6BAEA,eACE,kBAIJ,cACE,iBACA,wCAMF,oBACE,gBACA,cThiBsB,4JSmiBtB,yBAGE,oBAKN,kBACE,gBACA,eACA,kBACA,yBAEA,aACE,gBACA,aACA,CACA,kBACA,gBACA,uBACA,qBACA,WT/jBI,gCSikBJ,4FAEA,yBAGE,oCAIJ,eACE,0BAGF,iBACE,gCACA,MC/kBJ,+BACE,gBACA,iBAGF,eACE,aACA,cACA,qBAIA,kBACE,gBACA,4BAEA,QACE,0CAIA,kBACE,qDAEA,eACE,gDAIJ,iBACE,kBACA,sDAEA,iBACE,SACA,OACA,6BAKN,iBACE,gBACA,gDAEA,mBACE,eACA,gBACA,WVjDA,cUmDA,WACA,4EAGF,iBAEE,mDAGF,eACE,4CAGF,iBACE,QACA,OACA,qCAGF,aVhEoB,0BUkElB,gIAEA,oBAGE,0CAIJ,iBACE,CACA,iBACA,mBAKN,YACE,cACA,0BAEA,qBACE,cACA,UACA,cACA,oBAIJ,aVlGmB,sBUqGjB,aVlGsB,yBUsGtB,iBACE,kBACA,gBACA,wBAIJ,aACE,eACA,eACA,qBAGF,kBACE,cVvHiB,iCU0HjB,iBACE,eACA,iBACA,gBACA,gBACA,oBAIJ,kBACE,qBAGF,eACE,CAII,0JADF,eACE,sDAMJ,YACE,4DAEA,mBACE,eACA,WV1JA,gBU4JA,gBACA,cACA,wHAGF,aAEE,sDAIJ,cACE,kBACA,mDAKF,mBACE,eACA,WVhLE,cUkLF,kBACA,qBACA,gBACA,sCAGF,cACE,mCAGF,UACE,sCAIJ,cACE,4CAEA,mBACE,eACA,WVtME,cUwMF,gBACA,gBACA,4CAGF,kBACE,yCAGF,cACE,CADF,cACE,6BAIJ,oBACE,cACA,4BAGF,kBACE,8CAEA,eACE,0BAIJ,YACE,CACA,eACA,oBACA,iCAEA,cACE,kCAGF,qBACE,eACA,cACA,eACA,oCAEA,aACE,2CAGF,eACE,6GAIJ,eAEE,qCAGF,yBA9BF,aA+BI,gBACA,kCAEA,cACE,0JAGF,kBAGE,iDAKN,iBACE,oBACA,eACA,WVpRI,cUsRJ,WACA,2CAKE,mBACE,eACA,WV9RA,qBUgSA,WACA,kBACA,gBACA,kBACA,cACA,0DAGF,iBACE,OACA,QACA,SACA,kDAKN,cACE,aACA,yBACA,kBACA,sJAGF,qBAKE,eACA,WV9TI,cUgUJ,WACA,UACA,oBACA,gBACA,mBACA,sBACA,kBACA,aACA,6RAEA,aACE,CAHF,+OAEA,aACE,CAHF,mQAEA,aACE,CAHF,wQAEA,aACE,CAHF,sNAEA,aACE,8LAGF,eACE,oVAGF,oBACE,iOAGF,oBNpVY,oLMwVZ,iBACE,4WAGF,oBVxVsB,mBU2VpB,6CAKF,aACE,gUAGF,oBAME,8CAGF,aACE,gBACA,cACA,eACA,8BAIJ,UACE,uBAGF,eACE,aACA,oCAEA,YACE,mBACA,qEAIJ,aAGE,WACA,SACA,kBACA,mBVzYsB,WANlB,eUkZJ,oBACA,YACA,aACA,yBACA,qBACA,kBACA,sBACA,eACA,gBACA,UACA,mBACA,kBACA,sGAEA,cACE,uFAGF,wBACE,gLAGF,wBAEE,kHAGF,wBVzaoB,gGU6apB,kBN9aQ,kHMibN,wBACE,sOAGF,wBAEE,qBAKN,uBACE,CADF,oBACE,CADF,eACE,sBACA,eACA,WVlcI,cUocJ,WACA,UACA,oBACA,gBACA,wXACA,sBACA,kBACA,kBACA,mBACA,YACA,iBAGF,4BACE,oCAIA,iBACE,mCAGF,iBACE,UACA,QACA,CACA,qBACA,eACA,cVhdY,oBUkdZ,oBACA,eACA,gBACA,mBACA,gBACA,yCAEA,UACE,cACA,kBACA,MACA,QACA,WACA,UACA,oEACA,4BAKN,iBACE,0CAEA,wBACE,CADF,gBACE,qCAGF,iBACE,MACA,OACA,WACA,YACA,aACA,uBACA,mBACA,iCACA,kBACA,iBACA,gBACA,YACA,8CAEA,iBACE,6HAGE,UVhhBF,aU0hBR,aACE,CACA,kBACA,eACA,gBAGF,kBACE,cV/hBmB,kBUiiBnB,kBACA,mBACA,kBACA,uBAEA,qCACE,iCACA,cNziBY,sBM6iBd,mCACE,+BACA,cN9iBQ,kBMkjBV,oBACE,cVnjBiB,qBUqjBjB,wBAEA,UV1jBI,0BU4jBF,kBAIJ,kBACE,4BAGF,SACE,sBACA,cACA,WACA,YACA,aACA,gCACA,mBVtkBsB,WALlB,eU8kBJ,SACA,8CAEA,QACE,iHAGF,mBAGE,kCAGF,kBACE,uBAIJ,eACE,CAII,oKADF,eACE,0DAKN,eAzEF,eA0EI,eAIJ,eACE,kBACA,gBAEA,aVhnBmB,qBUknBjB,sBAEA,yBACE,YAKN,eACE,mBACA,eACA,eAEA,oBACE,kBACA,cAGF,aVjoBwB,yBUmoBtB,qBACA,gBACA,2DAEA,aAGE,8BAKN,kBAEE,cVppBmB,oCUupBnB,cACE,mBACA,kBACA,4CAGF,aV7pBmB,gBU+pBjB,CAII,mUADF,eACE,0DAKN,6BAtBF,eAuBI,cAIJ,YACE,eACA,uBACA,UAGF,aACE,gBNtrBM,YMwrBN,qBACA,mCACA,qBACA,cAEA,aACE,SACA,iBAIJ,kBACE,cVlsBmB,WUosBnB,sBAEA,aACE,eACA,eAKF,kBACE,sBAEA,eACE,CAII,+JADF,eACE,4CASR,qBACE,8BACA,WVnuBI,qCUquBJ,oCACA,kBACA,aACA,mBACA,gDAEA,UV3uBI,0BU6uBF,oLAEA,oBAGE,0DAIJ,eACE,cACA,kBACA,CAII,yYADF,eACE,kEAIJ,eACE,oBAMR,YACE,eACA,mBACA,4DAEA,aAEE,6BAIA,wBACA,cACA,sBAIJ,iBACE,cVvxBmB,0BU0xBnB,iBACE,oBAIJ,eACE,mBACA,uBAEA,cACE,WVvyBI,kBUyyBJ,mBACA,SACA,UACA,4BAGF,aACE,eAIJ,aNhzBc,0SM0zBZ,+BACE,aAIJ,kBACE,sBACA,kBACA,aACA,mBACA,kBACA,kBACA,QACA,mCACA,sBAEA,aACE,8BAGF,sBACE,SACA,aACA,eACA,gCACA,oBAGF,aACE,WACA,oBACA,gBACA,eACA,CACA,oBACA,WACA,iCACA,oBAGF,oBNp2Bc,gBMs2BZ,2BAEA,kBNx2BY,gBM02BV,oBAKN,kBACE,6BAEA,wBACE,mBACA,eACA,aACA,4BAGF,kBACE,aACA,OACA,sBACA,cACA,cACA,gCAEA,iBACE,YACA,iBACA,kBACA,UACA,8BAGF,qBACE,qCAIJ,kBACE,gCAGF,wBACE,mCACA,kBACA,kBACA,kBACA,kBACA,sCAEA,wBACE,WACA,cACA,YACA,SACA,kBACA,MACA,UACA,yBAIJ,sBACE,aACA,mBACA,SC36BF,aACE,qBACA,cACA,mCACA,qCAEA,QANF,eAOI,8EAMA,kBACE,YAKN,YACE,kBACA,gBACA,0BACA,gBAEA,aACE,WACA,YACA,SACA,oBACA,CADA,8BACA,CADA,gBACA,0BACA,qCAGF,WAfF,YAgBI,sCAGF,WAnBF,YAoBI,aAIJ,iBACE,aACA,aACA,2BACA,mBACA,mBACA,0BACA,qCAEA,WATF,eAUI,qBAGF,aACE,CAEA,UACqB,sCRpDzB,gBQqDI,wBAEA,UACE,YACA,cACA,SACA,kBACA,iBPLgB,wBD9DtB,4BACA,mBQoEM,oBACA,CADA,8BACA,CADA,gBACA,0BAIJ,gBACE,gBACA,iCAEA,cACE,WXhFA,gBWkFA,gBACA,uBACA,+BAGF,aACE,eACA,cXtFa,gBWwFb,gBACA,uBACA,aAMR,cACE,kBACA,gBACA,6GAEA,cAME,WX9GI,gBWgHJ,qBACA,iBACA,qBACA,sBAGF,ePrHM,oBOuHJ,WXxHI,eW0HJ,cACA,kBAGF,cACE,uCAGF,wBAEE,cXjIiB,oBWqInB,UACE,eACA,wBAEA,oBACE,iBACA,oBAIJ,WACE,gBACA,wBAEA,oBACE,gBACA,uBAIJ,cACE,WACA,qCAGF,YA9DF,iBA+DI,mBAEA,YACE,uCAGF,oBAEE,gBAKN,kBX1K0B,mCW4KxB,cXxJiB,eW0JjB,gBACA,kBACA,aACA,uBACA,mBACA,eACA,kBACA,aACA,gBACA,2BAEA,yBACE,yBAGF,qBACE,gBACA,yCAIJ,oBAEE,gBACA,eACA,kBACA,eACA,iBACA,gBACA,cX7MmB,mCW+MnB,mCACA,6DAEA,aPnNc,sCOqNZ,kCACA,qDAGF,aACE,oCACA,gCACA,0BAIJ,eACE,UACA,wBACA,gBACA,CADA,YACA,CACA,iCACA,CADA,uBACA,CADA,kBACA,eACA,iBACA,6BAEA,YACE,gCACA,yDAGF,qBAEE,aACA,kBACA,gBACA,gBACA,mBACA,uBACA,6BAGF,eACE,YACA,cACA,cX5PiB,gCW8PjB,6BAGF,aACE,cXlQiB,4BWsQnB,aXnQwB,qBWqQtB,qGAEA,yBAGE,oCAIJ,qCACE,iCACA,sCAEA,aPtRY,gBOwRV,0CAGF,aP3RY,wCOgSd,eACE,wCAIJ,UACE,0BAIA,aXzSmB,4BW4SjB,aX5SiB,qBW8Sf,qGAEA,yBAGE,iCAIJ,UX1TI,gBW4TF,wBAIJ,eACE,kBClUJ,kCACE,kBACA,gBACA,mBACA,qCAEA,iBANF,eAOI,gBACA,gBACA,6BAGF,eACE,SACA,gBACA,gFAEA,yBAEE,sCAIJ,UACE,yBAGF,kBZrBwB,6GYwBtB,sBAGE,CAHF,cAGE,8IAIA,eAGE,0BACA,iJAKF,yBAGE,kLAIA,iBAGE,qCAKN,4GACE,yBAGE,uCAKN,kBACE,qBAIJ,WACE,eACA,mBZtEwB,WANlB,oBY+EN,iBACA,YACA,iBACA,SACA,yBAEA,UACE,YACA,sBACA,iBACA,UZzFI,gFY6FN,kBAGE,qNAKA,kBZjGoB,4IYyGpB,kBR1GQ,qCQiHV,wBACE,YACE,0DAOJ,YACE,uCAGF,2BACE,gBACA,uDAEA,SACE,SACA,yDAGF,eACE,yDAKA,cACA,iBACA,mBACA,mFAGF,iBACE,eACA,WACA,WACA,WACA,qMAGF,eAGE,mEASF,cACE,gBACA,qFAGF,aZ/Jc,YYiKZ,eACA,WACA,eACA,gBACA,+GAGF,aACE,eACA,CACA,sBACA,eACA,yJAEA,cACE,uEAIJ,WACE,kBACA,WACA,eACA,iDAQF,iBACE,mBACA,yHAEA,iBACE,gBACA,+FAGF,UACE,WC3NR,gCACE,4CACA,cAGF,aACE,eACA,iBACA,cbDwB,SaGxB,uBACA,UACA,eACA,wCAEA,yBAEE,uBAGF,abfsB,eaiBpB,SAIJ,wBACE,YACA,kBACA,sBACA,Wb7BM,ea+BN,qBACA,oBACA,eACA,gBACA,YACA,iBACA,iBACA,gBACA,eACA,kBACA,kBACA,yBACA,qBACA,uBACA,2BACA,qCACA,mBACA,WACA,4CAEA,wBAGE,4BACA,qCACA,sBAGF,eACE,mFAEA,wBT3DQ,gBS+DN,kBAIJ,wBblEsB,eaoEpB,yGAGF,cAIE,iBACA,YACA,oBACA,iBACA,4BAGF,UbtFM,mBAIgB,qGasFpB,wBAGE,8BAIJ,kBbxFsB,2Ga2FpB,wBAGE,0BAIJ,cACE,iBACA,YACA,cb3GiB,oBa6GjB,uBACA,iBACA,kBACA,yBACA,+FAEA,oBAGE,cACA,mCAGF,UACE,uBAIJ,aACE,WACA,cAIJ,oBACE,UACA,cbzHoB,Sa2HpB,kBACA,uBACA,eACA,2BACA,2CACA,2DAEA,aAGE,sCACA,4BACA,2CACA,oBAGF,oCACE,uBAGF,aACE,6BACA,eACA,qBAGF,abhKwB,gCaoKxB,QACE,uEAGF,mBAGE,uBAGF,abjLmB,sFaoLjB,aAGE,oCACA,6BAGF,kCACE,gCAGF,aACE,6BACA,8BAGF,abjMsB,uCaoMpB,aACE,wBAKN,sBACE,8BACA,qBACA,kBACA,YACA,8BAEA,6BACE,mBAKN,ab1NqB,Sa4NnB,kBACA,uBACA,eACA,gBACA,eACA,cACA,iBACA,UACA,2BACA,2CACA,0EAEA,aAGE,oCACA,4BACA,2CACA,yBAGF,kCACE,4BAGF,UACE,6BACA,eACA,0BAGF,abxPwB,qCa4PxB,QACE,sFAGF,mBAGE,gBAIJ,iBACE,uBACA,YAGF,WACE,cACA,qBACA,QACA,SACA,kBACA,+BAEA,kBAEE,mBACA,oBACA,kBACA,mBACA,iBAKF,WACE,uCAIJ,MACE,kBACA,CTvSU,sES8SZ,aT9SY,uBSkTZ,aTnTc,4DSyTV,4CACE,CADF,oCACE,8DAKF,6CACE,CADF,qCACE,6BAKN,aACE,gBACA,qBACA,mCAEA,Ub9UM,0BagVJ,eAIJ,aACE,eACA,gBACA,uBACA,mBACA,iBAEA,aACE,wBACA,sBAIA,cACA,gBAKA,yCAPF,WACE,CAEA,gBACA,uBACA,gBACA,mBAWA,CAVA,mBAGF,aACE,CACA,cAKA,8BAIA,yBACE,sBAIJ,SACE,YACA,eACA,iBACA,uBACA,mBACA,gBACA,CAME,sDAGF,cACE,YACA,kBACA,oBACA,qBAKN,eACE,wBAGF,cACE,eAGF,iBACE,WACA,YACA,aACA,mBACA,uBACA,sBACA,6CAEA,cThX4B,eAEC,0DSiX3B,sBACA,CADA,gCACA,CADA,kBACA,4BAGF,iBACE,qEAGF,YACE,iBAIJ,iBACE,WACA,YACA,aACA,mBACA,uBACA,qBAEA,cTxY4B,eAEC,WSyY3B,YACA,sBACA,CADA,gCACA,CADA,kBACA,WAIJ,oBACE,oBAGF,YACE,kBACA,2BAGF,+BACE,mBACA,SACA,gBAGF,kBbjdqB,camdnB,kBACA,uCACA,mBAEA,eACE,uBAIJ,iBACE,QACA,SACA,2BACA,4BAEA,UACE,gBACA,2BACA,0BbreiB,2BayenB,WACE,iBACA,uBACA,yBb5eiB,8BagfnB,QACE,iBACA,uBACA,4BbnfiB,6BaufnB,SACE,gBACA,2BACA,2Bb1fiB,wBaggBnB,cACE,iBACA,cACA,iBACA,sBACA,qBACA,mBbtgBiB,WAHb,gBa4gBJ,uBACA,mBACA,yFAEA,kBb1gBsB,cAHL,UakhBf,sCAKN,aACE,iBACA,gBACA,QACA,gBACA,aACA,yCAEA,eACE,mBbhiBiB,cakiBjB,kBACA,mCACA,gBACA,kBACA,sDAGF,OACE,wDAIA,UACE,8CAIJ,cACE,iBACA,cACA,iBACA,sBACA,qBACA,mBbzjBiB,WAHb,gBa+jBJ,uBACA,mBACA,oDAEA,SACE,oDAGF,kBbjkBsB,cAHL,iBa2kBrB,qBACE,iBAIA,sBACA,cbpkBgB,oBaukBhB,cACE,gBACA,mBACA,kBACA,mBAGF,cACE,mBACA,iBAIJ,aAEE,gBACA,qCAGF,cACE,SACE,iBAGF,aAEE,CAEA,gBACA,yCAEA,iBACE,uCAGF,kBACE,qDAKF,gBAEE,kBACA,YAKN,qBACE,aACA,mBACA,cACA,gBACA,iBAGF,aACE,cACA,CACA,sBACA,WbppBM,qBaspBN,kBACA,eACA,gBACA,gCACA,2BACA,mDACA,qBAEA,eACE,eACA,qCVhoBA,6GADF,kBUwoBI,4BACA,kHVpoBJ,kBUmoBI,4BACA,wBAIJ,+BACE,cbvqBsB,sBa2qBxB,eACE,aACA,2BAGF,aACE,eACA,kBAIJ,iBACE,yBAEA,iBACE,SACA,UACA,mBb5rBsB,yBa8rBtB,gBACA,kBACA,eACA,gBACA,iBACA,WbzsBI,mDa8sBR,oBACE,aAGF,iBACE,kBACA,cACA,iCACA,mCAEA,eACE,yBAGF,YAVF,cAWI,oBAGF,YACE,sBACA,qBAGF,aACE,kBACA,iBACA,yBAKF,uBADF,YAEI,gBAIJ,oBACE,kBACA,eACA,6BACA,SACA,UACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,gDACA,wCACA,iCAGF,QACE,mBACA,WACA,YACA,gBACA,UACA,kBACA,UACA,yBAGF,kBACE,WACA,wBACA,qBAGF,UACE,YACA,UACA,mBACA,yBb9wBwB,qCagxBxB,sEAGF,wBACE,4CAGF,wBbtxB0B,+Ea0xB1B,wBACE,2BAGF,iBACE,WACA,YACA,MACA,SACA,gBACA,mBACA,cACA,SACA,UACA,6BACA,CAKA,uEAFF,SACE,6BAeA,CAdA,sBAGF,iBACE,WACA,YACA,MACA,SACA,gBACA,mBACA,cACA,WAGA,8CAGF,SACE,qBAGF,iBACE,QACA,SACA,WACA,YACA,yBACA,kBACA,sBACA,sBACA,yBACA,sCACA,4CAGF,SACE,qBbl1BwB,yDas1B1B,kBbv1B0B,2Ba61B1B,iBACE,gBACA,cAGF,aACE,kBAGF,kBbt2B0B,caw2BxB,oBAEA,ab52BmB,oBag3BnB,abn2BgB,yBau2BhB,0BACE,CADF,uBACE,CADF,kBACE,kDAKA,sBACA,cACA,wDAEA,kBACE,8DAGF,cACE,sDAGF,abz3Bc,ea23BZ,0DAEA,ab73BY,0Ba+3BV,sDAIJ,oBACE,cbj5Be,sMao5Bf,yBAGE,0BAKN,aACE,UACA,mCACA,CADA,0BACA,gBACA,6BAEA,cACE,yBACA,cbp6Be,aas6Bf,gBACA,gCACA,sCAGF,oDACE,YACE,uCAIJ,oDACE,YACE,uCAIJ,yBA3BF,YA4BI,yCAGF,eACE,aACA,iDAEA,ab/7Be,qBas8BrB,oBACE,kBACA,eACA,iBACA,gBACA,mBbz8BwB,gBa28BxB,iBACA,qBAGF,eACE,gBACA,2BAEA,iBACE,aACA,wBAGF,kBACE,yBAGF,oBACE,gBACA,yBACA,yBACA,eAIJ,abt+BqB,uBaw+BnB,CACA,WACA,CADA,+BACA,sBACA,cACA,oBACA,mBACA,cACA,WACA,0CAEA,Ubr/BM,4BAMkB,qCGkBtB,yDADF,cUq+BE,sBAGF,Ub//BM,gCaigCJ,sDAEA,UbngCI,4BAMkB,mDaqgC1B,uBACE,YACA,6CACA,uBACA,sBACA,WACA,0DAEA,sBACE,0DAIJ,uBACE,2BACA,gDAGF,ab5gCsB,6Ba8gCpB,uDAGF,ab5hC0B,yDagiC1B,aACE,YAGF,aACE,cb3hCgB,6Ba6hChB,SACA,kBACA,kBACA,oBACA,SACA,aACA,sBACA,WACA,WACA,qBACA,kBAEA,kBACE,WAIJ,+BACE,oBAGF,gBACE,qEAGF,4BACE,gCAGF,eACE,kBACA,MACA,QACA,YACA,kBACA,YAEA,mBACA,yBACA,eACA,aAEA,wCAEA,UTvhCsB,mBSyhCpB,aACA,sBACA,mBACA,uBACA,mBACA,8BACA,wBACA,gCACA,uCAGF,wBACE,kBACA,WACA,YACA,eACA,cbxmCiB,yBa0mCjB,aACA,uBACA,mBACA,sCAGF,mBACE,6CAEA,8BACE,WAKN,oBACE,UACA,oBACA,kBACA,cACA,SACA,uBACA,eACA,oBAGF,abvnCkB,eaynChB,gBACA,yBACA,iBACA,kBACA,QACA,SACA,+BACA,yBAEA,aACE,WACA,CACA,0BACA,oBACA,mBACA,4BAIJ,iBACE,QACA,SACA,+BACA,WACA,YACA,sBACA,6BACA,CACA,wBACA,kBACA,2CAGF,2EACE,CADF,mEACE,8CAGF,4EACE,CADF,oEACE,qCAGF,GACE,sBACE,KAGF,2BACE,KAGF,2BACE,KAGF,yBACE,IAGF,wBACE,EArBF,4BAGF,GACE,sBACE,KAGF,2BACE,KAGF,2BACE,KAGF,yBACE,IAGF,wBACE,uCAIJ,GACE,wBACE,KAGF,0BACE,KAGF,2BACE,KAGF,uBACE,IAGF,sBACE,EAtBA,6BAIJ,GACE,wBACE,KAGF,0BACE,KAGF,2BACE,KAGF,uBACE,IAGF,sBACE,mCAIJ,GACE,OACE,SACA,yBACA,KAGF,wBACE,KAGF,UACE,YACA,6BACA,kBACA,UACA,IAGF,UACE,YACA,eACA,UACA,6BACA,EA5BA,yBAIJ,GACE,OACE,SACA,yBACA,KAGF,wBACE,KAGF,UACE,YACA,6BACA,kBACA,UACA,IAGF,UACE,YACA,eACA,UACA,6BACA,kCAIJ,GACE,gBACA,aACA,aAPE,wBAIJ,GACE,gBACA,aACA,6BAGF,KACE,OACA,WACA,YACA,kBACA,YACA,2BAEA,YACE,SACA,QACA,WACA,YACA,mBACA,6BAGF,mBACE,yBAGF,YACE,0BAGF,aACE,uBACA,WACA,YACA,SACA,iCAEA,oBACE,8BACA,kBACA,iBACA,WbpyCE,gBasyCF,eACA,+LAMA,6BACE,mEAKF,6BACE,iBAMR,aACE,iBACA,mEAGF,ab5zCqB,qBag0CnB,mBACA,gBACA,sBACA,gBAGF,aACE,iBACA,uBAGF,eACE,8BAGF,ab/0CqB,eai1CnB,cACA,gBACA,gBACA,uBAGF,qBACE,sBAGF,WACE,8BAGF,GACE,kBACE,+BACA,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,oBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,kBACE,2CACA,CADA,kCACA,EA3BF,qBAGF,GACE,kBACE,+BACA,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,oBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,kBACE,2CACA,CADA,kCACA,iBAIJ,0DACE,CADF,kDACE,cAGF,kBACE,8BACA,aACA,YACA,uBACA,OACA,UACA,kBACA,MACA,kBACA,WACA,aACA,gBAEA,mBACE,oBAIJ,WACE,aACA,aACA,sBACA,kBACA,YACA,0BAGF,iBACE,MACA,QACA,SACA,OACA,WACA,kBACA,mBbh6CwB,kCak6CxB,uBAGF,MACE,aACA,mBACA,uBACA,cb36CmB,ea66CnB,gBACA,0BACA,kBACA,qCAGF,SACE,oBACA,CADA,WACA,cAGF,wBbr7C0B,Wau7CxB,kBACA,MACA,OACA,aACA,qBAGF,iBACE,aAGF,iBACE,cACA,aACA,WACA,yBbt8CwB,kBaw8CxB,cACA,UACA,WACA,eAGF,YACE,gCACA,CACA,iBACA,qBAEA,kBACE,UACA,uBAGF,aACE,CACA,sBACA,kBACA,uBAGF,oBACE,mBbj+CsB,kBam+CtB,cACA,eACA,wBACA,wBAGF,aACE,CACA,0BACA,gBACA,8BAEA,eACE,aACA,2BACA,8BACA,uCAGF,cACE,cb1/Ce,kBa4/Cf,+BAGF,ab//CiB,eaigDf,mBACA,gBACA,uBACA,kBACA,gBACA,YACA,iCAEA,Ub5gDE,qBa8gDA,oHAEA,yBAGE,yCAKN,QACE,uBAIJ,kBACE,6BAEA,kBACE,oDAGF,eACE,6DAGF,UbxiDI,oBaijDN,kBACA,cACA,2BAGF,eACE,UAGF,iBACE,cAEA,WACE,WACA,sCACA,CADA,6BACA,cAGF,cACE,iBACA,cblkDiB,gBaokDjB,gBAEA,abnkDsB,0BaqkDpB,sBAEA,oBACE,gBAIJ,qBACE,4BAKN,GACE,cACA,eACA,WARI,mBAKN,GACE,cACA,eACA,2CC5lDF,u+KACE,uCAEA,u+KACE,CAOA,8MAMF,okBACE,UClBJ,YACE,gCACA,cACA,qBACA,iCAEA,aACE,cACA,cfJiB,gBeMjB,qBACA,eACA,gBAGF,WACE,UACA,yCAEA,8CAEA,WACE,iBACA,mBAKN,YACE,0BAGF,UACE,iBACA,kBACA,kBAGF,gBX0BwB,wBD9DtB,4BACA,kBYqCA,eACA,yBAEA,oBACE,sBACA,iBACA,4BZ3CF,eYgDE,CACA,cACA,2DAJF,gBXesB,wBD9DtB,4BACA,CYgDE,iBAQE,CANF,+BZlDF,UYsDI,CACA,qBACA,mCAGF,aACE,kBACA,QACA,SACA,+BACA,WflEE,6BeoEF,gBACA,eACA,0BAKN,iBACE,WACqB,sCZrErB,+BANA,UY+EuB,sCZzEvB,gEYuEA,gBXhBsB,wBD9DtB,4BY0FE,CZnFF,iCANA,UYoFuB,sCZ9EvB,kBYgFE,SACA,QACA,UACA,wBAIJ,WACE,aACA,mBACA,2BAGF,aACE,mBACA,sBAGF,YACE,cf3FgB,6Be8FhB,eACE,CAII,kMADF,eACE,wBAKN,eACE,cACA,0BACA,yFAEA,oBAGE,sBAKN,4BACE,gCACA,iBACA,gBACA,cACA,aACA,4BAGF,YACE,cACA,iBACA,kBACA,2BAGF,oBACE,gBACA,cACA,8BACA,eACA,oCACA,uCAEA,aACE,kCAGF,+BACE,gCAGF,aACE,yBACA,eACA,cfrKiB,kCeyKnB,aACE,eACA,gBACA,Wf/KI,CeoLA,2NADF,eACE,gCAKN,afnLwB,oBewL1B,iBACE,mDAEA,aACE,mBACA,gBACA,4BAIJ,UACE,kBACA,wBAGF,gBACE,qBACA,eACA,cf7MmB,ee+MnB,kBACA,4BAEA,af/MwB,6BemNxB,aACE,gBACA,uBACA,iBAIJ,kBACE,6BACA,gCACA,aACA,mBACA,eACA,kDAGF,aAEE,kBACA,yBAGF,kBACE,aACA,2BAGF,afjPqB,eemPnB,cACA,gBACA,mBACA,kDAIA,kBACE,oDAIA,SZ7MF,sBACA,WACA,YACA,gBACA,oBACA,mBHrDwB,cAFL,eG0DnB,SACA,+EYuMI,aACE,CZxMN,qEYuMI,aACE,CZxMN,yEYuMI,aACE,CZxMN,0EYuMI,aACE,CZxMN,gEYuMI,aACE,sEAGF,QACE,yLAGF,mBAGE,0DAGF,kBACE,qCAGF,mDArBF,cAsBI,yDAIJ,af5Qc,iBe8QZ,eACA,4DAGF,gBACE,wDAGF,kBACE,gEAEA,cACE,iNAEA,kBAGE,cACA,gHAKN,aflTiB,0HeuTjB,cAEE,gBACA,cf7SY,kZegTZ,aAGE,gEAIJ,wBACE,iDAGF,eX1UI,kBDkEN,CAEA,eACA,cH7CiB,uCG+CjB,UYqQI,mBf1Ue,oDGuEnB,wBACE,cHlDe,eGoDf,gBACA,mBACA,oDAGF,aACE,oDAGF,kBACE,oDAGF,eACE,WH3FI,sDeiVJ,WACE,mDAGF,UfrVI,kBeuVF,eACA,8HAEA,kBAEE,iCAON,kBACE,mBAIJ,UfxWQ,kBe0WN,cACA,mBACA,sBf3WM,yBe6WN,eACA,gBACA,YACA,kBACA,WACA,yBAEA,SACE,6BAIJ,YACE,eACA,gBACA,wBAGF,WACE,sBACA,cACA,kBACA,kBACA,gBACA,WACA,+BAEA,iBACE,QACA,SACA,+BACA,eACA,sDAIJ,kBAEE,gCACA,eACA,aACA,cACA,oEAEA,kBACE,SACA,SACA,6HAGF,aAEE,cACA,cfhaiB,eekajB,eACA,gBACA,kBACA,qBACA,kBACA,yJAEA,afzaiB,qWe4af,aAEE,WACA,kBACA,SACA,SACA,QACA,SACA,2BACA,CAEA,4CACA,CADA,kBACA,CADA,wBACA,iLAGF,WACE,6CACA,8GAKN,kBACE,gCACA,qSAKI,YACE,iSAGF,4CACE,sBAQR,sBACA,mBACA,6BACA,gCACA,+BAEA,iBACE,iBACA,cfjdc,Ceodd,eACA,eACA,oCAEA,aACE,gBACA,uBACA,oCAIJ,UACE,kBACA,uDAGF,iBACE,qDAGF,eACE,2BAIJ,af1fqB,ee4fnB,gBACA,gBACA,kBACA,qBACA,6BAEA,kBACE,wCAEA,eACE,6BAIJ,aACE,0BACA,mCAEA,oBACE,kBAKN,eACE,2BAEA,UACE,8FAEA,8BAEE,CAFF,sBAEE,wBAIJ,iBACE,SACA,UACA,yBAGF,eACE,aACA,kBACA,mBACA,6BAEA,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,uBAIJ,iBACE,mBACA,YACA,gCACA,+BAEA,aACE,cACA,WACA,iBACA,gDAEA,kBACE,yBACA,wBAKN,YACE,uBACA,gBACA,iBACA,iCAEA,YACE,mBACA,iBACA,gBACA,8CAEA,wBACE,kBACA,uBACA,YACA,yCAGF,YACE,8BAIJ,WACE,4CAEA,kBACE,wCAGF,UACE,YACA,iCAGF,cACE,iBACA,WfjnBA,gBemnBA,gBACA,mBACA,uBACA,uCAEA,aACE,eACA,cfvnBW,gBeynBX,gBACA,uBACA,gCAKN,aACE,uBAIJ,eACE,cACA,iDAGE,qBACA,Wf9oBE,gDekpBJ,QACE,6BACA,kDAEA,aACE,yEAGF,uBACE,4DAGF,aX5pBU,yBWkqBd,cACE,gCAEA,cACE,cfrqBe,eeuqBf,kCAEA,oBACE,cf1qBa,qBe4qBb,iBACA,gBACA,yCAEA,eACE,WfprBF,SgBDR,YACE,gCACA,8BAEA,aACE,cACA,WhBLI,qBgBOJ,eACA,gBACA,kBAIJ,YACE,iBAGF,WACE,aACA,mBACA,mCCrBF,GACE,sBACE,KAGF,2BACE,KAGF,4BACE,KAGF,2BACE,IAGF,yBACE,EDGF,0BCrBF,GACE,sBACE,KAGF,2BACE,KAGF,4BACE,KAGF,2BACE,IAGF,yBACE,qCAIJ,GACE,yBACE,KAGF,yBACE,KAGF,4BACE,KAGF,wBACE,IAGF,sBACE,EAtBA,2BAIJ,GACE,yBACE,KAGF,yBACE,KAGF,4BACE,KAGF,wBACE,IAGF,sBACE,gCAIJ,cACE,kBAGF,iBACE,cACA,eACA,iBACA,qBACA,gBACA,iBACA,gBACA,wBAEA,SACE,4BAGF,UACE,YACA,gBACA,sBAGF,cACE,iBACA,sBACA,CADA,gCACA,CADA,kBACA,qEAGF,kBACE,qBACA,sGAEA,eACE,qEAIJ,eAEE,qJAEA,kBAEE,mXAGF,eACE,mBACA,qJAGF,eACE,gBACA,2EAGF,eACE,+NAGF,eACE,2FAGF,iBACE,8BACA,cjB5Ge,mBiB8Gf,qHAEA,eACE,2JAIJ,eACE,mJAGF,iBACE,6EAGF,iBACE,eACA,6EAGF,iBACE,qBACA,qJAGF,eACE,6JAEA,QACE,2EAIJ,oBACE,2EAGF,uBACE,oBAIJ,ab9Ic,qBagJZ,0BAEA,yBACE,8BAEA,aACE,kCAKF,oBACE,uCAEA,yBACE,wBAKN,ajBjKc,4CiBsKhB,YACE,8EAEA,aACE,mCAIJ,aACE,oDAEA,ab5LQ,ea8LN,CAKF,sDAEA,kBAEE,gCAKN,oBACE,kBACA,mBACA,YACA,WjBrNM,gBiBuNN,eACA,cACA,yBACA,oBACA,eACA,sBACA,sCAEA,kBACE,qBACA,+DAGF,oBACE,iBACA,sBACA,kBACA,eACA,oBACA,2GAKF,oBAGE,4BAIJ,ajBtOkB,SiBwOhB,kBACA,kBACA,oBACA,SACA,aACA,sBACA,WACA,WACA,gCACA,+BAGF,UACE,kBACA,mDAGF,iBAEE,gCAGA,qEAEA,eACE,kBAKF,SACE,mBACA,kDAEA,kBACE,wDAEA,sBACE,iFAIJ,kBAEE,SAKN,iBACE,kBACA,YACA,gCACA,eACA,UAaA,mCACA,CADA,0BACA,wDAZA,QAPF,kBAUI,0BAGF,GACE,aACA,WALA,gBAGF,GACE,aACA,uDAMF,cAEE,kCAGF,kBACE,4BACA,sCAIA,ajBtUiB,CAHb,uEiBkVF,UjBlVE,kCiBsVF,ajBnVe,gCiBwVjB,UjB3VI,kCiB8VF,ajBxVoB,gEiB4VpB,UjBlWE,mBAIgB,sEiBkWhB,kBACE,mBAMR,uBACE,sBACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,yCAEA,aACE,kBACA,OACA,QACA,MACA,SACA,6FACA,oBACA,WACA,2DAGF,oBACE,oCAGF,WACE,gBACA,uBACA,cACA,0CAEA,UACE,kBACA,MACA,gBACA,gEACA,oBACA,4CAGF,oBACE,gDAGJ,uDACE,mEAEF,uDACE,0CAGF,eACE,6DAGF,kBACE,gCAIJ,mBACE,+CAKF,sBACE,qEAEA,aACE,wBAKN,oBACE,YACA,CjBtagB,ciBwahB,iBACA,mBACA,CACA,sBACA,8CANA,ajBtagB,CiB0ahB,eAOA,8CAGF,aACE,eACA,eAGF,YACE,8BACA,eACA,oBAEA,sBACE,gBACA,2CAGF,oBACE,sBAIJ,YACE,mBACA,WACA,cjB1coB,iIiB6cpB,gBAGE,kBACA,0EAGF,yBACE,yEAMA,0CACE,CADF,kCACE,2EAKF,2CACE,CADF,mCACE,wBAKN,YACE,mBACA,2BACA,mBAGF,+BACE,aACA,6CAEA,uBACE,OACA,4DAEA,eACE,8DAGF,SACE,mBACA,qHAGF,cAEE,gBACA,4EAGF,cACE,0BAKN,kBACE,aACA,cACA,uBACA,aACA,kBAGF,gBACE,mBACA,iBACA,cjBthBgB,CiBwhBhB,iBACA,eACA,kBACA,+CAEA,ajB7hBgB,uBiBiiBhB,aACE,gBACA,uBACA,qBAIJ,kBACE,aACA,eACA,8BAEA,mBACE,kBACA,mBACA,yDAEA,gBACE,qCAGF,oBACE,WACA,eACA,gBACA,cjBzjBgB,4BiB+jBtB,iBACE,8BAGF,cACE,cACA,uCAGF,aACE,aACA,mBACA,uBACA,kBACA,kBAGF,kBACE,kBACA,wBAEA,YACE,eACA,8BACA,uBACA,uFAEA,SAEE,mCAIJ,cACE,iBACA,6CAEA,UACE,YACA,gBACA,+DAIJ,cAEE,wBAIJ,eACE,cjBnnBgB,eiBqnBhB,iBACA,8BAGF,kBACE,6BACA,gCACA,aACA,mBACA,eACA,wBAGF,aACE,qBACA,uDAGF,oBAEE,gBACA,eACA,gBACA,6JAGF,oBAME,4DAKA,UjB1qBM,kBiBgrBN,UACE,iKAQF,yBACE,+BAIJ,aACE,gBACA,uBACA,0DAGF,aAEE,sCAGF,kBACE,gCAGF,ajB1sBqB,ciB4sBnB,iBACA,mBACA,gBACA,2EAEA,aAEE,uBACA,gBACA,uCAGF,cACE,WjB5tBI,kCiBiuBR,UACE,kBACA,iBAGF,SACE,kBACA,YACA,WACA,CjB1tBgB,8IiBquBhB,ajBruBgB,wBiByuBhB,UACE,wCAGF,kBjBpvBsB,WAThB,8CiBiwBJ,kBACE,qBACA,+DAOJ,yBACE,cAIJ,YACE,eACA,yBACA,kBACA,cjBnwBgB,gBiBqwBhB,qBACA,gBACA,uBAEA,QACE,OACA,kBACA,QACA,MAIA,iDAHA,YACA,uBACA,mBAUE,CATF,0BAEA,yBACE,kBACA,iBACA,cAIA,sDAGF,cAEE,cjB5yBe,uBiB8yBf,SACA,cACA,qBACA,eACA,iBACA,sMAEA,UjBxzBE,yBiB+zBJ,cACE,kBACA,YACA,+DAGF,aACE,eAKN,cACE,qBAEA,kBACE,oBAIJ,cACE,cACA,qBACA,WACE,YACA,SACA,2BAIF,UACE,YACA,qBAIJ,aACE,gBACA,kBACA,cjBn2BmB,gBiBq2BnB,uBACA,mBACA,qBACA,uBAGF,aACE,gBACA,2BACA,2BAGF,ajBj3BqB,oBiBq3BrB,aACE,eACA,eACA,gBACA,uBACA,mBACA,qBAGF,cACE,mBACA,kBACA,yBAEA,cACE,kBACA,yBACA,QACA,SACA,+BACA,yBAIJ,aACE,6CAEA,UACE,mDAGF,yBACE,6CAGF,mBACE,sBAIJ,oBACE,kCAEA,QACE,4CAIA,oBACA,0CAGF,kBACE,0CAGF,aACE,6BAIJ,wBACE,2BAGF,yBACE,cACA,SACA,WACA,YACA,oBACA,CADA,8BACA,CADA,gBACA,sBACA,wBACA,kBAGF,YACE,eACA,yBACA,kBACA,gBACA,gBACA,wBAEA,aACE,cjB77Bc,iBiB+7Bd,eACA,+BACA,aACA,sBACA,mBACA,uBACA,eACA,4BAEA,aACE,wBAIJ,eACE,CACA,qBACA,aACA,sBACA,uBACA,2BAEA,aACE,cACA,0BAGF,oBACE,cjB39BY,gBiB69BZ,gCAEA,yBACE,0BAKN,QACE,eACA,iDAEA,SACE,cACA,8BAGF,ajB9+Bc,oCiBo/BlB,cACE,cACA,SACA,uBACA,UACA,kBACA,oBACA,oFAEA,yBAEE,6BChhCJ,kBACE,aAGF,iBACE,8BACA,oBACA,aACA,sBAGF,cACE,MACA,OACA,QACA,SACA,8BACA,wBAGF,cACE,MACA,OACA,WACA,YACA,aACA,sBACA,mBACA,uBACA,2BACA,aACA,oBACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,oBAGF,mBACE,aACA,aACA,6CAGF,kBlBtCqB,WAHb,kBkB8CN,gBACA,aACA,sBACA,0BAGF,WACE,WACA,gBACA,iBACA,8DAEA,UACE,YACA,sBACA,aACA,sBACA,mBACA,uBACA,aACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,oBAIJ,WACE,WACA,gBACA,iBACA,kBACA,wBAEA,iBACE,MACA,OACA,WACA,YACA,sBACA,aACA,aACA,CAGA,YACA,UACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,2CANA,qBACA,mBACA,uBAaF,CATE,mBAIJ,YACE,CAGA,iBACA,qCAGF,kBACE,UACE,YACA,gBACA,0BAGF,UACE,YACA,eACA,gBACA,cACA,oDAIJ,aAEE,mBACA,aACA,aACA,2DAEA,cACE,uLAGF,alBhImB,SkBmIjB,eACA,gBACA,kBACA,oBACA,YACA,aACA,kBACA,6BACA,+mBAEA,aAGE,yBACA,ClBpJE,wyEkB2JF,UAGE,sBAMR,sBACE,yBAGF,aACE,aACA,mBACA,uBACA,wBAGF,UACE,YACA,mBACA,mBACA,aACA,eACA,8BAEA,kBACE,+BAGF,cACE,mBACA,kCAIJ,mBACE,CACA,mBACA,0EAEA,mBACE,yBAIJ,cACE,iBACA,4BAEA,cACE,gBACA,WlBjNI,mBkBmNJ,2BAGF,alBhNwB,kGkBmNtB,aAGE,2CAIJ,aACE,2BAGF,cACE,clBlOiB,gBkBoOjB,mBACA,sCAEA,eACE,kCAGF,eACE,mBlB1OoB,cAFL,kBkB+Of,eACA,gBACA,CAII,2NADF,eACE,oCAOV,WACE,UACA,mCAME,mBACA,mBACA,sCAEA,cACE,iBACA,kBACA,qCAGF,eACE,oCAIJ,kBACE,mBACA,kBACA,eAIJ,iBACE,eACA,mBACA,sBAEA,eACE,WlBnSI,kBkBqSJ,yBACA,eACA,qBAGF,kBlBrSwB,cAFL,gBkB0SjB,aACA,kBACA,6HAQF,eACE,qJAGF,kBACE,clBzTiB,mBkB2TjB,kBACA,aACA,kBACA,eACA,sCACA,yPAEA,iBACE,mBACA,qNAGF,mBACE,gBACA,4CAMJ,YACE,mBACA,gDAEA,UACE,cACA,4DAEA,aACE,2DAGF,cACE,kDAGF,iBACE,uDAIJ,eACE,sDAIJ,UlB5WM,2DkBiXR,0BACE,cACE,iBACA,qJAGF,cAIE,mBACA,4CAGF,kBACE,sDAGF,WACE,eACA,mBAIJ,oBACE,eACA,gBACA,iBACA,uHAGF,kBAOE,WlBvZM,kBkByZN,gBACA,eACA,YACA,kBACA,sBACA,+SAEA,alBhZgB,YkBkZd,eACA,WACA,eACA,gBACA,uSAGF,YACE,uPAGF,WACE,WACA,+WAGF,aACE,wBAKF,edvbM,CJEa,gBkBwbjB,oBACA,iEd3bI,2BJEa,qDkBicrB,iBAEE,aACA,qEAEA,wBACE,CADF,qBACE,CADF,oBACE,CADF,gBACE,gBACA,kKAIJ,YAKE,8BACA,mBlBldmB,akBodnB,iBACA,0LAEA,aACE,iBACA,clBzdiB,mBkB2djB,kNAGF,aACE,6DAIJ,cAEE,yDAGF,WAEE,eACA,0BAGF,gBAEE,sDAGF,qBAEE,eAGF,UACE,gBACA,0BAGF,YACE,6BACA,qCAEA,yBAJF,cAKI,gBACA,iDAIJ,qBAEE,UACA,qCAEA,+CALF,UAMI,sDAIJ,aAEE,gBACA,gBACA,gBACA,kBACA,2FAEA,alBthBwB,qCkB0hBxB,oDAZF,eAaI,sCAKF,4BADF,eAEI,yBAIJ,YACE,+BACA,gBACA,0BAEA,cACE,iBACA,mBACA,sCAGF,aACE,sBACA,WACA,CACA,UlB1jBI,gBICA,ac4jBJ,oBACA,eACA,YACA,CACA,SACA,kBACA,yBACA,iBACA,gBACA,gBACA,4CAEA,wBACE,+CAGF,ed5kBI,yBc8kBF,mBACA,kBACA,6DAEA,QACE,gBACA,gBACA,mEAEA,QACE,0DAIJ,UlB7lBE,oBkB+lBA,eACA,gBd/lBA,+CcomBJ,YACE,8BACA,mBACA,4CAIJ,aACE,WlB7mBI,ekB+mBJ,gBACA,mBACA,wCAGF,eACE,mBACA,+CAEA,UlBxnBI,ekB0nBF,qCAIJ,uBAnFF,YAoFI,eACA,QACA,wCAEA,iBACE,iBAKN,eAWE,eACA,wBAXA,eACE,iBACA,uBAGF,aACE,gBACA,2CAMF,eACE,mBAGF,eACE,cACA,gBACA,+BAEA,4BACE,4BAGF,QACE,oCAIA,UlBzqBE,akB2qBA,kBACA,eACA,mBACA,qBACA,8EAEA,eAEE,yWAOA,kBlBprBgB,WANlB,iJkBisBA,iBAGE,oMAUR,aACE,iIAIJ,4BAIE,clBptBmB,ekBstBnB,gBACA,6cAEA,aAGE,6BACA,uCAIJ,iBACE,mBACA,oBACA,eAEA,yFAEA,qBACE,qGAIJ,YAIE,eACA,iIAEA,eACE,CAII,w1BADF,eACE,sDAMR,iBAEE,oDAKA,eACE,0DAGF,eACE,mBACA,aACA,mBACA,wEAEA,UlBnxBI,CkBqxBF,gBACA,uBAKN,YACE,2CAEA,QACE,WACA,cAIJ,UACE,eACA,gBACA,iBAEA,YACE,gBACA,eACA,kBACA,sCAGF,YACE,4CAEA,kBACE,yDAGF,SACE,sBACA,cACA,WACA,YACA,aACA,gDACA,mBlBzzBoB,WALlB,ekBi0BF,CACA,eACA,kBACA,2EAEA,QACE,wMAGF,mBAGE,+DAGF,kBACE,qCAGF,wDA7BF,cA8BI,4DAIJ,WACE,eACA,gBACA,SACA,kBACA,cAKN,iBACE,YACA,gBACA,YACA,aACA,uBACA,mBACA,gBd12BM,yDc62BN,aAGE,gBACA,WACA,YACA,SACA,sBACA,CADA,gCACA,CADA,kBACA,gBdr3BI,uBcy3BN,iBACE,YACA,aACA,+BACA,iEACA,kBACA,wCACA,uBAGF,iBACE,WACA,YACA,MACA,OACA,uBAGF,iBACE,YACA,WACA,UACA,YACA,4BACA,6BAEA,UACE,8BAGF,UlBv5BI,ekBy5BF,gBACA,cACA,kBACA,2BAGF,iBACE,mCACA,qCAIJ,oCACE,eAEE,uBAGF,YACE,wBAKN,gBACE,sCAEA,eACE,gCAGF,eACE,qDAGF,UlB57BM,iDkBg8BN,YACE,0DAEA,YACE,0BAIJ,YACE,iBACA,uBACA,kDAGF,alB77BoB,qBkB+7BlB,wDAEA,yBACE,WCp9BN,YACE,oBAGF,cACE,uBACA,eACA,gBACA,cnBJmB,4CmBOnB,afNY,sCeWd,2CACE,oBAGF,QACE,wBACA,UACA,+CAEA,WACE,mBACA,UACA,0BAGF,aACE,sBACA,SACA,YACA,kBACA,aACA,WACA,UACA,WnBtCI,gBICA,eewCJ,oBACA,gBACA,qDAEA,anB7Bc,CmB2Bd,2CAEA,anB7Bc,CmB2Bd,+CAEA,anB7Bc,CmB2Bd,gDAEA,anB7Bc,CmB2Bd,sCAEA,anB7Bc,gCmBiCd,8ChBpCA,uCADF,cgBsC4D,0ChBjC5D,cgBiC4D,oBAI9D,UnBtDQ,mBmBwDN,mBnBpDsB,oCmBsDtB,iBACA,kBACA,eACA,gBACA,sBAEA,anB7DmB,gBmB+DjB,0BACA,mFAEA,oBAEU,iCAKZ,mBACA,eAEA,gBACA,wCAEA,anB5EwB,sDmBgFxB,YACE,2CAGF,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,gBACA,kBACA,SACA,kBACA,sBACA,kDAEA,oBnBlGsB,qCmByG1B,eACE,kBACA,aACA,mBnB9GsB,gBmBgHtB,gBACA,cACA,yBAEA,iBACE,gBACA,wCAEA,UnB5HI,iCmB8HJ,WACE,iBACA,2BAIJ,iBACE,cACA,CACA,cACA,iBACA,WnBzII,qBmB2IJ,gBACA,iBACA,qBACA,mBACA,gBACA,gGAEA,kBACE,qBACA,iIAEA,eACE,kJAIJ,eACE,mBACA,2DAGF,eACE,eACA,8BAGF,cACE,wFAGF,eACE,sCAGF,iBACE,2BACA,WnB/KE,mBmBiLF,mDAEA,eACE,8DAIJ,eACE,0DAGF,iBACE,+BAGF,iBACE,eACA,2DAGF,eACE,+DAEA,QACE,8BAIJ,oBACE,8BAGF,uBACE,6BAGF,anBlNiB,qBmBoNf,mCAEA,oEAGE,oBACE,gDAEA,qDAMR,UACE,YACA,gBACA,wBAIJ,iBACE,UACA,QACA,gHAEA,mCAEE,uDAIJ,iBAEE,WACA,mIAGE,aACE,sBACA,SACA,YACA,0BACA,yBACA,WACA,iBACA,UACA,WnBtQE,gBICA,eewQF,oBACA,YACA,qBACA,yLAEA,anB9PY,CmB4PZ,sKAEA,anB9PY,CmB4PZ,8KAEA,anB9PY,CmB4PZ,gLAEA,anB9PY,CmB4PZ,4JAEA,anB9PY,yKmBkQZ,SACE,qJAGF,kBnBnRe,+ImBoRf,8ChB1QF,8JADF,cgB4Q8D,kKhBvQ9D,cgBuQ8D,qChBhQ5D,8TADF,sBgBoQM,gBACA,6BAMR,aACE,kBACA,SACA,UACA,WACA,gBACA,2CAEA,aACE,mBACA,WACA,YACA,cnB3SiB,emB6SjB,iBACA,kBACA,WACA,4CAIJ,iBACE,SACA,oCAGF,aACE,kBACA,sBACA,SACA,0BACA,YACA,WACA,WnBnUM,mBAGa,sCmBmUnB,eACA,WACA,aACA,6CAGF,aACE,0CAGF,YACE,eACA,kBACA,iMAEA,kBAGa,iKAEb,YAGE,mBACA,mBACA,2BACA,iBACA,eACA,+DAGF,6BACE,qEAEA,aACE,gBACA,uBACA,mBACA,sEAGF,eACE,qEAGF,aACE,iBACA,gBACA,uBACA,mBACA,4EAMA,anB3Xe,wBmBgYrB,eACE,iCAEA,YACE,mBACA,eACA,oBACA,YACA,gBACA,8BAIJ,UACE,WACA,cACA,kCAEA,iBACE,kBACA,aACA,WACA,sBfzZI,wBe2ZJ,sBACA,4BACA,gBACA,2CAEA,aACE,kBACA,sBACA,SACA,OACA,SACA,SACA,aACA,WACA,cnBtae,gFmBwaf,eACA,oBACA,gBACA,UACA,UACA,4BACA,iDAEA,UflbE,sEeobF,WACE,cnBnba,CIFb,4DeobF,WACE,cnBnba,CIFb,gEeobF,WACE,cnBnba,CIFb,iEeobF,WACE,cnBnba,CIFb,uDeobF,WACE,cnBnba,yCmBwbjB,2EAKE,0CAKN,iFACE,aACA,uBACA,8BACA,UACA,4BACA,8CAEA,aACE,cnB3ciB,emB6cjB,gBACA,aACA,oBACA,2JAEA,aAGE,wCAIJ,SACE,kCAIJ,YACE,aACA,cnBhemB,gBmBkenB,sCAEA,cACE,kBACA,2CAGF,aACE,gDAEA,aACE,eACA,gBACA,yBACA,qDAGF,iBACE,eACA,kBACA,WACA,WACA,mBnBlfkB,8DmBqflB,iBACE,MACA,OACA,WACA,kBACA,mBnB7fkB,0BmBogB1B,UnB1gBQ,oBmB4gBN,eACA,gBf5gBM,4BeghBR,YACE,gBACA,0BACA,YACA,aACA,8BACA,cACA,oBAGF,YACE,cACA,sBAEA,oBACE,uBACA,cACA,YACA,iBACA,sBACA,uBAGF,oBACE,aACA,CAEA,oBACA,CADA,0BACA,UACA,QACA,YACA,uBACA,2BAIJ,iBACE,iBACA,0CAKE,yBACE,qCACA,WnB9jBE,mBAMkB,gBmB2jBpB,8CAGA,yBACE,oCACA,uCAMR,iBACE,kBACA,uCACA,gBf9kBM,gBeglBN,uBACA,6CAGF,YACE,mBACA,aACA,WnBxlBM,emB0lBN,sDAEA,aACE,cnB1lBiB,wEmB6lBjB,6EAEA,aACE,WnBnmBE,gBmBqmBF,sGAIJ,kBnBnmBwB,WANlB,6PmBinBF,UnBjnBE,0DmBqnBN,wCAGF,gBACE,iBACA,mBACA,gBACA,yBACA,cACA,+BAEA,oBACE,SACA,eACA,kBACA,gCAGF,oBACE,aACA,UACA,WACA,kBACA,kCAIA,af5oBU,CgBFZ,+BAHF,YACE,cACA,kBAUA,CATA,cAKA,kBACA,2BACA,gBAEA,uBAEA,YACE,uBACA,WACA,YACA,iBACA,6BAEA,WACE,gBACA,oBACA,aACA,yBACA,gBACA,oCAEA,0BACE,oCAGF,cACE,YACA,oBACA,YACA,6BAIJ,qBACE,WACA,gBACA,cACA,aACA,sBACA,qCAEA,4BARF,cASI,qBAMR,kBACE,wBACA,CADA,eACA,MACA,UACA,cACA,qCAEA,mBAPF,gBAQI,+BAGF,eACE,qCAEA,6BAHF,kBAII,wHAMJ,WAGE,mCAIJ,YACE,mBACA,uBACA,YACA,CpBlFwB,IoBiG1B,aACE,aACA,sBACA,WACA,YACA,CAIA,oBAGF,qBACE,WACA,mBACA,cpB/GwB,eoBiHxB,cACA,eACA,SACA,iBACA,aACA,SACA,UACA,2BAEA,yBACE,6BAIJ,kBACE,SACA,oBACA,cpBlIwB,eoBoIxB,cACA,eACA,kBACA,UACA,mCAEA,yBACE,wCAGF,kBACE,2BAIJ,oBACE,iBACA,2BAGF,iBACE,kCAGF,cACE,cACA,eACA,aACA,kBACA,QACA,UACA,cAGF,kBACE,WpB7KM,coB+KN,eACA,aACA,qBACA,2DAEA,kBAGE,oBAGF,SACE,2BAGF,sBACE,cpB5LiB,kGoB+LjB,sBAGE,WpBrME,kCoByMJ,apBnMsB,oBoByM1B,oBACE,iBACA,oBAGF,kBpB/M0B,cAWR,iBoBuMhB,eACA,gBACA,yBACA,eACA,yBAGF,iBACE,cACA,uCAGE,aACE,WACA,kBACA,SACA,OACA,QACA,cACA,UACA,oBACA,YACA,UACA,kFACA,gBAKN,YACE,eACA,mBACA,cACA,eACA,kBACA,UACA,UACA,gBACA,uBAEA,QACE,YACA,aACA,cACA,uBACA,aACA,gBACA,uBACA,gBACA,mBACA,OACA,4CAGF,apBvQwB,uBoB2QxB,sCACE,4CAEA,apB9QsB,yCoBgRpB,4CAIJ,SAEE,SAIJ,WACE,kBACA,sBACA,aACA,sBACA,gBACA,wDAEA,SACE,gBACA,gBACA,qBAGF,kBpBzSwB,yBoB8S1B,WACE,aACA,cACA,uBAGF,kBACE,iCAGF,iBACE,sEAGF,kBACE,SACA,cpBhUmB,eoBkUnB,eACA,eACA,kFAEA,aACE,CAKA,kLAEA,UpBjVI,mBoBmVF,kFAKJ,2BACE,wCAIJ,YACE,oBACA,6BACA,+CAEA,sBAEE,kBACA,eACA,qBACA,0CAGF,eACE,gDAKJ,SACE,6BAGF,eACE,gBACA,gBACA,cpBpXmB,0DoBsXnB,UACA,uCAEA,YACE,WACA,uCAGF,iBACE,gCAGF,QACE,uBACA,SACA,6BACA,cACA,iCAIF,eACE,2CACA,YACE,WACA,mCAKN,kBACE,aACA,mCAIA,apB1ZmB,0BoB4ZjB,gCAIJ,WACE,4DAEA,cACE,uEAEA,eACE,uBAKN,oBACE,uBACA,gBACA,mBACA,OACA,sBAGF,oBACE,iBACA,uCAGF,apB5akB,mBAXQ,kBoB2bxB,aACA,eACA,gBACA,eACA,aACA,cACA,mBACA,uBACA,yBACA,sCAbF,cAcI,kDAGF,eACE,2CAGF,apB3cwB,qBoB6ctB,uDAEA,yBACE,eAKN,qBACE,uCAKA,sBACE,6BACA,qCASF,qCAXA,sBACE,6BACA,sCAgBF,mJAFF,qBAGI,sBAKF,wBACA,aACA,2BACA,mBACA,mBACA,2BAEA,aACE,iCAEA,UACE,kBACA,uCAEA,SACE,kCAKN,aACE,aACA,yBChhBJ,iBACE,eACA,gBACA,crBcgB,mBAXQ,4BqBCxB,cACA,sBACA,mBACA,uBACA,aACA,qEAGE,aAEE,WACA,aACA,SACA,yCAIJ,gBACE,gCAGF,eACE,uCAEA,aACE,mBACA,crBhBY,qCqBoBd,cACE,gBACA,kBCtCJ,UACE,cACA,+BACA,0BAEA,UACE,qCAGF,iBATF,QAUI,mBAIJ,qBACE,mBACA,uBAEA,YACE,kBACA,gBACA,gBACA,2BAEA,aACE,WACA,YACA,SACA,oBACA,CADA,8BACA,CADA,gBACA,uBAIJ,YACE,mBACA,mBACA,aACA,6BAEA,aACE,aACA,mBACA,qBACA,gBACA,qCAGF,UACE,eACA,cACA,+BAGF,aACE,WACA,YACA,gBACA,mCAEA,UACE,YACA,cACA,SACA,kBACA,mBACA,oBACA,CADA,8BACA,CADA,gBACA,qCAIJ,gBACE,gBACA,4CAEA,cACE,WtB3EF,gBsB6EE,gBACA,uBACA,0CAGF,aACE,eACA,ctBjFW,gBsBmFX,gBACA,uBACA,yBAKN,kBtBxFsB,asB0FpB,mBACA,uBACA,gDAEA,YACE,cACA,eACA,mDAGF,qBACE,kBACA,gCACA,WACA,gBACA,mBACA,gBACA,uBACA,qDAEA,YACE,iEAEA,cACE,sDAIJ,YACE,cAOV,kBtB9H0B,sBsBiIxB,iBACE,4BAGF,aACE,eAIJ,cACE,kBACA,qBACA,cACA,iBACA,eACA,mBACA,gBACA,uBACA,eACA,oEAEA,YAEE,sBAGF,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,8BAEA,oBACE,mBACA,CC/KJ,eAGF,SpBkDE,sBACA,WACA,YACA,gBACA,oBACA,mBHrDwB,cAFL,eG0DnB,SACA,coBxDA,CACA,2BACA,iBACA,eACA,2CAEA,aACE,CAHF,iCAEA,aACE,CAHF,qCAEA,aACE,CAHF,sCAEA,aACE,CAHF,4BAEA,aACE,kCAGF,QACE,6EAGF,mBAGE,sBAGF,kBACE,qCAGF,eA3BF,cA4BI,kCAKF,QACE,qDAGF,mBAEE,mBAGF,iBACE,SACA,WACA,UACA,qBACA,UACA,0BACA,4CACA,eACA,WACA,YACA,cvBrDiB,euBuDjB,oBACA,0BAEA,mBACE,WACA,0BAIJ,sBACE,iCAEA,mBACE,WACA,gCAIJ,QACE,uBACA,cvB7DkB,euB+DlB,uCAEA,uBACE,sCAGF,aACE,yBAKN,avB5EkB,mBuB8EhB,gCACA,kBACA,eACA,gBACA,uBAGF,YACE,cvBnGmB,kBuBqGnB,iBAIA,avB5FgB,mBuB8Fd,gCACA,gBACA,aACA,eACA,eACA,qBAEA,oBACE,iBACA,eAIJ,YACE,mBACA,aACA,gCACA,0BAEA,eACE,qBAGF,aACE,cvBtHY,gBuBwHZ,uBACA,mBACA,4BAEA,eACE,uBAGF,avB7Ie,qBuB+Ib,eACA,gBACA,cACA,gBACA,uBACA,mBACA,qGAKE,yBACE,wBAMR,aACE,eACA,iBACA,gBACA,iBACA,mBACA,gBACA,cvBxKe,0BuB4KjB,aACE,WACA,2CAEA,mCACE,yBACA,0CAGF,wBACE,WC1LR,yCCCE,qBACA,sBACA,CADA,kBACA,wBACA,WACA,YACA,eAEA,UACE,8BAIJ,erBXQ,kBqBaN,sCACA,kBACA,eACA,UACA,iDAEA,2BACE,2DAGF,UACE,mCAIJ,iBACE,SACA,WACA,eACA,yCAGF,iBACE,UACA,SACA,UACA,gBrBvCM,kBqByCN,sCACA,gBACA,gDAEA,aACE,eACA,SACA,gBACA,uBACA,iKAEA,4BAGE,2DAIJ,WACE,wBAKF,2BACE,eAIJ,aACE,eACA,iBACA,gBACA,WACA,UACA,eACA,0CAEA,mBAEE,mBAGF,8BACE,CADF,sBACE,WACA,cACA,CACA,UACA,YACA,eACA,0EAMA,SACE,oBACA,CADA,WACA,eCpGN,WAEE,0BAGF,kBANW,kBAQT,cACA,iCACA,wBACE,mCAOF,WACE,SACA,UACA,2CAGF,aACE,aAEA,sBACA,YACA,6BACA,6DAGE,oBACE,WACA,iBACA,iBACA,iJAGF,UACE,gEAEF,oBACE,gBACA,WACA,2CAKN,yBACE,sBACA,kBACA,YACA,gBACA,kDAEA,uBACE,CADF,oBACE,CADF,eACE,WACA,YACA,SACA,4BACA,WACA,yBACA,eACA,4CACA,sBACA,oBACA,6DAEA,uBACE,6DAGF,sBACE,wEAGF,sBACE,kBACA,SCjFR,WACE,sBACA,aACA,sBACA,kBACA,iBACA,UACA,qBAEA,iBACE,oBAGF,kBACE,2DxBDF,SwBI0D,yBxBC1D,SwBD0D,qCxBQxD,qLwBLA,yBAGF,eACE,gBACA,eACA,qCxBZA,4BwBgBA,SACE,WACA,YACA,eACA,UACA,+BALF,SACE,WACA,YACA,eACA,UACA,yCAIJ,4BAGF,YACE,mBACA,mBACA,UACA,mBACA,eACA,mBAEA,aACE,sBACA,oCACA,sBACA,YACA,cACA,c3BpDiB,kB2BsDjB,qBACA,eACA,mBAGF,iCACE,iDAEA,YAEE,mBACA,mCACA,SAKN,iBACE,mBACA,UACA,qCxBrDE,6CADF,ewBwDkF,sCxBlEhF,sBADF,cwBoE0D,yBxB/D1D,cwB+D0D,gBAG5D,evBlFQ,kBDkEN,CACA,sBACA,gBACA,cH7CiB,uCG+CjB,mBAEA,wBACE,cHlDe,eGoDf,gBACA,mBACA,mBAGF,aACE,mBAGF,kBACE,mBAGF,eACE,WH3FI,kB2BuFR,YACE,c3BrFmB,a2BuFnB,mBACA,oBAEA,aACE,qBACA,wBAGF,aACE,c3BhGiB,gB2BkGjB,mBACA,gBACA,uBACA,0BAIJ,aACE,gBACA,gBACA,kBAGF,kB3B7G0B,kB2B+GxB,gBACA,yBAEA,a3BvGgB,mB2ByGd,aACA,gBACA,eACA,eACA,6BAEA,oBACE,iBACA,0BAIJ,iBACE,6BAEA,kBACE,gCACA,eACA,aACA,aACA,gBACA,eACA,c3B/HY,iC2BkIZ,oBACE,iBACA,8FAIJ,eAEE,mCAGF,aACE,aACA,c3B5Je,qB2B8Jf,0HAEA,aAGE,0BACA,gBAQN,WACA,kBAGA,+BANF,qBACE,UACA,CAEA,eACA,aAgBA,CAfA,eAGF,iBACE,MACA,OACA,mBACA,CAGA,qBACA,CACA,eACA,WACA,YACA,uBAEA,kB3B/LwB,0B2BoM1B,u1BACE,OACA,gBACA,aACA,8BAEA,aACE,sBACA,CADA,4DACA,CADA,kBACA,+BACA,CADA,2BACA,WACA,YACA,oBACA,eACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,oCAGF,aACE,WACA,YACA,YACA,eACA,sCAGF,yBAzBF,aA0BI,iBAIJ,kBACE,eACA,gBACA,mBAGF,cACE,kBACA,MACA,OACA,WACA,YACA,8BACA,oBCrPF,kBACE,gBACA,W5BDM,e4BGN,aACA,sBACA,YACA,uBACA,eACA,kBACA,kBACA,YACA,gBAGF,e5BbQ,cAEa,S4BcnB,WACA,YACA,iEAEA,aAGE,iCAGF,eACE,2BzBcF,iBACE,mBACA,cACA,eACA,aACA,gBACA,yByBfJ,aACE,eACA,yBAGF,aACE,eACA,gBACA,6BAGF,aACE,kBACA,W5B9CM,8B4BgDN,WACA,SACA,gBACA,kBACA,eACA,gBACA,UACA,oBACA,WACA,4BACA,iBACA,2DAKE,YACE,wDAKF,SACE,uBAKN,WACE,aACA,sBACA,4BAEA,iBACE,c5B/EiB,a4BiFjB,YACA,mBACA,CAGE,yDAIJ,UACE,gBAIJ,qBACE,eACA,gBACA,kBACA,kBACA,WACA,aACA,2BzB/DA,iBACE,mBACA,cACA,eACA,aACA,gBACA,sByB8DJ,WACE,sBACA,cACA,WACA,kBACA,kBACA,gBACA,kCAEA,eACE,qEAIA,cACE,MACA,gCAIJ,exBlIM,gCwBuIR,cACE,cACA,qBACA,c5BvImB,kB4ByInB,UACA,mEAEA,WAEE,WACA,sBACA,CADA,gCACA,CADA,kBACA,CAIE,0HAFF,WACE,oBACA,CADA,8BACA,CADA,gB5BrJE,C4BsJF,wBAKN,UACE,CAEA,iBACA,MACA,OACA,UACA,gB5BlKM,iC4BqKN,YACE,sBAIJ,WACE,gBACA,kBACA,WACA,aACA,uBACA,qCAGF,cACE,YACA,WACA,kBACA,UACA,sBACA,CADA,gCACA,CADA,kBACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,qDAEA,WACE,oBACA,CADA,8BACA,CADA,gBACA,sCAIJ,0BACE,2BACA,gBACA,kBACA,yBAGF,eACE,iBACA,yBAGF,UACE,cAGF,UACE,YACA,kBACA,qCAEA,UACE,YACA,aACA,mBACA,uBACA,2CAEA,cxB3K0B,eAEC,CwBqL7B,8CALF,iBACE,MACA,OACA,QACA,SAYA,CAXA,yBAQA,mBACA,8BACA,oBACA,4BAEA,mBACE,0DAGF,SACE,4DAEA,mBACE,mBAKN,6BACE,sBACA,SACA,W5BxQM,e4B0QN,aACA,mBACA,eACA,cACA,cACA,kBACA,kBACA,MACA,SACA,yBAGF,MACE,0BAGF,OACE,CASA,4CANF,UACE,kBACA,kBACA,OACA,YACA,oBAUA,6BAEA,WACE,sBAGF,mBACE,qBACA,gBACA,c5BnTiB,mF4BsTjB,yBAGE,wBAKN,oBACE,sBAGF,qBxBpUQ,YwBsUN,WACA,kBACA,YACA,UACA,SACA,YACA,8BAGF,wB5B1U0B,qB4B8U1B,iBACE,UACA,QACA,YACA,qKAKA,WAEE,mFAGF,WACE,eAKJ,qBACE,kBACA,mBACA,kBACA,oBACA,cACA,wBAEA,eACE,YACA,yBAGF,cACE,kBACA,gBACA,gCAEA,UACE,cACA,kBACA,6BACA,WACA,SACA,OACA,oBACA,qCAIJ,oCACE,iCAGF,wBACE,uCAIA,mBACA,mBACA,6BACA,0BACA,eAIJ,eACE,kBACA,gBxBzZM,ewB2ZN,kBACA,sBACA,cACA,wBAEA,eACE,sBACA,qBAGF,SACE,gCAGF,UACE,YACA,0BzBjYF,iBACE,mBACA,cACA,eACA,aACA,gBACA,qByBgYF,eACE,gBACA,UACA,kBACA,0BAGF,oBACE,sBACA,SACA,gCAEA,wBACE,0BACA,qBACA,sBACA,UACA,4BAKF,qBACE,CADF,gCACE,CADF,kBACE,kBACA,QACA,2BACA,yBAIJ,iBACE,UACA,SACA,OACA,QACA,sBACA,iFACA,eACA,UACA,4BACA,gCAEA,SACE,6EAKF,iBAEE,wBAIJ,YACE,kBACA,MACA,OACA,WACA,YACA,UACA,SACA,gBxB9eI,cJGa,gB4B8ejB,oBACA,+BAEA,aACE,oBACA,8GAEA,aAGE,+BAIJ,aACE,eACA,kCAGF,aACE,eACA,gBACA,4BAIJ,YACE,8BACA,oBACA,CAGE,gUAEA,aAIE,wBAKN,cACE,mBACA,gBACA,uBACA,oCAGE,cACE,qCAKF,eACE,+BAIJ,sBACE,iBACA,eACA,SACA,0BACA,8GAEA,UxBpjBE,+EwB4jBN,cAGE,gBACA,6BAGF,UxBnkBM,iBwBqkBJ,yBAGF,oBACE,aACA,mDAGF,UxB7kBM,uBwBklBN,cACE,YACA,eACA,8BAEA,UACE,WACA,+BAOA,6DANA,iBACA,cACA,kBACA,WACA,UACA,YAWA,CAVA,+BASA,kBACA,+BAGF,iBACE,UACA,kBACA,WACA,YACA,YACA,UACA,4BACA,mBACA,sCACA,oBACA,qBAIJ,gBACE,uBAEA,oBACE,eACA,gBACA,WxBloBE,sFwBqoBF,yBAGE,qBAKN,cACE,YACA,kBACA,4BAEA,UACE,WACA,+BACA,kBACA,cACA,kBACA,WACA,SACA,2DAGF,aAEE,kBACA,WACA,kBACA,SACA,mBACA,6BAGF,6BACE,6BAGF,iBACE,UACA,UACA,kBACA,WACA,YACA,QACA,iBACA,4BACA,mBACA,sCACA,oBACA,CAGE,yFAKF,SACE,6GAQF,gBACE,oBACA,iBC5sBR,YACE,mBACA,mBACA,kBACA,QACA,SACA,YACA,mBAGF,YACE,kBACA,gBACA,qBACA,8BACA,eACA,iBACA,yBACA,WACA,4BACA,wCAEA,uBCtBF,kB9BM0B,sB8BJxB,kBACA,uCACA,YACA,gBACA,qCAEA,aARF,SASI,kBAGF,cACE,mBACA,gBACA,eACA,kBACA,0BACA,6BAGF,WACE,6BAGF,yBACE,sCAEA,uBACE,uCACA,wBACA,wBAIJ,eACE,kDAIA,oBACE,+BAIJ,cACE,sBAGF,eACE,aAIJ,kB9BhD0B,sB8BkDxB,kBACA,uCACA,YACA,gBACA,qCAEA,YARF,SASI,uBAGF,kBACE,oBAGF,kBACE,YACA,0BACA,gBACA,mBAGF,YACE,gCACA,4BAGF,YACE,iCAGF,aACE,gBACA,qBACA,eACA,aACA,aC3FJ,cAOE,qBACA,W/BPM,gD+BEJ,iBACA,+BAOF,WACE,iBAIJ,sBACE,6BAEA,uBACE,2BACA,4BACA,mB/BlBiB,4B+BsBnB,oBACE,8BACA,+BACA,aACA,qBAIJ,YACE,8BACA,cACA,c/BjCmB,c+BmCnB,oBAGF,iBACE,OACA,kBACA,iBACA,gBACA,8BACA,eACA,0BAEA,aACE,6BAIJ,a/BjD0B,mC+BoDxB,aACE,oDAGF,QACE,wBAIJ,iBACE,YACA,OACA,WACA,WACA,yBACA,uBAIA,oBACE,WACA,eACA,yBAGF,iBACE,gBACA,oBAIJ,iBACE,aACA,gBACA,kBACA,gB3B5FM,sB2B8FN,sGAEA,mCAEE,oBAKF,2BACA,gB3BxGM,0B2B2GN,cACE,gBACA,gBACA,oBACA,cACA,WACA,6BACA,W/BnHI,yB+BqHJ,kBACA,4CAEA,QACE,2GAGF,mBAGE,wCAKN,cACE,6CAEA,SACE,kBACA,kBACA,qDAGF,SACE,WACA,kBACA,MACA,OACA,WACA,YACA,mCACA,mBACA,4BAIJ,SACE,kBACA,wBACA,gBACA,MACA,iCAEA,aACE,WACA,gBACA,gBACA,gB3BpKI,mB2ByKR,iBACE,qBACA,YACA,wBAEA,UACE,YACA,wBAIJ,cACE,kBACA,iBACA,c/B/JiB,mD+BkKjB,YACE,qDAGF,eACE,uDAGF,YACE,qBAIJ,YACE,wBC1MF,iBACE,aACA,mBACA,mBACA,WhCHM,kBgCKN,YACA,WACA,gBACA,iBACA,gBACA,4DAEA,aACE,eACA,mFAGF,iBACE,kBACA,gBACA,+FAEA,iBACE,OACA,MACA,kCAIJ,aACE,chC3BiB,2BgC+BnB,cACE,gBACA,iBACA,mBACA,2BAGF,cACE,gBACA,iBACA,gBACA,mBACA,0CAIJ,aACE,kBACA,cACA,mBACA,gCACA,eACA,qBACA,aACA,0BACA,4DAEA,aACE,iBACA,gDAGF,kBhC/DmB,iDgCmEnB,kBhChEwB,WANlB,qGgC2EN,kB5BxEU,WJHJ,oCgCiFR,kBACE,YACA,eACA,iBACA,gBACA,8BAGF,aACE,UACA,kBACA,YACA,gBACA,oCAGF,iBACE,4FAGF,eAEE,mBACA,qCAGF,mCACE,UACE,cACA,0CAGF,YACE,4DAEA,YACE,kBCtHN,UACE,eACA,iBACA,oBAEA,cACE,iBACA,gBACA,kBACA,mBAGF,UjCXM,0BiCaJ,oBAGF,eACE,cACA,iBACA,mDAGF,UACE,YACA,gBACA,gCACA,gBC3BJ,WACE,gBACA,aACA,sBACA,yBACA,kBACA,+BAEA,gBACE,eACA,CACA,2BACA,kCAGF,QACE,iCAGF,aACE,6BAGF,sBACE,0BAGF,MACE,kBACA,aACA,sBACA,iBACA,mDAGF,eACE,sB9BlCI,0B8BoCJ,cACA,gDAGF,iBACE,gDAGF,WACE,mBAIJ,eACE,mBACA,yBACA,gBACA,aACA,sBACA,qBAEA,aACE,sBAGF,aACE,SACA,CACA,4BACA,cACA,qDAHA,sBAOA,qCAIJ,qBAEI,cACE,wBAKN,qBACE,WACA,cACA,6DAEA,UAEE,YACA,UACA,wCAGF,YACE,cACA,kDACA,qCAEA,uCALF,aAMI,yCAIJ,eACE,oCAGF,YACE,uDAGF,cACE,sCAGF,gBACE,eACA,CACA,2BACA,yCAGF,QACE,mCAGF,gBACE,yBAEA,kCAHF,eAII,sCAIJ,sBACE,gBACA,sCAGF,uCACE,YACE,iKAEA,eAGE,6CAIJ,gBACE,2EAGF,YAEE,kGAGF,gBACE,+BAGF,YACE,gBACA,gLAEA,eAIE,gCAIJ,iBACE,6CAEA,cACE,8CAKF,gBACE,CAIA,yFAGF,eACE,0BAMR,cACE,aACA,uBACA,mBACA,gBACA,iBACA,iBACA,gBACA,mBACA,W9BjNM,kB8BmNN,eACA,iBACA,qBACA,sCACA,4FAEA,kBAGE,qCAIJ,UACE,UACE,uDAGF,kCACE,mCAGF,kBAEE,sCAIJ,2CACE,YACE,sCAOA,sEAGF,YACE,uCAIJ,0CACE,YACE,uCAIJ,UACE,YACE,QC1QJ,eACE,eACA,8BAEA,QAEE,gBACA,UAGF,kBACE,kBACA,cAGF,iBACE,MACA,OACA,YACA,qBACA,kBACA,mBACA,sBAEA,kBnCjBsB,amCsBxB,iBACE,aACA,cACA,iBACA,eACA,gBACA,gEAEA,YAEE,gCAGF,aACE,8BAIA,qBACA,WACA,eACA,WnCjDE,cmCmDF,UACA,oBACA,gB/BpDE,sB+BsDF,kBACA,iBACA,oCAEA,oBnCrDoB,wBmC0DtB,cACE,sBAGF,YACE,mBACA,iBACA,cAIJ,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,gBACA,mBACA,cACA,uBAEA,iBACE,qBAGF,oB/B7FY,8E+BkGZ,gBAGE,gBACA,gCAGF,mBACE,SACA,wCAGF,mBAEE,eAIJ,oBACE,WACA,gBACA,CACA,oBACA,iBACA,gBACA,mBACA,cACA,mBAGF,UACE,iBACA,eAGF,eACE,mBACA,cnCzHc,amC6HhB,cACE,uBACA,UACA,SACA,SACA,cnClIc,0BmCoId,kBACA,mBAEA,oBACE,sCAGF,kCAEE,eAIJ,WACE,eACA,kBACA,eACA,6BAIJ,yBACE,gCAEA,YACE,2CAGF,yBACE,aACA,aACA,mBACA,mGAEA,UAEE,aACA,+GAEA,oBnCrLoB,sDmC2LxB,cACE,gBACA,iBACA,YACA,oBACA,cnCrLkB,sCmCwLlB,gCAGF,YACE,mBACA,4CAEA,aACE,wBACA,iBACA,oCAIJ,uBACE,CADF,oBACE,CADF,eACE,sBACA,eACA,WnC1NI,qBmC4NJ,WACA,UACA,oBACA,qXACA,sBACA,kBACA,CACA,yBACA,mDAGF,UACE,cAIJ,anC5NkB,qBmC+NhB,+BACE,6BAEA,8BACE,YC/ON,qBACE,iBANc,cAQd,kBACA,sCAEA,WANF,UAOI,eACA,mBAIJ,sBACE,eACA,gBACA,gBACA,qBACA,cpClBmB,oBoCqBnB,apClBwB,0BoCoBtB,6EAEA,oBAGE,wCAIJ,apChCmB,oBoCqCnB,YACE,oBACA,+BAEA,eACE,yBAIJ,eACE,cpC/CiB,qBoCmDnB,iBACE,cpCpDiB,uBoCwDnB,eACE,mBACA,kBACA,kBACA,yHAGF,sBAME,mBACA,oBACA,gBACA,cpCxEiB,qBoC4EnB,aACE,qBAGF,gBACE,qBAGF,eACE,qBAGF,gBACE,yCAGF,aAEE,qBAGF,eACE,qBAGF,kBACE,yCAMA,iBACA,iBACA,yDAEA,2BACE,yDAGF,2BACE,qBAIJ,UACE,SACA,SACA,gCACA,eACA,4BAEA,UACE,SACA,wBAIJ,UACE,yBACA,8BACA,CADA,iBACA,gBACA,mBACA,iEAEA,+BAEE,cACA,kBACA,gBACA,gBACA,cpCnJe,iCoCuJjB,uBACE,gBACA,gBACA,cpC7IY,qDoCiJd,WAEE,iBACA,kBACA,qBACA,mEAEA,SACE,kBACA,iFAEA,gBACE,kBACA,6EAGF,iBACE,SACA,UACA,mBACA,gBACA,uBACA,+BAMR,YACE,oBAIJ,kBACE,eACA,mCAEA,iBACE,oBACA,8BAGF,YACE,8BACA,eACA,6BAGF,UACE,uBACA,eACA,iBACA,WpCrNI,iBoCuNJ,kBACA,qEAEA,aAEE,6CAIA,apC7Ne,oCoCkOjB,sBACE,gBACA,eACA,iBACA,qCAGF,4BA3BF,iBA4BI,4BAIJ,iBACE,YACA,sBACA,mBACA,CACA,sBACA,0BACA,QACA,aACA,yCAEA,sBACE,eACA,iBACA,gBACA,cpC7Pe,mBoC+Pf,mBACA,gCACA,uBACA,mBACA,gBACA,wFAEA,eAEE,cACA,2CAGF,oBACE,2BAKN,iBACE,mCAIE,UACqB,sCjCnRzB,CiCoRI,kBACA,uCAEA,aACE,WACA,YACA,mBACA,iBhCpOgB,wBD9DtB,4BACA,iCiCsSE,cACE,mCAEA,aACE,WpC5SA,qBoC8SA,uDAGE,yBACE,2CAKN,aACE,cpCrTa,kCoC6TnB,sBAEE,CACA,eACA,eACA,iBACA,mBACA,cpCpUiB,sCoCuUjB,apCpUsB,0BoCsUpB,kBAIJ,cACE,SACA,UACA,gBACA,uBACA,oBACA,kBACA,oBACA,cACA,kBAGF,sBACE,eACA,iBACA,gBACA,mBACA,cpC9ViB,wBoCiWjB,sBACE,cACA,eACA,gBACA,cACA,kBAKF,cACA,iBpC5WiB,mCoC0WnB,sBACE,CAEA,eACA,mBACA,cpC/WiB,kBoCoXjB,cACA,iBpCrXiB,kBoC6XjB,cpC7XiB,mCoC4XnB,sBACE,CACA,gBACA,gBACA,mBACA,cpCjYiB,kBoCsYjB,cpCtYiB,kBoC8YnB,sBACE,eACA,iBACA,gBACA,mBACA,cpCnZiB,mCoCuZnB,gBAEE,mDAEA,2BACE,mDAGF,2BACE,kBAIJ,eACE,kBAGF,kBACE,yCAGF,cAEE,kBAGF,UACE,SACA,SACA,0CACA,cACA,yBAEA,UACE,SACA,iDAIJ,YAEE,+BAGF,kBpCjcwB,kBoCmctB,kBACA,gBACA,sBACA,oCAEA,UACE,aACA,2BACA,iBACA,8BACA,mBACA,uDAGF,YACE,yBACA,qBACA,mFAEA,aACE,eACA,qCAGF,sDAVF,UAWI,8BACA,6CAIJ,MACE,sBACA,qCAEA,2CAJF,YAKI,sBAKN,iBACE,yBAEA,WACE,WACA,uBACA,4BAIJ,iBACE,mBACA,uCAEA,eACE,mCAGF,eACE,cACA,qCAGF,eACE,UACA,mDAEA,kBACE,aACA,iBACA,0FAKE,oBACE,gFAIJ,cACE,qDAIJ,aACE,cACA,6CAMA,UACqB,sCjC9hB3B,mDiCiiBI,cACE,4DAEA,cACE,qCAKN,oCACE,eACE,sCAIJ,2BA9DF,iBA+DI,mFAIJ,qBAGE,mBpC3jBsB,kBoC6jBtB,kCACA,uBAGF,YACE,kBACA,WACA,YACA,2BAEA,YACE,WACA,uCAKF,YACE,eACA,mBACA,mBACA,qCAGF,sCACE,kBACE,uCAIJ,apC7lBiB,qCoCimBjB,eACE,WpCrmBE,gBoCumBF,CpCpmBe,yFoCymBb,apCzmBa,+CoC+mBjB,eACE,qBAIJ,kBACE,yBAEA,aACE,SACA,eACA,YACA,kBACA,qCAIJ,gDAEI,kBACE,yCAGF,eACE,gBACA,WACA,kBACA,uDAEA,iBACE,sCAMR,8BACE,aACE,uCAEA,gBACE,sDAGF,kBACE,6EAIJ,aAEE,qBAIJ,WACE,UAIJ,mBACE,qCAEA,SAHF,eAII,kBAGF,YACE,uBACA,mBACA,aACA,qBAEA,SpC3rBI,YoC6rBF,qCAGF,gBAXF,SAYI,mBACA,sBAIJ,eACE,uBACA,gBACA,gBACA,uBAGF,eACE,gBACA,0BAEA,YACE,yBACA,gBACA,eACA,cpCltBe,6BoCstBjB,eACE,iBACA,+BAGF,kBpCztBsB,aoC2tBpB,0BACA,aACA,uCAEA,YACE,gCAIJ,cACE,gBACA,uDAEA,YACE,mBACA,iDAGF,UACE,YACA,0BACA,gCAIJ,YACE,uCAEA,sBACE,eACA,gBACA,cACA,qCAGF,cACE,cpCjwBa,uFoCuwBnB,eACE,cASA,CpCjxBiB,2CoC8wBjB,iBACA,CACA,kBACA,gBAGF,eACE,cACA,aACA,kDACA,cACA,qCAEA,eAPF,oCAQI,cACA,8BAEA,UACE,aACA,sBACA,0CAEA,OACE,cACA,2CAGF,YACE,mBACA,QACA,cACA,qCAIJ,UACE,2BAGF,eACE,sCAIJ,eAtCF,UAuCI,6BAEA,aACE,gBACA,gBACA,2GAEA,eAGE,uFAIJ,+BAGE,2BAGF,YACE,gCAEA,eACE,qEAEA,eAEE,gBACA,2CAGF,eACE,SAQZ,iBACE,qBACA,iBAGF,aACE,kBACA,aACA,UACA,YACA,cpC72BsB,qBoC+2BtB,eACA,qCAEA,gBAVF,eAWI,WACA,gBACA,cpCz2Bc,SqCjBlB,UACE,eACA,iBACA,yBACA,qBAEA,WAEE,iBACA,mBACA,6BACA,gBACA,mBACA,oBAGF,qBACE,gCACA,aACA,gBACA,oBAGF,eACE,qEAGF,kBrCrBwB,UqC0BxB,arCzBwB,0BqC2BtB,gBAEA,oBACE,eAIJ,eACE,CAII,4HADF,eACE,+FAOF,sBAEE,yFAKF,YAEE,gCAMJ,kBrC9DsB,6BqCgEpB,gCACA,4CAEA,qBACE,8BACA,2CAGF,uBACE,+BACA,0BAKN,qBACE,gBAIJ,aACE,mBACA,MAGF,+BACE,0BAGF,sBACE,SACA,aACA,8CAGF,oBAEE,qBACA,iBACA,eACA,crC1GmB,gBqC4GnB,0DAEA,UrCjHM,wDqCqHN,eACE,iBACA,sEAGF,cACE,yCAKF,YAEE,yDAEA,qBACE,iBACA,eACA,gBACA,qEAEA,cACE,2EAGF,YACE,mBACA,uFAEA,YACE,qHAOJ,sBACA,cACA,uBAIJ,wBACE,mBrC5JsB,sBqC8JtB,YACA,mBACA,gCAEA,gBACE,mBACA,oBAIJ,YACE,yBACA,aACA,mBrC3KsB,gCqC8KtB,aACE,gBACA,mBAIJ,wBACE,aACA,mBACA,qCAEA,wCACE,4BACE,0BAIJ,kBACE,iCAGF,kBrCnMsB,uCqCsMpB,kBACE,4BAIJ,gBACE,oBACA,sCAEA,SACE,wCAGF,YACE,mBACA,mCAGF,aACE,aACA,uBACA,mBACA,kBACA,6CAEA,UACE,YACA,kCAIJ,aACE,mCAGF,aACE,iBACA,crC7Oa,gBqC+Ob,mCAIJ,QACE,WACA,qCAEA,sBACE,gBACA,qCAOJ,4FAFF,YAGI,gCAIJ,aACE,sCAEA,eACE,4BAIJ,wBACE,aACA,gBACA,qCAEA,2BALF,4BAMI,sCAIJ,+CACE,YACE,iBCzRN,YACE,uBACA,WACA,iBACA,iCAEA,gBACE,gBACA,oBACA,cACA,wCAEA,YACE,yBACA,mBtCZoB,YsCcpB,yBAIJ,WAvBc,UAyBZ,oBACA,iCAEA,YACE,mBACA,YACA,uCAEA,aACE,yCAEA,oBACE,aACA,2CAGF,StCzCA,YsC2CE,kBACA,YACA,uCAIJ,aACE,ctC/Ca,qBsCiDb,cACA,eACA,aACA,0HAIA,kBAGE,+BAKN,aACE,iBACA,YACA,aACA,qCAGF,sCACE,YACE,6BAIJ,eACE,0BACA,gBACA,mBACA,qCAEA,2BANF,eAOI,+BAGF,aACE,aACA,ctCzFa,qBsC2Fb,0BACA,2CACA,0BACA,mBACA,gBACA,uBACA,mCAEA,gBACE,oCAGF,UtC1GA,yBsC4GE,0BACA,2CACA,uCAGF,kBACE,sBACA,+BAIJ,kBACE,wBACA,SACA,iCAEA,QACE,kBACA,6DAIJ,UtClIE,yBAMkB,gBsC+HlB,gBACA,mEAEA,wBACE,6DAKN,yBACE,iCAIJ,qBACE,WACA,gBApJY,cAsJZ,sCAGF,uCACE,YACE,iCAGF,WA/JY,cAiKV,sCAIJ,gCACE,UACE,0BAMF,2BACA,qCAEA,wBALF,cAMI,CACA,sBACA,kCAGF,YACE,oBAEA,gCACA,0BAEA,eAEA,mBACA,8BACA,mCAEA,eACE,kBACA,yCAGF,mBACE,4DAEA,eACE,qCAIJ,gCAzBF,eA0BI,iBACA,6BAIJ,atClNiB,esCoNf,iBACA,gBACA,qCAEA,2BANF,eAOI,6BAIJ,atC7NiB,esC+Nf,iBACA,gBACA,mBACA,4BAGF,wBACE,eACA,gBACA,ctCxOe,mBsC0Of,kBACA,gCACA,4BAGF,cACE,ctChPe,iBsCkPf,gBACA,0CAGF,UtCzPI,gBsC2PF,uFAGF,eAEE,gEAGF,aACE,4CAGF,cACE,gBACA,WtCzQE,oBsC2QF,iBACA,gBACA,mBACA,2BAGF,cACE,iBACA,ctChRe,mBsCkRf,kCAEA,UtCvRE,gBsCyRA,CAII,2NADF,eACE,4BAMR,UACE,SACA,SACA,0CACA,cACA,mCAEA,UACE,SACA,qCAKN,eA9SF,aA+SI,iCAEA,YACE,yBAGF,UACE,UACA,YACA,iCAEA,YACE,4BAGF,YACE,8DAGF,eAEE,gCACA,gBACA,0EAEA,eACE,+BAIJ,eACE,6DAGF,2BtC9UoB,YsCqV1B,UACE,SACA,cACA,WACA,sDAKA,atCjWmB,0DsCoWjB,atCjWsB,4DsCsWxB,alC1Wc,gBkC4WZ,4DAGF,alC9WU,gBkCgXR,0DAGF,atCtWgB,gBsCwWd,0DAGF,alCtXU,gBkCwXR,UAIJ,YACE,eACA,yBAEA,aACE,qBACA,oCAEA,kBACE,4BAGF,cACE,gBACA,+BAEA,oBACE,iBACA,gCAIJ,eACE,yBACA,eACA,CAII,iNADF,eACE,2BAKN,oBACE,ctCjae,qBsCmaf,yBACA,eACA,gBACA,gCACA,iCAEA,UtC5aE,gCsC8aA,oCAGF,atC3aoB,gCsC6alB,iBAMR,aACE,iBACA,eACA,sBAGF,aACE,eACA,cACA,wBAEA,aACE,kBAIJ,YACE,eACA,mBACA,wBAGF,YACE,WACA,sBACA,aACA,+BAEA,aACE,qBACA,gBACA,eACA,iBACA,ctCvdiB,CsC4db,4MADF,eACE,sCAKN,aACE,gCAIJ,YAEE,mBACA,kEAEA,UACE,kBACA,4BACA,gFAEA,iBACE,kDAKN,aAEE,aACA,sBACA,4EAEA,cACE,WACA,kBACA,mBACA,uEAIJ,cAEE,iBAGF,YACE,eACA,kBACA,2CAEA,kBACE,eACA,8BAGF,kBACE,+CAGF,gBACE,uDAEA,gBACE,mBACA,YACA,YAKN,kBACE,eACA,cAEA,atCniBwB,qBsCqiBtB,oBAEA,yBACE,SAKN,aACE,YAGF,kBACE,iBACA,oBAEA,YACE,2BACA,mBACA,aACA,mBtC1jBsB,cAFL,0BsC+jBjB,eACA,kBACA,oBAGF,iBACE,4BAEA,aACE,SACA,kBACA,WACA,YACA,qBAIJ,2BACE,mBAGF,oBACE,uBAGF,atC3kBgB,oBsC+kBhB,kBACE,0BACA,aACA,ctC/lBiB,gCsCimBjB,eACA,qBACA,gBACA,kBAGF,cACE,kBACA,ctC5lBc,2BsCgmBhB,iBACE,SACA,WACA,WACA,YACA,kBACA,oCAEA,kBlCtnBY,oCkC0nBZ,kBACE,mCAGF,kBtC1nBsB,sDsC+nBxB,atCloBmB,qBsCsoBjB,gBACA,sBAGF,aACE,0BAGF,atC9oBmB,sBsCkpBnB,alCnpBc,yDkCwpBhB,oBAIE,ctC3pBmB,iGsC8pBnB,eACE,yIAIA,4BACE,cACA,iIAGF,8BACE,CADF,sBACE,WACA,sBAKN,YAEE,mBACA,sCAEA,aACE,CACA,gBACA,kBACA,0DAIA,8BACE,CADF,sBACE,WACA,gBAKN,kBACE,8BACA,yBAEA,yBlCxsBc,yBkC4sBd,yBACE,wBAGF,yBlC7sBU,wBkCktBR,2BACA,eACA,iBACA,4BACA,kBACA,gBACA,0BAEA,atC5tBiB,uBsCkuBjB,wBACA,qBAGF,atCztBgB,csC8tBlB,kBtCzuB0B,kBsC2uBxB,mBACA,uBAEA,YACE,8BACA,mBACA,aACA,gCAEA,SACE,SACA,gDAEA,aACE,8BAIJ,aACE,gBACA,ctCjwBe,yBsCmwBf,iBACA,gCAEA,aACE,qBACA,iHAEA,aAGE,mCAIJ,alCjxBM,6BkCwxBR,YACE,2BACA,6BACA,mCAEA,kBACE,gFAGF,YAEE,cACA,sBACA,YACA,ctCtyBa,mLsCyyBb,kBAEE,gBACA,uBACA,sCAIJ,aACE,6BACA,4CAEA,atCxyBU,iBsC0yBR,gBACA,wCAIJ,aACE,sBACA,WACA,aACA,qBACA,ctCj0Ba,WsCw0BrB,kBAGE,0BAFA,eACA,uBASA,CARA,eAGF,oBACE,gBACA,CAEA,qBACA,oBAGF,YACE,eACA,CACA,kBACA,wBAEA,qBACE,cACA,mBACA,aACA,0FAGF,kBAEE,kBACA,YACA,6CAGF,QACE,SACA,+CAEA,aACE,sEAGF,uBACE,yDAGF,alCv3BY,8CkC43Bd,qBACE,aACA,WtCh4BI,csCq4BR,iBACE,0pDCr4BF,kIACE,CADF,sIACE,uIAYA,aAEE,yIAGF,aAEE,qIAGF,aAEE,6IAGF,aAEE,UChCJ,aACE,gCAEA,gBACE,eACA,mBACA,+BAGF,cACE,iBACA,8CAGF,aACE,kBACA,wBAGF,gBACE,iCAGF,aACE,kBACA,uCAGF,oBACE,gDAGF,SACE,YACA,8BAGF,cACE,iBACA,mEAGF,aACE,kBACA,2DAGF,cAEE,gBACA,mFAGF,cACE,gBACA,+BAGF,eACE,2EAGF,UAEE,mCAGF,aACE,iBACA,yBAGF,kBACE,kBACA,4BAGF,UACE,UACA,wBAGF,aACE,kCAGF,MACE,WACA,cACA,mBACA,2CAGF,aACE,iBACA,0CAGF,gBACE,eACA,mCAGF,WACE,sCAGF,gBACE,gBACA,yCAGF,UACE,iCAGF,aACE,iBACA,+BAGF,UACE,0BAGF,gBACE,eACA,UAGA,WACA,yCAGF,iBACE,mBACA,4GAGF,iBAEE,gBACA,uCAGF,kBACE,eACA,2BAGF,aACE,kBACA,wCAGF,SACE,YACA,yDAGF,SACE,WACA,CAKA,oFAGF,UACE,OACA,uGAGF,UAEE,gBACA,uCAIA,cACE,iBACA,kEAEA,cACE,gBACA,qCAKN,WACE,eACA,iBACA,uCAGF,WACE,sCAGF,aACE,kBACA,0CAGF,gBACE,eACA,uDAGF,gBACE,2CAGF,cACE,iBACA,YACA,yEAGF,aAEE,iBACA,iBAGF,wBACE,iBAGF,SACE,oBACA,yBAGF,aACE,8EAGF,cAEE,gBACA,oDAGF,cACE,mBACA,gEAGF,iBACE,gBACA,CAMA,8KAGF,SACE,QACA,yDAGF,kBACE,eACA,uDAGF,kBACE,gBACA,qDAGF,SACE,QACA,8FAGF,cAEE,mBACA,4CAGF,UACE,SACA,kDAEA,UACE,OACA,qEACA,8BAIJ,sXACE,uCAGF,gBAEE,kCAGF,cACE,iBACA,gDAGF,UACE,UACA,gEAGF,aACE,uDAGF,WACE,WACA,uDAGF,UACE,WACA,uDAGF,UACE,WACA,kDAGF,MACE,0CAGF,iBACE,yBACA,qDAGF,cACE,iBACA,qCAGF,kCACE,gBAEE,kBACA,2DAEA,gBACE,mBACA,uEAKF,gBAEE,kBACA,gFAKN,cAEE,gBACA,6CAKE,eACE,eACA,sDAIJ,aACE,kBACA,4DAKF,cACE,gBACA,8DAGF,gBACE,eACA,mCAIJ,aACE,kBACA,iBACA,kCAGF,WACE,mCAGF,WACE,oCAGF,cACE,gBACA,gFAGF,cACE,mBACA,+DAGF,SACE,QACA,sBChbJ,YACE,eACA,CACA,kBACA,0BAEA,qBACE,iBACA,cACA,mBACA,yDAEA,YAEE,mBACA,kBACA,sBACA,YACA,4BAGF,oBACE,cACA,cACA,qGAEA,kBAGE,sDAKN,iBAEE,gBACA,eACA,iBACA,WzCtCI,uByCwCJ,mBACA,iBACA,4BAGF,cACE,6BAGF,cACE,czC/CiB,kByCiDjB,gBACA,qBAIJ,YACE,eACA,cACA,yBAEA,gBACE,mBACA,6BAEA,aACE,sCAIJ,azCpEmB,gByCsEjB,qBACA,wBCxEJ,kB1CG0B,C0CCtB,4EAGF,kBACE,gDAEA,kB1CPsB,wC0CcxB,gBACE,uCAGF,iBACE,kCAIJ,kBACE,yBACA,mEAEA,uDACE,kDAIJ,kBACE,mFAEA,uDACE,qBAMF,eACE,0CAIJ,kDACE,gBAGF,kB1CnD0B,0B0CuD1B,i2BACE,oCAEA,sDACE,CADF,8CACE,iDAOF,kBAEE,uDAEA,kBACE,qBACA,C1CxEoB,8E0CuF1B,kB1CvF0B,4B0C6FxB,yB1C7FwB,2B0CiGxB,wB1CjGwB,8B0CqGxB,2B1CrGwB,6B0CyGxB,0B1CzGwB,wB0CgHxB,kB1ChHwB,cAFL,0F0C2HnB,aACE,4GAEA,kKAEA,aACE,CAHF,6HAEA,aACE,CAHF,qIAEA,aACE,CAHF,uIAEA,aACE,CAHF,mHAEA,aACE,sCAIJ,kBACE,iCAGF,YACE,C1CzIoB,mH0C+IpB,a1C/IoB,8C0CuJxB,aACE,2JAEA,UtC7JM,wCsCoKR,aACE,mEAEA,aACE,CAHF,yDAEA,aACE,CAHF,6DAEA,aACE,CAHF,8DAEA,aACE,CAHF,oDAEA,aACE,2BAIJ,2BACE,gDAKA,a1C7KwB,iB0CkL1B,oBACE,6BAEA,kBACE,0BAIJ,+BACE,qB1C5LwB,oC0CgM1B,kBACE,iMAIA,kBAIE,qBAIJ,kB1C/MqB,sE0CmNrB,kBACE,4FAGF,kBACE,qOAIF,etC9NQ,yBsC0ON,wBAGF,0BACE,0BAGF,wBACE,uLAGF,kBAME,4qEAIE,qBAGE,uCAMN,aAEE,uBAIF,e1C9QQ,gC0CmRJ,a1ChRoB,yB0CyRtB,e1C5RM,CADA,oG0CwSF,U1CxSE,0D0CqTF,a1ClTe,2C0CwTf,U1C3TE,6C0CgUJ,a1C7TiB,6D0CiUjB,U1CpUI,qB0C2UR,UtC1UQ,yBsC6UN,StC7UM,iGsCmVN,eAGE,CAIA,oEAIA,kBACE,oDAEA,eACE,iHAMA,UtCxWA,2CsCiXR,yCACE,gMAGF,eAUE,sKAGF,U1CnYQ,0D","file":"skins/glitch/mastodon-light/common.css","sourcesContent":["html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:\"\";content:none}table{border-collapse:collapse;border-spacing:0}html{scrollbar-color:#ccd7e0 rgba(255,255,255,.1)}::-webkit-scrollbar{width:12px;height:12px}::-webkit-scrollbar-thumb{background:#ccd7e0;border:0px none #fff;border-radius:50px}::-webkit-scrollbar-thumb:hover{background:#c6d2dc}::-webkit-scrollbar-thumb:active{background:#ccd7e0}::-webkit-scrollbar-track{border:0px none #fff;border-radius:0;background:rgba(255,255,255,.1)}::-webkit-scrollbar-track:hover{background:#d9e1e8}::-webkit-scrollbar-track:active{background:#d9e1e8}::-webkit-scrollbar-corner{background:transparent}body{font-family:sans-serif,sans-serif;background:#eff3f5;font-size:13px;line-height:18px;font-weight:400;color:#000;text-rendering:optimizelegibility;font-feature-settings:\"kern\";text-size-adjust:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-tap-highlight-color:transparent}body.system-font{font-family:system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"Oxygen\",\"Ubuntu\",\"Cantarell\",\"Fira Sans\",\"Droid Sans\",\"Helvetica Neue\",sans-serif,sans-serif}body.app-body{padding:0}body.app-body.layout-single-column{height:auto;min-height:100vh;overflow-y:scroll}body.app-body.layout-multiple-columns{position:absolute;width:100%;height:100%}body.app-body.with-modals--active{overflow-y:hidden}body.lighter{background:#d9e1e8}body.with-modals{overflow-x:hidden;overflow-y:scroll}body.with-modals--active{overflow-y:hidden}body.embed{background:#ccd7e0;margin:0;padding-bottom:0}body.embed .container{position:absolute;width:100%;height:100%;overflow:hidden}body.admin{background:#e6ebf0;padding:0}body.error{position:absolute;text-align:center;color:#282c37;background:#d9e1e8;width:100%;height:100%;padding:0;display:flex;justify-content:center;align-items:center}body.error .dialog{vertical-align:middle;margin:20px}body.error .dialog img{display:block;max-width:470px;width:100%;height:auto;margin-top:-120px}body.error .dialog h1{font-size:20px;line-height:28px;font-weight:400}button{font-family:inherit;cursor:pointer}button:focus{outline:none}.app-holder,.app-holder>div{display:flex;width:100%;align-items:center;justify-content:center;outline:0 !important}.layout-single-column .app-holder,.layout-single-column .app-holder>div{min-height:100vh}.layout-multiple-columns .app-holder,.layout-multiple-columns .app-holder>div{height:100%}.container-alt{width:700px;margin:0 auto;margin-top:40px}@media screen and (max-width: 740px){.container-alt{width:100%;margin:0}}.logo-container{margin:100px auto 50px}@media screen and (max-width: 500px){.logo-container{margin:40px auto 0}}.logo-container h1{display:flex;justify-content:center;align-items:center}.logo-container h1 svg{fill:#000;height:42px;margin-right:10px}.logo-container h1 a{display:flex;justify-content:center;align-items:center;color:#000;text-decoration:none;outline:0;padding:12px 16px;line-height:32px;font-family:sans-serif,sans-serif;font-weight:500;font-size:14px}.compose-standalone .compose-form{width:400px;margin:0 auto;padding:20px 0;margin-top:40px;box-sizing:border-box}@media screen and (max-width: 400px){.compose-standalone .compose-form{width:100%;margin-top:0;padding:20px}}.account-header{width:400px;margin:0 auto;display:flex;font-size:13px;line-height:18px;box-sizing:border-box;padding:20px 0;padding-bottom:0;margin-bottom:-30px;margin-top:40px}@media screen and (max-width: 440px){.account-header{width:100%;margin:0;margin-bottom:10px;padding:20px;padding-bottom:0}}.account-header .avatar{width:40px;height:40px;width:40px;height:40px;background-size:40px 40px;margin-right:8px}.account-header .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px;border-radius:8%;background-position:50%;background-clip:padding-box}.account-header .name{flex:1 1 auto;color:#282c37;width:calc(100% - 88px)}.account-header .name .username{display:block;font-weight:500;text-overflow:ellipsis;overflow:hidden}.account-header .logout-link{display:block;font-size:32px;line-height:40px;margin-left:8px}.grid-3{display:grid;grid-gap:10px;grid-template-columns:3fr 1fr;grid-auto-columns:25%;grid-auto-rows:max-content}.grid-3 .column-0{grid-column:1/3;grid-row:1}.grid-3 .column-1{grid-column:1;grid-row:2}.grid-3 .column-2{grid-column:2;grid-row:2}.grid-3 .column-3{grid-column:1/3;grid-row:3}@media screen and (max-width: 415px){.grid-3{grid-gap:0;grid-template-columns:minmax(0, 100%)}.grid-3 .column-0{grid-column:1}.grid-3 .column-1{grid-column:1;grid-row:3}.grid-3 .column-2{grid-column:1;grid-row:2}.grid-3 .column-3{grid-column:1;grid-row:4}}.grid-4{display:grid;grid-gap:10px;grid-template-columns:repeat(4, minmax(0, 1fr));grid-auto-columns:25%;grid-auto-rows:max-content}.grid-4 .column-0{grid-column:1/5;grid-row:1}.grid-4 .column-1{grid-column:1/4;grid-row:2}.grid-4 .column-2{grid-column:4;grid-row:2}.grid-4 .column-3{grid-column:2/5;grid-row:3}.grid-4 .column-4{grid-column:1;grid-row:3}.grid-4 .landing-page__call-to-action{min-height:100%}.grid-4 .flash-message{margin-bottom:10px}@media screen and (max-width: 738px){.grid-4{grid-template-columns:minmax(0, 50%) minmax(0, 50%)}.grid-4 .landing-page__call-to-action{padding:20px;display:flex;align-items:center;justify-content:center}.grid-4 .row__information-board{width:100%;justify-content:center;align-items:center}.grid-4 .row__mascot{display:none}}@media screen and (max-width: 415px){.grid-4{grid-gap:0;grid-template-columns:minmax(0, 100%)}.grid-4 .column-0{grid-column:1}.grid-4 .column-1{grid-column:1;grid-row:3}.grid-4 .column-2{grid-column:1;grid-row:2}.grid-4 .column-3{grid-column:1;grid-row:5}.grid-4 .column-4{grid-column:1;grid-row:4}}@media screen and (max-width: 415px){.public-layout{padding-top:48px}}.public-layout .container{max-width:960px}@media screen and (max-width: 415px){.public-layout .container{padding:0}}.public-layout .header{background:#c0cdd9;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;height:48px;margin:10px 0;display:flex;align-items:stretch;justify-content:center;flex-wrap:nowrap;overflow:hidden}@media screen and (max-width: 415px){.public-layout .header{position:fixed;width:100%;top:0;left:0;margin:0;border-radius:0;box-shadow:none;z-index:110}}.public-layout .header>div{flex:1 1 33.3%;min-height:1px}.public-layout .header .nav-left{display:flex;align-items:stretch;justify-content:flex-start;flex-wrap:nowrap}.public-layout .header .nav-center{display:flex;align-items:stretch;justify-content:center;flex-wrap:nowrap}.public-layout .header .nav-right{display:flex;align-items:stretch;justify-content:flex-end;flex-wrap:nowrap}.public-layout .header .brand{display:block;padding:15px}.public-layout .header .brand svg{display:block;height:18px;width:auto;position:relative;bottom:-2px;fill:#000}@media screen and (max-width: 415px){.public-layout .header .brand svg{height:20px}}.public-layout .header .brand:hover,.public-layout .header .brand:focus,.public-layout .header .brand:active{background:#b3c3d1}.public-layout .header .nav-link{display:flex;align-items:center;padding:0 1rem;font-size:12px;font-weight:500;text-decoration:none;color:#282c37;white-space:nowrap;text-align:center}.public-layout .header .nav-link:hover,.public-layout .header .nav-link:focus,.public-layout .header .nav-link:active{text-decoration:underline;color:#000}@media screen and (max-width: 550px){.public-layout .header .nav-link.optional{display:none}}.public-layout .header .nav-button{background:#a6b9c9;margin:8px;margin-left:0;border-radius:4px}.public-layout .header .nav-button:hover,.public-layout .header .nav-button:focus,.public-layout .header .nav-button:active{text-decoration:none;background:#99afc2}.public-layout .grid{display:grid;grid-gap:10px;grid-template-columns:minmax(300px, 3fr) minmax(298px, 1fr);grid-auto-columns:25%;grid-auto-rows:max-content}.public-layout .grid .column-0{grid-row:1;grid-column:1}.public-layout .grid .column-1{grid-row:1;grid-column:2}@media screen and (max-width: 600px){.public-layout .grid{grid-template-columns:100%;grid-gap:0}.public-layout .grid .column-1{display:none}}.public-layout .directory__card{border-radius:4px}@media screen and (max-width: 415px){.public-layout .directory__card{border-radius:0}}@media screen and (max-width: 415px){.public-layout .page-header{border-bottom:0}}.public-layout .public-account-header{overflow:hidden;margin-bottom:10px;box-shadow:0 0 15px rgba(0,0,0,.2)}.public-layout .public-account-header.inactive{opacity:.5}.public-layout .public-account-header.inactive .public-account-header__image,.public-layout .public-account-header.inactive .avatar{filter:grayscale(100%)}.public-layout .public-account-header.inactive .logo-button{background-color:#282c37}.public-layout .public-account-header__image{border-radius:4px 4px 0 0;overflow:hidden;height:300px;position:relative;background:#fff}.public-layout .public-account-header__image::after{content:\"\";display:block;position:absolute;width:100%;height:100%;box-shadow:inset 0 -1px 1px 1px rgba(0,0,0,.15);top:0;left:0}.public-layout .public-account-header__image img{object-fit:cover;display:block;width:100%;height:100%;margin:0;border-radius:4px 4px 0 0}@media screen and (max-width: 600px){.public-layout .public-account-header__image{height:200px}}.public-layout .public-account-header--no-bar{margin-bottom:0}.public-layout .public-account-header--no-bar .public-account-header__image,.public-layout .public-account-header--no-bar .public-account-header__image img{border-radius:4px}@media screen and (max-width: 415px){.public-layout .public-account-header--no-bar .public-account-header__image,.public-layout .public-account-header--no-bar .public-account-header__image img{border-radius:0}}@media screen and (max-width: 415px){.public-layout .public-account-header{margin-bottom:0;box-shadow:none}.public-layout .public-account-header__image::after{display:none}.public-layout .public-account-header__image,.public-layout .public-account-header__image img{border-radius:0}}.public-layout .public-account-header__bar{position:relative;margin-top:-80px;display:flex;justify-content:flex-start}.public-layout .public-account-header__bar::before{content:\"\";display:block;background:#ccd7e0;position:absolute;bottom:0;left:0;right:0;height:60px;border-radius:0 0 4px 4px;z-index:-1}.public-layout .public-account-header__bar .avatar{display:block;width:120px;height:120px;width:120px;height:120px;background-size:120px 120px;padding-left:16px;flex:0 0 auto}.public-layout .public-account-header__bar .avatar img{display:block;width:100%;height:100%;margin:0;border-radius:50%;border:4px solid #ccd7e0;background:#f2f5f7;border-radius:8%;background-position:50%;background-clip:padding-box}@media screen and (max-width: 600px){.public-layout .public-account-header__bar{margin-top:0;background:#ccd7e0;border-radius:0 0 4px 4px;padding:5px}.public-layout .public-account-header__bar::before{display:none}.public-layout .public-account-header__bar .avatar{width:48px;height:48px;width:48px;height:48px;background-size:48px 48px;padding:7px 0;padding-left:10px}.public-layout .public-account-header__bar .avatar img{border:0;border-radius:4px;border-radius:8%;background-position:50%;background-clip:padding-box}}@media screen and (max-width: 600px)and (max-width: 360px){.public-layout .public-account-header__bar .avatar{display:none}}@media screen and (max-width: 415px){.public-layout .public-account-header__bar{border-radius:0}}@media screen and (max-width: 600px){.public-layout .public-account-header__bar{flex-wrap:wrap}}.public-layout .public-account-header__tabs{flex:1 1 auto;margin-left:20px}.public-layout .public-account-header__tabs__name{padding-top:20px;padding-bottom:8px}.public-layout .public-account-header__tabs__name h1{font-size:20px;line-height:27px;color:#000;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-shadow:1px 1px 1px #000}.public-layout .public-account-header__tabs__name h1 small{display:block;font-size:14px;color:#000;font-weight:400;overflow:hidden;text-overflow:ellipsis}@media screen and (max-width: 600px){.public-layout .public-account-header__tabs{margin-left:15px;display:flex;justify-content:space-between;align-items:center}.public-layout .public-account-header__tabs__name{padding-top:0;padding-bottom:0}.public-layout .public-account-header__tabs__name h1{font-size:16px;line-height:24px;text-shadow:none}.public-layout .public-account-header__tabs__name h1 small{color:#282c37}}.public-layout .public-account-header__tabs__tabs{display:flex;justify-content:flex-start;align-items:stretch;height:58px}.public-layout .public-account-header__tabs__tabs .details-counters{display:flex;flex-direction:row;min-width:300px}@media screen and (max-width: 600px){.public-layout .public-account-header__tabs__tabs .details-counters{display:none}}.public-layout .public-account-header__tabs__tabs .counter{min-width:33.3%;box-sizing:border-box;flex:0 0 auto;color:#282c37;padding:10px;border-right:1px solid #ccd7e0;cursor:default;text-align:center;position:relative}.public-layout .public-account-header__tabs__tabs .counter a{display:block}.public-layout .public-account-header__tabs__tabs .counter:last-child{border-right:0}.public-layout .public-account-header__tabs__tabs .counter::after{display:block;content:\"\";position:absolute;bottom:0;left:0;width:100%;border-bottom:4px solid #9baec8;opacity:.5;transition:all 400ms ease}.public-layout .public-account-header__tabs__tabs .counter.active::after{border-bottom:4px solid #2b90d9;opacity:1}.public-layout .public-account-header__tabs__tabs .counter.active.inactive::after{border-bottom-color:#282c37}.public-layout .public-account-header__tabs__tabs .counter:hover::after{opacity:1;transition-duration:100ms}.public-layout .public-account-header__tabs__tabs .counter a{text-decoration:none;color:inherit}.public-layout .public-account-header__tabs__tabs .counter .counter-label{font-size:12px;display:block}.public-layout .public-account-header__tabs__tabs .counter .counter-number{font-weight:500;font-size:18px;margin-bottom:5px;color:#000;font-family:sans-serif,sans-serif}.public-layout .public-account-header__tabs__tabs .spacer{flex:1 1 auto;height:1px}.public-layout .public-account-header__tabs__tabs__buttons{padding:7px 8px}.public-layout .public-account-header__extra{display:none;margin-top:4px}.public-layout .public-account-header__extra .public-account-bio{border-radius:0;box-shadow:none;background:transparent;margin:0 -5px}.public-layout .public-account-header__extra .public-account-bio .account__header__fields{border-top:1px solid #b3c3d1}.public-layout .public-account-header__extra .public-account-bio .roles{display:none}.public-layout .public-account-header__extra__links{margin-top:-15px;font-size:14px;color:#282c37}.public-layout .public-account-header__extra__links a{display:inline-block;color:#282c37;text-decoration:none;padding:15px;font-weight:500}.public-layout .public-account-header__extra__links a strong{font-weight:700;color:#000}@media screen and (max-width: 600px){.public-layout .public-account-header__extra{display:block;flex:100%}}.public-layout .account__section-headline{border-radius:4px 4px 0 0}@media screen and (max-width: 415px){.public-layout .account__section-headline{border-radius:0}}.public-layout .detailed-status__meta{margin-top:25px}.public-layout .public-account-bio{background:#c0cdd9;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;overflow:hidden;margin-bottom:10px}@media screen and (max-width: 415px){.public-layout .public-account-bio{box-shadow:none;margin-bottom:0;border-radius:0}}.public-layout .public-account-bio .account__header__fields{margin:0;border-top:0}.public-layout .public-account-bio .account__header__fields a{color:#217aba}.public-layout .public-account-bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.public-layout .public-account-bio .account__header__fields .verified a{color:#79bd9a}.public-layout .public-account-bio .account__header__content{padding:20px;padding-bottom:0;color:#000}.public-layout .public-account-bio__extra,.public-layout .public-account-bio .roles{padding:20px;font-size:14px;color:#282c37}.public-layout .public-account-bio .roles{padding-bottom:0}.public-layout .directory__list{display:grid;grid-gap:10px;grid-template-columns:minmax(0, 50%) minmax(0, 50%)}@media screen and (max-width: 415px){.public-layout .directory__list{display:block}}.public-layout .directory__list .icon-button{font-size:18px}.public-layout .directory__card{margin-bottom:0}.public-layout .card-grid{display:flex;flex-wrap:wrap;min-width:100%;margin:0 -5px}.public-layout .card-grid>div{box-sizing:border-box;flex:1 0 auto;width:300px;padding:0 5px;margin-bottom:10px;max-width:33.333%}@media screen and (max-width: 900px){.public-layout .card-grid>div{max-width:50%}}@media screen and (max-width: 600px){.public-layout .card-grid>div{max-width:100%}}@media screen and (max-width: 415px){.public-layout .card-grid{margin:0;border-top:1px solid #c0cdd9}.public-layout .card-grid>div{width:100%;padding:0;margin-bottom:0;border-bottom:1px solid #c0cdd9}.public-layout .card-grid>div:last-child{border-bottom:0}.public-layout .card-grid>div .card__bar{background:#d9e1e8}.public-layout .card-grid>div .card__bar:hover,.public-layout .card-grid>div .card__bar:active,.public-layout .card-grid>div .card__bar:focus{background:#ccd7e0}}.no-list{list-style:none}.no-list li{display:inline-block;margin:0 5px}.recovery-codes{list-style:none;margin:0 auto}.recovery-codes li{font-size:125%;line-height:1.5;letter-spacing:1px}.modal-layout{background:#d9e1e8 url('data:image/svg+xml;utf8,') repeat-x bottom fixed;display:flex;flex-direction:column;height:100vh;padding:0}.modal-layout__mastodon{display:flex;flex:1;flex-direction:column;justify-content:flex-end}.modal-layout__mastodon>*{flex:1;max-height:235px}@media screen and (max-width: 600px){.account-header{margin-top:0}}.public-layout .footer{text-align:left;padding-top:20px;padding-bottom:60px;font-size:12px;color:#6d8ca7}@media screen and (max-width: 415px){.public-layout .footer{padding-left:20px;padding-right:20px}}.public-layout .footer .grid{display:grid;grid-gap:10px;grid-template-columns:1fr 1fr 2fr 1fr 1fr}.public-layout .footer .grid .column-0{grid-column:1;grid-row:1;min-width:0}.public-layout .footer .grid .column-1{grid-column:2;grid-row:1;min-width:0}.public-layout .footer .grid .column-2{grid-column:3;grid-row:1;min-width:0;text-align:center}.public-layout .footer .grid .column-2 h4 a{color:#6d8ca7}.public-layout .footer .grid .column-3{grid-column:4;grid-row:1;min-width:0}.public-layout .footer .grid .column-4{grid-column:5;grid-row:1;min-width:0}@media screen and (max-width: 690px){.public-layout .footer .grid{grid-template-columns:1fr 2fr 1fr}.public-layout .footer .grid .column-0,.public-layout .footer .grid .column-1{grid-column:1}.public-layout .footer .grid .column-1{grid-row:2}.public-layout .footer .grid .column-2{grid-column:2}.public-layout .footer .grid .column-3,.public-layout .footer .grid .column-4{grid-column:3}.public-layout .footer .grid .column-4{grid-row:2}}@media screen and (max-width: 600px){.public-layout .footer .grid .column-1{display:block}}@media screen and (max-width: 415px){.public-layout .footer .grid .column-0,.public-layout .footer .grid .column-1,.public-layout .footer .grid .column-3,.public-layout .footer .grid .column-4{display:none}}.public-layout .footer h4{text-transform:uppercase;font-weight:700;margin-bottom:8px;color:#282c37}.public-layout .footer h4 a{color:inherit;text-decoration:none}.public-layout .footer ul a{text-decoration:none;color:#6d8ca7}.public-layout .footer ul a:hover,.public-layout .footer ul a:active,.public-layout .footer ul a:focus{text-decoration:underline}.public-layout .footer .brand svg{display:block;height:36px;width:auto;margin:0 auto;fill:#6d8ca7}.public-layout .footer .brand:hover svg,.public-layout .footer .brand:focus svg,.public-layout .footer .brand:active svg{fill:#60829f}.compact-header h1{font-size:24px;line-height:28px;color:#282c37;font-weight:500;margin-bottom:20px;padding:0 10px;word-wrap:break-word}@media screen and (max-width: 740px){.compact-header h1{text-align:center;padding:20px 10px 0}}.compact-header h1 a{color:inherit;text-decoration:none}.compact-header h1 small{font-weight:400;color:#282c37}.compact-header h1 img{display:inline-block;margin-bottom:-5px;margin-right:15px;width:36px;height:36px}.hero-widget{margin-bottom:10px;box-shadow:0 0 15px rgba(0,0,0,.2)}.hero-widget__img{width:100%;position:relative;overflow:hidden;border-radius:4px 4px 0 0;background:#000}.hero-widget__img img{object-fit:cover;display:block;width:100%;height:100%;margin:0;border-radius:4px 4px 0 0}.hero-widget__text{background:#d9e1e8;padding:20px;border-radius:0 0 4px 4px;font-size:15px;color:#282c37;line-height:20px;word-wrap:break-word;font-weight:400}.hero-widget__text .emojione{width:20px;height:20px;margin:-3px 0 0}.hero-widget__text p{margin-bottom:20px}.hero-widget__text p:last-child{margin-bottom:0}.hero-widget__text em{display:inline;margin:0;padding:0;font-weight:700;background:transparent;font-family:inherit;font-size:inherit;line-height:inherit;color:#131419}.hero-widget__text a{color:#282c37;text-decoration:none}.hero-widget__text a:hover{text-decoration:underline}@media screen and (max-width: 415px){.hero-widget{display:none}}.endorsements-widget{margin-bottom:10px;padding-bottom:10px}.endorsements-widget h4{padding:10px;text-transform:uppercase;font-weight:700;font-size:13px;color:#282c37}.endorsements-widget .account{padding:10px 0}.endorsements-widget .account:last-child{border-bottom:0}.endorsements-widget .account .account__display-name{display:flex;align-items:center}.endorsements-widget .account .account__avatar{width:44px;height:44px;background-size:44px 44px}.endorsements-widget .trends__item{padding:10px}.trends-widget h4{color:#282c37}.box-widget{padding:20px;border-radius:4px;background:#d9e1e8;box-shadow:0 0 15px rgba(0,0,0,.2)}.placeholder-widget{padding:16px;border-radius:4px;border:2px dashed #444b5d;text-align:center;color:#282c37;margin-bottom:10px}.contact-widget{min-height:100%;font-size:15px;color:#282c37;line-height:20px;word-wrap:break-word;font-weight:400;padding:0}.contact-widget h4{padding:10px;text-transform:uppercase;font-weight:700;font-size:13px;color:#282c37}.contact-widget .account{border-bottom:0;padding:10px 0;padding-top:5px}.contact-widget>a{display:inline-block;padding:10px;padding-top:0;color:#282c37;text-decoration:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.contact-widget>a:hover,.contact-widget>a:focus,.contact-widget>a:active{text-decoration:underline}.moved-account-widget{padding:15px;padding-bottom:20px;border-radius:4px;background:#d9e1e8;box-shadow:0 0 15px rgba(0,0,0,.2);color:#282c37;font-weight:400;margin-bottom:10px}.moved-account-widget strong,.moved-account-widget a{font-weight:500}.moved-account-widget strong:lang(ja),.moved-account-widget a:lang(ja){font-weight:700}.moved-account-widget strong:lang(ko),.moved-account-widget a:lang(ko){font-weight:700}.moved-account-widget strong:lang(zh-CN),.moved-account-widget a:lang(zh-CN){font-weight:700}.moved-account-widget strong:lang(zh-HK),.moved-account-widget a:lang(zh-HK){font-weight:700}.moved-account-widget strong:lang(zh-TW),.moved-account-widget a:lang(zh-TW){font-weight:700}.moved-account-widget a{color:inherit;text-decoration:underline}.moved-account-widget a.mention{text-decoration:none}.moved-account-widget a.mention span{text-decoration:none}.moved-account-widget a.mention:focus,.moved-account-widget a.mention:hover,.moved-account-widget a.mention:active{text-decoration:none}.moved-account-widget a.mention:focus span,.moved-account-widget a.mention:hover span,.moved-account-widget a.mention:active span{text-decoration:underline}.moved-account-widget__message{margin-bottom:15px}.moved-account-widget__message .fa{margin-right:5px;color:#282c37}.moved-account-widget__card .detailed-status__display-avatar{position:relative;cursor:pointer}.moved-account-widget__card .detailed-status__display-name{margin-bottom:0;text-decoration:none}.moved-account-widget__card .detailed-status__display-name span{font-weight:400}.memoriam-widget{padding:20px;border-radius:4px;background:#000;box-shadow:0 0 15px rgba(0,0,0,.2);font-size:14px;color:#282c37;margin-bottom:10px}.page-header{background:#c0cdd9;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;padding:60px 15px;text-align:center;margin:10px 0}.page-header h1{color:#000;font-size:36px;line-height:1.1;font-weight:700;margin-bottom:10px}.page-header p{font-size:15px;color:#282c37}@media screen and (max-width: 415px){.page-header{margin-top:0;background:#ccd7e0}.page-header h1{font-size:24px}}.directory{background:#d9e1e8;border-radius:4px;box-shadow:0 0 15px rgba(0,0,0,.2)}.directory__tag{box-sizing:border-box;margin-bottom:10px}.directory__tag>a,.directory__tag>div{display:flex;align-items:center;justify-content:space-between;background:#d9e1e8;border-radius:4px;padding:15px;text-decoration:none;color:inherit;box-shadow:0 0 15px rgba(0,0,0,.2)}.directory__tag>a:hover,.directory__tag>a:active,.directory__tag>a:focus{background:#c0cdd9}.directory__tag.active>a{background:#2b90d9;cursor:default}.directory__tag.disabled>div{opacity:.5;cursor:default}.directory__tag h4{flex:1 1 auto;font-size:18px;font-weight:700;color:#000;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.directory__tag h4 .fa{color:#282c37}.directory__tag h4 small{display:block;font-weight:400;font-size:15px;margin-top:8px;color:#282c37}.directory__tag.active h4,.directory__tag.active h4 .fa,.directory__tag.active h4 small{color:#000}.directory__tag .avatar-stack{flex:0 0 auto;width:120px}.directory__tag.active .avatar-stack .account__avatar{border-color:#2b90d9}.avatar-stack{display:flex;justify-content:flex-end}.avatar-stack .account__avatar{flex:0 0 auto;width:36px;height:36px;border-radius:50%;position:relative;margin-left:-10px;background:#f2f5f7;border:2px solid #d9e1e8}.avatar-stack .account__avatar:nth-child(1){z-index:1}.avatar-stack .account__avatar:nth-child(2){z-index:2}.avatar-stack .account__avatar:nth-child(3){z-index:3}.accounts-table{width:100%}.accounts-table .account{padding:0;border:0}.accounts-table strong{font-weight:700}.accounts-table thead th{text-align:center;text-transform:uppercase;color:#282c37;font-weight:700;padding:10px}.accounts-table thead th:first-child{text-align:left}.accounts-table tbody td{padding:15px 0;vertical-align:middle;border-bottom:1px solid #c0cdd9}.accounts-table tbody tr:last-child td{border-bottom:0}.accounts-table__count{width:120px;text-align:center;font-size:15px;font-weight:500;color:#000}.accounts-table__count small{display:block;color:#282c37;font-weight:400;font-size:14px}.accounts-table__comment{width:50%;vertical-align:initial !important}@media screen and (max-width: 415px){.accounts-table tbody td.optional{display:none}}@media screen and (max-width: 415px){.moved-account-widget,.memoriam-widget,.box-widget,.contact-widget,.landing-page__information.contact-widget,.directory,.page-header{margin-bottom:0;box-shadow:none;border-radius:0}}.statuses-grid{min-height:600px}@media screen and (max-width: 640px){.statuses-grid{width:100% !important}}.statuses-grid__item{width:313.3333333333px}@media screen and (max-width: 1255px){.statuses-grid__item{width:306.6666666667px}}@media screen and (max-width: 640px){.statuses-grid__item{width:100%}}@media screen and (max-width: 415px){.statuses-grid__item{width:100vw}}.statuses-grid .detailed-status{border-radius:4px}@media screen and (max-width: 415px){.statuses-grid .detailed-status{border-top:1px solid #a6b9c9}}.statuses-grid .detailed-status.compact .detailed-status__meta{margin-top:15px}.statuses-grid .detailed-status.compact .status__content{font-size:15px;line-height:20px}.statuses-grid .detailed-status.compact .status__content .emojione{width:20px;height:20px;margin:-3px 0 0}.statuses-grid .detailed-status.compact .status__content .status__content__spoiler-link{line-height:20px;margin:0}.statuses-grid .detailed-status.compact .media-gallery,.statuses-grid .detailed-status.compact .status-card,.statuses-grid .detailed-status.compact .video-player{margin-top:15px}.notice-widget{margin-bottom:10px;color:#282c37}.notice-widget p{margin-bottom:10px}.notice-widget p:last-child{margin-bottom:0}.notice-widget a{font-size:14px;line-height:20px}.notice-widget a,.placeholder-widget a{text-decoration:none;font-weight:500;color:#2b90d9}.notice-widget a:hover,.notice-widget a:focus,.notice-widget a:active,.placeholder-widget a:hover,.placeholder-widget a:focus,.placeholder-widget a:active{text-decoration:underline}.table-of-contents{background:#e6ebf0;min-height:100%;font-size:14px;border-radius:4px}.table-of-contents li a{display:block;font-weight:500;padding:15px;overflow:hidden;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-decoration:none;color:#000;border-bottom:1px solid #ccd7e0}.table-of-contents li a:hover,.table-of-contents li a:focus,.table-of-contents li a:active{text-decoration:underline}.table-of-contents li:last-child a{border-bottom:0}.table-of-contents li ul{padding-left:20px;border-bottom:1px solid #ccd7e0}code{font-family:monospace,monospace;font-weight:400}.form-container{max-width:400px;padding:20px;margin:0 auto}.simple_form .input{margin-bottom:15px;overflow:hidden}.simple_form .input.hidden{margin:0}.simple_form .input.radio_buttons .radio{margin-bottom:15px}.simple_form .input.radio_buttons .radio:last-child{margin-bottom:0}.simple_form .input.radio_buttons .radio>label{position:relative;padding-left:28px}.simple_form .input.radio_buttons .radio>label input{position:absolute;top:-2px;left:0}.simple_form .input.boolean{position:relative;margin-bottom:0}.simple_form .input.boolean .label_input>label{font-family:inherit;font-size:14px;padding-top:5px;color:#000;display:block;width:auto}.simple_form .input.boolean .label_input,.simple_form .input.boolean .hint{padding-left:28px}.simple_form .input.boolean .label_input__wrapper{position:static}.simple_form .input.boolean label.checkbox{position:absolute;top:2px;left:0}.simple_form .input.boolean label a{color:#2b90d9;text-decoration:underline}.simple_form .input.boolean label a:hover,.simple_form .input.boolean label a:active,.simple_form .input.boolean label a:focus{text-decoration:none}.simple_form .input.boolean .recommended{position:absolute;margin:0 4px;margin-top:-2px}.simple_form .row{display:flex;margin:0 -5px}.simple_form .row .input{box-sizing:border-box;flex:1 1 auto;width:50%;padding:0 5px}.simple_form .hint{color:#282c37}.simple_form .hint a{color:#2b90d9}.simple_form .hint code{border-radius:3px;padding:.2em .4em;background:#fff}.simple_form span.hint{display:block;font-size:12px;margin-top:4px}.simple_form p.hint{margin-bottom:15px;color:#282c37}.simple_form p.hint.subtle-hint{text-align:center;font-size:12px;line-height:18px;margin-top:15px;margin-bottom:0}.simple_form .card{margin-bottom:15px}.simple_form strong{font-weight:500}.simple_form strong:lang(ja){font-weight:700}.simple_form strong:lang(ko){font-weight:700}.simple_form strong:lang(zh-CN){font-weight:700}.simple_form strong:lang(zh-HK){font-weight:700}.simple_form strong:lang(zh-TW){font-weight:700}.simple_form .input.with_floating_label .label_input{display:flex}.simple_form .input.with_floating_label .label_input>label{font-family:inherit;font-size:14px;color:#000;font-weight:500;min-width:150px;flex:0 0 auto}.simple_form .input.with_floating_label .label_input input,.simple_form .input.with_floating_label .label_input select{flex:1 1 auto}.simple_form .input.with_floating_label.select .hint{margin-top:6px;margin-left:150px}.simple_form .input.with_label .label_input>label{font-family:inherit;font-size:14px;color:#000;display:block;margin-bottom:8px;word-wrap:break-word;font-weight:500}.simple_form .input.with_label .hint{margin-top:6px}.simple_form .input.with_label ul{flex:390px}.simple_form .input.with_block_label{max-width:none}.simple_form .input.with_block_label>label{font-family:inherit;font-size:16px;color:#000;display:block;font-weight:500;padding-top:5px}.simple_form .input.with_block_label .hint{margin-bottom:15px}.simple_form .input.with_block_label ul{columns:2}.simple_form .required abbr{text-decoration:none;color:#c1203b}.simple_form .fields-group{margin-bottom:25px}.simple_form .fields-group .input:last-child{margin-bottom:0}.simple_form .fields-row{display:flex;margin:0 -10px;padding-top:5px;margin-bottom:25px}.simple_form .fields-row .input{max-width:none}.simple_form .fields-row__column{box-sizing:border-box;padding:0 10px;flex:1 1 auto;min-height:1px}.simple_form .fields-row__column-6{max-width:50%}.simple_form .fields-row__column .actions{margin-top:27px}.simple_form .fields-row .fields-group:last-child,.simple_form .fields-row .fields-row__column.fields-group{margin-bottom:0}@media screen and (max-width: 600px){.simple_form .fields-row{display:block;margin-bottom:0}.simple_form .fields-row__column{max-width:none}.simple_form .fields-row .fields-group:last-child,.simple_form .fields-row .fields-row__column.fields-group,.simple_form .fields-row .fields-row__column{margin-bottom:25px}}.simple_form .input.radio_buttons .radio label{margin-bottom:5px;font-family:inherit;font-size:14px;color:#000;display:block;width:auto}.simple_form .check_boxes .checkbox label{font-family:inherit;font-size:14px;color:#000;display:inline-block;width:auto;position:relative;padding-top:5px;padding-left:25px;flex:1 1 auto}.simple_form .check_boxes .checkbox input[type=checkbox]{position:absolute;left:0;top:5px;margin:0}.simple_form .input.static .label_input__wrapper{font-size:16px;padding:10px;border:1px solid #444b5d;border-radius:4px}.simple_form input[type=text],.simple_form input[type=number],.simple_form input[type=email],.simple_form input[type=password],.simple_form textarea{box-sizing:border-box;font-size:16px;color:#000;display:block;width:100%;outline:0;font-family:inherit;resize:vertical;background:#f9fafb;border:1px solid #fff;border-radius:4px;padding:10px}.simple_form input[type=text]::placeholder,.simple_form input[type=number]::placeholder,.simple_form input[type=email]::placeholder,.simple_form input[type=password]::placeholder,.simple_form textarea::placeholder{color:#1f232b}.simple_form input[type=text]:invalid,.simple_form input[type=number]:invalid,.simple_form input[type=email]:invalid,.simple_form input[type=password]:invalid,.simple_form textarea:invalid{box-shadow:none}.simple_form input[type=text]:focus:invalid:not(:placeholder-shown),.simple_form input[type=number]:focus:invalid:not(:placeholder-shown),.simple_form input[type=email]:focus:invalid:not(:placeholder-shown),.simple_form input[type=password]:focus:invalid:not(:placeholder-shown),.simple_form textarea:focus:invalid:not(:placeholder-shown){border-color:#c1203b}.simple_form input[type=text]:required:valid,.simple_form input[type=number]:required:valid,.simple_form input[type=email]:required:valid,.simple_form input[type=password]:required:valid,.simple_form textarea:required:valid{border-color:#79bd9a}.simple_form input[type=text]:hover,.simple_form input[type=number]:hover,.simple_form input[type=email]:hover,.simple_form input[type=password]:hover,.simple_form textarea:hover{border-color:#fff}.simple_form input[type=text]:active,.simple_form input[type=text]:focus,.simple_form input[type=number]:active,.simple_form input[type=number]:focus,.simple_form input[type=email]:active,.simple_form input[type=email]:focus,.simple_form input[type=password]:active,.simple_form input[type=password]:focus,.simple_form textarea:active,.simple_form textarea:focus{border-color:#2b90d9;background:#f2f5f7}.simple_form .input.field_with_errors label{color:#c1203b}.simple_form .input.field_with_errors input[type=text],.simple_form .input.field_with_errors input[type=number],.simple_form .input.field_with_errors input[type=email],.simple_form .input.field_with_errors input[type=password],.simple_form .input.field_with_errors textarea,.simple_form .input.field_with_errors select{border-color:#c1203b}.simple_form .input.field_with_errors .error{display:block;font-weight:500;color:#c1203b;margin-top:4px}.simple_form .input.disabled{opacity:.5}.simple_form .actions{margin-top:30px;display:flex}.simple_form .actions.actions--top{margin-top:0;margin-bottom:30px}.simple_form button,.simple_form .button,.simple_form .block-button{display:block;width:100%;border:0;border-radius:4px;background:#2b90d9;color:#000;font-size:18px;line-height:inherit;height:auto;padding:10px;text-transform:uppercase;text-decoration:none;text-align:center;box-sizing:border-box;cursor:pointer;font-weight:500;outline:0;margin-bottom:10px;margin-right:10px}.simple_form button:last-child,.simple_form .button:last-child,.simple_form .block-button:last-child{margin-right:0}.simple_form button:hover,.simple_form .button:hover,.simple_form .block-button:hover{background-color:#2482c7}.simple_form button:active,.simple_form button:focus,.simple_form .button:active,.simple_form .button:focus,.simple_form .block-button:active,.simple_form .block-button:focus{background-color:#419bdd}.simple_form button:disabled:hover,.simple_form .button:disabled:hover,.simple_form .block-button:disabled:hover{background-color:#9baec8}.simple_form button.negative,.simple_form .button.negative,.simple_form .block-button.negative{background:#df405a}.simple_form button.negative:hover,.simple_form .button.negative:hover,.simple_form .block-button.negative:hover{background-color:#db2a47}.simple_form button.negative:active,.simple_form button.negative:focus,.simple_form .button.negative:active,.simple_form .button.negative:focus,.simple_form .block-button.negative:active,.simple_form .block-button.negative:focus{background-color:#e3566d}.simple_form select{appearance:none;box-sizing:border-box;font-size:16px;color:#000;display:block;width:100%;outline:0;font-family:inherit;resize:vertical;background:#f9fafb url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center/auto 16px;border:1px solid #fff;border-radius:4px;padding-left:10px;padding-right:30px;height:41px}.simple_form h4{margin-bottom:15px !important}.simple_form .label_input__wrapper{position:relative}.simple_form .label_input__append{position:absolute;right:3px;top:1px;padding:10px;padding-bottom:9px;font-size:16px;color:#444b5d;font-family:inherit;pointer-events:none;cursor:default;max-width:140px;white-space:nowrap;overflow:hidden}.simple_form .label_input__append::after{content:\"\";display:block;position:absolute;top:0;right:0;bottom:1px;width:5px;background-image:linear-gradient(to right, rgba(249, 250, 251, 0), #f9fafb)}.simple_form__overlay-area{position:relative}.simple_form__overlay-area__blurred form{filter:blur(2px)}.simple_form__overlay-area__overlay{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;background:rgba(217,225,232,.65);border-radius:4px;margin-left:-4px;margin-top:-4px;padding:4px}.simple_form__overlay-area__overlay__content{text-align:center}.simple_form__overlay-area__overlay__content.rich-formatting,.simple_form__overlay-area__overlay__content.rich-formatting p{color:#000}.block-icon{display:block;margin:0 auto;margin-bottom:10px;font-size:24px}.flash-message{background:#c0cdd9;color:#282c37;border-radius:4px;padding:15px 10px;margin-bottom:30px;text-align:center}.flash-message.notice{border:1px solid rgba(121,189,154,.5);background:rgba(121,189,154,.25);color:#79bd9a}.flash-message.alert{border:1px solid rgba(223,64,90,.5);background:rgba(223,64,90,.25);color:#df405a}.flash-message a{display:inline-block;color:#282c37;text-decoration:none}.flash-message a:hover{color:#000;text-decoration:underline}.flash-message p{margin-bottom:15px}.flash-message .oauth-code{outline:0;box-sizing:border-box;display:block;width:100%;border:none;padding:10px;font-family:monospace,monospace;background:#d9e1e8;color:#000;font-size:14px;margin:0}.flash-message .oauth-code::-moz-focus-inner{border:0}.flash-message .oauth-code::-moz-focus-inner,.flash-message .oauth-code:focus,.flash-message .oauth-code:active{outline:0 !important}.flash-message .oauth-code:focus{background:#ccd7e0}.flash-message strong{font-weight:500}.flash-message strong:lang(ja){font-weight:700}.flash-message strong:lang(ko){font-weight:700}.flash-message strong:lang(zh-CN){font-weight:700}.flash-message strong:lang(zh-HK){font-weight:700}.flash-message strong:lang(zh-TW){font-weight:700}@media screen and (max-width: 740px)and (min-width: 441px){.flash-message{margin-top:40px}}.form-footer{margin-top:30px;text-align:center}.form-footer a{color:#282c37;text-decoration:none}.form-footer a:hover{text-decoration:underline}.quick-nav{list-style:none;margin-bottom:25px;font-size:14px}.quick-nav li{display:inline-block;margin-right:10px}.quick-nav a{color:#2b90d9;text-transform:uppercase;text-decoration:none;font-weight:700}.quick-nav a:hover,.quick-nav a:focus,.quick-nav a:active{color:#217aba}.oauth-prompt,.follow-prompt{margin-bottom:30px;color:#282c37}.oauth-prompt h2,.follow-prompt h2{font-size:16px;margin-bottom:30px;text-align:center}.oauth-prompt strong,.follow-prompt strong{color:#282c37;font-weight:500}.oauth-prompt strong:lang(ja),.follow-prompt strong:lang(ja){font-weight:700}.oauth-prompt strong:lang(ko),.follow-prompt strong:lang(ko){font-weight:700}.oauth-prompt strong:lang(zh-CN),.follow-prompt strong:lang(zh-CN){font-weight:700}.oauth-prompt strong:lang(zh-HK),.follow-prompt strong:lang(zh-HK){font-weight:700}.oauth-prompt strong:lang(zh-TW),.follow-prompt strong:lang(zh-TW){font-weight:700}@media screen and (max-width: 740px)and (min-width: 441px){.oauth-prompt,.follow-prompt{margin-top:40px}}.qr-wrapper{display:flex;flex-wrap:wrap;align-items:flex-start}.qr-code{flex:0 0 auto;background:#fff;padding:4px;margin:0 10px 20px 0;box-shadow:0 0 15px rgba(0,0,0,.2);display:inline-block}.qr-code svg{display:block;margin:0}.qr-alternative{margin-bottom:20px;color:#282c37;flex:150px}.qr-alternative samp{display:block;font-size:14px}.table-form p{margin-bottom:15px}.table-form p strong{font-weight:500}.table-form p strong:lang(ja){font-weight:700}.table-form p strong:lang(ko){font-weight:700}.table-form p strong:lang(zh-CN){font-weight:700}.table-form p strong:lang(zh-HK){font-weight:700}.table-form p strong:lang(zh-TW){font-weight:700}.simple_form .warning,.table-form .warning{box-sizing:border-box;background:rgba(223,64,90,.5);color:#000;text-shadow:1px 1px 0 rgba(0,0,0,.3);box-shadow:0 2px 6px rgba(0,0,0,.4);border-radius:4px;padding:10px;margin-bottom:15px}.simple_form .warning a,.table-form .warning a{color:#000;text-decoration:underline}.simple_form .warning a:hover,.simple_form .warning a:focus,.simple_form .warning a:active,.table-form .warning a:hover,.table-form .warning a:focus,.table-form .warning a:active{text-decoration:none}.simple_form .warning strong,.table-form .warning strong{font-weight:600;display:block;margin-bottom:5px}.simple_form .warning strong:lang(ja),.table-form .warning strong:lang(ja){font-weight:700}.simple_form .warning strong:lang(ko),.table-form .warning strong:lang(ko){font-weight:700}.simple_form .warning strong:lang(zh-CN),.table-form .warning strong:lang(zh-CN){font-weight:700}.simple_form .warning strong:lang(zh-HK),.table-form .warning strong:lang(zh-HK){font-weight:700}.simple_form .warning strong:lang(zh-TW),.table-form .warning strong:lang(zh-TW){font-weight:700}.simple_form .warning strong .fa,.table-form .warning strong .fa{font-weight:400}.action-pagination{display:flex;flex-wrap:wrap;align-items:center}.action-pagination .actions,.action-pagination .pagination{flex:1 1 auto}.action-pagination .actions{padding:30px 0;padding-right:20px;flex:0 0 auto}.post-follow-actions{text-align:center;color:#282c37}.post-follow-actions div{margin-bottom:4px}.alternative-login{margin-top:20px;margin-bottom:20px}.alternative-login h4{font-size:16px;color:#000;text-align:center;margin-bottom:20px;border:0;padding:0}.alternative-login .button{display:block}.scope-danger{color:#ff5050}.form_admin_settings_site_short_description textarea,.form_admin_settings_site_description textarea,.form_admin_settings_site_extended_description textarea,.form_admin_settings_site_terms textarea,.form_admin_settings_custom_css textarea,.form_admin_settings_closed_registrations_message textarea{font-family:monospace,monospace}.input-copy{background:#f9fafb;border:1px solid #fff;border-radius:4px;display:flex;align-items:center;padding-right:4px;position:relative;top:1px;transition:border-color 300ms linear}.input-copy__wrapper{flex:1 1 auto}.input-copy input[type=text]{background:transparent;border:0;padding:10px;font-size:14px;font-family:monospace,monospace}.input-copy button{flex:0 0 auto;margin:4px;text-transform:none;font-weight:400;font-size:14px;padding:7px 18px;padding-bottom:6px;width:auto;transition:background 300ms linear}.input-copy.copied{border-color:#79bd9a;transition:none}.input-copy.copied button{background:#79bd9a;transition:none}.connection-prompt{margin-bottom:25px}.connection-prompt .fa-link{background-color:#e6ebf0;border-radius:100%;font-size:24px;padding:10px}.connection-prompt__column{align-items:center;display:flex;flex:1;flex-direction:column;flex-shrink:1;max-width:50%}.connection-prompt__column-sep{align-self:center;flex-grow:0;overflow:visible;position:relative;z-index:1}.connection-prompt__column p{word-break:break-word}.connection-prompt .account__avatar{margin-bottom:20px}.connection-prompt__connection{background-color:#c0cdd9;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;padding:25px 10px;position:relative;text-align:center}.connection-prompt__connection::after{background-color:#e6ebf0;content:\"\";display:block;height:100%;left:50%;position:absolute;top:0;width:1px}.connection-prompt__row{align-items:flex-start;display:flex;flex-direction:row}.card>a{display:block;text-decoration:none;color:inherit;box-shadow:0 0 15px rgba(0,0,0,.2)}@media screen and (max-width: 415px){.card>a{box-shadow:none}}.card>a:hover .card__bar,.card>a:active .card__bar,.card>a:focus .card__bar{background:#c0cdd9}.card__img{height:130px;position:relative;background:#fff;border-radius:4px 4px 0 0}.card__img img{display:block;width:100%;height:100%;margin:0;object-fit:cover;border-radius:4px 4px 0 0}@media screen and (max-width: 600px){.card__img{height:200px}}@media screen and (max-width: 415px){.card__img{display:none}}.card__bar{position:relative;padding:15px;display:flex;justify-content:flex-start;align-items:center;background:#ccd7e0;border-radius:0 0 4px 4px}@media screen and (max-width: 415px){.card__bar{border-radius:0}}.card__bar .avatar{flex:0 0 auto;width:48px;height:48px;width:48px;height:48px;background-size:48px 48px;padding-top:2px}.card__bar .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px;border-radius:8%;background-position:50%;background-clip:padding-box;background:#f2f5f7;object-fit:cover}.card__bar .display-name{margin-left:15px;text-align:left}.card__bar .display-name strong{font-size:15px;color:#000;font-weight:500;overflow:hidden;text-overflow:ellipsis}.card__bar .display-name span{display:block;font-size:14px;color:#282c37;font-weight:400;overflow:hidden;text-overflow:ellipsis}.pagination{padding:30px 0;text-align:center;overflow:hidden}.pagination a,.pagination .current,.pagination .newer,.pagination .older,.pagination .page,.pagination .gap{font-size:14px;color:#000;font-weight:500;display:inline-block;padding:6px 10px;text-decoration:none}.pagination .current{background:#fff;border-radius:100px;color:#000;cursor:default;margin:0 10px}.pagination .gap{cursor:default}.pagination .older,.pagination .newer{text-transform:uppercase;color:#282c37}.pagination .older{float:left;padding-left:0}.pagination .older .fa{display:inline-block;margin-right:5px}.pagination .newer{float:right;padding-right:0}.pagination .newer .fa{display:inline-block;margin-left:5px}.pagination .disabled{cursor:default;color:#000}@media screen and (max-width: 700px){.pagination{padding:30px 20px}.pagination .page{display:none}.pagination .newer,.pagination .older{display:inline-block}}.nothing-here{background:#d9e1e8;box-shadow:0 0 15px rgba(0,0,0,.2);color:#444b5d;font-size:14px;font-weight:500;text-align:center;display:flex;justify-content:center;align-items:center;cursor:default;border-radius:4px;padding:20px;min-height:30vh}.nothing-here--under-tabs{border-radius:0 0 4px 4px}.nothing-here--flexible{box-sizing:border-box;min-height:100%}.account-role,.simple_form .recommended{display:inline-block;padding:4px 6px;cursor:default;border-radius:3px;font-size:12px;line-height:12px;font-weight:500;color:#282c37;background-color:rgba(40,44,55,.1);border:1px solid rgba(40,44,55,.5)}.account-role.moderator,.simple_form .recommended.moderator{color:#79bd9a;background-color:rgba(121,189,154,.1);border-color:rgba(121,189,154,.5)}.account-role.admin,.simple_form .recommended.admin{color:#c1203b;background-color:rgba(193,32,59,.1);border-color:rgba(193,32,59,.5)}.account__header__fields{max-width:100vw;padding:0;margin:15px -15px -15px;border:0 none;border-top:1px solid #b3c3d1;border-bottom:1px solid #b3c3d1;font-size:14px;line-height:20px}.account__header__fields dl{display:flex;border-bottom:1px solid #b3c3d1}.account__header__fields dt,.account__header__fields dd{box-sizing:border-box;padding:14px;text-align:center;max-height:48px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.account__header__fields dt{font-weight:500;width:120px;flex:0 0 auto;color:#282c37;background:rgba(242,245,247,.5)}.account__header__fields dd{flex:1 1 auto;color:#282c37}.account__header__fields a{color:#2b90d9;text-decoration:none}.account__header__fields a:hover,.account__header__fields a:focus,.account__header__fields a:active{text-decoration:underline}.account__header__fields .verified{border:1px solid rgba(121,189,154,.5);background:rgba(121,189,154,.25)}.account__header__fields .verified a{color:#79bd9a;font-weight:500}.account__header__fields .verified__mark{color:#79bd9a}.account__header__fields dl:last-child{border-bottom:0}.directory__tag .trends__item__current{width:auto}.pending-account__header{color:#282c37}.pending-account__header a{color:#282c37;text-decoration:none}.pending-account__header a:hover,.pending-account__header a:active,.pending-account__header a:focus{text-decoration:underline}.pending-account__header strong{color:#000;font-weight:700}.pending-account__body{margin-top:10px}.activity-stream{box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;overflow:hidden;margin-bottom:10px}@media screen and (max-width: 415px){.activity-stream{margin-bottom:0;border-radius:0;box-shadow:none}}.activity-stream--headless{border-radius:0;margin:0;box-shadow:none}.activity-stream--headless .detailed-status,.activity-stream--headless .status{border-radius:0 !important}.activity-stream div[data-component]{width:100%}.activity-stream .entry{background:#d9e1e8}.activity-stream .entry .detailed-status,.activity-stream .entry .status,.activity-stream .entry .load-more{animation:none}.activity-stream .entry:last-child .detailed-status,.activity-stream .entry:last-child .status,.activity-stream .entry:last-child .load-more{border-bottom:0;border-radius:0 0 4px 4px}.activity-stream .entry:first-child .detailed-status,.activity-stream .entry:first-child .status,.activity-stream .entry:first-child .load-more{border-radius:4px 4px 0 0}.activity-stream .entry:first-child:last-child .detailed-status,.activity-stream .entry:first-child:last-child .status,.activity-stream .entry:first-child:last-child .load-more{border-radius:4px}@media screen and (max-width: 740px){.activity-stream .entry .detailed-status,.activity-stream .entry .status,.activity-stream .entry .load-more{border-radius:0 !important}}.activity-stream--highlighted .entry{background:#c0cdd9}.button.logo-button{flex:0 auto;font-size:14px;background:#2b90d9;color:#000;text-transform:none;line-height:36px;height:auto;padding:3px 15px;border:0}.button.logo-button svg{width:20px;height:auto;vertical-align:middle;margin-right:5px;fill:#000}.button.logo-button:active,.button.logo-button:focus,.button.logo-button:hover{background:#2074b1}.button.logo-button:disabled:active,.button.logo-button:disabled:focus,.button.logo-button:disabled:hover,.button.logo-button.disabled:active,.button.logo-button.disabled:focus,.button.logo-button.disabled:hover{background:#9baec8}.button.logo-button.button--destructive:active,.button.logo-button.button--destructive:focus,.button.logo-button.button--destructive:hover{background:#df405a}@media screen and (max-width: 415px){.button.logo-button svg{display:none}}.embed .detailed-status,.public-layout .detailed-status{padding:15px}.embed .status,.public-layout .status{padding:15px 15px 15px 78px;min-height:50px}.embed .status__avatar,.public-layout .status__avatar{left:15px;top:17px}.embed .status__content,.public-layout .status__content{padding-top:5px}.embed .status__prepend,.public-layout .status__prepend{padding:8px 0;padding-bottom:2px;margin:initial;margin-left:78px;padding-top:15px}.embed .status__prepend-icon-wrapper,.public-layout .status__prepend-icon-wrapper{position:absolute;margin:initial;float:initial;width:auto;left:-32px}.embed .status .media-gallery,.embed .status__action-bar,.embed .status .video-player,.public-layout .status .media-gallery,.public-layout .status__action-bar,.public-layout .status .video-player{margin-top:10px}.embed .status .status__info,.public-layout .status .status__info{font-size:15px;display:initial}.embed .status .status__relative-time,.public-layout .status .status__relative-time{color:#444b5d;float:right;font-size:14px;width:auto;margin:initial;padding:initial}.embed .status .status__info .status__display-name,.public-layout .status .status__info .status__display-name{display:block;max-width:100%;padding:6px 0;padding-right:25px;margin:initial}.embed .status .status__info .status__display-name .display-name strong,.public-layout .status .status__info .status__display-name .display-name strong{display:inline}.embed .status .status__avatar,.public-layout .status .status__avatar{height:48px;position:absolute;width:48px;margin:initial}.rtl .embed .status,.rtl .public-layout .status{padding-left:10px;padding-right:68px}.rtl .embed .status .status__info .status__display-name,.rtl .public-layout .status .status__info .status__display-name{padding-left:25px;padding-right:0}.rtl .embed .status .status__relative-time,.rtl .public-layout .status .status__relative-time{float:left}.app-body{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.link-button{display:block;font-size:15px;line-height:20px;color:#2b90d9;border:0;background:transparent;padding:0;cursor:pointer}.link-button:hover,.link-button:active{text-decoration:underline}.link-button:disabled{color:#9baec8;cursor:default}.button{background-color:#3897db;border:10px none;border-radius:4px;box-sizing:border-box;color:#000;cursor:pointer;display:inline-block;font-family:inherit;font-size:14px;font-weight:500;height:36px;letter-spacing:0;line-height:36px;overflow:hidden;padding:0 16px;position:relative;text-align:center;text-transform:uppercase;text-decoration:none;text-overflow:ellipsis;transition:all 100ms ease-in;transition-property:background-color;white-space:nowrap;width:auto}.button:active,.button:focus,.button:hover{background-color:#227dbe;transition:all 200ms ease-out;transition-property:background-color}.button--destructive{transition:none}.button--destructive:active,.button--destructive:focus,.button--destructive:hover{background-color:#df405a;transition:none}.button:disabled{background-color:#9baec8;cursor:default}.button.button-primary,.button.button-alternative,.button.button-secondary,.button.button-alternative-2{font-size:16px;line-height:36px;height:auto;text-transform:none;padding:4px 16px}.button.button-alternative{color:#000;background:#9baec8}.button.button-alternative:active,.button.button-alternative:focus,.button.button-alternative:hover{background-color:#8ea3c1}.button.button-alternative-2{background:#3c5063}.button.button-alternative-2:active,.button.button-alternative-2:focus,.button.button-alternative-2:hover{background-color:#344656}.button.button-secondary{font-size:16px;line-height:36px;height:auto;color:#282c37;text-transform:none;background:transparent;padding:3px 15px;border-radius:4px;border:1px solid #9baec8}.button.button-secondary:active,.button.button-secondary:focus,.button.button-secondary:hover{border-color:#8ea3c1;color:#1f232b}.button.button-secondary:disabled{opacity:.5}.button.button--block{display:block;width:100%}.icon-button{display:inline-block;padding:0;color:#606984;border:0;border-radius:4px;background:transparent;cursor:pointer;transition:all 100ms ease-in;transition-property:background-color,color}.icon-button:hover,.icon-button:active,.icon-button:focus{color:#51596f;background-color:rgba(96,105,132,.15);transition:all 200ms ease-out;transition-property:background-color,color}.icon-button:focus{background-color:rgba(96,105,132,.3)}.icon-button.disabled{color:#828ba4;background-color:transparent;cursor:default}.icon-button.active{color:#2b90d9}.icon-button::-moz-focus-inner{border:0}.icon-button::-moz-focus-inner,.icon-button:focus,.icon-button:active{outline:0 !important}.icon-button.inverted{color:#282c37}.icon-button.inverted:hover,.icon-button.inverted:active,.icon-button.inverted:focus{color:#373d4c;background-color:rgba(40,44,55,.15)}.icon-button.inverted:focus{background-color:rgba(40,44,55,.3)}.icon-button.inverted.disabled{color:#191b22;background-color:transparent}.icon-button.inverted.active{color:#2b90d9}.icon-button.inverted.active.disabled{color:#1d6ca4}.icon-button.overlayed{box-sizing:content-box;background:rgba(255,255,255,.6);color:rgba(0,0,0,.7);border-radius:4px;padding:2px}.icon-button.overlayed:hover{background:rgba(255,255,255,.9)}.text-icon-button{color:#282c37;border:0;border-radius:4px;background:transparent;cursor:pointer;font-weight:600;font-size:11px;padding:0 3px;line-height:27px;outline:0;transition:all 100ms ease-in;transition-property:background-color,color}.text-icon-button:hover,.text-icon-button:active,.text-icon-button:focus{color:#373d4c;background-color:rgba(40,44,55,.15);transition:all 200ms ease-out;transition-property:background-color,color}.text-icon-button:focus{background-color:rgba(40,44,55,.3)}.text-icon-button.disabled{color:#000;background-color:transparent;cursor:default}.text-icon-button.active{color:#2b90d9}.text-icon-button::-moz-focus-inner{border:0}.text-icon-button::-moz-focus-inner,.text-icon-button:focus,.text-icon-button:active{outline:0 !important}.dropdown-menu{position:absolute;transform-origin:50% 0}.invisible{font-size:0;line-height:0;display:inline-block;width:0;height:0;position:absolute}.invisible img,.invisible svg{margin:0 !important;border:0 !important;padding:0 !important;width:0 !important;height:0 !important}.ellipsis::after{content:\"…\"}.notification__favourite-icon-wrapper{left:0;position:absolute}.notification__favourite-icon-wrapper .fa.star-icon{color:#ca8f04}.star-icon.active{color:#ca8f04}.bookmark-icon.active{color:#ff5050}.no-reduce-motion .icon-button.star-icon.activate>.fa-star{animation:spring-rotate-in 1s linear}.no-reduce-motion .icon-button.star-icon.deactivate>.fa-star{animation:spring-rotate-out 1s linear}.notification__display-name{color:inherit;font-weight:500;text-decoration:none}.notification__display-name:hover{color:#000;text-decoration:underline}.display-name{display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.display-name a{color:inherit;text-decoration:inherit}.display-name strong{height:18px;font-size:16px;font-weight:500;line-height:18px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.display-name span{display:block;height:18px;font-size:15px;line-height:18px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.display-name>a:hover strong{text-decoration:underline}.display-name.inline{padding:0;height:18px;font-size:15px;line-height:18px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.display-name.inline strong{display:inline;height:auto;font-size:inherit;line-height:inherit}.display-name.inline span{display:inline;height:auto;font-size:inherit;line-height:inherit}.display-name__html{font-weight:500}.display-name__account{font-size:14px}.image-loader{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center;flex-direction:column}.image-loader .image-loader__preview-canvas{max-width:100%;max-height:80%;background:url(\"~images/void.png\") repeat;object-fit:contain}.image-loader .loading-bar{position:relative}.image-loader.image-loader--amorphous .image-loader__preview-canvas{display:none}.zoomable-image{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center}.zoomable-image img{max-width:100%;max-height:80%;width:auto;height:auto;object-fit:contain}.dropdown{display:inline-block}.dropdown__content{display:none;position:absolute}.dropdown-menu__separator{border-bottom:1px solid #393f4f;margin:5px 7px 6px;height:0}.dropdown-menu{background:#282c37;padding:4px 0;border-radius:4px;box-shadow:2px 4px 15px rgba(0,0,0,.4)}.dropdown-menu ul{list-style:none}.dropdown-menu__arrow{position:absolute;width:0;height:0;border:0 solid transparent}.dropdown-menu__arrow.left{right:-5px;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#282c37}.dropdown-menu__arrow.top{bottom:-5px;margin-left:-7px;border-width:5px 7px 0;border-top-color:#282c37}.dropdown-menu__arrow.bottom{top:-5px;margin-left:-7px;border-width:0 7px 5px;border-bottom-color:#282c37}.dropdown-menu__arrow.right{left:-5px;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#282c37}.dropdown-menu__item a{font-size:13px;line-height:18px;display:block;padding:4px 14px;box-sizing:border-box;text-decoration:none;background:#282c37;color:#000;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown-menu__item a:focus,.dropdown-menu__item a:hover,.dropdown-menu__item a:active{background:#2b90d9;color:#282c37;outline:0}.dropdown--active .dropdown__content{display:block;line-height:18px;max-width:311px;right:0;text-align:left;z-index:9999}.dropdown--active .dropdown__content>ul{list-style:none;background:#282c37;padding:4px 0;border-radius:4px;box-shadow:0 0 15px rgba(0,0,0,.4);min-width:140px;position:relative}.dropdown--active .dropdown__content.dropdown__right{right:0}.dropdown--active .dropdown__content.dropdown__left>ul{left:-98px}.dropdown--active .dropdown__content>ul>li>a{font-size:13px;line-height:18px;display:block;padding:4px 14px;box-sizing:border-box;text-decoration:none;background:#282c37;color:#000;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown--active .dropdown__content>ul>li>a:focus{outline:0}.dropdown--active .dropdown__content>ul>li>a:hover{background:#2b90d9;color:#282c37}.dropdown__icon{vertical-align:middle}.static-content{padding:10px;padding-top:20px;color:#444b5d}.static-content h1{font-size:16px;font-weight:500;margin-bottom:40px;text-align:center}.static-content p{font-size:13px;margin-bottom:20px}.column,.drawer{flex:1 1 100%;overflow:hidden}@media screen and (min-width: 631px){.columns-area{padding:0}.column,.drawer{flex:0 0 auto;padding:10px;padding-left:5px;padding-right:5px}.column:first-child,.drawer:first-child{padding-left:10px}.column:last-child,.drawer:last-child{padding-right:10px}.columns-area>div .column,.columns-area>div .drawer{padding-left:5px;padding-right:5px}}.tabs-bar{box-sizing:border-box;display:flex;background:#c0cdd9;flex:0 0 auto;overflow-y:auto}.tabs-bar__link{display:block;flex:1 1 auto;padding:15px 10px;padding-bottom:13px;color:#000;text-decoration:none;text-align:center;font-size:14px;font-weight:500;border-bottom:2px solid #c0cdd9;transition:all 50ms linear;transition-property:border-bottom,background,color}.tabs-bar__link .fa{font-weight:400;font-size:16px}@media screen and (min-width: 631px){.auto-columns .tabs-bar__link:hover,.auto-columns .tabs-bar__link:focus,.auto-columns .tabs-bar__link:active{background:#adbecd;border-bottom-color:#adbecd}}.multi-columns .tabs-bar__link:hover,.multi-columns .tabs-bar__link:focus,.multi-columns .tabs-bar__link:active{background:#adbecd;border-bottom-color:#adbecd}.tabs-bar__link.active{border-bottom:2px solid #2b90d9;color:#2b90d9}.tabs-bar__link span{margin-left:5px;display:none}.tabs-bar__link span.icon{margin-left:0;display:inline}.icon-with-badge{position:relative}.icon-with-badge__badge{position:absolute;left:9px;top:-13px;background:#2b90d9;border:2px solid #c0cdd9;padding:1px 6px;border-radius:6px;font-size:10px;font-weight:500;line-height:14px;color:#000}.column-link--transparent .icon-with-badge__badge{border-color:#f2f5f7}.scrollable{overflow-y:scroll;overflow-x:hidden;flex:1 1 auto;-webkit-overflow-scrolling:touch}.scrollable.optionally-scrollable{overflow-y:auto}@supports(display: grid){.scrollable{contain:strict}}.scrollable--flex{display:flex;flex-direction:column}.scrollable__append{flex:1 1 auto;position:relative;min-height:120px}@supports(display: grid){.scrollable.fullscreen{contain:none}}.react-toggle{display:inline-block;position:relative;cursor:pointer;background-color:transparent;border:0;padding:0;user-select:none;-webkit-tap-highlight-color:rgba(255,255,255,0);-webkit-tap-highlight-color:transparent}.react-toggle-screenreader-only{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.react-toggle--disabled{cursor:not-allowed;opacity:.5;transition:opacity .25s}.react-toggle-track{width:50px;height:24px;padding:0;border-radius:30px;background-color:#d9e1e8;transition:background-color .2s ease}.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track{background-color:#f9fafb}.react-toggle--checked .react-toggle-track{background-color:#2b90d9}.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track{background-color:#2074b1}.react-toggle-track-check{position:absolute;width:14px;height:10px;top:0;bottom:0;margin-top:auto;margin-bottom:auto;line-height:0;left:8px;opacity:0;transition:opacity .25s ease}.react-toggle--checked .react-toggle-track-check{opacity:1;transition:opacity .25s ease}.react-toggle-track-x{position:absolute;width:10px;height:10px;top:0;bottom:0;margin-top:auto;margin-bottom:auto;line-height:0;right:10px;opacity:1;transition:opacity .25s ease}.react-toggle--checked .react-toggle-track-x{opacity:0}.react-toggle-thumb{position:absolute;top:1px;left:1px;width:22px;height:22px;border:1px solid #d9e1e8;border-radius:50%;background-color:#fff;box-sizing:border-box;transition:all .25s ease;transition-property:border-color,left}.react-toggle--checked .react-toggle-thumb{left:27px;border-color:#2b90d9}.getting-started__wrapper,.getting_started,.flex-spacer{background:#d9e1e8}.getting-started__wrapper{position:relative;overflow-y:auto}.flex-spacer{flex:1 1 auto}.getting-started{background:#d9e1e8;flex:1 0 auto}.getting-started p{color:#282c37}.getting-started a{color:#444b5d}.getting-started__panel{height:min-content}.getting-started__panel,.getting-started__footer{padding:10px;padding-top:20px;flex:0 1 auto}.getting-started__panel ul,.getting-started__footer ul{margin-bottom:10px}.getting-started__panel ul li,.getting-started__footer ul li{display:inline}.getting-started__panel p,.getting-started__footer p{color:#444b5d;font-size:13px}.getting-started__panel p a,.getting-started__footer p a{color:#444b5d;text-decoration:underline}.getting-started__panel a,.getting-started__footer a{text-decoration:none;color:#282c37}.getting-started__panel a:hover,.getting-started__panel a:focus,.getting-started__panel a:active,.getting-started__footer a:hover,.getting-started__footer a:focus,.getting-started__footer a:active{text-decoration:underline}.getting-started__trends{flex:0 1 auto;opacity:1;animation:fade 150ms linear;margin-top:10px}.getting-started__trends h4{font-size:12px;text-transform:uppercase;color:#282c37;padding:10px;font-weight:500;border-bottom:1px solid #c0cdd9}@media screen and (max-height: 810px){.getting-started__trends .trends__item:nth-child(3){display:none}}@media screen and (max-height: 720px){.getting-started__trends .trends__item:nth-child(2){display:none}}@media screen and (max-height: 670px){.getting-started__trends{display:none}}.getting-started__trends .trends__item{border-bottom:0;padding:10px}.getting-started__trends .trends__item__current{color:#282c37}.column-link__badge{display:inline-block;border-radius:4px;font-size:12px;line-height:19px;font-weight:500;background:#d9e1e8;padding:4px 8px;margin:-6px 10px}.keyboard-shortcuts{padding:8px 0 0;overflow:hidden}.keyboard-shortcuts thead{position:absolute;left:-9999px}.keyboard-shortcuts td{padding:0 10px 8px}.keyboard-shortcuts kbd{display:inline-block;padding:3px 5px;background-color:#c0cdd9;border:1px solid #e6ebf0}.setting-text{color:#282c37;background:transparent;border:none;border-bottom:2px solid #9baec8;box-sizing:border-box;display:block;font-family:inherit;margin-bottom:10px;padding:7px 0;width:100%}.setting-text:focus,.setting-text:active{color:#000;border-bottom-color:#2b90d9}@media screen and (max-width: 600px){.auto-columns .setting-text,.single-column .setting-text{font-size:16px}}.setting-text.light{color:#000;border-bottom:2px solid #839db4}.setting-text.light:focus,.setting-text.light:active{color:#000;border-bottom-color:#2b90d9}.no-reduce-motion button.icon-button i.fa-retweet{background-position:0 0;height:19px;transition:background-position .9s steps(10);transition-duration:0s;vertical-align:middle;width:22px}.no-reduce-motion button.icon-button i.fa-retweet::before{display:none !important}.no-reduce-motion button.icon-button.active i.fa-retweet{transition-duration:.9s;background-position:0 100%}.reduce-motion button.icon-button i.fa-retweet{color:#606984;transition:color 100ms ease-in}.reduce-motion button.icon-button.active i.fa-retweet{color:#2b90d9}.reduce-motion button.icon-button.disabled i.fa-retweet{color:#828ba4}.load-more{display:block;color:#444b5d;background-color:transparent;border:0;font-size:inherit;text-align:center;line-height:inherit;margin:0;padding:15px;box-sizing:border-box;width:100%;clear:both;text-decoration:none}.load-more:hover{background:#d3dce4}.load-gap{border-bottom:1px solid #c0cdd9}.missing-indicator{padding-top:68px}.scrollable>div>:first-child .notification__dismiss-overlay>.wrappy{border-top:1px solid #d9e1e8}.notification__dismiss-overlay{overflow:hidden;position:absolute;top:0;right:0;bottom:-1px;padding-left:15px;z-index:999;align-items:center;justify-content:flex-end;cursor:pointer;display:flex}.notification__dismiss-overlay .wrappy{width:4rem;align-self:stretch;display:flex;flex-direction:column;align-items:center;justify-content:center;background:#c0cdd9;border-left:1px solid #99afc2;box-shadow:0 0 5px #000;border-bottom:1px solid #d9e1e8}.notification__dismiss-overlay .ckbox{border:2px solid #9baec8;border-radius:2px;width:30px;height:30px;font-size:20px;color:#282c37;text-shadow:0 0 5px #000;display:flex;justify-content:center;align-items:center}.notification__dismiss-overlay:focus{outline:0 !important}.notification__dismiss-overlay:focus .ckbox{box-shadow:0 0 1px 1px #2b90d9}.text-btn{display:inline-block;padding:0;font-family:inherit;font-size:inherit;color:inherit;border:0;background:transparent;cursor:pointer}.loading-indicator{color:#444b5d;font-size:12px;font-weight:400;text-transform:uppercase;overflow:visible;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.loading-indicator span{display:block;float:left;margin-left:50%;transform:translateX(-50%);margin:82px 0 0 50%;white-space:nowrap}.loading-indicator__figure{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);width:42px;height:42px;box-sizing:border-box;background-color:transparent;border:0 solid #86a0b6;border-width:6px;border-radius:50%}.no-reduce-motion .loading-indicator span{animation:loader-label 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1)}.no-reduce-motion .loading-indicator__figure{animation:loader-figure 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1)}@keyframes spring-rotate-in{0%{transform:rotate(0deg)}30%{transform:rotate(-484.8deg)}60%{transform:rotate(-316.7deg)}90%{transform:rotate(-375deg)}100%{transform:rotate(-360deg)}}@keyframes spring-rotate-out{0%{transform:rotate(-360deg)}30%{transform:rotate(124.8deg)}60%{transform:rotate(-43.27deg)}90%{transform:rotate(15deg)}100%{transform:rotate(0deg)}}@keyframes loader-figure{0%{width:0;height:0;background-color:#86a0b6}29%{background-color:#86a0b6}30%{width:42px;height:42px;background-color:transparent;border-width:21px;opacity:1}100%{width:42px;height:42px;border-width:0;opacity:0;background-color:transparent}}@keyframes loader-label{0%{opacity:.25}30%{opacity:1}100%{opacity:.25}}.spoiler-button{top:0;left:0;width:100%;height:100%;position:absolute;z-index:100}.spoiler-button--minified{display:flex;left:4px;top:4px;width:auto;height:auto;align-items:center}.spoiler-button--click-thru{pointer-events:none}.spoiler-button--hidden{display:none}.spoiler-button__overlay{display:block;background:transparent;width:100%;height:100%;border:0}.spoiler-button__overlay__label{display:inline-block;background:rgba(255,255,255,.5);border-radius:8px;padding:8px 12px;color:#000;font-weight:500;font-size:14px}.spoiler-button__overlay:hover .spoiler-button__overlay__label,.spoiler-button__overlay:focus .spoiler-button__overlay__label,.spoiler-button__overlay:active .spoiler-button__overlay__label{background:rgba(255,255,255,.8)}.spoiler-button__overlay:disabled .spoiler-button__overlay__label{background:rgba(255,255,255,.5)}.setting-toggle{display:block;line-height:24px}.setting-toggle__label,.setting-radio__label,.setting-meta__label{color:#282c37;display:inline-block;margin-bottom:14px;margin-left:8px;vertical-align:middle}.setting-radio{display:block;line-height:18px}.setting-radio__label{margin-bottom:0}.column-settings__row legend{color:#282c37;cursor:default;display:block;font-weight:500;margin-top:10px}.setting-radio__input{vertical-align:middle}.setting-meta__label{float:right}@keyframes heartbeat{from{transform:scale(1);transform-origin:center center;animation-timing-function:ease-out}10%{transform:scale(0.91);animation-timing-function:ease-in}17%{transform:scale(0.98);animation-timing-function:ease-out}33%{transform:scale(0.87);animation-timing-function:ease-in}45%{transform:scale(1);animation-timing-function:ease-out}}.pulse-loading{animation:heartbeat 1.5s ease-in-out infinite both}.upload-area{align-items:center;background:rgba(255,255,255,.8);display:flex;height:100%;justify-content:center;left:0;opacity:0;position:absolute;top:0;visibility:hidden;width:100%;z-index:2000}.upload-area *{pointer-events:none}.upload-area__drop{width:320px;height:160px;display:flex;box-sizing:border-box;position:relative;padding:8px}.upload-area__background{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;border-radius:4px;background:#d9e1e8;box-shadow:0 0 5px rgba(0,0,0,.2)}.upload-area__content{flex:1;display:flex;align-items:center;justify-content:center;color:#282c37;font-size:18px;font-weight:500;border:2px dashed #3c5063;border-radius:4px}.dropdown--active .emoji-button img{opacity:1;filter:none}.loading-bar{background-color:#2b90d9;height:3px;position:absolute;top:0;left:0;z-index:9999}.icon-badge-wrapper{position:relative}.icon-badge{position:absolute;display:block;right:-0.25em;top:-0.25em;background-color:#2b90d9;border-radius:50%;font-size:75%;width:1em;height:1em}.conversation{display:flex;border-bottom:1px solid #c0cdd9;padding:5px;padding-bottom:0}.conversation:focus{background:#d3dce4;outline:0}.conversation__avatar{flex:0 0 auto;padding:10px;padding-top:12px;position:relative}.conversation__unread{display:inline-block;background:#2b90d9;border-radius:50%;width:.625rem;height:.625rem;margin:-0.1ex .15em .1ex}.conversation__content{flex:1 1 auto;padding:10px 5px;padding-right:15px;overflow:hidden}.conversation__content__info{overflow:hidden;display:flex;flex-direction:row-reverse;justify-content:space-between}.conversation__content__relative-time{font-size:15px;color:#282c37;padding-left:15px}.conversation__content__names{color:#282c37;font-size:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:4px;flex-basis:90px;flex-grow:1}.conversation__content__names a{color:#000;text-decoration:none}.conversation__content__names a:hover,.conversation__content__names a:focus,.conversation__content__names a:active{text-decoration:underline}.conversation__content .status__content{margin:0}.conversation--unread{background:#d3dce4}.conversation--unread:focus{background:#ccd7e0}.conversation--unread .conversation__content__info{font-weight:700}.conversation--unread .conversation__content__relative-time{color:#000}.ui .flash-message{margin-top:10px;margin-left:auto;margin-right:auto;margin-bottom:0;min-width:75%}::-webkit-scrollbar-thumb{border-radius:0}noscript{text-align:center}noscript img{width:200px;opacity:.5;animation:flicker 4s infinite}noscript div{font-size:14px;margin:30px auto;color:#282c37;max-width:400px}noscript div a{color:#2b90d9;text-decoration:underline}noscript div a:hover{text-decoration:none}noscript div a{word-break:break-word}@keyframes flicker{0%{opacity:1}30%{opacity:.75}100%{opacity:1}}button.icon-button i.fa-retweet{background-image:url(\"data:image/svg+xml;utf8,\")}button.icon-button i.fa-retweet:hover{background-image:url(\"data:image/svg+xml;utf8,\")}button.icon-button.disabled i.fa-retweet,button.icon-button.disabled i.fa-retweet:hover{background-image:url(\"data:image/svg+xml;utf8,\")}.status-direct button.icon-button.disabled i.fa-retweet,.status-direct button.icon-button.disabled i.fa-retweet:hover{background-image:url(\"data:image/svg+xml;utf8,\")}.account{padding:10px;border-bottom:1px solid #c0cdd9;color:inherit;text-decoration:none}.account .account__display-name{flex:1 1 auto;display:block;color:#282c37;overflow:hidden;text-decoration:none;font-size:14px}.account.small{border:none;padding:0}.account.small>.account__avatar-wrapper{margin:0 8px 0 0}.account.small>.display-name{height:24px;line-height:24px}.account__wrapper{display:flex}.account__avatar-wrapper{float:left;margin-left:12px;margin-right:12px}.account__avatar{border-radius:8%;background-position:50%;background-clip:padding-box;position:relative;cursor:pointer}.account__avatar-inline{display:inline-block;vertical-align:middle;margin-right:5px}.account__avatar-composite{border-radius:8%;background-position:50%;background-clip:padding-box;overflow:hidden;position:relative;cursor:default}.account__avatar-composite div{border-radius:8%;background-position:50%;background-clip:padding-box;float:left;position:relative;box-sizing:border-box}.account__avatar-composite__label{display:block;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);color:#000;text-shadow:1px 1px 2px #000;font-weight:700;font-size:15px}.account__avatar-overlay{position:relative;width:48px;height:48px;background-size:48px 48px}.account__avatar-overlay-base{border-radius:8%;background-position:50%;background-clip:padding-box;width:36px;height:36px;background-size:36px 36px}.account__avatar-overlay-overlay{border-radius:8%;background-position:50%;background-clip:padding-box;width:24px;height:24px;background-size:24px 24px;position:absolute;bottom:0;right:0;z-index:1}.account__relationship{height:18px;padding:10px;white-space:nowrap}.account__header__wrapper{flex:0 0 auto;background:#ccd7e0}.account__disclaimer{padding:10px;color:#444b5d}.account__disclaimer strong{font-weight:500}.account__disclaimer strong:lang(ja){font-weight:700}.account__disclaimer strong:lang(ko){font-weight:700}.account__disclaimer strong:lang(zh-CN){font-weight:700}.account__disclaimer strong:lang(zh-HK){font-weight:700}.account__disclaimer strong:lang(zh-TW){font-weight:700}.account__disclaimer a{font-weight:500;color:inherit;text-decoration:underline}.account__disclaimer a:hover,.account__disclaimer a:focus,.account__disclaimer a:active{text-decoration:none}.account__action-bar{border-top:1px solid #c0cdd9;border-bottom:1px solid #c0cdd9;line-height:36px;overflow:hidden;flex:0 0 auto;display:flex}.account__action-bar-links{display:flex;flex:1 1 auto;line-height:18px;text-align:center}.account__action-bar__tab{text-decoration:none;overflow:hidden;flex:0 1 100%;border-left:1px solid #c0cdd9;padding:10px 0;border-bottom:4px solid transparent}.account__action-bar__tab:first-child{border-left:0}.account__action-bar__tab.active{border-bottom:4px solid #2b90d9}.account__action-bar__tab>span{display:block;text-transform:uppercase;font-size:11px;color:#282c37}.account__action-bar__tab strong{display:block;font-size:15px;font-weight:500;color:#000}.account__action-bar__tab strong:lang(ja){font-weight:700}.account__action-bar__tab strong:lang(ko){font-weight:700}.account__action-bar__tab strong:lang(zh-CN){font-weight:700}.account__action-bar__tab strong:lang(zh-HK){font-weight:700}.account__action-bar__tab strong:lang(zh-TW){font-weight:700}.account__action-bar__tab abbr{color:#2b90d9}.account-authorize{padding:14px 10px}.account-authorize .detailed-status__display-name{display:block;margin-bottom:15px;overflow:hidden}.account-authorize__avatar{float:left;margin-right:10px}.notification__message{margin-left:42px;padding:8px 0 0 26px;cursor:default;color:#282c37;font-size:15px;position:relative}.notification__message .fa{color:#2b90d9}.notification__message>span{display:block;overflow:hidden;text-overflow:ellipsis}.account--panel{background:#ccd7e0;border-top:1px solid #c0cdd9;border-bottom:1px solid #c0cdd9;display:flex;flex-direction:row;padding:10px 0}.account--panel__button,.detailed-status__button{flex:1 1 auto;text-align:center}.column-settings__outer{background:#c0cdd9;padding:15px}.column-settings__section{color:#282c37;cursor:default;display:block;font-weight:500;margin-bottom:10px}.column-settings__hashtags .column-settings__row{margin-bottom:15px}.column-settings__hashtags .column-select__control{outline:0;box-sizing:border-box;width:100%;border:none;box-shadow:none;font-family:inherit;background:#d9e1e8;color:#282c37;font-size:14px;margin:0}.column-settings__hashtags .column-select__control::placeholder{color:#1f232b}.column-settings__hashtags .column-select__control::-moz-focus-inner{border:0}.column-settings__hashtags .column-select__control::-moz-focus-inner,.column-settings__hashtags .column-select__control:focus,.column-settings__hashtags .column-select__control:active{outline:0 !important}.column-settings__hashtags .column-select__control:focus{background:#ccd7e0}@media screen and (max-width: 600px){.column-settings__hashtags .column-select__control{font-size:16px}}.column-settings__hashtags .column-select__placeholder{color:#444b5d;padding-left:2px;font-size:12px}.column-settings__hashtags .column-select__value-container{padding-left:6px}.column-settings__hashtags .column-select__multi-value{background:#c0cdd9}.column-settings__hashtags .column-select__multi-value__remove{cursor:pointer}.column-settings__hashtags .column-select__multi-value__remove:hover,.column-settings__hashtags .column-select__multi-value__remove:active,.column-settings__hashtags .column-select__multi-value__remove:focus{background:#b3c3d1;color:#1f232b}.column-settings__hashtags .column-select__multi-value__label,.column-settings__hashtags .column-select__input{color:#282c37}.column-settings__hashtags .column-select__clear-indicator,.column-settings__hashtags .column-select__dropdown-indicator{cursor:pointer;transition:none;color:#444b5d}.column-settings__hashtags .column-select__clear-indicator:hover,.column-settings__hashtags .column-select__clear-indicator:active,.column-settings__hashtags .column-select__clear-indicator:focus,.column-settings__hashtags .column-select__dropdown-indicator:hover,.column-settings__hashtags .column-select__dropdown-indicator:active,.column-settings__hashtags .column-select__dropdown-indicator:focus{color:#3b4151}.column-settings__hashtags .column-select__indicator-separator{background-color:#c0cdd9}.column-settings__hashtags .column-select__menu{background:#fff;border-radius:4px;padding:10px 14px;padding-bottom:14px;margin-top:10px;color:#444b5d;box-shadow:2px 4px 15px rgba(0,0,0,.4);padding:0;background:#282c37}.column-settings__hashtags .column-select__menu h4{text-transform:uppercase;color:#444b5d;font-size:13px;font-weight:500;margin-bottom:10px}.column-settings__hashtags .column-select__menu li{padding:4px 0}.column-settings__hashtags .column-select__menu ul{margin-bottom:10px}.column-settings__hashtags .column-select__menu em{font-weight:500;color:#000}.column-settings__hashtags .column-select__menu-list{padding:6px}.column-settings__hashtags .column-select__option{color:#000;border-radius:4px;font-size:14px}.column-settings__hashtags .column-select__option--is-focused,.column-settings__hashtags .column-select__option--is-selected{background:#3d4455}.column-settings__row .text-btn{margin-bottom:15px}.relationship-tag{color:#000;margin-bottom:4px;display:block;vertical-align:top;background-color:#fff;text-transform:uppercase;font-size:11px;font-weight:500;padding:4px;border-radius:4px;opacity:.7}.relationship-tag:hover{opacity:1}.account-gallery__container{display:flex;flex-wrap:wrap;padding:4px 2px}.account-gallery__item{border:none;box-sizing:border-box;display:block;position:relative;border-radius:4px;overflow:hidden;margin:2px}.account-gallery__item__icons{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);font-size:24px}.notification__filter-bar,.account__section-headline{background:#e6ebf0;border-bottom:1px solid #c0cdd9;cursor:default;display:flex;flex-shrink:0}.notification__filter-bar button,.account__section-headline button{background:#e6ebf0;border:0;margin:0}.notification__filter-bar button,.notification__filter-bar a,.account__section-headline button,.account__section-headline a{display:block;flex:1 1 auto;color:#282c37;padding:15px 0;font-size:14px;font-weight:500;text-align:center;text-decoration:none;position:relative}.notification__filter-bar button.active,.notification__filter-bar a.active,.account__section-headline button.active,.account__section-headline a.active{color:#282c37}.notification__filter-bar button.active::before,.notification__filter-bar button.active::after,.notification__filter-bar a.active::before,.notification__filter-bar a.active::after,.account__section-headline button.active::before,.account__section-headline button.active::after,.account__section-headline a.active::before,.account__section-headline a.active::after{display:block;content:\"\";position:absolute;bottom:0;left:50%;width:0;height:0;transform:translateX(-50%);border-style:solid;border-width:0 10px 10px;border-color:transparent transparent #c0cdd9}.notification__filter-bar button.active::after,.notification__filter-bar a.active::after,.account__section-headline button.active::after,.account__section-headline a.active::after{bottom:-1px;border-color:transparent transparent #d9e1e8}.notification__filter-bar.directory__section-headline,.account__section-headline.directory__section-headline{background:#dfe6ec;border-bottom-color:transparent}.notification__filter-bar.directory__section-headline a.active::before,.notification__filter-bar.directory__section-headline button.active::before,.account__section-headline.directory__section-headline a.active::before,.account__section-headline.directory__section-headline button.active::before{display:none}.notification__filter-bar.directory__section-headline a.active::after,.notification__filter-bar.directory__section-headline button.active::after,.account__section-headline.directory__section-headline a.active::after,.account__section-headline.directory__section-headline button.active::after{border-color:transparent transparent #eff3f5}.account__moved-note{padding:14px 10px;padding-bottom:16px;background:#ccd7e0;border-top:1px solid #c0cdd9;border-bottom:1px solid #c0cdd9}.account__moved-note__message{position:relative;margin-left:58px;color:#444b5d;padding:8px 0;padding-top:0;padding-bottom:4px;font-size:14px}.account__moved-note__message>span{display:block;overflow:hidden;text-overflow:ellipsis}.account__moved-note__icon-wrapper{left:-26px;position:absolute}.account__moved-note .detailed-status__display-avatar{position:relative}.account__moved-note .detailed-status__display-name{margin-bottom:0}.account__header__content{color:#282c37;font-size:14px;font-weight:400;overflow:hidden;word-break:normal;word-wrap:break-word}.account__header__content p{margin-bottom:20px}.account__header__content p:last-child{margin-bottom:0}.account__header__content a{color:inherit;text-decoration:underline}.account__header__content a:hover{text-decoration:none}.account__header{overflow:hidden}.account__header.inactive{opacity:.5}.account__header.inactive .account__header__image,.account__header.inactive .account__avatar{filter:grayscale(100%)}.account__header__info{position:absolute;top:10px;left:10px}.account__header__image{overflow:hidden;height:145px;position:relative;background:#e6ebf0}.account__header__image img{object-fit:cover;display:block;width:100%;height:100%;margin:0}.account__header__bar{position:relative;background:#ccd7e0;padding:5px;border-bottom:1px solid #b3c3d1}.account__header__bar .avatar{display:block;flex:0 0 auto;width:94px;margin-left:-2px}.account__header__bar .avatar .account__avatar{background:#f2f5f7;border:2px solid #ccd7e0}.account__header__tabs{display:flex;align-items:flex-start;padding:7px 5px;margin-top:-55px}.account__header__tabs__buttons{display:flex;align-items:center;padding-top:55px;overflow:hidden}.account__header__tabs__buttons .icon-button{border:1px solid #b3c3d1;border-radius:4px;box-sizing:content-box;padding:2px}.account__header__tabs__buttons .button{margin:0 8px}.account__header__tabs__name{padding:5px}.account__header__tabs__name .account-role{vertical-align:top}.account__header__tabs__name .emojione{width:22px;height:22px}.account__header__tabs__name h1{font-size:16px;line-height:24px;color:#000;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.account__header__tabs__name h1 small{display:block;font-size:14px;color:#282c37;font-weight:400;overflow:hidden;text-overflow:ellipsis}.account__header__tabs .spacer{flex:1 1 auto}.account__header__bio{overflow:hidden;margin:0 -5px}.account__header__bio .account__header__content{padding:20px 15px;padding-bottom:5px;color:#000}.account__header__bio .account__header__fields{margin:0;border-top:1px solid #b3c3d1}.account__header__bio .account__header__fields a{color:#217aba}.account__header__bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.account__header__bio .account__header__fields .verified a{color:#79bd9a}.account__header__extra{margin-top:4px}.account__header__extra__links{font-size:14px;color:#282c37;padding:10px 0}.account__header__extra__links a{display:inline-block;color:#282c37;text-decoration:none;padding:5px 10px;font-weight:500}.account__header__extra__links a strong{font-weight:700;color:#000}.domain{padding:10px;border-bottom:1px solid #c0cdd9}.domain .domain__domain-name{flex:1 1 auto;display:block;color:#000;text-decoration:none;font-size:14px;font-weight:500}.domain__wrapper{display:flex}.domain_buttons{height:18px;padding:10px;white-space:nowrap}@keyframes spring-flip-in{0%{transform:rotate(0deg)}30%{transform:rotate(-242.4deg)}60%{transform:rotate(-158.35deg)}90%{transform:rotate(-187.5deg)}100%{transform:rotate(-180deg)}}@keyframes spring-flip-out{0%{transform:rotate(-180deg)}30%{transform:rotate(62.4deg)}60%{transform:rotate(-21.635deg)}90%{transform:rotate(7.5deg)}100%{transform:rotate(0deg)}}.status__content--with-action{cursor:pointer}.status__content{position:relative;margin:10px 0;font-size:15px;line-height:20px;word-wrap:break-word;font-weight:400;overflow:visible;padding-top:5px}.status__content:focus{outline:0}.status__content .emojione{width:20px;height:20px;margin:-3px 0 0}.status__content img{max-width:100%;max-height:400px;object-fit:contain}.status__content p,.status__content pre,.status__content blockquote{margin-bottom:20px;white-space:pre-wrap}.status__content p:last-child,.status__content pre:last-child,.status__content blockquote:last-child{margin-bottom:0}.status__content .status__content__text,.status__content .e-content{overflow:hidden}.status__content .status__content__text>ul,.status__content .status__content__text>ol,.status__content .e-content>ul,.status__content .e-content>ol{margin-bottom:20px}.status__content .status__content__text h1,.status__content .status__content__text h2,.status__content .status__content__text h3,.status__content .status__content__text h4,.status__content .status__content__text h5,.status__content .e-content h1,.status__content .e-content h2,.status__content .e-content h3,.status__content .e-content h4,.status__content .e-content h5{margin-top:20px;margin-bottom:20px}.status__content .status__content__text h1,.status__content .status__content__text h2,.status__content .e-content h1,.status__content .e-content h2{font-weight:700;font-size:1.2em}.status__content .status__content__text h2,.status__content .e-content h2{font-size:1.1em}.status__content .status__content__text h3,.status__content .status__content__text h4,.status__content .status__content__text h5,.status__content .e-content h3,.status__content .e-content h4,.status__content .e-content h5{font-weight:500}.status__content .status__content__text blockquote,.status__content .e-content blockquote{padding-left:10px;border-left:3px solid #282c37;color:#282c37;white-space:normal}.status__content .status__content__text blockquote p:last-child,.status__content .e-content blockquote p:last-child{margin-bottom:0}.status__content .status__content__text b,.status__content .status__content__text strong,.status__content .e-content b,.status__content .e-content strong{font-weight:700}.status__content .status__content__text em,.status__content .status__content__text i,.status__content .e-content em,.status__content .e-content i{font-style:italic}.status__content .status__content__text sub,.status__content .e-content sub{font-size:smaller;text-align:sub}.status__content .status__content__text sup,.status__content .e-content sup{font-size:smaller;vertical-align:super}.status__content .status__content__text ul,.status__content .status__content__text ol,.status__content .e-content ul,.status__content .e-content ol{margin-left:1em}.status__content .status__content__text ul p,.status__content .status__content__text ol p,.status__content .e-content ul p,.status__content .e-content ol p{margin:0}.status__content .status__content__text ul,.status__content .e-content ul{list-style-type:disc}.status__content .status__content__text ol,.status__content .e-content ol{list-style-type:decimal}.status__content a{color:#d8a070;text-decoration:none}.status__content a:hover{text-decoration:underline}.status__content a:hover .fa{color:#353a48}.status__content a.mention:hover{text-decoration:none}.status__content a.mention:hover span{text-decoration:underline}.status__content a .fa{color:#444b5d}.status__content .status__content__spoiler{display:none}.status__content .status__content__spoiler.status__content__spoiler--visible{display:block}.status__content a.unhandled-link{color:#217aba}.status__content a.unhandled-link .link-origin-tag{color:#ca8f04;font-size:.8em}.status__content .status__content__spoiler-link{background:#7a96ae}.status__content .status__content__spoiler-link:hover{background:#708ea9;text-decoration:none}.status__content__spoiler-link{display:inline-block;border-radius:2px;background:#7a96ae;border:none;color:#000;font-weight:500;font-size:11px;padding:0 5px;text-transform:uppercase;line-height:inherit;cursor:pointer;vertical-align:bottom}.status__content__spoiler-link:hover{background:#708ea9;text-decoration:none}.status__content__spoiler-link .status__content__spoiler-icon{display:inline-block;margin:0 0 0 5px;border-left:1px solid currentColor;padding:0 0 0 4px;font-size:16px;vertical-align:-2px}.notif-cleaning .status,.notif-cleaning .notification-follow,.notif-cleaning .notification-follow-request{padding-right:4.5rem}.status__wrapper--filtered{color:#444b5d;border:0;font-size:inherit;text-align:center;line-height:inherit;margin:0;padding:15px;box-sizing:border-box;width:100%;clear:both;border-bottom:1px solid #c0cdd9}.status__prepend-icon-wrapper{left:-26px;position:absolute}.notification-follow,.notification-follow-request{position:relative;border-bottom:1px solid #c0cdd9}.notification-follow .account,.notification-follow-request .account{border-bottom:0 none}.focusable:focus{outline:0;background:#ccd7e0}.focusable:focus.status.status-direct:not(.read){background:#b3c3d1}.focusable:focus.status.status-direct:not(.read).muted{background:transparent}.focusable:focus .detailed-status,.focusable:focus .detailed-status__action-bar{background:#c0cdd9}.status{padding:10px 14px;position:relative;height:auto;border-bottom:1px solid #c0cdd9;cursor:default;opacity:1;animation:fade 150ms linear}@supports(-ms-overflow-style: -ms-autohiding-scrollbar){.status{padding-right:28px}}@keyframes fade{0%{opacity:0}100%{opacity:1}}.status .video-player,.status .audio-player{margin-top:8px}.status.status-direct:not(.read){background:#c0cdd9;border-bottom-color:#b3c3d1}.status.light .status__relative-time{color:#282c37}.status.light .status__display-name{color:#000}.status.light .display-name strong{color:#000}.status.light .display-name span{color:#282c37}.status.light .status__content{color:#000}.status.light .status__content a{color:#2b90d9}.status.light .status__content a.status__content__spoiler-link{color:#000;background:#9baec8}.status.light .status__content a.status__content__spoiler-link:hover{background:#8199ba}.status.collapsed{background-position:center;background-size:cover;user-select:none}.status.collapsed.has-background::before{display:block;position:absolute;left:0;right:0;top:0;bottom:0;background-image:linear-gradient(to bottom, rgba(0, 0, 0, 0.75), rgba(0, 0, 0, 0.65) 24px, rgba(0, 0, 0, 0.8));pointer-events:none;content:\"\"}.status.collapsed .display-name:hover .display-name__html{text-decoration:none}.status.collapsed .status__content{height:20px;overflow:hidden;text-overflow:ellipsis;padding-top:0}.status.collapsed .status__content:after{content:\"\";position:absolute;top:0;bottom:0;left:0;right:0;background:linear-gradient(rgba(217, 225, 232, 0), #d9e1e8);pointer-events:none}.status.collapsed .status__content a:hover{text-decoration:none}.status.collapsed:focus>.status__content:after{background:linear-gradient(rgba(204, 215, 224, 0), #ccd7e0)}.status.collapsed.status-direct:not(.read)>.status__content:after{background:linear-gradient(rgba(192, 205, 217, 0), #c0cdd9)}.status.collapsed .notification__message{margin-bottom:0}.status.collapsed .status__info .notification__message>span{white-space:nowrap}.status .notification__message{margin:-10px 0px 10px 0}.notification-favourite .status.status-direct{background:transparent}.notification-favourite .status.status-direct .icon-button.disabled{color:#444a5e}.status__relative-time{display:inline-block;flex-grow:1;color:#444b5d;font-size:14px;text-align:right;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.status__display-name{color:#444b5d;overflow:hidden}.status__info__account .status__display-name{display:block;max-width:100%}.status__info{display:flex;justify-content:space-between;font-size:15px}.status__info>span{text-overflow:ellipsis;overflow:hidden}.status__info .notification__message>span{word-wrap:break-word}.status__info__icons{display:flex;align-items:center;height:1em;color:#606984}.status__info__icons .status__media-icon,.status__info__icons .status__visibility-icon,.status__info__icons .status__reply-icon{padding-left:2px;padding-right:2px}.status__info__icons .status__collapse-button.active>.fa-angle-double-up{transform:rotate(-180deg)}.no-reduce-motion .status__collapse-button.activate>.fa-angle-double-up{animation:spring-flip-in 1s linear}.no-reduce-motion .status__collapse-button.deactivate>.fa-angle-double-up{animation:spring-flip-out 1s linear}.status__info__account{display:flex;align-items:center;justify-content:flex-start}.status-check-box{border-bottom:1px solid #282c37;display:flex}.status-check-box .status-check-box__status{margin:10px 0 10px 10px;flex:1}.status-check-box .status-check-box__status .media-gallery{max-width:250px}.status-check-box .status-check-box__status .status__content{padding:0;white-space:normal}.status-check-box .status-check-box__status .video-player,.status-check-box .status-check-box__status .audio-player{margin-top:8px;max-width:250px}.status-check-box .status-check-box__status .media-gallery__item-thumbnail{cursor:default}.status-check-box-toggle{align-items:center;display:flex;flex:0 0 auto;justify-content:center;padding:10px}.status__prepend{margin-top:-10px;margin-bottom:10px;margin-left:58px;color:#444b5d;padding:8px 0;padding-bottom:2px;font-size:14px;position:relative}.status__prepend .status__display-name strong{color:#444b5d}.status__prepend>span{display:block;overflow:hidden;text-overflow:ellipsis}.status__action-bar{align-items:center;display:flex;margin-top:8px}.status__action-bar__counter{display:inline-flex;margin-right:11px;align-items:center}.status__action-bar__counter .status__action-bar-button{margin-right:4px}.status__action-bar__counter__label{display:inline-block;width:14px;font-size:12px;font-weight:500;color:#606984}.status__action-bar-button{margin-right:18px}.status__action-bar-dropdown{height:23.15px;width:23.15px}.detailed-status__action-bar-dropdown{flex:1 1 auto;display:flex;align-items:center;justify-content:center;position:relative}.detailed-status{background:#ccd7e0;padding:14px 10px}.detailed-status--flex{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-start}.detailed-status--flex .status__content,.detailed-status--flex .detailed-status__meta{flex:100%}.detailed-status .status__content{font-size:19px;line-height:24px}.detailed-status .status__content .emojione{width:24px;height:24px;margin:-1px 0 0}.detailed-status .video-player,.detailed-status .audio-player{margin-top:8px}.detailed-status__meta{margin-top:15px;color:#444b5d;font-size:14px;line-height:18px}.detailed-status__action-bar{background:#ccd7e0;border-top:1px solid #c0cdd9;border-bottom:1px solid #c0cdd9;display:flex;flex-direction:row;padding:10px 0}.detailed-status__link{color:inherit;text-decoration:none}.detailed-status__favorites,.detailed-status__reblogs{display:inline-block;font-weight:500;font-size:12px;margin-left:6px}.status__display-name,.status__relative-time,.detailed-status__display-name,.detailed-status__datetime,.detailed-status__application,.account__display-name{text-decoration:none}.status__display-name strong,.account__display-name strong{color:#000}.muted .emojione{opacity:.5}a.status__display-name:hover strong,.reply-indicator__display-name:hover strong,.detailed-status__display-name:hover strong,.account__display-name:hover strong{text-decoration:underline}.account__display-name strong{display:block;overflow:hidden;text-overflow:ellipsis}.detailed-status__application,.detailed-status__datetime{color:inherit}.detailed-status .button.logo-button{margin-bottom:15px}.detailed-status__display-name{color:#282c37;display:block;line-height:24px;margin-bottom:15px;overflow:hidden}.detailed-status__display-name strong,.detailed-status__display-name span{display:block;text-overflow:ellipsis;overflow:hidden}.detailed-status__display-name strong{font-size:16px;color:#000}.detailed-status__display-avatar{float:left;margin-right:10px}.status__avatar{flex:none;margin:0 10px 0 0;height:48px;width:48px}.muted .status__content,.muted .status__content p,.muted .status__content a,.muted .status__content__text{color:#444b5d}.muted .status__display-name strong{color:#444b5d}.muted .status__avatar{opacity:.5}.muted a.status__content__spoiler-link{background:#3c5063;color:#000}.muted a.status__content__spoiler-link:hover{background:#7d98b0;text-decoration:none}.status__relative-time:hover,.detailed-status__datetime:hover{text-decoration:underline}.status-card{display:flex;font-size:14px;border:1px solid #c0cdd9;border-radius:4px;color:#444b5d;margin-top:14px;text-decoration:none;overflow:hidden}.status-card__actions{bottom:0;left:0;position:absolute;right:0;top:0;display:flex;justify-content:center;align-items:center}.status-card__actions>div{background:rgba(0,0,0,.6);border-radius:8px;padding:12px 9px;flex:0 0 auto;display:flex;justify-content:center;align-items:center}.status-card__actions button,.status-card__actions a{display:inline;color:#282c37;background:transparent;border:0;padding:0 8px;text-decoration:none;font-size:18px;line-height:18px}.status-card__actions button:hover,.status-card__actions button:active,.status-card__actions button:focus,.status-card__actions a:hover,.status-card__actions a:active,.status-card__actions a:focus{color:#000}.status-card__actions a{font-size:19px;position:relative;bottom:-1px}.status-card__actions a .fa,.status-card__actions a:hover .fa{color:inherit}a.status-card{cursor:pointer}a.status-card:hover{background:#c0cdd9}.status-card-photo{cursor:zoom-in;display:block;text-decoration:none;width:100%;height:auto;margin:0}.status-card-video iframe{width:100%;height:100%}.status-card__title{display:block;font-weight:500;margin-bottom:5px;color:#282c37;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-decoration:none}.status-card__content{flex:1 1 auto;overflow:hidden;padding:14px 14px 14px 8px}.status-card__description{color:#282c37}.status-card__host{display:block;margin-top:5px;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-card__image{flex:0 0 100px;background:#c0cdd9;position:relative}.status-card__image>.fa{font-size:21px;position:absolute;transform-origin:50% 50%;top:50%;left:50%;transform:translate(-50%, -50%)}.status-card.horizontal{display:block}.status-card.horizontal .status-card__image{width:100%}.status-card.horizontal .status-card__image-image{border-radius:4px 4px 0 0}.status-card.horizontal .status-card__title{white-space:inherit}.status-card.compact{border-color:#ccd7e0}.status-card.compact.interactive{border:0}.status-card.compact .status-card__content{padding:8px;padding-top:10px}.status-card.compact .status-card__title{white-space:nowrap}.status-card.compact .status-card__image{flex:0 0 60px}a.status-card.compact:hover{background-color:#ccd7e0}.status-card__image-image{border-radius:4px 0 0 4px;display:block;margin:0;width:100%;height:100%;object-fit:cover;background-size:cover;background-position:center center}.attachment-list{display:flex;font-size:14px;border:1px solid #c0cdd9;border-radius:4px;margin-top:14px;overflow:hidden}.attachment-list__icon{flex:0 0 auto;color:#444b5d;padding:8px 18px;cursor:default;border-right:1px solid #c0cdd9;display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:26px}.attachment-list__icon .fa{display:block}.attachment-list__list{list-style:none;padding:4px 0;padding-left:8px;display:flex;flex-direction:column;justify-content:center}.attachment-list__list li{display:block;padding:4px 0}.attachment-list__list a{text-decoration:none;color:#444b5d;font-weight:500}.attachment-list__list a:hover{text-decoration:underline}.attachment-list.compact{border:0;margin-top:4px}.attachment-list.compact .attachment-list__list{padding:0;display:block}.attachment-list.compact .fa{color:#444b5d}.status__wrapper--filtered__button{display:inline;color:#217aba;border:0;background:transparent;padding:0;font-size:inherit;line-height:inherit}.status__wrapper--filtered__button:hover,.status__wrapper--filtered__button:active{text-decoration:underline}.modal-container--preloader{background:#c0cdd9}.modal-root{position:relative;transition:opacity .3s linear;will-change:opacity;z-index:9999}.modal-root__overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(255,255,255,.7)}.modal-root__container{position:fixed;top:0;left:0;width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;align-content:space-around;z-index:9999;pointer-events:none;user-select:none}.modal-root__modal{pointer-events:auto;display:flex;z-index:9999}.onboarding-modal,.error-modal,.embed-modal{background:#282c37;color:#000;border-radius:8px;overflow:hidden;display:flex;flex-direction:column}.onboarding-modal__pager{height:80vh;width:80vw;max-width:520px;max-height:470px}.onboarding-modal__pager .react-swipeable-view-container>div{width:100%;height:100%;box-sizing:border-box;display:none;flex-direction:column;align-items:center;justify-content:center;display:flex;user-select:text}.error-modal__body{height:80vh;width:80vw;max-width:520px;max-height:420px;position:relative}.error-modal__body>div{position:absolute;top:0;left:0;width:100%;height:100%;box-sizing:border-box;padding:25px;display:none;flex-direction:column;align-items:center;justify-content:center;display:flex;opacity:0;user-select:text}.error-modal__body{display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center}@media screen and (max-width: 550px){.onboarding-modal{width:100%;height:100%;border-radius:0}.onboarding-modal__pager{width:100%;height:auto;max-width:none;max-height:none;flex:1 1 auto}}.onboarding-modal__paginator,.error-modal__footer{flex:0 0 auto;background:#393f4f;display:flex;padding:25px}.onboarding-modal__paginator>div,.error-modal__footer>div{min-width:33px}.onboarding-modal__paginator .onboarding-modal__nav,.onboarding-modal__paginator .error-modal__nav,.error-modal__footer .onboarding-modal__nav,.error-modal__footer .error-modal__nav{color:#282c37;border:0;font-size:14px;font-weight:500;padding:10px 25px;line-height:inherit;height:auto;margin:-10px;border-radius:4px;background-color:transparent}.onboarding-modal__paginator .onboarding-modal__nav:hover,.onboarding-modal__paginator .onboarding-modal__nav:focus,.onboarding-modal__paginator .onboarding-modal__nav:active,.onboarding-modal__paginator .error-modal__nav:hover,.onboarding-modal__paginator .error-modal__nav:focus,.onboarding-modal__paginator .error-modal__nav:active,.error-modal__footer .onboarding-modal__nav:hover,.error-modal__footer .onboarding-modal__nav:focus,.error-modal__footer .onboarding-modal__nav:active,.error-modal__footer .error-modal__nav:hover,.error-modal__footer .error-modal__nav:focus,.error-modal__footer .error-modal__nav:active{color:#313543;background-color:#4a5266}.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next,.error-modal__footer .error-modal__nav.onboarding-modal__done,.error-modal__footer .error-modal__nav.onboarding-modal__next{color:#000}.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:hover,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:focus,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:active,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:hover,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:focus,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:active,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:hover,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:focus,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:active,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:hover,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:focus,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:active,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:hover,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:focus,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:active,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:hover,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:focus,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:active,.error-modal__footer .error-modal__nav.onboarding-modal__done:hover,.error-modal__footer .error-modal__nav.onboarding-modal__done:focus,.error-modal__footer .error-modal__nav.onboarding-modal__done:active,.error-modal__footer .error-modal__nav.onboarding-modal__next:hover,.error-modal__footer .error-modal__nav.onboarding-modal__next:focus,.error-modal__footer .error-modal__nav.onboarding-modal__next:active{color:#000}.error-modal__footer{justify-content:center}.onboarding-modal__dots{flex:1 1 auto;display:flex;align-items:center;justify-content:center}.onboarding-modal__dot{width:14px;height:14px;border-radius:14px;background:#4a5266;margin:0 3px;cursor:pointer}.onboarding-modal__dot:hover{background:#4f576c}.onboarding-modal__dot.active{cursor:default;background:#5c657e}.onboarding-modal__page__wrapper{pointer-events:none;padding:25px;padding-bottom:0}.onboarding-modal__page__wrapper.onboarding-modal__page__wrapper--active{pointer-events:auto}.onboarding-modal__page{cursor:default;line-height:21px}.onboarding-modal__page h1{font-size:18px;font-weight:500;color:#000;margin-bottom:20px}.onboarding-modal__page a{color:#2b90d9}.onboarding-modal__page a:hover,.onboarding-modal__page a:focus,.onboarding-modal__page a:active{color:#2485cb}.onboarding-modal__page .navigation-bar a{color:inherit}.onboarding-modal__page p{font-size:16px;color:#282c37;margin-top:10px;margin-bottom:10px}.onboarding-modal__page p:last-child{margin-bottom:0}.onboarding-modal__page p strong{font-weight:500;background:#d9e1e8;color:#282c37;border-radius:4px;font-size:14px;padding:3px 6px}.onboarding-modal__page p strong:lang(ja){font-weight:700}.onboarding-modal__page p strong:lang(ko){font-weight:700}.onboarding-modal__page p strong:lang(zh-CN){font-weight:700}.onboarding-modal__page p strong:lang(zh-HK){font-weight:700}.onboarding-modal__page p strong:lang(zh-TW){font-weight:700}.onboarding-modal__page__wrapper-0{height:100%;padding:0}.onboarding-modal__page-one__lead{padding:65px;padding-top:45px;padding-bottom:0;margin-bottom:10px}.onboarding-modal__page-one__lead h1{font-size:26px;line-height:36px;margin-bottom:8px}.onboarding-modal__page-one__lead p{margin-bottom:0}.onboarding-modal__page-one__extra{padding-right:65px;padding-left:185px;text-align:center}.display-case{text-align:center;font-size:15px;margin-bottom:15px}.display-case__label{font-weight:500;color:#000;margin-bottom:5px;text-transform:uppercase;font-size:12px}.display-case__case{background:#d9e1e8;color:#282c37;font-weight:500;padding:10px;border-radius:4px}.onboarding-modal__page-two p,.onboarding-modal__page-three p,.onboarding-modal__page-four p,.onboarding-modal__page-five p{text-align:left}.onboarding-modal__page-two .figure,.onboarding-modal__page-three .figure,.onboarding-modal__page-four .figure,.onboarding-modal__page-five .figure{background:#f2f5f7;color:#282c37;margin-bottom:20px;border-radius:4px;padding:10px;text-align:center;font-size:14px;box-shadow:1px 2px 6px rgba(0,0,0,.3)}.onboarding-modal__page-two .figure .onboarding-modal__image,.onboarding-modal__page-three .figure .onboarding-modal__image,.onboarding-modal__page-four .figure .onboarding-modal__image,.onboarding-modal__page-five .figure .onboarding-modal__image{border-radius:4px;margin-bottom:10px}.onboarding-modal__page-two .figure.non-interactive,.onboarding-modal__page-three .figure.non-interactive,.onboarding-modal__page-four .figure.non-interactive,.onboarding-modal__page-five .figure.non-interactive{pointer-events:none;text-align:left}.onboarding-modal__page-four__columns .row{display:flex;margin-bottom:20px}.onboarding-modal__page-four__columns .row>div{flex:1 1 0;margin:0 10px}.onboarding-modal__page-four__columns .row>div:first-child{margin-left:0}.onboarding-modal__page-four__columns .row>div:last-child{margin-right:0}.onboarding-modal__page-four__columns .row>div p{text-align:center}.onboarding-modal__page-four__columns .row:last-child{margin-bottom:0}.onboarding-modal__page-four__columns .column-header{color:#000}@media screen and (max-width: 320px)and (max-height: 600px){.onboarding-modal__page p{font-size:14px;line-height:20px}.onboarding-modal__page-two .figure,.onboarding-modal__page-three .figure,.onboarding-modal__page-four .figure,.onboarding-modal__page-five .figure{font-size:12px;margin-bottom:10px}.onboarding-modal__page-four__columns .row{margin-bottom:10px}.onboarding-modal__page-four__columns .column-header{padding:5px;font-size:12px}}.onboard-sliders{display:inline-block;max-width:30px;max-height:auto;margin-left:10px}.boost-modal,.doodle-modal,.favourite-modal,.confirmation-modal,.report-modal,.actions-modal,.mute-modal,.block-modal{background:#17191f;color:#000;border-radius:8px;overflow:hidden;max-width:90vw;width:480px;position:relative;flex-direction:column}.boost-modal .status__relative-time,.doodle-modal .status__relative-time,.favourite-modal .status__relative-time,.confirmation-modal .status__relative-time,.report-modal .status__relative-time,.actions-modal .status__relative-time,.mute-modal .status__relative-time,.block-modal .status__relative-time{color:#444b5d;float:right;font-size:14px;width:auto;margin:initial;padding:initial}.boost-modal .status__display-name,.doodle-modal .status__display-name,.favourite-modal .status__display-name,.confirmation-modal .status__display-name,.report-modal .status__display-name,.actions-modal .status__display-name,.mute-modal .status__display-name,.block-modal .status__display-name{display:flex}.boost-modal .status__avatar,.doodle-modal .status__avatar,.favourite-modal .status__avatar,.confirmation-modal .status__avatar,.report-modal .status__avatar,.actions-modal .status__avatar,.mute-modal .status__avatar,.block-modal .status__avatar{height:48px;width:48px}.boost-modal .status__content__spoiler-link,.doodle-modal .status__content__spoiler-link,.favourite-modal .status__content__spoiler-link,.confirmation-modal .status__content__spoiler-link,.report-modal .status__content__spoiler-link,.actions-modal .status__content__spoiler-link,.mute-modal .status__content__spoiler-link,.block-modal .status__content__spoiler-link{color:#17191f}.actions-modal .status{background:#fff;border-bottom-color:#282c37;padding-top:10px;padding-bottom:10px}.actions-modal .dropdown-menu__separator{border-bottom-color:#282c37}.boost-modal__container,.favourite-modal__container{overflow-x:scroll;padding:10px}.boost-modal__container .status,.favourite-modal__container .status{user-select:text;border-bottom:0}.boost-modal__action-bar,.doodle-modal__action-bar,.favourite-modal__action-bar,.confirmation-modal__action-bar,.mute-modal__action-bar,.block-modal__action-bar{display:flex;justify-content:space-between;background:#282c37;padding:10px;line-height:36px}.boost-modal__action-bar>div,.doodle-modal__action-bar>div,.favourite-modal__action-bar>div,.confirmation-modal__action-bar>div,.mute-modal__action-bar>div,.block-modal__action-bar>div{flex:1 1 auto;text-align:right;color:#282c37;padding-right:10px}.boost-modal__action-bar .button,.doodle-modal__action-bar .button,.favourite-modal__action-bar .button,.confirmation-modal__action-bar .button,.mute-modal__action-bar .button,.block-modal__action-bar .button{flex:0 0 auto}.boost-modal__status-header,.favourite-modal__status-header{font-size:15px}.boost-modal__status-time,.favourite-modal__status-time{float:right;font-size:14px}.mute-modal,.block-modal{line-height:24px}.mute-modal .react-toggle,.block-modal .react-toggle{vertical-align:middle}.report-modal{width:90vw;max-width:700px}.report-modal__container{display:flex;border-top:1px solid #282c37}@media screen and (max-width: 480px){.report-modal__container{flex-wrap:wrap;overflow-y:auto}}.report-modal__statuses,.report-modal__comment{box-sizing:border-box;width:50%}@media screen and (max-width: 480px){.report-modal__statuses,.report-modal__comment{width:100%}}.report-modal__statuses,.focal-point-modal__content{flex:1 1 auto;min-height:20vh;max-height:80vh;overflow-y:auto;overflow-x:hidden}.report-modal__statuses .status__content a,.focal-point-modal__content .status__content a{color:#2b90d9}@media screen and (max-width: 480px){.report-modal__statuses,.focal-point-modal__content{max-height:10vh}}@media screen and (max-width: 480px){.focal-point-modal__content{max-height:40vh}}.report-modal__comment{padding:20px;border-right:1px solid #282c37;max-width:320px}.report-modal__comment p{font-size:14px;line-height:20px;margin-bottom:20px}.report-modal__comment .setting-text{display:block;box-sizing:border-box;width:100%;margin:0;color:#000;background:#fff;padding:10px;font-family:inherit;font-size:14px;resize:none;border:0;outline:0;border-radius:4px;border:1px solid #282c37;min-height:100px;max-height:50vh;margin-bottom:10px}.report-modal__comment .setting-text:focus{border:1px solid #393f4f}.report-modal__comment .setting-text__wrapper{background:#fff;border:1px solid #282c37;margin-bottom:10px;border-radius:4px}.report-modal__comment .setting-text__wrapper .setting-text{border:0;margin-bottom:0;border-radius:0}.report-modal__comment .setting-text__wrapper .setting-text:focus{border:0}.report-modal__comment .setting-text__wrapper__modifiers{color:#000;font-family:inherit;font-size:14px;background:#fff}.report-modal__comment .setting-text__toolbar{display:flex;justify-content:space-between;margin-bottom:20px}.report-modal__comment .setting-text-label{display:block;color:#000;font-size:14px;font-weight:500;margin-bottom:10px}.report-modal__comment .setting-toggle{margin-top:20px;margin-bottom:24px}.report-modal__comment .setting-toggle__label{color:#000;font-size:14px}@media screen and (max-width: 480px){.report-modal__comment{padding:10px;max-width:100%;order:2}.report-modal__comment .setting-toggle{margin-bottom:4px}}.actions-modal{max-height:80vh;max-width:80vw}.actions-modal .status{overflow-y:auto;max-height:300px}.actions-modal strong{display:block;font-weight:500}.actions-modal .actions-modal__item-label{font-weight:500}.actions-modal ul{overflow-y:auto;flex-shrink:0;max-height:80vh}.actions-modal ul.with-status{max-height:calc(80vh - 75px)}.actions-modal ul li:empty{margin:0}.actions-modal ul li:not(:empty) a{color:#000;display:flex;padding:12px 16px;font-size:15px;align-items:center;text-decoration:none}.actions-modal ul li:not(:empty) a,.actions-modal ul li:not(:empty) a button{transition:none}.actions-modal ul li:not(:empty) a.active,.actions-modal ul li:not(:empty) a.active button,.actions-modal ul li:not(:empty) a:hover,.actions-modal ul li:not(:empty) a:hover button,.actions-modal ul li:not(:empty) a:active,.actions-modal ul li:not(:empty) a:active button,.actions-modal ul li:not(:empty) a:focus,.actions-modal ul li:not(:empty) a:focus button{background:#2b90d9;color:#000}.actions-modal ul li:not(:empty) a>.react-toggle,.actions-modal ul li:not(:empty) a>.icon,.actions-modal ul li:not(:empty) a button:first-child{margin-right:10px}.confirmation-modal__action-bar .confirmation-modal__secondary-button,.mute-modal__action-bar .confirmation-modal__secondary-button,.block-modal__action-bar .confirmation-modal__secondary-button{flex-shrink:1}.confirmation-modal__secondary-button,.confirmation-modal__cancel-button,.mute-modal__cancel-button,.block-modal__cancel-button{background-color:transparent;color:#282c37;font-size:14px;font-weight:500}.confirmation-modal__secondary-button:hover,.confirmation-modal__secondary-button:focus,.confirmation-modal__secondary-button:active,.confirmation-modal__cancel-button:hover,.confirmation-modal__cancel-button:focus,.confirmation-modal__cancel-button:active,.mute-modal__cancel-button:hover,.mute-modal__cancel-button:focus,.mute-modal__cancel-button:active,.block-modal__cancel-button:hover,.block-modal__cancel-button:focus,.block-modal__cancel-button:active{color:#313543;background-color:transparent}.confirmation-modal__do_not_ask_again{padding-left:20px;padding-right:20px;padding-bottom:10px;font-size:14px}.confirmation-modal__do_not_ask_again label,.confirmation-modal__do_not_ask_again input{vertical-align:middle}.confirmation-modal__container,.mute-modal__container,.block-modal__container,.report-modal__target{padding:30px;font-size:16px}.confirmation-modal__container strong,.mute-modal__container strong,.block-modal__container strong,.report-modal__target strong{font-weight:500}.confirmation-modal__container strong:lang(ja),.mute-modal__container strong:lang(ja),.block-modal__container strong:lang(ja),.report-modal__target strong:lang(ja){font-weight:700}.confirmation-modal__container strong:lang(ko),.mute-modal__container strong:lang(ko),.block-modal__container strong:lang(ko),.report-modal__target strong:lang(ko){font-weight:700}.confirmation-modal__container strong:lang(zh-CN),.mute-modal__container strong:lang(zh-CN),.block-modal__container strong:lang(zh-CN),.report-modal__target strong:lang(zh-CN){font-weight:700}.confirmation-modal__container strong:lang(zh-HK),.mute-modal__container strong:lang(zh-HK),.block-modal__container strong:lang(zh-HK),.report-modal__target strong:lang(zh-HK){font-weight:700}.confirmation-modal__container strong:lang(zh-TW),.mute-modal__container strong:lang(zh-TW),.block-modal__container strong:lang(zh-TW),.report-modal__target strong:lang(zh-TW){font-weight:700}.confirmation-modal__container,.report-modal__target{text-align:center}.block-modal__explanation,.mute-modal__explanation{margin-top:20px}.block-modal .setting-toggle,.mute-modal .setting-toggle{margin-top:20px;margin-bottom:24px;display:flex;align-items:center}.block-modal .setting-toggle__label,.mute-modal .setting-toggle__label{color:#000;margin:0;margin-left:8px}.report-modal__target{padding:15px}.report-modal__target .media-modal__close{top:14px;right:15px}.embed-modal{width:auto;max-width:80vw;max-height:80vh}.embed-modal h4{padding:30px;font-weight:500;font-size:16px;text-align:center}.embed-modal .embed-modal__container{padding:10px}.embed-modal .embed-modal__container .hint{margin-bottom:15px}.embed-modal .embed-modal__container .embed-modal__html{outline:0;box-sizing:border-box;display:block;width:100%;border:none;padding:10px;font-family:\"mastodon-font-monospace\",monospace;background:#d9e1e8;color:#000;font-size:14px;margin:0;margin-bottom:15px;border-radius:4px}.embed-modal .embed-modal__container .embed-modal__html::-moz-focus-inner{border:0}.embed-modal .embed-modal__container .embed-modal__html::-moz-focus-inner,.embed-modal .embed-modal__container .embed-modal__html:focus,.embed-modal .embed-modal__container .embed-modal__html:active{outline:0 !important}.embed-modal .embed-modal__container .embed-modal__html:focus{background:#ccd7e0}@media screen and (max-width: 600px){.embed-modal .embed-modal__container .embed-modal__html{font-size:16px}}.embed-modal .embed-modal__container .embed-modal__iframe{width:400px;max-width:100%;overflow:hidden;border:0;border-radius:4px}.focal-point{position:relative;cursor:move;overflow:hidden;height:100%;display:flex;justify-content:center;align-items:center;background:#000}.focal-point img,.focal-point video,.focal-point canvas{display:block;max-height:80vh;width:100%;height:auto;margin:0;object-fit:contain;background:#000}.focal-point__reticle{position:absolute;width:100px;height:100px;transform:translate(-50%, -50%);background:url(\"~images/reticle.png\") no-repeat 0 0;border-radius:50%;box-shadow:0 0 0 9999em rgba(0,0,0,.35)}.focal-point__overlay{position:absolute;width:100%;height:100%;top:0;left:0}.focal-point__preview{position:absolute;bottom:10px;right:10px;z-index:2;cursor:move;transition:opacity .1s ease}.focal-point__preview:hover{opacity:.5}.focal-point__preview strong{color:#000;font-size:14px;font-weight:500;display:block;margin-bottom:5px}.focal-point__preview div{border-radius:4px;box-shadow:0 0 14px rgba(0,0,0,.2)}@media screen and (max-width: 480px){.focal-point img,.focal-point video{max-height:100%}.focal-point__preview{display:none}}.filtered-status-info{text-align:start}.filtered-status-info .spoiler__text{margin-top:20px}.filtered-status-info .account{border-bottom:0}.filtered-status-info .account__display-name strong{color:#000}.filtered-status-info .status__content__spoiler{display:none}.filtered-status-info .status__content__spoiler--visible{display:flex}.filtered-status-info ul{padding:10px;margin-left:12px;list-style:disc inside}.filtered-status-info .filtered-status-edit-link{color:#606984;text-decoration:none}.filtered-status-info .filtered-status-edit-link:hover{text-decoration:underline}.composer{padding:10px}.character-counter{cursor:default;font-family:sans-serif,sans-serif;font-size:14px;font-weight:600;color:#282c37}.character-counter.character-counter--over{color:#ff5050}.no-reduce-motion .composer--spoiler{transition:height .4s ease,opacity .4s ease}.composer--spoiler{height:0;transform-origin:bottom;opacity:0}.composer--spoiler.composer--spoiler--visible{height:36px;margin-bottom:11px;opacity:1}.composer--spoiler input{display:block;box-sizing:border-box;margin:0;border:none;border-radius:4px;padding:10px;width:100%;outline:0;color:#000;background:#fff;font-size:14px;font-family:inherit;resize:vertical}.composer--spoiler input::placeholder{color:#444b5d}.composer--spoiler input:focus{outline:0}@media screen and (max-width: 630px){.auto-columns .composer--spoiler input{font-size:16px}}.single-column .composer--spoiler input{font-size:16px}.composer--warning{color:#000;margin-bottom:15px;background:#9baec8;box-shadow:0 2px 6px rgba(0,0,0,.3);padding:8px 10px;border-radius:4px;font-size:13px;font-weight:400}.composer--warning a{color:#282c37;font-weight:500;text-decoration:underline}.composer--warning a:active,.composer--warning a:focus,.composer--warning a:hover{text-decoration:none}.compose-form__sensitive-button{padding:10px;padding-top:0;font-size:14px;font-weight:500}.compose-form__sensitive-button.active{color:#2b90d9}.compose-form__sensitive-button input[type=checkbox]{display:none}.compose-form__sensitive-button .checkbox{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-left:5px;margin-right:10px;top:-1px;border-radius:4px;vertical-align:middle}.compose-form__sensitive-button .checkbox.active{border-color:#2b90d9;background:#2b90d9}.composer--reply{margin:0 0 10px;border-radius:4px;padding:10px;background:#9baec8;min-height:23px;overflow-y:auto;flex:0 2 auto}.composer--reply>header{margin-bottom:5px;overflow:hidden}.composer--reply>header>.account.small{color:#000}.composer--reply>header>.cancel{float:right;line-height:24px}.composer--reply>.content{position:relative;margin:10px 0;padding:0 12px;font-size:14px;line-height:20px;color:#000;word-wrap:break-word;font-weight:400;overflow:visible;white-space:pre-wrap;padding-top:5px;overflow:hidden}.composer--reply>.content p,.composer--reply>.content pre,.composer--reply>.content blockquote{margin-bottom:20px;white-space:pre-wrap}.composer--reply>.content p:last-child,.composer--reply>.content pre:last-child,.composer--reply>.content blockquote:last-child{margin-bottom:0}.composer--reply>.content h1,.composer--reply>.content h2,.composer--reply>.content h3,.composer--reply>.content h4,.composer--reply>.content h5{margin-top:20px;margin-bottom:20px}.composer--reply>.content h1,.composer--reply>.content h2{font-weight:700;font-size:18px}.composer--reply>.content h2{font-size:16px}.composer--reply>.content h3,.composer--reply>.content h4,.composer--reply>.content h5{font-weight:500}.composer--reply>.content blockquote{padding-left:10px;border-left:3px solid #000;color:#000;white-space:normal}.composer--reply>.content blockquote p:last-child{margin-bottom:0}.composer--reply>.content b,.composer--reply>.content strong{font-weight:700}.composer--reply>.content em,.composer--reply>.content i{font-style:italic}.composer--reply>.content sub{font-size:smaller;text-align:sub}.composer--reply>.content ul,.composer--reply>.content ol{margin-left:1em}.composer--reply>.content ul p,.composer--reply>.content ol p{margin:0}.composer--reply>.content ul{list-style-type:disc}.composer--reply>.content ol{list-style-type:decimal}.composer--reply>.content a{color:#282c37;text-decoration:none}.composer--reply>.content a:hover{text-decoration:underline}.composer--reply>.content a.mention:hover{text-decoration:none}.composer--reply>.content a.mention:hover span{text-decoration:underline}.composer--reply .emojione{width:20px;height:20px;margin:-5px 0 0}.emoji-picker-dropdown{position:absolute;right:5px;top:5px}.emoji-picker-dropdown ::-webkit-scrollbar-track:hover,.emoji-picker-dropdown ::-webkit-scrollbar-track:active{background-color:rgba(255,255,255,.3)}.compose-form__autosuggest-wrapper,.autosuggest-input{position:relative;width:100%}.compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea,.autosuggest-input label .autosuggest-textarea__textarea{display:block;box-sizing:border-box;margin:0;border:none;border-radius:4px 4px 0 0;padding:10px 32px 0 10px;width:100%;min-height:100px;outline:0;color:#000;background:#fff;font-size:14px;font-family:inherit;resize:none;scrollbar-color:initial}.compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea::placeholder,.autosuggest-input label .autosuggest-textarea__textarea::placeholder{color:#444b5d}.compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea::-webkit-scrollbar,.autosuggest-input label .autosuggest-textarea__textarea::-webkit-scrollbar{all:unset}.compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea:disabled,.autosuggest-input label .autosuggest-textarea__textarea:disabled{background:#282c37}.compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea:focus,.autosuggest-input label .autosuggest-textarea__textarea:focus{outline:0}@media screen and (max-width: 630px){.auto-columns .compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea,.auto-columns .autosuggest-input label .autosuggest-textarea__textarea{font-size:16px}}.single-column .compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea,.single-column .autosuggest-input label .autosuggest-textarea__textarea{font-size:16px}@media screen and (max-width: 600px){.auto-columns .compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea,.single-column .compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea,.auto-columns .autosuggest-input label .autosuggest-textarea__textarea,.single-column .autosuggest-input label .autosuggest-textarea__textarea{height:100px !important;resize:vertical}}.composer--textarea--icons{display:block;position:absolute;top:29px;right:5px;bottom:5px;overflow:hidden}.composer--textarea--icons>.textarea_icon{display:block;margin:2px 0 0 2px;width:24px;height:24px;color:#282c37;font-size:18px;line-height:24px;text-align:center;opacity:.8}.autosuggest-textarea__suggestions-wrapper{position:relative;height:0}.autosuggest-textarea__suggestions{display:block;position:absolute;box-sizing:border-box;top:100%;border-radius:0 0 4px 4px;padding:6px;width:100%;color:#000;background:#282c37;box-shadow:4px 4px 6px rgba(0,0,0,.4);font-size:14px;z-index:99;display:none}.autosuggest-textarea__suggestions--visible{display:block}.autosuggest-textarea__suggestions__item{padding:10px;cursor:pointer;border-radius:4px}.autosuggest-textarea__suggestions__item:hover,.autosuggest-textarea__suggestions__item:focus,.autosuggest-textarea__suggestions__item:active,.autosuggest-textarea__suggestions__item.selected{background:#3d4455}.autosuggest-textarea__suggestions__item>.account,.autosuggest-textarea__suggestions__item>.emoji,.autosuggest-textarea__suggestions__item>.autosuggest-hashtag{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;line-height:18px;font-size:14px}.autosuggest-textarea__suggestions__item .autosuggest-hashtag{justify-content:space-between}.autosuggest-textarea__suggestions__item .autosuggest-hashtag__name{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.autosuggest-textarea__suggestions__item .autosuggest-hashtag strong{font-weight:500}.autosuggest-textarea__suggestions__item .autosuggest-hashtag__uses{flex:0 0 auto;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.autosuggest-textarea__suggestions__item>.account.small .display-name>span{color:#282c37}.composer--upload_form{overflow:hidden}.composer--upload_form>.content{display:flex;flex-direction:row;flex-wrap:wrap;font-family:inherit;padding:5px;overflow:hidden}.composer--upload_form--item{flex:1 1 0;margin:5px;min-width:40%}.composer--upload_form--item>div{position:relative;border-radius:4px;height:140px;width:100%;background-color:#000;background-position:center;background-size:cover;background-repeat:no-repeat;overflow:hidden}.composer--upload_form--item>div textarea{display:block;position:absolute;box-sizing:border-box;bottom:0;left:0;margin:0;border:0;padding:10px;width:100%;color:#282c37;background:linear-gradient(0deg, rgba(0, 0, 0, 0.8) 0, rgba(0, 0, 0, 0.35) 80%, transparent);font-size:14px;font-family:inherit;font-weight:500;opacity:0;z-index:2;transition:opacity .1s ease}.composer--upload_form--item>div textarea:focus{color:#fff}.composer--upload_form--item>div textarea::placeholder{opacity:.54;color:#282c37}.composer--upload_form--item>div>.close{mix-blend-mode:difference}.composer--upload_form--item.active>div textarea{opacity:1}.composer--upload_form--actions{background:linear-gradient(180deg, rgba(0, 0, 0, 0.8) 0, rgba(0, 0, 0, 0.35) 80%, transparent);display:flex;align-items:flex-start;justify-content:space-between;opacity:0;transition:opacity .1s ease}.composer--upload_form--actions .icon-button{flex:0 1 auto;color:#282c37;font-size:14px;font-weight:500;padding:10px;font-family:inherit}.composer--upload_form--actions .icon-button:hover,.composer--upload_form--actions .icon-button:focus,.composer--upload_form--actions .icon-button:active{color:#1f232b}.composer--upload_form--actions.active{opacity:1}.composer--upload_form--progress{display:flex;padding:10px;color:#282c37;overflow:hidden}.composer--upload_form--progress>.fa{font-size:34px;margin-right:10px}.composer--upload_form--progress>.message{flex:1 1 auto}.composer--upload_form--progress>.message>span{display:block;font-size:12px;font-weight:500;text-transform:uppercase}.composer--upload_form--progress>.message>.backdrop{position:relative;margin-top:5px;border-radius:6px;width:100%;height:6px;background:#3c5063}.composer--upload_form--progress>.message>.backdrop>.tracker{position:absolute;top:0;left:0;height:6px;border-radius:6px;background:#2b90d9}.compose-form__modifiers{color:#000;font-family:inherit;font-size:14px;background:#fff}.composer--options-wrapper{padding:10px;background:#fff;border-radius:0 0 4px 4px;height:27px;display:flex;justify-content:space-between;flex:0 0 auto}.composer--options{display:flex;flex:0 0 auto}.composer--options>*{display:inline-block;box-sizing:content-box;padding:0 3px;height:27px;line-height:27px;vertical-align:bottom}.composer--options>hr{display:inline-block;margin:0 3px;border-width:0 0 0 1px;border-style:none none none solid;border-color:transparent transparent transparent #fff;padding:0;width:0;height:27px;background:transparent}.compose--counter-wrapper{align-self:center;margin-right:4px}.composer--options--dropdown.open>.value{border-radius:4px 4px 0 0;box-shadow:0 -4px 4px rgba(0,0,0,.1);color:#000;background:#2b90d9;transition:none}.composer--options--dropdown.open.top>.value{border-radius:0 0 4px 4px;box-shadow:0 4px 4px rgba(0,0,0,.1)}.composer--options--dropdown--content{position:absolute;border-radius:4px;box-shadow:2px 4px 15px rgba(0,0,0,.4);background:#fff;overflow:hidden;transform-origin:50% 0}.composer--options--dropdown--content--item{display:flex;align-items:center;padding:10px;color:#000;cursor:pointer}.composer--options--dropdown--content--item>.content{flex:1 1 auto;color:#282c37}.composer--options--dropdown--content--item>.content:not(:first-child){margin-left:10px}.composer--options--dropdown--content--item>.content strong{display:block;color:#000;font-weight:500}.composer--options--dropdown--content--item:hover,.composer--options--dropdown--content--item.active{background:#2b90d9;color:#000}.composer--options--dropdown--content--item:hover>.content,.composer--options--dropdown--content--item.active>.content{color:#000}.composer--options--dropdown--content--item:hover>.content strong,.composer--options--dropdown--content--item.active>.content strong{color:#000}.composer--options--dropdown--content--item.active:hover{background:#2485cb}.composer--publisher{padding-top:10px;text-align:right;white-space:nowrap;overflow:hidden;justify-content:flex-end;flex:0 0 auto}.composer--publisher>.primary{display:inline-block;margin:0;padding:0 10px;text-align:center}.composer--publisher>.side_arm{display:inline-block;margin:0 2px;padding:0;width:36px;text-align:center}.composer--publisher.over>.count{color:#ff5050}.column__wrapper{display:flex;flex:1 1 auto;position:relative}.columns-area{display:flex;flex:1 1 auto;flex-direction:row;justify-content:flex-start;overflow-x:auto;position:relative}.columns-area__panels{display:flex;justify-content:center;width:100%;height:100%;min-height:100vh}.columns-area__panels__pane{height:100%;overflow:hidden;pointer-events:none;display:flex;justify-content:flex-end;min-width:285px}.columns-area__panels__pane--start{justify-content:flex-start}.columns-area__panels__pane__inner{position:fixed;width:285px;pointer-events:auto;height:100%}.columns-area__panels__main{box-sizing:border-box;width:100%;max-width:600px;flex:0 0 auto;display:flex;flex-direction:column}@media screen and (min-width: 415px){.columns-area__panels__main{padding:0 10px}}.tabs-bar__wrapper{background:#f2f5f7;position:sticky;top:0;z-index:2;padding-top:0}@media screen and (min-width: 415px){.tabs-bar__wrapper{padding-top:10px}}.tabs-bar__wrapper .tabs-bar{margin-bottom:0}@media screen and (min-width: 415px){.tabs-bar__wrapper .tabs-bar{margin-bottom:10px}}.react-swipeable-view-container,.react-swipeable-view-container .columns-area,.react-swipeable-view-container .column{height:100%}.react-swipeable-view-container>*{display:flex;align-items:center;justify-content:center;height:100%}.column{width:330px;position:relative;box-sizing:border-box;display:flex;flex-direction:column}.column>.scrollable{background:#d9e1e8}.ui{flex:0 0 auto;display:flex;flex-direction:column;width:100%;height:100%}.column{overflow:hidden}.column-back-button{box-sizing:border-box;width:100%;background:#ccd7e0;color:#2b90d9;cursor:pointer;flex:0 0 auto;font-size:16px;border:0;text-align:unset;padding:15px;margin:0;z-index:3}.column-back-button:hover{text-decoration:underline}.column-header__back-button{background:#ccd7e0;border:0;font-family:inherit;color:#2b90d9;cursor:pointer;flex:0 0 auto;font-size:16px;padding:0 5px 0 0;z-index:3}.column-header__back-button:hover{text-decoration:underline}.column-header__back-button:last-child{padding:0 15px 0 0}.column-back-button__icon{display:inline-block;margin-right:5px}.column-back-button--slim{position:relative}.column-back-button--slim-button{cursor:pointer;flex:0 0 auto;font-size:16px;padding:15px;position:absolute;right:0;top:-48px}.column-link{background:#c0cdd9;color:#000;display:block;font-size:16px;padding:15px;text-decoration:none}.column-link:hover,.column-link:focus,.column-link:active{background:#b6c5d3}.column-link:focus{outline:0}.column-link--transparent{background:transparent;color:#282c37}.column-link--transparent:hover,.column-link--transparent:focus,.column-link--transparent:active{background:transparent;color:#000}.column-link--transparent.active{color:#2b90d9}.column-link__icon{display:inline-block;margin-right:5px}.column-subheading{background:#d9e1e8;color:#444b5d;padding:8px 20px;font-size:12px;font-weight:500;text-transform:uppercase;cursor:default}.column-header__wrapper{position:relative;flex:0 0 auto}.column-header__wrapper.active::before{display:block;content:\"\";position:absolute;top:35px;left:0;right:0;margin:0 auto;width:60%;pointer-events:none;height:28px;z-index:1;background:radial-gradient(ellipse, rgba(43, 144, 217, 0.23) 0%, rgba(43, 144, 217, 0) 60%)}.column-header{display:flex;font-size:16px;background:#ccd7e0;flex:0 0 auto;cursor:pointer;position:relative;z-index:2;outline:0;overflow:hidden}.column-header>button{margin:0;border:none;padding:15px;color:inherit;background:transparent;font:inherit;text-align:left;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;flex:1}.column-header>.column-header__back-button{color:#2b90d9}.column-header.active{box-shadow:0 1px 0 rgba(43,144,217,.3)}.column-header.active .column-header__icon{color:#2b90d9;text-shadow:0 0 10px rgba(43,144,217,.4)}.column-header:focus,.column-header:active{outline:0}.column{width:330px;position:relative;box-sizing:border-box;display:flex;flex-direction:column;overflow:hidden}.wide .columns-area:not(.columns-area--mobile) .column{flex:auto;min-width:330px;max-width:400px}.column>.scrollable{background:#d9e1e8}.column-header__buttons{height:48px;display:flex;margin-left:0}.column-header__links{margin-bottom:14px}.column-header__links .text-btn{margin-right:10px}.column-header__button,.column-header__notif-cleaning-buttons button{background:#ccd7e0;border:0;color:#282c37;cursor:pointer;font-size:16px;padding:0 15px}.column-header__button:hover,.column-header__notif-cleaning-buttons button:hover{color:#191b22}.column-header__button.active,.column-header__notif-cleaning-buttons button.active{color:#000;background:#c0cdd9}.column-header__button.active:hover,.column-header__notif-cleaning-buttons button.active:hover{color:#000;background:#c0cdd9}.column-header__button:focus,.column-header__notif-cleaning-buttons button:focus{text-shadow:0 0 4px #419bdd}.column-header__notif-cleaning-buttons{display:flex;align-items:stretch;justify-content:space-around}.column-header__notif-cleaning-buttons button{background:transparent;text-align:center;padding:10px 0;white-space:pre-wrap}.column-header__notif-cleaning-buttons b{font-weight:bold}.column-header__collapsible-inner.nopad-drawer{padding:0}.column-header__collapsible{max-height:70vh;overflow:hidden;overflow-y:auto;color:#282c37;transition:max-height 150ms ease-in-out,opacity 300ms linear;opacity:1}.column-header__collapsible.collapsed{max-height:0;opacity:.5}.column-header__collapsible.animating{overflow-y:hidden}.column-header__collapsible hr{height:0;background:transparent;border:0;border-top:1px solid #b3c3d1;margin:10px 0}.column-header__collapsible.ncd{transition:none}.column-header__collapsible.ncd.collapsed{max-height:0;opacity:.7}.column-header__collapsible-inner{background:#c0cdd9;padding:15px}.column-header__setting-btn:hover{color:#282c37;text-decoration:underline}.column-header__setting-arrows{float:right}.column-header__setting-arrows .column-header__setting-btn{padding:0 10px}.column-header__setting-arrows .column-header__setting-btn:last-child{padding-right:0}.column-header__title{display:inline-block;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;flex:1}.column-header__icon{display:inline-block;margin-right:5px}.empty-column-indicator,.error-column{color:#444b5d;background:#d9e1e8;text-align:center;padding:20px;font-size:15px;font-weight:400;cursor:default;display:flex;flex:1 1 auto;align-items:center;justify-content:center}@supports(display: grid){.empty-column-indicator,.error-column{contain:strict}}.empty-column-indicator>span,.error-column>span{max-width:400px}.empty-column-indicator a,.error-column a{color:#2b90d9;text-decoration:none}.empty-column-indicator a:hover,.error-column a:hover{text-decoration:underline}.error-column{flex-direction:column}.single-column.navbar-under .tabs-bar{margin-top:0 !important;margin-bottom:-6px !important}@media screen and (max-width: 415px){.auto-columns.navbar-under .tabs-bar{margin-top:0 !important;margin-bottom:-6px !important}}@media screen and (max-width: 415px){.auto-columns.navbar-under .react-swipeable-view-container .columns-area,.single-column.navbar-under .react-swipeable-view-container .columns-area{height:100% !important}}.column-inline-form{padding:7px 15px;padding-right:5px;display:flex;justify-content:flex-start;align-items:center;background:#ccd7e0}.column-inline-form label{flex:1 1 auto}.column-inline-form label input{width:100%;margin-bottom:6px}.column-inline-form label input:focus{outline:0}.column-inline-form .icon-button{flex:0 0 auto;margin:0 5px}.regeneration-indicator{text-align:center;font-size:16px;font-weight:500;color:#444b5d;background:#d9e1e8;cursor:default;display:flex;flex:1 1 auto;flex-direction:column;align-items:center;justify-content:center;padding:20px}.regeneration-indicator__figure,.regeneration-indicator__figure img{display:block;width:auto;height:160px;margin:0}.regeneration-indicator--without-header{padding-top:68px}.regeneration-indicator__label{margin-top:30px}.regeneration-indicator__label strong{display:block;margin-bottom:10px;color:#444b5d}.regeneration-indicator__label span{font-size:15px;font-weight:400}.directory__list{width:100%;margin:10px 0;transition:opacity 100ms ease-in}.directory__list.loading{opacity:.7}@media screen and (max-width: 415px){.directory__list{margin:0}}.directory__card{box-sizing:border-box;margin-bottom:10px}.directory__card__img{height:125px;position:relative;background:#fff;overflow:hidden}.directory__card__img img{display:block;width:100%;height:100%;margin:0;object-fit:cover}.directory__card__bar{display:flex;align-items:center;background:#ccd7e0;padding:10px}.directory__card__bar__name{flex:1 1 auto;display:flex;align-items:center;text-decoration:none;overflow:hidden}.directory__card__bar__relationship{width:23px;min-height:1px;flex:0 0 auto}.directory__card__bar .avatar{flex:0 0 auto;width:48px;height:48px;padding-top:2px}.directory__card__bar .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px;background:#f2f5f7;object-fit:cover}.directory__card__bar .display-name{margin-left:15px;text-align:left}.directory__card__bar .display-name strong{font-size:15px;color:#000;font-weight:500;overflow:hidden;text-overflow:ellipsis}.directory__card__bar .display-name span{display:block;font-size:14px;color:#282c37;font-weight:400;overflow:hidden;text-overflow:ellipsis}.directory__card__extra{background:#d9e1e8;display:flex;align-items:center;justify-content:center}.directory__card__extra .accounts-table__count{width:33.33%;flex:0 0 auto;padding:15px 0}.directory__card__extra .account__header__content{box-sizing:border-box;padding:15px 10px;border-bottom:1px solid #c0cdd9;width:100%;min-height:48px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.directory__card__extra .account__header__content p{display:none}.directory__card__extra .account__header__content p:first-child{display:inline}.directory__card__extra .account__header__content br{display:none}.filter-form{background:#d9e1e8}.filter-form__column{padding:10px 15px}.filter-form .radio-button{display:block}.radio-button{font-size:14px;position:relative;display:inline-block;padding:6px 0;line-height:18px;cursor:default;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer}.radio-button input[type=radio],.radio-button input[type=checkbox]{display:none}.radio-button__input{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:50%;vertical-align:middle}.radio-button__input.checked{border-color:#217aba;background:#217aba}.search{position:relative}.search__input{outline:0;box-sizing:border-box;width:100%;border:none;box-shadow:none;font-family:inherit;background:#d9e1e8;color:#282c37;font-size:14px;margin:0;display:block;padding:15px;padding-right:30px;line-height:18px;font-size:16px}.search__input::placeholder{color:#1f232b}.search__input::-moz-focus-inner{border:0}.search__input::-moz-focus-inner,.search__input:focus,.search__input:active{outline:0 !important}.search__input:focus{background:#ccd7e0}@media screen and (max-width: 600px){.search__input{font-size:16px}}.search__icon::-moz-focus-inner{border:0}.search__icon::-moz-focus-inner,.search__icon:focus{outline:0 !important}.search__icon .fa{position:absolute;top:16px;right:10px;z-index:2;display:inline-block;opacity:0;transition:all 100ms linear;transition-property:color,transform,opacity;font-size:18px;width:18px;height:18px;color:#282c37;cursor:default;pointer-events:none}.search__icon .fa.active{pointer-events:auto;opacity:.3}.search__icon .fa-search{transform:rotate(0deg)}.search__icon .fa-search.active{pointer-events:auto;opacity:.3}.search__icon .fa-times-circle{top:17px;transform:rotate(0deg);color:#606984;cursor:pointer}.search__icon .fa-times-circle.active{transform:rotate(90deg)}.search__icon .fa-times-circle:hover{color:#51596f}.search-results__header{color:#444b5d;background:#d3dce4;border-bottom:1px solid #e6ebf0;padding:15px 10px;font-size:14px;font-weight:500}.search-results__info{padding:20px;color:#282c37;text-align:center}.trends__header{color:#444b5d;background:#d3dce4;border-bottom:1px solid #e6ebf0;font-weight:500;padding:15px;font-size:16px;cursor:default}.trends__header .fa{display:inline-block;margin-right:5px}.trends__item{display:flex;align-items:center;padding:15px;border-bottom:1px solid #c0cdd9}.trends__item:last-child{border-bottom:0}.trends__item__name{flex:1 1 auto;color:#444b5d;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trends__item__name strong{font-weight:500}.trends__item__name a{color:#282c37;text-decoration:none;font-size:14px;font-weight:500;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trends__item__name a:hover span,.trends__item__name a:focus span,.trends__item__name a:active span{text-decoration:underline}.trends__item__current{flex:0 0 auto;font-size:24px;line-height:36px;font-weight:500;text-align:right;padding-right:15px;margin-left:5px;color:#282c37}.trends__item__sparkline{flex:0 0 auto;width:50px}.trends__item__sparkline path:first-child{fill:rgba(43,144,217,.25) !important;fill-opacity:1 !important}.trends__item__sparkline path:last-child{stroke:#2380c3 !important}.emojione{font-size:inherit;vertical-align:middle;object-fit:contain;margin:-0.2ex .15em .2ex;width:16px;height:16px}.emojione img{width:auto}.emoji-picker-dropdown__menu{background:#fff;position:absolute;box-shadow:4px 4px 6px rgba(0,0,0,.4);border-radius:4px;margin-top:5px;z-index:2}.emoji-picker-dropdown__menu .emoji-mart-scroll{transition:opacity 200ms ease}.emoji-picker-dropdown__menu.selecting .emoji-mart-scroll{opacity:.5}.emoji-picker-dropdown__modifiers{position:absolute;top:60px;right:11px;cursor:pointer}.emoji-picker-dropdown__modifiers__menu{position:absolute;z-index:4;top:-4px;left:-8px;background:#fff;border-radius:4px;box-shadow:1px 2px 6px rgba(0,0,0,.2);overflow:hidden}.emoji-picker-dropdown__modifiers__menu button{display:block;cursor:pointer;border:0;padding:4px 8px;background:transparent}.emoji-picker-dropdown__modifiers__menu button:hover,.emoji-picker-dropdown__modifiers__menu button:focus,.emoji-picker-dropdown__modifiers__menu button:active{background:rgba(40,44,55,.4)}.emoji-picker-dropdown__modifiers__menu .emoji-mart-emoji{height:22px}.emoji-mart-emoji span{background-repeat:no-repeat}.emoji-button{display:block;font-size:24px;line-height:24px;margin-left:2px;width:24px;outline:0;cursor:pointer}.emoji-button:active,.emoji-button:focus{outline:0 !important}.emoji-button img{filter:grayscale(100%);opacity:.8;display:block;margin:0;width:22px;height:22px;margin-top:2px}.emoji-button:hover img,.emoji-button:active img,.emoji-button:focus img{opacity:1;filter:none}.doodle-modal{width:unset}.doodle-modal__container{background:#d9e1e8;text-align:center;line-height:0}.doodle-modal__container canvas{border:5px solid #d9e1e8}.doodle-modal__action-bar .filler{flex-grow:1;margin:0;padding:0}.doodle-modal__action-bar .doodle-toolbar{line-height:1;display:flex;flex-direction:column;flex-grow:0;justify-content:space-around}.doodle-modal__action-bar .doodle-toolbar.with-inputs label{display:inline-block;width:70px;text-align:right;margin-right:2px}.doodle-modal__action-bar .doodle-toolbar.with-inputs input[type=number],.doodle-modal__action-bar .doodle-toolbar.with-inputs input[type=text]{width:40px}.doodle-modal__action-bar .doodle-toolbar.with-inputs span.val{display:inline-block;text-align:left;width:50px}.doodle-modal__action-bar .doodle-palette{padding-right:0 !important;border:1px solid #000;line-height:.2rem;flex-grow:0;background:#fff}.doodle-modal__action-bar .doodle-palette button{appearance:none;width:1rem;height:1rem;margin:0;padding:0;text-align:center;color:#000;text-shadow:0 0 1px #fff;cursor:pointer;box-shadow:inset 0 0 1px rgba(255,255,255,.5);border:1px solid #000;outline-offset:-1px}.doodle-modal__action-bar .doodle-palette button.foreground{outline:1px dashed #fff}.doodle-modal__action-bar .doodle-palette button.background{outline:1px dashed red}.doodle-modal__action-bar .doodle-palette button.foreground.background{outline:1px dashed red;border-color:#fff}.drawer{width:300px;box-sizing:border-box;display:flex;flex-direction:column;overflow-y:hidden;padding:10px 5px;flex:none}.drawer:first-child{padding-left:10px}.drawer:last-child{padding-right:10px}@media screen and (max-width: 630px){.auto-columns .drawer{flex:auto}}.single-column .drawer{flex:auto}@media screen and (max-width: 630px){.auto-columns .drawer,.auto-columns .drawer:first-child,.auto-columns .drawer:last-child,.single-column .drawer,.single-column .drawer:first-child,.single-column .drawer:last-child{padding:0}}.wide .drawer{min-width:300px;max-width:400px;flex:1 1 200px}@media screen and (max-width: 630px){:root .auto-columns .drawer{flex:auto;width:100%;min-width:0;max-width:none;padding:0}}:root .single-column .drawer{flex:auto;width:100%;min-width:0;max-width:none;padding:0}.react-swipeable-view-container .drawer{height:100%}.drawer--header{display:flex;flex-direction:row;margin-bottom:10px;flex:none;background:#c0cdd9;font-size:16px}.drawer--header>*{display:block;box-sizing:border-box;border-bottom:2px solid transparent;padding:15px 5px 13px;height:48px;flex:1 1 auto;color:#282c37;text-align:center;text-decoration:none;cursor:pointer}.drawer--header a{transition:background 100ms ease-in}.drawer--header a:focus,.drawer--header a:hover{outline:none;background:#cfd9e2;transition:background 200ms ease-out}.search{position:relative;margin-bottom:10px;flex:none}@media screen and (max-width: 415px){.auto-columns .search,.single-column .search{margin-bottom:0}}@media screen and (max-width: 630px){.auto-columns .search{font-size:16px}}.single-column .search{font-size:16px}.search-popout{background:#fff;border-radius:4px;padding:10px 14px;padding-bottom:14px;margin-top:10px;color:#444b5d;box-shadow:2px 4px 15px rgba(0,0,0,.4)}.search-popout h4{text-transform:uppercase;color:#444b5d;font-size:13px;font-weight:500;margin-bottom:10px}.search-popout li{padding:4px 0}.search-popout ul{margin-bottom:10px}.search-popout em{font-weight:500;color:#000}.drawer--account{padding:10px;color:#282c37;display:flex;align-items:center}.drawer--account a{color:inherit;text-decoration:none}.drawer--account .acct{display:block;color:#282c37;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.navigation-bar__profile{flex:1 1 auto;margin-left:8px;overflow:hidden}.drawer--results{background:#d9e1e8;overflow-x:hidden;overflow-y:auto}.drawer--results>header{color:#444b5d;background:#d3dce4;padding:15px;font-weight:500;font-size:16px;cursor:default}.drawer--results>header .fa{display:inline-block;margin-right:5px}.drawer--results>section{margin-bottom:5px}.drawer--results>section h5{background:#e6ebf0;border-bottom:1px solid #c0cdd9;cursor:default;display:flex;padding:15px;font-weight:500;font-size:16px;color:#444b5d}.drawer--results>section h5 .fa{display:inline-block;margin-right:5px}.drawer--results>section .account:last-child,.drawer--results>section>div:last-child .status{border-bottom:0}.drawer--results>section>.hashtag{display:block;padding:10px;color:#282c37;text-decoration:none}.drawer--results>section>.hashtag:hover,.drawer--results>section>.hashtag:active,.drawer--results>section>.hashtag:focus{color:#1f232b;text-decoration:underline}.drawer__pager{box-sizing:border-box;padding:0;flex-grow:1;position:relative;overflow:hidden;display:flex}.drawer__inner{position:absolute;top:0;left:0;background:#b0c0cf;box-sizing:border-box;padding:0;display:flex;flex-direction:column;overflow:hidden;overflow-y:auto;width:100%;height:100%}.drawer__inner.darker{background:#d9e1e8}.drawer__inner__mastodon{background:#b0c0cf url('data:image/svg+xml;utf8,') no-repeat bottom/100% auto;flex:1;min-height:47px;display:none}.drawer__inner__mastodon>img{display:block;object-fit:contain;object-position:bottom left;width:100%;height:100%;pointer-events:none;user-drag:none;user-select:none}.drawer__inner__mastodon>.mastodon{display:block;width:100%;height:100%;border:none;cursor:inherit}@media screen and (min-height: 640px){.drawer__inner__mastodon{display:block}}.pseudo-drawer{background:#b0c0cf;font-size:13px;text-align:left}.drawer__backdrop{cursor:pointer;position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(255,255,255,.5)}.video-error-cover{align-items:center;background:#fff;color:#000;cursor:pointer;display:flex;flex-direction:column;height:100%;justify-content:center;margin-top:8px;position:relative;text-align:center;z-index:100}.media-spoiler{background:#fff;color:#282c37;border:0;width:100%;height:100%}.media-spoiler:hover,.media-spoiler:active,.media-spoiler:focus{color:#17191f}.status__content>.media-spoiler{margin-top:15px}.media-spoiler.full-width{margin-left:-14px;margin-right:-14px;width:inherit;max-width:none;height:250px;border-radius:0px}.media-spoiler__warning{display:block;font-size:14px}.media-spoiler__trigger{display:block;font-size:11px;font-weight:500}.media-gallery__gifv__label{display:block;position:absolute;color:#000;background:rgba(255,255,255,.5);bottom:6px;left:6px;padding:2px 6px;border-radius:2px;font-size:11px;font-weight:600;z-index:1;pointer-events:none;opacity:.9;transition:opacity .1s ease;line-height:18px}.media-gallery__gifv.autoplay .media-gallery__gifv__label{display:none}.media-gallery__gifv:hover .media-gallery__gifv__label{opacity:1}.media-gallery__audio{height:100%;display:flex;flex-direction:column}.media-gallery__audio span{text-align:center;color:#282c37;display:flex;height:100%;align-items:center}.media-gallery__audio span p{width:100%}.media-gallery__audio audio{width:100%}.media-gallery{box-sizing:border-box;margin-top:8px;overflow:hidden;border-radius:4px;position:relative;width:100%;height:110px}.media-gallery.full-width{margin-left:-14px;margin-right:-14px;width:inherit;max-width:none;height:250px;border-radius:0px}.media-gallery__item{border:none;box-sizing:border-box;display:block;float:left;position:relative;border-radius:4px;overflow:hidden}.full-width .media-gallery__item{border-radius:0}.media-gallery__item.standalone .media-gallery__item-gifv-thumbnail{transform:none;top:0}.media-gallery__item.letterbox{background:#000}.media-gallery__item-thumbnail{cursor:zoom-in;display:block;text-decoration:none;color:#282c37;position:relative;z-index:1}.media-gallery__item-thumbnail,.media-gallery__item-thumbnail img{height:100%;width:100%;object-fit:contain}.media-gallery__item-thumbnail:not(.letterbox),.media-gallery__item-thumbnail img:not(.letterbox){height:100%;object-fit:cover}.media-gallery__preview{width:100%;height:100%;object-fit:cover;position:absolute;top:0;left:0;z-index:0;background:#fff}.media-gallery__preview--hidden{display:none}.media-gallery__gifv{height:100%;overflow:hidden;position:relative;width:100%;display:flex;justify-content:center}.media-gallery__item-gifv-thumbnail{cursor:zoom-in;height:100%;width:100%;position:relative;z-index:1;object-fit:contain;user-select:none}.media-gallery__item-gifv-thumbnail:not(.letterbox){height:100%;object-fit:cover}.media-gallery__item-thumbnail-label{clip:rect(1px 1px 1px 1px);clip:rect(1px, 1px, 1px, 1px);overflow:hidden;position:absolute}.video-modal__container{max-width:100vw;max-height:100vh}.audio-modal__container{width:50vw}.media-modal{width:100%;height:100%;position:relative}.media-modal .extended-video-player{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.media-modal .extended-video-player video{max-width:100%;max-height:80%}.media-modal__closer{position:absolute;top:0;left:0;right:0;bottom:0}.media-modal__navigation{position:absolute;top:0;left:0;right:0;bottom:0;pointer-events:none;transition:opacity .3s linear;will-change:opacity}.media-modal__navigation *{pointer-events:auto}.media-modal__navigation.media-modal__navigation--hidden{opacity:0}.media-modal__navigation.media-modal__navigation--hidden *{pointer-events:none}.media-modal__nav{background:rgba(255,255,255,.5);box-sizing:border-box;border:0;color:#000;cursor:pointer;display:flex;align-items:center;font-size:24px;height:20vmax;margin:auto 0;padding:30px 15px;position:absolute;top:0;bottom:0}.media-modal__nav--left{left:0}.media-modal__nav--right{right:0}.media-modal__pagination{width:100%;text-align:center;position:absolute;left:0;bottom:20px;pointer-events:none}.media-modal__meta{text-align:center;position:absolute;left:0;bottom:20px;width:100%;pointer-events:none}.media-modal__meta--shifted{bottom:62px}.media-modal__meta a{pointer-events:auto;text-decoration:none;font-weight:500;color:#282c37}.media-modal__meta a:hover,.media-modal__meta a:focus,.media-modal__meta a:active{text-decoration:underline}.media-modal__page-dot{display:inline-block}.media-modal__button{background-color:#fff;height:12px;width:12px;border-radius:6px;margin:10px;padding:0;border:0;font-size:0}.media-modal__button--active{background-color:#2b90d9}.media-modal__close{position:absolute;right:8px;top:8px;z-index:100}.detailed .video-player__volume__current,.detailed .video-player__volume::before,.fullscreen .video-player__volume__current,.fullscreen .video-player__volume::before{bottom:27px}.detailed .video-player__volume__handle,.fullscreen .video-player__volume__handle{bottom:23px}.audio-player{box-sizing:border-box;position:relative;background:#f2f5f7;border-radius:4px;padding-bottom:44px;direction:ltr}.audio-player.editable{border-radius:0;height:100%}.audio-player__waveform{padding:15px 0;position:relative;overflow:hidden}.audio-player__waveform::before{content:\"\";display:block;position:absolute;border-top:1px solid #ccd7e0;width:100%;height:0;left:0;top:calc(50% + 1px)}.audio-player__progress-placeholder{background-color:rgba(33,122,186,.5)}.audio-player__wave-placeholder{background-color:#a6b9c9}.audio-player .video-player__controls{padding:0 15px;padding-top:10px;background:#f2f5f7;border-top:1px solid #ccd7e0;border-radius:0 0 4px 4px}.video-player{overflow:hidden;position:relative;background:#000;max-width:100%;border-radius:4px;box-sizing:border-box;direction:ltr}.video-player.editable{border-radius:0;height:100% !important}.video-player:focus{outline:0}.detailed-status .video-player{width:100%;height:100%}.video-player.full-width{margin-left:-14px;margin-right:-14px;width:inherit;max-width:none;height:250px;border-radius:0px}.video-player video{max-width:100vw;max-height:80vh;z-index:1;position:relative}.video-player.fullscreen{width:100% !important;height:100% !important;margin:0}.video-player.fullscreen video{max-width:100% !important;max-height:100% !important;width:100% !important;height:100% !important;outline:0}.video-player.inline video{object-fit:contain;position:relative;top:50%;transform:translateY(-50%)}.video-player__controls{position:absolute;z-index:2;bottom:0;left:0;right:0;box-sizing:border-box;background:linear-gradient(0deg, rgba(0, 0, 0, 0.85) 0, rgba(0, 0, 0, 0.45) 60%, transparent);padding:0 15px;opacity:0;transition:opacity .1s ease}.video-player__controls.active{opacity:1}.video-player.inactive video,.video-player.inactive .video-player__controls{visibility:hidden}.video-player__spoiler{display:none;position:absolute;top:0;left:0;width:100%;height:100%;z-index:4;border:0;background:#000;color:#282c37;transition:none;pointer-events:none}.video-player__spoiler.active{display:block;pointer-events:auto}.video-player__spoiler.active:hover,.video-player__spoiler.active:active,.video-player__spoiler.active:focus{color:#191b22}.video-player__spoiler__title{display:block;font-size:14px}.video-player__spoiler__subtitle{display:block;font-size:11px;font-weight:500}.video-player__buttons-bar{display:flex;justify-content:space-between;padding-bottom:10px}.video-player__buttons-bar .video-player__download__icon{color:inherit}.video-player__buttons-bar .video-player__download__icon .fa,.video-player__buttons-bar .video-player__download__icon:active .fa,.video-player__buttons-bar .video-player__download__icon:hover .fa,.video-player__buttons-bar .video-player__download__icon:focus .fa{color:inherit}.video-player__buttons{font-size:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.video-player__buttons.left button{padding-left:0}.video-player__buttons.right button{padding-right:0}.video-player__buttons button{background:transparent;padding:2px 10px;font-size:16px;border:0;color:rgba(255,255,255,.75)}.video-player__buttons button:active,.video-player__buttons button:hover,.video-player__buttons button:focus{color:#fff}.video-player__time-sep,.video-player__time-total,.video-player__time-current{font-size:14px;font-weight:500}.video-player__time-current{color:#fff;margin-left:60px}.video-player__time-sep{display:inline-block;margin:0 6px}.video-player__time-sep,.video-player__time-total{color:#fff}.video-player__volume{cursor:pointer;height:24px;display:inline}.video-player__volume::before{content:\"\";width:50px;background:rgba(255,255,255,.35);border-radius:4px;display:block;position:absolute;height:4px;left:70px;bottom:20px}.video-player__volume__current{display:block;position:absolute;height:4px;border-radius:4px;left:70px;bottom:20px;background:#217aba}.video-player__volume__handle{position:absolute;z-index:3;border-radius:50%;width:12px;height:12px;bottom:16px;left:70px;transition:opacity .1s ease;background:#217aba;box-shadow:1px 2px 6px rgba(0,0,0,.2);pointer-events:none}.video-player__link{padding:2px 10px}.video-player__link a{text-decoration:none;font-size:14px;font-weight:500;color:#fff}.video-player__link a:hover,.video-player__link a:active,.video-player__link a:focus{text-decoration:underline}.video-player__seek{cursor:pointer;height:24px;position:relative}.video-player__seek::before{content:\"\";width:100%;background:rgba(255,255,255,.35);border-radius:4px;display:block;position:absolute;height:4px;top:10px}.video-player__seek__progress,.video-player__seek__buffer{display:block;position:absolute;height:4px;border-radius:4px;top:10px;background:#217aba}.video-player__seek__buffer{background:rgba(255,255,255,.2)}.video-player__seek__handle{position:absolute;z-index:3;opacity:0;border-radius:50%;width:12px;height:12px;top:6px;margin-left:-6px;transition:opacity .1s ease;background:#217aba;box-shadow:1px 2px 6px rgba(0,0,0,.2);pointer-events:none}.video-player__seek__handle.active{opacity:1}.video-player__seek:hover .video-player__seek__handle{opacity:1}.video-player.detailed .video-player__buttons button,.video-player.fullscreen .video-player__buttons button{padding-top:10px;padding-bottom:10px}.sensitive-info{display:flex;flex-direction:row;align-items:center;position:absolute;top:4px;left:4px;z-index:100}.sensitive-marker{margin:0 3px;border-radius:2px;padding:2px 6px;color:rgba(0,0,0,.8);background:rgba(255,255,255,.5);font-size:12px;line-height:18px;text-transform:uppercase;opacity:.9;transition:opacity .1s ease}.media-gallery:hover .sensitive-marker{opacity:1}.list-editor{background:#d9e1e8;flex-direction:column;border-radius:8px;box-shadow:2px 4px 15px rgba(0,0,0,.4);width:380px;overflow:hidden}@media screen and (max-width: 420px){.list-editor{width:90%}}.list-editor h4{padding:15px 0;background:#b0c0cf;font-weight:500;font-size:16px;text-align:center;border-radius:8px 8px 0 0}.list-editor .drawer__pager{height:50vh}.list-editor .drawer__inner{border-radius:0 0 8px 8px}.list-editor .drawer__inner.backdrop{width:calc(100% - 60px);box-shadow:2px 4px 15px rgba(0,0,0,.4);border-radius:0 0 0 8px}.list-editor__accounts{overflow-y:auto}.list-editor .account__display-name:hover strong{text-decoration:none}.list-editor .account__avatar{cursor:default}.list-editor .search{margin-bottom:0}.list-adder{background:#d9e1e8;flex-direction:column;border-radius:8px;box-shadow:2px 4px 15px rgba(0,0,0,.4);width:380px;overflow:hidden}@media screen and (max-width: 420px){.list-adder{width:90%}}.list-adder__account{background:#b0c0cf}.list-adder__lists{background:#b0c0cf;height:50vh;border-radius:0 0 8px 8px;overflow-y:auto}.list-adder .list{padding:10px;border-bottom:1px solid #c0cdd9}.list-adder .list__wrapper{display:flex}.list-adder .list__display-name{flex:1 1 auto;overflow:hidden;text-decoration:none;font-size:16px;padding:10px}.emoji-mart{font-size:13px;display:inline-block;color:#000}.emoji-mart,.emoji-mart *{box-sizing:border-box;line-height:1.15}.emoji-mart .emoji-mart-emoji{padding:6px}.emoji-mart-bar{border:0 solid #393f4f}.emoji-mart-bar:first-child{border-bottom-width:1px;border-top-left-radius:5px;border-top-right-radius:5px;background:#282c37}.emoji-mart-bar:last-child{border-top-width:1px;border-bottom-left-radius:5px;border-bottom-right-radius:5px;display:none}.emoji-mart-anchors{display:flex;justify-content:space-between;padding:0 6px;color:#282c37;line-height:0}.emoji-mart-anchor{position:relative;flex:1;text-align:center;padding:12px 4px;overflow:hidden;transition:color .1s ease-out;cursor:pointer}.emoji-mart-anchor:hover{color:#313543}.emoji-mart-anchor-selected{color:#2b90d9}.emoji-mart-anchor-selected:hover{color:#3c99dc}.emoji-mart-anchor-selected .emoji-mart-anchor-bar{bottom:0}.emoji-mart-anchor-bar{position:absolute;bottom:-3px;left:0;width:100%;height:3px;background-color:#3897db}.emoji-mart-anchors i{display:inline-block;width:100%;max-width:22px}.emoji-mart-anchors svg{fill:currentColor;max-height:18px}.emoji-mart-scroll{overflow-y:scroll;height:270px;max-height:35vh;padding:0 6px 6px;background:#fff;will-change:transform}.emoji-mart-scroll::-webkit-scrollbar-track:hover,.emoji-mart-scroll::-webkit-scrollbar-track:active{background-color:rgba(255,255,255,.3)}.emoji-mart-search{padding:10px;padding-right:45px;background:#fff}.emoji-mart-search input{font-size:14px;font-weight:400;padding:7px 9px;font-family:inherit;display:block;width:100%;background:rgba(40,44,55,.3);color:#000;border:1px solid #282c37;border-radius:4px}.emoji-mart-search input::-moz-focus-inner{border:0}.emoji-mart-search input::-moz-focus-inner,.emoji-mart-search input:focus,.emoji-mart-search input:active{outline:0 !important}.emoji-mart-category .emoji-mart-emoji{cursor:pointer}.emoji-mart-category .emoji-mart-emoji span{z-index:1;position:relative;text-align:center}.emoji-mart-category .emoji-mart-emoji:hover::before{z-index:0;content:\"\";position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(40,44,55,.7);border-radius:100%}.emoji-mart-category-label{z-index:2;position:relative;position:-webkit-sticky;position:sticky;top:0}.emoji-mart-category-label span{display:block;width:100%;font-weight:500;padding:5px 6px;background:#fff}.emoji-mart-emoji{position:relative;display:inline-block;font-size:0}.emoji-mart-emoji span{width:22px;height:22px}.emoji-mart-no-results{font-size:14px;text-align:center;padding-top:70px;color:#444b5d}.emoji-mart-no-results .emoji-mart-category-label{display:none}.emoji-mart-no-results .emoji-mart-no-results-label{margin-top:.2em}.emoji-mart-no-results .emoji-mart-emoji:hover::before{content:none}.emoji-mart-preview{display:none}.glitch.local-settings{position:relative;display:flex;flex-direction:row;background:#282c37;color:#000;border-radius:8px;height:80vh;width:80vw;max-width:740px;max-height:450px;overflow:hidden}.glitch.local-settings label,.glitch.local-settings legend{display:block;font-size:14px}.glitch.local-settings .boolean label,.glitch.local-settings .radio_buttons label{position:relative;padding-left:28px;padding-top:3px}.glitch.local-settings .boolean label input,.glitch.local-settings .radio_buttons label input{position:absolute;left:0;top:0}.glitch.local-settings span.hint{display:block;color:#282c37}.glitch.local-settings h1{font-size:18px;font-weight:500;line-height:24px;margin-bottom:20px}.glitch.local-settings h2{font-size:15px;font-weight:500;line-height:20px;margin-top:20px;margin-bottom:10px}.glitch.local-settings__navigation__item{display:block;padding:15px 20px;color:inherit;background:#17191f;border-bottom:1px #282c37 solid;cursor:pointer;text-decoration:none;outline:none;transition:background .3s}.glitch.local-settings__navigation__item .text-icon-button{color:inherit;transition:unset}.glitch.local-settings__navigation__item:hover{background:#282c37}.glitch.local-settings__navigation__item.active{background:#2b90d9;color:#000}.glitch.local-settings__navigation__item.close,.glitch.local-settings__navigation__item.close:hover{background:#df405a;color:#000}.glitch.local-settings__navigation{background:#17191f;width:212px;font-size:15px;line-height:20px;overflow-y:auto}.glitch.local-settings__page{display:block;flex:auto;padding:15px 20px 15px 20px;width:360px;overflow-y:auto}.glitch.local-settings__page__item{margin-bottom:2px}.glitch.local-settings__page__item.string,.glitch.local-settings__page__item.radio_buttons{margin-top:10px;margin-bottom:10px}@media screen and (max-width: 630px){.glitch.local-settings__navigation{width:40px;flex-shrink:0}.glitch.local-settings__navigation__item{padding:10px}.glitch.local-settings__navigation__item span:last-of-type{display:none}}.error-boundary{color:#000;font-size:15px;line-height:20px}.error-boundary h1{font-size:26px;line-height:36px;font-weight:400;margin-bottom:8px}.error-boundary a{color:#000;text-decoration:underline}.error-boundary ul{list-style:disc;margin-left:0;padding-left:1em}.error-boundary textarea.web_app_crash-stacktrace{width:100%;resize:none;white-space:pre;font-family:monospace,monospace}.compose-panel{width:285px;margin-top:10px;display:flex;flex-direction:column;height:calc(100% - 10px);overflow-y:hidden}.compose-panel .search__input{line-height:18px;font-size:16px;padding:15px;padding-right:30px}.compose-panel .search__icon .fa{top:15px}.compose-panel .drawer--account{flex:0 1 48px}.compose-panel .flex-spacer{background:transparent}.compose-panel .composer{flex:1;overflow-y:hidden;display:flex;flex-direction:column;min-height:310px}.compose-panel .compose-form__autosuggest-wrapper{overflow-y:auto;background-color:#fff;border-radius:4px 4px 0 0;flex:0 1 auto}.compose-panel .autosuggest-textarea__textarea{overflow-y:hidden}.compose-panel .compose-form__upload-thumbnail{height:80px}.navigation-panel{margin-top:10px;margin-bottom:10px;height:calc(100% - 20px);overflow-y:auto;display:flex;flex-direction:column}.navigation-panel>a{flex:0 0 auto}.navigation-panel hr{flex:0 0 auto;border:0;background:transparent;border-top:1px solid #ccd7e0;margin:10px 0}.navigation-panel .flex-spacer{background:transparent}@media screen and (min-width: 600px){.tabs-bar__link span{display:inline}}.columns-area--mobile{flex-direction:column;width:100%;margin:0 auto}.columns-area--mobile .column,.columns-area--mobile .drawer{width:100%;height:100%;padding:0}.columns-area--mobile .directory__list{display:grid;grid-gap:10px;grid-template-columns:minmax(0, 50%) minmax(0, 50%)}@media screen and (max-width: 415px){.columns-area--mobile .directory__list{display:block}}.columns-area--mobile .directory__card{margin-bottom:0}.columns-area--mobile .filter-form{display:flex}.columns-area--mobile .autosuggest-textarea__textarea{font-size:16px}.columns-area--mobile .search__input{line-height:18px;font-size:16px;padding:15px;padding-right:30px}.columns-area--mobile .search__icon .fa{top:15px}.columns-area--mobile .scrollable{overflow:visible}@supports(display: grid){.columns-area--mobile .scrollable{contain:content}}@media screen and (min-width: 415px){.columns-area--mobile{padding:10px 0;padding-top:0}}@media screen and (min-width: 630px){.columns-area--mobile .detailed-status{padding:15px}.columns-area--mobile .detailed-status .media-gallery,.columns-area--mobile .detailed-status .video-player,.columns-area--mobile .detailed-status .audio-player{margin-top:15px}.columns-area--mobile .account__header__bar{padding:5px 10px}.columns-area--mobile .navigation-bar,.columns-area--mobile .compose-form{padding:15px}.columns-area--mobile .compose-form .compose-form__publish .compose-form__publish-button-wrapper{padding-top:15px}.columns-area--mobile .status{padding:15px;min-height:50px}.columns-area--mobile .status .media-gallery,.columns-area--mobile .status__action-bar,.columns-area--mobile .status .video-player,.columns-area--mobile .status .audio-player{margin-top:10px}.columns-area--mobile .account{padding:15px 10px}.columns-area--mobile .account__header__bio{margin:0 -10px}.columns-area--mobile .notification__message{padding-top:15px}.columns-area--mobile .notification .status{padding-top:8px}.columns-area--mobile .notification .account{padding-top:8px}}.floating-action-button{position:fixed;display:flex;justify-content:center;align-items:center;width:3.9375rem;height:3.9375rem;bottom:1.3125rem;right:1.3125rem;background:#3897db;color:#fff;border-radius:50%;font-size:21px;line-height:21px;text-decoration:none;box-shadow:2px 3px 9px rgba(0,0,0,.4)}.floating-action-button:hover,.floating-action-button:focus,.floating-action-button:active{background:#227dbe}@media screen and (min-width: 415px){.tabs-bar{width:100%}.react-swipeable-view-container .columns-area--mobile{height:calc(100% - 10px) !important}.getting-started__wrapper,.search{margin-bottom:10px}}@media screen and (max-width: 895px){.columns-area__panels__pane--compositional{display:none}}@media screen and (min-width: 895px){.floating-action-button,.tabs-bar__link.optional{display:none}.search-page .search{display:none}}@media screen and (max-width: 1190px){.columns-area__panels__pane--navigational{display:none}}@media screen and (min-width: 1190px){.tabs-bar{display:none}}.poll{margin-top:16px;font-size:14px}.poll ul,.e-content .poll ul{margin:0;list-style:none}.poll li{margin-bottom:10px;position:relative}.poll__chart{position:absolute;top:0;left:0;height:100%;display:inline-block;border-radius:4px;background:#c9d3e1}.poll__chart.leading{background:#2b90d9}.poll__text{position:relative;display:flex;padding:6px 0;line-height:18px;cursor:default;overflow:hidden}.poll__text input[type=radio],.poll__text input[type=checkbox]{display:none}.poll__text .autossugest-input{flex:1 1 auto}.poll__text input[type=text]{display:block;box-sizing:border-box;width:100%;font-size:14px;color:#000;display:block;outline:0;font-family:inherit;background:#fff;border:1px solid #fff;border-radius:4px;padding:6px 10px}.poll__text input[type=text]:focus{border-color:#2b90d9}.poll__text.selectable{cursor:pointer}.poll__text.editable{display:flex;align-items:center;overflow:visible}.poll__input{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:50%;vertical-align:middle;margin-top:auto;margin-bottom:auto;flex:0 0 18px}.poll__input.checkbox{border-radius:4px}.poll__input.active{border-color:#79bd9a;background:#79bd9a}.poll__input:active,.poll__input:focus,.poll__input:hover{border-width:4px;background:none}.poll__input::-moz-focus-inner{outline:0 !important;border:0}.poll__input:focus,.poll__input:active{outline:0 !important}.poll__number{display:inline-block;width:52px;font-weight:700;padding:0 10px;padding-left:8px;text-align:right;margin-top:auto;margin-bottom:auto;flex:0 0 52px}.poll__vote__mark{float:left;line-height:18px}.poll__footer{padding-top:6px;padding-bottom:5px;color:#444b5d}.poll__link{display:inline;background:transparent;padding:0;margin:0;border:0;color:#444b5d;text-decoration:underline;font-size:inherit}.poll__link:hover{text-decoration:none}.poll__link:active,.poll__link:focus{background-color:rgba(68,75,93,.1)}.poll .button{height:36px;padding:0 16px;margin-right:10px;font-size:14px}.compose-form__poll-wrapper{border-top:1px solid #fff}.compose-form__poll-wrapper ul{padding:10px}.compose-form__poll-wrapper .poll__footer{border-top:1px solid #fff;padding:10px;display:flex;align-items:center}.compose-form__poll-wrapper .poll__footer button,.compose-form__poll-wrapper .poll__footer select{width:100%;flex:1 1 50%}.compose-form__poll-wrapper .poll__footer button:focus,.compose-form__poll-wrapper .poll__footer select:focus{border-color:#2b90d9}.compose-form__poll-wrapper .button.button-secondary{font-size:14px;font-weight:400;padding:6px 10px;height:auto;line-height:inherit;color:#606984;border-color:#606984;margin-right:5px}.compose-form__poll-wrapper li{display:flex;align-items:center}.compose-form__poll-wrapper li .poll__text{flex:0 0 auto;width:calc(100% - (23px + 6px));margin-right:6px}.compose-form__poll-wrapper select{appearance:none;box-sizing:border-box;font-size:14px;color:#000;display:inline-block;width:auto;outline:0;font-family:inherit;background:#fff url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center/auto 16px;border:1px solid #fff;border-radius:4px;padding:6px 10px;padding-right:30px}.compose-form__poll-wrapper .icon-button.disabled{color:#fff}.muted .poll{color:#444b5d}.muted .poll__chart{background:rgba(201,211,225,.2)}.muted .poll__chart.leading{background:rgba(43,144,217,.2)}.container{box-sizing:border-box;max-width:1235px;margin:0 auto;position:relative}@media screen and (max-width: 1255px){.container{width:100%;padding:0 10px}}.rich-formatting{font-family:sans-serif,sans-serif;font-size:14px;font-weight:400;line-height:1.7;word-wrap:break-word;color:#282c37}.rich-formatting a{color:#2b90d9;text-decoration:underline}.rich-formatting a:hover,.rich-formatting a:focus,.rich-formatting a:active{text-decoration:none}.rich-formatting p,.rich-formatting li{color:#282c37}.rich-formatting p{margin-top:0;margin-bottom:.85em}.rich-formatting p:last-child{margin-bottom:0}.rich-formatting strong{font-weight:700;color:#282c37}.rich-formatting em{font-style:italic;color:#282c37}.rich-formatting code{font-size:.85em;background:#f2f5f7;border-radius:4px;padding:.2em .3em}.rich-formatting h1,.rich-formatting h2,.rich-formatting h3,.rich-formatting h4,.rich-formatting h5,.rich-formatting h6{font-family:sans-serif,sans-serif;margin-top:1.275em;margin-bottom:.85em;font-weight:500;color:#282c37}.rich-formatting h1{font-size:2em}.rich-formatting h2{font-size:1.75em}.rich-formatting h3{font-size:1.5em}.rich-formatting h4{font-size:1.25em}.rich-formatting h5,.rich-formatting h6{font-size:1em}.rich-formatting ul{list-style:disc}.rich-formatting ol{list-style:decimal}.rich-formatting ul,.rich-formatting ol{margin:0;padding:0;padding-left:2em;margin-bottom:.85em}.rich-formatting ul[type=a],.rich-formatting ol[type=a]{list-style-type:lower-alpha}.rich-formatting ul[type=i],.rich-formatting ol[type=i]{list-style-type:lower-roman}.rich-formatting hr{width:100%;height:0;border:0;border-bottom:1px solid #ccd7e0;margin:1.7em 0}.rich-formatting hr.spacer{height:1px;border:0}.rich-formatting table{width:100%;border-collapse:collapse;break-inside:auto;margin-top:24px;margin-bottom:32px}.rich-formatting table thead tr,.rich-formatting table tbody tr{border-bottom:1px solid #ccd7e0;font-size:1em;line-height:1.625;font-weight:400;text-align:left;color:#282c37}.rich-formatting table thead tr{border-bottom-width:2px;line-height:1.5;font-weight:500;color:#444b5d}.rich-formatting table th,.rich-formatting table td{padding:8px;align-self:start;align-items:start;word-break:break-all}.rich-formatting table th.nowrap,.rich-formatting table td.nowrap{width:25%;position:relative}.rich-formatting table th.nowrap::before,.rich-formatting table td.nowrap::before{content:\" \";visibility:hidden}.rich-formatting table th.nowrap span,.rich-formatting table td.nowrap span{position:absolute;left:8px;right:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rich-formatting>:first-child{margin-top:0}.information-board{background:#e6ebf0;padding:20px 0}.information-board .container-alt{position:relative;padding-right:295px}.information-board__sections{display:flex;justify-content:space-between;flex-wrap:wrap}.information-board__section{flex:1 0 0;font-family:sans-serif,sans-serif;font-size:16px;line-height:28px;color:#000;text-align:right;padding:10px 15px}.information-board__section span,.information-board__section strong{display:block}.information-board__section span:last-child{color:#282c37}.information-board__section strong{font-family:sans-serif,sans-serif;font-weight:500;font-size:32px;line-height:48px}@media screen and (max-width: 700px){.information-board__section{text-align:center}}.information-board .panel{position:absolute;width:280px;box-sizing:border-box;background:#f2f5f7;padding:20px;padding-top:10px;border-radius:4px 4px 0 0;right:0;bottom:-40px}.information-board .panel .panel-header{font-family:sans-serif,sans-serif;font-size:14px;line-height:24px;font-weight:500;color:#282c37;padding-bottom:5px;margin-bottom:15px;border-bottom:1px solid #ccd7e0;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.information-board .panel .panel-header a,.information-board .panel .panel-header span{font-weight:400;color:#3d4455}.information-board .panel .panel-header a{text-decoration:none}.information-board .owner{text-align:center}.information-board .owner .avatar{width:80px;height:80px;width:80px;height:80px;background-size:80px 80px;margin:0 auto;margin-bottom:15px}.information-board .owner .avatar img{display:block;width:80px;height:80px;border-radius:48px;border-radius:8%;background-position:50%;background-clip:padding-box}.information-board .owner .name{font-size:14px}.information-board .owner .name a{display:block;color:#000;text-decoration:none}.information-board .owner .name a:hover .display_name{text-decoration:underline}.information-board .owner .name .username{display:block;color:#282c37}.landing-page p,.landing-page li{font-family:sans-serif,sans-serif;font-size:16px;font-weight:400;font-size:16px;line-height:30px;margin-bottom:12px;color:#282c37}.landing-page p a,.landing-page li a{color:#2b90d9;text-decoration:underline}.landing-page em{display:inline;margin:0;padding:0;font-weight:700;background:transparent;font-family:inherit;font-size:inherit;line-height:inherit;color:#131419}.landing-page h1{font-family:sans-serif,sans-serif;font-size:26px;line-height:30px;font-weight:500;margin-bottom:20px;color:#282c37}.landing-page h1 small{font-family:sans-serif,sans-serif;display:block;font-size:18px;font-weight:400;color:#131419}.landing-page h2{font-family:sans-serif,sans-serif;font-size:22px;line-height:26px;font-weight:500;margin-bottom:20px;color:#282c37}.landing-page h3{font-family:sans-serif,sans-serif;font-size:18px;line-height:24px;font-weight:500;margin-bottom:20px;color:#282c37}.landing-page h4{font-family:sans-serif,sans-serif;font-size:16px;line-height:24px;font-weight:500;margin-bottom:20px;color:#282c37}.landing-page h5{font-family:sans-serif,sans-serif;font-size:14px;line-height:24px;font-weight:500;margin-bottom:20px;color:#282c37}.landing-page h6{font-family:sans-serif,sans-serif;font-size:12px;line-height:24px;font-weight:500;margin-bottom:20px;color:#282c37}.landing-page ul,.landing-page ol{margin-left:20px}.landing-page ul[type=a],.landing-page ol[type=a]{list-style-type:lower-alpha}.landing-page ul[type=i],.landing-page ol[type=i]{list-style-type:lower-roman}.landing-page ul{list-style:disc}.landing-page ol{list-style:decimal}.landing-page li>ol,.landing-page li>ul{margin-top:6px}.landing-page hr{width:100%;height:0;border:0;border-bottom:1px solid rgba(60,80,99,.6);margin:20px 0}.landing-page hr.spacer{height:1px;border:0}.landing-page__information,.landing-page__forms{padding:20px}.landing-page__call-to-action{background:#d9e1e8;border-radius:4px;padding:25px 40px;overflow:hidden;box-sizing:border-box}.landing-page__call-to-action .row{width:100%;display:flex;flex-direction:row-reverse;flex-wrap:nowrap;justify-content:space-between;align-items:center}.landing-page__call-to-action .row__information-board{display:flex;justify-content:flex-end;align-items:flex-end}.landing-page__call-to-action .row__information-board .information-board__section{flex:1 0 auto;padding:0 10px}@media screen and (max-width: 415px){.landing-page__call-to-action .row__information-board{width:100%;justify-content:space-between}}.landing-page__call-to-action .row__mascot{flex:1;margin:10px -50px 0 0}@media screen and (max-width: 415px){.landing-page__call-to-action .row__mascot{display:none}}.landing-page__logo{margin-right:20px}.landing-page__logo img{height:50px;width:auto;mix-blend-mode:lighten}.landing-page__information{padding:45px 40px;margin-bottom:10px}.landing-page__information:last-child{margin-bottom:0}.landing-page__information strong{font-weight:500;color:#131419}.landing-page__information .account{border-bottom:0;padding:0}.landing-page__information .account__display-name{align-items:center;display:flex;margin-right:5px}.landing-page__information .account div.account__display-name:hover .display-name strong{text-decoration:none}.landing-page__information .account div.account__display-name .account__avatar{cursor:default}.landing-page__information .account__avatar-wrapper{margin-left:0;flex:0 0 auto}.landing-page__information .account__avatar{width:44px;height:44px;background-size:44px 44px;width:44px;height:44px;background-size:44px 44px}.landing-page__information .account .display-name{font-size:15px}.landing-page__information .account .display-name__account{font-size:14px}@media screen and (max-width: 960px){.landing-page__information .contact{margin-top:30px}}@media screen and (max-width: 700px){.landing-page__information{padding:25px 20px}}.landing-page__information,.landing-page__forms,.landing-page #mastodon-timeline{box-sizing:border-box;background:#d9e1e8;border-radius:4px;box-shadow:0 0 6px rgba(0,0,0,.1)}.landing-page__mascot{height:104px;position:relative;left:-40px;bottom:25px}.landing-page__mascot img{height:190px;width:auto}.landing-page__short-description .row{display:flex;flex-wrap:wrap;align-items:center;margin-bottom:40px}@media screen and (max-width: 700px){.landing-page__short-description .row{margin-bottom:20px}}.landing-page__short-description p a{color:#282c37}.landing-page__short-description h1{font-weight:500;color:#000;margin-bottom:0}.landing-page__short-description h1 small{color:#282c37}.landing-page__short-description h1 small span{color:#282c37}.landing-page__short-description p:last-child{margin-bottom:0}.landing-page__hero{margin-bottom:10px}.landing-page__hero img{display:block;margin:0;max-width:100%;height:auto;border-radius:4px}@media screen and (max-width: 840px){.landing-page .information-board .container-alt{padding-right:20px}.landing-page .information-board .panel{position:static;margin-top:20px;width:100%;border-radius:4px}.landing-page .information-board .panel .panel-header{text-align:center}}@media screen and (max-width: 675px){.landing-page .header-wrapper{padding-top:0}.landing-page .header-wrapper.compact{padding-bottom:0}.landing-page .header-wrapper.compact .hero .heading{text-align:initial}.landing-page .header .container-alt,.landing-page .features .container-alt{display:block}}.landing-page .cta{margin:20px}.landing{margin-bottom:100px}@media screen and (max-width: 738px){.landing{margin-bottom:0}}.landing__brand{display:flex;justify-content:center;align-items:center;padding:50px}.landing__brand svg{fill:#000;height:52px}@media screen and (max-width: 415px){.landing__brand{padding:0;margin-bottom:30px}}.landing .directory{margin-top:30px;background:transparent;box-shadow:none;border-radius:0}.landing .hero-widget{margin-top:30px;margin-bottom:0}.landing .hero-widget h4{padding:10px;text-transform:uppercase;font-weight:700;font-size:13px;color:#282c37}.landing .hero-widget__text{border-radius:0;padding-bottom:0}.landing .hero-widget__footer{background:#d9e1e8;padding:10px;border-radius:0 0 4px 4px;display:flex}.landing .hero-widget__footer__column{flex:1 1 50%}.landing .hero-widget .account{padding:10px 0;border-bottom:0}.landing .hero-widget .account .account__display-name{display:flex;align-items:center}.landing .hero-widget .account .account__avatar{width:44px;height:44px;background-size:44px 44px}.landing .hero-widget__counter{padding:10px}.landing .hero-widget__counter strong{font-family:sans-serif,sans-serif;font-size:15px;font-weight:700;display:block}.landing .hero-widget__counter span{font-size:14px;color:#282c37}.landing .simple_form .user_agreement .label_input>label{font-weight:400;color:#282c37}.landing .simple_form p.lead{color:#282c37;font-size:15px;line-height:20px;font-weight:400;margin-bottom:25px}.landing__grid{max-width:960px;margin:0 auto;display:grid;grid-template-columns:minmax(0, 50%) minmax(0, 50%);grid-gap:30px}@media screen and (max-width: 738px){.landing__grid{grid-template-columns:minmax(0, 100%);grid-gap:10px}.landing__grid__column-login{grid-row:1;display:flex;flex-direction:column}.landing__grid__column-login .box-widget{order:2;flex:0 0 auto}.landing__grid__column-login .hero-widget{margin-top:0;margin-bottom:10px;order:1;flex:0 0 auto}.landing__grid__column-registration{grid-row:2}.landing__grid .directory{margin-top:10px}}@media screen and (max-width: 415px){.landing__grid{grid-gap:0}.landing__grid .hero-widget{display:block;margin-bottom:0;box-shadow:none}.landing__grid .hero-widget__img,.landing__grid .hero-widget__img img,.landing__grid .hero-widget__footer{border-radius:0}.landing__grid .hero-widget,.landing__grid .box-widget,.landing__grid .directory__tag{border-bottom:1px solid #c0cdd9}.landing__grid .directory{margin-top:0}.landing__grid .directory__tag{margin-bottom:0}.landing__grid .directory__tag>a,.landing__grid .directory__tag>div{border-radius:0;box-shadow:none}.landing__grid .directory__tag:last-child{border-bottom:0}}.brand{position:relative;text-decoration:none}.brand__tagline{display:block;position:absolute;bottom:-10px;left:50px;width:300px;color:#9baec8;text-decoration:none;font-size:14px}@media screen and (max-width: 415px){.brand__tagline{position:static;width:auto;margin-top:20px;color:#444b5d}}.table{width:100%;max-width:100%;border-spacing:0;border-collapse:collapse}.table th,.table td{padding:8px;line-height:18px;vertical-align:top;border-top:1px solid #d9e1e8;text-align:left;background:#e6ebf0}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #d9e1e8;border-top:0;font-weight:500}.table>tbody>tr>th{font-weight:500}.table>tbody>tr:nth-child(odd)>td,.table>tbody>tr:nth-child(odd)>th{background:#d9e1e8}.table a{color:#2b90d9;text-decoration:underline}.table a:hover{text-decoration:none}.table strong{font-weight:500}.table strong:lang(ja){font-weight:700}.table strong:lang(ko){font-weight:700}.table strong:lang(zh-CN){font-weight:700}.table strong:lang(zh-HK){font-weight:700}.table strong:lang(zh-TW){font-weight:700}.table.inline-table>tbody>tr:nth-child(odd)>td,.table.inline-table>tbody>tr:nth-child(odd)>th{background:transparent}.table.inline-table>tbody>tr:first-child>td,.table.inline-table>tbody>tr:first-child>th{border-top:0}.table.batch-table>thead>tr>th{background:#d9e1e8;border-top:1px solid #f2f5f7;border-bottom:1px solid #f2f5f7}.table.batch-table>thead>tr>th:first-child{border-radius:4px 0 0;border-left:1px solid #f2f5f7}.table.batch-table>thead>tr>th:last-child{border-radius:0 4px 0 0;border-right:1px solid #f2f5f7}.table--invites tbody td{vertical-align:middle}.table-wrapper{overflow:auto;margin-bottom:20px}samp{font-family:monospace,monospace}button.table-action-link{background:transparent;border:0;font:inherit}button.table-action-link,a.table-action-link{text-decoration:none;display:inline-block;margin-right:5px;padding:0 10px;color:#282c37;font-weight:500}button.table-action-link:hover,a.table-action-link:hover{color:#000}button.table-action-link i.fa,a.table-action-link i.fa{font-weight:400;margin-right:5px}button.table-action-link:first-child,a.table-action-link:first-child{padding-left:0}.batch-table__toolbar,.batch-table__row{display:flex}.batch-table__toolbar__select,.batch-table__row__select{box-sizing:border-box;padding:8px 16px;cursor:pointer;min-height:100%}.batch-table__toolbar__select input,.batch-table__row__select input{margin-top:8px}.batch-table__toolbar__select--aligned,.batch-table__row__select--aligned{display:flex;align-items:center}.batch-table__toolbar__select--aligned input,.batch-table__row__select--aligned input{margin-top:0}.batch-table__toolbar__actions,.batch-table__toolbar__content,.batch-table__row__actions,.batch-table__row__content{padding:8px 0;padding-right:16px;flex:1 1 auto}.batch-table__toolbar{border:1px solid #f2f5f7;background:#d9e1e8;border-radius:4px 0 0;height:47px;align-items:center}.batch-table__toolbar__actions{text-align:right;padding-right:11px}.batch-table__form{padding:16px;border:1px solid #f2f5f7;border-top:0;background:#d9e1e8}.batch-table__form .fields-row{padding-top:0;margin-bottom:0}.batch-table__row{border:1px solid #f2f5f7;border-top:0;background:#e6ebf0}@media screen and (max-width: 415px){.optional .batch-table__row:first-child{border-top:1px solid #f2f5f7}}.batch-table__row:hover{background:#dfe6ec}.batch-table__row:nth-child(even){background:#d9e1e8}.batch-table__row:nth-child(even):hover{background:#d3dce4}.batch-table__row__content{padding-top:12px;padding-bottom:16px}.batch-table__row__content--unpadded{padding:0}.batch-table__row__content--with-image{display:flex;align-items:center}.batch-table__row__content__image{flex:0 0 auto;display:flex;justify-content:center;align-items:center;margin-right:10px}.batch-table__row__content__image .emojione{width:32px;height:32px}.batch-table__row__content__text{flex:1 1 auto}.batch-table__row__content__extra{flex:0 0 auto;text-align:right;color:#282c37;font-weight:500}.batch-table__row .directory__tag{margin:0;width:100%}.batch-table__row .directory__tag a{background:transparent;border-radius:0}@media screen and (max-width: 415px){.batch-table.optional .batch-table__toolbar,.batch-table.optional .batch-table__row__select{display:none}}.batch-table .status__content{padding-top:0}.batch-table .status__content strong{font-weight:700}.batch-table .nothing-here{border:1px solid #f2f5f7;border-top:0;box-shadow:none}@media screen and (max-width: 415px){.batch-table .nothing-here{border-top:1px solid #f2f5f7}}@media screen and (max-width: 870px){.batch-table .accounts-table tbody td.optional{display:none}}.admin-wrapper{display:flex;justify-content:center;width:100%;min-height:100vh}.admin-wrapper .sidebar-wrapper{min-height:100vh;overflow:hidden;pointer-events:none;flex:1 1 auto}.admin-wrapper .sidebar-wrapper__inner{display:flex;justify-content:flex-end;background:#d9e1e8;height:100%}.admin-wrapper .sidebar{width:240px;padding:0;pointer-events:auto}.admin-wrapper .sidebar__toggle{display:none;background:#c0cdd9;height:48px}.admin-wrapper .sidebar__toggle__logo{flex:1 1 auto}.admin-wrapper .sidebar__toggle__logo a{display:inline-block;padding:15px}.admin-wrapper .sidebar__toggle__logo svg{fill:#000;height:20px;position:relative;bottom:-2px}.admin-wrapper .sidebar__toggle__icon{display:block;color:#282c37;text-decoration:none;flex:0 0 auto;font-size:20px;padding:15px}.admin-wrapper .sidebar__toggle a:hover,.admin-wrapper .sidebar__toggle a:focus,.admin-wrapper .sidebar__toggle a:active{background:#b3c3d1}.admin-wrapper .sidebar .logo{display:block;margin:40px auto;width:100px;height:100px}@media screen and (max-width: 600px){.admin-wrapper .sidebar>a:first-child{display:none}}.admin-wrapper .sidebar ul{list-style:none;border-radius:4px 0 0 4px;overflow:hidden;margin-bottom:20px}@media screen and (max-width: 600px){.admin-wrapper .sidebar ul{margin-bottom:0}}.admin-wrapper .sidebar ul a{display:block;padding:15px;color:#282c37;text-decoration:none;transition:all 200ms linear;transition-property:color,background-color;border-radius:4px 0 0 4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.admin-wrapper .sidebar ul a i.fa{margin-right:5px}.admin-wrapper .sidebar ul a:hover{color:#000;background-color:#e9eef2;transition:all 100ms linear;transition-property:color,background-color}.admin-wrapper .sidebar ul a.selected{background:#dfe6ec;border-radius:4px 0 0}.admin-wrapper .sidebar ul ul{background:#e6ebf0;border-radius:0 0 0 4px;margin:0}.admin-wrapper .sidebar ul ul a{border:0;padding:15px 35px}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a{color:#000;background-color:#2b90d9;border-bottom:0;border-radius:0}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a:hover{background-color:#2482c7}.admin-wrapper .sidebar>ul>.simple-navigation-active-leaf a{border-radius:4px 0 0 4px}.admin-wrapper .content-wrapper{box-sizing:border-box;width:100%;max-width:840px;flex:1 1 auto}@media screen and (max-width: 1080px){.admin-wrapper .sidebar-wrapper--empty{display:none}.admin-wrapper .sidebar-wrapper{width:240px;flex:0 0 auto}}@media screen and (max-width: 600px){.admin-wrapper .sidebar-wrapper{width:100%}}.admin-wrapper .content{padding:20px 15px;padding-top:60px;padding-left:25px}@media screen and (max-width: 600px){.admin-wrapper .content{max-width:none;padding:15px;padding-top:30px}}.admin-wrapper .content-heading{display:flex;padding-bottom:40px;border-bottom:1px solid #c0cdd9;margin:-15px -15px 40px 0;flex-wrap:wrap;align-items:center;justify-content:space-between}.admin-wrapper .content-heading>*{margin-top:15px;margin-right:15px}.admin-wrapper .content-heading-actions{display:inline-flex}.admin-wrapper .content-heading-actions>:not(:first-child){margin-left:5px}@media screen and (max-width: 600px){.admin-wrapper .content-heading{border-bottom:0;padding-bottom:0}}.admin-wrapper .content h2{color:#282c37;font-size:24px;line-height:28px;font-weight:400}@media screen and (max-width: 600px){.admin-wrapper .content h2{font-weight:700}}.admin-wrapper .content h3{color:#282c37;font-size:20px;line-height:28px;font-weight:400;margin-bottom:30px}.admin-wrapper .content h4{text-transform:uppercase;font-size:13px;font-weight:700;color:#282c37;padding-bottom:8px;margin-bottom:8px;border-bottom:1px solid #c0cdd9}.admin-wrapper .content h6{font-size:16px;color:#282c37;line-height:28px;font-weight:500}.admin-wrapper .content .fields-group h6{color:#000;font-weight:500}.admin-wrapper .content .directory__tag>a,.admin-wrapper .content .directory__tag>div{box-shadow:none}.admin-wrapper .content .directory__tag .table-action-link .fa{color:inherit}.admin-wrapper .content .directory__tag h4{font-size:18px;font-weight:700;color:#000;text-transform:none;padding-bottom:0;margin-bottom:0;border-bottom:none}.admin-wrapper .content>p{font-size:14px;line-height:21px;color:#282c37;margin-bottom:20px}.admin-wrapper .content>p strong{color:#000;font-weight:500}.admin-wrapper .content>p strong:lang(ja){font-weight:700}.admin-wrapper .content>p strong:lang(ko){font-weight:700}.admin-wrapper .content>p strong:lang(zh-CN){font-weight:700}.admin-wrapper .content>p strong:lang(zh-HK){font-weight:700}.admin-wrapper .content>p strong:lang(zh-TW){font-weight:700}.admin-wrapper .content hr{width:100%;height:0;border:0;border-bottom:1px solid rgba(60,80,99,.6);margin:20px 0}.admin-wrapper .content hr.spacer{height:1px;border:0}@media screen and (max-width: 600px){.admin-wrapper{display:block}.admin-wrapper .sidebar-wrapper{min-height:0}.admin-wrapper .sidebar{width:100%;padding:0;height:auto}.admin-wrapper .sidebar__toggle{display:flex}.admin-wrapper .sidebar>ul{display:none}.admin-wrapper .sidebar ul a,.admin-wrapper .sidebar ul ul a{border-radius:0;border-bottom:1px solid #ccd7e0;transition:none}.admin-wrapper .sidebar ul a:hover,.admin-wrapper .sidebar ul ul a:hover{transition:none}.admin-wrapper .sidebar ul ul{border-radius:0}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a{border-bottom-color:#2b90d9}}hr.spacer{width:100%;border:0;margin:20px 0;height:1px}body .muted-hint,.admin-wrapper .content .muted-hint{color:#282c37}body .muted-hint a,.admin-wrapper .content .muted-hint a{color:#2b90d9}body .positive-hint,.admin-wrapper .content .positive-hint{color:#79bd9a;font-weight:500}body .negative-hint,.admin-wrapper .content .negative-hint{color:#df405a;font-weight:500}body .neutral-hint,.admin-wrapper .content .neutral-hint{color:#444b5d;font-weight:500}body .warning-hint,.admin-wrapper .content .warning-hint{color:#ca8f04;font-weight:500}.filters{display:flex;flex-wrap:wrap}.filters .filter-subset{flex:0 0 auto;margin:0 40px 20px 0}.filters .filter-subset:last-child{margin-bottom:30px}.filters .filter-subset ul{margin-top:5px;list-style:none}.filters .filter-subset ul li{display:inline-block;margin-right:5px}.filters .filter-subset strong{font-weight:500;text-transform:uppercase;font-size:12px}.filters .filter-subset strong:lang(ja){font-weight:700}.filters .filter-subset strong:lang(ko){font-weight:700}.filters .filter-subset strong:lang(zh-CN){font-weight:700}.filters .filter-subset strong:lang(zh-HK){font-weight:700}.filters .filter-subset strong:lang(zh-TW){font-weight:700}.filters .filter-subset a{display:inline-block;color:#282c37;text-decoration:none;text-transform:uppercase;font-size:12px;font-weight:500;border-bottom:2px solid #d9e1e8}.filters .filter-subset a:hover{color:#000;border-bottom:2px solid #c9d4de}.filters .filter-subset a.selected{color:#2b90d9;border-bottom:2px solid #2b90d9}.flavour-screen{display:block;margin:10px auto;max-width:100%}.flavour-description{display:block;font-size:16px;margin:10px 0}.flavour-description>p{margin:10px 0}.report-accounts{display:flex;flex-wrap:wrap;margin-bottom:20px}.report-accounts__item{display:flex;flex:250px;flex-direction:column;margin:0 5px}.report-accounts__item>strong{display:block;margin:0 0 10px -5px;font-weight:500;font-size:14px;line-height:18px;color:#282c37}.report-accounts__item>strong:lang(ja){font-weight:700}.report-accounts__item>strong:lang(ko){font-weight:700}.report-accounts__item>strong:lang(zh-CN){font-weight:700}.report-accounts__item>strong:lang(zh-HK){font-weight:700}.report-accounts__item>strong:lang(zh-TW){font-weight:700}.report-accounts__item .account-card{flex:1 1 auto}.report-status,.account-status{display:flex;margin-bottom:10px}.report-status .activity-stream,.account-status .activity-stream{flex:2 0 0;margin-right:20px;max-width:calc(100% - 60px)}.report-status .activity-stream .entry,.account-status .activity-stream .entry{border-radius:4px}.report-status__actions,.account-status__actions{flex:0 0 auto;display:flex;flex-direction:column}.report-status__actions .icon-button,.account-status__actions .icon-button{font-size:24px;width:24px;text-align:center;margin-bottom:10px}.simple_form.new_report_note,.simple_form.new_account_moderation_note{max-width:100%}.batch-form-box{display:flex;flex-wrap:wrap;margin-bottom:5px}.batch-form-box #form_status_batch_action{margin:0 5px 5px 0;font-size:14px}.batch-form-box input.button{margin:0 5px 5px 0}.batch-form-box .media-spoiler-toggle-buttons{margin-left:auto}.batch-form-box .media-spoiler-toggle-buttons .button{overflow:visible;margin:0 0 5px 5px;float:right}.back-link{margin-bottom:10px;font-size:14px}.back-link a{color:#2b90d9;text-decoration:none}.back-link a:hover{text-decoration:underline}.spacer{flex:1 1 auto}.log-entry{margin-bottom:20px;line-height:20px}.log-entry__header{display:flex;justify-content:flex-start;align-items:center;padding:10px;background:#d9e1e8;color:#282c37;border-radius:4px 4px 0 0;font-size:14px;position:relative}.log-entry__avatar{margin-right:10px}.log-entry__avatar .avatar{display:block;margin:0;border-radius:50%;width:40px;height:40px}.log-entry__content{max-width:calc(100% - 90px)}.log-entry__title{word-wrap:break-word}.log-entry__timestamp{color:#444b5d}.log-entry__extras{background:#c6d2dc;border-radius:0 0 4px 4px;padding:10px;color:#282c37;font-family:monospace,monospace;font-size:12px;word-wrap:break-word;min-height:20px}.log-entry__icon{font-size:28px;margin-right:10px;color:#444b5d}.log-entry__icon__overlay{position:absolute;top:10px;right:10px;width:10px;height:10px;border-radius:50%}.log-entry__icon__overlay.positive{background:#79bd9a}.log-entry__icon__overlay.negative{background:#c1203b}.log-entry__icon__overlay.neutral{background:#2b90d9}.log-entry a,.log-entry .username,.log-entry .target{color:#282c37;text-decoration:none;font-weight:500}.log-entry .diff-old{color:#c1203b}.log-entry .diff-neutral{color:#282c37}.log-entry .diff-new{color:#79bd9a}a.name-tag,.name-tag,a.inline-name-tag,.inline-name-tag{text-decoration:none;color:#282c37}a.name-tag .username,.name-tag .username,a.inline-name-tag .username,.inline-name-tag .username{font-weight:500}a.name-tag.suspended .username,.name-tag.suspended .username,a.inline-name-tag.suspended .username,.inline-name-tag.suspended .username{text-decoration:line-through;color:#c1203b}a.name-tag.suspended .avatar,.name-tag.suspended .avatar,a.inline-name-tag.suspended .avatar,.inline-name-tag.suspended .avatar{filter:grayscale(100%);opacity:.8}a.name-tag,.name-tag{display:flex;align-items:center}a.name-tag .avatar,.name-tag .avatar{display:block;margin:0;margin-right:5px;border-radius:50%}a.name-tag.suspended .avatar,.name-tag.suspended .avatar{filter:grayscale(100%);opacity:.8}.speech-bubble{margin-bottom:20px;border-left:4px solid #2b90d9}.speech-bubble.positive{border-left-color:#79bd9a}.speech-bubble.negative{border-left-color:#c1203b}.speech-bubble.warning{border-left-color:#ca8f04}.speech-bubble__bubble{padding:16px;padding-left:14px;font-size:15px;line-height:20px;border-radius:4px 4px 4px 0;position:relative;font-weight:500}.speech-bubble__bubble a{color:#282c37}.speech-bubble__owner{padding:8px;padding-left:12px}.speech-bubble time{color:#444b5d}.report-card{background:#d9e1e8;border-radius:4px;margin-bottom:20px}.report-card__profile{display:flex;justify-content:space-between;align-items:center;padding:15px}.report-card__profile .account{padding:0;border:0}.report-card__profile .account__avatar-wrapper{margin-left:0}.report-card__profile__stats{flex:0 0 auto;font-weight:500;color:#282c37;text-transform:uppercase;text-align:right}.report-card__profile__stats a{color:inherit;text-decoration:none}.report-card__profile__stats a:focus,.report-card__profile__stats a:hover,.report-card__profile__stats a:active{color:#17191f}.report-card__profile__stats .red{color:#df405a}.report-card__summary__item{display:flex;justify-content:flex-start;border-top:1px solid #e6ebf0}.report-card__summary__item:hover{background:#d3dce4}.report-card__summary__item__reported-by,.report-card__summary__item__assigned{padding:15px;flex:0 0 auto;box-sizing:border-box;width:150px;color:#282c37}.report-card__summary__item__reported-by,.report-card__summary__item__reported-by .username,.report-card__summary__item__assigned,.report-card__summary__item__assigned .username{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.report-card__summary__item__content{flex:1 1 auto;max-width:calc(100% - 300px)}.report-card__summary__item__content__icon{color:#444b5d;margin-right:4px;font-weight:500}.report-card__summary__item__content a{display:block;box-sizing:border-box;width:100%;padding:15px;text-decoration:none;color:#282c37}.one-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ellipsized-ip{display:inline-block;max-width:120px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.admin-account-bio{display:flex;flex-wrap:wrap;margin:0 -5px;margin-top:20px}.admin-account-bio>div{box-sizing:border-box;padding:0 5px;margin-bottom:10px;flex:1 0 50%}.admin-account-bio .account__header__fields,.admin-account-bio .account__header__content{background:#c0cdd9;border-radius:4px;height:100%}.admin-account-bio .account__header__fields{margin:0;border:0}.admin-account-bio .account__header__fields a{color:#217aba}.admin-account-bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.admin-account-bio .account__header__fields .verified a{color:#79bd9a}.admin-account-bio .account__header__content{box-sizing:border-box;padding:20px;color:#000}.center-text{text-align:center}.emojione[title=\":wind_blowing_face:\"],.emojione[title=\":white_small_square:\"],.emojione[title=\":white_medium_square:\"],.emojione[title=\":white_medium_small_square:\"],.emojione[title=\":white_large_square:\"],.emojione[title=\":white_circle:\"],.emojione[title=\":waxing_crescent_moon:\"],.emojione[title=\":waving_white_flag:\"],.emojione[title=\":waning_gibbous_moon:\"],.emojione[title=\":waning_crescent_moon:\"],.emojione[title=\":volleyball:\"],.emojione[title=\":thought_balloon:\"],.emojione[title=\":speech_balloon:\"],.emojione[title=\":speaker:\"],.emojione[title=\":sound:\"],.emojione[title=\":snow_cloud:\"],.emojione[title=\":skull_and_crossbones:\"],.emojione[title=\":skull:\"],.emojione[title=\":sheep:\"],.emojione[title=\":rooster:\"],.emojione[title=\":rice_ball:\"],.emojione[title=\":rice:\"],.emojione[title=\":ram:\"],.emojione[title=\":rain_cloud:\"],.emojione[title=\":page_with_curl:\"],.emojione[title=\":mute:\"],.emojione[title=\":moon:\"],.emojione[title=\":loud_sound:\"],.emojione[title=\":lightning:\"],.emojione[title=\":last_quarter_moon_with_face:\"],.emojione[title=\":last_quarter_moon:\"],.emojione[title=\":ice_skate:\"],.emojione[title=\":grey_question:\"],.emojione[title=\":grey_exclamation:\"],.emojione[title=\":goat:\"],.emojione[title=\":ghost:\"],.emojione[title=\":full_moon_with_face:\"],.emojione[title=\":full_moon:\"],.emojione[title=\":fish_cake:\"],.emojione[title=\":first_quarter_moon_with_face:\"],.emojione[title=\":first_quarter_moon:\"],.emojione[title=\":eyes:\"],.emojione[title=\":dove_of_peace:\"],.emojione[title=\":dash:\"],.emojione[title=\":crescent_moon:\"],.emojione[title=\":cloud:\"],.emojione[title=\":chicken:\"],.emojione[title=\":chains:\"],.emojione[title=\":baseball:\"],.emojione[title=\":alien:\"]{filter:drop-shadow(1px 1px 0 #000000) drop-shadow(-1px 1px 0 #000000) drop-shadow(1px -1px 0 #000000) drop-shadow(-1px -1px 0 #000000)}.hicolor-privacy-icons .status__visibility-icon.fa-globe,.hicolor-privacy-icons .composer--options--dropdown--content--item .fa-globe{color:#1976d2}.hicolor-privacy-icons .status__visibility-icon.fa-unlock,.hicolor-privacy-icons .composer--options--dropdown--content--item .fa-unlock{color:#388e3c}.hicolor-privacy-icons .status__visibility-icon.fa-lock,.hicolor-privacy-icons .composer--options--dropdown--content--item .fa-lock{color:#ffa000}.hicolor-privacy-icons .status__visibility-icon.fa-envelope,.hicolor-privacy-icons .composer--options--dropdown--content--item .fa-envelope{color:#d32f2f}body.rtl{direction:rtl}body.rtl .column-header>button{text-align:right;padding-left:0;padding-right:15px}body.rtl .radio-button__input{margin-right:0;margin-left:10px}body.rtl .directory__card__bar .display-name{margin-left:0;margin-right:15px}body.rtl .display-name{text-align:right}body.rtl .notification__message{margin-left:0;margin-right:68px}body.rtl .drawer__inner__mastodon>img{transform:scaleX(-1)}body.rtl .notification__favourite-icon-wrapper{left:auto;right:-26px}body.rtl .landing-page__logo{margin-right:0;margin-left:20px}body.rtl .landing-page .features-list .features-list__row .visual{margin-left:0;margin-right:15px}body.rtl .column-link__icon,body.rtl .column-header__icon{margin-right:0;margin-left:5px}body.rtl .compose-form .compose-form__buttons-wrapper .character-counter__wrapper{margin-right:0;margin-left:4px}body.rtl .composer--publisher{text-align:left}body.rtl .boost-modal__status-time,body.rtl .favourite-modal__status-time{float:left}body.rtl .navigation-bar__profile{margin-left:0;margin-right:8px}body.rtl .search__input{padding-right:10px;padding-left:30px}body.rtl .search__icon .fa{right:auto;left:10px}body.rtl .columns-area{direction:rtl}body.rtl .column-header__buttons{left:0;right:auto;margin-left:0;margin-right:-15px}body.rtl .column-inline-form .icon-button{margin-left:0;margin-right:5px}body.rtl .column-header__links .text-btn{margin-left:10px;margin-right:0}body.rtl .account__avatar-wrapper{float:right}body.rtl .column-header__back-button{padding-left:5px;padding-right:0}body.rtl .column-header__setting-arrows{float:left}body.rtl .setting-toggle__label{margin-left:0;margin-right:8px}body.rtl .setting-meta__label{float:left}body.rtl .status__avatar{margin-left:10px;margin-right:0;left:auto;right:10px}body.rtl .activity-stream .status.light{padding-left:10px;padding-right:68px}body.rtl .status__info .status__display-name,body.rtl .activity-stream .status.light .status__display-name{padding-left:25px;padding-right:0}body.rtl .activity-stream .pre-header{padding-right:68px;padding-left:0}body.rtl .status__prepend{margin-left:0;margin-right:58px}body.rtl .status__prepend-icon-wrapper{left:auto;right:-26px}body.rtl .activity-stream .pre-header .pre-header__icon{left:auto;right:42px}body.rtl .account__avatar-overlay-overlay{right:auto;left:0}body.rtl .column-back-button--slim-button{right:auto;left:0}body.rtl .status__relative-time,body.rtl .activity-stream .status.light .status__header .status__meta{float:left;text-align:left}body.rtl .status__action-bar__counter{margin-right:0;margin-left:11px}body.rtl .status__action-bar__counter .status__action-bar-button{margin-right:0;margin-left:4px}body.rtl .status__action-bar-button{float:right;margin-right:0;margin-left:18px}body.rtl .status__action-bar-dropdown{float:right}body.rtl .privacy-dropdown__dropdown{margin-left:0;margin-right:40px}body.rtl .privacy-dropdown__option__icon{margin-left:10px;margin-right:0}body.rtl .detailed-status__display-name .display-name{text-align:right}body.rtl .detailed-status__display-avatar{margin-right:0;margin-left:10px;float:right}body.rtl .detailed-status__favorites,body.rtl .detailed-status__reblogs{margin-left:0;margin-right:6px}body.rtl .fa-ul{margin-left:2.14285714em}body.rtl .fa-li{left:auto;right:-2.14285714em}body.rtl .admin-wrapper{direction:rtl}body.rtl .admin-wrapper .sidebar ul a i.fa,body.rtl a.table-action-link i.fa{margin-right:0;margin-left:5px}body.rtl .simple_form .check_boxes .checkbox label{padding-left:0;padding-right:25px}body.rtl .simple_form .input.with_label.boolean label.checkbox{padding-left:25px;padding-right:0}body.rtl .simple_form .check_boxes .checkbox input[type=checkbox],body.rtl .simple_form .input.boolean input[type=checkbox]{left:auto;right:0}body.rtl .simple_form .input.radio_buttons .radio{left:auto;right:0}body.rtl .simple_form .input.radio_buttons .radio>label{padding-right:28px;padding-left:0}body.rtl .simple_form .input-with-append .input input{padding-left:142px;padding-right:0}body.rtl .simple_form .input.boolean label.checkbox{left:auto;right:0}body.rtl .simple_form .input.boolean .label_input,body.rtl .simple_form .input.boolean .hint{padding-left:0;padding-right:28px}body.rtl .simple_form .label_input__append{right:auto;left:3px}body.rtl .simple_form .label_input__append::after{right:auto;left:0;background-image:linear-gradient(to left, rgba(249, 250, 251, 0), #f9fafb)}body.rtl .simple_form select{background:#f9fafb url(\"data:image/svg+xml;utf8,\") no-repeat left 8px center/auto 16px}body.rtl .table th,body.rtl .table td{text-align:right}body.rtl .filters .filter-subset{margin-right:0;margin-left:45px}body.rtl .landing-page .header-wrapper .mascot{right:60px;left:auto}body.rtl .landing-page__call-to-action .row__information-board{direction:rtl}body.rtl .landing-page .header .hero .floats .float-1{left:-120px;right:auto}body.rtl .landing-page .header .hero .floats .float-2{left:210px;right:auto}body.rtl .landing-page .header .hero .floats .float-3{left:110px;right:auto}body.rtl .landing-page .header .links .brand img{left:0}body.rtl .landing-page .fa-external-link{padding-right:5px;padding-left:0 !important}body.rtl .landing-page .features #mastodon-timeline{margin-right:0;margin-left:30px}@media screen and (min-width: 631px){body.rtl .column,body.rtl .drawer{padding-left:5px;padding-right:5px}body.rtl .column:first-child,body.rtl .drawer:first-child{padding-left:5px;padding-right:10px}body.rtl .columns-area>div .column,body.rtl .columns-area>div .drawer{padding-left:5px;padding-right:5px}}body.rtl .columns-area--mobile .column,body.rtl .columns-area--mobile .drawer{padding-left:0;padding-right:0}body.rtl .public-layout .header .nav-button{margin-left:8px;margin-right:0}body.rtl .public-layout .public-account-header__tabs{margin-left:0;margin-right:20px}body.rtl .landing-page__information .account__display-name{margin-right:0;margin-left:5px}body.rtl .landing-page__information .account__avatar-wrapper{margin-left:12px;margin-right:0}body.rtl .card__bar .display-name{margin-left:0;margin-right:15px;text-align:right}body.rtl .fa-chevron-left::before{content:\"\"}body.rtl .fa-chevron-right::before{content:\"\"}body.rtl .column-back-button__icon{margin-right:0;margin-left:5px}body.rtl .column-header__setting-arrows .column-header__setting-btn:last-child{padding-left:0;padding-right:10px}body.rtl .simple_form .input.radio_buttons .radio>label input{left:auto;right:0}.dashboard__counters{display:flex;flex-wrap:wrap;margin:0 -5px;margin-bottom:20px}.dashboard__counters>div{box-sizing:border-box;flex:0 0 33.333%;padding:0 5px;margin-bottom:10px}.dashboard__counters>div>div,.dashboard__counters>div>a{padding:20px;background:#ccd7e0;border-radius:4px;box-sizing:border-box;height:100%}.dashboard__counters>div>a{text-decoration:none;color:inherit;display:block}.dashboard__counters>div>a:hover,.dashboard__counters>div>a:focus,.dashboard__counters>div>a:active{background:#c0cdd9}.dashboard__counters__num,.dashboard__counters__text{text-align:center;font-weight:500;font-size:24px;line-height:21px;color:#000;font-family:sans-serif,sans-serif;margin-bottom:20px;line-height:30px}.dashboard__counters__text{font-size:18px}.dashboard__counters__label{font-size:14px;color:#282c37;text-align:center;font-weight:500}.dashboard__widgets{display:flex;flex-wrap:wrap;margin:0 -5px}.dashboard__widgets>div{flex:0 0 33.333%;margin-bottom:20px}.dashboard__widgets>div>div{padding:0 5px}.dashboard__widgets a:not(.name-tag){color:#282c37;font-weight:500;text-decoration:none}.glitch.local-settings{background:#d9e1e8}.glitch.local-settings__navigation{background:#f2f5f7}.glitch.local-settings__navigation__item{background:#f2f5f7}.glitch.local-settings__navigation__item:hover{background:#d9e1e8}.notification__dismiss-overlay .wrappy{box-shadow:unset}.notification__dismiss-overlay .ckbox{text-shadow:unset}.status.status-direct:not(.read){background:#f2f5f7;border-bottom-color:#fff}.status.status-direct:not(.read).collapsed>.status__content:after{background:linear-gradient(rgba(242, 245, 247, 0), #f2f5f7)}.focusable:focus.status.status-direct:not(.read){background:#e6ebf0}.focusable:focus.status.status-direct:not(.read).collapsed>.status__content:after{background:linear-gradient(rgba(230, 235, 240, 0), #e6ebf0)}.column>.scrollable{background:#fff}.status.collapsed .status__content:after{background:linear-gradient(rgba(255, 255, 255, 0), white)}.drawer__inner{background:#d9e1e8}.drawer__inner__mastodon{background:#d9e1e8 url('data:image/svg+xml;utf8,') no-repeat bottom/100% auto !important}.drawer__inner__mastodon .mastodon{filter:contrast(75%) brightness(75%) !important}.status__content .status__content__spoiler-link{background:#7a96ae}.status__content .status__content__spoiler-link:hover{background:#6a89a5;text-decoration:none}.media-spoiler,.video-player__spoiler,.account-gallery__item a{background:#d9e1e8}.dropdown-menu{background:#d9e1e8}.dropdown-menu__arrow.left{border-left-color:#d9e1e8}.dropdown-menu__arrow.top{border-top-color:#d9e1e8}.dropdown-menu__arrow.bottom{border-bottom-color:#d9e1e8}.dropdown-menu__arrow.right{border-right-color:#d9e1e8}.dropdown-menu__item a{background:#d9e1e8;color:#282c37}.composer .composer--spoiler input,.composer .compose-form__autosuggest-wrapper textarea{color:#0f151a}.composer .composer--spoiler input:disabled,.composer .compose-form__autosuggest-wrapper textarea:disabled{background:#e6e6e6}.composer .composer--spoiler input::placeholder,.composer .compose-form__autosuggest-wrapper textarea::placeholder{color:#232f39}.composer .composer--options-wrapper{background:#b9c8d5}.composer .composer--options>hr{display:none}.composer .composer--options--dropdown--content--item{color:#9baec8}.composer .composer--options--dropdown--content--item strong{color:#9baec8}.composer--upload_form--actions .icon-button{color:#ededed}.composer--upload_form--actions .icon-button:active,.composer--upload_form--actions .icon-button:focus,.composer--upload_form--actions .icon-button:hover{color:#fff}.composer--upload_form--item>div input{color:#ededed}.composer--upload_form--item>div input::placeholder{color:#e6e6e6}.dropdown-menu__separator{border-bottom-color:#b3c3d1}.status__content a,.reply-indicator__content a{color:#2b90d9}.emoji-mart-bar{border-color:#e6ebf0}.emoji-mart-bar:first-child{background:#b9c8d5}.emoji-mart-search input{background:rgba(217,225,232,.3);border-color:#d9e1e8}.autosuggest-textarea__suggestions{background:#b9c8d5}.autosuggest-textarea__suggestions__item:hover,.autosuggest-textarea__suggestions__item:focus,.autosuggest-textarea__suggestions__item:active,.autosuggest-textarea__suggestions__item.selected{background:#e6ebf0}.react-toggle-track{background:#282c37}.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track{background:#131419}.react-toggle.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track{background:#56a7e1}.actions-modal,.boost-modal,.doodle-modal,.confirmation-modal,.mute-modal,.block-modal,.report-modal,.embed-modal,.error-modal,.onboarding-modal,.report-modal__comment .setting-text__wrapper,.report-modal__comment .setting-text{background:#fff;border:1px solid #c0cdd9}.report-modal__comment{border-right-color:#c0cdd9}.report-modal__container{border-top-color:#c0cdd9}.boost-modal__action-bar,.doodle-modal__action-bar,.confirmation-modal__action-bar,.mute-modal__action-bar,.block-modal__action-bar,.onboarding-modal__paginator,.error-modal__footer{background:#ecf0f4}.boost-modal__action-bar .onboarding-modal__nav:hover,.doodle-modal__action-bar .onboarding-modal__nav:hover,.boost-modal__action-bar .onboarding-modal__nav:focus,.doodle-modal__action-bar .onboarding-modal__nav:focus,.boost-modal__action-bar .onboarding-modal__nav:active,.doodle-modal__action-bar .onboarding-modal__nav:active,.boost-modal__action-bar .error-modal__nav:hover,.doodle-modal__action-bar .error-modal__nav:hover,.boost-modal__action-bar .error-modal__nav:focus,.doodle-modal__action-bar .error-modal__nav:focus,.boost-modal__action-bar .error-modal__nav:active,.doodle-modal__action-bar .error-modal__nav:active,.confirmation-modal__action-bar .onboarding-modal__nav:hover,.confirmation-modal__action-bar .onboarding-modal__nav:focus,.confirmation-modal__action-bar .onboarding-modal__nav:active,.confirmation-modal__action-bar .error-modal__nav:hover,.confirmation-modal__action-bar .error-modal__nav:focus,.confirmation-modal__action-bar .error-modal__nav:active,.mute-modal__action-bar .onboarding-modal__nav:hover,.mute-modal__action-bar .onboarding-modal__nav:focus,.mute-modal__action-bar .onboarding-modal__nav:active,.mute-modal__action-bar .error-modal__nav:hover,.mute-modal__action-bar .error-modal__nav:focus,.mute-modal__action-bar .error-modal__nav:active,.block-modal__action-bar .onboarding-modal__nav:hover,.block-modal__action-bar .onboarding-modal__nav:focus,.block-modal__action-bar .onboarding-modal__nav:active,.block-modal__action-bar .error-modal__nav:hover,.block-modal__action-bar .error-modal__nav:focus,.block-modal__action-bar .error-modal__nav:active,.onboarding-modal__paginator .onboarding-modal__nav:hover,.onboarding-modal__paginator .onboarding-modal__nav:focus,.onboarding-modal__paginator .onboarding-modal__nav:active,.onboarding-modal__paginator .error-modal__nav:hover,.onboarding-modal__paginator .error-modal__nav:focus,.onboarding-modal__paginator .error-modal__nav:active,.error-modal__footer .onboarding-modal__nav:hover,.error-modal__footer .onboarding-modal__nav:focus,.error-modal__footer .onboarding-modal__nav:active,.error-modal__footer .error-modal__nav:hover,.error-modal__footer .error-modal__nav:focus,.error-modal__footer .error-modal__nav:active{background-color:#fff}.empty-column-indicator,.error-column{color:#364959}.activity-stream-tabs{background:#fff}.activity-stream-tabs a.active{color:#9baec8}.activity-stream .entry{background:#fff}.activity-stream .status.light .status__content{color:#000}.activity-stream .status.light .display-name strong{color:#000}.accounts-grid .account-grid-card .controls .icon-button{color:#282c37}.accounts-grid .account-grid-card .name a{color:#000}.accounts-grid .account-grid-card .username{color:#282c37}.accounts-grid .account-grid-card .account__header__content{color:#000}.button.logo-button{color:#fff}.button.logo-button svg{fill:#fff}.public-layout .header,.public-layout .public-account-header,.public-layout .public-account-bio{box-shadow:none}.public-layout .header{background:#b3c3d1}.public-layout .public-account-header__image{background:#b3c3d1}.public-layout .public-account-header__image::after{box-shadow:none}.public-layout .public-account-header__tabs__name h1,.public-layout .public-account-header__tabs__name h1 small{color:#fff}.account__section-headline a.active::after{border-color:transparent transparent #fff}.hero-widget,.box-widget,.contact-widget,.landing-page__information.contact-widget,.moved-account-widget,.memoriam-widget,.activity-stream,.nothing-here,.directory__tag>a,.directory__tag>div{box-shadow:none}.audio-player .video-player__controls button,.audio-player .video-player__time-sep,.audio-player .video-player__time-current,.audio-player .video-player__time-total{color:#000}","/* http://meyerweb.com/eric/tools/css/reset/\n v2.0 | 20110126\n License: none (public domain)\n*/\n\nhtml, body, div, span, applet, object, iframe,\nh1, h2, h3, h4, h5, h6, p, blockquote, pre,\na, abbr, acronym, address, big, cite, code,\ndel, dfn, em, img, ins, kbd, q, s, samp,\nsmall, strike, strong, sub, sup, tt, var,\nb, u, i, center,\ndl, dt, dd, ol, ul, li,\nfieldset, form, label, legend,\ntable, caption, tbody, tfoot, thead, tr, th, td,\narticle, aside, canvas, details, embed,\nfigure, figcaption, footer, header, hgroup,\nmenu, nav, output, ruby, section, summary,\ntime, mark, audio, video {\n margin: 0;\n padding: 0;\n border: 0;\n font-size: 100%;\n font: inherit;\n vertical-align: baseline;\n}\n\n/* HTML5 display-role reset for older browsers */\narticle, aside, details, figcaption, figure,\nfooter, header, hgroup, menu, nav, section {\n display: block;\n}\n\nbody {\n line-height: 1;\n}\n\nol, ul {\n list-style: none;\n}\n\nblockquote, q {\n quotes: none;\n}\n\nblockquote:before, blockquote:after,\nq:before, q:after {\n content: '';\n content: none;\n}\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\nhtml {\n scrollbar-color: lighten($ui-base-color, 4%) rgba($base-overlay-background, 0.1);\n}\n\n::-webkit-scrollbar {\n width: 12px;\n height: 12px;\n}\n\n::-webkit-scrollbar-thumb {\n background: lighten($ui-base-color, 4%);\n border: 0px none $base-border-color;\n border-radius: 50px;\n}\n\n::-webkit-scrollbar-thumb:hover {\n background: lighten($ui-base-color, 6%);\n}\n\n::-webkit-scrollbar-thumb:active {\n background: lighten($ui-base-color, 4%);\n}\n\n::-webkit-scrollbar-track {\n border: 0px none $base-border-color;\n border-radius: 0;\n background: rgba($base-overlay-background, 0.1);\n}\n\n::-webkit-scrollbar-track:hover {\n background: $ui-base-color;\n}\n\n::-webkit-scrollbar-track:active {\n background: $ui-base-color;\n}\n\n::-webkit-scrollbar-corner {\n background: transparent;\n}\n","// Dependent colors\n$black: #000000;\n$white: #ffffff;\n\n$classic-base-color: #282c37;\n$classic-primary-color: #9baec8;\n$classic-secondary-color: #d9e1e8;\n$classic-highlight-color: #2b90d9;\n\n$ui-base-color: $classic-secondary-color !default;\n$ui-base-lighter-color: darken($ui-base-color, 57%);\n$ui-highlight-color: $classic-highlight-color !default;\n$ui-primary-color: $classic-primary-color !default;\n$ui-secondary-color: $classic-base-color !default;\n\n$primary-text-color: $black !default;\n$darker-text-color: $classic-base-color !default;\n$dark-text-color: #444b5d;\n$action-button-color: #606984;\n\n$success-green: lighten(#3c754d, 8%);\n\n$base-overlay-background: $white !default;\n\n$inverted-text-color: $black !default;\n$lighter-text-color: $classic-base-color !default;\n$light-text-color: #444b5d;\n\n$account-background-color: $white !default;\n\n//Invert darkened and lightened colors\n@function darken($color, $amount) {\n @return hsl(hue($color), saturation($color), lightness($color) + $amount);\n}\n\n@function lighten($color, $amount) {\n @return hsl(hue($color), saturation($color), lightness($color) - $amount);\n}\n\n$emojis-requiring-outlines: 'alien' 'baseball' 'chains' 'chicken' 'cloud' 'crescent_moon' 'dash' 'dove_of_peace' 'eyes' 'first_quarter_moon' 'first_quarter_moon_with_face' 'fish_cake' 'full_moon' 'full_moon_with_face' 'ghost' 'goat' 'grey_exclamation' 'grey_question' 'ice_skate' 'last_quarter_moon' 'last_quarter_moon_with_face' 'lightning' 'loud_sound' 'moon' 'mute' 'page_with_curl' 'rain_cloud' 'ram' 'rice' 'rice_ball' 'rooster' 'sheep' 'skull' 'skull_and_crossbones' 'snow_cloud' 'sound' 'speaker' 'speech_balloon' 'thought_balloon' 'volleyball' 'waning_crescent_moon' 'waning_gibbous_moon' 'waving_white_flag' 'waxing_crescent_moon' 'white_circle' 'white_large_square' 'white_medium_small_square' 'white_medium_square' 'white_small_square' 'wind_blowing_face';\n","@function hex-color($color) {\n @if type-of($color) == 'color' {\n $color: str-slice(ie-hex-str($color), 4);\n }\n @return '%23' + unquote($color)\n}\n\nbody {\n font-family: $font-sans-serif, sans-serif;\n background: darken($ui-base-color, 7%);\n font-size: 13px;\n line-height: 18px;\n font-weight: 400;\n color: $primary-text-color;\n text-rendering: optimizelegibility;\n font-feature-settings: \"kern\";\n text-size-adjust: none;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n -webkit-tap-highlight-color: transparent;\n\n &.system-font {\n // system-ui => standard property (Chrome/Android WebView 56+, Opera 43+, Safari 11+)\n // -apple-system => Safari <11 specific\n // BlinkMacSystemFont => Chrome <56 on macOS specific\n // Segoe UI => Windows 7/8/10\n // Oxygen => KDE\n // Ubuntu => Unity/Ubuntu\n // Cantarell => GNOME\n // Fira Sans => Firefox OS\n // Droid Sans => Older Androids (<4.0)\n // Helvetica Neue => Older macOS <10.11\n // $font-sans-serif => web-font (Roboto) fallback and newer Androids (>=4.0)\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Oxygen\", \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", $font-sans-serif, sans-serif;\n }\n\n &.app-body {\n padding: 0;\n\n &.layout-single-column {\n height: auto;\n min-height: 100vh;\n overflow-y: scroll;\n }\n\n &.layout-multiple-columns {\n position: absolute;\n width: 100%;\n height: 100%;\n }\n\n &.with-modals--active {\n overflow-y: hidden;\n }\n }\n\n &.lighter {\n background: $ui-base-color;\n }\n\n &.with-modals {\n overflow-x: hidden;\n overflow-y: scroll;\n\n &--active {\n overflow-y: hidden;\n }\n }\n\n &.embed {\n background: lighten($ui-base-color, 4%);\n margin: 0;\n padding-bottom: 0;\n\n .container {\n position: absolute;\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n }\n\n &.admin {\n background: darken($ui-base-color, 4%);\n padding: 0;\n }\n\n &.error {\n position: absolute;\n text-align: center;\n color: $darker-text-color;\n background: $ui-base-color;\n width: 100%;\n height: 100%;\n padding: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n\n .dialog {\n vertical-align: middle;\n margin: 20px;\n\n img {\n display: block;\n max-width: 470px;\n width: 100%;\n height: auto;\n margin-top: -120px;\n }\n\n h1 {\n font-size: 20px;\n line-height: 28px;\n font-weight: 400;\n }\n }\n }\n}\n\nbutton {\n font-family: inherit;\n cursor: pointer;\n\n &:focus {\n outline: none;\n }\n}\n\n.app-holder {\n &,\n & > div {\n display: flex;\n width: 100%;\n align-items: center;\n justify-content: center;\n outline: 0 !important;\n }\n}\n\n.layout-single-column .app-holder {\n &,\n & > div {\n min-height: 100vh;\n }\n}\n\n.layout-multiple-columns .app-holder {\n &,\n & > div {\n height: 100%;\n }\n}\n",".container-alt {\n width: 700px;\n margin: 0 auto;\n margin-top: 40px;\n\n @media screen and (max-width: 740px) {\n width: 100%;\n margin: 0;\n }\n}\n\n.logo-container {\n margin: 100px auto 50px;\n\n @media screen and (max-width: 500px) {\n margin: 40px auto 0;\n }\n\n h1 {\n display: flex;\n justify-content: center;\n align-items: center;\n\n svg {\n fill: $primary-text-color;\n height: 42px;\n margin-right: 10px;\n }\n\n a {\n display: flex;\n justify-content: center;\n align-items: center;\n color: $primary-text-color;\n text-decoration: none;\n outline: 0;\n padding: 12px 16px;\n line-height: 32px;\n font-family: $font-display, sans-serif;\n font-weight: 500;\n font-size: 14px;\n }\n }\n}\n\n.compose-standalone {\n .compose-form {\n width: 400px;\n margin: 0 auto;\n padding: 20px 0;\n margin-top: 40px;\n box-sizing: border-box;\n\n @media screen and (max-width: 400px) {\n width: 100%;\n margin-top: 0;\n padding: 20px;\n }\n }\n}\n\n.account-header {\n width: 400px;\n margin: 0 auto;\n display: flex;\n font-size: 13px;\n line-height: 18px;\n box-sizing: border-box;\n padding: 20px 0;\n padding-bottom: 0;\n margin-bottom: -30px;\n margin-top: 40px;\n\n @media screen and (max-width: 440px) {\n width: 100%;\n margin: 0;\n margin-bottom: 10px;\n padding: 20px;\n padding-bottom: 0;\n }\n\n .avatar {\n width: 40px;\n height: 40px;\n @include avatar-size(40px);\n margin-right: 8px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n @include avatar-radius();\n }\n }\n\n .name {\n flex: 1 1 auto;\n color: $secondary-text-color;\n width: calc(100% - 88px);\n\n .username {\n display: block;\n font-weight: 500;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n }\n\n .logout-link {\n display: block;\n font-size: 32px;\n line-height: 40px;\n margin-left: 8px;\n }\n}\n\n.grid-3 {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: 3fr 1fr;\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-column: 1/3;\n grid-row: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 2;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1/3;\n grid-row: 3;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n grid-template-columns: minmax(0, 100%);\n\n .column-0 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .column-2 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1;\n grid-row: 4;\n }\n }\n}\n\n.grid-4 {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: repeat(4, minmax(0, 1fr));\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-column: 1 / 5;\n grid-row: 1;\n }\n\n .column-1 {\n grid-column: 1 / 4;\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 4;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 2 / 5;\n grid-row: 3;\n }\n\n .column-4 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .landing-page__call-to-action {\n min-height: 100%;\n }\n\n .flash-message {\n margin-bottom: 10px;\n }\n\n @media screen and (max-width: 738px) {\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n .landing-page__call-to-action {\n padding: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .row__information-board {\n width: 100%;\n justify-content: center;\n align-items: center;\n }\n\n .row__mascot {\n display: none;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n grid-template-columns: minmax(0, 100%);\n\n .column-0 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .column-2 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1;\n grid-row: 5;\n }\n\n .column-4 {\n grid-column: 1;\n grid-row: 4;\n }\n }\n}\n\n.public-layout {\n @media screen and (max-width: $no-gap-breakpoint) {\n padding-top: 48px;\n }\n\n .container {\n max-width: 960px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding: 0;\n }\n }\n\n .header {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n height: 48px;\n margin: 10px 0;\n display: flex;\n align-items: stretch;\n justify-content: center;\n flex-wrap: nowrap;\n overflow: hidden;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n position: fixed;\n width: 100%;\n top: 0;\n left: 0;\n margin: 0;\n border-radius: 0;\n box-shadow: none;\n z-index: 110;\n }\n\n & > div {\n flex: 1 1 33.3%;\n min-height: 1px;\n }\n\n .nav-left {\n display: flex;\n align-items: stretch;\n justify-content: flex-start;\n flex-wrap: nowrap;\n }\n\n .nav-center {\n display: flex;\n align-items: stretch;\n justify-content: center;\n flex-wrap: nowrap;\n }\n\n .nav-right {\n display: flex;\n align-items: stretch;\n justify-content: flex-end;\n flex-wrap: nowrap;\n }\n\n .brand {\n display: block;\n padding: 15px;\n\n svg {\n display: block;\n height: 18px;\n width: auto;\n position: relative;\n bottom: -2px;\n fill: $primary-text-color;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n height: 20px;\n }\n }\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 12%);\n }\n }\n\n .nav-link {\n display: flex;\n align-items: center;\n padding: 0 1rem;\n font-size: 12px;\n font-weight: 500;\n text-decoration: none;\n color: $darker-text-color;\n white-space: nowrap;\n text-align: center;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n color: $primary-text-color;\n }\n\n @media screen and (max-width: 550px) {\n &.optional {\n display: none;\n }\n }\n }\n\n .nav-button {\n background: lighten($ui-base-color, 16%);\n margin: 8px;\n margin-left: 0;\n border-radius: 4px;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n background: lighten($ui-base-color, 20%);\n }\n }\n }\n\n $no-columns-breakpoint: 600px;\n\n .grid {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(300px, 3fr) minmax(298px, 1fr);\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-row: 1;\n grid-column: 1;\n }\n\n .column-1 {\n grid-row: 1;\n grid-column: 2;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n grid-template-columns: 100%;\n grid-gap: 0;\n\n .column-1 {\n display: none;\n }\n }\n }\n\n .directory__card {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n\n .page-header {\n @media screen and (max-width: $no-gap-breakpoint) {\n border-bottom: 0;\n }\n }\n\n .public-account-header {\n overflow: hidden;\n margin-bottom: 10px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &.inactive {\n opacity: 0.5;\n\n .public-account-header__image,\n .avatar {\n filter: grayscale(100%);\n }\n\n .logo-button {\n background-color: $secondary-text-color;\n }\n }\n\n &__image {\n border-radius: 4px 4px 0 0;\n overflow: hidden;\n height: 300px;\n position: relative;\n background: darken($ui-base-color, 12%);\n\n &::after {\n content: \"\";\n display: block;\n position: absolute;\n width: 100%;\n height: 100%;\n box-shadow: inset 0 -1px 1px 1px rgba($base-shadow-color, 0.15);\n top: 0;\n left: 0;\n }\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 4px 4px 0 0;\n }\n\n @media screen and (max-width: 600px) {\n height: 200px;\n }\n }\n\n &--no-bar {\n margin-bottom: 0;\n\n .public-account-header__image,\n .public-account-header__image img {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n box-shadow: none;\n\n &__image::after {\n display: none;\n }\n\n &__image,\n &__image img {\n border-radius: 0;\n }\n }\n\n &__bar {\n position: relative;\n margin-top: -80px;\n display: flex;\n justify-content: flex-start;\n\n &::before {\n content: \"\";\n display: block;\n background: lighten($ui-base-color, 4%);\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: 60px;\n border-radius: 0 0 4px 4px;\n z-index: -1;\n }\n\n .avatar {\n display: block;\n width: 120px;\n height: 120px;\n @include avatar-size(120px);\n padding-left: 20px - 4px;\n flex: 0 0 auto;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 50%;\n border: 4px solid lighten($ui-base-color, 4%);\n background: darken($ui-base-color, 8%);\n @include avatar-radius();\n }\n }\n\n @media screen and (max-width: 600px) {\n margin-top: 0;\n background: lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n padding: 5px;\n\n &::before {\n display: none;\n }\n\n .avatar {\n width: 48px;\n height: 48px;\n @include avatar-size(48px);\n padding: 7px 0;\n padding-left: 10px;\n\n img {\n border: 0;\n border-radius: 4px;\n @include avatar-radius();\n }\n\n @media screen and (max-width: 360px) {\n display: none;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n flex-wrap: wrap;\n }\n }\n\n &__tabs {\n flex: 1 1 auto;\n margin-left: 20px;\n\n &__name {\n padding-top: 20px;\n padding-bottom: 8px;\n\n h1 {\n font-size: 20px;\n line-height: 18px * 1.5;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n text-shadow: 1px 1px 1px $base-shadow-color;\n\n small {\n display: block;\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n @media screen and (max-width: 600px) {\n margin-left: 15px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n &__name {\n padding-top: 0;\n padding-bottom: 0;\n\n h1 {\n font-size: 16px;\n line-height: 24px;\n text-shadow: none;\n\n small {\n color: $darker-text-color;\n }\n }\n }\n }\n\n &__tabs {\n display: flex;\n justify-content: flex-start;\n align-items: stretch;\n height: 58px;\n\n .details-counters {\n display: flex;\n flex-direction: row;\n min-width: 300px;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n .details-counters {\n display: none;\n }\n }\n\n .counter {\n min-width: 33.3%;\n box-sizing: border-box;\n flex: 0 0 auto;\n color: $darker-text-color;\n padding: 10px;\n border-right: 1px solid lighten($ui-base-color, 4%);\n cursor: default;\n text-align: center;\n position: relative;\n\n a {\n display: block;\n }\n\n &:last-child {\n border-right: 0;\n }\n\n &::after {\n display: block;\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n border-bottom: 4px solid $ui-primary-color;\n opacity: 0.5;\n transition: all 400ms ease;\n }\n\n &.active {\n &::after {\n border-bottom: 4px solid $highlight-text-color;\n opacity: 1;\n }\n\n &.inactive::after {\n border-bottom-color: $secondary-text-color;\n }\n }\n\n &:hover {\n &::after {\n opacity: 1;\n transition-duration: 100ms;\n }\n }\n\n a {\n text-decoration: none;\n color: inherit;\n }\n\n .counter-label {\n font-size: 12px;\n display: block;\n }\n\n .counter-number {\n font-weight: 500;\n font-size: 18px;\n margin-bottom: 5px;\n color: $primary-text-color;\n font-family: $font-display, sans-serif;\n }\n }\n\n .spacer {\n flex: 1 1 auto;\n height: 1px;\n }\n\n &__buttons {\n padding: 7px 8px;\n }\n }\n }\n\n &__extra {\n display: none;\n margin-top: 4px;\n\n .public-account-bio {\n border-radius: 0;\n box-shadow: none;\n background: transparent;\n margin: 0 -5px;\n\n .account__header__fields {\n border-top: 1px solid lighten($ui-base-color, 12%);\n }\n\n .roles {\n display: none;\n }\n }\n\n &__links {\n margin-top: -15px;\n font-size: 14px;\n color: $darker-text-color;\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n padding: 15px;\n font-weight: 500;\n\n strong {\n font-weight: 700;\n color: $primary-text-color;\n }\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n flex: 100%;\n }\n }\n }\n\n .account__section-headline {\n border-radius: 4px 4px 0 0;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n\n .detailed-status__meta {\n margin-top: 25px;\n }\n\n .public-account-bio {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n overflow: hidden;\n margin-bottom: 10px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n box-shadow: none;\n margin-bottom: 0;\n border-radius: 0;\n }\n\n .account__header__fields {\n margin: 0;\n border-top: 0;\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n\n .account__header__content {\n padding: 20px;\n padding-bottom: 0;\n color: $primary-text-color;\n }\n\n &__extra,\n .roles {\n padding: 20px;\n font-size: 14px;\n color: $darker-text-color;\n }\n\n .roles {\n padding-bottom: 0;\n }\n }\n\n .directory__list {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: block;\n }\n\n .icon-button {\n font-size: 18px;\n }\n }\n\n .directory__card {\n margin-bottom: 0;\n }\n\n .card-grid {\n display: flex;\n flex-wrap: wrap;\n min-width: 100%;\n margin: 0 -5px;\n\n & > div {\n box-sizing: border-box;\n flex: 1 0 auto;\n width: 300px;\n padding: 0 5px;\n margin-bottom: 10px;\n max-width: 33.333%;\n\n @media screen and (max-width: 900px) {\n max-width: 50%;\n }\n\n @media screen and (max-width: 600px) {\n max-width: 100%;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin: 0;\n border-top: 1px solid lighten($ui-base-color, 8%);\n\n & > div {\n width: 100%;\n padding: 0;\n margin-bottom: 0;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &:last-child {\n border-bottom: 0;\n }\n\n .card__bar {\n background: $ui-base-color;\n\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n }\n }\n }\n }\n}\n","@mixin avatar-radius() {\n border-radius: $ui-avatar-border-size;\n background-position: 50%;\n background-clip: padding-box;\n}\n\n@mixin avatar-size($size:48px) {\n width: $size;\n height: $size;\n background-size: $size $size;\n}\n\n@mixin single-column($media, $parent: '&') {\n .auto-columns #{$parent} {\n @media #{$media} {\n @content;\n }\n }\n .single-column #{$parent} {\n @content;\n }\n}\n\n@mixin limited-single-column($media, $parent: '&') {\n .auto-columns #{$parent}, .single-column #{$parent} {\n @media #{$media} {\n @content;\n }\n }\n}\n\n@mixin multi-columns($media, $parent: '&') {\n .auto-columns #{$parent} {\n @media #{$media} {\n @content;\n }\n }\n .multi-columns #{$parent} {\n @content;\n }\n}\n\n@mixin fullwidth-gallery {\n &.full-width {\n margin-left: -14px;\n margin-right: -14px;\n width: inherit;\n max-width: none;\n height: 250px;\n border-radius: 0px;\n }\n}\n\n@mixin search-input() {\n outline: 0;\n box-sizing: border-box;\n width: 100%;\n border: none;\n box-shadow: none;\n font-family: inherit;\n background: $ui-base-color;\n color: $darker-text-color;\n font-size: 14px;\n margin: 0;\n}\n\n@mixin search-popout() {\n background: $simple-background-color;\n border-radius: 4px;\n padding: 10px 14px;\n padding-bottom: 14px;\n margin-top: 10px;\n color: $light-text-color;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n\n h4 {\n text-transform: uppercase;\n color: $light-text-color;\n font-size: 13px;\n font-weight: 500;\n margin-bottom: 10px;\n }\n\n li {\n padding: 4px 0;\n }\n\n ul {\n margin-bottom: 10px;\n }\n\n em {\n font-weight: 500;\n color: $inverted-text-color;\n }\n}\n","// Commonly used web colors\n$black: #000000; // Black\n$white: #ffffff; // White\n$success-green: #79bd9a; // Padua\n$error-red: #df405a; // Cerise\n$warning-red: #ff5050; // Sunset Orange\n$gold-star: #ca8f04; // Dark Goldenrod\n\n$red-bookmark: $warning-red;\n\n// Pleroma-Dark colors\n$pleroma-bg: #121a24;\n$pleroma-fg: #182230;\n$pleroma-text: #b9b9ba;\n$pleroma-links: #d8a070;\n\n// Values from the classic Mastodon UI\n$classic-base-color: $pleroma-bg;\n$classic-primary-color: #9baec8;\n$classic-secondary-color: #d9e1e8;\n$classic-highlight-color: #d8a070;\n\n// Variables for defaults in UI\n$base-shadow-color: $black !default;\n$base-overlay-background: $black !default;\n$base-border-color: $white !default;\n$simple-background-color: $white !default;\n$valid-value-color: $success-green !default;\n$error-value-color: $error-red !default;\n\n// Tell UI to use selected colors\n$ui-base-color: $classic-base-color !default; // Darkest\n$ui-base-lighter-color: lighten($ui-base-color, 26%) !default; // Lighter darkest\n$ui-primary-color: $classic-primary-color !default; // Lighter\n$ui-secondary-color: $classic-secondary-color !default; // Lightest\n$ui-highlight-color: $classic-highlight-color !default;\n\n// Variables for texts\n$primary-text-color: $white !default;\n$darker-text-color: $ui-primary-color !default;\n$dark-text-color: $ui-base-lighter-color !default;\n$secondary-text-color: $ui-secondary-color !default;\n$highlight-text-color: $ui-highlight-color !default;\n$action-button-color: $ui-base-lighter-color !default;\n// For texts on inverted backgrounds\n$inverted-text-color: $ui-base-color !default;\n$lighter-text-color: $ui-base-lighter-color !default;\n$light-text-color: $ui-primary-color !default;\n\n// Language codes that uses CJK fonts\n$cjk-langs: ja, ko, zh-CN, zh-HK, zh-TW;\n\n// Variables for components\n$media-modal-media-max-width: 100%;\n// put margins on top and bottom of image to avoid the screen covered by image.\n$media-modal-media-max-height: 80%;\n\n$no-gap-breakpoint: 415px;\n\n$font-sans-serif: sans-serif !default;\n$font-display: sans-serif !default;\n$font-monospace: monospace !default;\n\n// Avatar border size (8% default, 100% for rounded avatars)\n$ui-avatar-border-size: 8%;\n\n// More variables\n$dismiss-overlay-width: 4rem;\n",".no-list {\n list-style: none;\n\n li {\n display: inline-block;\n margin: 0 5px;\n }\n}\n\n.recovery-codes {\n list-style: none;\n margin: 0 auto;\n\n li {\n font-size: 125%;\n line-height: 1.5;\n letter-spacing: 1px;\n }\n}\n",".modal-layout {\n background: $ui-base-color url('data:image/svg+xml;utf8,') repeat-x bottom fixed;\n display: flex;\n flex-direction: column;\n height: 100vh;\n padding: 0;\n}\n\n.modal-layout__mastodon {\n display: flex;\n flex: 1;\n flex-direction: column;\n justify-content: flex-end;\n\n > * {\n flex: 1;\n max-height: 235px;\n }\n}\n\n@media screen and (max-width: 600px) {\n .account-header {\n margin-top: 0;\n }\n}\n",".public-layout {\n .footer {\n text-align: left;\n padding-top: 20px;\n padding-bottom: 60px;\n font-size: 12px;\n color: lighten($ui-base-color, 34%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding-left: 20px;\n padding-right: 20px;\n }\n\n .grid {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: 1fr 1fr 2fr 1fr 1fr;\n\n .column-0 {\n grid-column: 1;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-1 {\n grid-column: 2;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-2 {\n grid-column: 3;\n grid-row: 1;\n min-width: 0;\n text-align: center;\n\n h4 a {\n color: lighten($ui-base-color, 34%);\n }\n }\n\n .column-3 {\n grid-column: 4;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-4 {\n grid-column: 5;\n grid-row: 1;\n min-width: 0;\n }\n\n @media screen and (max-width: 690px) {\n grid-template-columns: 1fr 2fr 1fr;\n\n .column-0,\n .column-1 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 2;\n }\n\n .column-3,\n .column-4 {\n grid-column: 3;\n }\n\n .column-4 {\n grid-row: 2;\n }\n }\n\n @media screen and (max-width: 600px) {\n .column-1 {\n display: block;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n .column-0,\n .column-1,\n .column-3,\n .column-4 {\n display: none;\n }\n }\n }\n\n h4 {\n text-transform: uppercase;\n font-weight: 700;\n margin-bottom: 8px;\n color: $darker-text-color;\n\n a {\n color: inherit;\n text-decoration: none;\n }\n }\n\n ul a {\n text-decoration: none;\n color: lighten($ui-base-color, 34%);\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n\n .brand {\n svg {\n display: block;\n height: 36px;\n width: auto;\n margin: 0 auto;\n fill: lighten($ui-base-color, 34%);\n }\n\n &:hover,\n &:focus,\n &:active {\n svg {\n fill: lighten($ui-base-color, 38%);\n }\n }\n }\n }\n}\n",".compact-header {\n h1 {\n font-size: 24px;\n line-height: 28px;\n color: $darker-text-color;\n font-weight: 500;\n margin-bottom: 20px;\n padding: 0 10px;\n word-wrap: break-word;\n\n @media screen and (max-width: 740px) {\n text-align: center;\n padding: 20px 10px 0;\n }\n\n a {\n color: inherit;\n text-decoration: none;\n }\n\n small {\n font-weight: 400;\n color: $secondary-text-color;\n }\n\n img {\n display: inline-block;\n margin-bottom: -5px;\n margin-right: 15px;\n width: 36px;\n height: 36px;\n }\n }\n}\n",".hero-widget {\n margin-bottom: 10px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &__img {\n width: 100%;\n position: relative;\n overflow: hidden;\n border-radius: 4px 4px 0 0;\n background: $base-shadow-color;\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 4px 4px 0 0;\n }\n }\n\n &__text {\n background: $ui-base-color;\n padding: 20px;\n border-radius: 0 0 4px 4px;\n font-size: 15px;\n color: $darker-text-color;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n p {\n margin-bottom: 20px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n em {\n display: inline;\n margin: 0;\n padding: 0;\n font-weight: 700;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n color: lighten($darker-text-color, 10%);\n }\n\n a {\n color: $secondary-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n}\n\n.endorsements-widget {\n margin-bottom: 10px;\n padding-bottom: 10px;\n\n h4 {\n padding: 10px;\n text-transform: uppercase;\n font-weight: 700;\n font-size: 13px;\n color: $darker-text-color;\n }\n\n .account {\n padding: 10px 0;\n\n &:last-child {\n border-bottom: 0;\n }\n\n .account__display-name {\n display: flex;\n align-items: center;\n }\n\n .account__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n }\n\n .trends__item {\n padding: 10px;\n }\n}\n\n.trends-widget {\n h4 {\n color: $darker-text-color;\n }\n}\n\n.box-widget {\n padding: 20px;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n}\n\n.placeholder-widget {\n padding: 16px;\n border-radius: 4px;\n border: 2px dashed $dark-text-color;\n text-align: center;\n color: $darker-text-color;\n margin-bottom: 10px;\n}\n\n.contact-widget {\n min-height: 100%;\n font-size: 15px;\n color: $darker-text-color;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n padding: 0;\n\n h4 {\n padding: 10px;\n text-transform: uppercase;\n font-weight: 700;\n font-size: 13px;\n color: $darker-text-color;\n }\n\n .account {\n border-bottom: 0;\n padding: 10px 0;\n padding-top: 5px;\n }\n\n & > a {\n display: inline-block;\n padding: 10px;\n padding-top: 0;\n color: $darker-text-color;\n text-decoration: none;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.moved-account-widget {\n padding: 15px;\n padding-bottom: 20px;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n color: $secondary-text-color;\n font-weight: 400;\n margin-bottom: 10px;\n\n strong,\n a {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n color: inherit;\n text-decoration: underline;\n\n &.mention {\n text-decoration: none;\n\n span {\n text-decoration: none;\n }\n\n &:focus,\n &:hover,\n &:active {\n text-decoration: none;\n\n span {\n text-decoration: underline;\n }\n }\n }\n }\n\n &__message {\n margin-bottom: 15px;\n\n .fa {\n margin-right: 5px;\n color: $darker-text-color;\n }\n }\n\n &__card {\n .detailed-status__display-avatar {\n position: relative;\n cursor: pointer;\n }\n\n .detailed-status__display-name {\n margin-bottom: 0;\n text-decoration: none;\n\n span {\n font-weight: 400;\n }\n }\n }\n}\n\n.memoriam-widget {\n padding: 20px;\n border-radius: 4px;\n background: $base-shadow-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n font-size: 14px;\n color: $darker-text-color;\n margin-bottom: 10px;\n}\n\n.page-header {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n padding: 60px 15px;\n text-align: center;\n margin: 10px 0;\n\n h1 {\n color: $primary-text-color;\n font-size: 36px;\n line-height: 1.1;\n font-weight: 700;\n margin-bottom: 10px;\n }\n\n p {\n font-size: 15px;\n color: $darker-text-color;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-top: 0;\n background: lighten($ui-base-color, 4%);\n\n h1 {\n font-size: 24px;\n }\n }\n}\n\n.directory {\n background: $ui-base-color;\n border-radius: 4px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &__tag {\n box-sizing: border-box;\n margin-bottom: 10px;\n\n & > a,\n & > div {\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: $ui-base-color;\n border-radius: 4px;\n padding: 15px;\n text-decoration: none;\n color: inherit;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n }\n\n & > a {\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 8%);\n }\n }\n\n &.active > a {\n background: $ui-highlight-color;\n cursor: default;\n }\n\n &.disabled > div {\n opacity: 0.5;\n cursor: default;\n }\n\n h4 {\n flex: 1 1 auto;\n font-size: 18px;\n font-weight: 700;\n color: $primary-text-color;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n .fa {\n color: $darker-text-color;\n }\n\n small {\n display: block;\n font-weight: 400;\n font-size: 15px;\n margin-top: 8px;\n color: $darker-text-color;\n }\n }\n\n &.active h4 {\n &,\n .fa,\n small {\n color: $primary-text-color;\n }\n }\n\n .avatar-stack {\n flex: 0 0 auto;\n width: (36px + 4px) * 3;\n }\n\n &.active .avatar-stack .account__avatar {\n border-color: $ui-highlight-color;\n }\n }\n}\n\n.avatar-stack {\n display: flex;\n justify-content: flex-end;\n\n .account__avatar {\n flex: 0 0 auto;\n width: 36px;\n height: 36px;\n border-radius: 50%;\n position: relative;\n margin-left: -10px;\n background: darken($ui-base-color, 8%);\n border: 2px solid $ui-base-color;\n\n &:nth-child(1) {\n z-index: 1;\n }\n\n &:nth-child(2) {\n z-index: 2;\n }\n\n &:nth-child(3) {\n z-index: 3;\n }\n }\n}\n\n.accounts-table {\n width: 100%;\n\n .account {\n padding: 0;\n border: 0;\n }\n\n strong {\n font-weight: 700;\n }\n\n thead th {\n text-align: center;\n text-transform: uppercase;\n color: $darker-text-color;\n font-weight: 700;\n padding: 10px;\n\n &:first-child {\n text-align: left;\n }\n }\n\n tbody td {\n padding: 15px 0;\n vertical-align: middle;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n tbody tr:last-child td {\n border-bottom: 0;\n }\n\n &__count {\n width: 120px;\n text-align: center;\n font-size: 15px;\n font-weight: 500;\n color: $primary-text-color;\n\n small {\n display: block;\n color: $darker-text-color;\n font-weight: 400;\n font-size: 14px;\n }\n }\n\n &__comment {\n width: 50%;\n vertical-align: initial !important;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n tbody td.optional {\n display: none;\n }\n }\n}\n\n.moved-account-widget,\n.memoriam-widget,\n.box-widget,\n.contact-widget,\n.landing-page__information.contact-widget,\n.directory,\n.page-header {\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n box-shadow: none;\n border-radius: 0;\n }\n}\n\n$maximum-width: 1235px;\n$fluid-breakpoint: $maximum-width + 20px;\n\n.statuses-grid {\n min-height: 600px;\n\n @media screen and (max-width: 640px) {\n width: 100% !important; // Masonry layout is unnecessary at this width\n }\n\n &__item {\n width: (960px - 20px) / 3;\n\n @media screen and (max-width: $fluid-breakpoint) {\n width: (940px - 20px) / 3;\n }\n\n @media screen and (max-width: 640px) {\n width: 100%;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n width: 100vw;\n }\n }\n\n .detailed-status {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 1px solid lighten($ui-base-color, 16%);\n }\n\n &.compact {\n .detailed-status__meta {\n margin-top: 15px;\n }\n\n .status__content {\n font-size: 15px;\n line-height: 20px;\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n .status__content__spoiler-link {\n line-height: 20px;\n margin: 0;\n }\n }\n\n .media-gallery,\n .status-card,\n .video-player {\n margin-top: 15px;\n }\n }\n }\n}\n\n.notice-widget {\n margin-bottom: 10px;\n color: $darker-text-color;\n\n p {\n margin-bottom: 10px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n font-size: 14px;\n line-height: 20px;\n }\n}\n\n.notice-widget,\n.placeholder-widget {\n a {\n text-decoration: none;\n font-weight: 500;\n color: $ui-highlight-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.table-of-contents {\n background: darken($ui-base-color, 4%);\n min-height: 100%;\n font-size: 14px;\n border-radius: 4px;\n\n li a {\n display: block;\n font-weight: 500;\n padding: 15px;\n overflow: hidden;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n text-decoration: none;\n color: $primary-text-color;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n\n li:last-child a {\n border-bottom: 0;\n }\n\n li ul {\n padding-left: 20px;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n }\n}\n","$no-columns-breakpoint: 600px;\n\ncode {\n font-family: $font-monospace, monospace;\n font-weight: 400;\n}\n\n.form-container {\n max-width: 400px;\n padding: 20px;\n margin: 0 auto;\n}\n\n.simple_form {\n .input {\n margin-bottom: 15px;\n overflow: hidden;\n\n &.hidden {\n margin: 0;\n }\n\n &.radio_buttons {\n .radio {\n margin-bottom: 15px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .radio > label {\n position: relative;\n padding-left: 28px;\n\n input {\n position: absolute;\n top: -2px;\n left: 0;\n }\n }\n }\n\n &.boolean {\n position: relative;\n margin-bottom: 0;\n\n .label_input > label {\n font-family: inherit;\n font-size: 14px;\n padding-top: 5px;\n color: $primary-text-color;\n display: block;\n width: auto;\n }\n\n .label_input,\n .hint {\n padding-left: 28px;\n }\n\n .label_input__wrapper {\n position: static;\n }\n\n label.checkbox {\n position: absolute;\n top: 2px;\n left: 0;\n }\n\n label a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: none;\n }\n }\n\n .recommended {\n position: absolute;\n margin: 0 4px;\n margin-top: -2px;\n }\n }\n }\n\n .row {\n display: flex;\n margin: 0 -5px;\n\n .input {\n box-sizing: border-box;\n flex: 1 1 auto;\n width: 50%;\n padding: 0 5px;\n }\n }\n\n .hint {\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n }\n\n code {\n border-radius: 3px;\n padding: 0.2em 0.4em;\n background: darken($ui-base-color, 12%);\n }\n }\n\n span.hint {\n display: block;\n font-size: 12px;\n margin-top: 4px;\n }\n\n p.hint {\n margin-bottom: 15px;\n color: $darker-text-color;\n\n &.subtle-hint {\n text-align: center;\n font-size: 12px;\n line-height: 18px;\n margin-top: 15px;\n margin-bottom: 0;\n }\n }\n\n .card {\n margin-bottom: 15px;\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n .input.with_floating_label {\n .label_input {\n display: flex;\n\n & > label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 500;\n min-width: 150px;\n flex: 0 0 auto;\n }\n\n input,\n select {\n flex: 1 1 auto;\n }\n }\n\n &.select .hint {\n margin-top: 6px;\n margin-left: 150px;\n }\n }\n\n .input.with_label {\n .label_input > label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: block;\n margin-bottom: 8px;\n word-wrap: break-word;\n font-weight: 500;\n }\n\n .hint {\n margin-top: 6px;\n }\n\n ul {\n flex: 390px;\n }\n }\n\n .input.with_block_label {\n max-width: none;\n\n & > label {\n font-family: inherit;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n font-weight: 500;\n padding-top: 5px;\n }\n\n .hint {\n margin-bottom: 15px;\n }\n\n ul {\n columns: 2;\n }\n }\n\n .required abbr {\n text-decoration: none;\n color: lighten($error-value-color, 12%);\n }\n\n .fields-group {\n margin-bottom: 25px;\n\n .input:last-child {\n margin-bottom: 0;\n }\n }\n\n .fields-row {\n display: flex;\n margin: 0 -10px;\n padding-top: 5px;\n margin-bottom: 25px;\n\n .input {\n max-width: none;\n }\n\n &__column {\n box-sizing: border-box;\n padding: 0 10px;\n flex: 1 1 auto;\n min-height: 1px;\n\n &-6 {\n max-width: 50%;\n }\n\n .actions {\n margin-top: 27px;\n }\n }\n\n .fields-group:last-child,\n .fields-row__column.fields-group {\n margin-bottom: 0;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n margin-bottom: 0;\n\n &__column {\n max-width: none;\n }\n\n .fields-group:last-child,\n .fields-row__column.fields-group,\n .fields-row__column {\n margin-bottom: 25px;\n }\n }\n }\n\n .input.radio_buttons .radio label {\n margin-bottom: 5px;\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: block;\n width: auto;\n }\n\n .check_boxes {\n .checkbox {\n label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: inline-block;\n width: auto;\n position: relative;\n padding-top: 5px;\n padding-left: 25px;\n flex: 1 1 auto;\n }\n\n input[type=checkbox] {\n position: absolute;\n left: 0;\n top: 5px;\n margin: 0;\n }\n }\n }\n\n .input.static .label_input__wrapper {\n font-size: 16px;\n padding: 10px;\n border: 1px solid $dark-text-color;\n border-radius: 4px;\n }\n\n input[type=text],\n input[type=number],\n input[type=email],\n input[type=password],\n textarea {\n box-sizing: border-box;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n width: 100%;\n outline: 0;\n font-family: inherit;\n resize: vertical;\n background: darken($ui-base-color, 10%);\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n padding: 10px;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &:invalid {\n box-shadow: none;\n }\n\n &:focus:invalid:not(:placeholder-shown) {\n border-color: lighten($error-red, 12%);\n }\n\n &:required:valid {\n border-color: $valid-value-color;\n }\n\n &:hover {\n border-color: darken($ui-base-color, 20%);\n }\n\n &:active,\n &:focus {\n border-color: $highlight-text-color;\n background: darken($ui-base-color, 8%);\n }\n }\n\n .input.field_with_errors {\n label {\n color: lighten($error-red, 12%);\n }\n\n input[type=text],\n input[type=number],\n input[type=email],\n input[type=password],\n textarea,\n select {\n border-color: lighten($error-red, 12%);\n }\n\n .error {\n display: block;\n font-weight: 500;\n color: lighten($error-red, 12%);\n margin-top: 4px;\n }\n }\n\n .input.disabled {\n opacity: 0.5;\n }\n\n .actions {\n margin-top: 30px;\n display: flex;\n\n &.actions--top {\n margin-top: 0;\n margin-bottom: 30px;\n }\n }\n\n button,\n .button,\n .block-button {\n display: block;\n width: 100%;\n border: 0;\n border-radius: 4px;\n background: $ui-highlight-color;\n color: $primary-text-color;\n font-size: 18px;\n line-height: inherit;\n height: auto;\n padding: 10px;\n text-transform: uppercase;\n text-decoration: none;\n text-align: center;\n box-sizing: border-box;\n cursor: pointer;\n font-weight: 500;\n outline: 0;\n margin-bottom: 10px;\n margin-right: 10px;\n\n &:last-child {\n margin-right: 0;\n }\n\n &:hover {\n background-color: lighten($ui-highlight-color, 5%);\n }\n\n &:active,\n &:focus {\n background-color: darken($ui-highlight-color, 5%);\n }\n\n &:disabled:hover {\n background-color: $ui-primary-color;\n }\n\n &.negative {\n background: $error-value-color;\n\n &:hover {\n background-color: lighten($error-value-color, 5%);\n }\n\n &:active,\n &:focus {\n background-color: darken($error-value-color, 5%);\n }\n }\n }\n\n select {\n appearance: none;\n box-sizing: border-box;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n width: 100%;\n outline: 0;\n font-family: inherit;\n resize: vertical;\n background: darken($ui-base-color, 10%) url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center / auto 16px;\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n padding-left: 10px;\n padding-right: 30px;\n height: 41px;\n }\n\n h4 {\n margin-bottom: 15px !important;\n }\n\n .label_input {\n &__wrapper {\n position: relative;\n }\n\n &__append {\n position: absolute;\n right: 3px;\n top: 1px;\n padding: 10px;\n padding-bottom: 9px;\n font-size: 16px;\n color: $dark-text-color;\n font-family: inherit;\n pointer-events: none;\n cursor: default;\n max-width: 140px;\n white-space: nowrap;\n overflow: hidden;\n\n &::after {\n content: '';\n display: block;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 1px;\n width: 5px;\n background-image: linear-gradient(to right, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));\n }\n }\n }\n\n &__overlay-area {\n position: relative;\n\n &__blurred form {\n filter: blur(2px);\n }\n\n &__overlay {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n background: rgba($ui-base-color, 0.65);\n border-radius: 4px;\n margin-left: -4px;\n margin-top: -4px;\n padding: 4px;\n\n &__content {\n text-align: center;\n\n &.rich-formatting {\n &,\n p {\n color: $primary-text-color;\n }\n }\n }\n }\n }\n}\n\n.block-icon {\n display: block;\n margin: 0 auto;\n margin-bottom: 10px;\n font-size: 24px;\n}\n\n.flash-message {\n background: lighten($ui-base-color, 8%);\n color: $darker-text-color;\n border-radius: 4px;\n padding: 15px 10px;\n margin-bottom: 30px;\n text-align: center;\n\n &.notice {\n border: 1px solid rgba($valid-value-color, 0.5);\n background: rgba($valid-value-color, 0.25);\n color: $valid-value-color;\n }\n\n &.alert {\n border: 1px solid rgba($error-value-color, 0.5);\n background: rgba($error-value-color, 0.25);\n color: $error-value-color;\n }\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n\n &:hover {\n color: $primary-text-color;\n text-decoration: underline;\n }\n }\n\n p {\n margin-bottom: 15px;\n }\n\n .oauth-code {\n outline: 0;\n box-sizing: border-box;\n display: block;\n width: 100%;\n border: none;\n padding: 10px;\n font-family: $font-monospace, monospace;\n background: $ui-base-color;\n color: $primary-text-color;\n font-size: 14px;\n margin: 0;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n @media screen and (max-width: 740px) and (min-width: 441px) {\n margin-top: 40px;\n }\n}\n\n.form-footer {\n margin-top: 30px;\n text-align: center;\n\n a {\n color: $darker-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.quick-nav {\n list-style: none;\n margin-bottom: 25px;\n font-size: 14px;\n\n li {\n display: inline-block;\n margin-right: 10px;\n }\n\n a {\n color: $highlight-text-color;\n text-transform: uppercase;\n text-decoration: none;\n font-weight: 700;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($highlight-text-color, 8%);\n }\n }\n}\n\n.oauth-prompt,\n.follow-prompt {\n margin-bottom: 30px;\n color: $darker-text-color;\n\n h2 {\n font-size: 16px;\n margin-bottom: 30px;\n text-align: center;\n }\n\n strong {\n color: $secondary-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n @media screen and (max-width: 740px) and (min-width: 441px) {\n margin-top: 40px;\n }\n}\n\n.qr-wrapper {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n}\n\n.qr-code {\n flex: 0 0 auto;\n background: $simple-background-color;\n padding: 4px;\n margin: 0 10px 20px 0;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n display: inline-block;\n\n svg {\n display: block;\n margin: 0;\n }\n}\n\n.qr-alternative {\n margin-bottom: 20px;\n color: $secondary-text-color;\n flex: 150px;\n\n samp {\n display: block;\n font-size: 14px;\n }\n}\n\n.table-form {\n p {\n margin-bottom: 15px;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n }\n}\n\n.simple_form,\n.table-form {\n .warning {\n box-sizing: border-box;\n background: rgba($error-value-color, 0.5);\n color: $primary-text-color;\n text-shadow: 1px 1px 0 rgba($base-shadow-color, 0.3);\n box-shadow: 0 2px 6px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n padding: 10px;\n margin-bottom: 15px;\n\n a {\n color: $primary-text-color;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n strong {\n font-weight: 600;\n display: block;\n margin-bottom: 5px;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n\n .fa {\n font-weight: 400;\n }\n }\n }\n}\n\n.action-pagination {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n\n .actions,\n .pagination {\n flex: 1 1 auto;\n }\n\n .actions {\n padding: 30px 0;\n padding-right: 20px;\n flex: 0 0 auto;\n }\n}\n\n.post-follow-actions {\n text-align: center;\n color: $darker-text-color;\n\n div {\n margin-bottom: 4px;\n }\n}\n\n.alternative-login {\n margin-top: 20px;\n margin-bottom: 20px;\n\n h4 {\n font-size: 16px;\n color: $primary-text-color;\n text-align: center;\n margin-bottom: 20px;\n border: 0;\n padding: 0;\n }\n\n .button {\n display: block;\n }\n}\n\n.scope-danger {\n color: $warning-red;\n}\n\n.form_admin_settings_site_short_description,\n.form_admin_settings_site_description,\n.form_admin_settings_site_extended_description,\n.form_admin_settings_site_terms,\n.form_admin_settings_custom_css,\n.form_admin_settings_closed_registrations_message {\n textarea {\n font-family: $font-monospace, monospace;\n }\n}\n\n.input-copy {\n background: darken($ui-base-color, 10%);\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n display: flex;\n align-items: center;\n padding-right: 4px;\n position: relative;\n top: 1px;\n transition: border-color 300ms linear;\n\n &__wrapper {\n flex: 1 1 auto;\n }\n\n input[type=text] {\n background: transparent;\n border: 0;\n padding: 10px;\n font-size: 14px;\n font-family: $font-monospace, monospace;\n }\n\n button {\n flex: 0 0 auto;\n margin: 4px;\n text-transform: none;\n font-weight: 400;\n font-size: 14px;\n padding: 7px 18px;\n padding-bottom: 6px;\n width: auto;\n transition: background 300ms linear;\n }\n\n &.copied {\n border-color: $valid-value-color;\n transition: none;\n\n button {\n background: $valid-value-color;\n transition: none;\n }\n }\n}\n\n.connection-prompt {\n margin-bottom: 25px;\n\n .fa-link {\n background-color: darken($ui-base-color, 4%);\n border-radius: 100%;\n font-size: 24px;\n padding: 10px;\n }\n\n &__column {\n align-items: center;\n display: flex;\n flex: 1;\n flex-direction: column;\n flex-shrink: 1;\n max-width: 50%;\n\n &-sep {\n align-self: center;\n flex-grow: 0;\n overflow: visible;\n position: relative;\n z-index: 1;\n }\n\n p {\n word-break: break-word;\n }\n }\n\n .account__avatar {\n margin-bottom: 20px;\n }\n\n &__connection {\n background-color: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n padding: 25px 10px;\n position: relative;\n text-align: center;\n\n &::after {\n background-color: darken($ui-base-color, 4%);\n content: '';\n display: block;\n height: 100%;\n left: 50%;\n position: absolute;\n top: 0;\n width: 1px;\n }\n }\n\n &__row {\n align-items: flex-start;\n display: flex;\n flex-direction: row;\n }\n}\n",".card {\n & > a {\n display: block;\n text-decoration: none;\n color: inherit;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n box-shadow: none;\n }\n\n &:hover,\n &:active,\n &:focus {\n .card__bar {\n background: lighten($ui-base-color, 8%);\n }\n }\n }\n\n &__img {\n height: 130px;\n position: relative;\n background: darken($ui-base-color, 12%);\n border-radius: 4px 4px 0 0;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n object-fit: cover;\n border-radius: 4px 4px 0 0;\n }\n\n @media screen and (max-width: 600px) {\n height: 200px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n\n &__bar {\n position: relative;\n padding: 15px;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n\n .avatar {\n flex: 0 0 auto;\n width: 48px;\n height: 48px;\n @include avatar-size(48px);\n padding-top: 2px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n @include avatar-radius();\n background: darken($ui-base-color, 8%);\n object-fit: cover;\n }\n }\n\n .display-name {\n margin-left: 15px;\n text-align: left;\n\n strong {\n font-size: 15px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n span {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n}\n\n.pagination {\n padding: 30px 0;\n text-align: center;\n overflow: hidden;\n\n a,\n .current,\n .newer,\n .older,\n .page,\n .gap {\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 500;\n display: inline-block;\n padding: 6px 10px;\n text-decoration: none;\n }\n\n .current {\n background: $simple-background-color;\n border-radius: 100px;\n color: $inverted-text-color;\n cursor: default;\n margin: 0 10px;\n }\n\n .gap {\n cursor: default;\n }\n\n .older,\n .newer {\n text-transform: uppercase;\n color: $secondary-text-color;\n }\n\n .older {\n float: left;\n padding-left: 0;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n .newer {\n float: right;\n padding-right: 0;\n\n .fa {\n display: inline-block;\n margin-left: 5px;\n }\n }\n\n .disabled {\n cursor: default;\n color: lighten($inverted-text-color, 10%);\n }\n\n @media screen and (max-width: 700px) {\n padding: 30px 20px;\n\n .page {\n display: none;\n }\n\n .newer,\n .older {\n display: inline-block;\n }\n }\n}\n\n.nothing-here {\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n color: $light-text-color;\n font-size: 14px;\n font-weight: 500;\n text-align: center;\n display: flex;\n justify-content: center;\n align-items: center;\n cursor: default;\n border-radius: 4px;\n padding: 20px;\n min-height: 30vh;\n\n &--under-tabs {\n border-radius: 0 0 4px 4px;\n }\n\n &--flexible {\n box-sizing: border-box;\n min-height: 100%;\n }\n}\n\n.account-role,\n.simple_form .recommended {\n display: inline-block;\n padding: 4px 6px;\n cursor: default;\n border-radius: 3px;\n font-size: 12px;\n line-height: 12px;\n font-weight: 500;\n color: $ui-secondary-color;\n background-color: rgba($ui-secondary-color, 0.1);\n border: 1px solid rgba($ui-secondary-color, 0.5);\n\n &.moderator {\n color: $success-green;\n background-color: rgba($success-green, 0.1);\n border-color: rgba($success-green, 0.5);\n }\n\n &.admin {\n color: lighten($error-red, 12%);\n background-color: rgba(lighten($error-red, 12%), 0.1);\n border-color: rgba(lighten($error-red, 12%), 0.5);\n }\n}\n\n.account__header__fields {\n max-width: 100vw;\n padding: 0;\n margin: 15px -15px -15px;\n border: 0 none;\n border-top: 1px solid lighten($ui-base-color, 12%);\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n font-size: 14px;\n line-height: 20px;\n\n dl {\n display: flex;\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n }\n\n dt,\n dd {\n box-sizing: border-box;\n padding: 14px;\n text-align: center;\n max-height: 48px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n dt {\n font-weight: 500;\n width: 120px;\n flex: 0 0 auto;\n color: $secondary-text-color;\n background: rgba(darken($ui-base-color, 8%), 0.5);\n }\n\n dd {\n flex: 1 1 auto;\n color: $darker-text-color;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n\n .verified {\n border: 1px solid rgba($valid-value-color, 0.5);\n background: rgba($valid-value-color, 0.25);\n\n a {\n color: $valid-value-color;\n font-weight: 500;\n }\n\n &__mark {\n color: $valid-value-color;\n }\n }\n\n dl:last-child {\n border-bottom: 0;\n }\n}\n\n.directory__tag .trends__item__current {\n width: auto;\n}\n\n.pending-account {\n &__header {\n color: $darker-text-color;\n\n a {\n color: $ui-secondary-color;\n text-decoration: none;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n\n strong {\n color: $primary-text-color;\n font-weight: 700;\n }\n }\n\n &__body {\n margin-top: 10px;\n }\n}\n",".activity-stream {\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n overflow: hidden;\n margin-bottom: 10px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n border-radius: 0;\n box-shadow: none;\n }\n\n &--headless {\n border-radius: 0;\n margin: 0;\n box-shadow: none;\n\n .detailed-status,\n .status {\n border-radius: 0 !important;\n }\n }\n\n div[data-component] {\n width: 100%;\n }\n\n .entry {\n background: $ui-base-color;\n\n .detailed-status,\n .status,\n .load-more {\n animation: none;\n }\n\n &:last-child {\n .detailed-status,\n .status,\n .load-more {\n border-bottom: 0;\n border-radius: 0 0 4px 4px;\n }\n }\n\n &:first-child {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 4px 4px 0 0;\n }\n\n &:last-child {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 4px;\n }\n }\n }\n\n @media screen and (max-width: 740px) {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 0 !important;\n }\n }\n }\n\n &--highlighted .entry {\n background: lighten($ui-base-color, 8%);\n }\n}\n\n.button.logo-button {\n flex: 0 auto;\n font-size: 14px;\n background: $ui-highlight-color;\n color: $primary-text-color;\n text-transform: none;\n line-height: 36px;\n height: auto;\n padding: 3px 15px;\n border: 0;\n\n svg {\n width: 20px;\n height: auto;\n vertical-align: middle;\n margin-right: 5px;\n fill: $primary-text-color;\n }\n\n &:active,\n &:focus,\n &:hover {\n background: lighten($ui-highlight-color, 10%);\n }\n\n &:disabled,\n &.disabled {\n &:active,\n &:focus,\n &:hover {\n background: $ui-primary-color;\n }\n }\n\n &.button--destructive {\n &:active,\n &:focus,\n &:hover {\n background: $error-red;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n svg {\n display: none;\n }\n }\n}\n\n.embed,\n.public-layout {\n .detailed-status {\n padding: 15px;\n }\n\n .status {\n padding: 15px 15px 15px (48px + 15px * 2);\n min-height: 48px + 2px;\n\n &__avatar {\n left: 15px;\n top: 17px;\n }\n\n &__content {\n padding-top: 5px;\n }\n\n &__prepend {\n padding: 8px 0;\n padding-bottom: 2px;\n margin: initial;\n margin-left: 48px + 15px * 2;\n padding-top: 15px;\n }\n\n &__prepend-icon-wrapper {\n position: absolute;\n margin: initial;\n float: initial;\n width: auto;\n left: -32px;\n }\n\n .media-gallery,\n &__action-bar,\n .video-player {\n margin-top: 10px;\n }\n }\n}\n\n// Styling from upstream's WebUI, as public pages use the same layout\n.embed,\n.public-layout {\n .status {\n .status__info {\n font-size: 15px;\n display: initial;\n }\n\n .status__relative-time {\n color: $dark-text-color;\n float: right;\n font-size: 14px;\n width: auto;\n margin: initial;\n padding: initial;\n }\n\n .status__info .status__display-name {\n display: block;\n max-width: 100%;\n padding: 6px 0;\n padding-right: 25px;\n margin: initial;\n\n .display-name strong {\n display: inline;\n }\n }\n\n .status__avatar {\n height: 48px;\n position: absolute;\n width: 48px;\n margin: initial;\n }\n }\n}\n\n.rtl {\n .embed,\n .public-layout {\n .status {\n padding-left: 10px;\n padding-right: 68px;\n\n .status__info .status__display-name {\n padding-left: 25px;\n padding-right: 0;\n }\n\n .status__relative-time {\n float: left;\n }\n }\n }\n}\n",".app-body {\n -webkit-overflow-scrolling: touch;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n}\n\n.link-button {\n display: block;\n font-size: 15px;\n line-height: 20px;\n color: $ui-highlight-color;\n border: 0;\n background: transparent;\n padding: 0;\n cursor: pointer;\n\n &:hover,\n &:active {\n text-decoration: underline;\n }\n\n &:disabled {\n color: $ui-primary-color;\n cursor: default;\n }\n}\n\n.button {\n background-color: darken($ui-highlight-color, 3%);\n border: 10px none;\n border-radius: 4px;\n box-sizing: border-box;\n color: $primary-text-color;\n cursor: pointer;\n display: inline-block;\n font-family: inherit;\n font-size: 14px;\n font-weight: 500;\n height: 36px;\n letter-spacing: 0;\n line-height: 36px;\n overflow: hidden;\n padding: 0 16px;\n position: relative;\n text-align: center;\n text-transform: uppercase;\n text-decoration: none;\n text-overflow: ellipsis;\n transition: all 100ms ease-in;\n transition-property: background-color;\n white-space: nowrap;\n width: auto;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-highlight-color, 7%);\n transition: all 200ms ease-out;\n transition-property: background-color;\n }\n\n &--destructive {\n transition: none;\n\n &:active,\n &:focus,\n &:hover {\n background-color: $error-red;\n transition: none;\n }\n }\n\n &:disabled {\n background-color: $ui-primary-color;\n cursor: default;\n }\n\n &.button-primary,\n &.button-alternative,\n &.button-secondary,\n &.button-alternative-2 {\n font-size: 16px;\n line-height: 36px;\n height: auto;\n text-transform: none;\n padding: 4px 16px;\n }\n\n &.button-alternative {\n color: $inverted-text-color;\n background: $ui-primary-color;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-primary-color, 4%);\n }\n }\n\n &.button-alternative-2 {\n background: $ui-base-lighter-color;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-base-lighter-color, 4%);\n }\n }\n\n &.button-secondary {\n font-size: 16px;\n line-height: 36px;\n height: auto;\n color: $darker-text-color;\n text-transform: none;\n background: transparent;\n padding: 3px 15px;\n border-radius: 4px;\n border: 1px solid $ui-primary-color;\n\n &:active,\n &:focus,\n &:hover {\n border-color: lighten($ui-primary-color, 4%);\n color: lighten($darker-text-color, 4%);\n }\n\n &:disabled {\n opacity: 0.5;\n }\n }\n\n &.button--block {\n display: block;\n width: 100%;\n }\n}\n\n.icon-button {\n display: inline-block;\n padding: 0;\n color: $action-button-color;\n border: 0;\n border-radius: 4px;\n background: transparent;\n cursor: pointer;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($action-button-color, 7%);\n background-color: rgba($action-button-color, 0.15);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n }\n\n &:focus {\n background-color: rgba($action-button-color, 0.3);\n }\n\n &.disabled {\n color: darken($action-button-color, 13%);\n background-color: transparent;\n cursor: default;\n }\n\n &.active {\n color: $highlight-text-color;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &.inverted {\n color: $lighter-text-color;\n\n &:hover,\n &:active,\n &:focus {\n color: darken($lighter-text-color, 7%);\n background-color: rgba($lighter-text-color, 0.15);\n }\n\n &:focus {\n background-color: rgba($lighter-text-color, 0.3);\n }\n\n &.disabled {\n color: lighten($lighter-text-color, 7%);\n background-color: transparent;\n }\n\n &.active {\n color: $highlight-text-color;\n\n &.disabled {\n color: lighten($highlight-text-color, 13%);\n }\n }\n }\n\n &.overlayed {\n box-sizing: content-box;\n background: rgba($base-overlay-background, 0.6);\n color: rgba($primary-text-color, 0.7);\n border-radius: 4px;\n padding: 2px;\n\n &:hover {\n background: rgba($base-overlay-background, 0.9);\n }\n }\n}\n\n.text-icon-button {\n color: $lighter-text-color;\n border: 0;\n border-radius: 4px;\n background: transparent;\n cursor: pointer;\n font-weight: 600;\n font-size: 11px;\n padding: 0 3px;\n line-height: 27px;\n outline: 0;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &:hover,\n &:active,\n &:focus {\n color: darken($lighter-text-color, 7%);\n background-color: rgba($lighter-text-color, 0.15);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n }\n\n &:focus {\n background-color: rgba($lighter-text-color, 0.3);\n }\n\n &.disabled {\n color: lighten($lighter-text-color, 20%);\n background-color: transparent;\n cursor: default;\n }\n\n &.active {\n color: $highlight-text-color;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n}\n\n.dropdown-menu {\n position: absolute;\n transform-origin: 50% 0;\n}\n\n.invisible {\n font-size: 0;\n line-height: 0;\n display: inline-block;\n width: 0;\n height: 0;\n position: absolute;\n\n img,\n svg {\n margin: 0 !important;\n border: 0 !important;\n padding: 0 !important;\n width: 0 !important;\n height: 0 !important;\n }\n}\n\n.ellipsis {\n &::after {\n content: \"…\";\n }\n}\n\n.notification__favourite-icon-wrapper {\n left: 0;\n position: absolute;\n\n .fa.star-icon {\n color: $gold-star;\n }\n}\n\n.star-icon.active {\n color: $gold-star;\n}\n\n.bookmark-icon.active {\n color: $red-bookmark;\n}\n\n.no-reduce-motion .icon-button.star-icon {\n &.activate {\n & > .fa-star {\n animation: spring-rotate-in 1s linear;\n }\n }\n\n &.deactivate {\n & > .fa-star {\n animation: spring-rotate-out 1s linear;\n }\n }\n}\n\n.notification__display-name {\n color: inherit;\n font-weight: 500;\n text-decoration: none;\n\n &:hover {\n color: $primary-text-color;\n text-decoration: underline;\n }\n}\n\n.display-name {\n display: block;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n a {\n color: inherit;\n text-decoration: inherit;\n }\n\n strong {\n height: 18px;\n font-size: 16px;\n font-weight: 500;\n line-height: 18px;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n }\n\n span {\n display: block;\n height: 18px;\n font-size: 15px;\n line-height: 18px;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n }\n\n > a:hover {\n strong {\n text-decoration: underline;\n }\n }\n\n &.inline {\n padding: 0;\n height: 18px;\n font-size: 15px;\n line-height: 18px;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n\n strong {\n display: inline;\n height: auto;\n font-size: inherit;\n line-height: inherit;\n }\n\n span {\n display: inline;\n height: auto;\n font-size: inherit;\n line-height: inherit;\n }\n }\n}\n\n.display-name__html {\n font-weight: 500;\n}\n\n.display-name__account {\n font-size: 14px;\n}\n\n.image-loader {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n\n .image-loader__preview-canvas {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n background: url('~images/void.png') repeat;\n object-fit: contain;\n }\n\n .loading-bar {\n position: relative;\n }\n\n &.image-loader--amorphous .image-loader__preview-canvas {\n display: none;\n }\n}\n\n.zoomable-image {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n img {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n width: auto;\n height: auto;\n object-fit: contain;\n }\n}\n\n.dropdown {\n display: inline-block;\n}\n\n.dropdown__content {\n display: none;\n position: absolute;\n}\n\n.dropdown-menu__separator {\n border-bottom: 1px solid darken($ui-secondary-color, 8%);\n margin: 5px 7px 6px;\n height: 0;\n}\n\n.dropdown-menu {\n background: $ui-secondary-color;\n padding: 4px 0;\n border-radius: 4px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n\n ul {\n list-style: none;\n }\n}\n\n.dropdown-menu__arrow {\n position: absolute;\n width: 0;\n height: 0;\n border: 0 solid transparent;\n\n &.left {\n right: -5px;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: $ui-secondary-color;\n }\n\n &.top {\n bottom: -5px;\n margin-left: -7px;\n border-width: 5px 7px 0;\n border-top-color: $ui-secondary-color;\n }\n\n &.bottom {\n top: -5px;\n margin-left: -7px;\n border-width: 0 7px 5px;\n border-bottom-color: $ui-secondary-color;\n }\n\n &.right {\n left: -5px;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: $ui-secondary-color;\n }\n}\n\n.dropdown-menu__item {\n a {\n font-size: 13px;\n line-height: 18px;\n display: block;\n padding: 4px 14px;\n box-sizing: border-box;\n text-decoration: none;\n background: $ui-secondary-color;\n color: $inverted-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:focus,\n &:hover,\n &:active {\n background: $ui-highlight-color;\n color: $secondary-text-color;\n outline: 0;\n }\n }\n}\n\n.dropdown--active .dropdown__content {\n display: block;\n line-height: 18px;\n max-width: 311px;\n right: 0;\n text-align: left;\n z-index: 9999;\n\n & > ul {\n list-style: none;\n background: $ui-secondary-color;\n padding: 4px 0;\n border-radius: 4px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.4);\n min-width: 140px;\n position: relative;\n }\n\n &.dropdown__right {\n right: 0;\n }\n\n &.dropdown__left {\n & > ul {\n left: -98px;\n }\n }\n\n & > ul > li > a {\n font-size: 13px;\n line-height: 18px;\n display: block;\n padding: 4px 14px;\n box-sizing: border-box;\n text-decoration: none;\n background: $ui-secondary-color;\n color: $inverted-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:focus {\n outline: 0;\n }\n\n &:hover {\n background: $ui-highlight-color;\n color: $secondary-text-color;\n }\n }\n}\n\n.dropdown__icon {\n vertical-align: middle;\n}\n\n.static-content {\n padding: 10px;\n padding-top: 20px;\n color: $dark-text-color;\n\n h1 {\n font-size: 16px;\n font-weight: 500;\n margin-bottom: 40px;\n text-align: center;\n }\n\n p {\n font-size: 13px;\n margin-bottom: 20px;\n }\n}\n\n.column,\n.drawer {\n flex: 1 1 100%;\n overflow: hidden;\n}\n\n@media screen and (min-width: 631px) {\n .columns-area {\n padding: 0;\n }\n\n .column,\n .drawer {\n flex: 0 0 auto;\n padding: 10px;\n padding-left: 5px;\n padding-right: 5px;\n\n &:first-child {\n padding-left: 10px;\n }\n\n &:last-child {\n padding-right: 10px;\n }\n }\n\n .columns-area > div {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n }\n }\n}\n\n.tabs-bar {\n box-sizing: border-box;\n display: flex;\n background: lighten($ui-base-color, 8%);\n flex: 0 0 auto;\n overflow-y: auto;\n}\n\n.tabs-bar__link {\n display: block;\n flex: 1 1 auto;\n padding: 15px 10px;\n padding-bottom: 13px;\n color: $primary-text-color;\n text-decoration: none;\n text-align: center;\n font-size: 14px;\n font-weight: 500;\n border-bottom: 2px solid lighten($ui-base-color, 8%);\n transition: all 50ms linear;\n transition-property: border-bottom, background, color;\n\n .fa {\n font-weight: 400;\n font-size: 16px;\n }\n\n &:hover,\n &:focus,\n &:active {\n @include multi-columns('screen and (min-width: 631px)') {\n background: lighten($ui-base-color, 14%);\n border-bottom-color: lighten($ui-base-color, 14%);\n }\n }\n\n &.active {\n border-bottom: 2px solid $ui-highlight-color;\n color: $highlight-text-color;\n }\n\n span {\n margin-left: 5px;\n display: none;\n }\n\n span.icon {\n margin-left: 0;\n display: inline;\n }\n}\n\n.icon-with-badge {\n position: relative;\n\n &__badge {\n position: absolute;\n left: 9px;\n top: -13px;\n background: $ui-highlight-color;\n border: 2px solid lighten($ui-base-color, 8%);\n padding: 1px 6px;\n border-radius: 6px;\n font-size: 10px;\n font-weight: 500;\n line-height: 14px;\n color: $primary-text-color;\n }\n}\n\n.column-link--transparent .icon-with-badge__badge {\n border-color: darken($ui-base-color, 8%);\n}\n\n.scrollable {\n overflow-y: scroll;\n overflow-x: hidden;\n flex: 1 1 auto;\n -webkit-overflow-scrolling: touch;\n\n &.optionally-scrollable {\n overflow-y: auto;\n }\n\n @supports(display: grid) { // hack to fix Chrome <57\n contain: strict;\n }\n\n &--flex {\n display: flex;\n flex-direction: column;\n }\n\n &__append {\n flex: 1 1 auto;\n position: relative;\n min-height: 120px;\n }\n}\n\n.scrollable.fullscreen {\n @supports(display: grid) { // hack to fix Chrome <57\n contain: none;\n }\n}\n\n.react-toggle {\n display: inline-block;\n position: relative;\n cursor: pointer;\n background-color: transparent;\n border: 0;\n padding: 0;\n user-select: none;\n -webkit-tap-highlight-color: rgba($base-overlay-background, 0);\n -webkit-tap-highlight-color: transparent;\n}\n\n.react-toggle-screenreader-only {\n border: 0;\n clip: rect(0 0 0 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n}\n\n.react-toggle--disabled {\n cursor: not-allowed;\n opacity: 0.5;\n transition: opacity 0.25s;\n}\n\n.react-toggle-track {\n width: 50px;\n height: 24px;\n padding: 0;\n border-radius: 30px;\n background-color: $ui-base-color;\n transition: background-color 0.2s ease;\n}\n\n.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track {\n background-color: darken($ui-base-color, 10%);\n}\n\n.react-toggle--checked .react-toggle-track {\n background-color: $ui-highlight-color;\n}\n\n.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track {\n background-color: lighten($ui-highlight-color, 10%);\n}\n\n.react-toggle-track-check {\n position: absolute;\n width: 14px;\n height: 10px;\n top: 0;\n bottom: 0;\n margin-top: auto;\n margin-bottom: auto;\n line-height: 0;\n left: 8px;\n opacity: 0;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle--checked .react-toggle-track-check {\n opacity: 1;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle-track-x {\n position: absolute;\n width: 10px;\n height: 10px;\n top: 0;\n bottom: 0;\n margin-top: auto;\n margin-bottom: auto;\n line-height: 0;\n right: 10px;\n opacity: 1;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle--checked .react-toggle-track-x {\n opacity: 0;\n}\n\n.react-toggle-thumb {\n position: absolute;\n top: 1px;\n left: 1px;\n width: 22px;\n height: 22px;\n border: 1px solid $ui-base-color;\n border-radius: 50%;\n background-color: darken($simple-background-color, 2%);\n box-sizing: border-box;\n transition: all 0.25s ease;\n transition-property: border-color, left;\n}\n\n.react-toggle--checked .react-toggle-thumb {\n left: 27px;\n border-color: $ui-highlight-color;\n}\n\n.getting-started__wrapper,\n.getting_started,\n.flex-spacer {\n background: $ui-base-color;\n}\n\n.getting-started__wrapper {\n position: relative;\n overflow-y: auto;\n}\n\n.flex-spacer {\n flex: 1 1 auto;\n}\n\n.getting-started {\n background: $ui-base-color;\n flex: 1 0 auto;\n\n p {\n color: $secondary-text-color;\n }\n\n a {\n color: $dark-text-color;\n }\n\n &__panel {\n height: min-content;\n }\n\n &__panel,\n &__footer {\n padding: 10px;\n padding-top: 20px;\n flex: 0 1 auto;\n\n ul {\n margin-bottom: 10px;\n }\n\n ul li {\n display: inline;\n }\n\n p {\n color: $dark-text-color;\n font-size: 13px;\n\n a {\n color: $dark-text-color;\n text-decoration: underline;\n }\n }\n\n a {\n text-decoration: none;\n color: $darker-text-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n }\n\n &__trends {\n flex: 0 1 auto;\n opacity: 1;\n animation: fade 150ms linear;\n margin-top: 10px;\n\n h4 {\n font-size: 12px;\n text-transform: uppercase;\n color: $darker-text-color;\n padding: 10px;\n font-weight: 500;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n @media screen and (max-height: 810px) {\n .trends__item:nth-child(3) {\n display: none;\n }\n }\n\n @media screen and (max-height: 720px) {\n .trends__item:nth-child(2) {\n display: none;\n }\n }\n\n @media screen and (max-height: 670px) {\n display: none;\n }\n\n .trends__item {\n border-bottom: 0;\n padding: 10px;\n\n &__current {\n color: $darker-text-color;\n }\n }\n }\n}\n\n.column-link__badge {\n display: inline-block;\n border-radius: 4px;\n font-size: 12px;\n line-height: 19px;\n font-weight: 500;\n background: $ui-base-color;\n padding: 4px 8px;\n margin: -6px 10px;\n}\n\n.keyboard-shortcuts {\n padding: 8px 0 0;\n overflow: hidden;\n\n thead {\n position: absolute;\n left: -9999px;\n }\n\n td {\n padding: 0 10px 8px;\n }\n\n kbd {\n display: inline-block;\n padding: 3px 5px;\n background-color: lighten($ui-base-color, 8%);\n border: 1px solid darken($ui-base-color, 4%);\n }\n}\n\n.setting-text {\n color: $darker-text-color;\n background: transparent;\n border: none;\n border-bottom: 2px solid $ui-primary-color;\n box-sizing: border-box;\n display: block;\n font-family: inherit;\n margin-bottom: 10px;\n padding: 7px 0;\n width: 100%;\n\n &:focus,\n &:active {\n color: $primary-text-color;\n border-bottom-color: $ui-highlight-color;\n }\n\n @include limited-single-column('screen and (max-width: 600px)') {\n font-size: 16px;\n }\n\n &.light {\n color: $inverted-text-color;\n border-bottom: 2px solid lighten($ui-base-color, 27%);\n\n &:focus,\n &:active {\n color: $inverted-text-color;\n border-bottom-color: $ui-highlight-color;\n }\n }\n}\n\n.no-reduce-motion button.icon-button i.fa-retweet {\n background-position: 0 0;\n height: 19px;\n transition: background-position 0.9s steps(10);\n transition-duration: 0s;\n vertical-align: middle;\n width: 22px;\n\n &::before {\n display: none !important;\n }\n}\n\n.no-reduce-motion button.icon-button.active i.fa-retweet {\n transition-duration: 0.9s;\n background-position: 0 100%;\n}\n\n.reduce-motion button.icon-button i.fa-retweet {\n color: $action-button-color;\n transition: color 100ms ease-in;\n}\n\n.reduce-motion button.icon-button.active i.fa-retweet {\n color: $highlight-text-color;\n}\n\n.reduce-motion button.icon-button.disabled i.fa-retweet {\n color: darken($action-button-color, 13%);\n}\n\n.load-more {\n display: block;\n color: $dark-text-color;\n background-color: transparent;\n border: 0;\n font-size: inherit;\n text-align: center;\n line-height: inherit;\n margin: 0;\n padding: 15px;\n box-sizing: border-box;\n width: 100%;\n clear: both;\n text-decoration: none;\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n}\n\n.load-gap {\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n}\n\n.missing-indicator {\n padding-top: 20px + 48px;\n}\n\n.scrollable > div > :first-child .notification__dismiss-overlay > .wrappy {\n border-top: 1px solid $ui-base-color;\n}\n\n.notification__dismiss-overlay {\n overflow: hidden;\n position: absolute;\n top: 0;\n right: 0;\n bottom: -1px;\n padding-left: 15px; // space for the box shadow to be visible\n\n z-index: 999;\n align-items: center;\n justify-content: flex-end;\n cursor: pointer;\n\n display: flex;\n\n .wrappy {\n width: $dismiss-overlay-width;\n align-self: stretch;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background: lighten($ui-base-color, 8%);\n border-left: 1px solid lighten($ui-base-color, 20%);\n box-shadow: 0 0 5px black;\n border-bottom: 1px solid $ui-base-color;\n }\n\n .ckbox {\n border: 2px solid $ui-primary-color;\n border-radius: 2px;\n width: 30px;\n height: 30px;\n font-size: 20px;\n color: $darker-text-color;\n text-shadow: 0 0 5px black;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n &:focus {\n outline: 0 !important;\n\n .ckbox {\n box-shadow: 0 0 1px 1px $ui-highlight-color;\n }\n }\n}\n\n.text-btn {\n display: inline-block;\n padding: 0;\n font-family: inherit;\n font-size: inherit;\n color: inherit;\n border: 0;\n background: transparent;\n cursor: pointer;\n}\n\n.loading-indicator {\n color: $dark-text-color;\n font-size: 12px;\n font-weight: 400;\n text-transform: uppercase;\n overflow: visible;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n\n span {\n display: block;\n float: left;\n margin-left: 50%;\n transform: translateX(-50%);\n margin: 82px 0 0 50%;\n white-space: nowrap;\n }\n}\n\n.loading-indicator__figure {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 42px;\n height: 42px;\n box-sizing: border-box;\n background-color: transparent;\n border: 0 solid lighten($ui-base-color, 26%);\n border-width: 6px;\n border-radius: 50%;\n}\n\n.no-reduce-motion .loading-indicator span {\n animation: loader-label 1.15s infinite cubic-bezier(0.215, 0.610, 0.355, 1.000);\n}\n\n.no-reduce-motion .loading-indicator__figure {\n animation: loader-figure 1.15s infinite cubic-bezier(0.215, 0.610, 0.355, 1.000);\n}\n\n@keyframes spring-rotate-in {\n 0% {\n transform: rotate(0deg);\n }\n\n 30% {\n transform: rotate(-484.8deg);\n }\n\n 60% {\n transform: rotate(-316.7deg);\n }\n\n 90% {\n transform: rotate(-375deg);\n }\n\n 100% {\n transform: rotate(-360deg);\n }\n}\n\n@keyframes spring-rotate-out {\n 0% {\n transform: rotate(-360deg);\n }\n\n 30% {\n transform: rotate(124.8deg);\n }\n\n 60% {\n transform: rotate(-43.27deg);\n }\n\n 90% {\n transform: rotate(15deg);\n }\n\n 100% {\n transform: rotate(0deg);\n }\n}\n\n@keyframes loader-figure {\n 0% {\n width: 0;\n height: 0;\n background-color: lighten($ui-base-color, 26%);\n }\n\n 29% {\n background-color: lighten($ui-base-color, 26%);\n }\n\n 30% {\n width: 42px;\n height: 42px;\n background-color: transparent;\n border-width: 21px;\n opacity: 1;\n }\n\n 100% {\n width: 42px;\n height: 42px;\n border-width: 0;\n opacity: 0;\n background-color: transparent;\n }\n}\n\n@keyframes loader-label {\n 0% { opacity: 0.25; }\n 30% { opacity: 1; }\n 100% { opacity: 0.25; }\n}\n\n.spoiler-button {\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n position: absolute;\n z-index: 100;\n\n &--minified {\n display: flex;\n left: 4px;\n top: 4px;\n width: auto;\n height: auto;\n align-items: center;\n }\n\n &--click-thru {\n pointer-events: none;\n }\n\n &--hidden {\n display: none;\n }\n\n &__overlay {\n display: block;\n background: transparent;\n width: 100%;\n height: 100%;\n border: 0;\n\n &__label {\n display: inline-block;\n background: rgba($base-overlay-background, 0.5);\n border-radius: 8px;\n padding: 8px 12px;\n color: $primary-text-color;\n font-weight: 500;\n font-size: 14px;\n }\n\n &:hover,\n &:focus,\n &:active {\n .spoiler-button__overlay__label {\n background: rgba($base-overlay-background, 0.8);\n }\n }\n\n &:disabled {\n .spoiler-button__overlay__label {\n background: rgba($base-overlay-background, 0.5);\n }\n }\n }\n}\n\n.setting-toggle {\n display: block;\n line-height: 24px;\n}\n\n.setting-toggle__label,\n.setting-radio__label,\n.setting-meta__label {\n color: $darker-text-color;\n display: inline-block;\n margin-bottom: 14px;\n margin-left: 8px;\n vertical-align: middle;\n}\n\n.setting-radio {\n display: block;\n line-height: 18px;\n}\n\n.setting-radio__label {\n margin-bottom: 0;\n}\n\n.column-settings__row legend {\n color: $darker-text-color;\n cursor: default;\n display: block;\n font-weight: 500;\n margin-top: 10px;\n}\n\n.setting-radio__input {\n vertical-align: middle;\n}\n\n.setting-meta__label {\n float: right;\n}\n\n@keyframes heartbeat {\n from {\n transform: scale(1);\n transform-origin: center center;\n animation-timing-function: ease-out;\n }\n\n 10% {\n transform: scale(0.91);\n animation-timing-function: ease-in;\n }\n\n 17% {\n transform: scale(0.98);\n animation-timing-function: ease-out;\n }\n\n 33% {\n transform: scale(0.87);\n animation-timing-function: ease-in;\n }\n\n 45% {\n transform: scale(1);\n animation-timing-function: ease-out;\n }\n}\n\n.pulse-loading {\n animation: heartbeat 1.5s ease-in-out infinite both;\n}\n\n.upload-area {\n align-items: center;\n background: rgba($base-overlay-background, 0.8);\n display: flex;\n height: 100%;\n justify-content: center;\n left: 0;\n opacity: 0;\n position: absolute;\n top: 0;\n visibility: hidden;\n width: 100%;\n z-index: 2000;\n\n * {\n pointer-events: none;\n }\n}\n\n.upload-area__drop {\n width: 320px;\n height: 160px;\n display: flex;\n box-sizing: border-box;\n position: relative;\n padding: 8px;\n}\n\n.upload-area__background {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: -1;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 5px rgba($base-shadow-color, 0.2);\n}\n\n.upload-area__content {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: $secondary-text-color;\n font-size: 18px;\n font-weight: 500;\n border: 2px dashed $ui-base-lighter-color;\n border-radius: 4px;\n}\n\n.dropdown--active .emoji-button img {\n opacity: 1;\n filter: none;\n}\n\n.loading-bar {\n background-color: $ui-highlight-color;\n height: 3px;\n position: absolute;\n top: 0;\n left: 0;\n z-index: 9999;\n}\n\n.icon-badge-wrapper {\n position: relative;\n}\n\n.icon-badge {\n position: absolute;\n display: block;\n right: -.25em;\n top: -.25em;\n background-color: $ui-highlight-color;\n border-radius: 50%;\n font-size: 75%;\n width: 1em;\n height: 1em;\n}\n\n.conversation {\n display: flex;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n padding: 5px;\n padding-bottom: 0;\n\n &:focus {\n background: lighten($ui-base-color, 2%);\n outline: 0;\n }\n\n &__avatar {\n flex: 0 0 auto;\n padding: 10px;\n padding-top: 12px;\n position: relative;\n }\n\n &__unread {\n display: inline-block;\n background: $highlight-text-color;\n border-radius: 50%;\n width: 0.625rem;\n height: 0.625rem;\n margin: -.1ex .15em .1ex;\n }\n\n &__content {\n flex: 1 1 auto;\n padding: 10px 5px;\n padding-right: 15px;\n overflow: hidden;\n\n &__info {\n overflow: hidden;\n display: flex;\n flex-direction: row-reverse;\n justify-content: space-between;\n }\n\n &__relative-time {\n font-size: 15px;\n color: $darker-text-color;\n padding-left: 15px;\n }\n\n &__names {\n color: $darker-text-color;\n font-size: 15px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-bottom: 4px;\n flex-basis: 90px;\n flex-grow: 1;\n\n a {\n color: $primary-text-color;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n }\n\n .status__content {\n margin: 0;\n }\n }\n\n &--unread {\n background: lighten($ui-base-color, 2%);\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n .conversation__content__info {\n font-weight: 700;\n }\n\n .conversation__content__relative-time {\n color: $primary-text-color;\n }\n }\n}\n\n.ui .flash-message {\n margin-top: 10px;\n margin-left: auto;\n margin-right: auto;\n margin-bottom: 0;\n min-width: 75%;\n}\n\n::-webkit-scrollbar-thumb {\n border-radius: 0;\n}\n\nnoscript {\n text-align: center;\n\n img {\n width: 200px;\n opacity: 0.5;\n animation: flicker 4s infinite;\n }\n\n div {\n font-size: 14px;\n margin: 30px auto;\n color: $secondary-text-color;\n max-width: 400px;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n\n a {\n word-break: break-word;\n }\n }\n}\n\n@keyframes flicker {\n 0% { opacity: 1; }\n 30% { opacity: 0.75; }\n 100% { opacity: 1; }\n}\n\n@import 'boost';\n@import 'accounts';\n@import 'domains';\n@import 'status';\n@import 'modal';\n@import 'composer';\n@import 'columns';\n@import 'regeneration_indicator';\n@import 'directory';\n@import 'search';\n@import 'emoji';\n@import 'doodle';\n@import 'drawer';\n@import 'media';\n@import 'sensitive';\n@import 'lists';\n@import 'emoji_picker';\n@import 'local_settings';\n@import 'error_boundary';\n@import 'single_column';\n","button.icon-button i.fa-retweet {\n background-image: url(\"data:image/svg+xml;utf8,\");\n\n &:hover {\n background-image: url(\"data:image/svg+xml;utf8,\");\n }\n}\n\n// Disabled variant\nbutton.icon-button.disabled i.fa-retweet {\n &, &:hover {\n background-image: url(\"data:image/svg+xml;utf8,\");\n }\n}\n\n// Disabled variant for use with DMs\n.status-direct button.icon-button.disabled i.fa-retweet {\n &, &:hover {\n background-image: url(\"data:image/svg+xml;utf8,\");\n }\n}\n",".account {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n color: inherit;\n text-decoration: none;\n\n .account__display-name {\n flex: 1 1 auto;\n display: block;\n color: $darker-text-color;\n overflow: hidden;\n text-decoration: none;\n font-size: 14px;\n }\n\n &.small {\n border: none;\n padding: 0;\n\n & > .account__avatar-wrapper { margin: 0 8px 0 0 }\n\n & > .display-name {\n height: 24px;\n line-height: 24px;\n }\n }\n}\n\n.account__wrapper {\n display: flex;\n}\n\n.account__avatar-wrapper {\n float: left;\n margin-left: 12px;\n margin-right: 12px;\n}\n\n.account__avatar {\n @include avatar-radius();\n position: relative;\n cursor: pointer;\n\n &-inline {\n display: inline-block;\n vertical-align: middle;\n margin-right: 5px;\n }\n\n &-composite {\n @include avatar-radius;\n overflow: hidden;\n position: relative;\n cursor: default;\n\n & div {\n @include avatar-radius;\n float: left;\n position: relative;\n box-sizing: border-box;\n }\n\n &__label {\n display: block;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n color: $primary-text-color;\n text-shadow: 1px 1px 2px $base-shadow-color;\n font-weight: 700;\n font-size: 15px;\n }\n }\n}\n\n.account__avatar-overlay {\n position: relative;\n @include avatar-size(48px);\n\n &-base {\n @include avatar-radius();\n @include avatar-size(36px);\n }\n\n &-overlay {\n @include avatar-radius();\n @include avatar-size(24px);\n\n position: absolute;\n bottom: 0;\n right: 0;\n z-index: 1;\n }\n}\n\n.account__relationship {\n height: 18px;\n padding: 10px;\n white-space: nowrap;\n}\n\n.account__header__wrapper {\n flex: 0 0 auto;\n background: lighten($ui-base-color, 4%);\n}\n\n.account__disclaimer {\n padding: 10px;\n color: $dark-text-color;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n font-weight: 500;\n color: inherit;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n}\n\n.account__action-bar {\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n line-height: 36px;\n overflow: hidden;\n flex: 0 0 auto;\n display: flex;\n}\n\n.account__action-bar-links {\n display: flex;\n flex: 1 1 auto;\n line-height: 18px;\n text-align: center;\n}\n\n.account__action-bar__tab {\n text-decoration: none;\n overflow: hidden;\n flex: 0 1 100%;\n border-left: 1px solid lighten($ui-base-color, 8%);\n padding: 10px 0;\n border-bottom: 4px solid transparent;\n\n &:first-child {\n border-left: 0;\n }\n\n &.active {\n border-bottom: 4px solid $ui-highlight-color;\n }\n\n & > span {\n display: block;\n text-transform: uppercase;\n font-size: 11px;\n color: $darker-text-color;\n }\n\n strong {\n display: block;\n font-size: 15px;\n font-weight: 500;\n color: $primary-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n abbr {\n color: $highlight-text-color;\n }\n}\n\n.account-authorize {\n padding: 14px 10px;\n\n .detailed-status__display-name {\n display: block;\n margin-bottom: 15px;\n overflow: hidden;\n }\n}\n\n.account-authorize__avatar {\n float: left;\n margin-right: 10px;\n}\n\n.notification__message {\n margin-left: 42px;\n padding: 8px 0 0 26px;\n cursor: default;\n color: $darker-text-color;\n font-size: 15px;\n position: relative;\n\n .fa {\n color: $highlight-text-color;\n }\n\n > span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.account--panel {\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: row;\n padding: 10px 0;\n}\n\n.account--panel__button,\n.detailed-status__button {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.column-settings__outer {\n background: lighten($ui-base-color, 8%);\n padding: 15px;\n}\n\n.column-settings__section {\n color: $darker-text-color;\n cursor: default;\n display: block;\n font-weight: 500;\n margin-bottom: 10px;\n}\n\n.column-settings__hashtags {\n .column-settings__row {\n margin-bottom: 15px;\n }\n\n .column-select {\n &__control {\n @include search-input();\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n &__placeholder {\n color: $dark-text-color;\n padding-left: 2px;\n font-size: 12px;\n }\n\n &__value-container {\n padding-left: 6px;\n }\n\n &__multi-value {\n background: lighten($ui-base-color, 8%);\n\n &__remove {\n cursor: pointer;\n\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 12%);\n color: lighten($darker-text-color, 4%);\n }\n }\n }\n\n &__multi-value__label,\n &__input {\n color: $darker-text-color;\n }\n\n &__clear-indicator,\n &__dropdown-indicator {\n cursor: pointer;\n transition: none;\n color: $dark-text-color;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($dark-text-color, 4%);\n }\n }\n\n &__indicator-separator {\n background-color: lighten($ui-base-color, 8%);\n }\n\n &__menu {\n @include search-popout();\n padding: 0;\n background: $ui-secondary-color;\n }\n\n &__menu-list {\n padding: 6px;\n }\n\n &__option {\n color: $inverted-text-color;\n border-radius: 4px;\n font-size: 14px;\n\n &--is-focused,\n &--is-selected {\n background: darken($ui-secondary-color, 10%);\n }\n }\n }\n}\n\n.column-settings__row {\n .text-btn {\n margin-bottom: 15px;\n }\n}\n\n.relationship-tag {\n color: $primary-text-color;\n margin-bottom: 4px;\n display: block;\n vertical-align: top;\n background-color: $base-overlay-background;\n text-transform: uppercase;\n font-size: 11px;\n font-weight: 500;\n padding: 4px;\n border-radius: 4px;\n opacity: 0.7;\n\n &:hover {\n opacity: 1;\n }\n}\n\n.account-gallery__container {\n display: flex;\n flex-wrap: wrap;\n padding: 4px 2px;\n}\n\n.account-gallery__item {\n border: none;\n box-sizing: border-box;\n display: block;\n position: relative;\n border-radius: 4px;\n overflow: hidden;\n margin: 2px;\n\n &__icons {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 24px;\n }\n}\n\n.notification__filter-bar,\n.account__section-headline {\n background: darken($ui-base-color, 4%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n display: flex;\n flex-shrink: 0;\n\n button {\n background: darken($ui-base-color, 4%);\n border: 0;\n margin: 0;\n }\n\n button,\n a {\n display: block;\n flex: 1 1 auto;\n color: $darker-text-color;\n padding: 15px 0;\n font-size: 14px;\n font-weight: 500;\n text-align: center;\n text-decoration: none;\n position: relative;\n\n &.active {\n color: $secondary-text-color;\n\n &::before,\n &::after {\n display: block;\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 50%;\n width: 0;\n height: 0;\n transform: translateX(-50%);\n border-style: solid;\n border-width: 0 10px 10px;\n border-color: transparent transparent lighten($ui-base-color, 8%);\n }\n\n &::after {\n bottom: -1px;\n border-color: transparent transparent $ui-base-color;\n }\n }\n }\n\n &.directory__section-headline {\n background: darken($ui-base-color, 2%);\n border-bottom-color: transparent;\n\n a,\n button {\n &.active {\n &::before {\n display: none;\n }\n\n &::after {\n border-color: transparent transparent darken($ui-base-color, 7%);\n }\n }\n }\n }\n}\n\n.account__moved-note {\n padding: 14px 10px;\n padding-bottom: 16px;\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &__message {\n position: relative;\n margin-left: 58px;\n color: $dark-text-color;\n padding: 8px 0;\n padding-top: 0;\n padding-bottom: 4px;\n font-size: 14px;\n\n > span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n &__icon-wrapper {\n left: -26px;\n position: absolute;\n }\n\n .detailed-status__display-avatar {\n position: relative;\n }\n\n .detailed-status__display-name {\n margin-bottom: 0;\n }\n}\n\n.account__header__content {\n color: $darker-text-color;\n font-size: 14px;\n font-weight: 400;\n overflow: hidden;\n word-break: normal;\n word-wrap: break-word;\n\n p {\n margin-bottom: 20px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: inherit;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n}\n\n.account__header {\n overflow: hidden;\n\n &.inactive {\n opacity: 0.5;\n\n .account__header__image,\n .account__avatar {\n filter: grayscale(100%);\n }\n }\n\n &__info {\n position: absolute;\n top: 10px;\n left: 10px;\n }\n\n &__image {\n overflow: hidden;\n height: 145px;\n position: relative;\n background: darken($ui-base-color, 4%);\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n }\n }\n\n &__bar {\n position: relative;\n background: lighten($ui-base-color, 4%);\n padding: 5px;\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n\n .avatar {\n display: block;\n flex: 0 0 auto;\n width: 94px;\n margin-left: -2px;\n\n .account__avatar {\n background: darken($ui-base-color, 8%);\n border: 2px solid lighten($ui-base-color, 4%);\n }\n }\n }\n\n &__tabs {\n display: flex;\n align-items: flex-start;\n padding: 7px 5px;\n margin-top: -55px;\n\n &__buttons {\n display: flex;\n align-items: center;\n padding-top: 55px;\n overflow: hidden;\n\n .icon-button {\n border: 1px solid lighten($ui-base-color, 12%);\n border-radius: 4px;\n box-sizing: content-box;\n padding: 2px;\n }\n\n .button {\n margin: 0 8px;\n }\n }\n\n &__name {\n padding: 5px;\n\n .account-role {\n vertical-align: top;\n }\n\n .emojione {\n width: 22px;\n height: 22px;\n }\n\n h1 {\n font-size: 16px;\n line-height: 24px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n\n small {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n .spacer {\n flex: 1 1 auto;\n }\n }\n\n &__bio {\n overflow: hidden;\n margin: 0 -5px;\n\n .account__header__content {\n padding: 20px 15px;\n padding-bottom: 5px;\n color: $primary-text-color;\n }\n\n .account__header__fields {\n margin: 0;\n border-top: 1px solid lighten($ui-base-color, 12%);\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n }\n\n &__extra {\n margin-top: 4px;\n\n &__links {\n font-size: 14px;\n color: $darker-text-color;\n padding: 10px 0;\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n padding: 5px 10px;\n font-weight: 500;\n\n strong {\n font-weight: 700;\n color: $primary-text-color;\n }\n }\n }\n }\n}\n",".domain {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n .domain__domain-name {\n flex: 1 1 auto;\n display: block;\n color: $primary-text-color;\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n }\n}\n\n.domain__wrapper {\n display: flex;\n}\n\n.domain_buttons {\n height: 18px;\n padding: 10px;\n white-space: nowrap;\n}\n","@keyframes spring-flip-in {\n 0% {\n transform: rotate(0deg);\n }\n\n 30% {\n transform: rotate(-242.4deg);\n }\n\n 60% {\n transform: rotate(-158.35deg);\n }\n\n 90% {\n transform: rotate(-187.5deg);\n }\n\n 100% {\n transform: rotate(-180deg);\n }\n}\n\n@keyframes spring-flip-out {\n 0% {\n transform: rotate(-180deg);\n }\n\n 30% {\n transform: rotate(62.4deg);\n }\n\n 60% {\n transform: rotate(-21.635deg);\n }\n\n 90% {\n transform: rotate(7.5deg);\n }\n\n 100% {\n transform: rotate(0deg);\n }\n}\n\n.status__content--with-action {\n cursor: pointer;\n}\n\n.status__content {\n position: relative;\n margin: 10px 0;\n font-size: 15px;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n overflow: visible;\n padding-top: 5px;\n\n &:focus {\n outline: 0;\n }\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n img {\n max-width: 100%;\n max-height: 400px;\n object-fit: contain;\n }\n\n p, pre, blockquote {\n margin-bottom: 20px;\n white-space: pre-wrap;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .status__content__text,\n .e-content {\n overflow: hidden;\n\n & > ul,\n & > ol {\n margin-bottom: 20px;\n }\n\n h1, h2, h3, h4, h5 {\n margin-top: 20px;\n margin-bottom: 20px;\n }\n\n h1, h2 {\n font-weight: 700;\n font-size: 1.2em;\n }\n\n h2 {\n font-size: 1.1em;\n }\n\n h3, h4, h5 {\n font-weight: 500;\n }\n\n blockquote {\n padding-left: 10px;\n border-left: 3px solid $darker-text-color;\n color: $darker-text-color;\n white-space: normal;\n\n p:last-child {\n margin-bottom: 0;\n }\n }\n\n b, strong {\n font-weight: 700;\n }\n\n em, i {\n font-style: italic;\n }\n\n sub {\n font-size: smaller;\n text-align: sub;\n }\n\n sup {\n font-size: smaller;\n vertical-align: super;\n }\n\n ul, ol {\n margin-left: 1em;\n\n p {\n margin: 0;\n }\n }\n\n ul {\n list-style-type: disc;\n }\n\n ol {\n list-style-type: decimal;\n }\n }\n\n a {\n color: $pleroma-links;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n\n .fa {\n color: lighten($dark-text-color, 7%);\n }\n }\n\n &.mention {\n &:hover {\n text-decoration: none;\n\n span {\n text-decoration: underline;\n }\n }\n }\n\n .fa {\n color: $dark-text-color;\n }\n }\n\n .status__content__spoiler {\n display: none;\n\n &.status__content__spoiler--visible {\n display: block;\n }\n }\n\n a.unhandled-link {\n color: lighten($ui-highlight-color, 8%);\n\n .link-origin-tag {\n color: $gold-star;\n font-size: 0.8em;\n }\n }\n\n .status__content__spoiler-link {\n background: lighten($ui-base-color, 30%);\n\n &:hover {\n background: lighten($ui-base-color, 33%);\n text-decoration: none;\n }\n }\n}\n\n.status__content__spoiler-link {\n display: inline-block;\n border-radius: 2px;\n background: lighten($ui-base-color, 30%);\n border: none;\n color: $inverted-text-color;\n font-weight: 500;\n font-size: 11px;\n padding: 0 5px;\n text-transform: uppercase;\n line-height: inherit;\n cursor: pointer;\n vertical-align: bottom;\n\n &:hover {\n background: lighten($ui-base-color, 33%);\n text-decoration: none;\n }\n\n .status__content__spoiler-icon {\n display: inline-block;\n margin: 0 0 0 5px;\n border-left: 1px solid currentColor;\n padding: 0 0 0 4px;\n font-size: 16px;\n vertical-align: -2px;\n }\n}\n\n.notif-cleaning {\n .status,\n .notification-follow,\n .notification-follow-request {\n padding-right: ($dismiss-overlay-width + 0.5rem);\n }\n}\n\n.status__wrapper--filtered {\n color: $dark-text-color;\n border: 0;\n font-size: inherit;\n text-align: center;\n line-height: inherit;\n margin: 0;\n padding: 15px;\n box-sizing: border-box;\n width: 100%;\n clear: both;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n}\n\n.status__prepend-icon-wrapper {\n left: -26px;\n position: absolute;\n}\n\n.notification-follow,\n.notification-follow-request {\n position: relative;\n\n // same like Status\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n .account {\n border-bottom: 0 none;\n }\n}\n\n.focusable {\n &:focus {\n outline: 0;\n background: lighten($ui-base-color, 4%);\n\n &.status.status-direct:not(.read) {\n background: lighten($ui-base-color, 12%);\n\n &.muted {\n background: transparent;\n }\n }\n\n .detailed-status,\n .detailed-status__action-bar {\n background: lighten($ui-base-color, 8%);\n }\n }\n}\n\n.status {\n padding: 10px 14px;\n position: relative;\n height: auto;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n\n @supports (-ms-overflow-style: -ms-autohiding-scrollbar) {\n // Add margin to avoid Edge auto-hiding scrollbar appearing over content.\n // On Edge 16 this is 16px and Edge <=15 it's 12px, so aim for 16px.\n padding-right: 28px; // 12px + 16px\n }\n\n @keyframes fade {\n 0% { opacity: 0; }\n 100% { opacity: 1; }\n }\n\n opacity: 1;\n animation: fade 150ms linear;\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n }\n\n &.status-direct:not(.read) {\n background: lighten($ui-base-color, 8%);\n border-bottom-color: lighten($ui-base-color, 12%);\n }\n\n &.light {\n .status__relative-time {\n color: $lighter-text-color;\n }\n\n .status__display-name {\n color: $inverted-text-color;\n }\n\n .display-name {\n strong {\n color: $inverted-text-color;\n }\n\n span {\n color: $lighter-text-color;\n }\n }\n\n .status__content {\n color: $inverted-text-color;\n\n a {\n color: $highlight-text-color;\n }\n\n a.status__content__spoiler-link {\n color: $primary-text-color;\n background: $ui-primary-color;\n\n &:hover {\n background: lighten($ui-primary-color, 8%);\n }\n }\n }\n }\n\n &.collapsed {\n background-position: center;\n background-size: cover;\n user-select: none;\n\n &.has-background::before {\n display: block;\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n background-image: linear-gradient(to bottom, rgba($base-shadow-color, .75), rgba($base-shadow-color, .65) 24px, rgba($base-shadow-color, .8));\n pointer-events: none;\n content: \"\";\n }\n\n .display-name:hover .display-name__html {\n text-decoration: none;\n }\n\n .status__content {\n height: 20px;\n overflow: hidden;\n text-overflow: ellipsis;\n padding-top: 0;\n\n &:after {\n content: \"\";\n position: absolute;\n top: 0; bottom: 0;\n left: 0; right: 0;\n background: linear-gradient(rgba($ui-base-color, 0), rgba($ui-base-color, 1));\n pointer-events: none;\n }\n \n a:hover {\n text-decoration: none;\n }\n }\n &:focus > .status__content:after {\n background: linear-gradient(rgba(lighten($ui-base-color, 4%), 0), rgba(lighten($ui-base-color, 4%), 1));\n }\n &.status-direct:not(.read)> .status__content:after {\n background: linear-gradient(rgba(lighten($ui-base-color, 8%), 0), rgba(lighten($ui-base-color, 8%), 1));\n }\n\n .notification__message {\n margin-bottom: 0;\n }\n\n .status__info .notification__message > span {\n white-space: nowrap;\n }\n }\n\n .notification__message {\n margin: -10px 0px 10px 0;\n }\n}\n\n.notification-favourite {\n .status.status-direct {\n background: transparent;\n\n .icon-button.disabled {\n color: lighten($action-button-color, 13%);\n }\n }\n}\n\n.status__relative-time {\n display: inline-block;\n flex-grow: 1;\n color: $dark-text-color;\n font-size: 14px;\n text-align: right;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.status__display-name {\n color: $dark-text-color;\n overflow: hidden;\n}\n\n.status__info__account .status__display-name {\n display: block;\n max-width: 100%;\n}\n\n.status__info {\n display: flex;\n justify-content: space-between;\n font-size: 15px;\n\n > span {\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n .notification__message > span {\n word-wrap: break-word;\n }\n}\n\n.status__info__icons {\n display: flex;\n align-items: center;\n height: 1em;\n color: $action-button-color;\n\n .status__media-icon,\n .status__visibility-icon,\n .status__reply-icon {\n padding-left: 2px;\n padding-right: 2px;\n }\n\n .status__collapse-button.active > .fa-angle-double-up {\n transform: rotate(-180deg);\n }\n}\n\n.no-reduce-motion .status__collapse-button {\n &.activate {\n & > .fa-angle-double-up {\n animation: spring-flip-in 1s linear;\n }\n }\n\n &.deactivate {\n & > .fa-angle-double-up {\n animation: spring-flip-out 1s linear;\n }\n }\n}\n\n.status__info__account {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n}\n\n.status-check-box {\n border-bottom: 1px solid $ui-secondary-color;\n display: flex;\n\n .status-check-box__status {\n margin: 10px 0 10px 10px;\n flex: 1;\n\n .media-gallery {\n max-width: 250px;\n }\n\n .status__content {\n padding: 0;\n white-space: normal;\n }\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n max-width: 250px;\n }\n\n .media-gallery__item-thumbnail {\n cursor: default;\n }\n }\n}\n\n.status-check-box-toggle {\n align-items: center;\n display: flex;\n flex: 0 0 auto;\n justify-content: center;\n padding: 10px;\n}\n\n.status__prepend {\n margin-top: -10px;\n margin-bottom: 10px;\n margin-left: 58px;\n color: $dark-text-color;\n padding: 8px 0;\n padding-bottom: 2px;\n font-size: 14px;\n position: relative;\n\n .status__display-name strong {\n color: $dark-text-color;\n }\n\n > span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.status__action-bar {\n align-items: center;\n display: flex;\n margin-top: 8px;\n\n &__counter {\n display: inline-flex;\n margin-right: 11px;\n align-items: center;\n\n .status__action-bar-button {\n margin-right: 4px;\n }\n\n &__label {\n display: inline-block;\n width: 14px;\n font-size: 12px;\n font-weight: 500;\n color: $action-button-color;\n }\n }\n}\n\n.status__action-bar-button {\n margin-right: 18px;\n}\n\n.status__action-bar-dropdown {\n height: 23.15px;\n width: 23.15px;\n}\n\n.detailed-status__action-bar-dropdown {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n}\n\n.detailed-status {\n background: lighten($ui-base-color, 4%);\n padding: 14px 10px;\n\n &--flex {\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n align-items: flex-start;\n\n .status__content,\n .detailed-status__meta {\n flex: 100%;\n }\n }\n\n .status__content {\n font-size: 19px;\n line-height: 24px;\n\n .emojione {\n width: 24px;\n height: 24px;\n margin: -1px 0 0;\n }\n }\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n }\n}\n\n.detailed-status__meta {\n margin-top: 15px;\n color: $dark-text-color;\n font-size: 14px;\n line-height: 18px;\n}\n\n.detailed-status__action-bar {\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: row;\n padding: 10px 0;\n}\n\n.detailed-status__link {\n color: inherit;\n text-decoration: none;\n}\n\n.detailed-status__favorites,\n.detailed-status__reblogs {\n display: inline-block;\n font-weight: 500;\n font-size: 12px;\n margin-left: 6px;\n}\n\n.status__display-name,\n.status__relative-time,\n.detailed-status__display-name,\n.detailed-status__datetime,\n.detailed-status__application,\n.account__display-name {\n text-decoration: none;\n}\n\n.status__display-name,\n.account__display-name {\n strong {\n color: $primary-text-color;\n }\n}\n\n.muted {\n .emojione {\n opacity: 0.5;\n }\n}\n\na.status__display-name,\n.reply-indicator__display-name,\n.detailed-status__display-name,\n.account__display-name {\n &:hover strong {\n text-decoration: underline;\n }\n}\n\n.account__display-name strong {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.detailed-status__application,\n.detailed-status__datetime {\n color: inherit;\n}\n\n.detailed-status .button.logo-button {\n margin-bottom: 15px;\n}\n\n.detailed-status__display-name {\n color: $secondary-text-color;\n display: block;\n line-height: 24px;\n margin-bottom: 15px;\n overflow: hidden;\n\n strong,\n span {\n display: block;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n strong {\n font-size: 16px;\n color: $primary-text-color;\n }\n}\n\n.detailed-status__display-avatar {\n float: left;\n margin-right: 10px;\n}\n\n.status__avatar {\n flex: none;\n margin: 0 10px 0 0;\n height: 48px;\n width: 48px;\n}\n\n.muted {\n .status__content,\n .status__content p,\n .status__content a,\n .status__content__text {\n color: $dark-text-color;\n }\n\n .status__display-name strong {\n color: $dark-text-color;\n }\n\n .status__avatar {\n opacity: 0.5;\n }\n\n a.status__content__spoiler-link {\n background: $ui-base-lighter-color;\n color: $inverted-text-color;\n\n &:hover {\n background: lighten($ui-base-color, 29%);\n text-decoration: none;\n }\n }\n}\n\n.status__relative-time,\n.detailed-status__datetime {\n &:hover {\n text-decoration: underline;\n }\n}\n\n.status-card {\n display: flex;\n font-size: 14px;\n border: 1px solid lighten($ui-base-color, 8%);\n border-radius: 4px;\n color: $dark-text-color;\n margin-top: 14px;\n text-decoration: none;\n overflow: hidden;\n\n &__actions {\n bottom: 0;\n left: 0;\n position: absolute;\n right: 0;\n top: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n\n & > div {\n background: rgba($base-shadow-color, 0.6);\n border-radius: 8px;\n padding: 12px 9px;\n flex: 0 0 auto;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n button,\n a {\n display: inline;\n color: $secondary-text-color;\n background: transparent;\n border: 0;\n padding: 0 8px;\n text-decoration: none;\n font-size: 18px;\n line-height: 18px;\n\n &:hover,\n &:active,\n &:focus {\n color: $primary-text-color;\n }\n }\n\n a {\n font-size: 19px;\n position: relative;\n bottom: -1px;\n }\n\n a .fa, a:hover .fa {\n color: inherit;\n }\n }\n}\n\na.status-card {\n cursor: pointer;\n\n &:hover {\n background: lighten($ui-base-color, 8%);\n }\n}\n\n.status-card-photo {\n cursor: zoom-in;\n display: block;\n text-decoration: none;\n width: 100%;\n height: auto;\n margin: 0;\n}\n\n.status-card-video {\n iframe {\n width: 100%;\n height: 100%;\n }\n}\n\n.status-card__title {\n display: block;\n font-weight: 500;\n margin-bottom: 5px;\n color: $darker-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-decoration: none;\n}\n\n.status-card__content {\n flex: 1 1 auto;\n overflow: hidden;\n padding: 14px 14px 14px 8px;\n}\n\n.status-card__description {\n color: $darker-text-color;\n}\n\n.status-card__host {\n display: block;\n margin-top: 5px;\n font-size: 13px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.status-card__image {\n flex: 0 0 100px;\n background: lighten($ui-base-color, 8%);\n position: relative;\n\n & > .fa {\n font-size: 21px;\n position: absolute;\n transform-origin: 50% 50%;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n}\n\n.status-card.horizontal {\n display: block;\n\n .status-card__image {\n width: 100%;\n }\n\n .status-card__image-image {\n border-radius: 4px 4px 0 0;\n }\n\n .status-card__title {\n white-space: inherit;\n }\n}\n\n.status-card.compact {\n border-color: lighten($ui-base-color, 4%);\n\n &.interactive {\n border: 0;\n }\n\n .status-card__content {\n padding: 8px;\n padding-top: 10px;\n }\n\n .status-card__title {\n white-space: nowrap;\n }\n\n .status-card__image {\n flex: 0 0 60px;\n }\n}\n\na.status-card.compact:hover {\n background-color: lighten($ui-base-color, 4%);\n}\n\n.status-card__image-image {\n border-radius: 4px 0 0 4px;\n display: block;\n margin: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n background-size: cover;\n background-position: center center;\n}\n\n.attachment-list {\n display: flex;\n font-size: 14px;\n border: 1px solid lighten($ui-base-color, 8%);\n border-radius: 4px;\n margin-top: 14px;\n overflow: hidden;\n\n &__icon {\n flex: 0 0 auto;\n color: $dark-text-color;\n padding: 8px 18px;\n cursor: default;\n border-right: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n font-size: 26px;\n\n .fa {\n display: block;\n }\n }\n\n &__list {\n list-style: none;\n padding: 4px 0;\n padding-left: 8px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n\n li {\n display: block;\n padding: 4px 0;\n }\n\n a {\n text-decoration: none;\n color: $dark-text-color;\n font-weight: 500;\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n &.compact {\n border: 0;\n margin-top: 4px;\n\n .attachment-list__list {\n padding: 0;\n display: block;\n }\n\n .fa {\n color: $dark-text-color;\n }\n }\n}\n\n.status__wrapper--filtered__button {\n display: inline;\n color: lighten($ui-highlight-color, 8%);\n border: 0;\n background: transparent;\n padding: 0;\n font-size: inherit;\n line-height: inherit;\n\n &:hover,\n &:active {\n text-decoration: underline;\n }\n}\n",".modal-container--preloader {\n background: lighten($ui-base-color, 8%);\n}\n\n.modal-root {\n position: relative;\n transition: opacity 0.3s linear;\n will-change: opacity;\n z-index: 9999;\n}\n\n.modal-root__overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba($base-overlay-background, 0.7);\n}\n\n.modal-root__container {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n align-content: space-around;\n z-index: 9999;\n pointer-events: none;\n user-select: none;\n}\n\n.modal-root__modal {\n pointer-events: auto;\n display: flex;\n z-index: 9999;\n}\n\n.onboarding-modal,\n.error-modal,\n.embed-modal {\n background: $ui-secondary-color;\n color: $inverted-text-color;\n border-radius: 8px;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.onboarding-modal__pager {\n height: 80vh;\n width: 80vw;\n max-width: 520px;\n max-height: 470px;\n\n .react-swipeable-view-container > div {\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n display: none;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n display: flex;\n user-select: text;\n }\n}\n\n.error-modal__body {\n height: 80vh;\n width: 80vw;\n max-width: 520px;\n max-height: 420px;\n position: relative;\n\n & > div {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n padding: 25px;\n display: none;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n display: flex;\n opacity: 0;\n user-select: text;\n }\n}\n\n.error-modal__body {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n text-align: center;\n}\n\n@media screen and (max-width: 550px) {\n .onboarding-modal {\n width: 100%;\n height: 100%;\n border-radius: 0;\n }\n\n .onboarding-modal__pager {\n width: 100%;\n height: auto;\n max-width: none;\n max-height: none;\n flex: 1 1 auto;\n }\n}\n\n.onboarding-modal__paginator,\n.error-modal__footer {\n flex: 0 0 auto;\n background: darken($ui-secondary-color, 8%);\n display: flex;\n padding: 25px;\n\n & > div {\n min-width: 33px;\n }\n\n .onboarding-modal__nav,\n .error-modal__nav {\n color: $lighter-text-color;\n border: 0;\n font-size: 14px;\n font-weight: 500;\n padding: 10px 25px;\n line-height: inherit;\n height: auto;\n margin: -10px;\n border-radius: 4px;\n background-color: transparent;\n\n &:hover,\n &:focus,\n &:active {\n color: darken($lighter-text-color, 4%);\n background-color: darken($ui-secondary-color, 16%);\n }\n\n &.onboarding-modal__done,\n &.onboarding-modal__next {\n color: $inverted-text-color;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($inverted-text-color, 4%);\n }\n }\n }\n}\n\n.error-modal__footer {\n justify-content: center;\n}\n\n.onboarding-modal__dots {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.onboarding-modal__dot {\n width: 14px;\n height: 14px;\n border-radius: 14px;\n background: darken($ui-secondary-color, 16%);\n margin: 0 3px;\n cursor: pointer;\n\n &:hover {\n background: darken($ui-secondary-color, 18%);\n }\n\n &.active {\n cursor: default;\n background: darken($ui-secondary-color, 24%);\n }\n}\n\n.onboarding-modal__page__wrapper {\n pointer-events: none;\n padding: 25px;\n padding-bottom: 0;\n\n &.onboarding-modal__page__wrapper--active {\n pointer-events: auto;\n }\n}\n\n.onboarding-modal__page {\n cursor: default;\n line-height: 21px;\n\n h1 {\n font-size: 18px;\n font-weight: 500;\n color: $inverted-text-color;\n margin-bottom: 20px;\n }\n\n a {\n color: $highlight-text-color;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($highlight-text-color, 4%);\n }\n }\n\n .navigation-bar a {\n color: inherit;\n }\n\n p {\n font-size: 16px;\n color: $lighter-text-color;\n margin-top: 10px;\n margin-bottom: 10px;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n strong {\n font-weight: 500;\n background: $ui-base-color;\n color: $secondary-text-color;\n border-radius: 4px;\n font-size: 14px;\n padding: 3px 6px;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n }\n}\n\n.onboarding-modal__page__wrapper-0 {\n height: 100%;\n padding: 0;\n}\n\n.onboarding-modal__page-one {\n &__lead {\n padding: 65px;\n padding-top: 45px;\n padding-bottom: 0;\n margin-bottom: 10px;\n\n h1 {\n font-size: 26px;\n line-height: 36px;\n margin-bottom: 8px;\n }\n\n p {\n margin-bottom: 0;\n }\n }\n\n &__extra {\n padding-right: 65px;\n padding-left: 185px;\n text-align: center;\n }\n}\n\n.display-case {\n text-align: center;\n font-size: 15px;\n margin-bottom: 15px;\n\n &__label {\n font-weight: 500;\n color: $inverted-text-color;\n margin-bottom: 5px;\n text-transform: uppercase;\n font-size: 12px;\n }\n\n &__case {\n background: $ui-base-color;\n color: $secondary-text-color;\n font-weight: 500;\n padding: 10px;\n border-radius: 4px;\n }\n}\n\n.onboarding-modal__page-two,\n.onboarding-modal__page-three,\n.onboarding-modal__page-four,\n.onboarding-modal__page-five {\n p {\n text-align: left;\n }\n\n .figure {\n background: darken($ui-base-color, 8%);\n color: $secondary-text-color;\n margin-bottom: 20px;\n border-radius: 4px;\n padding: 10px;\n text-align: center;\n font-size: 14px;\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.3);\n\n .onboarding-modal__image {\n border-radius: 4px;\n margin-bottom: 10px;\n }\n\n &.non-interactive {\n pointer-events: none;\n text-align: left;\n }\n }\n}\n\n.onboarding-modal__page-four__columns {\n .row {\n display: flex;\n margin-bottom: 20px;\n\n & > div {\n flex: 1 1 0;\n margin: 0 10px;\n\n &:first-child {\n margin-left: 0;\n }\n\n &:last-child {\n margin-right: 0;\n }\n\n p {\n text-align: center;\n }\n }\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .column-header {\n color: $primary-text-color;\n }\n}\n\n@media screen and (max-width: 320px) and (max-height: 600px) {\n .onboarding-modal__page p {\n font-size: 14px;\n line-height: 20px;\n }\n\n .onboarding-modal__page-two .figure,\n .onboarding-modal__page-three .figure,\n .onboarding-modal__page-four .figure,\n .onboarding-modal__page-five .figure {\n font-size: 12px;\n margin-bottom: 10px;\n }\n\n .onboarding-modal__page-four__columns .row {\n margin-bottom: 10px;\n }\n\n .onboarding-modal__page-four__columns .column-header {\n padding: 5px;\n font-size: 12px;\n }\n}\n\n.onboard-sliders {\n display: inline-block;\n max-width: 30px;\n max-height: auto;\n margin-left: 10px;\n}\n\n.boost-modal,\n.favourite-modal,\n.confirmation-modal,\n.report-modal,\n.actions-modal,\n.mute-modal,\n.block-modal {\n background: lighten($ui-secondary-color, 8%);\n color: $inverted-text-color;\n border-radius: 8px;\n overflow: hidden;\n max-width: 90vw;\n width: 480px;\n position: relative;\n flex-direction: column;\n\n .status__relative-time {\n color: $dark-text-color;\n float: right;\n font-size: 14px;\n width: auto;\n margin: initial;\n padding: initial;\n }\n\n .status__display-name {\n display: flex;\n }\n\n .status__avatar {\n height: 48px;\n width: 48px;\n }\n\n .status__content__spoiler-link {\n color: lighten($secondary-text-color, 8%);\n }\n}\n\n.actions-modal {\n .status {\n background: $white;\n border-bottom-color: $ui-secondary-color;\n padding-top: 10px;\n padding-bottom: 10px;\n }\n\n .dropdown-menu__separator {\n border-bottom-color: $ui-secondary-color;\n }\n}\n\n.boost-modal__container,\n.favourite-modal__container {\n overflow-x: scroll;\n padding: 10px;\n\n .status {\n user-select: text;\n border-bottom: 0;\n }\n}\n\n.boost-modal__action-bar,\n.favourite-modal__action-bar,\n.confirmation-modal__action-bar,\n.mute-modal__action-bar,\n.block-modal__action-bar {\n display: flex;\n justify-content: space-between;\n background: $ui-secondary-color;\n padding: 10px;\n line-height: 36px;\n\n & > div {\n flex: 1 1 auto;\n text-align: right;\n color: $lighter-text-color;\n padding-right: 10px;\n }\n\n .button {\n flex: 0 0 auto;\n }\n}\n\n.boost-modal__status-header,\n.favourite-modal__status-header {\n font-size: 15px;\n}\n\n.boost-modal__status-time,\n.favourite-modal__status-time {\n float: right;\n font-size: 14px;\n}\n\n.mute-modal,\n.block-modal {\n line-height: 24px;\n}\n\n.mute-modal .react-toggle,\n.block-modal .react-toggle {\n vertical-align: middle;\n}\n\n.report-modal {\n width: 90vw;\n max-width: 700px;\n}\n\n.report-modal__container {\n display: flex;\n border-top: 1px solid $ui-secondary-color;\n\n @media screen and (max-width: 480px) {\n flex-wrap: wrap;\n overflow-y: auto;\n }\n}\n\n.report-modal__statuses,\n.report-modal__comment {\n box-sizing: border-box;\n width: 50%;\n\n @media screen and (max-width: 480px) {\n width: 100%;\n }\n}\n\n.report-modal__statuses,\n.focal-point-modal__content {\n flex: 1 1 auto;\n min-height: 20vh;\n max-height: 80vh;\n overflow-y: auto;\n overflow-x: hidden;\n\n .status__content a {\n color: $highlight-text-color;\n }\n\n @media screen and (max-width: 480px) {\n max-height: 10vh;\n }\n}\n\n.focal-point-modal__content {\n @media screen and (max-width: 480px) {\n max-height: 40vh;\n }\n}\n\n.report-modal__comment {\n padding: 20px;\n border-right: 1px solid $ui-secondary-color;\n max-width: 320px;\n\n p {\n font-size: 14px;\n line-height: 20px;\n margin-bottom: 20px;\n }\n\n .setting-text {\n display: block;\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n color: $inverted-text-color;\n background: $white;\n padding: 10px;\n font-family: inherit;\n font-size: 14px;\n resize: none;\n border: 0;\n outline: 0;\n border-radius: 4px;\n border: 1px solid $ui-secondary-color;\n min-height: 100px;\n max-height: 50vh;\n margin-bottom: 10px;\n\n &:focus {\n border: 1px solid darken($ui-secondary-color, 8%);\n }\n\n &__wrapper {\n background: $white;\n border: 1px solid $ui-secondary-color;\n margin-bottom: 10px;\n border-radius: 4px;\n\n .setting-text {\n border: 0;\n margin-bottom: 0;\n border-radius: 0;\n\n &:focus {\n border: 0;\n }\n }\n\n &__modifiers {\n color: $inverted-text-color;\n font-family: inherit;\n font-size: 14px;\n background: $white;\n }\n }\n\n &__toolbar {\n display: flex;\n justify-content: space-between;\n margin-bottom: 20px;\n }\n }\n\n .setting-text-label {\n display: block;\n color: $inverted-text-color;\n font-size: 14px;\n font-weight: 500;\n margin-bottom: 10px;\n }\n\n .setting-toggle {\n margin-top: 20px;\n margin-bottom: 24px;\n\n &__label {\n color: $inverted-text-color;\n font-size: 14px;\n }\n }\n\n @media screen and (max-width: 480px) {\n padding: 10px;\n max-width: 100%;\n order: 2;\n\n .setting-toggle {\n margin-bottom: 4px;\n }\n }\n}\n\n.actions-modal {\n .status {\n overflow-y: auto;\n max-height: 300px;\n }\n\n strong {\n display: block;\n font-weight: 500;\n }\n\n max-height: 80vh;\n max-width: 80vw;\n\n .actions-modal__item-label {\n font-weight: 500;\n }\n\n ul {\n overflow-y: auto;\n flex-shrink: 0;\n max-height: 80vh;\n\n &.with-status {\n max-height: calc(80vh - 75px);\n }\n\n li:empty {\n margin: 0;\n }\n\n li:not(:empty) {\n a {\n color: $inverted-text-color;\n display: flex;\n padding: 12px 16px;\n font-size: 15px;\n align-items: center;\n text-decoration: none;\n\n &,\n button {\n transition: none;\n }\n\n &.active,\n &:hover,\n &:active,\n &:focus {\n &,\n button {\n background: $ui-highlight-color;\n color: $primary-text-color;\n }\n }\n\n & > .react-toggle,\n & > .icon,\n button:first-child {\n margin-right: 10px;\n }\n }\n }\n }\n}\n\n.confirmation-modal__action-bar,\n.mute-modal__action-bar,\n.block-modal__action-bar {\n .confirmation-modal__secondary-button {\n flex-shrink: 1;\n }\n}\n\n.confirmation-modal__secondary-button,\n.confirmation-modal__cancel-button,\n.mute-modal__cancel-button,\n.block-modal__cancel-button {\n background-color: transparent;\n color: $lighter-text-color;\n font-size: 14px;\n font-weight: 500;\n\n &:hover,\n &:focus,\n &:active {\n color: darken($lighter-text-color, 4%);\n background-color: transparent;\n }\n}\n\n.confirmation-modal__do_not_ask_again {\n padding-left: 20px;\n padding-right: 20px;\n padding-bottom: 10px;\n\n font-size: 14px;\n\n label, input {\n vertical-align: middle;\n }\n}\n\n.confirmation-modal__container,\n.mute-modal__container,\n.block-modal__container,\n.report-modal__target {\n padding: 30px;\n font-size: 16px;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n}\n\n.confirmation-modal__container,\n.report-modal__target {\n text-align: center;\n}\n\n.block-modal,\n.mute-modal {\n &__explanation {\n margin-top: 20px;\n }\n\n .setting-toggle {\n margin-top: 20px;\n margin-bottom: 24px;\n display: flex;\n align-items: center;\n\n &__label {\n color: $inverted-text-color;\n margin: 0;\n margin-left: 8px;\n }\n }\n}\n\n.report-modal__target {\n padding: 15px;\n\n .media-modal__close {\n top: 14px;\n right: 15px;\n }\n}\n\n.embed-modal {\n width: auto;\n max-width: 80vw;\n max-height: 80vh;\n\n h4 {\n padding: 30px;\n font-weight: 500;\n font-size: 16px;\n text-align: center;\n }\n\n .embed-modal__container {\n padding: 10px;\n\n .hint {\n margin-bottom: 15px;\n }\n\n .embed-modal__html {\n outline: 0;\n box-sizing: border-box;\n display: block;\n width: 100%;\n border: none;\n padding: 10px;\n font-family: 'mastodon-font-monospace', monospace;\n background: $ui-base-color;\n color: $primary-text-color;\n font-size: 14px;\n margin: 0;\n margin-bottom: 15px;\n border-radius: 4px;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n .embed-modal__iframe {\n width: 400px;\n max-width: 100%;\n overflow: hidden;\n border: 0;\n border-radius: 4px;\n }\n }\n}\n\n.focal-point {\n position: relative;\n cursor: move;\n overflow: hidden;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n background: $base-shadow-color;\n\n img,\n video,\n canvas {\n display: block;\n max-height: 80vh;\n width: 100%;\n height: auto;\n margin: 0;\n object-fit: contain;\n background: $base-shadow-color;\n }\n\n &__reticle {\n position: absolute;\n width: 100px;\n height: 100px;\n transform: translate(-50%, -50%);\n background: url('~images/reticle.png') no-repeat 0 0;\n border-radius: 50%;\n box-shadow: 0 0 0 9999em rgba($base-shadow-color, 0.35);\n }\n\n &__overlay {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n }\n\n &__preview {\n position: absolute;\n bottom: 10px;\n right: 10px;\n z-index: 2;\n cursor: move;\n transition: opacity 0.1s ease;\n\n &:hover {\n opacity: 0.5;\n }\n\n strong {\n color: $primary-text-color;\n font-size: 14px;\n font-weight: 500;\n display: block;\n margin-bottom: 5px;\n }\n\n div {\n border-radius: 4px;\n box-shadow: 0 0 14px rgba($base-shadow-color, 0.2);\n }\n }\n\n @media screen and (max-width: 480px) {\n img,\n video {\n max-height: 100%;\n }\n\n &__preview {\n display: none;\n }\n }\n}\n\n.filtered-status-info {\n text-align: start;\n\n .spoiler__text {\n margin-top: 20px;\n }\n\n .account {\n border-bottom: 0;\n }\n\n .account__display-name strong {\n color: $inverted-text-color;\n }\n\n .status__content__spoiler {\n display: none;\n\n &--visible {\n display: flex;\n }\n }\n\n ul {\n padding: 10px;\n margin-left: 12px;\n list-style: disc inside;\n }\n\n .filtered-status-edit-link {\n color: $action-button-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline\n }\n }\n}\n",".composer {\n padding: 10px;\n}\n\n.character-counter {\n cursor: default;\n font-family: $font-sans-serif, sans-serif;\n font-size: 14px;\n font-weight: 600;\n color: $lighter-text-color;\n\n &.character-counter--over {\n color: $warning-red;\n }\n}\n\n.no-reduce-motion .composer--spoiler {\n transition: height 0.4s ease, opacity 0.4s ease;\n}\n\n.composer--spoiler {\n height: 0;\n transform-origin: bottom;\n opacity: 0.0;\n\n &.composer--spoiler--visible {\n height: 36px;\n margin-bottom: 11px;\n opacity: 1.0;\n }\n\n input {\n display: block;\n box-sizing: border-box;\n margin: 0;\n border: none;\n border-radius: 4px;\n padding: 10px;\n width: 100%;\n outline: 0;\n color: $inverted-text-color;\n background: $simple-background-color;\n font-size: 14px;\n font-family: inherit;\n resize: vertical;\n\n &::placeholder {\n color: $dark-text-color;\n }\n\n &:focus { outline: 0 }\n @include single-column('screen and (max-width: 630px)') { font-size: 16px }\n }\n}\n\n.composer--warning {\n color: $inverted-text-color;\n margin-bottom: 15px;\n background: $ui-primary-color;\n box-shadow: 0 2px 6px rgba($base-shadow-color, 0.3);\n padding: 8px 10px;\n border-radius: 4px;\n font-size: 13px;\n font-weight: 400;\n\n a {\n color: $lighter-text-color;\n font-weight: 500;\n text-decoration: underline;\n\n &:active,\n &:focus,\n &:hover { text-decoration: none }\n }\n}\n\n.compose-form__sensitive-button {\n padding: 10px;\n padding-top: 0;\n\n font-size: 14px;\n font-weight: 500;\n\n &.active {\n color: $highlight-text-color;\n }\n\n input[type=checkbox] {\n display: none;\n }\n\n .checkbox {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-left: 5px;\n margin-right: 10px;\n top: -1px;\n border-radius: 4px;\n vertical-align: middle;\n\n &.active {\n border-color: $highlight-text-color;\n background: $highlight-text-color;\n }\n }\n}\n\n.composer--reply {\n margin: 0 0 10px;\n border-radius: 4px;\n padding: 10px;\n background: $ui-primary-color;\n min-height: 23px;\n overflow-y: auto;\n flex: 0 2 auto;\n\n & > header {\n margin-bottom: 5px;\n overflow: hidden;\n\n & > .account.small { color: $inverted-text-color; }\n\n & > .cancel {\n float: right;\n line-height: 24px;\n }\n }\n\n & > .content {\n position: relative;\n margin: 10px 0;\n padding: 0 12px;\n font-size: 14px;\n line-height: 20px;\n color: $inverted-text-color;\n word-wrap: break-word;\n font-weight: 400;\n overflow: visible;\n white-space: pre-wrap;\n padding-top: 5px;\n overflow: hidden;\n\n p, pre, blockquote {\n margin-bottom: 20px;\n white-space: pre-wrap;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n h1, h2, h3, h4, h5 {\n margin-top: 20px;\n margin-bottom: 20px;\n }\n\n h1, h2 {\n font-weight: 700;\n font-size: 18px;\n }\n\n h2 {\n font-size: 16px;\n }\n\n h3, h4, h5 {\n font-weight: 500;\n }\n\n blockquote {\n padding-left: 10px;\n border-left: 3px solid $inverted-text-color;\n color: $inverted-text-color;\n white-space: normal;\n\n p:last-child {\n margin-bottom: 0;\n }\n }\n\n b, strong {\n font-weight: 700;\n }\n\n em, i {\n font-style: italic;\n }\n\n sub {\n font-size: smaller;\n text-align: sub;\n }\n\n ul, ol {\n margin-left: 1em;\n\n p {\n margin: 0;\n }\n }\n\n ul {\n list-style-type: disc;\n }\n\n ol {\n list-style-type: decimal;\n }\n\n a {\n color: $lighter-text-color;\n text-decoration: none;\n\n &:hover { text-decoration: underline }\n\n &.mention {\n &:hover {\n text-decoration: none;\n\n span { text-decoration: underline }\n }\n }\n }\n }\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -5px 0 0;\n }\n}\n\n.emoji-picker-dropdown {\n position: absolute;\n right: 5px;\n top: 5px;\n\n ::-webkit-scrollbar-track:hover,\n ::-webkit-scrollbar-track:active {\n background-color: rgba($base-overlay-background, 0.3);\n }\n}\n\n.compose-form__autosuggest-wrapper,\n.autosuggest-input {\n position: relative;\n width: 100%;\n\n label {\n .autosuggest-textarea__textarea {\n display: block;\n box-sizing: border-box;\n margin: 0;\n border: none;\n border-radius: 4px 4px 0 0;\n padding: 10px 32px 0 10px;\n width: 100%;\n min-height: 100px;\n outline: 0;\n color: $inverted-text-color;\n background: $simple-background-color;\n font-size: 14px;\n font-family: inherit;\n resize: none;\n scrollbar-color: initial;\n\n &::placeholder {\n color: $dark-text-color;\n }\n\n &::-webkit-scrollbar {\n all: unset;\n }\n\n &:disabled { background: $ui-secondary-color }\n &:focus { outline: 0 }\n @include single-column('screen and (max-width: 630px)') { font-size: 16px }\n\n @include limited-single-column('screen and (max-width: 600px)') {\n height: 100px !important; // prevent auto-resize textarea\n resize: vertical;\n }\n }\n }\n}\n\n.composer--textarea--icons {\n display: block;\n position: absolute;\n top: 29px;\n right: 5px;\n bottom: 5px;\n overflow: hidden;\n\n & > .textarea_icon {\n display: block;\n margin: 2px 0 0 2px;\n width: 24px;\n height: 24px;\n color: $lighter-text-color;\n font-size: 18px;\n line-height: 24px;\n text-align: center;\n opacity: .8;\n }\n}\n\n.autosuggest-textarea__suggestions-wrapper {\n position: relative;\n height: 0;\n}\n\n.autosuggest-textarea__suggestions {\n display: block;\n position: absolute;\n box-sizing: border-box;\n top: 100%;\n border-radius: 0 0 4px 4px;\n padding: 6px;\n width: 100%;\n color: $inverted-text-color;\n background: $ui-secondary-color;\n box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4);\n font-size: 14px;\n z-index: 99;\n display: none;\n}\n\n.autosuggest-textarea__suggestions--visible {\n display: block;\n}\n\n.autosuggest-textarea__suggestions__item {\n padding: 10px;\n cursor: pointer;\n border-radius: 4px;\n\n &:hover,\n &:focus,\n &:active,\n &.selected { background: darken($ui-secondary-color, 10%) }\n\n > .account,\n > .emoji,\n > .autosuggest-hashtag {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: flex-start;\n line-height: 18px;\n font-size: 14px;\n }\n\n .autosuggest-hashtag {\n justify-content: space-between;\n\n &__name {\n flex: 1 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n strong {\n font-weight: 500;\n }\n\n &__uses {\n flex: 0 0 auto;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n }\n\n & > .account.small {\n .display-name {\n & > span { color: $lighter-text-color }\n }\n }\n}\n\n.composer--upload_form {\n overflow: hidden;\n\n & > .content {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n font-family: inherit;\n padding: 5px;\n overflow: hidden;\n }\n}\n\n.composer--upload_form--item {\n flex: 1 1 0;\n margin: 5px;\n min-width: 40%;\n\n & > div {\n position: relative;\n border-radius: 4px;\n height: 140px;\n width: 100%;\n background-color: $base-shadow-color;\n background-position: center;\n background-size: cover;\n background-repeat: no-repeat;\n overflow: hidden;\n\n textarea {\n display: block;\n position: absolute;\n box-sizing: border-box;\n bottom: 0;\n left: 0;\n margin: 0;\n border: 0;\n padding: 10px;\n width: 100%;\n color: $secondary-text-color;\n background: linear-gradient(0deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);\n font-size: 14px;\n font-family: inherit;\n font-weight: 500;\n opacity: 0;\n z-index: 2;\n transition: opacity .1s ease;\n\n &:focus { color: $white }\n\n &::placeholder {\n opacity: 0.54;\n color: $secondary-text-color;\n }\n }\n\n & > .close { mix-blend-mode: difference }\n }\n\n &.active {\n & > div {\n textarea { opacity: 1 }\n }\n }\n}\n\n.composer--upload_form--actions {\n background: linear-gradient(180deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n opacity: 0;\n transition: opacity .1s ease;\n\n .icon-button {\n flex: 0 1 auto;\n color: $ui-secondary-color;\n font-size: 14px;\n font-weight: 500;\n padding: 10px;\n font-family: inherit;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($ui-secondary-color, 4%);\n }\n }\n\n &.active {\n opacity: 1;\n }\n}\n\n.composer--upload_form--progress {\n display: flex;\n padding: 10px;\n color: $darker-text-color;\n overflow: hidden;\n\n & > .fa {\n font-size: 34px;\n margin-right: 10px;\n }\n\n & > .message {\n flex: 1 1 auto;\n\n & > span {\n display: block;\n font-size: 12px;\n font-weight: 500;\n text-transform: uppercase;\n }\n\n & > .backdrop {\n position: relative;\n margin-top: 5px;\n border-radius: 6px;\n width: 100%;\n height: 6px;\n background: $ui-base-lighter-color;\n\n & > .tracker {\n position: absolute;\n top: 0;\n left: 0;\n height: 6px;\n border-radius: 6px;\n background: $ui-highlight-color;\n }\n }\n }\n}\n\n.compose-form__modifiers {\n color: $inverted-text-color;\n font-family: inherit;\n font-size: 14px;\n background: $simple-background-color;\n}\n\n.composer--options-wrapper {\n padding: 10px;\n background: darken($simple-background-color, 8%);\n border-radius: 0 0 4px 4px;\n height: 27px;\n display: flex;\n justify-content: space-between;\n flex: 0 0 auto;\n}\n\n.composer--options {\n display: flex;\n flex: 0 0 auto;\n\n & > * {\n display: inline-block;\n box-sizing: content-box;\n padding: 0 3px;\n height: 27px;\n line-height: 27px;\n vertical-align: bottom;\n }\n\n & > hr {\n display: inline-block;\n margin: 0 3px;\n border-width: 0 0 0 1px;\n border-style: none none none solid;\n border-color: transparent transparent transparent darken($simple-background-color, 24%);\n padding: 0;\n width: 0;\n height: 27px;\n background: transparent;\n }\n}\n\n.compose--counter-wrapper {\n align-self: center;\n margin-right: 4px;\n}\n\n.composer--options--dropdown {\n &.open {\n & > .value {\n border-radius: 4px 4px 0 0;\n box-shadow: 0 -4px 4px rgba($base-shadow-color, 0.1);\n color: $primary-text-color;\n background: $ui-highlight-color;\n transition: none;\n }\n &.top {\n & > .value {\n border-radius: 0 0 4px 4px;\n box-shadow: 0 4px 4px rgba($base-shadow-color, 0.1);\n }\n }\n }\n}\n\n.composer--options--dropdown--content {\n position: absolute;\n border-radius: 4px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n background: $simple-background-color;\n overflow: hidden;\n transform-origin: 50% 0;\n}\n\n.composer--options--dropdown--content--item {\n display: flex;\n align-items: center;\n padding: 10px;\n color: $inverted-text-color;\n cursor: pointer;\n\n & > .content {\n flex: 1 1 auto;\n color: $lighter-text-color;\n\n &:not(:first-child) { margin-left: 10px }\n\n strong {\n display: block;\n color: $inverted-text-color;\n font-weight: 500;\n }\n }\n\n &:hover,\n &.active {\n background: $ui-highlight-color;\n color: $primary-text-color;\n\n & > .content {\n color: $primary-text-color;\n\n strong { color: $primary-text-color }\n }\n }\n\n &.active:hover { background: lighten($ui-highlight-color, 4%) }\n}\n\n.composer--publisher {\n padding-top: 10px;\n text-align: right;\n white-space: nowrap;\n overflow: hidden;\n justify-content: flex-end;\n flex: 0 0 auto;\n\n & > .primary {\n display: inline-block;\n margin: 0;\n padding: 0 10px;\n text-align: center;\n }\n\n & > .side_arm {\n display: inline-block;\n margin: 0 2px;\n padding: 0;\n width: 36px;\n text-align: center;\n }\n\n &.over {\n & > .count { color: $warning-red }\n }\n}\n",".column__wrapper {\n display: flex;\n flex: 1 1 auto;\n position: relative;\n}\n\n.columns-area {\n display: flex;\n flex: 1 1 auto;\n flex-direction: row;\n justify-content: flex-start;\n overflow-x: auto;\n position: relative;\n\n &__panels {\n display: flex;\n justify-content: center;\n width: 100%;\n height: 100%;\n min-height: 100vh;\n\n &__pane {\n height: 100%;\n overflow: hidden;\n pointer-events: none;\n display: flex;\n justify-content: flex-end;\n min-width: 285px;\n\n &--start {\n justify-content: flex-start;\n }\n\n &__inner {\n position: fixed;\n width: 285px;\n pointer-events: auto;\n height: 100%;\n }\n }\n\n &__main {\n box-sizing: border-box;\n width: 100%;\n max-width: 600px;\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding: 0 10px;\n }\n }\n }\n}\n\n.tabs-bar__wrapper {\n background: darken($ui-base-color, 8%);\n position: sticky;\n top: 0;\n z-index: 2;\n padding-top: 0;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding-top: 10px;\n }\n\n .tabs-bar {\n margin-bottom: 0;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n margin-bottom: 10px;\n }\n }\n}\n\n.react-swipeable-view-container {\n &,\n .columns-area,\n .column {\n height: 100%;\n }\n}\n\n.react-swipeable-view-container > * {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n}\n\n.column {\n width: 330px;\n position: relative;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n\n > .scrollable {\n background: $ui-base-color;\n }\n}\n\n.ui {\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n}\n\n.column {\n overflow: hidden;\n}\n\n.column-back-button {\n box-sizing: border-box;\n width: 100%;\n background: lighten($ui-base-color, 4%);\n color: $highlight-text-color;\n cursor: pointer;\n flex: 0 0 auto;\n font-size: 16px;\n border: 0;\n text-align: unset;\n padding: 15px;\n margin: 0;\n z-index: 3;\n\n &:hover {\n text-decoration: underline;\n }\n}\n\n.column-header__back-button {\n background: lighten($ui-base-color, 4%);\n border: 0;\n font-family: inherit;\n color: $highlight-text-color;\n cursor: pointer;\n flex: 0 0 auto;\n font-size: 16px;\n padding: 0 5px 0 0;\n z-index: 3;\n\n &:hover {\n text-decoration: underline;\n }\n\n &:last-child {\n padding: 0 15px 0 0;\n }\n}\n\n.column-back-button__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.column-back-button--slim {\n position: relative;\n}\n\n.column-back-button--slim-button {\n cursor: pointer;\n flex: 0 0 auto;\n font-size: 16px;\n padding: 15px;\n position: absolute;\n right: 0;\n top: -48px;\n}\n\n.column-link {\n background: lighten($ui-base-color, 8%);\n color: $primary-text-color;\n display: block;\n font-size: 16px;\n padding: 15px;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 11%);\n }\n\n &:focus {\n outline: 0;\n }\n\n &--transparent {\n background: transparent;\n color: $ui-secondary-color;\n\n &:hover,\n &:focus,\n &:active {\n background: transparent;\n color: $primary-text-color;\n }\n\n &.active {\n color: $ui-highlight-color;\n }\n }\n}\n\n.column-link__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.column-subheading {\n background: $ui-base-color;\n color: $dark-text-color;\n padding: 8px 20px;\n font-size: 12px;\n font-weight: 500;\n text-transform: uppercase;\n cursor: default;\n}\n\n.column-header__wrapper {\n position: relative;\n flex: 0 0 auto;\n\n &.active {\n &::before {\n display: block;\n content: \"\";\n position: absolute;\n top: 35px;\n left: 0;\n right: 0;\n margin: 0 auto;\n width: 60%;\n pointer-events: none;\n height: 28px;\n z-index: 1;\n background: radial-gradient(ellipse, rgba($ui-highlight-color, 0.23) 0%, rgba($ui-highlight-color, 0) 60%);\n }\n }\n}\n\n.column-header {\n display: flex;\n font-size: 16px;\n background: lighten($ui-base-color, 4%);\n flex: 0 0 auto;\n cursor: pointer;\n position: relative;\n z-index: 2;\n outline: 0;\n overflow: hidden;\n\n & > button {\n margin: 0;\n border: none;\n padding: 15px;\n color: inherit;\n background: transparent;\n font: inherit;\n text-align: left;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n flex: 1;\n }\n\n & > .column-header__back-button {\n color: $highlight-text-color;\n }\n\n &.active {\n box-shadow: 0 1px 0 rgba($ui-highlight-color, 0.3);\n\n .column-header__icon {\n color: $highlight-text-color;\n text-shadow: 0 0 10px rgba($ui-highlight-color, 0.4);\n }\n }\n\n &:focus,\n &:active {\n outline: 0;\n }\n}\n\n.column {\n width: 330px;\n position: relative;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n\n .wide .columns-area:not(.columns-area--mobile) & {\n flex: auto;\n min-width: 330px;\n max-width: 400px;\n }\n\n > .scrollable {\n background: $ui-base-color;\n }\n}\n\n.column-header__buttons {\n height: 48px;\n display: flex;\n margin-left: 0;\n}\n\n.column-header__links {\n margin-bottom: 14px;\n}\n\n.column-header__links .text-btn {\n margin-right: 10px;\n}\n\n.column-header__button {\n background: lighten($ui-base-color, 4%);\n border: 0;\n color: $darker-text-color;\n cursor: pointer;\n font-size: 16px;\n padding: 0 15px;\n\n &:hover {\n color: lighten($darker-text-color, 7%);\n }\n\n &.active {\n color: $primary-text-color;\n background: lighten($ui-base-color, 8%);\n\n &:hover {\n color: $primary-text-color;\n background: lighten($ui-base-color, 8%);\n }\n }\n\n // glitch - added focus ring for keyboard navigation\n &:focus {\n text-shadow: 0 0 4px darken($ui-highlight-color, 5%);\n }\n}\n\n.column-header__notif-cleaning-buttons {\n display: flex;\n align-items: stretch;\n justify-content: space-around;\n\n button {\n @extend .column-header__button;\n background: transparent;\n text-align: center;\n padding: 10px 0;\n white-space: pre-wrap;\n }\n\n b {\n font-weight: bold;\n }\n}\n\n// The notifs drawer with no padding to have more space for the buttons\n.column-header__collapsible-inner.nopad-drawer {\n padding: 0;\n}\n\n.column-header__collapsible {\n max-height: 70vh;\n overflow: hidden;\n overflow-y: auto;\n color: $darker-text-color;\n transition: max-height 150ms ease-in-out, opacity 300ms linear;\n opacity: 1;\n\n &.collapsed {\n max-height: 0;\n opacity: 0.5;\n }\n\n &.animating {\n overflow-y: hidden;\n }\n\n hr {\n height: 0;\n background: transparent;\n border: 0;\n border-top: 1px solid lighten($ui-base-color, 12%);\n margin: 10px 0;\n }\n\n // notif cleaning drawer\n &.ncd {\n transition: none;\n &.collapsed {\n max-height: 0;\n opacity: 0.7;\n }\n }\n}\n\n.column-header__collapsible-inner {\n background: lighten($ui-base-color, 8%);\n padding: 15px;\n}\n\n.column-header__setting-btn {\n &:hover {\n color: $darker-text-color;\n text-decoration: underline;\n }\n}\n\n.column-header__setting-arrows {\n float: right;\n\n .column-header__setting-btn {\n padding: 0 10px;\n\n &:last-child {\n padding-right: 0;\n }\n }\n}\n\n.column-header__title {\n display: inline-block;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n flex: 1;\n}\n\n.column-header__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.empty-column-indicator,\n.error-column {\n color: $dark-text-color;\n background: $ui-base-color;\n text-align: center;\n padding: 20px;\n font-size: 15px;\n font-weight: 400;\n cursor: default;\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n justify-content: center;\n @supports(display: grid) { // hack to fix Chrome <57\n contain: strict;\n }\n\n & > span {\n max-width: 400px;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.error-column {\n flex-direction: column;\n}\n\n// more fixes for the navbar-under mode\n@mixin fix-margins-for-navbar-under {\n .tabs-bar {\n margin-top: 0 !important;\n margin-bottom: -6px !important;\n }\n}\n\n.single-column.navbar-under {\n @include fix-margins-for-navbar-under;\n}\n\n.auto-columns.navbar-under {\n @media screen and (max-width: $no-gap-breakpoint) {\n @include fix-margins-for-navbar-under;\n }\n}\n\n.auto-columns.navbar-under .react-swipeable-view-container .columns-area,\n.single-column.navbar-under .react-swipeable-view-container .columns-area {\n @media screen and (max-width: $no-gap-breakpoint) {\n height: 100% !important;\n }\n}\n\n.column-inline-form {\n padding: 7px 15px;\n padding-right: 5px;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n\n label {\n flex: 1 1 auto;\n\n input {\n width: 100%;\n margin-bottom: 6px;\n\n &:focus {\n outline: 0;\n }\n }\n }\n\n .icon-button {\n flex: 0 0 auto;\n margin: 0 5px;\n }\n}\n",".regeneration-indicator {\n text-align: center;\n font-size: 16px;\n font-weight: 500;\n color: $dark-text-color;\n background: $ui-base-color;\n cursor: default;\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 20px;\n\n &__figure {\n &,\n img {\n display: block;\n width: auto;\n height: 160px;\n margin: 0;\n }\n }\n\n &--without-header {\n padding-top: 20px + 48px;\n }\n\n &__label {\n margin-top: 30px;\n\n strong {\n display: block;\n margin-bottom: 10px;\n color: $dark-text-color;\n }\n\n span {\n font-size: 15px;\n font-weight: 400;\n }\n }\n}\n",".directory {\n &__list {\n width: 100%;\n margin: 10px 0;\n transition: opacity 100ms ease-in;\n\n &.loading {\n opacity: 0.7;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin: 0;\n }\n }\n\n &__card {\n box-sizing: border-box;\n margin-bottom: 10px;\n\n &__img {\n height: 125px;\n position: relative;\n background: darken($ui-base-color, 12%);\n overflow: hidden;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n object-fit: cover;\n }\n }\n\n &__bar {\n display: flex;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n padding: 10px;\n\n &__name {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n text-decoration: none;\n overflow: hidden;\n }\n\n &__relationship {\n width: 23px;\n min-height: 1px;\n flex: 0 0 auto;\n }\n\n .avatar {\n flex: 0 0 auto;\n width: 48px;\n height: 48px;\n padding-top: 2px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n background: darken($ui-base-color, 8%);\n object-fit: cover;\n }\n }\n\n .display-name {\n margin-left: 15px;\n text-align: left;\n\n strong {\n font-size: 15px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n span {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n &__extra {\n background: $ui-base-color;\n display: flex;\n align-items: center;\n justify-content: center;\n\n .accounts-table__count {\n width: 33.33%;\n flex: 0 0 auto;\n padding: 15px 0;\n }\n\n .account__header__content {\n box-sizing: border-box;\n padding: 15px 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n width: 100%;\n min-height: 18px + 30px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n p {\n display: none;\n\n &:first-child {\n display: inline;\n }\n }\n\n br {\n display: none;\n }\n }\n }\n }\n}\n\n.filter-form {\n background: $ui-base-color;\n\n &__column {\n padding: 10px 15px;\n }\n\n .radio-button {\n display: block;\n }\n}\n\n.radio-button {\n font-size: 14px;\n position: relative;\n display: inline-block;\n padding: 6px 0;\n line-height: 18px;\n cursor: default;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n cursor: pointer;\n\n input[type=radio],\n input[type=checkbox] {\n display: none;\n }\n\n &__input {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 50%;\n vertical-align: middle;\n\n &.checked {\n border-color: lighten($ui-highlight-color, 8%);\n background: lighten($ui-highlight-color, 8%);\n }\n }\n}\n",".search {\n position: relative;\n}\n\n.search__input {\n @include search-input();\n\n display: block;\n padding: 15px;\n padding-right: 30px;\n line-height: 18px;\n font-size: 16px;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n}\n\n.search__icon {\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus {\n outline: 0 !important;\n }\n\n .fa {\n position: absolute;\n top: 16px;\n right: 10px;\n z-index: 2;\n display: inline-block;\n opacity: 0;\n transition: all 100ms linear;\n transition-property: color, transform, opacity;\n font-size: 18px;\n width: 18px;\n height: 18px;\n color: $secondary-text-color;\n cursor: default;\n pointer-events: none;\n\n &.active {\n pointer-events: auto;\n opacity: 0.3;\n }\n }\n\n .fa-search {\n transform: rotate(0deg);\n\n &.active {\n pointer-events: auto;\n opacity: 0.3;\n }\n }\n\n .fa-times-circle {\n top: 17px;\n transform: rotate(0deg);\n color: $action-button-color;\n cursor: pointer;\n\n &.active {\n transform: rotate(90deg);\n }\n\n &:hover {\n color: lighten($action-button-color, 7%);\n }\n }\n}\n\n.search-results__header {\n color: $dark-text-color;\n background: lighten($ui-base-color, 2%);\n border-bottom: 1px solid darken($ui-base-color, 4%);\n padding: 15px 10px;\n font-size: 14px;\n font-weight: 500;\n}\n\n.search-results__info {\n padding: 20px;\n color: $darker-text-color;\n text-align: center;\n}\n\n.trends {\n &__header {\n color: $dark-text-color;\n background: lighten($ui-base-color, 2%);\n border-bottom: 1px solid darken($ui-base-color, 4%);\n font-weight: 500;\n padding: 15px;\n font-size: 16px;\n cursor: default;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n &__item {\n display: flex;\n align-items: center;\n padding: 15px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &:last-child {\n border-bottom: 0;\n }\n\n &__name {\n flex: 1 1 auto;\n color: $dark-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n strong {\n font-weight: 500;\n }\n\n a {\n color: $darker-text-color;\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:hover,\n &:focus,\n &:active {\n span {\n text-decoration: underline;\n }\n }\n }\n }\n\n &__current {\n flex: 0 0 auto;\n font-size: 24px;\n line-height: 36px;\n font-weight: 500;\n text-align: right;\n padding-right: 15px;\n margin-left: 5px;\n color: $secondary-text-color;\n }\n\n &__sparkline {\n flex: 0 0 auto;\n width: 50px;\n\n path:first-child {\n fill: rgba($highlight-text-color, 0.25) !important;\n fill-opacity: 1 !important;\n }\n\n path:last-child {\n stroke: lighten($highlight-text-color, 6%) !important;\n }\n }\n }\n}\n",null,".emojione {\n font-size: inherit;\n vertical-align: middle;\n object-fit: contain;\n margin: -.2ex .15em .2ex;\n width: 16px;\n height: 16px;\n\n img {\n width: auto;\n }\n}\n\n.emoji-picker-dropdown__menu {\n background: $simple-background-color;\n position: absolute;\n box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n margin-top: 5px;\n z-index: 2;\n\n .emoji-mart-scroll {\n transition: opacity 200ms ease;\n }\n\n &.selecting .emoji-mart-scroll {\n opacity: 0.5;\n }\n}\n\n.emoji-picker-dropdown__modifiers {\n position: absolute;\n top: 60px;\n right: 11px;\n cursor: pointer;\n}\n\n.emoji-picker-dropdown__modifiers__menu {\n position: absolute;\n z-index: 4;\n top: -4px;\n left: -8px;\n background: $simple-background-color;\n border-radius: 4px;\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n overflow: hidden;\n\n button {\n display: block;\n cursor: pointer;\n border: 0;\n padding: 4px 8px;\n background: transparent;\n\n &:hover,\n &:focus,\n &:active {\n background: rgba($ui-secondary-color, 0.4);\n }\n }\n\n .emoji-mart-emoji {\n height: 22px;\n }\n}\n\n.emoji-mart-emoji {\n span {\n background-repeat: no-repeat;\n }\n}\n\n.emoji-button {\n display: block;\n font-size: 24px;\n line-height: 24px;\n margin-left: 2px;\n width: 24px;\n outline: 0;\n cursor: pointer;\n\n &:active,\n &:focus {\n outline: 0 !important;\n }\n\n img {\n filter: grayscale(100%);\n opacity: 0.8;\n display: block;\n margin: 0;\n width: 22px;\n height: 22px;\n margin-top: 2px;\n }\n\n &:hover,\n &:active,\n &:focus {\n img {\n opacity: 1;\n filter: none;\n }\n }\n}\n","$doodleBg: #d9e1e8;\n.doodle-modal {\n @extend .boost-modal;\n width: unset;\n}\n\n.doodle-modal__container {\n background: $doodleBg;\n text-align: center;\n line-height: 0; // remove weird gap under canvas\n canvas {\n border: 5px solid $doodleBg;\n }\n}\n\n.doodle-modal__action-bar {\n @extend .boost-modal__action-bar;\n\n .filler {\n flex-grow: 1;\n margin: 0;\n padding: 0;\n }\n\n .doodle-toolbar {\n line-height: 1;\n\n display: flex;\n flex-direction: column;\n flex-grow: 0;\n justify-content: space-around;\n\n &.with-inputs {\n label {\n display: inline-block;\n width: 70px;\n text-align: right;\n margin-right: 2px;\n }\n\n input[type=\"number\"],input[type=\"text\"] {\n width: 40px;\n }\n span.val {\n display: inline-block;\n text-align: left;\n width: 50px;\n }\n }\n }\n\n .doodle-palette {\n padding-right: 0 !important;\n border: 1px solid black;\n line-height: .2rem;\n flex-grow: 0;\n background: white;\n\n button {\n appearance: none;\n width: 1rem;\n height: 1rem;\n margin: 0; padding: 0;\n text-align: center;\n color: black;\n text-shadow: 0 0 1px white;\n cursor: pointer;\n box-shadow: inset 0 0 1px rgba(white, .5);\n border: 1px solid black;\n outline-offset:-1px;\n\n &.foreground {\n outline: 1px dashed white;\n }\n\n &.background {\n outline: 1px dashed red;\n }\n\n &.foreground.background {\n outline: 1px dashed red;\n border-color: white;\n }\n }\n }\n}\n",".drawer {\n width: 300px;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n overflow-y: hidden;\n padding: 10px 5px;\n flex: none;\n\n &:first-child {\n padding-left: 10px;\n }\n\n &:last-child {\n padding-right: 10px;\n }\n\n @include single-column('screen and (max-width: 630px)') { flex: auto }\n\n @include limited-single-column('screen and (max-width: 630px)') {\n &, &:first-child, &:last-child { padding: 0 }\n }\n\n .wide & {\n min-width: 300px;\n max-width: 400px;\n flex: 1 1 200px;\n }\n\n @include single-column('screen and (max-width: 630px)') {\n :root & { // Overrides `.wide` for single-column view\n flex: auto;\n width: 100%;\n min-width: 0;\n max-width: none;\n padding: 0;\n }\n }\n\n .react-swipeable-view-container & { height: 100% }\n}\n\n.drawer--header {\n display: flex;\n flex-direction: row;\n margin-bottom: 10px;\n flex: none;\n background: lighten($ui-base-color, 8%);\n font-size: 16px;\n\n & > * {\n display: block;\n box-sizing: border-box;\n border-bottom: 2px solid transparent;\n padding: 15px 5px 13px;\n height: 48px;\n flex: 1 1 auto;\n color: $darker-text-color;\n text-align: center;\n text-decoration: none;\n cursor: pointer;\n }\n\n a {\n transition: background 100ms ease-in;\n\n &:focus,\n &:hover {\n outline: none;\n background: lighten($ui-base-color, 3%);\n transition: background 200ms ease-out;\n }\n }\n}\n\n.search {\n position: relative;\n margin-bottom: 10px;\n flex: none;\n\n @include limited-single-column('screen and (max-width: #{$no-gap-breakpoint})') { margin-bottom: 0 }\n @include single-column('screen and (max-width: 630px)') { font-size: 16px }\n}\n\n.search-popout {\n @include search-popout();\n}\n\n.drawer--account {\n padding: 10px;\n color: $darker-text-color;\n display: flex;\n align-items: center;\n\n a {\n color: inherit;\n text-decoration: none;\n }\n\n .acct {\n display: block;\n color: $secondary-text-color;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.navigation-bar__profile {\n flex: 1 1 auto;\n margin-left: 8px;\n overflow: hidden;\n}\n\n.drawer--results {\n background: $ui-base-color;\n overflow-x: hidden;\n overflow-y: auto;\n\n & > header {\n color: $dark-text-color;\n background: lighten($ui-base-color, 2%);\n padding: 15px;\n font-weight: 500;\n font-size: 16px;\n cursor: default;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n & > section {\n margin-bottom: 5px;\n\n h5 {\n background: darken($ui-base-color, 4%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n display: flex;\n padding: 15px;\n font-weight: 500;\n font-size: 16px;\n color: $dark-text-color;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n .account:last-child,\n & > div:last-child .status {\n border-bottom: 0;\n }\n\n & > .hashtag {\n display: block;\n padding: 10px;\n color: $secondary-text-color;\n text-decoration: none;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($secondary-text-color, 4%);\n text-decoration: underline;\n }\n }\n }\n}\n\n.drawer__pager {\n box-sizing: border-box;\n padding: 0;\n flex-grow: 1;\n position: relative;\n overflow: hidden;\n display: flex;\n}\n\n.drawer__inner {\n position: absolute;\n top: 0;\n left: 0;\n background: lighten($ui-base-color, 13%);\n box-sizing: border-box;\n padding: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n overflow-y: auto;\n width: 100%;\n height: 100%;\n\n &.darker {\n background: $ui-base-color;\n }\n}\n\n.drawer__inner__mastodon {\n background: lighten($ui-base-color, 13%) url('data:image/svg+xml;utf8,') no-repeat bottom / 100% auto;\n flex: 1;\n min-height: 47px;\n display: none;\n\n > img {\n display: block;\n object-fit: contain;\n object-position: bottom left;\n width: 100%;\n height: 100%;\n pointer-events: none;\n user-drag: none;\n user-select: none;\n }\n\n > .mastodon {\n display: block;\n width: 100%;\n height: 100%;\n border: none;\n cursor: inherit;\n }\n\n @media screen and (min-height: 640px) {\n display: block;\n }\n}\n\n.pseudo-drawer {\n background: lighten($ui-base-color, 13%);\n font-size: 13px;\n text-align: left;\n}\n\n.drawer__backdrop {\n cursor: pointer;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba($base-overlay-background, 0.5);\n}\n",".video-error-cover {\n align-items: center;\n background: $base-overlay-background;\n color: $primary-text-color;\n cursor: pointer;\n display: flex;\n flex-direction: column;\n height: 100%;\n justify-content: center;\n margin-top: 8px;\n position: relative;\n text-align: center;\n z-index: 100;\n}\n\n.media-spoiler {\n background: $base-overlay-background;\n color: $darker-text-color;\n border: 0;\n width: 100%;\n height: 100%;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($darker-text-color, 8%);\n }\n\n .status__content > & {\n margin-top: 15px; // Add margin when used bare for NSFW video player\n }\n @include fullwidth-gallery;\n}\n\n.media-spoiler__warning {\n display: block;\n font-size: 14px;\n}\n\n.media-spoiler__trigger {\n display: block;\n font-size: 11px;\n font-weight: 500;\n}\n\n.media-gallery__gifv__label {\n display: block;\n position: absolute;\n color: $primary-text-color;\n background: rgba($base-overlay-background, 0.5);\n bottom: 6px;\n left: 6px;\n padding: 2px 6px;\n border-radius: 2px;\n font-size: 11px;\n font-weight: 600;\n z-index: 1;\n pointer-events: none;\n opacity: 0.9;\n transition: opacity 0.1s ease;\n line-height: 18px;\n}\n\n.media-gallery__gifv {\n &.autoplay {\n .media-gallery__gifv__label {\n display: none;\n }\n }\n\n &:hover {\n .media-gallery__gifv__label {\n opacity: 1;\n }\n }\n}\n\n.media-gallery__audio {\n height: 100%;\n display: flex;\n flex-direction: column;\n\n span {\n text-align: center;\n color: $darker-text-color;\n display: flex;\n height: 100%;\n align-items: center;\n\n p {\n width: 100%;\n }\n }\n\n audio {\n width: 100%;\n }\n}\n\n.media-gallery {\n box-sizing: border-box;\n margin-top: 8px;\n overflow: hidden;\n border-radius: 4px;\n position: relative;\n width: 100%;\n height: 110px;\n\n @include fullwidth-gallery;\n}\n\n.media-gallery__item {\n border: none;\n box-sizing: border-box;\n display: block;\n float: left;\n position: relative;\n border-radius: 4px;\n overflow: hidden;\n\n .full-width & {\n border-radius: 0;\n }\n\n &.standalone {\n .media-gallery__item-gifv-thumbnail {\n transform: none;\n top: 0;\n }\n }\n\n &.letterbox {\n background: $base-shadow-color;\n }\n}\n\n.media-gallery__item-thumbnail {\n cursor: zoom-in;\n display: block;\n text-decoration: none;\n color: $secondary-text-color;\n position: relative;\n z-index: 1;\n\n &,\n img {\n height: 100%;\n width: 100%;\n object-fit: contain;\n\n &:not(.letterbox) {\n height: 100%;\n object-fit: cover;\n }\n }\n}\n\n.media-gallery__preview {\n width: 100%;\n height: 100%;\n object-fit: cover;\n position: absolute;\n top: 0;\n left: 0;\n z-index: 0;\n background: $base-overlay-background;\n\n &--hidden {\n display: none;\n }\n}\n\n.media-gallery__gifv {\n height: 100%;\n overflow: hidden;\n position: relative;\n width: 100%;\n display: flex;\n justify-content: center;\n}\n\n.media-gallery__item-gifv-thumbnail {\n cursor: zoom-in;\n height: 100%;\n width: 100%;\n position: relative;\n z-index: 1;\n object-fit: contain;\n user-select: none;\n\n &:not(.letterbox) {\n height: 100%;\n object-fit: cover;\n }\n}\n\n.media-gallery__item-thumbnail-label {\n clip: rect(1px 1px 1px 1px); /* IE6, IE7 */\n clip: rect(1px, 1px, 1px, 1px);\n overflow: hidden;\n position: absolute;\n}\n\n.video-modal__container {\n max-width: 100vw;\n max-height: 100vh;\n}\n\n.audio-modal__container {\n width: 50vw;\n}\n\n.media-modal {\n width: 100%;\n height: 100%;\n position: relative;\n\n .extended-video-player {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n video {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n }\n }\n}\n\n.media-modal__closer {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n}\n\n.media-modal__navigation {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n transition: opacity 0.3s linear;\n will-change: opacity;\n\n * {\n pointer-events: auto;\n }\n\n &.media-modal__navigation--hidden {\n opacity: 0;\n\n * {\n pointer-events: none;\n }\n }\n}\n\n.media-modal__nav {\n background: rgba($base-overlay-background, 0.5);\n box-sizing: border-box;\n border: 0;\n color: $primary-text-color;\n cursor: pointer;\n display: flex;\n align-items: center;\n font-size: 24px;\n height: 20vmax;\n margin: auto 0;\n padding: 30px 15px;\n position: absolute;\n top: 0;\n bottom: 0;\n}\n\n.media-modal__nav--left {\n left: 0;\n}\n\n.media-modal__nav--right {\n right: 0;\n}\n\n.media-modal__pagination {\n width: 100%;\n text-align: center;\n position: absolute;\n left: 0;\n bottom: 20px;\n pointer-events: none;\n}\n\n.media-modal__meta {\n text-align: center;\n position: absolute;\n left: 0;\n bottom: 20px;\n width: 100%;\n pointer-events: none;\n\n &--shifted {\n bottom: 62px;\n }\n\n a {\n pointer-events: auto;\n text-decoration: none;\n font-weight: 500;\n color: $ui-secondary-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.media-modal__page-dot {\n display: inline-block;\n}\n\n.media-modal__button {\n background-color: $white;\n height: 12px;\n width: 12px;\n border-radius: 6px;\n margin: 10px;\n padding: 0;\n border: 0;\n font-size: 0;\n}\n\n.media-modal__button--active {\n background-color: $ui-highlight-color;\n}\n\n.media-modal__close {\n position: absolute;\n right: 8px;\n top: 8px;\n z-index: 100;\n}\n\n.detailed,\n.fullscreen {\n .video-player__volume__current,\n .video-player__volume::before {\n bottom: 27px;\n }\n\n .video-player__volume__handle {\n bottom: 23px;\n }\n\n}\n\n.audio-player {\n box-sizing: border-box;\n position: relative;\n background: darken($ui-base-color, 8%);\n border-radius: 4px;\n padding-bottom: 44px;\n direction: ltr;\n\n &.editable {\n border-radius: 0;\n height: 100%;\n }\n\n &__waveform {\n padding: 15px 0;\n position: relative;\n overflow: hidden;\n\n &::before {\n content: \"\";\n display: block;\n position: absolute;\n border-top: 1px solid lighten($ui-base-color, 4%);\n width: 100%;\n height: 0;\n left: 0;\n top: calc(50% + 1px);\n }\n }\n\n &__progress-placeholder {\n background-color: rgba(lighten($ui-highlight-color, 8%), 0.5);\n }\n\n &__wave-placeholder {\n background-color: lighten($ui-base-color, 16%);\n }\n\n .video-player__controls {\n padding: 0 15px;\n padding-top: 10px;\n background: darken($ui-base-color, 8%);\n border-top: 1px solid lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n }\n}\n\n.video-player {\n overflow: hidden;\n position: relative;\n background: $base-shadow-color;\n max-width: 100%;\n border-radius: 4px;\n box-sizing: border-box;\n direction: ltr;\n\n &.editable {\n border-radius: 0;\n height: 100% !important;\n }\n\n &:focus {\n outline: 0;\n }\n\n .detailed-status & {\n width: 100%;\n height: 100%;\n }\n\n @include fullwidth-gallery;\n\n video {\n max-width: 100vw;\n max-height: 80vh;\n z-index: 1;\n position: relative;\n }\n\n &.fullscreen {\n width: 100% !important;\n height: 100% !important;\n margin: 0;\n\n video {\n max-width: 100% !important;\n max-height: 100% !important;\n width: 100% !important;\n height: 100% !important;\n outline: 0;\n }\n }\n\n &.inline {\n video {\n object-fit: contain;\n position: relative;\n top: 50%;\n transform: translateY(-50%);\n }\n }\n\n &__controls {\n position: absolute;\n z-index: 2;\n bottom: 0;\n left: 0;\n right: 0;\n box-sizing: border-box;\n background: linear-gradient(0deg, rgba($base-shadow-color, 0.85) 0, rgba($base-shadow-color, 0.45) 60%, transparent);\n padding: 0 15px;\n opacity: 0;\n transition: opacity .1s ease;\n\n &.active {\n opacity: 1;\n }\n }\n\n &.inactive {\n video,\n .video-player__controls {\n visibility: hidden;\n }\n }\n\n &__spoiler {\n display: none;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 4;\n border: 0;\n background: $base-shadow-color;\n color: $darker-text-color;\n transition: none;\n pointer-events: none;\n\n &.active {\n display: block;\n pointer-events: auto;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($darker-text-color, 7%);\n }\n }\n\n &__title {\n display: block;\n font-size: 14px;\n }\n\n &__subtitle {\n display: block;\n font-size: 11px;\n font-weight: 500;\n }\n }\n\n &__buttons-bar {\n display: flex;\n justify-content: space-between;\n padding-bottom: 10px;\n\n .video-player__download__icon {\n color: inherit;\n\n .fa,\n &:active .fa,\n &:hover .fa,\n &:focus .fa {\n color: inherit;\n }\n }\n }\n\n &__buttons {\n font-size: 16px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &.left {\n button {\n padding-left: 0;\n }\n }\n\n &.right {\n button {\n padding-right: 0;\n }\n }\n\n button {\n background: transparent;\n padding: 2px 10px;\n font-size: 16px;\n border: 0;\n color: rgba($white, 0.75);\n\n &:active,\n &:hover,\n &:focus {\n color: $white;\n }\n }\n }\n\n &__time-sep,\n &__time-total,\n &__time-current {\n font-size: 14px;\n font-weight: 500;\n }\n\n &__time-current {\n color: $white;\n margin-left: 60px;\n }\n\n &__time-sep {\n display: inline-block;\n margin: 0 6px;\n }\n\n &__time-sep,\n &__time-total {\n color: $white;\n }\n\n &__volume {\n cursor: pointer;\n height: 24px;\n display: inline;\n\n &::before {\n content: \"\";\n width: 50px;\n background: rgba($white, 0.35);\n border-radius: 4px;\n display: block;\n position: absolute;\n height: 4px;\n left: 70px;\n bottom: 20px;\n }\n\n &__current {\n display: block;\n position: absolute;\n height: 4px;\n border-radius: 4px;\n left: 70px;\n bottom: 20px;\n background: lighten($ui-highlight-color, 8%);\n }\n\n &__handle {\n position: absolute;\n z-index: 3;\n border-radius: 50%;\n width: 12px;\n height: 12px;\n bottom: 16px;\n left: 70px;\n transition: opacity .1s ease;\n background: lighten($ui-highlight-color, 8%);\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n pointer-events: none;\n }\n }\n\n &__link {\n padding: 2px 10px;\n\n a {\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n color: $white;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n }\n\n &__seek {\n cursor: pointer;\n height: 24px;\n position: relative;\n\n &::before {\n content: \"\";\n width: 100%;\n background: rgba($white, 0.35);\n border-radius: 4px;\n display: block;\n position: absolute;\n height: 4px;\n top: 10px;\n }\n\n &__progress,\n &__buffer {\n display: block;\n position: absolute;\n height: 4px;\n border-radius: 4px;\n top: 10px;\n background: lighten($ui-highlight-color, 8%);\n }\n\n &__buffer {\n background: rgba($white, 0.2);\n }\n\n &__handle {\n position: absolute;\n z-index: 3;\n opacity: 0;\n border-radius: 50%;\n width: 12px;\n height: 12px;\n top: 6px;\n margin-left: -6px;\n transition: opacity .1s ease;\n background: lighten($ui-highlight-color, 8%);\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n pointer-events: none;\n\n &.active {\n opacity: 1;\n }\n }\n\n &:hover {\n .video-player__seek__handle {\n opacity: 1;\n }\n }\n }\n\n &.detailed,\n &.fullscreen {\n .video-player__buttons {\n button {\n padding-top: 10px;\n padding-bottom: 10px;\n }\n }\n }\n}\n",".sensitive-info {\n display: flex;\n flex-direction: row;\n align-items: center;\n position: absolute;\n top: 4px;\n left: 4px;\n z-index: 100;\n}\n\n.sensitive-marker {\n margin: 0 3px;\n border-radius: 2px;\n padding: 2px 6px;\n color: rgba($primary-text-color, 0.8);\n background: rgba($base-overlay-background, 0.5);\n font-size: 12px;\n line-height: 18px;\n text-transform: uppercase;\n opacity: .9;\n transition: opacity .1s ease;\n\n .media-gallery:hover & { opacity: 1 }\n}\n",".list-editor {\n background: $ui-base-color;\n flex-direction: column;\n border-radius: 8px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n width: 380px;\n overflow: hidden;\n\n @media screen and (max-width: 420px) {\n width: 90%;\n }\n\n h4 {\n padding: 15px 0;\n background: lighten($ui-base-color, 13%);\n font-weight: 500;\n font-size: 16px;\n text-align: center;\n border-radius: 8px 8px 0 0;\n }\n\n .drawer__pager {\n height: 50vh;\n }\n\n .drawer__inner {\n border-radius: 0 0 8px 8px;\n\n &.backdrop {\n width: calc(100% - 60px);\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n border-radius: 0 0 0 8px;\n }\n }\n\n &__accounts {\n overflow-y: auto;\n }\n\n .account__display-name {\n &:hover strong {\n text-decoration: none;\n }\n }\n\n .account__avatar {\n cursor: default;\n }\n\n .search {\n margin-bottom: 0;\n }\n}\n\n.list-adder {\n background: $ui-base-color;\n flex-direction: column;\n border-radius: 8px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n width: 380px;\n overflow: hidden;\n\n @media screen and (max-width: 420px) {\n width: 90%;\n }\n\n &__account {\n background: lighten($ui-base-color, 13%);\n }\n\n &__lists {\n background: lighten($ui-base-color, 13%);\n height: 50vh;\n border-radius: 0 0 8px 8px;\n overflow-y: auto;\n }\n\n .list {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n .list__wrapper {\n display: flex;\n }\n\n .list__display-name {\n flex: 1 1 auto;\n overflow: hidden;\n text-decoration: none;\n font-size: 16px;\n padding: 10px;\n }\n}\n",".emoji-mart {\n &,\n * {\n box-sizing: border-box;\n line-height: 1.15;\n }\n\n font-size: 13px;\n display: inline-block;\n color: $inverted-text-color;\n\n .emoji-mart-emoji {\n padding: 6px;\n }\n}\n\n.emoji-mart-bar {\n border: 0 solid darken($ui-secondary-color, 8%);\n\n &:first-child {\n border-bottom-width: 1px;\n border-top-left-radius: 5px;\n border-top-right-radius: 5px;\n background: $ui-secondary-color;\n }\n\n &:last-child {\n border-top-width: 1px;\n border-bottom-left-radius: 5px;\n border-bottom-right-radius: 5px;\n display: none;\n }\n}\n\n.emoji-mart-anchors {\n display: flex;\n justify-content: space-between;\n padding: 0 6px;\n color: $lighter-text-color;\n line-height: 0;\n}\n\n.emoji-mart-anchor {\n position: relative;\n flex: 1;\n text-align: center;\n padding: 12px 4px;\n overflow: hidden;\n transition: color .1s ease-out;\n cursor: pointer;\n\n &:hover {\n color: darken($lighter-text-color, 4%);\n }\n}\n\n.emoji-mart-anchor-selected {\n color: $highlight-text-color;\n\n &:hover {\n color: darken($highlight-text-color, 4%);\n }\n\n .emoji-mart-anchor-bar {\n bottom: 0;\n }\n}\n\n.emoji-mart-anchor-bar {\n position: absolute;\n bottom: -3px;\n left: 0;\n width: 100%;\n height: 3px;\n background-color: darken($ui-highlight-color, 3%);\n}\n\n.emoji-mart-anchors {\n i {\n display: inline-block;\n width: 100%;\n max-width: 22px;\n }\n\n svg {\n fill: currentColor;\n max-height: 18px;\n }\n}\n\n.emoji-mart-scroll {\n overflow-y: scroll;\n height: 270px;\n max-height: 35vh;\n padding: 0 6px 6px;\n background: $simple-background-color;\n will-change: transform;\n\n &::-webkit-scrollbar-track:hover,\n &::-webkit-scrollbar-track:active {\n background-color: rgba($base-overlay-background, 0.3);\n }\n}\n\n.emoji-mart-search {\n padding: 10px;\n padding-right: 45px;\n background: $simple-background-color;\n\n input {\n font-size: 14px;\n font-weight: 400;\n padding: 7px 9px;\n font-family: inherit;\n display: block;\n width: 100%;\n background: rgba($ui-secondary-color, 0.3);\n color: $inverted-text-color;\n border: 1px solid $ui-secondary-color;\n border-radius: 4px;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n}\n\n.emoji-mart-category .emoji-mart-emoji {\n cursor: pointer;\n\n span {\n z-index: 1;\n position: relative;\n text-align: center;\n }\n\n &:hover::before {\n z-index: 0;\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba($ui-secondary-color, 0.7);\n border-radius: 100%;\n }\n}\n\n.emoji-mart-category-label {\n z-index: 2;\n position: relative;\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n\n span {\n display: block;\n width: 100%;\n font-weight: 500;\n padding: 5px 6px;\n background: $simple-background-color;\n }\n}\n\n.emoji-mart-emoji {\n position: relative;\n display: inline-block;\n font-size: 0;\n\n span {\n width: 22px;\n height: 22px;\n }\n}\n\n.emoji-mart-no-results {\n font-size: 14px;\n text-align: center;\n padding-top: 70px;\n color: $light-text-color;\n\n .emoji-mart-category-label {\n display: none;\n }\n\n .emoji-mart-no-results-label {\n margin-top: .2em;\n }\n\n .emoji-mart-emoji:hover::before {\n content: none;\n }\n}\n\n.emoji-mart-preview {\n display: none;\n}\n",".glitch.local-settings {\n position: relative;\n display: flex;\n flex-direction: row;\n background: $ui-secondary-color;\n color: $inverted-text-color;\n border-radius: 8px;\n height: 80vh;\n width: 80vw;\n max-width: 740px;\n max-height: 450px;\n overflow: hidden;\n\n label, legend {\n display: block;\n font-size: 14px;\n }\n\n .boolean label, .radio_buttons label {\n position: relative;\n padding-left: 28px;\n padding-top: 3px;\n\n input {\n position: absolute;\n left: 0;\n top: 0;\n }\n }\n\n span.hint {\n display: block;\n color: $lighter-text-color;\n }\n\n h1 {\n font-size: 18px;\n font-weight: 500;\n line-height: 24px;\n margin-bottom: 20px;\n }\n\n h2 {\n font-size: 15px;\n font-weight: 500;\n line-height: 20px;\n margin-top: 20px;\n margin-bottom: 10px;\n }\n}\n\n.glitch.local-settings__navigation__item {\n display: block;\n padding: 15px 20px;\n color: inherit;\n background: lighten($ui-secondary-color, 8%);\n border-bottom: 1px $ui-secondary-color solid;\n cursor: pointer;\n text-decoration: none;\n outline: none;\n transition: background .3s;\n\n .text-icon-button {\n color: inherit;\n transition: unset;\n }\n\n &:hover {\n background: $ui-secondary-color;\n }\n\n &.active {\n background: $ui-highlight-color;\n color: $primary-text-color;\n }\n\n &.close, &.close:hover {\n background: $error-value-color;\n color: $primary-text-color;\n }\n}\n\n.glitch.local-settings__navigation {\n background: lighten($ui-secondary-color, 8%);\n width: 212px;\n font-size: 15px;\n line-height: 20px;\n overflow-y: auto;\n}\n\n.glitch.local-settings__page {\n display: block;\n flex: auto;\n padding: 15px 20px 15px 20px;\n width: 360px;\n overflow-y: auto;\n}\n\n.glitch.local-settings__page__item {\n margin-bottom: 2px;\n}\n\n.glitch.local-settings__page__item.string,\n.glitch.local-settings__page__item.radio_buttons {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n\n@media screen and (max-width: 630px) {\n .glitch.local-settings__navigation {\n width: 40px;\n flex-shrink: 0;\n }\n\n .glitch.local-settings__navigation__item {\n padding: 10px;\n\n span:last-of-type {\n display: none;\n }\n }\n}\n",".error-boundary {\n color: $primary-text-color;\n font-size: 15px;\n line-height: 20px;\n\n h1 {\n font-size: 26px;\n line-height: 36px;\n font-weight: 400;\n margin-bottom: 8px;\n }\n\n a {\n color: $primary-text-color;\n text-decoration: underline;\n }\n\n ul {\n list-style: disc;\n margin-left: 0;\n padding-left: 1em;\n }\n\n textarea.web_app_crash-stacktrace {\n width: 100%;\n resize: none;\n white-space: pre;\n font-family: $font-monospace, monospace;\n }\n}\n",".compose-panel {\n width: 285px;\n margin-top: 10px;\n display: flex;\n flex-direction: column;\n height: calc(100% - 10px);\n overflow-y: hidden;\n\n .search__input {\n line-height: 18px;\n font-size: 16px;\n padding: 15px;\n padding-right: 30px;\n }\n\n .search__icon .fa {\n top: 15px;\n }\n\n .drawer--account {\n flex: 0 1 48px;\n }\n\n .flex-spacer {\n background: transparent;\n }\n\n .composer {\n flex: 1;\n overflow-y: hidden;\n display: flex;\n flex-direction: column;\n min-height: 310px;\n }\n\n .compose-form__autosuggest-wrapper {\n overflow-y: auto;\n background-color: $white;\n border-radius: 4px 4px 0 0;\n flex: 0 1 auto;\n }\n\n .autosuggest-textarea__textarea {\n overflow-y: hidden;\n }\n\n .compose-form__upload-thumbnail {\n height: 80px;\n }\n}\n\n.navigation-panel {\n margin-top: 10px;\n margin-bottom: 10px;\n height: calc(100% - 20px);\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n\n & > a {\n flex: 0 0 auto;\n }\n\n hr {\n flex: 0 0 auto;\n border: 0;\n background: transparent;\n border-top: 1px solid lighten($ui-base-color, 4%);\n margin: 10px 0;\n }\n\n .flex-spacer {\n background: transparent;\n }\n}\n\n@media screen and (min-width: 600px) {\n .tabs-bar__link {\n span {\n display: inline;\n }\n }\n}\n\n.columns-area--mobile {\n flex-direction: column;\n width: 100%;\n margin: 0 auto;\n\n .column,\n .drawer {\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .directory__list {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: block;\n }\n }\n\n .directory__card {\n margin-bottom: 0;\n }\n\n .filter-form {\n display: flex;\n }\n\n .autosuggest-textarea__textarea {\n font-size: 16px;\n }\n\n .search__input {\n line-height: 18px;\n font-size: 16px;\n padding: 15px;\n padding-right: 30px;\n }\n\n .search__icon .fa {\n top: 15px;\n }\n\n .scrollable {\n overflow: visible;\n\n @supports(display: grid) {\n contain: content;\n }\n }\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding: 10px 0;\n padding-top: 0;\n }\n\n @media screen and (min-width: 630px) {\n .detailed-status {\n padding: 15px;\n\n .media-gallery,\n .video-player,\n .audio-player {\n margin-top: 15px;\n }\n }\n\n .account__header__bar {\n padding: 5px 10px;\n }\n\n .navigation-bar,\n .compose-form {\n padding: 15px;\n }\n\n .compose-form .compose-form__publish .compose-form__publish-button-wrapper {\n padding-top: 15px;\n }\n\n .status {\n padding: 15px;\n min-height: 48px + 2px;\n\n .media-gallery,\n &__action-bar,\n .video-player,\n .audio-player {\n margin-top: 10px;\n }\n }\n\n .account {\n padding: 15px 10px;\n\n &__header__bio {\n margin: 0 -10px;\n }\n }\n\n .notification {\n &__message {\n padding-top: 15px;\n }\n\n .status {\n padding-top: 8px;\n }\n\n .account {\n padding-top: 8px;\n }\n }\n }\n}\n\n.floating-action-button {\n position: fixed;\n display: flex;\n justify-content: center;\n align-items: center;\n width: 3.9375rem;\n height: 3.9375rem;\n bottom: 1.3125rem;\n right: 1.3125rem;\n background: darken($ui-highlight-color, 3%);\n color: $white;\n border-radius: 50%;\n font-size: 21px;\n line-height: 21px;\n text-decoration: none;\n box-shadow: 2px 3px 9px rgba($base-shadow-color, 0.4);\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-highlight-color, 7%);\n }\n}\n\n@media screen and (min-width: $no-gap-breakpoint) {\n .tabs-bar {\n width: 100%;\n }\n\n .react-swipeable-view-container .columns-area--mobile {\n height: calc(100% - 10px) !important;\n }\n\n .getting-started__wrapper,\n .search {\n margin-bottom: 10px;\n }\n}\n\n@media screen and (max-width: 600px + (285px * 1) + (10px * 1)) {\n .columns-area__panels__pane--compositional {\n display: none;\n }\n}\n\n@media screen and (min-width: 600px + (285px * 1) + (10px * 1)) {\n .floating-action-button,\n .tabs-bar__link.optional {\n display: none;\n }\n\n .search-page .search {\n display: none;\n }\n}\n\n@media screen and (max-width: 600px + (285px * 2) + (10px * 2)) {\n .columns-area__panels__pane--navigational {\n display: none;\n }\n}\n\n@media screen and (min-width: 600px + (285px * 2) + (10px * 2)) {\n .tabs-bar {\n display: none;\n }\n}\n",".poll {\n margin-top: 16px;\n font-size: 14px;\n\n ul,\n .e-content & ul {\n margin: 0;\n list-style: none;\n }\n\n li {\n margin-bottom: 10px;\n position: relative;\n }\n\n &__chart {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n display: inline-block;\n border-radius: 4px;\n background: darken($ui-primary-color, 14%);\n\n &.leading {\n background: $ui-highlight-color;\n }\n }\n\n &__text {\n position: relative;\n display: flex;\n padding: 6px 0;\n line-height: 18px;\n cursor: default;\n overflow: hidden;\n\n input[type=radio],\n input[type=checkbox] {\n display: none;\n }\n\n .autossugest-input {\n flex: 1 1 auto;\n }\n\n input[type=text] {\n display: block;\n box-sizing: border-box;\n width: 100%;\n font-size: 14px;\n color: $inverted-text-color;\n display: block;\n outline: 0;\n font-family: inherit;\n background: $simple-background-color;\n border: 1px solid darken($simple-background-color, 14%);\n border-radius: 4px;\n padding: 6px 10px;\n\n &:focus {\n border-color: $highlight-text-color;\n }\n }\n\n &.selectable {\n cursor: pointer;\n }\n\n &.editable {\n display: flex;\n align-items: center;\n overflow: visible;\n }\n }\n\n &__input {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 50%;\n vertical-align: middle;\n margin-top: auto;\n margin-bottom: auto;\n flex: 0 0 18px;\n\n &.checkbox {\n border-radius: 4px;\n }\n\n &.active {\n border-color: $valid-value-color;\n background: $valid-value-color;\n }\n\n &:active,\n &:focus,\n &:hover {\n border-width: 4px;\n background: none;\n }\n\n &::-moz-focus-inner {\n outline: 0 !important;\n border: 0;\n }\n\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n\n &__number {\n display: inline-block;\n width: 52px;\n font-weight: 700;\n padding: 0 10px;\n padding-left: 8px;\n text-align: right;\n margin-top: auto;\n margin-bottom: auto;\n flex: 0 0 52px;\n }\n\n &__vote__mark {\n float: left;\n line-height: 18px;\n }\n\n &__footer {\n padding-top: 6px;\n padding-bottom: 5px;\n color: $dark-text-color;\n }\n\n &__link {\n display: inline;\n background: transparent;\n padding: 0;\n margin: 0;\n border: 0;\n color: $dark-text-color;\n text-decoration: underline;\n font-size: inherit;\n\n &:hover {\n text-decoration: none;\n }\n\n &:active,\n &:focus {\n background-color: rgba($dark-text-color, .1);\n }\n }\n\n .button {\n height: 36px;\n padding: 0 16px;\n margin-right: 10px;\n font-size: 14px;\n }\n}\n\n.compose-form__poll-wrapper {\n border-top: 1px solid darken($simple-background-color, 8%);\n\n ul {\n padding: 10px;\n }\n\n .poll__footer {\n border-top: 1px solid darken($simple-background-color, 8%);\n padding: 10px;\n display: flex;\n align-items: center;\n\n button,\n select {\n width: 100%;\n flex: 1 1 50%;\n\n &:focus {\n border-color: $highlight-text-color;\n }\n }\n }\n\n .button.button-secondary {\n font-size: 14px;\n font-weight: 400;\n padding: 6px 10px;\n height: auto;\n line-height: inherit;\n color: $action-button-color;\n border-color: $action-button-color;\n margin-right: 5px;\n }\n\n li {\n display: flex;\n align-items: center;\n\n .poll__text {\n flex: 0 0 auto;\n width: calc(100% - (23px + 6px));\n margin-right: 6px;\n }\n }\n\n select {\n appearance: none;\n box-sizing: border-box;\n font-size: 14px;\n color: $inverted-text-color;\n display: inline-block;\n width: auto;\n outline: 0;\n font-family: inherit;\n background: $simple-background-color url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center / auto 16px;\n border: 1px solid darken($simple-background-color, 14%);\n border-radius: 4px;\n padding: 6px 10px;\n padding-right: 30px;\n }\n\n .icon-button.disabled {\n color: darken($simple-background-color, 14%);\n }\n}\n\n.muted .poll {\n color: $dark-text-color;\n\n &__chart {\n background: rgba(darken($ui-primary-color, 14%), 0.2);\n\n &.leading {\n background: rgba($ui-highlight-color, 0.2);\n }\n }\n}\n","$maximum-width: 1235px;\n$fluid-breakpoint: $maximum-width + 20px;\n$column-breakpoint: 700px;\n$small-breakpoint: 960px;\n\n.container {\n box-sizing: border-box;\n max-width: $maximum-width;\n margin: 0 auto;\n position: relative;\n\n @media screen and (max-width: $fluid-breakpoint) {\n width: 100%;\n padding: 0 10px;\n }\n}\n\n.rich-formatting {\n font-family: $font-sans-serif, sans-serif;\n font-size: 14px;\n font-weight: 400;\n line-height: 1.7;\n word-wrap: break-word;\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n p,\n li {\n color: $darker-text-color;\n }\n\n p {\n margin-top: 0;\n margin-bottom: .85em;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n strong {\n font-weight: 700;\n color: $secondary-text-color;\n }\n\n em {\n font-style: italic;\n color: $secondary-text-color;\n }\n\n code {\n font-size: 0.85em;\n background: darken($ui-base-color, 8%);\n border-radius: 4px;\n padding: 0.2em 0.3em;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n font-family: $font-display, sans-serif;\n margin-top: 1.275em;\n margin-bottom: .85em;\n font-weight: 500;\n color: $secondary-text-color;\n }\n\n h1 {\n font-size: 2em;\n }\n\n h2 {\n font-size: 1.75em;\n }\n\n h3 {\n font-size: 1.5em;\n }\n\n h4 {\n font-size: 1.25em;\n }\n\n h5,\n h6 {\n font-size: 1em;\n }\n\n ul {\n list-style: disc;\n }\n\n ol {\n list-style: decimal;\n }\n\n ul,\n ol {\n margin: 0;\n padding: 0;\n padding-left: 2em;\n margin-bottom: 0.85em;\n\n &[type='a'] {\n list-style-type: lower-alpha;\n }\n\n &[type='i'] {\n list-style-type: lower-roman;\n }\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n margin: 1.7em 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n\n table {\n width: 100%;\n border-collapse: collapse;\n break-inside: auto;\n margin-top: 24px;\n margin-bottom: 32px;\n\n thead tr,\n tbody tr {\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n font-size: 1em;\n line-height: 1.625;\n font-weight: 400;\n text-align: left;\n color: $darker-text-color;\n }\n\n thead tr {\n border-bottom-width: 2px;\n line-height: 1.5;\n font-weight: 500;\n color: $dark-text-color;\n }\n\n th,\n td {\n padding: 8px;\n align-self: start;\n align-items: start;\n word-break: break-all;\n\n &.nowrap {\n width: 25%;\n position: relative;\n\n &::before {\n content: ' ';\n visibility: hidden;\n }\n\n span {\n position: absolute;\n left: 8px;\n right: 8px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n }\n\n & > :first-child {\n margin-top: 0;\n }\n}\n\n.information-board {\n background: darken($ui-base-color, 4%);\n padding: 20px 0;\n\n .container-alt {\n position: relative;\n padding-right: 280px + 15px;\n }\n\n &__sections {\n display: flex;\n justify-content: space-between;\n flex-wrap: wrap;\n }\n\n &__section {\n flex: 1 0 0;\n font-family: $font-sans-serif, sans-serif;\n font-size: 16px;\n line-height: 28px;\n color: $primary-text-color;\n text-align: right;\n padding: 10px 15px;\n\n span,\n strong {\n display: block;\n }\n\n span {\n &:last-child {\n color: $secondary-text-color;\n }\n }\n\n strong {\n font-family: $font-display, sans-serif;\n font-weight: 500;\n font-size: 32px;\n line-height: 48px;\n }\n\n @media screen and (max-width: $column-breakpoint) {\n text-align: center;\n }\n }\n\n .panel {\n position: absolute;\n width: 280px;\n box-sizing: border-box;\n background: darken($ui-base-color, 8%);\n padding: 20px;\n padding-top: 10px;\n border-radius: 4px 4px 0 0;\n right: 0;\n bottom: -40px;\n\n .panel-header {\n font-family: $font-display, sans-serif;\n font-size: 14px;\n line-height: 24px;\n font-weight: 500;\n color: $darker-text-color;\n padding-bottom: 5px;\n margin-bottom: 15px;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n\n a,\n span {\n font-weight: 400;\n color: darken($darker-text-color, 10%);\n }\n\n a {\n text-decoration: none;\n }\n }\n }\n\n .owner {\n text-align: center;\n\n .avatar {\n width: 80px;\n height: 80px;\n @include avatar-size(80px);\n margin: 0 auto;\n margin-bottom: 15px;\n\n img {\n display: block;\n width: 80px;\n height: 80px;\n border-radius: 48px;\n @include avatar-radius();\n }\n }\n\n .name {\n font-size: 14px;\n\n a {\n display: block;\n color: $primary-text-color;\n text-decoration: none;\n\n &:hover {\n .display_name {\n text-decoration: underline;\n }\n }\n }\n\n .username {\n display: block;\n color: $darker-text-color;\n }\n }\n }\n}\n\n.landing-page {\n p,\n li {\n font-family: $font-sans-serif, sans-serif;\n font-size: 16px;\n font-weight: 400;\n font-size: 16px;\n line-height: 30px;\n margin-bottom: 12px;\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n }\n }\n\n em {\n display: inline;\n margin: 0;\n padding: 0;\n font-weight: 700;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n color: lighten($darker-text-color, 10%);\n }\n\n h1 {\n font-family: $font-display, sans-serif;\n font-size: 26px;\n line-height: 30px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n\n small {\n font-family: $font-sans-serif, sans-serif;\n display: block;\n font-size: 18px;\n font-weight: 400;\n color: lighten($darker-text-color, 10%);\n }\n }\n\n h2 {\n font-family: $font-display, sans-serif;\n font-size: 22px;\n line-height: 26px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h3 {\n font-family: $font-display, sans-serif;\n font-size: 18px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h4 {\n font-family: $font-display, sans-serif;\n font-size: 16px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h5 {\n font-family: $font-display, sans-serif;\n font-size: 14px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h6 {\n font-family: $font-display, sans-serif;\n font-size: 12px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n ul,\n ol {\n margin-left: 20px;\n\n &[type='a'] {\n list-style-type: lower-alpha;\n }\n\n &[type='i'] {\n list-style-type: lower-roman;\n }\n }\n\n ul {\n list-style: disc;\n }\n\n ol {\n list-style: decimal;\n }\n\n li > ol,\n li > ul {\n margin-top: 6px;\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid rgba($ui-base-lighter-color, .6);\n margin: 20px 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n\n &__information,\n &__forms {\n padding: 20px;\n }\n\n &__call-to-action {\n background: $ui-base-color;\n border-radius: 4px;\n padding: 25px 40px;\n overflow: hidden;\n box-sizing: border-box;\n\n .row {\n width: 100%;\n display: flex;\n flex-direction: row-reverse;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n }\n\n .row__information-board {\n display: flex;\n justify-content: flex-end;\n align-items: flex-end;\n\n .information-board__section {\n flex: 1 0 auto;\n padding: 0 10px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n width: 100%;\n justify-content: space-between;\n }\n }\n\n .row__mascot {\n flex: 1;\n margin: 10px -50px 0 0;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n }\n\n &__logo {\n margin-right: 20px;\n\n img {\n height: 50px;\n width: auto;\n mix-blend-mode: lighten;\n }\n }\n\n &__information {\n padding: 45px 40px;\n margin-bottom: 10px;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n strong {\n font-weight: 500;\n color: lighten($darker-text-color, 10%);\n }\n\n .account {\n border-bottom: 0;\n padding: 0;\n\n &__display-name {\n align-items: center;\n display: flex;\n margin-right: 5px;\n }\n\n div.account__display-name {\n &:hover {\n .display-name strong {\n text-decoration: none;\n }\n }\n\n .account__avatar {\n cursor: default;\n }\n }\n\n &__avatar-wrapper {\n margin-left: 0;\n flex: 0 0 auto;\n }\n\n &__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n @include avatar-size(44px);\n }\n\n .display-name {\n font-size: 15px;\n\n &__account {\n font-size: 14px;\n }\n }\n }\n\n @media screen and (max-width: $small-breakpoint) {\n .contact {\n margin-top: 30px;\n }\n }\n\n @media screen and (max-width: $column-breakpoint) {\n padding: 25px 20px;\n }\n }\n\n &__information,\n &__forms,\n #mastodon-timeline {\n box-sizing: border-box;\n background: $ui-base-color;\n border-radius: 4px;\n box-shadow: 0 0 6px rgba($black, 0.1);\n }\n\n &__mascot {\n height: 104px;\n position: relative;\n left: -40px;\n bottom: 25px;\n\n img {\n height: 190px;\n width: auto;\n }\n }\n\n &__short-description {\n .row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n margin-bottom: 40px;\n }\n\n @media screen and (max-width: $column-breakpoint) {\n .row {\n margin-bottom: 20px;\n }\n }\n\n p a {\n color: $secondary-text-color;\n }\n\n h1 {\n font-weight: 500;\n color: $primary-text-color;\n margin-bottom: 0;\n\n small {\n color: $darker-text-color;\n\n span {\n color: $secondary-text-color;\n }\n }\n }\n\n p:last-child {\n margin-bottom: 0;\n }\n }\n\n &__hero {\n margin-bottom: 10px;\n\n img {\n display: block;\n margin: 0;\n max-width: 100%;\n height: auto;\n border-radius: 4px;\n }\n }\n\n @media screen and (max-width: 840px) {\n .information-board {\n .container-alt {\n padding-right: 20px;\n }\n\n .panel {\n position: static;\n margin-top: 20px;\n width: 100%;\n border-radius: 4px;\n\n .panel-header {\n text-align: center;\n }\n }\n }\n }\n\n @media screen and (max-width: 675px) {\n .header-wrapper {\n padding-top: 0;\n\n &.compact {\n padding-bottom: 0;\n }\n\n &.compact .hero .heading {\n text-align: initial;\n }\n }\n\n .header .container-alt,\n .features .container-alt {\n display: block;\n }\n }\n\n .cta {\n margin: 20px;\n }\n}\n\n.landing {\n margin-bottom: 100px;\n\n @media screen and (max-width: 738px) {\n margin-bottom: 0;\n }\n\n &__brand {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 50px;\n\n svg {\n fill: $primary-text-color;\n height: 52px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding: 0;\n margin-bottom: 30px;\n }\n }\n\n .directory {\n margin-top: 30px;\n background: transparent;\n box-shadow: none;\n border-radius: 0;\n }\n\n .hero-widget {\n margin-top: 30px;\n margin-bottom: 0;\n\n h4 {\n padding: 10px;\n text-transform: uppercase;\n font-weight: 700;\n font-size: 13px;\n color: $darker-text-color;\n }\n\n &__text {\n border-radius: 0;\n padding-bottom: 0;\n }\n\n &__footer {\n background: $ui-base-color;\n padding: 10px;\n border-radius: 0 0 4px 4px;\n display: flex;\n\n &__column {\n flex: 1 1 50%;\n }\n }\n\n .account {\n padding: 10px 0;\n border-bottom: 0;\n\n .account__display-name {\n display: flex;\n align-items: center;\n }\n\n .account__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n }\n\n &__counter {\n padding: 10px;\n\n strong {\n font-family: $font-display, sans-serif;\n font-size: 15px;\n font-weight: 700;\n display: block;\n }\n\n span {\n font-size: 14px;\n color: $darker-text-color;\n }\n }\n }\n\n .simple_form .user_agreement .label_input > label {\n font-weight: 400;\n color: $darker-text-color;\n }\n\n .simple_form p.lead {\n color: $darker-text-color;\n font-size: 15px;\n line-height: 20px;\n font-weight: 400;\n margin-bottom: 25px;\n }\n\n &__grid {\n max-width: 960px;\n margin: 0 auto;\n display: grid;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n grid-gap: 30px;\n\n @media screen and (max-width: 738px) {\n grid-template-columns: minmax(0, 100%);\n grid-gap: 10px;\n\n &__column-login {\n grid-row: 1;\n display: flex;\n flex-direction: column;\n\n .box-widget {\n order: 2;\n flex: 0 0 auto;\n }\n\n .hero-widget {\n margin-top: 0;\n margin-bottom: 10px;\n order: 1;\n flex: 0 0 auto;\n }\n }\n\n &__column-registration {\n grid-row: 2;\n }\n\n .directory {\n margin-top: 10px;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n\n .hero-widget {\n display: block;\n margin-bottom: 0;\n box-shadow: none;\n\n &__img,\n &__img img,\n &__footer {\n border-radius: 0;\n }\n }\n\n .hero-widget,\n .box-widget,\n .directory__tag {\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n .directory {\n margin-top: 0;\n\n &__tag {\n margin-bottom: 0;\n\n & > a,\n & > div {\n border-radius: 0;\n box-shadow: none;\n }\n\n &:last-child {\n border-bottom: 0;\n }\n }\n }\n }\n }\n}\n\n.brand {\n position: relative;\n text-decoration: none;\n}\n\n.brand__tagline {\n display: block;\n position: absolute;\n bottom: -10px;\n left: 50px;\n width: 300px;\n color: $ui-primary-color;\n text-decoration: none;\n font-size: 14px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n position: static;\n width: auto;\n margin-top: 20px;\n color: $dark-text-color;\n }\n}\n\n",".table {\n width: 100%;\n max-width: 100%;\n border-spacing: 0;\n border-collapse: collapse;\n\n th,\n td {\n padding: 8px;\n line-height: 18px;\n vertical-align: top;\n border-top: 1px solid $ui-base-color;\n text-align: left;\n background: darken($ui-base-color, 4%);\n }\n\n & > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid $ui-base-color;\n border-top: 0;\n font-weight: 500;\n }\n\n & > tbody > tr > th {\n font-weight: 500;\n }\n\n & > tbody > tr:nth-child(odd) > td,\n & > tbody > tr:nth-child(odd) > th {\n background: $ui-base-color;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n &.inline-table {\n & > tbody > tr:nth-child(odd) {\n & > td,\n & > th {\n background: transparent;\n }\n }\n\n & > tbody > tr:first-child {\n & > td,\n & > th {\n border-top: 0;\n }\n }\n }\n\n &.batch-table {\n & > thead > tr > th {\n background: $ui-base-color;\n border-top: 1px solid darken($ui-base-color, 8%);\n border-bottom: 1px solid darken($ui-base-color, 8%);\n\n &:first-child {\n border-radius: 4px 0 0;\n border-left: 1px solid darken($ui-base-color, 8%);\n }\n\n &:last-child {\n border-radius: 0 4px 0 0;\n border-right: 1px solid darken($ui-base-color, 8%);\n }\n }\n }\n\n &--invites tbody td {\n vertical-align: middle;\n }\n}\n\n.table-wrapper {\n overflow: auto;\n margin-bottom: 20px;\n}\n\nsamp {\n font-family: $font-monospace, monospace;\n}\n\nbutton.table-action-link {\n background: transparent;\n border: 0;\n font: inherit;\n}\n\nbutton.table-action-link,\na.table-action-link {\n text-decoration: none;\n display: inline-block;\n margin-right: 5px;\n padding: 0 10px;\n color: $darker-text-color;\n font-weight: 500;\n\n &:hover {\n color: $primary-text-color;\n }\n\n i.fa {\n font-weight: 400;\n margin-right: 5px;\n }\n\n &:first-child {\n padding-left: 0;\n }\n}\n\n.batch-table {\n &__toolbar,\n &__row {\n display: flex;\n\n &__select {\n box-sizing: border-box;\n padding: 8px 16px;\n cursor: pointer;\n min-height: 100%;\n\n input {\n margin-top: 8px;\n }\n\n &--aligned {\n display: flex;\n align-items: center;\n\n input {\n margin-top: 0;\n }\n }\n }\n\n &__actions,\n &__content {\n padding: 8px 0;\n padding-right: 16px;\n flex: 1 1 auto;\n }\n }\n\n &__toolbar {\n border: 1px solid darken($ui-base-color, 8%);\n background: $ui-base-color;\n border-radius: 4px 0 0;\n height: 47px;\n align-items: center;\n\n &__actions {\n text-align: right;\n padding-right: 16px - 5px;\n }\n }\n\n &__form {\n padding: 16px;\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n background: $ui-base-color;\n\n .fields-row {\n padding-top: 0;\n margin-bottom: 0;\n }\n }\n\n &__row {\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n background: darken($ui-base-color, 4%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n .optional &:first-child {\n border-top: 1px solid darken($ui-base-color, 8%);\n }\n }\n\n &:hover {\n background: darken($ui-base-color, 2%);\n }\n\n &:nth-child(even) {\n background: $ui-base-color;\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n }\n\n &__content {\n padding-top: 12px;\n padding-bottom: 16px;\n\n &--unpadded {\n padding: 0;\n }\n\n &--with-image {\n display: flex;\n align-items: center;\n }\n\n &__image {\n flex: 0 0 auto;\n display: flex;\n justify-content: center;\n align-items: center;\n margin-right: 10px;\n\n .emojione {\n width: 32px;\n height: 32px;\n }\n }\n\n &__text {\n flex: 1 1 auto;\n }\n\n &__extra {\n flex: 0 0 auto;\n text-align: right;\n color: $darker-text-color;\n font-weight: 500;\n }\n }\n\n .directory__tag {\n margin: 0;\n width: 100%;\n\n a {\n background: transparent;\n border-radius: 0;\n }\n }\n }\n\n &.optional .batch-table__toolbar,\n &.optional .batch-table__row__select {\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n\n .status__content {\n padding-top: 0;\n\n strong {\n font-weight: 700;\n }\n }\n\n .nothing-here {\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n box-shadow: none;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 1px solid darken($ui-base-color, 8%);\n }\n }\n\n @media screen and (max-width: 870px) {\n .accounts-table tbody td.optional {\n display: none;\n }\n }\n}\n","$no-columns-breakpoint: 600px;\n$sidebar-width: 240px;\n$content-width: 840px;\n\n.admin-wrapper {\n display: flex;\n justify-content: center;\n width: 100%;\n min-height: 100vh;\n\n .sidebar-wrapper {\n min-height: 100vh;\n overflow: hidden;\n pointer-events: none;\n flex: 1 1 auto;\n\n &__inner {\n display: flex;\n justify-content: flex-end;\n background: $ui-base-color;\n height: 100%;\n }\n }\n\n .sidebar {\n width: $sidebar-width;\n padding: 0;\n pointer-events: auto;\n\n &__toggle {\n display: none;\n background: lighten($ui-base-color, 8%);\n height: 48px;\n\n &__logo {\n flex: 1 1 auto;\n\n a {\n display: inline-block;\n padding: 15px;\n }\n\n svg {\n fill: $primary-text-color;\n height: 20px;\n position: relative;\n bottom: -2px;\n }\n }\n\n &__icon {\n display: block;\n color: $darker-text-color;\n text-decoration: none;\n flex: 0 0 auto;\n font-size: 20px;\n padding: 15px;\n }\n\n a {\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 12%);\n }\n }\n }\n\n .logo {\n display: block;\n margin: 40px auto;\n width: 100px;\n height: 100px;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n & > a:first-child {\n display: none;\n }\n }\n\n ul {\n list-style: none;\n border-radius: 4px 0 0 4px;\n overflow: hidden;\n margin-bottom: 20px;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n margin-bottom: 0;\n }\n\n a {\n display: block;\n padding: 15px;\n color: $darker-text-color;\n text-decoration: none;\n transition: all 200ms linear;\n transition-property: color, background-color;\n border-radius: 4px 0 0 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n i.fa {\n margin-right: 5px;\n }\n\n &:hover {\n color: $primary-text-color;\n background-color: darken($ui-base-color, 5%);\n transition: all 100ms linear;\n transition-property: color, background-color;\n }\n\n &.selected {\n background: darken($ui-base-color, 2%);\n border-radius: 4px 0 0;\n }\n }\n\n ul {\n background: darken($ui-base-color, 4%);\n border-radius: 0 0 0 4px;\n margin: 0;\n\n a {\n border: 0;\n padding: 15px 35px;\n }\n }\n\n .simple-navigation-active-leaf a {\n color: $primary-text-color;\n background-color: $ui-highlight-color;\n border-bottom: 0;\n border-radius: 0;\n\n &:hover {\n background-color: lighten($ui-highlight-color, 5%);\n }\n }\n }\n\n & > ul > .simple-navigation-active-leaf a {\n border-radius: 4px 0 0 4px;\n }\n }\n\n .content-wrapper {\n box-sizing: border-box;\n width: 100%;\n max-width: $content-width;\n flex: 1 1 auto;\n }\n\n @media screen and (max-width: $content-width + $sidebar-width) {\n .sidebar-wrapper--empty {\n display: none;\n }\n\n .sidebar-wrapper {\n width: $sidebar-width;\n flex: 0 0 auto;\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n .sidebar-wrapper {\n width: 100%;\n }\n }\n\n .content {\n padding: 20px 15px;\n padding-top: 60px;\n padding-left: 25px;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n max-width: none;\n padding: 15px;\n padding-top: 30px;\n }\n\n &-heading {\n display: flex;\n\n padding-bottom: 40px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n margin: -15px -15px 40px 0;\n\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n\n & > * {\n margin-top: 15px;\n margin-right: 15px;\n }\n\n &-actions {\n display: inline-flex;\n\n & > :not(:first-child) {\n margin-left: 5px;\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n border-bottom: 0;\n padding-bottom: 0;\n }\n }\n\n h2 {\n color: $secondary-text-color;\n font-size: 24px;\n line-height: 28px;\n font-weight: 400;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n font-weight: 700;\n }\n }\n\n h3 {\n color: $secondary-text-color;\n font-size: 20px;\n line-height: 28px;\n font-weight: 400;\n margin-bottom: 30px;\n }\n\n h4 {\n text-transform: uppercase;\n font-size: 13px;\n font-weight: 700;\n color: $darker-text-color;\n padding-bottom: 8px;\n margin-bottom: 8px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n h6 {\n font-size: 16px;\n color: $secondary-text-color;\n line-height: 28px;\n font-weight: 500;\n }\n\n .fields-group h6 {\n color: $primary-text-color;\n font-weight: 500;\n }\n\n .directory__tag > a,\n .directory__tag > div {\n box-shadow: none;\n }\n\n .directory__tag .table-action-link .fa {\n color: inherit;\n }\n\n .directory__tag h4 {\n font-size: 18px;\n font-weight: 700;\n color: $primary-text-color;\n text-transform: none;\n padding-bottom: 0;\n margin-bottom: 0;\n border-bottom: none;\n }\n\n & > p {\n font-size: 14px;\n line-height: 21px;\n color: $secondary-text-color;\n margin-bottom: 20px;\n\n strong {\n color: $primary-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid rgba($ui-base-lighter-color, .6);\n margin: 20px 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n\n .sidebar-wrapper {\n min-height: 0;\n }\n\n .sidebar {\n width: 100%;\n padding: 0;\n height: auto;\n\n &__toggle {\n display: flex;\n }\n\n & > ul {\n display: none;\n }\n\n ul a,\n ul ul a {\n border-radius: 0;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n transition: none;\n\n &:hover {\n transition: none;\n }\n }\n\n ul ul {\n border-radius: 0;\n }\n\n ul .simple-navigation-active-leaf a {\n border-bottom-color: $ui-highlight-color;\n }\n }\n }\n}\n\nhr.spacer {\n width: 100%;\n border: 0;\n margin: 20px 0;\n height: 1px;\n}\n\nbody,\n.admin-wrapper .content {\n .muted-hint {\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n }\n }\n\n .positive-hint {\n color: $valid-value-color;\n font-weight: 500;\n }\n\n .negative-hint {\n color: $error-value-color;\n font-weight: 500;\n }\n\n .neutral-hint {\n color: $dark-text-color;\n font-weight: 500;\n }\n\n .warning-hint {\n color: $gold-star;\n font-weight: 500;\n }\n}\n\n.filters {\n display: flex;\n flex-wrap: wrap;\n\n .filter-subset {\n flex: 0 0 auto;\n margin: 0 40px 20px 0;\n\n &:last-child {\n margin-bottom: 30px;\n }\n\n ul {\n margin-top: 5px;\n list-style: none;\n\n li {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n strong {\n font-weight: 500;\n text-transform: uppercase;\n font-size: 12px;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n text-transform: uppercase;\n font-size: 12px;\n font-weight: 500;\n border-bottom: 2px solid $ui-base-color;\n\n &:hover {\n color: $primary-text-color;\n border-bottom: 2px solid lighten($ui-base-color, 5%);\n }\n\n &.selected {\n color: $highlight-text-color;\n border-bottom: 2px solid $ui-highlight-color;\n }\n }\n }\n}\n\n.flavour-screen {\n display: block;\n margin: 10px auto;\n max-width: 100%;\n}\n\n.flavour-description {\n display: block;\n font-size: 16px;\n margin: 10px 0;\n\n & > p {\n margin: 10px 0;\n }\n}\n\n.report-accounts {\n display: flex;\n flex-wrap: wrap;\n margin-bottom: 20px;\n}\n\n.report-accounts__item {\n display: flex;\n flex: 250px;\n flex-direction: column;\n margin: 0 5px;\n\n & > strong {\n display: block;\n margin: 0 0 10px -5px;\n font-weight: 500;\n font-size: 14px;\n line-height: 18px;\n color: $secondary-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n .account-card {\n flex: 1 1 auto;\n }\n}\n\n.report-status,\n.account-status {\n display: flex;\n margin-bottom: 10px;\n\n .activity-stream {\n flex: 2 0 0;\n margin-right: 20px;\n max-width: calc(100% - 60px);\n\n .entry {\n border-radius: 4px;\n }\n }\n}\n\n.report-status__actions,\n.account-status__actions {\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n\n .icon-button {\n font-size: 24px;\n width: 24px;\n text-align: center;\n margin-bottom: 10px;\n }\n}\n\n.simple_form.new_report_note,\n.simple_form.new_account_moderation_note {\n max-width: 100%;\n}\n\n.batch-form-box {\n display: flex;\n flex-wrap: wrap;\n margin-bottom: 5px;\n\n #form_status_batch_action {\n margin: 0 5px 5px 0;\n font-size: 14px;\n }\n\n input.button {\n margin: 0 5px 5px 0;\n }\n\n .media-spoiler-toggle-buttons {\n margin-left: auto;\n\n .button {\n overflow: visible;\n margin: 0 0 5px 5px;\n float: right;\n }\n }\n}\n\n.back-link {\n margin-bottom: 10px;\n font-size: 14px;\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.spacer {\n flex: 1 1 auto;\n}\n\n.log-entry {\n margin-bottom: 20px;\n line-height: 20px;\n\n &__header {\n display: flex;\n justify-content: flex-start;\n align-items: center;\n padding: 10px;\n background: $ui-base-color;\n color: $darker-text-color;\n border-radius: 4px 4px 0 0;\n font-size: 14px;\n position: relative;\n }\n\n &__avatar {\n margin-right: 10px;\n\n .avatar {\n display: block;\n margin: 0;\n border-radius: 50%;\n width: 40px;\n height: 40px;\n }\n }\n\n &__content {\n max-width: calc(100% - 90px);\n }\n\n &__title {\n word-wrap: break-word;\n }\n\n &__timestamp {\n color: $dark-text-color;\n }\n\n &__extras {\n background: lighten($ui-base-color, 6%);\n border-radius: 0 0 4px 4px;\n padding: 10px;\n color: $darker-text-color;\n font-family: $font-monospace, monospace;\n font-size: 12px;\n word-wrap: break-word;\n min-height: 20px;\n }\n\n &__icon {\n font-size: 28px;\n margin-right: 10px;\n color: $dark-text-color;\n }\n\n &__icon__overlay {\n position: absolute;\n top: 10px;\n right: 10px;\n width: 10px;\n height: 10px;\n border-radius: 50%;\n\n &.positive {\n background: $success-green;\n }\n\n &.negative {\n background: lighten($error-red, 12%);\n }\n\n &.neutral {\n background: $ui-highlight-color;\n }\n }\n\n a,\n .username,\n .target {\n color: $secondary-text-color;\n text-decoration: none;\n font-weight: 500;\n }\n\n .diff-old {\n color: lighten($error-red, 12%);\n }\n\n .diff-neutral {\n color: $secondary-text-color;\n }\n\n .diff-new {\n color: $success-green;\n }\n}\n\na.name-tag,\n.name-tag,\na.inline-name-tag,\n.inline-name-tag {\n text-decoration: none;\n color: $secondary-text-color;\n\n .username {\n font-weight: 500;\n }\n\n &.suspended {\n .username {\n text-decoration: line-through;\n color: lighten($error-red, 12%);\n }\n\n .avatar {\n filter: grayscale(100%);\n opacity: 0.8;\n }\n }\n}\n\na.name-tag,\n.name-tag {\n display: flex;\n align-items: center;\n\n .avatar {\n display: block;\n margin: 0;\n margin-right: 5px;\n border-radius: 50%;\n }\n\n &.suspended {\n .avatar {\n filter: grayscale(100%);\n opacity: 0.8;\n }\n }\n}\n\n.speech-bubble {\n margin-bottom: 20px;\n border-left: 4px solid $ui-highlight-color;\n\n &.positive {\n border-left-color: $success-green;\n }\n\n &.negative {\n border-left-color: lighten($error-red, 12%);\n }\n\n &.warning {\n border-left-color: $gold-star;\n }\n\n &__bubble {\n padding: 16px;\n padding-left: 14px;\n font-size: 15px;\n line-height: 20px;\n border-radius: 4px 4px 4px 0;\n position: relative;\n font-weight: 500;\n\n a {\n color: $darker-text-color;\n }\n }\n\n &__owner {\n padding: 8px;\n padding-left: 12px;\n }\n\n time {\n color: $dark-text-color;\n }\n}\n\n.report-card {\n background: $ui-base-color;\n border-radius: 4px;\n margin-bottom: 20px;\n\n &__profile {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 15px;\n\n .account {\n padding: 0;\n border: 0;\n\n &__avatar-wrapper {\n margin-left: 0;\n }\n }\n\n &__stats {\n flex: 0 0 auto;\n font-weight: 500;\n color: $darker-text-color;\n text-transform: uppercase;\n text-align: right;\n\n a {\n color: inherit;\n text-decoration: none;\n\n &:focus,\n &:hover,\n &:active {\n color: lighten($darker-text-color, 8%);\n }\n }\n\n .red {\n color: $error-value-color;\n }\n }\n }\n\n &__summary {\n &__item {\n display: flex;\n justify-content: flex-start;\n border-top: 1px solid darken($ui-base-color, 4%);\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n\n &__reported-by,\n &__assigned {\n padding: 15px;\n flex: 0 0 auto;\n box-sizing: border-box;\n width: 150px;\n color: $darker-text-color;\n\n &,\n .username {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n &__content {\n flex: 1 1 auto;\n max-width: calc(100% - 300px);\n\n &__icon {\n color: $dark-text-color;\n margin-right: 4px;\n font-weight: 500;\n }\n }\n\n &__content a {\n display: block;\n box-sizing: border-box;\n width: 100%;\n padding: 15px;\n text-decoration: none;\n color: $darker-text-color;\n }\n }\n }\n}\n\n.one-line {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.ellipsized-ip {\n display: inline-block;\n max-width: 120px;\n overflow: hidden;\n text-overflow: ellipsis;\n vertical-align: middle;\n}\n\n.admin-account-bio {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n margin-top: 20px;\n\n > div {\n box-sizing: border-box;\n padding: 0 5px;\n margin-bottom: 10px;\n flex: 1 0 50%;\n }\n\n .account__header__fields,\n .account__header__content {\n background: lighten($ui-base-color, 8%);\n border-radius: 4px;\n height: 100%;\n }\n\n .account__header__fields {\n margin: 0;\n border: 0;\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n\n .account__header__content {\n box-sizing: border-box;\n padding: 20px;\n color: $primary-text-color;\n }\n}\n\n.center-text {\n text-align: center;\n}\n","$emojis-requiring-outlines: '8ball' 'ant' 'back' 'black_circle' 'black_heart' 'black_large_square' 'black_medium_small_square' 'black_medium_square' 'black_nib' 'black_small_square' 'bomb' 'bowling' 'bust_in_silhouette' 'busts_in_silhouette' 'camera' 'camera_with_flash' 'clubs' 'copyright' 'curly_loop' 'currency_exchange' 'dark_sunglasses' 'eight_pointed_black_star' 'electric_plug' 'end' 'female-guard' 'film_projector' 'fried_egg' 'gorilla' 'guardsman' 'heavy_check_mark' 'heavy_division_sign' 'heavy_dollar_sign' 'heavy_minus_sign' 'heavy_multiplication_x' 'heavy_plus_sign' 'hocho' 'hole' 'joystick' 'kaaba' 'lower_left_ballpoint_pen' 'lower_left_fountain_pen' 'male-guard' 'microphone' 'mortar_board' 'movie_camera' 'musical_score' 'on' 'registered' 'soon' 'spades' 'speaking_head_in_silhouette' 'spider' 'telephone_receiver' 'tm' 'top' 'tophat' 'turkey' 'vhs' 'video_camera' 'video_game' 'water_buffalo' 'waving_black_flag' 'wavy_dash' !default;\n\n%emoji-outline {\n filter: drop-shadow(1px 1px 0 $primary-text-color) drop-shadow(-1px 1px 0 $primary-text-color) drop-shadow(1px -1px 0 $primary-text-color) drop-shadow(-1px -1px 0 $primary-text-color);\n}\n\n.emojione {\n @each $emoji in $emojis-requiring-outlines {\n &[title=':#{$emoji}:'] {\n @extend %emoji-outline;\n }\n }\n}\n\n.hicolor-privacy-icons {\n .status__visibility-icon.fa-globe,\n .composer--options--dropdown--content--item .fa-globe {\n color: #1976D2;\n }\n\n .status__visibility-icon.fa-unlock,\n .composer--options--dropdown--content--item .fa-unlock {\n color: #388E3C;\n }\n\n .status__visibility-icon.fa-lock,\n .composer--options--dropdown--content--item .fa-lock {\n color: #FFA000;\n }\n\n .status__visibility-icon.fa-envelope,\n .composer--options--dropdown--content--item .fa-envelope {\n color: #D32F2F;\n }\n}\n","body.rtl {\n direction: rtl;\n\n .column-header > button {\n text-align: right;\n padding-left: 0;\n padding-right: 15px;\n }\n\n .radio-button__input {\n margin-right: 0;\n margin-left: 10px;\n }\n\n .directory__card__bar .display-name {\n margin-left: 0;\n margin-right: 15px;\n }\n\n .display-name {\n text-align: right;\n }\n\n .notification__message {\n margin-left: 0;\n margin-right: 68px;\n }\n\n .drawer__inner__mastodon > img {\n transform: scaleX(-1);\n }\n\n .notification__favourite-icon-wrapper {\n left: auto;\n right: -26px;\n }\n\n .landing-page__logo {\n margin-right: 0;\n margin-left: 20px;\n }\n\n .landing-page .features-list .features-list__row .visual {\n margin-left: 0;\n margin-right: 15px;\n }\n\n .column-link__icon,\n .column-header__icon {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .compose-form .compose-form__buttons-wrapper .character-counter__wrapper {\n margin-right: 0;\n margin-left: 4px;\n }\n\n .composer--publisher {\n text-align: left;\n }\n\n .boost-modal__status-time,\n .favourite-modal__status-time {\n float: left;\n }\n\n .navigation-bar__profile {\n margin-left: 0;\n margin-right: 8px;\n }\n\n .search__input {\n padding-right: 10px;\n padding-left: 30px;\n }\n\n .search__icon .fa {\n right: auto;\n left: 10px;\n }\n\n .columns-area {\n direction: rtl;\n }\n\n .column-header__buttons {\n left: 0;\n right: auto;\n margin-left: 0;\n margin-right: -15px;\n }\n\n .column-inline-form .icon-button {\n margin-left: 0;\n margin-right: 5px;\n }\n\n .column-header__links .text-btn {\n margin-left: 10px;\n margin-right: 0;\n }\n\n .account__avatar-wrapper {\n float: right;\n }\n\n .column-header__back-button {\n padding-left: 5px;\n padding-right: 0;\n }\n\n .column-header__setting-arrows {\n float: left;\n }\n\n .setting-toggle__label {\n margin-left: 0;\n margin-right: 8px;\n }\n\n .setting-meta__label {\n float: left;\n }\n\n .status__avatar {\n margin-left: 10px;\n margin-right: 0;\n\n // Those are used for public pages\n left: auto;\n right: 10px;\n }\n\n .activity-stream .status.light {\n padding-left: 10px;\n padding-right: 68px;\n }\n\n .status__info .status__display-name,\n .activity-stream .status.light .status__display-name {\n padding-left: 25px;\n padding-right: 0;\n }\n\n .activity-stream .pre-header {\n padding-right: 68px;\n padding-left: 0;\n }\n\n .status__prepend {\n margin-left: 0;\n margin-right: 58px;\n }\n\n .status__prepend-icon-wrapper {\n left: auto;\n right: -26px;\n }\n\n .activity-stream .pre-header .pre-header__icon {\n left: auto;\n right: 42px;\n }\n\n .account__avatar-overlay-overlay {\n right: auto;\n left: 0;\n }\n\n .column-back-button--slim-button {\n right: auto;\n left: 0;\n }\n\n .status__relative-time,\n .activity-stream .status.light .status__header .status__meta {\n float: left;\n text-align: left;\n }\n\n .status__action-bar {\n &__counter {\n margin-right: 0;\n margin-left: 11px;\n\n .status__action-bar-button {\n margin-right: 0;\n margin-left: 4px;\n }\n }\n }\n\n .status__action-bar-button {\n float: right;\n margin-right: 0;\n margin-left: 18px;\n }\n\n .status__action-bar-dropdown {\n float: right;\n }\n\n .privacy-dropdown__dropdown {\n margin-left: 0;\n margin-right: 40px;\n }\n\n .privacy-dropdown__option__icon {\n margin-left: 10px;\n margin-right: 0;\n }\n\n .detailed-status__display-name .display-name {\n text-align: right;\n }\n\n .detailed-status__display-avatar {\n margin-right: 0;\n margin-left: 10px;\n float: right;\n }\n\n .detailed-status__favorites,\n .detailed-status__reblogs {\n margin-left: 0;\n margin-right: 6px;\n }\n\n .fa-ul {\n margin-left: 2.14285714em;\n }\n\n .fa-li {\n left: auto;\n right: -2.14285714em;\n }\n\n .admin-wrapper {\n direction: rtl;\n }\n\n .admin-wrapper .sidebar ul a i.fa,\n a.table-action-link i.fa {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .simple_form .check_boxes .checkbox label {\n padding-left: 0;\n padding-right: 25px;\n }\n\n .simple_form .input.with_label.boolean label.checkbox {\n padding-left: 25px;\n padding-right: 0;\n }\n\n .simple_form .check_boxes .checkbox input[type=\"checkbox\"],\n .simple_form .input.boolean input[type=\"checkbox\"] {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.radio_buttons .radio {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.radio_buttons .radio > label {\n padding-right: 28px;\n padding-left: 0;\n }\n\n .simple_form .input-with-append .input input {\n padding-left: 142px;\n padding-right: 0;\n }\n\n .simple_form .input.boolean label.checkbox {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.boolean .label_input,\n .simple_form .input.boolean .hint {\n padding-left: 0;\n padding-right: 28px;\n }\n\n .simple_form .label_input__append {\n right: auto;\n left: 3px;\n\n &::after {\n right: auto;\n left: 0;\n background-image: linear-gradient(to left, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));\n }\n }\n\n .simple_form select {\n background: darken($ui-base-color, 10%) url(\"data:image/svg+xml;utf8,\") no-repeat left 8px center / auto 16px;\n }\n\n .table th,\n .table td {\n text-align: right;\n }\n\n .filters .filter-subset {\n margin-right: 0;\n margin-left: 45px;\n }\n\n .landing-page .header-wrapper .mascot {\n right: 60px;\n left: auto;\n }\n\n .landing-page__call-to-action .row__information-board {\n direction: rtl;\n }\n\n .landing-page .header .hero .floats .float-1 {\n left: -120px;\n right: auto;\n }\n\n .landing-page .header .hero .floats .float-2 {\n left: 210px;\n right: auto;\n }\n\n .landing-page .header .hero .floats .float-3 {\n left: 110px;\n right: auto;\n }\n\n .landing-page .header .links .brand img {\n left: 0;\n }\n\n .landing-page .fa-external-link {\n padding-right: 5px;\n padding-left: 0 !important;\n }\n\n .landing-page .features #mastodon-timeline {\n margin-right: 0;\n margin-left: 30px;\n }\n\n @media screen and (min-width: 631px) {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n\n &:first-child {\n padding-left: 5px;\n padding-right: 10px;\n }\n }\n\n .columns-area > div {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n }\n }\n }\n\n .columns-area--mobile .column,\n .columns-area--mobile .drawer {\n padding-left: 0;\n padding-right: 0;\n }\n\n .public-layout {\n .header {\n .nav-button {\n margin-left: 8px;\n margin-right: 0;\n }\n }\n\n .public-account-header__tabs {\n margin-left: 0;\n margin-right: 20px;\n }\n }\n\n .landing-page__information {\n .account__display-name {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .account__avatar-wrapper {\n margin-left: 12px;\n margin-right: 0;\n }\n }\n\n .card__bar .display-name {\n margin-left: 0;\n margin-right: 15px;\n text-align: right;\n }\n\n .fa-chevron-left::before {\n content: \"\\F054\";\n }\n\n .fa-chevron-right::before {\n content: \"\\F053\";\n }\n\n .column-back-button__icon {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .column-header__setting-arrows .column-header__setting-btn:last-child {\n padding-left: 0;\n padding-right: 10px;\n }\n\n .simple_form .input.radio_buttons .radio > label input {\n left: auto;\n right: 0;\n }\n}\n",".dashboard__counters {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n margin-bottom: 20px;\n\n & > div {\n box-sizing: border-box;\n flex: 0 0 33.333%;\n padding: 0 5px;\n margin-bottom: 10px;\n\n & > div,\n & > a {\n padding: 20px;\n background: lighten($ui-base-color, 4%);\n border-radius: 4px;\n box-sizing: border-box;\n height: 100%;\n }\n\n & > a {\n text-decoration: none;\n color: inherit;\n display: block;\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 8%);\n }\n }\n }\n\n &__num,\n &__text {\n text-align: center;\n font-weight: 500;\n font-size: 24px;\n line-height: 21px;\n color: $primary-text-color;\n font-family: $font-display, sans-serif;\n margin-bottom: 20px;\n line-height: 30px;\n }\n\n &__text {\n font-size: 18px;\n }\n\n &__label {\n font-size: 14px;\n color: $darker-text-color;\n text-align: center;\n font-weight: 500;\n }\n}\n\n.dashboard__widgets {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n\n & > div {\n flex: 0 0 33.333%;\n margin-bottom: 20px;\n\n & > div {\n padding: 0 5px;\n }\n }\n\n a:not(.name-tag) {\n color: $ui-secondary-color;\n font-weight: 500;\n text-decoration: none;\n }\n}\n","// Notes!\n// Sass color functions, \"darken\" and \"lighten\" are automatically replaced.\n\n.glitch.local-settings {\n background: $ui-base-color;\n\n &__navigation {\n background: darken($ui-base-color, 8%);\n }\n\n &__navigation__item {\n background: darken($ui-base-color, 8%);\n\n &:hover {\n background: $ui-base-color;\n }\n }\n}\n\n.notification__dismiss-overlay {\n .wrappy {\n box-shadow: unset;\n }\n\n .ckbox {\n text-shadow: unset;\n }\n}\n\n.status.status-direct:not(.read) {\n background: darken($ui-base-color, 8%);\n border-bottom-color: darken($ui-base-color, 12%);\n\n &.collapsed> .status__content:after {\n background: linear-gradient(rgba(darken($ui-base-color, 8%), 0), rgba(darken($ui-base-color, 8%), 1));\n }\n}\n\n.focusable:focus.status.status-direct:not(.read) {\n background: darken($ui-base-color, 4%);\n\n &.collapsed> .status__content:after {\n background: linear-gradient(rgba(darken($ui-base-color, 4%), 0), rgba(darken($ui-base-color, 4%), 1));\n }\n}\n\n// Change columns' default background colors\n.column {\n > .scrollable {\n background: darken($ui-base-color, 13%);\n }\n}\n\n.status.collapsed .status__content:after {\n background: linear-gradient(rgba(darken($ui-base-color, 13%), 0), rgba(darken($ui-base-color, 13%), 1));\n}\n\n.drawer__inner {\n background: $ui-base-color;\n}\n\n.drawer__inner__mastodon {\n background: $ui-base-color url('data:image/svg+xml;utf8,') no-repeat bottom / 100% auto !important;\n\n .mastodon {\n filter: contrast(75%) brightness(75%) !important;\n }\n}\n\n// Change the default appearance of the content warning button\n.status__content {\n\n .status__content__spoiler-link {\n\n background: lighten($ui-base-color, 30%);\n\n &:hover {\n background: lighten($ui-base-color, 35%);\n text-decoration: none;\n }\n\n }\n\n}\n\n// Change the background colors of media and video spoilers\n.media-spoiler,\n.video-player__spoiler,\n.account-gallery__item a {\n background: $ui-base-color;\n}\n\n// Change the colors used in the dropdown menu\n.dropdown-menu {\n background: $ui-base-color;\n}\n\n.dropdown-menu__arrow {\n\n &.left {\n border-left-color: $ui-base-color;\n }\n\n &.top {\n border-top-color: $ui-base-color;\n }\n\n &.bottom {\n border-bottom-color: $ui-base-color;\n }\n\n &.right {\n border-right-color: $ui-base-color;\n }\n\n}\n\n.dropdown-menu__item {\n a {\n background: $ui-base-color;\n color: $ui-secondary-color;\n }\n}\n\n// Change the default color of several parts of the compose form\n.composer {\n\n .composer--spoiler input, .compose-form__autosuggest-wrapper textarea {\n color: lighten($ui-base-color, 80%);\n\n &:disabled { background: lighten($simple-background-color, 10%) }\n\n &::placeholder {\n color: lighten($ui-base-color, 70%);\n }\n }\n\n .composer--options-wrapper {\n background: lighten($ui-base-color, 10%);\n }\n\n .composer--options > hr {\n display: none;\n }\n\n .composer--options--dropdown--content--item {\n color: $ui-primary-color;\n \n strong {\n color: $ui-primary-color;\n }\n\n }\n\n}\n\n.composer--upload_form--actions .icon-button {\n color: lighten($white, 7%);\n\n &:active,\n &:focus,\n &:hover {\n color: $white;\n }\n}\n\n.composer--upload_form--item > div input {\n color: lighten($white, 7%);\n\n &::placeholder {\n color: lighten($white, 10%);\n }\n}\n\n.dropdown-menu__separator {\n border-bottom-color: lighten($ui-base-color, 12%);\n}\n\n.status__content,\n.reply-indicator__content {\n a {\n color: $highlight-text-color;\n }\n}\n\n.emoji-mart-bar {\n border-color: darken($ui-base-color, 4%);\n\n &:first-child {\n background: lighten($ui-base-color, 10%);\n }\n}\n\n.emoji-mart-search input {\n background: rgba($ui-base-color, 0.3);\n border-color: $ui-base-color;\n}\n\n.autosuggest-textarea__suggestions {\n background: lighten($ui-base-color, 10%)\n}\n\n.autosuggest-textarea__suggestions__item {\n &:hover,\n &:focus,\n &:active,\n &.selected {\n background: darken($ui-base-color, 4%);\n }\n}\n\n.react-toggle-track {\n background: $ui-secondary-color;\n}\n\n.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track {\n background: lighten($ui-secondary-color, 10%);\n}\n\n.react-toggle.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track {\n background: darken($ui-highlight-color, 10%);\n}\n\n// Change the background colors of modals\n.actions-modal,\n.boost-modal,\n.confirmation-modal,\n.mute-modal,\n.block-modal,\n.report-modal,\n.embed-modal,\n.error-modal,\n.onboarding-modal,\n.report-modal__comment .setting-text__wrapper,\n.report-modal__comment .setting-text {\n background: $white;\n border: 1px solid lighten($ui-base-color, 8%);\n}\n\n.report-modal__comment {\n border-right-color: lighten($ui-base-color, 8%);\n}\n\n.report-modal__container {\n border-top-color: lighten($ui-base-color, 8%);\n}\n\n.boost-modal__action-bar,\n.confirmation-modal__action-bar,\n.mute-modal__action-bar,\n.block-modal__action-bar,\n.onboarding-modal__paginator,\n.error-modal__footer {\n background: darken($ui-base-color, 6%);\n\n .onboarding-modal__nav,\n .error-modal__nav {\n &:hover,\n &:focus,\n &:active {\n background-color: darken($ui-base-color, 12%);\n }\n }\n}\n\n// Change the default color used for the text in an empty column or on the error column\n.empty-column-indicator,\n.error-column {\n color: lighten($ui-base-color, 60%);\n}\n\n// Change the default colors used on some parts of the profile pages\n.activity-stream-tabs {\n\n background: $account-background-color;\n\n a {\n &.active {\n color: $ui-primary-color;\n }\n }\n\n}\n\n.activity-stream {\n\n .entry {\n background: $account-background-color;\n }\n\n .status.light {\n\n .status__content {\n color: $primary-text-color;\n }\n\n .display-name {\n strong {\n color: $primary-text-color;\n }\n }\n\n }\n\n}\n\n.accounts-grid {\n .account-grid-card {\n\n .controls {\n .icon-button {\n color: $ui-secondary-color;\n }\n }\n\n .name {\n a {\n color: $primary-text-color;\n }\n }\n\n .username {\n color: $ui-secondary-color;\n }\n\n .account__header__content {\n color: $primary-text-color;\n }\n\n }\n}\n\n.button.logo-button {\n color: $white;\n\n svg {\n fill: $white;\n }\n}\n\n.public-layout {\n .header,\n .public-account-header,\n .public-account-bio {\n box-shadow: none;\n }\n\n .header {\n background: lighten($ui-base-color, 12%);\n }\n\n .public-account-header {\n &__image {\n background: lighten($ui-base-color, 12%);\n\n &::after {\n box-shadow: none;\n }\n }\n\n &__tabs {\n &__name {\n h1,\n h1 small {\n color: $white;\n }\n }\n }\n }\n}\n\n.account__section-headline a.active::after {\n border-color: transparent transparent $white;\n}\n\n.hero-widget,\n.box-widget,\n.contact-widget,\n.landing-page__information.contact-widget,\n.moved-account-widget,\n.memoriam-widget,\n.activity-stream,\n.nothing-here,\n.directory__tag > a,\n.directory__tag > div {\n box-shadow: none;\n}\n\n.audio-player .video-player__controls button,\n.audio-player .video-player__time-sep,\n.audio-player .video-player__time-current,\n.audio-player .video-player__time-total {\n color: $primary-text-color;\n}\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///common.scss","webpack:///./app/javascript/flavours/glitch/styles/reset.scss","webpack:///./app/javascript/flavours/glitch/styles/mastodon-light/variables.scss","webpack:///./app/javascript/flavours/glitch/styles/basics.scss","webpack:///./app/javascript/flavours/glitch/styles/containers.scss","webpack:///./app/javascript/flavours/glitch/styles/_mixins.scss","webpack:///./app/javascript/flavours/glitch/styles/variables.scss","webpack:///./app/javascript/flavours/glitch/styles/lists.scss","webpack:///./app/javascript/flavours/glitch/styles/modal.scss","webpack:///./app/javascript/flavours/glitch/styles/footer.scss","webpack:///./app/javascript/flavours/glitch/styles/compact_header.scss","webpack:///./app/javascript/flavours/glitch/styles/widgets.scss","webpack:///./app/javascript/flavours/glitch/styles/forms.scss","webpack:///./app/javascript/flavours/glitch/styles/accounts.scss","webpack:///./app/javascript/flavours/glitch/styles/statuses.scss","webpack:///./app/javascript/flavours/glitch/styles/components/index.scss","webpack:///./app/javascript/flavours/glitch/styles/components/boost.scss","webpack:///./app/javascript/flavours/glitch/styles/components/accounts.scss","webpack:///./app/javascript/flavours/glitch/styles/components/domains.scss","webpack:///./app/javascript/flavours/glitch/styles/components/status.scss","webpack:///./app/javascript/flavours/glitch/styles/components/modal.scss","webpack:///./app/javascript/flavours/glitch/styles/components/composer.scss","webpack:///./app/javascript/flavours/glitch/styles/components/columns.scss","webpack:///./app/javascript/flavours/glitch/styles/components/regeneration_indicator.scss","webpack:///./app/javascript/flavours/glitch/styles/components/directory.scss","webpack:///./app/javascript/flavours/glitch/styles/components/search.scss","webpack:///","webpack:///./app/javascript/flavours/glitch/styles/components/emoji.scss","webpack:///./app/javascript/flavours/glitch/styles/components/doodle.scss","webpack:///./app/javascript/flavours/glitch/styles/components/drawer.scss","webpack:///./app/javascript/flavours/glitch/styles/components/media.scss","webpack:///./app/javascript/flavours/glitch/styles/components/sensitive.scss","webpack:///./app/javascript/flavours/glitch/styles/components/lists.scss","webpack:///./app/javascript/flavours/glitch/styles/components/emoji_picker.scss","webpack:///./app/javascript/flavours/glitch/styles/components/local_settings.scss","webpack:///./app/javascript/flavours/glitch/styles/components/error_boundary.scss","webpack:///./app/javascript/flavours/glitch/styles/components/single_column.scss","webpack:///./app/javascript/flavours/glitch/styles/components/announcements.scss","webpack:///./app/javascript/flavours/glitch/styles/polls.scss","webpack:///./app/javascript/flavours/glitch/styles/about.scss","webpack:///./app/javascript/flavours/glitch/styles/tables.scss","webpack:///./app/javascript/flavours/glitch/styles/admin.scss","webpack:///./app/javascript/flavours/glitch/styles/accessibility.scss","webpack:///./app/javascript/flavours/glitch/styles/rtl.scss","webpack:///./app/javascript/flavours/glitch/styles/dashboard.scss","webpack:///./app/javascript/flavours/glitch/styles/mastodon-light/diff.scss"],"names":[],"mappings":"AAAA,2ZCKA,QAaE,UACA,SACA,eACA,aACA,wBACA,+EAIF,aAEE,MAGF,aACE,OAGF,eACE,cAGF,WACE,qDAGF,UAEE,aACA,OAGF,wBACE,iBACA,MAGF,0CACE,qBAGF,UACE,YACA,2BAGF,kBACE,cACA,mBACA,iCAGF,kBACE,kCAGF,kBACE,2BAGF,aACE,gBACA,8BACA,CC3EwB,iEDkF1B,kBClF0B,4BDsF1B,sBACE,MEtFF,sBACE,mBACA,eACA,iBACA,gBACA,WDXM,kCCaN,6BACA,8BACA,CADA,0BACA,CADA,qBACA,0CACA,wCACA,kBAEA,sIAYE,eAGF,SACE,oCAEA,WACE,iBACA,kBACA,uCAGF,iBACE,WACA,YACA,mCAGF,iBACE,cAIJ,kBDjDwB,kBCqDxB,iBACE,kBACA,0BAEA,iBACE,YAIJ,kBACE,SACA,iBACA,uBAEA,iBACE,WACA,YACA,gBACA,YAIJ,kBACE,UACA,YAGF,iBACE,kBACA,cDpFiB,mBAEK,WCqFtB,YACA,UACA,aACA,uBACA,mBACA,oBAEA,qBACE,YACA,wBAEA,aACE,gBACA,WACA,YACA,kBACA,uBAGF,cACE,iBACA,gBACA,QAMR,mBACE,eACA,cAEA,YACE,6BAKF,YAEE,WACA,mBACA,uBACA,oBACA,yEAKF,gBAEE,+EAKF,WAEE,gBCrJJ,WACE,CACA,kBACA,qCAEA,eALF,UAMI,SACA,kBAIJ,sBACE,qCAEA,gBAHF,kBAII,qBAGF,YACE,uBACA,mBACA,wBAEA,SFtBI,YEwBF,kBACA,sBAGF,YACE,uBACA,mBACA,WF/BE,qBEiCF,UACA,kBACA,iBACA,uBACA,gBACA,eACA,mCAMJ,WACE,CACA,cACA,mBACA,sBACA,qCAEA,kCAPF,UAQI,aACA,aACA,kBAKN,WACE,CACA,YACA,eACA,iBACA,sBACA,CACA,gBACA,CACA,sBACA,qCAEA,gBAZF,UAaI,CACA,eACA,CACA,mBACA,0BAKA,UACqB,sCC3EvB,iBD4EE,6BAEA,UACE,YACA,cACA,SACA,kBACA,iBE5BkB,wBD9DtB,4BACA,uBD8FA,aACE,cF9FiB,wBEgGjB,iCAEA,aACE,gBACA,uBACA,gBACA,8BAIJ,aACE,eACA,iBACA,gBACA,SAIJ,YACE,cACA,8BACA,sBACA,mCACA,CADA,0BACA,mBAEA,eACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,eACE,WACA,qCAGF,QA3BF,UA4BI,qCACA,mBAEA,aACE,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,UAKN,YACE,cACA,8CACA,sBACA,mCACA,CADA,0BACA,mBAEA,eACE,WACA,mBAGF,eACE,WACA,mBAGF,aACE,WACA,mBAGF,eACE,WACA,mBAGF,aACE,WACA,uCAGF,eACE,wBAGF,kBACE,qCAGF,QAxCF,iDAyCI,uCAEA,YACE,aACA,mBACA,uBACA,iCAGF,UACE,uBACA,mBACA,sBAGF,YACE,sCAIJ,QA7DF,UA8DI,qCACA,mBAEA,aACE,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,sCAMJ,eADF,gBAEI,4BAGF,eACE,qCAEA,0BAHF,SAII,yBAIJ,kBACE,mCACA,kBACA,YACA,cACA,aACA,oBACA,uBACA,iBACA,gBACA,qCAEA,uBAZF,cAaI,WACA,MACA,OACA,SACA,gBACA,gBACA,YACA,6BAGF,cACE,eACA,kCAGF,YACE,oBACA,2BACA,iBACA,oCAGF,YACE,oBACA,uBACA,iBACA,mCAGF,YACE,oBACA,yBACA,iBACA,+BAGF,aACE,aACA,mCAEA,aACE,YACA,WACA,kBACA,YACA,UF3UA,qCE8UA,kCARF,WASI,+GAIJ,kBAGE,kCAIJ,YACE,mBACA,eACA,eACA,gBACA,qBACA,cF7Ve,mBE+Vf,kBACA,uHAEA,yBAGE,WFxWA,qCE4WF,0CACE,YACE,qCAKN,kBACE,CACA,oBACA,kBACA,6HAEA,oBAGE,mBACA,sBAON,YACE,cACA,0DACA,sBACA,mCACA,CADA,0BACA,gCAEA,UACE,cACA,gCAGF,UACE,cACA,qCAGF,qBAjBF,0BAkBI,WACA,gCAEA,YACE,kCAKN,iBACE,qCAEA,gCAHF,eAII,sCAKF,4BADF,eAEI,wCAIJ,eACE,mBACA,mCACA,gDAEA,UACE,qIAEA,8BAEE,CAFF,sBAEE,6DAGF,wBFvbe,8CE4bjB,yBACE,gBACA,aACA,kBACA,gBACA,oDAEA,UACE,cACA,kBACA,WACA,YACA,gDACA,MACA,OACA,kDAGF,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,0BACA,qCAGF,6CA3BF,YA4BI,gDAIJ,eACE,6JAEA,iBAEE,qCAEA,4JAJF,eAKI,sCAKN,sCA/DF,eAgEI,gBACA,oDAEA,YACE,+FAGF,eAEE,6CAIJ,iBACE,iBACA,aACA,2BACA,mDAEA,UACE,cACA,mBACA,kBACA,SACA,OACA,QACA,YACA,0BACA,WACA,oDAGF,aACE,CAEA,WACqB,yCCzgB3B,kBD0gBM,cACA,wDAEA,aACE,WACA,YACA,SACA,kBACA,yBACA,mBACA,iBE7dc,wBD9DtB,4BACA,qCD+hBI,2CAvCF,YAwCI,mBACA,0BACA,YACA,mDAEA,YACE,oDAKA,UACqB,sCCtiB7B,CDuiBQ,sBACA,wDAEA,QACE,kBACA,iBErfY,wBD9DtB,4BACA,2DDsjBQ,mDAbF,YAcI,sCAKN,2CApEF,eAqEI,sCAGF,2CAxEF,cAyEI,8CAIJ,aACE,iBACA,mDAEA,gBACE,mBACA,sDAEA,cACE,iBACA,WFjlBF,gBEmlBE,gBACA,mBACA,uBACA,6BACA,4DAEA,aACE,eACA,WF3lBJ,gBE6lBI,gBACA,uBACA,qCAKN,4CA7BF,gBA8BI,aACA,8BACA,mBACA,mDAEA,aACE,iBACA,sDAEA,cACE,iBACA,iBACA,4DAEA,aFhnBS,oDEunBf,YACE,2BACA,oBACA,YACA,qEAEA,YACE,mBACA,gBACA,qCAGF,oEACE,YACE,6DAIJ,eACE,sBACA,cACA,cF5oBW,aE8oBX,+BACA,eACA,kBACA,kBACA,8DAEA,aACE,uEAGF,cACE,kEAGF,aACE,WACA,kBACA,SACA,OACA,WACA,gCACA,WACA,wBACA,yEAIA,+BACE,UACA,kFAGF,2BF9qBS,wEEorBT,SACE,wBACA,8DAIJ,oBACE,cACA,2EAGF,cACE,cACA,4EAGF,eACE,eACA,kBACA,WF1sBJ,uBE4sBI,2DAIJ,aACE,WACA,4DAGF,eACE,8CAKN,YACE,eACA,kEAEA,eACE,gBACA,uBACA,cACA,2FAEA,4BACE,yEAGF,YACE,qDAIJ,gBACE,eACA,cF7uBa,uDEgvBb,oBACE,cFjvBW,qBEmvBX,aACA,gBACA,8DAEA,eACE,WF3vBJ,qCEiwBF,6CAtCF,aAuCI,UACA,4CAKN,yBACE,qCAEA,0CAHF,eAII,wCAIJ,eACE,oCAGF,kBACE,mCACA,kBACA,gBACA,mBACA,qCAEA,mCAPF,eAQI,gBACA,gBACA,8DAGF,QACE,aACA,+DAEA,aACE,sFAGF,uBACE,yEAGF,aE3yBU,8DFizBV,mBACA,WFpzBE,qFEwzBJ,YAEE,eACA,cFxzBe,2CE4zBjB,gBACE,iCAIJ,YACE,cACA,kDACA,qCAEA,gCALF,aAMI,+CAGF,cACE,iCAIJ,eACE,2BAGF,YACE,eACA,eACA,cACA,+BAEA,qBACE,cACA,YACA,cACA,mBACA,kBACA,qCAEA,8BARF,aASI,sCAGF,8BAZF,cAaI,sCAIJ,0BAvBF,QAwBI,6BACA,+BAEA,UACE,UACA,gBACA,gCACA,0CAEA,eACE,0CAGF,kBFt3BkB,+IEy3BhB,kBAGE,WGl4BZ,eACE,aAEA,oBACE,aACA,iBAIJ,eACE,cACA,oBAEA,cACE,gBACA,mBACA,eChBJ,k1BACE,aACA,sBACA,aACA,UACA,yBAGF,YACE,OACA,sBACA,yBACA,2BAEA,MACE,iBACA,qCAIJ,gBACE,YACE,yBCrBF,eACE,iBACA,oBACA,eACA,cACA,qCAEA,uBAPF,iBAQI,mBACA,+BAGF,YACE,cACA,0CACA,wCAEA,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,kBACA,6CAEA,aACE,wCAIJ,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,qCAGF,6BAxCF,iCAyCI,+EAEA,aAEE,wCAGF,UACE,wCAGF,aACE,+EAGF,aAEE,wCAGF,UACE,sCAIJ,uCACE,aACE,sCAIJ,4JACE,YAIE,4BAKN,wBACE,gBACA,kBACA,cP9Fe,6BOiGf,aACE,qBACA,6BAIJ,oBACE,cACA,wGAEA,yBAGE,mCAKF,aACE,YACA,WACA,cACA,aACA,0HAMA,YACE,oBClIR,cACE,iBACA,cACA,gBACA,mBACA,eACA,qBACA,qCAEA,mBATF,iBAUI,oBACA,uBAGF,aACE,qBACA,0BAGF,eACE,cRjBe,wBQqBjB,oBACE,mBACA,kBACA,WACA,YACA,cC9BN,kBACE,mCACA,mBAEA,UACE,kBACA,gBACA,0BACA,gBLPI,uBKUJ,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,0BACA,oBAIJ,kBTfwB,aSiBtB,0BACA,eACA,cTrBiB,iBSuBjB,qBACA,gBACA,8BAEA,UACE,YACA,gBACA,sBAGF,kBACE,iCAEA,eACE,uBAIJ,cACE,SACA,UACA,gBACA,uBACA,oBACA,kBACA,oBACA,cACA,sBAGF,aTrDiB,qBSuDf,4BAEA,yBACE,qCAKN,aAnEF,YAoEI,uBAIJ,kBACE,oBACA,yBAEA,YACE,yBACA,gBACA,eACA,cT5EiB,+BSgFnB,cACE,0CAEA,eACE,sDAGF,YACE,mBACA,gDAGF,UACE,YACA,0BACA,oCAIJ,YACE,mBAKF,aTzGmB,aS8GrB,YACE,kBACA,mBT9GwB,mCSgHxB,qBAGF,YACE,kBACA,0BACA,kBACA,cTzHmB,mBS2HnB,iBAGF,eACE,eACA,cThImB,iBSkInB,qBACA,gBACA,UACA,oBAEA,YACE,yBACA,gBACA,eACA,cT3IiB,0BS+InB,eACE,CACA,kBACA,mBAGF,oBACE,CACA,mBACA,cTxJiB,qBS0JjB,mBACA,gBACA,uBACA,0EAEA,yBAGE,uBAMJ,sBACA,kBACA,mBTxKwB,mCS0KxB,cT5KmB,gBS8KnB,mBACA,sDAEA,eAEE,CAII,qXADF,eACE,yBAKN,aACE,0BACA,CAMI,wLAGF,oBAGE,mIAEA,yBACE,gCAMR,kBACE,oCAEA,gBACE,cTvNe,8DS6NjB,iBACE,eACA,4DAGF,eACE,qBACA,iEAEA,eACE,kBAMR,YACE,CACA,eLlPM,CKoPN,cACA,cTlPmB,mBSoPnB,+BANA,iBACA,CLlPM,kCKgQN,CATA,aAGF,kBACE,CAEA,iBACA,kBACA,cACA,iBAEA,UTlQM,eSoQJ,gBACA,gBACA,mBACA,gBAGF,cACE,cTxQiB,qCS4QnB,aArBF,YAsBI,mBACA,iBAEA,cACE,aAKN,kBTpR0B,kBSsRxB,mCACA,iBAEA,qBACE,mBACA,uCAEA,YAEE,mBACA,8BACA,mBTjSoB,kBSmSpB,aACA,qBACA,cACA,mCACA,0EAIA,kBAGE,0BAIJ,kBTjTsB,eSmTpB,8BAGF,UACE,eACA,oBAGF,aACE,eACA,gBACA,WTpUE,mBSsUF,gBACA,uBACA,wBAEA,aTvUe,0BS2Uf,aACE,gBACA,eACA,eACA,cT/Ua,yFSqVf,UTxVE,+BS+VJ,aACE,YACA,uDAGF,oBT9VsB,eSoW1B,YACE,yBACA,gCAEA,aACE,WACA,YACA,kBACA,kBACA,kBACA,mBACA,yBACA,4CAEA,SACE,6CAGF,SACE,6CAGF,SACE,iBAKN,UACE,0BAEA,SACE,SACA,wBAGF,eACE,0BAGF,iBACE,yBACA,cTjZiB,gBSmZjB,aACA,sCAEA,eACE,0BAIJ,cACE,sBACA,gCACA,wCAGF,eACE,wBAGF,WACE,kBACA,eACA,gBACA,WT5aI,8BS+aJ,aACE,cT7ae,gBS+af,eACA,0BAIJ,SACE,iCACA,qCAGF,kCACE,YACE,sCAYJ,qIAPF,eAQI,gBACA,gBACA,iBAOJ,gBACE,qCAEA,eAHF,oBAII,uBAGF,sBACE,sCAEA,qBAHF,sBAII,sCAGF,qBAPF,UAQI,sCAGF,qBAXF,WAYI,kCAIJ,iBACE,qCAEA,gCAHF,4BAII,iEAIA,eACE,0DAGF,cACE,iBACA,oEAEA,UACE,YACA,gBACA,yFAGF,gBACE,SACA,mKAIJ,eAGE,gBAON,aT9gBmB,iCS6gBrB,kBAKI,6BAEA,eACE,kBAIJ,cACE,iBACA,wCAMF,oBACE,gBACA,cThiBsB,4JSmiBtB,yBAGE,oBAKN,kBACE,gBACA,eACA,kBACA,yBAEA,aACE,gBACA,aACA,CACA,kBACA,gBACA,uBACA,qBACA,WT/jBI,gCSikBJ,4FAEA,yBAGE,oCAIJ,eACE,0BAGF,iBACE,gCACA,MC/kBJ,+BACE,gBACA,iBAGF,eACE,aACA,cACA,qBAIA,kBACE,gBACA,4BAEA,QACE,0CAIA,kBACE,qDAEA,eACE,gDAIJ,iBACE,kBACA,sDAEA,iBACE,SACA,OACA,6BAKN,iBACE,gBACA,gDAEA,mBACE,eACA,gBACA,WVjDA,cUmDA,WACA,4EAGF,iBAEE,mDAGF,eACE,4CAGF,iBACE,QACA,OACA,qCAGF,aVhEoB,0BUkElB,gIAEA,oBAGE,0CAIJ,iBACE,CACA,iBACA,mBAKN,YACE,cACA,0BAEA,qBACE,cACA,UACA,cACA,oBAIJ,aVlGmB,sBUqGjB,aVlGsB,yBUsGtB,iBACE,kBACA,gBACA,wBAIJ,aACE,eACA,eACA,qBAGF,kBACE,cVvHiB,iCU0HjB,iBACE,eACA,iBACA,gBACA,gBACA,oBAIJ,kBACE,qBAGF,eACE,CAII,0JADF,eACE,sDAMJ,YACE,4DAEA,mBACE,eACA,WV1JA,gBU4JA,gBACA,cACA,wHAGF,aAEE,sDAIJ,cACE,kBACA,mDAKF,mBACE,eACA,WVhLE,cUkLF,kBACA,qBACA,gBACA,sCAGF,cACE,mCAGF,UACE,sCAIJ,cACE,4CAEA,mBACE,eACA,WVtME,cUwMF,gBACA,gBACA,4CAGF,kBACE,yCAGF,cACE,CADF,cACE,kDAIJ,oBACE,WACA,OACA,6BAGF,oBACE,cACA,4BAGF,kBACE,8CAEA,eACE,0BAIJ,YACE,CACA,eACA,oBACA,iCAEA,cACE,kCAGF,qBACE,eACA,cACA,eACA,oCAEA,aACE,2CAGF,eACE,6GAIJ,eAEE,qCAGF,yBA9BF,aA+BI,gBACA,kCAEA,cACE,0JAGF,kBAGE,iDAKN,iBACE,oBACA,eACA,WV1RI,cU4RJ,WACA,2CAKE,mBACE,eACA,WVpSA,qBUsSA,WACA,kBACA,gBACA,kBACA,cACA,0DAGF,iBACE,OACA,QACA,SACA,kDAKN,cACE,aACA,yBACA,kBACA,sJAGF,qBAKE,eACA,WVpUI,cUsUJ,WACA,UACA,oBACA,gBACA,mBACA,sBACA,kBACA,aACA,6RAEA,aACE,CAHF,+OAEA,aACE,CAHF,mQAEA,aACE,CAHF,sNAEA,aACE,8LAGF,eACE,oVAGF,oBACE,iOAGF,oBN1VY,oLM8VZ,iBACE,4WAGF,oBV9VsB,mBUiWpB,6CAKF,aACE,gUAGF,oBAME,8CAGF,aACE,gBACA,cACA,eACA,8BAIJ,UACE,uBAGF,eACE,aACA,oCAEA,YACE,mBACA,qEAIJ,aAGE,WACA,SACA,kBACA,mBV/YsB,WANlB,eUwZJ,oBACA,YACA,aACA,yBACA,qBACA,kBACA,sBACA,eACA,gBACA,UACA,mBACA,kBACA,sGAEA,cACE,uFAGF,wBACE,gLAGF,wBAEE,kHAGF,wBV/aoB,gGUmbpB,kBNpbQ,kHMubN,wBACE,sOAGF,wBAEE,qBAKN,uBACE,CADF,oBACE,CADF,eACE,sBACA,eACA,WVxcI,cU0cJ,WACA,UACA,oBACA,gBACA,wXACA,sBACA,kBACA,kBACA,mBACA,YACA,iBAGF,4BACE,oCAIA,iBACE,mCAGF,iBACE,UACA,QACA,CACA,qBACA,eACA,cVtdY,oBUwdZ,oBACA,eACA,gBACA,mBACA,gBACA,yCAEA,UACE,cACA,kBACA,MACA,QACA,WACA,UACA,oEACA,4BAKN,iBACE,0CAEA,wBACE,CADF,gBACE,qCAGF,iBACE,MACA,OACA,WACA,YACA,aACA,uBACA,mBACA,iCACA,kBACA,iBACA,gBACA,YACA,8CAEA,iBACE,6HAGE,UVthBF,aUgiBR,aACE,CACA,kBACA,eACA,gBAGF,kBACE,cVriBmB,kBUuiBnB,kBACA,mBACA,kBACA,uBAEA,qCACE,iCACA,cN/iBY,sBMmjBd,mCACE,+BACA,cNpjBQ,kBMwjBV,oBACE,cVzjBiB,qBU2jBjB,wBAEA,UVhkBI,0BUkkBF,kBAIJ,kBACE,4BAGF,SACE,sBACA,cACA,WACA,YACA,aACA,gCACA,mBV5kBsB,WALlB,eUolBJ,SACA,8CAEA,QACE,iHAGF,mBAGE,kCAGF,kBACE,uBAIJ,eACE,CAII,oKADF,eACE,0DAKN,eAzEF,eA0EI,eAIJ,eACE,kBACA,gBAEA,aVtnBmB,qBUwnBjB,sBAEA,yBACE,YAKN,eACE,mBACA,eACA,eAEA,oBACE,kBACA,cAGF,aVvoBwB,yBUyoBtB,qBACA,gBACA,2DAEA,aAGE,8BAKN,kBAEE,cV1pBmB,oCU6pBnB,cACE,mBACA,kBACA,4CAGF,aVnqBmB,gBUqqBjB,CAII,mUADF,eACE,0DAKN,6BAtBF,eAuBI,cAIJ,YACE,eACA,uBACA,UAGF,aACE,gBN5rBM,YM8rBN,qBACA,mCACA,qBACA,cAEA,aACE,SACA,iBAIJ,kBACE,cVxsBmB,WU0sBnB,sBAEA,aACE,eACA,eAKF,kBACE,sBAEA,eACE,CAII,+JADF,eACE,4CASR,qBACE,8BACA,WVzuBI,qCU2uBJ,oCACA,kBACA,aACA,mBACA,gDAEA,UVjvBI,0BUmvBF,oLAEA,oBAGE,0DAIJ,eACE,cACA,kBACA,CAII,yYADF,eACE,kEAIJ,eACE,oBAMR,YACE,eACA,mBACA,4DAEA,aAEE,6BAIA,wBACA,cACA,sBAIJ,iBACE,cV7xBmB,0BUgyBnB,iBACE,oBAIJ,eACE,mBACA,uBAEA,cACE,WV7yBI,kBU+yBJ,mBACA,SACA,UACA,4BAGF,aACE,eAIJ,aNtzBc,0SMg0BZ,+BACE,aAIJ,kBACE,sBACA,kBACA,aACA,mBACA,kBACA,kBACA,QACA,mCACA,sBAEA,aACE,8BAGF,sBACE,SACA,aACA,eACA,gCACA,oBAGF,aACE,WACA,oBACA,gBACA,eACA,CACA,oBACA,WACA,iCACA,oBAGF,oBN12Bc,gBM42BZ,2BAEA,kBN92BY,gBMg3BV,oBAKN,kBACE,6BAEA,wBACE,mBACA,eACA,aACA,4BAGF,kBACE,aACA,OACA,sBACA,cACA,cACA,gCAEA,iBACE,YACA,iBACA,kBACA,UACA,8BAGF,qBACE,qCAIJ,kBACE,gCAGF,wBACE,mCACA,kBACA,kBACA,kBACA,kBACA,sCAEA,wBACE,WACA,cACA,YACA,SACA,kBACA,MACA,UACA,yBAIJ,sBACE,aACA,mBACA,SCj7BF,aACE,qBACA,cACA,mCACA,qCAEA,QANF,eAOI,8EAMA,kBACE,YAKN,YACE,kBACA,gBACA,0BACA,gBAEA,aACE,WACA,YACA,SACA,oBACA,CADA,8BACA,CADA,gBACA,0BACA,qCAGF,WAfF,YAgBI,sCAGF,WAnBF,YAoBI,aAIJ,iBACE,aACA,aACA,2BACA,mBACA,mBACA,0BACA,qCAEA,WATF,eAUI,qBAGF,aACE,CAEA,UACqB,sCRpDzB,gBQqDI,wBAEA,UACE,YACA,cACA,SACA,kBACA,iBPLgB,wBD9DtB,4BACA,mBQoEM,oBACA,CADA,8BACA,CADA,gBACA,0BAIJ,gBACE,gBACA,iCAEA,cACE,WXhFA,gBWkFA,gBACA,uBACA,+BAGF,aACE,eACA,cXtFa,gBWwFb,gBACA,uBACA,aAMR,cACE,kBACA,gBACA,6GAEA,cAME,WX9GI,gBWgHJ,qBACA,iBACA,qBACA,sBAGF,ePrHM,oBOuHJ,WXxHI,eW0HJ,cACA,kBAGF,cACE,uCAGF,wBAEE,cXjIiB,oBWqInB,UACE,eACA,wBAEA,oBACE,iBACA,oBAIJ,WACE,gBACA,wBAEA,oBACE,gBACA,uBAIJ,cACE,WACA,qCAGF,YA9DF,iBA+DI,mBAEA,YACE,uCAGF,oBAEE,gBAKN,kBX1K0B,mCW4KxB,cXxJiB,eW0JjB,gBACA,kBACA,aACA,uBACA,mBACA,eACA,kBACA,aACA,gBACA,2BAEA,yBACE,yBAGF,qBACE,gBACA,yCAIJ,oBAEE,gBACA,eACA,kBACA,eACA,iBACA,gBACA,cX7MmB,mCW+MnB,mCACA,6DAEA,aPnNc,sCOqNZ,kCACA,qDAGF,aACE,oCACA,gCACA,0BAIJ,eACE,UACA,wBACA,gBACA,CADA,YACA,CACA,iCACA,CADA,uBACA,CADA,kBACA,eACA,iBACA,6BAEA,YACE,gCACA,yDAGF,qBAEE,aACA,kBACA,gBACA,gBACA,mBACA,uBACA,6BAGF,eACE,YACA,cACA,cX5PiB,gCW8PjB,6BAGF,aACE,cXlQiB,4BWsQnB,aXnQwB,qBWqQtB,qGAEA,yBAGE,oCAIJ,qCACE,iCACA,sCAEA,aPtRY,gBOwRV,0CAGF,aP3RY,wCOgSd,eACE,wCAIJ,UACE,0BAIA,aXzSmB,4BW4SjB,aX5SiB,qBW8Sf,qGAEA,yBAGE,iCAIJ,UX1TI,gBW4TF,wBAIJ,eACE,kBClUJ,kCACE,kBACA,gBACA,mBACA,qCAEA,iBANF,eAOI,gBACA,gBACA,6BAGF,eACE,SACA,gBACA,gFAEA,yBAEE,sCAIJ,UACE,yBAGF,kBZrBwB,6GYwBtB,sBAGE,CAHF,cAGE,8IAIA,eAGE,0BACA,iJAKF,yBAGE,kLAIA,iBAGE,qCAKN,4GACE,yBAGE,uCAKN,kBACE,qBAIJ,WACE,eACA,mBZtEwB,WANlB,oBY+EN,iBACA,YACA,iBACA,SACA,yBAEA,UACE,YACA,sBACA,iBACA,UZzFI,gFY6FN,kBAGE,qNAKA,kBZjGoB,4IYyGpB,kBR1GQ,qCQiHV,wBACE,YACE,0DAOJ,YACE,uCAGF,2BACE,gBACA,uDAEA,SACE,SACA,yDAGF,eACE,yDAKA,cACA,iBACA,mBACA,mFAGF,iBACE,eACA,WACA,WACA,WACA,qMAGF,eAGE,mEASF,cACE,gBACA,qFAGF,aZ/Jc,YYiKZ,eACA,WACA,eACA,gBACA,+GAGF,aACE,eACA,CACA,sBACA,eACA,yJAEA,cACE,uEAIJ,WACE,kBACA,WACA,eACA,iDAQF,iBACE,mBACA,yHAEA,iBACE,gBACA,+FAGF,UACE,oCAMR,aACE,eACA,iBACA,cACA,SACA,uBACA,CACA,eACA,qBACA,oFAEA,yBAEE,WC9OJ,gCACE,4CACA,kBAGF,mBACE,sBACA,oBACA,gBACA,kBACA,cAGF,aACE,eACA,iBACA,cbTwB,SaWxB,uBACA,UACA,eACA,wCAEA,yBAEE,uBAGF,abvBsB,eayBpB,SAIJ,wBACE,YACA,kBACA,sBACA,WbrCM,eauCN,qBACA,oBACA,eACA,gBACA,YACA,iBACA,iBACA,gBACA,eACA,kBACA,kBACA,yBACA,qBACA,uBACA,2BACA,qCACA,mBACA,WACA,4CAEA,wBAGE,4BACA,qCACA,sBAGF,eACE,mFAEA,wBTnEQ,gBSuEN,kBAIJ,wBb1EsB,ea4EpB,yGAGF,cAIE,iBACA,YACA,oBACA,iBACA,4BAGF,Ub9FM,mBAIgB,qGa8FpB,wBAGE,8BAIJ,kBbhGsB,2GamGpB,wBAGE,0BAIJ,cACE,iBACA,YACA,cbnHiB,oBaqHjB,uBACA,iBACA,kBACA,yBACA,+FAEA,oBAGE,cACA,mCAGF,UACE,uBAIJ,aACE,WACA,cAIJ,oBACE,UACA,cbjIoB,SamIpB,kBACA,uBACA,eACA,2BACA,2CACA,2DAEA,aAGE,sCACA,4BACA,2CACA,oBAGF,oCACE,uBAGF,aACE,6BACA,eACA,qBAGF,abxKwB,gCa4KxB,QACE,uEAGF,mBAGE,uBAGF,abzLmB,sFa4LjB,aAGE,oCACA,6BAGF,kCACE,gCAGF,aACE,6BACA,8BAGF,abzMsB,uCa4MpB,aACE,wBAKN,sBACE,8BACA,qBACA,kBACA,YACA,8BAEA,6BACE,mBAKN,ablOqB,SaoOnB,kBACA,uBACA,eACA,gBACA,eACA,cACA,iBACA,UACA,2BACA,2CACA,0EAEA,aAGE,oCACA,4BACA,2CACA,yBAGF,kCACE,4BAGF,UACE,6BACA,eACA,0BAGF,abhQwB,qCaoQxB,QACE,sFAGF,mBAGE,gBAIJ,iBACE,uBACA,YAGF,WACE,cACA,qBACA,QACA,SACA,kBACA,+BAEA,kBAEE,mBACA,oBACA,kBACA,mBACA,iBAKF,WACE,uCAIJ,MACE,kBACA,CT/SU,sESsTZ,aTtTY,uBS0TZ,aT3Tc,4DSiUV,4CACE,CADF,oCACE,8DAKF,6CACE,CADF,qCACE,6BAKN,aACE,gBACA,qBACA,mCAEA,UbtVM,0BawVJ,eAIJ,aACE,eACA,gBACA,uBACA,mBACA,iBAEA,aACE,wBACA,sBAIA,cACA,gBAKA,yCAPF,WACE,CAEA,gBACA,uBACA,gBACA,mBAWA,CAVA,mBAGF,aACE,CACA,cAKA,8BAIA,yBACE,sBAIJ,SACE,YACA,eACA,iBACA,uBACA,mBACA,gBACA,CAME,sDAGF,cACE,YACA,kBACA,oBACA,qBAKN,eACE,wBAGF,cACE,eAGF,iBACE,WACA,YACA,aACA,mBACA,uBACA,sBACA,6CAEA,cTxX4B,eAEC,0DSyX3B,sBACA,CADA,gCACA,CADA,kBACA,4BAGF,iBACE,qEAGF,YACE,iBAIJ,iBACE,WACA,YACA,aACA,mBACA,uBACA,qBAEA,cThZ4B,eAEC,WSiZ3B,YACA,sBACA,CADA,gCACA,CADA,kBACA,WAIJ,oBACE,oBAGF,YACE,kBACA,2BAGF,+BACE,mBACA,SACA,gBAGF,kBbzdqB,ca2dnB,kBACA,uCACA,mBAEA,eACE,uBAIJ,iBACE,QACA,SACA,2BACA,4BAEA,UACE,gBACA,2BACA,0Bb7eiB,2BaifnB,WACE,iBACA,uBACA,yBbpfiB,8BawfnB,QACE,iBACA,uBACA,4Bb3fiB,6Ba+fnB,SACE,gBACA,2BACA,2BblgBiB,wBawgBnB,cACE,iBACA,cACA,iBACA,sBACA,qBACA,mBb9gBiB,WAHb,gBaohBJ,uBACA,mBACA,yFAEA,kBblhBsB,cAHL,Ua0hBf,sCAKN,aACE,iBACA,gBACA,QACA,gBACA,aACA,yCAEA,eACE,mBbxiBiB,ca0iBjB,kBACA,mCACA,gBACA,kBACA,sDAGF,OACE,wDAIA,UACE,8CAIJ,cACE,iBACA,cACA,iBACA,sBACA,qBACA,mBbjkBiB,WAHb,gBaukBJ,uBACA,mBACA,oDAEA,SACE,oDAGF,kBbzkBsB,cAHL,iBamlBrB,qBACE,iBAIA,sBACA,cb5kBgB,oBa+kBhB,cACE,gBACA,mBACA,kBACA,mBAGF,cACE,mBACA,iBAIJ,aAEE,gBACA,qCAGF,cACE,SACE,iBAGF,aAEE,CAEA,gBACA,yCAEA,iBACE,uCAGF,kBACE,qDAKF,gBAEE,kBACA,YAKN,qBACE,aACA,mBACA,cACA,gBACA,iBAGF,aACE,cACA,CACA,sBACA,Wb5pBM,qBa8pBN,kBACA,eACA,gBACA,gCACA,2BACA,mDACA,qBAEA,eACE,eACA,qCVxoBA,6GADF,kBUgpBI,4BACA,kHV5oBJ,kBU2oBI,4BACA,wBAIJ,+BACE,cb/qBsB,sBamrBxB,eACE,aACA,2BAGF,aACE,eACA,kBAIJ,iBACE,yBAEA,iBACE,SACA,UACA,mBbpsBsB,yBassBtB,gBACA,kBACA,eACA,gBACA,iBACA,WbjtBI,mDastBR,oBACE,aAGF,iBACE,kBACA,cACA,iCACA,mCAEA,eACE,yBAGF,YAVF,cAWI,oBAGF,YACE,sBACA,qBAGF,aACE,kBACA,iBACA,yBAKF,uBADF,YAEI,gBAIJ,oBACE,kBACA,eACA,6BACA,SACA,UACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,gDACA,wCACA,iCAGF,QACE,mBACA,WACA,YACA,gBACA,UACA,kBACA,UACA,yBAGF,kBACE,WACA,wBACA,qBAGF,UACE,YACA,UACA,mBACA,yBbtxBwB,qCawxBxB,sEAGF,wBACE,4CAGF,wBb9xB0B,+EakyB1B,wBACE,2BAGF,iBACE,WACA,YACA,MACA,SACA,gBACA,mBACA,cACA,SACA,UACA,6BACA,CAKA,uEAFF,SACE,6BAeA,CAdA,sBAGF,iBACE,WACA,YACA,MACA,SACA,gBACA,mBACA,cACA,WAGA,8CAGF,SACE,qBAGF,iBACE,QACA,SACA,WACA,YACA,yBACA,kBACA,sBACA,sBACA,yBACA,sCACA,4CAGF,SACE,qBb11BwB,yDa81B1B,kBb/1B0B,2Baq2B1B,iBACE,gBACA,cAGF,aACE,kBAGF,kBb92B0B,cag3BxB,oBAEA,abp3BmB,oBaw3BnB,ab32BgB,yBa+2BhB,0BACE,CADF,uBACE,CADF,kBACE,kDAKA,sBACA,cACA,wDAEA,kBACE,8DAGF,cACE,sDAGF,abj4Bc,eam4BZ,0DAEA,abr4BY,0Bau4BV,sDAIJ,oBACE,cbz5Be,sMa45Bf,yBAGE,0BAKN,aACE,UACA,mCACA,CADA,0BACA,gBACA,6BAEA,cACE,yBACA,cb56Be,aa86Bf,gBACA,gCACA,sCAGF,oDACE,YACE,uCAIJ,oDACE,YACE,uCAIJ,yBA3BF,YA4BI,yCAGF,eACE,aACA,iDAEA,abv8Be,qBa88BrB,oBACE,kBACA,eACA,iBACA,gBACA,mBbj9BwB,gBam9BxB,iBACA,qBAGF,eACE,gBACA,2BAEA,iBACE,aACA,wBAGF,kBACE,yBAGF,oBACE,gBACA,yBACA,yBACA,eAIJ,ab9+BqB,uBag/BnB,CACA,WACA,CADA,+BACA,sBACA,cACA,oBACA,mBACA,cACA,WACA,0CAEA,Ub7/BM,4BAMkB,qCGkBtB,yDADF,cU6+BE,sBAGF,UbvgCM,gCaygCJ,sDAEA,Ub3gCI,4BAMkB,mDa6gC1B,uBACE,YACA,6CACA,uBACA,sBACA,WACA,0DAEA,sBACE,0DAIJ,uBACE,2BACA,gDAGF,abphCsB,6BashCpB,uDAGF,abpiC0B,yDawiC1B,aACE,YAGF,aACE,cbniCgB,6BaqiChB,SACA,kBACA,kBACA,oBACA,SACA,aACA,sBACA,WACA,WACA,qBACA,kBAEA,kBACE,WAIJ,+BACE,oBAGF,gBACE,qEAGF,4BACE,gCAGF,eACE,kBACA,MACA,QACA,YACA,kBACA,YAEA,mBACA,yBACA,eACA,aAEA,wCAEA,UT/hCsB,mBSiiCpB,aACA,sBACA,mBACA,uBACA,mBACA,8BACA,wBACA,gCACA,uCAGF,wBACE,kBACA,WACA,YACA,eACA,cbhnCiB,yBaknCjB,aACA,uBACA,mBACA,sCAGF,mBACE,6CAEA,8BACE,WAKN,oBACE,UACA,oBACA,kBACA,cACA,SACA,uBACA,eACA,oBAGF,ab/nCkB,eaioChB,gBACA,yBACA,iBACA,kBACA,QACA,SACA,+BACA,yBAEA,aACE,WACA,CACA,0BACA,oBACA,mBACA,4BAIJ,iBACE,QACA,SACA,+BACA,WACA,YACA,sBACA,6BACA,CACA,wBACA,kBACA,2CAGF,2EACE,CADF,mEACE,8CAGF,4EACE,CADF,oEACE,qCAGF,GACE,sBACE,KAGF,2BACE,KAGF,2BACE,KAGF,yBACE,IAGF,wBACE,EArBF,4BAGF,GACE,sBACE,KAGF,2BACE,KAGF,2BACE,KAGF,yBACE,IAGF,wBACE,uCAIJ,GACE,wBACE,KAGF,0BACE,KAGF,2BACE,KAGF,uBACE,IAGF,sBACE,EAtBA,6BAIJ,GACE,wBACE,KAGF,0BACE,KAGF,2BACE,KAGF,uBACE,IAGF,sBACE,mCAIJ,GACE,OACE,SACA,yBACA,KAGF,wBACE,KAGF,UACE,YACA,6BACA,kBACA,UACA,IAGF,UACE,YACA,eACA,UACA,6BACA,EA5BA,yBAIJ,GACE,OACE,SACA,yBACA,KAGF,wBACE,KAGF,UACE,YACA,6BACA,kBACA,UACA,IAGF,UACE,YACA,eACA,UACA,6BACA,kCAIJ,GACE,gBACA,aACA,aAPE,wBAIJ,GACE,gBACA,aACA,6BAGF,KACE,OACA,WACA,YACA,kBACA,YACA,2BAEA,YACE,SACA,QACA,WACA,YACA,mBACA,6BAGF,mBACE,yBAGF,YACE,0BAGF,aACE,uBACA,WACA,YACA,SACA,iCAEA,oBACE,8BACA,kBACA,iBACA,Wb5yCE,gBa8yCF,eACA,+LAMA,6BACE,mEAKF,6BACE,iBAMR,aACE,iBACA,mEAGF,abp0CqB,qBaw0CnB,mBACA,gBACA,sBACA,gBAGF,aACE,iBACA,uBAGF,eACE,8BAGF,abv1CqB,eay1CnB,cACA,gBACA,gBACA,uBAGF,qBACE,sBAGF,WACE,8BAGF,GACE,kBACE,+BACA,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,oBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,kBACE,2CACA,CADA,kCACA,EA3BF,qBAGF,GACE,kBACE,+BACA,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,oBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,kBACE,2CACA,CADA,kCACA,iBAIJ,0DACE,CADF,kDACE,cAGF,kBACE,8BACA,aACA,YACA,uBACA,OACA,UACA,kBACA,MACA,kBACA,WACA,aACA,gBAEA,mBACE,oBAIJ,WACE,aACA,aACA,sBACA,kBACA,YACA,0BAGF,iBACE,MACA,QACA,SACA,OACA,WACA,kBACA,mBbx6CwB,kCa06CxB,uBAGF,MACE,aACA,mBACA,uBACA,cbn7CmB,eaq7CnB,gBACA,0BACA,kBACA,qCAGF,SACE,oBACA,CADA,WACA,cAGF,wBb77C0B,Wa+7CxB,kBACA,MACA,OACA,aACA,qBAGF,iBACE,aAGF,iBACE,cACA,aACA,WACA,yBb98CwB,kBag9CxB,cACA,UACA,WACA,eAGF,YACE,gCACA,CACA,iBACA,qBAEA,kBACE,UACA,uBAGF,aACE,CACA,sBACA,kBACA,eACA,uBAGF,oBACE,mBb1+CsB,kBa4+CtB,cACA,eACA,wBACA,wBAGF,aACE,CACA,0BACA,gBACA,8BAEA,eACE,aACA,2BACA,8BACA,uCAGF,cACE,cbngDe,kBaqgDf,+BAGF,abxgDiB,ea0gDf,mBACA,gBACA,uBACA,kBACA,gBACA,YACA,iCAEA,UbrhDE,qBauhDA,oHAEA,yBAGE,yCAKN,QACE,uBAIJ,kBACE,6BAEA,kBACE,oDAGF,eACE,6DAGF,UbjjDI,oBa0jDN,kBACA,cACA,2BAGF,eACE,UAGF,iBACE,cAEA,WACE,WACA,sCACA,CADA,6BACA,cAGF,cACE,iBACA,cb3kDiB,gBa6kDjB,gBAEA,ab5kDsB,0Ba8kDpB,sBAEA,oBACE,gBAIJ,qBACE,4BAKN,GACE,cACA,eACA,WARI,mBAKN,GACE,cACA,eACA,2CCrmDF,u+KACE,uCAEA,u+KACE,CAOA,8MAMF,okBACE,UClBJ,YACE,gCACA,cACA,qBACA,iCAEA,aACE,cACA,cfJiB,gBeMjB,qBACA,eACA,gBAGF,WACE,UACA,yCAEA,8CAEA,WACE,iBACA,mBAKN,YACE,0BAGF,UACE,iBACA,kBACA,kBAGF,gBX0BwB,wBD9DtB,4BACA,kBYqCA,eACA,yBAEA,oBACE,sBACA,iBACA,4BZ3CF,eYiDE,2DAHF,gBXesB,wBD9DtB,4BACA,CYgDE,iBAOE,CANF,+BZjDF,UYqDI,CACA,qBACA,mCAGF,aACE,kBACA,QACA,SACA,+BACA,WfjEE,6BemEF,gBACA,eACA,0BAKN,iBACE,WACqB,sCZpErB,+BANA,UY8EuB,sCZxEvB,gEYsEA,gBXfsB,wBD9DtB,4BYyFE,CZlFF,iCANA,UYmFuB,sCZ7EvB,kBY+EE,SACA,QACA,UACA,wBAIJ,WACE,aACA,mBACA,2BAGF,aACE,mBACA,sBAGF,YACE,cf1FgB,6Be6FhB,eACE,CAII,kMADF,eACE,wBAKN,eACE,cACA,0BACA,yFAEA,oBAGE,sBAKN,4BACE,gCACA,iBACA,gBACA,cACA,aACA,4BAGF,YACE,cACA,iBACA,kBACA,2BAGF,oBACE,gBACA,cACA,8BACA,eACA,oCACA,uCAEA,aACE,kCAGF,+BACE,gCAGF,aACE,yBACA,eACA,cfpKiB,kCewKnB,aACE,eACA,gBACA,Wf9KI,CemLA,2NADF,eACE,gCAKN,aflLwB,oBeuL1B,iBACE,mDAEA,aACE,mBACA,gBACA,4BAIJ,UACE,kBACA,wBAGF,gBACE,qBACA,eACA,cf5MmB,ee8MnB,kBACA,4BAEA,af9MwB,6BekNxB,aACE,gBACA,uBACA,iBAIJ,kBACE,6BACA,gCACA,aACA,mBACA,eACA,kDAGF,aAEE,kBACA,yBAGF,kBACE,aACA,2BAGF,afhPqB,eekPnB,cACA,gBACA,mBACA,kDAIA,kBACE,oDAIA,SZ5MF,sBACA,WACA,YACA,gBACA,oBACA,mBHrDwB,cAFL,eG0DnB,SACA,+EYsMI,aACE,CZvMN,qEYsMI,aACE,CZvMN,yEYsMI,aACE,CZvMN,gEYsMI,aACE,sEAGF,QACE,yLAGF,mBAGE,0DAGF,kBACE,qCAGF,mDArBF,cAsBI,yDAIJ,af3Qc,iBe6QZ,eACA,4DAGF,gBACE,wDAGF,kBACE,gEAEA,cACE,iNAEA,kBAGE,cACA,gHAKN,afjTiB,0HesTjB,cAEE,gBACA,cf5SY,kZe+SZ,aAGE,gEAIJ,wBACE,iDAGF,eXzUI,kBDkEN,CAEA,eACA,cH7CiB,uCG+CjB,UYoQI,mBfzUe,oDGuEnB,wBACE,cHlDe,eGoDf,gBACA,mBACA,oDAGF,aACE,oDAGF,kBACE,oDAGF,eACE,WH3FI,sDegVJ,WACE,mDAGF,UfpVI,kBesVF,eACA,8HAEA,kBAEE,iCAON,kBACE,mBAIJ,UfvWQ,kBeyWN,cACA,mBACA,sBf1WM,yBe4WN,eACA,gBACA,YACA,kBACA,WACA,yBAEA,SACE,6BAIJ,YACE,eACA,gBACA,wBAGF,WACE,sBACA,cACA,kBACA,kBACA,gBACA,WACA,+BAEA,iBACE,QACA,SACA,+BACA,eACA,sDAIJ,kBAEE,gCACA,eACA,aACA,cACA,oEAEA,kBACE,SACA,SACA,6HAGF,aAEE,cACA,cf/ZiB,eeiajB,eACA,gBACA,kBACA,qBACA,kBACA,yJAEA,afxaiB,qWe2af,aAEE,WACA,kBACA,SACA,SACA,QACA,SACA,2BACA,CAEA,4CACA,CADA,kBACA,CADA,wBACA,iLAGF,WACE,6CACA,8GAKN,kBACE,gCACA,qSAKI,YACE,iSAGF,4CACE,sBAQR,sBACA,mBACA,6BACA,gCACA,+BAEA,iBACE,iBACA,cfhdc,Cemdd,eACA,eACA,oCAEA,aACE,gBACA,uBACA,oCAIJ,UACE,kBACA,uDAGF,iBACE,qDAGF,eACE,2BAIJ,afzfqB,ee2fnB,gBACA,gBACA,kBACA,qBACA,6BAEA,kBACE,wCAEA,eACE,6BAIJ,aACE,0BACA,mCAEA,oBACE,kBAKN,eACE,2BAEA,UACE,8FAEA,8BAEE,CAFF,sBAEE,wBAIJ,iBACE,SACA,UACA,yBAGF,eACE,aACA,kBACA,mBACA,6BAEA,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,uBAIJ,iBACE,mBACA,YACA,gCACA,+BAEA,aACE,cACA,WACA,iBACA,gDAEA,kBACE,yBACA,wBAKN,YACE,uBACA,gBACA,iBACA,iCAEA,YACE,mBACA,iBACA,gBACA,8CAEA,wBACE,kBACA,uBACA,YACA,yCAGF,YACE,8BAIJ,WACE,4CAEA,kBACE,wCAGF,UACE,YACA,iCAGF,cACE,iBACA,WfhnBA,gBeknBA,gBACA,mBACA,uBACA,uCAEA,aACE,eACA,cftnBW,gBewnBX,gBACA,uBACA,gCAKN,aACE,uBAIJ,eACE,cACA,iDAGE,qBACA,Wf7oBE,gDeipBJ,QACE,6BACA,kDAEA,aACE,yEAGF,uBACE,4DAGF,aX3pBU,yBWiqBd,cACE,gCAEA,cACE,cfpqBe,eesqBf,kCAEA,oBACE,cfzqBa,qBe2qBb,iBACA,gBACA,yCAEA,eACE,WfnrBF,SgBDR,YACE,gCACA,8BAEA,aACE,cACA,WhBLI,qBgBOJ,eACA,gBACA,kBAIJ,YACE,iBAGF,WACE,aACA,mBACA,mCCrBF,GACE,sBACE,KAGF,2BACE,KAGF,4BACE,KAGF,2BACE,IAGF,yBACE,EDGF,0BCrBF,GACE,sBACE,KAGF,2BACE,KAGF,4BACE,KAGF,2BACE,IAGF,yBACE,qCAIJ,GACE,yBACE,KAGF,yBACE,KAGF,4BACE,KAGF,wBACE,IAGF,sBACE,EAtBA,2BAIJ,GACE,yBACE,KAGF,yBACE,KAGF,4BACE,KAGF,wBACE,IAGF,sBACE,gCAIJ,cACE,kBAGF,iBACE,cACA,eACA,iBACA,qBACA,gBACA,iBACA,gBACA,wBAEA,SACE,4BAGF,UACE,YACA,gBACA,sBAGF,cACE,iBACA,sBACA,CADA,gCACA,CADA,kBACA,qEAGF,kBACE,qBACA,sGAEA,eACE,qEAIJ,eAEE,qJAEA,kBAEE,mXAGF,eACE,mBACA,qJAGF,eACE,gBACA,2EAGF,eACE,+NAGF,eACE,2FAGF,iBACE,8BACA,cjB5Ge,mBiB8Gf,qHAEA,eACE,2JAIJ,eACE,mJAGF,iBACE,6EAGF,iBACE,eACA,6EAGF,iBACE,qBACA,qJAGF,eACE,6JAEA,QACE,2EAIJ,oBACE,2EAGF,uBACE,oBAIJ,ab9Ic,qBagJZ,0BAEA,yBACE,8BAEA,aACE,kCAKF,oBACE,uCAEA,yBACE,wBAKN,ajBjKc,4CiBsKhB,YACE,8EAEA,aACE,mCAIJ,aACE,oDAEA,ab5LQ,ea8LN,CAKF,sDAEA,kBAEE,gCAKN,oBACE,kBACA,mBACA,YACA,WjBrNM,gBiBuNN,eACA,cACA,yBACA,oBACA,eACA,sBACA,sCAEA,kBACE,qBACA,+DAGF,oBACE,iBACA,sBACA,kBACA,eACA,oBACA,2GAKF,oBAGE,4BAIJ,ajBtOkB,SiBwOhB,kBACA,kBACA,oBACA,SACA,aACA,sBACA,WACA,WACA,gCACA,+BAGF,UACE,kBACA,mDAGF,iBAEE,gCAGA,qEAEA,eACE,kBAKF,SACE,mBACA,kDAEA,kBACE,wDAEA,sBACE,iFAIJ,kBAEE,SAKN,iBACE,kBACA,YACA,gCACA,eACA,UAaA,mCACA,CADA,0BACA,wDAZA,QAPF,kBAUI,0BAGF,GACE,aACA,WALA,gBAGF,GACE,aACA,uDAMF,cAEE,kCAGF,kBACE,4BACA,sCAIA,ajBtUiB,qCiB0UjB,UjB7UI,6BiBiVJ,ajBxTe,CAzBX,kEiByVJ,UjBzVI,kCiB4VF,ajBtVoB,gEiB0VpB,UjBhWE,mBAIgB,sEiBgWhB,kBACE,mBAMR,uBACE,sBACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,yCAEA,aACE,kBACA,OACA,QACA,MACA,SACA,6FACA,oBACA,WACA,2DAGF,oBACE,oCAGF,WACE,gBACA,uBACA,cACA,0CAEA,UACE,kBACA,MACA,gBACA,gEACA,oBACA,4CAGF,oBACE,gDAGJ,uDACE,mEAEF,uDACE,0CAGF,eACE,6DAGF,kBACE,gCAIJ,mBACE,+CAKF,sBACE,qEAEA,aACE,wBAKN,oBACE,YACA,CjBpagB,ciBsahB,iBACA,mBACA,CACA,sBACA,8CANA,ajBpagB,CiBwahB,eAOA,8CAGF,aACE,eACA,eAGF,YACE,8BACA,eACA,oBAEA,sBACE,gBACA,2CAGF,oBACE,sBAIJ,YACE,mBACA,WACA,cjBxcoB,iIiB2cpB,gBAGE,kBACA,0EAGF,yBACE,yEAMA,0CACE,CADF,kCACE,2EAKF,2CACE,CADF,mCACE,wBAKN,YACE,mBACA,2BACA,mBAGF,+BACE,aACA,6CAEA,uBACE,OACA,gBACA,4DAEA,eACE,8DAGF,SACE,mBACA,qHAGF,cAEE,gBACA,4EAGF,cACE,0BAKN,kBACE,aACA,cACA,uBACA,aACA,kBAGF,gBACE,mBACA,iBACA,cjBrhBgB,CiBuhBhB,iBACA,eACA,kBACA,+CAEA,ajB5hBgB,uBiBgiBhB,aACE,gBACA,uBACA,qBAIJ,kBACE,aACA,eACA,8BAEA,mBACE,kBACA,mBACA,yDAEA,gBACE,qCAGF,oBACE,WACA,eACA,gBACA,cjBxjBgB,4BiB8jBtB,iBACE,8BAGF,cACE,cACA,uCAGF,aACE,aACA,mBACA,uBACA,kBACA,kBAGF,kBACE,kBACA,wBAEA,YACE,eACA,8BACA,uBACA,uFAEA,SAEE,mCAIJ,cACE,iBACA,6CAEA,UACE,YACA,gBACA,+DAIJ,cAEE,wBAIJ,eACE,cjBlnBgB,eiBonBhB,iBACA,8BAGF,kBACE,6BACA,gCACA,aACA,mBACA,eACA,wBAGF,aACE,qBACA,uDAGF,oBAEE,gBACA,eACA,gBACA,6JAGF,oBAME,4DAKA,UjBzqBM,kBiB+qBN,UACE,iKAQF,yBACE,+BAIJ,aACE,gBACA,uBACA,0DAGF,aAEE,sCAGF,kBACE,gCAGF,ajBzsBqB,ciB2sBnB,iBACA,mBACA,gBACA,2EAEA,aAEE,uBACA,gBACA,uCAGF,cACE,WjB3tBI,kCiBguBR,UACE,kBACA,iBAGF,SACE,kBACA,YACA,WACA,CjBztBgB,8IiBouBhB,ajBpuBgB,wBiBwuBhB,UACE,wCAGF,kBjBnvBsB,WAThB,8CiBgwBJ,kBACE,qBACA,+DAOJ,yBACE,cAIJ,YACE,eACA,yBACA,kBACA,cjBlwBgB,gBiBowBhB,qBACA,gBACA,uBAEA,QACE,OACA,kBACA,QACA,MAIA,iDAHA,YACA,uBACA,mBAUE,CATF,0BAEA,yBACE,kBACA,iBACA,cAIA,sDAGF,cAEE,cjB3yBe,uBiB6yBf,SACA,cACA,qBACA,eACA,iBACA,sMAEA,UjBvzBE,yBiB8zBJ,cACE,kBACA,YACA,+DAGF,aACE,eAKN,cACE,qBAEA,kBACE,oBAIJ,cACE,cACA,qBACA,WACE,YACA,SACA,2BAIF,UACE,YACA,qBAIJ,aACE,gBACA,kBACA,cjBl2BmB,gBiBo2BnB,uBACA,mBACA,qBACA,uBAGF,aACE,gBACA,2BACA,2BAGF,ajBh3BqB,oBiBo3BrB,aACE,eACA,eACA,gBACA,uBACA,mBACA,qBAGF,cACE,mBACA,kBACA,yBAEA,cACE,kBACA,yBACA,QACA,SACA,+BACA,yBAIJ,aACE,6CAEA,UACE,mDAGF,yBACE,6CAGF,mBACE,sBAIJ,oBACE,kCAEA,QACE,4CAIA,oBACA,0CAGF,kBACE,0CAGF,aACE,6BAIJ,wBACE,2BAGF,yBACE,cACA,SACA,WACA,YACA,oBACA,CADA,8BACA,CADA,gBACA,sBACA,wBACA,kBAGF,YACE,eACA,yBACA,kBACA,gBACA,gBACA,wBAEA,aACE,cjB57Bc,iBiB87Bd,eACA,+BACA,aACA,sBACA,mBACA,uBACA,eACA,4BAEA,aACE,wBAIJ,eACE,CACA,qBACA,aACA,sBACA,uBACA,2BAEA,aACE,cACA,0BAGF,oBACE,cjB19BY,gBiB49BZ,gCAEA,yBACE,0BAKN,QACE,eACA,iDAEA,SACE,cACA,8BAGF,ajB7+Bc,oCiBm/BlB,cACE,cACA,SACA,uBACA,UACA,kBACA,oBACA,oFAEA,yBAEE,6BC/gCJ,kBACE,aAGF,iBACE,8BACA,oBACA,aACA,sBAGF,cACE,MACA,OACA,QACA,SACA,8BACA,wBAGF,cACE,MACA,OACA,WACA,YACA,aACA,sBACA,mBACA,uBACA,2BACA,aACA,oBACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,oBAGF,mBACE,aACA,aACA,6CAGF,kBlBtCqB,WAHb,kBkB8CN,gBACA,aACA,sBACA,0BAGF,WACE,WACA,gBACA,iBACA,8DAEA,UACE,YACA,sBACA,aACA,sBACA,mBACA,uBACA,aACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,oBAIJ,WACE,WACA,gBACA,iBACA,kBACA,wBAEA,iBACE,MACA,OACA,WACA,YACA,sBACA,aACA,aACA,CAGA,YACA,UACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,2CANA,qBACA,mBACA,uBAaF,CATE,mBAIJ,YACE,CAGA,iBACA,qCAGF,kBACE,UACE,YACA,gBACA,0BAGF,UACE,YACA,eACA,gBACA,cACA,oDAIJ,aAEE,mBACA,aACA,aACA,2DAEA,cACE,uLAGF,alBhImB,SkBmIjB,eACA,gBACA,kBACA,oBACA,YACA,aACA,kBACA,6BACA,+mBAEA,aAGE,yBACA,ClBpJE,wyEkB2JF,UAGE,sBAMR,sBACE,yBAGF,aACE,aACA,mBACA,uBACA,wBAGF,UACE,YACA,mBACA,mBACA,aACA,eACA,8BAEA,kBACE,+BAGF,cACE,mBACA,kCAIJ,mBACE,CACA,mBACA,0EAEA,mBACE,yBAIJ,cACE,iBACA,4BAEA,cACE,gBACA,WlBjNI,mBkBmNJ,2BAGF,alBhNwB,kGkBmNtB,aAGE,2CAIJ,aACE,2BAGF,cACE,clBlOiB,gBkBoOjB,mBACA,sCAEA,eACE,kCAGF,eACE,mBlB1OoB,cAFL,kBkB+Of,eACA,gBACA,CAII,2NADF,eACE,oCAOV,WACE,UACA,mCAME,mBACA,mBACA,sCAEA,cACE,iBACA,kBACA,qCAGF,eACE,oCAIJ,kBACE,mBACA,kBACA,eAIJ,iBACE,eACA,mBACA,sBAEA,eACE,WlBnSI,kBkBqSJ,yBACA,eACA,qBAGF,kBlBrSwB,cAFL,gBkB0SjB,aACA,kBACA,6HAQF,eACE,qJAGF,kBACE,clBzTiB,mBkB2TjB,kBACA,aACA,kBACA,eACA,sCACA,yPAEA,iBACE,mBACA,qNAGF,mBACE,gBACA,4CAMJ,YACE,mBACA,gDAEA,UACE,cACA,4DAEA,aACE,2DAGF,cACE,kDAGF,iBACE,uDAIJ,eACE,sDAIJ,UlB5WM,2DkBiXR,0BACE,cACE,iBACA,qJAGF,cAIE,mBACA,4CAGF,kBACE,sDAGF,WACE,eACA,mBAIJ,oBACE,eACA,gBACA,iBACA,uHAGF,kBAOE,WlBvZM,kBkByZN,gBACA,eACA,YACA,kBACA,sBACA,+SAEA,alBhZgB,YkBkZd,eACA,WACA,eACA,gBACA,uSAGF,YACE,uPAGF,WACE,WACA,+WAGF,aACE,wBAKF,edvbM,CJEa,gBkBwbjB,oBACA,iEd3bI,2BJEa,qDkBicrB,iBAEE,aACA,qEAEA,wBACE,CADF,qBACE,CADF,oBACE,CADF,gBACE,gBACA,kKAIJ,YAKE,8BACA,mBlBldmB,akBodnB,iBACA,0LAEA,aACE,iBACA,clBzdiB,mBkB2djB,kNAGF,aACE,6DAIJ,cAEE,yDAGF,WAEE,eACA,0BAGF,gBAEE,sDAGF,qBAEE,eAGF,UACE,gBACA,0BAGF,YACE,6BACA,qCAEA,yBAJF,cAKI,gBACA,iDAIJ,qBAEE,UACA,qCAEA,+CALF,UAMI,sDAIJ,aAEE,gBACA,gBACA,gBACA,kBACA,2FAEA,alBthBwB,qCkB0hBxB,oDAZF,eAaI,sCAKF,4BADF,eAEI,yBAIJ,YACE,+BACA,gBACA,0BAEA,cACE,iBACA,mBACA,sCAGF,aACE,sBACA,WACA,CACA,UlB1jBI,gBICA,ac4jBJ,oBACA,eACA,YACA,CACA,SACA,kBACA,yBACA,iBACA,gBACA,gBACA,4CAEA,wBACE,+CAGF,ed5kBI,yBc8kBF,mBACA,kBACA,6DAEA,QACE,gBACA,gBACA,mEAEA,QACE,0DAIJ,UlB7lBE,oBkB+lBA,eACA,gBd/lBA,+CcomBJ,YACE,8BACA,mBACA,4CAIJ,aACE,WlB7mBI,ekB+mBJ,gBACA,mBACA,wCAGF,eACE,mBACA,+CAEA,UlBxnBI,ekB0nBF,qCAIJ,uBAnFF,YAoFI,eACA,QACA,wCAEA,iBACE,iBAKN,eAWE,eACA,wBAXA,eACE,iBACA,uBAGF,aACE,gBACA,2CAMF,eACE,mBAGF,eACE,cACA,gBACA,+BAEA,4BACE,4BAGF,QACE,oCAIA,UlBzqBE,akB2qBA,kBACA,eACA,mBACA,qBACA,8EAEA,eAEE,yWAOA,kBlBprBgB,WANlB,iJkBisBA,iBAGE,oMAUR,aACE,iIAIJ,4BAIE,clBptBmB,ekBstBnB,gBACA,6cAEA,aAGE,6BACA,uCAIJ,iBACE,mBACA,oBACA,eAEA,yFAEA,qBACE,qGAIJ,YAIE,eACA,iIAEA,eACE,CAII,w1BADF,eACE,sDAMR,iBAEE,oDAKA,eACE,0DAGF,eACE,mBACA,aACA,mBACA,wEAEA,UlBnxBI,CkBqxBF,gBACA,uBAKN,YACE,2CAEA,QACE,WACA,cAIJ,UACE,eACA,gBACA,iBAEA,YACE,gBACA,eACA,kBACA,sCAGF,YACE,4CAEA,kBACE,yDAGF,SACE,sBACA,cACA,WACA,YACA,aACA,gDACA,mBlBzzBoB,WALlB,ekBi0BF,CACA,eACA,kBACA,2EAEA,QACE,wMAGF,mBAGE,+DAGF,kBACE,qCAGF,wDA7BF,cA8BI,4DAIJ,WACE,eACA,gBACA,SACA,kBACA,cAKN,iBACE,YACA,gBACA,YACA,aACA,uBACA,mBACA,gBd12BM,yDc62BN,aAGE,gBACA,WACA,YACA,SACA,sBACA,CADA,gCACA,CADA,kBACA,gBdr3BI,uBcy3BN,iBACE,YACA,aACA,+BACA,iEACA,kBACA,wCACA,uBAGF,iBACE,WACA,YACA,MACA,OACA,uBAGF,iBACE,YACA,WACA,UACA,YACA,4BACA,6BAEA,UACE,8BAGF,UlBv5BI,ekBy5BF,gBACA,cACA,kBACA,2BAGF,iBACE,mCACA,qCAIJ,oCACE,eAEE,uBAGF,YACE,wBAKN,gBACE,sCAEA,eACE,gCAGF,eACE,qDAGF,UlB57BM,iDkBg8BN,YACE,0DAEA,YACE,0BAIJ,YACE,iBACA,uBACA,kDAGF,alB77BoB,qBkB+7BlB,wDAEA,yBACE,WCp9BN,YACE,kCAEA,iBACE,MACA,QACA,oIAEA,mCAEE,oBAKN,cACE,uBACA,eACA,gBACA,cnBfmB,4CmBkBnB,afjBY,sCesBd,2CACE,oBAGF,QACE,wBACA,UACA,+CAEA,WACE,mBACA,UACA,0BAGF,aACE,sBACA,SACA,YACA,kBACA,aACA,WACA,UACA,WnBjDI,gBICA,eemDJ,oBACA,gBACA,qDAEA,anBxCc,CmBsCd,2CAEA,anBxCc,CmBsCd,+CAEA,anBxCc,CmBsCd,sCAEA,anBxCc,gCmB4Cd,8ChB/CA,uCADF,cgBiD4D,0ChB5C5D,cgB4C4D,oBAI9D,UnBjEQ,mBmBmEN,mBnB/DsB,oCmBiEtB,iBACA,kBACA,eACA,gBACA,sBAEA,anBxEmB,gBmB0EjB,0BACA,mFAEA,oBAEU,iCAKZ,mBACA,eAEA,gBACA,wCAEA,anBvFwB,sDmB2FxB,YACE,2CAGF,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,gBACA,kBACA,SACA,kBACA,sBACA,kDAEA,oBnB7GsB,qCmBoH1B,eACE,kBACA,aACA,mBnBzHsB,gBmB2HtB,gBACA,cACA,yBAEA,iBACE,gBACA,wCAEA,UnBvII,iCmByIJ,WACE,iBACA,2BAIJ,iBACE,cACA,CACA,cACA,iBACA,WnBpJI,qBmBsJJ,gBACA,iBACA,qBACA,mBACA,gBACA,gGAEA,kBACE,qBACA,iIAEA,eACE,kJAIJ,eACE,mBACA,2DAGF,eACE,eACA,8BAGF,cACE,wFAGF,eACE,sCAGF,iBACE,2BACA,WnB1LE,mBmB4LF,mDAEA,eACE,8DAIJ,eACE,0DAGF,iBACE,+BAGF,iBACE,eACA,2DAGF,eACE,+DAEA,QACE,8BAIJ,oBACE,8BAGF,uBACE,6BAGF,anB7NiB,qBmB+Nf,mCAEA,oEAGE,oBACE,gDAEA,qDAMR,UACE,YACA,gBACA,uDAIJ,iBAEE,WACA,mIAGE,aACE,sBACA,SACA,YACA,0BACA,yBACA,WACA,iBACA,UACA,WnBtQE,gBICA,eewQF,oBACA,YACA,qBACA,yLAEA,anB9PY,CmB4PZ,sKAEA,anB9PY,CmB4PZ,8KAEA,anB9PY,CmB4PZ,4JAEA,anB9PY,yKmBkQZ,SACE,qJAGF,kBnBnRe,+ImBoRf,8ChB1QF,8JADF,cgB4Q8D,kKhBvQ9D,cgBuQ8D,qChBhQ5D,8TADF,sBgBoQM,gBACA,6BAMR,aACE,kBACA,SACA,UACA,WACA,gBACA,2CAEA,aACE,mBACA,WACA,YACA,cnB3SiB,emB6SjB,iBACA,kBACA,WACA,4CAIJ,iBACE,SACA,oCAGF,aACE,kBACA,sBACA,SACA,0BACA,YACA,WACA,WnBnUM,mBAGa,sCmBmUnB,eACA,WACA,aACA,6CAGF,aACE,0CAGF,YACE,eACA,kBACA,iMAEA,kBAGa,iKAEb,YAGE,mBACA,mBACA,2BACA,iBACA,eACA,+DAGF,6BACE,qEAEA,aACE,gBACA,uBACA,mBACA,sEAGF,eACE,qEAGF,aACE,iBACA,gBACA,uBACA,mBACA,4EAMA,anB3Xe,wBmBgYrB,eACE,iCAEA,YACE,mBACA,eACA,oBACA,YACA,gBACA,8BAIJ,UACE,WACA,cACA,kCAEA,iBACE,kBACA,aACA,WACA,sBfzZI,wBe2ZJ,sBACA,4BACA,gBACA,2CAEA,aACE,kBACA,sBACA,SACA,OACA,SACA,SACA,aACA,WACA,cnBtae,gFmBwaf,eACA,oBACA,gBACA,UACA,UACA,4BACA,iDAEA,UflbE,sEeobF,WACE,cnBnba,CIFb,4DeobF,WACE,cnBnba,CIFb,gEeobF,WACE,cnBnba,CIFb,uDeobF,WACE,cnBnba,yCmBwbjB,2EAKE,0CAKN,iFACE,aACA,uBACA,8BACA,UACA,4BACA,8CAEA,aACE,cnB3ciB,emB6cjB,gBACA,aACA,oBACA,2JAEA,aAGE,wCAIJ,SACE,kCAIJ,YACE,aACA,cnBhemB,gBmBkenB,sCAEA,cACE,kBACA,2CAGF,aACE,gDAEA,aACE,eACA,gBACA,yBACA,qDAGF,iBACE,eACA,kBACA,WACA,WACA,mBnBlfkB,8DmBqflB,iBACE,MACA,OACA,WACA,kBACA,mBnB7fkB,0BmBogB1B,UnB1gBQ,oBmB4gBN,eACA,gBf5gBM,4BeghBR,YACE,gBACA,0BACA,YACA,aACA,8BACA,cACA,oBAGF,YACE,cACA,sBAEA,oBACE,uBACA,cACA,YACA,iBACA,sBACA,uBAGF,oBACE,aACA,CAEA,oBACA,CADA,0BACA,UACA,QACA,YACA,uBACA,2BAIJ,iBACE,iBACA,0CAKE,yBACE,qCACA,WnB9jBE,mBAMkB,gBmB2jBpB,8CAGA,yBACE,oCACA,uCAMR,iBACE,kBACA,uCACA,gBf9kBM,gBeglBN,uBACA,6CAGF,YACE,mBACA,aACA,WnBxlBM,emB0lBN,sDAEA,aACE,cnB1lBiB,wEmB6lBjB,6EAEA,aACE,WnBnmBE,gBmBqmBF,sGAIJ,kBnBnmBwB,WANlB,6PmBinBF,UnBjnBE,0DmBqnBN,wCAGF,gBACE,iBACA,mBACA,gBACA,yBACA,cACA,+BAEA,oBACE,SACA,eACA,kBACA,gCAGF,oBACE,aACA,UACA,WACA,kBACA,kCAIA,af5oBU,CgBFZ,+BAHF,YACE,cACA,kBAUA,CATA,cAKA,kBACA,2BACA,gBAEA,uBAEA,YACE,uBACA,WACA,YACA,iBACA,6BAEA,WACE,gBACA,oBACA,aACA,yBACA,gBACA,oCAEA,0BACE,oCAGF,cACE,YACA,oBACA,YACA,6BAIJ,qBACE,WACA,gBACA,cACA,aACA,sBACA,qCAEA,4BARF,cASI,qBAMR,kBACE,wBACA,CADA,eACA,MACA,UACA,cACA,qCAEA,mBAPF,gBAQI,+BAGF,eACE,qCAEA,6BAHF,kBAII,wHAMJ,WAGE,mCAIJ,YACE,mBACA,uBACA,YACA,CpBlFwB,IoBiG1B,aACE,aACA,sBACA,WACA,YACA,CAIA,oBAGF,qBACE,WACA,mBACA,cpB/GwB,eoBiHxB,cACA,eACA,SACA,iBACA,aACA,SACA,UACA,2BAEA,yBACE,6BAIJ,kBACE,SACA,oBACA,cpBlIwB,eoBoIxB,cACA,eACA,kBACA,UACA,mCAEA,yBACE,wCAGF,kBACE,2BAIJ,oBACE,iBACA,2BAGF,iBACE,kCAGF,cACE,cACA,eACA,aACA,kBACA,QACA,UACA,cAGF,kBACE,WpB7KM,coB+KN,eACA,aACA,qBACA,2DAEA,kBAGE,oBAGF,SACE,2BAGF,sBACE,cpB5LiB,kGoB+LjB,sBAGE,WpBrME,kCoByMJ,apBnMsB,oBoByM1B,oBACE,iBACA,oBAGF,kBpB/M0B,cAWR,iBoBuMhB,eACA,gBACA,yBACA,eACA,yBAGF,iBACE,cACA,UACA,gCAEA,sCACE,uCAEA,aACE,WACA,kBACA,aACA,OACA,QACA,cACA,UACA,oBACA,YACA,UACA,kFACA,wCAIJ,SACE,kBACA,gBAIJ,YACE,eACA,mBACA,cACA,eACA,kBACA,UACA,UACA,gBACA,uBAEA,QACE,YACA,aACA,cACA,uBACA,aACA,gBACA,uBACA,gBACA,mBACA,OACA,4CAGF,apB/QwB,4CoBoRtB,apBpRsB,yCoBsRpB,4CAIJ,SAEE,SAIJ,WACE,kBACA,sBACA,aACA,sBACA,gBACA,wDAEA,SACE,gBACA,gBACA,qBAGF,kBpB/SwB,yBoBoT1B,WACE,aACA,cACA,uBAGF,kBACE,iCAGF,iBACE,sEAGF,kBACE,SACA,cpBtUmB,eoBwUnB,eACA,eACA,kFAEA,aACE,CAKA,kLAEA,UpBvVI,mBoByVF,kFAKJ,2BACE,wCAIJ,YACE,oBACA,6BACA,+CAEA,sBAEE,kBACA,eACA,qBACA,0CAGF,eACE,gDAKJ,SACE,6BAGF,eACE,gBACA,gBACA,cpB1XmB,0DoB4XnB,UACA,UACA,kBACA,uCAEA,YACE,WACA,uCAGF,iBACE,gCAGF,QACE,uBACA,SACA,6BACA,cACA,iCAIF,eACE,2CACA,YACE,WACA,mCAKN,kBACE,aACA,mCAIA,apBlamB,0BoBoajB,gCAIJ,WACE,4DAEA,cACE,uEAEA,eACE,uBAKN,oBACE,uBACA,gBACA,mBACA,OACA,sBAGF,oBACE,iBACA,6EAGF,apBpbkB,mBAXQ,kBoBocxB,aACA,eACA,gBACA,eACA,aACA,cACA,mBACA,uBACA,yBACA,4EAdF,cAeI,6FAGF,eACE,mFAGF,apBpdwB,qBoBsdtB,qGAEA,yBACE,uCAKN,kBACE,aACA,eAGF,qBACE,uCAKA,sBACE,6BACA,qCASF,qCAXA,sBACE,6BACA,sCAgBF,mJAFF,qBAGI,sBAKF,wBACA,aACA,2BACA,mBACA,mBACA,2BAEA,aACE,iCAEA,UACE,kBACA,uCAEA,SACE,kCAKN,aACE,aACA,yBC9hBJ,iBACE,eACA,gBACA,crBcgB,mBAXQ,4BqBCxB,cACA,sBACA,mBACA,uBACA,aACA,qEAGE,aAEE,WACA,aACA,SACA,yCAIJ,gBACE,gCAGF,eACE,uCAEA,aACE,mBACA,crBhBY,qCqBoBd,cACE,gBACA,kBCtCJ,UACE,cACA,+BACA,0BAEA,UACE,qCAGF,iBATF,QAUI,mBAIJ,qBACE,mBACA,uBAEA,YACE,kBACA,gBACA,gBACA,2BAEA,aACE,WACA,YACA,SACA,oBACA,CADA,8BACA,CADA,gBACA,uBAIJ,YACE,mBACA,mBACA,aACA,6BAEA,aACE,aACA,mBACA,qBACA,gBACA,qCAGF,UACE,eACA,cACA,+BAGF,aACE,WACA,YACA,gBACA,mCAEA,UACE,YACA,cACA,SACA,kBACA,mBACA,oBACA,CADA,8BACA,CADA,gBACA,qCAIJ,gBACE,gBACA,4CAEA,cACE,WtB3EF,gBsB6EE,gBACA,uBACA,0CAGF,aACE,eACA,ctBjFW,gBsBmFX,gBACA,uBACA,yBAKN,kBtBxFsB,asB0FpB,mBACA,uBACA,gDAEA,YACE,cACA,eACA,mDAGF,qBACE,kBACA,gCACA,WACA,gBACA,mBACA,gBACA,uBACA,qDAEA,YACE,iEAEA,cACE,sDAIJ,YACE,cAOV,kBtB9H0B,sBsBiIxB,iBACE,4BAGF,aACE,eAIJ,cACE,kBACA,qBACA,cACA,iBACA,eACA,mBACA,gBACA,uBACA,eACA,oEAEA,YAEE,sBAGF,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,8BAEA,oBACE,mBACA,CC/KJ,eAGF,SpBkDE,sBACA,WACA,YACA,gBACA,oBACA,mBHrDwB,cAFL,eG0DnB,SACA,coBxDA,CACA,2BACA,iBACA,eACA,2CAEA,aACE,CAHF,iCAEA,aACE,CAHF,qCAEA,aACE,CAHF,4BAEA,aACE,kCAGF,QACE,6EAGF,mBAGE,sBAGF,kBACE,qCAGF,eA3BF,cA4BI,kCAKF,QACE,qDAGF,mBAEE,mBAGF,iBACE,SACA,WACA,UACA,qBACA,UACA,0BACA,4CACA,eACA,WACA,YACA,cvBrDiB,euBuDjB,oBACA,0BAEA,mBACE,WACA,0BAIJ,sBACE,iCAEA,mBACE,WACA,gCAIJ,QACE,uBACA,cvB7DkB,euB+DlB,uCAEA,uBACE,sCAGF,aACE,yBAKN,avB5EkB,mBuB8EhB,gCACA,kBACA,eACA,gBACA,uBAGF,YACE,cvBnGmB,kBuBqGnB,iBAIA,avB5FgB,mBuB8Fd,gCACA,gBACA,aACA,eACA,eACA,qBAEA,oBACE,iBACA,eAIJ,YACE,mBACA,aACA,gCACA,0BAEA,eACE,qBAGF,aACE,cvBtHY,gBuBwHZ,uBACA,mBACA,4BAEA,eACE,uBAGF,avB7Ie,qBuB+Ib,eACA,gBACA,cACA,gBACA,uBACA,mBACA,qGAKE,yBACE,wBAMR,aACE,eACA,iBACA,gBACA,iBACA,mBACA,gBACA,cvBxKe,0BuB4KjB,aACE,WACA,2CAEA,mCACE,yBACA,0CAGF,wBACE,WC1LR,yCCCE,qBACA,sBACA,CADA,kBACA,wBACA,WACA,YACA,eAEA,UACE,8BAIJ,erBXQ,kBqBaN,sCACA,kBACA,eACA,UACA,iDAEA,2BACE,2DAGF,UACE,mCAIJ,iBACE,SACA,WACA,eACA,yCAGF,iBACE,UACA,SACA,UACA,gBrBvCM,kBqByCN,sCACA,gBACA,gDAEA,aACE,eACA,SACA,gBACA,uBACA,iKAEA,4BAGE,2DAIJ,WACE,wBAKF,2BACE,eAIJ,aACE,wBACA,UACA,eACA,0CAEA,mBAEE,mBAGF,8BACE,CADF,sBACE,WACA,cACA,SACA,WACA,YACA,0EAMA,SACE,oBACA,CADA,WACA,eChGN,WAEE,0BAGF,kBANW,kBAQT,cACA,iCACA,wBACE,mCAOF,WACE,SACA,UACA,2CAGF,aACE,aAEA,sBACA,YACA,6BACA,6DAGE,oBACE,WACA,iBACA,iBACA,iJAGF,UACE,gEAEF,oBACE,gBACA,WACA,2CAKN,yBACE,sBACA,kBACA,YACA,gBACA,kDAEA,uBACE,CADF,oBACE,CADF,eACE,WACA,YACA,SACA,4BACA,WACA,yBACA,eACA,4CACA,sBACA,oBACA,6DAEA,uBACE,6DAGF,sBACE,wEAGF,sBACE,kBACA,SCjFR,WACE,sBACA,aACA,sBACA,kBACA,iBACA,UACA,qBAEA,iBACE,oBAGF,kBACE,2DxBDF,SwBI0D,yBxBC1D,SwBD0D,qCxBQxD,qLwBLA,yBAGF,eACE,gBACA,eACA,qCxBZA,4BwBgBA,SACE,WACA,YACA,eACA,UACA,+BALF,SACE,WACA,YACA,eACA,UACA,yCAIJ,4BAGF,YACE,mBACA,mBACA,UACA,mBACA,eACA,mBAEA,aACE,sBACA,oCACA,sBACA,YACA,cACA,c3BpDiB,kB2BsDjB,qBACA,eACA,mBAGF,iCACE,iDAEA,YAEE,mBACA,mCACA,SAKN,iBACE,mBACA,UACA,qCxBrDE,6CADF,ewBwDkF,sCxBlEhF,sBADF,cwBoE0D,yBxB/D1D,cwB+D0D,gBAG5D,evBlFQ,kBDkEN,CACA,sBACA,gBACA,cH7CiB,uCG+CjB,mBAEA,wBACE,cHlDe,eGoDf,gBACA,mBACA,mBAGF,aACE,mBAGF,kBACE,mBAGF,eACE,WH3FI,kB2BuFR,YACE,c3BrFmB,a2BuFnB,mBACA,oBAEA,aACE,qBACA,wBAGF,aACE,c3BhGiB,gB2BkGjB,mBACA,gBACA,uBACA,0BAIJ,aACE,gBACA,gBACA,kBAGF,kB3B7G0B,kB2B+GxB,gBACA,yBAEA,a3BvGgB,mB2ByGd,aACA,gBACA,eACA,eACA,6BAEA,oBACE,iBACA,0BAIJ,iBACE,6BAEA,kBACE,gCACA,eACA,aACA,aACA,gBACA,eACA,c3B/HY,iC2BkIZ,oBACE,iBACA,8FAIJ,eAEE,mCAGF,aACE,aACA,c3B5Je,qB2B8Jf,0HAEA,aAGE,0BACA,gBAQN,WACA,kBAGA,+BANF,qBACE,UACA,CAEA,eACA,aAgBA,CAfA,eAGF,iBACE,MACA,OACA,mBACA,CAGA,qBACA,CACA,eACA,WACA,YACA,uBAEA,kB3B/LwB,0B2BoM1B,u1BACE,OACA,gBACA,aACA,8BAEA,aACE,sBACA,CADA,4DACA,CADA,kBACA,+BACA,CADA,2BACA,UACA,YACA,oBACA,eACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,oCAGF,aACE,WACA,YACA,YACA,eACA,sCAGF,yBAzBF,aA0BI,iBAIJ,kBACE,eACA,gBACA,mBAGF,cACE,kBACA,MACA,OACA,WACA,YACA,8BACA,oBCrPF,kBACE,gBACA,W5BDM,e4BGN,aACA,sBACA,YACA,uBACA,eACA,kBACA,kBACA,YACA,gBAGF,e5BbQ,cAEa,S4BcnB,WACA,YACA,iEAEA,aAGE,iCAGF,eACE,2BzBcF,iBACE,mBACA,cACA,eACA,aACA,gBACA,yByBfJ,aACE,eACA,yBAGF,aACE,eACA,gBACA,6BAGF,aACE,kBACA,W5B9CM,8B4BgDN,WACA,SACA,gBACA,kBACA,eACA,gBACA,UACA,oBACA,WACA,4BACA,iBACA,wDAKE,SACE,uBAKN,WACE,aACA,sBACA,4BAEA,iBACE,c5BzEiB,a4B2EjB,YACA,mBACA,CAGE,yDAIJ,UACE,gBAIJ,qBACE,eACA,gBACA,kBACA,kBACA,WACA,aACA,2BzBzDA,iBACE,mBACA,cACA,eACA,aACA,gBACA,sByBwDJ,WACE,sBACA,cACA,WACA,kBACA,kBACA,gBACA,kCAEA,eACE,qEAIA,cACE,MACA,gCAIJ,exB5HM,gCwBiIR,cACE,cACA,qBACA,c5BjImB,kB4BmInB,UACA,mEAEA,WAEE,WACA,sBACA,CADA,gCACA,CADA,kBACA,CAIE,0HAFF,WACE,oBACA,CADA,8BACA,CADA,gB5B/IE,C4BgJF,wBAKN,UACE,CAEA,iBACA,MACA,OACA,UACA,gB5B5JM,iC4B+JN,YACE,sBAIJ,WACE,gBACA,kBACA,WACA,aACA,uBACA,qCAGF,cACE,YACA,WACA,kBACA,UACA,sBACA,CADA,gCACA,CADA,kBACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,qDAEA,WACE,oBACA,CADA,8BACA,CADA,gBACA,sCAIJ,0BACE,2BACA,gBACA,kBACA,yBAGF,eACE,iBACA,yBAGF,UACE,cAGF,UACE,YACA,kBACA,qCAEA,UACE,YACA,aACA,mBACA,uBACA,2CAEA,cxBrK0B,eAEC,CwB+K7B,8CALF,iBACE,MACA,OACA,QACA,SAYA,CAXA,yBAQA,mBACA,8BACA,oBACA,4BAEA,mBACE,0DAGF,SACE,4DAEA,mBACE,mBAKN,6BACE,sBACA,SACA,W5BlQM,e4BoQN,aACA,mBACA,eACA,cACA,cACA,kBACA,kBACA,MACA,SACA,yBAGF,MACE,0BAGF,OACE,CASA,4CANF,UACE,kBACA,kBACA,OACA,YACA,oBAUA,6BAEA,WACE,sBAGF,mBACE,qBACA,gBACA,c5B7SiB,mF4BgTjB,yBAGE,wBAKN,oBACE,sBAGF,qBxB9TQ,YwBgUN,WACA,kBACA,YACA,UACA,SACA,YACA,8BAGF,wB5BpU0B,qB4BwU1B,iBACE,UACA,QACA,YACA,qKAKA,WAEE,mFAGF,WACE,eAKJ,qBACE,kBACA,mBACA,kBACA,oBACA,cACA,wBAEA,eACE,YACA,yBAGF,cACE,kBACA,gBACA,gCAEA,UACE,cACA,kBACA,6BACA,WACA,SACA,OACA,oBACA,qCAIJ,oCACE,iCAGF,wBACE,uCAIA,mBACA,mBACA,6BACA,0BACA,eAIJ,eACE,kBACA,gBxBnZM,ewBqZN,kBACA,sBACA,cACA,wBAEA,eACE,sBACA,qBAGF,SACE,gCAGF,UACE,YACA,0BzB3XF,iBACE,mBACA,cACA,eACA,aACA,gBACA,qByB0XF,eACE,gBACA,UACA,kBACA,0BAGF,oBACE,sBACA,SACA,gCAEA,wBACE,0BACA,qBACA,sBACA,UACA,4BAKF,qBACE,CADF,gCACE,CADF,kBACE,kBACA,QACA,2BACA,yBAIJ,iBACE,UACA,SACA,OACA,QACA,sBACA,iFACA,eACA,UACA,4BACA,gCAEA,SACE,6EAKF,iBAEE,wBAIJ,YACE,kBACA,MACA,OACA,WACA,YACA,UACA,SACA,gBxBxeI,cJGa,gB4BwejB,oBACA,+BAEA,aACE,oBACA,8GAEA,aAGE,+BAIJ,aACE,eACA,kCAGF,aACE,eACA,gBACA,4BAIJ,YACE,8BACA,oBACA,CAGE,gUAEA,aAIE,wBAKN,cACE,mBACA,gBACA,uBACA,oCAGE,cACE,qCAKF,eACE,+BAIJ,sBACE,iBACA,eACA,SACA,0BACA,8GAEA,UxB9iBE,+EwBsjBN,cAGE,gBACA,6BAGF,UxB7jBM,iBwB+jBJ,yBAGF,oBACE,aACA,mDAGF,UxBvkBM,uBwB4kBN,cACE,YACA,eACA,8BAEA,UACE,WACA,+BAOA,6DANA,iBACA,cACA,kBACA,WACA,UACA,YAWA,CAVA,+BASA,kBACA,+BAGF,iBACE,UACA,kBACA,WACA,YACA,YACA,UACA,4BACA,mBACA,sCACA,oBACA,qBAIJ,gBACE,uBAEA,oBACE,eACA,gBACA,WxB5nBE,sFwB+nBF,yBAGE,qBAKN,cACE,YACA,kBACA,4BAEA,UACE,WACA,+BACA,kBACA,cACA,kBACA,WACA,SACA,2DAGF,aAEE,kBACA,WACA,kBACA,SACA,mBACA,6BAGF,6BACE,6BAGF,iBACE,UACA,UACA,kBACA,WACA,YACA,QACA,iBACA,4BACA,mBACA,sCACA,oBACA,CAGE,yFAKF,SACE,6GAQF,gBACE,oBACA,iBCtsBR,YACE,mBACA,mBACA,kBACA,QACA,SACA,YACA,mBAGF,YACE,kBACA,gBACA,qBACA,8BACA,eACA,iBACA,yBACA,WACA,4BACA,wCAEA,uBCtBF,kB9BM0B,sB8BJxB,kBACA,uCACA,YACA,gBACA,qCAEA,aARF,SASI,kBAGF,cACE,mBACA,gBACA,eACA,kBACA,0BACA,6BAGF,WACE,6BAGF,yBACE,sCAEA,uBACE,uCACA,wBACA,wBAIJ,eACE,kDAIA,oBACE,+BAIJ,cACE,sBAGF,eACE,aAIJ,kB9BhD0B,sB8BkDxB,kBACA,uCACA,YACA,gBACA,qCAEA,YARF,SASI,uBAGF,kBACE,oBAGF,kBACE,YACA,0BACA,gBACA,mBAGF,YACE,gCACA,4BAGF,YACE,iCAGF,aACE,gBACA,qBACA,eACA,aACA,aC3FJ,cAOE,qBACA,W/BPM,gD+BEJ,iBACA,+BAOF,WACE,iBAIJ,sBACE,6BAEA,uBACE,2BACA,4BACA,mB/BlBiB,4B+BsBnB,oBACE,8BACA,+BACA,aACA,qBAIJ,YACE,8BACA,cACA,c/BjCmB,c+BmCnB,oBAGF,iBACE,OACA,kBACA,iBACA,gBACA,8BACA,eACA,0BAEA,aACE,6BAIJ,a/BjD0B,mC+BoDxB,aACE,oDAGF,QACE,wBAIJ,iBACE,YACA,OACA,WACA,WACA,yBACA,uBAIA,oBACE,WACA,eACA,yBAGF,iBACE,gBACA,oBAIJ,iBACE,aACA,gBACA,kBACA,gB3B5FM,sB2B8FN,sGAEA,mCAEE,oBAKF,2BACA,gB3BxGM,0B2B2GN,cACE,gBACA,gBACA,oBACA,cACA,WACA,6BACA,W/BnHI,yB+BqHJ,kBACA,4CAEA,QACE,2GAGF,mBAGE,wCAKN,cACE,6CAEA,SACE,kBACA,kBACA,qDAGF,SACE,WACA,kBACA,MACA,OACA,WACA,YACA,mCACA,mBACA,4BAIJ,SACE,kBACA,wBACA,gBACA,MACA,iCAEA,aACE,WACA,gBACA,gBACA,gB3BpKI,mB2ByKR,iBACE,qBACA,YACA,wBAEA,UACE,YACA,wBAIJ,cACE,kBACA,iBACA,c/B/JiB,mD+BkKjB,YACE,qDAGF,eACE,uDAGF,YACE,qBAIJ,YACE,wBC1MF,iBACE,aACA,mBACA,mBACA,WhCHM,kBgCKN,YACA,WACA,gBACA,iBACA,gBACA,4DAEA,aACE,eACA,mFAGF,iBACE,kBACA,gBACA,+FAEA,iBACE,OACA,MACA,kCAIJ,aACE,chC3BiB,2BgC+BnB,cACE,gBACA,iBACA,mBACA,2BAGF,cACE,gBACA,iBACA,gBACA,mBACA,0CAIJ,aACE,kBACA,cACA,mBACA,gCACA,eACA,qBACA,aACA,0BACA,4DAEA,aACE,iBACA,gDAGF,kBhC/DmB,iDgCmEnB,kBhChEwB,WANlB,qGgC2EN,kB5BxEU,WJHJ,oCgCiFR,kBACE,YACA,eACA,iBACA,gBACA,8BAGF,aACE,UACA,kBACA,YACA,gBACA,oCAGF,iBACE,4FAGF,eAEE,mBACA,qCAGF,mCACE,UACE,cACA,0CAGF,YACE,4DAEA,YACE,kBCtHN,UACE,eACA,iBACA,oBAEA,cACE,iBACA,gBACA,kBACA,mBAGF,UjCXM,0BiCaJ,oBAGF,eACE,cACA,iBACA,mDAGF,UACE,YACA,gBACA,gCACA,gBC3BJ,WACE,gBACA,aACA,sBACA,yBACA,kBACA,+BAEA,gBACE,eACA,CACA,2BACA,kCAGF,QACE,iCAGF,aACE,6BAGF,sBACE,0BAGF,MACE,kBACA,aACA,sBACA,iBACA,mDAGF,eACE,sB9BlCI,0B8BoCJ,cACA,gDAGF,iBACE,gDAGF,WACE,mBAIJ,eACE,mBACA,yBACA,gBACA,aACA,sBACA,qBAEA,aACE,sBAGF,aACE,SACA,CACA,4BACA,cACA,qDAHA,sBAOA,qCAIJ,qBAEI,cACE,wBAKN,qBACE,WACA,cACA,6DAEA,UAEE,YACA,UACA,wCAGF,YACE,cACA,kDACA,qCAEA,uCALF,aAMI,yCAIJ,eACE,oCAGF,YACE,uDAGF,cACE,sCAGF,gBACE,eACA,CACA,2BACA,yCAGF,QACE,mCAGF,gBACE,yBAEA,kCAHF,eAII,sCAIJ,sBACE,gBACA,sCAGF,uCACE,YACE,iKAEA,eAGE,6CAIJ,gBACE,2EAGF,YAEE,kGAGF,gBACE,+BAGF,YACE,gBACA,gLAEA,eAIE,gCAIJ,iBACE,6CAEA,cACE,8CAKF,gBACE,CAIA,yFAGF,eACE,0BAMR,cACE,aACA,uBACA,mBACA,gBACA,iBACA,iBACA,gBACA,mBACA,W9BjNM,kB8BmNN,eACA,iBACA,qBACA,sCACA,4FAEA,kBAGE,qCAIJ,UACE,UACE,uDAGF,kCACE,mCAGF,kBAEE,sCAIJ,2CACE,YACE,sCAOA,sEAGF,YACE,uCAIJ,0CACE,YACE,uCAIJ,UACE,YACE,gCC1QJ,oBACE,gBACA,yCAEA,UACE,YACA,gBACA,iCAGF,kBACE,qBACA,4CAEA,eACE,iCAIJ,anCfmB,qBmCiBjB,uCAEA,yBACE,+CAIA,oBACE,oDAEA,yBACE,gDAKN,aACE,gBAKN,kBACE,eACA,aACA,qBACA,0BAEA,WACE,cACA,qCAEA,yBAJF,YAKI,4BAIJ,wBACE,cACA,kBACA,qCAEA,0BALF,UAMI,uBAIJ,qBACE,WACA,aACA,kBACA,eACA,iBACA,qBACA,gBACA,gBACA,gBACA,aACA,sBACA,6BAEA,aACE,gBACA,mBACA,mBACA,8BAGF,iBACE,SACA,WACA,cACA,mBnCtFoB,kBmCwFpB,cACA,eACA,4BAIJ,YACE,cnClGiB,kBmCoGjB,WACA,QACA,mDAIJ,YACE,oDAGF,UACE,gBAGF,YACE,eACA,mBACA,gBACA,iBACA,wBACA,sBAEA,aACE,mBACA,SACA,kBACA,WACA,eACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,cACA,aACA,mBACA,2BACA,2CACA,6BAEA,aACE,aACA,WACA,YACA,iCAEA,aACE,SACA,WACA,YACA,eACA,gBACA,sBACA,sBACA,CADA,gCACA,CADA,kBACA,6BAIJ,aACE,cACA,eACA,gBACA,kBACA,gBACA,cnChKe,mFmCoKjB,kBAGE,4BACA,2CACA,wGAEA,aACE,6BAIJ,0BACE,2CACA,yBACA,yDAEA,aACE,uCAKN,UACE,oCAGF,WACE,8BAGF,anCnMmB,SmCqMjB,eACA,WACA,cACA,cACA,YACA,aACA,mBACA,WACA,2BACA,2CACA,2GAEA,SAGE,cACA,4BACA,2CACA,qCAKF,SACE,OCjON,eACE,eACA,8BAEA,QAEE,gBACA,UAGF,kBACE,kBACA,cAGF,iBACE,cACA,mBACA,WACA,aACA,sBAEA,kBpCfsB,eoCoBxB,iBACE,aACA,cACA,iBACA,eACA,gBACA,qBAEA,oBACE,qBACA,yBACA,4BACA,oEAGF,YAEE,kCAGF,aACE,gCAIA,qBACA,WACA,eACA,WpCtDE,coCwDF,UACA,oBACA,gBhCzDE,sBgC2DF,kBACA,iBACA,sCAEA,oBpC1DoB,0BoC+DtB,cACE,wBAGF,YACE,mBACA,iBACA,cAIJ,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,gBACA,mBACA,cACA,uBAEA,iBACE,qBAGF,oBhClGY,8EgCuGZ,oBAGE,iBACA,gCAGF,mBACE,SACA,wCAGF,mBAEE,eAIJ,oBACE,WACA,gBACA,cACA,cAGF,aACE,qBACA,oBAEA,cACE,eAIJ,eACE,mBACA,cpC7Hc,aoCiIhB,cACE,uBACA,UACA,SACA,SACA,cpCtIc,0BoCwId,kBACA,mBAEA,oBACE,sCAGF,kCAEE,eAIJ,WACE,eACA,kBACA,eACA,6BAIJ,yBACE,kBACA,gCAEA,YACE,2CAGF,yBACE,aACA,aACA,mBACA,mGAEA,UAEE,aACA,+GAEA,oBpC1LoB,sDoCgMxB,cACE,gBACA,iBACA,YACA,oBACA,cpC1LkB,sCoC6LlB,gCAGF,YACE,mBACA,8CAEA,aACE,wBACA,iBACA,oCAIJ,uBACE,CADF,oBACE,CADF,eACE,sBACA,eACA,WpC/NI,qBoCiOJ,WACA,UACA,oBACA,qXACA,sBACA,kBACA,CACA,yBACA,mDAGF,UACE,cAIJ,apCjOkB,qBoCoOhB,+BACE,6BAEA,8BACE,YCpPN,qBACE,iBANc,cAQd,kBACA,sCAEA,WANF,UAOI,eACA,mBAIJ,sBACE,eACA,gBACA,gBACA,qBACA,crClBmB,oBqCqBnB,arClBwB,0BqCoBtB,6EAEA,oBAGE,wCAIJ,arChCmB,oBqCqCnB,YACE,oBACA,+BAEA,eACE,yBAIJ,eACE,crC/CiB,qBqCmDnB,iBACE,crCpDiB,uBqCwDnB,eACE,mBACA,kBACA,kBACA,yHAGF,sBAME,mBACA,oBACA,gBACA,crCxEiB,qBqC4EnB,aACE,qBAGF,gBACE,qBAGF,eACE,qBAGF,gBACE,yCAGF,aAEE,qBAGF,eACE,qBAGF,kBACE,yCAMA,iBACA,iBACA,yDAEA,2BACE,yDAGF,2BACE,qBAIJ,UACE,SACA,SACA,gCACA,eACA,4BAEA,UACE,SACA,wBAIJ,UACE,yBACA,8BACA,CADA,iBACA,gBACA,mBACA,iEAEA,+BAEE,cACA,kBACA,gBACA,gBACA,crCnJe,iCqCuJjB,uBACE,gBACA,gBACA,crC7IY,qDqCiJd,WAEE,iBACA,kBACA,qBACA,mEAEA,SACE,kBACA,iFAEA,gBACE,kBACA,6EAGF,iBACE,SACA,UACA,mBACA,gBACA,uBACA,+BAMR,YACE,oBAIJ,kBACE,eACA,mCAEA,iBACE,oBACA,8BAGF,YACE,8BACA,eACA,6BAGF,UACE,uBACA,eACA,iBACA,WrCrNI,iBqCuNJ,kBACA,qEAEA,aAEE,6CAIA,arC7Ne,oCqCkOjB,sBACE,gBACA,eACA,iBACA,qCAGF,4BA3BF,iBA4BI,4BAIJ,iBACE,YACA,sBACA,mBACA,CACA,sBACA,0BACA,QACA,aACA,yCAEA,sBACE,eACA,iBACA,gBACA,crC7Pe,mBqC+Pf,mBACA,gCACA,uBACA,mBACA,gBACA,wFAEA,eAEE,cACA,2CAGF,oBACE,2BAKN,iBACE,mCAIE,UACqB,sClCnRzB,CkCoRI,kBACA,uCAEA,aACE,WACA,YACA,mBACA,iBjCpOgB,wBD9DtB,4BACA,iCkCsSE,cACE,mCAEA,aACE,WrC5SA,qBqC8SA,uDAGE,yBACE,2CAKN,aACE,crCrTa,kCqC6TnB,sBAEE,CACA,eACA,eACA,iBACA,mBACA,crCpUiB,sCqCuUjB,arCpUsB,0BqCsUpB,kBAIJ,cACE,SACA,UACA,gBACA,uBACA,oBACA,kBACA,oBACA,cACA,kBAGF,sBACE,eACA,iBACA,gBACA,mBACA,crC9ViB,wBqCiWjB,sBACE,cACA,eACA,gBACA,cACA,kBAKF,cACA,iBrC5WiB,mCqC0WnB,sBACE,CAEA,eACA,mBACA,crC/WiB,kBqCoXjB,cACA,iBrCrXiB,kBqC6XjB,crC7XiB,mCqC4XnB,sBACE,CACA,gBACA,gBACA,mBACA,crCjYiB,kBqCsYjB,crCtYiB,kBqC8YnB,sBACE,eACA,iBACA,gBACA,mBACA,crCnZiB,mCqCuZnB,gBAEE,mDAEA,2BACE,mDAGF,2BACE,kBAIJ,eACE,kBAGF,kBACE,yCAGF,cAEE,kBAGF,UACE,SACA,SACA,0CACA,cACA,yBAEA,UACE,SACA,iDAIJ,YAEE,+BAGF,kBrCjcwB,kBqCmctB,kBACA,gBACA,sBACA,oCAEA,UACE,aACA,2BACA,iBACA,8BACA,mBACA,uDAGF,YACE,yBACA,qBACA,mFAEA,aACE,eACA,qCAGF,sDAVF,UAWI,8BACA,6CAIJ,MACE,sBACA,qCAEA,2CAJF,YAKI,sBAKN,iBACE,yBAEA,WACE,WACA,uBACA,4BAIJ,iBACE,mBACA,uCAEA,eACE,mCAGF,eACE,cACA,qCAGF,eACE,UACA,mDAEA,kBACE,aACA,iBACA,0FAKE,oBACE,gFAIJ,cACE,qDAIJ,aACE,cACA,6CAMA,UACqB,sClC9hB3B,mDkCiiBI,cACE,4DAEA,cACE,qCAKN,oCACE,eACE,sCAIJ,2BA9DF,iBA+DI,mFAIJ,qBAGE,mBrC3jBsB,kBqC6jBtB,kCACA,uBAGF,YACE,kBACA,WACA,YACA,2BAEA,YACE,WACA,uCAKF,YACE,eACA,mBACA,mBACA,qCAGF,sCACE,kBACE,uCAIJ,arC7lBiB,qCqCimBjB,eACE,WrCrmBE,gBqCumBF,CrCpmBe,yFqCymBb,arCzmBa,+CqC+mBjB,eACE,qBAIJ,kBACE,yBAEA,aACE,SACA,eACA,YACA,kBACA,qCAIJ,gDAEI,kBACE,yCAGF,eACE,gBACA,WACA,kBACA,uDAEA,iBACE,sCAMR,8BACE,aACE,uCAEA,gBACE,sDAGF,kBACE,6EAIJ,aAEE,qBAIJ,WACE,UAIJ,mBACE,qCAEA,SAHF,eAII,kBAGF,YACE,uBACA,mBACA,aACA,qBAEA,SrC3rBI,YqC6rBF,qCAGF,gBAXF,SAYI,mBACA,sBAIJ,eACE,uBACA,gBACA,gBACA,uBAGF,eACE,gBACA,0BAEA,YACE,yBACA,gBACA,eACA,crCltBe,6BqCstBjB,eACE,iBACA,+BAGF,kBrCztBsB,aqC2tBpB,0BACA,aACA,uCAEA,YACE,gCAIJ,cACE,gBACA,uDAEA,YACE,mBACA,iDAGF,UACE,YACA,0BACA,gCAIJ,YACE,uCAEA,sBACE,eACA,gBACA,cACA,qCAGF,cACE,crCjwBa,uFqCuwBnB,eACE,cASA,CrCjxBiB,2CqC8wBjB,iBACA,CACA,kBACA,gBAGF,eACE,cACA,aACA,kDACA,cACA,qCAEA,eAPF,oCAQI,cACA,8BAEA,UACE,aACA,sBACA,0CAEA,OACE,cACA,2CAGF,YACE,mBACA,QACA,cACA,qCAIJ,UACE,2BAGF,eACE,sCAIJ,eAtCF,UAuCI,6BAEA,aACE,gBACA,gBACA,2GAEA,eAGE,uFAIJ,+BAGE,2BAGF,YACE,gCAEA,eACE,qEAEA,eAEE,gBACA,2CAGF,eACE,SAQZ,iBACE,qBACA,iBAGF,aACE,kBACA,aACA,UACA,YACA,crC72BsB,qBqC+2BtB,eACA,qCAEA,gBAVF,eAWI,WACA,gBACA,crCz2Bc,SsCjBlB,UACE,eACA,iBACA,yBACA,qBAEA,WAEE,iBACA,mBACA,6BACA,gBACA,mBACA,oBAGF,qBACE,gCACA,aACA,gBACA,oBAGF,eACE,qEAGF,kBtCrBwB,UsC0BxB,atCzBwB,0BsC2BtB,gBAEA,oBACE,eAIJ,eACE,CAII,4HADF,eACE,+FAOF,sBAEE,yFAKF,YAEE,gCAMJ,kBtC9DsB,6BsCgEpB,gCACA,4CAEA,qBACE,8BACA,2CAGF,uBACE,+BACA,0BAKN,qBACE,gBAIJ,aACE,mBACA,MAGF,+BACE,0BAGF,sBACE,SACA,aACA,8CAGF,oBAEE,qBACA,iBACA,eACA,ctC1GmB,gBsC4GnB,0DAEA,UtCjHM,wDsCqHN,eACE,iBACA,sEAGF,cACE,yCAKF,YAEE,yDAEA,qBACE,iBACA,eACA,gBACA,qEAEA,cACE,2EAGF,YACE,mBACA,uFAEA,YACE,qHAOJ,sBACA,cACA,uBAIJ,wBACE,mBtC5JsB,sBsC8JtB,YACA,mBACA,gCAEA,gBACE,mBACA,oBAIJ,YACE,yBACA,aACA,mBtC3KsB,gCsC8KtB,aACE,gBACA,mBAIJ,wBACE,aACA,mBACA,qCAEA,wCACE,4BACE,0BAIJ,kBACE,iCAGF,kBtCnMsB,uCsCsMpB,kBACE,4BAIJ,gBACE,oBACA,sCAEA,SACE,wCAGF,YACE,mBACA,mCAGF,aACE,aACA,uBACA,mBACA,kBACA,6CAEA,UACE,YACA,kCAIJ,aACE,mCAGF,aACE,iBACA,ctC7Oa,gBsC+Ob,mCAIJ,QACE,WACA,qCAEA,sBACE,gBACA,qCAOJ,4FAFF,YAGI,gCAIJ,aACE,sCAEA,eACE,4BAIJ,wBACE,aACA,gBACA,qCAEA,2BALF,4BAMI,sCAIJ,+CACE,YACE,iBCzRN,YACE,uBACA,WACA,iBACA,iCAEA,gBACE,gBACA,oBACA,cACA,wCAEA,YACE,yBACA,mBvCZoB,YuCcpB,yBAIJ,WAvBc,UAyBZ,oBACA,iCAEA,YACE,mBACA,YACA,uCAEA,aACE,yCAEA,oBACE,aACA,2CAGF,SvCzCA,YuC2CE,kBACA,YACA,uCAIJ,aACE,cvC/Ca,qBuCiDb,cACA,eACA,aACA,0HAIA,kBAGE,+BAKN,aACE,iBACA,YACA,aACA,qCAGF,sCACE,YACE,6BAIJ,eACE,0BACA,gBACA,mBACA,qCAEA,2BANF,eAOI,+BAGF,aACE,aACA,cvCzFa,qBuC2Fb,0BACA,2CACA,0BACA,mBACA,gBACA,uBACA,mCAEA,gBACE,oCAGF,UvC1GA,yBuC4GE,0BACA,2CACA,uCAGF,kBACE,sBACA,+BAIJ,kBACE,wBACA,SACA,iCAEA,QACE,kBACA,6DAIJ,UvClIE,yBAMkB,gBuC+HlB,gBACA,mEAEA,wBACE,6DAKN,yBACE,iCAIJ,qBACE,WACA,gBApJY,cAsJZ,sCAGF,uCACE,YACE,iCAGF,WA/JY,cAiKV,sCAIJ,gCACE,UACE,0BAMF,2BACA,qCAEA,wBALF,cAMI,CACA,sBACA,kCAGF,YACE,oBAEA,gCACA,0BAEA,eAEA,mBACA,8BACA,mCAEA,eACE,kBACA,yCAGF,mBACE,4DAEA,eACE,qCAIJ,gCAzBF,eA0BI,iBACA,6BAIJ,avClNiB,euCoNf,iBACA,gBACA,qCAEA,2BANF,eAOI,6BAIJ,avC7NiB,euC+Nf,iBACA,gBACA,mBACA,4BAGF,wBACE,eACA,gBACA,cvCxOe,mBuC0Of,kBACA,gCACA,4BAGF,cACE,cvChPe,iBuCkPf,gBACA,0CAGF,UvCzPI,gBuC2PF,uFAGF,eAEE,gEAGF,aACE,4CAGF,cACE,gBACA,WvCzQE,oBuC2QF,iBACA,gBACA,mBACA,2BAGF,cACE,iBACA,cvChRe,mBuCkRf,kCAEA,UvCvRE,gBuCyRA,CAII,2NADF,eACE,4BAMR,UACE,SACA,SACA,0CACA,cACA,mCAEA,UACE,SACA,qCAKN,eA9SF,aA+SI,iCAEA,YACE,yBAGF,UACE,UACA,YACA,iCAEA,YACE,4BAGF,YACE,8DAGF,eAEE,gCACA,gBACA,0EAEA,eACE,+BAIJ,eACE,6DAGF,2BvC9UoB,YuCqV1B,UACE,SACA,cACA,WACA,sDAKA,avCjWmB,0DuCoWjB,avCjWsB,4DuCsWxB,anC1Wc,gBmC4WZ,4DAGF,anC9WU,gBmCgXR,0DAGF,avCtWgB,gBuCwWd,0DAGF,anCtXU,gBmCwXR,UAIJ,YACE,eACA,yBAEA,aACE,qBACA,oCAEA,kBACE,4BAGF,cACE,gBACA,+BAEA,oBACE,iBACA,gCAIJ,eACE,yBACA,eACA,CAII,iNADF,eACE,6CAKN,aACE,mBACA,2BAGF,oBACE,cvCtae,qBuCwaf,yBACA,eACA,gBACA,gCACA,iCAEA,UvCjbE,gCuCmbA,oCAGF,avChboB,gCuCkblB,iBAMR,aACE,iBACA,eACA,sBAGF,aACE,eACA,cACA,wBAEA,aACE,kBAIJ,YACE,eACA,mBACA,wBAGF,YACE,WACA,sBACA,aACA,+BAEA,aACE,qBACA,gBACA,eACA,iBACA,cvC5diB,CuCieb,4MADF,eACE,sCAKN,aACE,gCAIJ,YAEE,mBACA,kEAEA,UACE,kBACA,4BACA,gFAEA,iBACE,kDAKN,aAEE,aACA,sBACA,4EAEA,cACE,WACA,kBACA,mBACA,uEAIJ,cAEE,iBAGF,YACE,eACA,kBACA,2CAEA,kBACE,eACA,8BAGF,kBACE,+CAGF,gBACE,uDAEA,gBACE,mBACA,YACA,YAKN,kBACE,eACA,cAEA,avCxiBwB,qBuC0iBtB,oBAEA,yBACE,SAKN,aACE,YAGF,gBACE,eACA,mBvCzjBwB,gCuC2jBxB,uBAEA,eACE,oBAGF,YACE,2BACA,mBACA,cvCtkBiB,euCwkBjB,eACA,oBAGF,iBACE,4BAEA,aACE,SACA,kBACA,WACA,YACA,qBAIJ,2BACE,mBAGF,oBACE,uBAGF,avCnlBgB,sDuCulBhB,avCpmBmB,qBuCwmBjB,gBACA,yDAIJ,oBAIE,cvCjnBmB,iGuConBnB,eACE,yIAIA,4BACE,cACA,iIAGF,8BACE,CADF,sBACE,WACA,sBAKN,YAEE,mBACA,sCAEA,aACE,CACA,gBACA,kBACA,0DAIA,8BACE,CADF,sBACE,WACA,gBAKN,kBACE,8BACA,yBAEA,yBnC9pBc,yBmCkqBd,yBACE,wBAGF,yBnCnqBU,wBmCwqBR,2BACA,eACA,iBACA,4BACA,kBACA,gBACA,0BAEA,avClrBiB,uBuCwrBjB,wBACA,qBAGF,avC/qBgB,cuCorBlB,kBvC/rB0B,kBuCisBxB,mBACA,uBAEA,YACE,8BACA,mBACA,aACA,gCAEA,SACE,SACA,gDAEA,aACE,8BAIJ,aACE,gBACA,cvCvtBe,yBuCytBf,iBACA,gCAEA,aACE,qBACA,iHAEA,aAGE,mCAIJ,anCvuBM,6BmC8uBR,YACE,2BACA,6BACA,mCAEA,kBACE,gFAGF,YAEE,cACA,sBACA,YACA,cvC5vBa,mLuC+vBb,kBAEE,gBACA,uBACA,sCAIJ,aACE,6BACA,4CAEA,avC9vBU,iBuCgwBR,gBACA,wCAIJ,aACE,sBACA,WACA,aACA,qBACA,cvCvxBa,WuC8xBrB,kBAGE,0BAFA,eACA,uBASA,CARA,eAGF,oBACE,gBACA,CAEA,qBACA,oBAGF,YACE,eACA,CACA,kBACA,wBAEA,qBACE,cACA,mBACA,aACA,0FAGF,kBAEE,kBACA,YACA,6CAGF,QACE,SACA,+CAEA,aACE,sEAGF,uBACE,yDAGF,anC70BY,8CmCk1Bd,qBACE,aACA,WvCt1BI,cuC21BR,iBACE,qBAGF,wBACE,kBACA,2BAEA,cACE,mBvC/1BsB,gCuCi2BtB,kCAEA,cACE,cACA,gBACA,eACA,gBACA,cvC12Be,qBuC42Bf,mBACA,uHAEA,UvCl3BE,iCuCy3BJ,cACE,cvC12BY,uCuC82Bd,YACE,8BACA,mBACA,sCAGF,eACE,0pDCp4BN,kIACE,CADF,sIACE,uIAYA,aAEE,yIAGF,aAEE,qIAGF,aAEE,6IAGF,aAEE,UChCJ,aACE,gCAEA,gBACE,eACA,mBACA,+BAGF,cACE,iBACA,8CAGF,aACE,kBACA,wBAGF,gBACE,iCAGF,aACE,kBACA,uCAGF,oBACE,gDAGF,SACE,YACA,8BAGF,cACE,iBACA,mEAGF,aACE,kBACA,2DAGF,cAEE,gBACA,mFAGF,cACE,gBACA,+BAGF,eACE,2EAGF,UAEE,mCAGF,aACE,iBACA,yBAGF,kBACE,kBACA,4BAGF,UACE,UACA,wBAGF,aACE,kCAGF,MACE,WACA,cACA,mBACA,2CAGF,aACE,iBACA,0CAGF,gBACE,eACA,mCAGF,WACE,sCAGF,gBACE,gBACA,yCAGF,UACE,iCAGF,aACE,iBACA,+BAGF,UACE,0BAGF,gBACE,eACA,UAGA,WACA,yCAGF,iBACE,mBACA,4GAGF,iBAEE,gBACA,uCAGF,kBACE,eACA,2BAGF,aACE,kBACA,wCAGF,SACE,YACA,yDAGF,SACE,WACA,CAKA,oFAGF,UACE,OACA,uGAGF,UAEE,gBACA,uCAIA,cACE,iBACA,kEAEA,cACE,gBACA,qCAKN,WACE,eACA,iBACA,uCAGF,WACE,sCAGF,aACE,kBACA,0CAGF,gBACE,eACA,uDAGF,gBACE,2CAGF,cACE,iBACA,YACA,yEAGF,aAEE,iBACA,iBAGF,wBACE,iBAGF,SACE,oBACA,yBAGF,aACE,8EAGF,cAEE,gBACA,oDAGF,cACE,mBACA,gEAGF,iBACE,gBACA,CAMA,8KAGF,SACE,QACA,yDAGF,kBACE,eACA,uDAGF,kBACE,gBACA,qDAGF,SACE,QACA,8FAGF,cAEE,mBACA,4CAGF,UACE,SACA,kDAEA,UACE,OACA,qEACA,8BAIJ,sXACE,uCAGF,gBAEE,kCAGF,cACE,iBACA,gDAGF,UACE,UACA,gEAGF,aACE,uDAGF,WACE,WACA,uDAGF,UACE,WACA,uDAGF,UACE,WACA,kDAGF,MACE,0CAGF,iBACE,yBACA,qDAGF,cACE,iBACA,qCAGF,kCACE,gBAEE,kBACA,2DAEA,gBACE,mBACA,uEAKF,gBAEE,kBACA,gFAKN,cAEE,gBACA,6CAKE,eACE,eACA,sDAIJ,aACE,kBACA,4DAKF,cACE,gBACA,8DAGF,gBACE,eACA,mCAIJ,aACE,kBACA,iBACA,kCAGF,WACE,mCAGF,WACE,oCAGF,cACE,gBACA,gFAGF,cACE,mBACA,+DAGF,SACE,QACA,sBChbJ,YACE,eACA,CACA,kBACA,0BAEA,qBACE,iBACA,cACA,mBACA,yDAEA,YAEE,mBACA,kBACA,sBACA,YACA,4BAGF,oBACE,cACA,cACA,qGAEA,kBAGE,sDAKN,iBAEE,gBACA,eACA,iBACA,W1CtCI,uB0CwCJ,mBACA,iBACA,4BAGF,cACE,6BAGF,cACE,c1C/CiB,kB0CiDjB,gBACA,qBAIJ,YACE,eACA,cACA,yBAEA,gBACE,mBACA,6BAEA,aACE,sCAIJ,a1CpEmB,gB0CsEjB,qBACA,wBCxEJ,kB3CG0B,C2CCtB,4EAGF,kBACE,gDAEA,kB3CPsB,wC2CcxB,gBACE,uCAGF,iBACE,kCAIJ,kBACE,yBACA,mEAEA,uDACE,kDAIJ,kBACE,mFAEA,uDACE,qBAMF,eACE,0CAIJ,kDACE,gBAGF,kB3CnD0B,0B2CuD1B,i2BACE,oCAEA,sDACE,CADF,8CACE,iDAOF,kBAEE,uDAEA,kBACE,qBACA,C3CxEoB,8E2CuF1B,kB3CvF0B,4B2C6FxB,yB3C7FwB,2B2CiGxB,wB3CjGwB,8B2CqGxB,2B3CrGwB,6B2CyGxB,0B3CzGwB,wB2CgHxB,kB3ChHwB,cAFL,0F2C2HnB,aACE,4GAEA,kKAEA,aACE,CAHF,6HAEA,aACE,CAHF,qIAEA,aACE,CAHF,mHAEA,aACE,sCAIJ,kBACE,iCAGF,YACE,C3CzIoB,mH2C+IpB,a3C/IoB,8C2CuJxB,aACE,2JAEA,UvC7JM,wCuCoKR,aACE,mEAEA,aACE,CAHF,yDAEA,aACE,CAHF,6DAEA,aACE,CAHF,oDAEA,aACE,2BAIJ,2BACE,gDAKA,a3C7KwB,iB2CkL1B,oBACE,6BAEA,kBACE,0BAIJ,+BACE,qB3C5LwB,oC2CgM1B,kBACE,iMAIA,kBAIE,qBAIJ,kB3C/MqB,sE2CmNrB,kBACE,4FAGF,kBACE,qOAIF,evC9NQ,yBuC0ON,wBAGF,0BACE,0BAGF,wBACE,uLAGF,kBAME,4qEAIE,qBAGE,uCAMN,aAEE,uBAIF,e3C9QQ,gC2CmRJ,a3ChRoB,yB2CyRtB,e3C5RM,CADA,oG2CwSF,U3CxSE,0D2CqTF,a3ClTe,2C2CwTf,U3C3TE,6C2CgUJ,a3C7TiB,6D2CiUjB,U3CpUI,qB2C2UR,UvC1UQ,yBuC6UN,SvC7UM,iGuCmVN,eAGE,CAIA,oEAIA,kBACE,oDAEA,eACE,iHAMA,UvCxWA,2CuCiXR,yCACE,gMAGF,eAUE,sKAGF,U3CnYQ,0D","file":"skins/glitch/mastodon-light/common.css","sourcesContent":["html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:\"\";content:none}table{border-collapse:collapse;border-spacing:0}html{scrollbar-color:#ccd7e0 rgba(255,255,255,.1)}::-webkit-scrollbar{width:12px;height:12px}::-webkit-scrollbar-thumb{background:#ccd7e0;border:0px none #fff;border-radius:50px}::-webkit-scrollbar-thumb:hover{background:#c6d2dc}::-webkit-scrollbar-thumb:active{background:#ccd7e0}::-webkit-scrollbar-track{border:0px none #fff;border-radius:0;background:rgba(255,255,255,.1)}::-webkit-scrollbar-track:hover{background:#d9e1e8}::-webkit-scrollbar-track:active{background:#d9e1e8}::-webkit-scrollbar-corner{background:transparent}body{font-family:sans-serif,sans-serif;background:#eff3f5;font-size:13px;line-height:18px;font-weight:400;color:#000;text-rendering:optimizelegibility;font-feature-settings:\"kern\";text-size-adjust:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-tap-highlight-color:transparent}body.system-font{font-family:system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"Oxygen\",\"Ubuntu\",\"Cantarell\",\"Fira Sans\",\"Droid Sans\",\"Helvetica Neue\",sans-serif,sans-serif}body.app-body{padding:0}body.app-body.layout-single-column{height:auto;min-height:100vh;overflow-y:scroll}body.app-body.layout-multiple-columns{position:absolute;width:100%;height:100%}body.app-body.with-modals--active{overflow-y:hidden}body.lighter{background:#d9e1e8}body.with-modals{overflow-x:hidden;overflow-y:scroll}body.with-modals--active{overflow-y:hidden}body.embed{background:#ccd7e0;margin:0;padding-bottom:0}body.embed .container{position:absolute;width:100%;height:100%;overflow:hidden}body.admin{background:#e6ebf0;padding:0}body.error{position:absolute;text-align:center;color:#282c37;background:#d9e1e8;width:100%;height:100%;padding:0;display:flex;justify-content:center;align-items:center}body.error .dialog{vertical-align:middle;margin:20px}body.error .dialog img{display:block;max-width:470px;width:100%;height:auto;margin-top:-120px}body.error .dialog h1{font-size:20px;line-height:28px;font-weight:400}button{font-family:inherit;cursor:pointer}button:focus{outline:none}.app-holder,.app-holder>div{display:flex;width:100%;align-items:center;justify-content:center;outline:0 !important}.layout-single-column .app-holder,.layout-single-column .app-holder>div{min-height:100vh}.layout-multiple-columns .app-holder,.layout-multiple-columns .app-holder>div{height:100%}.container-alt{width:700px;margin:0 auto;margin-top:40px}@media screen and (max-width: 740px){.container-alt{width:100%;margin:0}}.logo-container{margin:100px auto 50px}@media screen and (max-width: 500px){.logo-container{margin:40px auto 0}}.logo-container h1{display:flex;justify-content:center;align-items:center}.logo-container h1 svg{fill:#000;height:42px;margin-right:10px}.logo-container h1 a{display:flex;justify-content:center;align-items:center;color:#000;text-decoration:none;outline:0;padding:12px 16px;line-height:32px;font-family:sans-serif,sans-serif;font-weight:500;font-size:14px}.compose-standalone .compose-form{width:400px;margin:0 auto;padding:20px 0;margin-top:40px;box-sizing:border-box}@media screen and (max-width: 400px){.compose-standalone .compose-form{width:100%;margin-top:0;padding:20px}}.account-header{width:400px;margin:0 auto;display:flex;font-size:13px;line-height:18px;box-sizing:border-box;padding:20px 0;padding-bottom:0;margin-bottom:-30px;margin-top:40px}@media screen and (max-width: 440px){.account-header{width:100%;margin:0;margin-bottom:10px;padding:20px;padding-bottom:0}}.account-header .avatar{width:40px;height:40px;width:40px;height:40px;background-size:40px 40px;margin-right:8px}.account-header .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px;border-radius:8%;background-position:50%;background-clip:padding-box}.account-header .name{flex:1 1 auto;color:#282c37;width:calc(100% - 88px)}.account-header .name .username{display:block;font-weight:500;text-overflow:ellipsis;overflow:hidden}.account-header .logout-link{display:block;font-size:32px;line-height:40px;margin-left:8px}.grid-3{display:grid;grid-gap:10px;grid-template-columns:3fr 1fr;grid-auto-columns:25%;grid-auto-rows:max-content}.grid-3 .column-0{grid-column:1/3;grid-row:1}.grid-3 .column-1{grid-column:1;grid-row:2}.grid-3 .column-2{grid-column:2;grid-row:2}.grid-3 .column-3{grid-column:1/3;grid-row:3}@media screen and (max-width: 415px){.grid-3{grid-gap:0;grid-template-columns:minmax(0, 100%)}.grid-3 .column-0{grid-column:1}.grid-3 .column-1{grid-column:1;grid-row:3}.grid-3 .column-2{grid-column:1;grid-row:2}.grid-3 .column-3{grid-column:1;grid-row:4}}.grid-4{display:grid;grid-gap:10px;grid-template-columns:repeat(4, minmax(0, 1fr));grid-auto-columns:25%;grid-auto-rows:max-content}.grid-4 .column-0{grid-column:1/5;grid-row:1}.grid-4 .column-1{grid-column:1/4;grid-row:2}.grid-4 .column-2{grid-column:4;grid-row:2}.grid-4 .column-3{grid-column:2/5;grid-row:3}.grid-4 .column-4{grid-column:1;grid-row:3}.grid-4 .landing-page__call-to-action{min-height:100%}.grid-4 .flash-message{margin-bottom:10px}@media screen and (max-width: 738px){.grid-4{grid-template-columns:minmax(0, 50%) minmax(0, 50%)}.grid-4 .landing-page__call-to-action{padding:20px;display:flex;align-items:center;justify-content:center}.grid-4 .row__information-board{width:100%;justify-content:center;align-items:center}.grid-4 .row__mascot{display:none}}@media screen and (max-width: 415px){.grid-4{grid-gap:0;grid-template-columns:minmax(0, 100%)}.grid-4 .column-0{grid-column:1}.grid-4 .column-1{grid-column:1;grid-row:3}.grid-4 .column-2{grid-column:1;grid-row:2}.grid-4 .column-3{grid-column:1;grid-row:5}.grid-4 .column-4{grid-column:1;grid-row:4}}@media screen and (max-width: 415px){.public-layout{padding-top:48px}}.public-layout .container{max-width:960px}@media screen and (max-width: 415px){.public-layout .container{padding:0}}.public-layout .header{background:#c0cdd9;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;height:48px;margin:10px 0;display:flex;align-items:stretch;justify-content:center;flex-wrap:nowrap;overflow:hidden}@media screen and (max-width: 415px){.public-layout .header{position:fixed;width:100%;top:0;left:0;margin:0;border-radius:0;box-shadow:none;z-index:110}}.public-layout .header>div{flex:1 1 33.3%;min-height:1px}.public-layout .header .nav-left{display:flex;align-items:stretch;justify-content:flex-start;flex-wrap:nowrap}.public-layout .header .nav-center{display:flex;align-items:stretch;justify-content:center;flex-wrap:nowrap}.public-layout .header .nav-right{display:flex;align-items:stretch;justify-content:flex-end;flex-wrap:nowrap}.public-layout .header .brand{display:block;padding:15px}.public-layout .header .brand svg{display:block;height:18px;width:auto;position:relative;bottom:-2px;fill:#000}@media screen and (max-width: 415px){.public-layout .header .brand svg{height:20px}}.public-layout .header .brand:hover,.public-layout .header .brand:focus,.public-layout .header .brand:active{background:#b3c3d1}.public-layout .header .nav-link{display:flex;align-items:center;padding:0 1rem;font-size:12px;font-weight:500;text-decoration:none;color:#282c37;white-space:nowrap;text-align:center}.public-layout .header .nav-link:hover,.public-layout .header .nav-link:focus,.public-layout .header .nav-link:active{text-decoration:underline;color:#000}@media screen and (max-width: 550px){.public-layout .header .nav-link.optional{display:none}}.public-layout .header .nav-button{background:#a6b9c9;margin:8px;margin-left:0;border-radius:4px}.public-layout .header .nav-button:hover,.public-layout .header .nav-button:focus,.public-layout .header .nav-button:active{text-decoration:none;background:#99afc2}.public-layout .grid{display:grid;grid-gap:10px;grid-template-columns:minmax(300px, 3fr) minmax(298px, 1fr);grid-auto-columns:25%;grid-auto-rows:max-content}.public-layout .grid .column-0{grid-row:1;grid-column:1}.public-layout .grid .column-1{grid-row:1;grid-column:2}@media screen and (max-width: 600px){.public-layout .grid{grid-template-columns:100%;grid-gap:0}.public-layout .grid .column-1{display:none}}.public-layout .directory__card{border-radius:4px}@media screen and (max-width: 415px){.public-layout .directory__card{border-radius:0}}@media screen and (max-width: 415px){.public-layout .page-header{border-bottom:0}}.public-layout .public-account-header{overflow:hidden;margin-bottom:10px;box-shadow:0 0 15px rgba(0,0,0,.2)}.public-layout .public-account-header.inactive{opacity:.5}.public-layout .public-account-header.inactive .public-account-header__image,.public-layout .public-account-header.inactive .avatar{filter:grayscale(100%)}.public-layout .public-account-header.inactive .logo-button{background-color:#282c37}.public-layout .public-account-header__image{border-radius:4px 4px 0 0;overflow:hidden;height:300px;position:relative;background:#fff}.public-layout .public-account-header__image::after{content:\"\";display:block;position:absolute;width:100%;height:100%;box-shadow:inset 0 -1px 1px 1px rgba(0,0,0,.15);top:0;left:0}.public-layout .public-account-header__image img{object-fit:cover;display:block;width:100%;height:100%;margin:0;border-radius:4px 4px 0 0}@media screen and (max-width: 600px){.public-layout .public-account-header__image{height:200px}}.public-layout .public-account-header--no-bar{margin-bottom:0}.public-layout .public-account-header--no-bar .public-account-header__image,.public-layout .public-account-header--no-bar .public-account-header__image img{border-radius:4px}@media screen and (max-width: 415px){.public-layout .public-account-header--no-bar .public-account-header__image,.public-layout .public-account-header--no-bar .public-account-header__image img{border-radius:0}}@media screen and (max-width: 415px){.public-layout .public-account-header{margin-bottom:0;box-shadow:none}.public-layout .public-account-header__image::after{display:none}.public-layout .public-account-header__image,.public-layout .public-account-header__image img{border-radius:0}}.public-layout .public-account-header__bar{position:relative;margin-top:-80px;display:flex;justify-content:flex-start}.public-layout .public-account-header__bar::before{content:\"\";display:block;background:#ccd7e0;position:absolute;bottom:0;left:0;right:0;height:60px;border-radius:0 0 4px 4px;z-index:-1}.public-layout .public-account-header__bar .avatar{display:block;width:120px;height:120px;width:120px;height:120px;background-size:120px 120px;padding-left:16px;flex:0 0 auto}.public-layout .public-account-header__bar .avatar img{display:block;width:100%;height:100%;margin:0;border-radius:50%;border:4px solid #ccd7e0;background:#f2f5f7;border-radius:8%;background-position:50%;background-clip:padding-box}@media screen and (max-width: 600px){.public-layout .public-account-header__bar{margin-top:0;background:#ccd7e0;border-radius:0 0 4px 4px;padding:5px}.public-layout .public-account-header__bar::before{display:none}.public-layout .public-account-header__bar .avatar{width:48px;height:48px;width:48px;height:48px;background-size:48px 48px;padding:7px 0;padding-left:10px}.public-layout .public-account-header__bar .avatar img{border:0;border-radius:4px;border-radius:8%;background-position:50%;background-clip:padding-box}}@media screen and (max-width: 600px)and (max-width: 360px){.public-layout .public-account-header__bar .avatar{display:none}}@media screen and (max-width: 415px){.public-layout .public-account-header__bar{border-radius:0}}@media screen and (max-width: 600px){.public-layout .public-account-header__bar{flex-wrap:wrap}}.public-layout .public-account-header__tabs{flex:1 1 auto;margin-left:20px}.public-layout .public-account-header__tabs__name{padding-top:20px;padding-bottom:8px}.public-layout .public-account-header__tabs__name h1{font-size:20px;line-height:27px;color:#000;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-shadow:1px 1px 1px #000}.public-layout .public-account-header__tabs__name h1 small{display:block;font-size:14px;color:#000;font-weight:400;overflow:hidden;text-overflow:ellipsis}@media screen and (max-width: 600px){.public-layout .public-account-header__tabs{margin-left:15px;display:flex;justify-content:space-between;align-items:center}.public-layout .public-account-header__tabs__name{padding-top:0;padding-bottom:0}.public-layout .public-account-header__tabs__name h1{font-size:16px;line-height:24px;text-shadow:none}.public-layout .public-account-header__tabs__name h1 small{color:#282c37}}.public-layout .public-account-header__tabs__tabs{display:flex;justify-content:flex-start;align-items:stretch;height:58px}.public-layout .public-account-header__tabs__tabs .details-counters{display:flex;flex-direction:row;min-width:300px}@media screen and (max-width: 600px){.public-layout .public-account-header__tabs__tabs .details-counters{display:none}}.public-layout .public-account-header__tabs__tabs .counter{min-width:33.3%;box-sizing:border-box;flex:0 0 auto;color:#282c37;padding:10px;border-right:1px solid #ccd7e0;cursor:default;text-align:center;position:relative}.public-layout .public-account-header__tabs__tabs .counter a{display:block}.public-layout .public-account-header__tabs__tabs .counter:last-child{border-right:0}.public-layout .public-account-header__tabs__tabs .counter::after{display:block;content:\"\";position:absolute;bottom:0;left:0;width:100%;border-bottom:4px solid #9baec8;opacity:.5;transition:all 400ms ease}.public-layout .public-account-header__tabs__tabs .counter.active::after{border-bottom:4px solid #2b90d9;opacity:1}.public-layout .public-account-header__tabs__tabs .counter.active.inactive::after{border-bottom-color:#282c37}.public-layout .public-account-header__tabs__tabs .counter:hover::after{opacity:1;transition-duration:100ms}.public-layout .public-account-header__tabs__tabs .counter a{text-decoration:none;color:inherit}.public-layout .public-account-header__tabs__tabs .counter .counter-label{font-size:12px;display:block}.public-layout .public-account-header__tabs__tabs .counter .counter-number{font-weight:500;font-size:18px;margin-bottom:5px;color:#000;font-family:sans-serif,sans-serif}.public-layout .public-account-header__tabs__tabs .spacer{flex:1 1 auto;height:1px}.public-layout .public-account-header__tabs__tabs__buttons{padding:7px 8px}.public-layout .public-account-header__extra{display:none;margin-top:4px}.public-layout .public-account-header__extra .public-account-bio{border-radius:0;box-shadow:none;background:transparent;margin:0 -5px}.public-layout .public-account-header__extra .public-account-bio .account__header__fields{border-top:1px solid #b3c3d1}.public-layout .public-account-header__extra .public-account-bio .roles{display:none}.public-layout .public-account-header__extra__links{margin-top:-15px;font-size:14px;color:#282c37}.public-layout .public-account-header__extra__links a{display:inline-block;color:#282c37;text-decoration:none;padding:15px;font-weight:500}.public-layout .public-account-header__extra__links a strong{font-weight:700;color:#000}@media screen and (max-width: 600px){.public-layout .public-account-header__extra{display:block;flex:100%}}.public-layout .account__section-headline{border-radius:4px 4px 0 0}@media screen and (max-width: 415px){.public-layout .account__section-headline{border-radius:0}}.public-layout .detailed-status__meta{margin-top:25px}.public-layout .public-account-bio{background:#c0cdd9;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;overflow:hidden;margin-bottom:10px}@media screen and (max-width: 415px){.public-layout .public-account-bio{box-shadow:none;margin-bottom:0;border-radius:0}}.public-layout .public-account-bio .account__header__fields{margin:0;border-top:0}.public-layout .public-account-bio .account__header__fields a{color:#217aba}.public-layout .public-account-bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.public-layout .public-account-bio .account__header__fields .verified a{color:#79bd9a}.public-layout .public-account-bio .account__header__content{padding:20px;padding-bottom:0;color:#000}.public-layout .public-account-bio__extra,.public-layout .public-account-bio .roles{padding:20px;font-size:14px;color:#282c37}.public-layout .public-account-bio .roles{padding-bottom:0}.public-layout .directory__list{display:grid;grid-gap:10px;grid-template-columns:minmax(0, 50%) minmax(0, 50%)}@media screen and (max-width: 415px){.public-layout .directory__list{display:block}}.public-layout .directory__list .icon-button{font-size:18px}.public-layout .directory__card{margin-bottom:0}.public-layout .card-grid{display:flex;flex-wrap:wrap;min-width:100%;margin:0 -5px}.public-layout .card-grid>div{box-sizing:border-box;flex:1 0 auto;width:300px;padding:0 5px;margin-bottom:10px;max-width:33.333%}@media screen and (max-width: 900px){.public-layout .card-grid>div{max-width:50%}}@media screen and (max-width: 600px){.public-layout .card-grid>div{max-width:100%}}@media screen and (max-width: 415px){.public-layout .card-grid{margin:0;border-top:1px solid #c0cdd9}.public-layout .card-grid>div{width:100%;padding:0;margin-bottom:0;border-bottom:1px solid #c0cdd9}.public-layout .card-grid>div:last-child{border-bottom:0}.public-layout .card-grid>div .card__bar{background:#d9e1e8}.public-layout .card-grid>div .card__bar:hover,.public-layout .card-grid>div .card__bar:active,.public-layout .card-grid>div .card__bar:focus{background:#ccd7e0}}.no-list{list-style:none}.no-list li{display:inline-block;margin:0 5px}.recovery-codes{list-style:none;margin:0 auto}.recovery-codes li{font-size:125%;line-height:1.5;letter-spacing:1px}.modal-layout{background:#d9e1e8 url('data:image/svg+xml;utf8,') repeat-x bottom fixed;display:flex;flex-direction:column;height:100vh;padding:0}.modal-layout__mastodon{display:flex;flex:1;flex-direction:column;justify-content:flex-end}.modal-layout__mastodon>*{flex:1;max-height:235px}@media screen and (max-width: 600px){.account-header{margin-top:0}}.public-layout .footer{text-align:left;padding-top:20px;padding-bottom:60px;font-size:12px;color:#6d8ca7}@media screen and (max-width: 415px){.public-layout .footer{padding-left:20px;padding-right:20px}}.public-layout .footer .grid{display:grid;grid-gap:10px;grid-template-columns:1fr 1fr 2fr 1fr 1fr}.public-layout .footer .grid .column-0{grid-column:1;grid-row:1;min-width:0}.public-layout .footer .grid .column-1{grid-column:2;grid-row:1;min-width:0}.public-layout .footer .grid .column-2{grid-column:3;grid-row:1;min-width:0;text-align:center}.public-layout .footer .grid .column-2 h4 a{color:#6d8ca7}.public-layout .footer .grid .column-3{grid-column:4;grid-row:1;min-width:0}.public-layout .footer .grid .column-4{grid-column:5;grid-row:1;min-width:0}@media screen and (max-width: 690px){.public-layout .footer .grid{grid-template-columns:1fr 2fr 1fr}.public-layout .footer .grid .column-0,.public-layout .footer .grid .column-1{grid-column:1}.public-layout .footer .grid .column-1{grid-row:2}.public-layout .footer .grid .column-2{grid-column:2}.public-layout .footer .grid .column-3,.public-layout .footer .grid .column-4{grid-column:3}.public-layout .footer .grid .column-4{grid-row:2}}@media screen and (max-width: 600px){.public-layout .footer .grid .column-1{display:block}}@media screen and (max-width: 415px){.public-layout .footer .grid .column-0,.public-layout .footer .grid .column-1,.public-layout .footer .grid .column-3,.public-layout .footer .grid .column-4{display:none}}.public-layout .footer h4{text-transform:uppercase;font-weight:700;margin-bottom:8px;color:#282c37}.public-layout .footer h4 a{color:inherit;text-decoration:none}.public-layout .footer ul a{text-decoration:none;color:#6d8ca7}.public-layout .footer ul a:hover,.public-layout .footer ul a:active,.public-layout .footer ul a:focus{text-decoration:underline}.public-layout .footer .brand svg{display:block;height:36px;width:auto;margin:0 auto;fill:#6d8ca7}.public-layout .footer .brand:hover svg,.public-layout .footer .brand:focus svg,.public-layout .footer .brand:active svg{fill:#60829f}.compact-header h1{font-size:24px;line-height:28px;color:#282c37;font-weight:500;margin-bottom:20px;padding:0 10px;word-wrap:break-word}@media screen and (max-width: 740px){.compact-header h1{text-align:center;padding:20px 10px 0}}.compact-header h1 a{color:inherit;text-decoration:none}.compact-header h1 small{font-weight:400;color:#282c37}.compact-header h1 img{display:inline-block;margin-bottom:-5px;margin-right:15px;width:36px;height:36px}.hero-widget{margin-bottom:10px;box-shadow:0 0 15px rgba(0,0,0,.2)}.hero-widget__img{width:100%;position:relative;overflow:hidden;border-radius:4px 4px 0 0;background:#000}.hero-widget__img img{object-fit:cover;display:block;width:100%;height:100%;margin:0;border-radius:4px 4px 0 0}.hero-widget__text{background:#d9e1e8;padding:20px;border-radius:0 0 4px 4px;font-size:15px;color:#282c37;line-height:20px;word-wrap:break-word;font-weight:400}.hero-widget__text .emojione{width:20px;height:20px;margin:-3px 0 0}.hero-widget__text p{margin-bottom:20px}.hero-widget__text p:last-child{margin-bottom:0}.hero-widget__text em{display:inline;margin:0;padding:0;font-weight:700;background:transparent;font-family:inherit;font-size:inherit;line-height:inherit;color:#131419}.hero-widget__text a{color:#282c37;text-decoration:none}.hero-widget__text a:hover{text-decoration:underline}@media screen and (max-width: 415px){.hero-widget{display:none}}.endorsements-widget{margin-bottom:10px;padding-bottom:10px}.endorsements-widget h4{padding:10px;text-transform:uppercase;font-weight:700;font-size:13px;color:#282c37}.endorsements-widget .account{padding:10px 0}.endorsements-widget .account:last-child{border-bottom:0}.endorsements-widget .account .account__display-name{display:flex;align-items:center}.endorsements-widget .account .account__avatar{width:44px;height:44px;background-size:44px 44px}.endorsements-widget .trends__item{padding:10px}.trends-widget h4{color:#282c37}.box-widget{padding:20px;border-radius:4px;background:#d9e1e8;box-shadow:0 0 15px rgba(0,0,0,.2)}.placeholder-widget{padding:16px;border-radius:4px;border:2px dashed #444b5d;text-align:center;color:#282c37;margin-bottom:10px}.contact-widget{min-height:100%;font-size:15px;color:#282c37;line-height:20px;word-wrap:break-word;font-weight:400;padding:0}.contact-widget h4{padding:10px;text-transform:uppercase;font-weight:700;font-size:13px;color:#282c37}.contact-widget .account{border-bottom:0;padding:10px 0;padding-top:5px}.contact-widget>a{display:inline-block;padding:10px;padding-top:0;color:#282c37;text-decoration:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.contact-widget>a:hover,.contact-widget>a:focus,.contact-widget>a:active{text-decoration:underline}.moved-account-widget{padding:15px;padding-bottom:20px;border-radius:4px;background:#d9e1e8;box-shadow:0 0 15px rgba(0,0,0,.2);color:#282c37;font-weight:400;margin-bottom:10px}.moved-account-widget strong,.moved-account-widget a{font-weight:500}.moved-account-widget strong:lang(ja),.moved-account-widget a:lang(ja){font-weight:700}.moved-account-widget strong:lang(ko),.moved-account-widget a:lang(ko){font-weight:700}.moved-account-widget strong:lang(zh-CN),.moved-account-widget a:lang(zh-CN){font-weight:700}.moved-account-widget strong:lang(zh-HK),.moved-account-widget a:lang(zh-HK){font-weight:700}.moved-account-widget strong:lang(zh-TW),.moved-account-widget a:lang(zh-TW){font-weight:700}.moved-account-widget a{color:inherit;text-decoration:underline}.moved-account-widget a.mention{text-decoration:none}.moved-account-widget a.mention span{text-decoration:none}.moved-account-widget a.mention:focus,.moved-account-widget a.mention:hover,.moved-account-widget a.mention:active{text-decoration:none}.moved-account-widget a.mention:focus span,.moved-account-widget a.mention:hover span,.moved-account-widget a.mention:active span{text-decoration:underline}.moved-account-widget__message{margin-bottom:15px}.moved-account-widget__message .fa{margin-right:5px;color:#282c37}.moved-account-widget__card .detailed-status__display-avatar{position:relative;cursor:pointer}.moved-account-widget__card .detailed-status__display-name{margin-bottom:0;text-decoration:none}.moved-account-widget__card .detailed-status__display-name span{font-weight:400}.memoriam-widget{padding:20px;border-radius:4px;background:#000;box-shadow:0 0 15px rgba(0,0,0,.2);font-size:14px;color:#282c37;margin-bottom:10px}.page-header{background:#c0cdd9;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;padding:60px 15px;text-align:center;margin:10px 0}.page-header h1{color:#000;font-size:36px;line-height:1.1;font-weight:700;margin-bottom:10px}.page-header p{font-size:15px;color:#282c37}@media screen and (max-width: 415px){.page-header{margin-top:0;background:#ccd7e0}.page-header h1{font-size:24px}}.directory{background:#d9e1e8;border-radius:4px;box-shadow:0 0 15px rgba(0,0,0,.2)}.directory__tag{box-sizing:border-box;margin-bottom:10px}.directory__tag>a,.directory__tag>div{display:flex;align-items:center;justify-content:space-between;background:#d9e1e8;border-radius:4px;padding:15px;text-decoration:none;color:inherit;box-shadow:0 0 15px rgba(0,0,0,.2)}.directory__tag>a:hover,.directory__tag>a:active,.directory__tag>a:focus{background:#c0cdd9}.directory__tag.active>a{background:#2b90d9;cursor:default}.directory__tag.disabled>div{opacity:.5;cursor:default}.directory__tag h4{flex:1 1 auto;font-size:18px;font-weight:700;color:#000;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.directory__tag h4 .fa{color:#282c37}.directory__tag h4 small{display:block;font-weight:400;font-size:15px;margin-top:8px;color:#282c37}.directory__tag.active h4,.directory__tag.active h4 .fa,.directory__tag.active h4 small{color:#000}.directory__tag .avatar-stack{flex:0 0 auto;width:120px}.directory__tag.active .avatar-stack .account__avatar{border-color:#2b90d9}.avatar-stack{display:flex;justify-content:flex-end}.avatar-stack .account__avatar{flex:0 0 auto;width:36px;height:36px;border-radius:50%;position:relative;margin-left:-10px;background:#f2f5f7;border:2px solid #d9e1e8}.avatar-stack .account__avatar:nth-child(1){z-index:1}.avatar-stack .account__avatar:nth-child(2){z-index:2}.avatar-stack .account__avatar:nth-child(3){z-index:3}.accounts-table{width:100%}.accounts-table .account{padding:0;border:0}.accounts-table strong{font-weight:700}.accounts-table thead th{text-align:center;text-transform:uppercase;color:#282c37;font-weight:700;padding:10px}.accounts-table thead th:first-child{text-align:left}.accounts-table tbody td{padding:15px 0;vertical-align:middle;border-bottom:1px solid #c0cdd9}.accounts-table tbody tr:last-child td{border-bottom:0}.accounts-table__count{width:120px;text-align:center;font-size:15px;font-weight:500;color:#000}.accounts-table__count small{display:block;color:#282c37;font-weight:400;font-size:14px}.accounts-table__comment{width:50%;vertical-align:initial !important}@media screen and (max-width: 415px){.accounts-table tbody td.optional{display:none}}@media screen and (max-width: 415px){.moved-account-widget,.memoriam-widget,.box-widget,.contact-widget,.landing-page__information.contact-widget,.directory,.page-header{margin-bottom:0;box-shadow:none;border-radius:0}}.statuses-grid{min-height:600px}@media screen and (max-width: 640px){.statuses-grid{width:100% !important}}.statuses-grid__item{width:313.3333333333px}@media screen and (max-width: 1255px){.statuses-grid__item{width:306.6666666667px}}@media screen and (max-width: 640px){.statuses-grid__item{width:100%}}@media screen and (max-width: 415px){.statuses-grid__item{width:100vw}}.statuses-grid .detailed-status{border-radius:4px}@media screen and (max-width: 415px){.statuses-grid .detailed-status{border-top:1px solid #a6b9c9}}.statuses-grid .detailed-status.compact .detailed-status__meta{margin-top:15px}.statuses-grid .detailed-status.compact .status__content{font-size:15px;line-height:20px}.statuses-grid .detailed-status.compact .status__content .emojione{width:20px;height:20px;margin:-3px 0 0}.statuses-grid .detailed-status.compact .status__content .status__content__spoiler-link{line-height:20px;margin:0}.statuses-grid .detailed-status.compact .media-gallery,.statuses-grid .detailed-status.compact .status-card,.statuses-grid .detailed-status.compact .video-player{margin-top:15px}.notice-widget{margin-bottom:10px;color:#282c37}.notice-widget p{margin-bottom:10px}.notice-widget p:last-child{margin-bottom:0}.notice-widget a{font-size:14px;line-height:20px}.notice-widget a,.placeholder-widget a{text-decoration:none;font-weight:500;color:#2b90d9}.notice-widget a:hover,.notice-widget a:focus,.notice-widget a:active,.placeholder-widget a:hover,.placeholder-widget a:focus,.placeholder-widget a:active{text-decoration:underline}.table-of-contents{background:#e6ebf0;min-height:100%;font-size:14px;border-radius:4px}.table-of-contents li a{display:block;font-weight:500;padding:15px;overflow:hidden;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-decoration:none;color:#000;border-bottom:1px solid #ccd7e0}.table-of-contents li a:hover,.table-of-contents li a:focus,.table-of-contents li a:active{text-decoration:underline}.table-of-contents li:last-child a{border-bottom:0}.table-of-contents li ul{padding-left:20px;border-bottom:1px solid #ccd7e0}code{font-family:monospace,monospace;font-weight:400}.form-container{max-width:400px;padding:20px;margin:0 auto}.simple_form .input{margin-bottom:15px;overflow:hidden}.simple_form .input.hidden{margin:0}.simple_form .input.radio_buttons .radio{margin-bottom:15px}.simple_form .input.radio_buttons .radio:last-child{margin-bottom:0}.simple_form .input.radio_buttons .radio>label{position:relative;padding-left:28px}.simple_form .input.radio_buttons .radio>label input{position:absolute;top:-2px;left:0}.simple_form .input.boolean{position:relative;margin-bottom:0}.simple_form .input.boolean .label_input>label{font-family:inherit;font-size:14px;padding-top:5px;color:#000;display:block;width:auto}.simple_form .input.boolean .label_input,.simple_form .input.boolean .hint{padding-left:28px}.simple_form .input.boolean .label_input__wrapper{position:static}.simple_form .input.boolean label.checkbox{position:absolute;top:2px;left:0}.simple_form .input.boolean label a{color:#2b90d9;text-decoration:underline}.simple_form .input.boolean label a:hover,.simple_form .input.boolean label a:active,.simple_form .input.boolean label a:focus{text-decoration:none}.simple_form .input.boolean .recommended{position:absolute;margin:0 4px;margin-top:-2px}.simple_form .row{display:flex;margin:0 -5px}.simple_form .row .input{box-sizing:border-box;flex:1 1 auto;width:50%;padding:0 5px}.simple_form .hint{color:#282c37}.simple_form .hint a{color:#2b90d9}.simple_form .hint code{border-radius:3px;padding:.2em .4em;background:#fff}.simple_form span.hint{display:block;font-size:12px;margin-top:4px}.simple_form p.hint{margin-bottom:15px;color:#282c37}.simple_form p.hint.subtle-hint{text-align:center;font-size:12px;line-height:18px;margin-top:15px;margin-bottom:0}.simple_form .card{margin-bottom:15px}.simple_form strong{font-weight:500}.simple_form strong:lang(ja){font-weight:700}.simple_form strong:lang(ko){font-weight:700}.simple_form strong:lang(zh-CN){font-weight:700}.simple_form strong:lang(zh-HK){font-weight:700}.simple_form strong:lang(zh-TW){font-weight:700}.simple_form .input.with_floating_label .label_input{display:flex}.simple_form .input.with_floating_label .label_input>label{font-family:inherit;font-size:14px;color:#000;font-weight:500;min-width:150px;flex:0 0 auto}.simple_form .input.with_floating_label .label_input input,.simple_form .input.with_floating_label .label_input select{flex:1 1 auto}.simple_form .input.with_floating_label.select .hint{margin-top:6px;margin-left:150px}.simple_form .input.with_label .label_input>label{font-family:inherit;font-size:14px;color:#000;display:block;margin-bottom:8px;word-wrap:break-word;font-weight:500}.simple_form .input.with_label .hint{margin-top:6px}.simple_form .input.with_label ul{flex:390px}.simple_form .input.with_block_label{max-width:none}.simple_form .input.with_block_label>label{font-family:inherit;font-size:16px;color:#000;display:block;font-weight:500;padding-top:5px}.simple_form .input.with_block_label .hint{margin-bottom:15px}.simple_form .input.with_block_label ul{columns:2}.simple_form .input.datetime .label_input select{display:inline-block;width:auto;flex:0}.simple_form .required abbr{text-decoration:none;color:#c1203b}.simple_form .fields-group{margin-bottom:25px}.simple_form .fields-group .input:last-child{margin-bottom:0}.simple_form .fields-row{display:flex;margin:0 -10px;padding-top:5px;margin-bottom:25px}.simple_form .fields-row .input{max-width:none}.simple_form .fields-row__column{box-sizing:border-box;padding:0 10px;flex:1 1 auto;min-height:1px}.simple_form .fields-row__column-6{max-width:50%}.simple_form .fields-row__column .actions{margin-top:27px}.simple_form .fields-row .fields-group:last-child,.simple_form .fields-row .fields-row__column.fields-group{margin-bottom:0}@media screen and (max-width: 600px){.simple_form .fields-row{display:block;margin-bottom:0}.simple_form .fields-row__column{max-width:none}.simple_form .fields-row .fields-group:last-child,.simple_form .fields-row .fields-row__column.fields-group,.simple_form .fields-row .fields-row__column{margin-bottom:25px}}.simple_form .input.radio_buttons .radio label{margin-bottom:5px;font-family:inherit;font-size:14px;color:#000;display:block;width:auto}.simple_form .check_boxes .checkbox label{font-family:inherit;font-size:14px;color:#000;display:inline-block;width:auto;position:relative;padding-top:5px;padding-left:25px;flex:1 1 auto}.simple_form .check_boxes .checkbox input[type=checkbox]{position:absolute;left:0;top:5px;margin:0}.simple_form .input.static .label_input__wrapper{font-size:16px;padding:10px;border:1px solid #444b5d;border-radius:4px}.simple_form input[type=text],.simple_form input[type=number],.simple_form input[type=email],.simple_form input[type=password],.simple_form textarea{box-sizing:border-box;font-size:16px;color:#000;display:block;width:100%;outline:0;font-family:inherit;resize:vertical;background:#f9fafb;border:1px solid #fff;border-radius:4px;padding:10px}.simple_form input[type=text]::placeholder,.simple_form input[type=number]::placeholder,.simple_form input[type=email]::placeholder,.simple_form input[type=password]::placeholder,.simple_form textarea::placeholder{color:#1f232b}.simple_form input[type=text]:invalid,.simple_form input[type=number]:invalid,.simple_form input[type=email]:invalid,.simple_form input[type=password]:invalid,.simple_form textarea:invalid{box-shadow:none}.simple_form input[type=text]:focus:invalid:not(:placeholder-shown),.simple_form input[type=number]:focus:invalid:not(:placeholder-shown),.simple_form input[type=email]:focus:invalid:not(:placeholder-shown),.simple_form input[type=password]:focus:invalid:not(:placeholder-shown),.simple_form textarea:focus:invalid:not(:placeholder-shown){border-color:#c1203b}.simple_form input[type=text]:required:valid,.simple_form input[type=number]:required:valid,.simple_form input[type=email]:required:valid,.simple_form input[type=password]:required:valid,.simple_form textarea:required:valid{border-color:#79bd9a}.simple_form input[type=text]:hover,.simple_form input[type=number]:hover,.simple_form input[type=email]:hover,.simple_form input[type=password]:hover,.simple_form textarea:hover{border-color:#fff}.simple_form input[type=text]:active,.simple_form input[type=text]:focus,.simple_form input[type=number]:active,.simple_form input[type=number]:focus,.simple_form input[type=email]:active,.simple_form input[type=email]:focus,.simple_form input[type=password]:active,.simple_form input[type=password]:focus,.simple_form textarea:active,.simple_form textarea:focus{border-color:#2b90d9;background:#f2f5f7}.simple_form .input.field_with_errors label{color:#c1203b}.simple_form .input.field_with_errors input[type=text],.simple_form .input.field_with_errors input[type=number],.simple_form .input.field_with_errors input[type=email],.simple_form .input.field_with_errors input[type=password],.simple_form .input.field_with_errors textarea,.simple_form .input.field_with_errors select{border-color:#c1203b}.simple_form .input.field_with_errors .error{display:block;font-weight:500;color:#c1203b;margin-top:4px}.simple_form .input.disabled{opacity:.5}.simple_form .actions{margin-top:30px;display:flex}.simple_form .actions.actions--top{margin-top:0;margin-bottom:30px}.simple_form button,.simple_form .button,.simple_form .block-button{display:block;width:100%;border:0;border-radius:4px;background:#2b90d9;color:#000;font-size:18px;line-height:inherit;height:auto;padding:10px;text-transform:uppercase;text-decoration:none;text-align:center;box-sizing:border-box;cursor:pointer;font-weight:500;outline:0;margin-bottom:10px;margin-right:10px}.simple_form button:last-child,.simple_form .button:last-child,.simple_form .block-button:last-child{margin-right:0}.simple_form button:hover,.simple_form .button:hover,.simple_form .block-button:hover{background-color:#2482c7}.simple_form button:active,.simple_form button:focus,.simple_form .button:active,.simple_form .button:focus,.simple_form .block-button:active,.simple_form .block-button:focus{background-color:#419bdd}.simple_form button:disabled:hover,.simple_form .button:disabled:hover,.simple_form .block-button:disabled:hover{background-color:#9baec8}.simple_form button.negative,.simple_form .button.negative,.simple_form .block-button.negative{background:#df405a}.simple_form button.negative:hover,.simple_form .button.negative:hover,.simple_form .block-button.negative:hover{background-color:#db2a47}.simple_form button.negative:active,.simple_form button.negative:focus,.simple_form .button.negative:active,.simple_form .button.negative:focus,.simple_form .block-button.negative:active,.simple_form .block-button.negative:focus{background-color:#e3566d}.simple_form select{appearance:none;box-sizing:border-box;font-size:16px;color:#000;display:block;width:100%;outline:0;font-family:inherit;resize:vertical;background:#f9fafb url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center/auto 16px;border:1px solid #fff;border-radius:4px;padding-left:10px;padding-right:30px;height:41px}.simple_form h4{margin-bottom:15px !important}.simple_form .label_input__wrapper{position:relative}.simple_form .label_input__append{position:absolute;right:3px;top:1px;padding:10px;padding-bottom:9px;font-size:16px;color:#444b5d;font-family:inherit;pointer-events:none;cursor:default;max-width:140px;white-space:nowrap;overflow:hidden}.simple_form .label_input__append::after{content:\"\";display:block;position:absolute;top:0;right:0;bottom:1px;width:5px;background-image:linear-gradient(to right, rgba(249, 250, 251, 0), #f9fafb)}.simple_form__overlay-area{position:relative}.simple_form__overlay-area__blurred form{filter:blur(2px)}.simple_form__overlay-area__overlay{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;background:rgba(217,225,232,.65);border-radius:4px;margin-left:-4px;margin-top:-4px;padding:4px}.simple_form__overlay-area__overlay__content{text-align:center}.simple_form__overlay-area__overlay__content.rich-formatting,.simple_form__overlay-area__overlay__content.rich-formatting p{color:#000}.block-icon{display:block;margin:0 auto;margin-bottom:10px;font-size:24px}.flash-message{background:#c0cdd9;color:#282c37;border-radius:4px;padding:15px 10px;margin-bottom:30px;text-align:center}.flash-message.notice{border:1px solid rgba(121,189,154,.5);background:rgba(121,189,154,.25);color:#79bd9a}.flash-message.alert{border:1px solid rgba(223,64,90,.5);background:rgba(223,64,90,.25);color:#df405a}.flash-message a{display:inline-block;color:#282c37;text-decoration:none}.flash-message a:hover{color:#000;text-decoration:underline}.flash-message p{margin-bottom:15px}.flash-message .oauth-code{outline:0;box-sizing:border-box;display:block;width:100%;border:none;padding:10px;font-family:monospace,monospace;background:#d9e1e8;color:#000;font-size:14px;margin:0}.flash-message .oauth-code::-moz-focus-inner{border:0}.flash-message .oauth-code::-moz-focus-inner,.flash-message .oauth-code:focus,.flash-message .oauth-code:active{outline:0 !important}.flash-message .oauth-code:focus{background:#ccd7e0}.flash-message strong{font-weight:500}.flash-message strong:lang(ja){font-weight:700}.flash-message strong:lang(ko){font-weight:700}.flash-message strong:lang(zh-CN){font-weight:700}.flash-message strong:lang(zh-HK){font-weight:700}.flash-message strong:lang(zh-TW){font-weight:700}@media screen and (max-width: 740px)and (min-width: 441px){.flash-message{margin-top:40px}}.form-footer{margin-top:30px;text-align:center}.form-footer a{color:#282c37;text-decoration:none}.form-footer a:hover{text-decoration:underline}.quick-nav{list-style:none;margin-bottom:25px;font-size:14px}.quick-nav li{display:inline-block;margin-right:10px}.quick-nav a{color:#2b90d9;text-transform:uppercase;text-decoration:none;font-weight:700}.quick-nav a:hover,.quick-nav a:focus,.quick-nav a:active{color:#217aba}.oauth-prompt,.follow-prompt{margin-bottom:30px;color:#282c37}.oauth-prompt h2,.follow-prompt h2{font-size:16px;margin-bottom:30px;text-align:center}.oauth-prompt strong,.follow-prompt strong{color:#282c37;font-weight:500}.oauth-prompt strong:lang(ja),.follow-prompt strong:lang(ja){font-weight:700}.oauth-prompt strong:lang(ko),.follow-prompt strong:lang(ko){font-weight:700}.oauth-prompt strong:lang(zh-CN),.follow-prompt strong:lang(zh-CN){font-weight:700}.oauth-prompt strong:lang(zh-HK),.follow-prompt strong:lang(zh-HK){font-weight:700}.oauth-prompt strong:lang(zh-TW),.follow-prompt strong:lang(zh-TW){font-weight:700}@media screen and (max-width: 740px)and (min-width: 441px){.oauth-prompt,.follow-prompt{margin-top:40px}}.qr-wrapper{display:flex;flex-wrap:wrap;align-items:flex-start}.qr-code{flex:0 0 auto;background:#fff;padding:4px;margin:0 10px 20px 0;box-shadow:0 0 15px rgba(0,0,0,.2);display:inline-block}.qr-code svg{display:block;margin:0}.qr-alternative{margin-bottom:20px;color:#282c37;flex:150px}.qr-alternative samp{display:block;font-size:14px}.table-form p{margin-bottom:15px}.table-form p strong{font-weight:500}.table-form p strong:lang(ja){font-weight:700}.table-form p strong:lang(ko){font-weight:700}.table-form p strong:lang(zh-CN){font-weight:700}.table-form p strong:lang(zh-HK){font-weight:700}.table-form p strong:lang(zh-TW){font-weight:700}.simple_form .warning,.table-form .warning{box-sizing:border-box;background:rgba(223,64,90,.5);color:#000;text-shadow:1px 1px 0 rgba(0,0,0,.3);box-shadow:0 2px 6px rgba(0,0,0,.4);border-radius:4px;padding:10px;margin-bottom:15px}.simple_form .warning a,.table-form .warning a{color:#000;text-decoration:underline}.simple_form .warning a:hover,.simple_form .warning a:focus,.simple_form .warning a:active,.table-form .warning a:hover,.table-form .warning a:focus,.table-form .warning a:active{text-decoration:none}.simple_form .warning strong,.table-form .warning strong{font-weight:600;display:block;margin-bottom:5px}.simple_form .warning strong:lang(ja),.table-form .warning strong:lang(ja){font-weight:700}.simple_form .warning strong:lang(ko),.table-form .warning strong:lang(ko){font-weight:700}.simple_form .warning strong:lang(zh-CN),.table-form .warning strong:lang(zh-CN){font-weight:700}.simple_form .warning strong:lang(zh-HK),.table-form .warning strong:lang(zh-HK){font-weight:700}.simple_form .warning strong:lang(zh-TW),.table-form .warning strong:lang(zh-TW){font-weight:700}.simple_form .warning strong .fa,.table-form .warning strong .fa{font-weight:400}.action-pagination{display:flex;flex-wrap:wrap;align-items:center}.action-pagination .actions,.action-pagination .pagination{flex:1 1 auto}.action-pagination .actions{padding:30px 0;padding-right:20px;flex:0 0 auto}.post-follow-actions{text-align:center;color:#282c37}.post-follow-actions div{margin-bottom:4px}.alternative-login{margin-top:20px;margin-bottom:20px}.alternative-login h4{font-size:16px;color:#000;text-align:center;margin-bottom:20px;border:0;padding:0}.alternative-login .button{display:block}.scope-danger{color:#ff5050}.form_admin_settings_site_short_description textarea,.form_admin_settings_site_description textarea,.form_admin_settings_site_extended_description textarea,.form_admin_settings_site_terms textarea,.form_admin_settings_custom_css textarea,.form_admin_settings_closed_registrations_message textarea{font-family:monospace,monospace}.input-copy{background:#f9fafb;border:1px solid #fff;border-radius:4px;display:flex;align-items:center;padding-right:4px;position:relative;top:1px;transition:border-color 300ms linear}.input-copy__wrapper{flex:1 1 auto}.input-copy input[type=text]{background:transparent;border:0;padding:10px;font-size:14px;font-family:monospace,monospace}.input-copy button{flex:0 0 auto;margin:4px;text-transform:none;font-weight:400;font-size:14px;padding:7px 18px;padding-bottom:6px;width:auto;transition:background 300ms linear}.input-copy.copied{border-color:#79bd9a;transition:none}.input-copy.copied button{background:#79bd9a;transition:none}.connection-prompt{margin-bottom:25px}.connection-prompt .fa-link{background-color:#e6ebf0;border-radius:100%;font-size:24px;padding:10px}.connection-prompt__column{align-items:center;display:flex;flex:1;flex-direction:column;flex-shrink:1;max-width:50%}.connection-prompt__column-sep{align-self:center;flex-grow:0;overflow:visible;position:relative;z-index:1}.connection-prompt__column p{word-break:break-word}.connection-prompt .account__avatar{margin-bottom:20px}.connection-prompt__connection{background-color:#c0cdd9;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;padding:25px 10px;position:relative;text-align:center}.connection-prompt__connection::after{background-color:#e6ebf0;content:\"\";display:block;height:100%;left:50%;position:absolute;top:0;width:1px}.connection-prompt__row{align-items:flex-start;display:flex;flex-direction:row}.card>a{display:block;text-decoration:none;color:inherit;box-shadow:0 0 15px rgba(0,0,0,.2)}@media screen and (max-width: 415px){.card>a{box-shadow:none}}.card>a:hover .card__bar,.card>a:active .card__bar,.card>a:focus .card__bar{background:#c0cdd9}.card__img{height:130px;position:relative;background:#fff;border-radius:4px 4px 0 0}.card__img img{display:block;width:100%;height:100%;margin:0;object-fit:cover;border-radius:4px 4px 0 0}@media screen and (max-width: 600px){.card__img{height:200px}}@media screen and (max-width: 415px){.card__img{display:none}}.card__bar{position:relative;padding:15px;display:flex;justify-content:flex-start;align-items:center;background:#ccd7e0;border-radius:0 0 4px 4px}@media screen and (max-width: 415px){.card__bar{border-radius:0}}.card__bar .avatar{flex:0 0 auto;width:48px;height:48px;width:48px;height:48px;background-size:48px 48px;padding-top:2px}.card__bar .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px;border-radius:8%;background-position:50%;background-clip:padding-box;background:#f2f5f7;object-fit:cover}.card__bar .display-name{margin-left:15px;text-align:left}.card__bar .display-name strong{font-size:15px;color:#000;font-weight:500;overflow:hidden;text-overflow:ellipsis}.card__bar .display-name span{display:block;font-size:14px;color:#282c37;font-weight:400;overflow:hidden;text-overflow:ellipsis}.pagination{padding:30px 0;text-align:center;overflow:hidden}.pagination a,.pagination .current,.pagination .newer,.pagination .older,.pagination .page,.pagination .gap{font-size:14px;color:#000;font-weight:500;display:inline-block;padding:6px 10px;text-decoration:none}.pagination .current{background:#fff;border-radius:100px;color:#000;cursor:default;margin:0 10px}.pagination .gap{cursor:default}.pagination .older,.pagination .newer{text-transform:uppercase;color:#282c37}.pagination .older{float:left;padding-left:0}.pagination .older .fa{display:inline-block;margin-right:5px}.pagination .newer{float:right;padding-right:0}.pagination .newer .fa{display:inline-block;margin-left:5px}.pagination .disabled{cursor:default;color:#000}@media screen and (max-width: 700px){.pagination{padding:30px 20px}.pagination .page{display:none}.pagination .newer,.pagination .older{display:inline-block}}.nothing-here{background:#d9e1e8;box-shadow:0 0 15px rgba(0,0,0,.2);color:#444b5d;font-size:14px;font-weight:500;text-align:center;display:flex;justify-content:center;align-items:center;cursor:default;border-radius:4px;padding:20px;min-height:30vh}.nothing-here--under-tabs{border-radius:0 0 4px 4px}.nothing-here--flexible{box-sizing:border-box;min-height:100%}.account-role,.simple_form .recommended{display:inline-block;padding:4px 6px;cursor:default;border-radius:3px;font-size:12px;line-height:12px;font-weight:500;color:#282c37;background-color:rgba(40,44,55,.1);border:1px solid rgba(40,44,55,.5)}.account-role.moderator,.simple_form .recommended.moderator{color:#79bd9a;background-color:rgba(121,189,154,.1);border-color:rgba(121,189,154,.5)}.account-role.admin,.simple_form .recommended.admin{color:#c1203b;background-color:rgba(193,32,59,.1);border-color:rgba(193,32,59,.5)}.account__header__fields{max-width:100vw;padding:0;margin:15px -15px -15px;border:0 none;border-top:1px solid #b3c3d1;border-bottom:1px solid #b3c3d1;font-size:14px;line-height:20px}.account__header__fields dl{display:flex;border-bottom:1px solid #b3c3d1}.account__header__fields dt,.account__header__fields dd{box-sizing:border-box;padding:14px;text-align:center;max-height:48px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.account__header__fields dt{font-weight:500;width:120px;flex:0 0 auto;color:#282c37;background:rgba(242,245,247,.5)}.account__header__fields dd{flex:1 1 auto;color:#282c37}.account__header__fields a{color:#2b90d9;text-decoration:none}.account__header__fields a:hover,.account__header__fields a:focus,.account__header__fields a:active{text-decoration:underline}.account__header__fields .verified{border:1px solid rgba(121,189,154,.5);background:rgba(121,189,154,.25)}.account__header__fields .verified a{color:#79bd9a;font-weight:500}.account__header__fields .verified__mark{color:#79bd9a}.account__header__fields dl:last-child{border-bottom:0}.directory__tag .trends__item__current{width:auto}.pending-account__header{color:#282c37}.pending-account__header a{color:#282c37;text-decoration:none}.pending-account__header a:hover,.pending-account__header a:active,.pending-account__header a:focus{text-decoration:underline}.pending-account__header strong{color:#000;font-weight:700}.pending-account__body{margin-top:10px}.activity-stream{box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;overflow:hidden;margin-bottom:10px}@media screen and (max-width: 415px){.activity-stream{margin-bottom:0;border-radius:0;box-shadow:none}}.activity-stream--headless{border-radius:0;margin:0;box-shadow:none}.activity-stream--headless .detailed-status,.activity-stream--headless .status{border-radius:0 !important}.activity-stream div[data-component]{width:100%}.activity-stream .entry{background:#d9e1e8}.activity-stream .entry .detailed-status,.activity-stream .entry .status,.activity-stream .entry .load-more{animation:none}.activity-stream .entry:last-child .detailed-status,.activity-stream .entry:last-child .status,.activity-stream .entry:last-child .load-more{border-bottom:0;border-radius:0 0 4px 4px}.activity-stream .entry:first-child .detailed-status,.activity-stream .entry:first-child .status,.activity-stream .entry:first-child .load-more{border-radius:4px 4px 0 0}.activity-stream .entry:first-child:last-child .detailed-status,.activity-stream .entry:first-child:last-child .status,.activity-stream .entry:first-child:last-child .load-more{border-radius:4px}@media screen and (max-width: 740px){.activity-stream .entry .detailed-status,.activity-stream .entry .status,.activity-stream .entry .load-more{border-radius:0 !important}}.activity-stream--highlighted .entry{background:#c0cdd9}.button.logo-button{flex:0 auto;font-size:14px;background:#2b90d9;color:#000;text-transform:none;line-height:36px;height:auto;padding:3px 15px;border:0}.button.logo-button svg{width:20px;height:auto;vertical-align:middle;margin-right:5px;fill:#000}.button.logo-button:active,.button.logo-button:focus,.button.logo-button:hover{background:#2074b1}.button.logo-button:disabled:active,.button.logo-button:disabled:focus,.button.logo-button:disabled:hover,.button.logo-button.disabled:active,.button.logo-button.disabled:focus,.button.logo-button.disabled:hover{background:#9baec8}.button.logo-button.button--destructive:active,.button.logo-button.button--destructive:focus,.button.logo-button.button--destructive:hover{background:#df405a}@media screen and (max-width: 415px){.button.logo-button svg{display:none}}.embed .detailed-status,.public-layout .detailed-status{padding:15px}.embed .status,.public-layout .status{padding:15px 15px 15px 78px;min-height:50px}.embed .status__avatar,.public-layout .status__avatar{left:15px;top:17px}.embed .status__content,.public-layout .status__content{padding-top:5px}.embed .status__prepend,.public-layout .status__prepend{padding:8px 0;padding-bottom:2px;margin:initial;margin-left:78px;padding-top:15px}.embed .status__prepend-icon-wrapper,.public-layout .status__prepend-icon-wrapper{position:absolute;margin:initial;float:initial;width:auto;left:-32px}.embed .status .media-gallery,.embed .status__action-bar,.embed .status .video-player,.public-layout .status .media-gallery,.public-layout .status__action-bar,.public-layout .status .video-player{margin-top:10px}.embed .status .status__info,.public-layout .status .status__info{font-size:15px;display:initial}.embed .status .status__relative-time,.public-layout .status .status__relative-time{color:#444b5d;float:right;font-size:14px;width:auto;margin:initial;padding:initial}.embed .status .status__info .status__display-name,.public-layout .status .status__info .status__display-name{display:block;max-width:100%;padding:6px 0;padding-right:25px;margin:initial}.embed .status .status__info .status__display-name .display-name strong,.public-layout .status .status__info .status__display-name .display-name strong{display:inline}.embed .status .status__avatar,.public-layout .status .status__avatar{height:48px;position:absolute;width:48px;margin:initial}.rtl .embed .status,.rtl .public-layout .status{padding-left:10px;padding-right:68px}.rtl .embed .status .status__info .status__display-name,.rtl .public-layout .status .status__info .status__display-name{padding-left:25px;padding-right:0}.rtl .embed .status .status__relative-time,.rtl .public-layout .status .status__relative-time{float:left}.status__content__read-more-button{display:block;font-size:15px;line-height:20px;color:#217aba;border:0;background:transparent;padding:0;padding-top:8px;text-decoration:none}.status__content__read-more-button:hover,.status__content__read-more-button:active{text-decoration:underline}.app-body{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.animated-number{display:inline-flex;flex-direction:column;align-items:stretch;overflow:hidden;position:relative}.link-button{display:block;font-size:15px;line-height:20px;color:#2b90d9;border:0;background:transparent;padding:0;cursor:pointer}.link-button:hover,.link-button:active{text-decoration:underline}.link-button:disabled{color:#9baec8;cursor:default}.button{background-color:#3897db;border:10px none;border-radius:4px;box-sizing:border-box;color:#000;cursor:pointer;display:inline-block;font-family:inherit;font-size:14px;font-weight:500;height:36px;letter-spacing:0;line-height:36px;overflow:hidden;padding:0 16px;position:relative;text-align:center;text-transform:uppercase;text-decoration:none;text-overflow:ellipsis;transition:all 100ms ease-in;transition-property:background-color;white-space:nowrap;width:auto}.button:active,.button:focus,.button:hover{background-color:#227dbe;transition:all 200ms ease-out;transition-property:background-color}.button--destructive{transition:none}.button--destructive:active,.button--destructive:focus,.button--destructive:hover{background-color:#df405a;transition:none}.button:disabled{background-color:#9baec8;cursor:default}.button.button-primary,.button.button-alternative,.button.button-secondary,.button.button-alternative-2{font-size:16px;line-height:36px;height:auto;text-transform:none;padding:4px 16px}.button.button-alternative{color:#000;background:#9baec8}.button.button-alternative:active,.button.button-alternative:focus,.button.button-alternative:hover{background-color:#8ea3c1}.button.button-alternative-2{background:#3c5063}.button.button-alternative-2:active,.button.button-alternative-2:focus,.button.button-alternative-2:hover{background-color:#344656}.button.button-secondary{font-size:16px;line-height:36px;height:auto;color:#282c37;text-transform:none;background:transparent;padding:3px 15px;border-radius:4px;border:1px solid #9baec8}.button.button-secondary:active,.button.button-secondary:focus,.button.button-secondary:hover{border-color:#8ea3c1;color:#1f232b}.button.button-secondary:disabled{opacity:.5}.button.button--block{display:block;width:100%}.icon-button{display:inline-block;padding:0;color:#606984;border:0;border-radius:4px;background:transparent;cursor:pointer;transition:all 100ms ease-in;transition-property:background-color,color}.icon-button:hover,.icon-button:active,.icon-button:focus{color:#51596f;background-color:rgba(96,105,132,.15);transition:all 200ms ease-out;transition-property:background-color,color}.icon-button:focus{background-color:rgba(96,105,132,.3)}.icon-button.disabled{color:#828ba4;background-color:transparent;cursor:default}.icon-button.active{color:#2b90d9}.icon-button::-moz-focus-inner{border:0}.icon-button::-moz-focus-inner,.icon-button:focus,.icon-button:active{outline:0 !important}.icon-button.inverted{color:#282c37}.icon-button.inverted:hover,.icon-button.inverted:active,.icon-button.inverted:focus{color:#373d4c;background-color:rgba(40,44,55,.15)}.icon-button.inverted:focus{background-color:rgba(40,44,55,.3)}.icon-button.inverted.disabled{color:#191b22;background-color:transparent}.icon-button.inverted.active{color:#2b90d9}.icon-button.inverted.active.disabled{color:#1d6ca4}.icon-button.overlayed{box-sizing:content-box;background:rgba(255,255,255,.6);color:rgba(0,0,0,.7);border-radius:4px;padding:2px}.icon-button.overlayed:hover{background:rgba(255,255,255,.9)}.text-icon-button{color:#282c37;border:0;border-radius:4px;background:transparent;cursor:pointer;font-weight:600;font-size:11px;padding:0 3px;line-height:27px;outline:0;transition:all 100ms ease-in;transition-property:background-color,color}.text-icon-button:hover,.text-icon-button:active,.text-icon-button:focus{color:#373d4c;background-color:rgba(40,44,55,.15);transition:all 200ms ease-out;transition-property:background-color,color}.text-icon-button:focus{background-color:rgba(40,44,55,.3)}.text-icon-button.disabled{color:#000;background-color:transparent;cursor:default}.text-icon-button.active{color:#2b90d9}.text-icon-button::-moz-focus-inner{border:0}.text-icon-button::-moz-focus-inner,.text-icon-button:focus,.text-icon-button:active{outline:0 !important}.dropdown-menu{position:absolute;transform-origin:50% 0}.invisible{font-size:0;line-height:0;display:inline-block;width:0;height:0;position:absolute}.invisible img,.invisible svg{margin:0 !important;border:0 !important;padding:0 !important;width:0 !important;height:0 !important}.ellipsis::after{content:\"…\"}.notification__favourite-icon-wrapper{left:0;position:absolute}.notification__favourite-icon-wrapper .fa.star-icon{color:#ca8f04}.star-icon.active{color:#ca8f04}.bookmark-icon.active{color:#ff5050}.no-reduce-motion .icon-button.star-icon.activate>.fa-star{animation:spring-rotate-in 1s linear}.no-reduce-motion .icon-button.star-icon.deactivate>.fa-star{animation:spring-rotate-out 1s linear}.notification__display-name{color:inherit;font-weight:500;text-decoration:none}.notification__display-name:hover{color:#000;text-decoration:underline}.display-name{display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.display-name a{color:inherit;text-decoration:inherit}.display-name strong{height:18px;font-size:16px;font-weight:500;line-height:18px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.display-name span{display:block;height:18px;font-size:15px;line-height:18px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.display-name>a:hover strong{text-decoration:underline}.display-name.inline{padding:0;height:18px;font-size:15px;line-height:18px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.display-name.inline strong{display:inline;height:auto;font-size:inherit;line-height:inherit}.display-name.inline span{display:inline;height:auto;font-size:inherit;line-height:inherit}.display-name__html{font-weight:500}.display-name__account{font-size:14px}.image-loader{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center;flex-direction:column}.image-loader .image-loader__preview-canvas{max-width:100%;max-height:80%;background:url(\"~images/void.png\") repeat;object-fit:contain}.image-loader .loading-bar{position:relative}.image-loader.image-loader--amorphous .image-loader__preview-canvas{display:none}.zoomable-image{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center}.zoomable-image img{max-width:100%;max-height:80%;width:auto;height:auto;object-fit:contain}.dropdown{display:inline-block}.dropdown__content{display:none;position:absolute}.dropdown-menu__separator{border-bottom:1px solid #393f4f;margin:5px 7px 6px;height:0}.dropdown-menu{background:#282c37;padding:4px 0;border-radius:4px;box-shadow:2px 4px 15px rgba(0,0,0,.4)}.dropdown-menu ul{list-style:none}.dropdown-menu__arrow{position:absolute;width:0;height:0;border:0 solid transparent}.dropdown-menu__arrow.left{right:-5px;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#282c37}.dropdown-menu__arrow.top{bottom:-5px;margin-left:-7px;border-width:5px 7px 0;border-top-color:#282c37}.dropdown-menu__arrow.bottom{top:-5px;margin-left:-7px;border-width:0 7px 5px;border-bottom-color:#282c37}.dropdown-menu__arrow.right{left:-5px;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#282c37}.dropdown-menu__item a{font-size:13px;line-height:18px;display:block;padding:4px 14px;box-sizing:border-box;text-decoration:none;background:#282c37;color:#000;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown-menu__item a:focus,.dropdown-menu__item a:hover,.dropdown-menu__item a:active{background:#2b90d9;color:#282c37;outline:0}.dropdown--active .dropdown__content{display:block;line-height:18px;max-width:311px;right:0;text-align:left;z-index:9999}.dropdown--active .dropdown__content>ul{list-style:none;background:#282c37;padding:4px 0;border-radius:4px;box-shadow:0 0 15px rgba(0,0,0,.4);min-width:140px;position:relative}.dropdown--active .dropdown__content.dropdown__right{right:0}.dropdown--active .dropdown__content.dropdown__left>ul{left:-98px}.dropdown--active .dropdown__content>ul>li>a{font-size:13px;line-height:18px;display:block;padding:4px 14px;box-sizing:border-box;text-decoration:none;background:#282c37;color:#000;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown--active .dropdown__content>ul>li>a:focus{outline:0}.dropdown--active .dropdown__content>ul>li>a:hover{background:#2b90d9;color:#282c37}.dropdown__icon{vertical-align:middle}.static-content{padding:10px;padding-top:20px;color:#444b5d}.static-content h1{font-size:16px;font-weight:500;margin-bottom:40px;text-align:center}.static-content p{font-size:13px;margin-bottom:20px}.column,.drawer{flex:1 1 100%;overflow:hidden}@media screen and (min-width: 631px){.columns-area{padding:0}.column,.drawer{flex:0 0 auto;padding:10px;padding-left:5px;padding-right:5px}.column:first-child,.drawer:first-child{padding-left:10px}.column:last-child,.drawer:last-child{padding-right:10px}.columns-area>div .column,.columns-area>div .drawer{padding-left:5px;padding-right:5px}}.tabs-bar{box-sizing:border-box;display:flex;background:#c0cdd9;flex:0 0 auto;overflow-y:auto}.tabs-bar__link{display:block;flex:1 1 auto;padding:15px 10px;padding-bottom:13px;color:#000;text-decoration:none;text-align:center;font-size:14px;font-weight:500;border-bottom:2px solid #c0cdd9;transition:all 50ms linear;transition-property:border-bottom,background,color}.tabs-bar__link .fa{font-weight:400;font-size:16px}@media screen and (min-width: 631px){.auto-columns .tabs-bar__link:hover,.auto-columns .tabs-bar__link:focus,.auto-columns .tabs-bar__link:active{background:#adbecd;border-bottom-color:#adbecd}}.multi-columns .tabs-bar__link:hover,.multi-columns .tabs-bar__link:focus,.multi-columns .tabs-bar__link:active{background:#adbecd;border-bottom-color:#adbecd}.tabs-bar__link.active{border-bottom:2px solid #2b90d9;color:#2b90d9}.tabs-bar__link span{margin-left:5px;display:none}.tabs-bar__link span.icon{margin-left:0;display:inline}.icon-with-badge{position:relative}.icon-with-badge__badge{position:absolute;left:9px;top:-13px;background:#2b90d9;border:2px solid #c0cdd9;padding:1px 6px;border-radius:6px;font-size:10px;font-weight:500;line-height:14px;color:#000}.column-link--transparent .icon-with-badge__badge{border-color:#f2f5f7}.scrollable{overflow-y:scroll;overflow-x:hidden;flex:1 1 auto;-webkit-overflow-scrolling:touch}.scrollable.optionally-scrollable{overflow-y:auto}@supports(display: grid){.scrollable{contain:strict}}.scrollable--flex{display:flex;flex-direction:column}.scrollable__append{flex:1 1 auto;position:relative;min-height:120px}@supports(display: grid){.scrollable.fullscreen{contain:none}}.react-toggle{display:inline-block;position:relative;cursor:pointer;background-color:transparent;border:0;padding:0;user-select:none;-webkit-tap-highlight-color:rgba(255,255,255,0);-webkit-tap-highlight-color:transparent}.react-toggle-screenreader-only{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.react-toggle--disabled{cursor:not-allowed;opacity:.5;transition:opacity .25s}.react-toggle-track{width:50px;height:24px;padding:0;border-radius:30px;background-color:#d9e1e8;transition:background-color .2s ease}.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track{background-color:#f9fafb}.react-toggle--checked .react-toggle-track{background-color:#2b90d9}.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track{background-color:#2074b1}.react-toggle-track-check{position:absolute;width:14px;height:10px;top:0;bottom:0;margin-top:auto;margin-bottom:auto;line-height:0;left:8px;opacity:0;transition:opacity .25s ease}.react-toggle--checked .react-toggle-track-check{opacity:1;transition:opacity .25s ease}.react-toggle-track-x{position:absolute;width:10px;height:10px;top:0;bottom:0;margin-top:auto;margin-bottom:auto;line-height:0;right:10px;opacity:1;transition:opacity .25s ease}.react-toggle--checked .react-toggle-track-x{opacity:0}.react-toggle-thumb{position:absolute;top:1px;left:1px;width:22px;height:22px;border:1px solid #d9e1e8;border-radius:50%;background-color:#fff;box-sizing:border-box;transition:all .25s ease;transition-property:border-color,left}.react-toggle--checked .react-toggle-thumb{left:27px;border-color:#2b90d9}.getting-started__wrapper,.getting_started,.flex-spacer{background:#d9e1e8}.getting-started__wrapper{position:relative;overflow-y:auto}.flex-spacer{flex:1 1 auto}.getting-started{background:#d9e1e8;flex:1 0 auto}.getting-started p{color:#282c37}.getting-started a{color:#444b5d}.getting-started__panel{height:min-content}.getting-started__panel,.getting-started__footer{padding:10px;padding-top:20px;flex:0 1 auto}.getting-started__panel ul,.getting-started__footer ul{margin-bottom:10px}.getting-started__panel ul li,.getting-started__footer ul li{display:inline}.getting-started__panel p,.getting-started__footer p{color:#444b5d;font-size:13px}.getting-started__panel p a,.getting-started__footer p a{color:#444b5d;text-decoration:underline}.getting-started__panel a,.getting-started__footer a{text-decoration:none;color:#282c37}.getting-started__panel a:hover,.getting-started__panel a:focus,.getting-started__panel a:active,.getting-started__footer a:hover,.getting-started__footer a:focus,.getting-started__footer a:active{text-decoration:underline}.getting-started__trends{flex:0 1 auto;opacity:1;animation:fade 150ms linear;margin-top:10px}.getting-started__trends h4{font-size:12px;text-transform:uppercase;color:#282c37;padding:10px;font-weight:500;border-bottom:1px solid #c0cdd9}@media screen and (max-height: 810px){.getting-started__trends .trends__item:nth-child(3){display:none}}@media screen and (max-height: 720px){.getting-started__trends .trends__item:nth-child(2){display:none}}@media screen and (max-height: 670px){.getting-started__trends{display:none}}.getting-started__trends .trends__item{border-bottom:0;padding:10px}.getting-started__trends .trends__item__current{color:#282c37}.column-link__badge{display:inline-block;border-radius:4px;font-size:12px;line-height:19px;font-weight:500;background:#d9e1e8;padding:4px 8px;margin:-6px 10px}.keyboard-shortcuts{padding:8px 0 0;overflow:hidden}.keyboard-shortcuts thead{position:absolute;left:-9999px}.keyboard-shortcuts td{padding:0 10px 8px}.keyboard-shortcuts kbd{display:inline-block;padding:3px 5px;background-color:#c0cdd9;border:1px solid #e6ebf0}.setting-text{color:#282c37;background:transparent;border:none;border-bottom:2px solid #9baec8;box-sizing:border-box;display:block;font-family:inherit;margin-bottom:10px;padding:7px 0;width:100%}.setting-text:focus,.setting-text:active{color:#000;border-bottom-color:#2b90d9}@media screen and (max-width: 600px){.auto-columns .setting-text,.single-column .setting-text{font-size:16px}}.setting-text.light{color:#000;border-bottom:2px solid #839db4}.setting-text.light:focus,.setting-text.light:active{color:#000;border-bottom-color:#2b90d9}.no-reduce-motion button.icon-button i.fa-retweet{background-position:0 0;height:19px;transition:background-position .9s steps(10);transition-duration:0s;vertical-align:middle;width:22px}.no-reduce-motion button.icon-button i.fa-retweet::before{display:none !important}.no-reduce-motion button.icon-button.active i.fa-retweet{transition-duration:.9s;background-position:0 100%}.reduce-motion button.icon-button i.fa-retweet{color:#606984;transition:color 100ms ease-in}.reduce-motion button.icon-button.active i.fa-retweet{color:#2b90d9}.reduce-motion button.icon-button.disabled i.fa-retweet{color:#828ba4}.load-more{display:block;color:#444b5d;background-color:transparent;border:0;font-size:inherit;text-align:center;line-height:inherit;margin:0;padding:15px;box-sizing:border-box;width:100%;clear:both;text-decoration:none}.load-more:hover{background:#d3dce4}.load-gap{border-bottom:1px solid #c0cdd9}.missing-indicator{padding-top:68px}.scrollable>div>:first-child .notification__dismiss-overlay>.wrappy{border-top:1px solid #d9e1e8}.notification__dismiss-overlay{overflow:hidden;position:absolute;top:0;right:0;bottom:-1px;padding-left:15px;z-index:999;align-items:center;justify-content:flex-end;cursor:pointer;display:flex}.notification__dismiss-overlay .wrappy{width:4rem;align-self:stretch;display:flex;flex-direction:column;align-items:center;justify-content:center;background:#c0cdd9;border-left:1px solid #99afc2;box-shadow:0 0 5px #000;border-bottom:1px solid #d9e1e8}.notification__dismiss-overlay .ckbox{border:2px solid #9baec8;border-radius:2px;width:30px;height:30px;font-size:20px;color:#282c37;text-shadow:0 0 5px #000;display:flex;justify-content:center;align-items:center}.notification__dismiss-overlay:focus{outline:0 !important}.notification__dismiss-overlay:focus .ckbox{box-shadow:0 0 1px 1px #2b90d9}.text-btn{display:inline-block;padding:0;font-family:inherit;font-size:inherit;color:inherit;border:0;background:transparent;cursor:pointer}.loading-indicator{color:#444b5d;font-size:12px;font-weight:400;text-transform:uppercase;overflow:visible;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.loading-indicator span{display:block;float:left;margin-left:50%;transform:translateX(-50%);margin:82px 0 0 50%;white-space:nowrap}.loading-indicator__figure{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);width:42px;height:42px;box-sizing:border-box;background-color:transparent;border:0 solid #86a0b6;border-width:6px;border-radius:50%}.no-reduce-motion .loading-indicator span{animation:loader-label 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1)}.no-reduce-motion .loading-indicator__figure{animation:loader-figure 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1)}@keyframes spring-rotate-in{0%{transform:rotate(0deg)}30%{transform:rotate(-484.8deg)}60%{transform:rotate(-316.7deg)}90%{transform:rotate(-375deg)}100%{transform:rotate(-360deg)}}@keyframes spring-rotate-out{0%{transform:rotate(-360deg)}30%{transform:rotate(124.8deg)}60%{transform:rotate(-43.27deg)}90%{transform:rotate(15deg)}100%{transform:rotate(0deg)}}@keyframes loader-figure{0%{width:0;height:0;background-color:#86a0b6}29%{background-color:#86a0b6}30%{width:42px;height:42px;background-color:transparent;border-width:21px;opacity:1}100%{width:42px;height:42px;border-width:0;opacity:0;background-color:transparent}}@keyframes loader-label{0%{opacity:.25}30%{opacity:1}100%{opacity:.25}}.spoiler-button{top:0;left:0;width:100%;height:100%;position:absolute;z-index:100}.spoiler-button--minified{display:flex;left:4px;top:4px;width:auto;height:auto;align-items:center}.spoiler-button--click-thru{pointer-events:none}.spoiler-button--hidden{display:none}.spoiler-button__overlay{display:block;background:transparent;width:100%;height:100%;border:0}.spoiler-button__overlay__label{display:inline-block;background:rgba(255,255,255,.5);border-radius:8px;padding:8px 12px;color:#000;font-weight:500;font-size:14px}.spoiler-button__overlay:hover .spoiler-button__overlay__label,.spoiler-button__overlay:focus .spoiler-button__overlay__label,.spoiler-button__overlay:active .spoiler-button__overlay__label{background:rgba(255,255,255,.8)}.spoiler-button__overlay:disabled .spoiler-button__overlay__label{background:rgba(255,255,255,.5)}.setting-toggle{display:block;line-height:24px}.setting-toggle__label,.setting-radio__label,.setting-meta__label{color:#282c37;display:inline-block;margin-bottom:14px;margin-left:8px;vertical-align:middle}.setting-radio{display:block;line-height:18px}.setting-radio__label{margin-bottom:0}.column-settings__row legend{color:#282c37;cursor:default;display:block;font-weight:500;margin-top:10px}.setting-radio__input{vertical-align:middle}.setting-meta__label{float:right}@keyframes heartbeat{from{transform:scale(1);transform-origin:center center;animation-timing-function:ease-out}10%{transform:scale(0.91);animation-timing-function:ease-in}17%{transform:scale(0.98);animation-timing-function:ease-out}33%{transform:scale(0.87);animation-timing-function:ease-in}45%{transform:scale(1);animation-timing-function:ease-out}}.pulse-loading{animation:heartbeat 1.5s ease-in-out infinite both}.upload-area{align-items:center;background:rgba(255,255,255,.8);display:flex;height:100%;justify-content:center;left:0;opacity:0;position:absolute;top:0;visibility:hidden;width:100%;z-index:2000}.upload-area *{pointer-events:none}.upload-area__drop{width:320px;height:160px;display:flex;box-sizing:border-box;position:relative;padding:8px}.upload-area__background{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;border-radius:4px;background:#d9e1e8;box-shadow:0 0 5px rgba(0,0,0,.2)}.upload-area__content{flex:1;display:flex;align-items:center;justify-content:center;color:#282c37;font-size:18px;font-weight:500;border:2px dashed #3c5063;border-radius:4px}.dropdown--active .emoji-button img{opacity:1;filter:none}.loading-bar{background-color:#2b90d9;height:3px;position:absolute;top:0;left:0;z-index:9999}.icon-badge-wrapper{position:relative}.icon-badge{position:absolute;display:block;right:-0.25em;top:-0.25em;background-color:#2b90d9;border-radius:50%;font-size:75%;width:1em;height:1em}.conversation{display:flex;border-bottom:1px solid #c0cdd9;padding:5px;padding-bottom:0}.conversation:focus{background:#d3dce4;outline:0}.conversation__avatar{flex:0 0 auto;padding:10px;padding-top:12px;position:relative;cursor:pointer}.conversation__unread{display:inline-block;background:#2b90d9;border-radius:50%;width:.625rem;height:.625rem;margin:-0.1ex .15em .1ex}.conversation__content{flex:1 1 auto;padding:10px 5px;padding-right:15px;overflow:hidden}.conversation__content__info{overflow:hidden;display:flex;flex-direction:row-reverse;justify-content:space-between}.conversation__content__relative-time{font-size:15px;color:#282c37;padding-left:15px}.conversation__content__names{color:#282c37;font-size:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:4px;flex-basis:90px;flex-grow:1}.conversation__content__names a{color:#000;text-decoration:none}.conversation__content__names a:hover,.conversation__content__names a:focus,.conversation__content__names a:active{text-decoration:underline}.conversation__content .status__content{margin:0}.conversation--unread{background:#d3dce4}.conversation--unread:focus{background:#ccd7e0}.conversation--unread .conversation__content__info{font-weight:700}.conversation--unread .conversation__content__relative-time{color:#000}.ui .flash-message{margin-top:10px;margin-left:auto;margin-right:auto;margin-bottom:0;min-width:75%}::-webkit-scrollbar-thumb{border-radius:0}noscript{text-align:center}noscript img{width:200px;opacity:.5;animation:flicker 4s infinite}noscript div{font-size:14px;margin:30px auto;color:#282c37;max-width:400px}noscript div a{color:#2b90d9;text-decoration:underline}noscript div a:hover{text-decoration:none}noscript div a{word-break:break-word}@keyframes flicker{0%{opacity:1}30%{opacity:.75}100%{opacity:1}}button.icon-button i.fa-retweet{background-image:url(\"data:image/svg+xml;utf8,\")}button.icon-button i.fa-retweet:hover{background-image:url(\"data:image/svg+xml;utf8,\")}button.icon-button.disabled i.fa-retweet,button.icon-button.disabled i.fa-retweet:hover{background-image:url(\"data:image/svg+xml;utf8,\")}.status-direct button.icon-button.disabled i.fa-retweet,.status-direct button.icon-button.disabled i.fa-retweet:hover{background-image:url(\"data:image/svg+xml;utf8,\")}.account{padding:10px;border-bottom:1px solid #c0cdd9;color:inherit;text-decoration:none}.account .account__display-name{flex:1 1 auto;display:block;color:#282c37;overflow:hidden;text-decoration:none;font-size:14px}.account.small{border:none;padding:0}.account.small>.account__avatar-wrapper{margin:0 8px 0 0}.account.small>.display-name{height:24px;line-height:24px}.account__wrapper{display:flex}.account__avatar-wrapper{float:left;margin-left:12px;margin-right:12px}.account__avatar{border-radius:8%;background-position:50%;background-clip:padding-box;position:relative;cursor:pointer}.account__avatar-inline{display:inline-block;vertical-align:middle;margin-right:5px}.account__avatar-composite{border-radius:8%;background-position:50%;background-clip:padding-box;overflow:hidden;position:relative}.account__avatar-composite div{border-radius:8%;background-position:50%;background-clip:padding-box;float:left;position:relative;box-sizing:border-box}.account__avatar-composite__label{display:block;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);color:#000;text-shadow:1px 1px 2px #000;font-weight:700;font-size:15px}.account__avatar-overlay{position:relative;width:48px;height:48px;background-size:48px 48px}.account__avatar-overlay-base{border-radius:8%;background-position:50%;background-clip:padding-box;width:36px;height:36px;background-size:36px 36px}.account__avatar-overlay-overlay{border-radius:8%;background-position:50%;background-clip:padding-box;width:24px;height:24px;background-size:24px 24px;position:absolute;bottom:0;right:0;z-index:1}.account__relationship{height:18px;padding:10px;white-space:nowrap}.account__header__wrapper{flex:0 0 auto;background:#ccd7e0}.account__disclaimer{padding:10px;color:#444b5d}.account__disclaimer strong{font-weight:500}.account__disclaimer strong:lang(ja){font-weight:700}.account__disclaimer strong:lang(ko){font-weight:700}.account__disclaimer strong:lang(zh-CN){font-weight:700}.account__disclaimer strong:lang(zh-HK){font-weight:700}.account__disclaimer strong:lang(zh-TW){font-weight:700}.account__disclaimer a{font-weight:500;color:inherit;text-decoration:underline}.account__disclaimer a:hover,.account__disclaimer a:focus,.account__disclaimer a:active{text-decoration:none}.account__action-bar{border-top:1px solid #c0cdd9;border-bottom:1px solid #c0cdd9;line-height:36px;overflow:hidden;flex:0 0 auto;display:flex}.account__action-bar-links{display:flex;flex:1 1 auto;line-height:18px;text-align:center}.account__action-bar__tab{text-decoration:none;overflow:hidden;flex:0 1 100%;border-left:1px solid #c0cdd9;padding:10px 0;border-bottom:4px solid transparent}.account__action-bar__tab:first-child{border-left:0}.account__action-bar__tab.active{border-bottom:4px solid #2b90d9}.account__action-bar__tab>span{display:block;text-transform:uppercase;font-size:11px;color:#282c37}.account__action-bar__tab strong{display:block;font-size:15px;font-weight:500;color:#000}.account__action-bar__tab strong:lang(ja){font-weight:700}.account__action-bar__tab strong:lang(ko){font-weight:700}.account__action-bar__tab strong:lang(zh-CN){font-weight:700}.account__action-bar__tab strong:lang(zh-HK){font-weight:700}.account__action-bar__tab strong:lang(zh-TW){font-weight:700}.account__action-bar__tab abbr{color:#2b90d9}.account-authorize{padding:14px 10px}.account-authorize .detailed-status__display-name{display:block;margin-bottom:15px;overflow:hidden}.account-authorize__avatar{float:left;margin-right:10px}.notification__message{margin-left:42px;padding:8px 0 0 26px;cursor:default;color:#282c37;font-size:15px;position:relative}.notification__message .fa{color:#2b90d9}.notification__message>span{display:block;overflow:hidden;text-overflow:ellipsis}.account--panel{background:#ccd7e0;border-top:1px solid #c0cdd9;border-bottom:1px solid #c0cdd9;display:flex;flex-direction:row;padding:10px 0}.account--panel__button,.detailed-status__button{flex:1 1 auto;text-align:center}.column-settings__outer{background:#c0cdd9;padding:15px}.column-settings__section{color:#282c37;cursor:default;display:block;font-weight:500;margin-bottom:10px}.column-settings__hashtags .column-settings__row{margin-bottom:15px}.column-settings__hashtags .column-select__control{outline:0;box-sizing:border-box;width:100%;border:none;box-shadow:none;font-family:inherit;background:#d9e1e8;color:#282c37;font-size:14px;margin:0}.column-settings__hashtags .column-select__control::placeholder{color:#1f232b}.column-settings__hashtags .column-select__control::-moz-focus-inner{border:0}.column-settings__hashtags .column-select__control::-moz-focus-inner,.column-settings__hashtags .column-select__control:focus,.column-settings__hashtags .column-select__control:active{outline:0 !important}.column-settings__hashtags .column-select__control:focus{background:#ccd7e0}@media screen and (max-width: 600px){.column-settings__hashtags .column-select__control{font-size:16px}}.column-settings__hashtags .column-select__placeholder{color:#444b5d;padding-left:2px;font-size:12px}.column-settings__hashtags .column-select__value-container{padding-left:6px}.column-settings__hashtags .column-select__multi-value{background:#c0cdd9}.column-settings__hashtags .column-select__multi-value__remove{cursor:pointer}.column-settings__hashtags .column-select__multi-value__remove:hover,.column-settings__hashtags .column-select__multi-value__remove:active,.column-settings__hashtags .column-select__multi-value__remove:focus{background:#b3c3d1;color:#1f232b}.column-settings__hashtags .column-select__multi-value__label,.column-settings__hashtags .column-select__input{color:#282c37}.column-settings__hashtags .column-select__clear-indicator,.column-settings__hashtags .column-select__dropdown-indicator{cursor:pointer;transition:none;color:#444b5d}.column-settings__hashtags .column-select__clear-indicator:hover,.column-settings__hashtags .column-select__clear-indicator:active,.column-settings__hashtags .column-select__clear-indicator:focus,.column-settings__hashtags .column-select__dropdown-indicator:hover,.column-settings__hashtags .column-select__dropdown-indicator:active,.column-settings__hashtags .column-select__dropdown-indicator:focus{color:#3b4151}.column-settings__hashtags .column-select__indicator-separator{background-color:#c0cdd9}.column-settings__hashtags .column-select__menu{background:#fff;border-radius:4px;padding:10px 14px;padding-bottom:14px;margin-top:10px;color:#444b5d;box-shadow:2px 4px 15px rgba(0,0,0,.4);padding:0;background:#282c37}.column-settings__hashtags .column-select__menu h4{text-transform:uppercase;color:#444b5d;font-size:13px;font-weight:500;margin-bottom:10px}.column-settings__hashtags .column-select__menu li{padding:4px 0}.column-settings__hashtags .column-select__menu ul{margin-bottom:10px}.column-settings__hashtags .column-select__menu em{font-weight:500;color:#000}.column-settings__hashtags .column-select__menu-list{padding:6px}.column-settings__hashtags .column-select__option{color:#000;border-radius:4px;font-size:14px}.column-settings__hashtags .column-select__option--is-focused,.column-settings__hashtags .column-select__option--is-selected{background:#3d4455}.column-settings__row .text-btn{margin-bottom:15px}.relationship-tag{color:#000;margin-bottom:4px;display:block;vertical-align:top;background-color:#fff;text-transform:uppercase;font-size:11px;font-weight:500;padding:4px;border-radius:4px;opacity:.7}.relationship-tag:hover{opacity:1}.account-gallery__container{display:flex;flex-wrap:wrap;padding:4px 2px}.account-gallery__item{border:none;box-sizing:border-box;display:block;position:relative;border-radius:4px;overflow:hidden;margin:2px}.account-gallery__item__icons{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);font-size:24px}.notification__filter-bar,.account__section-headline{background:#e6ebf0;border-bottom:1px solid #c0cdd9;cursor:default;display:flex;flex-shrink:0}.notification__filter-bar button,.account__section-headline button{background:#e6ebf0;border:0;margin:0}.notification__filter-bar button,.notification__filter-bar a,.account__section-headline button,.account__section-headline a{display:block;flex:1 1 auto;color:#282c37;padding:15px 0;font-size:14px;font-weight:500;text-align:center;text-decoration:none;position:relative}.notification__filter-bar button.active,.notification__filter-bar a.active,.account__section-headline button.active,.account__section-headline a.active{color:#282c37}.notification__filter-bar button.active::before,.notification__filter-bar button.active::after,.notification__filter-bar a.active::before,.notification__filter-bar a.active::after,.account__section-headline button.active::before,.account__section-headline button.active::after,.account__section-headline a.active::before,.account__section-headline a.active::after{display:block;content:\"\";position:absolute;bottom:0;left:50%;width:0;height:0;transform:translateX(-50%);border-style:solid;border-width:0 10px 10px;border-color:transparent transparent #c0cdd9}.notification__filter-bar button.active::after,.notification__filter-bar a.active::after,.account__section-headline button.active::after,.account__section-headline a.active::after{bottom:-1px;border-color:transparent transparent #d9e1e8}.notification__filter-bar.directory__section-headline,.account__section-headline.directory__section-headline{background:#dfe6ec;border-bottom-color:transparent}.notification__filter-bar.directory__section-headline a.active::before,.notification__filter-bar.directory__section-headline button.active::before,.account__section-headline.directory__section-headline a.active::before,.account__section-headline.directory__section-headline button.active::before{display:none}.notification__filter-bar.directory__section-headline a.active::after,.notification__filter-bar.directory__section-headline button.active::after,.account__section-headline.directory__section-headline a.active::after,.account__section-headline.directory__section-headline button.active::after{border-color:transparent transparent #eff3f5}.account__moved-note{padding:14px 10px;padding-bottom:16px;background:#ccd7e0;border-top:1px solid #c0cdd9;border-bottom:1px solid #c0cdd9}.account__moved-note__message{position:relative;margin-left:58px;color:#444b5d;padding:8px 0;padding-top:0;padding-bottom:4px;font-size:14px}.account__moved-note__message>span{display:block;overflow:hidden;text-overflow:ellipsis}.account__moved-note__icon-wrapper{left:-26px;position:absolute}.account__moved-note .detailed-status__display-avatar{position:relative}.account__moved-note .detailed-status__display-name{margin-bottom:0}.account__header__content{color:#282c37;font-size:14px;font-weight:400;overflow:hidden;word-break:normal;word-wrap:break-word}.account__header__content p{margin-bottom:20px}.account__header__content p:last-child{margin-bottom:0}.account__header__content a{color:inherit;text-decoration:underline}.account__header__content a:hover{text-decoration:none}.account__header{overflow:hidden}.account__header.inactive{opacity:.5}.account__header.inactive .account__header__image,.account__header.inactive .account__avatar{filter:grayscale(100%)}.account__header__info{position:absolute;top:10px;left:10px}.account__header__image{overflow:hidden;height:145px;position:relative;background:#e6ebf0}.account__header__image img{object-fit:cover;display:block;width:100%;height:100%;margin:0}.account__header__bar{position:relative;background:#ccd7e0;padding:5px;border-bottom:1px solid #b3c3d1}.account__header__bar .avatar{display:block;flex:0 0 auto;width:94px;margin-left:-2px}.account__header__bar .avatar .account__avatar{background:#f2f5f7;border:2px solid #ccd7e0}.account__header__tabs{display:flex;align-items:flex-start;padding:7px 5px;margin-top:-55px}.account__header__tabs__buttons{display:flex;align-items:center;padding-top:55px;overflow:hidden}.account__header__tabs__buttons .icon-button{border:1px solid #b3c3d1;border-radius:4px;box-sizing:content-box;padding:2px}.account__header__tabs__buttons .button{margin:0 8px}.account__header__tabs__name{padding:5px}.account__header__tabs__name .account-role{vertical-align:top}.account__header__tabs__name .emojione{width:22px;height:22px}.account__header__tabs__name h1{font-size:16px;line-height:24px;color:#000;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.account__header__tabs__name h1 small{display:block;font-size:14px;color:#282c37;font-weight:400;overflow:hidden;text-overflow:ellipsis}.account__header__tabs .spacer{flex:1 1 auto}.account__header__bio{overflow:hidden;margin:0 -5px}.account__header__bio .account__header__content{padding:20px 15px;padding-bottom:5px;color:#000}.account__header__bio .account__header__fields{margin:0;border-top:1px solid #b3c3d1}.account__header__bio .account__header__fields a{color:#217aba}.account__header__bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.account__header__bio .account__header__fields .verified a{color:#79bd9a}.account__header__extra{margin-top:4px}.account__header__extra__links{font-size:14px;color:#282c37;padding:10px 0}.account__header__extra__links a{display:inline-block;color:#282c37;text-decoration:none;padding:5px 10px;font-weight:500}.account__header__extra__links a strong{font-weight:700;color:#000}.domain{padding:10px;border-bottom:1px solid #c0cdd9}.domain .domain__domain-name{flex:1 1 auto;display:block;color:#000;text-decoration:none;font-size:14px;font-weight:500}.domain__wrapper{display:flex}.domain_buttons{height:18px;padding:10px;white-space:nowrap}@keyframes spring-flip-in{0%{transform:rotate(0deg)}30%{transform:rotate(-242.4deg)}60%{transform:rotate(-158.35deg)}90%{transform:rotate(-187.5deg)}100%{transform:rotate(-180deg)}}@keyframes spring-flip-out{0%{transform:rotate(-180deg)}30%{transform:rotate(62.4deg)}60%{transform:rotate(-21.635deg)}90%{transform:rotate(7.5deg)}100%{transform:rotate(0deg)}}.status__content--with-action{cursor:pointer}.status__content{position:relative;margin:10px 0;font-size:15px;line-height:20px;word-wrap:break-word;font-weight:400;overflow:visible;padding-top:5px}.status__content:focus{outline:0}.status__content .emojione{width:20px;height:20px;margin:-3px 0 0}.status__content img{max-width:100%;max-height:400px;object-fit:contain}.status__content p,.status__content pre,.status__content blockquote{margin-bottom:20px;white-space:pre-wrap}.status__content p:last-child,.status__content pre:last-child,.status__content blockquote:last-child{margin-bottom:0}.status__content .status__content__text,.status__content .e-content{overflow:hidden}.status__content .status__content__text>ul,.status__content .status__content__text>ol,.status__content .e-content>ul,.status__content .e-content>ol{margin-bottom:20px}.status__content .status__content__text h1,.status__content .status__content__text h2,.status__content .status__content__text h3,.status__content .status__content__text h4,.status__content .status__content__text h5,.status__content .e-content h1,.status__content .e-content h2,.status__content .e-content h3,.status__content .e-content h4,.status__content .e-content h5{margin-top:20px;margin-bottom:20px}.status__content .status__content__text h1,.status__content .status__content__text h2,.status__content .e-content h1,.status__content .e-content h2{font-weight:700;font-size:1.2em}.status__content .status__content__text h2,.status__content .e-content h2{font-size:1.1em}.status__content .status__content__text h3,.status__content .status__content__text h4,.status__content .status__content__text h5,.status__content .e-content h3,.status__content .e-content h4,.status__content .e-content h5{font-weight:500}.status__content .status__content__text blockquote,.status__content .e-content blockquote{padding-left:10px;border-left:3px solid #282c37;color:#282c37;white-space:normal}.status__content .status__content__text blockquote p:last-child,.status__content .e-content blockquote p:last-child{margin-bottom:0}.status__content .status__content__text b,.status__content .status__content__text strong,.status__content .e-content b,.status__content .e-content strong{font-weight:700}.status__content .status__content__text em,.status__content .status__content__text i,.status__content .e-content em,.status__content .e-content i{font-style:italic}.status__content .status__content__text sub,.status__content .e-content sub{font-size:smaller;text-align:sub}.status__content .status__content__text sup,.status__content .e-content sup{font-size:smaller;vertical-align:super}.status__content .status__content__text ul,.status__content .status__content__text ol,.status__content .e-content ul,.status__content .e-content ol{margin-left:1em}.status__content .status__content__text ul p,.status__content .status__content__text ol p,.status__content .e-content ul p,.status__content .e-content ol p{margin:0}.status__content .status__content__text ul,.status__content .e-content ul{list-style-type:disc}.status__content .status__content__text ol,.status__content .e-content ol{list-style-type:decimal}.status__content a{color:#d8a070;text-decoration:none}.status__content a:hover{text-decoration:underline}.status__content a:hover .fa{color:#353a48}.status__content a.mention:hover{text-decoration:none}.status__content a.mention:hover span{text-decoration:underline}.status__content a .fa{color:#444b5d}.status__content .status__content__spoiler{display:none}.status__content .status__content__spoiler.status__content__spoiler--visible{display:block}.status__content a.unhandled-link{color:#217aba}.status__content a.unhandled-link .link-origin-tag{color:#ca8f04;font-size:.8em}.status__content .status__content__spoiler-link{background:#7a96ae}.status__content .status__content__spoiler-link:hover{background:#708ea9;text-decoration:none}.status__content__spoiler-link{display:inline-block;border-radius:2px;background:#7a96ae;border:none;color:#000;font-weight:500;font-size:11px;padding:0 5px;text-transform:uppercase;line-height:inherit;cursor:pointer;vertical-align:bottom}.status__content__spoiler-link:hover{background:#708ea9;text-decoration:none}.status__content__spoiler-link .status__content__spoiler-icon{display:inline-block;margin:0 0 0 5px;border-left:1px solid currentColor;padding:0 0 0 4px;font-size:16px;vertical-align:-2px}.notif-cleaning .status,.notif-cleaning .notification-follow,.notif-cleaning .notification-follow-request{padding-right:4.5rem}.status__wrapper--filtered{color:#444b5d;border:0;font-size:inherit;text-align:center;line-height:inherit;margin:0;padding:15px;box-sizing:border-box;width:100%;clear:both;border-bottom:1px solid #c0cdd9}.status__prepend-icon-wrapper{left:-26px;position:absolute}.notification-follow,.notification-follow-request{position:relative;border-bottom:1px solid #c0cdd9}.notification-follow .account,.notification-follow-request .account{border-bottom:0 none}.focusable:focus{outline:0;background:#ccd7e0}.focusable:focus.status.status-direct:not(.read){background:#b3c3d1}.focusable:focus.status.status-direct:not(.read).muted{background:transparent}.focusable:focus .detailed-status,.focusable:focus .detailed-status__action-bar{background:#c0cdd9}.status{padding:10px 14px;position:relative;height:auto;border-bottom:1px solid #c0cdd9;cursor:default;opacity:1;animation:fade 150ms linear}@supports(-ms-overflow-style: -ms-autohiding-scrollbar){.status{padding-right:28px}}@keyframes fade{0%{opacity:0}100%{opacity:1}}.status .video-player,.status .audio-player{margin-top:8px}.status.status-direct:not(.read){background:#c0cdd9;border-bottom-color:#b3c3d1}.status.light .status__relative-time{color:#282c37}.status.light .status__display-name{color:#000}.status.light .display-name{color:#444b5d}.status.light .display-name strong{color:#000}.status.light .status__content{color:#000}.status.light .status__content a{color:#2b90d9}.status.light .status__content a.status__content__spoiler-link{color:#000;background:#9baec8}.status.light .status__content a.status__content__spoiler-link:hover{background:#8199ba}.status.collapsed{background-position:center;background-size:cover;user-select:none}.status.collapsed.has-background::before{display:block;position:absolute;left:0;right:0;top:0;bottom:0;background-image:linear-gradient(to bottom, rgba(0, 0, 0, 0.75), rgba(0, 0, 0, 0.65) 24px, rgba(0, 0, 0, 0.8));pointer-events:none;content:\"\"}.status.collapsed .display-name:hover .display-name__html{text-decoration:none}.status.collapsed .status__content{height:20px;overflow:hidden;text-overflow:ellipsis;padding-top:0}.status.collapsed .status__content:after{content:\"\";position:absolute;top:0;bottom:0;left:0;right:0;background:linear-gradient(rgba(217, 225, 232, 0), #d9e1e8);pointer-events:none}.status.collapsed .status__content a:hover{text-decoration:none}.status.collapsed:focus>.status__content:after{background:linear-gradient(rgba(204, 215, 224, 0), #ccd7e0)}.status.collapsed.status-direct:not(.read)>.status__content:after{background:linear-gradient(rgba(192, 205, 217, 0), #c0cdd9)}.status.collapsed .notification__message{margin-bottom:0}.status.collapsed .status__info .notification__message>span{white-space:nowrap}.status .notification__message{margin:-10px 0px 10px 0}.notification-favourite .status.status-direct{background:transparent}.notification-favourite .status.status-direct .icon-button.disabled{color:#444a5e}.status__relative-time{display:inline-block;flex-grow:1;color:#444b5d;font-size:14px;text-align:right;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.status__display-name{color:#444b5d;overflow:hidden}.status__info__account .status__display-name{display:block;max-width:100%}.status__info{display:flex;justify-content:space-between;font-size:15px}.status__info>span{text-overflow:ellipsis;overflow:hidden}.status__info .notification__message>span{word-wrap:break-word}.status__info__icons{display:flex;align-items:center;height:1em;color:#606984}.status__info__icons .status__media-icon,.status__info__icons .status__visibility-icon,.status__info__icons .status__reply-icon{padding-left:2px;padding-right:2px}.status__info__icons .status__collapse-button.active>.fa-angle-double-up{transform:rotate(-180deg)}.no-reduce-motion .status__collapse-button.activate>.fa-angle-double-up{animation:spring-flip-in 1s linear}.no-reduce-motion .status__collapse-button.deactivate>.fa-angle-double-up{animation:spring-flip-out 1s linear}.status__info__account{display:flex;align-items:center;justify-content:flex-start}.status-check-box{border-bottom:1px solid #282c37;display:flex}.status-check-box .status-check-box__status{margin:10px 0 10px 10px;flex:1;overflow:hidden}.status-check-box .status-check-box__status .media-gallery{max-width:250px}.status-check-box .status-check-box__status .status__content{padding:0;white-space:normal}.status-check-box .status-check-box__status .video-player,.status-check-box .status-check-box__status .audio-player{margin-top:8px;max-width:250px}.status-check-box .status-check-box__status .media-gallery__item-thumbnail{cursor:default}.status-check-box-toggle{align-items:center;display:flex;flex:0 0 auto;justify-content:center;padding:10px}.status__prepend{margin-top:-10px;margin-bottom:10px;margin-left:58px;color:#444b5d;padding:8px 0;padding-bottom:2px;font-size:14px;position:relative}.status__prepend .status__display-name strong{color:#444b5d}.status__prepend>span{display:block;overflow:hidden;text-overflow:ellipsis}.status__action-bar{align-items:center;display:flex;margin-top:8px}.status__action-bar__counter{display:inline-flex;margin-right:11px;align-items:center}.status__action-bar__counter .status__action-bar-button{margin-right:4px}.status__action-bar__counter__label{display:inline-block;width:14px;font-size:12px;font-weight:500;color:#606984}.status__action-bar-button{margin-right:18px}.status__action-bar-dropdown{height:23.15px;width:23.15px}.detailed-status__action-bar-dropdown{flex:1 1 auto;display:flex;align-items:center;justify-content:center;position:relative}.detailed-status{background:#ccd7e0;padding:14px 10px}.detailed-status--flex{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-start}.detailed-status--flex .status__content,.detailed-status--flex .detailed-status__meta{flex:100%}.detailed-status .status__content{font-size:19px;line-height:24px}.detailed-status .status__content .emojione{width:24px;height:24px;margin:-1px 0 0}.detailed-status .video-player,.detailed-status .audio-player{margin-top:8px}.detailed-status__meta{margin-top:15px;color:#444b5d;font-size:14px;line-height:18px}.detailed-status__action-bar{background:#ccd7e0;border-top:1px solid #c0cdd9;border-bottom:1px solid #c0cdd9;display:flex;flex-direction:row;padding:10px 0}.detailed-status__link{color:inherit;text-decoration:none}.detailed-status__favorites,.detailed-status__reblogs{display:inline-block;font-weight:500;font-size:12px;margin-left:6px}.status__display-name,.status__relative-time,.detailed-status__display-name,.detailed-status__datetime,.detailed-status__application,.account__display-name{text-decoration:none}.status__display-name strong,.account__display-name strong{color:#000}.muted .emojione{opacity:.5}a.status__display-name:hover strong,.reply-indicator__display-name:hover strong,.detailed-status__display-name:hover strong,.account__display-name:hover strong{text-decoration:underline}.account__display-name strong{display:block;overflow:hidden;text-overflow:ellipsis}.detailed-status__application,.detailed-status__datetime{color:inherit}.detailed-status .button.logo-button{margin-bottom:15px}.detailed-status__display-name{color:#282c37;display:block;line-height:24px;margin-bottom:15px;overflow:hidden}.detailed-status__display-name strong,.detailed-status__display-name span{display:block;text-overflow:ellipsis;overflow:hidden}.detailed-status__display-name strong{font-size:16px;color:#000}.detailed-status__display-avatar{float:left;margin-right:10px}.status__avatar{flex:none;margin:0 10px 0 0;height:48px;width:48px}.muted .status__content,.muted .status__content p,.muted .status__content a,.muted .status__content__text{color:#444b5d}.muted .status__display-name strong{color:#444b5d}.muted .status__avatar{opacity:.5}.muted a.status__content__spoiler-link{background:#3c5063;color:#000}.muted a.status__content__spoiler-link:hover{background:#7d98b0;text-decoration:none}.status__relative-time:hover,.detailed-status__datetime:hover{text-decoration:underline}.status-card{display:flex;font-size:14px;border:1px solid #c0cdd9;border-radius:4px;color:#444b5d;margin-top:14px;text-decoration:none;overflow:hidden}.status-card__actions{bottom:0;left:0;position:absolute;right:0;top:0;display:flex;justify-content:center;align-items:center}.status-card__actions>div{background:rgba(0,0,0,.6);border-radius:8px;padding:12px 9px;flex:0 0 auto;display:flex;justify-content:center;align-items:center}.status-card__actions button,.status-card__actions a{display:inline;color:#282c37;background:transparent;border:0;padding:0 8px;text-decoration:none;font-size:18px;line-height:18px}.status-card__actions button:hover,.status-card__actions button:active,.status-card__actions button:focus,.status-card__actions a:hover,.status-card__actions a:active,.status-card__actions a:focus{color:#000}.status-card__actions a{font-size:19px;position:relative;bottom:-1px}.status-card__actions a .fa,.status-card__actions a:hover .fa{color:inherit}a.status-card{cursor:pointer}a.status-card:hover{background:#c0cdd9}.status-card-photo{cursor:zoom-in;display:block;text-decoration:none;width:100%;height:auto;margin:0}.status-card-video iframe{width:100%;height:100%}.status-card__title{display:block;font-weight:500;margin-bottom:5px;color:#282c37;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-decoration:none}.status-card__content{flex:1 1 auto;overflow:hidden;padding:14px 14px 14px 8px}.status-card__description{color:#282c37}.status-card__host{display:block;margin-top:5px;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-card__image{flex:0 0 100px;background:#c0cdd9;position:relative}.status-card__image>.fa{font-size:21px;position:absolute;transform-origin:50% 50%;top:50%;left:50%;transform:translate(-50%, -50%)}.status-card.horizontal{display:block}.status-card.horizontal .status-card__image{width:100%}.status-card.horizontal .status-card__image-image{border-radius:4px 4px 0 0}.status-card.horizontal .status-card__title{white-space:inherit}.status-card.compact{border-color:#ccd7e0}.status-card.compact.interactive{border:0}.status-card.compact .status-card__content{padding:8px;padding-top:10px}.status-card.compact .status-card__title{white-space:nowrap}.status-card.compact .status-card__image{flex:0 0 60px}a.status-card.compact:hover{background-color:#ccd7e0}.status-card__image-image{border-radius:4px 0 0 4px;display:block;margin:0;width:100%;height:100%;object-fit:cover;background-size:cover;background-position:center center}.attachment-list{display:flex;font-size:14px;border:1px solid #c0cdd9;border-radius:4px;margin-top:14px;overflow:hidden}.attachment-list__icon{flex:0 0 auto;color:#444b5d;padding:8px 18px;cursor:default;border-right:1px solid #c0cdd9;display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:26px}.attachment-list__icon .fa{display:block}.attachment-list__list{list-style:none;padding:4px 0;padding-left:8px;display:flex;flex-direction:column;justify-content:center}.attachment-list__list li{display:block;padding:4px 0}.attachment-list__list a{text-decoration:none;color:#444b5d;font-weight:500}.attachment-list__list a:hover{text-decoration:underline}.attachment-list.compact{border:0;margin-top:4px}.attachment-list.compact .attachment-list__list{padding:0;display:block}.attachment-list.compact .fa{color:#444b5d}.status__wrapper--filtered__button{display:inline;color:#217aba;border:0;background:transparent;padding:0;font-size:inherit;line-height:inherit}.status__wrapper--filtered__button:hover,.status__wrapper--filtered__button:active{text-decoration:underline}.modal-container--preloader{background:#c0cdd9}.modal-root{position:relative;transition:opacity .3s linear;will-change:opacity;z-index:9999}.modal-root__overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(255,255,255,.7)}.modal-root__container{position:fixed;top:0;left:0;width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;align-content:space-around;z-index:9999;pointer-events:none;user-select:none}.modal-root__modal{pointer-events:auto;display:flex;z-index:9999}.onboarding-modal,.error-modal,.embed-modal{background:#282c37;color:#000;border-radius:8px;overflow:hidden;display:flex;flex-direction:column}.onboarding-modal__pager{height:80vh;width:80vw;max-width:520px;max-height:470px}.onboarding-modal__pager .react-swipeable-view-container>div{width:100%;height:100%;box-sizing:border-box;display:none;flex-direction:column;align-items:center;justify-content:center;display:flex;user-select:text}.error-modal__body{height:80vh;width:80vw;max-width:520px;max-height:420px;position:relative}.error-modal__body>div{position:absolute;top:0;left:0;width:100%;height:100%;box-sizing:border-box;padding:25px;display:none;flex-direction:column;align-items:center;justify-content:center;display:flex;opacity:0;user-select:text}.error-modal__body{display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center}@media screen and (max-width: 550px){.onboarding-modal{width:100%;height:100%;border-radius:0}.onboarding-modal__pager{width:100%;height:auto;max-width:none;max-height:none;flex:1 1 auto}}.onboarding-modal__paginator,.error-modal__footer{flex:0 0 auto;background:#393f4f;display:flex;padding:25px}.onboarding-modal__paginator>div,.error-modal__footer>div{min-width:33px}.onboarding-modal__paginator .onboarding-modal__nav,.onboarding-modal__paginator .error-modal__nav,.error-modal__footer .onboarding-modal__nav,.error-modal__footer .error-modal__nav{color:#282c37;border:0;font-size:14px;font-weight:500;padding:10px 25px;line-height:inherit;height:auto;margin:-10px;border-radius:4px;background-color:transparent}.onboarding-modal__paginator .onboarding-modal__nav:hover,.onboarding-modal__paginator .onboarding-modal__nav:focus,.onboarding-modal__paginator .onboarding-modal__nav:active,.onboarding-modal__paginator .error-modal__nav:hover,.onboarding-modal__paginator .error-modal__nav:focus,.onboarding-modal__paginator .error-modal__nav:active,.error-modal__footer .onboarding-modal__nav:hover,.error-modal__footer .onboarding-modal__nav:focus,.error-modal__footer .onboarding-modal__nav:active,.error-modal__footer .error-modal__nav:hover,.error-modal__footer .error-modal__nav:focus,.error-modal__footer .error-modal__nav:active{color:#313543;background-color:#4a5266}.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next,.error-modal__footer .error-modal__nav.onboarding-modal__done,.error-modal__footer .error-modal__nav.onboarding-modal__next{color:#000}.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:hover,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:focus,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:active,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:hover,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:focus,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:active,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:hover,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:focus,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:active,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:hover,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:focus,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:active,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:hover,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:focus,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:active,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:hover,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:focus,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:active,.error-modal__footer .error-modal__nav.onboarding-modal__done:hover,.error-modal__footer .error-modal__nav.onboarding-modal__done:focus,.error-modal__footer .error-modal__nav.onboarding-modal__done:active,.error-modal__footer .error-modal__nav.onboarding-modal__next:hover,.error-modal__footer .error-modal__nav.onboarding-modal__next:focus,.error-modal__footer .error-modal__nav.onboarding-modal__next:active{color:#000}.error-modal__footer{justify-content:center}.onboarding-modal__dots{flex:1 1 auto;display:flex;align-items:center;justify-content:center}.onboarding-modal__dot{width:14px;height:14px;border-radius:14px;background:#4a5266;margin:0 3px;cursor:pointer}.onboarding-modal__dot:hover{background:#4f576c}.onboarding-modal__dot.active{cursor:default;background:#5c657e}.onboarding-modal__page__wrapper{pointer-events:none;padding:25px;padding-bottom:0}.onboarding-modal__page__wrapper.onboarding-modal__page__wrapper--active{pointer-events:auto}.onboarding-modal__page{cursor:default;line-height:21px}.onboarding-modal__page h1{font-size:18px;font-weight:500;color:#000;margin-bottom:20px}.onboarding-modal__page a{color:#2b90d9}.onboarding-modal__page a:hover,.onboarding-modal__page a:focus,.onboarding-modal__page a:active{color:#2485cb}.onboarding-modal__page .navigation-bar a{color:inherit}.onboarding-modal__page p{font-size:16px;color:#282c37;margin-top:10px;margin-bottom:10px}.onboarding-modal__page p:last-child{margin-bottom:0}.onboarding-modal__page p strong{font-weight:500;background:#d9e1e8;color:#282c37;border-radius:4px;font-size:14px;padding:3px 6px}.onboarding-modal__page p strong:lang(ja){font-weight:700}.onboarding-modal__page p strong:lang(ko){font-weight:700}.onboarding-modal__page p strong:lang(zh-CN){font-weight:700}.onboarding-modal__page p strong:lang(zh-HK){font-weight:700}.onboarding-modal__page p strong:lang(zh-TW){font-weight:700}.onboarding-modal__page__wrapper-0{height:100%;padding:0}.onboarding-modal__page-one__lead{padding:65px;padding-top:45px;padding-bottom:0;margin-bottom:10px}.onboarding-modal__page-one__lead h1{font-size:26px;line-height:36px;margin-bottom:8px}.onboarding-modal__page-one__lead p{margin-bottom:0}.onboarding-modal__page-one__extra{padding-right:65px;padding-left:185px;text-align:center}.display-case{text-align:center;font-size:15px;margin-bottom:15px}.display-case__label{font-weight:500;color:#000;margin-bottom:5px;text-transform:uppercase;font-size:12px}.display-case__case{background:#d9e1e8;color:#282c37;font-weight:500;padding:10px;border-radius:4px}.onboarding-modal__page-two p,.onboarding-modal__page-three p,.onboarding-modal__page-four p,.onboarding-modal__page-five p{text-align:left}.onboarding-modal__page-two .figure,.onboarding-modal__page-three .figure,.onboarding-modal__page-four .figure,.onboarding-modal__page-five .figure{background:#f2f5f7;color:#282c37;margin-bottom:20px;border-radius:4px;padding:10px;text-align:center;font-size:14px;box-shadow:1px 2px 6px rgba(0,0,0,.3)}.onboarding-modal__page-two .figure .onboarding-modal__image,.onboarding-modal__page-three .figure .onboarding-modal__image,.onboarding-modal__page-four .figure .onboarding-modal__image,.onboarding-modal__page-five .figure .onboarding-modal__image{border-radius:4px;margin-bottom:10px}.onboarding-modal__page-two .figure.non-interactive,.onboarding-modal__page-three .figure.non-interactive,.onboarding-modal__page-four .figure.non-interactive,.onboarding-modal__page-five .figure.non-interactive{pointer-events:none;text-align:left}.onboarding-modal__page-four__columns .row{display:flex;margin-bottom:20px}.onboarding-modal__page-four__columns .row>div{flex:1 1 0;margin:0 10px}.onboarding-modal__page-four__columns .row>div:first-child{margin-left:0}.onboarding-modal__page-four__columns .row>div:last-child{margin-right:0}.onboarding-modal__page-four__columns .row>div p{text-align:center}.onboarding-modal__page-four__columns .row:last-child{margin-bottom:0}.onboarding-modal__page-four__columns .column-header{color:#000}@media screen and (max-width: 320px)and (max-height: 600px){.onboarding-modal__page p{font-size:14px;line-height:20px}.onboarding-modal__page-two .figure,.onboarding-modal__page-three .figure,.onboarding-modal__page-four .figure,.onboarding-modal__page-five .figure{font-size:12px;margin-bottom:10px}.onboarding-modal__page-four__columns .row{margin-bottom:10px}.onboarding-modal__page-four__columns .column-header{padding:5px;font-size:12px}}.onboard-sliders{display:inline-block;max-width:30px;max-height:auto;margin-left:10px}.boost-modal,.doodle-modal,.favourite-modal,.confirmation-modal,.report-modal,.actions-modal,.mute-modal,.block-modal{background:#17191f;color:#000;border-radius:8px;overflow:hidden;max-width:90vw;width:480px;position:relative;flex-direction:column}.boost-modal .status__relative-time,.doodle-modal .status__relative-time,.favourite-modal .status__relative-time,.confirmation-modal .status__relative-time,.report-modal .status__relative-time,.actions-modal .status__relative-time,.mute-modal .status__relative-time,.block-modal .status__relative-time{color:#444b5d;float:right;font-size:14px;width:auto;margin:initial;padding:initial}.boost-modal .status__display-name,.doodle-modal .status__display-name,.favourite-modal .status__display-name,.confirmation-modal .status__display-name,.report-modal .status__display-name,.actions-modal .status__display-name,.mute-modal .status__display-name,.block-modal .status__display-name{display:flex}.boost-modal .status__avatar,.doodle-modal .status__avatar,.favourite-modal .status__avatar,.confirmation-modal .status__avatar,.report-modal .status__avatar,.actions-modal .status__avatar,.mute-modal .status__avatar,.block-modal .status__avatar{height:48px;width:48px}.boost-modal .status__content__spoiler-link,.doodle-modal .status__content__spoiler-link,.favourite-modal .status__content__spoiler-link,.confirmation-modal .status__content__spoiler-link,.report-modal .status__content__spoiler-link,.actions-modal .status__content__spoiler-link,.mute-modal .status__content__spoiler-link,.block-modal .status__content__spoiler-link{color:#17191f}.actions-modal .status{background:#fff;border-bottom-color:#282c37;padding-top:10px;padding-bottom:10px}.actions-modal .dropdown-menu__separator{border-bottom-color:#282c37}.boost-modal__container,.favourite-modal__container{overflow-x:scroll;padding:10px}.boost-modal__container .status,.favourite-modal__container .status{user-select:text;border-bottom:0}.boost-modal__action-bar,.doodle-modal__action-bar,.favourite-modal__action-bar,.confirmation-modal__action-bar,.mute-modal__action-bar,.block-modal__action-bar{display:flex;justify-content:space-between;background:#282c37;padding:10px;line-height:36px}.boost-modal__action-bar>div,.doodle-modal__action-bar>div,.favourite-modal__action-bar>div,.confirmation-modal__action-bar>div,.mute-modal__action-bar>div,.block-modal__action-bar>div{flex:1 1 auto;text-align:right;color:#282c37;padding-right:10px}.boost-modal__action-bar .button,.doodle-modal__action-bar .button,.favourite-modal__action-bar .button,.confirmation-modal__action-bar .button,.mute-modal__action-bar .button,.block-modal__action-bar .button{flex:0 0 auto}.boost-modal__status-header,.favourite-modal__status-header{font-size:15px}.boost-modal__status-time,.favourite-modal__status-time{float:right;font-size:14px}.mute-modal,.block-modal{line-height:24px}.mute-modal .react-toggle,.block-modal .react-toggle{vertical-align:middle}.report-modal{width:90vw;max-width:700px}.report-modal__container{display:flex;border-top:1px solid #282c37}@media screen and (max-width: 480px){.report-modal__container{flex-wrap:wrap;overflow-y:auto}}.report-modal__statuses,.report-modal__comment{box-sizing:border-box;width:50%}@media screen and (max-width: 480px){.report-modal__statuses,.report-modal__comment{width:100%}}.report-modal__statuses,.focal-point-modal__content{flex:1 1 auto;min-height:20vh;max-height:80vh;overflow-y:auto;overflow-x:hidden}.report-modal__statuses .status__content a,.focal-point-modal__content .status__content a{color:#2b90d9}@media screen and (max-width: 480px){.report-modal__statuses,.focal-point-modal__content{max-height:10vh}}@media screen and (max-width: 480px){.focal-point-modal__content{max-height:40vh}}.report-modal__comment{padding:20px;border-right:1px solid #282c37;max-width:320px}.report-modal__comment p{font-size:14px;line-height:20px;margin-bottom:20px}.report-modal__comment .setting-text{display:block;box-sizing:border-box;width:100%;margin:0;color:#000;background:#fff;padding:10px;font-family:inherit;font-size:14px;resize:none;border:0;outline:0;border-radius:4px;border:1px solid #282c37;min-height:100px;max-height:50vh;margin-bottom:10px}.report-modal__comment .setting-text:focus{border:1px solid #393f4f}.report-modal__comment .setting-text__wrapper{background:#fff;border:1px solid #282c37;margin-bottom:10px;border-radius:4px}.report-modal__comment .setting-text__wrapper .setting-text{border:0;margin-bottom:0;border-radius:0}.report-modal__comment .setting-text__wrapper .setting-text:focus{border:0}.report-modal__comment .setting-text__wrapper__modifiers{color:#000;font-family:inherit;font-size:14px;background:#fff}.report-modal__comment .setting-text__toolbar{display:flex;justify-content:space-between;margin-bottom:20px}.report-modal__comment .setting-text-label{display:block;color:#000;font-size:14px;font-weight:500;margin-bottom:10px}.report-modal__comment .setting-toggle{margin-top:20px;margin-bottom:24px}.report-modal__comment .setting-toggle__label{color:#000;font-size:14px}@media screen and (max-width: 480px){.report-modal__comment{padding:10px;max-width:100%;order:2}.report-modal__comment .setting-toggle{margin-bottom:4px}}.actions-modal{max-height:80vh;max-width:80vw}.actions-modal .status{overflow-y:auto;max-height:300px}.actions-modal strong{display:block;font-weight:500}.actions-modal .actions-modal__item-label{font-weight:500}.actions-modal ul{overflow-y:auto;flex-shrink:0;max-height:80vh}.actions-modal ul.with-status{max-height:calc(80vh - 75px)}.actions-modal ul li:empty{margin:0}.actions-modal ul li:not(:empty) a{color:#000;display:flex;padding:12px 16px;font-size:15px;align-items:center;text-decoration:none}.actions-modal ul li:not(:empty) a,.actions-modal ul li:not(:empty) a button{transition:none}.actions-modal ul li:not(:empty) a.active,.actions-modal ul li:not(:empty) a.active button,.actions-modal ul li:not(:empty) a:hover,.actions-modal ul li:not(:empty) a:hover button,.actions-modal ul li:not(:empty) a:active,.actions-modal ul li:not(:empty) a:active button,.actions-modal ul li:not(:empty) a:focus,.actions-modal ul li:not(:empty) a:focus button{background:#2b90d9;color:#000}.actions-modal ul li:not(:empty) a>.react-toggle,.actions-modal ul li:not(:empty) a>.icon,.actions-modal ul li:not(:empty) a button:first-child{margin-right:10px}.confirmation-modal__action-bar .confirmation-modal__secondary-button,.mute-modal__action-bar .confirmation-modal__secondary-button,.block-modal__action-bar .confirmation-modal__secondary-button{flex-shrink:1}.confirmation-modal__secondary-button,.confirmation-modal__cancel-button,.mute-modal__cancel-button,.block-modal__cancel-button{background-color:transparent;color:#282c37;font-size:14px;font-weight:500}.confirmation-modal__secondary-button:hover,.confirmation-modal__secondary-button:focus,.confirmation-modal__secondary-button:active,.confirmation-modal__cancel-button:hover,.confirmation-modal__cancel-button:focus,.confirmation-modal__cancel-button:active,.mute-modal__cancel-button:hover,.mute-modal__cancel-button:focus,.mute-modal__cancel-button:active,.block-modal__cancel-button:hover,.block-modal__cancel-button:focus,.block-modal__cancel-button:active{color:#313543;background-color:transparent}.confirmation-modal__do_not_ask_again{padding-left:20px;padding-right:20px;padding-bottom:10px;font-size:14px}.confirmation-modal__do_not_ask_again label,.confirmation-modal__do_not_ask_again input{vertical-align:middle}.confirmation-modal__container,.mute-modal__container,.block-modal__container,.report-modal__target{padding:30px;font-size:16px}.confirmation-modal__container strong,.mute-modal__container strong,.block-modal__container strong,.report-modal__target strong{font-weight:500}.confirmation-modal__container strong:lang(ja),.mute-modal__container strong:lang(ja),.block-modal__container strong:lang(ja),.report-modal__target strong:lang(ja){font-weight:700}.confirmation-modal__container strong:lang(ko),.mute-modal__container strong:lang(ko),.block-modal__container strong:lang(ko),.report-modal__target strong:lang(ko){font-weight:700}.confirmation-modal__container strong:lang(zh-CN),.mute-modal__container strong:lang(zh-CN),.block-modal__container strong:lang(zh-CN),.report-modal__target strong:lang(zh-CN){font-weight:700}.confirmation-modal__container strong:lang(zh-HK),.mute-modal__container strong:lang(zh-HK),.block-modal__container strong:lang(zh-HK),.report-modal__target strong:lang(zh-HK){font-weight:700}.confirmation-modal__container strong:lang(zh-TW),.mute-modal__container strong:lang(zh-TW),.block-modal__container strong:lang(zh-TW),.report-modal__target strong:lang(zh-TW){font-weight:700}.confirmation-modal__container,.report-modal__target{text-align:center}.block-modal__explanation,.mute-modal__explanation{margin-top:20px}.block-modal .setting-toggle,.mute-modal .setting-toggle{margin-top:20px;margin-bottom:24px;display:flex;align-items:center}.block-modal .setting-toggle__label,.mute-modal .setting-toggle__label{color:#000;margin:0;margin-left:8px}.report-modal__target{padding:15px}.report-modal__target .media-modal__close{top:14px;right:15px}.embed-modal{width:auto;max-width:80vw;max-height:80vh}.embed-modal h4{padding:30px;font-weight:500;font-size:16px;text-align:center}.embed-modal .embed-modal__container{padding:10px}.embed-modal .embed-modal__container .hint{margin-bottom:15px}.embed-modal .embed-modal__container .embed-modal__html{outline:0;box-sizing:border-box;display:block;width:100%;border:none;padding:10px;font-family:\"mastodon-font-monospace\",monospace;background:#d9e1e8;color:#000;font-size:14px;margin:0;margin-bottom:15px;border-radius:4px}.embed-modal .embed-modal__container .embed-modal__html::-moz-focus-inner{border:0}.embed-modal .embed-modal__container .embed-modal__html::-moz-focus-inner,.embed-modal .embed-modal__container .embed-modal__html:focus,.embed-modal .embed-modal__container .embed-modal__html:active{outline:0 !important}.embed-modal .embed-modal__container .embed-modal__html:focus{background:#ccd7e0}@media screen and (max-width: 600px){.embed-modal .embed-modal__container .embed-modal__html{font-size:16px}}.embed-modal .embed-modal__container .embed-modal__iframe{width:400px;max-width:100%;overflow:hidden;border:0;border-radius:4px}.focal-point{position:relative;cursor:move;overflow:hidden;height:100%;display:flex;justify-content:center;align-items:center;background:#000}.focal-point img,.focal-point video,.focal-point canvas{display:block;max-height:80vh;width:100%;height:auto;margin:0;object-fit:contain;background:#000}.focal-point__reticle{position:absolute;width:100px;height:100px;transform:translate(-50%, -50%);background:url(\"~images/reticle.png\") no-repeat 0 0;border-radius:50%;box-shadow:0 0 0 9999em rgba(0,0,0,.35)}.focal-point__overlay{position:absolute;width:100%;height:100%;top:0;left:0}.focal-point__preview{position:absolute;bottom:10px;right:10px;z-index:2;cursor:move;transition:opacity .1s ease}.focal-point__preview:hover{opacity:.5}.focal-point__preview strong{color:#000;font-size:14px;font-weight:500;display:block;margin-bottom:5px}.focal-point__preview div{border-radius:4px;box-shadow:0 0 14px rgba(0,0,0,.2)}@media screen and (max-width: 480px){.focal-point img,.focal-point video{max-height:100%}.focal-point__preview{display:none}}.filtered-status-info{text-align:start}.filtered-status-info .spoiler__text{margin-top:20px}.filtered-status-info .account{border-bottom:0}.filtered-status-info .account__display-name strong{color:#000}.filtered-status-info .status__content__spoiler{display:none}.filtered-status-info .status__content__spoiler--visible{display:flex}.filtered-status-info ul{padding:10px;margin-left:12px;list-style:disc inside}.filtered-status-info .filtered-status-edit-link{color:#606984;text-decoration:none}.filtered-status-info .filtered-status-edit-link:hover{text-decoration:underline}.composer{padding:10px}.composer .emoji-picker-dropdown{position:absolute;top:0;right:0}.composer .emoji-picker-dropdown ::-webkit-scrollbar-track:hover,.composer .emoji-picker-dropdown ::-webkit-scrollbar-track:active{background-color:rgba(255,255,255,.3)}.character-counter{cursor:default;font-family:sans-serif,sans-serif;font-size:14px;font-weight:600;color:#282c37}.character-counter.character-counter--over{color:#ff5050}.no-reduce-motion .composer--spoiler{transition:height .4s ease,opacity .4s ease}.composer--spoiler{height:0;transform-origin:bottom;opacity:0}.composer--spoiler.composer--spoiler--visible{height:36px;margin-bottom:11px;opacity:1}.composer--spoiler input{display:block;box-sizing:border-box;margin:0;border:none;border-radius:4px;padding:10px;width:100%;outline:0;color:#000;background:#fff;font-size:14px;font-family:inherit;resize:vertical}.composer--spoiler input::placeholder{color:#444b5d}.composer--spoiler input:focus{outline:0}@media screen and (max-width: 630px){.auto-columns .composer--spoiler input{font-size:16px}}.single-column .composer--spoiler input{font-size:16px}.composer--warning{color:#000;margin-bottom:15px;background:#9baec8;box-shadow:0 2px 6px rgba(0,0,0,.3);padding:8px 10px;border-radius:4px;font-size:13px;font-weight:400}.composer--warning a{color:#282c37;font-weight:500;text-decoration:underline}.composer--warning a:active,.composer--warning a:focus,.composer--warning a:hover{text-decoration:none}.compose-form__sensitive-button{padding:10px;padding-top:0;font-size:14px;font-weight:500}.compose-form__sensitive-button.active{color:#2b90d9}.compose-form__sensitive-button input[type=checkbox]{display:none}.compose-form__sensitive-button .checkbox{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-left:5px;margin-right:10px;top:-1px;border-radius:4px;vertical-align:middle}.compose-form__sensitive-button .checkbox.active{border-color:#2b90d9;background:#2b90d9}.composer--reply{margin:0 0 10px;border-radius:4px;padding:10px;background:#9baec8;min-height:23px;overflow-y:auto;flex:0 2 auto}.composer--reply>header{margin-bottom:5px;overflow:hidden}.composer--reply>header>.account.small{color:#000}.composer--reply>header>.cancel{float:right;line-height:24px}.composer--reply>.content{position:relative;margin:10px 0;padding:0 12px;font-size:14px;line-height:20px;color:#000;word-wrap:break-word;font-weight:400;overflow:visible;white-space:pre-wrap;padding-top:5px;overflow:hidden}.composer--reply>.content p,.composer--reply>.content pre,.composer--reply>.content blockquote{margin-bottom:20px;white-space:pre-wrap}.composer--reply>.content p:last-child,.composer--reply>.content pre:last-child,.composer--reply>.content blockquote:last-child{margin-bottom:0}.composer--reply>.content h1,.composer--reply>.content h2,.composer--reply>.content h3,.composer--reply>.content h4,.composer--reply>.content h5{margin-top:20px;margin-bottom:20px}.composer--reply>.content h1,.composer--reply>.content h2{font-weight:700;font-size:18px}.composer--reply>.content h2{font-size:16px}.composer--reply>.content h3,.composer--reply>.content h4,.composer--reply>.content h5{font-weight:500}.composer--reply>.content blockquote{padding-left:10px;border-left:3px solid #000;color:#000;white-space:normal}.composer--reply>.content blockquote p:last-child{margin-bottom:0}.composer--reply>.content b,.composer--reply>.content strong{font-weight:700}.composer--reply>.content em,.composer--reply>.content i{font-style:italic}.composer--reply>.content sub{font-size:smaller;text-align:sub}.composer--reply>.content ul,.composer--reply>.content ol{margin-left:1em}.composer--reply>.content ul p,.composer--reply>.content ol p{margin:0}.composer--reply>.content ul{list-style-type:disc}.composer--reply>.content ol{list-style-type:decimal}.composer--reply>.content a{color:#282c37;text-decoration:none}.composer--reply>.content a:hover{text-decoration:underline}.composer--reply>.content a.mention:hover{text-decoration:none}.composer--reply>.content a.mention:hover span{text-decoration:underline}.composer--reply .emojione{width:20px;height:20px;margin:-5px 0 0}.compose-form__autosuggest-wrapper,.autosuggest-input{position:relative;width:100%}.compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea,.autosuggest-input label .autosuggest-textarea__textarea{display:block;box-sizing:border-box;margin:0;border:none;border-radius:4px 4px 0 0;padding:10px 32px 0 10px;width:100%;min-height:100px;outline:0;color:#000;background:#fff;font-size:14px;font-family:inherit;resize:none;scrollbar-color:initial}.compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea::placeholder,.autosuggest-input label .autosuggest-textarea__textarea::placeholder{color:#444b5d}.compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea::-webkit-scrollbar,.autosuggest-input label .autosuggest-textarea__textarea::-webkit-scrollbar{all:unset}.compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea:disabled,.autosuggest-input label .autosuggest-textarea__textarea:disabled{background:#282c37}.compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea:focus,.autosuggest-input label .autosuggest-textarea__textarea:focus{outline:0}@media screen and (max-width: 630px){.auto-columns .compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea,.auto-columns .autosuggest-input label .autosuggest-textarea__textarea{font-size:16px}}.single-column .compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea,.single-column .autosuggest-input label .autosuggest-textarea__textarea{font-size:16px}@media screen and (max-width: 600px){.auto-columns .compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea,.single-column .compose-form__autosuggest-wrapper label .autosuggest-textarea__textarea,.auto-columns .autosuggest-input label .autosuggest-textarea__textarea,.single-column .autosuggest-input label .autosuggest-textarea__textarea{height:100px !important;resize:vertical}}.composer--textarea--icons{display:block;position:absolute;top:29px;right:5px;bottom:5px;overflow:hidden}.composer--textarea--icons>.textarea_icon{display:block;margin:2px 0 0 2px;width:24px;height:24px;color:#282c37;font-size:18px;line-height:24px;text-align:center;opacity:.8}.autosuggest-textarea__suggestions-wrapper{position:relative;height:0}.autosuggest-textarea__suggestions{display:block;position:absolute;box-sizing:border-box;top:100%;border-radius:0 0 4px 4px;padding:6px;width:100%;color:#000;background:#282c37;box-shadow:4px 4px 6px rgba(0,0,0,.4);font-size:14px;z-index:99;display:none}.autosuggest-textarea__suggestions--visible{display:block}.autosuggest-textarea__suggestions__item{padding:10px;cursor:pointer;border-radius:4px}.autosuggest-textarea__suggestions__item:hover,.autosuggest-textarea__suggestions__item:focus,.autosuggest-textarea__suggestions__item:active,.autosuggest-textarea__suggestions__item.selected{background:#3d4455}.autosuggest-textarea__suggestions__item>.account,.autosuggest-textarea__suggestions__item>.emoji,.autosuggest-textarea__suggestions__item>.autosuggest-hashtag{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;line-height:18px;font-size:14px}.autosuggest-textarea__suggestions__item .autosuggest-hashtag{justify-content:space-between}.autosuggest-textarea__suggestions__item .autosuggest-hashtag__name{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.autosuggest-textarea__suggestions__item .autosuggest-hashtag strong{font-weight:500}.autosuggest-textarea__suggestions__item .autosuggest-hashtag__uses{flex:0 0 auto;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.autosuggest-textarea__suggestions__item>.account.small .display-name>span{color:#282c37}.composer--upload_form{overflow:hidden}.composer--upload_form>.content{display:flex;flex-direction:row;flex-wrap:wrap;font-family:inherit;padding:5px;overflow:hidden}.composer--upload_form--item{flex:1 1 0;margin:5px;min-width:40%}.composer--upload_form--item>div{position:relative;border-radius:4px;height:140px;width:100%;background-color:#000;background-position:center;background-size:cover;background-repeat:no-repeat;overflow:hidden}.composer--upload_form--item>div textarea{display:block;position:absolute;box-sizing:border-box;bottom:0;left:0;margin:0;border:0;padding:10px;width:100%;color:#282c37;background:linear-gradient(0deg, rgba(0, 0, 0, 0.8) 0, rgba(0, 0, 0, 0.35) 80%, transparent);font-size:14px;font-family:inherit;font-weight:500;opacity:0;z-index:2;transition:opacity .1s ease}.composer--upload_form--item>div textarea:focus{color:#fff}.composer--upload_form--item>div textarea::placeholder{opacity:.54;color:#282c37}.composer--upload_form--item>div>.close{mix-blend-mode:difference}.composer--upload_form--item.active>div textarea{opacity:1}.composer--upload_form--actions{background:linear-gradient(180deg, rgba(0, 0, 0, 0.8) 0, rgba(0, 0, 0, 0.35) 80%, transparent);display:flex;align-items:flex-start;justify-content:space-between;opacity:0;transition:opacity .1s ease}.composer--upload_form--actions .icon-button{flex:0 1 auto;color:#282c37;font-size:14px;font-weight:500;padding:10px;font-family:inherit}.composer--upload_form--actions .icon-button:hover,.composer--upload_form--actions .icon-button:focus,.composer--upload_form--actions .icon-button:active{color:#1f232b}.composer--upload_form--actions.active{opacity:1}.composer--upload_form--progress{display:flex;padding:10px;color:#282c37;overflow:hidden}.composer--upload_form--progress>.fa{font-size:34px;margin-right:10px}.composer--upload_form--progress>.message{flex:1 1 auto}.composer--upload_form--progress>.message>span{display:block;font-size:12px;font-weight:500;text-transform:uppercase}.composer--upload_form--progress>.message>.backdrop{position:relative;margin-top:5px;border-radius:6px;width:100%;height:6px;background:#3c5063}.composer--upload_form--progress>.message>.backdrop>.tracker{position:absolute;top:0;left:0;height:6px;border-radius:6px;background:#2b90d9}.compose-form__modifiers{color:#000;font-family:inherit;font-size:14px;background:#fff}.composer--options-wrapper{padding:10px;background:#fff;border-radius:0 0 4px 4px;height:27px;display:flex;justify-content:space-between;flex:0 0 auto}.composer--options{display:flex;flex:0 0 auto}.composer--options>*{display:inline-block;box-sizing:content-box;padding:0 3px;height:27px;line-height:27px;vertical-align:bottom}.composer--options>hr{display:inline-block;margin:0 3px;border-width:0 0 0 1px;border-style:none none none solid;border-color:transparent transparent transparent #fff;padding:0;width:0;height:27px;background:transparent}.compose--counter-wrapper{align-self:center;margin-right:4px}.composer--options--dropdown.open>.value{border-radius:4px 4px 0 0;box-shadow:0 -4px 4px rgba(0,0,0,.1);color:#000;background:#2b90d9;transition:none}.composer--options--dropdown.open.top>.value{border-radius:0 0 4px 4px;box-shadow:0 4px 4px rgba(0,0,0,.1)}.composer--options--dropdown--content{position:absolute;border-radius:4px;box-shadow:2px 4px 15px rgba(0,0,0,.4);background:#fff;overflow:hidden;transform-origin:50% 0}.composer--options--dropdown--content--item{display:flex;align-items:center;padding:10px;color:#000;cursor:pointer}.composer--options--dropdown--content--item>.content{flex:1 1 auto;color:#282c37}.composer--options--dropdown--content--item>.content:not(:first-child){margin-left:10px}.composer--options--dropdown--content--item>.content strong{display:block;color:#000;font-weight:500}.composer--options--dropdown--content--item:hover,.composer--options--dropdown--content--item.active{background:#2b90d9;color:#000}.composer--options--dropdown--content--item:hover>.content,.composer--options--dropdown--content--item.active>.content{color:#000}.composer--options--dropdown--content--item:hover>.content strong,.composer--options--dropdown--content--item.active>.content strong{color:#000}.composer--options--dropdown--content--item.active:hover{background:#2485cb}.composer--publisher{padding-top:10px;text-align:right;white-space:nowrap;overflow:hidden;justify-content:flex-end;flex:0 0 auto}.composer--publisher>.primary{display:inline-block;margin:0;padding:0 10px;text-align:center}.composer--publisher>.side_arm{display:inline-block;margin:0 2px;padding:0;width:36px;text-align:center}.composer--publisher.over>.count{color:#ff5050}.column__wrapper{display:flex;flex:1 1 auto;position:relative}.columns-area{display:flex;flex:1 1 auto;flex-direction:row;justify-content:flex-start;overflow-x:auto;position:relative}.columns-area__panels{display:flex;justify-content:center;width:100%;height:100%;min-height:100vh}.columns-area__panels__pane{height:100%;overflow:hidden;pointer-events:none;display:flex;justify-content:flex-end;min-width:285px}.columns-area__panels__pane--start{justify-content:flex-start}.columns-area__panels__pane__inner{position:fixed;width:285px;pointer-events:auto;height:100%}.columns-area__panels__main{box-sizing:border-box;width:100%;max-width:600px;flex:0 0 auto;display:flex;flex-direction:column}@media screen and (min-width: 415px){.columns-area__panels__main{padding:0 10px}}.tabs-bar__wrapper{background:#f2f5f7;position:sticky;top:0;z-index:2;padding-top:0}@media screen and (min-width: 415px){.tabs-bar__wrapper{padding-top:10px}}.tabs-bar__wrapper .tabs-bar{margin-bottom:0}@media screen and (min-width: 415px){.tabs-bar__wrapper .tabs-bar{margin-bottom:10px}}.react-swipeable-view-container,.react-swipeable-view-container .columns-area,.react-swipeable-view-container .column{height:100%}.react-swipeable-view-container>*{display:flex;align-items:center;justify-content:center;height:100%}.column{width:330px;position:relative;box-sizing:border-box;display:flex;flex-direction:column}.column>.scrollable{background:#d9e1e8}.ui{flex:0 0 auto;display:flex;flex-direction:column;width:100%;height:100%}.column{overflow:hidden}.column-back-button{box-sizing:border-box;width:100%;background:#ccd7e0;color:#2b90d9;cursor:pointer;flex:0 0 auto;font-size:16px;border:0;text-align:unset;padding:15px;margin:0;z-index:3}.column-back-button:hover{text-decoration:underline}.column-header__back-button{background:#ccd7e0;border:0;font-family:inherit;color:#2b90d9;cursor:pointer;flex:0 0 auto;font-size:16px;padding:0 5px 0 0;z-index:3}.column-header__back-button:hover{text-decoration:underline}.column-header__back-button:last-child{padding:0 15px 0 0}.column-back-button__icon{display:inline-block;margin-right:5px}.column-back-button--slim{position:relative}.column-back-button--slim-button{cursor:pointer;flex:0 0 auto;font-size:16px;padding:15px;position:absolute;right:0;top:-48px}.column-link{background:#c0cdd9;color:#000;display:block;font-size:16px;padding:15px;text-decoration:none}.column-link:hover,.column-link:focus,.column-link:active{background:#b6c5d3}.column-link:focus{outline:0}.column-link--transparent{background:transparent;color:#282c37}.column-link--transparent:hover,.column-link--transparent:focus,.column-link--transparent:active{background:transparent;color:#000}.column-link--transparent.active{color:#2b90d9}.column-link__icon{display:inline-block;margin-right:5px}.column-subheading{background:#d9e1e8;color:#444b5d;padding:8px 20px;font-size:12px;font-weight:500;text-transform:uppercase;cursor:default}.column-header__wrapper{position:relative;flex:0 0 auto;z-index:1}.column-header__wrapper.active{box-shadow:0 1px 0 rgba(43,144,217,.3)}.column-header__wrapper.active::before{display:block;content:\"\";position:absolute;bottom:-13px;left:0;right:0;margin:0 auto;width:60%;pointer-events:none;height:28px;z-index:1;background:radial-gradient(ellipse, rgba(43, 144, 217, 0.23) 0%, rgba(43, 144, 217, 0) 60%)}.column-header__wrapper .announcements{z-index:1;position:relative}.column-header{display:flex;font-size:16px;background:#ccd7e0;flex:0 0 auto;cursor:pointer;position:relative;z-index:2;outline:0;overflow:hidden}.column-header>button{margin:0;border:none;padding:15px;color:inherit;background:transparent;font:inherit;text-align:left;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;flex:1}.column-header>.column-header__back-button{color:#2b90d9}.column-header.active .column-header__icon{color:#2b90d9;text-shadow:0 0 10px rgba(43,144,217,.4)}.column-header:focus,.column-header:active{outline:0}.column{width:330px;position:relative;box-sizing:border-box;display:flex;flex-direction:column;overflow:hidden}.wide .columns-area:not(.columns-area--mobile) .column{flex:auto;min-width:330px;max-width:400px}.column>.scrollable{background:#d9e1e8}.column-header__buttons{height:48px;display:flex;margin-left:0}.column-header__links{margin-bottom:14px}.column-header__links .text-btn{margin-right:10px}.column-header__button,.column-header__notif-cleaning-buttons button{background:#ccd7e0;border:0;color:#282c37;cursor:pointer;font-size:16px;padding:0 15px}.column-header__button:hover,.column-header__notif-cleaning-buttons button:hover{color:#191b22}.column-header__button.active,.column-header__notif-cleaning-buttons button.active{color:#000;background:#c0cdd9}.column-header__button.active:hover,.column-header__notif-cleaning-buttons button.active:hover{color:#000;background:#c0cdd9}.column-header__button:focus,.column-header__notif-cleaning-buttons button:focus{text-shadow:0 0 4px #419bdd}.column-header__notif-cleaning-buttons{display:flex;align-items:stretch;justify-content:space-around}.column-header__notif-cleaning-buttons button{background:transparent;text-align:center;padding:10px 0;white-space:pre-wrap}.column-header__notif-cleaning-buttons b{font-weight:bold}.column-header__collapsible-inner.nopad-drawer{padding:0}.column-header__collapsible{max-height:70vh;overflow:hidden;overflow-y:auto;color:#282c37;transition:max-height 150ms ease-in-out,opacity 300ms linear;opacity:1;z-index:1;position:relative}.column-header__collapsible.collapsed{max-height:0;opacity:.5}.column-header__collapsible.animating{overflow-y:hidden}.column-header__collapsible hr{height:0;background:transparent;border:0;border-top:1px solid #b3c3d1;margin:10px 0}.column-header__collapsible.ncd{transition:none}.column-header__collapsible.ncd.collapsed{max-height:0;opacity:.7}.column-header__collapsible-inner{background:#c0cdd9;padding:15px}.column-header__setting-btn:hover{color:#282c37;text-decoration:underline}.column-header__setting-arrows{float:right}.column-header__setting-arrows .column-header__setting-btn{padding:0 10px}.column-header__setting-arrows .column-header__setting-btn:last-child{padding-right:0}.column-header__title{display:inline-block;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;flex:1}.column-header__icon{display:inline-block;margin-right:5px}.empty-column-indicator,.error-column,.follow_requests-unlocked_explanation{color:#444b5d;background:#d9e1e8;text-align:center;padding:20px;font-size:15px;font-weight:400;cursor:default;display:flex;flex:1 1 auto;align-items:center;justify-content:center}@supports(display: grid){.empty-column-indicator,.error-column,.follow_requests-unlocked_explanation{contain:strict}}.empty-column-indicator>span,.error-column>span,.follow_requests-unlocked_explanation>span{max-width:400px}.empty-column-indicator a,.error-column a,.follow_requests-unlocked_explanation a{color:#2b90d9;text-decoration:none}.empty-column-indicator a:hover,.error-column a:hover,.follow_requests-unlocked_explanation a:hover{text-decoration:underline}.follow_requests-unlocked_explanation{background:#e6ebf0;contain:initial}.error-column{flex-direction:column}.single-column.navbar-under .tabs-bar{margin-top:0 !important;margin-bottom:-6px !important}@media screen and (max-width: 415px){.auto-columns.navbar-under .tabs-bar{margin-top:0 !important;margin-bottom:-6px !important}}@media screen and (max-width: 415px){.auto-columns.navbar-under .react-swipeable-view-container .columns-area,.single-column.navbar-under .react-swipeable-view-container .columns-area{height:100% !important}}.column-inline-form{padding:7px 15px;padding-right:5px;display:flex;justify-content:flex-start;align-items:center;background:#ccd7e0}.column-inline-form label{flex:1 1 auto}.column-inline-form label input{width:100%;margin-bottom:6px}.column-inline-form label input:focus{outline:0}.column-inline-form .icon-button{flex:0 0 auto;margin:0 5px}.regeneration-indicator{text-align:center;font-size:16px;font-weight:500;color:#444b5d;background:#d9e1e8;cursor:default;display:flex;flex:1 1 auto;flex-direction:column;align-items:center;justify-content:center;padding:20px}.regeneration-indicator__figure,.regeneration-indicator__figure img{display:block;width:auto;height:160px;margin:0}.regeneration-indicator--without-header{padding-top:68px}.regeneration-indicator__label{margin-top:30px}.regeneration-indicator__label strong{display:block;margin-bottom:10px;color:#444b5d}.regeneration-indicator__label span{font-size:15px;font-weight:400}.directory__list{width:100%;margin:10px 0;transition:opacity 100ms ease-in}.directory__list.loading{opacity:.7}@media screen and (max-width: 415px){.directory__list{margin:0}}.directory__card{box-sizing:border-box;margin-bottom:10px}.directory__card__img{height:125px;position:relative;background:#fff;overflow:hidden}.directory__card__img img{display:block;width:100%;height:100%;margin:0;object-fit:cover}.directory__card__bar{display:flex;align-items:center;background:#ccd7e0;padding:10px}.directory__card__bar__name{flex:1 1 auto;display:flex;align-items:center;text-decoration:none;overflow:hidden}.directory__card__bar__relationship{width:23px;min-height:1px;flex:0 0 auto}.directory__card__bar .avatar{flex:0 0 auto;width:48px;height:48px;padding-top:2px}.directory__card__bar .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px;background:#f2f5f7;object-fit:cover}.directory__card__bar .display-name{margin-left:15px;text-align:left}.directory__card__bar .display-name strong{font-size:15px;color:#000;font-weight:500;overflow:hidden;text-overflow:ellipsis}.directory__card__bar .display-name span{display:block;font-size:14px;color:#282c37;font-weight:400;overflow:hidden;text-overflow:ellipsis}.directory__card__extra{background:#d9e1e8;display:flex;align-items:center;justify-content:center}.directory__card__extra .accounts-table__count{width:33.33%;flex:0 0 auto;padding:15px 0}.directory__card__extra .account__header__content{box-sizing:border-box;padding:15px 10px;border-bottom:1px solid #c0cdd9;width:100%;min-height:48px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.directory__card__extra .account__header__content p{display:none}.directory__card__extra .account__header__content p:first-child{display:inline}.directory__card__extra .account__header__content br{display:none}.filter-form{background:#d9e1e8}.filter-form__column{padding:10px 15px}.filter-form .radio-button{display:block}.radio-button{font-size:14px;position:relative;display:inline-block;padding:6px 0;line-height:18px;cursor:default;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer}.radio-button input[type=radio],.radio-button input[type=checkbox]{display:none}.radio-button__input{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:50%;vertical-align:middle}.radio-button__input.checked{border-color:#217aba;background:#217aba}.search{position:relative}.search__input{outline:0;box-sizing:border-box;width:100%;border:none;box-shadow:none;font-family:inherit;background:#d9e1e8;color:#282c37;font-size:14px;margin:0;display:block;padding:15px;padding-right:30px;line-height:18px;font-size:16px}.search__input::placeholder{color:#1f232b}.search__input::-moz-focus-inner{border:0}.search__input::-moz-focus-inner,.search__input:focus,.search__input:active{outline:0 !important}.search__input:focus{background:#ccd7e0}@media screen and (max-width: 600px){.search__input{font-size:16px}}.search__icon::-moz-focus-inner{border:0}.search__icon::-moz-focus-inner,.search__icon:focus{outline:0 !important}.search__icon .fa{position:absolute;top:16px;right:10px;z-index:2;display:inline-block;opacity:0;transition:all 100ms linear;transition-property:color,transform,opacity;font-size:18px;width:18px;height:18px;color:#282c37;cursor:default;pointer-events:none}.search__icon .fa.active{pointer-events:auto;opacity:.3}.search__icon .fa-search{transform:rotate(0deg)}.search__icon .fa-search.active{pointer-events:auto;opacity:.3}.search__icon .fa-times-circle{top:17px;transform:rotate(0deg);color:#606984;cursor:pointer}.search__icon .fa-times-circle.active{transform:rotate(90deg)}.search__icon .fa-times-circle:hover{color:#51596f}.search-results__header{color:#444b5d;background:#d3dce4;border-bottom:1px solid #e6ebf0;padding:15px 10px;font-size:14px;font-weight:500}.search-results__info{padding:20px;color:#282c37;text-align:center}.trends__header{color:#444b5d;background:#d3dce4;border-bottom:1px solid #e6ebf0;font-weight:500;padding:15px;font-size:16px;cursor:default}.trends__header .fa{display:inline-block;margin-right:5px}.trends__item{display:flex;align-items:center;padding:15px;border-bottom:1px solid #c0cdd9}.trends__item:last-child{border-bottom:0}.trends__item__name{flex:1 1 auto;color:#444b5d;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trends__item__name strong{font-weight:500}.trends__item__name a{color:#282c37;text-decoration:none;font-size:14px;font-weight:500;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trends__item__name a:hover span,.trends__item__name a:focus span,.trends__item__name a:active span{text-decoration:underline}.trends__item__current{flex:0 0 auto;font-size:24px;line-height:36px;font-weight:500;text-align:right;padding-right:15px;margin-left:5px;color:#282c37}.trends__item__sparkline{flex:0 0 auto;width:50px}.trends__item__sparkline path:first-child{fill:rgba(43,144,217,.25) !important;fill-opacity:1 !important}.trends__item__sparkline path:last-child{stroke:#2380c3 !important}.emojione{font-size:inherit;vertical-align:middle;object-fit:contain;margin:-0.2ex .15em .2ex;width:16px;height:16px}.emojione img{width:auto}.emoji-picker-dropdown__menu{background:#fff;position:absolute;box-shadow:4px 4px 6px rgba(0,0,0,.4);border-radius:4px;margin-top:5px;z-index:2}.emoji-picker-dropdown__menu .emoji-mart-scroll{transition:opacity 200ms ease}.emoji-picker-dropdown__menu.selecting .emoji-mart-scroll{opacity:.5}.emoji-picker-dropdown__modifiers{position:absolute;top:60px;right:11px;cursor:pointer}.emoji-picker-dropdown__modifiers__menu{position:absolute;z-index:4;top:-4px;left:-8px;background:#fff;border-radius:4px;box-shadow:1px 2px 6px rgba(0,0,0,.2);overflow:hidden}.emoji-picker-dropdown__modifiers__menu button{display:block;cursor:pointer;border:0;padding:4px 8px;background:transparent}.emoji-picker-dropdown__modifiers__menu button:hover,.emoji-picker-dropdown__modifiers__menu button:focus,.emoji-picker-dropdown__modifiers__menu button:active{background:rgba(40,44,55,.4)}.emoji-picker-dropdown__modifiers__menu .emoji-mart-emoji{height:22px}.emoji-mart-emoji span{background-repeat:no-repeat}.emoji-button{display:block;padding:5px 5px 2px 2px;outline:0;cursor:pointer}.emoji-button:active,.emoji-button:focus{outline:0 !important}.emoji-button img{filter:grayscale(100%);opacity:.8;display:block;margin:0;width:22px;height:22px}.emoji-button:hover img,.emoji-button:active img,.emoji-button:focus img{opacity:1;filter:none}.doodle-modal{width:unset}.doodle-modal__container{background:#d9e1e8;text-align:center;line-height:0}.doodle-modal__container canvas{border:5px solid #d9e1e8}.doodle-modal__action-bar .filler{flex-grow:1;margin:0;padding:0}.doodle-modal__action-bar .doodle-toolbar{line-height:1;display:flex;flex-direction:column;flex-grow:0;justify-content:space-around}.doodle-modal__action-bar .doodle-toolbar.with-inputs label{display:inline-block;width:70px;text-align:right;margin-right:2px}.doodle-modal__action-bar .doodle-toolbar.with-inputs input[type=number],.doodle-modal__action-bar .doodle-toolbar.with-inputs input[type=text]{width:40px}.doodle-modal__action-bar .doodle-toolbar.with-inputs span.val{display:inline-block;text-align:left;width:50px}.doodle-modal__action-bar .doodle-palette{padding-right:0 !important;border:1px solid #000;line-height:.2rem;flex-grow:0;background:#fff}.doodle-modal__action-bar .doodle-palette button{appearance:none;width:1rem;height:1rem;margin:0;padding:0;text-align:center;color:#000;text-shadow:0 0 1px #fff;cursor:pointer;box-shadow:inset 0 0 1px rgba(255,255,255,.5);border:1px solid #000;outline-offset:-1px}.doodle-modal__action-bar .doodle-palette button.foreground{outline:1px dashed #fff}.doodle-modal__action-bar .doodle-palette button.background{outline:1px dashed red}.doodle-modal__action-bar .doodle-palette button.foreground.background{outline:1px dashed red;border-color:#fff}.drawer{width:300px;box-sizing:border-box;display:flex;flex-direction:column;overflow-y:hidden;padding:10px 5px;flex:none}.drawer:first-child{padding-left:10px}.drawer:last-child{padding-right:10px}@media screen and (max-width: 630px){.auto-columns .drawer{flex:auto}}.single-column .drawer{flex:auto}@media screen and (max-width: 630px){.auto-columns .drawer,.auto-columns .drawer:first-child,.auto-columns .drawer:last-child,.single-column .drawer,.single-column .drawer:first-child,.single-column .drawer:last-child{padding:0}}.wide .drawer{min-width:300px;max-width:400px;flex:1 1 200px}@media screen and (max-width: 630px){:root .auto-columns .drawer{flex:auto;width:100%;min-width:0;max-width:none;padding:0}}:root .single-column .drawer{flex:auto;width:100%;min-width:0;max-width:none;padding:0}.react-swipeable-view-container .drawer{height:100%}.drawer--header{display:flex;flex-direction:row;margin-bottom:10px;flex:none;background:#c0cdd9;font-size:16px}.drawer--header>*{display:block;box-sizing:border-box;border-bottom:2px solid transparent;padding:15px 5px 13px;height:48px;flex:1 1 auto;color:#282c37;text-align:center;text-decoration:none;cursor:pointer}.drawer--header a{transition:background 100ms ease-in}.drawer--header a:focus,.drawer--header a:hover{outline:none;background:#cfd9e2;transition:background 200ms ease-out}.search{position:relative;margin-bottom:10px;flex:none}@media screen and (max-width: 415px){.auto-columns .search,.single-column .search{margin-bottom:0}}@media screen and (max-width: 630px){.auto-columns .search{font-size:16px}}.single-column .search{font-size:16px}.search-popout{background:#fff;border-radius:4px;padding:10px 14px;padding-bottom:14px;margin-top:10px;color:#444b5d;box-shadow:2px 4px 15px rgba(0,0,0,.4)}.search-popout h4{text-transform:uppercase;color:#444b5d;font-size:13px;font-weight:500;margin-bottom:10px}.search-popout li{padding:4px 0}.search-popout ul{margin-bottom:10px}.search-popout em{font-weight:500;color:#000}.drawer--account{padding:10px;color:#282c37;display:flex;align-items:center}.drawer--account a{color:inherit;text-decoration:none}.drawer--account .acct{display:block;color:#282c37;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.navigation-bar__profile{flex:1 1 auto;margin-left:8px;overflow:hidden}.drawer--results{background:#d9e1e8;overflow-x:hidden;overflow-y:auto}.drawer--results>header{color:#444b5d;background:#d3dce4;padding:15px;font-weight:500;font-size:16px;cursor:default}.drawer--results>header .fa{display:inline-block;margin-right:5px}.drawer--results>section{margin-bottom:5px}.drawer--results>section h5{background:#e6ebf0;border-bottom:1px solid #c0cdd9;cursor:default;display:flex;padding:15px;font-weight:500;font-size:16px;color:#444b5d}.drawer--results>section h5 .fa{display:inline-block;margin-right:5px}.drawer--results>section .account:last-child,.drawer--results>section>div:last-child .status{border-bottom:0}.drawer--results>section>.hashtag{display:block;padding:10px;color:#282c37;text-decoration:none}.drawer--results>section>.hashtag:hover,.drawer--results>section>.hashtag:active,.drawer--results>section>.hashtag:focus{color:#1f232b;text-decoration:underline}.drawer__pager{box-sizing:border-box;padding:0;flex-grow:1;position:relative;overflow:hidden;display:flex}.drawer__inner{position:absolute;top:0;left:0;background:#b0c0cf;box-sizing:border-box;padding:0;display:flex;flex-direction:column;overflow:hidden;overflow-y:auto;width:100%;height:100%}.drawer__inner.darker{background:#d9e1e8}.drawer__inner__mastodon{background:#b0c0cf url('data:image/svg+xml;utf8,') no-repeat bottom/100% auto;flex:1;min-height:47px;display:none}.drawer__inner__mastodon>img{display:block;object-fit:contain;object-position:bottom left;width:85%;height:100%;pointer-events:none;user-drag:none;user-select:none}.drawer__inner__mastodon>.mastodon{display:block;width:100%;height:100%;border:none;cursor:inherit}@media screen and (min-height: 640px){.drawer__inner__mastodon{display:block}}.pseudo-drawer{background:#b0c0cf;font-size:13px;text-align:left}.drawer__backdrop{cursor:pointer;position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(255,255,255,.5)}.video-error-cover{align-items:center;background:#fff;color:#000;cursor:pointer;display:flex;flex-direction:column;height:100%;justify-content:center;margin-top:8px;position:relative;text-align:center;z-index:100}.media-spoiler{background:#fff;color:#282c37;border:0;width:100%;height:100%}.media-spoiler:hover,.media-spoiler:active,.media-spoiler:focus{color:#17191f}.status__content>.media-spoiler{margin-top:15px}.media-spoiler.full-width{margin-left:-14px;margin-right:-14px;width:inherit;max-width:none;height:250px;border-radius:0px}.media-spoiler__warning{display:block;font-size:14px}.media-spoiler__trigger{display:block;font-size:11px;font-weight:500}.media-gallery__gifv__label{display:block;position:absolute;color:#000;background:rgba(255,255,255,.5);bottom:6px;left:6px;padding:2px 6px;border-radius:2px;font-size:11px;font-weight:600;z-index:1;pointer-events:none;opacity:.9;transition:opacity .1s ease;line-height:18px}.media-gallery__gifv:hover .media-gallery__gifv__label{opacity:1}.media-gallery__audio{height:100%;display:flex;flex-direction:column}.media-gallery__audio span{text-align:center;color:#282c37;display:flex;height:100%;align-items:center}.media-gallery__audio span p{width:100%}.media-gallery__audio audio{width:100%}.media-gallery{box-sizing:border-box;margin-top:8px;overflow:hidden;border-radius:4px;position:relative;width:100%;height:110px}.media-gallery.full-width{margin-left:-14px;margin-right:-14px;width:inherit;max-width:none;height:250px;border-radius:0px}.media-gallery__item{border:none;box-sizing:border-box;display:block;float:left;position:relative;border-radius:4px;overflow:hidden}.full-width .media-gallery__item{border-radius:0}.media-gallery__item.standalone .media-gallery__item-gifv-thumbnail{transform:none;top:0}.media-gallery__item.letterbox{background:#000}.media-gallery__item-thumbnail{cursor:zoom-in;display:block;text-decoration:none;color:#282c37;position:relative;z-index:1}.media-gallery__item-thumbnail,.media-gallery__item-thumbnail img{height:100%;width:100%;object-fit:contain}.media-gallery__item-thumbnail:not(.letterbox),.media-gallery__item-thumbnail img:not(.letterbox){height:100%;object-fit:cover}.media-gallery__preview{width:100%;height:100%;object-fit:cover;position:absolute;top:0;left:0;z-index:0;background:#fff}.media-gallery__preview--hidden{display:none}.media-gallery__gifv{height:100%;overflow:hidden;position:relative;width:100%;display:flex;justify-content:center}.media-gallery__item-gifv-thumbnail{cursor:zoom-in;height:100%;width:100%;position:relative;z-index:1;object-fit:contain;user-select:none}.media-gallery__item-gifv-thumbnail:not(.letterbox){height:100%;object-fit:cover}.media-gallery__item-thumbnail-label{clip:rect(1px 1px 1px 1px);clip:rect(1px, 1px, 1px, 1px);overflow:hidden;position:absolute}.video-modal__container{max-width:100vw;max-height:100vh}.audio-modal__container{width:50vw}.media-modal{width:100%;height:100%;position:relative}.media-modal .extended-video-player{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.media-modal .extended-video-player video{max-width:100%;max-height:80%}.media-modal__closer{position:absolute;top:0;left:0;right:0;bottom:0}.media-modal__navigation{position:absolute;top:0;left:0;right:0;bottom:0;pointer-events:none;transition:opacity .3s linear;will-change:opacity}.media-modal__navigation *{pointer-events:auto}.media-modal__navigation.media-modal__navigation--hidden{opacity:0}.media-modal__navigation.media-modal__navigation--hidden *{pointer-events:none}.media-modal__nav{background:rgba(255,255,255,.5);box-sizing:border-box;border:0;color:#000;cursor:pointer;display:flex;align-items:center;font-size:24px;height:20vmax;margin:auto 0;padding:30px 15px;position:absolute;top:0;bottom:0}.media-modal__nav--left{left:0}.media-modal__nav--right{right:0}.media-modal__pagination{width:100%;text-align:center;position:absolute;left:0;bottom:20px;pointer-events:none}.media-modal__meta{text-align:center;position:absolute;left:0;bottom:20px;width:100%;pointer-events:none}.media-modal__meta--shifted{bottom:62px}.media-modal__meta a{pointer-events:auto;text-decoration:none;font-weight:500;color:#282c37}.media-modal__meta a:hover,.media-modal__meta a:focus,.media-modal__meta a:active{text-decoration:underline}.media-modal__page-dot{display:inline-block}.media-modal__button{background-color:#fff;height:12px;width:12px;border-radius:6px;margin:10px;padding:0;border:0;font-size:0}.media-modal__button--active{background-color:#2b90d9}.media-modal__close{position:absolute;right:8px;top:8px;z-index:100}.detailed .video-player__volume__current,.detailed .video-player__volume::before,.fullscreen .video-player__volume__current,.fullscreen .video-player__volume::before{bottom:27px}.detailed .video-player__volume__handle,.fullscreen .video-player__volume__handle{bottom:23px}.audio-player{box-sizing:border-box;position:relative;background:#f2f5f7;border-radius:4px;padding-bottom:44px;direction:ltr}.audio-player.editable{border-radius:0;height:100%}.audio-player__waveform{padding:15px 0;position:relative;overflow:hidden}.audio-player__waveform::before{content:\"\";display:block;position:absolute;border-top:1px solid #ccd7e0;width:100%;height:0;left:0;top:calc(50% + 1px)}.audio-player__progress-placeholder{background-color:rgba(33,122,186,.5)}.audio-player__wave-placeholder{background-color:#a6b9c9}.audio-player .video-player__controls{padding:0 15px;padding-top:10px;background:#f2f5f7;border-top:1px solid #ccd7e0;border-radius:0 0 4px 4px}.video-player{overflow:hidden;position:relative;background:#000;max-width:100%;border-radius:4px;box-sizing:border-box;direction:ltr}.video-player.editable{border-radius:0;height:100% !important}.video-player:focus{outline:0}.detailed-status .video-player{width:100%;height:100%}.video-player.full-width{margin-left:-14px;margin-right:-14px;width:inherit;max-width:none;height:250px;border-radius:0px}.video-player video{max-width:100vw;max-height:80vh;z-index:1;position:relative}.video-player.fullscreen{width:100% !important;height:100% !important;margin:0}.video-player.fullscreen video{max-width:100% !important;max-height:100% !important;width:100% !important;height:100% !important;outline:0}.video-player.inline video{object-fit:contain;position:relative;top:50%;transform:translateY(-50%)}.video-player__controls{position:absolute;z-index:2;bottom:0;left:0;right:0;box-sizing:border-box;background:linear-gradient(0deg, rgba(0, 0, 0, 0.85) 0, rgba(0, 0, 0, 0.45) 60%, transparent);padding:0 15px;opacity:0;transition:opacity .1s ease}.video-player__controls.active{opacity:1}.video-player.inactive video,.video-player.inactive .video-player__controls{visibility:hidden}.video-player__spoiler{display:none;position:absolute;top:0;left:0;width:100%;height:100%;z-index:4;border:0;background:#000;color:#282c37;transition:none;pointer-events:none}.video-player__spoiler.active{display:block;pointer-events:auto}.video-player__spoiler.active:hover,.video-player__spoiler.active:active,.video-player__spoiler.active:focus{color:#191b22}.video-player__spoiler__title{display:block;font-size:14px}.video-player__spoiler__subtitle{display:block;font-size:11px;font-weight:500}.video-player__buttons-bar{display:flex;justify-content:space-between;padding-bottom:10px}.video-player__buttons-bar .video-player__download__icon{color:inherit}.video-player__buttons-bar .video-player__download__icon .fa,.video-player__buttons-bar .video-player__download__icon:active .fa,.video-player__buttons-bar .video-player__download__icon:hover .fa,.video-player__buttons-bar .video-player__download__icon:focus .fa{color:inherit}.video-player__buttons{font-size:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.video-player__buttons.left button{padding-left:0}.video-player__buttons.right button{padding-right:0}.video-player__buttons button{background:transparent;padding:2px 10px;font-size:16px;border:0;color:rgba(255,255,255,.75)}.video-player__buttons button:active,.video-player__buttons button:hover,.video-player__buttons button:focus{color:#fff}.video-player__time-sep,.video-player__time-total,.video-player__time-current{font-size:14px;font-weight:500}.video-player__time-current{color:#fff;margin-left:60px}.video-player__time-sep{display:inline-block;margin:0 6px}.video-player__time-sep,.video-player__time-total{color:#fff}.video-player__volume{cursor:pointer;height:24px;display:inline}.video-player__volume::before{content:\"\";width:50px;background:rgba(255,255,255,.35);border-radius:4px;display:block;position:absolute;height:4px;left:70px;bottom:20px}.video-player__volume__current{display:block;position:absolute;height:4px;border-radius:4px;left:70px;bottom:20px;background:#217aba}.video-player__volume__handle{position:absolute;z-index:3;border-radius:50%;width:12px;height:12px;bottom:16px;left:70px;transition:opacity .1s ease;background:#217aba;box-shadow:1px 2px 6px rgba(0,0,0,.2);pointer-events:none}.video-player__link{padding:2px 10px}.video-player__link a{text-decoration:none;font-size:14px;font-weight:500;color:#fff}.video-player__link a:hover,.video-player__link a:active,.video-player__link a:focus{text-decoration:underline}.video-player__seek{cursor:pointer;height:24px;position:relative}.video-player__seek::before{content:\"\";width:100%;background:rgba(255,255,255,.35);border-radius:4px;display:block;position:absolute;height:4px;top:10px}.video-player__seek__progress,.video-player__seek__buffer{display:block;position:absolute;height:4px;border-radius:4px;top:10px;background:#217aba}.video-player__seek__buffer{background:rgba(255,255,255,.2)}.video-player__seek__handle{position:absolute;z-index:3;opacity:0;border-radius:50%;width:12px;height:12px;top:6px;margin-left:-6px;transition:opacity .1s ease;background:#217aba;box-shadow:1px 2px 6px rgba(0,0,0,.2);pointer-events:none}.video-player__seek__handle.active{opacity:1}.video-player__seek:hover .video-player__seek__handle{opacity:1}.video-player.detailed .video-player__buttons button,.video-player.fullscreen .video-player__buttons button{padding-top:10px;padding-bottom:10px}.sensitive-info{display:flex;flex-direction:row;align-items:center;position:absolute;top:4px;left:4px;z-index:100}.sensitive-marker{margin:0 3px;border-radius:2px;padding:2px 6px;color:rgba(0,0,0,.8);background:rgba(255,255,255,.5);font-size:12px;line-height:18px;text-transform:uppercase;opacity:.9;transition:opacity .1s ease}.media-gallery:hover .sensitive-marker{opacity:1}.list-editor{background:#d9e1e8;flex-direction:column;border-radius:8px;box-shadow:2px 4px 15px rgba(0,0,0,.4);width:380px;overflow:hidden}@media screen and (max-width: 420px){.list-editor{width:90%}}.list-editor h4{padding:15px 0;background:#b0c0cf;font-weight:500;font-size:16px;text-align:center;border-radius:8px 8px 0 0}.list-editor .drawer__pager{height:50vh}.list-editor .drawer__inner{border-radius:0 0 8px 8px}.list-editor .drawer__inner.backdrop{width:calc(100% - 60px);box-shadow:2px 4px 15px rgba(0,0,0,.4);border-radius:0 0 0 8px}.list-editor__accounts{overflow-y:auto}.list-editor .account__display-name:hover strong{text-decoration:none}.list-editor .account__avatar{cursor:default}.list-editor .search{margin-bottom:0}.list-adder{background:#d9e1e8;flex-direction:column;border-radius:8px;box-shadow:2px 4px 15px rgba(0,0,0,.4);width:380px;overflow:hidden}@media screen and (max-width: 420px){.list-adder{width:90%}}.list-adder__account{background:#b0c0cf}.list-adder__lists{background:#b0c0cf;height:50vh;border-radius:0 0 8px 8px;overflow-y:auto}.list-adder .list{padding:10px;border-bottom:1px solid #c0cdd9}.list-adder .list__wrapper{display:flex}.list-adder .list__display-name{flex:1 1 auto;overflow:hidden;text-decoration:none;font-size:16px;padding:10px}.emoji-mart{font-size:13px;display:inline-block;color:#000}.emoji-mart,.emoji-mart *{box-sizing:border-box;line-height:1.15}.emoji-mart .emoji-mart-emoji{padding:6px}.emoji-mart-bar{border:0 solid #393f4f}.emoji-mart-bar:first-child{border-bottom-width:1px;border-top-left-radius:5px;border-top-right-radius:5px;background:#282c37}.emoji-mart-bar:last-child{border-top-width:1px;border-bottom-left-radius:5px;border-bottom-right-radius:5px;display:none}.emoji-mart-anchors{display:flex;justify-content:space-between;padding:0 6px;color:#282c37;line-height:0}.emoji-mart-anchor{position:relative;flex:1;text-align:center;padding:12px 4px;overflow:hidden;transition:color .1s ease-out;cursor:pointer}.emoji-mart-anchor:hover{color:#313543}.emoji-mart-anchor-selected{color:#2b90d9}.emoji-mart-anchor-selected:hover{color:#3c99dc}.emoji-mart-anchor-selected .emoji-mart-anchor-bar{bottom:0}.emoji-mart-anchor-bar{position:absolute;bottom:-3px;left:0;width:100%;height:3px;background-color:#3897db}.emoji-mart-anchors i{display:inline-block;width:100%;max-width:22px}.emoji-mart-anchors svg{fill:currentColor;max-height:18px}.emoji-mart-scroll{overflow-y:scroll;height:270px;max-height:35vh;padding:0 6px 6px;background:#fff;will-change:transform}.emoji-mart-scroll::-webkit-scrollbar-track:hover,.emoji-mart-scroll::-webkit-scrollbar-track:active{background-color:rgba(255,255,255,.3)}.emoji-mart-search{padding:10px;padding-right:45px;background:#fff}.emoji-mart-search input{font-size:14px;font-weight:400;padding:7px 9px;font-family:inherit;display:block;width:100%;background:rgba(40,44,55,.3);color:#000;border:1px solid #282c37;border-radius:4px}.emoji-mart-search input::-moz-focus-inner{border:0}.emoji-mart-search input::-moz-focus-inner,.emoji-mart-search input:focus,.emoji-mart-search input:active{outline:0 !important}.emoji-mart-category .emoji-mart-emoji{cursor:pointer}.emoji-mart-category .emoji-mart-emoji span{z-index:1;position:relative;text-align:center}.emoji-mart-category .emoji-mart-emoji:hover::before{z-index:0;content:\"\";position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(40,44,55,.7);border-radius:100%}.emoji-mart-category-label{z-index:2;position:relative;position:-webkit-sticky;position:sticky;top:0}.emoji-mart-category-label span{display:block;width:100%;font-weight:500;padding:5px 6px;background:#fff}.emoji-mart-emoji{position:relative;display:inline-block;font-size:0}.emoji-mart-emoji span{width:22px;height:22px}.emoji-mart-no-results{font-size:14px;text-align:center;padding-top:70px;color:#444b5d}.emoji-mart-no-results .emoji-mart-category-label{display:none}.emoji-mart-no-results .emoji-mart-no-results-label{margin-top:.2em}.emoji-mart-no-results .emoji-mart-emoji:hover::before{content:none}.emoji-mart-preview{display:none}.glitch.local-settings{position:relative;display:flex;flex-direction:row;background:#282c37;color:#000;border-radius:8px;height:80vh;width:80vw;max-width:740px;max-height:450px;overflow:hidden}.glitch.local-settings label,.glitch.local-settings legend{display:block;font-size:14px}.glitch.local-settings .boolean label,.glitch.local-settings .radio_buttons label{position:relative;padding-left:28px;padding-top:3px}.glitch.local-settings .boolean label input,.glitch.local-settings .radio_buttons label input{position:absolute;left:0;top:0}.glitch.local-settings span.hint{display:block;color:#282c37}.glitch.local-settings h1{font-size:18px;font-weight:500;line-height:24px;margin-bottom:20px}.glitch.local-settings h2{font-size:15px;font-weight:500;line-height:20px;margin-top:20px;margin-bottom:10px}.glitch.local-settings__navigation__item{display:block;padding:15px 20px;color:inherit;background:#17191f;border-bottom:1px #282c37 solid;cursor:pointer;text-decoration:none;outline:none;transition:background .3s}.glitch.local-settings__navigation__item .text-icon-button{color:inherit;transition:unset}.glitch.local-settings__navigation__item:hover{background:#282c37}.glitch.local-settings__navigation__item.active{background:#2b90d9;color:#000}.glitch.local-settings__navigation__item.close,.glitch.local-settings__navigation__item.close:hover{background:#df405a;color:#000}.glitch.local-settings__navigation{background:#17191f;width:212px;font-size:15px;line-height:20px;overflow-y:auto}.glitch.local-settings__page{display:block;flex:auto;padding:15px 20px 15px 20px;width:360px;overflow-y:auto}.glitch.local-settings__page__item{margin-bottom:2px}.glitch.local-settings__page__item.string,.glitch.local-settings__page__item.radio_buttons{margin-top:10px;margin-bottom:10px}@media screen and (max-width: 630px){.glitch.local-settings__navigation{width:40px;flex-shrink:0}.glitch.local-settings__navigation__item{padding:10px}.glitch.local-settings__navigation__item span:last-of-type{display:none}}.error-boundary{color:#000;font-size:15px;line-height:20px}.error-boundary h1{font-size:26px;line-height:36px;font-weight:400;margin-bottom:8px}.error-boundary a{color:#000;text-decoration:underline}.error-boundary ul{list-style:disc;margin-left:0;padding-left:1em}.error-boundary textarea.web_app_crash-stacktrace{width:100%;resize:none;white-space:pre;font-family:monospace,monospace}.compose-panel{width:285px;margin-top:10px;display:flex;flex-direction:column;height:calc(100% - 10px);overflow-y:hidden}.compose-panel .search__input{line-height:18px;font-size:16px;padding:15px;padding-right:30px}.compose-panel .search__icon .fa{top:15px}.compose-panel .drawer--account{flex:0 1 48px}.compose-panel .flex-spacer{background:transparent}.compose-panel .composer{flex:1;overflow-y:hidden;display:flex;flex-direction:column;min-height:310px}.compose-panel .compose-form__autosuggest-wrapper{overflow-y:auto;background-color:#fff;border-radius:4px 4px 0 0;flex:0 1 auto}.compose-panel .autosuggest-textarea__textarea{overflow-y:hidden}.compose-panel .compose-form__upload-thumbnail{height:80px}.navigation-panel{margin-top:10px;margin-bottom:10px;height:calc(100% - 20px);overflow-y:auto;display:flex;flex-direction:column}.navigation-panel>a{flex:0 0 auto}.navigation-panel hr{flex:0 0 auto;border:0;background:transparent;border-top:1px solid #ccd7e0;margin:10px 0}.navigation-panel .flex-spacer{background:transparent}@media screen and (min-width: 600px){.tabs-bar__link span{display:inline}}.columns-area--mobile{flex-direction:column;width:100%;margin:0 auto}.columns-area--mobile .column,.columns-area--mobile .drawer{width:100%;height:100%;padding:0}.columns-area--mobile .directory__list{display:grid;grid-gap:10px;grid-template-columns:minmax(0, 50%) minmax(0, 50%)}@media screen and (max-width: 415px){.columns-area--mobile .directory__list{display:block}}.columns-area--mobile .directory__card{margin-bottom:0}.columns-area--mobile .filter-form{display:flex}.columns-area--mobile .autosuggest-textarea__textarea{font-size:16px}.columns-area--mobile .search__input{line-height:18px;font-size:16px;padding:15px;padding-right:30px}.columns-area--mobile .search__icon .fa{top:15px}.columns-area--mobile .scrollable{overflow:visible}@supports(display: grid){.columns-area--mobile .scrollable{contain:content}}@media screen and (min-width: 415px){.columns-area--mobile{padding:10px 0;padding-top:0}}@media screen and (min-width: 630px){.columns-area--mobile .detailed-status{padding:15px}.columns-area--mobile .detailed-status .media-gallery,.columns-area--mobile .detailed-status .video-player,.columns-area--mobile .detailed-status .audio-player{margin-top:15px}.columns-area--mobile .account__header__bar{padding:5px 10px}.columns-area--mobile .navigation-bar,.columns-area--mobile .compose-form{padding:15px}.columns-area--mobile .compose-form .compose-form__publish .compose-form__publish-button-wrapper{padding-top:15px}.columns-area--mobile .status{padding:15px;min-height:50px}.columns-area--mobile .status .media-gallery,.columns-area--mobile .status__action-bar,.columns-area--mobile .status .video-player,.columns-area--mobile .status .audio-player{margin-top:10px}.columns-area--mobile .account{padding:15px 10px}.columns-area--mobile .account__header__bio{margin:0 -10px}.columns-area--mobile .notification__message{padding-top:15px}.columns-area--mobile .notification .status{padding-top:8px}.columns-area--mobile .notification .account{padding-top:8px}}.floating-action-button{position:fixed;display:flex;justify-content:center;align-items:center;width:3.9375rem;height:3.9375rem;bottom:1.3125rem;right:1.3125rem;background:#3897db;color:#fff;border-radius:50%;font-size:21px;line-height:21px;text-decoration:none;box-shadow:2px 3px 9px rgba(0,0,0,.4)}.floating-action-button:hover,.floating-action-button:focus,.floating-action-button:active{background:#227dbe}@media screen and (min-width: 415px){.tabs-bar{width:100%}.react-swipeable-view-container .columns-area--mobile{height:calc(100% - 10px) !important}.getting-started__wrapper,.search{margin-bottom:10px}}@media screen and (max-width: 895px){.columns-area__panels__pane--compositional{display:none}}@media screen and (min-width: 895px){.floating-action-button,.tabs-bar__link.optional{display:none}.search-page .search{display:none}}@media screen and (max-width: 1190px){.columns-area__panels__pane--navigational{display:none}}@media screen and (min-width: 1190px){.tabs-bar{display:none}}.announcements__item__content{word-wrap:break-word;overflow-y:auto}.announcements__item__content .emojione{width:20px;height:20px;margin:-3px 0 0}.announcements__item__content p{margin-bottom:10px;white-space:pre-wrap}.announcements__item__content p:last-child{margin-bottom:0}.announcements__item__content a{color:#282c37;text-decoration:none}.announcements__item__content a:hover{text-decoration:underline}.announcements__item__content a.mention:hover{text-decoration:none}.announcements__item__content a.mention:hover span{text-decoration:underline}.announcements__item__content a.unhandled-link{color:#217aba}.announcements{background:#c0cdd9;font-size:13px;display:flex;align-items:flex-end}.announcements__mastodon{width:124px;flex:0 0 auto}@media screen and (max-width: 424px){.announcements__mastodon{display:none}}.announcements__container{width:calc(100% - 124px);flex:0 0 auto;position:relative}@media screen and (max-width: 424px){.announcements__container{width:100%}}.announcements__item{box-sizing:border-box;width:100%;padding:15px;position:relative;font-size:15px;line-height:20px;word-wrap:break-word;font-weight:400;max-height:50vh;overflow:hidden;display:flex;flex-direction:column}.announcements__item__range{display:block;font-weight:500;margin-bottom:10px;padding-right:18px}.announcements__item__unread{position:absolute;top:19px;right:19px;display:block;background:#2b90d9;border-radius:50%;width:.625rem;height:.625rem}.announcements__pagination{padding:15px;color:#282c37;position:absolute;bottom:3px;right:0}.layout-multiple-columns .announcements__mastodon{display:none}.layout-multiple-columns .announcements__container{width:100%}.reactions-bar{display:flex;flex-wrap:wrap;align-items:center;margin-top:15px;margin-left:-2px;width:calc(100% - (90px - 33px))}.reactions-bar__item{flex-shrink:0;background:#b3c3d1;border:0;border-radius:3px;margin:2px;cursor:pointer;user-select:none;padding:0 6px;display:flex;align-items:center;transition:all 100ms ease-in;transition-property:background-color,color}.reactions-bar__item__emoji{display:block;margin:3px 0;width:16px;height:16px}.reactions-bar__item__emoji img{display:block;margin:0;width:100%;height:100%;min-width:auto;min-height:auto;vertical-align:bottom;object-fit:contain}.reactions-bar__item__count{display:block;min-width:9px;font-size:13px;font-weight:500;text-align:center;margin-left:6px;color:#282c37}.reactions-bar__item:hover,.reactions-bar__item:focus,.reactions-bar__item:active{background:#a6b9c9;transition:all 200ms ease-out;transition-property:background-color,color}.reactions-bar__item:hover__count,.reactions-bar__item:focus__count,.reactions-bar__item:active__count{color:#1f232b}.reactions-bar__item.active{transition:all 100ms ease-in;transition-property:background-color,color;background-color:#98b9d3}.reactions-bar__item.active .reactions-bar__item__count{color:#217aba}.reactions-bar .emoji-picker-dropdown{margin:2px}.reactions-bar:hover .emoji-button{opacity:.85}.reactions-bar .emoji-button{color:#282c37;margin:0;font-size:16px;width:auto;flex-shrink:0;padding:0 6px;height:22px;display:flex;align-items:center;opacity:.5;transition:all 100ms ease-in;transition-property:background-color,color}.reactions-bar .emoji-button:hover,.reactions-bar .emoji-button:active,.reactions-bar .emoji-button:focus{opacity:1;color:#1f232b;transition:all 200ms ease-out;transition-property:background-color,color}.reactions-bar--empty .emoji-button{padding:0}.poll{margin-top:16px;font-size:14px}.poll ul,.e-content .poll ul{margin:0;list-style:none}.poll li{margin-bottom:10px;position:relative}.poll__chart{border-radius:4px;display:block;background:#abbbd1;height:5px;min-width:1%}.poll__chart.leading{background:#2b90d9}.poll__option{position:relative;display:flex;padding:6px 0;line-height:18px;cursor:default;overflow:hidden}.poll__option__text{display:inline-block;word-wrap:break-word;overflow-wrap:break-word;max-width:calc(100% - 45px - 25px)}.poll__option input[type=radio],.poll__option input[type=checkbox]{display:none}.poll__option .autossugest-input{flex:1 1 auto}.poll__option input[type=text]{display:block;box-sizing:border-box;width:100%;font-size:14px;color:#000;display:block;outline:0;font-family:inherit;background:#fff;border:1px solid #fff;border-radius:4px;padding:6px 10px}.poll__option input[type=text]:focus{border-color:#2b90d9}.poll__option.selectable{cursor:pointer}.poll__option.editable{display:flex;align-items:center;overflow:visible}.poll__input{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:50%;vertical-align:middle;margin-top:auto;margin-bottom:auto;flex:0 0 18px}.poll__input.checkbox{border-radius:4px}.poll__input.active{border-color:#79bd9a;background:#79bd9a}.poll__input:active,.poll__input:focus,.poll__input:hover{border-color:#4d9c74;border-width:4px}.poll__input::-moz-focus-inner{outline:0 !important;border:0}.poll__input:focus,.poll__input:active{outline:0 !important}.poll__number{display:inline-block;width:45px;font-weight:700;flex:0 0 45px}.poll__voted{padding:0 5px;display:inline-block}.poll__voted__mark{font-size:18px}.poll__footer{padding-top:6px;padding-bottom:5px;color:#444b5d}.poll__link{display:inline;background:transparent;padding:0;margin:0;border:0;color:#444b5d;text-decoration:underline;font-size:inherit}.poll__link:hover{text-decoration:none}.poll__link:active,.poll__link:focus{background-color:rgba(68,75,93,.1)}.poll .button{height:36px;padding:0 16px;margin-right:10px;font-size:14px}.compose-form__poll-wrapper{border-top:1px solid #fff;overflow-x:hidden}.compose-form__poll-wrapper ul{padding:10px}.compose-form__poll-wrapper .poll__footer{border-top:1px solid #fff;padding:10px;display:flex;align-items:center}.compose-form__poll-wrapper .poll__footer button,.compose-form__poll-wrapper .poll__footer select{width:100%;flex:1 1 50%}.compose-form__poll-wrapper .poll__footer button:focus,.compose-form__poll-wrapper .poll__footer select:focus{border-color:#2b90d9}.compose-form__poll-wrapper .button.button-secondary{font-size:14px;font-weight:400;padding:6px 10px;height:auto;line-height:inherit;color:#606984;border-color:#606984;margin-right:5px}.compose-form__poll-wrapper li{display:flex;align-items:center}.compose-form__poll-wrapper li .poll__option{flex:0 0 auto;width:calc(100% - (23px + 6px));margin-right:6px}.compose-form__poll-wrapper select{appearance:none;box-sizing:border-box;font-size:14px;color:#000;display:inline-block;width:auto;outline:0;font-family:inherit;background:#fff url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center/auto 16px;border:1px solid #fff;border-radius:4px;padding:6px 10px;padding-right:30px}.compose-form__poll-wrapper .icon-button.disabled{color:#fff}.muted .poll{color:#444b5d}.muted .poll__chart{background:rgba(201,211,225,.2)}.muted .poll__chart.leading{background:rgba(43,144,217,.2)}.container{box-sizing:border-box;max-width:1235px;margin:0 auto;position:relative}@media screen and (max-width: 1255px){.container{width:100%;padding:0 10px}}.rich-formatting{font-family:sans-serif,sans-serif;font-size:14px;font-weight:400;line-height:1.7;word-wrap:break-word;color:#282c37}.rich-formatting a{color:#2b90d9;text-decoration:underline}.rich-formatting a:hover,.rich-formatting a:focus,.rich-formatting a:active{text-decoration:none}.rich-formatting p,.rich-formatting li{color:#282c37}.rich-formatting p{margin-top:0;margin-bottom:.85em}.rich-formatting p:last-child{margin-bottom:0}.rich-formatting strong{font-weight:700;color:#282c37}.rich-formatting em{font-style:italic;color:#282c37}.rich-formatting code{font-size:.85em;background:#f2f5f7;border-radius:4px;padding:.2em .3em}.rich-formatting h1,.rich-formatting h2,.rich-formatting h3,.rich-formatting h4,.rich-formatting h5,.rich-formatting h6{font-family:sans-serif,sans-serif;margin-top:1.275em;margin-bottom:.85em;font-weight:500;color:#282c37}.rich-formatting h1{font-size:2em}.rich-formatting h2{font-size:1.75em}.rich-formatting h3{font-size:1.5em}.rich-formatting h4{font-size:1.25em}.rich-formatting h5,.rich-formatting h6{font-size:1em}.rich-formatting ul{list-style:disc}.rich-formatting ol{list-style:decimal}.rich-formatting ul,.rich-formatting ol{margin:0;padding:0;padding-left:2em;margin-bottom:.85em}.rich-formatting ul[type=a],.rich-formatting ol[type=a]{list-style-type:lower-alpha}.rich-formatting ul[type=i],.rich-formatting ol[type=i]{list-style-type:lower-roman}.rich-formatting hr{width:100%;height:0;border:0;border-bottom:1px solid #ccd7e0;margin:1.7em 0}.rich-formatting hr.spacer{height:1px;border:0}.rich-formatting table{width:100%;border-collapse:collapse;break-inside:auto;margin-top:24px;margin-bottom:32px}.rich-formatting table thead tr,.rich-formatting table tbody tr{border-bottom:1px solid #ccd7e0;font-size:1em;line-height:1.625;font-weight:400;text-align:left;color:#282c37}.rich-formatting table thead tr{border-bottom-width:2px;line-height:1.5;font-weight:500;color:#444b5d}.rich-formatting table th,.rich-formatting table td{padding:8px;align-self:start;align-items:start;word-break:break-all}.rich-formatting table th.nowrap,.rich-formatting table td.nowrap{width:25%;position:relative}.rich-formatting table th.nowrap::before,.rich-formatting table td.nowrap::before{content:\" \";visibility:hidden}.rich-formatting table th.nowrap span,.rich-formatting table td.nowrap span{position:absolute;left:8px;right:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rich-formatting>:first-child{margin-top:0}.information-board{background:#e6ebf0;padding:20px 0}.information-board .container-alt{position:relative;padding-right:295px}.information-board__sections{display:flex;justify-content:space-between;flex-wrap:wrap}.information-board__section{flex:1 0 0;font-family:sans-serif,sans-serif;font-size:16px;line-height:28px;color:#000;text-align:right;padding:10px 15px}.information-board__section span,.information-board__section strong{display:block}.information-board__section span:last-child{color:#282c37}.information-board__section strong{font-family:sans-serif,sans-serif;font-weight:500;font-size:32px;line-height:48px}@media screen and (max-width: 700px){.information-board__section{text-align:center}}.information-board .panel{position:absolute;width:280px;box-sizing:border-box;background:#f2f5f7;padding:20px;padding-top:10px;border-radius:4px 4px 0 0;right:0;bottom:-40px}.information-board .panel .panel-header{font-family:sans-serif,sans-serif;font-size:14px;line-height:24px;font-weight:500;color:#282c37;padding-bottom:5px;margin-bottom:15px;border-bottom:1px solid #ccd7e0;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.information-board .panel .panel-header a,.information-board .panel .panel-header span{font-weight:400;color:#3d4455}.information-board .panel .panel-header a{text-decoration:none}.information-board .owner{text-align:center}.information-board .owner .avatar{width:80px;height:80px;width:80px;height:80px;background-size:80px 80px;margin:0 auto;margin-bottom:15px}.information-board .owner .avatar img{display:block;width:80px;height:80px;border-radius:48px;border-radius:8%;background-position:50%;background-clip:padding-box}.information-board .owner .name{font-size:14px}.information-board .owner .name a{display:block;color:#000;text-decoration:none}.information-board .owner .name a:hover .display_name{text-decoration:underline}.information-board .owner .name .username{display:block;color:#282c37}.landing-page p,.landing-page li{font-family:sans-serif,sans-serif;font-size:16px;font-weight:400;font-size:16px;line-height:30px;margin-bottom:12px;color:#282c37}.landing-page p a,.landing-page li a{color:#2b90d9;text-decoration:underline}.landing-page em{display:inline;margin:0;padding:0;font-weight:700;background:transparent;font-family:inherit;font-size:inherit;line-height:inherit;color:#131419}.landing-page h1{font-family:sans-serif,sans-serif;font-size:26px;line-height:30px;font-weight:500;margin-bottom:20px;color:#282c37}.landing-page h1 small{font-family:sans-serif,sans-serif;display:block;font-size:18px;font-weight:400;color:#131419}.landing-page h2{font-family:sans-serif,sans-serif;font-size:22px;line-height:26px;font-weight:500;margin-bottom:20px;color:#282c37}.landing-page h3{font-family:sans-serif,sans-serif;font-size:18px;line-height:24px;font-weight:500;margin-bottom:20px;color:#282c37}.landing-page h4{font-family:sans-serif,sans-serif;font-size:16px;line-height:24px;font-weight:500;margin-bottom:20px;color:#282c37}.landing-page h5{font-family:sans-serif,sans-serif;font-size:14px;line-height:24px;font-weight:500;margin-bottom:20px;color:#282c37}.landing-page h6{font-family:sans-serif,sans-serif;font-size:12px;line-height:24px;font-weight:500;margin-bottom:20px;color:#282c37}.landing-page ul,.landing-page ol{margin-left:20px}.landing-page ul[type=a],.landing-page ol[type=a]{list-style-type:lower-alpha}.landing-page ul[type=i],.landing-page ol[type=i]{list-style-type:lower-roman}.landing-page ul{list-style:disc}.landing-page ol{list-style:decimal}.landing-page li>ol,.landing-page li>ul{margin-top:6px}.landing-page hr{width:100%;height:0;border:0;border-bottom:1px solid rgba(60,80,99,.6);margin:20px 0}.landing-page hr.spacer{height:1px;border:0}.landing-page__information,.landing-page__forms{padding:20px}.landing-page__call-to-action{background:#d9e1e8;border-radius:4px;padding:25px 40px;overflow:hidden;box-sizing:border-box}.landing-page__call-to-action .row{width:100%;display:flex;flex-direction:row-reverse;flex-wrap:nowrap;justify-content:space-between;align-items:center}.landing-page__call-to-action .row__information-board{display:flex;justify-content:flex-end;align-items:flex-end}.landing-page__call-to-action .row__information-board .information-board__section{flex:1 0 auto;padding:0 10px}@media screen and (max-width: 415px){.landing-page__call-to-action .row__information-board{width:100%;justify-content:space-between}}.landing-page__call-to-action .row__mascot{flex:1;margin:10px -50px 0 0}@media screen and (max-width: 415px){.landing-page__call-to-action .row__mascot{display:none}}.landing-page__logo{margin-right:20px}.landing-page__logo img{height:50px;width:auto;mix-blend-mode:lighten}.landing-page__information{padding:45px 40px;margin-bottom:10px}.landing-page__information:last-child{margin-bottom:0}.landing-page__information strong{font-weight:500;color:#131419}.landing-page__information .account{border-bottom:0;padding:0}.landing-page__information .account__display-name{align-items:center;display:flex;margin-right:5px}.landing-page__information .account div.account__display-name:hover .display-name strong{text-decoration:none}.landing-page__information .account div.account__display-name .account__avatar{cursor:default}.landing-page__information .account__avatar-wrapper{margin-left:0;flex:0 0 auto}.landing-page__information .account__avatar{width:44px;height:44px;background-size:44px 44px;width:44px;height:44px;background-size:44px 44px}.landing-page__information .account .display-name{font-size:15px}.landing-page__information .account .display-name__account{font-size:14px}@media screen and (max-width: 960px){.landing-page__information .contact{margin-top:30px}}@media screen and (max-width: 700px){.landing-page__information{padding:25px 20px}}.landing-page__information,.landing-page__forms,.landing-page #mastodon-timeline{box-sizing:border-box;background:#d9e1e8;border-radius:4px;box-shadow:0 0 6px rgba(0,0,0,.1)}.landing-page__mascot{height:104px;position:relative;left:-40px;bottom:25px}.landing-page__mascot img{height:190px;width:auto}.landing-page__short-description .row{display:flex;flex-wrap:wrap;align-items:center;margin-bottom:40px}@media screen and (max-width: 700px){.landing-page__short-description .row{margin-bottom:20px}}.landing-page__short-description p a{color:#282c37}.landing-page__short-description h1{font-weight:500;color:#000;margin-bottom:0}.landing-page__short-description h1 small{color:#282c37}.landing-page__short-description h1 small span{color:#282c37}.landing-page__short-description p:last-child{margin-bottom:0}.landing-page__hero{margin-bottom:10px}.landing-page__hero img{display:block;margin:0;max-width:100%;height:auto;border-radius:4px}@media screen and (max-width: 840px){.landing-page .information-board .container-alt{padding-right:20px}.landing-page .information-board .panel{position:static;margin-top:20px;width:100%;border-radius:4px}.landing-page .information-board .panel .panel-header{text-align:center}}@media screen and (max-width: 675px){.landing-page .header-wrapper{padding-top:0}.landing-page .header-wrapper.compact{padding-bottom:0}.landing-page .header-wrapper.compact .hero .heading{text-align:initial}.landing-page .header .container-alt,.landing-page .features .container-alt{display:block}}.landing-page .cta{margin:20px}.landing{margin-bottom:100px}@media screen and (max-width: 738px){.landing{margin-bottom:0}}.landing__brand{display:flex;justify-content:center;align-items:center;padding:50px}.landing__brand svg{fill:#000;height:52px}@media screen and (max-width: 415px){.landing__brand{padding:0;margin-bottom:30px}}.landing .directory{margin-top:30px;background:transparent;box-shadow:none;border-radius:0}.landing .hero-widget{margin-top:30px;margin-bottom:0}.landing .hero-widget h4{padding:10px;text-transform:uppercase;font-weight:700;font-size:13px;color:#282c37}.landing .hero-widget__text{border-radius:0;padding-bottom:0}.landing .hero-widget__footer{background:#d9e1e8;padding:10px;border-radius:0 0 4px 4px;display:flex}.landing .hero-widget__footer__column{flex:1 1 50%}.landing .hero-widget .account{padding:10px 0;border-bottom:0}.landing .hero-widget .account .account__display-name{display:flex;align-items:center}.landing .hero-widget .account .account__avatar{width:44px;height:44px;background-size:44px 44px}.landing .hero-widget__counter{padding:10px}.landing .hero-widget__counter strong{font-family:sans-serif,sans-serif;font-size:15px;font-weight:700;display:block}.landing .hero-widget__counter span{font-size:14px;color:#282c37}.landing .simple_form .user_agreement .label_input>label{font-weight:400;color:#282c37}.landing .simple_form p.lead{color:#282c37;font-size:15px;line-height:20px;font-weight:400;margin-bottom:25px}.landing__grid{max-width:960px;margin:0 auto;display:grid;grid-template-columns:minmax(0, 50%) minmax(0, 50%);grid-gap:30px}@media screen and (max-width: 738px){.landing__grid{grid-template-columns:minmax(0, 100%);grid-gap:10px}.landing__grid__column-login{grid-row:1;display:flex;flex-direction:column}.landing__grid__column-login .box-widget{order:2;flex:0 0 auto}.landing__grid__column-login .hero-widget{margin-top:0;margin-bottom:10px;order:1;flex:0 0 auto}.landing__grid__column-registration{grid-row:2}.landing__grid .directory{margin-top:10px}}@media screen and (max-width: 415px){.landing__grid{grid-gap:0}.landing__grid .hero-widget{display:block;margin-bottom:0;box-shadow:none}.landing__grid .hero-widget__img,.landing__grid .hero-widget__img img,.landing__grid .hero-widget__footer{border-radius:0}.landing__grid .hero-widget,.landing__grid .box-widget,.landing__grid .directory__tag{border-bottom:1px solid #c0cdd9}.landing__grid .directory{margin-top:0}.landing__grid .directory__tag{margin-bottom:0}.landing__grid .directory__tag>a,.landing__grid .directory__tag>div{border-radius:0;box-shadow:none}.landing__grid .directory__tag:last-child{border-bottom:0}}.brand{position:relative;text-decoration:none}.brand__tagline{display:block;position:absolute;bottom:-10px;left:50px;width:300px;color:#9baec8;text-decoration:none;font-size:14px}@media screen and (max-width: 415px){.brand__tagline{position:static;width:auto;margin-top:20px;color:#444b5d}}.table{width:100%;max-width:100%;border-spacing:0;border-collapse:collapse}.table th,.table td{padding:8px;line-height:18px;vertical-align:top;border-top:1px solid #d9e1e8;text-align:left;background:#e6ebf0}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #d9e1e8;border-top:0;font-weight:500}.table>tbody>tr>th{font-weight:500}.table>tbody>tr:nth-child(odd)>td,.table>tbody>tr:nth-child(odd)>th{background:#d9e1e8}.table a{color:#2b90d9;text-decoration:underline}.table a:hover{text-decoration:none}.table strong{font-weight:500}.table strong:lang(ja){font-weight:700}.table strong:lang(ko){font-weight:700}.table strong:lang(zh-CN){font-weight:700}.table strong:lang(zh-HK){font-weight:700}.table strong:lang(zh-TW){font-weight:700}.table.inline-table>tbody>tr:nth-child(odd)>td,.table.inline-table>tbody>tr:nth-child(odd)>th{background:transparent}.table.inline-table>tbody>tr:first-child>td,.table.inline-table>tbody>tr:first-child>th{border-top:0}.table.batch-table>thead>tr>th{background:#d9e1e8;border-top:1px solid #f2f5f7;border-bottom:1px solid #f2f5f7}.table.batch-table>thead>tr>th:first-child{border-radius:4px 0 0;border-left:1px solid #f2f5f7}.table.batch-table>thead>tr>th:last-child{border-radius:0 4px 0 0;border-right:1px solid #f2f5f7}.table--invites tbody td{vertical-align:middle}.table-wrapper{overflow:auto;margin-bottom:20px}samp{font-family:monospace,monospace}button.table-action-link{background:transparent;border:0;font:inherit}button.table-action-link,a.table-action-link{text-decoration:none;display:inline-block;margin-right:5px;padding:0 10px;color:#282c37;font-weight:500}button.table-action-link:hover,a.table-action-link:hover{color:#000}button.table-action-link i.fa,a.table-action-link i.fa{font-weight:400;margin-right:5px}button.table-action-link:first-child,a.table-action-link:first-child{padding-left:0}.batch-table__toolbar,.batch-table__row{display:flex}.batch-table__toolbar__select,.batch-table__row__select{box-sizing:border-box;padding:8px 16px;cursor:pointer;min-height:100%}.batch-table__toolbar__select input,.batch-table__row__select input{margin-top:8px}.batch-table__toolbar__select--aligned,.batch-table__row__select--aligned{display:flex;align-items:center}.batch-table__toolbar__select--aligned input,.batch-table__row__select--aligned input{margin-top:0}.batch-table__toolbar__actions,.batch-table__toolbar__content,.batch-table__row__actions,.batch-table__row__content{padding:8px 0;padding-right:16px;flex:1 1 auto}.batch-table__toolbar{border:1px solid #f2f5f7;background:#d9e1e8;border-radius:4px 0 0;height:47px;align-items:center}.batch-table__toolbar__actions{text-align:right;padding-right:11px}.batch-table__form{padding:16px;border:1px solid #f2f5f7;border-top:0;background:#d9e1e8}.batch-table__form .fields-row{padding-top:0;margin-bottom:0}.batch-table__row{border:1px solid #f2f5f7;border-top:0;background:#e6ebf0}@media screen and (max-width: 415px){.optional .batch-table__row:first-child{border-top:1px solid #f2f5f7}}.batch-table__row:hover{background:#dfe6ec}.batch-table__row:nth-child(even){background:#d9e1e8}.batch-table__row:nth-child(even):hover{background:#d3dce4}.batch-table__row__content{padding-top:12px;padding-bottom:16px}.batch-table__row__content--unpadded{padding:0}.batch-table__row__content--with-image{display:flex;align-items:center}.batch-table__row__content__image{flex:0 0 auto;display:flex;justify-content:center;align-items:center;margin-right:10px}.batch-table__row__content__image .emojione{width:32px;height:32px}.batch-table__row__content__text{flex:1 1 auto}.batch-table__row__content__extra{flex:0 0 auto;text-align:right;color:#282c37;font-weight:500}.batch-table__row .directory__tag{margin:0;width:100%}.batch-table__row .directory__tag a{background:transparent;border-radius:0}@media screen and (max-width: 415px){.batch-table.optional .batch-table__toolbar,.batch-table.optional .batch-table__row__select{display:none}}.batch-table .status__content{padding-top:0}.batch-table .status__content strong{font-weight:700}.batch-table .nothing-here{border:1px solid #f2f5f7;border-top:0;box-shadow:none}@media screen and (max-width: 415px){.batch-table .nothing-here{border-top:1px solid #f2f5f7}}@media screen and (max-width: 870px){.batch-table .accounts-table tbody td.optional{display:none}}.admin-wrapper{display:flex;justify-content:center;width:100%;min-height:100vh}.admin-wrapper .sidebar-wrapper{min-height:100vh;overflow:hidden;pointer-events:none;flex:1 1 auto}.admin-wrapper .sidebar-wrapper__inner{display:flex;justify-content:flex-end;background:#d9e1e8;height:100%}.admin-wrapper .sidebar{width:240px;padding:0;pointer-events:auto}.admin-wrapper .sidebar__toggle{display:none;background:#c0cdd9;height:48px}.admin-wrapper .sidebar__toggle__logo{flex:1 1 auto}.admin-wrapper .sidebar__toggle__logo a{display:inline-block;padding:15px}.admin-wrapper .sidebar__toggle__logo svg{fill:#000;height:20px;position:relative;bottom:-2px}.admin-wrapper .sidebar__toggle__icon{display:block;color:#282c37;text-decoration:none;flex:0 0 auto;font-size:20px;padding:15px}.admin-wrapper .sidebar__toggle a:hover,.admin-wrapper .sidebar__toggle a:focus,.admin-wrapper .sidebar__toggle a:active{background:#b3c3d1}.admin-wrapper .sidebar .logo{display:block;margin:40px auto;width:100px;height:100px}@media screen and (max-width: 600px){.admin-wrapper .sidebar>a:first-child{display:none}}.admin-wrapper .sidebar ul{list-style:none;border-radius:4px 0 0 4px;overflow:hidden;margin-bottom:20px}@media screen and (max-width: 600px){.admin-wrapper .sidebar ul{margin-bottom:0}}.admin-wrapper .sidebar ul a{display:block;padding:15px;color:#282c37;text-decoration:none;transition:all 200ms linear;transition-property:color,background-color;border-radius:4px 0 0 4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.admin-wrapper .sidebar ul a i.fa{margin-right:5px}.admin-wrapper .sidebar ul a:hover{color:#000;background-color:#e9eef2;transition:all 100ms linear;transition-property:color,background-color}.admin-wrapper .sidebar ul a.selected{background:#dfe6ec;border-radius:4px 0 0}.admin-wrapper .sidebar ul ul{background:#e6ebf0;border-radius:0 0 0 4px;margin:0}.admin-wrapper .sidebar ul ul a{border:0;padding:15px 35px}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a{color:#000;background-color:#2b90d9;border-bottom:0;border-radius:0}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a:hover{background-color:#2482c7}.admin-wrapper .sidebar>ul>.simple-navigation-active-leaf a{border-radius:4px 0 0 4px}.admin-wrapper .content-wrapper{box-sizing:border-box;width:100%;max-width:840px;flex:1 1 auto}@media screen and (max-width: 1080px){.admin-wrapper .sidebar-wrapper--empty{display:none}.admin-wrapper .sidebar-wrapper{width:240px;flex:0 0 auto}}@media screen and (max-width: 600px){.admin-wrapper .sidebar-wrapper{width:100%}}.admin-wrapper .content{padding:20px 15px;padding-top:60px;padding-left:25px}@media screen and (max-width: 600px){.admin-wrapper .content{max-width:none;padding:15px;padding-top:30px}}.admin-wrapper .content-heading{display:flex;padding-bottom:40px;border-bottom:1px solid #c0cdd9;margin:-15px -15px 40px 0;flex-wrap:wrap;align-items:center;justify-content:space-between}.admin-wrapper .content-heading>*{margin-top:15px;margin-right:15px}.admin-wrapper .content-heading-actions{display:inline-flex}.admin-wrapper .content-heading-actions>:not(:first-child){margin-left:5px}@media screen and (max-width: 600px){.admin-wrapper .content-heading{border-bottom:0;padding-bottom:0}}.admin-wrapper .content h2{color:#282c37;font-size:24px;line-height:28px;font-weight:400}@media screen and (max-width: 600px){.admin-wrapper .content h2{font-weight:700}}.admin-wrapper .content h3{color:#282c37;font-size:20px;line-height:28px;font-weight:400;margin-bottom:30px}.admin-wrapper .content h4{text-transform:uppercase;font-size:13px;font-weight:700;color:#282c37;padding-bottom:8px;margin-bottom:8px;border-bottom:1px solid #c0cdd9}.admin-wrapper .content h6{font-size:16px;color:#282c37;line-height:28px;font-weight:500}.admin-wrapper .content .fields-group h6{color:#000;font-weight:500}.admin-wrapper .content .directory__tag>a,.admin-wrapper .content .directory__tag>div{box-shadow:none}.admin-wrapper .content .directory__tag .table-action-link .fa{color:inherit}.admin-wrapper .content .directory__tag h4{font-size:18px;font-weight:700;color:#000;text-transform:none;padding-bottom:0;margin-bottom:0;border-bottom:none}.admin-wrapper .content>p{font-size:14px;line-height:21px;color:#282c37;margin-bottom:20px}.admin-wrapper .content>p strong{color:#000;font-weight:500}.admin-wrapper .content>p strong:lang(ja){font-weight:700}.admin-wrapper .content>p strong:lang(ko){font-weight:700}.admin-wrapper .content>p strong:lang(zh-CN){font-weight:700}.admin-wrapper .content>p strong:lang(zh-HK){font-weight:700}.admin-wrapper .content>p strong:lang(zh-TW){font-weight:700}.admin-wrapper .content hr{width:100%;height:0;border:0;border-bottom:1px solid rgba(60,80,99,.6);margin:20px 0}.admin-wrapper .content hr.spacer{height:1px;border:0}@media screen and (max-width: 600px){.admin-wrapper{display:block}.admin-wrapper .sidebar-wrapper{min-height:0}.admin-wrapper .sidebar{width:100%;padding:0;height:auto}.admin-wrapper .sidebar__toggle{display:flex}.admin-wrapper .sidebar>ul{display:none}.admin-wrapper .sidebar ul a,.admin-wrapper .sidebar ul ul a{border-radius:0;border-bottom:1px solid #ccd7e0;transition:none}.admin-wrapper .sidebar ul a:hover,.admin-wrapper .sidebar ul ul a:hover{transition:none}.admin-wrapper .sidebar ul ul{border-radius:0}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a{border-bottom-color:#2b90d9}}hr.spacer{width:100%;border:0;margin:20px 0;height:1px}body .muted-hint,.admin-wrapper .content .muted-hint{color:#282c37}body .muted-hint a,.admin-wrapper .content .muted-hint a{color:#2b90d9}body .positive-hint,.admin-wrapper .content .positive-hint{color:#79bd9a;font-weight:500}body .negative-hint,.admin-wrapper .content .negative-hint{color:#df405a;font-weight:500}body .neutral-hint,.admin-wrapper .content .neutral-hint{color:#444b5d;font-weight:500}body .warning-hint,.admin-wrapper .content .warning-hint{color:#ca8f04;font-weight:500}.filters{display:flex;flex-wrap:wrap}.filters .filter-subset{flex:0 0 auto;margin:0 40px 20px 0}.filters .filter-subset:last-child{margin-bottom:30px}.filters .filter-subset ul{margin-top:5px;list-style:none}.filters .filter-subset ul li{display:inline-block;margin-right:5px}.filters .filter-subset strong{font-weight:500;text-transform:uppercase;font-size:12px}.filters .filter-subset strong:lang(ja){font-weight:700}.filters .filter-subset strong:lang(ko){font-weight:700}.filters .filter-subset strong:lang(zh-CN){font-weight:700}.filters .filter-subset strong:lang(zh-HK){font-weight:700}.filters .filter-subset strong:lang(zh-TW){font-weight:700}.filters .filter-subset--with-select strong{display:block;margin-bottom:10px}.filters .filter-subset a{display:inline-block;color:#282c37;text-decoration:none;text-transform:uppercase;font-size:12px;font-weight:500;border-bottom:2px solid #d9e1e8}.filters .filter-subset a:hover{color:#000;border-bottom:2px solid #c9d4de}.filters .filter-subset a.selected{color:#2b90d9;border-bottom:2px solid #2b90d9}.flavour-screen{display:block;margin:10px auto;max-width:100%}.flavour-description{display:block;font-size:16px;margin:10px 0}.flavour-description>p{margin:10px 0}.report-accounts{display:flex;flex-wrap:wrap;margin-bottom:20px}.report-accounts__item{display:flex;flex:250px;flex-direction:column;margin:0 5px}.report-accounts__item>strong{display:block;margin:0 0 10px -5px;font-weight:500;font-size:14px;line-height:18px;color:#282c37}.report-accounts__item>strong:lang(ja){font-weight:700}.report-accounts__item>strong:lang(ko){font-weight:700}.report-accounts__item>strong:lang(zh-CN){font-weight:700}.report-accounts__item>strong:lang(zh-HK){font-weight:700}.report-accounts__item>strong:lang(zh-TW){font-weight:700}.report-accounts__item .account-card{flex:1 1 auto}.report-status,.account-status{display:flex;margin-bottom:10px}.report-status .activity-stream,.account-status .activity-stream{flex:2 0 0;margin-right:20px;max-width:calc(100% - 60px)}.report-status .activity-stream .entry,.account-status .activity-stream .entry{border-radius:4px}.report-status__actions,.account-status__actions{flex:0 0 auto;display:flex;flex-direction:column}.report-status__actions .icon-button,.account-status__actions .icon-button{font-size:24px;width:24px;text-align:center;margin-bottom:10px}.simple_form.new_report_note,.simple_form.new_account_moderation_note{max-width:100%}.batch-form-box{display:flex;flex-wrap:wrap;margin-bottom:5px}.batch-form-box #form_status_batch_action{margin:0 5px 5px 0;font-size:14px}.batch-form-box input.button{margin:0 5px 5px 0}.batch-form-box .media-spoiler-toggle-buttons{margin-left:auto}.batch-form-box .media-spoiler-toggle-buttons .button{overflow:visible;margin:0 0 5px 5px;float:right}.back-link{margin-bottom:10px;font-size:14px}.back-link a{color:#2b90d9;text-decoration:none}.back-link a:hover{text-decoration:underline}.spacer{flex:1 1 auto}.log-entry{line-height:20px;padding:15px 0;background:#d9e1e8;border-bottom:1px solid #ccd7e0}.log-entry:last-child{border-bottom:0}.log-entry__header{display:flex;justify-content:flex-start;align-items:center;color:#282c37;font-size:14px;padding:0 10px}.log-entry__avatar{margin-right:10px}.log-entry__avatar .avatar{display:block;margin:0;border-radius:50%;width:40px;height:40px}.log-entry__content{max-width:calc(100% - 90px)}.log-entry__title{word-wrap:break-word}.log-entry__timestamp{color:#444b5d}.log-entry a,.log-entry .username,.log-entry .target{color:#282c37;text-decoration:none;font-weight:500}a.name-tag,.name-tag,a.inline-name-tag,.inline-name-tag{text-decoration:none;color:#282c37}a.name-tag .username,.name-tag .username,a.inline-name-tag .username,.inline-name-tag .username{font-weight:500}a.name-tag.suspended .username,.name-tag.suspended .username,a.inline-name-tag.suspended .username,.inline-name-tag.suspended .username{text-decoration:line-through;color:#c1203b}a.name-tag.suspended .avatar,.name-tag.suspended .avatar,a.inline-name-tag.suspended .avatar,.inline-name-tag.suspended .avatar{filter:grayscale(100%);opacity:.8}a.name-tag,.name-tag{display:flex;align-items:center}a.name-tag .avatar,.name-tag .avatar{display:block;margin:0;margin-right:5px;border-radius:50%}a.name-tag.suspended .avatar,.name-tag.suspended .avatar{filter:grayscale(100%);opacity:.8}.speech-bubble{margin-bottom:20px;border-left:4px solid #2b90d9}.speech-bubble.positive{border-left-color:#79bd9a}.speech-bubble.negative{border-left-color:#c1203b}.speech-bubble.warning{border-left-color:#ca8f04}.speech-bubble__bubble{padding:16px;padding-left:14px;font-size:15px;line-height:20px;border-radius:4px 4px 4px 0;position:relative;font-weight:500}.speech-bubble__bubble a{color:#282c37}.speech-bubble__owner{padding:8px;padding-left:12px}.speech-bubble time{color:#444b5d}.report-card{background:#d9e1e8;border-radius:4px;margin-bottom:20px}.report-card__profile{display:flex;justify-content:space-between;align-items:center;padding:15px}.report-card__profile .account{padding:0;border:0}.report-card__profile .account__avatar-wrapper{margin-left:0}.report-card__profile__stats{flex:0 0 auto;font-weight:500;color:#282c37;text-transform:uppercase;text-align:right}.report-card__profile__stats a{color:inherit;text-decoration:none}.report-card__profile__stats a:focus,.report-card__profile__stats a:hover,.report-card__profile__stats a:active{color:#17191f}.report-card__profile__stats .red{color:#df405a}.report-card__summary__item{display:flex;justify-content:flex-start;border-top:1px solid #e6ebf0}.report-card__summary__item:hover{background:#d3dce4}.report-card__summary__item__reported-by,.report-card__summary__item__assigned{padding:15px;flex:0 0 auto;box-sizing:border-box;width:150px;color:#282c37}.report-card__summary__item__reported-by,.report-card__summary__item__reported-by .username,.report-card__summary__item__assigned,.report-card__summary__item__assigned .username{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.report-card__summary__item__content{flex:1 1 auto;max-width:calc(100% - 300px)}.report-card__summary__item__content__icon{color:#444b5d;margin-right:4px;font-weight:500}.report-card__summary__item__content a{display:block;box-sizing:border-box;width:100%;padding:15px;text-decoration:none;color:#282c37}.one-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ellipsized-ip{display:inline-block;max-width:120px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.admin-account-bio{display:flex;flex-wrap:wrap;margin:0 -5px;margin-top:20px}.admin-account-bio>div{box-sizing:border-box;padding:0 5px;margin-bottom:10px;flex:1 0 50%}.admin-account-bio .account__header__fields,.admin-account-bio .account__header__content{background:#c0cdd9;border-radius:4px;height:100%}.admin-account-bio .account__header__fields{margin:0;border:0}.admin-account-bio .account__header__fields a{color:#217aba}.admin-account-bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.admin-account-bio .account__header__fields .verified a{color:#79bd9a}.admin-account-bio .account__header__content{box-sizing:border-box;padding:20px;color:#000}.center-text{text-align:center}.announcements-list{border:1px solid #ccd7e0;border-radius:4px}.announcements-list__item{padding:15px 0;background:#d9e1e8;border-bottom:1px solid #ccd7e0}.announcements-list__item__title{padding:0 15px;display:block;font-weight:500;font-size:18px;line-height:1.5;color:#282c37;text-decoration:none;margin-bottom:10px}.announcements-list__item__title:hover,.announcements-list__item__title:focus,.announcements-list__item__title:active{color:#000}.announcements-list__item__meta{padding:0 15px;color:#444b5d}.announcements-list__item__action-bar{display:flex;justify-content:space-between;align-items:center}.announcements-list__item:last-child{border-bottom:0}.emojione[title=\":wind_blowing_face:\"],.emojione[title=\":white_small_square:\"],.emojione[title=\":white_medium_square:\"],.emojione[title=\":white_medium_small_square:\"],.emojione[title=\":white_large_square:\"],.emojione[title=\":white_circle:\"],.emojione[title=\":waxing_crescent_moon:\"],.emojione[title=\":waving_white_flag:\"],.emojione[title=\":waning_gibbous_moon:\"],.emojione[title=\":waning_crescent_moon:\"],.emojione[title=\":volleyball:\"],.emojione[title=\":thought_balloon:\"],.emojione[title=\":speech_balloon:\"],.emojione[title=\":speaker:\"],.emojione[title=\":sound:\"],.emojione[title=\":snow_cloud:\"],.emojione[title=\":skull_and_crossbones:\"],.emojione[title=\":skull:\"],.emojione[title=\":sheep:\"],.emojione[title=\":rooster:\"],.emojione[title=\":rice_ball:\"],.emojione[title=\":rice:\"],.emojione[title=\":ram:\"],.emojione[title=\":rain_cloud:\"],.emojione[title=\":page_with_curl:\"],.emojione[title=\":mute:\"],.emojione[title=\":moon:\"],.emojione[title=\":loud_sound:\"],.emojione[title=\":lightning:\"],.emojione[title=\":last_quarter_moon_with_face:\"],.emojione[title=\":last_quarter_moon:\"],.emojione[title=\":ice_skate:\"],.emojione[title=\":grey_question:\"],.emojione[title=\":grey_exclamation:\"],.emojione[title=\":goat:\"],.emojione[title=\":ghost:\"],.emojione[title=\":full_moon_with_face:\"],.emojione[title=\":full_moon:\"],.emojione[title=\":fish_cake:\"],.emojione[title=\":first_quarter_moon_with_face:\"],.emojione[title=\":first_quarter_moon:\"],.emojione[title=\":eyes:\"],.emojione[title=\":dove_of_peace:\"],.emojione[title=\":dash:\"],.emojione[title=\":crescent_moon:\"],.emojione[title=\":cloud:\"],.emojione[title=\":chicken:\"],.emojione[title=\":chains:\"],.emojione[title=\":baseball:\"],.emojione[title=\":alien:\"]{filter:drop-shadow(1px 1px 0 #000000) drop-shadow(-1px 1px 0 #000000) drop-shadow(1px -1px 0 #000000) drop-shadow(-1px -1px 0 #000000)}.hicolor-privacy-icons .status__visibility-icon.fa-globe,.hicolor-privacy-icons .composer--options--dropdown--content--item .fa-globe{color:#1976d2}.hicolor-privacy-icons .status__visibility-icon.fa-unlock,.hicolor-privacy-icons .composer--options--dropdown--content--item .fa-unlock{color:#388e3c}.hicolor-privacy-icons .status__visibility-icon.fa-lock,.hicolor-privacy-icons .composer--options--dropdown--content--item .fa-lock{color:#ffa000}.hicolor-privacy-icons .status__visibility-icon.fa-envelope,.hicolor-privacy-icons .composer--options--dropdown--content--item .fa-envelope{color:#d32f2f}body.rtl{direction:rtl}body.rtl .column-header>button{text-align:right;padding-left:0;padding-right:15px}body.rtl .radio-button__input{margin-right:0;margin-left:10px}body.rtl .directory__card__bar .display-name{margin-left:0;margin-right:15px}body.rtl .display-name{text-align:right}body.rtl .notification__message{margin-left:0;margin-right:68px}body.rtl .drawer__inner__mastodon>img{transform:scaleX(-1)}body.rtl .notification__favourite-icon-wrapper{left:auto;right:-26px}body.rtl .landing-page__logo{margin-right:0;margin-left:20px}body.rtl .landing-page .features-list .features-list__row .visual{margin-left:0;margin-right:15px}body.rtl .column-link__icon,body.rtl .column-header__icon{margin-right:0;margin-left:5px}body.rtl .compose-form .compose-form__buttons-wrapper .character-counter__wrapper{margin-right:0;margin-left:4px}body.rtl .composer--publisher{text-align:left}body.rtl .boost-modal__status-time,body.rtl .favourite-modal__status-time{float:left}body.rtl .navigation-bar__profile{margin-left:0;margin-right:8px}body.rtl .search__input{padding-right:10px;padding-left:30px}body.rtl .search__icon .fa{right:auto;left:10px}body.rtl .columns-area{direction:rtl}body.rtl .column-header__buttons{left:0;right:auto;margin-left:0;margin-right:-15px}body.rtl .column-inline-form .icon-button{margin-left:0;margin-right:5px}body.rtl .column-header__links .text-btn{margin-left:10px;margin-right:0}body.rtl .account__avatar-wrapper{float:right}body.rtl .column-header__back-button{padding-left:5px;padding-right:0}body.rtl .column-header__setting-arrows{float:left}body.rtl .setting-toggle__label{margin-left:0;margin-right:8px}body.rtl .setting-meta__label{float:left}body.rtl .status__avatar{margin-left:10px;margin-right:0;left:auto;right:10px}body.rtl .activity-stream .status.light{padding-left:10px;padding-right:68px}body.rtl .status__info .status__display-name,body.rtl .activity-stream .status.light .status__display-name{padding-left:25px;padding-right:0}body.rtl .activity-stream .pre-header{padding-right:68px;padding-left:0}body.rtl .status__prepend{margin-left:0;margin-right:58px}body.rtl .status__prepend-icon-wrapper{left:auto;right:-26px}body.rtl .activity-stream .pre-header .pre-header__icon{left:auto;right:42px}body.rtl .account__avatar-overlay-overlay{right:auto;left:0}body.rtl .column-back-button--slim-button{right:auto;left:0}body.rtl .status__relative-time,body.rtl .activity-stream .status.light .status__header .status__meta{float:left;text-align:left}body.rtl .status__action-bar__counter{margin-right:0;margin-left:11px}body.rtl .status__action-bar__counter .status__action-bar-button{margin-right:0;margin-left:4px}body.rtl .status__action-bar-button{float:right;margin-right:0;margin-left:18px}body.rtl .status__action-bar-dropdown{float:right}body.rtl .privacy-dropdown__dropdown{margin-left:0;margin-right:40px}body.rtl .privacy-dropdown__option__icon{margin-left:10px;margin-right:0}body.rtl .detailed-status__display-name .display-name{text-align:right}body.rtl .detailed-status__display-avatar{margin-right:0;margin-left:10px;float:right}body.rtl .detailed-status__favorites,body.rtl .detailed-status__reblogs{margin-left:0;margin-right:6px}body.rtl .fa-ul{margin-left:2.14285714em}body.rtl .fa-li{left:auto;right:-2.14285714em}body.rtl .admin-wrapper{direction:rtl}body.rtl .admin-wrapper .sidebar ul a i.fa,body.rtl a.table-action-link i.fa{margin-right:0;margin-left:5px}body.rtl .simple_form .check_boxes .checkbox label{padding-left:0;padding-right:25px}body.rtl .simple_form .input.with_label.boolean label.checkbox{padding-left:25px;padding-right:0}body.rtl .simple_form .check_boxes .checkbox input[type=checkbox],body.rtl .simple_form .input.boolean input[type=checkbox]{left:auto;right:0}body.rtl .simple_form .input.radio_buttons .radio{left:auto;right:0}body.rtl .simple_form .input.radio_buttons .radio>label{padding-right:28px;padding-left:0}body.rtl .simple_form .input-with-append .input input{padding-left:142px;padding-right:0}body.rtl .simple_form .input.boolean label.checkbox{left:auto;right:0}body.rtl .simple_form .input.boolean .label_input,body.rtl .simple_form .input.boolean .hint{padding-left:0;padding-right:28px}body.rtl .simple_form .label_input__append{right:auto;left:3px}body.rtl .simple_form .label_input__append::after{right:auto;left:0;background-image:linear-gradient(to left, rgba(249, 250, 251, 0), #f9fafb)}body.rtl .simple_form select{background:#f9fafb url(\"data:image/svg+xml;utf8,\") no-repeat left 8px center/auto 16px}body.rtl .table th,body.rtl .table td{text-align:right}body.rtl .filters .filter-subset{margin-right:0;margin-left:45px}body.rtl .landing-page .header-wrapper .mascot{right:60px;left:auto}body.rtl .landing-page__call-to-action .row__information-board{direction:rtl}body.rtl .landing-page .header .hero .floats .float-1{left:-120px;right:auto}body.rtl .landing-page .header .hero .floats .float-2{left:210px;right:auto}body.rtl .landing-page .header .hero .floats .float-3{left:110px;right:auto}body.rtl .landing-page .header .links .brand img{left:0}body.rtl .landing-page .fa-external-link{padding-right:5px;padding-left:0 !important}body.rtl .landing-page .features #mastodon-timeline{margin-right:0;margin-left:30px}@media screen and (min-width: 631px){body.rtl .column,body.rtl .drawer{padding-left:5px;padding-right:5px}body.rtl .column:first-child,body.rtl .drawer:first-child{padding-left:5px;padding-right:10px}body.rtl .columns-area>div .column,body.rtl .columns-area>div .drawer{padding-left:5px;padding-right:5px}}body.rtl .columns-area--mobile .column,body.rtl .columns-area--mobile .drawer{padding-left:0;padding-right:0}body.rtl .public-layout .header .nav-button{margin-left:8px;margin-right:0}body.rtl .public-layout .public-account-header__tabs{margin-left:0;margin-right:20px}body.rtl .landing-page__information .account__display-name{margin-right:0;margin-left:5px}body.rtl .landing-page__information .account__avatar-wrapper{margin-left:12px;margin-right:0}body.rtl .card__bar .display-name{margin-left:0;margin-right:15px;text-align:right}body.rtl .fa-chevron-left::before{content:\"\"}body.rtl .fa-chevron-right::before{content:\"\"}body.rtl .column-back-button__icon{margin-right:0;margin-left:5px}body.rtl .column-header__setting-arrows .column-header__setting-btn:last-child{padding-left:0;padding-right:10px}body.rtl .simple_form .input.radio_buttons .radio>label input{left:auto;right:0}.dashboard__counters{display:flex;flex-wrap:wrap;margin:0 -5px;margin-bottom:20px}.dashboard__counters>div{box-sizing:border-box;flex:0 0 33.333%;padding:0 5px;margin-bottom:10px}.dashboard__counters>div>div,.dashboard__counters>div>a{padding:20px;background:#ccd7e0;border-radius:4px;box-sizing:border-box;height:100%}.dashboard__counters>div>a{text-decoration:none;color:inherit;display:block}.dashboard__counters>div>a:hover,.dashboard__counters>div>a:focus,.dashboard__counters>div>a:active{background:#c0cdd9}.dashboard__counters__num,.dashboard__counters__text{text-align:center;font-weight:500;font-size:24px;line-height:21px;color:#000;font-family:sans-serif,sans-serif;margin-bottom:20px;line-height:30px}.dashboard__counters__text{font-size:18px}.dashboard__counters__label{font-size:14px;color:#282c37;text-align:center;font-weight:500}.dashboard__widgets{display:flex;flex-wrap:wrap;margin:0 -5px}.dashboard__widgets>div{flex:0 0 33.333%;margin-bottom:20px}.dashboard__widgets>div>div{padding:0 5px}.dashboard__widgets a:not(.name-tag){color:#282c37;font-weight:500;text-decoration:none}.glitch.local-settings{background:#d9e1e8}.glitch.local-settings__navigation{background:#f2f5f7}.glitch.local-settings__navigation__item{background:#f2f5f7}.glitch.local-settings__navigation__item:hover{background:#d9e1e8}.notification__dismiss-overlay .wrappy{box-shadow:unset}.notification__dismiss-overlay .ckbox{text-shadow:unset}.status.status-direct:not(.read){background:#f2f5f7;border-bottom-color:#fff}.status.status-direct:not(.read).collapsed>.status__content:after{background:linear-gradient(rgba(242, 245, 247, 0), #f2f5f7)}.focusable:focus.status.status-direct:not(.read){background:#e6ebf0}.focusable:focus.status.status-direct:not(.read).collapsed>.status__content:after{background:linear-gradient(rgba(230, 235, 240, 0), #e6ebf0)}.column>.scrollable{background:#fff}.status.collapsed .status__content:after{background:linear-gradient(rgba(255, 255, 255, 0), white)}.drawer__inner{background:#d9e1e8}.drawer__inner__mastodon{background:#d9e1e8 url('data:image/svg+xml;utf8,') no-repeat bottom/100% auto !important}.drawer__inner__mastodon .mastodon{filter:contrast(75%) brightness(75%) !important}.status__content .status__content__spoiler-link{background:#7a96ae}.status__content .status__content__spoiler-link:hover{background:#6a89a5;text-decoration:none}.media-spoiler,.video-player__spoiler,.account-gallery__item a{background:#d9e1e8}.dropdown-menu{background:#d9e1e8}.dropdown-menu__arrow.left{border-left-color:#d9e1e8}.dropdown-menu__arrow.top{border-top-color:#d9e1e8}.dropdown-menu__arrow.bottom{border-bottom-color:#d9e1e8}.dropdown-menu__arrow.right{border-right-color:#d9e1e8}.dropdown-menu__item a{background:#d9e1e8;color:#282c37}.composer .composer--spoiler input,.composer .compose-form__autosuggest-wrapper textarea{color:#0f151a}.composer .composer--spoiler input:disabled,.composer .compose-form__autosuggest-wrapper textarea:disabled{background:#e6e6e6}.composer .composer--spoiler input::placeholder,.composer .compose-form__autosuggest-wrapper textarea::placeholder{color:#232f39}.composer .composer--options-wrapper{background:#b9c8d5}.composer .composer--options>hr{display:none}.composer .composer--options--dropdown--content--item{color:#9baec8}.composer .composer--options--dropdown--content--item strong{color:#9baec8}.composer--upload_form--actions .icon-button{color:#ededed}.composer--upload_form--actions .icon-button:active,.composer--upload_form--actions .icon-button:focus,.composer--upload_form--actions .icon-button:hover{color:#fff}.composer--upload_form--item>div input{color:#ededed}.composer--upload_form--item>div input::placeholder{color:#e6e6e6}.dropdown-menu__separator{border-bottom-color:#b3c3d1}.status__content a,.reply-indicator__content a{color:#2b90d9}.emoji-mart-bar{border-color:#e6ebf0}.emoji-mart-bar:first-child{background:#b9c8d5}.emoji-mart-search input{background:rgba(217,225,232,.3);border-color:#d9e1e8}.autosuggest-textarea__suggestions{background:#b9c8d5}.autosuggest-textarea__suggestions__item:hover,.autosuggest-textarea__suggestions__item:focus,.autosuggest-textarea__suggestions__item:active,.autosuggest-textarea__suggestions__item.selected{background:#e6ebf0}.react-toggle-track{background:#282c37}.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track{background:#131419}.react-toggle.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track{background:#56a7e1}.actions-modal,.boost-modal,.doodle-modal,.confirmation-modal,.mute-modal,.block-modal,.report-modal,.embed-modal,.error-modal,.onboarding-modal,.report-modal__comment .setting-text__wrapper,.report-modal__comment .setting-text{background:#fff;border:1px solid #c0cdd9}.report-modal__comment{border-right-color:#c0cdd9}.report-modal__container{border-top-color:#c0cdd9}.boost-modal__action-bar,.doodle-modal__action-bar,.confirmation-modal__action-bar,.mute-modal__action-bar,.block-modal__action-bar,.onboarding-modal__paginator,.error-modal__footer{background:#ecf0f4}.boost-modal__action-bar .onboarding-modal__nav:hover,.doodle-modal__action-bar .onboarding-modal__nav:hover,.boost-modal__action-bar .onboarding-modal__nav:focus,.doodle-modal__action-bar .onboarding-modal__nav:focus,.boost-modal__action-bar .onboarding-modal__nav:active,.doodle-modal__action-bar .onboarding-modal__nav:active,.boost-modal__action-bar .error-modal__nav:hover,.doodle-modal__action-bar .error-modal__nav:hover,.boost-modal__action-bar .error-modal__nav:focus,.doodle-modal__action-bar .error-modal__nav:focus,.boost-modal__action-bar .error-modal__nav:active,.doodle-modal__action-bar .error-modal__nav:active,.confirmation-modal__action-bar .onboarding-modal__nav:hover,.confirmation-modal__action-bar .onboarding-modal__nav:focus,.confirmation-modal__action-bar .onboarding-modal__nav:active,.confirmation-modal__action-bar .error-modal__nav:hover,.confirmation-modal__action-bar .error-modal__nav:focus,.confirmation-modal__action-bar .error-modal__nav:active,.mute-modal__action-bar .onboarding-modal__nav:hover,.mute-modal__action-bar .onboarding-modal__nav:focus,.mute-modal__action-bar .onboarding-modal__nav:active,.mute-modal__action-bar .error-modal__nav:hover,.mute-modal__action-bar .error-modal__nav:focus,.mute-modal__action-bar .error-modal__nav:active,.block-modal__action-bar .onboarding-modal__nav:hover,.block-modal__action-bar .onboarding-modal__nav:focus,.block-modal__action-bar .onboarding-modal__nav:active,.block-modal__action-bar .error-modal__nav:hover,.block-modal__action-bar .error-modal__nav:focus,.block-modal__action-bar .error-modal__nav:active,.onboarding-modal__paginator .onboarding-modal__nav:hover,.onboarding-modal__paginator .onboarding-modal__nav:focus,.onboarding-modal__paginator .onboarding-modal__nav:active,.onboarding-modal__paginator .error-modal__nav:hover,.onboarding-modal__paginator .error-modal__nav:focus,.onboarding-modal__paginator .error-modal__nav:active,.error-modal__footer .onboarding-modal__nav:hover,.error-modal__footer .onboarding-modal__nav:focus,.error-modal__footer .onboarding-modal__nav:active,.error-modal__footer .error-modal__nav:hover,.error-modal__footer .error-modal__nav:focus,.error-modal__footer .error-modal__nav:active{background-color:#fff}.empty-column-indicator,.error-column{color:#364959}.activity-stream-tabs{background:#fff}.activity-stream-tabs a.active{color:#9baec8}.activity-stream .entry{background:#fff}.activity-stream .status.light .status__content{color:#000}.activity-stream .status.light .display-name strong{color:#000}.accounts-grid .account-grid-card .controls .icon-button{color:#282c37}.accounts-grid .account-grid-card .name a{color:#000}.accounts-grid .account-grid-card .username{color:#282c37}.accounts-grid .account-grid-card .account__header__content{color:#000}.button.logo-button{color:#fff}.button.logo-button svg{fill:#fff}.public-layout .header,.public-layout .public-account-header,.public-layout .public-account-bio{box-shadow:none}.public-layout .header{background:#b3c3d1}.public-layout .public-account-header__image{background:#b3c3d1}.public-layout .public-account-header__image::after{box-shadow:none}.public-layout .public-account-header__tabs__name h1,.public-layout .public-account-header__tabs__name h1 small{color:#fff}.account__section-headline a.active::after{border-color:transparent transparent #fff}.hero-widget,.box-widget,.contact-widget,.landing-page__information.contact-widget,.moved-account-widget,.memoriam-widget,.activity-stream,.nothing-here,.directory__tag>a,.directory__tag>div{box-shadow:none}.audio-player .video-player__controls button,.audio-player .video-player__time-sep,.audio-player .video-player__time-current,.audio-player .video-player__time-total{color:#000}","/* http://meyerweb.com/eric/tools/css/reset/\n v2.0 | 20110126\n License: none (public domain)\n*/\n\nhtml, body, div, span, applet, object, iframe,\nh1, h2, h3, h4, h5, h6, p, blockquote, pre,\na, abbr, acronym, address, big, cite, code,\ndel, dfn, em, img, ins, kbd, q, s, samp,\nsmall, strike, strong, sub, sup, tt, var,\nb, u, i, center,\ndl, dt, dd, ol, ul, li,\nfieldset, form, label, legend,\ntable, caption, tbody, tfoot, thead, tr, th, td,\narticle, aside, canvas, details, embed,\nfigure, figcaption, footer, header, hgroup,\nmenu, nav, output, ruby, section, summary,\ntime, mark, audio, video {\n margin: 0;\n padding: 0;\n border: 0;\n font-size: 100%;\n font: inherit;\n vertical-align: baseline;\n}\n\n/* HTML5 display-role reset for older browsers */\narticle, aside, details, figcaption, figure,\nfooter, header, hgroup, menu, nav, section {\n display: block;\n}\n\nbody {\n line-height: 1;\n}\n\nol, ul {\n list-style: none;\n}\n\nblockquote, q {\n quotes: none;\n}\n\nblockquote:before, blockquote:after,\nq:before, q:after {\n content: '';\n content: none;\n}\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\nhtml {\n scrollbar-color: lighten($ui-base-color, 4%) rgba($base-overlay-background, 0.1);\n}\n\n::-webkit-scrollbar {\n width: 12px;\n height: 12px;\n}\n\n::-webkit-scrollbar-thumb {\n background: lighten($ui-base-color, 4%);\n border: 0px none $base-border-color;\n border-radius: 50px;\n}\n\n::-webkit-scrollbar-thumb:hover {\n background: lighten($ui-base-color, 6%);\n}\n\n::-webkit-scrollbar-thumb:active {\n background: lighten($ui-base-color, 4%);\n}\n\n::-webkit-scrollbar-track {\n border: 0px none $base-border-color;\n border-radius: 0;\n background: rgba($base-overlay-background, 0.1);\n}\n\n::-webkit-scrollbar-track:hover {\n background: $ui-base-color;\n}\n\n::-webkit-scrollbar-track:active {\n background: $ui-base-color;\n}\n\n::-webkit-scrollbar-corner {\n background: transparent;\n}\n","// Dependent colors\n$black: #000000;\n$white: #ffffff;\n\n$classic-base-color: #282c37;\n$classic-primary-color: #9baec8;\n$classic-secondary-color: #d9e1e8;\n$classic-highlight-color: #2b90d9;\n\n$ui-base-color: $classic-secondary-color !default;\n$ui-base-lighter-color: darken($ui-base-color, 57%);\n$ui-highlight-color: $classic-highlight-color !default;\n$ui-primary-color: $classic-primary-color !default;\n$ui-secondary-color: $classic-base-color !default;\n\n$primary-text-color: $black !default;\n$darker-text-color: $classic-base-color !default;\n$dark-text-color: #444b5d;\n$action-button-color: #606984;\n\n$success-green: lighten(#3c754d, 8%);\n\n$base-overlay-background: $white !default;\n\n$inverted-text-color: $black !default;\n$lighter-text-color: $classic-base-color !default;\n$light-text-color: #444b5d;\n\n$account-background-color: $white !default;\n\n//Invert darkened and lightened colors\n@function darken($color, $amount) {\n @return hsl(hue($color), saturation($color), lightness($color) + $amount);\n}\n\n@function lighten($color, $amount) {\n @return hsl(hue($color), saturation($color), lightness($color) - $amount);\n}\n\n$emojis-requiring-outlines: 'alien' 'baseball' 'chains' 'chicken' 'cloud' 'crescent_moon' 'dash' 'dove_of_peace' 'eyes' 'first_quarter_moon' 'first_quarter_moon_with_face' 'fish_cake' 'full_moon' 'full_moon_with_face' 'ghost' 'goat' 'grey_exclamation' 'grey_question' 'ice_skate' 'last_quarter_moon' 'last_quarter_moon_with_face' 'lightning' 'loud_sound' 'moon' 'mute' 'page_with_curl' 'rain_cloud' 'ram' 'rice' 'rice_ball' 'rooster' 'sheep' 'skull' 'skull_and_crossbones' 'snow_cloud' 'sound' 'speaker' 'speech_balloon' 'thought_balloon' 'volleyball' 'waning_crescent_moon' 'waning_gibbous_moon' 'waving_white_flag' 'waxing_crescent_moon' 'white_circle' 'white_large_square' 'white_medium_small_square' 'white_medium_square' 'white_small_square' 'wind_blowing_face';\n","@function hex-color($color) {\n @if type-of($color) == 'color' {\n $color: str-slice(ie-hex-str($color), 4);\n }\n @return '%23' + unquote($color)\n}\n\nbody {\n font-family: $font-sans-serif, sans-serif;\n background: darken($ui-base-color, 7%);\n font-size: 13px;\n line-height: 18px;\n font-weight: 400;\n color: $primary-text-color;\n text-rendering: optimizelegibility;\n font-feature-settings: \"kern\";\n text-size-adjust: none;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n -webkit-tap-highlight-color: transparent;\n\n &.system-font {\n // system-ui => standard property (Chrome/Android WebView 56+, Opera 43+, Safari 11+)\n // -apple-system => Safari <11 specific\n // BlinkMacSystemFont => Chrome <56 on macOS specific\n // Segoe UI => Windows 7/8/10\n // Oxygen => KDE\n // Ubuntu => Unity/Ubuntu\n // Cantarell => GNOME\n // Fira Sans => Firefox OS\n // Droid Sans => Older Androids (<4.0)\n // Helvetica Neue => Older macOS <10.11\n // $font-sans-serif => web-font (Roboto) fallback and newer Androids (>=4.0)\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Oxygen\", \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", $font-sans-serif, sans-serif;\n }\n\n &.app-body {\n padding: 0;\n\n &.layout-single-column {\n height: auto;\n min-height: 100vh;\n overflow-y: scroll;\n }\n\n &.layout-multiple-columns {\n position: absolute;\n width: 100%;\n height: 100%;\n }\n\n &.with-modals--active {\n overflow-y: hidden;\n }\n }\n\n &.lighter {\n background: $ui-base-color;\n }\n\n &.with-modals {\n overflow-x: hidden;\n overflow-y: scroll;\n\n &--active {\n overflow-y: hidden;\n }\n }\n\n &.embed {\n background: lighten($ui-base-color, 4%);\n margin: 0;\n padding-bottom: 0;\n\n .container {\n position: absolute;\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n }\n\n &.admin {\n background: darken($ui-base-color, 4%);\n padding: 0;\n }\n\n &.error {\n position: absolute;\n text-align: center;\n color: $darker-text-color;\n background: $ui-base-color;\n width: 100%;\n height: 100%;\n padding: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n\n .dialog {\n vertical-align: middle;\n margin: 20px;\n\n img {\n display: block;\n max-width: 470px;\n width: 100%;\n height: auto;\n margin-top: -120px;\n }\n\n h1 {\n font-size: 20px;\n line-height: 28px;\n font-weight: 400;\n }\n }\n }\n}\n\nbutton {\n font-family: inherit;\n cursor: pointer;\n\n &:focus {\n outline: none;\n }\n}\n\n.app-holder {\n &,\n & > div {\n display: flex;\n width: 100%;\n align-items: center;\n justify-content: center;\n outline: 0 !important;\n }\n}\n\n.layout-single-column .app-holder {\n &,\n & > div {\n min-height: 100vh;\n }\n}\n\n.layout-multiple-columns .app-holder {\n &,\n & > div {\n height: 100%;\n }\n}\n",".container-alt {\n width: 700px;\n margin: 0 auto;\n margin-top: 40px;\n\n @media screen and (max-width: 740px) {\n width: 100%;\n margin: 0;\n }\n}\n\n.logo-container {\n margin: 100px auto 50px;\n\n @media screen and (max-width: 500px) {\n margin: 40px auto 0;\n }\n\n h1 {\n display: flex;\n justify-content: center;\n align-items: center;\n\n svg {\n fill: $primary-text-color;\n height: 42px;\n margin-right: 10px;\n }\n\n a {\n display: flex;\n justify-content: center;\n align-items: center;\n color: $primary-text-color;\n text-decoration: none;\n outline: 0;\n padding: 12px 16px;\n line-height: 32px;\n font-family: $font-display, sans-serif;\n font-weight: 500;\n font-size: 14px;\n }\n }\n}\n\n.compose-standalone {\n .compose-form {\n width: 400px;\n margin: 0 auto;\n padding: 20px 0;\n margin-top: 40px;\n box-sizing: border-box;\n\n @media screen and (max-width: 400px) {\n width: 100%;\n margin-top: 0;\n padding: 20px;\n }\n }\n}\n\n.account-header {\n width: 400px;\n margin: 0 auto;\n display: flex;\n font-size: 13px;\n line-height: 18px;\n box-sizing: border-box;\n padding: 20px 0;\n padding-bottom: 0;\n margin-bottom: -30px;\n margin-top: 40px;\n\n @media screen and (max-width: 440px) {\n width: 100%;\n margin: 0;\n margin-bottom: 10px;\n padding: 20px;\n padding-bottom: 0;\n }\n\n .avatar {\n width: 40px;\n height: 40px;\n @include avatar-size(40px);\n margin-right: 8px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n @include avatar-radius();\n }\n }\n\n .name {\n flex: 1 1 auto;\n color: $secondary-text-color;\n width: calc(100% - 88px);\n\n .username {\n display: block;\n font-weight: 500;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n }\n\n .logout-link {\n display: block;\n font-size: 32px;\n line-height: 40px;\n margin-left: 8px;\n }\n}\n\n.grid-3 {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: 3fr 1fr;\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-column: 1/3;\n grid-row: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 2;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1/3;\n grid-row: 3;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n grid-template-columns: minmax(0, 100%);\n\n .column-0 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .column-2 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1;\n grid-row: 4;\n }\n }\n}\n\n.grid-4 {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: repeat(4, minmax(0, 1fr));\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-column: 1 / 5;\n grid-row: 1;\n }\n\n .column-1 {\n grid-column: 1 / 4;\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 4;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 2 / 5;\n grid-row: 3;\n }\n\n .column-4 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .landing-page__call-to-action {\n min-height: 100%;\n }\n\n .flash-message {\n margin-bottom: 10px;\n }\n\n @media screen and (max-width: 738px) {\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n .landing-page__call-to-action {\n padding: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .row__information-board {\n width: 100%;\n justify-content: center;\n align-items: center;\n }\n\n .row__mascot {\n display: none;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n grid-template-columns: minmax(0, 100%);\n\n .column-0 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .column-2 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1;\n grid-row: 5;\n }\n\n .column-4 {\n grid-column: 1;\n grid-row: 4;\n }\n }\n}\n\n.public-layout {\n @media screen and (max-width: $no-gap-breakpoint) {\n padding-top: 48px;\n }\n\n .container {\n max-width: 960px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding: 0;\n }\n }\n\n .header {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n height: 48px;\n margin: 10px 0;\n display: flex;\n align-items: stretch;\n justify-content: center;\n flex-wrap: nowrap;\n overflow: hidden;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n position: fixed;\n width: 100%;\n top: 0;\n left: 0;\n margin: 0;\n border-radius: 0;\n box-shadow: none;\n z-index: 110;\n }\n\n & > div {\n flex: 1 1 33.3%;\n min-height: 1px;\n }\n\n .nav-left {\n display: flex;\n align-items: stretch;\n justify-content: flex-start;\n flex-wrap: nowrap;\n }\n\n .nav-center {\n display: flex;\n align-items: stretch;\n justify-content: center;\n flex-wrap: nowrap;\n }\n\n .nav-right {\n display: flex;\n align-items: stretch;\n justify-content: flex-end;\n flex-wrap: nowrap;\n }\n\n .brand {\n display: block;\n padding: 15px;\n\n svg {\n display: block;\n height: 18px;\n width: auto;\n position: relative;\n bottom: -2px;\n fill: $primary-text-color;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n height: 20px;\n }\n }\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 12%);\n }\n }\n\n .nav-link {\n display: flex;\n align-items: center;\n padding: 0 1rem;\n font-size: 12px;\n font-weight: 500;\n text-decoration: none;\n color: $darker-text-color;\n white-space: nowrap;\n text-align: center;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n color: $primary-text-color;\n }\n\n @media screen and (max-width: 550px) {\n &.optional {\n display: none;\n }\n }\n }\n\n .nav-button {\n background: lighten($ui-base-color, 16%);\n margin: 8px;\n margin-left: 0;\n border-radius: 4px;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n background: lighten($ui-base-color, 20%);\n }\n }\n }\n\n $no-columns-breakpoint: 600px;\n\n .grid {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(300px, 3fr) minmax(298px, 1fr);\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-row: 1;\n grid-column: 1;\n }\n\n .column-1 {\n grid-row: 1;\n grid-column: 2;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n grid-template-columns: 100%;\n grid-gap: 0;\n\n .column-1 {\n display: none;\n }\n }\n }\n\n .directory__card {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n\n .page-header {\n @media screen and (max-width: $no-gap-breakpoint) {\n border-bottom: 0;\n }\n }\n\n .public-account-header {\n overflow: hidden;\n margin-bottom: 10px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &.inactive {\n opacity: 0.5;\n\n .public-account-header__image,\n .avatar {\n filter: grayscale(100%);\n }\n\n .logo-button {\n background-color: $secondary-text-color;\n }\n }\n\n &__image {\n border-radius: 4px 4px 0 0;\n overflow: hidden;\n height: 300px;\n position: relative;\n background: darken($ui-base-color, 12%);\n\n &::after {\n content: \"\";\n display: block;\n position: absolute;\n width: 100%;\n height: 100%;\n box-shadow: inset 0 -1px 1px 1px rgba($base-shadow-color, 0.15);\n top: 0;\n left: 0;\n }\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 4px 4px 0 0;\n }\n\n @media screen and (max-width: 600px) {\n height: 200px;\n }\n }\n\n &--no-bar {\n margin-bottom: 0;\n\n .public-account-header__image,\n .public-account-header__image img {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n box-shadow: none;\n\n &__image::after {\n display: none;\n }\n\n &__image,\n &__image img {\n border-radius: 0;\n }\n }\n\n &__bar {\n position: relative;\n margin-top: -80px;\n display: flex;\n justify-content: flex-start;\n\n &::before {\n content: \"\";\n display: block;\n background: lighten($ui-base-color, 4%);\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: 60px;\n border-radius: 0 0 4px 4px;\n z-index: -1;\n }\n\n .avatar {\n display: block;\n width: 120px;\n height: 120px;\n @include avatar-size(120px);\n padding-left: 20px - 4px;\n flex: 0 0 auto;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 50%;\n border: 4px solid lighten($ui-base-color, 4%);\n background: darken($ui-base-color, 8%);\n @include avatar-radius();\n }\n }\n\n @media screen and (max-width: 600px) {\n margin-top: 0;\n background: lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n padding: 5px;\n\n &::before {\n display: none;\n }\n\n .avatar {\n width: 48px;\n height: 48px;\n @include avatar-size(48px);\n padding: 7px 0;\n padding-left: 10px;\n\n img {\n border: 0;\n border-radius: 4px;\n @include avatar-radius();\n }\n\n @media screen and (max-width: 360px) {\n display: none;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n flex-wrap: wrap;\n }\n }\n\n &__tabs {\n flex: 1 1 auto;\n margin-left: 20px;\n\n &__name {\n padding-top: 20px;\n padding-bottom: 8px;\n\n h1 {\n font-size: 20px;\n line-height: 18px * 1.5;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n text-shadow: 1px 1px 1px $base-shadow-color;\n\n small {\n display: block;\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n @media screen and (max-width: 600px) {\n margin-left: 15px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n &__name {\n padding-top: 0;\n padding-bottom: 0;\n\n h1 {\n font-size: 16px;\n line-height: 24px;\n text-shadow: none;\n\n small {\n color: $darker-text-color;\n }\n }\n }\n }\n\n &__tabs {\n display: flex;\n justify-content: flex-start;\n align-items: stretch;\n height: 58px;\n\n .details-counters {\n display: flex;\n flex-direction: row;\n min-width: 300px;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n .details-counters {\n display: none;\n }\n }\n\n .counter {\n min-width: 33.3%;\n box-sizing: border-box;\n flex: 0 0 auto;\n color: $darker-text-color;\n padding: 10px;\n border-right: 1px solid lighten($ui-base-color, 4%);\n cursor: default;\n text-align: center;\n position: relative;\n\n a {\n display: block;\n }\n\n &:last-child {\n border-right: 0;\n }\n\n &::after {\n display: block;\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n border-bottom: 4px solid $ui-primary-color;\n opacity: 0.5;\n transition: all 400ms ease;\n }\n\n &.active {\n &::after {\n border-bottom: 4px solid $highlight-text-color;\n opacity: 1;\n }\n\n &.inactive::after {\n border-bottom-color: $secondary-text-color;\n }\n }\n\n &:hover {\n &::after {\n opacity: 1;\n transition-duration: 100ms;\n }\n }\n\n a {\n text-decoration: none;\n color: inherit;\n }\n\n .counter-label {\n font-size: 12px;\n display: block;\n }\n\n .counter-number {\n font-weight: 500;\n font-size: 18px;\n margin-bottom: 5px;\n color: $primary-text-color;\n font-family: $font-display, sans-serif;\n }\n }\n\n .spacer {\n flex: 1 1 auto;\n height: 1px;\n }\n\n &__buttons {\n padding: 7px 8px;\n }\n }\n }\n\n &__extra {\n display: none;\n margin-top: 4px;\n\n .public-account-bio {\n border-radius: 0;\n box-shadow: none;\n background: transparent;\n margin: 0 -5px;\n\n .account__header__fields {\n border-top: 1px solid lighten($ui-base-color, 12%);\n }\n\n .roles {\n display: none;\n }\n }\n\n &__links {\n margin-top: -15px;\n font-size: 14px;\n color: $darker-text-color;\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n padding: 15px;\n font-weight: 500;\n\n strong {\n font-weight: 700;\n color: $primary-text-color;\n }\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n flex: 100%;\n }\n }\n }\n\n .account__section-headline {\n border-radius: 4px 4px 0 0;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n\n .detailed-status__meta {\n margin-top: 25px;\n }\n\n .public-account-bio {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n overflow: hidden;\n margin-bottom: 10px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n box-shadow: none;\n margin-bottom: 0;\n border-radius: 0;\n }\n\n .account__header__fields {\n margin: 0;\n border-top: 0;\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n\n .account__header__content {\n padding: 20px;\n padding-bottom: 0;\n color: $primary-text-color;\n }\n\n &__extra,\n .roles {\n padding: 20px;\n font-size: 14px;\n color: $darker-text-color;\n }\n\n .roles {\n padding-bottom: 0;\n }\n }\n\n .directory__list {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: block;\n }\n\n .icon-button {\n font-size: 18px;\n }\n }\n\n .directory__card {\n margin-bottom: 0;\n }\n\n .card-grid {\n display: flex;\n flex-wrap: wrap;\n min-width: 100%;\n margin: 0 -5px;\n\n & > div {\n box-sizing: border-box;\n flex: 1 0 auto;\n width: 300px;\n padding: 0 5px;\n margin-bottom: 10px;\n max-width: 33.333%;\n\n @media screen and (max-width: 900px) {\n max-width: 50%;\n }\n\n @media screen and (max-width: 600px) {\n max-width: 100%;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin: 0;\n border-top: 1px solid lighten($ui-base-color, 8%);\n\n & > div {\n width: 100%;\n padding: 0;\n margin-bottom: 0;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &:last-child {\n border-bottom: 0;\n }\n\n .card__bar {\n background: $ui-base-color;\n\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n }\n }\n }\n }\n}\n","@mixin avatar-radius() {\n border-radius: $ui-avatar-border-size;\n background-position: 50%;\n background-clip: padding-box;\n}\n\n@mixin avatar-size($size:48px) {\n width: $size;\n height: $size;\n background-size: $size $size;\n}\n\n@mixin single-column($media, $parent: '&') {\n .auto-columns #{$parent} {\n @media #{$media} {\n @content;\n }\n }\n .single-column #{$parent} {\n @content;\n }\n}\n\n@mixin limited-single-column($media, $parent: '&') {\n .auto-columns #{$parent}, .single-column #{$parent} {\n @media #{$media} {\n @content;\n }\n }\n}\n\n@mixin multi-columns($media, $parent: '&') {\n .auto-columns #{$parent} {\n @media #{$media} {\n @content;\n }\n }\n .multi-columns #{$parent} {\n @content;\n }\n}\n\n@mixin fullwidth-gallery {\n &.full-width {\n margin-left: -14px;\n margin-right: -14px;\n width: inherit;\n max-width: none;\n height: 250px;\n border-radius: 0px;\n }\n}\n\n@mixin search-input() {\n outline: 0;\n box-sizing: border-box;\n width: 100%;\n border: none;\n box-shadow: none;\n font-family: inherit;\n background: $ui-base-color;\n color: $darker-text-color;\n font-size: 14px;\n margin: 0;\n}\n\n@mixin search-popout() {\n background: $simple-background-color;\n border-radius: 4px;\n padding: 10px 14px;\n padding-bottom: 14px;\n margin-top: 10px;\n color: $light-text-color;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n\n h4 {\n text-transform: uppercase;\n color: $light-text-color;\n font-size: 13px;\n font-weight: 500;\n margin-bottom: 10px;\n }\n\n li {\n padding: 4px 0;\n }\n\n ul {\n margin-bottom: 10px;\n }\n\n em {\n font-weight: 500;\n color: $inverted-text-color;\n }\n}\n","// Commonly used web colors\n$black: #000000; // Black\n$white: #ffffff; // White\n$success-green: #79bd9a; // Padua\n$error-red: #df405a; // Cerise\n$warning-red: #ff5050; // Sunset Orange\n$gold-star: #ca8f04; // Dark Goldenrod\n\n$red-bookmark: $warning-red;\n\n// Pleroma-Dark colors\n$pleroma-bg: #121a24;\n$pleroma-fg: #182230;\n$pleroma-text: #b9b9ba;\n$pleroma-links: #d8a070;\n\n// Values from the classic Mastodon UI\n$classic-base-color: $pleroma-bg;\n$classic-primary-color: #9baec8;\n$classic-secondary-color: #d9e1e8;\n$classic-highlight-color: #d8a070;\n\n// Variables for defaults in UI\n$base-shadow-color: $black !default;\n$base-overlay-background: $black !default;\n$base-border-color: $white !default;\n$simple-background-color: $white !default;\n$valid-value-color: $success-green !default;\n$error-value-color: $error-red !default;\n\n// Tell UI to use selected colors\n$ui-base-color: $classic-base-color !default; // Darkest\n$ui-base-lighter-color: lighten($ui-base-color, 26%) !default; // Lighter darkest\n$ui-primary-color: $classic-primary-color !default; // Lighter\n$ui-secondary-color: $classic-secondary-color !default; // Lightest\n$ui-highlight-color: $classic-highlight-color !default;\n\n// Variables for texts\n$primary-text-color: $white !default;\n$darker-text-color: $ui-primary-color !default;\n$dark-text-color: $ui-base-lighter-color !default;\n$secondary-text-color: $ui-secondary-color !default;\n$highlight-text-color: $ui-highlight-color !default;\n$action-button-color: $ui-base-lighter-color !default;\n// For texts on inverted backgrounds\n$inverted-text-color: $ui-base-color !default;\n$lighter-text-color: $ui-base-lighter-color !default;\n$light-text-color: $ui-primary-color !default;\n\n// Language codes that uses CJK fonts\n$cjk-langs: ja, ko, zh-CN, zh-HK, zh-TW;\n\n// Variables for components\n$media-modal-media-max-width: 100%;\n// put margins on top and bottom of image to avoid the screen covered by image.\n$media-modal-media-max-height: 80%;\n\n$no-gap-breakpoint: 415px;\n\n$font-sans-serif: sans-serif !default;\n$font-display: sans-serif !default;\n$font-monospace: monospace !default;\n\n// Avatar border size (8% default, 100% for rounded avatars)\n$ui-avatar-border-size: 8%;\n\n// More variables\n$dismiss-overlay-width: 4rem;\n",".no-list {\n list-style: none;\n\n li {\n display: inline-block;\n margin: 0 5px;\n }\n}\n\n.recovery-codes {\n list-style: none;\n margin: 0 auto;\n\n li {\n font-size: 125%;\n line-height: 1.5;\n letter-spacing: 1px;\n }\n}\n",".modal-layout {\n background: $ui-base-color url('data:image/svg+xml;utf8,') repeat-x bottom fixed;\n display: flex;\n flex-direction: column;\n height: 100vh;\n padding: 0;\n}\n\n.modal-layout__mastodon {\n display: flex;\n flex: 1;\n flex-direction: column;\n justify-content: flex-end;\n\n > * {\n flex: 1;\n max-height: 235px;\n }\n}\n\n@media screen and (max-width: 600px) {\n .account-header {\n margin-top: 0;\n }\n}\n",".public-layout {\n .footer {\n text-align: left;\n padding-top: 20px;\n padding-bottom: 60px;\n font-size: 12px;\n color: lighten($ui-base-color, 34%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding-left: 20px;\n padding-right: 20px;\n }\n\n .grid {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: 1fr 1fr 2fr 1fr 1fr;\n\n .column-0 {\n grid-column: 1;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-1 {\n grid-column: 2;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-2 {\n grid-column: 3;\n grid-row: 1;\n min-width: 0;\n text-align: center;\n\n h4 a {\n color: lighten($ui-base-color, 34%);\n }\n }\n\n .column-3 {\n grid-column: 4;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-4 {\n grid-column: 5;\n grid-row: 1;\n min-width: 0;\n }\n\n @media screen and (max-width: 690px) {\n grid-template-columns: 1fr 2fr 1fr;\n\n .column-0,\n .column-1 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 2;\n }\n\n .column-3,\n .column-4 {\n grid-column: 3;\n }\n\n .column-4 {\n grid-row: 2;\n }\n }\n\n @media screen and (max-width: 600px) {\n .column-1 {\n display: block;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n .column-0,\n .column-1,\n .column-3,\n .column-4 {\n display: none;\n }\n }\n }\n\n h4 {\n text-transform: uppercase;\n font-weight: 700;\n margin-bottom: 8px;\n color: $darker-text-color;\n\n a {\n color: inherit;\n text-decoration: none;\n }\n }\n\n ul a {\n text-decoration: none;\n color: lighten($ui-base-color, 34%);\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n\n .brand {\n svg {\n display: block;\n height: 36px;\n width: auto;\n margin: 0 auto;\n fill: lighten($ui-base-color, 34%);\n }\n\n &:hover,\n &:focus,\n &:active {\n svg {\n fill: lighten($ui-base-color, 38%);\n }\n }\n }\n }\n}\n",".compact-header {\n h1 {\n font-size: 24px;\n line-height: 28px;\n color: $darker-text-color;\n font-weight: 500;\n margin-bottom: 20px;\n padding: 0 10px;\n word-wrap: break-word;\n\n @media screen and (max-width: 740px) {\n text-align: center;\n padding: 20px 10px 0;\n }\n\n a {\n color: inherit;\n text-decoration: none;\n }\n\n small {\n font-weight: 400;\n color: $secondary-text-color;\n }\n\n img {\n display: inline-block;\n margin-bottom: -5px;\n margin-right: 15px;\n width: 36px;\n height: 36px;\n }\n }\n}\n",".hero-widget {\n margin-bottom: 10px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &__img {\n width: 100%;\n position: relative;\n overflow: hidden;\n border-radius: 4px 4px 0 0;\n background: $base-shadow-color;\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 4px 4px 0 0;\n }\n }\n\n &__text {\n background: $ui-base-color;\n padding: 20px;\n border-radius: 0 0 4px 4px;\n font-size: 15px;\n color: $darker-text-color;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n p {\n margin-bottom: 20px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n em {\n display: inline;\n margin: 0;\n padding: 0;\n font-weight: 700;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n color: lighten($darker-text-color, 10%);\n }\n\n a {\n color: $secondary-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n}\n\n.endorsements-widget {\n margin-bottom: 10px;\n padding-bottom: 10px;\n\n h4 {\n padding: 10px;\n text-transform: uppercase;\n font-weight: 700;\n font-size: 13px;\n color: $darker-text-color;\n }\n\n .account {\n padding: 10px 0;\n\n &:last-child {\n border-bottom: 0;\n }\n\n .account__display-name {\n display: flex;\n align-items: center;\n }\n\n .account__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n }\n\n .trends__item {\n padding: 10px;\n }\n}\n\n.trends-widget {\n h4 {\n color: $darker-text-color;\n }\n}\n\n.box-widget {\n padding: 20px;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n}\n\n.placeholder-widget {\n padding: 16px;\n border-radius: 4px;\n border: 2px dashed $dark-text-color;\n text-align: center;\n color: $darker-text-color;\n margin-bottom: 10px;\n}\n\n.contact-widget {\n min-height: 100%;\n font-size: 15px;\n color: $darker-text-color;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n padding: 0;\n\n h4 {\n padding: 10px;\n text-transform: uppercase;\n font-weight: 700;\n font-size: 13px;\n color: $darker-text-color;\n }\n\n .account {\n border-bottom: 0;\n padding: 10px 0;\n padding-top: 5px;\n }\n\n & > a {\n display: inline-block;\n padding: 10px;\n padding-top: 0;\n color: $darker-text-color;\n text-decoration: none;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.moved-account-widget {\n padding: 15px;\n padding-bottom: 20px;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n color: $secondary-text-color;\n font-weight: 400;\n margin-bottom: 10px;\n\n strong,\n a {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n color: inherit;\n text-decoration: underline;\n\n &.mention {\n text-decoration: none;\n\n span {\n text-decoration: none;\n }\n\n &:focus,\n &:hover,\n &:active {\n text-decoration: none;\n\n span {\n text-decoration: underline;\n }\n }\n }\n }\n\n &__message {\n margin-bottom: 15px;\n\n .fa {\n margin-right: 5px;\n color: $darker-text-color;\n }\n }\n\n &__card {\n .detailed-status__display-avatar {\n position: relative;\n cursor: pointer;\n }\n\n .detailed-status__display-name {\n margin-bottom: 0;\n text-decoration: none;\n\n span {\n font-weight: 400;\n }\n }\n }\n}\n\n.memoriam-widget {\n padding: 20px;\n border-radius: 4px;\n background: $base-shadow-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n font-size: 14px;\n color: $darker-text-color;\n margin-bottom: 10px;\n}\n\n.page-header {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n padding: 60px 15px;\n text-align: center;\n margin: 10px 0;\n\n h1 {\n color: $primary-text-color;\n font-size: 36px;\n line-height: 1.1;\n font-weight: 700;\n margin-bottom: 10px;\n }\n\n p {\n font-size: 15px;\n color: $darker-text-color;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-top: 0;\n background: lighten($ui-base-color, 4%);\n\n h1 {\n font-size: 24px;\n }\n }\n}\n\n.directory {\n background: $ui-base-color;\n border-radius: 4px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &__tag {\n box-sizing: border-box;\n margin-bottom: 10px;\n\n & > a,\n & > div {\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: $ui-base-color;\n border-radius: 4px;\n padding: 15px;\n text-decoration: none;\n color: inherit;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n }\n\n & > a {\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 8%);\n }\n }\n\n &.active > a {\n background: $ui-highlight-color;\n cursor: default;\n }\n\n &.disabled > div {\n opacity: 0.5;\n cursor: default;\n }\n\n h4 {\n flex: 1 1 auto;\n font-size: 18px;\n font-weight: 700;\n color: $primary-text-color;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n .fa {\n color: $darker-text-color;\n }\n\n small {\n display: block;\n font-weight: 400;\n font-size: 15px;\n margin-top: 8px;\n color: $darker-text-color;\n }\n }\n\n &.active h4 {\n &,\n .fa,\n small {\n color: $primary-text-color;\n }\n }\n\n .avatar-stack {\n flex: 0 0 auto;\n width: (36px + 4px) * 3;\n }\n\n &.active .avatar-stack .account__avatar {\n border-color: $ui-highlight-color;\n }\n }\n}\n\n.avatar-stack {\n display: flex;\n justify-content: flex-end;\n\n .account__avatar {\n flex: 0 0 auto;\n width: 36px;\n height: 36px;\n border-radius: 50%;\n position: relative;\n margin-left: -10px;\n background: darken($ui-base-color, 8%);\n border: 2px solid $ui-base-color;\n\n &:nth-child(1) {\n z-index: 1;\n }\n\n &:nth-child(2) {\n z-index: 2;\n }\n\n &:nth-child(3) {\n z-index: 3;\n }\n }\n}\n\n.accounts-table {\n width: 100%;\n\n .account {\n padding: 0;\n border: 0;\n }\n\n strong {\n font-weight: 700;\n }\n\n thead th {\n text-align: center;\n text-transform: uppercase;\n color: $darker-text-color;\n font-weight: 700;\n padding: 10px;\n\n &:first-child {\n text-align: left;\n }\n }\n\n tbody td {\n padding: 15px 0;\n vertical-align: middle;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n tbody tr:last-child td {\n border-bottom: 0;\n }\n\n &__count {\n width: 120px;\n text-align: center;\n font-size: 15px;\n font-weight: 500;\n color: $primary-text-color;\n\n small {\n display: block;\n color: $darker-text-color;\n font-weight: 400;\n font-size: 14px;\n }\n }\n\n &__comment {\n width: 50%;\n vertical-align: initial !important;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n tbody td.optional {\n display: none;\n }\n }\n}\n\n.moved-account-widget,\n.memoriam-widget,\n.box-widget,\n.contact-widget,\n.landing-page__information.contact-widget,\n.directory,\n.page-header {\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n box-shadow: none;\n border-radius: 0;\n }\n}\n\n$maximum-width: 1235px;\n$fluid-breakpoint: $maximum-width + 20px;\n\n.statuses-grid {\n min-height: 600px;\n\n @media screen and (max-width: 640px) {\n width: 100% !important; // Masonry layout is unnecessary at this width\n }\n\n &__item {\n width: (960px - 20px) / 3;\n\n @media screen and (max-width: $fluid-breakpoint) {\n width: (940px - 20px) / 3;\n }\n\n @media screen and (max-width: 640px) {\n width: 100%;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n width: 100vw;\n }\n }\n\n .detailed-status {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 1px solid lighten($ui-base-color, 16%);\n }\n\n &.compact {\n .detailed-status__meta {\n margin-top: 15px;\n }\n\n .status__content {\n font-size: 15px;\n line-height: 20px;\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n .status__content__spoiler-link {\n line-height: 20px;\n margin: 0;\n }\n }\n\n .media-gallery,\n .status-card,\n .video-player {\n margin-top: 15px;\n }\n }\n }\n}\n\n.notice-widget {\n margin-bottom: 10px;\n color: $darker-text-color;\n\n p {\n margin-bottom: 10px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n font-size: 14px;\n line-height: 20px;\n }\n}\n\n.notice-widget,\n.placeholder-widget {\n a {\n text-decoration: none;\n font-weight: 500;\n color: $ui-highlight-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.table-of-contents {\n background: darken($ui-base-color, 4%);\n min-height: 100%;\n font-size: 14px;\n border-radius: 4px;\n\n li a {\n display: block;\n font-weight: 500;\n padding: 15px;\n overflow: hidden;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n text-decoration: none;\n color: $primary-text-color;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n\n li:last-child a {\n border-bottom: 0;\n }\n\n li ul {\n padding-left: 20px;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n }\n}\n","$no-columns-breakpoint: 600px;\n\ncode {\n font-family: $font-monospace, monospace;\n font-weight: 400;\n}\n\n.form-container {\n max-width: 400px;\n padding: 20px;\n margin: 0 auto;\n}\n\n.simple_form {\n .input {\n margin-bottom: 15px;\n overflow: hidden;\n\n &.hidden {\n margin: 0;\n }\n\n &.radio_buttons {\n .radio {\n margin-bottom: 15px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .radio > label {\n position: relative;\n padding-left: 28px;\n\n input {\n position: absolute;\n top: -2px;\n left: 0;\n }\n }\n }\n\n &.boolean {\n position: relative;\n margin-bottom: 0;\n\n .label_input > label {\n font-family: inherit;\n font-size: 14px;\n padding-top: 5px;\n color: $primary-text-color;\n display: block;\n width: auto;\n }\n\n .label_input,\n .hint {\n padding-left: 28px;\n }\n\n .label_input__wrapper {\n position: static;\n }\n\n label.checkbox {\n position: absolute;\n top: 2px;\n left: 0;\n }\n\n label a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: none;\n }\n }\n\n .recommended {\n position: absolute;\n margin: 0 4px;\n margin-top: -2px;\n }\n }\n }\n\n .row {\n display: flex;\n margin: 0 -5px;\n\n .input {\n box-sizing: border-box;\n flex: 1 1 auto;\n width: 50%;\n padding: 0 5px;\n }\n }\n\n .hint {\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n }\n\n code {\n border-radius: 3px;\n padding: 0.2em 0.4em;\n background: darken($ui-base-color, 12%);\n }\n }\n\n span.hint {\n display: block;\n font-size: 12px;\n margin-top: 4px;\n }\n\n p.hint {\n margin-bottom: 15px;\n color: $darker-text-color;\n\n &.subtle-hint {\n text-align: center;\n font-size: 12px;\n line-height: 18px;\n margin-top: 15px;\n margin-bottom: 0;\n }\n }\n\n .card {\n margin-bottom: 15px;\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n .input.with_floating_label {\n .label_input {\n display: flex;\n\n & > label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 500;\n min-width: 150px;\n flex: 0 0 auto;\n }\n\n input,\n select {\n flex: 1 1 auto;\n }\n }\n\n &.select .hint {\n margin-top: 6px;\n margin-left: 150px;\n }\n }\n\n .input.with_label {\n .label_input > label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: block;\n margin-bottom: 8px;\n word-wrap: break-word;\n font-weight: 500;\n }\n\n .hint {\n margin-top: 6px;\n }\n\n ul {\n flex: 390px;\n }\n }\n\n .input.with_block_label {\n max-width: none;\n\n & > label {\n font-family: inherit;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n font-weight: 500;\n padding-top: 5px;\n }\n\n .hint {\n margin-bottom: 15px;\n }\n\n ul {\n columns: 2;\n }\n }\n\n .input.datetime .label_input select {\n display: inline-block;\n width: auto;\n flex: 0;\n }\n\n .required abbr {\n text-decoration: none;\n color: lighten($error-value-color, 12%);\n }\n\n .fields-group {\n margin-bottom: 25px;\n\n .input:last-child {\n margin-bottom: 0;\n }\n }\n\n .fields-row {\n display: flex;\n margin: 0 -10px;\n padding-top: 5px;\n margin-bottom: 25px;\n\n .input {\n max-width: none;\n }\n\n &__column {\n box-sizing: border-box;\n padding: 0 10px;\n flex: 1 1 auto;\n min-height: 1px;\n\n &-6 {\n max-width: 50%;\n }\n\n .actions {\n margin-top: 27px;\n }\n }\n\n .fields-group:last-child,\n .fields-row__column.fields-group {\n margin-bottom: 0;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n margin-bottom: 0;\n\n &__column {\n max-width: none;\n }\n\n .fields-group:last-child,\n .fields-row__column.fields-group,\n .fields-row__column {\n margin-bottom: 25px;\n }\n }\n }\n\n .input.radio_buttons .radio label {\n margin-bottom: 5px;\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: block;\n width: auto;\n }\n\n .check_boxes {\n .checkbox {\n label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: inline-block;\n width: auto;\n position: relative;\n padding-top: 5px;\n padding-left: 25px;\n flex: 1 1 auto;\n }\n\n input[type=checkbox] {\n position: absolute;\n left: 0;\n top: 5px;\n margin: 0;\n }\n }\n }\n\n .input.static .label_input__wrapper {\n font-size: 16px;\n padding: 10px;\n border: 1px solid $dark-text-color;\n border-radius: 4px;\n }\n\n input[type=text],\n input[type=number],\n input[type=email],\n input[type=password],\n textarea {\n box-sizing: border-box;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n width: 100%;\n outline: 0;\n font-family: inherit;\n resize: vertical;\n background: darken($ui-base-color, 10%);\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n padding: 10px;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &:invalid {\n box-shadow: none;\n }\n\n &:focus:invalid:not(:placeholder-shown) {\n border-color: lighten($error-red, 12%);\n }\n\n &:required:valid {\n border-color: $valid-value-color;\n }\n\n &:hover {\n border-color: darken($ui-base-color, 20%);\n }\n\n &:active,\n &:focus {\n border-color: $highlight-text-color;\n background: darken($ui-base-color, 8%);\n }\n }\n\n .input.field_with_errors {\n label {\n color: lighten($error-red, 12%);\n }\n\n input[type=text],\n input[type=number],\n input[type=email],\n input[type=password],\n textarea,\n select {\n border-color: lighten($error-red, 12%);\n }\n\n .error {\n display: block;\n font-weight: 500;\n color: lighten($error-red, 12%);\n margin-top: 4px;\n }\n }\n\n .input.disabled {\n opacity: 0.5;\n }\n\n .actions {\n margin-top: 30px;\n display: flex;\n\n &.actions--top {\n margin-top: 0;\n margin-bottom: 30px;\n }\n }\n\n button,\n .button,\n .block-button {\n display: block;\n width: 100%;\n border: 0;\n border-radius: 4px;\n background: $ui-highlight-color;\n color: $primary-text-color;\n font-size: 18px;\n line-height: inherit;\n height: auto;\n padding: 10px;\n text-transform: uppercase;\n text-decoration: none;\n text-align: center;\n box-sizing: border-box;\n cursor: pointer;\n font-weight: 500;\n outline: 0;\n margin-bottom: 10px;\n margin-right: 10px;\n\n &:last-child {\n margin-right: 0;\n }\n\n &:hover {\n background-color: lighten($ui-highlight-color, 5%);\n }\n\n &:active,\n &:focus {\n background-color: darken($ui-highlight-color, 5%);\n }\n\n &:disabled:hover {\n background-color: $ui-primary-color;\n }\n\n &.negative {\n background: $error-value-color;\n\n &:hover {\n background-color: lighten($error-value-color, 5%);\n }\n\n &:active,\n &:focus {\n background-color: darken($error-value-color, 5%);\n }\n }\n }\n\n select {\n appearance: none;\n box-sizing: border-box;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n width: 100%;\n outline: 0;\n font-family: inherit;\n resize: vertical;\n background: darken($ui-base-color, 10%) url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center / auto 16px;\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n padding-left: 10px;\n padding-right: 30px;\n height: 41px;\n }\n\n h4 {\n margin-bottom: 15px !important;\n }\n\n .label_input {\n &__wrapper {\n position: relative;\n }\n\n &__append {\n position: absolute;\n right: 3px;\n top: 1px;\n padding: 10px;\n padding-bottom: 9px;\n font-size: 16px;\n color: $dark-text-color;\n font-family: inherit;\n pointer-events: none;\n cursor: default;\n max-width: 140px;\n white-space: nowrap;\n overflow: hidden;\n\n &::after {\n content: '';\n display: block;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 1px;\n width: 5px;\n background-image: linear-gradient(to right, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));\n }\n }\n }\n\n &__overlay-area {\n position: relative;\n\n &__blurred form {\n filter: blur(2px);\n }\n\n &__overlay {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n background: rgba($ui-base-color, 0.65);\n border-radius: 4px;\n margin-left: -4px;\n margin-top: -4px;\n padding: 4px;\n\n &__content {\n text-align: center;\n\n &.rich-formatting {\n &,\n p {\n color: $primary-text-color;\n }\n }\n }\n }\n }\n}\n\n.block-icon {\n display: block;\n margin: 0 auto;\n margin-bottom: 10px;\n font-size: 24px;\n}\n\n.flash-message {\n background: lighten($ui-base-color, 8%);\n color: $darker-text-color;\n border-radius: 4px;\n padding: 15px 10px;\n margin-bottom: 30px;\n text-align: center;\n\n &.notice {\n border: 1px solid rgba($valid-value-color, 0.5);\n background: rgba($valid-value-color, 0.25);\n color: $valid-value-color;\n }\n\n &.alert {\n border: 1px solid rgba($error-value-color, 0.5);\n background: rgba($error-value-color, 0.25);\n color: $error-value-color;\n }\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n\n &:hover {\n color: $primary-text-color;\n text-decoration: underline;\n }\n }\n\n p {\n margin-bottom: 15px;\n }\n\n .oauth-code {\n outline: 0;\n box-sizing: border-box;\n display: block;\n width: 100%;\n border: none;\n padding: 10px;\n font-family: $font-monospace, monospace;\n background: $ui-base-color;\n color: $primary-text-color;\n font-size: 14px;\n margin: 0;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n @media screen and (max-width: 740px) and (min-width: 441px) {\n margin-top: 40px;\n }\n}\n\n.form-footer {\n margin-top: 30px;\n text-align: center;\n\n a {\n color: $darker-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.quick-nav {\n list-style: none;\n margin-bottom: 25px;\n font-size: 14px;\n\n li {\n display: inline-block;\n margin-right: 10px;\n }\n\n a {\n color: $highlight-text-color;\n text-transform: uppercase;\n text-decoration: none;\n font-weight: 700;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($highlight-text-color, 8%);\n }\n }\n}\n\n.oauth-prompt,\n.follow-prompt {\n margin-bottom: 30px;\n color: $darker-text-color;\n\n h2 {\n font-size: 16px;\n margin-bottom: 30px;\n text-align: center;\n }\n\n strong {\n color: $secondary-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n @media screen and (max-width: 740px) and (min-width: 441px) {\n margin-top: 40px;\n }\n}\n\n.qr-wrapper {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n}\n\n.qr-code {\n flex: 0 0 auto;\n background: $simple-background-color;\n padding: 4px;\n margin: 0 10px 20px 0;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n display: inline-block;\n\n svg {\n display: block;\n margin: 0;\n }\n}\n\n.qr-alternative {\n margin-bottom: 20px;\n color: $secondary-text-color;\n flex: 150px;\n\n samp {\n display: block;\n font-size: 14px;\n }\n}\n\n.table-form {\n p {\n margin-bottom: 15px;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n }\n}\n\n.simple_form,\n.table-form {\n .warning {\n box-sizing: border-box;\n background: rgba($error-value-color, 0.5);\n color: $primary-text-color;\n text-shadow: 1px 1px 0 rgba($base-shadow-color, 0.3);\n box-shadow: 0 2px 6px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n padding: 10px;\n margin-bottom: 15px;\n\n a {\n color: $primary-text-color;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n strong {\n font-weight: 600;\n display: block;\n margin-bottom: 5px;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n\n .fa {\n font-weight: 400;\n }\n }\n }\n}\n\n.action-pagination {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n\n .actions,\n .pagination {\n flex: 1 1 auto;\n }\n\n .actions {\n padding: 30px 0;\n padding-right: 20px;\n flex: 0 0 auto;\n }\n}\n\n.post-follow-actions {\n text-align: center;\n color: $darker-text-color;\n\n div {\n margin-bottom: 4px;\n }\n}\n\n.alternative-login {\n margin-top: 20px;\n margin-bottom: 20px;\n\n h4 {\n font-size: 16px;\n color: $primary-text-color;\n text-align: center;\n margin-bottom: 20px;\n border: 0;\n padding: 0;\n }\n\n .button {\n display: block;\n }\n}\n\n.scope-danger {\n color: $warning-red;\n}\n\n.form_admin_settings_site_short_description,\n.form_admin_settings_site_description,\n.form_admin_settings_site_extended_description,\n.form_admin_settings_site_terms,\n.form_admin_settings_custom_css,\n.form_admin_settings_closed_registrations_message {\n textarea {\n font-family: $font-monospace, monospace;\n }\n}\n\n.input-copy {\n background: darken($ui-base-color, 10%);\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n display: flex;\n align-items: center;\n padding-right: 4px;\n position: relative;\n top: 1px;\n transition: border-color 300ms linear;\n\n &__wrapper {\n flex: 1 1 auto;\n }\n\n input[type=text] {\n background: transparent;\n border: 0;\n padding: 10px;\n font-size: 14px;\n font-family: $font-monospace, monospace;\n }\n\n button {\n flex: 0 0 auto;\n margin: 4px;\n text-transform: none;\n font-weight: 400;\n font-size: 14px;\n padding: 7px 18px;\n padding-bottom: 6px;\n width: auto;\n transition: background 300ms linear;\n }\n\n &.copied {\n border-color: $valid-value-color;\n transition: none;\n\n button {\n background: $valid-value-color;\n transition: none;\n }\n }\n}\n\n.connection-prompt {\n margin-bottom: 25px;\n\n .fa-link {\n background-color: darken($ui-base-color, 4%);\n border-radius: 100%;\n font-size: 24px;\n padding: 10px;\n }\n\n &__column {\n align-items: center;\n display: flex;\n flex: 1;\n flex-direction: column;\n flex-shrink: 1;\n max-width: 50%;\n\n &-sep {\n align-self: center;\n flex-grow: 0;\n overflow: visible;\n position: relative;\n z-index: 1;\n }\n\n p {\n word-break: break-word;\n }\n }\n\n .account__avatar {\n margin-bottom: 20px;\n }\n\n &__connection {\n background-color: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n padding: 25px 10px;\n position: relative;\n text-align: center;\n\n &::after {\n background-color: darken($ui-base-color, 4%);\n content: '';\n display: block;\n height: 100%;\n left: 50%;\n position: absolute;\n top: 0;\n width: 1px;\n }\n }\n\n &__row {\n align-items: flex-start;\n display: flex;\n flex-direction: row;\n }\n}\n",".card {\n & > a {\n display: block;\n text-decoration: none;\n color: inherit;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n box-shadow: none;\n }\n\n &:hover,\n &:active,\n &:focus {\n .card__bar {\n background: lighten($ui-base-color, 8%);\n }\n }\n }\n\n &__img {\n height: 130px;\n position: relative;\n background: darken($ui-base-color, 12%);\n border-radius: 4px 4px 0 0;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n object-fit: cover;\n border-radius: 4px 4px 0 0;\n }\n\n @media screen and (max-width: 600px) {\n height: 200px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n\n &__bar {\n position: relative;\n padding: 15px;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n\n .avatar {\n flex: 0 0 auto;\n width: 48px;\n height: 48px;\n @include avatar-size(48px);\n padding-top: 2px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n @include avatar-radius();\n background: darken($ui-base-color, 8%);\n object-fit: cover;\n }\n }\n\n .display-name {\n margin-left: 15px;\n text-align: left;\n\n strong {\n font-size: 15px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n span {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n}\n\n.pagination {\n padding: 30px 0;\n text-align: center;\n overflow: hidden;\n\n a,\n .current,\n .newer,\n .older,\n .page,\n .gap {\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 500;\n display: inline-block;\n padding: 6px 10px;\n text-decoration: none;\n }\n\n .current {\n background: $simple-background-color;\n border-radius: 100px;\n color: $inverted-text-color;\n cursor: default;\n margin: 0 10px;\n }\n\n .gap {\n cursor: default;\n }\n\n .older,\n .newer {\n text-transform: uppercase;\n color: $secondary-text-color;\n }\n\n .older {\n float: left;\n padding-left: 0;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n .newer {\n float: right;\n padding-right: 0;\n\n .fa {\n display: inline-block;\n margin-left: 5px;\n }\n }\n\n .disabled {\n cursor: default;\n color: lighten($inverted-text-color, 10%);\n }\n\n @media screen and (max-width: 700px) {\n padding: 30px 20px;\n\n .page {\n display: none;\n }\n\n .newer,\n .older {\n display: inline-block;\n }\n }\n}\n\n.nothing-here {\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n color: $light-text-color;\n font-size: 14px;\n font-weight: 500;\n text-align: center;\n display: flex;\n justify-content: center;\n align-items: center;\n cursor: default;\n border-radius: 4px;\n padding: 20px;\n min-height: 30vh;\n\n &--under-tabs {\n border-radius: 0 0 4px 4px;\n }\n\n &--flexible {\n box-sizing: border-box;\n min-height: 100%;\n }\n}\n\n.account-role,\n.simple_form .recommended {\n display: inline-block;\n padding: 4px 6px;\n cursor: default;\n border-radius: 3px;\n font-size: 12px;\n line-height: 12px;\n font-weight: 500;\n color: $ui-secondary-color;\n background-color: rgba($ui-secondary-color, 0.1);\n border: 1px solid rgba($ui-secondary-color, 0.5);\n\n &.moderator {\n color: $success-green;\n background-color: rgba($success-green, 0.1);\n border-color: rgba($success-green, 0.5);\n }\n\n &.admin {\n color: lighten($error-red, 12%);\n background-color: rgba(lighten($error-red, 12%), 0.1);\n border-color: rgba(lighten($error-red, 12%), 0.5);\n }\n}\n\n.account__header__fields {\n max-width: 100vw;\n padding: 0;\n margin: 15px -15px -15px;\n border: 0 none;\n border-top: 1px solid lighten($ui-base-color, 12%);\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n font-size: 14px;\n line-height: 20px;\n\n dl {\n display: flex;\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n }\n\n dt,\n dd {\n box-sizing: border-box;\n padding: 14px;\n text-align: center;\n max-height: 48px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n dt {\n font-weight: 500;\n width: 120px;\n flex: 0 0 auto;\n color: $secondary-text-color;\n background: rgba(darken($ui-base-color, 8%), 0.5);\n }\n\n dd {\n flex: 1 1 auto;\n color: $darker-text-color;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n\n .verified {\n border: 1px solid rgba($valid-value-color, 0.5);\n background: rgba($valid-value-color, 0.25);\n\n a {\n color: $valid-value-color;\n font-weight: 500;\n }\n\n &__mark {\n color: $valid-value-color;\n }\n }\n\n dl:last-child {\n border-bottom: 0;\n }\n}\n\n.directory__tag .trends__item__current {\n width: auto;\n}\n\n.pending-account {\n &__header {\n color: $darker-text-color;\n\n a {\n color: $ui-secondary-color;\n text-decoration: none;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n\n strong {\n color: $primary-text-color;\n font-weight: 700;\n }\n }\n\n &__body {\n margin-top: 10px;\n }\n}\n",".activity-stream {\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n overflow: hidden;\n margin-bottom: 10px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n border-radius: 0;\n box-shadow: none;\n }\n\n &--headless {\n border-radius: 0;\n margin: 0;\n box-shadow: none;\n\n .detailed-status,\n .status {\n border-radius: 0 !important;\n }\n }\n\n div[data-component] {\n width: 100%;\n }\n\n .entry {\n background: $ui-base-color;\n\n .detailed-status,\n .status,\n .load-more {\n animation: none;\n }\n\n &:last-child {\n .detailed-status,\n .status,\n .load-more {\n border-bottom: 0;\n border-radius: 0 0 4px 4px;\n }\n }\n\n &:first-child {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 4px 4px 0 0;\n }\n\n &:last-child {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 4px;\n }\n }\n }\n\n @media screen and (max-width: 740px) {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 0 !important;\n }\n }\n }\n\n &--highlighted .entry {\n background: lighten($ui-base-color, 8%);\n }\n}\n\n.button.logo-button {\n flex: 0 auto;\n font-size: 14px;\n background: $ui-highlight-color;\n color: $primary-text-color;\n text-transform: none;\n line-height: 36px;\n height: auto;\n padding: 3px 15px;\n border: 0;\n\n svg {\n width: 20px;\n height: auto;\n vertical-align: middle;\n margin-right: 5px;\n fill: $primary-text-color;\n }\n\n &:active,\n &:focus,\n &:hover {\n background: lighten($ui-highlight-color, 10%);\n }\n\n &:disabled,\n &.disabled {\n &:active,\n &:focus,\n &:hover {\n background: $ui-primary-color;\n }\n }\n\n &.button--destructive {\n &:active,\n &:focus,\n &:hover {\n background: $error-red;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n svg {\n display: none;\n }\n }\n}\n\n.embed,\n.public-layout {\n .detailed-status {\n padding: 15px;\n }\n\n .status {\n padding: 15px 15px 15px (48px + 15px * 2);\n min-height: 48px + 2px;\n\n &__avatar {\n left: 15px;\n top: 17px;\n }\n\n &__content {\n padding-top: 5px;\n }\n\n &__prepend {\n padding: 8px 0;\n padding-bottom: 2px;\n margin: initial;\n margin-left: 48px + 15px * 2;\n padding-top: 15px;\n }\n\n &__prepend-icon-wrapper {\n position: absolute;\n margin: initial;\n float: initial;\n width: auto;\n left: -32px;\n }\n\n .media-gallery,\n &__action-bar,\n .video-player {\n margin-top: 10px;\n }\n }\n}\n\n// Styling from upstream's WebUI, as public pages use the same layout\n.embed,\n.public-layout {\n .status {\n .status__info {\n font-size: 15px;\n display: initial;\n }\n\n .status__relative-time {\n color: $dark-text-color;\n float: right;\n font-size: 14px;\n width: auto;\n margin: initial;\n padding: initial;\n }\n\n .status__info .status__display-name {\n display: block;\n max-width: 100%;\n padding: 6px 0;\n padding-right: 25px;\n margin: initial;\n\n .display-name strong {\n display: inline;\n }\n }\n\n .status__avatar {\n height: 48px;\n position: absolute;\n width: 48px;\n margin: initial;\n }\n }\n}\n\n.rtl {\n .embed,\n .public-layout {\n .status {\n padding-left: 10px;\n padding-right: 68px;\n\n .status__info .status__display-name {\n padding-left: 25px;\n padding-right: 0;\n }\n\n .status__relative-time {\n float: left;\n }\n }\n }\n}\n\n.status__content__read-more-button {\n display: block;\n font-size: 15px;\n line-height: 20px;\n color: lighten($ui-highlight-color, 8%);\n border: 0;\n background: transparent;\n padding: 0;\n padding-top: 8px;\n text-decoration: none;\n\n &:hover,\n &:active {\n text-decoration: underline;\n }\n}\n",".app-body {\n -webkit-overflow-scrolling: touch;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n}\n\n.animated-number {\n display: inline-flex;\n flex-direction: column;\n align-items: stretch;\n overflow: hidden;\n position: relative;\n}\n\n.link-button {\n display: block;\n font-size: 15px;\n line-height: 20px;\n color: $ui-highlight-color;\n border: 0;\n background: transparent;\n padding: 0;\n cursor: pointer;\n\n &:hover,\n &:active {\n text-decoration: underline;\n }\n\n &:disabled {\n color: $ui-primary-color;\n cursor: default;\n }\n}\n\n.button {\n background-color: darken($ui-highlight-color, 3%);\n border: 10px none;\n border-radius: 4px;\n box-sizing: border-box;\n color: $primary-text-color;\n cursor: pointer;\n display: inline-block;\n font-family: inherit;\n font-size: 14px;\n font-weight: 500;\n height: 36px;\n letter-spacing: 0;\n line-height: 36px;\n overflow: hidden;\n padding: 0 16px;\n position: relative;\n text-align: center;\n text-transform: uppercase;\n text-decoration: none;\n text-overflow: ellipsis;\n transition: all 100ms ease-in;\n transition-property: background-color;\n white-space: nowrap;\n width: auto;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-highlight-color, 7%);\n transition: all 200ms ease-out;\n transition-property: background-color;\n }\n\n &--destructive {\n transition: none;\n\n &:active,\n &:focus,\n &:hover {\n background-color: $error-red;\n transition: none;\n }\n }\n\n &:disabled {\n background-color: $ui-primary-color;\n cursor: default;\n }\n\n &.button-primary,\n &.button-alternative,\n &.button-secondary,\n &.button-alternative-2 {\n font-size: 16px;\n line-height: 36px;\n height: auto;\n text-transform: none;\n padding: 4px 16px;\n }\n\n &.button-alternative {\n color: $inverted-text-color;\n background: $ui-primary-color;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-primary-color, 4%);\n }\n }\n\n &.button-alternative-2 {\n background: $ui-base-lighter-color;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-base-lighter-color, 4%);\n }\n }\n\n &.button-secondary {\n font-size: 16px;\n line-height: 36px;\n height: auto;\n color: $darker-text-color;\n text-transform: none;\n background: transparent;\n padding: 3px 15px;\n border-radius: 4px;\n border: 1px solid $ui-primary-color;\n\n &:active,\n &:focus,\n &:hover {\n border-color: lighten($ui-primary-color, 4%);\n color: lighten($darker-text-color, 4%);\n }\n\n &:disabled {\n opacity: 0.5;\n }\n }\n\n &.button--block {\n display: block;\n width: 100%;\n }\n}\n\n.icon-button {\n display: inline-block;\n padding: 0;\n color: $action-button-color;\n border: 0;\n border-radius: 4px;\n background: transparent;\n cursor: pointer;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($action-button-color, 7%);\n background-color: rgba($action-button-color, 0.15);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n }\n\n &:focus {\n background-color: rgba($action-button-color, 0.3);\n }\n\n &.disabled {\n color: darken($action-button-color, 13%);\n background-color: transparent;\n cursor: default;\n }\n\n &.active {\n color: $highlight-text-color;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &.inverted {\n color: $lighter-text-color;\n\n &:hover,\n &:active,\n &:focus {\n color: darken($lighter-text-color, 7%);\n background-color: rgba($lighter-text-color, 0.15);\n }\n\n &:focus {\n background-color: rgba($lighter-text-color, 0.3);\n }\n\n &.disabled {\n color: lighten($lighter-text-color, 7%);\n background-color: transparent;\n }\n\n &.active {\n color: $highlight-text-color;\n\n &.disabled {\n color: lighten($highlight-text-color, 13%);\n }\n }\n }\n\n &.overlayed {\n box-sizing: content-box;\n background: rgba($base-overlay-background, 0.6);\n color: rgba($primary-text-color, 0.7);\n border-radius: 4px;\n padding: 2px;\n\n &:hover {\n background: rgba($base-overlay-background, 0.9);\n }\n }\n}\n\n.text-icon-button {\n color: $lighter-text-color;\n border: 0;\n border-radius: 4px;\n background: transparent;\n cursor: pointer;\n font-weight: 600;\n font-size: 11px;\n padding: 0 3px;\n line-height: 27px;\n outline: 0;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &:hover,\n &:active,\n &:focus {\n color: darken($lighter-text-color, 7%);\n background-color: rgba($lighter-text-color, 0.15);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n }\n\n &:focus {\n background-color: rgba($lighter-text-color, 0.3);\n }\n\n &.disabled {\n color: lighten($lighter-text-color, 20%);\n background-color: transparent;\n cursor: default;\n }\n\n &.active {\n color: $highlight-text-color;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n}\n\n.dropdown-menu {\n position: absolute;\n transform-origin: 50% 0;\n}\n\n.invisible {\n font-size: 0;\n line-height: 0;\n display: inline-block;\n width: 0;\n height: 0;\n position: absolute;\n\n img,\n svg {\n margin: 0 !important;\n border: 0 !important;\n padding: 0 !important;\n width: 0 !important;\n height: 0 !important;\n }\n}\n\n.ellipsis {\n &::after {\n content: \"…\";\n }\n}\n\n.notification__favourite-icon-wrapper {\n left: 0;\n position: absolute;\n\n .fa.star-icon {\n color: $gold-star;\n }\n}\n\n.star-icon.active {\n color: $gold-star;\n}\n\n.bookmark-icon.active {\n color: $red-bookmark;\n}\n\n.no-reduce-motion .icon-button.star-icon {\n &.activate {\n & > .fa-star {\n animation: spring-rotate-in 1s linear;\n }\n }\n\n &.deactivate {\n & > .fa-star {\n animation: spring-rotate-out 1s linear;\n }\n }\n}\n\n.notification__display-name {\n color: inherit;\n font-weight: 500;\n text-decoration: none;\n\n &:hover {\n color: $primary-text-color;\n text-decoration: underline;\n }\n}\n\n.display-name {\n display: block;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n a {\n color: inherit;\n text-decoration: inherit;\n }\n\n strong {\n height: 18px;\n font-size: 16px;\n font-weight: 500;\n line-height: 18px;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n }\n\n span {\n display: block;\n height: 18px;\n font-size: 15px;\n line-height: 18px;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n }\n\n > a:hover {\n strong {\n text-decoration: underline;\n }\n }\n\n &.inline {\n padding: 0;\n height: 18px;\n font-size: 15px;\n line-height: 18px;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n\n strong {\n display: inline;\n height: auto;\n font-size: inherit;\n line-height: inherit;\n }\n\n span {\n display: inline;\n height: auto;\n font-size: inherit;\n line-height: inherit;\n }\n }\n}\n\n.display-name__html {\n font-weight: 500;\n}\n\n.display-name__account {\n font-size: 14px;\n}\n\n.image-loader {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n\n .image-loader__preview-canvas {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n background: url('~images/void.png') repeat;\n object-fit: contain;\n }\n\n .loading-bar {\n position: relative;\n }\n\n &.image-loader--amorphous .image-loader__preview-canvas {\n display: none;\n }\n}\n\n.zoomable-image {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n img {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n width: auto;\n height: auto;\n object-fit: contain;\n }\n}\n\n.dropdown {\n display: inline-block;\n}\n\n.dropdown__content {\n display: none;\n position: absolute;\n}\n\n.dropdown-menu__separator {\n border-bottom: 1px solid darken($ui-secondary-color, 8%);\n margin: 5px 7px 6px;\n height: 0;\n}\n\n.dropdown-menu {\n background: $ui-secondary-color;\n padding: 4px 0;\n border-radius: 4px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n\n ul {\n list-style: none;\n }\n}\n\n.dropdown-menu__arrow {\n position: absolute;\n width: 0;\n height: 0;\n border: 0 solid transparent;\n\n &.left {\n right: -5px;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: $ui-secondary-color;\n }\n\n &.top {\n bottom: -5px;\n margin-left: -7px;\n border-width: 5px 7px 0;\n border-top-color: $ui-secondary-color;\n }\n\n &.bottom {\n top: -5px;\n margin-left: -7px;\n border-width: 0 7px 5px;\n border-bottom-color: $ui-secondary-color;\n }\n\n &.right {\n left: -5px;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: $ui-secondary-color;\n }\n}\n\n.dropdown-menu__item {\n a {\n font-size: 13px;\n line-height: 18px;\n display: block;\n padding: 4px 14px;\n box-sizing: border-box;\n text-decoration: none;\n background: $ui-secondary-color;\n color: $inverted-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:focus,\n &:hover,\n &:active {\n background: $ui-highlight-color;\n color: $secondary-text-color;\n outline: 0;\n }\n }\n}\n\n.dropdown--active .dropdown__content {\n display: block;\n line-height: 18px;\n max-width: 311px;\n right: 0;\n text-align: left;\n z-index: 9999;\n\n & > ul {\n list-style: none;\n background: $ui-secondary-color;\n padding: 4px 0;\n border-radius: 4px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.4);\n min-width: 140px;\n position: relative;\n }\n\n &.dropdown__right {\n right: 0;\n }\n\n &.dropdown__left {\n & > ul {\n left: -98px;\n }\n }\n\n & > ul > li > a {\n font-size: 13px;\n line-height: 18px;\n display: block;\n padding: 4px 14px;\n box-sizing: border-box;\n text-decoration: none;\n background: $ui-secondary-color;\n color: $inverted-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:focus {\n outline: 0;\n }\n\n &:hover {\n background: $ui-highlight-color;\n color: $secondary-text-color;\n }\n }\n}\n\n.dropdown__icon {\n vertical-align: middle;\n}\n\n.static-content {\n padding: 10px;\n padding-top: 20px;\n color: $dark-text-color;\n\n h1 {\n font-size: 16px;\n font-weight: 500;\n margin-bottom: 40px;\n text-align: center;\n }\n\n p {\n font-size: 13px;\n margin-bottom: 20px;\n }\n}\n\n.column,\n.drawer {\n flex: 1 1 100%;\n overflow: hidden;\n}\n\n@media screen and (min-width: 631px) {\n .columns-area {\n padding: 0;\n }\n\n .column,\n .drawer {\n flex: 0 0 auto;\n padding: 10px;\n padding-left: 5px;\n padding-right: 5px;\n\n &:first-child {\n padding-left: 10px;\n }\n\n &:last-child {\n padding-right: 10px;\n }\n }\n\n .columns-area > div {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n }\n }\n}\n\n.tabs-bar {\n box-sizing: border-box;\n display: flex;\n background: lighten($ui-base-color, 8%);\n flex: 0 0 auto;\n overflow-y: auto;\n}\n\n.tabs-bar__link {\n display: block;\n flex: 1 1 auto;\n padding: 15px 10px;\n padding-bottom: 13px;\n color: $primary-text-color;\n text-decoration: none;\n text-align: center;\n font-size: 14px;\n font-weight: 500;\n border-bottom: 2px solid lighten($ui-base-color, 8%);\n transition: all 50ms linear;\n transition-property: border-bottom, background, color;\n\n .fa {\n font-weight: 400;\n font-size: 16px;\n }\n\n &:hover,\n &:focus,\n &:active {\n @include multi-columns('screen and (min-width: 631px)') {\n background: lighten($ui-base-color, 14%);\n border-bottom-color: lighten($ui-base-color, 14%);\n }\n }\n\n &.active {\n border-bottom: 2px solid $ui-highlight-color;\n color: $highlight-text-color;\n }\n\n span {\n margin-left: 5px;\n display: none;\n }\n\n span.icon {\n margin-left: 0;\n display: inline;\n }\n}\n\n.icon-with-badge {\n position: relative;\n\n &__badge {\n position: absolute;\n left: 9px;\n top: -13px;\n background: $ui-highlight-color;\n border: 2px solid lighten($ui-base-color, 8%);\n padding: 1px 6px;\n border-radius: 6px;\n font-size: 10px;\n font-weight: 500;\n line-height: 14px;\n color: $primary-text-color;\n }\n}\n\n.column-link--transparent .icon-with-badge__badge {\n border-color: darken($ui-base-color, 8%);\n}\n\n.scrollable {\n overflow-y: scroll;\n overflow-x: hidden;\n flex: 1 1 auto;\n -webkit-overflow-scrolling: touch;\n\n &.optionally-scrollable {\n overflow-y: auto;\n }\n\n @supports(display: grid) { // hack to fix Chrome <57\n contain: strict;\n }\n\n &--flex {\n display: flex;\n flex-direction: column;\n }\n\n &__append {\n flex: 1 1 auto;\n position: relative;\n min-height: 120px;\n }\n}\n\n.scrollable.fullscreen {\n @supports(display: grid) { // hack to fix Chrome <57\n contain: none;\n }\n}\n\n.react-toggle {\n display: inline-block;\n position: relative;\n cursor: pointer;\n background-color: transparent;\n border: 0;\n padding: 0;\n user-select: none;\n -webkit-tap-highlight-color: rgba($base-overlay-background, 0);\n -webkit-tap-highlight-color: transparent;\n}\n\n.react-toggle-screenreader-only {\n border: 0;\n clip: rect(0 0 0 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n}\n\n.react-toggle--disabled {\n cursor: not-allowed;\n opacity: 0.5;\n transition: opacity 0.25s;\n}\n\n.react-toggle-track {\n width: 50px;\n height: 24px;\n padding: 0;\n border-radius: 30px;\n background-color: $ui-base-color;\n transition: background-color 0.2s ease;\n}\n\n.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track {\n background-color: darken($ui-base-color, 10%);\n}\n\n.react-toggle--checked .react-toggle-track {\n background-color: $ui-highlight-color;\n}\n\n.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track {\n background-color: lighten($ui-highlight-color, 10%);\n}\n\n.react-toggle-track-check {\n position: absolute;\n width: 14px;\n height: 10px;\n top: 0;\n bottom: 0;\n margin-top: auto;\n margin-bottom: auto;\n line-height: 0;\n left: 8px;\n opacity: 0;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle--checked .react-toggle-track-check {\n opacity: 1;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle-track-x {\n position: absolute;\n width: 10px;\n height: 10px;\n top: 0;\n bottom: 0;\n margin-top: auto;\n margin-bottom: auto;\n line-height: 0;\n right: 10px;\n opacity: 1;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle--checked .react-toggle-track-x {\n opacity: 0;\n}\n\n.react-toggle-thumb {\n position: absolute;\n top: 1px;\n left: 1px;\n width: 22px;\n height: 22px;\n border: 1px solid $ui-base-color;\n border-radius: 50%;\n background-color: darken($simple-background-color, 2%);\n box-sizing: border-box;\n transition: all 0.25s ease;\n transition-property: border-color, left;\n}\n\n.react-toggle--checked .react-toggle-thumb {\n left: 27px;\n border-color: $ui-highlight-color;\n}\n\n.getting-started__wrapper,\n.getting_started,\n.flex-spacer {\n background: $ui-base-color;\n}\n\n.getting-started__wrapper {\n position: relative;\n overflow-y: auto;\n}\n\n.flex-spacer {\n flex: 1 1 auto;\n}\n\n.getting-started {\n background: $ui-base-color;\n flex: 1 0 auto;\n\n p {\n color: $secondary-text-color;\n }\n\n a {\n color: $dark-text-color;\n }\n\n &__panel {\n height: min-content;\n }\n\n &__panel,\n &__footer {\n padding: 10px;\n padding-top: 20px;\n flex: 0 1 auto;\n\n ul {\n margin-bottom: 10px;\n }\n\n ul li {\n display: inline;\n }\n\n p {\n color: $dark-text-color;\n font-size: 13px;\n\n a {\n color: $dark-text-color;\n text-decoration: underline;\n }\n }\n\n a {\n text-decoration: none;\n color: $darker-text-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n }\n\n &__trends {\n flex: 0 1 auto;\n opacity: 1;\n animation: fade 150ms linear;\n margin-top: 10px;\n\n h4 {\n font-size: 12px;\n text-transform: uppercase;\n color: $darker-text-color;\n padding: 10px;\n font-weight: 500;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n @media screen and (max-height: 810px) {\n .trends__item:nth-child(3) {\n display: none;\n }\n }\n\n @media screen and (max-height: 720px) {\n .trends__item:nth-child(2) {\n display: none;\n }\n }\n\n @media screen and (max-height: 670px) {\n display: none;\n }\n\n .trends__item {\n border-bottom: 0;\n padding: 10px;\n\n &__current {\n color: $darker-text-color;\n }\n }\n }\n}\n\n.column-link__badge {\n display: inline-block;\n border-radius: 4px;\n font-size: 12px;\n line-height: 19px;\n font-weight: 500;\n background: $ui-base-color;\n padding: 4px 8px;\n margin: -6px 10px;\n}\n\n.keyboard-shortcuts {\n padding: 8px 0 0;\n overflow: hidden;\n\n thead {\n position: absolute;\n left: -9999px;\n }\n\n td {\n padding: 0 10px 8px;\n }\n\n kbd {\n display: inline-block;\n padding: 3px 5px;\n background-color: lighten($ui-base-color, 8%);\n border: 1px solid darken($ui-base-color, 4%);\n }\n}\n\n.setting-text {\n color: $darker-text-color;\n background: transparent;\n border: none;\n border-bottom: 2px solid $ui-primary-color;\n box-sizing: border-box;\n display: block;\n font-family: inherit;\n margin-bottom: 10px;\n padding: 7px 0;\n width: 100%;\n\n &:focus,\n &:active {\n color: $primary-text-color;\n border-bottom-color: $ui-highlight-color;\n }\n\n @include limited-single-column('screen and (max-width: 600px)') {\n font-size: 16px;\n }\n\n &.light {\n color: $inverted-text-color;\n border-bottom: 2px solid lighten($ui-base-color, 27%);\n\n &:focus,\n &:active {\n color: $inverted-text-color;\n border-bottom-color: $ui-highlight-color;\n }\n }\n}\n\n.no-reduce-motion button.icon-button i.fa-retweet {\n background-position: 0 0;\n height: 19px;\n transition: background-position 0.9s steps(10);\n transition-duration: 0s;\n vertical-align: middle;\n width: 22px;\n\n &::before {\n display: none !important;\n }\n}\n\n.no-reduce-motion button.icon-button.active i.fa-retweet {\n transition-duration: 0.9s;\n background-position: 0 100%;\n}\n\n.reduce-motion button.icon-button i.fa-retweet {\n color: $action-button-color;\n transition: color 100ms ease-in;\n}\n\n.reduce-motion button.icon-button.active i.fa-retweet {\n color: $highlight-text-color;\n}\n\n.reduce-motion button.icon-button.disabled i.fa-retweet {\n color: darken($action-button-color, 13%);\n}\n\n.load-more {\n display: block;\n color: $dark-text-color;\n background-color: transparent;\n border: 0;\n font-size: inherit;\n text-align: center;\n line-height: inherit;\n margin: 0;\n padding: 15px;\n box-sizing: border-box;\n width: 100%;\n clear: both;\n text-decoration: none;\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n}\n\n.load-gap {\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n}\n\n.missing-indicator {\n padding-top: 20px + 48px;\n}\n\n.scrollable > div > :first-child .notification__dismiss-overlay > .wrappy {\n border-top: 1px solid $ui-base-color;\n}\n\n.notification__dismiss-overlay {\n overflow: hidden;\n position: absolute;\n top: 0;\n right: 0;\n bottom: -1px;\n padding-left: 15px; // space for the box shadow to be visible\n\n z-index: 999;\n align-items: center;\n justify-content: flex-end;\n cursor: pointer;\n\n display: flex;\n\n .wrappy {\n width: $dismiss-overlay-width;\n align-self: stretch;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background: lighten($ui-base-color, 8%);\n border-left: 1px solid lighten($ui-base-color, 20%);\n box-shadow: 0 0 5px black;\n border-bottom: 1px solid $ui-base-color;\n }\n\n .ckbox {\n border: 2px solid $ui-primary-color;\n border-radius: 2px;\n width: 30px;\n height: 30px;\n font-size: 20px;\n color: $darker-text-color;\n text-shadow: 0 0 5px black;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n &:focus {\n outline: 0 !important;\n\n .ckbox {\n box-shadow: 0 0 1px 1px $ui-highlight-color;\n }\n }\n}\n\n.text-btn {\n display: inline-block;\n padding: 0;\n font-family: inherit;\n font-size: inherit;\n color: inherit;\n border: 0;\n background: transparent;\n cursor: pointer;\n}\n\n.loading-indicator {\n color: $dark-text-color;\n font-size: 12px;\n font-weight: 400;\n text-transform: uppercase;\n overflow: visible;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n\n span {\n display: block;\n float: left;\n margin-left: 50%;\n transform: translateX(-50%);\n margin: 82px 0 0 50%;\n white-space: nowrap;\n }\n}\n\n.loading-indicator__figure {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 42px;\n height: 42px;\n box-sizing: border-box;\n background-color: transparent;\n border: 0 solid lighten($ui-base-color, 26%);\n border-width: 6px;\n border-radius: 50%;\n}\n\n.no-reduce-motion .loading-indicator span {\n animation: loader-label 1.15s infinite cubic-bezier(0.215, 0.610, 0.355, 1.000);\n}\n\n.no-reduce-motion .loading-indicator__figure {\n animation: loader-figure 1.15s infinite cubic-bezier(0.215, 0.610, 0.355, 1.000);\n}\n\n@keyframes spring-rotate-in {\n 0% {\n transform: rotate(0deg);\n }\n\n 30% {\n transform: rotate(-484.8deg);\n }\n\n 60% {\n transform: rotate(-316.7deg);\n }\n\n 90% {\n transform: rotate(-375deg);\n }\n\n 100% {\n transform: rotate(-360deg);\n }\n}\n\n@keyframes spring-rotate-out {\n 0% {\n transform: rotate(-360deg);\n }\n\n 30% {\n transform: rotate(124.8deg);\n }\n\n 60% {\n transform: rotate(-43.27deg);\n }\n\n 90% {\n transform: rotate(15deg);\n }\n\n 100% {\n transform: rotate(0deg);\n }\n}\n\n@keyframes loader-figure {\n 0% {\n width: 0;\n height: 0;\n background-color: lighten($ui-base-color, 26%);\n }\n\n 29% {\n background-color: lighten($ui-base-color, 26%);\n }\n\n 30% {\n width: 42px;\n height: 42px;\n background-color: transparent;\n border-width: 21px;\n opacity: 1;\n }\n\n 100% {\n width: 42px;\n height: 42px;\n border-width: 0;\n opacity: 0;\n background-color: transparent;\n }\n}\n\n@keyframes loader-label {\n 0% { opacity: 0.25; }\n 30% { opacity: 1; }\n 100% { opacity: 0.25; }\n}\n\n.spoiler-button {\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n position: absolute;\n z-index: 100;\n\n &--minified {\n display: flex;\n left: 4px;\n top: 4px;\n width: auto;\n height: auto;\n align-items: center;\n }\n\n &--click-thru {\n pointer-events: none;\n }\n\n &--hidden {\n display: none;\n }\n\n &__overlay {\n display: block;\n background: transparent;\n width: 100%;\n height: 100%;\n border: 0;\n\n &__label {\n display: inline-block;\n background: rgba($base-overlay-background, 0.5);\n border-radius: 8px;\n padding: 8px 12px;\n color: $primary-text-color;\n font-weight: 500;\n font-size: 14px;\n }\n\n &:hover,\n &:focus,\n &:active {\n .spoiler-button__overlay__label {\n background: rgba($base-overlay-background, 0.8);\n }\n }\n\n &:disabled {\n .spoiler-button__overlay__label {\n background: rgba($base-overlay-background, 0.5);\n }\n }\n }\n}\n\n.setting-toggle {\n display: block;\n line-height: 24px;\n}\n\n.setting-toggle__label,\n.setting-radio__label,\n.setting-meta__label {\n color: $darker-text-color;\n display: inline-block;\n margin-bottom: 14px;\n margin-left: 8px;\n vertical-align: middle;\n}\n\n.setting-radio {\n display: block;\n line-height: 18px;\n}\n\n.setting-radio__label {\n margin-bottom: 0;\n}\n\n.column-settings__row legend {\n color: $darker-text-color;\n cursor: default;\n display: block;\n font-weight: 500;\n margin-top: 10px;\n}\n\n.setting-radio__input {\n vertical-align: middle;\n}\n\n.setting-meta__label {\n float: right;\n}\n\n@keyframes heartbeat {\n from {\n transform: scale(1);\n transform-origin: center center;\n animation-timing-function: ease-out;\n }\n\n 10% {\n transform: scale(0.91);\n animation-timing-function: ease-in;\n }\n\n 17% {\n transform: scale(0.98);\n animation-timing-function: ease-out;\n }\n\n 33% {\n transform: scale(0.87);\n animation-timing-function: ease-in;\n }\n\n 45% {\n transform: scale(1);\n animation-timing-function: ease-out;\n }\n}\n\n.pulse-loading {\n animation: heartbeat 1.5s ease-in-out infinite both;\n}\n\n.upload-area {\n align-items: center;\n background: rgba($base-overlay-background, 0.8);\n display: flex;\n height: 100%;\n justify-content: center;\n left: 0;\n opacity: 0;\n position: absolute;\n top: 0;\n visibility: hidden;\n width: 100%;\n z-index: 2000;\n\n * {\n pointer-events: none;\n }\n}\n\n.upload-area__drop {\n width: 320px;\n height: 160px;\n display: flex;\n box-sizing: border-box;\n position: relative;\n padding: 8px;\n}\n\n.upload-area__background {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: -1;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 5px rgba($base-shadow-color, 0.2);\n}\n\n.upload-area__content {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: $secondary-text-color;\n font-size: 18px;\n font-weight: 500;\n border: 2px dashed $ui-base-lighter-color;\n border-radius: 4px;\n}\n\n.dropdown--active .emoji-button img {\n opacity: 1;\n filter: none;\n}\n\n.loading-bar {\n background-color: $ui-highlight-color;\n height: 3px;\n position: absolute;\n top: 0;\n left: 0;\n z-index: 9999;\n}\n\n.icon-badge-wrapper {\n position: relative;\n}\n\n.icon-badge {\n position: absolute;\n display: block;\n right: -.25em;\n top: -.25em;\n background-color: $ui-highlight-color;\n border-radius: 50%;\n font-size: 75%;\n width: 1em;\n height: 1em;\n}\n\n.conversation {\n display: flex;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n padding: 5px;\n padding-bottom: 0;\n\n &:focus {\n background: lighten($ui-base-color, 2%);\n outline: 0;\n }\n\n &__avatar {\n flex: 0 0 auto;\n padding: 10px;\n padding-top: 12px;\n position: relative;\n cursor: pointer;\n }\n\n &__unread {\n display: inline-block;\n background: $highlight-text-color;\n border-radius: 50%;\n width: 0.625rem;\n height: 0.625rem;\n margin: -.1ex .15em .1ex;\n }\n\n &__content {\n flex: 1 1 auto;\n padding: 10px 5px;\n padding-right: 15px;\n overflow: hidden;\n\n &__info {\n overflow: hidden;\n display: flex;\n flex-direction: row-reverse;\n justify-content: space-between;\n }\n\n &__relative-time {\n font-size: 15px;\n color: $darker-text-color;\n padding-left: 15px;\n }\n\n &__names {\n color: $darker-text-color;\n font-size: 15px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-bottom: 4px;\n flex-basis: 90px;\n flex-grow: 1;\n\n a {\n color: $primary-text-color;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n }\n\n .status__content {\n margin: 0;\n }\n }\n\n &--unread {\n background: lighten($ui-base-color, 2%);\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n .conversation__content__info {\n font-weight: 700;\n }\n\n .conversation__content__relative-time {\n color: $primary-text-color;\n }\n }\n}\n\n.ui .flash-message {\n margin-top: 10px;\n margin-left: auto;\n margin-right: auto;\n margin-bottom: 0;\n min-width: 75%;\n}\n\n::-webkit-scrollbar-thumb {\n border-radius: 0;\n}\n\nnoscript {\n text-align: center;\n\n img {\n width: 200px;\n opacity: 0.5;\n animation: flicker 4s infinite;\n }\n\n div {\n font-size: 14px;\n margin: 30px auto;\n color: $secondary-text-color;\n max-width: 400px;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n\n a {\n word-break: break-word;\n }\n }\n}\n\n@keyframes flicker {\n 0% { opacity: 1; }\n 30% { opacity: 0.75; }\n 100% { opacity: 1; }\n}\n\n@import 'boost';\n@import 'accounts';\n@import 'domains';\n@import 'status';\n@import 'modal';\n@import 'composer';\n@import 'columns';\n@import 'regeneration_indicator';\n@import 'directory';\n@import 'search';\n@import 'emoji';\n@import 'doodle';\n@import 'drawer';\n@import 'media';\n@import 'sensitive';\n@import 'lists';\n@import 'emoji_picker';\n@import 'local_settings';\n@import 'error_boundary';\n@import 'single_column';\n@import 'announcements';\n","button.icon-button i.fa-retweet {\n background-image: url(\"data:image/svg+xml;utf8,\");\n\n &:hover {\n background-image: url(\"data:image/svg+xml;utf8,\");\n }\n}\n\n// Disabled variant\nbutton.icon-button.disabled i.fa-retweet {\n &, &:hover {\n background-image: url(\"data:image/svg+xml;utf8,\");\n }\n}\n\n// Disabled variant for use with DMs\n.status-direct button.icon-button.disabled i.fa-retweet {\n &, &:hover {\n background-image: url(\"data:image/svg+xml;utf8,\");\n }\n}\n",".account {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n color: inherit;\n text-decoration: none;\n\n .account__display-name {\n flex: 1 1 auto;\n display: block;\n color: $darker-text-color;\n overflow: hidden;\n text-decoration: none;\n font-size: 14px;\n }\n\n &.small {\n border: none;\n padding: 0;\n\n & > .account__avatar-wrapper { margin: 0 8px 0 0 }\n\n & > .display-name {\n height: 24px;\n line-height: 24px;\n }\n }\n}\n\n.account__wrapper {\n display: flex;\n}\n\n.account__avatar-wrapper {\n float: left;\n margin-left: 12px;\n margin-right: 12px;\n}\n\n.account__avatar {\n @include avatar-radius();\n position: relative;\n cursor: pointer;\n\n &-inline {\n display: inline-block;\n vertical-align: middle;\n margin-right: 5px;\n }\n\n &-composite {\n @include avatar-radius;\n overflow: hidden;\n position: relative;\n\n & div {\n @include avatar-radius;\n float: left;\n position: relative;\n box-sizing: border-box;\n }\n\n &__label {\n display: block;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n color: $primary-text-color;\n text-shadow: 1px 1px 2px $base-shadow-color;\n font-weight: 700;\n font-size: 15px;\n }\n }\n}\n\n.account__avatar-overlay {\n position: relative;\n @include avatar-size(48px);\n\n &-base {\n @include avatar-radius();\n @include avatar-size(36px);\n }\n\n &-overlay {\n @include avatar-radius();\n @include avatar-size(24px);\n\n position: absolute;\n bottom: 0;\n right: 0;\n z-index: 1;\n }\n}\n\n.account__relationship {\n height: 18px;\n padding: 10px;\n white-space: nowrap;\n}\n\n.account__header__wrapper {\n flex: 0 0 auto;\n background: lighten($ui-base-color, 4%);\n}\n\n.account__disclaimer {\n padding: 10px;\n color: $dark-text-color;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n font-weight: 500;\n color: inherit;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n}\n\n.account__action-bar {\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n line-height: 36px;\n overflow: hidden;\n flex: 0 0 auto;\n display: flex;\n}\n\n.account__action-bar-links {\n display: flex;\n flex: 1 1 auto;\n line-height: 18px;\n text-align: center;\n}\n\n.account__action-bar__tab {\n text-decoration: none;\n overflow: hidden;\n flex: 0 1 100%;\n border-left: 1px solid lighten($ui-base-color, 8%);\n padding: 10px 0;\n border-bottom: 4px solid transparent;\n\n &:first-child {\n border-left: 0;\n }\n\n &.active {\n border-bottom: 4px solid $ui-highlight-color;\n }\n\n & > span {\n display: block;\n text-transform: uppercase;\n font-size: 11px;\n color: $darker-text-color;\n }\n\n strong {\n display: block;\n font-size: 15px;\n font-weight: 500;\n color: $primary-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n abbr {\n color: $highlight-text-color;\n }\n}\n\n.account-authorize {\n padding: 14px 10px;\n\n .detailed-status__display-name {\n display: block;\n margin-bottom: 15px;\n overflow: hidden;\n }\n}\n\n.account-authorize__avatar {\n float: left;\n margin-right: 10px;\n}\n\n.notification__message {\n margin-left: 42px;\n padding: 8px 0 0 26px;\n cursor: default;\n color: $darker-text-color;\n font-size: 15px;\n position: relative;\n\n .fa {\n color: $highlight-text-color;\n }\n\n > span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.account--panel {\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: row;\n padding: 10px 0;\n}\n\n.account--panel__button,\n.detailed-status__button {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.column-settings__outer {\n background: lighten($ui-base-color, 8%);\n padding: 15px;\n}\n\n.column-settings__section {\n color: $darker-text-color;\n cursor: default;\n display: block;\n font-weight: 500;\n margin-bottom: 10px;\n}\n\n.column-settings__hashtags {\n .column-settings__row {\n margin-bottom: 15px;\n }\n\n .column-select {\n &__control {\n @include search-input();\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n &__placeholder {\n color: $dark-text-color;\n padding-left: 2px;\n font-size: 12px;\n }\n\n &__value-container {\n padding-left: 6px;\n }\n\n &__multi-value {\n background: lighten($ui-base-color, 8%);\n\n &__remove {\n cursor: pointer;\n\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 12%);\n color: lighten($darker-text-color, 4%);\n }\n }\n }\n\n &__multi-value__label,\n &__input {\n color: $darker-text-color;\n }\n\n &__clear-indicator,\n &__dropdown-indicator {\n cursor: pointer;\n transition: none;\n color: $dark-text-color;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($dark-text-color, 4%);\n }\n }\n\n &__indicator-separator {\n background-color: lighten($ui-base-color, 8%);\n }\n\n &__menu {\n @include search-popout();\n padding: 0;\n background: $ui-secondary-color;\n }\n\n &__menu-list {\n padding: 6px;\n }\n\n &__option {\n color: $inverted-text-color;\n border-radius: 4px;\n font-size: 14px;\n\n &--is-focused,\n &--is-selected {\n background: darken($ui-secondary-color, 10%);\n }\n }\n }\n}\n\n.column-settings__row {\n .text-btn {\n margin-bottom: 15px;\n }\n}\n\n.relationship-tag {\n color: $primary-text-color;\n margin-bottom: 4px;\n display: block;\n vertical-align: top;\n background-color: $base-overlay-background;\n text-transform: uppercase;\n font-size: 11px;\n font-weight: 500;\n padding: 4px;\n border-radius: 4px;\n opacity: 0.7;\n\n &:hover {\n opacity: 1;\n }\n}\n\n.account-gallery__container {\n display: flex;\n flex-wrap: wrap;\n padding: 4px 2px;\n}\n\n.account-gallery__item {\n border: none;\n box-sizing: border-box;\n display: block;\n position: relative;\n border-radius: 4px;\n overflow: hidden;\n margin: 2px;\n\n &__icons {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 24px;\n }\n}\n\n.notification__filter-bar,\n.account__section-headline {\n background: darken($ui-base-color, 4%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n display: flex;\n flex-shrink: 0;\n\n button {\n background: darken($ui-base-color, 4%);\n border: 0;\n margin: 0;\n }\n\n button,\n a {\n display: block;\n flex: 1 1 auto;\n color: $darker-text-color;\n padding: 15px 0;\n font-size: 14px;\n font-weight: 500;\n text-align: center;\n text-decoration: none;\n position: relative;\n\n &.active {\n color: $secondary-text-color;\n\n &::before,\n &::after {\n display: block;\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 50%;\n width: 0;\n height: 0;\n transform: translateX(-50%);\n border-style: solid;\n border-width: 0 10px 10px;\n border-color: transparent transparent lighten($ui-base-color, 8%);\n }\n\n &::after {\n bottom: -1px;\n border-color: transparent transparent $ui-base-color;\n }\n }\n }\n\n &.directory__section-headline {\n background: darken($ui-base-color, 2%);\n border-bottom-color: transparent;\n\n a,\n button {\n &.active {\n &::before {\n display: none;\n }\n\n &::after {\n border-color: transparent transparent darken($ui-base-color, 7%);\n }\n }\n }\n }\n}\n\n.account__moved-note {\n padding: 14px 10px;\n padding-bottom: 16px;\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &__message {\n position: relative;\n margin-left: 58px;\n color: $dark-text-color;\n padding: 8px 0;\n padding-top: 0;\n padding-bottom: 4px;\n font-size: 14px;\n\n > span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n &__icon-wrapper {\n left: -26px;\n position: absolute;\n }\n\n .detailed-status__display-avatar {\n position: relative;\n }\n\n .detailed-status__display-name {\n margin-bottom: 0;\n }\n}\n\n.account__header__content {\n color: $darker-text-color;\n font-size: 14px;\n font-weight: 400;\n overflow: hidden;\n word-break: normal;\n word-wrap: break-word;\n\n p {\n margin-bottom: 20px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: inherit;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n}\n\n.account__header {\n overflow: hidden;\n\n &.inactive {\n opacity: 0.5;\n\n .account__header__image,\n .account__avatar {\n filter: grayscale(100%);\n }\n }\n\n &__info {\n position: absolute;\n top: 10px;\n left: 10px;\n }\n\n &__image {\n overflow: hidden;\n height: 145px;\n position: relative;\n background: darken($ui-base-color, 4%);\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n }\n }\n\n &__bar {\n position: relative;\n background: lighten($ui-base-color, 4%);\n padding: 5px;\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n\n .avatar {\n display: block;\n flex: 0 0 auto;\n width: 94px;\n margin-left: -2px;\n\n .account__avatar {\n background: darken($ui-base-color, 8%);\n border: 2px solid lighten($ui-base-color, 4%);\n }\n }\n }\n\n &__tabs {\n display: flex;\n align-items: flex-start;\n padding: 7px 5px;\n margin-top: -55px;\n\n &__buttons {\n display: flex;\n align-items: center;\n padding-top: 55px;\n overflow: hidden;\n\n .icon-button {\n border: 1px solid lighten($ui-base-color, 12%);\n border-radius: 4px;\n box-sizing: content-box;\n padding: 2px;\n }\n\n .button {\n margin: 0 8px;\n }\n }\n\n &__name {\n padding: 5px;\n\n .account-role {\n vertical-align: top;\n }\n\n .emojione {\n width: 22px;\n height: 22px;\n }\n\n h1 {\n font-size: 16px;\n line-height: 24px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n\n small {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n .spacer {\n flex: 1 1 auto;\n }\n }\n\n &__bio {\n overflow: hidden;\n margin: 0 -5px;\n\n .account__header__content {\n padding: 20px 15px;\n padding-bottom: 5px;\n color: $primary-text-color;\n }\n\n .account__header__fields {\n margin: 0;\n border-top: 1px solid lighten($ui-base-color, 12%);\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n }\n\n &__extra {\n margin-top: 4px;\n\n &__links {\n font-size: 14px;\n color: $darker-text-color;\n padding: 10px 0;\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n padding: 5px 10px;\n font-weight: 500;\n\n strong {\n font-weight: 700;\n color: $primary-text-color;\n }\n }\n }\n }\n}\n",".domain {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n .domain__domain-name {\n flex: 1 1 auto;\n display: block;\n color: $primary-text-color;\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n }\n}\n\n.domain__wrapper {\n display: flex;\n}\n\n.domain_buttons {\n height: 18px;\n padding: 10px;\n white-space: nowrap;\n}\n","@keyframes spring-flip-in {\n 0% {\n transform: rotate(0deg);\n }\n\n 30% {\n transform: rotate(-242.4deg);\n }\n\n 60% {\n transform: rotate(-158.35deg);\n }\n\n 90% {\n transform: rotate(-187.5deg);\n }\n\n 100% {\n transform: rotate(-180deg);\n }\n}\n\n@keyframes spring-flip-out {\n 0% {\n transform: rotate(-180deg);\n }\n\n 30% {\n transform: rotate(62.4deg);\n }\n\n 60% {\n transform: rotate(-21.635deg);\n }\n\n 90% {\n transform: rotate(7.5deg);\n }\n\n 100% {\n transform: rotate(0deg);\n }\n}\n\n.status__content--with-action {\n cursor: pointer;\n}\n\n.status__content {\n position: relative;\n margin: 10px 0;\n font-size: 15px;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n overflow: visible;\n padding-top: 5px;\n\n &:focus {\n outline: 0;\n }\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n img {\n max-width: 100%;\n max-height: 400px;\n object-fit: contain;\n }\n\n p, pre, blockquote {\n margin-bottom: 20px;\n white-space: pre-wrap;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .status__content__text,\n .e-content {\n overflow: hidden;\n\n & > ul,\n & > ol {\n margin-bottom: 20px;\n }\n\n h1, h2, h3, h4, h5 {\n margin-top: 20px;\n margin-bottom: 20px;\n }\n\n h1, h2 {\n font-weight: 700;\n font-size: 1.2em;\n }\n\n h2 {\n font-size: 1.1em;\n }\n\n h3, h4, h5 {\n font-weight: 500;\n }\n\n blockquote {\n padding-left: 10px;\n border-left: 3px solid $darker-text-color;\n color: $darker-text-color;\n white-space: normal;\n\n p:last-child {\n margin-bottom: 0;\n }\n }\n\n b, strong {\n font-weight: 700;\n }\n\n em, i {\n font-style: italic;\n }\n\n sub {\n font-size: smaller;\n text-align: sub;\n }\n\n sup {\n font-size: smaller;\n vertical-align: super;\n }\n\n ul, ol {\n margin-left: 1em;\n\n p {\n margin: 0;\n }\n }\n\n ul {\n list-style-type: disc;\n }\n\n ol {\n list-style-type: decimal;\n }\n }\n\n a {\n color: $pleroma-links;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n\n .fa {\n color: lighten($dark-text-color, 7%);\n }\n }\n\n &.mention {\n &:hover {\n text-decoration: none;\n\n span {\n text-decoration: underline;\n }\n }\n }\n\n .fa {\n color: $dark-text-color;\n }\n }\n\n .status__content__spoiler {\n display: none;\n\n &.status__content__spoiler--visible {\n display: block;\n }\n }\n\n a.unhandled-link {\n color: lighten($ui-highlight-color, 8%);\n\n .link-origin-tag {\n color: $gold-star;\n font-size: 0.8em;\n }\n }\n\n .status__content__spoiler-link {\n background: lighten($ui-base-color, 30%);\n\n &:hover {\n background: lighten($ui-base-color, 33%);\n text-decoration: none;\n }\n }\n}\n\n.status__content__spoiler-link {\n display: inline-block;\n border-radius: 2px;\n background: lighten($ui-base-color, 30%);\n border: none;\n color: $inverted-text-color;\n font-weight: 500;\n font-size: 11px;\n padding: 0 5px;\n text-transform: uppercase;\n line-height: inherit;\n cursor: pointer;\n vertical-align: bottom;\n\n &:hover {\n background: lighten($ui-base-color, 33%);\n text-decoration: none;\n }\n\n .status__content__spoiler-icon {\n display: inline-block;\n margin: 0 0 0 5px;\n border-left: 1px solid currentColor;\n padding: 0 0 0 4px;\n font-size: 16px;\n vertical-align: -2px;\n }\n}\n\n.notif-cleaning {\n .status,\n .notification-follow,\n .notification-follow-request {\n padding-right: ($dismiss-overlay-width + 0.5rem);\n }\n}\n\n.status__wrapper--filtered {\n color: $dark-text-color;\n border: 0;\n font-size: inherit;\n text-align: center;\n line-height: inherit;\n margin: 0;\n padding: 15px;\n box-sizing: border-box;\n width: 100%;\n clear: both;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n}\n\n.status__prepend-icon-wrapper {\n left: -26px;\n position: absolute;\n}\n\n.notification-follow,\n.notification-follow-request {\n position: relative;\n\n // same like Status\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n .account {\n border-bottom: 0 none;\n }\n}\n\n.focusable {\n &:focus {\n outline: 0;\n background: lighten($ui-base-color, 4%);\n\n &.status.status-direct:not(.read) {\n background: lighten($ui-base-color, 12%);\n\n &.muted {\n background: transparent;\n }\n }\n\n .detailed-status,\n .detailed-status__action-bar {\n background: lighten($ui-base-color, 8%);\n }\n }\n}\n\n.status {\n padding: 10px 14px;\n position: relative;\n height: auto;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n\n @supports (-ms-overflow-style: -ms-autohiding-scrollbar) {\n // Add margin to avoid Edge auto-hiding scrollbar appearing over content.\n // On Edge 16 this is 16px and Edge <=15 it's 12px, so aim for 16px.\n padding-right: 28px; // 12px + 16px\n }\n\n @keyframes fade {\n 0% { opacity: 0; }\n 100% { opacity: 1; }\n }\n\n opacity: 1;\n animation: fade 150ms linear;\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n }\n\n &.status-direct:not(.read) {\n background: lighten($ui-base-color, 8%);\n border-bottom-color: lighten($ui-base-color, 12%);\n }\n\n &.light {\n .status__relative-time {\n color: $lighter-text-color;\n }\n\n .status__display-name {\n color: $inverted-text-color;\n }\n\n .display-name {\n color: $light-text-color;\n\n strong {\n color: $inverted-text-color;\n }\n }\n\n .status__content {\n color: $inverted-text-color;\n\n a {\n color: $highlight-text-color;\n }\n\n a.status__content__spoiler-link {\n color: $primary-text-color;\n background: $ui-primary-color;\n\n &:hover {\n background: lighten($ui-primary-color, 8%);\n }\n }\n }\n }\n\n &.collapsed {\n background-position: center;\n background-size: cover;\n user-select: none;\n\n &.has-background::before {\n display: block;\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n background-image: linear-gradient(to bottom, rgba($base-shadow-color, .75), rgba($base-shadow-color, .65) 24px, rgba($base-shadow-color, .8));\n pointer-events: none;\n content: \"\";\n }\n\n .display-name:hover .display-name__html {\n text-decoration: none;\n }\n\n .status__content {\n height: 20px;\n overflow: hidden;\n text-overflow: ellipsis;\n padding-top: 0;\n\n &:after {\n content: \"\";\n position: absolute;\n top: 0; bottom: 0;\n left: 0; right: 0;\n background: linear-gradient(rgba($ui-base-color, 0), rgba($ui-base-color, 1));\n pointer-events: none;\n }\n \n a:hover {\n text-decoration: none;\n }\n }\n &:focus > .status__content:after {\n background: linear-gradient(rgba(lighten($ui-base-color, 4%), 0), rgba(lighten($ui-base-color, 4%), 1));\n }\n &.status-direct:not(.read)> .status__content:after {\n background: linear-gradient(rgba(lighten($ui-base-color, 8%), 0), rgba(lighten($ui-base-color, 8%), 1));\n }\n\n .notification__message {\n margin-bottom: 0;\n }\n\n .status__info .notification__message > span {\n white-space: nowrap;\n }\n }\n\n .notification__message {\n margin: -10px 0px 10px 0;\n }\n}\n\n.notification-favourite {\n .status.status-direct {\n background: transparent;\n\n .icon-button.disabled {\n color: lighten($action-button-color, 13%);\n }\n }\n}\n\n.status__relative-time {\n display: inline-block;\n flex-grow: 1;\n color: $dark-text-color;\n font-size: 14px;\n text-align: right;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.status__display-name {\n color: $dark-text-color;\n overflow: hidden;\n}\n\n.status__info__account .status__display-name {\n display: block;\n max-width: 100%;\n}\n\n.status__info {\n display: flex;\n justify-content: space-between;\n font-size: 15px;\n\n > span {\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n .notification__message > span {\n word-wrap: break-word;\n }\n}\n\n.status__info__icons {\n display: flex;\n align-items: center;\n height: 1em;\n color: $action-button-color;\n\n .status__media-icon,\n .status__visibility-icon,\n .status__reply-icon {\n padding-left: 2px;\n padding-right: 2px;\n }\n\n .status__collapse-button.active > .fa-angle-double-up {\n transform: rotate(-180deg);\n }\n}\n\n.no-reduce-motion .status__collapse-button {\n &.activate {\n & > .fa-angle-double-up {\n animation: spring-flip-in 1s linear;\n }\n }\n\n &.deactivate {\n & > .fa-angle-double-up {\n animation: spring-flip-out 1s linear;\n }\n }\n}\n\n.status__info__account {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n}\n\n.status-check-box {\n border-bottom: 1px solid $ui-secondary-color;\n display: flex;\n\n .status-check-box__status {\n margin: 10px 0 10px 10px;\n flex: 1;\n overflow: hidden;\n\n .media-gallery {\n max-width: 250px;\n }\n\n .status__content {\n padding: 0;\n white-space: normal;\n }\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n max-width: 250px;\n }\n\n .media-gallery__item-thumbnail {\n cursor: default;\n }\n }\n}\n\n.status-check-box-toggle {\n align-items: center;\n display: flex;\n flex: 0 0 auto;\n justify-content: center;\n padding: 10px;\n}\n\n.status__prepend {\n margin-top: -10px;\n margin-bottom: 10px;\n margin-left: 58px;\n color: $dark-text-color;\n padding: 8px 0;\n padding-bottom: 2px;\n font-size: 14px;\n position: relative;\n\n .status__display-name strong {\n color: $dark-text-color;\n }\n\n > span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.status__action-bar {\n align-items: center;\n display: flex;\n margin-top: 8px;\n\n &__counter {\n display: inline-flex;\n margin-right: 11px;\n align-items: center;\n\n .status__action-bar-button {\n margin-right: 4px;\n }\n\n &__label {\n display: inline-block;\n width: 14px;\n font-size: 12px;\n font-weight: 500;\n color: $action-button-color;\n }\n }\n}\n\n.status__action-bar-button {\n margin-right: 18px;\n}\n\n.status__action-bar-dropdown {\n height: 23.15px;\n width: 23.15px;\n}\n\n.detailed-status__action-bar-dropdown {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n}\n\n.detailed-status {\n background: lighten($ui-base-color, 4%);\n padding: 14px 10px;\n\n &--flex {\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n align-items: flex-start;\n\n .status__content,\n .detailed-status__meta {\n flex: 100%;\n }\n }\n\n .status__content {\n font-size: 19px;\n line-height: 24px;\n\n .emojione {\n width: 24px;\n height: 24px;\n margin: -1px 0 0;\n }\n }\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n }\n}\n\n.detailed-status__meta {\n margin-top: 15px;\n color: $dark-text-color;\n font-size: 14px;\n line-height: 18px;\n}\n\n.detailed-status__action-bar {\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: row;\n padding: 10px 0;\n}\n\n.detailed-status__link {\n color: inherit;\n text-decoration: none;\n}\n\n.detailed-status__favorites,\n.detailed-status__reblogs {\n display: inline-block;\n font-weight: 500;\n font-size: 12px;\n margin-left: 6px;\n}\n\n.status__display-name,\n.status__relative-time,\n.detailed-status__display-name,\n.detailed-status__datetime,\n.detailed-status__application,\n.account__display-name {\n text-decoration: none;\n}\n\n.status__display-name,\n.account__display-name {\n strong {\n color: $primary-text-color;\n }\n}\n\n.muted {\n .emojione {\n opacity: 0.5;\n }\n}\n\na.status__display-name,\n.reply-indicator__display-name,\n.detailed-status__display-name,\n.account__display-name {\n &:hover strong {\n text-decoration: underline;\n }\n}\n\n.account__display-name strong {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.detailed-status__application,\n.detailed-status__datetime {\n color: inherit;\n}\n\n.detailed-status .button.logo-button {\n margin-bottom: 15px;\n}\n\n.detailed-status__display-name {\n color: $secondary-text-color;\n display: block;\n line-height: 24px;\n margin-bottom: 15px;\n overflow: hidden;\n\n strong,\n span {\n display: block;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n strong {\n font-size: 16px;\n color: $primary-text-color;\n }\n}\n\n.detailed-status__display-avatar {\n float: left;\n margin-right: 10px;\n}\n\n.status__avatar {\n flex: none;\n margin: 0 10px 0 0;\n height: 48px;\n width: 48px;\n}\n\n.muted {\n .status__content,\n .status__content p,\n .status__content a,\n .status__content__text {\n color: $dark-text-color;\n }\n\n .status__display-name strong {\n color: $dark-text-color;\n }\n\n .status__avatar {\n opacity: 0.5;\n }\n\n a.status__content__spoiler-link {\n background: $ui-base-lighter-color;\n color: $inverted-text-color;\n\n &:hover {\n background: lighten($ui-base-color, 29%);\n text-decoration: none;\n }\n }\n}\n\n.status__relative-time,\n.detailed-status__datetime {\n &:hover {\n text-decoration: underline;\n }\n}\n\n.status-card {\n display: flex;\n font-size: 14px;\n border: 1px solid lighten($ui-base-color, 8%);\n border-radius: 4px;\n color: $dark-text-color;\n margin-top: 14px;\n text-decoration: none;\n overflow: hidden;\n\n &__actions {\n bottom: 0;\n left: 0;\n position: absolute;\n right: 0;\n top: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n\n & > div {\n background: rgba($base-shadow-color, 0.6);\n border-radius: 8px;\n padding: 12px 9px;\n flex: 0 0 auto;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n button,\n a {\n display: inline;\n color: $secondary-text-color;\n background: transparent;\n border: 0;\n padding: 0 8px;\n text-decoration: none;\n font-size: 18px;\n line-height: 18px;\n\n &:hover,\n &:active,\n &:focus {\n color: $primary-text-color;\n }\n }\n\n a {\n font-size: 19px;\n position: relative;\n bottom: -1px;\n }\n\n a .fa, a:hover .fa {\n color: inherit;\n }\n }\n}\n\na.status-card {\n cursor: pointer;\n\n &:hover {\n background: lighten($ui-base-color, 8%);\n }\n}\n\n.status-card-photo {\n cursor: zoom-in;\n display: block;\n text-decoration: none;\n width: 100%;\n height: auto;\n margin: 0;\n}\n\n.status-card-video {\n iframe {\n width: 100%;\n height: 100%;\n }\n}\n\n.status-card__title {\n display: block;\n font-weight: 500;\n margin-bottom: 5px;\n color: $darker-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-decoration: none;\n}\n\n.status-card__content {\n flex: 1 1 auto;\n overflow: hidden;\n padding: 14px 14px 14px 8px;\n}\n\n.status-card__description {\n color: $darker-text-color;\n}\n\n.status-card__host {\n display: block;\n margin-top: 5px;\n font-size: 13px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.status-card__image {\n flex: 0 0 100px;\n background: lighten($ui-base-color, 8%);\n position: relative;\n\n & > .fa {\n font-size: 21px;\n position: absolute;\n transform-origin: 50% 50%;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n}\n\n.status-card.horizontal {\n display: block;\n\n .status-card__image {\n width: 100%;\n }\n\n .status-card__image-image {\n border-radius: 4px 4px 0 0;\n }\n\n .status-card__title {\n white-space: inherit;\n }\n}\n\n.status-card.compact {\n border-color: lighten($ui-base-color, 4%);\n\n &.interactive {\n border: 0;\n }\n\n .status-card__content {\n padding: 8px;\n padding-top: 10px;\n }\n\n .status-card__title {\n white-space: nowrap;\n }\n\n .status-card__image {\n flex: 0 0 60px;\n }\n}\n\na.status-card.compact:hover {\n background-color: lighten($ui-base-color, 4%);\n}\n\n.status-card__image-image {\n border-radius: 4px 0 0 4px;\n display: block;\n margin: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n background-size: cover;\n background-position: center center;\n}\n\n.attachment-list {\n display: flex;\n font-size: 14px;\n border: 1px solid lighten($ui-base-color, 8%);\n border-radius: 4px;\n margin-top: 14px;\n overflow: hidden;\n\n &__icon {\n flex: 0 0 auto;\n color: $dark-text-color;\n padding: 8px 18px;\n cursor: default;\n border-right: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n font-size: 26px;\n\n .fa {\n display: block;\n }\n }\n\n &__list {\n list-style: none;\n padding: 4px 0;\n padding-left: 8px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n\n li {\n display: block;\n padding: 4px 0;\n }\n\n a {\n text-decoration: none;\n color: $dark-text-color;\n font-weight: 500;\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n &.compact {\n border: 0;\n margin-top: 4px;\n\n .attachment-list__list {\n padding: 0;\n display: block;\n }\n\n .fa {\n color: $dark-text-color;\n }\n }\n}\n\n.status__wrapper--filtered__button {\n display: inline;\n color: lighten($ui-highlight-color, 8%);\n border: 0;\n background: transparent;\n padding: 0;\n font-size: inherit;\n line-height: inherit;\n\n &:hover,\n &:active {\n text-decoration: underline;\n }\n}\n",".modal-container--preloader {\n background: lighten($ui-base-color, 8%);\n}\n\n.modal-root {\n position: relative;\n transition: opacity 0.3s linear;\n will-change: opacity;\n z-index: 9999;\n}\n\n.modal-root__overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba($base-overlay-background, 0.7);\n}\n\n.modal-root__container {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n align-content: space-around;\n z-index: 9999;\n pointer-events: none;\n user-select: none;\n}\n\n.modal-root__modal {\n pointer-events: auto;\n display: flex;\n z-index: 9999;\n}\n\n.onboarding-modal,\n.error-modal,\n.embed-modal {\n background: $ui-secondary-color;\n color: $inverted-text-color;\n border-radius: 8px;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.onboarding-modal__pager {\n height: 80vh;\n width: 80vw;\n max-width: 520px;\n max-height: 470px;\n\n .react-swipeable-view-container > div {\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n display: none;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n display: flex;\n user-select: text;\n }\n}\n\n.error-modal__body {\n height: 80vh;\n width: 80vw;\n max-width: 520px;\n max-height: 420px;\n position: relative;\n\n & > div {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n padding: 25px;\n display: none;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n display: flex;\n opacity: 0;\n user-select: text;\n }\n}\n\n.error-modal__body {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n text-align: center;\n}\n\n@media screen and (max-width: 550px) {\n .onboarding-modal {\n width: 100%;\n height: 100%;\n border-radius: 0;\n }\n\n .onboarding-modal__pager {\n width: 100%;\n height: auto;\n max-width: none;\n max-height: none;\n flex: 1 1 auto;\n }\n}\n\n.onboarding-modal__paginator,\n.error-modal__footer {\n flex: 0 0 auto;\n background: darken($ui-secondary-color, 8%);\n display: flex;\n padding: 25px;\n\n & > div {\n min-width: 33px;\n }\n\n .onboarding-modal__nav,\n .error-modal__nav {\n color: $lighter-text-color;\n border: 0;\n font-size: 14px;\n font-weight: 500;\n padding: 10px 25px;\n line-height: inherit;\n height: auto;\n margin: -10px;\n border-radius: 4px;\n background-color: transparent;\n\n &:hover,\n &:focus,\n &:active {\n color: darken($lighter-text-color, 4%);\n background-color: darken($ui-secondary-color, 16%);\n }\n\n &.onboarding-modal__done,\n &.onboarding-modal__next {\n color: $inverted-text-color;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($inverted-text-color, 4%);\n }\n }\n }\n}\n\n.error-modal__footer {\n justify-content: center;\n}\n\n.onboarding-modal__dots {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.onboarding-modal__dot {\n width: 14px;\n height: 14px;\n border-radius: 14px;\n background: darken($ui-secondary-color, 16%);\n margin: 0 3px;\n cursor: pointer;\n\n &:hover {\n background: darken($ui-secondary-color, 18%);\n }\n\n &.active {\n cursor: default;\n background: darken($ui-secondary-color, 24%);\n }\n}\n\n.onboarding-modal__page__wrapper {\n pointer-events: none;\n padding: 25px;\n padding-bottom: 0;\n\n &.onboarding-modal__page__wrapper--active {\n pointer-events: auto;\n }\n}\n\n.onboarding-modal__page {\n cursor: default;\n line-height: 21px;\n\n h1 {\n font-size: 18px;\n font-weight: 500;\n color: $inverted-text-color;\n margin-bottom: 20px;\n }\n\n a {\n color: $highlight-text-color;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($highlight-text-color, 4%);\n }\n }\n\n .navigation-bar a {\n color: inherit;\n }\n\n p {\n font-size: 16px;\n color: $lighter-text-color;\n margin-top: 10px;\n margin-bottom: 10px;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n strong {\n font-weight: 500;\n background: $ui-base-color;\n color: $secondary-text-color;\n border-radius: 4px;\n font-size: 14px;\n padding: 3px 6px;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n }\n}\n\n.onboarding-modal__page__wrapper-0 {\n height: 100%;\n padding: 0;\n}\n\n.onboarding-modal__page-one {\n &__lead {\n padding: 65px;\n padding-top: 45px;\n padding-bottom: 0;\n margin-bottom: 10px;\n\n h1 {\n font-size: 26px;\n line-height: 36px;\n margin-bottom: 8px;\n }\n\n p {\n margin-bottom: 0;\n }\n }\n\n &__extra {\n padding-right: 65px;\n padding-left: 185px;\n text-align: center;\n }\n}\n\n.display-case {\n text-align: center;\n font-size: 15px;\n margin-bottom: 15px;\n\n &__label {\n font-weight: 500;\n color: $inverted-text-color;\n margin-bottom: 5px;\n text-transform: uppercase;\n font-size: 12px;\n }\n\n &__case {\n background: $ui-base-color;\n color: $secondary-text-color;\n font-weight: 500;\n padding: 10px;\n border-radius: 4px;\n }\n}\n\n.onboarding-modal__page-two,\n.onboarding-modal__page-three,\n.onboarding-modal__page-four,\n.onboarding-modal__page-five {\n p {\n text-align: left;\n }\n\n .figure {\n background: darken($ui-base-color, 8%);\n color: $secondary-text-color;\n margin-bottom: 20px;\n border-radius: 4px;\n padding: 10px;\n text-align: center;\n font-size: 14px;\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.3);\n\n .onboarding-modal__image {\n border-radius: 4px;\n margin-bottom: 10px;\n }\n\n &.non-interactive {\n pointer-events: none;\n text-align: left;\n }\n }\n}\n\n.onboarding-modal__page-four__columns {\n .row {\n display: flex;\n margin-bottom: 20px;\n\n & > div {\n flex: 1 1 0;\n margin: 0 10px;\n\n &:first-child {\n margin-left: 0;\n }\n\n &:last-child {\n margin-right: 0;\n }\n\n p {\n text-align: center;\n }\n }\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .column-header {\n color: $primary-text-color;\n }\n}\n\n@media screen and (max-width: 320px) and (max-height: 600px) {\n .onboarding-modal__page p {\n font-size: 14px;\n line-height: 20px;\n }\n\n .onboarding-modal__page-two .figure,\n .onboarding-modal__page-three .figure,\n .onboarding-modal__page-four .figure,\n .onboarding-modal__page-five .figure {\n font-size: 12px;\n margin-bottom: 10px;\n }\n\n .onboarding-modal__page-four__columns .row {\n margin-bottom: 10px;\n }\n\n .onboarding-modal__page-four__columns .column-header {\n padding: 5px;\n font-size: 12px;\n }\n}\n\n.onboard-sliders {\n display: inline-block;\n max-width: 30px;\n max-height: auto;\n margin-left: 10px;\n}\n\n.boost-modal,\n.favourite-modal,\n.confirmation-modal,\n.report-modal,\n.actions-modal,\n.mute-modal,\n.block-modal {\n background: lighten($ui-secondary-color, 8%);\n color: $inverted-text-color;\n border-radius: 8px;\n overflow: hidden;\n max-width: 90vw;\n width: 480px;\n position: relative;\n flex-direction: column;\n\n .status__relative-time {\n color: $dark-text-color;\n float: right;\n font-size: 14px;\n width: auto;\n margin: initial;\n padding: initial;\n }\n\n .status__display-name {\n display: flex;\n }\n\n .status__avatar {\n height: 48px;\n width: 48px;\n }\n\n .status__content__spoiler-link {\n color: lighten($secondary-text-color, 8%);\n }\n}\n\n.actions-modal {\n .status {\n background: $white;\n border-bottom-color: $ui-secondary-color;\n padding-top: 10px;\n padding-bottom: 10px;\n }\n\n .dropdown-menu__separator {\n border-bottom-color: $ui-secondary-color;\n }\n}\n\n.boost-modal__container,\n.favourite-modal__container {\n overflow-x: scroll;\n padding: 10px;\n\n .status {\n user-select: text;\n border-bottom: 0;\n }\n}\n\n.boost-modal__action-bar,\n.favourite-modal__action-bar,\n.confirmation-modal__action-bar,\n.mute-modal__action-bar,\n.block-modal__action-bar {\n display: flex;\n justify-content: space-between;\n background: $ui-secondary-color;\n padding: 10px;\n line-height: 36px;\n\n & > div {\n flex: 1 1 auto;\n text-align: right;\n color: $lighter-text-color;\n padding-right: 10px;\n }\n\n .button {\n flex: 0 0 auto;\n }\n}\n\n.boost-modal__status-header,\n.favourite-modal__status-header {\n font-size: 15px;\n}\n\n.boost-modal__status-time,\n.favourite-modal__status-time {\n float: right;\n font-size: 14px;\n}\n\n.mute-modal,\n.block-modal {\n line-height: 24px;\n}\n\n.mute-modal .react-toggle,\n.block-modal .react-toggle {\n vertical-align: middle;\n}\n\n.report-modal {\n width: 90vw;\n max-width: 700px;\n}\n\n.report-modal__container {\n display: flex;\n border-top: 1px solid $ui-secondary-color;\n\n @media screen and (max-width: 480px) {\n flex-wrap: wrap;\n overflow-y: auto;\n }\n}\n\n.report-modal__statuses,\n.report-modal__comment {\n box-sizing: border-box;\n width: 50%;\n\n @media screen and (max-width: 480px) {\n width: 100%;\n }\n}\n\n.report-modal__statuses,\n.focal-point-modal__content {\n flex: 1 1 auto;\n min-height: 20vh;\n max-height: 80vh;\n overflow-y: auto;\n overflow-x: hidden;\n\n .status__content a {\n color: $highlight-text-color;\n }\n\n @media screen and (max-width: 480px) {\n max-height: 10vh;\n }\n}\n\n.focal-point-modal__content {\n @media screen and (max-width: 480px) {\n max-height: 40vh;\n }\n}\n\n.report-modal__comment {\n padding: 20px;\n border-right: 1px solid $ui-secondary-color;\n max-width: 320px;\n\n p {\n font-size: 14px;\n line-height: 20px;\n margin-bottom: 20px;\n }\n\n .setting-text {\n display: block;\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n color: $inverted-text-color;\n background: $white;\n padding: 10px;\n font-family: inherit;\n font-size: 14px;\n resize: none;\n border: 0;\n outline: 0;\n border-radius: 4px;\n border: 1px solid $ui-secondary-color;\n min-height: 100px;\n max-height: 50vh;\n margin-bottom: 10px;\n\n &:focus {\n border: 1px solid darken($ui-secondary-color, 8%);\n }\n\n &__wrapper {\n background: $white;\n border: 1px solid $ui-secondary-color;\n margin-bottom: 10px;\n border-radius: 4px;\n\n .setting-text {\n border: 0;\n margin-bottom: 0;\n border-radius: 0;\n\n &:focus {\n border: 0;\n }\n }\n\n &__modifiers {\n color: $inverted-text-color;\n font-family: inherit;\n font-size: 14px;\n background: $white;\n }\n }\n\n &__toolbar {\n display: flex;\n justify-content: space-between;\n margin-bottom: 20px;\n }\n }\n\n .setting-text-label {\n display: block;\n color: $inverted-text-color;\n font-size: 14px;\n font-weight: 500;\n margin-bottom: 10px;\n }\n\n .setting-toggle {\n margin-top: 20px;\n margin-bottom: 24px;\n\n &__label {\n color: $inverted-text-color;\n font-size: 14px;\n }\n }\n\n @media screen and (max-width: 480px) {\n padding: 10px;\n max-width: 100%;\n order: 2;\n\n .setting-toggle {\n margin-bottom: 4px;\n }\n }\n}\n\n.actions-modal {\n .status {\n overflow-y: auto;\n max-height: 300px;\n }\n\n strong {\n display: block;\n font-weight: 500;\n }\n\n max-height: 80vh;\n max-width: 80vw;\n\n .actions-modal__item-label {\n font-weight: 500;\n }\n\n ul {\n overflow-y: auto;\n flex-shrink: 0;\n max-height: 80vh;\n\n &.with-status {\n max-height: calc(80vh - 75px);\n }\n\n li:empty {\n margin: 0;\n }\n\n li:not(:empty) {\n a {\n color: $inverted-text-color;\n display: flex;\n padding: 12px 16px;\n font-size: 15px;\n align-items: center;\n text-decoration: none;\n\n &,\n button {\n transition: none;\n }\n\n &.active,\n &:hover,\n &:active,\n &:focus {\n &,\n button {\n background: $ui-highlight-color;\n color: $primary-text-color;\n }\n }\n\n & > .react-toggle,\n & > .icon,\n button:first-child {\n margin-right: 10px;\n }\n }\n }\n }\n}\n\n.confirmation-modal__action-bar,\n.mute-modal__action-bar,\n.block-modal__action-bar {\n .confirmation-modal__secondary-button {\n flex-shrink: 1;\n }\n}\n\n.confirmation-modal__secondary-button,\n.confirmation-modal__cancel-button,\n.mute-modal__cancel-button,\n.block-modal__cancel-button {\n background-color: transparent;\n color: $lighter-text-color;\n font-size: 14px;\n font-weight: 500;\n\n &:hover,\n &:focus,\n &:active {\n color: darken($lighter-text-color, 4%);\n background-color: transparent;\n }\n}\n\n.confirmation-modal__do_not_ask_again {\n padding-left: 20px;\n padding-right: 20px;\n padding-bottom: 10px;\n\n font-size: 14px;\n\n label, input {\n vertical-align: middle;\n }\n}\n\n.confirmation-modal__container,\n.mute-modal__container,\n.block-modal__container,\n.report-modal__target {\n padding: 30px;\n font-size: 16px;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n}\n\n.confirmation-modal__container,\n.report-modal__target {\n text-align: center;\n}\n\n.block-modal,\n.mute-modal {\n &__explanation {\n margin-top: 20px;\n }\n\n .setting-toggle {\n margin-top: 20px;\n margin-bottom: 24px;\n display: flex;\n align-items: center;\n\n &__label {\n color: $inverted-text-color;\n margin: 0;\n margin-left: 8px;\n }\n }\n}\n\n.report-modal__target {\n padding: 15px;\n\n .media-modal__close {\n top: 14px;\n right: 15px;\n }\n}\n\n.embed-modal {\n width: auto;\n max-width: 80vw;\n max-height: 80vh;\n\n h4 {\n padding: 30px;\n font-weight: 500;\n font-size: 16px;\n text-align: center;\n }\n\n .embed-modal__container {\n padding: 10px;\n\n .hint {\n margin-bottom: 15px;\n }\n\n .embed-modal__html {\n outline: 0;\n box-sizing: border-box;\n display: block;\n width: 100%;\n border: none;\n padding: 10px;\n font-family: 'mastodon-font-monospace', monospace;\n background: $ui-base-color;\n color: $primary-text-color;\n font-size: 14px;\n margin: 0;\n margin-bottom: 15px;\n border-radius: 4px;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n .embed-modal__iframe {\n width: 400px;\n max-width: 100%;\n overflow: hidden;\n border: 0;\n border-radius: 4px;\n }\n }\n}\n\n.focal-point {\n position: relative;\n cursor: move;\n overflow: hidden;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n background: $base-shadow-color;\n\n img,\n video,\n canvas {\n display: block;\n max-height: 80vh;\n width: 100%;\n height: auto;\n margin: 0;\n object-fit: contain;\n background: $base-shadow-color;\n }\n\n &__reticle {\n position: absolute;\n width: 100px;\n height: 100px;\n transform: translate(-50%, -50%);\n background: url('~images/reticle.png') no-repeat 0 0;\n border-radius: 50%;\n box-shadow: 0 0 0 9999em rgba($base-shadow-color, 0.35);\n }\n\n &__overlay {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n }\n\n &__preview {\n position: absolute;\n bottom: 10px;\n right: 10px;\n z-index: 2;\n cursor: move;\n transition: opacity 0.1s ease;\n\n &:hover {\n opacity: 0.5;\n }\n\n strong {\n color: $primary-text-color;\n font-size: 14px;\n font-weight: 500;\n display: block;\n margin-bottom: 5px;\n }\n\n div {\n border-radius: 4px;\n box-shadow: 0 0 14px rgba($base-shadow-color, 0.2);\n }\n }\n\n @media screen and (max-width: 480px) {\n img,\n video {\n max-height: 100%;\n }\n\n &__preview {\n display: none;\n }\n }\n}\n\n.filtered-status-info {\n text-align: start;\n\n .spoiler__text {\n margin-top: 20px;\n }\n\n .account {\n border-bottom: 0;\n }\n\n .account__display-name strong {\n color: $inverted-text-color;\n }\n\n .status__content__spoiler {\n display: none;\n\n &--visible {\n display: flex;\n }\n }\n\n ul {\n padding: 10px;\n margin-left: 12px;\n list-style: disc inside;\n }\n\n .filtered-status-edit-link {\n color: $action-button-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline\n }\n }\n}\n",".composer {\n padding: 10px;\n\n .emoji-picker-dropdown {\n position: absolute;\n top: 0;\n right: 0;\n\n ::-webkit-scrollbar-track:hover,\n ::-webkit-scrollbar-track:active {\n background-color: rgba($base-overlay-background, 0.3);\n }\n }\n}\n\n.character-counter {\n cursor: default;\n font-family: $font-sans-serif, sans-serif;\n font-size: 14px;\n font-weight: 600;\n color: $lighter-text-color;\n\n &.character-counter--over {\n color: $warning-red;\n }\n}\n\n.no-reduce-motion .composer--spoiler {\n transition: height 0.4s ease, opacity 0.4s ease;\n}\n\n.composer--spoiler {\n height: 0;\n transform-origin: bottom;\n opacity: 0.0;\n\n &.composer--spoiler--visible {\n height: 36px;\n margin-bottom: 11px;\n opacity: 1.0;\n }\n\n input {\n display: block;\n box-sizing: border-box;\n margin: 0;\n border: none;\n border-radius: 4px;\n padding: 10px;\n width: 100%;\n outline: 0;\n color: $inverted-text-color;\n background: $simple-background-color;\n font-size: 14px;\n font-family: inherit;\n resize: vertical;\n\n &::placeholder {\n color: $dark-text-color;\n }\n\n &:focus { outline: 0 }\n @include single-column('screen and (max-width: 630px)') { font-size: 16px }\n }\n}\n\n.composer--warning {\n color: $inverted-text-color;\n margin-bottom: 15px;\n background: $ui-primary-color;\n box-shadow: 0 2px 6px rgba($base-shadow-color, 0.3);\n padding: 8px 10px;\n border-radius: 4px;\n font-size: 13px;\n font-weight: 400;\n\n a {\n color: $lighter-text-color;\n font-weight: 500;\n text-decoration: underline;\n\n &:active,\n &:focus,\n &:hover { text-decoration: none }\n }\n}\n\n.compose-form__sensitive-button {\n padding: 10px;\n padding-top: 0;\n\n font-size: 14px;\n font-weight: 500;\n\n &.active {\n color: $highlight-text-color;\n }\n\n input[type=checkbox] {\n display: none;\n }\n\n .checkbox {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-left: 5px;\n margin-right: 10px;\n top: -1px;\n border-radius: 4px;\n vertical-align: middle;\n\n &.active {\n border-color: $highlight-text-color;\n background: $highlight-text-color;\n }\n }\n}\n\n.composer--reply {\n margin: 0 0 10px;\n border-radius: 4px;\n padding: 10px;\n background: $ui-primary-color;\n min-height: 23px;\n overflow-y: auto;\n flex: 0 2 auto;\n\n & > header {\n margin-bottom: 5px;\n overflow: hidden;\n\n & > .account.small { color: $inverted-text-color; }\n\n & > .cancel {\n float: right;\n line-height: 24px;\n }\n }\n\n & > .content {\n position: relative;\n margin: 10px 0;\n padding: 0 12px;\n font-size: 14px;\n line-height: 20px;\n color: $inverted-text-color;\n word-wrap: break-word;\n font-weight: 400;\n overflow: visible;\n white-space: pre-wrap;\n padding-top: 5px;\n overflow: hidden;\n\n p, pre, blockquote {\n margin-bottom: 20px;\n white-space: pre-wrap;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n h1, h2, h3, h4, h5 {\n margin-top: 20px;\n margin-bottom: 20px;\n }\n\n h1, h2 {\n font-weight: 700;\n font-size: 18px;\n }\n\n h2 {\n font-size: 16px;\n }\n\n h3, h4, h5 {\n font-weight: 500;\n }\n\n blockquote {\n padding-left: 10px;\n border-left: 3px solid $inverted-text-color;\n color: $inverted-text-color;\n white-space: normal;\n\n p:last-child {\n margin-bottom: 0;\n }\n }\n\n b, strong {\n font-weight: 700;\n }\n\n em, i {\n font-style: italic;\n }\n\n sub {\n font-size: smaller;\n text-align: sub;\n }\n\n ul, ol {\n margin-left: 1em;\n\n p {\n margin: 0;\n }\n }\n\n ul {\n list-style-type: disc;\n }\n\n ol {\n list-style-type: decimal;\n }\n\n a {\n color: $lighter-text-color;\n text-decoration: none;\n\n &:hover { text-decoration: underline }\n\n &.mention {\n &:hover {\n text-decoration: none;\n\n span { text-decoration: underline }\n }\n }\n }\n }\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -5px 0 0;\n }\n}\n\n.compose-form__autosuggest-wrapper,\n.autosuggest-input {\n position: relative;\n width: 100%;\n\n label {\n .autosuggest-textarea__textarea {\n display: block;\n box-sizing: border-box;\n margin: 0;\n border: none;\n border-radius: 4px 4px 0 0;\n padding: 10px 32px 0 10px;\n width: 100%;\n min-height: 100px;\n outline: 0;\n color: $inverted-text-color;\n background: $simple-background-color;\n font-size: 14px;\n font-family: inherit;\n resize: none;\n scrollbar-color: initial;\n\n &::placeholder {\n color: $dark-text-color;\n }\n\n &::-webkit-scrollbar {\n all: unset;\n }\n\n &:disabled { background: $ui-secondary-color }\n &:focus { outline: 0 }\n @include single-column('screen and (max-width: 630px)') { font-size: 16px }\n\n @include limited-single-column('screen and (max-width: 600px)') {\n height: 100px !important; // prevent auto-resize textarea\n resize: vertical;\n }\n }\n }\n}\n\n.composer--textarea--icons {\n display: block;\n position: absolute;\n top: 29px;\n right: 5px;\n bottom: 5px;\n overflow: hidden;\n\n & > .textarea_icon {\n display: block;\n margin: 2px 0 0 2px;\n width: 24px;\n height: 24px;\n color: $lighter-text-color;\n font-size: 18px;\n line-height: 24px;\n text-align: center;\n opacity: .8;\n }\n}\n\n.autosuggest-textarea__suggestions-wrapper {\n position: relative;\n height: 0;\n}\n\n.autosuggest-textarea__suggestions {\n display: block;\n position: absolute;\n box-sizing: border-box;\n top: 100%;\n border-radius: 0 0 4px 4px;\n padding: 6px;\n width: 100%;\n color: $inverted-text-color;\n background: $ui-secondary-color;\n box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4);\n font-size: 14px;\n z-index: 99;\n display: none;\n}\n\n.autosuggest-textarea__suggestions--visible {\n display: block;\n}\n\n.autosuggest-textarea__suggestions__item {\n padding: 10px;\n cursor: pointer;\n border-radius: 4px;\n\n &:hover,\n &:focus,\n &:active,\n &.selected { background: darken($ui-secondary-color, 10%) }\n\n > .account,\n > .emoji,\n > .autosuggest-hashtag {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: flex-start;\n line-height: 18px;\n font-size: 14px;\n }\n\n .autosuggest-hashtag {\n justify-content: space-between;\n\n &__name {\n flex: 1 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n strong {\n font-weight: 500;\n }\n\n &__uses {\n flex: 0 0 auto;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n }\n\n & > .account.small {\n .display-name {\n & > span { color: $lighter-text-color }\n }\n }\n}\n\n.composer--upload_form {\n overflow: hidden;\n\n & > .content {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n font-family: inherit;\n padding: 5px;\n overflow: hidden;\n }\n}\n\n.composer--upload_form--item {\n flex: 1 1 0;\n margin: 5px;\n min-width: 40%;\n\n & > div {\n position: relative;\n border-radius: 4px;\n height: 140px;\n width: 100%;\n background-color: $base-shadow-color;\n background-position: center;\n background-size: cover;\n background-repeat: no-repeat;\n overflow: hidden;\n\n textarea {\n display: block;\n position: absolute;\n box-sizing: border-box;\n bottom: 0;\n left: 0;\n margin: 0;\n border: 0;\n padding: 10px;\n width: 100%;\n color: $secondary-text-color;\n background: linear-gradient(0deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);\n font-size: 14px;\n font-family: inherit;\n font-weight: 500;\n opacity: 0;\n z-index: 2;\n transition: opacity .1s ease;\n\n &:focus { color: $white }\n\n &::placeholder {\n opacity: 0.54;\n color: $secondary-text-color;\n }\n }\n\n & > .close { mix-blend-mode: difference }\n }\n\n &.active {\n & > div {\n textarea { opacity: 1 }\n }\n }\n}\n\n.composer--upload_form--actions {\n background: linear-gradient(180deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n opacity: 0;\n transition: opacity .1s ease;\n\n .icon-button {\n flex: 0 1 auto;\n color: $ui-secondary-color;\n font-size: 14px;\n font-weight: 500;\n padding: 10px;\n font-family: inherit;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($ui-secondary-color, 4%);\n }\n }\n\n &.active {\n opacity: 1;\n }\n}\n\n.composer--upload_form--progress {\n display: flex;\n padding: 10px;\n color: $darker-text-color;\n overflow: hidden;\n\n & > .fa {\n font-size: 34px;\n margin-right: 10px;\n }\n\n & > .message {\n flex: 1 1 auto;\n\n & > span {\n display: block;\n font-size: 12px;\n font-weight: 500;\n text-transform: uppercase;\n }\n\n & > .backdrop {\n position: relative;\n margin-top: 5px;\n border-radius: 6px;\n width: 100%;\n height: 6px;\n background: $ui-base-lighter-color;\n\n & > .tracker {\n position: absolute;\n top: 0;\n left: 0;\n height: 6px;\n border-radius: 6px;\n background: $ui-highlight-color;\n }\n }\n }\n}\n\n.compose-form__modifiers {\n color: $inverted-text-color;\n font-family: inherit;\n font-size: 14px;\n background: $simple-background-color;\n}\n\n.composer--options-wrapper {\n padding: 10px;\n background: darken($simple-background-color, 8%);\n border-radius: 0 0 4px 4px;\n height: 27px;\n display: flex;\n justify-content: space-between;\n flex: 0 0 auto;\n}\n\n.composer--options {\n display: flex;\n flex: 0 0 auto;\n\n & > * {\n display: inline-block;\n box-sizing: content-box;\n padding: 0 3px;\n height: 27px;\n line-height: 27px;\n vertical-align: bottom;\n }\n\n & > hr {\n display: inline-block;\n margin: 0 3px;\n border-width: 0 0 0 1px;\n border-style: none none none solid;\n border-color: transparent transparent transparent darken($simple-background-color, 24%);\n padding: 0;\n width: 0;\n height: 27px;\n background: transparent;\n }\n}\n\n.compose--counter-wrapper {\n align-self: center;\n margin-right: 4px;\n}\n\n.composer--options--dropdown {\n &.open {\n & > .value {\n border-radius: 4px 4px 0 0;\n box-shadow: 0 -4px 4px rgba($base-shadow-color, 0.1);\n color: $primary-text-color;\n background: $ui-highlight-color;\n transition: none;\n }\n &.top {\n & > .value {\n border-radius: 0 0 4px 4px;\n box-shadow: 0 4px 4px rgba($base-shadow-color, 0.1);\n }\n }\n }\n}\n\n.composer--options--dropdown--content {\n position: absolute;\n border-radius: 4px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n background: $simple-background-color;\n overflow: hidden;\n transform-origin: 50% 0;\n}\n\n.composer--options--dropdown--content--item {\n display: flex;\n align-items: center;\n padding: 10px;\n color: $inverted-text-color;\n cursor: pointer;\n\n & > .content {\n flex: 1 1 auto;\n color: $lighter-text-color;\n\n &:not(:first-child) { margin-left: 10px }\n\n strong {\n display: block;\n color: $inverted-text-color;\n font-weight: 500;\n }\n }\n\n &:hover,\n &.active {\n background: $ui-highlight-color;\n color: $primary-text-color;\n\n & > .content {\n color: $primary-text-color;\n\n strong { color: $primary-text-color }\n }\n }\n\n &.active:hover { background: lighten($ui-highlight-color, 4%) }\n}\n\n.composer--publisher {\n padding-top: 10px;\n text-align: right;\n white-space: nowrap;\n overflow: hidden;\n justify-content: flex-end;\n flex: 0 0 auto;\n\n & > .primary {\n display: inline-block;\n margin: 0;\n padding: 0 10px;\n text-align: center;\n }\n\n & > .side_arm {\n display: inline-block;\n margin: 0 2px;\n padding: 0;\n width: 36px;\n text-align: center;\n }\n\n &.over {\n & > .count { color: $warning-red }\n }\n}\n",".column__wrapper {\n display: flex;\n flex: 1 1 auto;\n position: relative;\n}\n\n.columns-area {\n display: flex;\n flex: 1 1 auto;\n flex-direction: row;\n justify-content: flex-start;\n overflow-x: auto;\n position: relative;\n\n &__panels {\n display: flex;\n justify-content: center;\n width: 100%;\n height: 100%;\n min-height: 100vh;\n\n &__pane {\n height: 100%;\n overflow: hidden;\n pointer-events: none;\n display: flex;\n justify-content: flex-end;\n min-width: 285px;\n\n &--start {\n justify-content: flex-start;\n }\n\n &__inner {\n position: fixed;\n width: 285px;\n pointer-events: auto;\n height: 100%;\n }\n }\n\n &__main {\n box-sizing: border-box;\n width: 100%;\n max-width: 600px;\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding: 0 10px;\n }\n }\n }\n}\n\n.tabs-bar__wrapper {\n background: darken($ui-base-color, 8%);\n position: sticky;\n top: 0;\n z-index: 2;\n padding-top: 0;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding-top: 10px;\n }\n\n .tabs-bar {\n margin-bottom: 0;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n margin-bottom: 10px;\n }\n }\n}\n\n.react-swipeable-view-container {\n &,\n .columns-area,\n .column {\n height: 100%;\n }\n}\n\n.react-swipeable-view-container > * {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n}\n\n.column {\n width: 330px;\n position: relative;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n\n > .scrollable {\n background: $ui-base-color;\n }\n}\n\n.ui {\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n}\n\n.column {\n overflow: hidden;\n}\n\n.column-back-button {\n box-sizing: border-box;\n width: 100%;\n background: lighten($ui-base-color, 4%);\n color: $highlight-text-color;\n cursor: pointer;\n flex: 0 0 auto;\n font-size: 16px;\n border: 0;\n text-align: unset;\n padding: 15px;\n margin: 0;\n z-index: 3;\n\n &:hover {\n text-decoration: underline;\n }\n}\n\n.column-header__back-button {\n background: lighten($ui-base-color, 4%);\n border: 0;\n font-family: inherit;\n color: $highlight-text-color;\n cursor: pointer;\n flex: 0 0 auto;\n font-size: 16px;\n padding: 0 5px 0 0;\n z-index: 3;\n\n &:hover {\n text-decoration: underline;\n }\n\n &:last-child {\n padding: 0 15px 0 0;\n }\n}\n\n.column-back-button__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.column-back-button--slim {\n position: relative;\n}\n\n.column-back-button--slim-button {\n cursor: pointer;\n flex: 0 0 auto;\n font-size: 16px;\n padding: 15px;\n position: absolute;\n right: 0;\n top: -48px;\n}\n\n.column-link {\n background: lighten($ui-base-color, 8%);\n color: $primary-text-color;\n display: block;\n font-size: 16px;\n padding: 15px;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 11%);\n }\n\n &:focus {\n outline: 0;\n }\n\n &--transparent {\n background: transparent;\n color: $ui-secondary-color;\n\n &:hover,\n &:focus,\n &:active {\n background: transparent;\n color: $primary-text-color;\n }\n\n &.active {\n color: $ui-highlight-color;\n }\n }\n}\n\n.column-link__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.column-subheading {\n background: $ui-base-color;\n color: $dark-text-color;\n padding: 8px 20px;\n font-size: 12px;\n font-weight: 500;\n text-transform: uppercase;\n cursor: default;\n}\n\n.column-header__wrapper {\n position: relative;\n flex: 0 0 auto;\n z-index: 1;\n\n &.active {\n box-shadow: 0 1px 0 rgba($highlight-text-color, 0.3);\n\n &::before {\n display: block;\n content: \"\";\n position: absolute;\n bottom: -13px;\n left: 0;\n right: 0;\n margin: 0 auto;\n width: 60%;\n pointer-events: none;\n height: 28px;\n z-index: 1;\n background: radial-gradient(ellipse, rgba($ui-highlight-color, 0.23) 0%, rgba($ui-highlight-color, 0) 60%);\n }\n }\n\n .announcements {\n z-index: 1;\n position: relative;\n }\n}\n\n.column-header {\n display: flex;\n font-size: 16px;\n background: lighten($ui-base-color, 4%);\n flex: 0 0 auto;\n cursor: pointer;\n position: relative;\n z-index: 2;\n outline: 0;\n overflow: hidden;\n\n & > button {\n margin: 0;\n border: none;\n padding: 15px;\n color: inherit;\n background: transparent;\n font: inherit;\n text-align: left;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n flex: 1;\n }\n\n & > .column-header__back-button {\n color: $highlight-text-color;\n }\n\n &.active {\n .column-header__icon {\n color: $highlight-text-color;\n text-shadow: 0 0 10px rgba($ui-highlight-color, 0.4);\n }\n }\n\n &:focus,\n &:active {\n outline: 0;\n }\n}\n\n.column {\n width: 330px;\n position: relative;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n\n .wide .columns-area:not(.columns-area--mobile) & {\n flex: auto;\n min-width: 330px;\n max-width: 400px;\n }\n\n > .scrollable {\n background: $ui-base-color;\n }\n}\n\n.column-header__buttons {\n height: 48px;\n display: flex;\n margin-left: 0;\n}\n\n.column-header__links {\n margin-bottom: 14px;\n}\n\n.column-header__links .text-btn {\n margin-right: 10px;\n}\n\n.column-header__button {\n background: lighten($ui-base-color, 4%);\n border: 0;\n color: $darker-text-color;\n cursor: pointer;\n font-size: 16px;\n padding: 0 15px;\n\n &:hover {\n color: lighten($darker-text-color, 7%);\n }\n\n &.active {\n color: $primary-text-color;\n background: lighten($ui-base-color, 8%);\n\n &:hover {\n color: $primary-text-color;\n background: lighten($ui-base-color, 8%);\n }\n }\n\n // glitch - added focus ring for keyboard navigation\n &:focus {\n text-shadow: 0 0 4px darken($ui-highlight-color, 5%);\n }\n}\n\n.column-header__notif-cleaning-buttons {\n display: flex;\n align-items: stretch;\n justify-content: space-around;\n\n button {\n @extend .column-header__button;\n background: transparent;\n text-align: center;\n padding: 10px 0;\n white-space: pre-wrap;\n }\n\n b {\n font-weight: bold;\n }\n}\n\n// The notifs drawer with no padding to have more space for the buttons\n.column-header__collapsible-inner.nopad-drawer {\n padding: 0;\n}\n\n.column-header__collapsible {\n max-height: 70vh;\n overflow: hidden;\n overflow-y: auto;\n color: $darker-text-color;\n transition: max-height 150ms ease-in-out, opacity 300ms linear;\n opacity: 1;\n z-index: 1;\n position: relative;\n\n &.collapsed {\n max-height: 0;\n opacity: 0.5;\n }\n\n &.animating {\n overflow-y: hidden;\n }\n\n hr {\n height: 0;\n background: transparent;\n border: 0;\n border-top: 1px solid lighten($ui-base-color, 12%);\n margin: 10px 0;\n }\n\n // notif cleaning drawer\n &.ncd {\n transition: none;\n &.collapsed {\n max-height: 0;\n opacity: 0.7;\n }\n }\n}\n\n.column-header__collapsible-inner {\n background: lighten($ui-base-color, 8%);\n padding: 15px;\n}\n\n.column-header__setting-btn {\n &:hover {\n color: $darker-text-color;\n text-decoration: underline;\n }\n}\n\n.column-header__setting-arrows {\n float: right;\n\n .column-header__setting-btn {\n padding: 0 10px;\n\n &:last-child {\n padding-right: 0;\n }\n }\n}\n\n.column-header__title {\n display: inline-block;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n flex: 1;\n}\n\n.column-header__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.empty-column-indicator,\n.error-column,\n.follow_requests-unlocked_explanation {\n color: $dark-text-color;\n background: $ui-base-color;\n text-align: center;\n padding: 20px;\n font-size: 15px;\n font-weight: 400;\n cursor: default;\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n justify-content: center;\n @supports(display: grid) { // hack to fix Chrome <57\n contain: strict;\n }\n\n & > span {\n max-width: 400px;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.follow_requests-unlocked_explanation {\n background: darken($ui-base-color, 4%);\n contain: initial;\n}\n\n.error-column {\n flex-direction: column;\n}\n\n// more fixes for the navbar-under mode\n@mixin fix-margins-for-navbar-under {\n .tabs-bar {\n margin-top: 0 !important;\n margin-bottom: -6px !important;\n }\n}\n\n.single-column.navbar-under {\n @include fix-margins-for-navbar-under;\n}\n\n.auto-columns.navbar-under {\n @media screen and (max-width: $no-gap-breakpoint) {\n @include fix-margins-for-navbar-under;\n }\n}\n\n.auto-columns.navbar-under .react-swipeable-view-container .columns-area,\n.single-column.navbar-under .react-swipeable-view-container .columns-area {\n @media screen and (max-width: $no-gap-breakpoint) {\n height: 100% !important;\n }\n}\n\n.column-inline-form {\n padding: 7px 15px;\n padding-right: 5px;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n\n label {\n flex: 1 1 auto;\n\n input {\n width: 100%;\n margin-bottom: 6px;\n\n &:focus {\n outline: 0;\n }\n }\n }\n\n .icon-button {\n flex: 0 0 auto;\n margin: 0 5px;\n }\n}\n",".regeneration-indicator {\n text-align: center;\n font-size: 16px;\n font-weight: 500;\n color: $dark-text-color;\n background: $ui-base-color;\n cursor: default;\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 20px;\n\n &__figure {\n &,\n img {\n display: block;\n width: auto;\n height: 160px;\n margin: 0;\n }\n }\n\n &--without-header {\n padding-top: 20px + 48px;\n }\n\n &__label {\n margin-top: 30px;\n\n strong {\n display: block;\n margin-bottom: 10px;\n color: $dark-text-color;\n }\n\n span {\n font-size: 15px;\n font-weight: 400;\n }\n }\n}\n",".directory {\n &__list {\n width: 100%;\n margin: 10px 0;\n transition: opacity 100ms ease-in;\n\n &.loading {\n opacity: 0.7;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin: 0;\n }\n }\n\n &__card {\n box-sizing: border-box;\n margin-bottom: 10px;\n\n &__img {\n height: 125px;\n position: relative;\n background: darken($ui-base-color, 12%);\n overflow: hidden;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n object-fit: cover;\n }\n }\n\n &__bar {\n display: flex;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n padding: 10px;\n\n &__name {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n text-decoration: none;\n overflow: hidden;\n }\n\n &__relationship {\n width: 23px;\n min-height: 1px;\n flex: 0 0 auto;\n }\n\n .avatar {\n flex: 0 0 auto;\n width: 48px;\n height: 48px;\n padding-top: 2px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n background: darken($ui-base-color, 8%);\n object-fit: cover;\n }\n }\n\n .display-name {\n margin-left: 15px;\n text-align: left;\n\n strong {\n font-size: 15px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n span {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n &__extra {\n background: $ui-base-color;\n display: flex;\n align-items: center;\n justify-content: center;\n\n .accounts-table__count {\n width: 33.33%;\n flex: 0 0 auto;\n padding: 15px 0;\n }\n\n .account__header__content {\n box-sizing: border-box;\n padding: 15px 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n width: 100%;\n min-height: 18px + 30px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n p {\n display: none;\n\n &:first-child {\n display: inline;\n }\n }\n\n br {\n display: none;\n }\n }\n }\n }\n}\n\n.filter-form {\n background: $ui-base-color;\n\n &__column {\n padding: 10px 15px;\n }\n\n .radio-button {\n display: block;\n }\n}\n\n.radio-button {\n font-size: 14px;\n position: relative;\n display: inline-block;\n padding: 6px 0;\n line-height: 18px;\n cursor: default;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n cursor: pointer;\n\n input[type=radio],\n input[type=checkbox] {\n display: none;\n }\n\n &__input {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 50%;\n vertical-align: middle;\n\n &.checked {\n border-color: lighten($ui-highlight-color, 8%);\n background: lighten($ui-highlight-color, 8%);\n }\n }\n}\n",".search {\n position: relative;\n}\n\n.search__input {\n @include search-input();\n\n display: block;\n padding: 15px;\n padding-right: 30px;\n line-height: 18px;\n font-size: 16px;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n}\n\n.search__icon {\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus {\n outline: 0 !important;\n }\n\n .fa {\n position: absolute;\n top: 16px;\n right: 10px;\n z-index: 2;\n display: inline-block;\n opacity: 0;\n transition: all 100ms linear;\n transition-property: color, transform, opacity;\n font-size: 18px;\n width: 18px;\n height: 18px;\n color: $secondary-text-color;\n cursor: default;\n pointer-events: none;\n\n &.active {\n pointer-events: auto;\n opacity: 0.3;\n }\n }\n\n .fa-search {\n transform: rotate(0deg);\n\n &.active {\n pointer-events: auto;\n opacity: 0.3;\n }\n }\n\n .fa-times-circle {\n top: 17px;\n transform: rotate(0deg);\n color: $action-button-color;\n cursor: pointer;\n\n &.active {\n transform: rotate(90deg);\n }\n\n &:hover {\n color: lighten($action-button-color, 7%);\n }\n }\n}\n\n.search-results__header {\n color: $dark-text-color;\n background: lighten($ui-base-color, 2%);\n border-bottom: 1px solid darken($ui-base-color, 4%);\n padding: 15px 10px;\n font-size: 14px;\n font-weight: 500;\n}\n\n.search-results__info {\n padding: 20px;\n color: $darker-text-color;\n text-align: center;\n}\n\n.trends {\n &__header {\n color: $dark-text-color;\n background: lighten($ui-base-color, 2%);\n border-bottom: 1px solid darken($ui-base-color, 4%);\n font-weight: 500;\n padding: 15px;\n font-size: 16px;\n cursor: default;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n &__item {\n display: flex;\n align-items: center;\n padding: 15px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &:last-child {\n border-bottom: 0;\n }\n\n &__name {\n flex: 1 1 auto;\n color: $dark-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n strong {\n font-weight: 500;\n }\n\n a {\n color: $darker-text-color;\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:hover,\n &:focus,\n &:active {\n span {\n text-decoration: underline;\n }\n }\n }\n }\n\n &__current {\n flex: 0 0 auto;\n font-size: 24px;\n line-height: 36px;\n font-weight: 500;\n text-align: right;\n padding-right: 15px;\n margin-left: 5px;\n color: $secondary-text-color;\n }\n\n &__sparkline {\n flex: 0 0 auto;\n width: 50px;\n\n path:first-child {\n fill: rgba($highlight-text-color, 0.25) !important;\n fill-opacity: 1 !important;\n }\n\n path:last-child {\n stroke: lighten($highlight-text-color, 6%) !important;\n }\n }\n }\n}\n",null,".emojione {\n font-size: inherit;\n vertical-align: middle;\n object-fit: contain;\n margin: -.2ex .15em .2ex;\n width: 16px;\n height: 16px;\n\n img {\n width: auto;\n }\n}\n\n.emoji-picker-dropdown__menu {\n background: $simple-background-color;\n position: absolute;\n box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n margin-top: 5px;\n z-index: 2;\n\n .emoji-mart-scroll {\n transition: opacity 200ms ease;\n }\n\n &.selecting .emoji-mart-scroll {\n opacity: 0.5;\n }\n}\n\n.emoji-picker-dropdown__modifiers {\n position: absolute;\n top: 60px;\n right: 11px;\n cursor: pointer;\n}\n\n.emoji-picker-dropdown__modifiers__menu {\n position: absolute;\n z-index: 4;\n top: -4px;\n left: -8px;\n background: $simple-background-color;\n border-radius: 4px;\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n overflow: hidden;\n\n button {\n display: block;\n cursor: pointer;\n border: 0;\n padding: 4px 8px;\n background: transparent;\n\n &:hover,\n &:focus,\n &:active {\n background: rgba($ui-secondary-color, 0.4);\n }\n }\n\n .emoji-mart-emoji {\n height: 22px;\n }\n}\n\n.emoji-mart-emoji {\n span {\n background-repeat: no-repeat;\n }\n}\n\n.emoji-button {\n display: block;\n padding: 5px 5px 2px 2px;\n outline: 0;\n cursor: pointer;\n\n &:active,\n &:focus {\n outline: 0 !important;\n }\n\n img {\n filter: grayscale(100%);\n opacity: 0.8;\n display: block;\n margin: 0;\n width: 22px;\n height: 22px;\n }\n\n &:hover,\n &:active,\n &:focus {\n img {\n opacity: 1;\n filter: none;\n }\n }\n}\n","$doodleBg: #d9e1e8;\n.doodle-modal {\n @extend .boost-modal;\n width: unset;\n}\n\n.doodle-modal__container {\n background: $doodleBg;\n text-align: center;\n line-height: 0; // remove weird gap under canvas\n canvas {\n border: 5px solid $doodleBg;\n }\n}\n\n.doodle-modal__action-bar {\n @extend .boost-modal__action-bar;\n\n .filler {\n flex-grow: 1;\n margin: 0;\n padding: 0;\n }\n\n .doodle-toolbar {\n line-height: 1;\n\n display: flex;\n flex-direction: column;\n flex-grow: 0;\n justify-content: space-around;\n\n &.with-inputs {\n label {\n display: inline-block;\n width: 70px;\n text-align: right;\n margin-right: 2px;\n }\n\n input[type=\"number\"],input[type=\"text\"] {\n width: 40px;\n }\n span.val {\n display: inline-block;\n text-align: left;\n width: 50px;\n }\n }\n }\n\n .doodle-palette {\n padding-right: 0 !important;\n border: 1px solid black;\n line-height: .2rem;\n flex-grow: 0;\n background: white;\n\n button {\n appearance: none;\n width: 1rem;\n height: 1rem;\n margin: 0; padding: 0;\n text-align: center;\n color: black;\n text-shadow: 0 0 1px white;\n cursor: pointer;\n box-shadow: inset 0 0 1px rgba(white, .5);\n border: 1px solid black;\n outline-offset:-1px;\n\n &.foreground {\n outline: 1px dashed white;\n }\n\n &.background {\n outline: 1px dashed red;\n }\n\n &.foreground.background {\n outline: 1px dashed red;\n border-color: white;\n }\n }\n }\n}\n",".drawer {\n width: 300px;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n overflow-y: hidden;\n padding: 10px 5px;\n flex: none;\n\n &:first-child {\n padding-left: 10px;\n }\n\n &:last-child {\n padding-right: 10px;\n }\n\n @include single-column('screen and (max-width: 630px)') { flex: auto }\n\n @include limited-single-column('screen and (max-width: 630px)') {\n &, &:first-child, &:last-child { padding: 0 }\n }\n\n .wide & {\n min-width: 300px;\n max-width: 400px;\n flex: 1 1 200px;\n }\n\n @include single-column('screen and (max-width: 630px)') {\n :root & { // Overrides `.wide` for single-column view\n flex: auto;\n width: 100%;\n min-width: 0;\n max-width: none;\n padding: 0;\n }\n }\n\n .react-swipeable-view-container & { height: 100% }\n}\n\n.drawer--header {\n display: flex;\n flex-direction: row;\n margin-bottom: 10px;\n flex: none;\n background: lighten($ui-base-color, 8%);\n font-size: 16px;\n\n & > * {\n display: block;\n box-sizing: border-box;\n border-bottom: 2px solid transparent;\n padding: 15px 5px 13px;\n height: 48px;\n flex: 1 1 auto;\n color: $darker-text-color;\n text-align: center;\n text-decoration: none;\n cursor: pointer;\n }\n\n a {\n transition: background 100ms ease-in;\n\n &:focus,\n &:hover {\n outline: none;\n background: lighten($ui-base-color, 3%);\n transition: background 200ms ease-out;\n }\n }\n}\n\n.search {\n position: relative;\n margin-bottom: 10px;\n flex: none;\n\n @include limited-single-column('screen and (max-width: #{$no-gap-breakpoint})') { margin-bottom: 0 }\n @include single-column('screen and (max-width: 630px)') { font-size: 16px }\n}\n\n.search-popout {\n @include search-popout();\n}\n\n.drawer--account {\n padding: 10px;\n color: $darker-text-color;\n display: flex;\n align-items: center;\n\n a {\n color: inherit;\n text-decoration: none;\n }\n\n .acct {\n display: block;\n color: $secondary-text-color;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.navigation-bar__profile {\n flex: 1 1 auto;\n margin-left: 8px;\n overflow: hidden;\n}\n\n.drawer--results {\n background: $ui-base-color;\n overflow-x: hidden;\n overflow-y: auto;\n\n & > header {\n color: $dark-text-color;\n background: lighten($ui-base-color, 2%);\n padding: 15px;\n font-weight: 500;\n font-size: 16px;\n cursor: default;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n & > section {\n margin-bottom: 5px;\n\n h5 {\n background: darken($ui-base-color, 4%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n display: flex;\n padding: 15px;\n font-weight: 500;\n font-size: 16px;\n color: $dark-text-color;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n .account:last-child,\n & > div:last-child .status {\n border-bottom: 0;\n }\n\n & > .hashtag {\n display: block;\n padding: 10px;\n color: $secondary-text-color;\n text-decoration: none;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($secondary-text-color, 4%);\n text-decoration: underline;\n }\n }\n }\n}\n\n.drawer__pager {\n box-sizing: border-box;\n padding: 0;\n flex-grow: 1;\n position: relative;\n overflow: hidden;\n display: flex;\n}\n\n.drawer__inner {\n position: absolute;\n top: 0;\n left: 0;\n background: lighten($ui-base-color, 13%);\n box-sizing: border-box;\n padding: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n overflow-y: auto;\n width: 100%;\n height: 100%;\n\n &.darker {\n background: $ui-base-color;\n }\n}\n\n.drawer__inner__mastodon {\n background: lighten($ui-base-color, 13%) url('data:image/svg+xml;utf8,') no-repeat bottom / 100% auto;\n flex: 1;\n min-height: 47px;\n display: none;\n\n > img {\n display: block;\n object-fit: contain;\n object-position: bottom left;\n width: 85%;\n height: 100%;\n pointer-events: none;\n user-drag: none;\n user-select: none;\n }\n\n > .mastodon {\n display: block;\n width: 100%;\n height: 100%;\n border: none;\n cursor: inherit;\n }\n\n @media screen and (min-height: 640px) {\n display: block;\n }\n}\n\n.pseudo-drawer {\n background: lighten($ui-base-color, 13%);\n font-size: 13px;\n text-align: left;\n}\n\n.drawer__backdrop {\n cursor: pointer;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba($base-overlay-background, 0.5);\n}\n",".video-error-cover {\n align-items: center;\n background: $base-overlay-background;\n color: $primary-text-color;\n cursor: pointer;\n display: flex;\n flex-direction: column;\n height: 100%;\n justify-content: center;\n margin-top: 8px;\n position: relative;\n text-align: center;\n z-index: 100;\n}\n\n.media-spoiler {\n background: $base-overlay-background;\n color: $darker-text-color;\n border: 0;\n width: 100%;\n height: 100%;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($darker-text-color, 8%);\n }\n\n .status__content > & {\n margin-top: 15px; // Add margin when used bare for NSFW video player\n }\n @include fullwidth-gallery;\n}\n\n.media-spoiler__warning {\n display: block;\n font-size: 14px;\n}\n\n.media-spoiler__trigger {\n display: block;\n font-size: 11px;\n font-weight: 500;\n}\n\n.media-gallery__gifv__label {\n display: block;\n position: absolute;\n color: $primary-text-color;\n background: rgba($base-overlay-background, 0.5);\n bottom: 6px;\n left: 6px;\n padding: 2px 6px;\n border-radius: 2px;\n font-size: 11px;\n font-weight: 600;\n z-index: 1;\n pointer-events: none;\n opacity: 0.9;\n transition: opacity 0.1s ease;\n line-height: 18px;\n}\n\n.media-gallery__gifv {\n &:hover {\n .media-gallery__gifv__label {\n opacity: 1;\n }\n }\n}\n\n.media-gallery__audio {\n height: 100%;\n display: flex;\n flex-direction: column;\n\n span {\n text-align: center;\n color: $darker-text-color;\n display: flex;\n height: 100%;\n align-items: center;\n\n p {\n width: 100%;\n }\n }\n\n audio {\n width: 100%;\n }\n}\n\n.media-gallery {\n box-sizing: border-box;\n margin-top: 8px;\n overflow: hidden;\n border-radius: 4px;\n position: relative;\n width: 100%;\n height: 110px;\n\n @include fullwidth-gallery;\n}\n\n.media-gallery__item {\n border: none;\n box-sizing: border-box;\n display: block;\n float: left;\n position: relative;\n border-radius: 4px;\n overflow: hidden;\n\n .full-width & {\n border-radius: 0;\n }\n\n &.standalone {\n .media-gallery__item-gifv-thumbnail {\n transform: none;\n top: 0;\n }\n }\n\n &.letterbox {\n background: $base-shadow-color;\n }\n}\n\n.media-gallery__item-thumbnail {\n cursor: zoom-in;\n display: block;\n text-decoration: none;\n color: $secondary-text-color;\n position: relative;\n z-index: 1;\n\n &,\n img {\n height: 100%;\n width: 100%;\n object-fit: contain;\n\n &:not(.letterbox) {\n height: 100%;\n object-fit: cover;\n }\n }\n}\n\n.media-gallery__preview {\n width: 100%;\n height: 100%;\n object-fit: cover;\n position: absolute;\n top: 0;\n left: 0;\n z-index: 0;\n background: $base-overlay-background;\n\n &--hidden {\n display: none;\n }\n}\n\n.media-gallery__gifv {\n height: 100%;\n overflow: hidden;\n position: relative;\n width: 100%;\n display: flex;\n justify-content: center;\n}\n\n.media-gallery__item-gifv-thumbnail {\n cursor: zoom-in;\n height: 100%;\n width: 100%;\n position: relative;\n z-index: 1;\n object-fit: contain;\n user-select: none;\n\n &:not(.letterbox) {\n height: 100%;\n object-fit: cover;\n }\n}\n\n.media-gallery__item-thumbnail-label {\n clip: rect(1px 1px 1px 1px); /* IE6, IE7 */\n clip: rect(1px, 1px, 1px, 1px);\n overflow: hidden;\n position: absolute;\n}\n\n.video-modal__container {\n max-width: 100vw;\n max-height: 100vh;\n}\n\n.audio-modal__container {\n width: 50vw;\n}\n\n.media-modal {\n width: 100%;\n height: 100%;\n position: relative;\n\n .extended-video-player {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n video {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n }\n }\n}\n\n.media-modal__closer {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n}\n\n.media-modal__navigation {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n transition: opacity 0.3s linear;\n will-change: opacity;\n\n * {\n pointer-events: auto;\n }\n\n &.media-modal__navigation--hidden {\n opacity: 0;\n\n * {\n pointer-events: none;\n }\n }\n}\n\n.media-modal__nav {\n background: rgba($base-overlay-background, 0.5);\n box-sizing: border-box;\n border: 0;\n color: $primary-text-color;\n cursor: pointer;\n display: flex;\n align-items: center;\n font-size: 24px;\n height: 20vmax;\n margin: auto 0;\n padding: 30px 15px;\n position: absolute;\n top: 0;\n bottom: 0;\n}\n\n.media-modal__nav--left {\n left: 0;\n}\n\n.media-modal__nav--right {\n right: 0;\n}\n\n.media-modal__pagination {\n width: 100%;\n text-align: center;\n position: absolute;\n left: 0;\n bottom: 20px;\n pointer-events: none;\n}\n\n.media-modal__meta {\n text-align: center;\n position: absolute;\n left: 0;\n bottom: 20px;\n width: 100%;\n pointer-events: none;\n\n &--shifted {\n bottom: 62px;\n }\n\n a {\n pointer-events: auto;\n text-decoration: none;\n font-weight: 500;\n color: $ui-secondary-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.media-modal__page-dot {\n display: inline-block;\n}\n\n.media-modal__button {\n background-color: $white;\n height: 12px;\n width: 12px;\n border-radius: 6px;\n margin: 10px;\n padding: 0;\n border: 0;\n font-size: 0;\n}\n\n.media-modal__button--active {\n background-color: $ui-highlight-color;\n}\n\n.media-modal__close {\n position: absolute;\n right: 8px;\n top: 8px;\n z-index: 100;\n}\n\n.detailed,\n.fullscreen {\n .video-player__volume__current,\n .video-player__volume::before {\n bottom: 27px;\n }\n\n .video-player__volume__handle {\n bottom: 23px;\n }\n\n}\n\n.audio-player {\n box-sizing: border-box;\n position: relative;\n background: darken($ui-base-color, 8%);\n border-radius: 4px;\n padding-bottom: 44px;\n direction: ltr;\n\n &.editable {\n border-radius: 0;\n height: 100%;\n }\n\n &__waveform {\n padding: 15px 0;\n position: relative;\n overflow: hidden;\n\n &::before {\n content: \"\";\n display: block;\n position: absolute;\n border-top: 1px solid lighten($ui-base-color, 4%);\n width: 100%;\n height: 0;\n left: 0;\n top: calc(50% + 1px);\n }\n }\n\n &__progress-placeholder {\n background-color: rgba(lighten($ui-highlight-color, 8%), 0.5);\n }\n\n &__wave-placeholder {\n background-color: lighten($ui-base-color, 16%);\n }\n\n .video-player__controls {\n padding: 0 15px;\n padding-top: 10px;\n background: darken($ui-base-color, 8%);\n border-top: 1px solid lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n }\n}\n\n.video-player {\n overflow: hidden;\n position: relative;\n background: $base-shadow-color;\n max-width: 100%;\n border-radius: 4px;\n box-sizing: border-box;\n direction: ltr;\n\n &.editable {\n border-radius: 0;\n height: 100% !important;\n }\n\n &:focus {\n outline: 0;\n }\n\n .detailed-status & {\n width: 100%;\n height: 100%;\n }\n\n @include fullwidth-gallery;\n\n video {\n max-width: 100vw;\n max-height: 80vh;\n z-index: 1;\n position: relative;\n }\n\n &.fullscreen {\n width: 100% !important;\n height: 100% !important;\n margin: 0;\n\n video {\n max-width: 100% !important;\n max-height: 100% !important;\n width: 100% !important;\n height: 100% !important;\n outline: 0;\n }\n }\n\n &.inline {\n video {\n object-fit: contain;\n position: relative;\n top: 50%;\n transform: translateY(-50%);\n }\n }\n\n &__controls {\n position: absolute;\n z-index: 2;\n bottom: 0;\n left: 0;\n right: 0;\n box-sizing: border-box;\n background: linear-gradient(0deg, rgba($base-shadow-color, 0.85) 0, rgba($base-shadow-color, 0.45) 60%, transparent);\n padding: 0 15px;\n opacity: 0;\n transition: opacity .1s ease;\n\n &.active {\n opacity: 1;\n }\n }\n\n &.inactive {\n video,\n .video-player__controls {\n visibility: hidden;\n }\n }\n\n &__spoiler {\n display: none;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 4;\n border: 0;\n background: $base-shadow-color;\n color: $darker-text-color;\n transition: none;\n pointer-events: none;\n\n &.active {\n display: block;\n pointer-events: auto;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($darker-text-color, 7%);\n }\n }\n\n &__title {\n display: block;\n font-size: 14px;\n }\n\n &__subtitle {\n display: block;\n font-size: 11px;\n font-weight: 500;\n }\n }\n\n &__buttons-bar {\n display: flex;\n justify-content: space-between;\n padding-bottom: 10px;\n\n .video-player__download__icon {\n color: inherit;\n\n .fa,\n &:active .fa,\n &:hover .fa,\n &:focus .fa {\n color: inherit;\n }\n }\n }\n\n &__buttons {\n font-size: 16px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &.left {\n button {\n padding-left: 0;\n }\n }\n\n &.right {\n button {\n padding-right: 0;\n }\n }\n\n button {\n background: transparent;\n padding: 2px 10px;\n font-size: 16px;\n border: 0;\n color: rgba($white, 0.75);\n\n &:active,\n &:hover,\n &:focus {\n color: $white;\n }\n }\n }\n\n &__time-sep,\n &__time-total,\n &__time-current {\n font-size: 14px;\n font-weight: 500;\n }\n\n &__time-current {\n color: $white;\n margin-left: 60px;\n }\n\n &__time-sep {\n display: inline-block;\n margin: 0 6px;\n }\n\n &__time-sep,\n &__time-total {\n color: $white;\n }\n\n &__volume {\n cursor: pointer;\n height: 24px;\n display: inline;\n\n &::before {\n content: \"\";\n width: 50px;\n background: rgba($white, 0.35);\n border-radius: 4px;\n display: block;\n position: absolute;\n height: 4px;\n left: 70px;\n bottom: 20px;\n }\n\n &__current {\n display: block;\n position: absolute;\n height: 4px;\n border-radius: 4px;\n left: 70px;\n bottom: 20px;\n background: lighten($ui-highlight-color, 8%);\n }\n\n &__handle {\n position: absolute;\n z-index: 3;\n border-radius: 50%;\n width: 12px;\n height: 12px;\n bottom: 16px;\n left: 70px;\n transition: opacity .1s ease;\n background: lighten($ui-highlight-color, 8%);\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n pointer-events: none;\n }\n }\n\n &__link {\n padding: 2px 10px;\n\n a {\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n color: $white;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n }\n\n &__seek {\n cursor: pointer;\n height: 24px;\n position: relative;\n\n &::before {\n content: \"\";\n width: 100%;\n background: rgba($white, 0.35);\n border-radius: 4px;\n display: block;\n position: absolute;\n height: 4px;\n top: 10px;\n }\n\n &__progress,\n &__buffer {\n display: block;\n position: absolute;\n height: 4px;\n border-radius: 4px;\n top: 10px;\n background: lighten($ui-highlight-color, 8%);\n }\n\n &__buffer {\n background: rgba($white, 0.2);\n }\n\n &__handle {\n position: absolute;\n z-index: 3;\n opacity: 0;\n border-radius: 50%;\n width: 12px;\n height: 12px;\n top: 6px;\n margin-left: -6px;\n transition: opacity .1s ease;\n background: lighten($ui-highlight-color, 8%);\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n pointer-events: none;\n\n &.active {\n opacity: 1;\n }\n }\n\n &:hover {\n .video-player__seek__handle {\n opacity: 1;\n }\n }\n }\n\n &.detailed,\n &.fullscreen {\n .video-player__buttons {\n button {\n padding-top: 10px;\n padding-bottom: 10px;\n }\n }\n }\n}\n",".sensitive-info {\n display: flex;\n flex-direction: row;\n align-items: center;\n position: absolute;\n top: 4px;\n left: 4px;\n z-index: 100;\n}\n\n.sensitive-marker {\n margin: 0 3px;\n border-radius: 2px;\n padding: 2px 6px;\n color: rgba($primary-text-color, 0.8);\n background: rgba($base-overlay-background, 0.5);\n font-size: 12px;\n line-height: 18px;\n text-transform: uppercase;\n opacity: .9;\n transition: opacity .1s ease;\n\n .media-gallery:hover & { opacity: 1 }\n}\n",".list-editor {\n background: $ui-base-color;\n flex-direction: column;\n border-radius: 8px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n width: 380px;\n overflow: hidden;\n\n @media screen and (max-width: 420px) {\n width: 90%;\n }\n\n h4 {\n padding: 15px 0;\n background: lighten($ui-base-color, 13%);\n font-weight: 500;\n font-size: 16px;\n text-align: center;\n border-radius: 8px 8px 0 0;\n }\n\n .drawer__pager {\n height: 50vh;\n }\n\n .drawer__inner {\n border-radius: 0 0 8px 8px;\n\n &.backdrop {\n width: calc(100% - 60px);\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n border-radius: 0 0 0 8px;\n }\n }\n\n &__accounts {\n overflow-y: auto;\n }\n\n .account__display-name {\n &:hover strong {\n text-decoration: none;\n }\n }\n\n .account__avatar {\n cursor: default;\n }\n\n .search {\n margin-bottom: 0;\n }\n}\n\n.list-adder {\n background: $ui-base-color;\n flex-direction: column;\n border-radius: 8px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n width: 380px;\n overflow: hidden;\n\n @media screen and (max-width: 420px) {\n width: 90%;\n }\n\n &__account {\n background: lighten($ui-base-color, 13%);\n }\n\n &__lists {\n background: lighten($ui-base-color, 13%);\n height: 50vh;\n border-radius: 0 0 8px 8px;\n overflow-y: auto;\n }\n\n .list {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n .list__wrapper {\n display: flex;\n }\n\n .list__display-name {\n flex: 1 1 auto;\n overflow: hidden;\n text-decoration: none;\n font-size: 16px;\n padding: 10px;\n }\n}\n",".emoji-mart {\n &,\n * {\n box-sizing: border-box;\n line-height: 1.15;\n }\n\n font-size: 13px;\n display: inline-block;\n color: $inverted-text-color;\n\n .emoji-mart-emoji {\n padding: 6px;\n }\n}\n\n.emoji-mart-bar {\n border: 0 solid darken($ui-secondary-color, 8%);\n\n &:first-child {\n border-bottom-width: 1px;\n border-top-left-radius: 5px;\n border-top-right-radius: 5px;\n background: $ui-secondary-color;\n }\n\n &:last-child {\n border-top-width: 1px;\n border-bottom-left-radius: 5px;\n border-bottom-right-radius: 5px;\n display: none;\n }\n}\n\n.emoji-mart-anchors {\n display: flex;\n justify-content: space-between;\n padding: 0 6px;\n color: $lighter-text-color;\n line-height: 0;\n}\n\n.emoji-mart-anchor {\n position: relative;\n flex: 1;\n text-align: center;\n padding: 12px 4px;\n overflow: hidden;\n transition: color .1s ease-out;\n cursor: pointer;\n\n &:hover {\n color: darken($lighter-text-color, 4%);\n }\n}\n\n.emoji-mart-anchor-selected {\n color: $highlight-text-color;\n\n &:hover {\n color: darken($highlight-text-color, 4%);\n }\n\n .emoji-mart-anchor-bar {\n bottom: 0;\n }\n}\n\n.emoji-mart-anchor-bar {\n position: absolute;\n bottom: -3px;\n left: 0;\n width: 100%;\n height: 3px;\n background-color: darken($ui-highlight-color, 3%);\n}\n\n.emoji-mart-anchors {\n i {\n display: inline-block;\n width: 100%;\n max-width: 22px;\n }\n\n svg {\n fill: currentColor;\n max-height: 18px;\n }\n}\n\n.emoji-mart-scroll {\n overflow-y: scroll;\n height: 270px;\n max-height: 35vh;\n padding: 0 6px 6px;\n background: $simple-background-color;\n will-change: transform;\n\n &::-webkit-scrollbar-track:hover,\n &::-webkit-scrollbar-track:active {\n background-color: rgba($base-overlay-background, 0.3);\n }\n}\n\n.emoji-mart-search {\n padding: 10px;\n padding-right: 45px;\n background: $simple-background-color;\n\n input {\n font-size: 14px;\n font-weight: 400;\n padding: 7px 9px;\n font-family: inherit;\n display: block;\n width: 100%;\n background: rgba($ui-secondary-color, 0.3);\n color: $inverted-text-color;\n border: 1px solid $ui-secondary-color;\n border-radius: 4px;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n}\n\n.emoji-mart-category .emoji-mart-emoji {\n cursor: pointer;\n\n span {\n z-index: 1;\n position: relative;\n text-align: center;\n }\n\n &:hover::before {\n z-index: 0;\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba($ui-secondary-color, 0.7);\n border-radius: 100%;\n }\n}\n\n.emoji-mart-category-label {\n z-index: 2;\n position: relative;\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n\n span {\n display: block;\n width: 100%;\n font-weight: 500;\n padding: 5px 6px;\n background: $simple-background-color;\n }\n}\n\n.emoji-mart-emoji {\n position: relative;\n display: inline-block;\n font-size: 0;\n\n span {\n width: 22px;\n height: 22px;\n }\n}\n\n.emoji-mart-no-results {\n font-size: 14px;\n text-align: center;\n padding-top: 70px;\n color: $light-text-color;\n\n .emoji-mart-category-label {\n display: none;\n }\n\n .emoji-mart-no-results-label {\n margin-top: .2em;\n }\n\n .emoji-mart-emoji:hover::before {\n content: none;\n }\n}\n\n.emoji-mart-preview {\n display: none;\n}\n",".glitch.local-settings {\n position: relative;\n display: flex;\n flex-direction: row;\n background: $ui-secondary-color;\n color: $inverted-text-color;\n border-radius: 8px;\n height: 80vh;\n width: 80vw;\n max-width: 740px;\n max-height: 450px;\n overflow: hidden;\n\n label, legend {\n display: block;\n font-size: 14px;\n }\n\n .boolean label, .radio_buttons label {\n position: relative;\n padding-left: 28px;\n padding-top: 3px;\n\n input {\n position: absolute;\n left: 0;\n top: 0;\n }\n }\n\n span.hint {\n display: block;\n color: $lighter-text-color;\n }\n\n h1 {\n font-size: 18px;\n font-weight: 500;\n line-height: 24px;\n margin-bottom: 20px;\n }\n\n h2 {\n font-size: 15px;\n font-weight: 500;\n line-height: 20px;\n margin-top: 20px;\n margin-bottom: 10px;\n }\n}\n\n.glitch.local-settings__navigation__item {\n display: block;\n padding: 15px 20px;\n color: inherit;\n background: lighten($ui-secondary-color, 8%);\n border-bottom: 1px $ui-secondary-color solid;\n cursor: pointer;\n text-decoration: none;\n outline: none;\n transition: background .3s;\n\n .text-icon-button {\n color: inherit;\n transition: unset;\n }\n\n &:hover {\n background: $ui-secondary-color;\n }\n\n &.active {\n background: $ui-highlight-color;\n color: $primary-text-color;\n }\n\n &.close, &.close:hover {\n background: $error-value-color;\n color: $primary-text-color;\n }\n}\n\n.glitch.local-settings__navigation {\n background: lighten($ui-secondary-color, 8%);\n width: 212px;\n font-size: 15px;\n line-height: 20px;\n overflow-y: auto;\n}\n\n.glitch.local-settings__page {\n display: block;\n flex: auto;\n padding: 15px 20px 15px 20px;\n width: 360px;\n overflow-y: auto;\n}\n\n.glitch.local-settings__page__item {\n margin-bottom: 2px;\n}\n\n.glitch.local-settings__page__item.string,\n.glitch.local-settings__page__item.radio_buttons {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n\n@media screen and (max-width: 630px) {\n .glitch.local-settings__navigation {\n width: 40px;\n flex-shrink: 0;\n }\n\n .glitch.local-settings__navigation__item {\n padding: 10px;\n\n span:last-of-type {\n display: none;\n }\n }\n}\n",".error-boundary {\n color: $primary-text-color;\n font-size: 15px;\n line-height: 20px;\n\n h1 {\n font-size: 26px;\n line-height: 36px;\n font-weight: 400;\n margin-bottom: 8px;\n }\n\n a {\n color: $primary-text-color;\n text-decoration: underline;\n }\n\n ul {\n list-style: disc;\n margin-left: 0;\n padding-left: 1em;\n }\n\n textarea.web_app_crash-stacktrace {\n width: 100%;\n resize: none;\n white-space: pre;\n font-family: $font-monospace, monospace;\n }\n}\n",".compose-panel {\n width: 285px;\n margin-top: 10px;\n display: flex;\n flex-direction: column;\n height: calc(100% - 10px);\n overflow-y: hidden;\n\n .search__input {\n line-height: 18px;\n font-size: 16px;\n padding: 15px;\n padding-right: 30px;\n }\n\n .search__icon .fa {\n top: 15px;\n }\n\n .drawer--account {\n flex: 0 1 48px;\n }\n\n .flex-spacer {\n background: transparent;\n }\n\n .composer {\n flex: 1;\n overflow-y: hidden;\n display: flex;\n flex-direction: column;\n min-height: 310px;\n }\n\n .compose-form__autosuggest-wrapper {\n overflow-y: auto;\n background-color: $white;\n border-radius: 4px 4px 0 0;\n flex: 0 1 auto;\n }\n\n .autosuggest-textarea__textarea {\n overflow-y: hidden;\n }\n\n .compose-form__upload-thumbnail {\n height: 80px;\n }\n}\n\n.navigation-panel {\n margin-top: 10px;\n margin-bottom: 10px;\n height: calc(100% - 20px);\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n\n & > a {\n flex: 0 0 auto;\n }\n\n hr {\n flex: 0 0 auto;\n border: 0;\n background: transparent;\n border-top: 1px solid lighten($ui-base-color, 4%);\n margin: 10px 0;\n }\n\n .flex-spacer {\n background: transparent;\n }\n}\n\n@media screen and (min-width: 600px) {\n .tabs-bar__link {\n span {\n display: inline;\n }\n }\n}\n\n.columns-area--mobile {\n flex-direction: column;\n width: 100%;\n margin: 0 auto;\n\n .column,\n .drawer {\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .directory__list {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: block;\n }\n }\n\n .directory__card {\n margin-bottom: 0;\n }\n\n .filter-form {\n display: flex;\n }\n\n .autosuggest-textarea__textarea {\n font-size: 16px;\n }\n\n .search__input {\n line-height: 18px;\n font-size: 16px;\n padding: 15px;\n padding-right: 30px;\n }\n\n .search__icon .fa {\n top: 15px;\n }\n\n .scrollable {\n overflow: visible;\n\n @supports(display: grid) {\n contain: content;\n }\n }\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding: 10px 0;\n padding-top: 0;\n }\n\n @media screen and (min-width: 630px) {\n .detailed-status {\n padding: 15px;\n\n .media-gallery,\n .video-player,\n .audio-player {\n margin-top: 15px;\n }\n }\n\n .account__header__bar {\n padding: 5px 10px;\n }\n\n .navigation-bar,\n .compose-form {\n padding: 15px;\n }\n\n .compose-form .compose-form__publish .compose-form__publish-button-wrapper {\n padding-top: 15px;\n }\n\n .status {\n padding: 15px;\n min-height: 48px + 2px;\n\n .media-gallery,\n &__action-bar,\n .video-player,\n .audio-player {\n margin-top: 10px;\n }\n }\n\n .account {\n padding: 15px 10px;\n\n &__header__bio {\n margin: 0 -10px;\n }\n }\n\n .notification {\n &__message {\n padding-top: 15px;\n }\n\n .status {\n padding-top: 8px;\n }\n\n .account {\n padding-top: 8px;\n }\n }\n }\n}\n\n.floating-action-button {\n position: fixed;\n display: flex;\n justify-content: center;\n align-items: center;\n width: 3.9375rem;\n height: 3.9375rem;\n bottom: 1.3125rem;\n right: 1.3125rem;\n background: darken($ui-highlight-color, 3%);\n color: $white;\n border-radius: 50%;\n font-size: 21px;\n line-height: 21px;\n text-decoration: none;\n box-shadow: 2px 3px 9px rgba($base-shadow-color, 0.4);\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-highlight-color, 7%);\n }\n}\n\n@media screen and (min-width: $no-gap-breakpoint) {\n .tabs-bar {\n width: 100%;\n }\n\n .react-swipeable-view-container .columns-area--mobile {\n height: calc(100% - 10px) !important;\n }\n\n .getting-started__wrapper,\n .search {\n margin-bottom: 10px;\n }\n}\n\n@media screen and (max-width: 600px + (285px * 1) + (10px * 1)) {\n .columns-area__panels__pane--compositional {\n display: none;\n }\n}\n\n@media screen and (min-width: 600px + (285px * 1) + (10px * 1)) {\n .floating-action-button,\n .tabs-bar__link.optional {\n display: none;\n }\n\n .search-page .search {\n display: none;\n }\n}\n\n@media screen and (max-width: 600px + (285px * 2) + (10px * 2)) {\n .columns-area__panels__pane--navigational {\n display: none;\n }\n}\n\n@media screen and (min-width: 600px + (285px * 2) + (10px * 2)) {\n .tabs-bar {\n display: none;\n }\n}\n",".announcements__item__content {\n word-wrap: break-word;\n overflow-y: auto;\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n p {\n margin-bottom: 10px;\n white-space: pre-wrap;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: $secondary-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n\n &.mention {\n &:hover {\n text-decoration: none;\n\n span {\n text-decoration: underline;\n }\n }\n }\n\n &.unhandled-link {\n color: lighten($ui-highlight-color, 8%);\n }\n }\n}\n\n.announcements {\n background: lighten($ui-base-color, 8%);\n font-size: 13px;\n display: flex;\n align-items: flex-end;\n\n &__mastodon {\n width: 124px;\n flex: 0 0 auto;\n\n @media screen and (max-width: 124px + 300px) {\n display: none;\n }\n }\n\n &__container {\n width: calc(100% - 124px);\n flex: 0 0 auto;\n position: relative;\n\n @media screen and (max-width: 124px + 300px) {\n width: 100%;\n }\n }\n\n &__item {\n box-sizing: border-box;\n width: 100%;\n padding: 15px;\n position: relative;\n font-size: 15px;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n max-height: 50vh;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n\n &__range {\n display: block;\n font-weight: 500;\n margin-bottom: 10px;\n padding-right: 18px;\n }\n\n &__unread {\n position: absolute;\n top: 19px;\n right: 19px;\n display: block;\n background: $highlight-text-color;\n border-radius: 50%;\n width: 0.625rem;\n height: 0.625rem;\n }\n }\n\n &__pagination {\n padding: 15px;\n color: $darker-text-color;\n position: absolute;\n bottom: 3px;\n right: 0;\n }\n}\n\n.layout-multiple-columns .announcements__mastodon {\n display: none;\n}\n\n.layout-multiple-columns .announcements__container {\n width: 100%;\n}\n\n.reactions-bar {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n margin-top: 15px;\n margin-left: -2px;\n width: calc(100% - (90px - 33px));\n\n &__item {\n flex-shrink: 0;\n background: lighten($ui-base-color, 12%);\n border: 0;\n border-radius: 3px;\n margin: 2px;\n cursor: pointer;\n user-select: none;\n padding: 0 6px;\n display: flex;\n align-items: center;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &__emoji {\n display: block;\n margin: 3px 0;\n width: 16px;\n height: 16px;\n\n img {\n display: block;\n margin: 0;\n width: 100%;\n height: 100%;\n min-width: auto;\n min-height: auto;\n vertical-align: bottom;\n object-fit: contain;\n }\n }\n\n &__count {\n display: block;\n min-width: 9px;\n font-size: 13px;\n font-weight: 500;\n text-align: center;\n margin-left: 6px;\n color: $darker-text-color;\n }\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 16%);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n\n &__count {\n color: lighten($darker-text-color, 4%);\n }\n }\n\n &.active {\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n background-color: mix(lighten($ui-base-color, 12%), $ui-highlight-color, 80%);\n\n .reactions-bar__item__count {\n color: lighten($highlight-text-color, 8%);\n }\n }\n }\n\n .emoji-picker-dropdown {\n margin: 2px;\n }\n\n &:hover .emoji-button {\n opacity: 0.85;\n }\n\n .emoji-button {\n color: $darker-text-color;\n margin: 0;\n font-size: 16px;\n width: auto;\n flex-shrink: 0;\n padding: 0 6px;\n height: 22px;\n display: flex;\n align-items: center;\n opacity: 0.5;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &:hover,\n &:active,\n &:focus {\n opacity: 1;\n color: lighten($darker-text-color, 4%);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n }\n }\n\n &--empty {\n .emoji-button {\n padding: 0;\n }\n }\n}\n",".poll {\n margin-top: 16px;\n font-size: 14px;\n\n ul,\n .e-content & ul {\n margin: 0;\n list-style: none;\n }\n\n li {\n margin-bottom: 10px;\n position: relative;\n }\n\n &__chart {\n border-radius: 4px;\n display: block;\n background: darken($ui-primary-color, 5%);\n height: 5px;\n min-width: 1%;\n\n &.leading {\n background: $ui-highlight-color;\n }\n }\n\n &__option {\n position: relative;\n display: flex;\n padding: 6px 0;\n line-height: 18px;\n cursor: default;\n overflow: hidden;\n\n &__text {\n display: inline-block;\n word-wrap: break-word;\n overflow-wrap: break-word;\n max-width: calc(100% - 45px - 25px);\n }\n\n input[type=radio],\n input[type=checkbox] {\n display: none;\n }\n\n .autossugest-input {\n flex: 1 1 auto;\n }\n\n input[type=text] {\n display: block;\n box-sizing: border-box;\n width: 100%;\n font-size: 14px;\n color: $inverted-text-color;\n display: block;\n outline: 0;\n font-family: inherit;\n background: $simple-background-color;\n border: 1px solid darken($simple-background-color, 14%);\n border-radius: 4px;\n padding: 6px 10px;\n\n &:focus {\n border-color: $highlight-text-color;\n }\n }\n\n &.selectable {\n cursor: pointer;\n }\n\n &.editable {\n display: flex;\n align-items: center;\n overflow: visible;\n }\n }\n\n &__input {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 50%;\n vertical-align: middle;\n margin-top: auto;\n margin-bottom: auto;\n flex: 0 0 18px;\n\n &.checkbox {\n border-radius: 4px;\n }\n\n &.active {\n border-color: $valid-value-color;\n background: $valid-value-color;\n }\n\n &:active,\n &:focus,\n &:hover {\n border-color: lighten($valid-value-color, 15%);\n border-width: 4px;\n }\n\n &::-moz-focus-inner {\n outline: 0 !important;\n border: 0;\n }\n\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n\n &__number {\n display: inline-block;\n width: 45px;\n font-weight: 700;\n flex: 0 0 45px;\n }\n\n &__voted {\n padding: 0 5px;\n display: inline-block;\n\n &__mark {\n font-size: 18px;\n }\n }\n\n &__footer {\n padding-top: 6px;\n padding-bottom: 5px;\n color: $dark-text-color;\n }\n\n &__link {\n display: inline;\n background: transparent;\n padding: 0;\n margin: 0;\n border: 0;\n color: $dark-text-color;\n text-decoration: underline;\n font-size: inherit;\n\n &:hover {\n text-decoration: none;\n }\n\n &:active,\n &:focus {\n background-color: rgba($dark-text-color, .1);\n }\n }\n\n .button {\n height: 36px;\n padding: 0 16px;\n margin-right: 10px;\n font-size: 14px;\n }\n}\n\n.compose-form__poll-wrapper {\n border-top: 1px solid darken($simple-background-color, 8%);\n overflow-x: hidden;\n\n ul {\n padding: 10px;\n }\n\n .poll__footer {\n border-top: 1px solid darken($simple-background-color, 8%);\n padding: 10px;\n display: flex;\n align-items: center;\n\n button,\n select {\n width: 100%;\n flex: 1 1 50%;\n\n &:focus {\n border-color: $highlight-text-color;\n }\n }\n }\n\n .button.button-secondary {\n font-size: 14px;\n font-weight: 400;\n padding: 6px 10px;\n height: auto;\n line-height: inherit;\n color: $action-button-color;\n border-color: $action-button-color;\n margin-right: 5px;\n }\n\n li {\n display: flex;\n align-items: center;\n\n .poll__option {\n flex: 0 0 auto;\n width: calc(100% - (23px + 6px));\n margin-right: 6px;\n }\n }\n\n select {\n appearance: none;\n box-sizing: border-box;\n font-size: 14px;\n color: $inverted-text-color;\n display: inline-block;\n width: auto;\n outline: 0;\n font-family: inherit;\n background: $simple-background-color url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center / auto 16px;\n border: 1px solid darken($simple-background-color, 14%);\n border-radius: 4px;\n padding: 6px 10px;\n padding-right: 30px;\n }\n\n .icon-button.disabled {\n color: darken($simple-background-color, 14%);\n }\n}\n\n.muted .poll {\n color: $dark-text-color;\n\n &__chart {\n background: rgba(darken($ui-primary-color, 14%), 0.2);\n\n &.leading {\n background: rgba($ui-highlight-color, 0.2);\n }\n }\n}\n","$maximum-width: 1235px;\n$fluid-breakpoint: $maximum-width + 20px;\n$column-breakpoint: 700px;\n$small-breakpoint: 960px;\n\n.container {\n box-sizing: border-box;\n max-width: $maximum-width;\n margin: 0 auto;\n position: relative;\n\n @media screen and (max-width: $fluid-breakpoint) {\n width: 100%;\n padding: 0 10px;\n }\n}\n\n.rich-formatting {\n font-family: $font-sans-serif, sans-serif;\n font-size: 14px;\n font-weight: 400;\n line-height: 1.7;\n word-wrap: break-word;\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n p,\n li {\n color: $darker-text-color;\n }\n\n p {\n margin-top: 0;\n margin-bottom: .85em;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n strong {\n font-weight: 700;\n color: $secondary-text-color;\n }\n\n em {\n font-style: italic;\n color: $secondary-text-color;\n }\n\n code {\n font-size: 0.85em;\n background: darken($ui-base-color, 8%);\n border-radius: 4px;\n padding: 0.2em 0.3em;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n font-family: $font-display, sans-serif;\n margin-top: 1.275em;\n margin-bottom: .85em;\n font-weight: 500;\n color: $secondary-text-color;\n }\n\n h1 {\n font-size: 2em;\n }\n\n h2 {\n font-size: 1.75em;\n }\n\n h3 {\n font-size: 1.5em;\n }\n\n h4 {\n font-size: 1.25em;\n }\n\n h5,\n h6 {\n font-size: 1em;\n }\n\n ul {\n list-style: disc;\n }\n\n ol {\n list-style: decimal;\n }\n\n ul,\n ol {\n margin: 0;\n padding: 0;\n padding-left: 2em;\n margin-bottom: 0.85em;\n\n &[type='a'] {\n list-style-type: lower-alpha;\n }\n\n &[type='i'] {\n list-style-type: lower-roman;\n }\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n margin: 1.7em 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n\n table {\n width: 100%;\n border-collapse: collapse;\n break-inside: auto;\n margin-top: 24px;\n margin-bottom: 32px;\n\n thead tr,\n tbody tr {\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n font-size: 1em;\n line-height: 1.625;\n font-weight: 400;\n text-align: left;\n color: $darker-text-color;\n }\n\n thead tr {\n border-bottom-width: 2px;\n line-height: 1.5;\n font-weight: 500;\n color: $dark-text-color;\n }\n\n th,\n td {\n padding: 8px;\n align-self: start;\n align-items: start;\n word-break: break-all;\n\n &.nowrap {\n width: 25%;\n position: relative;\n\n &::before {\n content: ' ';\n visibility: hidden;\n }\n\n span {\n position: absolute;\n left: 8px;\n right: 8px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n }\n\n & > :first-child {\n margin-top: 0;\n }\n}\n\n.information-board {\n background: darken($ui-base-color, 4%);\n padding: 20px 0;\n\n .container-alt {\n position: relative;\n padding-right: 280px + 15px;\n }\n\n &__sections {\n display: flex;\n justify-content: space-between;\n flex-wrap: wrap;\n }\n\n &__section {\n flex: 1 0 0;\n font-family: $font-sans-serif, sans-serif;\n font-size: 16px;\n line-height: 28px;\n color: $primary-text-color;\n text-align: right;\n padding: 10px 15px;\n\n span,\n strong {\n display: block;\n }\n\n span {\n &:last-child {\n color: $secondary-text-color;\n }\n }\n\n strong {\n font-family: $font-display, sans-serif;\n font-weight: 500;\n font-size: 32px;\n line-height: 48px;\n }\n\n @media screen and (max-width: $column-breakpoint) {\n text-align: center;\n }\n }\n\n .panel {\n position: absolute;\n width: 280px;\n box-sizing: border-box;\n background: darken($ui-base-color, 8%);\n padding: 20px;\n padding-top: 10px;\n border-radius: 4px 4px 0 0;\n right: 0;\n bottom: -40px;\n\n .panel-header {\n font-family: $font-display, sans-serif;\n font-size: 14px;\n line-height: 24px;\n font-weight: 500;\n color: $darker-text-color;\n padding-bottom: 5px;\n margin-bottom: 15px;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n\n a,\n span {\n font-weight: 400;\n color: darken($darker-text-color, 10%);\n }\n\n a {\n text-decoration: none;\n }\n }\n }\n\n .owner {\n text-align: center;\n\n .avatar {\n width: 80px;\n height: 80px;\n @include avatar-size(80px);\n margin: 0 auto;\n margin-bottom: 15px;\n\n img {\n display: block;\n width: 80px;\n height: 80px;\n border-radius: 48px;\n @include avatar-radius();\n }\n }\n\n .name {\n font-size: 14px;\n\n a {\n display: block;\n color: $primary-text-color;\n text-decoration: none;\n\n &:hover {\n .display_name {\n text-decoration: underline;\n }\n }\n }\n\n .username {\n display: block;\n color: $darker-text-color;\n }\n }\n }\n}\n\n.landing-page {\n p,\n li {\n font-family: $font-sans-serif, sans-serif;\n font-size: 16px;\n font-weight: 400;\n font-size: 16px;\n line-height: 30px;\n margin-bottom: 12px;\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n }\n }\n\n em {\n display: inline;\n margin: 0;\n padding: 0;\n font-weight: 700;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n color: lighten($darker-text-color, 10%);\n }\n\n h1 {\n font-family: $font-display, sans-serif;\n font-size: 26px;\n line-height: 30px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n\n small {\n font-family: $font-sans-serif, sans-serif;\n display: block;\n font-size: 18px;\n font-weight: 400;\n color: lighten($darker-text-color, 10%);\n }\n }\n\n h2 {\n font-family: $font-display, sans-serif;\n font-size: 22px;\n line-height: 26px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h3 {\n font-family: $font-display, sans-serif;\n font-size: 18px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h4 {\n font-family: $font-display, sans-serif;\n font-size: 16px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h5 {\n font-family: $font-display, sans-serif;\n font-size: 14px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h6 {\n font-family: $font-display, sans-serif;\n font-size: 12px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n ul,\n ol {\n margin-left: 20px;\n\n &[type='a'] {\n list-style-type: lower-alpha;\n }\n\n &[type='i'] {\n list-style-type: lower-roman;\n }\n }\n\n ul {\n list-style: disc;\n }\n\n ol {\n list-style: decimal;\n }\n\n li > ol,\n li > ul {\n margin-top: 6px;\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid rgba($ui-base-lighter-color, .6);\n margin: 20px 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n\n &__information,\n &__forms {\n padding: 20px;\n }\n\n &__call-to-action {\n background: $ui-base-color;\n border-radius: 4px;\n padding: 25px 40px;\n overflow: hidden;\n box-sizing: border-box;\n\n .row {\n width: 100%;\n display: flex;\n flex-direction: row-reverse;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n }\n\n .row__information-board {\n display: flex;\n justify-content: flex-end;\n align-items: flex-end;\n\n .information-board__section {\n flex: 1 0 auto;\n padding: 0 10px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n width: 100%;\n justify-content: space-between;\n }\n }\n\n .row__mascot {\n flex: 1;\n margin: 10px -50px 0 0;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n }\n\n &__logo {\n margin-right: 20px;\n\n img {\n height: 50px;\n width: auto;\n mix-blend-mode: lighten;\n }\n }\n\n &__information {\n padding: 45px 40px;\n margin-bottom: 10px;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n strong {\n font-weight: 500;\n color: lighten($darker-text-color, 10%);\n }\n\n .account {\n border-bottom: 0;\n padding: 0;\n\n &__display-name {\n align-items: center;\n display: flex;\n margin-right: 5px;\n }\n\n div.account__display-name {\n &:hover {\n .display-name strong {\n text-decoration: none;\n }\n }\n\n .account__avatar {\n cursor: default;\n }\n }\n\n &__avatar-wrapper {\n margin-left: 0;\n flex: 0 0 auto;\n }\n\n &__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n @include avatar-size(44px);\n }\n\n .display-name {\n font-size: 15px;\n\n &__account {\n font-size: 14px;\n }\n }\n }\n\n @media screen and (max-width: $small-breakpoint) {\n .contact {\n margin-top: 30px;\n }\n }\n\n @media screen and (max-width: $column-breakpoint) {\n padding: 25px 20px;\n }\n }\n\n &__information,\n &__forms,\n #mastodon-timeline {\n box-sizing: border-box;\n background: $ui-base-color;\n border-radius: 4px;\n box-shadow: 0 0 6px rgba($black, 0.1);\n }\n\n &__mascot {\n height: 104px;\n position: relative;\n left: -40px;\n bottom: 25px;\n\n img {\n height: 190px;\n width: auto;\n }\n }\n\n &__short-description {\n .row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n margin-bottom: 40px;\n }\n\n @media screen and (max-width: $column-breakpoint) {\n .row {\n margin-bottom: 20px;\n }\n }\n\n p a {\n color: $secondary-text-color;\n }\n\n h1 {\n font-weight: 500;\n color: $primary-text-color;\n margin-bottom: 0;\n\n small {\n color: $darker-text-color;\n\n span {\n color: $secondary-text-color;\n }\n }\n }\n\n p:last-child {\n margin-bottom: 0;\n }\n }\n\n &__hero {\n margin-bottom: 10px;\n\n img {\n display: block;\n margin: 0;\n max-width: 100%;\n height: auto;\n border-radius: 4px;\n }\n }\n\n @media screen and (max-width: 840px) {\n .information-board {\n .container-alt {\n padding-right: 20px;\n }\n\n .panel {\n position: static;\n margin-top: 20px;\n width: 100%;\n border-radius: 4px;\n\n .panel-header {\n text-align: center;\n }\n }\n }\n }\n\n @media screen and (max-width: 675px) {\n .header-wrapper {\n padding-top: 0;\n\n &.compact {\n padding-bottom: 0;\n }\n\n &.compact .hero .heading {\n text-align: initial;\n }\n }\n\n .header .container-alt,\n .features .container-alt {\n display: block;\n }\n }\n\n .cta {\n margin: 20px;\n }\n}\n\n.landing {\n margin-bottom: 100px;\n\n @media screen and (max-width: 738px) {\n margin-bottom: 0;\n }\n\n &__brand {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 50px;\n\n svg {\n fill: $primary-text-color;\n height: 52px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding: 0;\n margin-bottom: 30px;\n }\n }\n\n .directory {\n margin-top: 30px;\n background: transparent;\n box-shadow: none;\n border-radius: 0;\n }\n\n .hero-widget {\n margin-top: 30px;\n margin-bottom: 0;\n\n h4 {\n padding: 10px;\n text-transform: uppercase;\n font-weight: 700;\n font-size: 13px;\n color: $darker-text-color;\n }\n\n &__text {\n border-radius: 0;\n padding-bottom: 0;\n }\n\n &__footer {\n background: $ui-base-color;\n padding: 10px;\n border-radius: 0 0 4px 4px;\n display: flex;\n\n &__column {\n flex: 1 1 50%;\n }\n }\n\n .account {\n padding: 10px 0;\n border-bottom: 0;\n\n .account__display-name {\n display: flex;\n align-items: center;\n }\n\n .account__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n }\n\n &__counter {\n padding: 10px;\n\n strong {\n font-family: $font-display, sans-serif;\n font-size: 15px;\n font-weight: 700;\n display: block;\n }\n\n span {\n font-size: 14px;\n color: $darker-text-color;\n }\n }\n }\n\n .simple_form .user_agreement .label_input > label {\n font-weight: 400;\n color: $darker-text-color;\n }\n\n .simple_form p.lead {\n color: $darker-text-color;\n font-size: 15px;\n line-height: 20px;\n font-weight: 400;\n margin-bottom: 25px;\n }\n\n &__grid {\n max-width: 960px;\n margin: 0 auto;\n display: grid;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n grid-gap: 30px;\n\n @media screen and (max-width: 738px) {\n grid-template-columns: minmax(0, 100%);\n grid-gap: 10px;\n\n &__column-login {\n grid-row: 1;\n display: flex;\n flex-direction: column;\n\n .box-widget {\n order: 2;\n flex: 0 0 auto;\n }\n\n .hero-widget {\n margin-top: 0;\n margin-bottom: 10px;\n order: 1;\n flex: 0 0 auto;\n }\n }\n\n &__column-registration {\n grid-row: 2;\n }\n\n .directory {\n margin-top: 10px;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n\n .hero-widget {\n display: block;\n margin-bottom: 0;\n box-shadow: none;\n\n &__img,\n &__img img,\n &__footer {\n border-radius: 0;\n }\n }\n\n .hero-widget,\n .box-widget,\n .directory__tag {\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n .directory {\n margin-top: 0;\n\n &__tag {\n margin-bottom: 0;\n\n & > a,\n & > div {\n border-radius: 0;\n box-shadow: none;\n }\n\n &:last-child {\n border-bottom: 0;\n }\n }\n }\n }\n }\n}\n\n.brand {\n position: relative;\n text-decoration: none;\n}\n\n.brand__tagline {\n display: block;\n position: absolute;\n bottom: -10px;\n left: 50px;\n width: 300px;\n color: $ui-primary-color;\n text-decoration: none;\n font-size: 14px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n position: static;\n width: auto;\n margin-top: 20px;\n color: $dark-text-color;\n }\n}\n\n",".table {\n width: 100%;\n max-width: 100%;\n border-spacing: 0;\n border-collapse: collapse;\n\n th,\n td {\n padding: 8px;\n line-height: 18px;\n vertical-align: top;\n border-top: 1px solid $ui-base-color;\n text-align: left;\n background: darken($ui-base-color, 4%);\n }\n\n & > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid $ui-base-color;\n border-top: 0;\n font-weight: 500;\n }\n\n & > tbody > tr > th {\n font-weight: 500;\n }\n\n & > tbody > tr:nth-child(odd) > td,\n & > tbody > tr:nth-child(odd) > th {\n background: $ui-base-color;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n &.inline-table {\n & > tbody > tr:nth-child(odd) {\n & > td,\n & > th {\n background: transparent;\n }\n }\n\n & > tbody > tr:first-child {\n & > td,\n & > th {\n border-top: 0;\n }\n }\n }\n\n &.batch-table {\n & > thead > tr > th {\n background: $ui-base-color;\n border-top: 1px solid darken($ui-base-color, 8%);\n border-bottom: 1px solid darken($ui-base-color, 8%);\n\n &:first-child {\n border-radius: 4px 0 0;\n border-left: 1px solid darken($ui-base-color, 8%);\n }\n\n &:last-child {\n border-radius: 0 4px 0 0;\n border-right: 1px solid darken($ui-base-color, 8%);\n }\n }\n }\n\n &--invites tbody td {\n vertical-align: middle;\n }\n}\n\n.table-wrapper {\n overflow: auto;\n margin-bottom: 20px;\n}\n\nsamp {\n font-family: $font-monospace, monospace;\n}\n\nbutton.table-action-link {\n background: transparent;\n border: 0;\n font: inherit;\n}\n\nbutton.table-action-link,\na.table-action-link {\n text-decoration: none;\n display: inline-block;\n margin-right: 5px;\n padding: 0 10px;\n color: $darker-text-color;\n font-weight: 500;\n\n &:hover {\n color: $primary-text-color;\n }\n\n i.fa {\n font-weight: 400;\n margin-right: 5px;\n }\n\n &:first-child {\n padding-left: 0;\n }\n}\n\n.batch-table {\n &__toolbar,\n &__row {\n display: flex;\n\n &__select {\n box-sizing: border-box;\n padding: 8px 16px;\n cursor: pointer;\n min-height: 100%;\n\n input {\n margin-top: 8px;\n }\n\n &--aligned {\n display: flex;\n align-items: center;\n\n input {\n margin-top: 0;\n }\n }\n }\n\n &__actions,\n &__content {\n padding: 8px 0;\n padding-right: 16px;\n flex: 1 1 auto;\n }\n }\n\n &__toolbar {\n border: 1px solid darken($ui-base-color, 8%);\n background: $ui-base-color;\n border-radius: 4px 0 0;\n height: 47px;\n align-items: center;\n\n &__actions {\n text-align: right;\n padding-right: 16px - 5px;\n }\n }\n\n &__form {\n padding: 16px;\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n background: $ui-base-color;\n\n .fields-row {\n padding-top: 0;\n margin-bottom: 0;\n }\n }\n\n &__row {\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n background: darken($ui-base-color, 4%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n .optional &:first-child {\n border-top: 1px solid darken($ui-base-color, 8%);\n }\n }\n\n &:hover {\n background: darken($ui-base-color, 2%);\n }\n\n &:nth-child(even) {\n background: $ui-base-color;\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n }\n\n &__content {\n padding-top: 12px;\n padding-bottom: 16px;\n\n &--unpadded {\n padding: 0;\n }\n\n &--with-image {\n display: flex;\n align-items: center;\n }\n\n &__image {\n flex: 0 0 auto;\n display: flex;\n justify-content: center;\n align-items: center;\n margin-right: 10px;\n\n .emojione {\n width: 32px;\n height: 32px;\n }\n }\n\n &__text {\n flex: 1 1 auto;\n }\n\n &__extra {\n flex: 0 0 auto;\n text-align: right;\n color: $darker-text-color;\n font-weight: 500;\n }\n }\n\n .directory__tag {\n margin: 0;\n width: 100%;\n\n a {\n background: transparent;\n border-radius: 0;\n }\n }\n }\n\n &.optional .batch-table__toolbar,\n &.optional .batch-table__row__select {\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n\n .status__content {\n padding-top: 0;\n\n strong {\n font-weight: 700;\n }\n }\n\n .nothing-here {\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n box-shadow: none;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 1px solid darken($ui-base-color, 8%);\n }\n }\n\n @media screen and (max-width: 870px) {\n .accounts-table tbody td.optional {\n display: none;\n }\n }\n}\n","$no-columns-breakpoint: 600px;\n$sidebar-width: 240px;\n$content-width: 840px;\n\n.admin-wrapper {\n display: flex;\n justify-content: center;\n width: 100%;\n min-height: 100vh;\n\n .sidebar-wrapper {\n min-height: 100vh;\n overflow: hidden;\n pointer-events: none;\n flex: 1 1 auto;\n\n &__inner {\n display: flex;\n justify-content: flex-end;\n background: $ui-base-color;\n height: 100%;\n }\n }\n\n .sidebar {\n width: $sidebar-width;\n padding: 0;\n pointer-events: auto;\n\n &__toggle {\n display: none;\n background: lighten($ui-base-color, 8%);\n height: 48px;\n\n &__logo {\n flex: 1 1 auto;\n\n a {\n display: inline-block;\n padding: 15px;\n }\n\n svg {\n fill: $primary-text-color;\n height: 20px;\n position: relative;\n bottom: -2px;\n }\n }\n\n &__icon {\n display: block;\n color: $darker-text-color;\n text-decoration: none;\n flex: 0 0 auto;\n font-size: 20px;\n padding: 15px;\n }\n\n a {\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 12%);\n }\n }\n }\n\n .logo {\n display: block;\n margin: 40px auto;\n width: 100px;\n height: 100px;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n & > a:first-child {\n display: none;\n }\n }\n\n ul {\n list-style: none;\n border-radius: 4px 0 0 4px;\n overflow: hidden;\n margin-bottom: 20px;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n margin-bottom: 0;\n }\n\n a {\n display: block;\n padding: 15px;\n color: $darker-text-color;\n text-decoration: none;\n transition: all 200ms linear;\n transition-property: color, background-color;\n border-radius: 4px 0 0 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n i.fa {\n margin-right: 5px;\n }\n\n &:hover {\n color: $primary-text-color;\n background-color: darken($ui-base-color, 5%);\n transition: all 100ms linear;\n transition-property: color, background-color;\n }\n\n &.selected {\n background: darken($ui-base-color, 2%);\n border-radius: 4px 0 0;\n }\n }\n\n ul {\n background: darken($ui-base-color, 4%);\n border-radius: 0 0 0 4px;\n margin: 0;\n\n a {\n border: 0;\n padding: 15px 35px;\n }\n }\n\n .simple-navigation-active-leaf a {\n color: $primary-text-color;\n background-color: $ui-highlight-color;\n border-bottom: 0;\n border-radius: 0;\n\n &:hover {\n background-color: lighten($ui-highlight-color, 5%);\n }\n }\n }\n\n & > ul > .simple-navigation-active-leaf a {\n border-radius: 4px 0 0 4px;\n }\n }\n\n .content-wrapper {\n box-sizing: border-box;\n width: 100%;\n max-width: $content-width;\n flex: 1 1 auto;\n }\n\n @media screen and (max-width: $content-width + $sidebar-width) {\n .sidebar-wrapper--empty {\n display: none;\n }\n\n .sidebar-wrapper {\n width: $sidebar-width;\n flex: 0 0 auto;\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n .sidebar-wrapper {\n width: 100%;\n }\n }\n\n .content {\n padding: 20px 15px;\n padding-top: 60px;\n padding-left: 25px;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n max-width: none;\n padding: 15px;\n padding-top: 30px;\n }\n\n &-heading {\n display: flex;\n\n padding-bottom: 40px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n margin: -15px -15px 40px 0;\n\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n\n & > * {\n margin-top: 15px;\n margin-right: 15px;\n }\n\n &-actions {\n display: inline-flex;\n\n & > :not(:first-child) {\n margin-left: 5px;\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n border-bottom: 0;\n padding-bottom: 0;\n }\n }\n\n h2 {\n color: $secondary-text-color;\n font-size: 24px;\n line-height: 28px;\n font-weight: 400;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n font-weight: 700;\n }\n }\n\n h3 {\n color: $secondary-text-color;\n font-size: 20px;\n line-height: 28px;\n font-weight: 400;\n margin-bottom: 30px;\n }\n\n h4 {\n text-transform: uppercase;\n font-size: 13px;\n font-weight: 700;\n color: $darker-text-color;\n padding-bottom: 8px;\n margin-bottom: 8px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n h6 {\n font-size: 16px;\n color: $secondary-text-color;\n line-height: 28px;\n font-weight: 500;\n }\n\n .fields-group h6 {\n color: $primary-text-color;\n font-weight: 500;\n }\n\n .directory__tag > a,\n .directory__tag > div {\n box-shadow: none;\n }\n\n .directory__tag .table-action-link .fa {\n color: inherit;\n }\n\n .directory__tag h4 {\n font-size: 18px;\n font-weight: 700;\n color: $primary-text-color;\n text-transform: none;\n padding-bottom: 0;\n margin-bottom: 0;\n border-bottom: none;\n }\n\n & > p {\n font-size: 14px;\n line-height: 21px;\n color: $secondary-text-color;\n margin-bottom: 20px;\n\n strong {\n color: $primary-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid rgba($ui-base-lighter-color, .6);\n margin: 20px 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n\n .sidebar-wrapper {\n min-height: 0;\n }\n\n .sidebar {\n width: 100%;\n padding: 0;\n height: auto;\n\n &__toggle {\n display: flex;\n }\n\n & > ul {\n display: none;\n }\n\n ul a,\n ul ul a {\n border-radius: 0;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n transition: none;\n\n &:hover {\n transition: none;\n }\n }\n\n ul ul {\n border-radius: 0;\n }\n\n ul .simple-navigation-active-leaf a {\n border-bottom-color: $ui-highlight-color;\n }\n }\n }\n}\n\nhr.spacer {\n width: 100%;\n border: 0;\n margin: 20px 0;\n height: 1px;\n}\n\nbody,\n.admin-wrapper .content {\n .muted-hint {\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n }\n }\n\n .positive-hint {\n color: $valid-value-color;\n font-weight: 500;\n }\n\n .negative-hint {\n color: $error-value-color;\n font-weight: 500;\n }\n\n .neutral-hint {\n color: $dark-text-color;\n font-weight: 500;\n }\n\n .warning-hint {\n color: $gold-star;\n font-weight: 500;\n }\n}\n\n.filters {\n display: flex;\n flex-wrap: wrap;\n\n .filter-subset {\n flex: 0 0 auto;\n margin: 0 40px 20px 0;\n\n &:last-child {\n margin-bottom: 30px;\n }\n\n ul {\n margin-top: 5px;\n list-style: none;\n\n li {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n strong {\n font-weight: 500;\n text-transform: uppercase;\n font-size: 12px;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n &--with-select strong {\n display: block;\n margin-bottom: 10px;\n }\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n text-transform: uppercase;\n font-size: 12px;\n font-weight: 500;\n border-bottom: 2px solid $ui-base-color;\n\n &:hover {\n color: $primary-text-color;\n border-bottom: 2px solid lighten($ui-base-color, 5%);\n }\n\n &.selected {\n color: $highlight-text-color;\n border-bottom: 2px solid $ui-highlight-color;\n }\n }\n }\n}\n\n.flavour-screen {\n display: block;\n margin: 10px auto;\n max-width: 100%;\n}\n\n.flavour-description {\n display: block;\n font-size: 16px;\n margin: 10px 0;\n\n & > p {\n margin: 10px 0;\n }\n}\n\n.report-accounts {\n display: flex;\n flex-wrap: wrap;\n margin-bottom: 20px;\n}\n\n.report-accounts__item {\n display: flex;\n flex: 250px;\n flex-direction: column;\n margin: 0 5px;\n\n & > strong {\n display: block;\n margin: 0 0 10px -5px;\n font-weight: 500;\n font-size: 14px;\n line-height: 18px;\n color: $secondary-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n .account-card {\n flex: 1 1 auto;\n }\n}\n\n.report-status,\n.account-status {\n display: flex;\n margin-bottom: 10px;\n\n .activity-stream {\n flex: 2 0 0;\n margin-right: 20px;\n max-width: calc(100% - 60px);\n\n .entry {\n border-radius: 4px;\n }\n }\n}\n\n.report-status__actions,\n.account-status__actions {\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n\n .icon-button {\n font-size: 24px;\n width: 24px;\n text-align: center;\n margin-bottom: 10px;\n }\n}\n\n.simple_form.new_report_note,\n.simple_form.new_account_moderation_note {\n max-width: 100%;\n}\n\n.batch-form-box {\n display: flex;\n flex-wrap: wrap;\n margin-bottom: 5px;\n\n #form_status_batch_action {\n margin: 0 5px 5px 0;\n font-size: 14px;\n }\n\n input.button {\n margin: 0 5px 5px 0;\n }\n\n .media-spoiler-toggle-buttons {\n margin-left: auto;\n\n .button {\n overflow: visible;\n margin: 0 0 5px 5px;\n float: right;\n }\n }\n}\n\n.back-link {\n margin-bottom: 10px;\n font-size: 14px;\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.spacer {\n flex: 1 1 auto;\n}\n\n.log-entry {\n line-height: 20px;\n padding: 15px 0;\n background: $ui-base-color;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n\n &:last-child {\n border-bottom: 0;\n }\n\n &__header {\n display: flex;\n justify-content: flex-start;\n align-items: center;\n color: $darker-text-color;\n font-size: 14px;\n padding: 0 10px;\n }\n\n &__avatar {\n margin-right: 10px;\n\n .avatar {\n display: block;\n margin: 0;\n border-radius: 50%;\n width: 40px;\n height: 40px;\n }\n }\n\n &__content {\n max-width: calc(100% - 90px);\n }\n\n &__title {\n word-wrap: break-word;\n }\n\n &__timestamp {\n color: $dark-text-color;\n }\n\n a,\n .username,\n .target {\n color: $secondary-text-color;\n text-decoration: none;\n font-weight: 500;\n }\n}\n\na.name-tag,\n.name-tag,\na.inline-name-tag,\n.inline-name-tag {\n text-decoration: none;\n color: $secondary-text-color;\n\n .username {\n font-weight: 500;\n }\n\n &.suspended {\n .username {\n text-decoration: line-through;\n color: lighten($error-red, 12%);\n }\n\n .avatar {\n filter: grayscale(100%);\n opacity: 0.8;\n }\n }\n}\n\na.name-tag,\n.name-tag {\n display: flex;\n align-items: center;\n\n .avatar {\n display: block;\n margin: 0;\n margin-right: 5px;\n border-radius: 50%;\n }\n\n &.suspended {\n .avatar {\n filter: grayscale(100%);\n opacity: 0.8;\n }\n }\n}\n\n.speech-bubble {\n margin-bottom: 20px;\n border-left: 4px solid $ui-highlight-color;\n\n &.positive {\n border-left-color: $success-green;\n }\n\n &.negative {\n border-left-color: lighten($error-red, 12%);\n }\n\n &.warning {\n border-left-color: $gold-star;\n }\n\n &__bubble {\n padding: 16px;\n padding-left: 14px;\n font-size: 15px;\n line-height: 20px;\n border-radius: 4px 4px 4px 0;\n position: relative;\n font-weight: 500;\n\n a {\n color: $darker-text-color;\n }\n }\n\n &__owner {\n padding: 8px;\n padding-left: 12px;\n }\n\n time {\n color: $dark-text-color;\n }\n}\n\n.report-card {\n background: $ui-base-color;\n border-radius: 4px;\n margin-bottom: 20px;\n\n &__profile {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 15px;\n\n .account {\n padding: 0;\n border: 0;\n\n &__avatar-wrapper {\n margin-left: 0;\n }\n }\n\n &__stats {\n flex: 0 0 auto;\n font-weight: 500;\n color: $darker-text-color;\n text-transform: uppercase;\n text-align: right;\n\n a {\n color: inherit;\n text-decoration: none;\n\n &:focus,\n &:hover,\n &:active {\n color: lighten($darker-text-color, 8%);\n }\n }\n\n .red {\n color: $error-value-color;\n }\n }\n }\n\n &__summary {\n &__item {\n display: flex;\n justify-content: flex-start;\n border-top: 1px solid darken($ui-base-color, 4%);\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n\n &__reported-by,\n &__assigned {\n padding: 15px;\n flex: 0 0 auto;\n box-sizing: border-box;\n width: 150px;\n color: $darker-text-color;\n\n &,\n .username {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n &__content {\n flex: 1 1 auto;\n max-width: calc(100% - 300px);\n\n &__icon {\n color: $dark-text-color;\n margin-right: 4px;\n font-weight: 500;\n }\n }\n\n &__content a {\n display: block;\n box-sizing: border-box;\n width: 100%;\n padding: 15px;\n text-decoration: none;\n color: $darker-text-color;\n }\n }\n }\n}\n\n.one-line {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.ellipsized-ip {\n display: inline-block;\n max-width: 120px;\n overflow: hidden;\n text-overflow: ellipsis;\n vertical-align: middle;\n}\n\n.admin-account-bio {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n margin-top: 20px;\n\n > div {\n box-sizing: border-box;\n padding: 0 5px;\n margin-bottom: 10px;\n flex: 1 0 50%;\n }\n\n .account__header__fields,\n .account__header__content {\n background: lighten($ui-base-color, 8%);\n border-radius: 4px;\n height: 100%;\n }\n\n .account__header__fields {\n margin: 0;\n border: 0;\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n\n .account__header__content {\n box-sizing: border-box;\n padding: 20px;\n color: $primary-text-color;\n }\n}\n\n.center-text {\n text-align: center;\n}\n\n.announcements-list {\n border: 1px solid lighten($ui-base-color, 4%);\n border-radius: 4px;\n\n &__item {\n padding: 15px 0;\n background: $ui-base-color;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n\n &__title {\n padding: 0 15px;\n display: block;\n font-weight: 500;\n font-size: 18px;\n line-height: 1.5;\n color: $secondary-text-color;\n text-decoration: none;\n margin-bottom: 10px;\n\n &:hover,\n &:focus,\n &:active {\n color: $primary-text-color;\n }\n }\n\n &__meta {\n padding: 0 15px;\n color: $dark-text-color;\n }\n\n &__action-bar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n &:last-child {\n border-bottom: 0;\n }\n }\n}\n","$emojis-requiring-outlines: '8ball' 'ant' 'back' 'black_circle' 'black_heart' 'black_large_square' 'black_medium_small_square' 'black_medium_square' 'black_nib' 'black_small_square' 'bomb' 'bowling' 'bust_in_silhouette' 'busts_in_silhouette' 'camera' 'camera_with_flash' 'clubs' 'copyright' 'curly_loop' 'currency_exchange' 'dark_sunglasses' 'eight_pointed_black_star' 'electric_plug' 'end' 'female-guard' 'film_projector' 'fried_egg' 'gorilla' 'guardsman' 'heavy_check_mark' 'heavy_division_sign' 'heavy_dollar_sign' 'heavy_minus_sign' 'heavy_multiplication_x' 'heavy_plus_sign' 'hocho' 'hole' 'joystick' 'kaaba' 'lower_left_ballpoint_pen' 'lower_left_fountain_pen' 'male-guard' 'microphone' 'mortar_board' 'movie_camera' 'musical_score' 'on' 'registered' 'soon' 'spades' 'speaking_head_in_silhouette' 'spider' 'telephone_receiver' 'tm' 'top' 'tophat' 'turkey' 'vhs' 'video_camera' 'video_game' 'water_buffalo' 'waving_black_flag' 'wavy_dash' !default;\n\n%emoji-outline {\n filter: drop-shadow(1px 1px 0 $primary-text-color) drop-shadow(-1px 1px 0 $primary-text-color) drop-shadow(1px -1px 0 $primary-text-color) drop-shadow(-1px -1px 0 $primary-text-color);\n}\n\n.emojione {\n @each $emoji in $emojis-requiring-outlines {\n &[title=':#{$emoji}:'] {\n @extend %emoji-outline;\n }\n }\n}\n\n.hicolor-privacy-icons {\n .status__visibility-icon.fa-globe,\n .composer--options--dropdown--content--item .fa-globe {\n color: #1976D2;\n }\n\n .status__visibility-icon.fa-unlock,\n .composer--options--dropdown--content--item .fa-unlock {\n color: #388E3C;\n }\n\n .status__visibility-icon.fa-lock,\n .composer--options--dropdown--content--item .fa-lock {\n color: #FFA000;\n }\n\n .status__visibility-icon.fa-envelope,\n .composer--options--dropdown--content--item .fa-envelope {\n color: #D32F2F;\n }\n}\n","body.rtl {\n direction: rtl;\n\n .column-header > button {\n text-align: right;\n padding-left: 0;\n padding-right: 15px;\n }\n\n .radio-button__input {\n margin-right: 0;\n margin-left: 10px;\n }\n\n .directory__card__bar .display-name {\n margin-left: 0;\n margin-right: 15px;\n }\n\n .display-name {\n text-align: right;\n }\n\n .notification__message {\n margin-left: 0;\n margin-right: 68px;\n }\n\n .drawer__inner__mastodon > img {\n transform: scaleX(-1);\n }\n\n .notification__favourite-icon-wrapper {\n left: auto;\n right: -26px;\n }\n\n .landing-page__logo {\n margin-right: 0;\n margin-left: 20px;\n }\n\n .landing-page .features-list .features-list__row .visual {\n margin-left: 0;\n margin-right: 15px;\n }\n\n .column-link__icon,\n .column-header__icon {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .compose-form .compose-form__buttons-wrapper .character-counter__wrapper {\n margin-right: 0;\n margin-left: 4px;\n }\n\n .composer--publisher {\n text-align: left;\n }\n\n .boost-modal__status-time,\n .favourite-modal__status-time {\n float: left;\n }\n\n .navigation-bar__profile {\n margin-left: 0;\n margin-right: 8px;\n }\n\n .search__input {\n padding-right: 10px;\n padding-left: 30px;\n }\n\n .search__icon .fa {\n right: auto;\n left: 10px;\n }\n\n .columns-area {\n direction: rtl;\n }\n\n .column-header__buttons {\n left: 0;\n right: auto;\n margin-left: 0;\n margin-right: -15px;\n }\n\n .column-inline-form .icon-button {\n margin-left: 0;\n margin-right: 5px;\n }\n\n .column-header__links .text-btn {\n margin-left: 10px;\n margin-right: 0;\n }\n\n .account__avatar-wrapper {\n float: right;\n }\n\n .column-header__back-button {\n padding-left: 5px;\n padding-right: 0;\n }\n\n .column-header__setting-arrows {\n float: left;\n }\n\n .setting-toggle__label {\n margin-left: 0;\n margin-right: 8px;\n }\n\n .setting-meta__label {\n float: left;\n }\n\n .status__avatar {\n margin-left: 10px;\n margin-right: 0;\n\n // Those are used for public pages\n left: auto;\n right: 10px;\n }\n\n .activity-stream .status.light {\n padding-left: 10px;\n padding-right: 68px;\n }\n\n .status__info .status__display-name,\n .activity-stream .status.light .status__display-name {\n padding-left: 25px;\n padding-right: 0;\n }\n\n .activity-stream .pre-header {\n padding-right: 68px;\n padding-left: 0;\n }\n\n .status__prepend {\n margin-left: 0;\n margin-right: 58px;\n }\n\n .status__prepend-icon-wrapper {\n left: auto;\n right: -26px;\n }\n\n .activity-stream .pre-header .pre-header__icon {\n left: auto;\n right: 42px;\n }\n\n .account__avatar-overlay-overlay {\n right: auto;\n left: 0;\n }\n\n .column-back-button--slim-button {\n right: auto;\n left: 0;\n }\n\n .status__relative-time,\n .activity-stream .status.light .status__header .status__meta {\n float: left;\n text-align: left;\n }\n\n .status__action-bar {\n &__counter {\n margin-right: 0;\n margin-left: 11px;\n\n .status__action-bar-button {\n margin-right: 0;\n margin-left: 4px;\n }\n }\n }\n\n .status__action-bar-button {\n float: right;\n margin-right: 0;\n margin-left: 18px;\n }\n\n .status__action-bar-dropdown {\n float: right;\n }\n\n .privacy-dropdown__dropdown {\n margin-left: 0;\n margin-right: 40px;\n }\n\n .privacy-dropdown__option__icon {\n margin-left: 10px;\n margin-right: 0;\n }\n\n .detailed-status__display-name .display-name {\n text-align: right;\n }\n\n .detailed-status__display-avatar {\n margin-right: 0;\n margin-left: 10px;\n float: right;\n }\n\n .detailed-status__favorites,\n .detailed-status__reblogs {\n margin-left: 0;\n margin-right: 6px;\n }\n\n .fa-ul {\n margin-left: 2.14285714em;\n }\n\n .fa-li {\n left: auto;\n right: -2.14285714em;\n }\n\n .admin-wrapper {\n direction: rtl;\n }\n\n .admin-wrapper .sidebar ul a i.fa,\n a.table-action-link i.fa {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .simple_form .check_boxes .checkbox label {\n padding-left: 0;\n padding-right: 25px;\n }\n\n .simple_form .input.with_label.boolean label.checkbox {\n padding-left: 25px;\n padding-right: 0;\n }\n\n .simple_form .check_boxes .checkbox input[type=\"checkbox\"],\n .simple_form .input.boolean input[type=\"checkbox\"] {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.radio_buttons .radio {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.radio_buttons .radio > label {\n padding-right: 28px;\n padding-left: 0;\n }\n\n .simple_form .input-with-append .input input {\n padding-left: 142px;\n padding-right: 0;\n }\n\n .simple_form .input.boolean label.checkbox {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.boolean .label_input,\n .simple_form .input.boolean .hint {\n padding-left: 0;\n padding-right: 28px;\n }\n\n .simple_form .label_input__append {\n right: auto;\n left: 3px;\n\n &::after {\n right: auto;\n left: 0;\n background-image: linear-gradient(to left, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));\n }\n }\n\n .simple_form select {\n background: darken($ui-base-color, 10%) url(\"data:image/svg+xml;utf8,\") no-repeat left 8px center / auto 16px;\n }\n\n .table th,\n .table td {\n text-align: right;\n }\n\n .filters .filter-subset {\n margin-right: 0;\n margin-left: 45px;\n }\n\n .landing-page .header-wrapper .mascot {\n right: 60px;\n left: auto;\n }\n\n .landing-page__call-to-action .row__information-board {\n direction: rtl;\n }\n\n .landing-page .header .hero .floats .float-1 {\n left: -120px;\n right: auto;\n }\n\n .landing-page .header .hero .floats .float-2 {\n left: 210px;\n right: auto;\n }\n\n .landing-page .header .hero .floats .float-3 {\n left: 110px;\n right: auto;\n }\n\n .landing-page .header .links .brand img {\n left: 0;\n }\n\n .landing-page .fa-external-link {\n padding-right: 5px;\n padding-left: 0 !important;\n }\n\n .landing-page .features #mastodon-timeline {\n margin-right: 0;\n margin-left: 30px;\n }\n\n @media screen and (min-width: 631px) {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n\n &:first-child {\n padding-left: 5px;\n padding-right: 10px;\n }\n }\n\n .columns-area > div {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n }\n }\n }\n\n .columns-area--mobile .column,\n .columns-area--mobile .drawer {\n padding-left: 0;\n padding-right: 0;\n }\n\n .public-layout {\n .header {\n .nav-button {\n margin-left: 8px;\n margin-right: 0;\n }\n }\n\n .public-account-header__tabs {\n margin-left: 0;\n margin-right: 20px;\n }\n }\n\n .landing-page__information {\n .account__display-name {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .account__avatar-wrapper {\n margin-left: 12px;\n margin-right: 0;\n }\n }\n\n .card__bar .display-name {\n margin-left: 0;\n margin-right: 15px;\n text-align: right;\n }\n\n .fa-chevron-left::before {\n content: \"\\F054\";\n }\n\n .fa-chevron-right::before {\n content: \"\\F053\";\n }\n\n .column-back-button__icon {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .column-header__setting-arrows .column-header__setting-btn:last-child {\n padding-left: 0;\n padding-right: 10px;\n }\n\n .simple_form .input.radio_buttons .radio > label input {\n left: auto;\n right: 0;\n }\n}\n",".dashboard__counters {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n margin-bottom: 20px;\n\n & > div {\n box-sizing: border-box;\n flex: 0 0 33.333%;\n padding: 0 5px;\n margin-bottom: 10px;\n\n & > div,\n & > a {\n padding: 20px;\n background: lighten($ui-base-color, 4%);\n border-radius: 4px;\n box-sizing: border-box;\n height: 100%;\n }\n\n & > a {\n text-decoration: none;\n color: inherit;\n display: block;\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 8%);\n }\n }\n }\n\n &__num,\n &__text {\n text-align: center;\n font-weight: 500;\n font-size: 24px;\n line-height: 21px;\n color: $primary-text-color;\n font-family: $font-display, sans-serif;\n margin-bottom: 20px;\n line-height: 30px;\n }\n\n &__text {\n font-size: 18px;\n }\n\n &__label {\n font-size: 14px;\n color: $darker-text-color;\n text-align: center;\n font-weight: 500;\n }\n}\n\n.dashboard__widgets {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n\n & > div {\n flex: 0 0 33.333%;\n margin-bottom: 20px;\n\n & > div {\n padding: 0 5px;\n }\n }\n\n a:not(.name-tag) {\n color: $ui-secondary-color;\n font-weight: 500;\n text-decoration: none;\n }\n}\n","// Notes!\n// Sass color functions, \"darken\" and \"lighten\" are automatically replaced.\n\n.glitch.local-settings {\n background: $ui-base-color;\n\n &__navigation {\n background: darken($ui-base-color, 8%);\n }\n\n &__navigation__item {\n background: darken($ui-base-color, 8%);\n\n &:hover {\n background: $ui-base-color;\n }\n }\n}\n\n.notification__dismiss-overlay {\n .wrappy {\n box-shadow: unset;\n }\n\n .ckbox {\n text-shadow: unset;\n }\n}\n\n.status.status-direct:not(.read) {\n background: darken($ui-base-color, 8%);\n border-bottom-color: darken($ui-base-color, 12%);\n\n &.collapsed> .status__content:after {\n background: linear-gradient(rgba(darken($ui-base-color, 8%), 0), rgba(darken($ui-base-color, 8%), 1));\n }\n}\n\n.focusable:focus.status.status-direct:not(.read) {\n background: darken($ui-base-color, 4%);\n\n &.collapsed> .status__content:after {\n background: linear-gradient(rgba(darken($ui-base-color, 4%), 0), rgba(darken($ui-base-color, 4%), 1));\n }\n}\n\n// Change columns' default background colors\n.column {\n > .scrollable {\n background: darken($ui-base-color, 13%);\n }\n}\n\n.status.collapsed .status__content:after {\n background: linear-gradient(rgba(darken($ui-base-color, 13%), 0), rgba(darken($ui-base-color, 13%), 1));\n}\n\n.drawer__inner {\n background: $ui-base-color;\n}\n\n.drawer__inner__mastodon {\n background: $ui-base-color url('data:image/svg+xml;utf8,') no-repeat bottom / 100% auto !important;\n\n .mastodon {\n filter: contrast(75%) brightness(75%) !important;\n }\n}\n\n// Change the default appearance of the content warning button\n.status__content {\n\n .status__content__spoiler-link {\n\n background: lighten($ui-base-color, 30%);\n\n &:hover {\n background: lighten($ui-base-color, 35%);\n text-decoration: none;\n }\n\n }\n\n}\n\n// Change the background colors of media and video spoilers\n.media-spoiler,\n.video-player__spoiler,\n.account-gallery__item a {\n background: $ui-base-color;\n}\n\n// Change the colors used in the dropdown menu\n.dropdown-menu {\n background: $ui-base-color;\n}\n\n.dropdown-menu__arrow {\n\n &.left {\n border-left-color: $ui-base-color;\n }\n\n &.top {\n border-top-color: $ui-base-color;\n }\n\n &.bottom {\n border-bottom-color: $ui-base-color;\n }\n\n &.right {\n border-right-color: $ui-base-color;\n }\n\n}\n\n.dropdown-menu__item {\n a {\n background: $ui-base-color;\n color: $ui-secondary-color;\n }\n}\n\n// Change the default color of several parts of the compose form\n.composer {\n\n .composer--spoiler input, .compose-form__autosuggest-wrapper textarea {\n color: lighten($ui-base-color, 80%);\n\n &:disabled { background: lighten($simple-background-color, 10%) }\n\n &::placeholder {\n color: lighten($ui-base-color, 70%);\n }\n }\n\n .composer--options-wrapper {\n background: lighten($ui-base-color, 10%);\n }\n\n .composer--options > hr {\n display: none;\n }\n\n .composer--options--dropdown--content--item {\n color: $ui-primary-color;\n \n strong {\n color: $ui-primary-color;\n }\n\n }\n\n}\n\n.composer--upload_form--actions .icon-button {\n color: lighten($white, 7%);\n\n &:active,\n &:focus,\n &:hover {\n color: $white;\n }\n}\n\n.composer--upload_form--item > div input {\n color: lighten($white, 7%);\n\n &::placeholder {\n color: lighten($white, 10%);\n }\n}\n\n.dropdown-menu__separator {\n border-bottom-color: lighten($ui-base-color, 12%);\n}\n\n.status__content,\n.reply-indicator__content {\n a {\n color: $highlight-text-color;\n }\n}\n\n.emoji-mart-bar {\n border-color: darken($ui-base-color, 4%);\n\n &:first-child {\n background: lighten($ui-base-color, 10%);\n }\n}\n\n.emoji-mart-search input {\n background: rgba($ui-base-color, 0.3);\n border-color: $ui-base-color;\n}\n\n.autosuggest-textarea__suggestions {\n background: lighten($ui-base-color, 10%)\n}\n\n.autosuggest-textarea__suggestions__item {\n &:hover,\n &:focus,\n &:active,\n &.selected {\n background: darken($ui-base-color, 4%);\n }\n}\n\n.react-toggle-track {\n background: $ui-secondary-color;\n}\n\n.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track {\n background: lighten($ui-secondary-color, 10%);\n}\n\n.react-toggle.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track {\n background: darken($ui-highlight-color, 10%);\n}\n\n// Change the background colors of modals\n.actions-modal,\n.boost-modal,\n.confirmation-modal,\n.mute-modal,\n.block-modal,\n.report-modal,\n.embed-modal,\n.error-modal,\n.onboarding-modal,\n.report-modal__comment .setting-text__wrapper,\n.report-modal__comment .setting-text {\n background: $white;\n border: 1px solid lighten($ui-base-color, 8%);\n}\n\n.report-modal__comment {\n border-right-color: lighten($ui-base-color, 8%);\n}\n\n.report-modal__container {\n border-top-color: lighten($ui-base-color, 8%);\n}\n\n.boost-modal__action-bar,\n.confirmation-modal__action-bar,\n.mute-modal__action-bar,\n.block-modal__action-bar,\n.onboarding-modal__paginator,\n.error-modal__footer {\n background: darken($ui-base-color, 6%);\n\n .onboarding-modal__nav,\n .error-modal__nav {\n &:hover,\n &:focus,\n &:active {\n background-color: darken($ui-base-color, 12%);\n }\n }\n}\n\n// Change the default color used for the text in an empty column or on the error column\n.empty-column-indicator,\n.error-column {\n color: lighten($ui-base-color, 60%);\n}\n\n// Change the default colors used on some parts of the profile pages\n.activity-stream-tabs {\n\n background: $account-background-color;\n\n a {\n &.active {\n color: $ui-primary-color;\n }\n }\n\n}\n\n.activity-stream {\n\n .entry {\n background: $account-background-color;\n }\n\n .status.light {\n\n .status__content {\n color: $primary-text-color;\n }\n\n .display-name {\n strong {\n color: $primary-text-color;\n }\n }\n\n }\n\n}\n\n.accounts-grid {\n .account-grid-card {\n\n .controls {\n .icon-button {\n color: $ui-secondary-color;\n }\n }\n\n .name {\n a {\n color: $primary-text-color;\n }\n }\n\n .username {\n color: $ui-secondary-color;\n }\n\n .account__header__content {\n color: $primary-text-color;\n }\n\n }\n}\n\n.button.logo-button {\n color: $white;\n\n svg {\n fill: $white;\n }\n}\n\n.public-layout {\n .header,\n .public-account-header,\n .public-account-bio {\n box-shadow: none;\n }\n\n .header {\n background: lighten($ui-base-color, 12%);\n }\n\n .public-account-header {\n &__image {\n background: lighten($ui-base-color, 12%);\n\n &::after {\n box-shadow: none;\n }\n }\n\n &__tabs {\n &__name {\n h1,\n h1 small {\n color: $white;\n }\n }\n }\n }\n}\n\n.account__section-headline a.active::after {\n border-color: transparent transparent $white;\n}\n\n.hero-widget,\n.box-widget,\n.contact-widget,\n.landing-page__information.contact-widget,\n.moved-account-widget,\n.memoriam-widget,\n.activity-stream,\n.nothing-here,\n.directory__tag > a,\n.directory__tag > div {\n box-shadow: none;\n}\n\n.audio-player .video-player__controls button,\n.audio-player .video-player__time-sep,\n.audio-player .video-player__time-current,\n.audio-player .video-player__time-total {\n color: $primary-text-color;\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/packs/skins/glitch/mastodon-light/common.js b/priv/static/packs/skins/glitch/mastodon-light/common.js index ba27beac9..0477e20b0 100644 Binary files a/priv/static/packs/skins/glitch/mastodon-light/common.js and b/priv/static/packs/skins/glitch/mastodon-light/common.js differ diff --git a/priv/static/packs/skins/vanilla/contrast/common.css b/priv/static/packs/skins/vanilla/contrast/common.css index fe14d9031..166981fe7 100644 Binary files a/priv/static/packs/skins/vanilla/contrast/common.css and b/priv/static/packs/skins/vanilla/contrast/common.css differ diff --git a/priv/static/packs/skins/vanilla/contrast/common.css.map b/priv/static/packs/skins/vanilla/contrast/common.css.map index 9db5f296a..55ba6a017 100644 --- a/priv/static/packs/skins/vanilla/contrast/common.css.map +++ b/priv/static/packs/skins/vanilla/contrast/common.css.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///common.scss","webpack:///./app/javascript/styles/mastodon/reset.scss","webpack:///./app/javascript/styles/contrast/variables.scss","webpack:///./app/javascript/styles/mastodon/basics.scss","webpack:///./app/javascript/styles/mastodon/variables.scss","webpack:///./app/javascript/styles/mastodon/containers.scss","webpack:///./app/javascript/styles/mastodon/lists.scss","webpack:///./app/javascript/styles/mastodon/footer.scss","webpack:///./app/javascript/styles/mastodon/compact_header.scss","webpack:///./app/javascript/styles/mastodon/widgets.scss","webpack:///./app/javascript/styles/mastodon/forms.scss","webpack:///./app/javascript/styles/mastodon/accounts.scss","webpack:///./app/javascript/styles/mastodon/statuses.scss","webpack:///./app/javascript/styles/mastodon/boost.scss","webpack:///./app/javascript/styles/mastodon/components.scss","webpack:///","webpack:///./app/javascript/styles/mastodon/_mixins.scss","webpack:///./app/javascript/styles/mastodon/polls.scss","webpack:///./app/javascript/styles/mastodon/modal.scss","webpack:///./app/javascript/styles/mastodon/emoji_picker.scss","webpack:///./app/javascript/styles/mastodon/about.scss","webpack:///./app/javascript/styles/mastodon/tables.scss","webpack:///./app/javascript/styles/mastodon/admin.scss","webpack:///./app/javascript/styles/mastodon/dashboard.scss","webpack:///./app/javascript/styles/mastodon/rtl.scss","webpack:///./app/javascript/styles/mastodon/accessibility.scss","webpack:///./app/javascript/styles/contrast/diff.scss"],"names":[],"mappings":"AAAA,2ZCKA,QAaE,UACA,SACA,eACA,aACA,wBACA,+EAIF,aAEE,MAGF,aACE,OAGF,eACE,cAGF,WACE,qDAGF,UAEE,aACA,OAGF,wBACE,iBACA,MAGF,sCACE,qBAGF,UACE,YACA,2BAGF,kBACE,cACA,mBACA,iCAGF,kBACE,kCAGF,kBACE,2BAGF,aACE,gBACA,0BACA,CC9EmB,iEDqFrB,kBCrFqB,4BDyFrB,sBACE,MErFF,iDACE,mBACA,eACA,iBACA,gBACA,WCXM,kCDaN,6BACA,8BACA,CADA,0BACA,CADA,yBACA,CADA,qBACA,0CACA,wCACA,kBAEA,iKAYE,eAGF,SACE,oCAEA,WACE,iBACA,kBACA,uCAGF,iBACE,WACA,YACA,mCAGF,iBACE,cAIJ,kBDrDmB,kBCyDnB,iBACE,kBACA,0BAEA,iBACE,aAIJ,iBACE,YAGF,kBACE,SACA,iBACA,uBAEA,iBACE,WACA,YACA,gBACA,YAIJ,kBACE,UACA,YAGF,iBACE,kBACA,cD9EgB,mBAZC,WC6FjB,YACA,UACA,aACA,uBACA,mBACA,oBAEA,qBACE,YACA,sCAGE,aACE,gBACA,WACA,YACA,kBACA,uBAIJ,cACE,iBACA,gBACA,QAMR,mBACE,eACA,cAEA,YACE,kDAKF,YAGE,WACA,mBACA,uBACA,oBACA,sBAGF,YACE,yEAKF,gBAEE,+EAKF,WAEE,sCAIJ,qBAEE,eACA,gBACA,gBACA,cACA,kBACA,8CAEA,eACE,0CAGF,mBACE,gEAEA,eACE,0CAIJ,aDpLwB,kKCuLtB,oBAGE,sDAIJ,aDpLgB,eCsLd,0DAEA,aDxLc,oDC6LhB,cACE,SACA,uBACA,cDhMc,aCkMd,UACA,SACA,oBACA,eACA,UACA,4BACA,0BACA,gMAEA,oBAGE,kEAGF,aC9NY,gBDgOV,gBEnON,WACE,CACA,kBACA,qCAEA,eALF,UAMI,SACA,kBAIJ,sBACE,qCAEA,gBAHF,kBAII,qBAGF,YACE,uBACA,mBACA,wBAEA,SDrBI,YCuBF,kBACA,sBAGF,YACE,uBACA,mBACA,WD9BE,qBCgCF,UACA,kBACA,iBACA,6CACA,gBACA,eACA,mCAMJ,WACE,CACA,cACA,mBACA,sBACA,qCAEA,kCAPF,UAQI,aACA,aACA,kBAKN,WACE,CACA,YACA,eACA,iBACA,sBACA,CACA,gBACA,CACA,sBACA,qCAEA,gBAZF,UAaI,CACA,eACA,CACA,mBACA,0BAGF,UACE,YACA,iBACA,6BAEA,UACE,YACA,cACA,SACA,kBACA,uBAIJ,aACE,cH/EmB,wBGiFnB,iCAEA,aACE,gBACA,uBACA,gBACA,8BAIJ,aACE,eACA,iBACA,gBACA,SAIJ,YACE,cACA,8BACA,sBACA,mCACA,CADA,0BACA,mBAEA,eACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,eACE,WACA,qCAGF,QA3BF,UA4BI,qCACA,mBAEA,aACE,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,UAKN,YACE,cACA,8CACA,sBACA,mCACA,CADA,0BACA,mBAEA,eACE,WACA,mBAGF,eACE,WACA,mBAGF,aACE,WACA,mBAGF,eACE,WACA,mBAGF,aACE,WACA,uCAGF,eACE,wBAGF,kBACE,qCAGF,QAxCF,iDAyCI,uCAEA,YACE,aACA,mBACA,uBACA,iCAGF,UACE,uBACA,mBACA,sBAGF,YACE,sCAIJ,QA7DF,UA8DI,qCACA,mBAEA,aACE,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,sCAMJ,eADF,gBAEI,4BAGF,eACE,qCAEA,0BAHF,SAII,yBAIJ,kBACE,mCACA,kBACA,YACA,cACA,aACA,oBACA,uBACA,iBACA,gBACA,qCAEA,uBAZF,cAaI,WACA,MACA,OACA,SACA,gBACA,gBACA,YACA,6BAGF,cACE,eACA,kCAGF,YACE,oBACA,2BACA,iBACA,oCAGF,YACE,oBACA,uBACA,iBACA,mCAGF,YACE,oBACA,yBACA,iBACA,+BAGF,aACE,aACA,mCAEA,aACE,YACA,WACA,kBACA,YACA,UDxUA,qCC2UA,kCARF,WASI,+GAIJ,kBAGE,kCAIJ,YACE,mBACA,eACA,eACA,gBACA,qBACA,cHhVc,mBGkVd,kBACA,uHAEA,yBAGE,WDrWA,qCCyWF,0CACE,YACE,qCAKN,kBACE,CACA,oBACA,kBACA,6HAEA,oBAGE,mBACA,sBAON,YACE,cACA,0DACA,sBACA,mCACA,CADA,0BACA,gCAEA,UACE,cACA,gCAGF,UACE,cACA,qCAGF,qBAjBF,0BAkBI,WACA,gCAEA,YACE,kCAKN,iBACE,qCAEA,gCAHF,eAII,sCAKF,4BADF,eAEI,wCAIJ,eACE,mBACA,mCACA,gDAEA,UACE,qIAEA,8BAEE,CAFF,sBAEE,6DAGF,wBHxaiB,8CG6anB,yBACE,gBACA,aACA,kBACA,mBACA,oDAEA,UACE,cACA,kBACA,WACA,YACA,gDACA,MACA,OACA,kDAGF,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,0BACA,qCAGF,6CA3BF,YA4BI,gDAIJ,eACE,6JAEA,iBAEE,qCAEA,4JAJF,eAKI,sCAKN,sCA/DF,eAgEI,gBACA,oDAEA,YACE,+FAGF,eAEE,6CAIJ,iBACE,iBACA,aACA,2BACA,mDAEA,UACE,cACA,mBACA,kBACA,SACA,OACA,QACA,YACA,0BACA,WACA,oDAGF,aACE,YACA,aACA,kBACA,cACA,wDAEA,aACE,WACA,YACA,SACA,kBACA,yBACA,mBACA,qCAIJ,2CArCF,YAsCI,mBACA,0BACA,YACA,mDAEA,YACE,oDAGF,UACE,YACA,CACA,sBACA,wDAEA,QACE,kBACA,2DAGF,mDAXF,YAYI,sCAKN,2CAhEF,eAiEI,sCAGF,2CApEF,cAqEI,8CAIJ,aACE,iBACA,mDAEA,gBACE,mBACA,sDAEA,cACE,iBACA,WD1kBF,gBC4kBE,gBACA,mBACA,uBACA,6BACA,4DAEA,aACE,eACA,WDplBJ,gBCslBI,gBACA,uBACA,qCAKN,4CA7BF,gBA8BI,aACA,8BACA,mBACA,mDAEA,aACE,iBACA,sDAEA,cACE,iBACA,iBACA,4DAEA,aH/lBQ,oDGsmBd,YACE,2BACA,oBACA,YACA,qEAEA,YACE,mBACA,gBACA,qCAGF,oEACE,YACE,6DAIJ,eACE,sBACA,cACA,cH3nBU,aG6nBV,+BACA,eACA,kBACA,kBACA,8DAEA,aACE,uEAGF,cACE,kEAGF,aACE,WACA,kBACA,SACA,OACA,WACA,gCACA,WACA,wBACA,yEAIA,+BACE,UACA,kFAGF,2BH3pBW,wEGiqBX,SACE,wBACA,8DAIJ,oBACE,cACA,2EAGF,cACE,cACA,4EAGF,eACE,eACA,kBACA,WDnsBJ,6CCqsBI,2DAIJ,aACE,WACA,4DAGF,eACE,8CAKN,YACE,eACA,kEAEA,eACE,gBACA,uBACA,cACA,2FAEA,4BACE,yEAGF,YACE,qDAIJ,gBACE,eACA,cH5tBY,uDG+tBZ,oBACE,cHhuBU,qBGkuBV,aACA,gBACA,8DAEA,eACE,WDpvBJ,qCC0vBF,6CAtCF,aAuCI,UACA,4CAKN,yBACE,qCAEA,0CAHF,eAII,wCAIJ,eACE,oCAGF,kBACE,mCACA,kBACA,gBACA,mBACA,qCAEA,mCAPF,eAQI,gBACA,gBACA,8DAGF,QACE,aACA,+DAEA,aACE,sFAGF,uBACE,yEAGF,aDryBU,8DC2yBV,mBACA,WD7yBE,qFCizBJ,YAEE,eACA,cHvyBc,2CG2yBhB,gBACE,iCAIJ,YACE,cACA,kDACA,qCAEA,gCALF,aAMI,+CAGF,cACE,iCAIJ,eACE,2BAGF,YACE,eACA,eACA,cACA,+BAEA,qBACE,cACA,YACA,cACA,mBACA,kBACA,qCAEA,8BARF,aASI,sCAGF,8BAZF,cAaI,sCAIJ,0BAvBF,QAwBI,6BACA,+BAEA,UACE,UACA,gBACA,gCACA,0CAEA,eACE,0CAGF,kBHn3Ba,+IGs3BX,kBAGE,WC53BZ,eACE,aAEA,oBACE,aACA,iBAIJ,eACE,cACA,oBAEA,cACE,gBACA,mBACA,wBCfF,eACE,iBACA,oBACA,eACA,cACA,qCAEA,uBAPF,iBAQI,mBACA,+BAGF,YACE,cACA,0CACA,wCAEA,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,kBACA,6CAEA,aACE,wCAIJ,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,qCAGF,6BAxCF,iCAyCI,+EAEA,aAEE,wCAGF,UACE,wCAGF,aACE,+EAGF,aAEE,wCAGF,UACE,sCAIJ,uCACE,aACE,sCAIJ,4JACE,YAIE,4BAKN,eACE,kBACA,cLlFc,6BKqFd,aACE,qBACA,6BAIJ,oBACE,cACA,wGAEA,yBAGE,mCAKF,aACE,YACA,WACA,cACA,aACA,0HAMA,YACE,oBCjIR,cACE,iBACA,cNYgB,gBMVhB,mBACA,eACA,qBACA,qCAEA,mBATF,iBAUI,oBACA,uBAGF,aACE,qBACA,0BAGF,eACE,cNJiB,wBMQnB,oBACE,mBACA,kBACA,WACA,YACA,cC9BN,kBACE,mCACA,mBAEA,UACE,kBACA,gBACA,0BACA,gBLPI,uBKUJ,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,0BACA,oBAIJ,kBPlBmB,aOoBjB,0BACA,eACA,cPVgB,iBOYhB,qBACA,gBACA,8BAEA,UACE,YACA,gBACA,sBAGF,kBACE,iCAEA,eACE,uBAIJ,cACE,SACA,UACA,gBACA,uBACA,oBACA,kBACA,oBACA,cACA,sBAGF,aPxCmB,qBO0CjB,4BAEA,yBACE,qCAKN,aAnEF,YAoEI,uBAIJ,kBACE,oBACA,yBAEA,YACE,gBACA,eACA,cPhEgB,+BOoElB,cACE,0CAEA,eACE,sDAGF,YACE,mBACA,gDAGF,UACE,YACA,0BACA,oCAIJ,YACE,mBAKF,aP7FkB,aOkGpB,YACE,kBACA,mBPhHmB,mCOkHnB,qBAGF,YACE,kBACA,0BACA,kBACA,cP7GkB,mBO+GlB,iBAGF,eACE,eACA,cPpHkB,iBOsHlB,qBACA,gBACA,UACA,oBAEA,YACE,gBACA,eACA,cP9HgB,0BOkIlB,eACE,CACA,kBACA,mBAGF,oBACE,CACA,mBACA,cP3IgB,qBO6IhB,mBACA,gBACA,uBACA,0EAEA,yBAGE,uBAMJ,sBACA,kBACA,mBPzKmB,mCO2KnB,cP7JqB,gBO+JrB,mBACA,sDAEA,eAEE,CAII,qXADF,eACE,yBAKN,aACE,0BACA,CAMI,wLAGF,oBAGE,mIAEA,yBACE,gCAMR,kBACE,oCAEA,gBACE,cP1Mc,8DOgNhB,iBACE,eACA,4DAGF,eACE,qBACA,iEAEA,eACE,kBAMR,YACE,CACA,eLhPM,CKkPN,cACA,cPrOkB,mBOuOlB,+BANA,iBACA,CLhPM,kCK8PN,CATA,aAGF,kBACE,CAEA,iBACA,kBACA,cACA,iBAEA,UL/PM,eKiQJ,gBACA,gBACA,mBACA,gBAGF,cACE,cP3PgB,qCO+PlB,aArBF,YAsBI,mBACA,iBAEA,cACE,aAKN,kBPrRqB,kBOuRnB,mCACA,iBAEA,qBACE,mBACA,uCAEA,YAEE,mBACA,8BACA,mBPlSe,kBOoSf,aACA,qBACA,cACA,mCACA,0EAIA,kBAGE,0BAIJ,kBPzSiB,eO2Sf,8BAGF,UACE,eACA,oBAGF,aACE,eACA,gBACA,WLjUE,mBKmUF,gBACA,uBACA,wBAEA,aP1Tc,0BO8Td,aACE,gBACA,eACA,eACA,cPlUY,0IOwUd,ULrVE,+BK6VJ,aACE,YACA,uDAGF,oBPvViB,wCO2VjB,eACE,eAKN,YACE,yBACA,gCAEA,aACE,WACA,YACA,kBACA,kBACA,kBACA,mBACA,yBACA,4CAEA,SACE,6CAGF,SACE,6CAGF,SACE,iBAKN,UACE,0BAEA,SACE,SACA,wBAGF,eACE,0BAGF,iBACE,cPxYgB,gBO0YhB,aACA,sCAEA,eACE,0BAIJ,cACE,sBACA,gCACA,wCAGF,eACE,wBAGF,WACE,kBACA,eACA,gBACA,WL7aI,8BKgbJ,aACE,cPpac,gBOsad,eACA,0BAIJ,SACE,iCACA,qCAGF,kCACE,YACE,sCAYJ,qIAPF,eAQI,gBACA,gBACA,iBAOJ,gBACE,qCAEA,eAHF,oBAII,uBAGF,sBACE,sCAEA,qBAHF,sBAII,sCAGF,qBAPF,UAQI,sCAGF,qBAXF,WAYI,kCAIJ,iBACE,qCAEA,gCAHF,4BAII,iEAIA,eACE,0DAGF,cACE,iBACA,oEAEA,UACE,YACA,gBACA,yFAGF,gBACE,SACA,mKAIJ,eAGE,gBAON,aPrgBkB,iCOogBpB,kBAKI,6BAEA,eACE,kBAIJ,cACE,iBACA,wCAMF,oBACE,gBACA,cP5hBiB,4JO+hBjB,yBAGE,oBAKN,kBACE,gBACA,eACA,kBACA,yBAEA,aACE,gBACA,aACA,CACA,kBACA,gBACA,uBACA,qBACA,WLhkBI,gCKkkBJ,4FAEA,yBAGE,oCAIJ,eACE,0BAGF,iBACE,gCACA,MCjlBJ,+CACE,gBACA,iBAGF,eACE,aACA,cACA,qBAIA,kBACE,gBACA,4BAEA,QACE,0CAIA,kBACE,qDAEA,eACE,gDAIJ,iBACE,kBACA,sDAEA,iBACE,SACA,OACA,6BAKN,iBACE,gBACA,gDAEA,mBACE,eACA,gBACA,WNhDA,cMkDA,WACA,4EAGF,iBAEE,mDAGF,eACE,4CAGF,iBACE,QACA,OACA,qCAGF,aRjEoB,0BQmElB,gIAEA,oBAGE,0CAIJ,iBACE,CACA,iBACA,mBAKN,YACE,cACA,0BAEA,qBACE,cACA,UACA,cACA,oBAIJ,aRvFkB,sBQ0FhB,aRnGsB,yBQuGtB,iBACE,kBACA,mBACA,uBAGF,eACE,iBACA,sBAIJ,kBACE,wBAGF,aACE,eACA,eACA,qBAGF,kBACE,cRrHgB,iCQwHhB,iBACE,eACA,iBACA,gBACA,gBACA,oBAIJ,kBACE,qBAGF,eACE,CAII,0JADF,eACE,sDAMJ,YACE,4DAEA,mBACE,eACA,WNlKA,gBMoKA,gBACA,cACA,wHAGF,aAEE,sDAIJ,cACE,kBACA,mDAKF,mBACE,eACA,WNxLE,cM0LF,kBACA,qBACA,gBACA,sCAGF,cACE,mCAGF,UACE,sCAIJ,cACE,4CAEA,mBACE,eACA,WN9ME,cMgNF,gBACA,gBACA,4CAGF,kBACE,yCAGF,cACE,CADF,cACE,6BAIJ,oBACE,cACA,4BAGF,kBACE,8CAEA,eACE,0BAIJ,YACE,CACA,eACA,oBACA,iCAEA,cACE,kCAGF,qBACE,eACA,cACA,eACA,oCAEA,aACE,2CAGF,eACE,6GAIJ,eAEE,qCAGF,yBA9BF,aA+BI,gBACA,kCAEA,cACE,0JAGF,kBAGE,iDAKN,iBACE,oBACA,eACA,WN5RI,cM8RJ,WACA,2CAKE,mBACE,eACA,WNtSA,qBMwSA,WACA,kBACA,gBACA,kBACA,cACA,0DAGF,iBACE,OACA,QACA,SACA,kDAKN,cACE,aACA,yBACA,kBACA,sJAGF,qBAKE,eACA,WNtUI,cMwUJ,WACA,UACA,oBACA,gBACA,mBACA,yBACA,kBACA,aACA,6RAEA,aACE,CAHF,+OAEA,aACE,CAHF,mQAEA,aACE,CAHF,wQAEA,aACE,CAHF,sNAEA,aACE,8LAGF,eACE,oVAGF,oBACE,iOAGF,oBN7VY,oLMiWZ,iBACE,4WAGF,oBRlWsB,mBQqWpB,6CAKF,aACE,gUAGF,oBAME,8CAGF,aACE,gBACA,cACA,eACA,8BAIJ,UACE,uBAGF,eACE,aACA,oCAEA,YACE,mBACA,qEAIJ,aAGE,WACA,SACA,kBACA,mBR5YiB,WEXb,eM0ZJ,oBACA,YACA,aACA,qBACA,kBACA,sBACA,eACA,gBACA,UACA,mBACA,kBACA,sGAEA,cACE,uFAGF,wBACE,gLAGF,wBAEE,kHAGF,wBRlboB,gGQsbpB,kBNtbQ,kHMybN,wBACE,sOAGF,wBAEE,qBAKN,uBACE,CADF,oBACE,CADF,eACE,sBACA,eACA,WNzcI,cM2cJ,WACA,UACA,oBACA,gBACA,wXACA,yBACA,kBACA,kBACA,mBACA,YACA,iBAGF,4BACE,oCAIA,iBACE,mCAGF,iBACE,UACA,QACA,CACA,qBACA,eACA,cRzdY,oBQ2dZ,oBACA,eACA,gBACA,mBACA,gBACA,yCAEA,UACE,cACA,kBACA,MACA,QACA,WACA,UACA,iEACA,4BAKN,iBACE,0CAEA,wBACE,CADF,gBACE,qCAGF,iBACE,MACA,OACA,WACA,YACA,aACA,uBACA,mBACA,8BACA,kBACA,iBACA,gBACA,YACA,8CAEA,iBACE,6HAGE,UNvhBF,aMiiBR,aACE,CACA,kBACA,eACA,gBAGF,kBACE,cR5hBkB,kBQ8hBlB,kBACA,mBACA,kBACA,uBAEA,qCACE,iCACA,cNjjBY,sBMqjBd,mCACE,+BACA,cNtjBQ,kBM0jBV,oBACE,cRhjBgB,qBQkjBhB,wBAEA,UNjkBI,0BMmkBF,kBAIJ,kBACE,4BAGF,SACE,sBACA,cACA,WACA,SACA,aACA,gDACA,mBRjlBiB,WEDb,eMqlBJ,SACA,8CAEA,QACE,iHAGF,mBAGE,kCAGF,kBACE,uBAIJ,eACE,CAII,oKADF,eACE,0DAKN,eAzEF,eA0EI,eAIJ,eACE,kBACA,gBAEA,aR7mBkB,qBQ+mBhB,sBAEA,yBACE,YAKN,eACE,mBACA,eACA,eAEA,oBACE,kBACA,cAGF,aR1oBwB,qBQ4oBtB,gBACA,2DAEA,aAGE,8BAKN,kBAEE,cRhpBkB,oCQmpBlB,cACE,mBACA,kBACA,4CAGF,aRvpBqB,gBQypBnB,CAII,mUADF,eACE,0DAKN,6BAtBF,eAuBI,cAIJ,YACE,eACA,uBACA,UAGF,aACE,gBN7rBM,YM+rBN,qBACA,mCACA,qBACA,cAEA,aACE,SACA,iBAIJ,kBACE,cR5rBqB,WQ8rBrB,sBAEA,aACE,eACA,eAKF,kBACE,sBAEA,eACE,CAII,+JADF,eACE,4CASR,qBACE,8BACA,WNzuBI,qCM2uBJ,oCACA,kBACA,aACA,mBACA,gDAEA,UNjvBI,0BMmvBF,oLAEA,oBAGE,0DAIJ,eACE,cACA,kBACA,CAII,yYADF,eACE,kEAIJ,eACE,oBAMR,YACE,eACA,mBACA,4DAEA,aAEE,6BAIA,wBACA,cACA,sBAIJ,iBACE,cRnxBkB,0BQsxBlB,iBACE,oBAIJ,eACE,mBACA,uBAEA,cACE,WN7yBI,kBM+yBJ,mBACA,SACA,UACA,4BAGF,aACE,eAIJ,aNvzBc,0SMi0BZ,+CACE,aAIJ,kBACE,yBACA,kBACA,aACA,mBACA,kBACA,kBACA,QACA,mCACA,sBAEA,aACE,8BAGF,sBACE,SACA,aACA,eACA,gDACA,oBAGF,aACE,WACA,oBACA,gBACA,eACA,CACA,oBACA,WACA,iCACA,oBAGF,oBN32Bc,gBM62BZ,2BAEA,kBN/2BY,gBMi3BV,oBAKN,kBACE,6BAEA,wBACE,mBACA,eACA,aACA,4BAGF,kBACE,aACA,OACA,sBACA,cACA,cACA,gCAEA,iBACE,YACA,iBACA,kBACA,UACA,8BAGF,qBACE,qCAIJ,kBACE,gCAGF,wBACE,mCACA,kBACA,kBACA,kBACA,kBACA,sCAEA,wBACE,WACA,cACA,YACA,SACA,kBACA,MACA,UACA,yBAIJ,sBACE,aACA,mBACA,SCl7BF,aACE,qBACA,cACA,mCACA,qCAEA,QANF,eAOI,8EAMA,kBACE,YAKN,YACE,kBACA,mBACA,0BACA,gBAEA,aACE,WACA,YACA,SACA,oBACA,CADA,8BACA,CADA,gBACA,0BACA,qCAGF,WAfF,YAgBI,sCAGF,WAnBF,YAoBI,aAIJ,iBACE,aACA,aACA,2BACA,mBACA,mBACA,0BACA,qCAEA,WATF,eAUI,qBAGF,aACE,WACA,YACA,gBACA,wBAEA,UACE,YACA,cACA,SACA,kBACA,mBACA,oBACA,CADA,8BACA,CADA,gBACA,0BAIJ,gBACE,gBACA,iCAEA,cACE,WP7EA,gBO+EA,gBACA,uBACA,+BAGF,aACE,eACA,cTzEY,gBS2EZ,gBACA,uBACA,aAMR,cACE,kBACA,gBACA,6GAEA,cAME,WP3GI,gBO6GJ,qBACA,iBACA,qBACA,sBAGF,ePnHM,oBOqHJ,WTtHI,eSwHJ,cACA,kBAGF,cACE,uCAGF,aThHqB,oBSqHrB,UACE,eACA,wBAEA,oBACE,iBACA,oBAIJ,WACE,gBACA,wBAEA,oBACE,gBACA,uBAIJ,cACE,cACA,qCAGF,YA7DF,iBA8DI,mBAEA,YACE,uCAGF,oBAEE,gBAKN,kBT1KqB,mCS4KnB,cTxJiB,eS0JjB,gBACA,kBACA,aACA,uBACA,mBACA,eACA,kBACA,aACA,gBACA,2BAEA,yBACE,yBAGF,qBACE,gBACA,yCAIJ,oBAEE,gBACA,eACA,kBACA,eACA,iBACA,gBACA,cTzMwB,sCS2MxB,sCACA,6DAEA,aPhNc,sCOkNZ,kCACA,qDAGF,aACE,sCACA,kCACA,0BAIJ,eACE,UACA,wBACA,gBACA,CADA,YACA,CACA,iCACA,CADA,uBACA,CADA,kBACA,eACA,iBACA,6BAEA,YACE,gCACA,yDAGF,qBAEE,aACA,kBACA,gBACA,gBACA,mBACA,uBACA,6BAGF,eACE,YACA,cACA,cT5OmB,6BS8OnB,6BAGF,aACE,cTpPgB,4BSwPlB,aTjQwB,qBSmQtB,qGAEA,yBAGE,oCAIJ,qCACE,iCACA,sCAEA,aPnRY,gBOqRV,0CAGF,aPxRY,wCO6Rd,eACE,wCAIJ,UACE,0BAIA,aT3RkB,4BS8RhB,aTxSsB,qBS0SpB,qGAEA,yBAGE,iCAIJ,UPtTI,gBOwTF,wBAIJ,eACE,kBC/TJ,kCACE,kBACA,gBACA,mBACA,8BAEA,yBACE,qCAGF,iBAVF,eAWI,gBACA,gBACA,6BAGF,eACE,SACA,gBACA,gFAEA,yBAEE,sCAIJ,UACE,yBAGF,kBV5BmB,6GU+BjB,sBAGE,CAHF,cAGE,8IAIA,eAGE,0BACA,iJAKF,yBAGE,kLAIA,iBAGE,qCAKN,4GACE,yBAGE,uCAKN,kBACE,qBAIJ,WACE,eACA,mBVpEmB,WEXb,oBQkFN,iBACA,YACA,iBACA,SACA,yBAEA,UACE,YACA,sBACA,iBACA,UR5FI,gFQgGN,kBAGE,qNAKA,kBVtGoB,4IU8GpB,kBR9GQ,qCQqHV,wBACE,YACE,0DAOJ,YACE,uCAGF,2BACE,gBACA,uDAEA,SACE,SACA,yDAGF,eACE,yDAGF,gBACE,iBACA,mFAGF,UACE,qMAGF,eAGE,iCC/JN,u+KACE,uCAEA,u+KACE,0CAIJ,u+KACE,WCTF,gCACE,4CACA,cAGF,aACE,eACA,iBACA,cZKmB,SYHnB,uBACA,UACA,eACA,wCAEA,yBAEE,uBAGF,aZhBsB,eYkBpB,SAIJ,wBZbqB,YYenB,kBACA,sBACA,WV5BM,eU8BN,qBACA,oBACA,eACA,gBACA,YACA,iBACA,iBACA,gBACA,eACA,kBACA,kBACA,qBACA,uBACA,2BACA,mBACA,WACA,4CAEA,wBAGE,4BACA,sBAGF,eACE,mFAEA,wBVxDQ,gBU4DN,mCAIJ,wBZhEsB,eYmEpB,2BAGF,QACE,wDAGF,mBAGE,yGAGF,cAIE,iBACA,YACA,oBACA,iBACA,4BAGF,UZ9FM,mBAGgB,qGY+FpB,wBAGE,8BAIJ,kBV1EsB,2GU6EpB,wBAGE,0BAIJ,aZrGkB,uBYuGhB,iBACA,yBACA,+FAEA,oBAGE,cACA,mCAGF,UACE,uBAIJ,aACE,WACA,kBAIJ,YACE,cACA,kBACA,cAGF,oBACE,UACA,cZjIoB,SYmIpB,kBACA,uBACA,eACA,2BACA,2CACA,2DAEA,aAGE,uCACA,4BACA,2CACA,oBAGF,qCACE,uBAGF,aACE,6BACA,eACA,qBAGF,aZ1KwB,gCY8KxB,QACE,uEAGF,mBAGE,uBAGF,aZxKmB,sFY2KjB,aAGE,oCACA,6BAGF,kCACE,gCAGF,aACE,6BACA,8BAGF,aZ3MsB,uCY8MpB,aACE,wBAKN,sBACE,0BACA,yBACA,kBACA,YACA,8BAEA,yBACE,mBAKN,aZjNqB,SYmNnB,kBACA,uBACA,eACA,gBACA,eACA,cACA,iBACA,UACA,2BACA,2CACA,0EAEA,aAGE,oCACA,4BACA,2CACA,yBAGF,kCACE,4BAGF,aACE,6BACA,eACA,0BAGF,aZlQwB,qCYsQxB,QACE,sFAGF,mBAGE,CAKF,0BADF,iBAUE,CATA,WAGF,WACE,cACA,qBACA,QACA,SAEA,+BAEA,kBAEE,mBACA,oBACA,kBACA,mBACA,iBAKF,WACE,eAIJ,YACE,iCAGE,mBACA,eAEA,gBACA,wCAEA,aZvTsB,sDY2TtB,YACE,2CAGF,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,kDAEA,oBZ5UoB,yDYmVxB,UZxVM,mBY0VJ,mBZvVoB,oCYyVpB,iBACA,kBACA,eACA,gBACA,6CAEA,UZlWI,gBYoWF,CAII,kRADF,eACE,wCAKN,aZxViB,gBY0Vf,0BACA,yIAEA,oBAGE,sCAKN,iBACE,QACA,UACA,kDAGF,iBACE,mGAGF,iBAGE,WACA,8BAGF,QACE,wBACA,UACA,qDAEA,WACE,mBACA,UACA,mFAIJ,aAEE,sBACA,WACA,SACA,WZ5ZI,gBECA,aU8ZJ,oBACA,eACA,gBACA,SACA,UACA,yIAEA,aZvZc,CYqZd,sHAEA,aZvZc,CYqZd,8HAEA,aZvZc,CYqZd,gIAEA,aZvZc,CYqZd,4GAEA,aZvZc,+FY2Zd,SACE,qCAGF,kFAvBF,cAwBI,sCAIJ,iBACE,+CAGF,gBACE,0BACA,iBACA,mBACA,YACA,qBACA,kEAEA,SACE,qCAGF,8CAZF,sBAaI,gBACA,2DAIJ,iBACE,SACA,kDAGF,qBACE,aACA,kBACA,SACA,WACA,WACA,sCACA,mBZjdsB,0BYmdtB,WZvdI,eYydJ,YACA,6FAEA,aACE,wDAIJ,YACE,eACA,kBACA,yPAEA,kBAIE,wGAIJ,YAGE,mBACA,mBACA,2BACA,iBACA,eACA,oCAGF,6BACE,0CAEA,aACE,gBACA,uBACA,mBACA,2CAGF,eACE,0CAGF,aACE,iBACA,gBACA,uBACA,mBACA,8EAIJ,aAEE,iBACA,WACA,YACA,2DAGF,aZngBmB,wCYugBnB,UZ5hBM,oBY8hBJ,eACA,gBV9hBI,sEUiiBJ,eACE,uEAGF,YACE,mBACA,YACA,eACA,8DAGF,UACE,cACA,WACA,uEAEA,iFACE,aACA,uBACA,8BACA,UACA,4BACA,oFAEA,aACE,cZ3iBa,eY6iBb,gBACA,aACA,oBACA,6QAEA,UAGE,8EAIJ,SACE,0EAIJ,iBACE,UACA,SACA,OACA,QACA,sBACA,gFACA,aACA,UACA,4BACA,mFAEA,sBACE,cZ3kBa,SY6kBb,UACA,SACA,WACA,oBACA,eACA,gBACA,yFAEA,UVpmBF,8GUwmBE,WACE,cZ1lBW,CEff,oGUwmBE,WACE,cZ1lBW,CEff,wGUwmBE,WACE,cZ1lBW,CEff,yGUwmBE,WACE,cZ1lBW,CEff,+FUwmBE,WACE,cZ1lBW,iFY+lBf,SACE,wEAKN,iBACE,sBVtnBE,wBUwnBF,sBACA,4BACA,aACA,WACA,gBACA,8CAIJ,YACE,mBACA,0BACA,aACA,8BACA,cACA,qEAEA,YACE,uGAEA,gBACE,qGAGF,YACE,6IAEA,aACE,2IAGF,gBACE,0HAKN,sBAEE,cACA,0EAGF,iBACE,iBACA,sCAIJ,YACE,yBACA,YACA,cACA,4EAEA,eACE,iBACA,oBAKN,cACE,kDACA,eACA,gBACA,cZrqBmB,4CYwqBnB,aVzrBY,kCU8rBd,2CACE,WCpsBF,8DDysBE,sBACA,CADA,kBACA,wBACA,WACA,YACA,eAEA,UACE,kBAIJ,iBACE,mBACA,mBZltBsB,aYotBtB,gBACA,gBACA,cACA,0BAGF,iBACE,gBACA,0BAGF,WACE,iBACA,gCAGF,UZvuBQ,cYyuBN,eACA,iBACA,gBACA,mBACA,qBACA,kCAGF,UACE,iBACA,+BAGF,cACE,4CAGF,iBAEE,eACA,iBACA,qBACA,gBACA,gBACA,uBACA,gBACA,WVlwBM,wDUqwBN,SACE,wGAGF,kBACE,sJAEA,oBACE,gEAIJ,UACE,YACA,gBACA,oDAGF,cACE,iBACA,sBACA,CADA,gCACA,CADA,kBACA,gDAGF,kBACE,qBACA,sEAEA,eACE,gDAIJ,aV1xBc,qBU4xBZ,4DAEA,yBACE,oEAEA,aACE,4EAKF,oBACE,sFAEA,yBACE,wDAKN,aZ9yBc,8EYmzBhB,aACE,0GAGF,kBZpzBoB,sHYuzBlB,kBACE,qBACA,8IAGF,QACE,0XAGF,mBAGE,0FAIJ,YACE,wJAEA,aACE,6CAKN,gBACE,oCAGF,aACE,eACA,iBACA,cACA,SACA,uBACA,CACA,eACA,oFAEA,yBAEE,gCAIJ,oBACE,kBACA,uBACA,SACA,WZ13BM,gBY43BN,eACA,cACA,iBACA,eACA,sBACA,4BAGF,aZr3BkB,SYu3BhB,kBACA,kBACA,oBACA,SACA,aACA,sBACA,WACA,WACA,gCACA,+BAGF,UACE,kBACA,kBAIA,SACE,mBACA,wCAEA,kBACE,8CAEA,sBACE,iFAIJ,kBAEE,SAMJ,yBACA,kBACA,gBACA,gCACA,eACA,UAaA,mCACA,CADA,0BACA,wDAZA,QARF,kBAWI,0BAGF,GACE,aACA,WALA,gBAGF,GACE,aACA,uDAMF,cAEE,kCAGF,kBACE,4BACA,sCAIA,aZt7Be,CAtBX,uEYq9BF,UZr9BE,kCYy9BF,aZn8Ba,gCYw8Bf,UZ99BI,kCYi+BF,aZ59BoB,gEYg+BpB,UVp+BE,mBFEgB,sEYs+BhB,kBACE,+CAQR,sBACE,qEAEA,aACE,qDAKN,aZ5+BkB,YY++BhB,eACA,uBAGF,aZn/BkB,qCYu/BlB,aACE,eACA,mBACA,eAGF,cACE,mBAGF,+BACE,aACA,6CAEA,uBACE,OACA,4DAEA,eACE,8DAGF,SACE,mBACA,qHAGF,cAEE,gBACA,4EAGF,cACE,0BAKN,kBACE,aACA,cACA,uBACA,aACA,kBAGF,gBACE,cZviCgB,CYyiChB,iBACA,eACA,kBACA,+CAEA,aZ9iCgB,uBYkjChB,aACE,gBACA,uBACA,qBAIJ,kBACE,aACA,eACA,8BAEA,mBACE,kBACA,mBACA,yDAEA,gBACE,qCAGF,oBACE,WACA,eACA,gBACA,cZxkCgB,4BY8kCtB,iBACE,8BAGF,cACE,cACA,uCAGF,aACE,aACA,mBACA,uBACA,kBACA,kBAGF,kBACE,kBACA,wBAEA,YACE,eACA,8BACA,uBACA,uFAEA,SAEE,mCAIJ,cACE,iBACA,6CAEA,UACE,YACA,gBACA,kEAGF,gBACE,gBACA,+DAIJ,cAEE,wBAIJ,eACE,cZzoCgB,eY2oChB,iBACA,8BAGF,kBACE,6BACA,gCACA,aACA,mBACA,eACA,wBAGF,aACE,qBACA,uDAGF,oBAEE,gBACA,eACA,gBACA,2BAGF,UZprCQ,eYsrCN,6BAEA,aZnqCmB,SYwqCrB,YACE,gCACA,8BAEA,aACE,cACA,WVlsCI,qBUosCJ,eACA,gBACA,kBAIJ,YACE,iBAGF,WACE,aACA,mBACA,UAGF,YACE,gCACA,kBAEA,SACE,gBACA,2CAEA,aACE,iCAIJ,aACE,cACA,cZttCgB,gBYwtChB,qBACA,eACA,mBAIJ,YACE,0BAGF,UACE,iBACA,kBACA,kBAGF,iBEtvCE,iCACA,wBACA,4BACA,kBFqvCA,yBAEA,oBACE,sBACA,iBACA,4BAGF,iBEhwCA,iCACA,wBACA,4BACA,kBF+vCE,gBACA,kBACA,eACA,gCAEA,UACE,kBACA,sBACA,mCAGF,aACE,kBACA,QACA,SACA,+BACA,WVjxCE,6BUmxCF,gBACA,eACA,oBAKN,cACE,0BAGF,UACuB,sCEvxCrB,+BFyxCA,iBElyCA,iCACA,wBACA,4BACA,WFiyCuB,sCE3xCvB,kCF8xCA,iBEvyCA,iCACA,wBACA,4BACA,WFsyCuB,sCEhyCvB,kBFkyCE,SACA,QACA,UACA,wBAIJ,WACE,aACA,mBACA,sBAGF,YACE,6BACA,cZ3yCgB,6BY8yChB,eACE,CAII,kMADF,eACE,wBAKN,eACE,cACA,0BACA,yFAEA,oBAGE,sBAKN,4BACE,gCACA,iBACA,gBACA,cACA,aACA,+BAGF,YACE,4CAEA,qBACE,oFAIA,QACE,WACA,uDAGF,WACE,iBACA,gBACA,WACA,4BAKN,YACE,cACA,iBACA,kBACA,2BAGF,oBACE,gBACA,cACA,+BACA,eACA,oCACA,kCAEA,+BACE,gCAGF,aACE,eACA,cZ13CgB,kCY83ClB,aACE,eACA,gBACA,WV94CI,CUm5CA,2NADF,eACE,oBAMR,iBACE,mDAEA,aACE,mBACA,gBACA,4BAIJ,UACE,kBACA,6JAGF,oBAME,4DAKA,UVn7CM,kBUy7CN,UACE,iKAQF,yBACE,+BAIJ,aACE,gBACA,uBACA,0DAGF,aAEE,sCAGF,kBACE,gCAGF,aZv8CuB,cYy8CrB,iBACA,mBACA,gBACA,2EAEA,aAEE,uBACA,gBACA,uCAGF,cACE,WVr+CI,kCU0+CR,UACE,kBACA,iBAGF,WACE,UACA,kBACA,SACA,WACA,iBAGF,UACE,kBACA,OACA,MACA,YACA,eACA,CZ/+CgB,gHYy/ChB,aZz/CgB,wBY6/ChB,UACE,wCAGF,kBVj/CsB,WF/BhB,8CYohDJ,kBACE,qBACA,wBAKN,oBACE,gBACA,eACA,cZhhDkB,eYkhDlB,iBACA,kBACA,4BAEA,aZ/hDwB,6BYmiDxB,cACE,gBACA,uBACA,uCAIJ,UACE,kBACA,CV5iDU,mEUmjDZ,aVnjDY,uBUujDZ,aVxjDc,4DU8jDV,4CACE,CADF,oCACE,8DAKF,6CACE,CADF,qCACE,6BAKN,aACE,gBACA,qBACA,mCAEA,UVllDM,0BUolDJ,8BAIJ,WACE,eAGF,aACE,eACA,gBACA,uBACA,mBACA,qBAGF,eACE,wBAGF,cACE,+DAKA,yBACE,eAIJ,iBACE,WACA,YACA,aACA,mBACA,uBACA,sBACA,6CAEA,cVzkD4B,eAEC,0DU0kD3B,sBACA,CADA,gCACA,CADA,kBACA,4BAGF,iBACE,qEAGF,YACE,iBAIJ,iBACE,WACA,YACA,aACA,mBACA,uBACA,qBAEA,cVjmD4B,eAEC,WUkmD3B,YACA,sBACA,CADA,gCACA,CADA,kBACA,iBAIJ,YACE,aACA,mBACA,cACA,eACA,cZrpDkB,wBYwpDlB,aZtpDqB,mBY0pDrB,aACE,4BAGF,oBACE,0CAGF,iBACE,6DAEA,iBACE,oBACA,qCACA,UACA,4EAGF,mBACE,gCACA,UACA,0BAKN,aACE,gBACA,iBACA,gBACA,gBACA,kCAGF,aACE,gBACA,gBACA,uBACA,+BAGF,aACE,qBACA,WAGF,oBACE,oBAGF,YACE,kBACA,2BAGF,+BACE,mBACA,SACA,gBAGF,kBZnuD0B,cYquDxB,kBACA,uCACA,aACA,mBAEA,eACE,qBAGF,yBACE,oBAGF,yBACE,uBAGF,sBACE,sBAGF,sBACE,uBAIJ,iBACE,QACA,SACA,2BACA,4BAEA,UACE,gBACA,2BACA,0BZxwDsB,2BY4wDxB,WACE,iBACA,uBACA,yBZ/wDsB,8BYmxDxB,QACE,iBACA,uBACA,4BZtxDsB,6BY0xDxB,SACE,gBACA,2BACA,2BZ7xDsB,wBYmyDxB,cACE,iBACA,cACA,iBACA,sBACA,qBACA,mBZzyDsB,WAJlB,gBYgzDJ,uBACA,mBACA,yFAEA,kBZxyDiB,cAIE,UYyyDjB,sCAKN,aACE,iBACA,gBACA,QACA,gBACA,aACA,yCAEA,eACE,mBZn0DsB,cYq0DtB,kBACA,mCACA,gBACA,kBACA,sDAGF,OACE,wDAIA,UACE,8CAIJ,cACE,iBACA,cACA,iBACA,sBACA,qBACA,mBZ51DsB,WAJlB,gBYm2DJ,uBACA,mBACA,oDAEA,SACE,oDAGF,kBZ/1DiB,cAIE,iBYk2DvB,qBACE,eAGF,YACE,cACA,mBACA,2BACA,gBACA,kBACA,4BAEA,iBACE,uBAGF,YACE,uBACA,WACA,YACA,iBACA,6BAEA,WACE,gBACA,oBACA,aACA,yBACA,gBACA,oCAEA,0BACE,oCAGF,cACE,YACA,oBACA,YACA,6BAIJ,qBACE,WACA,gBACA,cACA,aACA,sBACA,qCAEA,4BARF,cASI,qBAMR,kBACE,wBACA,CADA,eACA,MACA,UACA,cACA,qCAEA,mBAPF,gBAQI,+BAGF,eACE,qCAEA,6BAHF,kBAII,gKAMJ,WAIE,mCAIJ,YACE,mBACA,uBACA,YACA,SAGF,WACE,kBACA,sBACA,aACA,sBACA,qBAEA,kBZr9DmB,8BYu9DjB,+BACA,KAIJ,aACE,CACA,qBACA,WACA,YACA,aAJA,YAYA,CARA,QAGF,WACE,sBACA,CACA,qBACA,kBACA,cAGF,aACE,cACA,sBACA,cZn+DkB,qBYq+DlB,kBACA,eACA,oCACA,iBAGF,aAEE,gBACA,qCAGF,cACE,SACE,iBAGF,aAEE,CAEA,gBACA,yCAEA,iBACE,uCAGF,kBACE,qDAKF,gBAEE,kBACA,YAKN,qBACE,aACA,mBACA,cACA,gBACA,iBAGF,aACE,cACA,CACA,sBACA,WVxiEM,qBU0iEN,kBACA,eACA,gBACA,gCACA,2BACA,mDACA,qBAEA,eACE,eACA,qCAMA,mEAHF,kBAII,4BACA,yBAIJ,+BACE,cZ7jEsB,sBYikExB,eACE,aACA,qCAIJ,qBAEI,cACE,wBAKN,qBACE,WACA,YACA,cACA,6DAEA,UAEE,YACA,UACA,wCAGF,YACE,cACA,kDACA,qCAEA,uCALF,aAMI,yCAIJ,eACE,oCAGF,YACE,uDAGF,cACE,sCAGF,gBACE,eACA,CACA,2BACA,yCAGF,QACE,mCAGF,gBACE,yBAEA,kCAHF,eAII,sCAIJ,sBACE,gBACA,sCAGF,uCACE,YACE,iKAEA,eAGE,6CAIJ,gBACE,2EAGF,YAEE,kGAGF,gBACE,+BAGF,2BACE,gBACA,uCAEA,SACE,SACA,wCAGF,eACE,wCAGF,gBACE,iBACA,qDAGF,UACE,gLAGF,eAIE,gCAIJ,iBACE,6CAEA,cACE,8CAKF,gBACE,iBACA,6DAGF,UACE,CAIA,yFAGF,eACE,8DAGF,gBACE,kBACA,0BAMR,cACE,aACA,uBACA,mBACA,gBACA,iBACA,iBACA,gBACA,mBACA,WV/uEM,kBUivEN,eACA,iBACA,qBACA,sCACA,4FAEA,kBAGE,qCAIJ,UACE,UACE,uDAGF,kCACE,4DAGF,kBAGE,yBAGF,aACE,iBAGF,eAEE,sCAIJ,2CACE,YACE,sCAOA,sEAGF,YACE,uCAIJ,0CACE,YACE,uCAIJ,UACE,YACE,mBAIJ,iBACE,yBAEA,iBACE,SACA,UACA,mBZ/yEiB,yBYizEjB,gBACA,kBACA,eACA,gBACA,iBACA,WVj0EI,mDUs0ER,oBACE,gBAGF,WACE,gBACA,aACA,sBACA,yBACA,kBACA,gCAEA,gBACE,oBACA,cACA,gBACA,6BAGF,sBACE,8BAGF,MACE,kBACA,aACA,sBACA,iBACA,oBACA,oBACA,mDAGF,eACE,sBVx2EI,0BU02EJ,cACA,gDAGF,iBACE,gDAGF,WACE,mBAIJ,eACE,mBACA,yBACA,gBACA,aACA,sBACA,qBAEA,aACE,sBAGF,aACE,SACA,CACA,4BACA,cACA,qDAHA,sBAOA,gBAMF,WACA,kBAGA,+BANF,qBACE,UACA,CAEA,eACA,aAiBA,CAhBA,eAGF,iBACE,MACA,OACA,mBACA,CAGA,qBACA,CACA,eACA,WACA,YACA,kBACA,uBAEA,kBZv6EmB,0BY46ErB,u1BACE,OACA,gBACA,aACA,8BAEA,aACE,sBACA,CADA,4DACA,CADA,kBACA,+BACA,CADA,2BACA,WACA,YACA,oBACA,eACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,sCAGF,yBAjBF,aAkBI,iBAIJ,kBACE,eACA,gBACA,iBAGF,aACE,eACA,mBACA,mBACA,aACA,mBACA,kBACA,mBAEA,iCACE,yBAEA,kBACE,mCACA,aAKN,iBACE,kBACA,cACA,iCACA,mCAEA,eACE,yBAGF,YAVF,cAWI,oBAGF,YACE,sBACA,qBAGF,aACE,kBACA,iBACA,yBAKF,uBADF,YAEI,sBAIJ,qBACE,WACA,mBACA,cZ3/EwB,eY6/ExB,cACA,eACA,oBACA,SACA,iBACA,aACA,SACA,UACA,UACA,2BAEA,yBACE,6BAIJ,kBACE,SACA,oBACA,cZhhFwB,eYkhFxB,mBACA,eACA,kBACA,UACA,mCAEA,yBACE,wCAGF,kBACE,2BAIJ,oBACE,iBACA,2BAGF,iBACE,kCAGF,cACE,cACA,eACA,aACA,kBACA,QACA,UACA,eAGF,oBACE,kBACA,eACA,6BACA,SACA,UACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,0CACA,wCACA,iCAGF,QACE,mBACA,WACA,YACA,gBACA,UACA,kBACA,UACA,yBAGF,kBACE,WACA,wBACA,qBAGF,UACE,YACA,UACA,mBACA,yBZxlFmB,qCY0lFnB,sEAGF,wBACE,4CAGF,wBZvlFqB,+EY2lFrB,wBACE,2BAGF,iBACE,WACA,YACA,MACA,SACA,gBACA,mBACA,cACA,SACA,UACA,6BACA,CAKA,uEAFF,SACE,6BAeA,CAdA,sBAGF,iBACE,WACA,YACA,MACA,SACA,gBACA,mBACA,cACA,WAGA,8CAGF,SACE,qBAGF,iBACE,QACA,SACA,WACA,YACA,yBACA,kBACA,yBACA,sBACA,yBACA,sCACA,4CAGF,SACE,qBZnpFmB,cYupFrB,kBACE,WVnqFM,cUqqFN,eACA,aACA,qBACA,2DAEA,kBAGE,oBAGF,SACE,2BAGF,sBACE,cZlrFsB,kGYqrFtB,sBAGE,WV3rFE,kCU+rFJ,aZprFiB,oBY0rFrB,oBACE,iBACA,qBAGF,oBACE,kBACA,eACA,iBACA,gBACA,mBZ9sFmB,gBYgtFnB,iBACA,oBAGF,kBZptFqB,cAaH,iBY0sFhB,eACA,gBACA,eACA,yDAGF,kBZ7tFqB,cYmuFrB,aACE,kBAGF,aZ1tFkB,cY4tFhB,8BACA,+BACA,4EAEA,0BAGE,CAHF,uBAGE,CAHF,kBAGE,kDAMA,sBACA,YACA,wDAEA,kBACE,8DAGF,cACE,sDAGF,cACE,0DAEA,aZxvFY,0BY0vFV,sDAIJ,oBACE,cZhwFc,sMYmwFd,yBAGE,oDAKN,aZ1wFgB,0BYgxFhB,aACE,UACA,mCACA,CADA,0BACA,gBACA,6BAEA,cACE,cZxxFc,aY0xFd,gBACA,gCACA,sCAGF,oDACE,YACE,uCAIJ,oDACE,YACE,uCAIJ,yBA1BF,YA2BI,yCAGF,eACE,aACA,iDAEA,aZnzFc,qBY0zFpB,eACE,gBACA,2BAEA,iBACE,aACA,wBAGF,kBACE,yBAGF,oBACE,gBACA,yBACA,yBACA,eAIJ,aACE,sBACA,WACA,SACA,WZj2FM,gBECA,aUm2FN,oBACA,eACA,gBACA,SACA,UACA,kBACA,qBAEA,SACE,qCAGF,cAnBF,cAoBI,oDAIJ,uBACE,YACA,6CACA,uBACA,sBACA,WACA,0DAEA,sBACE,0DAKJ,uBACE,2BACA,gDAGF,aZt3FsB,6BYw3FpB,uDAGF,aZx4F0B,cY44F1B,YACE,eACA,yBACA,kBACA,cZt4FgB,gBYw4FhB,qBACA,gBACA,uBAEA,QACE,OACA,kBACA,QACA,MAIA,iDAHA,YACA,uBACA,mBAUE,CATF,0BAEA,yBACE,kBACA,iBACA,cAIA,sDAGF,cAEE,cZj6FiB,uBYm6FjB,SACA,cACA,qBACA,eACA,iBACA,sMAEA,UVz7FE,yBUg8FJ,cACE,kBACA,YACA,eAKN,cACE,qBAEA,kBACE,oBAIJ,cACE,cACA,qBACA,WACA,YACA,SACA,2BAIA,UACE,YACA,qBAIJ,aACE,gBACA,kBACA,cZt9FkB,gBYw9FlB,uBACA,mBACA,qBACA,uBAGF,aACE,gBACA,2BACA,2BAGF,aZp+FoB,oBYw+FpB,aACE,eACA,eACA,gBACA,uBACA,mBACA,qBAGF,cACE,mBACA,kBACA,yBAEA,cACE,kBACA,yBACA,QACA,SACA,+BACA,yBAIJ,aACE,6CAEA,UACE,mDAGF,yBACE,6CAGF,mBACE,sBAIJ,oBACE,kCAEA,QACE,4CAIA,oBACA,0CAGF,kBACE,0CAGF,aACE,6BAIJ,wBACE,2BAGF,yBACE,cACA,SACA,WACA,YACA,oBACA,CADA,8BACA,CADA,gBACA,sBACA,wBACA,YAGF,aACE,cZpjGgB,6BYsjGhB,SACA,kBACA,kBACA,oBACA,SACA,aACA,sBACA,WACA,WACA,qBACA,kBAEA,kBACE,WAIJ,+BACE,yBAGF,iBACE,eACA,gBACA,cZ9kGgB,mBAbG,eY8lGnB,aACA,cACA,sBACA,mBACA,uBACA,aACA,qEAGE,aAEE,WACA,aACA,SACA,yCAIJ,gBACE,gCAGF,eACE,uCAEA,aACE,mBACA,cZ5mGY,qCYgnGd,cACE,gBACA,yBAKN,iBACE,cACA,uCAGE,aACE,WACA,kBACA,SACA,OACA,QACA,cACA,UACA,oBACA,YACA,UACA,gFACA,gBAKN,YACE,eACA,mBACA,cACA,eACA,kBACA,UACA,UACA,gBACA,2BACA,4BACA,uBAEA,QACE,SACA,yBACA,cACA,uBACA,aACA,gBACA,uBACA,gBACA,mBACA,OACA,4CAGF,aZlrGwB,uBYsrGxB,sCACE,4CAEA,aZzrGsB,yCY2rGpB,4CAIJ,SAEE,yBAIJ,WACE,aACA,uBAGF,kBACE,iCAGF,iBACE,wBAGF,kBACE,SACA,cZ3sGkB,eY6sGlB,eACA,eACA,8BAEA,aACE,CAKA,kEAEA,UVtuGI,mBUwuGF,6BAKN,eACE,gBACA,gBACA,cZnuGkB,0DYquGlB,UACA,uCAEA,YACE,WACA,uCAGF,iBACE,gCAGF,QACE,uBACA,SACA,6BACA,cACA,mCAIJ,kBACE,aACA,mCAIA,aZhwGkB,0BYkwGhB,gCAIJ,WACE,4DAEA,cACE,uEAEA,eACE,WAKN,oBACE,UACA,oBACA,kBACA,cACA,SACA,uBACA,eACA,sBAGF,oBACE,iBACA,oBAGF,aZjyGkB,eYmyGhB,gBACA,iBACA,kBACA,QACA,SACA,+BACA,yBAEA,aACE,WACA,CACA,0BACA,oBACA,mBACA,4BAIJ,iBACE,QACA,SACA,+BACA,WACA,YACA,sBACA,6BACA,CACA,wBACA,kBACA,2CAGF,2EACE,CADF,mEACE,8CAGF,4EACE,CADF,oEACE,qCAGF,GACE,sBACE,KAGF,2BACE,KAGF,2BACE,KAGF,yBACE,IAGF,wBACE,EArBF,4BAGF,GACE,sBACE,KAGF,2BACE,KAGF,2BACE,KAGF,yBACE,IAGF,wBACE,uCAIJ,GACE,wBACE,KAGF,0BACE,KAGF,2BACE,KAGF,uBACE,IAGF,sBACE,EAtBA,6BAIJ,GACE,wBACE,KAGF,0BACE,KAGF,2BACE,KAGF,uBACE,IAGF,sBACE,mCAIJ,GACE,OACE,SACA,yBACA,KAGF,wBACE,KAGF,UACE,YACA,6BACA,kBACA,UACA,IAGF,UACE,YACA,eACA,UACA,6BACA,EA5BA,yBAIJ,GACE,OACE,SACA,yBACA,KAGF,wBACE,KAGF,UACE,YACA,6BACA,kBACA,UACA,IAGF,UACE,YACA,eACA,UACA,6BACA,kCAIJ,GACE,gBACA,aACA,aAPE,wBAIJ,GACE,gBACA,aACA,gCAGF,kBACE,gBVz6GM,WACA,eU26GN,aACA,sBACA,YACA,uBACA,eACA,kBACA,kBACA,YACA,gBAGF,eVv7GQ,cFcY,SY46GlB,UACA,WACA,YACA,kBACA,wBACA,CADA,oBACA,CADA,eACA,iEAEA,SAGE,cACA,yBAIJ,aACE,eACA,yBAGF,aACE,eACA,gBACA,iBAGF,KACE,OACA,WACA,YACA,kBACA,YACA,2BAEA,aACE,SACA,QACA,WACA,YACA,6BAGF,mBACE,yBAGF,YACE,0BAGF,aACE,uBACA,WACA,YACA,SACA,iCAEA,oBACE,0BACA,kBACA,iBACA,WVt/GE,gBUw/GF,eACA,+LAMA,yBACE,mEAKF,yBACE,6BAMR,kBACE,iBAGF,kBACE,6BACA,gCACA,aACA,mBACA,eACA,kDAGF,aAEE,kBACA,yBAGF,kBACE,aACA,2BAGF,aZvhHoB,eYyhHlB,cACA,gBACA,mBACA,kDAIA,kBACE,oDAIA,SEtiHF,sBACA,WACA,SACA,gBACA,oBACA,mBdhBmB,cAYD,ecOlB,SACA,+EFgiHI,aACE,CEjiHN,qEFgiHI,aACE,CEjiHN,yEFgiHI,aACE,CEjiHN,0EFgiHI,aACE,CEjiHN,gEFgiHI,aACE,sEAGF,QACE,yLAGF,mBAGE,0DAGF,kBACE,qCAGF,mDArBF,cAsBI,yDAIJ,aZ9jHc,iBYgkHZ,eACA,4DAGF,gBACE,wDAGF,kBACE,gEAEA,cACE,iNAEA,kBAGE,cACA,gHAKN,aZxlHgB,0HY6lHhB,cAEE,gBACA,cZ/lHY,kZYkmHZ,aAGE,gEAIJ,wBACE,iDAGF,eV3nHI,kBY0BN,CAEA,eACA,cdRiB,uCcUjB,UF8lHI,mBZ1nHoB,oDc8BxB,adZiB,eccf,gBACA,mBACA,oDAGF,aACE,oDAGF,kBACE,oDAGF,eACE,WdlDI,sDYkoHJ,WACE,mDAGF,UZtoHI,kBYwoHF,eACA,8HAEA,kBAEE,iCAON,kBACE,mBAIJ,UVxpHQ,kBU0pHN,cACA,mBACA,sBV7pHM,eU+pHN,gBACA,YACA,kBACA,WACA,yBAEA,SACE,iBAIJ,aACE,iBACA,wBAGF,aZjqHoB,qBYmqHlB,mBACA,gBACA,sBACA,uCAGF,aZxqHkB,mBAbG,kBYyrHnB,aACA,eACA,gBACA,eACA,aACA,cACA,mBACA,uBACA,yBAEA,sCAdF,cAeI,kDAGF,eACE,2CAGF,aZxsHwB,qBY0sHtB,uDAEA,yBACE,eAKN,qBACE,8BAGF,GACE,kBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,oBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,kBACE,2CACA,CADA,kCACA,EA1BF,qBAGF,GACE,kBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,oBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,kBACE,2CACA,CADA,kCACA,mCAIJ,8BACE,2DACA,CADA,kDACA,iCAGF,MACE,sBAEE,0BACA,KAGF,sBACE,aAGF,uBAGE,aAGF,sBAGE,KAGF,uBACE,KAGF,sBACE,EA/BF,wBAGF,MACE,sBAEE,0BACA,KAGF,sBACE,aAGF,uBAGE,aAGF,sBAGE,KAGF,uBACE,KAGF,sBACE,kCAIJ,yBACE,8EACA,CADA,qEACA,8BAGF,eV/xHQ,kBUiyHN,sCACA,kBACA,eACA,UACA,iDAEA,2BACE,2DAGF,UACE,mCAIJ,iBACE,SACA,WACA,eACA,yCAGF,iBACE,UACA,SACA,UACA,gBV3zHM,kBU6zHN,sCACA,gBACA,gDAEA,aACE,eACA,SACA,gBACA,uBACA,iKAEA,+BAGE,2DAIJ,WACE,wBAKF,2BACE,cAIJ,kBACE,0BACA,aACA,YACA,uBACA,OACA,UACA,kBACA,MACA,kBACA,WACA,aACA,gBAEA,mBACE,oBAIJ,WACE,aACA,aACA,sBACA,kBACA,YACA,0BAGF,iBACE,MACA,QACA,SACA,OACA,WACA,kBACA,mBZ53HmB,kCY83HnB,uBAGF,MACE,aACA,mBACA,uBACA,cZv3HqB,eYy3HrB,gBACA,0BACA,kBACA,kBAGF,YACE,cZ33HmB,gBY63HnB,aACA,sBAEA,cACE,kBACA,uBAGF,cACE,gBACA,cACA,0BAIJ,aACE,4BAGF,UACE,WACA,kBACA,mBVz4HsB,kBU24HtB,eACA,2BAGF,iBACE,OACA,MACA,WACA,mBZt6HmB,kBYw6HnB,eAGF,aACE,eACA,iBACA,gBACA,WACA,UACA,eACA,0CAEA,mBAEE,mBAGF,8BACE,CADF,sBACE,WACA,cACA,CACA,UACA,YACA,eACA,CAQE,6GAKN,SACE,oBACA,CADA,WACA,6BAGF,iBACE,gBV99HM,uCUg+HN,kBACA,iBACA,gBACA,iCAEA,yBACE,oCAGF,sBACE,2BAIJ,UZ/+HQ,aYi/HN,eACA,aACA,kEAEA,kBZz+HmB,WEXb,UUw/HJ,CVx/HI,4RU6/HF,UV7/HE,wCUmgIN,kBACE,iCAIJ,YACE,mBACA,uBACA,kBACA,oCAGF,aACE,cZ5/HmB,2CY+/HnB,eACE,cACA,WZthII,CY2hIA,wQADF,eACE,mDAON,eVjiIM,0BUmiIJ,qCACA,gEAEA,eACE,0DAGF,kBZ/hIiB,uEYkiIf,UV7iIE,uDUmjIN,yBACE,sDAGF,aACE,sCACA,SAIJ,iBACE,gBAGF,SErjIE,sBACA,WACA,SACA,gBACA,oBACA,mBdhBmB,cAYD,ecOlB,SACA,cF+iIA,CACA,2BACA,iBACA,eACA,2CAEA,aACE,CAHF,iCAEA,aACE,CAHF,qCAEA,aACE,CAHF,sCAEA,aACE,CAHF,4BAEA,aACE,kCAGF,QACE,6EAGF,mBAGE,sBAGF,kBACE,qCAGF,eA3BF,cA4BI,kCAKF,QACE,qDAGF,mBAEE,mBAGF,iBACE,SACA,WACA,UACA,qBACA,UACA,0BACA,sCACA,eACA,WACA,YACA,cZvmImB,eYymInB,oBACA,0BAEA,mBACE,WACA,0BAIJ,uBACE,iCAEA,mBACE,uBACA,gCAIJ,QACE,uBACA,cZ3nIkB,eY6nIlB,uCAEA,uBACE,sCAGF,aACE,yBAKN,aZ5oIkB,mBY8oIhB,aACA,gBACA,eACA,eACA,6BAEA,oBACE,iBACA,0BAIJ,iBACE,6BAEA,kBACE,gCACA,eACA,aACA,aACA,gBACA,eACA,cZpqIc,iCYuqId,oBACE,iBACA,8FAIJ,eAEE,0BAIJ,aACE,aACA,cZprIqB,qBYsrIrB,+FAEA,aAGE,0BACA,uBAIJ,YACE,cZnsIkB,kBYqsIlB,aAGF,iBACE,8BACA,oBACA,aACA,sBAGF,cACE,MACA,OACA,QACA,SACA,0BACA,wBAGF,cACE,MACA,OACA,WACA,YACA,aACA,sBACA,mBACA,uBACA,2BACA,aACA,oBACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,oBAGF,mBACE,aACA,aACA,yBAGF,eACE,iBACA,yBAGF,UACE,cAGF,UACE,YACA,kBACA,qCAEA,UACE,YACA,aACA,mBACA,uBACA,2CAEA,cV7tI0B,eAEC,CUuuI7B,8CALF,iBACE,MACA,OACA,QACA,SAYA,CAXA,yBAQA,mBACA,8BACA,oBACA,4BAEA,mBACE,0DAGF,SACE,4DAEA,mBACE,mBAKN,yBACE,sBACA,SACA,WVzzIM,eU2zIN,aACA,mBACA,eACA,cACA,cACA,kBACA,kBACA,MACA,SACA,yBAGF,MACE,0BAGF,OACE,CASA,4CANF,UACE,kBACA,kBACA,OACA,YACA,oBAUA,6BAEA,WACE,sBAGF,mBACE,qBACA,gBACA,cZp2IsB,mFYu2ItB,yBAGE,wBAKN,oBACE,sBAGF,qBVt3IQ,YUw3IN,WACA,kBACA,YACA,UACA,SACA,YACA,8BAGF,wBZ73I0B,qBYi4I1B,iBACE,UACA,QACA,YACA,6CAGF,kBZz4I0B,WAJlB,kBYk5IN,gBACA,aACA,sBACA,oBAGF,WACE,WACA,gBACA,iBACA,kBACA,wBAEA,iBACE,MACA,OACA,WACA,YACA,sBACA,aACA,aACA,CAGA,YACA,UACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,2CANA,qBACA,mBACA,uBAaF,CATE,mBAIJ,YACE,CAGA,iBACA,mDAGF,aAEE,mBACA,aACA,aACA,2DAEA,cACE,uLAGF,aZ/6ImB,SYk7IjB,eACA,gBACA,kBACA,oBACA,YACA,aACA,kBACA,6BACA,+mBAEA,aAGE,yBACA,qiBAGF,UZx9II,qwDY49IF,aAGE,sBAMR,sBACE,eAGF,iBACE,eACA,mBACA,sBAEA,eACE,WZ/+II,kBYi/IJ,eACA,qBAGF,kBZn/ImB,cAcE,gBYw+InB,aACA,kBACA,kBAIJ,oBACE,eACA,gBACA,iBACA,wFAGF,kBAME,WZ3gJM,kBY6gJN,gBACA,eACA,YACA,kBACA,sBACA,4NAEA,aACE,eACA,mBACA,wLAGF,WACE,UACA,kBACA,SACA,WACA,kRAGF,UACE,wBAKF,eVviJM,CFGkB,gBYuiJtB,oBACA,iEV3iJI,2BFGkB,yBYgjJ1B,iBACE,aACA,iCAEA,wBACE,CADF,qBACE,CADF,oBACE,CADF,gBACE,gBACA,2GAIJ,YAIE,8BACA,mBZ/jJwB,aYikJxB,iBACA,2HAEA,aACE,iBACA,cZrjJiB,mBYujJjB,2IAGF,aACE,6BAIJ,cACE,2BAGF,WACE,eACA,0BAGF,gBAEE,sDAGF,qBAEE,eAGF,UACE,gBACA,0BAGF,YACE,6BACA,qCAEA,yBAJF,cAKI,gBACA,iDAIJ,qBAEE,UACA,qCAEA,+CALF,UAMI,sDAIJ,aAEE,gBACA,gBACA,gBACA,kBACA,2FAEA,aZnoJwB,iLYuoJxB,UZ5oJM,qCYipJN,oDAjBF,eAkBI,sCAKF,4BADF,eAEI,yBAIJ,YACE,+BACA,gBACA,0BAEA,cACE,iBACA,mBACA,sCAGF,aACE,sBACA,WACA,CACA,UZ3qJI,gBECA,aU6qJJ,oBACA,eACA,YACA,CACA,SACA,kBACA,yBACA,iBACA,gBACA,gBACA,4CAEA,wBACE,+CAGF,eV7rJI,yBU+rJF,mBACA,kBACA,6DAEA,QACE,gBACA,gBACA,mEAEA,QACE,0DAIJ,UZ9sJE,oBYgtJA,eACA,gBVhtJA,+CUqtJJ,YACE,8BACA,mBACA,4CAIJ,aACE,WZ9tJI,eYguJJ,gBACA,mBACA,wCAGF,eACE,mBACA,+CAEA,UZzuJI,eY2uJF,qCAIJ,uBAnFF,YAoFI,eACA,QACA,wCAEA,iBACE,iBAKN,eACE,eACA,wBAEA,eACE,iBACA,2CAGF,eACE,mBAGF,eACE,cACA,gBACA,+BAEA,4BACE,4BAGF,QACE,oCAIA,UZrxJE,aYuxJA,kBACA,eACA,mBACA,qBACA,8EAEA,eAEE,yWAOA,kBZ1xJW,WEXb,uDU4yJA,iBACE,oMAUR,aACE,iIAIJ,4BAIE,cZ5yJmB,eY8yJnB,gBACA,6cAEA,aAGE,6BACA,qGAIJ,YAIE,eACA,iIAEA,eACE,CAII,w1BADF,eACE,sDAMR,iBAEE,oDAKA,eACE,0DAGF,eACE,mBACA,aACA,mBACA,wEAEA,UZj3JI,CYm3JF,gBACA,uBAKN,YACE,2CAEA,QACE,WACA,cAIJ,wBZ73J0B,WY+3JxB,kBACA,MACA,OACA,aACA,6BAGF,aACE,kBACA,WV54JM,0BU84JN,WACA,SACA,gBACA,kBACA,eACA,gBACA,UACA,oBACA,WACA,4BACA,iBACA,2DAKE,YACE,wDAKF,SACE,uBAKN,eACE,6BAEA,UACE,kBAIJ,YACE,eACA,yBACA,kBACA,gBACA,gBACA,wBAEA,aACE,cZ76Jc,iBY+6Jd,eACA,+BACA,aACA,sBACA,mBACA,uBACA,eACA,4BAEA,aACE,wBAIJ,eACE,CACA,qBACA,aACA,sBACA,uBACA,2BAEA,aACE,cACA,0BAGF,oBACE,cZ38JY,gBY68JZ,gCAEA,yBACE,0BAKN,QACE,eACA,iDAEA,SACE,cACA,8BAGF,aZ99Jc,gBYs+JhB,cACA,CACA,iBACA,CACA,UACA,qCANF,qBACE,CACA,eACA,CACA,iBAYA,CAVA,qBAGF,QACE,CACA,aACA,WACA,CACA,iBAEA,qEAGE,cACE,MACA,gCAKN,cACE,cACA,qBACA,cZjgKqB,kBYmgKrB,UACA,mEAEA,WAEE,WACA,CAIA,2DADF,mBACE,CADF,8BACE,CADF,gBV5hKM,CU6hKJ,wBAIJ,UACE,YACA,CACA,iBACA,MACA,OACA,UACA,gBVxiKM,iCU2iKN,YACE,sBAIJ,WACE,gBACA,kBACA,WACA,qCAGF,cACE,YACA,oBACA,CADA,8BACA,CADA,gBACA,kBACA,QACA,2BACA,WACA,UACA,sCAGF,0BACE,2BACA,gBACA,kBACA,qKAMA,WAEE,mFAGF,WACE,eAKJ,qBACE,kBACA,mBACA,kBACA,oBACA,cACA,wBAEA,eACE,YACA,yBAGF,cACE,kBACA,gBACA,gCAEA,UACE,cACA,kBACA,6BACA,WACA,SACA,OACA,oBACA,qCAIJ,oCACE,iCAGF,wBACE,uCAIA,mBACA,mBACA,6BACA,0BACA,eAIJ,eACE,kBACA,gBVxoKM,eU0oKN,kBACA,sBACA,cACA,wBAEA,eACE,sBACA,qBAGF,SACE,qBAGF,eACE,gBACA,UACA,0BAGF,oBACE,sBACA,SACA,gCAEA,wBACE,0BACA,qBACA,sBACA,UACA,4BAKF,qBACE,CADF,gCACE,CADF,kBACE,kBACA,QACA,2BACA,yBAIJ,iBACE,UACA,SACA,OACA,QACA,sBACA,iFACA,eACA,UACA,4BACA,gCAEA,SACE,6EAKF,iBAEE,wBAIJ,YACE,kBACA,MACA,OACA,WACA,YACA,UACA,SACA,gBVrtKI,cFcY,gBY0sKhB,oBACA,+BAEA,aACE,oBACA,8GAEA,aAGE,+BAIJ,aACE,eACA,kCAGF,aACE,eACA,gBACA,4BAIJ,YACE,8BACA,oBACA,0DAEA,aACE,wBAIJ,cACE,mBACA,gBACA,uBACA,oCAGE,cACE,qCAKF,eACE,+BAIJ,sBACE,iBACA,eACA,SACA,0BACA,8GAEA,UVpxKE,+EU4xKN,cAGE,gBACA,6BAGF,UVnyKM,iBUqyKJ,yBAGF,oBACE,aACA,mDAGF,UV7yKM,uBUkzKN,cACE,YACA,eACA,8BAEA,UACE,WACA,+BAOA,6DANA,iBACA,cACA,kBACA,WACA,UACA,YAWA,CAVA,+BASA,kBACA,+BAGF,iBACE,UACA,kBACA,WACA,YACA,YACA,UACA,4BACA,mBACA,sCACA,oBACA,qBAIJ,gBACE,uBAEA,oBACE,eACA,gBACA,WVl2KE,sFUq2KF,yBAGE,qBAKN,cACE,YACA,kBACA,4BAEA,UACE,WACA,+BACA,kBACA,cACA,kBACA,WACA,SACA,2DAGF,aAEE,kBACA,WACA,kBACA,SACA,mBACA,6BAGF,6BACE,6BAGF,iBACE,UACA,UACA,kBACA,WACA,YACA,QACA,iBACA,4BACA,mBACA,sCACA,oBACA,CAGE,yFAKF,SACE,6GAQF,gBACE,oBACA,kBAON,UACE,cACA,+BACA,0BAEA,UACE,qCAGF,iBATF,QAUI,mBAIJ,qBACE,mBACA,uBAEA,YACE,kBACA,mBACA,gBACA,2BAEA,aACE,WACA,YACA,SACA,oBACA,CADA,8BACA,CADA,gBACA,uBAIJ,YACE,mBACA,mBACA,aACA,6BAEA,aACE,aACA,mBACA,qBACA,gBACA,qCAGF,UACE,eACA,cACA,+BAGF,aACE,WACA,YACA,gBACA,mCAEA,UACE,YACA,cACA,SACA,kBACA,mBACA,oBACA,CADA,8BACA,CADA,gBACA,qCAIJ,gBACE,gBACA,4CAEA,cACE,WV5/KF,gBU8/KE,gBACA,uBACA,0CAGF,aACE,eACA,cZx/KU,gBY0/KV,gBACA,uBACA,yBAKN,kBZ7gLiB,aY+gLf,mBACA,uBACA,gDAEA,YACE,cACA,eACA,mDAGF,qBACE,kBACA,gCACA,WACA,gBACA,mBACA,gBACA,uBACA,qDAEA,YACE,iEAEA,cACE,sDAIJ,YACE,6BAOV,YACE,eACA,gBACA,wBAGF,QACE,sBACA,cACA,kBACA,kBACA,gBACA,WACA,+BAEA,iBACE,QACA,SACA,+BACA,eACA,sDAIJ,kBAEE,gCACA,eACA,aACA,cACA,oEAEA,kBACE,SACA,SACA,6HAGF,aAEE,cACA,cZhlLgB,eYklLhB,eACA,gBACA,kBACA,qBACA,kBACA,yJAEA,aZvlLmB,qWY0lLjB,aAEE,WACA,kBACA,SACA,SACA,QACA,SACA,2BACA,CAEA,4CACA,CADA,kBACA,CADA,wBACA,iLAGF,WACE,6CACA,8GAKN,kBACE,gCACA,qSAKI,YACE,iSAGF,4CACE,cAOV,kBZjpLqB,sBYopLnB,iBACE,4BAGF,aACE,eAIJ,cACE,kBACA,qBACA,cACA,iBACA,eACA,mBACA,gBACA,uBACA,eACA,oEAEA,YAEE,sBAGF,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,8BAEA,oBACE,mBACA,2BAKN,eACE,gBAGF,eVvsLQ,kBY0BN,CACA,sBACA,gBACA,cdRiB,uCcUjB,mBAEA,adZiB,eccf,gBACA,mBACA,mBAGF,aACE,mBAGF,kBACE,mBAGF,eACE,WdlDI,UY4sLR,iBACE,cAEA,WACE,WACA,sCACA,CADA,6BACA,cAGF,cACE,iBACA,cZvsLmB,gBYysLnB,gBAEA,aZttLsB,0BYwtLpB,sBAEA,oBACE,4BAMR,GACE,cACA,eACA,WATM,mBAMR,GACE,cACA,eACA,qEAGF,kBAIE,sBAEE,8BACA,iBAGF,0BACE,kCACA,+BAIA,qDACE,uEACA,+CAGF,sBACE,8BACA,6DAIA,6BACE,6CACA,4EAIF,6BACE,6CACA,+CAOJ,gBAEE,+BAGF,gBACE,6CAEA,0BACE,wDAGF,eACE,6DAGF,iBACE,iBACA,2EAIA,mBACE,UACA,gCACA,WACA,0FAGF,mBACE,UACA,oCACA,eAOV,UACE,eACA,gBACA,iBAEA,YACE,gBACA,eACA,kBACA,sCAGF,YACE,4CAEA,kBACE,yDAGF,SACE,sBACA,cACA,WACA,SACA,aACA,gDACA,mBZr1Le,WEDb,eUy1LF,CACA,eACA,kBACA,2EAEA,QACE,wMAGF,mBAGE,+DAGF,kBACE,qCAGF,wDA7BF,cA8BI,4DAIJ,WACE,eACA,gBACA,SACA,kBACA,sBAMJ,sBACA,mBACA,6BACA,gCACA,+BAEA,iBACE,iBACA,cZt3Lc,CYy3Ld,eACA,eACA,oCAEA,aACE,gBACA,uBACA,oCAIJ,UACE,kBACA,uDAGF,iBACE,qDAGF,eACE,qBAKF,wBACA,aACA,2BACA,mBACA,mBACA,2BAEA,aACE,iCAEA,UACE,uCAEA,SACE,kCAKN,aACE,cACA,mBAIJ,cACE,kBACA,MACA,OACA,WACA,YACA,0BACA,cAGF,kBZn8LqB,sBYq8LnB,kBACA,uCACA,YACA,gBACA,qCAEA,aARF,SASI,kBAGF,cACE,mBACA,gBACA,eACA,kBACA,0BACA,6BAGF,WACE,6BAGF,yBACE,sCAEA,uBACE,uCACA,wBACA,wBAIJ,eACE,kDAIA,oBACE,+BAIJ,cACE,sBAGF,eACE,aAIJ,kBZz/LqB,sBY2/LnB,kBACA,uCACA,YACA,gBACA,qCAEA,YARF,SASI,uBAGF,kBACE,oBAGF,kBACE,YACA,0BACA,gBACA,mBAGF,YACE,gCACA,4BAGF,YACE,iCAGF,aACE,gBACA,qBACA,eACA,aACA,cAIJ,iBACE,YACA,gBACA,YACA,aACA,uBACA,mBACA,gBV3iMM,yDU8iMN,aAGE,gBACA,WACA,YACA,SACA,sBACA,CADA,gCACA,CADA,kBACA,gBVtjMI,uBU0jMN,iBACE,YACA,aACA,+BACA,iEACA,kBACA,wCACA,uBAGF,iBACE,WACA,YACA,MACA,OACA,uBAGF,iBACE,YACA,WACA,UACA,YACA,4BACA,6BAEA,UACE,8BAGF,UVvlMI,eUylMF,gBACA,cACA,kBACA,2BAGF,iBACE,mCACA,qCAIJ,oCACE,eAEE,uBAGF,YACE,4BAKN,aZpmMoB,eYsmMlB,gBACA,gBACA,kBACA,qBACA,6BAEA,kBACE,wCAEA,eACE,6BAIJ,aACE,0BACA,mCAEA,oBACE,kBAKN,eACE,2BAEA,UACE,8FAEA,8BAEE,CAFF,sBAEE,wBAIJ,iBACE,SACA,UACA,yBAGF,eACE,aACA,kBACA,mBACA,6BAEA,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,uBAIJ,iBACE,mBACA,YACA,gCACA,+BAEA,aACE,cACA,WACA,iBACA,gDAEA,kBACE,yBACA,wBAKN,YACE,uBACA,gBACA,iBACA,iCAEA,YACE,mBACA,iBACA,gBACA,8CAEA,wBACE,kBACA,uBACA,YACA,yCAGF,YACE,8BAIJ,WACE,4CAEA,kBACE,wCAGF,UACE,YACA,iCAGF,cACE,iBACA,WVruMA,gBUuuMA,gBACA,mBACA,uBACA,uCAEA,aACE,eACA,cZjuMU,gBYmuMV,gBACA,uBACA,gCAKN,aACE,uBAIJ,eACE,cACA,iDAGE,qBACA,WVlwME,gDUswMJ,QACE,6BACA,kDAEA,aACE,yEAGF,uBACE,4DAGF,aVjxMU,yBUuxMd,cACE,gCAEA,cACE,cZ/wMc,eYixMd,kCAEA,oBACE,cZpxMY,qBYsxMZ,iBACA,gBACA,yCAEA,eACE,WVxyMF,iBUizMN,aZnyMgB,mBYqyMd,gCACA,gBACA,aACA,eACA,eACA,qBAEA,oBACE,iBACA,eAIJ,YACE,mBACA,aACA,gCACA,0BAEA,eACE,qBAGF,aACE,cZ7zMY,gBY+zMZ,uBACA,mBACA,4BAEA,eACE,uBAGF,aZx0Mc,qBY00MZ,eACA,gBACA,cACA,gBACA,uBACA,mBACA,qGAKE,yBACE,wBAMR,aACE,eACA,iBACA,gBACA,iBACA,mBACA,gBACA,cZj2MiB,0BYq2MnB,aACE,WACA,2CAEA,mCACE,yBACA,0CAGF,wBACE,eAMR,YACE,gCACA,CACA,iBACA,qBAEA,kBACE,UACA,uBAGF,aACE,CACA,sBACA,kBACA,uBAGF,oBACE,mBZn5MsB,kBYq5MtB,cACA,eACA,wBACA,wBAGF,aACE,CACA,0BACA,gBACA,8BAEA,eACE,aACA,2BACA,8BACA,uCAGF,cACE,cZh6Mc,kBYk6Md,+BAGF,aZr6MgB,eYu6Md,mBACA,gBACA,uBACA,kBACA,gBACA,YACA,iCAEA,UV57ME,qBU87MA,oHAEA,yBAGE,0BAKN,qBACE,uBAIJ,kBACE,6BAEA,kBACE,oDAGF,eACE,6DAGF,UVx9MI,OaFR,eACE,eACA,UAEA,kBACE,kBACA,cAGF,iBACE,MACA,OACA,YACA,qBACA,kBACA,mBACA,sBAEA,kBfLiB,aeUnB,iBACE,aACA,cACA,iBACA,eACA,gBACA,gEAEA,YAEE,gCAGF,aACE,8BAGF,aACE,sBACA,WACA,eACA,Wf3CE,Ue6CF,oBACA,gBb7CE,yBa+CF,kBACA,iBACA,oCAEA,oBf/CoB,wBeoDtB,cACE,sBAGF,YACE,mBACA,iBACA,cAIJ,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,gBACA,mBACA,cACA,uBAEA,iBACE,qBAGF,oBbtFY,8Ea2FZ,gBAGE,gBACA,gCAGF,mBACE,SACA,wCAGF,mBAEE,eAIJ,oBACE,WACA,gBACA,CACA,oBACA,iBACA,gBACA,mBACA,cACA,mBAGF,UACE,iBACA,eAGF,eACE,mBACA,cfnHc,aeuHhB,cACE,uBACA,UACA,SACA,SACA,cf5Hc,0Be8Hd,kBACA,mBAEA,oBACE,sCAGF,qCAEE,eAIJ,WACE,eACA,kBACA,eACA,6BAIJ,4BACE,gCAEA,YACE,2CAGF,4BACE,aACA,aACA,mBACA,mGAEA,YAEE,+GAEA,oBf9KoB,sDeoLxB,cACE,gBACA,iBACA,YACA,oBACA,cf5KkB,sCe+KlB,gCAGF,YACE,mBACA,4CAEA,aACE,wBACA,iBACA,oCAIJ,uBACE,CADF,oBACE,CADF,eACE,sBACA,eACA,WflNI,qBeoNJ,WACA,UACA,oBACA,qXACA,yBACA,kBACA,CACA,yBACA,mDAGF,aACE,cAIJ,afrNkB,qBewNhB,+BACE,6BAEA,6BACE,eC5ON,k1BACE,aACA,sBACA,aACA,UACA,yBAGF,YACE,OACA,sBACA,yBACA,2BAEA,MACE,iBACA,qCAIJ,gBACE,YACE,cCtBJ,cACE,qBACA,WjBDM,2BiBIN,qBAEE,iBACA,+BAGF,WACE,iBAIJ,sBACE,6BAEA,uBACE,2BACA,4BACA,mBjBjBsB,4BiBqBxB,oBACE,8BACA,+BACA,aACA,qBAIJ,YACE,8BACA,cACA,cjBfmB,ciBiBnB,oBAGF,iBACE,OACA,kBACA,iBACA,gBACA,8BACA,eACA,0BAEA,aACE,6BAIJ,ajBlD0B,mCiBqDxB,aACE,oDAGF,WACE,wBAIJ,iBACE,YACA,OACA,WACA,WACA,yBjBnEwB,uBiBwExB,oBACE,WACA,eACA,yBAGF,iBACE,gBACA,oBAIJ,iBACE,aACA,gBACA,kBACA,gBf5FM,sBe8FN,sGAEA,+BAEE,oBAKF,2BACA,gBfxGM,0Be2GN,cACE,gBACA,gBACA,oBACA,cACA,WACA,gCACA,WjBnHI,yBiBqHJ,kBACA,4CAEA,QACE,2GAGF,mBAGE,wCAKN,cACE,6CAEA,SACE,kBACA,kBACA,qDAGF,SACE,WACA,kBACA,MACA,OACA,WACA,YACA,sCACA,mBACA,4BAIJ,SACE,kBACA,wBACA,gBACA,MACA,iCAEA,aACE,WACA,gBACA,gBACA,gBfpKI,mBeyKR,iBACE,qBACA,YACA,wBAEA,UACE,YACA,wBAIJ,cACE,kBACA,iBACA,cjBlKiB,mDiBqKjB,YACE,qDAGF,eACE,uDAGF,YACE,qBAIJ,YACE,YCrMF,qBACE,iBANc,cAQd,kBACA,sCAEA,WANF,UAOI,eACA,mBAIJ,iDACE,eACA,gBACA,gBACA,qBACA,clBPkB,oBkBUlB,alBnBwB,0BkBqBtB,6EAEA,oBAGE,wCAIJ,alBrBkB,oBkB0BlB,YACE,oBACA,+BAEA,eACE,yBAIJ,eACE,clBlCmB,qBkBsCrB,iBACE,clBvCmB,uBkB2CrB,eACE,mBACA,kBACA,kBACA,yHAGF,4CAME,mBACA,oBACA,gBACA,clB3DmB,qBkB+DrB,aACE,qBAGF,gBACE,qBAGF,eACE,qBAGF,gBACE,yCAGF,aAEE,qBAGF,eACE,qBAGF,kBACE,yCAMA,iBACA,iBACA,yDAEA,2BACE,yDAGF,2BACE,qBAIJ,UACE,SACA,SACA,gCACA,eACA,4BAEA,UACE,SACA,wBAIJ,UACE,yBACA,8BACA,CADA,iBACA,gBACA,mBACA,iEAEA,+BAEE,cACA,kBACA,gBACA,gBACA,clBxIc,iCkB4IhB,uBACE,gBACA,gBACA,clB9IY,qDkBkJd,WAEE,iBACA,kBACA,qBACA,mEAEA,SACE,kBACA,iFAEA,gBACE,kBACA,6EAGF,iBACE,SACA,UACA,mBACA,gBACA,uBACA,+BAMR,YACE,oBAIJ,kBACE,eACA,mCAEA,iBACE,oBACA,8BAGF,YACE,8BACA,eACA,6BAGF,UACE,kDACA,eACA,iBACA,WhBpNI,iBgBsNJ,kBACA,qEAEA,aAEE,6CAIA,alBhNiB,oCkBqNnB,4CACE,gBACA,eACA,iBACA,qCAGF,4BA3BF,iBA4BI,4BAIJ,iBACE,YACA,sBACA,mBACA,CACA,sBACA,0BACA,QACA,aACA,yCAEA,4CACE,eACA,iBACA,gBACA,clBlPc,mBkBoPd,mBACA,gCACA,uBACA,mBACA,gBACA,wFAEA,eAEE,cACA,2CAGF,oBACE,2BAKN,iBACE,mCAEA,UACE,YACA,CACA,kBACA,uCAEA,aACE,WACA,YACA,mBACA,iCAIJ,cACE,mCAEA,aACE,WhBzSA,qBgB2SA,uDAGE,yBACE,2CAKN,aACE,clBxSY,kCkBgTlB,iDAEE,CACA,eACA,eACA,iBACA,mBACA,clBvTgB,sCkB0ThB,alBnUsB,0BkBqUpB,kBAIJ,cACE,SACA,UACA,gBACA,uBACA,oBACA,kBACA,oBACA,cACA,kBAGF,4CACE,eACA,iBACA,gBACA,mBACA,clB/UmB,wBkBkVnB,iDACE,cACA,eACA,gBACA,cACA,kBAIJ,4CACE,eACA,iBACA,gBACA,mBACA,clBhWmB,kBkBqWnB,clBrWmB,mCkBoWrB,4CACE,CACA,gBACA,gBACA,mBACA,clBzWmB,kBkB8WnB,clB9WmB,kBkBuXnB,clBvXmB,mCkBsXrB,4CACE,CACA,gBACA,gBACA,mBACA,clB3XmB,kBkBgYnB,clBhYmB,mCkBwYrB,gBAEE,mDAEA,2BACE,mDAGF,2BACE,kBAIJ,eACE,kBAGF,kBACE,yCAGF,cAEE,kBAGF,UACE,SACA,SACA,4CACA,cACA,yBAEA,UACE,SACA,iDAIJ,YAEE,+BAGF,kBlBlcmB,kBkBocjB,kBACA,gBACA,sBACA,oCAEA,UACE,aACA,2BACA,iBACA,8BACA,mBACA,uDAGF,YACE,yBACA,qBACA,mFAEA,aACE,eACA,qCAGF,sDAVF,UAWI,8BACA,6CAIJ,MACE,sBACA,qCAEA,2CAJF,YAKI,sBAKN,iBACE,yBAEA,WACE,WACA,uBACA,4BAIJ,iBACE,mBACA,uCAEA,eACE,mCAGF,eACE,cACA,qCAGF,eACE,UACA,mDAEA,kBACE,aACA,iBACA,0FAKE,oBACE,gFAIJ,cACE,qDAIJ,aACE,cACA,6CAGF,UACE,YACA,0BACA,mDAGF,cACE,4DAEA,cACE,qCAKN,oCACE,eACE,sCAIJ,2BA7DF,iBA8DI,mFAIJ,qBAGE,mBlB3jBiB,kBkB6jBjB,kCACA,uBAGF,YACE,kBACA,WACA,YACA,2BAEA,YACE,WACA,uCAKF,YACE,eACA,mBACA,mBACA,qCAGF,sCACE,kBACE,uCAIJ,alB7kBmB,qCkBilBnB,eACE,WhBjmBE,gBgBmmBF,2CAEA,alBxlBc,gDkB2lBZ,alBzlBe,+CkB+lBnB,eACE,qBAIJ,kBACE,yBAEA,aACE,SACA,eACA,YACA,kBACA,qCAIJ,gDAEI,kBACE,yCAGF,eACE,gBACA,WACA,kBACA,uDAEA,iBACE,sCAMR,8BACE,aACE,uCAEA,gBACE,sDAGF,kBACE,6EAIJ,aAEE,qBAIJ,WACE,UAIJ,mBACE,qCAEA,SAHF,eAII,kBAGF,YACE,uBACA,mBACA,aACA,qBAEA,ShBvrBI,YgByrBF,qCAGF,gBAXF,SAYI,mBACA,sBAIJ,eACE,uBACA,gBACA,gBACA,uBAGF,eACE,gBACA,0BAEA,YACE,gBACA,eACA,clBnsBc,6BkBusBhB,eACE,iBACA,+BAGF,kBlBxtBiB,akB0tBf,0BACA,aACA,uCAEA,YACE,gCAIJ,cACE,gBACA,uDAEA,YACE,mBACA,iDAGF,UACE,YACA,0BACA,gCAIJ,YACE,uCAEA,4CACE,eACA,gBACA,cACA,qCAGF,cACE,clBlvBY,uFkBwvBlB,eACE,cASA,ClBlwBgB,2CkB+vBhB,iBACA,CACA,kBACA,gBAGF,eACE,cACA,aACA,kDACA,cACA,qCAEA,eAPF,oCAQI,cACA,8BAEA,UACE,aACA,sBACA,0CAEA,OACE,cACA,2CAGF,YACE,mBACA,QACA,cACA,qCAIJ,UACE,2BAGF,eACE,sCAIJ,eAtCF,UAuCI,6BAEA,aACE,gBACA,gBACA,2GAEA,eAGE,uFAIJ,+BAGE,2BAGF,YACE,gCAEA,eACE,qEAEA,eAEE,gBACA,2CAGF,eACE,SAQZ,iBACE,qBACA,iBAGF,aACE,kBACA,aACA,UACA,YACA,clB12BsB,qBkB42BtB,eACA,qCAEA,gBAVF,eAWI,WACA,gBACA,clBt2Bc,SmBhBlB,UACE,eACA,iBACA,yBACA,qBAEA,WAEE,iBACA,mBACA,6BACA,gBACA,mBACA,oBAGF,qBACE,gCACA,aACA,gBACA,oBAGF,eACE,qEAGF,kBnBxBmB,UmB6BnB,anB1BwB,0BmB4BtB,gBAEA,oBACE,eAIJ,eACE,CAII,4HADF,eACE,+FAOF,sBAEE,yFAKF,YAEE,gCAMJ,kBnBjEiB,6BmBmEf,gCACA,4CAEA,qBACE,8BACA,2CAGF,uBACE,+BACA,0BAKN,qBACE,gBAIJ,aACE,mBACA,MAGF,+CACE,0BAGF,sBACE,SACA,aACA,8CAGF,oBAEE,qBACA,iBACA,eACA,cnB/FkB,gBmBiGlB,0DAEA,UjBhHM,wDiBoHN,eACE,iBACA,sEAGF,cACE,yCAKF,YAEE,yDAEA,qBACE,iBACA,eACA,gBACA,qEAEA,cACE,2EAGF,YACE,mBACA,uFAEA,YACE,qHAOJ,sBACA,cACA,uBAIJ,wBACE,mBnB/JiB,sBmBiKjB,YACA,mBACA,gCAEA,gBACE,mBACA,oBAIJ,YACE,yBACA,aACA,mBnB9KiB,gCmBiLjB,aACE,gBACA,mBAIJ,wBACE,aACA,mBACA,qCAEA,wCACE,4BACE,0BAIJ,kBACE,iCAGF,kBnBtMiB,uCmByMf,kBACE,4BAIJ,gBACE,oBACA,sCAEA,SACE,wCAGF,YACE,mBACA,mCAGF,aACE,aACA,uBACA,mBACA,kBACA,6CAEA,UACE,YACA,kCAIJ,aACE,mCAGF,aACE,iBACA,cnBlOY,gBmBoOZ,mCAIJ,QACE,WACA,qCAEA,sBACE,gBACA,qCAOJ,4FAFF,YAGI,gCAIJ,aACE,uCAEA,iBACE,sCAGF,eACE,4BAIJ,wBACE,aACA,gBACA,qCAEA,2BALF,4BAMI,sCAIJ,+CACE,YACE,iBC7RN,YACE,uBACA,WACA,iBACA,iCAEA,gBACE,gBACA,oBACA,cACA,wCAEA,YACE,yBACA,mBpBfe,YoBiBf,yBAIJ,WAvBc,UAyBZ,oBACA,iCAEA,YACE,mBACA,YACA,uCAEA,aACE,yCAEA,oBACE,aACA,2CAGF,SlBxCA,YkB0CE,kBACA,YACA,uCAIJ,aACE,cpBpCY,qBoBsCZ,cACA,eACA,aACA,0HAIA,kBAGE,+BAKN,aACE,iBACA,YACA,aACA,qCAGF,sCACE,YACE,6BAIJ,eACE,0BACA,gBACA,mBACA,qCAEA,2BANF,eAOI,+BAGF,aACE,aACA,cpB9EY,qBoBgFZ,0BACA,2CACA,0BACA,mBACA,gBACA,uBACA,mCAEA,gBACE,oCAGF,UlBzGA,yBkB2GE,0BACA,2CACA,uCAGF,kBACE,sBACA,+BAIJ,kBACE,wBACA,SACA,iCAEA,QACE,kBACA,6DAIJ,UlBjIE,yBFWa,gBoByHb,gBACA,mEAEA,wBACE,6DAKN,yBACE,iCAIJ,qBACE,WACA,gBApJY,cAsJZ,sCAGF,uCACE,YACE,iCAGF,WA/JY,cAiKV,sCAIJ,gCACE,UACE,0BAMF,2BACA,qCAEA,wBALF,cAMI,CACA,sBACA,kCAGF,YACE,oBAEA,gCACA,0BAEA,eAEA,mBACA,8BACA,mCAEA,eACE,kBACA,yCAGF,mBACE,4DAEA,eACE,qCAIJ,gCAzBF,eA0BI,iBACA,6BAIJ,apBrMmB,eoBuMjB,iBACA,gBACA,qCAEA,2BANF,eAOI,6BAIJ,apBhNmB,eoBkNjB,iBACA,gBACA,mBACA,4BAGF,cACE,gBACA,cpB5Nc,mBoB8Nd,kBACA,gCACA,4BAGF,cACE,cpBlOiB,iBoBoOjB,gBACA,0CAGF,UlBvPI,gBkByPF,uFAGF,eAEE,gEAGF,aACE,4CAGF,cACE,gBACA,WlBvQE,oBkByQF,iBACA,gBACA,gBACA,2BAGF,cACE,iBACA,cpBlQiB,mBoBoQjB,kCAEA,UlBrRE,gBkBuRA,CAII,2NADF,eACE,4BAMR,UACE,SACA,SACA,4CACA,cACA,mCAEA,UACE,SACA,qCAKN,eA7SF,aA8SI,iCAEA,YACE,yBAGF,UACE,UACA,YACA,iCAEA,YACE,4BAGF,YACE,8DAGF,eAEE,gCACA,gBACA,0EAEA,eACE,+BAIJ,eACE,6DAGF,2BpBvUe,YoB8UrB,UACE,SACA,cACA,WACA,sDAKA,apBrVkB,0DoBwVhB,apBjWsB,4DoBsWxB,alBzWc,gBkB2WZ,4DAGF,alB7WU,gBkB+WR,0DAGF,apBtWgB,gBoBwWd,0DAGF,alBrXU,gBkBuXR,UAIJ,YACE,eACA,yBAEA,aACE,qBACA,oCAEA,kBACE,4BAGF,cACE,gBACA,+BAEA,oBACE,iBACA,gCAIJ,eACE,eACA,CAII,iNADF,eACE,2BAKN,oBACE,cpBpZc,qBoBsZd,eACA,gBACA,gCACA,iCAEA,UlBxaE,gCkB0aA,oCAGF,apBzaoB,gCoB2alB,CAkBJ,gBAIJ,aACE,iBACA,eACA,sBAGF,aACE,eACA,cACA,wBAEA,aACE,kBAIJ,YACE,eACA,mBACA,wBAGF,YACE,WACA,sBACA,aACA,+BAEA,aACE,qBACA,gBACA,eACA,iBACA,cpBvdmB,CoB4df,4MADF,eACE,sCAKN,aACE,gCAIJ,YAEE,mBACA,kEAEA,UACE,kBACA,4BACA,gFAEA,iBACE,kDAKN,aAEE,aACA,sBACA,4EAEA,cACE,WACA,kBACA,mBACA,uEAIJ,cAEE,iBAGF,YACE,eACA,kBACA,2CAEA,kBACE,eACA,8BAGF,kBACE,+CAGF,gBACE,uDAEA,gBACE,mBACA,YACA,YAKN,kBACE,eACA,cAEA,apBjjBwB,qBoBmjBtB,oBAEA,yBACE,SAKN,aACE,YAGF,kBACE,iBACA,oBAEA,YACE,2BACA,mBACA,aACA,mBpB1kBiB,cAYD,0BoBikBhB,eACA,kBACA,oBAGF,iBACE,4BAEA,aACE,SACA,kBACA,WACA,YACA,qBAIJ,2BACE,mBAGF,oBACE,uBAGF,apBzlBgB,oBoB6lBhB,kBACE,0BACA,aACA,cpBjmBgB,gDoBmmBhB,eACA,qBACA,gBACA,kBAGF,cACE,kBACA,cpB1mBc,2BoB8mBhB,iBACE,SACA,WACA,WACA,YACA,kBACA,oCAEA,kBlBnoBY,oCkBuoBZ,kBACE,mCAGF,kBpBjoBiB,sDoBsoBnB,apBloBqB,qBoBsoBnB,gBACA,sBAGF,aACE,0BAGF,apB9oBqB,sBoBkpBrB,alBhqBc,yDkBqqBhB,oBAIE,cpB3pBqB,iGoB8pBrB,eACE,yIAIA,4BACE,cACA,iIAGF,8BACE,CADF,sBACE,WACA,sBAKN,YAEE,mBACA,sCAEA,aACE,CACA,gBACA,kBACA,0DAIA,8BACE,CADF,sBACE,WACA,gBAKN,kBACE,8BACA,yBAEA,yBlBrtBc,yBkBytBd,yBACE,wBAGF,yBlB1tBU,wBkB+tBR,2BACA,eACA,iBACA,4BACA,kBACA,gBACA,0BAEA,apB9tBgB,uBoBouBhB,wBACA,qBAGF,apBvuBgB,coB4uBlB,kBpBzvBqB,kBoB2vBnB,mBACA,uBAEA,YACE,8BACA,mBACA,aACA,gCAEA,SACE,SACA,gDAEA,aACE,8BAIJ,aACE,gBACA,cpBnwBc,iBoBqwBd,gCAEA,aACE,qBACA,iHAEA,aAGE,mCAIJ,alB7xBM,6BkBoyBR,YACE,2BACA,6BACA,mCAEA,kBACE,gFAGF,YAEE,cACA,sBACA,YACA,cpBvyBY,mLoB0yBZ,kBAEE,gBACA,uBACA,sCAIJ,aACE,6BACA,4CAEA,apBrzBU,iBoBuzBR,gBACA,wCAIJ,aACE,sBACA,WACA,aACA,qBACA,cpBl0BY,WoBy0BpB,kBAGE,0BAFA,eACA,uBASA,CARA,eAGF,oBACE,gBACA,CAEA,qBACA,oBAGF,YACE,eACA,CACA,kBACA,wBAEA,qBACE,cACA,mBACA,aACA,0FAGF,kBAEE,kBACA,YACA,6CAGF,QACE,SACA,+CAEA,aACE,sEAGF,uBACE,yDAGF,alBn4BY,8CkBw4Bd,qBACE,aACA,WlB34BI,ckBg5BR,iBACE,sBCn5BF,YACE,eACA,CACA,kBACA,0BAEA,qBACE,iBACA,cACA,mBACA,yDAEA,YAEE,mBACA,kBACA,sBACA,YACA,4BAGF,oBACE,cACA,cACA,qGAEA,kBAGE,sDAKN,iBAEE,gBACA,eACA,iBACA,WnBrCI,6CmBuCJ,mBACA,iBACA,4BAGF,cACE,6BAGF,cACE,crBpCgB,kBqBsChB,gBACA,qBAIJ,YACE,eACA,cACA,yBAEA,gBACE,mBACA,6BAEA,aACE,sCAIJ,arBnEwB,gBqBqEtB,qBACA,UC3EJ,aACE,gCAEA,gBACE,eACA,mBACA,+BAGF,cACE,iBACA,8CAGF,aACE,kBACA,wBAGF,gBACE,iCAGF,aACE,kBACA,uCAGF,oBACE,gDAGF,SACE,YACA,8BAGF,cACE,iBACA,mEAGF,aACE,kBACA,2DAGF,cAEE,gBACA,mFAGF,cACE,gBACA,mCAGF,aACE,iBACA,yBAGF,kBACE,kBACA,4BAGF,UACE,UACA,wBAGF,aACE,kCAGF,MACE,WACA,cACA,mBACA,2CAGF,aACE,iBACA,0CAGF,gBACE,eACA,mCAGF,WACE,sCAGF,gBACE,gBACA,yCAGF,UACE,iCAGF,aACE,iBACA,0BAGF,SACE,WACA,0DAGF,iBAEE,mBACA,4GAGF,iBAEE,gBACA,uCAGF,kBACE,eACA,2BAGF,aACE,kBACA,wCAGF,SACE,YACA,yDAGF,SACE,WACA,CAKA,oFAGF,UACE,OACA,uGAGF,UAEE,uCAIA,cACE,iBACA,kEAEA,cACE,gBACA,qCAKN,WACE,eACA,iBACA,uCAGF,WACE,sCAGF,aACE,kBACA,0CAGF,gBACE,eACA,uDAGF,gBACE,2CAGF,cACE,iBACA,YACA,yEAGF,aAEE,iBACA,iBAGF,wBACE,iBAGF,SACE,oBACA,yBAGF,aACE,8EAGF,cAEE,gBACA,oDAGF,cACE,mBACA,gEAGF,iBACE,gBACA,CAMA,8KAGF,SACE,QACA,yDAGF,kBACE,eACA,uDAGF,kBACE,gBACA,qDAGF,SACE,QACA,8FAGF,cAEE,mBACA,4CAGF,UACE,SACA,kDAEA,UACE,OACA,kEACA,8BAIJ,sXACE,uCAGF,gBAEE,kCAGF,cACE,iBACA,gDAGF,UACE,UACA,gEAGF,aACE,uDAGF,WACE,WACA,uDAGF,UACE,WACA,uDAGF,UACE,WACA,kDAGF,MACE,0CAGF,iBACE,yBACA,qDAGF,cACE,iBACA,qCAGF,kCACE,gBAEE,kBACA,2DAEA,gBACE,mBACA,uEAKF,gBAEE,kBACA,gFAKN,cAEE,gBACA,6CAKE,eACE,eACA,sDAIJ,aACE,kBACA,4DAKF,cACE,gBACA,8DAGF,gBACE,eACA,mCAIJ,aACE,kBACA,iBACA,kCAGF,WACE,mCAGF,WACE,oCAGF,cACE,gBACA,gFAGF,cACE,mBACA,+DAGF,SACE,QACA,kkEC7ZJ,kIACE,CADF,sIACE,qBACA,2GCEQ,SACE,CDHV,iGCEQ,SACE,CDHV,qGCEQ,SACE,CDHV,sGCEQ,SACE,CDHV,4FCEQ,SACE,mJAQZ,aAME,0BACA,mMAEA,oBACE,iOAGF,yBACE,CAKE,0zCAIJ,oBAGE,uUAGF,axB3BqB,qBwB6BnB,oCAIJ,yBACE,6HAEA,oBAGE,4BAIJ,yBACE,qGAEA,oBAGE,eAIJ,axBvDoB,yEwB2DpB,+BACE,0D","file":"skins/vanilla/contrast/common.css","sourcesContent":["html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:\"\";content:none}table{border-collapse:collapse;border-spacing:0}html{scrollbar-color:#313543 rgba(0,0,0,.1)}::-webkit-scrollbar{width:12px;height:12px}::-webkit-scrollbar-thumb{background:#313543;border:0px none #fff;border-radius:50px}::-webkit-scrollbar-thumb:hover{background:#353a49}::-webkit-scrollbar-thumb:active{background:#313543}::-webkit-scrollbar-track{border:0px none #fff;border-radius:0;background:rgba(0,0,0,.1)}::-webkit-scrollbar-track:hover{background:#282c37}::-webkit-scrollbar-track:active{background:#282c37}::-webkit-scrollbar-corner{background:transparent}body{font-family:\"mastodon-font-sans-serif\",sans-serif;background:#191b22;font-size:13px;line-height:18px;font-weight:400;color:#fff;text-rendering:optimizelegibility;font-feature-settings:\"kern\";text-size-adjust:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-tap-highlight-color:transparent}body.system-font{font-family:system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"Oxygen\",\"Ubuntu\",\"Cantarell\",\"Fira Sans\",\"Droid Sans\",\"Helvetica Neue\",\"mastodon-font-sans-serif\",sans-serif}body.app-body{padding:0}body.app-body.layout-single-column{height:auto;min-height:100vh;overflow-y:scroll}body.app-body.layout-multiple-columns{position:absolute;width:100%;height:100%}body.app-body.with-modals--active{overflow-y:hidden}body.lighter{background:#282c37}body.with-modals{overflow-x:hidden;overflow-y:scroll}body.with-modals--active{overflow-y:hidden}body.player{text-align:center}body.embed{background:#313543;margin:0;padding-bottom:0}body.embed .container{position:absolute;width:100%;height:100%;overflow:hidden}body.admin{background:#1f232b;padding:0}body.error{position:absolute;text-align:center;color:#dde3ec;background:#282c37;width:100%;height:100%;padding:0;display:flex;justify-content:center;align-items:center}body.error .dialog{vertical-align:middle;margin:20px}body.error .dialog__illustration img{display:block;max-width:470px;width:100%;height:auto;margin-top:-120px}body.error .dialog h1{font-size:20px;line-height:28px;font-weight:400}button{font-family:inherit;cursor:pointer}button:focus{outline:none}.app-holder,.app-holder>div,.app-holder>noscript{display:flex;width:100%;align-items:center;justify-content:center;outline:0 !important}.app-holder>noscript{height:100vh}.layout-single-column .app-holder,.layout-single-column .app-holder>div{min-height:100vh}.layout-multiple-columns .app-holder,.layout-multiple-columns .app-holder>div{height:100%}.error-boundary,.app-holder noscript{flex-direction:column;font-size:16px;font-weight:400;line-height:1.7;color:#e25169;text-align:center}.error-boundary>div,.app-holder noscript>div{max-width:500px}.error-boundary p,.app-holder noscript p{margin-bottom:.85em}.error-boundary p:last-child,.app-holder noscript p:last-child{margin-bottom:0}.error-boundary a,.app-holder noscript a{color:#2b90d9}.error-boundary a:hover,.error-boundary a:focus,.error-boundary a:active,.app-holder noscript a:hover,.app-holder noscript a:focus,.app-holder noscript a:active{text-decoration:none}.error-boundary__footer,.app-holder noscript__footer{color:#c2cede;font-size:13px}.error-boundary__footer a,.app-holder noscript__footer a{color:#c2cede}.error-boundary button,.app-holder noscript button{display:inline;border:0;background:transparent;color:#c2cede;font:inherit;padding:0;margin:0;line-height:inherit;cursor:pointer;outline:0;transition:color 300ms linear;text-decoration:underline}.error-boundary button:hover,.error-boundary button:focus,.error-boundary button:active,.app-holder noscript button:hover,.app-holder noscript button:focus,.app-holder noscript button:active{text-decoration:none}.error-boundary button.copied,.app-holder noscript button.copied{color:#79bd9a;transition:none}.container-alt{width:700px;margin:0 auto;margin-top:40px}@media screen and (max-width: 740px){.container-alt{width:100%;margin:0}}.logo-container{margin:100px auto 50px}@media screen and (max-width: 500px){.logo-container{margin:40px auto 0}}.logo-container h1{display:flex;justify-content:center;align-items:center}.logo-container h1 svg{fill:#fff;height:42px;margin-right:10px}.logo-container h1 a{display:flex;justify-content:center;align-items:center;color:#fff;text-decoration:none;outline:0;padding:12px 16px;line-height:32px;font-family:\"mastodon-font-display\",sans-serif;font-weight:500;font-size:14px}.compose-standalone .compose-form{width:400px;margin:0 auto;padding:20px 0;margin-top:40px;box-sizing:border-box}@media screen and (max-width: 400px){.compose-standalone .compose-form{width:100%;margin-top:0;padding:20px}}.account-header{width:400px;margin:0 auto;display:flex;font-size:13px;line-height:18px;box-sizing:border-box;padding:20px 0;padding-bottom:0;margin-bottom:-30px;margin-top:40px}@media screen and (max-width: 440px){.account-header{width:100%;margin:0;margin-bottom:10px;padding:20px;padding-bottom:0}}.account-header .avatar{width:40px;height:40px;margin-right:8px}.account-header .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px}.account-header .name{flex:1 1 auto;color:#ecf0f4;width:calc(100% - 88px)}.account-header .name .username{display:block;font-weight:500;text-overflow:ellipsis;overflow:hidden}.account-header .logout-link{display:block;font-size:32px;line-height:40px;margin-left:8px}.grid-3{display:grid;grid-gap:10px;grid-template-columns:3fr 1fr;grid-auto-columns:25%;grid-auto-rows:max-content}.grid-3 .column-0{grid-column:1/3;grid-row:1}.grid-3 .column-1{grid-column:1;grid-row:2}.grid-3 .column-2{grid-column:2;grid-row:2}.grid-3 .column-3{grid-column:1/3;grid-row:3}@media screen and (max-width: 415px){.grid-3{grid-gap:0;grid-template-columns:minmax(0, 100%)}.grid-3 .column-0{grid-column:1}.grid-3 .column-1{grid-column:1;grid-row:3}.grid-3 .column-2{grid-column:1;grid-row:2}.grid-3 .column-3{grid-column:1;grid-row:4}}.grid-4{display:grid;grid-gap:10px;grid-template-columns:repeat(4, minmax(0, 1fr));grid-auto-columns:25%;grid-auto-rows:max-content}.grid-4 .column-0{grid-column:1/5;grid-row:1}.grid-4 .column-1{grid-column:1/4;grid-row:2}.grid-4 .column-2{grid-column:4;grid-row:2}.grid-4 .column-3{grid-column:2/5;grid-row:3}.grid-4 .column-4{grid-column:1;grid-row:3}.grid-4 .landing-page__call-to-action{min-height:100%}.grid-4 .flash-message{margin-bottom:10px}@media screen and (max-width: 738px){.grid-4{grid-template-columns:minmax(0, 50%) minmax(0, 50%)}.grid-4 .landing-page__call-to-action{padding:20px;display:flex;align-items:center;justify-content:center}.grid-4 .row__information-board{width:100%;justify-content:center;align-items:center}.grid-4 .row__mascot{display:none}}@media screen and (max-width: 415px){.grid-4{grid-gap:0;grid-template-columns:minmax(0, 100%)}.grid-4 .column-0{grid-column:1}.grid-4 .column-1{grid-column:1;grid-row:3}.grid-4 .column-2{grid-column:1;grid-row:2}.grid-4 .column-3{grid-column:1;grid-row:5}.grid-4 .column-4{grid-column:1;grid-row:4}}@media screen and (max-width: 415px){.public-layout{padding-top:48px}}.public-layout .container{max-width:960px}@media screen and (max-width: 415px){.public-layout .container{padding:0}}.public-layout .header{background:#393f4f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;height:48px;margin:10px 0;display:flex;align-items:stretch;justify-content:center;flex-wrap:nowrap;overflow:hidden}@media screen and (max-width: 415px){.public-layout .header{position:fixed;width:100%;top:0;left:0;margin:0;border-radius:0;box-shadow:none;z-index:110}}.public-layout .header>div{flex:1 1 33.3%;min-height:1px}.public-layout .header .nav-left{display:flex;align-items:stretch;justify-content:flex-start;flex-wrap:nowrap}.public-layout .header .nav-center{display:flex;align-items:stretch;justify-content:center;flex-wrap:nowrap}.public-layout .header .nav-right{display:flex;align-items:stretch;justify-content:flex-end;flex-wrap:nowrap}.public-layout .header .brand{display:block;padding:15px}.public-layout .header .brand svg{display:block;height:18px;width:auto;position:relative;bottom:-2px;fill:#fff}@media screen and (max-width: 415px){.public-layout .header .brand svg{height:20px}}.public-layout .header .brand:hover,.public-layout .header .brand:focus,.public-layout .header .brand:active{background:#42485a}.public-layout .header .nav-link{display:flex;align-items:center;padding:0 1rem;font-size:12px;font-weight:500;text-decoration:none;color:#dde3ec;white-space:nowrap;text-align:center}.public-layout .header .nav-link:hover,.public-layout .header .nav-link:focus,.public-layout .header .nav-link:active{text-decoration:underline;color:#fff}@media screen and (max-width: 550px){.public-layout .header .nav-link.optional{display:none}}.public-layout .header .nav-button{background:#4a5266;margin:8px;margin-left:0;border-radius:4px}.public-layout .header .nav-button:hover,.public-layout .header .nav-button:focus,.public-layout .header .nav-button:active{text-decoration:none;background:#535b72}.public-layout .grid{display:grid;grid-gap:10px;grid-template-columns:minmax(300px, 3fr) minmax(298px, 1fr);grid-auto-columns:25%;grid-auto-rows:max-content}.public-layout .grid .column-0{grid-row:1;grid-column:1}.public-layout .grid .column-1{grid-row:1;grid-column:2}@media screen and (max-width: 600px){.public-layout .grid{grid-template-columns:100%;grid-gap:0}.public-layout .grid .column-1{display:none}}.public-layout .directory__card{border-radius:4px}@media screen and (max-width: 415px){.public-layout .directory__card{border-radius:0}}@media screen and (max-width: 415px){.public-layout .page-header{border-bottom:0}}.public-layout .public-account-header{overflow:hidden;margin-bottom:10px;box-shadow:0 0 15px rgba(0,0,0,.2)}.public-layout .public-account-header.inactive{opacity:.5}.public-layout .public-account-header.inactive .public-account-header__image,.public-layout .public-account-header.inactive .avatar{filter:grayscale(100%)}.public-layout .public-account-header.inactive .logo-button{background-color:#ecf0f4}.public-layout .public-account-header__image{border-radius:4px 4px 0 0;overflow:hidden;height:300px;position:relative;background:#0e1014}.public-layout .public-account-header__image::after{content:\"\";display:block;position:absolute;width:100%;height:100%;box-shadow:inset 0 -1px 1px 1px rgba(0,0,0,.15);top:0;left:0}.public-layout .public-account-header__image img{object-fit:cover;display:block;width:100%;height:100%;margin:0;border-radius:4px 4px 0 0}@media screen and (max-width: 600px){.public-layout .public-account-header__image{height:200px}}.public-layout .public-account-header--no-bar{margin-bottom:0}.public-layout .public-account-header--no-bar .public-account-header__image,.public-layout .public-account-header--no-bar .public-account-header__image img{border-radius:4px}@media screen and (max-width: 415px){.public-layout .public-account-header--no-bar .public-account-header__image,.public-layout .public-account-header--no-bar .public-account-header__image img{border-radius:0}}@media screen and (max-width: 415px){.public-layout .public-account-header{margin-bottom:0;box-shadow:none}.public-layout .public-account-header__image::after{display:none}.public-layout .public-account-header__image,.public-layout .public-account-header__image img{border-radius:0}}.public-layout .public-account-header__bar{position:relative;margin-top:-80px;display:flex;justify-content:flex-start}.public-layout .public-account-header__bar::before{content:\"\";display:block;background:#313543;position:absolute;bottom:0;left:0;right:0;height:60px;border-radius:0 0 4px 4px;z-index:-1}.public-layout .public-account-header__bar .avatar{display:block;width:120px;height:120px;padding-left:16px;flex:0 0 auto}.public-layout .public-account-header__bar .avatar img{display:block;width:100%;height:100%;margin:0;border-radius:50%;border:4px solid #313543;background:#17191f}@media screen and (max-width: 600px){.public-layout .public-account-header__bar{margin-top:0;background:#313543;border-radius:0 0 4px 4px;padding:5px}.public-layout .public-account-header__bar::before{display:none}.public-layout .public-account-header__bar .avatar{width:48px;height:48px;padding:7px 0;padding-left:10px}.public-layout .public-account-header__bar .avatar img{border:0;border-radius:4px}}@media screen and (max-width: 600px)and (max-width: 360px){.public-layout .public-account-header__bar .avatar{display:none}}@media screen and (max-width: 415px){.public-layout .public-account-header__bar{border-radius:0}}@media screen and (max-width: 600px){.public-layout .public-account-header__bar{flex-wrap:wrap}}.public-layout .public-account-header__tabs{flex:1 1 auto;margin-left:20px}.public-layout .public-account-header__tabs__name{padding-top:20px;padding-bottom:8px}.public-layout .public-account-header__tabs__name h1{font-size:20px;line-height:27px;color:#fff;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-shadow:1px 1px 1px #000}.public-layout .public-account-header__tabs__name h1 small{display:block;font-size:14px;color:#fff;font-weight:400;overflow:hidden;text-overflow:ellipsis}@media screen and (max-width: 600px){.public-layout .public-account-header__tabs{margin-left:15px;display:flex;justify-content:space-between;align-items:center}.public-layout .public-account-header__tabs__name{padding-top:0;padding-bottom:0}.public-layout .public-account-header__tabs__name h1{font-size:16px;line-height:24px;text-shadow:none}.public-layout .public-account-header__tabs__name h1 small{color:#dde3ec}}.public-layout .public-account-header__tabs__tabs{display:flex;justify-content:flex-start;align-items:stretch;height:58px}.public-layout .public-account-header__tabs__tabs .details-counters{display:flex;flex-direction:row;min-width:300px}@media screen and (max-width: 600px){.public-layout .public-account-header__tabs__tabs .details-counters{display:none}}.public-layout .public-account-header__tabs__tabs .counter{min-width:33.3%;box-sizing:border-box;flex:0 0 auto;color:#dde3ec;padding:10px;border-right:1px solid #313543;cursor:default;text-align:center;position:relative}.public-layout .public-account-header__tabs__tabs .counter a{display:block}.public-layout .public-account-header__tabs__tabs .counter:last-child{border-right:0}.public-layout .public-account-header__tabs__tabs .counter::after{display:block;content:\"\";position:absolute;bottom:0;left:0;width:100%;border-bottom:4px solid #9baec8;opacity:.5;transition:all 400ms ease}.public-layout .public-account-header__tabs__tabs .counter.active::after{border-bottom:4px solid #2b90d9;opacity:1}.public-layout .public-account-header__tabs__tabs .counter.active.inactive::after{border-bottom-color:#ecf0f4}.public-layout .public-account-header__tabs__tabs .counter:hover::after{opacity:1;transition-duration:100ms}.public-layout .public-account-header__tabs__tabs .counter a{text-decoration:none;color:inherit}.public-layout .public-account-header__tabs__tabs .counter .counter-label{font-size:12px;display:block}.public-layout .public-account-header__tabs__tabs .counter .counter-number{font-weight:500;font-size:18px;margin-bottom:5px;color:#fff;font-family:\"mastodon-font-display\",sans-serif}.public-layout .public-account-header__tabs__tabs .spacer{flex:1 1 auto;height:1px}.public-layout .public-account-header__tabs__tabs__buttons{padding:7px 8px}.public-layout .public-account-header__extra{display:none;margin-top:4px}.public-layout .public-account-header__extra .public-account-bio{border-radius:0;box-shadow:none;background:transparent;margin:0 -5px}.public-layout .public-account-header__extra .public-account-bio .account__header__fields{border-top:1px solid #42485a}.public-layout .public-account-header__extra .public-account-bio .roles{display:none}.public-layout .public-account-header__extra__links{margin-top:-15px;font-size:14px;color:#dde3ec}.public-layout .public-account-header__extra__links a{display:inline-block;color:#dde3ec;text-decoration:none;padding:15px;font-weight:500}.public-layout .public-account-header__extra__links a strong{font-weight:700;color:#fff}@media screen and (max-width: 600px){.public-layout .public-account-header__extra{display:block;flex:100%}}.public-layout .account__section-headline{border-radius:4px 4px 0 0}@media screen and (max-width: 415px){.public-layout .account__section-headline{border-radius:0}}.public-layout .detailed-status__meta{margin-top:25px}.public-layout .public-account-bio{background:#393f4f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;overflow:hidden;margin-bottom:10px}@media screen and (max-width: 415px){.public-layout .public-account-bio{box-shadow:none;margin-bottom:0;border-radius:0}}.public-layout .public-account-bio .account__header__fields{margin:0;border-top:0}.public-layout .public-account-bio .account__header__fields a{color:#4e79df}.public-layout .public-account-bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.public-layout .public-account-bio .account__header__fields .verified a{color:#79bd9a}.public-layout .public-account-bio .account__header__content{padding:20px;padding-bottom:0;color:#fff}.public-layout .public-account-bio__extra,.public-layout .public-account-bio .roles{padding:20px;font-size:14px;color:#dde3ec}.public-layout .public-account-bio .roles{padding-bottom:0}.public-layout .directory__list{display:grid;grid-gap:10px;grid-template-columns:minmax(0, 50%) minmax(0, 50%)}@media screen and (max-width: 415px){.public-layout .directory__list{display:block}}.public-layout .directory__list .icon-button{font-size:18px}.public-layout .directory__card{margin-bottom:0}.public-layout .card-grid{display:flex;flex-wrap:wrap;min-width:100%;margin:0 -5px}.public-layout .card-grid>div{box-sizing:border-box;flex:1 0 auto;width:300px;padding:0 5px;margin-bottom:10px;max-width:33.333%}@media screen and (max-width: 900px){.public-layout .card-grid>div{max-width:50%}}@media screen and (max-width: 600px){.public-layout .card-grid>div{max-width:100%}}@media screen and (max-width: 415px){.public-layout .card-grid{margin:0;border-top:1px solid #393f4f}.public-layout .card-grid>div{width:100%;padding:0;margin-bottom:0;border-bottom:1px solid #393f4f}.public-layout .card-grid>div:last-child{border-bottom:0}.public-layout .card-grid>div .card__bar{background:#282c37}.public-layout .card-grid>div .card__bar:hover,.public-layout .card-grid>div .card__bar:active,.public-layout .card-grid>div .card__bar:focus{background:#313543}}.no-list{list-style:none}.no-list li{display:inline-block;margin:0 5px}.recovery-codes{list-style:none;margin:0 auto}.recovery-codes li{font-size:125%;line-height:1.5;letter-spacing:1px}.public-layout .footer{text-align:left;padding-top:20px;padding-bottom:60px;font-size:12px;color:#737d99}@media screen and (max-width: 415px){.public-layout .footer{padding-left:20px;padding-right:20px}}.public-layout .footer .grid{display:grid;grid-gap:10px;grid-template-columns:1fr 1fr 2fr 1fr 1fr}.public-layout .footer .grid .column-0{grid-column:1;grid-row:1;min-width:0}.public-layout .footer .grid .column-1{grid-column:2;grid-row:1;min-width:0}.public-layout .footer .grid .column-2{grid-column:3;grid-row:1;min-width:0;text-align:center}.public-layout .footer .grid .column-2 h4 a{color:#737d99}.public-layout .footer .grid .column-3{grid-column:4;grid-row:1;min-width:0}.public-layout .footer .grid .column-4{grid-column:5;grid-row:1;min-width:0}@media screen and (max-width: 690px){.public-layout .footer .grid{grid-template-columns:1fr 2fr 1fr}.public-layout .footer .grid .column-0,.public-layout .footer .grid .column-1{grid-column:1}.public-layout .footer .grid .column-1{grid-row:2}.public-layout .footer .grid .column-2{grid-column:2}.public-layout .footer .grid .column-3,.public-layout .footer .grid .column-4{grid-column:3}.public-layout .footer .grid .column-4{grid-row:2}}@media screen and (max-width: 600px){.public-layout .footer .grid .column-1{display:block}}@media screen and (max-width: 415px){.public-layout .footer .grid .column-0,.public-layout .footer .grid .column-1,.public-layout .footer .grid .column-3,.public-layout .footer .grid .column-4{display:none}}.public-layout .footer h4{font-weight:700;margin-bottom:8px;color:#dde3ec}.public-layout .footer h4 a{color:inherit;text-decoration:none}.public-layout .footer ul a{text-decoration:none;color:#737d99}.public-layout .footer ul a:hover,.public-layout .footer ul a:active,.public-layout .footer ul a:focus{text-decoration:underline}.public-layout .footer .brand svg{display:block;height:36px;width:auto;margin:0 auto;fill:#737d99}.public-layout .footer .brand:hover svg,.public-layout .footer .brand:focus svg,.public-layout .footer .brand:active svg{fill:#7f88a2}.compact-header h1{font-size:24px;line-height:28px;color:#dde3ec;font-weight:500;margin-bottom:20px;padding:0 10px;word-wrap:break-word}@media screen and (max-width: 740px){.compact-header h1{text-align:center;padding:20px 10px 0}}.compact-header h1 a{color:inherit;text-decoration:none}.compact-header h1 small{font-weight:400;color:#ecf0f4}.compact-header h1 img{display:inline-block;margin-bottom:-5px;margin-right:15px;width:36px;height:36px}.hero-widget{margin-bottom:10px;box-shadow:0 0 15px rgba(0,0,0,.2)}.hero-widget__img{width:100%;position:relative;overflow:hidden;border-radius:4px 4px 0 0;background:#000}.hero-widget__img img{object-fit:cover;display:block;width:100%;height:100%;margin:0;border-radius:4px 4px 0 0}.hero-widget__text{background:#282c37;padding:20px;border-radius:0 0 4px 4px;font-size:15px;color:#dde3ec;line-height:20px;word-wrap:break-word;font-weight:400}.hero-widget__text .emojione{width:20px;height:20px;margin:-3px 0 0}.hero-widget__text p{margin-bottom:20px}.hero-widget__text p:last-child{margin-bottom:0}.hero-widget__text em{display:inline;margin:0;padding:0;font-weight:700;background:transparent;font-family:inherit;font-size:inherit;line-height:inherit;color:#fefefe}.hero-widget__text a{color:#ecf0f4;text-decoration:none}.hero-widget__text a:hover{text-decoration:underline}@media screen and (max-width: 415px){.hero-widget{display:none}}.endorsements-widget{margin-bottom:10px;padding-bottom:10px}.endorsements-widget h4{padding:10px;font-weight:700;font-size:14px;color:#dde3ec}.endorsements-widget .account{padding:10px 0}.endorsements-widget .account:last-child{border-bottom:0}.endorsements-widget .account .account__display-name{display:flex;align-items:center}.endorsements-widget .account .account__avatar{width:44px;height:44px;background-size:44px 44px}.endorsements-widget .trends__item{padding:10px}.trends-widget h4{color:#dde3ec}.box-widget{padding:20px;border-radius:4px;background:#282c37;box-shadow:0 0 15px rgba(0,0,0,.2)}.placeholder-widget{padding:16px;border-radius:4px;border:2px dashed #c2cede;text-align:center;color:#dde3ec;margin-bottom:10px}.contact-widget{min-height:100%;font-size:15px;color:#dde3ec;line-height:20px;word-wrap:break-word;font-weight:400;padding:0}.contact-widget h4{padding:10px;font-weight:700;font-size:14px;color:#dde3ec}.contact-widget .account{border-bottom:0;padding:10px 0;padding-top:5px}.contact-widget>a{display:inline-block;padding:10px;padding-top:0;color:#dde3ec;text-decoration:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.contact-widget>a:hover,.contact-widget>a:focus,.contact-widget>a:active{text-decoration:underline}.moved-account-widget{padding:15px;padding-bottom:20px;border-radius:4px;background:#282c37;box-shadow:0 0 15px rgba(0,0,0,.2);color:#ecf0f4;font-weight:400;margin-bottom:10px}.moved-account-widget strong,.moved-account-widget a{font-weight:500}.moved-account-widget strong:lang(ja),.moved-account-widget a:lang(ja){font-weight:700}.moved-account-widget strong:lang(ko),.moved-account-widget a:lang(ko){font-weight:700}.moved-account-widget strong:lang(zh-CN),.moved-account-widget a:lang(zh-CN){font-weight:700}.moved-account-widget strong:lang(zh-HK),.moved-account-widget a:lang(zh-HK){font-weight:700}.moved-account-widget strong:lang(zh-TW),.moved-account-widget a:lang(zh-TW){font-weight:700}.moved-account-widget a{color:inherit;text-decoration:underline}.moved-account-widget a.mention{text-decoration:none}.moved-account-widget a.mention span{text-decoration:none}.moved-account-widget a.mention:focus,.moved-account-widget a.mention:hover,.moved-account-widget a.mention:active{text-decoration:none}.moved-account-widget a.mention:focus span,.moved-account-widget a.mention:hover span,.moved-account-widget a.mention:active span{text-decoration:underline}.moved-account-widget__message{margin-bottom:15px}.moved-account-widget__message .fa{margin-right:5px;color:#dde3ec}.moved-account-widget__card .detailed-status__display-avatar{position:relative;cursor:pointer}.moved-account-widget__card .detailed-status__display-name{margin-bottom:0;text-decoration:none}.moved-account-widget__card .detailed-status__display-name span{font-weight:400}.memoriam-widget{padding:20px;border-radius:4px;background:#000;box-shadow:0 0 15px rgba(0,0,0,.2);font-size:14px;color:#dde3ec;margin-bottom:10px}.page-header{background:#393f4f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;padding:60px 15px;text-align:center;margin:10px 0}.page-header h1{color:#fff;font-size:36px;line-height:1.1;font-weight:700;margin-bottom:10px}.page-header p{font-size:15px;color:#dde3ec}@media screen and (max-width: 415px){.page-header{margin-top:0;background:#313543}.page-header h1{font-size:24px}}.directory{background:#282c37;border-radius:4px;box-shadow:0 0 15px rgba(0,0,0,.2)}.directory__tag{box-sizing:border-box;margin-bottom:10px}.directory__tag>a,.directory__tag>div{display:flex;align-items:center;justify-content:space-between;background:#282c37;border-radius:4px;padding:15px;text-decoration:none;color:inherit;box-shadow:0 0 15px rgba(0,0,0,.2)}.directory__tag>a:hover,.directory__tag>a:active,.directory__tag>a:focus{background:#393f4f}.directory__tag.active>a{background:#2b5fd9;cursor:default}.directory__tag.disabled>div{opacity:.5;cursor:default}.directory__tag h4{flex:1 1 auto;font-size:18px;font-weight:700;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.directory__tag h4 .fa{color:#dde3ec}.directory__tag h4 small{display:block;font-weight:400;font-size:15px;margin-top:8px;color:#dde3ec}.directory__tag.active h4,.directory__tag.active h4 .fa,.directory__tag.active h4 small,.directory__tag.active h4 .trends__item__current{color:#fff}.directory__tag .avatar-stack{flex:0 0 auto;width:120px}.directory__tag.active .avatar-stack .account__avatar{border-color:#2b5fd9}.directory__tag .trends__item__current{padding-right:0}.avatar-stack{display:flex;justify-content:flex-end}.avatar-stack .account__avatar{flex:0 0 auto;width:36px;height:36px;border-radius:50%;position:relative;margin-left:-10px;background:#17191f;border:2px solid #282c37}.avatar-stack .account__avatar:nth-child(1){z-index:1}.avatar-stack .account__avatar:nth-child(2){z-index:2}.avatar-stack .account__avatar:nth-child(3){z-index:3}.accounts-table{width:100%}.accounts-table .account{padding:0;border:0}.accounts-table strong{font-weight:700}.accounts-table thead th{text-align:center;color:#dde3ec;font-weight:700;padding:10px}.accounts-table thead th:first-child{text-align:left}.accounts-table tbody td{padding:15px 0;vertical-align:middle;border-bottom:1px solid #393f4f}.accounts-table tbody tr:last-child td{border-bottom:0}.accounts-table__count{width:120px;text-align:center;font-size:15px;font-weight:500;color:#fff}.accounts-table__count small{display:block;color:#dde3ec;font-weight:400;font-size:14px}.accounts-table__comment{width:50%;vertical-align:initial !important}@media screen and (max-width: 415px){.accounts-table tbody td.optional{display:none}}@media screen and (max-width: 415px){.moved-account-widget,.memoriam-widget,.box-widget,.contact-widget,.landing-page__information.contact-widget,.directory,.page-header{margin-bottom:0;box-shadow:none;border-radius:0}}.statuses-grid{min-height:600px}@media screen and (max-width: 640px){.statuses-grid{width:100% !important}}.statuses-grid__item{width:313.3333333333px}@media screen and (max-width: 1255px){.statuses-grid__item{width:306.6666666667px}}@media screen and (max-width: 640px){.statuses-grid__item{width:100%}}@media screen and (max-width: 415px){.statuses-grid__item{width:100vw}}.statuses-grid .detailed-status{border-radius:4px}@media screen and (max-width: 415px){.statuses-grid .detailed-status{border-top:1px solid #4a5266}}.statuses-grid .detailed-status.compact .detailed-status__meta{margin-top:15px}.statuses-grid .detailed-status.compact .status__content{font-size:15px;line-height:20px}.statuses-grid .detailed-status.compact .status__content .emojione{width:20px;height:20px;margin:-3px 0 0}.statuses-grid .detailed-status.compact .status__content .status__content__spoiler-link{line-height:20px;margin:0}.statuses-grid .detailed-status.compact .media-gallery,.statuses-grid .detailed-status.compact .status-card,.statuses-grid .detailed-status.compact .video-player{margin-top:15px}.notice-widget{margin-bottom:10px;color:#dde3ec}.notice-widget p{margin-bottom:10px}.notice-widget p:last-child{margin-bottom:0}.notice-widget a{font-size:14px;line-height:20px}.notice-widget a,.placeholder-widget a{text-decoration:none;font-weight:500;color:#2b5fd9}.notice-widget a:hover,.notice-widget a:focus,.notice-widget a:active,.placeholder-widget a:hover,.placeholder-widget a:focus,.placeholder-widget a:active{text-decoration:underline}.table-of-contents{background:#1f232b;min-height:100%;font-size:14px;border-radius:4px}.table-of-contents li a{display:block;font-weight:500;padding:15px;overflow:hidden;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-decoration:none;color:#fff;border-bottom:1px solid #313543}.table-of-contents li a:hover,.table-of-contents li a:focus,.table-of-contents li a:active{text-decoration:underline}.table-of-contents li:last-child a{border-bottom:0}.table-of-contents li ul{padding-left:20px;border-bottom:1px solid #313543}code{font-family:\"mastodon-font-monospace\",monospace;font-weight:400}.form-container{max-width:400px;padding:20px;margin:0 auto}.simple_form .input{margin-bottom:15px;overflow:hidden}.simple_form .input.hidden{margin:0}.simple_form .input.radio_buttons .radio{margin-bottom:15px}.simple_form .input.radio_buttons .radio:last-child{margin-bottom:0}.simple_form .input.radio_buttons .radio>label{position:relative;padding-left:28px}.simple_form .input.radio_buttons .radio>label input{position:absolute;top:-2px;left:0}.simple_form .input.boolean{position:relative;margin-bottom:0}.simple_form .input.boolean .label_input>label{font-family:inherit;font-size:14px;padding-top:5px;color:#fff;display:block;width:auto}.simple_form .input.boolean .label_input,.simple_form .input.boolean .hint{padding-left:28px}.simple_form .input.boolean .label_input__wrapper{position:static}.simple_form .input.boolean label.checkbox{position:absolute;top:2px;left:0}.simple_form .input.boolean label a{color:#2b90d9;text-decoration:underline}.simple_form .input.boolean label a:hover,.simple_form .input.boolean label a:active,.simple_form .input.boolean label a:focus{text-decoration:none}.simple_form .input.boolean .recommended{position:absolute;margin:0 4px;margin-top:-2px}.simple_form .row{display:flex;margin:0 -5px}.simple_form .row .input{box-sizing:border-box;flex:1 1 auto;width:50%;padding:0 5px}.simple_form .hint{color:#dde3ec}.simple_form .hint a{color:#2b90d9}.simple_form .hint code{border-radius:3px;padding:.2em .4em;background:#0e1014}.simple_form .hint li{list-style:disc;margin-left:18px}.simple_form ul.hint{margin-bottom:15px}.simple_form span.hint{display:block;font-size:12px;margin-top:4px}.simple_form p.hint{margin-bottom:15px;color:#dde3ec}.simple_form p.hint.subtle-hint{text-align:center;font-size:12px;line-height:18px;margin-top:15px;margin-bottom:0}.simple_form .card{margin-bottom:15px}.simple_form strong{font-weight:500}.simple_form strong:lang(ja){font-weight:700}.simple_form strong:lang(ko){font-weight:700}.simple_form strong:lang(zh-CN){font-weight:700}.simple_form strong:lang(zh-HK){font-weight:700}.simple_form strong:lang(zh-TW){font-weight:700}.simple_form .input.with_floating_label .label_input{display:flex}.simple_form .input.with_floating_label .label_input>label{font-family:inherit;font-size:14px;color:#fff;font-weight:500;min-width:150px;flex:0 0 auto}.simple_form .input.with_floating_label .label_input input,.simple_form .input.with_floating_label .label_input select{flex:1 1 auto}.simple_form .input.with_floating_label.select .hint{margin-top:6px;margin-left:150px}.simple_form .input.with_label .label_input>label{font-family:inherit;font-size:14px;color:#fff;display:block;margin-bottom:8px;word-wrap:break-word;font-weight:500}.simple_form .input.with_label .hint{margin-top:6px}.simple_form .input.with_label ul{flex:390px}.simple_form .input.with_block_label{max-width:none}.simple_form .input.with_block_label>label{font-family:inherit;font-size:16px;color:#fff;display:block;font-weight:500;padding-top:5px}.simple_form .input.with_block_label .hint{margin-bottom:15px}.simple_form .input.with_block_label ul{columns:2}.simple_form .required abbr{text-decoration:none;color:#e87487}.simple_form .fields-group{margin-bottom:25px}.simple_form .fields-group .input:last-child{margin-bottom:0}.simple_form .fields-row{display:flex;margin:0 -10px;padding-top:5px;margin-bottom:25px}.simple_form .fields-row .input{max-width:none}.simple_form .fields-row__column{box-sizing:border-box;padding:0 10px;flex:1 1 auto;min-height:1px}.simple_form .fields-row__column-6{max-width:50%}.simple_form .fields-row__column .actions{margin-top:27px}.simple_form .fields-row .fields-group:last-child,.simple_form .fields-row .fields-row__column.fields-group{margin-bottom:0}@media screen and (max-width: 600px){.simple_form .fields-row{display:block;margin-bottom:0}.simple_form .fields-row__column{max-width:none}.simple_form .fields-row .fields-group:last-child,.simple_form .fields-row .fields-row__column.fields-group,.simple_form .fields-row .fields-row__column{margin-bottom:25px}}.simple_form .input.radio_buttons .radio label{margin-bottom:5px;font-family:inherit;font-size:14px;color:#fff;display:block;width:auto}.simple_form .check_boxes .checkbox label{font-family:inherit;font-size:14px;color:#fff;display:inline-block;width:auto;position:relative;padding-top:5px;padding-left:25px;flex:1 1 auto}.simple_form .check_boxes .checkbox input[type=checkbox]{position:absolute;left:0;top:5px;margin:0}.simple_form .input.static .label_input__wrapper{font-size:16px;padding:10px;border:1px solid #c2cede;border-radius:4px}.simple_form input[type=text],.simple_form input[type=number],.simple_form input[type=email],.simple_form input[type=password],.simple_form textarea{box-sizing:border-box;font-size:16px;color:#fff;display:block;width:100%;outline:0;font-family:inherit;resize:vertical;background:#131419;border:1px solid #0a0b0e;border-radius:4px;padding:10px}.simple_form input[type=text]::placeholder,.simple_form input[type=number]::placeholder,.simple_form input[type=email]::placeholder,.simple_form input[type=password]::placeholder,.simple_form textarea::placeholder{color:#eaeef3}.simple_form input[type=text]:invalid,.simple_form input[type=number]:invalid,.simple_form input[type=email]:invalid,.simple_form input[type=password]:invalid,.simple_form textarea:invalid{box-shadow:none}.simple_form input[type=text]:focus:invalid:not(:placeholder-shown),.simple_form input[type=number]:focus:invalid:not(:placeholder-shown),.simple_form input[type=email]:focus:invalid:not(:placeholder-shown),.simple_form input[type=password]:focus:invalid:not(:placeholder-shown),.simple_form textarea:focus:invalid:not(:placeholder-shown){border-color:#e87487}.simple_form input[type=text]:required:valid,.simple_form input[type=number]:required:valid,.simple_form input[type=email]:required:valid,.simple_form input[type=password]:required:valid,.simple_form textarea:required:valid{border-color:#79bd9a}.simple_form input[type=text]:hover,.simple_form input[type=number]:hover,.simple_form input[type=email]:hover,.simple_form input[type=password]:hover,.simple_form textarea:hover{border-color:#000}.simple_form input[type=text]:active,.simple_form input[type=text]:focus,.simple_form input[type=number]:active,.simple_form input[type=number]:focus,.simple_form input[type=email]:active,.simple_form input[type=email]:focus,.simple_form input[type=password]:active,.simple_form input[type=password]:focus,.simple_form textarea:active,.simple_form textarea:focus{border-color:#2b90d9;background:#17191f}.simple_form .input.field_with_errors label{color:#e87487}.simple_form .input.field_with_errors input[type=text],.simple_form .input.field_with_errors input[type=number],.simple_form .input.field_with_errors input[type=email],.simple_form .input.field_with_errors input[type=password],.simple_form .input.field_with_errors textarea,.simple_form .input.field_with_errors select{border-color:#e87487}.simple_form .input.field_with_errors .error{display:block;font-weight:500;color:#e87487;margin-top:4px}.simple_form .input.disabled{opacity:.5}.simple_form .actions{margin-top:30px;display:flex}.simple_form .actions.actions--top{margin-top:0;margin-bottom:30px}.simple_form button,.simple_form .button,.simple_form .block-button{display:block;width:100%;border:0;border-radius:4px;background:#2b5fd9;color:#fff;font-size:18px;line-height:inherit;height:auto;padding:10px;text-decoration:none;text-align:center;box-sizing:border-box;cursor:pointer;font-weight:500;outline:0;margin-bottom:10px;margin-right:10px}.simple_form button:last-child,.simple_form .button:last-child,.simple_form .block-button:last-child{margin-right:0}.simple_form button:hover,.simple_form .button:hover,.simple_form .block-button:hover{background-color:#416fdd}.simple_form button:active,.simple_form button:focus,.simple_form .button:active,.simple_form .button:focus,.simple_form .block-button:active,.simple_form .block-button:focus{background-color:#2454c7}.simple_form button:disabled:hover,.simple_form .button:disabled:hover,.simple_form .block-button:disabled:hover{background-color:#9baec8}.simple_form button.negative,.simple_form .button.negative,.simple_form .block-button.negative{background:#df405a}.simple_form button.negative:hover,.simple_form .button.negative:hover,.simple_form .block-button.negative:hover{background-color:#e3566d}.simple_form button.negative:active,.simple_form button.negative:focus,.simple_form .button.negative:active,.simple_form .button.negative:focus,.simple_form .block-button.negative:active,.simple_form .block-button.negative:focus{background-color:#db2a47}.simple_form select{appearance:none;box-sizing:border-box;font-size:16px;color:#fff;display:block;width:100%;outline:0;font-family:inherit;resize:vertical;background:#131419 url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center/auto 16px;border:1px solid #0a0b0e;border-radius:4px;padding-left:10px;padding-right:30px;height:41px}.simple_form h4{margin-bottom:15px !important}.simple_form .label_input__wrapper{position:relative}.simple_form .label_input__append{position:absolute;right:3px;top:1px;padding:10px;padding-bottom:9px;font-size:16px;color:#c2cede;font-family:inherit;pointer-events:none;cursor:default;max-width:140px;white-space:nowrap;overflow:hidden}.simple_form .label_input__append::after{content:\"\";display:block;position:absolute;top:0;right:0;bottom:1px;width:5px;background-image:linear-gradient(to right, rgba(19, 20, 25, 0), #131419)}.simple_form__overlay-area{position:relative}.simple_form__overlay-area__blurred form{filter:blur(2px)}.simple_form__overlay-area__overlay{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;background:rgba(40,44,55,.65);border-radius:4px;margin-left:-4px;margin-top:-4px;padding:4px}.simple_form__overlay-area__overlay__content{text-align:center}.simple_form__overlay-area__overlay__content.rich-formatting,.simple_form__overlay-area__overlay__content.rich-formatting p{color:#fff}.block-icon{display:block;margin:0 auto;margin-bottom:10px;font-size:24px}.flash-message{background:#393f4f;color:#dde3ec;border-radius:4px;padding:15px 10px;margin-bottom:30px;text-align:center}.flash-message.notice{border:1px solid rgba(121,189,154,.5);background:rgba(121,189,154,.25);color:#79bd9a}.flash-message.alert{border:1px solid rgba(223,64,90,.5);background:rgba(223,64,90,.25);color:#df405a}.flash-message a{display:inline-block;color:#dde3ec;text-decoration:none}.flash-message a:hover{color:#fff;text-decoration:underline}.flash-message p{margin-bottom:15px}.flash-message .oauth-code{outline:0;box-sizing:border-box;display:block;width:100%;border:0;padding:10px;font-family:\"mastodon-font-monospace\",monospace;background:#282c37;color:#fff;font-size:14px;margin:0}.flash-message .oauth-code::-moz-focus-inner{border:0}.flash-message .oauth-code::-moz-focus-inner,.flash-message .oauth-code:focus,.flash-message .oauth-code:active{outline:0 !important}.flash-message .oauth-code:focus{background:#313543}.flash-message strong{font-weight:500}.flash-message strong:lang(ja){font-weight:700}.flash-message strong:lang(ko){font-weight:700}.flash-message strong:lang(zh-CN){font-weight:700}.flash-message strong:lang(zh-HK){font-weight:700}.flash-message strong:lang(zh-TW){font-weight:700}@media screen and (max-width: 740px)and (min-width: 441px){.flash-message{margin-top:40px}}.form-footer{margin-top:30px;text-align:center}.form-footer a{color:#dde3ec;text-decoration:none}.form-footer a:hover{text-decoration:underline}.quick-nav{list-style:none;margin-bottom:25px;font-size:14px}.quick-nav li{display:inline-block;margin-right:10px}.quick-nav a{color:#2b90d9;text-decoration:none;font-weight:700}.quick-nav a:hover,.quick-nav a:focus,.quick-nav a:active{color:#4ea2df}.oauth-prompt,.follow-prompt{margin-bottom:30px;color:#dde3ec}.oauth-prompt h2,.follow-prompt h2{font-size:16px;margin-bottom:30px;text-align:center}.oauth-prompt strong,.follow-prompt strong{color:#ecf0f4;font-weight:500}.oauth-prompt strong:lang(ja),.follow-prompt strong:lang(ja){font-weight:700}.oauth-prompt strong:lang(ko),.follow-prompt strong:lang(ko){font-weight:700}.oauth-prompt strong:lang(zh-CN),.follow-prompt strong:lang(zh-CN){font-weight:700}.oauth-prompt strong:lang(zh-HK),.follow-prompt strong:lang(zh-HK){font-weight:700}.oauth-prompt strong:lang(zh-TW),.follow-prompt strong:lang(zh-TW){font-weight:700}@media screen and (max-width: 740px)and (min-width: 441px){.oauth-prompt,.follow-prompt{margin-top:40px}}.qr-wrapper{display:flex;flex-wrap:wrap;align-items:flex-start}.qr-code{flex:0 0 auto;background:#fff;padding:4px;margin:0 10px 20px 0;box-shadow:0 0 15px rgba(0,0,0,.2);display:inline-block}.qr-code svg{display:block;margin:0}.qr-alternative{margin-bottom:20px;color:#ecf0f4;flex:150px}.qr-alternative samp{display:block;font-size:14px}.table-form p{margin-bottom:15px}.table-form p strong{font-weight:500}.table-form p strong:lang(ja){font-weight:700}.table-form p strong:lang(ko){font-weight:700}.table-form p strong:lang(zh-CN){font-weight:700}.table-form p strong:lang(zh-HK){font-weight:700}.table-form p strong:lang(zh-TW){font-weight:700}.simple_form .warning,.table-form .warning{box-sizing:border-box;background:rgba(223,64,90,.5);color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,.3);box-shadow:0 2px 6px rgba(0,0,0,.4);border-radius:4px;padding:10px;margin-bottom:15px}.simple_form .warning a,.table-form .warning a{color:#fff;text-decoration:underline}.simple_form .warning a:hover,.simple_form .warning a:focus,.simple_form .warning a:active,.table-form .warning a:hover,.table-form .warning a:focus,.table-form .warning a:active{text-decoration:none}.simple_form .warning strong,.table-form .warning strong{font-weight:600;display:block;margin-bottom:5px}.simple_form .warning strong:lang(ja),.table-form .warning strong:lang(ja){font-weight:700}.simple_form .warning strong:lang(ko),.table-form .warning strong:lang(ko){font-weight:700}.simple_form .warning strong:lang(zh-CN),.table-form .warning strong:lang(zh-CN){font-weight:700}.simple_form .warning strong:lang(zh-HK),.table-form .warning strong:lang(zh-HK){font-weight:700}.simple_form .warning strong:lang(zh-TW),.table-form .warning strong:lang(zh-TW){font-weight:700}.simple_form .warning strong .fa,.table-form .warning strong .fa{font-weight:400}.action-pagination{display:flex;flex-wrap:wrap;align-items:center}.action-pagination .actions,.action-pagination .pagination{flex:1 1 auto}.action-pagination .actions{padding:30px 0;padding-right:20px;flex:0 0 auto}.post-follow-actions{text-align:center;color:#dde3ec}.post-follow-actions div{margin-bottom:4px}.alternative-login{margin-top:20px;margin-bottom:20px}.alternative-login h4{font-size:16px;color:#fff;text-align:center;margin-bottom:20px;border:0;padding:0}.alternative-login .button{display:block}.scope-danger{color:#ff5050}.form_admin_settings_site_short_description textarea,.form_admin_settings_site_description textarea,.form_admin_settings_site_extended_description textarea,.form_admin_settings_site_terms textarea,.form_admin_settings_custom_css textarea,.form_admin_settings_closed_registrations_message textarea{font-family:\"mastodon-font-monospace\",monospace}.input-copy{background:#131419;border:1px solid #0a0b0e;border-radius:4px;display:flex;align-items:center;padding-right:4px;position:relative;top:1px;transition:border-color 300ms linear}.input-copy__wrapper{flex:1 1 auto}.input-copy input[type=text]{background:transparent;border:0;padding:10px;font-size:14px;font-family:\"mastodon-font-monospace\",monospace}.input-copy button{flex:0 0 auto;margin:4px;text-transform:none;font-weight:400;font-size:14px;padding:7px 18px;padding-bottom:6px;width:auto;transition:background 300ms linear}.input-copy.copied{border-color:#79bd9a;transition:none}.input-copy.copied button{background:#79bd9a;transition:none}.connection-prompt{margin-bottom:25px}.connection-prompt .fa-link{background-color:#1f232b;border-radius:100%;font-size:24px;padding:10px}.connection-prompt__column{align-items:center;display:flex;flex:1;flex-direction:column;flex-shrink:1;max-width:50%}.connection-prompt__column-sep{align-self:center;flex-grow:0;overflow:visible;position:relative;z-index:1}.connection-prompt__column p{word-break:break-word}.connection-prompt .account__avatar{margin-bottom:20px}.connection-prompt__connection{background-color:#393f4f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;padding:25px 10px;position:relative;text-align:center}.connection-prompt__connection::after{background-color:#1f232b;content:\"\";display:block;height:100%;left:50%;position:absolute;top:0;width:1px}.connection-prompt__row{align-items:flex-start;display:flex;flex-direction:row}.card>a{display:block;text-decoration:none;color:inherit;box-shadow:0 0 15px rgba(0,0,0,.2)}@media screen and (max-width: 415px){.card>a{box-shadow:none}}.card>a:hover .card__bar,.card>a:active .card__bar,.card>a:focus .card__bar{background:#393f4f}.card__img{height:130px;position:relative;background:#0e1014;border-radius:4px 4px 0 0}.card__img img{display:block;width:100%;height:100%;margin:0;object-fit:cover;border-radius:4px 4px 0 0}@media screen and (max-width: 600px){.card__img{height:200px}}@media screen and (max-width: 415px){.card__img{display:none}}.card__bar{position:relative;padding:15px;display:flex;justify-content:flex-start;align-items:center;background:#313543;border-radius:0 0 4px 4px}@media screen and (max-width: 415px){.card__bar{border-radius:0}}.card__bar .avatar{flex:0 0 auto;width:48px;height:48px;padding-top:2px}.card__bar .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px;background:#17191f;object-fit:cover}.card__bar .display-name{margin-left:15px;text-align:left}.card__bar .display-name strong{font-size:15px;color:#fff;font-weight:500;overflow:hidden;text-overflow:ellipsis}.card__bar .display-name span{display:block;font-size:14px;color:#dde3ec;font-weight:400;overflow:hidden;text-overflow:ellipsis}.pagination{padding:30px 0;text-align:center;overflow:hidden}.pagination a,.pagination .current,.pagination .newer,.pagination .older,.pagination .page,.pagination .gap{font-size:14px;color:#fff;font-weight:500;display:inline-block;padding:6px 10px;text-decoration:none}.pagination .current{background:#fff;border-radius:100px;color:#000;cursor:default;margin:0 10px}.pagination .gap{cursor:default}.pagination .older,.pagination .newer{color:#ecf0f4}.pagination .older{float:left;padding-left:0}.pagination .older .fa{display:inline-block;margin-right:5px}.pagination .newer{float:right;padding-right:0}.pagination .newer .fa{display:inline-block;margin-left:5px}.pagination .disabled{cursor:default;color:#1a1a1a}@media screen and (max-width: 700px){.pagination{padding:30px 20px}.pagination .page{display:none}.pagination .newer,.pagination .older{display:inline-block}}.nothing-here{background:#282c37;box-shadow:0 0 15px rgba(0,0,0,.2);color:#364861;font-size:14px;font-weight:500;text-align:center;display:flex;justify-content:center;align-items:center;cursor:default;border-radius:4px;padding:20px;min-height:30vh}.nothing-here--under-tabs{border-radius:0 0 4px 4px}.nothing-here--flexible{box-sizing:border-box;min-height:100%}.account-role,.simple_form .recommended{display:inline-block;padding:4px 6px;cursor:default;border-radius:3px;font-size:12px;line-height:12px;font-weight:500;color:#d9e1e8;background-color:rgba(217,225,232,.1);border:1px solid rgba(217,225,232,.5)}.account-role.moderator,.simple_form .recommended.moderator{color:#79bd9a;background-color:rgba(121,189,154,.1);border-color:rgba(121,189,154,.5)}.account-role.admin,.simple_form .recommended.admin{color:#e87487;background-color:rgba(232,116,135,.1);border-color:rgba(232,116,135,.5)}.account__header__fields{max-width:100vw;padding:0;margin:15px -15px -15px;border:0 none;border-top:1px solid #42485a;border-bottom:1px solid #42485a;font-size:14px;line-height:20px}.account__header__fields dl{display:flex;border-bottom:1px solid #42485a}.account__header__fields dt,.account__header__fields dd{box-sizing:border-box;padding:14px;text-align:center;max-height:48px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.account__header__fields dt{font-weight:500;width:120px;flex:0 0 auto;color:#ecf0f4;background:rgba(23,25,31,.5)}.account__header__fields dd{flex:1 1 auto;color:#dde3ec}.account__header__fields a{color:#2b90d9;text-decoration:none}.account__header__fields a:hover,.account__header__fields a:focus,.account__header__fields a:active{text-decoration:underline}.account__header__fields .verified{border:1px solid rgba(121,189,154,.5);background:rgba(121,189,154,.25)}.account__header__fields .verified a{color:#79bd9a;font-weight:500}.account__header__fields .verified__mark{color:#79bd9a}.account__header__fields dl:last-child{border-bottom:0}.directory__tag .trends__item__current{width:auto}.pending-account__header{color:#dde3ec}.pending-account__header a{color:#d9e1e8;text-decoration:none}.pending-account__header a:hover,.pending-account__header a:active,.pending-account__header a:focus{text-decoration:underline}.pending-account__header strong{color:#fff;font-weight:700}.pending-account__body{margin-top:10px}.activity-stream{box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;overflow:hidden;margin-bottom:10px}.activity-stream--under-tabs{border-radius:0 0 4px 4px}@media screen and (max-width: 415px){.activity-stream{margin-bottom:0;border-radius:0;box-shadow:none}}.activity-stream--headless{border-radius:0;margin:0;box-shadow:none}.activity-stream--headless .detailed-status,.activity-stream--headless .status{border-radius:0 !important}.activity-stream div[data-component]{width:100%}.activity-stream .entry{background:#282c37}.activity-stream .entry .detailed-status,.activity-stream .entry .status,.activity-stream .entry .load-more{animation:none}.activity-stream .entry:last-child .detailed-status,.activity-stream .entry:last-child .status,.activity-stream .entry:last-child .load-more{border-bottom:0;border-radius:0 0 4px 4px}.activity-stream .entry:first-child .detailed-status,.activity-stream .entry:first-child .status,.activity-stream .entry:first-child .load-more{border-radius:4px 4px 0 0}.activity-stream .entry:first-child:last-child .detailed-status,.activity-stream .entry:first-child:last-child .status,.activity-stream .entry:first-child:last-child .load-more{border-radius:4px}@media screen and (max-width: 740px){.activity-stream .entry .detailed-status,.activity-stream .entry .status,.activity-stream .entry .load-more{border-radius:0 !important}}.activity-stream--highlighted .entry{background:#393f4f}.button.logo-button{flex:0 auto;font-size:14px;background:#2b5fd9;color:#fff;text-transform:none;line-height:36px;height:auto;padding:3px 15px;border:0}.button.logo-button svg{width:20px;height:auto;vertical-align:middle;margin-right:5px;fill:#fff}.button.logo-button:active,.button.logo-button:focus,.button.logo-button:hover{background:#5680e1}.button.logo-button:disabled:active,.button.logo-button:disabled:focus,.button.logo-button:disabled:hover,.button.logo-button.disabled:active,.button.logo-button.disabled:focus,.button.logo-button.disabled:hover{background:#9baec8}.button.logo-button.button--destructive:active,.button.logo-button.button--destructive:focus,.button.logo-button.button--destructive:hover{background:#df405a}@media screen and (max-width: 415px){.button.logo-button svg{display:none}}.embed .detailed-status,.public-layout .detailed-status{padding:15px}.embed .status,.public-layout .status{padding:15px 15px 15px 78px;min-height:50px}.embed .status__avatar,.public-layout .status__avatar{left:15px;top:17px}.embed .status__content,.public-layout .status__content{padding-top:5px}.embed .status__prepend,.public-layout .status__prepend{margin-left:78px;padding-top:15px}.embed .status__prepend-icon-wrapper,.public-layout .status__prepend-icon-wrapper{left:-32px}.embed .status .media-gallery,.embed .status__action-bar,.embed .status .video-player,.public-layout .status .media-gallery,.public-layout .status__action-bar,.public-layout .status .video-player{margin-top:10px}button.icon-button i.fa-retweet{background-image:url(\"data:image/svg+xml;utf8,\")}button.icon-button i.fa-retweet:hover{background-image:url(\"data:image/svg+xml;utf8,\")}button.icon-button.disabled i.fa-retweet{background-image:url(\"data:image/svg+xml;utf8,\")}.app-body{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.link-button{display:block;font-size:15px;line-height:20px;color:#2b5fd9;border:0;background:transparent;padding:0;cursor:pointer}.link-button:hover,.link-button:active{text-decoration:underline}.link-button:disabled{color:#9baec8;cursor:default}.button{background-color:#2b5fd9;border:10px none;border-radius:4px;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-family:inherit;font-size:15px;font-weight:500;height:36px;letter-spacing:0;line-height:36px;overflow:hidden;padding:0 16px;position:relative;text-align:center;text-decoration:none;text-overflow:ellipsis;transition:all 100ms ease-in;white-space:nowrap;width:auto}.button:active,.button:focus,.button:hover{background-color:#5680e1;transition:all 200ms ease-out}.button--destructive{transition:none}.button--destructive:active,.button--destructive:focus,.button--destructive:hover{background-color:#df405a;transition:none}.button:disabled,.button.disabled{background-color:#9baec8;cursor:default}.button::-moz-focus-inner{border:0}.button::-moz-focus-inner,.button:focus,.button:active{outline:0 !important}.button.button-primary,.button.button-alternative,.button.button-secondary,.button.button-alternative-2{font-size:16px;line-height:36px;height:auto;text-transform:none;padding:4px 16px}.button.button-alternative{color:#000;background:#9baec8}.button.button-alternative:active,.button.button-alternative:focus,.button.button-alternative:hover{background-color:#a8b9cf}.button.button-alternative-2{background:#606984}.button.button-alternative-2:active,.button.button-alternative-2:focus,.button.button-alternative-2:hover{background-color:#687390}.button.button-secondary{color:#dde3ec;background:transparent;padding:3px 15px;border:1px solid #9baec8}.button.button-secondary:active,.button.button-secondary:focus,.button.button-secondary:hover{border-color:#a8b9cf;color:#eaeef3}.button.button-secondary:disabled{opacity:.5}.button.button--block{display:block;width:100%}.column__wrapper{display:flex;flex:1 1 auto;position:relative}.icon-button{display:inline-block;padding:0;color:#8d9ac2;border:0;border-radius:4px;background:transparent;cursor:pointer;transition:all 100ms ease-in;transition-property:background-color,color}.icon-button:hover,.icon-button:active,.icon-button:focus{color:#a4afce;background-color:rgba(141,154,194,.15);transition:all 200ms ease-out;transition-property:background-color,color}.icon-button:focus{background-color:rgba(141,154,194,.3)}.icon-button.disabled{color:#6274ab;background-color:transparent;cursor:default}.icon-button.active{color:#2b90d9}.icon-button::-moz-focus-inner{border:0}.icon-button::-moz-focus-inner,.icon-button:focus,.icon-button:active{outline:0 !important}.icon-button.inverted{color:#1b1e25}.icon-button.inverted:hover,.icon-button.inverted:active,.icon-button.inverted:focus{color:#0c0d11;background-color:rgba(27,30,37,.15)}.icon-button.inverted:focus{background-color:rgba(27,30,37,.3)}.icon-button.inverted.disabled{color:#2a2e3a;background-color:transparent}.icon-button.inverted.active{color:#2b90d9}.icon-button.inverted.active.disabled{color:#63ade3}.icon-button.overlayed{box-sizing:content-box;background:rgba(0,0,0,.6);color:rgba(255,255,255,.7);border-radius:4px;padding:2px}.icon-button.overlayed:hover{background:rgba(0,0,0,.9)}.text-icon-button{color:#1b1e25;border:0;border-radius:4px;background:transparent;cursor:pointer;font-weight:600;font-size:11px;padding:0 3px;line-height:27px;outline:0;transition:all 100ms ease-in;transition-property:background-color,color}.text-icon-button:hover,.text-icon-button:active,.text-icon-button:focus{color:#0c0d11;background-color:rgba(27,30,37,.15);transition:all 200ms ease-out;transition-property:background-color,color}.text-icon-button:focus{background-color:rgba(27,30,37,.3)}.text-icon-button.disabled{color:#464d60;background-color:transparent;cursor:default}.text-icon-button.active{color:#2b90d9}.text-icon-button::-moz-focus-inner{border:0}.text-icon-button::-moz-focus-inner,.text-icon-button:focus,.text-icon-button:active{outline:0 !important}.dropdown-menu{position:absolute}.invisible{font-size:0;line-height:0;display:inline-block;width:0;height:0;position:absolute}.invisible img,.invisible svg{margin:0 !important;border:0 !important;padding:0 !important;width:0 !important;height:0 !important}.ellipsis::after{content:\"…\"}.compose-form{padding:10px}.compose-form__sensitive-button{padding:10px;padding-top:0;font-size:14px;font-weight:500}.compose-form__sensitive-button.active{color:#2b90d9}.compose-form__sensitive-button input[type=checkbox]{display:none}.compose-form__sensitive-button .checkbox{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:4px;vertical-align:middle}.compose-form__sensitive-button .checkbox.active{border-color:#2b90d9;background:#2b90d9}.compose-form .compose-form__warning{color:#000;margin-bottom:10px;background:#9baec8;box-shadow:0 2px 6px rgba(0,0,0,.3);padding:8px 10px;border-radius:4px;font-size:13px;font-weight:400}.compose-form .compose-form__warning strong{color:#000;font-weight:500}.compose-form .compose-form__warning strong:lang(ja){font-weight:700}.compose-form .compose-form__warning strong:lang(ko){font-weight:700}.compose-form .compose-form__warning strong:lang(zh-CN){font-weight:700}.compose-form .compose-form__warning strong:lang(zh-HK){font-weight:700}.compose-form .compose-form__warning strong:lang(zh-TW){font-weight:700}.compose-form .compose-form__warning a{color:#1b1e25;font-weight:500;text-decoration:underline}.compose-form .compose-form__warning a:hover,.compose-form .compose-form__warning a:active,.compose-form .compose-form__warning a:focus{text-decoration:none}.compose-form .emoji-picker-dropdown{position:absolute;top:5px;right:5px}.compose-form .compose-form__autosuggest-wrapper{position:relative}.compose-form .autosuggest-textarea,.compose-form .autosuggest-input,.compose-form .spoiler-input{position:relative;width:100%}.compose-form .spoiler-input{height:0;transform-origin:bottom;opacity:0}.compose-form .spoiler-input.spoiler-input--visible{height:36px;margin-bottom:11px;opacity:1}.compose-form .autosuggest-textarea__textarea,.compose-form .spoiler-input__input{display:block;box-sizing:border-box;width:100%;margin:0;color:#000;background:#fff;padding:10px;font-family:inherit;font-size:14px;resize:vertical;border:0;outline:0}.compose-form .autosuggest-textarea__textarea::placeholder,.compose-form .spoiler-input__input::placeholder{color:#c2cede}.compose-form .autosuggest-textarea__textarea:focus,.compose-form .spoiler-input__input:focus{outline:0}@media screen and (max-width: 600px){.compose-form .autosuggest-textarea__textarea,.compose-form .spoiler-input__input{font-size:16px}}.compose-form .spoiler-input__input{border-radius:4px}.compose-form .autosuggest-textarea__textarea{min-height:100px;border-radius:4px 4px 0 0;padding-bottom:0;padding-right:32px;resize:none;scrollbar-color:initial}.compose-form .autosuggest-textarea__textarea::-webkit-scrollbar{all:unset}@media screen and (max-width: 600px){.compose-form .autosuggest-textarea__textarea{height:100px !important;resize:vertical}}.compose-form .autosuggest-textarea__suggestions-wrapper{position:relative;height:0}.compose-form .autosuggest-textarea__suggestions{box-sizing:border-box;display:none;position:absolute;top:100%;width:100%;z-index:99;box-shadow:4px 4px 6px rgba(0,0,0,.4);background:#d9e1e8;border-radius:0 0 4px 4px;color:#000;font-size:14px;padding:6px}.compose-form .autosuggest-textarea__suggestions.autosuggest-textarea__suggestions--visible{display:block}.compose-form .autosuggest-textarea__suggestions__item{padding:10px;cursor:pointer;border-radius:4px}.compose-form .autosuggest-textarea__suggestions__item:hover,.compose-form .autosuggest-textarea__suggestions__item:focus,.compose-form .autosuggest-textarea__suggestions__item:active,.compose-form .autosuggest-textarea__suggestions__item.selected{background:#b9c8d5}.compose-form .autosuggest-account,.compose-form .autosuggest-emoji,.compose-form .autosuggest-hashtag{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;line-height:18px;font-size:14px}.compose-form .autosuggest-hashtag{justify-content:space-between}.compose-form .autosuggest-hashtag__name{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.compose-form .autosuggest-hashtag strong{font-weight:500}.compose-form .autosuggest-hashtag__uses{flex:0 0 auto;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.compose-form .autosuggest-account-icon,.compose-form .autosuggest-emoji img{display:block;margin-right:8px;width:16px;height:16px}.compose-form .autosuggest-account .display-name__account{color:#1b1e25}.compose-form .compose-form__modifiers{color:#000;font-family:inherit;font-size:14px;background:#fff}.compose-form .compose-form__modifiers .compose-form__upload-wrapper{overflow:hidden}.compose-form .compose-form__modifiers .compose-form__uploads-wrapper{display:flex;flex-direction:row;padding:5px;flex-wrap:wrap}.compose-form .compose-form__modifiers .compose-form__upload{flex:1 1 0;min-width:40%;margin:5px}.compose-form .compose-form__modifiers .compose-form__upload__actions{background:linear-gradient(180deg, rgba(0, 0, 0, 0.8) 0, rgba(0, 0, 0, 0.35) 80%, transparent);display:flex;align-items:flex-start;justify-content:space-between;opacity:0;transition:opacity .1s ease}.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button{flex:0 1 auto;color:#ecf0f4;font-size:14px;font-weight:500;padding:10px;font-family:inherit}.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button:hover,.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button:focus,.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button:active{color:#fff}.compose-form .compose-form__modifiers .compose-form__upload__actions.active{opacity:1}.compose-form .compose-form__modifiers .compose-form__upload-description{position:absolute;z-index:2;bottom:0;left:0;right:0;box-sizing:border-box;background:linear-gradient(0deg, rgba(0, 0, 0, 0.8) 0, rgba(0, 0, 0, 0.35) 80%, transparent);padding:10px;opacity:0;transition:opacity .1s ease}.compose-form .compose-form__modifiers .compose-form__upload-description textarea{background:transparent;color:#ecf0f4;border:0;padding:0;margin:0;width:100%;font-family:inherit;font-size:14px;font-weight:500}.compose-form .compose-form__modifiers .compose-form__upload-description textarea:focus{color:#fff}.compose-form .compose-form__modifiers .compose-form__upload-description textarea::placeholder{opacity:.75;color:#ecf0f4}.compose-form .compose-form__modifiers .compose-form__upload-description.active{opacity:1}.compose-form .compose-form__modifiers .compose-form__upload-thumbnail{border-radius:4px;background-color:#000;background-position:center;background-size:cover;background-repeat:no-repeat;height:140px;width:100%;overflow:hidden}.compose-form .compose-form__buttons-wrapper{padding:10px;background:#ebebeb;border-radius:0 0 4px 4px;display:flex;justify-content:space-between;flex:0 0 auto}.compose-form .compose-form__buttons-wrapper .compose-form__buttons{display:flex}.compose-form .compose-form__buttons-wrapper .compose-form__buttons .compose-form__upload-button-icon{line-height:27px}.compose-form .compose-form__buttons-wrapper .compose-form__buttons .compose-form__sensitive-button{display:none}.compose-form .compose-form__buttons-wrapper .compose-form__buttons .compose-form__sensitive-button.compose-form__sensitive-button--visible{display:block}.compose-form .compose-form__buttons-wrapper .compose-form__buttons .compose-form__sensitive-button .compose-form__sensitive-button__icon{line-height:27px}.compose-form .compose-form__buttons-wrapper .icon-button,.compose-form .compose-form__buttons-wrapper .text-icon-button{box-sizing:content-box;padding:0 3px}.compose-form .compose-form__buttons-wrapper .character-counter__wrapper{align-self:center;margin-right:4px}.compose-form .compose-form__publish{display:flex;justify-content:flex-end;min-width:0;flex:0 0 auto}.compose-form .compose-form__publish .compose-form__publish-button-wrapper{overflow:hidden;padding-top:10px}.character-counter{cursor:default;font-family:\"mastodon-font-sans-serif\",sans-serif;font-size:14px;font-weight:600;color:#1b1e25}.character-counter.character-counter--over{color:#ff5050}.no-reduce-motion .spoiler-input{transition:height .4s ease,opacity .4s ease}.emojione{font-size:inherit;vertical-align:middle;object-fit:contain;margin:-0.2ex .15em .2ex;width:16px;height:16px}.emojione img{width:auto}.reply-indicator{border-radius:4px;margin-bottom:10px;background:#9baec8;padding:10px;min-height:23px;overflow-y:auto;flex:0 2 auto}.reply-indicator__header{margin-bottom:5px;overflow:hidden}.reply-indicator__cancel{float:right;line-height:24px}.reply-indicator__display-name{color:#000;display:block;max-width:100%;line-height:24px;overflow:hidden;padding-right:25px;text-decoration:none}.reply-indicator__display-avatar{float:left;margin-right:5px}.status__content--with-action{cursor:pointer}.status__content,.reply-indicator__content{position:relative;font-size:15px;line-height:20px;word-wrap:break-word;font-weight:400;overflow:hidden;text-overflow:ellipsis;padding-top:2px;color:#fff}.status__content:focus,.reply-indicator__content:focus{outline:0}.status__content.status__content--with-spoiler,.reply-indicator__content.status__content--with-spoiler{white-space:normal}.status__content.status__content--with-spoiler .status__content__text,.reply-indicator__content.status__content--with-spoiler .status__content__text{white-space:pre-wrap}.status__content .emojione,.reply-indicator__content .emojione{width:20px;height:20px;margin:-3px 0 0}.status__content img,.reply-indicator__content img{max-width:100%;max-height:400px;object-fit:contain}.status__content p,.reply-indicator__content p{margin-bottom:20px;white-space:pre-wrap}.status__content p:last-child,.reply-indicator__content p:last-child{margin-bottom:0}.status__content a,.reply-indicator__content a{color:#d8a070;text-decoration:none}.status__content a:hover,.reply-indicator__content a:hover{text-decoration:underline}.status__content a:hover .fa,.reply-indicator__content a:hover .fa{color:#dae1ea}.status__content a.mention:hover,.reply-indicator__content a.mention:hover{text-decoration:none}.status__content a.mention:hover span,.reply-indicator__content a.mention:hover span{text-decoration:underline}.status__content a .fa,.reply-indicator__content a .fa{color:#c2cede}.status__content a.unhandled-link,.reply-indicator__content a.unhandled-link{color:#4e79df}.status__content .status__content__spoiler-link,.reply-indicator__content .status__content__spoiler-link{background:#8d9ac2}.status__content .status__content__spoiler-link:hover,.reply-indicator__content .status__content__spoiler-link:hover{background:#a4afce;text-decoration:none}.status__content .status__content__spoiler-link::-moz-focus-inner,.reply-indicator__content .status__content__spoiler-link::-moz-focus-inner{border:0}.status__content .status__content__spoiler-link::-moz-focus-inner,.status__content .status__content__spoiler-link:focus,.status__content .status__content__spoiler-link:active,.reply-indicator__content .status__content__spoiler-link::-moz-focus-inner,.reply-indicator__content .status__content__spoiler-link:focus,.reply-indicator__content .status__content__spoiler-link:active{outline:0 !important}.status__content .status__content__text,.reply-indicator__content .status__content__text{display:none}.status__content .status__content__text.status__content__text--visible,.reply-indicator__content .status__content__text.status__content__text--visible{display:block}.status__content.status__content--collapsed{max-height:300px}.status__content__read-more-button{display:block;font-size:15px;line-height:20px;color:#4e79df;border:0;background:transparent;padding:0;padding-top:8px}.status__content__read-more-button:hover,.status__content__read-more-button:active{text-decoration:underline}.status__content__spoiler-link{display:inline-block;border-radius:2px;background:transparent;border:0;color:#000;font-weight:700;font-size:12px;padding:0 6px;line-height:20px;cursor:pointer;vertical-align:middle}.status__wrapper--filtered{color:#c2cede;border:0;font-size:inherit;text-align:center;line-height:inherit;margin:0;padding:15px;box-sizing:border-box;width:100%;clear:both;border-bottom:1px solid #393f4f}.status__prepend-icon-wrapper{left:-26px;position:absolute}.focusable:focus{outline:0;background:#313543}.focusable:focus .status.status-direct{background:#42485a}.focusable:focus .status.status-direct.muted{background:transparent}.focusable:focus .detailed-status,.focusable:focus .detailed-status__action-bar{background:#393f4f}.status{padding:8px 10px;padding-left:68px;position:relative;min-height:54px;border-bottom:1px solid #393f4f;cursor:default;opacity:1;animation:fade 150ms linear}@supports(-ms-overflow-style: -ms-autohiding-scrollbar){.status{padding-right:26px}}@keyframes fade{0%{opacity:0}100%{opacity:1}}.status .video-player,.status .audio-player{margin-top:8px}.status.status-direct:not(.read){background:#393f4f;border-bottom-color:#42485a}.status.light .status__relative-time{color:#364861}.status.light .status__display-name{color:#000}.status.light .display-name strong{color:#000}.status.light .display-name span{color:#364861}.status.light .status__content{color:#000}.status.light .status__content a{color:#2b90d9}.status.light .status__content a.status__content__spoiler-link{color:#fff;background:#9baec8}.status.light .status__content a.status__content__spoiler-link:hover{background:#b5c3d6}.notification-favourite .status.status-direct{background:transparent}.notification-favourite .status.status-direct .icon-button.disabled{color:#b8c0d9}.status__relative-time,.notification__relative_time{color:#c2cede;float:right;font-size:14px}.status__display-name{color:#c2cede}.status__info .status__display-name{display:block;max-width:100%;padding-right:25px}.status__info{font-size:15px}.status-check-box{border-bottom:1px solid #d9e1e8;display:flex}.status-check-box .status-check-box__status{margin:10px 0 10px 10px;flex:1}.status-check-box .status-check-box__status .media-gallery{max-width:250px}.status-check-box .status-check-box__status .status__content{padding:0;white-space:normal}.status-check-box .status-check-box__status .video-player,.status-check-box .status-check-box__status .audio-player{margin-top:8px;max-width:250px}.status-check-box .status-check-box__status .media-gallery__item-thumbnail{cursor:default}.status-check-box-toggle{align-items:center;display:flex;flex:0 0 auto;justify-content:center;padding:10px}.status__prepend{margin-left:68px;color:#c2cede;padding:8px 0;padding-bottom:2px;font-size:14px;position:relative}.status__prepend .status__display-name strong{color:#c2cede}.status__prepend>span{display:block;overflow:hidden;text-overflow:ellipsis}.status__action-bar{align-items:center;display:flex;margin-top:8px}.status__action-bar__counter{display:inline-flex;margin-right:11px;align-items:center}.status__action-bar__counter .status__action-bar-button{margin-right:4px}.status__action-bar__counter__label{display:inline-block;width:14px;font-size:12px;font-weight:500;color:#8d9ac2}.status__action-bar-button{margin-right:18px}.status__action-bar-dropdown{height:23.15px;width:23.15px}.detailed-status__action-bar-dropdown{flex:1 1 auto;display:flex;align-items:center;justify-content:center;position:relative}.detailed-status{background:#313543;padding:14px 10px}.detailed-status--flex{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-start}.detailed-status--flex .status__content,.detailed-status--flex .detailed-status__meta{flex:100%}.detailed-status .status__content{font-size:19px;line-height:24px}.detailed-status .status__content .emojione{width:24px;height:24px;margin:-1px 0 0}.detailed-status .status__content .status__content__spoiler-link{line-height:24px;margin:-1px 0 0}.detailed-status .video-player,.detailed-status .audio-player{margin-top:8px}.detailed-status__meta{margin-top:15px;color:#c2cede;font-size:14px;line-height:18px}.detailed-status__action-bar{background:#313543;border-top:1px solid #393f4f;border-bottom:1px solid #393f4f;display:flex;flex-direction:row;padding:10px 0}.detailed-status__link{color:inherit;text-decoration:none}.detailed-status__favorites,.detailed-status__reblogs{display:inline-block;font-weight:500;font-size:12px;margin-left:6px}.reply-indicator__content{color:#000;font-size:14px}.reply-indicator__content a{color:#1b1e25}.domain{padding:10px;border-bottom:1px solid #393f4f}.domain .domain__domain-name{flex:1 1 auto;display:block;color:#fff;text-decoration:none;font-size:14px;font-weight:500}.domain__wrapper{display:flex}.domain_buttons{height:18px;padding:10px;white-space:nowrap}.account{padding:10px;border-bottom:1px solid #393f4f}.account.compact{padding:0;border-bottom:0}.account.compact .account__avatar-wrapper{margin-left:0}.account .account__display-name{flex:1 1 auto;display:block;color:#dde3ec;overflow:hidden;text-decoration:none;font-size:14px}.account__wrapper{display:flex}.account__avatar-wrapper{float:left;margin-left:12px;margin-right:12px}.account__avatar{border-radius:4px;background:transparent no-repeat;background-position:50%;background-clip:padding-box;position:relative}.account__avatar-inline{display:inline-block;vertical-align:middle;margin-right:5px}.account__avatar-composite{border-radius:4px;background:transparent no-repeat;background-position:50%;background-clip:padding-box;border-radius:50%;overflow:hidden;position:relative;cursor:default}.account__avatar-composite>div{float:left;position:relative;box-sizing:border-box}.account__avatar-composite__label{display:block;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);color:#fff;text-shadow:1px 1px 2px #000;font-weight:700;font-size:15px}a .account__avatar{cursor:pointer}.account__avatar-overlay{width:48px;height:48px;background-size:48px 48px}.account__avatar-overlay-base{border-radius:4px;background:transparent no-repeat;background-position:50%;background-clip:padding-box;width:36px;height:36px;background-size:36px 36px}.account__avatar-overlay-overlay{border-radius:4px;background:transparent no-repeat;background-position:50%;background-clip:padding-box;width:24px;height:24px;background-size:24px 24px;position:absolute;bottom:0;right:0;z-index:1}.account__relationship{height:18px;padding:10px;white-space:nowrap}.account__disclaimer{padding:10px;border-top:1px solid #393f4f;color:#c2cede}.account__disclaimer strong{font-weight:500}.account__disclaimer strong:lang(ja){font-weight:700}.account__disclaimer strong:lang(ko){font-weight:700}.account__disclaimer strong:lang(zh-CN){font-weight:700}.account__disclaimer strong:lang(zh-HK){font-weight:700}.account__disclaimer strong:lang(zh-TW){font-weight:700}.account__disclaimer a{font-weight:500;color:inherit;text-decoration:underline}.account__disclaimer a:hover,.account__disclaimer a:focus,.account__disclaimer a:active{text-decoration:none}.account__action-bar{border-top:1px solid #393f4f;border-bottom:1px solid #393f4f;line-height:36px;overflow:hidden;flex:0 0 auto;display:flex}.account__action-bar-dropdown{padding:10px}.account__action-bar-dropdown .icon-button{vertical-align:middle}.account__action-bar-dropdown .dropdown--active .dropdown__content.dropdown__right{left:6px;right:initial}.account__action-bar-dropdown .dropdown--active::after{bottom:initial;margin-left:11px;margin-top:-7px;right:initial}.account__action-bar-links{display:flex;flex:1 1 auto;line-height:18px;text-align:center}.account__action-bar__tab{text-decoration:none;overflow:hidden;flex:0 1 100%;border-right:1px solid #393f4f;padding:10px 0;border-bottom:4px solid transparent}.account__action-bar__tab.active{border-bottom:4px solid #2b5fd9}.account__action-bar__tab>span{display:block;font-size:12px;color:#dde3ec}.account__action-bar__tab strong{display:block;font-size:15px;font-weight:500;color:#fff}.account__action-bar__tab strong:lang(ja){font-weight:700}.account__action-bar__tab strong:lang(ko){font-weight:700}.account__action-bar__tab strong:lang(zh-CN){font-weight:700}.account__action-bar__tab strong:lang(zh-HK){font-weight:700}.account__action-bar__tab strong:lang(zh-TW){font-weight:700}.account-authorize{padding:14px 10px}.account-authorize .detailed-status__display-name{display:block;margin-bottom:15px;overflow:hidden}.account-authorize__avatar{float:left;margin-right:10px}.status__display-name,.status__relative-time,.detailed-status__display-name,.detailed-status__datetime,.detailed-status__application,.account__display-name{text-decoration:none}.status__display-name strong,.account__display-name strong{color:#fff}.muted .emojione{opacity:.5}.status__display-name:hover strong,.reply-indicator__display-name:hover strong,.detailed-status__display-name:hover strong,a.account__display-name:hover strong{text-decoration:underline}.account__display-name strong{display:block;overflow:hidden;text-overflow:ellipsis}.detailed-status__application,.detailed-status__datetime{color:inherit}.detailed-status .button.logo-button{margin-bottom:15px}.detailed-status__display-name{color:#ecf0f4;display:block;line-height:24px;margin-bottom:15px;overflow:hidden}.detailed-status__display-name strong,.detailed-status__display-name span{display:block;text-overflow:ellipsis;overflow:hidden}.detailed-status__display-name strong{font-size:16px;color:#fff}.detailed-status__display-avatar{float:left;margin-right:10px}.status__avatar{height:48px;left:10px;position:absolute;top:10px;width:48px}.status__expand{width:68px;position:absolute;left:0;top:0;height:100%;cursor:pointer}.muted .status__content,.muted .status__content p,.muted .status__content a{color:#c2cede}.muted .status__display-name strong{color:#c2cede}.muted .status__avatar{opacity:.5}.muted a.status__content__spoiler-link{background:#606984;color:#000}.muted a.status__content__spoiler-link:hover{background:#707b97;text-decoration:none}.notification__message{margin:0 10px 0 68px;padding:8px 0 0;cursor:default;color:#dde3ec;font-size:15px;line-height:22px;position:relative}.notification__message .fa{color:#2b90d9}.notification__message>span{display:inline;overflow:hidden;text-overflow:ellipsis}.notification__favourite-icon-wrapper{left:-26px;position:absolute}.notification__favourite-icon-wrapper .star-icon{color:#ca8f04}.star-icon.active{color:#ca8f04}.bookmark-icon.active{color:#ff5050}.no-reduce-motion .icon-button.star-icon.activate>.fa-star{animation:spring-rotate-in 1s linear}.no-reduce-motion .icon-button.star-icon.deactivate>.fa-star{animation:spring-rotate-out 1s linear}.notification__display-name{color:inherit;font-weight:500;text-decoration:none}.notification__display-name:hover{color:#fff;text-decoration:underline}.notification__relative_time{float:right}.display-name{display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.display-name__html{font-weight:500}.display-name__account{font-size:14px}.status__relative-time:hover,.detailed-status__datetime:hover{text-decoration:underline}.image-loader{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center;flex-direction:column}.image-loader .image-loader__preview-canvas{max-width:100%;max-height:80%;background:url(\"~images/void.png\") repeat;object-fit:contain}.image-loader .loading-bar{position:relative}.image-loader.image-loader--amorphous .image-loader__preview-canvas{display:none}.zoomable-image{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center}.zoomable-image img{max-width:100%;max-height:80%;width:auto;height:auto;object-fit:contain}.navigation-bar{padding:10px;display:flex;align-items:center;flex-shrink:0;cursor:default;color:#dde3ec}.navigation-bar strong{color:#ecf0f4}.navigation-bar a{color:inherit}.navigation-bar .permalink{text-decoration:none}.navigation-bar .navigation-bar__actions{position:relative}.navigation-bar .navigation-bar__actions .icon-button.close{position:absolute;pointer-events:none;transform:scale(0, 1) translate(-100%, 0);opacity:0}.navigation-bar .navigation-bar__actions .compose__action-bar .icon-button{pointer-events:auto;transform:scale(1, 1) translate(0, 0);opacity:1}.navigation-bar__profile{flex:1 1 auto;margin-left:8px;line-height:20px;margin-top:-1px;overflow:hidden}.navigation-bar__profile-account{display:block;font-weight:500;overflow:hidden;text-overflow:ellipsis}.navigation-bar__profile-edit{color:inherit;text-decoration:none}.dropdown{display:inline-block}.dropdown__content{display:none;position:absolute}.dropdown-menu__separator{border-bottom:1px solid #c0cdd9;margin:5px 7px 6px;height:0}.dropdown-menu{background:#d9e1e8;padding:4px 0;border-radius:4px;box-shadow:2px 4px 15px rgba(0,0,0,.4);z-index:9999}.dropdown-menu ul{list-style:none}.dropdown-menu.left{transform-origin:100% 50%}.dropdown-menu.top{transform-origin:50% 100%}.dropdown-menu.bottom{transform-origin:50% 0}.dropdown-menu.right{transform-origin:0 50%}.dropdown-menu__arrow{position:absolute;width:0;height:0;border:0 solid transparent}.dropdown-menu__arrow.left{right:-5px;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#d9e1e8}.dropdown-menu__arrow.top{bottom:-5px;margin-left:-7px;border-width:5px 7px 0;border-top-color:#d9e1e8}.dropdown-menu__arrow.bottom{top:-5px;margin-left:-7px;border-width:0 7px 5px;border-bottom-color:#d9e1e8}.dropdown-menu__arrow.right{left:-5px;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#d9e1e8}.dropdown-menu__item a{font-size:13px;line-height:18px;display:block;padding:4px 14px;box-sizing:border-box;text-decoration:none;background:#d9e1e8;color:#000;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown-menu__item a:focus,.dropdown-menu__item a:hover,.dropdown-menu__item a:active{background:#2b5fd9;color:#ecf0f4;outline:0}.dropdown--active .dropdown__content{display:block;line-height:18px;max-width:311px;right:0;text-align:left;z-index:9999}.dropdown--active .dropdown__content>ul{list-style:none;background:#d9e1e8;padding:4px 0;border-radius:4px;box-shadow:0 0 15px rgba(0,0,0,.4);min-width:140px;position:relative}.dropdown--active .dropdown__content.dropdown__right{right:0}.dropdown--active .dropdown__content.dropdown__left>ul{left:-98px}.dropdown--active .dropdown__content>ul>li>a{font-size:13px;line-height:18px;display:block;padding:4px 14px;box-sizing:border-box;text-decoration:none;background:#d9e1e8;color:#000;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown--active .dropdown__content>ul>li>a:focus{outline:0}.dropdown--active .dropdown__content>ul>li>a:hover{background:#2b5fd9;color:#ecf0f4}.dropdown__icon{vertical-align:middle}.columns-area{display:flex;flex:1 1 auto;flex-direction:row;justify-content:flex-start;overflow-x:auto;position:relative}.columns-area.unscrollable{overflow-x:hidden}.columns-area__panels{display:flex;justify-content:center;width:100%;height:100%;min-height:100vh}.columns-area__panels__pane{height:100%;overflow:hidden;pointer-events:none;display:flex;justify-content:flex-end;min-width:285px}.columns-area__panels__pane--start{justify-content:flex-start}.columns-area__panels__pane__inner{position:fixed;width:285px;pointer-events:auto;height:100%}.columns-area__panels__main{box-sizing:border-box;width:100%;max-width:600px;flex:0 0 auto;display:flex;flex-direction:column}@media screen and (min-width: 415px){.columns-area__panels__main{padding:0 10px}}.tabs-bar__wrapper{background:#17191f;position:sticky;top:0;z-index:2;padding-top:0}@media screen and (min-width: 415px){.tabs-bar__wrapper{padding-top:10px}}.tabs-bar__wrapper .tabs-bar{margin-bottom:0}@media screen and (min-width: 415px){.tabs-bar__wrapper .tabs-bar{margin-bottom:10px}}.react-swipeable-view-container,.react-swipeable-view-container .columns-area,.react-swipeable-view-container .drawer,.react-swipeable-view-container .column{height:100%}.react-swipeable-view-container>*{display:flex;align-items:center;justify-content:center;height:100%}.column{width:350px;position:relative;box-sizing:border-box;display:flex;flex-direction:column}.column>.scrollable{background:#282c37;border-bottom-left-radius:2px;border-bottom-right-radius:2px}.ui{flex:0 0 auto;display:flex;flex-direction:column;width:100%;height:100%}.drawer{width:330px;box-sizing:border-box;display:flex;flex-direction:column;overflow-y:hidden}.drawer__tab{display:block;flex:1 1 auto;padding:15px 5px 13px;color:#dde3ec;text-decoration:none;text-align:center;font-size:16px;border-bottom:2px solid transparent}.column,.drawer{flex:1 1 auto;overflow:hidden}@media screen and (min-width: 631px){.columns-area{padding:0}.column,.drawer{flex:0 0 auto;padding:10px;padding-left:5px;padding-right:5px}.column:first-child,.drawer:first-child{padding-left:10px}.column:last-child,.drawer:last-child{padding-right:10px}.columns-area>div .column,.columns-area>div .drawer{padding-left:5px;padding-right:5px}}.tabs-bar{box-sizing:border-box;display:flex;background:#393f4f;flex:0 0 auto;overflow-y:auto}.tabs-bar__link{display:block;flex:1 1 auto;padding:15px 10px;padding-bottom:13px;color:#fff;text-decoration:none;text-align:center;font-size:14px;font-weight:500;border-bottom:2px solid #393f4f;transition:all 50ms linear;transition-property:border-bottom,background,color}.tabs-bar__link .fa{font-weight:400;font-size:16px}@media screen and (min-width: 631px){.tabs-bar__link:hover,.tabs-bar__link:focus,.tabs-bar__link:active{background:#464d60;border-bottom-color:#464d60}}.tabs-bar__link.active{border-bottom:2px solid #2b90d9;color:#2b90d9}.tabs-bar__link span{margin-left:5px;display:none}@media screen and (min-width: 600px){.tabs-bar__link span{display:inline}}.columns-area--mobile{flex-direction:column;width:100%;height:100%;margin:0 auto}.columns-area--mobile .column,.columns-area--mobile .drawer{width:100%;height:100%;padding:0}.columns-area--mobile .directory__list{display:grid;grid-gap:10px;grid-template-columns:minmax(0, 50%) minmax(0, 50%)}@media screen and (max-width: 415px){.columns-area--mobile .directory__list{display:block}}.columns-area--mobile .directory__card{margin-bottom:0}.columns-area--mobile .filter-form{display:flex}.columns-area--mobile .autosuggest-textarea__textarea{font-size:16px}.columns-area--mobile .search__input{line-height:18px;font-size:16px;padding:15px;padding-right:30px}.columns-area--mobile .search__icon .fa{top:15px}.columns-area--mobile .scrollable{overflow:visible}@supports(display: grid){.columns-area--mobile .scrollable{contain:content}}@media screen and (min-width: 415px){.columns-area--mobile{padding:10px 0;padding-top:0}}@media screen and (min-width: 630px){.columns-area--mobile .detailed-status{padding:15px}.columns-area--mobile .detailed-status .media-gallery,.columns-area--mobile .detailed-status .video-player,.columns-area--mobile .detailed-status .audio-player{margin-top:15px}.columns-area--mobile .account__header__bar{padding:5px 10px}.columns-area--mobile .navigation-bar,.columns-area--mobile .compose-form{padding:15px}.columns-area--mobile .compose-form .compose-form__publish .compose-form__publish-button-wrapper{padding-top:15px}.columns-area--mobile .status{padding:15px 15px 15px 78px;min-height:50px}.columns-area--mobile .status__avatar{left:15px;top:17px}.columns-area--mobile .status__content{padding-top:5px}.columns-area--mobile .status__prepend{margin-left:78px;padding-top:15px}.columns-area--mobile .status__prepend-icon-wrapper{left:-32px}.columns-area--mobile .status .media-gallery,.columns-area--mobile .status__action-bar,.columns-area--mobile .status .video-player,.columns-area--mobile .status .audio-player{margin-top:10px}.columns-area--mobile .account{padding:15px 10px}.columns-area--mobile .account__header__bio{margin:0 -10px}.columns-area--mobile .notification__message{margin-left:78px;padding-top:15px}.columns-area--mobile .notification__favourite-icon-wrapper{left:-32px}.columns-area--mobile .notification .status{padding-top:8px}.columns-area--mobile .notification .account{padding-top:8px}.columns-area--mobile .notification .account__avatar-wrapper{margin-left:17px;margin-right:15px}}.floating-action-button{position:fixed;display:flex;justify-content:center;align-items:center;width:3.9375rem;height:3.9375rem;bottom:1.3125rem;right:1.3125rem;background:#2558d0;color:#fff;border-radius:50%;font-size:21px;line-height:21px;text-decoration:none;box-shadow:2px 3px 9px rgba(0,0,0,.4)}.floating-action-button:hover,.floating-action-button:focus,.floating-action-button:active{background:#4976de}@media screen and (min-width: 415px){.tabs-bar{width:100%}.react-swipeable-view-container .columns-area--mobile{height:calc(100% - 10px) !important}.getting-started__wrapper,.getting-started__trends,.search{margin-bottom:10px}.getting-started__panel{margin:10px 0}.column,.drawer{min-width:330px}}@media screen and (max-width: 895px){.columns-area__panels__pane--compositional{display:none}}@media screen and (min-width: 895px){.floating-action-button,.tabs-bar__link.optional{display:none}.search-page .search{display:none}}@media screen and (max-width: 1190px){.columns-area__panels__pane--navigational{display:none}}@media screen and (min-width: 1190px){.tabs-bar{display:none}}.icon-with-badge{position:relative}.icon-with-badge__badge{position:absolute;left:9px;top:-13px;background:#2b5fd9;border:2px solid #393f4f;padding:1px 6px;border-radius:6px;font-size:10px;font-weight:500;line-height:14px;color:#fff}.column-link--transparent .icon-with-badge__badge{border-color:#17191f}.compose-panel{width:285px;margin-top:10px;display:flex;flex-direction:column;height:calc(100% - 10px);overflow-y:hidden}.compose-panel .navigation-bar{padding-top:20px;padding-bottom:20px;flex:0 1 48px;min-height:20px}.compose-panel .flex-spacer{background:transparent}.compose-panel .compose-form{flex:1;overflow-y:hidden;display:flex;flex-direction:column;min-height:310px;padding-bottom:71px;margin-bottom:-71px}.compose-panel .compose-form__autosuggest-wrapper{overflow-y:auto;background-color:#fff;border-radius:4px 4px 0 0;flex:0 1 auto}.compose-panel .autosuggest-textarea__textarea{overflow-y:hidden}.compose-panel .compose-form__upload-thumbnail{height:80px}.navigation-panel{margin-top:10px;margin-bottom:10px;height:calc(100% - 20px);overflow-y:auto;display:flex;flex-direction:column}.navigation-panel>a{flex:0 0 auto}.navigation-panel hr{flex:0 0 auto;border:0;background:transparent;border-top:1px solid #313543;margin:10px 0}.navigation-panel .flex-spacer{background:transparent}.drawer__pager{box-sizing:border-box;padding:0;flex-grow:1;position:relative;overflow:hidden;display:flex}.drawer__inner{position:absolute;top:0;left:0;background:#444b5d;box-sizing:border-box;padding:0;display:flex;flex-direction:column;overflow:hidden;overflow-y:auto;width:100%;height:100%;border-radius:2px}.drawer__inner.darker{background:#282c37}.drawer__inner__mastodon{background:#444b5d url('data:image/svg+xml;utf8,') no-repeat bottom/100% auto;flex:1;min-height:47px;display:none}.drawer__inner__mastodon>img{display:block;object-fit:contain;object-position:bottom left;width:100%;height:100%;pointer-events:none;user-drag:none;user-select:none}@media screen and (min-height: 640px){.drawer__inner__mastodon{display:block}}.pseudo-drawer{background:#444b5d;font-size:13px;text-align:left}.drawer__header{flex:0 0 auto;font-size:16px;background:#393f4f;margin-bottom:10px;display:flex;flex-direction:row;border-radius:2px}.drawer__header a{transition:background 100ms ease-in}.drawer__header a:hover{background:#2e3340;transition:background 200ms ease-out}.scrollable{overflow-y:scroll;overflow-x:hidden;flex:1 1 auto;-webkit-overflow-scrolling:touch}.scrollable.optionally-scrollable{overflow-y:auto}@supports(display: grid){.scrollable{contain:strict}}.scrollable--flex{display:flex;flex-direction:column}.scrollable__append{flex:1 1 auto;position:relative;min-height:120px}@supports(display: grid){.scrollable.fullscreen{contain:none}}.column-back-button{box-sizing:border-box;width:100%;background:#313543;color:#2b90d9;cursor:pointer;flex:0 0 auto;font-size:16px;line-height:inherit;border:0;text-align:unset;padding:15px;margin:0;z-index:3;outline:0}.column-back-button:hover{text-decoration:underline}.column-header__back-button{background:#313543;border:0;font-family:inherit;color:#2b90d9;cursor:pointer;white-space:nowrap;font-size:16px;padding:0 5px 0 0;z-index:3}.column-header__back-button:hover{text-decoration:underline}.column-header__back-button:last-child{padding:0 15px 0 0}.column-back-button__icon{display:inline-block;margin-right:5px}.column-back-button--slim{position:relative}.column-back-button--slim-button{cursor:pointer;flex:0 0 auto;font-size:16px;padding:15px;position:absolute;right:0;top:-48px}.react-toggle{display:inline-block;position:relative;cursor:pointer;background-color:transparent;border:0;padding:0;user-select:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-tap-highlight-color:transparent}.react-toggle-screenreader-only{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.react-toggle--disabled{cursor:not-allowed;opacity:.5;transition:opacity .25s}.react-toggle-track{width:50px;height:24px;padding:0;border-radius:30px;background-color:#282c37;transition:background-color .2s ease}.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track{background-color:#131419}.react-toggle--checked .react-toggle-track{background-color:#2b5fd9}.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track{background-color:#5680e1}.react-toggle-track-check{position:absolute;width:14px;height:10px;top:0;bottom:0;margin-top:auto;margin-bottom:auto;line-height:0;left:8px;opacity:0;transition:opacity .25s ease}.react-toggle--checked .react-toggle-track-check{opacity:1;transition:opacity .25s ease}.react-toggle-track-x{position:absolute;width:10px;height:10px;top:0;bottom:0;margin-top:auto;margin-bottom:auto;line-height:0;right:10px;opacity:1;transition:opacity .25s ease}.react-toggle--checked .react-toggle-track-x{opacity:0}.react-toggle-thumb{position:absolute;top:1px;left:1px;width:22px;height:22px;border:1px solid #282c37;border-radius:50%;background-color:#fafafa;box-sizing:border-box;transition:all .25s ease;transition-property:border-color,left}.react-toggle--checked .react-toggle-thumb{left:27px;border-color:#2b5fd9}.column-link{background:#393f4f;color:#fff;display:block;font-size:16px;padding:15px;text-decoration:none}.column-link:hover,.column-link:focus,.column-link:active{background:#404657}.column-link:focus{outline:0}.column-link--transparent{background:transparent;color:#d9e1e8}.column-link--transparent:hover,.column-link--transparent:focus,.column-link--transparent:active{background:transparent;color:#fff}.column-link--transparent.active{color:#2b5fd9}.column-link__icon{display:inline-block;margin-right:5px}.column-link__badge{display:inline-block;border-radius:4px;font-size:12px;line-height:19px;font-weight:500;background:#282c37;padding:4px 8px;margin:-6px 10px}.column-subheading{background:#282c37;color:#c2cede;padding:8px 20px;font-size:13px;font-weight:500;cursor:default}.getting-started__wrapper,.getting-started,.flex-spacer{background:#282c37}.flex-spacer{flex:1 1 auto}.getting-started{color:#c2cede;overflow:auto;border-bottom-left-radius:2px;border-bottom-right-radius:2px}.getting-started__wrapper,.getting-started__panel,.getting-started__footer{height:min-content}.getting-started__panel,.getting-started__footer{padding:10px;padding-top:20px;flex-grow:0}.getting-started__panel ul,.getting-started__footer ul{margin-bottom:10px}.getting-started__panel ul li,.getting-started__footer ul li{display:inline}.getting-started__panel p,.getting-started__footer p{font-size:13px}.getting-started__panel p a,.getting-started__footer p a{color:#c2cede;text-decoration:underline}.getting-started__panel a,.getting-started__footer a{text-decoration:none;color:#dde3ec}.getting-started__panel a:hover,.getting-started__panel a:focus,.getting-started__panel a:active,.getting-started__footer a:hover,.getting-started__footer a:focus,.getting-started__footer a:active{text-decoration:underline}.getting-started__wrapper,.getting-started__footer{color:#c2cede}.getting-started__trends{flex:0 1 auto;opacity:1;animation:fade 150ms linear;margin-top:10px}.getting-started__trends h4{font-size:13px;color:#dde3ec;padding:10px;font-weight:500;border-bottom:1px solid #393f4f}@media screen and (max-height: 810px){.getting-started__trends .trends__item:nth-child(3){display:none}}@media screen and (max-height: 720px){.getting-started__trends .trends__item:nth-child(2){display:none}}@media screen and (max-height: 670px){.getting-started__trends{display:none}}.getting-started__trends .trends__item{border-bottom:0;padding:10px}.getting-started__trends .trends__item__current{color:#dde3ec}.keyboard-shortcuts{padding:8px 0 0;overflow:hidden}.keyboard-shortcuts thead{position:absolute;left:-9999px}.keyboard-shortcuts td{padding:0 10px 8px}.keyboard-shortcuts kbd{display:inline-block;padding:3px 5px;background-color:#393f4f;border:1px solid #1f232b}.setting-text{display:block;box-sizing:border-box;width:100%;margin:0;color:#000;background:#fff;padding:10px;font-family:inherit;font-size:14px;resize:vertical;border:0;outline:0;border-radius:4px}.setting-text:focus{outline:0}@media screen and (max-width: 600px){.setting-text{font-size:16px}}.no-reduce-motion button.icon-button i.fa-retweet{background-position:0 0;height:19px;transition:background-position .9s steps(10);transition-duration:0s;vertical-align:middle;width:22px}.no-reduce-motion button.icon-button i.fa-retweet::before{display:none !important}.no-reduce-motion button.icon-button.active i.fa-retweet{transition-duration:.9s;background-position:0 100%}.reduce-motion button.icon-button i.fa-retweet{color:#8d9ac2;transition:color 100ms ease-in}.reduce-motion button.icon-button.active i.fa-retweet{color:#2b90d9}.status-card{display:flex;font-size:14px;border:1px solid #393f4f;border-radius:4px;color:#c2cede;margin-top:14px;text-decoration:none;overflow:hidden}.status-card__actions{bottom:0;left:0;position:absolute;right:0;top:0;display:flex;justify-content:center;align-items:center}.status-card__actions>div{background:rgba(0,0,0,.6);border-radius:8px;padding:12px 9px;flex:0 0 auto;display:flex;justify-content:center;align-items:center}.status-card__actions button,.status-card__actions a{display:inline;color:#ecf0f4;background:transparent;border:0;padding:0 8px;text-decoration:none;font-size:18px;line-height:18px}.status-card__actions button:hover,.status-card__actions button:active,.status-card__actions button:focus,.status-card__actions a:hover,.status-card__actions a:active,.status-card__actions a:focus{color:#fff}.status-card__actions a{font-size:19px;position:relative;bottom:-1px}a.status-card{cursor:pointer}a.status-card:hover{background:#393f4f}.status-card-photo{cursor:zoom-in;display:block;text-decoration:none;width:100%;height:auto;margin:0}.status-card-video iframe{width:100%;height:100%}.status-card__title{display:block;font-weight:500;margin-bottom:5px;color:#dde3ec;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-decoration:none}.status-card__content{flex:1 1 auto;overflow:hidden;padding:14px 14px 14px 8px}.status-card__description{color:#dde3ec}.status-card__host{display:block;margin-top:5px;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-card__image{flex:0 0 100px;background:#393f4f;position:relative}.status-card__image>.fa{font-size:21px;position:absolute;transform-origin:50% 50%;top:50%;left:50%;transform:translate(-50%, -50%)}.status-card.horizontal{display:block}.status-card.horizontal .status-card__image{width:100%}.status-card.horizontal .status-card__image-image{border-radius:4px 4px 0 0}.status-card.horizontal .status-card__title{white-space:inherit}.status-card.compact{border-color:#313543}.status-card.compact.interactive{border:0}.status-card.compact .status-card__content{padding:8px;padding-top:10px}.status-card.compact .status-card__title{white-space:nowrap}.status-card.compact .status-card__image{flex:0 0 60px}a.status-card.compact:hover{background-color:#313543}.status-card__image-image{border-radius:4px 0 0 4px;display:block;margin:0;width:100%;height:100%;object-fit:cover;background-size:cover;background-position:center center}.load-more{display:block;color:#c2cede;background-color:transparent;border:0;font-size:inherit;text-align:center;line-height:inherit;margin:0;padding:15px;box-sizing:border-box;width:100%;clear:both;text-decoration:none}.load-more:hover{background:#2c313d}.load-gap{border-bottom:1px solid #393f4f}.regeneration-indicator{text-align:center;font-size:16px;font-weight:500;color:#c2cede;background:#282c37;cursor:default;display:flex;flex:1 1 auto;flex-direction:column;align-items:center;justify-content:center;padding:20px}.regeneration-indicator__figure,.regeneration-indicator__figure img{display:block;width:auto;height:160px;margin:0}.regeneration-indicator--without-header{padding-top:68px}.regeneration-indicator__label{margin-top:30px}.regeneration-indicator__label strong{display:block;margin-bottom:10px;color:#c2cede}.regeneration-indicator__label span{font-size:15px;font-weight:400}.column-header__wrapper{position:relative;flex:0 0 auto}.column-header__wrapper.active::before{display:block;content:\"\";position:absolute;top:35px;left:0;right:0;margin:0 auto;width:60%;pointer-events:none;height:28px;z-index:1;background:radial-gradient(ellipse, rgba(43, 95, 217, 0.23) 0%, rgba(43, 95, 217, 0) 60%)}.column-header{display:flex;font-size:16px;background:#313543;flex:0 0 auto;cursor:pointer;position:relative;z-index:2;outline:0;overflow:hidden;border-top-left-radius:2px;border-top-right-radius:2px}.column-header>button{margin:0;border:0;padding:15px 0 15px 15px;color:inherit;background:transparent;font:inherit;text-align:left;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;flex:1}.column-header>.column-header__back-button{color:#2b90d9}.column-header.active{box-shadow:0 1px 0 rgba(43,144,217,.3)}.column-header.active .column-header__icon{color:#2b90d9;text-shadow:0 0 10px rgba(43,144,217,.4)}.column-header:focus,.column-header:active{outline:0}.column-header__buttons{height:48px;display:flex}.column-header__links{margin-bottom:14px}.column-header__links .text-btn{margin-right:10px}.column-header__button{background:#313543;border:0;color:#dde3ec;cursor:pointer;font-size:16px;padding:0 15px}.column-header__button:hover{color:#f4f6f9}.column-header__button.active{color:#fff;background:#393f4f}.column-header__button.active:hover{color:#fff;background:#393f4f}.column-header__collapsible{max-height:70vh;overflow:hidden;overflow-y:auto;color:#dde3ec;transition:max-height 150ms ease-in-out,opacity 300ms linear;opacity:1}.column-header__collapsible.collapsed{max-height:0;opacity:.5}.column-header__collapsible.animating{overflow-y:hidden}.column-header__collapsible hr{height:0;background:transparent;border:0;border-top:1px solid #42485a;margin:10px 0}.column-header__collapsible-inner{background:#393f4f;padding:15px}.column-header__setting-btn:hover{color:#dde3ec;text-decoration:underline}.column-header__setting-arrows{float:right}.column-header__setting-arrows .column-header__setting-btn{padding:0 10px}.column-header__setting-arrows .column-header__setting-btn:last-child{padding-right:0}.text-btn{display:inline-block;padding:0;font-family:inherit;font-size:inherit;color:inherit;border:0;background:transparent;cursor:pointer}.column-header__icon{display:inline-block;margin-right:5px}.loading-indicator{color:#c2cede;font-size:13px;font-weight:400;overflow:visible;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.loading-indicator span{display:block;float:left;margin-left:50%;transform:translateX(-50%);margin:82px 0 0 50%;white-space:nowrap}.loading-indicator__figure{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);width:42px;height:42px;box-sizing:border-box;background-color:transparent;border:0 solid #606984;border-width:6px;border-radius:50%}.no-reduce-motion .loading-indicator span{animation:loader-label 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1)}.no-reduce-motion .loading-indicator__figure{animation:loader-figure 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1)}@keyframes spring-rotate-in{0%{transform:rotate(0deg)}30%{transform:rotate(-484.8deg)}60%{transform:rotate(-316.7deg)}90%{transform:rotate(-375deg)}100%{transform:rotate(-360deg)}}@keyframes spring-rotate-out{0%{transform:rotate(-360deg)}30%{transform:rotate(124.8deg)}60%{transform:rotate(-43.27deg)}90%{transform:rotate(15deg)}100%{transform:rotate(0deg)}}@keyframes loader-figure{0%{width:0;height:0;background-color:#606984}29%{background-color:#606984}30%{width:42px;height:42px;background-color:transparent;border-width:21px;opacity:1}100%{width:42px;height:42px;border-width:0;opacity:0;background-color:transparent}}@keyframes loader-label{0%{opacity:.25}30%{opacity:1}100%{opacity:.25}}.video-error-cover{align-items:center;background:#000;color:#fff;cursor:pointer;display:flex;flex-direction:column;height:100%;justify-content:center;margin-top:8px;position:relative;text-align:center;z-index:100}.media-spoiler{background:#000;color:#dde3ec;border:0;padding:0;width:100%;height:100%;border-radius:4px;appearance:none}.media-spoiler:hover,.media-spoiler:active,.media-spoiler:focus{padding:0;color:#f7f9fb}.media-spoiler__warning{display:block;font-size:14px}.media-spoiler__trigger{display:block;font-size:11px;font-weight:700}.spoiler-button{top:0;left:0;width:100%;height:100%;position:absolute;z-index:100}.spoiler-button--minified{display:block;left:4px;top:4px;width:auto;height:auto}.spoiler-button--click-thru{pointer-events:none}.spoiler-button--hidden{display:none}.spoiler-button__overlay{display:block;background:transparent;width:100%;height:100%;border:0}.spoiler-button__overlay__label{display:inline-block;background:rgba(0,0,0,.5);border-radius:8px;padding:8px 12px;color:#fff;font-weight:500;font-size:14px}.spoiler-button__overlay:hover .spoiler-button__overlay__label,.spoiler-button__overlay:focus .spoiler-button__overlay__label,.spoiler-button__overlay:active .spoiler-button__overlay__label{background:rgba(0,0,0,.8)}.spoiler-button__overlay:disabled .spoiler-button__overlay__label{background:rgba(0,0,0,.5)}.modal-container--preloader{background:#393f4f}.account--panel{background:#313543;border-top:1px solid #393f4f;border-bottom:1px solid #393f4f;display:flex;flex-direction:row;padding:10px 0}.account--panel__button,.detailed-status__button{flex:1 1 auto;text-align:center}.column-settings__outer{background:#393f4f;padding:15px}.column-settings__section{color:#dde3ec;cursor:default;display:block;font-weight:500;margin-bottom:10px}.column-settings__hashtags .column-settings__row{margin-bottom:15px}.column-settings__hashtags .column-select__control{outline:0;box-sizing:border-box;width:100%;border:0;box-shadow:none;font-family:inherit;background:#282c37;color:#dde3ec;font-size:14px;margin:0}.column-settings__hashtags .column-select__control::placeholder{color:#eaeef3}.column-settings__hashtags .column-select__control::-moz-focus-inner{border:0}.column-settings__hashtags .column-select__control::-moz-focus-inner,.column-settings__hashtags .column-select__control:focus,.column-settings__hashtags .column-select__control:active{outline:0 !important}.column-settings__hashtags .column-select__control:focus{background:#313543}@media screen and (max-width: 600px){.column-settings__hashtags .column-select__control{font-size:16px}}.column-settings__hashtags .column-select__placeholder{color:#c2cede;padding-left:2px;font-size:12px}.column-settings__hashtags .column-select__value-container{padding-left:6px}.column-settings__hashtags .column-select__multi-value{background:#393f4f}.column-settings__hashtags .column-select__multi-value__remove{cursor:pointer}.column-settings__hashtags .column-select__multi-value__remove:hover,.column-settings__hashtags .column-select__multi-value__remove:active,.column-settings__hashtags .column-select__multi-value__remove:focus{background:#42485a;color:#eaeef3}.column-settings__hashtags .column-select__multi-value__label,.column-settings__hashtags .column-select__input{color:#dde3ec}.column-settings__hashtags .column-select__clear-indicator,.column-settings__hashtags .column-select__dropdown-indicator{cursor:pointer;transition:none;color:#c2cede}.column-settings__hashtags .column-select__clear-indicator:hover,.column-settings__hashtags .column-select__clear-indicator:active,.column-settings__hashtags .column-select__clear-indicator:focus,.column-settings__hashtags .column-select__dropdown-indicator:hover,.column-settings__hashtags .column-select__dropdown-indicator:active,.column-settings__hashtags .column-select__dropdown-indicator:focus{color:#d0d9e5}.column-settings__hashtags .column-select__indicator-separator{background-color:#393f4f}.column-settings__hashtags .column-select__menu{background:#fff;border-radius:4px;padding:10px 14px;padding-bottom:14px;margin-top:10px;color:#364861;box-shadow:2px 4px 15px rgba(0,0,0,.4);padding:0;background:#d9e1e8}.column-settings__hashtags .column-select__menu h4{color:#364861;font-size:14px;font-weight:500;margin-bottom:10px}.column-settings__hashtags .column-select__menu li{padding:4px 0}.column-settings__hashtags .column-select__menu ul{margin-bottom:10px}.column-settings__hashtags .column-select__menu em{font-weight:500;color:#000}.column-settings__hashtags .column-select__menu-list{padding:6px}.column-settings__hashtags .column-select__option{color:#000;border-radius:4px;font-size:14px}.column-settings__hashtags .column-select__option--is-focused,.column-settings__hashtags .column-select__option--is-selected{background:#b9c8d5}.column-settings__row .text-btn{margin-bottom:15px}.relationship-tag{color:#fff;margin-bottom:4px;display:block;vertical-align:top;background-color:#000;font-size:12px;font-weight:500;padding:4px;border-radius:4px;opacity:.7}.relationship-tag:hover{opacity:1}.setting-toggle{display:block;line-height:24px}.setting-toggle__label{color:#dde3ec;display:inline-block;margin-bottom:14px;margin-left:8px;vertical-align:middle}.empty-column-indicator,.error-column{color:#c2cede;background:#282c37;text-align:center;padding:20px;font-size:15px;font-weight:400;cursor:default;display:flex;flex:1 1 auto;align-items:center;justify-content:center}@supports(display: grid){.empty-column-indicator,.error-column{contain:strict}}.empty-column-indicator>span,.error-column>span{max-width:400px}.empty-column-indicator a,.error-column a{color:#2b90d9;text-decoration:none}.empty-column-indicator a:hover,.error-column a:hover{text-decoration:underline}.error-column{flex-direction:column}@keyframes heartbeat{from{transform:scale(1);animation-timing-function:ease-out}10%{transform:scale(0.91);animation-timing-function:ease-in}17%{transform:scale(0.98);animation-timing-function:ease-out}33%{transform:scale(0.87);animation-timing-function:ease-in}45%{transform:scale(1);animation-timing-function:ease-out}}.no-reduce-motion .pulse-loading{transform-origin:center center;animation:heartbeat 1.5s ease-in-out infinite both}@keyframes shake-bottom{0%,100%{transform:rotate(0deg);transform-origin:50% 100%}10%{transform:rotate(2deg)}20%,40%,60%{transform:rotate(-4deg)}30%,50%,70%{transform:rotate(4deg)}80%{transform:rotate(-2deg)}90%{transform:rotate(2deg)}}.no-reduce-motion .shake-bottom{transform-origin:50% 100%;animation:shake-bottom .8s cubic-bezier(0.455, 0.03, 0.515, 0.955) 2s 2 both}.emoji-picker-dropdown__menu{background:#fff;position:absolute;box-shadow:4px 4px 6px rgba(0,0,0,.4);border-radius:4px;margin-top:5px;z-index:2}.emoji-picker-dropdown__menu .emoji-mart-scroll{transition:opacity 200ms ease}.emoji-picker-dropdown__menu.selecting .emoji-mart-scroll{opacity:.5}.emoji-picker-dropdown__modifiers{position:absolute;top:60px;right:11px;cursor:pointer}.emoji-picker-dropdown__modifiers__menu{position:absolute;z-index:4;top:-4px;left:-8px;background:#fff;border-radius:4px;box-shadow:1px 2px 6px rgba(0,0,0,.2);overflow:hidden}.emoji-picker-dropdown__modifiers__menu button{display:block;cursor:pointer;border:0;padding:4px 8px;background:transparent}.emoji-picker-dropdown__modifiers__menu button:hover,.emoji-picker-dropdown__modifiers__menu button:focus,.emoji-picker-dropdown__modifiers__menu button:active{background:rgba(217,225,232,.4)}.emoji-picker-dropdown__modifiers__menu .emoji-mart-emoji{height:22px}.emoji-mart-emoji span{background-repeat:no-repeat}.upload-area{align-items:center;background:rgba(0,0,0,.8);display:flex;height:100%;justify-content:center;left:0;opacity:0;position:absolute;top:0;visibility:hidden;width:100%;z-index:2000}.upload-area *{pointer-events:none}.upload-area__drop{width:320px;height:160px;display:flex;box-sizing:border-box;position:relative;padding:8px}.upload-area__background{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;border-radius:4px;background:#282c37;box-shadow:0 0 5px rgba(0,0,0,.2)}.upload-area__content{flex:1;display:flex;align-items:center;justify-content:center;color:#ecf0f4;font-size:18px;font-weight:500;border:2px dashed #606984;border-radius:4px}.upload-progress{padding:10px;color:#1b1e25;overflow:hidden;display:flex}.upload-progress .fa{font-size:34px;margin-right:10px}.upload-progress span{font-size:13px;font-weight:500;display:block}.upload-progess__message{flex:1 1 auto}.upload-progress__backdrop{width:100%;height:6px;border-radius:6px;background:#606984;position:relative;margin-top:5px}.upload-progress__tracker{position:absolute;left:0;top:0;height:6px;background:#2b5fd9;border-radius:6px}.emoji-button{display:block;font-size:24px;line-height:24px;margin-left:2px;width:24px;outline:0;cursor:pointer}.emoji-button:active,.emoji-button:focus{outline:0 !important}.emoji-button img{filter:grayscale(100%);opacity:.8;display:block;margin:0;width:22px;height:22px;margin-top:2px}.emoji-button:hover img,.emoji-button:active img,.emoji-button:focus img{opacity:1;filter:none}.dropdown--active .emoji-button img{opacity:1;filter:none}.privacy-dropdown__dropdown{position:absolute;background:#fff;box-shadow:2px 4px 15px rgba(0,0,0,.4);border-radius:4px;margin-left:40px;overflow:hidden}.privacy-dropdown__dropdown.top{transform-origin:50% 100%}.privacy-dropdown__dropdown.bottom{transform-origin:50% 0}.privacy-dropdown__option{color:#000;padding:10px;cursor:pointer;display:flex}.privacy-dropdown__option:hover,.privacy-dropdown__option.active{background:#2b5fd9;color:#fff;outline:0}.privacy-dropdown__option:hover .privacy-dropdown__option__content,.privacy-dropdown__option.active .privacy-dropdown__option__content{color:#fff}.privacy-dropdown__option:hover .privacy-dropdown__option__content strong,.privacy-dropdown__option.active .privacy-dropdown__option__content strong{color:#fff}.privacy-dropdown__option.active:hover{background:#3c6cdc}.privacy-dropdown__option__icon{display:flex;align-items:center;justify-content:center;margin-right:10px}.privacy-dropdown__option__content{flex:1 1 auto;color:#1b1e25}.privacy-dropdown__option__content strong{font-weight:500;display:block;color:#000}.privacy-dropdown__option__content strong:lang(ja){font-weight:700}.privacy-dropdown__option__content strong:lang(ko){font-weight:700}.privacy-dropdown__option__content strong:lang(zh-CN){font-weight:700}.privacy-dropdown__option__content strong:lang(zh-HK){font-weight:700}.privacy-dropdown__option__content strong:lang(zh-TW){font-weight:700}.privacy-dropdown.active .privacy-dropdown__value{background:#fff;border-radius:4px 4px 0 0;box-shadow:0 -4px 4px rgba(0,0,0,.1)}.privacy-dropdown.active .privacy-dropdown__value .icon-button{transition:none}.privacy-dropdown.active .privacy-dropdown__value.active{background:#2b5fd9}.privacy-dropdown.active .privacy-dropdown__value.active .icon-button{color:#fff}.privacy-dropdown.active.top .privacy-dropdown__value{border-radius:0 0 4px 4px}.privacy-dropdown.active .privacy-dropdown__dropdown{display:block;box-shadow:2px 4px 6px rgba(0,0,0,.1)}.search{position:relative}.search__input{outline:0;box-sizing:border-box;width:100%;border:0;box-shadow:none;font-family:inherit;background:#282c37;color:#dde3ec;font-size:14px;margin:0;display:block;padding:15px;padding-right:30px;line-height:18px;font-size:16px}.search__input::placeholder{color:#eaeef3}.search__input::-moz-focus-inner{border:0}.search__input::-moz-focus-inner,.search__input:focus,.search__input:active{outline:0 !important}.search__input:focus{background:#313543}@media screen and (max-width: 600px){.search__input{font-size:16px}}.search__icon::-moz-focus-inner{border:0}.search__icon::-moz-focus-inner,.search__icon:focus{outline:0 !important}.search__icon .fa{position:absolute;top:16px;right:10px;z-index:2;display:inline-block;opacity:0;transition:all 100ms linear;transition-property:transform,opacity;font-size:18px;width:18px;height:18px;color:#ecf0f4;cursor:default;pointer-events:none}.search__icon .fa.active{pointer-events:auto;opacity:.3}.search__icon .fa-search{transform:rotate(90deg)}.search__icon .fa-search.active{pointer-events:none;transform:rotate(0deg)}.search__icon .fa-times-circle{top:17px;transform:rotate(0deg);color:#8d9ac2;cursor:pointer}.search__icon .fa-times-circle.active{transform:rotate(90deg)}.search__icon .fa-times-circle:hover{color:#a4afce}.search-results__header{color:#c2cede;background:#2c313d;padding:15px;font-weight:500;font-size:16px;cursor:default}.search-results__header .fa{display:inline-block;margin-right:5px}.search-results__section{margin-bottom:5px}.search-results__section h5{background:#1f232b;border-bottom:1px solid #393f4f;cursor:default;display:flex;padding:15px;font-weight:500;font-size:16px;color:#c2cede}.search-results__section h5 .fa{display:inline-block;margin-right:5px}.search-results__section .account:last-child,.search-results__section>div:last-child .status{border-bottom:0}.search-results__hashtag{display:block;padding:10px;color:#ecf0f4;text-decoration:none}.search-results__hashtag:hover,.search-results__hashtag:active,.search-results__hashtag:focus{color:#f9fafb;text-decoration:underline}.search-results__info{padding:20px;color:#dde3ec;text-align:center}.modal-root{position:relative;transition:opacity .3s linear;will-change:opacity;z-index:9999}.modal-root__overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.7)}.modal-root__container{position:fixed;top:0;left:0;width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;align-content:space-around;z-index:9999;pointer-events:none;user-select:none}.modal-root__modal{pointer-events:auto;display:flex;z-index:9999}.video-modal__container{max-width:100vw;max-height:100vh}.audio-modal__container{width:50vw}.media-modal{width:100%;height:100%;position:relative}.media-modal .extended-video-player{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.media-modal .extended-video-player video{max-width:100%;max-height:80%}.media-modal__closer{position:absolute;top:0;left:0;right:0;bottom:0}.media-modal__navigation{position:absolute;top:0;left:0;right:0;bottom:0;pointer-events:none;transition:opacity .3s linear;will-change:opacity}.media-modal__navigation *{pointer-events:auto}.media-modal__navigation.media-modal__navigation--hidden{opacity:0}.media-modal__navigation.media-modal__navigation--hidden *{pointer-events:none}.media-modal__nav{background:rgba(0,0,0,.5);box-sizing:border-box;border:0;color:#fff;cursor:pointer;display:flex;align-items:center;font-size:24px;height:20vmax;margin:auto 0;padding:30px 15px;position:absolute;top:0;bottom:0}.media-modal__nav--left{left:0}.media-modal__nav--right{right:0}.media-modal__pagination{width:100%;text-align:center;position:absolute;left:0;bottom:20px;pointer-events:none}.media-modal__meta{text-align:center;position:absolute;left:0;bottom:20px;width:100%;pointer-events:none}.media-modal__meta--shifted{bottom:62px}.media-modal__meta a{pointer-events:auto;text-decoration:none;font-weight:500;color:#d9e1e8}.media-modal__meta a:hover,.media-modal__meta a:focus,.media-modal__meta a:active{text-decoration:underline}.media-modal__page-dot{display:inline-block}.media-modal__button{background-color:#fff;height:12px;width:12px;border-radius:6px;margin:10px;padding:0;border:0;font-size:0}.media-modal__button--active{background-color:#2b90d9}.media-modal__close{position:absolute;right:8px;top:8px;z-index:100}.onboarding-modal,.error-modal,.embed-modal{background:#d9e1e8;color:#000;border-radius:8px;overflow:hidden;display:flex;flex-direction:column}.error-modal__body{height:80vh;width:80vw;max-width:520px;max-height:420px;position:relative}.error-modal__body>div{position:absolute;top:0;left:0;width:100%;height:100%;box-sizing:border-box;padding:25px;display:none;flex-direction:column;align-items:center;justify-content:center;display:flex;opacity:0;user-select:text}.error-modal__body{display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center}.onboarding-modal__paginator,.error-modal__footer{flex:0 0 auto;background:#c0cdd9;display:flex;padding:25px}.onboarding-modal__paginator>div,.error-modal__footer>div{min-width:33px}.onboarding-modal__paginator .onboarding-modal__nav,.onboarding-modal__paginator .error-modal__nav,.error-modal__footer .onboarding-modal__nav,.error-modal__footer .error-modal__nav{color:#1b1e25;border:0;font-size:14px;font-weight:500;padding:10px 25px;line-height:inherit;height:auto;margin:-10px;border-radius:4px;background-color:transparent}.onboarding-modal__paginator .onboarding-modal__nav:hover,.onboarding-modal__paginator .onboarding-modal__nav:focus,.onboarding-modal__paginator .onboarding-modal__nav:active,.onboarding-modal__paginator .error-modal__nav:hover,.onboarding-modal__paginator .error-modal__nav:focus,.onboarding-modal__paginator .error-modal__nav:active,.error-modal__footer .onboarding-modal__nav:hover,.error-modal__footer .onboarding-modal__nav:focus,.error-modal__footer .onboarding-modal__nav:active,.error-modal__footer .error-modal__nav:hover,.error-modal__footer .error-modal__nav:focus,.error-modal__footer .error-modal__nav:active{color:#131419;background-color:#a6b9c9}.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next,.error-modal__footer .error-modal__nav.onboarding-modal__done,.error-modal__footer .error-modal__nav.onboarding-modal__next{color:#000}.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:hover,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:focus,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:active,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:hover,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:focus,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:active,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:hover,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:focus,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:active,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:hover,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:focus,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:active,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:hover,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:focus,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:active,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:hover,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:focus,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:active,.error-modal__footer .error-modal__nav.onboarding-modal__done:hover,.error-modal__footer .error-modal__nav.onboarding-modal__done:focus,.error-modal__footer .error-modal__nav.onboarding-modal__done:active,.error-modal__footer .error-modal__nav.onboarding-modal__next:hover,.error-modal__footer .error-modal__nav.onboarding-modal__next:focus,.error-modal__footer .error-modal__nav.onboarding-modal__next:active{color:#0a0a0a}.error-modal__footer{justify-content:center}.display-case{text-align:center;font-size:15px;margin-bottom:15px}.display-case__label{font-weight:500;color:#000;margin-bottom:5px;font-size:13px}.display-case__case{background:#282c37;color:#ecf0f4;font-weight:500;padding:10px;border-radius:4px}.onboard-sliders{display:inline-block;max-width:30px;max-height:auto;margin-left:10px}.boost-modal,.confirmation-modal,.report-modal,.actions-modal,.mute-modal,.block-modal{background:#f2f5f7;color:#000;border-radius:8px;overflow:hidden;max-width:90vw;width:480px;position:relative;flex-direction:column}.boost-modal .status__display-name,.confirmation-modal .status__display-name,.report-modal .status__display-name,.actions-modal .status__display-name,.mute-modal .status__display-name,.block-modal .status__display-name{display:block;max-width:100%;padding-right:25px}.boost-modal .status__avatar,.confirmation-modal .status__avatar,.report-modal .status__avatar,.actions-modal .status__avatar,.mute-modal .status__avatar,.block-modal .status__avatar{height:28px;left:10px;position:absolute;top:10px;width:48px}.boost-modal .status__content__spoiler-link,.confirmation-modal .status__content__spoiler-link,.report-modal .status__content__spoiler-link,.actions-modal .status__content__spoiler-link,.mute-modal .status__content__spoiler-link,.block-modal .status__content__spoiler-link{color:#fff}.actions-modal .status{background:#fff;border-bottom-color:#d9e1e8;padding-top:10px;padding-bottom:10px}.actions-modal .dropdown-menu__separator{border-bottom-color:#d9e1e8}.boost-modal__container{overflow-x:scroll;padding:10px}.boost-modal__container .status{user-select:text;border-bottom:0}.boost-modal__action-bar,.confirmation-modal__action-bar,.mute-modal__action-bar,.block-modal__action-bar{display:flex;justify-content:space-between;background:#d9e1e8;padding:10px;line-height:36px}.boost-modal__action-bar>div,.confirmation-modal__action-bar>div,.mute-modal__action-bar>div,.block-modal__action-bar>div{flex:1 1 auto;text-align:right;color:#1b1e25;padding-right:10px}.boost-modal__action-bar .button,.confirmation-modal__action-bar .button,.mute-modal__action-bar .button,.block-modal__action-bar .button{flex:0 0 auto}.boost-modal__status-header{font-size:15px}.boost-modal__status-time{float:right;font-size:14px}.mute-modal,.block-modal{line-height:24px}.mute-modal .react-toggle,.block-modal .react-toggle{vertical-align:middle}.report-modal{width:90vw;max-width:700px}.report-modal__container{display:flex;border-top:1px solid #d9e1e8}@media screen and (max-width: 480px){.report-modal__container{flex-wrap:wrap;overflow-y:auto}}.report-modal__statuses,.report-modal__comment{box-sizing:border-box;width:50%}@media screen and (max-width: 480px){.report-modal__statuses,.report-modal__comment{width:100%}}.report-modal__statuses,.focal-point-modal__content{flex:1 1 auto;min-height:20vh;max-height:80vh;overflow-y:auto;overflow-x:hidden}.report-modal__statuses .status__content a,.focal-point-modal__content .status__content a{color:#2b90d9}.report-modal__statuses .status__content,.report-modal__statuses .status__content p,.focal-point-modal__content .status__content,.focal-point-modal__content .status__content p{color:#000}@media screen and (max-width: 480px){.report-modal__statuses,.focal-point-modal__content{max-height:10vh}}@media screen and (max-width: 480px){.focal-point-modal__content{max-height:40vh}}.report-modal__comment{padding:20px;border-right:1px solid #d9e1e8;max-width:320px}.report-modal__comment p{font-size:14px;line-height:20px;margin-bottom:20px}.report-modal__comment .setting-text{display:block;box-sizing:border-box;width:100%;margin:0;color:#000;background:#fff;padding:10px;font-family:inherit;font-size:14px;resize:none;border:0;outline:0;border-radius:4px;border:1px solid #d9e1e8;min-height:100px;max-height:50vh;margin-bottom:10px}.report-modal__comment .setting-text:focus{border:1px solid #c0cdd9}.report-modal__comment .setting-text__wrapper{background:#fff;border:1px solid #d9e1e8;margin-bottom:10px;border-radius:4px}.report-modal__comment .setting-text__wrapper .setting-text{border:0;margin-bottom:0;border-radius:0}.report-modal__comment .setting-text__wrapper .setting-text:focus{border:0}.report-modal__comment .setting-text__wrapper__modifiers{color:#000;font-family:inherit;font-size:14px;background:#fff}.report-modal__comment .setting-text__toolbar{display:flex;justify-content:space-between;margin-bottom:20px}.report-modal__comment .setting-text-label{display:block;color:#000;font-size:14px;font-weight:500;margin-bottom:10px}.report-modal__comment .setting-toggle{margin-top:20px;margin-bottom:24px}.report-modal__comment .setting-toggle__label{color:#000;font-size:14px}@media screen and (max-width: 480px){.report-modal__comment{padding:10px;max-width:100%;order:2}.report-modal__comment .setting-toggle{margin-bottom:4px}}.actions-modal{max-height:80vh;max-width:80vw}.actions-modal .status{overflow-y:auto;max-height:300px}.actions-modal .actions-modal__item-label{font-weight:500}.actions-modal ul{overflow-y:auto;flex-shrink:0;max-height:80vh}.actions-modal ul.with-status{max-height:calc(80vh - 75px)}.actions-modal ul li:empty{margin:0}.actions-modal ul li:not(:empty) a{color:#000;display:flex;padding:12px 16px;font-size:15px;align-items:center;text-decoration:none}.actions-modal ul li:not(:empty) a,.actions-modal ul li:not(:empty) a button{transition:none}.actions-modal ul li:not(:empty) a.active,.actions-modal ul li:not(:empty) a.active button,.actions-modal ul li:not(:empty) a:hover,.actions-modal ul li:not(:empty) a:hover button,.actions-modal ul li:not(:empty) a:active,.actions-modal ul li:not(:empty) a:active button,.actions-modal ul li:not(:empty) a:focus,.actions-modal ul li:not(:empty) a:focus button{background:#2b5fd9;color:#fff}.actions-modal ul li:not(:empty) a button:first-child{margin-right:10px}.confirmation-modal__action-bar .confirmation-modal__secondary-button,.mute-modal__action-bar .confirmation-modal__secondary-button,.block-modal__action-bar .confirmation-modal__secondary-button{flex-shrink:1}.confirmation-modal__secondary-button,.confirmation-modal__cancel-button,.mute-modal__cancel-button,.block-modal__cancel-button{background-color:transparent;color:#1b1e25;font-size:14px;font-weight:500}.confirmation-modal__secondary-button:hover,.confirmation-modal__secondary-button:focus,.confirmation-modal__secondary-button:active,.confirmation-modal__cancel-button:hover,.confirmation-modal__cancel-button:focus,.confirmation-modal__cancel-button:active,.mute-modal__cancel-button:hover,.mute-modal__cancel-button:focus,.mute-modal__cancel-button:active,.block-modal__cancel-button:hover,.block-modal__cancel-button:focus,.block-modal__cancel-button:active{color:#131419;background-color:transparent}.confirmation-modal__container,.mute-modal__container,.block-modal__container,.report-modal__target{padding:30px;font-size:16px}.confirmation-modal__container strong,.mute-modal__container strong,.block-modal__container strong,.report-modal__target strong{font-weight:500}.confirmation-modal__container strong:lang(ja),.mute-modal__container strong:lang(ja),.block-modal__container strong:lang(ja),.report-modal__target strong:lang(ja){font-weight:700}.confirmation-modal__container strong:lang(ko),.mute-modal__container strong:lang(ko),.block-modal__container strong:lang(ko),.report-modal__target strong:lang(ko){font-weight:700}.confirmation-modal__container strong:lang(zh-CN),.mute-modal__container strong:lang(zh-CN),.block-modal__container strong:lang(zh-CN),.report-modal__target strong:lang(zh-CN){font-weight:700}.confirmation-modal__container strong:lang(zh-HK),.mute-modal__container strong:lang(zh-HK),.block-modal__container strong:lang(zh-HK),.report-modal__target strong:lang(zh-HK){font-weight:700}.confirmation-modal__container strong:lang(zh-TW),.mute-modal__container strong:lang(zh-TW),.block-modal__container strong:lang(zh-TW),.report-modal__target strong:lang(zh-TW){font-weight:700}.confirmation-modal__container,.report-modal__target{text-align:center}.block-modal__explanation,.mute-modal__explanation{margin-top:20px}.block-modal .setting-toggle,.mute-modal .setting-toggle{margin-top:20px;margin-bottom:24px;display:flex;align-items:center}.block-modal .setting-toggle__label,.mute-modal .setting-toggle__label{color:#000;margin:0;margin-left:8px}.report-modal__target{padding:15px}.report-modal__target .media-modal__close{top:14px;right:15px}.loading-bar{background-color:#2b90d9;height:3px;position:absolute;top:0;left:0;z-index:9999}.media-gallery__gifv__label{display:block;position:absolute;color:#fff;background:rgba(0,0,0,.5);bottom:6px;left:6px;padding:2px 6px;border-radius:2px;font-size:11px;font-weight:600;z-index:1;pointer-events:none;opacity:.9;transition:opacity .1s ease;line-height:18px}.media-gallery__gifv.autoplay .media-gallery__gifv__label{display:none}.media-gallery__gifv:hover .media-gallery__gifv__label{opacity:1}.media-gallery__audio{margin-top:32px}.media-gallery__audio audio{width:100%}.attachment-list{display:flex;font-size:14px;border:1px solid #393f4f;border-radius:4px;margin-top:14px;overflow:hidden}.attachment-list__icon{flex:0 0 auto;color:#c2cede;padding:8px 18px;cursor:default;border-right:1px solid #393f4f;display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:26px}.attachment-list__icon .fa{display:block}.attachment-list__list{list-style:none;padding:4px 0;padding-left:8px;display:flex;flex-direction:column;justify-content:center}.attachment-list__list li{display:block;padding:4px 0}.attachment-list__list a{text-decoration:none;color:#c2cede;font-weight:500}.attachment-list__list a:hover{text-decoration:underline}.attachment-list.compact{border:0;margin-top:4px}.attachment-list.compact .attachment-list__list{padding:0;display:block}.attachment-list.compact .fa{color:#c2cede}.media-gallery{box-sizing:border-box;margin-top:8px;overflow:hidden;border-radius:4px;position:relative;width:100%}.media-gallery__item{border:0;box-sizing:border-box;display:block;float:left;position:relative;border-radius:4px;overflow:hidden}.media-gallery__item.standalone .media-gallery__item-gifv-thumbnail{transform:none;top:0}.media-gallery__item-thumbnail{cursor:zoom-in;display:block;text-decoration:none;color:#ecf0f4;position:relative;z-index:1}.media-gallery__item-thumbnail,.media-gallery__item-thumbnail img{height:100%;width:100%}.media-gallery__item-thumbnail img{object-fit:cover}.media-gallery__preview{width:100%;height:100%;object-fit:cover;position:absolute;top:0;left:0;z-index:0;background:#000}.media-gallery__preview--hidden{display:none}.media-gallery__gifv{height:100%;overflow:hidden;position:relative;width:100%}.media-gallery__item-gifv-thumbnail{cursor:zoom-in;height:100%;object-fit:cover;position:relative;top:50%;transform:translateY(-50%);width:100%;z-index:1}.media-gallery__item-thumbnail-label{clip:rect(1px 1px 1px 1px);clip:rect(1px, 1px, 1px, 1px);overflow:hidden;position:absolute}.detailed .video-player__volume__current,.detailed .video-player__volume::before,.fullscreen .video-player__volume__current,.fullscreen .video-player__volume::before{bottom:27px}.detailed .video-player__volume__handle,.fullscreen .video-player__volume__handle{bottom:23px}.audio-player{box-sizing:border-box;position:relative;background:#17191f;border-radius:4px;padding-bottom:44px;direction:ltr}.audio-player.editable{border-radius:0;height:100%}.audio-player__waveform{padding:15px 0;position:relative;overflow:hidden}.audio-player__waveform::before{content:\"\";display:block;position:absolute;border-top:1px solid #313543;width:100%;height:0;left:0;top:calc(50% + 1px)}.audio-player__progress-placeholder{background-color:rgba(78,121,223,.5)}.audio-player__wave-placeholder{background-color:#4a5266}.audio-player .video-player__controls{padding:0 15px;padding-top:10px;background:#17191f;border-top:1px solid #313543;border-radius:0 0 4px 4px}.video-player{overflow:hidden;position:relative;background:#000;max-width:100%;border-radius:4px;box-sizing:border-box;direction:ltr}.video-player.editable{border-radius:0;height:100% !important}.video-player:focus{outline:0}.video-player video{max-width:100vw;max-height:80vh;z-index:1}.video-player.fullscreen{width:100% !important;height:100% !important;margin:0}.video-player.fullscreen video{max-width:100% !important;max-height:100% !important;width:100% !important;height:100% !important;outline:0}.video-player.inline video{object-fit:contain;position:relative;top:50%;transform:translateY(-50%)}.video-player__controls{position:absolute;z-index:2;bottom:0;left:0;right:0;box-sizing:border-box;background:linear-gradient(0deg, rgba(0, 0, 0, 0.85) 0, rgba(0, 0, 0, 0.45) 60%, transparent);padding:0 15px;opacity:0;transition:opacity .1s ease}.video-player__controls.active{opacity:1}.video-player.inactive video,.video-player.inactive .video-player__controls{visibility:hidden}.video-player__spoiler{display:none;position:absolute;top:0;left:0;width:100%;height:100%;z-index:4;border:0;background:#000;color:#dde3ec;transition:none;pointer-events:none}.video-player__spoiler.active{display:block;pointer-events:auto}.video-player__spoiler.active:hover,.video-player__spoiler.active:active,.video-player__spoiler.active:focus{color:#f4f6f9}.video-player__spoiler__title{display:block;font-size:14px}.video-player__spoiler__subtitle{display:block;font-size:11px;font-weight:500}.video-player__buttons-bar{display:flex;justify-content:space-between;padding-bottom:10px}.video-player__buttons-bar .video-player__download__icon{color:inherit}.video-player__buttons{font-size:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.video-player__buttons.left button{padding-left:0}.video-player__buttons.right button{padding-right:0}.video-player__buttons button{background:transparent;padding:2px 10px;font-size:16px;border:0;color:rgba(255,255,255,.75)}.video-player__buttons button:active,.video-player__buttons button:hover,.video-player__buttons button:focus{color:#fff}.video-player__time-sep,.video-player__time-total,.video-player__time-current{font-size:14px;font-weight:500}.video-player__time-current{color:#fff;margin-left:60px}.video-player__time-sep{display:inline-block;margin:0 6px}.video-player__time-sep,.video-player__time-total{color:#fff}.video-player__volume{cursor:pointer;height:24px;display:inline}.video-player__volume::before{content:\"\";width:50px;background:rgba(255,255,255,.35);border-radius:4px;display:block;position:absolute;height:4px;left:70px;bottom:20px}.video-player__volume__current{display:block;position:absolute;height:4px;border-radius:4px;left:70px;bottom:20px;background:#4e79df}.video-player__volume__handle{position:absolute;z-index:3;border-radius:50%;width:12px;height:12px;bottom:16px;left:70px;transition:opacity .1s ease;background:#4e79df;box-shadow:1px 2px 6px rgba(0,0,0,.2);pointer-events:none}.video-player__link{padding:2px 10px}.video-player__link a{text-decoration:none;font-size:14px;font-weight:500;color:#fff}.video-player__link a:hover,.video-player__link a:active,.video-player__link a:focus{text-decoration:underline}.video-player__seek{cursor:pointer;height:24px;position:relative}.video-player__seek::before{content:\"\";width:100%;background:rgba(255,255,255,.35);border-radius:4px;display:block;position:absolute;height:4px;top:10px}.video-player__seek__progress,.video-player__seek__buffer{display:block;position:absolute;height:4px;border-radius:4px;top:10px;background:#4e79df}.video-player__seek__buffer{background:rgba(255,255,255,.2)}.video-player__seek__handle{position:absolute;z-index:3;opacity:0;border-radius:50%;width:12px;height:12px;top:6px;margin-left:-6px;transition:opacity .1s ease;background:#4e79df;box-shadow:1px 2px 6px rgba(0,0,0,.2);pointer-events:none}.video-player__seek__handle.active{opacity:1}.video-player__seek:hover .video-player__seek__handle{opacity:1}.video-player.detailed .video-player__buttons button,.video-player.fullscreen .video-player__buttons button{padding-top:10px;padding-bottom:10px}.directory__list{width:100%;margin:10px 0;transition:opacity 100ms ease-in}.directory__list.loading{opacity:.7}@media screen and (max-width: 415px){.directory__list{margin:0}}.directory__card{box-sizing:border-box;margin-bottom:10px}.directory__card__img{height:125px;position:relative;background:#0e1014;overflow:hidden}.directory__card__img img{display:block;width:100%;height:100%;margin:0;object-fit:cover}.directory__card__bar{display:flex;align-items:center;background:#313543;padding:10px}.directory__card__bar__name{flex:1 1 auto;display:flex;align-items:center;text-decoration:none;overflow:hidden}.directory__card__bar__relationship{width:23px;min-height:1px;flex:0 0 auto}.directory__card__bar .avatar{flex:0 0 auto;width:48px;height:48px;padding-top:2px}.directory__card__bar .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px;background:#17191f;object-fit:cover}.directory__card__bar .display-name{margin-left:15px;text-align:left}.directory__card__bar .display-name strong{font-size:15px;color:#fff;font-weight:500;overflow:hidden;text-overflow:ellipsis}.directory__card__bar .display-name span{display:block;font-size:14px;color:#dde3ec;font-weight:400;overflow:hidden;text-overflow:ellipsis}.directory__card__extra{background:#282c37;display:flex;align-items:center;justify-content:center}.directory__card__extra .accounts-table__count{width:33.33%;flex:0 0 auto;padding:15px 0}.directory__card__extra .account__header__content{box-sizing:border-box;padding:15px 10px;border-bottom:1px solid #393f4f;width:100%;min-height:48px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.directory__card__extra .account__header__content p{display:none}.directory__card__extra .account__header__content p:first-child{display:inline}.directory__card__extra .account__header__content br{display:none}.account-gallery__container{display:flex;flex-wrap:wrap;padding:4px 2px}.account-gallery__item{border:0;box-sizing:border-box;display:block;position:relative;border-radius:4px;overflow:hidden;margin:2px}.account-gallery__item__icons{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);font-size:24px}.notification__filter-bar,.account__section-headline{background:#1f232b;border-bottom:1px solid #393f4f;cursor:default;display:flex;flex-shrink:0}.notification__filter-bar button,.account__section-headline button{background:#1f232b;border:0;margin:0}.notification__filter-bar button,.notification__filter-bar a,.account__section-headline button,.account__section-headline a{display:block;flex:1 1 auto;color:#dde3ec;padding:15px 0;font-size:14px;font-weight:500;text-align:center;text-decoration:none;position:relative}.notification__filter-bar button.active,.notification__filter-bar a.active,.account__section-headline button.active,.account__section-headline a.active{color:#ecf0f4}.notification__filter-bar button.active::before,.notification__filter-bar button.active::after,.notification__filter-bar a.active::before,.notification__filter-bar a.active::after,.account__section-headline button.active::before,.account__section-headline button.active::after,.account__section-headline a.active::before,.account__section-headline a.active::after{display:block;content:\"\";position:absolute;bottom:0;left:50%;width:0;height:0;transform:translateX(-50%);border-style:solid;border-width:0 10px 10px;border-color:transparent transparent #393f4f}.notification__filter-bar button.active::after,.notification__filter-bar a.active::after,.account__section-headline button.active::after,.account__section-headline a.active::after{bottom:-1px;border-color:transparent transparent #282c37}.notification__filter-bar.directory__section-headline,.account__section-headline.directory__section-headline{background:#242731;border-bottom-color:transparent}.notification__filter-bar.directory__section-headline a.active::before,.notification__filter-bar.directory__section-headline button.active::before,.account__section-headline.directory__section-headline a.active::before,.account__section-headline.directory__section-headline button.active::before{display:none}.notification__filter-bar.directory__section-headline a.active::after,.notification__filter-bar.directory__section-headline button.active::after,.account__section-headline.directory__section-headline a.active::after,.account__section-headline.directory__section-headline button.active::after{border-color:transparent transparent #191b22}.filter-form{background:#282c37}.filter-form__column{padding:10px 15px}.filter-form .radio-button{display:block}.radio-button{font-size:14px;position:relative;display:inline-block;padding:6px 0;line-height:18px;cursor:default;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer}.radio-button input[type=radio],.radio-button input[type=checkbox]{display:none}.radio-button__input{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:50%;vertical-align:middle}.radio-button__input.checked{border-color:#4e79df;background:#4e79df}::-webkit-scrollbar-thumb{border-radius:0}.search-popout{background:#fff;border-radius:4px;padding:10px 14px;padding-bottom:14px;margin-top:10px;color:#364861;box-shadow:2px 4px 15px rgba(0,0,0,.4)}.search-popout h4{color:#364861;font-size:14px;font-weight:500;margin-bottom:10px}.search-popout li{padding:4px 0}.search-popout ul{margin-bottom:10px}.search-popout em{font-weight:500;color:#000}noscript{text-align:center}noscript img{width:200px;opacity:.5;animation:flicker 4s infinite}noscript div{font-size:14px;margin:30px auto;color:#ecf0f4;max-width:400px}noscript div a{color:#2b90d9;text-decoration:underline}noscript div a:hover{text-decoration:none}@keyframes flicker{0%{opacity:1}30%{opacity:.75}100%{opacity:1}}@media screen and (max-width: 630px)and (max-height: 400px){.tabs-bar,.search{will-change:margin-top;transition:margin-top 400ms 100ms}.navigation-bar{will-change:padding-bottom;transition:padding-bottom 400ms 100ms}.navigation-bar>a:first-child{will-change:margin-top,margin-left,margin-right,width;transition:margin-top 400ms 100ms,margin-left 400ms 500ms,margin-right 400ms 500ms}.navigation-bar>.navigation-bar__profile-edit{will-change:margin-top;transition:margin-top 400ms 100ms}.navigation-bar .navigation-bar__actions>.icon-button.close{will-change:opacity transform;transition:opacity 200ms 100ms,transform 400ms 100ms}.navigation-bar .navigation-bar__actions>.compose__action-bar .icon-button{will-change:opacity transform;transition:opacity 200ms 300ms,transform 400ms 100ms}.is-composing .tabs-bar,.is-composing .search{margin-top:-50px}.is-composing .navigation-bar{padding-bottom:0}.is-composing .navigation-bar>a:first-child{margin:-100px 10px 0 -50px}.is-composing .navigation-bar .navigation-bar__profile{padding-top:2px}.is-composing .navigation-bar .navigation-bar__profile-edit{position:absolute;margin-top:-60px}.is-composing .navigation-bar .navigation-bar__actions .icon-button.close{pointer-events:auto;opacity:1;transform:scale(1, 1) translate(0, 0);bottom:5px}.is-composing .navigation-bar .navigation-bar__actions .compose__action-bar .icon-button{pointer-events:none;opacity:0;transform:scale(0, 1) translate(100%, 0)}}.embed-modal{width:auto;max-width:80vw;max-height:80vh}.embed-modal h4{padding:30px;font-weight:500;font-size:16px;text-align:center}.embed-modal .embed-modal__container{padding:10px}.embed-modal .embed-modal__container .hint{margin-bottom:15px}.embed-modal .embed-modal__container .embed-modal__html{outline:0;box-sizing:border-box;display:block;width:100%;border:0;padding:10px;font-family:\"mastodon-font-monospace\",monospace;background:#282c37;color:#fff;font-size:14px;margin:0;margin-bottom:15px;border-radius:4px}.embed-modal .embed-modal__container .embed-modal__html::-moz-focus-inner{border:0}.embed-modal .embed-modal__container .embed-modal__html::-moz-focus-inner,.embed-modal .embed-modal__container .embed-modal__html:focus,.embed-modal .embed-modal__container .embed-modal__html:active{outline:0 !important}.embed-modal .embed-modal__container .embed-modal__html:focus{background:#313543}@media screen and (max-width: 600px){.embed-modal .embed-modal__container .embed-modal__html{font-size:16px}}.embed-modal .embed-modal__container .embed-modal__iframe{width:400px;max-width:100%;overflow:hidden;border:0;border-radius:4px}.account__moved-note{padding:14px 10px;padding-bottom:16px;background:#313543;border-top:1px solid #393f4f;border-bottom:1px solid #393f4f}.account__moved-note__message{position:relative;margin-left:58px;color:#c2cede;padding:8px 0;padding-top:0;padding-bottom:4px;font-size:14px}.account__moved-note__message>span{display:block;overflow:hidden;text-overflow:ellipsis}.account__moved-note__icon-wrapper{left:-26px;position:absolute}.account__moved-note .detailed-status__display-avatar{position:relative}.account__moved-note .detailed-status__display-name{margin-bottom:0}.column-inline-form{padding:15px;padding-right:0;display:flex;justify-content:flex-start;align-items:center;background:#313543}.column-inline-form label{flex:1 1 auto}.column-inline-form label input{width:100%}.column-inline-form label input:focus{outline:0}.column-inline-form .icon-button{flex:0 0 auto;margin:0 10px}.drawer__backdrop{cursor:pointer;position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5)}.list-editor{background:#282c37;flex-direction:column;border-radius:8px;box-shadow:2px 4px 15px rgba(0,0,0,.4);width:380px;overflow:hidden}@media screen and (max-width: 420px){.list-editor{width:90%}}.list-editor h4{padding:15px 0;background:#444b5d;font-weight:500;font-size:16px;text-align:center;border-radius:8px 8px 0 0}.list-editor .drawer__pager{height:50vh}.list-editor .drawer__inner{border-radius:0 0 8px 8px}.list-editor .drawer__inner.backdrop{width:calc(100% - 60px);box-shadow:2px 4px 15px rgba(0,0,0,.4);border-radius:0 0 0 8px}.list-editor__accounts{overflow-y:auto}.list-editor .account__display-name:hover strong{text-decoration:none}.list-editor .account__avatar{cursor:default}.list-editor .search{margin-bottom:0}.list-adder{background:#282c37;flex-direction:column;border-radius:8px;box-shadow:2px 4px 15px rgba(0,0,0,.4);width:380px;overflow:hidden}@media screen and (max-width: 420px){.list-adder{width:90%}}.list-adder__account{background:#444b5d}.list-adder__lists{background:#444b5d;height:50vh;border-radius:0 0 8px 8px;overflow-y:auto}.list-adder .list{padding:10px;border-bottom:1px solid #393f4f}.list-adder .list__wrapper{display:flex}.list-adder .list__display-name{flex:1 1 auto;overflow:hidden;text-decoration:none;font-size:16px;padding:10px}.focal-point{position:relative;cursor:move;overflow:hidden;height:100%;display:flex;justify-content:center;align-items:center;background:#000}.focal-point img,.focal-point video,.focal-point canvas{display:block;max-height:80vh;width:100%;height:auto;margin:0;object-fit:contain;background:#000}.focal-point__reticle{position:absolute;width:100px;height:100px;transform:translate(-50%, -50%);background:url(\"~images/reticle.png\") no-repeat 0 0;border-radius:50%;box-shadow:0 0 0 9999em rgba(0,0,0,.35)}.focal-point__overlay{position:absolute;width:100%;height:100%;top:0;left:0}.focal-point__preview{position:absolute;bottom:10px;right:10px;z-index:2;cursor:move;transition:opacity .1s ease}.focal-point__preview:hover{opacity:.5}.focal-point__preview strong{color:#fff;font-size:14px;font-weight:500;display:block;margin-bottom:5px}.focal-point__preview div{border-radius:4px;box-shadow:0 0 14px rgba(0,0,0,.2)}@media screen and (max-width: 480px){.focal-point img,.focal-point video{max-height:100%}.focal-point__preview{display:none}}.account__header__content{color:#dde3ec;font-size:14px;font-weight:400;overflow:hidden;word-break:normal;word-wrap:break-word}.account__header__content p{margin-bottom:20px}.account__header__content p:last-child{margin-bottom:0}.account__header__content a{color:inherit;text-decoration:underline}.account__header__content a:hover{text-decoration:none}.account__header{overflow:hidden}.account__header.inactive{opacity:.5}.account__header.inactive .account__header__image,.account__header.inactive .account__avatar{filter:grayscale(100%)}.account__header__info{position:absolute;top:10px;left:10px}.account__header__image{overflow:hidden;height:145px;position:relative;background:#1f232b}.account__header__image img{object-fit:cover;display:block;width:100%;height:100%;margin:0}.account__header__bar{position:relative;background:#313543;padding:5px;border-bottom:1px solid #42485a}.account__header__bar .avatar{display:block;flex:0 0 auto;width:94px;margin-left:-2px}.account__header__bar .avatar .account__avatar{background:#17191f;border:2px solid #313543}.account__header__tabs{display:flex;align-items:flex-start;padding:7px 5px;margin-top:-55px}.account__header__tabs__buttons{display:flex;align-items:center;padding-top:55px;overflow:hidden}.account__header__tabs__buttons .icon-button{border:1px solid #42485a;border-radius:4px;box-sizing:content-box;padding:2px}.account__header__tabs__buttons .button{margin:0 8px}.account__header__tabs__name{padding:5px}.account__header__tabs__name .account-role{vertical-align:top}.account__header__tabs__name .emojione{width:22px;height:22px}.account__header__tabs__name h1{font-size:16px;line-height:24px;color:#fff;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.account__header__tabs__name h1 small{display:block;font-size:14px;color:#dde3ec;font-weight:400;overflow:hidden;text-overflow:ellipsis}.account__header__tabs .spacer{flex:1 1 auto}.account__header__bio{overflow:hidden;margin:0 -5px}.account__header__bio .account__header__content{padding:20px 15px;padding-bottom:5px;color:#fff}.account__header__bio .account__header__fields{margin:0;border-top:1px solid #42485a}.account__header__bio .account__header__fields a{color:#4e79df}.account__header__bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.account__header__bio .account__header__fields .verified a{color:#79bd9a}.account__header__extra{margin-top:4px}.account__header__extra__links{font-size:14px;color:#dde3ec;padding:10px 0}.account__header__extra__links a{display:inline-block;color:#dde3ec;text-decoration:none;padding:5px 10px;font-weight:500}.account__header__extra__links a strong{font-weight:700;color:#fff}.trends__header{color:#c2cede;background:#2c313d;border-bottom:1px solid #1f232b;font-weight:500;padding:15px;font-size:16px;cursor:default}.trends__header .fa{display:inline-block;margin-right:5px}.trends__item{display:flex;align-items:center;padding:15px;border-bottom:1px solid #393f4f}.trends__item:last-child{border-bottom:0}.trends__item__name{flex:1 1 auto;color:#c2cede;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trends__item__name strong{font-weight:500}.trends__item__name a{color:#dde3ec;text-decoration:none;font-size:14px;font-weight:500;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trends__item__name a:hover span,.trends__item__name a:focus span,.trends__item__name a:active span{text-decoration:underline}.trends__item__current{flex:0 0 auto;font-size:24px;line-height:36px;font-weight:500;text-align:right;padding-right:15px;margin-left:5px;color:#ecf0f4}.trends__item__sparkline{flex:0 0 auto;width:50px}.trends__item__sparkline path:first-child{fill:rgba(43,144,217,.25) !important;fill-opacity:1 !important}.trends__item__sparkline path:last-child{stroke:#459ede !important}.conversation{display:flex;border-bottom:1px solid #393f4f;padding:5px;padding-bottom:0}.conversation:focus{background:#2c313d;outline:0}.conversation__avatar{flex:0 0 auto;padding:10px;padding-top:12px;position:relative}.conversation__unread{display:inline-block;background:#2b90d9;border-radius:50%;width:.625rem;height:.625rem;margin:-0.1ex .15em .1ex}.conversation__content{flex:1 1 auto;padding:10px 5px;padding-right:15px;overflow:hidden}.conversation__content__info{overflow:hidden;display:flex;flex-direction:row-reverse;justify-content:space-between}.conversation__content__relative-time{font-size:15px;color:#dde3ec;padding-left:15px}.conversation__content__names{color:#dde3ec;font-size:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:4px;flex-basis:90px;flex-grow:1}.conversation__content__names a{color:#fff;text-decoration:none}.conversation__content__names a:hover,.conversation__content__names a:focus,.conversation__content__names a:active{text-decoration:underline}.conversation__content a{word-break:break-word}.conversation--unread{background:#2c313d}.conversation--unread:focus{background:#313543}.conversation--unread .conversation__content__info{font-weight:700}.conversation--unread .conversation__content__relative-time{color:#fff}.poll{margin-top:16px;font-size:14px}.poll li{margin-bottom:10px;position:relative}.poll__chart{position:absolute;top:0;left:0;height:100%;display:inline-block;border-radius:4px;background:#6d89af}.poll__chart.leading{background:#2b5fd9}.poll__text{position:relative;display:flex;padding:6px 0;line-height:18px;cursor:default;overflow:hidden}.poll__text input[type=radio],.poll__text input[type=checkbox]{display:none}.poll__text .autossugest-input{flex:1 1 auto}.poll__text input[type=text]{display:block;box-sizing:border-box;width:100%;font-size:14px;color:#000;outline:0;font-family:inherit;background:#fff;border:1px solid #dbdbdb;border-radius:4px;padding:6px 10px}.poll__text input[type=text]:focus{border-color:#2b90d9}.poll__text.selectable{cursor:pointer}.poll__text.editable{display:flex;align-items:center;overflow:visible}.poll__input{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:50%;vertical-align:middle;margin-top:auto;margin-bottom:auto;flex:0 0 18px}.poll__input.checkbox{border-radius:4px}.poll__input.active{border-color:#79bd9a;background:#79bd9a}.poll__input:active,.poll__input:focus,.poll__input:hover{border-width:4px;background:none}.poll__input::-moz-focus-inner{outline:0 !important;border:0}.poll__input:focus,.poll__input:active{outline:0 !important}.poll__number{display:inline-block;width:52px;font-weight:700;padding:0 10px;padding-left:8px;text-align:right;margin-top:auto;margin-bottom:auto;flex:0 0 52px}.poll__vote__mark{float:left;line-height:18px}.poll__footer{padding-top:6px;padding-bottom:5px;color:#c2cede}.poll__link{display:inline;background:transparent;padding:0;margin:0;border:0;color:#c2cede;text-decoration:underline;font-size:inherit}.poll__link:hover{text-decoration:none}.poll__link:active,.poll__link:focus{background-color:rgba(194,206,222,.1)}.poll .button{height:36px;padding:0 16px;margin-right:10px;font-size:14px}.compose-form__poll-wrapper{border-top:1px solid #ebebeb}.compose-form__poll-wrapper ul{padding:10px}.compose-form__poll-wrapper .poll__footer{border-top:1px solid #ebebeb;padding:10px;display:flex;align-items:center}.compose-form__poll-wrapper .poll__footer button,.compose-form__poll-wrapper .poll__footer select{flex:1 1 50%}.compose-form__poll-wrapper .poll__footer button:focus,.compose-form__poll-wrapper .poll__footer select:focus{border-color:#2b90d9}.compose-form__poll-wrapper .button.button-secondary{font-size:14px;font-weight:400;padding:6px 10px;height:auto;line-height:inherit;color:#8d9ac2;border-color:#8d9ac2;margin-right:5px}.compose-form__poll-wrapper li{display:flex;align-items:center}.compose-form__poll-wrapper li .poll__text{flex:0 0 auto;width:calc(100% - (23px + 6px));margin-right:6px}.compose-form__poll-wrapper select{appearance:none;box-sizing:border-box;font-size:14px;color:#000;display:inline-block;width:auto;outline:0;font-family:inherit;background:#fff url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center/auto 16px;border:1px solid #dbdbdb;border-radius:4px;padding:6px 10px;padding-right:30px}.compose-form__poll-wrapper .icon-button.disabled{color:#dbdbdb}.muted .poll{color:#c2cede}.muted .poll__chart{background:rgba(109,137,175,.2)}.muted .poll__chart.leading{background:rgba(43,95,217,.2)}.modal-layout{background:#282c37 url('data:image/svg+xml;utf8,') repeat-x bottom fixed;display:flex;flex-direction:column;height:100vh;padding:0}.modal-layout__mastodon{display:flex;flex:1;flex-direction:column;justify-content:flex-end}.modal-layout__mastodon>*{flex:1;max-height:235px}@media screen and (max-width: 600px){.account-header{margin-top:0}}.emoji-mart{font-size:13px;display:inline-block;color:#000}.emoji-mart,.emoji-mart *{box-sizing:border-box;line-height:1.15}.emoji-mart .emoji-mart-emoji{padding:6px}.emoji-mart-bar{border:0 solid #c0cdd9}.emoji-mart-bar:first-child{border-bottom-width:1px;border-top-left-radius:5px;border-top-right-radius:5px;background:#d9e1e8}.emoji-mart-bar:last-child{border-top-width:1px;border-bottom-left-radius:5px;border-bottom-right-radius:5px;display:none}.emoji-mart-anchors{display:flex;justify-content:space-between;padding:0 6px;color:#1b1e25;line-height:0}.emoji-mart-anchor{position:relative;flex:1;text-align:center;padding:12px 4px;overflow:hidden;transition:color .1s ease-out;cursor:pointer}.emoji-mart-anchor:hover{color:#131419}.emoji-mart-anchor-selected{color:#2b90d9}.emoji-mart-anchor-selected:hover{color:#2485cb}.emoji-mart-anchor-selected .emoji-mart-anchor-bar{bottom:-1px}.emoji-mart-anchor-bar{position:absolute;bottom:-5px;left:0;width:100%;height:4px;background-color:#2b90d9}.emoji-mart-anchors i{display:inline-block;width:100%;max-width:22px}.emoji-mart-anchors svg{fill:currentColor;max-height:18px}.emoji-mart-scroll{overflow-y:scroll;height:270px;max-height:35vh;padding:0 6px 6px;background:#fff;will-change:transform}.emoji-mart-scroll::-webkit-scrollbar-track:hover,.emoji-mart-scroll::-webkit-scrollbar-track:active{background-color:rgba(0,0,0,.3)}.emoji-mart-search{padding:10px;padding-right:45px;background:#fff}.emoji-mart-search input{font-size:14px;font-weight:400;padding:7px 9px;font-family:inherit;display:block;width:100%;background:rgba(217,225,232,.3);color:#000;border:1px solid #d9e1e8;border-radius:4px}.emoji-mart-search input::-moz-focus-inner{border:0}.emoji-mart-search input::-moz-focus-inner,.emoji-mart-search input:focus,.emoji-mart-search input:active{outline:0 !important}.emoji-mart-category .emoji-mart-emoji{cursor:pointer}.emoji-mart-category .emoji-mart-emoji span{z-index:1;position:relative;text-align:center}.emoji-mart-category .emoji-mart-emoji:hover::before{z-index:0;content:\"\";position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(217,225,232,.7);border-radius:100%}.emoji-mart-category-label{z-index:2;position:relative;position:-webkit-sticky;position:sticky;top:0}.emoji-mart-category-label span{display:block;width:100%;font-weight:500;padding:5px 6px;background:#fff}.emoji-mart-emoji{position:relative;display:inline-block;font-size:0}.emoji-mart-emoji span{width:22px;height:22px}.emoji-mart-no-results{font-size:14px;text-align:center;padding-top:70px;color:#364861}.emoji-mart-no-results .emoji-mart-category-label{display:none}.emoji-mart-no-results .emoji-mart-no-results-label{margin-top:.2em}.emoji-mart-no-results .emoji-mart-emoji:hover::before{content:none}.emoji-mart-preview{display:none}.container{box-sizing:border-box;max-width:1235px;margin:0 auto;position:relative}@media screen and (max-width: 1255px){.container{width:100%;padding:0 10px}}.rich-formatting{font-family:\"mastodon-font-sans-serif\",sans-serif;font-size:14px;font-weight:400;line-height:1.7;word-wrap:break-word;color:#dde3ec}.rich-formatting a{color:#2b90d9;text-decoration:underline}.rich-formatting a:hover,.rich-formatting a:focus,.rich-formatting a:active{text-decoration:none}.rich-formatting p,.rich-formatting li{color:#dde3ec}.rich-formatting p{margin-top:0;margin-bottom:.85em}.rich-formatting p:last-child{margin-bottom:0}.rich-formatting strong{font-weight:700;color:#ecf0f4}.rich-formatting em{font-style:italic;color:#ecf0f4}.rich-formatting code{font-size:.85em;background:#17191f;border-radius:4px;padding:.2em .3em}.rich-formatting h1,.rich-formatting h2,.rich-formatting h3,.rich-formatting h4,.rich-formatting h5,.rich-formatting h6{font-family:\"mastodon-font-display\",sans-serif;margin-top:1.275em;margin-bottom:.85em;font-weight:500;color:#ecf0f4}.rich-formatting h1{font-size:2em}.rich-formatting h2{font-size:1.75em}.rich-formatting h3{font-size:1.5em}.rich-formatting h4{font-size:1.25em}.rich-formatting h5,.rich-formatting h6{font-size:1em}.rich-formatting ul{list-style:disc}.rich-formatting ol{list-style:decimal}.rich-formatting ul,.rich-formatting ol{margin:0;padding:0;padding-left:2em;margin-bottom:.85em}.rich-formatting ul[type=a],.rich-formatting ol[type=a]{list-style-type:lower-alpha}.rich-formatting ul[type=i],.rich-formatting ol[type=i]{list-style-type:lower-roman}.rich-formatting hr{width:100%;height:0;border:0;border-bottom:1px solid #313543;margin:1.7em 0}.rich-formatting hr.spacer{height:1px;border:0}.rich-formatting table{width:100%;border-collapse:collapse;break-inside:auto;margin-top:24px;margin-bottom:32px}.rich-formatting table thead tr,.rich-formatting table tbody tr{border-bottom:1px solid #313543;font-size:1em;line-height:1.625;font-weight:400;text-align:left;color:#dde3ec}.rich-formatting table thead tr{border-bottom-width:2px;line-height:1.5;font-weight:500;color:#c2cede}.rich-formatting table th,.rich-formatting table td{padding:8px;align-self:start;align-items:start;word-break:break-all}.rich-formatting table th.nowrap,.rich-formatting table td.nowrap{width:25%;position:relative}.rich-formatting table th.nowrap::before,.rich-formatting table td.nowrap::before{content:\" \";visibility:hidden}.rich-formatting table th.nowrap span,.rich-formatting table td.nowrap span{position:absolute;left:8px;right:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rich-formatting>:first-child{margin-top:0}.information-board{background:#1f232b;padding:20px 0}.information-board .container-alt{position:relative;padding-right:295px}.information-board__sections{display:flex;justify-content:space-between;flex-wrap:wrap}.information-board__section{flex:1 0 0;font-family:\"mastodon-font-sans-serif\",sans-serif;font-size:16px;line-height:28px;color:#fff;text-align:right;padding:10px 15px}.information-board__section span,.information-board__section strong{display:block}.information-board__section span:last-child{color:#ecf0f4}.information-board__section strong{font-family:\"mastodon-font-display\",sans-serif;font-weight:500;font-size:32px;line-height:48px}@media screen and (max-width: 700px){.information-board__section{text-align:center}}.information-board .panel{position:absolute;width:280px;box-sizing:border-box;background:#17191f;padding:20px;padding-top:10px;border-radius:4px 4px 0 0;right:0;bottom:-40px}.information-board .panel .panel-header{font-family:\"mastodon-font-display\",sans-serif;font-size:14px;line-height:24px;font-weight:500;color:#dde3ec;padding-bottom:5px;margin-bottom:15px;border-bottom:1px solid #313543;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.information-board .panel .panel-header a,.information-board .panel .panel-header span{font-weight:400;color:#bcc9da}.information-board .panel .panel-header a{text-decoration:none}.information-board .owner{text-align:center}.information-board .owner .avatar{width:80px;height:80px;margin:0 auto;margin-bottom:15px}.information-board .owner .avatar img{display:block;width:80px;height:80px;border-radius:48px}.information-board .owner .name{font-size:14px}.information-board .owner .name a{display:block;color:#fff;text-decoration:none}.information-board .owner .name a:hover .display_name{text-decoration:underline}.information-board .owner .name .username{display:block;color:#dde3ec}.landing-page p,.landing-page li{font-family:\"mastodon-font-sans-serif\",sans-serif;font-size:16px;font-weight:400;font-size:16px;line-height:30px;margin-bottom:12px;color:#dde3ec}.landing-page p a,.landing-page li a{color:#2b90d9;text-decoration:underline}.landing-page em{display:inline;margin:0;padding:0;font-weight:700;background:transparent;font-family:inherit;font-size:inherit;line-height:inherit;color:#fefefe}.landing-page h1{font-family:\"mastodon-font-display\",sans-serif;font-size:26px;line-height:30px;font-weight:500;margin-bottom:20px;color:#ecf0f4}.landing-page h1 small{font-family:\"mastodon-font-sans-serif\",sans-serif;display:block;font-size:18px;font-weight:400;color:#fefefe}.landing-page h2{font-family:\"mastodon-font-display\",sans-serif;font-size:22px;line-height:26px;font-weight:500;margin-bottom:20px;color:#ecf0f4}.landing-page h3{font-family:\"mastodon-font-display\",sans-serif;font-size:18px;line-height:24px;font-weight:500;margin-bottom:20px;color:#ecf0f4}.landing-page h4{font-family:\"mastodon-font-display\",sans-serif;font-size:16px;line-height:24px;font-weight:500;margin-bottom:20px;color:#ecf0f4}.landing-page h5{font-family:\"mastodon-font-display\",sans-serif;font-size:14px;line-height:24px;font-weight:500;margin-bottom:20px;color:#ecf0f4}.landing-page h6{font-family:\"mastodon-font-display\",sans-serif;font-size:12px;line-height:24px;font-weight:500;margin-bottom:20px;color:#ecf0f4}.landing-page ul,.landing-page ol{margin-left:20px}.landing-page ul[type=a],.landing-page ol[type=a]{list-style-type:lower-alpha}.landing-page ul[type=i],.landing-page ol[type=i]{list-style-type:lower-roman}.landing-page ul{list-style:disc}.landing-page ol{list-style:decimal}.landing-page li>ol,.landing-page li>ul{margin-top:6px}.landing-page hr{width:100%;height:0;border:0;border-bottom:1px solid rgba(96,105,132,.6);margin:20px 0}.landing-page hr.spacer{height:1px;border:0}.landing-page__information,.landing-page__forms{padding:20px}.landing-page__call-to-action{background:#282c37;border-radius:4px;padding:25px 40px;overflow:hidden;box-sizing:border-box}.landing-page__call-to-action .row{width:100%;display:flex;flex-direction:row-reverse;flex-wrap:nowrap;justify-content:space-between;align-items:center}.landing-page__call-to-action .row__information-board{display:flex;justify-content:flex-end;align-items:flex-end}.landing-page__call-to-action .row__information-board .information-board__section{flex:1 0 auto;padding:0 10px}@media screen and (max-width: 415px){.landing-page__call-to-action .row__information-board{width:100%;justify-content:space-between}}.landing-page__call-to-action .row__mascot{flex:1;margin:10px -50px 0 0}@media screen and (max-width: 415px){.landing-page__call-to-action .row__mascot{display:none}}.landing-page__logo{margin-right:20px}.landing-page__logo img{height:50px;width:auto;mix-blend-mode:lighten}.landing-page__information{padding:45px 40px;margin-bottom:10px}.landing-page__information:last-child{margin-bottom:0}.landing-page__information strong{font-weight:500;color:#fefefe}.landing-page__information .account{border-bottom:0;padding:0}.landing-page__information .account__display-name{align-items:center;display:flex;margin-right:5px}.landing-page__information .account div.account__display-name:hover .display-name strong{text-decoration:none}.landing-page__information .account div.account__display-name .account__avatar{cursor:default}.landing-page__information .account__avatar-wrapper{margin-left:0;flex:0 0 auto}.landing-page__information .account__avatar{width:44px;height:44px;background-size:44px 44px}.landing-page__information .account .display-name{font-size:15px}.landing-page__information .account .display-name__account{font-size:14px}@media screen and (max-width: 960px){.landing-page__information .contact{margin-top:30px}}@media screen and (max-width: 700px){.landing-page__information{padding:25px 20px}}.landing-page__information,.landing-page__forms,.landing-page #mastodon-timeline{box-sizing:border-box;background:#282c37;border-radius:4px;box-shadow:0 0 6px rgba(0,0,0,.1)}.landing-page__mascot{height:104px;position:relative;left:-40px;bottom:25px}.landing-page__mascot img{height:190px;width:auto}.landing-page__short-description .row{display:flex;flex-wrap:wrap;align-items:center;margin-bottom:40px}@media screen and (max-width: 700px){.landing-page__short-description .row{margin-bottom:20px}}.landing-page__short-description p a{color:#ecf0f4}.landing-page__short-description h1{font-weight:500;color:#fff;margin-bottom:0}.landing-page__short-description h1 small{color:#dde3ec}.landing-page__short-description h1 small span{color:#ecf0f4}.landing-page__short-description p:last-child{margin-bottom:0}.landing-page__hero{margin-bottom:10px}.landing-page__hero img{display:block;margin:0;max-width:100%;height:auto;border-radius:4px}@media screen and (max-width: 840px){.landing-page .information-board .container-alt{padding-right:20px}.landing-page .information-board .panel{position:static;margin-top:20px;width:100%;border-radius:4px}.landing-page .information-board .panel .panel-header{text-align:center}}@media screen and (max-width: 675px){.landing-page .header-wrapper{padding-top:0}.landing-page .header-wrapper.compact{padding-bottom:0}.landing-page .header-wrapper.compact .hero .heading{text-align:initial}.landing-page .header .container-alt,.landing-page .features .container-alt{display:block}}.landing-page .cta{margin:20px}.landing{margin-bottom:100px}@media screen and (max-width: 738px){.landing{margin-bottom:0}}.landing__brand{display:flex;justify-content:center;align-items:center;padding:50px}.landing__brand svg{fill:#fff;height:52px}@media screen and (max-width: 415px){.landing__brand{padding:0;margin-bottom:30px}}.landing .directory{margin-top:30px;background:transparent;box-shadow:none;border-radius:0}.landing .hero-widget{margin-top:30px;margin-bottom:0}.landing .hero-widget h4{padding:10px;font-weight:700;font-size:14px;color:#dde3ec}.landing .hero-widget__text{border-radius:0;padding-bottom:0}.landing .hero-widget__footer{background:#282c37;padding:10px;border-radius:0 0 4px 4px;display:flex}.landing .hero-widget__footer__column{flex:1 1 50%}.landing .hero-widget .account{padding:10px 0;border-bottom:0}.landing .hero-widget .account .account__display-name{display:flex;align-items:center}.landing .hero-widget .account .account__avatar{width:44px;height:44px;background-size:44px 44px}.landing .hero-widget__counter{padding:10px}.landing .hero-widget__counter strong{font-family:\"mastodon-font-display\",sans-serif;font-size:15px;font-weight:700;display:block}.landing .hero-widget__counter span{font-size:14px;color:#dde3ec}.landing .simple_form .user_agreement .label_input>label{font-weight:400;color:#dde3ec}.landing .simple_form p.lead{color:#dde3ec;font-size:15px;line-height:20px;font-weight:400;margin-bottom:25px}.landing__grid{max-width:960px;margin:0 auto;display:grid;grid-template-columns:minmax(0, 50%) minmax(0, 50%);grid-gap:30px}@media screen and (max-width: 738px){.landing__grid{grid-template-columns:minmax(0, 100%);grid-gap:10px}.landing__grid__column-login{grid-row:1;display:flex;flex-direction:column}.landing__grid__column-login .box-widget{order:2;flex:0 0 auto}.landing__grid__column-login .hero-widget{margin-top:0;margin-bottom:10px;order:1;flex:0 0 auto}.landing__grid__column-registration{grid-row:2}.landing__grid .directory{margin-top:10px}}@media screen and (max-width: 415px){.landing__grid{grid-gap:0}.landing__grid .hero-widget{display:block;margin-bottom:0;box-shadow:none}.landing__grid .hero-widget__img,.landing__grid .hero-widget__img img,.landing__grid .hero-widget__footer{border-radius:0}.landing__grid .hero-widget,.landing__grid .box-widget,.landing__grid .directory__tag{border-bottom:1px solid #393f4f}.landing__grid .directory{margin-top:0}.landing__grid .directory__tag{margin-bottom:0}.landing__grid .directory__tag>a,.landing__grid .directory__tag>div{border-radius:0;box-shadow:none}.landing__grid .directory__tag:last-child{border-bottom:0}}.brand{position:relative;text-decoration:none}.brand__tagline{display:block;position:absolute;bottom:-10px;left:50px;width:300px;color:#9baec8;text-decoration:none;font-size:14px}@media screen and (max-width: 415px){.brand__tagline{position:static;width:auto;margin-top:20px;color:#c2cede}}.table{width:100%;max-width:100%;border-spacing:0;border-collapse:collapse}.table th,.table td{padding:8px;line-height:18px;vertical-align:top;border-top:1px solid #282c37;text-align:left;background:#1f232b}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #282c37;border-top:0;font-weight:500}.table>tbody>tr>th{font-weight:500}.table>tbody>tr:nth-child(odd)>td,.table>tbody>tr:nth-child(odd)>th{background:#282c37}.table a{color:#2b90d9;text-decoration:underline}.table a:hover{text-decoration:none}.table strong{font-weight:500}.table strong:lang(ja){font-weight:700}.table strong:lang(ko){font-weight:700}.table strong:lang(zh-CN){font-weight:700}.table strong:lang(zh-HK){font-weight:700}.table strong:lang(zh-TW){font-weight:700}.table.inline-table>tbody>tr:nth-child(odd)>td,.table.inline-table>tbody>tr:nth-child(odd)>th{background:transparent}.table.inline-table>tbody>tr:first-child>td,.table.inline-table>tbody>tr:first-child>th{border-top:0}.table.batch-table>thead>tr>th{background:#282c37;border-top:1px solid #17191f;border-bottom:1px solid #17191f}.table.batch-table>thead>tr>th:first-child{border-radius:4px 0 0;border-left:1px solid #17191f}.table.batch-table>thead>tr>th:last-child{border-radius:0 4px 0 0;border-right:1px solid #17191f}.table--invites tbody td{vertical-align:middle}.table-wrapper{overflow:auto;margin-bottom:20px}samp{font-family:\"mastodon-font-monospace\",monospace}button.table-action-link{background:transparent;border:0;font:inherit}button.table-action-link,a.table-action-link{text-decoration:none;display:inline-block;margin-right:5px;padding:0 10px;color:#dde3ec;font-weight:500}button.table-action-link:hover,a.table-action-link:hover{color:#fff}button.table-action-link i.fa,a.table-action-link i.fa{font-weight:400;margin-right:5px}button.table-action-link:first-child,a.table-action-link:first-child{padding-left:0}.batch-table__toolbar,.batch-table__row{display:flex}.batch-table__toolbar__select,.batch-table__row__select{box-sizing:border-box;padding:8px 16px;cursor:pointer;min-height:100%}.batch-table__toolbar__select input,.batch-table__row__select input{margin-top:8px}.batch-table__toolbar__select--aligned,.batch-table__row__select--aligned{display:flex;align-items:center}.batch-table__toolbar__select--aligned input,.batch-table__row__select--aligned input{margin-top:0}.batch-table__toolbar__actions,.batch-table__toolbar__content,.batch-table__row__actions,.batch-table__row__content{padding:8px 0;padding-right:16px;flex:1 1 auto}.batch-table__toolbar{border:1px solid #17191f;background:#282c37;border-radius:4px 0 0;height:47px;align-items:center}.batch-table__toolbar__actions{text-align:right;padding-right:11px}.batch-table__form{padding:16px;border:1px solid #17191f;border-top:0;background:#282c37}.batch-table__form .fields-row{padding-top:0;margin-bottom:0}.batch-table__row{border:1px solid #17191f;border-top:0;background:#1f232b}@media screen and (max-width: 415px){.optional .batch-table__row:first-child{border-top:1px solid #17191f}}.batch-table__row:hover{background:#242731}.batch-table__row:nth-child(even){background:#282c37}.batch-table__row:nth-child(even):hover{background:#2c313d}.batch-table__row__content{padding-top:12px;padding-bottom:16px}.batch-table__row__content--unpadded{padding:0}.batch-table__row__content--with-image{display:flex;align-items:center}.batch-table__row__content__image{flex:0 0 auto;display:flex;justify-content:center;align-items:center;margin-right:10px}.batch-table__row__content__image .emojione{width:32px;height:32px}.batch-table__row__content__text{flex:1 1 auto}.batch-table__row__content__extra{flex:0 0 auto;text-align:right;color:#dde3ec;font-weight:500}.batch-table__row .directory__tag{margin:0;width:100%}.batch-table__row .directory__tag a{background:transparent;border-radius:0}@media screen and (max-width: 415px){.batch-table.optional .batch-table__toolbar,.batch-table.optional .batch-table__row__select{display:none}}.batch-table .status__content{padding-top:0}.batch-table .status__content summary{display:list-item}.batch-table .status__content strong{font-weight:700}.batch-table .nothing-here{border:1px solid #17191f;border-top:0;box-shadow:none}@media screen and (max-width: 415px){.batch-table .nothing-here{border-top:1px solid #17191f}}@media screen and (max-width: 870px){.batch-table .accounts-table tbody td.optional{display:none}}.admin-wrapper{display:flex;justify-content:center;width:100%;min-height:100vh}.admin-wrapper .sidebar-wrapper{min-height:100vh;overflow:hidden;pointer-events:none;flex:1 1 auto}.admin-wrapper .sidebar-wrapper__inner{display:flex;justify-content:flex-end;background:#282c37;height:100%}.admin-wrapper .sidebar{width:240px;padding:0;pointer-events:auto}.admin-wrapper .sidebar__toggle{display:none;background:#393f4f;height:48px}.admin-wrapper .sidebar__toggle__logo{flex:1 1 auto}.admin-wrapper .sidebar__toggle__logo a{display:inline-block;padding:15px}.admin-wrapper .sidebar__toggle__logo svg{fill:#fff;height:20px;position:relative;bottom:-2px}.admin-wrapper .sidebar__toggle__icon{display:block;color:#dde3ec;text-decoration:none;flex:0 0 auto;font-size:20px;padding:15px}.admin-wrapper .sidebar__toggle a:hover,.admin-wrapper .sidebar__toggle a:focus,.admin-wrapper .sidebar__toggle a:active{background:#42485a}.admin-wrapper .sidebar .logo{display:block;margin:40px auto;width:100px;height:100px}@media screen and (max-width: 600px){.admin-wrapper .sidebar>a:first-child{display:none}}.admin-wrapper .sidebar ul{list-style:none;border-radius:4px 0 0 4px;overflow:hidden;margin-bottom:20px}@media screen and (max-width: 600px){.admin-wrapper .sidebar ul{margin-bottom:0}}.admin-wrapper .sidebar ul a{display:block;padding:15px;color:#dde3ec;text-decoration:none;transition:all 200ms linear;transition-property:color,background-color;border-radius:4px 0 0 4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.admin-wrapper .sidebar ul a i.fa{margin-right:5px}.admin-wrapper .sidebar ul a:hover{color:#fff;background-color:#1d2028;transition:all 100ms linear;transition-property:color,background-color}.admin-wrapper .sidebar ul a.selected{background:#242731;border-radius:4px 0 0}.admin-wrapper .sidebar ul ul{background:#1f232b;border-radius:0 0 0 4px;margin:0}.admin-wrapper .sidebar ul ul a{border:0;padding:15px 35px}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a{color:#fff;background-color:#2b5fd9;border-bottom:0;border-radius:0}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a:hover{background-color:#416fdd}.admin-wrapper .sidebar>ul>.simple-navigation-active-leaf a{border-radius:4px 0 0 4px}.admin-wrapper .content-wrapper{box-sizing:border-box;width:100%;max-width:840px;flex:1 1 auto}@media screen and (max-width: 1080px){.admin-wrapper .sidebar-wrapper--empty{display:none}.admin-wrapper .sidebar-wrapper{width:240px;flex:0 0 auto}}@media screen and (max-width: 600px){.admin-wrapper .sidebar-wrapper{width:100%}}.admin-wrapper .content{padding:20px 15px;padding-top:60px;padding-left:25px}@media screen and (max-width: 600px){.admin-wrapper .content{max-width:none;padding:15px;padding-top:30px}}.admin-wrapper .content-heading{display:flex;padding-bottom:40px;border-bottom:1px solid #393f4f;margin:-15px -15px 40px 0;flex-wrap:wrap;align-items:center;justify-content:space-between}.admin-wrapper .content-heading>*{margin-top:15px;margin-right:15px}.admin-wrapper .content-heading-actions{display:inline-flex}.admin-wrapper .content-heading-actions>:not(:first-child){margin-left:5px}@media screen and (max-width: 600px){.admin-wrapper .content-heading{border-bottom:0;padding-bottom:0}}.admin-wrapper .content h2{color:#ecf0f4;font-size:24px;line-height:28px;font-weight:400}@media screen and (max-width: 600px){.admin-wrapper .content h2{font-weight:700}}.admin-wrapper .content h3{color:#ecf0f4;font-size:20px;line-height:28px;font-weight:400;margin-bottom:30px}.admin-wrapper .content h4{font-size:14px;font-weight:700;color:#dde3ec;padding-bottom:8px;margin-bottom:8px;border-bottom:1px solid #393f4f}.admin-wrapper .content h6{font-size:16px;color:#ecf0f4;line-height:28px;font-weight:500}.admin-wrapper .content .fields-group h6{color:#fff;font-weight:500}.admin-wrapper .content .directory__tag>a,.admin-wrapper .content .directory__tag>div{box-shadow:none}.admin-wrapper .content .directory__tag .table-action-link .fa{color:inherit}.admin-wrapper .content .directory__tag h4{font-size:18px;font-weight:700;color:#fff;text-transform:none;padding-bottom:0;margin-bottom:0;border-bottom:0}.admin-wrapper .content>p{font-size:14px;line-height:21px;color:#ecf0f4;margin-bottom:20px}.admin-wrapper .content>p strong{color:#fff;font-weight:500}.admin-wrapper .content>p strong:lang(ja){font-weight:700}.admin-wrapper .content>p strong:lang(ko){font-weight:700}.admin-wrapper .content>p strong:lang(zh-CN){font-weight:700}.admin-wrapper .content>p strong:lang(zh-HK){font-weight:700}.admin-wrapper .content>p strong:lang(zh-TW){font-weight:700}.admin-wrapper .content hr{width:100%;height:0;border:0;border-bottom:1px solid rgba(96,105,132,.6);margin:20px 0}.admin-wrapper .content hr.spacer{height:1px;border:0}@media screen and (max-width: 600px){.admin-wrapper{display:block}.admin-wrapper .sidebar-wrapper{min-height:0}.admin-wrapper .sidebar{width:100%;padding:0;height:auto}.admin-wrapper .sidebar__toggle{display:flex}.admin-wrapper .sidebar>ul{display:none}.admin-wrapper .sidebar ul a,.admin-wrapper .sidebar ul ul a{border-radius:0;border-bottom:1px solid #313543;transition:none}.admin-wrapper .sidebar ul a:hover,.admin-wrapper .sidebar ul ul a:hover{transition:none}.admin-wrapper .sidebar ul ul{border-radius:0}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a{border-bottom-color:#2b5fd9}}hr.spacer{width:100%;border:0;margin:20px 0;height:1px}body .muted-hint,.admin-wrapper .content .muted-hint{color:#dde3ec}body .muted-hint a,.admin-wrapper .content .muted-hint a{color:#2b90d9}body .positive-hint,.admin-wrapper .content .positive-hint{color:#79bd9a;font-weight:500}body .negative-hint,.admin-wrapper .content .negative-hint{color:#df405a;font-weight:500}body .neutral-hint,.admin-wrapper .content .neutral-hint{color:#c2cede;font-weight:500}body .warning-hint,.admin-wrapper .content .warning-hint{color:#ca8f04;font-weight:500}.filters{display:flex;flex-wrap:wrap}.filters .filter-subset{flex:0 0 auto;margin:0 40px 20px 0}.filters .filter-subset:last-child{margin-bottom:30px}.filters .filter-subset ul{margin-top:5px;list-style:none}.filters .filter-subset ul li{display:inline-block;margin-right:5px}.filters .filter-subset strong{font-weight:500;font-size:13px}.filters .filter-subset strong:lang(ja){font-weight:700}.filters .filter-subset strong:lang(ko){font-weight:700}.filters .filter-subset strong:lang(zh-CN){font-weight:700}.filters .filter-subset strong:lang(zh-HK){font-weight:700}.filters .filter-subset strong:lang(zh-TW){font-weight:700}.filters .filter-subset a{display:inline-block;color:#dde3ec;text-decoration:none;font-size:13px;font-weight:500;border-bottom:2px solid #282c37}.filters .filter-subset a:hover{color:#fff;border-bottom:2px solid #333846}.filters .filter-subset a.selected{color:#2b90d9;border-bottom:2px solid #2b5fd9}.flavour-screen{display:block;margin:10px auto;max-width:100%}.flavour-description{display:block;font-size:16px;margin:10px 0}.flavour-description>p{margin:10px 0}.flavour-screen{display:block;margin:10px auto;max-width:100%}.flavour-description{display:block;font-size:16px;margin:10px 0}.flavour-description>p{margin:10px 0}.report-accounts{display:flex;flex-wrap:wrap;margin-bottom:20px}.report-accounts__item{display:flex;flex:250px;flex-direction:column;margin:0 5px}.report-accounts__item>strong{display:block;margin:0 0 10px -5px;font-weight:500;font-size:14px;line-height:18px;color:#ecf0f4}.report-accounts__item>strong:lang(ja){font-weight:700}.report-accounts__item>strong:lang(ko){font-weight:700}.report-accounts__item>strong:lang(zh-CN){font-weight:700}.report-accounts__item>strong:lang(zh-HK){font-weight:700}.report-accounts__item>strong:lang(zh-TW){font-weight:700}.report-accounts__item .account-card{flex:1 1 auto}.report-status,.account-status{display:flex;margin-bottom:10px}.report-status .activity-stream,.account-status .activity-stream{flex:2 0 0;margin-right:20px;max-width:calc(100% - 60px)}.report-status .activity-stream .entry,.account-status .activity-stream .entry{border-radius:4px}.report-status__actions,.account-status__actions{flex:0 0 auto;display:flex;flex-direction:column}.report-status__actions .icon-button,.account-status__actions .icon-button{font-size:24px;width:24px;text-align:center;margin-bottom:10px}.simple_form.new_report_note,.simple_form.new_account_moderation_note{max-width:100%}.batch-form-box{display:flex;flex-wrap:wrap;margin-bottom:5px}.batch-form-box #form_status_batch_action{margin:0 5px 5px 0;font-size:14px}.batch-form-box input.button{margin:0 5px 5px 0}.batch-form-box .media-spoiler-toggle-buttons{margin-left:auto}.batch-form-box .media-spoiler-toggle-buttons .button{overflow:visible;margin:0 0 5px 5px;float:right}.back-link{margin-bottom:10px;font-size:14px}.back-link a{color:#2b90d9;text-decoration:none}.back-link a:hover{text-decoration:underline}.spacer{flex:1 1 auto}.log-entry{margin-bottom:20px;line-height:20px}.log-entry__header{display:flex;justify-content:flex-start;align-items:center;padding:10px;background:#282c37;color:#dde3ec;border-radius:4px 4px 0 0;font-size:14px;position:relative}.log-entry__avatar{margin-right:10px}.log-entry__avatar .avatar{display:block;margin:0;border-radius:50%;width:40px;height:40px}.log-entry__content{max-width:calc(100% - 90px)}.log-entry__title{word-wrap:break-word}.log-entry__timestamp{color:#c2cede}.log-entry__extras{background:#353a49;border-radius:0 0 4px 4px;padding:10px;color:#dde3ec;font-family:\"mastodon-font-monospace\",monospace;font-size:12px;word-wrap:break-word;min-height:20px}.log-entry__icon{font-size:28px;margin-right:10px;color:#c2cede}.log-entry__icon__overlay{position:absolute;top:10px;right:10px;width:10px;height:10px;border-radius:50%}.log-entry__icon__overlay.positive{background:#79bd9a}.log-entry__icon__overlay.negative{background:#e87487}.log-entry__icon__overlay.neutral{background:#2b5fd9}.log-entry a,.log-entry .username,.log-entry .target{color:#ecf0f4;text-decoration:none;font-weight:500}.log-entry .diff-old{color:#e87487}.log-entry .diff-neutral{color:#ecf0f4}.log-entry .diff-new{color:#79bd9a}a.name-tag,.name-tag,a.inline-name-tag,.inline-name-tag{text-decoration:none;color:#ecf0f4}a.name-tag .username,.name-tag .username,a.inline-name-tag .username,.inline-name-tag .username{font-weight:500}a.name-tag.suspended .username,.name-tag.suspended .username,a.inline-name-tag.suspended .username,.inline-name-tag.suspended .username{text-decoration:line-through;color:#e87487}a.name-tag.suspended .avatar,.name-tag.suspended .avatar,a.inline-name-tag.suspended .avatar,.inline-name-tag.suspended .avatar{filter:grayscale(100%);opacity:.8}a.name-tag,.name-tag{display:flex;align-items:center}a.name-tag .avatar,.name-tag .avatar{display:block;margin:0;margin-right:5px;border-radius:50%}a.name-tag.suspended .avatar,.name-tag.suspended .avatar{filter:grayscale(100%);opacity:.8}.speech-bubble{margin-bottom:20px;border-left:4px solid #2b5fd9}.speech-bubble.positive{border-left-color:#79bd9a}.speech-bubble.negative{border-left-color:#e87487}.speech-bubble.warning{border-left-color:#ca8f04}.speech-bubble__bubble{padding:16px;padding-left:14px;font-size:15px;line-height:20px;border-radius:4px 4px 4px 0;position:relative;font-weight:500}.speech-bubble__bubble a{color:#dde3ec}.speech-bubble__owner{padding:8px;padding-left:12px}.speech-bubble time{color:#c2cede}.report-card{background:#282c37;border-radius:4px;margin-bottom:20px}.report-card__profile{display:flex;justify-content:space-between;align-items:center;padding:15px}.report-card__profile .account{padding:0;border:0}.report-card__profile .account__avatar-wrapper{margin-left:0}.report-card__profile__stats{flex:0 0 auto;font-weight:500;color:#dde3ec;text-align:right}.report-card__profile__stats a{color:inherit;text-decoration:none}.report-card__profile__stats a:focus,.report-card__profile__stats a:hover,.report-card__profile__stats a:active{color:#f7f9fb}.report-card__profile__stats .red{color:#df405a}.report-card__summary__item{display:flex;justify-content:flex-start;border-top:1px solid #1f232b}.report-card__summary__item:hover{background:#2c313d}.report-card__summary__item__reported-by,.report-card__summary__item__assigned{padding:15px;flex:0 0 auto;box-sizing:border-box;width:150px;color:#dde3ec}.report-card__summary__item__reported-by,.report-card__summary__item__reported-by .username,.report-card__summary__item__assigned,.report-card__summary__item__assigned .username{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.report-card__summary__item__content{flex:1 1 auto;max-width:calc(100% - 300px)}.report-card__summary__item__content__icon{color:#c2cede;margin-right:4px;font-weight:500}.report-card__summary__item__content a{display:block;box-sizing:border-box;width:100%;padding:15px;text-decoration:none;color:#dde3ec}.one-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ellipsized-ip{display:inline-block;max-width:120px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.admin-account-bio{display:flex;flex-wrap:wrap;margin:0 -5px;margin-top:20px}.admin-account-bio>div{box-sizing:border-box;padding:0 5px;margin-bottom:10px;flex:1 0 50%}.admin-account-bio .account__header__fields,.admin-account-bio .account__header__content{background:#393f4f;border-radius:4px;height:100%}.admin-account-bio .account__header__fields{margin:0;border:0}.admin-account-bio .account__header__fields a{color:#4e79df}.admin-account-bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.admin-account-bio .account__header__fields .verified a{color:#79bd9a}.admin-account-bio .account__header__content{box-sizing:border-box;padding:20px;color:#fff}.center-text{text-align:center}.dashboard__counters{display:flex;flex-wrap:wrap;margin:0 -5px;margin-bottom:20px}.dashboard__counters>div{box-sizing:border-box;flex:0 0 33.333%;padding:0 5px;margin-bottom:10px}.dashboard__counters>div>div,.dashboard__counters>div>a{padding:20px;background:#313543;border-radius:4px;box-sizing:border-box;height:100%}.dashboard__counters>div>a{text-decoration:none;color:inherit;display:block}.dashboard__counters>div>a:hover,.dashboard__counters>div>a:focus,.dashboard__counters>div>a:active{background:#393f4f}.dashboard__counters__num,.dashboard__counters__text{text-align:center;font-weight:500;font-size:24px;line-height:21px;color:#fff;font-family:\"mastodon-font-display\",sans-serif;margin-bottom:20px;line-height:30px}.dashboard__counters__text{font-size:18px}.dashboard__counters__label{font-size:14px;color:#dde3ec;text-align:center;font-weight:500}.dashboard__widgets{display:flex;flex-wrap:wrap;margin:0 -5px}.dashboard__widgets>div{flex:0 0 33.333%;margin-bottom:20px}.dashboard__widgets>div>div{padding:0 5px}.dashboard__widgets a:not(.name-tag){color:#d9e1e8;font-weight:500;text-decoration:none}body.rtl{direction:rtl}body.rtl .column-header>button{text-align:right;padding-left:0;padding-right:15px}body.rtl .radio-button__input{margin-right:0;margin-left:10px}body.rtl .directory__card__bar .display-name{margin-left:0;margin-right:15px}body.rtl .display-name{text-align:right}body.rtl .notification__message{margin-left:0;margin-right:68px}body.rtl .drawer__inner__mastodon>img{transform:scaleX(-1)}body.rtl .notification__favourite-icon-wrapper{left:auto;right:-26px}body.rtl .landing-page__logo{margin-right:0;margin-left:20px}body.rtl .landing-page .features-list .features-list__row .visual{margin-left:0;margin-right:15px}body.rtl .column-link__icon,body.rtl .column-header__icon{margin-right:0;margin-left:5px}body.rtl .compose-form .compose-form__buttons-wrapper .character-counter__wrapper{margin-right:0;margin-left:4px}body.rtl .navigation-bar__profile{margin-left:0;margin-right:8px}body.rtl .search__input{padding-right:10px;padding-left:30px}body.rtl .search__icon .fa{right:auto;left:10px}body.rtl .columns-area{direction:rtl}body.rtl .column-header__buttons{left:0;right:auto;margin-left:0;margin-right:-15px}body.rtl .column-inline-form .icon-button{margin-left:0;margin-right:5px}body.rtl .column-header__links .text-btn{margin-left:10px;margin-right:0}body.rtl .account__avatar-wrapper{float:right}body.rtl .column-header__back-button{padding-left:5px;padding-right:0}body.rtl .column-header__setting-arrows{float:left}body.rtl .setting-toggle__label{margin-left:0;margin-right:8px}body.rtl .status__avatar{left:auto;right:10px}body.rtl .status,body.rtl .activity-stream .status.light{padding-left:10px;padding-right:68px}body.rtl .status__info .status__display-name,body.rtl .activity-stream .status.light .status__display-name{padding-left:25px;padding-right:0}body.rtl .activity-stream .pre-header{padding-right:68px;padding-left:0}body.rtl .status__prepend{margin-left:0;margin-right:68px}body.rtl .status__prepend-icon-wrapper{left:auto;right:-26px}body.rtl .activity-stream .pre-header .pre-header__icon{left:auto;right:42px}body.rtl .account__avatar-overlay-overlay{right:auto;left:0}body.rtl .column-back-button--slim-button{right:auto;left:0}body.rtl .status__relative-time,body.rtl .activity-stream .status.light .status__header .status__meta{float:left}body.rtl .status__action-bar__counter{margin-right:0;margin-left:11px}body.rtl .status__action-bar__counter .status__action-bar-button{margin-right:0;margin-left:4px}body.rtl .status__action-bar-button{float:right;margin-right:0;margin-left:18px}body.rtl .status__action-bar-dropdown{float:right}body.rtl .privacy-dropdown__dropdown{margin-left:0;margin-right:40px}body.rtl .privacy-dropdown__option__icon{margin-left:10px;margin-right:0}body.rtl .detailed-status__display-name .display-name{text-align:right}body.rtl .detailed-status__display-avatar{margin-right:0;margin-left:10px;float:right}body.rtl .detailed-status__favorites,body.rtl .detailed-status__reblogs{margin-left:0;margin-right:6px}body.rtl .fa-ul{margin-left:2.14285714em}body.rtl .fa-li{left:auto;right:-2.14285714em}body.rtl .admin-wrapper{direction:rtl}body.rtl .admin-wrapper .sidebar ul a i.fa,body.rtl a.table-action-link i.fa{margin-right:0;margin-left:5px}body.rtl .simple_form .check_boxes .checkbox label{padding-left:0;padding-right:25px}body.rtl .simple_form .input.with_label.boolean label.checkbox{padding-left:25px;padding-right:0}body.rtl .simple_form .check_boxes .checkbox input[type=checkbox],body.rtl .simple_form .input.boolean input[type=checkbox]{left:auto;right:0}body.rtl .simple_form .input.radio_buttons .radio{left:auto;right:0}body.rtl .simple_form .input.radio_buttons .radio>label{padding-right:28px;padding-left:0}body.rtl .simple_form .input-with-append .input input{padding-left:142px;padding-right:0}body.rtl .simple_form .input.boolean label.checkbox{left:auto;right:0}body.rtl .simple_form .input.boolean .label_input,body.rtl .simple_form .input.boolean .hint{padding-left:0;padding-right:28px}body.rtl .simple_form .label_input__append{right:auto;left:3px}body.rtl .simple_form .label_input__append::after{right:auto;left:0;background-image:linear-gradient(to left, rgba(19, 20, 25, 0), #131419)}body.rtl .simple_form select{background:#131419 url(\"data:image/svg+xml;utf8,\") no-repeat left 8px center/auto 16px}body.rtl .table th,body.rtl .table td{text-align:right}body.rtl .filters .filter-subset{margin-right:0;margin-left:45px}body.rtl .landing-page .header-wrapper .mascot{right:60px;left:auto}body.rtl .landing-page__call-to-action .row__information-board{direction:rtl}body.rtl .landing-page .header .hero .floats .float-1{left:-120px;right:auto}body.rtl .landing-page .header .hero .floats .float-2{left:210px;right:auto}body.rtl .landing-page .header .hero .floats .float-3{left:110px;right:auto}body.rtl .landing-page .header .links .brand img{left:0}body.rtl .landing-page .fa-external-link{padding-right:5px;padding-left:0 !important}body.rtl .landing-page .features #mastodon-timeline{margin-right:0;margin-left:30px}@media screen and (min-width: 631px){body.rtl .column,body.rtl .drawer{padding-left:5px;padding-right:5px}body.rtl .column:first-child,body.rtl .drawer:first-child{padding-left:5px;padding-right:10px}body.rtl .columns-area>div .column,body.rtl .columns-area>div .drawer{padding-left:5px;padding-right:5px}}body.rtl .columns-area--mobile .column,body.rtl .columns-area--mobile .drawer{padding-left:0;padding-right:0}body.rtl .public-layout .header .nav-button{margin-left:8px;margin-right:0}body.rtl .public-layout .public-account-header__tabs{margin-left:0;margin-right:20px}body.rtl .landing-page__information .account__display-name{margin-right:0;margin-left:5px}body.rtl .landing-page__information .account__avatar-wrapper{margin-left:12px;margin-right:0}body.rtl .card__bar .display-name{margin-left:0;margin-right:15px;text-align:right}body.rtl .fa-chevron-left::before{content:\"\"}body.rtl .fa-chevron-right::before{content:\"\"}body.rtl .column-back-button__icon{margin-right:0;margin-left:5px}body.rtl .column-header__setting-arrows .column-header__setting-btn:last-child{padding-left:0;padding-right:10px}body.rtl .simple_form .input.radio_buttons .radio>label input{left:auto;right:0}.emojione[title=\":wavy_dash:\"],.emojione[title=\":waving_black_flag:\"],.emojione[title=\":water_buffalo:\"],.emojione[title=\":video_game:\"],.emojione[title=\":video_camera:\"],.emojione[title=\":vhs:\"],.emojione[title=\":turkey:\"],.emojione[title=\":tophat:\"],.emojione[title=\":top:\"],.emojione[title=\":tm:\"],.emojione[title=\":telephone_receiver:\"],.emojione[title=\":spider:\"],.emojione[title=\":speaking_head_in_silhouette:\"],.emojione[title=\":spades:\"],.emojione[title=\":soon:\"],.emojione[title=\":registered:\"],.emojione[title=\":on:\"],.emojione[title=\":musical_score:\"],.emojione[title=\":movie_camera:\"],.emojione[title=\":mortar_board:\"],.emojione[title=\":microphone:\"],.emojione[title=\":male-guard:\"],.emojione[title=\":lower_left_fountain_pen:\"],.emojione[title=\":lower_left_ballpoint_pen:\"],.emojione[title=\":kaaba:\"],.emojione[title=\":joystick:\"],.emojione[title=\":hole:\"],.emojione[title=\":hocho:\"],.emojione[title=\":heavy_plus_sign:\"],.emojione[title=\":heavy_multiplication_x:\"],.emojione[title=\":heavy_minus_sign:\"],.emojione[title=\":heavy_dollar_sign:\"],.emojione[title=\":heavy_division_sign:\"],.emojione[title=\":heavy_check_mark:\"],.emojione[title=\":guardsman:\"],.emojione[title=\":gorilla:\"],.emojione[title=\":fried_egg:\"],.emojione[title=\":film_projector:\"],.emojione[title=\":female-guard:\"],.emojione[title=\":end:\"],.emojione[title=\":electric_plug:\"],.emojione[title=\":eight_pointed_black_star:\"],.emojione[title=\":dark_sunglasses:\"],.emojione[title=\":currency_exchange:\"],.emojione[title=\":curly_loop:\"],.emojione[title=\":copyright:\"],.emojione[title=\":clubs:\"],.emojione[title=\":camera_with_flash:\"],.emojione[title=\":camera:\"],.emojione[title=\":busts_in_silhouette:\"],.emojione[title=\":bust_in_silhouette:\"],.emojione[title=\":bowling:\"],.emojione[title=\":bomb:\"],.emojione[title=\":black_small_square:\"],.emojione[title=\":black_nib:\"],.emojione[title=\":black_medium_square:\"],.emojione[title=\":black_medium_small_square:\"],.emojione[title=\":black_large_square:\"],.emojione[title=\":black_heart:\"],.emojione[title=\":black_circle:\"],.emojione[title=\":back:\"],.emojione[title=\":ant:\"],.emojione[title=\":8ball:\"]{filter:drop-shadow(1px 1px 0 #ffffff) drop-shadow(-1px 1px 0 #ffffff) drop-shadow(1px -1px 0 #ffffff) drop-shadow(-1px -1px 0 #ffffff);transform:scale(0.71)}.compose-form .compose-form__modifiers .compose-form__upload-description input::placeholder{opacity:1}.rich-formatting a,.rich-formatting p a,.rich-formatting li a,.landing-page__short-description p a,.status__content a,.reply-indicator__content a{color:#5f86e2;text-decoration:underline}.rich-formatting a.mention,.rich-formatting p a.mention,.rich-formatting li a.mention,.landing-page__short-description p a.mention,.status__content a.mention,.reply-indicator__content a.mention{text-decoration:none}.rich-formatting a.mention span,.rich-formatting p a.mention span,.rich-formatting li a.mention span,.landing-page__short-description p a.mention span,.status__content a.mention span,.reply-indicator__content a.mention span{text-decoration:underline}.rich-formatting a.mention span:hover,.rich-formatting a.mention span:focus,.rich-formatting a.mention span:active,.rich-formatting p a.mention span:hover,.rich-formatting p a.mention span:focus,.rich-formatting p a.mention span:active,.rich-formatting li a.mention span:hover,.rich-formatting li a.mention span:focus,.rich-formatting li a.mention span:active,.landing-page__short-description p a.mention span:hover,.landing-page__short-description p a.mention span:focus,.landing-page__short-description p a.mention span:active,.status__content a.mention span:hover,.status__content a.mention span:focus,.status__content a.mention span:active,.reply-indicator__content a.mention span:hover,.reply-indicator__content a.mention span:focus,.reply-indicator__content a.mention span:active{text-decoration:none}.rich-formatting a:hover,.rich-formatting a:focus,.rich-formatting a:active,.rich-formatting p a:hover,.rich-formatting p a:focus,.rich-formatting p a:active,.rich-formatting li a:hover,.rich-formatting li a:focus,.rich-formatting li a:active,.landing-page__short-description p a:hover,.landing-page__short-description p a:focus,.landing-page__short-description p a:active,.status__content a:hover,.status__content a:focus,.status__content a:active,.reply-indicator__content a:hover,.reply-indicator__content a:focus,.reply-indicator__content a:active{text-decoration:none}.rich-formatting a.status__content__spoiler-link,.rich-formatting p a.status__content__spoiler-link,.rich-formatting li a.status__content__spoiler-link,.landing-page__short-description p a.status__content__spoiler-link,.status__content a.status__content__spoiler-link,.reply-indicator__content a.status__content__spoiler-link{color:#ecf0f4;text-decoration:none}.status__content__read-more-button{text-decoration:underline}.status__content__read-more-button:hover,.status__content__read-more-button:focus,.status__content__read-more-button:active{text-decoration:none}.getting-started__footer a{text-decoration:underline}.getting-started__footer a:hover,.getting-started__footer a:focus,.getting-started__footer a:active{text-decoration:none}.nothing-here{color:#dde3ec}.public-layout .public-account-header__tabs__tabs .counter.active::after{border-bottom:4px solid #2b5fd9}","/* http://meyerweb.com/eric/tools/css/reset/\n v2.0 | 20110126\n License: none (public domain)\n*/\n\nhtml, body, div, span, applet, object, iframe,\nh1, h2, h3, h4, h5, h6, p, blockquote, pre,\na, abbr, acronym, address, big, cite, code,\ndel, dfn, em, img, ins, kbd, q, s, samp,\nsmall, strike, strong, sub, sup, tt, var,\nb, u, i, center,\ndl, dt, dd, ol, ul, li,\nfieldset, form, label, legend,\ntable, caption, tbody, tfoot, thead, tr, th, td,\narticle, aside, canvas, details, embed,\nfigure, figcaption, footer, header, hgroup,\nmenu, nav, output, ruby, section, summary,\ntime, mark, audio, video {\n margin: 0;\n padding: 0;\n border: 0;\n font-size: 100%;\n font: inherit;\n vertical-align: baseline;\n}\n\n/* HTML5 display-role reset for older browsers */\narticle, aside, details, figcaption, figure,\nfooter, header, hgroup, menu, nav, section {\n display: block;\n}\n\nbody {\n line-height: 1;\n}\n\nol, ul {\n list-style: none;\n}\n\nblockquote, q {\n quotes: none;\n}\n\nblockquote:before, blockquote:after,\nq:before, q:after {\n content: '';\n content: none;\n}\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\nhtml {\n scrollbar-color: lighten($ui-base-color, 4%) rgba($base-overlay-background, 0.1);\n}\n\n::-webkit-scrollbar {\n width: 12px;\n height: 12px;\n}\n\n::-webkit-scrollbar-thumb {\n background: lighten($ui-base-color, 4%);\n border: 0px none $base-border-color;\n border-radius: 50px;\n}\n\n::-webkit-scrollbar-thumb:hover {\n background: lighten($ui-base-color, 6%);\n}\n\n::-webkit-scrollbar-thumb:active {\n background: lighten($ui-base-color, 4%);\n}\n\n::-webkit-scrollbar-track {\n border: 0px none $base-border-color;\n border-radius: 0;\n background: rgba($base-overlay-background, 0.1);\n}\n\n::-webkit-scrollbar-track:hover {\n background: $ui-base-color;\n}\n\n::-webkit-scrollbar-track:active {\n background: $ui-base-color;\n}\n\n::-webkit-scrollbar-corner {\n background: transparent;\n}\n","// Dependent colors\n$black: #000000;\n\n$classic-base-color: #282c37;\n$classic-primary-color: #9baec8;\n$classic-secondary-color: #d9e1e8;\n$classic-highlight-color: #2b90d9;\n\n$ui-base-color: $classic-base-color !default;\n$ui-primary-color: $classic-primary-color !default;\n$ui-secondary-color: $classic-secondary-color !default;\n\n// Differences\n$ui-highlight-color: #2b5fd9;\n\n$darker-text-color: lighten($ui-primary-color, 20%) !default;\n$dark-text-color: lighten($ui-primary-color, 12%) !default;\n$secondary-text-color: lighten($ui-secondary-color, 6%) !default;\n$highlight-text-color: $classic-highlight-color !default;\n$action-button-color: #8d9ac2;\n\n$inverted-text-color: $black !default;\n$lighter-text-color: darken($ui-base-color, 6%) !default;\n$light-text-color: darken($ui-primary-color, 40%) !default;\n","@function hex-color($color) {\n @if type-of($color) == 'color' {\n $color: str-slice(ie-hex-str($color), 4);\n }\n\n @return '%23' + unquote($color);\n}\n\nbody {\n font-family: $font-sans-serif, sans-serif;\n background: darken($ui-base-color, 7%);\n font-size: 13px;\n line-height: 18px;\n font-weight: 400;\n color: $primary-text-color;\n text-rendering: optimizelegibility;\n font-feature-settings: \"kern\";\n text-size-adjust: none;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n -webkit-tap-highlight-color: transparent;\n\n &.system-font {\n // system-ui => standard property (Chrome/Android WebView 56+, Opera 43+, Safari 11+)\n // -apple-system => Safari <11 specific\n // BlinkMacSystemFont => Chrome <56 on macOS specific\n // Segoe UI => Windows 7/8/10\n // Oxygen => KDE\n // Ubuntu => Unity/Ubuntu\n // Cantarell => GNOME\n // Fira Sans => Firefox OS\n // Droid Sans => Older Androids (<4.0)\n // Helvetica Neue => Older macOS <10.11\n // $font-sans-serif => web-font (Roboto) fallback and newer Androids (>=4.0)\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Oxygen\", \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", $font-sans-serif, sans-serif;\n }\n\n &.app-body {\n padding: 0;\n\n &.layout-single-column {\n height: auto;\n min-height: 100vh;\n overflow-y: scroll;\n }\n\n &.layout-multiple-columns {\n position: absolute;\n width: 100%;\n height: 100%;\n }\n\n &.with-modals--active {\n overflow-y: hidden;\n }\n }\n\n &.lighter {\n background: $ui-base-color;\n }\n\n &.with-modals {\n overflow-x: hidden;\n overflow-y: scroll;\n\n &--active {\n overflow-y: hidden;\n }\n }\n\n &.player {\n text-align: center;\n }\n\n &.embed {\n background: lighten($ui-base-color, 4%);\n margin: 0;\n padding-bottom: 0;\n\n .container {\n position: absolute;\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n }\n\n &.admin {\n background: darken($ui-base-color, 4%);\n padding: 0;\n }\n\n &.error {\n position: absolute;\n text-align: center;\n color: $darker-text-color;\n background: $ui-base-color;\n width: 100%;\n height: 100%;\n padding: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n\n .dialog {\n vertical-align: middle;\n margin: 20px;\n\n &__illustration {\n img {\n display: block;\n max-width: 470px;\n width: 100%;\n height: auto;\n margin-top: -120px;\n }\n }\n\n h1 {\n font-size: 20px;\n line-height: 28px;\n font-weight: 400;\n }\n }\n }\n}\n\nbutton {\n font-family: inherit;\n cursor: pointer;\n\n &:focus {\n outline: none;\n }\n}\n\n.app-holder {\n &,\n & > div,\n & > noscript {\n display: flex;\n width: 100%;\n align-items: center;\n justify-content: center;\n outline: 0 !important;\n }\n\n & > noscript {\n height: 100vh;\n }\n}\n\n.layout-single-column .app-holder {\n &,\n & > div {\n min-height: 100vh;\n }\n}\n\n.layout-multiple-columns .app-holder {\n &,\n & > div {\n height: 100%;\n }\n}\n\n.error-boundary,\n.app-holder noscript {\n flex-direction: column;\n font-size: 16px;\n font-weight: 400;\n line-height: 1.7;\n color: lighten($error-red, 4%);\n text-align: center;\n\n & > div {\n max-width: 500px;\n }\n\n p {\n margin-bottom: .85em;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: $highlight-text-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n &__footer {\n color: $dark-text-color;\n font-size: 13px;\n\n a {\n color: $dark-text-color;\n }\n }\n\n button {\n display: inline;\n border: 0;\n background: transparent;\n color: $dark-text-color;\n font: inherit;\n padding: 0;\n margin: 0;\n line-height: inherit;\n cursor: pointer;\n outline: 0;\n transition: color 300ms linear;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n\n &.copied {\n color: $valid-value-color;\n transition: none;\n }\n }\n}\n","// Commonly used web colors\n$black: #000000; // Black\n$white: #ffffff; // White\n$success-green: #79bd9a !default; // Padua\n$error-red: #df405a !default; // Cerise\n$warning-red: #ff5050 !default; // Sunset Orange\n$gold-star: #ca8f04 !default; // Dark Goldenrod\n\n$red-bookmark: $warning-red;\n\n// Pleroma-Dark colors\n$pleroma-bg: #121a24;\n$pleroma-fg: #182230;\n$pleroma-text: #b9b9ba;\n$pleroma-links: #d8a070;\n\n// Values from the classic Mastodon UI\n$classic-base-color: $pleroma-bg;\n$classic-primary-color: #9baec8;\n$classic-secondary-color: #d9e1e8;\n$classic-highlight-color: #d8a070;\n\n// Variables for defaults in UI\n$base-shadow-color: $black !default;\n$base-overlay-background: $black !default;\n$base-border-color: $white !default;\n$simple-background-color: $white !default;\n$valid-value-color: $success-green !default;\n$error-value-color: $error-red !default;\n\n// Tell UI to use selected colors\n$ui-base-color: $classic-base-color !default; // Darkest\n$ui-base-lighter-color: lighten($ui-base-color, 26%) !default; // Lighter darkest\n$ui-primary-color: $classic-primary-color !default; // Lighter\n$ui-secondary-color: $classic-secondary-color !default; // Lightest\n$ui-highlight-color: $classic-highlight-color !default;\n\n// Variables for texts\n$primary-text-color: $white !default;\n$darker-text-color: $ui-primary-color !default;\n$dark-text-color: $ui-base-lighter-color !default;\n$secondary-text-color: $ui-secondary-color !default;\n$highlight-text-color: $ui-highlight-color !default;\n$action-button-color: $ui-base-lighter-color !default;\n// For texts on inverted backgrounds\n$inverted-text-color: $ui-base-color !default;\n$lighter-text-color: $ui-base-lighter-color !default;\n$light-text-color: $ui-primary-color !default;\n\n// Language codes that uses CJK fonts\n$cjk-langs: ja, ko, zh-CN, zh-HK, zh-TW;\n\n// Variables for components\n$media-modal-media-max-width: 100%;\n// put margins on top and bottom of image to avoid the screen covered by image.\n$media-modal-media-max-height: 80%;\n\n$no-gap-breakpoint: 415px;\n\n$font-sans-serif: 'mastodon-font-sans-serif' !default;\n$font-display: 'mastodon-font-display' !default;\n$font-monospace: 'mastodon-font-monospace' !default;\n",".container-alt {\n width: 700px;\n margin: 0 auto;\n margin-top: 40px;\n\n @media screen and (max-width: 740px) {\n width: 100%;\n margin: 0;\n }\n}\n\n.logo-container {\n margin: 100px auto 50px;\n\n @media screen and (max-width: 500px) {\n margin: 40px auto 0;\n }\n\n h1 {\n display: flex;\n justify-content: center;\n align-items: center;\n\n svg {\n fill: $primary-text-color;\n height: 42px;\n margin-right: 10px;\n }\n\n a {\n display: flex;\n justify-content: center;\n align-items: center;\n color: $primary-text-color;\n text-decoration: none;\n outline: 0;\n padding: 12px 16px;\n line-height: 32px;\n font-family: $font-display, sans-serif;\n font-weight: 500;\n font-size: 14px;\n }\n }\n}\n\n.compose-standalone {\n .compose-form {\n width: 400px;\n margin: 0 auto;\n padding: 20px 0;\n margin-top: 40px;\n box-sizing: border-box;\n\n @media screen and (max-width: 400px) {\n width: 100%;\n margin-top: 0;\n padding: 20px;\n }\n }\n}\n\n.account-header {\n width: 400px;\n margin: 0 auto;\n display: flex;\n font-size: 13px;\n line-height: 18px;\n box-sizing: border-box;\n padding: 20px 0;\n padding-bottom: 0;\n margin-bottom: -30px;\n margin-top: 40px;\n\n @media screen and (max-width: 440px) {\n width: 100%;\n margin: 0;\n margin-bottom: 10px;\n padding: 20px;\n padding-bottom: 0;\n }\n\n .avatar {\n width: 40px;\n height: 40px;\n margin-right: 8px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n }\n }\n\n .name {\n flex: 1 1 auto;\n color: $secondary-text-color;\n width: calc(100% - 88px);\n\n .username {\n display: block;\n font-weight: 500;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n }\n\n .logout-link {\n display: block;\n font-size: 32px;\n line-height: 40px;\n margin-left: 8px;\n }\n}\n\n.grid-3 {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: 3fr 1fr;\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-column: 1 / 3;\n grid-row: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 2;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1 / 3;\n grid-row: 3;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n grid-template-columns: minmax(0, 100%);\n\n .column-0 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .column-2 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1;\n grid-row: 4;\n }\n }\n}\n\n.grid-4 {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: repeat(4, minmax(0, 1fr));\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-column: 1 / 5;\n grid-row: 1;\n }\n\n .column-1 {\n grid-column: 1 / 4;\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 4;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 2 / 5;\n grid-row: 3;\n }\n\n .column-4 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .landing-page__call-to-action {\n min-height: 100%;\n }\n\n .flash-message {\n margin-bottom: 10px;\n }\n\n @media screen and (max-width: 738px) {\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n .landing-page__call-to-action {\n padding: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .row__information-board {\n width: 100%;\n justify-content: center;\n align-items: center;\n }\n\n .row__mascot {\n display: none;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n grid-template-columns: minmax(0, 100%);\n\n .column-0 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .column-2 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1;\n grid-row: 5;\n }\n\n .column-4 {\n grid-column: 1;\n grid-row: 4;\n }\n }\n}\n\n.public-layout {\n @media screen and (max-width: $no-gap-breakpoint) {\n padding-top: 48px;\n }\n\n .container {\n max-width: 960px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding: 0;\n }\n }\n\n .header {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n height: 48px;\n margin: 10px 0;\n display: flex;\n align-items: stretch;\n justify-content: center;\n flex-wrap: nowrap;\n overflow: hidden;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n position: fixed;\n width: 100%;\n top: 0;\n left: 0;\n margin: 0;\n border-radius: 0;\n box-shadow: none;\n z-index: 110;\n }\n\n & > div {\n flex: 1 1 33.3%;\n min-height: 1px;\n }\n\n .nav-left {\n display: flex;\n align-items: stretch;\n justify-content: flex-start;\n flex-wrap: nowrap;\n }\n\n .nav-center {\n display: flex;\n align-items: stretch;\n justify-content: center;\n flex-wrap: nowrap;\n }\n\n .nav-right {\n display: flex;\n align-items: stretch;\n justify-content: flex-end;\n flex-wrap: nowrap;\n }\n\n .brand {\n display: block;\n padding: 15px;\n\n svg {\n display: block;\n height: 18px;\n width: auto;\n position: relative;\n bottom: -2px;\n fill: $primary-text-color;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n height: 20px;\n }\n }\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 12%);\n }\n }\n\n .nav-link {\n display: flex;\n align-items: center;\n padding: 0 1rem;\n font-size: 12px;\n font-weight: 500;\n text-decoration: none;\n color: $darker-text-color;\n white-space: nowrap;\n text-align: center;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n color: $primary-text-color;\n }\n\n @media screen and (max-width: 550px) {\n &.optional {\n display: none;\n }\n }\n }\n\n .nav-button {\n background: lighten($ui-base-color, 16%);\n margin: 8px;\n margin-left: 0;\n border-radius: 4px;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n background: lighten($ui-base-color, 20%);\n }\n }\n }\n\n $no-columns-breakpoint: 600px;\n\n .grid {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(300px, 3fr) minmax(298px, 1fr);\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-row: 1;\n grid-column: 1;\n }\n\n .column-1 {\n grid-row: 1;\n grid-column: 2;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n grid-template-columns: 100%;\n grid-gap: 0;\n\n .column-1 {\n display: none;\n }\n }\n }\n\n .directory__card {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n\n .page-header {\n @media screen and (max-width: $no-gap-breakpoint) {\n border-bottom: 0;\n }\n }\n\n .public-account-header {\n overflow: hidden;\n margin-bottom: 10px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &.inactive {\n opacity: 0.5;\n\n .public-account-header__image,\n .avatar {\n filter: grayscale(100%);\n }\n\n .logo-button {\n background-color: $secondary-text-color;\n }\n }\n\n &__image {\n border-radius: 4px 4px 0 0;\n overflow: hidden;\n height: 300px;\n position: relative;\n background: darken($ui-base-color, 12%);\n\n &::after {\n content: \"\";\n display: block;\n position: absolute;\n width: 100%;\n height: 100%;\n box-shadow: inset 0 -1px 1px 1px rgba($base-shadow-color, 0.15);\n top: 0;\n left: 0;\n }\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 4px 4px 0 0;\n }\n\n @media screen and (max-width: 600px) {\n height: 200px;\n }\n }\n\n &--no-bar {\n margin-bottom: 0;\n\n .public-account-header__image,\n .public-account-header__image img {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n box-shadow: none;\n\n &__image::after {\n display: none;\n }\n\n &__image,\n &__image img {\n border-radius: 0;\n }\n }\n\n &__bar {\n position: relative;\n margin-top: -80px;\n display: flex;\n justify-content: flex-start;\n\n &::before {\n content: \"\";\n display: block;\n background: lighten($ui-base-color, 4%);\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: 60px;\n border-radius: 0 0 4px 4px;\n z-index: -1;\n }\n\n .avatar {\n display: block;\n width: 120px;\n height: 120px;\n padding-left: 20px - 4px;\n flex: 0 0 auto;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 50%;\n border: 4px solid lighten($ui-base-color, 4%);\n background: darken($ui-base-color, 8%);\n }\n }\n\n @media screen and (max-width: 600px) {\n margin-top: 0;\n background: lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n padding: 5px;\n\n &::before {\n display: none;\n }\n\n .avatar {\n width: 48px;\n height: 48px;\n padding: 7px 0;\n padding-left: 10px;\n\n img {\n border: 0;\n border-radius: 4px;\n }\n\n @media screen and (max-width: 360px) {\n display: none;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n flex-wrap: wrap;\n }\n }\n\n &__tabs {\n flex: 1 1 auto;\n margin-left: 20px;\n\n &__name {\n padding-top: 20px;\n padding-bottom: 8px;\n\n h1 {\n font-size: 20px;\n line-height: 18px * 1.5;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n text-shadow: 1px 1px 1px $base-shadow-color;\n\n small {\n display: block;\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n @media screen and (max-width: 600px) {\n margin-left: 15px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n &__name {\n padding-top: 0;\n padding-bottom: 0;\n\n h1 {\n font-size: 16px;\n line-height: 24px;\n text-shadow: none;\n\n small {\n color: $darker-text-color;\n }\n }\n }\n }\n\n &__tabs {\n display: flex;\n justify-content: flex-start;\n align-items: stretch;\n height: 58px;\n\n .details-counters {\n display: flex;\n flex-direction: row;\n min-width: 300px;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n .details-counters {\n display: none;\n }\n }\n\n .counter {\n min-width: 33.3%;\n box-sizing: border-box;\n flex: 0 0 auto;\n color: $darker-text-color;\n padding: 10px;\n border-right: 1px solid lighten($ui-base-color, 4%);\n cursor: default;\n text-align: center;\n position: relative;\n\n a {\n display: block;\n }\n\n &:last-child {\n border-right: 0;\n }\n\n &::after {\n display: block;\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n border-bottom: 4px solid $ui-primary-color;\n opacity: 0.5;\n transition: all 400ms ease;\n }\n\n &.active {\n &::after {\n border-bottom: 4px solid $highlight-text-color;\n opacity: 1;\n }\n\n &.inactive::after {\n border-bottom-color: $secondary-text-color;\n }\n }\n\n &:hover {\n &::after {\n opacity: 1;\n transition-duration: 100ms;\n }\n }\n\n a {\n text-decoration: none;\n color: inherit;\n }\n\n .counter-label {\n font-size: 12px;\n display: block;\n }\n\n .counter-number {\n font-weight: 500;\n font-size: 18px;\n margin-bottom: 5px;\n color: $primary-text-color;\n font-family: $font-display, sans-serif;\n }\n }\n\n .spacer {\n flex: 1 1 auto;\n height: 1px;\n }\n\n &__buttons {\n padding: 7px 8px;\n }\n }\n }\n\n &__extra {\n display: none;\n margin-top: 4px;\n\n .public-account-bio {\n border-radius: 0;\n box-shadow: none;\n background: transparent;\n margin: 0 -5px;\n\n .account__header__fields {\n border-top: 1px solid lighten($ui-base-color, 12%);\n }\n\n .roles {\n display: none;\n }\n }\n\n &__links {\n margin-top: -15px;\n font-size: 14px;\n color: $darker-text-color;\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n padding: 15px;\n font-weight: 500;\n\n strong {\n font-weight: 700;\n color: $primary-text-color;\n }\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n flex: 100%;\n }\n }\n }\n\n .account__section-headline {\n border-radius: 4px 4px 0 0;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n\n .detailed-status__meta {\n margin-top: 25px;\n }\n\n .public-account-bio {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n overflow: hidden;\n margin-bottom: 10px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n box-shadow: none;\n margin-bottom: 0;\n border-radius: 0;\n }\n\n .account__header__fields {\n margin: 0;\n border-top: 0;\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n\n .account__header__content {\n padding: 20px;\n padding-bottom: 0;\n color: $primary-text-color;\n }\n\n &__extra,\n .roles {\n padding: 20px;\n font-size: 14px;\n color: $darker-text-color;\n }\n\n .roles {\n padding-bottom: 0;\n }\n }\n\n .directory__list {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: block;\n }\n\n .icon-button {\n font-size: 18px;\n }\n }\n\n .directory__card {\n margin-bottom: 0;\n }\n\n .card-grid {\n display: flex;\n flex-wrap: wrap;\n min-width: 100%;\n margin: 0 -5px;\n\n & > div {\n box-sizing: border-box;\n flex: 1 0 auto;\n width: 300px;\n padding: 0 5px;\n margin-bottom: 10px;\n max-width: 33.333%;\n\n @media screen and (max-width: 900px) {\n max-width: 50%;\n }\n\n @media screen and (max-width: 600px) {\n max-width: 100%;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin: 0;\n border-top: 1px solid lighten($ui-base-color, 8%);\n\n & > div {\n width: 100%;\n padding: 0;\n margin-bottom: 0;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &:last-child {\n border-bottom: 0;\n }\n\n .card__bar {\n background: $ui-base-color;\n\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n }\n }\n }\n }\n}\n",".no-list {\n list-style: none;\n\n li {\n display: inline-block;\n margin: 0 5px;\n }\n}\n\n.recovery-codes {\n list-style: none;\n margin: 0 auto;\n\n li {\n font-size: 125%;\n line-height: 1.5;\n letter-spacing: 1px;\n }\n}\n",".public-layout {\n .footer {\n text-align: left;\n padding-top: 20px;\n padding-bottom: 60px;\n font-size: 12px;\n color: lighten($ui-base-color, 34%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding-left: 20px;\n padding-right: 20px;\n }\n\n .grid {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: 1fr 1fr 2fr 1fr 1fr;\n\n .column-0 {\n grid-column: 1;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-1 {\n grid-column: 2;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-2 {\n grid-column: 3;\n grid-row: 1;\n min-width: 0;\n text-align: center;\n\n h4 a {\n color: lighten($ui-base-color, 34%);\n }\n }\n\n .column-3 {\n grid-column: 4;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-4 {\n grid-column: 5;\n grid-row: 1;\n min-width: 0;\n }\n\n @media screen and (max-width: 690px) {\n grid-template-columns: 1fr 2fr 1fr;\n\n .column-0,\n .column-1 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 2;\n }\n\n .column-3,\n .column-4 {\n grid-column: 3;\n }\n\n .column-4 {\n grid-row: 2;\n }\n }\n\n @media screen and (max-width: 600px) {\n .column-1 {\n display: block;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n .column-0,\n .column-1,\n .column-3,\n .column-4 {\n display: none;\n }\n }\n }\n\n h4 {\n font-weight: 700;\n margin-bottom: 8px;\n color: $darker-text-color;\n\n a {\n color: inherit;\n text-decoration: none;\n }\n }\n\n ul a {\n text-decoration: none;\n color: lighten($ui-base-color, 34%);\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n\n .brand {\n svg {\n display: block;\n height: 36px;\n width: auto;\n margin: 0 auto;\n fill: lighten($ui-base-color, 34%);\n }\n\n &:hover,\n &:focus,\n &:active {\n svg {\n fill: lighten($ui-base-color, 38%);\n }\n }\n }\n }\n}\n",".compact-header {\n h1 {\n font-size: 24px;\n line-height: 28px;\n color: $darker-text-color;\n font-weight: 500;\n margin-bottom: 20px;\n padding: 0 10px;\n word-wrap: break-word;\n\n @media screen and (max-width: 740px) {\n text-align: center;\n padding: 20px 10px 0;\n }\n\n a {\n color: inherit;\n text-decoration: none;\n }\n\n small {\n font-weight: 400;\n color: $secondary-text-color;\n }\n\n img {\n display: inline-block;\n margin-bottom: -5px;\n margin-right: 15px;\n width: 36px;\n height: 36px;\n }\n }\n}\n",".hero-widget {\n margin-bottom: 10px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &__img {\n width: 100%;\n position: relative;\n overflow: hidden;\n border-radius: 4px 4px 0 0;\n background: $base-shadow-color;\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 4px 4px 0 0;\n }\n }\n\n &__text {\n background: $ui-base-color;\n padding: 20px;\n border-radius: 0 0 4px 4px;\n font-size: 15px;\n color: $darker-text-color;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n p {\n margin-bottom: 20px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n em {\n display: inline;\n margin: 0;\n padding: 0;\n font-weight: 700;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n color: lighten($darker-text-color, 10%);\n }\n\n a {\n color: $secondary-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n}\n\n.endorsements-widget {\n margin-bottom: 10px;\n padding-bottom: 10px;\n\n h4 {\n padding: 10px;\n font-weight: 700;\n font-size: 14px;\n color: $darker-text-color;\n }\n\n .account {\n padding: 10px 0;\n\n &:last-child {\n border-bottom: 0;\n }\n\n .account__display-name {\n display: flex;\n align-items: center;\n }\n\n .account__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n }\n\n .trends__item {\n padding: 10px;\n }\n}\n\n.trends-widget {\n h4 {\n color: $darker-text-color;\n }\n}\n\n.box-widget {\n padding: 20px;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n}\n\n.placeholder-widget {\n padding: 16px;\n border-radius: 4px;\n border: 2px dashed $dark-text-color;\n text-align: center;\n color: $darker-text-color;\n margin-bottom: 10px;\n}\n\n.contact-widget {\n min-height: 100%;\n font-size: 15px;\n color: $darker-text-color;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n padding: 0;\n\n h4 {\n padding: 10px;\n font-weight: 700;\n font-size: 14px;\n color: $darker-text-color;\n }\n\n .account {\n border-bottom: 0;\n padding: 10px 0;\n padding-top: 5px;\n }\n\n & > a {\n display: inline-block;\n padding: 10px;\n padding-top: 0;\n color: $darker-text-color;\n text-decoration: none;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.moved-account-widget {\n padding: 15px;\n padding-bottom: 20px;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n color: $secondary-text-color;\n font-weight: 400;\n margin-bottom: 10px;\n\n strong,\n a {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n color: inherit;\n text-decoration: underline;\n\n &.mention {\n text-decoration: none;\n\n span {\n text-decoration: none;\n }\n\n &:focus,\n &:hover,\n &:active {\n text-decoration: none;\n\n span {\n text-decoration: underline;\n }\n }\n }\n }\n\n &__message {\n margin-bottom: 15px;\n\n .fa {\n margin-right: 5px;\n color: $darker-text-color;\n }\n }\n\n &__card {\n .detailed-status__display-avatar {\n position: relative;\n cursor: pointer;\n }\n\n .detailed-status__display-name {\n margin-bottom: 0;\n text-decoration: none;\n\n span {\n font-weight: 400;\n }\n }\n }\n}\n\n.memoriam-widget {\n padding: 20px;\n border-radius: 4px;\n background: $base-shadow-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n font-size: 14px;\n color: $darker-text-color;\n margin-bottom: 10px;\n}\n\n.page-header {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n padding: 60px 15px;\n text-align: center;\n margin: 10px 0;\n\n h1 {\n color: $primary-text-color;\n font-size: 36px;\n line-height: 1.1;\n font-weight: 700;\n margin-bottom: 10px;\n }\n\n p {\n font-size: 15px;\n color: $darker-text-color;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-top: 0;\n background: lighten($ui-base-color, 4%);\n\n h1 {\n font-size: 24px;\n }\n }\n}\n\n.directory {\n background: $ui-base-color;\n border-radius: 4px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &__tag {\n box-sizing: border-box;\n margin-bottom: 10px;\n\n & > a,\n & > div {\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: $ui-base-color;\n border-radius: 4px;\n padding: 15px;\n text-decoration: none;\n color: inherit;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n }\n\n & > a {\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 8%);\n }\n }\n\n &.active > a {\n background: $ui-highlight-color;\n cursor: default;\n }\n\n &.disabled > div {\n opacity: 0.5;\n cursor: default;\n }\n\n h4 {\n flex: 1 1 auto;\n font-size: 18px;\n font-weight: 700;\n color: $primary-text-color;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n .fa {\n color: $darker-text-color;\n }\n\n small {\n display: block;\n font-weight: 400;\n font-size: 15px;\n margin-top: 8px;\n color: $darker-text-color;\n }\n }\n\n &.active h4 {\n &,\n .fa,\n small,\n .trends__item__current {\n color: $primary-text-color;\n }\n }\n\n .avatar-stack {\n flex: 0 0 auto;\n width: (36px + 4px) * 3;\n }\n\n &.active .avatar-stack .account__avatar {\n border-color: $ui-highlight-color;\n }\n\n .trends__item__current {\n padding-right: 0;\n }\n }\n}\n\n.avatar-stack {\n display: flex;\n justify-content: flex-end;\n\n .account__avatar {\n flex: 0 0 auto;\n width: 36px;\n height: 36px;\n border-radius: 50%;\n position: relative;\n margin-left: -10px;\n background: darken($ui-base-color, 8%);\n border: 2px solid $ui-base-color;\n\n &:nth-child(1) {\n z-index: 1;\n }\n\n &:nth-child(2) {\n z-index: 2;\n }\n\n &:nth-child(3) {\n z-index: 3;\n }\n }\n}\n\n.accounts-table {\n width: 100%;\n\n .account {\n padding: 0;\n border: 0;\n }\n\n strong {\n font-weight: 700;\n }\n\n thead th {\n text-align: center;\n color: $darker-text-color;\n font-weight: 700;\n padding: 10px;\n\n &:first-child {\n text-align: left;\n }\n }\n\n tbody td {\n padding: 15px 0;\n vertical-align: middle;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n tbody tr:last-child td {\n border-bottom: 0;\n }\n\n &__count {\n width: 120px;\n text-align: center;\n font-size: 15px;\n font-weight: 500;\n color: $primary-text-color;\n\n small {\n display: block;\n color: $darker-text-color;\n font-weight: 400;\n font-size: 14px;\n }\n }\n\n &__comment {\n width: 50%;\n vertical-align: initial !important;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n tbody td.optional {\n display: none;\n }\n }\n}\n\n.moved-account-widget,\n.memoriam-widget,\n.box-widget,\n.contact-widget,\n.landing-page__information.contact-widget,\n.directory,\n.page-header {\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n box-shadow: none;\n border-radius: 0;\n }\n}\n\n$maximum-width: 1235px;\n$fluid-breakpoint: $maximum-width + 20px;\n\n.statuses-grid {\n min-height: 600px;\n\n @media screen and (max-width: 640px) {\n width: 100% !important; // Masonry layout is unnecessary at this width\n }\n\n &__item {\n width: (960px - 20px) / 3;\n\n @media screen and (max-width: $fluid-breakpoint) {\n width: (940px - 20px) / 3;\n }\n\n @media screen and (max-width: 640px) {\n width: 100%;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n width: 100vw;\n }\n }\n\n .detailed-status {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 1px solid lighten($ui-base-color, 16%);\n }\n\n &.compact {\n .detailed-status__meta {\n margin-top: 15px;\n }\n\n .status__content {\n font-size: 15px;\n line-height: 20px;\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n .status__content__spoiler-link {\n line-height: 20px;\n margin: 0;\n }\n }\n\n .media-gallery,\n .status-card,\n .video-player {\n margin-top: 15px;\n }\n }\n }\n}\n\n.notice-widget {\n margin-bottom: 10px;\n color: $darker-text-color;\n\n p {\n margin-bottom: 10px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n font-size: 14px;\n line-height: 20px;\n }\n}\n\n.notice-widget,\n.placeholder-widget {\n a {\n text-decoration: none;\n font-weight: 500;\n color: $ui-highlight-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.table-of-contents {\n background: darken($ui-base-color, 4%);\n min-height: 100%;\n font-size: 14px;\n border-radius: 4px;\n\n li a {\n display: block;\n font-weight: 500;\n padding: 15px;\n overflow: hidden;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n text-decoration: none;\n color: $primary-text-color;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n\n li:last-child a {\n border-bottom: 0;\n }\n\n li ul {\n padding-left: 20px;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n }\n}\n","$no-columns-breakpoint: 600px;\n\ncode {\n font-family: $font-monospace, monospace;\n font-weight: 400;\n}\n\n.form-container {\n max-width: 400px;\n padding: 20px;\n margin: 0 auto;\n}\n\n.simple_form {\n .input {\n margin-bottom: 15px;\n overflow: hidden;\n\n &.hidden {\n margin: 0;\n }\n\n &.radio_buttons {\n .radio {\n margin-bottom: 15px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .radio > label {\n position: relative;\n padding-left: 28px;\n\n input {\n position: absolute;\n top: -2px;\n left: 0;\n }\n }\n }\n\n &.boolean {\n position: relative;\n margin-bottom: 0;\n\n .label_input > label {\n font-family: inherit;\n font-size: 14px;\n padding-top: 5px;\n color: $primary-text-color;\n display: block;\n width: auto;\n }\n\n .label_input,\n .hint {\n padding-left: 28px;\n }\n\n .label_input__wrapper {\n position: static;\n }\n\n label.checkbox {\n position: absolute;\n top: 2px;\n left: 0;\n }\n\n label a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: none;\n }\n }\n\n .recommended {\n position: absolute;\n margin: 0 4px;\n margin-top: -2px;\n }\n }\n }\n\n .row {\n display: flex;\n margin: 0 -5px;\n\n .input {\n box-sizing: border-box;\n flex: 1 1 auto;\n width: 50%;\n padding: 0 5px;\n }\n }\n\n .hint {\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n }\n\n code {\n border-radius: 3px;\n padding: 0.2em 0.4em;\n background: darken($ui-base-color, 12%);\n }\n\n li {\n list-style: disc;\n margin-left: 18px;\n }\n }\n\n ul.hint {\n margin-bottom: 15px;\n }\n\n span.hint {\n display: block;\n font-size: 12px;\n margin-top: 4px;\n }\n\n p.hint {\n margin-bottom: 15px;\n color: $darker-text-color;\n\n &.subtle-hint {\n text-align: center;\n font-size: 12px;\n line-height: 18px;\n margin-top: 15px;\n margin-bottom: 0;\n }\n }\n\n .card {\n margin-bottom: 15px;\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n .input.with_floating_label {\n .label_input {\n display: flex;\n\n & > label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 500;\n min-width: 150px;\n flex: 0 0 auto;\n }\n\n input,\n select {\n flex: 1 1 auto;\n }\n }\n\n &.select .hint {\n margin-top: 6px;\n margin-left: 150px;\n }\n }\n\n .input.with_label {\n .label_input > label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: block;\n margin-bottom: 8px;\n word-wrap: break-word;\n font-weight: 500;\n }\n\n .hint {\n margin-top: 6px;\n }\n\n ul {\n flex: 390px;\n }\n }\n\n .input.with_block_label {\n max-width: none;\n\n & > label {\n font-family: inherit;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n font-weight: 500;\n padding-top: 5px;\n }\n\n .hint {\n margin-bottom: 15px;\n }\n\n ul {\n columns: 2;\n }\n }\n\n .required abbr {\n text-decoration: none;\n color: lighten($error-value-color, 12%);\n }\n\n .fields-group {\n margin-bottom: 25px;\n\n .input:last-child {\n margin-bottom: 0;\n }\n }\n\n .fields-row {\n display: flex;\n margin: 0 -10px;\n padding-top: 5px;\n margin-bottom: 25px;\n\n .input {\n max-width: none;\n }\n\n &__column {\n box-sizing: border-box;\n padding: 0 10px;\n flex: 1 1 auto;\n min-height: 1px;\n\n &-6 {\n max-width: 50%;\n }\n\n .actions {\n margin-top: 27px;\n }\n }\n\n .fields-group:last-child,\n .fields-row__column.fields-group {\n margin-bottom: 0;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n margin-bottom: 0;\n\n &__column {\n max-width: none;\n }\n\n .fields-group:last-child,\n .fields-row__column.fields-group,\n .fields-row__column {\n margin-bottom: 25px;\n }\n }\n }\n\n .input.radio_buttons .radio label {\n margin-bottom: 5px;\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: block;\n width: auto;\n }\n\n .check_boxes {\n .checkbox {\n label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: inline-block;\n width: auto;\n position: relative;\n padding-top: 5px;\n padding-left: 25px;\n flex: 1 1 auto;\n }\n\n input[type=checkbox] {\n position: absolute;\n left: 0;\n top: 5px;\n margin: 0;\n }\n }\n }\n\n .input.static .label_input__wrapper {\n font-size: 16px;\n padding: 10px;\n border: 1px solid $dark-text-color;\n border-radius: 4px;\n }\n\n input[type=text],\n input[type=number],\n input[type=email],\n input[type=password],\n textarea {\n box-sizing: border-box;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n width: 100%;\n outline: 0;\n font-family: inherit;\n resize: vertical;\n background: darken($ui-base-color, 10%);\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n padding: 10px;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &:invalid {\n box-shadow: none;\n }\n\n &:focus:invalid:not(:placeholder-shown) {\n border-color: lighten($error-red, 12%);\n }\n\n &:required:valid {\n border-color: $valid-value-color;\n }\n\n &:hover {\n border-color: darken($ui-base-color, 20%);\n }\n\n &:active,\n &:focus {\n border-color: $highlight-text-color;\n background: darken($ui-base-color, 8%);\n }\n }\n\n .input.field_with_errors {\n label {\n color: lighten($error-red, 12%);\n }\n\n input[type=text],\n input[type=number],\n input[type=email],\n input[type=password],\n textarea,\n select {\n border-color: lighten($error-red, 12%);\n }\n\n .error {\n display: block;\n font-weight: 500;\n color: lighten($error-red, 12%);\n margin-top: 4px;\n }\n }\n\n .input.disabled {\n opacity: 0.5;\n }\n\n .actions {\n margin-top: 30px;\n display: flex;\n\n &.actions--top {\n margin-top: 0;\n margin-bottom: 30px;\n }\n }\n\n button,\n .button,\n .block-button {\n display: block;\n width: 100%;\n border: 0;\n border-radius: 4px;\n background: $ui-highlight-color;\n color: $primary-text-color;\n font-size: 18px;\n line-height: inherit;\n height: auto;\n padding: 10px;\n text-decoration: none;\n text-align: center;\n box-sizing: border-box;\n cursor: pointer;\n font-weight: 500;\n outline: 0;\n margin-bottom: 10px;\n margin-right: 10px;\n\n &:last-child {\n margin-right: 0;\n }\n\n &:hover {\n background-color: lighten($ui-highlight-color, 5%);\n }\n\n &:active,\n &:focus {\n background-color: darken($ui-highlight-color, 5%);\n }\n\n &:disabled:hover {\n background-color: $ui-primary-color;\n }\n\n &.negative {\n background: $error-value-color;\n\n &:hover {\n background-color: lighten($error-value-color, 5%);\n }\n\n &:active,\n &:focus {\n background-color: darken($error-value-color, 5%);\n }\n }\n }\n\n select {\n appearance: none;\n box-sizing: border-box;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n width: 100%;\n outline: 0;\n font-family: inherit;\n resize: vertical;\n background: darken($ui-base-color, 10%) url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center / auto 16px;\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n padding-left: 10px;\n padding-right: 30px;\n height: 41px;\n }\n\n h4 {\n margin-bottom: 15px !important;\n }\n\n .label_input {\n &__wrapper {\n position: relative;\n }\n\n &__append {\n position: absolute;\n right: 3px;\n top: 1px;\n padding: 10px;\n padding-bottom: 9px;\n font-size: 16px;\n color: $dark-text-color;\n font-family: inherit;\n pointer-events: none;\n cursor: default;\n max-width: 140px;\n white-space: nowrap;\n overflow: hidden;\n\n &::after {\n content: '';\n display: block;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 1px;\n width: 5px;\n background-image: linear-gradient(to right, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));\n }\n }\n }\n\n &__overlay-area {\n position: relative;\n\n &__blurred form {\n filter: blur(2px);\n }\n\n &__overlay {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n background: rgba($ui-base-color, 0.65);\n border-radius: 4px;\n margin-left: -4px;\n margin-top: -4px;\n padding: 4px;\n\n &__content {\n text-align: center;\n\n &.rich-formatting {\n &,\n p {\n color: $primary-text-color;\n }\n }\n }\n }\n }\n}\n\n.block-icon {\n display: block;\n margin: 0 auto;\n margin-bottom: 10px;\n font-size: 24px;\n}\n\n.flash-message {\n background: lighten($ui-base-color, 8%);\n color: $darker-text-color;\n border-radius: 4px;\n padding: 15px 10px;\n margin-bottom: 30px;\n text-align: center;\n\n &.notice {\n border: 1px solid rgba($valid-value-color, 0.5);\n background: rgba($valid-value-color, 0.25);\n color: $valid-value-color;\n }\n\n &.alert {\n border: 1px solid rgba($error-value-color, 0.5);\n background: rgba($error-value-color, 0.25);\n color: $error-value-color;\n }\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n\n &:hover {\n color: $primary-text-color;\n text-decoration: underline;\n }\n }\n\n p {\n margin-bottom: 15px;\n }\n\n .oauth-code {\n outline: 0;\n box-sizing: border-box;\n display: block;\n width: 100%;\n border: 0;\n padding: 10px;\n font-family: $font-monospace, monospace;\n background: $ui-base-color;\n color: $primary-text-color;\n font-size: 14px;\n margin: 0;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n @media screen and (max-width: 740px) and (min-width: 441px) {\n margin-top: 40px;\n }\n}\n\n.form-footer {\n margin-top: 30px;\n text-align: center;\n\n a {\n color: $darker-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.quick-nav {\n list-style: none;\n margin-bottom: 25px;\n font-size: 14px;\n\n li {\n display: inline-block;\n margin-right: 10px;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n font-weight: 700;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($highlight-text-color, 8%);\n }\n }\n}\n\n.oauth-prompt,\n.follow-prompt {\n margin-bottom: 30px;\n color: $darker-text-color;\n\n h2 {\n font-size: 16px;\n margin-bottom: 30px;\n text-align: center;\n }\n\n strong {\n color: $secondary-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n @media screen and (max-width: 740px) and (min-width: 441px) {\n margin-top: 40px;\n }\n}\n\n.qr-wrapper {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n}\n\n.qr-code {\n flex: 0 0 auto;\n background: $simple-background-color;\n padding: 4px;\n margin: 0 10px 20px 0;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n display: inline-block;\n\n svg {\n display: block;\n margin: 0;\n }\n}\n\n.qr-alternative {\n margin-bottom: 20px;\n color: $secondary-text-color;\n flex: 150px;\n\n samp {\n display: block;\n font-size: 14px;\n }\n}\n\n.table-form {\n p {\n margin-bottom: 15px;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n }\n}\n\n.simple_form,\n.table-form {\n .warning {\n box-sizing: border-box;\n background: rgba($error-value-color, 0.5);\n color: $primary-text-color;\n text-shadow: 1px 1px 0 rgba($base-shadow-color, 0.3);\n box-shadow: 0 2px 6px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n padding: 10px;\n margin-bottom: 15px;\n\n a {\n color: $primary-text-color;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n strong {\n font-weight: 600;\n display: block;\n margin-bottom: 5px;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n\n .fa {\n font-weight: 400;\n }\n }\n }\n}\n\n.action-pagination {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n\n .actions,\n .pagination {\n flex: 1 1 auto;\n }\n\n .actions {\n padding: 30px 0;\n padding-right: 20px;\n flex: 0 0 auto;\n }\n}\n\n.post-follow-actions {\n text-align: center;\n color: $darker-text-color;\n\n div {\n margin-bottom: 4px;\n }\n}\n\n.alternative-login {\n margin-top: 20px;\n margin-bottom: 20px;\n\n h4 {\n font-size: 16px;\n color: $primary-text-color;\n text-align: center;\n margin-bottom: 20px;\n border: 0;\n padding: 0;\n }\n\n .button {\n display: block;\n }\n}\n\n.scope-danger {\n color: $warning-red;\n}\n\n.form_admin_settings_site_short_description,\n.form_admin_settings_site_description,\n.form_admin_settings_site_extended_description,\n.form_admin_settings_site_terms,\n.form_admin_settings_custom_css,\n.form_admin_settings_closed_registrations_message {\n textarea {\n font-family: $font-monospace, monospace;\n }\n}\n\n.input-copy {\n background: darken($ui-base-color, 10%);\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n display: flex;\n align-items: center;\n padding-right: 4px;\n position: relative;\n top: 1px;\n transition: border-color 300ms linear;\n\n &__wrapper {\n flex: 1 1 auto;\n }\n\n input[type=text] {\n background: transparent;\n border: 0;\n padding: 10px;\n font-size: 14px;\n font-family: $font-monospace, monospace;\n }\n\n button {\n flex: 0 0 auto;\n margin: 4px;\n text-transform: none;\n font-weight: 400;\n font-size: 14px;\n padding: 7px 18px;\n padding-bottom: 6px;\n width: auto;\n transition: background 300ms linear;\n }\n\n &.copied {\n border-color: $valid-value-color;\n transition: none;\n\n button {\n background: $valid-value-color;\n transition: none;\n }\n }\n}\n\n.connection-prompt {\n margin-bottom: 25px;\n\n .fa-link {\n background-color: darken($ui-base-color, 4%);\n border-radius: 100%;\n font-size: 24px;\n padding: 10px;\n }\n\n &__column {\n align-items: center;\n display: flex;\n flex: 1;\n flex-direction: column;\n flex-shrink: 1;\n max-width: 50%;\n\n &-sep {\n align-self: center;\n flex-grow: 0;\n overflow: visible;\n position: relative;\n z-index: 1;\n }\n\n p {\n word-break: break-word;\n }\n }\n\n .account__avatar {\n margin-bottom: 20px;\n }\n\n &__connection {\n background-color: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n padding: 25px 10px;\n position: relative;\n text-align: center;\n\n &::after {\n background-color: darken($ui-base-color, 4%);\n content: '';\n display: block;\n height: 100%;\n left: 50%;\n position: absolute;\n top: 0;\n width: 1px;\n }\n }\n\n &__row {\n align-items: flex-start;\n display: flex;\n flex-direction: row;\n }\n}\n",".card {\n & > a {\n display: block;\n text-decoration: none;\n color: inherit;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n box-shadow: none;\n }\n\n &:hover,\n &:active,\n &:focus {\n .card__bar {\n background: lighten($ui-base-color, 8%);\n }\n }\n }\n\n &__img {\n height: 130px;\n position: relative;\n background: darken($ui-base-color, 12%);\n border-radius: 4px 4px 0 0;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n object-fit: cover;\n border-radius: 4px 4px 0 0;\n }\n\n @media screen and (max-width: 600px) {\n height: 200px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n\n &__bar {\n position: relative;\n padding: 15px;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n\n .avatar {\n flex: 0 0 auto;\n width: 48px;\n height: 48px;\n padding-top: 2px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n background: darken($ui-base-color, 8%);\n object-fit: cover;\n }\n }\n\n .display-name {\n margin-left: 15px;\n text-align: left;\n\n strong {\n font-size: 15px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n span {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n}\n\n.pagination {\n padding: 30px 0;\n text-align: center;\n overflow: hidden;\n\n a,\n .current,\n .newer,\n .older,\n .page,\n .gap {\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 500;\n display: inline-block;\n padding: 6px 10px;\n text-decoration: none;\n }\n\n .current {\n background: $simple-background-color;\n border-radius: 100px;\n color: $inverted-text-color;\n cursor: default;\n margin: 0 10px;\n }\n\n .gap {\n cursor: default;\n }\n\n .older,\n .newer {\n color: $secondary-text-color;\n }\n\n .older {\n float: left;\n padding-left: 0;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n .newer {\n float: right;\n padding-right: 0;\n\n .fa {\n display: inline-block;\n margin-left: 5px;\n }\n }\n\n .disabled {\n cursor: default;\n color: lighten($inverted-text-color, 10%);\n }\n\n @media screen and (max-width: 700px) {\n padding: 30px 20px;\n\n .page {\n display: none;\n }\n\n .newer,\n .older {\n display: inline-block;\n }\n }\n}\n\n.nothing-here {\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n color: $light-text-color;\n font-size: 14px;\n font-weight: 500;\n text-align: center;\n display: flex;\n justify-content: center;\n align-items: center;\n cursor: default;\n border-radius: 4px;\n padding: 20px;\n min-height: 30vh;\n\n &--under-tabs {\n border-radius: 0 0 4px 4px;\n }\n\n &--flexible {\n box-sizing: border-box;\n min-height: 100%;\n }\n}\n\n.account-role,\n.simple_form .recommended {\n display: inline-block;\n padding: 4px 6px;\n cursor: default;\n border-radius: 3px;\n font-size: 12px;\n line-height: 12px;\n font-weight: 500;\n color: $ui-secondary-color;\n background-color: rgba($ui-secondary-color, 0.1);\n border: 1px solid rgba($ui-secondary-color, 0.5);\n\n &.moderator {\n color: $success-green;\n background-color: rgba($success-green, 0.1);\n border-color: rgba($success-green, 0.5);\n }\n\n &.admin {\n color: lighten($error-red, 12%);\n background-color: rgba(lighten($error-red, 12%), 0.1);\n border-color: rgba(lighten($error-red, 12%), 0.5);\n }\n}\n\n.account__header__fields {\n max-width: 100vw;\n padding: 0;\n margin: 15px -15px -15px;\n border: 0 none;\n border-top: 1px solid lighten($ui-base-color, 12%);\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n font-size: 14px;\n line-height: 20px;\n\n dl {\n display: flex;\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n }\n\n dt,\n dd {\n box-sizing: border-box;\n padding: 14px;\n text-align: center;\n max-height: 48px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n dt {\n font-weight: 500;\n width: 120px;\n flex: 0 0 auto;\n color: $secondary-text-color;\n background: rgba(darken($ui-base-color, 8%), 0.5);\n }\n\n dd {\n flex: 1 1 auto;\n color: $darker-text-color;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n\n .verified {\n border: 1px solid rgba($valid-value-color, 0.5);\n background: rgba($valid-value-color, 0.25);\n\n a {\n color: $valid-value-color;\n font-weight: 500;\n }\n\n &__mark {\n color: $valid-value-color;\n }\n }\n\n dl:last-child {\n border-bottom: 0;\n }\n}\n\n.directory__tag .trends__item__current {\n width: auto;\n}\n\n.pending-account {\n &__header {\n color: $darker-text-color;\n\n a {\n color: $ui-secondary-color;\n text-decoration: none;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n\n strong {\n color: $primary-text-color;\n font-weight: 700;\n }\n }\n\n &__body {\n margin-top: 10px;\n }\n}\n",".activity-stream {\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n overflow: hidden;\n margin-bottom: 10px;\n\n &--under-tabs {\n border-radius: 0 0 4px 4px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n border-radius: 0;\n box-shadow: none;\n }\n\n &--headless {\n border-radius: 0;\n margin: 0;\n box-shadow: none;\n\n .detailed-status,\n .status {\n border-radius: 0 !important;\n }\n }\n\n div[data-component] {\n width: 100%;\n }\n\n .entry {\n background: $ui-base-color;\n\n .detailed-status,\n .status,\n .load-more {\n animation: none;\n }\n\n &:last-child {\n .detailed-status,\n .status,\n .load-more {\n border-bottom: 0;\n border-radius: 0 0 4px 4px;\n }\n }\n\n &:first-child {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 4px 4px 0 0;\n }\n\n &:last-child {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 4px;\n }\n }\n }\n\n @media screen and (max-width: 740px) {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 0 !important;\n }\n }\n }\n\n &--highlighted .entry {\n background: lighten($ui-base-color, 8%);\n }\n}\n\n.button.logo-button {\n flex: 0 auto;\n font-size: 14px;\n background: $ui-highlight-color;\n color: $primary-text-color;\n text-transform: none;\n line-height: 36px;\n height: auto;\n padding: 3px 15px;\n border: 0;\n\n svg {\n width: 20px;\n height: auto;\n vertical-align: middle;\n margin-right: 5px;\n fill: $primary-text-color;\n }\n\n &:active,\n &:focus,\n &:hover {\n background: lighten($ui-highlight-color, 10%);\n }\n\n &:disabled,\n &.disabled {\n &:active,\n &:focus,\n &:hover {\n background: $ui-primary-color;\n }\n }\n\n &.button--destructive {\n &:active,\n &:focus,\n &:hover {\n background: $error-red;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n svg {\n display: none;\n }\n }\n}\n\n.embed,\n.public-layout {\n .detailed-status {\n padding: 15px;\n }\n\n .status {\n padding: 15px 15px 15px (48px + 15px * 2);\n min-height: 48px + 2px;\n\n &__avatar {\n left: 15px;\n top: 17px;\n }\n\n &__content {\n padding-top: 5px;\n }\n\n &__prepend {\n margin-left: 48px + 15px * 2;\n padding-top: 15px;\n }\n\n &__prepend-icon-wrapper {\n left: -32px;\n }\n\n .media-gallery,\n &__action-bar,\n .video-player {\n margin-top: 10px;\n }\n }\n}\n","button.icon-button i.fa-retweet {\n background-image: url(\"data:image/svg+xml;utf8,\");\n\n &:hover {\n background-image: url(\"data:image/svg+xml;utf8,\");\n }\n}\n\nbutton.icon-button.disabled i.fa-retweet {\n background-image: url(\"data:image/svg+xml;utf8,\");\n}\n",".app-body {\n -webkit-overflow-scrolling: touch;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n}\n\n.link-button {\n display: block;\n font-size: 15px;\n line-height: 20px;\n color: $ui-highlight-color;\n border: 0;\n background: transparent;\n padding: 0;\n cursor: pointer;\n\n &:hover,\n &:active {\n text-decoration: underline;\n }\n\n &:disabled {\n color: $ui-primary-color;\n cursor: default;\n }\n}\n\n.button {\n background-color: $ui-highlight-color;\n border: 10px none;\n border-radius: 4px;\n box-sizing: border-box;\n color: $primary-text-color;\n cursor: pointer;\n display: inline-block;\n font-family: inherit;\n font-size: 15px;\n font-weight: 500;\n height: 36px;\n letter-spacing: 0;\n line-height: 36px;\n overflow: hidden;\n padding: 0 16px;\n position: relative;\n text-align: center;\n text-decoration: none;\n text-overflow: ellipsis;\n transition: all 100ms ease-in;\n white-space: nowrap;\n width: auto;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-highlight-color, 10%);\n transition: all 200ms ease-out;\n }\n\n &--destructive {\n transition: none;\n\n &:active,\n &:focus,\n &:hover {\n background-color: $error-red;\n transition: none;\n }\n }\n\n &:disabled,\n &.disabled {\n background-color: $ui-primary-color;\n cursor: default;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &.button-primary,\n &.button-alternative,\n &.button-secondary,\n &.button-alternative-2 {\n font-size: 16px;\n line-height: 36px;\n height: auto;\n text-transform: none;\n padding: 4px 16px;\n }\n\n &.button-alternative {\n color: $inverted-text-color;\n background: $ui-primary-color;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-primary-color, 4%);\n }\n }\n\n &.button-alternative-2 {\n background: $ui-base-lighter-color;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-base-lighter-color, 4%);\n }\n }\n\n &.button-secondary {\n color: $darker-text-color;\n background: transparent;\n padding: 3px 15px;\n border: 1px solid $ui-primary-color;\n\n &:active,\n &:focus,\n &:hover {\n border-color: lighten($ui-primary-color, 4%);\n color: lighten($darker-text-color, 4%);\n }\n\n &:disabled {\n opacity: 0.5;\n }\n }\n\n &.button--block {\n display: block;\n width: 100%;\n }\n}\n\n.column__wrapper {\n display: flex;\n flex: 1 1 auto;\n position: relative;\n}\n\n.icon-button {\n display: inline-block;\n padding: 0;\n color: $action-button-color;\n border: 0;\n border-radius: 4px;\n background: transparent;\n cursor: pointer;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($action-button-color, 7%);\n background-color: rgba($action-button-color, 0.15);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n }\n\n &:focus {\n background-color: rgba($action-button-color, 0.3);\n }\n\n &.disabled {\n color: darken($action-button-color, 13%);\n background-color: transparent;\n cursor: default;\n }\n\n &.active {\n color: $highlight-text-color;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &.inverted {\n color: $lighter-text-color;\n\n &:hover,\n &:active,\n &:focus {\n color: darken($lighter-text-color, 7%);\n background-color: rgba($lighter-text-color, 0.15);\n }\n\n &:focus {\n background-color: rgba($lighter-text-color, 0.3);\n }\n\n &.disabled {\n color: lighten($lighter-text-color, 7%);\n background-color: transparent;\n }\n\n &.active {\n color: $highlight-text-color;\n\n &.disabled {\n color: lighten($highlight-text-color, 13%);\n }\n }\n }\n\n &.overlayed {\n box-sizing: content-box;\n background: rgba($base-overlay-background, 0.6);\n color: rgba($primary-text-color, 0.7);\n border-radius: 4px;\n padding: 2px;\n\n &:hover {\n background: rgba($base-overlay-background, 0.9);\n }\n }\n}\n\n.text-icon-button {\n color: $lighter-text-color;\n border: 0;\n border-radius: 4px;\n background: transparent;\n cursor: pointer;\n font-weight: 600;\n font-size: 11px;\n padding: 0 3px;\n line-height: 27px;\n outline: 0;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &:hover,\n &:active,\n &:focus {\n color: darken($lighter-text-color, 7%);\n background-color: rgba($lighter-text-color, 0.15);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n }\n\n &:focus {\n background-color: rgba($lighter-text-color, 0.3);\n }\n\n &.disabled {\n color: lighten($lighter-text-color, 20%);\n background-color: transparent;\n cursor: default;\n }\n\n &.active {\n color: $highlight-text-color;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n}\n\n.dropdown-menu {\n position: absolute;\n}\n\n.invisible {\n font-size: 0;\n line-height: 0;\n display: inline-block;\n width: 0;\n height: 0;\n position: absolute;\n\n img,\n svg {\n margin: 0 !important;\n border: 0 !important;\n padding: 0 !important;\n width: 0 !important;\n height: 0 !important;\n }\n}\n\n.ellipsis {\n &::after {\n content: \"…\";\n }\n}\n\n.compose-form {\n padding: 10px;\n\n &__sensitive-button {\n padding: 10px;\n padding-top: 0;\n\n font-size: 14px;\n font-weight: 500;\n\n &.active {\n color: $highlight-text-color;\n }\n\n input[type=checkbox] {\n display: none;\n }\n\n .checkbox {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 4px;\n vertical-align: middle;\n\n &.active {\n border-color: $highlight-text-color;\n background: $highlight-text-color;\n }\n }\n }\n\n .compose-form__warning {\n color: $inverted-text-color;\n margin-bottom: 10px;\n background: $ui-primary-color;\n box-shadow: 0 2px 6px rgba($base-shadow-color, 0.3);\n padding: 8px 10px;\n border-radius: 4px;\n font-size: 13px;\n font-weight: 400;\n\n strong {\n color: $inverted-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n color: $lighter-text-color;\n font-weight: 500;\n text-decoration: underline;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: none;\n }\n }\n }\n\n .emoji-picker-dropdown {\n position: absolute;\n top: 5px;\n right: 5px;\n }\n\n .compose-form__autosuggest-wrapper {\n position: relative;\n }\n\n .autosuggest-textarea,\n .autosuggest-input,\n .spoiler-input {\n position: relative;\n width: 100%;\n }\n\n .spoiler-input {\n height: 0;\n transform-origin: bottom;\n opacity: 0;\n\n &.spoiler-input--visible {\n height: 36px;\n margin-bottom: 11px;\n opacity: 1;\n }\n }\n\n .autosuggest-textarea__textarea,\n .spoiler-input__input {\n display: block;\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n color: $inverted-text-color;\n background: $simple-background-color;\n padding: 10px;\n font-family: inherit;\n font-size: 14px;\n resize: vertical;\n border: 0;\n outline: 0;\n\n &::placeholder {\n color: $dark-text-color;\n }\n\n &:focus {\n outline: 0;\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n .spoiler-input__input {\n border-radius: 4px;\n }\n\n .autosuggest-textarea__textarea {\n min-height: 100px;\n border-radius: 4px 4px 0 0;\n padding-bottom: 0;\n padding-right: 10px + 22px;\n resize: none;\n scrollbar-color: initial;\n\n &::-webkit-scrollbar {\n all: unset;\n }\n\n @media screen and (max-width: 600px) {\n height: 100px !important; // prevent auto-resize textarea\n resize: vertical;\n }\n }\n\n .autosuggest-textarea__suggestions-wrapper {\n position: relative;\n height: 0;\n }\n\n .autosuggest-textarea__suggestions {\n box-sizing: border-box;\n display: none;\n position: absolute;\n top: 100%;\n width: 100%;\n z-index: 99;\n box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4);\n background: $ui-secondary-color;\n border-radius: 0 0 4px 4px;\n color: $inverted-text-color;\n font-size: 14px;\n padding: 6px;\n\n &.autosuggest-textarea__suggestions--visible {\n display: block;\n }\n }\n\n .autosuggest-textarea__suggestions__item {\n padding: 10px;\n cursor: pointer;\n border-radius: 4px;\n\n &:hover,\n &:focus,\n &:active,\n &.selected {\n background: darken($ui-secondary-color, 10%);\n }\n }\n\n .autosuggest-account,\n .autosuggest-emoji,\n .autosuggest-hashtag {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: flex-start;\n line-height: 18px;\n font-size: 14px;\n }\n\n .autosuggest-hashtag {\n justify-content: space-between;\n\n &__name {\n flex: 1 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n strong {\n font-weight: 500;\n }\n\n &__uses {\n flex: 0 0 auto;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n }\n\n .autosuggest-account-icon,\n .autosuggest-emoji img {\n display: block;\n margin-right: 8px;\n width: 16px;\n height: 16px;\n }\n\n .autosuggest-account .display-name__account {\n color: $lighter-text-color;\n }\n\n .compose-form__modifiers {\n color: $inverted-text-color;\n font-family: inherit;\n font-size: 14px;\n background: $simple-background-color;\n\n .compose-form__upload-wrapper {\n overflow: hidden;\n }\n\n .compose-form__uploads-wrapper {\n display: flex;\n flex-direction: row;\n padding: 5px;\n flex-wrap: wrap;\n }\n\n .compose-form__upload {\n flex: 1 1 0;\n min-width: 40%;\n margin: 5px;\n\n &__actions {\n background: linear-gradient(180deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n opacity: 0;\n transition: opacity .1s ease;\n\n .icon-button {\n flex: 0 1 auto;\n color: $secondary-text-color;\n font-size: 14px;\n font-weight: 500;\n padding: 10px;\n font-family: inherit;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($secondary-text-color, 7%);\n }\n }\n\n &.active {\n opacity: 1;\n }\n }\n\n &-description {\n position: absolute;\n z-index: 2;\n bottom: 0;\n left: 0;\n right: 0;\n box-sizing: border-box;\n background: linear-gradient(0deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);\n padding: 10px;\n opacity: 0;\n transition: opacity .1s ease;\n\n textarea {\n background: transparent;\n color: $secondary-text-color;\n border: 0;\n padding: 0;\n margin: 0;\n width: 100%;\n font-family: inherit;\n font-size: 14px;\n font-weight: 500;\n\n &:focus {\n color: $white;\n }\n\n &::placeholder {\n opacity: 0.75;\n color: $secondary-text-color;\n }\n }\n\n &.active {\n opacity: 1;\n }\n }\n }\n\n .compose-form__upload-thumbnail {\n border-radius: 4px;\n background-color: $base-shadow-color;\n background-position: center;\n background-size: cover;\n background-repeat: no-repeat;\n height: 140px;\n width: 100%;\n overflow: hidden;\n }\n }\n\n .compose-form__buttons-wrapper {\n padding: 10px;\n background: darken($simple-background-color, 8%);\n border-radius: 0 0 4px 4px;\n display: flex;\n justify-content: space-between;\n flex: 0 0 auto;\n\n .compose-form__buttons {\n display: flex;\n\n .compose-form__upload-button-icon {\n line-height: 27px;\n }\n\n .compose-form__sensitive-button {\n display: none;\n\n &.compose-form__sensitive-button--visible {\n display: block;\n }\n\n .compose-form__sensitive-button__icon {\n line-height: 27px;\n }\n }\n }\n\n .icon-button,\n .text-icon-button {\n box-sizing: content-box;\n padding: 0 3px;\n }\n\n .character-counter__wrapper {\n align-self: center;\n margin-right: 4px;\n }\n }\n\n .compose-form__publish {\n display: flex;\n justify-content: flex-end;\n min-width: 0;\n flex: 0 0 auto;\n\n .compose-form__publish-button-wrapper {\n overflow: hidden;\n padding-top: 10px;\n }\n }\n}\n\n.character-counter {\n cursor: default;\n font-family: $font-sans-serif, sans-serif;\n font-size: 14px;\n font-weight: 600;\n color: $lighter-text-color;\n\n &.character-counter--over {\n color: $warning-red;\n }\n}\n\n.no-reduce-motion .spoiler-input {\n transition: height 0.4s ease, opacity 0.4s ease;\n}\n\n.emojione {\n font-size: inherit;\n vertical-align: middle;\n object-fit: contain;\n margin: -.2ex .15em .2ex;\n width: 16px;\n height: 16px;\n\n img {\n width: auto;\n }\n}\n\n.reply-indicator {\n border-radius: 4px;\n margin-bottom: 10px;\n background: $ui-primary-color;\n padding: 10px;\n min-height: 23px;\n overflow-y: auto;\n flex: 0 2 auto;\n}\n\n.reply-indicator__header {\n margin-bottom: 5px;\n overflow: hidden;\n}\n\n.reply-indicator__cancel {\n float: right;\n line-height: 24px;\n}\n\n.reply-indicator__display-name {\n color: $inverted-text-color;\n display: block;\n max-width: 100%;\n line-height: 24px;\n overflow: hidden;\n padding-right: 25px;\n text-decoration: none;\n}\n\n.reply-indicator__display-avatar {\n float: left;\n margin-right: 5px;\n}\n\n.status__content--with-action {\n cursor: pointer;\n}\n\n.status__content,\n.reply-indicator__content {\n position: relative;\n font-size: 15px;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n padding-top: 2px;\n color: $primary-text-color;\n\n &:focus {\n outline: 0;\n }\n\n &.status__content--with-spoiler {\n white-space: normal;\n\n .status__content__text {\n white-space: pre-wrap;\n }\n }\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n img {\n max-width: 100%;\n max-height: 400px;\n object-fit: contain;\n }\n\n p {\n margin-bottom: 20px;\n white-space: pre-wrap;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: $pleroma-links;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n\n .fa {\n color: lighten($dark-text-color, 7%);\n }\n }\n\n &.mention {\n &:hover {\n text-decoration: none;\n\n span {\n text-decoration: underline;\n }\n }\n }\n\n .fa {\n color: $dark-text-color;\n }\n }\n\n a.unhandled-link {\n color: lighten($ui-highlight-color, 8%);\n }\n\n .status__content__spoiler-link {\n background: $action-button-color;\n\n &:hover {\n background: lighten($action-button-color, 7%);\n text-decoration: none;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n\n .status__content__text {\n display: none;\n\n &.status__content__text--visible {\n display: block;\n }\n }\n}\n\n.status__content.status__content--collapsed {\n max-height: 20px * 15; // 15 lines is roughly above 500 characters\n}\n\n.status__content__read-more-button {\n display: block;\n font-size: 15px;\n line-height: 20px;\n color: lighten($ui-highlight-color, 8%);\n border: 0;\n background: transparent;\n padding: 0;\n padding-top: 8px;\n\n &:hover,\n &:active {\n text-decoration: underline;\n }\n}\n\n.status__content__spoiler-link {\n display: inline-block;\n border-radius: 2px;\n background: transparent;\n border: 0;\n color: $inverted-text-color;\n font-weight: 700;\n font-size: 12px;\n padding: 0 6px;\n line-height: 20px;\n cursor: pointer;\n vertical-align: middle;\n}\n\n.status__wrapper--filtered {\n color: $dark-text-color;\n border: 0;\n font-size: inherit;\n text-align: center;\n line-height: inherit;\n margin: 0;\n padding: 15px;\n box-sizing: border-box;\n width: 100%;\n clear: both;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n}\n\n.status__prepend-icon-wrapper {\n left: -26px;\n position: absolute;\n}\n\n.focusable {\n &:focus {\n outline: 0;\n background: lighten($ui-base-color, 4%);\n\n .status.status-direct {\n background: lighten($ui-base-color, 12%);\n\n &.muted {\n background: transparent;\n }\n }\n\n .detailed-status,\n .detailed-status__action-bar {\n background: lighten($ui-base-color, 8%);\n }\n }\n}\n\n.status {\n padding: 8px 10px;\n padding-left: 68px;\n position: relative;\n min-height: 54px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n\n @supports (-ms-overflow-style: -ms-autohiding-scrollbar) {\n // Add margin to avoid Edge auto-hiding scrollbar appearing over content.\n // On Edge 16 this is 16px and Edge <=15 it's 12px, so aim for 16px.\n padding-right: 26px; // 10px + 16px\n }\n\n @keyframes fade {\n 0% { opacity: 0; }\n 100% { opacity: 1; }\n }\n\n opacity: 1;\n animation: fade 150ms linear;\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n }\n\n &.status-direct:not(.read) {\n background: lighten($ui-base-color, 8%);\n border-bottom-color: lighten($ui-base-color, 12%);\n }\n\n &.light {\n .status__relative-time {\n color: $light-text-color;\n }\n\n .status__display-name {\n color: $inverted-text-color;\n }\n\n .display-name {\n strong {\n color: $inverted-text-color;\n }\n\n span {\n color: $light-text-color;\n }\n }\n\n .status__content {\n color: $inverted-text-color;\n\n a {\n color: $highlight-text-color;\n }\n\n a.status__content__spoiler-link {\n color: $primary-text-color;\n background: $ui-primary-color;\n\n &:hover {\n background: lighten($ui-primary-color, 8%);\n }\n }\n }\n }\n}\n\n.notification-favourite {\n .status.status-direct {\n background: transparent;\n\n .icon-button.disabled {\n color: lighten($action-button-color, 13%);\n }\n }\n}\n\n.status__relative-time,\n.notification__relative_time {\n color: $dark-text-color;\n float: right;\n font-size: 14px;\n}\n\n.status__display-name {\n color: $dark-text-color;\n}\n\n.status__info .status__display-name {\n display: block;\n max-width: 100%;\n padding-right: 25px;\n}\n\n.status__info {\n font-size: 15px;\n}\n\n.status-check-box {\n border-bottom: 1px solid $ui-secondary-color;\n display: flex;\n\n .status-check-box__status {\n margin: 10px 0 10px 10px;\n flex: 1;\n\n .media-gallery {\n max-width: 250px;\n }\n\n .status__content {\n padding: 0;\n white-space: normal;\n }\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n max-width: 250px;\n }\n\n .media-gallery__item-thumbnail {\n cursor: default;\n }\n }\n}\n\n.status-check-box-toggle {\n align-items: center;\n display: flex;\n flex: 0 0 auto;\n justify-content: center;\n padding: 10px;\n}\n\n.status__prepend {\n margin-left: 68px;\n color: $dark-text-color;\n padding: 8px 0;\n padding-bottom: 2px;\n font-size: 14px;\n position: relative;\n\n .status__display-name strong {\n color: $dark-text-color;\n }\n\n > span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.status__action-bar {\n align-items: center;\n display: flex;\n margin-top: 8px;\n\n &__counter {\n display: inline-flex;\n margin-right: 11px;\n align-items: center;\n\n .status__action-bar-button {\n margin-right: 4px;\n }\n\n &__label {\n display: inline-block;\n width: 14px;\n font-size: 12px;\n font-weight: 500;\n color: $action-button-color;\n }\n }\n}\n\n.status__action-bar-button {\n margin-right: 18px;\n}\n\n.status__action-bar-dropdown {\n height: 23.15px;\n width: 23.15px;\n}\n\n.detailed-status__action-bar-dropdown {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n}\n\n.detailed-status {\n background: lighten($ui-base-color, 4%);\n padding: 14px 10px;\n\n &--flex {\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n align-items: flex-start;\n\n .status__content,\n .detailed-status__meta {\n flex: 100%;\n }\n }\n\n .status__content {\n font-size: 19px;\n line-height: 24px;\n\n .emojione {\n width: 24px;\n height: 24px;\n margin: -1px 0 0;\n }\n\n .status__content__spoiler-link {\n line-height: 24px;\n margin: -1px 0 0;\n }\n }\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n }\n}\n\n.detailed-status__meta {\n margin-top: 15px;\n color: $dark-text-color;\n font-size: 14px;\n line-height: 18px;\n}\n\n.detailed-status__action-bar {\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: row;\n padding: 10px 0;\n}\n\n.detailed-status__link {\n color: inherit;\n text-decoration: none;\n}\n\n.detailed-status__favorites,\n.detailed-status__reblogs {\n display: inline-block;\n font-weight: 500;\n font-size: 12px;\n margin-left: 6px;\n}\n\n.reply-indicator__content {\n color: $inverted-text-color;\n font-size: 14px;\n\n a {\n color: $lighter-text-color;\n }\n}\n\n.domain {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n .domain__domain-name {\n flex: 1 1 auto;\n display: block;\n color: $primary-text-color;\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n }\n}\n\n.domain__wrapper {\n display: flex;\n}\n\n.domain_buttons {\n height: 18px;\n padding: 10px;\n white-space: nowrap;\n}\n\n.account {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &.compact {\n padding: 0;\n border-bottom: 0;\n\n .account__avatar-wrapper {\n margin-left: 0;\n }\n }\n\n .account__display-name {\n flex: 1 1 auto;\n display: block;\n color: $darker-text-color;\n overflow: hidden;\n text-decoration: none;\n font-size: 14px;\n }\n}\n\n.account__wrapper {\n display: flex;\n}\n\n.account__avatar-wrapper {\n float: left;\n margin-left: 12px;\n margin-right: 12px;\n}\n\n.account__avatar {\n @include avatar-radius;\n position: relative;\n\n &-inline {\n display: inline-block;\n vertical-align: middle;\n margin-right: 5px;\n }\n\n &-composite {\n @include avatar-radius;\n border-radius: 50%;\n overflow: hidden;\n position: relative;\n cursor: default;\n\n & > div {\n float: left;\n position: relative;\n box-sizing: border-box;\n }\n\n &__label {\n display: block;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n color: $primary-text-color;\n text-shadow: 1px 1px 2px $base-shadow-color;\n font-weight: 700;\n font-size: 15px;\n }\n }\n}\n\na .account__avatar {\n cursor: pointer;\n}\n\n.account__avatar-overlay {\n @include avatar-size(48px);\n\n &-base {\n @include avatar-radius;\n @include avatar-size(36px);\n }\n\n &-overlay {\n @include avatar-radius;\n @include avatar-size(24px);\n\n position: absolute;\n bottom: 0;\n right: 0;\n z-index: 1;\n }\n}\n\n.account__relationship {\n height: 18px;\n padding: 10px;\n white-space: nowrap;\n}\n\n.account__disclaimer {\n padding: 10px;\n border-top: 1px solid lighten($ui-base-color, 8%);\n color: $dark-text-color;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n font-weight: 500;\n color: inherit;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n}\n\n.account__action-bar {\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n line-height: 36px;\n overflow: hidden;\n flex: 0 0 auto;\n display: flex;\n}\n\n.account__action-bar-dropdown {\n padding: 10px;\n\n .icon-button {\n vertical-align: middle;\n }\n\n .dropdown--active {\n .dropdown__content.dropdown__right {\n left: 6px;\n right: initial;\n }\n\n &::after {\n bottom: initial;\n margin-left: 11px;\n margin-top: -7px;\n right: initial;\n }\n }\n}\n\n.account__action-bar-links {\n display: flex;\n flex: 1 1 auto;\n line-height: 18px;\n text-align: center;\n}\n\n.account__action-bar__tab {\n text-decoration: none;\n overflow: hidden;\n flex: 0 1 100%;\n border-right: 1px solid lighten($ui-base-color, 8%);\n padding: 10px 0;\n border-bottom: 4px solid transparent;\n\n &.active {\n border-bottom: 4px solid $ui-highlight-color;\n }\n\n & > span {\n display: block;\n font-size: 12px;\n color: $darker-text-color;\n }\n\n strong {\n display: block;\n font-size: 15px;\n font-weight: 500;\n color: $primary-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n}\n\n.account-authorize {\n padding: 14px 10px;\n\n .detailed-status__display-name {\n display: block;\n margin-bottom: 15px;\n overflow: hidden;\n }\n}\n\n.account-authorize__avatar {\n float: left;\n margin-right: 10px;\n}\n\n.status__display-name,\n.status__relative-time,\n.detailed-status__display-name,\n.detailed-status__datetime,\n.detailed-status__application,\n.account__display-name {\n text-decoration: none;\n}\n\n.status__display-name,\n.account__display-name {\n strong {\n color: $primary-text-color;\n }\n}\n\n.muted {\n .emojione {\n opacity: 0.5;\n }\n}\n\n.status__display-name,\n.reply-indicator__display-name,\n.detailed-status__display-name,\na.account__display-name {\n &:hover strong {\n text-decoration: underline;\n }\n}\n\n.account__display-name strong {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.detailed-status__application,\n.detailed-status__datetime {\n color: inherit;\n}\n\n.detailed-status .button.logo-button {\n margin-bottom: 15px;\n}\n\n.detailed-status__display-name {\n color: $secondary-text-color;\n display: block;\n line-height: 24px;\n margin-bottom: 15px;\n overflow: hidden;\n\n strong,\n span {\n display: block;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n strong {\n font-size: 16px;\n color: $primary-text-color;\n }\n}\n\n.detailed-status__display-avatar {\n float: left;\n margin-right: 10px;\n}\n\n.status__avatar {\n height: 48px;\n left: 10px;\n position: absolute;\n top: 10px;\n width: 48px;\n}\n\n.status__expand {\n width: 68px;\n position: absolute;\n left: 0;\n top: 0;\n height: 100%;\n cursor: pointer;\n}\n\n.muted {\n .status__content,\n .status__content p,\n .status__content a {\n color: $dark-text-color;\n }\n\n .status__display-name strong {\n color: $dark-text-color;\n }\n\n .status__avatar {\n opacity: 0.5;\n }\n\n a.status__content__spoiler-link {\n background: $ui-base-lighter-color;\n color: $inverted-text-color;\n\n &:hover {\n background: lighten($ui-base-lighter-color, 7%);\n text-decoration: none;\n }\n }\n}\n\n.notification__message {\n margin: 0 10px 0 68px;\n padding: 8px 0 0;\n cursor: default;\n color: $darker-text-color;\n font-size: 15px;\n line-height: 22px;\n position: relative;\n\n .fa {\n color: $highlight-text-color;\n }\n\n > span {\n display: inline;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.notification__favourite-icon-wrapper {\n left: -26px;\n position: absolute;\n\n .star-icon {\n color: $gold-star;\n }\n}\n\n.star-icon.active {\n color: $gold-star;\n}\n\n.bookmark-icon.active {\n color: $red-bookmark;\n}\n\n.no-reduce-motion .icon-button.star-icon {\n &.activate {\n & > .fa-star {\n animation: spring-rotate-in 1s linear;\n }\n }\n\n &.deactivate {\n & > .fa-star {\n animation: spring-rotate-out 1s linear;\n }\n }\n}\n\n.notification__display-name {\n color: inherit;\n font-weight: 500;\n text-decoration: none;\n\n &:hover {\n color: $primary-text-color;\n text-decoration: underline;\n }\n}\n\n.notification__relative_time {\n float: right;\n}\n\n.display-name {\n display: block;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.display-name__html {\n font-weight: 500;\n}\n\n.display-name__account {\n font-size: 14px;\n}\n\n.status__relative-time,\n.detailed-status__datetime {\n &:hover {\n text-decoration: underline;\n }\n}\n\n.image-loader {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n\n .image-loader__preview-canvas {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n background: url('~images/void.png') repeat;\n object-fit: contain;\n }\n\n .loading-bar {\n position: relative;\n }\n\n &.image-loader--amorphous .image-loader__preview-canvas {\n display: none;\n }\n}\n\n.zoomable-image {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n img {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n width: auto;\n height: auto;\n object-fit: contain;\n }\n}\n\n.navigation-bar {\n padding: 10px;\n display: flex;\n align-items: center;\n flex-shrink: 0;\n cursor: default;\n color: $darker-text-color;\n\n strong {\n color: $secondary-text-color;\n }\n\n a {\n color: inherit;\n }\n\n .permalink {\n text-decoration: none;\n }\n\n .navigation-bar__actions {\n position: relative;\n\n .icon-button.close {\n position: absolute;\n pointer-events: none;\n transform: scale(0, 1) translate(-100%, 0);\n opacity: 0;\n }\n\n .compose__action-bar .icon-button {\n pointer-events: auto;\n transform: scale(1, 1) translate(0, 0);\n opacity: 1;\n }\n }\n}\n\n.navigation-bar__profile {\n flex: 1 1 auto;\n margin-left: 8px;\n line-height: 20px;\n margin-top: -1px;\n overflow: hidden;\n}\n\n.navigation-bar__profile-account {\n display: block;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.navigation-bar__profile-edit {\n color: inherit;\n text-decoration: none;\n}\n\n.dropdown {\n display: inline-block;\n}\n\n.dropdown__content {\n display: none;\n position: absolute;\n}\n\n.dropdown-menu__separator {\n border-bottom: 1px solid darken($ui-secondary-color, 8%);\n margin: 5px 7px 6px;\n height: 0;\n}\n\n.dropdown-menu {\n background: $ui-secondary-color;\n padding: 4px 0;\n border-radius: 4px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n z-index: 9999;\n\n ul {\n list-style: none;\n }\n\n &.left {\n transform-origin: 100% 50%;\n }\n\n &.top {\n transform-origin: 50% 100%;\n }\n\n &.bottom {\n transform-origin: 50% 0;\n }\n\n &.right {\n transform-origin: 0 50%;\n }\n}\n\n.dropdown-menu__arrow {\n position: absolute;\n width: 0;\n height: 0;\n border: 0 solid transparent;\n\n &.left {\n right: -5px;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: $ui-secondary-color;\n }\n\n &.top {\n bottom: -5px;\n margin-left: -7px;\n border-width: 5px 7px 0;\n border-top-color: $ui-secondary-color;\n }\n\n &.bottom {\n top: -5px;\n margin-left: -7px;\n border-width: 0 7px 5px;\n border-bottom-color: $ui-secondary-color;\n }\n\n &.right {\n left: -5px;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: $ui-secondary-color;\n }\n}\n\n.dropdown-menu__item {\n a {\n font-size: 13px;\n line-height: 18px;\n display: block;\n padding: 4px 14px;\n box-sizing: border-box;\n text-decoration: none;\n background: $ui-secondary-color;\n color: $inverted-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:focus,\n &:hover,\n &:active {\n background: $ui-highlight-color;\n color: $secondary-text-color;\n outline: 0;\n }\n }\n}\n\n.dropdown--active .dropdown__content {\n display: block;\n line-height: 18px;\n max-width: 311px;\n right: 0;\n text-align: left;\n z-index: 9999;\n\n & > ul {\n list-style: none;\n background: $ui-secondary-color;\n padding: 4px 0;\n border-radius: 4px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.4);\n min-width: 140px;\n position: relative;\n }\n\n &.dropdown__right {\n right: 0;\n }\n\n &.dropdown__left {\n & > ul {\n left: -98px;\n }\n }\n\n & > ul > li > a {\n font-size: 13px;\n line-height: 18px;\n display: block;\n padding: 4px 14px;\n box-sizing: border-box;\n text-decoration: none;\n background: $ui-secondary-color;\n color: $inverted-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:focus {\n outline: 0;\n }\n\n &:hover {\n background: $ui-highlight-color;\n color: $secondary-text-color;\n }\n }\n}\n\n.dropdown__icon {\n vertical-align: middle;\n}\n\n.columns-area {\n display: flex;\n flex: 1 1 auto;\n flex-direction: row;\n justify-content: flex-start;\n overflow-x: auto;\n position: relative;\n\n &.unscrollable {\n overflow-x: hidden;\n }\n\n &__panels {\n display: flex;\n justify-content: center;\n width: 100%;\n height: 100%;\n min-height: 100vh;\n\n &__pane {\n height: 100%;\n overflow: hidden;\n pointer-events: none;\n display: flex;\n justify-content: flex-end;\n min-width: 285px;\n\n &--start {\n justify-content: flex-start;\n }\n\n &__inner {\n position: fixed;\n width: 285px;\n pointer-events: auto;\n height: 100%;\n }\n }\n\n &__main {\n box-sizing: border-box;\n width: 100%;\n max-width: 600px;\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding: 0 10px;\n }\n }\n }\n}\n\n.tabs-bar__wrapper {\n background: darken($ui-base-color, 8%);\n position: sticky;\n top: 0;\n z-index: 2;\n padding-top: 0;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding-top: 10px;\n }\n\n .tabs-bar {\n margin-bottom: 0;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n margin-bottom: 10px;\n }\n }\n}\n\n.react-swipeable-view-container {\n &,\n .columns-area,\n .drawer,\n .column {\n height: 100%;\n }\n}\n\n.react-swipeable-view-container > * {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n}\n\n.column {\n width: 350px;\n position: relative;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n\n > .scrollable {\n background: $ui-base-color;\n border-bottom-left-radius: 2px;\n border-bottom-right-radius: 2px;\n }\n}\n\n.ui {\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n}\n\n.drawer {\n width: 330px;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n overflow-y: hidden;\n}\n\n.drawer__tab {\n display: block;\n flex: 1 1 auto;\n padding: 15px 5px 13px;\n color: $darker-text-color;\n text-decoration: none;\n text-align: center;\n font-size: 16px;\n border-bottom: 2px solid transparent;\n}\n\n.column,\n.drawer {\n flex: 1 1 auto;\n overflow: hidden;\n}\n\n@media screen and (min-width: 631px) {\n .columns-area {\n padding: 0;\n }\n\n .column,\n .drawer {\n flex: 0 0 auto;\n padding: 10px;\n padding-left: 5px;\n padding-right: 5px;\n\n &:first-child {\n padding-left: 10px;\n }\n\n &:last-child {\n padding-right: 10px;\n }\n }\n\n .columns-area > div {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n }\n }\n}\n\n.tabs-bar {\n box-sizing: border-box;\n display: flex;\n background: lighten($ui-base-color, 8%);\n flex: 0 0 auto;\n overflow-y: auto;\n}\n\n.tabs-bar__link {\n display: block;\n flex: 1 1 auto;\n padding: 15px 10px;\n padding-bottom: 13px;\n color: $primary-text-color;\n text-decoration: none;\n text-align: center;\n font-size: 14px;\n font-weight: 500;\n border-bottom: 2px solid lighten($ui-base-color, 8%);\n transition: all 50ms linear;\n transition-property: border-bottom, background, color;\n\n .fa {\n font-weight: 400;\n font-size: 16px;\n }\n\n &:hover,\n &:focus,\n &:active {\n @media screen and (min-width: 631px) {\n background: lighten($ui-base-color, 14%);\n border-bottom-color: lighten($ui-base-color, 14%);\n }\n }\n\n &.active {\n border-bottom: 2px solid $highlight-text-color;\n color: $highlight-text-color;\n }\n\n span {\n margin-left: 5px;\n display: none;\n }\n}\n\n@media screen and (min-width: 600px) {\n .tabs-bar__link {\n span {\n display: inline;\n }\n }\n}\n\n.columns-area--mobile {\n flex-direction: column;\n width: 100%;\n height: 100%;\n margin: 0 auto;\n\n .column,\n .drawer {\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .directory__list {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: block;\n }\n }\n\n .directory__card {\n margin-bottom: 0;\n }\n\n .filter-form {\n display: flex;\n }\n\n .autosuggest-textarea__textarea {\n font-size: 16px;\n }\n\n .search__input {\n line-height: 18px;\n font-size: 16px;\n padding: 15px;\n padding-right: 30px;\n }\n\n .search__icon .fa {\n top: 15px;\n }\n\n .scrollable {\n overflow: visible;\n\n @supports(display: grid) {\n contain: content;\n }\n }\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding: 10px 0;\n padding-top: 0;\n }\n\n @media screen and (min-width: 630px) {\n .detailed-status {\n padding: 15px;\n\n .media-gallery,\n .video-player,\n .audio-player {\n margin-top: 15px;\n }\n }\n\n .account__header__bar {\n padding: 5px 10px;\n }\n\n .navigation-bar,\n .compose-form {\n padding: 15px;\n }\n\n .compose-form .compose-form__publish .compose-form__publish-button-wrapper {\n padding-top: 15px;\n }\n\n .status {\n padding: 15px 15px 15px (48px + 15px * 2);\n min-height: 48px + 2px;\n\n &__avatar {\n left: 15px;\n top: 17px;\n }\n\n &__content {\n padding-top: 5px;\n }\n\n &__prepend {\n margin-left: 48px + 15px * 2;\n padding-top: 15px;\n }\n\n &__prepend-icon-wrapper {\n left: -32px;\n }\n\n .media-gallery,\n &__action-bar,\n .video-player,\n .audio-player {\n margin-top: 10px;\n }\n }\n\n .account {\n padding: 15px 10px;\n\n &__header__bio {\n margin: 0 -10px;\n }\n }\n\n .notification {\n &__message {\n margin-left: 48px + 15px * 2;\n padding-top: 15px;\n }\n\n &__favourite-icon-wrapper {\n left: -32px;\n }\n\n .status {\n padding-top: 8px;\n }\n\n .account {\n padding-top: 8px;\n }\n\n .account__avatar-wrapper {\n margin-left: 17px;\n margin-right: 15px;\n }\n }\n }\n}\n\n.floating-action-button {\n position: fixed;\n display: flex;\n justify-content: center;\n align-items: center;\n width: 3.9375rem;\n height: 3.9375rem;\n bottom: 1.3125rem;\n right: 1.3125rem;\n background: darken($ui-highlight-color, 3%);\n color: $white;\n border-radius: 50%;\n font-size: 21px;\n line-height: 21px;\n text-decoration: none;\n box-shadow: 2px 3px 9px rgba($base-shadow-color, 0.4);\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-highlight-color, 7%);\n }\n}\n\n@media screen and (min-width: $no-gap-breakpoint) {\n .tabs-bar {\n width: 100%;\n }\n\n .react-swipeable-view-container .columns-area--mobile {\n height: calc(100% - 10px) !important;\n }\n\n .getting-started__wrapper,\n .getting-started__trends,\n .search {\n margin-bottom: 10px;\n }\n\n .getting-started__panel {\n margin: 10px 0;\n }\n\n .column,\n .drawer {\n min-width: 330px;\n }\n}\n\n@media screen and (max-width: 600px + (285px * 1) + (10px * 1)) {\n .columns-area__panels__pane--compositional {\n display: none;\n }\n}\n\n@media screen and (min-width: 600px + (285px * 1) + (10px * 1)) {\n .floating-action-button,\n .tabs-bar__link.optional {\n display: none;\n }\n\n .search-page .search {\n display: none;\n }\n}\n\n@media screen and (max-width: 600px + (285px * 2) + (10px * 2)) {\n .columns-area__panels__pane--navigational {\n display: none;\n }\n}\n\n@media screen and (min-width: 600px + (285px * 2) + (10px * 2)) {\n .tabs-bar {\n display: none;\n }\n}\n\n.icon-with-badge {\n position: relative;\n\n &__badge {\n position: absolute;\n left: 9px;\n top: -13px;\n background: $ui-highlight-color;\n border: 2px solid lighten($ui-base-color, 8%);\n padding: 1px 6px;\n border-radius: 6px;\n font-size: 10px;\n font-weight: 500;\n line-height: 14px;\n color: $primary-text-color;\n }\n}\n\n.column-link--transparent .icon-with-badge__badge {\n border-color: darken($ui-base-color, 8%);\n}\n\n.compose-panel {\n width: 285px;\n margin-top: 10px;\n display: flex;\n flex-direction: column;\n height: calc(100% - 10px);\n overflow-y: hidden;\n\n .navigation-bar {\n padding-top: 20px;\n padding-bottom: 20px;\n flex: 0 1 48px;\n min-height: 20px;\n }\n\n .flex-spacer {\n background: transparent;\n }\n\n .compose-form {\n flex: 1;\n overflow-y: hidden;\n display: flex;\n flex-direction: column;\n min-height: 310px;\n padding-bottom: 71px;\n margin-bottom: -71px;\n }\n\n .compose-form__autosuggest-wrapper {\n overflow-y: auto;\n background-color: $white;\n border-radius: 4px 4px 0 0;\n flex: 0 1 auto;\n }\n\n .autosuggest-textarea__textarea {\n overflow-y: hidden;\n }\n\n .compose-form__upload-thumbnail {\n height: 80px;\n }\n}\n\n.navigation-panel {\n margin-top: 10px;\n margin-bottom: 10px;\n height: calc(100% - 20px);\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n\n & > a {\n flex: 0 0 auto;\n }\n\n hr {\n flex: 0 0 auto;\n border: 0;\n background: transparent;\n border-top: 1px solid lighten($ui-base-color, 4%);\n margin: 10px 0;\n }\n\n .flex-spacer {\n background: transparent;\n }\n}\n\n.drawer__pager {\n box-sizing: border-box;\n padding: 0;\n flex-grow: 1;\n position: relative;\n overflow: hidden;\n display: flex;\n}\n\n.drawer__inner {\n position: absolute;\n top: 0;\n left: 0;\n background: lighten($ui-base-color, 13%);\n box-sizing: border-box;\n padding: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n overflow-y: auto;\n width: 100%;\n height: 100%;\n border-radius: 2px;\n\n &.darker {\n background: $ui-base-color;\n }\n}\n\n.drawer__inner__mastodon {\n background: lighten($ui-base-color, 13%) url('data:image/svg+xml;utf8,') no-repeat bottom / 100% auto;\n flex: 1;\n min-height: 47px;\n display: none;\n\n > img {\n display: block;\n object-fit: contain;\n object-position: bottom left;\n width: 100%;\n height: 100%;\n pointer-events: none;\n user-drag: none;\n user-select: none;\n }\n\n @media screen and (min-height: 640px) {\n display: block;\n }\n}\n\n.pseudo-drawer {\n background: lighten($ui-base-color, 13%);\n font-size: 13px;\n text-align: left;\n}\n\n.drawer__header {\n flex: 0 0 auto;\n font-size: 16px;\n background: lighten($ui-base-color, 8%);\n margin-bottom: 10px;\n display: flex;\n flex-direction: row;\n border-radius: 2px;\n\n a {\n transition: background 100ms ease-in;\n\n &:hover {\n background: lighten($ui-base-color, 3%);\n transition: background 200ms ease-out;\n }\n }\n}\n\n.scrollable {\n overflow-y: scroll;\n overflow-x: hidden;\n flex: 1 1 auto;\n -webkit-overflow-scrolling: touch;\n\n &.optionally-scrollable {\n overflow-y: auto;\n }\n\n @supports(display: grid) { // hack to fix Chrome <57\n contain: strict;\n }\n\n &--flex {\n display: flex;\n flex-direction: column;\n }\n\n &__append {\n flex: 1 1 auto;\n position: relative;\n min-height: 120px;\n }\n}\n\n.scrollable.fullscreen {\n @supports(display: grid) { // hack to fix Chrome <57\n contain: none;\n }\n}\n\n.column-back-button {\n box-sizing: border-box;\n width: 100%;\n background: lighten($ui-base-color, 4%);\n color: $highlight-text-color;\n cursor: pointer;\n flex: 0 0 auto;\n font-size: 16px;\n line-height: inherit;\n border: 0;\n text-align: unset;\n padding: 15px;\n margin: 0;\n z-index: 3;\n outline: 0;\n\n &:hover {\n text-decoration: underline;\n }\n}\n\n.column-header__back-button {\n background: lighten($ui-base-color, 4%);\n border: 0;\n font-family: inherit;\n color: $highlight-text-color;\n cursor: pointer;\n white-space: nowrap;\n font-size: 16px;\n padding: 0 5px 0 0;\n z-index: 3;\n\n &:hover {\n text-decoration: underline;\n }\n\n &:last-child {\n padding: 0 15px 0 0;\n }\n}\n\n.column-back-button__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.column-back-button--slim {\n position: relative;\n}\n\n.column-back-button--slim-button {\n cursor: pointer;\n flex: 0 0 auto;\n font-size: 16px;\n padding: 15px;\n position: absolute;\n right: 0;\n top: -48px;\n}\n\n.react-toggle {\n display: inline-block;\n position: relative;\n cursor: pointer;\n background-color: transparent;\n border: 0;\n padding: 0;\n user-select: none;\n -webkit-tap-highlight-color: rgba($base-overlay-background, 0);\n -webkit-tap-highlight-color: transparent;\n}\n\n.react-toggle-screenreader-only {\n border: 0;\n clip: rect(0 0 0 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n}\n\n.react-toggle--disabled {\n cursor: not-allowed;\n opacity: 0.5;\n transition: opacity 0.25s;\n}\n\n.react-toggle-track {\n width: 50px;\n height: 24px;\n padding: 0;\n border-radius: 30px;\n background-color: $ui-base-color;\n transition: background-color 0.2s ease;\n}\n\n.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track {\n background-color: darken($ui-base-color, 10%);\n}\n\n.react-toggle--checked .react-toggle-track {\n background-color: $ui-highlight-color;\n}\n\n.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track {\n background-color: lighten($ui-highlight-color, 10%);\n}\n\n.react-toggle-track-check {\n position: absolute;\n width: 14px;\n height: 10px;\n top: 0;\n bottom: 0;\n margin-top: auto;\n margin-bottom: auto;\n line-height: 0;\n left: 8px;\n opacity: 0;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle--checked .react-toggle-track-check {\n opacity: 1;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle-track-x {\n position: absolute;\n width: 10px;\n height: 10px;\n top: 0;\n bottom: 0;\n margin-top: auto;\n margin-bottom: auto;\n line-height: 0;\n right: 10px;\n opacity: 1;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle--checked .react-toggle-track-x {\n opacity: 0;\n}\n\n.react-toggle-thumb {\n position: absolute;\n top: 1px;\n left: 1px;\n width: 22px;\n height: 22px;\n border: 1px solid $ui-base-color;\n border-radius: 50%;\n background-color: darken($simple-background-color, 2%);\n box-sizing: border-box;\n transition: all 0.25s ease;\n transition-property: border-color, left;\n}\n\n.react-toggle--checked .react-toggle-thumb {\n left: 27px;\n border-color: $ui-highlight-color;\n}\n\n.column-link {\n background: lighten($ui-base-color, 8%);\n color: $primary-text-color;\n display: block;\n font-size: 16px;\n padding: 15px;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 11%);\n }\n\n &:focus {\n outline: 0;\n }\n\n &--transparent {\n background: transparent;\n color: $ui-secondary-color;\n\n &:hover,\n &:focus,\n &:active {\n background: transparent;\n color: $primary-text-color;\n }\n\n &.active {\n color: $ui-highlight-color;\n }\n }\n}\n\n.column-link__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.column-link__badge {\n display: inline-block;\n border-radius: 4px;\n font-size: 12px;\n line-height: 19px;\n font-weight: 500;\n background: $ui-base-color;\n padding: 4px 8px;\n margin: -6px 10px;\n}\n\n.column-subheading {\n background: $ui-base-color;\n color: $dark-text-color;\n padding: 8px 20px;\n font-size: 13px;\n font-weight: 500;\n cursor: default;\n}\n\n.getting-started__wrapper,\n.getting-started,\n.flex-spacer {\n background: $ui-base-color;\n}\n\n.flex-spacer {\n flex: 1 1 auto;\n}\n\n.getting-started {\n color: $dark-text-color;\n overflow: auto;\n border-bottom-left-radius: 2px;\n border-bottom-right-radius: 2px;\n\n &__wrapper,\n &__panel,\n &__footer {\n height: min-content;\n }\n\n &__panel,\n &__footer\n {\n padding: 10px;\n padding-top: 20px;\n flex-grow: 0;\n\n ul {\n margin-bottom: 10px;\n }\n\n ul li {\n display: inline;\n }\n\n p {\n font-size: 13px;\n\n a {\n color: $dark-text-color;\n text-decoration: underline;\n }\n }\n\n a {\n text-decoration: none;\n color: $darker-text-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n }\n\n &__wrapper,\n &__footer\n {\n color: $dark-text-color;\n }\n\n &__trends {\n flex: 0 1 auto;\n opacity: 1;\n animation: fade 150ms linear;\n margin-top: 10px;\n\n h4 {\n font-size: 13px;\n color: $darker-text-color;\n padding: 10px;\n font-weight: 500;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n @media screen and (max-height: 810px) {\n .trends__item:nth-child(3) {\n display: none;\n }\n }\n\n @media screen and (max-height: 720px) {\n .trends__item:nth-child(2) {\n display: none;\n }\n }\n\n @media screen and (max-height: 670px) {\n display: none;\n }\n\n .trends__item {\n border-bottom: 0;\n padding: 10px;\n\n &__current {\n color: $darker-text-color;\n }\n }\n }\n}\n\n.keyboard-shortcuts {\n padding: 8px 0 0;\n overflow: hidden;\n\n thead {\n position: absolute;\n left: -9999px;\n }\n\n td {\n padding: 0 10px 8px;\n }\n\n kbd {\n display: inline-block;\n padding: 3px 5px;\n background-color: lighten($ui-base-color, 8%);\n border: 1px solid darken($ui-base-color, 4%);\n }\n}\n\n.setting-text {\n display: block;\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n color: $inverted-text-color;\n background: $simple-background-color;\n padding: 10px;\n font-family: inherit;\n font-size: 14px;\n resize: vertical;\n border: 0;\n outline: 0;\n border-radius: 4px;\n\n &:focus {\n outline: 0;\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n}\n\n.no-reduce-motion button.icon-button i.fa-retweet {\n background-position: 0 0;\n height: 19px;\n transition: background-position 0.9s steps(10);\n transition-duration: 0s;\n vertical-align: middle;\n width: 22px;\n\n &::before {\n display: none !important;\n }\n\n}\n\n.no-reduce-motion button.icon-button.active i.fa-retweet {\n transition-duration: 0.9s;\n background-position: 0 100%;\n}\n\n.reduce-motion button.icon-button i.fa-retweet {\n color: $action-button-color;\n transition: color 100ms ease-in;\n}\n\n.reduce-motion button.icon-button.active i.fa-retweet {\n color: $highlight-text-color;\n}\n\n.status-card {\n display: flex;\n font-size: 14px;\n border: 1px solid lighten($ui-base-color, 8%);\n border-radius: 4px;\n color: $dark-text-color;\n margin-top: 14px;\n text-decoration: none;\n overflow: hidden;\n\n &__actions {\n bottom: 0;\n left: 0;\n position: absolute;\n right: 0;\n top: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n\n & > div {\n background: rgba($base-shadow-color, 0.6);\n border-radius: 8px;\n padding: 12px 9px;\n flex: 0 0 auto;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n button,\n a {\n display: inline;\n color: $secondary-text-color;\n background: transparent;\n border: 0;\n padding: 0 8px;\n text-decoration: none;\n font-size: 18px;\n line-height: 18px;\n\n &:hover,\n &:active,\n &:focus {\n color: $primary-text-color;\n }\n }\n\n a {\n font-size: 19px;\n position: relative;\n bottom: -1px;\n }\n }\n}\n\na.status-card {\n cursor: pointer;\n\n &:hover {\n background: lighten($ui-base-color, 8%);\n }\n}\n\n.status-card-photo {\n cursor: zoom-in;\n display: block;\n text-decoration: none;\n width: 100%;\n height: auto;\n margin: 0;\n}\n\n.status-card-video {\n iframe {\n width: 100%;\n height: 100%;\n }\n}\n\n.status-card__title {\n display: block;\n font-weight: 500;\n margin-bottom: 5px;\n color: $darker-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-decoration: none;\n}\n\n.status-card__content {\n flex: 1 1 auto;\n overflow: hidden;\n padding: 14px 14px 14px 8px;\n}\n\n.status-card__description {\n color: $darker-text-color;\n}\n\n.status-card__host {\n display: block;\n margin-top: 5px;\n font-size: 13px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.status-card__image {\n flex: 0 0 100px;\n background: lighten($ui-base-color, 8%);\n position: relative;\n\n & > .fa {\n font-size: 21px;\n position: absolute;\n transform-origin: 50% 50%;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n}\n\n.status-card.horizontal {\n display: block;\n\n .status-card__image {\n width: 100%;\n }\n\n .status-card__image-image {\n border-radius: 4px 4px 0 0;\n }\n\n .status-card__title {\n white-space: inherit;\n }\n}\n\n.status-card.compact {\n border-color: lighten($ui-base-color, 4%);\n\n &.interactive {\n border: 0;\n }\n\n .status-card__content {\n padding: 8px;\n padding-top: 10px;\n }\n\n .status-card__title {\n white-space: nowrap;\n }\n\n .status-card__image {\n flex: 0 0 60px;\n }\n}\n\na.status-card.compact:hover {\n background-color: lighten($ui-base-color, 4%);\n}\n\n.status-card__image-image {\n border-radius: 4px 0 0 4px;\n display: block;\n margin: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n background-size: cover;\n background-position: center center;\n}\n\n.load-more {\n display: block;\n color: $dark-text-color;\n background-color: transparent;\n border: 0;\n font-size: inherit;\n text-align: center;\n line-height: inherit;\n margin: 0;\n padding: 15px;\n box-sizing: border-box;\n width: 100%;\n clear: both;\n text-decoration: none;\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n}\n\n.load-gap {\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n}\n\n.regeneration-indicator {\n text-align: center;\n font-size: 16px;\n font-weight: 500;\n color: $dark-text-color;\n background: $ui-base-color;\n cursor: default;\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 20px;\n\n &__figure {\n &,\n img {\n display: block;\n width: auto;\n height: 160px;\n margin: 0;\n }\n }\n\n &--without-header {\n padding-top: 20px + 48px;\n }\n\n &__label {\n margin-top: 30px;\n\n strong {\n display: block;\n margin-bottom: 10px;\n color: $dark-text-color;\n }\n\n span {\n font-size: 15px;\n font-weight: 400;\n }\n }\n}\n\n.column-header__wrapper {\n position: relative;\n flex: 0 0 auto;\n\n &.active {\n &::before {\n display: block;\n content: \"\";\n position: absolute;\n top: 35px;\n left: 0;\n right: 0;\n margin: 0 auto;\n width: 60%;\n pointer-events: none;\n height: 28px;\n z-index: 1;\n background: radial-gradient(ellipse, rgba($ui-highlight-color, 0.23) 0%, rgba($ui-highlight-color, 0) 60%);\n }\n }\n}\n\n.column-header {\n display: flex;\n font-size: 16px;\n background: lighten($ui-base-color, 4%);\n flex: 0 0 auto;\n cursor: pointer;\n position: relative;\n z-index: 2;\n outline: 0;\n overflow: hidden;\n border-top-left-radius: 2px;\n border-top-right-radius: 2px;\n\n & > button {\n margin: 0;\n border: 0;\n padding: 15px 0 15px 15px;\n color: inherit;\n background: transparent;\n font: inherit;\n text-align: left;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n flex: 1;\n }\n\n & > .column-header__back-button {\n color: $highlight-text-color;\n }\n\n &.active {\n box-shadow: 0 1px 0 rgba($highlight-text-color, 0.3);\n\n .column-header__icon {\n color: $highlight-text-color;\n text-shadow: 0 0 10px rgba($highlight-text-color, 0.4);\n }\n }\n\n &:focus,\n &:active {\n outline: 0;\n }\n}\n\n.column-header__buttons {\n height: 48px;\n display: flex;\n}\n\n.column-header__links {\n margin-bottom: 14px;\n}\n\n.column-header__links .text-btn {\n margin-right: 10px;\n}\n\n.column-header__button {\n background: lighten($ui-base-color, 4%);\n border: 0;\n color: $darker-text-color;\n cursor: pointer;\n font-size: 16px;\n padding: 0 15px;\n\n &:hover {\n color: lighten($darker-text-color, 7%);\n }\n\n &.active {\n color: $primary-text-color;\n background: lighten($ui-base-color, 8%);\n\n &:hover {\n color: $primary-text-color;\n background: lighten($ui-base-color, 8%);\n }\n }\n}\n\n.column-header__collapsible {\n max-height: 70vh;\n overflow: hidden;\n overflow-y: auto;\n color: $darker-text-color;\n transition: max-height 150ms ease-in-out, opacity 300ms linear;\n opacity: 1;\n\n &.collapsed {\n max-height: 0;\n opacity: 0.5;\n }\n\n &.animating {\n overflow-y: hidden;\n }\n\n hr {\n height: 0;\n background: transparent;\n border: 0;\n border-top: 1px solid lighten($ui-base-color, 12%);\n margin: 10px 0;\n }\n}\n\n.column-header__collapsible-inner {\n background: lighten($ui-base-color, 8%);\n padding: 15px;\n}\n\n.column-header__setting-btn {\n &:hover {\n color: $darker-text-color;\n text-decoration: underline;\n }\n}\n\n.column-header__setting-arrows {\n float: right;\n\n .column-header__setting-btn {\n padding: 0 10px;\n\n &:last-child {\n padding-right: 0;\n }\n }\n}\n\n.text-btn {\n display: inline-block;\n padding: 0;\n font-family: inherit;\n font-size: inherit;\n color: inherit;\n border: 0;\n background: transparent;\n cursor: pointer;\n}\n\n.column-header__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.loading-indicator {\n color: $dark-text-color;\n font-size: 13px;\n font-weight: 400;\n overflow: visible;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n\n span {\n display: block;\n float: left;\n margin-left: 50%;\n transform: translateX(-50%);\n margin: 82px 0 0 50%;\n white-space: nowrap;\n }\n}\n\n.loading-indicator__figure {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 42px;\n height: 42px;\n box-sizing: border-box;\n background-color: transparent;\n border: 0 solid lighten($ui-base-color, 26%);\n border-width: 6px;\n border-radius: 50%;\n}\n\n.no-reduce-motion .loading-indicator span {\n animation: loader-label 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1);\n}\n\n.no-reduce-motion .loading-indicator__figure {\n animation: loader-figure 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1);\n}\n\n@keyframes spring-rotate-in {\n 0% {\n transform: rotate(0deg);\n }\n\n 30% {\n transform: rotate(-484.8deg);\n }\n\n 60% {\n transform: rotate(-316.7deg);\n }\n\n 90% {\n transform: rotate(-375deg);\n }\n\n 100% {\n transform: rotate(-360deg);\n }\n}\n\n@keyframes spring-rotate-out {\n 0% {\n transform: rotate(-360deg);\n }\n\n 30% {\n transform: rotate(124.8deg);\n }\n\n 60% {\n transform: rotate(-43.27deg);\n }\n\n 90% {\n transform: rotate(15deg);\n }\n\n 100% {\n transform: rotate(0deg);\n }\n}\n\n@keyframes loader-figure {\n 0% {\n width: 0;\n height: 0;\n background-color: lighten($ui-base-color, 26%);\n }\n\n 29% {\n background-color: lighten($ui-base-color, 26%);\n }\n\n 30% {\n width: 42px;\n height: 42px;\n background-color: transparent;\n border-width: 21px;\n opacity: 1;\n }\n\n 100% {\n width: 42px;\n height: 42px;\n border-width: 0;\n opacity: 0;\n background-color: transparent;\n }\n}\n\n@keyframes loader-label {\n 0% { opacity: 0.25; }\n 30% { opacity: 1; }\n 100% { opacity: 0.25; }\n}\n\n.video-error-cover {\n align-items: center;\n background: $base-overlay-background;\n color: $primary-text-color;\n cursor: pointer;\n display: flex;\n flex-direction: column;\n height: 100%;\n justify-content: center;\n margin-top: 8px;\n position: relative;\n text-align: center;\n z-index: 100;\n}\n\n.media-spoiler {\n background: $base-overlay-background;\n color: $darker-text-color;\n border: 0;\n padding: 0;\n width: 100%;\n height: 100%;\n border-radius: 4px;\n appearance: none;\n\n &:hover,\n &:active,\n &:focus {\n padding: 0;\n color: lighten($darker-text-color, 8%);\n }\n}\n\n.media-spoiler__warning {\n display: block;\n font-size: 14px;\n}\n\n.media-spoiler__trigger {\n display: block;\n font-size: 11px;\n font-weight: 700;\n}\n\n.spoiler-button {\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n position: absolute;\n z-index: 100;\n\n &--minified {\n display: block;\n left: 4px;\n top: 4px;\n width: auto;\n height: auto;\n }\n\n &--click-thru {\n pointer-events: none;\n }\n\n &--hidden {\n display: none;\n }\n\n &__overlay {\n display: block;\n background: transparent;\n width: 100%;\n height: 100%;\n border: 0;\n\n &__label {\n display: inline-block;\n background: rgba($base-overlay-background, 0.5);\n border-radius: 8px;\n padding: 8px 12px;\n color: $primary-text-color;\n font-weight: 500;\n font-size: 14px;\n }\n\n &:hover,\n &:focus,\n &:active {\n .spoiler-button__overlay__label {\n background: rgba($base-overlay-background, 0.8);\n }\n }\n\n &:disabled {\n .spoiler-button__overlay__label {\n background: rgba($base-overlay-background, 0.5);\n }\n }\n }\n}\n\n.modal-container--preloader {\n background: lighten($ui-base-color, 8%);\n}\n\n.account--panel {\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: row;\n padding: 10px 0;\n}\n\n.account--panel__button,\n.detailed-status__button {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.column-settings__outer {\n background: lighten($ui-base-color, 8%);\n padding: 15px;\n}\n\n.column-settings__section {\n color: $darker-text-color;\n cursor: default;\n display: block;\n font-weight: 500;\n margin-bottom: 10px;\n}\n\n.column-settings__hashtags {\n .column-settings__row {\n margin-bottom: 15px;\n }\n\n .column-select {\n &__control {\n @include search-input;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n &__placeholder {\n color: $dark-text-color;\n padding-left: 2px;\n font-size: 12px;\n }\n\n &__value-container {\n padding-left: 6px;\n }\n\n &__multi-value {\n background: lighten($ui-base-color, 8%);\n\n &__remove {\n cursor: pointer;\n\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 12%);\n color: lighten($darker-text-color, 4%);\n }\n }\n }\n\n &__multi-value__label,\n &__input {\n color: $darker-text-color;\n }\n\n &__clear-indicator,\n &__dropdown-indicator {\n cursor: pointer;\n transition: none;\n color: $dark-text-color;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($dark-text-color, 4%);\n }\n }\n\n &__indicator-separator {\n background-color: lighten($ui-base-color, 8%);\n }\n\n &__menu {\n @include search-popout;\n padding: 0;\n background: $ui-secondary-color;\n }\n\n &__menu-list {\n padding: 6px;\n }\n\n &__option {\n color: $inverted-text-color;\n border-radius: 4px;\n font-size: 14px;\n\n &--is-focused,\n &--is-selected {\n background: darken($ui-secondary-color, 10%);\n }\n }\n }\n}\n\n.column-settings__row {\n .text-btn {\n margin-bottom: 15px;\n }\n}\n\n.relationship-tag {\n color: $primary-text-color;\n margin-bottom: 4px;\n display: block;\n vertical-align: top;\n background-color: $base-overlay-background;\n font-size: 12px;\n font-weight: 500;\n padding: 4px;\n border-radius: 4px;\n opacity: 0.7;\n\n &:hover {\n opacity: 1;\n }\n}\n\n.setting-toggle {\n display: block;\n line-height: 24px;\n}\n\n.setting-toggle__label {\n color: $darker-text-color;\n display: inline-block;\n margin-bottom: 14px;\n margin-left: 8px;\n vertical-align: middle;\n}\n\n.empty-column-indicator,\n.error-column {\n color: $dark-text-color;\n background: $ui-base-color;\n text-align: center;\n padding: 20px;\n font-size: 15px;\n font-weight: 400;\n cursor: default;\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n justify-content: center;\n\n @supports(display: grid) { // hack to fix Chrome <57\n contain: strict;\n }\n\n & > span {\n max-width: 400px;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.error-column {\n flex-direction: column;\n}\n\n@keyframes heartbeat {\n from {\n transform: scale(1);\n animation-timing-function: ease-out;\n }\n\n 10% {\n transform: scale(0.91);\n animation-timing-function: ease-in;\n }\n\n 17% {\n transform: scale(0.98);\n animation-timing-function: ease-out;\n }\n\n 33% {\n transform: scale(0.87);\n animation-timing-function: ease-in;\n }\n\n 45% {\n transform: scale(1);\n animation-timing-function: ease-out;\n }\n}\n\n.no-reduce-motion .pulse-loading {\n transform-origin: center center;\n animation: heartbeat 1.5s ease-in-out infinite both;\n}\n\n@keyframes shake-bottom {\n 0%,\n 100% {\n transform: rotate(0deg);\n transform-origin: 50% 100%;\n }\n\n 10% {\n transform: rotate(2deg);\n }\n\n 20%,\n 40%,\n 60% {\n transform: rotate(-4deg);\n }\n\n 30%,\n 50%,\n 70% {\n transform: rotate(4deg);\n }\n\n 80% {\n transform: rotate(-2deg);\n }\n\n 90% {\n transform: rotate(2deg);\n }\n}\n\n.no-reduce-motion .shake-bottom {\n transform-origin: 50% 100%;\n animation: shake-bottom 0.8s cubic-bezier(0.455, 0.03, 0.515, 0.955) 2s 2 both;\n}\n\n.emoji-picker-dropdown__menu {\n background: $simple-background-color;\n position: absolute;\n box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n margin-top: 5px;\n z-index: 2;\n\n .emoji-mart-scroll {\n transition: opacity 200ms ease;\n }\n\n &.selecting .emoji-mart-scroll {\n opacity: 0.5;\n }\n}\n\n.emoji-picker-dropdown__modifiers {\n position: absolute;\n top: 60px;\n right: 11px;\n cursor: pointer;\n}\n\n.emoji-picker-dropdown__modifiers__menu {\n position: absolute;\n z-index: 4;\n top: -4px;\n left: -8px;\n background: $simple-background-color;\n border-radius: 4px;\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n overflow: hidden;\n\n button {\n display: block;\n cursor: pointer;\n border: 0;\n padding: 4px 8px;\n background: transparent;\n\n &:hover,\n &:focus,\n &:active {\n background: rgba($ui-secondary-color, 0.4);\n }\n }\n\n .emoji-mart-emoji {\n height: 22px;\n }\n}\n\n.emoji-mart-emoji {\n span {\n background-repeat: no-repeat;\n }\n}\n\n.upload-area {\n align-items: center;\n background: rgba($base-overlay-background, 0.8);\n display: flex;\n height: 100%;\n justify-content: center;\n left: 0;\n opacity: 0;\n position: absolute;\n top: 0;\n visibility: hidden;\n width: 100%;\n z-index: 2000;\n\n * {\n pointer-events: none;\n }\n}\n\n.upload-area__drop {\n width: 320px;\n height: 160px;\n display: flex;\n box-sizing: border-box;\n position: relative;\n padding: 8px;\n}\n\n.upload-area__background {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: -1;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 5px rgba($base-shadow-color, 0.2);\n}\n\n.upload-area__content {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: $secondary-text-color;\n font-size: 18px;\n font-weight: 500;\n border: 2px dashed $ui-base-lighter-color;\n border-radius: 4px;\n}\n\n.upload-progress {\n padding: 10px;\n color: $lighter-text-color;\n overflow: hidden;\n display: flex;\n\n .fa {\n font-size: 34px;\n margin-right: 10px;\n }\n\n span {\n font-size: 13px;\n font-weight: 500;\n display: block;\n }\n}\n\n.upload-progess__message {\n flex: 1 1 auto;\n}\n\n.upload-progress__backdrop {\n width: 100%;\n height: 6px;\n border-radius: 6px;\n background: $ui-base-lighter-color;\n position: relative;\n margin-top: 5px;\n}\n\n.upload-progress__tracker {\n position: absolute;\n left: 0;\n top: 0;\n height: 6px;\n background: $ui-highlight-color;\n border-radius: 6px;\n}\n\n.emoji-button {\n display: block;\n font-size: 24px;\n line-height: 24px;\n margin-left: 2px;\n width: 24px;\n outline: 0;\n cursor: pointer;\n\n &:active,\n &:focus {\n outline: 0 !important;\n }\n\n img {\n filter: grayscale(100%);\n opacity: 0.8;\n display: block;\n margin: 0;\n width: 22px;\n height: 22px;\n margin-top: 2px;\n }\n\n &:hover,\n &:active,\n &:focus {\n img {\n opacity: 1;\n filter: none;\n }\n }\n}\n\n.dropdown--active .emoji-button img {\n opacity: 1;\n filter: none;\n}\n\n.privacy-dropdown__dropdown {\n position: absolute;\n background: $simple-background-color;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n margin-left: 40px;\n overflow: hidden;\n\n &.top {\n transform-origin: 50% 100%;\n }\n\n &.bottom {\n transform-origin: 50% 0;\n }\n}\n\n.privacy-dropdown__option {\n color: $inverted-text-color;\n padding: 10px;\n cursor: pointer;\n display: flex;\n\n &:hover,\n &.active {\n background: $ui-highlight-color;\n color: $primary-text-color;\n outline: 0;\n\n .privacy-dropdown__option__content {\n color: $primary-text-color;\n\n strong {\n color: $primary-text-color;\n }\n }\n }\n\n &.active:hover {\n background: lighten($ui-highlight-color, 4%);\n }\n}\n\n.privacy-dropdown__option__icon {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 10px;\n}\n\n.privacy-dropdown__option__content {\n flex: 1 1 auto;\n color: $lighter-text-color;\n\n strong {\n font-weight: 500;\n display: block;\n color: $inverted-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n}\n\n.privacy-dropdown.active {\n .privacy-dropdown__value {\n background: $simple-background-color;\n border-radius: 4px 4px 0 0;\n box-shadow: 0 -4px 4px rgba($base-shadow-color, 0.1);\n\n .icon-button {\n transition: none;\n }\n\n &.active {\n background: $ui-highlight-color;\n\n .icon-button {\n color: $primary-text-color;\n }\n }\n }\n\n &.top .privacy-dropdown__value {\n border-radius: 0 0 4px 4px;\n }\n\n .privacy-dropdown__dropdown {\n display: block;\n box-shadow: 2px 4px 6px rgba($base-shadow-color, 0.1);\n }\n}\n\n.search {\n position: relative;\n}\n\n.search__input {\n @include search-input;\n\n display: block;\n padding: 15px;\n padding-right: 30px;\n line-height: 18px;\n font-size: 16px;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n}\n\n.search__icon {\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus {\n outline: 0 !important;\n }\n\n .fa {\n position: absolute;\n top: 16px;\n right: 10px;\n z-index: 2;\n display: inline-block;\n opacity: 0;\n transition: all 100ms linear;\n transition-property: transform, opacity;\n font-size: 18px;\n width: 18px;\n height: 18px;\n color: $secondary-text-color;\n cursor: default;\n pointer-events: none;\n\n &.active {\n pointer-events: auto;\n opacity: 0.3;\n }\n }\n\n .fa-search {\n transform: rotate(90deg);\n\n &.active {\n pointer-events: none;\n transform: rotate(0deg);\n }\n }\n\n .fa-times-circle {\n top: 17px;\n transform: rotate(0deg);\n color: $action-button-color;\n cursor: pointer;\n\n &.active {\n transform: rotate(90deg);\n }\n\n &:hover {\n color: lighten($action-button-color, 7%);\n }\n }\n}\n\n.search-results__header {\n color: $dark-text-color;\n background: lighten($ui-base-color, 2%);\n padding: 15px;\n font-weight: 500;\n font-size: 16px;\n cursor: default;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n}\n\n.search-results__section {\n margin-bottom: 5px;\n\n h5 {\n background: darken($ui-base-color, 4%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n display: flex;\n padding: 15px;\n font-weight: 500;\n font-size: 16px;\n color: $dark-text-color;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n .account:last-child,\n & > div:last-child .status {\n border-bottom: 0;\n }\n}\n\n.search-results__hashtag {\n display: block;\n padding: 10px;\n color: $secondary-text-color;\n text-decoration: none;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($secondary-text-color, 4%);\n text-decoration: underline;\n }\n}\n\n.search-results__info {\n padding: 20px;\n color: $darker-text-color;\n text-align: center;\n}\n\n.modal-root {\n position: relative;\n transition: opacity 0.3s linear;\n will-change: opacity;\n z-index: 9999;\n}\n\n.modal-root__overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba($base-overlay-background, 0.7);\n}\n\n.modal-root__container {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n align-content: space-around;\n z-index: 9999;\n pointer-events: none;\n user-select: none;\n}\n\n.modal-root__modal {\n pointer-events: auto;\n display: flex;\n z-index: 9999;\n}\n\n.video-modal__container {\n max-width: 100vw;\n max-height: 100vh;\n}\n\n.audio-modal__container {\n width: 50vw;\n}\n\n.media-modal {\n width: 100%;\n height: 100%;\n position: relative;\n\n .extended-video-player {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n video {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n }\n }\n}\n\n.media-modal__closer {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n}\n\n.media-modal__navigation {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n transition: opacity 0.3s linear;\n will-change: opacity;\n\n * {\n pointer-events: auto;\n }\n\n &.media-modal__navigation--hidden {\n opacity: 0;\n\n * {\n pointer-events: none;\n }\n }\n}\n\n.media-modal__nav {\n background: rgba($base-overlay-background, 0.5);\n box-sizing: border-box;\n border: 0;\n color: $primary-text-color;\n cursor: pointer;\n display: flex;\n align-items: center;\n font-size: 24px;\n height: 20vmax;\n margin: auto 0;\n padding: 30px 15px;\n position: absolute;\n top: 0;\n bottom: 0;\n}\n\n.media-modal__nav--left {\n left: 0;\n}\n\n.media-modal__nav--right {\n right: 0;\n}\n\n.media-modal__pagination {\n width: 100%;\n text-align: center;\n position: absolute;\n left: 0;\n bottom: 20px;\n pointer-events: none;\n}\n\n.media-modal__meta {\n text-align: center;\n position: absolute;\n left: 0;\n bottom: 20px;\n width: 100%;\n pointer-events: none;\n\n &--shifted {\n bottom: 62px;\n }\n\n a {\n pointer-events: auto;\n text-decoration: none;\n font-weight: 500;\n color: $ui-secondary-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.media-modal__page-dot {\n display: inline-block;\n}\n\n.media-modal__button {\n background-color: $primary-text-color;\n height: 12px;\n width: 12px;\n border-radius: 6px;\n margin: 10px;\n padding: 0;\n border: 0;\n font-size: 0;\n}\n\n.media-modal__button--active {\n background-color: $highlight-text-color;\n}\n\n.media-modal__close {\n position: absolute;\n right: 8px;\n top: 8px;\n z-index: 100;\n}\n\n.onboarding-modal,\n.error-modal,\n.embed-modal {\n background: $ui-secondary-color;\n color: $inverted-text-color;\n border-radius: 8px;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.error-modal__body {\n height: 80vh;\n width: 80vw;\n max-width: 520px;\n max-height: 420px;\n position: relative;\n\n & > div {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n padding: 25px;\n display: none;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n display: flex;\n opacity: 0;\n user-select: text;\n }\n}\n\n.error-modal__body {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n text-align: center;\n}\n\n.onboarding-modal__paginator,\n.error-modal__footer {\n flex: 0 0 auto;\n background: darken($ui-secondary-color, 8%);\n display: flex;\n padding: 25px;\n\n & > div {\n min-width: 33px;\n }\n\n .onboarding-modal__nav,\n .error-modal__nav {\n color: $lighter-text-color;\n border: 0;\n font-size: 14px;\n font-weight: 500;\n padding: 10px 25px;\n line-height: inherit;\n height: auto;\n margin: -10px;\n border-radius: 4px;\n background-color: transparent;\n\n &:hover,\n &:focus,\n &:active {\n color: darken($lighter-text-color, 4%);\n background-color: darken($ui-secondary-color, 16%);\n }\n\n &.onboarding-modal__done,\n &.onboarding-modal__next {\n color: $inverted-text-color;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($inverted-text-color, 4%);\n }\n }\n }\n}\n\n.error-modal__footer {\n justify-content: center;\n}\n\n.display-case {\n text-align: center;\n font-size: 15px;\n margin-bottom: 15px;\n\n &__label {\n font-weight: 500;\n color: $inverted-text-color;\n margin-bottom: 5px;\n font-size: 13px;\n }\n\n &__case {\n background: $ui-base-color;\n color: $secondary-text-color;\n font-weight: 500;\n padding: 10px;\n border-radius: 4px;\n }\n}\n\n.onboard-sliders {\n display: inline-block;\n max-width: 30px;\n max-height: auto;\n margin-left: 10px;\n}\n\n.boost-modal,\n.confirmation-modal,\n.report-modal,\n.actions-modal,\n.mute-modal,\n.block-modal {\n background: lighten($ui-secondary-color, 8%);\n color: $inverted-text-color;\n border-radius: 8px;\n overflow: hidden;\n max-width: 90vw;\n width: 480px;\n position: relative;\n flex-direction: column;\n\n .status__display-name {\n display: block;\n max-width: 100%;\n padding-right: 25px;\n }\n\n .status__avatar {\n height: 28px;\n left: 10px;\n position: absolute;\n top: 10px;\n width: 48px;\n }\n\n .status__content__spoiler-link {\n color: lighten($secondary-text-color, 8%);\n }\n}\n\n.actions-modal {\n .status {\n background: $white;\n border-bottom-color: $ui-secondary-color;\n padding-top: 10px;\n padding-bottom: 10px;\n }\n\n .dropdown-menu__separator {\n border-bottom-color: $ui-secondary-color;\n }\n}\n\n.boost-modal__container {\n overflow-x: scroll;\n padding: 10px;\n\n .status {\n user-select: text;\n border-bottom: 0;\n }\n}\n\n.boost-modal__action-bar,\n.confirmation-modal__action-bar,\n.mute-modal__action-bar,\n.block-modal__action-bar {\n display: flex;\n justify-content: space-between;\n background: $ui-secondary-color;\n padding: 10px;\n line-height: 36px;\n\n & > div {\n flex: 1 1 auto;\n text-align: right;\n color: $lighter-text-color;\n padding-right: 10px;\n }\n\n .button {\n flex: 0 0 auto;\n }\n}\n\n.boost-modal__status-header {\n font-size: 15px;\n}\n\n.boost-modal__status-time {\n float: right;\n font-size: 14px;\n}\n\n.mute-modal,\n.block-modal {\n line-height: 24px;\n}\n\n.mute-modal .react-toggle,\n.block-modal .react-toggle {\n vertical-align: middle;\n}\n\n.report-modal {\n width: 90vw;\n max-width: 700px;\n}\n\n.report-modal__container {\n display: flex;\n border-top: 1px solid $ui-secondary-color;\n\n @media screen and (max-width: 480px) {\n flex-wrap: wrap;\n overflow-y: auto;\n }\n}\n\n.report-modal__statuses,\n.report-modal__comment {\n box-sizing: border-box;\n width: 50%;\n\n @media screen and (max-width: 480px) {\n width: 100%;\n }\n}\n\n.report-modal__statuses,\n.focal-point-modal__content {\n flex: 1 1 auto;\n min-height: 20vh;\n max-height: 80vh;\n overflow-y: auto;\n overflow-x: hidden;\n\n .status__content a {\n color: $highlight-text-color;\n }\n\n .status__content,\n .status__content p {\n color: $inverted-text-color;\n }\n\n @media screen and (max-width: 480px) {\n max-height: 10vh;\n }\n}\n\n.focal-point-modal__content {\n @media screen and (max-width: 480px) {\n max-height: 40vh;\n }\n}\n\n.report-modal__comment {\n padding: 20px;\n border-right: 1px solid $ui-secondary-color;\n max-width: 320px;\n\n p {\n font-size: 14px;\n line-height: 20px;\n margin-bottom: 20px;\n }\n\n .setting-text {\n display: block;\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n color: $inverted-text-color;\n background: $white;\n padding: 10px;\n font-family: inherit;\n font-size: 14px;\n resize: none;\n border: 0;\n outline: 0;\n border-radius: 4px;\n border: 1px solid $ui-secondary-color;\n min-height: 100px;\n max-height: 50vh;\n margin-bottom: 10px;\n\n &:focus {\n border: 1px solid darken($ui-secondary-color, 8%);\n }\n\n &__wrapper {\n background: $white;\n border: 1px solid $ui-secondary-color;\n margin-bottom: 10px;\n border-radius: 4px;\n\n .setting-text {\n border: 0;\n margin-bottom: 0;\n border-radius: 0;\n\n &:focus {\n border: 0;\n }\n }\n\n &__modifiers {\n color: $inverted-text-color;\n font-family: inherit;\n font-size: 14px;\n background: $white;\n }\n }\n\n &__toolbar {\n display: flex;\n justify-content: space-between;\n margin-bottom: 20px;\n }\n }\n\n .setting-text-label {\n display: block;\n color: $inverted-text-color;\n font-size: 14px;\n font-weight: 500;\n margin-bottom: 10px;\n }\n\n .setting-toggle {\n margin-top: 20px;\n margin-bottom: 24px;\n\n &__label {\n color: $inverted-text-color;\n font-size: 14px;\n }\n }\n\n @media screen and (max-width: 480px) {\n padding: 10px;\n max-width: 100%;\n order: 2;\n\n .setting-toggle {\n margin-bottom: 4px;\n }\n }\n}\n\n.actions-modal {\n max-height: 80vh;\n max-width: 80vw;\n\n .status {\n overflow-y: auto;\n max-height: 300px;\n }\n\n .actions-modal__item-label {\n font-weight: 500;\n }\n\n ul {\n overflow-y: auto;\n flex-shrink: 0;\n max-height: 80vh;\n\n &.with-status {\n max-height: calc(80vh - 75px);\n }\n\n li:empty {\n margin: 0;\n }\n\n li:not(:empty) {\n a {\n color: $inverted-text-color;\n display: flex;\n padding: 12px 16px;\n font-size: 15px;\n align-items: center;\n text-decoration: none;\n\n &,\n button {\n transition: none;\n }\n\n &.active,\n &:hover,\n &:active,\n &:focus {\n &,\n button {\n background: $ui-highlight-color;\n color: $primary-text-color;\n }\n }\n\n button:first-child {\n margin-right: 10px;\n }\n }\n }\n }\n}\n\n.confirmation-modal__action-bar,\n.mute-modal__action-bar,\n.block-modal__action-bar {\n .confirmation-modal__secondary-button {\n flex-shrink: 1;\n }\n}\n\n.confirmation-modal__secondary-button,\n.confirmation-modal__cancel-button,\n.mute-modal__cancel-button,\n.block-modal__cancel-button {\n background-color: transparent;\n color: $lighter-text-color;\n font-size: 14px;\n font-weight: 500;\n\n &:hover,\n &:focus,\n &:active {\n color: darken($lighter-text-color, 4%);\n background-color: transparent;\n }\n}\n\n.confirmation-modal__container,\n.mute-modal__container,\n.block-modal__container,\n.report-modal__target {\n padding: 30px;\n font-size: 16px;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n}\n\n.confirmation-modal__container,\n.report-modal__target {\n text-align: center;\n}\n\n.block-modal,\n.mute-modal {\n &__explanation {\n margin-top: 20px;\n }\n\n .setting-toggle {\n margin-top: 20px;\n margin-bottom: 24px;\n display: flex;\n align-items: center;\n\n &__label {\n color: $inverted-text-color;\n margin: 0;\n margin-left: 8px;\n }\n }\n}\n\n.report-modal__target {\n padding: 15px;\n\n .media-modal__close {\n top: 14px;\n right: 15px;\n }\n}\n\n.loading-bar {\n background-color: $highlight-text-color;\n height: 3px;\n position: absolute;\n top: 0;\n left: 0;\n z-index: 9999;\n}\n\n.media-gallery__gifv__label {\n display: block;\n position: absolute;\n color: $primary-text-color;\n background: rgba($base-overlay-background, 0.5);\n bottom: 6px;\n left: 6px;\n padding: 2px 6px;\n border-radius: 2px;\n font-size: 11px;\n font-weight: 600;\n z-index: 1;\n pointer-events: none;\n opacity: 0.9;\n transition: opacity 0.1s ease;\n line-height: 18px;\n}\n\n.media-gallery__gifv {\n &.autoplay {\n .media-gallery__gifv__label {\n display: none;\n }\n }\n\n &:hover {\n .media-gallery__gifv__label {\n opacity: 1;\n }\n }\n}\n\n.media-gallery__audio {\n margin-top: 32px;\n\n audio {\n width: 100%;\n }\n}\n\n.attachment-list {\n display: flex;\n font-size: 14px;\n border: 1px solid lighten($ui-base-color, 8%);\n border-radius: 4px;\n margin-top: 14px;\n overflow: hidden;\n\n &__icon {\n flex: 0 0 auto;\n color: $dark-text-color;\n padding: 8px 18px;\n cursor: default;\n border-right: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n font-size: 26px;\n\n .fa {\n display: block;\n }\n }\n\n &__list {\n list-style: none;\n padding: 4px 0;\n padding-left: 8px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n\n li {\n display: block;\n padding: 4px 0;\n }\n\n a {\n text-decoration: none;\n color: $dark-text-color;\n font-weight: 500;\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n &.compact {\n border: 0;\n margin-top: 4px;\n\n .attachment-list__list {\n padding: 0;\n display: block;\n }\n\n .fa {\n color: $dark-text-color;\n }\n }\n}\n\n/* Media Gallery */\n.media-gallery {\n box-sizing: border-box;\n margin-top: 8px;\n overflow: hidden;\n border-radius: 4px;\n position: relative;\n width: 100%;\n}\n\n.media-gallery__item {\n border: 0;\n box-sizing: border-box;\n display: block;\n float: left;\n position: relative;\n border-radius: 4px;\n overflow: hidden;\n\n &.standalone {\n .media-gallery__item-gifv-thumbnail {\n transform: none;\n top: 0;\n }\n }\n}\n\n.media-gallery__item-thumbnail {\n cursor: zoom-in;\n display: block;\n text-decoration: none;\n color: $secondary-text-color;\n position: relative;\n z-index: 1;\n\n &,\n img {\n height: 100%;\n width: 100%;\n }\n\n img {\n object-fit: cover;\n }\n}\n\n.media-gallery__preview {\n width: 100%;\n height: 100%;\n object-fit: cover;\n position: absolute;\n top: 0;\n left: 0;\n z-index: 0;\n background: $base-overlay-background;\n\n &--hidden {\n display: none;\n }\n}\n\n.media-gallery__gifv {\n height: 100%;\n overflow: hidden;\n position: relative;\n width: 100%;\n}\n\n.media-gallery__item-gifv-thumbnail {\n cursor: zoom-in;\n height: 100%;\n object-fit: cover;\n position: relative;\n top: 50%;\n transform: translateY(-50%);\n width: 100%;\n z-index: 1;\n}\n\n.media-gallery__item-thumbnail-label {\n clip: rect(1px 1px 1px 1px); /* IE6, IE7 */\n clip: rect(1px, 1px, 1px, 1px);\n overflow: hidden;\n position: absolute;\n}\n/* End Media Gallery */\n\n.detailed,\n.fullscreen {\n .video-player__volume__current,\n .video-player__volume::before {\n bottom: 27px;\n }\n\n .video-player__volume__handle {\n bottom: 23px;\n }\n\n}\n\n.audio-player {\n box-sizing: border-box;\n position: relative;\n background: darken($ui-base-color, 8%);\n border-radius: 4px;\n padding-bottom: 44px;\n direction: ltr;\n\n &.editable {\n border-radius: 0;\n height: 100%;\n }\n\n &__waveform {\n padding: 15px 0;\n position: relative;\n overflow: hidden;\n\n &::before {\n content: \"\";\n display: block;\n position: absolute;\n border-top: 1px solid lighten($ui-base-color, 4%);\n width: 100%;\n height: 0;\n left: 0;\n top: calc(50% + 1px);\n }\n }\n\n &__progress-placeholder {\n background-color: rgba(lighten($ui-highlight-color, 8%), 0.5);\n }\n\n &__wave-placeholder {\n background-color: lighten($ui-base-color, 16%);\n }\n\n .video-player__controls {\n padding: 0 15px;\n padding-top: 10px;\n background: darken($ui-base-color, 8%);\n border-top: 1px solid lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n }\n}\n\n.video-player {\n overflow: hidden;\n position: relative;\n background: $base-shadow-color;\n max-width: 100%;\n border-radius: 4px;\n box-sizing: border-box;\n direction: ltr;\n\n &.editable {\n border-radius: 0;\n height: 100% !important;\n }\n\n &:focus {\n outline: 0;\n }\n\n video {\n max-width: 100vw;\n max-height: 80vh;\n z-index: 1;\n }\n\n &.fullscreen {\n width: 100% !important;\n height: 100% !important;\n margin: 0;\n\n video {\n max-width: 100% !important;\n max-height: 100% !important;\n width: 100% !important;\n height: 100% !important;\n outline: 0;\n }\n }\n\n &.inline {\n video {\n object-fit: contain;\n position: relative;\n top: 50%;\n transform: translateY(-50%);\n }\n }\n\n &__controls {\n position: absolute;\n z-index: 2;\n bottom: 0;\n left: 0;\n right: 0;\n box-sizing: border-box;\n background: linear-gradient(0deg, rgba($base-shadow-color, 0.85) 0, rgba($base-shadow-color, 0.45) 60%, transparent);\n padding: 0 15px;\n opacity: 0;\n transition: opacity .1s ease;\n\n &.active {\n opacity: 1;\n }\n }\n\n &.inactive {\n video,\n .video-player__controls {\n visibility: hidden;\n }\n }\n\n &__spoiler {\n display: none;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 4;\n border: 0;\n background: $base-overlay-background;\n color: $darker-text-color;\n transition: none;\n pointer-events: none;\n\n &.active {\n display: block;\n pointer-events: auto;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($darker-text-color, 7%);\n }\n }\n\n &__title {\n display: block;\n font-size: 14px;\n }\n\n &__subtitle {\n display: block;\n font-size: 11px;\n font-weight: 500;\n }\n }\n\n &__buttons-bar {\n display: flex;\n justify-content: space-between;\n padding-bottom: 10px;\n\n .video-player__download__icon {\n color: inherit;\n }\n }\n\n &__buttons {\n font-size: 16px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &.left {\n button {\n padding-left: 0;\n }\n }\n\n &.right {\n button {\n padding-right: 0;\n }\n }\n\n button {\n background: transparent;\n padding: 2px 10px;\n font-size: 16px;\n border: 0;\n color: rgba($white, 0.75);\n\n &:active,\n &:hover,\n &:focus {\n color: $white;\n }\n }\n }\n\n &__time-sep,\n &__time-total,\n &__time-current {\n font-size: 14px;\n font-weight: 500;\n }\n\n &__time-current {\n color: $white;\n margin-left: 60px;\n }\n\n &__time-sep {\n display: inline-block;\n margin: 0 6px;\n }\n\n &__time-sep,\n &__time-total {\n color: $white;\n }\n\n &__volume {\n cursor: pointer;\n height: 24px;\n display: inline;\n\n &::before {\n content: \"\";\n width: 50px;\n background: rgba($white, 0.35);\n border-radius: 4px;\n display: block;\n position: absolute;\n height: 4px;\n left: 70px;\n bottom: 20px;\n }\n\n &__current {\n display: block;\n position: absolute;\n height: 4px;\n border-radius: 4px;\n left: 70px;\n bottom: 20px;\n background: lighten($ui-highlight-color, 8%);\n }\n\n &__handle {\n position: absolute;\n z-index: 3;\n border-radius: 50%;\n width: 12px;\n height: 12px;\n bottom: 16px;\n left: 70px;\n transition: opacity .1s ease;\n background: lighten($ui-highlight-color, 8%);\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n pointer-events: none;\n }\n }\n\n &__link {\n padding: 2px 10px;\n\n a {\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n color: $white;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n }\n\n &__seek {\n cursor: pointer;\n height: 24px;\n position: relative;\n\n &::before {\n content: \"\";\n width: 100%;\n background: rgba($white, 0.35);\n border-radius: 4px;\n display: block;\n position: absolute;\n height: 4px;\n top: 10px;\n }\n\n &__progress,\n &__buffer {\n display: block;\n position: absolute;\n height: 4px;\n border-radius: 4px;\n top: 10px;\n background: lighten($ui-highlight-color, 8%);\n }\n\n &__buffer {\n background: rgba($white, 0.2);\n }\n\n &__handle {\n position: absolute;\n z-index: 3;\n opacity: 0;\n border-radius: 50%;\n width: 12px;\n height: 12px;\n top: 6px;\n margin-left: -6px;\n transition: opacity .1s ease;\n background: lighten($ui-highlight-color, 8%);\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n pointer-events: none;\n\n &.active {\n opacity: 1;\n }\n }\n\n &:hover {\n .video-player__seek__handle {\n opacity: 1;\n }\n }\n }\n\n &.detailed,\n &.fullscreen {\n .video-player__buttons {\n button {\n padding-top: 10px;\n padding-bottom: 10px;\n }\n }\n }\n}\n\n.directory {\n &__list {\n width: 100%;\n margin: 10px 0;\n transition: opacity 100ms ease-in;\n\n &.loading {\n opacity: 0.7;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin: 0;\n }\n }\n\n &__card {\n box-sizing: border-box;\n margin-bottom: 10px;\n\n &__img {\n height: 125px;\n position: relative;\n background: darken($ui-base-color, 12%);\n overflow: hidden;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n object-fit: cover;\n }\n }\n\n &__bar {\n display: flex;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n padding: 10px;\n\n &__name {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n text-decoration: none;\n overflow: hidden;\n }\n\n &__relationship {\n width: 23px;\n min-height: 1px;\n flex: 0 0 auto;\n }\n\n .avatar {\n flex: 0 0 auto;\n width: 48px;\n height: 48px;\n padding-top: 2px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n background: darken($ui-base-color, 8%);\n object-fit: cover;\n }\n }\n\n .display-name {\n margin-left: 15px;\n text-align: left;\n\n strong {\n font-size: 15px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n span {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n &__extra {\n background: $ui-base-color;\n display: flex;\n align-items: center;\n justify-content: center;\n\n .accounts-table__count {\n width: 33.33%;\n flex: 0 0 auto;\n padding: 15px 0;\n }\n\n .account__header__content {\n box-sizing: border-box;\n padding: 15px 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n width: 100%;\n min-height: 18px + 30px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n p {\n display: none;\n\n &:first-child {\n display: inline;\n }\n }\n\n br {\n display: none;\n }\n }\n }\n }\n}\n\n.account-gallery__container {\n display: flex;\n flex-wrap: wrap;\n padding: 4px 2px;\n}\n\n.account-gallery__item {\n border: 0;\n box-sizing: border-box;\n display: block;\n position: relative;\n border-radius: 4px;\n overflow: hidden;\n margin: 2px;\n\n &__icons {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 24px;\n }\n}\n\n.notification__filter-bar,\n.account__section-headline {\n background: darken($ui-base-color, 4%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n display: flex;\n flex-shrink: 0;\n\n button {\n background: darken($ui-base-color, 4%);\n border: 0;\n margin: 0;\n }\n\n button,\n a {\n display: block;\n flex: 1 1 auto;\n color: $darker-text-color;\n padding: 15px 0;\n font-size: 14px;\n font-weight: 500;\n text-align: center;\n text-decoration: none;\n position: relative;\n\n &.active {\n color: $secondary-text-color;\n\n &::before,\n &::after {\n display: block;\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 50%;\n width: 0;\n height: 0;\n transform: translateX(-50%);\n border-style: solid;\n border-width: 0 10px 10px;\n border-color: transparent transparent lighten($ui-base-color, 8%);\n }\n\n &::after {\n bottom: -1px;\n border-color: transparent transparent $ui-base-color;\n }\n }\n }\n\n &.directory__section-headline {\n background: darken($ui-base-color, 2%);\n border-bottom-color: transparent;\n\n a,\n button {\n &.active {\n &::before {\n display: none;\n }\n\n &::after {\n border-color: transparent transparent darken($ui-base-color, 7%);\n }\n }\n }\n }\n}\n\n.filter-form {\n background: $ui-base-color;\n\n &__column {\n padding: 10px 15px;\n }\n\n .radio-button {\n display: block;\n }\n}\n\n.radio-button {\n font-size: 14px;\n position: relative;\n display: inline-block;\n padding: 6px 0;\n line-height: 18px;\n cursor: default;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n cursor: pointer;\n\n input[type=radio],\n input[type=checkbox] {\n display: none;\n }\n\n &__input {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 50%;\n vertical-align: middle;\n\n &.checked {\n border-color: lighten($ui-highlight-color, 8%);\n background: lighten($ui-highlight-color, 8%);\n }\n }\n}\n\n::-webkit-scrollbar-thumb {\n border-radius: 0;\n}\n\n.search-popout {\n @include search-popout;\n}\n\nnoscript {\n text-align: center;\n\n img {\n width: 200px;\n opacity: 0.5;\n animation: flicker 4s infinite;\n }\n\n div {\n font-size: 14px;\n margin: 30px auto;\n color: $secondary-text-color;\n max-width: 400px;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n }\n}\n\n@keyframes flicker {\n 0% { opacity: 1; }\n 30% { opacity: 0.75; }\n 100% { opacity: 1; }\n}\n\n@media screen and (max-width: 630px) and (max-height: 400px) {\n $duration: 400ms;\n $delay: 100ms;\n\n .tabs-bar,\n .search {\n will-change: margin-top;\n transition: margin-top $duration $delay;\n }\n\n .navigation-bar {\n will-change: padding-bottom;\n transition: padding-bottom $duration $delay;\n }\n\n .navigation-bar {\n & > a:first-child {\n will-change: margin-top, margin-left, margin-right, width;\n transition: margin-top $duration $delay, margin-left $duration ($duration + $delay), margin-right $duration ($duration + $delay);\n }\n\n & > .navigation-bar__profile-edit {\n will-change: margin-top;\n transition: margin-top $duration $delay;\n }\n\n .navigation-bar__actions {\n & > .icon-button.close {\n will-change: opacity transform;\n transition: opacity $duration * 0.5 $delay,\n transform $duration $delay;\n }\n\n & > .compose__action-bar .icon-button {\n will-change: opacity transform;\n transition: opacity $duration * 0.5 $delay + $duration * 0.5,\n transform $duration $delay;\n }\n }\n }\n\n .is-composing {\n .tabs-bar,\n .search {\n margin-top: -50px;\n }\n\n .navigation-bar {\n padding-bottom: 0;\n\n & > a:first-child {\n margin: -100px 10px 0 -50px;\n }\n\n .navigation-bar__profile {\n padding-top: 2px;\n }\n\n .navigation-bar__profile-edit {\n position: absolute;\n margin-top: -60px;\n }\n\n .navigation-bar__actions {\n .icon-button.close {\n pointer-events: auto;\n opacity: 1;\n transform: scale(1, 1) translate(0, 0);\n bottom: 5px;\n }\n\n .compose__action-bar .icon-button {\n pointer-events: none;\n opacity: 0;\n transform: scale(0, 1) translate(100%, 0);\n }\n }\n }\n }\n}\n\n.embed-modal {\n width: auto;\n max-width: 80vw;\n max-height: 80vh;\n\n h4 {\n padding: 30px;\n font-weight: 500;\n font-size: 16px;\n text-align: center;\n }\n\n .embed-modal__container {\n padding: 10px;\n\n .hint {\n margin-bottom: 15px;\n }\n\n .embed-modal__html {\n outline: 0;\n box-sizing: border-box;\n display: block;\n width: 100%;\n border: 0;\n padding: 10px;\n font-family: $font-monospace, monospace;\n background: $ui-base-color;\n color: $primary-text-color;\n font-size: 14px;\n margin: 0;\n margin-bottom: 15px;\n border-radius: 4px;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n .embed-modal__iframe {\n width: 400px;\n max-width: 100%;\n overflow: hidden;\n border: 0;\n border-radius: 4px;\n }\n }\n}\n\n.account__moved-note {\n padding: 14px 10px;\n padding-bottom: 16px;\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &__message {\n position: relative;\n margin-left: 58px;\n color: $dark-text-color;\n padding: 8px 0;\n padding-top: 0;\n padding-bottom: 4px;\n font-size: 14px;\n\n > span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n &__icon-wrapper {\n left: -26px;\n position: absolute;\n }\n\n .detailed-status__display-avatar {\n position: relative;\n }\n\n .detailed-status__display-name {\n margin-bottom: 0;\n }\n}\n\n.column-inline-form {\n padding: 15px;\n padding-right: 0;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n\n label {\n flex: 1 1 auto;\n\n input {\n width: 100%;\n\n &:focus {\n outline: 0;\n }\n }\n }\n\n .icon-button {\n flex: 0 0 auto;\n margin: 0 10px;\n }\n}\n\n.drawer__backdrop {\n cursor: pointer;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba($base-overlay-background, 0.5);\n}\n\n.list-editor {\n background: $ui-base-color;\n flex-direction: column;\n border-radius: 8px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n width: 380px;\n overflow: hidden;\n\n @media screen and (max-width: 420px) {\n width: 90%;\n }\n\n h4 {\n padding: 15px 0;\n background: lighten($ui-base-color, 13%);\n font-weight: 500;\n font-size: 16px;\n text-align: center;\n border-radius: 8px 8px 0 0;\n }\n\n .drawer__pager {\n height: 50vh;\n }\n\n .drawer__inner {\n border-radius: 0 0 8px 8px;\n\n &.backdrop {\n width: calc(100% - 60px);\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n border-radius: 0 0 0 8px;\n }\n }\n\n &__accounts {\n overflow-y: auto;\n }\n\n .account__display-name {\n &:hover strong {\n text-decoration: none;\n }\n }\n\n .account__avatar {\n cursor: default;\n }\n\n .search {\n margin-bottom: 0;\n }\n}\n\n.list-adder {\n background: $ui-base-color;\n flex-direction: column;\n border-radius: 8px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n width: 380px;\n overflow: hidden;\n\n @media screen and (max-width: 420px) {\n width: 90%;\n }\n\n &__account {\n background: lighten($ui-base-color, 13%);\n }\n\n &__lists {\n background: lighten($ui-base-color, 13%);\n height: 50vh;\n border-radius: 0 0 8px 8px;\n overflow-y: auto;\n }\n\n .list {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n .list__wrapper {\n display: flex;\n }\n\n .list__display-name {\n flex: 1 1 auto;\n overflow: hidden;\n text-decoration: none;\n font-size: 16px;\n padding: 10px;\n }\n}\n\n.focal-point {\n position: relative;\n cursor: move;\n overflow: hidden;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n background: $base-shadow-color;\n\n img,\n video,\n canvas {\n display: block;\n max-height: 80vh;\n width: 100%;\n height: auto;\n margin: 0;\n object-fit: contain;\n background: $base-shadow-color;\n }\n\n &__reticle {\n position: absolute;\n width: 100px;\n height: 100px;\n transform: translate(-50%, -50%);\n background: url('~images/reticle.png') no-repeat 0 0;\n border-radius: 50%;\n box-shadow: 0 0 0 9999em rgba($base-shadow-color, 0.35);\n }\n\n &__overlay {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n }\n\n &__preview {\n position: absolute;\n bottom: 10px;\n right: 10px;\n z-index: 2;\n cursor: move;\n transition: opacity 0.1s ease;\n\n &:hover {\n opacity: 0.5;\n }\n\n strong {\n color: $primary-text-color;\n font-size: 14px;\n font-weight: 500;\n display: block;\n margin-bottom: 5px;\n }\n\n div {\n border-radius: 4px;\n box-shadow: 0 0 14px rgba($base-shadow-color, 0.2);\n }\n }\n\n @media screen and (max-width: 480px) {\n img,\n video {\n max-height: 100%;\n }\n\n &__preview {\n display: none;\n }\n }\n}\n\n.account__header__content {\n color: $darker-text-color;\n font-size: 14px;\n font-weight: 400;\n overflow: hidden;\n word-break: normal;\n word-wrap: break-word;\n\n p {\n margin-bottom: 20px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: inherit;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n}\n\n.account__header {\n overflow: hidden;\n\n &.inactive {\n opacity: 0.5;\n\n .account__header__image,\n .account__avatar {\n filter: grayscale(100%);\n }\n }\n\n &__info {\n position: absolute;\n top: 10px;\n left: 10px;\n }\n\n &__image {\n overflow: hidden;\n height: 145px;\n position: relative;\n background: darken($ui-base-color, 4%);\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n }\n }\n\n &__bar {\n position: relative;\n background: lighten($ui-base-color, 4%);\n padding: 5px;\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n\n .avatar {\n display: block;\n flex: 0 0 auto;\n width: 94px;\n margin-left: -2px;\n\n .account__avatar {\n background: darken($ui-base-color, 8%);\n border: 2px solid lighten($ui-base-color, 4%);\n }\n }\n }\n\n &__tabs {\n display: flex;\n align-items: flex-start;\n padding: 7px 5px;\n margin-top: -55px;\n\n &__buttons {\n display: flex;\n align-items: center;\n padding-top: 55px;\n overflow: hidden;\n\n .icon-button {\n border: 1px solid lighten($ui-base-color, 12%);\n border-radius: 4px;\n box-sizing: content-box;\n padding: 2px;\n }\n\n .button {\n margin: 0 8px;\n }\n }\n\n &__name {\n padding: 5px;\n\n .account-role {\n vertical-align: top;\n }\n\n .emojione {\n width: 22px;\n height: 22px;\n }\n\n h1 {\n font-size: 16px;\n line-height: 24px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n\n small {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n .spacer {\n flex: 1 1 auto;\n }\n }\n\n &__bio {\n overflow: hidden;\n margin: 0 -5px;\n\n .account__header__content {\n padding: 20px 15px;\n padding-bottom: 5px;\n color: $primary-text-color;\n }\n\n .account__header__fields {\n margin: 0;\n border-top: 1px solid lighten($ui-base-color, 12%);\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n }\n\n &__extra {\n margin-top: 4px;\n\n &__links {\n font-size: 14px;\n color: $darker-text-color;\n padding: 10px 0;\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n padding: 5px 10px;\n font-weight: 500;\n\n strong {\n font-weight: 700;\n color: $primary-text-color;\n }\n }\n }\n }\n}\n\n.trends {\n &__header {\n color: $dark-text-color;\n background: lighten($ui-base-color, 2%);\n border-bottom: 1px solid darken($ui-base-color, 4%);\n font-weight: 500;\n padding: 15px;\n font-size: 16px;\n cursor: default;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n &__item {\n display: flex;\n align-items: center;\n padding: 15px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &:last-child {\n border-bottom: 0;\n }\n\n &__name {\n flex: 1 1 auto;\n color: $dark-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n strong {\n font-weight: 500;\n }\n\n a {\n color: $darker-text-color;\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:hover,\n &:focus,\n &:active {\n span {\n text-decoration: underline;\n }\n }\n }\n }\n\n &__current {\n flex: 0 0 auto;\n font-size: 24px;\n line-height: 36px;\n font-weight: 500;\n text-align: right;\n padding-right: 15px;\n margin-left: 5px;\n color: $secondary-text-color;\n }\n\n &__sparkline {\n flex: 0 0 auto;\n width: 50px;\n\n path:first-child {\n fill: rgba($highlight-text-color, 0.25) !important;\n fill-opacity: 1 !important;\n }\n\n path:last-child {\n stroke: lighten($highlight-text-color, 6%) !important;\n }\n }\n }\n}\n\n.conversation {\n display: flex;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n padding: 5px;\n padding-bottom: 0;\n\n &:focus {\n background: lighten($ui-base-color, 2%);\n outline: 0;\n }\n\n &__avatar {\n flex: 0 0 auto;\n padding: 10px;\n padding-top: 12px;\n position: relative;\n }\n\n &__unread {\n display: inline-block;\n background: $highlight-text-color;\n border-radius: 50%;\n width: 0.625rem;\n height: 0.625rem;\n margin: -.1ex .15em .1ex;\n }\n\n &__content {\n flex: 1 1 auto;\n padding: 10px 5px;\n padding-right: 15px;\n overflow: hidden;\n\n &__info {\n overflow: hidden;\n display: flex;\n flex-direction: row-reverse;\n justify-content: space-between;\n }\n\n &__relative-time {\n font-size: 15px;\n color: $darker-text-color;\n padding-left: 15px;\n }\n\n &__names {\n color: $darker-text-color;\n font-size: 15px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-bottom: 4px;\n flex-basis: 90px;\n flex-grow: 1;\n\n a {\n color: $primary-text-color;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n }\n\n a {\n word-break: break-word;\n }\n }\n\n &--unread {\n background: lighten($ui-base-color, 2%);\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n .conversation__content__info {\n font-weight: 700;\n }\n\n .conversation__content__relative-time {\n color: $primary-text-color;\n }\n }\n}\n",null,"@mixin avatar-radius {\n border-radius: 4px;\n background: transparent no-repeat;\n background-position: 50%;\n background-clip: padding-box;\n}\n\n@mixin avatar-size($size: 48px) {\n width: $size;\n height: $size;\n background-size: $size $size;\n}\n\n@mixin search-input {\n outline: 0;\n box-sizing: border-box;\n width: 100%;\n border: 0;\n box-shadow: none;\n font-family: inherit;\n background: $ui-base-color;\n color: $darker-text-color;\n font-size: 14px;\n margin: 0;\n}\n\n@mixin search-popout {\n background: $simple-background-color;\n border-radius: 4px;\n padding: 10px 14px;\n padding-bottom: 14px;\n margin-top: 10px;\n color: $light-text-color;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n\n h4 {\n color: $light-text-color;\n font-size: 14px;\n font-weight: 500;\n margin-bottom: 10px;\n }\n\n li {\n padding: 4px 0;\n }\n\n ul {\n margin-bottom: 10px;\n }\n\n em {\n font-weight: 500;\n color: $inverted-text-color;\n }\n}\n",".poll {\n margin-top: 16px;\n font-size: 14px;\n\n li {\n margin-bottom: 10px;\n position: relative;\n }\n\n &__chart {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n display: inline-block;\n border-radius: 4px;\n background: darken($ui-primary-color, 14%);\n\n &.leading {\n background: $ui-highlight-color;\n }\n }\n\n &__text {\n position: relative;\n display: flex;\n padding: 6px 0;\n line-height: 18px;\n cursor: default;\n overflow: hidden;\n\n input[type=radio],\n input[type=checkbox] {\n display: none;\n }\n\n .autossugest-input {\n flex: 1 1 auto;\n }\n\n input[type=text] {\n display: block;\n box-sizing: border-box;\n width: 100%;\n font-size: 14px;\n color: $inverted-text-color;\n outline: 0;\n font-family: inherit;\n background: $simple-background-color;\n border: 1px solid darken($simple-background-color, 14%);\n border-radius: 4px;\n padding: 6px 10px;\n\n &:focus {\n border-color: $highlight-text-color;\n }\n }\n\n &.selectable {\n cursor: pointer;\n }\n\n &.editable {\n display: flex;\n align-items: center;\n overflow: visible;\n }\n }\n\n &__input {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 50%;\n vertical-align: middle;\n margin-top: auto;\n margin-bottom: auto;\n flex: 0 0 18px;\n\n &.checkbox {\n border-radius: 4px;\n }\n\n &.active {\n border-color: $valid-value-color;\n background: $valid-value-color;\n }\n\n &:active,\n &:focus,\n &:hover {\n border-width: 4px;\n background: none;\n }\n\n &::-moz-focus-inner {\n outline: 0 !important;\n border: 0;\n }\n\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n\n &__number {\n display: inline-block;\n width: 52px;\n font-weight: 700;\n padding: 0 10px;\n padding-left: 8px;\n text-align: right;\n margin-top: auto;\n margin-bottom: auto;\n flex: 0 0 52px;\n }\n\n &__vote__mark {\n float: left;\n line-height: 18px;\n }\n\n &__footer {\n padding-top: 6px;\n padding-bottom: 5px;\n color: $dark-text-color;\n }\n\n &__link {\n display: inline;\n background: transparent;\n padding: 0;\n margin: 0;\n border: 0;\n color: $dark-text-color;\n text-decoration: underline;\n font-size: inherit;\n\n &:hover {\n text-decoration: none;\n }\n\n &:active,\n &:focus {\n background-color: rgba($dark-text-color, .1);\n }\n }\n\n .button {\n height: 36px;\n padding: 0 16px;\n margin-right: 10px;\n font-size: 14px;\n }\n}\n\n.compose-form__poll-wrapper {\n border-top: 1px solid darken($simple-background-color, 8%);\n\n ul {\n padding: 10px;\n }\n\n .poll__footer {\n border-top: 1px solid darken($simple-background-color, 8%);\n padding: 10px;\n display: flex;\n align-items: center;\n\n button,\n select {\n flex: 1 1 50%;\n\n &:focus {\n border-color: $highlight-text-color;\n }\n }\n }\n\n .button.button-secondary {\n font-size: 14px;\n font-weight: 400;\n padding: 6px 10px;\n height: auto;\n line-height: inherit;\n color: $action-button-color;\n border-color: $action-button-color;\n margin-right: 5px;\n }\n\n li {\n display: flex;\n align-items: center;\n\n .poll__text {\n flex: 0 0 auto;\n width: calc(100% - (23px + 6px));\n margin-right: 6px;\n }\n }\n\n select {\n appearance: none;\n box-sizing: border-box;\n font-size: 14px;\n color: $inverted-text-color;\n display: inline-block;\n width: auto;\n outline: 0;\n font-family: inherit;\n background: $simple-background-color url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center / auto 16px;\n border: 1px solid darken($simple-background-color, 14%);\n border-radius: 4px;\n padding: 6px 10px;\n padding-right: 30px;\n }\n\n .icon-button.disabled {\n color: darken($simple-background-color, 14%);\n }\n}\n\n.muted .poll {\n color: $dark-text-color;\n\n &__chart {\n background: rgba(darken($ui-primary-color, 14%), 0.2);\n\n &.leading {\n background: rgba($ui-highlight-color, 0.2);\n }\n }\n}\n",".modal-layout {\n background: $ui-base-color url('data:image/svg+xml;utf8,') repeat-x bottom fixed;\n display: flex;\n flex-direction: column;\n height: 100vh;\n padding: 0;\n}\n\n.modal-layout__mastodon {\n display: flex;\n flex: 1;\n flex-direction: column;\n justify-content: flex-end;\n\n > * {\n flex: 1;\n max-height: 235px;\n }\n}\n\n@media screen and (max-width: 600px) {\n .account-header {\n margin-top: 0;\n }\n}\n",".emoji-mart {\n font-size: 13px;\n display: inline-block;\n color: $inverted-text-color;\n\n &,\n * {\n box-sizing: border-box;\n line-height: 1.15;\n }\n\n .emoji-mart-emoji {\n padding: 6px;\n }\n}\n\n.emoji-mart-bar {\n border: 0 solid darken($ui-secondary-color, 8%);\n\n &:first-child {\n border-bottom-width: 1px;\n border-top-left-radius: 5px;\n border-top-right-radius: 5px;\n background: $ui-secondary-color;\n }\n\n &:last-child {\n border-top-width: 1px;\n border-bottom-left-radius: 5px;\n border-bottom-right-radius: 5px;\n display: none;\n }\n}\n\n.emoji-mart-anchors {\n display: flex;\n justify-content: space-between;\n padding: 0 6px;\n color: $lighter-text-color;\n line-height: 0;\n}\n\n.emoji-mart-anchor {\n position: relative;\n flex: 1;\n text-align: center;\n padding: 12px 4px;\n overflow: hidden;\n transition: color .1s ease-out;\n cursor: pointer;\n\n &:hover {\n color: darken($lighter-text-color, 4%);\n }\n}\n\n.emoji-mart-anchor-selected {\n color: $highlight-text-color;\n\n &:hover {\n color: darken($highlight-text-color, 4%);\n }\n\n .emoji-mart-anchor-bar {\n bottom: -1px;\n }\n}\n\n.emoji-mart-anchor-bar {\n position: absolute;\n bottom: -5px;\n left: 0;\n width: 100%;\n height: 4px;\n background-color: $highlight-text-color;\n}\n\n.emoji-mart-anchors {\n i {\n display: inline-block;\n width: 100%;\n max-width: 22px;\n }\n\n svg {\n fill: currentColor;\n max-height: 18px;\n }\n}\n\n.emoji-mart-scroll {\n overflow-y: scroll;\n height: 270px;\n max-height: 35vh;\n padding: 0 6px 6px;\n background: $simple-background-color;\n will-change: transform;\n\n &::-webkit-scrollbar-track:hover,\n &::-webkit-scrollbar-track:active {\n background-color: rgba($base-overlay-background, 0.3);\n }\n}\n\n.emoji-mart-search {\n padding: 10px;\n padding-right: 45px;\n background: $simple-background-color;\n\n input {\n font-size: 14px;\n font-weight: 400;\n padding: 7px 9px;\n font-family: inherit;\n display: block;\n width: 100%;\n background: rgba($ui-secondary-color, 0.3);\n color: $inverted-text-color;\n border: 1px solid $ui-secondary-color;\n border-radius: 4px;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n}\n\n.emoji-mart-category .emoji-mart-emoji {\n cursor: pointer;\n\n span {\n z-index: 1;\n position: relative;\n text-align: center;\n }\n\n &:hover::before {\n z-index: 0;\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba($ui-secondary-color, 0.7);\n border-radius: 100%;\n }\n}\n\n.emoji-mart-category-label {\n z-index: 2;\n position: relative;\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n\n span {\n display: block;\n width: 100%;\n font-weight: 500;\n padding: 5px 6px;\n background: $simple-background-color;\n }\n}\n\n.emoji-mart-emoji {\n position: relative;\n display: inline-block;\n font-size: 0;\n\n span {\n width: 22px;\n height: 22px;\n }\n}\n\n.emoji-mart-no-results {\n font-size: 14px;\n text-align: center;\n padding-top: 70px;\n color: $light-text-color;\n\n .emoji-mart-category-label {\n display: none;\n }\n\n .emoji-mart-no-results-label {\n margin-top: .2em;\n }\n\n .emoji-mart-emoji:hover::before {\n content: none;\n }\n}\n\n.emoji-mart-preview {\n display: none;\n}\n","$maximum-width: 1235px;\n$fluid-breakpoint: $maximum-width + 20px;\n$column-breakpoint: 700px;\n$small-breakpoint: 960px;\n\n.container {\n box-sizing: border-box;\n max-width: $maximum-width;\n margin: 0 auto;\n position: relative;\n\n @media screen and (max-width: $fluid-breakpoint) {\n width: 100%;\n padding: 0 10px;\n }\n}\n\n.rich-formatting {\n font-family: $font-sans-serif, sans-serif;\n font-size: 14px;\n font-weight: 400;\n line-height: 1.7;\n word-wrap: break-word;\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n p,\n li {\n color: $darker-text-color;\n }\n\n p {\n margin-top: 0;\n margin-bottom: .85em;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n strong {\n font-weight: 700;\n color: $secondary-text-color;\n }\n\n em {\n font-style: italic;\n color: $secondary-text-color;\n }\n\n code {\n font-size: 0.85em;\n background: darken($ui-base-color, 8%);\n border-radius: 4px;\n padding: 0.2em 0.3em;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n font-family: $font-display, sans-serif;\n margin-top: 1.275em;\n margin-bottom: .85em;\n font-weight: 500;\n color: $secondary-text-color;\n }\n\n h1 {\n font-size: 2em;\n }\n\n h2 {\n font-size: 1.75em;\n }\n\n h3 {\n font-size: 1.5em;\n }\n\n h4 {\n font-size: 1.25em;\n }\n\n h5,\n h6 {\n font-size: 1em;\n }\n\n ul {\n list-style: disc;\n }\n\n ol {\n list-style: decimal;\n }\n\n ul,\n ol {\n margin: 0;\n padding: 0;\n padding-left: 2em;\n margin-bottom: 0.85em;\n\n &[type='a'] {\n list-style-type: lower-alpha;\n }\n\n &[type='i'] {\n list-style-type: lower-roman;\n }\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n margin: 1.7em 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n\n table {\n width: 100%;\n border-collapse: collapse;\n break-inside: auto;\n margin-top: 24px;\n margin-bottom: 32px;\n\n thead tr,\n tbody tr {\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n font-size: 1em;\n line-height: 1.625;\n font-weight: 400;\n text-align: left;\n color: $darker-text-color;\n }\n\n thead tr {\n border-bottom-width: 2px;\n line-height: 1.5;\n font-weight: 500;\n color: $dark-text-color;\n }\n\n th,\n td {\n padding: 8px;\n align-self: start;\n align-items: start;\n word-break: break-all;\n\n &.nowrap {\n width: 25%;\n position: relative;\n\n &::before {\n content: ' ';\n visibility: hidden;\n }\n\n span {\n position: absolute;\n left: 8px;\n right: 8px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n }\n\n & > :first-child {\n margin-top: 0;\n }\n}\n\n.information-board {\n background: darken($ui-base-color, 4%);\n padding: 20px 0;\n\n .container-alt {\n position: relative;\n padding-right: 280px + 15px;\n }\n\n &__sections {\n display: flex;\n justify-content: space-between;\n flex-wrap: wrap;\n }\n\n &__section {\n flex: 1 0 0;\n font-family: $font-sans-serif, sans-serif;\n font-size: 16px;\n line-height: 28px;\n color: $primary-text-color;\n text-align: right;\n padding: 10px 15px;\n\n span,\n strong {\n display: block;\n }\n\n span {\n &:last-child {\n color: $secondary-text-color;\n }\n }\n\n strong {\n font-family: $font-display, sans-serif;\n font-weight: 500;\n font-size: 32px;\n line-height: 48px;\n }\n\n @media screen and (max-width: $column-breakpoint) {\n text-align: center;\n }\n }\n\n .panel {\n position: absolute;\n width: 280px;\n box-sizing: border-box;\n background: darken($ui-base-color, 8%);\n padding: 20px;\n padding-top: 10px;\n border-radius: 4px 4px 0 0;\n right: 0;\n bottom: -40px;\n\n .panel-header {\n font-family: $font-display, sans-serif;\n font-size: 14px;\n line-height: 24px;\n font-weight: 500;\n color: $darker-text-color;\n padding-bottom: 5px;\n margin-bottom: 15px;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n\n a,\n span {\n font-weight: 400;\n color: darken($darker-text-color, 10%);\n }\n\n a {\n text-decoration: none;\n }\n }\n }\n\n .owner {\n text-align: center;\n\n .avatar {\n width: 80px;\n height: 80px;\n margin: 0 auto;\n margin-bottom: 15px;\n\n img {\n display: block;\n width: 80px;\n height: 80px;\n border-radius: 48px;\n }\n }\n\n .name {\n font-size: 14px;\n\n a {\n display: block;\n color: $primary-text-color;\n text-decoration: none;\n\n &:hover {\n .display_name {\n text-decoration: underline;\n }\n }\n }\n\n .username {\n display: block;\n color: $darker-text-color;\n }\n }\n }\n}\n\n.landing-page {\n p,\n li {\n font-family: $font-sans-serif, sans-serif;\n font-size: 16px;\n font-weight: 400;\n font-size: 16px;\n line-height: 30px;\n margin-bottom: 12px;\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n }\n }\n\n em {\n display: inline;\n margin: 0;\n padding: 0;\n font-weight: 700;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n color: lighten($darker-text-color, 10%);\n }\n\n h1 {\n font-family: $font-display, sans-serif;\n font-size: 26px;\n line-height: 30px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n\n small {\n font-family: $font-sans-serif, sans-serif;\n display: block;\n font-size: 18px;\n font-weight: 400;\n color: lighten($darker-text-color, 10%);\n }\n }\n\n h2 {\n font-family: $font-display, sans-serif;\n font-size: 22px;\n line-height: 26px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h3 {\n font-family: $font-display, sans-serif;\n font-size: 18px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h4 {\n font-family: $font-display, sans-serif;\n font-size: 16px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h5 {\n font-family: $font-display, sans-serif;\n font-size: 14px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h6 {\n font-family: $font-display, sans-serif;\n font-size: 12px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n ul,\n ol {\n margin-left: 20px;\n\n &[type='a'] {\n list-style-type: lower-alpha;\n }\n\n &[type='i'] {\n list-style-type: lower-roman;\n }\n }\n\n ul {\n list-style: disc;\n }\n\n ol {\n list-style: decimal;\n }\n\n li > ol,\n li > ul {\n margin-top: 6px;\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid rgba($ui-base-lighter-color, .6);\n margin: 20px 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n\n &__information,\n &__forms {\n padding: 20px;\n }\n\n &__call-to-action {\n background: $ui-base-color;\n border-radius: 4px;\n padding: 25px 40px;\n overflow: hidden;\n box-sizing: border-box;\n\n .row {\n width: 100%;\n display: flex;\n flex-direction: row-reverse;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n }\n\n .row__information-board {\n display: flex;\n justify-content: flex-end;\n align-items: flex-end;\n\n .information-board__section {\n flex: 1 0 auto;\n padding: 0 10px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n width: 100%;\n justify-content: space-between;\n }\n }\n\n .row__mascot {\n flex: 1;\n margin: 10px -50px 0 0;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n }\n\n &__logo {\n margin-right: 20px;\n\n img {\n height: 50px;\n width: auto;\n mix-blend-mode: lighten;\n }\n }\n\n &__information {\n padding: 45px 40px;\n margin-bottom: 10px;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n strong {\n font-weight: 500;\n color: lighten($darker-text-color, 10%);\n }\n\n .account {\n border-bottom: 0;\n padding: 0;\n\n &__display-name {\n align-items: center;\n display: flex;\n margin-right: 5px;\n }\n\n div.account__display-name {\n &:hover {\n .display-name strong {\n text-decoration: none;\n }\n }\n\n .account__avatar {\n cursor: default;\n }\n }\n\n &__avatar-wrapper {\n margin-left: 0;\n flex: 0 0 auto;\n }\n\n &__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n\n .display-name {\n font-size: 15px;\n\n &__account {\n font-size: 14px;\n }\n }\n }\n\n @media screen and (max-width: $small-breakpoint) {\n .contact {\n margin-top: 30px;\n }\n }\n\n @media screen and (max-width: $column-breakpoint) {\n padding: 25px 20px;\n }\n }\n\n &__information,\n &__forms,\n #mastodon-timeline {\n box-sizing: border-box;\n background: $ui-base-color;\n border-radius: 4px;\n box-shadow: 0 0 6px rgba($black, 0.1);\n }\n\n &__mascot {\n height: 104px;\n position: relative;\n left: -40px;\n bottom: 25px;\n\n img {\n height: 190px;\n width: auto;\n }\n }\n\n &__short-description {\n .row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n margin-bottom: 40px;\n }\n\n @media screen and (max-width: $column-breakpoint) {\n .row {\n margin-bottom: 20px;\n }\n }\n\n p a {\n color: $secondary-text-color;\n }\n\n h1 {\n font-weight: 500;\n color: $primary-text-color;\n margin-bottom: 0;\n\n small {\n color: $darker-text-color;\n\n span {\n color: $secondary-text-color;\n }\n }\n }\n\n p:last-child {\n margin-bottom: 0;\n }\n }\n\n &__hero {\n margin-bottom: 10px;\n\n img {\n display: block;\n margin: 0;\n max-width: 100%;\n height: auto;\n border-radius: 4px;\n }\n }\n\n @media screen and (max-width: 840px) {\n .information-board {\n .container-alt {\n padding-right: 20px;\n }\n\n .panel {\n position: static;\n margin-top: 20px;\n width: 100%;\n border-radius: 4px;\n\n .panel-header {\n text-align: center;\n }\n }\n }\n }\n\n @media screen and (max-width: 675px) {\n .header-wrapper {\n padding-top: 0;\n\n &.compact {\n padding-bottom: 0;\n }\n\n &.compact .hero .heading {\n text-align: initial;\n }\n }\n\n .header .container-alt,\n .features .container-alt {\n display: block;\n }\n }\n\n .cta {\n margin: 20px;\n }\n}\n\n.landing {\n margin-bottom: 100px;\n\n @media screen and (max-width: 738px) {\n margin-bottom: 0;\n }\n\n &__brand {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 50px;\n\n svg {\n fill: $primary-text-color;\n height: 52px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding: 0;\n margin-bottom: 30px;\n }\n }\n\n .directory {\n margin-top: 30px;\n background: transparent;\n box-shadow: none;\n border-radius: 0;\n }\n\n .hero-widget {\n margin-top: 30px;\n margin-bottom: 0;\n\n h4 {\n padding: 10px;\n font-weight: 700;\n font-size: 14px;\n color: $darker-text-color;\n }\n\n &__text {\n border-radius: 0;\n padding-bottom: 0;\n }\n\n &__footer {\n background: $ui-base-color;\n padding: 10px;\n border-radius: 0 0 4px 4px;\n display: flex;\n\n &__column {\n flex: 1 1 50%;\n }\n }\n\n .account {\n padding: 10px 0;\n border-bottom: 0;\n\n .account__display-name {\n display: flex;\n align-items: center;\n }\n\n .account__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n }\n\n &__counter {\n padding: 10px;\n\n strong {\n font-family: $font-display, sans-serif;\n font-size: 15px;\n font-weight: 700;\n display: block;\n }\n\n span {\n font-size: 14px;\n color: $darker-text-color;\n }\n }\n }\n\n .simple_form .user_agreement .label_input > label {\n font-weight: 400;\n color: $darker-text-color;\n }\n\n .simple_form p.lead {\n color: $darker-text-color;\n font-size: 15px;\n line-height: 20px;\n font-weight: 400;\n margin-bottom: 25px;\n }\n\n &__grid {\n max-width: 960px;\n margin: 0 auto;\n display: grid;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n grid-gap: 30px;\n\n @media screen and (max-width: 738px) {\n grid-template-columns: minmax(0, 100%);\n grid-gap: 10px;\n\n &__column-login {\n grid-row: 1;\n display: flex;\n flex-direction: column;\n\n .box-widget {\n order: 2;\n flex: 0 0 auto;\n }\n\n .hero-widget {\n margin-top: 0;\n margin-bottom: 10px;\n order: 1;\n flex: 0 0 auto;\n }\n }\n\n &__column-registration {\n grid-row: 2;\n }\n\n .directory {\n margin-top: 10px;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n\n .hero-widget {\n display: block;\n margin-bottom: 0;\n box-shadow: none;\n\n &__img,\n &__img img,\n &__footer {\n border-radius: 0;\n }\n }\n\n .hero-widget,\n .box-widget,\n .directory__tag {\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n .directory {\n margin-top: 0;\n\n &__tag {\n margin-bottom: 0;\n\n & > a,\n & > div {\n border-radius: 0;\n box-shadow: none;\n }\n\n &:last-child {\n border-bottom: 0;\n }\n }\n }\n }\n }\n}\n\n.brand {\n position: relative;\n text-decoration: none;\n}\n\n.brand__tagline {\n display: block;\n position: absolute;\n bottom: -10px;\n left: 50px;\n width: 300px;\n color: $ui-primary-color;\n text-decoration: none;\n font-size: 14px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n position: static;\n width: auto;\n margin-top: 20px;\n color: $dark-text-color;\n }\n}\n\n",".table {\n width: 100%;\n max-width: 100%;\n border-spacing: 0;\n border-collapse: collapse;\n\n th,\n td {\n padding: 8px;\n line-height: 18px;\n vertical-align: top;\n border-top: 1px solid $ui-base-color;\n text-align: left;\n background: darken($ui-base-color, 4%);\n }\n\n & > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid $ui-base-color;\n border-top: 0;\n font-weight: 500;\n }\n\n & > tbody > tr > th {\n font-weight: 500;\n }\n\n & > tbody > tr:nth-child(odd) > td,\n & > tbody > tr:nth-child(odd) > th {\n background: $ui-base-color;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n &.inline-table {\n & > tbody > tr:nth-child(odd) {\n & > td,\n & > th {\n background: transparent;\n }\n }\n\n & > tbody > tr:first-child {\n & > td,\n & > th {\n border-top: 0;\n }\n }\n }\n\n &.batch-table {\n & > thead > tr > th {\n background: $ui-base-color;\n border-top: 1px solid darken($ui-base-color, 8%);\n border-bottom: 1px solid darken($ui-base-color, 8%);\n\n &:first-child {\n border-radius: 4px 0 0;\n border-left: 1px solid darken($ui-base-color, 8%);\n }\n\n &:last-child {\n border-radius: 0 4px 0 0;\n border-right: 1px solid darken($ui-base-color, 8%);\n }\n }\n }\n\n &--invites tbody td {\n vertical-align: middle;\n }\n}\n\n.table-wrapper {\n overflow: auto;\n margin-bottom: 20px;\n}\n\nsamp {\n font-family: $font-monospace, monospace;\n}\n\nbutton.table-action-link {\n background: transparent;\n border: 0;\n font: inherit;\n}\n\nbutton.table-action-link,\na.table-action-link {\n text-decoration: none;\n display: inline-block;\n margin-right: 5px;\n padding: 0 10px;\n color: $darker-text-color;\n font-weight: 500;\n\n &:hover {\n color: $primary-text-color;\n }\n\n i.fa {\n font-weight: 400;\n margin-right: 5px;\n }\n\n &:first-child {\n padding-left: 0;\n }\n}\n\n.batch-table {\n &__toolbar,\n &__row {\n display: flex;\n\n &__select {\n box-sizing: border-box;\n padding: 8px 16px;\n cursor: pointer;\n min-height: 100%;\n\n input {\n margin-top: 8px;\n }\n\n &--aligned {\n display: flex;\n align-items: center;\n\n input {\n margin-top: 0;\n }\n }\n }\n\n &__actions,\n &__content {\n padding: 8px 0;\n padding-right: 16px;\n flex: 1 1 auto;\n }\n }\n\n &__toolbar {\n border: 1px solid darken($ui-base-color, 8%);\n background: $ui-base-color;\n border-radius: 4px 0 0;\n height: 47px;\n align-items: center;\n\n &__actions {\n text-align: right;\n padding-right: 16px - 5px;\n }\n }\n\n &__form {\n padding: 16px;\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n background: $ui-base-color;\n\n .fields-row {\n padding-top: 0;\n margin-bottom: 0;\n }\n }\n\n &__row {\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n background: darken($ui-base-color, 4%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n .optional &:first-child {\n border-top: 1px solid darken($ui-base-color, 8%);\n }\n }\n\n &:hover {\n background: darken($ui-base-color, 2%);\n }\n\n &:nth-child(even) {\n background: $ui-base-color;\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n }\n\n &__content {\n padding-top: 12px;\n padding-bottom: 16px;\n\n &--unpadded {\n padding: 0;\n }\n\n &--with-image {\n display: flex;\n align-items: center;\n }\n\n &__image {\n flex: 0 0 auto;\n display: flex;\n justify-content: center;\n align-items: center;\n margin-right: 10px;\n\n .emojione {\n width: 32px;\n height: 32px;\n }\n }\n\n &__text {\n flex: 1 1 auto;\n }\n\n &__extra {\n flex: 0 0 auto;\n text-align: right;\n color: $darker-text-color;\n font-weight: 500;\n }\n }\n\n .directory__tag {\n margin: 0;\n width: 100%;\n\n a {\n background: transparent;\n border-radius: 0;\n }\n }\n }\n\n &.optional .batch-table__toolbar,\n &.optional .batch-table__row__select {\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n\n .status__content {\n padding-top: 0;\n\n summary {\n display: list-item;\n }\n\n strong {\n font-weight: 700;\n }\n }\n\n .nothing-here {\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n box-shadow: none;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 1px solid darken($ui-base-color, 8%);\n }\n }\n\n @media screen and (max-width: 870px) {\n .accounts-table tbody td.optional {\n display: none;\n }\n }\n}\n","$no-columns-breakpoint: 600px;\n$sidebar-width: 240px;\n$content-width: 840px;\n\n.admin-wrapper {\n display: flex;\n justify-content: center;\n width: 100%;\n min-height: 100vh;\n\n .sidebar-wrapper {\n min-height: 100vh;\n overflow: hidden;\n pointer-events: none;\n flex: 1 1 auto;\n\n &__inner {\n display: flex;\n justify-content: flex-end;\n background: $ui-base-color;\n height: 100%;\n }\n }\n\n .sidebar {\n width: $sidebar-width;\n padding: 0;\n pointer-events: auto;\n\n &__toggle {\n display: none;\n background: lighten($ui-base-color, 8%);\n height: 48px;\n\n &__logo {\n flex: 1 1 auto;\n\n a {\n display: inline-block;\n padding: 15px;\n }\n\n svg {\n fill: $primary-text-color;\n height: 20px;\n position: relative;\n bottom: -2px;\n }\n }\n\n &__icon {\n display: block;\n color: $darker-text-color;\n text-decoration: none;\n flex: 0 0 auto;\n font-size: 20px;\n padding: 15px;\n }\n\n a {\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 12%);\n }\n }\n }\n\n .logo {\n display: block;\n margin: 40px auto;\n width: 100px;\n height: 100px;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n & > a:first-child {\n display: none;\n }\n }\n\n ul {\n list-style: none;\n border-radius: 4px 0 0 4px;\n overflow: hidden;\n margin-bottom: 20px;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n margin-bottom: 0;\n }\n\n a {\n display: block;\n padding: 15px;\n color: $darker-text-color;\n text-decoration: none;\n transition: all 200ms linear;\n transition-property: color, background-color;\n border-radius: 4px 0 0 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n i.fa {\n margin-right: 5px;\n }\n\n &:hover {\n color: $primary-text-color;\n background-color: darken($ui-base-color, 5%);\n transition: all 100ms linear;\n transition-property: color, background-color;\n }\n\n &.selected {\n background: darken($ui-base-color, 2%);\n border-radius: 4px 0 0;\n }\n }\n\n ul {\n background: darken($ui-base-color, 4%);\n border-radius: 0 0 0 4px;\n margin: 0;\n\n a {\n border: 0;\n padding: 15px 35px;\n }\n }\n\n .simple-navigation-active-leaf a {\n color: $primary-text-color;\n background-color: $ui-highlight-color;\n border-bottom: 0;\n border-radius: 0;\n\n &:hover {\n background-color: lighten($ui-highlight-color, 5%);\n }\n }\n }\n\n & > ul > .simple-navigation-active-leaf a {\n border-radius: 4px 0 0 4px;\n }\n }\n\n .content-wrapper {\n box-sizing: border-box;\n width: 100%;\n max-width: $content-width;\n flex: 1 1 auto;\n }\n\n @media screen and (max-width: $content-width + $sidebar-width) {\n .sidebar-wrapper--empty {\n display: none;\n }\n\n .sidebar-wrapper {\n width: $sidebar-width;\n flex: 0 0 auto;\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n .sidebar-wrapper {\n width: 100%;\n }\n }\n\n .content {\n padding: 20px 15px;\n padding-top: 60px;\n padding-left: 25px;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n max-width: none;\n padding: 15px;\n padding-top: 30px;\n }\n\n &-heading {\n display: flex;\n\n padding-bottom: 40px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n margin: -15px -15px 40px 0;\n\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n\n & > * {\n margin-top: 15px;\n margin-right: 15px;\n }\n\n &-actions {\n display: inline-flex;\n\n & > :not(:first-child) {\n margin-left: 5px;\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n border-bottom: 0;\n padding-bottom: 0;\n }\n }\n\n h2 {\n color: $secondary-text-color;\n font-size: 24px;\n line-height: 28px;\n font-weight: 400;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n font-weight: 700;\n }\n }\n\n h3 {\n color: $secondary-text-color;\n font-size: 20px;\n line-height: 28px;\n font-weight: 400;\n margin-bottom: 30px;\n }\n\n h4 {\n font-size: 14px;\n font-weight: 700;\n color: $darker-text-color;\n padding-bottom: 8px;\n margin-bottom: 8px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n h6 {\n font-size: 16px;\n color: $secondary-text-color;\n line-height: 28px;\n font-weight: 500;\n }\n\n .fields-group h6 {\n color: $primary-text-color;\n font-weight: 500;\n }\n\n .directory__tag > a,\n .directory__tag > div {\n box-shadow: none;\n }\n\n .directory__tag .table-action-link .fa {\n color: inherit;\n }\n\n .directory__tag h4 {\n font-size: 18px;\n font-weight: 700;\n color: $primary-text-color;\n text-transform: none;\n padding-bottom: 0;\n margin-bottom: 0;\n border-bottom: 0;\n }\n\n & > p {\n font-size: 14px;\n line-height: 21px;\n color: $secondary-text-color;\n margin-bottom: 20px;\n\n strong {\n color: $primary-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid rgba($ui-base-lighter-color, .6);\n margin: 20px 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n\n .sidebar-wrapper {\n min-height: 0;\n }\n\n .sidebar {\n width: 100%;\n padding: 0;\n height: auto;\n\n &__toggle {\n display: flex;\n }\n\n & > ul {\n display: none;\n }\n\n ul a,\n ul ul a {\n border-radius: 0;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n transition: none;\n\n &:hover {\n transition: none;\n }\n }\n\n ul ul {\n border-radius: 0;\n }\n\n ul .simple-navigation-active-leaf a {\n border-bottom-color: $ui-highlight-color;\n }\n }\n }\n}\n\nhr.spacer {\n width: 100%;\n border: 0;\n margin: 20px 0;\n height: 1px;\n}\n\nbody,\n.admin-wrapper .content {\n .muted-hint {\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n }\n }\n\n .positive-hint {\n color: $valid-value-color;\n font-weight: 500;\n }\n\n .negative-hint {\n color: $error-value-color;\n font-weight: 500;\n }\n\n .neutral-hint {\n color: $dark-text-color;\n font-weight: 500;\n }\n\n .warning-hint {\n color: $gold-star;\n font-weight: 500;\n }\n}\n\n.filters {\n display: flex;\n flex-wrap: wrap;\n\n .filter-subset {\n flex: 0 0 auto;\n margin: 0 40px 20px 0;\n\n &:last-child {\n margin-bottom: 30px;\n }\n\n ul {\n margin-top: 5px;\n list-style: none;\n\n li {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n strong {\n font-weight: 500;\n font-size: 13px;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n font-size: 13px;\n font-weight: 500;\n border-bottom: 2px solid $ui-base-color;\n\n &:hover {\n color: $primary-text-color;\n border-bottom: 2px solid lighten($ui-base-color, 5%);\n }\n\n &.selected {\n color: $highlight-text-color;\n border-bottom: 2px solid $ui-highlight-color;\n }\n }\n }\n}\n\n.flavour-screen {\n display: block;\n margin: 10px auto;\n max-width: 100%;\n}\n\n.flavour-description {\n display: block;\n font-size: 16px;\n margin: 10px 0;\n\n & > p {\n margin: 10px 0;\n }\n}\n\n.flavour-screen {\n display: block;\n margin: 10px auto;\n max-width: 100%;\n}\n\n.flavour-description {\n display: block;\n font-size: 16px;\n margin: 10px 0;\n\n & > p {\n margin: 10px 0;\n }\n}\n\n.report-accounts {\n display: flex;\n flex-wrap: wrap;\n margin-bottom: 20px;\n}\n\n.report-accounts__item {\n display: flex;\n flex: 250px;\n flex-direction: column;\n margin: 0 5px;\n\n & > strong {\n display: block;\n margin: 0 0 10px -5px;\n font-weight: 500;\n font-size: 14px;\n line-height: 18px;\n color: $secondary-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n .account-card {\n flex: 1 1 auto;\n }\n}\n\n.report-status,\n.account-status {\n display: flex;\n margin-bottom: 10px;\n\n .activity-stream {\n flex: 2 0 0;\n margin-right: 20px;\n max-width: calc(100% - 60px);\n\n .entry {\n border-radius: 4px;\n }\n }\n}\n\n.report-status__actions,\n.account-status__actions {\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n\n .icon-button {\n font-size: 24px;\n width: 24px;\n text-align: center;\n margin-bottom: 10px;\n }\n}\n\n.simple_form.new_report_note,\n.simple_form.new_account_moderation_note {\n max-width: 100%;\n}\n\n.batch-form-box {\n display: flex;\n flex-wrap: wrap;\n margin-bottom: 5px;\n\n #form_status_batch_action {\n margin: 0 5px 5px 0;\n font-size: 14px;\n }\n\n input.button {\n margin: 0 5px 5px 0;\n }\n\n .media-spoiler-toggle-buttons {\n margin-left: auto;\n\n .button {\n overflow: visible;\n margin: 0 0 5px 5px;\n float: right;\n }\n }\n}\n\n.back-link {\n margin-bottom: 10px;\n font-size: 14px;\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.spacer {\n flex: 1 1 auto;\n}\n\n.log-entry {\n margin-bottom: 20px;\n line-height: 20px;\n\n &__header {\n display: flex;\n justify-content: flex-start;\n align-items: center;\n padding: 10px;\n background: $ui-base-color;\n color: $darker-text-color;\n border-radius: 4px 4px 0 0;\n font-size: 14px;\n position: relative;\n }\n\n &__avatar {\n margin-right: 10px;\n\n .avatar {\n display: block;\n margin: 0;\n border-radius: 50%;\n width: 40px;\n height: 40px;\n }\n }\n\n &__content {\n max-width: calc(100% - 90px);\n }\n\n &__title {\n word-wrap: break-word;\n }\n\n &__timestamp {\n color: $dark-text-color;\n }\n\n &__extras {\n background: lighten($ui-base-color, 6%);\n border-radius: 0 0 4px 4px;\n padding: 10px;\n color: $darker-text-color;\n font-family: $font-monospace, monospace;\n font-size: 12px;\n word-wrap: break-word;\n min-height: 20px;\n }\n\n &__icon {\n font-size: 28px;\n margin-right: 10px;\n color: $dark-text-color;\n }\n\n &__icon__overlay {\n position: absolute;\n top: 10px;\n right: 10px;\n width: 10px;\n height: 10px;\n border-radius: 50%;\n\n &.positive {\n background: $success-green;\n }\n\n &.negative {\n background: lighten($error-red, 12%);\n }\n\n &.neutral {\n background: $ui-highlight-color;\n }\n }\n\n a,\n .username,\n .target {\n color: $secondary-text-color;\n text-decoration: none;\n font-weight: 500;\n }\n\n .diff-old {\n color: lighten($error-red, 12%);\n }\n\n .diff-neutral {\n color: $secondary-text-color;\n }\n\n .diff-new {\n color: $success-green;\n }\n}\n\na.name-tag,\n.name-tag,\na.inline-name-tag,\n.inline-name-tag {\n text-decoration: none;\n color: $secondary-text-color;\n\n .username {\n font-weight: 500;\n }\n\n &.suspended {\n .username {\n text-decoration: line-through;\n color: lighten($error-red, 12%);\n }\n\n .avatar {\n filter: grayscale(100%);\n opacity: 0.8;\n }\n }\n}\n\na.name-tag,\n.name-tag {\n display: flex;\n align-items: center;\n\n .avatar {\n display: block;\n margin: 0;\n margin-right: 5px;\n border-radius: 50%;\n }\n\n &.suspended {\n .avatar {\n filter: grayscale(100%);\n opacity: 0.8;\n }\n }\n}\n\n.speech-bubble {\n margin-bottom: 20px;\n border-left: 4px solid $ui-highlight-color;\n\n &.positive {\n border-left-color: $success-green;\n }\n\n &.negative {\n border-left-color: lighten($error-red, 12%);\n }\n\n &.warning {\n border-left-color: $gold-star;\n }\n\n &__bubble {\n padding: 16px;\n padding-left: 14px;\n font-size: 15px;\n line-height: 20px;\n border-radius: 4px 4px 4px 0;\n position: relative;\n font-weight: 500;\n\n a {\n color: $darker-text-color;\n }\n }\n\n &__owner {\n padding: 8px;\n padding-left: 12px;\n }\n\n time {\n color: $dark-text-color;\n }\n}\n\n.report-card {\n background: $ui-base-color;\n border-radius: 4px;\n margin-bottom: 20px;\n\n &__profile {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 15px;\n\n .account {\n padding: 0;\n border: 0;\n\n &__avatar-wrapper {\n margin-left: 0;\n }\n }\n\n &__stats {\n flex: 0 0 auto;\n font-weight: 500;\n color: $darker-text-color;\n text-align: right;\n\n a {\n color: inherit;\n text-decoration: none;\n\n &:focus,\n &:hover,\n &:active {\n color: lighten($darker-text-color, 8%);\n }\n }\n\n .red {\n color: $error-value-color;\n }\n }\n }\n\n &__summary {\n &__item {\n display: flex;\n justify-content: flex-start;\n border-top: 1px solid darken($ui-base-color, 4%);\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n\n &__reported-by,\n &__assigned {\n padding: 15px;\n flex: 0 0 auto;\n box-sizing: border-box;\n width: 150px;\n color: $darker-text-color;\n\n &,\n .username {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n &__content {\n flex: 1 1 auto;\n max-width: calc(100% - 300px);\n\n &__icon {\n color: $dark-text-color;\n margin-right: 4px;\n font-weight: 500;\n }\n }\n\n &__content a {\n display: block;\n box-sizing: border-box;\n width: 100%;\n padding: 15px;\n text-decoration: none;\n color: $darker-text-color;\n }\n }\n }\n}\n\n.one-line {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.ellipsized-ip {\n display: inline-block;\n max-width: 120px;\n overflow: hidden;\n text-overflow: ellipsis;\n vertical-align: middle;\n}\n\n.admin-account-bio {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n margin-top: 20px;\n\n > div {\n box-sizing: border-box;\n padding: 0 5px;\n margin-bottom: 10px;\n flex: 1 0 50%;\n }\n\n .account__header__fields,\n .account__header__content {\n background: lighten($ui-base-color, 8%);\n border-radius: 4px;\n height: 100%;\n }\n\n .account__header__fields {\n margin: 0;\n border: 0;\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n\n .account__header__content {\n box-sizing: border-box;\n padding: 20px;\n color: $primary-text-color;\n }\n}\n\n.center-text {\n text-align: center;\n}\n",".dashboard__counters {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n margin-bottom: 20px;\n\n & > div {\n box-sizing: border-box;\n flex: 0 0 33.333%;\n padding: 0 5px;\n margin-bottom: 10px;\n\n & > div,\n & > a {\n padding: 20px;\n background: lighten($ui-base-color, 4%);\n border-radius: 4px;\n box-sizing: border-box;\n height: 100%;\n }\n\n & > a {\n text-decoration: none;\n color: inherit;\n display: block;\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 8%);\n }\n }\n }\n\n &__num,\n &__text {\n text-align: center;\n font-weight: 500;\n font-size: 24px;\n line-height: 21px;\n color: $primary-text-color;\n font-family: $font-display, sans-serif;\n margin-bottom: 20px;\n line-height: 30px;\n }\n\n &__text {\n font-size: 18px;\n }\n\n &__label {\n font-size: 14px;\n color: $darker-text-color;\n text-align: center;\n font-weight: 500;\n }\n}\n\n.dashboard__widgets {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n\n & > div {\n flex: 0 0 33.333%;\n margin-bottom: 20px;\n\n & > div {\n padding: 0 5px;\n }\n }\n\n a:not(.name-tag) {\n color: $ui-secondary-color;\n font-weight: 500;\n text-decoration: none;\n }\n}\n","body.rtl {\n direction: rtl;\n\n .column-header > button {\n text-align: right;\n padding-left: 0;\n padding-right: 15px;\n }\n\n .radio-button__input {\n margin-right: 0;\n margin-left: 10px;\n }\n\n .directory__card__bar .display-name {\n margin-left: 0;\n margin-right: 15px;\n }\n\n .display-name {\n text-align: right;\n }\n\n .notification__message {\n margin-left: 0;\n margin-right: 68px;\n }\n\n .drawer__inner__mastodon > img {\n transform: scaleX(-1);\n }\n\n .notification__favourite-icon-wrapper {\n left: auto;\n right: -26px;\n }\n\n .landing-page__logo {\n margin-right: 0;\n margin-left: 20px;\n }\n\n .landing-page .features-list .features-list__row .visual {\n margin-left: 0;\n margin-right: 15px;\n }\n\n .column-link__icon,\n .column-header__icon {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .compose-form .compose-form__buttons-wrapper .character-counter__wrapper {\n margin-right: 0;\n margin-left: 4px;\n }\n\n .navigation-bar__profile {\n margin-left: 0;\n margin-right: 8px;\n }\n\n .search__input {\n padding-right: 10px;\n padding-left: 30px;\n }\n\n .search__icon .fa {\n right: auto;\n left: 10px;\n }\n\n .columns-area {\n direction: rtl;\n }\n\n .column-header__buttons {\n left: 0;\n right: auto;\n margin-left: 0;\n margin-right: -15px;\n }\n\n .column-inline-form .icon-button {\n margin-left: 0;\n margin-right: 5px;\n }\n\n .column-header__links .text-btn {\n margin-left: 10px;\n margin-right: 0;\n }\n\n .account__avatar-wrapper {\n float: right;\n }\n\n .column-header__back-button {\n padding-left: 5px;\n padding-right: 0;\n }\n\n .column-header__setting-arrows {\n float: left;\n }\n\n .setting-toggle__label {\n margin-left: 0;\n margin-right: 8px;\n }\n\n .status__avatar {\n left: auto;\n right: 10px;\n }\n\n .status,\n .activity-stream .status.light {\n padding-left: 10px;\n padding-right: 68px;\n }\n\n .status__info .status__display-name,\n .activity-stream .status.light .status__display-name {\n padding-left: 25px;\n padding-right: 0;\n }\n\n .activity-stream .pre-header {\n padding-right: 68px;\n padding-left: 0;\n }\n\n .status__prepend {\n margin-left: 0;\n margin-right: 68px;\n }\n\n .status__prepend-icon-wrapper {\n left: auto;\n right: -26px;\n }\n\n .activity-stream .pre-header .pre-header__icon {\n left: auto;\n right: 42px;\n }\n\n .account__avatar-overlay-overlay {\n right: auto;\n left: 0;\n }\n\n .column-back-button--slim-button {\n right: auto;\n left: 0;\n }\n\n .status__relative-time,\n .activity-stream .status.light .status__header .status__meta {\n float: left;\n }\n\n .status__action-bar {\n &__counter {\n margin-right: 0;\n margin-left: 11px;\n\n .status__action-bar-button {\n margin-right: 0;\n margin-left: 4px;\n }\n }\n }\n\n .status__action-bar-button {\n float: right;\n margin-right: 0;\n margin-left: 18px;\n }\n\n .status__action-bar-dropdown {\n float: right;\n }\n\n .privacy-dropdown__dropdown {\n margin-left: 0;\n margin-right: 40px;\n }\n\n .privacy-dropdown__option__icon {\n margin-left: 10px;\n margin-right: 0;\n }\n\n .detailed-status__display-name .display-name {\n text-align: right;\n }\n\n .detailed-status__display-avatar {\n margin-right: 0;\n margin-left: 10px;\n float: right;\n }\n\n .detailed-status__favorites,\n .detailed-status__reblogs {\n margin-left: 0;\n margin-right: 6px;\n }\n\n .fa-ul {\n margin-left: 2.14285714em;\n }\n\n .fa-li {\n left: auto;\n right: -2.14285714em;\n }\n\n .admin-wrapper {\n direction: rtl;\n }\n\n .admin-wrapper .sidebar ul a i.fa,\n a.table-action-link i.fa {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .simple_form .check_boxes .checkbox label {\n padding-left: 0;\n padding-right: 25px;\n }\n\n .simple_form .input.with_label.boolean label.checkbox {\n padding-left: 25px;\n padding-right: 0;\n }\n\n .simple_form .check_boxes .checkbox input[type=\"checkbox\"],\n .simple_form .input.boolean input[type=\"checkbox\"] {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.radio_buttons .radio {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.radio_buttons .radio > label {\n padding-right: 28px;\n padding-left: 0;\n }\n\n .simple_form .input-with-append .input input {\n padding-left: 142px;\n padding-right: 0;\n }\n\n .simple_form .input.boolean label.checkbox {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.boolean .label_input,\n .simple_form .input.boolean .hint {\n padding-left: 0;\n padding-right: 28px;\n }\n\n .simple_form .label_input__append {\n right: auto;\n left: 3px;\n\n &::after {\n right: auto;\n left: 0;\n background-image: linear-gradient(to left, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));\n }\n }\n\n .simple_form select {\n background: darken($ui-base-color, 10%) url(\"data:image/svg+xml;utf8,\") no-repeat left 8px center / auto 16px;\n }\n\n .table th,\n .table td {\n text-align: right;\n }\n\n .filters .filter-subset {\n margin-right: 0;\n margin-left: 45px;\n }\n\n .landing-page .header-wrapper .mascot {\n right: 60px;\n left: auto;\n }\n\n .landing-page__call-to-action .row__information-board {\n direction: rtl;\n }\n\n .landing-page .header .hero .floats .float-1 {\n left: -120px;\n right: auto;\n }\n\n .landing-page .header .hero .floats .float-2 {\n left: 210px;\n right: auto;\n }\n\n .landing-page .header .hero .floats .float-3 {\n left: 110px;\n right: auto;\n }\n\n .landing-page .header .links .brand img {\n left: 0;\n }\n\n .landing-page .fa-external-link {\n padding-right: 5px;\n padding-left: 0 !important;\n }\n\n .landing-page .features #mastodon-timeline {\n margin-right: 0;\n margin-left: 30px;\n }\n\n @media screen and (min-width: 631px) {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n\n &:first-child {\n padding-left: 5px;\n padding-right: 10px;\n }\n }\n\n .columns-area > div {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n }\n }\n }\n\n .columns-area--mobile .column,\n .columns-area--mobile .drawer {\n padding-left: 0;\n padding-right: 0;\n }\n\n .public-layout {\n .header {\n .nav-button {\n margin-left: 8px;\n margin-right: 0;\n }\n }\n\n .public-account-header__tabs {\n margin-left: 0;\n margin-right: 20px;\n }\n }\n\n .landing-page__information {\n .account__display-name {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .account__avatar-wrapper {\n margin-left: 12px;\n margin-right: 0;\n }\n }\n\n .card__bar .display-name {\n margin-left: 0;\n margin-right: 15px;\n text-align: right;\n }\n\n .fa-chevron-left::before {\n content: \"\\F054\";\n }\n\n .fa-chevron-right::before {\n content: \"\\F053\";\n }\n\n .column-back-button__icon {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .column-header__setting-arrows .column-header__setting-btn:last-child {\n padding-left: 0;\n padding-right: 10px;\n }\n\n .simple_form .input.radio_buttons .radio > label input {\n left: auto;\n right: 0;\n }\n}\n","$black-emojis: '8ball' 'ant' 'back' 'black_circle' 'black_heart' 'black_large_square' 'black_medium_small_square' 'black_medium_square' 'black_nib' 'black_small_square' 'bomb' 'bowling' 'bust_in_silhouette' 'busts_in_silhouette' 'camera' 'camera_with_flash' 'clubs' 'copyright' 'curly_loop' 'currency_exchange' 'dark_sunglasses' 'eight_pointed_black_star' 'electric_plug' 'end' 'female-guard' 'film_projector' 'fried_egg' 'gorilla' 'guardsman' 'heavy_check_mark' 'heavy_division_sign' 'heavy_dollar_sign' 'heavy_minus_sign' 'heavy_multiplication_x' 'heavy_plus_sign' 'hocho' 'hole' 'joystick' 'kaaba' 'lower_left_ballpoint_pen' 'lower_left_fountain_pen' 'male-guard' 'microphone' 'mortar_board' 'movie_camera' 'musical_score' 'on' 'registered' 'soon' 'spades' 'speaking_head_in_silhouette' 'spider' 'telephone_receiver' 'tm' 'top' 'tophat' 'turkey' 'vhs' 'video_camera' 'video_game' 'water_buffalo' 'waving_black_flag' 'wavy_dash';\n\n%white-emoji-outline {\n filter: drop-shadow(1px 1px 0 $white) drop-shadow(-1px 1px 0 $white) drop-shadow(1px -1px 0 $white) drop-shadow(-1px -1px 0 $white);\n transform: scale(.71);\n}\n\n.emojione {\n @each $emoji in $black-emojis {\n &[title=':#{$emoji}:'] {\n @extend %white-emoji-outline;\n }\n }\n}\n","// components.scss\n.compose-form {\n .compose-form__modifiers {\n .compose-form__upload {\n &-description {\n input {\n &::placeholder {\n opacity: 1;\n }\n }\n }\n }\n }\n}\n\n.rich-formatting a,\n.rich-formatting p a,\n.rich-formatting li a,\n.landing-page__short-description p a,\n.status__content a,\n.reply-indicator__content a {\n color: lighten($ui-highlight-color, 12%);\n text-decoration: underline;\n\n &.mention {\n text-decoration: none;\n }\n\n &.mention span {\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n\n &.status__content__spoiler-link {\n color: $secondary-text-color;\n text-decoration: none;\n }\n}\n\n.status__content__read-more-button {\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n}\n\n.getting-started__footer a {\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n}\n\n.nothing-here {\n color: $darker-text-color;\n}\n\n.public-layout .public-account-header__tabs__tabs .counter.active::after {\n border-bottom: 4px solid $ui-highlight-color;\n}\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///common.scss","webpack:///./app/javascript/styles/mastodon/reset.scss","webpack:///./app/javascript/styles/contrast/variables.scss","webpack:///./app/javascript/styles/mastodon/basics.scss","webpack:///./app/javascript/styles/mastodon/variables.scss","webpack:///./app/javascript/styles/mastodon/containers.scss","webpack:///./app/javascript/styles/mastodon/lists.scss","webpack:///./app/javascript/styles/mastodon/footer.scss","webpack:///./app/javascript/styles/mastodon/compact_header.scss","webpack:///./app/javascript/styles/mastodon/widgets.scss","webpack:///./app/javascript/styles/mastodon/forms.scss","webpack:///./app/javascript/styles/mastodon/accounts.scss","webpack:///./app/javascript/styles/mastodon/statuses.scss","webpack:///./app/javascript/styles/mastodon/boost.scss","webpack:///./app/javascript/styles/mastodon/components.scss","webpack:///","webpack:///./app/javascript/styles/mastodon/_mixins.scss","webpack:///./app/javascript/styles/mastodon/polls.scss","webpack:///./app/javascript/styles/mastodon/modal.scss","webpack:///./app/javascript/styles/mastodon/emoji_picker.scss","webpack:///./app/javascript/styles/mastodon/about.scss","webpack:///./app/javascript/styles/mastodon/tables.scss","webpack:///./app/javascript/styles/mastodon/admin.scss","webpack:///./app/javascript/styles/mastodon/dashboard.scss","webpack:///./app/javascript/styles/mastodon/rtl.scss","webpack:///./app/javascript/styles/mastodon/accessibility.scss","webpack:///./app/javascript/styles/contrast/diff.scss"],"names":[],"mappings":"AAAA,2ZCKA,QAaE,UACA,SACA,eACA,aACA,wBACA,+EAIF,aAEE,MAGF,aACE,OAGF,eACE,cAGF,WACE,qDAGF,UAEE,aACA,OAGF,wBACE,iBACA,MAGF,sCACE,qBAGF,UACE,YACA,2BAGF,kBACE,cACA,mBACA,iCAGF,kBACE,kCAGF,kBACE,2BAGF,aACE,gBACA,0BACA,CC9EmB,iEDqFrB,kBCrFqB,4BDyFrB,sBACE,MErFF,iDACE,mBACA,eACA,iBACA,gBACA,WCXM,kCDaN,6BACA,8BACA,CADA,0BACA,CADA,qBACA,0CACA,wCACA,kBAEA,iKAYE,eAGF,SACE,oCAEA,WACE,iBACA,kBACA,uCAGF,iBACE,WACA,YACA,mCAGF,iBACE,cAIJ,kBDrDmB,kBCyDnB,iBACE,kBACA,0BAEA,iBACE,aAIJ,iBACE,YAGF,kBACE,SACA,iBACA,uBAEA,iBACE,WACA,YACA,gBACA,YAIJ,kBACE,UACA,YAGF,iBACE,kBACA,cD9EgB,mBAZC,WC6FjB,YACA,UACA,aACA,uBACA,mBACA,oBAEA,qBACE,YACA,sCAGE,aACE,gBACA,WACA,YACA,kBACA,uBAIJ,cACE,iBACA,gBACA,QAMR,mBACE,eACA,cAEA,YACE,kDAKF,YAGE,WACA,mBACA,uBACA,oBACA,sBAGF,YACE,yEAKF,gBAEE,+EAKF,WAEE,sCAIJ,qBAEE,eACA,gBACA,gBACA,cACA,kBACA,8CAEA,eACE,0CAGF,mBACE,gEAEA,eACE,0CAIJ,aDpLwB,kKCuLtB,oBAGE,sDAIJ,aDpLgB,eCsLd,0DAEA,aDxLc,oDC6LhB,cACE,SACA,uBACA,cDhMc,aCkMd,UACA,SACA,oBACA,eACA,UACA,4BACA,0BACA,gMAEA,oBAGE,kEAGF,aC9NY,gBDgOV,gBEnON,WACE,CACA,kBACA,qCAEA,eALF,UAMI,SACA,kBAIJ,sBACE,qCAEA,gBAHF,kBAII,qBAGF,YACE,uBACA,mBACA,wBAEA,SDrBI,YCuBF,kBACA,sBAGF,YACE,uBACA,mBACA,WD9BE,qBCgCF,UACA,kBACA,iBACA,6CACA,gBACA,eACA,mCAMJ,WACE,CACA,cACA,mBACA,sBACA,qCAEA,kCAPF,UAQI,aACA,aACA,kBAKN,WACE,CACA,YACA,eACA,iBACA,sBACA,CACA,gBACA,CACA,sBACA,qCAEA,gBAZF,UAaI,CACA,eACA,CACA,mBACA,0BAGF,UACE,YACA,iBACA,6BAEA,UACE,YACA,cACA,SACA,kBACA,uBAIJ,aACE,cH/EmB,wBGiFnB,iCAEA,aACE,gBACA,uBACA,gBACA,8BAIJ,aACE,eACA,iBACA,gBACA,SAIJ,YACE,cACA,8BACA,sBACA,mCACA,CADA,0BACA,mBAEA,eACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,eACE,WACA,qCAGF,QA3BF,UA4BI,qCACA,mBAEA,aACE,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,UAKN,YACE,cACA,8CACA,sBACA,mCACA,CADA,0BACA,mBAEA,eACE,WACA,mBAGF,eACE,WACA,mBAGF,aACE,WACA,mBAGF,eACE,WACA,mBAGF,aACE,WACA,uCAGF,eACE,wBAGF,kBACE,qCAGF,QAxCF,iDAyCI,uCAEA,YACE,aACA,mBACA,uBACA,iCAGF,UACE,uBACA,mBACA,sBAGF,YACE,sCAIJ,QA7DF,UA8DI,qCACA,mBAEA,aACE,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,sCAMJ,eADF,gBAEI,4BAGF,eACE,qCAEA,0BAHF,SAII,yBAIJ,kBACE,mCACA,kBACA,YACA,cACA,aACA,oBACA,uBACA,iBACA,gBACA,qCAEA,uBAZF,cAaI,WACA,MACA,OACA,SACA,gBACA,gBACA,YACA,6BAGF,cACE,eACA,kCAGF,YACE,oBACA,2BACA,iBACA,oCAGF,YACE,oBACA,uBACA,iBACA,mCAGF,YACE,oBACA,yBACA,iBACA,+BAGF,aACE,aACA,mCAEA,aACE,YACA,WACA,kBACA,YACA,UDxUA,qCC2UA,kCARF,WASI,+GAIJ,kBAGE,kCAIJ,YACE,mBACA,eACA,eACA,gBACA,qBACA,cHhVc,mBGkVd,kBACA,uHAEA,yBAGE,WDrWA,qCCyWF,0CACE,YACE,qCAKN,kBACE,CACA,oBACA,kBACA,6HAEA,oBAGE,mBACA,sBAON,YACE,cACA,0DACA,sBACA,mCACA,CADA,0BACA,gCAEA,UACE,cACA,gCAGF,UACE,cACA,qCAGF,qBAjBF,0BAkBI,WACA,gCAEA,YACE,kCAKN,iBACE,qCAEA,gCAHF,eAII,sCAKF,4BADF,eAEI,wCAIJ,eACE,mBACA,mCACA,gDAEA,UACE,qIAEA,8BAEE,CAFF,sBAEE,6DAGF,wBHxaiB,8CG6anB,yBACE,gBACA,aACA,kBACA,mBACA,oDAEA,UACE,cACA,kBACA,WACA,YACA,gDACA,MACA,OACA,kDAGF,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,0BACA,qCAGF,6CA3BF,YA4BI,gDAIJ,eACE,6JAEA,iBAEE,qCAEA,4JAJF,eAKI,sCAKN,sCA/DF,eAgEI,gBACA,oDAEA,YACE,+FAGF,eAEE,6CAIJ,iBACE,iBACA,aACA,2BACA,mDAEA,UACE,cACA,mBACA,kBACA,SACA,OACA,QACA,YACA,0BACA,WACA,oDAGF,aACE,YACA,aACA,kBACA,cACA,wDAEA,aACE,WACA,YACA,SACA,kBACA,yBACA,mBACA,qCAIJ,2CArCF,YAsCI,mBACA,0BACA,YACA,mDAEA,YACE,oDAGF,UACE,YACA,CACA,sBACA,wDAEA,QACE,kBACA,2DAGF,mDAXF,YAYI,sCAKN,2CAhEF,eAiEI,sCAGF,2CApEF,cAqEI,8CAIJ,aACE,iBACA,mDAEA,gBACE,mBACA,sDAEA,cACE,iBACA,WD1kBF,gBC4kBE,gBACA,mBACA,uBACA,6BACA,4DAEA,aACE,eACA,WDplBJ,gBCslBI,gBACA,uBACA,qCAKN,4CA7BF,gBA8BI,aACA,8BACA,mBACA,mDAEA,aACE,iBACA,sDAEA,cACE,iBACA,iBACA,4DAEA,aH/lBQ,oDGsmBd,YACE,2BACA,oBACA,YACA,qEAEA,YACE,mBACA,gBACA,qCAGF,oEACE,YACE,6DAIJ,eACE,sBACA,cACA,cH3nBU,aG6nBV,+BACA,eACA,kBACA,kBACA,8DAEA,aACE,uEAGF,cACE,kEAGF,aACE,WACA,kBACA,SACA,OACA,WACA,gCACA,WACA,wBACA,yEAIA,+BACE,UACA,kFAGF,2BH3pBW,wEGiqBX,SACE,wBACA,8DAIJ,oBACE,cACA,2EAGF,cACE,cACA,4EAGF,eACE,eACA,kBACA,WDnsBJ,6CCqsBI,2DAIJ,aACE,WACA,4DAGF,eACE,8CAKN,YACE,eACA,kEAEA,eACE,gBACA,uBACA,cACA,2FAEA,4BACE,yEAGF,YACE,qDAIJ,gBACE,eACA,cH5tBY,uDG+tBZ,oBACE,cHhuBU,qBGkuBV,aACA,gBACA,8DAEA,eACE,WDpvBJ,qCC0vBF,6CAtCF,aAuCI,UACA,4CAKN,yBACE,qCAEA,0CAHF,eAII,wCAIJ,eACE,oCAGF,kBACE,mCACA,kBACA,gBACA,mBACA,qCAEA,mCAPF,eAQI,gBACA,gBACA,8DAGF,QACE,aACA,+DAEA,aACE,sFAGF,uBACE,yEAGF,aDryBU,8DC2yBV,mBACA,WD7yBE,qFCizBJ,YAEE,eACA,cHvyBc,2CG2yBhB,gBACE,iCAIJ,YACE,cACA,kDACA,qCAEA,gCALF,aAMI,+CAGF,cACE,iCAIJ,eACE,2BAGF,YACE,eACA,eACA,cACA,+BAEA,qBACE,cACA,YACA,cACA,mBACA,kBACA,qCAEA,8BARF,aASI,sCAGF,8BAZF,cAaI,sCAIJ,0BAvBF,QAwBI,6BACA,+BAEA,UACE,UACA,gBACA,gCACA,0CAEA,eACE,0CAGF,kBHn3Ba,+IGs3BX,kBAGE,WC53BZ,eACE,aAEA,oBACE,aACA,iBAIJ,eACE,cACA,oBAEA,cACE,gBACA,mBACA,wBCfF,eACE,iBACA,oBACA,eACA,cACA,qCAEA,uBAPF,iBAQI,mBACA,+BAGF,YACE,cACA,0CACA,wCAEA,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,kBACA,6CAEA,aACE,wCAIJ,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,qCAGF,6BAxCF,iCAyCI,+EAEA,aAEE,wCAGF,UACE,wCAGF,aACE,+EAGF,aAEE,wCAGF,UACE,sCAIJ,uCACE,aACE,sCAIJ,4JACE,YAIE,4BAKN,wBACE,gBACA,kBACA,cLnFc,6BKsFd,aACE,qBACA,6BAIJ,oBACE,cACA,wGAEA,yBAGE,mCAKF,aACE,YACA,WACA,cACA,aACA,0HAMA,YACE,oBClIR,cACE,iBACA,cNYgB,gBMVhB,mBACA,eACA,qBACA,qCAEA,mBATF,iBAUI,oBACA,uBAGF,aACE,qBACA,0BAGF,eACE,cNJiB,wBMQnB,oBACE,mBACA,kBACA,WACA,YACA,cC9BN,kBACE,mCACA,mBAEA,UACE,kBACA,gBACA,0BACA,gBLPI,uBKUJ,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,0BACA,oBAIJ,kBPlBmB,aOoBjB,0BACA,eACA,cPVgB,iBOYhB,qBACA,gBACA,8BAEA,UACE,YACA,gBACA,sBAGF,kBACE,iCAEA,eACE,uBAIJ,cACE,SACA,UACA,gBACA,uBACA,oBACA,kBACA,oBACA,cACA,sBAGF,aPxCmB,qBO0CjB,4BAEA,yBACE,qCAKN,aAnEF,YAoEI,uBAIJ,kBACE,oBACA,yBAEA,YACE,yBACA,gBACA,eACA,cPjEgB,+BOqElB,cACE,0CAEA,eACE,sDAGF,YACE,mBACA,gDAGF,UACE,YACA,0BACA,oCAIJ,YACE,mBAKF,aP9FkB,aOmGpB,YACE,kBACA,mBPjHmB,mCOmHnB,qBAGF,YACE,kBACA,0BACA,kBACA,cP9GkB,mBOgHlB,iBAGF,eACE,eACA,cPrHkB,iBOuHlB,qBACA,gBACA,UACA,oBAEA,YACE,yBACA,gBACA,eACA,cPhIgB,0BOoIlB,eACE,CACA,kBACA,mBAGF,oBACE,CACA,mBACA,cP7IgB,qBO+IhB,mBACA,gBACA,uBACA,0EAEA,yBAGE,uBAMJ,sBACA,kBACA,mBP3KmB,mCO6KnB,cP/JqB,gBOiKrB,mBACA,sDAEA,eAEE,CAII,qXADF,eACE,yBAKN,aACE,0BACA,CAMI,wLAGF,oBAGE,mIAEA,yBACE,gCAMR,kBACE,oCAEA,gBACE,cP5Mc,8DOkNhB,iBACE,eACA,4DAGF,eACE,qBACA,iEAEA,eACE,kBAMR,YACE,CACA,eLlPM,CKoPN,cACA,cPvOkB,mBOyOlB,+BANA,iBACA,CLlPM,kCKgQN,CATA,aAGF,kBACE,CAEA,iBACA,kBACA,cACA,iBAEA,ULjQM,eKmQJ,gBACA,gBACA,mBACA,gBAGF,cACE,cP7PgB,qCOiQlB,aArBF,YAsBI,mBACA,iBAEA,cACE,aAKN,kBPvRqB,kBOyRnB,mCACA,iBAEA,qBACE,mBACA,uCAEA,YAEE,mBACA,8BACA,mBPpSe,kBOsSf,aACA,qBACA,cACA,mCACA,0EAIA,kBAGE,0BAIJ,kBP3SiB,eO6Sf,8BAGF,UACE,eACA,oBAGF,aACE,eACA,gBACA,WLnUE,mBKqUF,gBACA,uBACA,wBAEA,aP5Tc,0BOgUd,aACE,gBACA,eACA,eACA,cPpUY,0IO0Ud,ULvVE,+BK+VJ,aACE,YACA,uDAGF,oBPzViB,wCO6VjB,eACE,eAKN,YACE,yBACA,gCAEA,aACE,WACA,YACA,kBACA,kBACA,kBACA,mBACA,yBACA,4CAEA,SACE,6CAGF,SACE,6CAGF,SACE,iBAKN,UACE,0BAEA,SACE,SACA,wBAGF,eACE,0BAGF,iBACE,yBACA,cP3YgB,gBO6YhB,aACA,sCAEA,eACE,0BAIJ,cACE,sBACA,gCACA,wCAGF,eACE,wBAGF,WACE,kBACA,eACA,gBACA,WLhbI,8BKmbJ,aACE,cPvac,gBOyad,eACA,0BAIJ,SACE,iCACA,qCAGF,kCACE,YACE,sCAYJ,qIAPF,eAQI,gBACA,gBACA,iBAOJ,gBACE,qCAEA,eAHF,oBAII,uBAGF,sBACE,sCAEA,qBAHF,sBAII,sCAGF,qBAPF,UAQI,sCAGF,qBAXF,WAYI,kCAIJ,iBACE,qCAEA,gCAHF,4BAII,iEAIA,eACE,0DAGF,cACE,iBACA,oEAEA,UACE,YACA,gBACA,yFAGF,gBACE,SACA,mKAIJ,eAGE,gBAON,aPxgBkB,iCOugBpB,kBAKI,6BAEA,eACE,kBAIJ,cACE,iBACA,wCAMF,oBACE,gBACA,cP/hBiB,4JOkiBjB,yBAGE,oBAKN,kBACE,gBACA,eACA,kBACA,yBAEA,aACE,gBACA,aACA,CACA,kBACA,gBACA,uBACA,qBACA,WLnkBI,gCKqkBJ,4FAEA,yBAGE,oCAIJ,eACE,0BAGF,iBACE,gCACA,MCplBJ,+CACE,gBACA,iBAGF,eACE,aACA,cACA,qBAIA,kBACE,gBACA,4BAEA,QACE,0CAIA,kBACE,qDAEA,eACE,gDAIJ,iBACE,kBACA,sDAEA,iBACE,SACA,OACA,6BAKN,iBACE,gBACA,gDAEA,mBACE,eACA,gBACA,WNhDA,cMkDA,WACA,4EAGF,iBAEE,mDAGF,eACE,4CAGF,iBACE,QACA,OACA,qCAGF,aRjEoB,0BQmElB,gIAEA,oBAGE,0CAIJ,iBACE,CACA,iBACA,mBAKN,YACE,cACA,0BAEA,qBACE,cACA,UACA,cACA,oBAIJ,aRvFkB,sBQ0FhB,aRnGsB,yBQuGtB,iBACE,kBACA,mBACA,uBAGF,eACE,iBACA,sBAIJ,kBACE,wBAGF,aACE,eACA,eACA,qBAGF,kBACE,cRrHgB,iCQwHhB,iBACE,eACA,iBACA,gBACA,gBACA,oBAIJ,kBACE,qBAGF,eACE,CAII,0JADF,eACE,sDAMJ,YACE,4DAEA,mBACE,eACA,WNlKA,gBMoKA,gBACA,cACA,wHAGF,aAEE,sDAIJ,cACE,kBACA,mDAKF,mBACE,eACA,WNxLE,cM0LF,kBACA,qBACA,gBACA,sCAGF,cACE,mCAGF,UACE,sCAIJ,cACE,4CAEA,mBACE,eACA,WN9ME,cMgNF,gBACA,gBACA,4CAGF,kBACE,yCAGF,cACE,CADF,cACE,kDAIJ,oBACE,WACA,OACA,6BAGF,oBACE,cACA,4BAGF,kBACE,8CAEA,eACE,0BAIJ,YACE,CACA,eACA,oBACA,iCAEA,cACE,kCAGF,qBACE,eACA,cACA,eACA,oCAEA,aACE,2CAGF,eACE,6GAIJ,eAEE,qCAGF,yBA9BF,aA+BI,gBACA,kCAEA,cACE,0JAGF,kBAGE,iDAKN,iBACE,oBACA,eACA,WNlSI,cMoSJ,WACA,2CAKE,mBACE,eACA,WN5SA,qBM8SA,WACA,kBACA,gBACA,kBACA,cACA,0DAGF,iBACE,OACA,QACA,SACA,kDAKN,cACE,aACA,yBACA,kBACA,sJAGF,qBAKE,eACA,WN5UI,cM8UJ,WACA,UACA,oBACA,gBACA,mBACA,yBACA,kBACA,aACA,6RAEA,aACE,CAHF,+OAEA,aACE,CAHF,mQAEA,aACE,CAHF,sNAEA,aACE,8LAGF,eACE,oVAGF,oBACE,iOAGF,oBNnWY,oLMuWZ,iBACE,4WAGF,oBRxWsB,mBQ2WpB,6CAKF,aACE,gUAGF,oBAME,8CAGF,aACE,gBACA,cACA,eACA,8BAIJ,UACE,uBAGF,eACE,aACA,oCAEA,YACE,mBACA,qEAIJ,aAGE,WACA,SACA,kBACA,mBRlZiB,WEXb,eMgaJ,oBACA,YACA,aACA,yBACA,qBACA,kBACA,sBACA,eACA,gBACA,UACA,mBACA,kBACA,sGAEA,cACE,uFAGF,wBACE,gLAGF,wBAEE,kHAGF,wBRzboB,gGQ6bpB,kBN7bQ,kHMgcN,wBACE,sOAGF,wBAEE,qBAKN,uBACE,CADF,oBACE,CADF,eACE,sBACA,eACA,WNhdI,cMkdJ,WACA,UACA,oBACA,gBACA,wXACA,yBACA,kBACA,kBACA,mBACA,YACA,iBAGF,4BACE,oCAIA,iBACE,mCAGF,iBACE,UACA,QACA,CACA,qBACA,eACA,cRheY,oBQkeZ,oBACA,eACA,gBACA,mBACA,gBACA,yCAEA,UACE,cACA,kBACA,MACA,QACA,WACA,UACA,iEACA,4BAKN,iBACE,0CAEA,wBACE,CADF,gBACE,qCAGF,iBACE,MACA,OACA,WACA,YACA,aACA,uBACA,mBACA,8BACA,kBACA,iBACA,gBACA,YACA,8CAEA,iBACE,6HAGE,UN9hBF,aMwiBR,aACE,CACA,kBACA,eACA,gBAGF,kBACE,cRniBkB,kBQqiBlB,kBACA,mBACA,kBACA,uBAEA,qCACE,iCACA,cNxjBY,sBM4jBd,mCACE,+BACA,cN7jBQ,kBMikBV,oBACE,cRvjBgB,qBQyjBhB,wBAEA,UNxkBI,0BM0kBF,kBAIJ,kBACE,4BAGF,SACE,sBACA,cACA,WACA,SACA,aACA,gDACA,mBRxlBiB,WEDb,eM4lBJ,SACA,8CAEA,QACE,iHAGF,mBAGE,kCAGF,kBACE,uBAIJ,eACE,CAII,oKADF,eACE,0DAKN,eAzEF,eA0EI,eAIJ,eACE,kBACA,gBAEA,aRpnBkB,qBQsnBhB,sBAEA,yBACE,YAKN,eACE,mBACA,eACA,eAEA,oBACE,kBACA,cAGF,aRjpBwB,yBQmpBtB,qBACA,gBACA,2DAEA,aAGE,8BAKN,kBAEE,cRxpBkB,oCQ2pBlB,cACE,mBACA,kBACA,4CAGF,aR/pBqB,gBQiqBnB,CAII,mUADF,eACE,0DAKN,6BAtBF,eAuBI,cAIJ,YACE,eACA,uBACA,UAGF,aACE,gBNrsBM,YMusBN,qBACA,mCACA,qBACA,cAEA,aACE,SACA,iBAIJ,kBACE,cRpsBqB,WQssBrB,sBAEA,aACE,eACA,eAKF,kBACE,sBAEA,eACE,CAII,+JADF,eACE,4CASR,qBACE,8BACA,WNjvBI,qCMmvBJ,oCACA,kBACA,aACA,mBACA,gDAEA,UNzvBI,0BM2vBF,oLAEA,oBAGE,0DAIJ,eACE,cACA,kBACA,CAII,yYADF,eACE,kEAIJ,eACE,oBAMR,YACE,eACA,mBACA,4DAEA,aAEE,6BAIA,wBACA,cACA,sBAIJ,iBACE,cR3xBkB,0BQ8xBlB,iBACE,oBAIJ,eACE,mBACA,uBAEA,cACE,WNrzBI,kBMuzBJ,mBACA,SACA,UACA,4BAGF,aACE,eAIJ,aN/zBc,0SMy0BZ,+CACE,aAIJ,kBACE,yBACA,kBACA,aACA,mBACA,kBACA,kBACA,QACA,mCACA,sBAEA,aACE,8BAGF,sBACE,SACA,aACA,eACA,gDACA,oBAGF,aACE,WACA,oBACA,gBACA,eACA,CACA,oBACA,WACA,iCACA,oBAGF,oBNn3Bc,gBMq3BZ,2BAEA,kBNv3BY,gBMy3BV,oBAKN,kBACE,6BAEA,wBACE,mBACA,eACA,aACA,4BAGF,kBACE,aACA,OACA,sBACA,cACA,cACA,gCAEA,iBACE,YACA,iBACA,kBACA,UACA,8BAGF,qBACE,qCAIJ,kBACE,gCAGF,wBACE,mCACA,kBACA,kBACA,kBACA,kBACA,sCAEA,wBACE,WACA,cACA,YACA,SACA,kBACA,MACA,UACA,yBAIJ,sBACE,aACA,mBACA,SC17BF,aACE,qBACA,cACA,mCACA,qCAEA,QANF,eAOI,8EAMA,kBACE,YAKN,YACE,kBACA,mBACA,0BACA,gBAEA,aACE,WACA,YACA,SACA,oBACA,CADA,8BACA,CADA,gBACA,0BACA,qCAGF,WAfF,YAgBI,sCAGF,WAnBF,YAoBI,aAIJ,iBACE,aACA,aACA,2BACA,mBACA,mBACA,0BACA,qCAEA,WATF,eAUI,qBAGF,aACE,WACA,YACA,gBACA,wBAEA,UACE,YACA,cACA,SACA,kBACA,mBACA,oBACA,CADA,8BACA,CADA,gBACA,0BAIJ,gBACE,gBACA,iCAEA,cACE,WP7EA,gBO+EA,gBACA,uBACA,+BAGF,aACE,eACA,cTzEY,gBS2EZ,gBACA,uBACA,aAMR,cACE,kBACA,gBACA,6GAEA,cAME,WP3GI,gBO6GJ,qBACA,iBACA,qBACA,sBAGF,ePnHM,oBOqHJ,WTtHI,eSwHJ,cACA,kBAGF,cACE,uCAGF,wBAEE,cTlHmB,oBSsHrB,UACE,eACA,wBAEA,oBACE,iBACA,oBAIJ,WACE,gBACA,wBAEA,oBACE,gBACA,uBAIJ,cACE,cACA,qCAGF,YA9DF,iBA+DI,mBAEA,YACE,uCAGF,oBAEE,gBAKN,kBT3KqB,mCS6KnB,cTzJiB,eS2JjB,gBACA,kBACA,aACA,uBACA,mBACA,eACA,kBACA,aACA,gBACA,2BAEA,yBACE,yBAGF,qBACE,gBACA,yCAIJ,oBAEE,gBACA,eACA,kBACA,eACA,iBACA,gBACA,cT1MwB,sCS4MxB,sCACA,6DAEA,aPjNc,sCOmNZ,kCACA,qDAGF,aACE,sCACA,kCACA,0BAIJ,eACE,UACA,wBACA,gBACA,CADA,YACA,CACA,iCACA,CADA,uBACA,CADA,kBACA,eACA,iBACA,6BAEA,YACE,gCACA,yDAGF,qBAEE,aACA,kBACA,gBACA,gBACA,mBACA,uBACA,6BAGF,eACE,YACA,cACA,cT7OmB,6BS+OnB,6BAGF,aACE,cTrPgB,4BSyPlB,aTlQwB,qBSoQtB,qGAEA,yBAGE,oCAIJ,qCACE,iCACA,sCAEA,aPpRY,gBOsRV,0CAGF,aPzRY,wCO8Rd,eACE,wCAIJ,UACE,0BAIA,aT5RkB,4BS+RhB,aTzSsB,qBS2SpB,qGAEA,yBAGE,iCAIJ,UPvTI,gBOyTF,wBAIJ,eACE,kBChUJ,kCACE,kBACA,gBACA,mBACA,8BAEA,yBACE,qCAGF,iBAVF,eAWI,gBACA,gBACA,6BAGF,eACE,SACA,gBACA,gFAEA,yBAEE,sCAIJ,UACE,yBAGF,kBV5BmB,6GU+BjB,sBAGE,CAHF,cAGE,8IAIA,eAGE,0BACA,iJAKF,yBAGE,kLAIA,iBAGE,qCAKN,4GACE,yBAGE,uCAKN,kBACE,qBAIJ,WACE,eACA,mBVpEmB,WEXb,oBQkFN,iBACA,YACA,iBACA,SACA,yBAEA,UACE,YACA,sBACA,iBACA,UR5FI,gFQgGN,kBAGE,qNAKA,kBVtGoB,4IU8GpB,kBR9GQ,qCQqHV,wBACE,YACE,0DAOJ,YACE,uCAGF,2BACE,gBACA,uDAEA,SACE,SACA,yDAGF,eACE,yDAGF,gBACE,iBACA,mFAGF,UACE,qMAGF,eAGE,iCC/JN,u+KACE,uCAEA,u+KACE,0CAIJ,u+KACE,WCTF,gCACE,4CACA,kBAGF,mBACE,sBACA,oBACA,gBACA,kBACA,cAGF,aACE,eACA,iBACA,cZHmB,SYKnB,uBACA,UACA,eACA,wCAEA,yBAEE,uBAGF,aZxBsB,eY0BpB,SAIJ,wBZrBqB,YYuBnB,kBACA,sBACA,WVpCM,eUsCN,qBACA,oBACA,eACA,gBACA,YACA,iBACA,iBACA,gBACA,eACA,kBACA,kBACA,yBACA,qBACA,uBACA,2BACA,mBACA,WACA,4CAEA,wBAGE,4BACA,sBAGF,eACE,mFAEA,wBVjEQ,gBUqEN,mCAIJ,wBZzEsB,eY4EpB,2BAGF,QACE,wDAGF,mBAGE,yGAGF,cAIE,iBACA,YACA,oBACA,iBACA,4BAGF,UZvGM,mBAGgB,qGYwGpB,wBAGE,8BAIJ,kBVnFsB,2GUsFpB,wBAGE,0BAIJ,aZ9GkB,uBYgHhB,iBACA,yBACA,+FAEA,oBAGE,cACA,mCAGF,UACE,uBAIJ,aACE,WACA,kBAIJ,YACE,cACA,kBACA,cAGF,oBACE,UACA,cZ1IoB,SY4IpB,kBACA,uBACA,eACA,2BACA,2CACA,2DAEA,aAGE,uCACA,4BACA,2CACA,oBAGF,qCACE,uBAGF,aACE,6BACA,eACA,qBAGF,aZnLwB,gCYuLxB,QACE,uEAGF,mBAGE,uBAGF,aZjLmB,sFYoLjB,aAGE,oCACA,6BAGF,kCACE,gCAGF,aACE,6BACA,8BAGF,aZpNsB,uCYuNpB,aACE,wBAKN,sBACE,0BACA,yBACA,kBACA,YACA,8BAEA,yBACE,mBAKN,aZ1NqB,SY4NnB,kBACA,uBACA,eACA,gBACA,eACA,cACA,iBACA,UACA,2BACA,2CACA,0EAEA,aAGE,oCACA,4BACA,2CACA,yBAGF,kCACE,4BAGF,aACE,6BACA,eACA,0BAGF,aZ3QwB,qCY+QxB,QACE,sFAGF,mBAGE,CAKF,0BADF,iBAUE,CATA,WAGF,WACE,cACA,qBACA,QACA,SAEA,+BAEA,kBAEE,mBACA,oBACA,kBACA,mBACA,iBAKF,WACE,eAIJ,YACE,iCAGE,mBACA,eAEA,gBACA,wCAEA,aZhUsB,sDYoUtB,YACE,2CAGF,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,kDAEA,oBZrVoB,yDY4VxB,UZjWM,mBYmWJ,mBZhWoB,oCYkWpB,iBACA,kBACA,eACA,gBACA,6CAEA,UZ3WI,gBY6WF,CAII,kRADF,eACE,wCAKN,aZjWiB,gBYmWf,0BACA,yIAEA,oBAGE,sCAKN,iBACE,MACA,QACA,kDAGF,iBACE,mGAGF,iBAGE,WACA,8BAGF,QACE,wBACA,UACA,qDAEA,WACE,mBACA,UACA,mFAIJ,aAEE,sBACA,WACA,SACA,WZraI,gBECA,aUuaJ,oBACA,eACA,gBACA,SACA,UACA,yIAEA,aZhac,CY8Zd,sHAEA,aZhac,CY8Zd,8HAEA,aZhac,CY8Zd,4GAEA,aZhac,+FYoad,SACE,qCAGF,kFAvBF,cAwBI,sCAIJ,iBACE,+CAGF,gBACE,0BACA,iBACA,mBACA,YACA,qBACA,kEAEA,SACE,qCAGF,8CAZF,sBAaI,gBACA,2DAIJ,iBACE,SACA,kDAGF,qBACE,aACA,kBACA,SACA,WACA,WACA,sCACA,mBZ1dsB,0BY4dtB,WZheI,eYkeJ,YACA,6FAEA,aACE,wDAIJ,YACE,eACA,kBACA,yPAEA,kBAIE,wGAIJ,YAGE,mBACA,mBACA,2BACA,iBACA,eACA,oCAGF,6BACE,0CAEA,aACE,gBACA,uBACA,mBACA,2CAGF,eACE,0CAGF,aACE,iBACA,gBACA,uBACA,mBACA,8EAIJ,aAEE,iBACA,WACA,YACA,2DAGF,aZ5gBmB,wCYghBnB,UZriBM,oBYuiBJ,eACA,gBVviBI,sEU0iBJ,eACE,uEAGF,YACE,mBACA,YACA,eACA,8DAGF,UACE,cACA,WACA,uEAEA,iFACE,aACA,uBACA,8BACA,UACA,4BACA,oFAEA,aACE,cZpjBa,eYsjBb,gBACA,aACA,oBACA,6QAEA,UAGE,8EAIJ,SACE,0EAIJ,iBACE,UACA,SACA,OACA,QACA,sBACA,gFACA,aACA,UACA,4BACA,mFAEA,sBACE,cZplBa,SYslBb,UACA,SACA,WACA,oBACA,eACA,gBACA,yFAEA,UV7mBF,8GUinBE,WACE,cZnmBW,CEff,oGUinBE,WACE,cZnmBW,CEff,wGUinBE,WACE,cZnmBW,CEff,+FUinBE,WACE,cZnmBW,iFYwmBf,SACE,wEAKN,iBACE,sBV/nBE,wBUioBF,sBACA,4BACA,aACA,WACA,gBACA,8CAIJ,YACE,mBACA,0BACA,aACA,8BACA,cACA,qEAEA,YACE,uGAEA,gBACE,qGAGF,YACE,6IAEA,aACE,2IAGF,gBACE,0HAKN,sBAEE,cACA,0EAGF,iBACE,iBACA,sCAIJ,YACE,yBACA,YACA,cACA,4EAEA,eACE,iBACA,oBAKN,cACE,kDACA,eACA,gBACA,cZ9qBmB,4CYirBnB,aVlsBY,kCUusBd,2CACE,WC7sBF,8DDktBE,sBACA,CADA,kBACA,wBACA,WACA,YACA,eAEA,UACE,kBAIJ,iBACE,mBACA,mBZ3tBsB,aY6tBtB,gBACA,gBACA,cACA,0BAGF,iBACE,gBACA,0BAGF,WACE,iBACA,gCAGF,UZhvBQ,cYkvBN,eACA,iBACA,gBACA,mBACA,qBACA,kCAGF,UACE,iBACA,+BAGF,cACE,4CAGF,iBAEE,eACA,iBACA,qBACA,gBACA,gBACA,uBACA,gBACA,WV3wBM,wDU8wBN,SACE,wGAGF,kBACE,sJAEA,oBACE,gEAIJ,UACE,YACA,gBACA,oDAGF,cACE,iBACA,sBACA,CADA,gCACA,CADA,kBACA,gDAGF,kBACE,qBACA,sEAEA,eACE,gDAIJ,aVnyBc,qBUqyBZ,4DAEA,yBACE,oEAEA,aACE,4EAKF,oBACE,sFAEA,yBACE,wDAKN,aZvzBc,8EY4zBhB,aACE,0GAGF,kBZ7zBoB,sHYg0BlB,kBACE,qBACA,8IAGF,QACE,0XAGF,mBAGE,0FAIJ,YACE,wJAEA,aACE,+BAKN,oBACE,gBACA,yCAEA,UACE,YACA,gBACA,iCAGF,kBACE,qBACA,4CAEA,eACE,iCAIJ,aZ92BqB,qBYg3BnB,uCAEA,yBACE,+CAIA,oBACE,oDAEA,yBACE,gDAKN,aACE,6CAKN,gBACE,oCAGF,aACE,eACA,iBACA,cACA,SACA,uBACA,CACA,eACA,qBACA,oFAEA,yBAEE,gCAIJ,oBACE,kBACA,uBACA,SACA,WZ/6BM,gBYi7BN,eACA,cACA,yBACA,iBACA,eACA,sBACA,4BAGF,aZ36BkB,SY66BhB,kBACA,kBACA,oBACA,SACA,aACA,sBACA,WACA,WACA,gCACA,+BAGF,UACE,kBACA,kBAIA,SACE,mBACA,wCAEA,kBACE,8CAEA,sBACE,iFAIJ,kBAEE,SAMJ,yBACA,kBACA,gBACA,gCACA,eACA,UAaA,mCACA,CADA,0BACA,wDAZA,QARF,kBAWI,0BAGF,GACE,aACA,WALA,gBAGF,GACE,aACA,uDAMF,cAEE,kCAGF,kBACE,4BACA,sCAIA,aZ5+Be,qCYg/Bf,UZtgCI,6BY0gCJ,aZp/Be,CAtBX,kEYkhCJ,UZlhCI,kCYqhCF,aZhhCoB,gEYohCpB,UVxhCE,mBFEgB,sEY0hChB,kBACE,+CAQR,sBACE,qEAEA,aACE,qDAKN,aZhiCkB,YYmiChB,eACA,uBAGF,aZviCkB,qCY2iClB,aACE,eACA,mBACA,eAGF,cACE,mBAGF,+BACE,aACA,6CAEA,uBACE,OACA,gBACA,4DAEA,eACE,8DAGF,SACE,mBACA,qHAGF,cAEE,gBACA,4EAGF,cACE,0BAKN,kBACE,aACA,cACA,uBACA,aACA,kBAGF,gBACE,cZ5lCgB,CY8lChB,iBACA,eACA,kBACA,+CAEA,aZnmCgB,uBYumChB,aACE,gBACA,uBACA,qBAIJ,kBACE,aACA,eACA,8BAEA,mBACE,kBACA,mBACA,yDAEA,gBACE,qCAGF,oBACE,WACA,eACA,gBACA,cZ7nCgB,4BYmoCtB,iBACE,8BAGF,cACE,cACA,uCAGF,aACE,aACA,mBACA,uBACA,kBACA,kBAGF,kBACE,kBACA,wBAEA,YACE,eACA,8BACA,uBACA,uFAEA,SAEE,mCAIJ,cACE,iBACA,6CAEA,UACE,YACA,gBACA,kEAGF,gBACE,gBACA,+DAIJ,cAEE,wBAIJ,eACE,cZ9rCgB,eYgsChB,iBACA,8BAGF,kBACE,6BACA,gCACA,aACA,mBACA,eACA,wBAGF,aACE,qBACA,uDAGF,oBAEE,gBACA,eACA,gBACA,2BAGF,UZzuCQ,eY2uCN,6BAEA,aZxtCmB,SY6tCrB,YACE,gCACA,8BAEA,aACE,cACA,WVvvCI,qBUyvCJ,eACA,gBACA,kBAIJ,YACE,iBAGF,WACE,aACA,mBACA,UAGF,YACE,gCACA,kBAEA,SACE,gBACA,2CAEA,aACE,iCAIJ,aACE,cACA,cZ3wCgB,gBY6wChB,qBACA,eACA,mBAIJ,YACE,0BAGF,UACE,iBACA,kBACA,kBAGF,iBE3yCE,iCACA,wBACA,4BACA,kBF0yCA,yBAEA,oBACE,sBACA,iBACA,4BAGF,iBErzCA,iCACA,wBACA,4BACA,kBFozCE,gBACA,kBACA,gCAEA,UACE,kBACA,sBACA,mCAGF,aACE,kBACA,QACA,SACA,+BACA,WVr0CE,6BUu0CF,gBACA,eACA,oBAKN,cACE,0BAGF,UACuB,sCE30CrB,+BF60CA,iBEt1CA,iCACA,wBACA,4BACA,WFq1CuB,sCE/0CvB,kCFk1CA,iBE31CA,iCACA,wBACA,4BACA,WF01CuB,sCEp1CvB,kBFs1CE,SACA,QACA,UACA,wBAIJ,WACE,aACA,mBACA,sBAGF,YACE,6BACA,cZ/1CgB,6BYk2ChB,eACE,CAII,kMADF,eACE,wBAKN,eACE,cACA,0BACA,yFAEA,oBAGE,sBAKN,4BACE,gCACA,iBACA,gBACA,cACA,aACA,+BAGF,YACE,4CAEA,qBACE,oFAIA,QACE,WACA,uDAGF,WACE,iBACA,gBACA,WACA,4BAKN,YACE,cACA,iBACA,kBACA,2BAGF,oBACE,gBACA,cACA,+BACA,eACA,oCACA,kCAEA,+BACE,gCAGF,aACE,yBACA,eACA,cZ/6CgB,kCYm7ClB,aACE,eACA,gBACA,WVn8CI,CUw8CA,2NADF,eACE,oBAMR,iBACE,mDAEA,aACE,mBACA,gBACA,4BAIJ,UACE,kBACA,6JAGF,oBAME,4DAKA,UVx+CM,kBU8+CN,UACE,iKAQF,yBACE,+BAIJ,aACE,gBACA,uBACA,0DAGF,aAEE,sCAGF,kBACE,gCAGF,aZ5/CuB,cY8/CrB,iBACA,mBACA,gBACA,2EAEA,aAEE,uBACA,gBACA,uCAGF,cACE,WV1hDI,kCU+hDR,UACE,kBACA,iBAGF,WACE,UACA,kBACA,SACA,WACA,iBAGF,UACE,kBACA,OACA,MACA,YACA,eACA,CZpiDgB,gHY8iDhB,aZ9iDgB,wBYkjDhB,UACE,wCAGF,kBVtiDsB,WF/BhB,8CYykDJ,kBACE,qBACA,wBAKN,oBACE,gBACA,eACA,cZrkDkB,eYukDlB,iBACA,kBACA,4BAEA,aZplDwB,6BYwlDxB,cACE,gBACA,uBACA,uCAIJ,UACE,kBACA,CVjmDU,mEUwmDZ,aVxmDY,uBU4mDZ,aV7mDc,4DUmnDV,4CACE,CADF,oCACE,8DAKF,6CACE,CADF,qCACE,6BAKN,aACE,gBACA,qBACA,mCAEA,UVvoDM,0BUyoDJ,8BAIJ,WACE,eAGF,aACE,eACA,gBACA,uBACA,mBACA,qBAGF,eACE,wBAGF,cACE,+DAKA,yBACE,eAIJ,iBACE,WACA,YACA,aACA,mBACA,uBACA,sBACA,6CAEA,cV9nD4B,eAEC,0DU+nD3B,sBACA,CADA,gCACA,CADA,kBACA,4BAGF,iBACE,qEAGF,YACE,iBAIJ,iBACE,WACA,YACA,aACA,mBACA,uBACA,qBAEA,cVtpD4B,eAEC,WUupD3B,YACA,sBACA,CADA,gCACA,CADA,kBACA,iBAIJ,YACE,aACA,mBACA,cACA,eACA,cZ1sDkB,wBY6sDlB,aZ3sDqB,mBY+sDrB,aACE,4BAGF,oBACE,0CAGF,iBACE,6DAEA,iBACE,oBACA,qCACA,UACA,4EAGF,mBACE,gCACA,UACA,0BAKN,aACE,gBACA,iBACA,gBACA,gBACA,kCAGF,aACE,gBACA,gBACA,uBACA,+BAGF,aACE,qBACA,WAGF,oBACE,oBAGF,YACE,kBACA,2BAGF,+BACE,mBACA,SACA,gBAGF,kBZxxD0B,cY0xDxB,kBACA,uCACA,aACA,mBAEA,eACE,qBAGF,yBACE,oBAGF,yBACE,uBAGF,sBACE,sBAGF,sBACE,uBAIJ,iBACE,QACA,SACA,2BACA,4BAEA,UACE,gBACA,2BACA,0BZ7zDsB,2BYi0DxB,WACE,iBACA,uBACA,yBZp0DsB,8BYw0DxB,QACE,iBACA,uBACA,4BZ30DsB,6BY+0DxB,SACE,gBACA,2BACA,2BZl1DsB,wBYw1DxB,cACE,iBACA,cACA,iBACA,sBACA,qBACA,mBZ91DsB,WAJlB,gBYq2DJ,uBACA,mBACA,yFAEA,kBZ71DiB,cAIE,UY81DjB,sCAKN,aACE,iBACA,gBACA,QACA,gBACA,aACA,yCAEA,eACE,mBZx3DsB,cY03DtB,kBACA,mCACA,gBACA,kBACA,sDAGF,OACE,wDAIA,UACE,8CAIJ,cACE,iBACA,cACA,iBACA,sBACA,qBACA,mBZj5DsB,WAJlB,gBYw5DJ,uBACA,mBACA,oDAEA,SACE,oDAGF,kBZp5DiB,cAIE,iBYu5DvB,qBACE,eAGF,YACE,cACA,mBACA,2BACA,gBACA,kBACA,4BAEA,iBACE,uBAGF,YACE,uBACA,WACA,YACA,iBACA,6BAEA,WACE,gBACA,oBACA,aACA,yBACA,gBACA,oCAEA,0BACE,oCAGF,cACE,YACA,oBACA,YACA,6BAIJ,qBACE,WACA,gBACA,cACA,aACA,sBACA,qCAEA,4BARF,cASI,qBAMR,kBACE,wBACA,CADA,eACA,MACA,UACA,cACA,qCAEA,mBAPF,gBAQI,+BAGF,eACE,qCAEA,6BAHF,kBAII,gKAMJ,WAIE,mCAIJ,YACE,mBACA,uBACA,YACA,SAGF,WACE,kBACA,sBACA,aACA,sBACA,qBAEA,kBZ1gEmB,8BY4gEjB,+BACA,KAIJ,aACE,CACA,qBACA,WACA,YACA,aAJA,YAYA,CARA,QAGF,WACE,sBACA,CACA,qBACA,kBACA,cAGF,aACE,cACA,sBACA,cZxhEkB,qBY0hElB,kBACA,eACA,oCACA,iBAGF,aAEE,gBACA,qCAGF,cACE,SACE,iBAGF,aAEE,CAEA,gBACA,yCAEA,iBACE,uCAGF,kBACE,qDAKF,gBAEE,kBACA,YAKN,qBACE,aACA,mBACA,cACA,gBACA,iBAGF,aACE,cACA,CACA,sBACA,WV7lEM,qBU+lEN,kBACA,eACA,gBACA,gCACA,2BACA,mDACA,qBAEA,eACE,eACA,qCAMA,mEAHF,kBAII,4BACA,yBAIJ,+BACE,cZlnEsB,sBYsnExB,eACE,aACA,qCAIJ,qBAEI,cACE,wBAKN,qBACE,WACA,YACA,cACA,6DAEA,UAEE,YACA,UACA,wCAGF,YACE,cACA,kDACA,qCAEA,uCALF,aAMI,yCAIJ,eACE,oCAGF,YACE,uDAGF,cACE,sCAGF,gBACE,eACA,CACA,2BACA,yCAGF,QACE,mCAGF,gBACE,yBAEA,kCAHF,eAII,sCAIJ,sBACE,gBACA,sCAGF,uCACE,YACE,iKAEA,eAGE,6CAIJ,gBACE,2EAGF,YAEE,kGAGF,gBACE,+BAGF,2BACE,gBACA,uCAEA,SACE,SACA,wCAGF,eACE,wCAGF,gBACE,iBACA,qDAGF,UACE,gLAGF,eAIE,gCAIJ,iBACE,6CAEA,cACE,8CAKF,gBACE,iBACA,6DAGF,UACE,CAIA,yFAGF,eACE,8DAGF,gBACE,kBACA,0BAMR,cACE,aACA,uBACA,mBACA,gBACA,iBACA,iBACA,gBACA,mBACA,WVpyEM,kBUsyEN,eACA,iBACA,qBACA,sCACA,4FAEA,kBAGE,qCAIJ,UACE,UACE,uDAGF,kCACE,4DAGF,kBAGE,yBAGF,aACE,iBAGF,eAEE,sCAIJ,2CACE,YACE,sCAOA,sEAGF,YACE,uCAIJ,0CACE,YACE,uCAIJ,UACE,YACE,mBAIJ,iBACE,yBAEA,iBACE,SACA,UACA,mBZp2EiB,yBYs2EjB,gBACA,kBACA,eACA,gBACA,iBACA,WVt3EI,mDU23ER,oBACE,gBAGF,WACE,gBACA,aACA,sBACA,yBACA,kBACA,gCAEA,gBACE,oBACA,cACA,gBACA,6BAGF,sBACE,8BAGF,MACE,kBACA,aACA,sBACA,iBACA,oBACA,oBACA,mDAGF,eACE,sBV75EI,0BU+5EJ,cACA,gDAGF,iBACE,gDAGF,WACE,mBAIJ,eACE,mBACA,yBACA,gBACA,aACA,sBACA,qBAEA,aACE,sBAGF,aACE,SACA,CACA,4BACA,cACA,qDAHA,sBAOA,gBAMF,WACA,kBAGA,+BANF,qBACE,UACA,CAEA,eACA,aAiBA,CAhBA,eAGF,iBACE,MACA,OACA,mBACA,CAGA,qBACA,CACA,eACA,WACA,YACA,kBACA,uBAEA,kBZ59EmB,0BYi+ErB,u1BACE,OACA,gBACA,aACA,8BAEA,aACE,sBACA,CADA,4DACA,CADA,kBACA,+BACA,CADA,2BACA,UACA,YACA,oBACA,eACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,sCAGF,yBAjBF,aAkBI,iBAIJ,kBACE,eACA,gBACA,iBAGF,aACE,eACA,mBACA,mBACA,aACA,mBACA,kBACA,mBAEA,iCACE,yBAEA,kBACE,mCACA,aAKN,iBACE,kBACA,cACA,iCACA,mCAEA,eACE,yBAGF,YAVF,cAWI,oBAGF,YACE,sBACA,qBAGF,aACE,kBACA,iBACA,yBAKF,uBADF,YAEI,sBAIJ,qBACE,WACA,mBACA,cZhjFwB,eYkjFxB,cACA,eACA,oBACA,SACA,iBACA,aACA,SACA,UACA,UACA,2BAEA,yBACE,6BAIJ,kBACE,SACA,oBACA,cZrkFwB,eYukFxB,mBACA,eACA,kBACA,UACA,mCAEA,yBACE,wCAGF,kBACE,2BAIJ,oBACE,iBACA,2BAGF,iBACE,kCAGF,cACE,cACA,eACA,aACA,kBACA,QACA,UACA,eAGF,oBACE,kBACA,eACA,6BACA,SACA,UACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,0CACA,wCACA,iCAGF,QACE,mBACA,WACA,YACA,gBACA,UACA,kBACA,UACA,yBAGF,kBACE,WACA,wBACA,qBAGF,UACE,YACA,UACA,mBACA,yBZ7oFmB,qCY+oFnB,sEAGF,wBACE,4CAGF,wBZ5oFqB,+EYgpFrB,wBACE,2BAGF,iBACE,WACA,YACA,MACA,SACA,gBACA,mBACA,cACA,SACA,UACA,6BACA,CAKA,uEAFF,SACE,6BAeA,CAdA,sBAGF,iBACE,WACA,YACA,MACA,SACA,gBACA,mBACA,cACA,WAGA,8CAGF,SACE,qBAGF,iBACE,QACA,SACA,WACA,YACA,yBACA,kBACA,yBACA,sBACA,yBACA,sCACA,4CAGF,SACE,qBZxsFmB,cY4sFrB,kBACE,WVxtFM,cU0tFN,eACA,aACA,qBACA,2DAEA,kBAGE,oBAGF,SACE,2BAGF,sBACE,cZvuFsB,kGY0uFtB,sBAGE,WVhvFE,kCUovFJ,aZzuFiB,oBY+uFrB,oBACE,iBACA,qBAGF,oBACE,kBACA,CACA,gBACA,CZlwFmB,eYqwFnB,iBACA,wCANA,cACA,CACA,eACA,mBAaA,CAVA,mBZtwFmB,aAaH,iBY+vFhB,CAEA,wBACA,eACA,yDAGF,kBZnxFqB,cYyxFrB,aACE,kBAGF,aZhxFkB,cYkxFhB,8BACA,+BACA,4EAEA,0BAGE,CAHF,uBAGE,CAHF,kBAGE,kDAMA,sBACA,YACA,wDAEA,kBACE,8DAGF,cACE,sDAGF,cACE,0DAEA,aZ9yFY,0BYgzFV,sDAIJ,oBACE,cZtzFc,sMYyzFd,yBAGE,oDAKN,aZh0FgB,0BYs0FhB,aACE,UACA,mCACA,CADA,0BACA,gBACA,6BAEA,cACE,yBACA,cZ/0Fc,aYi1Fd,gBACA,gCACA,sCAGF,oDACE,YACE,uCAIJ,oDACE,YACE,uCAIJ,yBA3BF,YA4BI,yCAGF,eACE,aACA,iDAEA,aZ12Fc,qBYi3FpB,eACE,gBACA,2BAEA,iBACE,aACA,wBAGF,kBACE,yBAGF,oBACE,gBACA,yBACA,yBACA,eAIJ,aACE,sBACA,WACA,SACA,WZx5FM,gBECA,aU05FN,oBACA,eACA,gBACA,SACA,UACA,kBACA,qBAEA,SACE,qCAGF,cAnBF,cAoBI,oDAIJ,uBACE,YACA,6CACA,uBACA,sBACA,WACA,0DAEA,sBACE,0DAKJ,uBACE,2BACA,gDAGF,aZ76FsB,6BY+6FpB,uDAGF,aZ/7F0B,cYm8F1B,YACE,eACA,yBACA,kBACA,cZ77FgB,gBY+7FhB,qBACA,gBACA,uBAEA,QACE,OACA,kBACA,QACA,MAIA,iDAHA,YACA,uBACA,mBAUE,CATF,0BAEA,yBACE,kBACA,iBACA,cAIA,sDAGF,cAEE,cZx9FiB,uBY09FjB,SACA,cACA,qBACA,eACA,iBACA,sMAEA,UVh/FE,yBUu/FJ,cACE,kBACA,YACA,eAKN,cACE,qBAEA,kBACE,oBAIJ,cACE,cACA,qBACA,WACA,YACA,SACA,2BAIA,UACE,YACA,qBAIJ,aACE,gBACA,kBACA,cZ7gGkB,gBY+gGlB,uBACA,mBACA,qBACA,uBAGF,aACE,gBACA,2BACA,2BAGF,aZ3hGoB,oBY+hGpB,aACE,eACA,eACA,gBACA,uBACA,mBACA,qBAGF,cACE,mBACA,kBACA,yBAEA,cACE,kBACA,yBACA,QACA,SACA,+BACA,yBAIJ,aACE,6CAEA,UACE,mDAGF,yBACE,6CAGF,mBACE,sBAIJ,oBACE,kCAEA,QACE,4CAIA,oBACA,0CAGF,kBACE,0CAGF,aACE,6BAIJ,wBACE,2BAGF,yBACE,cACA,SACA,WACA,YACA,oBACA,CADA,8BACA,CADA,gBACA,sBACA,wBACA,YAGF,aACE,cZ3mGgB,6BY6mGhB,SACA,kBACA,kBACA,oBACA,SACA,aACA,sBACA,WACA,WACA,qBACA,kBAEA,kBACE,WAIJ,+BACE,yBAGF,iBACE,eACA,gBACA,cZroGgB,mBAbG,eYqpGnB,aACA,cACA,sBACA,mBACA,uBACA,aACA,qEAGE,aAEE,WACA,aACA,SACA,yCAIJ,gBACE,gCAGF,eACE,uCAEA,aACE,mBACA,cZnqGY,qCYuqGd,cACE,gBACA,yBAKN,iBACE,cACA,UACA,gCAEA,sCACE,uCAEA,aACE,WACA,kBACA,aACA,OACA,QACA,cACA,UACA,oBACA,YACA,UACA,gFACA,wCAIJ,SACE,kBACA,gBAIJ,YACE,eACA,mBACA,cACA,eACA,kBACA,UACA,UACA,gBACA,2BACA,4BACA,uBAEA,QACE,SACA,yBACA,cACA,uBACA,aACA,gBACA,uBACA,gBACA,mBACA,OACA,4CAGF,aZjvGwB,4CYsvGtB,aZtvGsB,yCYwvGpB,4CAIJ,SAEE,yBAIJ,WACE,aACA,uBAGF,kBACE,iCAGF,iBACE,wBAGF,kBACE,SACA,cZxwGkB,eY0wGlB,eACA,eACA,8BAEA,aACE,CAKA,kEAEA,UVnyGI,mBUqyGF,6BAKN,eACE,gBACA,gBACA,cZhyGkB,0DYkyGlB,UACA,UACA,kBACA,uCAEA,YACE,WACA,uCAGF,iBACE,gCAGF,QACE,uBACA,SACA,6BACA,cACA,mCAIJ,kBACE,aACA,mCAIA,aZ/zGkB,0BYi0GhB,gCAIJ,WACE,4DAEA,cACE,uEAEA,eACE,WAKN,oBACE,UACA,oBACA,kBACA,cACA,SACA,uBACA,eACA,sBAGF,oBACE,iBACA,oBAGF,aZh2GkB,eYk2GhB,gBACA,yBACA,iBACA,kBACA,QACA,SACA,+BACA,yBAEA,aACE,WACA,CACA,0BACA,oBACA,mBACA,4BAIJ,iBACE,QACA,SACA,+BACA,WACA,YACA,sBACA,6BACA,CACA,wBACA,kBACA,2CAGF,2EACE,CADF,mEACE,8CAGF,4EACE,CADF,oEACE,qCAGF,GACE,sBACE,KAGF,2BACE,KAGF,2BACE,KAGF,yBACE,IAGF,wBACE,EArBF,4BAGF,GACE,sBACE,KAGF,2BACE,KAGF,2BACE,KAGF,yBACE,IAGF,wBACE,uCAIJ,GACE,wBACE,KAGF,0BACE,KAGF,2BACE,KAGF,uBACE,IAGF,sBACE,EAtBA,6BAIJ,GACE,wBACE,KAGF,0BACE,KAGF,2BACE,KAGF,uBACE,IAGF,sBACE,mCAIJ,GACE,OACE,SACA,yBACA,KAGF,wBACE,KAGF,UACE,YACA,6BACA,kBACA,UACA,IAGF,UACE,YACA,eACA,UACA,6BACA,EA5BA,yBAIJ,GACE,OACE,SACA,yBACA,KAGF,wBACE,KAGF,UACE,YACA,6BACA,kBACA,UACA,IAGF,UACE,YACA,eACA,UACA,6BACA,kCAIJ,GACE,gBACA,aACA,aAPE,wBAIJ,GACE,gBACA,aACA,gCAGF,kBACE,gBVz+GM,WACA,eU2+GN,aACA,sBACA,YACA,uBACA,eACA,kBACA,kBACA,YACA,gBAGF,eVv/GQ,cFcY,SY4+GlB,UACA,WACA,YACA,kBACA,wBACA,CADA,oBACA,CADA,eACA,iEAEA,SAGE,cACA,yBAIJ,aACE,eACA,yBAGF,aACE,eACA,gBACA,iBAGF,KACE,OACA,WACA,YACA,kBACA,YACA,2BAEA,aACE,SACA,QACA,WACA,YACA,6BAGF,mBACE,yBAGF,YACE,0BAGF,aACE,uBACA,WACA,YACA,SACA,iCAEA,oBACE,0BACA,kBACA,iBACA,WVtjHE,gBUwjHF,eACA,+LAMA,yBACE,mEAKF,yBACE,6BAMR,kBACE,iBAGF,kBACE,6BACA,gCACA,aACA,mBACA,eACA,kDAGF,aAEE,kBACA,yBAGF,kBACE,aACA,2BAGF,aZvlHoB,eYylHlB,cACA,gBACA,mBACA,kDAIA,kBACE,oDAIA,SEtmHF,sBACA,WACA,SACA,gBACA,oBACA,mBdhBmB,cAYD,ecOlB,SACA,+EFgmHI,aACE,CEjmHN,qEFgmHI,aACE,CEjmHN,yEFgmHI,aACE,CEjmHN,gEFgmHI,aACE,sEAGF,QACE,yLAGF,mBAGE,0DAGF,kBACE,qCAGF,mDArBF,cAsBI,yDAIJ,aZ9nHc,iBYgoHZ,eACA,4DAGF,gBACE,wDAGF,kBACE,gEAEA,cACE,iNAEA,kBAGE,cACA,gHAKN,aZxpHgB,0HY6pHhB,cAEE,gBACA,cZ/pHY,kZYkqHZ,aAGE,gEAIJ,wBACE,iDAGF,eV3rHI,kBY0BN,CAEA,eACA,cdRiB,uCcUjB,UF8pHI,mBZ1rHoB,oDc8BxB,wBACE,cdbe,ecef,gBACA,mBACA,oDAGF,aACE,oDAGF,kBACE,oDAGF,eACE,WdnDI,sDYksHJ,WACE,mDAGF,UZtsHI,kBYwsHF,eACA,8HAEA,kBAEE,iCAON,kBACE,mBAIJ,UVxtHQ,kBU0tHN,cACA,mBACA,sBV7tHM,yBU+tHN,eACA,gBACA,YACA,kBACA,WACA,yBAEA,SACE,iBAIJ,aACE,iBACA,wBAGF,aZluHoB,qBYouHlB,mBACA,gBACA,sBACA,6EAGF,aZzuHkB,mBAbG,kBY2vHnB,aACA,eACA,gBACA,eACA,aACA,cACA,mBACA,uBACA,yBAEA,4EAfF,cAgBI,6FAGF,eACE,mFAGF,aZ1wHwB,qBY4wHtB,qGAEA,yBACE,uCAKN,kBACE,aACA,eAGF,qBACE,8BAGF,GACE,kBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,oBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,kBACE,2CACA,CADA,kCACA,EA1BF,qBAGF,GACE,kBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,oBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,kBACE,2CACA,CADA,kCACA,mCAIJ,8BACE,2DACA,CADA,kDACA,iCAGF,MACE,sBAEE,0BACA,KAGF,sBACE,aAGF,uBAGE,aAGF,sBAGE,KAGF,uBACE,KAGF,sBACE,EA/BF,wBAGF,MACE,sBAEE,0BACA,KAGF,sBACE,aAGF,uBAGE,aAGF,sBAGE,KAGF,uBACE,KAGF,sBACE,kCAIJ,yBACE,8EACA,CADA,qEACA,8BAGF,eVt2HQ,kBUw2HN,sCACA,kBACA,eACA,UACA,iDAEA,2BACE,2DAGF,UACE,mCAIJ,iBACE,SACA,WACA,eACA,yCAGF,iBACE,UACA,SACA,UACA,gBVl4HM,kBUo4HN,sCACA,gBACA,gDAEA,aACE,eACA,SACA,gBACA,uBACA,iKAEA,+BAGE,2DAIJ,WACE,wBAKF,2BACE,cAIJ,kBACE,0BACA,aACA,YACA,uBACA,OACA,UACA,kBACA,MACA,kBACA,WACA,aACA,gBAEA,mBACE,oBAIJ,WACE,aACA,aACA,sBACA,kBACA,YACA,0BAGF,iBACE,MACA,QACA,SACA,OACA,WACA,kBACA,mBZn8HmB,kCYq8HnB,uBAGF,MACE,aACA,mBACA,uBACA,cZ97HqB,eYg8HrB,gBACA,0BACA,kBACA,kBAGF,YACE,cZl8HmB,gBYo8HnB,aACA,sBAEA,cACE,kBACA,uBAGF,cACE,yBACA,gBACA,cACA,0BAIJ,aACE,4BAGF,UACE,WACA,kBACA,mBVj9HsB,kBUm9HtB,eACA,2BAGF,iBACE,OACA,MACA,WACA,mBZ9+HmB,kBYg/HnB,eAGF,aACE,wBACA,UACA,eACA,0CAEA,mBAEE,mBAGF,8BACE,CADF,sBACE,WACA,cACA,SACA,WACA,YACA,CAQE,6GAKN,SACE,oBACA,CADA,WACA,6BAGF,iBACE,gBVliIM,uCUoiIN,kBACA,iBACA,gBACA,iCAEA,yBACE,oCAGF,sBACE,2BAIJ,UZnjIQ,aYqjIN,eACA,aACA,kEAEA,kBZ7iImB,WEXb,UU4jIJ,CV5jII,4RUikIF,UVjkIE,wCUukIN,kBACE,iCAIJ,YACE,mBACA,uBACA,kBACA,oCAGF,aACE,cZhkImB,2CYmkInB,eACE,cACA,WZ1lII,CY+lIA,wQADF,eACE,mDAON,eVrmIM,0BUumIJ,qCACA,gEAEA,eACE,0DAGF,kBZnmIiB,uEYsmIf,UVjnIE,uDUunIN,yBACE,sDAGF,aACE,sCACA,SAIJ,iBACE,gBAGF,SEznIE,sBACA,WACA,SACA,gBACA,oBACA,mBdhBmB,cAYD,ecOlB,SACA,cFmnIA,CACA,2BACA,iBACA,eACA,2CAEA,aACE,CAHF,iCAEA,aACE,CAHF,qCAEA,aACE,CAHF,4BAEA,aACE,kCAGF,QACE,6EAGF,mBAGE,sBAGF,kBACE,qCAGF,eA3BF,cA4BI,kCAKF,QACE,qDAGF,mBAEE,mBAGF,iBACE,SACA,WACA,UACA,qBACA,UACA,0BACA,sCACA,eACA,WACA,YACA,cZ3qImB,eY6qInB,oBACA,0BAEA,mBACE,WACA,0BAIJ,uBACE,iCAEA,mBACE,uBACA,gCAIJ,QACE,uBACA,cZ/rIkB,eYisIlB,uCAEA,uBACE,sCAGF,aACE,yBAKN,aZhtIkB,mBYktIhB,aACA,gBACA,eACA,eACA,6BAEA,oBACE,iBACA,0BAIJ,iBACE,6BAEA,kBACE,gCACA,eACA,aACA,aACA,gBACA,eACA,cZxuIc,iCY2uId,oBACE,iBACA,8FAIJ,eAEE,0BAIJ,aACE,aACA,cZxvIqB,qBY0vIrB,+FAEA,aAGE,0BACA,uBAIJ,YACE,cZvwIkB,kBYywIlB,aAGF,iBACE,8BACA,oBACA,aACA,sBAGF,cACE,MACA,OACA,QACA,SACA,0BACA,wBAGF,cACE,MACA,OACA,WACA,YACA,aACA,sBACA,mBACA,uBACA,2BACA,aACA,oBACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,oBAGF,mBACE,aACA,aACA,yBAGF,eACE,iBACA,yBAGF,UACE,cAGF,UACE,YACA,kBACA,qCAEA,UACE,YACA,aACA,mBACA,uBACA,2CAEA,cVjyI0B,eAEC,CU2yI7B,8CALF,iBACE,MACA,OACA,QACA,SAYA,CAXA,yBAQA,mBACA,8BACA,oBACA,4BAEA,mBACE,0DAGF,SACE,4DAEA,mBACE,mBAKN,yBACE,sBACA,SACA,WV73IM,eU+3IN,aACA,mBACA,eACA,cACA,cACA,kBACA,kBACA,MACA,SACA,yBAGF,MACE,0BAGF,OACE,CASA,4CANF,UACE,kBACA,kBACA,OACA,YACA,oBAUA,6BAEA,WACE,sBAGF,mBACE,qBACA,gBACA,cZx6IsB,mFY26ItB,yBAGE,wBAKN,oBACE,sBAGF,qBV17IQ,YU47IN,WACA,kBACA,YACA,UACA,SACA,YACA,8BAGF,wBZj8I0B,qBYq8I1B,iBACE,UACA,QACA,YACA,6CAGF,kBZ78I0B,WAJlB,kBYs9IN,gBACA,aACA,sBACA,oBAGF,WACE,WACA,gBACA,iBACA,kBACA,wBAEA,iBACE,MACA,OACA,WACA,YACA,sBACA,aACA,aACA,CAGA,YACA,UACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,2CANA,qBACA,mBACA,uBAaF,CATE,mBAIJ,YACE,CAGA,iBACA,mDAGF,aAEE,mBACA,aACA,aACA,2DAEA,cACE,uLAGF,aZn/ImB,SYs/IjB,eACA,gBACA,kBACA,oBACA,YACA,aACA,kBACA,6BACA,+mBAEA,aAGE,yBACA,qiBAGF,UZ5hJI,qwDYgiJF,aAGE,sBAMR,sBACE,eAGF,iBACE,eACA,mBACA,sBAEA,eACE,WZnjJI,kBYqjJJ,yBACA,eACA,qBAGF,kBZxjJmB,cAcE,gBY6iJnB,aACA,kBACA,kBAIJ,oBACE,eACA,gBACA,iBACA,wFAGF,kBAME,WZhlJM,kBYklJN,gBACA,eACA,YACA,kBACA,sBACA,4NAEA,aACE,eACA,mBACA,wLAGF,WACE,UACA,kBACA,SACA,WACA,kRAGF,UACE,wBAKF,eV5mJM,CFGkB,gBY4mJtB,oBACA,iEVhnJI,2BFGkB,yBYqnJ1B,iBACE,aACA,iCAEA,wBACE,CADF,qBACE,CADF,oBACE,CADF,gBACE,gBACA,2GAIJ,YAIE,8BACA,mBZpoJwB,aYsoJxB,iBACA,2HAEA,aACE,iBACA,cZ1nJiB,mBY4nJjB,2IAGF,aACE,6BAIJ,cACE,2BAGF,WACE,eACA,0BAGF,gBAEE,sDAGF,qBAEE,eAGF,UACE,gBACA,0BAGF,YACE,6BACA,qCAEA,yBAJF,cAKI,gBACA,iDAIJ,qBAEE,UACA,qCAEA,+CALF,UAMI,sDAIJ,aAEE,gBACA,gBACA,gBACA,kBACA,2FAEA,aZxsJwB,iLY4sJxB,UZjtJM,qCYstJN,oDAjBF,eAkBI,sCAKF,4BADF,eAEI,yBAIJ,YACE,+BACA,gBACA,0BAEA,cACE,iBACA,mBACA,sCAGF,aACE,sBACA,WACA,CACA,UZhvJI,gBECA,aUkvJJ,oBACA,eACA,YACA,CACA,SACA,kBACA,yBACA,iBACA,gBACA,gBACA,4CAEA,wBACE,+CAGF,eVlwJI,yBUowJF,mBACA,kBACA,6DAEA,QACE,gBACA,gBACA,mEAEA,QACE,0DAIJ,UZnxJE,oBYqxJA,eACA,gBVrxJA,+CU0xJJ,YACE,8BACA,mBACA,4CAIJ,aACE,WZnyJI,eYqyJJ,gBACA,mBACA,wCAGF,eACE,mBACA,+CAEA,UZ9yJI,eYgzJF,qCAIJ,uBAnFF,YAoFI,eACA,QACA,wCAEA,iBACE,iBAKN,eACE,eACA,wBAEA,eACE,iBACA,2CAGF,eACE,mBAGF,eACE,cACA,gBACA,+BAEA,4BACE,4BAGF,QACE,oCAIA,UZ11JE,aY41JA,kBACA,eACA,mBACA,qBACA,8EAEA,eAEE,yWAOA,kBZ/1JW,WEXb,uDUi3JA,iBACE,oMAUR,aACE,iIAIJ,4BAIE,cZj3JmB,eYm3JnB,gBACA,6cAEA,aAGE,6BACA,qGAIJ,YAIE,eACA,iIAEA,eACE,CAII,w1BADF,eACE,sDAMR,iBAEE,oDAKA,eACE,0DAGF,eACE,mBACA,aACA,mBACA,wEAEA,UZt7JI,CYw7JF,gBACA,uBAKN,YACE,2CAEA,QACE,WACA,cAIJ,wBZl8J0B,WYo8JxB,kBACA,MACA,OACA,aACA,6BAGF,aACE,kBACA,WVj9JM,0BUm9JN,WACA,SACA,gBACA,kBACA,eACA,gBACA,UACA,oBACA,WACA,4BACA,iBACA,wDAKE,SACE,uBAKN,eACE,6BAEA,UACE,kBAIJ,YACE,eACA,yBACA,kBACA,gBACA,gBACA,wBAEA,aACE,cZ5+Jc,iBY8+Jd,eACA,+BACA,aACA,sBACA,mBACA,uBACA,eACA,4BAEA,aACE,wBAIJ,eACE,CACA,qBACA,aACA,sBACA,uBACA,2BAEA,aACE,cACA,0BAGF,oBACE,cZ1gKY,gBY4gKZ,gCAEA,yBACE,0BAKN,QACE,eACA,iDAEA,SACE,cACA,8BAGF,aZ7hKc,gBYqiKhB,cACA,CACA,iBACA,CACA,UACA,qCANF,qBACE,CACA,eACA,CACA,iBAYA,CAVA,qBAGF,QACE,CACA,aACA,WACA,CACA,iBAEA,qEAGE,cACE,MACA,gCAKN,cACE,cACA,qBACA,cZhkKqB,kBYkkKrB,UACA,mEAEA,WAEE,WACA,CAIA,2DADF,mBACE,CADF,8BACE,CADF,gBV3lKM,CU4lKJ,wBAIJ,UACE,YACA,CACA,iBACA,MACA,OACA,UACA,gBVvmKM,iCU0mKN,YACE,sBAIJ,WACE,gBACA,kBACA,WACA,qCAGF,cACE,YACA,oBACA,CADA,8BACA,CADA,gBACA,kBACA,QACA,2BACA,WACA,UACA,sCAGF,0BACE,2BACA,gBACA,kBACA,qKAMA,WAEE,mFAGF,WACE,eAKJ,qBACE,kBACA,mBACA,kBACA,oBACA,cACA,wBAEA,eACE,YACA,yBAGF,cACE,kBACA,gBACA,gCAEA,UACE,cACA,kBACA,6BACA,WACA,SACA,OACA,oBACA,qCAIJ,oCACE,iCAGF,wBACE,uCAIA,mBACA,mBACA,6BACA,0BACA,eAIJ,eACE,kBACA,gBVvsKM,eUysKN,kBACA,sBACA,cACA,wBAEA,eACE,sBACA,qBAGF,SACE,qBAGF,eACE,gBACA,UACA,0BAGF,oBACE,sBACA,SACA,gCAEA,wBACE,0BACA,qBACA,sBACA,UACA,4BAKF,qBACE,CADF,gCACE,CADF,kBACE,kBACA,QACA,2BACA,yBAIJ,iBACE,UACA,SACA,OACA,QACA,sBACA,iFACA,eACA,UACA,4BACA,gCAEA,SACE,6EAKF,iBAEE,wBAIJ,YACE,kBACA,MACA,OACA,WACA,YACA,UACA,SACA,gBVpxKI,cFcY,gBYywKhB,oBACA,+BAEA,aACE,oBACA,8GAEA,aAGE,+BAIJ,aACE,eACA,kCAGF,aACE,eACA,gBACA,4BAIJ,YACE,8BACA,oBACA,0DAEA,aACE,wBAIJ,cACE,mBACA,gBACA,uBACA,oCAGE,cACE,qCAKF,eACE,+BAIJ,sBACE,iBACA,eACA,SACA,0BACA,8GAEA,UVn1KE,+EU21KN,cAGE,gBACA,6BAGF,UVl2KM,iBUo2KJ,yBAGF,oBACE,aACA,mDAGF,UV52KM,uBUi3KN,cACE,YACA,eACA,8BAEA,UACE,WACA,+BAOA,6DANA,iBACA,cACA,kBACA,WACA,UACA,YAWA,CAVA,+BASA,kBACA,+BAGF,iBACE,UACA,kBACA,WACA,YACA,YACA,UACA,4BACA,mBACA,sCACA,oBACA,qBAIJ,gBACE,uBAEA,oBACE,eACA,gBACA,WVj6KE,sFUo6KF,yBAGE,qBAKN,cACE,YACA,kBACA,4BAEA,UACE,WACA,+BACA,kBACA,cACA,kBACA,WACA,SACA,2DAGF,aAEE,kBACA,WACA,kBACA,SACA,mBACA,6BAGF,6BACE,6BAGF,iBACE,UACA,UACA,kBACA,WACA,YACA,QACA,iBACA,4BACA,mBACA,sCACA,oBACA,CAGE,yFAKF,SACE,6GAQF,gBACE,oBACA,kBAON,UACE,cACA,+BACA,0BAEA,UACE,qCAGF,iBATF,QAUI,mBAIJ,qBACE,mBACA,uBAEA,YACE,kBACA,mBACA,gBACA,2BAEA,aACE,WACA,YACA,SACA,oBACA,CADA,8BACA,CADA,gBACA,uBAIJ,YACE,mBACA,mBACA,aACA,6BAEA,aACE,aACA,mBACA,qBACA,gBACA,qCAGF,UACE,eACA,cACA,+BAGF,aACE,WACA,YACA,gBACA,mCAEA,UACE,YACA,cACA,SACA,kBACA,mBACA,oBACA,CADA,8BACA,CADA,gBACA,qCAIJ,gBACE,gBACA,4CAEA,cACE,WV3jLF,gBU6jLE,gBACA,uBACA,0CAGF,aACE,eACA,cZvjLU,gBYyjLV,gBACA,uBACA,yBAKN,kBZ5kLiB,aY8kLf,mBACA,uBACA,gDAEA,YACE,cACA,eACA,mDAGF,qBACE,kBACA,gCACA,WACA,gBACA,mBACA,gBACA,uBACA,qDAEA,YACE,iEAEA,cACE,sDAIJ,YACE,6BAOV,YACE,eACA,gBACA,wBAGF,QACE,sBACA,cACA,kBACA,kBACA,gBACA,WACA,+BAEA,iBACE,QACA,SACA,+BACA,eACA,sDAIJ,kBAEE,gCACA,eACA,aACA,cACA,oEAEA,kBACE,SACA,SACA,6HAGF,aAEE,cACA,cZ/oLgB,eYipLhB,eACA,gBACA,kBACA,qBACA,kBACA,WACA,mBACA,yJAEA,aZxpLmB,qWY2pLjB,aAEE,WACA,kBACA,SACA,SACA,QACA,SACA,2BACA,CAEA,4CACA,CADA,kBACA,CADA,wBACA,iLAGF,WACE,6CACA,8GAKN,kBACE,gCACA,qSAKI,YACE,iSAGF,4CACE,cAOV,kBZltLqB,sBYqtLnB,iBACE,4BAGF,aACE,eAIJ,cACE,kBACA,qBACA,cACA,iBACA,eACA,mBACA,gBACA,uBACA,eACA,oEAEA,YAEE,sBAGF,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,8BAEA,oBACE,mBACA,2BAKN,eACE,gBAGF,eVxwLQ,kBY0BN,CACA,sBACA,gBACA,cdRiB,uCcUjB,mBAEA,wBACE,cdbe,ecef,gBACA,mBACA,mBAGF,aACE,mBAGF,kBACE,mBAGF,eACE,WdnDI,UY6wLR,iBACE,cAEA,WACE,WACA,sCACA,CADA,6BACA,cAGF,cACE,iBACA,cZxwLmB,gBY0wLnB,gBAEA,aZvxLsB,0BYyxLpB,sBAEA,oBACE,4BAMR,GACE,cACA,eACA,WATM,mBAMR,GACE,cACA,eACA,qEAGF,kBAIE,sBAEE,8BACA,iBAGF,0BACE,kCACA,+BAIA,qDACE,uEACA,+CAGF,sBACE,8BACA,6DAIA,6BACE,6CACA,4EAIF,6BACE,6CACA,+CAOJ,gBAEE,+BAGF,gBACE,6CAEA,0BACE,wDAGF,eACE,6DAGF,iBACE,iBACA,2EAIA,mBACE,UACA,gCACA,WACA,0FAGF,mBACE,UACA,oCACA,eAOV,UACE,eACA,gBACA,iBAEA,YACE,gBACA,eACA,kBACA,sCAGF,YACE,4CAEA,kBACE,yDAGF,SACE,sBACA,cACA,WACA,SACA,aACA,gDACA,mBZt5Le,WEDb,eU05LF,CACA,eACA,kBACA,2EAEA,QACE,wMAGF,mBAGE,+DAGF,kBACE,qCAGF,wDA7BF,cA8BI,4DAIJ,WACE,eACA,gBACA,SACA,kBACA,sBAMJ,sBACA,mBACA,6BACA,gCACA,+BAEA,iBACE,iBACA,cZv7Lc,CY07Ld,eACA,eACA,oCAEA,aACE,gBACA,uBACA,oCAIJ,UACE,kBACA,uDAGF,iBACE,qDAGF,eACE,qBAKF,wBACA,aACA,2BACA,mBACA,mBACA,2BAEA,aACE,iCAEA,UACE,uCAEA,SACE,kCAKN,aACE,cACA,mBAIJ,cACE,kBACA,MACA,OACA,WACA,YACA,0BACA,cAGF,kBZpgMqB,sBYsgMnB,kBACA,uCACA,YACA,gBACA,qCAEA,aARF,SASI,kBAGF,cACE,mBACA,gBACA,eACA,kBACA,0BACA,6BAGF,WACE,6BAGF,yBACE,sCAEA,uBACE,uCACA,wBACA,wBAIJ,eACE,kDAIA,oBACE,+BAIJ,cACE,sBAGF,eACE,aAIJ,kBZ1jMqB,sBY4jMnB,kBACA,uCACA,YACA,gBACA,qCAEA,YARF,SASI,uBAGF,kBACE,oBAGF,kBACE,YACA,0BACA,gBACA,mBAGF,YACE,gCACA,4BAGF,YACE,iCAGF,aACE,gBACA,qBACA,eACA,aACA,cAIJ,iBACE,YACA,gBACA,YACA,aACA,uBACA,mBACA,gBV5mMM,yDU+mMN,aAGE,gBACA,WACA,YACA,SACA,sBACA,CADA,gCACA,CADA,kBACA,gBVvnMI,uBU2nMN,iBACE,YACA,aACA,+BACA,iEACA,kBACA,wCACA,uBAGF,iBACE,WACA,YACA,MACA,OACA,uBAGF,iBACE,YACA,WACA,UACA,YACA,4BACA,6BAEA,UACE,8BAGF,UVxpMI,eU0pMF,gBACA,cACA,kBACA,2BAGF,iBACE,mCACA,qCAIJ,oCACE,eAEE,uBAGF,YACE,4BAKN,aZrqMoB,eYuqMlB,gBACA,gBACA,kBACA,qBACA,6BAEA,kBACE,wCAEA,eACE,6BAIJ,aACE,0BACA,mCAEA,oBACE,kBAKN,eACE,2BAEA,UACE,8FAEA,8BAEE,CAFF,sBAEE,wBAIJ,iBACE,SACA,UACA,yBAGF,eACE,aACA,kBACA,mBACA,6BAEA,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,uBAIJ,iBACE,mBACA,YACA,gCACA,+BAEA,aACE,cACA,WACA,iBACA,gDAEA,kBACE,yBACA,wBAKN,YACE,uBACA,gBACA,iBACA,iCAEA,YACE,mBACA,iBACA,gBACA,8CAEA,wBACE,kBACA,uBACA,YACA,yCAGF,YACE,8BAIJ,WACE,4CAEA,kBACE,wCAGF,UACE,YACA,iCAGF,cACE,iBACA,WVtyMA,gBUwyMA,gBACA,mBACA,uBACA,uCAEA,aACE,eACA,cZlyMU,gBYoyMV,gBACA,uBACA,gCAKN,aACE,uBAIJ,eACE,cACA,iDAGE,qBACA,WVn0ME,gDUu0MJ,QACE,6BACA,kDAEA,aACE,yEAGF,uBACE,4DAGF,aVl1MU,yBUw1Md,cACE,gCAEA,cACE,cZh1Mc,eYk1Md,kCAEA,oBACE,cZr1MY,qBYu1MZ,iBACA,gBACA,yCAEA,eACE,WVz2MF,iBUk3MN,aZp2MgB,mBYs2Md,gCACA,gBACA,aACA,eACA,eACA,qBAEA,oBACE,iBACA,eAIJ,YACE,mBACA,aACA,gCACA,0BAEA,eACE,qBAGF,aACE,cZ93MY,gBYg4MZ,uBACA,mBACA,4BAEA,eACE,uBAGF,aZz4Mc,qBY24MZ,eACA,gBACA,cACA,gBACA,uBACA,mBACA,qGAKE,yBACE,wBAMR,aACE,eACA,iBACA,gBACA,iBACA,mBACA,gBACA,cZl6MiB,0BYs6MnB,aACE,WACA,2CAEA,mCACE,yBACA,0CAGF,wBACE,eAMR,YACE,gCACA,CACA,iBACA,qBAEA,kBACE,UACA,uBAGF,aACE,CACA,sBACA,kBACA,eACA,uBAGF,oBACE,mBZr9MsB,kBYu9MtB,cACA,eACA,wBACA,wBAGF,aACE,CACA,0BACA,gBACA,8BAEA,eACE,aACA,2BACA,8BACA,uCAGF,cACE,cZl+Mc,kBYo+Md,+BAGF,aZv+MgB,eYy+Md,mBACA,gBACA,uBACA,kBACA,gBACA,YACA,iCAEA,UV9/ME,qBUggNA,oHAEA,yBAGE,0BAKN,qBACE,uBAIJ,kBACE,6BAEA,kBACE,oDAGF,eACE,6DAGF,UV1hNI,gBUgiNR,kBACE,eACA,aACA,qBACA,0BAEA,WACE,cACA,qCAEA,yBAJF,YAKI,4BAIJ,wBACE,cACA,kBACA,qCAEA,0BALF,UAMI,uBAIJ,qBACE,WACA,aACA,kBACA,eACA,iBACA,qBACA,gBACA,gBACA,gBACA,aACA,sBACA,6BAEA,aACE,gBACA,mBACA,mBACA,8BAGF,iBACE,SACA,WACA,cACA,mBZ9kNoB,kBYglNpB,cACA,eACA,4BAIJ,YACE,cZ9kNgB,kBYglNhB,WACA,QACA,mDAIJ,YACE,oDAGF,UACE,gBAGF,YACE,eACA,mBACA,gBACA,iBACA,wBACA,sBAEA,aACE,mBACA,SACA,kBACA,WACA,eACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,cACA,aACA,mBACA,2BACA,2CACA,6BAEA,aACE,aACA,WACA,YACA,iCAEA,aACE,SACA,WACA,YACA,eACA,gBACA,sBACA,sBACA,CADA,gCACA,CADA,kBACA,6BAIJ,aACE,cACA,eACA,gBACA,kBACA,gBACA,cZ5oNc,mFYgpNhB,kBAGE,4BACA,2CACA,wGAEA,aACE,6BAIJ,0BACE,2CACA,yBACA,yDAEA,aACE,uCAKN,UACE,oCAGF,WACE,8BAGF,aZ/qNkB,SYirNhB,eACA,WACA,cACA,cACA,YACA,aACA,mBACA,WACA,2BACA,2CACA,2GAEA,SAGE,cACA,4BACA,2CACA,qCAKF,SACE,OGxtNN,eACE,eACA,UAEA,kBACE,kBACA,cAGF,iBACE,cACA,mBACA,WACA,aACA,sBAEA,kBfHiB,eeQnB,iBACE,aACA,cACA,iBACA,eACA,gBACA,qBAEA,oBACE,qBACA,yBACA,4BACA,oEAGF,YAEE,kCAGF,aACE,gCAGF,aACE,sBACA,WACA,eACA,WfhDE,UekDF,oBACA,gBblDE,yBaoDF,kBACA,iBACA,sCAEA,oBfpDoB,0BeyDtB,cACE,wBAGF,YACE,mBACA,iBACA,cAIJ,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,gBACA,mBACA,cACA,uBAEA,iBACE,qBAGF,oBb3FY,8EagGZ,oBAGE,iBACA,gCAGF,mBACE,SACA,wCAGF,mBAEE,eAIJ,oBACE,WACA,gBACA,cACA,cAGF,aACE,qBACA,oBAEA,cACE,eAIJ,eACE,mBACA,cfvHc,ae2HhB,cACE,uBACA,UACA,SACA,SACA,cfhIc,0BekId,kBACA,mBAEA,oBACE,sCAGF,qCAEE,eAIJ,WACE,eACA,kBACA,eACA,6BAIJ,4BACE,gCAEA,YACE,2CAGF,4BACE,aACA,aACA,mBACA,mGAEA,YAEE,+GAEA,oBflLoB,sDewLxB,cACE,gBACA,iBACA,YACA,oBACA,cfhLkB,sCemLlB,gCAGF,YACE,mBACA,8CAEA,aACE,wBACA,iBACA,oCAIJ,uBACE,CADF,oBACE,CADF,eACE,sBACA,eACA,WftNI,qBewNJ,WACA,UACA,oBACA,qXACA,yBACA,kBACA,CACA,yBACA,mDAGF,aACE,cAIJ,afzNkB,qBe4NhB,+BACE,6BAEA,6BACE,eChPN,k1BACE,aACA,sBACA,aACA,UACA,yBAGF,YACE,OACA,sBACA,yBACA,2BAEA,MACE,iBACA,qCAIJ,gBACE,YACE,cCtBJ,cACE,qBACA,WjBDM,2BiBIN,qBAEE,iBACA,+BAGF,WACE,iBAIJ,sBACE,6BAEA,uBACE,2BACA,4BACA,mBjBjBsB,4BiBqBxB,oBACE,8BACA,+BACA,aACA,qBAIJ,YACE,8BACA,cACA,cjBfmB,ciBiBnB,oBAGF,iBACE,OACA,kBACA,iBACA,gBACA,8BACA,eACA,0BAEA,aACE,6BAIJ,ajBlD0B,mCiBqDxB,aACE,oDAGF,WACE,wBAIJ,iBACE,YACA,OACA,WACA,WACA,yBjBnEwB,uBiBwExB,oBACE,WACA,eACA,yBAGF,iBACE,gBACA,oBAIJ,iBACE,aACA,gBACA,kBACA,gBf5FM,sBe8FN,sGAEA,+BAEE,oBAKF,2BACA,gBfxGM,0Be2GN,cACE,gBACA,gBACA,oBACA,cACA,WACA,gCACA,WjBnHI,yBiBqHJ,kBACA,4CAEA,QACE,2GAGF,mBAGE,wCAKN,cACE,6CAEA,SACE,kBACA,kBACA,qDAGF,SACE,WACA,kBACA,MACA,OACA,WACA,YACA,sCACA,mBACA,4BAIJ,SACE,kBACA,wBACA,gBACA,MACA,iCAEA,aACE,WACA,gBACA,gBACA,gBfpKI,mBeyKR,iBACE,qBACA,YACA,wBAEA,UACE,YACA,wBAIJ,cACE,kBACA,iBACA,cjBlKiB,mDiBqKjB,YACE,qDAGF,eACE,uDAGF,YACE,qBAIJ,YACE,YCrMF,qBACE,iBANc,cAQd,kBACA,sCAEA,WANF,UAOI,eACA,mBAIJ,iDACE,eACA,gBACA,gBACA,qBACA,clBPkB,oBkBUlB,alBnBwB,0BkBqBtB,6EAEA,oBAGE,wCAIJ,alBrBkB,oBkB0BlB,YACE,oBACA,+BAEA,eACE,yBAIJ,eACE,clBlCmB,qBkBsCrB,iBACE,clBvCmB,uBkB2CrB,eACE,mBACA,kBACA,kBACA,yHAGF,4CAME,mBACA,oBACA,gBACA,clB3DmB,qBkB+DrB,aACE,qBAGF,gBACE,qBAGF,eACE,qBAGF,gBACE,yCAGF,aAEE,qBAGF,eACE,qBAGF,kBACE,yCAMA,iBACA,iBACA,yDAEA,2BACE,yDAGF,2BACE,qBAIJ,UACE,SACA,SACA,gCACA,eACA,4BAEA,UACE,SACA,wBAIJ,UACE,yBACA,8BACA,CADA,iBACA,gBACA,mBACA,iEAEA,+BAEE,cACA,kBACA,gBACA,gBACA,clBxIc,iCkB4IhB,uBACE,gBACA,gBACA,clB9IY,qDkBkJd,WAEE,iBACA,kBACA,qBACA,mEAEA,SACE,kBACA,iFAEA,gBACE,kBACA,6EAGF,iBACE,SACA,UACA,mBACA,gBACA,uBACA,+BAMR,YACE,oBAIJ,kBACE,eACA,mCAEA,iBACE,oBACA,8BAGF,YACE,8BACA,eACA,6BAGF,UACE,kDACA,eACA,iBACA,WhBpNI,iBgBsNJ,kBACA,qEAEA,aAEE,6CAIA,alBhNiB,oCkBqNnB,4CACE,gBACA,eACA,iBACA,qCAGF,4BA3BF,iBA4BI,4BAIJ,iBACE,YACA,sBACA,mBACA,CACA,sBACA,0BACA,QACA,aACA,yCAEA,4CACE,eACA,iBACA,gBACA,clBlPc,mBkBoPd,mBACA,gCACA,uBACA,mBACA,gBACA,wFAEA,eAEE,cACA,2CAGF,oBACE,2BAKN,iBACE,mCAEA,UACE,YACA,CACA,kBACA,uCAEA,aACE,WACA,YACA,mBACA,iCAIJ,cACE,mCAEA,aACE,WhBzSA,qBgB2SA,uDAGE,yBACE,2CAKN,aACE,clBxSY,kCkBgTlB,iDAEE,CACA,eACA,eACA,iBACA,mBACA,clBvTgB,sCkB0ThB,alBnUsB,0BkBqUpB,kBAIJ,cACE,SACA,UACA,gBACA,uBACA,oBACA,kBACA,oBACA,cACA,kBAGF,4CACE,eACA,iBACA,gBACA,mBACA,clB/UmB,wBkBkVnB,iDACE,cACA,eACA,gBACA,cACA,kBAIJ,4CACE,eACA,iBACA,gBACA,mBACA,clBhWmB,kBkBqWnB,clBrWmB,mCkBoWrB,4CACE,CACA,gBACA,gBACA,mBACA,clBzWmB,kBkB8WnB,clB9WmB,kBkBuXnB,clBvXmB,mCkBsXrB,4CACE,CACA,gBACA,gBACA,mBACA,clB3XmB,kBkBgYnB,clBhYmB,mCkBwYrB,gBAEE,mDAEA,2BACE,mDAGF,2BACE,kBAIJ,eACE,kBAGF,kBACE,yCAGF,cAEE,kBAGF,UACE,SACA,SACA,4CACA,cACA,yBAEA,UACE,SACA,iDAIJ,YAEE,+BAGF,kBlBlcmB,kBkBocjB,kBACA,gBACA,sBACA,oCAEA,UACE,aACA,2BACA,iBACA,8BACA,mBACA,uDAGF,YACE,yBACA,qBACA,mFAEA,aACE,eACA,qCAGF,sDAVF,UAWI,8BACA,6CAIJ,MACE,sBACA,qCAEA,2CAJF,YAKI,sBAKN,iBACE,yBAEA,WACE,WACA,uBACA,4BAIJ,iBACE,mBACA,uCAEA,eACE,mCAGF,eACE,cACA,qCAGF,eACE,UACA,mDAEA,kBACE,aACA,iBACA,0FAKE,oBACE,gFAIJ,cACE,qDAIJ,aACE,cACA,6CAGF,UACE,YACA,0BACA,mDAGF,cACE,4DAEA,cACE,qCAKN,oCACE,eACE,sCAIJ,2BA7DF,iBA8DI,mFAIJ,qBAGE,mBlB3jBiB,kBkB6jBjB,kCACA,uBAGF,YACE,kBACA,WACA,YACA,2BAEA,YACE,WACA,uCAKF,YACE,eACA,mBACA,mBACA,qCAGF,sCACE,kBACE,uCAIJ,alB7kBmB,qCkBilBnB,eACE,WhBjmBE,gBgBmmBF,2CAEA,alBxlBc,gDkB2lBZ,alBzlBe,+CkB+lBnB,eACE,qBAIJ,kBACE,yBAEA,aACE,SACA,eACA,YACA,kBACA,qCAIJ,gDAEI,kBACE,yCAGF,eACE,gBACA,WACA,kBACA,uDAEA,iBACE,sCAMR,8BACE,aACE,uCAEA,gBACE,sDAGF,kBACE,6EAIJ,aAEE,qBAIJ,WACE,UAIJ,mBACE,qCAEA,SAHF,eAII,kBAGF,YACE,uBACA,mBACA,aACA,qBAEA,ShBvrBI,YgByrBF,qCAGF,gBAXF,SAYI,mBACA,sBAIJ,eACE,uBACA,gBACA,gBACA,uBAGF,eACE,gBACA,0BAEA,YACE,yBACA,gBACA,eACA,clBpsBc,6BkBwsBhB,eACE,iBACA,+BAGF,kBlBztBiB,akB2tBf,0BACA,aACA,uCAEA,YACE,gCAIJ,cACE,gBACA,uDAEA,YACE,mBACA,iDAGF,UACE,YACA,0BACA,gCAIJ,YACE,uCAEA,4CACE,eACA,gBACA,cACA,qCAGF,cACE,clBnvBY,uFkByvBlB,eACE,cASA,ClBnwBgB,2CkBgwBhB,iBACA,CACA,kBACA,gBAGF,eACE,cACA,aACA,kDACA,cACA,qCAEA,eAPF,oCAQI,cACA,8BAEA,UACE,aACA,sBACA,0CAEA,OACE,cACA,2CAGF,YACE,mBACA,QACA,cACA,qCAIJ,UACE,2BAGF,eACE,sCAIJ,eAtCF,UAuCI,6BAEA,aACE,gBACA,gBACA,2GAEA,eAGE,uFAIJ,+BAGE,2BAGF,YACE,gCAEA,eACE,qEAEA,eAEE,gBACA,2CAGF,eACE,SAQZ,iBACE,qBACA,iBAGF,aACE,kBACA,aACA,UACA,YACA,clB32BsB,qBkB62BtB,eACA,qCAEA,gBAVF,eAWI,WACA,gBACA,clBv2Bc,SmBhBlB,UACE,eACA,iBACA,yBACA,qBAEA,WAEE,iBACA,mBACA,6BACA,gBACA,mBACA,oBAGF,qBACE,gCACA,aACA,gBACA,oBAGF,eACE,qEAGF,kBnBxBmB,UmB6BnB,anB1BwB,0BmB4BtB,gBAEA,oBACE,eAIJ,eACE,CAII,4HADF,eACE,+FAOF,sBAEE,yFAKF,YAEE,gCAMJ,kBnBjEiB,6BmBmEf,gCACA,4CAEA,qBACE,8BACA,2CAGF,uBACE,+BACA,0BAKN,qBACE,gBAIJ,aACE,mBACA,MAGF,+CACE,0BAGF,sBACE,SACA,aACA,8CAGF,oBAEE,qBACA,iBACA,eACA,cnB/FkB,gBmBiGlB,0DAEA,UjBhHM,wDiBoHN,eACE,iBACA,sEAGF,cACE,yCAKF,YAEE,yDAEA,qBACE,iBACA,eACA,gBACA,qEAEA,cACE,2EAGF,YACE,mBACA,uFAEA,YACE,qHAOJ,sBACA,cACA,uBAIJ,wBACE,mBnB/JiB,sBmBiKjB,YACA,mBACA,gCAEA,gBACE,mBACA,oBAIJ,YACE,yBACA,aACA,mBnB9KiB,gCmBiLjB,aACE,gBACA,mBAIJ,wBACE,aACA,mBACA,qCAEA,wCACE,4BACE,0BAIJ,kBACE,iCAGF,kBnBtMiB,uCmByMf,kBACE,4BAIJ,gBACE,oBACA,sCAEA,SACE,wCAGF,YACE,mBACA,mCAGF,aACE,aACA,uBACA,mBACA,kBACA,6CAEA,UACE,YACA,kCAIJ,aACE,mCAGF,aACE,iBACA,cnBlOY,gBmBoOZ,mCAIJ,QACE,WACA,qCAEA,sBACE,gBACA,qCAOJ,4FAFF,YAGI,gCAIJ,aACE,uCAEA,iBACE,sCAGF,eACE,4BAIJ,wBACE,aACA,gBACA,qCAEA,2BALF,4BAMI,sCAIJ,+CACE,YACE,iBC7RN,YACE,uBACA,WACA,iBACA,iCAEA,gBACE,gBACA,oBACA,cACA,wCAEA,YACE,yBACA,mBpBfe,YoBiBf,yBAIJ,WAvBc,UAyBZ,oBACA,iCAEA,YACE,mBACA,YACA,uCAEA,aACE,yCAEA,oBACE,aACA,2CAGF,SlBxCA,YkB0CE,kBACA,YACA,uCAIJ,aACE,cpBpCY,qBoBsCZ,cACA,eACA,aACA,0HAIA,kBAGE,+BAKN,aACE,iBACA,YACA,aACA,qCAGF,sCACE,YACE,6BAIJ,eACE,0BACA,gBACA,mBACA,qCAEA,2BANF,eAOI,+BAGF,aACE,aACA,cpB9EY,qBoBgFZ,0BACA,2CACA,0BACA,mBACA,gBACA,uBACA,mCAEA,gBACE,oCAGF,UlBzGA,yBkB2GE,0BACA,2CACA,uCAGF,kBACE,sBACA,+BAIJ,kBACE,wBACA,SACA,iCAEA,QACE,kBACA,6DAIJ,UlBjIE,yBFWa,gBoByHb,gBACA,mEAEA,wBACE,6DAKN,yBACE,iCAIJ,qBACE,WACA,gBApJY,cAsJZ,sCAGF,uCACE,YACE,iCAGF,WA/JY,cAiKV,sCAIJ,gCACE,UACE,0BAMF,2BACA,qCAEA,wBALF,cAMI,CACA,sBACA,kCAGF,YACE,oBAEA,gCACA,0BAEA,eAEA,mBACA,8BACA,mCAEA,eACE,kBACA,yCAGF,mBACE,4DAEA,eACE,qCAIJ,gCAzBF,eA0BI,iBACA,6BAIJ,apBrMmB,eoBuMjB,iBACA,gBACA,qCAEA,2BANF,eAOI,6BAIJ,apBhNmB,eoBkNjB,iBACA,gBACA,mBACA,4BAGF,wBACE,eACA,gBACA,cpB7Nc,mBoB+Nd,kBACA,gCACA,4BAGF,cACE,cpBnOiB,iBoBqOjB,gBACA,0CAGF,UlBxPI,gBkB0PF,uFAGF,eAEE,gEAGF,aACE,4CAGF,cACE,gBACA,WlBxQE,oBkB0QF,iBACA,gBACA,gBACA,2BAGF,cACE,iBACA,cpBnQiB,mBoBqQjB,kCAEA,UlBtRE,gBkBwRA,CAII,2NADF,eACE,4BAMR,UACE,SACA,SACA,4CACA,cACA,mCAEA,UACE,SACA,qCAKN,eA9SF,aA+SI,iCAEA,YACE,yBAGF,UACE,UACA,YACA,iCAEA,YACE,4BAGF,YACE,8DAGF,eAEE,gCACA,gBACA,0EAEA,eACE,+BAIJ,eACE,6DAGF,2BpBxUe,YoB+UrB,UACE,SACA,cACA,WACA,sDAKA,apBtVkB,0DoByVhB,apBlWsB,4DoBuWxB,alB1Wc,gBkB4WZ,4DAGF,alB9WU,gBkBgXR,0DAGF,apBvWgB,gBoByWd,0DAGF,alBtXU,gBkBwXR,UAIJ,YACE,eACA,yBAEA,aACE,qBACA,oCAEA,kBACE,4BAGF,cACE,gBACA,+BAEA,oBACE,iBACA,gCAIJ,eACE,yBACA,eACA,CAII,iNADF,eACE,6CAKN,aACE,mBACA,2BAGF,oBACE,cpB3Zc,qBoB6Zd,yBACA,eACA,gBACA,gCACA,iCAEA,UlBhbE,gCkBkbA,oCAGF,apBjboB,gCoBmblB,CAkBJ,gBAIJ,aACE,iBACA,eACA,sBAGF,aACE,eACA,cACA,wBAEA,aACE,kBAIJ,YACE,eACA,mBACA,wBAGF,YACE,WACA,sBACA,aACA,+BAEA,aACE,qBACA,gBACA,eACA,iBACA,cpB/dmB,CoBoef,4MADF,eACE,sCAKN,aACE,gCAIJ,YAEE,mBACA,kEAEA,UACE,kBACA,4BACA,gFAEA,iBACE,kDAKN,aAEE,aACA,sBACA,4EAEA,cACE,WACA,kBACA,mBACA,uEAIJ,cAEE,iBAGF,YACE,eACA,kBACA,2CAEA,kBACE,eACA,8BAGF,kBACE,+CAGF,gBACE,uDAEA,gBACE,mBACA,YACA,YAKN,kBACE,eACA,cAEA,apBzjBwB,qBoB2jBtB,oBAEA,yBACE,SAKN,aACE,YAGF,gBACE,eACA,mBpB5kBmB,gCoB8kBnB,uBAEA,eACE,oBAGF,YACE,2BACA,mBACA,cpB3kBgB,eoB6kBhB,eACA,oBAGF,iBACE,4BAEA,aACE,SACA,kBACA,WACA,YACA,qBAIJ,2BACE,mBAGF,oBACE,uBAGF,apBpmBgB,sDoBwmBhB,apBvmBqB,qBoB2mBnB,gBACA,yDAIJ,oBAIE,cpBpnBqB,iGoBunBrB,eACE,yIAIA,4BACE,cACA,iIAGF,8BACE,CADF,sBACE,WACA,sBAKN,YAEE,mBACA,sCAEA,aACE,CACA,gBACA,kBACA,0DAIA,8BACE,CADF,sBACE,WACA,gBAKN,kBACE,8BACA,yBAEA,yBlB9qBc,yBkBkrBd,yBACE,wBAGF,yBlBnrBU,wBkBwrBR,2BACA,eACA,iBACA,4BACA,kBACA,gBACA,0BAEA,apBvrBgB,uBoB6rBhB,wBACA,qBAGF,apBhsBgB,coBqsBlB,kBpBltBqB,kBoBotBnB,mBACA,uBAEA,YACE,8BACA,mBACA,aACA,gCAEA,SACE,SACA,gDAEA,aACE,8BAIJ,aACE,gBACA,cpB5tBc,yBoB8tBd,iBACA,gCAEA,aACE,qBACA,iHAEA,aAGE,mCAIJ,alBvvBM,6BkB8vBR,YACE,2BACA,6BACA,mCAEA,kBACE,gFAGF,YAEE,cACA,sBACA,YACA,cpBjwBY,mLoBowBZ,kBAEE,gBACA,uBACA,sCAIJ,aACE,6BACA,4CAEA,apB/wBU,iBoBixBR,gBACA,wCAIJ,aACE,sBACA,WACA,aACA,qBACA,cpB5xBY,WoBmyBpB,kBAGE,0BAFA,eACA,uBASA,CARA,eAGF,oBACE,gBACA,CAEA,qBACA,oBAGF,YACE,eACA,CACA,kBACA,wBAEA,qBACE,cACA,mBACA,aACA,0FAGF,kBAEE,kBACA,YACA,6CAGF,QACE,SACA,+CAEA,aACE,sEAGF,uBACE,yDAGF,alB71BY,8CkBk2Bd,qBACE,aACA,WlBr2BI,ckB02BR,iBACE,qBAGF,wBACE,kBACA,2BAEA,cACE,mBpBl3BiB,gCoBo3BjB,kCAEA,cACE,cACA,gBACA,eACA,gBACA,cpB72BiB,qBoB+2BjB,mBACA,uHAEA,UlBj4BE,iCkBw4BJ,cACE,cpB33BY,uCoB+3Bd,YACE,8BACA,mBACA,sCAGF,eACE,sBCt5BN,YACE,eACA,CACA,kBACA,0BAEA,qBACE,iBACA,cACA,mBACA,yDAEA,YAEE,mBACA,kBACA,sBACA,YACA,4BAGF,oBACE,cACA,cACA,qGAEA,kBAGE,sDAKN,iBAEE,gBACA,eACA,iBACA,WnBrCI,6CmBuCJ,mBACA,iBACA,4BAGF,cACE,6BAGF,cACE,crBpCgB,kBqBsChB,gBACA,qBAIJ,YACE,eACA,cACA,yBAEA,gBACE,mBACA,6BAEA,aACE,sCAIJ,arBnEwB,gBqBqEtB,qBACA,UC3EJ,aACE,gCAEA,gBACE,eACA,mBACA,+BAGF,cACE,iBACA,8CAGF,aACE,kBACA,wBAGF,gBACE,iCAGF,aACE,kBACA,uCAGF,oBACE,gDAGF,SACE,YACA,8BAGF,cACE,iBACA,mEAGF,aACE,kBACA,2DAGF,cAEE,gBACA,mFAGF,cACE,gBACA,mCAGF,aACE,iBACA,yBAGF,kBACE,kBACA,4BAGF,UACE,UACA,wBAGF,aACE,kCAGF,MACE,WACA,cACA,mBACA,2CAGF,aACE,iBACA,0CAGF,gBACE,eACA,mCAGF,WACE,sCAGF,gBACE,gBACA,yCAGF,UACE,iCAGF,aACE,iBACA,0BAGF,SACE,WACA,0DAGF,iBAEE,mBACA,4GAGF,iBAEE,gBACA,uCAGF,kBACE,eACA,2BAGF,aACE,kBACA,wCAGF,SACE,YACA,yDAGF,SACE,WACA,CAKA,oFAGF,UACE,OACA,uGAGF,UAEE,uCAIA,cACE,iBACA,kEAEA,cACE,gBACA,qCAKN,WACE,eACA,iBACA,uCAGF,WACE,sCAGF,aACE,kBACA,0CAGF,gBACE,eACA,uDAGF,gBACE,2CAGF,cACE,iBACA,YACA,yEAGF,aAEE,iBACA,iBAGF,wBACE,iBAGF,SACE,oBACA,yBAGF,aACE,8EAGF,cAEE,gBACA,oDAGF,cACE,mBACA,gEAGF,iBACE,gBACA,CAMA,8KAGF,SACE,QACA,yDAGF,kBACE,eACA,uDAGF,kBACE,gBACA,qDAGF,SACE,QACA,8FAGF,cAEE,mBACA,4CAGF,UACE,SACA,kDAEA,UACE,OACA,kEACA,8BAIJ,sXACE,uCAGF,gBAEE,kCAGF,cACE,iBACA,gDAGF,UACE,UACA,gEAGF,aACE,uDAGF,WACE,WACA,uDAGF,UACE,WACA,uDAGF,UACE,WACA,kDAGF,MACE,0CAGF,iBACE,yBACA,qDAGF,cACE,iBACA,qCAGF,kCACE,gBAEE,kBACA,2DAEA,gBACE,mBACA,uEAKF,gBAEE,kBACA,gFAKN,cAEE,gBACA,6CAKE,eACE,eACA,sDAIJ,aACE,kBACA,4DAKF,cACE,gBACA,8DAGF,gBACE,eACA,mCAIJ,aACE,kBACA,iBACA,kCAGF,WACE,mCAGF,WACE,oCAGF,cACE,gBACA,gFAGF,cACE,mBACA,+DAGF,SACE,QACA,kkEC7ZJ,kIACE,CADF,sIACE,qBACA,2GCEQ,SACE,CDHV,iGCEQ,SACE,CDHV,qGCEQ,SACE,CDHV,4FCEQ,SACE,mJAQZ,aAME,0BACA,mMAEA,oBACE,iOAGF,yBACE,CAKE,0zCAIJ,oBAGE,uUAGF,axB3BqB,qBwB6BnB,oCAIJ,yBACE,6HAEA,oBAGE,4BAIJ,yBACE,qGAEA,oBAGE,eAIJ,axBvDoB,yEwB2DpB,+BACE,0D","file":"skins/vanilla/contrast/common.css","sourcesContent":["html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:\"\";content:none}table{border-collapse:collapse;border-spacing:0}html{scrollbar-color:#313543 rgba(0,0,0,.1)}::-webkit-scrollbar{width:12px;height:12px}::-webkit-scrollbar-thumb{background:#313543;border:0px none #fff;border-radius:50px}::-webkit-scrollbar-thumb:hover{background:#353a49}::-webkit-scrollbar-thumb:active{background:#313543}::-webkit-scrollbar-track{border:0px none #fff;border-radius:0;background:rgba(0,0,0,.1)}::-webkit-scrollbar-track:hover{background:#282c37}::-webkit-scrollbar-track:active{background:#282c37}::-webkit-scrollbar-corner{background:transparent}body{font-family:\"mastodon-font-sans-serif\",sans-serif;background:#191b22;font-size:13px;line-height:18px;font-weight:400;color:#fff;text-rendering:optimizelegibility;font-feature-settings:\"kern\";text-size-adjust:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-tap-highlight-color:transparent}body.system-font{font-family:system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"Oxygen\",\"Ubuntu\",\"Cantarell\",\"Fira Sans\",\"Droid Sans\",\"Helvetica Neue\",\"mastodon-font-sans-serif\",sans-serif}body.app-body{padding:0}body.app-body.layout-single-column{height:auto;min-height:100vh;overflow-y:scroll}body.app-body.layout-multiple-columns{position:absolute;width:100%;height:100%}body.app-body.with-modals--active{overflow-y:hidden}body.lighter{background:#282c37}body.with-modals{overflow-x:hidden;overflow-y:scroll}body.with-modals--active{overflow-y:hidden}body.player{text-align:center}body.embed{background:#313543;margin:0;padding-bottom:0}body.embed .container{position:absolute;width:100%;height:100%;overflow:hidden}body.admin{background:#1f232b;padding:0}body.error{position:absolute;text-align:center;color:#dde3ec;background:#282c37;width:100%;height:100%;padding:0;display:flex;justify-content:center;align-items:center}body.error .dialog{vertical-align:middle;margin:20px}body.error .dialog__illustration img{display:block;max-width:470px;width:100%;height:auto;margin-top:-120px}body.error .dialog h1{font-size:20px;line-height:28px;font-weight:400}button{font-family:inherit;cursor:pointer}button:focus{outline:none}.app-holder,.app-holder>div,.app-holder>noscript{display:flex;width:100%;align-items:center;justify-content:center;outline:0 !important}.app-holder>noscript{height:100vh}.layout-single-column .app-holder,.layout-single-column .app-holder>div{min-height:100vh}.layout-multiple-columns .app-holder,.layout-multiple-columns .app-holder>div{height:100%}.error-boundary,.app-holder noscript{flex-direction:column;font-size:16px;font-weight:400;line-height:1.7;color:#e25169;text-align:center}.error-boundary>div,.app-holder noscript>div{max-width:500px}.error-boundary p,.app-holder noscript p{margin-bottom:.85em}.error-boundary p:last-child,.app-holder noscript p:last-child{margin-bottom:0}.error-boundary a,.app-holder noscript a{color:#2b90d9}.error-boundary a:hover,.error-boundary a:focus,.error-boundary a:active,.app-holder noscript a:hover,.app-holder noscript a:focus,.app-holder noscript a:active{text-decoration:none}.error-boundary__footer,.app-holder noscript__footer{color:#c2cede;font-size:13px}.error-boundary__footer a,.app-holder noscript__footer a{color:#c2cede}.error-boundary button,.app-holder noscript button{display:inline;border:0;background:transparent;color:#c2cede;font:inherit;padding:0;margin:0;line-height:inherit;cursor:pointer;outline:0;transition:color 300ms linear;text-decoration:underline}.error-boundary button:hover,.error-boundary button:focus,.error-boundary button:active,.app-holder noscript button:hover,.app-holder noscript button:focus,.app-holder noscript button:active{text-decoration:none}.error-boundary button.copied,.app-holder noscript button.copied{color:#79bd9a;transition:none}.container-alt{width:700px;margin:0 auto;margin-top:40px}@media screen and (max-width: 740px){.container-alt{width:100%;margin:0}}.logo-container{margin:100px auto 50px}@media screen and (max-width: 500px){.logo-container{margin:40px auto 0}}.logo-container h1{display:flex;justify-content:center;align-items:center}.logo-container h1 svg{fill:#fff;height:42px;margin-right:10px}.logo-container h1 a{display:flex;justify-content:center;align-items:center;color:#fff;text-decoration:none;outline:0;padding:12px 16px;line-height:32px;font-family:\"mastodon-font-display\",sans-serif;font-weight:500;font-size:14px}.compose-standalone .compose-form{width:400px;margin:0 auto;padding:20px 0;margin-top:40px;box-sizing:border-box}@media screen and (max-width: 400px){.compose-standalone .compose-form{width:100%;margin-top:0;padding:20px}}.account-header{width:400px;margin:0 auto;display:flex;font-size:13px;line-height:18px;box-sizing:border-box;padding:20px 0;padding-bottom:0;margin-bottom:-30px;margin-top:40px}@media screen and (max-width: 440px){.account-header{width:100%;margin:0;margin-bottom:10px;padding:20px;padding-bottom:0}}.account-header .avatar{width:40px;height:40px;margin-right:8px}.account-header .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px}.account-header .name{flex:1 1 auto;color:#ecf0f4;width:calc(100% - 88px)}.account-header .name .username{display:block;font-weight:500;text-overflow:ellipsis;overflow:hidden}.account-header .logout-link{display:block;font-size:32px;line-height:40px;margin-left:8px}.grid-3{display:grid;grid-gap:10px;grid-template-columns:3fr 1fr;grid-auto-columns:25%;grid-auto-rows:max-content}.grid-3 .column-0{grid-column:1/3;grid-row:1}.grid-3 .column-1{grid-column:1;grid-row:2}.grid-3 .column-2{grid-column:2;grid-row:2}.grid-3 .column-3{grid-column:1/3;grid-row:3}@media screen and (max-width: 415px){.grid-3{grid-gap:0;grid-template-columns:minmax(0, 100%)}.grid-3 .column-0{grid-column:1}.grid-3 .column-1{grid-column:1;grid-row:3}.grid-3 .column-2{grid-column:1;grid-row:2}.grid-3 .column-3{grid-column:1;grid-row:4}}.grid-4{display:grid;grid-gap:10px;grid-template-columns:repeat(4, minmax(0, 1fr));grid-auto-columns:25%;grid-auto-rows:max-content}.grid-4 .column-0{grid-column:1/5;grid-row:1}.grid-4 .column-1{grid-column:1/4;grid-row:2}.grid-4 .column-2{grid-column:4;grid-row:2}.grid-4 .column-3{grid-column:2/5;grid-row:3}.grid-4 .column-4{grid-column:1;grid-row:3}.grid-4 .landing-page__call-to-action{min-height:100%}.grid-4 .flash-message{margin-bottom:10px}@media screen and (max-width: 738px){.grid-4{grid-template-columns:minmax(0, 50%) minmax(0, 50%)}.grid-4 .landing-page__call-to-action{padding:20px;display:flex;align-items:center;justify-content:center}.grid-4 .row__information-board{width:100%;justify-content:center;align-items:center}.grid-4 .row__mascot{display:none}}@media screen and (max-width: 415px){.grid-4{grid-gap:0;grid-template-columns:minmax(0, 100%)}.grid-4 .column-0{grid-column:1}.grid-4 .column-1{grid-column:1;grid-row:3}.grid-4 .column-2{grid-column:1;grid-row:2}.grid-4 .column-3{grid-column:1;grid-row:5}.grid-4 .column-4{grid-column:1;grid-row:4}}@media screen and (max-width: 415px){.public-layout{padding-top:48px}}.public-layout .container{max-width:960px}@media screen and (max-width: 415px){.public-layout .container{padding:0}}.public-layout .header{background:#393f4f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;height:48px;margin:10px 0;display:flex;align-items:stretch;justify-content:center;flex-wrap:nowrap;overflow:hidden}@media screen and (max-width: 415px){.public-layout .header{position:fixed;width:100%;top:0;left:0;margin:0;border-radius:0;box-shadow:none;z-index:110}}.public-layout .header>div{flex:1 1 33.3%;min-height:1px}.public-layout .header .nav-left{display:flex;align-items:stretch;justify-content:flex-start;flex-wrap:nowrap}.public-layout .header .nav-center{display:flex;align-items:stretch;justify-content:center;flex-wrap:nowrap}.public-layout .header .nav-right{display:flex;align-items:stretch;justify-content:flex-end;flex-wrap:nowrap}.public-layout .header .brand{display:block;padding:15px}.public-layout .header .brand svg{display:block;height:18px;width:auto;position:relative;bottom:-2px;fill:#fff}@media screen and (max-width: 415px){.public-layout .header .brand svg{height:20px}}.public-layout .header .brand:hover,.public-layout .header .brand:focus,.public-layout .header .brand:active{background:#42485a}.public-layout .header .nav-link{display:flex;align-items:center;padding:0 1rem;font-size:12px;font-weight:500;text-decoration:none;color:#dde3ec;white-space:nowrap;text-align:center}.public-layout .header .nav-link:hover,.public-layout .header .nav-link:focus,.public-layout .header .nav-link:active{text-decoration:underline;color:#fff}@media screen and (max-width: 550px){.public-layout .header .nav-link.optional{display:none}}.public-layout .header .nav-button{background:#4a5266;margin:8px;margin-left:0;border-radius:4px}.public-layout .header .nav-button:hover,.public-layout .header .nav-button:focus,.public-layout .header .nav-button:active{text-decoration:none;background:#535b72}.public-layout .grid{display:grid;grid-gap:10px;grid-template-columns:minmax(300px, 3fr) minmax(298px, 1fr);grid-auto-columns:25%;grid-auto-rows:max-content}.public-layout .grid .column-0{grid-row:1;grid-column:1}.public-layout .grid .column-1{grid-row:1;grid-column:2}@media screen and (max-width: 600px){.public-layout .grid{grid-template-columns:100%;grid-gap:0}.public-layout .grid .column-1{display:none}}.public-layout .directory__card{border-radius:4px}@media screen and (max-width: 415px){.public-layout .directory__card{border-radius:0}}@media screen and (max-width: 415px){.public-layout .page-header{border-bottom:0}}.public-layout .public-account-header{overflow:hidden;margin-bottom:10px;box-shadow:0 0 15px rgba(0,0,0,.2)}.public-layout .public-account-header.inactive{opacity:.5}.public-layout .public-account-header.inactive .public-account-header__image,.public-layout .public-account-header.inactive .avatar{filter:grayscale(100%)}.public-layout .public-account-header.inactive .logo-button{background-color:#ecf0f4}.public-layout .public-account-header__image{border-radius:4px 4px 0 0;overflow:hidden;height:300px;position:relative;background:#0e1014}.public-layout .public-account-header__image::after{content:\"\";display:block;position:absolute;width:100%;height:100%;box-shadow:inset 0 -1px 1px 1px rgba(0,0,0,.15);top:0;left:0}.public-layout .public-account-header__image img{object-fit:cover;display:block;width:100%;height:100%;margin:0;border-radius:4px 4px 0 0}@media screen and (max-width: 600px){.public-layout .public-account-header__image{height:200px}}.public-layout .public-account-header--no-bar{margin-bottom:0}.public-layout .public-account-header--no-bar .public-account-header__image,.public-layout .public-account-header--no-bar .public-account-header__image img{border-radius:4px}@media screen and (max-width: 415px){.public-layout .public-account-header--no-bar .public-account-header__image,.public-layout .public-account-header--no-bar .public-account-header__image img{border-radius:0}}@media screen and (max-width: 415px){.public-layout .public-account-header{margin-bottom:0;box-shadow:none}.public-layout .public-account-header__image::after{display:none}.public-layout .public-account-header__image,.public-layout .public-account-header__image img{border-radius:0}}.public-layout .public-account-header__bar{position:relative;margin-top:-80px;display:flex;justify-content:flex-start}.public-layout .public-account-header__bar::before{content:\"\";display:block;background:#313543;position:absolute;bottom:0;left:0;right:0;height:60px;border-radius:0 0 4px 4px;z-index:-1}.public-layout .public-account-header__bar .avatar{display:block;width:120px;height:120px;padding-left:16px;flex:0 0 auto}.public-layout .public-account-header__bar .avatar img{display:block;width:100%;height:100%;margin:0;border-radius:50%;border:4px solid #313543;background:#17191f}@media screen and (max-width: 600px){.public-layout .public-account-header__bar{margin-top:0;background:#313543;border-radius:0 0 4px 4px;padding:5px}.public-layout .public-account-header__bar::before{display:none}.public-layout .public-account-header__bar .avatar{width:48px;height:48px;padding:7px 0;padding-left:10px}.public-layout .public-account-header__bar .avatar img{border:0;border-radius:4px}}@media screen and (max-width: 600px)and (max-width: 360px){.public-layout .public-account-header__bar .avatar{display:none}}@media screen and (max-width: 415px){.public-layout .public-account-header__bar{border-radius:0}}@media screen and (max-width: 600px){.public-layout .public-account-header__bar{flex-wrap:wrap}}.public-layout .public-account-header__tabs{flex:1 1 auto;margin-left:20px}.public-layout .public-account-header__tabs__name{padding-top:20px;padding-bottom:8px}.public-layout .public-account-header__tabs__name h1{font-size:20px;line-height:27px;color:#fff;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-shadow:1px 1px 1px #000}.public-layout .public-account-header__tabs__name h1 small{display:block;font-size:14px;color:#fff;font-weight:400;overflow:hidden;text-overflow:ellipsis}@media screen and (max-width: 600px){.public-layout .public-account-header__tabs{margin-left:15px;display:flex;justify-content:space-between;align-items:center}.public-layout .public-account-header__tabs__name{padding-top:0;padding-bottom:0}.public-layout .public-account-header__tabs__name h1{font-size:16px;line-height:24px;text-shadow:none}.public-layout .public-account-header__tabs__name h1 small{color:#dde3ec}}.public-layout .public-account-header__tabs__tabs{display:flex;justify-content:flex-start;align-items:stretch;height:58px}.public-layout .public-account-header__tabs__tabs .details-counters{display:flex;flex-direction:row;min-width:300px}@media screen and (max-width: 600px){.public-layout .public-account-header__tabs__tabs .details-counters{display:none}}.public-layout .public-account-header__tabs__tabs .counter{min-width:33.3%;box-sizing:border-box;flex:0 0 auto;color:#dde3ec;padding:10px;border-right:1px solid #313543;cursor:default;text-align:center;position:relative}.public-layout .public-account-header__tabs__tabs .counter a{display:block}.public-layout .public-account-header__tabs__tabs .counter:last-child{border-right:0}.public-layout .public-account-header__tabs__tabs .counter::after{display:block;content:\"\";position:absolute;bottom:0;left:0;width:100%;border-bottom:4px solid #9baec8;opacity:.5;transition:all 400ms ease}.public-layout .public-account-header__tabs__tabs .counter.active::after{border-bottom:4px solid #2b90d9;opacity:1}.public-layout .public-account-header__tabs__tabs .counter.active.inactive::after{border-bottom-color:#ecf0f4}.public-layout .public-account-header__tabs__tabs .counter:hover::after{opacity:1;transition-duration:100ms}.public-layout .public-account-header__tabs__tabs .counter a{text-decoration:none;color:inherit}.public-layout .public-account-header__tabs__tabs .counter .counter-label{font-size:12px;display:block}.public-layout .public-account-header__tabs__tabs .counter .counter-number{font-weight:500;font-size:18px;margin-bottom:5px;color:#fff;font-family:\"mastodon-font-display\",sans-serif}.public-layout .public-account-header__tabs__tabs .spacer{flex:1 1 auto;height:1px}.public-layout .public-account-header__tabs__tabs__buttons{padding:7px 8px}.public-layout .public-account-header__extra{display:none;margin-top:4px}.public-layout .public-account-header__extra .public-account-bio{border-radius:0;box-shadow:none;background:transparent;margin:0 -5px}.public-layout .public-account-header__extra .public-account-bio .account__header__fields{border-top:1px solid #42485a}.public-layout .public-account-header__extra .public-account-bio .roles{display:none}.public-layout .public-account-header__extra__links{margin-top:-15px;font-size:14px;color:#dde3ec}.public-layout .public-account-header__extra__links a{display:inline-block;color:#dde3ec;text-decoration:none;padding:15px;font-weight:500}.public-layout .public-account-header__extra__links a strong{font-weight:700;color:#fff}@media screen and (max-width: 600px){.public-layout .public-account-header__extra{display:block;flex:100%}}.public-layout .account__section-headline{border-radius:4px 4px 0 0}@media screen and (max-width: 415px){.public-layout .account__section-headline{border-radius:0}}.public-layout .detailed-status__meta{margin-top:25px}.public-layout .public-account-bio{background:#393f4f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;overflow:hidden;margin-bottom:10px}@media screen and (max-width: 415px){.public-layout .public-account-bio{box-shadow:none;margin-bottom:0;border-radius:0}}.public-layout .public-account-bio .account__header__fields{margin:0;border-top:0}.public-layout .public-account-bio .account__header__fields a{color:#4e79df}.public-layout .public-account-bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.public-layout .public-account-bio .account__header__fields .verified a{color:#79bd9a}.public-layout .public-account-bio .account__header__content{padding:20px;padding-bottom:0;color:#fff}.public-layout .public-account-bio__extra,.public-layout .public-account-bio .roles{padding:20px;font-size:14px;color:#dde3ec}.public-layout .public-account-bio .roles{padding-bottom:0}.public-layout .directory__list{display:grid;grid-gap:10px;grid-template-columns:minmax(0, 50%) minmax(0, 50%)}@media screen and (max-width: 415px){.public-layout .directory__list{display:block}}.public-layout .directory__list .icon-button{font-size:18px}.public-layout .directory__card{margin-bottom:0}.public-layout .card-grid{display:flex;flex-wrap:wrap;min-width:100%;margin:0 -5px}.public-layout .card-grid>div{box-sizing:border-box;flex:1 0 auto;width:300px;padding:0 5px;margin-bottom:10px;max-width:33.333%}@media screen and (max-width: 900px){.public-layout .card-grid>div{max-width:50%}}@media screen and (max-width: 600px){.public-layout .card-grid>div{max-width:100%}}@media screen and (max-width: 415px){.public-layout .card-grid{margin:0;border-top:1px solid #393f4f}.public-layout .card-grid>div{width:100%;padding:0;margin-bottom:0;border-bottom:1px solid #393f4f}.public-layout .card-grid>div:last-child{border-bottom:0}.public-layout .card-grid>div .card__bar{background:#282c37}.public-layout .card-grid>div .card__bar:hover,.public-layout .card-grid>div .card__bar:active,.public-layout .card-grid>div .card__bar:focus{background:#313543}}.no-list{list-style:none}.no-list li{display:inline-block;margin:0 5px}.recovery-codes{list-style:none;margin:0 auto}.recovery-codes li{font-size:125%;line-height:1.5;letter-spacing:1px}.public-layout .footer{text-align:left;padding-top:20px;padding-bottom:60px;font-size:12px;color:#737d99}@media screen and (max-width: 415px){.public-layout .footer{padding-left:20px;padding-right:20px}}.public-layout .footer .grid{display:grid;grid-gap:10px;grid-template-columns:1fr 1fr 2fr 1fr 1fr}.public-layout .footer .grid .column-0{grid-column:1;grid-row:1;min-width:0}.public-layout .footer .grid .column-1{grid-column:2;grid-row:1;min-width:0}.public-layout .footer .grid .column-2{grid-column:3;grid-row:1;min-width:0;text-align:center}.public-layout .footer .grid .column-2 h4 a{color:#737d99}.public-layout .footer .grid .column-3{grid-column:4;grid-row:1;min-width:0}.public-layout .footer .grid .column-4{grid-column:5;grid-row:1;min-width:0}@media screen and (max-width: 690px){.public-layout .footer .grid{grid-template-columns:1fr 2fr 1fr}.public-layout .footer .grid .column-0,.public-layout .footer .grid .column-1{grid-column:1}.public-layout .footer .grid .column-1{grid-row:2}.public-layout .footer .grid .column-2{grid-column:2}.public-layout .footer .grid .column-3,.public-layout .footer .grid .column-4{grid-column:3}.public-layout .footer .grid .column-4{grid-row:2}}@media screen and (max-width: 600px){.public-layout .footer .grid .column-1{display:block}}@media screen and (max-width: 415px){.public-layout .footer .grid .column-0,.public-layout .footer .grid .column-1,.public-layout .footer .grid .column-3,.public-layout .footer .grid .column-4{display:none}}.public-layout .footer h4{text-transform:uppercase;font-weight:700;margin-bottom:8px;color:#dde3ec}.public-layout .footer h4 a{color:inherit;text-decoration:none}.public-layout .footer ul a{text-decoration:none;color:#737d99}.public-layout .footer ul a:hover,.public-layout .footer ul a:active,.public-layout .footer ul a:focus{text-decoration:underline}.public-layout .footer .brand svg{display:block;height:36px;width:auto;margin:0 auto;fill:#737d99}.public-layout .footer .brand:hover svg,.public-layout .footer .brand:focus svg,.public-layout .footer .brand:active svg{fill:#7f88a2}.compact-header h1{font-size:24px;line-height:28px;color:#dde3ec;font-weight:500;margin-bottom:20px;padding:0 10px;word-wrap:break-word}@media screen and (max-width: 740px){.compact-header h1{text-align:center;padding:20px 10px 0}}.compact-header h1 a{color:inherit;text-decoration:none}.compact-header h1 small{font-weight:400;color:#ecf0f4}.compact-header h1 img{display:inline-block;margin-bottom:-5px;margin-right:15px;width:36px;height:36px}.hero-widget{margin-bottom:10px;box-shadow:0 0 15px rgba(0,0,0,.2)}.hero-widget__img{width:100%;position:relative;overflow:hidden;border-radius:4px 4px 0 0;background:#000}.hero-widget__img img{object-fit:cover;display:block;width:100%;height:100%;margin:0;border-radius:4px 4px 0 0}.hero-widget__text{background:#282c37;padding:20px;border-radius:0 0 4px 4px;font-size:15px;color:#dde3ec;line-height:20px;word-wrap:break-word;font-weight:400}.hero-widget__text .emojione{width:20px;height:20px;margin:-3px 0 0}.hero-widget__text p{margin-bottom:20px}.hero-widget__text p:last-child{margin-bottom:0}.hero-widget__text em{display:inline;margin:0;padding:0;font-weight:700;background:transparent;font-family:inherit;font-size:inherit;line-height:inherit;color:#fefefe}.hero-widget__text a{color:#ecf0f4;text-decoration:none}.hero-widget__text a:hover{text-decoration:underline}@media screen and (max-width: 415px){.hero-widget{display:none}}.endorsements-widget{margin-bottom:10px;padding-bottom:10px}.endorsements-widget h4{padding:10px;text-transform:uppercase;font-weight:700;font-size:13px;color:#dde3ec}.endorsements-widget .account{padding:10px 0}.endorsements-widget .account:last-child{border-bottom:0}.endorsements-widget .account .account__display-name{display:flex;align-items:center}.endorsements-widget .account .account__avatar{width:44px;height:44px;background-size:44px 44px}.endorsements-widget .trends__item{padding:10px}.trends-widget h4{color:#dde3ec}.box-widget{padding:20px;border-radius:4px;background:#282c37;box-shadow:0 0 15px rgba(0,0,0,.2)}.placeholder-widget{padding:16px;border-radius:4px;border:2px dashed #c2cede;text-align:center;color:#dde3ec;margin-bottom:10px}.contact-widget{min-height:100%;font-size:15px;color:#dde3ec;line-height:20px;word-wrap:break-word;font-weight:400;padding:0}.contact-widget h4{padding:10px;text-transform:uppercase;font-weight:700;font-size:13px;color:#dde3ec}.contact-widget .account{border-bottom:0;padding:10px 0;padding-top:5px}.contact-widget>a{display:inline-block;padding:10px;padding-top:0;color:#dde3ec;text-decoration:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.contact-widget>a:hover,.contact-widget>a:focus,.contact-widget>a:active{text-decoration:underline}.moved-account-widget{padding:15px;padding-bottom:20px;border-radius:4px;background:#282c37;box-shadow:0 0 15px rgba(0,0,0,.2);color:#ecf0f4;font-weight:400;margin-bottom:10px}.moved-account-widget strong,.moved-account-widget a{font-weight:500}.moved-account-widget strong:lang(ja),.moved-account-widget a:lang(ja){font-weight:700}.moved-account-widget strong:lang(ko),.moved-account-widget a:lang(ko){font-weight:700}.moved-account-widget strong:lang(zh-CN),.moved-account-widget a:lang(zh-CN){font-weight:700}.moved-account-widget strong:lang(zh-HK),.moved-account-widget a:lang(zh-HK){font-weight:700}.moved-account-widget strong:lang(zh-TW),.moved-account-widget a:lang(zh-TW){font-weight:700}.moved-account-widget a{color:inherit;text-decoration:underline}.moved-account-widget a.mention{text-decoration:none}.moved-account-widget a.mention span{text-decoration:none}.moved-account-widget a.mention:focus,.moved-account-widget a.mention:hover,.moved-account-widget a.mention:active{text-decoration:none}.moved-account-widget a.mention:focus span,.moved-account-widget a.mention:hover span,.moved-account-widget a.mention:active span{text-decoration:underline}.moved-account-widget__message{margin-bottom:15px}.moved-account-widget__message .fa{margin-right:5px;color:#dde3ec}.moved-account-widget__card .detailed-status__display-avatar{position:relative;cursor:pointer}.moved-account-widget__card .detailed-status__display-name{margin-bottom:0;text-decoration:none}.moved-account-widget__card .detailed-status__display-name span{font-weight:400}.memoriam-widget{padding:20px;border-radius:4px;background:#000;box-shadow:0 0 15px rgba(0,0,0,.2);font-size:14px;color:#dde3ec;margin-bottom:10px}.page-header{background:#393f4f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;padding:60px 15px;text-align:center;margin:10px 0}.page-header h1{color:#fff;font-size:36px;line-height:1.1;font-weight:700;margin-bottom:10px}.page-header p{font-size:15px;color:#dde3ec}@media screen and (max-width: 415px){.page-header{margin-top:0;background:#313543}.page-header h1{font-size:24px}}.directory{background:#282c37;border-radius:4px;box-shadow:0 0 15px rgba(0,0,0,.2)}.directory__tag{box-sizing:border-box;margin-bottom:10px}.directory__tag>a,.directory__tag>div{display:flex;align-items:center;justify-content:space-between;background:#282c37;border-radius:4px;padding:15px;text-decoration:none;color:inherit;box-shadow:0 0 15px rgba(0,0,0,.2)}.directory__tag>a:hover,.directory__tag>a:active,.directory__tag>a:focus{background:#393f4f}.directory__tag.active>a{background:#2b5fd9;cursor:default}.directory__tag.disabled>div{opacity:.5;cursor:default}.directory__tag h4{flex:1 1 auto;font-size:18px;font-weight:700;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.directory__tag h4 .fa{color:#dde3ec}.directory__tag h4 small{display:block;font-weight:400;font-size:15px;margin-top:8px;color:#dde3ec}.directory__tag.active h4,.directory__tag.active h4 .fa,.directory__tag.active h4 small,.directory__tag.active h4 .trends__item__current{color:#fff}.directory__tag .avatar-stack{flex:0 0 auto;width:120px}.directory__tag.active .avatar-stack .account__avatar{border-color:#2b5fd9}.directory__tag .trends__item__current{padding-right:0}.avatar-stack{display:flex;justify-content:flex-end}.avatar-stack .account__avatar{flex:0 0 auto;width:36px;height:36px;border-radius:50%;position:relative;margin-left:-10px;background:#17191f;border:2px solid #282c37}.avatar-stack .account__avatar:nth-child(1){z-index:1}.avatar-stack .account__avatar:nth-child(2){z-index:2}.avatar-stack .account__avatar:nth-child(3){z-index:3}.accounts-table{width:100%}.accounts-table .account{padding:0;border:0}.accounts-table strong{font-weight:700}.accounts-table thead th{text-align:center;text-transform:uppercase;color:#dde3ec;font-weight:700;padding:10px}.accounts-table thead th:first-child{text-align:left}.accounts-table tbody td{padding:15px 0;vertical-align:middle;border-bottom:1px solid #393f4f}.accounts-table tbody tr:last-child td{border-bottom:0}.accounts-table__count{width:120px;text-align:center;font-size:15px;font-weight:500;color:#fff}.accounts-table__count small{display:block;color:#dde3ec;font-weight:400;font-size:14px}.accounts-table__comment{width:50%;vertical-align:initial !important}@media screen and (max-width: 415px){.accounts-table tbody td.optional{display:none}}@media screen and (max-width: 415px){.moved-account-widget,.memoriam-widget,.box-widget,.contact-widget,.landing-page__information.contact-widget,.directory,.page-header{margin-bottom:0;box-shadow:none;border-radius:0}}.statuses-grid{min-height:600px}@media screen and (max-width: 640px){.statuses-grid{width:100% !important}}.statuses-grid__item{width:313.3333333333px}@media screen and (max-width: 1255px){.statuses-grid__item{width:306.6666666667px}}@media screen and (max-width: 640px){.statuses-grid__item{width:100%}}@media screen and (max-width: 415px){.statuses-grid__item{width:100vw}}.statuses-grid .detailed-status{border-radius:4px}@media screen and (max-width: 415px){.statuses-grid .detailed-status{border-top:1px solid #4a5266}}.statuses-grid .detailed-status.compact .detailed-status__meta{margin-top:15px}.statuses-grid .detailed-status.compact .status__content{font-size:15px;line-height:20px}.statuses-grid .detailed-status.compact .status__content .emojione{width:20px;height:20px;margin:-3px 0 0}.statuses-grid .detailed-status.compact .status__content .status__content__spoiler-link{line-height:20px;margin:0}.statuses-grid .detailed-status.compact .media-gallery,.statuses-grid .detailed-status.compact .status-card,.statuses-grid .detailed-status.compact .video-player{margin-top:15px}.notice-widget{margin-bottom:10px;color:#dde3ec}.notice-widget p{margin-bottom:10px}.notice-widget p:last-child{margin-bottom:0}.notice-widget a{font-size:14px;line-height:20px}.notice-widget a,.placeholder-widget a{text-decoration:none;font-weight:500;color:#2b5fd9}.notice-widget a:hover,.notice-widget a:focus,.notice-widget a:active,.placeholder-widget a:hover,.placeholder-widget a:focus,.placeholder-widget a:active{text-decoration:underline}.table-of-contents{background:#1f232b;min-height:100%;font-size:14px;border-radius:4px}.table-of-contents li a{display:block;font-weight:500;padding:15px;overflow:hidden;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-decoration:none;color:#fff;border-bottom:1px solid #313543}.table-of-contents li a:hover,.table-of-contents li a:focus,.table-of-contents li a:active{text-decoration:underline}.table-of-contents li:last-child a{border-bottom:0}.table-of-contents li ul{padding-left:20px;border-bottom:1px solid #313543}code{font-family:\"mastodon-font-monospace\",monospace;font-weight:400}.form-container{max-width:400px;padding:20px;margin:0 auto}.simple_form .input{margin-bottom:15px;overflow:hidden}.simple_form .input.hidden{margin:0}.simple_form .input.radio_buttons .radio{margin-bottom:15px}.simple_form .input.radio_buttons .radio:last-child{margin-bottom:0}.simple_form .input.radio_buttons .radio>label{position:relative;padding-left:28px}.simple_form .input.radio_buttons .radio>label input{position:absolute;top:-2px;left:0}.simple_form .input.boolean{position:relative;margin-bottom:0}.simple_form .input.boolean .label_input>label{font-family:inherit;font-size:14px;padding-top:5px;color:#fff;display:block;width:auto}.simple_form .input.boolean .label_input,.simple_form .input.boolean .hint{padding-left:28px}.simple_form .input.boolean .label_input__wrapper{position:static}.simple_form .input.boolean label.checkbox{position:absolute;top:2px;left:0}.simple_form .input.boolean label a{color:#2b90d9;text-decoration:underline}.simple_form .input.boolean label a:hover,.simple_form .input.boolean label a:active,.simple_form .input.boolean label a:focus{text-decoration:none}.simple_form .input.boolean .recommended{position:absolute;margin:0 4px;margin-top:-2px}.simple_form .row{display:flex;margin:0 -5px}.simple_form .row .input{box-sizing:border-box;flex:1 1 auto;width:50%;padding:0 5px}.simple_form .hint{color:#dde3ec}.simple_form .hint a{color:#2b90d9}.simple_form .hint code{border-radius:3px;padding:.2em .4em;background:#0e1014}.simple_form .hint li{list-style:disc;margin-left:18px}.simple_form ul.hint{margin-bottom:15px}.simple_form span.hint{display:block;font-size:12px;margin-top:4px}.simple_form p.hint{margin-bottom:15px;color:#dde3ec}.simple_form p.hint.subtle-hint{text-align:center;font-size:12px;line-height:18px;margin-top:15px;margin-bottom:0}.simple_form .card{margin-bottom:15px}.simple_form strong{font-weight:500}.simple_form strong:lang(ja){font-weight:700}.simple_form strong:lang(ko){font-weight:700}.simple_form strong:lang(zh-CN){font-weight:700}.simple_form strong:lang(zh-HK){font-weight:700}.simple_form strong:lang(zh-TW){font-weight:700}.simple_form .input.with_floating_label .label_input{display:flex}.simple_form .input.with_floating_label .label_input>label{font-family:inherit;font-size:14px;color:#fff;font-weight:500;min-width:150px;flex:0 0 auto}.simple_form .input.with_floating_label .label_input input,.simple_form .input.with_floating_label .label_input select{flex:1 1 auto}.simple_form .input.with_floating_label.select .hint{margin-top:6px;margin-left:150px}.simple_form .input.with_label .label_input>label{font-family:inherit;font-size:14px;color:#fff;display:block;margin-bottom:8px;word-wrap:break-word;font-weight:500}.simple_form .input.with_label .hint{margin-top:6px}.simple_form .input.with_label ul{flex:390px}.simple_form .input.with_block_label{max-width:none}.simple_form .input.with_block_label>label{font-family:inherit;font-size:16px;color:#fff;display:block;font-weight:500;padding-top:5px}.simple_form .input.with_block_label .hint{margin-bottom:15px}.simple_form .input.with_block_label ul{columns:2}.simple_form .input.datetime .label_input select{display:inline-block;width:auto;flex:0}.simple_form .required abbr{text-decoration:none;color:#e87487}.simple_form .fields-group{margin-bottom:25px}.simple_form .fields-group .input:last-child{margin-bottom:0}.simple_form .fields-row{display:flex;margin:0 -10px;padding-top:5px;margin-bottom:25px}.simple_form .fields-row .input{max-width:none}.simple_form .fields-row__column{box-sizing:border-box;padding:0 10px;flex:1 1 auto;min-height:1px}.simple_form .fields-row__column-6{max-width:50%}.simple_form .fields-row__column .actions{margin-top:27px}.simple_form .fields-row .fields-group:last-child,.simple_form .fields-row .fields-row__column.fields-group{margin-bottom:0}@media screen and (max-width: 600px){.simple_form .fields-row{display:block;margin-bottom:0}.simple_form .fields-row__column{max-width:none}.simple_form .fields-row .fields-group:last-child,.simple_form .fields-row .fields-row__column.fields-group,.simple_form .fields-row .fields-row__column{margin-bottom:25px}}.simple_form .input.radio_buttons .radio label{margin-bottom:5px;font-family:inherit;font-size:14px;color:#fff;display:block;width:auto}.simple_form .check_boxes .checkbox label{font-family:inherit;font-size:14px;color:#fff;display:inline-block;width:auto;position:relative;padding-top:5px;padding-left:25px;flex:1 1 auto}.simple_form .check_boxes .checkbox input[type=checkbox]{position:absolute;left:0;top:5px;margin:0}.simple_form .input.static .label_input__wrapper{font-size:16px;padding:10px;border:1px solid #c2cede;border-radius:4px}.simple_form input[type=text],.simple_form input[type=number],.simple_form input[type=email],.simple_form input[type=password],.simple_form textarea{box-sizing:border-box;font-size:16px;color:#fff;display:block;width:100%;outline:0;font-family:inherit;resize:vertical;background:#131419;border:1px solid #0a0b0e;border-radius:4px;padding:10px}.simple_form input[type=text]::placeholder,.simple_form input[type=number]::placeholder,.simple_form input[type=email]::placeholder,.simple_form input[type=password]::placeholder,.simple_form textarea::placeholder{color:#eaeef3}.simple_form input[type=text]:invalid,.simple_form input[type=number]:invalid,.simple_form input[type=email]:invalid,.simple_form input[type=password]:invalid,.simple_form textarea:invalid{box-shadow:none}.simple_form input[type=text]:focus:invalid:not(:placeholder-shown),.simple_form input[type=number]:focus:invalid:not(:placeholder-shown),.simple_form input[type=email]:focus:invalid:not(:placeholder-shown),.simple_form input[type=password]:focus:invalid:not(:placeholder-shown),.simple_form textarea:focus:invalid:not(:placeholder-shown){border-color:#e87487}.simple_form input[type=text]:required:valid,.simple_form input[type=number]:required:valid,.simple_form input[type=email]:required:valid,.simple_form input[type=password]:required:valid,.simple_form textarea:required:valid{border-color:#79bd9a}.simple_form input[type=text]:hover,.simple_form input[type=number]:hover,.simple_form input[type=email]:hover,.simple_form input[type=password]:hover,.simple_form textarea:hover{border-color:#000}.simple_form input[type=text]:active,.simple_form input[type=text]:focus,.simple_form input[type=number]:active,.simple_form input[type=number]:focus,.simple_form input[type=email]:active,.simple_form input[type=email]:focus,.simple_form input[type=password]:active,.simple_form input[type=password]:focus,.simple_form textarea:active,.simple_form textarea:focus{border-color:#2b90d9;background:#17191f}.simple_form .input.field_with_errors label{color:#e87487}.simple_form .input.field_with_errors input[type=text],.simple_form .input.field_with_errors input[type=number],.simple_form .input.field_with_errors input[type=email],.simple_form .input.field_with_errors input[type=password],.simple_form .input.field_with_errors textarea,.simple_form .input.field_with_errors select{border-color:#e87487}.simple_form .input.field_with_errors .error{display:block;font-weight:500;color:#e87487;margin-top:4px}.simple_form .input.disabled{opacity:.5}.simple_form .actions{margin-top:30px;display:flex}.simple_form .actions.actions--top{margin-top:0;margin-bottom:30px}.simple_form button,.simple_form .button,.simple_form .block-button{display:block;width:100%;border:0;border-radius:4px;background:#2b5fd9;color:#fff;font-size:18px;line-height:inherit;height:auto;padding:10px;text-transform:uppercase;text-decoration:none;text-align:center;box-sizing:border-box;cursor:pointer;font-weight:500;outline:0;margin-bottom:10px;margin-right:10px}.simple_form button:last-child,.simple_form .button:last-child,.simple_form .block-button:last-child{margin-right:0}.simple_form button:hover,.simple_form .button:hover,.simple_form .block-button:hover{background-color:#416fdd}.simple_form button:active,.simple_form button:focus,.simple_form .button:active,.simple_form .button:focus,.simple_form .block-button:active,.simple_form .block-button:focus{background-color:#2454c7}.simple_form button:disabled:hover,.simple_form .button:disabled:hover,.simple_form .block-button:disabled:hover{background-color:#9baec8}.simple_form button.negative,.simple_form .button.negative,.simple_form .block-button.negative{background:#df405a}.simple_form button.negative:hover,.simple_form .button.negative:hover,.simple_form .block-button.negative:hover{background-color:#e3566d}.simple_form button.negative:active,.simple_form button.negative:focus,.simple_form .button.negative:active,.simple_form .button.negative:focus,.simple_form .block-button.negative:active,.simple_form .block-button.negative:focus{background-color:#db2a47}.simple_form select{appearance:none;box-sizing:border-box;font-size:16px;color:#fff;display:block;width:100%;outline:0;font-family:inherit;resize:vertical;background:#131419 url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center/auto 16px;border:1px solid #0a0b0e;border-radius:4px;padding-left:10px;padding-right:30px;height:41px}.simple_form h4{margin-bottom:15px !important}.simple_form .label_input__wrapper{position:relative}.simple_form .label_input__append{position:absolute;right:3px;top:1px;padding:10px;padding-bottom:9px;font-size:16px;color:#c2cede;font-family:inherit;pointer-events:none;cursor:default;max-width:140px;white-space:nowrap;overflow:hidden}.simple_form .label_input__append::after{content:\"\";display:block;position:absolute;top:0;right:0;bottom:1px;width:5px;background-image:linear-gradient(to right, rgba(19, 20, 25, 0), #131419)}.simple_form__overlay-area{position:relative}.simple_form__overlay-area__blurred form{filter:blur(2px)}.simple_form__overlay-area__overlay{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;background:rgba(40,44,55,.65);border-radius:4px;margin-left:-4px;margin-top:-4px;padding:4px}.simple_form__overlay-area__overlay__content{text-align:center}.simple_form__overlay-area__overlay__content.rich-formatting,.simple_form__overlay-area__overlay__content.rich-formatting p{color:#fff}.block-icon{display:block;margin:0 auto;margin-bottom:10px;font-size:24px}.flash-message{background:#393f4f;color:#dde3ec;border-radius:4px;padding:15px 10px;margin-bottom:30px;text-align:center}.flash-message.notice{border:1px solid rgba(121,189,154,.5);background:rgba(121,189,154,.25);color:#79bd9a}.flash-message.alert{border:1px solid rgba(223,64,90,.5);background:rgba(223,64,90,.25);color:#df405a}.flash-message a{display:inline-block;color:#dde3ec;text-decoration:none}.flash-message a:hover{color:#fff;text-decoration:underline}.flash-message p{margin-bottom:15px}.flash-message .oauth-code{outline:0;box-sizing:border-box;display:block;width:100%;border:0;padding:10px;font-family:\"mastodon-font-monospace\",monospace;background:#282c37;color:#fff;font-size:14px;margin:0}.flash-message .oauth-code::-moz-focus-inner{border:0}.flash-message .oauth-code::-moz-focus-inner,.flash-message .oauth-code:focus,.flash-message .oauth-code:active{outline:0 !important}.flash-message .oauth-code:focus{background:#313543}.flash-message strong{font-weight:500}.flash-message strong:lang(ja){font-weight:700}.flash-message strong:lang(ko){font-weight:700}.flash-message strong:lang(zh-CN){font-weight:700}.flash-message strong:lang(zh-HK){font-weight:700}.flash-message strong:lang(zh-TW){font-weight:700}@media screen and (max-width: 740px)and (min-width: 441px){.flash-message{margin-top:40px}}.form-footer{margin-top:30px;text-align:center}.form-footer a{color:#dde3ec;text-decoration:none}.form-footer a:hover{text-decoration:underline}.quick-nav{list-style:none;margin-bottom:25px;font-size:14px}.quick-nav li{display:inline-block;margin-right:10px}.quick-nav a{color:#2b90d9;text-transform:uppercase;text-decoration:none;font-weight:700}.quick-nav a:hover,.quick-nav a:focus,.quick-nav a:active{color:#4ea2df}.oauth-prompt,.follow-prompt{margin-bottom:30px;color:#dde3ec}.oauth-prompt h2,.follow-prompt h2{font-size:16px;margin-bottom:30px;text-align:center}.oauth-prompt strong,.follow-prompt strong{color:#ecf0f4;font-weight:500}.oauth-prompt strong:lang(ja),.follow-prompt strong:lang(ja){font-weight:700}.oauth-prompt strong:lang(ko),.follow-prompt strong:lang(ko){font-weight:700}.oauth-prompt strong:lang(zh-CN),.follow-prompt strong:lang(zh-CN){font-weight:700}.oauth-prompt strong:lang(zh-HK),.follow-prompt strong:lang(zh-HK){font-weight:700}.oauth-prompt strong:lang(zh-TW),.follow-prompt strong:lang(zh-TW){font-weight:700}@media screen and (max-width: 740px)and (min-width: 441px){.oauth-prompt,.follow-prompt{margin-top:40px}}.qr-wrapper{display:flex;flex-wrap:wrap;align-items:flex-start}.qr-code{flex:0 0 auto;background:#fff;padding:4px;margin:0 10px 20px 0;box-shadow:0 0 15px rgba(0,0,0,.2);display:inline-block}.qr-code svg{display:block;margin:0}.qr-alternative{margin-bottom:20px;color:#ecf0f4;flex:150px}.qr-alternative samp{display:block;font-size:14px}.table-form p{margin-bottom:15px}.table-form p strong{font-weight:500}.table-form p strong:lang(ja){font-weight:700}.table-form p strong:lang(ko){font-weight:700}.table-form p strong:lang(zh-CN){font-weight:700}.table-form p strong:lang(zh-HK){font-weight:700}.table-form p strong:lang(zh-TW){font-weight:700}.simple_form .warning,.table-form .warning{box-sizing:border-box;background:rgba(223,64,90,.5);color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,.3);box-shadow:0 2px 6px rgba(0,0,0,.4);border-radius:4px;padding:10px;margin-bottom:15px}.simple_form .warning a,.table-form .warning a{color:#fff;text-decoration:underline}.simple_form .warning a:hover,.simple_form .warning a:focus,.simple_form .warning a:active,.table-form .warning a:hover,.table-form .warning a:focus,.table-form .warning a:active{text-decoration:none}.simple_form .warning strong,.table-form .warning strong{font-weight:600;display:block;margin-bottom:5px}.simple_form .warning strong:lang(ja),.table-form .warning strong:lang(ja){font-weight:700}.simple_form .warning strong:lang(ko),.table-form .warning strong:lang(ko){font-weight:700}.simple_form .warning strong:lang(zh-CN),.table-form .warning strong:lang(zh-CN){font-weight:700}.simple_form .warning strong:lang(zh-HK),.table-form .warning strong:lang(zh-HK){font-weight:700}.simple_form .warning strong:lang(zh-TW),.table-form .warning strong:lang(zh-TW){font-weight:700}.simple_form .warning strong .fa,.table-form .warning strong .fa{font-weight:400}.action-pagination{display:flex;flex-wrap:wrap;align-items:center}.action-pagination .actions,.action-pagination .pagination{flex:1 1 auto}.action-pagination .actions{padding:30px 0;padding-right:20px;flex:0 0 auto}.post-follow-actions{text-align:center;color:#dde3ec}.post-follow-actions div{margin-bottom:4px}.alternative-login{margin-top:20px;margin-bottom:20px}.alternative-login h4{font-size:16px;color:#fff;text-align:center;margin-bottom:20px;border:0;padding:0}.alternative-login .button{display:block}.scope-danger{color:#ff5050}.form_admin_settings_site_short_description textarea,.form_admin_settings_site_description textarea,.form_admin_settings_site_extended_description textarea,.form_admin_settings_site_terms textarea,.form_admin_settings_custom_css textarea,.form_admin_settings_closed_registrations_message textarea{font-family:\"mastodon-font-monospace\",monospace}.input-copy{background:#131419;border:1px solid #0a0b0e;border-radius:4px;display:flex;align-items:center;padding-right:4px;position:relative;top:1px;transition:border-color 300ms linear}.input-copy__wrapper{flex:1 1 auto}.input-copy input[type=text]{background:transparent;border:0;padding:10px;font-size:14px;font-family:\"mastodon-font-monospace\",monospace}.input-copy button{flex:0 0 auto;margin:4px;text-transform:none;font-weight:400;font-size:14px;padding:7px 18px;padding-bottom:6px;width:auto;transition:background 300ms linear}.input-copy.copied{border-color:#79bd9a;transition:none}.input-copy.copied button{background:#79bd9a;transition:none}.connection-prompt{margin-bottom:25px}.connection-prompt .fa-link{background-color:#1f232b;border-radius:100%;font-size:24px;padding:10px}.connection-prompt__column{align-items:center;display:flex;flex:1;flex-direction:column;flex-shrink:1;max-width:50%}.connection-prompt__column-sep{align-self:center;flex-grow:0;overflow:visible;position:relative;z-index:1}.connection-prompt__column p{word-break:break-word}.connection-prompt .account__avatar{margin-bottom:20px}.connection-prompt__connection{background-color:#393f4f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;padding:25px 10px;position:relative;text-align:center}.connection-prompt__connection::after{background-color:#1f232b;content:\"\";display:block;height:100%;left:50%;position:absolute;top:0;width:1px}.connection-prompt__row{align-items:flex-start;display:flex;flex-direction:row}.card>a{display:block;text-decoration:none;color:inherit;box-shadow:0 0 15px rgba(0,0,0,.2)}@media screen and (max-width: 415px){.card>a{box-shadow:none}}.card>a:hover .card__bar,.card>a:active .card__bar,.card>a:focus .card__bar{background:#393f4f}.card__img{height:130px;position:relative;background:#0e1014;border-radius:4px 4px 0 0}.card__img img{display:block;width:100%;height:100%;margin:0;object-fit:cover;border-radius:4px 4px 0 0}@media screen and (max-width: 600px){.card__img{height:200px}}@media screen and (max-width: 415px){.card__img{display:none}}.card__bar{position:relative;padding:15px;display:flex;justify-content:flex-start;align-items:center;background:#313543;border-radius:0 0 4px 4px}@media screen and (max-width: 415px){.card__bar{border-radius:0}}.card__bar .avatar{flex:0 0 auto;width:48px;height:48px;padding-top:2px}.card__bar .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px;background:#17191f;object-fit:cover}.card__bar .display-name{margin-left:15px;text-align:left}.card__bar .display-name strong{font-size:15px;color:#fff;font-weight:500;overflow:hidden;text-overflow:ellipsis}.card__bar .display-name span{display:block;font-size:14px;color:#dde3ec;font-weight:400;overflow:hidden;text-overflow:ellipsis}.pagination{padding:30px 0;text-align:center;overflow:hidden}.pagination a,.pagination .current,.pagination .newer,.pagination .older,.pagination .page,.pagination .gap{font-size:14px;color:#fff;font-weight:500;display:inline-block;padding:6px 10px;text-decoration:none}.pagination .current{background:#fff;border-radius:100px;color:#000;cursor:default;margin:0 10px}.pagination .gap{cursor:default}.pagination .older,.pagination .newer{text-transform:uppercase;color:#ecf0f4}.pagination .older{float:left;padding-left:0}.pagination .older .fa{display:inline-block;margin-right:5px}.pagination .newer{float:right;padding-right:0}.pagination .newer .fa{display:inline-block;margin-left:5px}.pagination .disabled{cursor:default;color:#1a1a1a}@media screen and (max-width: 700px){.pagination{padding:30px 20px}.pagination .page{display:none}.pagination .newer,.pagination .older{display:inline-block}}.nothing-here{background:#282c37;box-shadow:0 0 15px rgba(0,0,0,.2);color:#364861;font-size:14px;font-weight:500;text-align:center;display:flex;justify-content:center;align-items:center;cursor:default;border-radius:4px;padding:20px;min-height:30vh}.nothing-here--under-tabs{border-radius:0 0 4px 4px}.nothing-here--flexible{box-sizing:border-box;min-height:100%}.account-role,.simple_form .recommended{display:inline-block;padding:4px 6px;cursor:default;border-radius:3px;font-size:12px;line-height:12px;font-weight:500;color:#d9e1e8;background-color:rgba(217,225,232,.1);border:1px solid rgba(217,225,232,.5)}.account-role.moderator,.simple_form .recommended.moderator{color:#79bd9a;background-color:rgba(121,189,154,.1);border-color:rgba(121,189,154,.5)}.account-role.admin,.simple_form .recommended.admin{color:#e87487;background-color:rgba(232,116,135,.1);border-color:rgba(232,116,135,.5)}.account__header__fields{max-width:100vw;padding:0;margin:15px -15px -15px;border:0 none;border-top:1px solid #42485a;border-bottom:1px solid #42485a;font-size:14px;line-height:20px}.account__header__fields dl{display:flex;border-bottom:1px solid #42485a}.account__header__fields dt,.account__header__fields dd{box-sizing:border-box;padding:14px;text-align:center;max-height:48px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.account__header__fields dt{font-weight:500;width:120px;flex:0 0 auto;color:#ecf0f4;background:rgba(23,25,31,.5)}.account__header__fields dd{flex:1 1 auto;color:#dde3ec}.account__header__fields a{color:#2b90d9;text-decoration:none}.account__header__fields a:hover,.account__header__fields a:focus,.account__header__fields a:active{text-decoration:underline}.account__header__fields .verified{border:1px solid rgba(121,189,154,.5);background:rgba(121,189,154,.25)}.account__header__fields .verified a{color:#79bd9a;font-weight:500}.account__header__fields .verified__mark{color:#79bd9a}.account__header__fields dl:last-child{border-bottom:0}.directory__tag .trends__item__current{width:auto}.pending-account__header{color:#dde3ec}.pending-account__header a{color:#d9e1e8;text-decoration:none}.pending-account__header a:hover,.pending-account__header a:active,.pending-account__header a:focus{text-decoration:underline}.pending-account__header strong{color:#fff;font-weight:700}.pending-account__body{margin-top:10px}.activity-stream{box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;overflow:hidden;margin-bottom:10px}.activity-stream--under-tabs{border-radius:0 0 4px 4px}@media screen and (max-width: 415px){.activity-stream{margin-bottom:0;border-radius:0;box-shadow:none}}.activity-stream--headless{border-radius:0;margin:0;box-shadow:none}.activity-stream--headless .detailed-status,.activity-stream--headless .status{border-radius:0 !important}.activity-stream div[data-component]{width:100%}.activity-stream .entry{background:#282c37}.activity-stream .entry .detailed-status,.activity-stream .entry .status,.activity-stream .entry .load-more{animation:none}.activity-stream .entry:last-child .detailed-status,.activity-stream .entry:last-child .status,.activity-stream .entry:last-child .load-more{border-bottom:0;border-radius:0 0 4px 4px}.activity-stream .entry:first-child .detailed-status,.activity-stream .entry:first-child .status,.activity-stream .entry:first-child .load-more{border-radius:4px 4px 0 0}.activity-stream .entry:first-child:last-child .detailed-status,.activity-stream .entry:first-child:last-child .status,.activity-stream .entry:first-child:last-child .load-more{border-radius:4px}@media screen and (max-width: 740px){.activity-stream .entry .detailed-status,.activity-stream .entry .status,.activity-stream .entry .load-more{border-radius:0 !important}}.activity-stream--highlighted .entry{background:#393f4f}.button.logo-button{flex:0 auto;font-size:14px;background:#2b5fd9;color:#fff;text-transform:none;line-height:36px;height:auto;padding:3px 15px;border:0}.button.logo-button svg{width:20px;height:auto;vertical-align:middle;margin-right:5px;fill:#fff}.button.logo-button:active,.button.logo-button:focus,.button.logo-button:hover{background:#5680e1}.button.logo-button:disabled:active,.button.logo-button:disabled:focus,.button.logo-button:disabled:hover,.button.logo-button.disabled:active,.button.logo-button.disabled:focus,.button.logo-button.disabled:hover{background:#9baec8}.button.logo-button.button--destructive:active,.button.logo-button.button--destructive:focus,.button.logo-button.button--destructive:hover{background:#df405a}@media screen and (max-width: 415px){.button.logo-button svg{display:none}}.embed .detailed-status,.public-layout .detailed-status{padding:15px}.embed .status,.public-layout .status{padding:15px 15px 15px 78px;min-height:50px}.embed .status__avatar,.public-layout .status__avatar{left:15px;top:17px}.embed .status__content,.public-layout .status__content{padding-top:5px}.embed .status__prepend,.public-layout .status__prepend{margin-left:78px;padding-top:15px}.embed .status__prepend-icon-wrapper,.public-layout .status__prepend-icon-wrapper{left:-32px}.embed .status .media-gallery,.embed .status__action-bar,.embed .status .video-player,.public-layout .status .media-gallery,.public-layout .status__action-bar,.public-layout .status .video-player{margin-top:10px}button.icon-button i.fa-retweet{background-image:url(\"data:image/svg+xml;utf8,\")}button.icon-button i.fa-retweet:hover{background-image:url(\"data:image/svg+xml;utf8,\")}button.icon-button.disabled i.fa-retweet{background-image:url(\"data:image/svg+xml;utf8,\")}.app-body{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.animated-number{display:inline-flex;flex-direction:column;align-items:stretch;overflow:hidden;position:relative}.link-button{display:block;font-size:15px;line-height:20px;color:#2b5fd9;border:0;background:transparent;padding:0;cursor:pointer}.link-button:hover,.link-button:active{text-decoration:underline}.link-button:disabled{color:#9baec8;cursor:default}.button{background-color:#2b5fd9;border:10px none;border-radius:4px;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-family:inherit;font-size:14px;font-weight:500;height:36px;letter-spacing:0;line-height:36px;overflow:hidden;padding:0 16px;position:relative;text-align:center;text-transform:uppercase;text-decoration:none;text-overflow:ellipsis;transition:all 100ms ease-in;white-space:nowrap;width:auto}.button:active,.button:focus,.button:hover{background-color:#5680e1;transition:all 200ms ease-out}.button--destructive{transition:none}.button--destructive:active,.button--destructive:focus,.button--destructive:hover{background-color:#df405a;transition:none}.button:disabled,.button.disabled{background-color:#9baec8;cursor:default}.button::-moz-focus-inner{border:0}.button::-moz-focus-inner,.button:focus,.button:active{outline:0 !important}.button.button-primary,.button.button-alternative,.button.button-secondary,.button.button-alternative-2{font-size:16px;line-height:36px;height:auto;text-transform:none;padding:4px 16px}.button.button-alternative{color:#000;background:#9baec8}.button.button-alternative:active,.button.button-alternative:focus,.button.button-alternative:hover{background-color:#a8b9cf}.button.button-alternative-2{background:#606984}.button.button-alternative-2:active,.button.button-alternative-2:focus,.button.button-alternative-2:hover{background-color:#687390}.button.button-secondary{color:#dde3ec;background:transparent;padding:3px 15px;border:1px solid #9baec8}.button.button-secondary:active,.button.button-secondary:focus,.button.button-secondary:hover{border-color:#a8b9cf;color:#eaeef3}.button.button-secondary:disabled{opacity:.5}.button.button--block{display:block;width:100%}.column__wrapper{display:flex;flex:1 1 auto;position:relative}.icon-button{display:inline-block;padding:0;color:#8d9ac2;border:0;border-radius:4px;background:transparent;cursor:pointer;transition:all 100ms ease-in;transition-property:background-color,color}.icon-button:hover,.icon-button:active,.icon-button:focus{color:#a4afce;background-color:rgba(141,154,194,.15);transition:all 200ms ease-out;transition-property:background-color,color}.icon-button:focus{background-color:rgba(141,154,194,.3)}.icon-button.disabled{color:#6274ab;background-color:transparent;cursor:default}.icon-button.active{color:#2b90d9}.icon-button::-moz-focus-inner{border:0}.icon-button::-moz-focus-inner,.icon-button:focus,.icon-button:active{outline:0 !important}.icon-button.inverted{color:#1b1e25}.icon-button.inverted:hover,.icon-button.inverted:active,.icon-button.inverted:focus{color:#0c0d11;background-color:rgba(27,30,37,.15)}.icon-button.inverted:focus{background-color:rgba(27,30,37,.3)}.icon-button.inverted.disabled{color:#2a2e3a;background-color:transparent}.icon-button.inverted.active{color:#2b90d9}.icon-button.inverted.active.disabled{color:#63ade3}.icon-button.overlayed{box-sizing:content-box;background:rgba(0,0,0,.6);color:rgba(255,255,255,.7);border-radius:4px;padding:2px}.icon-button.overlayed:hover{background:rgba(0,0,0,.9)}.text-icon-button{color:#1b1e25;border:0;border-radius:4px;background:transparent;cursor:pointer;font-weight:600;font-size:11px;padding:0 3px;line-height:27px;outline:0;transition:all 100ms ease-in;transition-property:background-color,color}.text-icon-button:hover,.text-icon-button:active,.text-icon-button:focus{color:#0c0d11;background-color:rgba(27,30,37,.15);transition:all 200ms ease-out;transition-property:background-color,color}.text-icon-button:focus{background-color:rgba(27,30,37,.3)}.text-icon-button.disabled{color:#464d60;background-color:transparent;cursor:default}.text-icon-button.active{color:#2b90d9}.text-icon-button::-moz-focus-inner{border:0}.text-icon-button::-moz-focus-inner,.text-icon-button:focus,.text-icon-button:active{outline:0 !important}.dropdown-menu{position:absolute}.invisible{font-size:0;line-height:0;display:inline-block;width:0;height:0;position:absolute}.invisible img,.invisible svg{margin:0 !important;border:0 !important;padding:0 !important;width:0 !important;height:0 !important}.ellipsis::after{content:\"…\"}.compose-form{padding:10px}.compose-form__sensitive-button{padding:10px;padding-top:0;font-size:14px;font-weight:500}.compose-form__sensitive-button.active{color:#2b90d9}.compose-form__sensitive-button input[type=checkbox]{display:none}.compose-form__sensitive-button .checkbox{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:4px;vertical-align:middle}.compose-form__sensitive-button .checkbox.active{border-color:#2b90d9;background:#2b90d9}.compose-form .compose-form__warning{color:#000;margin-bottom:10px;background:#9baec8;box-shadow:0 2px 6px rgba(0,0,0,.3);padding:8px 10px;border-radius:4px;font-size:13px;font-weight:400}.compose-form .compose-form__warning strong{color:#000;font-weight:500}.compose-form .compose-form__warning strong:lang(ja){font-weight:700}.compose-form .compose-form__warning strong:lang(ko){font-weight:700}.compose-form .compose-form__warning strong:lang(zh-CN){font-weight:700}.compose-form .compose-form__warning strong:lang(zh-HK){font-weight:700}.compose-form .compose-form__warning strong:lang(zh-TW){font-weight:700}.compose-form .compose-form__warning a{color:#1b1e25;font-weight:500;text-decoration:underline}.compose-form .compose-form__warning a:hover,.compose-form .compose-form__warning a:active,.compose-form .compose-form__warning a:focus{text-decoration:none}.compose-form .emoji-picker-dropdown{position:absolute;top:0;right:0}.compose-form .compose-form__autosuggest-wrapper{position:relative}.compose-form .autosuggest-textarea,.compose-form .autosuggest-input,.compose-form .spoiler-input{position:relative;width:100%}.compose-form .spoiler-input{height:0;transform-origin:bottom;opacity:0}.compose-form .spoiler-input.spoiler-input--visible{height:36px;margin-bottom:11px;opacity:1}.compose-form .autosuggest-textarea__textarea,.compose-form .spoiler-input__input{display:block;box-sizing:border-box;width:100%;margin:0;color:#000;background:#fff;padding:10px;font-family:inherit;font-size:14px;resize:vertical;border:0;outline:0}.compose-form .autosuggest-textarea__textarea::placeholder,.compose-form .spoiler-input__input::placeholder{color:#c2cede}.compose-form .autosuggest-textarea__textarea:focus,.compose-form .spoiler-input__input:focus{outline:0}@media screen and (max-width: 600px){.compose-form .autosuggest-textarea__textarea,.compose-form .spoiler-input__input{font-size:16px}}.compose-form .spoiler-input__input{border-radius:4px}.compose-form .autosuggest-textarea__textarea{min-height:100px;border-radius:4px 4px 0 0;padding-bottom:0;padding-right:32px;resize:none;scrollbar-color:initial}.compose-form .autosuggest-textarea__textarea::-webkit-scrollbar{all:unset}@media screen and (max-width: 600px){.compose-form .autosuggest-textarea__textarea{height:100px !important;resize:vertical}}.compose-form .autosuggest-textarea__suggestions-wrapper{position:relative;height:0}.compose-form .autosuggest-textarea__suggestions{box-sizing:border-box;display:none;position:absolute;top:100%;width:100%;z-index:99;box-shadow:4px 4px 6px rgba(0,0,0,.4);background:#d9e1e8;border-radius:0 0 4px 4px;color:#000;font-size:14px;padding:6px}.compose-form .autosuggest-textarea__suggestions.autosuggest-textarea__suggestions--visible{display:block}.compose-form .autosuggest-textarea__suggestions__item{padding:10px;cursor:pointer;border-radius:4px}.compose-form .autosuggest-textarea__suggestions__item:hover,.compose-form .autosuggest-textarea__suggestions__item:focus,.compose-form .autosuggest-textarea__suggestions__item:active,.compose-form .autosuggest-textarea__suggestions__item.selected{background:#b9c8d5}.compose-form .autosuggest-account,.compose-form .autosuggest-emoji,.compose-form .autosuggest-hashtag{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;line-height:18px;font-size:14px}.compose-form .autosuggest-hashtag{justify-content:space-between}.compose-form .autosuggest-hashtag__name{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.compose-form .autosuggest-hashtag strong{font-weight:500}.compose-form .autosuggest-hashtag__uses{flex:0 0 auto;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.compose-form .autosuggest-account-icon,.compose-form .autosuggest-emoji img{display:block;margin-right:8px;width:16px;height:16px}.compose-form .autosuggest-account .display-name__account{color:#1b1e25}.compose-form .compose-form__modifiers{color:#000;font-family:inherit;font-size:14px;background:#fff}.compose-form .compose-form__modifiers .compose-form__upload-wrapper{overflow:hidden}.compose-form .compose-form__modifiers .compose-form__uploads-wrapper{display:flex;flex-direction:row;padding:5px;flex-wrap:wrap}.compose-form .compose-form__modifiers .compose-form__upload{flex:1 1 0;min-width:40%;margin:5px}.compose-form .compose-form__modifiers .compose-form__upload__actions{background:linear-gradient(180deg, rgba(0, 0, 0, 0.8) 0, rgba(0, 0, 0, 0.35) 80%, transparent);display:flex;align-items:flex-start;justify-content:space-between;opacity:0;transition:opacity .1s ease}.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button{flex:0 1 auto;color:#ecf0f4;font-size:14px;font-weight:500;padding:10px;font-family:inherit}.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button:hover,.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button:focus,.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button:active{color:#fff}.compose-form .compose-form__modifiers .compose-form__upload__actions.active{opacity:1}.compose-form .compose-form__modifiers .compose-form__upload-description{position:absolute;z-index:2;bottom:0;left:0;right:0;box-sizing:border-box;background:linear-gradient(0deg, rgba(0, 0, 0, 0.8) 0, rgba(0, 0, 0, 0.35) 80%, transparent);padding:10px;opacity:0;transition:opacity .1s ease}.compose-form .compose-form__modifiers .compose-form__upload-description textarea{background:transparent;color:#ecf0f4;border:0;padding:0;margin:0;width:100%;font-family:inherit;font-size:14px;font-weight:500}.compose-form .compose-form__modifiers .compose-form__upload-description textarea:focus{color:#fff}.compose-form .compose-form__modifiers .compose-form__upload-description textarea::placeholder{opacity:.75;color:#ecf0f4}.compose-form .compose-form__modifiers .compose-form__upload-description.active{opacity:1}.compose-form .compose-form__modifiers .compose-form__upload-thumbnail{border-radius:4px;background-color:#000;background-position:center;background-size:cover;background-repeat:no-repeat;height:140px;width:100%;overflow:hidden}.compose-form .compose-form__buttons-wrapper{padding:10px;background:#ebebeb;border-radius:0 0 4px 4px;display:flex;justify-content:space-between;flex:0 0 auto}.compose-form .compose-form__buttons-wrapper .compose-form__buttons{display:flex}.compose-form .compose-form__buttons-wrapper .compose-form__buttons .compose-form__upload-button-icon{line-height:27px}.compose-form .compose-form__buttons-wrapper .compose-form__buttons .compose-form__sensitive-button{display:none}.compose-form .compose-form__buttons-wrapper .compose-form__buttons .compose-form__sensitive-button.compose-form__sensitive-button--visible{display:block}.compose-form .compose-form__buttons-wrapper .compose-form__buttons .compose-form__sensitive-button .compose-form__sensitive-button__icon{line-height:27px}.compose-form .compose-form__buttons-wrapper .icon-button,.compose-form .compose-form__buttons-wrapper .text-icon-button{box-sizing:content-box;padding:0 3px}.compose-form .compose-form__buttons-wrapper .character-counter__wrapper{align-self:center;margin-right:4px}.compose-form .compose-form__publish{display:flex;justify-content:flex-end;min-width:0;flex:0 0 auto}.compose-form .compose-form__publish .compose-form__publish-button-wrapper{overflow:hidden;padding-top:10px}.character-counter{cursor:default;font-family:\"mastodon-font-sans-serif\",sans-serif;font-size:14px;font-weight:600;color:#1b1e25}.character-counter.character-counter--over{color:#ff5050}.no-reduce-motion .spoiler-input{transition:height .4s ease,opacity .4s ease}.emojione{font-size:inherit;vertical-align:middle;object-fit:contain;margin:-0.2ex .15em .2ex;width:16px;height:16px}.emojione img{width:auto}.reply-indicator{border-radius:4px;margin-bottom:10px;background:#9baec8;padding:10px;min-height:23px;overflow-y:auto;flex:0 2 auto}.reply-indicator__header{margin-bottom:5px;overflow:hidden}.reply-indicator__cancel{float:right;line-height:24px}.reply-indicator__display-name{color:#000;display:block;max-width:100%;line-height:24px;overflow:hidden;padding-right:25px;text-decoration:none}.reply-indicator__display-avatar{float:left;margin-right:5px}.status__content--with-action{cursor:pointer}.status__content,.reply-indicator__content{position:relative;font-size:15px;line-height:20px;word-wrap:break-word;font-weight:400;overflow:hidden;text-overflow:ellipsis;padding-top:2px;color:#fff}.status__content:focus,.reply-indicator__content:focus{outline:0}.status__content.status__content--with-spoiler,.reply-indicator__content.status__content--with-spoiler{white-space:normal}.status__content.status__content--with-spoiler .status__content__text,.reply-indicator__content.status__content--with-spoiler .status__content__text{white-space:pre-wrap}.status__content .emojione,.reply-indicator__content .emojione{width:20px;height:20px;margin:-3px 0 0}.status__content img,.reply-indicator__content img{max-width:100%;max-height:400px;object-fit:contain}.status__content p,.reply-indicator__content p{margin-bottom:20px;white-space:pre-wrap}.status__content p:last-child,.reply-indicator__content p:last-child{margin-bottom:0}.status__content a,.reply-indicator__content a{color:#d8a070;text-decoration:none}.status__content a:hover,.reply-indicator__content a:hover{text-decoration:underline}.status__content a:hover .fa,.reply-indicator__content a:hover .fa{color:#dae1ea}.status__content a.mention:hover,.reply-indicator__content a.mention:hover{text-decoration:none}.status__content a.mention:hover span,.reply-indicator__content a.mention:hover span{text-decoration:underline}.status__content a .fa,.reply-indicator__content a .fa{color:#c2cede}.status__content a.unhandled-link,.reply-indicator__content a.unhandled-link{color:#4e79df}.status__content .status__content__spoiler-link,.reply-indicator__content .status__content__spoiler-link{background:#8d9ac2}.status__content .status__content__spoiler-link:hover,.reply-indicator__content .status__content__spoiler-link:hover{background:#a4afce;text-decoration:none}.status__content .status__content__spoiler-link::-moz-focus-inner,.reply-indicator__content .status__content__spoiler-link::-moz-focus-inner{border:0}.status__content .status__content__spoiler-link::-moz-focus-inner,.status__content .status__content__spoiler-link:focus,.status__content .status__content__spoiler-link:active,.reply-indicator__content .status__content__spoiler-link::-moz-focus-inner,.reply-indicator__content .status__content__spoiler-link:focus,.reply-indicator__content .status__content__spoiler-link:active{outline:0 !important}.status__content .status__content__text,.reply-indicator__content .status__content__text{display:none}.status__content .status__content__text.status__content__text--visible,.reply-indicator__content .status__content__text.status__content__text--visible{display:block}.announcements__item__content{word-wrap:break-word;overflow-y:auto}.announcements__item__content .emojione{width:20px;height:20px;margin:-3px 0 0}.announcements__item__content p{margin-bottom:10px;white-space:pre-wrap}.announcements__item__content p:last-child{margin-bottom:0}.announcements__item__content a{color:#ecf0f4;text-decoration:none}.announcements__item__content a:hover{text-decoration:underline}.announcements__item__content a.mention:hover{text-decoration:none}.announcements__item__content a.mention:hover span{text-decoration:underline}.announcements__item__content a.unhandled-link{color:#4e79df}.status__content.status__content--collapsed{max-height:300px}.status__content__read-more-button{display:block;font-size:15px;line-height:20px;color:#4e79df;border:0;background:transparent;padding:0;padding-top:8px;text-decoration:none}.status__content__read-more-button:hover,.status__content__read-more-button:active{text-decoration:underline}.status__content__spoiler-link{display:inline-block;border-radius:2px;background:transparent;border:0;color:#000;font-weight:700;font-size:11px;padding:0 6px;text-transform:uppercase;line-height:20px;cursor:pointer;vertical-align:middle}.status__wrapper--filtered{color:#c2cede;border:0;font-size:inherit;text-align:center;line-height:inherit;margin:0;padding:15px;box-sizing:border-box;width:100%;clear:both;border-bottom:1px solid #393f4f}.status__prepend-icon-wrapper{left:-26px;position:absolute}.focusable:focus{outline:0;background:#313543}.focusable:focus .status.status-direct{background:#42485a}.focusable:focus .status.status-direct.muted{background:transparent}.focusable:focus .detailed-status,.focusable:focus .detailed-status__action-bar{background:#393f4f}.status{padding:8px 10px;padding-left:68px;position:relative;min-height:54px;border-bottom:1px solid #393f4f;cursor:default;opacity:1;animation:fade 150ms linear}@supports(-ms-overflow-style: -ms-autohiding-scrollbar){.status{padding-right:26px}}@keyframes fade{0%{opacity:0}100%{opacity:1}}.status .video-player,.status .audio-player{margin-top:8px}.status.status-direct:not(.read){background:#393f4f;border-bottom-color:#42485a}.status.light .status__relative-time{color:#364861}.status.light .status__display-name{color:#000}.status.light .display-name{color:#364861}.status.light .display-name strong{color:#000}.status.light .status__content{color:#000}.status.light .status__content a{color:#2b90d9}.status.light .status__content a.status__content__spoiler-link{color:#fff;background:#9baec8}.status.light .status__content a.status__content__spoiler-link:hover{background:#b5c3d6}.notification-favourite .status.status-direct{background:transparent}.notification-favourite .status.status-direct .icon-button.disabled{color:#b8c0d9}.status__relative-time,.notification__relative_time{color:#c2cede;float:right;font-size:14px}.status__display-name{color:#c2cede}.status__info .status__display-name{display:block;max-width:100%;padding-right:25px}.status__info{font-size:15px}.status-check-box{border-bottom:1px solid #d9e1e8;display:flex}.status-check-box .status-check-box__status{margin:10px 0 10px 10px;flex:1;overflow:hidden}.status-check-box .status-check-box__status .media-gallery{max-width:250px}.status-check-box .status-check-box__status .status__content{padding:0;white-space:normal}.status-check-box .status-check-box__status .video-player,.status-check-box .status-check-box__status .audio-player{margin-top:8px;max-width:250px}.status-check-box .status-check-box__status .media-gallery__item-thumbnail{cursor:default}.status-check-box-toggle{align-items:center;display:flex;flex:0 0 auto;justify-content:center;padding:10px}.status__prepend{margin-left:68px;color:#c2cede;padding:8px 0;padding-bottom:2px;font-size:14px;position:relative}.status__prepend .status__display-name strong{color:#c2cede}.status__prepend>span{display:block;overflow:hidden;text-overflow:ellipsis}.status__action-bar{align-items:center;display:flex;margin-top:8px}.status__action-bar__counter{display:inline-flex;margin-right:11px;align-items:center}.status__action-bar__counter .status__action-bar-button{margin-right:4px}.status__action-bar__counter__label{display:inline-block;width:14px;font-size:12px;font-weight:500;color:#8d9ac2}.status__action-bar-button{margin-right:18px}.status__action-bar-dropdown{height:23.15px;width:23.15px}.detailed-status__action-bar-dropdown{flex:1 1 auto;display:flex;align-items:center;justify-content:center;position:relative}.detailed-status{background:#313543;padding:14px 10px}.detailed-status--flex{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-start}.detailed-status--flex .status__content,.detailed-status--flex .detailed-status__meta{flex:100%}.detailed-status .status__content{font-size:19px;line-height:24px}.detailed-status .status__content .emojione{width:24px;height:24px;margin:-1px 0 0}.detailed-status .status__content .status__content__spoiler-link{line-height:24px;margin:-1px 0 0}.detailed-status .video-player,.detailed-status .audio-player{margin-top:8px}.detailed-status__meta{margin-top:15px;color:#c2cede;font-size:14px;line-height:18px}.detailed-status__action-bar{background:#313543;border-top:1px solid #393f4f;border-bottom:1px solid #393f4f;display:flex;flex-direction:row;padding:10px 0}.detailed-status__link{color:inherit;text-decoration:none}.detailed-status__favorites,.detailed-status__reblogs{display:inline-block;font-weight:500;font-size:12px;margin-left:6px}.reply-indicator__content{color:#000;font-size:14px}.reply-indicator__content a{color:#1b1e25}.domain{padding:10px;border-bottom:1px solid #393f4f}.domain .domain__domain-name{flex:1 1 auto;display:block;color:#fff;text-decoration:none;font-size:14px;font-weight:500}.domain__wrapper{display:flex}.domain_buttons{height:18px;padding:10px;white-space:nowrap}.account{padding:10px;border-bottom:1px solid #393f4f}.account.compact{padding:0;border-bottom:0}.account.compact .account__avatar-wrapper{margin-left:0}.account .account__display-name{flex:1 1 auto;display:block;color:#dde3ec;overflow:hidden;text-decoration:none;font-size:14px}.account__wrapper{display:flex}.account__avatar-wrapper{float:left;margin-left:12px;margin-right:12px}.account__avatar{border-radius:4px;background:transparent no-repeat;background-position:50%;background-clip:padding-box;position:relative}.account__avatar-inline{display:inline-block;vertical-align:middle;margin-right:5px}.account__avatar-composite{border-radius:4px;background:transparent no-repeat;background-position:50%;background-clip:padding-box;border-radius:50%;overflow:hidden;position:relative}.account__avatar-composite>div{float:left;position:relative;box-sizing:border-box}.account__avatar-composite__label{display:block;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);color:#fff;text-shadow:1px 1px 2px #000;font-weight:700;font-size:15px}a .account__avatar{cursor:pointer}.account__avatar-overlay{width:48px;height:48px;background-size:48px 48px}.account__avatar-overlay-base{border-radius:4px;background:transparent no-repeat;background-position:50%;background-clip:padding-box;width:36px;height:36px;background-size:36px 36px}.account__avatar-overlay-overlay{border-radius:4px;background:transparent no-repeat;background-position:50%;background-clip:padding-box;width:24px;height:24px;background-size:24px 24px;position:absolute;bottom:0;right:0;z-index:1}.account__relationship{height:18px;padding:10px;white-space:nowrap}.account__disclaimer{padding:10px;border-top:1px solid #393f4f;color:#c2cede}.account__disclaimer strong{font-weight:500}.account__disclaimer strong:lang(ja){font-weight:700}.account__disclaimer strong:lang(ko){font-weight:700}.account__disclaimer strong:lang(zh-CN){font-weight:700}.account__disclaimer strong:lang(zh-HK){font-weight:700}.account__disclaimer strong:lang(zh-TW){font-weight:700}.account__disclaimer a{font-weight:500;color:inherit;text-decoration:underline}.account__disclaimer a:hover,.account__disclaimer a:focus,.account__disclaimer a:active{text-decoration:none}.account__action-bar{border-top:1px solid #393f4f;border-bottom:1px solid #393f4f;line-height:36px;overflow:hidden;flex:0 0 auto;display:flex}.account__action-bar-dropdown{padding:10px}.account__action-bar-dropdown .icon-button{vertical-align:middle}.account__action-bar-dropdown .dropdown--active .dropdown__content.dropdown__right{left:6px;right:initial}.account__action-bar-dropdown .dropdown--active::after{bottom:initial;margin-left:11px;margin-top:-7px;right:initial}.account__action-bar-links{display:flex;flex:1 1 auto;line-height:18px;text-align:center}.account__action-bar__tab{text-decoration:none;overflow:hidden;flex:0 1 100%;border-right:1px solid #393f4f;padding:10px 0;border-bottom:4px solid transparent}.account__action-bar__tab.active{border-bottom:4px solid #2b5fd9}.account__action-bar__tab>span{display:block;text-transform:uppercase;font-size:11px;color:#dde3ec}.account__action-bar__tab strong{display:block;font-size:15px;font-weight:500;color:#fff}.account__action-bar__tab strong:lang(ja){font-weight:700}.account__action-bar__tab strong:lang(ko){font-weight:700}.account__action-bar__tab strong:lang(zh-CN){font-weight:700}.account__action-bar__tab strong:lang(zh-HK){font-weight:700}.account__action-bar__tab strong:lang(zh-TW){font-weight:700}.account-authorize{padding:14px 10px}.account-authorize .detailed-status__display-name{display:block;margin-bottom:15px;overflow:hidden}.account-authorize__avatar{float:left;margin-right:10px}.status__display-name,.status__relative-time,.detailed-status__display-name,.detailed-status__datetime,.detailed-status__application,.account__display-name{text-decoration:none}.status__display-name strong,.account__display-name strong{color:#fff}.muted .emojione{opacity:.5}.status__display-name:hover strong,.reply-indicator__display-name:hover strong,.detailed-status__display-name:hover strong,a.account__display-name:hover strong{text-decoration:underline}.account__display-name strong{display:block;overflow:hidden;text-overflow:ellipsis}.detailed-status__application,.detailed-status__datetime{color:inherit}.detailed-status .button.logo-button{margin-bottom:15px}.detailed-status__display-name{color:#ecf0f4;display:block;line-height:24px;margin-bottom:15px;overflow:hidden}.detailed-status__display-name strong,.detailed-status__display-name span{display:block;text-overflow:ellipsis;overflow:hidden}.detailed-status__display-name strong{font-size:16px;color:#fff}.detailed-status__display-avatar{float:left;margin-right:10px}.status__avatar{height:48px;left:10px;position:absolute;top:10px;width:48px}.status__expand{width:68px;position:absolute;left:0;top:0;height:100%;cursor:pointer}.muted .status__content,.muted .status__content p,.muted .status__content a{color:#c2cede}.muted .status__display-name strong{color:#c2cede}.muted .status__avatar{opacity:.5}.muted a.status__content__spoiler-link{background:#606984;color:#000}.muted a.status__content__spoiler-link:hover{background:#707b97;text-decoration:none}.notification__message{margin:0 10px 0 68px;padding:8px 0 0;cursor:default;color:#dde3ec;font-size:15px;line-height:22px;position:relative}.notification__message .fa{color:#2b90d9}.notification__message>span{display:inline;overflow:hidden;text-overflow:ellipsis}.notification__favourite-icon-wrapper{left:-26px;position:absolute}.notification__favourite-icon-wrapper .star-icon{color:#ca8f04}.star-icon.active{color:#ca8f04}.bookmark-icon.active{color:#ff5050}.no-reduce-motion .icon-button.star-icon.activate>.fa-star{animation:spring-rotate-in 1s linear}.no-reduce-motion .icon-button.star-icon.deactivate>.fa-star{animation:spring-rotate-out 1s linear}.notification__display-name{color:inherit;font-weight:500;text-decoration:none}.notification__display-name:hover{color:#fff;text-decoration:underline}.notification__relative_time{float:right}.display-name{display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.display-name__html{font-weight:500}.display-name__account{font-size:14px}.status__relative-time:hover,.detailed-status__datetime:hover{text-decoration:underline}.image-loader{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center;flex-direction:column}.image-loader .image-loader__preview-canvas{max-width:100%;max-height:80%;background:url(\"~images/void.png\") repeat;object-fit:contain}.image-loader .loading-bar{position:relative}.image-loader.image-loader--amorphous .image-loader__preview-canvas{display:none}.zoomable-image{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center}.zoomable-image img{max-width:100%;max-height:80%;width:auto;height:auto;object-fit:contain}.navigation-bar{padding:10px;display:flex;align-items:center;flex-shrink:0;cursor:default;color:#dde3ec}.navigation-bar strong{color:#ecf0f4}.navigation-bar a{color:inherit}.navigation-bar .permalink{text-decoration:none}.navigation-bar .navigation-bar__actions{position:relative}.navigation-bar .navigation-bar__actions .icon-button.close{position:absolute;pointer-events:none;transform:scale(0, 1) translate(-100%, 0);opacity:0}.navigation-bar .navigation-bar__actions .compose__action-bar .icon-button{pointer-events:auto;transform:scale(1, 1) translate(0, 0);opacity:1}.navigation-bar__profile{flex:1 1 auto;margin-left:8px;line-height:20px;margin-top:-1px;overflow:hidden}.navigation-bar__profile-account{display:block;font-weight:500;overflow:hidden;text-overflow:ellipsis}.navigation-bar__profile-edit{color:inherit;text-decoration:none}.dropdown{display:inline-block}.dropdown__content{display:none;position:absolute}.dropdown-menu__separator{border-bottom:1px solid #c0cdd9;margin:5px 7px 6px;height:0}.dropdown-menu{background:#d9e1e8;padding:4px 0;border-radius:4px;box-shadow:2px 4px 15px rgba(0,0,0,.4);z-index:9999}.dropdown-menu ul{list-style:none}.dropdown-menu.left{transform-origin:100% 50%}.dropdown-menu.top{transform-origin:50% 100%}.dropdown-menu.bottom{transform-origin:50% 0}.dropdown-menu.right{transform-origin:0 50%}.dropdown-menu__arrow{position:absolute;width:0;height:0;border:0 solid transparent}.dropdown-menu__arrow.left{right:-5px;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#d9e1e8}.dropdown-menu__arrow.top{bottom:-5px;margin-left:-7px;border-width:5px 7px 0;border-top-color:#d9e1e8}.dropdown-menu__arrow.bottom{top:-5px;margin-left:-7px;border-width:0 7px 5px;border-bottom-color:#d9e1e8}.dropdown-menu__arrow.right{left:-5px;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#d9e1e8}.dropdown-menu__item a{font-size:13px;line-height:18px;display:block;padding:4px 14px;box-sizing:border-box;text-decoration:none;background:#d9e1e8;color:#000;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown-menu__item a:focus,.dropdown-menu__item a:hover,.dropdown-menu__item a:active{background:#2b5fd9;color:#ecf0f4;outline:0}.dropdown--active .dropdown__content{display:block;line-height:18px;max-width:311px;right:0;text-align:left;z-index:9999}.dropdown--active .dropdown__content>ul{list-style:none;background:#d9e1e8;padding:4px 0;border-radius:4px;box-shadow:0 0 15px rgba(0,0,0,.4);min-width:140px;position:relative}.dropdown--active .dropdown__content.dropdown__right{right:0}.dropdown--active .dropdown__content.dropdown__left>ul{left:-98px}.dropdown--active .dropdown__content>ul>li>a{font-size:13px;line-height:18px;display:block;padding:4px 14px;box-sizing:border-box;text-decoration:none;background:#d9e1e8;color:#000;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown--active .dropdown__content>ul>li>a:focus{outline:0}.dropdown--active .dropdown__content>ul>li>a:hover{background:#2b5fd9;color:#ecf0f4}.dropdown__icon{vertical-align:middle}.columns-area{display:flex;flex:1 1 auto;flex-direction:row;justify-content:flex-start;overflow-x:auto;position:relative}.columns-area.unscrollable{overflow-x:hidden}.columns-area__panels{display:flex;justify-content:center;width:100%;height:100%;min-height:100vh}.columns-area__panels__pane{height:100%;overflow:hidden;pointer-events:none;display:flex;justify-content:flex-end;min-width:285px}.columns-area__panels__pane--start{justify-content:flex-start}.columns-area__panels__pane__inner{position:fixed;width:285px;pointer-events:auto;height:100%}.columns-area__panels__main{box-sizing:border-box;width:100%;max-width:600px;flex:0 0 auto;display:flex;flex-direction:column}@media screen and (min-width: 415px){.columns-area__panels__main{padding:0 10px}}.tabs-bar__wrapper{background:#17191f;position:sticky;top:0;z-index:2;padding-top:0}@media screen and (min-width: 415px){.tabs-bar__wrapper{padding-top:10px}}.tabs-bar__wrapper .tabs-bar{margin-bottom:0}@media screen and (min-width: 415px){.tabs-bar__wrapper .tabs-bar{margin-bottom:10px}}.react-swipeable-view-container,.react-swipeable-view-container .columns-area,.react-swipeable-view-container .drawer,.react-swipeable-view-container .column{height:100%}.react-swipeable-view-container>*{display:flex;align-items:center;justify-content:center;height:100%}.column{width:350px;position:relative;box-sizing:border-box;display:flex;flex-direction:column}.column>.scrollable{background:#282c37;border-bottom-left-radius:2px;border-bottom-right-radius:2px}.ui{flex:0 0 auto;display:flex;flex-direction:column;width:100%;height:100%}.drawer{width:330px;box-sizing:border-box;display:flex;flex-direction:column;overflow-y:hidden}.drawer__tab{display:block;flex:1 1 auto;padding:15px 5px 13px;color:#dde3ec;text-decoration:none;text-align:center;font-size:16px;border-bottom:2px solid transparent}.column,.drawer{flex:1 1 auto;overflow:hidden}@media screen and (min-width: 631px){.columns-area{padding:0}.column,.drawer{flex:0 0 auto;padding:10px;padding-left:5px;padding-right:5px}.column:first-child,.drawer:first-child{padding-left:10px}.column:last-child,.drawer:last-child{padding-right:10px}.columns-area>div .column,.columns-area>div .drawer{padding-left:5px;padding-right:5px}}.tabs-bar{box-sizing:border-box;display:flex;background:#393f4f;flex:0 0 auto;overflow-y:auto}.tabs-bar__link{display:block;flex:1 1 auto;padding:15px 10px;padding-bottom:13px;color:#fff;text-decoration:none;text-align:center;font-size:14px;font-weight:500;border-bottom:2px solid #393f4f;transition:all 50ms linear;transition-property:border-bottom,background,color}.tabs-bar__link .fa{font-weight:400;font-size:16px}@media screen and (min-width: 631px){.tabs-bar__link:hover,.tabs-bar__link:focus,.tabs-bar__link:active{background:#464d60;border-bottom-color:#464d60}}.tabs-bar__link.active{border-bottom:2px solid #2b90d9;color:#2b90d9}.tabs-bar__link span{margin-left:5px;display:none}@media screen and (min-width: 600px){.tabs-bar__link span{display:inline}}.columns-area--mobile{flex-direction:column;width:100%;height:100%;margin:0 auto}.columns-area--mobile .column,.columns-area--mobile .drawer{width:100%;height:100%;padding:0}.columns-area--mobile .directory__list{display:grid;grid-gap:10px;grid-template-columns:minmax(0, 50%) minmax(0, 50%)}@media screen and (max-width: 415px){.columns-area--mobile .directory__list{display:block}}.columns-area--mobile .directory__card{margin-bottom:0}.columns-area--mobile .filter-form{display:flex}.columns-area--mobile .autosuggest-textarea__textarea{font-size:16px}.columns-area--mobile .search__input{line-height:18px;font-size:16px;padding:15px;padding-right:30px}.columns-area--mobile .search__icon .fa{top:15px}.columns-area--mobile .scrollable{overflow:visible}@supports(display: grid){.columns-area--mobile .scrollable{contain:content}}@media screen and (min-width: 415px){.columns-area--mobile{padding:10px 0;padding-top:0}}@media screen and (min-width: 630px){.columns-area--mobile .detailed-status{padding:15px}.columns-area--mobile .detailed-status .media-gallery,.columns-area--mobile .detailed-status .video-player,.columns-area--mobile .detailed-status .audio-player{margin-top:15px}.columns-area--mobile .account__header__bar{padding:5px 10px}.columns-area--mobile .navigation-bar,.columns-area--mobile .compose-form{padding:15px}.columns-area--mobile .compose-form .compose-form__publish .compose-form__publish-button-wrapper{padding-top:15px}.columns-area--mobile .status{padding:15px 15px 15px 78px;min-height:50px}.columns-area--mobile .status__avatar{left:15px;top:17px}.columns-area--mobile .status__content{padding-top:5px}.columns-area--mobile .status__prepend{margin-left:78px;padding-top:15px}.columns-area--mobile .status__prepend-icon-wrapper{left:-32px}.columns-area--mobile .status .media-gallery,.columns-area--mobile .status__action-bar,.columns-area--mobile .status .video-player,.columns-area--mobile .status .audio-player{margin-top:10px}.columns-area--mobile .account{padding:15px 10px}.columns-area--mobile .account__header__bio{margin:0 -10px}.columns-area--mobile .notification__message{margin-left:78px;padding-top:15px}.columns-area--mobile .notification__favourite-icon-wrapper{left:-32px}.columns-area--mobile .notification .status{padding-top:8px}.columns-area--mobile .notification .account{padding-top:8px}.columns-area--mobile .notification .account__avatar-wrapper{margin-left:17px;margin-right:15px}}.floating-action-button{position:fixed;display:flex;justify-content:center;align-items:center;width:3.9375rem;height:3.9375rem;bottom:1.3125rem;right:1.3125rem;background:#2558d0;color:#fff;border-radius:50%;font-size:21px;line-height:21px;text-decoration:none;box-shadow:2px 3px 9px rgba(0,0,0,.4)}.floating-action-button:hover,.floating-action-button:focus,.floating-action-button:active{background:#4976de}@media screen and (min-width: 415px){.tabs-bar{width:100%}.react-swipeable-view-container .columns-area--mobile{height:calc(100% - 10px) !important}.getting-started__wrapper,.getting-started__trends,.search{margin-bottom:10px}.getting-started__panel{margin:10px 0}.column,.drawer{min-width:330px}}@media screen and (max-width: 895px){.columns-area__panels__pane--compositional{display:none}}@media screen and (min-width: 895px){.floating-action-button,.tabs-bar__link.optional{display:none}.search-page .search{display:none}}@media screen and (max-width: 1190px){.columns-area__panels__pane--navigational{display:none}}@media screen and (min-width: 1190px){.tabs-bar{display:none}}.icon-with-badge{position:relative}.icon-with-badge__badge{position:absolute;left:9px;top:-13px;background:#2b5fd9;border:2px solid #393f4f;padding:1px 6px;border-radius:6px;font-size:10px;font-weight:500;line-height:14px;color:#fff}.column-link--transparent .icon-with-badge__badge{border-color:#17191f}.compose-panel{width:285px;margin-top:10px;display:flex;flex-direction:column;height:calc(100% - 10px);overflow-y:hidden}.compose-panel .navigation-bar{padding-top:20px;padding-bottom:20px;flex:0 1 48px;min-height:20px}.compose-panel .flex-spacer{background:transparent}.compose-panel .compose-form{flex:1;overflow-y:hidden;display:flex;flex-direction:column;min-height:310px;padding-bottom:71px;margin-bottom:-71px}.compose-panel .compose-form__autosuggest-wrapper{overflow-y:auto;background-color:#fff;border-radius:4px 4px 0 0;flex:0 1 auto}.compose-panel .autosuggest-textarea__textarea{overflow-y:hidden}.compose-panel .compose-form__upload-thumbnail{height:80px}.navigation-panel{margin-top:10px;margin-bottom:10px;height:calc(100% - 20px);overflow-y:auto;display:flex;flex-direction:column}.navigation-panel>a{flex:0 0 auto}.navigation-panel hr{flex:0 0 auto;border:0;background:transparent;border-top:1px solid #313543;margin:10px 0}.navigation-panel .flex-spacer{background:transparent}.drawer__pager{box-sizing:border-box;padding:0;flex-grow:1;position:relative;overflow:hidden;display:flex}.drawer__inner{position:absolute;top:0;left:0;background:#444b5d;box-sizing:border-box;padding:0;display:flex;flex-direction:column;overflow:hidden;overflow-y:auto;width:100%;height:100%;border-radius:2px}.drawer__inner.darker{background:#282c37}.drawer__inner__mastodon{background:#444b5d url('data:image/svg+xml;utf8,') no-repeat bottom/100% auto;flex:1;min-height:47px;display:none}.drawer__inner__mastodon>img{display:block;object-fit:contain;object-position:bottom left;width:85%;height:100%;pointer-events:none;user-drag:none;user-select:none}@media screen and (min-height: 640px){.drawer__inner__mastodon{display:block}}.pseudo-drawer{background:#444b5d;font-size:13px;text-align:left}.drawer__header{flex:0 0 auto;font-size:16px;background:#393f4f;margin-bottom:10px;display:flex;flex-direction:row;border-radius:2px}.drawer__header a{transition:background 100ms ease-in}.drawer__header a:hover{background:#2e3340;transition:background 200ms ease-out}.scrollable{overflow-y:scroll;overflow-x:hidden;flex:1 1 auto;-webkit-overflow-scrolling:touch}.scrollable.optionally-scrollable{overflow-y:auto}@supports(display: grid){.scrollable{contain:strict}}.scrollable--flex{display:flex;flex-direction:column}.scrollable__append{flex:1 1 auto;position:relative;min-height:120px}@supports(display: grid){.scrollable.fullscreen{contain:none}}.column-back-button{box-sizing:border-box;width:100%;background:#313543;color:#2b90d9;cursor:pointer;flex:0 0 auto;font-size:16px;line-height:inherit;border:0;text-align:unset;padding:15px;margin:0;z-index:3;outline:0}.column-back-button:hover{text-decoration:underline}.column-header__back-button{background:#313543;border:0;font-family:inherit;color:#2b90d9;cursor:pointer;white-space:nowrap;font-size:16px;padding:0 5px 0 0;z-index:3}.column-header__back-button:hover{text-decoration:underline}.column-header__back-button:last-child{padding:0 15px 0 0}.column-back-button__icon{display:inline-block;margin-right:5px}.column-back-button--slim{position:relative}.column-back-button--slim-button{cursor:pointer;flex:0 0 auto;font-size:16px;padding:15px;position:absolute;right:0;top:-48px}.react-toggle{display:inline-block;position:relative;cursor:pointer;background-color:transparent;border:0;padding:0;user-select:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-tap-highlight-color:transparent}.react-toggle-screenreader-only{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.react-toggle--disabled{cursor:not-allowed;opacity:.5;transition:opacity .25s}.react-toggle-track{width:50px;height:24px;padding:0;border-radius:30px;background-color:#282c37;transition:background-color .2s ease}.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track{background-color:#131419}.react-toggle--checked .react-toggle-track{background-color:#2b5fd9}.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track{background-color:#5680e1}.react-toggle-track-check{position:absolute;width:14px;height:10px;top:0;bottom:0;margin-top:auto;margin-bottom:auto;line-height:0;left:8px;opacity:0;transition:opacity .25s ease}.react-toggle--checked .react-toggle-track-check{opacity:1;transition:opacity .25s ease}.react-toggle-track-x{position:absolute;width:10px;height:10px;top:0;bottom:0;margin-top:auto;margin-bottom:auto;line-height:0;right:10px;opacity:1;transition:opacity .25s ease}.react-toggle--checked .react-toggle-track-x{opacity:0}.react-toggle-thumb{position:absolute;top:1px;left:1px;width:22px;height:22px;border:1px solid #282c37;border-radius:50%;background-color:#fafafa;box-sizing:border-box;transition:all .25s ease;transition-property:border-color,left}.react-toggle--checked .react-toggle-thumb{left:27px;border-color:#2b5fd9}.column-link{background:#393f4f;color:#fff;display:block;font-size:16px;padding:15px;text-decoration:none}.column-link:hover,.column-link:focus,.column-link:active{background:#404657}.column-link:focus{outline:0}.column-link--transparent{background:transparent;color:#d9e1e8}.column-link--transparent:hover,.column-link--transparent:focus,.column-link--transparent:active{background:transparent;color:#fff}.column-link--transparent.active{color:#2b5fd9}.column-link__icon{display:inline-block;margin-right:5px}.column-link__badge{display:inline-block;border-radius:4px;font-size:12px;line-height:19px;font-weight:500;background:#282c37;padding:4px 8px;margin:-6px 10px}.column-subheading{background:#282c37;color:#c2cede;padding:8px 20px;font-size:12px;font-weight:500;text-transform:uppercase;cursor:default}.getting-started__wrapper,.getting-started,.flex-spacer{background:#282c37}.flex-spacer{flex:1 1 auto}.getting-started{color:#c2cede;overflow:auto;border-bottom-left-radius:2px;border-bottom-right-radius:2px}.getting-started__wrapper,.getting-started__panel,.getting-started__footer{height:min-content}.getting-started__panel,.getting-started__footer{padding:10px;padding-top:20px;flex-grow:0}.getting-started__panel ul,.getting-started__footer ul{margin-bottom:10px}.getting-started__panel ul li,.getting-started__footer ul li{display:inline}.getting-started__panel p,.getting-started__footer p{font-size:13px}.getting-started__panel p a,.getting-started__footer p a{color:#c2cede;text-decoration:underline}.getting-started__panel a,.getting-started__footer a{text-decoration:none;color:#dde3ec}.getting-started__panel a:hover,.getting-started__panel a:focus,.getting-started__panel a:active,.getting-started__footer a:hover,.getting-started__footer a:focus,.getting-started__footer a:active{text-decoration:underline}.getting-started__wrapper,.getting-started__footer{color:#c2cede}.getting-started__trends{flex:0 1 auto;opacity:1;animation:fade 150ms linear;margin-top:10px}.getting-started__trends h4{font-size:12px;text-transform:uppercase;color:#dde3ec;padding:10px;font-weight:500;border-bottom:1px solid #393f4f}@media screen and (max-height: 810px){.getting-started__trends .trends__item:nth-child(3){display:none}}@media screen and (max-height: 720px){.getting-started__trends .trends__item:nth-child(2){display:none}}@media screen and (max-height: 670px){.getting-started__trends{display:none}}.getting-started__trends .trends__item{border-bottom:0;padding:10px}.getting-started__trends .trends__item__current{color:#dde3ec}.keyboard-shortcuts{padding:8px 0 0;overflow:hidden}.keyboard-shortcuts thead{position:absolute;left:-9999px}.keyboard-shortcuts td{padding:0 10px 8px}.keyboard-shortcuts kbd{display:inline-block;padding:3px 5px;background-color:#393f4f;border:1px solid #1f232b}.setting-text{display:block;box-sizing:border-box;width:100%;margin:0;color:#000;background:#fff;padding:10px;font-family:inherit;font-size:14px;resize:vertical;border:0;outline:0;border-radius:4px}.setting-text:focus{outline:0}@media screen and (max-width: 600px){.setting-text{font-size:16px}}.no-reduce-motion button.icon-button i.fa-retweet{background-position:0 0;height:19px;transition:background-position .9s steps(10);transition-duration:0s;vertical-align:middle;width:22px}.no-reduce-motion button.icon-button i.fa-retweet::before{display:none !important}.no-reduce-motion button.icon-button.active i.fa-retweet{transition-duration:.9s;background-position:0 100%}.reduce-motion button.icon-button i.fa-retweet{color:#8d9ac2;transition:color 100ms ease-in}.reduce-motion button.icon-button.active i.fa-retweet{color:#2b90d9}.status-card{display:flex;font-size:14px;border:1px solid #393f4f;border-radius:4px;color:#c2cede;margin-top:14px;text-decoration:none;overflow:hidden}.status-card__actions{bottom:0;left:0;position:absolute;right:0;top:0;display:flex;justify-content:center;align-items:center}.status-card__actions>div{background:rgba(0,0,0,.6);border-radius:8px;padding:12px 9px;flex:0 0 auto;display:flex;justify-content:center;align-items:center}.status-card__actions button,.status-card__actions a{display:inline;color:#ecf0f4;background:transparent;border:0;padding:0 8px;text-decoration:none;font-size:18px;line-height:18px}.status-card__actions button:hover,.status-card__actions button:active,.status-card__actions button:focus,.status-card__actions a:hover,.status-card__actions a:active,.status-card__actions a:focus{color:#fff}.status-card__actions a{font-size:19px;position:relative;bottom:-1px}a.status-card{cursor:pointer}a.status-card:hover{background:#393f4f}.status-card-photo{cursor:zoom-in;display:block;text-decoration:none;width:100%;height:auto;margin:0}.status-card-video iframe{width:100%;height:100%}.status-card__title{display:block;font-weight:500;margin-bottom:5px;color:#dde3ec;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-decoration:none}.status-card__content{flex:1 1 auto;overflow:hidden;padding:14px 14px 14px 8px}.status-card__description{color:#dde3ec}.status-card__host{display:block;margin-top:5px;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-card__image{flex:0 0 100px;background:#393f4f;position:relative}.status-card__image>.fa{font-size:21px;position:absolute;transform-origin:50% 50%;top:50%;left:50%;transform:translate(-50%, -50%)}.status-card.horizontal{display:block}.status-card.horizontal .status-card__image{width:100%}.status-card.horizontal .status-card__image-image{border-radius:4px 4px 0 0}.status-card.horizontal .status-card__title{white-space:inherit}.status-card.compact{border-color:#313543}.status-card.compact.interactive{border:0}.status-card.compact .status-card__content{padding:8px;padding-top:10px}.status-card.compact .status-card__title{white-space:nowrap}.status-card.compact .status-card__image{flex:0 0 60px}a.status-card.compact:hover{background-color:#313543}.status-card__image-image{border-radius:4px 0 0 4px;display:block;margin:0;width:100%;height:100%;object-fit:cover;background-size:cover;background-position:center center}.load-more{display:block;color:#c2cede;background-color:transparent;border:0;font-size:inherit;text-align:center;line-height:inherit;margin:0;padding:15px;box-sizing:border-box;width:100%;clear:both;text-decoration:none}.load-more:hover{background:#2c313d}.load-gap{border-bottom:1px solid #393f4f}.regeneration-indicator{text-align:center;font-size:16px;font-weight:500;color:#c2cede;background:#282c37;cursor:default;display:flex;flex:1 1 auto;flex-direction:column;align-items:center;justify-content:center;padding:20px}.regeneration-indicator__figure,.regeneration-indicator__figure img{display:block;width:auto;height:160px;margin:0}.regeneration-indicator--without-header{padding-top:68px}.regeneration-indicator__label{margin-top:30px}.regeneration-indicator__label strong{display:block;margin-bottom:10px;color:#c2cede}.regeneration-indicator__label span{font-size:15px;font-weight:400}.column-header__wrapper{position:relative;flex:0 0 auto;z-index:1}.column-header__wrapper.active{box-shadow:0 1px 0 rgba(43,144,217,.3)}.column-header__wrapper.active::before{display:block;content:\"\";position:absolute;bottom:-13px;left:0;right:0;margin:0 auto;width:60%;pointer-events:none;height:28px;z-index:1;background:radial-gradient(ellipse, rgba(43, 95, 217, 0.23) 0%, rgba(43, 95, 217, 0) 60%)}.column-header__wrapper .announcements{z-index:1;position:relative}.column-header{display:flex;font-size:16px;background:#313543;flex:0 0 auto;cursor:pointer;position:relative;z-index:2;outline:0;overflow:hidden;border-top-left-radius:2px;border-top-right-radius:2px}.column-header>button{margin:0;border:0;padding:15px 0 15px 15px;color:inherit;background:transparent;font:inherit;text-align:left;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;flex:1}.column-header>.column-header__back-button{color:#2b90d9}.column-header.active .column-header__icon{color:#2b90d9;text-shadow:0 0 10px rgba(43,144,217,.4)}.column-header:focus,.column-header:active{outline:0}.column-header__buttons{height:48px;display:flex}.column-header__links{margin-bottom:14px}.column-header__links .text-btn{margin-right:10px}.column-header__button{background:#313543;border:0;color:#dde3ec;cursor:pointer;font-size:16px;padding:0 15px}.column-header__button:hover{color:#f4f6f9}.column-header__button.active{color:#fff;background:#393f4f}.column-header__button.active:hover{color:#fff;background:#393f4f}.column-header__collapsible{max-height:70vh;overflow:hidden;overflow-y:auto;color:#dde3ec;transition:max-height 150ms ease-in-out,opacity 300ms linear;opacity:1;z-index:1;position:relative}.column-header__collapsible.collapsed{max-height:0;opacity:.5}.column-header__collapsible.animating{overflow-y:hidden}.column-header__collapsible hr{height:0;background:transparent;border:0;border-top:1px solid #42485a;margin:10px 0}.column-header__collapsible-inner{background:#393f4f;padding:15px}.column-header__setting-btn:hover{color:#dde3ec;text-decoration:underline}.column-header__setting-arrows{float:right}.column-header__setting-arrows .column-header__setting-btn{padding:0 10px}.column-header__setting-arrows .column-header__setting-btn:last-child{padding-right:0}.text-btn{display:inline-block;padding:0;font-family:inherit;font-size:inherit;color:inherit;border:0;background:transparent;cursor:pointer}.column-header__icon{display:inline-block;margin-right:5px}.loading-indicator{color:#c2cede;font-size:12px;font-weight:400;text-transform:uppercase;overflow:visible;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.loading-indicator span{display:block;float:left;margin-left:50%;transform:translateX(-50%);margin:82px 0 0 50%;white-space:nowrap}.loading-indicator__figure{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);width:42px;height:42px;box-sizing:border-box;background-color:transparent;border:0 solid #606984;border-width:6px;border-radius:50%}.no-reduce-motion .loading-indicator span{animation:loader-label 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1)}.no-reduce-motion .loading-indicator__figure{animation:loader-figure 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1)}@keyframes spring-rotate-in{0%{transform:rotate(0deg)}30%{transform:rotate(-484.8deg)}60%{transform:rotate(-316.7deg)}90%{transform:rotate(-375deg)}100%{transform:rotate(-360deg)}}@keyframes spring-rotate-out{0%{transform:rotate(-360deg)}30%{transform:rotate(124.8deg)}60%{transform:rotate(-43.27deg)}90%{transform:rotate(15deg)}100%{transform:rotate(0deg)}}@keyframes loader-figure{0%{width:0;height:0;background-color:#606984}29%{background-color:#606984}30%{width:42px;height:42px;background-color:transparent;border-width:21px;opacity:1}100%{width:42px;height:42px;border-width:0;opacity:0;background-color:transparent}}@keyframes loader-label{0%{opacity:.25}30%{opacity:1}100%{opacity:.25}}.video-error-cover{align-items:center;background:#000;color:#fff;cursor:pointer;display:flex;flex-direction:column;height:100%;justify-content:center;margin-top:8px;position:relative;text-align:center;z-index:100}.media-spoiler{background:#000;color:#dde3ec;border:0;padding:0;width:100%;height:100%;border-radius:4px;appearance:none}.media-spoiler:hover,.media-spoiler:active,.media-spoiler:focus{padding:0;color:#f7f9fb}.media-spoiler__warning{display:block;font-size:14px}.media-spoiler__trigger{display:block;font-size:11px;font-weight:700}.spoiler-button{top:0;left:0;width:100%;height:100%;position:absolute;z-index:100}.spoiler-button--minified{display:block;left:4px;top:4px;width:auto;height:auto}.spoiler-button--click-thru{pointer-events:none}.spoiler-button--hidden{display:none}.spoiler-button__overlay{display:block;background:transparent;width:100%;height:100%;border:0}.spoiler-button__overlay__label{display:inline-block;background:rgba(0,0,0,.5);border-radius:8px;padding:8px 12px;color:#fff;font-weight:500;font-size:14px}.spoiler-button__overlay:hover .spoiler-button__overlay__label,.spoiler-button__overlay:focus .spoiler-button__overlay__label,.spoiler-button__overlay:active .spoiler-button__overlay__label{background:rgba(0,0,0,.8)}.spoiler-button__overlay:disabled .spoiler-button__overlay__label{background:rgba(0,0,0,.5)}.modal-container--preloader{background:#393f4f}.account--panel{background:#313543;border-top:1px solid #393f4f;border-bottom:1px solid #393f4f;display:flex;flex-direction:row;padding:10px 0}.account--panel__button,.detailed-status__button{flex:1 1 auto;text-align:center}.column-settings__outer{background:#393f4f;padding:15px}.column-settings__section{color:#dde3ec;cursor:default;display:block;font-weight:500;margin-bottom:10px}.column-settings__hashtags .column-settings__row{margin-bottom:15px}.column-settings__hashtags .column-select__control{outline:0;box-sizing:border-box;width:100%;border:0;box-shadow:none;font-family:inherit;background:#282c37;color:#dde3ec;font-size:14px;margin:0}.column-settings__hashtags .column-select__control::placeholder{color:#eaeef3}.column-settings__hashtags .column-select__control::-moz-focus-inner{border:0}.column-settings__hashtags .column-select__control::-moz-focus-inner,.column-settings__hashtags .column-select__control:focus,.column-settings__hashtags .column-select__control:active{outline:0 !important}.column-settings__hashtags .column-select__control:focus{background:#313543}@media screen and (max-width: 600px){.column-settings__hashtags .column-select__control{font-size:16px}}.column-settings__hashtags .column-select__placeholder{color:#c2cede;padding-left:2px;font-size:12px}.column-settings__hashtags .column-select__value-container{padding-left:6px}.column-settings__hashtags .column-select__multi-value{background:#393f4f}.column-settings__hashtags .column-select__multi-value__remove{cursor:pointer}.column-settings__hashtags .column-select__multi-value__remove:hover,.column-settings__hashtags .column-select__multi-value__remove:active,.column-settings__hashtags .column-select__multi-value__remove:focus{background:#42485a;color:#eaeef3}.column-settings__hashtags .column-select__multi-value__label,.column-settings__hashtags .column-select__input{color:#dde3ec}.column-settings__hashtags .column-select__clear-indicator,.column-settings__hashtags .column-select__dropdown-indicator{cursor:pointer;transition:none;color:#c2cede}.column-settings__hashtags .column-select__clear-indicator:hover,.column-settings__hashtags .column-select__clear-indicator:active,.column-settings__hashtags .column-select__clear-indicator:focus,.column-settings__hashtags .column-select__dropdown-indicator:hover,.column-settings__hashtags .column-select__dropdown-indicator:active,.column-settings__hashtags .column-select__dropdown-indicator:focus{color:#d0d9e5}.column-settings__hashtags .column-select__indicator-separator{background-color:#393f4f}.column-settings__hashtags .column-select__menu{background:#fff;border-radius:4px;padding:10px 14px;padding-bottom:14px;margin-top:10px;color:#364861;box-shadow:2px 4px 15px rgba(0,0,0,.4);padding:0;background:#d9e1e8}.column-settings__hashtags .column-select__menu h4{text-transform:uppercase;color:#364861;font-size:13px;font-weight:500;margin-bottom:10px}.column-settings__hashtags .column-select__menu li{padding:4px 0}.column-settings__hashtags .column-select__menu ul{margin-bottom:10px}.column-settings__hashtags .column-select__menu em{font-weight:500;color:#000}.column-settings__hashtags .column-select__menu-list{padding:6px}.column-settings__hashtags .column-select__option{color:#000;border-radius:4px;font-size:14px}.column-settings__hashtags .column-select__option--is-focused,.column-settings__hashtags .column-select__option--is-selected{background:#b9c8d5}.column-settings__row .text-btn{margin-bottom:15px}.relationship-tag{color:#fff;margin-bottom:4px;display:block;vertical-align:top;background-color:#000;text-transform:uppercase;font-size:11px;font-weight:500;padding:4px;border-radius:4px;opacity:.7}.relationship-tag:hover{opacity:1}.setting-toggle{display:block;line-height:24px}.setting-toggle__label{color:#dde3ec;display:inline-block;margin-bottom:14px;margin-left:8px;vertical-align:middle}.empty-column-indicator,.error-column,.follow_requests-unlocked_explanation{color:#c2cede;background:#282c37;text-align:center;padding:20px;font-size:15px;font-weight:400;cursor:default;display:flex;flex:1 1 auto;align-items:center;justify-content:center}@supports(display: grid){.empty-column-indicator,.error-column,.follow_requests-unlocked_explanation{contain:strict}}.empty-column-indicator>span,.error-column>span,.follow_requests-unlocked_explanation>span{max-width:400px}.empty-column-indicator a,.error-column a,.follow_requests-unlocked_explanation a{color:#2b90d9;text-decoration:none}.empty-column-indicator a:hover,.error-column a:hover,.follow_requests-unlocked_explanation a:hover{text-decoration:underline}.follow_requests-unlocked_explanation{background:#1f232b;contain:initial}.error-column{flex-direction:column}@keyframes heartbeat{from{transform:scale(1);animation-timing-function:ease-out}10%{transform:scale(0.91);animation-timing-function:ease-in}17%{transform:scale(0.98);animation-timing-function:ease-out}33%{transform:scale(0.87);animation-timing-function:ease-in}45%{transform:scale(1);animation-timing-function:ease-out}}.no-reduce-motion .pulse-loading{transform-origin:center center;animation:heartbeat 1.5s ease-in-out infinite both}@keyframes shake-bottom{0%,100%{transform:rotate(0deg);transform-origin:50% 100%}10%{transform:rotate(2deg)}20%,40%,60%{transform:rotate(-4deg)}30%,50%,70%{transform:rotate(4deg)}80%{transform:rotate(-2deg)}90%{transform:rotate(2deg)}}.no-reduce-motion .shake-bottom{transform-origin:50% 100%;animation:shake-bottom .8s cubic-bezier(0.455, 0.03, 0.515, 0.955) 2s 2 both}.emoji-picker-dropdown__menu{background:#fff;position:absolute;box-shadow:4px 4px 6px rgba(0,0,0,.4);border-radius:4px;margin-top:5px;z-index:2}.emoji-picker-dropdown__menu .emoji-mart-scroll{transition:opacity 200ms ease}.emoji-picker-dropdown__menu.selecting .emoji-mart-scroll{opacity:.5}.emoji-picker-dropdown__modifiers{position:absolute;top:60px;right:11px;cursor:pointer}.emoji-picker-dropdown__modifiers__menu{position:absolute;z-index:4;top:-4px;left:-8px;background:#fff;border-radius:4px;box-shadow:1px 2px 6px rgba(0,0,0,.2);overflow:hidden}.emoji-picker-dropdown__modifiers__menu button{display:block;cursor:pointer;border:0;padding:4px 8px;background:transparent}.emoji-picker-dropdown__modifiers__menu button:hover,.emoji-picker-dropdown__modifiers__menu button:focus,.emoji-picker-dropdown__modifiers__menu button:active{background:rgba(217,225,232,.4)}.emoji-picker-dropdown__modifiers__menu .emoji-mart-emoji{height:22px}.emoji-mart-emoji span{background-repeat:no-repeat}.upload-area{align-items:center;background:rgba(0,0,0,.8);display:flex;height:100%;justify-content:center;left:0;opacity:0;position:absolute;top:0;visibility:hidden;width:100%;z-index:2000}.upload-area *{pointer-events:none}.upload-area__drop{width:320px;height:160px;display:flex;box-sizing:border-box;position:relative;padding:8px}.upload-area__background{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;border-radius:4px;background:#282c37;box-shadow:0 0 5px rgba(0,0,0,.2)}.upload-area__content{flex:1;display:flex;align-items:center;justify-content:center;color:#ecf0f4;font-size:18px;font-weight:500;border:2px dashed #606984;border-radius:4px}.upload-progress{padding:10px;color:#1b1e25;overflow:hidden;display:flex}.upload-progress .fa{font-size:34px;margin-right:10px}.upload-progress span{font-size:12px;text-transform:uppercase;font-weight:500;display:block}.upload-progess__message{flex:1 1 auto}.upload-progress__backdrop{width:100%;height:6px;border-radius:6px;background:#606984;position:relative;margin-top:5px}.upload-progress__tracker{position:absolute;left:0;top:0;height:6px;background:#2b5fd9;border-radius:6px}.emoji-button{display:block;padding:5px 5px 2px 2px;outline:0;cursor:pointer}.emoji-button:active,.emoji-button:focus{outline:0 !important}.emoji-button img{filter:grayscale(100%);opacity:.8;display:block;margin:0;width:22px;height:22px}.emoji-button:hover img,.emoji-button:active img,.emoji-button:focus img{opacity:1;filter:none}.dropdown--active .emoji-button img{opacity:1;filter:none}.privacy-dropdown__dropdown{position:absolute;background:#fff;box-shadow:2px 4px 15px rgba(0,0,0,.4);border-radius:4px;margin-left:40px;overflow:hidden}.privacy-dropdown__dropdown.top{transform-origin:50% 100%}.privacy-dropdown__dropdown.bottom{transform-origin:50% 0}.privacy-dropdown__option{color:#000;padding:10px;cursor:pointer;display:flex}.privacy-dropdown__option:hover,.privacy-dropdown__option.active{background:#2b5fd9;color:#fff;outline:0}.privacy-dropdown__option:hover .privacy-dropdown__option__content,.privacy-dropdown__option.active .privacy-dropdown__option__content{color:#fff}.privacy-dropdown__option:hover .privacy-dropdown__option__content strong,.privacy-dropdown__option.active .privacy-dropdown__option__content strong{color:#fff}.privacy-dropdown__option.active:hover{background:#3c6cdc}.privacy-dropdown__option__icon{display:flex;align-items:center;justify-content:center;margin-right:10px}.privacy-dropdown__option__content{flex:1 1 auto;color:#1b1e25}.privacy-dropdown__option__content strong{font-weight:500;display:block;color:#000}.privacy-dropdown__option__content strong:lang(ja){font-weight:700}.privacy-dropdown__option__content strong:lang(ko){font-weight:700}.privacy-dropdown__option__content strong:lang(zh-CN){font-weight:700}.privacy-dropdown__option__content strong:lang(zh-HK){font-weight:700}.privacy-dropdown__option__content strong:lang(zh-TW){font-weight:700}.privacy-dropdown.active .privacy-dropdown__value{background:#fff;border-radius:4px 4px 0 0;box-shadow:0 -4px 4px rgba(0,0,0,.1)}.privacy-dropdown.active .privacy-dropdown__value .icon-button{transition:none}.privacy-dropdown.active .privacy-dropdown__value.active{background:#2b5fd9}.privacy-dropdown.active .privacy-dropdown__value.active .icon-button{color:#fff}.privacy-dropdown.active.top .privacy-dropdown__value{border-radius:0 0 4px 4px}.privacy-dropdown.active .privacy-dropdown__dropdown{display:block;box-shadow:2px 4px 6px rgba(0,0,0,.1)}.search{position:relative}.search__input{outline:0;box-sizing:border-box;width:100%;border:0;box-shadow:none;font-family:inherit;background:#282c37;color:#dde3ec;font-size:14px;margin:0;display:block;padding:15px;padding-right:30px;line-height:18px;font-size:16px}.search__input::placeholder{color:#eaeef3}.search__input::-moz-focus-inner{border:0}.search__input::-moz-focus-inner,.search__input:focus,.search__input:active{outline:0 !important}.search__input:focus{background:#313543}@media screen and (max-width: 600px){.search__input{font-size:16px}}.search__icon::-moz-focus-inner{border:0}.search__icon::-moz-focus-inner,.search__icon:focus{outline:0 !important}.search__icon .fa{position:absolute;top:16px;right:10px;z-index:2;display:inline-block;opacity:0;transition:all 100ms linear;transition-property:transform,opacity;font-size:18px;width:18px;height:18px;color:#ecf0f4;cursor:default;pointer-events:none}.search__icon .fa.active{pointer-events:auto;opacity:.3}.search__icon .fa-search{transform:rotate(90deg)}.search__icon .fa-search.active{pointer-events:none;transform:rotate(0deg)}.search__icon .fa-times-circle{top:17px;transform:rotate(0deg);color:#8d9ac2;cursor:pointer}.search__icon .fa-times-circle.active{transform:rotate(90deg)}.search__icon .fa-times-circle:hover{color:#a4afce}.search-results__header{color:#c2cede;background:#2c313d;padding:15px;font-weight:500;font-size:16px;cursor:default}.search-results__header .fa{display:inline-block;margin-right:5px}.search-results__section{margin-bottom:5px}.search-results__section h5{background:#1f232b;border-bottom:1px solid #393f4f;cursor:default;display:flex;padding:15px;font-weight:500;font-size:16px;color:#c2cede}.search-results__section h5 .fa{display:inline-block;margin-right:5px}.search-results__section .account:last-child,.search-results__section>div:last-child .status{border-bottom:0}.search-results__hashtag{display:block;padding:10px;color:#ecf0f4;text-decoration:none}.search-results__hashtag:hover,.search-results__hashtag:active,.search-results__hashtag:focus{color:#f9fafb;text-decoration:underline}.search-results__info{padding:20px;color:#dde3ec;text-align:center}.modal-root{position:relative;transition:opacity .3s linear;will-change:opacity;z-index:9999}.modal-root__overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.7)}.modal-root__container{position:fixed;top:0;left:0;width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;align-content:space-around;z-index:9999;pointer-events:none;user-select:none}.modal-root__modal{pointer-events:auto;display:flex;z-index:9999}.video-modal__container{max-width:100vw;max-height:100vh}.audio-modal__container{width:50vw}.media-modal{width:100%;height:100%;position:relative}.media-modal .extended-video-player{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.media-modal .extended-video-player video{max-width:100%;max-height:80%}.media-modal__closer{position:absolute;top:0;left:0;right:0;bottom:0}.media-modal__navigation{position:absolute;top:0;left:0;right:0;bottom:0;pointer-events:none;transition:opacity .3s linear;will-change:opacity}.media-modal__navigation *{pointer-events:auto}.media-modal__navigation.media-modal__navigation--hidden{opacity:0}.media-modal__navigation.media-modal__navigation--hidden *{pointer-events:none}.media-modal__nav{background:rgba(0,0,0,.5);box-sizing:border-box;border:0;color:#fff;cursor:pointer;display:flex;align-items:center;font-size:24px;height:20vmax;margin:auto 0;padding:30px 15px;position:absolute;top:0;bottom:0}.media-modal__nav--left{left:0}.media-modal__nav--right{right:0}.media-modal__pagination{width:100%;text-align:center;position:absolute;left:0;bottom:20px;pointer-events:none}.media-modal__meta{text-align:center;position:absolute;left:0;bottom:20px;width:100%;pointer-events:none}.media-modal__meta--shifted{bottom:62px}.media-modal__meta a{pointer-events:auto;text-decoration:none;font-weight:500;color:#d9e1e8}.media-modal__meta a:hover,.media-modal__meta a:focus,.media-modal__meta a:active{text-decoration:underline}.media-modal__page-dot{display:inline-block}.media-modal__button{background-color:#fff;height:12px;width:12px;border-radius:6px;margin:10px;padding:0;border:0;font-size:0}.media-modal__button--active{background-color:#2b90d9}.media-modal__close{position:absolute;right:8px;top:8px;z-index:100}.onboarding-modal,.error-modal,.embed-modal{background:#d9e1e8;color:#000;border-radius:8px;overflow:hidden;display:flex;flex-direction:column}.error-modal__body{height:80vh;width:80vw;max-width:520px;max-height:420px;position:relative}.error-modal__body>div{position:absolute;top:0;left:0;width:100%;height:100%;box-sizing:border-box;padding:25px;display:none;flex-direction:column;align-items:center;justify-content:center;display:flex;opacity:0;user-select:text}.error-modal__body{display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center}.onboarding-modal__paginator,.error-modal__footer{flex:0 0 auto;background:#c0cdd9;display:flex;padding:25px}.onboarding-modal__paginator>div,.error-modal__footer>div{min-width:33px}.onboarding-modal__paginator .onboarding-modal__nav,.onboarding-modal__paginator .error-modal__nav,.error-modal__footer .onboarding-modal__nav,.error-modal__footer .error-modal__nav{color:#1b1e25;border:0;font-size:14px;font-weight:500;padding:10px 25px;line-height:inherit;height:auto;margin:-10px;border-radius:4px;background-color:transparent}.onboarding-modal__paginator .onboarding-modal__nav:hover,.onboarding-modal__paginator .onboarding-modal__nav:focus,.onboarding-modal__paginator .onboarding-modal__nav:active,.onboarding-modal__paginator .error-modal__nav:hover,.onboarding-modal__paginator .error-modal__nav:focus,.onboarding-modal__paginator .error-modal__nav:active,.error-modal__footer .onboarding-modal__nav:hover,.error-modal__footer .onboarding-modal__nav:focus,.error-modal__footer .onboarding-modal__nav:active,.error-modal__footer .error-modal__nav:hover,.error-modal__footer .error-modal__nav:focus,.error-modal__footer .error-modal__nav:active{color:#131419;background-color:#a6b9c9}.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next,.error-modal__footer .error-modal__nav.onboarding-modal__done,.error-modal__footer .error-modal__nav.onboarding-modal__next{color:#000}.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:hover,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:focus,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:active,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:hover,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:focus,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:active,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:hover,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:focus,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:active,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:hover,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:focus,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:active,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:hover,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:focus,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:active,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:hover,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:focus,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:active,.error-modal__footer .error-modal__nav.onboarding-modal__done:hover,.error-modal__footer .error-modal__nav.onboarding-modal__done:focus,.error-modal__footer .error-modal__nav.onboarding-modal__done:active,.error-modal__footer .error-modal__nav.onboarding-modal__next:hover,.error-modal__footer .error-modal__nav.onboarding-modal__next:focus,.error-modal__footer .error-modal__nav.onboarding-modal__next:active{color:#0a0a0a}.error-modal__footer{justify-content:center}.display-case{text-align:center;font-size:15px;margin-bottom:15px}.display-case__label{font-weight:500;color:#000;margin-bottom:5px;text-transform:uppercase;font-size:12px}.display-case__case{background:#282c37;color:#ecf0f4;font-weight:500;padding:10px;border-radius:4px}.onboard-sliders{display:inline-block;max-width:30px;max-height:auto;margin-left:10px}.boost-modal,.confirmation-modal,.report-modal,.actions-modal,.mute-modal,.block-modal{background:#f2f5f7;color:#000;border-radius:8px;overflow:hidden;max-width:90vw;width:480px;position:relative;flex-direction:column}.boost-modal .status__display-name,.confirmation-modal .status__display-name,.report-modal .status__display-name,.actions-modal .status__display-name,.mute-modal .status__display-name,.block-modal .status__display-name{display:block;max-width:100%;padding-right:25px}.boost-modal .status__avatar,.confirmation-modal .status__avatar,.report-modal .status__avatar,.actions-modal .status__avatar,.mute-modal .status__avatar,.block-modal .status__avatar{height:28px;left:10px;position:absolute;top:10px;width:48px}.boost-modal .status__content__spoiler-link,.confirmation-modal .status__content__spoiler-link,.report-modal .status__content__spoiler-link,.actions-modal .status__content__spoiler-link,.mute-modal .status__content__spoiler-link,.block-modal .status__content__spoiler-link{color:#fff}.actions-modal .status{background:#fff;border-bottom-color:#d9e1e8;padding-top:10px;padding-bottom:10px}.actions-modal .dropdown-menu__separator{border-bottom-color:#d9e1e8}.boost-modal__container{overflow-x:scroll;padding:10px}.boost-modal__container .status{user-select:text;border-bottom:0}.boost-modal__action-bar,.confirmation-modal__action-bar,.mute-modal__action-bar,.block-modal__action-bar{display:flex;justify-content:space-between;background:#d9e1e8;padding:10px;line-height:36px}.boost-modal__action-bar>div,.confirmation-modal__action-bar>div,.mute-modal__action-bar>div,.block-modal__action-bar>div{flex:1 1 auto;text-align:right;color:#1b1e25;padding-right:10px}.boost-modal__action-bar .button,.confirmation-modal__action-bar .button,.mute-modal__action-bar .button,.block-modal__action-bar .button{flex:0 0 auto}.boost-modal__status-header{font-size:15px}.boost-modal__status-time{float:right;font-size:14px}.mute-modal,.block-modal{line-height:24px}.mute-modal .react-toggle,.block-modal .react-toggle{vertical-align:middle}.report-modal{width:90vw;max-width:700px}.report-modal__container{display:flex;border-top:1px solid #d9e1e8}@media screen and (max-width: 480px){.report-modal__container{flex-wrap:wrap;overflow-y:auto}}.report-modal__statuses,.report-modal__comment{box-sizing:border-box;width:50%}@media screen and (max-width: 480px){.report-modal__statuses,.report-modal__comment{width:100%}}.report-modal__statuses,.focal-point-modal__content{flex:1 1 auto;min-height:20vh;max-height:80vh;overflow-y:auto;overflow-x:hidden}.report-modal__statuses .status__content a,.focal-point-modal__content .status__content a{color:#2b90d9}.report-modal__statuses .status__content,.report-modal__statuses .status__content p,.focal-point-modal__content .status__content,.focal-point-modal__content .status__content p{color:#000}@media screen and (max-width: 480px){.report-modal__statuses,.focal-point-modal__content{max-height:10vh}}@media screen and (max-width: 480px){.focal-point-modal__content{max-height:40vh}}.report-modal__comment{padding:20px;border-right:1px solid #d9e1e8;max-width:320px}.report-modal__comment p{font-size:14px;line-height:20px;margin-bottom:20px}.report-modal__comment .setting-text{display:block;box-sizing:border-box;width:100%;margin:0;color:#000;background:#fff;padding:10px;font-family:inherit;font-size:14px;resize:none;border:0;outline:0;border-radius:4px;border:1px solid #d9e1e8;min-height:100px;max-height:50vh;margin-bottom:10px}.report-modal__comment .setting-text:focus{border:1px solid #c0cdd9}.report-modal__comment .setting-text__wrapper{background:#fff;border:1px solid #d9e1e8;margin-bottom:10px;border-radius:4px}.report-modal__comment .setting-text__wrapper .setting-text{border:0;margin-bottom:0;border-radius:0}.report-modal__comment .setting-text__wrapper .setting-text:focus{border:0}.report-modal__comment .setting-text__wrapper__modifiers{color:#000;font-family:inherit;font-size:14px;background:#fff}.report-modal__comment .setting-text__toolbar{display:flex;justify-content:space-between;margin-bottom:20px}.report-modal__comment .setting-text-label{display:block;color:#000;font-size:14px;font-weight:500;margin-bottom:10px}.report-modal__comment .setting-toggle{margin-top:20px;margin-bottom:24px}.report-modal__comment .setting-toggle__label{color:#000;font-size:14px}@media screen and (max-width: 480px){.report-modal__comment{padding:10px;max-width:100%;order:2}.report-modal__comment .setting-toggle{margin-bottom:4px}}.actions-modal{max-height:80vh;max-width:80vw}.actions-modal .status{overflow-y:auto;max-height:300px}.actions-modal .actions-modal__item-label{font-weight:500}.actions-modal ul{overflow-y:auto;flex-shrink:0;max-height:80vh}.actions-modal ul.with-status{max-height:calc(80vh - 75px)}.actions-modal ul li:empty{margin:0}.actions-modal ul li:not(:empty) a{color:#000;display:flex;padding:12px 16px;font-size:15px;align-items:center;text-decoration:none}.actions-modal ul li:not(:empty) a,.actions-modal ul li:not(:empty) a button{transition:none}.actions-modal ul li:not(:empty) a.active,.actions-modal ul li:not(:empty) a.active button,.actions-modal ul li:not(:empty) a:hover,.actions-modal ul li:not(:empty) a:hover button,.actions-modal ul li:not(:empty) a:active,.actions-modal ul li:not(:empty) a:active button,.actions-modal ul li:not(:empty) a:focus,.actions-modal ul li:not(:empty) a:focus button{background:#2b5fd9;color:#fff}.actions-modal ul li:not(:empty) a button:first-child{margin-right:10px}.confirmation-modal__action-bar .confirmation-modal__secondary-button,.mute-modal__action-bar .confirmation-modal__secondary-button,.block-modal__action-bar .confirmation-modal__secondary-button{flex-shrink:1}.confirmation-modal__secondary-button,.confirmation-modal__cancel-button,.mute-modal__cancel-button,.block-modal__cancel-button{background-color:transparent;color:#1b1e25;font-size:14px;font-weight:500}.confirmation-modal__secondary-button:hover,.confirmation-modal__secondary-button:focus,.confirmation-modal__secondary-button:active,.confirmation-modal__cancel-button:hover,.confirmation-modal__cancel-button:focus,.confirmation-modal__cancel-button:active,.mute-modal__cancel-button:hover,.mute-modal__cancel-button:focus,.mute-modal__cancel-button:active,.block-modal__cancel-button:hover,.block-modal__cancel-button:focus,.block-modal__cancel-button:active{color:#131419;background-color:transparent}.confirmation-modal__container,.mute-modal__container,.block-modal__container,.report-modal__target{padding:30px;font-size:16px}.confirmation-modal__container strong,.mute-modal__container strong,.block-modal__container strong,.report-modal__target strong{font-weight:500}.confirmation-modal__container strong:lang(ja),.mute-modal__container strong:lang(ja),.block-modal__container strong:lang(ja),.report-modal__target strong:lang(ja){font-weight:700}.confirmation-modal__container strong:lang(ko),.mute-modal__container strong:lang(ko),.block-modal__container strong:lang(ko),.report-modal__target strong:lang(ko){font-weight:700}.confirmation-modal__container strong:lang(zh-CN),.mute-modal__container strong:lang(zh-CN),.block-modal__container strong:lang(zh-CN),.report-modal__target strong:lang(zh-CN){font-weight:700}.confirmation-modal__container strong:lang(zh-HK),.mute-modal__container strong:lang(zh-HK),.block-modal__container strong:lang(zh-HK),.report-modal__target strong:lang(zh-HK){font-weight:700}.confirmation-modal__container strong:lang(zh-TW),.mute-modal__container strong:lang(zh-TW),.block-modal__container strong:lang(zh-TW),.report-modal__target strong:lang(zh-TW){font-weight:700}.confirmation-modal__container,.report-modal__target{text-align:center}.block-modal__explanation,.mute-modal__explanation{margin-top:20px}.block-modal .setting-toggle,.mute-modal .setting-toggle{margin-top:20px;margin-bottom:24px;display:flex;align-items:center}.block-modal .setting-toggle__label,.mute-modal .setting-toggle__label{color:#000;margin:0;margin-left:8px}.report-modal__target{padding:15px}.report-modal__target .media-modal__close{top:14px;right:15px}.loading-bar{background-color:#2b90d9;height:3px;position:absolute;top:0;left:0;z-index:9999}.media-gallery__gifv__label{display:block;position:absolute;color:#fff;background:rgba(0,0,0,.5);bottom:6px;left:6px;padding:2px 6px;border-radius:2px;font-size:11px;font-weight:600;z-index:1;pointer-events:none;opacity:.9;transition:opacity .1s ease;line-height:18px}.media-gallery__gifv:hover .media-gallery__gifv__label{opacity:1}.media-gallery__audio{margin-top:32px}.media-gallery__audio audio{width:100%}.attachment-list{display:flex;font-size:14px;border:1px solid #393f4f;border-radius:4px;margin-top:14px;overflow:hidden}.attachment-list__icon{flex:0 0 auto;color:#c2cede;padding:8px 18px;cursor:default;border-right:1px solid #393f4f;display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:26px}.attachment-list__icon .fa{display:block}.attachment-list__list{list-style:none;padding:4px 0;padding-left:8px;display:flex;flex-direction:column;justify-content:center}.attachment-list__list li{display:block;padding:4px 0}.attachment-list__list a{text-decoration:none;color:#c2cede;font-weight:500}.attachment-list__list a:hover{text-decoration:underline}.attachment-list.compact{border:0;margin-top:4px}.attachment-list.compact .attachment-list__list{padding:0;display:block}.attachment-list.compact .fa{color:#c2cede}.media-gallery{box-sizing:border-box;margin-top:8px;overflow:hidden;border-radius:4px;position:relative;width:100%}.media-gallery__item{border:0;box-sizing:border-box;display:block;float:left;position:relative;border-radius:4px;overflow:hidden}.media-gallery__item.standalone .media-gallery__item-gifv-thumbnail{transform:none;top:0}.media-gallery__item-thumbnail{cursor:zoom-in;display:block;text-decoration:none;color:#ecf0f4;position:relative;z-index:1}.media-gallery__item-thumbnail,.media-gallery__item-thumbnail img{height:100%;width:100%}.media-gallery__item-thumbnail img{object-fit:cover}.media-gallery__preview{width:100%;height:100%;object-fit:cover;position:absolute;top:0;left:0;z-index:0;background:#000}.media-gallery__preview--hidden{display:none}.media-gallery__gifv{height:100%;overflow:hidden;position:relative;width:100%}.media-gallery__item-gifv-thumbnail{cursor:zoom-in;height:100%;object-fit:cover;position:relative;top:50%;transform:translateY(-50%);width:100%;z-index:1}.media-gallery__item-thumbnail-label{clip:rect(1px 1px 1px 1px);clip:rect(1px, 1px, 1px, 1px);overflow:hidden;position:absolute}.detailed .video-player__volume__current,.detailed .video-player__volume::before,.fullscreen .video-player__volume__current,.fullscreen .video-player__volume::before{bottom:27px}.detailed .video-player__volume__handle,.fullscreen .video-player__volume__handle{bottom:23px}.audio-player{box-sizing:border-box;position:relative;background:#17191f;border-radius:4px;padding-bottom:44px;direction:ltr}.audio-player.editable{border-radius:0;height:100%}.audio-player__waveform{padding:15px 0;position:relative;overflow:hidden}.audio-player__waveform::before{content:\"\";display:block;position:absolute;border-top:1px solid #313543;width:100%;height:0;left:0;top:calc(50% + 1px)}.audio-player__progress-placeholder{background-color:rgba(78,121,223,.5)}.audio-player__wave-placeholder{background-color:#4a5266}.audio-player .video-player__controls{padding:0 15px;padding-top:10px;background:#17191f;border-top:1px solid #313543;border-radius:0 0 4px 4px}.video-player{overflow:hidden;position:relative;background:#000;max-width:100%;border-radius:4px;box-sizing:border-box;direction:ltr}.video-player.editable{border-radius:0;height:100% !important}.video-player:focus{outline:0}.video-player video{max-width:100vw;max-height:80vh;z-index:1}.video-player.fullscreen{width:100% !important;height:100% !important;margin:0}.video-player.fullscreen video{max-width:100% !important;max-height:100% !important;width:100% !important;height:100% !important;outline:0}.video-player.inline video{object-fit:contain;position:relative;top:50%;transform:translateY(-50%)}.video-player__controls{position:absolute;z-index:2;bottom:0;left:0;right:0;box-sizing:border-box;background:linear-gradient(0deg, rgba(0, 0, 0, 0.85) 0, rgba(0, 0, 0, 0.45) 60%, transparent);padding:0 15px;opacity:0;transition:opacity .1s ease}.video-player__controls.active{opacity:1}.video-player.inactive video,.video-player.inactive .video-player__controls{visibility:hidden}.video-player__spoiler{display:none;position:absolute;top:0;left:0;width:100%;height:100%;z-index:4;border:0;background:#000;color:#dde3ec;transition:none;pointer-events:none}.video-player__spoiler.active{display:block;pointer-events:auto}.video-player__spoiler.active:hover,.video-player__spoiler.active:active,.video-player__spoiler.active:focus{color:#f4f6f9}.video-player__spoiler__title{display:block;font-size:14px}.video-player__spoiler__subtitle{display:block;font-size:11px;font-weight:500}.video-player__buttons-bar{display:flex;justify-content:space-between;padding-bottom:10px}.video-player__buttons-bar .video-player__download__icon{color:inherit}.video-player__buttons{font-size:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.video-player__buttons.left button{padding-left:0}.video-player__buttons.right button{padding-right:0}.video-player__buttons button{background:transparent;padding:2px 10px;font-size:16px;border:0;color:rgba(255,255,255,.75)}.video-player__buttons button:active,.video-player__buttons button:hover,.video-player__buttons button:focus{color:#fff}.video-player__time-sep,.video-player__time-total,.video-player__time-current{font-size:14px;font-weight:500}.video-player__time-current{color:#fff;margin-left:60px}.video-player__time-sep{display:inline-block;margin:0 6px}.video-player__time-sep,.video-player__time-total{color:#fff}.video-player__volume{cursor:pointer;height:24px;display:inline}.video-player__volume::before{content:\"\";width:50px;background:rgba(255,255,255,.35);border-radius:4px;display:block;position:absolute;height:4px;left:70px;bottom:20px}.video-player__volume__current{display:block;position:absolute;height:4px;border-radius:4px;left:70px;bottom:20px;background:#4e79df}.video-player__volume__handle{position:absolute;z-index:3;border-radius:50%;width:12px;height:12px;bottom:16px;left:70px;transition:opacity .1s ease;background:#4e79df;box-shadow:1px 2px 6px rgba(0,0,0,.2);pointer-events:none}.video-player__link{padding:2px 10px}.video-player__link a{text-decoration:none;font-size:14px;font-weight:500;color:#fff}.video-player__link a:hover,.video-player__link a:active,.video-player__link a:focus{text-decoration:underline}.video-player__seek{cursor:pointer;height:24px;position:relative}.video-player__seek::before{content:\"\";width:100%;background:rgba(255,255,255,.35);border-radius:4px;display:block;position:absolute;height:4px;top:10px}.video-player__seek__progress,.video-player__seek__buffer{display:block;position:absolute;height:4px;border-radius:4px;top:10px;background:#4e79df}.video-player__seek__buffer{background:rgba(255,255,255,.2)}.video-player__seek__handle{position:absolute;z-index:3;opacity:0;border-radius:50%;width:12px;height:12px;top:6px;margin-left:-6px;transition:opacity .1s ease;background:#4e79df;box-shadow:1px 2px 6px rgba(0,0,0,.2);pointer-events:none}.video-player__seek__handle.active{opacity:1}.video-player__seek:hover .video-player__seek__handle{opacity:1}.video-player.detailed .video-player__buttons button,.video-player.fullscreen .video-player__buttons button{padding-top:10px;padding-bottom:10px}.directory__list{width:100%;margin:10px 0;transition:opacity 100ms ease-in}.directory__list.loading{opacity:.7}@media screen and (max-width: 415px){.directory__list{margin:0}}.directory__card{box-sizing:border-box;margin-bottom:10px}.directory__card__img{height:125px;position:relative;background:#0e1014;overflow:hidden}.directory__card__img img{display:block;width:100%;height:100%;margin:0;object-fit:cover}.directory__card__bar{display:flex;align-items:center;background:#313543;padding:10px}.directory__card__bar__name{flex:1 1 auto;display:flex;align-items:center;text-decoration:none;overflow:hidden}.directory__card__bar__relationship{width:23px;min-height:1px;flex:0 0 auto}.directory__card__bar .avatar{flex:0 0 auto;width:48px;height:48px;padding-top:2px}.directory__card__bar .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px;background:#17191f;object-fit:cover}.directory__card__bar .display-name{margin-left:15px;text-align:left}.directory__card__bar .display-name strong{font-size:15px;color:#fff;font-weight:500;overflow:hidden;text-overflow:ellipsis}.directory__card__bar .display-name span{display:block;font-size:14px;color:#dde3ec;font-weight:400;overflow:hidden;text-overflow:ellipsis}.directory__card__extra{background:#282c37;display:flex;align-items:center;justify-content:center}.directory__card__extra .accounts-table__count{width:33.33%;flex:0 0 auto;padding:15px 0}.directory__card__extra .account__header__content{box-sizing:border-box;padding:15px 10px;border-bottom:1px solid #393f4f;width:100%;min-height:48px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.directory__card__extra .account__header__content p{display:none}.directory__card__extra .account__header__content p:first-child{display:inline}.directory__card__extra .account__header__content br{display:none}.account-gallery__container{display:flex;flex-wrap:wrap;padding:4px 2px}.account-gallery__item{border:0;box-sizing:border-box;display:block;position:relative;border-radius:4px;overflow:hidden;margin:2px}.account-gallery__item__icons{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);font-size:24px}.notification__filter-bar,.account__section-headline{background:#1f232b;border-bottom:1px solid #393f4f;cursor:default;display:flex;flex-shrink:0}.notification__filter-bar button,.account__section-headline button{background:#1f232b;border:0;margin:0}.notification__filter-bar button,.notification__filter-bar a,.account__section-headline button,.account__section-headline a{display:block;flex:1 1 auto;color:#dde3ec;padding:15px 0;font-size:14px;font-weight:500;text-align:center;text-decoration:none;position:relative;width:100%;white-space:nowrap}.notification__filter-bar button.active,.notification__filter-bar a.active,.account__section-headline button.active,.account__section-headline a.active{color:#ecf0f4}.notification__filter-bar button.active::before,.notification__filter-bar button.active::after,.notification__filter-bar a.active::before,.notification__filter-bar a.active::after,.account__section-headline button.active::before,.account__section-headline button.active::after,.account__section-headline a.active::before,.account__section-headline a.active::after{display:block;content:\"\";position:absolute;bottom:0;left:50%;width:0;height:0;transform:translateX(-50%);border-style:solid;border-width:0 10px 10px;border-color:transparent transparent #393f4f}.notification__filter-bar button.active::after,.notification__filter-bar a.active::after,.account__section-headline button.active::after,.account__section-headline a.active::after{bottom:-1px;border-color:transparent transparent #282c37}.notification__filter-bar.directory__section-headline,.account__section-headline.directory__section-headline{background:#242731;border-bottom-color:transparent}.notification__filter-bar.directory__section-headline a.active::before,.notification__filter-bar.directory__section-headline button.active::before,.account__section-headline.directory__section-headline a.active::before,.account__section-headline.directory__section-headline button.active::before{display:none}.notification__filter-bar.directory__section-headline a.active::after,.notification__filter-bar.directory__section-headline button.active::after,.account__section-headline.directory__section-headline a.active::after,.account__section-headline.directory__section-headline button.active::after{border-color:transparent transparent #191b22}.filter-form{background:#282c37}.filter-form__column{padding:10px 15px}.filter-form .radio-button{display:block}.radio-button{font-size:14px;position:relative;display:inline-block;padding:6px 0;line-height:18px;cursor:default;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer}.radio-button input[type=radio],.radio-button input[type=checkbox]{display:none}.radio-button__input{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:50%;vertical-align:middle}.radio-button__input.checked{border-color:#4e79df;background:#4e79df}::-webkit-scrollbar-thumb{border-radius:0}.search-popout{background:#fff;border-radius:4px;padding:10px 14px;padding-bottom:14px;margin-top:10px;color:#364861;box-shadow:2px 4px 15px rgba(0,0,0,.4)}.search-popout h4{text-transform:uppercase;color:#364861;font-size:13px;font-weight:500;margin-bottom:10px}.search-popout li{padding:4px 0}.search-popout ul{margin-bottom:10px}.search-popout em{font-weight:500;color:#000}noscript{text-align:center}noscript img{width:200px;opacity:.5;animation:flicker 4s infinite}noscript div{font-size:14px;margin:30px auto;color:#ecf0f4;max-width:400px}noscript div a{color:#2b90d9;text-decoration:underline}noscript div a:hover{text-decoration:none}@keyframes flicker{0%{opacity:1}30%{opacity:.75}100%{opacity:1}}@media screen and (max-width: 630px)and (max-height: 400px){.tabs-bar,.search{will-change:margin-top;transition:margin-top 400ms 100ms}.navigation-bar{will-change:padding-bottom;transition:padding-bottom 400ms 100ms}.navigation-bar>a:first-child{will-change:margin-top,margin-left,margin-right,width;transition:margin-top 400ms 100ms,margin-left 400ms 500ms,margin-right 400ms 500ms}.navigation-bar>.navigation-bar__profile-edit{will-change:margin-top;transition:margin-top 400ms 100ms}.navigation-bar .navigation-bar__actions>.icon-button.close{will-change:opacity transform;transition:opacity 200ms 100ms,transform 400ms 100ms}.navigation-bar .navigation-bar__actions>.compose__action-bar .icon-button{will-change:opacity transform;transition:opacity 200ms 300ms,transform 400ms 100ms}.is-composing .tabs-bar,.is-composing .search{margin-top:-50px}.is-composing .navigation-bar{padding-bottom:0}.is-composing .navigation-bar>a:first-child{margin:-100px 10px 0 -50px}.is-composing .navigation-bar .navigation-bar__profile{padding-top:2px}.is-composing .navigation-bar .navigation-bar__profile-edit{position:absolute;margin-top:-60px}.is-composing .navigation-bar .navigation-bar__actions .icon-button.close{pointer-events:auto;opacity:1;transform:scale(1, 1) translate(0, 0);bottom:5px}.is-composing .navigation-bar .navigation-bar__actions .compose__action-bar .icon-button{pointer-events:none;opacity:0;transform:scale(0, 1) translate(100%, 0)}}.embed-modal{width:auto;max-width:80vw;max-height:80vh}.embed-modal h4{padding:30px;font-weight:500;font-size:16px;text-align:center}.embed-modal .embed-modal__container{padding:10px}.embed-modal .embed-modal__container .hint{margin-bottom:15px}.embed-modal .embed-modal__container .embed-modal__html{outline:0;box-sizing:border-box;display:block;width:100%;border:0;padding:10px;font-family:\"mastodon-font-monospace\",monospace;background:#282c37;color:#fff;font-size:14px;margin:0;margin-bottom:15px;border-radius:4px}.embed-modal .embed-modal__container .embed-modal__html::-moz-focus-inner{border:0}.embed-modal .embed-modal__container .embed-modal__html::-moz-focus-inner,.embed-modal .embed-modal__container .embed-modal__html:focus,.embed-modal .embed-modal__container .embed-modal__html:active{outline:0 !important}.embed-modal .embed-modal__container .embed-modal__html:focus{background:#313543}@media screen and (max-width: 600px){.embed-modal .embed-modal__container .embed-modal__html{font-size:16px}}.embed-modal .embed-modal__container .embed-modal__iframe{width:400px;max-width:100%;overflow:hidden;border:0;border-radius:4px}.account__moved-note{padding:14px 10px;padding-bottom:16px;background:#313543;border-top:1px solid #393f4f;border-bottom:1px solid #393f4f}.account__moved-note__message{position:relative;margin-left:58px;color:#c2cede;padding:8px 0;padding-top:0;padding-bottom:4px;font-size:14px}.account__moved-note__message>span{display:block;overflow:hidden;text-overflow:ellipsis}.account__moved-note__icon-wrapper{left:-26px;position:absolute}.account__moved-note .detailed-status__display-avatar{position:relative}.account__moved-note .detailed-status__display-name{margin-bottom:0}.column-inline-form{padding:15px;padding-right:0;display:flex;justify-content:flex-start;align-items:center;background:#313543}.column-inline-form label{flex:1 1 auto}.column-inline-form label input{width:100%}.column-inline-form label input:focus{outline:0}.column-inline-form .icon-button{flex:0 0 auto;margin:0 10px}.drawer__backdrop{cursor:pointer;position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5)}.list-editor{background:#282c37;flex-direction:column;border-radius:8px;box-shadow:2px 4px 15px rgba(0,0,0,.4);width:380px;overflow:hidden}@media screen and (max-width: 420px){.list-editor{width:90%}}.list-editor h4{padding:15px 0;background:#444b5d;font-weight:500;font-size:16px;text-align:center;border-radius:8px 8px 0 0}.list-editor .drawer__pager{height:50vh}.list-editor .drawer__inner{border-radius:0 0 8px 8px}.list-editor .drawer__inner.backdrop{width:calc(100% - 60px);box-shadow:2px 4px 15px rgba(0,0,0,.4);border-radius:0 0 0 8px}.list-editor__accounts{overflow-y:auto}.list-editor .account__display-name:hover strong{text-decoration:none}.list-editor .account__avatar{cursor:default}.list-editor .search{margin-bottom:0}.list-adder{background:#282c37;flex-direction:column;border-radius:8px;box-shadow:2px 4px 15px rgba(0,0,0,.4);width:380px;overflow:hidden}@media screen and (max-width: 420px){.list-adder{width:90%}}.list-adder__account{background:#444b5d}.list-adder__lists{background:#444b5d;height:50vh;border-radius:0 0 8px 8px;overflow-y:auto}.list-adder .list{padding:10px;border-bottom:1px solid #393f4f}.list-adder .list__wrapper{display:flex}.list-adder .list__display-name{flex:1 1 auto;overflow:hidden;text-decoration:none;font-size:16px;padding:10px}.focal-point{position:relative;cursor:move;overflow:hidden;height:100%;display:flex;justify-content:center;align-items:center;background:#000}.focal-point img,.focal-point video,.focal-point canvas{display:block;max-height:80vh;width:100%;height:auto;margin:0;object-fit:contain;background:#000}.focal-point__reticle{position:absolute;width:100px;height:100px;transform:translate(-50%, -50%);background:url(\"~images/reticle.png\") no-repeat 0 0;border-radius:50%;box-shadow:0 0 0 9999em rgba(0,0,0,.35)}.focal-point__overlay{position:absolute;width:100%;height:100%;top:0;left:0}.focal-point__preview{position:absolute;bottom:10px;right:10px;z-index:2;cursor:move;transition:opacity .1s ease}.focal-point__preview:hover{opacity:.5}.focal-point__preview strong{color:#fff;font-size:14px;font-weight:500;display:block;margin-bottom:5px}.focal-point__preview div{border-radius:4px;box-shadow:0 0 14px rgba(0,0,0,.2)}@media screen and (max-width: 480px){.focal-point img,.focal-point video{max-height:100%}.focal-point__preview{display:none}}.account__header__content{color:#dde3ec;font-size:14px;font-weight:400;overflow:hidden;word-break:normal;word-wrap:break-word}.account__header__content p{margin-bottom:20px}.account__header__content p:last-child{margin-bottom:0}.account__header__content a{color:inherit;text-decoration:underline}.account__header__content a:hover{text-decoration:none}.account__header{overflow:hidden}.account__header.inactive{opacity:.5}.account__header.inactive .account__header__image,.account__header.inactive .account__avatar{filter:grayscale(100%)}.account__header__info{position:absolute;top:10px;left:10px}.account__header__image{overflow:hidden;height:145px;position:relative;background:#1f232b}.account__header__image img{object-fit:cover;display:block;width:100%;height:100%;margin:0}.account__header__bar{position:relative;background:#313543;padding:5px;border-bottom:1px solid #42485a}.account__header__bar .avatar{display:block;flex:0 0 auto;width:94px;margin-left:-2px}.account__header__bar .avatar .account__avatar{background:#17191f;border:2px solid #313543}.account__header__tabs{display:flex;align-items:flex-start;padding:7px 5px;margin-top:-55px}.account__header__tabs__buttons{display:flex;align-items:center;padding-top:55px;overflow:hidden}.account__header__tabs__buttons .icon-button{border:1px solid #42485a;border-radius:4px;box-sizing:content-box;padding:2px}.account__header__tabs__buttons .button{margin:0 8px}.account__header__tabs__name{padding:5px}.account__header__tabs__name .account-role{vertical-align:top}.account__header__tabs__name .emojione{width:22px;height:22px}.account__header__tabs__name h1{font-size:16px;line-height:24px;color:#fff;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.account__header__tabs__name h1 small{display:block;font-size:14px;color:#dde3ec;font-weight:400;overflow:hidden;text-overflow:ellipsis}.account__header__tabs .spacer{flex:1 1 auto}.account__header__bio{overflow:hidden;margin:0 -5px}.account__header__bio .account__header__content{padding:20px 15px;padding-bottom:5px;color:#fff}.account__header__bio .account__header__fields{margin:0;border-top:1px solid #42485a}.account__header__bio .account__header__fields a{color:#4e79df}.account__header__bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.account__header__bio .account__header__fields .verified a{color:#79bd9a}.account__header__extra{margin-top:4px}.account__header__extra__links{font-size:14px;color:#dde3ec;padding:10px 0}.account__header__extra__links a{display:inline-block;color:#dde3ec;text-decoration:none;padding:5px 10px;font-weight:500}.account__header__extra__links a strong{font-weight:700;color:#fff}.trends__header{color:#c2cede;background:#2c313d;border-bottom:1px solid #1f232b;font-weight:500;padding:15px;font-size:16px;cursor:default}.trends__header .fa{display:inline-block;margin-right:5px}.trends__item{display:flex;align-items:center;padding:15px;border-bottom:1px solid #393f4f}.trends__item:last-child{border-bottom:0}.trends__item__name{flex:1 1 auto;color:#c2cede;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trends__item__name strong{font-weight:500}.trends__item__name a{color:#dde3ec;text-decoration:none;font-size:14px;font-weight:500;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trends__item__name a:hover span,.trends__item__name a:focus span,.trends__item__name a:active span{text-decoration:underline}.trends__item__current{flex:0 0 auto;font-size:24px;line-height:36px;font-weight:500;text-align:right;padding-right:15px;margin-left:5px;color:#ecf0f4}.trends__item__sparkline{flex:0 0 auto;width:50px}.trends__item__sparkline path:first-child{fill:rgba(43,144,217,.25) !important;fill-opacity:1 !important}.trends__item__sparkline path:last-child{stroke:#459ede !important}.conversation{display:flex;border-bottom:1px solid #393f4f;padding:5px;padding-bottom:0}.conversation:focus{background:#2c313d;outline:0}.conversation__avatar{flex:0 0 auto;padding:10px;padding-top:12px;position:relative;cursor:pointer}.conversation__unread{display:inline-block;background:#2b90d9;border-radius:50%;width:.625rem;height:.625rem;margin:-0.1ex .15em .1ex}.conversation__content{flex:1 1 auto;padding:10px 5px;padding-right:15px;overflow:hidden}.conversation__content__info{overflow:hidden;display:flex;flex-direction:row-reverse;justify-content:space-between}.conversation__content__relative-time{font-size:15px;color:#dde3ec;padding-left:15px}.conversation__content__names{color:#dde3ec;font-size:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:4px;flex-basis:90px;flex-grow:1}.conversation__content__names a{color:#fff;text-decoration:none}.conversation__content__names a:hover,.conversation__content__names a:focus,.conversation__content__names a:active{text-decoration:underline}.conversation__content a{word-break:break-word}.conversation--unread{background:#2c313d}.conversation--unread:focus{background:#313543}.conversation--unread .conversation__content__info{font-weight:700}.conversation--unread .conversation__content__relative-time{color:#fff}.announcements{background:#393f4f;font-size:13px;display:flex;align-items:flex-end}.announcements__mastodon{width:124px;flex:0 0 auto}@media screen and (max-width: 424px){.announcements__mastodon{display:none}}.announcements__container{width:calc(100% - 124px);flex:0 0 auto;position:relative}@media screen and (max-width: 424px){.announcements__container{width:100%}}.announcements__item{box-sizing:border-box;width:100%;padding:15px;position:relative;font-size:15px;line-height:20px;word-wrap:break-word;font-weight:400;max-height:50vh;overflow:hidden;display:flex;flex-direction:column}.announcements__item__range{display:block;font-weight:500;margin-bottom:10px;padding-right:18px}.announcements__item__unread{position:absolute;top:19px;right:19px;display:block;background:#2b90d9;border-radius:50%;width:.625rem;height:.625rem}.announcements__pagination{padding:15px;color:#dde3ec;position:absolute;bottom:3px;right:0}.layout-multiple-columns .announcements__mastodon{display:none}.layout-multiple-columns .announcements__container{width:100%}.reactions-bar{display:flex;flex-wrap:wrap;align-items:center;margin-top:15px;margin-left:-2px;width:calc(100% - (90px - 33px))}.reactions-bar__item{flex-shrink:0;background:#42485a;border:0;border-radius:3px;margin:2px;cursor:pointer;user-select:none;padding:0 6px;display:flex;align-items:center;transition:all 100ms ease-in;transition-property:background-color,color}.reactions-bar__item__emoji{display:block;margin:3px 0;width:16px;height:16px}.reactions-bar__item__emoji img{display:block;margin:0;width:100%;height:100%;min-width:auto;min-height:auto;vertical-align:bottom;object-fit:contain}.reactions-bar__item__count{display:block;min-width:9px;font-size:13px;font-weight:500;text-align:center;margin-left:6px;color:#dde3ec}.reactions-bar__item:hover,.reactions-bar__item:focus,.reactions-bar__item:active{background:#4a5266;transition:all 200ms ease-out;transition-property:background-color,color}.reactions-bar__item:hover__count,.reactions-bar__item:focus__count,.reactions-bar__item:active__count{color:#eaeef3}.reactions-bar__item.active{transition:all 100ms ease-in;transition-property:background-color,color;background-color:#3d4d73}.reactions-bar__item.active .reactions-bar__item__count{color:#4ea2df}.reactions-bar .emoji-picker-dropdown{margin:2px}.reactions-bar:hover .emoji-button{opacity:.85}.reactions-bar .emoji-button{color:#dde3ec;margin:0;font-size:16px;width:auto;flex-shrink:0;padding:0 6px;height:22px;display:flex;align-items:center;opacity:.5;transition:all 100ms ease-in;transition-property:background-color,color}.reactions-bar .emoji-button:hover,.reactions-bar .emoji-button:active,.reactions-bar .emoji-button:focus{opacity:1;color:#eaeef3;transition:all 200ms ease-out;transition-property:background-color,color}.reactions-bar--empty .emoji-button{padding:0}.poll{margin-top:16px;font-size:14px}.poll li{margin-bottom:10px;position:relative}.poll__chart{border-radius:4px;display:block;background:#8ba1bf;height:5px;min-width:1%}.poll__chart.leading{background:#2b5fd9}.poll__option{position:relative;display:flex;padding:6px 0;line-height:18px;cursor:default;overflow:hidden}.poll__option__text{display:inline-block;word-wrap:break-word;overflow-wrap:break-word;max-width:calc(100% - 45px - 25px)}.poll__option input[type=radio],.poll__option input[type=checkbox]{display:none}.poll__option .autossugest-input{flex:1 1 auto}.poll__option input[type=text]{display:block;box-sizing:border-box;width:100%;font-size:14px;color:#000;outline:0;font-family:inherit;background:#fff;border:1px solid #dbdbdb;border-radius:4px;padding:6px 10px}.poll__option input[type=text]:focus{border-color:#2b90d9}.poll__option.selectable{cursor:pointer}.poll__option.editable{display:flex;align-items:center;overflow:visible}.poll__input{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:50%;vertical-align:middle;margin-top:auto;margin-bottom:auto;flex:0 0 18px}.poll__input.checkbox{border-radius:4px}.poll__input.active{border-color:#79bd9a;background:#79bd9a}.poll__input:active,.poll__input:focus,.poll__input:hover{border-color:#acd6c1;border-width:4px}.poll__input::-moz-focus-inner{outline:0 !important;border:0}.poll__input:focus,.poll__input:active{outline:0 !important}.poll__number{display:inline-block;width:45px;font-weight:700;flex:0 0 45px}.poll__voted{padding:0 5px;display:inline-block}.poll__voted__mark{font-size:18px}.poll__footer{padding-top:6px;padding-bottom:5px;color:#c2cede}.poll__link{display:inline;background:transparent;padding:0;margin:0;border:0;color:#c2cede;text-decoration:underline;font-size:inherit}.poll__link:hover{text-decoration:none}.poll__link:active,.poll__link:focus{background-color:rgba(194,206,222,.1)}.poll .button{height:36px;padding:0 16px;margin-right:10px;font-size:14px}.compose-form__poll-wrapper{border-top:1px solid #ebebeb}.compose-form__poll-wrapper ul{padding:10px}.compose-form__poll-wrapper .poll__footer{border-top:1px solid #ebebeb;padding:10px;display:flex;align-items:center}.compose-form__poll-wrapper .poll__footer button,.compose-form__poll-wrapper .poll__footer select{flex:1 1 50%}.compose-form__poll-wrapper .poll__footer button:focus,.compose-form__poll-wrapper .poll__footer select:focus{border-color:#2b90d9}.compose-form__poll-wrapper .button.button-secondary{font-size:14px;font-weight:400;padding:6px 10px;height:auto;line-height:inherit;color:#8d9ac2;border-color:#8d9ac2;margin-right:5px}.compose-form__poll-wrapper li{display:flex;align-items:center}.compose-form__poll-wrapper li .poll__option{flex:0 0 auto;width:calc(100% - (23px + 6px));margin-right:6px}.compose-form__poll-wrapper select{appearance:none;box-sizing:border-box;font-size:14px;color:#000;display:inline-block;width:auto;outline:0;font-family:inherit;background:#fff url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center/auto 16px;border:1px solid #dbdbdb;border-radius:4px;padding:6px 10px;padding-right:30px}.compose-form__poll-wrapper .icon-button.disabled{color:#dbdbdb}.muted .poll{color:#c2cede}.muted .poll__chart{background:rgba(109,137,175,.2)}.muted .poll__chart.leading{background:rgba(43,95,217,.2)}.modal-layout{background:#282c37 url('data:image/svg+xml;utf8,') repeat-x bottom fixed;display:flex;flex-direction:column;height:100vh;padding:0}.modal-layout__mastodon{display:flex;flex:1;flex-direction:column;justify-content:flex-end}.modal-layout__mastodon>*{flex:1;max-height:235px}@media screen and (max-width: 600px){.account-header{margin-top:0}}.emoji-mart{font-size:13px;display:inline-block;color:#000}.emoji-mart,.emoji-mart *{box-sizing:border-box;line-height:1.15}.emoji-mart .emoji-mart-emoji{padding:6px}.emoji-mart-bar{border:0 solid #c0cdd9}.emoji-mart-bar:first-child{border-bottom-width:1px;border-top-left-radius:5px;border-top-right-radius:5px;background:#d9e1e8}.emoji-mart-bar:last-child{border-top-width:1px;border-bottom-left-radius:5px;border-bottom-right-radius:5px;display:none}.emoji-mart-anchors{display:flex;justify-content:space-between;padding:0 6px;color:#1b1e25;line-height:0}.emoji-mart-anchor{position:relative;flex:1;text-align:center;padding:12px 4px;overflow:hidden;transition:color .1s ease-out;cursor:pointer}.emoji-mart-anchor:hover{color:#131419}.emoji-mart-anchor-selected{color:#2b90d9}.emoji-mart-anchor-selected:hover{color:#2485cb}.emoji-mart-anchor-selected .emoji-mart-anchor-bar{bottom:-1px}.emoji-mart-anchor-bar{position:absolute;bottom:-5px;left:0;width:100%;height:4px;background-color:#2b90d9}.emoji-mart-anchors i{display:inline-block;width:100%;max-width:22px}.emoji-mart-anchors svg{fill:currentColor;max-height:18px}.emoji-mart-scroll{overflow-y:scroll;height:270px;max-height:35vh;padding:0 6px 6px;background:#fff;will-change:transform}.emoji-mart-scroll::-webkit-scrollbar-track:hover,.emoji-mart-scroll::-webkit-scrollbar-track:active{background-color:rgba(0,0,0,.3)}.emoji-mart-search{padding:10px;padding-right:45px;background:#fff}.emoji-mart-search input{font-size:14px;font-weight:400;padding:7px 9px;font-family:inherit;display:block;width:100%;background:rgba(217,225,232,.3);color:#000;border:1px solid #d9e1e8;border-radius:4px}.emoji-mart-search input::-moz-focus-inner{border:0}.emoji-mart-search input::-moz-focus-inner,.emoji-mart-search input:focus,.emoji-mart-search input:active{outline:0 !important}.emoji-mart-category .emoji-mart-emoji{cursor:pointer}.emoji-mart-category .emoji-mart-emoji span{z-index:1;position:relative;text-align:center}.emoji-mart-category .emoji-mart-emoji:hover::before{z-index:0;content:\"\";position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(217,225,232,.7);border-radius:100%}.emoji-mart-category-label{z-index:2;position:relative;position:-webkit-sticky;position:sticky;top:0}.emoji-mart-category-label span{display:block;width:100%;font-weight:500;padding:5px 6px;background:#fff}.emoji-mart-emoji{position:relative;display:inline-block;font-size:0}.emoji-mart-emoji span{width:22px;height:22px}.emoji-mart-no-results{font-size:14px;text-align:center;padding-top:70px;color:#364861}.emoji-mart-no-results .emoji-mart-category-label{display:none}.emoji-mart-no-results .emoji-mart-no-results-label{margin-top:.2em}.emoji-mart-no-results .emoji-mart-emoji:hover::before{content:none}.emoji-mart-preview{display:none}.container{box-sizing:border-box;max-width:1235px;margin:0 auto;position:relative}@media screen and (max-width: 1255px){.container{width:100%;padding:0 10px}}.rich-formatting{font-family:\"mastodon-font-sans-serif\",sans-serif;font-size:14px;font-weight:400;line-height:1.7;word-wrap:break-word;color:#dde3ec}.rich-formatting a{color:#2b90d9;text-decoration:underline}.rich-formatting a:hover,.rich-formatting a:focus,.rich-formatting a:active{text-decoration:none}.rich-formatting p,.rich-formatting li{color:#dde3ec}.rich-formatting p{margin-top:0;margin-bottom:.85em}.rich-formatting p:last-child{margin-bottom:0}.rich-formatting strong{font-weight:700;color:#ecf0f4}.rich-formatting em{font-style:italic;color:#ecf0f4}.rich-formatting code{font-size:.85em;background:#17191f;border-radius:4px;padding:.2em .3em}.rich-formatting h1,.rich-formatting h2,.rich-formatting h3,.rich-formatting h4,.rich-formatting h5,.rich-formatting h6{font-family:\"mastodon-font-display\",sans-serif;margin-top:1.275em;margin-bottom:.85em;font-weight:500;color:#ecf0f4}.rich-formatting h1{font-size:2em}.rich-formatting h2{font-size:1.75em}.rich-formatting h3{font-size:1.5em}.rich-formatting h4{font-size:1.25em}.rich-formatting h5,.rich-formatting h6{font-size:1em}.rich-formatting ul{list-style:disc}.rich-formatting ol{list-style:decimal}.rich-formatting ul,.rich-formatting ol{margin:0;padding:0;padding-left:2em;margin-bottom:.85em}.rich-formatting ul[type=a],.rich-formatting ol[type=a]{list-style-type:lower-alpha}.rich-formatting ul[type=i],.rich-formatting ol[type=i]{list-style-type:lower-roman}.rich-formatting hr{width:100%;height:0;border:0;border-bottom:1px solid #313543;margin:1.7em 0}.rich-formatting hr.spacer{height:1px;border:0}.rich-formatting table{width:100%;border-collapse:collapse;break-inside:auto;margin-top:24px;margin-bottom:32px}.rich-formatting table thead tr,.rich-formatting table tbody tr{border-bottom:1px solid #313543;font-size:1em;line-height:1.625;font-weight:400;text-align:left;color:#dde3ec}.rich-formatting table thead tr{border-bottom-width:2px;line-height:1.5;font-weight:500;color:#c2cede}.rich-formatting table th,.rich-formatting table td{padding:8px;align-self:start;align-items:start;word-break:break-all}.rich-formatting table th.nowrap,.rich-formatting table td.nowrap{width:25%;position:relative}.rich-formatting table th.nowrap::before,.rich-formatting table td.nowrap::before{content:\" \";visibility:hidden}.rich-formatting table th.nowrap span,.rich-formatting table td.nowrap span{position:absolute;left:8px;right:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rich-formatting>:first-child{margin-top:0}.information-board{background:#1f232b;padding:20px 0}.information-board .container-alt{position:relative;padding-right:295px}.information-board__sections{display:flex;justify-content:space-between;flex-wrap:wrap}.information-board__section{flex:1 0 0;font-family:\"mastodon-font-sans-serif\",sans-serif;font-size:16px;line-height:28px;color:#fff;text-align:right;padding:10px 15px}.information-board__section span,.information-board__section strong{display:block}.information-board__section span:last-child{color:#ecf0f4}.information-board__section strong{font-family:\"mastodon-font-display\",sans-serif;font-weight:500;font-size:32px;line-height:48px}@media screen and (max-width: 700px){.information-board__section{text-align:center}}.information-board .panel{position:absolute;width:280px;box-sizing:border-box;background:#17191f;padding:20px;padding-top:10px;border-radius:4px 4px 0 0;right:0;bottom:-40px}.information-board .panel .panel-header{font-family:\"mastodon-font-display\",sans-serif;font-size:14px;line-height:24px;font-weight:500;color:#dde3ec;padding-bottom:5px;margin-bottom:15px;border-bottom:1px solid #313543;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.information-board .panel .panel-header a,.information-board .panel .panel-header span{font-weight:400;color:#bcc9da}.information-board .panel .panel-header a{text-decoration:none}.information-board .owner{text-align:center}.information-board .owner .avatar{width:80px;height:80px;margin:0 auto;margin-bottom:15px}.information-board .owner .avatar img{display:block;width:80px;height:80px;border-radius:48px}.information-board .owner .name{font-size:14px}.information-board .owner .name a{display:block;color:#fff;text-decoration:none}.information-board .owner .name a:hover .display_name{text-decoration:underline}.information-board .owner .name .username{display:block;color:#dde3ec}.landing-page p,.landing-page li{font-family:\"mastodon-font-sans-serif\",sans-serif;font-size:16px;font-weight:400;font-size:16px;line-height:30px;margin-bottom:12px;color:#dde3ec}.landing-page p a,.landing-page li a{color:#2b90d9;text-decoration:underline}.landing-page em{display:inline;margin:0;padding:0;font-weight:700;background:transparent;font-family:inherit;font-size:inherit;line-height:inherit;color:#fefefe}.landing-page h1{font-family:\"mastodon-font-display\",sans-serif;font-size:26px;line-height:30px;font-weight:500;margin-bottom:20px;color:#ecf0f4}.landing-page h1 small{font-family:\"mastodon-font-sans-serif\",sans-serif;display:block;font-size:18px;font-weight:400;color:#fefefe}.landing-page h2{font-family:\"mastodon-font-display\",sans-serif;font-size:22px;line-height:26px;font-weight:500;margin-bottom:20px;color:#ecf0f4}.landing-page h3{font-family:\"mastodon-font-display\",sans-serif;font-size:18px;line-height:24px;font-weight:500;margin-bottom:20px;color:#ecf0f4}.landing-page h4{font-family:\"mastodon-font-display\",sans-serif;font-size:16px;line-height:24px;font-weight:500;margin-bottom:20px;color:#ecf0f4}.landing-page h5{font-family:\"mastodon-font-display\",sans-serif;font-size:14px;line-height:24px;font-weight:500;margin-bottom:20px;color:#ecf0f4}.landing-page h6{font-family:\"mastodon-font-display\",sans-serif;font-size:12px;line-height:24px;font-weight:500;margin-bottom:20px;color:#ecf0f4}.landing-page ul,.landing-page ol{margin-left:20px}.landing-page ul[type=a],.landing-page ol[type=a]{list-style-type:lower-alpha}.landing-page ul[type=i],.landing-page ol[type=i]{list-style-type:lower-roman}.landing-page ul{list-style:disc}.landing-page ol{list-style:decimal}.landing-page li>ol,.landing-page li>ul{margin-top:6px}.landing-page hr{width:100%;height:0;border:0;border-bottom:1px solid rgba(96,105,132,.6);margin:20px 0}.landing-page hr.spacer{height:1px;border:0}.landing-page__information,.landing-page__forms{padding:20px}.landing-page__call-to-action{background:#282c37;border-radius:4px;padding:25px 40px;overflow:hidden;box-sizing:border-box}.landing-page__call-to-action .row{width:100%;display:flex;flex-direction:row-reverse;flex-wrap:nowrap;justify-content:space-between;align-items:center}.landing-page__call-to-action .row__information-board{display:flex;justify-content:flex-end;align-items:flex-end}.landing-page__call-to-action .row__information-board .information-board__section{flex:1 0 auto;padding:0 10px}@media screen and (max-width: 415px){.landing-page__call-to-action .row__information-board{width:100%;justify-content:space-between}}.landing-page__call-to-action .row__mascot{flex:1;margin:10px -50px 0 0}@media screen and (max-width: 415px){.landing-page__call-to-action .row__mascot{display:none}}.landing-page__logo{margin-right:20px}.landing-page__logo img{height:50px;width:auto;mix-blend-mode:lighten}.landing-page__information{padding:45px 40px;margin-bottom:10px}.landing-page__information:last-child{margin-bottom:0}.landing-page__information strong{font-weight:500;color:#fefefe}.landing-page__information .account{border-bottom:0;padding:0}.landing-page__information .account__display-name{align-items:center;display:flex;margin-right:5px}.landing-page__information .account div.account__display-name:hover .display-name strong{text-decoration:none}.landing-page__information .account div.account__display-name .account__avatar{cursor:default}.landing-page__information .account__avatar-wrapper{margin-left:0;flex:0 0 auto}.landing-page__information .account__avatar{width:44px;height:44px;background-size:44px 44px}.landing-page__information .account .display-name{font-size:15px}.landing-page__information .account .display-name__account{font-size:14px}@media screen and (max-width: 960px){.landing-page__information .contact{margin-top:30px}}@media screen and (max-width: 700px){.landing-page__information{padding:25px 20px}}.landing-page__information,.landing-page__forms,.landing-page #mastodon-timeline{box-sizing:border-box;background:#282c37;border-radius:4px;box-shadow:0 0 6px rgba(0,0,0,.1)}.landing-page__mascot{height:104px;position:relative;left:-40px;bottom:25px}.landing-page__mascot img{height:190px;width:auto}.landing-page__short-description .row{display:flex;flex-wrap:wrap;align-items:center;margin-bottom:40px}@media screen and (max-width: 700px){.landing-page__short-description .row{margin-bottom:20px}}.landing-page__short-description p a{color:#ecf0f4}.landing-page__short-description h1{font-weight:500;color:#fff;margin-bottom:0}.landing-page__short-description h1 small{color:#dde3ec}.landing-page__short-description h1 small span{color:#ecf0f4}.landing-page__short-description p:last-child{margin-bottom:0}.landing-page__hero{margin-bottom:10px}.landing-page__hero img{display:block;margin:0;max-width:100%;height:auto;border-radius:4px}@media screen and (max-width: 840px){.landing-page .information-board .container-alt{padding-right:20px}.landing-page .information-board .panel{position:static;margin-top:20px;width:100%;border-radius:4px}.landing-page .information-board .panel .panel-header{text-align:center}}@media screen and (max-width: 675px){.landing-page .header-wrapper{padding-top:0}.landing-page .header-wrapper.compact{padding-bottom:0}.landing-page .header-wrapper.compact .hero .heading{text-align:initial}.landing-page .header .container-alt,.landing-page .features .container-alt{display:block}}.landing-page .cta{margin:20px}.landing{margin-bottom:100px}@media screen and (max-width: 738px){.landing{margin-bottom:0}}.landing__brand{display:flex;justify-content:center;align-items:center;padding:50px}.landing__brand svg{fill:#fff;height:52px}@media screen and (max-width: 415px){.landing__brand{padding:0;margin-bottom:30px}}.landing .directory{margin-top:30px;background:transparent;box-shadow:none;border-radius:0}.landing .hero-widget{margin-top:30px;margin-bottom:0}.landing .hero-widget h4{padding:10px;text-transform:uppercase;font-weight:700;font-size:13px;color:#dde3ec}.landing .hero-widget__text{border-radius:0;padding-bottom:0}.landing .hero-widget__footer{background:#282c37;padding:10px;border-radius:0 0 4px 4px;display:flex}.landing .hero-widget__footer__column{flex:1 1 50%}.landing .hero-widget .account{padding:10px 0;border-bottom:0}.landing .hero-widget .account .account__display-name{display:flex;align-items:center}.landing .hero-widget .account .account__avatar{width:44px;height:44px;background-size:44px 44px}.landing .hero-widget__counter{padding:10px}.landing .hero-widget__counter strong{font-family:\"mastodon-font-display\",sans-serif;font-size:15px;font-weight:700;display:block}.landing .hero-widget__counter span{font-size:14px;color:#dde3ec}.landing .simple_form .user_agreement .label_input>label{font-weight:400;color:#dde3ec}.landing .simple_form p.lead{color:#dde3ec;font-size:15px;line-height:20px;font-weight:400;margin-bottom:25px}.landing__grid{max-width:960px;margin:0 auto;display:grid;grid-template-columns:minmax(0, 50%) minmax(0, 50%);grid-gap:30px}@media screen and (max-width: 738px){.landing__grid{grid-template-columns:minmax(0, 100%);grid-gap:10px}.landing__grid__column-login{grid-row:1;display:flex;flex-direction:column}.landing__grid__column-login .box-widget{order:2;flex:0 0 auto}.landing__grid__column-login .hero-widget{margin-top:0;margin-bottom:10px;order:1;flex:0 0 auto}.landing__grid__column-registration{grid-row:2}.landing__grid .directory{margin-top:10px}}@media screen and (max-width: 415px){.landing__grid{grid-gap:0}.landing__grid .hero-widget{display:block;margin-bottom:0;box-shadow:none}.landing__grid .hero-widget__img,.landing__grid .hero-widget__img img,.landing__grid .hero-widget__footer{border-radius:0}.landing__grid .hero-widget,.landing__grid .box-widget,.landing__grid .directory__tag{border-bottom:1px solid #393f4f}.landing__grid .directory{margin-top:0}.landing__grid .directory__tag{margin-bottom:0}.landing__grid .directory__tag>a,.landing__grid .directory__tag>div{border-radius:0;box-shadow:none}.landing__grid .directory__tag:last-child{border-bottom:0}}.brand{position:relative;text-decoration:none}.brand__tagline{display:block;position:absolute;bottom:-10px;left:50px;width:300px;color:#9baec8;text-decoration:none;font-size:14px}@media screen and (max-width: 415px){.brand__tagline{position:static;width:auto;margin-top:20px;color:#c2cede}}.table{width:100%;max-width:100%;border-spacing:0;border-collapse:collapse}.table th,.table td{padding:8px;line-height:18px;vertical-align:top;border-top:1px solid #282c37;text-align:left;background:#1f232b}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #282c37;border-top:0;font-weight:500}.table>tbody>tr>th{font-weight:500}.table>tbody>tr:nth-child(odd)>td,.table>tbody>tr:nth-child(odd)>th{background:#282c37}.table a{color:#2b90d9;text-decoration:underline}.table a:hover{text-decoration:none}.table strong{font-weight:500}.table strong:lang(ja){font-weight:700}.table strong:lang(ko){font-weight:700}.table strong:lang(zh-CN){font-weight:700}.table strong:lang(zh-HK){font-weight:700}.table strong:lang(zh-TW){font-weight:700}.table.inline-table>tbody>tr:nth-child(odd)>td,.table.inline-table>tbody>tr:nth-child(odd)>th{background:transparent}.table.inline-table>tbody>tr:first-child>td,.table.inline-table>tbody>tr:first-child>th{border-top:0}.table.batch-table>thead>tr>th{background:#282c37;border-top:1px solid #17191f;border-bottom:1px solid #17191f}.table.batch-table>thead>tr>th:first-child{border-radius:4px 0 0;border-left:1px solid #17191f}.table.batch-table>thead>tr>th:last-child{border-radius:0 4px 0 0;border-right:1px solid #17191f}.table--invites tbody td{vertical-align:middle}.table-wrapper{overflow:auto;margin-bottom:20px}samp{font-family:\"mastodon-font-monospace\",monospace}button.table-action-link{background:transparent;border:0;font:inherit}button.table-action-link,a.table-action-link{text-decoration:none;display:inline-block;margin-right:5px;padding:0 10px;color:#dde3ec;font-weight:500}button.table-action-link:hover,a.table-action-link:hover{color:#fff}button.table-action-link i.fa,a.table-action-link i.fa{font-weight:400;margin-right:5px}button.table-action-link:first-child,a.table-action-link:first-child{padding-left:0}.batch-table__toolbar,.batch-table__row{display:flex}.batch-table__toolbar__select,.batch-table__row__select{box-sizing:border-box;padding:8px 16px;cursor:pointer;min-height:100%}.batch-table__toolbar__select input,.batch-table__row__select input{margin-top:8px}.batch-table__toolbar__select--aligned,.batch-table__row__select--aligned{display:flex;align-items:center}.batch-table__toolbar__select--aligned input,.batch-table__row__select--aligned input{margin-top:0}.batch-table__toolbar__actions,.batch-table__toolbar__content,.batch-table__row__actions,.batch-table__row__content{padding:8px 0;padding-right:16px;flex:1 1 auto}.batch-table__toolbar{border:1px solid #17191f;background:#282c37;border-radius:4px 0 0;height:47px;align-items:center}.batch-table__toolbar__actions{text-align:right;padding-right:11px}.batch-table__form{padding:16px;border:1px solid #17191f;border-top:0;background:#282c37}.batch-table__form .fields-row{padding-top:0;margin-bottom:0}.batch-table__row{border:1px solid #17191f;border-top:0;background:#1f232b}@media screen and (max-width: 415px){.optional .batch-table__row:first-child{border-top:1px solid #17191f}}.batch-table__row:hover{background:#242731}.batch-table__row:nth-child(even){background:#282c37}.batch-table__row:nth-child(even):hover{background:#2c313d}.batch-table__row__content{padding-top:12px;padding-bottom:16px}.batch-table__row__content--unpadded{padding:0}.batch-table__row__content--with-image{display:flex;align-items:center}.batch-table__row__content__image{flex:0 0 auto;display:flex;justify-content:center;align-items:center;margin-right:10px}.batch-table__row__content__image .emojione{width:32px;height:32px}.batch-table__row__content__text{flex:1 1 auto}.batch-table__row__content__extra{flex:0 0 auto;text-align:right;color:#dde3ec;font-weight:500}.batch-table__row .directory__tag{margin:0;width:100%}.batch-table__row .directory__tag a{background:transparent;border-radius:0}@media screen and (max-width: 415px){.batch-table.optional .batch-table__toolbar,.batch-table.optional .batch-table__row__select{display:none}}.batch-table .status__content{padding-top:0}.batch-table .status__content summary{display:list-item}.batch-table .status__content strong{font-weight:700}.batch-table .nothing-here{border:1px solid #17191f;border-top:0;box-shadow:none}@media screen and (max-width: 415px){.batch-table .nothing-here{border-top:1px solid #17191f}}@media screen and (max-width: 870px){.batch-table .accounts-table tbody td.optional{display:none}}.admin-wrapper{display:flex;justify-content:center;width:100%;min-height:100vh}.admin-wrapper .sidebar-wrapper{min-height:100vh;overflow:hidden;pointer-events:none;flex:1 1 auto}.admin-wrapper .sidebar-wrapper__inner{display:flex;justify-content:flex-end;background:#282c37;height:100%}.admin-wrapper .sidebar{width:240px;padding:0;pointer-events:auto}.admin-wrapper .sidebar__toggle{display:none;background:#393f4f;height:48px}.admin-wrapper .sidebar__toggle__logo{flex:1 1 auto}.admin-wrapper .sidebar__toggle__logo a{display:inline-block;padding:15px}.admin-wrapper .sidebar__toggle__logo svg{fill:#fff;height:20px;position:relative;bottom:-2px}.admin-wrapper .sidebar__toggle__icon{display:block;color:#dde3ec;text-decoration:none;flex:0 0 auto;font-size:20px;padding:15px}.admin-wrapper .sidebar__toggle a:hover,.admin-wrapper .sidebar__toggle a:focus,.admin-wrapper .sidebar__toggle a:active{background:#42485a}.admin-wrapper .sidebar .logo{display:block;margin:40px auto;width:100px;height:100px}@media screen and (max-width: 600px){.admin-wrapper .sidebar>a:first-child{display:none}}.admin-wrapper .sidebar ul{list-style:none;border-radius:4px 0 0 4px;overflow:hidden;margin-bottom:20px}@media screen and (max-width: 600px){.admin-wrapper .sidebar ul{margin-bottom:0}}.admin-wrapper .sidebar ul a{display:block;padding:15px;color:#dde3ec;text-decoration:none;transition:all 200ms linear;transition-property:color,background-color;border-radius:4px 0 0 4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.admin-wrapper .sidebar ul a i.fa{margin-right:5px}.admin-wrapper .sidebar ul a:hover{color:#fff;background-color:#1d2028;transition:all 100ms linear;transition-property:color,background-color}.admin-wrapper .sidebar ul a.selected{background:#242731;border-radius:4px 0 0}.admin-wrapper .sidebar ul ul{background:#1f232b;border-radius:0 0 0 4px;margin:0}.admin-wrapper .sidebar ul ul a{border:0;padding:15px 35px}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a{color:#fff;background-color:#2b5fd9;border-bottom:0;border-radius:0}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a:hover{background-color:#416fdd}.admin-wrapper .sidebar>ul>.simple-navigation-active-leaf a{border-radius:4px 0 0 4px}.admin-wrapper .content-wrapper{box-sizing:border-box;width:100%;max-width:840px;flex:1 1 auto}@media screen and (max-width: 1080px){.admin-wrapper .sidebar-wrapper--empty{display:none}.admin-wrapper .sidebar-wrapper{width:240px;flex:0 0 auto}}@media screen and (max-width: 600px){.admin-wrapper .sidebar-wrapper{width:100%}}.admin-wrapper .content{padding:20px 15px;padding-top:60px;padding-left:25px}@media screen and (max-width: 600px){.admin-wrapper .content{max-width:none;padding:15px;padding-top:30px}}.admin-wrapper .content-heading{display:flex;padding-bottom:40px;border-bottom:1px solid #393f4f;margin:-15px -15px 40px 0;flex-wrap:wrap;align-items:center;justify-content:space-between}.admin-wrapper .content-heading>*{margin-top:15px;margin-right:15px}.admin-wrapper .content-heading-actions{display:inline-flex}.admin-wrapper .content-heading-actions>:not(:first-child){margin-left:5px}@media screen and (max-width: 600px){.admin-wrapper .content-heading{border-bottom:0;padding-bottom:0}}.admin-wrapper .content h2{color:#ecf0f4;font-size:24px;line-height:28px;font-weight:400}@media screen and (max-width: 600px){.admin-wrapper .content h2{font-weight:700}}.admin-wrapper .content h3{color:#ecf0f4;font-size:20px;line-height:28px;font-weight:400;margin-bottom:30px}.admin-wrapper .content h4{text-transform:uppercase;font-size:13px;font-weight:700;color:#dde3ec;padding-bottom:8px;margin-bottom:8px;border-bottom:1px solid #393f4f}.admin-wrapper .content h6{font-size:16px;color:#ecf0f4;line-height:28px;font-weight:500}.admin-wrapper .content .fields-group h6{color:#fff;font-weight:500}.admin-wrapper .content .directory__tag>a,.admin-wrapper .content .directory__tag>div{box-shadow:none}.admin-wrapper .content .directory__tag .table-action-link .fa{color:inherit}.admin-wrapper .content .directory__tag h4{font-size:18px;font-weight:700;color:#fff;text-transform:none;padding-bottom:0;margin-bottom:0;border-bottom:0}.admin-wrapper .content>p{font-size:14px;line-height:21px;color:#ecf0f4;margin-bottom:20px}.admin-wrapper .content>p strong{color:#fff;font-weight:500}.admin-wrapper .content>p strong:lang(ja){font-weight:700}.admin-wrapper .content>p strong:lang(ko){font-weight:700}.admin-wrapper .content>p strong:lang(zh-CN){font-weight:700}.admin-wrapper .content>p strong:lang(zh-HK){font-weight:700}.admin-wrapper .content>p strong:lang(zh-TW){font-weight:700}.admin-wrapper .content hr{width:100%;height:0;border:0;border-bottom:1px solid rgba(96,105,132,.6);margin:20px 0}.admin-wrapper .content hr.spacer{height:1px;border:0}@media screen and (max-width: 600px){.admin-wrapper{display:block}.admin-wrapper .sidebar-wrapper{min-height:0}.admin-wrapper .sidebar{width:100%;padding:0;height:auto}.admin-wrapper .sidebar__toggle{display:flex}.admin-wrapper .sidebar>ul{display:none}.admin-wrapper .sidebar ul a,.admin-wrapper .sidebar ul ul a{border-radius:0;border-bottom:1px solid #313543;transition:none}.admin-wrapper .sidebar ul a:hover,.admin-wrapper .sidebar ul ul a:hover{transition:none}.admin-wrapper .sidebar ul ul{border-radius:0}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a{border-bottom-color:#2b5fd9}}hr.spacer{width:100%;border:0;margin:20px 0;height:1px}body .muted-hint,.admin-wrapper .content .muted-hint{color:#dde3ec}body .muted-hint a,.admin-wrapper .content .muted-hint a{color:#2b90d9}body .positive-hint,.admin-wrapper .content .positive-hint{color:#79bd9a;font-weight:500}body .negative-hint,.admin-wrapper .content .negative-hint{color:#df405a;font-weight:500}body .neutral-hint,.admin-wrapper .content .neutral-hint{color:#c2cede;font-weight:500}body .warning-hint,.admin-wrapper .content .warning-hint{color:#ca8f04;font-weight:500}.filters{display:flex;flex-wrap:wrap}.filters .filter-subset{flex:0 0 auto;margin:0 40px 20px 0}.filters .filter-subset:last-child{margin-bottom:30px}.filters .filter-subset ul{margin-top:5px;list-style:none}.filters .filter-subset ul li{display:inline-block;margin-right:5px}.filters .filter-subset strong{font-weight:500;text-transform:uppercase;font-size:12px}.filters .filter-subset strong:lang(ja){font-weight:700}.filters .filter-subset strong:lang(ko){font-weight:700}.filters .filter-subset strong:lang(zh-CN){font-weight:700}.filters .filter-subset strong:lang(zh-HK){font-weight:700}.filters .filter-subset strong:lang(zh-TW){font-weight:700}.filters .filter-subset--with-select strong{display:block;margin-bottom:10px}.filters .filter-subset a{display:inline-block;color:#dde3ec;text-decoration:none;text-transform:uppercase;font-size:12px;font-weight:500;border-bottom:2px solid #282c37}.filters .filter-subset a:hover{color:#fff;border-bottom:2px solid #333846}.filters .filter-subset a.selected{color:#2b90d9;border-bottom:2px solid #2b5fd9}.flavour-screen{display:block;margin:10px auto;max-width:100%}.flavour-description{display:block;font-size:16px;margin:10px 0}.flavour-description>p{margin:10px 0}.flavour-screen{display:block;margin:10px auto;max-width:100%}.flavour-description{display:block;font-size:16px;margin:10px 0}.flavour-description>p{margin:10px 0}.report-accounts{display:flex;flex-wrap:wrap;margin-bottom:20px}.report-accounts__item{display:flex;flex:250px;flex-direction:column;margin:0 5px}.report-accounts__item>strong{display:block;margin:0 0 10px -5px;font-weight:500;font-size:14px;line-height:18px;color:#ecf0f4}.report-accounts__item>strong:lang(ja){font-weight:700}.report-accounts__item>strong:lang(ko){font-weight:700}.report-accounts__item>strong:lang(zh-CN){font-weight:700}.report-accounts__item>strong:lang(zh-HK){font-weight:700}.report-accounts__item>strong:lang(zh-TW){font-weight:700}.report-accounts__item .account-card{flex:1 1 auto}.report-status,.account-status{display:flex;margin-bottom:10px}.report-status .activity-stream,.account-status .activity-stream{flex:2 0 0;margin-right:20px;max-width:calc(100% - 60px)}.report-status .activity-stream .entry,.account-status .activity-stream .entry{border-radius:4px}.report-status__actions,.account-status__actions{flex:0 0 auto;display:flex;flex-direction:column}.report-status__actions .icon-button,.account-status__actions .icon-button{font-size:24px;width:24px;text-align:center;margin-bottom:10px}.simple_form.new_report_note,.simple_form.new_account_moderation_note{max-width:100%}.batch-form-box{display:flex;flex-wrap:wrap;margin-bottom:5px}.batch-form-box #form_status_batch_action{margin:0 5px 5px 0;font-size:14px}.batch-form-box input.button{margin:0 5px 5px 0}.batch-form-box .media-spoiler-toggle-buttons{margin-left:auto}.batch-form-box .media-spoiler-toggle-buttons .button{overflow:visible;margin:0 0 5px 5px;float:right}.back-link{margin-bottom:10px;font-size:14px}.back-link a{color:#2b90d9;text-decoration:none}.back-link a:hover{text-decoration:underline}.spacer{flex:1 1 auto}.log-entry{line-height:20px;padding:15px 0;background:#282c37;border-bottom:1px solid #313543}.log-entry:last-child{border-bottom:0}.log-entry__header{display:flex;justify-content:flex-start;align-items:center;color:#dde3ec;font-size:14px;padding:0 10px}.log-entry__avatar{margin-right:10px}.log-entry__avatar .avatar{display:block;margin:0;border-radius:50%;width:40px;height:40px}.log-entry__content{max-width:calc(100% - 90px)}.log-entry__title{word-wrap:break-word}.log-entry__timestamp{color:#c2cede}.log-entry a,.log-entry .username,.log-entry .target{color:#ecf0f4;text-decoration:none;font-weight:500}a.name-tag,.name-tag,a.inline-name-tag,.inline-name-tag{text-decoration:none;color:#ecf0f4}a.name-tag .username,.name-tag .username,a.inline-name-tag .username,.inline-name-tag .username{font-weight:500}a.name-tag.suspended .username,.name-tag.suspended .username,a.inline-name-tag.suspended .username,.inline-name-tag.suspended .username{text-decoration:line-through;color:#e87487}a.name-tag.suspended .avatar,.name-tag.suspended .avatar,a.inline-name-tag.suspended .avatar,.inline-name-tag.suspended .avatar{filter:grayscale(100%);opacity:.8}a.name-tag,.name-tag{display:flex;align-items:center}a.name-tag .avatar,.name-tag .avatar{display:block;margin:0;margin-right:5px;border-radius:50%}a.name-tag.suspended .avatar,.name-tag.suspended .avatar{filter:grayscale(100%);opacity:.8}.speech-bubble{margin-bottom:20px;border-left:4px solid #2b5fd9}.speech-bubble.positive{border-left-color:#79bd9a}.speech-bubble.negative{border-left-color:#e87487}.speech-bubble.warning{border-left-color:#ca8f04}.speech-bubble__bubble{padding:16px;padding-left:14px;font-size:15px;line-height:20px;border-radius:4px 4px 4px 0;position:relative;font-weight:500}.speech-bubble__bubble a{color:#dde3ec}.speech-bubble__owner{padding:8px;padding-left:12px}.speech-bubble time{color:#c2cede}.report-card{background:#282c37;border-radius:4px;margin-bottom:20px}.report-card__profile{display:flex;justify-content:space-between;align-items:center;padding:15px}.report-card__profile .account{padding:0;border:0}.report-card__profile .account__avatar-wrapper{margin-left:0}.report-card__profile__stats{flex:0 0 auto;font-weight:500;color:#dde3ec;text-transform:uppercase;text-align:right}.report-card__profile__stats a{color:inherit;text-decoration:none}.report-card__profile__stats a:focus,.report-card__profile__stats a:hover,.report-card__profile__stats a:active{color:#f7f9fb}.report-card__profile__stats .red{color:#df405a}.report-card__summary__item{display:flex;justify-content:flex-start;border-top:1px solid #1f232b}.report-card__summary__item:hover{background:#2c313d}.report-card__summary__item__reported-by,.report-card__summary__item__assigned{padding:15px;flex:0 0 auto;box-sizing:border-box;width:150px;color:#dde3ec}.report-card__summary__item__reported-by,.report-card__summary__item__reported-by .username,.report-card__summary__item__assigned,.report-card__summary__item__assigned .username{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.report-card__summary__item__content{flex:1 1 auto;max-width:calc(100% - 300px)}.report-card__summary__item__content__icon{color:#c2cede;margin-right:4px;font-weight:500}.report-card__summary__item__content a{display:block;box-sizing:border-box;width:100%;padding:15px;text-decoration:none;color:#dde3ec}.one-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ellipsized-ip{display:inline-block;max-width:120px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.admin-account-bio{display:flex;flex-wrap:wrap;margin:0 -5px;margin-top:20px}.admin-account-bio>div{box-sizing:border-box;padding:0 5px;margin-bottom:10px;flex:1 0 50%}.admin-account-bio .account__header__fields,.admin-account-bio .account__header__content{background:#393f4f;border-radius:4px;height:100%}.admin-account-bio .account__header__fields{margin:0;border:0}.admin-account-bio .account__header__fields a{color:#4e79df}.admin-account-bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.admin-account-bio .account__header__fields .verified a{color:#79bd9a}.admin-account-bio .account__header__content{box-sizing:border-box;padding:20px;color:#fff}.center-text{text-align:center}.announcements-list{border:1px solid #313543;border-radius:4px}.announcements-list__item{padding:15px 0;background:#282c37;border-bottom:1px solid #313543}.announcements-list__item__title{padding:0 15px;display:block;font-weight:500;font-size:18px;line-height:1.5;color:#ecf0f4;text-decoration:none;margin-bottom:10px}.announcements-list__item__title:hover,.announcements-list__item__title:focus,.announcements-list__item__title:active{color:#fff}.announcements-list__item__meta{padding:0 15px;color:#c2cede}.announcements-list__item__action-bar{display:flex;justify-content:space-between;align-items:center}.announcements-list__item:last-child{border-bottom:0}.dashboard__counters{display:flex;flex-wrap:wrap;margin:0 -5px;margin-bottom:20px}.dashboard__counters>div{box-sizing:border-box;flex:0 0 33.333%;padding:0 5px;margin-bottom:10px}.dashboard__counters>div>div,.dashboard__counters>div>a{padding:20px;background:#313543;border-radius:4px;box-sizing:border-box;height:100%}.dashboard__counters>div>a{text-decoration:none;color:inherit;display:block}.dashboard__counters>div>a:hover,.dashboard__counters>div>a:focus,.dashboard__counters>div>a:active{background:#393f4f}.dashboard__counters__num,.dashboard__counters__text{text-align:center;font-weight:500;font-size:24px;line-height:21px;color:#fff;font-family:\"mastodon-font-display\",sans-serif;margin-bottom:20px;line-height:30px}.dashboard__counters__text{font-size:18px}.dashboard__counters__label{font-size:14px;color:#dde3ec;text-align:center;font-weight:500}.dashboard__widgets{display:flex;flex-wrap:wrap;margin:0 -5px}.dashboard__widgets>div{flex:0 0 33.333%;margin-bottom:20px}.dashboard__widgets>div>div{padding:0 5px}.dashboard__widgets a:not(.name-tag){color:#d9e1e8;font-weight:500;text-decoration:none}body.rtl{direction:rtl}body.rtl .column-header>button{text-align:right;padding-left:0;padding-right:15px}body.rtl .radio-button__input{margin-right:0;margin-left:10px}body.rtl .directory__card__bar .display-name{margin-left:0;margin-right:15px}body.rtl .display-name{text-align:right}body.rtl .notification__message{margin-left:0;margin-right:68px}body.rtl .drawer__inner__mastodon>img{transform:scaleX(-1)}body.rtl .notification__favourite-icon-wrapper{left:auto;right:-26px}body.rtl .landing-page__logo{margin-right:0;margin-left:20px}body.rtl .landing-page .features-list .features-list__row .visual{margin-left:0;margin-right:15px}body.rtl .column-link__icon,body.rtl .column-header__icon{margin-right:0;margin-left:5px}body.rtl .compose-form .compose-form__buttons-wrapper .character-counter__wrapper{margin-right:0;margin-left:4px}body.rtl .navigation-bar__profile{margin-left:0;margin-right:8px}body.rtl .search__input{padding-right:10px;padding-left:30px}body.rtl .search__icon .fa{right:auto;left:10px}body.rtl .columns-area{direction:rtl}body.rtl .column-header__buttons{left:0;right:auto;margin-left:0;margin-right:-15px}body.rtl .column-inline-form .icon-button{margin-left:0;margin-right:5px}body.rtl .column-header__links .text-btn{margin-left:10px;margin-right:0}body.rtl .account__avatar-wrapper{float:right}body.rtl .column-header__back-button{padding-left:5px;padding-right:0}body.rtl .column-header__setting-arrows{float:left}body.rtl .setting-toggle__label{margin-left:0;margin-right:8px}body.rtl .status__avatar{left:auto;right:10px}body.rtl .status,body.rtl .activity-stream .status.light{padding-left:10px;padding-right:68px}body.rtl .status__info .status__display-name,body.rtl .activity-stream .status.light .status__display-name{padding-left:25px;padding-right:0}body.rtl .activity-stream .pre-header{padding-right:68px;padding-left:0}body.rtl .status__prepend{margin-left:0;margin-right:68px}body.rtl .status__prepend-icon-wrapper{left:auto;right:-26px}body.rtl .activity-stream .pre-header .pre-header__icon{left:auto;right:42px}body.rtl .account__avatar-overlay-overlay{right:auto;left:0}body.rtl .column-back-button--slim-button{right:auto;left:0}body.rtl .status__relative-time,body.rtl .activity-stream .status.light .status__header .status__meta{float:left}body.rtl .status__action-bar__counter{margin-right:0;margin-left:11px}body.rtl .status__action-bar__counter .status__action-bar-button{margin-right:0;margin-left:4px}body.rtl .status__action-bar-button{float:right;margin-right:0;margin-left:18px}body.rtl .status__action-bar-dropdown{float:right}body.rtl .privacy-dropdown__dropdown{margin-left:0;margin-right:40px}body.rtl .privacy-dropdown__option__icon{margin-left:10px;margin-right:0}body.rtl .detailed-status__display-name .display-name{text-align:right}body.rtl .detailed-status__display-avatar{margin-right:0;margin-left:10px;float:right}body.rtl .detailed-status__favorites,body.rtl .detailed-status__reblogs{margin-left:0;margin-right:6px}body.rtl .fa-ul{margin-left:2.14285714em}body.rtl .fa-li{left:auto;right:-2.14285714em}body.rtl .admin-wrapper{direction:rtl}body.rtl .admin-wrapper .sidebar ul a i.fa,body.rtl a.table-action-link i.fa{margin-right:0;margin-left:5px}body.rtl .simple_form .check_boxes .checkbox label{padding-left:0;padding-right:25px}body.rtl .simple_form .input.with_label.boolean label.checkbox{padding-left:25px;padding-right:0}body.rtl .simple_form .check_boxes .checkbox input[type=checkbox],body.rtl .simple_form .input.boolean input[type=checkbox]{left:auto;right:0}body.rtl .simple_form .input.radio_buttons .radio{left:auto;right:0}body.rtl .simple_form .input.radio_buttons .radio>label{padding-right:28px;padding-left:0}body.rtl .simple_form .input-with-append .input input{padding-left:142px;padding-right:0}body.rtl .simple_form .input.boolean label.checkbox{left:auto;right:0}body.rtl .simple_form .input.boolean .label_input,body.rtl .simple_form .input.boolean .hint{padding-left:0;padding-right:28px}body.rtl .simple_form .label_input__append{right:auto;left:3px}body.rtl .simple_form .label_input__append::after{right:auto;left:0;background-image:linear-gradient(to left, rgba(19, 20, 25, 0), #131419)}body.rtl .simple_form select{background:#131419 url(\"data:image/svg+xml;utf8,\") no-repeat left 8px center/auto 16px}body.rtl .table th,body.rtl .table td{text-align:right}body.rtl .filters .filter-subset{margin-right:0;margin-left:45px}body.rtl .landing-page .header-wrapper .mascot{right:60px;left:auto}body.rtl .landing-page__call-to-action .row__information-board{direction:rtl}body.rtl .landing-page .header .hero .floats .float-1{left:-120px;right:auto}body.rtl .landing-page .header .hero .floats .float-2{left:210px;right:auto}body.rtl .landing-page .header .hero .floats .float-3{left:110px;right:auto}body.rtl .landing-page .header .links .brand img{left:0}body.rtl .landing-page .fa-external-link{padding-right:5px;padding-left:0 !important}body.rtl .landing-page .features #mastodon-timeline{margin-right:0;margin-left:30px}@media screen and (min-width: 631px){body.rtl .column,body.rtl .drawer{padding-left:5px;padding-right:5px}body.rtl .column:first-child,body.rtl .drawer:first-child{padding-left:5px;padding-right:10px}body.rtl .columns-area>div .column,body.rtl .columns-area>div .drawer{padding-left:5px;padding-right:5px}}body.rtl .columns-area--mobile .column,body.rtl .columns-area--mobile .drawer{padding-left:0;padding-right:0}body.rtl .public-layout .header .nav-button{margin-left:8px;margin-right:0}body.rtl .public-layout .public-account-header__tabs{margin-left:0;margin-right:20px}body.rtl .landing-page__information .account__display-name{margin-right:0;margin-left:5px}body.rtl .landing-page__information .account__avatar-wrapper{margin-left:12px;margin-right:0}body.rtl .card__bar .display-name{margin-left:0;margin-right:15px;text-align:right}body.rtl .fa-chevron-left::before{content:\"\"}body.rtl .fa-chevron-right::before{content:\"\"}body.rtl .column-back-button__icon{margin-right:0;margin-left:5px}body.rtl .column-header__setting-arrows .column-header__setting-btn:last-child{padding-left:0;padding-right:10px}body.rtl .simple_form .input.radio_buttons .radio>label input{left:auto;right:0}.emojione[title=\":wavy_dash:\"],.emojione[title=\":waving_black_flag:\"],.emojione[title=\":water_buffalo:\"],.emojione[title=\":video_game:\"],.emojione[title=\":video_camera:\"],.emojione[title=\":vhs:\"],.emojione[title=\":turkey:\"],.emojione[title=\":tophat:\"],.emojione[title=\":top:\"],.emojione[title=\":tm:\"],.emojione[title=\":telephone_receiver:\"],.emojione[title=\":spider:\"],.emojione[title=\":speaking_head_in_silhouette:\"],.emojione[title=\":spades:\"],.emojione[title=\":soon:\"],.emojione[title=\":registered:\"],.emojione[title=\":on:\"],.emojione[title=\":musical_score:\"],.emojione[title=\":movie_camera:\"],.emojione[title=\":mortar_board:\"],.emojione[title=\":microphone:\"],.emojione[title=\":male-guard:\"],.emojione[title=\":lower_left_fountain_pen:\"],.emojione[title=\":lower_left_ballpoint_pen:\"],.emojione[title=\":kaaba:\"],.emojione[title=\":joystick:\"],.emojione[title=\":hole:\"],.emojione[title=\":hocho:\"],.emojione[title=\":heavy_plus_sign:\"],.emojione[title=\":heavy_multiplication_x:\"],.emojione[title=\":heavy_minus_sign:\"],.emojione[title=\":heavy_dollar_sign:\"],.emojione[title=\":heavy_division_sign:\"],.emojione[title=\":heavy_check_mark:\"],.emojione[title=\":guardsman:\"],.emojione[title=\":gorilla:\"],.emojione[title=\":fried_egg:\"],.emojione[title=\":film_projector:\"],.emojione[title=\":female-guard:\"],.emojione[title=\":end:\"],.emojione[title=\":electric_plug:\"],.emojione[title=\":eight_pointed_black_star:\"],.emojione[title=\":dark_sunglasses:\"],.emojione[title=\":currency_exchange:\"],.emojione[title=\":curly_loop:\"],.emojione[title=\":copyright:\"],.emojione[title=\":clubs:\"],.emojione[title=\":camera_with_flash:\"],.emojione[title=\":camera:\"],.emojione[title=\":busts_in_silhouette:\"],.emojione[title=\":bust_in_silhouette:\"],.emojione[title=\":bowling:\"],.emojione[title=\":bomb:\"],.emojione[title=\":black_small_square:\"],.emojione[title=\":black_nib:\"],.emojione[title=\":black_medium_square:\"],.emojione[title=\":black_medium_small_square:\"],.emojione[title=\":black_large_square:\"],.emojione[title=\":black_heart:\"],.emojione[title=\":black_circle:\"],.emojione[title=\":back:\"],.emojione[title=\":ant:\"],.emojione[title=\":8ball:\"]{filter:drop-shadow(1px 1px 0 #ffffff) drop-shadow(-1px 1px 0 #ffffff) drop-shadow(1px -1px 0 #ffffff) drop-shadow(-1px -1px 0 #ffffff);transform:scale(0.71)}.compose-form .compose-form__modifiers .compose-form__upload-description input::placeholder{opacity:1}.rich-formatting a,.rich-formatting p a,.rich-formatting li a,.landing-page__short-description p a,.status__content a,.reply-indicator__content a{color:#5f86e2;text-decoration:underline}.rich-formatting a.mention,.rich-formatting p a.mention,.rich-formatting li a.mention,.landing-page__short-description p a.mention,.status__content a.mention,.reply-indicator__content a.mention{text-decoration:none}.rich-formatting a.mention span,.rich-formatting p a.mention span,.rich-formatting li a.mention span,.landing-page__short-description p a.mention span,.status__content a.mention span,.reply-indicator__content a.mention span{text-decoration:underline}.rich-formatting a.mention span:hover,.rich-formatting a.mention span:focus,.rich-formatting a.mention span:active,.rich-formatting p a.mention span:hover,.rich-formatting p a.mention span:focus,.rich-formatting p a.mention span:active,.rich-formatting li a.mention span:hover,.rich-formatting li a.mention span:focus,.rich-formatting li a.mention span:active,.landing-page__short-description p a.mention span:hover,.landing-page__short-description p a.mention span:focus,.landing-page__short-description p a.mention span:active,.status__content a.mention span:hover,.status__content a.mention span:focus,.status__content a.mention span:active,.reply-indicator__content a.mention span:hover,.reply-indicator__content a.mention span:focus,.reply-indicator__content a.mention span:active{text-decoration:none}.rich-formatting a:hover,.rich-formatting a:focus,.rich-formatting a:active,.rich-formatting p a:hover,.rich-formatting p a:focus,.rich-formatting p a:active,.rich-formatting li a:hover,.rich-formatting li a:focus,.rich-formatting li a:active,.landing-page__short-description p a:hover,.landing-page__short-description p a:focus,.landing-page__short-description p a:active,.status__content a:hover,.status__content a:focus,.status__content a:active,.reply-indicator__content a:hover,.reply-indicator__content a:focus,.reply-indicator__content a:active{text-decoration:none}.rich-formatting a.status__content__spoiler-link,.rich-formatting p a.status__content__spoiler-link,.rich-formatting li a.status__content__spoiler-link,.landing-page__short-description p a.status__content__spoiler-link,.status__content a.status__content__spoiler-link,.reply-indicator__content a.status__content__spoiler-link{color:#ecf0f4;text-decoration:none}.status__content__read-more-button{text-decoration:underline}.status__content__read-more-button:hover,.status__content__read-more-button:focus,.status__content__read-more-button:active{text-decoration:none}.getting-started__footer a{text-decoration:underline}.getting-started__footer a:hover,.getting-started__footer a:focus,.getting-started__footer a:active{text-decoration:none}.nothing-here{color:#dde3ec}.public-layout .public-account-header__tabs__tabs .counter.active::after{border-bottom:4px solid #2b5fd9}","/* http://meyerweb.com/eric/tools/css/reset/\n v2.0 | 20110126\n License: none (public domain)\n*/\n\nhtml, body, div, span, applet, object, iframe,\nh1, h2, h3, h4, h5, h6, p, blockquote, pre,\na, abbr, acronym, address, big, cite, code,\ndel, dfn, em, img, ins, kbd, q, s, samp,\nsmall, strike, strong, sub, sup, tt, var,\nb, u, i, center,\ndl, dt, dd, ol, ul, li,\nfieldset, form, label, legend,\ntable, caption, tbody, tfoot, thead, tr, th, td,\narticle, aside, canvas, details, embed,\nfigure, figcaption, footer, header, hgroup,\nmenu, nav, output, ruby, section, summary,\ntime, mark, audio, video {\n margin: 0;\n padding: 0;\n border: 0;\n font-size: 100%;\n font: inherit;\n vertical-align: baseline;\n}\n\n/* HTML5 display-role reset for older browsers */\narticle, aside, details, figcaption, figure,\nfooter, header, hgroup, menu, nav, section {\n display: block;\n}\n\nbody {\n line-height: 1;\n}\n\nol, ul {\n list-style: none;\n}\n\nblockquote, q {\n quotes: none;\n}\n\nblockquote:before, blockquote:after,\nq:before, q:after {\n content: '';\n content: none;\n}\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\nhtml {\n scrollbar-color: lighten($ui-base-color, 4%) rgba($base-overlay-background, 0.1);\n}\n\n::-webkit-scrollbar {\n width: 12px;\n height: 12px;\n}\n\n::-webkit-scrollbar-thumb {\n background: lighten($ui-base-color, 4%);\n border: 0px none $base-border-color;\n border-radius: 50px;\n}\n\n::-webkit-scrollbar-thumb:hover {\n background: lighten($ui-base-color, 6%);\n}\n\n::-webkit-scrollbar-thumb:active {\n background: lighten($ui-base-color, 4%);\n}\n\n::-webkit-scrollbar-track {\n border: 0px none $base-border-color;\n border-radius: 0;\n background: rgba($base-overlay-background, 0.1);\n}\n\n::-webkit-scrollbar-track:hover {\n background: $ui-base-color;\n}\n\n::-webkit-scrollbar-track:active {\n background: $ui-base-color;\n}\n\n::-webkit-scrollbar-corner {\n background: transparent;\n}\n","// Dependent colors\n$black: #000000;\n\n$classic-base-color: #282c37;\n$classic-primary-color: #9baec8;\n$classic-secondary-color: #d9e1e8;\n$classic-highlight-color: #2b90d9;\n\n$ui-base-color: $classic-base-color !default;\n$ui-primary-color: $classic-primary-color !default;\n$ui-secondary-color: $classic-secondary-color !default;\n\n// Differences\n$ui-highlight-color: #2b5fd9;\n\n$darker-text-color: lighten($ui-primary-color, 20%) !default;\n$dark-text-color: lighten($ui-primary-color, 12%) !default;\n$secondary-text-color: lighten($ui-secondary-color, 6%) !default;\n$highlight-text-color: $classic-highlight-color !default;\n$action-button-color: #8d9ac2;\n\n$inverted-text-color: $black !default;\n$lighter-text-color: darken($ui-base-color, 6%) !default;\n$light-text-color: darken($ui-primary-color, 40%) !default;\n","@function hex-color($color) {\n @if type-of($color) == 'color' {\n $color: str-slice(ie-hex-str($color), 4);\n }\n\n @return '%23' + unquote($color);\n}\n\nbody {\n font-family: $font-sans-serif, sans-serif;\n background: darken($ui-base-color, 7%);\n font-size: 13px;\n line-height: 18px;\n font-weight: 400;\n color: $primary-text-color;\n text-rendering: optimizelegibility;\n font-feature-settings: \"kern\";\n text-size-adjust: none;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n -webkit-tap-highlight-color: transparent;\n\n &.system-font {\n // system-ui => standard property (Chrome/Android WebView 56+, Opera 43+, Safari 11+)\n // -apple-system => Safari <11 specific\n // BlinkMacSystemFont => Chrome <56 on macOS specific\n // Segoe UI => Windows 7/8/10\n // Oxygen => KDE\n // Ubuntu => Unity/Ubuntu\n // Cantarell => GNOME\n // Fira Sans => Firefox OS\n // Droid Sans => Older Androids (<4.0)\n // Helvetica Neue => Older macOS <10.11\n // $font-sans-serif => web-font (Roboto) fallback and newer Androids (>=4.0)\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Oxygen\", \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", $font-sans-serif, sans-serif;\n }\n\n &.app-body {\n padding: 0;\n\n &.layout-single-column {\n height: auto;\n min-height: 100vh;\n overflow-y: scroll;\n }\n\n &.layout-multiple-columns {\n position: absolute;\n width: 100%;\n height: 100%;\n }\n\n &.with-modals--active {\n overflow-y: hidden;\n }\n }\n\n &.lighter {\n background: $ui-base-color;\n }\n\n &.with-modals {\n overflow-x: hidden;\n overflow-y: scroll;\n\n &--active {\n overflow-y: hidden;\n }\n }\n\n &.player {\n text-align: center;\n }\n\n &.embed {\n background: lighten($ui-base-color, 4%);\n margin: 0;\n padding-bottom: 0;\n\n .container {\n position: absolute;\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n }\n\n &.admin {\n background: darken($ui-base-color, 4%);\n padding: 0;\n }\n\n &.error {\n position: absolute;\n text-align: center;\n color: $darker-text-color;\n background: $ui-base-color;\n width: 100%;\n height: 100%;\n padding: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n\n .dialog {\n vertical-align: middle;\n margin: 20px;\n\n &__illustration {\n img {\n display: block;\n max-width: 470px;\n width: 100%;\n height: auto;\n margin-top: -120px;\n }\n }\n\n h1 {\n font-size: 20px;\n line-height: 28px;\n font-weight: 400;\n }\n }\n }\n}\n\nbutton {\n font-family: inherit;\n cursor: pointer;\n\n &:focus {\n outline: none;\n }\n}\n\n.app-holder {\n &,\n & > div,\n & > noscript {\n display: flex;\n width: 100%;\n align-items: center;\n justify-content: center;\n outline: 0 !important;\n }\n\n & > noscript {\n height: 100vh;\n }\n}\n\n.layout-single-column .app-holder {\n &,\n & > div {\n min-height: 100vh;\n }\n}\n\n.layout-multiple-columns .app-holder {\n &,\n & > div {\n height: 100%;\n }\n}\n\n.error-boundary,\n.app-holder noscript {\n flex-direction: column;\n font-size: 16px;\n font-weight: 400;\n line-height: 1.7;\n color: lighten($error-red, 4%);\n text-align: center;\n\n & > div {\n max-width: 500px;\n }\n\n p {\n margin-bottom: .85em;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: $highlight-text-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n &__footer {\n color: $dark-text-color;\n font-size: 13px;\n\n a {\n color: $dark-text-color;\n }\n }\n\n button {\n display: inline;\n border: 0;\n background: transparent;\n color: $dark-text-color;\n font: inherit;\n padding: 0;\n margin: 0;\n line-height: inherit;\n cursor: pointer;\n outline: 0;\n transition: color 300ms linear;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n\n &.copied {\n color: $valid-value-color;\n transition: none;\n }\n }\n}\n","// Commonly used web colors\n$black: #000000; // Black\n$white: #ffffff; // White\n$success-green: #79bd9a !default; // Padua\n$error-red: #df405a !default; // Cerise\n$warning-red: #ff5050 !default; // Sunset Orange\n$gold-star: #ca8f04 !default; // Dark Goldenrod\n\n$red-bookmark: $warning-red;\n\n// Pleroma-Dark colors\n$pleroma-bg: #121a24;\n$pleroma-fg: #182230;\n$pleroma-text: #b9b9ba;\n$pleroma-links: #d8a070;\n\n// Values from the classic Mastodon UI\n$classic-base-color: $pleroma-bg;\n$classic-primary-color: #9baec8;\n$classic-secondary-color: #d9e1e8;\n$classic-highlight-color: #d8a070;\n\n// Variables for defaults in UI\n$base-shadow-color: $black !default;\n$base-overlay-background: $black !default;\n$base-border-color: $white !default;\n$simple-background-color: $white !default;\n$valid-value-color: $success-green !default;\n$error-value-color: $error-red !default;\n\n// Tell UI to use selected colors\n$ui-base-color: $classic-base-color !default; // Darkest\n$ui-base-lighter-color: lighten($ui-base-color, 26%) !default; // Lighter darkest\n$ui-primary-color: $classic-primary-color !default; // Lighter\n$ui-secondary-color: $classic-secondary-color !default; // Lightest\n$ui-highlight-color: $classic-highlight-color !default;\n\n// Variables for texts\n$primary-text-color: $white !default;\n$darker-text-color: $ui-primary-color !default;\n$dark-text-color: $ui-base-lighter-color !default;\n$secondary-text-color: $ui-secondary-color !default;\n$highlight-text-color: $ui-highlight-color !default;\n$action-button-color: $ui-base-lighter-color !default;\n// For texts on inverted backgrounds\n$inverted-text-color: $ui-base-color !default;\n$lighter-text-color: $ui-base-lighter-color !default;\n$light-text-color: $ui-primary-color !default;\n\n// Language codes that uses CJK fonts\n$cjk-langs: ja, ko, zh-CN, zh-HK, zh-TW;\n\n// Variables for components\n$media-modal-media-max-width: 100%;\n// put margins on top and bottom of image to avoid the screen covered by image.\n$media-modal-media-max-height: 80%;\n\n$no-gap-breakpoint: 415px;\n\n$font-sans-serif: 'mastodon-font-sans-serif' !default;\n$font-display: 'mastodon-font-display' !default;\n$font-monospace: 'mastodon-font-monospace' !default;\n",".container-alt {\n width: 700px;\n margin: 0 auto;\n margin-top: 40px;\n\n @media screen and (max-width: 740px) {\n width: 100%;\n margin: 0;\n }\n}\n\n.logo-container {\n margin: 100px auto 50px;\n\n @media screen and (max-width: 500px) {\n margin: 40px auto 0;\n }\n\n h1 {\n display: flex;\n justify-content: center;\n align-items: center;\n\n svg {\n fill: $primary-text-color;\n height: 42px;\n margin-right: 10px;\n }\n\n a {\n display: flex;\n justify-content: center;\n align-items: center;\n color: $primary-text-color;\n text-decoration: none;\n outline: 0;\n padding: 12px 16px;\n line-height: 32px;\n font-family: $font-display, sans-serif;\n font-weight: 500;\n font-size: 14px;\n }\n }\n}\n\n.compose-standalone {\n .compose-form {\n width: 400px;\n margin: 0 auto;\n padding: 20px 0;\n margin-top: 40px;\n box-sizing: border-box;\n\n @media screen and (max-width: 400px) {\n width: 100%;\n margin-top: 0;\n padding: 20px;\n }\n }\n}\n\n.account-header {\n width: 400px;\n margin: 0 auto;\n display: flex;\n font-size: 13px;\n line-height: 18px;\n box-sizing: border-box;\n padding: 20px 0;\n padding-bottom: 0;\n margin-bottom: -30px;\n margin-top: 40px;\n\n @media screen and (max-width: 440px) {\n width: 100%;\n margin: 0;\n margin-bottom: 10px;\n padding: 20px;\n padding-bottom: 0;\n }\n\n .avatar {\n width: 40px;\n height: 40px;\n margin-right: 8px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n }\n }\n\n .name {\n flex: 1 1 auto;\n color: $secondary-text-color;\n width: calc(100% - 88px);\n\n .username {\n display: block;\n font-weight: 500;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n }\n\n .logout-link {\n display: block;\n font-size: 32px;\n line-height: 40px;\n margin-left: 8px;\n }\n}\n\n.grid-3 {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: 3fr 1fr;\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-column: 1 / 3;\n grid-row: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 2;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1 / 3;\n grid-row: 3;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n grid-template-columns: minmax(0, 100%);\n\n .column-0 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .column-2 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1;\n grid-row: 4;\n }\n }\n}\n\n.grid-4 {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: repeat(4, minmax(0, 1fr));\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-column: 1 / 5;\n grid-row: 1;\n }\n\n .column-1 {\n grid-column: 1 / 4;\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 4;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 2 / 5;\n grid-row: 3;\n }\n\n .column-4 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .landing-page__call-to-action {\n min-height: 100%;\n }\n\n .flash-message {\n margin-bottom: 10px;\n }\n\n @media screen and (max-width: 738px) {\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n .landing-page__call-to-action {\n padding: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .row__information-board {\n width: 100%;\n justify-content: center;\n align-items: center;\n }\n\n .row__mascot {\n display: none;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n grid-template-columns: minmax(0, 100%);\n\n .column-0 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .column-2 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1;\n grid-row: 5;\n }\n\n .column-4 {\n grid-column: 1;\n grid-row: 4;\n }\n }\n}\n\n.public-layout {\n @media screen and (max-width: $no-gap-breakpoint) {\n padding-top: 48px;\n }\n\n .container {\n max-width: 960px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding: 0;\n }\n }\n\n .header {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n height: 48px;\n margin: 10px 0;\n display: flex;\n align-items: stretch;\n justify-content: center;\n flex-wrap: nowrap;\n overflow: hidden;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n position: fixed;\n width: 100%;\n top: 0;\n left: 0;\n margin: 0;\n border-radius: 0;\n box-shadow: none;\n z-index: 110;\n }\n\n & > div {\n flex: 1 1 33.3%;\n min-height: 1px;\n }\n\n .nav-left {\n display: flex;\n align-items: stretch;\n justify-content: flex-start;\n flex-wrap: nowrap;\n }\n\n .nav-center {\n display: flex;\n align-items: stretch;\n justify-content: center;\n flex-wrap: nowrap;\n }\n\n .nav-right {\n display: flex;\n align-items: stretch;\n justify-content: flex-end;\n flex-wrap: nowrap;\n }\n\n .brand {\n display: block;\n padding: 15px;\n\n svg {\n display: block;\n height: 18px;\n width: auto;\n position: relative;\n bottom: -2px;\n fill: $primary-text-color;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n height: 20px;\n }\n }\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 12%);\n }\n }\n\n .nav-link {\n display: flex;\n align-items: center;\n padding: 0 1rem;\n font-size: 12px;\n font-weight: 500;\n text-decoration: none;\n color: $darker-text-color;\n white-space: nowrap;\n text-align: center;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n color: $primary-text-color;\n }\n\n @media screen and (max-width: 550px) {\n &.optional {\n display: none;\n }\n }\n }\n\n .nav-button {\n background: lighten($ui-base-color, 16%);\n margin: 8px;\n margin-left: 0;\n border-radius: 4px;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n background: lighten($ui-base-color, 20%);\n }\n }\n }\n\n $no-columns-breakpoint: 600px;\n\n .grid {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(300px, 3fr) minmax(298px, 1fr);\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-row: 1;\n grid-column: 1;\n }\n\n .column-1 {\n grid-row: 1;\n grid-column: 2;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n grid-template-columns: 100%;\n grid-gap: 0;\n\n .column-1 {\n display: none;\n }\n }\n }\n\n .directory__card {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n\n .page-header {\n @media screen and (max-width: $no-gap-breakpoint) {\n border-bottom: 0;\n }\n }\n\n .public-account-header {\n overflow: hidden;\n margin-bottom: 10px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &.inactive {\n opacity: 0.5;\n\n .public-account-header__image,\n .avatar {\n filter: grayscale(100%);\n }\n\n .logo-button {\n background-color: $secondary-text-color;\n }\n }\n\n &__image {\n border-radius: 4px 4px 0 0;\n overflow: hidden;\n height: 300px;\n position: relative;\n background: darken($ui-base-color, 12%);\n\n &::after {\n content: \"\";\n display: block;\n position: absolute;\n width: 100%;\n height: 100%;\n box-shadow: inset 0 -1px 1px 1px rgba($base-shadow-color, 0.15);\n top: 0;\n left: 0;\n }\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 4px 4px 0 0;\n }\n\n @media screen and (max-width: 600px) {\n height: 200px;\n }\n }\n\n &--no-bar {\n margin-bottom: 0;\n\n .public-account-header__image,\n .public-account-header__image img {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n box-shadow: none;\n\n &__image::after {\n display: none;\n }\n\n &__image,\n &__image img {\n border-radius: 0;\n }\n }\n\n &__bar {\n position: relative;\n margin-top: -80px;\n display: flex;\n justify-content: flex-start;\n\n &::before {\n content: \"\";\n display: block;\n background: lighten($ui-base-color, 4%);\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: 60px;\n border-radius: 0 0 4px 4px;\n z-index: -1;\n }\n\n .avatar {\n display: block;\n width: 120px;\n height: 120px;\n padding-left: 20px - 4px;\n flex: 0 0 auto;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 50%;\n border: 4px solid lighten($ui-base-color, 4%);\n background: darken($ui-base-color, 8%);\n }\n }\n\n @media screen and (max-width: 600px) {\n margin-top: 0;\n background: lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n padding: 5px;\n\n &::before {\n display: none;\n }\n\n .avatar {\n width: 48px;\n height: 48px;\n padding: 7px 0;\n padding-left: 10px;\n\n img {\n border: 0;\n border-radius: 4px;\n }\n\n @media screen and (max-width: 360px) {\n display: none;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n flex-wrap: wrap;\n }\n }\n\n &__tabs {\n flex: 1 1 auto;\n margin-left: 20px;\n\n &__name {\n padding-top: 20px;\n padding-bottom: 8px;\n\n h1 {\n font-size: 20px;\n line-height: 18px * 1.5;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n text-shadow: 1px 1px 1px $base-shadow-color;\n\n small {\n display: block;\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n @media screen and (max-width: 600px) {\n margin-left: 15px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n &__name {\n padding-top: 0;\n padding-bottom: 0;\n\n h1 {\n font-size: 16px;\n line-height: 24px;\n text-shadow: none;\n\n small {\n color: $darker-text-color;\n }\n }\n }\n }\n\n &__tabs {\n display: flex;\n justify-content: flex-start;\n align-items: stretch;\n height: 58px;\n\n .details-counters {\n display: flex;\n flex-direction: row;\n min-width: 300px;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n .details-counters {\n display: none;\n }\n }\n\n .counter {\n min-width: 33.3%;\n box-sizing: border-box;\n flex: 0 0 auto;\n color: $darker-text-color;\n padding: 10px;\n border-right: 1px solid lighten($ui-base-color, 4%);\n cursor: default;\n text-align: center;\n position: relative;\n\n a {\n display: block;\n }\n\n &:last-child {\n border-right: 0;\n }\n\n &::after {\n display: block;\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n border-bottom: 4px solid $ui-primary-color;\n opacity: 0.5;\n transition: all 400ms ease;\n }\n\n &.active {\n &::after {\n border-bottom: 4px solid $highlight-text-color;\n opacity: 1;\n }\n\n &.inactive::after {\n border-bottom-color: $secondary-text-color;\n }\n }\n\n &:hover {\n &::after {\n opacity: 1;\n transition-duration: 100ms;\n }\n }\n\n a {\n text-decoration: none;\n color: inherit;\n }\n\n .counter-label {\n font-size: 12px;\n display: block;\n }\n\n .counter-number {\n font-weight: 500;\n font-size: 18px;\n margin-bottom: 5px;\n color: $primary-text-color;\n font-family: $font-display, sans-serif;\n }\n }\n\n .spacer {\n flex: 1 1 auto;\n height: 1px;\n }\n\n &__buttons {\n padding: 7px 8px;\n }\n }\n }\n\n &__extra {\n display: none;\n margin-top: 4px;\n\n .public-account-bio {\n border-radius: 0;\n box-shadow: none;\n background: transparent;\n margin: 0 -5px;\n\n .account__header__fields {\n border-top: 1px solid lighten($ui-base-color, 12%);\n }\n\n .roles {\n display: none;\n }\n }\n\n &__links {\n margin-top: -15px;\n font-size: 14px;\n color: $darker-text-color;\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n padding: 15px;\n font-weight: 500;\n\n strong {\n font-weight: 700;\n color: $primary-text-color;\n }\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n flex: 100%;\n }\n }\n }\n\n .account__section-headline {\n border-radius: 4px 4px 0 0;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n\n .detailed-status__meta {\n margin-top: 25px;\n }\n\n .public-account-bio {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n overflow: hidden;\n margin-bottom: 10px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n box-shadow: none;\n margin-bottom: 0;\n border-radius: 0;\n }\n\n .account__header__fields {\n margin: 0;\n border-top: 0;\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n\n .account__header__content {\n padding: 20px;\n padding-bottom: 0;\n color: $primary-text-color;\n }\n\n &__extra,\n .roles {\n padding: 20px;\n font-size: 14px;\n color: $darker-text-color;\n }\n\n .roles {\n padding-bottom: 0;\n }\n }\n\n .directory__list {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: block;\n }\n\n .icon-button {\n font-size: 18px;\n }\n }\n\n .directory__card {\n margin-bottom: 0;\n }\n\n .card-grid {\n display: flex;\n flex-wrap: wrap;\n min-width: 100%;\n margin: 0 -5px;\n\n & > div {\n box-sizing: border-box;\n flex: 1 0 auto;\n width: 300px;\n padding: 0 5px;\n margin-bottom: 10px;\n max-width: 33.333%;\n\n @media screen and (max-width: 900px) {\n max-width: 50%;\n }\n\n @media screen and (max-width: 600px) {\n max-width: 100%;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin: 0;\n border-top: 1px solid lighten($ui-base-color, 8%);\n\n & > div {\n width: 100%;\n padding: 0;\n margin-bottom: 0;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &:last-child {\n border-bottom: 0;\n }\n\n .card__bar {\n background: $ui-base-color;\n\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n }\n }\n }\n }\n}\n",".no-list {\n list-style: none;\n\n li {\n display: inline-block;\n margin: 0 5px;\n }\n}\n\n.recovery-codes {\n list-style: none;\n margin: 0 auto;\n\n li {\n font-size: 125%;\n line-height: 1.5;\n letter-spacing: 1px;\n }\n}\n",".public-layout {\n .footer {\n text-align: left;\n padding-top: 20px;\n padding-bottom: 60px;\n font-size: 12px;\n color: lighten($ui-base-color, 34%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding-left: 20px;\n padding-right: 20px;\n }\n\n .grid {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: 1fr 1fr 2fr 1fr 1fr;\n\n .column-0 {\n grid-column: 1;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-1 {\n grid-column: 2;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-2 {\n grid-column: 3;\n grid-row: 1;\n min-width: 0;\n text-align: center;\n\n h4 a {\n color: lighten($ui-base-color, 34%);\n }\n }\n\n .column-3 {\n grid-column: 4;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-4 {\n grid-column: 5;\n grid-row: 1;\n min-width: 0;\n }\n\n @media screen and (max-width: 690px) {\n grid-template-columns: 1fr 2fr 1fr;\n\n .column-0,\n .column-1 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 2;\n }\n\n .column-3,\n .column-4 {\n grid-column: 3;\n }\n\n .column-4 {\n grid-row: 2;\n }\n }\n\n @media screen and (max-width: 600px) {\n .column-1 {\n display: block;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n .column-0,\n .column-1,\n .column-3,\n .column-4 {\n display: none;\n }\n }\n }\n\n h4 {\n text-transform: uppercase;\n font-weight: 700;\n margin-bottom: 8px;\n color: $darker-text-color;\n\n a {\n color: inherit;\n text-decoration: none;\n }\n }\n\n ul a {\n text-decoration: none;\n color: lighten($ui-base-color, 34%);\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n\n .brand {\n svg {\n display: block;\n height: 36px;\n width: auto;\n margin: 0 auto;\n fill: lighten($ui-base-color, 34%);\n }\n\n &:hover,\n &:focus,\n &:active {\n svg {\n fill: lighten($ui-base-color, 38%);\n }\n }\n }\n }\n}\n",".compact-header {\n h1 {\n font-size: 24px;\n line-height: 28px;\n color: $darker-text-color;\n font-weight: 500;\n margin-bottom: 20px;\n padding: 0 10px;\n word-wrap: break-word;\n\n @media screen and (max-width: 740px) {\n text-align: center;\n padding: 20px 10px 0;\n }\n\n a {\n color: inherit;\n text-decoration: none;\n }\n\n small {\n font-weight: 400;\n color: $secondary-text-color;\n }\n\n img {\n display: inline-block;\n margin-bottom: -5px;\n margin-right: 15px;\n width: 36px;\n height: 36px;\n }\n }\n}\n",".hero-widget {\n margin-bottom: 10px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &__img {\n width: 100%;\n position: relative;\n overflow: hidden;\n border-radius: 4px 4px 0 0;\n background: $base-shadow-color;\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 4px 4px 0 0;\n }\n }\n\n &__text {\n background: $ui-base-color;\n padding: 20px;\n border-radius: 0 0 4px 4px;\n font-size: 15px;\n color: $darker-text-color;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n p {\n margin-bottom: 20px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n em {\n display: inline;\n margin: 0;\n padding: 0;\n font-weight: 700;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n color: lighten($darker-text-color, 10%);\n }\n\n a {\n color: $secondary-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n}\n\n.endorsements-widget {\n margin-bottom: 10px;\n padding-bottom: 10px;\n\n h4 {\n padding: 10px;\n text-transform: uppercase;\n font-weight: 700;\n font-size: 13px;\n color: $darker-text-color;\n }\n\n .account {\n padding: 10px 0;\n\n &:last-child {\n border-bottom: 0;\n }\n\n .account__display-name {\n display: flex;\n align-items: center;\n }\n\n .account__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n }\n\n .trends__item {\n padding: 10px;\n }\n}\n\n.trends-widget {\n h4 {\n color: $darker-text-color;\n }\n}\n\n.box-widget {\n padding: 20px;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n}\n\n.placeholder-widget {\n padding: 16px;\n border-radius: 4px;\n border: 2px dashed $dark-text-color;\n text-align: center;\n color: $darker-text-color;\n margin-bottom: 10px;\n}\n\n.contact-widget {\n min-height: 100%;\n font-size: 15px;\n color: $darker-text-color;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n padding: 0;\n\n h4 {\n padding: 10px;\n text-transform: uppercase;\n font-weight: 700;\n font-size: 13px;\n color: $darker-text-color;\n }\n\n .account {\n border-bottom: 0;\n padding: 10px 0;\n padding-top: 5px;\n }\n\n & > a {\n display: inline-block;\n padding: 10px;\n padding-top: 0;\n color: $darker-text-color;\n text-decoration: none;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.moved-account-widget {\n padding: 15px;\n padding-bottom: 20px;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n color: $secondary-text-color;\n font-weight: 400;\n margin-bottom: 10px;\n\n strong,\n a {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n color: inherit;\n text-decoration: underline;\n\n &.mention {\n text-decoration: none;\n\n span {\n text-decoration: none;\n }\n\n &:focus,\n &:hover,\n &:active {\n text-decoration: none;\n\n span {\n text-decoration: underline;\n }\n }\n }\n }\n\n &__message {\n margin-bottom: 15px;\n\n .fa {\n margin-right: 5px;\n color: $darker-text-color;\n }\n }\n\n &__card {\n .detailed-status__display-avatar {\n position: relative;\n cursor: pointer;\n }\n\n .detailed-status__display-name {\n margin-bottom: 0;\n text-decoration: none;\n\n span {\n font-weight: 400;\n }\n }\n }\n}\n\n.memoriam-widget {\n padding: 20px;\n border-radius: 4px;\n background: $base-shadow-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n font-size: 14px;\n color: $darker-text-color;\n margin-bottom: 10px;\n}\n\n.page-header {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n padding: 60px 15px;\n text-align: center;\n margin: 10px 0;\n\n h1 {\n color: $primary-text-color;\n font-size: 36px;\n line-height: 1.1;\n font-weight: 700;\n margin-bottom: 10px;\n }\n\n p {\n font-size: 15px;\n color: $darker-text-color;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-top: 0;\n background: lighten($ui-base-color, 4%);\n\n h1 {\n font-size: 24px;\n }\n }\n}\n\n.directory {\n background: $ui-base-color;\n border-radius: 4px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &__tag {\n box-sizing: border-box;\n margin-bottom: 10px;\n\n & > a,\n & > div {\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: $ui-base-color;\n border-radius: 4px;\n padding: 15px;\n text-decoration: none;\n color: inherit;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n }\n\n & > a {\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 8%);\n }\n }\n\n &.active > a {\n background: $ui-highlight-color;\n cursor: default;\n }\n\n &.disabled > div {\n opacity: 0.5;\n cursor: default;\n }\n\n h4 {\n flex: 1 1 auto;\n font-size: 18px;\n font-weight: 700;\n color: $primary-text-color;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n .fa {\n color: $darker-text-color;\n }\n\n small {\n display: block;\n font-weight: 400;\n font-size: 15px;\n margin-top: 8px;\n color: $darker-text-color;\n }\n }\n\n &.active h4 {\n &,\n .fa,\n small,\n .trends__item__current {\n color: $primary-text-color;\n }\n }\n\n .avatar-stack {\n flex: 0 0 auto;\n width: (36px + 4px) * 3;\n }\n\n &.active .avatar-stack .account__avatar {\n border-color: $ui-highlight-color;\n }\n\n .trends__item__current {\n padding-right: 0;\n }\n }\n}\n\n.avatar-stack {\n display: flex;\n justify-content: flex-end;\n\n .account__avatar {\n flex: 0 0 auto;\n width: 36px;\n height: 36px;\n border-radius: 50%;\n position: relative;\n margin-left: -10px;\n background: darken($ui-base-color, 8%);\n border: 2px solid $ui-base-color;\n\n &:nth-child(1) {\n z-index: 1;\n }\n\n &:nth-child(2) {\n z-index: 2;\n }\n\n &:nth-child(3) {\n z-index: 3;\n }\n }\n}\n\n.accounts-table {\n width: 100%;\n\n .account {\n padding: 0;\n border: 0;\n }\n\n strong {\n font-weight: 700;\n }\n\n thead th {\n text-align: center;\n text-transform: uppercase;\n color: $darker-text-color;\n font-weight: 700;\n padding: 10px;\n\n &:first-child {\n text-align: left;\n }\n }\n\n tbody td {\n padding: 15px 0;\n vertical-align: middle;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n tbody tr:last-child td {\n border-bottom: 0;\n }\n\n &__count {\n width: 120px;\n text-align: center;\n font-size: 15px;\n font-weight: 500;\n color: $primary-text-color;\n\n small {\n display: block;\n color: $darker-text-color;\n font-weight: 400;\n font-size: 14px;\n }\n }\n\n &__comment {\n width: 50%;\n vertical-align: initial !important;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n tbody td.optional {\n display: none;\n }\n }\n}\n\n.moved-account-widget,\n.memoriam-widget,\n.box-widget,\n.contact-widget,\n.landing-page__information.contact-widget,\n.directory,\n.page-header {\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n box-shadow: none;\n border-radius: 0;\n }\n}\n\n$maximum-width: 1235px;\n$fluid-breakpoint: $maximum-width + 20px;\n\n.statuses-grid {\n min-height: 600px;\n\n @media screen and (max-width: 640px) {\n width: 100% !important; // Masonry layout is unnecessary at this width\n }\n\n &__item {\n width: (960px - 20px) / 3;\n\n @media screen and (max-width: $fluid-breakpoint) {\n width: (940px - 20px) / 3;\n }\n\n @media screen and (max-width: 640px) {\n width: 100%;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n width: 100vw;\n }\n }\n\n .detailed-status {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 1px solid lighten($ui-base-color, 16%);\n }\n\n &.compact {\n .detailed-status__meta {\n margin-top: 15px;\n }\n\n .status__content {\n font-size: 15px;\n line-height: 20px;\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n .status__content__spoiler-link {\n line-height: 20px;\n margin: 0;\n }\n }\n\n .media-gallery,\n .status-card,\n .video-player {\n margin-top: 15px;\n }\n }\n }\n}\n\n.notice-widget {\n margin-bottom: 10px;\n color: $darker-text-color;\n\n p {\n margin-bottom: 10px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n font-size: 14px;\n line-height: 20px;\n }\n}\n\n.notice-widget,\n.placeholder-widget {\n a {\n text-decoration: none;\n font-weight: 500;\n color: $ui-highlight-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.table-of-contents {\n background: darken($ui-base-color, 4%);\n min-height: 100%;\n font-size: 14px;\n border-radius: 4px;\n\n li a {\n display: block;\n font-weight: 500;\n padding: 15px;\n overflow: hidden;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n text-decoration: none;\n color: $primary-text-color;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n\n li:last-child a {\n border-bottom: 0;\n }\n\n li ul {\n padding-left: 20px;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n }\n}\n","$no-columns-breakpoint: 600px;\n\ncode {\n font-family: $font-monospace, monospace;\n font-weight: 400;\n}\n\n.form-container {\n max-width: 400px;\n padding: 20px;\n margin: 0 auto;\n}\n\n.simple_form {\n .input {\n margin-bottom: 15px;\n overflow: hidden;\n\n &.hidden {\n margin: 0;\n }\n\n &.radio_buttons {\n .radio {\n margin-bottom: 15px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .radio > label {\n position: relative;\n padding-left: 28px;\n\n input {\n position: absolute;\n top: -2px;\n left: 0;\n }\n }\n }\n\n &.boolean {\n position: relative;\n margin-bottom: 0;\n\n .label_input > label {\n font-family: inherit;\n font-size: 14px;\n padding-top: 5px;\n color: $primary-text-color;\n display: block;\n width: auto;\n }\n\n .label_input,\n .hint {\n padding-left: 28px;\n }\n\n .label_input__wrapper {\n position: static;\n }\n\n label.checkbox {\n position: absolute;\n top: 2px;\n left: 0;\n }\n\n label a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: none;\n }\n }\n\n .recommended {\n position: absolute;\n margin: 0 4px;\n margin-top: -2px;\n }\n }\n }\n\n .row {\n display: flex;\n margin: 0 -5px;\n\n .input {\n box-sizing: border-box;\n flex: 1 1 auto;\n width: 50%;\n padding: 0 5px;\n }\n }\n\n .hint {\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n }\n\n code {\n border-radius: 3px;\n padding: 0.2em 0.4em;\n background: darken($ui-base-color, 12%);\n }\n\n li {\n list-style: disc;\n margin-left: 18px;\n }\n }\n\n ul.hint {\n margin-bottom: 15px;\n }\n\n span.hint {\n display: block;\n font-size: 12px;\n margin-top: 4px;\n }\n\n p.hint {\n margin-bottom: 15px;\n color: $darker-text-color;\n\n &.subtle-hint {\n text-align: center;\n font-size: 12px;\n line-height: 18px;\n margin-top: 15px;\n margin-bottom: 0;\n }\n }\n\n .card {\n margin-bottom: 15px;\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n .input.with_floating_label {\n .label_input {\n display: flex;\n\n & > label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 500;\n min-width: 150px;\n flex: 0 0 auto;\n }\n\n input,\n select {\n flex: 1 1 auto;\n }\n }\n\n &.select .hint {\n margin-top: 6px;\n margin-left: 150px;\n }\n }\n\n .input.with_label {\n .label_input > label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: block;\n margin-bottom: 8px;\n word-wrap: break-word;\n font-weight: 500;\n }\n\n .hint {\n margin-top: 6px;\n }\n\n ul {\n flex: 390px;\n }\n }\n\n .input.with_block_label {\n max-width: none;\n\n & > label {\n font-family: inherit;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n font-weight: 500;\n padding-top: 5px;\n }\n\n .hint {\n margin-bottom: 15px;\n }\n\n ul {\n columns: 2;\n }\n }\n\n .input.datetime .label_input select {\n display: inline-block;\n width: auto;\n flex: 0;\n }\n\n .required abbr {\n text-decoration: none;\n color: lighten($error-value-color, 12%);\n }\n\n .fields-group {\n margin-bottom: 25px;\n\n .input:last-child {\n margin-bottom: 0;\n }\n }\n\n .fields-row {\n display: flex;\n margin: 0 -10px;\n padding-top: 5px;\n margin-bottom: 25px;\n\n .input {\n max-width: none;\n }\n\n &__column {\n box-sizing: border-box;\n padding: 0 10px;\n flex: 1 1 auto;\n min-height: 1px;\n\n &-6 {\n max-width: 50%;\n }\n\n .actions {\n margin-top: 27px;\n }\n }\n\n .fields-group:last-child,\n .fields-row__column.fields-group {\n margin-bottom: 0;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n margin-bottom: 0;\n\n &__column {\n max-width: none;\n }\n\n .fields-group:last-child,\n .fields-row__column.fields-group,\n .fields-row__column {\n margin-bottom: 25px;\n }\n }\n }\n\n .input.radio_buttons .radio label {\n margin-bottom: 5px;\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: block;\n width: auto;\n }\n\n .check_boxes {\n .checkbox {\n label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: inline-block;\n width: auto;\n position: relative;\n padding-top: 5px;\n padding-left: 25px;\n flex: 1 1 auto;\n }\n\n input[type=checkbox] {\n position: absolute;\n left: 0;\n top: 5px;\n margin: 0;\n }\n }\n }\n\n .input.static .label_input__wrapper {\n font-size: 16px;\n padding: 10px;\n border: 1px solid $dark-text-color;\n border-radius: 4px;\n }\n\n input[type=text],\n input[type=number],\n input[type=email],\n input[type=password],\n textarea {\n box-sizing: border-box;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n width: 100%;\n outline: 0;\n font-family: inherit;\n resize: vertical;\n background: darken($ui-base-color, 10%);\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n padding: 10px;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &:invalid {\n box-shadow: none;\n }\n\n &:focus:invalid:not(:placeholder-shown) {\n border-color: lighten($error-red, 12%);\n }\n\n &:required:valid {\n border-color: $valid-value-color;\n }\n\n &:hover {\n border-color: darken($ui-base-color, 20%);\n }\n\n &:active,\n &:focus {\n border-color: $highlight-text-color;\n background: darken($ui-base-color, 8%);\n }\n }\n\n .input.field_with_errors {\n label {\n color: lighten($error-red, 12%);\n }\n\n input[type=text],\n input[type=number],\n input[type=email],\n input[type=password],\n textarea,\n select {\n border-color: lighten($error-red, 12%);\n }\n\n .error {\n display: block;\n font-weight: 500;\n color: lighten($error-red, 12%);\n margin-top: 4px;\n }\n }\n\n .input.disabled {\n opacity: 0.5;\n }\n\n .actions {\n margin-top: 30px;\n display: flex;\n\n &.actions--top {\n margin-top: 0;\n margin-bottom: 30px;\n }\n }\n\n button,\n .button,\n .block-button {\n display: block;\n width: 100%;\n border: 0;\n border-radius: 4px;\n background: $ui-highlight-color;\n color: $primary-text-color;\n font-size: 18px;\n line-height: inherit;\n height: auto;\n padding: 10px;\n text-transform: uppercase;\n text-decoration: none;\n text-align: center;\n box-sizing: border-box;\n cursor: pointer;\n font-weight: 500;\n outline: 0;\n margin-bottom: 10px;\n margin-right: 10px;\n\n &:last-child {\n margin-right: 0;\n }\n\n &:hover {\n background-color: lighten($ui-highlight-color, 5%);\n }\n\n &:active,\n &:focus {\n background-color: darken($ui-highlight-color, 5%);\n }\n\n &:disabled:hover {\n background-color: $ui-primary-color;\n }\n\n &.negative {\n background: $error-value-color;\n\n &:hover {\n background-color: lighten($error-value-color, 5%);\n }\n\n &:active,\n &:focus {\n background-color: darken($error-value-color, 5%);\n }\n }\n }\n\n select {\n appearance: none;\n box-sizing: border-box;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n width: 100%;\n outline: 0;\n font-family: inherit;\n resize: vertical;\n background: darken($ui-base-color, 10%) url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center / auto 16px;\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n padding-left: 10px;\n padding-right: 30px;\n height: 41px;\n }\n\n h4 {\n margin-bottom: 15px !important;\n }\n\n .label_input {\n &__wrapper {\n position: relative;\n }\n\n &__append {\n position: absolute;\n right: 3px;\n top: 1px;\n padding: 10px;\n padding-bottom: 9px;\n font-size: 16px;\n color: $dark-text-color;\n font-family: inherit;\n pointer-events: none;\n cursor: default;\n max-width: 140px;\n white-space: nowrap;\n overflow: hidden;\n\n &::after {\n content: '';\n display: block;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 1px;\n width: 5px;\n background-image: linear-gradient(to right, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));\n }\n }\n }\n\n &__overlay-area {\n position: relative;\n\n &__blurred form {\n filter: blur(2px);\n }\n\n &__overlay {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n background: rgba($ui-base-color, 0.65);\n border-radius: 4px;\n margin-left: -4px;\n margin-top: -4px;\n padding: 4px;\n\n &__content {\n text-align: center;\n\n &.rich-formatting {\n &,\n p {\n color: $primary-text-color;\n }\n }\n }\n }\n }\n}\n\n.block-icon {\n display: block;\n margin: 0 auto;\n margin-bottom: 10px;\n font-size: 24px;\n}\n\n.flash-message {\n background: lighten($ui-base-color, 8%);\n color: $darker-text-color;\n border-radius: 4px;\n padding: 15px 10px;\n margin-bottom: 30px;\n text-align: center;\n\n &.notice {\n border: 1px solid rgba($valid-value-color, 0.5);\n background: rgba($valid-value-color, 0.25);\n color: $valid-value-color;\n }\n\n &.alert {\n border: 1px solid rgba($error-value-color, 0.5);\n background: rgba($error-value-color, 0.25);\n color: $error-value-color;\n }\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n\n &:hover {\n color: $primary-text-color;\n text-decoration: underline;\n }\n }\n\n p {\n margin-bottom: 15px;\n }\n\n .oauth-code {\n outline: 0;\n box-sizing: border-box;\n display: block;\n width: 100%;\n border: 0;\n padding: 10px;\n font-family: $font-monospace, monospace;\n background: $ui-base-color;\n color: $primary-text-color;\n font-size: 14px;\n margin: 0;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n @media screen and (max-width: 740px) and (min-width: 441px) {\n margin-top: 40px;\n }\n}\n\n.form-footer {\n margin-top: 30px;\n text-align: center;\n\n a {\n color: $darker-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.quick-nav {\n list-style: none;\n margin-bottom: 25px;\n font-size: 14px;\n\n li {\n display: inline-block;\n margin-right: 10px;\n }\n\n a {\n color: $highlight-text-color;\n text-transform: uppercase;\n text-decoration: none;\n font-weight: 700;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($highlight-text-color, 8%);\n }\n }\n}\n\n.oauth-prompt,\n.follow-prompt {\n margin-bottom: 30px;\n color: $darker-text-color;\n\n h2 {\n font-size: 16px;\n margin-bottom: 30px;\n text-align: center;\n }\n\n strong {\n color: $secondary-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n @media screen and (max-width: 740px) and (min-width: 441px) {\n margin-top: 40px;\n }\n}\n\n.qr-wrapper {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n}\n\n.qr-code {\n flex: 0 0 auto;\n background: $simple-background-color;\n padding: 4px;\n margin: 0 10px 20px 0;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n display: inline-block;\n\n svg {\n display: block;\n margin: 0;\n }\n}\n\n.qr-alternative {\n margin-bottom: 20px;\n color: $secondary-text-color;\n flex: 150px;\n\n samp {\n display: block;\n font-size: 14px;\n }\n}\n\n.table-form {\n p {\n margin-bottom: 15px;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n }\n}\n\n.simple_form,\n.table-form {\n .warning {\n box-sizing: border-box;\n background: rgba($error-value-color, 0.5);\n color: $primary-text-color;\n text-shadow: 1px 1px 0 rgba($base-shadow-color, 0.3);\n box-shadow: 0 2px 6px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n padding: 10px;\n margin-bottom: 15px;\n\n a {\n color: $primary-text-color;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n strong {\n font-weight: 600;\n display: block;\n margin-bottom: 5px;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n\n .fa {\n font-weight: 400;\n }\n }\n }\n}\n\n.action-pagination {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n\n .actions,\n .pagination {\n flex: 1 1 auto;\n }\n\n .actions {\n padding: 30px 0;\n padding-right: 20px;\n flex: 0 0 auto;\n }\n}\n\n.post-follow-actions {\n text-align: center;\n color: $darker-text-color;\n\n div {\n margin-bottom: 4px;\n }\n}\n\n.alternative-login {\n margin-top: 20px;\n margin-bottom: 20px;\n\n h4 {\n font-size: 16px;\n color: $primary-text-color;\n text-align: center;\n margin-bottom: 20px;\n border: 0;\n padding: 0;\n }\n\n .button {\n display: block;\n }\n}\n\n.scope-danger {\n color: $warning-red;\n}\n\n.form_admin_settings_site_short_description,\n.form_admin_settings_site_description,\n.form_admin_settings_site_extended_description,\n.form_admin_settings_site_terms,\n.form_admin_settings_custom_css,\n.form_admin_settings_closed_registrations_message {\n textarea {\n font-family: $font-monospace, monospace;\n }\n}\n\n.input-copy {\n background: darken($ui-base-color, 10%);\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n display: flex;\n align-items: center;\n padding-right: 4px;\n position: relative;\n top: 1px;\n transition: border-color 300ms linear;\n\n &__wrapper {\n flex: 1 1 auto;\n }\n\n input[type=text] {\n background: transparent;\n border: 0;\n padding: 10px;\n font-size: 14px;\n font-family: $font-monospace, monospace;\n }\n\n button {\n flex: 0 0 auto;\n margin: 4px;\n text-transform: none;\n font-weight: 400;\n font-size: 14px;\n padding: 7px 18px;\n padding-bottom: 6px;\n width: auto;\n transition: background 300ms linear;\n }\n\n &.copied {\n border-color: $valid-value-color;\n transition: none;\n\n button {\n background: $valid-value-color;\n transition: none;\n }\n }\n}\n\n.connection-prompt {\n margin-bottom: 25px;\n\n .fa-link {\n background-color: darken($ui-base-color, 4%);\n border-radius: 100%;\n font-size: 24px;\n padding: 10px;\n }\n\n &__column {\n align-items: center;\n display: flex;\n flex: 1;\n flex-direction: column;\n flex-shrink: 1;\n max-width: 50%;\n\n &-sep {\n align-self: center;\n flex-grow: 0;\n overflow: visible;\n position: relative;\n z-index: 1;\n }\n\n p {\n word-break: break-word;\n }\n }\n\n .account__avatar {\n margin-bottom: 20px;\n }\n\n &__connection {\n background-color: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n padding: 25px 10px;\n position: relative;\n text-align: center;\n\n &::after {\n background-color: darken($ui-base-color, 4%);\n content: '';\n display: block;\n height: 100%;\n left: 50%;\n position: absolute;\n top: 0;\n width: 1px;\n }\n }\n\n &__row {\n align-items: flex-start;\n display: flex;\n flex-direction: row;\n }\n}\n",".card {\n & > a {\n display: block;\n text-decoration: none;\n color: inherit;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n box-shadow: none;\n }\n\n &:hover,\n &:active,\n &:focus {\n .card__bar {\n background: lighten($ui-base-color, 8%);\n }\n }\n }\n\n &__img {\n height: 130px;\n position: relative;\n background: darken($ui-base-color, 12%);\n border-radius: 4px 4px 0 0;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n object-fit: cover;\n border-radius: 4px 4px 0 0;\n }\n\n @media screen and (max-width: 600px) {\n height: 200px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n\n &__bar {\n position: relative;\n padding: 15px;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n\n .avatar {\n flex: 0 0 auto;\n width: 48px;\n height: 48px;\n padding-top: 2px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n background: darken($ui-base-color, 8%);\n object-fit: cover;\n }\n }\n\n .display-name {\n margin-left: 15px;\n text-align: left;\n\n strong {\n font-size: 15px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n span {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n}\n\n.pagination {\n padding: 30px 0;\n text-align: center;\n overflow: hidden;\n\n a,\n .current,\n .newer,\n .older,\n .page,\n .gap {\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 500;\n display: inline-block;\n padding: 6px 10px;\n text-decoration: none;\n }\n\n .current {\n background: $simple-background-color;\n border-radius: 100px;\n color: $inverted-text-color;\n cursor: default;\n margin: 0 10px;\n }\n\n .gap {\n cursor: default;\n }\n\n .older,\n .newer {\n text-transform: uppercase;\n color: $secondary-text-color;\n }\n\n .older {\n float: left;\n padding-left: 0;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n .newer {\n float: right;\n padding-right: 0;\n\n .fa {\n display: inline-block;\n margin-left: 5px;\n }\n }\n\n .disabled {\n cursor: default;\n color: lighten($inverted-text-color, 10%);\n }\n\n @media screen and (max-width: 700px) {\n padding: 30px 20px;\n\n .page {\n display: none;\n }\n\n .newer,\n .older {\n display: inline-block;\n }\n }\n}\n\n.nothing-here {\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n color: $light-text-color;\n font-size: 14px;\n font-weight: 500;\n text-align: center;\n display: flex;\n justify-content: center;\n align-items: center;\n cursor: default;\n border-radius: 4px;\n padding: 20px;\n min-height: 30vh;\n\n &--under-tabs {\n border-radius: 0 0 4px 4px;\n }\n\n &--flexible {\n box-sizing: border-box;\n min-height: 100%;\n }\n}\n\n.account-role,\n.simple_form .recommended {\n display: inline-block;\n padding: 4px 6px;\n cursor: default;\n border-radius: 3px;\n font-size: 12px;\n line-height: 12px;\n font-weight: 500;\n color: $ui-secondary-color;\n background-color: rgba($ui-secondary-color, 0.1);\n border: 1px solid rgba($ui-secondary-color, 0.5);\n\n &.moderator {\n color: $success-green;\n background-color: rgba($success-green, 0.1);\n border-color: rgba($success-green, 0.5);\n }\n\n &.admin {\n color: lighten($error-red, 12%);\n background-color: rgba(lighten($error-red, 12%), 0.1);\n border-color: rgba(lighten($error-red, 12%), 0.5);\n }\n}\n\n.account__header__fields {\n max-width: 100vw;\n padding: 0;\n margin: 15px -15px -15px;\n border: 0 none;\n border-top: 1px solid lighten($ui-base-color, 12%);\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n font-size: 14px;\n line-height: 20px;\n\n dl {\n display: flex;\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n }\n\n dt,\n dd {\n box-sizing: border-box;\n padding: 14px;\n text-align: center;\n max-height: 48px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n dt {\n font-weight: 500;\n width: 120px;\n flex: 0 0 auto;\n color: $secondary-text-color;\n background: rgba(darken($ui-base-color, 8%), 0.5);\n }\n\n dd {\n flex: 1 1 auto;\n color: $darker-text-color;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n\n .verified {\n border: 1px solid rgba($valid-value-color, 0.5);\n background: rgba($valid-value-color, 0.25);\n\n a {\n color: $valid-value-color;\n font-weight: 500;\n }\n\n &__mark {\n color: $valid-value-color;\n }\n }\n\n dl:last-child {\n border-bottom: 0;\n }\n}\n\n.directory__tag .trends__item__current {\n width: auto;\n}\n\n.pending-account {\n &__header {\n color: $darker-text-color;\n\n a {\n color: $ui-secondary-color;\n text-decoration: none;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n\n strong {\n color: $primary-text-color;\n font-weight: 700;\n }\n }\n\n &__body {\n margin-top: 10px;\n }\n}\n",".activity-stream {\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n overflow: hidden;\n margin-bottom: 10px;\n\n &--under-tabs {\n border-radius: 0 0 4px 4px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n border-radius: 0;\n box-shadow: none;\n }\n\n &--headless {\n border-radius: 0;\n margin: 0;\n box-shadow: none;\n\n .detailed-status,\n .status {\n border-radius: 0 !important;\n }\n }\n\n div[data-component] {\n width: 100%;\n }\n\n .entry {\n background: $ui-base-color;\n\n .detailed-status,\n .status,\n .load-more {\n animation: none;\n }\n\n &:last-child {\n .detailed-status,\n .status,\n .load-more {\n border-bottom: 0;\n border-radius: 0 0 4px 4px;\n }\n }\n\n &:first-child {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 4px 4px 0 0;\n }\n\n &:last-child {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 4px;\n }\n }\n }\n\n @media screen and (max-width: 740px) {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 0 !important;\n }\n }\n }\n\n &--highlighted .entry {\n background: lighten($ui-base-color, 8%);\n }\n}\n\n.button.logo-button {\n flex: 0 auto;\n font-size: 14px;\n background: $ui-highlight-color;\n color: $primary-text-color;\n text-transform: none;\n line-height: 36px;\n height: auto;\n padding: 3px 15px;\n border: 0;\n\n svg {\n width: 20px;\n height: auto;\n vertical-align: middle;\n margin-right: 5px;\n fill: $primary-text-color;\n }\n\n &:active,\n &:focus,\n &:hover {\n background: lighten($ui-highlight-color, 10%);\n }\n\n &:disabled,\n &.disabled {\n &:active,\n &:focus,\n &:hover {\n background: $ui-primary-color;\n }\n }\n\n &.button--destructive {\n &:active,\n &:focus,\n &:hover {\n background: $error-red;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n svg {\n display: none;\n }\n }\n}\n\n.embed,\n.public-layout {\n .detailed-status {\n padding: 15px;\n }\n\n .status {\n padding: 15px 15px 15px (48px + 15px * 2);\n min-height: 48px + 2px;\n\n &__avatar {\n left: 15px;\n top: 17px;\n }\n\n &__content {\n padding-top: 5px;\n }\n\n &__prepend {\n margin-left: 48px + 15px * 2;\n padding-top: 15px;\n }\n\n &__prepend-icon-wrapper {\n left: -32px;\n }\n\n .media-gallery,\n &__action-bar,\n .video-player {\n margin-top: 10px;\n }\n }\n}\n","button.icon-button i.fa-retweet {\n background-image: url(\"data:image/svg+xml;utf8,\");\n\n &:hover {\n background-image: url(\"data:image/svg+xml;utf8,\");\n }\n}\n\nbutton.icon-button.disabled i.fa-retweet {\n background-image: url(\"data:image/svg+xml;utf8,\");\n}\n",".app-body {\n -webkit-overflow-scrolling: touch;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n}\n\n.animated-number {\n display: inline-flex;\n flex-direction: column;\n align-items: stretch;\n overflow: hidden;\n position: relative;\n}\n\n.link-button {\n display: block;\n font-size: 15px;\n line-height: 20px;\n color: $ui-highlight-color;\n border: 0;\n background: transparent;\n padding: 0;\n cursor: pointer;\n\n &:hover,\n &:active {\n text-decoration: underline;\n }\n\n &:disabled {\n color: $ui-primary-color;\n cursor: default;\n }\n}\n\n.button {\n background-color: $ui-highlight-color;\n border: 10px none;\n border-radius: 4px;\n box-sizing: border-box;\n color: $primary-text-color;\n cursor: pointer;\n display: inline-block;\n font-family: inherit;\n font-size: 14px;\n font-weight: 500;\n height: 36px;\n letter-spacing: 0;\n line-height: 36px;\n overflow: hidden;\n padding: 0 16px;\n position: relative;\n text-align: center;\n text-transform: uppercase;\n text-decoration: none;\n text-overflow: ellipsis;\n transition: all 100ms ease-in;\n white-space: nowrap;\n width: auto;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-highlight-color, 10%);\n transition: all 200ms ease-out;\n }\n\n &--destructive {\n transition: none;\n\n &:active,\n &:focus,\n &:hover {\n background-color: $error-red;\n transition: none;\n }\n }\n\n &:disabled,\n &.disabled {\n background-color: $ui-primary-color;\n cursor: default;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &.button-primary,\n &.button-alternative,\n &.button-secondary,\n &.button-alternative-2 {\n font-size: 16px;\n line-height: 36px;\n height: auto;\n text-transform: none;\n padding: 4px 16px;\n }\n\n &.button-alternative {\n color: $inverted-text-color;\n background: $ui-primary-color;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-primary-color, 4%);\n }\n }\n\n &.button-alternative-2 {\n background: $ui-base-lighter-color;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-base-lighter-color, 4%);\n }\n }\n\n &.button-secondary {\n color: $darker-text-color;\n background: transparent;\n padding: 3px 15px;\n border: 1px solid $ui-primary-color;\n\n &:active,\n &:focus,\n &:hover {\n border-color: lighten($ui-primary-color, 4%);\n color: lighten($darker-text-color, 4%);\n }\n\n &:disabled {\n opacity: 0.5;\n }\n }\n\n &.button--block {\n display: block;\n width: 100%;\n }\n}\n\n.column__wrapper {\n display: flex;\n flex: 1 1 auto;\n position: relative;\n}\n\n.icon-button {\n display: inline-block;\n padding: 0;\n color: $action-button-color;\n border: 0;\n border-radius: 4px;\n background: transparent;\n cursor: pointer;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($action-button-color, 7%);\n background-color: rgba($action-button-color, 0.15);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n }\n\n &:focus {\n background-color: rgba($action-button-color, 0.3);\n }\n\n &.disabled {\n color: darken($action-button-color, 13%);\n background-color: transparent;\n cursor: default;\n }\n\n &.active {\n color: $highlight-text-color;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &.inverted {\n color: $lighter-text-color;\n\n &:hover,\n &:active,\n &:focus {\n color: darken($lighter-text-color, 7%);\n background-color: rgba($lighter-text-color, 0.15);\n }\n\n &:focus {\n background-color: rgba($lighter-text-color, 0.3);\n }\n\n &.disabled {\n color: lighten($lighter-text-color, 7%);\n background-color: transparent;\n }\n\n &.active {\n color: $highlight-text-color;\n\n &.disabled {\n color: lighten($highlight-text-color, 13%);\n }\n }\n }\n\n &.overlayed {\n box-sizing: content-box;\n background: rgba($base-overlay-background, 0.6);\n color: rgba($primary-text-color, 0.7);\n border-radius: 4px;\n padding: 2px;\n\n &:hover {\n background: rgba($base-overlay-background, 0.9);\n }\n }\n}\n\n.text-icon-button {\n color: $lighter-text-color;\n border: 0;\n border-radius: 4px;\n background: transparent;\n cursor: pointer;\n font-weight: 600;\n font-size: 11px;\n padding: 0 3px;\n line-height: 27px;\n outline: 0;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &:hover,\n &:active,\n &:focus {\n color: darken($lighter-text-color, 7%);\n background-color: rgba($lighter-text-color, 0.15);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n }\n\n &:focus {\n background-color: rgba($lighter-text-color, 0.3);\n }\n\n &.disabled {\n color: lighten($lighter-text-color, 20%);\n background-color: transparent;\n cursor: default;\n }\n\n &.active {\n color: $highlight-text-color;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n}\n\n.dropdown-menu {\n position: absolute;\n}\n\n.invisible {\n font-size: 0;\n line-height: 0;\n display: inline-block;\n width: 0;\n height: 0;\n position: absolute;\n\n img,\n svg {\n margin: 0 !important;\n border: 0 !important;\n padding: 0 !important;\n width: 0 !important;\n height: 0 !important;\n }\n}\n\n.ellipsis {\n &::after {\n content: \"…\";\n }\n}\n\n.compose-form {\n padding: 10px;\n\n &__sensitive-button {\n padding: 10px;\n padding-top: 0;\n\n font-size: 14px;\n font-weight: 500;\n\n &.active {\n color: $highlight-text-color;\n }\n\n input[type=checkbox] {\n display: none;\n }\n\n .checkbox {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 4px;\n vertical-align: middle;\n\n &.active {\n border-color: $highlight-text-color;\n background: $highlight-text-color;\n }\n }\n }\n\n .compose-form__warning {\n color: $inverted-text-color;\n margin-bottom: 10px;\n background: $ui-primary-color;\n box-shadow: 0 2px 6px rgba($base-shadow-color, 0.3);\n padding: 8px 10px;\n border-radius: 4px;\n font-size: 13px;\n font-weight: 400;\n\n strong {\n color: $inverted-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n color: $lighter-text-color;\n font-weight: 500;\n text-decoration: underline;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: none;\n }\n }\n }\n\n .emoji-picker-dropdown {\n position: absolute;\n top: 0;\n right: 0;\n }\n\n .compose-form__autosuggest-wrapper {\n position: relative;\n }\n\n .autosuggest-textarea,\n .autosuggest-input,\n .spoiler-input {\n position: relative;\n width: 100%;\n }\n\n .spoiler-input {\n height: 0;\n transform-origin: bottom;\n opacity: 0;\n\n &.spoiler-input--visible {\n height: 36px;\n margin-bottom: 11px;\n opacity: 1;\n }\n }\n\n .autosuggest-textarea__textarea,\n .spoiler-input__input {\n display: block;\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n color: $inverted-text-color;\n background: $simple-background-color;\n padding: 10px;\n font-family: inherit;\n font-size: 14px;\n resize: vertical;\n border: 0;\n outline: 0;\n\n &::placeholder {\n color: $dark-text-color;\n }\n\n &:focus {\n outline: 0;\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n .spoiler-input__input {\n border-radius: 4px;\n }\n\n .autosuggest-textarea__textarea {\n min-height: 100px;\n border-radius: 4px 4px 0 0;\n padding-bottom: 0;\n padding-right: 10px + 22px;\n resize: none;\n scrollbar-color: initial;\n\n &::-webkit-scrollbar {\n all: unset;\n }\n\n @media screen and (max-width: 600px) {\n height: 100px !important; // prevent auto-resize textarea\n resize: vertical;\n }\n }\n\n .autosuggest-textarea__suggestions-wrapper {\n position: relative;\n height: 0;\n }\n\n .autosuggest-textarea__suggestions {\n box-sizing: border-box;\n display: none;\n position: absolute;\n top: 100%;\n width: 100%;\n z-index: 99;\n box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4);\n background: $ui-secondary-color;\n border-radius: 0 0 4px 4px;\n color: $inverted-text-color;\n font-size: 14px;\n padding: 6px;\n\n &.autosuggest-textarea__suggestions--visible {\n display: block;\n }\n }\n\n .autosuggest-textarea__suggestions__item {\n padding: 10px;\n cursor: pointer;\n border-radius: 4px;\n\n &:hover,\n &:focus,\n &:active,\n &.selected {\n background: darken($ui-secondary-color, 10%);\n }\n }\n\n .autosuggest-account,\n .autosuggest-emoji,\n .autosuggest-hashtag {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: flex-start;\n line-height: 18px;\n font-size: 14px;\n }\n\n .autosuggest-hashtag {\n justify-content: space-between;\n\n &__name {\n flex: 1 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n strong {\n font-weight: 500;\n }\n\n &__uses {\n flex: 0 0 auto;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n }\n\n .autosuggest-account-icon,\n .autosuggest-emoji img {\n display: block;\n margin-right: 8px;\n width: 16px;\n height: 16px;\n }\n\n .autosuggest-account .display-name__account {\n color: $lighter-text-color;\n }\n\n .compose-form__modifiers {\n color: $inverted-text-color;\n font-family: inherit;\n font-size: 14px;\n background: $simple-background-color;\n\n .compose-form__upload-wrapper {\n overflow: hidden;\n }\n\n .compose-form__uploads-wrapper {\n display: flex;\n flex-direction: row;\n padding: 5px;\n flex-wrap: wrap;\n }\n\n .compose-form__upload {\n flex: 1 1 0;\n min-width: 40%;\n margin: 5px;\n\n &__actions {\n background: linear-gradient(180deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n opacity: 0;\n transition: opacity .1s ease;\n\n .icon-button {\n flex: 0 1 auto;\n color: $secondary-text-color;\n font-size: 14px;\n font-weight: 500;\n padding: 10px;\n font-family: inherit;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($secondary-text-color, 7%);\n }\n }\n\n &.active {\n opacity: 1;\n }\n }\n\n &-description {\n position: absolute;\n z-index: 2;\n bottom: 0;\n left: 0;\n right: 0;\n box-sizing: border-box;\n background: linear-gradient(0deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);\n padding: 10px;\n opacity: 0;\n transition: opacity .1s ease;\n\n textarea {\n background: transparent;\n color: $secondary-text-color;\n border: 0;\n padding: 0;\n margin: 0;\n width: 100%;\n font-family: inherit;\n font-size: 14px;\n font-weight: 500;\n\n &:focus {\n color: $white;\n }\n\n &::placeholder {\n opacity: 0.75;\n color: $secondary-text-color;\n }\n }\n\n &.active {\n opacity: 1;\n }\n }\n }\n\n .compose-form__upload-thumbnail {\n border-radius: 4px;\n background-color: $base-shadow-color;\n background-position: center;\n background-size: cover;\n background-repeat: no-repeat;\n height: 140px;\n width: 100%;\n overflow: hidden;\n }\n }\n\n .compose-form__buttons-wrapper {\n padding: 10px;\n background: darken($simple-background-color, 8%);\n border-radius: 0 0 4px 4px;\n display: flex;\n justify-content: space-between;\n flex: 0 0 auto;\n\n .compose-form__buttons {\n display: flex;\n\n .compose-form__upload-button-icon {\n line-height: 27px;\n }\n\n .compose-form__sensitive-button {\n display: none;\n\n &.compose-form__sensitive-button--visible {\n display: block;\n }\n\n .compose-form__sensitive-button__icon {\n line-height: 27px;\n }\n }\n }\n\n .icon-button,\n .text-icon-button {\n box-sizing: content-box;\n padding: 0 3px;\n }\n\n .character-counter__wrapper {\n align-self: center;\n margin-right: 4px;\n }\n }\n\n .compose-form__publish {\n display: flex;\n justify-content: flex-end;\n min-width: 0;\n flex: 0 0 auto;\n\n .compose-form__publish-button-wrapper {\n overflow: hidden;\n padding-top: 10px;\n }\n }\n}\n\n.character-counter {\n cursor: default;\n font-family: $font-sans-serif, sans-serif;\n font-size: 14px;\n font-weight: 600;\n color: $lighter-text-color;\n\n &.character-counter--over {\n color: $warning-red;\n }\n}\n\n.no-reduce-motion .spoiler-input {\n transition: height 0.4s ease, opacity 0.4s ease;\n}\n\n.emojione {\n font-size: inherit;\n vertical-align: middle;\n object-fit: contain;\n margin: -.2ex .15em .2ex;\n width: 16px;\n height: 16px;\n\n img {\n width: auto;\n }\n}\n\n.reply-indicator {\n border-radius: 4px;\n margin-bottom: 10px;\n background: $ui-primary-color;\n padding: 10px;\n min-height: 23px;\n overflow-y: auto;\n flex: 0 2 auto;\n}\n\n.reply-indicator__header {\n margin-bottom: 5px;\n overflow: hidden;\n}\n\n.reply-indicator__cancel {\n float: right;\n line-height: 24px;\n}\n\n.reply-indicator__display-name {\n color: $inverted-text-color;\n display: block;\n max-width: 100%;\n line-height: 24px;\n overflow: hidden;\n padding-right: 25px;\n text-decoration: none;\n}\n\n.reply-indicator__display-avatar {\n float: left;\n margin-right: 5px;\n}\n\n.status__content--with-action {\n cursor: pointer;\n}\n\n.status__content,\n.reply-indicator__content {\n position: relative;\n font-size: 15px;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n padding-top: 2px;\n color: $primary-text-color;\n\n &:focus {\n outline: 0;\n }\n\n &.status__content--with-spoiler {\n white-space: normal;\n\n .status__content__text {\n white-space: pre-wrap;\n }\n }\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n img {\n max-width: 100%;\n max-height: 400px;\n object-fit: contain;\n }\n\n p {\n margin-bottom: 20px;\n white-space: pre-wrap;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: $pleroma-links;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n\n .fa {\n color: lighten($dark-text-color, 7%);\n }\n }\n\n &.mention {\n &:hover {\n text-decoration: none;\n\n span {\n text-decoration: underline;\n }\n }\n }\n\n .fa {\n color: $dark-text-color;\n }\n }\n\n a.unhandled-link {\n color: lighten($ui-highlight-color, 8%);\n }\n\n .status__content__spoiler-link {\n background: $action-button-color;\n\n &:hover {\n background: lighten($action-button-color, 7%);\n text-decoration: none;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n\n .status__content__text {\n display: none;\n\n &.status__content__text--visible {\n display: block;\n }\n }\n}\n\n.announcements__item__content {\n word-wrap: break-word;\n overflow-y: auto;\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n p {\n margin-bottom: 10px;\n white-space: pre-wrap;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: $secondary-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n\n &.mention {\n &:hover {\n text-decoration: none;\n\n span {\n text-decoration: underline;\n }\n }\n }\n\n &.unhandled-link {\n color: lighten($ui-highlight-color, 8%);\n }\n }\n}\n\n.status__content.status__content--collapsed {\n max-height: 20px * 15; // 15 lines is roughly above 500 characters\n}\n\n.status__content__read-more-button {\n display: block;\n font-size: 15px;\n line-height: 20px;\n color: lighten($ui-highlight-color, 8%);\n border: 0;\n background: transparent;\n padding: 0;\n padding-top: 8px;\n text-decoration: none;\n\n &:hover,\n &:active {\n text-decoration: underline;\n }\n}\n\n.status__content__spoiler-link {\n display: inline-block;\n border-radius: 2px;\n background: transparent;\n border: 0;\n color: $inverted-text-color;\n font-weight: 700;\n font-size: 11px;\n padding: 0 6px;\n text-transform: uppercase;\n line-height: 20px;\n cursor: pointer;\n vertical-align: middle;\n}\n\n.status__wrapper--filtered {\n color: $dark-text-color;\n border: 0;\n font-size: inherit;\n text-align: center;\n line-height: inherit;\n margin: 0;\n padding: 15px;\n box-sizing: border-box;\n width: 100%;\n clear: both;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n}\n\n.status__prepend-icon-wrapper {\n left: -26px;\n position: absolute;\n}\n\n.focusable {\n &:focus {\n outline: 0;\n background: lighten($ui-base-color, 4%);\n\n .status.status-direct {\n background: lighten($ui-base-color, 12%);\n\n &.muted {\n background: transparent;\n }\n }\n\n .detailed-status,\n .detailed-status__action-bar {\n background: lighten($ui-base-color, 8%);\n }\n }\n}\n\n.status {\n padding: 8px 10px;\n padding-left: 68px;\n position: relative;\n min-height: 54px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n\n @supports (-ms-overflow-style: -ms-autohiding-scrollbar) {\n // Add margin to avoid Edge auto-hiding scrollbar appearing over content.\n // On Edge 16 this is 16px and Edge <=15 it's 12px, so aim for 16px.\n padding-right: 26px; // 10px + 16px\n }\n\n @keyframes fade {\n 0% { opacity: 0; }\n 100% { opacity: 1; }\n }\n\n opacity: 1;\n animation: fade 150ms linear;\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n }\n\n &.status-direct:not(.read) {\n background: lighten($ui-base-color, 8%);\n border-bottom-color: lighten($ui-base-color, 12%);\n }\n\n &.light {\n .status__relative-time {\n color: $light-text-color;\n }\n\n .status__display-name {\n color: $inverted-text-color;\n }\n\n .display-name {\n color: $light-text-color;\n\n strong {\n color: $inverted-text-color;\n }\n }\n\n .status__content {\n color: $inverted-text-color;\n\n a {\n color: $highlight-text-color;\n }\n\n a.status__content__spoiler-link {\n color: $primary-text-color;\n background: $ui-primary-color;\n\n &:hover {\n background: lighten($ui-primary-color, 8%);\n }\n }\n }\n }\n}\n\n.notification-favourite {\n .status.status-direct {\n background: transparent;\n\n .icon-button.disabled {\n color: lighten($action-button-color, 13%);\n }\n }\n}\n\n.status__relative-time,\n.notification__relative_time {\n color: $dark-text-color;\n float: right;\n font-size: 14px;\n}\n\n.status__display-name {\n color: $dark-text-color;\n}\n\n.status__info .status__display-name {\n display: block;\n max-width: 100%;\n padding-right: 25px;\n}\n\n.status__info {\n font-size: 15px;\n}\n\n.status-check-box {\n border-bottom: 1px solid $ui-secondary-color;\n display: flex;\n\n .status-check-box__status {\n margin: 10px 0 10px 10px;\n flex: 1;\n overflow: hidden;\n\n .media-gallery {\n max-width: 250px;\n }\n\n .status__content {\n padding: 0;\n white-space: normal;\n }\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n max-width: 250px;\n }\n\n .media-gallery__item-thumbnail {\n cursor: default;\n }\n }\n}\n\n.status-check-box-toggle {\n align-items: center;\n display: flex;\n flex: 0 0 auto;\n justify-content: center;\n padding: 10px;\n}\n\n.status__prepend {\n margin-left: 68px;\n color: $dark-text-color;\n padding: 8px 0;\n padding-bottom: 2px;\n font-size: 14px;\n position: relative;\n\n .status__display-name strong {\n color: $dark-text-color;\n }\n\n > span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.status__action-bar {\n align-items: center;\n display: flex;\n margin-top: 8px;\n\n &__counter {\n display: inline-flex;\n margin-right: 11px;\n align-items: center;\n\n .status__action-bar-button {\n margin-right: 4px;\n }\n\n &__label {\n display: inline-block;\n width: 14px;\n font-size: 12px;\n font-weight: 500;\n color: $action-button-color;\n }\n }\n}\n\n.status__action-bar-button {\n margin-right: 18px;\n}\n\n.status__action-bar-dropdown {\n height: 23.15px;\n width: 23.15px;\n}\n\n.detailed-status__action-bar-dropdown {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n}\n\n.detailed-status {\n background: lighten($ui-base-color, 4%);\n padding: 14px 10px;\n\n &--flex {\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n align-items: flex-start;\n\n .status__content,\n .detailed-status__meta {\n flex: 100%;\n }\n }\n\n .status__content {\n font-size: 19px;\n line-height: 24px;\n\n .emojione {\n width: 24px;\n height: 24px;\n margin: -1px 0 0;\n }\n\n .status__content__spoiler-link {\n line-height: 24px;\n margin: -1px 0 0;\n }\n }\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n }\n}\n\n.detailed-status__meta {\n margin-top: 15px;\n color: $dark-text-color;\n font-size: 14px;\n line-height: 18px;\n}\n\n.detailed-status__action-bar {\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: row;\n padding: 10px 0;\n}\n\n.detailed-status__link {\n color: inherit;\n text-decoration: none;\n}\n\n.detailed-status__favorites,\n.detailed-status__reblogs {\n display: inline-block;\n font-weight: 500;\n font-size: 12px;\n margin-left: 6px;\n}\n\n.reply-indicator__content {\n color: $inverted-text-color;\n font-size: 14px;\n\n a {\n color: $lighter-text-color;\n }\n}\n\n.domain {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n .domain__domain-name {\n flex: 1 1 auto;\n display: block;\n color: $primary-text-color;\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n }\n}\n\n.domain__wrapper {\n display: flex;\n}\n\n.domain_buttons {\n height: 18px;\n padding: 10px;\n white-space: nowrap;\n}\n\n.account {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &.compact {\n padding: 0;\n border-bottom: 0;\n\n .account__avatar-wrapper {\n margin-left: 0;\n }\n }\n\n .account__display-name {\n flex: 1 1 auto;\n display: block;\n color: $darker-text-color;\n overflow: hidden;\n text-decoration: none;\n font-size: 14px;\n }\n}\n\n.account__wrapper {\n display: flex;\n}\n\n.account__avatar-wrapper {\n float: left;\n margin-left: 12px;\n margin-right: 12px;\n}\n\n.account__avatar {\n @include avatar-radius;\n position: relative;\n\n &-inline {\n display: inline-block;\n vertical-align: middle;\n margin-right: 5px;\n }\n\n &-composite {\n @include avatar-radius;\n border-radius: 50%;\n overflow: hidden;\n position: relative;\n\n & > div {\n float: left;\n position: relative;\n box-sizing: border-box;\n }\n\n &__label {\n display: block;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n color: $primary-text-color;\n text-shadow: 1px 1px 2px $base-shadow-color;\n font-weight: 700;\n font-size: 15px;\n }\n }\n}\n\na .account__avatar {\n cursor: pointer;\n}\n\n.account__avatar-overlay {\n @include avatar-size(48px);\n\n &-base {\n @include avatar-radius;\n @include avatar-size(36px);\n }\n\n &-overlay {\n @include avatar-radius;\n @include avatar-size(24px);\n\n position: absolute;\n bottom: 0;\n right: 0;\n z-index: 1;\n }\n}\n\n.account__relationship {\n height: 18px;\n padding: 10px;\n white-space: nowrap;\n}\n\n.account__disclaimer {\n padding: 10px;\n border-top: 1px solid lighten($ui-base-color, 8%);\n color: $dark-text-color;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n font-weight: 500;\n color: inherit;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n}\n\n.account__action-bar {\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n line-height: 36px;\n overflow: hidden;\n flex: 0 0 auto;\n display: flex;\n}\n\n.account__action-bar-dropdown {\n padding: 10px;\n\n .icon-button {\n vertical-align: middle;\n }\n\n .dropdown--active {\n .dropdown__content.dropdown__right {\n left: 6px;\n right: initial;\n }\n\n &::after {\n bottom: initial;\n margin-left: 11px;\n margin-top: -7px;\n right: initial;\n }\n }\n}\n\n.account__action-bar-links {\n display: flex;\n flex: 1 1 auto;\n line-height: 18px;\n text-align: center;\n}\n\n.account__action-bar__tab {\n text-decoration: none;\n overflow: hidden;\n flex: 0 1 100%;\n border-right: 1px solid lighten($ui-base-color, 8%);\n padding: 10px 0;\n border-bottom: 4px solid transparent;\n\n &.active {\n border-bottom: 4px solid $ui-highlight-color;\n }\n\n & > span {\n display: block;\n text-transform: uppercase;\n font-size: 11px;\n color: $darker-text-color;\n }\n\n strong {\n display: block;\n font-size: 15px;\n font-weight: 500;\n color: $primary-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n}\n\n.account-authorize {\n padding: 14px 10px;\n\n .detailed-status__display-name {\n display: block;\n margin-bottom: 15px;\n overflow: hidden;\n }\n}\n\n.account-authorize__avatar {\n float: left;\n margin-right: 10px;\n}\n\n.status__display-name,\n.status__relative-time,\n.detailed-status__display-name,\n.detailed-status__datetime,\n.detailed-status__application,\n.account__display-name {\n text-decoration: none;\n}\n\n.status__display-name,\n.account__display-name {\n strong {\n color: $primary-text-color;\n }\n}\n\n.muted {\n .emojione {\n opacity: 0.5;\n }\n}\n\n.status__display-name,\n.reply-indicator__display-name,\n.detailed-status__display-name,\na.account__display-name {\n &:hover strong {\n text-decoration: underline;\n }\n}\n\n.account__display-name strong {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.detailed-status__application,\n.detailed-status__datetime {\n color: inherit;\n}\n\n.detailed-status .button.logo-button {\n margin-bottom: 15px;\n}\n\n.detailed-status__display-name {\n color: $secondary-text-color;\n display: block;\n line-height: 24px;\n margin-bottom: 15px;\n overflow: hidden;\n\n strong,\n span {\n display: block;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n strong {\n font-size: 16px;\n color: $primary-text-color;\n }\n}\n\n.detailed-status__display-avatar {\n float: left;\n margin-right: 10px;\n}\n\n.status__avatar {\n height: 48px;\n left: 10px;\n position: absolute;\n top: 10px;\n width: 48px;\n}\n\n.status__expand {\n width: 68px;\n position: absolute;\n left: 0;\n top: 0;\n height: 100%;\n cursor: pointer;\n}\n\n.muted {\n .status__content,\n .status__content p,\n .status__content a {\n color: $dark-text-color;\n }\n\n .status__display-name strong {\n color: $dark-text-color;\n }\n\n .status__avatar {\n opacity: 0.5;\n }\n\n a.status__content__spoiler-link {\n background: $ui-base-lighter-color;\n color: $inverted-text-color;\n\n &:hover {\n background: lighten($ui-base-lighter-color, 7%);\n text-decoration: none;\n }\n }\n}\n\n.notification__message {\n margin: 0 10px 0 68px;\n padding: 8px 0 0;\n cursor: default;\n color: $darker-text-color;\n font-size: 15px;\n line-height: 22px;\n position: relative;\n\n .fa {\n color: $highlight-text-color;\n }\n\n > span {\n display: inline;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.notification__favourite-icon-wrapper {\n left: -26px;\n position: absolute;\n\n .star-icon {\n color: $gold-star;\n }\n}\n\n.star-icon.active {\n color: $gold-star;\n}\n\n.bookmark-icon.active {\n color: $red-bookmark;\n}\n\n.no-reduce-motion .icon-button.star-icon {\n &.activate {\n & > .fa-star {\n animation: spring-rotate-in 1s linear;\n }\n }\n\n &.deactivate {\n & > .fa-star {\n animation: spring-rotate-out 1s linear;\n }\n }\n}\n\n.notification__display-name {\n color: inherit;\n font-weight: 500;\n text-decoration: none;\n\n &:hover {\n color: $primary-text-color;\n text-decoration: underline;\n }\n}\n\n.notification__relative_time {\n float: right;\n}\n\n.display-name {\n display: block;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.display-name__html {\n font-weight: 500;\n}\n\n.display-name__account {\n font-size: 14px;\n}\n\n.status__relative-time,\n.detailed-status__datetime {\n &:hover {\n text-decoration: underline;\n }\n}\n\n.image-loader {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n\n .image-loader__preview-canvas {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n background: url('~images/void.png') repeat;\n object-fit: contain;\n }\n\n .loading-bar {\n position: relative;\n }\n\n &.image-loader--amorphous .image-loader__preview-canvas {\n display: none;\n }\n}\n\n.zoomable-image {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n img {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n width: auto;\n height: auto;\n object-fit: contain;\n }\n}\n\n.navigation-bar {\n padding: 10px;\n display: flex;\n align-items: center;\n flex-shrink: 0;\n cursor: default;\n color: $darker-text-color;\n\n strong {\n color: $secondary-text-color;\n }\n\n a {\n color: inherit;\n }\n\n .permalink {\n text-decoration: none;\n }\n\n .navigation-bar__actions {\n position: relative;\n\n .icon-button.close {\n position: absolute;\n pointer-events: none;\n transform: scale(0, 1) translate(-100%, 0);\n opacity: 0;\n }\n\n .compose__action-bar .icon-button {\n pointer-events: auto;\n transform: scale(1, 1) translate(0, 0);\n opacity: 1;\n }\n }\n}\n\n.navigation-bar__profile {\n flex: 1 1 auto;\n margin-left: 8px;\n line-height: 20px;\n margin-top: -1px;\n overflow: hidden;\n}\n\n.navigation-bar__profile-account {\n display: block;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.navigation-bar__profile-edit {\n color: inherit;\n text-decoration: none;\n}\n\n.dropdown {\n display: inline-block;\n}\n\n.dropdown__content {\n display: none;\n position: absolute;\n}\n\n.dropdown-menu__separator {\n border-bottom: 1px solid darken($ui-secondary-color, 8%);\n margin: 5px 7px 6px;\n height: 0;\n}\n\n.dropdown-menu {\n background: $ui-secondary-color;\n padding: 4px 0;\n border-radius: 4px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n z-index: 9999;\n\n ul {\n list-style: none;\n }\n\n &.left {\n transform-origin: 100% 50%;\n }\n\n &.top {\n transform-origin: 50% 100%;\n }\n\n &.bottom {\n transform-origin: 50% 0;\n }\n\n &.right {\n transform-origin: 0 50%;\n }\n}\n\n.dropdown-menu__arrow {\n position: absolute;\n width: 0;\n height: 0;\n border: 0 solid transparent;\n\n &.left {\n right: -5px;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: $ui-secondary-color;\n }\n\n &.top {\n bottom: -5px;\n margin-left: -7px;\n border-width: 5px 7px 0;\n border-top-color: $ui-secondary-color;\n }\n\n &.bottom {\n top: -5px;\n margin-left: -7px;\n border-width: 0 7px 5px;\n border-bottom-color: $ui-secondary-color;\n }\n\n &.right {\n left: -5px;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: $ui-secondary-color;\n }\n}\n\n.dropdown-menu__item {\n a {\n font-size: 13px;\n line-height: 18px;\n display: block;\n padding: 4px 14px;\n box-sizing: border-box;\n text-decoration: none;\n background: $ui-secondary-color;\n color: $inverted-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:focus,\n &:hover,\n &:active {\n background: $ui-highlight-color;\n color: $secondary-text-color;\n outline: 0;\n }\n }\n}\n\n.dropdown--active .dropdown__content {\n display: block;\n line-height: 18px;\n max-width: 311px;\n right: 0;\n text-align: left;\n z-index: 9999;\n\n & > ul {\n list-style: none;\n background: $ui-secondary-color;\n padding: 4px 0;\n border-radius: 4px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.4);\n min-width: 140px;\n position: relative;\n }\n\n &.dropdown__right {\n right: 0;\n }\n\n &.dropdown__left {\n & > ul {\n left: -98px;\n }\n }\n\n & > ul > li > a {\n font-size: 13px;\n line-height: 18px;\n display: block;\n padding: 4px 14px;\n box-sizing: border-box;\n text-decoration: none;\n background: $ui-secondary-color;\n color: $inverted-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:focus {\n outline: 0;\n }\n\n &:hover {\n background: $ui-highlight-color;\n color: $secondary-text-color;\n }\n }\n}\n\n.dropdown__icon {\n vertical-align: middle;\n}\n\n.columns-area {\n display: flex;\n flex: 1 1 auto;\n flex-direction: row;\n justify-content: flex-start;\n overflow-x: auto;\n position: relative;\n\n &.unscrollable {\n overflow-x: hidden;\n }\n\n &__panels {\n display: flex;\n justify-content: center;\n width: 100%;\n height: 100%;\n min-height: 100vh;\n\n &__pane {\n height: 100%;\n overflow: hidden;\n pointer-events: none;\n display: flex;\n justify-content: flex-end;\n min-width: 285px;\n\n &--start {\n justify-content: flex-start;\n }\n\n &__inner {\n position: fixed;\n width: 285px;\n pointer-events: auto;\n height: 100%;\n }\n }\n\n &__main {\n box-sizing: border-box;\n width: 100%;\n max-width: 600px;\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding: 0 10px;\n }\n }\n }\n}\n\n.tabs-bar__wrapper {\n background: darken($ui-base-color, 8%);\n position: sticky;\n top: 0;\n z-index: 2;\n padding-top: 0;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding-top: 10px;\n }\n\n .tabs-bar {\n margin-bottom: 0;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n margin-bottom: 10px;\n }\n }\n}\n\n.react-swipeable-view-container {\n &,\n .columns-area,\n .drawer,\n .column {\n height: 100%;\n }\n}\n\n.react-swipeable-view-container > * {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n}\n\n.column {\n width: 350px;\n position: relative;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n\n > .scrollable {\n background: $ui-base-color;\n border-bottom-left-radius: 2px;\n border-bottom-right-radius: 2px;\n }\n}\n\n.ui {\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n}\n\n.drawer {\n width: 330px;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n overflow-y: hidden;\n}\n\n.drawer__tab {\n display: block;\n flex: 1 1 auto;\n padding: 15px 5px 13px;\n color: $darker-text-color;\n text-decoration: none;\n text-align: center;\n font-size: 16px;\n border-bottom: 2px solid transparent;\n}\n\n.column,\n.drawer {\n flex: 1 1 auto;\n overflow: hidden;\n}\n\n@media screen and (min-width: 631px) {\n .columns-area {\n padding: 0;\n }\n\n .column,\n .drawer {\n flex: 0 0 auto;\n padding: 10px;\n padding-left: 5px;\n padding-right: 5px;\n\n &:first-child {\n padding-left: 10px;\n }\n\n &:last-child {\n padding-right: 10px;\n }\n }\n\n .columns-area > div {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n }\n }\n}\n\n.tabs-bar {\n box-sizing: border-box;\n display: flex;\n background: lighten($ui-base-color, 8%);\n flex: 0 0 auto;\n overflow-y: auto;\n}\n\n.tabs-bar__link {\n display: block;\n flex: 1 1 auto;\n padding: 15px 10px;\n padding-bottom: 13px;\n color: $primary-text-color;\n text-decoration: none;\n text-align: center;\n font-size: 14px;\n font-weight: 500;\n border-bottom: 2px solid lighten($ui-base-color, 8%);\n transition: all 50ms linear;\n transition-property: border-bottom, background, color;\n\n .fa {\n font-weight: 400;\n font-size: 16px;\n }\n\n &:hover,\n &:focus,\n &:active {\n @media screen and (min-width: 631px) {\n background: lighten($ui-base-color, 14%);\n border-bottom-color: lighten($ui-base-color, 14%);\n }\n }\n\n &.active {\n border-bottom: 2px solid $highlight-text-color;\n color: $highlight-text-color;\n }\n\n span {\n margin-left: 5px;\n display: none;\n }\n}\n\n@media screen and (min-width: 600px) {\n .tabs-bar__link {\n span {\n display: inline;\n }\n }\n}\n\n.columns-area--mobile {\n flex-direction: column;\n width: 100%;\n height: 100%;\n margin: 0 auto;\n\n .column,\n .drawer {\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .directory__list {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: block;\n }\n }\n\n .directory__card {\n margin-bottom: 0;\n }\n\n .filter-form {\n display: flex;\n }\n\n .autosuggest-textarea__textarea {\n font-size: 16px;\n }\n\n .search__input {\n line-height: 18px;\n font-size: 16px;\n padding: 15px;\n padding-right: 30px;\n }\n\n .search__icon .fa {\n top: 15px;\n }\n\n .scrollable {\n overflow: visible;\n\n @supports(display: grid) {\n contain: content;\n }\n }\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding: 10px 0;\n padding-top: 0;\n }\n\n @media screen and (min-width: 630px) {\n .detailed-status {\n padding: 15px;\n\n .media-gallery,\n .video-player,\n .audio-player {\n margin-top: 15px;\n }\n }\n\n .account__header__bar {\n padding: 5px 10px;\n }\n\n .navigation-bar,\n .compose-form {\n padding: 15px;\n }\n\n .compose-form .compose-form__publish .compose-form__publish-button-wrapper {\n padding-top: 15px;\n }\n\n .status {\n padding: 15px 15px 15px (48px + 15px * 2);\n min-height: 48px + 2px;\n\n &__avatar {\n left: 15px;\n top: 17px;\n }\n\n &__content {\n padding-top: 5px;\n }\n\n &__prepend {\n margin-left: 48px + 15px * 2;\n padding-top: 15px;\n }\n\n &__prepend-icon-wrapper {\n left: -32px;\n }\n\n .media-gallery,\n &__action-bar,\n .video-player,\n .audio-player {\n margin-top: 10px;\n }\n }\n\n .account {\n padding: 15px 10px;\n\n &__header__bio {\n margin: 0 -10px;\n }\n }\n\n .notification {\n &__message {\n margin-left: 48px + 15px * 2;\n padding-top: 15px;\n }\n\n &__favourite-icon-wrapper {\n left: -32px;\n }\n\n .status {\n padding-top: 8px;\n }\n\n .account {\n padding-top: 8px;\n }\n\n .account__avatar-wrapper {\n margin-left: 17px;\n margin-right: 15px;\n }\n }\n }\n}\n\n.floating-action-button {\n position: fixed;\n display: flex;\n justify-content: center;\n align-items: center;\n width: 3.9375rem;\n height: 3.9375rem;\n bottom: 1.3125rem;\n right: 1.3125rem;\n background: darken($ui-highlight-color, 3%);\n color: $white;\n border-radius: 50%;\n font-size: 21px;\n line-height: 21px;\n text-decoration: none;\n box-shadow: 2px 3px 9px rgba($base-shadow-color, 0.4);\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-highlight-color, 7%);\n }\n}\n\n@media screen and (min-width: $no-gap-breakpoint) {\n .tabs-bar {\n width: 100%;\n }\n\n .react-swipeable-view-container .columns-area--mobile {\n height: calc(100% - 10px) !important;\n }\n\n .getting-started__wrapper,\n .getting-started__trends,\n .search {\n margin-bottom: 10px;\n }\n\n .getting-started__panel {\n margin: 10px 0;\n }\n\n .column,\n .drawer {\n min-width: 330px;\n }\n}\n\n@media screen and (max-width: 600px + (285px * 1) + (10px * 1)) {\n .columns-area__panels__pane--compositional {\n display: none;\n }\n}\n\n@media screen and (min-width: 600px + (285px * 1) + (10px * 1)) {\n .floating-action-button,\n .tabs-bar__link.optional {\n display: none;\n }\n\n .search-page .search {\n display: none;\n }\n}\n\n@media screen and (max-width: 600px + (285px * 2) + (10px * 2)) {\n .columns-area__panels__pane--navigational {\n display: none;\n }\n}\n\n@media screen and (min-width: 600px + (285px * 2) + (10px * 2)) {\n .tabs-bar {\n display: none;\n }\n}\n\n.icon-with-badge {\n position: relative;\n\n &__badge {\n position: absolute;\n left: 9px;\n top: -13px;\n background: $ui-highlight-color;\n border: 2px solid lighten($ui-base-color, 8%);\n padding: 1px 6px;\n border-radius: 6px;\n font-size: 10px;\n font-weight: 500;\n line-height: 14px;\n color: $primary-text-color;\n }\n}\n\n.column-link--transparent .icon-with-badge__badge {\n border-color: darken($ui-base-color, 8%);\n}\n\n.compose-panel {\n width: 285px;\n margin-top: 10px;\n display: flex;\n flex-direction: column;\n height: calc(100% - 10px);\n overflow-y: hidden;\n\n .navigation-bar {\n padding-top: 20px;\n padding-bottom: 20px;\n flex: 0 1 48px;\n min-height: 20px;\n }\n\n .flex-spacer {\n background: transparent;\n }\n\n .compose-form {\n flex: 1;\n overflow-y: hidden;\n display: flex;\n flex-direction: column;\n min-height: 310px;\n padding-bottom: 71px;\n margin-bottom: -71px;\n }\n\n .compose-form__autosuggest-wrapper {\n overflow-y: auto;\n background-color: $white;\n border-radius: 4px 4px 0 0;\n flex: 0 1 auto;\n }\n\n .autosuggest-textarea__textarea {\n overflow-y: hidden;\n }\n\n .compose-form__upload-thumbnail {\n height: 80px;\n }\n}\n\n.navigation-panel {\n margin-top: 10px;\n margin-bottom: 10px;\n height: calc(100% - 20px);\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n\n & > a {\n flex: 0 0 auto;\n }\n\n hr {\n flex: 0 0 auto;\n border: 0;\n background: transparent;\n border-top: 1px solid lighten($ui-base-color, 4%);\n margin: 10px 0;\n }\n\n .flex-spacer {\n background: transparent;\n }\n}\n\n.drawer__pager {\n box-sizing: border-box;\n padding: 0;\n flex-grow: 1;\n position: relative;\n overflow: hidden;\n display: flex;\n}\n\n.drawer__inner {\n position: absolute;\n top: 0;\n left: 0;\n background: lighten($ui-base-color, 13%);\n box-sizing: border-box;\n padding: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n overflow-y: auto;\n width: 100%;\n height: 100%;\n border-radius: 2px;\n\n &.darker {\n background: $ui-base-color;\n }\n}\n\n.drawer__inner__mastodon {\n background: lighten($ui-base-color, 13%) url('data:image/svg+xml;utf8,') no-repeat bottom / 100% auto;\n flex: 1;\n min-height: 47px;\n display: none;\n\n > img {\n display: block;\n object-fit: contain;\n object-position: bottom left;\n width: 85%;\n height: 100%;\n pointer-events: none;\n user-drag: none;\n user-select: none;\n }\n\n @media screen and (min-height: 640px) {\n display: block;\n }\n}\n\n.pseudo-drawer {\n background: lighten($ui-base-color, 13%);\n font-size: 13px;\n text-align: left;\n}\n\n.drawer__header {\n flex: 0 0 auto;\n font-size: 16px;\n background: lighten($ui-base-color, 8%);\n margin-bottom: 10px;\n display: flex;\n flex-direction: row;\n border-radius: 2px;\n\n a {\n transition: background 100ms ease-in;\n\n &:hover {\n background: lighten($ui-base-color, 3%);\n transition: background 200ms ease-out;\n }\n }\n}\n\n.scrollable {\n overflow-y: scroll;\n overflow-x: hidden;\n flex: 1 1 auto;\n -webkit-overflow-scrolling: touch;\n\n &.optionally-scrollable {\n overflow-y: auto;\n }\n\n @supports(display: grid) { // hack to fix Chrome <57\n contain: strict;\n }\n\n &--flex {\n display: flex;\n flex-direction: column;\n }\n\n &__append {\n flex: 1 1 auto;\n position: relative;\n min-height: 120px;\n }\n}\n\n.scrollable.fullscreen {\n @supports(display: grid) { // hack to fix Chrome <57\n contain: none;\n }\n}\n\n.column-back-button {\n box-sizing: border-box;\n width: 100%;\n background: lighten($ui-base-color, 4%);\n color: $highlight-text-color;\n cursor: pointer;\n flex: 0 0 auto;\n font-size: 16px;\n line-height: inherit;\n border: 0;\n text-align: unset;\n padding: 15px;\n margin: 0;\n z-index: 3;\n outline: 0;\n\n &:hover {\n text-decoration: underline;\n }\n}\n\n.column-header__back-button {\n background: lighten($ui-base-color, 4%);\n border: 0;\n font-family: inherit;\n color: $highlight-text-color;\n cursor: pointer;\n white-space: nowrap;\n font-size: 16px;\n padding: 0 5px 0 0;\n z-index: 3;\n\n &:hover {\n text-decoration: underline;\n }\n\n &:last-child {\n padding: 0 15px 0 0;\n }\n}\n\n.column-back-button__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.column-back-button--slim {\n position: relative;\n}\n\n.column-back-button--slim-button {\n cursor: pointer;\n flex: 0 0 auto;\n font-size: 16px;\n padding: 15px;\n position: absolute;\n right: 0;\n top: -48px;\n}\n\n.react-toggle {\n display: inline-block;\n position: relative;\n cursor: pointer;\n background-color: transparent;\n border: 0;\n padding: 0;\n user-select: none;\n -webkit-tap-highlight-color: rgba($base-overlay-background, 0);\n -webkit-tap-highlight-color: transparent;\n}\n\n.react-toggle-screenreader-only {\n border: 0;\n clip: rect(0 0 0 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n}\n\n.react-toggle--disabled {\n cursor: not-allowed;\n opacity: 0.5;\n transition: opacity 0.25s;\n}\n\n.react-toggle-track {\n width: 50px;\n height: 24px;\n padding: 0;\n border-radius: 30px;\n background-color: $ui-base-color;\n transition: background-color 0.2s ease;\n}\n\n.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track {\n background-color: darken($ui-base-color, 10%);\n}\n\n.react-toggle--checked .react-toggle-track {\n background-color: $ui-highlight-color;\n}\n\n.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track {\n background-color: lighten($ui-highlight-color, 10%);\n}\n\n.react-toggle-track-check {\n position: absolute;\n width: 14px;\n height: 10px;\n top: 0;\n bottom: 0;\n margin-top: auto;\n margin-bottom: auto;\n line-height: 0;\n left: 8px;\n opacity: 0;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle--checked .react-toggle-track-check {\n opacity: 1;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle-track-x {\n position: absolute;\n width: 10px;\n height: 10px;\n top: 0;\n bottom: 0;\n margin-top: auto;\n margin-bottom: auto;\n line-height: 0;\n right: 10px;\n opacity: 1;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle--checked .react-toggle-track-x {\n opacity: 0;\n}\n\n.react-toggle-thumb {\n position: absolute;\n top: 1px;\n left: 1px;\n width: 22px;\n height: 22px;\n border: 1px solid $ui-base-color;\n border-radius: 50%;\n background-color: darken($simple-background-color, 2%);\n box-sizing: border-box;\n transition: all 0.25s ease;\n transition-property: border-color, left;\n}\n\n.react-toggle--checked .react-toggle-thumb {\n left: 27px;\n border-color: $ui-highlight-color;\n}\n\n.column-link {\n background: lighten($ui-base-color, 8%);\n color: $primary-text-color;\n display: block;\n font-size: 16px;\n padding: 15px;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 11%);\n }\n\n &:focus {\n outline: 0;\n }\n\n &--transparent {\n background: transparent;\n color: $ui-secondary-color;\n\n &:hover,\n &:focus,\n &:active {\n background: transparent;\n color: $primary-text-color;\n }\n\n &.active {\n color: $ui-highlight-color;\n }\n }\n}\n\n.column-link__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.column-link__badge {\n display: inline-block;\n border-radius: 4px;\n font-size: 12px;\n line-height: 19px;\n font-weight: 500;\n background: $ui-base-color;\n padding: 4px 8px;\n margin: -6px 10px;\n}\n\n.column-subheading {\n background: $ui-base-color;\n color: $dark-text-color;\n padding: 8px 20px;\n font-size: 12px;\n font-weight: 500;\n text-transform: uppercase;\n cursor: default;\n}\n\n.getting-started__wrapper,\n.getting-started,\n.flex-spacer {\n background: $ui-base-color;\n}\n\n.flex-spacer {\n flex: 1 1 auto;\n}\n\n.getting-started {\n color: $dark-text-color;\n overflow: auto;\n border-bottom-left-radius: 2px;\n border-bottom-right-radius: 2px;\n\n &__wrapper,\n &__panel,\n &__footer {\n height: min-content;\n }\n\n &__panel,\n &__footer\n {\n padding: 10px;\n padding-top: 20px;\n flex-grow: 0;\n\n ul {\n margin-bottom: 10px;\n }\n\n ul li {\n display: inline;\n }\n\n p {\n font-size: 13px;\n\n a {\n color: $dark-text-color;\n text-decoration: underline;\n }\n }\n\n a {\n text-decoration: none;\n color: $darker-text-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n }\n\n &__wrapper,\n &__footer\n {\n color: $dark-text-color;\n }\n\n &__trends {\n flex: 0 1 auto;\n opacity: 1;\n animation: fade 150ms linear;\n margin-top: 10px;\n\n h4 {\n font-size: 12px;\n text-transform: uppercase;\n color: $darker-text-color;\n padding: 10px;\n font-weight: 500;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n @media screen and (max-height: 810px) {\n .trends__item:nth-child(3) {\n display: none;\n }\n }\n\n @media screen and (max-height: 720px) {\n .trends__item:nth-child(2) {\n display: none;\n }\n }\n\n @media screen and (max-height: 670px) {\n display: none;\n }\n\n .trends__item {\n border-bottom: 0;\n padding: 10px;\n\n &__current {\n color: $darker-text-color;\n }\n }\n }\n}\n\n.keyboard-shortcuts {\n padding: 8px 0 0;\n overflow: hidden;\n\n thead {\n position: absolute;\n left: -9999px;\n }\n\n td {\n padding: 0 10px 8px;\n }\n\n kbd {\n display: inline-block;\n padding: 3px 5px;\n background-color: lighten($ui-base-color, 8%);\n border: 1px solid darken($ui-base-color, 4%);\n }\n}\n\n.setting-text {\n display: block;\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n color: $inverted-text-color;\n background: $simple-background-color;\n padding: 10px;\n font-family: inherit;\n font-size: 14px;\n resize: vertical;\n border: 0;\n outline: 0;\n border-radius: 4px;\n\n &:focus {\n outline: 0;\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n}\n\n.no-reduce-motion button.icon-button i.fa-retweet {\n background-position: 0 0;\n height: 19px;\n transition: background-position 0.9s steps(10);\n transition-duration: 0s;\n vertical-align: middle;\n width: 22px;\n\n &::before {\n display: none !important;\n }\n\n}\n\n.no-reduce-motion button.icon-button.active i.fa-retweet {\n transition-duration: 0.9s;\n background-position: 0 100%;\n}\n\n.reduce-motion button.icon-button i.fa-retweet {\n color: $action-button-color;\n transition: color 100ms ease-in;\n}\n\n.reduce-motion button.icon-button.active i.fa-retweet {\n color: $highlight-text-color;\n}\n\n.status-card {\n display: flex;\n font-size: 14px;\n border: 1px solid lighten($ui-base-color, 8%);\n border-radius: 4px;\n color: $dark-text-color;\n margin-top: 14px;\n text-decoration: none;\n overflow: hidden;\n\n &__actions {\n bottom: 0;\n left: 0;\n position: absolute;\n right: 0;\n top: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n\n & > div {\n background: rgba($base-shadow-color, 0.6);\n border-radius: 8px;\n padding: 12px 9px;\n flex: 0 0 auto;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n button,\n a {\n display: inline;\n color: $secondary-text-color;\n background: transparent;\n border: 0;\n padding: 0 8px;\n text-decoration: none;\n font-size: 18px;\n line-height: 18px;\n\n &:hover,\n &:active,\n &:focus {\n color: $primary-text-color;\n }\n }\n\n a {\n font-size: 19px;\n position: relative;\n bottom: -1px;\n }\n }\n}\n\na.status-card {\n cursor: pointer;\n\n &:hover {\n background: lighten($ui-base-color, 8%);\n }\n}\n\n.status-card-photo {\n cursor: zoom-in;\n display: block;\n text-decoration: none;\n width: 100%;\n height: auto;\n margin: 0;\n}\n\n.status-card-video {\n iframe {\n width: 100%;\n height: 100%;\n }\n}\n\n.status-card__title {\n display: block;\n font-weight: 500;\n margin-bottom: 5px;\n color: $darker-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-decoration: none;\n}\n\n.status-card__content {\n flex: 1 1 auto;\n overflow: hidden;\n padding: 14px 14px 14px 8px;\n}\n\n.status-card__description {\n color: $darker-text-color;\n}\n\n.status-card__host {\n display: block;\n margin-top: 5px;\n font-size: 13px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.status-card__image {\n flex: 0 0 100px;\n background: lighten($ui-base-color, 8%);\n position: relative;\n\n & > .fa {\n font-size: 21px;\n position: absolute;\n transform-origin: 50% 50%;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n}\n\n.status-card.horizontal {\n display: block;\n\n .status-card__image {\n width: 100%;\n }\n\n .status-card__image-image {\n border-radius: 4px 4px 0 0;\n }\n\n .status-card__title {\n white-space: inherit;\n }\n}\n\n.status-card.compact {\n border-color: lighten($ui-base-color, 4%);\n\n &.interactive {\n border: 0;\n }\n\n .status-card__content {\n padding: 8px;\n padding-top: 10px;\n }\n\n .status-card__title {\n white-space: nowrap;\n }\n\n .status-card__image {\n flex: 0 0 60px;\n }\n}\n\na.status-card.compact:hover {\n background-color: lighten($ui-base-color, 4%);\n}\n\n.status-card__image-image {\n border-radius: 4px 0 0 4px;\n display: block;\n margin: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n background-size: cover;\n background-position: center center;\n}\n\n.load-more {\n display: block;\n color: $dark-text-color;\n background-color: transparent;\n border: 0;\n font-size: inherit;\n text-align: center;\n line-height: inherit;\n margin: 0;\n padding: 15px;\n box-sizing: border-box;\n width: 100%;\n clear: both;\n text-decoration: none;\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n}\n\n.load-gap {\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n}\n\n.regeneration-indicator {\n text-align: center;\n font-size: 16px;\n font-weight: 500;\n color: $dark-text-color;\n background: $ui-base-color;\n cursor: default;\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 20px;\n\n &__figure {\n &,\n img {\n display: block;\n width: auto;\n height: 160px;\n margin: 0;\n }\n }\n\n &--without-header {\n padding-top: 20px + 48px;\n }\n\n &__label {\n margin-top: 30px;\n\n strong {\n display: block;\n margin-bottom: 10px;\n color: $dark-text-color;\n }\n\n span {\n font-size: 15px;\n font-weight: 400;\n }\n }\n}\n\n.column-header__wrapper {\n position: relative;\n flex: 0 0 auto;\n z-index: 1;\n\n &.active {\n box-shadow: 0 1px 0 rgba($highlight-text-color, 0.3);\n\n &::before {\n display: block;\n content: \"\";\n position: absolute;\n bottom: -13px;\n left: 0;\n right: 0;\n margin: 0 auto;\n width: 60%;\n pointer-events: none;\n height: 28px;\n z-index: 1;\n background: radial-gradient(ellipse, rgba($ui-highlight-color, 0.23) 0%, rgba($ui-highlight-color, 0) 60%);\n }\n }\n\n .announcements {\n z-index: 1;\n position: relative;\n }\n}\n\n.column-header {\n display: flex;\n font-size: 16px;\n background: lighten($ui-base-color, 4%);\n flex: 0 0 auto;\n cursor: pointer;\n position: relative;\n z-index: 2;\n outline: 0;\n overflow: hidden;\n border-top-left-radius: 2px;\n border-top-right-radius: 2px;\n\n & > button {\n margin: 0;\n border: 0;\n padding: 15px 0 15px 15px;\n color: inherit;\n background: transparent;\n font: inherit;\n text-align: left;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n flex: 1;\n }\n\n & > .column-header__back-button {\n color: $highlight-text-color;\n }\n\n &.active {\n .column-header__icon {\n color: $highlight-text-color;\n text-shadow: 0 0 10px rgba($highlight-text-color, 0.4);\n }\n }\n\n &:focus,\n &:active {\n outline: 0;\n }\n}\n\n.column-header__buttons {\n height: 48px;\n display: flex;\n}\n\n.column-header__links {\n margin-bottom: 14px;\n}\n\n.column-header__links .text-btn {\n margin-right: 10px;\n}\n\n.column-header__button {\n background: lighten($ui-base-color, 4%);\n border: 0;\n color: $darker-text-color;\n cursor: pointer;\n font-size: 16px;\n padding: 0 15px;\n\n &:hover {\n color: lighten($darker-text-color, 7%);\n }\n\n &.active {\n color: $primary-text-color;\n background: lighten($ui-base-color, 8%);\n\n &:hover {\n color: $primary-text-color;\n background: lighten($ui-base-color, 8%);\n }\n }\n}\n\n.column-header__collapsible {\n max-height: 70vh;\n overflow: hidden;\n overflow-y: auto;\n color: $darker-text-color;\n transition: max-height 150ms ease-in-out, opacity 300ms linear;\n opacity: 1;\n z-index: 1;\n position: relative;\n\n &.collapsed {\n max-height: 0;\n opacity: 0.5;\n }\n\n &.animating {\n overflow-y: hidden;\n }\n\n hr {\n height: 0;\n background: transparent;\n border: 0;\n border-top: 1px solid lighten($ui-base-color, 12%);\n margin: 10px 0;\n }\n}\n\n.column-header__collapsible-inner {\n background: lighten($ui-base-color, 8%);\n padding: 15px;\n}\n\n.column-header__setting-btn {\n &:hover {\n color: $darker-text-color;\n text-decoration: underline;\n }\n}\n\n.column-header__setting-arrows {\n float: right;\n\n .column-header__setting-btn {\n padding: 0 10px;\n\n &:last-child {\n padding-right: 0;\n }\n }\n}\n\n.text-btn {\n display: inline-block;\n padding: 0;\n font-family: inherit;\n font-size: inherit;\n color: inherit;\n border: 0;\n background: transparent;\n cursor: pointer;\n}\n\n.column-header__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.loading-indicator {\n color: $dark-text-color;\n font-size: 12px;\n font-weight: 400;\n text-transform: uppercase;\n overflow: visible;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n\n span {\n display: block;\n float: left;\n margin-left: 50%;\n transform: translateX(-50%);\n margin: 82px 0 0 50%;\n white-space: nowrap;\n }\n}\n\n.loading-indicator__figure {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 42px;\n height: 42px;\n box-sizing: border-box;\n background-color: transparent;\n border: 0 solid lighten($ui-base-color, 26%);\n border-width: 6px;\n border-radius: 50%;\n}\n\n.no-reduce-motion .loading-indicator span {\n animation: loader-label 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1);\n}\n\n.no-reduce-motion .loading-indicator__figure {\n animation: loader-figure 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1);\n}\n\n@keyframes spring-rotate-in {\n 0% {\n transform: rotate(0deg);\n }\n\n 30% {\n transform: rotate(-484.8deg);\n }\n\n 60% {\n transform: rotate(-316.7deg);\n }\n\n 90% {\n transform: rotate(-375deg);\n }\n\n 100% {\n transform: rotate(-360deg);\n }\n}\n\n@keyframes spring-rotate-out {\n 0% {\n transform: rotate(-360deg);\n }\n\n 30% {\n transform: rotate(124.8deg);\n }\n\n 60% {\n transform: rotate(-43.27deg);\n }\n\n 90% {\n transform: rotate(15deg);\n }\n\n 100% {\n transform: rotate(0deg);\n }\n}\n\n@keyframes loader-figure {\n 0% {\n width: 0;\n height: 0;\n background-color: lighten($ui-base-color, 26%);\n }\n\n 29% {\n background-color: lighten($ui-base-color, 26%);\n }\n\n 30% {\n width: 42px;\n height: 42px;\n background-color: transparent;\n border-width: 21px;\n opacity: 1;\n }\n\n 100% {\n width: 42px;\n height: 42px;\n border-width: 0;\n opacity: 0;\n background-color: transparent;\n }\n}\n\n@keyframes loader-label {\n 0% { opacity: 0.25; }\n 30% { opacity: 1; }\n 100% { opacity: 0.25; }\n}\n\n.video-error-cover {\n align-items: center;\n background: $base-overlay-background;\n color: $primary-text-color;\n cursor: pointer;\n display: flex;\n flex-direction: column;\n height: 100%;\n justify-content: center;\n margin-top: 8px;\n position: relative;\n text-align: center;\n z-index: 100;\n}\n\n.media-spoiler {\n background: $base-overlay-background;\n color: $darker-text-color;\n border: 0;\n padding: 0;\n width: 100%;\n height: 100%;\n border-radius: 4px;\n appearance: none;\n\n &:hover,\n &:active,\n &:focus {\n padding: 0;\n color: lighten($darker-text-color, 8%);\n }\n}\n\n.media-spoiler__warning {\n display: block;\n font-size: 14px;\n}\n\n.media-spoiler__trigger {\n display: block;\n font-size: 11px;\n font-weight: 700;\n}\n\n.spoiler-button {\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n position: absolute;\n z-index: 100;\n\n &--minified {\n display: block;\n left: 4px;\n top: 4px;\n width: auto;\n height: auto;\n }\n\n &--click-thru {\n pointer-events: none;\n }\n\n &--hidden {\n display: none;\n }\n\n &__overlay {\n display: block;\n background: transparent;\n width: 100%;\n height: 100%;\n border: 0;\n\n &__label {\n display: inline-block;\n background: rgba($base-overlay-background, 0.5);\n border-radius: 8px;\n padding: 8px 12px;\n color: $primary-text-color;\n font-weight: 500;\n font-size: 14px;\n }\n\n &:hover,\n &:focus,\n &:active {\n .spoiler-button__overlay__label {\n background: rgba($base-overlay-background, 0.8);\n }\n }\n\n &:disabled {\n .spoiler-button__overlay__label {\n background: rgba($base-overlay-background, 0.5);\n }\n }\n }\n}\n\n.modal-container--preloader {\n background: lighten($ui-base-color, 8%);\n}\n\n.account--panel {\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: row;\n padding: 10px 0;\n}\n\n.account--panel__button,\n.detailed-status__button {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.column-settings__outer {\n background: lighten($ui-base-color, 8%);\n padding: 15px;\n}\n\n.column-settings__section {\n color: $darker-text-color;\n cursor: default;\n display: block;\n font-weight: 500;\n margin-bottom: 10px;\n}\n\n.column-settings__hashtags {\n .column-settings__row {\n margin-bottom: 15px;\n }\n\n .column-select {\n &__control {\n @include search-input;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n &__placeholder {\n color: $dark-text-color;\n padding-left: 2px;\n font-size: 12px;\n }\n\n &__value-container {\n padding-left: 6px;\n }\n\n &__multi-value {\n background: lighten($ui-base-color, 8%);\n\n &__remove {\n cursor: pointer;\n\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 12%);\n color: lighten($darker-text-color, 4%);\n }\n }\n }\n\n &__multi-value__label,\n &__input {\n color: $darker-text-color;\n }\n\n &__clear-indicator,\n &__dropdown-indicator {\n cursor: pointer;\n transition: none;\n color: $dark-text-color;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($dark-text-color, 4%);\n }\n }\n\n &__indicator-separator {\n background-color: lighten($ui-base-color, 8%);\n }\n\n &__menu {\n @include search-popout;\n padding: 0;\n background: $ui-secondary-color;\n }\n\n &__menu-list {\n padding: 6px;\n }\n\n &__option {\n color: $inverted-text-color;\n border-radius: 4px;\n font-size: 14px;\n\n &--is-focused,\n &--is-selected {\n background: darken($ui-secondary-color, 10%);\n }\n }\n }\n}\n\n.column-settings__row {\n .text-btn {\n margin-bottom: 15px;\n }\n}\n\n.relationship-tag {\n color: $primary-text-color;\n margin-bottom: 4px;\n display: block;\n vertical-align: top;\n background-color: $base-overlay-background;\n text-transform: uppercase;\n font-size: 11px;\n font-weight: 500;\n padding: 4px;\n border-radius: 4px;\n opacity: 0.7;\n\n &:hover {\n opacity: 1;\n }\n}\n\n.setting-toggle {\n display: block;\n line-height: 24px;\n}\n\n.setting-toggle__label {\n color: $darker-text-color;\n display: inline-block;\n margin-bottom: 14px;\n margin-left: 8px;\n vertical-align: middle;\n}\n\n.empty-column-indicator,\n.error-column,\n.follow_requests-unlocked_explanation {\n color: $dark-text-color;\n background: $ui-base-color;\n text-align: center;\n padding: 20px;\n font-size: 15px;\n font-weight: 400;\n cursor: default;\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n justify-content: center;\n\n @supports(display: grid) { // hack to fix Chrome <57\n contain: strict;\n }\n\n & > span {\n max-width: 400px;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.follow_requests-unlocked_explanation {\n background: darken($ui-base-color, 4%);\n contain: initial;\n}\n\n.error-column {\n flex-direction: column;\n}\n\n@keyframes heartbeat {\n from {\n transform: scale(1);\n animation-timing-function: ease-out;\n }\n\n 10% {\n transform: scale(0.91);\n animation-timing-function: ease-in;\n }\n\n 17% {\n transform: scale(0.98);\n animation-timing-function: ease-out;\n }\n\n 33% {\n transform: scale(0.87);\n animation-timing-function: ease-in;\n }\n\n 45% {\n transform: scale(1);\n animation-timing-function: ease-out;\n }\n}\n\n.no-reduce-motion .pulse-loading {\n transform-origin: center center;\n animation: heartbeat 1.5s ease-in-out infinite both;\n}\n\n@keyframes shake-bottom {\n 0%,\n 100% {\n transform: rotate(0deg);\n transform-origin: 50% 100%;\n }\n\n 10% {\n transform: rotate(2deg);\n }\n\n 20%,\n 40%,\n 60% {\n transform: rotate(-4deg);\n }\n\n 30%,\n 50%,\n 70% {\n transform: rotate(4deg);\n }\n\n 80% {\n transform: rotate(-2deg);\n }\n\n 90% {\n transform: rotate(2deg);\n }\n}\n\n.no-reduce-motion .shake-bottom {\n transform-origin: 50% 100%;\n animation: shake-bottom 0.8s cubic-bezier(0.455, 0.03, 0.515, 0.955) 2s 2 both;\n}\n\n.emoji-picker-dropdown__menu {\n background: $simple-background-color;\n position: absolute;\n box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n margin-top: 5px;\n z-index: 2;\n\n .emoji-mart-scroll {\n transition: opacity 200ms ease;\n }\n\n &.selecting .emoji-mart-scroll {\n opacity: 0.5;\n }\n}\n\n.emoji-picker-dropdown__modifiers {\n position: absolute;\n top: 60px;\n right: 11px;\n cursor: pointer;\n}\n\n.emoji-picker-dropdown__modifiers__menu {\n position: absolute;\n z-index: 4;\n top: -4px;\n left: -8px;\n background: $simple-background-color;\n border-radius: 4px;\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n overflow: hidden;\n\n button {\n display: block;\n cursor: pointer;\n border: 0;\n padding: 4px 8px;\n background: transparent;\n\n &:hover,\n &:focus,\n &:active {\n background: rgba($ui-secondary-color, 0.4);\n }\n }\n\n .emoji-mart-emoji {\n height: 22px;\n }\n}\n\n.emoji-mart-emoji {\n span {\n background-repeat: no-repeat;\n }\n}\n\n.upload-area {\n align-items: center;\n background: rgba($base-overlay-background, 0.8);\n display: flex;\n height: 100%;\n justify-content: center;\n left: 0;\n opacity: 0;\n position: absolute;\n top: 0;\n visibility: hidden;\n width: 100%;\n z-index: 2000;\n\n * {\n pointer-events: none;\n }\n}\n\n.upload-area__drop {\n width: 320px;\n height: 160px;\n display: flex;\n box-sizing: border-box;\n position: relative;\n padding: 8px;\n}\n\n.upload-area__background {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: -1;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 5px rgba($base-shadow-color, 0.2);\n}\n\n.upload-area__content {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: $secondary-text-color;\n font-size: 18px;\n font-weight: 500;\n border: 2px dashed $ui-base-lighter-color;\n border-radius: 4px;\n}\n\n.upload-progress {\n padding: 10px;\n color: $lighter-text-color;\n overflow: hidden;\n display: flex;\n\n .fa {\n font-size: 34px;\n margin-right: 10px;\n }\n\n span {\n font-size: 12px;\n text-transform: uppercase;\n font-weight: 500;\n display: block;\n }\n}\n\n.upload-progess__message {\n flex: 1 1 auto;\n}\n\n.upload-progress__backdrop {\n width: 100%;\n height: 6px;\n border-radius: 6px;\n background: $ui-base-lighter-color;\n position: relative;\n margin-top: 5px;\n}\n\n.upload-progress__tracker {\n position: absolute;\n left: 0;\n top: 0;\n height: 6px;\n background: $ui-highlight-color;\n border-radius: 6px;\n}\n\n.emoji-button {\n display: block;\n padding: 5px 5px 2px 2px;\n outline: 0;\n cursor: pointer;\n\n &:active,\n &:focus {\n outline: 0 !important;\n }\n\n img {\n filter: grayscale(100%);\n opacity: 0.8;\n display: block;\n margin: 0;\n width: 22px;\n height: 22px;\n }\n\n &:hover,\n &:active,\n &:focus {\n img {\n opacity: 1;\n filter: none;\n }\n }\n}\n\n.dropdown--active .emoji-button img {\n opacity: 1;\n filter: none;\n}\n\n.privacy-dropdown__dropdown {\n position: absolute;\n background: $simple-background-color;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n margin-left: 40px;\n overflow: hidden;\n\n &.top {\n transform-origin: 50% 100%;\n }\n\n &.bottom {\n transform-origin: 50% 0;\n }\n}\n\n.privacy-dropdown__option {\n color: $inverted-text-color;\n padding: 10px;\n cursor: pointer;\n display: flex;\n\n &:hover,\n &.active {\n background: $ui-highlight-color;\n color: $primary-text-color;\n outline: 0;\n\n .privacy-dropdown__option__content {\n color: $primary-text-color;\n\n strong {\n color: $primary-text-color;\n }\n }\n }\n\n &.active:hover {\n background: lighten($ui-highlight-color, 4%);\n }\n}\n\n.privacy-dropdown__option__icon {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 10px;\n}\n\n.privacy-dropdown__option__content {\n flex: 1 1 auto;\n color: $lighter-text-color;\n\n strong {\n font-weight: 500;\n display: block;\n color: $inverted-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n}\n\n.privacy-dropdown.active {\n .privacy-dropdown__value {\n background: $simple-background-color;\n border-radius: 4px 4px 0 0;\n box-shadow: 0 -4px 4px rgba($base-shadow-color, 0.1);\n\n .icon-button {\n transition: none;\n }\n\n &.active {\n background: $ui-highlight-color;\n\n .icon-button {\n color: $primary-text-color;\n }\n }\n }\n\n &.top .privacy-dropdown__value {\n border-radius: 0 0 4px 4px;\n }\n\n .privacy-dropdown__dropdown {\n display: block;\n box-shadow: 2px 4px 6px rgba($base-shadow-color, 0.1);\n }\n}\n\n.search {\n position: relative;\n}\n\n.search__input {\n @include search-input;\n\n display: block;\n padding: 15px;\n padding-right: 30px;\n line-height: 18px;\n font-size: 16px;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n}\n\n.search__icon {\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus {\n outline: 0 !important;\n }\n\n .fa {\n position: absolute;\n top: 16px;\n right: 10px;\n z-index: 2;\n display: inline-block;\n opacity: 0;\n transition: all 100ms linear;\n transition-property: transform, opacity;\n font-size: 18px;\n width: 18px;\n height: 18px;\n color: $secondary-text-color;\n cursor: default;\n pointer-events: none;\n\n &.active {\n pointer-events: auto;\n opacity: 0.3;\n }\n }\n\n .fa-search {\n transform: rotate(90deg);\n\n &.active {\n pointer-events: none;\n transform: rotate(0deg);\n }\n }\n\n .fa-times-circle {\n top: 17px;\n transform: rotate(0deg);\n color: $action-button-color;\n cursor: pointer;\n\n &.active {\n transform: rotate(90deg);\n }\n\n &:hover {\n color: lighten($action-button-color, 7%);\n }\n }\n}\n\n.search-results__header {\n color: $dark-text-color;\n background: lighten($ui-base-color, 2%);\n padding: 15px;\n font-weight: 500;\n font-size: 16px;\n cursor: default;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n}\n\n.search-results__section {\n margin-bottom: 5px;\n\n h5 {\n background: darken($ui-base-color, 4%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n display: flex;\n padding: 15px;\n font-weight: 500;\n font-size: 16px;\n color: $dark-text-color;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n .account:last-child,\n & > div:last-child .status {\n border-bottom: 0;\n }\n}\n\n.search-results__hashtag {\n display: block;\n padding: 10px;\n color: $secondary-text-color;\n text-decoration: none;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($secondary-text-color, 4%);\n text-decoration: underline;\n }\n}\n\n.search-results__info {\n padding: 20px;\n color: $darker-text-color;\n text-align: center;\n}\n\n.modal-root {\n position: relative;\n transition: opacity 0.3s linear;\n will-change: opacity;\n z-index: 9999;\n}\n\n.modal-root__overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba($base-overlay-background, 0.7);\n}\n\n.modal-root__container {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n align-content: space-around;\n z-index: 9999;\n pointer-events: none;\n user-select: none;\n}\n\n.modal-root__modal {\n pointer-events: auto;\n display: flex;\n z-index: 9999;\n}\n\n.video-modal__container {\n max-width: 100vw;\n max-height: 100vh;\n}\n\n.audio-modal__container {\n width: 50vw;\n}\n\n.media-modal {\n width: 100%;\n height: 100%;\n position: relative;\n\n .extended-video-player {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n video {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n }\n }\n}\n\n.media-modal__closer {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n}\n\n.media-modal__navigation {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n transition: opacity 0.3s linear;\n will-change: opacity;\n\n * {\n pointer-events: auto;\n }\n\n &.media-modal__navigation--hidden {\n opacity: 0;\n\n * {\n pointer-events: none;\n }\n }\n}\n\n.media-modal__nav {\n background: rgba($base-overlay-background, 0.5);\n box-sizing: border-box;\n border: 0;\n color: $primary-text-color;\n cursor: pointer;\n display: flex;\n align-items: center;\n font-size: 24px;\n height: 20vmax;\n margin: auto 0;\n padding: 30px 15px;\n position: absolute;\n top: 0;\n bottom: 0;\n}\n\n.media-modal__nav--left {\n left: 0;\n}\n\n.media-modal__nav--right {\n right: 0;\n}\n\n.media-modal__pagination {\n width: 100%;\n text-align: center;\n position: absolute;\n left: 0;\n bottom: 20px;\n pointer-events: none;\n}\n\n.media-modal__meta {\n text-align: center;\n position: absolute;\n left: 0;\n bottom: 20px;\n width: 100%;\n pointer-events: none;\n\n &--shifted {\n bottom: 62px;\n }\n\n a {\n pointer-events: auto;\n text-decoration: none;\n font-weight: 500;\n color: $ui-secondary-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.media-modal__page-dot {\n display: inline-block;\n}\n\n.media-modal__button {\n background-color: $primary-text-color;\n height: 12px;\n width: 12px;\n border-radius: 6px;\n margin: 10px;\n padding: 0;\n border: 0;\n font-size: 0;\n}\n\n.media-modal__button--active {\n background-color: $highlight-text-color;\n}\n\n.media-modal__close {\n position: absolute;\n right: 8px;\n top: 8px;\n z-index: 100;\n}\n\n.onboarding-modal,\n.error-modal,\n.embed-modal {\n background: $ui-secondary-color;\n color: $inverted-text-color;\n border-radius: 8px;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.error-modal__body {\n height: 80vh;\n width: 80vw;\n max-width: 520px;\n max-height: 420px;\n position: relative;\n\n & > div {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n padding: 25px;\n display: none;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n display: flex;\n opacity: 0;\n user-select: text;\n }\n}\n\n.error-modal__body {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n text-align: center;\n}\n\n.onboarding-modal__paginator,\n.error-modal__footer {\n flex: 0 0 auto;\n background: darken($ui-secondary-color, 8%);\n display: flex;\n padding: 25px;\n\n & > div {\n min-width: 33px;\n }\n\n .onboarding-modal__nav,\n .error-modal__nav {\n color: $lighter-text-color;\n border: 0;\n font-size: 14px;\n font-weight: 500;\n padding: 10px 25px;\n line-height: inherit;\n height: auto;\n margin: -10px;\n border-radius: 4px;\n background-color: transparent;\n\n &:hover,\n &:focus,\n &:active {\n color: darken($lighter-text-color, 4%);\n background-color: darken($ui-secondary-color, 16%);\n }\n\n &.onboarding-modal__done,\n &.onboarding-modal__next {\n color: $inverted-text-color;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($inverted-text-color, 4%);\n }\n }\n }\n}\n\n.error-modal__footer {\n justify-content: center;\n}\n\n.display-case {\n text-align: center;\n font-size: 15px;\n margin-bottom: 15px;\n\n &__label {\n font-weight: 500;\n color: $inverted-text-color;\n margin-bottom: 5px;\n text-transform: uppercase;\n font-size: 12px;\n }\n\n &__case {\n background: $ui-base-color;\n color: $secondary-text-color;\n font-weight: 500;\n padding: 10px;\n border-radius: 4px;\n }\n}\n\n.onboard-sliders {\n display: inline-block;\n max-width: 30px;\n max-height: auto;\n margin-left: 10px;\n}\n\n.boost-modal,\n.confirmation-modal,\n.report-modal,\n.actions-modal,\n.mute-modal,\n.block-modal {\n background: lighten($ui-secondary-color, 8%);\n color: $inverted-text-color;\n border-radius: 8px;\n overflow: hidden;\n max-width: 90vw;\n width: 480px;\n position: relative;\n flex-direction: column;\n\n .status__display-name {\n display: block;\n max-width: 100%;\n padding-right: 25px;\n }\n\n .status__avatar {\n height: 28px;\n left: 10px;\n position: absolute;\n top: 10px;\n width: 48px;\n }\n\n .status__content__spoiler-link {\n color: lighten($secondary-text-color, 8%);\n }\n}\n\n.actions-modal {\n .status {\n background: $white;\n border-bottom-color: $ui-secondary-color;\n padding-top: 10px;\n padding-bottom: 10px;\n }\n\n .dropdown-menu__separator {\n border-bottom-color: $ui-secondary-color;\n }\n}\n\n.boost-modal__container {\n overflow-x: scroll;\n padding: 10px;\n\n .status {\n user-select: text;\n border-bottom: 0;\n }\n}\n\n.boost-modal__action-bar,\n.confirmation-modal__action-bar,\n.mute-modal__action-bar,\n.block-modal__action-bar {\n display: flex;\n justify-content: space-between;\n background: $ui-secondary-color;\n padding: 10px;\n line-height: 36px;\n\n & > div {\n flex: 1 1 auto;\n text-align: right;\n color: $lighter-text-color;\n padding-right: 10px;\n }\n\n .button {\n flex: 0 0 auto;\n }\n}\n\n.boost-modal__status-header {\n font-size: 15px;\n}\n\n.boost-modal__status-time {\n float: right;\n font-size: 14px;\n}\n\n.mute-modal,\n.block-modal {\n line-height: 24px;\n}\n\n.mute-modal .react-toggle,\n.block-modal .react-toggle {\n vertical-align: middle;\n}\n\n.report-modal {\n width: 90vw;\n max-width: 700px;\n}\n\n.report-modal__container {\n display: flex;\n border-top: 1px solid $ui-secondary-color;\n\n @media screen and (max-width: 480px) {\n flex-wrap: wrap;\n overflow-y: auto;\n }\n}\n\n.report-modal__statuses,\n.report-modal__comment {\n box-sizing: border-box;\n width: 50%;\n\n @media screen and (max-width: 480px) {\n width: 100%;\n }\n}\n\n.report-modal__statuses,\n.focal-point-modal__content {\n flex: 1 1 auto;\n min-height: 20vh;\n max-height: 80vh;\n overflow-y: auto;\n overflow-x: hidden;\n\n .status__content a {\n color: $highlight-text-color;\n }\n\n .status__content,\n .status__content p {\n color: $inverted-text-color;\n }\n\n @media screen and (max-width: 480px) {\n max-height: 10vh;\n }\n}\n\n.focal-point-modal__content {\n @media screen and (max-width: 480px) {\n max-height: 40vh;\n }\n}\n\n.report-modal__comment {\n padding: 20px;\n border-right: 1px solid $ui-secondary-color;\n max-width: 320px;\n\n p {\n font-size: 14px;\n line-height: 20px;\n margin-bottom: 20px;\n }\n\n .setting-text {\n display: block;\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n color: $inverted-text-color;\n background: $white;\n padding: 10px;\n font-family: inherit;\n font-size: 14px;\n resize: none;\n border: 0;\n outline: 0;\n border-radius: 4px;\n border: 1px solid $ui-secondary-color;\n min-height: 100px;\n max-height: 50vh;\n margin-bottom: 10px;\n\n &:focus {\n border: 1px solid darken($ui-secondary-color, 8%);\n }\n\n &__wrapper {\n background: $white;\n border: 1px solid $ui-secondary-color;\n margin-bottom: 10px;\n border-radius: 4px;\n\n .setting-text {\n border: 0;\n margin-bottom: 0;\n border-radius: 0;\n\n &:focus {\n border: 0;\n }\n }\n\n &__modifiers {\n color: $inverted-text-color;\n font-family: inherit;\n font-size: 14px;\n background: $white;\n }\n }\n\n &__toolbar {\n display: flex;\n justify-content: space-between;\n margin-bottom: 20px;\n }\n }\n\n .setting-text-label {\n display: block;\n color: $inverted-text-color;\n font-size: 14px;\n font-weight: 500;\n margin-bottom: 10px;\n }\n\n .setting-toggle {\n margin-top: 20px;\n margin-bottom: 24px;\n\n &__label {\n color: $inverted-text-color;\n font-size: 14px;\n }\n }\n\n @media screen and (max-width: 480px) {\n padding: 10px;\n max-width: 100%;\n order: 2;\n\n .setting-toggle {\n margin-bottom: 4px;\n }\n }\n}\n\n.actions-modal {\n max-height: 80vh;\n max-width: 80vw;\n\n .status {\n overflow-y: auto;\n max-height: 300px;\n }\n\n .actions-modal__item-label {\n font-weight: 500;\n }\n\n ul {\n overflow-y: auto;\n flex-shrink: 0;\n max-height: 80vh;\n\n &.with-status {\n max-height: calc(80vh - 75px);\n }\n\n li:empty {\n margin: 0;\n }\n\n li:not(:empty) {\n a {\n color: $inverted-text-color;\n display: flex;\n padding: 12px 16px;\n font-size: 15px;\n align-items: center;\n text-decoration: none;\n\n &,\n button {\n transition: none;\n }\n\n &.active,\n &:hover,\n &:active,\n &:focus {\n &,\n button {\n background: $ui-highlight-color;\n color: $primary-text-color;\n }\n }\n\n button:first-child {\n margin-right: 10px;\n }\n }\n }\n }\n}\n\n.confirmation-modal__action-bar,\n.mute-modal__action-bar,\n.block-modal__action-bar {\n .confirmation-modal__secondary-button {\n flex-shrink: 1;\n }\n}\n\n.confirmation-modal__secondary-button,\n.confirmation-modal__cancel-button,\n.mute-modal__cancel-button,\n.block-modal__cancel-button {\n background-color: transparent;\n color: $lighter-text-color;\n font-size: 14px;\n font-weight: 500;\n\n &:hover,\n &:focus,\n &:active {\n color: darken($lighter-text-color, 4%);\n background-color: transparent;\n }\n}\n\n.confirmation-modal__container,\n.mute-modal__container,\n.block-modal__container,\n.report-modal__target {\n padding: 30px;\n font-size: 16px;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n}\n\n.confirmation-modal__container,\n.report-modal__target {\n text-align: center;\n}\n\n.block-modal,\n.mute-modal {\n &__explanation {\n margin-top: 20px;\n }\n\n .setting-toggle {\n margin-top: 20px;\n margin-bottom: 24px;\n display: flex;\n align-items: center;\n\n &__label {\n color: $inverted-text-color;\n margin: 0;\n margin-left: 8px;\n }\n }\n}\n\n.report-modal__target {\n padding: 15px;\n\n .media-modal__close {\n top: 14px;\n right: 15px;\n }\n}\n\n.loading-bar {\n background-color: $highlight-text-color;\n height: 3px;\n position: absolute;\n top: 0;\n left: 0;\n z-index: 9999;\n}\n\n.media-gallery__gifv__label {\n display: block;\n position: absolute;\n color: $primary-text-color;\n background: rgba($base-overlay-background, 0.5);\n bottom: 6px;\n left: 6px;\n padding: 2px 6px;\n border-radius: 2px;\n font-size: 11px;\n font-weight: 600;\n z-index: 1;\n pointer-events: none;\n opacity: 0.9;\n transition: opacity 0.1s ease;\n line-height: 18px;\n}\n\n.media-gallery__gifv {\n &:hover {\n .media-gallery__gifv__label {\n opacity: 1;\n }\n }\n}\n\n.media-gallery__audio {\n margin-top: 32px;\n\n audio {\n width: 100%;\n }\n}\n\n.attachment-list {\n display: flex;\n font-size: 14px;\n border: 1px solid lighten($ui-base-color, 8%);\n border-radius: 4px;\n margin-top: 14px;\n overflow: hidden;\n\n &__icon {\n flex: 0 0 auto;\n color: $dark-text-color;\n padding: 8px 18px;\n cursor: default;\n border-right: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n font-size: 26px;\n\n .fa {\n display: block;\n }\n }\n\n &__list {\n list-style: none;\n padding: 4px 0;\n padding-left: 8px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n\n li {\n display: block;\n padding: 4px 0;\n }\n\n a {\n text-decoration: none;\n color: $dark-text-color;\n font-weight: 500;\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n &.compact {\n border: 0;\n margin-top: 4px;\n\n .attachment-list__list {\n padding: 0;\n display: block;\n }\n\n .fa {\n color: $dark-text-color;\n }\n }\n}\n\n/* Media Gallery */\n.media-gallery {\n box-sizing: border-box;\n margin-top: 8px;\n overflow: hidden;\n border-radius: 4px;\n position: relative;\n width: 100%;\n}\n\n.media-gallery__item {\n border: 0;\n box-sizing: border-box;\n display: block;\n float: left;\n position: relative;\n border-radius: 4px;\n overflow: hidden;\n\n &.standalone {\n .media-gallery__item-gifv-thumbnail {\n transform: none;\n top: 0;\n }\n }\n}\n\n.media-gallery__item-thumbnail {\n cursor: zoom-in;\n display: block;\n text-decoration: none;\n color: $secondary-text-color;\n position: relative;\n z-index: 1;\n\n &,\n img {\n height: 100%;\n width: 100%;\n }\n\n img {\n object-fit: cover;\n }\n}\n\n.media-gallery__preview {\n width: 100%;\n height: 100%;\n object-fit: cover;\n position: absolute;\n top: 0;\n left: 0;\n z-index: 0;\n background: $base-overlay-background;\n\n &--hidden {\n display: none;\n }\n}\n\n.media-gallery__gifv {\n height: 100%;\n overflow: hidden;\n position: relative;\n width: 100%;\n}\n\n.media-gallery__item-gifv-thumbnail {\n cursor: zoom-in;\n height: 100%;\n object-fit: cover;\n position: relative;\n top: 50%;\n transform: translateY(-50%);\n width: 100%;\n z-index: 1;\n}\n\n.media-gallery__item-thumbnail-label {\n clip: rect(1px 1px 1px 1px); /* IE6, IE7 */\n clip: rect(1px, 1px, 1px, 1px);\n overflow: hidden;\n position: absolute;\n}\n/* End Media Gallery */\n\n.detailed,\n.fullscreen {\n .video-player__volume__current,\n .video-player__volume::before {\n bottom: 27px;\n }\n\n .video-player__volume__handle {\n bottom: 23px;\n }\n\n}\n\n.audio-player {\n box-sizing: border-box;\n position: relative;\n background: darken($ui-base-color, 8%);\n border-radius: 4px;\n padding-bottom: 44px;\n direction: ltr;\n\n &.editable {\n border-radius: 0;\n height: 100%;\n }\n\n &__waveform {\n padding: 15px 0;\n position: relative;\n overflow: hidden;\n\n &::before {\n content: \"\";\n display: block;\n position: absolute;\n border-top: 1px solid lighten($ui-base-color, 4%);\n width: 100%;\n height: 0;\n left: 0;\n top: calc(50% + 1px);\n }\n }\n\n &__progress-placeholder {\n background-color: rgba(lighten($ui-highlight-color, 8%), 0.5);\n }\n\n &__wave-placeholder {\n background-color: lighten($ui-base-color, 16%);\n }\n\n .video-player__controls {\n padding: 0 15px;\n padding-top: 10px;\n background: darken($ui-base-color, 8%);\n border-top: 1px solid lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n }\n}\n\n.video-player {\n overflow: hidden;\n position: relative;\n background: $base-shadow-color;\n max-width: 100%;\n border-radius: 4px;\n box-sizing: border-box;\n direction: ltr;\n\n &.editable {\n border-radius: 0;\n height: 100% !important;\n }\n\n &:focus {\n outline: 0;\n }\n\n video {\n max-width: 100vw;\n max-height: 80vh;\n z-index: 1;\n }\n\n &.fullscreen {\n width: 100% !important;\n height: 100% !important;\n margin: 0;\n\n video {\n max-width: 100% !important;\n max-height: 100% !important;\n width: 100% !important;\n height: 100% !important;\n outline: 0;\n }\n }\n\n &.inline {\n video {\n object-fit: contain;\n position: relative;\n top: 50%;\n transform: translateY(-50%);\n }\n }\n\n &__controls {\n position: absolute;\n z-index: 2;\n bottom: 0;\n left: 0;\n right: 0;\n box-sizing: border-box;\n background: linear-gradient(0deg, rgba($base-shadow-color, 0.85) 0, rgba($base-shadow-color, 0.45) 60%, transparent);\n padding: 0 15px;\n opacity: 0;\n transition: opacity .1s ease;\n\n &.active {\n opacity: 1;\n }\n }\n\n &.inactive {\n video,\n .video-player__controls {\n visibility: hidden;\n }\n }\n\n &__spoiler {\n display: none;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 4;\n border: 0;\n background: $base-overlay-background;\n color: $darker-text-color;\n transition: none;\n pointer-events: none;\n\n &.active {\n display: block;\n pointer-events: auto;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($darker-text-color, 7%);\n }\n }\n\n &__title {\n display: block;\n font-size: 14px;\n }\n\n &__subtitle {\n display: block;\n font-size: 11px;\n font-weight: 500;\n }\n }\n\n &__buttons-bar {\n display: flex;\n justify-content: space-between;\n padding-bottom: 10px;\n\n .video-player__download__icon {\n color: inherit;\n }\n }\n\n &__buttons {\n font-size: 16px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &.left {\n button {\n padding-left: 0;\n }\n }\n\n &.right {\n button {\n padding-right: 0;\n }\n }\n\n button {\n background: transparent;\n padding: 2px 10px;\n font-size: 16px;\n border: 0;\n color: rgba($white, 0.75);\n\n &:active,\n &:hover,\n &:focus {\n color: $white;\n }\n }\n }\n\n &__time-sep,\n &__time-total,\n &__time-current {\n font-size: 14px;\n font-weight: 500;\n }\n\n &__time-current {\n color: $white;\n margin-left: 60px;\n }\n\n &__time-sep {\n display: inline-block;\n margin: 0 6px;\n }\n\n &__time-sep,\n &__time-total {\n color: $white;\n }\n\n &__volume {\n cursor: pointer;\n height: 24px;\n display: inline;\n\n &::before {\n content: \"\";\n width: 50px;\n background: rgba($white, 0.35);\n border-radius: 4px;\n display: block;\n position: absolute;\n height: 4px;\n left: 70px;\n bottom: 20px;\n }\n\n &__current {\n display: block;\n position: absolute;\n height: 4px;\n border-radius: 4px;\n left: 70px;\n bottom: 20px;\n background: lighten($ui-highlight-color, 8%);\n }\n\n &__handle {\n position: absolute;\n z-index: 3;\n border-radius: 50%;\n width: 12px;\n height: 12px;\n bottom: 16px;\n left: 70px;\n transition: opacity .1s ease;\n background: lighten($ui-highlight-color, 8%);\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n pointer-events: none;\n }\n }\n\n &__link {\n padding: 2px 10px;\n\n a {\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n color: $white;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n }\n\n &__seek {\n cursor: pointer;\n height: 24px;\n position: relative;\n\n &::before {\n content: \"\";\n width: 100%;\n background: rgba($white, 0.35);\n border-radius: 4px;\n display: block;\n position: absolute;\n height: 4px;\n top: 10px;\n }\n\n &__progress,\n &__buffer {\n display: block;\n position: absolute;\n height: 4px;\n border-radius: 4px;\n top: 10px;\n background: lighten($ui-highlight-color, 8%);\n }\n\n &__buffer {\n background: rgba($white, 0.2);\n }\n\n &__handle {\n position: absolute;\n z-index: 3;\n opacity: 0;\n border-radius: 50%;\n width: 12px;\n height: 12px;\n top: 6px;\n margin-left: -6px;\n transition: opacity .1s ease;\n background: lighten($ui-highlight-color, 8%);\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n pointer-events: none;\n\n &.active {\n opacity: 1;\n }\n }\n\n &:hover {\n .video-player__seek__handle {\n opacity: 1;\n }\n }\n }\n\n &.detailed,\n &.fullscreen {\n .video-player__buttons {\n button {\n padding-top: 10px;\n padding-bottom: 10px;\n }\n }\n }\n}\n\n.directory {\n &__list {\n width: 100%;\n margin: 10px 0;\n transition: opacity 100ms ease-in;\n\n &.loading {\n opacity: 0.7;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin: 0;\n }\n }\n\n &__card {\n box-sizing: border-box;\n margin-bottom: 10px;\n\n &__img {\n height: 125px;\n position: relative;\n background: darken($ui-base-color, 12%);\n overflow: hidden;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n object-fit: cover;\n }\n }\n\n &__bar {\n display: flex;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n padding: 10px;\n\n &__name {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n text-decoration: none;\n overflow: hidden;\n }\n\n &__relationship {\n width: 23px;\n min-height: 1px;\n flex: 0 0 auto;\n }\n\n .avatar {\n flex: 0 0 auto;\n width: 48px;\n height: 48px;\n padding-top: 2px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n background: darken($ui-base-color, 8%);\n object-fit: cover;\n }\n }\n\n .display-name {\n margin-left: 15px;\n text-align: left;\n\n strong {\n font-size: 15px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n span {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n &__extra {\n background: $ui-base-color;\n display: flex;\n align-items: center;\n justify-content: center;\n\n .accounts-table__count {\n width: 33.33%;\n flex: 0 0 auto;\n padding: 15px 0;\n }\n\n .account__header__content {\n box-sizing: border-box;\n padding: 15px 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n width: 100%;\n min-height: 18px + 30px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n p {\n display: none;\n\n &:first-child {\n display: inline;\n }\n }\n\n br {\n display: none;\n }\n }\n }\n }\n}\n\n.account-gallery__container {\n display: flex;\n flex-wrap: wrap;\n padding: 4px 2px;\n}\n\n.account-gallery__item {\n border: 0;\n box-sizing: border-box;\n display: block;\n position: relative;\n border-radius: 4px;\n overflow: hidden;\n margin: 2px;\n\n &__icons {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 24px;\n }\n}\n\n.notification__filter-bar,\n.account__section-headline {\n background: darken($ui-base-color, 4%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n display: flex;\n flex-shrink: 0;\n\n button {\n background: darken($ui-base-color, 4%);\n border: 0;\n margin: 0;\n }\n\n button,\n a {\n display: block;\n flex: 1 1 auto;\n color: $darker-text-color;\n padding: 15px 0;\n font-size: 14px;\n font-weight: 500;\n text-align: center;\n text-decoration: none;\n position: relative;\n width: 100%;\n white-space: nowrap;\n\n &.active {\n color: $secondary-text-color;\n\n &::before,\n &::after {\n display: block;\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 50%;\n width: 0;\n height: 0;\n transform: translateX(-50%);\n border-style: solid;\n border-width: 0 10px 10px;\n border-color: transparent transparent lighten($ui-base-color, 8%);\n }\n\n &::after {\n bottom: -1px;\n border-color: transparent transparent $ui-base-color;\n }\n }\n }\n\n &.directory__section-headline {\n background: darken($ui-base-color, 2%);\n border-bottom-color: transparent;\n\n a,\n button {\n &.active {\n &::before {\n display: none;\n }\n\n &::after {\n border-color: transparent transparent darken($ui-base-color, 7%);\n }\n }\n }\n }\n}\n\n.filter-form {\n background: $ui-base-color;\n\n &__column {\n padding: 10px 15px;\n }\n\n .radio-button {\n display: block;\n }\n}\n\n.radio-button {\n font-size: 14px;\n position: relative;\n display: inline-block;\n padding: 6px 0;\n line-height: 18px;\n cursor: default;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n cursor: pointer;\n\n input[type=radio],\n input[type=checkbox] {\n display: none;\n }\n\n &__input {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 50%;\n vertical-align: middle;\n\n &.checked {\n border-color: lighten($ui-highlight-color, 8%);\n background: lighten($ui-highlight-color, 8%);\n }\n }\n}\n\n::-webkit-scrollbar-thumb {\n border-radius: 0;\n}\n\n.search-popout {\n @include search-popout;\n}\n\nnoscript {\n text-align: center;\n\n img {\n width: 200px;\n opacity: 0.5;\n animation: flicker 4s infinite;\n }\n\n div {\n font-size: 14px;\n margin: 30px auto;\n color: $secondary-text-color;\n max-width: 400px;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n }\n}\n\n@keyframes flicker {\n 0% { opacity: 1; }\n 30% { opacity: 0.75; }\n 100% { opacity: 1; }\n}\n\n@media screen and (max-width: 630px) and (max-height: 400px) {\n $duration: 400ms;\n $delay: 100ms;\n\n .tabs-bar,\n .search {\n will-change: margin-top;\n transition: margin-top $duration $delay;\n }\n\n .navigation-bar {\n will-change: padding-bottom;\n transition: padding-bottom $duration $delay;\n }\n\n .navigation-bar {\n & > a:first-child {\n will-change: margin-top, margin-left, margin-right, width;\n transition: margin-top $duration $delay, margin-left $duration ($duration + $delay), margin-right $duration ($duration + $delay);\n }\n\n & > .navigation-bar__profile-edit {\n will-change: margin-top;\n transition: margin-top $duration $delay;\n }\n\n .navigation-bar__actions {\n & > .icon-button.close {\n will-change: opacity transform;\n transition: opacity $duration * 0.5 $delay,\n transform $duration $delay;\n }\n\n & > .compose__action-bar .icon-button {\n will-change: opacity transform;\n transition: opacity $duration * 0.5 $delay + $duration * 0.5,\n transform $duration $delay;\n }\n }\n }\n\n .is-composing {\n .tabs-bar,\n .search {\n margin-top: -50px;\n }\n\n .navigation-bar {\n padding-bottom: 0;\n\n & > a:first-child {\n margin: -100px 10px 0 -50px;\n }\n\n .navigation-bar__profile {\n padding-top: 2px;\n }\n\n .navigation-bar__profile-edit {\n position: absolute;\n margin-top: -60px;\n }\n\n .navigation-bar__actions {\n .icon-button.close {\n pointer-events: auto;\n opacity: 1;\n transform: scale(1, 1) translate(0, 0);\n bottom: 5px;\n }\n\n .compose__action-bar .icon-button {\n pointer-events: none;\n opacity: 0;\n transform: scale(0, 1) translate(100%, 0);\n }\n }\n }\n }\n}\n\n.embed-modal {\n width: auto;\n max-width: 80vw;\n max-height: 80vh;\n\n h4 {\n padding: 30px;\n font-weight: 500;\n font-size: 16px;\n text-align: center;\n }\n\n .embed-modal__container {\n padding: 10px;\n\n .hint {\n margin-bottom: 15px;\n }\n\n .embed-modal__html {\n outline: 0;\n box-sizing: border-box;\n display: block;\n width: 100%;\n border: 0;\n padding: 10px;\n font-family: $font-monospace, monospace;\n background: $ui-base-color;\n color: $primary-text-color;\n font-size: 14px;\n margin: 0;\n margin-bottom: 15px;\n border-radius: 4px;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n .embed-modal__iframe {\n width: 400px;\n max-width: 100%;\n overflow: hidden;\n border: 0;\n border-radius: 4px;\n }\n }\n}\n\n.account__moved-note {\n padding: 14px 10px;\n padding-bottom: 16px;\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &__message {\n position: relative;\n margin-left: 58px;\n color: $dark-text-color;\n padding: 8px 0;\n padding-top: 0;\n padding-bottom: 4px;\n font-size: 14px;\n\n > span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n &__icon-wrapper {\n left: -26px;\n position: absolute;\n }\n\n .detailed-status__display-avatar {\n position: relative;\n }\n\n .detailed-status__display-name {\n margin-bottom: 0;\n }\n}\n\n.column-inline-form {\n padding: 15px;\n padding-right: 0;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n\n label {\n flex: 1 1 auto;\n\n input {\n width: 100%;\n\n &:focus {\n outline: 0;\n }\n }\n }\n\n .icon-button {\n flex: 0 0 auto;\n margin: 0 10px;\n }\n}\n\n.drawer__backdrop {\n cursor: pointer;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba($base-overlay-background, 0.5);\n}\n\n.list-editor {\n background: $ui-base-color;\n flex-direction: column;\n border-radius: 8px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n width: 380px;\n overflow: hidden;\n\n @media screen and (max-width: 420px) {\n width: 90%;\n }\n\n h4 {\n padding: 15px 0;\n background: lighten($ui-base-color, 13%);\n font-weight: 500;\n font-size: 16px;\n text-align: center;\n border-radius: 8px 8px 0 0;\n }\n\n .drawer__pager {\n height: 50vh;\n }\n\n .drawer__inner {\n border-radius: 0 0 8px 8px;\n\n &.backdrop {\n width: calc(100% - 60px);\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n border-radius: 0 0 0 8px;\n }\n }\n\n &__accounts {\n overflow-y: auto;\n }\n\n .account__display-name {\n &:hover strong {\n text-decoration: none;\n }\n }\n\n .account__avatar {\n cursor: default;\n }\n\n .search {\n margin-bottom: 0;\n }\n}\n\n.list-adder {\n background: $ui-base-color;\n flex-direction: column;\n border-radius: 8px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n width: 380px;\n overflow: hidden;\n\n @media screen and (max-width: 420px) {\n width: 90%;\n }\n\n &__account {\n background: lighten($ui-base-color, 13%);\n }\n\n &__lists {\n background: lighten($ui-base-color, 13%);\n height: 50vh;\n border-radius: 0 0 8px 8px;\n overflow-y: auto;\n }\n\n .list {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n .list__wrapper {\n display: flex;\n }\n\n .list__display-name {\n flex: 1 1 auto;\n overflow: hidden;\n text-decoration: none;\n font-size: 16px;\n padding: 10px;\n }\n}\n\n.focal-point {\n position: relative;\n cursor: move;\n overflow: hidden;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n background: $base-shadow-color;\n\n img,\n video,\n canvas {\n display: block;\n max-height: 80vh;\n width: 100%;\n height: auto;\n margin: 0;\n object-fit: contain;\n background: $base-shadow-color;\n }\n\n &__reticle {\n position: absolute;\n width: 100px;\n height: 100px;\n transform: translate(-50%, -50%);\n background: url('~images/reticle.png') no-repeat 0 0;\n border-radius: 50%;\n box-shadow: 0 0 0 9999em rgba($base-shadow-color, 0.35);\n }\n\n &__overlay {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n }\n\n &__preview {\n position: absolute;\n bottom: 10px;\n right: 10px;\n z-index: 2;\n cursor: move;\n transition: opacity 0.1s ease;\n\n &:hover {\n opacity: 0.5;\n }\n\n strong {\n color: $primary-text-color;\n font-size: 14px;\n font-weight: 500;\n display: block;\n margin-bottom: 5px;\n }\n\n div {\n border-radius: 4px;\n box-shadow: 0 0 14px rgba($base-shadow-color, 0.2);\n }\n }\n\n @media screen and (max-width: 480px) {\n img,\n video {\n max-height: 100%;\n }\n\n &__preview {\n display: none;\n }\n }\n}\n\n.account__header__content {\n color: $darker-text-color;\n font-size: 14px;\n font-weight: 400;\n overflow: hidden;\n word-break: normal;\n word-wrap: break-word;\n\n p {\n margin-bottom: 20px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: inherit;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n}\n\n.account__header {\n overflow: hidden;\n\n &.inactive {\n opacity: 0.5;\n\n .account__header__image,\n .account__avatar {\n filter: grayscale(100%);\n }\n }\n\n &__info {\n position: absolute;\n top: 10px;\n left: 10px;\n }\n\n &__image {\n overflow: hidden;\n height: 145px;\n position: relative;\n background: darken($ui-base-color, 4%);\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n }\n }\n\n &__bar {\n position: relative;\n background: lighten($ui-base-color, 4%);\n padding: 5px;\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n\n .avatar {\n display: block;\n flex: 0 0 auto;\n width: 94px;\n margin-left: -2px;\n\n .account__avatar {\n background: darken($ui-base-color, 8%);\n border: 2px solid lighten($ui-base-color, 4%);\n }\n }\n }\n\n &__tabs {\n display: flex;\n align-items: flex-start;\n padding: 7px 5px;\n margin-top: -55px;\n\n &__buttons {\n display: flex;\n align-items: center;\n padding-top: 55px;\n overflow: hidden;\n\n .icon-button {\n border: 1px solid lighten($ui-base-color, 12%);\n border-radius: 4px;\n box-sizing: content-box;\n padding: 2px;\n }\n\n .button {\n margin: 0 8px;\n }\n }\n\n &__name {\n padding: 5px;\n\n .account-role {\n vertical-align: top;\n }\n\n .emojione {\n width: 22px;\n height: 22px;\n }\n\n h1 {\n font-size: 16px;\n line-height: 24px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n\n small {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n .spacer {\n flex: 1 1 auto;\n }\n }\n\n &__bio {\n overflow: hidden;\n margin: 0 -5px;\n\n .account__header__content {\n padding: 20px 15px;\n padding-bottom: 5px;\n color: $primary-text-color;\n }\n\n .account__header__fields {\n margin: 0;\n border-top: 1px solid lighten($ui-base-color, 12%);\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n }\n\n &__extra {\n margin-top: 4px;\n\n &__links {\n font-size: 14px;\n color: $darker-text-color;\n padding: 10px 0;\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n padding: 5px 10px;\n font-weight: 500;\n\n strong {\n font-weight: 700;\n color: $primary-text-color;\n }\n }\n }\n }\n}\n\n.trends {\n &__header {\n color: $dark-text-color;\n background: lighten($ui-base-color, 2%);\n border-bottom: 1px solid darken($ui-base-color, 4%);\n font-weight: 500;\n padding: 15px;\n font-size: 16px;\n cursor: default;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n &__item {\n display: flex;\n align-items: center;\n padding: 15px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &:last-child {\n border-bottom: 0;\n }\n\n &__name {\n flex: 1 1 auto;\n color: $dark-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n strong {\n font-weight: 500;\n }\n\n a {\n color: $darker-text-color;\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:hover,\n &:focus,\n &:active {\n span {\n text-decoration: underline;\n }\n }\n }\n }\n\n &__current {\n flex: 0 0 auto;\n font-size: 24px;\n line-height: 36px;\n font-weight: 500;\n text-align: right;\n padding-right: 15px;\n margin-left: 5px;\n color: $secondary-text-color;\n }\n\n &__sparkline {\n flex: 0 0 auto;\n width: 50px;\n\n path:first-child {\n fill: rgba($highlight-text-color, 0.25) !important;\n fill-opacity: 1 !important;\n }\n\n path:last-child {\n stroke: lighten($highlight-text-color, 6%) !important;\n }\n }\n }\n}\n\n.conversation {\n display: flex;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n padding: 5px;\n padding-bottom: 0;\n\n &:focus {\n background: lighten($ui-base-color, 2%);\n outline: 0;\n }\n\n &__avatar {\n flex: 0 0 auto;\n padding: 10px;\n padding-top: 12px;\n position: relative;\n cursor: pointer;\n }\n\n &__unread {\n display: inline-block;\n background: $highlight-text-color;\n border-radius: 50%;\n width: 0.625rem;\n height: 0.625rem;\n margin: -.1ex .15em .1ex;\n }\n\n &__content {\n flex: 1 1 auto;\n padding: 10px 5px;\n padding-right: 15px;\n overflow: hidden;\n\n &__info {\n overflow: hidden;\n display: flex;\n flex-direction: row-reverse;\n justify-content: space-between;\n }\n\n &__relative-time {\n font-size: 15px;\n color: $darker-text-color;\n padding-left: 15px;\n }\n\n &__names {\n color: $darker-text-color;\n font-size: 15px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-bottom: 4px;\n flex-basis: 90px;\n flex-grow: 1;\n\n a {\n color: $primary-text-color;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n }\n\n a {\n word-break: break-word;\n }\n }\n\n &--unread {\n background: lighten($ui-base-color, 2%);\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n .conversation__content__info {\n font-weight: 700;\n }\n\n .conversation__content__relative-time {\n color: $primary-text-color;\n }\n }\n}\n\n.announcements {\n background: lighten($ui-base-color, 8%);\n font-size: 13px;\n display: flex;\n align-items: flex-end;\n\n &__mastodon {\n width: 124px;\n flex: 0 0 auto;\n\n @media screen and (max-width: 124px + 300px) {\n display: none;\n }\n }\n\n &__container {\n width: calc(100% - 124px);\n flex: 0 0 auto;\n position: relative;\n\n @media screen and (max-width: 124px + 300px) {\n width: 100%;\n }\n }\n\n &__item {\n box-sizing: border-box;\n width: 100%;\n padding: 15px;\n position: relative;\n font-size: 15px;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n max-height: 50vh;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n\n &__range {\n display: block;\n font-weight: 500;\n margin-bottom: 10px;\n padding-right: 18px;\n }\n\n &__unread {\n position: absolute;\n top: 19px;\n right: 19px;\n display: block;\n background: $highlight-text-color;\n border-radius: 50%;\n width: 0.625rem;\n height: 0.625rem;\n }\n }\n\n &__pagination {\n padding: 15px;\n color: $darker-text-color;\n position: absolute;\n bottom: 3px;\n right: 0;\n }\n}\n\n.layout-multiple-columns .announcements__mastodon {\n display: none;\n}\n\n.layout-multiple-columns .announcements__container {\n width: 100%;\n}\n\n.reactions-bar {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n margin-top: 15px;\n margin-left: -2px;\n width: calc(100% - (90px - 33px));\n\n &__item {\n flex-shrink: 0;\n background: lighten($ui-base-color, 12%);\n border: 0;\n border-radius: 3px;\n margin: 2px;\n cursor: pointer;\n user-select: none;\n padding: 0 6px;\n display: flex;\n align-items: center;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &__emoji {\n display: block;\n margin: 3px 0;\n width: 16px;\n height: 16px;\n\n img {\n display: block;\n margin: 0;\n width: 100%;\n height: 100%;\n min-width: auto;\n min-height: auto;\n vertical-align: bottom;\n object-fit: contain;\n }\n }\n\n &__count {\n display: block;\n min-width: 9px;\n font-size: 13px;\n font-weight: 500;\n text-align: center;\n margin-left: 6px;\n color: $darker-text-color;\n }\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 16%);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n\n &__count {\n color: lighten($darker-text-color, 4%);\n }\n }\n\n &.active {\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n background-color: mix(lighten($ui-base-color, 12%), $ui-highlight-color, 80%);\n\n .reactions-bar__item__count {\n color: lighten($highlight-text-color, 8%);\n }\n }\n }\n\n .emoji-picker-dropdown {\n margin: 2px;\n }\n\n &:hover .emoji-button {\n opacity: 0.85;\n }\n\n .emoji-button {\n color: $darker-text-color;\n margin: 0;\n font-size: 16px;\n width: auto;\n flex-shrink: 0;\n padding: 0 6px;\n height: 22px;\n display: flex;\n align-items: center;\n opacity: 0.5;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &:hover,\n &:active,\n &:focus {\n opacity: 1;\n color: lighten($darker-text-color, 4%);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n }\n }\n\n &--empty {\n .emoji-button {\n padding: 0;\n }\n }\n}\n",null,"@mixin avatar-radius {\n border-radius: 4px;\n background: transparent no-repeat;\n background-position: 50%;\n background-clip: padding-box;\n}\n\n@mixin avatar-size($size: 48px) {\n width: $size;\n height: $size;\n background-size: $size $size;\n}\n\n@mixin search-input {\n outline: 0;\n box-sizing: border-box;\n width: 100%;\n border: 0;\n box-shadow: none;\n font-family: inherit;\n background: $ui-base-color;\n color: $darker-text-color;\n font-size: 14px;\n margin: 0;\n}\n\n@mixin search-popout {\n background: $simple-background-color;\n border-radius: 4px;\n padding: 10px 14px;\n padding-bottom: 14px;\n margin-top: 10px;\n color: $light-text-color;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n\n h4 {\n text-transform: uppercase;\n color: $light-text-color;\n font-size: 13px;\n font-weight: 500;\n margin-bottom: 10px;\n }\n\n li {\n padding: 4px 0;\n }\n\n ul {\n margin-bottom: 10px;\n }\n\n em {\n font-weight: 500;\n color: $inverted-text-color;\n }\n}\n",".poll {\n margin-top: 16px;\n font-size: 14px;\n\n li {\n margin-bottom: 10px;\n position: relative;\n }\n\n &__chart {\n border-radius: 4px;\n display: block;\n background: darken($ui-primary-color, 5%);\n height: 5px;\n min-width: 1%;\n\n &.leading {\n background: $ui-highlight-color;\n }\n }\n\n &__option {\n position: relative;\n display: flex;\n padding: 6px 0;\n line-height: 18px;\n cursor: default;\n overflow: hidden;\n\n &__text {\n display: inline-block;\n word-wrap: break-word;\n overflow-wrap: break-word;\n max-width: calc(100% - 45px - 25px);\n }\n\n input[type=radio],\n input[type=checkbox] {\n display: none;\n }\n\n .autossugest-input {\n flex: 1 1 auto;\n }\n\n input[type=text] {\n display: block;\n box-sizing: border-box;\n width: 100%;\n font-size: 14px;\n color: $inverted-text-color;\n outline: 0;\n font-family: inherit;\n background: $simple-background-color;\n border: 1px solid darken($simple-background-color, 14%);\n border-radius: 4px;\n padding: 6px 10px;\n\n &:focus {\n border-color: $highlight-text-color;\n }\n }\n\n &.selectable {\n cursor: pointer;\n }\n\n &.editable {\n display: flex;\n align-items: center;\n overflow: visible;\n }\n }\n\n &__input {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 50%;\n vertical-align: middle;\n margin-top: auto;\n margin-bottom: auto;\n flex: 0 0 18px;\n\n &.checkbox {\n border-radius: 4px;\n }\n\n &.active {\n border-color: $valid-value-color;\n background: $valid-value-color;\n }\n\n &:active,\n &:focus,\n &:hover {\n border-color: lighten($valid-value-color, 15%);\n border-width: 4px;\n }\n\n &::-moz-focus-inner {\n outline: 0 !important;\n border: 0;\n }\n\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n\n &__number {\n display: inline-block;\n width: 45px;\n font-weight: 700;\n flex: 0 0 45px;\n }\n\n &__voted {\n padding: 0 5px;\n display: inline-block;\n\n &__mark {\n font-size: 18px;\n }\n }\n\n &__footer {\n padding-top: 6px;\n padding-bottom: 5px;\n color: $dark-text-color;\n }\n\n &__link {\n display: inline;\n background: transparent;\n padding: 0;\n margin: 0;\n border: 0;\n color: $dark-text-color;\n text-decoration: underline;\n font-size: inherit;\n\n &:hover {\n text-decoration: none;\n }\n\n &:active,\n &:focus {\n background-color: rgba($dark-text-color, .1);\n }\n }\n\n .button {\n height: 36px;\n padding: 0 16px;\n margin-right: 10px;\n font-size: 14px;\n }\n}\n\n.compose-form__poll-wrapper {\n border-top: 1px solid darken($simple-background-color, 8%);\n\n ul {\n padding: 10px;\n }\n\n .poll__footer {\n border-top: 1px solid darken($simple-background-color, 8%);\n padding: 10px;\n display: flex;\n align-items: center;\n\n button,\n select {\n flex: 1 1 50%;\n\n &:focus {\n border-color: $highlight-text-color;\n }\n }\n }\n\n .button.button-secondary {\n font-size: 14px;\n font-weight: 400;\n padding: 6px 10px;\n height: auto;\n line-height: inherit;\n color: $action-button-color;\n border-color: $action-button-color;\n margin-right: 5px;\n }\n\n li {\n display: flex;\n align-items: center;\n\n .poll__option {\n flex: 0 0 auto;\n width: calc(100% - (23px + 6px));\n margin-right: 6px;\n }\n }\n\n select {\n appearance: none;\n box-sizing: border-box;\n font-size: 14px;\n color: $inverted-text-color;\n display: inline-block;\n width: auto;\n outline: 0;\n font-family: inherit;\n background: $simple-background-color url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center / auto 16px;\n border: 1px solid darken($simple-background-color, 14%);\n border-radius: 4px;\n padding: 6px 10px;\n padding-right: 30px;\n }\n\n .icon-button.disabled {\n color: darken($simple-background-color, 14%);\n }\n}\n\n.muted .poll {\n color: $dark-text-color;\n\n &__chart {\n background: rgba(darken($ui-primary-color, 14%), 0.2);\n\n &.leading {\n background: rgba($ui-highlight-color, 0.2);\n }\n }\n}\n",".modal-layout {\n background: $ui-base-color url('data:image/svg+xml;utf8,') repeat-x bottom fixed;\n display: flex;\n flex-direction: column;\n height: 100vh;\n padding: 0;\n}\n\n.modal-layout__mastodon {\n display: flex;\n flex: 1;\n flex-direction: column;\n justify-content: flex-end;\n\n > * {\n flex: 1;\n max-height: 235px;\n }\n}\n\n@media screen and (max-width: 600px) {\n .account-header {\n margin-top: 0;\n }\n}\n",".emoji-mart {\n font-size: 13px;\n display: inline-block;\n color: $inverted-text-color;\n\n &,\n * {\n box-sizing: border-box;\n line-height: 1.15;\n }\n\n .emoji-mart-emoji {\n padding: 6px;\n }\n}\n\n.emoji-mart-bar {\n border: 0 solid darken($ui-secondary-color, 8%);\n\n &:first-child {\n border-bottom-width: 1px;\n border-top-left-radius: 5px;\n border-top-right-radius: 5px;\n background: $ui-secondary-color;\n }\n\n &:last-child {\n border-top-width: 1px;\n border-bottom-left-radius: 5px;\n border-bottom-right-radius: 5px;\n display: none;\n }\n}\n\n.emoji-mart-anchors {\n display: flex;\n justify-content: space-between;\n padding: 0 6px;\n color: $lighter-text-color;\n line-height: 0;\n}\n\n.emoji-mart-anchor {\n position: relative;\n flex: 1;\n text-align: center;\n padding: 12px 4px;\n overflow: hidden;\n transition: color .1s ease-out;\n cursor: pointer;\n\n &:hover {\n color: darken($lighter-text-color, 4%);\n }\n}\n\n.emoji-mart-anchor-selected {\n color: $highlight-text-color;\n\n &:hover {\n color: darken($highlight-text-color, 4%);\n }\n\n .emoji-mart-anchor-bar {\n bottom: -1px;\n }\n}\n\n.emoji-mart-anchor-bar {\n position: absolute;\n bottom: -5px;\n left: 0;\n width: 100%;\n height: 4px;\n background-color: $highlight-text-color;\n}\n\n.emoji-mart-anchors {\n i {\n display: inline-block;\n width: 100%;\n max-width: 22px;\n }\n\n svg {\n fill: currentColor;\n max-height: 18px;\n }\n}\n\n.emoji-mart-scroll {\n overflow-y: scroll;\n height: 270px;\n max-height: 35vh;\n padding: 0 6px 6px;\n background: $simple-background-color;\n will-change: transform;\n\n &::-webkit-scrollbar-track:hover,\n &::-webkit-scrollbar-track:active {\n background-color: rgba($base-overlay-background, 0.3);\n }\n}\n\n.emoji-mart-search {\n padding: 10px;\n padding-right: 45px;\n background: $simple-background-color;\n\n input {\n font-size: 14px;\n font-weight: 400;\n padding: 7px 9px;\n font-family: inherit;\n display: block;\n width: 100%;\n background: rgba($ui-secondary-color, 0.3);\n color: $inverted-text-color;\n border: 1px solid $ui-secondary-color;\n border-radius: 4px;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n}\n\n.emoji-mart-category .emoji-mart-emoji {\n cursor: pointer;\n\n span {\n z-index: 1;\n position: relative;\n text-align: center;\n }\n\n &:hover::before {\n z-index: 0;\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba($ui-secondary-color, 0.7);\n border-radius: 100%;\n }\n}\n\n.emoji-mart-category-label {\n z-index: 2;\n position: relative;\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n\n span {\n display: block;\n width: 100%;\n font-weight: 500;\n padding: 5px 6px;\n background: $simple-background-color;\n }\n}\n\n.emoji-mart-emoji {\n position: relative;\n display: inline-block;\n font-size: 0;\n\n span {\n width: 22px;\n height: 22px;\n }\n}\n\n.emoji-mart-no-results {\n font-size: 14px;\n text-align: center;\n padding-top: 70px;\n color: $light-text-color;\n\n .emoji-mart-category-label {\n display: none;\n }\n\n .emoji-mart-no-results-label {\n margin-top: .2em;\n }\n\n .emoji-mart-emoji:hover::before {\n content: none;\n }\n}\n\n.emoji-mart-preview {\n display: none;\n}\n","$maximum-width: 1235px;\n$fluid-breakpoint: $maximum-width + 20px;\n$column-breakpoint: 700px;\n$small-breakpoint: 960px;\n\n.container {\n box-sizing: border-box;\n max-width: $maximum-width;\n margin: 0 auto;\n position: relative;\n\n @media screen and (max-width: $fluid-breakpoint) {\n width: 100%;\n padding: 0 10px;\n }\n}\n\n.rich-formatting {\n font-family: $font-sans-serif, sans-serif;\n font-size: 14px;\n font-weight: 400;\n line-height: 1.7;\n word-wrap: break-word;\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n p,\n li {\n color: $darker-text-color;\n }\n\n p {\n margin-top: 0;\n margin-bottom: .85em;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n strong {\n font-weight: 700;\n color: $secondary-text-color;\n }\n\n em {\n font-style: italic;\n color: $secondary-text-color;\n }\n\n code {\n font-size: 0.85em;\n background: darken($ui-base-color, 8%);\n border-radius: 4px;\n padding: 0.2em 0.3em;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n font-family: $font-display, sans-serif;\n margin-top: 1.275em;\n margin-bottom: .85em;\n font-weight: 500;\n color: $secondary-text-color;\n }\n\n h1 {\n font-size: 2em;\n }\n\n h2 {\n font-size: 1.75em;\n }\n\n h3 {\n font-size: 1.5em;\n }\n\n h4 {\n font-size: 1.25em;\n }\n\n h5,\n h6 {\n font-size: 1em;\n }\n\n ul {\n list-style: disc;\n }\n\n ol {\n list-style: decimal;\n }\n\n ul,\n ol {\n margin: 0;\n padding: 0;\n padding-left: 2em;\n margin-bottom: 0.85em;\n\n &[type='a'] {\n list-style-type: lower-alpha;\n }\n\n &[type='i'] {\n list-style-type: lower-roman;\n }\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n margin: 1.7em 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n\n table {\n width: 100%;\n border-collapse: collapse;\n break-inside: auto;\n margin-top: 24px;\n margin-bottom: 32px;\n\n thead tr,\n tbody tr {\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n font-size: 1em;\n line-height: 1.625;\n font-weight: 400;\n text-align: left;\n color: $darker-text-color;\n }\n\n thead tr {\n border-bottom-width: 2px;\n line-height: 1.5;\n font-weight: 500;\n color: $dark-text-color;\n }\n\n th,\n td {\n padding: 8px;\n align-self: start;\n align-items: start;\n word-break: break-all;\n\n &.nowrap {\n width: 25%;\n position: relative;\n\n &::before {\n content: ' ';\n visibility: hidden;\n }\n\n span {\n position: absolute;\n left: 8px;\n right: 8px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n }\n\n & > :first-child {\n margin-top: 0;\n }\n}\n\n.information-board {\n background: darken($ui-base-color, 4%);\n padding: 20px 0;\n\n .container-alt {\n position: relative;\n padding-right: 280px + 15px;\n }\n\n &__sections {\n display: flex;\n justify-content: space-between;\n flex-wrap: wrap;\n }\n\n &__section {\n flex: 1 0 0;\n font-family: $font-sans-serif, sans-serif;\n font-size: 16px;\n line-height: 28px;\n color: $primary-text-color;\n text-align: right;\n padding: 10px 15px;\n\n span,\n strong {\n display: block;\n }\n\n span {\n &:last-child {\n color: $secondary-text-color;\n }\n }\n\n strong {\n font-family: $font-display, sans-serif;\n font-weight: 500;\n font-size: 32px;\n line-height: 48px;\n }\n\n @media screen and (max-width: $column-breakpoint) {\n text-align: center;\n }\n }\n\n .panel {\n position: absolute;\n width: 280px;\n box-sizing: border-box;\n background: darken($ui-base-color, 8%);\n padding: 20px;\n padding-top: 10px;\n border-radius: 4px 4px 0 0;\n right: 0;\n bottom: -40px;\n\n .panel-header {\n font-family: $font-display, sans-serif;\n font-size: 14px;\n line-height: 24px;\n font-weight: 500;\n color: $darker-text-color;\n padding-bottom: 5px;\n margin-bottom: 15px;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n\n a,\n span {\n font-weight: 400;\n color: darken($darker-text-color, 10%);\n }\n\n a {\n text-decoration: none;\n }\n }\n }\n\n .owner {\n text-align: center;\n\n .avatar {\n width: 80px;\n height: 80px;\n margin: 0 auto;\n margin-bottom: 15px;\n\n img {\n display: block;\n width: 80px;\n height: 80px;\n border-radius: 48px;\n }\n }\n\n .name {\n font-size: 14px;\n\n a {\n display: block;\n color: $primary-text-color;\n text-decoration: none;\n\n &:hover {\n .display_name {\n text-decoration: underline;\n }\n }\n }\n\n .username {\n display: block;\n color: $darker-text-color;\n }\n }\n }\n}\n\n.landing-page {\n p,\n li {\n font-family: $font-sans-serif, sans-serif;\n font-size: 16px;\n font-weight: 400;\n font-size: 16px;\n line-height: 30px;\n margin-bottom: 12px;\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n }\n }\n\n em {\n display: inline;\n margin: 0;\n padding: 0;\n font-weight: 700;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n color: lighten($darker-text-color, 10%);\n }\n\n h1 {\n font-family: $font-display, sans-serif;\n font-size: 26px;\n line-height: 30px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n\n small {\n font-family: $font-sans-serif, sans-serif;\n display: block;\n font-size: 18px;\n font-weight: 400;\n color: lighten($darker-text-color, 10%);\n }\n }\n\n h2 {\n font-family: $font-display, sans-serif;\n font-size: 22px;\n line-height: 26px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h3 {\n font-family: $font-display, sans-serif;\n font-size: 18px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h4 {\n font-family: $font-display, sans-serif;\n font-size: 16px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h5 {\n font-family: $font-display, sans-serif;\n font-size: 14px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h6 {\n font-family: $font-display, sans-serif;\n font-size: 12px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n ul,\n ol {\n margin-left: 20px;\n\n &[type='a'] {\n list-style-type: lower-alpha;\n }\n\n &[type='i'] {\n list-style-type: lower-roman;\n }\n }\n\n ul {\n list-style: disc;\n }\n\n ol {\n list-style: decimal;\n }\n\n li > ol,\n li > ul {\n margin-top: 6px;\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid rgba($ui-base-lighter-color, .6);\n margin: 20px 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n\n &__information,\n &__forms {\n padding: 20px;\n }\n\n &__call-to-action {\n background: $ui-base-color;\n border-radius: 4px;\n padding: 25px 40px;\n overflow: hidden;\n box-sizing: border-box;\n\n .row {\n width: 100%;\n display: flex;\n flex-direction: row-reverse;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n }\n\n .row__information-board {\n display: flex;\n justify-content: flex-end;\n align-items: flex-end;\n\n .information-board__section {\n flex: 1 0 auto;\n padding: 0 10px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n width: 100%;\n justify-content: space-between;\n }\n }\n\n .row__mascot {\n flex: 1;\n margin: 10px -50px 0 0;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n }\n\n &__logo {\n margin-right: 20px;\n\n img {\n height: 50px;\n width: auto;\n mix-blend-mode: lighten;\n }\n }\n\n &__information {\n padding: 45px 40px;\n margin-bottom: 10px;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n strong {\n font-weight: 500;\n color: lighten($darker-text-color, 10%);\n }\n\n .account {\n border-bottom: 0;\n padding: 0;\n\n &__display-name {\n align-items: center;\n display: flex;\n margin-right: 5px;\n }\n\n div.account__display-name {\n &:hover {\n .display-name strong {\n text-decoration: none;\n }\n }\n\n .account__avatar {\n cursor: default;\n }\n }\n\n &__avatar-wrapper {\n margin-left: 0;\n flex: 0 0 auto;\n }\n\n &__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n\n .display-name {\n font-size: 15px;\n\n &__account {\n font-size: 14px;\n }\n }\n }\n\n @media screen and (max-width: $small-breakpoint) {\n .contact {\n margin-top: 30px;\n }\n }\n\n @media screen and (max-width: $column-breakpoint) {\n padding: 25px 20px;\n }\n }\n\n &__information,\n &__forms,\n #mastodon-timeline {\n box-sizing: border-box;\n background: $ui-base-color;\n border-radius: 4px;\n box-shadow: 0 0 6px rgba($black, 0.1);\n }\n\n &__mascot {\n height: 104px;\n position: relative;\n left: -40px;\n bottom: 25px;\n\n img {\n height: 190px;\n width: auto;\n }\n }\n\n &__short-description {\n .row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n margin-bottom: 40px;\n }\n\n @media screen and (max-width: $column-breakpoint) {\n .row {\n margin-bottom: 20px;\n }\n }\n\n p a {\n color: $secondary-text-color;\n }\n\n h1 {\n font-weight: 500;\n color: $primary-text-color;\n margin-bottom: 0;\n\n small {\n color: $darker-text-color;\n\n span {\n color: $secondary-text-color;\n }\n }\n }\n\n p:last-child {\n margin-bottom: 0;\n }\n }\n\n &__hero {\n margin-bottom: 10px;\n\n img {\n display: block;\n margin: 0;\n max-width: 100%;\n height: auto;\n border-radius: 4px;\n }\n }\n\n @media screen and (max-width: 840px) {\n .information-board {\n .container-alt {\n padding-right: 20px;\n }\n\n .panel {\n position: static;\n margin-top: 20px;\n width: 100%;\n border-radius: 4px;\n\n .panel-header {\n text-align: center;\n }\n }\n }\n }\n\n @media screen and (max-width: 675px) {\n .header-wrapper {\n padding-top: 0;\n\n &.compact {\n padding-bottom: 0;\n }\n\n &.compact .hero .heading {\n text-align: initial;\n }\n }\n\n .header .container-alt,\n .features .container-alt {\n display: block;\n }\n }\n\n .cta {\n margin: 20px;\n }\n}\n\n.landing {\n margin-bottom: 100px;\n\n @media screen and (max-width: 738px) {\n margin-bottom: 0;\n }\n\n &__brand {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 50px;\n\n svg {\n fill: $primary-text-color;\n height: 52px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding: 0;\n margin-bottom: 30px;\n }\n }\n\n .directory {\n margin-top: 30px;\n background: transparent;\n box-shadow: none;\n border-radius: 0;\n }\n\n .hero-widget {\n margin-top: 30px;\n margin-bottom: 0;\n\n h4 {\n padding: 10px;\n text-transform: uppercase;\n font-weight: 700;\n font-size: 13px;\n color: $darker-text-color;\n }\n\n &__text {\n border-radius: 0;\n padding-bottom: 0;\n }\n\n &__footer {\n background: $ui-base-color;\n padding: 10px;\n border-radius: 0 0 4px 4px;\n display: flex;\n\n &__column {\n flex: 1 1 50%;\n }\n }\n\n .account {\n padding: 10px 0;\n border-bottom: 0;\n\n .account__display-name {\n display: flex;\n align-items: center;\n }\n\n .account__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n }\n\n &__counter {\n padding: 10px;\n\n strong {\n font-family: $font-display, sans-serif;\n font-size: 15px;\n font-weight: 700;\n display: block;\n }\n\n span {\n font-size: 14px;\n color: $darker-text-color;\n }\n }\n }\n\n .simple_form .user_agreement .label_input > label {\n font-weight: 400;\n color: $darker-text-color;\n }\n\n .simple_form p.lead {\n color: $darker-text-color;\n font-size: 15px;\n line-height: 20px;\n font-weight: 400;\n margin-bottom: 25px;\n }\n\n &__grid {\n max-width: 960px;\n margin: 0 auto;\n display: grid;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n grid-gap: 30px;\n\n @media screen and (max-width: 738px) {\n grid-template-columns: minmax(0, 100%);\n grid-gap: 10px;\n\n &__column-login {\n grid-row: 1;\n display: flex;\n flex-direction: column;\n\n .box-widget {\n order: 2;\n flex: 0 0 auto;\n }\n\n .hero-widget {\n margin-top: 0;\n margin-bottom: 10px;\n order: 1;\n flex: 0 0 auto;\n }\n }\n\n &__column-registration {\n grid-row: 2;\n }\n\n .directory {\n margin-top: 10px;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n\n .hero-widget {\n display: block;\n margin-bottom: 0;\n box-shadow: none;\n\n &__img,\n &__img img,\n &__footer {\n border-radius: 0;\n }\n }\n\n .hero-widget,\n .box-widget,\n .directory__tag {\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n .directory {\n margin-top: 0;\n\n &__tag {\n margin-bottom: 0;\n\n & > a,\n & > div {\n border-radius: 0;\n box-shadow: none;\n }\n\n &:last-child {\n border-bottom: 0;\n }\n }\n }\n }\n }\n}\n\n.brand {\n position: relative;\n text-decoration: none;\n}\n\n.brand__tagline {\n display: block;\n position: absolute;\n bottom: -10px;\n left: 50px;\n width: 300px;\n color: $ui-primary-color;\n text-decoration: none;\n font-size: 14px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n position: static;\n width: auto;\n margin-top: 20px;\n color: $dark-text-color;\n }\n}\n\n",".table {\n width: 100%;\n max-width: 100%;\n border-spacing: 0;\n border-collapse: collapse;\n\n th,\n td {\n padding: 8px;\n line-height: 18px;\n vertical-align: top;\n border-top: 1px solid $ui-base-color;\n text-align: left;\n background: darken($ui-base-color, 4%);\n }\n\n & > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid $ui-base-color;\n border-top: 0;\n font-weight: 500;\n }\n\n & > tbody > tr > th {\n font-weight: 500;\n }\n\n & > tbody > tr:nth-child(odd) > td,\n & > tbody > tr:nth-child(odd) > th {\n background: $ui-base-color;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n &.inline-table {\n & > tbody > tr:nth-child(odd) {\n & > td,\n & > th {\n background: transparent;\n }\n }\n\n & > tbody > tr:first-child {\n & > td,\n & > th {\n border-top: 0;\n }\n }\n }\n\n &.batch-table {\n & > thead > tr > th {\n background: $ui-base-color;\n border-top: 1px solid darken($ui-base-color, 8%);\n border-bottom: 1px solid darken($ui-base-color, 8%);\n\n &:first-child {\n border-radius: 4px 0 0;\n border-left: 1px solid darken($ui-base-color, 8%);\n }\n\n &:last-child {\n border-radius: 0 4px 0 0;\n border-right: 1px solid darken($ui-base-color, 8%);\n }\n }\n }\n\n &--invites tbody td {\n vertical-align: middle;\n }\n}\n\n.table-wrapper {\n overflow: auto;\n margin-bottom: 20px;\n}\n\nsamp {\n font-family: $font-monospace, monospace;\n}\n\nbutton.table-action-link {\n background: transparent;\n border: 0;\n font: inherit;\n}\n\nbutton.table-action-link,\na.table-action-link {\n text-decoration: none;\n display: inline-block;\n margin-right: 5px;\n padding: 0 10px;\n color: $darker-text-color;\n font-weight: 500;\n\n &:hover {\n color: $primary-text-color;\n }\n\n i.fa {\n font-weight: 400;\n margin-right: 5px;\n }\n\n &:first-child {\n padding-left: 0;\n }\n}\n\n.batch-table {\n &__toolbar,\n &__row {\n display: flex;\n\n &__select {\n box-sizing: border-box;\n padding: 8px 16px;\n cursor: pointer;\n min-height: 100%;\n\n input {\n margin-top: 8px;\n }\n\n &--aligned {\n display: flex;\n align-items: center;\n\n input {\n margin-top: 0;\n }\n }\n }\n\n &__actions,\n &__content {\n padding: 8px 0;\n padding-right: 16px;\n flex: 1 1 auto;\n }\n }\n\n &__toolbar {\n border: 1px solid darken($ui-base-color, 8%);\n background: $ui-base-color;\n border-radius: 4px 0 0;\n height: 47px;\n align-items: center;\n\n &__actions {\n text-align: right;\n padding-right: 16px - 5px;\n }\n }\n\n &__form {\n padding: 16px;\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n background: $ui-base-color;\n\n .fields-row {\n padding-top: 0;\n margin-bottom: 0;\n }\n }\n\n &__row {\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n background: darken($ui-base-color, 4%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n .optional &:first-child {\n border-top: 1px solid darken($ui-base-color, 8%);\n }\n }\n\n &:hover {\n background: darken($ui-base-color, 2%);\n }\n\n &:nth-child(even) {\n background: $ui-base-color;\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n }\n\n &__content {\n padding-top: 12px;\n padding-bottom: 16px;\n\n &--unpadded {\n padding: 0;\n }\n\n &--with-image {\n display: flex;\n align-items: center;\n }\n\n &__image {\n flex: 0 0 auto;\n display: flex;\n justify-content: center;\n align-items: center;\n margin-right: 10px;\n\n .emojione {\n width: 32px;\n height: 32px;\n }\n }\n\n &__text {\n flex: 1 1 auto;\n }\n\n &__extra {\n flex: 0 0 auto;\n text-align: right;\n color: $darker-text-color;\n font-weight: 500;\n }\n }\n\n .directory__tag {\n margin: 0;\n width: 100%;\n\n a {\n background: transparent;\n border-radius: 0;\n }\n }\n }\n\n &.optional .batch-table__toolbar,\n &.optional .batch-table__row__select {\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n\n .status__content {\n padding-top: 0;\n\n summary {\n display: list-item;\n }\n\n strong {\n font-weight: 700;\n }\n }\n\n .nothing-here {\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n box-shadow: none;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 1px solid darken($ui-base-color, 8%);\n }\n }\n\n @media screen and (max-width: 870px) {\n .accounts-table tbody td.optional {\n display: none;\n }\n }\n}\n","$no-columns-breakpoint: 600px;\n$sidebar-width: 240px;\n$content-width: 840px;\n\n.admin-wrapper {\n display: flex;\n justify-content: center;\n width: 100%;\n min-height: 100vh;\n\n .sidebar-wrapper {\n min-height: 100vh;\n overflow: hidden;\n pointer-events: none;\n flex: 1 1 auto;\n\n &__inner {\n display: flex;\n justify-content: flex-end;\n background: $ui-base-color;\n height: 100%;\n }\n }\n\n .sidebar {\n width: $sidebar-width;\n padding: 0;\n pointer-events: auto;\n\n &__toggle {\n display: none;\n background: lighten($ui-base-color, 8%);\n height: 48px;\n\n &__logo {\n flex: 1 1 auto;\n\n a {\n display: inline-block;\n padding: 15px;\n }\n\n svg {\n fill: $primary-text-color;\n height: 20px;\n position: relative;\n bottom: -2px;\n }\n }\n\n &__icon {\n display: block;\n color: $darker-text-color;\n text-decoration: none;\n flex: 0 0 auto;\n font-size: 20px;\n padding: 15px;\n }\n\n a {\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 12%);\n }\n }\n }\n\n .logo {\n display: block;\n margin: 40px auto;\n width: 100px;\n height: 100px;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n & > a:first-child {\n display: none;\n }\n }\n\n ul {\n list-style: none;\n border-radius: 4px 0 0 4px;\n overflow: hidden;\n margin-bottom: 20px;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n margin-bottom: 0;\n }\n\n a {\n display: block;\n padding: 15px;\n color: $darker-text-color;\n text-decoration: none;\n transition: all 200ms linear;\n transition-property: color, background-color;\n border-radius: 4px 0 0 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n i.fa {\n margin-right: 5px;\n }\n\n &:hover {\n color: $primary-text-color;\n background-color: darken($ui-base-color, 5%);\n transition: all 100ms linear;\n transition-property: color, background-color;\n }\n\n &.selected {\n background: darken($ui-base-color, 2%);\n border-radius: 4px 0 0;\n }\n }\n\n ul {\n background: darken($ui-base-color, 4%);\n border-radius: 0 0 0 4px;\n margin: 0;\n\n a {\n border: 0;\n padding: 15px 35px;\n }\n }\n\n .simple-navigation-active-leaf a {\n color: $primary-text-color;\n background-color: $ui-highlight-color;\n border-bottom: 0;\n border-radius: 0;\n\n &:hover {\n background-color: lighten($ui-highlight-color, 5%);\n }\n }\n }\n\n & > ul > .simple-navigation-active-leaf a {\n border-radius: 4px 0 0 4px;\n }\n }\n\n .content-wrapper {\n box-sizing: border-box;\n width: 100%;\n max-width: $content-width;\n flex: 1 1 auto;\n }\n\n @media screen and (max-width: $content-width + $sidebar-width) {\n .sidebar-wrapper--empty {\n display: none;\n }\n\n .sidebar-wrapper {\n width: $sidebar-width;\n flex: 0 0 auto;\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n .sidebar-wrapper {\n width: 100%;\n }\n }\n\n .content {\n padding: 20px 15px;\n padding-top: 60px;\n padding-left: 25px;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n max-width: none;\n padding: 15px;\n padding-top: 30px;\n }\n\n &-heading {\n display: flex;\n\n padding-bottom: 40px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n margin: -15px -15px 40px 0;\n\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n\n & > * {\n margin-top: 15px;\n margin-right: 15px;\n }\n\n &-actions {\n display: inline-flex;\n\n & > :not(:first-child) {\n margin-left: 5px;\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n border-bottom: 0;\n padding-bottom: 0;\n }\n }\n\n h2 {\n color: $secondary-text-color;\n font-size: 24px;\n line-height: 28px;\n font-weight: 400;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n font-weight: 700;\n }\n }\n\n h3 {\n color: $secondary-text-color;\n font-size: 20px;\n line-height: 28px;\n font-weight: 400;\n margin-bottom: 30px;\n }\n\n h4 {\n text-transform: uppercase;\n font-size: 13px;\n font-weight: 700;\n color: $darker-text-color;\n padding-bottom: 8px;\n margin-bottom: 8px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n h6 {\n font-size: 16px;\n color: $secondary-text-color;\n line-height: 28px;\n font-weight: 500;\n }\n\n .fields-group h6 {\n color: $primary-text-color;\n font-weight: 500;\n }\n\n .directory__tag > a,\n .directory__tag > div {\n box-shadow: none;\n }\n\n .directory__tag .table-action-link .fa {\n color: inherit;\n }\n\n .directory__tag h4 {\n font-size: 18px;\n font-weight: 700;\n color: $primary-text-color;\n text-transform: none;\n padding-bottom: 0;\n margin-bottom: 0;\n border-bottom: 0;\n }\n\n & > p {\n font-size: 14px;\n line-height: 21px;\n color: $secondary-text-color;\n margin-bottom: 20px;\n\n strong {\n color: $primary-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid rgba($ui-base-lighter-color, .6);\n margin: 20px 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n\n .sidebar-wrapper {\n min-height: 0;\n }\n\n .sidebar {\n width: 100%;\n padding: 0;\n height: auto;\n\n &__toggle {\n display: flex;\n }\n\n & > ul {\n display: none;\n }\n\n ul a,\n ul ul a {\n border-radius: 0;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n transition: none;\n\n &:hover {\n transition: none;\n }\n }\n\n ul ul {\n border-radius: 0;\n }\n\n ul .simple-navigation-active-leaf a {\n border-bottom-color: $ui-highlight-color;\n }\n }\n }\n}\n\nhr.spacer {\n width: 100%;\n border: 0;\n margin: 20px 0;\n height: 1px;\n}\n\nbody,\n.admin-wrapper .content {\n .muted-hint {\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n }\n }\n\n .positive-hint {\n color: $valid-value-color;\n font-weight: 500;\n }\n\n .negative-hint {\n color: $error-value-color;\n font-weight: 500;\n }\n\n .neutral-hint {\n color: $dark-text-color;\n font-weight: 500;\n }\n\n .warning-hint {\n color: $gold-star;\n font-weight: 500;\n }\n}\n\n.filters {\n display: flex;\n flex-wrap: wrap;\n\n .filter-subset {\n flex: 0 0 auto;\n margin: 0 40px 20px 0;\n\n &:last-child {\n margin-bottom: 30px;\n }\n\n ul {\n margin-top: 5px;\n list-style: none;\n\n li {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n strong {\n font-weight: 500;\n text-transform: uppercase;\n font-size: 12px;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n &--with-select strong {\n display: block;\n margin-bottom: 10px;\n }\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n text-transform: uppercase;\n font-size: 12px;\n font-weight: 500;\n border-bottom: 2px solid $ui-base-color;\n\n &:hover {\n color: $primary-text-color;\n border-bottom: 2px solid lighten($ui-base-color, 5%);\n }\n\n &.selected {\n color: $highlight-text-color;\n border-bottom: 2px solid $ui-highlight-color;\n }\n }\n }\n}\n\n.flavour-screen {\n display: block;\n margin: 10px auto;\n max-width: 100%;\n}\n\n.flavour-description {\n display: block;\n font-size: 16px;\n margin: 10px 0;\n\n & > p {\n margin: 10px 0;\n }\n}\n\n.flavour-screen {\n display: block;\n margin: 10px auto;\n max-width: 100%;\n}\n\n.flavour-description {\n display: block;\n font-size: 16px;\n margin: 10px 0;\n\n & > p {\n margin: 10px 0;\n }\n}\n\n.report-accounts {\n display: flex;\n flex-wrap: wrap;\n margin-bottom: 20px;\n}\n\n.report-accounts__item {\n display: flex;\n flex: 250px;\n flex-direction: column;\n margin: 0 5px;\n\n & > strong {\n display: block;\n margin: 0 0 10px -5px;\n font-weight: 500;\n font-size: 14px;\n line-height: 18px;\n color: $secondary-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n .account-card {\n flex: 1 1 auto;\n }\n}\n\n.report-status,\n.account-status {\n display: flex;\n margin-bottom: 10px;\n\n .activity-stream {\n flex: 2 0 0;\n margin-right: 20px;\n max-width: calc(100% - 60px);\n\n .entry {\n border-radius: 4px;\n }\n }\n}\n\n.report-status__actions,\n.account-status__actions {\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n\n .icon-button {\n font-size: 24px;\n width: 24px;\n text-align: center;\n margin-bottom: 10px;\n }\n}\n\n.simple_form.new_report_note,\n.simple_form.new_account_moderation_note {\n max-width: 100%;\n}\n\n.batch-form-box {\n display: flex;\n flex-wrap: wrap;\n margin-bottom: 5px;\n\n #form_status_batch_action {\n margin: 0 5px 5px 0;\n font-size: 14px;\n }\n\n input.button {\n margin: 0 5px 5px 0;\n }\n\n .media-spoiler-toggle-buttons {\n margin-left: auto;\n\n .button {\n overflow: visible;\n margin: 0 0 5px 5px;\n float: right;\n }\n }\n}\n\n.back-link {\n margin-bottom: 10px;\n font-size: 14px;\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.spacer {\n flex: 1 1 auto;\n}\n\n.log-entry {\n line-height: 20px;\n padding: 15px 0;\n background: $ui-base-color;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n\n &:last-child {\n border-bottom: 0;\n }\n\n &__header {\n display: flex;\n justify-content: flex-start;\n align-items: center;\n color: $darker-text-color;\n font-size: 14px;\n padding: 0 10px;\n }\n\n &__avatar {\n margin-right: 10px;\n\n .avatar {\n display: block;\n margin: 0;\n border-radius: 50%;\n width: 40px;\n height: 40px;\n }\n }\n\n &__content {\n max-width: calc(100% - 90px);\n }\n\n &__title {\n word-wrap: break-word;\n }\n\n &__timestamp {\n color: $dark-text-color;\n }\n\n a,\n .username,\n .target {\n color: $secondary-text-color;\n text-decoration: none;\n font-weight: 500;\n }\n}\n\na.name-tag,\n.name-tag,\na.inline-name-tag,\n.inline-name-tag {\n text-decoration: none;\n color: $secondary-text-color;\n\n .username {\n font-weight: 500;\n }\n\n &.suspended {\n .username {\n text-decoration: line-through;\n color: lighten($error-red, 12%);\n }\n\n .avatar {\n filter: grayscale(100%);\n opacity: 0.8;\n }\n }\n}\n\na.name-tag,\n.name-tag {\n display: flex;\n align-items: center;\n\n .avatar {\n display: block;\n margin: 0;\n margin-right: 5px;\n border-radius: 50%;\n }\n\n &.suspended {\n .avatar {\n filter: grayscale(100%);\n opacity: 0.8;\n }\n }\n}\n\n.speech-bubble {\n margin-bottom: 20px;\n border-left: 4px solid $ui-highlight-color;\n\n &.positive {\n border-left-color: $success-green;\n }\n\n &.negative {\n border-left-color: lighten($error-red, 12%);\n }\n\n &.warning {\n border-left-color: $gold-star;\n }\n\n &__bubble {\n padding: 16px;\n padding-left: 14px;\n font-size: 15px;\n line-height: 20px;\n border-radius: 4px 4px 4px 0;\n position: relative;\n font-weight: 500;\n\n a {\n color: $darker-text-color;\n }\n }\n\n &__owner {\n padding: 8px;\n padding-left: 12px;\n }\n\n time {\n color: $dark-text-color;\n }\n}\n\n.report-card {\n background: $ui-base-color;\n border-radius: 4px;\n margin-bottom: 20px;\n\n &__profile {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 15px;\n\n .account {\n padding: 0;\n border: 0;\n\n &__avatar-wrapper {\n margin-left: 0;\n }\n }\n\n &__stats {\n flex: 0 0 auto;\n font-weight: 500;\n color: $darker-text-color;\n text-transform: uppercase;\n text-align: right;\n\n a {\n color: inherit;\n text-decoration: none;\n\n &:focus,\n &:hover,\n &:active {\n color: lighten($darker-text-color, 8%);\n }\n }\n\n .red {\n color: $error-value-color;\n }\n }\n }\n\n &__summary {\n &__item {\n display: flex;\n justify-content: flex-start;\n border-top: 1px solid darken($ui-base-color, 4%);\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n\n &__reported-by,\n &__assigned {\n padding: 15px;\n flex: 0 0 auto;\n box-sizing: border-box;\n width: 150px;\n color: $darker-text-color;\n\n &,\n .username {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n &__content {\n flex: 1 1 auto;\n max-width: calc(100% - 300px);\n\n &__icon {\n color: $dark-text-color;\n margin-right: 4px;\n font-weight: 500;\n }\n }\n\n &__content a {\n display: block;\n box-sizing: border-box;\n width: 100%;\n padding: 15px;\n text-decoration: none;\n color: $darker-text-color;\n }\n }\n }\n}\n\n.one-line {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.ellipsized-ip {\n display: inline-block;\n max-width: 120px;\n overflow: hidden;\n text-overflow: ellipsis;\n vertical-align: middle;\n}\n\n.admin-account-bio {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n margin-top: 20px;\n\n > div {\n box-sizing: border-box;\n padding: 0 5px;\n margin-bottom: 10px;\n flex: 1 0 50%;\n }\n\n .account__header__fields,\n .account__header__content {\n background: lighten($ui-base-color, 8%);\n border-radius: 4px;\n height: 100%;\n }\n\n .account__header__fields {\n margin: 0;\n border: 0;\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n\n .account__header__content {\n box-sizing: border-box;\n padding: 20px;\n color: $primary-text-color;\n }\n}\n\n.center-text {\n text-align: center;\n}\n\n.announcements-list {\n border: 1px solid lighten($ui-base-color, 4%);\n border-radius: 4px;\n\n &__item {\n padding: 15px 0;\n background: $ui-base-color;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n\n &__title {\n padding: 0 15px;\n display: block;\n font-weight: 500;\n font-size: 18px;\n line-height: 1.5;\n color: $secondary-text-color;\n text-decoration: none;\n margin-bottom: 10px;\n\n &:hover,\n &:focus,\n &:active {\n color: $primary-text-color;\n }\n }\n\n &__meta {\n padding: 0 15px;\n color: $dark-text-color;\n }\n\n &__action-bar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n &:last-child {\n border-bottom: 0;\n }\n }\n}\n",".dashboard__counters {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n margin-bottom: 20px;\n\n & > div {\n box-sizing: border-box;\n flex: 0 0 33.333%;\n padding: 0 5px;\n margin-bottom: 10px;\n\n & > div,\n & > a {\n padding: 20px;\n background: lighten($ui-base-color, 4%);\n border-radius: 4px;\n box-sizing: border-box;\n height: 100%;\n }\n\n & > a {\n text-decoration: none;\n color: inherit;\n display: block;\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 8%);\n }\n }\n }\n\n &__num,\n &__text {\n text-align: center;\n font-weight: 500;\n font-size: 24px;\n line-height: 21px;\n color: $primary-text-color;\n font-family: $font-display, sans-serif;\n margin-bottom: 20px;\n line-height: 30px;\n }\n\n &__text {\n font-size: 18px;\n }\n\n &__label {\n font-size: 14px;\n color: $darker-text-color;\n text-align: center;\n font-weight: 500;\n }\n}\n\n.dashboard__widgets {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n\n & > div {\n flex: 0 0 33.333%;\n margin-bottom: 20px;\n\n & > div {\n padding: 0 5px;\n }\n }\n\n a:not(.name-tag) {\n color: $ui-secondary-color;\n font-weight: 500;\n text-decoration: none;\n }\n}\n","body.rtl {\n direction: rtl;\n\n .column-header > button {\n text-align: right;\n padding-left: 0;\n padding-right: 15px;\n }\n\n .radio-button__input {\n margin-right: 0;\n margin-left: 10px;\n }\n\n .directory__card__bar .display-name {\n margin-left: 0;\n margin-right: 15px;\n }\n\n .display-name {\n text-align: right;\n }\n\n .notification__message {\n margin-left: 0;\n margin-right: 68px;\n }\n\n .drawer__inner__mastodon > img {\n transform: scaleX(-1);\n }\n\n .notification__favourite-icon-wrapper {\n left: auto;\n right: -26px;\n }\n\n .landing-page__logo {\n margin-right: 0;\n margin-left: 20px;\n }\n\n .landing-page .features-list .features-list__row .visual {\n margin-left: 0;\n margin-right: 15px;\n }\n\n .column-link__icon,\n .column-header__icon {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .compose-form .compose-form__buttons-wrapper .character-counter__wrapper {\n margin-right: 0;\n margin-left: 4px;\n }\n\n .navigation-bar__profile {\n margin-left: 0;\n margin-right: 8px;\n }\n\n .search__input {\n padding-right: 10px;\n padding-left: 30px;\n }\n\n .search__icon .fa {\n right: auto;\n left: 10px;\n }\n\n .columns-area {\n direction: rtl;\n }\n\n .column-header__buttons {\n left: 0;\n right: auto;\n margin-left: 0;\n margin-right: -15px;\n }\n\n .column-inline-form .icon-button {\n margin-left: 0;\n margin-right: 5px;\n }\n\n .column-header__links .text-btn {\n margin-left: 10px;\n margin-right: 0;\n }\n\n .account__avatar-wrapper {\n float: right;\n }\n\n .column-header__back-button {\n padding-left: 5px;\n padding-right: 0;\n }\n\n .column-header__setting-arrows {\n float: left;\n }\n\n .setting-toggle__label {\n margin-left: 0;\n margin-right: 8px;\n }\n\n .status__avatar {\n left: auto;\n right: 10px;\n }\n\n .status,\n .activity-stream .status.light {\n padding-left: 10px;\n padding-right: 68px;\n }\n\n .status__info .status__display-name,\n .activity-stream .status.light .status__display-name {\n padding-left: 25px;\n padding-right: 0;\n }\n\n .activity-stream .pre-header {\n padding-right: 68px;\n padding-left: 0;\n }\n\n .status__prepend {\n margin-left: 0;\n margin-right: 68px;\n }\n\n .status__prepend-icon-wrapper {\n left: auto;\n right: -26px;\n }\n\n .activity-stream .pre-header .pre-header__icon {\n left: auto;\n right: 42px;\n }\n\n .account__avatar-overlay-overlay {\n right: auto;\n left: 0;\n }\n\n .column-back-button--slim-button {\n right: auto;\n left: 0;\n }\n\n .status__relative-time,\n .activity-stream .status.light .status__header .status__meta {\n float: left;\n }\n\n .status__action-bar {\n &__counter {\n margin-right: 0;\n margin-left: 11px;\n\n .status__action-bar-button {\n margin-right: 0;\n margin-left: 4px;\n }\n }\n }\n\n .status__action-bar-button {\n float: right;\n margin-right: 0;\n margin-left: 18px;\n }\n\n .status__action-bar-dropdown {\n float: right;\n }\n\n .privacy-dropdown__dropdown {\n margin-left: 0;\n margin-right: 40px;\n }\n\n .privacy-dropdown__option__icon {\n margin-left: 10px;\n margin-right: 0;\n }\n\n .detailed-status__display-name .display-name {\n text-align: right;\n }\n\n .detailed-status__display-avatar {\n margin-right: 0;\n margin-left: 10px;\n float: right;\n }\n\n .detailed-status__favorites,\n .detailed-status__reblogs {\n margin-left: 0;\n margin-right: 6px;\n }\n\n .fa-ul {\n margin-left: 2.14285714em;\n }\n\n .fa-li {\n left: auto;\n right: -2.14285714em;\n }\n\n .admin-wrapper {\n direction: rtl;\n }\n\n .admin-wrapper .sidebar ul a i.fa,\n a.table-action-link i.fa {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .simple_form .check_boxes .checkbox label {\n padding-left: 0;\n padding-right: 25px;\n }\n\n .simple_form .input.with_label.boolean label.checkbox {\n padding-left: 25px;\n padding-right: 0;\n }\n\n .simple_form .check_boxes .checkbox input[type=\"checkbox\"],\n .simple_form .input.boolean input[type=\"checkbox\"] {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.radio_buttons .radio {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.radio_buttons .radio > label {\n padding-right: 28px;\n padding-left: 0;\n }\n\n .simple_form .input-with-append .input input {\n padding-left: 142px;\n padding-right: 0;\n }\n\n .simple_form .input.boolean label.checkbox {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.boolean .label_input,\n .simple_form .input.boolean .hint {\n padding-left: 0;\n padding-right: 28px;\n }\n\n .simple_form .label_input__append {\n right: auto;\n left: 3px;\n\n &::after {\n right: auto;\n left: 0;\n background-image: linear-gradient(to left, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));\n }\n }\n\n .simple_form select {\n background: darken($ui-base-color, 10%) url(\"data:image/svg+xml;utf8,\") no-repeat left 8px center / auto 16px;\n }\n\n .table th,\n .table td {\n text-align: right;\n }\n\n .filters .filter-subset {\n margin-right: 0;\n margin-left: 45px;\n }\n\n .landing-page .header-wrapper .mascot {\n right: 60px;\n left: auto;\n }\n\n .landing-page__call-to-action .row__information-board {\n direction: rtl;\n }\n\n .landing-page .header .hero .floats .float-1 {\n left: -120px;\n right: auto;\n }\n\n .landing-page .header .hero .floats .float-2 {\n left: 210px;\n right: auto;\n }\n\n .landing-page .header .hero .floats .float-3 {\n left: 110px;\n right: auto;\n }\n\n .landing-page .header .links .brand img {\n left: 0;\n }\n\n .landing-page .fa-external-link {\n padding-right: 5px;\n padding-left: 0 !important;\n }\n\n .landing-page .features #mastodon-timeline {\n margin-right: 0;\n margin-left: 30px;\n }\n\n @media screen and (min-width: 631px) {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n\n &:first-child {\n padding-left: 5px;\n padding-right: 10px;\n }\n }\n\n .columns-area > div {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n }\n }\n }\n\n .columns-area--mobile .column,\n .columns-area--mobile .drawer {\n padding-left: 0;\n padding-right: 0;\n }\n\n .public-layout {\n .header {\n .nav-button {\n margin-left: 8px;\n margin-right: 0;\n }\n }\n\n .public-account-header__tabs {\n margin-left: 0;\n margin-right: 20px;\n }\n }\n\n .landing-page__information {\n .account__display-name {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .account__avatar-wrapper {\n margin-left: 12px;\n margin-right: 0;\n }\n }\n\n .card__bar .display-name {\n margin-left: 0;\n margin-right: 15px;\n text-align: right;\n }\n\n .fa-chevron-left::before {\n content: \"\\F054\";\n }\n\n .fa-chevron-right::before {\n content: \"\\F053\";\n }\n\n .column-back-button__icon {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .column-header__setting-arrows .column-header__setting-btn:last-child {\n padding-left: 0;\n padding-right: 10px;\n }\n\n .simple_form .input.radio_buttons .radio > label input {\n left: auto;\n right: 0;\n }\n}\n","$black-emojis: '8ball' 'ant' 'back' 'black_circle' 'black_heart' 'black_large_square' 'black_medium_small_square' 'black_medium_square' 'black_nib' 'black_small_square' 'bomb' 'bowling' 'bust_in_silhouette' 'busts_in_silhouette' 'camera' 'camera_with_flash' 'clubs' 'copyright' 'curly_loop' 'currency_exchange' 'dark_sunglasses' 'eight_pointed_black_star' 'electric_plug' 'end' 'female-guard' 'film_projector' 'fried_egg' 'gorilla' 'guardsman' 'heavy_check_mark' 'heavy_division_sign' 'heavy_dollar_sign' 'heavy_minus_sign' 'heavy_multiplication_x' 'heavy_plus_sign' 'hocho' 'hole' 'joystick' 'kaaba' 'lower_left_ballpoint_pen' 'lower_left_fountain_pen' 'male-guard' 'microphone' 'mortar_board' 'movie_camera' 'musical_score' 'on' 'registered' 'soon' 'spades' 'speaking_head_in_silhouette' 'spider' 'telephone_receiver' 'tm' 'top' 'tophat' 'turkey' 'vhs' 'video_camera' 'video_game' 'water_buffalo' 'waving_black_flag' 'wavy_dash';\n\n%white-emoji-outline {\n filter: drop-shadow(1px 1px 0 $white) drop-shadow(-1px 1px 0 $white) drop-shadow(1px -1px 0 $white) drop-shadow(-1px -1px 0 $white);\n transform: scale(.71);\n}\n\n.emojione {\n @each $emoji in $black-emojis {\n &[title=':#{$emoji}:'] {\n @extend %white-emoji-outline;\n }\n }\n}\n","// components.scss\n.compose-form {\n .compose-form__modifiers {\n .compose-form__upload {\n &-description {\n input {\n &::placeholder {\n opacity: 1;\n }\n }\n }\n }\n }\n}\n\n.rich-formatting a,\n.rich-formatting p a,\n.rich-formatting li a,\n.landing-page__short-description p a,\n.status__content a,\n.reply-indicator__content a {\n color: lighten($ui-highlight-color, 12%);\n text-decoration: underline;\n\n &.mention {\n text-decoration: none;\n }\n\n &.mention span {\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n\n &.status__content__spoiler-link {\n color: $secondary-text-color;\n text-decoration: none;\n }\n}\n\n.status__content__read-more-button {\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n}\n\n.getting-started__footer a {\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n}\n\n.nothing-here {\n color: $darker-text-color;\n}\n\n.public-layout .public-account-header__tabs__tabs .counter.active::after {\n border-bottom: 4px solid $ui-highlight-color;\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/packs/skins/vanilla/contrast/common.js b/priv/static/packs/skins/vanilla/contrast/common.js index e98309beb..ba45e450a 100644 Binary files a/priv/static/packs/skins/vanilla/contrast/common.js and b/priv/static/packs/skins/vanilla/contrast/common.js differ diff --git a/priv/static/packs/skins/vanilla/mastodon-light/common.css b/priv/static/packs/skins/vanilla/mastodon-light/common.css index 4c6bfe4e6..c2fdf30b8 100644 Binary files a/priv/static/packs/skins/vanilla/mastodon-light/common.css and b/priv/static/packs/skins/vanilla/mastodon-light/common.css differ diff --git a/priv/static/packs/skins/vanilla/mastodon-light/common.css.map b/priv/static/packs/skins/vanilla/mastodon-light/common.css.map index 64f2758de..f22d72ddd 100644 --- a/priv/static/packs/skins/vanilla/mastodon-light/common.css.map +++ b/priv/static/packs/skins/vanilla/mastodon-light/common.css.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///common.scss","webpack:///./app/javascript/styles/mastodon/reset.scss","webpack:///./app/javascript/styles/mastodon-light/variables.scss","webpack:///./app/javascript/styles/mastodon/basics.scss","webpack:///./app/javascript/styles/mastodon/containers.scss","webpack:///./app/javascript/styles/mastodon/lists.scss","webpack:///./app/javascript/styles/mastodon/footer.scss","webpack:///./app/javascript/styles/mastodon/compact_header.scss","webpack:///./app/javascript/styles/mastodon/widgets.scss","webpack:///./app/javascript/styles/mastodon/variables.scss","webpack:///./app/javascript/styles/mastodon/forms.scss","webpack:///./app/javascript/styles/mastodon/accounts.scss","webpack:///./app/javascript/styles/mastodon/statuses.scss","webpack:///./app/javascript/styles/mastodon/boost.scss","webpack:///./app/javascript/styles/mastodon/components.scss","webpack:///","webpack:///./app/javascript/styles/mastodon/_mixins.scss","webpack:///./app/javascript/styles/mastodon/polls.scss","webpack:///./app/javascript/styles/mastodon/modal.scss","webpack:///./app/javascript/styles/mastodon/emoji_picker.scss","webpack:///./app/javascript/styles/mastodon/about.scss","webpack:///./app/javascript/styles/mastodon/tables.scss","webpack:///./app/javascript/styles/mastodon/admin.scss","webpack:///./app/javascript/styles/mastodon/dashboard.scss","webpack:///./app/javascript/styles/mastodon/rtl.scss","webpack:///./app/javascript/styles/mastodon/accessibility.scss","webpack:///./app/javascript/styles/mastodon-light/diff.scss"],"names":[],"mappings":"AAAA,2ZCKA,QAaE,UACA,SACA,eACA,aACA,wBACA,+EAIF,aAEE,MAGF,aACE,OAGF,eACE,cAGF,WACE,qDAGF,UAEE,aACA,OAGF,wBACE,iBACA,MAGF,0CACE,qBAGF,UACE,YACA,2BAGF,kBACE,cACA,mBACA,iCAGF,kBACE,kCAGF,kBACE,2BAGF,aACE,gBACA,8BACA,CC3EwB,iEDkF1B,kBClF0B,4BDsF1B,sBACE,MErFF,iDACE,mBACA,eACA,iBACA,gBACA,WDZM,kCCcN,6BACA,8BACA,CADA,0BACA,CADA,yBACA,CADA,qBACA,0CACA,wCACA,kBAEA,iKAYE,eAGF,SACE,oCAEA,WACE,iBACA,kBACA,uCAGF,iBACE,WACA,YACA,mCAGF,iBACE,cAIJ,kBDlDwB,kBCsDxB,iBACE,kBACA,0BAEA,iBACE,aAIJ,iBACE,YAGF,kBACE,SACA,iBACA,uBAEA,iBACE,WACA,YACA,gBACA,YAIJ,kBACE,UACA,YAGF,iBACE,kBACA,cDzFiB,mBAEK,WC0FtB,YACA,UACA,aACA,uBACA,mBACA,oBAEA,qBACE,YACA,sCAGE,aACE,gBACA,WACA,YACA,kBACA,uBAIJ,cACE,iBACA,gBACA,QAMR,mBACE,eACA,cAEA,YACE,kDAKF,YAGE,WACA,mBACA,uBACA,oBACA,sBAGF,YACE,yEAKF,gBAEE,+EAKF,WAEE,sCAIJ,qBAEE,eACA,gBACA,gBACA,cACA,kBACA,8CAEA,eACE,0CAGF,mBACE,gEAEA,eACE,0CAIJ,aDvKmB,kKC0KjB,oBAGE,sDAIJ,aD7KgB,eC+Kd,0DAEA,aDjLc,oDCsLhB,cACE,SACA,uBACA,cDzLc,aC2Ld,UACA,SACA,oBACA,eACA,UACA,4BACA,0BACA,gMAEA,oBAGE,kEAGF,aDvNY,gBCyNV,gBCnON,WACE,CACA,kBACA,qCAEA,eALF,UAMI,SACA,kBAIJ,sBACE,qCAEA,gBAHF,kBAII,qBAGF,YACE,uBACA,mBACA,wBAEA,SFtBI,YEwBF,kBACA,sBAGF,YACE,uBACA,mBACA,WF/BE,qBEiCF,UACA,kBACA,iBACA,6CACA,gBACA,eACA,mCAMJ,WACE,CACA,cACA,mBACA,sBACA,qCAEA,kCAPF,UAQI,aACA,aACA,kBAKN,WACE,CACA,YACA,eACA,iBACA,sBACA,CACA,gBACA,CACA,sBACA,qCAEA,gBAZF,UAaI,CACA,eACA,CACA,mBACA,0BAGF,UACE,YACA,iBACA,6BAEA,UACE,YACA,cACA,SACA,kBACA,uBAIJ,aACE,cF5FiB,wBE8FjB,iCAEA,aACE,gBACA,uBACA,gBACA,8BAIJ,aACE,eACA,iBACA,gBACA,SAIJ,YACE,cACA,8BACA,sBACA,mCACA,CADA,0BACA,mBAEA,eACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,eACE,WACA,qCAGF,QA3BF,UA4BI,qCACA,mBAEA,aACE,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,UAKN,YACE,cACA,8CACA,sBACA,mCACA,CADA,0BACA,mBAEA,eACE,WACA,mBAGF,eACE,WACA,mBAGF,aACE,WACA,mBAGF,eACE,WACA,mBAGF,aACE,WACA,uCAGF,eACE,wBAGF,kBACE,qCAGF,QAxCF,iDAyCI,uCAEA,YACE,aACA,mBACA,uBACA,iCAGF,UACE,uBACA,mBACA,sBAGF,YACE,sCAIJ,QA7DF,UA8DI,qCACA,mBAEA,aACE,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,sCAMJ,eADF,gBAEI,4BAGF,eACE,qCAEA,0BAHF,SAII,yBAIJ,kBACE,mCACA,kBACA,YACA,cACA,aACA,oBACA,uBACA,iBACA,gBACA,qCAEA,uBAZF,cAaI,WACA,MACA,OACA,SACA,gBACA,gBACA,YACA,6BAGF,cACE,eACA,kCAGF,YACE,oBACA,2BACA,iBACA,oCAGF,YACE,oBACA,uBACA,iBACA,mCAGF,YACE,oBACA,yBACA,iBACA,+BAGF,aACE,aACA,mCAEA,aACE,YACA,WACA,kBACA,YACA,UFzUA,qCE4UA,kCARF,WASI,+GAIJ,kBAGE,kCAIJ,YACE,mBACA,eACA,eACA,gBACA,qBACA,cF3Ve,mBE6Vf,kBACA,uHAEA,yBAGE,WFtWA,qCE0WF,0CACE,YACE,qCAKN,kBACE,CACA,oBACA,kBACA,6HAEA,oBAGE,mBACA,sBAON,YACE,cACA,0DACA,sBACA,mCACA,CADA,0BACA,gCAEA,UACE,cACA,gCAGF,UACE,cACA,qCAGF,qBAjBF,0BAkBI,WACA,gCAEA,YACE,kCAKN,iBACE,qCAEA,gCAHF,eAII,sCAKF,4BADF,eAEI,wCAIJ,eACE,mBACA,mCACA,gDAEA,UACE,qIAEA,8BAEE,CAFF,sBAEE,6DAGF,wBFrbe,8CE0bjB,yBACE,gBACA,aACA,kBACA,gBACA,oDAEA,UACE,cACA,kBACA,WACA,YACA,gDACA,MACA,OACA,kDAGF,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,0BACA,qCAGF,6CA3BF,YA4BI,gDAIJ,eACE,6JAEA,iBAEE,qCAEA,4JAJF,eAKI,sCAKN,sCA/DF,eAgEI,gBACA,oDAEA,YACE,+FAGF,eAEE,6CAIJ,iBACE,iBACA,aACA,2BACA,mDAEA,UACE,cACA,mBACA,kBACA,SACA,OACA,QACA,YACA,0BACA,WACA,oDAGF,aACE,YACA,aACA,kBACA,cACA,wDAEA,aACE,WACA,YACA,SACA,kBACA,yBACA,mBACA,qCAIJ,2CArCF,YAsCI,mBACA,0BACA,YACA,mDAEA,YACE,oDAGF,UACE,YACA,CACA,sBACA,wDAEA,QACE,kBACA,2DAGF,mDAXF,YAYI,sCAKN,2CAhEF,eAiEI,sCAGF,2CApEF,cAqEI,8CAIJ,aACE,iBACA,mDAEA,gBACE,mBACA,sDAEA,cACE,iBACA,WF3kBF,gBE6kBE,gBACA,mBACA,uBACA,6BACA,4DAEA,aACE,eACA,WFrlBJ,gBEulBI,gBACA,uBACA,qCAKN,4CA7BF,gBA8BI,aACA,8BACA,mBACA,mDAEA,aACE,iBACA,sDAEA,cACE,iBACA,iBACA,4DAEA,aF1mBS,oDEinBf,YACE,2BACA,oBACA,YACA,qEAEA,YACE,mBACA,gBACA,qCAGF,oEACE,YACE,6DAIJ,eACE,sBACA,cACA,cFtoBW,aEwoBX,+BACA,eACA,kBACA,kBACA,8DAEA,aACE,uEAGF,cACE,kEAGF,aACE,WACA,kBACA,SACA,OACA,WACA,gCACA,WACA,wBACA,yEAIA,+BACE,UACA,kFAGF,2BFxqBS,wEE8qBT,SACE,wBACA,8DAIJ,oBACE,cACA,2EAGF,cACE,cACA,4EAGF,eACE,eACA,kBACA,WFpsBJ,6CEssBI,2DAIJ,aACE,WACA,4DAGF,eACE,8CAKN,YACE,eACA,kEAEA,eACE,gBACA,uBACA,cACA,2FAEA,4BACE,yEAGF,YACE,qDAIJ,gBACE,eACA,cFvuBa,uDE0uBb,oBACE,cF3uBW,qBE6uBX,aACA,gBACA,8DAEA,eACE,WFrvBJ,qCE2vBF,6CAtCF,aAuCI,UACA,4CAKN,yBACE,qCAEA,0CAHF,eAII,wCAIJ,eACE,oCAGF,kBACE,mCACA,kBACA,gBACA,mBACA,qCAEA,mCAPF,eAQI,gBACA,gBACA,8DAGF,QACE,aACA,+DAEA,aACE,sFAGF,uBACE,yEAGF,aF9xBU,8DEoyBV,mBACA,WF9yBE,qFEkzBJ,YAEE,eACA,cFlzBe,2CEszBjB,gBACE,iCAIJ,YACE,cACA,kDACA,qCAEA,gCALF,aAMI,+CAGF,cACE,iCAIJ,eACE,2BAGF,YACE,eACA,eACA,cACA,+BAEA,qBACE,cACA,YACA,cACA,mBACA,kBACA,qCAEA,8BARF,aASI,sCAGF,8BAZF,cAaI,sCAIJ,0BAvBF,QAwBI,6BACA,+BAEA,UACE,UACA,gBACA,gCACA,0CAEA,eACE,0CAGF,kBFh3BkB,+IEm3BhB,kBAGE,WC53BZ,eACE,aAEA,oBACE,aACA,iBAIJ,eACE,cACA,oBAEA,cACE,gBACA,mBACA,wBCfF,eACE,iBACA,oBACA,eACA,cACA,qCAEA,uBAPF,iBAQI,mBACA,+BAGF,YACE,cACA,0CACA,wCAEA,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,kBACA,6CAEA,aACE,wCAIJ,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,qCAGF,6BAxCF,iCAyCI,+EAEA,aAEE,wCAGF,UACE,wCAGF,aACE,+EAGF,aAEE,wCAGF,UACE,sCAIJ,uCACE,aACE,sCAIJ,4JACE,YAIE,4BAKN,eACE,kBACA,cJ7Fe,6BIgGf,aACE,qBACA,6BAIJ,oBACE,cACA,wGAEA,yBAGE,mCAKF,aACE,YACA,WACA,cACA,aACA,0HAMA,YACE,oBCjIR,cACE,iBACA,cACA,gBACA,mBACA,eACA,qBACA,qCAEA,mBATF,iBAUI,oBACA,uBAGF,aACE,qBACA,0BAGF,eACE,cLjBe,wBKqBjB,oBACE,mBACA,kBACA,WACA,YACA,cC9BN,kBACE,mCACA,mBAEA,UACE,kBACA,gBACA,0BACA,gBCPI,uBDUJ,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,0BACA,oBAIJ,kBNfwB,aMiBtB,0BACA,eACA,cNrBiB,iBMuBjB,qBACA,gBACA,8BAEA,UACE,YACA,gBACA,sBAGF,kBACE,iCAEA,eACE,uBAIJ,cACE,SACA,UACA,gBACA,uBACA,oBACA,kBACA,oBACA,cACA,sBAGF,aNrDiB,qBMuDf,4BAEA,yBACE,qCAKN,aAnEF,YAoEI,uBAIJ,kBACE,oBACA,yBAEA,YACE,gBACA,eACA,cN3EiB,+BM+EnB,cACE,0CAEA,eACE,sDAGF,YACE,mBACA,gDAGF,UACE,YACA,0BACA,oCAIJ,YACE,mBAKF,aNxGmB,aM6GrB,YACE,kBACA,mBN7GwB,mCM+GxB,qBAGF,YACE,kBACA,0BACA,kBACA,cNxHmB,mBM0HnB,iBAGF,eACE,eACA,cN/HmB,iBMiInB,qBACA,gBACA,UACA,oBAEA,YACE,gBACA,eACA,cNzIiB,0BM6InB,eACE,CACA,kBACA,mBAGF,oBACE,CACA,mBACA,cNtJiB,qBMwJjB,mBACA,gBACA,uBACA,0EAEA,yBAGE,uBAMJ,sBACA,kBACA,mBNtKwB,mCMwKxB,cN1KmB,gBM4KnB,mBACA,sDAEA,eAEE,CAII,qXADF,eACE,yBAKN,aACE,0BACA,CAMI,wLAGF,oBAGE,mIAEA,yBACE,gCAMR,kBACE,oCAEA,gBACE,cNrNe,8DM2NjB,iBACE,eACA,4DAGF,eACE,qBACA,iEAEA,eACE,kBAMR,YACE,CACA,eChPM,CDkPN,cACA,cNhPmB,mBMkPnB,+BANA,iBACA,CChPM,kCD8PN,CATA,aAGF,kBACE,CAEA,iBACA,kBACA,cACA,iBAEA,UNhQM,eMkQJ,gBACA,gBACA,mBACA,gBAGF,cACE,cNtQiB,qCM0QnB,aArBF,YAsBI,mBACA,iBAEA,cACE,aAKN,kBNlR0B,kBMoRxB,mCACA,iBAEA,qBACE,mBACA,uCAEA,YAEE,mBACA,8BACA,mBN/RoB,kBMiSpB,aACA,qBACA,cACA,mCACA,0EAIA,kBAGE,0BAIJ,kBNnSiB,eMqSf,8BAGF,UACE,eACA,oBAGF,aACE,eACA,gBACA,WNlUE,mBMoUF,gBACA,uBACA,wBAEA,aNrUe,0BMyUf,aACE,gBACA,eACA,eACA,cN7Ua,0IMmVf,UNtVE,+BM8VJ,aACE,YACA,uDAGF,oBNjViB,wCMqVjB,eACE,eAKN,YACE,yBACA,gCAEA,aACE,WACA,YACA,kBACA,kBACA,kBACA,mBACA,yBACA,4CAEA,SACE,6CAGF,SACE,6CAGF,SACE,iBAKN,UACE,0BAEA,SACE,SACA,wBAGF,eACE,0BAGF,iBACE,cNnZiB,gBMqZjB,aACA,sCAEA,eACE,0BAIJ,cACE,sBACA,gCACA,wCAGF,eACE,wBAGF,WACE,kBACA,eACA,gBACA,WN9aI,8BMibJ,aACE,cN/ae,gBMibf,eACA,0BAIJ,SACE,iCACA,qCAGF,kCACE,YACE,sCAYJ,qIAPF,eAQI,gBACA,gBACA,iBAOJ,gBACE,qCAEA,eAHF,oBAII,uBAGF,sBACE,sCAEA,qBAHF,sBAII,sCAGF,qBAPF,UAQI,sCAGF,qBAXF,WAYI,kCAIJ,iBACE,qCAEA,gCAHF,4BAII,iEAIA,eACE,0DAGF,cACE,iBACA,oEAEA,UACE,YACA,gBACA,yFAGF,gBACE,SACA,mKAIJ,eAGE,gBAON,aNhhBmB,iCM+gBrB,kBAKI,6BAEA,eACE,kBAIJ,cACE,iBACA,wCAMF,oBACE,gBACA,cNthBiB,4JMyhBjB,yBAGE,oBAKN,kBACE,gBACA,eACA,kBACA,yBAEA,aACE,gBACA,aACA,CACA,kBACA,gBACA,uBACA,qBACA,WNjkBI,gCMmkBJ,4FAEA,yBAGE,oCAIJ,eACE,0BAGF,iBACE,gCACA,MEjlBJ,+CACE,gBACA,iBAGF,eACE,aACA,cACA,qBAIA,kBACE,gBACA,4BAEA,QACE,0CAIA,kBACE,qDAEA,eACE,gDAIJ,iBACE,kBACA,sDAEA,iBACE,SACA,OACA,6BAKN,iBACE,gBACA,gDAEA,mBACE,eACA,gBACA,WRjDA,cQmDA,WACA,4EAGF,iBAEE,mDAGF,eACE,4CAGF,iBACE,QACA,OACA,qCAGF,aRpDe,0BQsDb,gIAEA,oBAGE,0CAIJ,iBACE,CACA,iBACA,mBAKN,YACE,cACA,0BAEA,qBACE,cACA,UACA,cACA,oBAIJ,aRlGmB,sBQqGjB,aRtFiB,yBQ0FjB,iBACE,kBACA,gBACA,uBAGF,eACE,iBACA,sBAIJ,kBACE,wBAGF,aACE,eACA,eACA,qBAGF,kBACE,cRhIiB,iCQmIjB,iBACE,eACA,iBACA,gBACA,gBACA,oBAIJ,kBACE,qBAGF,eACE,CAII,0JADF,eACE,sDAMJ,YACE,4DAEA,mBACE,eACA,WRnKA,gBQqKA,gBACA,cACA,wHAGF,aAEE,sDAIJ,cACE,kBACA,mDAKF,mBACE,eACA,WRzLE,cQ2LF,kBACA,qBACA,gBACA,sCAGF,cACE,mCAGF,UACE,sCAIJ,cACE,4CAEA,mBACE,eACA,WR/ME,cQiNF,gBACA,gBACA,4CAGF,kBACE,yCAGF,cACE,CADF,cACE,6BAIJ,oBACE,cACA,4BAGF,kBACE,8CAEA,eACE,0BAIJ,YACE,CACA,eACA,oBACA,iCAEA,cACE,kCAGF,qBACE,eACA,cACA,eACA,oCAEA,aACE,2CAGF,eACE,6GAIJ,eAEE,qCAGF,yBA9BF,aA+BI,gBACA,kCAEA,cACE,0JAGF,kBAGE,iDAKN,iBACE,oBACA,eACA,WR7RI,cQ+RJ,WACA,2CAKE,mBACE,eACA,WRvSA,qBQySA,WACA,kBACA,gBACA,kBACA,cACA,0DAGF,iBACE,OACA,QACA,SACA,kDAKN,cACE,aACA,yBACA,kBACA,sJAGF,qBAKE,eACA,WRvUI,cQyUJ,WACA,UACA,oBACA,gBACA,mBACA,sBACA,kBACA,aACA,6RAEA,aACE,CAHF,+OAEA,aACE,CAHF,mQAEA,aACE,CAHF,wQAEA,aACE,CAHF,sNAEA,aACE,8LAGF,eACE,oVAGF,oBACE,iOAGF,oBRtVY,oLQ0VZ,iBACE,4WAGF,oBRrViB,mBQwVf,6CAKF,aACE,gUAGF,oBAME,8CAGF,aACE,gBACA,cACA,eACA,8BAIJ,UACE,uBAGF,eACE,aACA,oCAEA,YACE,mBACA,qEAIJ,aAGE,WACA,SACA,kBACA,mBRtYiB,WAlBb,eQ2ZJ,oBACA,YACA,aACA,qBACA,kBACA,sBACA,eACA,gBACA,UACA,mBACA,kBACA,sGAEA,cACE,uFAGF,wBACE,gLAGF,wBAEE,kHAGF,wBRrae,gGQyaf,kBDtbQ,kHCybN,wBACE,sOAGF,wBAEE,qBAKN,uBACE,CADF,oBACE,CADF,eACE,sBACA,eACA,WR1cI,cQ4cJ,WACA,UACA,oBACA,gBACA,wXACA,sBACA,kBACA,kBACA,mBACA,YACA,iBAGF,4BACE,oCAIA,iBACE,mCAGF,iBACE,UACA,QACA,CACA,qBACA,eACA,cRldY,oBQodZ,oBACA,eACA,gBACA,mBACA,gBACA,yCAEA,UACE,cACA,kBACA,MACA,QACA,WACA,UACA,oEACA,4BAKN,iBACE,0CAEA,wBACE,CADF,gBACE,qCAGF,iBACE,MACA,OACA,WACA,YACA,aACA,uBACA,mBACA,iCACA,kBACA,iBACA,gBACA,YACA,8CAEA,iBACE,6HAGE,URxhBF,aQkiBR,aACE,CACA,kBACA,eACA,gBAGF,kBACE,cRviBmB,kBQyiBnB,kBACA,mBACA,kBACA,uBAEA,mCACE,+BACA,cR1iBY,sBQ8iBd,mCACE,+BACA,cDtjBQ,kBC0jBV,oBACE,cR3jBiB,qBQ6jBjB,wBAEA,URlkBI,0BQokBF,kBAIJ,kBACE,4BAGF,SACE,sBACA,cACA,WACA,SACA,aACA,gDACA,mBR9kBsB,WALlB,eQslBJ,SACA,8CAEA,QACE,iHAGF,mBAGE,kCAGF,kBACE,uBAIJ,eACE,CAII,oKADF,eACE,0DAKN,eAzEF,eA0EI,eAIJ,eACE,kBACA,gBAEA,aRxnBmB,qBQ0nBjB,sBAEA,yBACE,YAKN,eACE,mBACA,eACA,eAEA,oBACE,kBACA,cAGF,aR7nBmB,qBQ+nBjB,gBACA,2DAEA,aAGE,8BAKN,kBAEE,cR3pBmB,oCQ8pBnB,cACE,mBACA,kBACA,4CAGF,aRpqBmB,gBQsqBjB,CAII,mUADF,eACE,0DAKN,6BAtBF,eAuBI,cAIJ,YACE,eACA,uBACA,UAGF,aACE,gBD7rBM,YC+rBN,qBACA,mCACA,qBACA,cAEA,aACE,SACA,iBAIJ,kBACE,cRzsBmB,WQ2sBnB,sBAEA,aACE,eACA,eAKF,kBACE,sBAEA,eACE,CAII,+JADF,eACE,4CASR,qBACE,CACA,UR1uBI,qCQ4uBJ,oCACA,kBACA,aACA,mBACA,gDAEA,URlvBI,0BQovBF,oLAEA,oBAGE,0DAIJ,eACE,cACA,kBACA,CAII,yYADF,eACE,kEAIJ,eACE,oBAMR,YACE,eACA,mBACA,4DAEA,aAEE,6BAIA,wBACA,cACA,sBAIJ,iBACE,cR9xBmB,0BQiyBnB,iBACE,oBAIJ,eACE,mBACA,uBAEA,cACE,WR9yBI,kBQgzBJ,mBACA,SACA,UACA,4BAGF,aACE,eAIJ,aDvzBc,0SCi0BZ,+CACE,aAIJ,kBACE,sBACA,kBACA,aACA,mBACA,kBACA,kBACA,QACA,mCACA,sBAEA,aACE,8BAGF,sBACE,SACA,aACA,eACA,gDACA,oBAGF,aACE,WACA,oBACA,gBACA,eACA,CACA,oBACA,WACA,iCACA,oBAGF,oBRp2Bc,gBQs2BZ,2BAEA,kBRx2BY,gBQ02BV,oBAKN,kBACE,6BAEA,wBACE,mBACA,eACA,aACA,4BAGF,kBACE,aACA,OACA,sBACA,cACA,cACA,gCAEA,iBACE,YACA,iBACA,kBACA,UACA,8BAGF,qBACE,qCAIJ,kBACE,gCAGF,wBACE,mCACA,kBACA,kBACA,kBACA,kBACA,sCAEA,wBACE,WACA,cACA,YACA,SACA,kBACA,MACA,UACA,yBAIJ,sBACE,aACA,mBACA,SCl7BF,aACE,qBACA,cACA,mCACA,qCAEA,QANF,eAOI,8EAMA,kBACE,YAKN,YACE,kBACA,gBACA,0BACA,gBAEA,aACE,WACA,YACA,SACA,oBACA,CADA,8BACA,CADA,gBACA,0BACA,qCAGF,WAfF,YAgBI,sCAGF,WAnBF,YAoBI,aAIJ,iBACE,aACA,aACA,2BACA,mBACA,mBACA,0BACA,qCAEA,WATF,eAUI,qBAGF,aACE,WACA,YACA,gBACA,wBAEA,UACE,YACA,cACA,SACA,kBACA,mBACA,oBACA,CADA,8BACA,CADA,gBACA,0BAIJ,gBACE,gBACA,iCAEA,cACE,WT9EA,gBSgFA,gBACA,uBACA,+BAGF,aACE,eACA,cTpFa,gBSsFb,gBACA,uBACA,aAMR,cACE,kBACA,gBACA,6GAEA,cAME,WT5GI,gBS8GJ,qBACA,iBACA,qBACA,sBAGF,eFnHM,oBEqHJ,WTtHI,eSwHJ,cACA,kBAGF,cACE,uCAGF,aT7HmB,oBSkInB,UACE,eACA,wBAEA,oBACE,iBACA,oBAIJ,WACE,gBACA,wBAEA,oBACE,gBACA,uBAIJ,cACE,WACA,qCAGF,YA7DF,iBA8DI,mBAEA,YACE,uCAGF,oBAEE,gBAKN,kBTvK0B,mCSyKxB,cTnJiB,eSqJjB,gBACA,kBACA,aACA,uBACA,mBACA,eACA,kBACA,aACA,gBACA,2BAEA,yBACE,yBAGF,qBACE,gBACA,yCAIJ,oBAEE,gBACA,eACA,kBACA,eACA,iBACA,gBACA,cT1MmB,mCS4MnB,mCACA,6DAEA,aTzMc,oCS2MZ,gCACA,qDAGF,aACE,oCACA,gCACA,0BAIJ,eACE,UACA,wBACA,gBACA,CADA,YACA,CACA,iCACA,CADA,uBACA,CADA,kBACA,eACA,iBACA,6BAEA,YACE,gCACA,yDAGF,qBAEE,aACA,kBACA,gBACA,gBACA,mBACA,uBACA,6BAGF,eACE,YACA,cACA,cTzPiB,gCS2PjB,6BAGF,aACE,cT/PiB,4BSmQnB,aTpPmB,qBSsPjB,qGAEA,yBAGE,oCAIJ,mCACE,+BACA,sCAEA,aT5QY,gBS8QV,0CAGF,aTjRY,wCSsRd,eACE,wCAIJ,UACE,0BAIA,aTtSmB,4BSySjB,aTzSiB,qBS2Sf,qGAEA,yBAGE,iCAIJ,UTvTI,gBSyTF,wBAIJ,eACE,kBC/TJ,kCACE,kBACA,gBACA,mBACA,8BAEA,yBACE,qCAGF,iBAVF,eAWI,gBACA,gBACA,6BAGF,eACE,SACA,gBACA,gFAEA,yBAEE,sCAIJ,UACE,yBAGF,kBVzBwB,6GU4BtB,sBAGE,CAHF,cAGE,8IAIA,eAGE,0BACA,iJAKF,yBAGE,kLAIA,iBAGE,qCAKN,4GACE,yBAGE,uCAKN,kBACE,qBAIJ,WACE,eACA,mBV9DmB,WAlBb,oBUmFN,iBACA,YACA,iBACA,SACA,yBAEA,UACE,YACA,sBACA,iBACA,UV7FI,gFUiGN,kBAGE,qNAKA,kBVzFe,4IUiGf,kBH9GQ,qCGqHV,wBACE,YACE,0DAOJ,YACE,uCAGF,2BACE,gBACA,uDAEA,SACE,SACA,yDAGF,eACE,yDAGF,gBACE,iBACA,mFAGF,UACE,qMAGF,eAGE,iCC/JN,u+KACE,uCAEA,u+KACE,0CAIJ,u+KACE,WCTF,gCACE,4CACA,cAGF,aACE,eACA,iBACA,cZWmB,SYTnB,uBACA,UACA,eACA,wCAEA,yBAEE,uBAGF,aZHiB,eYKf,SAIJ,wBZPqB,YYSnB,kBACA,sBACA,WZ7BM,eY+BN,qBACA,oBACA,eACA,gBACA,YACA,iBACA,iBACA,gBACA,eACA,kBACA,kBACA,qBACA,uBACA,2BACA,mBACA,WACA,4CAEA,wBAGE,4BACA,sBAGF,eACE,mFAEA,wBLxDQ,gBK4DN,mCAIJ,wBZnDiB,eYsDf,2BAGF,QACE,wDAGF,mBAGE,yGAGF,cAIE,iBACA,YACA,oBACA,iBACA,4BAGF,UZ9FM,mBAgBW,qGYkFf,wBAGE,8BAIJ,kBZ1FsB,2GY6FpB,wBAGE,0BAIJ,aZhHmB,uBYkHjB,iBACA,yBACA,+FAEA,oBAGE,cACA,mCAGF,UACE,uBAIJ,aACE,WACA,kBAIJ,YACE,cACA,kBACA,cAGF,oBACE,UACA,cZ5HoB,SY8HpB,kBACA,uBACA,eACA,2BACA,2CACA,2DAEA,aAGE,sCACA,4BACA,2CACA,oBAGF,oCACE,uBAGF,aACE,6BACA,eACA,qBAGF,aZ7JmB,gCYiKnB,QACE,uEAGF,mBAGE,uBAGF,aZ1LmB,sFY6LjB,aAGE,oCACA,6BAGF,kCACE,gCAGF,aACE,6BACA,8BAGF,aZ9LiB,uCYiMf,aACE,wBAKN,sBACE,8BACA,qBACA,kBACA,YACA,8BAEA,6BACE,mBAKN,aZnOqB,SYqOnB,kBACA,uBACA,eACA,gBACA,eACA,cACA,iBACA,UACA,2BACA,2CACA,0EAEA,aAGE,oCACA,4BACA,2CACA,yBAGF,kCACE,4BAGF,UACE,6BACA,eACA,0BAGF,aZrPmB,qCYyPnB,QACE,sFAGF,mBAGE,CAKF,0BADF,iBAUE,CATA,WAGF,WACE,cACA,qBACA,QACA,SAEA,+BAEA,kBAEE,mBACA,oBACA,kBACA,mBACA,iBAKF,WACE,eAIJ,YACE,iCAGE,mBACA,eAEA,gBACA,wCAEA,aZ1SiB,sDY8SjB,YACE,2CAGF,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,kDAEA,oBZ/Te,yDYsUnB,UZxVM,mBY0VJ,mBZ1Ue,oCY4Uf,iBACA,kBACA,eACA,gBACA,6CAEA,UZlWI,gBYoWF,CAII,kRADF,eACE,wCAKN,aZ1WiB,gBY4Wf,0BACA,yIAEA,oBAGE,sCAKN,iBACE,QACA,UACA,kDAGF,iBACE,mGAGF,iBAGE,WACA,8BAGF,QACE,wBACA,UACA,qDAEA,WACE,mBACA,UACA,mFAIJ,aAEE,sBACA,WACA,SACA,WZ5ZI,gBOCA,aK8ZJ,oBACA,eACA,gBACA,SACA,UACA,yIAEA,aZhZc,CY8Yd,sHAEA,aZhZc,CY8Yd,8HAEA,aZhZc,CY8Yd,gIAEA,aZhZc,CY8Yd,4GAEA,aZhZc,+FYoZd,SACE,qCAGF,kFAvBF,cAwBI,sCAIJ,iBACE,+CAGF,gBACE,0BACA,iBACA,mBACA,YACA,qBACA,kEAEA,SACE,qCAGF,8CAZF,sBAaI,gBACA,2DAIJ,iBACE,SACA,kDAGF,qBACE,aACA,kBACA,SACA,WACA,WACA,sCACA,mBZldiB,0BYodjB,WZvdI,eYydJ,YACA,6FAEA,aACE,wDAIJ,YACE,eACA,kBACA,yPAEA,kBAIE,wGAIJ,YAGE,mBACA,mBACA,2BACA,iBACA,eACA,oCAGF,6BACE,0CAEA,aACE,gBACA,uBACA,mBACA,2CAGF,eACE,0CAGF,aACE,iBACA,gBACA,uBACA,mBACA,8EAIJ,aAEE,iBACA,WACA,YACA,2DAGF,aZrhBmB,wCYyhBnB,UZ5hBM,oBY8hBJ,eACA,gBL9hBI,sEKiiBJ,eACE,uEAGF,YACE,mBACA,YACA,eACA,8DAGF,UACE,cACA,WACA,uEAEA,iFACE,aACA,uBACA,8BACA,UACA,4BACA,oFAEA,aACE,cZxjBW,eY0jBX,gBACA,aACA,oBACA,6QAEA,aAGE,8EAIJ,SACE,0EAIJ,iBACE,UACA,SACA,OACA,QACA,sBACA,gFACA,aACA,UACA,4BACA,mFAEA,sBACE,cZxlBW,SY0lBX,UACA,SACA,WACA,oBACA,eACA,gBACA,yFAEA,ULpmBF,8GKwmBE,WACE,cZvmBS,COFb,oGKwmBE,WACE,cZvmBS,COFb,wGKwmBE,WACE,cZvmBS,COFb,yGKwmBE,WACE,cZvmBS,COFb,+FKwmBE,WACE,cZvmBS,iFY4mBb,SACE,wEAKN,iBACE,sBLtnBE,wBKwnBF,sBACA,4BACA,aACA,WACA,gBACA,8CAIJ,YACE,gBACA,0BACA,aACA,8BACA,cACA,qEAEA,YACE,uGAEA,gBACE,qGAGF,YACE,6IAEA,aACE,2IAGF,gBACE,0HAKN,sBAEE,cACA,0EAGF,iBACE,iBACA,sCAIJ,YACE,yBACA,YACA,cACA,4EAEA,eACE,iBACA,oBAKN,cACE,kDACA,eACA,gBACA,cZvrBmB,4CY0rBnB,aLzrBY,kCK8rBd,2CACE,WCpsBF,8DDysBE,sBACA,CADA,kBACA,wBACA,WACA,YACA,eAEA,UACE,kBAIJ,iBACE,mBACA,mBZrsBiB,aYusBjB,gBACA,gBACA,cACA,0BAGF,iBACE,gBACA,0BAGF,WACE,iBACA,gCAGF,UZvuBQ,cYyuBN,eACA,iBACA,gBACA,mBACA,qBACA,kCAGF,UACE,iBACA,+BAGF,cACE,4CAGF,iBAEE,eACA,iBACA,qBACA,gBACA,gBACA,uBACA,gBACA,WZnwBM,wDYswBN,SACE,wGAGF,kBACE,sJAEA,oBACE,gEAIJ,UACE,YACA,gBACA,oDAGF,cACE,iBACA,sBACA,CADA,gCACA,CADA,kBACA,gDAGF,kBACE,qBACA,sEAEA,eACE,gDAIJ,aL1xBc,qBK4xBZ,4DAEA,yBACE,oEAEA,aACE,4EAKF,oBACE,sFAEA,yBACE,wDAKN,aZvyBc,8EY4yBhB,aACE,0GAGF,kBZ/yBoB,sHYkzBlB,kBACE,qBACA,8IAGF,QACE,0XAGF,mBAGE,0FAIJ,YACE,wJAEA,aACE,6CAKN,gBACE,oCAGF,aACE,eACA,iBACA,cACA,SACA,uBACA,CACA,eACA,oFAEA,yBAEE,gCAIJ,oBACE,kBACA,uBACA,SACA,WZ13BM,gBY43BN,eACA,cACA,iBACA,eACA,sBACA,4BAGF,aZ92BkB,SYg3BhB,kBACA,kBACA,oBACA,SACA,aACA,sBACA,WACA,WACA,gCACA,+BAGF,UACE,kBACA,kBAIA,SACE,mBACA,wCAEA,kBACE,8CAEA,sBACE,iFAIJ,kBAEE,SAMJ,yBACA,kBACA,gBACA,gCACA,eACA,UAaA,mCACA,CADA,0BACA,wDAZA,QARF,kBAWI,0BAGF,GACE,aACA,WALA,gBAGF,GACE,aACA,uDAMF,cAEE,kCAGF,kBACE,4BACA,sCAIA,aZj7Be,CA3BX,uEYq9BF,UZr9BE,kCYy9BF,aZ97Ba,gCYm8Bf,UZ99BI,kCYi+BF,aZ/8Be,gEYm9Bf,UZr+BE,mBAgBW,sEYy9BX,kBACE,+CAQR,sBACE,qEAEA,aACE,qDAKN,aZr+BkB,YYw+BhB,eACA,uBAGF,aZ5+BkB,qCYg/BlB,aACE,eACA,mBACA,eAGF,cACE,mBAGF,+BACE,aACA,6CAEA,uBACE,OACA,4DAEA,eACE,8DAGF,SACE,mBACA,qHAGF,cAEE,gBACA,4EAGF,cACE,0BAKN,kBACE,aACA,cACA,uBACA,aACA,kBAGF,gBACE,cZhiCgB,CYkiChB,iBACA,eACA,kBACA,+CAEA,aZviCgB,uBY2iChB,aACE,gBACA,uBACA,qBAIJ,kBACE,aACA,eACA,8BAEA,mBACE,kBACA,mBACA,yDAEA,gBACE,qCAGF,oBACE,WACA,eACA,gBACA,cZnkCgB,4BYykCtB,iBACE,8BAGF,cACE,cACA,uCAGF,aACE,aACA,mBACA,uBACA,kBACA,kBAGF,kBACE,kBACA,wBAEA,YACE,eACA,8BACA,uBACA,uFAEA,SAEE,mCAIJ,cACE,iBACA,6CAEA,UACE,YACA,gBACA,kEAGF,gBACE,gBACA,+DAIJ,cAEE,wBAIJ,eACE,cZloCgB,eYooChB,iBACA,8BAGF,kBACE,6BACA,gCACA,aACA,mBACA,eACA,wBAGF,aACE,qBACA,uDAGF,oBAEE,gBACA,eACA,gBACA,2BAGF,UZprCQ,eYsrCN,6BAEA,aZrrCmB,SY0rCrB,YACE,gCACA,8BAEA,aACE,cACA,WZnsCI,qBYqsCJ,eACA,gBACA,kBAIJ,YACE,iBAGF,WACE,aACA,mBACA,UAGF,YACE,gCACA,kBAEA,SACE,gBACA,2CAEA,aACE,iCAIJ,aACE,cACA,cZjuCiB,gBYmuCjB,qBACA,eACA,mBAIJ,YACE,0BAGF,UACE,iBACA,kBACA,kBAGF,iBEtvCE,iCACA,wBACA,4BACA,kBFqvCA,yBAEA,oBACE,sBACA,iBACA,4BAGF,iBEhwCA,iCACA,wBACA,4BACA,kBF+vCE,gBACA,kBACA,eACA,gCAEA,UACE,kBACA,sBACA,mCAGF,aACE,kBACA,QACA,SACA,+BACA,WZlxCE,6BYoxCF,gBACA,eACA,oBAKN,cACE,0BAGF,UACuB,sCEvxCrB,+BFyxCA,iBElyCA,iCACA,wBACA,4BACA,WFiyCuB,sCE3xCvB,kCF8xCA,iBEvyCA,iCACA,wBACA,4BACA,WFsyCuB,sCEhyCvB,kBFkyCE,SACA,QACA,UACA,wBAIJ,WACE,aACA,mBACA,sBAGF,YACE,6BACA,cZpyCgB,6BYuyChB,eACE,CAII,kMADF,eACE,wBAKN,eACE,cACA,0BACA,yFAEA,oBAGE,sBAKN,4BACE,gCACA,iBACA,gBACA,cACA,aACA,+BAGF,YACE,4CAEA,qBACE,oFAIA,QACE,WACA,uDAGF,WACE,iBACA,gBACA,WACA,4BAKN,YACE,cACA,iBACA,kBACA,2BAGF,oBACE,gBACA,cACA,+BACA,eACA,oCACA,kCAEA,+BACE,gCAGF,aACE,eACA,cZr4CiB,kCYy4CnB,aACE,eACA,gBACA,WZ/4CI,CYo5CA,2NADF,eACE,oBAMR,iBACE,mDAEA,aACE,mBACA,gBACA,4BAIJ,UACE,kBACA,6JAGF,oBAME,4DAKA,UZp7CM,kBY07CN,UACE,iKAQF,yBACE,+BAIJ,aACE,gBACA,uBACA,0DAGF,aAEE,sCAGF,kBACE,gCAGF,aZp9CqB,cYs9CnB,iBACA,mBACA,gBACA,2EAEA,aAEE,uBACA,gBACA,uCAGF,cACE,WZt+CI,kCY2+CR,UACE,kBACA,iBAGF,WACE,UACA,kBACA,SACA,WACA,iBAGF,UACE,kBACA,OACA,MACA,YACA,eACA,CZx+CgB,gHYk/ChB,aZl/CgB,wBYs/ChB,UACE,wCAGF,kBZjgDsB,WAfhB,8CYohDJ,kBACE,qBACA,wBAKN,oBACE,gBACA,eACA,cZ3hDmB,eY6hDnB,iBACA,kBACA,4BAEA,aZlhDmB,6BYshDnB,cACE,gBACA,uBACA,uCAIJ,UACE,kBACA,CL5iDU,mEKmjDZ,aLnjDY,uBKujDZ,aLxjDc,4DK8jDV,4CACE,CADF,oCACE,8DAKF,6CACE,CADF,qCACE,6BAKN,aACE,gBACA,qBACA,mCAEA,UZnlDM,0BYqlDJ,8BAIJ,WACE,eAGF,aACE,eACA,gBACA,uBACA,mBACA,qBAGF,eACE,wBAGF,cACE,+DAKA,yBACE,eAIJ,iBACE,WACA,YACA,aACA,mBACA,uBACA,sBACA,6CAEA,cLzkD4B,eAEC,0DK0kD3B,sBACA,CADA,gCACA,CADA,kBACA,4BAGF,iBACE,qEAGF,YACE,iBAIJ,iBACE,WACA,YACA,aACA,mBACA,uBACA,qBAEA,cLjmD4B,eAEC,WKkmD3B,YACA,sBACA,CADA,gCACA,CADA,kBACA,iBAIJ,YACE,aACA,mBACA,cACA,eACA,cZhqDmB,wBYmqDnB,aZnqDmB,mBYuqDnB,aACE,4BAGF,oBACE,0CAGF,iBACE,6DAEA,iBACE,oBACA,qCACA,UACA,4EAGF,mBACE,gCACA,UACA,0BAKN,aACE,gBACA,iBACA,gBACA,gBACA,kCAGF,aACE,gBACA,gBACA,uBACA,+BAGF,aACE,qBACA,WAGF,oBACE,oBAGF,YACE,kBACA,2BAGF,+BACE,mBACA,SACA,gBAGF,kBZpuDqB,cYsuDnB,kBACA,uCACA,aACA,mBAEA,eACE,qBAGF,yBACE,oBAGF,yBACE,uBAGF,sBACE,sBAGF,sBACE,uBAIJ,iBACE,QACA,SACA,2BACA,4BAEA,UACE,gBACA,2BACA,0BZzwDiB,2BY6wDnB,WACE,iBACA,uBACA,yBZhxDiB,8BYoxDnB,QACE,iBACA,uBACA,4BZvxDiB,6BY2xDnB,SACE,gBACA,2BACA,2BZ9xDiB,wBYoyDnB,cACE,iBACA,cACA,iBACA,sBACA,qBACA,mBZ1yDiB,WAHb,gBYgzDJ,uBACA,mBACA,yFAEA,kBZlyDiB,cAfA,UYszDf,sCAKN,aACE,iBACA,gBACA,QACA,gBACA,aACA,yCAEA,eACE,mBZp0DiB,cYs0DjB,kBACA,mCACA,gBACA,kBACA,sDAGF,OACE,wDAIA,UACE,8CAIJ,cACE,iBACA,cACA,iBACA,sBACA,qBACA,mBZ71DiB,WAHb,gBYm2DJ,uBACA,mBACA,oDAEA,SACE,oDAGF,kBZz1DiB,cAfA,iBY+2DrB,qBACE,eAGF,YACE,cACA,mBACA,2BACA,gBACA,kBACA,4BAEA,iBACE,uBAGF,YACE,uBACA,WACA,YACA,iBACA,6BAEA,WACE,gBACA,oBACA,aACA,yBACA,gBACA,oCAEA,0BACE,oCAGF,cACE,YACA,oBACA,YACA,6BAIJ,qBACE,WACA,gBACA,cACA,aACA,sBACA,qCAEA,4BARF,cASI,qBAMR,kBACE,wBACA,CADA,eACA,MACA,UACA,cACA,qCAEA,mBAPF,gBAQI,+BAGF,eACE,qCAEA,6BAHF,kBAII,gKAMJ,WAIE,mCAIJ,YACE,mBACA,uBACA,YACA,SAGF,WACE,kBACA,sBACA,aACA,sBACA,qBAEA,kBZl9DwB,8BYo9DtB,+BACA,KAIJ,aACE,CACA,qBACA,WACA,YACA,aAJA,YAYA,CARA,QAGF,WACE,sBACA,CACA,qBACA,kBACA,cAGF,aACE,cACA,sBACA,cZ9+DmB,qBYg/DnB,kBACA,eACA,oCACA,iBAGF,aAEE,gBACA,qCAGF,cACE,SACE,iBAGF,aAEE,CAEA,gBACA,yCAEA,iBACE,uCAGF,kBACE,qDAKF,gBAEE,kBACA,YAKN,qBACE,aACA,mBACA,cACA,gBACA,iBAGF,aACE,cACA,CACA,sBACA,WZziEM,qBY2iEN,kBACA,eACA,gBACA,gCACA,2BACA,mDACA,qBAEA,eACE,eACA,qCAMA,mEAHF,kBAII,4BACA,yBAIJ,+BACE,cZhjEiB,sBYojEnB,eACE,aACA,qCAIJ,qBAEI,cACE,wBAKN,qBACE,WACA,YACA,cACA,6DAEA,UAEE,YACA,UACA,wCAGF,YACE,cACA,kDACA,qCAEA,uCALF,aAMI,yCAIJ,eACE,oCAGF,YACE,uDAGF,cACE,sCAGF,gBACE,eACA,CACA,2BACA,yCAGF,QACE,mCAGF,gBACE,yBAEA,kCAHF,eAII,sCAIJ,sBACE,gBACA,sCAGF,uCACE,YACE,iKAEA,eAGE,6CAIJ,gBACE,2EAGF,YAEE,kGAGF,gBACE,+BAGF,2BACE,gBACA,uCAEA,SACE,SACA,wCAGF,eACE,wCAGF,gBACE,iBACA,qDAGF,UACE,gLAGF,eAIE,gCAIJ,iBACE,6CAEA,cACE,8CAKF,gBACE,iBACA,6DAGF,UACE,CAIA,yFAGF,eACE,8DAGF,gBACE,kBACA,0BAMR,cACE,aACA,uBACA,mBACA,gBACA,iBACA,iBACA,gBACA,mBACA,WL/uEM,kBKivEN,eACA,iBACA,qBACA,sCACA,4FAEA,kBAGE,qCAIJ,UACE,UACE,uDAGF,kCACE,4DAGF,kBAGE,yBAGF,aACE,iBAGF,eAEE,sCAIJ,2CACE,YACE,sCAOA,sEAGF,YACE,uCAIJ,0CACE,YACE,uCAIJ,UACE,YACE,mBAIJ,iBACE,yBAEA,iBACE,SACA,UACA,mBZzyEiB,yBY2yEjB,gBACA,kBACA,eACA,gBACA,iBACA,WZl0EI,mDYu0ER,oBACE,gBAGF,WACE,gBACA,aACA,sBACA,yBACA,kBACA,gCAEA,gBACE,oBACA,cACA,gBACA,6BAGF,sBACE,8BAGF,MACE,kBACA,aACA,sBACA,iBACA,oBACA,oBACA,mDAGF,eACE,sBLx2EI,0BK02EJ,cACA,gDAGF,iBACE,gDAGF,WACE,mBAIJ,eACE,mBACA,yBACA,gBACA,aACA,sBACA,qBAEA,aACE,sBAGF,aACE,SACA,CACA,4BACA,cACA,qDAHA,sBAOA,gBAMF,WACA,kBAGA,+BANF,qBACE,UACA,CAEA,eACA,aAiBA,CAhBA,eAGF,iBACE,MACA,OACA,mBACA,CAGA,qBACA,CACA,eACA,WACA,YACA,kBACA,uBAEA,kBZp6EwB,0BYy6E1B,u1BACE,OACA,gBACA,aACA,8BAEA,aACE,sBACA,CADA,4DACA,CADA,kBACA,+BACA,CADA,2BACA,WACA,YACA,oBACA,eACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,sCAGF,yBAjBF,aAkBI,iBAIJ,kBACE,eACA,gBACA,iBAGF,aACE,eACA,mBACA,mBACA,aACA,mBACA,kBACA,mBAEA,iCACE,yBAEA,kBACE,mCACA,aAKN,iBACE,kBACA,cACA,iCACA,mCAEA,eACE,yBAGF,YAVF,cAWI,oBAGF,YACE,sBACA,qBAGF,aACE,kBACA,iBACA,yBAKF,uBADF,YAEI,sBAIJ,qBACE,WACA,mBACA,cZ9+EmB,eYg/EnB,cACA,eACA,oBACA,SACA,iBACA,aACA,SACA,UACA,UACA,2BAEA,yBACE,6BAIJ,kBACE,SACA,oBACA,cZngFmB,eYqgFnB,mBACA,eACA,kBACA,UACA,mCAEA,yBACE,wCAGF,kBACE,2BAIJ,oBACE,iBACA,2BAGF,iBACE,kCAGF,cACE,cACA,eACA,aACA,kBACA,QACA,UACA,eAGF,oBACE,kBACA,eACA,6BACA,SACA,UACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,gDACA,wCACA,iCAGF,QACE,mBACA,WACA,YACA,gBACA,UACA,kBACA,UACA,yBAGF,kBACE,WACA,wBACA,qBAGF,UACE,YACA,UACA,mBACA,yBZrlFwB,qCYulFxB,sEAGF,wBACE,4CAGF,wBZjlFqB,+EYqlFrB,wBACE,2BAGF,iBACE,WACA,YACA,MACA,SACA,gBACA,mBACA,cACA,SACA,UACA,6BACA,CAKA,uEAFF,SACE,6BAeA,CAdA,sBAGF,iBACE,WACA,YACA,MACA,SACA,gBACA,mBACA,cACA,WAGA,8CAGF,SACE,qBAGF,iBACE,QACA,SACA,WACA,YACA,yBACA,kBACA,sBACA,sBACA,yBACA,sCACA,4CAGF,SACE,qBZ7oFmB,cYipFrB,kBACE,WZpqFM,cYsqFN,eACA,aACA,qBACA,2DAEA,kBAGE,oBAGF,SACE,2BAGF,sBACE,cZnrFiB,kGYsrFjB,sBAGE,WZ5rFE,kCYgsFJ,aZ9qFiB,oBYorFrB,oBACE,iBACA,qBAGF,oBACE,kBACA,eACA,iBACA,gBACA,mBZ3sFwB,gBY6sFxB,iBACA,oBAGF,kBZjtF0B,cAiBR,iBYmsFhB,eACA,gBACA,eACA,yDAGF,kBZ1tF0B,cYguF1B,aACE,kBAGF,aZntFkB,cYqtFhB,8BACA,+BACA,4EAEA,0BAGE,CAHF,uBAGE,CAHF,kBAGE,kDAMA,sBACA,YACA,wDAEA,kBACE,8DAGF,cACE,sDAGF,cACE,0DAEA,aZjvFY,0BYmvFV,sDAIJ,oBACE,cZ3wFe,sMY8wFf,yBAGE,oDAKN,aZnwFgB,0BYywFhB,aACE,UACA,mCACA,CADA,0BACA,gBACA,6BAEA,cACE,cZnyFe,aYqyFf,gBACA,gCACA,sCAGF,oDACE,YACE,uCAIJ,oDACE,YACE,uCAIJ,yBA1BF,YA2BI,yCAGF,eACE,aACA,iDAEA,aZ9zFe,qBYq0FrB,eACE,gBACA,2BAEA,iBACE,aACA,wBAGF,kBACE,yBAGF,oBACE,gBACA,yBACA,yBACA,eAIJ,aACE,sBACA,WACA,SACA,WZj2FM,gBOCA,aKm2FN,oBACA,eACA,gBACA,SACA,UACA,kBACA,qBAEA,SACE,qCAGF,cAnBF,cAoBI,oDAIJ,uBACE,YACA,6CACA,uBACA,sBACA,WACA,0DAEA,sBACE,0DAKJ,uBACE,2BACA,gDAGF,aZj3FsB,6BYm3FpB,uDAGF,aZ33FqB,cY+3FrB,YACE,eACA,yBACA,kBACA,cZ/3FgB,gBYi4FhB,qBACA,gBACA,uBAEA,QACE,OACA,kBACA,QACA,MAIA,iDAHA,YACA,uBACA,mBAUE,CATF,0BAEA,yBACE,kBACA,iBACA,cAIA,sDAGF,cAEE,cZ96Fe,uBYg7Ff,SACA,cACA,qBACA,eACA,iBACA,sMAEA,UZ17FE,yBYi8FJ,cACE,kBACA,YACA,eAKN,cACE,qBAEA,kBACE,oBAIJ,cACE,cACA,qBACA,WACA,YACA,SACA,2BAIA,UACE,YACA,qBAIJ,aACE,gBACA,kBACA,cZj+FmB,gBYm+FnB,uBACA,mBACA,qBACA,uBAGF,aACE,gBACA,2BACA,2BAGF,aZ/+FqB,oBYm/FrB,aACE,eACA,eACA,gBACA,uBACA,mBACA,qBAGF,cACE,mBACA,kBACA,yBAEA,cACE,kBACA,yBACA,QACA,SACA,+BACA,yBAIJ,aACE,6CAEA,UACE,mDAGF,yBACE,6CAGF,mBACE,sBAIJ,oBACE,kCAEA,QACE,4CAIA,oBACA,0CAGF,kBACE,0CAGF,aACE,6BAIJ,wBACE,2BAGF,yBACE,cACA,SACA,WACA,YACA,oBACA,CADA,8BACA,CADA,gBACA,sBACA,wBACA,YAGF,aACE,cZ7iGgB,6BY+iGhB,SACA,kBACA,kBACA,oBACA,SACA,aACA,sBACA,WACA,WACA,qBACA,kBAEA,kBACE,WAIJ,+BACE,yBAGF,iBACE,eACA,gBACA,cZvkGgB,mBAjBQ,eY2lGxB,aACA,cACA,sBACA,mBACA,uBACA,aACA,qEAGE,aAEE,WACA,aACA,SACA,yCAIJ,gBACE,gCAGF,eACE,uCAEA,aACE,mBACA,cZrmGY,qCYymGd,cACE,gBACA,yBAKN,iBACE,cACA,uCAGE,aACE,WACA,kBACA,SACA,OACA,QACA,cACA,UACA,oBACA,YACA,UACA,kFACA,gBAKN,YACE,eACA,mBACA,cACA,eACA,kBACA,UACA,UACA,gBACA,2BACA,4BACA,uBAEA,QACE,SACA,yBACA,cACA,uBACA,aACA,gBACA,uBACA,gBACA,mBACA,OACA,4CAGF,aZrqGmB,uBYyqGnB,sCACE,4CAEA,aZ5qGiB,yCY8qGf,4CAIJ,SAEE,yBAIJ,WACE,aACA,uBAGF,kBACE,iCAGF,iBACE,wBAGF,kBACE,SACA,cZttGmB,eYwtGnB,eACA,eACA,8BAEA,aACE,CAKA,kEAEA,UZvuGI,mBYyuGF,6BAKN,eACE,gBACA,gBACA,cZ9uGmB,0DYgvGnB,UACA,uCAEA,YACE,WACA,uCAGF,iBACE,gCAGF,QACE,uBACA,SACA,6BACA,cACA,mCAIJ,kBACE,aACA,mCAIA,aZ3wGmB,0BY6wGjB,gCAIJ,WACE,4DAEA,cACE,uEAEA,eACE,WAKN,oBACE,UACA,oBACA,kBACA,cACA,SACA,uBACA,eACA,sBAGF,oBACE,iBACA,oBAGF,aZ1xGkB,eY4xGhB,gBACA,iBACA,kBACA,QACA,SACA,+BACA,yBAEA,aACE,WACA,CACA,0BACA,oBACA,mBACA,4BAIJ,iBACE,QACA,SACA,+BACA,WACA,YACA,sBACA,6BACA,CACA,wBACA,kBACA,2CAGF,2EACE,CADF,mEACE,8CAGF,4EACE,CADF,oEACE,qCAGF,GACE,sBACE,KAGF,2BACE,KAGF,2BACE,KAGF,yBACE,IAGF,wBACE,EArBF,4BAGF,GACE,sBACE,KAGF,2BACE,KAGF,2BACE,KAGF,yBACE,IAGF,wBACE,uCAIJ,GACE,wBACE,KAGF,0BACE,KAGF,2BACE,KAGF,uBACE,IAGF,sBACE,EAtBA,6BAIJ,GACE,wBACE,KAGF,0BACE,KAGF,2BACE,KAGF,uBACE,IAGF,sBACE,mCAIJ,GACE,OACE,SACA,yBACA,KAGF,wBACE,KAGF,UACE,YACA,6BACA,kBACA,UACA,IAGF,UACE,YACA,eACA,UACA,6BACA,EA5BA,yBAIJ,GACE,OACE,SACA,yBACA,KAGF,wBACE,KAGF,UACE,YACA,6BACA,kBACA,UACA,IAGF,UACE,YACA,eACA,UACA,6BACA,kCAIJ,GACE,gBACA,aACA,aAPE,wBAIJ,GACE,gBACA,aACA,gCAGF,kBACE,gBZx6GM,WADA,eY46GN,aACA,sBACA,YACA,uBACA,eACA,kBACA,kBACA,YACA,gBAGF,eZt7GQ,cAEa,SYu7GnB,UACA,WACA,YACA,kBACA,wBACA,CADA,oBACA,CADA,eACA,iEAEA,SAGE,cACA,yBAIJ,aACE,eACA,yBAGF,aACE,eACA,gBACA,iBAGF,KACE,OACA,WACA,YACA,kBACA,YACA,2BAEA,aACE,SACA,QACA,WACA,YACA,6BAGF,mBACE,yBAGF,YACE,0BAGF,aACE,uBACA,WACA,YACA,SACA,iCAEA,oBACE,8BACA,kBACA,iBACA,WZv/GE,gBYy/GF,eACA,+LAMA,6BACE,mEAKF,6BACE,6BAMR,kBACE,iBAGF,kBACE,6BACA,gCACA,aACA,mBACA,eACA,kDAGF,aAEE,kBACA,yBAGF,kBACE,aACA,2BAGF,aZliHqB,eYoiHnB,cACA,gBACA,mBACA,kDAIA,kBACE,oDAIA,SEtiHF,sBACA,WACA,SACA,gBACA,oBACA,mBdbwB,cAFL,eckBnB,SACA,+EFgiHI,aACE,CEjiHN,qEFgiHI,aACE,CEjiHN,yEFgiHI,aACE,CEjiHN,0EFgiHI,aACE,CEjiHN,gEFgiHI,aACE,sEAGF,QACE,yLAGF,mBAGE,0DAGF,kBACE,qCAGF,mDArBF,cAsBI,yDAIJ,aZvjHc,iBYyjHZ,eACA,4DAGF,gBACE,wDAGF,kBACE,gEAEA,cACE,iNAEA,kBAGE,cACA,gHAKN,aZnmHiB,0HYwmHjB,cAEE,gBACA,cZxlHY,kZY2lHZ,aAGE,gEAIJ,wBACE,iDAGF,eL3nHI,kBO0BN,CAEA,eACA,cdHiB,uCcKjB,UF8lHI,mBZ3nHe,oDc+BnB,adPiB,ecSf,gBACA,mBACA,oDAGF,aACE,oDAGF,kBACE,oDAGF,eACE,WdlDI,sDYkoHJ,WACE,mDAGF,UZtoHI,kBYwoHF,eACA,8HAEA,kBAEE,iCAON,kBACE,mBAIJ,UZzpHQ,kBY2pHN,cACA,mBACA,sBZ5pHM,eY8pHN,gBACA,YACA,kBACA,WACA,yBAEA,SACE,iBAIJ,aACE,iBACA,wBAGF,aZ5qHqB,qBY8qHnB,mBACA,gBACA,sBACA,uCAGF,aZjqHkB,mBAjBQ,kBYsrHxB,aACA,eACA,gBACA,eACA,aACA,cACA,mBACA,uBACA,yBAEA,sCAdF,cAeI,kDAGF,eACE,2CAGF,aZ3rHmB,qBY6rHjB,uDAEA,yBACE,eAKN,qBACE,8BAGF,GACE,kBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,oBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,kBACE,2CACA,CADA,kCACA,EA1BF,qBAGF,GACE,kBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,oBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,kBACE,2CACA,CADA,kCACA,mCAIJ,8BACE,2DACA,CADA,kDACA,iCAGF,MACE,sBAEE,0BACA,KAGF,sBACE,aAGF,uBAGE,aAGF,sBAGE,KAGF,uBACE,KAGF,sBACE,EA/BF,wBAGF,MACE,sBAEE,0BACA,KAGF,sBACE,aAGF,uBAGE,aAGF,sBAGE,KAGF,uBACE,KAGF,sBACE,kCAIJ,yBACE,8EACA,CADA,qEACA,8BAGF,eL/xHQ,kBKiyHN,sCACA,kBACA,eACA,UACA,iDAEA,2BACE,2DAGF,UACE,mCAIJ,iBACE,SACA,WACA,eACA,yCAGF,iBACE,UACA,SACA,UACA,gBL3zHM,kBK6zHN,sCACA,gBACA,gDAEA,aACE,eACA,SACA,gBACA,uBACA,iKAEA,4BAGE,2DAIJ,WACE,wBAKF,2BACE,cAIJ,kBACE,8BACA,aACA,YACA,uBACA,OACA,UACA,kBACA,MACA,kBACA,WACA,aACA,gBAEA,mBACE,oBAIJ,WACE,aACA,aACA,sBACA,kBACA,YACA,0BAGF,iBACE,MACA,QACA,SACA,OACA,WACA,kBACA,mBZz3HwB,kCY23HxB,uBAGF,MACE,aACA,mBACA,uBACA,cZp4HmB,eYs4HnB,gBACA,0BACA,kBACA,kBAGF,YACE,cZ74HmB,gBY+4HnB,aACA,sBAEA,cACE,kBACA,uBAGF,cACE,gBACA,cACA,0BAIJ,aACE,4BAGF,UACE,WACA,kBACA,mBZz5HsB,kBY25HtB,eACA,2BAGF,iBACE,OACA,MACA,WACA,mBZh6HmB,kBYk6HnB,eAGF,aACE,eACA,iBACA,gBACA,WACA,UACA,eACA,0CAEA,mBAEE,mBAGF,8BACE,CADF,sBACE,WACA,cACA,CACA,UACA,YACA,eACA,CAQE,6GAKN,SACE,oBACA,CADA,WACA,6BAGF,iBACE,gBL99HM,uCKg+HN,kBACA,iBACA,gBACA,iCAEA,yBACE,oCAGF,sBACE,2BAIJ,UZ/+HQ,aYi/HN,eACA,aACA,kEAEA,kBZn+HmB,WAlBb,UYy/HJ,CZz/HI,4RY8/HF,UZ9/HE,wCYogIN,kBACE,iCAIJ,YACE,mBACA,uBACA,kBACA,oCAGF,aACE,cZ9gImB,2CYihInB,eACE,cACA,WZthII,CY2hIA,wQADF,eACE,mDAON,eLjiIM,0BKmiIJ,qCACA,gEAEA,eACE,0DAGF,kBZzhIiB,uEY4hIf,UZ9iIE,uDYojIN,yBACE,sDAGF,aACE,sCACA,SAIJ,iBACE,gBAGF,SErjIE,sBACA,WACA,SACA,gBACA,oBACA,mBdbwB,cAFL,eckBnB,SACA,cF+iIA,CACA,2BACA,iBACA,eACA,2CAEA,aACE,CAHF,iCAEA,aACE,CAHF,qCAEA,aACE,CAHF,sCAEA,aACE,CAHF,4BAEA,aACE,kCAGF,QACE,6EAGF,mBAGE,sBAGF,kBACE,qCAGF,eA3BF,cA4BI,kCAKF,QACE,qDAGF,mBAEE,mBAGF,iBACE,SACA,WACA,UACA,qBACA,UACA,0BACA,sCACA,eACA,WACA,YACA,cZpnIiB,eYsnIjB,oBACA,0BAEA,mBACE,WACA,0BAIJ,uBACE,iCAEA,mBACE,uBACA,gCAIJ,QACE,uBACA,cZtnIkB,eYwnIlB,uCAEA,uBACE,sCAGF,aACE,yBAKN,aZroIkB,mBYuoIhB,aACA,gBACA,eACA,eACA,6BAEA,oBACE,iBACA,0BAIJ,iBACE,6BAEA,kBACE,gCACA,eACA,aACA,aACA,gBACA,eACA,cZ7pIc,iCYgqId,oBACE,iBACA,8FAIJ,eAEE,0BAIJ,aACE,aACA,cZjsImB,qBYmsInB,+FAEA,aAGE,0BACA,uBAIJ,YACE,cZ9sImB,kBYgtInB,aAGF,iBACE,8BACA,oBACA,aACA,sBAGF,cACE,MACA,OACA,QACA,SACA,8BACA,wBAGF,cACE,MACA,OACA,WACA,YACA,aACA,sBACA,mBACA,uBACA,2BACA,aACA,oBACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,oBAGF,mBACE,aACA,aACA,yBAGF,eACE,iBACA,yBAGF,UACE,cAGF,UACE,YACA,kBACA,qCAEA,UACE,YACA,aACA,mBACA,uBACA,2CAEA,cL7tI0B,eAEC,CKuuI7B,8CALF,iBACE,MACA,OACA,QACA,SAYA,CAXA,yBAQA,mBACA,8BACA,oBACA,4BAEA,mBACE,0DAGF,SACE,4DAEA,mBACE,mBAKN,6BACE,sBACA,SACA,WZ1zIM,eY4zIN,aACA,mBACA,eACA,cACA,cACA,kBACA,kBACA,MACA,SACA,yBAGF,MACE,0BAGF,OACE,CASA,4CANF,UACE,kBACA,kBACA,OACA,YACA,oBAUA,6BAEA,WACE,sBAGF,mBACE,qBACA,gBACA,cZr2IiB,mFYw2IjB,yBAGE,wBAKN,oBACE,sBAGF,qBZv3IQ,YYy3IN,WACA,kBACA,YACA,UACA,SACA,YACA,8BAGF,wBZh3IqB,qBYo3IrB,iBACE,UACA,QACA,YACA,6CAGF,kBZ14IqB,WAHb,kBYk5IN,gBACA,aACA,sBACA,oBAGF,WACE,WACA,gBACA,iBACA,kBACA,wBAEA,iBACE,MACA,OACA,WACA,YACA,sBACA,aACA,aACA,CAGA,YACA,UACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,2CANA,qBACA,mBACA,uBAaF,CATE,mBAIJ,YACE,CAGA,iBACA,mDAGF,aAEE,mBACA,aACA,aACA,2DAEA,cACE,uLAGF,aZj8ImB,SYo8IjB,eACA,gBACA,kBACA,oBACA,YACA,aACA,kBACA,6BACA,+mBAEA,aAGE,yBACA,CZr9IE,wyEY49IF,UAGE,sBAMR,sBACE,eAGF,iBACE,eACA,mBACA,sBAEA,eACE,WZ/+II,kBYi/IJ,eACA,qBAGF,kBZh/IwB,cAFL,gBYq/IjB,aACA,kBACA,kBAIJ,oBACE,eACA,gBACA,iBACA,wFAGF,kBAME,WZ3gJM,kBY6gJN,gBACA,eACA,YACA,kBACA,sBACA,4NAEA,aACE,eACA,mBACA,wLAGF,WACE,UACA,kBACA,SACA,WACA,kRAGF,aACE,wBAKF,eLviJM,CPEa,gBYwiJjB,oBACA,iEL3iJI,2BPEa,yBYijJrB,iBACE,aACA,iCAEA,wBACE,CADF,qBACE,CADF,oBACE,CADF,gBACE,gBACA,2GAIJ,YAIE,8BACA,mBZhkJmB,aYkkJnB,iBACA,2HAEA,aACE,iBACA,cZvkJiB,mBYykJjB,2IAGF,aACE,6BAIJ,cACE,2BAGF,WACE,eACA,0BAGF,gBAEE,sDAGF,qBAEE,eAGF,UACE,gBACA,0BAGF,YACE,6BACA,qCAEA,yBAJF,cAKI,gBACA,iDAIJ,qBAEE,UACA,qCAEA,+CALF,UAMI,sDAIJ,aAEE,gBACA,gBACA,gBACA,kBACA,2FAEA,aZtnJmB,iLY0nJnB,UZ5oJM,qCYipJN,oDAjBF,eAkBI,sCAKF,4BADF,eAEI,yBAIJ,YACE,+BACA,gBACA,0BAEA,cACE,iBACA,mBACA,sCAGF,aACE,sBACA,WACA,CACA,UZ3qJI,gBOCA,aK6qJJ,oBACA,eACA,YACA,CACA,SACA,kBACA,yBACA,iBACA,gBACA,gBACA,4CAEA,wBACE,+CAGF,eL7rJI,yBK+rJF,mBACA,kBACA,6DAEA,QACE,gBACA,gBACA,mEAEA,QACE,0DAIJ,UZ9sJE,oBYgtJA,eACA,gBLhtJA,+CKqtJJ,YACE,8BACA,mBACA,4CAIJ,aACE,WZ9tJI,eYguJJ,gBACA,mBACA,wCAGF,eACE,mBACA,+CAEA,UZzuJI,eY2uJF,qCAIJ,uBAnFF,YAoFI,eACA,QACA,wCAEA,iBACE,iBAKN,eACE,eACA,wBAEA,eACE,iBACA,2CAGF,eACE,mBAGF,eACE,cACA,gBACA,+BAEA,4BACE,4BAGF,QACE,oCAIA,UZrxJE,aYuxJA,kBACA,eACA,mBACA,qBACA,8EAEA,eAEE,yWAOA,kBZpxJW,WAlBb,uDY6yJA,iBACE,oMAUR,aACE,iIAIJ,4BAIE,cZ9zJmB,eYg0JnB,gBACA,6cAEA,aAGE,6BACA,qGAIJ,YAIE,eACA,iIAEA,eACE,CAII,w1BADF,eACE,sDAMR,iBAEE,oDAKA,eACE,0DAGF,eACE,mBACA,aACA,mBACA,wEAEA,UZj3JI,CYm3JF,gBACA,uBAKN,YACE,2CAEA,QACE,WACA,cAIJ,wBZh3JqB,WYk3JnB,kBACA,MACA,OACA,aACA,6BAGF,aACE,kBACA,WZ74JM,8BY+4JN,WACA,SACA,gBACA,kBACA,eACA,gBACA,UACA,oBACA,WACA,4BACA,iBACA,2DAKE,YACE,wDAKF,SACE,uBAKN,eACE,6BAEA,UACE,kBAIJ,YACE,eACA,yBACA,kBACA,gBACA,gBACA,wBAEA,aACE,cZt6Jc,iBYw6Jd,eACA,+BACA,aACA,sBACA,mBACA,uBACA,eACA,4BAEA,aACE,wBAIJ,eACE,CACA,qBACA,aACA,sBACA,uBACA,2BAEA,aACE,cACA,0BAGF,oBACE,cZp8JY,gBYs8JZ,gCAEA,yBACE,0BAKN,QACE,eACA,iDAEA,SACE,cACA,8BAGF,aZv9Jc,gBY+9JhB,cACA,CACA,iBACA,CACA,UACA,qCANF,qBACE,CACA,eACA,CACA,iBAYA,CAVA,qBAGF,QACE,CACA,aACA,WACA,CACA,iBAEA,qEAGE,cACE,MACA,gCAKN,cACE,cACA,qBACA,cZ9gKmB,kBYghKnB,UACA,mEAEA,WAEE,WACA,CAIA,2DADF,mBACE,CADF,8BACE,CADF,gBZ3hKM,CY4hKJ,wBAIJ,UACE,YACA,CACA,iBACA,MACA,OACA,UACA,gBZviKM,iCY0iKN,YACE,sBAIJ,WACE,gBACA,kBACA,WACA,qCAGF,cACE,YACA,oBACA,CADA,8BACA,CADA,gBACA,kBACA,QACA,2BACA,WACA,UACA,sCAGF,0BACE,2BACA,gBACA,kBACA,qKAMA,WAEE,mFAGF,WACE,eAKJ,qBACE,kBACA,mBACA,kBACA,oBACA,cACA,wBAEA,eACE,YACA,yBAGF,cACE,kBACA,gBACA,gCAEA,UACE,cACA,kBACA,6BACA,WACA,SACA,OACA,oBACA,qCAIJ,oCACE,iCAGF,wBACE,uCAIA,mBACA,mBACA,6BACA,0BACA,eAIJ,eACE,kBACA,gBLxoKM,eK0oKN,kBACA,sBACA,cACA,wBAEA,eACE,sBACA,qBAGF,SACE,qBAGF,eACE,gBACA,UACA,0BAGF,oBACE,sBACA,SACA,gCAEA,wBACE,0BACA,qBACA,sBACA,UACA,4BAKF,qBACE,CADF,gCACE,CADF,kBACE,kBACA,QACA,2BACA,yBAIJ,iBACE,UACA,SACA,OACA,QACA,sBACA,iFACA,eACA,UACA,4BACA,gCAEA,SACE,6EAKF,iBAEE,wBAIJ,YACE,kBACA,MACA,OACA,WACA,YACA,UACA,SACA,gBZptKI,cAEa,gBYqtKjB,oBACA,+BAEA,aACE,oBACA,8GAEA,aAGE,+BAIJ,aACE,eACA,kCAGF,aACE,eACA,gBACA,4BAIJ,YACE,8BACA,oBACA,0DAEA,aACE,wBAIJ,cACE,mBACA,gBACA,uBACA,oCAGE,cACE,qCAKF,eACE,+BAIJ,sBACE,iBACA,eACA,SACA,0BACA,8GAEA,ULpxKE,+EK4xKN,cAGE,gBACA,6BAGF,ULnyKM,iBKqyKJ,yBAGF,oBACE,aACA,mDAGF,UL7yKM,uBKkzKN,cACE,YACA,eACA,8BAEA,UACE,WACA,+BAOA,6DANA,iBACA,cACA,kBACA,WACA,UACA,YAWA,CAVA,+BASA,kBACA,+BAGF,iBACE,UACA,kBACA,WACA,YACA,YACA,UACA,4BACA,mBACA,sCACA,oBACA,qBAIJ,gBACE,uBAEA,oBACE,eACA,gBACA,WLl2KE,sFKq2KF,yBAGE,qBAKN,cACE,YACA,kBACA,4BAEA,UACE,WACA,+BACA,kBACA,cACA,kBACA,WACA,SACA,2DAGF,aAEE,kBACA,WACA,kBACA,SACA,mBACA,6BAGF,6BACE,6BAGF,iBACE,UACA,UACA,kBACA,WACA,YACA,QACA,iBACA,4BACA,mBACA,sCACA,oBACA,CAGE,yFAKF,SACE,6GAQF,gBACE,oBACA,kBAON,UACE,cACA,+BACA,0BAEA,UACE,qCAGF,iBATF,QAUI,mBAIJ,qBACE,mBACA,uBAEA,YACE,kBACA,gBACA,gBACA,2BAEA,aACE,WACA,YACA,SACA,oBACA,CADA,8BACA,CADA,gBACA,uBAIJ,YACE,mBACA,mBACA,aACA,6BAEA,aACE,aACA,mBACA,qBACA,gBACA,qCAGF,UACE,eACA,cACA,+BAGF,aACE,WACA,YACA,gBACA,mCAEA,UACE,YACA,cACA,SACA,kBACA,mBACA,oBACA,CADA,8BACA,CADA,gBACA,qCAIJ,gBACE,gBACA,4CAEA,cACE,WZ7/KF,gBY+/KE,gBACA,uBACA,0CAGF,aACE,eACA,cZngLW,gBYqgLX,gBACA,uBACA,yBAKN,kBZ1gLsB,aY4gLpB,mBACA,uBACA,gDAEA,YACE,cACA,eACA,mDAGF,qBACE,kBACA,gCACA,WACA,gBACA,mBACA,gBACA,uBACA,qDAEA,YACE,iEAEA,cACE,sDAIJ,YACE,6BAOV,YACE,eACA,gBACA,wBAGF,QACE,sBACA,cACA,kBACA,kBACA,gBACA,WACA,+BAEA,iBACE,QACA,SACA,+BACA,eACA,sDAIJ,kBAEE,gCACA,eACA,aACA,cACA,oEAEA,kBACE,SACA,SACA,6HAGF,aAEE,cACA,cZ3lLiB,eY6lLjB,eACA,gBACA,kBACA,qBACA,kBACA,yJAEA,aZpmLiB,qWYumLf,aAEE,WACA,kBACA,SACA,SACA,QACA,SACA,2BACA,CAEA,4CACA,CADA,kBACA,CADA,wBACA,iLAGF,WACE,6CACA,8GAKN,kBACE,gCACA,qSAKI,YACE,iSAGF,4CACE,cAOV,kBZ9oL0B,sBYipLxB,iBACE,4BAGF,aACE,eAIJ,cACE,kBACA,qBACA,cACA,iBACA,eACA,mBACA,gBACA,uBACA,eACA,oEAEA,YAEE,sBAGF,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,8BAEA,oBACE,mBACA,2BAKN,eACE,gBAGF,eLvsLQ,kBO0BN,CACA,sBACA,gBACA,cdHiB,uCcKjB,mBAEA,adPiB,ecSf,gBACA,mBACA,mBAGF,aACE,mBAGF,kBACE,mBAGF,eACE,WdlDI,UY4sLR,iBACE,cAEA,WACE,WACA,sCACA,CADA,6BACA,cAGF,cACE,iBACA,cZptLiB,gBYstLjB,gBAEA,aZzsLiB,0BY2sLf,sBAEA,oBACE,4BAMR,GACE,cACA,eACA,WATM,mBAMR,GACE,cACA,eACA,qEAGF,kBAIE,sBAEE,8BACA,iBAGF,0BACE,kCACA,+BAIA,qDACE,uEACA,+CAGF,sBACE,8BACA,6DAIA,6BACE,6CACA,4EAIF,6BACE,6CACA,+CAOJ,gBAEE,+BAGF,gBACE,6CAEA,0BACE,wDAGF,eACE,6DAGF,iBACE,iBACA,2EAIA,mBACE,UACA,gCACA,WACA,0FAGF,mBACE,UACA,oCACA,eAOV,UACE,eACA,gBACA,iBAEA,YACE,gBACA,eACA,kBACA,sCAGF,YACE,4CAEA,kBACE,yDAGF,SACE,sBACA,cACA,WACA,SACA,aACA,gDACA,mBZl1LoB,WALlB,eY01LF,CACA,eACA,kBACA,2EAEA,QACE,wMAGF,mBAGE,+DAGF,kBACE,qCAGF,wDA7BF,cA8BI,4DAIJ,WACE,eACA,gBACA,SACA,kBACA,sBAMJ,sBACA,mBACA,6BACA,gCACA,+BAEA,iBACE,iBACA,cZ/2Lc,CYk3Ld,eACA,eACA,oCAEA,aACE,gBACA,uBACA,oCAIJ,UACE,kBACA,uDAGF,iBACE,qDAGF,eACE,qBAKF,wBACA,aACA,2BACA,mBACA,mBACA,2BAEA,aACE,iCAEA,UACE,uCAEA,SACE,kCAKN,aACE,cACA,mBAIJ,cACE,kBACA,MACA,OACA,WACA,YACA,8BACA,cAGF,kBZh8L0B,sBYk8LxB,kBACA,uCACA,YACA,gBACA,qCAEA,aARF,SASI,kBAGF,cACE,mBACA,gBACA,eACA,kBACA,0BACA,6BAGF,WACE,6BAGF,yBACE,sCAEA,uBACE,uCACA,wBACA,wBAIJ,eACE,kDAIA,oBACE,+BAIJ,cACE,sBAGF,eACE,aAIJ,kBZt/L0B,sBYw/LxB,kBACA,uCACA,YACA,gBACA,qCAEA,YARF,SASI,uBAGF,kBACE,oBAGF,kBACE,YACA,0BACA,gBACA,mBAGF,YACE,gCACA,4BAGF,YACE,iCAGF,aACE,gBACA,qBACA,eACA,aACA,cAIJ,iBACE,YACA,gBACA,YACA,aACA,uBACA,mBACA,gBL3iMM,yDK8iMN,aAGE,gBACA,WACA,YACA,SACA,sBACA,CADA,gCACA,CADA,kBACA,gBLtjMI,uBK0jMN,iBACE,YACA,aACA,+BACA,iEACA,kBACA,wCACA,uBAGF,iBACE,WACA,YACA,MACA,OACA,uBAGF,iBACE,YACA,WACA,UACA,YACA,4BACA,6BAEA,UACE,8BAGF,UZxlMI,eY0lMF,gBACA,cACA,kBACA,2BAGF,iBACE,mCACA,qCAIJ,oCACE,eAEE,uBAGF,YACE,4BAKN,aZ/mMqB,eYinMnB,gBACA,gBACA,kBACA,qBACA,6BAEA,kBACE,wCAEA,eACE,6BAIJ,aACE,0BACA,mCAEA,oBACE,kBAKN,eACE,2BAEA,UACE,8FAEA,8BAEE,CAFF,sBAEE,wBAIJ,iBACE,SACA,UACA,yBAGF,eACE,aACA,kBACA,mBACA,6BAEA,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,uBAIJ,iBACE,mBACA,YACA,gCACA,+BAEA,aACE,cACA,WACA,iBACA,gDAEA,kBACE,yBACA,wBAKN,YACE,uBACA,gBACA,iBACA,iCAEA,YACE,mBACA,iBACA,gBACA,8CAEA,wBACE,kBACA,uBACA,YACA,yCAGF,YACE,8BAIJ,WACE,4CAEA,kBACE,wCAGF,UACE,YACA,iCAGF,cACE,iBACA,WZtuMA,gBYwuMA,gBACA,mBACA,uBACA,uCAEA,aACE,eACA,cZ5uMW,gBY8uMX,gBACA,uBACA,gCAKN,aACE,uBAIJ,eACE,cACA,iDAGE,qBACA,WZnwME,gDYuwMJ,QACE,6BACA,kDAEA,aACE,yEAGF,uBACE,4DAGF,aZ1wMU,yBYgxMd,cACE,gCAEA,cACE,cZ1xMe,eY4xMf,kCAEA,oBACE,cZ/xMa,qBYiyMb,iBACA,gBACA,yCAEA,eACE,WZzyMF,iBYkzMN,aZ5xMgB,mBY8xMd,gCACA,gBACA,aACA,eACA,eACA,qBAEA,oBACE,iBACA,eAIJ,YACE,mBACA,aACA,gCACA,0BAEA,eACE,qBAGF,aACE,cZtzMY,gBYwzMZ,uBACA,mBACA,4BAEA,eACE,uBAGF,aZn1Me,qBYq1Mb,eACA,gBACA,cACA,gBACA,uBACA,mBACA,qGAKE,yBACE,wBAMR,aACE,eACA,iBACA,gBACA,iBACA,mBACA,gBACA,cZ92Me,0BYk3MjB,aACE,WACA,2CAEA,mCACE,yBACA,0CAGF,wBACE,eAMR,YACE,gCACA,CACA,iBACA,qBAEA,kBACE,UACA,uBAGF,aACE,CACA,sBACA,kBACA,uBAGF,oBACE,mBZt4MiB,kBYw4MjB,cACA,eACA,wBACA,wBAGF,aACE,CACA,0BACA,gBACA,8BAEA,eACE,aACA,2BACA,8BACA,uCAGF,cACE,cZ36Me,kBY66Mf,+BAGF,aZh7MiB,eYk7Mf,mBACA,gBACA,uBACA,kBACA,gBACA,YACA,iCAEA,UZ77ME,qBY+7MA,oHAEA,yBAGE,0BAKN,qBACE,uBAIJ,kBACE,6BAEA,kBACE,oDAGF,eACE,6DAGF,UZz9MI,OeDR,eACE,eACA,UAEA,kBACE,kBACA,cAGF,iBACE,MACA,OACA,YACA,qBACA,kBACA,mBACA,sBAEA,kBACE,aAIJ,iBACE,aACA,cACA,iBACA,eACA,gBACA,gEAEA,YAEE,gCAGF,aACE,8BAGF,aACE,sBACA,WACA,eACA,Wf3CE,Ue6CF,oBACA,gBR7CE,sBQ+CF,kBACA,iBACA,oCAEA,oBflCe,wBeuCjB,cACE,sBAGF,YACE,mBACA,iBACA,cAIJ,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,gBACA,mBACA,cACA,uBAEA,iBACE,qBAGF,oBf/EY,8EeoFZ,gBAGE,gBACA,gCAGF,mBACE,SACA,wCAGF,mBAEE,eAIJ,oBACE,WACA,gBACA,CACA,oBACA,iBACA,gBACA,mBACA,cACA,mBAGF,UACE,iBACA,eAGF,eACE,mBACA,cf5Gc,aegHhB,cACE,uBACA,UACA,SACA,SACA,cfrHc,0BeuHd,kBACA,mBAEA,oBACE,sCAGF,kCAEE,eAIJ,WACE,eACA,kBACA,eACA,6BAIJ,yBACE,gCAEA,YACE,2CAGF,yBACE,aACA,aACA,mBACA,mGAEA,YAEE,+GAEA,oBfjKe,sDeuKnB,cACE,gBACA,iBACA,YACA,oBACA,cfvKkB,sCe0KlB,gCAGF,YACE,mBACA,4CAEA,aACE,wBACA,iBACA,oCAIJ,uBACE,CADF,oBACE,CADF,eACE,sBACA,eACA,WflNI,qBeoNJ,WACA,UACA,oBACA,qXACA,sBACA,kBACA,CACA,yBACA,mDAGF,UACE,cAIJ,af9MkB,qBeiNhB,+BACE,6BAEA,8BACE,eC5ON,k1BACE,aACA,sBACA,aACA,UACA,yBAGF,YACE,OACA,sBACA,yBACA,2BAEA,MACE,iBACA,qCAIJ,gBACE,YACE,cCtBJ,cACE,qBACA,WjBDM,2BiBIN,qBAEE,iBACA,+BAGF,WACE,iBAIJ,sBACE,6BAEA,uBACE,2BACA,4BACA,mBjBlBiB,4BiBsBnB,oBACE,8BACA,+BACA,aACA,qBAIJ,YACE,8BACA,cACA,cjBjCmB,ciBmCnB,oBAGF,iBACE,OACA,kBACA,iBACA,gBACA,8BACA,eACA,0BAEA,aACE,6BAIJ,ajBrCqB,mCiBwCnB,aACE,oDAGF,WACE,wBAIJ,iBACE,YACA,OACA,WACA,WACA,yBjBtDmB,uBiB2DnB,oBACE,WACA,eACA,yBAGF,iBACE,gBACA,oBAIJ,iBACE,aACA,gBACA,kBACA,gBV5FM,sBU8FN,sGAEA,mCAEE,oBAKF,2BACA,gBVxGM,0BU2GN,cACE,gBACA,gBACA,oBACA,cACA,WACA,6BACA,WjBnHI,yBiBqHJ,kBACA,4CAEA,QACE,2GAGF,mBAGE,wCAKN,cACE,6CAEA,SACE,kBACA,kBACA,qDAGF,SACE,WACA,kBACA,MACA,OACA,WACA,YACA,mCACA,mBACA,4BAIJ,SACE,kBACA,wBACA,gBACA,MACA,iCAEA,aACE,WACA,gBACA,gBACA,gBVpKI,mBUyKR,iBACE,qBACA,YACA,wBAEA,UACE,YACA,wBAIJ,cACE,kBACA,iBACA,cjB7JiB,mDiBgKjB,YACE,qDAGF,eACE,uDAGF,YACE,qBAIJ,YACE,YCrMF,qBACE,iBANc,cAQd,kBACA,sCAEA,WANF,UAOI,eACA,mBAIJ,iDACE,eACA,gBACA,gBACA,qBACA,clBlBmB,oBkBqBnB,alBNmB,0BkBQjB,6EAEA,oBAGE,wCAIJ,alBhCmB,oBkBqCnB,YACE,oBACA,+BAEA,eACE,yBAIJ,eACE,clB/CiB,qBkBmDnB,iBACE,clBpDiB,uBkBwDnB,eACE,mBACA,kBACA,kBACA,yHAGF,4CAME,mBACA,oBACA,gBACA,clBxEiB,qBkB4EnB,aACE,qBAGF,gBACE,qBAGF,eACE,qBAGF,gBACE,yCAGF,aAEE,qBAGF,eACE,qBAGF,kBACE,yCAMA,iBACA,iBACA,yDAEA,2BACE,yDAGF,2BACE,qBAIJ,UACE,SACA,SACA,gCACA,eACA,4BAEA,UACE,SACA,wBAIJ,UACE,yBACA,8BACA,CADA,iBACA,gBACA,mBACA,iEAEA,+BAEE,cACA,kBACA,gBACA,gBACA,clBnJe,iCkBuJjB,uBACE,gBACA,gBACA,clBvIY,qDkB2Id,WAEE,iBACA,kBACA,qBACA,mEAEA,SACE,kBACA,iFAEA,gBACE,kBACA,6EAGF,iBACE,SACA,UACA,mBACA,gBACA,uBACA,+BAMR,YACE,oBAIJ,kBACE,eACA,mCAEA,iBACE,oBACA,8BAGF,YACE,8BACA,eACA,6BAGF,UACE,kDACA,eACA,iBACA,WlBrNI,iBkBuNJ,kBACA,qEAEA,aAEE,6CAIA,alB7Ne,oCkBkOjB,4CACE,gBACA,eACA,iBACA,qCAGF,4BA3BF,iBA4BI,4BAIJ,iBACE,YACA,sBACA,mBACA,CACA,sBACA,0BACA,QACA,aACA,yCAEA,4CACE,eACA,iBACA,gBACA,clB7Pe,mBkB+Pf,mBACA,gCACA,uBACA,mBACA,gBACA,wFAEA,eAEE,cACA,2CAGF,oBACE,2BAKN,iBACE,mCAEA,UACE,YACA,CACA,kBACA,uCAEA,aACE,WACA,YACA,mBACA,iCAIJ,cACE,mCAEA,aACE,WlB1SA,qBkB4SA,uDAGE,yBACE,2CAKN,aACE,clBnTa,kCkB2TnB,iDAEE,CACA,eACA,eACA,iBACA,mBACA,clBlUiB,sCkBqUjB,alBtTiB,0BkBwTf,kBAIJ,cACE,SACA,UACA,gBACA,uBACA,oBACA,kBACA,oBACA,cACA,kBAGF,4CACE,eACA,iBACA,gBACA,mBACA,clB5ViB,wBkB+VjB,iDACE,cACA,eACA,gBACA,cACA,kBAIJ,4CACE,eACA,iBACA,gBACA,mBACA,clB7WiB,kBkBkXjB,clBlXiB,mCkBiXnB,4CACE,CACA,gBACA,gBACA,mBACA,clBtXiB,kBkB2XjB,clB3XiB,kBkBoYjB,clBpYiB,mCkBmYnB,4CACE,CACA,gBACA,gBACA,mBACA,clBxYiB,kBkB6YjB,clB7YiB,mCkBqZnB,gBAEE,mDAEA,2BACE,mDAGF,2BACE,kBAIJ,eACE,kBAGF,kBACE,yCAGF,cAEE,kBAGF,UACE,SACA,SACA,6CACA,cACA,yBAEA,UACE,SACA,iDAIJ,YAEE,+BAGF,kBlB/bwB,kBkBictB,kBACA,gBACA,sBACA,oCAEA,UACE,aACA,2BACA,iBACA,8BACA,mBACA,uDAGF,YACE,yBACA,qBACA,mFAEA,aACE,eACA,qCAGF,sDAVF,UAWI,8BACA,6CAIJ,MACE,sBACA,qCAEA,2CAJF,YAKI,sBAKN,iBACE,yBAEA,WACE,WACA,uBACA,4BAIJ,iBACE,mBACA,uCAEA,eACE,mCAGF,eACE,cACA,qCAGF,eACE,UACA,mDAEA,kBACE,aACA,iBACA,0FAKE,oBACE,gFAIJ,cACE,qDAIJ,aACE,cACA,6CAGF,UACE,YACA,0BACA,mDAGF,cACE,4DAEA,cACE,qCAKN,oCACE,eACE,sCAIJ,2BA7DF,iBA8DI,mFAIJ,qBAGE,mBlBxjBsB,kBkB0jBtB,kCACA,uBAGF,YACE,kBACA,WACA,YACA,2BAEA,YACE,WACA,uCAKF,YACE,eACA,mBACA,mBACA,qCAGF,sCACE,kBACE,uCAIJ,alB1lBiB,qCkB8lBjB,eACE,WlBlmBE,gBkBomBF,ClBjmBe,yFkBsmBb,alBtmBa,+CkB4mBjB,eACE,qBAIJ,kBACE,yBAEA,aACE,SACA,eACA,YACA,kBACA,qCAIJ,gDAEI,kBACE,yCAGF,eACE,gBACA,WACA,kBACA,uDAEA,iBACE,sCAMR,8BACE,aACE,uCAEA,gBACE,sDAGF,kBACE,6EAIJ,aAEE,qBAIJ,WACE,UAIJ,mBACE,qCAEA,SAHF,eAII,kBAGF,YACE,uBACA,mBACA,aACA,qBAEA,SlBxrBI,YkB0rBF,qCAGF,gBAXF,SAYI,mBACA,sBAIJ,eACE,uBACA,gBACA,gBACA,uBAGF,eACE,gBACA,0BAEA,YACE,gBACA,eACA,clB9sBe,6BkBktBjB,eACE,iBACA,+BAGF,kBlBrtBsB,akButBpB,0BACA,aACA,uCAEA,YACE,gCAIJ,cACE,gBACA,uDAEA,YACE,mBACA,iDAGF,UACE,YACA,0BACA,gCAIJ,YACE,uCAEA,4CACE,eACA,gBACA,cACA,qCAGF,cACE,clB7vBa,uFkBmwBnB,eACE,cASA,ClB7wBiB,2CkB0wBjB,iBACA,CACA,kBACA,gBAGF,eACE,cACA,aACA,kDACA,cACA,qCAEA,eAPF,oCAQI,cACA,8BAEA,UACE,aACA,sBACA,0CAEA,OACE,cACA,2CAGF,YACE,mBACA,QACA,cACA,qCAIJ,UACE,2BAGF,eACE,sCAIJ,eAtCF,UAuCI,6BAEA,aACE,gBACA,gBACA,2GAEA,eAGE,uFAIJ,+BAGE,2BAGF,YACE,gCAEA,eACE,qEAEA,eAEE,gBACA,2CAGF,eACE,SAQZ,iBACE,qBACA,iBAGF,aACE,kBACA,aACA,UACA,YACA,clB71BiB,qBkB+1BjB,eACA,qCAEA,gBAVF,eAWI,WACA,gBACA,clB/1Bc,SmBvBlB,UACE,eACA,iBACA,yBACA,qBAEA,WAEE,iBACA,mBACA,6BACA,gBACA,mBACA,oBAGF,qBACE,gCACA,aACA,gBACA,oBAGF,eACE,qEAGF,kBnBrBwB,UmB0BxB,anBbmB,0BmBejB,gBAEA,oBACE,eAIJ,eACE,CAII,4HADF,eACE,+FAOF,sBAEE,yFAKF,YAEE,gCAMJ,kBnB9DsB,6BmBgEpB,gCACA,4CAEA,qBACE,8BACA,2CAGF,uBACE,+BACA,0BAKN,qBACE,gBAIJ,aACE,mBACA,MAGF,+CACE,0BAGF,sBACE,SACA,aACA,8CAGF,oBAEE,qBACA,iBACA,eACA,cnB1GmB,gBmB4GnB,0DAEA,UnBjHM,wDmBqHN,eACE,iBACA,sEAGF,cACE,yCAKF,YAEE,yDAEA,qBACE,iBACA,eACA,gBACA,qEAEA,cACE,2EAGF,YACE,mBACA,uFAEA,YACE,qHAOJ,sBACA,cACA,uBAIJ,wBACE,mBnB5JsB,sBmB8JtB,YACA,mBACA,gCAEA,gBACE,mBACA,oBAIJ,YACE,yBACA,aACA,mBnB3KsB,gCmB8KtB,aACE,gBACA,mBAIJ,wBACE,aACA,mBACA,qCAEA,wCACE,4BACE,0BAIJ,kBACE,iCAGF,kBnBnMsB,uCmBsMpB,kBACE,4BAIJ,gBACE,oBACA,sCAEA,SACE,wCAGF,YACE,mBACA,mCAGF,aACE,aACA,uBACA,mBACA,kBACA,6CAEA,UACE,YACA,kCAIJ,aACE,mCAGF,aACE,iBACA,cnB7Oa,gBmB+Ob,mCAIJ,QACE,WACA,qCAEA,sBACE,gBACA,qCAOJ,4FAFF,YAGI,gCAIJ,aACE,uCAEA,iBACE,sCAGF,eACE,4BAIJ,wBACE,aACA,gBACA,qCAEA,2BALF,4BAMI,sCAIJ,+CACE,YACE,iBC7RN,YACE,uBACA,WACA,iBACA,iCAEA,gBACE,gBACA,oBACA,cACA,wCAEA,YACE,yBACA,mBpBZoB,YoBcpB,yBAIJ,WAvBc,UAyBZ,oBACA,iCAEA,YACE,mBACA,YACA,uCAEA,aACE,yCAEA,oBACE,aACA,2CAGF,SpBzCA,YoB2CE,kBACA,YACA,uCAIJ,aACE,cpB/Ca,qBoBiDb,cACA,eACA,aACA,0HAIA,kBAGE,+BAKN,aACE,iBACA,YACA,aACA,qCAGF,sCACE,YACE,6BAIJ,eACE,0BACA,gBACA,mBACA,qCAEA,2BANF,eAOI,+BAGF,aACE,aACA,cpBzFa,qBoB2Fb,0BACA,2CACA,0BACA,mBACA,gBACA,uBACA,mCAEA,gBACE,oCAGF,UpB1GA,yBoB4GE,0BACA,2CACA,uCAGF,kBACE,sBACA,+BAIJ,kBACE,wBACA,SACA,iCAEA,QACE,kBACA,6DAIJ,UpBlIE,yBAkBa,gBoBmHb,gBACA,mEAEA,wBACE,6DAKN,yBACE,iCAIJ,qBACE,WACA,gBApJY,cAsJZ,sCAGF,uCACE,YACE,iCAGF,WA/JY,cAiKV,sCAIJ,gCACE,UACE,0BAMF,2BACA,qCAEA,wBALF,cAMI,CACA,sBACA,kCAGF,YACE,oBAEA,gCACA,0BAEA,eAEA,mBACA,8BACA,mCAEA,eACE,kBACA,yCAGF,mBACE,4DAEA,eACE,qCAIJ,gCAzBF,eA0BI,iBACA,6BAIJ,apBlNiB,eoBoNf,iBACA,gBACA,qCAEA,2BANF,eAOI,6BAIJ,apB7NiB,eoB+Nf,iBACA,gBACA,mBACA,4BAGF,cACE,gBACA,cpBvOe,mBoByOf,kBACA,gCACA,4BAGF,cACE,cpB/Oe,iBoBiPf,gBACA,0CAGF,UpBxPI,gBoB0PF,uFAGF,eAEE,gEAGF,aACE,4CAGF,cACE,gBACA,WpBxQE,oBoB0QF,iBACA,gBACA,gBACA,2BAGF,cACE,iBACA,cpB/Qe,mBoBiRf,kCAEA,UpBtRE,gBoBwRA,CAII,2NADF,eACE,4BAMR,UACE,SACA,SACA,6CACA,cACA,mCAEA,UACE,SACA,qCAKN,eA7SF,aA8SI,iCAEA,YACE,yBAGF,UACE,UACA,YACA,iCAEA,YACE,4BAGF,YACE,8DAGF,eAEE,gCACA,gBACA,0EAEA,eACE,+BAIJ,eACE,6DAGF,2BpBjUe,YoBwUrB,UACE,SACA,cACA,WACA,sDAKA,apBhWmB,0DoBmWjB,apBpViB,4DoByVnB,apBlWc,gBoBoWZ,4DAGF,ab7WU,gBa+WR,0DAGF,apB/VgB,gBoBiWd,0DAGF,abrXU,gBauXR,UAIJ,YACE,eACA,yBAEA,aACE,qBACA,oCAEA,kBACE,4BAGF,cACE,gBACA,+BAEA,oBACE,iBACA,gCAIJ,eACE,eACA,CAII,iNADF,eACE,2BAKN,oBACE,cpB/Ze,qBoBiaf,eACA,gBACA,gCACA,iCAEA,UpBzaE,gCoB2aA,oCAGF,apB5Ze,gCoB8Zb,CAkBJ,gBAIJ,aACE,iBACA,eACA,sBAGF,aACE,eACA,cACA,wBAEA,aACE,kBAIJ,YACE,eACA,mBACA,wBAGF,YACE,WACA,sBACA,aACA,+BAEA,aACE,qBACA,gBACA,eACA,iBACA,cpBpeiB,CoByeb,4MADF,eACE,sCAKN,aACE,gCAIJ,YAEE,mBACA,kEAEA,UACE,kBACA,4BACA,gFAEA,iBACE,kDAKN,aAEE,aACA,sBACA,4EAEA,cACE,WACA,kBACA,mBACA,uEAIJ,cAEE,iBAGF,YACE,eACA,kBACA,2CAEA,kBACE,eACA,8BAGF,kBACE,+CAGF,gBACE,uDAEA,gBACE,mBACA,YACA,YAKN,kBACE,eACA,cAEA,apBpiBmB,qBoBsiBjB,oBAEA,yBACE,SAKN,aACE,YAGF,kBACE,iBACA,oBAEA,YACE,2BACA,mBACA,aACA,mBpBvkBsB,cAFL,0BoB4kBjB,eACA,kBACA,oBAGF,iBACE,4BAEA,aACE,SACA,kBACA,WACA,YACA,qBAIJ,2BACE,mBAGF,oBACE,uBAGF,apBllBgB,oBoBslBhB,kBACE,0BACA,aACA,cpB5mBiB,gDoB8mBjB,eACA,qBACA,gBACA,kBAGF,cACE,kBACA,cpBnmBc,2BoBumBhB,iBACE,SACA,WACA,WACA,YACA,kBACA,oCAEA,kBpB5nBY,oCoBgoBZ,kBACE,mCAGF,kBpB3nBiB,sDoBgoBnB,apB/oBmB,qBoBmpBjB,gBACA,sBAGF,aACE,0BAGF,apB3pBmB,sBoB+pBnB,apBzpBc,yDoB8pBhB,oBAIE,cpBxqBmB,iGoB2qBnB,eACE,yIAIA,4BACE,cACA,iIAGF,8BACE,CADF,sBACE,WACA,sBAKN,YAEE,mBACA,sCAEA,aACE,CACA,gBACA,kBACA,0DAIA,8BACE,CADF,sBACE,WACA,gBAKN,kBACE,8BACA,yBAEA,yBpB9sBc,yBoBktBd,yBACE,wBAGF,yBb1tBU,wBa+tBR,2BACA,eACA,iBACA,4BACA,kBACA,gBACA,0BAEA,apBzuBiB,uBoB+uBjB,wBACA,qBAGF,apBhuBgB,coBquBlB,kBpBtvB0B,kBoBwvBxB,mBACA,uBAEA,YACE,8BACA,mBACA,aACA,gCAEA,SACE,SACA,gDAEA,aACE,8BAIJ,aACE,gBACA,cpB9wBe,iBoBgxBf,gCAEA,aACE,qBACA,iHAEA,aAGE,mCAIJ,ab7xBM,6BaoyBR,YACE,2BACA,6BACA,mCAEA,kBACE,gFAGF,YAEE,cACA,sBACA,YACA,cpBlzBa,mLoBqzBb,kBAEE,gBACA,uBACA,sCAIJ,aACE,6BACA,4CAEA,apB9yBU,iBoBgzBR,gBACA,wCAIJ,aACE,sBACA,WACA,aACA,qBACA,cpB70Ba,WoBo1BrB,kBAGE,0BAFA,eACA,uBASA,CARA,eAGF,oBACE,gBACA,CAEA,qBACA,oBAGF,YACE,eACA,CACA,kBACA,wBAEA,qBACE,cACA,mBACA,aACA,0FAGF,kBAEE,kBACA,YACA,6CAGF,QACE,SACA,+CAEA,aACE,sEAGF,uBACE,yDAGF,apB53BY,8CoBi4Bd,qBACE,aACA,WpB54BI,coBi5BR,iBACE,sBCn5BF,YACE,eACA,CACA,kBACA,0BAEA,qBACE,iBACA,cACA,mBACA,yDAEA,YAEE,mBACA,kBACA,sBACA,YACA,4BAGF,oBACE,cACA,cACA,qGAEA,kBAGE,sDAKN,iBAEE,gBACA,eACA,iBACA,WrBtCI,6CqBwCJ,mBACA,iBACA,4BAGF,cACE,6BAGF,cACE,crB/CiB,kBqBiDjB,gBACA,qBAIJ,YACE,eACA,cACA,yBAEA,gBACE,mBACA,6BAEA,aACE,sCAIJ,arBpEmB,gBqBsEjB,qBACA,UC3EJ,aACE,gCAEA,gBACE,eACA,mBACA,+BAGF,cACE,iBACA,8CAGF,aACE,kBACA,wBAGF,gBACE,iCAGF,aACE,kBACA,uCAGF,oBACE,gDAGF,SACE,YACA,8BAGF,cACE,iBACA,mEAGF,aACE,kBACA,2DAGF,cAEE,gBACA,mFAGF,cACE,gBACA,mCAGF,aACE,iBACA,yBAGF,kBACE,kBACA,4BAGF,UACE,UACA,wBAGF,aACE,kCAGF,MACE,WACA,cACA,mBACA,2CAGF,aACE,iBACA,0CAGF,gBACE,eACA,mCAGF,WACE,sCAGF,gBACE,gBACA,yCAGF,UACE,iCAGF,aACE,iBACA,0BAGF,SACE,WACA,0DAGF,iBAEE,mBACA,4GAGF,iBAEE,gBACA,uCAGF,kBACE,eACA,2BAGF,aACE,kBACA,wCAGF,SACE,YACA,yDAGF,SACE,WACA,CAKA,oFAGF,UACE,OACA,uGAGF,UAEE,uCAIA,cACE,iBACA,kEAEA,cACE,gBACA,qCAKN,WACE,eACA,iBACA,uCAGF,WACE,sCAGF,aACE,kBACA,0CAGF,gBACE,eACA,uDAGF,gBACE,2CAGF,cACE,iBACA,YACA,yEAGF,aAEE,iBACA,iBAGF,wBACE,iBAGF,SACE,oBACA,yBAGF,aACE,8EAGF,cAEE,gBACA,oDAGF,cACE,mBACA,gEAGF,iBACE,gBACA,CAMA,8KAGF,SACE,QACA,yDAGF,kBACE,eACA,uDAGF,kBACE,gBACA,qDAGF,SACE,QACA,8FAGF,cAEE,mBACA,4CAGF,UACE,SACA,kDAEA,UACE,OACA,qEACA,8BAIJ,sXACE,uCAGF,gBAEE,kCAGF,cACE,iBACA,gDAGF,UACE,UACA,gEAGF,aACE,uDAGF,WACE,WACA,uDAGF,UACE,WACA,uDAGF,UACE,WACA,kDAGF,MACE,0CAGF,iBACE,yBACA,qDAGF,cACE,iBACA,qCAGF,kCACE,gBAEE,kBACA,2DAEA,gBACE,mBACA,uEAKF,gBAEE,kBACA,gFAKN,cAEE,gBACA,6CAKE,eACE,eACA,sDAIJ,aACE,kBACA,4DAKF,cACE,gBACA,8DAGF,gBACE,eACA,mCAIJ,aACE,kBACA,iBACA,kCAGF,WACE,mCAGF,WACE,oCAGF,cACE,gBACA,gFAGF,cACE,mBACA,+DAGF,SACE,QACA,kkEC7ZJ,kIACE,CADF,sIACE,qBACA,MCDF,6CACE,CjBFM,qCiBSN,UjBTM,sDiBcR,wBAEE,sMAEA,UjBlBM,gGiB0BR,ejB1BQ,yBiBgCN,aACA,uBAGF,kBACE,oCAGF,ejBxCQ,gCiB2CN,8BAGF,sBACE,iBACA,kBACA,qCAGF,wBAEE,oCAGF,ejBzDQ,yBiB4DN,qCAEA,mCALF,YAMI,+DAGF,SACE,QACA,gIAIJ,ejBxEQ,+BiBgFR,axB/DqB,8GwBkEnB,axBlEmB,gBOjBb,gDiB2FR,iBjB3FQ,4BiB+FR,axB7FqB,0BwB+FnB,iIAGF,aAIE,6cAEA,UxB3GM,oBwBkHR,kBACE,gCACA,wDAKA,ejBxHM,gCiB0HJ,4MAEA,kBxBxHsB,kCwBgI1B,4BACE,gCACA,qCAEA,iCAJF,YAKI,qUAIJ,wBAYE,qCAIA,eADF,YAEI,gBACA,sCAIJ,YACE,gBACA,oCAGF,oXACE,uEAGF,wBAEE,2BAGF,wBACE,aACA,8CAGF,kBxBlL0B,yBwBoLxB,aACA,gCAGF,ejB5LQ,yBiB+LN,0BAGF,o1BACE,oFAME,aACE,6QAEA,UjB5ME,gFiBmNJ,aACE,2GAEA,aACE,CAHF,iGAEA,aACE,CAHF,qGAEA,aACE,CAHF,sGAEA,aACE,CAHF,4FAEA,aACE,CAMJ,8FAGF,kBACE,yPAIA,kBAIE,iBAKN,oBACE,6BAEA,kBACE,0BAIJ,+BACE,qBxBnPwB,kBwBwP1B,kBxBxP0B,uBwB4P1B,kBACE,wCAGF,kBACE,+CAGF,ejBxQQ,0GiB8QR,kBxB1Q0B,sHwB8QxB,kBACE,uCAKJ,kBxBpR0B,uEwByR1B,UjB7RQ,0BiBiSR,wBxB7R0B,gBwBkS1B,ejBtSQ,4BiB0SJ,sBjB1SI,2BiB8SJ,qBjB9SI,8BiBkTJ,wBjBlTI,6BiBsTJ,uBjBtTI,wBiB4TJ,ejB5TI,cPEa,85BwBkUrB,UjBpUQ,2BiB4VR,2BACE,uNAIF,ejBjWQ,yBiB6WN,wBAGF,0BACE,0BAGF,wBACE,mCAGF,kBACE,yBACA,aACA,8BAGF,UjB9XQ,6JiBkYR,kBAME,+2DAIE,qBAGE,qBAKN,ejBpZQ,yDiBwZR,ejBxZQ,yBiB0ZN,+DAEA,oBACE,gBjB7ZI,qBiBkaR,kBxBhaqB,sEwBoarB,kBACE,4FAGF,kBACE,uCAIF,UxBhbQ,gBOCA,WiBqbR,ejBrbQ,yBiBubN,gBACA,qCAEA,UALF,YAMI,kBAGF,mBACE,wBACA,4BACA,oEAEA,kBxB/bsB,yFwBscpB,sBAGE,4BxB5ba,uBwBocrB,exBrdQ,4BwBudN,kMAGF,ejB1dQ,yBiBoeN,qCAEA,iMAZF,aAaI,eACA,aACA,8BAIJ,YACE,gBACA,oLASE,oBACE,+BAKN,ejB9fQ,yBiBggBN,aACA,qCAEA,8BALF,QAMI,kBAIJ,axBtgBqB,0EwB2gBnB,kBxBzgBwB,qCwB+gBxB,kBAPF,QAQI,sDAIJ,oBxBvgBqB,mVwB2gBnB,UjB5hBM,mMiBoiBN,kBxBnhBmB,oEwB2hBnB,oBAGE,kBAIJ,wBACE,8BAEA,YACE,yBAGF,exB1jBM,0HwB6jBJ,2BAGE,CxBjkBE,oGwB2kBF,UxB3kBE,0DwBqlBF,axBllBe,2CwBwlBf,UxB3lBE,6CwBgmBJ,axB7lBiB,6DwBimBjB,UxBpmBI,4CwB4mBN,eACE,8BACA,iBACA,oDxB7lBiB,awBmmBjB,yFAHF,oBxBhmBmB,qCwBymBnB,CxBzmBmB,2HwBmnBnB,axBnnBmB,qBwBwnBrB,UjBzoBQ,yBiB4oBN,SjB5oBM,2CiBkpBN,wBACE,qCAEA,0CAHF,YAII,kGAIJ,eAGE,sEAGF,exBhqBM,yBwBmqBJ,wBAGF,kBxBlqBwB,yBwBoqBtB,qCAEA,uBAJF,QAKI,+GAIA,kBAGE,8CAMJ,kBACE,oDAEA,eACE,mDAKF,exBjsBE,yBwBmsBA,aACA,wDAGF,iBxBvsBE,qCwB2sBF,2CAXF,exBhsBI,yBwB6sBA,aACA,kHAMA,UjBptBA,qCiBwtBE,gHAJF,UxBrtBA,mEwBiuBF,QACE,2FAGF,oBACE,yFAMR,yCAEE,0PAGF,eAaE,sKAGF,UxBjwBQ,0D","file":"skins/vanilla/mastodon-light/common.css","sourcesContent":["html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:\"\";content:none}table{border-collapse:collapse;border-spacing:0}html{scrollbar-color:#ccd7e0 rgba(255,255,255,.1)}::-webkit-scrollbar{width:12px;height:12px}::-webkit-scrollbar-thumb{background:#ccd7e0;border:0px none #fff;border-radius:50px}::-webkit-scrollbar-thumb:hover{background:#c6d2dc}::-webkit-scrollbar-thumb:active{background:#ccd7e0}::-webkit-scrollbar-track{border:0px none #fff;border-radius:0;background:rgba(255,255,255,.1)}::-webkit-scrollbar-track:hover{background:#d9e1e8}::-webkit-scrollbar-track:active{background:#d9e1e8}::-webkit-scrollbar-corner{background:transparent}body{font-family:\"mastodon-font-sans-serif\",sans-serif;background:#eff3f5;font-size:13px;line-height:18px;font-weight:400;color:#000;text-rendering:optimizelegibility;font-feature-settings:\"kern\";text-size-adjust:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-tap-highlight-color:transparent}body.system-font{font-family:system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"Oxygen\",\"Ubuntu\",\"Cantarell\",\"Fira Sans\",\"Droid Sans\",\"Helvetica Neue\",\"mastodon-font-sans-serif\",sans-serif}body.app-body{padding:0}body.app-body.layout-single-column{height:auto;min-height:100vh;overflow-y:scroll}body.app-body.layout-multiple-columns{position:absolute;width:100%;height:100%}body.app-body.with-modals--active{overflow-y:hidden}body.lighter{background:#d9e1e8}body.with-modals{overflow-x:hidden;overflow-y:scroll}body.with-modals--active{overflow-y:hidden}body.player{text-align:center}body.embed{background:#ccd7e0;margin:0;padding-bottom:0}body.embed .container{position:absolute;width:100%;height:100%;overflow:hidden}body.admin{background:#e6ebf0;padding:0}body.error{position:absolute;text-align:center;color:#282c37;background:#d9e1e8;width:100%;height:100%;padding:0;display:flex;justify-content:center;align-items:center}body.error .dialog{vertical-align:middle;margin:20px}body.error .dialog__illustration img{display:block;max-width:470px;width:100%;height:auto;margin-top:-120px}body.error .dialog h1{font-size:20px;line-height:28px;font-weight:400}button{font-family:inherit;cursor:pointer}button:focus{outline:none}.app-holder,.app-holder>div,.app-holder>noscript{display:flex;width:100%;align-items:center;justify-content:center;outline:0 !important}.app-holder>noscript{height:100vh}.layout-single-column .app-holder,.layout-single-column .app-holder>div{min-height:100vh}.layout-multiple-columns .app-holder,.layout-multiple-columns .app-holder>div{height:100%}.error-boundary,.app-holder noscript{flex-direction:column;font-size:16px;font-weight:400;line-height:1.7;color:#dc2f4b;text-align:center}.error-boundary>div,.app-holder noscript>div{max-width:500px}.error-boundary p,.app-holder noscript p{margin-bottom:.85em}.error-boundary p:last-child,.app-holder noscript p:last-child{margin-bottom:0}.error-boundary a,.app-holder noscript a{color:#2b90d9}.error-boundary a:hover,.error-boundary a:focus,.error-boundary a:active,.app-holder noscript a:hover,.app-holder noscript a:focus,.app-holder noscript a:active{text-decoration:none}.error-boundary__footer,.app-holder noscript__footer{color:#444b5d;font-size:13px}.error-boundary__footer a,.app-holder noscript__footer a{color:#444b5d}.error-boundary button,.app-holder noscript button{display:inline;border:0;background:transparent;color:#444b5d;font:inherit;padding:0;margin:0;line-height:inherit;cursor:pointer;outline:0;transition:color 300ms linear;text-decoration:underline}.error-boundary button:hover,.error-boundary button:focus,.error-boundary button:active,.app-holder noscript button:hover,.app-holder noscript button:focus,.app-holder noscript button:active{text-decoration:none}.error-boundary button.copied,.app-holder noscript button.copied{color:#4a905f;transition:none}.container-alt{width:700px;margin:0 auto;margin-top:40px}@media screen and (max-width: 740px){.container-alt{width:100%;margin:0}}.logo-container{margin:100px auto 50px}@media screen and (max-width: 500px){.logo-container{margin:40px auto 0}}.logo-container h1{display:flex;justify-content:center;align-items:center}.logo-container h1 svg{fill:#000;height:42px;margin-right:10px}.logo-container h1 a{display:flex;justify-content:center;align-items:center;color:#000;text-decoration:none;outline:0;padding:12px 16px;line-height:32px;font-family:\"mastodon-font-display\",sans-serif;font-weight:500;font-size:14px}.compose-standalone .compose-form{width:400px;margin:0 auto;padding:20px 0;margin-top:40px;box-sizing:border-box}@media screen and (max-width: 400px){.compose-standalone .compose-form{width:100%;margin-top:0;padding:20px}}.account-header{width:400px;margin:0 auto;display:flex;font-size:13px;line-height:18px;box-sizing:border-box;padding:20px 0;padding-bottom:0;margin-bottom:-30px;margin-top:40px}@media screen and (max-width: 440px){.account-header{width:100%;margin:0;margin-bottom:10px;padding:20px;padding-bottom:0}}.account-header .avatar{width:40px;height:40px;margin-right:8px}.account-header .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px}.account-header .name{flex:1 1 auto;color:#282c37;width:calc(100% - 88px)}.account-header .name .username{display:block;font-weight:500;text-overflow:ellipsis;overflow:hidden}.account-header .logout-link{display:block;font-size:32px;line-height:40px;margin-left:8px}.grid-3{display:grid;grid-gap:10px;grid-template-columns:3fr 1fr;grid-auto-columns:25%;grid-auto-rows:max-content}.grid-3 .column-0{grid-column:1/3;grid-row:1}.grid-3 .column-1{grid-column:1;grid-row:2}.grid-3 .column-2{grid-column:2;grid-row:2}.grid-3 .column-3{grid-column:1/3;grid-row:3}@media screen and (max-width: 415px){.grid-3{grid-gap:0;grid-template-columns:minmax(0, 100%)}.grid-3 .column-0{grid-column:1}.grid-3 .column-1{grid-column:1;grid-row:3}.grid-3 .column-2{grid-column:1;grid-row:2}.grid-3 .column-3{grid-column:1;grid-row:4}}.grid-4{display:grid;grid-gap:10px;grid-template-columns:repeat(4, minmax(0, 1fr));grid-auto-columns:25%;grid-auto-rows:max-content}.grid-4 .column-0{grid-column:1/5;grid-row:1}.grid-4 .column-1{grid-column:1/4;grid-row:2}.grid-4 .column-2{grid-column:4;grid-row:2}.grid-4 .column-3{grid-column:2/5;grid-row:3}.grid-4 .column-4{grid-column:1;grid-row:3}.grid-4 .landing-page__call-to-action{min-height:100%}.grid-4 .flash-message{margin-bottom:10px}@media screen and (max-width: 738px){.grid-4{grid-template-columns:minmax(0, 50%) minmax(0, 50%)}.grid-4 .landing-page__call-to-action{padding:20px;display:flex;align-items:center;justify-content:center}.grid-4 .row__information-board{width:100%;justify-content:center;align-items:center}.grid-4 .row__mascot{display:none}}@media screen and (max-width: 415px){.grid-4{grid-gap:0;grid-template-columns:minmax(0, 100%)}.grid-4 .column-0{grid-column:1}.grid-4 .column-1{grid-column:1;grid-row:3}.grid-4 .column-2{grid-column:1;grid-row:2}.grid-4 .column-3{grid-column:1;grid-row:5}.grid-4 .column-4{grid-column:1;grid-row:4}}@media screen and (max-width: 415px){.public-layout{padding-top:48px}}.public-layout .container{max-width:960px}@media screen and (max-width: 415px){.public-layout .container{padding:0}}.public-layout .header{background:#c0cdd9;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;height:48px;margin:10px 0;display:flex;align-items:stretch;justify-content:center;flex-wrap:nowrap;overflow:hidden}@media screen and (max-width: 415px){.public-layout .header{position:fixed;width:100%;top:0;left:0;margin:0;border-radius:0;box-shadow:none;z-index:110}}.public-layout .header>div{flex:1 1 33.3%;min-height:1px}.public-layout .header .nav-left{display:flex;align-items:stretch;justify-content:flex-start;flex-wrap:nowrap}.public-layout .header .nav-center{display:flex;align-items:stretch;justify-content:center;flex-wrap:nowrap}.public-layout .header .nav-right{display:flex;align-items:stretch;justify-content:flex-end;flex-wrap:nowrap}.public-layout .header .brand{display:block;padding:15px}.public-layout .header .brand svg{display:block;height:18px;width:auto;position:relative;bottom:-2px;fill:#000}@media screen and (max-width: 415px){.public-layout .header .brand svg{height:20px}}.public-layout .header .brand:hover,.public-layout .header .brand:focus,.public-layout .header .brand:active{background:#b3c3d1}.public-layout .header .nav-link{display:flex;align-items:center;padding:0 1rem;font-size:12px;font-weight:500;text-decoration:none;color:#282c37;white-space:nowrap;text-align:center}.public-layout .header .nav-link:hover,.public-layout .header .nav-link:focus,.public-layout .header .nav-link:active{text-decoration:underline;color:#000}@media screen and (max-width: 550px){.public-layout .header .nav-link.optional{display:none}}.public-layout .header .nav-button{background:#a6b9c9;margin:8px;margin-left:0;border-radius:4px}.public-layout .header .nav-button:hover,.public-layout .header .nav-button:focus,.public-layout .header .nav-button:active{text-decoration:none;background:#99afc2}.public-layout .grid{display:grid;grid-gap:10px;grid-template-columns:minmax(300px, 3fr) minmax(298px, 1fr);grid-auto-columns:25%;grid-auto-rows:max-content}.public-layout .grid .column-0{grid-row:1;grid-column:1}.public-layout .grid .column-1{grid-row:1;grid-column:2}@media screen and (max-width: 600px){.public-layout .grid{grid-template-columns:100%;grid-gap:0}.public-layout .grid .column-1{display:none}}.public-layout .directory__card{border-radius:4px}@media screen and (max-width: 415px){.public-layout .directory__card{border-radius:0}}@media screen and (max-width: 415px){.public-layout .page-header{border-bottom:0}}.public-layout .public-account-header{overflow:hidden;margin-bottom:10px;box-shadow:0 0 15px rgba(0,0,0,.2)}.public-layout .public-account-header.inactive{opacity:.5}.public-layout .public-account-header.inactive .public-account-header__image,.public-layout .public-account-header.inactive .avatar{filter:grayscale(100%)}.public-layout .public-account-header.inactive .logo-button{background-color:#282c37}.public-layout .public-account-header__image{border-radius:4px 4px 0 0;overflow:hidden;height:300px;position:relative;background:#fff}.public-layout .public-account-header__image::after{content:\"\";display:block;position:absolute;width:100%;height:100%;box-shadow:inset 0 -1px 1px 1px rgba(0,0,0,.15);top:0;left:0}.public-layout .public-account-header__image img{object-fit:cover;display:block;width:100%;height:100%;margin:0;border-radius:4px 4px 0 0}@media screen and (max-width: 600px){.public-layout .public-account-header__image{height:200px}}.public-layout .public-account-header--no-bar{margin-bottom:0}.public-layout .public-account-header--no-bar .public-account-header__image,.public-layout .public-account-header--no-bar .public-account-header__image img{border-radius:4px}@media screen and (max-width: 415px){.public-layout .public-account-header--no-bar .public-account-header__image,.public-layout .public-account-header--no-bar .public-account-header__image img{border-radius:0}}@media screen and (max-width: 415px){.public-layout .public-account-header{margin-bottom:0;box-shadow:none}.public-layout .public-account-header__image::after{display:none}.public-layout .public-account-header__image,.public-layout .public-account-header__image img{border-radius:0}}.public-layout .public-account-header__bar{position:relative;margin-top:-80px;display:flex;justify-content:flex-start}.public-layout .public-account-header__bar::before{content:\"\";display:block;background:#ccd7e0;position:absolute;bottom:0;left:0;right:0;height:60px;border-radius:0 0 4px 4px;z-index:-1}.public-layout .public-account-header__bar .avatar{display:block;width:120px;height:120px;padding-left:16px;flex:0 0 auto}.public-layout .public-account-header__bar .avatar img{display:block;width:100%;height:100%;margin:0;border-radius:50%;border:4px solid #ccd7e0;background:#f2f5f7}@media screen and (max-width: 600px){.public-layout .public-account-header__bar{margin-top:0;background:#ccd7e0;border-radius:0 0 4px 4px;padding:5px}.public-layout .public-account-header__bar::before{display:none}.public-layout .public-account-header__bar .avatar{width:48px;height:48px;padding:7px 0;padding-left:10px}.public-layout .public-account-header__bar .avatar img{border:0;border-radius:4px}}@media screen and (max-width: 600px)and (max-width: 360px){.public-layout .public-account-header__bar .avatar{display:none}}@media screen and (max-width: 415px){.public-layout .public-account-header__bar{border-radius:0}}@media screen and (max-width: 600px){.public-layout .public-account-header__bar{flex-wrap:wrap}}.public-layout .public-account-header__tabs{flex:1 1 auto;margin-left:20px}.public-layout .public-account-header__tabs__name{padding-top:20px;padding-bottom:8px}.public-layout .public-account-header__tabs__name h1{font-size:20px;line-height:27px;color:#000;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-shadow:1px 1px 1px #000}.public-layout .public-account-header__tabs__name h1 small{display:block;font-size:14px;color:#000;font-weight:400;overflow:hidden;text-overflow:ellipsis}@media screen and (max-width: 600px){.public-layout .public-account-header__tabs{margin-left:15px;display:flex;justify-content:space-between;align-items:center}.public-layout .public-account-header__tabs__name{padding-top:0;padding-bottom:0}.public-layout .public-account-header__tabs__name h1{font-size:16px;line-height:24px;text-shadow:none}.public-layout .public-account-header__tabs__name h1 small{color:#282c37}}.public-layout .public-account-header__tabs__tabs{display:flex;justify-content:flex-start;align-items:stretch;height:58px}.public-layout .public-account-header__tabs__tabs .details-counters{display:flex;flex-direction:row;min-width:300px}@media screen and (max-width: 600px){.public-layout .public-account-header__tabs__tabs .details-counters{display:none}}.public-layout .public-account-header__tabs__tabs .counter{min-width:33.3%;box-sizing:border-box;flex:0 0 auto;color:#282c37;padding:10px;border-right:1px solid #ccd7e0;cursor:default;text-align:center;position:relative}.public-layout .public-account-header__tabs__tabs .counter a{display:block}.public-layout .public-account-header__tabs__tabs .counter:last-child{border-right:0}.public-layout .public-account-header__tabs__tabs .counter::after{display:block;content:\"\";position:absolute;bottom:0;left:0;width:100%;border-bottom:4px solid #9bcbed;opacity:.5;transition:all 400ms ease}.public-layout .public-account-header__tabs__tabs .counter.active::after{border-bottom:4px solid #2b90d9;opacity:1}.public-layout .public-account-header__tabs__tabs .counter.active.inactive::after{border-bottom-color:#282c37}.public-layout .public-account-header__tabs__tabs .counter:hover::after{opacity:1;transition-duration:100ms}.public-layout .public-account-header__tabs__tabs .counter a{text-decoration:none;color:inherit}.public-layout .public-account-header__tabs__tabs .counter .counter-label{font-size:12px;display:block}.public-layout .public-account-header__tabs__tabs .counter .counter-number{font-weight:500;font-size:18px;margin-bottom:5px;color:#000;font-family:\"mastodon-font-display\",sans-serif}.public-layout .public-account-header__tabs__tabs .spacer{flex:1 1 auto;height:1px}.public-layout .public-account-header__tabs__tabs__buttons{padding:7px 8px}.public-layout .public-account-header__extra{display:none;margin-top:4px}.public-layout .public-account-header__extra .public-account-bio{border-radius:0;box-shadow:none;background:transparent;margin:0 -5px}.public-layout .public-account-header__extra .public-account-bio .account__header__fields{border-top:1px solid #b3c3d1}.public-layout .public-account-header__extra .public-account-bio .roles{display:none}.public-layout .public-account-header__extra__links{margin-top:-15px;font-size:14px;color:#282c37}.public-layout .public-account-header__extra__links a{display:inline-block;color:#282c37;text-decoration:none;padding:15px;font-weight:500}.public-layout .public-account-header__extra__links a strong{font-weight:700;color:#000}@media screen and (max-width: 600px){.public-layout .public-account-header__extra{display:block;flex:100%}}.public-layout .account__section-headline{border-radius:4px 4px 0 0}@media screen and (max-width: 415px){.public-layout .account__section-headline{border-radius:0}}.public-layout .detailed-status__meta{margin-top:25px}.public-layout .public-account-bio{background:#c0cdd9;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;overflow:hidden;margin-bottom:10px}@media screen and (max-width: 415px){.public-layout .public-account-bio{box-shadow:none;margin-bottom:0;border-radius:0}}.public-layout .public-account-bio .account__header__fields{margin:0;border-top:0}.public-layout .public-account-bio .account__header__fields a{color:#217aba}.public-layout .public-account-bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.public-layout .public-account-bio .account__header__fields .verified a{color:#4a905f}.public-layout .public-account-bio .account__header__content{padding:20px;padding-bottom:0;color:#000}.public-layout .public-account-bio__extra,.public-layout .public-account-bio .roles{padding:20px;font-size:14px;color:#282c37}.public-layout .public-account-bio .roles{padding-bottom:0}.public-layout .directory__list{display:grid;grid-gap:10px;grid-template-columns:minmax(0, 50%) minmax(0, 50%)}@media screen and (max-width: 415px){.public-layout .directory__list{display:block}}.public-layout .directory__list .icon-button{font-size:18px}.public-layout .directory__card{margin-bottom:0}.public-layout .card-grid{display:flex;flex-wrap:wrap;min-width:100%;margin:0 -5px}.public-layout .card-grid>div{box-sizing:border-box;flex:1 0 auto;width:300px;padding:0 5px;margin-bottom:10px;max-width:33.333%}@media screen and (max-width: 900px){.public-layout .card-grid>div{max-width:50%}}@media screen and (max-width: 600px){.public-layout .card-grid>div{max-width:100%}}@media screen and (max-width: 415px){.public-layout .card-grid{margin:0;border-top:1px solid #c0cdd9}.public-layout .card-grid>div{width:100%;padding:0;margin-bottom:0;border-bottom:1px solid #c0cdd9}.public-layout .card-grid>div:last-child{border-bottom:0}.public-layout .card-grid>div .card__bar{background:#d9e1e8}.public-layout .card-grid>div .card__bar:hover,.public-layout .card-grid>div .card__bar:active,.public-layout .card-grid>div .card__bar:focus{background:#ccd7e0}}.no-list{list-style:none}.no-list li{display:inline-block;margin:0 5px}.recovery-codes{list-style:none;margin:0 auto}.recovery-codes li{font-size:125%;line-height:1.5;letter-spacing:1px}.public-layout .footer{text-align:left;padding-top:20px;padding-bottom:60px;font-size:12px;color:#6d8ca7}@media screen and (max-width: 415px){.public-layout .footer{padding-left:20px;padding-right:20px}}.public-layout .footer .grid{display:grid;grid-gap:10px;grid-template-columns:1fr 1fr 2fr 1fr 1fr}.public-layout .footer .grid .column-0{grid-column:1;grid-row:1;min-width:0}.public-layout .footer .grid .column-1{grid-column:2;grid-row:1;min-width:0}.public-layout .footer .grid .column-2{grid-column:3;grid-row:1;min-width:0;text-align:center}.public-layout .footer .grid .column-2 h4 a{color:#6d8ca7}.public-layout .footer .grid .column-3{grid-column:4;grid-row:1;min-width:0}.public-layout .footer .grid .column-4{grid-column:5;grid-row:1;min-width:0}@media screen and (max-width: 690px){.public-layout .footer .grid{grid-template-columns:1fr 2fr 1fr}.public-layout .footer .grid .column-0,.public-layout .footer .grid .column-1{grid-column:1}.public-layout .footer .grid .column-1{grid-row:2}.public-layout .footer .grid .column-2{grid-column:2}.public-layout .footer .grid .column-3,.public-layout .footer .grid .column-4{grid-column:3}.public-layout .footer .grid .column-4{grid-row:2}}@media screen and (max-width: 600px){.public-layout .footer .grid .column-1{display:block}}@media screen and (max-width: 415px){.public-layout .footer .grid .column-0,.public-layout .footer .grid .column-1,.public-layout .footer .grid .column-3,.public-layout .footer .grid .column-4{display:none}}.public-layout .footer h4{font-weight:700;margin-bottom:8px;color:#282c37}.public-layout .footer h4 a{color:inherit;text-decoration:none}.public-layout .footer ul a{text-decoration:none;color:#6d8ca7}.public-layout .footer ul a:hover,.public-layout .footer ul a:active,.public-layout .footer ul a:focus{text-decoration:underline}.public-layout .footer .brand svg{display:block;height:36px;width:auto;margin:0 auto;fill:#6d8ca7}.public-layout .footer .brand:hover svg,.public-layout .footer .brand:focus svg,.public-layout .footer .brand:active svg{fill:#60829f}.compact-header h1{font-size:24px;line-height:28px;color:#282c37;font-weight:500;margin-bottom:20px;padding:0 10px;word-wrap:break-word}@media screen and (max-width: 740px){.compact-header h1{text-align:center;padding:20px 10px 0}}.compact-header h1 a{color:inherit;text-decoration:none}.compact-header h1 small{font-weight:400;color:#282c37}.compact-header h1 img{display:inline-block;margin-bottom:-5px;margin-right:15px;width:36px;height:36px}.hero-widget{margin-bottom:10px;box-shadow:0 0 15px rgba(0,0,0,.2)}.hero-widget__img{width:100%;position:relative;overflow:hidden;border-radius:4px 4px 0 0;background:#000}.hero-widget__img img{object-fit:cover;display:block;width:100%;height:100%;margin:0;border-radius:4px 4px 0 0}.hero-widget__text{background:#d9e1e8;padding:20px;border-radius:0 0 4px 4px;font-size:15px;color:#282c37;line-height:20px;word-wrap:break-word;font-weight:400}.hero-widget__text .emojione{width:20px;height:20px;margin:-3px 0 0}.hero-widget__text p{margin-bottom:20px}.hero-widget__text p:last-child{margin-bottom:0}.hero-widget__text em{display:inline;margin:0;padding:0;font-weight:700;background:transparent;font-family:inherit;font-size:inherit;line-height:inherit;color:#131419}.hero-widget__text a{color:#282c37;text-decoration:none}.hero-widget__text a:hover{text-decoration:underline}@media screen and (max-width: 415px){.hero-widget{display:none}}.endorsements-widget{margin-bottom:10px;padding-bottom:10px}.endorsements-widget h4{padding:10px;font-weight:700;font-size:14px;color:#282c37}.endorsements-widget .account{padding:10px 0}.endorsements-widget .account:last-child{border-bottom:0}.endorsements-widget .account .account__display-name{display:flex;align-items:center}.endorsements-widget .account .account__avatar{width:44px;height:44px;background-size:44px 44px}.endorsements-widget .trends__item{padding:10px}.trends-widget h4{color:#282c37}.box-widget{padding:20px;border-radius:4px;background:#d9e1e8;box-shadow:0 0 15px rgba(0,0,0,.2)}.placeholder-widget{padding:16px;border-radius:4px;border:2px dashed #444b5d;text-align:center;color:#282c37;margin-bottom:10px}.contact-widget{min-height:100%;font-size:15px;color:#282c37;line-height:20px;word-wrap:break-word;font-weight:400;padding:0}.contact-widget h4{padding:10px;font-weight:700;font-size:14px;color:#282c37}.contact-widget .account{border-bottom:0;padding:10px 0;padding-top:5px}.contact-widget>a{display:inline-block;padding:10px;padding-top:0;color:#282c37;text-decoration:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.contact-widget>a:hover,.contact-widget>a:focus,.contact-widget>a:active{text-decoration:underline}.moved-account-widget{padding:15px;padding-bottom:20px;border-radius:4px;background:#d9e1e8;box-shadow:0 0 15px rgba(0,0,0,.2);color:#282c37;font-weight:400;margin-bottom:10px}.moved-account-widget strong,.moved-account-widget a{font-weight:500}.moved-account-widget strong:lang(ja),.moved-account-widget a:lang(ja){font-weight:700}.moved-account-widget strong:lang(ko),.moved-account-widget a:lang(ko){font-weight:700}.moved-account-widget strong:lang(zh-CN),.moved-account-widget a:lang(zh-CN){font-weight:700}.moved-account-widget strong:lang(zh-HK),.moved-account-widget a:lang(zh-HK){font-weight:700}.moved-account-widget strong:lang(zh-TW),.moved-account-widget a:lang(zh-TW){font-weight:700}.moved-account-widget a{color:inherit;text-decoration:underline}.moved-account-widget a.mention{text-decoration:none}.moved-account-widget a.mention span{text-decoration:none}.moved-account-widget a.mention:focus,.moved-account-widget a.mention:hover,.moved-account-widget a.mention:active{text-decoration:none}.moved-account-widget a.mention:focus span,.moved-account-widget a.mention:hover span,.moved-account-widget a.mention:active span{text-decoration:underline}.moved-account-widget__message{margin-bottom:15px}.moved-account-widget__message .fa{margin-right:5px;color:#282c37}.moved-account-widget__card .detailed-status__display-avatar{position:relative;cursor:pointer}.moved-account-widget__card .detailed-status__display-name{margin-bottom:0;text-decoration:none}.moved-account-widget__card .detailed-status__display-name span{font-weight:400}.memoriam-widget{padding:20px;border-radius:4px;background:#000;box-shadow:0 0 15px rgba(0,0,0,.2);font-size:14px;color:#282c37;margin-bottom:10px}.page-header{background:#c0cdd9;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;padding:60px 15px;text-align:center;margin:10px 0}.page-header h1{color:#000;font-size:36px;line-height:1.1;font-weight:700;margin-bottom:10px}.page-header p{font-size:15px;color:#282c37}@media screen and (max-width: 415px){.page-header{margin-top:0;background:#ccd7e0}.page-header h1{font-size:24px}}.directory{background:#d9e1e8;border-radius:4px;box-shadow:0 0 15px rgba(0,0,0,.2)}.directory__tag{box-sizing:border-box;margin-bottom:10px}.directory__tag>a,.directory__tag>div{display:flex;align-items:center;justify-content:space-between;background:#d9e1e8;border-radius:4px;padding:15px;text-decoration:none;color:inherit;box-shadow:0 0 15px rgba(0,0,0,.2)}.directory__tag>a:hover,.directory__tag>a:active,.directory__tag>a:focus{background:#c0cdd9}.directory__tag.active>a{background:#2b90d9;cursor:default}.directory__tag.disabled>div{opacity:.5;cursor:default}.directory__tag h4{flex:1 1 auto;font-size:18px;font-weight:700;color:#000;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.directory__tag h4 .fa{color:#282c37}.directory__tag h4 small{display:block;font-weight:400;font-size:15px;margin-top:8px;color:#282c37}.directory__tag.active h4,.directory__tag.active h4 .fa,.directory__tag.active h4 small,.directory__tag.active h4 .trends__item__current{color:#000}.directory__tag .avatar-stack{flex:0 0 auto;width:120px}.directory__tag.active .avatar-stack .account__avatar{border-color:#2b90d9}.directory__tag .trends__item__current{padding-right:0}.avatar-stack{display:flex;justify-content:flex-end}.avatar-stack .account__avatar{flex:0 0 auto;width:36px;height:36px;border-radius:50%;position:relative;margin-left:-10px;background:#f2f5f7;border:2px solid #d9e1e8}.avatar-stack .account__avatar:nth-child(1){z-index:1}.avatar-stack .account__avatar:nth-child(2){z-index:2}.avatar-stack .account__avatar:nth-child(3){z-index:3}.accounts-table{width:100%}.accounts-table .account{padding:0;border:0}.accounts-table strong{font-weight:700}.accounts-table thead th{text-align:center;color:#282c37;font-weight:700;padding:10px}.accounts-table thead th:first-child{text-align:left}.accounts-table tbody td{padding:15px 0;vertical-align:middle;border-bottom:1px solid #c0cdd9}.accounts-table tbody tr:last-child td{border-bottom:0}.accounts-table__count{width:120px;text-align:center;font-size:15px;font-weight:500;color:#000}.accounts-table__count small{display:block;color:#282c37;font-weight:400;font-size:14px}.accounts-table__comment{width:50%;vertical-align:initial !important}@media screen and (max-width: 415px){.accounts-table tbody td.optional{display:none}}@media screen and (max-width: 415px){.moved-account-widget,.memoriam-widget,.box-widget,.contact-widget,.landing-page__information.contact-widget,.directory,.page-header{margin-bottom:0;box-shadow:none;border-radius:0}}.statuses-grid{min-height:600px}@media screen and (max-width: 640px){.statuses-grid{width:100% !important}}.statuses-grid__item{width:313.3333333333px}@media screen and (max-width: 1255px){.statuses-grid__item{width:306.6666666667px}}@media screen and (max-width: 640px){.statuses-grid__item{width:100%}}@media screen and (max-width: 415px){.statuses-grid__item{width:100vw}}.statuses-grid .detailed-status{border-radius:4px}@media screen and (max-width: 415px){.statuses-grid .detailed-status{border-top:1px solid #a6b9c9}}.statuses-grid .detailed-status.compact .detailed-status__meta{margin-top:15px}.statuses-grid .detailed-status.compact .status__content{font-size:15px;line-height:20px}.statuses-grid .detailed-status.compact .status__content .emojione{width:20px;height:20px;margin:-3px 0 0}.statuses-grid .detailed-status.compact .status__content .status__content__spoiler-link{line-height:20px;margin:0}.statuses-grid .detailed-status.compact .media-gallery,.statuses-grid .detailed-status.compact .status-card,.statuses-grid .detailed-status.compact .video-player{margin-top:15px}.notice-widget{margin-bottom:10px;color:#282c37}.notice-widget p{margin-bottom:10px}.notice-widget p:last-child{margin-bottom:0}.notice-widget a{font-size:14px;line-height:20px}.notice-widget a,.placeholder-widget a{text-decoration:none;font-weight:500;color:#2b90d9}.notice-widget a:hover,.notice-widget a:focus,.notice-widget a:active,.placeholder-widget a:hover,.placeholder-widget a:focus,.placeholder-widget a:active{text-decoration:underline}.table-of-contents{background:#e6ebf0;min-height:100%;font-size:14px;border-radius:4px}.table-of-contents li a{display:block;font-weight:500;padding:15px;overflow:hidden;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-decoration:none;color:#000;border-bottom:1px solid #ccd7e0}.table-of-contents li a:hover,.table-of-contents li a:focus,.table-of-contents li a:active{text-decoration:underline}.table-of-contents li:last-child a{border-bottom:0}.table-of-contents li ul{padding-left:20px;border-bottom:1px solid #ccd7e0}code{font-family:\"mastodon-font-monospace\",monospace;font-weight:400}.form-container{max-width:400px;padding:20px;margin:0 auto}.simple_form .input{margin-bottom:15px;overflow:hidden}.simple_form .input.hidden{margin:0}.simple_form .input.radio_buttons .radio{margin-bottom:15px}.simple_form .input.radio_buttons .radio:last-child{margin-bottom:0}.simple_form .input.radio_buttons .radio>label{position:relative;padding-left:28px}.simple_form .input.radio_buttons .radio>label input{position:absolute;top:-2px;left:0}.simple_form .input.boolean{position:relative;margin-bottom:0}.simple_form .input.boolean .label_input>label{font-family:inherit;font-size:14px;padding-top:5px;color:#000;display:block;width:auto}.simple_form .input.boolean .label_input,.simple_form .input.boolean .hint{padding-left:28px}.simple_form .input.boolean .label_input__wrapper{position:static}.simple_form .input.boolean label.checkbox{position:absolute;top:2px;left:0}.simple_form .input.boolean label a{color:#2b90d9;text-decoration:underline}.simple_form .input.boolean label a:hover,.simple_form .input.boolean label a:active,.simple_form .input.boolean label a:focus{text-decoration:none}.simple_form .input.boolean .recommended{position:absolute;margin:0 4px;margin-top:-2px}.simple_form .row{display:flex;margin:0 -5px}.simple_form .row .input{box-sizing:border-box;flex:1 1 auto;width:50%;padding:0 5px}.simple_form .hint{color:#282c37}.simple_form .hint a{color:#2b90d9}.simple_form .hint code{border-radius:3px;padding:.2em .4em;background:#fff}.simple_form .hint li{list-style:disc;margin-left:18px}.simple_form ul.hint{margin-bottom:15px}.simple_form span.hint{display:block;font-size:12px;margin-top:4px}.simple_form p.hint{margin-bottom:15px;color:#282c37}.simple_form p.hint.subtle-hint{text-align:center;font-size:12px;line-height:18px;margin-top:15px;margin-bottom:0}.simple_form .card{margin-bottom:15px}.simple_form strong{font-weight:500}.simple_form strong:lang(ja){font-weight:700}.simple_form strong:lang(ko){font-weight:700}.simple_form strong:lang(zh-CN){font-weight:700}.simple_form strong:lang(zh-HK){font-weight:700}.simple_form strong:lang(zh-TW){font-weight:700}.simple_form .input.with_floating_label .label_input{display:flex}.simple_form .input.with_floating_label .label_input>label{font-family:inherit;font-size:14px;color:#000;font-weight:500;min-width:150px;flex:0 0 auto}.simple_form .input.with_floating_label .label_input input,.simple_form .input.with_floating_label .label_input select{flex:1 1 auto}.simple_form .input.with_floating_label.select .hint{margin-top:6px;margin-left:150px}.simple_form .input.with_label .label_input>label{font-family:inherit;font-size:14px;color:#000;display:block;margin-bottom:8px;word-wrap:break-word;font-weight:500}.simple_form .input.with_label .hint{margin-top:6px}.simple_form .input.with_label ul{flex:390px}.simple_form .input.with_block_label{max-width:none}.simple_form .input.with_block_label>label{font-family:inherit;font-size:16px;color:#000;display:block;font-weight:500;padding-top:5px}.simple_form .input.with_block_label .hint{margin-bottom:15px}.simple_form .input.with_block_label ul{columns:2}.simple_form .required abbr{text-decoration:none;color:#c1203b}.simple_form .fields-group{margin-bottom:25px}.simple_form .fields-group .input:last-child{margin-bottom:0}.simple_form .fields-row{display:flex;margin:0 -10px;padding-top:5px;margin-bottom:25px}.simple_form .fields-row .input{max-width:none}.simple_form .fields-row__column{box-sizing:border-box;padding:0 10px;flex:1 1 auto;min-height:1px}.simple_form .fields-row__column-6{max-width:50%}.simple_form .fields-row__column .actions{margin-top:27px}.simple_form .fields-row .fields-group:last-child,.simple_form .fields-row .fields-row__column.fields-group{margin-bottom:0}@media screen and (max-width: 600px){.simple_form .fields-row{display:block;margin-bottom:0}.simple_form .fields-row__column{max-width:none}.simple_form .fields-row .fields-group:last-child,.simple_form .fields-row .fields-row__column.fields-group,.simple_form .fields-row .fields-row__column{margin-bottom:25px}}.simple_form .input.radio_buttons .radio label{margin-bottom:5px;font-family:inherit;font-size:14px;color:#000;display:block;width:auto}.simple_form .check_boxes .checkbox label{font-family:inherit;font-size:14px;color:#000;display:inline-block;width:auto;position:relative;padding-top:5px;padding-left:25px;flex:1 1 auto}.simple_form .check_boxes .checkbox input[type=checkbox]{position:absolute;left:0;top:5px;margin:0}.simple_form .input.static .label_input__wrapper{font-size:16px;padding:10px;border:1px solid #444b5d;border-radius:4px}.simple_form input[type=text],.simple_form input[type=number],.simple_form input[type=email],.simple_form input[type=password],.simple_form textarea{box-sizing:border-box;font-size:16px;color:#000;display:block;width:100%;outline:0;font-family:inherit;resize:vertical;background:#f9fafb;border:1px solid #fff;border-radius:4px;padding:10px}.simple_form input[type=text]::placeholder,.simple_form input[type=number]::placeholder,.simple_form input[type=email]::placeholder,.simple_form input[type=password]::placeholder,.simple_form textarea::placeholder{color:#1f232b}.simple_form input[type=text]:invalid,.simple_form input[type=number]:invalid,.simple_form input[type=email]:invalid,.simple_form input[type=password]:invalid,.simple_form textarea:invalid{box-shadow:none}.simple_form input[type=text]:focus:invalid:not(:placeholder-shown),.simple_form input[type=number]:focus:invalid:not(:placeholder-shown),.simple_form input[type=email]:focus:invalid:not(:placeholder-shown),.simple_form input[type=password]:focus:invalid:not(:placeholder-shown),.simple_form textarea:focus:invalid:not(:placeholder-shown){border-color:#c1203b}.simple_form input[type=text]:required:valid,.simple_form input[type=number]:required:valid,.simple_form input[type=email]:required:valid,.simple_form input[type=password]:required:valid,.simple_form textarea:required:valid{border-color:#4a905f}.simple_form input[type=text]:hover,.simple_form input[type=number]:hover,.simple_form input[type=email]:hover,.simple_form input[type=password]:hover,.simple_form textarea:hover{border-color:#fff}.simple_form input[type=text]:active,.simple_form input[type=text]:focus,.simple_form input[type=number]:active,.simple_form input[type=number]:focus,.simple_form input[type=email]:active,.simple_form input[type=email]:focus,.simple_form input[type=password]:active,.simple_form input[type=password]:focus,.simple_form textarea:active,.simple_form textarea:focus{border-color:#2b90d9;background:#f2f5f7}.simple_form .input.field_with_errors label{color:#c1203b}.simple_form .input.field_with_errors input[type=text],.simple_form .input.field_with_errors input[type=number],.simple_form .input.field_with_errors input[type=email],.simple_form .input.field_with_errors input[type=password],.simple_form .input.field_with_errors textarea,.simple_form .input.field_with_errors select{border-color:#c1203b}.simple_form .input.field_with_errors .error{display:block;font-weight:500;color:#c1203b;margin-top:4px}.simple_form .input.disabled{opacity:.5}.simple_form .actions{margin-top:30px;display:flex}.simple_form .actions.actions--top{margin-top:0;margin-bottom:30px}.simple_form button,.simple_form .button,.simple_form .block-button{display:block;width:100%;border:0;border-radius:4px;background:#2b90d9;color:#000;font-size:18px;line-height:inherit;height:auto;padding:10px;text-decoration:none;text-align:center;box-sizing:border-box;cursor:pointer;font-weight:500;outline:0;margin-bottom:10px;margin-right:10px}.simple_form button:last-child,.simple_form .button:last-child,.simple_form .block-button:last-child{margin-right:0}.simple_form button:hover,.simple_form .button:hover,.simple_form .block-button:hover{background-color:#2482c7}.simple_form button:active,.simple_form button:focus,.simple_form .button:active,.simple_form .button:focus,.simple_form .block-button:active,.simple_form .block-button:focus{background-color:#419bdd}.simple_form button:disabled:hover,.simple_form .button:disabled:hover,.simple_form .block-button:disabled:hover{background-color:#9bcbed}.simple_form button.negative,.simple_form .button.negative,.simple_form .block-button.negative{background:#df405a}.simple_form button.negative:hover,.simple_form .button.negative:hover,.simple_form .block-button.negative:hover{background-color:#db2a47}.simple_form button.negative:active,.simple_form button.negative:focus,.simple_form .button.negative:active,.simple_form .button.negative:focus,.simple_form .block-button.negative:active,.simple_form .block-button.negative:focus{background-color:#e3566d}.simple_form select{appearance:none;box-sizing:border-box;font-size:16px;color:#000;display:block;width:100%;outline:0;font-family:inherit;resize:vertical;background:#f9fafb url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center/auto 16px;border:1px solid #fff;border-radius:4px;padding-left:10px;padding-right:30px;height:41px}.simple_form h4{margin-bottom:15px !important}.simple_form .label_input__wrapper{position:relative}.simple_form .label_input__append{position:absolute;right:3px;top:1px;padding:10px;padding-bottom:9px;font-size:16px;color:#444b5d;font-family:inherit;pointer-events:none;cursor:default;max-width:140px;white-space:nowrap;overflow:hidden}.simple_form .label_input__append::after{content:\"\";display:block;position:absolute;top:0;right:0;bottom:1px;width:5px;background-image:linear-gradient(to right, rgba(249, 250, 251, 0), #f9fafb)}.simple_form__overlay-area{position:relative}.simple_form__overlay-area__blurred form{filter:blur(2px)}.simple_form__overlay-area__overlay{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;background:rgba(217,225,232,.65);border-radius:4px;margin-left:-4px;margin-top:-4px;padding:4px}.simple_form__overlay-area__overlay__content{text-align:center}.simple_form__overlay-area__overlay__content.rich-formatting,.simple_form__overlay-area__overlay__content.rich-formatting p{color:#000}.block-icon{display:block;margin:0 auto;margin-bottom:10px;font-size:24px}.flash-message{background:#c0cdd9;color:#282c37;border-radius:4px;padding:15px 10px;margin-bottom:30px;text-align:center}.flash-message.notice{border:1px solid rgba(74,144,95,.5);background:rgba(74,144,95,.25);color:#4a905f}.flash-message.alert{border:1px solid rgba(223,64,90,.5);background:rgba(223,64,90,.25);color:#df405a}.flash-message a{display:inline-block;color:#282c37;text-decoration:none}.flash-message a:hover{color:#000;text-decoration:underline}.flash-message p{margin-bottom:15px}.flash-message .oauth-code{outline:0;box-sizing:border-box;display:block;width:100%;border:0;padding:10px;font-family:\"mastodon-font-monospace\",monospace;background:#d9e1e8;color:#000;font-size:14px;margin:0}.flash-message .oauth-code::-moz-focus-inner{border:0}.flash-message .oauth-code::-moz-focus-inner,.flash-message .oauth-code:focus,.flash-message .oauth-code:active{outline:0 !important}.flash-message .oauth-code:focus{background:#ccd7e0}.flash-message strong{font-weight:500}.flash-message strong:lang(ja){font-weight:700}.flash-message strong:lang(ko){font-weight:700}.flash-message strong:lang(zh-CN){font-weight:700}.flash-message strong:lang(zh-HK){font-weight:700}.flash-message strong:lang(zh-TW){font-weight:700}@media screen and (max-width: 740px)and (min-width: 441px){.flash-message{margin-top:40px}}.form-footer{margin-top:30px;text-align:center}.form-footer a{color:#282c37;text-decoration:none}.form-footer a:hover{text-decoration:underline}.quick-nav{list-style:none;margin-bottom:25px;font-size:14px}.quick-nav li{display:inline-block;margin-right:10px}.quick-nav a{color:#2b90d9;text-decoration:none;font-weight:700}.quick-nav a:hover,.quick-nav a:focus,.quick-nav a:active{color:#217aba}.oauth-prompt,.follow-prompt{margin-bottom:30px;color:#282c37}.oauth-prompt h2,.follow-prompt h2{font-size:16px;margin-bottom:30px;text-align:center}.oauth-prompt strong,.follow-prompt strong{color:#282c37;font-weight:500}.oauth-prompt strong:lang(ja),.follow-prompt strong:lang(ja){font-weight:700}.oauth-prompt strong:lang(ko),.follow-prompt strong:lang(ko){font-weight:700}.oauth-prompt strong:lang(zh-CN),.follow-prompt strong:lang(zh-CN){font-weight:700}.oauth-prompt strong:lang(zh-HK),.follow-prompt strong:lang(zh-HK){font-weight:700}.oauth-prompt strong:lang(zh-TW),.follow-prompt strong:lang(zh-TW){font-weight:700}@media screen and (max-width: 740px)and (min-width: 441px){.oauth-prompt,.follow-prompt{margin-top:40px}}.qr-wrapper{display:flex;flex-wrap:wrap;align-items:flex-start}.qr-code{flex:0 0 auto;background:#fff;padding:4px;margin:0 10px 20px 0;box-shadow:0 0 15px rgba(0,0,0,.2);display:inline-block}.qr-code svg{display:block;margin:0}.qr-alternative{margin-bottom:20px;color:#282c37;flex:150px}.qr-alternative samp{display:block;font-size:14px}.table-form p{margin-bottom:15px}.table-form p strong{font-weight:500}.table-form p strong:lang(ja){font-weight:700}.table-form p strong:lang(ko){font-weight:700}.table-form p strong:lang(zh-CN){font-weight:700}.table-form p strong:lang(zh-HK){font-weight:700}.table-form p strong:lang(zh-TW){font-weight:700}.simple_form .warning,.table-form .warning{box-sizing:border-box;background:rgba(223,64,90,.5);color:#000;text-shadow:1px 1px 0 rgba(0,0,0,.3);box-shadow:0 2px 6px rgba(0,0,0,.4);border-radius:4px;padding:10px;margin-bottom:15px}.simple_form .warning a,.table-form .warning a{color:#000;text-decoration:underline}.simple_form .warning a:hover,.simple_form .warning a:focus,.simple_form .warning a:active,.table-form .warning a:hover,.table-form .warning a:focus,.table-form .warning a:active{text-decoration:none}.simple_form .warning strong,.table-form .warning strong{font-weight:600;display:block;margin-bottom:5px}.simple_form .warning strong:lang(ja),.table-form .warning strong:lang(ja){font-weight:700}.simple_form .warning strong:lang(ko),.table-form .warning strong:lang(ko){font-weight:700}.simple_form .warning strong:lang(zh-CN),.table-form .warning strong:lang(zh-CN){font-weight:700}.simple_form .warning strong:lang(zh-HK),.table-form .warning strong:lang(zh-HK){font-weight:700}.simple_form .warning strong:lang(zh-TW),.table-form .warning strong:lang(zh-TW){font-weight:700}.simple_form .warning strong .fa,.table-form .warning strong .fa{font-weight:400}.action-pagination{display:flex;flex-wrap:wrap;align-items:center}.action-pagination .actions,.action-pagination .pagination{flex:1 1 auto}.action-pagination .actions{padding:30px 0;padding-right:20px;flex:0 0 auto}.post-follow-actions{text-align:center;color:#282c37}.post-follow-actions div{margin-bottom:4px}.alternative-login{margin-top:20px;margin-bottom:20px}.alternative-login h4{font-size:16px;color:#000;text-align:center;margin-bottom:20px;border:0;padding:0}.alternative-login .button{display:block}.scope-danger{color:#ff5050}.form_admin_settings_site_short_description textarea,.form_admin_settings_site_description textarea,.form_admin_settings_site_extended_description textarea,.form_admin_settings_site_terms textarea,.form_admin_settings_custom_css textarea,.form_admin_settings_closed_registrations_message textarea{font-family:\"mastodon-font-monospace\",monospace}.input-copy{background:#f9fafb;border:1px solid #fff;border-radius:4px;display:flex;align-items:center;padding-right:4px;position:relative;top:1px;transition:border-color 300ms linear}.input-copy__wrapper{flex:1 1 auto}.input-copy input[type=text]{background:transparent;border:0;padding:10px;font-size:14px;font-family:\"mastodon-font-monospace\",monospace}.input-copy button{flex:0 0 auto;margin:4px;text-transform:none;font-weight:400;font-size:14px;padding:7px 18px;padding-bottom:6px;width:auto;transition:background 300ms linear}.input-copy.copied{border-color:#4a905f;transition:none}.input-copy.copied button{background:#4a905f;transition:none}.connection-prompt{margin-bottom:25px}.connection-prompt .fa-link{background-color:#e6ebf0;border-radius:100%;font-size:24px;padding:10px}.connection-prompt__column{align-items:center;display:flex;flex:1;flex-direction:column;flex-shrink:1;max-width:50%}.connection-prompt__column-sep{align-self:center;flex-grow:0;overflow:visible;position:relative;z-index:1}.connection-prompt__column p{word-break:break-word}.connection-prompt .account__avatar{margin-bottom:20px}.connection-prompt__connection{background-color:#c0cdd9;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;padding:25px 10px;position:relative;text-align:center}.connection-prompt__connection::after{background-color:#e6ebf0;content:\"\";display:block;height:100%;left:50%;position:absolute;top:0;width:1px}.connection-prompt__row{align-items:flex-start;display:flex;flex-direction:row}.card>a{display:block;text-decoration:none;color:inherit;box-shadow:0 0 15px rgba(0,0,0,.2)}@media screen and (max-width: 415px){.card>a{box-shadow:none}}.card>a:hover .card__bar,.card>a:active .card__bar,.card>a:focus .card__bar{background:#c0cdd9}.card__img{height:130px;position:relative;background:#fff;border-radius:4px 4px 0 0}.card__img img{display:block;width:100%;height:100%;margin:0;object-fit:cover;border-radius:4px 4px 0 0}@media screen and (max-width: 600px){.card__img{height:200px}}@media screen and (max-width: 415px){.card__img{display:none}}.card__bar{position:relative;padding:15px;display:flex;justify-content:flex-start;align-items:center;background:#ccd7e0;border-radius:0 0 4px 4px}@media screen and (max-width: 415px){.card__bar{border-radius:0}}.card__bar .avatar{flex:0 0 auto;width:48px;height:48px;padding-top:2px}.card__bar .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px;background:#f2f5f7;object-fit:cover}.card__bar .display-name{margin-left:15px;text-align:left}.card__bar .display-name strong{font-size:15px;color:#000;font-weight:500;overflow:hidden;text-overflow:ellipsis}.card__bar .display-name span{display:block;font-size:14px;color:#282c37;font-weight:400;overflow:hidden;text-overflow:ellipsis}.pagination{padding:30px 0;text-align:center;overflow:hidden}.pagination a,.pagination .current,.pagination .newer,.pagination .older,.pagination .page,.pagination .gap{font-size:14px;color:#000;font-weight:500;display:inline-block;padding:6px 10px;text-decoration:none}.pagination .current{background:#fff;border-radius:100px;color:#000;cursor:default;margin:0 10px}.pagination .gap{cursor:default}.pagination .older,.pagination .newer{color:#282c37}.pagination .older{float:left;padding-left:0}.pagination .older .fa{display:inline-block;margin-right:5px}.pagination .newer{float:right;padding-right:0}.pagination .newer .fa{display:inline-block;margin-left:5px}.pagination .disabled{cursor:default;color:#000}@media screen and (max-width: 700px){.pagination{padding:30px 20px}.pagination .page{display:none}.pagination .newer,.pagination .older{display:inline-block}}.nothing-here{background:#d9e1e8;box-shadow:0 0 15px rgba(0,0,0,.2);color:#444b5d;font-size:14px;font-weight:500;text-align:center;display:flex;justify-content:center;align-items:center;cursor:default;border-radius:4px;padding:20px;min-height:30vh}.nothing-here--under-tabs{border-radius:0 0 4px 4px}.nothing-here--flexible{box-sizing:border-box;min-height:100%}.account-role,.simple_form .recommended{display:inline-block;padding:4px 6px;cursor:default;border-radius:3px;font-size:12px;line-height:12px;font-weight:500;color:#282c37;background-color:rgba(40,44,55,.1);border:1px solid rgba(40,44,55,.5)}.account-role.moderator,.simple_form .recommended.moderator{color:#4a905f;background-color:rgba(74,144,95,.1);border-color:rgba(74,144,95,.5)}.account-role.admin,.simple_form .recommended.admin{color:#c1203b;background-color:rgba(193,32,59,.1);border-color:rgba(193,32,59,.5)}.account__header__fields{max-width:100vw;padding:0;margin:15px -15px -15px;border:0 none;border-top:1px solid #b3c3d1;border-bottom:1px solid #b3c3d1;font-size:14px;line-height:20px}.account__header__fields dl{display:flex;border-bottom:1px solid #b3c3d1}.account__header__fields dt,.account__header__fields dd{box-sizing:border-box;padding:14px;text-align:center;max-height:48px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.account__header__fields dt{font-weight:500;width:120px;flex:0 0 auto;color:#282c37;background:rgba(242,245,247,.5)}.account__header__fields dd{flex:1 1 auto;color:#282c37}.account__header__fields a{color:#2b90d9;text-decoration:none}.account__header__fields a:hover,.account__header__fields a:focus,.account__header__fields a:active{text-decoration:underline}.account__header__fields .verified{border:1px solid rgba(74,144,95,.5);background:rgba(74,144,95,.25)}.account__header__fields .verified a{color:#4a905f;font-weight:500}.account__header__fields .verified__mark{color:#4a905f}.account__header__fields dl:last-child{border-bottom:0}.directory__tag .trends__item__current{width:auto}.pending-account__header{color:#282c37}.pending-account__header a{color:#282c37;text-decoration:none}.pending-account__header a:hover,.pending-account__header a:active,.pending-account__header a:focus{text-decoration:underline}.pending-account__header strong{color:#000;font-weight:700}.pending-account__body{margin-top:10px}.activity-stream{box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;overflow:hidden;margin-bottom:10px}.activity-stream--under-tabs{border-radius:0 0 4px 4px}@media screen and (max-width: 415px){.activity-stream{margin-bottom:0;border-radius:0;box-shadow:none}}.activity-stream--headless{border-radius:0;margin:0;box-shadow:none}.activity-stream--headless .detailed-status,.activity-stream--headless .status{border-radius:0 !important}.activity-stream div[data-component]{width:100%}.activity-stream .entry{background:#d9e1e8}.activity-stream .entry .detailed-status,.activity-stream .entry .status,.activity-stream .entry .load-more{animation:none}.activity-stream .entry:last-child .detailed-status,.activity-stream .entry:last-child .status,.activity-stream .entry:last-child .load-more{border-bottom:0;border-radius:0 0 4px 4px}.activity-stream .entry:first-child .detailed-status,.activity-stream .entry:first-child .status,.activity-stream .entry:first-child .load-more{border-radius:4px 4px 0 0}.activity-stream .entry:first-child:last-child .detailed-status,.activity-stream .entry:first-child:last-child .status,.activity-stream .entry:first-child:last-child .load-more{border-radius:4px}@media screen and (max-width: 740px){.activity-stream .entry .detailed-status,.activity-stream .entry .status,.activity-stream .entry .load-more{border-radius:0 !important}}.activity-stream--highlighted .entry{background:#c0cdd9}.button.logo-button{flex:0 auto;font-size:14px;background:#2b90d9;color:#000;text-transform:none;line-height:36px;height:auto;padding:3px 15px;border:0}.button.logo-button svg{width:20px;height:auto;vertical-align:middle;margin-right:5px;fill:#000}.button.logo-button:active,.button.logo-button:focus,.button.logo-button:hover{background:#2074b1}.button.logo-button:disabled:active,.button.logo-button:disabled:focus,.button.logo-button:disabled:hover,.button.logo-button.disabled:active,.button.logo-button.disabled:focus,.button.logo-button.disabled:hover{background:#9bcbed}.button.logo-button.button--destructive:active,.button.logo-button.button--destructive:focus,.button.logo-button.button--destructive:hover{background:#df405a}@media screen and (max-width: 415px){.button.logo-button svg{display:none}}.embed .detailed-status,.public-layout .detailed-status{padding:15px}.embed .status,.public-layout .status{padding:15px 15px 15px 78px;min-height:50px}.embed .status__avatar,.public-layout .status__avatar{left:15px;top:17px}.embed .status__content,.public-layout .status__content{padding-top:5px}.embed .status__prepend,.public-layout .status__prepend{margin-left:78px;padding-top:15px}.embed .status__prepend-icon-wrapper,.public-layout .status__prepend-icon-wrapper{left:-32px}.embed .status .media-gallery,.embed .status__action-bar,.embed .status .video-player,.public-layout .status .media-gallery,.public-layout .status__action-bar,.public-layout .status .video-player{margin-top:10px}button.icon-button i.fa-retweet{background-image:url(\"data:image/svg+xml;utf8,\")}button.icon-button i.fa-retweet:hover{background-image:url(\"data:image/svg+xml;utf8,\")}button.icon-button.disabled i.fa-retweet{background-image:url(\"data:image/svg+xml;utf8,\")}.app-body{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.link-button{display:block;font-size:15px;line-height:20px;color:#2b90d9;border:0;background:transparent;padding:0;cursor:pointer}.link-button:hover,.link-button:active{text-decoration:underline}.link-button:disabled{color:#9bcbed;cursor:default}.button{background-color:#2b90d9;border:10px none;border-radius:4px;box-sizing:border-box;color:#000;cursor:pointer;display:inline-block;font-family:inherit;font-size:15px;font-weight:500;height:36px;letter-spacing:0;line-height:36px;overflow:hidden;padding:0 16px;position:relative;text-align:center;text-decoration:none;text-overflow:ellipsis;transition:all 100ms ease-in;white-space:nowrap;width:auto}.button:active,.button:focus,.button:hover{background-color:#2074b1;transition:all 200ms ease-out}.button--destructive{transition:none}.button--destructive:active,.button--destructive:focus,.button--destructive:hover{background-color:#df405a;transition:none}.button:disabled,.button.disabled{background-color:#9bcbed;cursor:default}.button::-moz-focus-inner{border:0}.button::-moz-focus-inner,.button:focus,.button:active{outline:0 !important}.button.button-primary,.button.button-alternative,.button.button-secondary,.button.button-alternative-2{font-size:16px;line-height:36px;height:auto;text-transform:none;padding:4px 16px}.button.button-alternative{color:#000;background:#9bcbed}.button.button-alternative:active,.button.button-alternative:focus,.button.button-alternative:hover{background-color:#8ac2ea}.button.button-alternative-2{background:#b0c0cf}.button.button-alternative-2:active,.button.button-alternative-2:focus,.button.button-alternative-2:hover{background-color:#a3b6c7}.button.button-secondary{color:#282c37;background:transparent;padding:3px 15px;border:1px solid #9bcbed}.button.button-secondary:active,.button.button-secondary:focus,.button.button-secondary:hover{border-color:#8ac2ea;color:#1f232b}.button.button-secondary:disabled{opacity:.5}.button.button--block{display:block;width:100%}.column__wrapper{display:flex;flex:1 1 auto;position:relative}.icon-button{display:inline-block;padding:0;color:#606984;border:0;border-radius:4px;background:transparent;cursor:pointer;transition:all 100ms ease-in;transition-property:background-color,color}.icon-button:hover,.icon-button:active,.icon-button:focus{color:#51596f;background-color:rgba(96,105,132,.15);transition:all 200ms ease-out;transition-property:background-color,color}.icon-button:focus{background-color:rgba(96,105,132,.3)}.icon-button.disabled{color:#828ba4;background-color:transparent;cursor:default}.icon-button.active{color:#2b90d9}.icon-button::-moz-focus-inner{border:0}.icon-button::-moz-focus-inner,.icon-button:focus,.icon-button:active{outline:0 !important}.icon-button.inverted{color:#282c37}.icon-button.inverted:hover,.icon-button.inverted:active,.icon-button.inverted:focus{color:#373d4c;background-color:rgba(40,44,55,.15)}.icon-button.inverted:focus{background-color:rgba(40,44,55,.3)}.icon-button.inverted.disabled{color:#191b22;background-color:transparent}.icon-button.inverted.active{color:#2b90d9}.icon-button.inverted.active.disabled{color:#1d6ca4}.icon-button.overlayed{box-sizing:content-box;background:rgba(255,255,255,.6);color:rgba(0,0,0,.7);border-radius:4px;padding:2px}.icon-button.overlayed:hover{background:rgba(255,255,255,.9)}.text-icon-button{color:#282c37;border:0;border-radius:4px;background:transparent;cursor:pointer;font-weight:600;font-size:11px;padding:0 3px;line-height:27px;outline:0;transition:all 100ms ease-in;transition-property:background-color,color}.text-icon-button:hover,.text-icon-button:active,.text-icon-button:focus{color:#373d4c;background-color:rgba(40,44,55,.15);transition:all 200ms ease-out;transition-property:background-color,color}.text-icon-button:focus{background-color:rgba(40,44,55,.3)}.text-icon-button.disabled{color:#000;background-color:transparent;cursor:default}.text-icon-button.active{color:#2b90d9}.text-icon-button::-moz-focus-inner{border:0}.text-icon-button::-moz-focus-inner,.text-icon-button:focus,.text-icon-button:active{outline:0 !important}.dropdown-menu{position:absolute}.invisible{font-size:0;line-height:0;display:inline-block;width:0;height:0;position:absolute}.invisible img,.invisible svg{margin:0 !important;border:0 !important;padding:0 !important;width:0 !important;height:0 !important}.ellipsis::after{content:\"…\"}.compose-form{padding:10px}.compose-form__sensitive-button{padding:10px;padding-top:0;font-size:14px;font-weight:500}.compose-form__sensitive-button.active{color:#2b90d9}.compose-form__sensitive-button input[type=checkbox]{display:none}.compose-form__sensitive-button .checkbox{display:inline-block;position:relative;border:1px solid #9bcbed;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:4px;vertical-align:middle}.compose-form__sensitive-button .checkbox.active{border-color:#2b90d9;background:#2b90d9}.compose-form .compose-form__warning{color:#000;margin-bottom:10px;background:#9bcbed;box-shadow:0 2px 6px rgba(0,0,0,.3);padding:8px 10px;border-radius:4px;font-size:13px;font-weight:400}.compose-form .compose-form__warning strong{color:#000;font-weight:500}.compose-form .compose-form__warning strong:lang(ja){font-weight:700}.compose-form .compose-form__warning strong:lang(ko){font-weight:700}.compose-form .compose-form__warning strong:lang(zh-CN){font-weight:700}.compose-form .compose-form__warning strong:lang(zh-HK){font-weight:700}.compose-form .compose-form__warning strong:lang(zh-TW){font-weight:700}.compose-form .compose-form__warning a{color:#282c37;font-weight:500;text-decoration:underline}.compose-form .compose-form__warning a:hover,.compose-form .compose-form__warning a:active,.compose-form .compose-form__warning a:focus{text-decoration:none}.compose-form .emoji-picker-dropdown{position:absolute;top:5px;right:5px}.compose-form .compose-form__autosuggest-wrapper{position:relative}.compose-form .autosuggest-textarea,.compose-form .autosuggest-input,.compose-form .spoiler-input{position:relative;width:100%}.compose-form .spoiler-input{height:0;transform-origin:bottom;opacity:0}.compose-form .spoiler-input.spoiler-input--visible{height:36px;margin-bottom:11px;opacity:1}.compose-form .autosuggest-textarea__textarea,.compose-form .spoiler-input__input{display:block;box-sizing:border-box;width:100%;margin:0;color:#000;background:#fff;padding:10px;font-family:inherit;font-size:14px;resize:vertical;border:0;outline:0}.compose-form .autosuggest-textarea__textarea::placeholder,.compose-form .spoiler-input__input::placeholder{color:#444b5d}.compose-form .autosuggest-textarea__textarea:focus,.compose-form .spoiler-input__input:focus{outline:0}@media screen and (max-width: 600px){.compose-form .autosuggest-textarea__textarea,.compose-form .spoiler-input__input{font-size:16px}}.compose-form .spoiler-input__input{border-radius:4px}.compose-form .autosuggest-textarea__textarea{min-height:100px;border-radius:4px 4px 0 0;padding-bottom:0;padding-right:32px;resize:none;scrollbar-color:initial}.compose-form .autosuggest-textarea__textarea::-webkit-scrollbar{all:unset}@media screen and (max-width: 600px){.compose-form .autosuggest-textarea__textarea{height:100px !important;resize:vertical}}.compose-form .autosuggest-textarea__suggestions-wrapper{position:relative;height:0}.compose-form .autosuggest-textarea__suggestions{box-sizing:border-box;display:none;position:absolute;top:100%;width:100%;z-index:99;box-shadow:4px 4px 6px rgba(0,0,0,.4);background:#282c37;border-radius:0 0 4px 4px;color:#000;font-size:14px;padding:6px}.compose-form .autosuggest-textarea__suggestions.autosuggest-textarea__suggestions--visible{display:block}.compose-form .autosuggest-textarea__suggestions__item{padding:10px;cursor:pointer;border-radius:4px}.compose-form .autosuggest-textarea__suggestions__item:hover,.compose-form .autosuggest-textarea__suggestions__item:focus,.compose-form .autosuggest-textarea__suggestions__item:active,.compose-form .autosuggest-textarea__suggestions__item.selected{background:#3d4455}.compose-form .autosuggest-account,.compose-form .autosuggest-emoji,.compose-form .autosuggest-hashtag{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;line-height:18px;font-size:14px}.compose-form .autosuggest-hashtag{justify-content:space-between}.compose-form .autosuggest-hashtag__name{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.compose-form .autosuggest-hashtag strong{font-weight:500}.compose-form .autosuggest-hashtag__uses{flex:0 0 auto;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.compose-form .autosuggest-account-icon,.compose-form .autosuggest-emoji img{display:block;margin-right:8px;width:16px;height:16px}.compose-form .autosuggest-account .display-name__account{color:#282c37}.compose-form .compose-form__modifiers{color:#000;font-family:inherit;font-size:14px;background:#fff}.compose-form .compose-form__modifiers .compose-form__upload-wrapper{overflow:hidden}.compose-form .compose-form__modifiers .compose-form__uploads-wrapper{display:flex;flex-direction:row;padding:5px;flex-wrap:wrap}.compose-form .compose-form__modifiers .compose-form__upload{flex:1 1 0;min-width:40%;margin:5px}.compose-form .compose-form__modifiers .compose-form__upload__actions{background:linear-gradient(180deg, rgba(0, 0, 0, 0.8) 0, rgba(0, 0, 0, 0.35) 80%, transparent);display:flex;align-items:flex-start;justify-content:space-between;opacity:0;transition:opacity .1s ease}.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button{flex:0 1 auto;color:#282c37;font-size:14px;font-weight:500;padding:10px;font-family:inherit}.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button:hover,.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button:focus,.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button:active{color:#191b22}.compose-form .compose-form__modifiers .compose-form__upload__actions.active{opacity:1}.compose-form .compose-form__modifiers .compose-form__upload-description{position:absolute;z-index:2;bottom:0;left:0;right:0;box-sizing:border-box;background:linear-gradient(0deg, rgba(0, 0, 0, 0.8) 0, rgba(0, 0, 0, 0.35) 80%, transparent);padding:10px;opacity:0;transition:opacity .1s ease}.compose-form .compose-form__modifiers .compose-form__upload-description textarea{background:transparent;color:#282c37;border:0;padding:0;margin:0;width:100%;font-family:inherit;font-size:14px;font-weight:500}.compose-form .compose-form__modifiers .compose-form__upload-description textarea:focus{color:#fff}.compose-form .compose-form__modifiers .compose-form__upload-description textarea::placeholder{opacity:.75;color:#282c37}.compose-form .compose-form__modifiers .compose-form__upload-description.active{opacity:1}.compose-form .compose-form__modifiers .compose-form__upload-thumbnail{border-radius:4px;background-color:#000;background-position:center;background-size:cover;background-repeat:no-repeat;height:140px;width:100%;overflow:hidden}.compose-form .compose-form__buttons-wrapper{padding:10px;background:#fff;border-radius:0 0 4px 4px;display:flex;justify-content:space-between;flex:0 0 auto}.compose-form .compose-form__buttons-wrapper .compose-form__buttons{display:flex}.compose-form .compose-form__buttons-wrapper .compose-form__buttons .compose-form__upload-button-icon{line-height:27px}.compose-form .compose-form__buttons-wrapper .compose-form__buttons .compose-form__sensitive-button{display:none}.compose-form .compose-form__buttons-wrapper .compose-form__buttons .compose-form__sensitive-button.compose-form__sensitive-button--visible{display:block}.compose-form .compose-form__buttons-wrapper .compose-form__buttons .compose-form__sensitive-button .compose-form__sensitive-button__icon{line-height:27px}.compose-form .compose-form__buttons-wrapper .icon-button,.compose-form .compose-form__buttons-wrapper .text-icon-button{box-sizing:content-box;padding:0 3px}.compose-form .compose-form__buttons-wrapper .character-counter__wrapper{align-self:center;margin-right:4px}.compose-form .compose-form__publish{display:flex;justify-content:flex-end;min-width:0;flex:0 0 auto}.compose-form .compose-form__publish .compose-form__publish-button-wrapper{overflow:hidden;padding-top:10px}.character-counter{cursor:default;font-family:\"mastodon-font-sans-serif\",sans-serif;font-size:14px;font-weight:600;color:#282c37}.character-counter.character-counter--over{color:#ff5050}.no-reduce-motion .spoiler-input{transition:height .4s ease,opacity .4s ease}.emojione{font-size:inherit;vertical-align:middle;object-fit:contain;margin:-0.2ex .15em .2ex;width:16px;height:16px}.emojione img{width:auto}.reply-indicator{border-radius:4px;margin-bottom:10px;background:#9bcbed;padding:10px;min-height:23px;overflow-y:auto;flex:0 2 auto}.reply-indicator__header{margin-bottom:5px;overflow:hidden}.reply-indicator__cancel{float:right;line-height:24px}.reply-indicator__display-name{color:#000;display:block;max-width:100%;line-height:24px;overflow:hidden;padding-right:25px;text-decoration:none}.reply-indicator__display-avatar{float:left;margin-right:5px}.status__content--with-action{cursor:pointer}.status__content,.reply-indicator__content{position:relative;font-size:15px;line-height:20px;word-wrap:break-word;font-weight:400;overflow:hidden;text-overflow:ellipsis;padding-top:2px;color:#000}.status__content:focus,.reply-indicator__content:focus{outline:0}.status__content.status__content--with-spoiler,.reply-indicator__content.status__content--with-spoiler{white-space:normal}.status__content.status__content--with-spoiler .status__content__text,.reply-indicator__content.status__content--with-spoiler .status__content__text{white-space:pre-wrap}.status__content .emojione,.reply-indicator__content .emojione{width:20px;height:20px;margin:-3px 0 0}.status__content img,.reply-indicator__content img{max-width:100%;max-height:400px;object-fit:contain}.status__content p,.reply-indicator__content p{margin-bottom:20px;white-space:pre-wrap}.status__content p:last-child,.reply-indicator__content p:last-child{margin-bottom:0}.status__content a,.reply-indicator__content a{color:#d8a070;text-decoration:none}.status__content a:hover,.reply-indicator__content a:hover{text-decoration:underline}.status__content a:hover .fa,.reply-indicator__content a:hover .fa{color:#353a48}.status__content a.mention:hover,.reply-indicator__content a.mention:hover{text-decoration:none}.status__content a.mention:hover span,.reply-indicator__content a.mention:hover span{text-decoration:underline}.status__content a .fa,.reply-indicator__content a .fa{color:#444b5d}.status__content a.unhandled-link,.reply-indicator__content a.unhandled-link{color:#217aba}.status__content .status__content__spoiler-link,.reply-indicator__content .status__content__spoiler-link{background:#606984}.status__content .status__content__spoiler-link:hover,.reply-indicator__content .status__content__spoiler-link:hover{background:#51596f;text-decoration:none}.status__content .status__content__spoiler-link::-moz-focus-inner,.reply-indicator__content .status__content__spoiler-link::-moz-focus-inner{border:0}.status__content .status__content__spoiler-link::-moz-focus-inner,.status__content .status__content__spoiler-link:focus,.status__content .status__content__spoiler-link:active,.reply-indicator__content .status__content__spoiler-link::-moz-focus-inner,.reply-indicator__content .status__content__spoiler-link:focus,.reply-indicator__content .status__content__spoiler-link:active{outline:0 !important}.status__content .status__content__text,.reply-indicator__content .status__content__text{display:none}.status__content .status__content__text.status__content__text--visible,.reply-indicator__content .status__content__text.status__content__text--visible{display:block}.status__content.status__content--collapsed{max-height:300px}.status__content__read-more-button{display:block;font-size:15px;line-height:20px;color:#217aba;border:0;background:transparent;padding:0;padding-top:8px}.status__content__read-more-button:hover,.status__content__read-more-button:active{text-decoration:underline}.status__content__spoiler-link{display:inline-block;border-radius:2px;background:transparent;border:0;color:#000;font-weight:700;font-size:12px;padding:0 6px;line-height:20px;cursor:pointer;vertical-align:middle}.status__wrapper--filtered{color:#444b5d;border:0;font-size:inherit;text-align:center;line-height:inherit;margin:0;padding:15px;box-sizing:border-box;width:100%;clear:both;border-bottom:1px solid #c0cdd9}.status__prepend-icon-wrapper{left:-26px;position:absolute}.focusable:focus{outline:0;background:#ccd7e0}.focusable:focus .status.status-direct{background:#b3c3d1}.focusable:focus .status.status-direct.muted{background:transparent}.focusable:focus .detailed-status,.focusable:focus .detailed-status__action-bar{background:#c0cdd9}.status{padding:8px 10px;padding-left:68px;position:relative;min-height:54px;border-bottom:1px solid #c0cdd9;cursor:default;opacity:1;animation:fade 150ms linear}@supports(-ms-overflow-style: -ms-autohiding-scrollbar){.status{padding-right:26px}}@keyframes fade{0%{opacity:0}100%{opacity:1}}.status .video-player,.status .audio-player{margin-top:8px}.status.status-direct:not(.read){background:#c0cdd9;border-bottom-color:#b3c3d1}.status.light .status__relative-time{color:#444b5d}.status.light .status__display-name{color:#000}.status.light .display-name strong{color:#000}.status.light .display-name span{color:#444b5d}.status.light .status__content{color:#000}.status.light .status__content a{color:#2b90d9}.status.light .status__content a.status__content__spoiler-link{color:#000;background:#9bcbed}.status.light .status__content a.status__content__spoiler-link:hover{background:#78b9e7}.notification-favourite .status.status-direct{background:transparent}.notification-favourite .status.status-direct .icon-button.disabled{color:#444a5e}.status__relative-time,.notification__relative_time{color:#444b5d;float:right;font-size:14px}.status__display-name{color:#444b5d}.status__info .status__display-name{display:block;max-width:100%;padding-right:25px}.status__info{font-size:15px}.status-check-box{border-bottom:1px solid #282c37;display:flex}.status-check-box .status-check-box__status{margin:10px 0 10px 10px;flex:1}.status-check-box .status-check-box__status .media-gallery{max-width:250px}.status-check-box .status-check-box__status .status__content{padding:0;white-space:normal}.status-check-box .status-check-box__status .video-player,.status-check-box .status-check-box__status .audio-player{margin-top:8px;max-width:250px}.status-check-box .status-check-box__status .media-gallery__item-thumbnail{cursor:default}.status-check-box-toggle{align-items:center;display:flex;flex:0 0 auto;justify-content:center;padding:10px}.status__prepend{margin-left:68px;color:#444b5d;padding:8px 0;padding-bottom:2px;font-size:14px;position:relative}.status__prepend .status__display-name strong{color:#444b5d}.status__prepend>span{display:block;overflow:hidden;text-overflow:ellipsis}.status__action-bar{align-items:center;display:flex;margin-top:8px}.status__action-bar__counter{display:inline-flex;margin-right:11px;align-items:center}.status__action-bar__counter .status__action-bar-button{margin-right:4px}.status__action-bar__counter__label{display:inline-block;width:14px;font-size:12px;font-weight:500;color:#606984}.status__action-bar-button{margin-right:18px}.status__action-bar-dropdown{height:23.15px;width:23.15px}.detailed-status__action-bar-dropdown{flex:1 1 auto;display:flex;align-items:center;justify-content:center;position:relative}.detailed-status{background:#ccd7e0;padding:14px 10px}.detailed-status--flex{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-start}.detailed-status--flex .status__content,.detailed-status--flex .detailed-status__meta{flex:100%}.detailed-status .status__content{font-size:19px;line-height:24px}.detailed-status .status__content .emojione{width:24px;height:24px;margin:-1px 0 0}.detailed-status .status__content .status__content__spoiler-link{line-height:24px;margin:-1px 0 0}.detailed-status .video-player,.detailed-status .audio-player{margin-top:8px}.detailed-status__meta{margin-top:15px;color:#444b5d;font-size:14px;line-height:18px}.detailed-status__action-bar{background:#ccd7e0;border-top:1px solid #c0cdd9;border-bottom:1px solid #c0cdd9;display:flex;flex-direction:row;padding:10px 0}.detailed-status__link{color:inherit;text-decoration:none}.detailed-status__favorites,.detailed-status__reblogs{display:inline-block;font-weight:500;font-size:12px;margin-left:6px}.reply-indicator__content{color:#000;font-size:14px}.reply-indicator__content a{color:#282c37}.domain{padding:10px;border-bottom:1px solid #c0cdd9}.domain .domain__domain-name{flex:1 1 auto;display:block;color:#000;text-decoration:none;font-size:14px;font-weight:500}.domain__wrapper{display:flex}.domain_buttons{height:18px;padding:10px;white-space:nowrap}.account{padding:10px;border-bottom:1px solid #c0cdd9}.account.compact{padding:0;border-bottom:0}.account.compact .account__avatar-wrapper{margin-left:0}.account .account__display-name{flex:1 1 auto;display:block;color:#282c37;overflow:hidden;text-decoration:none;font-size:14px}.account__wrapper{display:flex}.account__avatar-wrapper{float:left;margin-left:12px;margin-right:12px}.account__avatar{border-radius:4px;background:transparent no-repeat;background-position:50%;background-clip:padding-box;position:relative}.account__avatar-inline{display:inline-block;vertical-align:middle;margin-right:5px}.account__avatar-composite{border-radius:4px;background:transparent no-repeat;background-position:50%;background-clip:padding-box;border-radius:50%;overflow:hidden;position:relative;cursor:default}.account__avatar-composite>div{float:left;position:relative;box-sizing:border-box}.account__avatar-composite__label{display:block;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);color:#000;text-shadow:1px 1px 2px #000;font-weight:700;font-size:15px}a .account__avatar{cursor:pointer}.account__avatar-overlay{width:48px;height:48px;background-size:48px 48px}.account__avatar-overlay-base{border-radius:4px;background:transparent no-repeat;background-position:50%;background-clip:padding-box;width:36px;height:36px;background-size:36px 36px}.account__avatar-overlay-overlay{border-radius:4px;background:transparent no-repeat;background-position:50%;background-clip:padding-box;width:24px;height:24px;background-size:24px 24px;position:absolute;bottom:0;right:0;z-index:1}.account__relationship{height:18px;padding:10px;white-space:nowrap}.account__disclaimer{padding:10px;border-top:1px solid #c0cdd9;color:#444b5d}.account__disclaimer strong{font-weight:500}.account__disclaimer strong:lang(ja){font-weight:700}.account__disclaimer strong:lang(ko){font-weight:700}.account__disclaimer strong:lang(zh-CN){font-weight:700}.account__disclaimer strong:lang(zh-HK){font-weight:700}.account__disclaimer strong:lang(zh-TW){font-weight:700}.account__disclaimer a{font-weight:500;color:inherit;text-decoration:underline}.account__disclaimer a:hover,.account__disclaimer a:focus,.account__disclaimer a:active{text-decoration:none}.account__action-bar{border-top:1px solid #c0cdd9;border-bottom:1px solid #c0cdd9;line-height:36px;overflow:hidden;flex:0 0 auto;display:flex}.account__action-bar-dropdown{padding:10px}.account__action-bar-dropdown .icon-button{vertical-align:middle}.account__action-bar-dropdown .dropdown--active .dropdown__content.dropdown__right{left:6px;right:initial}.account__action-bar-dropdown .dropdown--active::after{bottom:initial;margin-left:11px;margin-top:-7px;right:initial}.account__action-bar-links{display:flex;flex:1 1 auto;line-height:18px;text-align:center}.account__action-bar__tab{text-decoration:none;overflow:hidden;flex:0 1 100%;border-right:1px solid #c0cdd9;padding:10px 0;border-bottom:4px solid transparent}.account__action-bar__tab.active{border-bottom:4px solid #2b90d9}.account__action-bar__tab>span{display:block;font-size:12px;color:#282c37}.account__action-bar__tab strong{display:block;font-size:15px;font-weight:500;color:#000}.account__action-bar__tab strong:lang(ja){font-weight:700}.account__action-bar__tab strong:lang(ko){font-weight:700}.account__action-bar__tab strong:lang(zh-CN){font-weight:700}.account__action-bar__tab strong:lang(zh-HK){font-weight:700}.account__action-bar__tab strong:lang(zh-TW){font-weight:700}.account-authorize{padding:14px 10px}.account-authorize .detailed-status__display-name{display:block;margin-bottom:15px;overflow:hidden}.account-authorize__avatar{float:left;margin-right:10px}.status__display-name,.status__relative-time,.detailed-status__display-name,.detailed-status__datetime,.detailed-status__application,.account__display-name{text-decoration:none}.status__display-name strong,.account__display-name strong{color:#000}.muted .emojione{opacity:.5}.status__display-name:hover strong,.reply-indicator__display-name:hover strong,.detailed-status__display-name:hover strong,a.account__display-name:hover strong{text-decoration:underline}.account__display-name strong{display:block;overflow:hidden;text-overflow:ellipsis}.detailed-status__application,.detailed-status__datetime{color:inherit}.detailed-status .button.logo-button{margin-bottom:15px}.detailed-status__display-name{color:#282c37;display:block;line-height:24px;margin-bottom:15px;overflow:hidden}.detailed-status__display-name strong,.detailed-status__display-name span{display:block;text-overflow:ellipsis;overflow:hidden}.detailed-status__display-name strong{font-size:16px;color:#000}.detailed-status__display-avatar{float:left;margin-right:10px}.status__avatar{height:48px;left:10px;position:absolute;top:10px;width:48px}.status__expand{width:68px;position:absolute;left:0;top:0;height:100%;cursor:pointer}.muted .status__content,.muted .status__content p,.muted .status__content a{color:#444b5d}.muted .status__display-name strong{color:#444b5d}.muted .status__avatar{opacity:.5}.muted a.status__content__spoiler-link{background:#b0c0cf;color:#000}.muted a.status__content__spoiler-link:hover{background:#9aaec2;text-decoration:none}.notification__message{margin:0 10px 0 68px;padding:8px 0 0;cursor:default;color:#282c37;font-size:15px;line-height:22px;position:relative}.notification__message .fa{color:#2b90d9}.notification__message>span{display:inline;overflow:hidden;text-overflow:ellipsis}.notification__favourite-icon-wrapper{left:-26px;position:absolute}.notification__favourite-icon-wrapper .star-icon{color:#ca8f04}.star-icon.active{color:#ca8f04}.bookmark-icon.active{color:#ff5050}.no-reduce-motion .icon-button.star-icon.activate>.fa-star{animation:spring-rotate-in 1s linear}.no-reduce-motion .icon-button.star-icon.deactivate>.fa-star{animation:spring-rotate-out 1s linear}.notification__display-name{color:inherit;font-weight:500;text-decoration:none}.notification__display-name:hover{color:#000;text-decoration:underline}.notification__relative_time{float:right}.display-name{display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.display-name__html{font-weight:500}.display-name__account{font-size:14px}.status__relative-time:hover,.detailed-status__datetime:hover{text-decoration:underline}.image-loader{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center;flex-direction:column}.image-loader .image-loader__preview-canvas{max-width:100%;max-height:80%;background:url(\"~images/void.png\") repeat;object-fit:contain}.image-loader .loading-bar{position:relative}.image-loader.image-loader--amorphous .image-loader__preview-canvas{display:none}.zoomable-image{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center}.zoomable-image img{max-width:100%;max-height:80%;width:auto;height:auto;object-fit:contain}.navigation-bar{padding:10px;display:flex;align-items:center;flex-shrink:0;cursor:default;color:#282c37}.navigation-bar strong{color:#282c37}.navigation-bar a{color:inherit}.navigation-bar .permalink{text-decoration:none}.navigation-bar .navigation-bar__actions{position:relative}.navigation-bar .navigation-bar__actions .icon-button.close{position:absolute;pointer-events:none;transform:scale(0, 1) translate(-100%, 0);opacity:0}.navigation-bar .navigation-bar__actions .compose__action-bar .icon-button{pointer-events:auto;transform:scale(1, 1) translate(0, 0);opacity:1}.navigation-bar__profile{flex:1 1 auto;margin-left:8px;line-height:20px;margin-top:-1px;overflow:hidden}.navigation-bar__profile-account{display:block;font-weight:500;overflow:hidden;text-overflow:ellipsis}.navigation-bar__profile-edit{color:inherit;text-decoration:none}.dropdown{display:inline-block}.dropdown__content{display:none;position:absolute}.dropdown-menu__separator{border-bottom:1px solid #393f4f;margin:5px 7px 6px;height:0}.dropdown-menu{background:#282c37;padding:4px 0;border-radius:4px;box-shadow:2px 4px 15px rgba(0,0,0,.4);z-index:9999}.dropdown-menu ul{list-style:none}.dropdown-menu.left{transform-origin:100% 50%}.dropdown-menu.top{transform-origin:50% 100%}.dropdown-menu.bottom{transform-origin:50% 0}.dropdown-menu.right{transform-origin:0 50%}.dropdown-menu__arrow{position:absolute;width:0;height:0;border:0 solid transparent}.dropdown-menu__arrow.left{right:-5px;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#282c37}.dropdown-menu__arrow.top{bottom:-5px;margin-left:-7px;border-width:5px 7px 0;border-top-color:#282c37}.dropdown-menu__arrow.bottom{top:-5px;margin-left:-7px;border-width:0 7px 5px;border-bottom-color:#282c37}.dropdown-menu__arrow.right{left:-5px;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#282c37}.dropdown-menu__item a{font-size:13px;line-height:18px;display:block;padding:4px 14px;box-sizing:border-box;text-decoration:none;background:#282c37;color:#000;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown-menu__item a:focus,.dropdown-menu__item a:hover,.dropdown-menu__item a:active{background:#2b90d9;color:#282c37;outline:0}.dropdown--active .dropdown__content{display:block;line-height:18px;max-width:311px;right:0;text-align:left;z-index:9999}.dropdown--active .dropdown__content>ul{list-style:none;background:#282c37;padding:4px 0;border-radius:4px;box-shadow:0 0 15px rgba(0,0,0,.4);min-width:140px;position:relative}.dropdown--active .dropdown__content.dropdown__right{right:0}.dropdown--active .dropdown__content.dropdown__left>ul{left:-98px}.dropdown--active .dropdown__content>ul>li>a{font-size:13px;line-height:18px;display:block;padding:4px 14px;box-sizing:border-box;text-decoration:none;background:#282c37;color:#000;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown--active .dropdown__content>ul>li>a:focus{outline:0}.dropdown--active .dropdown__content>ul>li>a:hover{background:#2b90d9;color:#282c37}.dropdown__icon{vertical-align:middle}.columns-area{display:flex;flex:1 1 auto;flex-direction:row;justify-content:flex-start;overflow-x:auto;position:relative}.columns-area.unscrollable{overflow-x:hidden}.columns-area__panels{display:flex;justify-content:center;width:100%;height:100%;min-height:100vh}.columns-area__panels__pane{height:100%;overflow:hidden;pointer-events:none;display:flex;justify-content:flex-end;min-width:285px}.columns-area__panels__pane--start{justify-content:flex-start}.columns-area__panels__pane__inner{position:fixed;width:285px;pointer-events:auto;height:100%}.columns-area__panels__main{box-sizing:border-box;width:100%;max-width:600px;flex:0 0 auto;display:flex;flex-direction:column}@media screen and (min-width: 415px){.columns-area__panels__main{padding:0 10px}}.tabs-bar__wrapper{background:#f2f5f7;position:sticky;top:0;z-index:2;padding-top:0}@media screen and (min-width: 415px){.tabs-bar__wrapper{padding-top:10px}}.tabs-bar__wrapper .tabs-bar{margin-bottom:0}@media screen and (min-width: 415px){.tabs-bar__wrapper .tabs-bar{margin-bottom:10px}}.react-swipeable-view-container,.react-swipeable-view-container .columns-area,.react-swipeable-view-container .drawer,.react-swipeable-view-container .column{height:100%}.react-swipeable-view-container>*{display:flex;align-items:center;justify-content:center;height:100%}.column{width:350px;position:relative;box-sizing:border-box;display:flex;flex-direction:column}.column>.scrollable{background:#d9e1e8;border-bottom-left-radius:2px;border-bottom-right-radius:2px}.ui{flex:0 0 auto;display:flex;flex-direction:column;width:100%;height:100%}.drawer{width:330px;box-sizing:border-box;display:flex;flex-direction:column;overflow-y:hidden}.drawer__tab{display:block;flex:1 1 auto;padding:15px 5px 13px;color:#282c37;text-decoration:none;text-align:center;font-size:16px;border-bottom:2px solid transparent}.column,.drawer{flex:1 1 auto;overflow:hidden}@media screen and (min-width: 631px){.columns-area{padding:0}.column,.drawer{flex:0 0 auto;padding:10px;padding-left:5px;padding-right:5px}.column:first-child,.drawer:first-child{padding-left:10px}.column:last-child,.drawer:last-child{padding-right:10px}.columns-area>div .column,.columns-area>div .drawer{padding-left:5px;padding-right:5px}}.tabs-bar{box-sizing:border-box;display:flex;background:#c0cdd9;flex:0 0 auto;overflow-y:auto}.tabs-bar__link{display:block;flex:1 1 auto;padding:15px 10px;padding-bottom:13px;color:#000;text-decoration:none;text-align:center;font-size:14px;font-weight:500;border-bottom:2px solid #c0cdd9;transition:all 50ms linear;transition-property:border-bottom,background,color}.tabs-bar__link .fa{font-weight:400;font-size:16px}@media screen and (min-width: 631px){.tabs-bar__link:hover,.tabs-bar__link:focus,.tabs-bar__link:active{background:#adbecd;border-bottom-color:#adbecd}}.tabs-bar__link.active{border-bottom:2px solid #2b90d9;color:#2b90d9}.tabs-bar__link span{margin-left:5px;display:none}@media screen and (min-width: 600px){.tabs-bar__link span{display:inline}}.columns-area--mobile{flex-direction:column;width:100%;height:100%;margin:0 auto}.columns-area--mobile .column,.columns-area--mobile .drawer{width:100%;height:100%;padding:0}.columns-area--mobile .directory__list{display:grid;grid-gap:10px;grid-template-columns:minmax(0, 50%) minmax(0, 50%)}@media screen and (max-width: 415px){.columns-area--mobile .directory__list{display:block}}.columns-area--mobile .directory__card{margin-bottom:0}.columns-area--mobile .filter-form{display:flex}.columns-area--mobile .autosuggest-textarea__textarea{font-size:16px}.columns-area--mobile .search__input{line-height:18px;font-size:16px;padding:15px;padding-right:30px}.columns-area--mobile .search__icon .fa{top:15px}.columns-area--mobile .scrollable{overflow:visible}@supports(display: grid){.columns-area--mobile .scrollable{contain:content}}@media screen and (min-width: 415px){.columns-area--mobile{padding:10px 0;padding-top:0}}@media screen and (min-width: 630px){.columns-area--mobile .detailed-status{padding:15px}.columns-area--mobile .detailed-status .media-gallery,.columns-area--mobile .detailed-status .video-player,.columns-area--mobile .detailed-status .audio-player{margin-top:15px}.columns-area--mobile .account__header__bar{padding:5px 10px}.columns-area--mobile .navigation-bar,.columns-area--mobile .compose-form{padding:15px}.columns-area--mobile .compose-form .compose-form__publish .compose-form__publish-button-wrapper{padding-top:15px}.columns-area--mobile .status{padding:15px 15px 15px 78px;min-height:50px}.columns-area--mobile .status__avatar{left:15px;top:17px}.columns-area--mobile .status__content{padding-top:5px}.columns-area--mobile .status__prepend{margin-left:78px;padding-top:15px}.columns-area--mobile .status__prepend-icon-wrapper{left:-32px}.columns-area--mobile .status .media-gallery,.columns-area--mobile .status__action-bar,.columns-area--mobile .status .video-player,.columns-area--mobile .status .audio-player{margin-top:10px}.columns-area--mobile .account{padding:15px 10px}.columns-area--mobile .account__header__bio{margin:0 -10px}.columns-area--mobile .notification__message{margin-left:78px;padding-top:15px}.columns-area--mobile .notification__favourite-icon-wrapper{left:-32px}.columns-area--mobile .notification .status{padding-top:8px}.columns-area--mobile .notification .account{padding-top:8px}.columns-area--mobile .notification .account__avatar-wrapper{margin-left:17px;margin-right:15px}}.floating-action-button{position:fixed;display:flex;justify-content:center;align-items:center;width:3.9375rem;height:3.9375rem;bottom:1.3125rem;right:1.3125rem;background:#3897db;color:#fff;border-radius:50%;font-size:21px;line-height:21px;text-decoration:none;box-shadow:2px 3px 9px rgba(0,0,0,.4)}.floating-action-button:hover,.floating-action-button:focus,.floating-action-button:active{background:#227dbe}@media screen and (min-width: 415px){.tabs-bar{width:100%}.react-swipeable-view-container .columns-area--mobile{height:calc(100% - 10px) !important}.getting-started__wrapper,.getting-started__trends,.search{margin-bottom:10px}.getting-started__panel{margin:10px 0}.column,.drawer{min-width:330px}}@media screen and (max-width: 895px){.columns-area__panels__pane--compositional{display:none}}@media screen and (min-width: 895px){.floating-action-button,.tabs-bar__link.optional{display:none}.search-page .search{display:none}}@media screen and (max-width: 1190px){.columns-area__panels__pane--navigational{display:none}}@media screen and (min-width: 1190px){.tabs-bar{display:none}}.icon-with-badge{position:relative}.icon-with-badge__badge{position:absolute;left:9px;top:-13px;background:#2b90d9;border:2px solid #c0cdd9;padding:1px 6px;border-radius:6px;font-size:10px;font-weight:500;line-height:14px;color:#000}.column-link--transparent .icon-with-badge__badge{border-color:#f2f5f7}.compose-panel{width:285px;margin-top:10px;display:flex;flex-direction:column;height:calc(100% - 10px);overflow-y:hidden}.compose-panel .navigation-bar{padding-top:20px;padding-bottom:20px;flex:0 1 48px;min-height:20px}.compose-panel .flex-spacer{background:transparent}.compose-panel .compose-form{flex:1;overflow-y:hidden;display:flex;flex-direction:column;min-height:310px;padding-bottom:71px;margin-bottom:-71px}.compose-panel .compose-form__autosuggest-wrapper{overflow-y:auto;background-color:#fff;border-radius:4px 4px 0 0;flex:0 1 auto}.compose-panel .autosuggest-textarea__textarea{overflow-y:hidden}.compose-panel .compose-form__upload-thumbnail{height:80px}.navigation-panel{margin-top:10px;margin-bottom:10px;height:calc(100% - 20px);overflow-y:auto;display:flex;flex-direction:column}.navigation-panel>a{flex:0 0 auto}.navigation-panel hr{flex:0 0 auto;border:0;background:transparent;border-top:1px solid #ccd7e0;margin:10px 0}.navigation-panel .flex-spacer{background:transparent}.drawer__pager{box-sizing:border-box;padding:0;flex-grow:1;position:relative;overflow:hidden;display:flex}.drawer__inner{position:absolute;top:0;left:0;background:#b0c0cf;box-sizing:border-box;padding:0;display:flex;flex-direction:column;overflow:hidden;overflow-y:auto;width:100%;height:100%;border-radius:2px}.drawer__inner.darker{background:#d9e1e8}.drawer__inner__mastodon{background:#b0c0cf url('data:image/svg+xml;utf8,') no-repeat bottom/100% auto;flex:1;min-height:47px;display:none}.drawer__inner__mastodon>img{display:block;object-fit:contain;object-position:bottom left;width:100%;height:100%;pointer-events:none;user-drag:none;user-select:none}@media screen and (min-height: 640px){.drawer__inner__mastodon{display:block}}.pseudo-drawer{background:#b0c0cf;font-size:13px;text-align:left}.drawer__header{flex:0 0 auto;font-size:16px;background:#c0cdd9;margin-bottom:10px;display:flex;flex-direction:row;border-radius:2px}.drawer__header a{transition:background 100ms ease-in}.drawer__header a:hover{background:#cfd9e2;transition:background 200ms ease-out}.scrollable{overflow-y:scroll;overflow-x:hidden;flex:1 1 auto;-webkit-overflow-scrolling:touch}.scrollable.optionally-scrollable{overflow-y:auto}@supports(display: grid){.scrollable{contain:strict}}.scrollable--flex{display:flex;flex-direction:column}.scrollable__append{flex:1 1 auto;position:relative;min-height:120px}@supports(display: grid){.scrollable.fullscreen{contain:none}}.column-back-button{box-sizing:border-box;width:100%;background:#ccd7e0;color:#2b90d9;cursor:pointer;flex:0 0 auto;font-size:16px;line-height:inherit;border:0;text-align:unset;padding:15px;margin:0;z-index:3;outline:0}.column-back-button:hover{text-decoration:underline}.column-header__back-button{background:#ccd7e0;border:0;font-family:inherit;color:#2b90d9;cursor:pointer;white-space:nowrap;font-size:16px;padding:0 5px 0 0;z-index:3}.column-header__back-button:hover{text-decoration:underline}.column-header__back-button:last-child{padding:0 15px 0 0}.column-back-button__icon{display:inline-block;margin-right:5px}.column-back-button--slim{position:relative}.column-back-button--slim-button{cursor:pointer;flex:0 0 auto;font-size:16px;padding:15px;position:absolute;right:0;top:-48px}.react-toggle{display:inline-block;position:relative;cursor:pointer;background-color:transparent;border:0;padding:0;user-select:none;-webkit-tap-highlight-color:rgba(255,255,255,0);-webkit-tap-highlight-color:transparent}.react-toggle-screenreader-only{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.react-toggle--disabled{cursor:not-allowed;opacity:.5;transition:opacity .25s}.react-toggle-track{width:50px;height:24px;padding:0;border-radius:30px;background-color:#d9e1e8;transition:background-color .2s ease}.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track{background-color:#f9fafb}.react-toggle--checked .react-toggle-track{background-color:#2b90d9}.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track{background-color:#2074b1}.react-toggle-track-check{position:absolute;width:14px;height:10px;top:0;bottom:0;margin-top:auto;margin-bottom:auto;line-height:0;left:8px;opacity:0;transition:opacity .25s ease}.react-toggle--checked .react-toggle-track-check{opacity:1;transition:opacity .25s ease}.react-toggle-track-x{position:absolute;width:10px;height:10px;top:0;bottom:0;margin-top:auto;margin-bottom:auto;line-height:0;right:10px;opacity:1;transition:opacity .25s ease}.react-toggle--checked .react-toggle-track-x{opacity:0}.react-toggle-thumb{position:absolute;top:1px;left:1px;width:22px;height:22px;border:1px solid #d9e1e8;border-radius:50%;background-color:#fff;box-sizing:border-box;transition:all .25s ease;transition-property:border-color,left}.react-toggle--checked .react-toggle-thumb{left:27px;border-color:#2b90d9}.column-link{background:#c0cdd9;color:#000;display:block;font-size:16px;padding:15px;text-decoration:none}.column-link:hover,.column-link:focus,.column-link:active{background:#b6c5d3}.column-link:focus{outline:0}.column-link--transparent{background:transparent;color:#282c37}.column-link--transparent:hover,.column-link--transparent:focus,.column-link--transparent:active{background:transparent;color:#000}.column-link--transparent.active{color:#2b90d9}.column-link__icon{display:inline-block;margin-right:5px}.column-link__badge{display:inline-block;border-radius:4px;font-size:12px;line-height:19px;font-weight:500;background:#d9e1e8;padding:4px 8px;margin:-6px 10px}.column-subheading{background:#d9e1e8;color:#444b5d;padding:8px 20px;font-size:13px;font-weight:500;cursor:default}.getting-started__wrapper,.getting-started,.flex-spacer{background:#d9e1e8}.flex-spacer{flex:1 1 auto}.getting-started{color:#444b5d;overflow:auto;border-bottom-left-radius:2px;border-bottom-right-radius:2px}.getting-started__wrapper,.getting-started__panel,.getting-started__footer{height:min-content}.getting-started__panel,.getting-started__footer{padding:10px;padding-top:20px;flex-grow:0}.getting-started__panel ul,.getting-started__footer ul{margin-bottom:10px}.getting-started__panel ul li,.getting-started__footer ul li{display:inline}.getting-started__panel p,.getting-started__footer p{font-size:13px}.getting-started__panel p a,.getting-started__footer p a{color:#444b5d;text-decoration:underline}.getting-started__panel a,.getting-started__footer a{text-decoration:none;color:#282c37}.getting-started__panel a:hover,.getting-started__panel a:focus,.getting-started__panel a:active,.getting-started__footer a:hover,.getting-started__footer a:focus,.getting-started__footer a:active{text-decoration:underline}.getting-started__wrapper,.getting-started__footer{color:#444b5d}.getting-started__trends{flex:0 1 auto;opacity:1;animation:fade 150ms linear;margin-top:10px}.getting-started__trends h4{font-size:13px;color:#282c37;padding:10px;font-weight:500;border-bottom:1px solid #c0cdd9}@media screen and (max-height: 810px){.getting-started__trends .trends__item:nth-child(3){display:none}}@media screen and (max-height: 720px){.getting-started__trends .trends__item:nth-child(2){display:none}}@media screen and (max-height: 670px){.getting-started__trends{display:none}}.getting-started__trends .trends__item{border-bottom:0;padding:10px}.getting-started__trends .trends__item__current{color:#282c37}.keyboard-shortcuts{padding:8px 0 0;overflow:hidden}.keyboard-shortcuts thead{position:absolute;left:-9999px}.keyboard-shortcuts td{padding:0 10px 8px}.keyboard-shortcuts kbd{display:inline-block;padding:3px 5px;background-color:#c0cdd9;border:1px solid #e6ebf0}.setting-text{display:block;box-sizing:border-box;width:100%;margin:0;color:#000;background:#fff;padding:10px;font-family:inherit;font-size:14px;resize:vertical;border:0;outline:0;border-radius:4px}.setting-text:focus{outline:0}@media screen and (max-width: 600px){.setting-text{font-size:16px}}.no-reduce-motion button.icon-button i.fa-retweet{background-position:0 0;height:19px;transition:background-position .9s steps(10);transition-duration:0s;vertical-align:middle;width:22px}.no-reduce-motion button.icon-button i.fa-retweet::before{display:none !important}.no-reduce-motion button.icon-button.active i.fa-retweet{transition-duration:.9s;background-position:0 100%}.reduce-motion button.icon-button i.fa-retweet{color:#606984;transition:color 100ms ease-in}.reduce-motion button.icon-button.active i.fa-retweet{color:#2b90d9}.status-card{display:flex;font-size:14px;border:1px solid #c0cdd9;border-radius:4px;color:#444b5d;margin-top:14px;text-decoration:none;overflow:hidden}.status-card__actions{bottom:0;left:0;position:absolute;right:0;top:0;display:flex;justify-content:center;align-items:center}.status-card__actions>div{background:rgba(0,0,0,.6);border-radius:8px;padding:12px 9px;flex:0 0 auto;display:flex;justify-content:center;align-items:center}.status-card__actions button,.status-card__actions a{display:inline;color:#282c37;background:transparent;border:0;padding:0 8px;text-decoration:none;font-size:18px;line-height:18px}.status-card__actions button:hover,.status-card__actions button:active,.status-card__actions button:focus,.status-card__actions a:hover,.status-card__actions a:active,.status-card__actions a:focus{color:#000}.status-card__actions a{font-size:19px;position:relative;bottom:-1px}a.status-card{cursor:pointer}a.status-card:hover{background:#c0cdd9}.status-card-photo{cursor:zoom-in;display:block;text-decoration:none;width:100%;height:auto;margin:0}.status-card-video iframe{width:100%;height:100%}.status-card__title{display:block;font-weight:500;margin-bottom:5px;color:#282c37;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-decoration:none}.status-card__content{flex:1 1 auto;overflow:hidden;padding:14px 14px 14px 8px}.status-card__description{color:#282c37}.status-card__host{display:block;margin-top:5px;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-card__image{flex:0 0 100px;background:#c0cdd9;position:relative}.status-card__image>.fa{font-size:21px;position:absolute;transform-origin:50% 50%;top:50%;left:50%;transform:translate(-50%, -50%)}.status-card.horizontal{display:block}.status-card.horizontal .status-card__image{width:100%}.status-card.horizontal .status-card__image-image{border-radius:4px 4px 0 0}.status-card.horizontal .status-card__title{white-space:inherit}.status-card.compact{border-color:#ccd7e0}.status-card.compact.interactive{border:0}.status-card.compact .status-card__content{padding:8px;padding-top:10px}.status-card.compact .status-card__title{white-space:nowrap}.status-card.compact .status-card__image{flex:0 0 60px}a.status-card.compact:hover{background-color:#ccd7e0}.status-card__image-image{border-radius:4px 0 0 4px;display:block;margin:0;width:100%;height:100%;object-fit:cover;background-size:cover;background-position:center center}.load-more{display:block;color:#444b5d;background-color:transparent;border:0;font-size:inherit;text-align:center;line-height:inherit;margin:0;padding:15px;box-sizing:border-box;width:100%;clear:both;text-decoration:none}.load-more:hover{background:#d3dce4}.load-gap{border-bottom:1px solid #c0cdd9}.regeneration-indicator{text-align:center;font-size:16px;font-weight:500;color:#444b5d;background:#d9e1e8;cursor:default;display:flex;flex:1 1 auto;flex-direction:column;align-items:center;justify-content:center;padding:20px}.regeneration-indicator__figure,.regeneration-indicator__figure img{display:block;width:auto;height:160px;margin:0}.regeneration-indicator--without-header{padding-top:68px}.regeneration-indicator__label{margin-top:30px}.regeneration-indicator__label strong{display:block;margin-bottom:10px;color:#444b5d}.regeneration-indicator__label span{font-size:15px;font-weight:400}.column-header__wrapper{position:relative;flex:0 0 auto}.column-header__wrapper.active::before{display:block;content:\"\";position:absolute;top:35px;left:0;right:0;margin:0 auto;width:60%;pointer-events:none;height:28px;z-index:1;background:radial-gradient(ellipse, rgba(43, 144, 217, 0.23) 0%, rgba(43, 144, 217, 0) 60%)}.column-header{display:flex;font-size:16px;background:#ccd7e0;flex:0 0 auto;cursor:pointer;position:relative;z-index:2;outline:0;overflow:hidden;border-top-left-radius:2px;border-top-right-radius:2px}.column-header>button{margin:0;border:0;padding:15px 0 15px 15px;color:inherit;background:transparent;font:inherit;text-align:left;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;flex:1}.column-header>.column-header__back-button{color:#2b90d9}.column-header.active{box-shadow:0 1px 0 rgba(43,144,217,.3)}.column-header.active .column-header__icon{color:#2b90d9;text-shadow:0 0 10px rgba(43,144,217,.4)}.column-header:focus,.column-header:active{outline:0}.column-header__buttons{height:48px;display:flex}.column-header__links{margin-bottom:14px}.column-header__links .text-btn{margin-right:10px}.column-header__button{background:#ccd7e0;border:0;color:#282c37;cursor:pointer;font-size:16px;padding:0 15px}.column-header__button:hover{color:#191b22}.column-header__button.active{color:#000;background:#c0cdd9}.column-header__button.active:hover{color:#000;background:#c0cdd9}.column-header__collapsible{max-height:70vh;overflow:hidden;overflow-y:auto;color:#282c37;transition:max-height 150ms ease-in-out,opacity 300ms linear;opacity:1}.column-header__collapsible.collapsed{max-height:0;opacity:.5}.column-header__collapsible.animating{overflow-y:hidden}.column-header__collapsible hr{height:0;background:transparent;border:0;border-top:1px solid #b3c3d1;margin:10px 0}.column-header__collapsible-inner{background:#c0cdd9;padding:15px}.column-header__setting-btn:hover{color:#282c37;text-decoration:underline}.column-header__setting-arrows{float:right}.column-header__setting-arrows .column-header__setting-btn{padding:0 10px}.column-header__setting-arrows .column-header__setting-btn:last-child{padding-right:0}.text-btn{display:inline-block;padding:0;font-family:inherit;font-size:inherit;color:inherit;border:0;background:transparent;cursor:pointer}.column-header__icon{display:inline-block;margin-right:5px}.loading-indicator{color:#444b5d;font-size:13px;font-weight:400;overflow:visible;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.loading-indicator span{display:block;float:left;margin-left:50%;transform:translateX(-50%);margin:82px 0 0 50%;white-space:nowrap}.loading-indicator__figure{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);width:42px;height:42px;box-sizing:border-box;background-color:transparent;border:0 solid #86a0b6;border-width:6px;border-radius:50%}.no-reduce-motion .loading-indicator span{animation:loader-label 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1)}.no-reduce-motion .loading-indicator__figure{animation:loader-figure 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1)}@keyframes spring-rotate-in{0%{transform:rotate(0deg)}30%{transform:rotate(-484.8deg)}60%{transform:rotate(-316.7deg)}90%{transform:rotate(-375deg)}100%{transform:rotate(-360deg)}}@keyframes spring-rotate-out{0%{transform:rotate(-360deg)}30%{transform:rotate(124.8deg)}60%{transform:rotate(-43.27deg)}90%{transform:rotate(15deg)}100%{transform:rotate(0deg)}}@keyframes loader-figure{0%{width:0;height:0;background-color:#86a0b6}29%{background-color:#86a0b6}30%{width:42px;height:42px;background-color:transparent;border-width:21px;opacity:1}100%{width:42px;height:42px;border-width:0;opacity:0;background-color:transparent}}@keyframes loader-label{0%{opacity:.25}30%{opacity:1}100%{opacity:.25}}.video-error-cover{align-items:center;background:#fff;color:#000;cursor:pointer;display:flex;flex-direction:column;height:100%;justify-content:center;margin-top:8px;position:relative;text-align:center;z-index:100}.media-spoiler{background:#fff;color:#282c37;border:0;padding:0;width:100%;height:100%;border-radius:4px;appearance:none}.media-spoiler:hover,.media-spoiler:active,.media-spoiler:focus{padding:0;color:#17191f}.media-spoiler__warning{display:block;font-size:14px}.media-spoiler__trigger{display:block;font-size:11px;font-weight:700}.spoiler-button{top:0;left:0;width:100%;height:100%;position:absolute;z-index:100}.spoiler-button--minified{display:block;left:4px;top:4px;width:auto;height:auto}.spoiler-button--click-thru{pointer-events:none}.spoiler-button--hidden{display:none}.spoiler-button__overlay{display:block;background:transparent;width:100%;height:100%;border:0}.spoiler-button__overlay__label{display:inline-block;background:rgba(255,255,255,.5);border-radius:8px;padding:8px 12px;color:#000;font-weight:500;font-size:14px}.spoiler-button__overlay:hover .spoiler-button__overlay__label,.spoiler-button__overlay:focus .spoiler-button__overlay__label,.spoiler-button__overlay:active .spoiler-button__overlay__label{background:rgba(255,255,255,.8)}.spoiler-button__overlay:disabled .spoiler-button__overlay__label{background:rgba(255,255,255,.5)}.modal-container--preloader{background:#c0cdd9}.account--panel{background:#ccd7e0;border-top:1px solid #c0cdd9;border-bottom:1px solid #c0cdd9;display:flex;flex-direction:row;padding:10px 0}.account--panel__button,.detailed-status__button{flex:1 1 auto;text-align:center}.column-settings__outer{background:#c0cdd9;padding:15px}.column-settings__section{color:#282c37;cursor:default;display:block;font-weight:500;margin-bottom:10px}.column-settings__hashtags .column-settings__row{margin-bottom:15px}.column-settings__hashtags .column-select__control{outline:0;box-sizing:border-box;width:100%;border:0;box-shadow:none;font-family:inherit;background:#d9e1e8;color:#282c37;font-size:14px;margin:0}.column-settings__hashtags .column-select__control::placeholder{color:#1f232b}.column-settings__hashtags .column-select__control::-moz-focus-inner{border:0}.column-settings__hashtags .column-select__control::-moz-focus-inner,.column-settings__hashtags .column-select__control:focus,.column-settings__hashtags .column-select__control:active{outline:0 !important}.column-settings__hashtags .column-select__control:focus{background:#ccd7e0}@media screen and (max-width: 600px){.column-settings__hashtags .column-select__control{font-size:16px}}.column-settings__hashtags .column-select__placeholder{color:#444b5d;padding-left:2px;font-size:12px}.column-settings__hashtags .column-select__value-container{padding-left:6px}.column-settings__hashtags .column-select__multi-value{background:#c0cdd9}.column-settings__hashtags .column-select__multi-value__remove{cursor:pointer}.column-settings__hashtags .column-select__multi-value__remove:hover,.column-settings__hashtags .column-select__multi-value__remove:active,.column-settings__hashtags .column-select__multi-value__remove:focus{background:#b3c3d1;color:#1f232b}.column-settings__hashtags .column-select__multi-value__label,.column-settings__hashtags .column-select__input{color:#282c37}.column-settings__hashtags .column-select__clear-indicator,.column-settings__hashtags .column-select__dropdown-indicator{cursor:pointer;transition:none;color:#444b5d}.column-settings__hashtags .column-select__clear-indicator:hover,.column-settings__hashtags .column-select__clear-indicator:active,.column-settings__hashtags .column-select__clear-indicator:focus,.column-settings__hashtags .column-select__dropdown-indicator:hover,.column-settings__hashtags .column-select__dropdown-indicator:active,.column-settings__hashtags .column-select__dropdown-indicator:focus{color:#3b4151}.column-settings__hashtags .column-select__indicator-separator{background-color:#c0cdd9}.column-settings__hashtags .column-select__menu{background:#fff;border-radius:4px;padding:10px 14px;padding-bottom:14px;margin-top:10px;color:#444b5d;box-shadow:2px 4px 15px rgba(0,0,0,.4);padding:0;background:#282c37}.column-settings__hashtags .column-select__menu h4{color:#444b5d;font-size:14px;font-weight:500;margin-bottom:10px}.column-settings__hashtags .column-select__menu li{padding:4px 0}.column-settings__hashtags .column-select__menu ul{margin-bottom:10px}.column-settings__hashtags .column-select__menu em{font-weight:500;color:#000}.column-settings__hashtags .column-select__menu-list{padding:6px}.column-settings__hashtags .column-select__option{color:#000;border-radius:4px;font-size:14px}.column-settings__hashtags .column-select__option--is-focused,.column-settings__hashtags .column-select__option--is-selected{background:#3d4455}.column-settings__row .text-btn{margin-bottom:15px}.relationship-tag{color:#000;margin-bottom:4px;display:block;vertical-align:top;background-color:#fff;font-size:12px;font-weight:500;padding:4px;border-radius:4px;opacity:.7}.relationship-tag:hover{opacity:1}.setting-toggle{display:block;line-height:24px}.setting-toggle__label{color:#282c37;display:inline-block;margin-bottom:14px;margin-left:8px;vertical-align:middle}.empty-column-indicator,.error-column{color:#444b5d;background:#d9e1e8;text-align:center;padding:20px;font-size:15px;font-weight:400;cursor:default;display:flex;flex:1 1 auto;align-items:center;justify-content:center}@supports(display: grid){.empty-column-indicator,.error-column{contain:strict}}.empty-column-indicator>span,.error-column>span{max-width:400px}.empty-column-indicator a,.error-column a{color:#2b90d9;text-decoration:none}.empty-column-indicator a:hover,.error-column a:hover{text-decoration:underline}.error-column{flex-direction:column}@keyframes heartbeat{from{transform:scale(1);animation-timing-function:ease-out}10%{transform:scale(0.91);animation-timing-function:ease-in}17%{transform:scale(0.98);animation-timing-function:ease-out}33%{transform:scale(0.87);animation-timing-function:ease-in}45%{transform:scale(1);animation-timing-function:ease-out}}.no-reduce-motion .pulse-loading{transform-origin:center center;animation:heartbeat 1.5s ease-in-out infinite both}@keyframes shake-bottom{0%,100%{transform:rotate(0deg);transform-origin:50% 100%}10%{transform:rotate(2deg)}20%,40%,60%{transform:rotate(-4deg)}30%,50%,70%{transform:rotate(4deg)}80%{transform:rotate(-2deg)}90%{transform:rotate(2deg)}}.no-reduce-motion .shake-bottom{transform-origin:50% 100%;animation:shake-bottom .8s cubic-bezier(0.455, 0.03, 0.515, 0.955) 2s 2 both}.emoji-picker-dropdown__menu{background:#fff;position:absolute;box-shadow:4px 4px 6px rgba(0,0,0,.4);border-radius:4px;margin-top:5px;z-index:2}.emoji-picker-dropdown__menu .emoji-mart-scroll{transition:opacity 200ms ease}.emoji-picker-dropdown__menu.selecting .emoji-mart-scroll{opacity:.5}.emoji-picker-dropdown__modifiers{position:absolute;top:60px;right:11px;cursor:pointer}.emoji-picker-dropdown__modifiers__menu{position:absolute;z-index:4;top:-4px;left:-8px;background:#fff;border-radius:4px;box-shadow:1px 2px 6px rgba(0,0,0,.2);overflow:hidden}.emoji-picker-dropdown__modifiers__menu button{display:block;cursor:pointer;border:0;padding:4px 8px;background:transparent}.emoji-picker-dropdown__modifiers__menu button:hover,.emoji-picker-dropdown__modifiers__menu button:focus,.emoji-picker-dropdown__modifiers__menu button:active{background:rgba(40,44,55,.4)}.emoji-picker-dropdown__modifiers__menu .emoji-mart-emoji{height:22px}.emoji-mart-emoji span{background-repeat:no-repeat}.upload-area{align-items:center;background:rgba(255,255,255,.8);display:flex;height:100%;justify-content:center;left:0;opacity:0;position:absolute;top:0;visibility:hidden;width:100%;z-index:2000}.upload-area *{pointer-events:none}.upload-area__drop{width:320px;height:160px;display:flex;box-sizing:border-box;position:relative;padding:8px}.upload-area__background{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;border-radius:4px;background:#d9e1e8;box-shadow:0 0 5px rgba(0,0,0,.2)}.upload-area__content{flex:1;display:flex;align-items:center;justify-content:center;color:#282c37;font-size:18px;font-weight:500;border:2px dashed #b0c0cf;border-radius:4px}.upload-progress{padding:10px;color:#282c37;overflow:hidden;display:flex}.upload-progress .fa{font-size:34px;margin-right:10px}.upload-progress span{font-size:13px;font-weight:500;display:block}.upload-progess__message{flex:1 1 auto}.upload-progress__backdrop{width:100%;height:6px;border-radius:6px;background:#b0c0cf;position:relative;margin-top:5px}.upload-progress__tracker{position:absolute;left:0;top:0;height:6px;background:#2b90d9;border-radius:6px}.emoji-button{display:block;font-size:24px;line-height:24px;margin-left:2px;width:24px;outline:0;cursor:pointer}.emoji-button:active,.emoji-button:focus{outline:0 !important}.emoji-button img{filter:grayscale(100%);opacity:.8;display:block;margin:0;width:22px;height:22px;margin-top:2px}.emoji-button:hover img,.emoji-button:active img,.emoji-button:focus img{opacity:1;filter:none}.dropdown--active .emoji-button img{opacity:1;filter:none}.privacy-dropdown__dropdown{position:absolute;background:#fff;box-shadow:2px 4px 15px rgba(0,0,0,.4);border-radius:4px;margin-left:40px;overflow:hidden}.privacy-dropdown__dropdown.top{transform-origin:50% 100%}.privacy-dropdown__dropdown.bottom{transform-origin:50% 0}.privacy-dropdown__option{color:#000;padding:10px;cursor:pointer;display:flex}.privacy-dropdown__option:hover,.privacy-dropdown__option.active{background:#2b90d9;color:#000;outline:0}.privacy-dropdown__option:hover .privacy-dropdown__option__content,.privacy-dropdown__option.active .privacy-dropdown__option__content{color:#000}.privacy-dropdown__option:hover .privacy-dropdown__option__content strong,.privacy-dropdown__option.active .privacy-dropdown__option__content strong{color:#000}.privacy-dropdown__option.active:hover{background:#2485cb}.privacy-dropdown__option__icon{display:flex;align-items:center;justify-content:center;margin-right:10px}.privacy-dropdown__option__content{flex:1 1 auto;color:#282c37}.privacy-dropdown__option__content strong{font-weight:500;display:block;color:#000}.privacy-dropdown__option__content strong:lang(ja){font-weight:700}.privacy-dropdown__option__content strong:lang(ko){font-weight:700}.privacy-dropdown__option__content strong:lang(zh-CN){font-weight:700}.privacy-dropdown__option__content strong:lang(zh-HK){font-weight:700}.privacy-dropdown__option__content strong:lang(zh-TW){font-weight:700}.privacy-dropdown.active .privacy-dropdown__value{background:#fff;border-radius:4px 4px 0 0;box-shadow:0 -4px 4px rgba(0,0,0,.1)}.privacy-dropdown.active .privacy-dropdown__value .icon-button{transition:none}.privacy-dropdown.active .privacy-dropdown__value.active{background:#2b90d9}.privacy-dropdown.active .privacy-dropdown__value.active .icon-button{color:#000}.privacy-dropdown.active.top .privacy-dropdown__value{border-radius:0 0 4px 4px}.privacy-dropdown.active .privacy-dropdown__dropdown{display:block;box-shadow:2px 4px 6px rgba(0,0,0,.1)}.search{position:relative}.search__input{outline:0;box-sizing:border-box;width:100%;border:0;box-shadow:none;font-family:inherit;background:#d9e1e8;color:#282c37;font-size:14px;margin:0;display:block;padding:15px;padding-right:30px;line-height:18px;font-size:16px}.search__input::placeholder{color:#1f232b}.search__input::-moz-focus-inner{border:0}.search__input::-moz-focus-inner,.search__input:focus,.search__input:active{outline:0 !important}.search__input:focus{background:#ccd7e0}@media screen and (max-width: 600px){.search__input{font-size:16px}}.search__icon::-moz-focus-inner{border:0}.search__icon::-moz-focus-inner,.search__icon:focus{outline:0 !important}.search__icon .fa{position:absolute;top:16px;right:10px;z-index:2;display:inline-block;opacity:0;transition:all 100ms linear;transition-property:transform,opacity;font-size:18px;width:18px;height:18px;color:#282c37;cursor:default;pointer-events:none}.search__icon .fa.active{pointer-events:auto;opacity:.3}.search__icon .fa-search{transform:rotate(90deg)}.search__icon .fa-search.active{pointer-events:none;transform:rotate(0deg)}.search__icon .fa-times-circle{top:17px;transform:rotate(0deg);color:#606984;cursor:pointer}.search__icon .fa-times-circle.active{transform:rotate(90deg)}.search__icon .fa-times-circle:hover{color:#51596f}.search-results__header{color:#444b5d;background:#d3dce4;padding:15px;font-weight:500;font-size:16px;cursor:default}.search-results__header .fa{display:inline-block;margin-right:5px}.search-results__section{margin-bottom:5px}.search-results__section h5{background:#e6ebf0;border-bottom:1px solid #c0cdd9;cursor:default;display:flex;padding:15px;font-weight:500;font-size:16px;color:#444b5d}.search-results__section h5 .fa{display:inline-block;margin-right:5px}.search-results__section .account:last-child,.search-results__section>div:last-child .status{border-bottom:0}.search-results__hashtag{display:block;padding:10px;color:#282c37;text-decoration:none}.search-results__hashtag:hover,.search-results__hashtag:active,.search-results__hashtag:focus{color:#1f232b;text-decoration:underline}.search-results__info{padding:20px;color:#282c37;text-align:center}.modal-root{position:relative;transition:opacity .3s linear;will-change:opacity;z-index:9999}.modal-root__overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(255,255,255,.7)}.modal-root__container{position:fixed;top:0;left:0;width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;align-content:space-around;z-index:9999;pointer-events:none;user-select:none}.modal-root__modal{pointer-events:auto;display:flex;z-index:9999}.video-modal__container{max-width:100vw;max-height:100vh}.audio-modal__container{width:50vw}.media-modal{width:100%;height:100%;position:relative}.media-modal .extended-video-player{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.media-modal .extended-video-player video{max-width:100%;max-height:80%}.media-modal__closer{position:absolute;top:0;left:0;right:0;bottom:0}.media-modal__navigation{position:absolute;top:0;left:0;right:0;bottom:0;pointer-events:none;transition:opacity .3s linear;will-change:opacity}.media-modal__navigation *{pointer-events:auto}.media-modal__navigation.media-modal__navigation--hidden{opacity:0}.media-modal__navigation.media-modal__navigation--hidden *{pointer-events:none}.media-modal__nav{background:rgba(255,255,255,.5);box-sizing:border-box;border:0;color:#000;cursor:pointer;display:flex;align-items:center;font-size:24px;height:20vmax;margin:auto 0;padding:30px 15px;position:absolute;top:0;bottom:0}.media-modal__nav--left{left:0}.media-modal__nav--right{right:0}.media-modal__pagination{width:100%;text-align:center;position:absolute;left:0;bottom:20px;pointer-events:none}.media-modal__meta{text-align:center;position:absolute;left:0;bottom:20px;width:100%;pointer-events:none}.media-modal__meta--shifted{bottom:62px}.media-modal__meta a{pointer-events:auto;text-decoration:none;font-weight:500;color:#282c37}.media-modal__meta a:hover,.media-modal__meta a:focus,.media-modal__meta a:active{text-decoration:underline}.media-modal__page-dot{display:inline-block}.media-modal__button{background-color:#000;height:12px;width:12px;border-radius:6px;margin:10px;padding:0;border:0;font-size:0}.media-modal__button--active{background-color:#2b90d9}.media-modal__close{position:absolute;right:8px;top:8px;z-index:100}.onboarding-modal,.error-modal,.embed-modal{background:#282c37;color:#000;border-radius:8px;overflow:hidden;display:flex;flex-direction:column}.error-modal__body{height:80vh;width:80vw;max-width:520px;max-height:420px;position:relative}.error-modal__body>div{position:absolute;top:0;left:0;width:100%;height:100%;box-sizing:border-box;padding:25px;display:none;flex-direction:column;align-items:center;justify-content:center;display:flex;opacity:0;user-select:text}.error-modal__body{display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center}.onboarding-modal__paginator,.error-modal__footer{flex:0 0 auto;background:#393f4f;display:flex;padding:25px}.onboarding-modal__paginator>div,.error-modal__footer>div{min-width:33px}.onboarding-modal__paginator .onboarding-modal__nav,.onboarding-modal__paginator .error-modal__nav,.error-modal__footer .onboarding-modal__nav,.error-modal__footer .error-modal__nav{color:#282c37;border:0;font-size:14px;font-weight:500;padding:10px 25px;line-height:inherit;height:auto;margin:-10px;border-radius:4px;background-color:transparent}.onboarding-modal__paginator .onboarding-modal__nav:hover,.onboarding-modal__paginator .onboarding-modal__nav:focus,.onboarding-modal__paginator .onboarding-modal__nav:active,.onboarding-modal__paginator .error-modal__nav:hover,.onboarding-modal__paginator .error-modal__nav:focus,.onboarding-modal__paginator .error-modal__nav:active,.error-modal__footer .onboarding-modal__nav:hover,.error-modal__footer .onboarding-modal__nav:focus,.error-modal__footer .onboarding-modal__nav:active,.error-modal__footer .error-modal__nav:hover,.error-modal__footer .error-modal__nav:focus,.error-modal__footer .error-modal__nav:active{color:#313543;background-color:#4a5266}.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next,.error-modal__footer .error-modal__nav.onboarding-modal__done,.error-modal__footer .error-modal__nav.onboarding-modal__next{color:#000}.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:hover,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:focus,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:active,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:hover,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:focus,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:active,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:hover,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:focus,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:active,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:hover,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:focus,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:active,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:hover,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:focus,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:active,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:hover,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:focus,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:active,.error-modal__footer .error-modal__nav.onboarding-modal__done:hover,.error-modal__footer .error-modal__nav.onboarding-modal__done:focus,.error-modal__footer .error-modal__nav.onboarding-modal__done:active,.error-modal__footer .error-modal__nav.onboarding-modal__next:hover,.error-modal__footer .error-modal__nav.onboarding-modal__next:focus,.error-modal__footer .error-modal__nav.onboarding-modal__next:active{color:#000}.error-modal__footer{justify-content:center}.display-case{text-align:center;font-size:15px;margin-bottom:15px}.display-case__label{font-weight:500;color:#000;margin-bottom:5px;font-size:13px}.display-case__case{background:#d9e1e8;color:#282c37;font-weight:500;padding:10px;border-radius:4px}.onboard-sliders{display:inline-block;max-width:30px;max-height:auto;margin-left:10px}.boost-modal,.confirmation-modal,.report-modal,.actions-modal,.mute-modal,.block-modal{background:#17191f;color:#000;border-radius:8px;overflow:hidden;max-width:90vw;width:480px;position:relative;flex-direction:column}.boost-modal .status__display-name,.confirmation-modal .status__display-name,.report-modal .status__display-name,.actions-modal .status__display-name,.mute-modal .status__display-name,.block-modal .status__display-name{display:block;max-width:100%;padding-right:25px}.boost-modal .status__avatar,.confirmation-modal .status__avatar,.report-modal .status__avatar,.actions-modal .status__avatar,.mute-modal .status__avatar,.block-modal .status__avatar{height:28px;left:10px;position:absolute;top:10px;width:48px}.boost-modal .status__content__spoiler-link,.confirmation-modal .status__content__spoiler-link,.report-modal .status__content__spoiler-link,.actions-modal .status__content__spoiler-link,.mute-modal .status__content__spoiler-link,.block-modal .status__content__spoiler-link{color:#17191f}.actions-modal .status{background:#fff;border-bottom-color:#282c37;padding-top:10px;padding-bottom:10px}.actions-modal .dropdown-menu__separator{border-bottom-color:#282c37}.boost-modal__container{overflow-x:scroll;padding:10px}.boost-modal__container .status{user-select:text;border-bottom:0}.boost-modal__action-bar,.confirmation-modal__action-bar,.mute-modal__action-bar,.block-modal__action-bar{display:flex;justify-content:space-between;background:#282c37;padding:10px;line-height:36px}.boost-modal__action-bar>div,.confirmation-modal__action-bar>div,.mute-modal__action-bar>div,.block-modal__action-bar>div{flex:1 1 auto;text-align:right;color:#282c37;padding-right:10px}.boost-modal__action-bar .button,.confirmation-modal__action-bar .button,.mute-modal__action-bar .button,.block-modal__action-bar .button{flex:0 0 auto}.boost-modal__status-header{font-size:15px}.boost-modal__status-time{float:right;font-size:14px}.mute-modal,.block-modal{line-height:24px}.mute-modal .react-toggle,.block-modal .react-toggle{vertical-align:middle}.report-modal{width:90vw;max-width:700px}.report-modal__container{display:flex;border-top:1px solid #282c37}@media screen and (max-width: 480px){.report-modal__container{flex-wrap:wrap;overflow-y:auto}}.report-modal__statuses,.report-modal__comment{box-sizing:border-box;width:50%}@media screen and (max-width: 480px){.report-modal__statuses,.report-modal__comment{width:100%}}.report-modal__statuses,.focal-point-modal__content{flex:1 1 auto;min-height:20vh;max-height:80vh;overflow-y:auto;overflow-x:hidden}.report-modal__statuses .status__content a,.focal-point-modal__content .status__content a{color:#2b90d9}.report-modal__statuses .status__content,.report-modal__statuses .status__content p,.focal-point-modal__content .status__content,.focal-point-modal__content .status__content p{color:#000}@media screen and (max-width: 480px){.report-modal__statuses,.focal-point-modal__content{max-height:10vh}}@media screen and (max-width: 480px){.focal-point-modal__content{max-height:40vh}}.report-modal__comment{padding:20px;border-right:1px solid #282c37;max-width:320px}.report-modal__comment p{font-size:14px;line-height:20px;margin-bottom:20px}.report-modal__comment .setting-text{display:block;box-sizing:border-box;width:100%;margin:0;color:#000;background:#fff;padding:10px;font-family:inherit;font-size:14px;resize:none;border:0;outline:0;border-radius:4px;border:1px solid #282c37;min-height:100px;max-height:50vh;margin-bottom:10px}.report-modal__comment .setting-text:focus{border:1px solid #393f4f}.report-modal__comment .setting-text__wrapper{background:#fff;border:1px solid #282c37;margin-bottom:10px;border-radius:4px}.report-modal__comment .setting-text__wrapper .setting-text{border:0;margin-bottom:0;border-radius:0}.report-modal__comment .setting-text__wrapper .setting-text:focus{border:0}.report-modal__comment .setting-text__wrapper__modifiers{color:#000;font-family:inherit;font-size:14px;background:#fff}.report-modal__comment .setting-text__toolbar{display:flex;justify-content:space-between;margin-bottom:20px}.report-modal__comment .setting-text-label{display:block;color:#000;font-size:14px;font-weight:500;margin-bottom:10px}.report-modal__comment .setting-toggle{margin-top:20px;margin-bottom:24px}.report-modal__comment .setting-toggle__label{color:#000;font-size:14px}@media screen and (max-width: 480px){.report-modal__comment{padding:10px;max-width:100%;order:2}.report-modal__comment .setting-toggle{margin-bottom:4px}}.actions-modal{max-height:80vh;max-width:80vw}.actions-modal .status{overflow-y:auto;max-height:300px}.actions-modal .actions-modal__item-label{font-weight:500}.actions-modal ul{overflow-y:auto;flex-shrink:0;max-height:80vh}.actions-modal ul.with-status{max-height:calc(80vh - 75px)}.actions-modal ul li:empty{margin:0}.actions-modal ul li:not(:empty) a{color:#000;display:flex;padding:12px 16px;font-size:15px;align-items:center;text-decoration:none}.actions-modal ul li:not(:empty) a,.actions-modal ul li:not(:empty) a button{transition:none}.actions-modal ul li:not(:empty) a.active,.actions-modal ul li:not(:empty) a.active button,.actions-modal ul li:not(:empty) a:hover,.actions-modal ul li:not(:empty) a:hover button,.actions-modal ul li:not(:empty) a:active,.actions-modal ul li:not(:empty) a:active button,.actions-modal ul li:not(:empty) a:focus,.actions-modal ul li:not(:empty) a:focus button{background:#2b90d9;color:#000}.actions-modal ul li:not(:empty) a button:first-child{margin-right:10px}.confirmation-modal__action-bar .confirmation-modal__secondary-button,.mute-modal__action-bar .confirmation-modal__secondary-button,.block-modal__action-bar .confirmation-modal__secondary-button{flex-shrink:1}.confirmation-modal__secondary-button,.confirmation-modal__cancel-button,.mute-modal__cancel-button,.block-modal__cancel-button{background-color:transparent;color:#282c37;font-size:14px;font-weight:500}.confirmation-modal__secondary-button:hover,.confirmation-modal__secondary-button:focus,.confirmation-modal__secondary-button:active,.confirmation-modal__cancel-button:hover,.confirmation-modal__cancel-button:focus,.confirmation-modal__cancel-button:active,.mute-modal__cancel-button:hover,.mute-modal__cancel-button:focus,.mute-modal__cancel-button:active,.block-modal__cancel-button:hover,.block-modal__cancel-button:focus,.block-modal__cancel-button:active{color:#313543;background-color:transparent}.confirmation-modal__container,.mute-modal__container,.block-modal__container,.report-modal__target{padding:30px;font-size:16px}.confirmation-modal__container strong,.mute-modal__container strong,.block-modal__container strong,.report-modal__target strong{font-weight:500}.confirmation-modal__container strong:lang(ja),.mute-modal__container strong:lang(ja),.block-modal__container strong:lang(ja),.report-modal__target strong:lang(ja){font-weight:700}.confirmation-modal__container strong:lang(ko),.mute-modal__container strong:lang(ko),.block-modal__container strong:lang(ko),.report-modal__target strong:lang(ko){font-weight:700}.confirmation-modal__container strong:lang(zh-CN),.mute-modal__container strong:lang(zh-CN),.block-modal__container strong:lang(zh-CN),.report-modal__target strong:lang(zh-CN){font-weight:700}.confirmation-modal__container strong:lang(zh-HK),.mute-modal__container strong:lang(zh-HK),.block-modal__container strong:lang(zh-HK),.report-modal__target strong:lang(zh-HK){font-weight:700}.confirmation-modal__container strong:lang(zh-TW),.mute-modal__container strong:lang(zh-TW),.block-modal__container strong:lang(zh-TW),.report-modal__target strong:lang(zh-TW){font-weight:700}.confirmation-modal__container,.report-modal__target{text-align:center}.block-modal__explanation,.mute-modal__explanation{margin-top:20px}.block-modal .setting-toggle,.mute-modal .setting-toggle{margin-top:20px;margin-bottom:24px;display:flex;align-items:center}.block-modal .setting-toggle__label,.mute-modal .setting-toggle__label{color:#000;margin:0;margin-left:8px}.report-modal__target{padding:15px}.report-modal__target .media-modal__close{top:14px;right:15px}.loading-bar{background-color:#2b90d9;height:3px;position:absolute;top:0;left:0;z-index:9999}.media-gallery__gifv__label{display:block;position:absolute;color:#000;background:rgba(255,255,255,.5);bottom:6px;left:6px;padding:2px 6px;border-radius:2px;font-size:11px;font-weight:600;z-index:1;pointer-events:none;opacity:.9;transition:opacity .1s ease;line-height:18px}.media-gallery__gifv.autoplay .media-gallery__gifv__label{display:none}.media-gallery__gifv:hover .media-gallery__gifv__label{opacity:1}.media-gallery__audio{margin-top:32px}.media-gallery__audio audio{width:100%}.attachment-list{display:flex;font-size:14px;border:1px solid #c0cdd9;border-radius:4px;margin-top:14px;overflow:hidden}.attachment-list__icon{flex:0 0 auto;color:#444b5d;padding:8px 18px;cursor:default;border-right:1px solid #c0cdd9;display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:26px}.attachment-list__icon .fa{display:block}.attachment-list__list{list-style:none;padding:4px 0;padding-left:8px;display:flex;flex-direction:column;justify-content:center}.attachment-list__list li{display:block;padding:4px 0}.attachment-list__list a{text-decoration:none;color:#444b5d;font-weight:500}.attachment-list__list a:hover{text-decoration:underline}.attachment-list.compact{border:0;margin-top:4px}.attachment-list.compact .attachment-list__list{padding:0;display:block}.attachment-list.compact .fa{color:#444b5d}.media-gallery{box-sizing:border-box;margin-top:8px;overflow:hidden;border-radius:4px;position:relative;width:100%}.media-gallery__item{border:0;box-sizing:border-box;display:block;float:left;position:relative;border-radius:4px;overflow:hidden}.media-gallery__item.standalone .media-gallery__item-gifv-thumbnail{transform:none;top:0}.media-gallery__item-thumbnail{cursor:zoom-in;display:block;text-decoration:none;color:#282c37;position:relative;z-index:1}.media-gallery__item-thumbnail,.media-gallery__item-thumbnail img{height:100%;width:100%}.media-gallery__item-thumbnail img{object-fit:cover}.media-gallery__preview{width:100%;height:100%;object-fit:cover;position:absolute;top:0;left:0;z-index:0;background:#fff}.media-gallery__preview--hidden{display:none}.media-gallery__gifv{height:100%;overflow:hidden;position:relative;width:100%}.media-gallery__item-gifv-thumbnail{cursor:zoom-in;height:100%;object-fit:cover;position:relative;top:50%;transform:translateY(-50%);width:100%;z-index:1}.media-gallery__item-thumbnail-label{clip:rect(1px 1px 1px 1px);clip:rect(1px, 1px, 1px, 1px);overflow:hidden;position:absolute}.detailed .video-player__volume__current,.detailed .video-player__volume::before,.fullscreen .video-player__volume__current,.fullscreen .video-player__volume::before{bottom:27px}.detailed .video-player__volume__handle,.fullscreen .video-player__volume__handle{bottom:23px}.audio-player{box-sizing:border-box;position:relative;background:#f2f5f7;border-radius:4px;padding-bottom:44px;direction:ltr}.audio-player.editable{border-radius:0;height:100%}.audio-player__waveform{padding:15px 0;position:relative;overflow:hidden}.audio-player__waveform::before{content:\"\";display:block;position:absolute;border-top:1px solid #ccd7e0;width:100%;height:0;left:0;top:calc(50% + 1px)}.audio-player__progress-placeholder{background-color:rgba(33,122,186,.5)}.audio-player__wave-placeholder{background-color:#a6b9c9}.audio-player .video-player__controls{padding:0 15px;padding-top:10px;background:#f2f5f7;border-top:1px solid #ccd7e0;border-radius:0 0 4px 4px}.video-player{overflow:hidden;position:relative;background:#000;max-width:100%;border-radius:4px;box-sizing:border-box;direction:ltr}.video-player.editable{border-radius:0;height:100% !important}.video-player:focus{outline:0}.video-player video{max-width:100vw;max-height:80vh;z-index:1}.video-player.fullscreen{width:100% !important;height:100% !important;margin:0}.video-player.fullscreen video{max-width:100% !important;max-height:100% !important;width:100% !important;height:100% !important;outline:0}.video-player.inline video{object-fit:contain;position:relative;top:50%;transform:translateY(-50%)}.video-player__controls{position:absolute;z-index:2;bottom:0;left:0;right:0;box-sizing:border-box;background:linear-gradient(0deg, rgba(0, 0, 0, 0.85) 0, rgba(0, 0, 0, 0.45) 60%, transparent);padding:0 15px;opacity:0;transition:opacity .1s ease}.video-player__controls.active{opacity:1}.video-player.inactive video,.video-player.inactive .video-player__controls{visibility:hidden}.video-player__spoiler{display:none;position:absolute;top:0;left:0;width:100%;height:100%;z-index:4;border:0;background:#fff;color:#282c37;transition:none;pointer-events:none}.video-player__spoiler.active{display:block;pointer-events:auto}.video-player__spoiler.active:hover,.video-player__spoiler.active:active,.video-player__spoiler.active:focus{color:#191b22}.video-player__spoiler__title{display:block;font-size:14px}.video-player__spoiler__subtitle{display:block;font-size:11px;font-weight:500}.video-player__buttons-bar{display:flex;justify-content:space-between;padding-bottom:10px}.video-player__buttons-bar .video-player__download__icon{color:inherit}.video-player__buttons{font-size:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.video-player__buttons.left button{padding-left:0}.video-player__buttons.right button{padding-right:0}.video-player__buttons button{background:transparent;padding:2px 10px;font-size:16px;border:0;color:rgba(255,255,255,.75)}.video-player__buttons button:active,.video-player__buttons button:hover,.video-player__buttons button:focus{color:#fff}.video-player__time-sep,.video-player__time-total,.video-player__time-current{font-size:14px;font-weight:500}.video-player__time-current{color:#fff;margin-left:60px}.video-player__time-sep{display:inline-block;margin:0 6px}.video-player__time-sep,.video-player__time-total{color:#fff}.video-player__volume{cursor:pointer;height:24px;display:inline}.video-player__volume::before{content:\"\";width:50px;background:rgba(255,255,255,.35);border-radius:4px;display:block;position:absolute;height:4px;left:70px;bottom:20px}.video-player__volume__current{display:block;position:absolute;height:4px;border-radius:4px;left:70px;bottom:20px;background:#217aba}.video-player__volume__handle{position:absolute;z-index:3;border-radius:50%;width:12px;height:12px;bottom:16px;left:70px;transition:opacity .1s ease;background:#217aba;box-shadow:1px 2px 6px rgba(0,0,0,.2);pointer-events:none}.video-player__link{padding:2px 10px}.video-player__link a{text-decoration:none;font-size:14px;font-weight:500;color:#fff}.video-player__link a:hover,.video-player__link a:active,.video-player__link a:focus{text-decoration:underline}.video-player__seek{cursor:pointer;height:24px;position:relative}.video-player__seek::before{content:\"\";width:100%;background:rgba(255,255,255,.35);border-radius:4px;display:block;position:absolute;height:4px;top:10px}.video-player__seek__progress,.video-player__seek__buffer{display:block;position:absolute;height:4px;border-radius:4px;top:10px;background:#217aba}.video-player__seek__buffer{background:rgba(255,255,255,.2)}.video-player__seek__handle{position:absolute;z-index:3;opacity:0;border-radius:50%;width:12px;height:12px;top:6px;margin-left:-6px;transition:opacity .1s ease;background:#217aba;box-shadow:1px 2px 6px rgba(0,0,0,.2);pointer-events:none}.video-player__seek__handle.active{opacity:1}.video-player__seek:hover .video-player__seek__handle{opacity:1}.video-player.detailed .video-player__buttons button,.video-player.fullscreen .video-player__buttons button{padding-top:10px;padding-bottom:10px}.directory__list{width:100%;margin:10px 0;transition:opacity 100ms ease-in}.directory__list.loading{opacity:.7}@media screen and (max-width: 415px){.directory__list{margin:0}}.directory__card{box-sizing:border-box;margin-bottom:10px}.directory__card__img{height:125px;position:relative;background:#fff;overflow:hidden}.directory__card__img img{display:block;width:100%;height:100%;margin:0;object-fit:cover}.directory__card__bar{display:flex;align-items:center;background:#ccd7e0;padding:10px}.directory__card__bar__name{flex:1 1 auto;display:flex;align-items:center;text-decoration:none;overflow:hidden}.directory__card__bar__relationship{width:23px;min-height:1px;flex:0 0 auto}.directory__card__bar .avatar{flex:0 0 auto;width:48px;height:48px;padding-top:2px}.directory__card__bar .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px;background:#f2f5f7;object-fit:cover}.directory__card__bar .display-name{margin-left:15px;text-align:left}.directory__card__bar .display-name strong{font-size:15px;color:#000;font-weight:500;overflow:hidden;text-overflow:ellipsis}.directory__card__bar .display-name span{display:block;font-size:14px;color:#282c37;font-weight:400;overflow:hidden;text-overflow:ellipsis}.directory__card__extra{background:#d9e1e8;display:flex;align-items:center;justify-content:center}.directory__card__extra .accounts-table__count{width:33.33%;flex:0 0 auto;padding:15px 0}.directory__card__extra .account__header__content{box-sizing:border-box;padding:15px 10px;border-bottom:1px solid #c0cdd9;width:100%;min-height:48px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.directory__card__extra .account__header__content p{display:none}.directory__card__extra .account__header__content p:first-child{display:inline}.directory__card__extra .account__header__content br{display:none}.account-gallery__container{display:flex;flex-wrap:wrap;padding:4px 2px}.account-gallery__item{border:0;box-sizing:border-box;display:block;position:relative;border-radius:4px;overflow:hidden;margin:2px}.account-gallery__item__icons{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);font-size:24px}.notification__filter-bar,.account__section-headline{background:#e6ebf0;border-bottom:1px solid #c0cdd9;cursor:default;display:flex;flex-shrink:0}.notification__filter-bar button,.account__section-headline button{background:#e6ebf0;border:0;margin:0}.notification__filter-bar button,.notification__filter-bar a,.account__section-headline button,.account__section-headline a{display:block;flex:1 1 auto;color:#282c37;padding:15px 0;font-size:14px;font-weight:500;text-align:center;text-decoration:none;position:relative}.notification__filter-bar button.active,.notification__filter-bar a.active,.account__section-headline button.active,.account__section-headline a.active{color:#282c37}.notification__filter-bar button.active::before,.notification__filter-bar button.active::after,.notification__filter-bar a.active::before,.notification__filter-bar a.active::after,.account__section-headline button.active::before,.account__section-headline button.active::after,.account__section-headline a.active::before,.account__section-headline a.active::after{display:block;content:\"\";position:absolute;bottom:0;left:50%;width:0;height:0;transform:translateX(-50%);border-style:solid;border-width:0 10px 10px;border-color:transparent transparent #c0cdd9}.notification__filter-bar button.active::after,.notification__filter-bar a.active::after,.account__section-headline button.active::after,.account__section-headline a.active::after{bottom:-1px;border-color:transparent transparent #d9e1e8}.notification__filter-bar.directory__section-headline,.account__section-headline.directory__section-headline{background:#dfe6ec;border-bottom-color:transparent}.notification__filter-bar.directory__section-headline a.active::before,.notification__filter-bar.directory__section-headline button.active::before,.account__section-headline.directory__section-headline a.active::before,.account__section-headline.directory__section-headline button.active::before{display:none}.notification__filter-bar.directory__section-headline a.active::after,.notification__filter-bar.directory__section-headline button.active::after,.account__section-headline.directory__section-headline a.active::after,.account__section-headline.directory__section-headline button.active::after{border-color:transparent transparent #eff3f5}.filter-form{background:#d9e1e8}.filter-form__column{padding:10px 15px}.filter-form .radio-button{display:block}.radio-button{font-size:14px;position:relative;display:inline-block;padding:6px 0;line-height:18px;cursor:default;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer}.radio-button input[type=radio],.radio-button input[type=checkbox]{display:none}.radio-button__input{display:inline-block;position:relative;border:1px solid #9bcbed;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:50%;vertical-align:middle}.radio-button__input.checked{border-color:#217aba;background:#217aba}::-webkit-scrollbar-thumb{border-radius:0}.search-popout{background:#fff;border-radius:4px;padding:10px 14px;padding-bottom:14px;margin-top:10px;color:#444b5d;box-shadow:2px 4px 15px rgba(0,0,0,.4)}.search-popout h4{color:#444b5d;font-size:14px;font-weight:500;margin-bottom:10px}.search-popout li{padding:4px 0}.search-popout ul{margin-bottom:10px}.search-popout em{font-weight:500;color:#000}noscript{text-align:center}noscript img{width:200px;opacity:.5;animation:flicker 4s infinite}noscript div{font-size:14px;margin:30px auto;color:#282c37;max-width:400px}noscript div a{color:#2b90d9;text-decoration:underline}noscript div a:hover{text-decoration:none}@keyframes flicker{0%{opacity:1}30%{opacity:.75}100%{opacity:1}}@media screen and (max-width: 630px)and (max-height: 400px){.tabs-bar,.search{will-change:margin-top;transition:margin-top 400ms 100ms}.navigation-bar{will-change:padding-bottom;transition:padding-bottom 400ms 100ms}.navigation-bar>a:first-child{will-change:margin-top,margin-left,margin-right,width;transition:margin-top 400ms 100ms,margin-left 400ms 500ms,margin-right 400ms 500ms}.navigation-bar>.navigation-bar__profile-edit{will-change:margin-top;transition:margin-top 400ms 100ms}.navigation-bar .navigation-bar__actions>.icon-button.close{will-change:opacity transform;transition:opacity 200ms 100ms,transform 400ms 100ms}.navigation-bar .navigation-bar__actions>.compose__action-bar .icon-button{will-change:opacity transform;transition:opacity 200ms 300ms,transform 400ms 100ms}.is-composing .tabs-bar,.is-composing .search{margin-top:-50px}.is-composing .navigation-bar{padding-bottom:0}.is-composing .navigation-bar>a:first-child{margin:-100px 10px 0 -50px}.is-composing .navigation-bar .navigation-bar__profile{padding-top:2px}.is-composing .navigation-bar .navigation-bar__profile-edit{position:absolute;margin-top:-60px}.is-composing .navigation-bar .navigation-bar__actions .icon-button.close{pointer-events:auto;opacity:1;transform:scale(1, 1) translate(0, 0);bottom:5px}.is-composing .navigation-bar .navigation-bar__actions .compose__action-bar .icon-button{pointer-events:none;opacity:0;transform:scale(0, 1) translate(100%, 0)}}.embed-modal{width:auto;max-width:80vw;max-height:80vh}.embed-modal h4{padding:30px;font-weight:500;font-size:16px;text-align:center}.embed-modal .embed-modal__container{padding:10px}.embed-modal .embed-modal__container .hint{margin-bottom:15px}.embed-modal .embed-modal__container .embed-modal__html{outline:0;box-sizing:border-box;display:block;width:100%;border:0;padding:10px;font-family:\"mastodon-font-monospace\",monospace;background:#d9e1e8;color:#000;font-size:14px;margin:0;margin-bottom:15px;border-radius:4px}.embed-modal .embed-modal__container .embed-modal__html::-moz-focus-inner{border:0}.embed-modal .embed-modal__container .embed-modal__html::-moz-focus-inner,.embed-modal .embed-modal__container .embed-modal__html:focus,.embed-modal .embed-modal__container .embed-modal__html:active{outline:0 !important}.embed-modal .embed-modal__container .embed-modal__html:focus{background:#ccd7e0}@media screen and (max-width: 600px){.embed-modal .embed-modal__container .embed-modal__html{font-size:16px}}.embed-modal .embed-modal__container .embed-modal__iframe{width:400px;max-width:100%;overflow:hidden;border:0;border-radius:4px}.account__moved-note{padding:14px 10px;padding-bottom:16px;background:#ccd7e0;border-top:1px solid #c0cdd9;border-bottom:1px solid #c0cdd9}.account__moved-note__message{position:relative;margin-left:58px;color:#444b5d;padding:8px 0;padding-top:0;padding-bottom:4px;font-size:14px}.account__moved-note__message>span{display:block;overflow:hidden;text-overflow:ellipsis}.account__moved-note__icon-wrapper{left:-26px;position:absolute}.account__moved-note .detailed-status__display-avatar{position:relative}.account__moved-note .detailed-status__display-name{margin-bottom:0}.column-inline-form{padding:15px;padding-right:0;display:flex;justify-content:flex-start;align-items:center;background:#ccd7e0}.column-inline-form label{flex:1 1 auto}.column-inline-form label input{width:100%}.column-inline-form label input:focus{outline:0}.column-inline-form .icon-button{flex:0 0 auto;margin:0 10px}.drawer__backdrop{cursor:pointer;position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(255,255,255,.5)}.list-editor{background:#d9e1e8;flex-direction:column;border-radius:8px;box-shadow:2px 4px 15px rgba(0,0,0,.4);width:380px;overflow:hidden}@media screen and (max-width: 420px){.list-editor{width:90%}}.list-editor h4{padding:15px 0;background:#b0c0cf;font-weight:500;font-size:16px;text-align:center;border-radius:8px 8px 0 0}.list-editor .drawer__pager{height:50vh}.list-editor .drawer__inner{border-radius:0 0 8px 8px}.list-editor .drawer__inner.backdrop{width:calc(100% - 60px);box-shadow:2px 4px 15px rgba(0,0,0,.4);border-radius:0 0 0 8px}.list-editor__accounts{overflow-y:auto}.list-editor .account__display-name:hover strong{text-decoration:none}.list-editor .account__avatar{cursor:default}.list-editor .search{margin-bottom:0}.list-adder{background:#d9e1e8;flex-direction:column;border-radius:8px;box-shadow:2px 4px 15px rgba(0,0,0,.4);width:380px;overflow:hidden}@media screen and (max-width: 420px){.list-adder{width:90%}}.list-adder__account{background:#b0c0cf}.list-adder__lists{background:#b0c0cf;height:50vh;border-radius:0 0 8px 8px;overflow-y:auto}.list-adder .list{padding:10px;border-bottom:1px solid #c0cdd9}.list-adder .list__wrapper{display:flex}.list-adder .list__display-name{flex:1 1 auto;overflow:hidden;text-decoration:none;font-size:16px;padding:10px}.focal-point{position:relative;cursor:move;overflow:hidden;height:100%;display:flex;justify-content:center;align-items:center;background:#000}.focal-point img,.focal-point video,.focal-point canvas{display:block;max-height:80vh;width:100%;height:auto;margin:0;object-fit:contain;background:#000}.focal-point__reticle{position:absolute;width:100px;height:100px;transform:translate(-50%, -50%);background:url(\"~images/reticle.png\") no-repeat 0 0;border-radius:50%;box-shadow:0 0 0 9999em rgba(0,0,0,.35)}.focal-point__overlay{position:absolute;width:100%;height:100%;top:0;left:0}.focal-point__preview{position:absolute;bottom:10px;right:10px;z-index:2;cursor:move;transition:opacity .1s ease}.focal-point__preview:hover{opacity:.5}.focal-point__preview strong{color:#000;font-size:14px;font-weight:500;display:block;margin-bottom:5px}.focal-point__preview div{border-radius:4px;box-shadow:0 0 14px rgba(0,0,0,.2)}@media screen and (max-width: 480px){.focal-point img,.focal-point video{max-height:100%}.focal-point__preview{display:none}}.account__header__content{color:#282c37;font-size:14px;font-weight:400;overflow:hidden;word-break:normal;word-wrap:break-word}.account__header__content p{margin-bottom:20px}.account__header__content p:last-child{margin-bottom:0}.account__header__content a{color:inherit;text-decoration:underline}.account__header__content a:hover{text-decoration:none}.account__header{overflow:hidden}.account__header.inactive{opacity:.5}.account__header.inactive .account__header__image,.account__header.inactive .account__avatar{filter:grayscale(100%)}.account__header__info{position:absolute;top:10px;left:10px}.account__header__image{overflow:hidden;height:145px;position:relative;background:#e6ebf0}.account__header__image img{object-fit:cover;display:block;width:100%;height:100%;margin:0}.account__header__bar{position:relative;background:#ccd7e0;padding:5px;border-bottom:1px solid #b3c3d1}.account__header__bar .avatar{display:block;flex:0 0 auto;width:94px;margin-left:-2px}.account__header__bar .avatar .account__avatar{background:#f2f5f7;border:2px solid #ccd7e0}.account__header__tabs{display:flex;align-items:flex-start;padding:7px 5px;margin-top:-55px}.account__header__tabs__buttons{display:flex;align-items:center;padding-top:55px;overflow:hidden}.account__header__tabs__buttons .icon-button{border:1px solid #b3c3d1;border-radius:4px;box-sizing:content-box;padding:2px}.account__header__tabs__buttons .button{margin:0 8px}.account__header__tabs__name{padding:5px}.account__header__tabs__name .account-role{vertical-align:top}.account__header__tabs__name .emojione{width:22px;height:22px}.account__header__tabs__name h1{font-size:16px;line-height:24px;color:#000;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.account__header__tabs__name h1 small{display:block;font-size:14px;color:#282c37;font-weight:400;overflow:hidden;text-overflow:ellipsis}.account__header__tabs .spacer{flex:1 1 auto}.account__header__bio{overflow:hidden;margin:0 -5px}.account__header__bio .account__header__content{padding:20px 15px;padding-bottom:5px;color:#000}.account__header__bio .account__header__fields{margin:0;border-top:1px solid #b3c3d1}.account__header__bio .account__header__fields a{color:#217aba}.account__header__bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.account__header__bio .account__header__fields .verified a{color:#4a905f}.account__header__extra{margin-top:4px}.account__header__extra__links{font-size:14px;color:#282c37;padding:10px 0}.account__header__extra__links a{display:inline-block;color:#282c37;text-decoration:none;padding:5px 10px;font-weight:500}.account__header__extra__links a strong{font-weight:700;color:#000}.trends__header{color:#444b5d;background:#d3dce4;border-bottom:1px solid #e6ebf0;font-weight:500;padding:15px;font-size:16px;cursor:default}.trends__header .fa{display:inline-block;margin-right:5px}.trends__item{display:flex;align-items:center;padding:15px;border-bottom:1px solid #c0cdd9}.trends__item:last-child{border-bottom:0}.trends__item__name{flex:1 1 auto;color:#444b5d;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trends__item__name strong{font-weight:500}.trends__item__name a{color:#282c37;text-decoration:none;font-size:14px;font-weight:500;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trends__item__name a:hover span,.trends__item__name a:focus span,.trends__item__name a:active span{text-decoration:underline}.trends__item__current{flex:0 0 auto;font-size:24px;line-height:36px;font-weight:500;text-align:right;padding-right:15px;margin-left:5px;color:#282c37}.trends__item__sparkline{flex:0 0 auto;width:50px}.trends__item__sparkline path:first-child{fill:rgba(43,144,217,.25) !important;fill-opacity:1 !important}.trends__item__sparkline path:last-child{stroke:#2380c3 !important}.conversation{display:flex;border-bottom:1px solid #c0cdd9;padding:5px;padding-bottom:0}.conversation:focus{background:#d3dce4;outline:0}.conversation__avatar{flex:0 0 auto;padding:10px;padding-top:12px;position:relative}.conversation__unread{display:inline-block;background:#2b90d9;border-radius:50%;width:.625rem;height:.625rem;margin:-0.1ex .15em .1ex}.conversation__content{flex:1 1 auto;padding:10px 5px;padding-right:15px;overflow:hidden}.conversation__content__info{overflow:hidden;display:flex;flex-direction:row-reverse;justify-content:space-between}.conversation__content__relative-time{font-size:15px;color:#282c37;padding-left:15px}.conversation__content__names{color:#282c37;font-size:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:4px;flex-basis:90px;flex-grow:1}.conversation__content__names a{color:#000;text-decoration:none}.conversation__content__names a:hover,.conversation__content__names a:focus,.conversation__content__names a:active{text-decoration:underline}.conversation__content a{word-break:break-word}.conversation--unread{background:#d3dce4}.conversation--unread:focus{background:#ccd7e0}.conversation--unread .conversation__content__info{font-weight:700}.conversation--unread .conversation__content__relative-time{color:#000}.poll{margin-top:16px;font-size:14px}.poll li{margin-bottom:10px;position:relative}.poll__chart{position:absolute;top:0;left:0;height:100%;display:inline-block;border-radius:4px;background:#d8eaf8}.poll__chart.leading{background:#2b90d9}.poll__text{position:relative;display:flex;padding:6px 0;line-height:18px;cursor:default;overflow:hidden}.poll__text input[type=radio],.poll__text input[type=checkbox]{display:none}.poll__text .autossugest-input{flex:1 1 auto}.poll__text input[type=text]{display:block;box-sizing:border-box;width:100%;font-size:14px;color:#000;outline:0;font-family:inherit;background:#fff;border:1px solid #fff;border-radius:4px;padding:6px 10px}.poll__text input[type=text]:focus{border-color:#2b90d9}.poll__text.selectable{cursor:pointer}.poll__text.editable{display:flex;align-items:center;overflow:visible}.poll__input{display:inline-block;position:relative;border:1px solid #9bcbed;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:50%;vertical-align:middle;margin-top:auto;margin-bottom:auto;flex:0 0 18px}.poll__input.checkbox{border-radius:4px}.poll__input.active{border-color:#4a905f;background:#4a905f}.poll__input:active,.poll__input:focus,.poll__input:hover{border-width:4px;background:none}.poll__input::-moz-focus-inner{outline:0 !important;border:0}.poll__input:focus,.poll__input:active{outline:0 !important}.poll__number{display:inline-block;width:52px;font-weight:700;padding:0 10px;padding-left:8px;text-align:right;margin-top:auto;margin-bottom:auto;flex:0 0 52px}.poll__vote__mark{float:left;line-height:18px}.poll__footer{padding-top:6px;padding-bottom:5px;color:#444b5d}.poll__link{display:inline;background:transparent;padding:0;margin:0;border:0;color:#444b5d;text-decoration:underline;font-size:inherit}.poll__link:hover{text-decoration:none}.poll__link:active,.poll__link:focus{background-color:rgba(68,75,93,.1)}.poll .button{height:36px;padding:0 16px;margin-right:10px;font-size:14px}.compose-form__poll-wrapper{border-top:1px solid #fff}.compose-form__poll-wrapper ul{padding:10px}.compose-form__poll-wrapper .poll__footer{border-top:1px solid #fff;padding:10px;display:flex;align-items:center}.compose-form__poll-wrapper .poll__footer button,.compose-form__poll-wrapper .poll__footer select{flex:1 1 50%}.compose-form__poll-wrapper .poll__footer button:focus,.compose-form__poll-wrapper .poll__footer select:focus{border-color:#2b90d9}.compose-form__poll-wrapper .button.button-secondary{font-size:14px;font-weight:400;padding:6px 10px;height:auto;line-height:inherit;color:#606984;border-color:#606984;margin-right:5px}.compose-form__poll-wrapper li{display:flex;align-items:center}.compose-form__poll-wrapper li .poll__text{flex:0 0 auto;width:calc(100% - (23px + 6px));margin-right:6px}.compose-form__poll-wrapper select{appearance:none;box-sizing:border-box;font-size:14px;color:#000;display:inline-block;width:auto;outline:0;font-family:inherit;background:#fff url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center/auto 16px;border:1px solid #fff;border-radius:4px;padding:6px 10px;padding-right:30px}.compose-form__poll-wrapper .icon-button.disabled{color:#fff}.muted .poll{color:#444b5d}.muted .poll__chart{background:rgba(216,234,248,.2)}.muted .poll__chart.leading{background:rgba(43,144,217,.2)}.modal-layout{background:#d9e1e8 url('data:image/svg+xml;utf8,') repeat-x bottom fixed;display:flex;flex-direction:column;height:100vh;padding:0}.modal-layout__mastodon{display:flex;flex:1;flex-direction:column;justify-content:flex-end}.modal-layout__mastodon>*{flex:1;max-height:235px}@media screen and (max-width: 600px){.account-header{margin-top:0}}.emoji-mart{font-size:13px;display:inline-block;color:#000}.emoji-mart,.emoji-mart *{box-sizing:border-box;line-height:1.15}.emoji-mart .emoji-mart-emoji{padding:6px}.emoji-mart-bar{border:0 solid #393f4f}.emoji-mart-bar:first-child{border-bottom-width:1px;border-top-left-radius:5px;border-top-right-radius:5px;background:#282c37}.emoji-mart-bar:last-child{border-top-width:1px;border-bottom-left-radius:5px;border-bottom-right-radius:5px;display:none}.emoji-mart-anchors{display:flex;justify-content:space-between;padding:0 6px;color:#282c37;line-height:0}.emoji-mart-anchor{position:relative;flex:1;text-align:center;padding:12px 4px;overflow:hidden;transition:color .1s ease-out;cursor:pointer}.emoji-mart-anchor:hover{color:#313543}.emoji-mart-anchor-selected{color:#2b90d9}.emoji-mart-anchor-selected:hover{color:#3c99dc}.emoji-mart-anchor-selected .emoji-mart-anchor-bar{bottom:-1px}.emoji-mart-anchor-bar{position:absolute;bottom:-5px;left:0;width:100%;height:4px;background-color:#2b90d9}.emoji-mart-anchors i{display:inline-block;width:100%;max-width:22px}.emoji-mart-anchors svg{fill:currentColor;max-height:18px}.emoji-mart-scroll{overflow-y:scroll;height:270px;max-height:35vh;padding:0 6px 6px;background:#fff;will-change:transform}.emoji-mart-scroll::-webkit-scrollbar-track:hover,.emoji-mart-scroll::-webkit-scrollbar-track:active{background-color:rgba(255,255,255,.3)}.emoji-mart-search{padding:10px;padding-right:45px;background:#fff}.emoji-mart-search input{font-size:14px;font-weight:400;padding:7px 9px;font-family:inherit;display:block;width:100%;background:rgba(40,44,55,.3);color:#000;border:1px solid #282c37;border-radius:4px}.emoji-mart-search input::-moz-focus-inner{border:0}.emoji-mart-search input::-moz-focus-inner,.emoji-mart-search input:focus,.emoji-mart-search input:active{outline:0 !important}.emoji-mart-category .emoji-mart-emoji{cursor:pointer}.emoji-mart-category .emoji-mart-emoji span{z-index:1;position:relative;text-align:center}.emoji-mart-category .emoji-mart-emoji:hover::before{z-index:0;content:\"\";position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(40,44,55,.7);border-radius:100%}.emoji-mart-category-label{z-index:2;position:relative;position:-webkit-sticky;position:sticky;top:0}.emoji-mart-category-label span{display:block;width:100%;font-weight:500;padding:5px 6px;background:#fff}.emoji-mart-emoji{position:relative;display:inline-block;font-size:0}.emoji-mart-emoji span{width:22px;height:22px}.emoji-mart-no-results{font-size:14px;text-align:center;padding-top:70px;color:#444b5d}.emoji-mart-no-results .emoji-mart-category-label{display:none}.emoji-mart-no-results .emoji-mart-no-results-label{margin-top:.2em}.emoji-mart-no-results .emoji-mart-emoji:hover::before{content:none}.emoji-mart-preview{display:none}.container{box-sizing:border-box;max-width:1235px;margin:0 auto;position:relative}@media screen and (max-width: 1255px){.container{width:100%;padding:0 10px}}.rich-formatting{font-family:\"mastodon-font-sans-serif\",sans-serif;font-size:14px;font-weight:400;line-height:1.7;word-wrap:break-word;color:#282c37}.rich-formatting a{color:#2b90d9;text-decoration:underline}.rich-formatting a:hover,.rich-formatting a:focus,.rich-formatting a:active{text-decoration:none}.rich-formatting p,.rich-formatting li{color:#282c37}.rich-formatting p{margin-top:0;margin-bottom:.85em}.rich-formatting p:last-child{margin-bottom:0}.rich-formatting strong{font-weight:700;color:#282c37}.rich-formatting em{font-style:italic;color:#282c37}.rich-formatting code{font-size:.85em;background:#f2f5f7;border-radius:4px;padding:.2em .3em}.rich-formatting h1,.rich-formatting h2,.rich-formatting h3,.rich-formatting h4,.rich-formatting h5,.rich-formatting h6{font-family:\"mastodon-font-display\",sans-serif;margin-top:1.275em;margin-bottom:.85em;font-weight:500;color:#282c37}.rich-formatting h1{font-size:2em}.rich-formatting h2{font-size:1.75em}.rich-formatting h3{font-size:1.5em}.rich-formatting h4{font-size:1.25em}.rich-formatting h5,.rich-formatting h6{font-size:1em}.rich-formatting ul{list-style:disc}.rich-formatting ol{list-style:decimal}.rich-formatting ul,.rich-formatting ol{margin:0;padding:0;padding-left:2em;margin-bottom:.85em}.rich-formatting ul[type=a],.rich-formatting ol[type=a]{list-style-type:lower-alpha}.rich-formatting ul[type=i],.rich-formatting ol[type=i]{list-style-type:lower-roman}.rich-formatting hr{width:100%;height:0;border:0;border-bottom:1px solid #ccd7e0;margin:1.7em 0}.rich-formatting hr.spacer{height:1px;border:0}.rich-formatting table{width:100%;border-collapse:collapse;break-inside:auto;margin-top:24px;margin-bottom:32px}.rich-formatting table thead tr,.rich-formatting table tbody tr{border-bottom:1px solid #ccd7e0;font-size:1em;line-height:1.625;font-weight:400;text-align:left;color:#282c37}.rich-formatting table thead tr{border-bottom-width:2px;line-height:1.5;font-weight:500;color:#444b5d}.rich-formatting table th,.rich-formatting table td{padding:8px;align-self:start;align-items:start;word-break:break-all}.rich-formatting table th.nowrap,.rich-formatting table td.nowrap{width:25%;position:relative}.rich-formatting table th.nowrap::before,.rich-formatting table td.nowrap::before{content:\" \";visibility:hidden}.rich-formatting table th.nowrap span,.rich-formatting table td.nowrap span{position:absolute;left:8px;right:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rich-formatting>:first-child{margin-top:0}.information-board{background:#e6ebf0;padding:20px 0}.information-board .container-alt{position:relative;padding-right:295px}.information-board__sections{display:flex;justify-content:space-between;flex-wrap:wrap}.information-board__section{flex:1 0 0;font-family:\"mastodon-font-sans-serif\",sans-serif;font-size:16px;line-height:28px;color:#000;text-align:right;padding:10px 15px}.information-board__section span,.information-board__section strong{display:block}.information-board__section span:last-child{color:#282c37}.information-board__section strong{font-family:\"mastodon-font-display\",sans-serif;font-weight:500;font-size:32px;line-height:48px}@media screen and (max-width: 700px){.information-board__section{text-align:center}}.information-board .panel{position:absolute;width:280px;box-sizing:border-box;background:#f2f5f7;padding:20px;padding-top:10px;border-radius:4px 4px 0 0;right:0;bottom:-40px}.information-board .panel .panel-header{font-family:\"mastodon-font-display\",sans-serif;font-size:14px;line-height:24px;font-weight:500;color:#282c37;padding-bottom:5px;margin-bottom:15px;border-bottom:1px solid #ccd7e0;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.information-board .panel .panel-header a,.information-board .panel .panel-header span{font-weight:400;color:#3d4455}.information-board .panel .panel-header a{text-decoration:none}.information-board .owner{text-align:center}.information-board .owner .avatar{width:80px;height:80px;margin:0 auto;margin-bottom:15px}.information-board .owner .avatar img{display:block;width:80px;height:80px;border-radius:48px}.information-board .owner .name{font-size:14px}.information-board .owner .name a{display:block;color:#000;text-decoration:none}.information-board .owner .name a:hover .display_name{text-decoration:underline}.information-board .owner .name .username{display:block;color:#282c37}.landing-page p,.landing-page li{font-family:\"mastodon-font-sans-serif\",sans-serif;font-size:16px;font-weight:400;font-size:16px;line-height:30px;margin-bottom:12px;color:#282c37}.landing-page p a,.landing-page li a{color:#2b90d9;text-decoration:underline}.landing-page em{display:inline;margin:0;padding:0;font-weight:700;background:transparent;font-family:inherit;font-size:inherit;line-height:inherit;color:#131419}.landing-page h1{font-family:\"mastodon-font-display\",sans-serif;font-size:26px;line-height:30px;font-weight:500;margin-bottom:20px;color:#282c37}.landing-page h1 small{font-family:\"mastodon-font-sans-serif\",sans-serif;display:block;font-size:18px;font-weight:400;color:#131419}.landing-page h2{font-family:\"mastodon-font-display\",sans-serif;font-size:22px;line-height:26px;font-weight:500;margin-bottom:20px;color:#282c37}.landing-page h3{font-family:\"mastodon-font-display\",sans-serif;font-size:18px;line-height:24px;font-weight:500;margin-bottom:20px;color:#282c37}.landing-page h4{font-family:\"mastodon-font-display\",sans-serif;font-size:16px;line-height:24px;font-weight:500;margin-bottom:20px;color:#282c37}.landing-page h5{font-family:\"mastodon-font-display\",sans-serif;font-size:14px;line-height:24px;font-weight:500;margin-bottom:20px;color:#282c37}.landing-page h6{font-family:\"mastodon-font-display\",sans-serif;font-size:12px;line-height:24px;font-weight:500;margin-bottom:20px;color:#282c37}.landing-page ul,.landing-page ol{margin-left:20px}.landing-page ul[type=a],.landing-page ol[type=a]{list-style-type:lower-alpha}.landing-page ul[type=i],.landing-page ol[type=i]{list-style-type:lower-roman}.landing-page ul{list-style:disc}.landing-page ol{list-style:decimal}.landing-page li>ol,.landing-page li>ul{margin-top:6px}.landing-page hr{width:100%;height:0;border:0;border-bottom:1px solid rgba(176,192,207,.6);margin:20px 0}.landing-page hr.spacer{height:1px;border:0}.landing-page__information,.landing-page__forms{padding:20px}.landing-page__call-to-action{background:#d9e1e8;border-radius:4px;padding:25px 40px;overflow:hidden;box-sizing:border-box}.landing-page__call-to-action .row{width:100%;display:flex;flex-direction:row-reverse;flex-wrap:nowrap;justify-content:space-between;align-items:center}.landing-page__call-to-action .row__information-board{display:flex;justify-content:flex-end;align-items:flex-end}.landing-page__call-to-action .row__information-board .information-board__section{flex:1 0 auto;padding:0 10px}@media screen and (max-width: 415px){.landing-page__call-to-action .row__information-board{width:100%;justify-content:space-between}}.landing-page__call-to-action .row__mascot{flex:1;margin:10px -50px 0 0}@media screen and (max-width: 415px){.landing-page__call-to-action .row__mascot{display:none}}.landing-page__logo{margin-right:20px}.landing-page__logo img{height:50px;width:auto;mix-blend-mode:lighten}.landing-page__information{padding:45px 40px;margin-bottom:10px}.landing-page__information:last-child{margin-bottom:0}.landing-page__information strong{font-weight:500;color:#131419}.landing-page__information .account{border-bottom:0;padding:0}.landing-page__information .account__display-name{align-items:center;display:flex;margin-right:5px}.landing-page__information .account div.account__display-name:hover .display-name strong{text-decoration:none}.landing-page__information .account div.account__display-name .account__avatar{cursor:default}.landing-page__information .account__avatar-wrapper{margin-left:0;flex:0 0 auto}.landing-page__information .account__avatar{width:44px;height:44px;background-size:44px 44px}.landing-page__information .account .display-name{font-size:15px}.landing-page__information .account .display-name__account{font-size:14px}@media screen and (max-width: 960px){.landing-page__information .contact{margin-top:30px}}@media screen and (max-width: 700px){.landing-page__information{padding:25px 20px}}.landing-page__information,.landing-page__forms,.landing-page #mastodon-timeline{box-sizing:border-box;background:#d9e1e8;border-radius:4px;box-shadow:0 0 6px rgba(0,0,0,.1)}.landing-page__mascot{height:104px;position:relative;left:-40px;bottom:25px}.landing-page__mascot img{height:190px;width:auto}.landing-page__short-description .row{display:flex;flex-wrap:wrap;align-items:center;margin-bottom:40px}@media screen and (max-width: 700px){.landing-page__short-description .row{margin-bottom:20px}}.landing-page__short-description p a{color:#282c37}.landing-page__short-description h1{font-weight:500;color:#000;margin-bottom:0}.landing-page__short-description h1 small{color:#282c37}.landing-page__short-description h1 small span{color:#282c37}.landing-page__short-description p:last-child{margin-bottom:0}.landing-page__hero{margin-bottom:10px}.landing-page__hero img{display:block;margin:0;max-width:100%;height:auto;border-radius:4px}@media screen and (max-width: 840px){.landing-page .information-board .container-alt{padding-right:20px}.landing-page .information-board .panel{position:static;margin-top:20px;width:100%;border-radius:4px}.landing-page .information-board .panel .panel-header{text-align:center}}@media screen and (max-width: 675px){.landing-page .header-wrapper{padding-top:0}.landing-page .header-wrapper.compact{padding-bottom:0}.landing-page .header-wrapper.compact .hero .heading{text-align:initial}.landing-page .header .container-alt,.landing-page .features .container-alt{display:block}}.landing-page .cta{margin:20px}.landing{margin-bottom:100px}@media screen and (max-width: 738px){.landing{margin-bottom:0}}.landing__brand{display:flex;justify-content:center;align-items:center;padding:50px}.landing__brand svg{fill:#000;height:52px}@media screen and (max-width: 415px){.landing__brand{padding:0;margin-bottom:30px}}.landing .directory{margin-top:30px;background:transparent;box-shadow:none;border-radius:0}.landing .hero-widget{margin-top:30px;margin-bottom:0}.landing .hero-widget h4{padding:10px;font-weight:700;font-size:14px;color:#282c37}.landing .hero-widget__text{border-radius:0;padding-bottom:0}.landing .hero-widget__footer{background:#d9e1e8;padding:10px;border-radius:0 0 4px 4px;display:flex}.landing .hero-widget__footer__column{flex:1 1 50%}.landing .hero-widget .account{padding:10px 0;border-bottom:0}.landing .hero-widget .account .account__display-name{display:flex;align-items:center}.landing .hero-widget .account .account__avatar{width:44px;height:44px;background-size:44px 44px}.landing .hero-widget__counter{padding:10px}.landing .hero-widget__counter strong{font-family:\"mastodon-font-display\",sans-serif;font-size:15px;font-weight:700;display:block}.landing .hero-widget__counter span{font-size:14px;color:#282c37}.landing .simple_form .user_agreement .label_input>label{font-weight:400;color:#282c37}.landing .simple_form p.lead{color:#282c37;font-size:15px;line-height:20px;font-weight:400;margin-bottom:25px}.landing__grid{max-width:960px;margin:0 auto;display:grid;grid-template-columns:minmax(0, 50%) minmax(0, 50%);grid-gap:30px}@media screen and (max-width: 738px){.landing__grid{grid-template-columns:minmax(0, 100%);grid-gap:10px}.landing__grid__column-login{grid-row:1;display:flex;flex-direction:column}.landing__grid__column-login .box-widget{order:2;flex:0 0 auto}.landing__grid__column-login .hero-widget{margin-top:0;margin-bottom:10px;order:1;flex:0 0 auto}.landing__grid__column-registration{grid-row:2}.landing__grid .directory{margin-top:10px}}@media screen and (max-width: 415px){.landing__grid{grid-gap:0}.landing__grid .hero-widget{display:block;margin-bottom:0;box-shadow:none}.landing__grid .hero-widget__img,.landing__grid .hero-widget__img img,.landing__grid .hero-widget__footer{border-radius:0}.landing__grid .hero-widget,.landing__grid .box-widget,.landing__grid .directory__tag{border-bottom:1px solid #c0cdd9}.landing__grid .directory{margin-top:0}.landing__grid .directory__tag{margin-bottom:0}.landing__grid .directory__tag>a,.landing__grid .directory__tag>div{border-radius:0;box-shadow:none}.landing__grid .directory__tag:last-child{border-bottom:0}}.brand{position:relative;text-decoration:none}.brand__tagline{display:block;position:absolute;bottom:-10px;left:50px;width:300px;color:#9bcbed;text-decoration:none;font-size:14px}@media screen and (max-width: 415px){.brand__tagline{position:static;width:auto;margin-top:20px;color:#444b5d}}.table{width:100%;max-width:100%;border-spacing:0;border-collapse:collapse}.table th,.table td{padding:8px;line-height:18px;vertical-align:top;border-top:1px solid #d9e1e8;text-align:left;background:#e6ebf0}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #d9e1e8;border-top:0;font-weight:500}.table>tbody>tr>th{font-weight:500}.table>tbody>tr:nth-child(odd)>td,.table>tbody>tr:nth-child(odd)>th{background:#d9e1e8}.table a{color:#2b90d9;text-decoration:underline}.table a:hover{text-decoration:none}.table strong{font-weight:500}.table strong:lang(ja){font-weight:700}.table strong:lang(ko){font-weight:700}.table strong:lang(zh-CN){font-weight:700}.table strong:lang(zh-HK){font-weight:700}.table strong:lang(zh-TW){font-weight:700}.table.inline-table>tbody>tr:nth-child(odd)>td,.table.inline-table>tbody>tr:nth-child(odd)>th{background:transparent}.table.inline-table>tbody>tr:first-child>td,.table.inline-table>tbody>tr:first-child>th{border-top:0}.table.batch-table>thead>tr>th{background:#d9e1e8;border-top:1px solid #f2f5f7;border-bottom:1px solid #f2f5f7}.table.batch-table>thead>tr>th:first-child{border-radius:4px 0 0;border-left:1px solid #f2f5f7}.table.batch-table>thead>tr>th:last-child{border-radius:0 4px 0 0;border-right:1px solid #f2f5f7}.table--invites tbody td{vertical-align:middle}.table-wrapper{overflow:auto;margin-bottom:20px}samp{font-family:\"mastodon-font-monospace\",monospace}button.table-action-link{background:transparent;border:0;font:inherit}button.table-action-link,a.table-action-link{text-decoration:none;display:inline-block;margin-right:5px;padding:0 10px;color:#282c37;font-weight:500}button.table-action-link:hover,a.table-action-link:hover{color:#000}button.table-action-link i.fa,a.table-action-link i.fa{font-weight:400;margin-right:5px}button.table-action-link:first-child,a.table-action-link:first-child{padding-left:0}.batch-table__toolbar,.batch-table__row{display:flex}.batch-table__toolbar__select,.batch-table__row__select{box-sizing:border-box;padding:8px 16px;cursor:pointer;min-height:100%}.batch-table__toolbar__select input,.batch-table__row__select input{margin-top:8px}.batch-table__toolbar__select--aligned,.batch-table__row__select--aligned{display:flex;align-items:center}.batch-table__toolbar__select--aligned input,.batch-table__row__select--aligned input{margin-top:0}.batch-table__toolbar__actions,.batch-table__toolbar__content,.batch-table__row__actions,.batch-table__row__content{padding:8px 0;padding-right:16px;flex:1 1 auto}.batch-table__toolbar{border:1px solid #f2f5f7;background:#d9e1e8;border-radius:4px 0 0;height:47px;align-items:center}.batch-table__toolbar__actions{text-align:right;padding-right:11px}.batch-table__form{padding:16px;border:1px solid #f2f5f7;border-top:0;background:#d9e1e8}.batch-table__form .fields-row{padding-top:0;margin-bottom:0}.batch-table__row{border:1px solid #f2f5f7;border-top:0;background:#e6ebf0}@media screen and (max-width: 415px){.optional .batch-table__row:first-child{border-top:1px solid #f2f5f7}}.batch-table__row:hover{background:#dfe6ec}.batch-table__row:nth-child(even){background:#d9e1e8}.batch-table__row:nth-child(even):hover{background:#d3dce4}.batch-table__row__content{padding-top:12px;padding-bottom:16px}.batch-table__row__content--unpadded{padding:0}.batch-table__row__content--with-image{display:flex;align-items:center}.batch-table__row__content__image{flex:0 0 auto;display:flex;justify-content:center;align-items:center;margin-right:10px}.batch-table__row__content__image .emojione{width:32px;height:32px}.batch-table__row__content__text{flex:1 1 auto}.batch-table__row__content__extra{flex:0 0 auto;text-align:right;color:#282c37;font-weight:500}.batch-table__row .directory__tag{margin:0;width:100%}.batch-table__row .directory__tag a{background:transparent;border-radius:0}@media screen and (max-width: 415px){.batch-table.optional .batch-table__toolbar,.batch-table.optional .batch-table__row__select{display:none}}.batch-table .status__content{padding-top:0}.batch-table .status__content summary{display:list-item}.batch-table .status__content strong{font-weight:700}.batch-table .nothing-here{border:1px solid #f2f5f7;border-top:0;box-shadow:none}@media screen and (max-width: 415px){.batch-table .nothing-here{border-top:1px solid #f2f5f7}}@media screen and (max-width: 870px){.batch-table .accounts-table tbody td.optional{display:none}}.admin-wrapper{display:flex;justify-content:center;width:100%;min-height:100vh}.admin-wrapper .sidebar-wrapper{min-height:100vh;overflow:hidden;pointer-events:none;flex:1 1 auto}.admin-wrapper .sidebar-wrapper__inner{display:flex;justify-content:flex-end;background:#d9e1e8;height:100%}.admin-wrapper .sidebar{width:240px;padding:0;pointer-events:auto}.admin-wrapper .sidebar__toggle{display:none;background:#c0cdd9;height:48px}.admin-wrapper .sidebar__toggle__logo{flex:1 1 auto}.admin-wrapper .sidebar__toggle__logo a{display:inline-block;padding:15px}.admin-wrapper .sidebar__toggle__logo svg{fill:#000;height:20px;position:relative;bottom:-2px}.admin-wrapper .sidebar__toggle__icon{display:block;color:#282c37;text-decoration:none;flex:0 0 auto;font-size:20px;padding:15px}.admin-wrapper .sidebar__toggle a:hover,.admin-wrapper .sidebar__toggle a:focus,.admin-wrapper .sidebar__toggle a:active{background:#b3c3d1}.admin-wrapper .sidebar .logo{display:block;margin:40px auto;width:100px;height:100px}@media screen and (max-width: 600px){.admin-wrapper .sidebar>a:first-child{display:none}}.admin-wrapper .sidebar ul{list-style:none;border-radius:4px 0 0 4px;overflow:hidden;margin-bottom:20px}@media screen and (max-width: 600px){.admin-wrapper .sidebar ul{margin-bottom:0}}.admin-wrapper .sidebar ul a{display:block;padding:15px;color:#282c37;text-decoration:none;transition:all 200ms linear;transition-property:color,background-color;border-radius:4px 0 0 4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.admin-wrapper .sidebar ul a i.fa{margin-right:5px}.admin-wrapper .sidebar ul a:hover{color:#000;background-color:#e9eef2;transition:all 100ms linear;transition-property:color,background-color}.admin-wrapper .sidebar ul a.selected{background:#dfe6ec;border-radius:4px 0 0}.admin-wrapper .sidebar ul ul{background:#e6ebf0;border-radius:0 0 0 4px;margin:0}.admin-wrapper .sidebar ul ul a{border:0;padding:15px 35px}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a{color:#000;background-color:#2b90d9;border-bottom:0;border-radius:0}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a:hover{background-color:#2482c7}.admin-wrapper .sidebar>ul>.simple-navigation-active-leaf a{border-radius:4px 0 0 4px}.admin-wrapper .content-wrapper{box-sizing:border-box;width:100%;max-width:840px;flex:1 1 auto}@media screen and (max-width: 1080px){.admin-wrapper .sidebar-wrapper--empty{display:none}.admin-wrapper .sidebar-wrapper{width:240px;flex:0 0 auto}}@media screen and (max-width: 600px){.admin-wrapper .sidebar-wrapper{width:100%}}.admin-wrapper .content{padding:20px 15px;padding-top:60px;padding-left:25px}@media screen and (max-width: 600px){.admin-wrapper .content{max-width:none;padding:15px;padding-top:30px}}.admin-wrapper .content-heading{display:flex;padding-bottom:40px;border-bottom:1px solid #c0cdd9;margin:-15px -15px 40px 0;flex-wrap:wrap;align-items:center;justify-content:space-between}.admin-wrapper .content-heading>*{margin-top:15px;margin-right:15px}.admin-wrapper .content-heading-actions{display:inline-flex}.admin-wrapper .content-heading-actions>:not(:first-child){margin-left:5px}@media screen and (max-width: 600px){.admin-wrapper .content-heading{border-bottom:0;padding-bottom:0}}.admin-wrapper .content h2{color:#282c37;font-size:24px;line-height:28px;font-weight:400}@media screen and (max-width: 600px){.admin-wrapper .content h2{font-weight:700}}.admin-wrapper .content h3{color:#282c37;font-size:20px;line-height:28px;font-weight:400;margin-bottom:30px}.admin-wrapper .content h4{font-size:14px;font-weight:700;color:#282c37;padding-bottom:8px;margin-bottom:8px;border-bottom:1px solid #c0cdd9}.admin-wrapper .content h6{font-size:16px;color:#282c37;line-height:28px;font-weight:500}.admin-wrapper .content .fields-group h6{color:#000;font-weight:500}.admin-wrapper .content .directory__tag>a,.admin-wrapper .content .directory__tag>div{box-shadow:none}.admin-wrapper .content .directory__tag .table-action-link .fa{color:inherit}.admin-wrapper .content .directory__tag h4{font-size:18px;font-weight:700;color:#000;text-transform:none;padding-bottom:0;margin-bottom:0;border-bottom:0}.admin-wrapper .content>p{font-size:14px;line-height:21px;color:#282c37;margin-bottom:20px}.admin-wrapper .content>p strong{color:#000;font-weight:500}.admin-wrapper .content>p strong:lang(ja){font-weight:700}.admin-wrapper .content>p strong:lang(ko){font-weight:700}.admin-wrapper .content>p strong:lang(zh-CN){font-weight:700}.admin-wrapper .content>p strong:lang(zh-HK){font-weight:700}.admin-wrapper .content>p strong:lang(zh-TW){font-weight:700}.admin-wrapper .content hr{width:100%;height:0;border:0;border-bottom:1px solid rgba(176,192,207,.6);margin:20px 0}.admin-wrapper .content hr.spacer{height:1px;border:0}@media screen and (max-width: 600px){.admin-wrapper{display:block}.admin-wrapper .sidebar-wrapper{min-height:0}.admin-wrapper .sidebar{width:100%;padding:0;height:auto}.admin-wrapper .sidebar__toggle{display:flex}.admin-wrapper .sidebar>ul{display:none}.admin-wrapper .sidebar ul a,.admin-wrapper .sidebar ul ul a{border-radius:0;border-bottom:1px solid #ccd7e0;transition:none}.admin-wrapper .sidebar ul a:hover,.admin-wrapper .sidebar ul ul a:hover{transition:none}.admin-wrapper .sidebar ul ul{border-radius:0}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a{border-bottom-color:#2b90d9}}hr.spacer{width:100%;border:0;margin:20px 0;height:1px}body .muted-hint,.admin-wrapper .content .muted-hint{color:#282c37}body .muted-hint a,.admin-wrapper .content .muted-hint a{color:#2b90d9}body .positive-hint,.admin-wrapper .content .positive-hint{color:#4a905f;font-weight:500}body .negative-hint,.admin-wrapper .content .negative-hint{color:#df405a;font-weight:500}body .neutral-hint,.admin-wrapper .content .neutral-hint{color:#444b5d;font-weight:500}body .warning-hint,.admin-wrapper .content .warning-hint{color:#ca8f04;font-weight:500}.filters{display:flex;flex-wrap:wrap}.filters .filter-subset{flex:0 0 auto;margin:0 40px 20px 0}.filters .filter-subset:last-child{margin-bottom:30px}.filters .filter-subset ul{margin-top:5px;list-style:none}.filters .filter-subset ul li{display:inline-block;margin-right:5px}.filters .filter-subset strong{font-weight:500;font-size:13px}.filters .filter-subset strong:lang(ja){font-weight:700}.filters .filter-subset strong:lang(ko){font-weight:700}.filters .filter-subset strong:lang(zh-CN){font-weight:700}.filters .filter-subset strong:lang(zh-HK){font-weight:700}.filters .filter-subset strong:lang(zh-TW){font-weight:700}.filters .filter-subset a{display:inline-block;color:#282c37;text-decoration:none;font-size:13px;font-weight:500;border-bottom:2px solid #d9e1e8}.filters .filter-subset a:hover{color:#000;border-bottom:2px solid #c9d4de}.filters .filter-subset a.selected{color:#2b90d9;border-bottom:2px solid #2b90d9}.flavour-screen{display:block;margin:10px auto;max-width:100%}.flavour-description{display:block;font-size:16px;margin:10px 0}.flavour-description>p{margin:10px 0}.flavour-screen{display:block;margin:10px auto;max-width:100%}.flavour-description{display:block;font-size:16px;margin:10px 0}.flavour-description>p{margin:10px 0}.report-accounts{display:flex;flex-wrap:wrap;margin-bottom:20px}.report-accounts__item{display:flex;flex:250px;flex-direction:column;margin:0 5px}.report-accounts__item>strong{display:block;margin:0 0 10px -5px;font-weight:500;font-size:14px;line-height:18px;color:#282c37}.report-accounts__item>strong:lang(ja){font-weight:700}.report-accounts__item>strong:lang(ko){font-weight:700}.report-accounts__item>strong:lang(zh-CN){font-weight:700}.report-accounts__item>strong:lang(zh-HK){font-weight:700}.report-accounts__item>strong:lang(zh-TW){font-weight:700}.report-accounts__item .account-card{flex:1 1 auto}.report-status,.account-status{display:flex;margin-bottom:10px}.report-status .activity-stream,.account-status .activity-stream{flex:2 0 0;margin-right:20px;max-width:calc(100% - 60px)}.report-status .activity-stream .entry,.account-status .activity-stream .entry{border-radius:4px}.report-status__actions,.account-status__actions{flex:0 0 auto;display:flex;flex-direction:column}.report-status__actions .icon-button,.account-status__actions .icon-button{font-size:24px;width:24px;text-align:center;margin-bottom:10px}.simple_form.new_report_note,.simple_form.new_account_moderation_note{max-width:100%}.batch-form-box{display:flex;flex-wrap:wrap;margin-bottom:5px}.batch-form-box #form_status_batch_action{margin:0 5px 5px 0;font-size:14px}.batch-form-box input.button{margin:0 5px 5px 0}.batch-form-box .media-spoiler-toggle-buttons{margin-left:auto}.batch-form-box .media-spoiler-toggle-buttons .button{overflow:visible;margin:0 0 5px 5px;float:right}.back-link{margin-bottom:10px;font-size:14px}.back-link a{color:#2b90d9;text-decoration:none}.back-link a:hover{text-decoration:underline}.spacer{flex:1 1 auto}.log-entry{margin-bottom:20px;line-height:20px}.log-entry__header{display:flex;justify-content:flex-start;align-items:center;padding:10px;background:#d9e1e8;color:#282c37;border-radius:4px 4px 0 0;font-size:14px;position:relative}.log-entry__avatar{margin-right:10px}.log-entry__avatar .avatar{display:block;margin:0;border-radius:50%;width:40px;height:40px}.log-entry__content{max-width:calc(100% - 90px)}.log-entry__title{word-wrap:break-word}.log-entry__timestamp{color:#444b5d}.log-entry__extras{background:#c6d2dc;border-radius:0 0 4px 4px;padding:10px;color:#282c37;font-family:\"mastodon-font-monospace\",monospace;font-size:12px;word-wrap:break-word;min-height:20px}.log-entry__icon{font-size:28px;margin-right:10px;color:#444b5d}.log-entry__icon__overlay{position:absolute;top:10px;right:10px;width:10px;height:10px;border-radius:50%}.log-entry__icon__overlay.positive{background:#4a905f}.log-entry__icon__overlay.negative{background:#c1203b}.log-entry__icon__overlay.neutral{background:#2b90d9}.log-entry a,.log-entry .username,.log-entry .target{color:#282c37;text-decoration:none;font-weight:500}.log-entry .diff-old{color:#c1203b}.log-entry .diff-neutral{color:#282c37}.log-entry .diff-new{color:#4a905f}a.name-tag,.name-tag,a.inline-name-tag,.inline-name-tag{text-decoration:none;color:#282c37}a.name-tag .username,.name-tag .username,a.inline-name-tag .username,.inline-name-tag .username{font-weight:500}a.name-tag.suspended .username,.name-tag.suspended .username,a.inline-name-tag.suspended .username,.inline-name-tag.suspended .username{text-decoration:line-through;color:#c1203b}a.name-tag.suspended .avatar,.name-tag.suspended .avatar,a.inline-name-tag.suspended .avatar,.inline-name-tag.suspended .avatar{filter:grayscale(100%);opacity:.8}a.name-tag,.name-tag{display:flex;align-items:center}a.name-tag .avatar,.name-tag .avatar{display:block;margin:0;margin-right:5px;border-radius:50%}a.name-tag.suspended .avatar,.name-tag.suspended .avatar{filter:grayscale(100%);opacity:.8}.speech-bubble{margin-bottom:20px;border-left:4px solid #2b90d9}.speech-bubble.positive{border-left-color:#4a905f}.speech-bubble.negative{border-left-color:#c1203b}.speech-bubble.warning{border-left-color:#ca8f04}.speech-bubble__bubble{padding:16px;padding-left:14px;font-size:15px;line-height:20px;border-radius:4px 4px 4px 0;position:relative;font-weight:500}.speech-bubble__bubble a{color:#282c37}.speech-bubble__owner{padding:8px;padding-left:12px}.speech-bubble time{color:#444b5d}.report-card{background:#d9e1e8;border-radius:4px;margin-bottom:20px}.report-card__profile{display:flex;justify-content:space-between;align-items:center;padding:15px}.report-card__profile .account{padding:0;border:0}.report-card__profile .account__avatar-wrapper{margin-left:0}.report-card__profile__stats{flex:0 0 auto;font-weight:500;color:#282c37;text-align:right}.report-card__profile__stats a{color:inherit;text-decoration:none}.report-card__profile__stats a:focus,.report-card__profile__stats a:hover,.report-card__profile__stats a:active{color:#17191f}.report-card__profile__stats .red{color:#df405a}.report-card__summary__item{display:flex;justify-content:flex-start;border-top:1px solid #e6ebf0}.report-card__summary__item:hover{background:#d3dce4}.report-card__summary__item__reported-by,.report-card__summary__item__assigned{padding:15px;flex:0 0 auto;box-sizing:border-box;width:150px;color:#282c37}.report-card__summary__item__reported-by,.report-card__summary__item__reported-by .username,.report-card__summary__item__assigned,.report-card__summary__item__assigned .username{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.report-card__summary__item__content{flex:1 1 auto;max-width:calc(100% - 300px)}.report-card__summary__item__content__icon{color:#444b5d;margin-right:4px;font-weight:500}.report-card__summary__item__content a{display:block;box-sizing:border-box;width:100%;padding:15px;text-decoration:none;color:#282c37}.one-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ellipsized-ip{display:inline-block;max-width:120px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.admin-account-bio{display:flex;flex-wrap:wrap;margin:0 -5px;margin-top:20px}.admin-account-bio>div{box-sizing:border-box;padding:0 5px;margin-bottom:10px;flex:1 0 50%}.admin-account-bio .account__header__fields,.admin-account-bio .account__header__content{background:#c0cdd9;border-radius:4px;height:100%}.admin-account-bio .account__header__fields{margin:0;border:0}.admin-account-bio .account__header__fields a{color:#217aba}.admin-account-bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.admin-account-bio .account__header__fields .verified a{color:#4a905f}.admin-account-bio .account__header__content{box-sizing:border-box;padding:20px;color:#000}.center-text{text-align:center}.dashboard__counters{display:flex;flex-wrap:wrap;margin:0 -5px;margin-bottom:20px}.dashboard__counters>div{box-sizing:border-box;flex:0 0 33.333%;padding:0 5px;margin-bottom:10px}.dashboard__counters>div>div,.dashboard__counters>div>a{padding:20px;background:#ccd7e0;border-radius:4px;box-sizing:border-box;height:100%}.dashboard__counters>div>a{text-decoration:none;color:inherit;display:block}.dashboard__counters>div>a:hover,.dashboard__counters>div>a:focus,.dashboard__counters>div>a:active{background:#c0cdd9}.dashboard__counters__num,.dashboard__counters__text{text-align:center;font-weight:500;font-size:24px;line-height:21px;color:#000;font-family:\"mastodon-font-display\",sans-serif;margin-bottom:20px;line-height:30px}.dashboard__counters__text{font-size:18px}.dashboard__counters__label{font-size:14px;color:#282c37;text-align:center;font-weight:500}.dashboard__widgets{display:flex;flex-wrap:wrap;margin:0 -5px}.dashboard__widgets>div{flex:0 0 33.333%;margin-bottom:20px}.dashboard__widgets>div>div{padding:0 5px}.dashboard__widgets a:not(.name-tag){color:#282c37;font-weight:500;text-decoration:none}body.rtl{direction:rtl}body.rtl .column-header>button{text-align:right;padding-left:0;padding-right:15px}body.rtl .radio-button__input{margin-right:0;margin-left:10px}body.rtl .directory__card__bar .display-name{margin-left:0;margin-right:15px}body.rtl .display-name{text-align:right}body.rtl .notification__message{margin-left:0;margin-right:68px}body.rtl .drawer__inner__mastodon>img{transform:scaleX(-1)}body.rtl .notification__favourite-icon-wrapper{left:auto;right:-26px}body.rtl .landing-page__logo{margin-right:0;margin-left:20px}body.rtl .landing-page .features-list .features-list__row .visual{margin-left:0;margin-right:15px}body.rtl .column-link__icon,body.rtl .column-header__icon{margin-right:0;margin-left:5px}body.rtl .compose-form .compose-form__buttons-wrapper .character-counter__wrapper{margin-right:0;margin-left:4px}body.rtl .navigation-bar__profile{margin-left:0;margin-right:8px}body.rtl .search__input{padding-right:10px;padding-left:30px}body.rtl .search__icon .fa{right:auto;left:10px}body.rtl .columns-area{direction:rtl}body.rtl .column-header__buttons{left:0;right:auto;margin-left:0;margin-right:-15px}body.rtl .column-inline-form .icon-button{margin-left:0;margin-right:5px}body.rtl .column-header__links .text-btn{margin-left:10px;margin-right:0}body.rtl .account__avatar-wrapper{float:right}body.rtl .column-header__back-button{padding-left:5px;padding-right:0}body.rtl .column-header__setting-arrows{float:left}body.rtl .setting-toggle__label{margin-left:0;margin-right:8px}body.rtl .status__avatar{left:auto;right:10px}body.rtl .status,body.rtl .activity-stream .status.light{padding-left:10px;padding-right:68px}body.rtl .status__info .status__display-name,body.rtl .activity-stream .status.light .status__display-name{padding-left:25px;padding-right:0}body.rtl .activity-stream .pre-header{padding-right:68px;padding-left:0}body.rtl .status__prepend{margin-left:0;margin-right:68px}body.rtl .status__prepend-icon-wrapper{left:auto;right:-26px}body.rtl .activity-stream .pre-header .pre-header__icon{left:auto;right:42px}body.rtl .account__avatar-overlay-overlay{right:auto;left:0}body.rtl .column-back-button--slim-button{right:auto;left:0}body.rtl .status__relative-time,body.rtl .activity-stream .status.light .status__header .status__meta{float:left}body.rtl .status__action-bar__counter{margin-right:0;margin-left:11px}body.rtl .status__action-bar__counter .status__action-bar-button{margin-right:0;margin-left:4px}body.rtl .status__action-bar-button{float:right;margin-right:0;margin-left:18px}body.rtl .status__action-bar-dropdown{float:right}body.rtl .privacy-dropdown__dropdown{margin-left:0;margin-right:40px}body.rtl .privacy-dropdown__option__icon{margin-left:10px;margin-right:0}body.rtl .detailed-status__display-name .display-name{text-align:right}body.rtl .detailed-status__display-avatar{margin-right:0;margin-left:10px;float:right}body.rtl .detailed-status__favorites,body.rtl .detailed-status__reblogs{margin-left:0;margin-right:6px}body.rtl .fa-ul{margin-left:2.14285714em}body.rtl .fa-li{left:auto;right:-2.14285714em}body.rtl .admin-wrapper{direction:rtl}body.rtl .admin-wrapper .sidebar ul a i.fa,body.rtl a.table-action-link i.fa{margin-right:0;margin-left:5px}body.rtl .simple_form .check_boxes .checkbox label{padding-left:0;padding-right:25px}body.rtl .simple_form .input.with_label.boolean label.checkbox{padding-left:25px;padding-right:0}body.rtl .simple_form .check_boxes .checkbox input[type=checkbox],body.rtl .simple_form .input.boolean input[type=checkbox]{left:auto;right:0}body.rtl .simple_form .input.radio_buttons .radio{left:auto;right:0}body.rtl .simple_form .input.radio_buttons .radio>label{padding-right:28px;padding-left:0}body.rtl .simple_form .input-with-append .input input{padding-left:142px;padding-right:0}body.rtl .simple_form .input.boolean label.checkbox{left:auto;right:0}body.rtl .simple_form .input.boolean .label_input,body.rtl .simple_form .input.boolean .hint{padding-left:0;padding-right:28px}body.rtl .simple_form .label_input__append{right:auto;left:3px}body.rtl .simple_form .label_input__append::after{right:auto;left:0;background-image:linear-gradient(to left, rgba(249, 250, 251, 0), #f9fafb)}body.rtl .simple_form select{background:#f9fafb url(\"data:image/svg+xml;utf8,\") no-repeat left 8px center/auto 16px}body.rtl .table th,body.rtl .table td{text-align:right}body.rtl .filters .filter-subset{margin-right:0;margin-left:45px}body.rtl .landing-page .header-wrapper .mascot{right:60px;left:auto}body.rtl .landing-page__call-to-action .row__information-board{direction:rtl}body.rtl .landing-page .header .hero .floats .float-1{left:-120px;right:auto}body.rtl .landing-page .header .hero .floats .float-2{left:210px;right:auto}body.rtl .landing-page .header .hero .floats .float-3{left:110px;right:auto}body.rtl .landing-page .header .links .brand img{left:0}body.rtl .landing-page .fa-external-link{padding-right:5px;padding-left:0 !important}body.rtl .landing-page .features #mastodon-timeline{margin-right:0;margin-left:30px}@media screen and (min-width: 631px){body.rtl .column,body.rtl .drawer{padding-left:5px;padding-right:5px}body.rtl .column:first-child,body.rtl .drawer:first-child{padding-left:5px;padding-right:10px}body.rtl .columns-area>div .column,body.rtl .columns-area>div .drawer{padding-left:5px;padding-right:5px}}body.rtl .columns-area--mobile .column,body.rtl .columns-area--mobile .drawer{padding-left:0;padding-right:0}body.rtl .public-layout .header .nav-button{margin-left:8px;margin-right:0}body.rtl .public-layout .public-account-header__tabs{margin-left:0;margin-right:20px}body.rtl .landing-page__information .account__display-name{margin-right:0;margin-left:5px}body.rtl .landing-page__information .account__avatar-wrapper{margin-left:12px;margin-right:0}body.rtl .card__bar .display-name{margin-left:0;margin-right:15px;text-align:right}body.rtl .fa-chevron-left::before{content:\"\"}body.rtl .fa-chevron-right::before{content:\"\"}body.rtl .column-back-button__icon{margin-right:0;margin-left:5px}body.rtl .column-header__setting-arrows .column-header__setting-btn:last-child{padding-left:0;padding-right:10px}body.rtl .simple_form .input.radio_buttons .radio>label input{left:auto;right:0}.emojione[title=\":wavy_dash:\"],.emojione[title=\":waving_black_flag:\"],.emojione[title=\":water_buffalo:\"],.emojione[title=\":video_game:\"],.emojione[title=\":video_camera:\"],.emojione[title=\":vhs:\"],.emojione[title=\":turkey:\"],.emojione[title=\":tophat:\"],.emojione[title=\":top:\"],.emojione[title=\":tm:\"],.emojione[title=\":telephone_receiver:\"],.emojione[title=\":spider:\"],.emojione[title=\":speaking_head_in_silhouette:\"],.emojione[title=\":spades:\"],.emojione[title=\":soon:\"],.emojione[title=\":registered:\"],.emojione[title=\":on:\"],.emojione[title=\":musical_score:\"],.emojione[title=\":movie_camera:\"],.emojione[title=\":mortar_board:\"],.emojione[title=\":microphone:\"],.emojione[title=\":male-guard:\"],.emojione[title=\":lower_left_fountain_pen:\"],.emojione[title=\":lower_left_ballpoint_pen:\"],.emojione[title=\":kaaba:\"],.emojione[title=\":joystick:\"],.emojione[title=\":hole:\"],.emojione[title=\":hocho:\"],.emojione[title=\":heavy_plus_sign:\"],.emojione[title=\":heavy_multiplication_x:\"],.emojione[title=\":heavy_minus_sign:\"],.emojione[title=\":heavy_dollar_sign:\"],.emojione[title=\":heavy_division_sign:\"],.emojione[title=\":heavy_check_mark:\"],.emojione[title=\":guardsman:\"],.emojione[title=\":gorilla:\"],.emojione[title=\":fried_egg:\"],.emojione[title=\":film_projector:\"],.emojione[title=\":female-guard:\"],.emojione[title=\":end:\"],.emojione[title=\":electric_plug:\"],.emojione[title=\":eight_pointed_black_star:\"],.emojione[title=\":dark_sunglasses:\"],.emojione[title=\":currency_exchange:\"],.emojione[title=\":curly_loop:\"],.emojione[title=\":copyright:\"],.emojione[title=\":clubs:\"],.emojione[title=\":camera_with_flash:\"],.emojione[title=\":camera:\"],.emojione[title=\":busts_in_silhouette:\"],.emojione[title=\":bust_in_silhouette:\"],.emojione[title=\":bowling:\"],.emojione[title=\":bomb:\"],.emojione[title=\":black_small_square:\"],.emojione[title=\":black_nib:\"],.emojione[title=\":black_medium_square:\"],.emojione[title=\":black_medium_small_square:\"],.emojione[title=\":black_large_square:\"],.emojione[title=\":black_heart:\"],.emojione[title=\":black_circle:\"],.emojione[title=\":back:\"],.emojione[title=\":ant:\"],.emojione[title=\":8ball:\"]{filter:drop-shadow(1px 1px 0 #ffffff) drop-shadow(-1px 1px 0 #ffffff) drop-shadow(1px -1px 0 #ffffff) drop-shadow(-1px -1px 0 #ffffff);transform:scale(0.71)}html{scrollbar-color:#d9e1e8 rgba(217,225,232,.25)}.button{color:#fff}.button.button-alternative-2{color:#fff}.status-card__actions button,.status-card__actions a{color:rgba(255,255,255,.8)}.status-card__actions button:hover,.status-card__actions button:active,.status-card__actions button:focus,.status-card__actions a:hover,.status-card__actions a:active,.status-card__actions a:focus{color:#fff}.column>.scrollable,.getting-started,.column-inline-form,.error-column,.regeneration-indicator{background:#fff;border:1px solid #c0cdd9;border-top:0}.directory__card__img{background:#b3c3d1}.filter-form,.directory__card__bar{background:#fff;border-bottom:1px solid #c0cdd9}.scrollable .directory__list{width:calc(100% + 2px);margin-left:-1px;margin-right:-1px}.directory__card,.table-of-contents{border:1px solid #c0cdd9}.column-back-button,.column-header{background:#fff;border:1px solid #c0cdd9}@media screen and (max-width: 415px){.column-back-button,.column-header{border-top:0}}.column-back-button--slim-button,.column-header--slim-button{top:-50px;right:0}.column-header__back-button,.column-header__button,.column-header__button.active,.account__header__bar,.directory__card__extra{background:#fff}.column-header__button.active{color:#2b90d9}.column-header__button.active:hover,.column-header__button.active:active,.column-header__button.active:focus{color:#2b90d9;background:#fff}.account__header__bar .avatar .account__avatar{border-color:#fff}.getting-started__footer a{color:#282c37;text-decoration:underline}.confirmation-modal__secondary-button,.confirmation-modal__cancel-button,.mute-modal__cancel-button,.block-modal__cancel-button{color:#86a0b6}.confirmation-modal__secondary-button:hover,.confirmation-modal__secondary-button:focus,.confirmation-modal__secondary-button:active,.confirmation-modal__cancel-button:hover,.confirmation-modal__cancel-button:focus,.confirmation-modal__cancel-button:active,.mute-modal__cancel-button:hover,.mute-modal__cancel-button:focus,.mute-modal__cancel-button:active,.block-modal__cancel-button:hover,.block-modal__cancel-button:focus,.block-modal__cancel-button:active{color:#000}.column-subheading{background:#e6ebf0;border-bottom:1px solid #c0cdd9}.getting-started .column-link,.scrollable .column-link{background:#fff;border-bottom:1px solid #c0cdd9}.getting-started .column-link:hover,.getting-started .column-link:active,.getting-started .column-link:focus,.scrollable .column-link:hover,.scrollable .column-link:active,.scrollable .column-link:focus{background:#d9e1e8}.getting-started .navigation-bar{border-top:1px solid #c0cdd9;border-bottom:1px solid #c0cdd9}@media screen and (max-width: 415px){.getting-started .navigation-bar{border-top:0}}.compose-form__autosuggest-wrapper,.poll__text input[type=text],.compose-form .spoiler-input__input,.compose-form__poll-wrapper select,.search__input,.setting-text,.box-widget input[type=text],.box-widget input[type=email],.box-widget input[type=password],.box-widget textarea,.statuses-grid .detailed-status,.audio-player{border:1px solid #c0cdd9}@media screen and (max-width: 415px){.search__input{border-top:0;border-bottom:0}}.list-editor .search .search__input{border-top:0;border-bottom:0}.compose-form__poll-wrapper select{background:#fff url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center/auto 16px}.compose-form__poll-wrapper,.compose-form__poll-wrapper .poll__footer{border-top-color:#c0cdd9}.notification__filter-bar{border:1px solid #c0cdd9;border-top:0}.compose-form .compose-form__buttons-wrapper{background:#d9e1e8;border:1px solid #c0cdd9;border-top:0}.drawer__header,.drawer__inner{background:#fff;border:1px solid #c0cdd9}.drawer__inner__mastodon{background:#fff url('data:image/svg+xml;utf8,') no-repeat bottom/100% auto}.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button{color:#ededed}.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button:active,.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button:focus,.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button:hover{color:#fff}.compose-form .compose-form__modifiers .compose-form__upload-description input{color:#ededed}.compose-form .compose-form__modifiers .compose-form__upload-description input::placeholder{color:#ededed}.compose-form .compose-form__buttons-wrapper{background:#ecf0f4}.compose-form .autosuggest-textarea__suggestions{background:#ecf0f4}.compose-form .autosuggest-textarea__suggestions__item:hover,.compose-form .autosuggest-textarea__suggestions__item:focus,.compose-form .autosuggest-textarea__suggestions__item:active,.compose-form .autosuggest-textarea__suggestions__item.selected{background:#ccd7e0}.emoji-mart-bar{border-color:#ccd7e0}.emoji-mart-bar:first-child{background:#ecf0f4}.emoji-mart-search input{background:rgba(217,225,232,.3);border-color:#d9e1e8}.focusable:focus{background:#d9e1e8}.status.status-direct{background:#ccd7e0}.focusable:focus .status.status-direct{background:#c0cdd9}.detailed-status,.detailed-status__action-bar{background:#fff}.reply-indicator__content .status__content__spoiler-link,.status__content .status__content__spoiler-link{background:#d9e1e8}.reply-indicator__content .status__content__spoiler-link:hover,.status__content .status__content__spoiler-link:hover{background:#ccd7e0}.media-spoiler,.video-player__spoiler{background:#d9e1e8}.privacy-dropdown.active .privacy-dropdown__value.active .icon-button{color:#fff}.account-gallery__item a{background-color:#d9e1e8}.dropdown-menu{background:#fff}.dropdown-menu__arrow.left{border-left-color:#fff}.dropdown-menu__arrow.top{border-top-color:#fff}.dropdown-menu__arrow.bottom{border-bottom-color:#fff}.dropdown-menu__arrow.right{border-right-color:#fff}.dropdown-menu__item a{background:#fff;color:#282c37}.privacy-dropdown__option.active,.privacy-dropdown__option:hover,.privacy-dropdown__option.active .privacy-dropdown__option__content,.privacy-dropdown__option.active .privacy-dropdown__option__content strong,.privacy-dropdown__option:hover .privacy-dropdown__option__content,.privacy-dropdown__option:hover .privacy-dropdown__option__content strong,.dropdown-menu__item a:active,.dropdown-menu__item a:focus,.dropdown-menu__item a:hover,.actions-modal ul li:not(:empty) a.active,.actions-modal ul li:not(:empty) a.active button,.actions-modal ul li:not(:empty) a:active,.actions-modal ul li:not(:empty) a:active button,.actions-modal ul li:not(:empty) a:focus,.actions-modal ul li:not(:empty) a:focus button,.actions-modal ul li:not(:empty) a:hover,.actions-modal ul li:not(:empty) a:hover button,.admin-wrapper .sidebar ul .simple-navigation-active-leaf a,.simple_form .block-button,.simple_form .button,.simple_form button{color:#fff}.dropdown-menu__separator{border-bottom-color:#ccd7e0}.actions-modal,.boost-modal,.confirmation-modal,.mute-modal,.block-modal,.report-modal,.embed-modal,.error-modal,.onboarding-modal,.report-modal__comment .setting-text__wrapper,.report-modal__comment .setting-text{background:#fff;border:1px solid #c0cdd9}.report-modal__comment{border-right-color:#c0cdd9}.report-modal__container{border-top-color:#c0cdd9}.column-header__collapsible-inner{background:#e6ebf0;border:1px solid #c0cdd9;border-top:0}.focal-point__preview strong{color:#fff}.boost-modal__action-bar,.confirmation-modal__action-bar,.mute-modal__action-bar,.block-modal__action-bar,.onboarding-modal__paginator,.error-modal__footer{background:#ecf0f4}.boost-modal__action-bar .onboarding-modal__nav:hover,.boost-modal__action-bar .onboarding-modal__nav:focus,.boost-modal__action-bar .onboarding-modal__nav:active,.boost-modal__action-bar .error-modal__nav:hover,.boost-modal__action-bar .error-modal__nav:focus,.boost-modal__action-bar .error-modal__nav:active,.confirmation-modal__action-bar .onboarding-modal__nav:hover,.confirmation-modal__action-bar .onboarding-modal__nav:focus,.confirmation-modal__action-bar .onboarding-modal__nav:active,.confirmation-modal__action-bar .error-modal__nav:hover,.confirmation-modal__action-bar .error-modal__nav:focus,.confirmation-modal__action-bar .error-modal__nav:active,.mute-modal__action-bar .onboarding-modal__nav:hover,.mute-modal__action-bar .onboarding-modal__nav:focus,.mute-modal__action-bar .onboarding-modal__nav:active,.mute-modal__action-bar .error-modal__nav:hover,.mute-modal__action-bar .error-modal__nav:focus,.mute-modal__action-bar .error-modal__nav:active,.block-modal__action-bar .onboarding-modal__nav:hover,.block-modal__action-bar .onboarding-modal__nav:focus,.block-modal__action-bar .onboarding-modal__nav:active,.block-modal__action-bar .error-modal__nav:hover,.block-modal__action-bar .error-modal__nav:focus,.block-modal__action-bar .error-modal__nav:active,.onboarding-modal__paginator .onboarding-modal__nav:hover,.onboarding-modal__paginator .onboarding-modal__nav:focus,.onboarding-modal__paginator .onboarding-modal__nav:active,.onboarding-modal__paginator .error-modal__nav:hover,.onboarding-modal__paginator .error-modal__nav:focus,.onboarding-modal__paginator .error-modal__nav:active,.error-modal__footer .onboarding-modal__nav:hover,.error-modal__footer .onboarding-modal__nav:focus,.error-modal__footer .onboarding-modal__nav:active,.error-modal__footer .error-modal__nav:hover,.error-modal__footer .error-modal__nav:focus,.error-modal__footer .error-modal__nav:active{background-color:#fff}.display-case__case{background:#fff}.embed-modal .embed-modal__container .embed-modal__html{background:#fff;border:1px solid #c0cdd9}.embed-modal .embed-modal__container .embed-modal__html:focus{border-color:#b3c3d1;background:#fff}.react-toggle-track{background:#282c37}.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track{background:#3d4455}.react-toggle.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track{background:#2074b1}.empty-column-indicator,.error-column{color:#000;background:#fff}.tabs-bar{background:#fff;border:1px solid #c0cdd9;border-bottom:0}@media screen and (max-width: 415px){.tabs-bar{border-top:0}}.tabs-bar__link{padding-bottom:14px;border-bottom-width:1px;border-bottom-color:#c0cdd9}.tabs-bar__link:hover,.tabs-bar__link:active,.tabs-bar__link:focus{background:#d9e1e8}.tabs-bar__link.active:hover,.tabs-bar__link.active:active,.tabs-bar__link.active:focus{background:transparent;border-bottom-color:#2b90d9}.activity-stream-tabs{background:#fff;border-bottom-color:#c0cdd9}.box-widget,.nothing-here,.page-header,.directory__tag>a,.directory__tag>div,.landing-page__call-to-action,.contact-widget,.landing .hero-widget__text,.landing-page__information.contact-widget{background:#fff;border:1px solid #c0cdd9}@media screen and (max-width: 415px){.box-widget,.nothing-here,.page-header,.directory__tag>a,.directory__tag>div,.landing-page__call-to-action,.contact-widget,.landing .hero-widget__text,.landing-page__information.contact-widget{border-left:0;border-right:0;border-top:0}}.landing .hero-widget__text{border-top:0;border-bottom:0}.simple_form input[type=text]:hover,.simple_form input[type=number]:hover,.simple_form input[type=email]:hover,.simple_form input[type=password]:hover,.simple_form textarea:hover{border-color:#b3c3d1}.landing .hero-widget__footer{background:#fff;border:1px solid #c0cdd9;border-top:0}@media screen and (max-width: 415px){.landing .hero-widget__footer{border:0}}.brand__tagline{color:#282c37}.directory__tag>a:hover,.directory__tag>a:active,.directory__tag>a:focus{background:#d9e1e8}@media screen and (max-width: 415px){.directory__tag>a{border:0}}.directory__tag.active>a,.directory__tag.active>div{border-color:#2b90d9}.directory__tag.active>a,.directory__tag.active>a h4,.directory__tag.active>a h4 small,.directory__tag.active>a .fa,.directory__tag.active>a .trends__item__current,.directory__tag.active>div,.directory__tag.active>div h4,.directory__tag.active>div h4 small,.directory__tag.active>div .fa,.directory__tag.active>div .trends__item__current{color:#fff}.directory__tag.active>a:hover,.directory__tag.active>a:active,.directory__tag.active>a:focus,.directory__tag.active>div:hover,.directory__tag.active>div:active,.directory__tag.active>div:focus{background:#2b90d9}.batch-table__toolbar,.batch-table__row,.batch-table .nothing-here{border-color:#c0cdd9}.activity-stream{border:1px solid #c0cdd9}.activity-stream--under-tabs{border-top:0}.activity-stream .entry{background:#fff}.activity-stream .entry .detailed-status.light,.activity-stream .entry .more.light,.activity-stream .entry .status.light{border-bottom-color:#c0cdd9}.activity-stream .status.light .status__content{color:#000}.activity-stream .status.light .display-name strong{color:#000}.accounts-grid .account-grid-card .controls .icon-button{color:#282c37}.accounts-grid .account-grid-card .name a{color:#000}.accounts-grid .account-grid-card .username{color:#282c37}.accounts-grid .account-grid-card .account__header__content{color:#000}.simple_form .warning,.table-form .warning{box-shadow:none;background:rgba(223,64,90,.5);text-shadow:none}.simple_form .recommended,.table-form .recommended{border-color:#2b90d9;color:#2b90d9;background-color:rgba(43,144,217,.1)}.compose-form .compose-form__warning{border-color:#2b90d9;background-color:rgba(43,144,217,.1)}.compose-form .compose-form__warning,.compose-form .compose-form__warning a{color:#2b90d9}.status__content a,.reply-indicator__content a{color:#2b90d9}.button.logo-button{color:#fff}.button.logo-button svg{fill:#fff}.public-layout .account__section-headline{border:1px solid #c0cdd9}@media screen and (max-width: 415px){.public-layout .account__section-headline{border-top:0}}.public-layout .header,.public-layout .public-account-header,.public-layout .public-account-bio{box-shadow:none}.public-layout .public-account-bio,.public-layout .hero-widget__text{background:#fff;border:1px solid #c0cdd9}.public-layout .header{background:#d9e1e8;border:1px solid #c0cdd9}@media screen and (max-width: 415px){.public-layout .header{border:0}}.public-layout .header .brand:hover,.public-layout .header .brand:focus,.public-layout .header .brand:active{background:#ccd7e0}.public-layout .public-account-header__image{background:#b3c3d1}.public-layout .public-account-header__image::after{box-shadow:none}.public-layout .public-account-header__bar::before{background:#fff;border:1px solid #c0cdd9;border-top:0}.public-layout .public-account-header__bar .avatar img{border-color:#fff}@media screen and (max-width: 600px){.public-layout .public-account-header__bar{background:#fff;border:1px solid #c0cdd9;border-top:0}}.public-layout .public-account-header__tabs__name h1,.public-layout .public-account-header__tabs__name h1 small{color:#fff}@media screen and (max-width: 600px){.public-layout .public-account-header__tabs__name h1,.public-layout .public-account-header__tabs__name h1 small{color:#000}}.public-layout .public-account-header__extra .public-account-bio{border:0}.public-layout .public-account-header__extra .public-account-bio .account__header__fields{border-color:#c0cdd9}.notification__filter-bar button.active::after,.account__section-headline a.active::after{border-color:transparent transparent #fff}.hero-widget,.box-widget,.contact-widget,.landing-page__information.contact-widget,.moved-account-widget,.memoriam-widget,.activity-stream,.nothing-here,.directory__tag>a,.directory__tag>div,.card>a,.page-header,.compose-form .compose-form__warning{box-shadow:none}.audio-player .video-player__controls button,.audio-player .video-player__time-sep,.audio-player .video-player__time-current,.audio-player .video-player__time-total{color:#000}","/* http://meyerweb.com/eric/tools/css/reset/\n v2.0 | 20110126\n License: none (public domain)\n*/\n\nhtml, body, div, span, applet, object, iframe,\nh1, h2, h3, h4, h5, h6, p, blockquote, pre,\na, abbr, acronym, address, big, cite, code,\ndel, dfn, em, img, ins, kbd, q, s, samp,\nsmall, strike, strong, sub, sup, tt, var,\nb, u, i, center,\ndl, dt, dd, ol, ul, li,\nfieldset, form, label, legend,\ntable, caption, tbody, tfoot, thead, tr, th, td,\narticle, aside, canvas, details, embed,\nfigure, figcaption, footer, header, hgroup,\nmenu, nav, output, ruby, section, summary,\ntime, mark, audio, video {\n margin: 0;\n padding: 0;\n border: 0;\n font-size: 100%;\n font: inherit;\n vertical-align: baseline;\n}\n\n/* HTML5 display-role reset for older browsers */\narticle, aside, details, figcaption, figure,\nfooter, header, hgroup, menu, nav, section {\n display: block;\n}\n\nbody {\n line-height: 1;\n}\n\nol, ul {\n list-style: none;\n}\n\nblockquote, q {\n quotes: none;\n}\n\nblockquote:before, blockquote:after,\nq:before, q:after {\n content: '';\n content: none;\n}\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\nhtml {\n scrollbar-color: lighten($ui-base-color, 4%) rgba($base-overlay-background, 0.1);\n}\n\n::-webkit-scrollbar {\n width: 12px;\n height: 12px;\n}\n\n::-webkit-scrollbar-thumb {\n background: lighten($ui-base-color, 4%);\n border: 0px none $base-border-color;\n border-radius: 50px;\n}\n\n::-webkit-scrollbar-thumb:hover {\n background: lighten($ui-base-color, 6%);\n}\n\n::-webkit-scrollbar-thumb:active {\n background: lighten($ui-base-color, 4%);\n}\n\n::-webkit-scrollbar-track {\n border: 0px none $base-border-color;\n border-radius: 0;\n background: rgba($base-overlay-background, 0.1);\n}\n\n::-webkit-scrollbar-track:hover {\n background: $ui-base-color;\n}\n\n::-webkit-scrollbar-track:active {\n background: $ui-base-color;\n}\n\n::-webkit-scrollbar-corner {\n background: transparent;\n}\n","// Dependent colors\n$black: #000000;\n$white: #ffffff;\n\n$classic-base-color: #282c37;\n$classic-primary-color: #9baec8;\n$classic-secondary-color: #d9e1e8;\n$classic-highlight-color: #2b90d9;\n\n// Differences\n$success-green: lighten(#3c754d, 8%);\n\n$base-overlay-background: $white !default;\n$valid-value-color: $success-green !default;\n\n$ui-base-color: $classic-secondary-color !default;\n$ui-base-lighter-color: #b0c0cf;\n$ui-primary-color: #9bcbed;\n$ui-secondary-color: $classic-base-color !default;\n$ui-highlight-color: #2b90d9;\n\n$primary-text-color: $black !default;\n$darker-text-color: $classic-base-color !default;\n$dark-text-color: #444b5d;\n$action-button-color: #606984;\n\n$inverted-text-color: $black !default;\n$lighter-text-color: $classic-base-color !default;\n$light-text-color: #444b5d;\n\n//Newly added colors\n$account-background-color: $white !default;\n\n//Invert darkened and lightened colors\n@function darken($color, $amount) {\n @return hsl(hue($color), saturation($color), lightness($color) + $amount);\n}\n\n@function lighten($color, $amount) {\n @return hsl(hue($color), saturation($color), lightness($color) - $amount);\n}\n","@function hex-color($color) {\n @if type-of($color) == 'color' {\n $color: str-slice(ie-hex-str($color), 4);\n }\n\n @return '%23' + unquote($color);\n}\n\nbody {\n font-family: $font-sans-serif, sans-serif;\n background: darken($ui-base-color, 7%);\n font-size: 13px;\n line-height: 18px;\n font-weight: 400;\n color: $primary-text-color;\n text-rendering: optimizelegibility;\n font-feature-settings: \"kern\";\n text-size-adjust: none;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n -webkit-tap-highlight-color: transparent;\n\n &.system-font {\n // system-ui => standard property (Chrome/Android WebView 56+, Opera 43+, Safari 11+)\n // -apple-system => Safari <11 specific\n // BlinkMacSystemFont => Chrome <56 on macOS specific\n // Segoe UI => Windows 7/8/10\n // Oxygen => KDE\n // Ubuntu => Unity/Ubuntu\n // Cantarell => GNOME\n // Fira Sans => Firefox OS\n // Droid Sans => Older Androids (<4.0)\n // Helvetica Neue => Older macOS <10.11\n // $font-sans-serif => web-font (Roboto) fallback and newer Androids (>=4.0)\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Oxygen\", \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", $font-sans-serif, sans-serif;\n }\n\n &.app-body {\n padding: 0;\n\n &.layout-single-column {\n height: auto;\n min-height: 100vh;\n overflow-y: scroll;\n }\n\n &.layout-multiple-columns {\n position: absolute;\n width: 100%;\n height: 100%;\n }\n\n &.with-modals--active {\n overflow-y: hidden;\n }\n }\n\n &.lighter {\n background: $ui-base-color;\n }\n\n &.with-modals {\n overflow-x: hidden;\n overflow-y: scroll;\n\n &--active {\n overflow-y: hidden;\n }\n }\n\n &.player {\n text-align: center;\n }\n\n &.embed {\n background: lighten($ui-base-color, 4%);\n margin: 0;\n padding-bottom: 0;\n\n .container {\n position: absolute;\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n }\n\n &.admin {\n background: darken($ui-base-color, 4%);\n padding: 0;\n }\n\n &.error {\n position: absolute;\n text-align: center;\n color: $darker-text-color;\n background: $ui-base-color;\n width: 100%;\n height: 100%;\n padding: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n\n .dialog {\n vertical-align: middle;\n margin: 20px;\n\n &__illustration {\n img {\n display: block;\n max-width: 470px;\n width: 100%;\n height: auto;\n margin-top: -120px;\n }\n }\n\n h1 {\n font-size: 20px;\n line-height: 28px;\n font-weight: 400;\n }\n }\n }\n}\n\nbutton {\n font-family: inherit;\n cursor: pointer;\n\n &:focus {\n outline: none;\n }\n}\n\n.app-holder {\n &,\n & > div,\n & > noscript {\n display: flex;\n width: 100%;\n align-items: center;\n justify-content: center;\n outline: 0 !important;\n }\n\n & > noscript {\n height: 100vh;\n }\n}\n\n.layout-single-column .app-holder {\n &,\n & > div {\n min-height: 100vh;\n }\n}\n\n.layout-multiple-columns .app-holder {\n &,\n & > div {\n height: 100%;\n }\n}\n\n.error-boundary,\n.app-holder noscript {\n flex-direction: column;\n font-size: 16px;\n font-weight: 400;\n line-height: 1.7;\n color: lighten($error-red, 4%);\n text-align: center;\n\n & > div {\n max-width: 500px;\n }\n\n p {\n margin-bottom: .85em;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: $highlight-text-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n &__footer {\n color: $dark-text-color;\n font-size: 13px;\n\n a {\n color: $dark-text-color;\n }\n }\n\n button {\n display: inline;\n border: 0;\n background: transparent;\n color: $dark-text-color;\n font: inherit;\n padding: 0;\n margin: 0;\n line-height: inherit;\n cursor: pointer;\n outline: 0;\n transition: color 300ms linear;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n\n &.copied {\n color: $valid-value-color;\n transition: none;\n }\n }\n}\n",".container-alt {\n width: 700px;\n margin: 0 auto;\n margin-top: 40px;\n\n @media screen and (max-width: 740px) {\n width: 100%;\n margin: 0;\n }\n}\n\n.logo-container {\n margin: 100px auto 50px;\n\n @media screen and (max-width: 500px) {\n margin: 40px auto 0;\n }\n\n h1 {\n display: flex;\n justify-content: center;\n align-items: center;\n\n svg {\n fill: $primary-text-color;\n height: 42px;\n margin-right: 10px;\n }\n\n a {\n display: flex;\n justify-content: center;\n align-items: center;\n color: $primary-text-color;\n text-decoration: none;\n outline: 0;\n padding: 12px 16px;\n line-height: 32px;\n font-family: $font-display, sans-serif;\n font-weight: 500;\n font-size: 14px;\n }\n }\n}\n\n.compose-standalone {\n .compose-form {\n width: 400px;\n margin: 0 auto;\n padding: 20px 0;\n margin-top: 40px;\n box-sizing: border-box;\n\n @media screen and (max-width: 400px) {\n width: 100%;\n margin-top: 0;\n padding: 20px;\n }\n }\n}\n\n.account-header {\n width: 400px;\n margin: 0 auto;\n display: flex;\n font-size: 13px;\n line-height: 18px;\n box-sizing: border-box;\n padding: 20px 0;\n padding-bottom: 0;\n margin-bottom: -30px;\n margin-top: 40px;\n\n @media screen and (max-width: 440px) {\n width: 100%;\n margin: 0;\n margin-bottom: 10px;\n padding: 20px;\n padding-bottom: 0;\n }\n\n .avatar {\n width: 40px;\n height: 40px;\n margin-right: 8px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n }\n }\n\n .name {\n flex: 1 1 auto;\n color: $secondary-text-color;\n width: calc(100% - 88px);\n\n .username {\n display: block;\n font-weight: 500;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n }\n\n .logout-link {\n display: block;\n font-size: 32px;\n line-height: 40px;\n margin-left: 8px;\n }\n}\n\n.grid-3 {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: 3fr 1fr;\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-column: 1 / 3;\n grid-row: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 2;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1 / 3;\n grid-row: 3;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n grid-template-columns: minmax(0, 100%);\n\n .column-0 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .column-2 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1;\n grid-row: 4;\n }\n }\n}\n\n.grid-4 {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: repeat(4, minmax(0, 1fr));\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-column: 1 / 5;\n grid-row: 1;\n }\n\n .column-1 {\n grid-column: 1 / 4;\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 4;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 2 / 5;\n grid-row: 3;\n }\n\n .column-4 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .landing-page__call-to-action {\n min-height: 100%;\n }\n\n .flash-message {\n margin-bottom: 10px;\n }\n\n @media screen and (max-width: 738px) {\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n .landing-page__call-to-action {\n padding: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .row__information-board {\n width: 100%;\n justify-content: center;\n align-items: center;\n }\n\n .row__mascot {\n display: none;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n grid-template-columns: minmax(0, 100%);\n\n .column-0 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .column-2 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1;\n grid-row: 5;\n }\n\n .column-4 {\n grid-column: 1;\n grid-row: 4;\n }\n }\n}\n\n.public-layout {\n @media screen and (max-width: $no-gap-breakpoint) {\n padding-top: 48px;\n }\n\n .container {\n max-width: 960px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding: 0;\n }\n }\n\n .header {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n height: 48px;\n margin: 10px 0;\n display: flex;\n align-items: stretch;\n justify-content: center;\n flex-wrap: nowrap;\n overflow: hidden;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n position: fixed;\n width: 100%;\n top: 0;\n left: 0;\n margin: 0;\n border-radius: 0;\n box-shadow: none;\n z-index: 110;\n }\n\n & > div {\n flex: 1 1 33.3%;\n min-height: 1px;\n }\n\n .nav-left {\n display: flex;\n align-items: stretch;\n justify-content: flex-start;\n flex-wrap: nowrap;\n }\n\n .nav-center {\n display: flex;\n align-items: stretch;\n justify-content: center;\n flex-wrap: nowrap;\n }\n\n .nav-right {\n display: flex;\n align-items: stretch;\n justify-content: flex-end;\n flex-wrap: nowrap;\n }\n\n .brand {\n display: block;\n padding: 15px;\n\n svg {\n display: block;\n height: 18px;\n width: auto;\n position: relative;\n bottom: -2px;\n fill: $primary-text-color;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n height: 20px;\n }\n }\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 12%);\n }\n }\n\n .nav-link {\n display: flex;\n align-items: center;\n padding: 0 1rem;\n font-size: 12px;\n font-weight: 500;\n text-decoration: none;\n color: $darker-text-color;\n white-space: nowrap;\n text-align: center;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n color: $primary-text-color;\n }\n\n @media screen and (max-width: 550px) {\n &.optional {\n display: none;\n }\n }\n }\n\n .nav-button {\n background: lighten($ui-base-color, 16%);\n margin: 8px;\n margin-left: 0;\n border-radius: 4px;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n background: lighten($ui-base-color, 20%);\n }\n }\n }\n\n $no-columns-breakpoint: 600px;\n\n .grid {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(300px, 3fr) minmax(298px, 1fr);\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-row: 1;\n grid-column: 1;\n }\n\n .column-1 {\n grid-row: 1;\n grid-column: 2;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n grid-template-columns: 100%;\n grid-gap: 0;\n\n .column-1 {\n display: none;\n }\n }\n }\n\n .directory__card {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n\n .page-header {\n @media screen and (max-width: $no-gap-breakpoint) {\n border-bottom: 0;\n }\n }\n\n .public-account-header {\n overflow: hidden;\n margin-bottom: 10px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &.inactive {\n opacity: 0.5;\n\n .public-account-header__image,\n .avatar {\n filter: grayscale(100%);\n }\n\n .logo-button {\n background-color: $secondary-text-color;\n }\n }\n\n &__image {\n border-radius: 4px 4px 0 0;\n overflow: hidden;\n height: 300px;\n position: relative;\n background: darken($ui-base-color, 12%);\n\n &::after {\n content: \"\";\n display: block;\n position: absolute;\n width: 100%;\n height: 100%;\n box-shadow: inset 0 -1px 1px 1px rgba($base-shadow-color, 0.15);\n top: 0;\n left: 0;\n }\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 4px 4px 0 0;\n }\n\n @media screen and (max-width: 600px) {\n height: 200px;\n }\n }\n\n &--no-bar {\n margin-bottom: 0;\n\n .public-account-header__image,\n .public-account-header__image img {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n box-shadow: none;\n\n &__image::after {\n display: none;\n }\n\n &__image,\n &__image img {\n border-radius: 0;\n }\n }\n\n &__bar {\n position: relative;\n margin-top: -80px;\n display: flex;\n justify-content: flex-start;\n\n &::before {\n content: \"\";\n display: block;\n background: lighten($ui-base-color, 4%);\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: 60px;\n border-radius: 0 0 4px 4px;\n z-index: -1;\n }\n\n .avatar {\n display: block;\n width: 120px;\n height: 120px;\n padding-left: 20px - 4px;\n flex: 0 0 auto;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 50%;\n border: 4px solid lighten($ui-base-color, 4%);\n background: darken($ui-base-color, 8%);\n }\n }\n\n @media screen and (max-width: 600px) {\n margin-top: 0;\n background: lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n padding: 5px;\n\n &::before {\n display: none;\n }\n\n .avatar {\n width: 48px;\n height: 48px;\n padding: 7px 0;\n padding-left: 10px;\n\n img {\n border: 0;\n border-radius: 4px;\n }\n\n @media screen and (max-width: 360px) {\n display: none;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n flex-wrap: wrap;\n }\n }\n\n &__tabs {\n flex: 1 1 auto;\n margin-left: 20px;\n\n &__name {\n padding-top: 20px;\n padding-bottom: 8px;\n\n h1 {\n font-size: 20px;\n line-height: 18px * 1.5;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n text-shadow: 1px 1px 1px $base-shadow-color;\n\n small {\n display: block;\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n @media screen and (max-width: 600px) {\n margin-left: 15px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n &__name {\n padding-top: 0;\n padding-bottom: 0;\n\n h1 {\n font-size: 16px;\n line-height: 24px;\n text-shadow: none;\n\n small {\n color: $darker-text-color;\n }\n }\n }\n }\n\n &__tabs {\n display: flex;\n justify-content: flex-start;\n align-items: stretch;\n height: 58px;\n\n .details-counters {\n display: flex;\n flex-direction: row;\n min-width: 300px;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n .details-counters {\n display: none;\n }\n }\n\n .counter {\n min-width: 33.3%;\n box-sizing: border-box;\n flex: 0 0 auto;\n color: $darker-text-color;\n padding: 10px;\n border-right: 1px solid lighten($ui-base-color, 4%);\n cursor: default;\n text-align: center;\n position: relative;\n\n a {\n display: block;\n }\n\n &:last-child {\n border-right: 0;\n }\n\n &::after {\n display: block;\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n border-bottom: 4px solid $ui-primary-color;\n opacity: 0.5;\n transition: all 400ms ease;\n }\n\n &.active {\n &::after {\n border-bottom: 4px solid $highlight-text-color;\n opacity: 1;\n }\n\n &.inactive::after {\n border-bottom-color: $secondary-text-color;\n }\n }\n\n &:hover {\n &::after {\n opacity: 1;\n transition-duration: 100ms;\n }\n }\n\n a {\n text-decoration: none;\n color: inherit;\n }\n\n .counter-label {\n font-size: 12px;\n display: block;\n }\n\n .counter-number {\n font-weight: 500;\n font-size: 18px;\n margin-bottom: 5px;\n color: $primary-text-color;\n font-family: $font-display, sans-serif;\n }\n }\n\n .spacer {\n flex: 1 1 auto;\n height: 1px;\n }\n\n &__buttons {\n padding: 7px 8px;\n }\n }\n }\n\n &__extra {\n display: none;\n margin-top: 4px;\n\n .public-account-bio {\n border-radius: 0;\n box-shadow: none;\n background: transparent;\n margin: 0 -5px;\n\n .account__header__fields {\n border-top: 1px solid lighten($ui-base-color, 12%);\n }\n\n .roles {\n display: none;\n }\n }\n\n &__links {\n margin-top: -15px;\n font-size: 14px;\n color: $darker-text-color;\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n padding: 15px;\n font-weight: 500;\n\n strong {\n font-weight: 700;\n color: $primary-text-color;\n }\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n flex: 100%;\n }\n }\n }\n\n .account__section-headline {\n border-radius: 4px 4px 0 0;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n\n .detailed-status__meta {\n margin-top: 25px;\n }\n\n .public-account-bio {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n overflow: hidden;\n margin-bottom: 10px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n box-shadow: none;\n margin-bottom: 0;\n border-radius: 0;\n }\n\n .account__header__fields {\n margin: 0;\n border-top: 0;\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n\n .account__header__content {\n padding: 20px;\n padding-bottom: 0;\n color: $primary-text-color;\n }\n\n &__extra,\n .roles {\n padding: 20px;\n font-size: 14px;\n color: $darker-text-color;\n }\n\n .roles {\n padding-bottom: 0;\n }\n }\n\n .directory__list {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: block;\n }\n\n .icon-button {\n font-size: 18px;\n }\n }\n\n .directory__card {\n margin-bottom: 0;\n }\n\n .card-grid {\n display: flex;\n flex-wrap: wrap;\n min-width: 100%;\n margin: 0 -5px;\n\n & > div {\n box-sizing: border-box;\n flex: 1 0 auto;\n width: 300px;\n padding: 0 5px;\n margin-bottom: 10px;\n max-width: 33.333%;\n\n @media screen and (max-width: 900px) {\n max-width: 50%;\n }\n\n @media screen and (max-width: 600px) {\n max-width: 100%;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin: 0;\n border-top: 1px solid lighten($ui-base-color, 8%);\n\n & > div {\n width: 100%;\n padding: 0;\n margin-bottom: 0;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &:last-child {\n border-bottom: 0;\n }\n\n .card__bar {\n background: $ui-base-color;\n\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n }\n }\n }\n }\n}\n",".no-list {\n list-style: none;\n\n li {\n display: inline-block;\n margin: 0 5px;\n }\n}\n\n.recovery-codes {\n list-style: none;\n margin: 0 auto;\n\n li {\n font-size: 125%;\n line-height: 1.5;\n letter-spacing: 1px;\n }\n}\n",".public-layout {\n .footer {\n text-align: left;\n padding-top: 20px;\n padding-bottom: 60px;\n font-size: 12px;\n color: lighten($ui-base-color, 34%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding-left: 20px;\n padding-right: 20px;\n }\n\n .grid {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: 1fr 1fr 2fr 1fr 1fr;\n\n .column-0 {\n grid-column: 1;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-1 {\n grid-column: 2;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-2 {\n grid-column: 3;\n grid-row: 1;\n min-width: 0;\n text-align: center;\n\n h4 a {\n color: lighten($ui-base-color, 34%);\n }\n }\n\n .column-3 {\n grid-column: 4;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-4 {\n grid-column: 5;\n grid-row: 1;\n min-width: 0;\n }\n\n @media screen and (max-width: 690px) {\n grid-template-columns: 1fr 2fr 1fr;\n\n .column-0,\n .column-1 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 2;\n }\n\n .column-3,\n .column-4 {\n grid-column: 3;\n }\n\n .column-4 {\n grid-row: 2;\n }\n }\n\n @media screen and (max-width: 600px) {\n .column-1 {\n display: block;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n .column-0,\n .column-1,\n .column-3,\n .column-4 {\n display: none;\n }\n }\n }\n\n h4 {\n font-weight: 700;\n margin-bottom: 8px;\n color: $darker-text-color;\n\n a {\n color: inherit;\n text-decoration: none;\n }\n }\n\n ul a {\n text-decoration: none;\n color: lighten($ui-base-color, 34%);\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n\n .brand {\n svg {\n display: block;\n height: 36px;\n width: auto;\n margin: 0 auto;\n fill: lighten($ui-base-color, 34%);\n }\n\n &:hover,\n &:focus,\n &:active {\n svg {\n fill: lighten($ui-base-color, 38%);\n }\n }\n }\n }\n}\n",".compact-header {\n h1 {\n font-size: 24px;\n line-height: 28px;\n color: $darker-text-color;\n font-weight: 500;\n margin-bottom: 20px;\n padding: 0 10px;\n word-wrap: break-word;\n\n @media screen and (max-width: 740px) {\n text-align: center;\n padding: 20px 10px 0;\n }\n\n a {\n color: inherit;\n text-decoration: none;\n }\n\n small {\n font-weight: 400;\n color: $secondary-text-color;\n }\n\n img {\n display: inline-block;\n margin-bottom: -5px;\n margin-right: 15px;\n width: 36px;\n height: 36px;\n }\n }\n}\n",".hero-widget {\n margin-bottom: 10px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &__img {\n width: 100%;\n position: relative;\n overflow: hidden;\n border-radius: 4px 4px 0 0;\n background: $base-shadow-color;\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 4px 4px 0 0;\n }\n }\n\n &__text {\n background: $ui-base-color;\n padding: 20px;\n border-radius: 0 0 4px 4px;\n font-size: 15px;\n color: $darker-text-color;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n p {\n margin-bottom: 20px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n em {\n display: inline;\n margin: 0;\n padding: 0;\n font-weight: 700;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n color: lighten($darker-text-color, 10%);\n }\n\n a {\n color: $secondary-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n}\n\n.endorsements-widget {\n margin-bottom: 10px;\n padding-bottom: 10px;\n\n h4 {\n padding: 10px;\n font-weight: 700;\n font-size: 14px;\n color: $darker-text-color;\n }\n\n .account {\n padding: 10px 0;\n\n &:last-child {\n border-bottom: 0;\n }\n\n .account__display-name {\n display: flex;\n align-items: center;\n }\n\n .account__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n }\n\n .trends__item {\n padding: 10px;\n }\n}\n\n.trends-widget {\n h4 {\n color: $darker-text-color;\n }\n}\n\n.box-widget {\n padding: 20px;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n}\n\n.placeholder-widget {\n padding: 16px;\n border-radius: 4px;\n border: 2px dashed $dark-text-color;\n text-align: center;\n color: $darker-text-color;\n margin-bottom: 10px;\n}\n\n.contact-widget {\n min-height: 100%;\n font-size: 15px;\n color: $darker-text-color;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n padding: 0;\n\n h4 {\n padding: 10px;\n font-weight: 700;\n font-size: 14px;\n color: $darker-text-color;\n }\n\n .account {\n border-bottom: 0;\n padding: 10px 0;\n padding-top: 5px;\n }\n\n & > a {\n display: inline-block;\n padding: 10px;\n padding-top: 0;\n color: $darker-text-color;\n text-decoration: none;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.moved-account-widget {\n padding: 15px;\n padding-bottom: 20px;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n color: $secondary-text-color;\n font-weight: 400;\n margin-bottom: 10px;\n\n strong,\n a {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n color: inherit;\n text-decoration: underline;\n\n &.mention {\n text-decoration: none;\n\n span {\n text-decoration: none;\n }\n\n &:focus,\n &:hover,\n &:active {\n text-decoration: none;\n\n span {\n text-decoration: underline;\n }\n }\n }\n }\n\n &__message {\n margin-bottom: 15px;\n\n .fa {\n margin-right: 5px;\n color: $darker-text-color;\n }\n }\n\n &__card {\n .detailed-status__display-avatar {\n position: relative;\n cursor: pointer;\n }\n\n .detailed-status__display-name {\n margin-bottom: 0;\n text-decoration: none;\n\n span {\n font-weight: 400;\n }\n }\n }\n}\n\n.memoriam-widget {\n padding: 20px;\n border-radius: 4px;\n background: $base-shadow-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n font-size: 14px;\n color: $darker-text-color;\n margin-bottom: 10px;\n}\n\n.page-header {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n padding: 60px 15px;\n text-align: center;\n margin: 10px 0;\n\n h1 {\n color: $primary-text-color;\n font-size: 36px;\n line-height: 1.1;\n font-weight: 700;\n margin-bottom: 10px;\n }\n\n p {\n font-size: 15px;\n color: $darker-text-color;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-top: 0;\n background: lighten($ui-base-color, 4%);\n\n h1 {\n font-size: 24px;\n }\n }\n}\n\n.directory {\n background: $ui-base-color;\n border-radius: 4px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &__tag {\n box-sizing: border-box;\n margin-bottom: 10px;\n\n & > a,\n & > div {\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: $ui-base-color;\n border-radius: 4px;\n padding: 15px;\n text-decoration: none;\n color: inherit;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n }\n\n & > a {\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 8%);\n }\n }\n\n &.active > a {\n background: $ui-highlight-color;\n cursor: default;\n }\n\n &.disabled > div {\n opacity: 0.5;\n cursor: default;\n }\n\n h4 {\n flex: 1 1 auto;\n font-size: 18px;\n font-weight: 700;\n color: $primary-text-color;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n .fa {\n color: $darker-text-color;\n }\n\n small {\n display: block;\n font-weight: 400;\n font-size: 15px;\n margin-top: 8px;\n color: $darker-text-color;\n }\n }\n\n &.active h4 {\n &,\n .fa,\n small,\n .trends__item__current {\n color: $primary-text-color;\n }\n }\n\n .avatar-stack {\n flex: 0 0 auto;\n width: (36px + 4px) * 3;\n }\n\n &.active .avatar-stack .account__avatar {\n border-color: $ui-highlight-color;\n }\n\n .trends__item__current {\n padding-right: 0;\n }\n }\n}\n\n.avatar-stack {\n display: flex;\n justify-content: flex-end;\n\n .account__avatar {\n flex: 0 0 auto;\n width: 36px;\n height: 36px;\n border-radius: 50%;\n position: relative;\n margin-left: -10px;\n background: darken($ui-base-color, 8%);\n border: 2px solid $ui-base-color;\n\n &:nth-child(1) {\n z-index: 1;\n }\n\n &:nth-child(2) {\n z-index: 2;\n }\n\n &:nth-child(3) {\n z-index: 3;\n }\n }\n}\n\n.accounts-table {\n width: 100%;\n\n .account {\n padding: 0;\n border: 0;\n }\n\n strong {\n font-weight: 700;\n }\n\n thead th {\n text-align: center;\n color: $darker-text-color;\n font-weight: 700;\n padding: 10px;\n\n &:first-child {\n text-align: left;\n }\n }\n\n tbody td {\n padding: 15px 0;\n vertical-align: middle;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n tbody tr:last-child td {\n border-bottom: 0;\n }\n\n &__count {\n width: 120px;\n text-align: center;\n font-size: 15px;\n font-weight: 500;\n color: $primary-text-color;\n\n small {\n display: block;\n color: $darker-text-color;\n font-weight: 400;\n font-size: 14px;\n }\n }\n\n &__comment {\n width: 50%;\n vertical-align: initial !important;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n tbody td.optional {\n display: none;\n }\n }\n}\n\n.moved-account-widget,\n.memoriam-widget,\n.box-widget,\n.contact-widget,\n.landing-page__information.contact-widget,\n.directory,\n.page-header {\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n box-shadow: none;\n border-radius: 0;\n }\n}\n\n$maximum-width: 1235px;\n$fluid-breakpoint: $maximum-width + 20px;\n\n.statuses-grid {\n min-height: 600px;\n\n @media screen and (max-width: 640px) {\n width: 100% !important; // Masonry layout is unnecessary at this width\n }\n\n &__item {\n width: (960px - 20px) / 3;\n\n @media screen and (max-width: $fluid-breakpoint) {\n width: (940px - 20px) / 3;\n }\n\n @media screen and (max-width: 640px) {\n width: 100%;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n width: 100vw;\n }\n }\n\n .detailed-status {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 1px solid lighten($ui-base-color, 16%);\n }\n\n &.compact {\n .detailed-status__meta {\n margin-top: 15px;\n }\n\n .status__content {\n font-size: 15px;\n line-height: 20px;\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n .status__content__spoiler-link {\n line-height: 20px;\n margin: 0;\n }\n }\n\n .media-gallery,\n .status-card,\n .video-player {\n margin-top: 15px;\n }\n }\n }\n}\n\n.notice-widget {\n margin-bottom: 10px;\n color: $darker-text-color;\n\n p {\n margin-bottom: 10px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n font-size: 14px;\n line-height: 20px;\n }\n}\n\n.notice-widget,\n.placeholder-widget {\n a {\n text-decoration: none;\n font-weight: 500;\n color: $ui-highlight-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.table-of-contents {\n background: darken($ui-base-color, 4%);\n min-height: 100%;\n font-size: 14px;\n border-radius: 4px;\n\n li a {\n display: block;\n font-weight: 500;\n padding: 15px;\n overflow: hidden;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n text-decoration: none;\n color: $primary-text-color;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n\n li:last-child a {\n border-bottom: 0;\n }\n\n li ul {\n padding-left: 20px;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n }\n}\n","// Commonly used web colors\n$black: #000000; // Black\n$white: #ffffff; // White\n$success-green: #79bd9a !default; // Padua\n$error-red: #df405a !default; // Cerise\n$warning-red: #ff5050 !default; // Sunset Orange\n$gold-star: #ca8f04 !default; // Dark Goldenrod\n\n$red-bookmark: $warning-red;\n\n// Pleroma-Dark colors\n$pleroma-bg: #121a24;\n$pleroma-fg: #182230;\n$pleroma-text: #b9b9ba;\n$pleroma-links: #d8a070;\n\n// Values from the classic Mastodon UI\n$classic-base-color: $pleroma-bg;\n$classic-primary-color: #9baec8;\n$classic-secondary-color: #d9e1e8;\n$classic-highlight-color: #d8a070;\n\n// Variables for defaults in UI\n$base-shadow-color: $black !default;\n$base-overlay-background: $black !default;\n$base-border-color: $white !default;\n$simple-background-color: $white !default;\n$valid-value-color: $success-green !default;\n$error-value-color: $error-red !default;\n\n// Tell UI to use selected colors\n$ui-base-color: $classic-base-color !default; // Darkest\n$ui-base-lighter-color: lighten($ui-base-color, 26%) !default; // Lighter darkest\n$ui-primary-color: $classic-primary-color !default; // Lighter\n$ui-secondary-color: $classic-secondary-color !default; // Lightest\n$ui-highlight-color: $classic-highlight-color !default;\n\n// Variables for texts\n$primary-text-color: $white !default;\n$darker-text-color: $ui-primary-color !default;\n$dark-text-color: $ui-base-lighter-color !default;\n$secondary-text-color: $ui-secondary-color !default;\n$highlight-text-color: $ui-highlight-color !default;\n$action-button-color: $ui-base-lighter-color !default;\n// For texts on inverted backgrounds\n$inverted-text-color: $ui-base-color !default;\n$lighter-text-color: $ui-base-lighter-color !default;\n$light-text-color: $ui-primary-color !default;\n\n// Language codes that uses CJK fonts\n$cjk-langs: ja, ko, zh-CN, zh-HK, zh-TW;\n\n// Variables for components\n$media-modal-media-max-width: 100%;\n// put margins on top and bottom of image to avoid the screen covered by image.\n$media-modal-media-max-height: 80%;\n\n$no-gap-breakpoint: 415px;\n\n$font-sans-serif: 'mastodon-font-sans-serif' !default;\n$font-display: 'mastodon-font-display' !default;\n$font-monospace: 'mastodon-font-monospace' !default;\n","$no-columns-breakpoint: 600px;\n\ncode {\n font-family: $font-monospace, monospace;\n font-weight: 400;\n}\n\n.form-container {\n max-width: 400px;\n padding: 20px;\n margin: 0 auto;\n}\n\n.simple_form {\n .input {\n margin-bottom: 15px;\n overflow: hidden;\n\n &.hidden {\n margin: 0;\n }\n\n &.radio_buttons {\n .radio {\n margin-bottom: 15px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .radio > label {\n position: relative;\n padding-left: 28px;\n\n input {\n position: absolute;\n top: -2px;\n left: 0;\n }\n }\n }\n\n &.boolean {\n position: relative;\n margin-bottom: 0;\n\n .label_input > label {\n font-family: inherit;\n font-size: 14px;\n padding-top: 5px;\n color: $primary-text-color;\n display: block;\n width: auto;\n }\n\n .label_input,\n .hint {\n padding-left: 28px;\n }\n\n .label_input__wrapper {\n position: static;\n }\n\n label.checkbox {\n position: absolute;\n top: 2px;\n left: 0;\n }\n\n label a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: none;\n }\n }\n\n .recommended {\n position: absolute;\n margin: 0 4px;\n margin-top: -2px;\n }\n }\n }\n\n .row {\n display: flex;\n margin: 0 -5px;\n\n .input {\n box-sizing: border-box;\n flex: 1 1 auto;\n width: 50%;\n padding: 0 5px;\n }\n }\n\n .hint {\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n }\n\n code {\n border-radius: 3px;\n padding: 0.2em 0.4em;\n background: darken($ui-base-color, 12%);\n }\n\n li {\n list-style: disc;\n margin-left: 18px;\n }\n }\n\n ul.hint {\n margin-bottom: 15px;\n }\n\n span.hint {\n display: block;\n font-size: 12px;\n margin-top: 4px;\n }\n\n p.hint {\n margin-bottom: 15px;\n color: $darker-text-color;\n\n &.subtle-hint {\n text-align: center;\n font-size: 12px;\n line-height: 18px;\n margin-top: 15px;\n margin-bottom: 0;\n }\n }\n\n .card {\n margin-bottom: 15px;\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n .input.with_floating_label {\n .label_input {\n display: flex;\n\n & > label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 500;\n min-width: 150px;\n flex: 0 0 auto;\n }\n\n input,\n select {\n flex: 1 1 auto;\n }\n }\n\n &.select .hint {\n margin-top: 6px;\n margin-left: 150px;\n }\n }\n\n .input.with_label {\n .label_input > label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: block;\n margin-bottom: 8px;\n word-wrap: break-word;\n font-weight: 500;\n }\n\n .hint {\n margin-top: 6px;\n }\n\n ul {\n flex: 390px;\n }\n }\n\n .input.with_block_label {\n max-width: none;\n\n & > label {\n font-family: inherit;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n font-weight: 500;\n padding-top: 5px;\n }\n\n .hint {\n margin-bottom: 15px;\n }\n\n ul {\n columns: 2;\n }\n }\n\n .required abbr {\n text-decoration: none;\n color: lighten($error-value-color, 12%);\n }\n\n .fields-group {\n margin-bottom: 25px;\n\n .input:last-child {\n margin-bottom: 0;\n }\n }\n\n .fields-row {\n display: flex;\n margin: 0 -10px;\n padding-top: 5px;\n margin-bottom: 25px;\n\n .input {\n max-width: none;\n }\n\n &__column {\n box-sizing: border-box;\n padding: 0 10px;\n flex: 1 1 auto;\n min-height: 1px;\n\n &-6 {\n max-width: 50%;\n }\n\n .actions {\n margin-top: 27px;\n }\n }\n\n .fields-group:last-child,\n .fields-row__column.fields-group {\n margin-bottom: 0;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n margin-bottom: 0;\n\n &__column {\n max-width: none;\n }\n\n .fields-group:last-child,\n .fields-row__column.fields-group,\n .fields-row__column {\n margin-bottom: 25px;\n }\n }\n }\n\n .input.radio_buttons .radio label {\n margin-bottom: 5px;\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: block;\n width: auto;\n }\n\n .check_boxes {\n .checkbox {\n label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: inline-block;\n width: auto;\n position: relative;\n padding-top: 5px;\n padding-left: 25px;\n flex: 1 1 auto;\n }\n\n input[type=checkbox] {\n position: absolute;\n left: 0;\n top: 5px;\n margin: 0;\n }\n }\n }\n\n .input.static .label_input__wrapper {\n font-size: 16px;\n padding: 10px;\n border: 1px solid $dark-text-color;\n border-radius: 4px;\n }\n\n input[type=text],\n input[type=number],\n input[type=email],\n input[type=password],\n textarea {\n box-sizing: border-box;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n width: 100%;\n outline: 0;\n font-family: inherit;\n resize: vertical;\n background: darken($ui-base-color, 10%);\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n padding: 10px;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &:invalid {\n box-shadow: none;\n }\n\n &:focus:invalid:not(:placeholder-shown) {\n border-color: lighten($error-red, 12%);\n }\n\n &:required:valid {\n border-color: $valid-value-color;\n }\n\n &:hover {\n border-color: darken($ui-base-color, 20%);\n }\n\n &:active,\n &:focus {\n border-color: $highlight-text-color;\n background: darken($ui-base-color, 8%);\n }\n }\n\n .input.field_with_errors {\n label {\n color: lighten($error-red, 12%);\n }\n\n input[type=text],\n input[type=number],\n input[type=email],\n input[type=password],\n textarea,\n select {\n border-color: lighten($error-red, 12%);\n }\n\n .error {\n display: block;\n font-weight: 500;\n color: lighten($error-red, 12%);\n margin-top: 4px;\n }\n }\n\n .input.disabled {\n opacity: 0.5;\n }\n\n .actions {\n margin-top: 30px;\n display: flex;\n\n &.actions--top {\n margin-top: 0;\n margin-bottom: 30px;\n }\n }\n\n button,\n .button,\n .block-button {\n display: block;\n width: 100%;\n border: 0;\n border-radius: 4px;\n background: $ui-highlight-color;\n color: $primary-text-color;\n font-size: 18px;\n line-height: inherit;\n height: auto;\n padding: 10px;\n text-decoration: none;\n text-align: center;\n box-sizing: border-box;\n cursor: pointer;\n font-weight: 500;\n outline: 0;\n margin-bottom: 10px;\n margin-right: 10px;\n\n &:last-child {\n margin-right: 0;\n }\n\n &:hover {\n background-color: lighten($ui-highlight-color, 5%);\n }\n\n &:active,\n &:focus {\n background-color: darken($ui-highlight-color, 5%);\n }\n\n &:disabled:hover {\n background-color: $ui-primary-color;\n }\n\n &.negative {\n background: $error-value-color;\n\n &:hover {\n background-color: lighten($error-value-color, 5%);\n }\n\n &:active,\n &:focus {\n background-color: darken($error-value-color, 5%);\n }\n }\n }\n\n select {\n appearance: none;\n box-sizing: border-box;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n width: 100%;\n outline: 0;\n font-family: inherit;\n resize: vertical;\n background: darken($ui-base-color, 10%) url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center / auto 16px;\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n padding-left: 10px;\n padding-right: 30px;\n height: 41px;\n }\n\n h4 {\n margin-bottom: 15px !important;\n }\n\n .label_input {\n &__wrapper {\n position: relative;\n }\n\n &__append {\n position: absolute;\n right: 3px;\n top: 1px;\n padding: 10px;\n padding-bottom: 9px;\n font-size: 16px;\n color: $dark-text-color;\n font-family: inherit;\n pointer-events: none;\n cursor: default;\n max-width: 140px;\n white-space: nowrap;\n overflow: hidden;\n\n &::after {\n content: '';\n display: block;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 1px;\n width: 5px;\n background-image: linear-gradient(to right, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));\n }\n }\n }\n\n &__overlay-area {\n position: relative;\n\n &__blurred form {\n filter: blur(2px);\n }\n\n &__overlay {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n background: rgba($ui-base-color, 0.65);\n border-radius: 4px;\n margin-left: -4px;\n margin-top: -4px;\n padding: 4px;\n\n &__content {\n text-align: center;\n\n &.rich-formatting {\n &,\n p {\n color: $primary-text-color;\n }\n }\n }\n }\n }\n}\n\n.block-icon {\n display: block;\n margin: 0 auto;\n margin-bottom: 10px;\n font-size: 24px;\n}\n\n.flash-message {\n background: lighten($ui-base-color, 8%);\n color: $darker-text-color;\n border-radius: 4px;\n padding: 15px 10px;\n margin-bottom: 30px;\n text-align: center;\n\n &.notice {\n border: 1px solid rgba($valid-value-color, 0.5);\n background: rgba($valid-value-color, 0.25);\n color: $valid-value-color;\n }\n\n &.alert {\n border: 1px solid rgba($error-value-color, 0.5);\n background: rgba($error-value-color, 0.25);\n color: $error-value-color;\n }\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n\n &:hover {\n color: $primary-text-color;\n text-decoration: underline;\n }\n }\n\n p {\n margin-bottom: 15px;\n }\n\n .oauth-code {\n outline: 0;\n box-sizing: border-box;\n display: block;\n width: 100%;\n border: 0;\n padding: 10px;\n font-family: $font-monospace, monospace;\n background: $ui-base-color;\n color: $primary-text-color;\n font-size: 14px;\n margin: 0;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n @media screen and (max-width: 740px) and (min-width: 441px) {\n margin-top: 40px;\n }\n}\n\n.form-footer {\n margin-top: 30px;\n text-align: center;\n\n a {\n color: $darker-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.quick-nav {\n list-style: none;\n margin-bottom: 25px;\n font-size: 14px;\n\n li {\n display: inline-block;\n margin-right: 10px;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n font-weight: 700;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($highlight-text-color, 8%);\n }\n }\n}\n\n.oauth-prompt,\n.follow-prompt {\n margin-bottom: 30px;\n color: $darker-text-color;\n\n h2 {\n font-size: 16px;\n margin-bottom: 30px;\n text-align: center;\n }\n\n strong {\n color: $secondary-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n @media screen and (max-width: 740px) and (min-width: 441px) {\n margin-top: 40px;\n }\n}\n\n.qr-wrapper {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n}\n\n.qr-code {\n flex: 0 0 auto;\n background: $simple-background-color;\n padding: 4px;\n margin: 0 10px 20px 0;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n display: inline-block;\n\n svg {\n display: block;\n margin: 0;\n }\n}\n\n.qr-alternative {\n margin-bottom: 20px;\n color: $secondary-text-color;\n flex: 150px;\n\n samp {\n display: block;\n font-size: 14px;\n }\n}\n\n.table-form {\n p {\n margin-bottom: 15px;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n }\n}\n\n.simple_form,\n.table-form {\n .warning {\n box-sizing: border-box;\n background: rgba($error-value-color, 0.5);\n color: $primary-text-color;\n text-shadow: 1px 1px 0 rgba($base-shadow-color, 0.3);\n box-shadow: 0 2px 6px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n padding: 10px;\n margin-bottom: 15px;\n\n a {\n color: $primary-text-color;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n strong {\n font-weight: 600;\n display: block;\n margin-bottom: 5px;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n\n .fa {\n font-weight: 400;\n }\n }\n }\n}\n\n.action-pagination {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n\n .actions,\n .pagination {\n flex: 1 1 auto;\n }\n\n .actions {\n padding: 30px 0;\n padding-right: 20px;\n flex: 0 0 auto;\n }\n}\n\n.post-follow-actions {\n text-align: center;\n color: $darker-text-color;\n\n div {\n margin-bottom: 4px;\n }\n}\n\n.alternative-login {\n margin-top: 20px;\n margin-bottom: 20px;\n\n h4 {\n font-size: 16px;\n color: $primary-text-color;\n text-align: center;\n margin-bottom: 20px;\n border: 0;\n padding: 0;\n }\n\n .button {\n display: block;\n }\n}\n\n.scope-danger {\n color: $warning-red;\n}\n\n.form_admin_settings_site_short_description,\n.form_admin_settings_site_description,\n.form_admin_settings_site_extended_description,\n.form_admin_settings_site_terms,\n.form_admin_settings_custom_css,\n.form_admin_settings_closed_registrations_message {\n textarea {\n font-family: $font-monospace, monospace;\n }\n}\n\n.input-copy {\n background: darken($ui-base-color, 10%);\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n display: flex;\n align-items: center;\n padding-right: 4px;\n position: relative;\n top: 1px;\n transition: border-color 300ms linear;\n\n &__wrapper {\n flex: 1 1 auto;\n }\n\n input[type=text] {\n background: transparent;\n border: 0;\n padding: 10px;\n font-size: 14px;\n font-family: $font-monospace, monospace;\n }\n\n button {\n flex: 0 0 auto;\n margin: 4px;\n text-transform: none;\n font-weight: 400;\n font-size: 14px;\n padding: 7px 18px;\n padding-bottom: 6px;\n width: auto;\n transition: background 300ms linear;\n }\n\n &.copied {\n border-color: $valid-value-color;\n transition: none;\n\n button {\n background: $valid-value-color;\n transition: none;\n }\n }\n}\n\n.connection-prompt {\n margin-bottom: 25px;\n\n .fa-link {\n background-color: darken($ui-base-color, 4%);\n border-radius: 100%;\n font-size: 24px;\n padding: 10px;\n }\n\n &__column {\n align-items: center;\n display: flex;\n flex: 1;\n flex-direction: column;\n flex-shrink: 1;\n max-width: 50%;\n\n &-sep {\n align-self: center;\n flex-grow: 0;\n overflow: visible;\n position: relative;\n z-index: 1;\n }\n\n p {\n word-break: break-word;\n }\n }\n\n .account__avatar {\n margin-bottom: 20px;\n }\n\n &__connection {\n background-color: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n padding: 25px 10px;\n position: relative;\n text-align: center;\n\n &::after {\n background-color: darken($ui-base-color, 4%);\n content: '';\n display: block;\n height: 100%;\n left: 50%;\n position: absolute;\n top: 0;\n width: 1px;\n }\n }\n\n &__row {\n align-items: flex-start;\n display: flex;\n flex-direction: row;\n }\n}\n",".card {\n & > a {\n display: block;\n text-decoration: none;\n color: inherit;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n box-shadow: none;\n }\n\n &:hover,\n &:active,\n &:focus {\n .card__bar {\n background: lighten($ui-base-color, 8%);\n }\n }\n }\n\n &__img {\n height: 130px;\n position: relative;\n background: darken($ui-base-color, 12%);\n border-radius: 4px 4px 0 0;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n object-fit: cover;\n border-radius: 4px 4px 0 0;\n }\n\n @media screen and (max-width: 600px) {\n height: 200px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n\n &__bar {\n position: relative;\n padding: 15px;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n\n .avatar {\n flex: 0 0 auto;\n width: 48px;\n height: 48px;\n padding-top: 2px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n background: darken($ui-base-color, 8%);\n object-fit: cover;\n }\n }\n\n .display-name {\n margin-left: 15px;\n text-align: left;\n\n strong {\n font-size: 15px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n span {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n}\n\n.pagination {\n padding: 30px 0;\n text-align: center;\n overflow: hidden;\n\n a,\n .current,\n .newer,\n .older,\n .page,\n .gap {\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 500;\n display: inline-block;\n padding: 6px 10px;\n text-decoration: none;\n }\n\n .current {\n background: $simple-background-color;\n border-radius: 100px;\n color: $inverted-text-color;\n cursor: default;\n margin: 0 10px;\n }\n\n .gap {\n cursor: default;\n }\n\n .older,\n .newer {\n color: $secondary-text-color;\n }\n\n .older {\n float: left;\n padding-left: 0;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n .newer {\n float: right;\n padding-right: 0;\n\n .fa {\n display: inline-block;\n margin-left: 5px;\n }\n }\n\n .disabled {\n cursor: default;\n color: lighten($inverted-text-color, 10%);\n }\n\n @media screen and (max-width: 700px) {\n padding: 30px 20px;\n\n .page {\n display: none;\n }\n\n .newer,\n .older {\n display: inline-block;\n }\n }\n}\n\n.nothing-here {\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n color: $light-text-color;\n font-size: 14px;\n font-weight: 500;\n text-align: center;\n display: flex;\n justify-content: center;\n align-items: center;\n cursor: default;\n border-radius: 4px;\n padding: 20px;\n min-height: 30vh;\n\n &--under-tabs {\n border-radius: 0 0 4px 4px;\n }\n\n &--flexible {\n box-sizing: border-box;\n min-height: 100%;\n }\n}\n\n.account-role,\n.simple_form .recommended {\n display: inline-block;\n padding: 4px 6px;\n cursor: default;\n border-radius: 3px;\n font-size: 12px;\n line-height: 12px;\n font-weight: 500;\n color: $ui-secondary-color;\n background-color: rgba($ui-secondary-color, 0.1);\n border: 1px solid rgba($ui-secondary-color, 0.5);\n\n &.moderator {\n color: $success-green;\n background-color: rgba($success-green, 0.1);\n border-color: rgba($success-green, 0.5);\n }\n\n &.admin {\n color: lighten($error-red, 12%);\n background-color: rgba(lighten($error-red, 12%), 0.1);\n border-color: rgba(lighten($error-red, 12%), 0.5);\n }\n}\n\n.account__header__fields {\n max-width: 100vw;\n padding: 0;\n margin: 15px -15px -15px;\n border: 0 none;\n border-top: 1px solid lighten($ui-base-color, 12%);\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n font-size: 14px;\n line-height: 20px;\n\n dl {\n display: flex;\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n }\n\n dt,\n dd {\n box-sizing: border-box;\n padding: 14px;\n text-align: center;\n max-height: 48px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n dt {\n font-weight: 500;\n width: 120px;\n flex: 0 0 auto;\n color: $secondary-text-color;\n background: rgba(darken($ui-base-color, 8%), 0.5);\n }\n\n dd {\n flex: 1 1 auto;\n color: $darker-text-color;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n\n .verified {\n border: 1px solid rgba($valid-value-color, 0.5);\n background: rgba($valid-value-color, 0.25);\n\n a {\n color: $valid-value-color;\n font-weight: 500;\n }\n\n &__mark {\n color: $valid-value-color;\n }\n }\n\n dl:last-child {\n border-bottom: 0;\n }\n}\n\n.directory__tag .trends__item__current {\n width: auto;\n}\n\n.pending-account {\n &__header {\n color: $darker-text-color;\n\n a {\n color: $ui-secondary-color;\n text-decoration: none;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n\n strong {\n color: $primary-text-color;\n font-weight: 700;\n }\n }\n\n &__body {\n margin-top: 10px;\n }\n}\n",".activity-stream {\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n overflow: hidden;\n margin-bottom: 10px;\n\n &--under-tabs {\n border-radius: 0 0 4px 4px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n border-radius: 0;\n box-shadow: none;\n }\n\n &--headless {\n border-radius: 0;\n margin: 0;\n box-shadow: none;\n\n .detailed-status,\n .status {\n border-radius: 0 !important;\n }\n }\n\n div[data-component] {\n width: 100%;\n }\n\n .entry {\n background: $ui-base-color;\n\n .detailed-status,\n .status,\n .load-more {\n animation: none;\n }\n\n &:last-child {\n .detailed-status,\n .status,\n .load-more {\n border-bottom: 0;\n border-radius: 0 0 4px 4px;\n }\n }\n\n &:first-child {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 4px 4px 0 0;\n }\n\n &:last-child {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 4px;\n }\n }\n }\n\n @media screen and (max-width: 740px) {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 0 !important;\n }\n }\n }\n\n &--highlighted .entry {\n background: lighten($ui-base-color, 8%);\n }\n}\n\n.button.logo-button {\n flex: 0 auto;\n font-size: 14px;\n background: $ui-highlight-color;\n color: $primary-text-color;\n text-transform: none;\n line-height: 36px;\n height: auto;\n padding: 3px 15px;\n border: 0;\n\n svg {\n width: 20px;\n height: auto;\n vertical-align: middle;\n margin-right: 5px;\n fill: $primary-text-color;\n }\n\n &:active,\n &:focus,\n &:hover {\n background: lighten($ui-highlight-color, 10%);\n }\n\n &:disabled,\n &.disabled {\n &:active,\n &:focus,\n &:hover {\n background: $ui-primary-color;\n }\n }\n\n &.button--destructive {\n &:active,\n &:focus,\n &:hover {\n background: $error-red;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n svg {\n display: none;\n }\n }\n}\n\n.embed,\n.public-layout {\n .detailed-status {\n padding: 15px;\n }\n\n .status {\n padding: 15px 15px 15px (48px + 15px * 2);\n min-height: 48px + 2px;\n\n &__avatar {\n left: 15px;\n top: 17px;\n }\n\n &__content {\n padding-top: 5px;\n }\n\n &__prepend {\n margin-left: 48px + 15px * 2;\n padding-top: 15px;\n }\n\n &__prepend-icon-wrapper {\n left: -32px;\n }\n\n .media-gallery,\n &__action-bar,\n .video-player {\n margin-top: 10px;\n }\n }\n}\n","button.icon-button i.fa-retweet {\n background-image: url(\"data:image/svg+xml;utf8,\");\n\n &:hover {\n background-image: url(\"data:image/svg+xml;utf8,\");\n }\n}\n\nbutton.icon-button.disabled i.fa-retweet {\n background-image: url(\"data:image/svg+xml;utf8,\");\n}\n",".app-body {\n -webkit-overflow-scrolling: touch;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n}\n\n.link-button {\n display: block;\n font-size: 15px;\n line-height: 20px;\n color: $ui-highlight-color;\n border: 0;\n background: transparent;\n padding: 0;\n cursor: pointer;\n\n &:hover,\n &:active {\n text-decoration: underline;\n }\n\n &:disabled {\n color: $ui-primary-color;\n cursor: default;\n }\n}\n\n.button {\n background-color: $ui-highlight-color;\n border: 10px none;\n border-radius: 4px;\n box-sizing: border-box;\n color: $primary-text-color;\n cursor: pointer;\n display: inline-block;\n font-family: inherit;\n font-size: 15px;\n font-weight: 500;\n height: 36px;\n letter-spacing: 0;\n line-height: 36px;\n overflow: hidden;\n padding: 0 16px;\n position: relative;\n text-align: center;\n text-decoration: none;\n text-overflow: ellipsis;\n transition: all 100ms ease-in;\n white-space: nowrap;\n width: auto;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-highlight-color, 10%);\n transition: all 200ms ease-out;\n }\n\n &--destructive {\n transition: none;\n\n &:active,\n &:focus,\n &:hover {\n background-color: $error-red;\n transition: none;\n }\n }\n\n &:disabled,\n &.disabled {\n background-color: $ui-primary-color;\n cursor: default;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &.button-primary,\n &.button-alternative,\n &.button-secondary,\n &.button-alternative-2 {\n font-size: 16px;\n line-height: 36px;\n height: auto;\n text-transform: none;\n padding: 4px 16px;\n }\n\n &.button-alternative {\n color: $inverted-text-color;\n background: $ui-primary-color;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-primary-color, 4%);\n }\n }\n\n &.button-alternative-2 {\n background: $ui-base-lighter-color;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-base-lighter-color, 4%);\n }\n }\n\n &.button-secondary {\n color: $darker-text-color;\n background: transparent;\n padding: 3px 15px;\n border: 1px solid $ui-primary-color;\n\n &:active,\n &:focus,\n &:hover {\n border-color: lighten($ui-primary-color, 4%);\n color: lighten($darker-text-color, 4%);\n }\n\n &:disabled {\n opacity: 0.5;\n }\n }\n\n &.button--block {\n display: block;\n width: 100%;\n }\n}\n\n.column__wrapper {\n display: flex;\n flex: 1 1 auto;\n position: relative;\n}\n\n.icon-button {\n display: inline-block;\n padding: 0;\n color: $action-button-color;\n border: 0;\n border-radius: 4px;\n background: transparent;\n cursor: pointer;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($action-button-color, 7%);\n background-color: rgba($action-button-color, 0.15);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n }\n\n &:focus {\n background-color: rgba($action-button-color, 0.3);\n }\n\n &.disabled {\n color: darken($action-button-color, 13%);\n background-color: transparent;\n cursor: default;\n }\n\n &.active {\n color: $highlight-text-color;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &.inverted {\n color: $lighter-text-color;\n\n &:hover,\n &:active,\n &:focus {\n color: darken($lighter-text-color, 7%);\n background-color: rgba($lighter-text-color, 0.15);\n }\n\n &:focus {\n background-color: rgba($lighter-text-color, 0.3);\n }\n\n &.disabled {\n color: lighten($lighter-text-color, 7%);\n background-color: transparent;\n }\n\n &.active {\n color: $highlight-text-color;\n\n &.disabled {\n color: lighten($highlight-text-color, 13%);\n }\n }\n }\n\n &.overlayed {\n box-sizing: content-box;\n background: rgba($base-overlay-background, 0.6);\n color: rgba($primary-text-color, 0.7);\n border-radius: 4px;\n padding: 2px;\n\n &:hover {\n background: rgba($base-overlay-background, 0.9);\n }\n }\n}\n\n.text-icon-button {\n color: $lighter-text-color;\n border: 0;\n border-radius: 4px;\n background: transparent;\n cursor: pointer;\n font-weight: 600;\n font-size: 11px;\n padding: 0 3px;\n line-height: 27px;\n outline: 0;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &:hover,\n &:active,\n &:focus {\n color: darken($lighter-text-color, 7%);\n background-color: rgba($lighter-text-color, 0.15);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n }\n\n &:focus {\n background-color: rgba($lighter-text-color, 0.3);\n }\n\n &.disabled {\n color: lighten($lighter-text-color, 20%);\n background-color: transparent;\n cursor: default;\n }\n\n &.active {\n color: $highlight-text-color;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n}\n\n.dropdown-menu {\n position: absolute;\n}\n\n.invisible {\n font-size: 0;\n line-height: 0;\n display: inline-block;\n width: 0;\n height: 0;\n position: absolute;\n\n img,\n svg {\n margin: 0 !important;\n border: 0 !important;\n padding: 0 !important;\n width: 0 !important;\n height: 0 !important;\n }\n}\n\n.ellipsis {\n &::after {\n content: \"…\";\n }\n}\n\n.compose-form {\n padding: 10px;\n\n &__sensitive-button {\n padding: 10px;\n padding-top: 0;\n\n font-size: 14px;\n font-weight: 500;\n\n &.active {\n color: $highlight-text-color;\n }\n\n input[type=checkbox] {\n display: none;\n }\n\n .checkbox {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 4px;\n vertical-align: middle;\n\n &.active {\n border-color: $highlight-text-color;\n background: $highlight-text-color;\n }\n }\n }\n\n .compose-form__warning {\n color: $inverted-text-color;\n margin-bottom: 10px;\n background: $ui-primary-color;\n box-shadow: 0 2px 6px rgba($base-shadow-color, 0.3);\n padding: 8px 10px;\n border-radius: 4px;\n font-size: 13px;\n font-weight: 400;\n\n strong {\n color: $inverted-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n color: $lighter-text-color;\n font-weight: 500;\n text-decoration: underline;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: none;\n }\n }\n }\n\n .emoji-picker-dropdown {\n position: absolute;\n top: 5px;\n right: 5px;\n }\n\n .compose-form__autosuggest-wrapper {\n position: relative;\n }\n\n .autosuggest-textarea,\n .autosuggest-input,\n .spoiler-input {\n position: relative;\n width: 100%;\n }\n\n .spoiler-input {\n height: 0;\n transform-origin: bottom;\n opacity: 0;\n\n &.spoiler-input--visible {\n height: 36px;\n margin-bottom: 11px;\n opacity: 1;\n }\n }\n\n .autosuggest-textarea__textarea,\n .spoiler-input__input {\n display: block;\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n color: $inverted-text-color;\n background: $simple-background-color;\n padding: 10px;\n font-family: inherit;\n font-size: 14px;\n resize: vertical;\n border: 0;\n outline: 0;\n\n &::placeholder {\n color: $dark-text-color;\n }\n\n &:focus {\n outline: 0;\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n .spoiler-input__input {\n border-radius: 4px;\n }\n\n .autosuggest-textarea__textarea {\n min-height: 100px;\n border-radius: 4px 4px 0 0;\n padding-bottom: 0;\n padding-right: 10px + 22px;\n resize: none;\n scrollbar-color: initial;\n\n &::-webkit-scrollbar {\n all: unset;\n }\n\n @media screen and (max-width: 600px) {\n height: 100px !important; // prevent auto-resize textarea\n resize: vertical;\n }\n }\n\n .autosuggest-textarea__suggestions-wrapper {\n position: relative;\n height: 0;\n }\n\n .autosuggest-textarea__suggestions {\n box-sizing: border-box;\n display: none;\n position: absolute;\n top: 100%;\n width: 100%;\n z-index: 99;\n box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4);\n background: $ui-secondary-color;\n border-radius: 0 0 4px 4px;\n color: $inverted-text-color;\n font-size: 14px;\n padding: 6px;\n\n &.autosuggest-textarea__suggestions--visible {\n display: block;\n }\n }\n\n .autosuggest-textarea__suggestions__item {\n padding: 10px;\n cursor: pointer;\n border-radius: 4px;\n\n &:hover,\n &:focus,\n &:active,\n &.selected {\n background: darken($ui-secondary-color, 10%);\n }\n }\n\n .autosuggest-account,\n .autosuggest-emoji,\n .autosuggest-hashtag {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: flex-start;\n line-height: 18px;\n font-size: 14px;\n }\n\n .autosuggest-hashtag {\n justify-content: space-between;\n\n &__name {\n flex: 1 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n strong {\n font-weight: 500;\n }\n\n &__uses {\n flex: 0 0 auto;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n }\n\n .autosuggest-account-icon,\n .autosuggest-emoji img {\n display: block;\n margin-right: 8px;\n width: 16px;\n height: 16px;\n }\n\n .autosuggest-account .display-name__account {\n color: $lighter-text-color;\n }\n\n .compose-form__modifiers {\n color: $inverted-text-color;\n font-family: inherit;\n font-size: 14px;\n background: $simple-background-color;\n\n .compose-form__upload-wrapper {\n overflow: hidden;\n }\n\n .compose-form__uploads-wrapper {\n display: flex;\n flex-direction: row;\n padding: 5px;\n flex-wrap: wrap;\n }\n\n .compose-form__upload {\n flex: 1 1 0;\n min-width: 40%;\n margin: 5px;\n\n &__actions {\n background: linear-gradient(180deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n opacity: 0;\n transition: opacity .1s ease;\n\n .icon-button {\n flex: 0 1 auto;\n color: $secondary-text-color;\n font-size: 14px;\n font-weight: 500;\n padding: 10px;\n font-family: inherit;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($secondary-text-color, 7%);\n }\n }\n\n &.active {\n opacity: 1;\n }\n }\n\n &-description {\n position: absolute;\n z-index: 2;\n bottom: 0;\n left: 0;\n right: 0;\n box-sizing: border-box;\n background: linear-gradient(0deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);\n padding: 10px;\n opacity: 0;\n transition: opacity .1s ease;\n\n textarea {\n background: transparent;\n color: $secondary-text-color;\n border: 0;\n padding: 0;\n margin: 0;\n width: 100%;\n font-family: inherit;\n font-size: 14px;\n font-weight: 500;\n\n &:focus {\n color: $white;\n }\n\n &::placeholder {\n opacity: 0.75;\n color: $secondary-text-color;\n }\n }\n\n &.active {\n opacity: 1;\n }\n }\n }\n\n .compose-form__upload-thumbnail {\n border-radius: 4px;\n background-color: $base-shadow-color;\n background-position: center;\n background-size: cover;\n background-repeat: no-repeat;\n height: 140px;\n width: 100%;\n overflow: hidden;\n }\n }\n\n .compose-form__buttons-wrapper {\n padding: 10px;\n background: darken($simple-background-color, 8%);\n border-radius: 0 0 4px 4px;\n display: flex;\n justify-content: space-between;\n flex: 0 0 auto;\n\n .compose-form__buttons {\n display: flex;\n\n .compose-form__upload-button-icon {\n line-height: 27px;\n }\n\n .compose-form__sensitive-button {\n display: none;\n\n &.compose-form__sensitive-button--visible {\n display: block;\n }\n\n .compose-form__sensitive-button__icon {\n line-height: 27px;\n }\n }\n }\n\n .icon-button,\n .text-icon-button {\n box-sizing: content-box;\n padding: 0 3px;\n }\n\n .character-counter__wrapper {\n align-self: center;\n margin-right: 4px;\n }\n }\n\n .compose-form__publish {\n display: flex;\n justify-content: flex-end;\n min-width: 0;\n flex: 0 0 auto;\n\n .compose-form__publish-button-wrapper {\n overflow: hidden;\n padding-top: 10px;\n }\n }\n}\n\n.character-counter {\n cursor: default;\n font-family: $font-sans-serif, sans-serif;\n font-size: 14px;\n font-weight: 600;\n color: $lighter-text-color;\n\n &.character-counter--over {\n color: $warning-red;\n }\n}\n\n.no-reduce-motion .spoiler-input {\n transition: height 0.4s ease, opacity 0.4s ease;\n}\n\n.emojione {\n font-size: inherit;\n vertical-align: middle;\n object-fit: contain;\n margin: -.2ex .15em .2ex;\n width: 16px;\n height: 16px;\n\n img {\n width: auto;\n }\n}\n\n.reply-indicator {\n border-radius: 4px;\n margin-bottom: 10px;\n background: $ui-primary-color;\n padding: 10px;\n min-height: 23px;\n overflow-y: auto;\n flex: 0 2 auto;\n}\n\n.reply-indicator__header {\n margin-bottom: 5px;\n overflow: hidden;\n}\n\n.reply-indicator__cancel {\n float: right;\n line-height: 24px;\n}\n\n.reply-indicator__display-name {\n color: $inverted-text-color;\n display: block;\n max-width: 100%;\n line-height: 24px;\n overflow: hidden;\n padding-right: 25px;\n text-decoration: none;\n}\n\n.reply-indicator__display-avatar {\n float: left;\n margin-right: 5px;\n}\n\n.status__content--with-action {\n cursor: pointer;\n}\n\n.status__content,\n.reply-indicator__content {\n position: relative;\n font-size: 15px;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n padding-top: 2px;\n color: $primary-text-color;\n\n &:focus {\n outline: 0;\n }\n\n &.status__content--with-spoiler {\n white-space: normal;\n\n .status__content__text {\n white-space: pre-wrap;\n }\n }\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n img {\n max-width: 100%;\n max-height: 400px;\n object-fit: contain;\n }\n\n p {\n margin-bottom: 20px;\n white-space: pre-wrap;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: $pleroma-links;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n\n .fa {\n color: lighten($dark-text-color, 7%);\n }\n }\n\n &.mention {\n &:hover {\n text-decoration: none;\n\n span {\n text-decoration: underline;\n }\n }\n }\n\n .fa {\n color: $dark-text-color;\n }\n }\n\n a.unhandled-link {\n color: lighten($ui-highlight-color, 8%);\n }\n\n .status__content__spoiler-link {\n background: $action-button-color;\n\n &:hover {\n background: lighten($action-button-color, 7%);\n text-decoration: none;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n\n .status__content__text {\n display: none;\n\n &.status__content__text--visible {\n display: block;\n }\n }\n}\n\n.status__content.status__content--collapsed {\n max-height: 20px * 15; // 15 lines is roughly above 500 characters\n}\n\n.status__content__read-more-button {\n display: block;\n font-size: 15px;\n line-height: 20px;\n color: lighten($ui-highlight-color, 8%);\n border: 0;\n background: transparent;\n padding: 0;\n padding-top: 8px;\n\n &:hover,\n &:active {\n text-decoration: underline;\n }\n}\n\n.status__content__spoiler-link {\n display: inline-block;\n border-radius: 2px;\n background: transparent;\n border: 0;\n color: $inverted-text-color;\n font-weight: 700;\n font-size: 12px;\n padding: 0 6px;\n line-height: 20px;\n cursor: pointer;\n vertical-align: middle;\n}\n\n.status__wrapper--filtered {\n color: $dark-text-color;\n border: 0;\n font-size: inherit;\n text-align: center;\n line-height: inherit;\n margin: 0;\n padding: 15px;\n box-sizing: border-box;\n width: 100%;\n clear: both;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n}\n\n.status__prepend-icon-wrapper {\n left: -26px;\n position: absolute;\n}\n\n.focusable {\n &:focus {\n outline: 0;\n background: lighten($ui-base-color, 4%);\n\n .status.status-direct {\n background: lighten($ui-base-color, 12%);\n\n &.muted {\n background: transparent;\n }\n }\n\n .detailed-status,\n .detailed-status__action-bar {\n background: lighten($ui-base-color, 8%);\n }\n }\n}\n\n.status {\n padding: 8px 10px;\n padding-left: 68px;\n position: relative;\n min-height: 54px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n\n @supports (-ms-overflow-style: -ms-autohiding-scrollbar) {\n // Add margin to avoid Edge auto-hiding scrollbar appearing over content.\n // On Edge 16 this is 16px and Edge <=15 it's 12px, so aim for 16px.\n padding-right: 26px; // 10px + 16px\n }\n\n @keyframes fade {\n 0% { opacity: 0; }\n 100% { opacity: 1; }\n }\n\n opacity: 1;\n animation: fade 150ms linear;\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n }\n\n &.status-direct:not(.read) {\n background: lighten($ui-base-color, 8%);\n border-bottom-color: lighten($ui-base-color, 12%);\n }\n\n &.light {\n .status__relative-time {\n color: $light-text-color;\n }\n\n .status__display-name {\n color: $inverted-text-color;\n }\n\n .display-name {\n strong {\n color: $inverted-text-color;\n }\n\n span {\n color: $light-text-color;\n }\n }\n\n .status__content {\n color: $inverted-text-color;\n\n a {\n color: $highlight-text-color;\n }\n\n a.status__content__spoiler-link {\n color: $primary-text-color;\n background: $ui-primary-color;\n\n &:hover {\n background: lighten($ui-primary-color, 8%);\n }\n }\n }\n }\n}\n\n.notification-favourite {\n .status.status-direct {\n background: transparent;\n\n .icon-button.disabled {\n color: lighten($action-button-color, 13%);\n }\n }\n}\n\n.status__relative-time,\n.notification__relative_time {\n color: $dark-text-color;\n float: right;\n font-size: 14px;\n}\n\n.status__display-name {\n color: $dark-text-color;\n}\n\n.status__info .status__display-name {\n display: block;\n max-width: 100%;\n padding-right: 25px;\n}\n\n.status__info {\n font-size: 15px;\n}\n\n.status-check-box {\n border-bottom: 1px solid $ui-secondary-color;\n display: flex;\n\n .status-check-box__status {\n margin: 10px 0 10px 10px;\n flex: 1;\n\n .media-gallery {\n max-width: 250px;\n }\n\n .status__content {\n padding: 0;\n white-space: normal;\n }\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n max-width: 250px;\n }\n\n .media-gallery__item-thumbnail {\n cursor: default;\n }\n }\n}\n\n.status-check-box-toggle {\n align-items: center;\n display: flex;\n flex: 0 0 auto;\n justify-content: center;\n padding: 10px;\n}\n\n.status__prepend {\n margin-left: 68px;\n color: $dark-text-color;\n padding: 8px 0;\n padding-bottom: 2px;\n font-size: 14px;\n position: relative;\n\n .status__display-name strong {\n color: $dark-text-color;\n }\n\n > span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.status__action-bar {\n align-items: center;\n display: flex;\n margin-top: 8px;\n\n &__counter {\n display: inline-flex;\n margin-right: 11px;\n align-items: center;\n\n .status__action-bar-button {\n margin-right: 4px;\n }\n\n &__label {\n display: inline-block;\n width: 14px;\n font-size: 12px;\n font-weight: 500;\n color: $action-button-color;\n }\n }\n}\n\n.status__action-bar-button {\n margin-right: 18px;\n}\n\n.status__action-bar-dropdown {\n height: 23.15px;\n width: 23.15px;\n}\n\n.detailed-status__action-bar-dropdown {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n}\n\n.detailed-status {\n background: lighten($ui-base-color, 4%);\n padding: 14px 10px;\n\n &--flex {\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n align-items: flex-start;\n\n .status__content,\n .detailed-status__meta {\n flex: 100%;\n }\n }\n\n .status__content {\n font-size: 19px;\n line-height: 24px;\n\n .emojione {\n width: 24px;\n height: 24px;\n margin: -1px 0 0;\n }\n\n .status__content__spoiler-link {\n line-height: 24px;\n margin: -1px 0 0;\n }\n }\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n }\n}\n\n.detailed-status__meta {\n margin-top: 15px;\n color: $dark-text-color;\n font-size: 14px;\n line-height: 18px;\n}\n\n.detailed-status__action-bar {\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: row;\n padding: 10px 0;\n}\n\n.detailed-status__link {\n color: inherit;\n text-decoration: none;\n}\n\n.detailed-status__favorites,\n.detailed-status__reblogs {\n display: inline-block;\n font-weight: 500;\n font-size: 12px;\n margin-left: 6px;\n}\n\n.reply-indicator__content {\n color: $inverted-text-color;\n font-size: 14px;\n\n a {\n color: $lighter-text-color;\n }\n}\n\n.domain {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n .domain__domain-name {\n flex: 1 1 auto;\n display: block;\n color: $primary-text-color;\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n }\n}\n\n.domain__wrapper {\n display: flex;\n}\n\n.domain_buttons {\n height: 18px;\n padding: 10px;\n white-space: nowrap;\n}\n\n.account {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &.compact {\n padding: 0;\n border-bottom: 0;\n\n .account__avatar-wrapper {\n margin-left: 0;\n }\n }\n\n .account__display-name {\n flex: 1 1 auto;\n display: block;\n color: $darker-text-color;\n overflow: hidden;\n text-decoration: none;\n font-size: 14px;\n }\n}\n\n.account__wrapper {\n display: flex;\n}\n\n.account__avatar-wrapper {\n float: left;\n margin-left: 12px;\n margin-right: 12px;\n}\n\n.account__avatar {\n @include avatar-radius;\n position: relative;\n\n &-inline {\n display: inline-block;\n vertical-align: middle;\n margin-right: 5px;\n }\n\n &-composite {\n @include avatar-radius;\n border-radius: 50%;\n overflow: hidden;\n position: relative;\n cursor: default;\n\n & > div {\n float: left;\n position: relative;\n box-sizing: border-box;\n }\n\n &__label {\n display: block;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n color: $primary-text-color;\n text-shadow: 1px 1px 2px $base-shadow-color;\n font-weight: 700;\n font-size: 15px;\n }\n }\n}\n\na .account__avatar {\n cursor: pointer;\n}\n\n.account__avatar-overlay {\n @include avatar-size(48px);\n\n &-base {\n @include avatar-radius;\n @include avatar-size(36px);\n }\n\n &-overlay {\n @include avatar-radius;\n @include avatar-size(24px);\n\n position: absolute;\n bottom: 0;\n right: 0;\n z-index: 1;\n }\n}\n\n.account__relationship {\n height: 18px;\n padding: 10px;\n white-space: nowrap;\n}\n\n.account__disclaimer {\n padding: 10px;\n border-top: 1px solid lighten($ui-base-color, 8%);\n color: $dark-text-color;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n font-weight: 500;\n color: inherit;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n}\n\n.account__action-bar {\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n line-height: 36px;\n overflow: hidden;\n flex: 0 0 auto;\n display: flex;\n}\n\n.account__action-bar-dropdown {\n padding: 10px;\n\n .icon-button {\n vertical-align: middle;\n }\n\n .dropdown--active {\n .dropdown__content.dropdown__right {\n left: 6px;\n right: initial;\n }\n\n &::after {\n bottom: initial;\n margin-left: 11px;\n margin-top: -7px;\n right: initial;\n }\n }\n}\n\n.account__action-bar-links {\n display: flex;\n flex: 1 1 auto;\n line-height: 18px;\n text-align: center;\n}\n\n.account__action-bar__tab {\n text-decoration: none;\n overflow: hidden;\n flex: 0 1 100%;\n border-right: 1px solid lighten($ui-base-color, 8%);\n padding: 10px 0;\n border-bottom: 4px solid transparent;\n\n &.active {\n border-bottom: 4px solid $ui-highlight-color;\n }\n\n & > span {\n display: block;\n font-size: 12px;\n color: $darker-text-color;\n }\n\n strong {\n display: block;\n font-size: 15px;\n font-weight: 500;\n color: $primary-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n}\n\n.account-authorize {\n padding: 14px 10px;\n\n .detailed-status__display-name {\n display: block;\n margin-bottom: 15px;\n overflow: hidden;\n }\n}\n\n.account-authorize__avatar {\n float: left;\n margin-right: 10px;\n}\n\n.status__display-name,\n.status__relative-time,\n.detailed-status__display-name,\n.detailed-status__datetime,\n.detailed-status__application,\n.account__display-name {\n text-decoration: none;\n}\n\n.status__display-name,\n.account__display-name {\n strong {\n color: $primary-text-color;\n }\n}\n\n.muted {\n .emojione {\n opacity: 0.5;\n }\n}\n\n.status__display-name,\n.reply-indicator__display-name,\n.detailed-status__display-name,\na.account__display-name {\n &:hover strong {\n text-decoration: underline;\n }\n}\n\n.account__display-name strong {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.detailed-status__application,\n.detailed-status__datetime {\n color: inherit;\n}\n\n.detailed-status .button.logo-button {\n margin-bottom: 15px;\n}\n\n.detailed-status__display-name {\n color: $secondary-text-color;\n display: block;\n line-height: 24px;\n margin-bottom: 15px;\n overflow: hidden;\n\n strong,\n span {\n display: block;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n strong {\n font-size: 16px;\n color: $primary-text-color;\n }\n}\n\n.detailed-status__display-avatar {\n float: left;\n margin-right: 10px;\n}\n\n.status__avatar {\n height: 48px;\n left: 10px;\n position: absolute;\n top: 10px;\n width: 48px;\n}\n\n.status__expand {\n width: 68px;\n position: absolute;\n left: 0;\n top: 0;\n height: 100%;\n cursor: pointer;\n}\n\n.muted {\n .status__content,\n .status__content p,\n .status__content a {\n color: $dark-text-color;\n }\n\n .status__display-name strong {\n color: $dark-text-color;\n }\n\n .status__avatar {\n opacity: 0.5;\n }\n\n a.status__content__spoiler-link {\n background: $ui-base-lighter-color;\n color: $inverted-text-color;\n\n &:hover {\n background: lighten($ui-base-lighter-color, 7%);\n text-decoration: none;\n }\n }\n}\n\n.notification__message {\n margin: 0 10px 0 68px;\n padding: 8px 0 0;\n cursor: default;\n color: $darker-text-color;\n font-size: 15px;\n line-height: 22px;\n position: relative;\n\n .fa {\n color: $highlight-text-color;\n }\n\n > span {\n display: inline;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.notification__favourite-icon-wrapper {\n left: -26px;\n position: absolute;\n\n .star-icon {\n color: $gold-star;\n }\n}\n\n.star-icon.active {\n color: $gold-star;\n}\n\n.bookmark-icon.active {\n color: $red-bookmark;\n}\n\n.no-reduce-motion .icon-button.star-icon {\n &.activate {\n & > .fa-star {\n animation: spring-rotate-in 1s linear;\n }\n }\n\n &.deactivate {\n & > .fa-star {\n animation: spring-rotate-out 1s linear;\n }\n }\n}\n\n.notification__display-name {\n color: inherit;\n font-weight: 500;\n text-decoration: none;\n\n &:hover {\n color: $primary-text-color;\n text-decoration: underline;\n }\n}\n\n.notification__relative_time {\n float: right;\n}\n\n.display-name {\n display: block;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.display-name__html {\n font-weight: 500;\n}\n\n.display-name__account {\n font-size: 14px;\n}\n\n.status__relative-time,\n.detailed-status__datetime {\n &:hover {\n text-decoration: underline;\n }\n}\n\n.image-loader {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n\n .image-loader__preview-canvas {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n background: url('~images/void.png') repeat;\n object-fit: contain;\n }\n\n .loading-bar {\n position: relative;\n }\n\n &.image-loader--amorphous .image-loader__preview-canvas {\n display: none;\n }\n}\n\n.zoomable-image {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n img {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n width: auto;\n height: auto;\n object-fit: contain;\n }\n}\n\n.navigation-bar {\n padding: 10px;\n display: flex;\n align-items: center;\n flex-shrink: 0;\n cursor: default;\n color: $darker-text-color;\n\n strong {\n color: $secondary-text-color;\n }\n\n a {\n color: inherit;\n }\n\n .permalink {\n text-decoration: none;\n }\n\n .navigation-bar__actions {\n position: relative;\n\n .icon-button.close {\n position: absolute;\n pointer-events: none;\n transform: scale(0, 1) translate(-100%, 0);\n opacity: 0;\n }\n\n .compose__action-bar .icon-button {\n pointer-events: auto;\n transform: scale(1, 1) translate(0, 0);\n opacity: 1;\n }\n }\n}\n\n.navigation-bar__profile {\n flex: 1 1 auto;\n margin-left: 8px;\n line-height: 20px;\n margin-top: -1px;\n overflow: hidden;\n}\n\n.navigation-bar__profile-account {\n display: block;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.navigation-bar__profile-edit {\n color: inherit;\n text-decoration: none;\n}\n\n.dropdown {\n display: inline-block;\n}\n\n.dropdown__content {\n display: none;\n position: absolute;\n}\n\n.dropdown-menu__separator {\n border-bottom: 1px solid darken($ui-secondary-color, 8%);\n margin: 5px 7px 6px;\n height: 0;\n}\n\n.dropdown-menu {\n background: $ui-secondary-color;\n padding: 4px 0;\n border-radius: 4px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n z-index: 9999;\n\n ul {\n list-style: none;\n }\n\n &.left {\n transform-origin: 100% 50%;\n }\n\n &.top {\n transform-origin: 50% 100%;\n }\n\n &.bottom {\n transform-origin: 50% 0;\n }\n\n &.right {\n transform-origin: 0 50%;\n }\n}\n\n.dropdown-menu__arrow {\n position: absolute;\n width: 0;\n height: 0;\n border: 0 solid transparent;\n\n &.left {\n right: -5px;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: $ui-secondary-color;\n }\n\n &.top {\n bottom: -5px;\n margin-left: -7px;\n border-width: 5px 7px 0;\n border-top-color: $ui-secondary-color;\n }\n\n &.bottom {\n top: -5px;\n margin-left: -7px;\n border-width: 0 7px 5px;\n border-bottom-color: $ui-secondary-color;\n }\n\n &.right {\n left: -5px;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: $ui-secondary-color;\n }\n}\n\n.dropdown-menu__item {\n a {\n font-size: 13px;\n line-height: 18px;\n display: block;\n padding: 4px 14px;\n box-sizing: border-box;\n text-decoration: none;\n background: $ui-secondary-color;\n color: $inverted-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:focus,\n &:hover,\n &:active {\n background: $ui-highlight-color;\n color: $secondary-text-color;\n outline: 0;\n }\n }\n}\n\n.dropdown--active .dropdown__content {\n display: block;\n line-height: 18px;\n max-width: 311px;\n right: 0;\n text-align: left;\n z-index: 9999;\n\n & > ul {\n list-style: none;\n background: $ui-secondary-color;\n padding: 4px 0;\n border-radius: 4px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.4);\n min-width: 140px;\n position: relative;\n }\n\n &.dropdown__right {\n right: 0;\n }\n\n &.dropdown__left {\n & > ul {\n left: -98px;\n }\n }\n\n & > ul > li > a {\n font-size: 13px;\n line-height: 18px;\n display: block;\n padding: 4px 14px;\n box-sizing: border-box;\n text-decoration: none;\n background: $ui-secondary-color;\n color: $inverted-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:focus {\n outline: 0;\n }\n\n &:hover {\n background: $ui-highlight-color;\n color: $secondary-text-color;\n }\n }\n}\n\n.dropdown__icon {\n vertical-align: middle;\n}\n\n.columns-area {\n display: flex;\n flex: 1 1 auto;\n flex-direction: row;\n justify-content: flex-start;\n overflow-x: auto;\n position: relative;\n\n &.unscrollable {\n overflow-x: hidden;\n }\n\n &__panels {\n display: flex;\n justify-content: center;\n width: 100%;\n height: 100%;\n min-height: 100vh;\n\n &__pane {\n height: 100%;\n overflow: hidden;\n pointer-events: none;\n display: flex;\n justify-content: flex-end;\n min-width: 285px;\n\n &--start {\n justify-content: flex-start;\n }\n\n &__inner {\n position: fixed;\n width: 285px;\n pointer-events: auto;\n height: 100%;\n }\n }\n\n &__main {\n box-sizing: border-box;\n width: 100%;\n max-width: 600px;\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding: 0 10px;\n }\n }\n }\n}\n\n.tabs-bar__wrapper {\n background: darken($ui-base-color, 8%);\n position: sticky;\n top: 0;\n z-index: 2;\n padding-top: 0;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding-top: 10px;\n }\n\n .tabs-bar {\n margin-bottom: 0;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n margin-bottom: 10px;\n }\n }\n}\n\n.react-swipeable-view-container {\n &,\n .columns-area,\n .drawer,\n .column {\n height: 100%;\n }\n}\n\n.react-swipeable-view-container > * {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n}\n\n.column {\n width: 350px;\n position: relative;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n\n > .scrollable {\n background: $ui-base-color;\n border-bottom-left-radius: 2px;\n border-bottom-right-radius: 2px;\n }\n}\n\n.ui {\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n}\n\n.drawer {\n width: 330px;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n overflow-y: hidden;\n}\n\n.drawer__tab {\n display: block;\n flex: 1 1 auto;\n padding: 15px 5px 13px;\n color: $darker-text-color;\n text-decoration: none;\n text-align: center;\n font-size: 16px;\n border-bottom: 2px solid transparent;\n}\n\n.column,\n.drawer {\n flex: 1 1 auto;\n overflow: hidden;\n}\n\n@media screen and (min-width: 631px) {\n .columns-area {\n padding: 0;\n }\n\n .column,\n .drawer {\n flex: 0 0 auto;\n padding: 10px;\n padding-left: 5px;\n padding-right: 5px;\n\n &:first-child {\n padding-left: 10px;\n }\n\n &:last-child {\n padding-right: 10px;\n }\n }\n\n .columns-area > div {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n }\n }\n}\n\n.tabs-bar {\n box-sizing: border-box;\n display: flex;\n background: lighten($ui-base-color, 8%);\n flex: 0 0 auto;\n overflow-y: auto;\n}\n\n.tabs-bar__link {\n display: block;\n flex: 1 1 auto;\n padding: 15px 10px;\n padding-bottom: 13px;\n color: $primary-text-color;\n text-decoration: none;\n text-align: center;\n font-size: 14px;\n font-weight: 500;\n border-bottom: 2px solid lighten($ui-base-color, 8%);\n transition: all 50ms linear;\n transition-property: border-bottom, background, color;\n\n .fa {\n font-weight: 400;\n font-size: 16px;\n }\n\n &:hover,\n &:focus,\n &:active {\n @media screen and (min-width: 631px) {\n background: lighten($ui-base-color, 14%);\n border-bottom-color: lighten($ui-base-color, 14%);\n }\n }\n\n &.active {\n border-bottom: 2px solid $highlight-text-color;\n color: $highlight-text-color;\n }\n\n span {\n margin-left: 5px;\n display: none;\n }\n}\n\n@media screen and (min-width: 600px) {\n .tabs-bar__link {\n span {\n display: inline;\n }\n }\n}\n\n.columns-area--mobile {\n flex-direction: column;\n width: 100%;\n height: 100%;\n margin: 0 auto;\n\n .column,\n .drawer {\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .directory__list {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: block;\n }\n }\n\n .directory__card {\n margin-bottom: 0;\n }\n\n .filter-form {\n display: flex;\n }\n\n .autosuggest-textarea__textarea {\n font-size: 16px;\n }\n\n .search__input {\n line-height: 18px;\n font-size: 16px;\n padding: 15px;\n padding-right: 30px;\n }\n\n .search__icon .fa {\n top: 15px;\n }\n\n .scrollable {\n overflow: visible;\n\n @supports(display: grid) {\n contain: content;\n }\n }\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding: 10px 0;\n padding-top: 0;\n }\n\n @media screen and (min-width: 630px) {\n .detailed-status {\n padding: 15px;\n\n .media-gallery,\n .video-player,\n .audio-player {\n margin-top: 15px;\n }\n }\n\n .account__header__bar {\n padding: 5px 10px;\n }\n\n .navigation-bar,\n .compose-form {\n padding: 15px;\n }\n\n .compose-form .compose-form__publish .compose-form__publish-button-wrapper {\n padding-top: 15px;\n }\n\n .status {\n padding: 15px 15px 15px (48px + 15px * 2);\n min-height: 48px + 2px;\n\n &__avatar {\n left: 15px;\n top: 17px;\n }\n\n &__content {\n padding-top: 5px;\n }\n\n &__prepend {\n margin-left: 48px + 15px * 2;\n padding-top: 15px;\n }\n\n &__prepend-icon-wrapper {\n left: -32px;\n }\n\n .media-gallery,\n &__action-bar,\n .video-player,\n .audio-player {\n margin-top: 10px;\n }\n }\n\n .account {\n padding: 15px 10px;\n\n &__header__bio {\n margin: 0 -10px;\n }\n }\n\n .notification {\n &__message {\n margin-left: 48px + 15px * 2;\n padding-top: 15px;\n }\n\n &__favourite-icon-wrapper {\n left: -32px;\n }\n\n .status {\n padding-top: 8px;\n }\n\n .account {\n padding-top: 8px;\n }\n\n .account__avatar-wrapper {\n margin-left: 17px;\n margin-right: 15px;\n }\n }\n }\n}\n\n.floating-action-button {\n position: fixed;\n display: flex;\n justify-content: center;\n align-items: center;\n width: 3.9375rem;\n height: 3.9375rem;\n bottom: 1.3125rem;\n right: 1.3125rem;\n background: darken($ui-highlight-color, 3%);\n color: $white;\n border-radius: 50%;\n font-size: 21px;\n line-height: 21px;\n text-decoration: none;\n box-shadow: 2px 3px 9px rgba($base-shadow-color, 0.4);\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-highlight-color, 7%);\n }\n}\n\n@media screen and (min-width: $no-gap-breakpoint) {\n .tabs-bar {\n width: 100%;\n }\n\n .react-swipeable-view-container .columns-area--mobile {\n height: calc(100% - 10px) !important;\n }\n\n .getting-started__wrapper,\n .getting-started__trends,\n .search {\n margin-bottom: 10px;\n }\n\n .getting-started__panel {\n margin: 10px 0;\n }\n\n .column,\n .drawer {\n min-width: 330px;\n }\n}\n\n@media screen and (max-width: 600px + (285px * 1) + (10px * 1)) {\n .columns-area__panels__pane--compositional {\n display: none;\n }\n}\n\n@media screen and (min-width: 600px + (285px * 1) + (10px * 1)) {\n .floating-action-button,\n .tabs-bar__link.optional {\n display: none;\n }\n\n .search-page .search {\n display: none;\n }\n}\n\n@media screen and (max-width: 600px + (285px * 2) + (10px * 2)) {\n .columns-area__panels__pane--navigational {\n display: none;\n }\n}\n\n@media screen and (min-width: 600px + (285px * 2) + (10px * 2)) {\n .tabs-bar {\n display: none;\n }\n}\n\n.icon-with-badge {\n position: relative;\n\n &__badge {\n position: absolute;\n left: 9px;\n top: -13px;\n background: $ui-highlight-color;\n border: 2px solid lighten($ui-base-color, 8%);\n padding: 1px 6px;\n border-radius: 6px;\n font-size: 10px;\n font-weight: 500;\n line-height: 14px;\n color: $primary-text-color;\n }\n}\n\n.column-link--transparent .icon-with-badge__badge {\n border-color: darken($ui-base-color, 8%);\n}\n\n.compose-panel {\n width: 285px;\n margin-top: 10px;\n display: flex;\n flex-direction: column;\n height: calc(100% - 10px);\n overflow-y: hidden;\n\n .navigation-bar {\n padding-top: 20px;\n padding-bottom: 20px;\n flex: 0 1 48px;\n min-height: 20px;\n }\n\n .flex-spacer {\n background: transparent;\n }\n\n .compose-form {\n flex: 1;\n overflow-y: hidden;\n display: flex;\n flex-direction: column;\n min-height: 310px;\n padding-bottom: 71px;\n margin-bottom: -71px;\n }\n\n .compose-form__autosuggest-wrapper {\n overflow-y: auto;\n background-color: $white;\n border-radius: 4px 4px 0 0;\n flex: 0 1 auto;\n }\n\n .autosuggest-textarea__textarea {\n overflow-y: hidden;\n }\n\n .compose-form__upload-thumbnail {\n height: 80px;\n }\n}\n\n.navigation-panel {\n margin-top: 10px;\n margin-bottom: 10px;\n height: calc(100% - 20px);\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n\n & > a {\n flex: 0 0 auto;\n }\n\n hr {\n flex: 0 0 auto;\n border: 0;\n background: transparent;\n border-top: 1px solid lighten($ui-base-color, 4%);\n margin: 10px 0;\n }\n\n .flex-spacer {\n background: transparent;\n }\n}\n\n.drawer__pager {\n box-sizing: border-box;\n padding: 0;\n flex-grow: 1;\n position: relative;\n overflow: hidden;\n display: flex;\n}\n\n.drawer__inner {\n position: absolute;\n top: 0;\n left: 0;\n background: lighten($ui-base-color, 13%);\n box-sizing: border-box;\n padding: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n overflow-y: auto;\n width: 100%;\n height: 100%;\n border-radius: 2px;\n\n &.darker {\n background: $ui-base-color;\n }\n}\n\n.drawer__inner__mastodon {\n background: lighten($ui-base-color, 13%) url('data:image/svg+xml;utf8,') no-repeat bottom / 100% auto;\n flex: 1;\n min-height: 47px;\n display: none;\n\n > img {\n display: block;\n object-fit: contain;\n object-position: bottom left;\n width: 100%;\n height: 100%;\n pointer-events: none;\n user-drag: none;\n user-select: none;\n }\n\n @media screen and (min-height: 640px) {\n display: block;\n }\n}\n\n.pseudo-drawer {\n background: lighten($ui-base-color, 13%);\n font-size: 13px;\n text-align: left;\n}\n\n.drawer__header {\n flex: 0 0 auto;\n font-size: 16px;\n background: lighten($ui-base-color, 8%);\n margin-bottom: 10px;\n display: flex;\n flex-direction: row;\n border-radius: 2px;\n\n a {\n transition: background 100ms ease-in;\n\n &:hover {\n background: lighten($ui-base-color, 3%);\n transition: background 200ms ease-out;\n }\n }\n}\n\n.scrollable {\n overflow-y: scroll;\n overflow-x: hidden;\n flex: 1 1 auto;\n -webkit-overflow-scrolling: touch;\n\n &.optionally-scrollable {\n overflow-y: auto;\n }\n\n @supports(display: grid) { // hack to fix Chrome <57\n contain: strict;\n }\n\n &--flex {\n display: flex;\n flex-direction: column;\n }\n\n &__append {\n flex: 1 1 auto;\n position: relative;\n min-height: 120px;\n }\n}\n\n.scrollable.fullscreen {\n @supports(display: grid) { // hack to fix Chrome <57\n contain: none;\n }\n}\n\n.column-back-button {\n box-sizing: border-box;\n width: 100%;\n background: lighten($ui-base-color, 4%);\n color: $highlight-text-color;\n cursor: pointer;\n flex: 0 0 auto;\n font-size: 16px;\n line-height: inherit;\n border: 0;\n text-align: unset;\n padding: 15px;\n margin: 0;\n z-index: 3;\n outline: 0;\n\n &:hover {\n text-decoration: underline;\n }\n}\n\n.column-header__back-button {\n background: lighten($ui-base-color, 4%);\n border: 0;\n font-family: inherit;\n color: $highlight-text-color;\n cursor: pointer;\n white-space: nowrap;\n font-size: 16px;\n padding: 0 5px 0 0;\n z-index: 3;\n\n &:hover {\n text-decoration: underline;\n }\n\n &:last-child {\n padding: 0 15px 0 0;\n }\n}\n\n.column-back-button__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.column-back-button--slim {\n position: relative;\n}\n\n.column-back-button--slim-button {\n cursor: pointer;\n flex: 0 0 auto;\n font-size: 16px;\n padding: 15px;\n position: absolute;\n right: 0;\n top: -48px;\n}\n\n.react-toggle {\n display: inline-block;\n position: relative;\n cursor: pointer;\n background-color: transparent;\n border: 0;\n padding: 0;\n user-select: none;\n -webkit-tap-highlight-color: rgba($base-overlay-background, 0);\n -webkit-tap-highlight-color: transparent;\n}\n\n.react-toggle-screenreader-only {\n border: 0;\n clip: rect(0 0 0 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n}\n\n.react-toggle--disabled {\n cursor: not-allowed;\n opacity: 0.5;\n transition: opacity 0.25s;\n}\n\n.react-toggle-track {\n width: 50px;\n height: 24px;\n padding: 0;\n border-radius: 30px;\n background-color: $ui-base-color;\n transition: background-color 0.2s ease;\n}\n\n.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track {\n background-color: darken($ui-base-color, 10%);\n}\n\n.react-toggle--checked .react-toggle-track {\n background-color: $ui-highlight-color;\n}\n\n.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track {\n background-color: lighten($ui-highlight-color, 10%);\n}\n\n.react-toggle-track-check {\n position: absolute;\n width: 14px;\n height: 10px;\n top: 0;\n bottom: 0;\n margin-top: auto;\n margin-bottom: auto;\n line-height: 0;\n left: 8px;\n opacity: 0;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle--checked .react-toggle-track-check {\n opacity: 1;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle-track-x {\n position: absolute;\n width: 10px;\n height: 10px;\n top: 0;\n bottom: 0;\n margin-top: auto;\n margin-bottom: auto;\n line-height: 0;\n right: 10px;\n opacity: 1;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle--checked .react-toggle-track-x {\n opacity: 0;\n}\n\n.react-toggle-thumb {\n position: absolute;\n top: 1px;\n left: 1px;\n width: 22px;\n height: 22px;\n border: 1px solid $ui-base-color;\n border-radius: 50%;\n background-color: darken($simple-background-color, 2%);\n box-sizing: border-box;\n transition: all 0.25s ease;\n transition-property: border-color, left;\n}\n\n.react-toggle--checked .react-toggle-thumb {\n left: 27px;\n border-color: $ui-highlight-color;\n}\n\n.column-link {\n background: lighten($ui-base-color, 8%);\n color: $primary-text-color;\n display: block;\n font-size: 16px;\n padding: 15px;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 11%);\n }\n\n &:focus {\n outline: 0;\n }\n\n &--transparent {\n background: transparent;\n color: $ui-secondary-color;\n\n &:hover,\n &:focus,\n &:active {\n background: transparent;\n color: $primary-text-color;\n }\n\n &.active {\n color: $ui-highlight-color;\n }\n }\n}\n\n.column-link__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.column-link__badge {\n display: inline-block;\n border-radius: 4px;\n font-size: 12px;\n line-height: 19px;\n font-weight: 500;\n background: $ui-base-color;\n padding: 4px 8px;\n margin: -6px 10px;\n}\n\n.column-subheading {\n background: $ui-base-color;\n color: $dark-text-color;\n padding: 8px 20px;\n font-size: 13px;\n font-weight: 500;\n cursor: default;\n}\n\n.getting-started__wrapper,\n.getting-started,\n.flex-spacer {\n background: $ui-base-color;\n}\n\n.flex-spacer {\n flex: 1 1 auto;\n}\n\n.getting-started {\n color: $dark-text-color;\n overflow: auto;\n border-bottom-left-radius: 2px;\n border-bottom-right-radius: 2px;\n\n &__wrapper,\n &__panel,\n &__footer {\n height: min-content;\n }\n\n &__panel,\n &__footer\n {\n padding: 10px;\n padding-top: 20px;\n flex-grow: 0;\n\n ul {\n margin-bottom: 10px;\n }\n\n ul li {\n display: inline;\n }\n\n p {\n font-size: 13px;\n\n a {\n color: $dark-text-color;\n text-decoration: underline;\n }\n }\n\n a {\n text-decoration: none;\n color: $darker-text-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n }\n\n &__wrapper,\n &__footer\n {\n color: $dark-text-color;\n }\n\n &__trends {\n flex: 0 1 auto;\n opacity: 1;\n animation: fade 150ms linear;\n margin-top: 10px;\n\n h4 {\n font-size: 13px;\n color: $darker-text-color;\n padding: 10px;\n font-weight: 500;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n @media screen and (max-height: 810px) {\n .trends__item:nth-child(3) {\n display: none;\n }\n }\n\n @media screen and (max-height: 720px) {\n .trends__item:nth-child(2) {\n display: none;\n }\n }\n\n @media screen and (max-height: 670px) {\n display: none;\n }\n\n .trends__item {\n border-bottom: 0;\n padding: 10px;\n\n &__current {\n color: $darker-text-color;\n }\n }\n }\n}\n\n.keyboard-shortcuts {\n padding: 8px 0 0;\n overflow: hidden;\n\n thead {\n position: absolute;\n left: -9999px;\n }\n\n td {\n padding: 0 10px 8px;\n }\n\n kbd {\n display: inline-block;\n padding: 3px 5px;\n background-color: lighten($ui-base-color, 8%);\n border: 1px solid darken($ui-base-color, 4%);\n }\n}\n\n.setting-text {\n display: block;\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n color: $inverted-text-color;\n background: $simple-background-color;\n padding: 10px;\n font-family: inherit;\n font-size: 14px;\n resize: vertical;\n border: 0;\n outline: 0;\n border-radius: 4px;\n\n &:focus {\n outline: 0;\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n}\n\n.no-reduce-motion button.icon-button i.fa-retweet {\n background-position: 0 0;\n height: 19px;\n transition: background-position 0.9s steps(10);\n transition-duration: 0s;\n vertical-align: middle;\n width: 22px;\n\n &::before {\n display: none !important;\n }\n\n}\n\n.no-reduce-motion button.icon-button.active i.fa-retweet {\n transition-duration: 0.9s;\n background-position: 0 100%;\n}\n\n.reduce-motion button.icon-button i.fa-retweet {\n color: $action-button-color;\n transition: color 100ms ease-in;\n}\n\n.reduce-motion button.icon-button.active i.fa-retweet {\n color: $highlight-text-color;\n}\n\n.status-card {\n display: flex;\n font-size: 14px;\n border: 1px solid lighten($ui-base-color, 8%);\n border-radius: 4px;\n color: $dark-text-color;\n margin-top: 14px;\n text-decoration: none;\n overflow: hidden;\n\n &__actions {\n bottom: 0;\n left: 0;\n position: absolute;\n right: 0;\n top: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n\n & > div {\n background: rgba($base-shadow-color, 0.6);\n border-radius: 8px;\n padding: 12px 9px;\n flex: 0 0 auto;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n button,\n a {\n display: inline;\n color: $secondary-text-color;\n background: transparent;\n border: 0;\n padding: 0 8px;\n text-decoration: none;\n font-size: 18px;\n line-height: 18px;\n\n &:hover,\n &:active,\n &:focus {\n color: $primary-text-color;\n }\n }\n\n a {\n font-size: 19px;\n position: relative;\n bottom: -1px;\n }\n }\n}\n\na.status-card {\n cursor: pointer;\n\n &:hover {\n background: lighten($ui-base-color, 8%);\n }\n}\n\n.status-card-photo {\n cursor: zoom-in;\n display: block;\n text-decoration: none;\n width: 100%;\n height: auto;\n margin: 0;\n}\n\n.status-card-video {\n iframe {\n width: 100%;\n height: 100%;\n }\n}\n\n.status-card__title {\n display: block;\n font-weight: 500;\n margin-bottom: 5px;\n color: $darker-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-decoration: none;\n}\n\n.status-card__content {\n flex: 1 1 auto;\n overflow: hidden;\n padding: 14px 14px 14px 8px;\n}\n\n.status-card__description {\n color: $darker-text-color;\n}\n\n.status-card__host {\n display: block;\n margin-top: 5px;\n font-size: 13px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.status-card__image {\n flex: 0 0 100px;\n background: lighten($ui-base-color, 8%);\n position: relative;\n\n & > .fa {\n font-size: 21px;\n position: absolute;\n transform-origin: 50% 50%;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n}\n\n.status-card.horizontal {\n display: block;\n\n .status-card__image {\n width: 100%;\n }\n\n .status-card__image-image {\n border-radius: 4px 4px 0 0;\n }\n\n .status-card__title {\n white-space: inherit;\n }\n}\n\n.status-card.compact {\n border-color: lighten($ui-base-color, 4%);\n\n &.interactive {\n border: 0;\n }\n\n .status-card__content {\n padding: 8px;\n padding-top: 10px;\n }\n\n .status-card__title {\n white-space: nowrap;\n }\n\n .status-card__image {\n flex: 0 0 60px;\n }\n}\n\na.status-card.compact:hover {\n background-color: lighten($ui-base-color, 4%);\n}\n\n.status-card__image-image {\n border-radius: 4px 0 0 4px;\n display: block;\n margin: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n background-size: cover;\n background-position: center center;\n}\n\n.load-more {\n display: block;\n color: $dark-text-color;\n background-color: transparent;\n border: 0;\n font-size: inherit;\n text-align: center;\n line-height: inherit;\n margin: 0;\n padding: 15px;\n box-sizing: border-box;\n width: 100%;\n clear: both;\n text-decoration: none;\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n}\n\n.load-gap {\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n}\n\n.regeneration-indicator {\n text-align: center;\n font-size: 16px;\n font-weight: 500;\n color: $dark-text-color;\n background: $ui-base-color;\n cursor: default;\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 20px;\n\n &__figure {\n &,\n img {\n display: block;\n width: auto;\n height: 160px;\n margin: 0;\n }\n }\n\n &--without-header {\n padding-top: 20px + 48px;\n }\n\n &__label {\n margin-top: 30px;\n\n strong {\n display: block;\n margin-bottom: 10px;\n color: $dark-text-color;\n }\n\n span {\n font-size: 15px;\n font-weight: 400;\n }\n }\n}\n\n.column-header__wrapper {\n position: relative;\n flex: 0 0 auto;\n\n &.active {\n &::before {\n display: block;\n content: \"\";\n position: absolute;\n top: 35px;\n left: 0;\n right: 0;\n margin: 0 auto;\n width: 60%;\n pointer-events: none;\n height: 28px;\n z-index: 1;\n background: radial-gradient(ellipse, rgba($ui-highlight-color, 0.23) 0%, rgba($ui-highlight-color, 0) 60%);\n }\n }\n}\n\n.column-header {\n display: flex;\n font-size: 16px;\n background: lighten($ui-base-color, 4%);\n flex: 0 0 auto;\n cursor: pointer;\n position: relative;\n z-index: 2;\n outline: 0;\n overflow: hidden;\n border-top-left-radius: 2px;\n border-top-right-radius: 2px;\n\n & > button {\n margin: 0;\n border: 0;\n padding: 15px 0 15px 15px;\n color: inherit;\n background: transparent;\n font: inherit;\n text-align: left;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n flex: 1;\n }\n\n & > .column-header__back-button {\n color: $highlight-text-color;\n }\n\n &.active {\n box-shadow: 0 1px 0 rgba($highlight-text-color, 0.3);\n\n .column-header__icon {\n color: $highlight-text-color;\n text-shadow: 0 0 10px rgba($highlight-text-color, 0.4);\n }\n }\n\n &:focus,\n &:active {\n outline: 0;\n }\n}\n\n.column-header__buttons {\n height: 48px;\n display: flex;\n}\n\n.column-header__links {\n margin-bottom: 14px;\n}\n\n.column-header__links .text-btn {\n margin-right: 10px;\n}\n\n.column-header__button {\n background: lighten($ui-base-color, 4%);\n border: 0;\n color: $darker-text-color;\n cursor: pointer;\n font-size: 16px;\n padding: 0 15px;\n\n &:hover {\n color: lighten($darker-text-color, 7%);\n }\n\n &.active {\n color: $primary-text-color;\n background: lighten($ui-base-color, 8%);\n\n &:hover {\n color: $primary-text-color;\n background: lighten($ui-base-color, 8%);\n }\n }\n}\n\n.column-header__collapsible {\n max-height: 70vh;\n overflow: hidden;\n overflow-y: auto;\n color: $darker-text-color;\n transition: max-height 150ms ease-in-out, opacity 300ms linear;\n opacity: 1;\n\n &.collapsed {\n max-height: 0;\n opacity: 0.5;\n }\n\n &.animating {\n overflow-y: hidden;\n }\n\n hr {\n height: 0;\n background: transparent;\n border: 0;\n border-top: 1px solid lighten($ui-base-color, 12%);\n margin: 10px 0;\n }\n}\n\n.column-header__collapsible-inner {\n background: lighten($ui-base-color, 8%);\n padding: 15px;\n}\n\n.column-header__setting-btn {\n &:hover {\n color: $darker-text-color;\n text-decoration: underline;\n }\n}\n\n.column-header__setting-arrows {\n float: right;\n\n .column-header__setting-btn {\n padding: 0 10px;\n\n &:last-child {\n padding-right: 0;\n }\n }\n}\n\n.text-btn {\n display: inline-block;\n padding: 0;\n font-family: inherit;\n font-size: inherit;\n color: inherit;\n border: 0;\n background: transparent;\n cursor: pointer;\n}\n\n.column-header__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.loading-indicator {\n color: $dark-text-color;\n font-size: 13px;\n font-weight: 400;\n overflow: visible;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n\n span {\n display: block;\n float: left;\n margin-left: 50%;\n transform: translateX(-50%);\n margin: 82px 0 0 50%;\n white-space: nowrap;\n }\n}\n\n.loading-indicator__figure {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 42px;\n height: 42px;\n box-sizing: border-box;\n background-color: transparent;\n border: 0 solid lighten($ui-base-color, 26%);\n border-width: 6px;\n border-radius: 50%;\n}\n\n.no-reduce-motion .loading-indicator span {\n animation: loader-label 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1);\n}\n\n.no-reduce-motion .loading-indicator__figure {\n animation: loader-figure 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1);\n}\n\n@keyframes spring-rotate-in {\n 0% {\n transform: rotate(0deg);\n }\n\n 30% {\n transform: rotate(-484.8deg);\n }\n\n 60% {\n transform: rotate(-316.7deg);\n }\n\n 90% {\n transform: rotate(-375deg);\n }\n\n 100% {\n transform: rotate(-360deg);\n }\n}\n\n@keyframes spring-rotate-out {\n 0% {\n transform: rotate(-360deg);\n }\n\n 30% {\n transform: rotate(124.8deg);\n }\n\n 60% {\n transform: rotate(-43.27deg);\n }\n\n 90% {\n transform: rotate(15deg);\n }\n\n 100% {\n transform: rotate(0deg);\n }\n}\n\n@keyframes loader-figure {\n 0% {\n width: 0;\n height: 0;\n background-color: lighten($ui-base-color, 26%);\n }\n\n 29% {\n background-color: lighten($ui-base-color, 26%);\n }\n\n 30% {\n width: 42px;\n height: 42px;\n background-color: transparent;\n border-width: 21px;\n opacity: 1;\n }\n\n 100% {\n width: 42px;\n height: 42px;\n border-width: 0;\n opacity: 0;\n background-color: transparent;\n }\n}\n\n@keyframes loader-label {\n 0% { opacity: 0.25; }\n 30% { opacity: 1; }\n 100% { opacity: 0.25; }\n}\n\n.video-error-cover {\n align-items: center;\n background: $base-overlay-background;\n color: $primary-text-color;\n cursor: pointer;\n display: flex;\n flex-direction: column;\n height: 100%;\n justify-content: center;\n margin-top: 8px;\n position: relative;\n text-align: center;\n z-index: 100;\n}\n\n.media-spoiler {\n background: $base-overlay-background;\n color: $darker-text-color;\n border: 0;\n padding: 0;\n width: 100%;\n height: 100%;\n border-radius: 4px;\n appearance: none;\n\n &:hover,\n &:active,\n &:focus {\n padding: 0;\n color: lighten($darker-text-color, 8%);\n }\n}\n\n.media-spoiler__warning {\n display: block;\n font-size: 14px;\n}\n\n.media-spoiler__trigger {\n display: block;\n font-size: 11px;\n font-weight: 700;\n}\n\n.spoiler-button {\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n position: absolute;\n z-index: 100;\n\n &--minified {\n display: block;\n left: 4px;\n top: 4px;\n width: auto;\n height: auto;\n }\n\n &--click-thru {\n pointer-events: none;\n }\n\n &--hidden {\n display: none;\n }\n\n &__overlay {\n display: block;\n background: transparent;\n width: 100%;\n height: 100%;\n border: 0;\n\n &__label {\n display: inline-block;\n background: rgba($base-overlay-background, 0.5);\n border-radius: 8px;\n padding: 8px 12px;\n color: $primary-text-color;\n font-weight: 500;\n font-size: 14px;\n }\n\n &:hover,\n &:focus,\n &:active {\n .spoiler-button__overlay__label {\n background: rgba($base-overlay-background, 0.8);\n }\n }\n\n &:disabled {\n .spoiler-button__overlay__label {\n background: rgba($base-overlay-background, 0.5);\n }\n }\n }\n}\n\n.modal-container--preloader {\n background: lighten($ui-base-color, 8%);\n}\n\n.account--panel {\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: row;\n padding: 10px 0;\n}\n\n.account--panel__button,\n.detailed-status__button {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.column-settings__outer {\n background: lighten($ui-base-color, 8%);\n padding: 15px;\n}\n\n.column-settings__section {\n color: $darker-text-color;\n cursor: default;\n display: block;\n font-weight: 500;\n margin-bottom: 10px;\n}\n\n.column-settings__hashtags {\n .column-settings__row {\n margin-bottom: 15px;\n }\n\n .column-select {\n &__control {\n @include search-input;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n &__placeholder {\n color: $dark-text-color;\n padding-left: 2px;\n font-size: 12px;\n }\n\n &__value-container {\n padding-left: 6px;\n }\n\n &__multi-value {\n background: lighten($ui-base-color, 8%);\n\n &__remove {\n cursor: pointer;\n\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 12%);\n color: lighten($darker-text-color, 4%);\n }\n }\n }\n\n &__multi-value__label,\n &__input {\n color: $darker-text-color;\n }\n\n &__clear-indicator,\n &__dropdown-indicator {\n cursor: pointer;\n transition: none;\n color: $dark-text-color;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($dark-text-color, 4%);\n }\n }\n\n &__indicator-separator {\n background-color: lighten($ui-base-color, 8%);\n }\n\n &__menu {\n @include search-popout;\n padding: 0;\n background: $ui-secondary-color;\n }\n\n &__menu-list {\n padding: 6px;\n }\n\n &__option {\n color: $inverted-text-color;\n border-radius: 4px;\n font-size: 14px;\n\n &--is-focused,\n &--is-selected {\n background: darken($ui-secondary-color, 10%);\n }\n }\n }\n}\n\n.column-settings__row {\n .text-btn {\n margin-bottom: 15px;\n }\n}\n\n.relationship-tag {\n color: $primary-text-color;\n margin-bottom: 4px;\n display: block;\n vertical-align: top;\n background-color: $base-overlay-background;\n font-size: 12px;\n font-weight: 500;\n padding: 4px;\n border-radius: 4px;\n opacity: 0.7;\n\n &:hover {\n opacity: 1;\n }\n}\n\n.setting-toggle {\n display: block;\n line-height: 24px;\n}\n\n.setting-toggle__label {\n color: $darker-text-color;\n display: inline-block;\n margin-bottom: 14px;\n margin-left: 8px;\n vertical-align: middle;\n}\n\n.empty-column-indicator,\n.error-column {\n color: $dark-text-color;\n background: $ui-base-color;\n text-align: center;\n padding: 20px;\n font-size: 15px;\n font-weight: 400;\n cursor: default;\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n justify-content: center;\n\n @supports(display: grid) { // hack to fix Chrome <57\n contain: strict;\n }\n\n & > span {\n max-width: 400px;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.error-column {\n flex-direction: column;\n}\n\n@keyframes heartbeat {\n from {\n transform: scale(1);\n animation-timing-function: ease-out;\n }\n\n 10% {\n transform: scale(0.91);\n animation-timing-function: ease-in;\n }\n\n 17% {\n transform: scale(0.98);\n animation-timing-function: ease-out;\n }\n\n 33% {\n transform: scale(0.87);\n animation-timing-function: ease-in;\n }\n\n 45% {\n transform: scale(1);\n animation-timing-function: ease-out;\n }\n}\n\n.no-reduce-motion .pulse-loading {\n transform-origin: center center;\n animation: heartbeat 1.5s ease-in-out infinite both;\n}\n\n@keyframes shake-bottom {\n 0%,\n 100% {\n transform: rotate(0deg);\n transform-origin: 50% 100%;\n }\n\n 10% {\n transform: rotate(2deg);\n }\n\n 20%,\n 40%,\n 60% {\n transform: rotate(-4deg);\n }\n\n 30%,\n 50%,\n 70% {\n transform: rotate(4deg);\n }\n\n 80% {\n transform: rotate(-2deg);\n }\n\n 90% {\n transform: rotate(2deg);\n }\n}\n\n.no-reduce-motion .shake-bottom {\n transform-origin: 50% 100%;\n animation: shake-bottom 0.8s cubic-bezier(0.455, 0.03, 0.515, 0.955) 2s 2 both;\n}\n\n.emoji-picker-dropdown__menu {\n background: $simple-background-color;\n position: absolute;\n box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n margin-top: 5px;\n z-index: 2;\n\n .emoji-mart-scroll {\n transition: opacity 200ms ease;\n }\n\n &.selecting .emoji-mart-scroll {\n opacity: 0.5;\n }\n}\n\n.emoji-picker-dropdown__modifiers {\n position: absolute;\n top: 60px;\n right: 11px;\n cursor: pointer;\n}\n\n.emoji-picker-dropdown__modifiers__menu {\n position: absolute;\n z-index: 4;\n top: -4px;\n left: -8px;\n background: $simple-background-color;\n border-radius: 4px;\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n overflow: hidden;\n\n button {\n display: block;\n cursor: pointer;\n border: 0;\n padding: 4px 8px;\n background: transparent;\n\n &:hover,\n &:focus,\n &:active {\n background: rgba($ui-secondary-color, 0.4);\n }\n }\n\n .emoji-mart-emoji {\n height: 22px;\n }\n}\n\n.emoji-mart-emoji {\n span {\n background-repeat: no-repeat;\n }\n}\n\n.upload-area {\n align-items: center;\n background: rgba($base-overlay-background, 0.8);\n display: flex;\n height: 100%;\n justify-content: center;\n left: 0;\n opacity: 0;\n position: absolute;\n top: 0;\n visibility: hidden;\n width: 100%;\n z-index: 2000;\n\n * {\n pointer-events: none;\n }\n}\n\n.upload-area__drop {\n width: 320px;\n height: 160px;\n display: flex;\n box-sizing: border-box;\n position: relative;\n padding: 8px;\n}\n\n.upload-area__background {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: -1;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 5px rgba($base-shadow-color, 0.2);\n}\n\n.upload-area__content {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: $secondary-text-color;\n font-size: 18px;\n font-weight: 500;\n border: 2px dashed $ui-base-lighter-color;\n border-radius: 4px;\n}\n\n.upload-progress {\n padding: 10px;\n color: $lighter-text-color;\n overflow: hidden;\n display: flex;\n\n .fa {\n font-size: 34px;\n margin-right: 10px;\n }\n\n span {\n font-size: 13px;\n font-weight: 500;\n display: block;\n }\n}\n\n.upload-progess__message {\n flex: 1 1 auto;\n}\n\n.upload-progress__backdrop {\n width: 100%;\n height: 6px;\n border-radius: 6px;\n background: $ui-base-lighter-color;\n position: relative;\n margin-top: 5px;\n}\n\n.upload-progress__tracker {\n position: absolute;\n left: 0;\n top: 0;\n height: 6px;\n background: $ui-highlight-color;\n border-radius: 6px;\n}\n\n.emoji-button {\n display: block;\n font-size: 24px;\n line-height: 24px;\n margin-left: 2px;\n width: 24px;\n outline: 0;\n cursor: pointer;\n\n &:active,\n &:focus {\n outline: 0 !important;\n }\n\n img {\n filter: grayscale(100%);\n opacity: 0.8;\n display: block;\n margin: 0;\n width: 22px;\n height: 22px;\n margin-top: 2px;\n }\n\n &:hover,\n &:active,\n &:focus {\n img {\n opacity: 1;\n filter: none;\n }\n }\n}\n\n.dropdown--active .emoji-button img {\n opacity: 1;\n filter: none;\n}\n\n.privacy-dropdown__dropdown {\n position: absolute;\n background: $simple-background-color;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n margin-left: 40px;\n overflow: hidden;\n\n &.top {\n transform-origin: 50% 100%;\n }\n\n &.bottom {\n transform-origin: 50% 0;\n }\n}\n\n.privacy-dropdown__option {\n color: $inverted-text-color;\n padding: 10px;\n cursor: pointer;\n display: flex;\n\n &:hover,\n &.active {\n background: $ui-highlight-color;\n color: $primary-text-color;\n outline: 0;\n\n .privacy-dropdown__option__content {\n color: $primary-text-color;\n\n strong {\n color: $primary-text-color;\n }\n }\n }\n\n &.active:hover {\n background: lighten($ui-highlight-color, 4%);\n }\n}\n\n.privacy-dropdown__option__icon {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 10px;\n}\n\n.privacy-dropdown__option__content {\n flex: 1 1 auto;\n color: $lighter-text-color;\n\n strong {\n font-weight: 500;\n display: block;\n color: $inverted-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n}\n\n.privacy-dropdown.active {\n .privacy-dropdown__value {\n background: $simple-background-color;\n border-radius: 4px 4px 0 0;\n box-shadow: 0 -4px 4px rgba($base-shadow-color, 0.1);\n\n .icon-button {\n transition: none;\n }\n\n &.active {\n background: $ui-highlight-color;\n\n .icon-button {\n color: $primary-text-color;\n }\n }\n }\n\n &.top .privacy-dropdown__value {\n border-radius: 0 0 4px 4px;\n }\n\n .privacy-dropdown__dropdown {\n display: block;\n box-shadow: 2px 4px 6px rgba($base-shadow-color, 0.1);\n }\n}\n\n.search {\n position: relative;\n}\n\n.search__input {\n @include search-input;\n\n display: block;\n padding: 15px;\n padding-right: 30px;\n line-height: 18px;\n font-size: 16px;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n}\n\n.search__icon {\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus {\n outline: 0 !important;\n }\n\n .fa {\n position: absolute;\n top: 16px;\n right: 10px;\n z-index: 2;\n display: inline-block;\n opacity: 0;\n transition: all 100ms linear;\n transition-property: transform, opacity;\n font-size: 18px;\n width: 18px;\n height: 18px;\n color: $secondary-text-color;\n cursor: default;\n pointer-events: none;\n\n &.active {\n pointer-events: auto;\n opacity: 0.3;\n }\n }\n\n .fa-search {\n transform: rotate(90deg);\n\n &.active {\n pointer-events: none;\n transform: rotate(0deg);\n }\n }\n\n .fa-times-circle {\n top: 17px;\n transform: rotate(0deg);\n color: $action-button-color;\n cursor: pointer;\n\n &.active {\n transform: rotate(90deg);\n }\n\n &:hover {\n color: lighten($action-button-color, 7%);\n }\n }\n}\n\n.search-results__header {\n color: $dark-text-color;\n background: lighten($ui-base-color, 2%);\n padding: 15px;\n font-weight: 500;\n font-size: 16px;\n cursor: default;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n}\n\n.search-results__section {\n margin-bottom: 5px;\n\n h5 {\n background: darken($ui-base-color, 4%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n display: flex;\n padding: 15px;\n font-weight: 500;\n font-size: 16px;\n color: $dark-text-color;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n .account:last-child,\n & > div:last-child .status {\n border-bottom: 0;\n }\n}\n\n.search-results__hashtag {\n display: block;\n padding: 10px;\n color: $secondary-text-color;\n text-decoration: none;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($secondary-text-color, 4%);\n text-decoration: underline;\n }\n}\n\n.search-results__info {\n padding: 20px;\n color: $darker-text-color;\n text-align: center;\n}\n\n.modal-root {\n position: relative;\n transition: opacity 0.3s linear;\n will-change: opacity;\n z-index: 9999;\n}\n\n.modal-root__overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba($base-overlay-background, 0.7);\n}\n\n.modal-root__container {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n align-content: space-around;\n z-index: 9999;\n pointer-events: none;\n user-select: none;\n}\n\n.modal-root__modal {\n pointer-events: auto;\n display: flex;\n z-index: 9999;\n}\n\n.video-modal__container {\n max-width: 100vw;\n max-height: 100vh;\n}\n\n.audio-modal__container {\n width: 50vw;\n}\n\n.media-modal {\n width: 100%;\n height: 100%;\n position: relative;\n\n .extended-video-player {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n video {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n }\n }\n}\n\n.media-modal__closer {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n}\n\n.media-modal__navigation {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n transition: opacity 0.3s linear;\n will-change: opacity;\n\n * {\n pointer-events: auto;\n }\n\n &.media-modal__navigation--hidden {\n opacity: 0;\n\n * {\n pointer-events: none;\n }\n }\n}\n\n.media-modal__nav {\n background: rgba($base-overlay-background, 0.5);\n box-sizing: border-box;\n border: 0;\n color: $primary-text-color;\n cursor: pointer;\n display: flex;\n align-items: center;\n font-size: 24px;\n height: 20vmax;\n margin: auto 0;\n padding: 30px 15px;\n position: absolute;\n top: 0;\n bottom: 0;\n}\n\n.media-modal__nav--left {\n left: 0;\n}\n\n.media-modal__nav--right {\n right: 0;\n}\n\n.media-modal__pagination {\n width: 100%;\n text-align: center;\n position: absolute;\n left: 0;\n bottom: 20px;\n pointer-events: none;\n}\n\n.media-modal__meta {\n text-align: center;\n position: absolute;\n left: 0;\n bottom: 20px;\n width: 100%;\n pointer-events: none;\n\n &--shifted {\n bottom: 62px;\n }\n\n a {\n pointer-events: auto;\n text-decoration: none;\n font-weight: 500;\n color: $ui-secondary-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.media-modal__page-dot {\n display: inline-block;\n}\n\n.media-modal__button {\n background-color: $primary-text-color;\n height: 12px;\n width: 12px;\n border-radius: 6px;\n margin: 10px;\n padding: 0;\n border: 0;\n font-size: 0;\n}\n\n.media-modal__button--active {\n background-color: $highlight-text-color;\n}\n\n.media-modal__close {\n position: absolute;\n right: 8px;\n top: 8px;\n z-index: 100;\n}\n\n.onboarding-modal,\n.error-modal,\n.embed-modal {\n background: $ui-secondary-color;\n color: $inverted-text-color;\n border-radius: 8px;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.error-modal__body {\n height: 80vh;\n width: 80vw;\n max-width: 520px;\n max-height: 420px;\n position: relative;\n\n & > div {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n padding: 25px;\n display: none;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n display: flex;\n opacity: 0;\n user-select: text;\n }\n}\n\n.error-modal__body {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n text-align: center;\n}\n\n.onboarding-modal__paginator,\n.error-modal__footer {\n flex: 0 0 auto;\n background: darken($ui-secondary-color, 8%);\n display: flex;\n padding: 25px;\n\n & > div {\n min-width: 33px;\n }\n\n .onboarding-modal__nav,\n .error-modal__nav {\n color: $lighter-text-color;\n border: 0;\n font-size: 14px;\n font-weight: 500;\n padding: 10px 25px;\n line-height: inherit;\n height: auto;\n margin: -10px;\n border-radius: 4px;\n background-color: transparent;\n\n &:hover,\n &:focus,\n &:active {\n color: darken($lighter-text-color, 4%);\n background-color: darken($ui-secondary-color, 16%);\n }\n\n &.onboarding-modal__done,\n &.onboarding-modal__next {\n color: $inverted-text-color;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($inverted-text-color, 4%);\n }\n }\n }\n}\n\n.error-modal__footer {\n justify-content: center;\n}\n\n.display-case {\n text-align: center;\n font-size: 15px;\n margin-bottom: 15px;\n\n &__label {\n font-weight: 500;\n color: $inverted-text-color;\n margin-bottom: 5px;\n font-size: 13px;\n }\n\n &__case {\n background: $ui-base-color;\n color: $secondary-text-color;\n font-weight: 500;\n padding: 10px;\n border-radius: 4px;\n }\n}\n\n.onboard-sliders {\n display: inline-block;\n max-width: 30px;\n max-height: auto;\n margin-left: 10px;\n}\n\n.boost-modal,\n.confirmation-modal,\n.report-modal,\n.actions-modal,\n.mute-modal,\n.block-modal {\n background: lighten($ui-secondary-color, 8%);\n color: $inverted-text-color;\n border-radius: 8px;\n overflow: hidden;\n max-width: 90vw;\n width: 480px;\n position: relative;\n flex-direction: column;\n\n .status__display-name {\n display: block;\n max-width: 100%;\n padding-right: 25px;\n }\n\n .status__avatar {\n height: 28px;\n left: 10px;\n position: absolute;\n top: 10px;\n width: 48px;\n }\n\n .status__content__spoiler-link {\n color: lighten($secondary-text-color, 8%);\n }\n}\n\n.actions-modal {\n .status {\n background: $white;\n border-bottom-color: $ui-secondary-color;\n padding-top: 10px;\n padding-bottom: 10px;\n }\n\n .dropdown-menu__separator {\n border-bottom-color: $ui-secondary-color;\n }\n}\n\n.boost-modal__container {\n overflow-x: scroll;\n padding: 10px;\n\n .status {\n user-select: text;\n border-bottom: 0;\n }\n}\n\n.boost-modal__action-bar,\n.confirmation-modal__action-bar,\n.mute-modal__action-bar,\n.block-modal__action-bar {\n display: flex;\n justify-content: space-between;\n background: $ui-secondary-color;\n padding: 10px;\n line-height: 36px;\n\n & > div {\n flex: 1 1 auto;\n text-align: right;\n color: $lighter-text-color;\n padding-right: 10px;\n }\n\n .button {\n flex: 0 0 auto;\n }\n}\n\n.boost-modal__status-header {\n font-size: 15px;\n}\n\n.boost-modal__status-time {\n float: right;\n font-size: 14px;\n}\n\n.mute-modal,\n.block-modal {\n line-height: 24px;\n}\n\n.mute-modal .react-toggle,\n.block-modal .react-toggle {\n vertical-align: middle;\n}\n\n.report-modal {\n width: 90vw;\n max-width: 700px;\n}\n\n.report-modal__container {\n display: flex;\n border-top: 1px solid $ui-secondary-color;\n\n @media screen and (max-width: 480px) {\n flex-wrap: wrap;\n overflow-y: auto;\n }\n}\n\n.report-modal__statuses,\n.report-modal__comment {\n box-sizing: border-box;\n width: 50%;\n\n @media screen and (max-width: 480px) {\n width: 100%;\n }\n}\n\n.report-modal__statuses,\n.focal-point-modal__content {\n flex: 1 1 auto;\n min-height: 20vh;\n max-height: 80vh;\n overflow-y: auto;\n overflow-x: hidden;\n\n .status__content a {\n color: $highlight-text-color;\n }\n\n .status__content,\n .status__content p {\n color: $inverted-text-color;\n }\n\n @media screen and (max-width: 480px) {\n max-height: 10vh;\n }\n}\n\n.focal-point-modal__content {\n @media screen and (max-width: 480px) {\n max-height: 40vh;\n }\n}\n\n.report-modal__comment {\n padding: 20px;\n border-right: 1px solid $ui-secondary-color;\n max-width: 320px;\n\n p {\n font-size: 14px;\n line-height: 20px;\n margin-bottom: 20px;\n }\n\n .setting-text {\n display: block;\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n color: $inverted-text-color;\n background: $white;\n padding: 10px;\n font-family: inherit;\n font-size: 14px;\n resize: none;\n border: 0;\n outline: 0;\n border-radius: 4px;\n border: 1px solid $ui-secondary-color;\n min-height: 100px;\n max-height: 50vh;\n margin-bottom: 10px;\n\n &:focus {\n border: 1px solid darken($ui-secondary-color, 8%);\n }\n\n &__wrapper {\n background: $white;\n border: 1px solid $ui-secondary-color;\n margin-bottom: 10px;\n border-radius: 4px;\n\n .setting-text {\n border: 0;\n margin-bottom: 0;\n border-radius: 0;\n\n &:focus {\n border: 0;\n }\n }\n\n &__modifiers {\n color: $inverted-text-color;\n font-family: inherit;\n font-size: 14px;\n background: $white;\n }\n }\n\n &__toolbar {\n display: flex;\n justify-content: space-between;\n margin-bottom: 20px;\n }\n }\n\n .setting-text-label {\n display: block;\n color: $inverted-text-color;\n font-size: 14px;\n font-weight: 500;\n margin-bottom: 10px;\n }\n\n .setting-toggle {\n margin-top: 20px;\n margin-bottom: 24px;\n\n &__label {\n color: $inverted-text-color;\n font-size: 14px;\n }\n }\n\n @media screen and (max-width: 480px) {\n padding: 10px;\n max-width: 100%;\n order: 2;\n\n .setting-toggle {\n margin-bottom: 4px;\n }\n }\n}\n\n.actions-modal {\n max-height: 80vh;\n max-width: 80vw;\n\n .status {\n overflow-y: auto;\n max-height: 300px;\n }\n\n .actions-modal__item-label {\n font-weight: 500;\n }\n\n ul {\n overflow-y: auto;\n flex-shrink: 0;\n max-height: 80vh;\n\n &.with-status {\n max-height: calc(80vh - 75px);\n }\n\n li:empty {\n margin: 0;\n }\n\n li:not(:empty) {\n a {\n color: $inverted-text-color;\n display: flex;\n padding: 12px 16px;\n font-size: 15px;\n align-items: center;\n text-decoration: none;\n\n &,\n button {\n transition: none;\n }\n\n &.active,\n &:hover,\n &:active,\n &:focus {\n &,\n button {\n background: $ui-highlight-color;\n color: $primary-text-color;\n }\n }\n\n button:first-child {\n margin-right: 10px;\n }\n }\n }\n }\n}\n\n.confirmation-modal__action-bar,\n.mute-modal__action-bar,\n.block-modal__action-bar {\n .confirmation-modal__secondary-button {\n flex-shrink: 1;\n }\n}\n\n.confirmation-modal__secondary-button,\n.confirmation-modal__cancel-button,\n.mute-modal__cancel-button,\n.block-modal__cancel-button {\n background-color: transparent;\n color: $lighter-text-color;\n font-size: 14px;\n font-weight: 500;\n\n &:hover,\n &:focus,\n &:active {\n color: darken($lighter-text-color, 4%);\n background-color: transparent;\n }\n}\n\n.confirmation-modal__container,\n.mute-modal__container,\n.block-modal__container,\n.report-modal__target {\n padding: 30px;\n font-size: 16px;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n}\n\n.confirmation-modal__container,\n.report-modal__target {\n text-align: center;\n}\n\n.block-modal,\n.mute-modal {\n &__explanation {\n margin-top: 20px;\n }\n\n .setting-toggle {\n margin-top: 20px;\n margin-bottom: 24px;\n display: flex;\n align-items: center;\n\n &__label {\n color: $inverted-text-color;\n margin: 0;\n margin-left: 8px;\n }\n }\n}\n\n.report-modal__target {\n padding: 15px;\n\n .media-modal__close {\n top: 14px;\n right: 15px;\n }\n}\n\n.loading-bar {\n background-color: $highlight-text-color;\n height: 3px;\n position: absolute;\n top: 0;\n left: 0;\n z-index: 9999;\n}\n\n.media-gallery__gifv__label {\n display: block;\n position: absolute;\n color: $primary-text-color;\n background: rgba($base-overlay-background, 0.5);\n bottom: 6px;\n left: 6px;\n padding: 2px 6px;\n border-radius: 2px;\n font-size: 11px;\n font-weight: 600;\n z-index: 1;\n pointer-events: none;\n opacity: 0.9;\n transition: opacity 0.1s ease;\n line-height: 18px;\n}\n\n.media-gallery__gifv {\n &.autoplay {\n .media-gallery__gifv__label {\n display: none;\n }\n }\n\n &:hover {\n .media-gallery__gifv__label {\n opacity: 1;\n }\n }\n}\n\n.media-gallery__audio {\n margin-top: 32px;\n\n audio {\n width: 100%;\n }\n}\n\n.attachment-list {\n display: flex;\n font-size: 14px;\n border: 1px solid lighten($ui-base-color, 8%);\n border-radius: 4px;\n margin-top: 14px;\n overflow: hidden;\n\n &__icon {\n flex: 0 0 auto;\n color: $dark-text-color;\n padding: 8px 18px;\n cursor: default;\n border-right: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n font-size: 26px;\n\n .fa {\n display: block;\n }\n }\n\n &__list {\n list-style: none;\n padding: 4px 0;\n padding-left: 8px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n\n li {\n display: block;\n padding: 4px 0;\n }\n\n a {\n text-decoration: none;\n color: $dark-text-color;\n font-weight: 500;\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n &.compact {\n border: 0;\n margin-top: 4px;\n\n .attachment-list__list {\n padding: 0;\n display: block;\n }\n\n .fa {\n color: $dark-text-color;\n }\n }\n}\n\n/* Media Gallery */\n.media-gallery {\n box-sizing: border-box;\n margin-top: 8px;\n overflow: hidden;\n border-radius: 4px;\n position: relative;\n width: 100%;\n}\n\n.media-gallery__item {\n border: 0;\n box-sizing: border-box;\n display: block;\n float: left;\n position: relative;\n border-radius: 4px;\n overflow: hidden;\n\n &.standalone {\n .media-gallery__item-gifv-thumbnail {\n transform: none;\n top: 0;\n }\n }\n}\n\n.media-gallery__item-thumbnail {\n cursor: zoom-in;\n display: block;\n text-decoration: none;\n color: $secondary-text-color;\n position: relative;\n z-index: 1;\n\n &,\n img {\n height: 100%;\n width: 100%;\n }\n\n img {\n object-fit: cover;\n }\n}\n\n.media-gallery__preview {\n width: 100%;\n height: 100%;\n object-fit: cover;\n position: absolute;\n top: 0;\n left: 0;\n z-index: 0;\n background: $base-overlay-background;\n\n &--hidden {\n display: none;\n }\n}\n\n.media-gallery__gifv {\n height: 100%;\n overflow: hidden;\n position: relative;\n width: 100%;\n}\n\n.media-gallery__item-gifv-thumbnail {\n cursor: zoom-in;\n height: 100%;\n object-fit: cover;\n position: relative;\n top: 50%;\n transform: translateY(-50%);\n width: 100%;\n z-index: 1;\n}\n\n.media-gallery__item-thumbnail-label {\n clip: rect(1px 1px 1px 1px); /* IE6, IE7 */\n clip: rect(1px, 1px, 1px, 1px);\n overflow: hidden;\n position: absolute;\n}\n/* End Media Gallery */\n\n.detailed,\n.fullscreen {\n .video-player__volume__current,\n .video-player__volume::before {\n bottom: 27px;\n }\n\n .video-player__volume__handle {\n bottom: 23px;\n }\n\n}\n\n.audio-player {\n box-sizing: border-box;\n position: relative;\n background: darken($ui-base-color, 8%);\n border-radius: 4px;\n padding-bottom: 44px;\n direction: ltr;\n\n &.editable {\n border-radius: 0;\n height: 100%;\n }\n\n &__waveform {\n padding: 15px 0;\n position: relative;\n overflow: hidden;\n\n &::before {\n content: \"\";\n display: block;\n position: absolute;\n border-top: 1px solid lighten($ui-base-color, 4%);\n width: 100%;\n height: 0;\n left: 0;\n top: calc(50% + 1px);\n }\n }\n\n &__progress-placeholder {\n background-color: rgba(lighten($ui-highlight-color, 8%), 0.5);\n }\n\n &__wave-placeholder {\n background-color: lighten($ui-base-color, 16%);\n }\n\n .video-player__controls {\n padding: 0 15px;\n padding-top: 10px;\n background: darken($ui-base-color, 8%);\n border-top: 1px solid lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n }\n}\n\n.video-player {\n overflow: hidden;\n position: relative;\n background: $base-shadow-color;\n max-width: 100%;\n border-radius: 4px;\n box-sizing: border-box;\n direction: ltr;\n\n &.editable {\n border-radius: 0;\n height: 100% !important;\n }\n\n &:focus {\n outline: 0;\n }\n\n video {\n max-width: 100vw;\n max-height: 80vh;\n z-index: 1;\n }\n\n &.fullscreen {\n width: 100% !important;\n height: 100% !important;\n margin: 0;\n\n video {\n max-width: 100% !important;\n max-height: 100% !important;\n width: 100% !important;\n height: 100% !important;\n outline: 0;\n }\n }\n\n &.inline {\n video {\n object-fit: contain;\n position: relative;\n top: 50%;\n transform: translateY(-50%);\n }\n }\n\n &__controls {\n position: absolute;\n z-index: 2;\n bottom: 0;\n left: 0;\n right: 0;\n box-sizing: border-box;\n background: linear-gradient(0deg, rgba($base-shadow-color, 0.85) 0, rgba($base-shadow-color, 0.45) 60%, transparent);\n padding: 0 15px;\n opacity: 0;\n transition: opacity .1s ease;\n\n &.active {\n opacity: 1;\n }\n }\n\n &.inactive {\n video,\n .video-player__controls {\n visibility: hidden;\n }\n }\n\n &__spoiler {\n display: none;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 4;\n border: 0;\n background: $base-overlay-background;\n color: $darker-text-color;\n transition: none;\n pointer-events: none;\n\n &.active {\n display: block;\n pointer-events: auto;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($darker-text-color, 7%);\n }\n }\n\n &__title {\n display: block;\n font-size: 14px;\n }\n\n &__subtitle {\n display: block;\n font-size: 11px;\n font-weight: 500;\n }\n }\n\n &__buttons-bar {\n display: flex;\n justify-content: space-between;\n padding-bottom: 10px;\n\n .video-player__download__icon {\n color: inherit;\n }\n }\n\n &__buttons {\n font-size: 16px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &.left {\n button {\n padding-left: 0;\n }\n }\n\n &.right {\n button {\n padding-right: 0;\n }\n }\n\n button {\n background: transparent;\n padding: 2px 10px;\n font-size: 16px;\n border: 0;\n color: rgba($white, 0.75);\n\n &:active,\n &:hover,\n &:focus {\n color: $white;\n }\n }\n }\n\n &__time-sep,\n &__time-total,\n &__time-current {\n font-size: 14px;\n font-weight: 500;\n }\n\n &__time-current {\n color: $white;\n margin-left: 60px;\n }\n\n &__time-sep {\n display: inline-block;\n margin: 0 6px;\n }\n\n &__time-sep,\n &__time-total {\n color: $white;\n }\n\n &__volume {\n cursor: pointer;\n height: 24px;\n display: inline;\n\n &::before {\n content: \"\";\n width: 50px;\n background: rgba($white, 0.35);\n border-radius: 4px;\n display: block;\n position: absolute;\n height: 4px;\n left: 70px;\n bottom: 20px;\n }\n\n &__current {\n display: block;\n position: absolute;\n height: 4px;\n border-radius: 4px;\n left: 70px;\n bottom: 20px;\n background: lighten($ui-highlight-color, 8%);\n }\n\n &__handle {\n position: absolute;\n z-index: 3;\n border-radius: 50%;\n width: 12px;\n height: 12px;\n bottom: 16px;\n left: 70px;\n transition: opacity .1s ease;\n background: lighten($ui-highlight-color, 8%);\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n pointer-events: none;\n }\n }\n\n &__link {\n padding: 2px 10px;\n\n a {\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n color: $white;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n }\n\n &__seek {\n cursor: pointer;\n height: 24px;\n position: relative;\n\n &::before {\n content: \"\";\n width: 100%;\n background: rgba($white, 0.35);\n border-radius: 4px;\n display: block;\n position: absolute;\n height: 4px;\n top: 10px;\n }\n\n &__progress,\n &__buffer {\n display: block;\n position: absolute;\n height: 4px;\n border-radius: 4px;\n top: 10px;\n background: lighten($ui-highlight-color, 8%);\n }\n\n &__buffer {\n background: rgba($white, 0.2);\n }\n\n &__handle {\n position: absolute;\n z-index: 3;\n opacity: 0;\n border-radius: 50%;\n width: 12px;\n height: 12px;\n top: 6px;\n margin-left: -6px;\n transition: opacity .1s ease;\n background: lighten($ui-highlight-color, 8%);\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n pointer-events: none;\n\n &.active {\n opacity: 1;\n }\n }\n\n &:hover {\n .video-player__seek__handle {\n opacity: 1;\n }\n }\n }\n\n &.detailed,\n &.fullscreen {\n .video-player__buttons {\n button {\n padding-top: 10px;\n padding-bottom: 10px;\n }\n }\n }\n}\n\n.directory {\n &__list {\n width: 100%;\n margin: 10px 0;\n transition: opacity 100ms ease-in;\n\n &.loading {\n opacity: 0.7;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin: 0;\n }\n }\n\n &__card {\n box-sizing: border-box;\n margin-bottom: 10px;\n\n &__img {\n height: 125px;\n position: relative;\n background: darken($ui-base-color, 12%);\n overflow: hidden;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n object-fit: cover;\n }\n }\n\n &__bar {\n display: flex;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n padding: 10px;\n\n &__name {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n text-decoration: none;\n overflow: hidden;\n }\n\n &__relationship {\n width: 23px;\n min-height: 1px;\n flex: 0 0 auto;\n }\n\n .avatar {\n flex: 0 0 auto;\n width: 48px;\n height: 48px;\n padding-top: 2px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n background: darken($ui-base-color, 8%);\n object-fit: cover;\n }\n }\n\n .display-name {\n margin-left: 15px;\n text-align: left;\n\n strong {\n font-size: 15px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n span {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n &__extra {\n background: $ui-base-color;\n display: flex;\n align-items: center;\n justify-content: center;\n\n .accounts-table__count {\n width: 33.33%;\n flex: 0 0 auto;\n padding: 15px 0;\n }\n\n .account__header__content {\n box-sizing: border-box;\n padding: 15px 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n width: 100%;\n min-height: 18px + 30px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n p {\n display: none;\n\n &:first-child {\n display: inline;\n }\n }\n\n br {\n display: none;\n }\n }\n }\n }\n}\n\n.account-gallery__container {\n display: flex;\n flex-wrap: wrap;\n padding: 4px 2px;\n}\n\n.account-gallery__item {\n border: 0;\n box-sizing: border-box;\n display: block;\n position: relative;\n border-radius: 4px;\n overflow: hidden;\n margin: 2px;\n\n &__icons {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 24px;\n }\n}\n\n.notification__filter-bar,\n.account__section-headline {\n background: darken($ui-base-color, 4%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n display: flex;\n flex-shrink: 0;\n\n button {\n background: darken($ui-base-color, 4%);\n border: 0;\n margin: 0;\n }\n\n button,\n a {\n display: block;\n flex: 1 1 auto;\n color: $darker-text-color;\n padding: 15px 0;\n font-size: 14px;\n font-weight: 500;\n text-align: center;\n text-decoration: none;\n position: relative;\n\n &.active {\n color: $secondary-text-color;\n\n &::before,\n &::after {\n display: block;\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 50%;\n width: 0;\n height: 0;\n transform: translateX(-50%);\n border-style: solid;\n border-width: 0 10px 10px;\n border-color: transparent transparent lighten($ui-base-color, 8%);\n }\n\n &::after {\n bottom: -1px;\n border-color: transparent transparent $ui-base-color;\n }\n }\n }\n\n &.directory__section-headline {\n background: darken($ui-base-color, 2%);\n border-bottom-color: transparent;\n\n a,\n button {\n &.active {\n &::before {\n display: none;\n }\n\n &::after {\n border-color: transparent transparent darken($ui-base-color, 7%);\n }\n }\n }\n }\n}\n\n.filter-form {\n background: $ui-base-color;\n\n &__column {\n padding: 10px 15px;\n }\n\n .radio-button {\n display: block;\n }\n}\n\n.radio-button {\n font-size: 14px;\n position: relative;\n display: inline-block;\n padding: 6px 0;\n line-height: 18px;\n cursor: default;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n cursor: pointer;\n\n input[type=radio],\n input[type=checkbox] {\n display: none;\n }\n\n &__input {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 50%;\n vertical-align: middle;\n\n &.checked {\n border-color: lighten($ui-highlight-color, 8%);\n background: lighten($ui-highlight-color, 8%);\n }\n }\n}\n\n::-webkit-scrollbar-thumb {\n border-radius: 0;\n}\n\n.search-popout {\n @include search-popout;\n}\n\nnoscript {\n text-align: center;\n\n img {\n width: 200px;\n opacity: 0.5;\n animation: flicker 4s infinite;\n }\n\n div {\n font-size: 14px;\n margin: 30px auto;\n color: $secondary-text-color;\n max-width: 400px;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n }\n}\n\n@keyframes flicker {\n 0% { opacity: 1; }\n 30% { opacity: 0.75; }\n 100% { opacity: 1; }\n}\n\n@media screen and (max-width: 630px) and (max-height: 400px) {\n $duration: 400ms;\n $delay: 100ms;\n\n .tabs-bar,\n .search {\n will-change: margin-top;\n transition: margin-top $duration $delay;\n }\n\n .navigation-bar {\n will-change: padding-bottom;\n transition: padding-bottom $duration $delay;\n }\n\n .navigation-bar {\n & > a:first-child {\n will-change: margin-top, margin-left, margin-right, width;\n transition: margin-top $duration $delay, margin-left $duration ($duration + $delay), margin-right $duration ($duration + $delay);\n }\n\n & > .navigation-bar__profile-edit {\n will-change: margin-top;\n transition: margin-top $duration $delay;\n }\n\n .navigation-bar__actions {\n & > .icon-button.close {\n will-change: opacity transform;\n transition: opacity $duration * 0.5 $delay,\n transform $duration $delay;\n }\n\n & > .compose__action-bar .icon-button {\n will-change: opacity transform;\n transition: opacity $duration * 0.5 $delay + $duration * 0.5,\n transform $duration $delay;\n }\n }\n }\n\n .is-composing {\n .tabs-bar,\n .search {\n margin-top: -50px;\n }\n\n .navigation-bar {\n padding-bottom: 0;\n\n & > a:first-child {\n margin: -100px 10px 0 -50px;\n }\n\n .navigation-bar__profile {\n padding-top: 2px;\n }\n\n .navigation-bar__profile-edit {\n position: absolute;\n margin-top: -60px;\n }\n\n .navigation-bar__actions {\n .icon-button.close {\n pointer-events: auto;\n opacity: 1;\n transform: scale(1, 1) translate(0, 0);\n bottom: 5px;\n }\n\n .compose__action-bar .icon-button {\n pointer-events: none;\n opacity: 0;\n transform: scale(0, 1) translate(100%, 0);\n }\n }\n }\n }\n}\n\n.embed-modal {\n width: auto;\n max-width: 80vw;\n max-height: 80vh;\n\n h4 {\n padding: 30px;\n font-weight: 500;\n font-size: 16px;\n text-align: center;\n }\n\n .embed-modal__container {\n padding: 10px;\n\n .hint {\n margin-bottom: 15px;\n }\n\n .embed-modal__html {\n outline: 0;\n box-sizing: border-box;\n display: block;\n width: 100%;\n border: 0;\n padding: 10px;\n font-family: $font-monospace, monospace;\n background: $ui-base-color;\n color: $primary-text-color;\n font-size: 14px;\n margin: 0;\n margin-bottom: 15px;\n border-radius: 4px;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n .embed-modal__iframe {\n width: 400px;\n max-width: 100%;\n overflow: hidden;\n border: 0;\n border-radius: 4px;\n }\n }\n}\n\n.account__moved-note {\n padding: 14px 10px;\n padding-bottom: 16px;\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &__message {\n position: relative;\n margin-left: 58px;\n color: $dark-text-color;\n padding: 8px 0;\n padding-top: 0;\n padding-bottom: 4px;\n font-size: 14px;\n\n > span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n &__icon-wrapper {\n left: -26px;\n position: absolute;\n }\n\n .detailed-status__display-avatar {\n position: relative;\n }\n\n .detailed-status__display-name {\n margin-bottom: 0;\n }\n}\n\n.column-inline-form {\n padding: 15px;\n padding-right: 0;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n\n label {\n flex: 1 1 auto;\n\n input {\n width: 100%;\n\n &:focus {\n outline: 0;\n }\n }\n }\n\n .icon-button {\n flex: 0 0 auto;\n margin: 0 10px;\n }\n}\n\n.drawer__backdrop {\n cursor: pointer;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba($base-overlay-background, 0.5);\n}\n\n.list-editor {\n background: $ui-base-color;\n flex-direction: column;\n border-radius: 8px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n width: 380px;\n overflow: hidden;\n\n @media screen and (max-width: 420px) {\n width: 90%;\n }\n\n h4 {\n padding: 15px 0;\n background: lighten($ui-base-color, 13%);\n font-weight: 500;\n font-size: 16px;\n text-align: center;\n border-radius: 8px 8px 0 0;\n }\n\n .drawer__pager {\n height: 50vh;\n }\n\n .drawer__inner {\n border-radius: 0 0 8px 8px;\n\n &.backdrop {\n width: calc(100% - 60px);\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n border-radius: 0 0 0 8px;\n }\n }\n\n &__accounts {\n overflow-y: auto;\n }\n\n .account__display-name {\n &:hover strong {\n text-decoration: none;\n }\n }\n\n .account__avatar {\n cursor: default;\n }\n\n .search {\n margin-bottom: 0;\n }\n}\n\n.list-adder {\n background: $ui-base-color;\n flex-direction: column;\n border-radius: 8px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n width: 380px;\n overflow: hidden;\n\n @media screen and (max-width: 420px) {\n width: 90%;\n }\n\n &__account {\n background: lighten($ui-base-color, 13%);\n }\n\n &__lists {\n background: lighten($ui-base-color, 13%);\n height: 50vh;\n border-radius: 0 0 8px 8px;\n overflow-y: auto;\n }\n\n .list {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n .list__wrapper {\n display: flex;\n }\n\n .list__display-name {\n flex: 1 1 auto;\n overflow: hidden;\n text-decoration: none;\n font-size: 16px;\n padding: 10px;\n }\n}\n\n.focal-point {\n position: relative;\n cursor: move;\n overflow: hidden;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n background: $base-shadow-color;\n\n img,\n video,\n canvas {\n display: block;\n max-height: 80vh;\n width: 100%;\n height: auto;\n margin: 0;\n object-fit: contain;\n background: $base-shadow-color;\n }\n\n &__reticle {\n position: absolute;\n width: 100px;\n height: 100px;\n transform: translate(-50%, -50%);\n background: url('~images/reticle.png') no-repeat 0 0;\n border-radius: 50%;\n box-shadow: 0 0 0 9999em rgba($base-shadow-color, 0.35);\n }\n\n &__overlay {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n }\n\n &__preview {\n position: absolute;\n bottom: 10px;\n right: 10px;\n z-index: 2;\n cursor: move;\n transition: opacity 0.1s ease;\n\n &:hover {\n opacity: 0.5;\n }\n\n strong {\n color: $primary-text-color;\n font-size: 14px;\n font-weight: 500;\n display: block;\n margin-bottom: 5px;\n }\n\n div {\n border-radius: 4px;\n box-shadow: 0 0 14px rgba($base-shadow-color, 0.2);\n }\n }\n\n @media screen and (max-width: 480px) {\n img,\n video {\n max-height: 100%;\n }\n\n &__preview {\n display: none;\n }\n }\n}\n\n.account__header__content {\n color: $darker-text-color;\n font-size: 14px;\n font-weight: 400;\n overflow: hidden;\n word-break: normal;\n word-wrap: break-word;\n\n p {\n margin-bottom: 20px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: inherit;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n}\n\n.account__header {\n overflow: hidden;\n\n &.inactive {\n opacity: 0.5;\n\n .account__header__image,\n .account__avatar {\n filter: grayscale(100%);\n }\n }\n\n &__info {\n position: absolute;\n top: 10px;\n left: 10px;\n }\n\n &__image {\n overflow: hidden;\n height: 145px;\n position: relative;\n background: darken($ui-base-color, 4%);\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n }\n }\n\n &__bar {\n position: relative;\n background: lighten($ui-base-color, 4%);\n padding: 5px;\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n\n .avatar {\n display: block;\n flex: 0 0 auto;\n width: 94px;\n margin-left: -2px;\n\n .account__avatar {\n background: darken($ui-base-color, 8%);\n border: 2px solid lighten($ui-base-color, 4%);\n }\n }\n }\n\n &__tabs {\n display: flex;\n align-items: flex-start;\n padding: 7px 5px;\n margin-top: -55px;\n\n &__buttons {\n display: flex;\n align-items: center;\n padding-top: 55px;\n overflow: hidden;\n\n .icon-button {\n border: 1px solid lighten($ui-base-color, 12%);\n border-radius: 4px;\n box-sizing: content-box;\n padding: 2px;\n }\n\n .button {\n margin: 0 8px;\n }\n }\n\n &__name {\n padding: 5px;\n\n .account-role {\n vertical-align: top;\n }\n\n .emojione {\n width: 22px;\n height: 22px;\n }\n\n h1 {\n font-size: 16px;\n line-height: 24px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n\n small {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n .spacer {\n flex: 1 1 auto;\n }\n }\n\n &__bio {\n overflow: hidden;\n margin: 0 -5px;\n\n .account__header__content {\n padding: 20px 15px;\n padding-bottom: 5px;\n color: $primary-text-color;\n }\n\n .account__header__fields {\n margin: 0;\n border-top: 1px solid lighten($ui-base-color, 12%);\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n }\n\n &__extra {\n margin-top: 4px;\n\n &__links {\n font-size: 14px;\n color: $darker-text-color;\n padding: 10px 0;\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n padding: 5px 10px;\n font-weight: 500;\n\n strong {\n font-weight: 700;\n color: $primary-text-color;\n }\n }\n }\n }\n}\n\n.trends {\n &__header {\n color: $dark-text-color;\n background: lighten($ui-base-color, 2%);\n border-bottom: 1px solid darken($ui-base-color, 4%);\n font-weight: 500;\n padding: 15px;\n font-size: 16px;\n cursor: default;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n &__item {\n display: flex;\n align-items: center;\n padding: 15px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &:last-child {\n border-bottom: 0;\n }\n\n &__name {\n flex: 1 1 auto;\n color: $dark-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n strong {\n font-weight: 500;\n }\n\n a {\n color: $darker-text-color;\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:hover,\n &:focus,\n &:active {\n span {\n text-decoration: underline;\n }\n }\n }\n }\n\n &__current {\n flex: 0 0 auto;\n font-size: 24px;\n line-height: 36px;\n font-weight: 500;\n text-align: right;\n padding-right: 15px;\n margin-left: 5px;\n color: $secondary-text-color;\n }\n\n &__sparkline {\n flex: 0 0 auto;\n width: 50px;\n\n path:first-child {\n fill: rgba($highlight-text-color, 0.25) !important;\n fill-opacity: 1 !important;\n }\n\n path:last-child {\n stroke: lighten($highlight-text-color, 6%) !important;\n }\n }\n }\n}\n\n.conversation {\n display: flex;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n padding: 5px;\n padding-bottom: 0;\n\n &:focus {\n background: lighten($ui-base-color, 2%);\n outline: 0;\n }\n\n &__avatar {\n flex: 0 0 auto;\n padding: 10px;\n padding-top: 12px;\n position: relative;\n }\n\n &__unread {\n display: inline-block;\n background: $highlight-text-color;\n border-radius: 50%;\n width: 0.625rem;\n height: 0.625rem;\n margin: -.1ex .15em .1ex;\n }\n\n &__content {\n flex: 1 1 auto;\n padding: 10px 5px;\n padding-right: 15px;\n overflow: hidden;\n\n &__info {\n overflow: hidden;\n display: flex;\n flex-direction: row-reverse;\n justify-content: space-between;\n }\n\n &__relative-time {\n font-size: 15px;\n color: $darker-text-color;\n padding-left: 15px;\n }\n\n &__names {\n color: $darker-text-color;\n font-size: 15px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-bottom: 4px;\n flex-basis: 90px;\n flex-grow: 1;\n\n a {\n color: $primary-text-color;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n }\n\n a {\n word-break: break-word;\n }\n }\n\n &--unread {\n background: lighten($ui-base-color, 2%);\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n .conversation__content__info {\n font-weight: 700;\n }\n\n .conversation__content__relative-time {\n color: $primary-text-color;\n }\n }\n}\n",null,"@mixin avatar-radius {\n border-radius: 4px;\n background: transparent no-repeat;\n background-position: 50%;\n background-clip: padding-box;\n}\n\n@mixin avatar-size($size: 48px) {\n width: $size;\n height: $size;\n background-size: $size $size;\n}\n\n@mixin search-input {\n outline: 0;\n box-sizing: border-box;\n width: 100%;\n border: 0;\n box-shadow: none;\n font-family: inherit;\n background: $ui-base-color;\n color: $darker-text-color;\n font-size: 14px;\n margin: 0;\n}\n\n@mixin search-popout {\n background: $simple-background-color;\n border-radius: 4px;\n padding: 10px 14px;\n padding-bottom: 14px;\n margin-top: 10px;\n color: $light-text-color;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n\n h4 {\n color: $light-text-color;\n font-size: 14px;\n font-weight: 500;\n margin-bottom: 10px;\n }\n\n li {\n padding: 4px 0;\n }\n\n ul {\n margin-bottom: 10px;\n }\n\n em {\n font-weight: 500;\n color: $inverted-text-color;\n }\n}\n",".poll {\n margin-top: 16px;\n font-size: 14px;\n\n li {\n margin-bottom: 10px;\n position: relative;\n }\n\n &__chart {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n display: inline-block;\n border-radius: 4px;\n background: darken($ui-primary-color, 14%);\n\n &.leading {\n background: $ui-highlight-color;\n }\n }\n\n &__text {\n position: relative;\n display: flex;\n padding: 6px 0;\n line-height: 18px;\n cursor: default;\n overflow: hidden;\n\n input[type=radio],\n input[type=checkbox] {\n display: none;\n }\n\n .autossugest-input {\n flex: 1 1 auto;\n }\n\n input[type=text] {\n display: block;\n box-sizing: border-box;\n width: 100%;\n font-size: 14px;\n color: $inverted-text-color;\n outline: 0;\n font-family: inherit;\n background: $simple-background-color;\n border: 1px solid darken($simple-background-color, 14%);\n border-radius: 4px;\n padding: 6px 10px;\n\n &:focus {\n border-color: $highlight-text-color;\n }\n }\n\n &.selectable {\n cursor: pointer;\n }\n\n &.editable {\n display: flex;\n align-items: center;\n overflow: visible;\n }\n }\n\n &__input {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 50%;\n vertical-align: middle;\n margin-top: auto;\n margin-bottom: auto;\n flex: 0 0 18px;\n\n &.checkbox {\n border-radius: 4px;\n }\n\n &.active {\n border-color: $valid-value-color;\n background: $valid-value-color;\n }\n\n &:active,\n &:focus,\n &:hover {\n border-width: 4px;\n background: none;\n }\n\n &::-moz-focus-inner {\n outline: 0 !important;\n border: 0;\n }\n\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n\n &__number {\n display: inline-block;\n width: 52px;\n font-weight: 700;\n padding: 0 10px;\n padding-left: 8px;\n text-align: right;\n margin-top: auto;\n margin-bottom: auto;\n flex: 0 0 52px;\n }\n\n &__vote__mark {\n float: left;\n line-height: 18px;\n }\n\n &__footer {\n padding-top: 6px;\n padding-bottom: 5px;\n color: $dark-text-color;\n }\n\n &__link {\n display: inline;\n background: transparent;\n padding: 0;\n margin: 0;\n border: 0;\n color: $dark-text-color;\n text-decoration: underline;\n font-size: inherit;\n\n &:hover {\n text-decoration: none;\n }\n\n &:active,\n &:focus {\n background-color: rgba($dark-text-color, .1);\n }\n }\n\n .button {\n height: 36px;\n padding: 0 16px;\n margin-right: 10px;\n font-size: 14px;\n }\n}\n\n.compose-form__poll-wrapper {\n border-top: 1px solid darken($simple-background-color, 8%);\n\n ul {\n padding: 10px;\n }\n\n .poll__footer {\n border-top: 1px solid darken($simple-background-color, 8%);\n padding: 10px;\n display: flex;\n align-items: center;\n\n button,\n select {\n flex: 1 1 50%;\n\n &:focus {\n border-color: $highlight-text-color;\n }\n }\n }\n\n .button.button-secondary {\n font-size: 14px;\n font-weight: 400;\n padding: 6px 10px;\n height: auto;\n line-height: inherit;\n color: $action-button-color;\n border-color: $action-button-color;\n margin-right: 5px;\n }\n\n li {\n display: flex;\n align-items: center;\n\n .poll__text {\n flex: 0 0 auto;\n width: calc(100% - (23px + 6px));\n margin-right: 6px;\n }\n }\n\n select {\n appearance: none;\n box-sizing: border-box;\n font-size: 14px;\n color: $inverted-text-color;\n display: inline-block;\n width: auto;\n outline: 0;\n font-family: inherit;\n background: $simple-background-color url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center / auto 16px;\n border: 1px solid darken($simple-background-color, 14%);\n border-radius: 4px;\n padding: 6px 10px;\n padding-right: 30px;\n }\n\n .icon-button.disabled {\n color: darken($simple-background-color, 14%);\n }\n}\n\n.muted .poll {\n color: $dark-text-color;\n\n &__chart {\n background: rgba(darken($ui-primary-color, 14%), 0.2);\n\n &.leading {\n background: rgba($ui-highlight-color, 0.2);\n }\n }\n}\n",".modal-layout {\n background: $ui-base-color url('data:image/svg+xml;utf8,') repeat-x bottom fixed;\n display: flex;\n flex-direction: column;\n height: 100vh;\n padding: 0;\n}\n\n.modal-layout__mastodon {\n display: flex;\n flex: 1;\n flex-direction: column;\n justify-content: flex-end;\n\n > * {\n flex: 1;\n max-height: 235px;\n }\n}\n\n@media screen and (max-width: 600px) {\n .account-header {\n margin-top: 0;\n }\n}\n",".emoji-mart {\n font-size: 13px;\n display: inline-block;\n color: $inverted-text-color;\n\n &,\n * {\n box-sizing: border-box;\n line-height: 1.15;\n }\n\n .emoji-mart-emoji {\n padding: 6px;\n }\n}\n\n.emoji-mart-bar {\n border: 0 solid darken($ui-secondary-color, 8%);\n\n &:first-child {\n border-bottom-width: 1px;\n border-top-left-radius: 5px;\n border-top-right-radius: 5px;\n background: $ui-secondary-color;\n }\n\n &:last-child {\n border-top-width: 1px;\n border-bottom-left-radius: 5px;\n border-bottom-right-radius: 5px;\n display: none;\n }\n}\n\n.emoji-mart-anchors {\n display: flex;\n justify-content: space-between;\n padding: 0 6px;\n color: $lighter-text-color;\n line-height: 0;\n}\n\n.emoji-mart-anchor {\n position: relative;\n flex: 1;\n text-align: center;\n padding: 12px 4px;\n overflow: hidden;\n transition: color .1s ease-out;\n cursor: pointer;\n\n &:hover {\n color: darken($lighter-text-color, 4%);\n }\n}\n\n.emoji-mart-anchor-selected {\n color: $highlight-text-color;\n\n &:hover {\n color: darken($highlight-text-color, 4%);\n }\n\n .emoji-mart-anchor-bar {\n bottom: -1px;\n }\n}\n\n.emoji-mart-anchor-bar {\n position: absolute;\n bottom: -5px;\n left: 0;\n width: 100%;\n height: 4px;\n background-color: $highlight-text-color;\n}\n\n.emoji-mart-anchors {\n i {\n display: inline-block;\n width: 100%;\n max-width: 22px;\n }\n\n svg {\n fill: currentColor;\n max-height: 18px;\n }\n}\n\n.emoji-mart-scroll {\n overflow-y: scroll;\n height: 270px;\n max-height: 35vh;\n padding: 0 6px 6px;\n background: $simple-background-color;\n will-change: transform;\n\n &::-webkit-scrollbar-track:hover,\n &::-webkit-scrollbar-track:active {\n background-color: rgba($base-overlay-background, 0.3);\n }\n}\n\n.emoji-mart-search {\n padding: 10px;\n padding-right: 45px;\n background: $simple-background-color;\n\n input {\n font-size: 14px;\n font-weight: 400;\n padding: 7px 9px;\n font-family: inherit;\n display: block;\n width: 100%;\n background: rgba($ui-secondary-color, 0.3);\n color: $inverted-text-color;\n border: 1px solid $ui-secondary-color;\n border-radius: 4px;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n}\n\n.emoji-mart-category .emoji-mart-emoji {\n cursor: pointer;\n\n span {\n z-index: 1;\n position: relative;\n text-align: center;\n }\n\n &:hover::before {\n z-index: 0;\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba($ui-secondary-color, 0.7);\n border-radius: 100%;\n }\n}\n\n.emoji-mart-category-label {\n z-index: 2;\n position: relative;\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n\n span {\n display: block;\n width: 100%;\n font-weight: 500;\n padding: 5px 6px;\n background: $simple-background-color;\n }\n}\n\n.emoji-mart-emoji {\n position: relative;\n display: inline-block;\n font-size: 0;\n\n span {\n width: 22px;\n height: 22px;\n }\n}\n\n.emoji-mart-no-results {\n font-size: 14px;\n text-align: center;\n padding-top: 70px;\n color: $light-text-color;\n\n .emoji-mart-category-label {\n display: none;\n }\n\n .emoji-mart-no-results-label {\n margin-top: .2em;\n }\n\n .emoji-mart-emoji:hover::before {\n content: none;\n }\n}\n\n.emoji-mart-preview {\n display: none;\n}\n","$maximum-width: 1235px;\n$fluid-breakpoint: $maximum-width + 20px;\n$column-breakpoint: 700px;\n$small-breakpoint: 960px;\n\n.container {\n box-sizing: border-box;\n max-width: $maximum-width;\n margin: 0 auto;\n position: relative;\n\n @media screen and (max-width: $fluid-breakpoint) {\n width: 100%;\n padding: 0 10px;\n }\n}\n\n.rich-formatting {\n font-family: $font-sans-serif, sans-serif;\n font-size: 14px;\n font-weight: 400;\n line-height: 1.7;\n word-wrap: break-word;\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n p,\n li {\n color: $darker-text-color;\n }\n\n p {\n margin-top: 0;\n margin-bottom: .85em;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n strong {\n font-weight: 700;\n color: $secondary-text-color;\n }\n\n em {\n font-style: italic;\n color: $secondary-text-color;\n }\n\n code {\n font-size: 0.85em;\n background: darken($ui-base-color, 8%);\n border-radius: 4px;\n padding: 0.2em 0.3em;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n font-family: $font-display, sans-serif;\n margin-top: 1.275em;\n margin-bottom: .85em;\n font-weight: 500;\n color: $secondary-text-color;\n }\n\n h1 {\n font-size: 2em;\n }\n\n h2 {\n font-size: 1.75em;\n }\n\n h3 {\n font-size: 1.5em;\n }\n\n h4 {\n font-size: 1.25em;\n }\n\n h5,\n h6 {\n font-size: 1em;\n }\n\n ul {\n list-style: disc;\n }\n\n ol {\n list-style: decimal;\n }\n\n ul,\n ol {\n margin: 0;\n padding: 0;\n padding-left: 2em;\n margin-bottom: 0.85em;\n\n &[type='a'] {\n list-style-type: lower-alpha;\n }\n\n &[type='i'] {\n list-style-type: lower-roman;\n }\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n margin: 1.7em 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n\n table {\n width: 100%;\n border-collapse: collapse;\n break-inside: auto;\n margin-top: 24px;\n margin-bottom: 32px;\n\n thead tr,\n tbody tr {\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n font-size: 1em;\n line-height: 1.625;\n font-weight: 400;\n text-align: left;\n color: $darker-text-color;\n }\n\n thead tr {\n border-bottom-width: 2px;\n line-height: 1.5;\n font-weight: 500;\n color: $dark-text-color;\n }\n\n th,\n td {\n padding: 8px;\n align-self: start;\n align-items: start;\n word-break: break-all;\n\n &.nowrap {\n width: 25%;\n position: relative;\n\n &::before {\n content: ' ';\n visibility: hidden;\n }\n\n span {\n position: absolute;\n left: 8px;\n right: 8px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n }\n\n & > :first-child {\n margin-top: 0;\n }\n}\n\n.information-board {\n background: darken($ui-base-color, 4%);\n padding: 20px 0;\n\n .container-alt {\n position: relative;\n padding-right: 280px + 15px;\n }\n\n &__sections {\n display: flex;\n justify-content: space-between;\n flex-wrap: wrap;\n }\n\n &__section {\n flex: 1 0 0;\n font-family: $font-sans-serif, sans-serif;\n font-size: 16px;\n line-height: 28px;\n color: $primary-text-color;\n text-align: right;\n padding: 10px 15px;\n\n span,\n strong {\n display: block;\n }\n\n span {\n &:last-child {\n color: $secondary-text-color;\n }\n }\n\n strong {\n font-family: $font-display, sans-serif;\n font-weight: 500;\n font-size: 32px;\n line-height: 48px;\n }\n\n @media screen and (max-width: $column-breakpoint) {\n text-align: center;\n }\n }\n\n .panel {\n position: absolute;\n width: 280px;\n box-sizing: border-box;\n background: darken($ui-base-color, 8%);\n padding: 20px;\n padding-top: 10px;\n border-radius: 4px 4px 0 0;\n right: 0;\n bottom: -40px;\n\n .panel-header {\n font-family: $font-display, sans-serif;\n font-size: 14px;\n line-height: 24px;\n font-weight: 500;\n color: $darker-text-color;\n padding-bottom: 5px;\n margin-bottom: 15px;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n\n a,\n span {\n font-weight: 400;\n color: darken($darker-text-color, 10%);\n }\n\n a {\n text-decoration: none;\n }\n }\n }\n\n .owner {\n text-align: center;\n\n .avatar {\n width: 80px;\n height: 80px;\n margin: 0 auto;\n margin-bottom: 15px;\n\n img {\n display: block;\n width: 80px;\n height: 80px;\n border-radius: 48px;\n }\n }\n\n .name {\n font-size: 14px;\n\n a {\n display: block;\n color: $primary-text-color;\n text-decoration: none;\n\n &:hover {\n .display_name {\n text-decoration: underline;\n }\n }\n }\n\n .username {\n display: block;\n color: $darker-text-color;\n }\n }\n }\n}\n\n.landing-page {\n p,\n li {\n font-family: $font-sans-serif, sans-serif;\n font-size: 16px;\n font-weight: 400;\n font-size: 16px;\n line-height: 30px;\n margin-bottom: 12px;\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n }\n }\n\n em {\n display: inline;\n margin: 0;\n padding: 0;\n font-weight: 700;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n color: lighten($darker-text-color, 10%);\n }\n\n h1 {\n font-family: $font-display, sans-serif;\n font-size: 26px;\n line-height: 30px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n\n small {\n font-family: $font-sans-serif, sans-serif;\n display: block;\n font-size: 18px;\n font-weight: 400;\n color: lighten($darker-text-color, 10%);\n }\n }\n\n h2 {\n font-family: $font-display, sans-serif;\n font-size: 22px;\n line-height: 26px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h3 {\n font-family: $font-display, sans-serif;\n font-size: 18px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h4 {\n font-family: $font-display, sans-serif;\n font-size: 16px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h5 {\n font-family: $font-display, sans-serif;\n font-size: 14px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h6 {\n font-family: $font-display, sans-serif;\n font-size: 12px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n ul,\n ol {\n margin-left: 20px;\n\n &[type='a'] {\n list-style-type: lower-alpha;\n }\n\n &[type='i'] {\n list-style-type: lower-roman;\n }\n }\n\n ul {\n list-style: disc;\n }\n\n ol {\n list-style: decimal;\n }\n\n li > ol,\n li > ul {\n margin-top: 6px;\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid rgba($ui-base-lighter-color, .6);\n margin: 20px 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n\n &__information,\n &__forms {\n padding: 20px;\n }\n\n &__call-to-action {\n background: $ui-base-color;\n border-radius: 4px;\n padding: 25px 40px;\n overflow: hidden;\n box-sizing: border-box;\n\n .row {\n width: 100%;\n display: flex;\n flex-direction: row-reverse;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n }\n\n .row__information-board {\n display: flex;\n justify-content: flex-end;\n align-items: flex-end;\n\n .information-board__section {\n flex: 1 0 auto;\n padding: 0 10px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n width: 100%;\n justify-content: space-between;\n }\n }\n\n .row__mascot {\n flex: 1;\n margin: 10px -50px 0 0;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n }\n\n &__logo {\n margin-right: 20px;\n\n img {\n height: 50px;\n width: auto;\n mix-blend-mode: lighten;\n }\n }\n\n &__information {\n padding: 45px 40px;\n margin-bottom: 10px;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n strong {\n font-weight: 500;\n color: lighten($darker-text-color, 10%);\n }\n\n .account {\n border-bottom: 0;\n padding: 0;\n\n &__display-name {\n align-items: center;\n display: flex;\n margin-right: 5px;\n }\n\n div.account__display-name {\n &:hover {\n .display-name strong {\n text-decoration: none;\n }\n }\n\n .account__avatar {\n cursor: default;\n }\n }\n\n &__avatar-wrapper {\n margin-left: 0;\n flex: 0 0 auto;\n }\n\n &__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n\n .display-name {\n font-size: 15px;\n\n &__account {\n font-size: 14px;\n }\n }\n }\n\n @media screen and (max-width: $small-breakpoint) {\n .contact {\n margin-top: 30px;\n }\n }\n\n @media screen and (max-width: $column-breakpoint) {\n padding: 25px 20px;\n }\n }\n\n &__information,\n &__forms,\n #mastodon-timeline {\n box-sizing: border-box;\n background: $ui-base-color;\n border-radius: 4px;\n box-shadow: 0 0 6px rgba($black, 0.1);\n }\n\n &__mascot {\n height: 104px;\n position: relative;\n left: -40px;\n bottom: 25px;\n\n img {\n height: 190px;\n width: auto;\n }\n }\n\n &__short-description {\n .row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n margin-bottom: 40px;\n }\n\n @media screen and (max-width: $column-breakpoint) {\n .row {\n margin-bottom: 20px;\n }\n }\n\n p a {\n color: $secondary-text-color;\n }\n\n h1 {\n font-weight: 500;\n color: $primary-text-color;\n margin-bottom: 0;\n\n small {\n color: $darker-text-color;\n\n span {\n color: $secondary-text-color;\n }\n }\n }\n\n p:last-child {\n margin-bottom: 0;\n }\n }\n\n &__hero {\n margin-bottom: 10px;\n\n img {\n display: block;\n margin: 0;\n max-width: 100%;\n height: auto;\n border-radius: 4px;\n }\n }\n\n @media screen and (max-width: 840px) {\n .information-board {\n .container-alt {\n padding-right: 20px;\n }\n\n .panel {\n position: static;\n margin-top: 20px;\n width: 100%;\n border-radius: 4px;\n\n .panel-header {\n text-align: center;\n }\n }\n }\n }\n\n @media screen and (max-width: 675px) {\n .header-wrapper {\n padding-top: 0;\n\n &.compact {\n padding-bottom: 0;\n }\n\n &.compact .hero .heading {\n text-align: initial;\n }\n }\n\n .header .container-alt,\n .features .container-alt {\n display: block;\n }\n }\n\n .cta {\n margin: 20px;\n }\n}\n\n.landing {\n margin-bottom: 100px;\n\n @media screen and (max-width: 738px) {\n margin-bottom: 0;\n }\n\n &__brand {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 50px;\n\n svg {\n fill: $primary-text-color;\n height: 52px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding: 0;\n margin-bottom: 30px;\n }\n }\n\n .directory {\n margin-top: 30px;\n background: transparent;\n box-shadow: none;\n border-radius: 0;\n }\n\n .hero-widget {\n margin-top: 30px;\n margin-bottom: 0;\n\n h4 {\n padding: 10px;\n font-weight: 700;\n font-size: 14px;\n color: $darker-text-color;\n }\n\n &__text {\n border-radius: 0;\n padding-bottom: 0;\n }\n\n &__footer {\n background: $ui-base-color;\n padding: 10px;\n border-radius: 0 0 4px 4px;\n display: flex;\n\n &__column {\n flex: 1 1 50%;\n }\n }\n\n .account {\n padding: 10px 0;\n border-bottom: 0;\n\n .account__display-name {\n display: flex;\n align-items: center;\n }\n\n .account__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n }\n\n &__counter {\n padding: 10px;\n\n strong {\n font-family: $font-display, sans-serif;\n font-size: 15px;\n font-weight: 700;\n display: block;\n }\n\n span {\n font-size: 14px;\n color: $darker-text-color;\n }\n }\n }\n\n .simple_form .user_agreement .label_input > label {\n font-weight: 400;\n color: $darker-text-color;\n }\n\n .simple_form p.lead {\n color: $darker-text-color;\n font-size: 15px;\n line-height: 20px;\n font-weight: 400;\n margin-bottom: 25px;\n }\n\n &__grid {\n max-width: 960px;\n margin: 0 auto;\n display: grid;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n grid-gap: 30px;\n\n @media screen and (max-width: 738px) {\n grid-template-columns: minmax(0, 100%);\n grid-gap: 10px;\n\n &__column-login {\n grid-row: 1;\n display: flex;\n flex-direction: column;\n\n .box-widget {\n order: 2;\n flex: 0 0 auto;\n }\n\n .hero-widget {\n margin-top: 0;\n margin-bottom: 10px;\n order: 1;\n flex: 0 0 auto;\n }\n }\n\n &__column-registration {\n grid-row: 2;\n }\n\n .directory {\n margin-top: 10px;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n\n .hero-widget {\n display: block;\n margin-bottom: 0;\n box-shadow: none;\n\n &__img,\n &__img img,\n &__footer {\n border-radius: 0;\n }\n }\n\n .hero-widget,\n .box-widget,\n .directory__tag {\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n .directory {\n margin-top: 0;\n\n &__tag {\n margin-bottom: 0;\n\n & > a,\n & > div {\n border-radius: 0;\n box-shadow: none;\n }\n\n &:last-child {\n border-bottom: 0;\n }\n }\n }\n }\n }\n}\n\n.brand {\n position: relative;\n text-decoration: none;\n}\n\n.brand__tagline {\n display: block;\n position: absolute;\n bottom: -10px;\n left: 50px;\n width: 300px;\n color: $ui-primary-color;\n text-decoration: none;\n font-size: 14px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n position: static;\n width: auto;\n margin-top: 20px;\n color: $dark-text-color;\n }\n}\n\n",".table {\n width: 100%;\n max-width: 100%;\n border-spacing: 0;\n border-collapse: collapse;\n\n th,\n td {\n padding: 8px;\n line-height: 18px;\n vertical-align: top;\n border-top: 1px solid $ui-base-color;\n text-align: left;\n background: darken($ui-base-color, 4%);\n }\n\n & > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid $ui-base-color;\n border-top: 0;\n font-weight: 500;\n }\n\n & > tbody > tr > th {\n font-weight: 500;\n }\n\n & > tbody > tr:nth-child(odd) > td,\n & > tbody > tr:nth-child(odd) > th {\n background: $ui-base-color;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n &.inline-table {\n & > tbody > tr:nth-child(odd) {\n & > td,\n & > th {\n background: transparent;\n }\n }\n\n & > tbody > tr:first-child {\n & > td,\n & > th {\n border-top: 0;\n }\n }\n }\n\n &.batch-table {\n & > thead > tr > th {\n background: $ui-base-color;\n border-top: 1px solid darken($ui-base-color, 8%);\n border-bottom: 1px solid darken($ui-base-color, 8%);\n\n &:first-child {\n border-radius: 4px 0 0;\n border-left: 1px solid darken($ui-base-color, 8%);\n }\n\n &:last-child {\n border-radius: 0 4px 0 0;\n border-right: 1px solid darken($ui-base-color, 8%);\n }\n }\n }\n\n &--invites tbody td {\n vertical-align: middle;\n }\n}\n\n.table-wrapper {\n overflow: auto;\n margin-bottom: 20px;\n}\n\nsamp {\n font-family: $font-monospace, monospace;\n}\n\nbutton.table-action-link {\n background: transparent;\n border: 0;\n font: inherit;\n}\n\nbutton.table-action-link,\na.table-action-link {\n text-decoration: none;\n display: inline-block;\n margin-right: 5px;\n padding: 0 10px;\n color: $darker-text-color;\n font-weight: 500;\n\n &:hover {\n color: $primary-text-color;\n }\n\n i.fa {\n font-weight: 400;\n margin-right: 5px;\n }\n\n &:first-child {\n padding-left: 0;\n }\n}\n\n.batch-table {\n &__toolbar,\n &__row {\n display: flex;\n\n &__select {\n box-sizing: border-box;\n padding: 8px 16px;\n cursor: pointer;\n min-height: 100%;\n\n input {\n margin-top: 8px;\n }\n\n &--aligned {\n display: flex;\n align-items: center;\n\n input {\n margin-top: 0;\n }\n }\n }\n\n &__actions,\n &__content {\n padding: 8px 0;\n padding-right: 16px;\n flex: 1 1 auto;\n }\n }\n\n &__toolbar {\n border: 1px solid darken($ui-base-color, 8%);\n background: $ui-base-color;\n border-radius: 4px 0 0;\n height: 47px;\n align-items: center;\n\n &__actions {\n text-align: right;\n padding-right: 16px - 5px;\n }\n }\n\n &__form {\n padding: 16px;\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n background: $ui-base-color;\n\n .fields-row {\n padding-top: 0;\n margin-bottom: 0;\n }\n }\n\n &__row {\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n background: darken($ui-base-color, 4%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n .optional &:first-child {\n border-top: 1px solid darken($ui-base-color, 8%);\n }\n }\n\n &:hover {\n background: darken($ui-base-color, 2%);\n }\n\n &:nth-child(even) {\n background: $ui-base-color;\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n }\n\n &__content {\n padding-top: 12px;\n padding-bottom: 16px;\n\n &--unpadded {\n padding: 0;\n }\n\n &--with-image {\n display: flex;\n align-items: center;\n }\n\n &__image {\n flex: 0 0 auto;\n display: flex;\n justify-content: center;\n align-items: center;\n margin-right: 10px;\n\n .emojione {\n width: 32px;\n height: 32px;\n }\n }\n\n &__text {\n flex: 1 1 auto;\n }\n\n &__extra {\n flex: 0 0 auto;\n text-align: right;\n color: $darker-text-color;\n font-weight: 500;\n }\n }\n\n .directory__tag {\n margin: 0;\n width: 100%;\n\n a {\n background: transparent;\n border-radius: 0;\n }\n }\n }\n\n &.optional .batch-table__toolbar,\n &.optional .batch-table__row__select {\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n\n .status__content {\n padding-top: 0;\n\n summary {\n display: list-item;\n }\n\n strong {\n font-weight: 700;\n }\n }\n\n .nothing-here {\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n box-shadow: none;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 1px solid darken($ui-base-color, 8%);\n }\n }\n\n @media screen and (max-width: 870px) {\n .accounts-table tbody td.optional {\n display: none;\n }\n }\n}\n","$no-columns-breakpoint: 600px;\n$sidebar-width: 240px;\n$content-width: 840px;\n\n.admin-wrapper {\n display: flex;\n justify-content: center;\n width: 100%;\n min-height: 100vh;\n\n .sidebar-wrapper {\n min-height: 100vh;\n overflow: hidden;\n pointer-events: none;\n flex: 1 1 auto;\n\n &__inner {\n display: flex;\n justify-content: flex-end;\n background: $ui-base-color;\n height: 100%;\n }\n }\n\n .sidebar {\n width: $sidebar-width;\n padding: 0;\n pointer-events: auto;\n\n &__toggle {\n display: none;\n background: lighten($ui-base-color, 8%);\n height: 48px;\n\n &__logo {\n flex: 1 1 auto;\n\n a {\n display: inline-block;\n padding: 15px;\n }\n\n svg {\n fill: $primary-text-color;\n height: 20px;\n position: relative;\n bottom: -2px;\n }\n }\n\n &__icon {\n display: block;\n color: $darker-text-color;\n text-decoration: none;\n flex: 0 0 auto;\n font-size: 20px;\n padding: 15px;\n }\n\n a {\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 12%);\n }\n }\n }\n\n .logo {\n display: block;\n margin: 40px auto;\n width: 100px;\n height: 100px;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n & > a:first-child {\n display: none;\n }\n }\n\n ul {\n list-style: none;\n border-radius: 4px 0 0 4px;\n overflow: hidden;\n margin-bottom: 20px;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n margin-bottom: 0;\n }\n\n a {\n display: block;\n padding: 15px;\n color: $darker-text-color;\n text-decoration: none;\n transition: all 200ms linear;\n transition-property: color, background-color;\n border-radius: 4px 0 0 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n i.fa {\n margin-right: 5px;\n }\n\n &:hover {\n color: $primary-text-color;\n background-color: darken($ui-base-color, 5%);\n transition: all 100ms linear;\n transition-property: color, background-color;\n }\n\n &.selected {\n background: darken($ui-base-color, 2%);\n border-radius: 4px 0 0;\n }\n }\n\n ul {\n background: darken($ui-base-color, 4%);\n border-radius: 0 0 0 4px;\n margin: 0;\n\n a {\n border: 0;\n padding: 15px 35px;\n }\n }\n\n .simple-navigation-active-leaf a {\n color: $primary-text-color;\n background-color: $ui-highlight-color;\n border-bottom: 0;\n border-radius: 0;\n\n &:hover {\n background-color: lighten($ui-highlight-color, 5%);\n }\n }\n }\n\n & > ul > .simple-navigation-active-leaf a {\n border-radius: 4px 0 0 4px;\n }\n }\n\n .content-wrapper {\n box-sizing: border-box;\n width: 100%;\n max-width: $content-width;\n flex: 1 1 auto;\n }\n\n @media screen and (max-width: $content-width + $sidebar-width) {\n .sidebar-wrapper--empty {\n display: none;\n }\n\n .sidebar-wrapper {\n width: $sidebar-width;\n flex: 0 0 auto;\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n .sidebar-wrapper {\n width: 100%;\n }\n }\n\n .content {\n padding: 20px 15px;\n padding-top: 60px;\n padding-left: 25px;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n max-width: none;\n padding: 15px;\n padding-top: 30px;\n }\n\n &-heading {\n display: flex;\n\n padding-bottom: 40px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n margin: -15px -15px 40px 0;\n\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n\n & > * {\n margin-top: 15px;\n margin-right: 15px;\n }\n\n &-actions {\n display: inline-flex;\n\n & > :not(:first-child) {\n margin-left: 5px;\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n border-bottom: 0;\n padding-bottom: 0;\n }\n }\n\n h2 {\n color: $secondary-text-color;\n font-size: 24px;\n line-height: 28px;\n font-weight: 400;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n font-weight: 700;\n }\n }\n\n h3 {\n color: $secondary-text-color;\n font-size: 20px;\n line-height: 28px;\n font-weight: 400;\n margin-bottom: 30px;\n }\n\n h4 {\n font-size: 14px;\n font-weight: 700;\n color: $darker-text-color;\n padding-bottom: 8px;\n margin-bottom: 8px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n h6 {\n font-size: 16px;\n color: $secondary-text-color;\n line-height: 28px;\n font-weight: 500;\n }\n\n .fields-group h6 {\n color: $primary-text-color;\n font-weight: 500;\n }\n\n .directory__tag > a,\n .directory__tag > div {\n box-shadow: none;\n }\n\n .directory__tag .table-action-link .fa {\n color: inherit;\n }\n\n .directory__tag h4 {\n font-size: 18px;\n font-weight: 700;\n color: $primary-text-color;\n text-transform: none;\n padding-bottom: 0;\n margin-bottom: 0;\n border-bottom: 0;\n }\n\n & > p {\n font-size: 14px;\n line-height: 21px;\n color: $secondary-text-color;\n margin-bottom: 20px;\n\n strong {\n color: $primary-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid rgba($ui-base-lighter-color, .6);\n margin: 20px 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n\n .sidebar-wrapper {\n min-height: 0;\n }\n\n .sidebar {\n width: 100%;\n padding: 0;\n height: auto;\n\n &__toggle {\n display: flex;\n }\n\n & > ul {\n display: none;\n }\n\n ul a,\n ul ul a {\n border-radius: 0;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n transition: none;\n\n &:hover {\n transition: none;\n }\n }\n\n ul ul {\n border-radius: 0;\n }\n\n ul .simple-navigation-active-leaf a {\n border-bottom-color: $ui-highlight-color;\n }\n }\n }\n}\n\nhr.spacer {\n width: 100%;\n border: 0;\n margin: 20px 0;\n height: 1px;\n}\n\nbody,\n.admin-wrapper .content {\n .muted-hint {\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n }\n }\n\n .positive-hint {\n color: $valid-value-color;\n font-weight: 500;\n }\n\n .negative-hint {\n color: $error-value-color;\n font-weight: 500;\n }\n\n .neutral-hint {\n color: $dark-text-color;\n font-weight: 500;\n }\n\n .warning-hint {\n color: $gold-star;\n font-weight: 500;\n }\n}\n\n.filters {\n display: flex;\n flex-wrap: wrap;\n\n .filter-subset {\n flex: 0 0 auto;\n margin: 0 40px 20px 0;\n\n &:last-child {\n margin-bottom: 30px;\n }\n\n ul {\n margin-top: 5px;\n list-style: none;\n\n li {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n strong {\n font-weight: 500;\n font-size: 13px;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n font-size: 13px;\n font-weight: 500;\n border-bottom: 2px solid $ui-base-color;\n\n &:hover {\n color: $primary-text-color;\n border-bottom: 2px solid lighten($ui-base-color, 5%);\n }\n\n &.selected {\n color: $highlight-text-color;\n border-bottom: 2px solid $ui-highlight-color;\n }\n }\n }\n}\n\n.flavour-screen {\n display: block;\n margin: 10px auto;\n max-width: 100%;\n}\n\n.flavour-description {\n display: block;\n font-size: 16px;\n margin: 10px 0;\n\n & > p {\n margin: 10px 0;\n }\n}\n\n.flavour-screen {\n display: block;\n margin: 10px auto;\n max-width: 100%;\n}\n\n.flavour-description {\n display: block;\n font-size: 16px;\n margin: 10px 0;\n\n & > p {\n margin: 10px 0;\n }\n}\n\n.report-accounts {\n display: flex;\n flex-wrap: wrap;\n margin-bottom: 20px;\n}\n\n.report-accounts__item {\n display: flex;\n flex: 250px;\n flex-direction: column;\n margin: 0 5px;\n\n & > strong {\n display: block;\n margin: 0 0 10px -5px;\n font-weight: 500;\n font-size: 14px;\n line-height: 18px;\n color: $secondary-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n .account-card {\n flex: 1 1 auto;\n }\n}\n\n.report-status,\n.account-status {\n display: flex;\n margin-bottom: 10px;\n\n .activity-stream {\n flex: 2 0 0;\n margin-right: 20px;\n max-width: calc(100% - 60px);\n\n .entry {\n border-radius: 4px;\n }\n }\n}\n\n.report-status__actions,\n.account-status__actions {\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n\n .icon-button {\n font-size: 24px;\n width: 24px;\n text-align: center;\n margin-bottom: 10px;\n }\n}\n\n.simple_form.new_report_note,\n.simple_form.new_account_moderation_note {\n max-width: 100%;\n}\n\n.batch-form-box {\n display: flex;\n flex-wrap: wrap;\n margin-bottom: 5px;\n\n #form_status_batch_action {\n margin: 0 5px 5px 0;\n font-size: 14px;\n }\n\n input.button {\n margin: 0 5px 5px 0;\n }\n\n .media-spoiler-toggle-buttons {\n margin-left: auto;\n\n .button {\n overflow: visible;\n margin: 0 0 5px 5px;\n float: right;\n }\n }\n}\n\n.back-link {\n margin-bottom: 10px;\n font-size: 14px;\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.spacer {\n flex: 1 1 auto;\n}\n\n.log-entry {\n margin-bottom: 20px;\n line-height: 20px;\n\n &__header {\n display: flex;\n justify-content: flex-start;\n align-items: center;\n padding: 10px;\n background: $ui-base-color;\n color: $darker-text-color;\n border-radius: 4px 4px 0 0;\n font-size: 14px;\n position: relative;\n }\n\n &__avatar {\n margin-right: 10px;\n\n .avatar {\n display: block;\n margin: 0;\n border-radius: 50%;\n width: 40px;\n height: 40px;\n }\n }\n\n &__content {\n max-width: calc(100% - 90px);\n }\n\n &__title {\n word-wrap: break-word;\n }\n\n &__timestamp {\n color: $dark-text-color;\n }\n\n &__extras {\n background: lighten($ui-base-color, 6%);\n border-radius: 0 0 4px 4px;\n padding: 10px;\n color: $darker-text-color;\n font-family: $font-monospace, monospace;\n font-size: 12px;\n word-wrap: break-word;\n min-height: 20px;\n }\n\n &__icon {\n font-size: 28px;\n margin-right: 10px;\n color: $dark-text-color;\n }\n\n &__icon__overlay {\n position: absolute;\n top: 10px;\n right: 10px;\n width: 10px;\n height: 10px;\n border-radius: 50%;\n\n &.positive {\n background: $success-green;\n }\n\n &.negative {\n background: lighten($error-red, 12%);\n }\n\n &.neutral {\n background: $ui-highlight-color;\n }\n }\n\n a,\n .username,\n .target {\n color: $secondary-text-color;\n text-decoration: none;\n font-weight: 500;\n }\n\n .diff-old {\n color: lighten($error-red, 12%);\n }\n\n .diff-neutral {\n color: $secondary-text-color;\n }\n\n .diff-new {\n color: $success-green;\n }\n}\n\na.name-tag,\n.name-tag,\na.inline-name-tag,\n.inline-name-tag {\n text-decoration: none;\n color: $secondary-text-color;\n\n .username {\n font-weight: 500;\n }\n\n &.suspended {\n .username {\n text-decoration: line-through;\n color: lighten($error-red, 12%);\n }\n\n .avatar {\n filter: grayscale(100%);\n opacity: 0.8;\n }\n }\n}\n\na.name-tag,\n.name-tag {\n display: flex;\n align-items: center;\n\n .avatar {\n display: block;\n margin: 0;\n margin-right: 5px;\n border-radius: 50%;\n }\n\n &.suspended {\n .avatar {\n filter: grayscale(100%);\n opacity: 0.8;\n }\n }\n}\n\n.speech-bubble {\n margin-bottom: 20px;\n border-left: 4px solid $ui-highlight-color;\n\n &.positive {\n border-left-color: $success-green;\n }\n\n &.negative {\n border-left-color: lighten($error-red, 12%);\n }\n\n &.warning {\n border-left-color: $gold-star;\n }\n\n &__bubble {\n padding: 16px;\n padding-left: 14px;\n font-size: 15px;\n line-height: 20px;\n border-radius: 4px 4px 4px 0;\n position: relative;\n font-weight: 500;\n\n a {\n color: $darker-text-color;\n }\n }\n\n &__owner {\n padding: 8px;\n padding-left: 12px;\n }\n\n time {\n color: $dark-text-color;\n }\n}\n\n.report-card {\n background: $ui-base-color;\n border-radius: 4px;\n margin-bottom: 20px;\n\n &__profile {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 15px;\n\n .account {\n padding: 0;\n border: 0;\n\n &__avatar-wrapper {\n margin-left: 0;\n }\n }\n\n &__stats {\n flex: 0 0 auto;\n font-weight: 500;\n color: $darker-text-color;\n text-align: right;\n\n a {\n color: inherit;\n text-decoration: none;\n\n &:focus,\n &:hover,\n &:active {\n color: lighten($darker-text-color, 8%);\n }\n }\n\n .red {\n color: $error-value-color;\n }\n }\n }\n\n &__summary {\n &__item {\n display: flex;\n justify-content: flex-start;\n border-top: 1px solid darken($ui-base-color, 4%);\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n\n &__reported-by,\n &__assigned {\n padding: 15px;\n flex: 0 0 auto;\n box-sizing: border-box;\n width: 150px;\n color: $darker-text-color;\n\n &,\n .username {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n &__content {\n flex: 1 1 auto;\n max-width: calc(100% - 300px);\n\n &__icon {\n color: $dark-text-color;\n margin-right: 4px;\n font-weight: 500;\n }\n }\n\n &__content a {\n display: block;\n box-sizing: border-box;\n width: 100%;\n padding: 15px;\n text-decoration: none;\n color: $darker-text-color;\n }\n }\n }\n}\n\n.one-line {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.ellipsized-ip {\n display: inline-block;\n max-width: 120px;\n overflow: hidden;\n text-overflow: ellipsis;\n vertical-align: middle;\n}\n\n.admin-account-bio {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n margin-top: 20px;\n\n > div {\n box-sizing: border-box;\n padding: 0 5px;\n margin-bottom: 10px;\n flex: 1 0 50%;\n }\n\n .account__header__fields,\n .account__header__content {\n background: lighten($ui-base-color, 8%);\n border-radius: 4px;\n height: 100%;\n }\n\n .account__header__fields {\n margin: 0;\n border: 0;\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n\n .account__header__content {\n box-sizing: border-box;\n padding: 20px;\n color: $primary-text-color;\n }\n}\n\n.center-text {\n text-align: center;\n}\n",".dashboard__counters {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n margin-bottom: 20px;\n\n & > div {\n box-sizing: border-box;\n flex: 0 0 33.333%;\n padding: 0 5px;\n margin-bottom: 10px;\n\n & > div,\n & > a {\n padding: 20px;\n background: lighten($ui-base-color, 4%);\n border-radius: 4px;\n box-sizing: border-box;\n height: 100%;\n }\n\n & > a {\n text-decoration: none;\n color: inherit;\n display: block;\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 8%);\n }\n }\n }\n\n &__num,\n &__text {\n text-align: center;\n font-weight: 500;\n font-size: 24px;\n line-height: 21px;\n color: $primary-text-color;\n font-family: $font-display, sans-serif;\n margin-bottom: 20px;\n line-height: 30px;\n }\n\n &__text {\n font-size: 18px;\n }\n\n &__label {\n font-size: 14px;\n color: $darker-text-color;\n text-align: center;\n font-weight: 500;\n }\n}\n\n.dashboard__widgets {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n\n & > div {\n flex: 0 0 33.333%;\n margin-bottom: 20px;\n\n & > div {\n padding: 0 5px;\n }\n }\n\n a:not(.name-tag) {\n color: $ui-secondary-color;\n font-weight: 500;\n text-decoration: none;\n }\n}\n","body.rtl {\n direction: rtl;\n\n .column-header > button {\n text-align: right;\n padding-left: 0;\n padding-right: 15px;\n }\n\n .radio-button__input {\n margin-right: 0;\n margin-left: 10px;\n }\n\n .directory__card__bar .display-name {\n margin-left: 0;\n margin-right: 15px;\n }\n\n .display-name {\n text-align: right;\n }\n\n .notification__message {\n margin-left: 0;\n margin-right: 68px;\n }\n\n .drawer__inner__mastodon > img {\n transform: scaleX(-1);\n }\n\n .notification__favourite-icon-wrapper {\n left: auto;\n right: -26px;\n }\n\n .landing-page__logo {\n margin-right: 0;\n margin-left: 20px;\n }\n\n .landing-page .features-list .features-list__row .visual {\n margin-left: 0;\n margin-right: 15px;\n }\n\n .column-link__icon,\n .column-header__icon {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .compose-form .compose-form__buttons-wrapper .character-counter__wrapper {\n margin-right: 0;\n margin-left: 4px;\n }\n\n .navigation-bar__profile {\n margin-left: 0;\n margin-right: 8px;\n }\n\n .search__input {\n padding-right: 10px;\n padding-left: 30px;\n }\n\n .search__icon .fa {\n right: auto;\n left: 10px;\n }\n\n .columns-area {\n direction: rtl;\n }\n\n .column-header__buttons {\n left: 0;\n right: auto;\n margin-left: 0;\n margin-right: -15px;\n }\n\n .column-inline-form .icon-button {\n margin-left: 0;\n margin-right: 5px;\n }\n\n .column-header__links .text-btn {\n margin-left: 10px;\n margin-right: 0;\n }\n\n .account__avatar-wrapper {\n float: right;\n }\n\n .column-header__back-button {\n padding-left: 5px;\n padding-right: 0;\n }\n\n .column-header__setting-arrows {\n float: left;\n }\n\n .setting-toggle__label {\n margin-left: 0;\n margin-right: 8px;\n }\n\n .status__avatar {\n left: auto;\n right: 10px;\n }\n\n .status,\n .activity-stream .status.light {\n padding-left: 10px;\n padding-right: 68px;\n }\n\n .status__info .status__display-name,\n .activity-stream .status.light .status__display-name {\n padding-left: 25px;\n padding-right: 0;\n }\n\n .activity-stream .pre-header {\n padding-right: 68px;\n padding-left: 0;\n }\n\n .status__prepend {\n margin-left: 0;\n margin-right: 68px;\n }\n\n .status__prepend-icon-wrapper {\n left: auto;\n right: -26px;\n }\n\n .activity-stream .pre-header .pre-header__icon {\n left: auto;\n right: 42px;\n }\n\n .account__avatar-overlay-overlay {\n right: auto;\n left: 0;\n }\n\n .column-back-button--slim-button {\n right: auto;\n left: 0;\n }\n\n .status__relative-time,\n .activity-stream .status.light .status__header .status__meta {\n float: left;\n }\n\n .status__action-bar {\n &__counter {\n margin-right: 0;\n margin-left: 11px;\n\n .status__action-bar-button {\n margin-right: 0;\n margin-left: 4px;\n }\n }\n }\n\n .status__action-bar-button {\n float: right;\n margin-right: 0;\n margin-left: 18px;\n }\n\n .status__action-bar-dropdown {\n float: right;\n }\n\n .privacy-dropdown__dropdown {\n margin-left: 0;\n margin-right: 40px;\n }\n\n .privacy-dropdown__option__icon {\n margin-left: 10px;\n margin-right: 0;\n }\n\n .detailed-status__display-name .display-name {\n text-align: right;\n }\n\n .detailed-status__display-avatar {\n margin-right: 0;\n margin-left: 10px;\n float: right;\n }\n\n .detailed-status__favorites,\n .detailed-status__reblogs {\n margin-left: 0;\n margin-right: 6px;\n }\n\n .fa-ul {\n margin-left: 2.14285714em;\n }\n\n .fa-li {\n left: auto;\n right: -2.14285714em;\n }\n\n .admin-wrapper {\n direction: rtl;\n }\n\n .admin-wrapper .sidebar ul a i.fa,\n a.table-action-link i.fa {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .simple_form .check_boxes .checkbox label {\n padding-left: 0;\n padding-right: 25px;\n }\n\n .simple_form .input.with_label.boolean label.checkbox {\n padding-left: 25px;\n padding-right: 0;\n }\n\n .simple_form .check_boxes .checkbox input[type=\"checkbox\"],\n .simple_form .input.boolean input[type=\"checkbox\"] {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.radio_buttons .radio {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.radio_buttons .radio > label {\n padding-right: 28px;\n padding-left: 0;\n }\n\n .simple_form .input-with-append .input input {\n padding-left: 142px;\n padding-right: 0;\n }\n\n .simple_form .input.boolean label.checkbox {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.boolean .label_input,\n .simple_form .input.boolean .hint {\n padding-left: 0;\n padding-right: 28px;\n }\n\n .simple_form .label_input__append {\n right: auto;\n left: 3px;\n\n &::after {\n right: auto;\n left: 0;\n background-image: linear-gradient(to left, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));\n }\n }\n\n .simple_form select {\n background: darken($ui-base-color, 10%) url(\"data:image/svg+xml;utf8,\") no-repeat left 8px center / auto 16px;\n }\n\n .table th,\n .table td {\n text-align: right;\n }\n\n .filters .filter-subset {\n margin-right: 0;\n margin-left: 45px;\n }\n\n .landing-page .header-wrapper .mascot {\n right: 60px;\n left: auto;\n }\n\n .landing-page__call-to-action .row__information-board {\n direction: rtl;\n }\n\n .landing-page .header .hero .floats .float-1 {\n left: -120px;\n right: auto;\n }\n\n .landing-page .header .hero .floats .float-2 {\n left: 210px;\n right: auto;\n }\n\n .landing-page .header .hero .floats .float-3 {\n left: 110px;\n right: auto;\n }\n\n .landing-page .header .links .brand img {\n left: 0;\n }\n\n .landing-page .fa-external-link {\n padding-right: 5px;\n padding-left: 0 !important;\n }\n\n .landing-page .features #mastodon-timeline {\n margin-right: 0;\n margin-left: 30px;\n }\n\n @media screen and (min-width: 631px) {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n\n &:first-child {\n padding-left: 5px;\n padding-right: 10px;\n }\n }\n\n .columns-area > div {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n }\n }\n }\n\n .columns-area--mobile .column,\n .columns-area--mobile .drawer {\n padding-left: 0;\n padding-right: 0;\n }\n\n .public-layout {\n .header {\n .nav-button {\n margin-left: 8px;\n margin-right: 0;\n }\n }\n\n .public-account-header__tabs {\n margin-left: 0;\n margin-right: 20px;\n }\n }\n\n .landing-page__information {\n .account__display-name {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .account__avatar-wrapper {\n margin-left: 12px;\n margin-right: 0;\n }\n }\n\n .card__bar .display-name {\n margin-left: 0;\n margin-right: 15px;\n text-align: right;\n }\n\n .fa-chevron-left::before {\n content: \"\\F054\";\n }\n\n .fa-chevron-right::before {\n content: \"\\F053\";\n }\n\n .column-back-button__icon {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .column-header__setting-arrows .column-header__setting-btn:last-child {\n padding-left: 0;\n padding-right: 10px;\n }\n\n .simple_form .input.radio_buttons .radio > label input {\n left: auto;\n right: 0;\n }\n}\n","$black-emojis: '8ball' 'ant' 'back' 'black_circle' 'black_heart' 'black_large_square' 'black_medium_small_square' 'black_medium_square' 'black_nib' 'black_small_square' 'bomb' 'bowling' 'bust_in_silhouette' 'busts_in_silhouette' 'camera' 'camera_with_flash' 'clubs' 'copyright' 'curly_loop' 'currency_exchange' 'dark_sunglasses' 'eight_pointed_black_star' 'electric_plug' 'end' 'female-guard' 'film_projector' 'fried_egg' 'gorilla' 'guardsman' 'heavy_check_mark' 'heavy_division_sign' 'heavy_dollar_sign' 'heavy_minus_sign' 'heavy_multiplication_x' 'heavy_plus_sign' 'hocho' 'hole' 'joystick' 'kaaba' 'lower_left_ballpoint_pen' 'lower_left_fountain_pen' 'male-guard' 'microphone' 'mortar_board' 'movie_camera' 'musical_score' 'on' 'registered' 'soon' 'spades' 'speaking_head_in_silhouette' 'spider' 'telephone_receiver' 'tm' 'top' 'tophat' 'turkey' 'vhs' 'video_camera' 'video_game' 'water_buffalo' 'waving_black_flag' 'wavy_dash';\n\n%white-emoji-outline {\n filter: drop-shadow(1px 1px 0 $white) drop-shadow(-1px 1px 0 $white) drop-shadow(1px -1px 0 $white) drop-shadow(-1px -1px 0 $white);\n transform: scale(.71);\n}\n\n.emojione {\n @each $emoji in $black-emojis {\n &[title=':#{$emoji}:'] {\n @extend %white-emoji-outline;\n }\n }\n}\n","// Notes!\n// Sass color functions, \"darken\" and \"lighten\" are automatically replaced.\n\nhtml {\n scrollbar-color: $ui-base-color rgba($ui-base-color, 0.25);\n}\n\n// Change the colors of button texts\n.button {\n color: $white;\n\n &.button-alternative-2 {\n color: $white;\n }\n}\n\n.status-card__actions button,\n.status-card__actions a {\n color: rgba($white, 0.8);\n\n &:hover,\n &:active,\n &:focus {\n color: $white;\n }\n}\n\n// Change default background colors of columns\n.column > .scrollable,\n.getting-started,\n.column-inline-form,\n.error-column,\n.regeneration-indicator {\n background: $white;\n border: 1px solid lighten($ui-base-color, 8%);\n border-top: 0;\n}\n\n.directory__card__img {\n background: lighten($ui-base-color, 12%);\n}\n\n.filter-form,\n.directory__card__bar {\n background: $white;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n}\n\n.scrollable .directory__list {\n width: calc(100% + 2px);\n margin-left: -1px;\n margin-right: -1px;\n}\n\n.directory__card,\n.table-of-contents {\n border: 1px solid lighten($ui-base-color, 8%);\n}\n\n.column-back-button,\n.column-header {\n background: $white;\n border: 1px solid lighten($ui-base-color, 8%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 0;\n }\n\n &--slim-button {\n top: -50px;\n right: 0;\n }\n}\n\n.column-header__back-button,\n.column-header__button,\n.column-header__button.active,\n.account__header__bar,\n.directory__card__extra {\n background: $white;\n}\n\n.column-header__button.active {\n color: $ui-highlight-color;\n\n &:hover,\n &:active,\n &:focus {\n color: $ui-highlight-color;\n background: $white;\n }\n}\n\n.account__header__bar .avatar .account__avatar {\n border-color: $white;\n}\n\n.getting-started__footer a {\n color: $ui-secondary-color;\n text-decoration: underline;\n}\n\n.confirmation-modal__secondary-button,\n.confirmation-modal__cancel-button,\n.mute-modal__cancel-button,\n.block-modal__cancel-button {\n color: lighten($ui-base-color, 26%);\n\n &:hover,\n &:focus,\n &:active {\n color: $primary-text-color;\n }\n}\n\n.column-subheading {\n background: darken($ui-base-color, 4%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n}\n\n.getting-started,\n.scrollable {\n .column-link {\n background: $white;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &:hover,\n &:active,\n &:focus {\n background: $ui-base-color;\n }\n }\n}\n\n.getting-started .navigation-bar {\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 0;\n }\n}\n\n.compose-form__autosuggest-wrapper,\n.poll__text input[type=\"text\"],\n.compose-form .spoiler-input__input,\n.compose-form__poll-wrapper select,\n.search__input,\n.setting-text,\n.box-widget input[type=\"text\"],\n.box-widget input[type=\"email\"],\n.box-widget input[type=\"password\"],\n.box-widget textarea,\n.statuses-grid .detailed-status,\n.audio-player {\n border: 1px solid lighten($ui-base-color, 8%);\n}\n\n.search__input {\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 0;\n border-bottom: 0;\n }\n}\n\n.list-editor .search .search__input {\n border-top: 0;\n border-bottom: 0;\n}\n\n.compose-form__poll-wrapper select {\n background: $simple-background-color url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center / auto 16px;\n}\n\n.compose-form__poll-wrapper,\n.compose-form__poll-wrapper .poll__footer {\n border-top-color: lighten($ui-base-color, 8%);\n}\n\n.notification__filter-bar {\n border: 1px solid lighten($ui-base-color, 8%);\n border-top: 0;\n}\n\n.compose-form .compose-form__buttons-wrapper {\n background: $ui-base-color;\n border: 1px solid lighten($ui-base-color, 8%);\n border-top: 0;\n}\n\n.drawer__header,\n.drawer__inner {\n background: $white;\n border: 1px solid lighten($ui-base-color, 8%);\n}\n\n.drawer__inner__mastodon {\n background: $white url('data:image/svg+xml;utf8,') no-repeat bottom / 100% auto;\n}\n\n// Change the colors used in compose-form\n.compose-form {\n .compose-form__modifiers {\n .compose-form__upload__actions .icon-button {\n color: lighten($white, 7%);\n\n &:active,\n &:focus,\n &:hover {\n color: $white;\n }\n }\n\n .compose-form__upload-description input {\n color: lighten($white, 7%);\n\n &::placeholder {\n color: lighten($white, 7%);\n }\n }\n }\n\n .compose-form__buttons-wrapper {\n background: darken($ui-base-color, 6%);\n }\n\n .autosuggest-textarea__suggestions {\n background: darken($ui-base-color, 6%);\n }\n\n .autosuggest-textarea__suggestions__item {\n &:hover,\n &:focus,\n &:active,\n &.selected {\n background: lighten($ui-base-color, 4%);\n }\n }\n}\n\n.emoji-mart-bar {\n border-color: lighten($ui-base-color, 4%);\n\n &:first-child {\n background: darken($ui-base-color, 6%);\n }\n}\n\n.emoji-mart-search input {\n background: rgba($ui-base-color, 0.3);\n border-color: $ui-base-color;\n}\n\n// Change the background colors of statuses\n.focusable:focus {\n background: $ui-base-color;\n}\n\n.status.status-direct {\n background: lighten($ui-base-color, 4%);\n}\n\n.focusable:focus .status.status-direct {\n background: lighten($ui-base-color, 8%);\n}\n\n.detailed-status,\n.detailed-status__action-bar {\n background: $white;\n}\n\n// Change the background colors of status__content__spoiler-link\n.reply-indicator__content .status__content__spoiler-link,\n.status__content .status__content__spoiler-link {\n background: $ui-base-color;\n\n &:hover {\n background: lighten($ui-base-color, 4%);\n }\n}\n\n// Change the background colors of media and video spoilers\n.media-spoiler,\n.video-player__spoiler {\n background: $ui-base-color;\n}\n\n.privacy-dropdown.active .privacy-dropdown__value.active .icon-button {\n color: $white;\n}\n\n.account-gallery__item a {\n background-color: $ui-base-color;\n}\n\n// Change the colors used in the dropdown menu\n.dropdown-menu {\n background: $white;\n\n &__arrow {\n &.left {\n border-left-color: $white;\n }\n\n &.top {\n border-top-color: $white;\n }\n\n &.bottom {\n border-bottom-color: $white;\n }\n\n &.right {\n border-right-color: $white;\n }\n }\n\n &__item {\n a {\n background: $white;\n color: $darker-text-color;\n }\n }\n}\n\n// Change the text colors on inverted background\n.privacy-dropdown__option.active,\n.privacy-dropdown__option:hover,\n.privacy-dropdown__option.active .privacy-dropdown__option__content,\n.privacy-dropdown__option.active .privacy-dropdown__option__content strong,\n.privacy-dropdown__option:hover .privacy-dropdown__option__content,\n.privacy-dropdown__option:hover .privacy-dropdown__option__content strong,\n.dropdown-menu__item a:active,\n.dropdown-menu__item a:focus,\n.dropdown-menu__item a:hover,\n.actions-modal ul li:not(:empty) a.active,\n.actions-modal ul li:not(:empty) a.active button,\n.actions-modal ul li:not(:empty) a:active,\n.actions-modal ul li:not(:empty) a:active button,\n.actions-modal ul li:not(:empty) a:focus,\n.actions-modal ul li:not(:empty) a:focus button,\n.actions-modal ul li:not(:empty) a:hover,\n.actions-modal ul li:not(:empty) a:hover button,\n.admin-wrapper .sidebar ul .simple-navigation-active-leaf a,\n.simple_form .block-button,\n.simple_form .button,\n.simple_form button {\n color: $white;\n}\n\n.dropdown-menu__separator {\n border-bottom-color: lighten($ui-base-color, 4%);\n}\n\n// Change the background colors of modals\n.actions-modal,\n.boost-modal,\n.confirmation-modal,\n.mute-modal,\n.block-modal,\n.report-modal,\n.embed-modal,\n.error-modal,\n.onboarding-modal,\n.report-modal__comment .setting-text__wrapper,\n.report-modal__comment .setting-text {\n background: $white;\n border: 1px solid lighten($ui-base-color, 8%);\n}\n\n.report-modal__comment {\n border-right-color: lighten($ui-base-color, 8%);\n}\n\n.report-modal__container {\n border-top-color: lighten($ui-base-color, 8%);\n}\n\n.column-header__collapsible-inner {\n background: darken($ui-base-color, 4%);\n border: 1px solid lighten($ui-base-color, 8%);\n border-top: 0;\n}\n\n.focal-point__preview strong {\n color: $white;\n}\n\n.boost-modal__action-bar,\n.confirmation-modal__action-bar,\n.mute-modal__action-bar,\n.block-modal__action-bar,\n.onboarding-modal__paginator,\n.error-modal__footer {\n background: darken($ui-base-color, 6%);\n\n .onboarding-modal__nav,\n .error-modal__nav {\n &:hover,\n &:focus,\n &:active {\n background-color: darken($ui-base-color, 12%);\n }\n }\n}\n\n.display-case__case {\n background: $white;\n}\n\n.embed-modal .embed-modal__container .embed-modal__html {\n background: $white;\n border: 1px solid lighten($ui-base-color, 8%);\n\n &:focus {\n border-color: lighten($ui-base-color, 12%);\n background: $white;\n }\n}\n\n.react-toggle-track {\n background: $ui-secondary-color;\n}\n\n.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track {\n background: darken($ui-secondary-color, 10%);\n}\n\n.react-toggle.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track {\n background: lighten($ui-highlight-color, 10%);\n}\n\n// Change the default color used for the text in an empty column or on the error column\n.empty-column-indicator,\n.error-column {\n color: $primary-text-color;\n background: $white;\n}\n\n.tabs-bar {\n background: $white;\n border: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 0;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 0;\n }\n\n &__link {\n padding-bottom: 14px;\n border-bottom-width: 1px;\n border-bottom-color: lighten($ui-base-color, 8%);\n\n &:hover,\n &:active,\n &:focus {\n background: $ui-base-color;\n }\n\n &.active {\n &:hover,\n &:active,\n &:focus {\n background: transparent;\n border-bottom-color: $ui-highlight-color;\n }\n }\n }\n}\n\n// Change the default colors used on some parts of the profile pages\n.activity-stream-tabs {\n background: $account-background-color;\n border-bottom-color: lighten($ui-base-color, 8%);\n}\n\n.box-widget,\n.nothing-here,\n.page-header,\n.directory__tag > a,\n.directory__tag > div,\n.landing-page__call-to-action,\n.contact-widget,\n.landing .hero-widget__text,\n.landing-page__information.contact-widget {\n background: $white;\n border: 1px solid lighten($ui-base-color, 8%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-left: 0;\n border-right: 0;\n border-top: 0;\n }\n}\n\n.landing .hero-widget__text {\n border-top: 0;\n border-bottom: 0;\n}\n\n.simple_form {\n input[type=text],\n input[type=number],\n input[type=email],\n input[type=password],\n textarea {\n &:hover {\n border-color: lighten($ui-base-color, 12%);\n }\n }\n}\n\n.landing .hero-widget__footer {\n background: $white;\n border: 1px solid lighten($ui-base-color, 8%);\n border-top: 0;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border: 0;\n }\n}\n\n.brand__tagline {\n color: $ui-secondary-color;\n}\n\n.directory__tag > a {\n &:hover,\n &:active,\n &:focus {\n background: $ui-base-color;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border: 0;\n }\n}\n\n.directory__tag.active > a,\n.directory__tag.active > div {\n border-color: $ui-highlight-color;\n\n &,\n h4,\n h4 small,\n .fa,\n .trends__item__current {\n color: $white;\n }\n\n &:hover,\n &:active,\n &:focus {\n background: $ui-highlight-color;\n }\n}\n\n.batch-table {\n &__toolbar,\n &__row,\n .nothing-here {\n border-color: lighten($ui-base-color, 8%);\n }\n}\n\n.activity-stream {\n border: 1px solid lighten($ui-base-color, 8%);\n\n &--under-tabs {\n border-top: 0;\n }\n\n .entry {\n background: $account-background-color;\n\n .detailed-status.light,\n .more.light,\n .status.light {\n border-bottom-color: lighten($ui-base-color, 8%);\n }\n }\n\n .status.light {\n .status__content {\n color: $primary-text-color;\n }\n\n .display-name {\n strong {\n color: $primary-text-color;\n }\n }\n }\n}\n\n.accounts-grid {\n .account-grid-card {\n .controls {\n .icon-button {\n color: $darker-text-color;\n }\n }\n\n .name {\n a {\n color: $primary-text-color;\n }\n }\n\n .username {\n color: $darker-text-color;\n }\n\n .account__header__content {\n color: $primary-text-color;\n }\n }\n}\n\n.simple_form,\n.table-form {\n .warning {\n box-shadow: none;\n background: rgba($error-red, 0.5);\n text-shadow: none;\n }\n\n .recommended {\n border-color: $ui-highlight-color;\n color: $ui-highlight-color;\n background-color: rgba($ui-highlight-color, 0.1);\n }\n}\n\n.compose-form .compose-form__warning {\n border-color: $ui-highlight-color;\n background-color: rgba($ui-highlight-color, 0.1);\n\n &,\n a {\n color: $ui-highlight-color;\n }\n}\n\n.status__content,\n.reply-indicator__content {\n a {\n color: $highlight-text-color;\n }\n}\n\n.button.logo-button {\n color: $white;\n\n svg {\n fill: $white;\n }\n}\n\n.public-layout {\n .account__section-headline {\n border: 1px solid lighten($ui-base-color, 8%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 0;\n }\n }\n\n .header,\n .public-account-header,\n .public-account-bio {\n box-shadow: none;\n }\n\n .public-account-bio,\n .hero-widget__text {\n background: $account-background-color;\n border: 1px solid lighten($ui-base-color, 8%);\n }\n\n .header {\n background: $ui-base-color;\n border: 1px solid lighten($ui-base-color, 8%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border: 0;\n }\n\n .brand {\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 4%);\n }\n }\n }\n\n .public-account-header {\n &__image {\n background: lighten($ui-base-color, 12%);\n\n &::after {\n box-shadow: none;\n }\n }\n\n &__bar {\n &::before {\n background: $account-background-color;\n border: 1px solid lighten($ui-base-color, 8%);\n border-top: 0;\n }\n\n .avatar img {\n border-color: $account-background-color;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n background: $account-background-color;\n border: 1px solid lighten($ui-base-color, 8%);\n border-top: 0;\n }\n }\n\n &__tabs {\n &__name {\n h1,\n h1 small {\n color: $white;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n color: $primary-text-color;\n }\n }\n }\n }\n\n &__extra {\n .public-account-bio {\n border: 0;\n }\n\n .public-account-bio .account__header__fields {\n border-color: lighten($ui-base-color, 8%);\n }\n }\n }\n}\n\n.notification__filter-bar button.active::after,\n.account__section-headline a.active::after {\n border-color: transparent transparent $white;\n}\n\n.hero-widget,\n.box-widget,\n.contact-widget,\n.landing-page__information.contact-widget,\n.moved-account-widget,\n.memoriam-widget,\n.activity-stream,\n.nothing-here,\n.directory__tag > a,\n.directory__tag > div,\n.card > a,\n.page-header,\n.compose-form .compose-form__warning {\n box-shadow: none;\n}\n\n.audio-player .video-player__controls button,\n.audio-player .video-player__time-sep,\n.audio-player .video-player__time-current,\n.audio-player .video-player__time-total {\n color: $primary-text-color;\n}\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///common.scss","webpack:///./app/javascript/styles/mastodon/reset.scss","webpack:///./app/javascript/styles/mastodon-light/variables.scss","webpack:///./app/javascript/styles/mastodon/basics.scss","webpack:///./app/javascript/styles/mastodon/containers.scss","webpack:///./app/javascript/styles/mastodon/lists.scss","webpack:///./app/javascript/styles/mastodon/footer.scss","webpack:///./app/javascript/styles/mastodon/compact_header.scss","webpack:///./app/javascript/styles/mastodon/widgets.scss","webpack:///./app/javascript/styles/mastodon/variables.scss","webpack:///./app/javascript/styles/mastodon/forms.scss","webpack:///./app/javascript/styles/mastodon/accounts.scss","webpack:///./app/javascript/styles/mastodon/statuses.scss","webpack:///./app/javascript/styles/mastodon/boost.scss","webpack:///./app/javascript/styles/mastodon/components.scss","webpack:///","webpack:///./app/javascript/styles/mastodon/_mixins.scss","webpack:///./app/javascript/styles/mastodon/polls.scss","webpack:///./app/javascript/styles/mastodon/modal.scss","webpack:///./app/javascript/styles/mastodon/emoji_picker.scss","webpack:///./app/javascript/styles/mastodon/about.scss","webpack:///./app/javascript/styles/mastodon/tables.scss","webpack:///./app/javascript/styles/mastodon/admin.scss","webpack:///./app/javascript/styles/mastodon/dashboard.scss","webpack:///./app/javascript/styles/mastodon/rtl.scss","webpack:///./app/javascript/styles/mastodon/accessibility.scss","webpack:///./app/javascript/styles/mastodon-light/diff.scss"],"names":[],"mappings":"AAAA,2ZCKA,QAaE,UACA,SACA,eACA,aACA,wBACA,+EAIF,aAEE,MAGF,aACE,OAGF,eACE,cAGF,WACE,qDAGF,UAEE,aACA,OAGF,wBACE,iBACA,MAGF,0CACE,qBAGF,UACE,YACA,2BAGF,kBACE,cACA,mBACA,iCAGF,kBACE,kCAGF,kBACE,2BAGF,aACE,gBACA,8BACA,CC3EwB,iEDkF1B,kBClF0B,4BDsF1B,sBACE,MErFF,iDACE,mBACA,eACA,iBACA,gBACA,WDZM,kCCcN,6BACA,8BACA,CADA,0BACA,CADA,qBACA,0CACA,wCACA,kBAEA,iKAYE,eAGF,SACE,oCAEA,WACE,iBACA,kBACA,uCAGF,iBACE,WACA,YACA,mCAGF,iBACE,cAIJ,kBDlDwB,kBCsDxB,iBACE,kBACA,0BAEA,iBACE,aAIJ,iBACE,YAGF,kBACE,SACA,iBACA,uBAEA,iBACE,WACA,YACA,gBACA,YAIJ,kBACE,UACA,YAGF,iBACE,kBACA,cDzFiB,mBAEK,WC0FtB,YACA,UACA,aACA,uBACA,mBACA,oBAEA,qBACE,YACA,sCAGE,aACE,gBACA,WACA,YACA,kBACA,uBAIJ,cACE,iBACA,gBACA,QAMR,mBACE,eACA,cAEA,YACE,kDAKF,YAGE,WACA,mBACA,uBACA,oBACA,sBAGF,YACE,yEAKF,gBAEE,+EAKF,WAEE,sCAIJ,qBAEE,eACA,gBACA,gBACA,cACA,kBACA,8CAEA,eACE,0CAGF,mBACE,gEAEA,eACE,0CAIJ,aDvKmB,kKC0KjB,oBAGE,sDAIJ,aD7KgB,eC+Kd,0DAEA,aDjLc,oDCsLhB,cACE,SACA,uBACA,cDzLc,aC2Ld,UACA,SACA,oBACA,eACA,UACA,4BACA,0BACA,gMAEA,oBAGE,kEAGF,aDvNY,gBCyNV,gBCnON,WACE,CACA,kBACA,qCAEA,eALF,UAMI,SACA,kBAIJ,sBACE,qCAEA,gBAHF,kBAII,qBAGF,YACE,uBACA,mBACA,wBAEA,SFtBI,YEwBF,kBACA,sBAGF,YACE,uBACA,mBACA,WF/BE,qBEiCF,UACA,kBACA,iBACA,6CACA,gBACA,eACA,mCAMJ,WACE,CACA,cACA,mBACA,sBACA,qCAEA,kCAPF,UAQI,aACA,aACA,kBAKN,WACE,CACA,YACA,eACA,iBACA,sBACA,CACA,gBACA,CACA,sBACA,qCAEA,gBAZF,UAaI,CACA,eACA,CACA,mBACA,0BAGF,UACE,YACA,iBACA,6BAEA,UACE,YACA,cACA,SACA,kBACA,uBAIJ,aACE,cF5FiB,wBE8FjB,iCAEA,aACE,gBACA,uBACA,gBACA,8BAIJ,aACE,eACA,iBACA,gBACA,SAIJ,YACE,cACA,8BACA,sBACA,mCACA,CADA,0BACA,mBAEA,eACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,eACE,WACA,qCAGF,QA3BF,UA4BI,qCACA,mBAEA,aACE,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,UAKN,YACE,cACA,8CACA,sBACA,mCACA,CADA,0BACA,mBAEA,eACE,WACA,mBAGF,eACE,WACA,mBAGF,aACE,WACA,mBAGF,eACE,WACA,mBAGF,aACE,WACA,uCAGF,eACE,wBAGF,kBACE,qCAGF,QAxCF,iDAyCI,uCAEA,YACE,aACA,mBACA,uBACA,iCAGF,UACE,uBACA,mBACA,sBAGF,YACE,sCAIJ,QA7DF,UA8DI,qCACA,mBAEA,aACE,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,sCAMJ,eADF,gBAEI,4BAGF,eACE,qCAEA,0BAHF,SAII,yBAIJ,kBACE,mCACA,kBACA,YACA,cACA,aACA,oBACA,uBACA,iBACA,gBACA,qCAEA,uBAZF,cAaI,WACA,MACA,OACA,SACA,gBACA,gBACA,YACA,6BAGF,cACE,eACA,kCAGF,YACE,oBACA,2BACA,iBACA,oCAGF,YACE,oBACA,uBACA,iBACA,mCAGF,YACE,oBACA,yBACA,iBACA,+BAGF,aACE,aACA,mCAEA,aACE,YACA,WACA,kBACA,YACA,UFzUA,qCE4UA,kCARF,WASI,+GAIJ,kBAGE,kCAIJ,YACE,mBACA,eACA,eACA,gBACA,qBACA,cF3Ve,mBE6Vf,kBACA,uHAEA,yBAGE,WFtWA,qCE0WF,0CACE,YACE,qCAKN,kBACE,CACA,oBACA,kBACA,6HAEA,oBAGE,mBACA,sBAON,YACE,cACA,0DACA,sBACA,mCACA,CADA,0BACA,gCAEA,UACE,cACA,gCAGF,UACE,cACA,qCAGF,qBAjBF,0BAkBI,WACA,gCAEA,YACE,kCAKN,iBACE,qCAEA,gCAHF,eAII,sCAKF,4BADF,eAEI,wCAIJ,eACE,mBACA,mCACA,gDAEA,UACE,qIAEA,8BAEE,CAFF,sBAEE,6DAGF,wBFrbe,8CE0bjB,yBACE,gBACA,aACA,kBACA,gBACA,oDAEA,UACE,cACA,kBACA,WACA,YACA,gDACA,MACA,OACA,kDAGF,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,0BACA,qCAGF,6CA3BF,YA4BI,gDAIJ,eACE,6JAEA,iBAEE,qCAEA,4JAJF,eAKI,sCAKN,sCA/DF,eAgEI,gBACA,oDAEA,YACE,+FAGF,eAEE,6CAIJ,iBACE,iBACA,aACA,2BACA,mDAEA,UACE,cACA,mBACA,kBACA,SACA,OACA,QACA,YACA,0BACA,WACA,oDAGF,aACE,YACA,aACA,kBACA,cACA,wDAEA,aACE,WACA,YACA,SACA,kBACA,yBACA,mBACA,qCAIJ,2CArCF,YAsCI,mBACA,0BACA,YACA,mDAEA,YACE,oDAGF,UACE,YACA,CACA,sBACA,wDAEA,QACE,kBACA,2DAGF,mDAXF,YAYI,sCAKN,2CAhEF,eAiEI,sCAGF,2CApEF,cAqEI,8CAIJ,aACE,iBACA,mDAEA,gBACE,mBACA,sDAEA,cACE,iBACA,WF3kBF,gBE6kBE,gBACA,mBACA,uBACA,6BACA,4DAEA,aACE,eACA,WFrlBJ,gBEulBI,gBACA,uBACA,qCAKN,4CA7BF,gBA8BI,aACA,8BACA,mBACA,mDAEA,aACE,iBACA,sDAEA,cACE,iBACA,iBACA,4DAEA,aF1mBS,oDEinBf,YACE,2BACA,oBACA,YACA,qEAEA,YACE,mBACA,gBACA,qCAGF,oEACE,YACE,6DAIJ,eACE,sBACA,cACA,cFtoBW,aEwoBX,+BACA,eACA,kBACA,kBACA,8DAEA,aACE,uEAGF,cACE,kEAGF,aACE,WACA,kBACA,SACA,OACA,WACA,gCACA,WACA,wBACA,yEAIA,+BACE,UACA,kFAGF,2BFxqBS,wEE8qBT,SACE,wBACA,8DAIJ,oBACE,cACA,2EAGF,cACE,cACA,4EAGF,eACE,eACA,kBACA,WFpsBJ,6CEssBI,2DAIJ,aACE,WACA,4DAGF,eACE,8CAKN,YACE,eACA,kEAEA,eACE,gBACA,uBACA,cACA,2FAEA,4BACE,yEAGF,YACE,qDAIJ,gBACE,eACA,cFvuBa,uDE0uBb,oBACE,cF3uBW,qBE6uBX,aACA,gBACA,8DAEA,eACE,WFrvBJ,qCE2vBF,6CAtCF,aAuCI,UACA,4CAKN,yBACE,qCAEA,0CAHF,eAII,wCAIJ,eACE,oCAGF,kBACE,mCACA,kBACA,gBACA,mBACA,qCAEA,mCAPF,eAQI,gBACA,gBACA,8DAGF,QACE,aACA,+DAEA,aACE,sFAGF,uBACE,yEAGF,aF9xBU,8DEoyBV,mBACA,WF9yBE,qFEkzBJ,YAEE,eACA,cFlzBe,2CEszBjB,gBACE,iCAIJ,YACE,cACA,kDACA,qCAEA,gCALF,aAMI,+CAGF,cACE,iCAIJ,eACE,2BAGF,YACE,eACA,eACA,cACA,+BAEA,qBACE,cACA,YACA,cACA,mBACA,kBACA,qCAEA,8BARF,aASI,sCAGF,8BAZF,cAaI,sCAIJ,0BAvBF,QAwBI,6BACA,+BAEA,UACE,UACA,gBACA,gCACA,0CAEA,eACE,0CAGF,kBFh3BkB,+IEm3BhB,kBAGE,WC53BZ,eACE,aAEA,oBACE,aACA,iBAIJ,eACE,cACA,oBAEA,cACE,gBACA,mBACA,wBCfF,eACE,iBACA,oBACA,eACA,cACA,qCAEA,uBAPF,iBAQI,mBACA,+BAGF,YACE,cACA,0CACA,wCAEA,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,kBACA,6CAEA,aACE,wCAIJ,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,qCAGF,6BAxCF,iCAyCI,+EAEA,aAEE,wCAGF,UACE,wCAGF,aACE,+EAGF,aAEE,wCAGF,UACE,sCAIJ,uCACE,aACE,sCAIJ,4JACE,YAIE,4BAKN,wBACE,gBACA,kBACA,cJ9Fe,6BIiGf,aACE,qBACA,6BAIJ,oBACE,cACA,wGAEA,yBAGE,mCAKF,aACE,YACA,WACA,cACA,aACA,0HAMA,YACE,oBClIR,cACE,iBACA,cACA,gBACA,mBACA,eACA,qBACA,qCAEA,mBATF,iBAUI,oBACA,uBAGF,aACE,qBACA,0BAGF,eACE,cLjBe,wBKqBjB,oBACE,mBACA,kBACA,WACA,YACA,cC9BN,kBACE,mCACA,mBAEA,UACE,kBACA,gBACA,0BACA,gBCPI,uBDUJ,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,0BACA,oBAIJ,kBNfwB,aMiBtB,0BACA,eACA,cNrBiB,iBMuBjB,qBACA,gBACA,8BAEA,UACE,YACA,gBACA,sBAGF,kBACE,iCAEA,eACE,uBAIJ,cACE,SACA,UACA,gBACA,uBACA,oBACA,kBACA,oBACA,cACA,sBAGF,aNrDiB,qBMuDf,4BAEA,yBACE,qCAKN,aAnEF,YAoEI,uBAIJ,kBACE,oBACA,yBAEA,YACE,yBACA,gBACA,eACA,cN5EiB,+BMgFnB,cACE,0CAEA,eACE,sDAGF,YACE,mBACA,gDAGF,UACE,YACA,0BACA,oCAIJ,YACE,mBAKF,aNzGmB,aM8GrB,YACE,kBACA,mBN9GwB,mCMgHxB,qBAGF,YACE,kBACA,0BACA,kBACA,cNzHmB,mBM2HnB,iBAGF,eACE,eACA,cNhImB,iBMkInB,qBACA,gBACA,UACA,oBAEA,YACE,yBACA,gBACA,eACA,cN3IiB,0BM+InB,eACE,CACA,kBACA,mBAGF,oBACE,CACA,mBACA,cNxJiB,qBM0JjB,mBACA,gBACA,uBACA,0EAEA,yBAGE,uBAMJ,sBACA,kBACA,mBNxKwB,mCM0KxB,cN5KmB,gBM8KnB,mBACA,sDAEA,eAEE,CAII,qXADF,eACE,yBAKN,aACE,0BACA,CAMI,wLAGF,oBAGE,mIAEA,yBACE,gCAMR,kBACE,oCAEA,gBACE,cNvNe,8DM6NjB,iBACE,eACA,4DAGF,eACE,qBACA,iEAEA,eACE,kBAMR,YACE,CACA,eClPM,CDoPN,cACA,cNlPmB,mBMoPnB,+BANA,iBACA,CClPM,kCDgQN,CATA,aAGF,kBACE,CAEA,iBACA,kBACA,cACA,iBAEA,UNlQM,eMoQJ,gBACA,gBACA,mBACA,gBAGF,cACE,cNxQiB,qCM4QnB,aArBF,YAsBI,mBACA,iBAEA,cACE,aAKN,kBNpR0B,kBMsRxB,mCACA,iBAEA,qBACE,mBACA,uCAEA,YAEE,mBACA,8BACA,mBNjSoB,kBMmSpB,aACA,qBACA,cACA,mCACA,0EAIA,kBAGE,0BAIJ,kBNrSiB,eMuSf,8BAGF,UACE,eACA,oBAGF,aACE,eACA,gBACA,WNpUE,mBMsUF,gBACA,uBACA,wBAEA,aNvUe,0BM2Uf,aACE,gBACA,eACA,eACA,cN/Ua,0IMqVf,UNxVE,+BMgWJ,aACE,YACA,uDAGF,oBNnViB,wCMuVjB,eACE,eAKN,YACE,yBACA,gCAEA,aACE,WACA,YACA,kBACA,kBACA,kBACA,mBACA,yBACA,4CAEA,SACE,6CAGF,SACE,6CAGF,SACE,iBAKN,UACE,0BAEA,SACE,SACA,wBAGF,eACE,0BAGF,iBACE,yBACA,cNtZiB,gBMwZjB,aACA,sCAEA,eACE,0BAIJ,cACE,sBACA,gCACA,wCAGF,eACE,wBAGF,WACE,kBACA,eACA,gBACA,WNjbI,8BMobJ,aACE,cNlbe,gBMobf,eACA,0BAIJ,SACE,iCACA,qCAGF,kCACE,YACE,sCAYJ,qIAPF,eAQI,gBACA,gBACA,iBAOJ,gBACE,qCAEA,eAHF,oBAII,uBAGF,sBACE,sCAEA,qBAHF,sBAII,sCAGF,qBAPF,UAQI,sCAGF,qBAXF,WAYI,kCAIJ,iBACE,qCAEA,gCAHF,4BAII,iEAIA,eACE,0DAGF,cACE,iBACA,oEAEA,UACE,YACA,gBACA,yFAGF,gBACE,SACA,mKAIJ,eAGE,gBAON,aNnhBmB,iCMkhBrB,kBAKI,6BAEA,eACE,kBAIJ,cACE,iBACA,wCAMF,oBACE,gBACA,cNzhBiB,4JM4hBjB,yBAGE,oBAKN,kBACE,gBACA,eACA,kBACA,yBAEA,aACE,gBACA,aACA,CACA,kBACA,gBACA,uBACA,qBACA,WNpkBI,gCMskBJ,4FAEA,yBAGE,oCAIJ,eACE,0BAGF,iBACE,gCACA,MEplBJ,+CACE,gBACA,iBAGF,eACE,aACA,cACA,qBAIA,kBACE,gBACA,4BAEA,QACE,0CAIA,kBACE,qDAEA,eACE,gDAIJ,iBACE,kBACA,sDAEA,iBACE,SACA,OACA,6BAKN,iBACE,gBACA,gDAEA,mBACE,eACA,gBACA,WRjDA,cQmDA,WACA,4EAGF,iBAEE,mDAGF,eACE,4CAGF,iBACE,QACA,OACA,qCAGF,aRpDe,0BQsDb,gIAEA,oBAGE,0CAIJ,iBACE,CACA,iBACA,mBAKN,YACE,cACA,0BAEA,qBACE,cACA,UACA,cACA,oBAIJ,aRlGmB,sBQqGjB,aRtFiB,yBQ0FjB,iBACE,kBACA,gBACA,uBAGF,eACE,iBACA,sBAIJ,kBACE,wBAGF,aACE,eACA,eACA,qBAGF,kBACE,cRhIiB,iCQmIjB,iBACE,eACA,iBACA,gBACA,gBACA,oBAIJ,kBACE,qBAGF,eACE,CAII,0JADF,eACE,sDAMJ,YACE,4DAEA,mBACE,eACA,WRnKA,gBQqKA,gBACA,cACA,wHAGF,aAEE,sDAIJ,cACE,kBACA,mDAKF,mBACE,eACA,WRzLE,cQ2LF,kBACA,qBACA,gBACA,sCAGF,cACE,mCAGF,UACE,sCAIJ,cACE,4CAEA,mBACE,eACA,WR/ME,cQiNF,gBACA,gBACA,4CAGF,kBACE,yCAGF,cACE,CADF,cACE,kDAIJ,oBACE,WACA,OACA,6BAGF,oBACE,cACA,4BAGF,kBACE,8CAEA,eACE,0BAIJ,YACE,CACA,eACA,oBACA,iCAEA,cACE,kCAGF,qBACE,eACA,cACA,eACA,oCAEA,aACE,2CAGF,eACE,6GAIJ,eAEE,qCAGF,yBA9BF,aA+BI,gBACA,kCAEA,cACE,0JAGF,kBAGE,iDAKN,iBACE,oBACA,eACA,WRnSI,cQqSJ,WACA,2CAKE,mBACE,eACA,WR7SA,qBQ+SA,WACA,kBACA,gBACA,kBACA,cACA,0DAGF,iBACE,OACA,QACA,SACA,kDAKN,cACE,aACA,yBACA,kBACA,sJAGF,qBAKE,eACA,WR7UI,cQ+UJ,WACA,UACA,oBACA,gBACA,mBACA,sBACA,kBACA,aACA,6RAEA,aACE,CAHF,+OAEA,aACE,CAHF,mQAEA,aACE,CAHF,sNAEA,aACE,8LAGF,eACE,oVAGF,oBACE,iOAGF,oBR5VY,oLQgWZ,iBACE,4WAGF,oBR3ViB,mBQ8Vf,6CAKF,aACE,gUAGF,oBAME,8CAGF,aACE,gBACA,cACA,eACA,8BAIJ,UACE,uBAGF,eACE,aACA,oCAEA,YACE,mBACA,qEAIJ,aAGE,WACA,SACA,kBACA,mBR5YiB,WAlBb,eQiaJ,oBACA,YACA,aACA,yBACA,qBACA,kBACA,sBACA,eACA,gBACA,UACA,mBACA,kBACA,sGAEA,cACE,uFAGF,wBACE,gLAGF,wBAEE,kHAGF,wBR5ae,gGQgbf,kBD7bQ,kHCgcN,wBACE,sOAGF,wBAEE,qBAKN,uBACE,CADF,oBACE,CADF,eACE,sBACA,eACA,WRjdI,cQmdJ,WACA,UACA,oBACA,gBACA,wXACA,sBACA,kBACA,kBACA,mBACA,YACA,iBAGF,4BACE,oCAIA,iBACE,mCAGF,iBACE,UACA,QACA,CACA,qBACA,eACA,cRzdY,oBQ2dZ,oBACA,eACA,gBACA,mBACA,gBACA,yCAEA,UACE,cACA,kBACA,MACA,QACA,WACA,UACA,oEACA,4BAKN,iBACE,0CAEA,wBACE,CADF,gBACE,qCAGF,iBACE,MACA,OACA,WACA,YACA,aACA,uBACA,mBACA,iCACA,kBACA,iBACA,gBACA,YACA,8CAEA,iBACE,6HAGE,UR/hBF,aQyiBR,aACE,CACA,kBACA,eACA,gBAGF,kBACE,cR9iBmB,kBQgjBnB,kBACA,mBACA,kBACA,uBAEA,mCACE,+BACA,cRjjBY,sBQqjBd,mCACE,+BACA,cD7jBQ,kBCikBV,oBACE,cRlkBiB,qBQokBjB,wBAEA,URzkBI,0BQ2kBF,kBAIJ,kBACE,4BAGF,SACE,sBACA,cACA,WACA,SACA,aACA,gDACA,mBRrlBsB,WALlB,eQ6lBJ,SACA,8CAEA,QACE,iHAGF,mBAGE,kCAGF,kBACE,uBAIJ,eACE,CAII,oKADF,eACE,0DAKN,eAzEF,eA0EI,eAIJ,eACE,kBACA,gBAEA,aR/nBmB,qBQioBjB,sBAEA,yBACE,YAKN,eACE,mBACA,eACA,eAEA,oBACE,kBACA,cAGF,aRpoBmB,yBQsoBjB,qBACA,gBACA,2DAEA,aAGE,8BAKN,kBAEE,cRnqBmB,oCQsqBnB,cACE,mBACA,kBACA,4CAGF,aR5qBmB,gBQ8qBjB,CAII,mUADF,eACE,0DAKN,6BAtBF,eAuBI,cAIJ,YACE,eACA,uBACA,UAGF,aACE,gBDrsBM,YCusBN,qBACA,mCACA,qBACA,cAEA,aACE,SACA,iBAIJ,kBACE,cRjtBmB,WQmtBnB,sBAEA,aACE,eACA,eAKF,kBACE,sBAEA,eACE,CAII,+JADF,eACE,4CASR,qBACE,CACA,URlvBI,qCQovBJ,oCACA,kBACA,aACA,mBACA,gDAEA,UR1vBI,0BQ4vBF,oLAEA,oBAGE,0DAIJ,eACE,cACA,kBACA,CAII,yYADF,eACE,kEAIJ,eACE,oBAMR,YACE,eACA,mBACA,4DAEA,aAEE,6BAIA,wBACA,cACA,sBAIJ,iBACE,cRtyBmB,0BQyyBnB,iBACE,oBAIJ,eACE,mBACA,uBAEA,cACE,WRtzBI,kBQwzBJ,mBACA,SACA,UACA,4BAGF,aACE,eAIJ,aD/zBc,0SCy0BZ,+CACE,aAIJ,kBACE,sBACA,kBACA,aACA,mBACA,kBACA,kBACA,QACA,mCACA,sBAEA,aACE,8BAGF,sBACE,SACA,aACA,eACA,gDACA,oBAGF,aACE,WACA,oBACA,gBACA,eACA,CACA,oBACA,WACA,iCACA,oBAGF,oBR52Bc,gBQ82BZ,2BAEA,kBRh3BY,gBQk3BV,oBAKN,kBACE,6BAEA,wBACE,mBACA,eACA,aACA,4BAGF,kBACE,aACA,OACA,sBACA,cACA,cACA,gCAEA,iBACE,YACA,iBACA,kBACA,UACA,8BAGF,qBACE,qCAIJ,kBACE,gCAGF,wBACE,mCACA,kBACA,kBACA,kBACA,kBACA,sCAEA,wBACE,WACA,cACA,YACA,SACA,kBACA,MACA,UACA,yBAIJ,sBACE,aACA,mBACA,SC17BF,aACE,qBACA,cACA,mCACA,qCAEA,QANF,eAOI,8EAMA,kBACE,YAKN,YACE,kBACA,gBACA,0BACA,gBAEA,aACE,WACA,YACA,SACA,oBACA,CADA,8BACA,CADA,gBACA,0BACA,qCAGF,WAfF,YAgBI,sCAGF,WAnBF,YAoBI,aAIJ,iBACE,aACA,aACA,2BACA,mBACA,mBACA,0BACA,qCAEA,WATF,eAUI,qBAGF,aACE,WACA,YACA,gBACA,wBAEA,UACE,YACA,cACA,SACA,kBACA,mBACA,oBACA,CADA,8BACA,CADA,gBACA,0BAIJ,gBACE,gBACA,iCAEA,cACE,WT9EA,gBSgFA,gBACA,uBACA,+BAGF,aACE,eACA,cTpFa,gBSsFb,gBACA,uBACA,aAMR,cACE,kBACA,gBACA,6GAEA,cAME,WT5GI,gBS8GJ,qBACA,iBACA,qBACA,sBAGF,eFnHM,oBEqHJ,WTtHI,eSwHJ,cACA,kBAGF,cACE,uCAGF,wBAEE,cT/HiB,oBSmInB,UACE,eACA,wBAEA,oBACE,iBACA,oBAIJ,WACE,gBACA,wBAEA,oBACE,gBACA,uBAIJ,cACE,WACA,qCAGF,YA9DF,iBA+DI,mBAEA,YACE,uCAGF,oBAEE,gBAKN,kBTxK0B,mCS0KxB,cTpJiB,eSsJjB,gBACA,kBACA,aACA,uBACA,mBACA,eACA,kBACA,aACA,gBACA,2BAEA,yBACE,yBAGF,qBACE,gBACA,yCAIJ,oBAEE,gBACA,eACA,kBACA,eACA,iBACA,gBACA,cT3MmB,mCS6MnB,mCACA,6DAEA,aT1Mc,oCS4MZ,gCACA,qDAGF,aACE,oCACA,gCACA,0BAIJ,eACE,UACA,wBACA,gBACA,CADA,YACA,CACA,iCACA,CADA,uBACA,CADA,kBACA,eACA,iBACA,6BAEA,YACE,gCACA,yDAGF,qBAEE,aACA,kBACA,gBACA,gBACA,mBACA,uBACA,6BAGF,eACE,YACA,cACA,cT1PiB,gCS4PjB,6BAGF,aACE,cThQiB,4BSoQnB,aTrPmB,qBSuPjB,qGAEA,yBAGE,oCAIJ,mCACE,+BACA,sCAEA,aT7QY,gBS+QV,0CAGF,aTlRY,wCSuRd,eACE,wCAIJ,UACE,0BAIA,aTvSmB,4BS0SjB,aT1SiB,qBS4Sf,qGAEA,yBAGE,iCAIJ,UTxTI,gBS0TF,wBAIJ,eACE,kBChUJ,kCACE,kBACA,gBACA,mBACA,8BAEA,yBACE,qCAGF,iBAVF,eAWI,gBACA,gBACA,6BAGF,eACE,SACA,gBACA,gFAEA,yBAEE,sCAIJ,UACE,yBAGF,kBVzBwB,6GU4BtB,sBAGE,CAHF,cAGE,8IAIA,eAGE,0BACA,iJAKF,yBAGE,kLAIA,iBAGE,qCAKN,4GACE,yBAGE,uCAKN,kBACE,qBAIJ,WACE,eACA,mBV9DmB,WAlBb,oBUmFN,iBACA,YACA,iBACA,SACA,yBAEA,UACE,YACA,sBACA,iBACA,UV7FI,gFUiGN,kBAGE,qNAKA,kBVzFe,4IUiGf,kBH9GQ,qCGqHV,wBACE,YACE,0DAOJ,YACE,uCAGF,2BACE,gBACA,uDAEA,SACE,SACA,yDAGF,eACE,yDAGF,gBACE,iBACA,mFAGF,UACE,qMAGF,eAGE,iCC/JN,u+KACE,uCAEA,u+KACE,0CAIJ,u+KACE,WCTF,gCACE,4CACA,kBAGF,mBACE,sBACA,oBACA,gBACA,kBACA,cAGF,aACE,eACA,iBACA,cZGmB,SYDnB,uBACA,UACA,eACA,wCAEA,yBAEE,uBAGF,aZXiB,eYaf,SAIJ,wBZfqB,YYiBnB,kBACA,sBACA,WZrCM,eYuCN,qBACA,oBACA,eACA,gBACA,YACA,iBACA,iBACA,gBACA,eACA,kBACA,kBACA,yBACA,qBACA,uBACA,2BACA,mBACA,WACA,4CAEA,wBAGE,4BACA,sBAGF,eACE,mFAEA,wBLjEQ,gBKqEN,mCAIJ,wBZ5DiB,eY+Df,2BAGF,QACE,wDAGF,mBAGE,yGAGF,cAIE,iBACA,YACA,oBACA,iBACA,4BAGF,UZvGM,mBAgBW,qGY2Ff,wBAGE,8BAIJ,kBZnGsB,2GYsGpB,wBAGE,0BAIJ,aZzHmB,uBY2HjB,iBACA,yBACA,+FAEA,oBAGE,cACA,mCAGF,UACE,uBAIJ,aACE,WACA,kBAIJ,YACE,cACA,kBACA,cAGF,oBACE,UACA,cZrIoB,SYuIpB,kBACA,uBACA,eACA,2BACA,2CACA,2DAEA,aAGE,sCACA,4BACA,2CACA,oBAGF,oCACE,uBAGF,aACE,6BACA,eACA,qBAGF,aZtKmB,gCY0KnB,QACE,uEAGF,mBAGE,uBAGF,aZnMmB,sFYsMjB,aAGE,oCACA,6BAGF,kCACE,gCAGF,aACE,6BACA,8BAGF,aZvMiB,uCY0Mf,aACE,wBAKN,sBACE,8BACA,qBACA,kBACA,YACA,8BAEA,6BACE,mBAKN,aZ5OqB,SY8OnB,kBACA,uBACA,eACA,gBACA,eACA,cACA,iBACA,UACA,2BACA,2CACA,0EAEA,aAGE,oCACA,4BACA,2CACA,yBAGF,kCACE,4BAGF,UACE,6BACA,eACA,0BAGF,aZ9PmB,qCYkQnB,QACE,sFAGF,mBAGE,CAKF,0BADF,iBAUE,CATA,WAGF,WACE,cACA,qBACA,QACA,SAEA,+BAEA,kBAEE,mBACA,oBACA,kBACA,mBACA,iBAKF,WACE,eAIJ,YACE,iCAGE,mBACA,eAEA,gBACA,wCAEA,aZnTiB,sDYuTjB,YACE,2CAGF,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,kDAEA,oBZxUe,yDY+UnB,UZjWM,mBYmWJ,mBZnVe,oCYqVf,iBACA,kBACA,eACA,gBACA,6CAEA,UZ3WI,gBY6WF,CAII,kRADF,eACE,wCAKN,aZnXiB,gBYqXf,0BACA,yIAEA,oBAGE,sCAKN,iBACE,MACA,QACA,kDAGF,iBACE,mGAGF,iBAGE,WACA,8BAGF,QACE,wBACA,UACA,qDAEA,WACE,mBACA,UACA,mFAIJ,aAEE,sBACA,WACA,SACA,WZraI,gBOCA,aKuaJ,oBACA,eACA,gBACA,SACA,UACA,yIAEA,aZzZc,CYuZd,sHAEA,aZzZc,CYuZd,8HAEA,aZzZc,CYuZd,4GAEA,aZzZc,+FY6Zd,SACE,qCAGF,kFAvBF,cAwBI,sCAIJ,iBACE,+CAGF,gBACE,0BACA,iBACA,mBACA,YACA,qBACA,kEAEA,SACE,qCAGF,8CAZF,sBAaI,gBACA,2DAIJ,iBACE,SACA,kDAGF,qBACE,aACA,kBACA,SACA,WACA,WACA,sCACA,mBZ3diB,0BY6djB,WZheI,eYkeJ,YACA,6FAEA,aACE,wDAIJ,YACE,eACA,kBACA,yPAEA,kBAIE,wGAIJ,YAGE,mBACA,mBACA,2BACA,iBACA,eACA,oCAGF,6BACE,0CAEA,aACE,gBACA,uBACA,mBACA,2CAGF,eACE,0CAGF,aACE,iBACA,gBACA,uBACA,mBACA,8EAIJ,aAEE,iBACA,WACA,YACA,2DAGF,aZ9hBmB,wCYkiBnB,UZriBM,oBYuiBJ,eACA,gBLviBI,sEK0iBJ,eACE,uEAGF,YACE,mBACA,YACA,eACA,8DAGF,UACE,cACA,WACA,uEAEA,iFACE,aACA,uBACA,8BACA,UACA,4BACA,oFAEA,aACE,cZjkBW,eYmkBX,gBACA,aACA,oBACA,6QAEA,aAGE,8EAIJ,SACE,0EAIJ,iBACE,UACA,SACA,OACA,QACA,sBACA,gFACA,aACA,UACA,4BACA,mFAEA,sBACE,cZjmBW,SYmmBX,UACA,SACA,WACA,oBACA,eACA,gBACA,yFAEA,UL7mBF,8GKinBE,WACE,cZhnBS,COFb,oGKinBE,WACE,cZhnBS,COFb,wGKinBE,WACE,cZhnBS,COFb,+FKinBE,WACE,cZhnBS,iFYqnBb,SACE,wEAKN,iBACE,sBL/nBE,wBKioBF,sBACA,4BACA,aACA,WACA,gBACA,8CAIJ,YACE,gBACA,0BACA,aACA,8BACA,cACA,qEAEA,YACE,uGAEA,gBACE,qGAGF,YACE,6IAEA,aACE,2IAGF,gBACE,0HAKN,sBAEE,cACA,0EAGF,iBACE,iBACA,sCAIJ,YACE,yBACA,YACA,cACA,4EAEA,eACE,iBACA,oBAKN,cACE,kDACA,eACA,gBACA,cZhsBmB,4CYmsBnB,aLlsBY,kCKusBd,2CACE,WC7sBF,8DDktBE,sBACA,CADA,kBACA,wBACA,WACA,YACA,eAEA,UACE,kBAIJ,iBACE,mBACA,mBZ9sBiB,aYgtBjB,gBACA,gBACA,cACA,0BAGF,iBACE,gBACA,0BAGF,WACE,iBACA,gCAGF,UZhvBQ,cYkvBN,eACA,iBACA,gBACA,mBACA,qBACA,kCAGF,UACE,iBACA,+BAGF,cACE,4CAGF,iBAEE,eACA,iBACA,qBACA,gBACA,gBACA,uBACA,gBACA,WZ5wBM,wDY+wBN,SACE,wGAGF,kBACE,sJAEA,oBACE,gEAIJ,UACE,YACA,gBACA,oDAGF,cACE,iBACA,sBACA,CADA,gCACA,CADA,kBACA,gDAGF,kBACE,qBACA,sEAEA,eACE,gDAIJ,aLnyBc,qBKqyBZ,4DAEA,yBACE,oEAEA,aACE,4EAKF,oBACE,sFAEA,yBACE,wDAKN,aZhzBc,8EYqzBhB,aACE,0GAGF,kBZxzBoB,sHY2zBlB,kBACE,qBACA,8IAGF,QACE,0XAGF,mBAGE,0FAIJ,YACE,wJAEA,aACE,+BAKN,oBACE,gBACA,yCAEA,UACE,YACA,gBACA,iCAGF,kBACE,qBACA,4CAEA,eACE,iCAIJ,aZ33BmB,qBY63BjB,uCAEA,yBACE,+CAIA,oBACE,oDAEA,yBACE,gDAKN,aACE,6CAKN,gBACE,oCAGF,aACE,eACA,iBACA,cACA,SACA,uBACA,CACA,eACA,qBACA,oFAEA,yBAEE,gCAIJ,oBACE,kBACA,uBACA,SACA,WZ/6BM,gBYi7BN,eACA,cACA,yBACA,iBACA,eACA,sBACA,4BAGF,aZp6BkB,SYs6BhB,kBACA,kBACA,oBACA,SACA,aACA,sBACA,WACA,WACA,gCACA,+BAGF,UACE,kBACA,kBAIA,SACE,mBACA,wCAEA,kBACE,8CAEA,sBACE,iFAIJ,kBAEE,SAMJ,yBACA,kBACA,gBACA,gCACA,eACA,UAaA,mCACA,CADA,0BACA,wDAZA,QARF,kBAWI,0BAGF,GACE,aACA,WALA,gBAGF,GACE,aACA,uDAMF,cAEE,kCAGF,kBACE,4BACA,sCAIA,aZv+Be,qCY2+Bf,UZtgCI,6BY0gCJ,aZ/+Be,CA3BX,kEYkhCJ,UZlhCI,kCYqhCF,aZngCe,gEYugCf,UZzhCE,mBAgBW,sEY6gCX,kBACE,+CAQR,sBACE,qEAEA,aACE,qDAKN,aZzhCkB,YY4hChB,eACA,uBAGF,aZhiCkB,qCYoiClB,aACE,eACA,mBACA,eAGF,cACE,mBAGF,+BACE,aACA,6CAEA,uBACE,OACA,gBACA,4DAEA,eACE,8DAGF,SACE,mBACA,qHAGF,cAEE,gBACA,4EAGF,cACE,0BAKN,kBACE,aACA,cACA,uBACA,aACA,kBAGF,gBACE,cZrlCgB,CYulChB,iBACA,eACA,kBACA,+CAEA,aZ5lCgB,uBYgmChB,aACE,gBACA,uBACA,qBAIJ,kBACE,aACA,eACA,8BAEA,mBACE,kBACA,mBACA,yDAEA,gBACE,qCAGF,oBACE,WACA,eACA,gBACA,cZxnCgB,4BY8nCtB,iBACE,8BAGF,cACE,cACA,uCAGF,aACE,aACA,mBACA,uBACA,kBACA,kBAGF,kBACE,kBACA,wBAEA,YACE,eACA,8BACA,uBACA,uFAEA,SAEE,mCAIJ,cACE,iBACA,6CAEA,UACE,YACA,gBACA,kEAGF,gBACE,gBACA,+DAIJ,cAEE,wBAIJ,eACE,cZvrCgB,eYyrChB,iBACA,8BAGF,kBACE,6BACA,gCACA,aACA,mBACA,eACA,wBAGF,aACE,qBACA,uDAGF,oBAEE,gBACA,eACA,gBACA,2BAGF,UZzuCQ,eY2uCN,6BAEA,aZ1uCmB,SY+uCrB,YACE,gCACA,8BAEA,aACE,cACA,WZxvCI,qBY0vCJ,eACA,gBACA,kBAIJ,YACE,iBAGF,WACE,aACA,mBACA,UAGF,YACE,gCACA,kBAEA,SACE,gBACA,2CAEA,aACE,iCAIJ,aACE,cACA,cZtxCiB,gBYwxCjB,qBACA,eACA,mBAIJ,YACE,0BAGF,UACE,iBACA,kBACA,kBAGF,iBE3yCE,iCACA,wBACA,4BACA,kBF0yCA,yBAEA,oBACE,sBACA,iBACA,4BAGF,iBErzCA,iCACA,wBACA,4BACA,kBFozCE,gBACA,kBACA,gCAEA,UACE,kBACA,sBACA,mCAGF,aACE,kBACA,QACA,SACA,+BACA,WZt0CE,6BYw0CF,gBACA,eACA,oBAKN,cACE,0BAGF,UACuB,sCE30CrB,+BF60CA,iBEt1CA,iCACA,wBACA,4BACA,WFq1CuB,sCE/0CvB,kCFk1CA,iBE31CA,iCACA,wBACA,4BACA,WF01CuB,sCEp1CvB,kBFs1CE,SACA,QACA,UACA,wBAIJ,WACE,aACA,mBACA,sBAGF,YACE,6BACA,cZx1CgB,6BY21ChB,eACE,CAII,kMADF,eACE,wBAKN,eACE,cACA,0BACA,yFAEA,oBAGE,sBAKN,4BACE,gCACA,iBACA,gBACA,cACA,aACA,+BAGF,YACE,4CAEA,qBACE,oFAIA,QACE,WACA,uDAGF,WACE,iBACA,gBACA,WACA,4BAKN,YACE,cACA,iBACA,kBACA,2BAGF,oBACE,gBACA,cACA,+BACA,eACA,oCACA,kCAEA,+BACE,gCAGF,aACE,yBACA,eACA,cZ17CiB,kCY87CnB,aACE,eACA,gBACA,WZp8CI,CYy8CA,2NADF,eACE,oBAMR,iBACE,mDAEA,aACE,mBACA,gBACA,4BAIJ,UACE,kBACA,6JAGF,oBAME,4DAKA,UZz+CM,kBY++CN,UACE,iKAQF,yBACE,+BAIJ,aACE,gBACA,uBACA,0DAGF,aAEE,sCAGF,kBACE,gCAGF,aZzgDqB,cY2gDnB,iBACA,mBACA,gBACA,2EAEA,aAEE,uBACA,gBACA,uCAGF,cACE,WZ3hDI,kCYgiDR,UACE,kBACA,iBAGF,WACE,UACA,kBACA,SACA,WACA,iBAGF,UACE,kBACA,OACA,MACA,YACA,eACA,CZ7hDgB,gHYuiDhB,aZviDgB,wBY2iDhB,UACE,wCAGF,kBZtjDsB,WAfhB,8CYykDJ,kBACE,qBACA,wBAKN,oBACE,gBACA,eACA,cZhlDmB,eYklDnB,iBACA,kBACA,4BAEA,aZvkDmB,6BY2kDnB,cACE,gBACA,uBACA,uCAIJ,UACE,kBACA,CLjmDU,mEKwmDZ,aLxmDY,uBK4mDZ,aL7mDc,4DKmnDV,4CACE,CADF,oCACE,8DAKF,6CACE,CADF,qCACE,6BAKN,aACE,gBACA,qBACA,mCAEA,UZxoDM,0BY0oDJ,8BAIJ,WACE,eAGF,aACE,eACA,gBACA,uBACA,mBACA,qBAGF,eACE,wBAGF,cACE,+DAKA,yBACE,eAIJ,iBACE,WACA,YACA,aACA,mBACA,uBACA,sBACA,6CAEA,cL9nD4B,eAEC,0DK+nD3B,sBACA,CADA,gCACA,CADA,kBACA,4BAGF,iBACE,qEAGF,YACE,iBAIJ,iBACE,WACA,YACA,aACA,mBACA,uBACA,qBAEA,cLtpD4B,eAEC,WKupD3B,YACA,sBACA,CADA,gCACA,CADA,kBACA,iBAIJ,YACE,aACA,mBACA,cACA,eACA,cZrtDmB,wBYwtDnB,aZxtDmB,mBY4tDnB,aACE,4BAGF,oBACE,0CAGF,iBACE,6DAEA,iBACE,oBACA,qCACA,UACA,4EAGF,mBACE,gCACA,UACA,0BAKN,aACE,gBACA,iBACA,gBACA,gBACA,kCAGF,aACE,gBACA,gBACA,uBACA,+BAGF,aACE,qBACA,WAGF,oBACE,oBAGF,YACE,kBACA,2BAGF,+BACE,mBACA,SACA,gBAGF,kBZzxDqB,cY2xDnB,kBACA,uCACA,aACA,mBAEA,eACE,qBAGF,yBACE,oBAGF,yBACE,uBAGF,sBACE,sBAGF,sBACE,uBAIJ,iBACE,QACA,SACA,2BACA,4BAEA,UACE,gBACA,2BACA,0BZ9zDiB,2BYk0DnB,WACE,iBACA,uBACA,yBZr0DiB,8BYy0DnB,QACE,iBACA,uBACA,4BZ50DiB,6BYg1DnB,SACE,gBACA,2BACA,2BZn1DiB,wBYy1DnB,cACE,iBACA,cACA,iBACA,sBACA,qBACA,mBZ/1DiB,WAHb,gBYq2DJ,uBACA,mBACA,yFAEA,kBZv1DiB,cAfA,UY22Df,sCAKN,aACE,iBACA,gBACA,QACA,gBACA,aACA,yCAEA,eACE,mBZz3DiB,cY23DjB,kBACA,mCACA,gBACA,kBACA,sDAGF,OACE,wDAIA,UACE,8CAIJ,cACE,iBACA,cACA,iBACA,sBACA,qBACA,mBZl5DiB,WAHb,gBYw5DJ,uBACA,mBACA,oDAEA,SACE,oDAGF,kBZ94DiB,cAfA,iBYo6DrB,qBACE,eAGF,YACE,cACA,mBACA,2BACA,gBACA,kBACA,4BAEA,iBACE,uBAGF,YACE,uBACA,WACA,YACA,iBACA,6BAEA,WACE,gBACA,oBACA,aACA,yBACA,gBACA,oCAEA,0BACE,oCAGF,cACE,YACA,oBACA,YACA,6BAIJ,qBACE,WACA,gBACA,cACA,aACA,sBACA,qCAEA,4BARF,cASI,qBAMR,kBACE,wBACA,CADA,eACA,MACA,UACA,cACA,qCAEA,mBAPF,gBAQI,+BAGF,eACE,qCAEA,6BAHF,kBAII,gKAMJ,WAIE,mCAIJ,YACE,mBACA,uBACA,YACA,SAGF,WACE,kBACA,sBACA,aACA,sBACA,qBAEA,kBZvgEwB,8BYygEtB,+BACA,KAIJ,aACE,CACA,qBACA,WACA,YACA,aAJA,YAYA,CARA,QAGF,WACE,sBACA,CACA,qBACA,kBACA,cAGF,aACE,cACA,sBACA,cZniEmB,qBYqiEnB,kBACA,eACA,oCACA,iBAGF,aAEE,gBACA,qCAGF,cACE,SACE,iBAGF,aAEE,CAEA,gBACA,yCAEA,iBACE,uCAGF,kBACE,qDAKF,gBAEE,kBACA,YAKN,qBACE,aACA,mBACA,cACA,gBACA,iBAGF,aACE,cACA,CACA,sBACA,WZ9lEM,qBYgmEN,kBACA,eACA,gBACA,gCACA,2BACA,mDACA,qBAEA,eACE,eACA,qCAMA,mEAHF,kBAII,4BACA,yBAIJ,+BACE,cZrmEiB,sBYymEnB,eACE,aACA,qCAIJ,qBAEI,cACE,wBAKN,qBACE,WACA,YACA,cACA,6DAEA,UAEE,YACA,UACA,wCAGF,YACE,cACA,kDACA,qCAEA,uCALF,aAMI,yCAIJ,eACE,oCAGF,YACE,uDAGF,cACE,sCAGF,gBACE,eACA,CACA,2BACA,yCAGF,QACE,mCAGF,gBACE,yBAEA,kCAHF,eAII,sCAIJ,sBACE,gBACA,sCAGF,uCACE,YACE,iKAEA,eAGE,6CAIJ,gBACE,2EAGF,YAEE,kGAGF,gBACE,+BAGF,2BACE,gBACA,uCAEA,SACE,SACA,wCAGF,eACE,wCAGF,gBACE,iBACA,qDAGF,UACE,gLAGF,eAIE,gCAIJ,iBACE,6CAEA,cACE,8CAKF,gBACE,iBACA,6DAGF,UACE,CAIA,yFAGF,eACE,8DAGF,gBACE,kBACA,0BAMR,cACE,aACA,uBACA,mBACA,gBACA,iBACA,iBACA,gBACA,mBACA,WLpyEM,kBKsyEN,eACA,iBACA,qBACA,sCACA,4FAEA,kBAGE,qCAIJ,UACE,UACE,uDAGF,kCACE,4DAGF,kBAGE,yBAGF,aACE,iBAGF,eAEE,sCAIJ,2CACE,YACE,sCAOA,sEAGF,YACE,uCAIJ,0CACE,YACE,uCAIJ,UACE,YACE,mBAIJ,iBACE,yBAEA,iBACE,SACA,UACA,mBZ91EiB,yBYg2EjB,gBACA,kBACA,eACA,gBACA,iBACA,WZv3EI,mDY43ER,oBACE,gBAGF,WACE,gBACA,aACA,sBACA,yBACA,kBACA,gCAEA,gBACE,oBACA,cACA,gBACA,6BAGF,sBACE,8BAGF,MACE,kBACA,aACA,sBACA,iBACA,oBACA,oBACA,mDAGF,eACE,sBL75EI,0BK+5EJ,cACA,gDAGF,iBACE,gDAGF,WACE,mBAIJ,eACE,mBACA,yBACA,gBACA,aACA,sBACA,qBAEA,aACE,sBAGF,aACE,SACA,CACA,4BACA,cACA,qDAHA,sBAOA,gBAMF,WACA,kBAGA,+BANF,qBACE,UACA,CAEA,eACA,aAiBA,CAhBA,eAGF,iBACE,MACA,OACA,mBACA,CAGA,qBACA,CACA,eACA,WACA,YACA,kBACA,uBAEA,kBZz9EwB,0BY89E1B,u1BACE,OACA,gBACA,aACA,8BAEA,aACE,sBACA,CADA,4DACA,CADA,kBACA,+BACA,CADA,2BACA,UACA,YACA,oBACA,eACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,sCAGF,yBAjBF,aAkBI,iBAIJ,kBACE,eACA,gBACA,iBAGF,aACE,eACA,mBACA,mBACA,aACA,mBACA,kBACA,mBAEA,iCACE,yBAEA,kBACE,mCACA,aAKN,iBACE,kBACA,cACA,iCACA,mCAEA,eACE,yBAGF,YAVF,cAWI,oBAGF,YACE,sBACA,qBAGF,aACE,kBACA,iBACA,yBAKF,uBADF,YAEI,sBAIJ,qBACE,WACA,mBACA,cZniFmB,eYqiFnB,cACA,eACA,oBACA,SACA,iBACA,aACA,SACA,UACA,UACA,2BAEA,yBACE,6BAIJ,kBACE,SACA,oBACA,cZxjFmB,eY0jFnB,mBACA,eACA,kBACA,UACA,mCAEA,yBACE,wCAGF,kBACE,2BAIJ,oBACE,iBACA,2BAGF,iBACE,kCAGF,cACE,cACA,eACA,aACA,kBACA,QACA,UACA,eAGF,oBACE,kBACA,eACA,6BACA,SACA,UACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,gDACA,wCACA,iCAGF,QACE,mBACA,WACA,YACA,gBACA,UACA,kBACA,UACA,yBAGF,kBACE,WACA,wBACA,qBAGF,UACE,YACA,UACA,mBACA,yBZ1oFwB,qCY4oFxB,sEAGF,wBACE,4CAGF,wBZtoFqB,+EY0oFrB,wBACE,2BAGF,iBACE,WACA,YACA,MACA,SACA,gBACA,mBACA,cACA,SACA,UACA,6BACA,CAKA,uEAFF,SACE,6BAeA,CAdA,sBAGF,iBACE,WACA,YACA,MACA,SACA,gBACA,mBACA,cACA,WAGA,8CAGF,SACE,qBAGF,iBACE,QACA,SACA,WACA,YACA,yBACA,kBACA,sBACA,sBACA,yBACA,sCACA,4CAGF,SACE,qBZlsFmB,cYssFrB,kBACE,WZztFM,cY2tFN,eACA,aACA,qBACA,2DAEA,kBAGE,oBAGF,SACE,2BAGF,sBACE,cZxuFiB,kGY2uFjB,sBAGE,WZjvFE,kCYqvFJ,aZnuFiB,oBYyuFrB,oBACE,iBACA,qBAGF,oBACE,kBACA,CACA,gBACA,CZ/vFwB,eYkwFxB,iBACA,wCANA,cACA,CACA,eACA,mBAaA,CAVA,mBZnwFwB,aAiBR,iBYwvFhB,CAEA,wBACA,eACA,yDAGF,kBZhxF0B,cYsxF1B,aACE,kBAGF,aZzwFkB,cY2wFhB,8BACA,+BACA,4EAEA,0BAGE,CAHF,uBAGE,CAHF,kBAGE,kDAMA,sBACA,YACA,wDAEA,kBACE,8DAGF,cACE,sDAGF,cACE,0DAEA,aZvyFY,0BYyyFV,sDAIJ,oBACE,cZj0Fe,sMYo0Ff,yBAGE,oDAKN,aZzzFgB,0BY+zFhB,aACE,UACA,mCACA,CADA,0BACA,gBACA,6BAEA,cACE,yBACA,cZ11Fe,aY41Ff,gBACA,gCACA,sCAGF,oDACE,YACE,uCAIJ,oDACE,YACE,uCAIJ,yBA3BF,YA4BI,yCAGF,eACE,aACA,iDAEA,aZr3Fe,qBY43FrB,eACE,gBACA,2BAEA,iBACE,aACA,wBAGF,kBACE,yBAGF,oBACE,gBACA,yBACA,yBACA,eAIJ,aACE,sBACA,WACA,SACA,WZx5FM,gBOCA,aK05FN,oBACA,eACA,gBACA,SACA,UACA,kBACA,qBAEA,SACE,qCAGF,cAnBF,cAoBI,oDAIJ,uBACE,YACA,6CACA,uBACA,sBACA,WACA,0DAEA,sBACE,0DAKJ,uBACE,2BACA,gDAGF,aZx6FsB,6BY06FpB,uDAGF,aZl7FqB,cYs7FrB,YACE,eACA,yBACA,kBACA,cZt7FgB,gBYw7FhB,qBACA,gBACA,uBAEA,QACE,OACA,kBACA,QACA,MAIA,iDAHA,YACA,uBACA,mBAUE,CATF,0BAEA,yBACE,kBACA,iBACA,cAIA,sDAGF,cAEE,cZr+Fe,uBYu+Ff,SACA,cACA,qBACA,eACA,iBACA,sMAEA,UZj/FE,yBYw/FJ,cACE,kBACA,YACA,eAKN,cACE,qBAEA,kBACE,oBAIJ,cACE,cACA,qBACA,WACA,YACA,SACA,2BAIA,UACE,YACA,qBAIJ,aACE,gBACA,kBACA,cZxhGmB,gBY0hGnB,uBACA,mBACA,qBACA,uBAGF,aACE,gBACA,2BACA,2BAGF,aZtiGqB,oBY0iGrB,aACE,eACA,eACA,gBACA,uBACA,mBACA,qBAGF,cACE,mBACA,kBACA,yBAEA,cACE,kBACA,yBACA,QACA,SACA,+BACA,yBAIJ,aACE,6CAEA,UACE,mDAGF,yBACE,6CAGF,mBACE,sBAIJ,oBACE,kCAEA,QACE,4CAIA,oBACA,0CAGF,kBACE,0CAGF,aACE,6BAIJ,wBACE,2BAGF,yBACE,cACA,SACA,WACA,YACA,oBACA,CADA,8BACA,CADA,gBACA,sBACA,wBACA,YAGF,aACE,cZpmGgB,6BYsmGhB,SACA,kBACA,kBACA,oBACA,SACA,aACA,sBACA,WACA,WACA,qBACA,kBAEA,kBACE,WAIJ,+BACE,yBAGF,iBACE,eACA,gBACA,cZ9nGgB,mBAjBQ,eYkpGxB,aACA,cACA,sBACA,mBACA,uBACA,aACA,qEAGE,aAEE,WACA,aACA,SACA,yCAIJ,gBACE,gCAGF,eACE,uCAEA,aACE,mBACA,cZ5pGY,qCYgqGd,cACE,gBACA,yBAKN,iBACE,cACA,UACA,gCAEA,sCACE,uCAEA,aACE,WACA,kBACA,aACA,OACA,QACA,cACA,UACA,oBACA,YACA,UACA,kFACA,wCAIJ,SACE,kBACA,gBAIJ,YACE,eACA,mBACA,cACA,eACA,kBACA,UACA,UACA,gBACA,2BACA,4BACA,uBAEA,QACE,SACA,yBACA,cACA,uBACA,aACA,gBACA,uBACA,gBACA,mBACA,OACA,4CAGF,aZpuGmB,4CYyuGjB,aZzuGiB,yCY2uGf,4CAIJ,SAEE,yBAIJ,WACE,aACA,uBAGF,kBACE,iCAGF,iBACE,wBAGF,kBACE,SACA,cZnxGmB,eYqxGnB,eACA,eACA,8BAEA,aACE,CAKA,kEAEA,UZpyGI,mBYsyGF,6BAKN,eACE,gBACA,gBACA,cZ3yGmB,0DY6yGnB,UACA,UACA,kBACA,uCAEA,YACE,WACA,uCAGF,iBACE,gCAGF,QACE,uBACA,SACA,6BACA,cACA,mCAIJ,kBACE,aACA,mCAIA,aZ10GmB,0BY40GjB,gCAIJ,WACE,4DAEA,cACE,uEAEA,eACE,WAKN,oBACE,UACA,oBACA,kBACA,cACA,SACA,uBACA,eACA,sBAGF,oBACE,iBACA,oBAGF,aZz1GkB,eY21GhB,gBACA,yBACA,iBACA,kBACA,QACA,SACA,+BACA,yBAEA,aACE,WACA,CACA,0BACA,oBACA,mBACA,4BAIJ,iBACE,QACA,SACA,+BACA,WACA,YACA,sBACA,6BACA,CACA,wBACA,kBACA,2CAGF,2EACE,CADF,mEACE,8CAGF,4EACE,CADF,oEACE,qCAGF,GACE,sBACE,KAGF,2BACE,KAGF,2BACE,KAGF,yBACE,IAGF,wBACE,EArBF,4BAGF,GACE,sBACE,KAGF,2BACE,KAGF,2BACE,KAGF,yBACE,IAGF,wBACE,uCAIJ,GACE,wBACE,KAGF,0BACE,KAGF,2BACE,KAGF,uBACE,IAGF,sBACE,EAtBA,6BAIJ,GACE,wBACE,KAGF,0BACE,KAGF,2BACE,KAGF,uBACE,IAGF,sBACE,mCAIJ,GACE,OACE,SACA,yBACA,KAGF,wBACE,KAGF,UACE,YACA,6BACA,kBACA,UACA,IAGF,UACE,YACA,eACA,UACA,6BACA,EA5BA,yBAIJ,GACE,OACE,SACA,yBACA,KAGF,wBACE,KAGF,UACE,YACA,6BACA,kBACA,UACA,IAGF,UACE,YACA,eACA,UACA,6BACA,kCAIJ,GACE,gBACA,aACA,aAPE,wBAIJ,GACE,gBACA,aACA,gCAGF,kBACE,gBZx+GM,WADA,eY4+GN,aACA,sBACA,YACA,uBACA,eACA,kBACA,kBACA,YACA,gBAGF,eZt/GQ,cAEa,SYu/GnB,UACA,WACA,YACA,kBACA,wBACA,CADA,oBACA,CADA,eACA,iEAEA,SAGE,cACA,yBAIJ,aACE,eACA,yBAGF,aACE,eACA,gBACA,iBAGF,KACE,OACA,WACA,YACA,kBACA,YACA,2BAEA,aACE,SACA,QACA,WACA,YACA,6BAGF,mBACE,yBAGF,YACE,0BAGF,aACE,uBACA,WACA,YACA,SACA,iCAEA,oBACE,8BACA,kBACA,iBACA,WZvjHE,gBYyjHF,eACA,+LAMA,6BACE,mEAKF,6BACE,6BAMR,kBACE,iBAGF,kBACE,6BACA,gCACA,aACA,mBACA,eACA,kDAGF,aAEE,kBACA,yBAGF,kBACE,aACA,2BAGF,aZlmHqB,eYomHnB,cACA,gBACA,mBACA,kDAIA,kBACE,oDAIA,SEtmHF,sBACA,WACA,SACA,gBACA,oBACA,mBdbwB,cAFL,eckBnB,SACA,+EFgmHI,aACE,CEjmHN,qEFgmHI,aACE,CEjmHN,yEFgmHI,aACE,CEjmHN,gEFgmHI,aACE,sEAGF,QACE,yLAGF,mBAGE,0DAGF,kBACE,qCAGF,mDArBF,cAsBI,yDAIJ,aZvnHc,iBYynHZ,eACA,4DAGF,gBACE,wDAGF,kBACE,gEAEA,cACE,iNAEA,kBAGE,cACA,gHAKN,aZnqHiB,0HYwqHjB,cAEE,gBACA,cZxpHY,kZY2pHZ,aAGE,gEAIJ,wBACE,iDAGF,eL3rHI,kBO0BN,CAEA,eACA,cdHiB,uCcKjB,UF8pHI,mBZ3rHe,oDc+BnB,wBACE,cdRe,ecUf,gBACA,mBACA,oDAGF,aACE,oDAGF,kBACE,oDAGF,eACE,WdnDI,sDYksHJ,WACE,mDAGF,UZtsHI,kBYwsHF,eACA,8HAEA,kBAEE,iCAON,kBACE,mBAIJ,UZztHQ,kBY2tHN,cACA,mBACA,sBZ5tHM,yBY8tHN,eACA,gBACA,YACA,kBACA,WACA,yBAEA,SACE,iBAIJ,aACE,iBACA,wBAGF,aZ7uHqB,qBY+uHnB,mBACA,gBACA,sBACA,6EAGF,aZluHkB,mBAjBQ,kBYwvHxB,aACA,eACA,gBACA,eACA,aACA,cACA,mBACA,uBACA,yBAEA,4EAfF,cAgBI,6FAGF,eACE,mFAGF,aZ7vHmB,qBY+vHjB,qGAEA,yBACE,uCAKN,kBACE,aACA,eAGF,qBACE,8BAGF,GACE,kBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,oBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,kBACE,2CACA,CADA,kCACA,EA1BF,qBAGF,GACE,kBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,oBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,kBACE,2CACA,CADA,kCACA,mCAIJ,8BACE,2DACA,CADA,kDACA,iCAGF,MACE,sBAEE,0BACA,KAGF,sBACE,aAGF,uBAGE,aAGF,sBAGE,KAGF,uBACE,KAGF,sBACE,EA/BF,wBAGF,MACE,sBAEE,0BACA,KAGF,sBACE,aAGF,uBAGE,aAGF,sBAGE,KAGF,uBACE,KAGF,sBACE,kCAIJ,yBACE,8EACA,CADA,qEACA,8BAGF,eLt2HQ,kBKw2HN,sCACA,kBACA,eACA,UACA,iDAEA,2BACE,2DAGF,UACE,mCAIJ,iBACE,SACA,WACA,eACA,yCAGF,iBACE,UACA,SACA,UACA,gBLl4HM,kBKo4HN,sCACA,gBACA,gDAEA,aACE,eACA,SACA,gBACA,uBACA,iKAEA,4BAGE,2DAIJ,WACE,wBAKF,2BACE,cAIJ,kBACE,8BACA,aACA,YACA,uBACA,OACA,UACA,kBACA,MACA,kBACA,WACA,aACA,gBAEA,mBACE,oBAIJ,WACE,aACA,aACA,sBACA,kBACA,YACA,0BAGF,iBACE,MACA,QACA,SACA,OACA,WACA,kBACA,mBZh8HwB,kCYk8HxB,uBAGF,MACE,aACA,mBACA,uBACA,cZ38HmB,eY68HnB,gBACA,0BACA,kBACA,kBAGF,YACE,cZp9HmB,gBYs9HnB,aACA,sBAEA,cACE,kBACA,uBAGF,cACE,yBACA,gBACA,cACA,0BAIJ,aACE,4BAGF,UACE,WACA,kBACA,mBZj+HsB,kBYm+HtB,eACA,2BAGF,iBACE,OACA,MACA,WACA,mBZx+HmB,kBY0+HnB,eAGF,aACE,wBACA,UACA,eACA,0CAEA,mBAEE,mBAGF,8BACE,CADF,sBACE,WACA,cACA,SACA,WACA,YACA,CAQE,6GAKN,SACE,oBACA,CADA,WACA,6BAGF,iBACE,gBLliIM,uCKoiIN,kBACA,iBACA,gBACA,iCAEA,yBACE,oCAGF,sBACE,2BAIJ,UZnjIQ,aYqjIN,eACA,aACA,kEAEA,kBZviImB,WAlBb,UY6jIJ,CZ7jII,4RYkkIF,UZlkIE,wCYwkIN,kBACE,iCAIJ,YACE,mBACA,uBACA,kBACA,oCAGF,aACE,cZllImB,2CYqlInB,eACE,cACA,WZ1lII,CY+lIA,wQADF,eACE,mDAON,eLrmIM,0BKumIJ,qCACA,gEAEA,eACE,0DAGF,kBZ7lIiB,uEYgmIf,UZlnIE,uDYwnIN,yBACE,sDAGF,aACE,sCACA,SAIJ,iBACE,gBAGF,SEznIE,sBACA,WACA,SACA,gBACA,oBACA,mBdbwB,cAFL,eckBnB,SACA,cFmnIA,CACA,2BACA,iBACA,eACA,2CAEA,aACE,CAHF,iCAEA,aACE,CAHF,qCAEA,aACE,CAHF,4BAEA,aACE,kCAGF,QACE,6EAGF,mBAGE,sBAGF,kBACE,qCAGF,eA3BF,cA4BI,kCAKF,QACE,qDAGF,mBAEE,mBAGF,iBACE,SACA,WACA,UACA,qBACA,UACA,0BACA,sCACA,eACA,WACA,YACA,cZxrIiB,eY0rIjB,oBACA,0BAEA,mBACE,WACA,0BAIJ,uBACE,iCAEA,mBACE,uBACA,gCAIJ,QACE,uBACA,cZ1rIkB,eY4rIlB,uCAEA,uBACE,sCAGF,aACE,yBAKN,aZzsIkB,mBY2sIhB,aACA,gBACA,eACA,eACA,6BAEA,oBACE,iBACA,0BAIJ,iBACE,6BAEA,kBACE,gCACA,eACA,aACA,aACA,gBACA,eACA,cZjuIc,iCYouId,oBACE,iBACA,8FAIJ,eAEE,0BAIJ,aACE,aACA,cZrwImB,qBYuwInB,+FAEA,aAGE,0BACA,uBAIJ,YACE,cZlxImB,kBYoxInB,aAGF,iBACE,8BACA,oBACA,aACA,sBAGF,cACE,MACA,OACA,QACA,SACA,8BACA,wBAGF,cACE,MACA,OACA,WACA,YACA,aACA,sBACA,mBACA,uBACA,2BACA,aACA,oBACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,oBAGF,mBACE,aACA,aACA,yBAGF,eACE,iBACA,yBAGF,UACE,cAGF,UACE,YACA,kBACA,qCAEA,UACE,YACA,aACA,mBACA,uBACA,2CAEA,cLjyI0B,eAEC,CK2yI7B,8CALF,iBACE,MACA,OACA,QACA,SAYA,CAXA,yBAQA,mBACA,8BACA,oBACA,4BAEA,mBACE,0DAGF,SACE,4DAEA,mBACE,mBAKN,6BACE,sBACA,SACA,WZ93IM,eYg4IN,aACA,mBACA,eACA,cACA,cACA,kBACA,kBACA,MACA,SACA,yBAGF,MACE,0BAGF,OACE,CASA,4CANF,UACE,kBACA,kBACA,OACA,YACA,oBAUA,6BAEA,WACE,sBAGF,mBACE,qBACA,gBACA,cZz6IiB,mFY46IjB,yBAGE,wBAKN,oBACE,sBAGF,qBZ37IQ,YY67IN,WACA,kBACA,YACA,UACA,SACA,YACA,8BAGF,wBZp7IqB,qBYw7IrB,iBACE,UACA,QACA,YACA,6CAGF,kBZ98IqB,WAHb,kBYs9IN,gBACA,aACA,sBACA,oBAGF,WACE,WACA,gBACA,iBACA,kBACA,wBAEA,iBACE,MACA,OACA,WACA,YACA,sBACA,aACA,aACA,CAGA,YACA,UACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,2CANA,qBACA,mBACA,uBAaF,CATE,mBAIJ,YACE,CAGA,iBACA,mDAGF,aAEE,mBACA,aACA,aACA,2DAEA,cACE,uLAGF,aZrgJmB,SYwgJjB,eACA,gBACA,kBACA,oBACA,YACA,aACA,kBACA,6BACA,+mBAEA,aAGE,yBACA,CZzhJE,wyEYgiJF,UAGE,sBAMR,sBACE,eAGF,iBACE,eACA,mBACA,sBAEA,eACE,WZnjJI,kBYqjJJ,yBACA,eACA,qBAGF,kBZrjJwB,cAFL,gBY0jJjB,aACA,kBACA,kBAIJ,oBACE,eACA,gBACA,iBACA,wFAGF,kBAME,WZhlJM,kBYklJN,gBACA,eACA,YACA,kBACA,sBACA,4NAEA,aACE,eACA,mBACA,wLAGF,WACE,UACA,kBACA,SACA,WACA,kRAGF,aACE,wBAKF,eL5mJM,CPEa,gBY6mJjB,oBACA,iELhnJI,2BPEa,yBYsnJrB,iBACE,aACA,iCAEA,wBACE,CADF,qBACE,CADF,oBACE,CADF,gBACE,gBACA,2GAIJ,YAIE,8BACA,mBZroJmB,aYuoJnB,iBACA,2HAEA,aACE,iBACA,cZ5oJiB,mBY8oJjB,2IAGF,aACE,6BAIJ,cACE,2BAGF,WACE,eACA,0BAGF,gBAEE,sDAGF,qBAEE,eAGF,UACE,gBACA,0BAGF,YACE,6BACA,qCAEA,yBAJF,cAKI,gBACA,iDAIJ,qBAEE,UACA,qCAEA,+CALF,UAMI,sDAIJ,aAEE,gBACA,gBACA,gBACA,kBACA,2FAEA,aZ3rJmB,iLY+rJnB,UZjtJM,qCYstJN,oDAjBF,eAkBI,sCAKF,4BADF,eAEI,yBAIJ,YACE,+BACA,gBACA,0BAEA,cACE,iBACA,mBACA,sCAGF,aACE,sBACA,WACA,CACA,UZhvJI,gBOCA,aKkvJJ,oBACA,eACA,YACA,CACA,SACA,kBACA,yBACA,iBACA,gBACA,gBACA,4CAEA,wBACE,+CAGF,eLlwJI,yBKowJF,mBACA,kBACA,6DAEA,QACE,gBACA,gBACA,mEAEA,QACE,0DAIJ,UZnxJE,oBYqxJA,eACA,gBLrxJA,+CK0xJJ,YACE,8BACA,mBACA,4CAIJ,aACE,WZnyJI,eYqyJJ,gBACA,mBACA,wCAGF,eACE,mBACA,+CAEA,UZ9yJI,eYgzJF,qCAIJ,uBAnFF,YAoFI,eACA,QACA,wCAEA,iBACE,iBAKN,eACE,eACA,wBAEA,eACE,iBACA,2CAGF,eACE,mBAGF,eACE,cACA,gBACA,+BAEA,4BACE,4BAGF,QACE,oCAIA,UZ11JE,aY41JA,kBACA,eACA,mBACA,qBACA,8EAEA,eAEE,yWAOA,kBZz1JW,WAlBb,uDYk3JA,iBACE,oMAUR,aACE,iIAIJ,4BAIE,cZn4JmB,eYq4JnB,gBACA,6cAEA,aAGE,6BACA,qGAIJ,YAIE,eACA,iIAEA,eACE,CAII,w1BADF,eACE,sDAMR,iBAEE,oDAKA,eACE,0DAGF,eACE,mBACA,aACA,mBACA,wEAEA,UZt7JI,CYw7JF,gBACA,uBAKN,YACE,2CAEA,QACE,WACA,cAIJ,wBZr7JqB,WYu7JnB,kBACA,MACA,OACA,aACA,6BAGF,aACE,kBACA,WZl9JM,8BYo9JN,WACA,SACA,gBACA,kBACA,eACA,gBACA,UACA,oBACA,WACA,4BACA,iBACA,wDAKE,SACE,uBAKN,eACE,6BAEA,UACE,kBAIJ,YACE,eACA,yBACA,kBACA,gBACA,gBACA,wBAEA,aACE,cZr+Jc,iBYu+Jd,eACA,+BACA,aACA,sBACA,mBACA,uBACA,eACA,4BAEA,aACE,wBAIJ,eACE,CACA,qBACA,aACA,sBACA,uBACA,2BAEA,aACE,cACA,0BAGF,oBACE,cZngKY,gBYqgKZ,gCAEA,yBACE,0BAKN,QACE,eACA,iDAEA,SACE,cACA,8BAGF,aZthKc,gBY8hKhB,cACA,CACA,iBACA,CACA,UACA,qCANF,qBACE,CACA,eACA,CACA,iBAYA,CAVA,qBAGF,QACE,CACA,aACA,WACA,CACA,iBAEA,qEAGE,cACE,MACA,gCAKN,cACE,cACA,qBACA,cZ7kKmB,kBY+kKnB,UACA,mEAEA,WAEE,WACA,CAIA,2DADF,mBACE,CADF,8BACE,CADF,gBZ1lKM,CY2lKJ,wBAIJ,UACE,YACA,CACA,iBACA,MACA,OACA,UACA,gBZtmKM,iCYymKN,YACE,sBAIJ,WACE,gBACA,kBACA,WACA,qCAGF,cACE,YACA,oBACA,CADA,8BACA,CADA,gBACA,kBACA,QACA,2BACA,WACA,UACA,sCAGF,0BACE,2BACA,gBACA,kBACA,qKAMA,WAEE,mFAGF,WACE,eAKJ,qBACE,kBACA,mBACA,kBACA,oBACA,cACA,wBAEA,eACE,YACA,yBAGF,cACE,kBACA,gBACA,gCAEA,UACE,cACA,kBACA,6BACA,WACA,SACA,OACA,oBACA,qCAIJ,oCACE,iCAGF,wBACE,uCAIA,mBACA,mBACA,6BACA,0BACA,eAIJ,eACE,kBACA,gBLvsKM,eKysKN,kBACA,sBACA,cACA,wBAEA,eACE,sBACA,qBAGF,SACE,qBAGF,eACE,gBACA,UACA,0BAGF,oBACE,sBACA,SACA,gCAEA,wBACE,0BACA,qBACA,sBACA,UACA,4BAKF,qBACE,CADF,gCACE,CADF,kBACE,kBACA,QACA,2BACA,yBAIJ,iBACE,UACA,SACA,OACA,QACA,sBACA,iFACA,eACA,UACA,4BACA,gCAEA,SACE,6EAKF,iBAEE,wBAIJ,YACE,kBACA,MACA,OACA,WACA,YACA,UACA,SACA,gBZnxKI,cAEa,gBYoxKjB,oBACA,+BAEA,aACE,oBACA,8GAEA,aAGE,+BAIJ,aACE,eACA,kCAGF,aACE,eACA,gBACA,4BAIJ,YACE,8BACA,oBACA,0DAEA,aACE,wBAIJ,cACE,mBACA,gBACA,uBACA,oCAGE,cACE,qCAKF,eACE,+BAIJ,sBACE,iBACA,eACA,SACA,0BACA,8GAEA,ULn1KE,+EK21KN,cAGE,gBACA,6BAGF,ULl2KM,iBKo2KJ,yBAGF,oBACE,aACA,mDAGF,UL52KM,uBKi3KN,cACE,YACA,eACA,8BAEA,UACE,WACA,+BAOA,6DANA,iBACA,cACA,kBACA,WACA,UACA,YAWA,CAVA,+BASA,kBACA,+BAGF,iBACE,UACA,kBACA,WACA,YACA,YACA,UACA,4BACA,mBACA,sCACA,oBACA,qBAIJ,gBACE,uBAEA,oBACE,eACA,gBACA,WLj6KE,sFKo6KF,yBAGE,qBAKN,cACE,YACA,kBACA,4BAEA,UACE,WACA,+BACA,kBACA,cACA,kBACA,WACA,SACA,2DAGF,aAEE,kBACA,WACA,kBACA,SACA,mBACA,6BAGF,6BACE,6BAGF,iBACE,UACA,UACA,kBACA,WACA,YACA,QACA,iBACA,4BACA,mBACA,sCACA,oBACA,CAGE,yFAKF,SACE,6GAQF,gBACE,oBACA,kBAON,UACE,cACA,+BACA,0BAEA,UACE,qCAGF,iBATF,QAUI,mBAIJ,qBACE,mBACA,uBAEA,YACE,kBACA,gBACA,gBACA,2BAEA,aACE,WACA,YACA,SACA,oBACA,CADA,8BACA,CADA,gBACA,uBAIJ,YACE,mBACA,mBACA,aACA,6BAEA,aACE,aACA,mBACA,qBACA,gBACA,qCAGF,UACE,eACA,cACA,+BAGF,aACE,WACA,YACA,gBACA,mCAEA,UACE,YACA,cACA,SACA,kBACA,mBACA,oBACA,CADA,8BACA,CADA,gBACA,qCAIJ,gBACE,gBACA,4CAEA,cACE,WZ5jLF,gBY8jLE,gBACA,uBACA,0CAGF,aACE,eACA,cZlkLW,gBYokLX,gBACA,uBACA,yBAKN,kBZzkLsB,aY2kLpB,mBACA,uBACA,gDAEA,YACE,cACA,eACA,mDAGF,qBACE,kBACA,gCACA,WACA,gBACA,mBACA,gBACA,uBACA,qDAEA,YACE,iEAEA,cACE,sDAIJ,YACE,6BAOV,YACE,eACA,gBACA,wBAGF,QACE,sBACA,cACA,kBACA,kBACA,gBACA,WACA,+BAEA,iBACE,QACA,SACA,+BACA,eACA,sDAIJ,kBAEE,gCACA,eACA,aACA,cACA,oEAEA,kBACE,SACA,SACA,6HAGF,aAEE,cACA,cZ1pLiB,eY4pLjB,eACA,gBACA,kBACA,qBACA,kBACA,WACA,mBACA,yJAEA,aZrqLiB,qWYwqLf,aAEE,WACA,kBACA,SACA,SACA,QACA,SACA,2BACA,CAEA,4CACA,CADA,kBACA,CADA,wBACA,iLAGF,WACE,6CACA,8GAKN,kBACE,gCACA,qSAKI,YACE,iSAGF,4CACE,cAOV,kBZ/sL0B,sBYktLxB,iBACE,4BAGF,aACE,eAIJ,cACE,kBACA,qBACA,cACA,iBACA,eACA,mBACA,gBACA,uBACA,eACA,oEAEA,YAEE,sBAGF,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,8BAEA,oBACE,mBACA,2BAKN,eACE,gBAGF,eLxwLQ,kBO0BN,CACA,sBACA,gBACA,cdHiB,uCcKjB,mBAEA,wBACE,cdRe,ecUf,gBACA,mBACA,mBAGF,aACE,mBAGF,kBACE,mBAGF,eACE,WdnDI,UY6wLR,iBACE,cAEA,WACE,WACA,sCACA,CADA,6BACA,cAGF,cACE,iBACA,cZrxLiB,gBYuxLjB,gBAEA,aZ1wLiB,0BY4wLf,sBAEA,oBACE,4BAMR,GACE,cACA,eACA,WATM,mBAMR,GACE,cACA,eACA,qEAGF,kBAIE,sBAEE,8BACA,iBAGF,0BACE,kCACA,+BAIA,qDACE,uEACA,+CAGF,sBACE,8BACA,6DAIA,6BACE,6CACA,4EAIF,6BACE,6CACA,+CAOJ,gBAEE,+BAGF,gBACE,6CAEA,0BACE,wDAGF,eACE,6DAGF,iBACE,iBACA,2EAIA,mBACE,UACA,gCACA,WACA,0FAGF,mBACE,UACA,oCACA,eAOV,UACE,eACA,gBACA,iBAEA,YACE,gBACA,eACA,kBACA,sCAGF,YACE,4CAEA,kBACE,yDAGF,SACE,sBACA,cACA,WACA,SACA,aACA,gDACA,mBZn5LoB,WALlB,eY25LF,CACA,eACA,kBACA,2EAEA,QACE,wMAGF,mBAGE,+DAGF,kBACE,qCAGF,wDA7BF,cA8BI,4DAIJ,WACE,eACA,gBACA,SACA,kBACA,sBAMJ,sBACA,mBACA,6BACA,gCACA,+BAEA,iBACE,iBACA,cZh7Lc,CYm7Ld,eACA,eACA,oCAEA,aACE,gBACA,uBACA,oCAIJ,UACE,kBACA,uDAGF,iBACE,qDAGF,eACE,qBAKF,wBACA,aACA,2BACA,mBACA,mBACA,2BAEA,aACE,iCAEA,UACE,uCAEA,SACE,kCAKN,aACE,cACA,mBAIJ,cACE,kBACA,MACA,OACA,WACA,YACA,8BACA,cAGF,kBZjgM0B,sBYmgMxB,kBACA,uCACA,YACA,gBACA,qCAEA,aARF,SASI,kBAGF,cACE,mBACA,gBACA,eACA,kBACA,0BACA,6BAGF,WACE,6BAGF,yBACE,sCAEA,uBACE,uCACA,wBACA,wBAIJ,eACE,kDAIA,oBACE,+BAIJ,cACE,sBAGF,eACE,aAIJ,kBZvjM0B,sBYyjMxB,kBACA,uCACA,YACA,gBACA,qCAEA,YARF,SASI,uBAGF,kBACE,oBAGF,kBACE,YACA,0BACA,gBACA,mBAGF,YACE,gCACA,4BAGF,YACE,iCAGF,aACE,gBACA,qBACA,eACA,aACA,cAIJ,iBACE,YACA,gBACA,YACA,aACA,uBACA,mBACA,gBL5mMM,yDK+mMN,aAGE,gBACA,WACA,YACA,SACA,sBACA,CADA,gCACA,CADA,kBACA,gBLvnMI,uBK2nMN,iBACE,YACA,aACA,+BACA,iEACA,kBACA,wCACA,uBAGF,iBACE,WACA,YACA,MACA,OACA,uBAGF,iBACE,YACA,WACA,UACA,YACA,4BACA,6BAEA,UACE,8BAGF,UZzpMI,eY2pMF,gBACA,cACA,kBACA,2BAGF,iBACE,mCACA,qCAIJ,oCACE,eAEE,uBAGF,YACE,4BAKN,aZhrMqB,eYkrMnB,gBACA,gBACA,kBACA,qBACA,6BAEA,kBACE,wCAEA,eACE,6BAIJ,aACE,0BACA,mCAEA,oBACE,kBAKN,eACE,2BAEA,UACE,8FAEA,8BAEE,CAFF,sBAEE,wBAIJ,iBACE,SACA,UACA,yBAGF,eACE,aACA,kBACA,mBACA,6BAEA,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,uBAIJ,iBACE,mBACA,YACA,gCACA,+BAEA,aACE,cACA,WACA,iBACA,gDAEA,kBACE,yBACA,wBAKN,YACE,uBACA,gBACA,iBACA,iCAEA,YACE,mBACA,iBACA,gBACA,8CAEA,wBACE,kBACA,uBACA,YACA,yCAGF,YACE,8BAIJ,WACE,4CAEA,kBACE,wCAGF,UACE,YACA,iCAGF,cACE,iBACA,WZvyMA,gBYyyMA,gBACA,mBACA,uBACA,uCAEA,aACE,eACA,cZ7yMW,gBY+yMX,gBACA,uBACA,gCAKN,aACE,uBAIJ,eACE,cACA,iDAGE,qBACA,WZp0ME,gDYw0MJ,QACE,6BACA,kDAEA,aACE,yEAGF,uBACE,4DAGF,aZ30MU,yBYi1Md,cACE,gCAEA,cACE,cZ31Me,eY61Mf,kCAEA,oBACE,cZh2Ma,qBYk2Mb,iBACA,gBACA,yCAEA,eACE,WZ12MF,iBYm3MN,aZ71MgB,mBY+1Md,gCACA,gBACA,aACA,eACA,eACA,qBAEA,oBACE,iBACA,eAIJ,YACE,mBACA,aACA,gCACA,0BAEA,eACE,qBAGF,aACE,cZv3MY,gBYy3MZ,uBACA,mBACA,4BAEA,eACE,uBAGF,aZp5Me,qBYs5Mb,eACA,gBACA,cACA,gBACA,uBACA,mBACA,qGAKE,yBACE,wBAMR,aACE,eACA,iBACA,gBACA,iBACA,mBACA,gBACA,cZ/6Me,0BYm7MjB,aACE,WACA,2CAEA,mCACE,yBACA,0CAGF,wBACE,eAMR,YACE,gCACA,CACA,iBACA,qBAEA,kBACE,UACA,uBAGF,aACE,CACA,sBACA,kBACA,eACA,uBAGF,oBACE,mBZx8MiB,kBY08MjB,cACA,eACA,wBACA,wBAGF,aACE,CACA,0BACA,gBACA,8BAEA,eACE,aACA,2BACA,8BACA,uCAGF,cACE,cZ7+Me,kBY++Mf,+BAGF,aZl/MiB,eYo/Mf,mBACA,gBACA,uBACA,kBACA,gBACA,YACA,iCAEA,UZ//ME,qBYigNA,oHAEA,yBAGE,0BAKN,qBACE,uBAIJ,kBACE,6BAEA,kBACE,oDAGF,eACE,6DAGF,UZ3hNI,gBYiiNR,kBACE,eACA,aACA,qBACA,0BAEA,WACE,cACA,qCAEA,yBAJF,YAKI,4BAIJ,wBACE,cACA,kBACA,qCAEA,0BALF,UAMI,uBAIJ,qBACE,WACA,aACA,kBACA,eACA,iBACA,qBACA,gBACA,gBACA,gBACA,aACA,sBACA,6BAEA,aACE,gBACA,mBACA,mBACA,8BAGF,iBACE,SACA,WACA,cACA,mBZjkNe,kBYmkNf,cACA,eACA,4BAIJ,YACE,cZzlNiB,kBY2lNjB,WACA,QACA,mDAIJ,YACE,oDAGF,UACE,gBAGF,YACE,eACA,mBACA,gBACA,iBACA,wBACA,sBAEA,aACE,mBACA,SACA,kBACA,WACA,eACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,cACA,aACA,mBACA,2BACA,2CACA,6BAEA,aACE,aACA,WACA,YACA,iCAEA,aACE,SACA,WACA,YACA,eACA,gBACA,sBACA,sBACA,CADA,gCACA,CADA,kBACA,6BAIJ,aACE,cACA,eACA,gBACA,kBACA,gBACA,cZvpNe,mFY2pNjB,kBAGE,4BACA,2CACA,wGAEA,aACE,6BAIJ,0BACE,2CACA,yBACA,yDAEA,aACE,uCAKN,UACE,oCAGF,WACE,8BAGF,aZ1rNmB,SY4rNjB,eACA,WACA,cACA,cACA,YACA,aACA,mBACA,WACA,2BACA,2CACA,2GAEA,SAGE,cACA,4BACA,2CACA,qCAKF,SACE,OGxtNN,eACE,eACA,UAEA,kBACE,kBACA,cAGF,iBACE,cACA,mBACA,WACA,aACA,sBAEA,kBfGiB,eeEnB,iBACE,aACA,cACA,iBACA,eACA,gBACA,qBAEA,oBACE,qBACA,yBACA,4BACA,oEAGF,YAEE,kCAGF,aACE,gCAGF,aACE,sBACA,WACA,eACA,WfhDE,UekDF,oBACA,gBRlDE,sBQoDF,kBACA,iBACA,sCAEA,oBfvCe,0Be4CjB,cACE,wBAGF,YACE,mBACA,iBACA,cAIJ,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,gBACA,mBACA,cACA,uBAEA,iBACE,qBAGF,oBfpFY,8EeyFZ,oBAGE,iBACA,gCAGF,mBACE,SACA,wCAGF,mBAEE,eAIJ,oBACE,WACA,gBACA,cACA,cAGF,aACE,qBACA,oBAEA,cACE,eAIJ,eACE,mBACA,cfhHc,aeoHhB,cACE,uBACA,UACA,SACA,SACA,cfzHc,0Be2Hd,kBACA,mBAEA,oBACE,sCAGF,kCAEE,eAIJ,WACE,eACA,kBACA,eACA,6BAIJ,yBACE,gCAEA,YACE,2CAGF,yBACE,aACA,aACA,mBACA,mGAEA,YAEE,+GAEA,oBfrKe,sDe2KnB,cACE,gBACA,iBACA,YACA,oBACA,cf3KkB,sCe8KlB,gCAGF,YACE,mBACA,8CAEA,aACE,wBACA,iBACA,oCAIJ,uBACE,CADF,oBACE,CADF,eACE,sBACA,eACA,WftNI,qBewNJ,WACA,UACA,oBACA,qXACA,sBACA,kBACA,CACA,yBACA,mDAGF,UACE,cAIJ,aflNkB,qBeqNhB,+BACE,6BAEA,8BACE,eChPN,k1BACE,aACA,sBACA,aACA,UACA,yBAGF,YACE,OACA,sBACA,yBACA,2BAEA,MACE,iBACA,qCAIJ,gBACE,YACE,cCtBJ,cACE,qBACA,WjBDM,2BiBIN,qBAEE,iBACA,+BAGF,WACE,iBAIJ,sBACE,6BAEA,uBACE,2BACA,4BACA,mBjBlBiB,4BiBsBnB,oBACE,8BACA,+BACA,aACA,qBAIJ,YACE,8BACA,cACA,cjBjCmB,ciBmCnB,oBAGF,iBACE,OACA,kBACA,iBACA,gBACA,8BACA,eACA,0BAEA,aACE,6BAIJ,ajBrCqB,mCiBwCnB,aACE,oDAGF,WACE,wBAIJ,iBACE,YACA,OACA,WACA,WACA,yBjBtDmB,uBiB2DnB,oBACE,WACA,eACA,yBAGF,iBACE,gBACA,oBAIJ,iBACE,aACA,gBACA,kBACA,gBV5FM,sBU8FN,sGAEA,mCAEE,oBAKF,2BACA,gBVxGM,0BU2GN,cACE,gBACA,gBACA,oBACA,cACA,WACA,6BACA,WjBnHI,yBiBqHJ,kBACA,4CAEA,QACE,2GAGF,mBAGE,wCAKN,cACE,6CAEA,SACE,kBACA,kBACA,qDAGF,SACE,WACA,kBACA,MACA,OACA,WACA,YACA,mCACA,mBACA,4BAIJ,SACE,kBACA,wBACA,gBACA,MACA,iCAEA,aACE,WACA,gBACA,gBACA,gBVpKI,mBUyKR,iBACE,qBACA,YACA,wBAEA,UACE,YACA,wBAIJ,cACE,kBACA,iBACA,cjB7JiB,mDiBgKjB,YACE,qDAGF,eACE,uDAGF,YACE,qBAIJ,YACE,YCrMF,qBACE,iBANc,cAQd,kBACA,sCAEA,WANF,UAOI,eACA,mBAIJ,iDACE,eACA,gBACA,gBACA,qBACA,clBlBmB,oBkBqBnB,alBNmB,0BkBQjB,6EAEA,oBAGE,wCAIJ,alBhCmB,oBkBqCnB,YACE,oBACA,+BAEA,eACE,yBAIJ,eACE,clB/CiB,qBkBmDnB,iBACE,clBpDiB,uBkBwDnB,eACE,mBACA,kBACA,kBACA,yHAGF,4CAME,mBACA,oBACA,gBACA,clBxEiB,qBkB4EnB,aACE,qBAGF,gBACE,qBAGF,eACE,qBAGF,gBACE,yCAGF,aAEE,qBAGF,eACE,qBAGF,kBACE,yCAMA,iBACA,iBACA,yDAEA,2BACE,yDAGF,2BACE,qBAIJ,UACE,SACA,SACA,gCACA,eACA,4BAEA,UACE,SACA,wBAIJ,UACE,yBACA,8BACA,CADA,iBACA,gBACA,mBACA,iEAEA,+BAEE,cACA,kBACA,gBACA,gBACA,clBnJe,iCkBuJjB,uBACE,gBACA,gBACA,clBvIY,qDkB2Id,WAEE,iBACA,kBACA,qBACA,mEAEA,SACE,kBACA,iFAEA,gBACE,kBACA,6EAGF,iBACE,SACA,UACA,mBACA,gBACA,uBACA,+BAMR,YACE,oBAIJ,kBACE,eACA,mCAEA,iBACE,oBACA,8BAGF,YACE,8BACA,eACA,6BAGF,UACE,kDACA,eACA,iBACA,WlBrNI,iBkBuNJ,kBACA,qEAEA,aAEE,6CAIA,alB7Ne,oCkBkOjB,4CACE,gBACA,eACA,iBACA,qCAGF,4BA3BF,iBA4BI,4BAIJ,iBACE,YACA,sBACA,mBACA,CACA,sBACA,0BACA,QACA,aACA,yCAEA,4CACE,eACA,iBACA,gBACA,clB7Pe,mBkB+Pf,mBACA,gCACA,uBACA,mBACA,gBACA,wFAEA,eAEE,cACA,2CAGF,oBACE,2BAKN,iBACE,mCAEA,UACE,YACA,CACA,kBACA,uCAEA,aACE,WACA,YACA,mBACA,iCAIJ,cACE,mCAEA,aACE,WlB1SA,qBkB4SA,uDAGE,yBACE,2CAKN,aACE,clBnTa,kCkB2TnB,iDAEE,CACA,eACA,eACA,iBACA,mBACA,clBlUiB,sCkBqUjB,alBtTiB,0BkBwTf,kBAIJ,cACE,SACA,UACA,gBACA,uBACA,oBACA,kBACA,oBACA,cACA,kBAGF,4CACE,eACA,iBACA,gBACA,mBACA,clB5ViB,wBkB+VjB,iDACE,cACA,eACA,gBACA,cACA,kBAIJ,4CACE,eACA,iBACA,gBACA,mBACA,clB7WiB,kBkBkXjB,clBlXiB,mCkBiXnB,4CACE,CACA,gBACA,gBACA,mBACA,clBtXiB,kBkB2XjB,clB3XiB,kBkBoYjB,clBpYiB,mCkBmYnB,4CACE,CACA,gBACA,gBACA,mBACA,clBxYiB,kBkB6YjB,clB7YiB,mCkBqZnB,gBAEE,mDAEA,2BACE,mDAGF,2BACE,kBAIJ,eACE,kBAGF,kBACE,yCAGF,cAEE,kBAGF,UACE,SACA,SACA,6CACA,cACA,yBAEA,UACE,SACA,iDAIJ,YAEE,+BAGF,kBlB/bwB,kBkBictB,kBACA,gBACA,sBACA,oCAEA,UACE,aACA,2BACA,iBACA,8BACA,mBACA,uDAGF,YACE,yBACA,qBACA,mFAEA,aACE,eACA,qCAGF,sDAVF,UAWI,8BACA,6CAIJ,MACE,sBACA,qCAEA,2CAJF,YAKI,sBAKN,iBACE,yBAEA,WACE,WACA,uBACA,4BAIJ,iBACE,mBACA,uCAEA,eACE,mCAGF,eACE,cACA,qCAGF,eACE,UACA,mDAEA,kBACE,aACA,iBACA,0FAKE,oBACE,gFAIJ,cACE,qDAIJ,aACE,cACA,6CAGF,UACE,YACA,0BACA,mDAGF,cACE,4DAEA,cACE,qCAKN,oCACE,eACE,sCAIJ,2BA7DF,iBA8DI,mFAIJ,qBAGE,mBlBxjBsB,kBkB0jBtB,kCACA,uBAGF,YACE,kBACA,WACA,YACA,2BAEA,YACE,WACA,uCAKF,YACE,eACA,mBACA,mBACA,qCAGF,sCACE,kBACE,uCAIJ,alB1lBiB,qCkB8lBjB,eACE,WlBlmBE,gBkBomBF,ClBjmBe,yFkBsmBb,alBtmBa,+CkB4mBjB,eACE,qBAIJ,kBACE,yBAEA,aACE,SACA,eACA,YACA,kBACA,qCAIJ,gDAEI,kBACE,yCAGF,eACE,gBACA,WACA,kBACA,uDAEA,iBACE,sCAMR,8BACE,aACE,uCAEA,gBACE,sDAGF,kBACE,6EAIJ,aAEE,qBAIJ,WACE,UAIJ,mBACE,qCAEA,SAHF,eAII,kBAGF,YACE,uBACA,mBACA,aACA,qBAEA,SlBxrBI,YkB0rBF,qCAGF,gBAXF,SAYI,mBACA,sBAIJ,eACE,uBACA,gBACA,gBACA,uBAGF,eACE,gBACA,0BAEA,YACE,yBACA,gBACA,eACA,clB/sBe,6BkBmtBjB,eACE,iBACA,+BAGF,kBlBttBsB,akBwtBpB,0BACA,aACA,uCAEA,YACE,gCAIJ,cACE,gBACA,uDAEA,YACE,mBACA,iDAGF,UACE,YACA,0BACA,gCAIJ,YACE,uCAEA,4CACE,eACA,gBACA,cACA,qCAGF,cACE,clB9vBa,uFkBowBnB,eACE,cASA,ClB9wBiB,2CkB2wBjB,iBACA,CACA,kBACA,gBAGF,eACE,cACA,aACA,kDACA,cACA,qCAEA,eAPF,oCAQI,cACA,8BAEA,UACE,aACA,sBACA,0CAEA,OACE,cACA,2CAGF,YACE,mBACA,QACA,cACA,qCAIJ,UACE,2BAGF,eACE,sCAIJ,eAtCF,UAuCI,6BAEA,aACE,gBACA,gBACA,2GAEA,eAGE,uFAIJ,+BAGE,2BAGF,YACE,gCAEA,eACE,qEAEA,eAEE,gBACA,2CAGF,eACE,SAQZ,iBACE,qBACA,iBAGF,aACE,kBACA,aACA,UACA,YACA,clB91BiB,qBkBg2BjB,eACA,qCAEA,gBAVF,eAWI,WACA,gBACA,clBh2Bc,SmBvBlB,UACE,eACA,iBACA,yBACA,qBAEA,WAEE,iBACA,mBACA,6BACA,gBACA,mBACA,oBAGF,qBACE,gCACA,aACA,gBACA,oBAGF,eACE,qEAGF,kBnBrBwB,UmB0BxB,anBbmB,0BmBejB,gBAEA,oBACE,eAIJ,eACE,CAII,4HADF,eACE,+FAOF,sBAEE,yFAKF,YAEE,gCAMJ,kBnB9DsB,6BmBgEpB,gCACA,4CAEA,qBACE,8BACA,2CAGF,uBACE,+BACA,0BAKN,qBACE,gBAIJ,aACE,mBACA,MAGF,+CACE,0BAGF,sBACE,SACA,aACA,8CAGF,oBAEE,qBACA,iBACA,eACA,cnB1GmB,gBmB4GnB,0DAEA,UnBjHM,wDmBqHN,eACE,iBACA,sEAGF,cACE,yCAKF,YAEE,yDAEA,qBACE,iBACA,eACA,gBACA,qEAEA,cACE,2EAGF,YACE,mBACA,uFAEA,YACE,qHAOJ,sBACA,cACA,uBAIJ,wBACE,mBnB5JsB,sBmB8JtB,YACA,mBACA,gCAEA,gBACE,mBACA,oBAIJ,YACE,yBACA,aACA,mBnB3KsB,gCmB8KtB,aACE,gBACA,mBAIJ,wBACE,aACA,mBACA,qCAEA,wCACE,4BACE,0BAIJ,kBACE,iCAGF,kBnBnMsB,uCmBsMpB,kBACE,4BAIJ,gBACE,oBACA,sCAEA,SACE,wCAGF,YACE,mBACA,mCAGF,aACE,aACA,uBACA,mBACA,kBACA,6CAEA,UACE,YACA,kCAIJ,aACE,mCAGF,aACE,iBACA,cnB7Oa,gBmB+Ob,mCAIJ,QACE,WACA,qCAEA,sBACE,gBACA,qCAOJ,4FAFF,YAGI,gCAIJ,aACE,uCAEA,iBACE,sCAGF,eACE,4BAIJ,wBACE,aACA,gBACA,qCAEA,2BALF,4BAMI,sCAIJ,+CACE,YACE,iBC7RN,YACE,uBACA,WACA,iBACA,iCAEA,gBACE,gBACA,oBACA,cACA,wCAEA,YACE,yBACA,mBpBZoB,YoBcpB,yBAIJ,WAvBc,UAyBZ,oBACA,iCAEA,YACE,mBACA,YACA,uCAEA,aACE,yCAEA,oBACE,aACA,2CAGF,SpBzCA,YoB2CE,kBACA,YACA,uCAIJ,aACE,cpB/Ca,qBoBiDb,cACA,eACA,aACA,0HAIA,kBAGE,+BAKN,aACE,iBACA,YACA,aACA,qCAGF,sCACE,YACE,6BAIJ,eACE,0BACA,gBACA,mBACA,qCAEA,2BANF,eAOI,+BAGF,aACE,aACA,cpBzFa,qBoB2Fb,0BACA,2CACA,0BACA,mBACA,gBACA,uBACA,mCAEA,gBACE,oCAGF,UpB1GA,yBoB4GE,0BACA,2CACA,uCAGF,kBACE,sBACA,+BAIJ,kBACE,wBACA,SACA,iCAEA,QACE,kBACA,6DAIJ,UpBlIE,yBAkBa,gBoBmHb,gBACA,mEAEA,wBACE,6DAKN,yBACE,iCAIJ,qBACE,WACA,gBApJY,cAsJZ,sCAGF,uCACE,YACE,iCAGF,WA/JY,cAiKV,sCAIJ,gCACE,UACE,0BAMF,2BACA,qCAEA,wBALF,cAMI,CACA,sBACA,kCAGF,YACE,oBAEA,gCACA,0BAEA,eAEA,mBACA,8BACA,mCAEA,eACE,kBACA,yCAGF,mBACE,4DAEA,eACE,qCAIJ,gCAzBF,eA0BI,iBACA,6BAIJ,apBlNiB,eoBoNf,iBACA,gBACA,qCAEA,2BANF,eAOI,6BAIJ,apB7NiB,eoB+Nf,iBACA,gBACA,mBACA,4BAGF,wBACE,eACA,gBACA,cpBxOe,mBoB0Of,kBACA,gCACA,4BAGF,cACE,cpBhPe,iBoBkPf,gBACA,0CAGF,UpBzPI,gBoB2PF,uFAGF,eAEE,gEAGF,aACE,4CAGF,cACE,gBACA,WpBzQE,oBoB2QF,iBACA,gBACA,gBACA,2BAGF,cACE,iBACA,cpBhRe,mBoBkRf,kCAEA,UpBvRE,gBoByRA,CAII,2NADF,eACE,4BAMR,UACE,SACA,SACA,6CACA,cACA,mCAEA,UACE,SACA,qCAKN,eA9SF,aA+SI,iCAEA,YACE,yBAGF,UACE,UACA,YACA,iCAEA,YACE,4BAGF,YACE,8DAGF,eAEE,gCACA,gBACA,0EAEA,eACE,+BAIJ,eACE,6DAGF,2BpBlUe,YoByUrB,UACE,SACA,cACA,WACA,sDAKA,apBjWmB,0DoBoWjB,apBrViB,4DoB0VnB,apBnWc,gBoBqWZ,4DAGF,ab9WU,gBagXR,0DAGF,apBhWgB,gBoBkWd,0DAGF,abtXU,gBawXR,UAIJ,YACE,eACA,yBAEA,aACE,qBACA,oCAEA,kBACE,4BAGF,cACE,gBACA,+BAEA,oBACE,iBACA,gCAIJ,eACE,yBACA,eACA,CAII,iNADF,eACE,6CAKN,aACE,mBACA,2BAGF,oBACE,cpBtae,qBoBwaf,yBACA,eACA,gBACA,gCACA,iCAEA,UpBjbE,gCoBmbA,oCAGF,apBpae,gCoBsab,CAkBJ,gBAIJ,aACE,iBACA,eACA,sBAGF,aACE,eACA,cACA,wBAEA,aACE,kBAIJ,YACE,eACA,mBACA,wBAGF,YACE,WACA,sBACA,aACA,+BAEA,aACE,qBACA,gBACA,eACA,iBACA,cpB5eiB,CoBifb,4MADF,eACE,sCAKN,aACE,gCAIJ,YAEE,mBACA,kEAEA,UACE,kBACA,4BACA,gFAEA,iBACE,kDAKN,aAEE,aACA,sBACA,4EAEA,cACE,WACA,kBACA,mBACA,uEAIJ,cAEE,iBAGF,YACE,eACA,kBACA,2CAEA,kBACE,eACA,8BAGF,kBACE,+CAGF,gBACE,uDAEA,gBACE,mBACA,YACA,YAKN,kBACE,eACA,cAEA,apB5iBmB,qBoB8iBjB,oBAEA,yBACE,SAKN,aACE,YAGF,gBACE,eACA,mBpBzkBwB,gCoB2kBxB,uBAEA,eACE,oBAGF,YACE,2BACA,mBACA,cpBtlBiB,eoBwlBjB,eACA,oBAGF,iBACE,4BAEA,aACE,SACA,kBACA,WACA,YACA,qBAIJ,2BACE,mBAGF,oBACE,uBAGF,apB7lBgB,sDoBimBhB,apBpnBmB,qBoBwnBjB,gBACA,yDAIJ,oBAIE,cpBjoBmB,iGoBooBnB,eACE,yIAIA,4BACE,cACA,iIAGF,8BACE,CADF,sBACE,WACA,sBAKN,YAEE,mBACA,sCAEA,aACE,CACA,gBACA,kBACA,0DAIA,8BACE,CADF,sBACE,WACA,gBAKN,kBACE,8BACA,yBAEA,yBpBvqBc,yBoB2qBd,yBACE,wBAGF,yBbnrBU,wBawrBR,2BACA,eACA,iBACA,4BACA,kBACA,gBACA,0BAEA,apBlsBiB,uBoBwsBjB,wBACA,qBAGF,apBzrBgB,coB8rBlB,kBpB/sB0B,kBoBitBxB,mBACA,uBAEA,YACE,8BACA,mBACA,aACA,gCAEA,SACE,SACA,gDAEA,aACE,8BAIJ,aACE,gBACA,cpBvuBe,yBoByuBf,iBACA,gCAEA,aACE,qBACA,iHAEA,aAGE,mCAIJ,abvvBM,6Ba8vBR,YACE,2BACA,6BACA,mCAEA,kBACE,gFAGF,YAEE,cACA,sBACA,YACA,cpB5wBa,mLoB+wBb,kBAEE,gBACA,uBACA,sCAIJ,aACE,6BACA,4CAEA,apBxwBU,iBoB0wBR,gBACA,wCAIJ,aACE,sBACA,WACA,aACA,qBACA,cpBvyBa,WoB8yBrB,kBAGE,0BAFA,eACA,uBASA,CARA,eAGF,oBACE,gBACA,CAEA,qBACA,oBAGF,YACE,eACA,CACA,kBACA,wBAEA,qBACE,cACA,mBACA,aACA,0FAGF,kBAEE,kBACA,YACA,6CAGF,QACE,SACA,+CAEA,aACE,sEAGF,uBACE,yDAGF,apBt1BY,8CoB21Bd,qBACE,aACA,WpBt2BI,coB22BR,iBACE,qBAGF,wBACE,kBACA,2BAEA,cACE,mBpB/2BsB,gCoBi3BtB,kCAEA,cACE,cACA,gBACA,eACA,gBACA,cpB13Be,qBoB43Bf,mBACA,uHAEA,UpBl4BE,iCoBy4BJ,cACE,cpBp3BY,uCoBw3Bd,YACE,8BACA,mBACA,sCAGF,eACE,sBCt5BN,YACE,eACA,CACA,kBACA,0BAEA,qBACE,iBACA,cACA,mBACA,yDAEA,YAEE,mBACA,kBACA,sBACA,YACA,4BAGF,oBACE,cACA,cACA,qGAEA,kBAGE,sDAKN,iBAEE,gBACA,eACA,iBACA,WrBtCI,6CqBwCJ,mBACA,iBACA,4BAGF,cACE,6BAGF,cACE,crB/CiB,kBqBiDjB,gBACA,qBAIJ,YACE,eACA,cACA,yBAEA,gBACE,mBACA,6BAEA,aACE,sCAIJ,arBpEmB,gBqBsEjB,qBACA,UC3EJ,aACE,gCAEA,gBACE,eACA,mBACA,+BAGF,cACE,iBACA,8CAGF,aACE,kBACA,wBAGF,gBACE,iCAGF,aACE,kBACA,uCAGF,oBACE,gDAGF,SACE,YACA,8BAGF,cACE,iBACA,mEAGF,aACE,kBACA,2DAGF,cAEE,gBACA,mFAGF,cACE,gBACA,mCAGF,aACE,iBACA,yBAGF,kBACE,kBACA,4BAGF,UACE,UACA,wBAGF,aACE,kCAGF,MACE,WACA,cACA,mBACA,2CAGF,aACE,iBACA,0CAGF,gBACE,eACA,mCAGF,WACE,sCAGF,gBACE,gBACA,yCAGF,UACE,iCAGF,aACE,iBACA,0BAGF,SACE,WACA,0DAGF,iBAEE,mBACA,4GAGF,iBAEE,gBACA,uCAGF,kBACE,eACA,2BAGF,aACE,kBACA,wCAGF,SACE,YACA,yDAGF,SACE,WACA,CAKA,oFAGF,UACE,OACA,uGAGF,UAEE,uCAIA,cACE,iBACA,kEAEA,cACE,gBACA,qCAKN,WACE,eACA,iBACA,uCAGF,WACE,sCAGF,aACE,kBACA,0CAGF,gBACE,eACA,uDAGF,gBACE,2CAGF,cACE,iBACA,YACA,yEAGF,aAEE,iBACA,iBAGF,wBACE,iBAGF,SACE,oBACA,yBAGF,aACE,8EAGF,cAEE,gBACA,oDAGF,cACE,mBACA,gEAGF,iBACE,gBACA,CAMA,8KAGF,SACE,QACA,yDAGF,kBACE,eACA,uDAGF,kBACE,gBACA,qDAGF,SACE,QACA,8FAGF,cAEE,mBACA,4CAGF,UACE,SACA,kDAEA,UACE,OACA,qEACA,8BAIJ,sXACE,uCAGF,gBAEE,kCAGF,cACE,iBACA,gDAGF,UACE,UACA,gEAGF,aACE,uDAGF,WACE,WACA,uDAGF,UACE,WACA,uDAGF,UACE,WACA,kDAGF,MACE,0CAGF,iBACE,yBACA,qDAGF,cACE,iBACA,qCAGF,kCACE,gBAEE,kBACA,2DAEA,gBACE,mBACA,uEAKF,gBAEE,kBACA,gFAKN,cAEE,gBACA,6CAKE,eACE,eACA,sDAIJ,aACE,kBACA,4DAKF,cACE,gBACA,8DAGF,gBACE,eACA,mCAIJ,aACE,kBACA,iBACA,kCAGF,WACE,mCAGF,WACE,oCAGF,cACE,gBACA,gFAGF,cACE,mBACA,+DAGF,SACE,QACA,kkEC7ZJ,kIACE,CADF,sIACE,qBACA,MCDF,6CACE,CjBFM,qCiBSN,UjBTM,sDiBcR,wBAEE,sMAEA,UjBlBM,gGiB0BR,ejB1BQ,yBiBgCN,aACA,uBAGF,kBACE,oCAGF,ejBxCQ,gCiB2CN,8BAGF,sBACE,iBACA,kBACA,qCAGF,wBAEE,oCAGF,ejBzDQ,yBiB4DN,qCAEA,mCALF,YAMI,+DAGF,SACE,QACA,gIAIJ,ejBxEQ,+BiBgFR,axB/DqB,8GwBkEnB,axBlEmB,gBOjBb,gDiB2FR,iBjB3FQ,4BiB+FR,axB7FqB,0BwB+FnB,iIAGF,aAIE,6cAEA,UxB3GM,oBwBkHR,kBACE,gCACA,wDAKA,ejBxHM,gCiB0HJ,4MAEA,kBxBxHsB,kCwBgI1B,4BACE,gCACA,qCAEA,iCAJF,YAKI,uUAIJ,wBAYE,qCAIA,eADF,YAEI,gBACA,sCAIJ,YACE,gBACA,oCAGF,oXACE,uEAGF,wBAEE,2BAGF,wBACE,aACA,8CAGF,kBxBlL0B,yBwBoLxB,aACA,gCAGF,ejB5LQ,yBiB+LN,0BAGF,o1BACE,oFAME,aACE,6QAEA,UjB5ME,gFiBmNJ,aACE,2GAEA,aACE,CAHF,iGAEA,aACE,CAHF,qGAEA,aACE,CAHF,4FAEA,aACE,CAMJ,8FAGF,kBACE,yPAIA,kBAIE,iBAKN,oBACE,6BAEA,kBACE,0BAIJ,+BACE,qBxBnPwB,kBwBwP1B,kBxBxP0B,uBwB4P1B,kBACE,wCAGF,kBACE,+CAGF,ejBxQQ,0GiB8QR,kBxB1Q0B,sHwB8QxB,kBACE,uCAKJ,kBxBpR0B,uEwByR1B,UjB7RQ,0BiBiSR,wBxB7R0B,gBwBkS1B,ejBtSQ,4BiB0SJ,sBjB1SI,2BiB8SJ,qBjB9SI,8BiBkTJ,wBjBlTI,6BiBsTJ,uBjBtTI,wBiB4TJ,ejB5TI,cPEa,85BwBkUrB,UjBpUQ,2BiB4VR,2BACE,uNAIF,ejBjWQ,yBiB6WN,wBAGF,0BACE,0BAGF,wBACE,mCAGF,kBACE,yBACA,aACA,8BAGF,UjB9XQ,6JiBkYR,kBAME,+2DAIE,qBAGE,qBAKN,ejBpZQ,yDiBwZR,ejBxZQ,yBiB0ZN,+DAEA,oBACE,gBjB7ZI,qBiBkaR,kBxBhaqB,sEwBoarB,kBACE,4FAGF,kBACE,uCAIF,UxBhbQ,gBOCA,WiBqbR,ejBrbQ,yBiBubN,gBACA,qCAEA,UALF,YAMI,kBAGF,mBACE,wBACA,4BACA,oEAEA,kBxB/bsB,yFwBscpB,sBAGE,4BxB5ba,uBwBocrB,exBrdQ,4BwBudN,kMAGF,ejB1dQ,yBiBoeN,qCAEA,iMAZF,aAaI,eACA,aACA,8BAIJ,YACE,gBACA,oLASE,oBACE,+BAKN,ejB9fQ,yBiBggBN,aACA,qCAEA,8BALF,QAMI,kBAIJ,axBtgBqB,0EwB2gBnB,kBxBzgBwB,qCwB+gBxB,kBAPF,QAQI,sDAIJ,oBxBvgBqB,mVwB2gBnB,UjB5hBM,mMiBoiBN,kBxBnhBmB,oEwB2hBnB,oBAGE,kBAIJ,wBACE,8BAEA,YACE,yBAGF,exB1jBM,0HwB6jBJ,2BAGE,CxBjkBE,oGwB2kBF,UxB3kBE,0DwBqlBF,axBllBe,2CwBwlBf,UxB3lBE,6CwBgmBJ,axB7lBiB,6DwBimBjB,UxBpmBI,4CwB4mBN,eACE,8BACA,iBACA,oDxB7lBiB,awBmmBjB,yFAHF,oBxBhmBmB,qCwBymBnB,CxBzmBmB,2HwBmnBnB,axBnnBmB,qBwBwnBrB,UjBzoBQ,yBiB4oBN,SjB5oBM,2CiBkpBN,wBACE,qCAEA,0CAHF,YAII,kGAIJ,eAGE,sEAGF,exBhqBM,yBwBmqBJ,wBAGF,kBxBlqBwB,yBwBoqBtB,qCAEA,uBAJF,QAKI,+GAIA,kBAGE,8CAMJ,kBACE,oDAEA,eACE,mDAKF,exBjsBE,yBwBmsBA,aACA,wDAGF,iBxBvsBE,qCwB2sBF,2CAXF,exBhsBI,yBwB6sBA,aACA,kHAMA,UjBptBA,qCiBwtBE,gHAJF,UxBrtBA,mEwBiuBF,QACE,2FAGF,oBACE,yFAMR,yCAEE,0PAGF,eAaE,sKAGF,UxBjwBQ,0D","file":"skins/vanilla/mastodon-light/common.css","sourcesContent":["html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:\"\";content:none}table{border-collapse:collapse;border-spacing:0}html{scrollbar-color:#ccd7e0 rgba(255,255,255,.1)}::-webkit-scrollbar{width:12px;height:12px}::-webkit-scrollbar-thumb{background:#ccd7e0;border:0px none #fff;border-radius:50px}::-webkit-scrollbar-thumb:hover{background:#c6d2dc}::-webkit-scrollbar-thumb:active{background:#ccd7e0}::-webkit-scrollbar-track{border:0px none #fff;border-radius:0;background:rgba(255,255,255,.1)}::-webkit-scrollbar-track:hover{background:#d9e1e8}::-webkit-scrollbar-track:active{background:#d9e1e8}::-webkit-scrollbar-corner{background:transparent}body{font-family:\"mastodon-font-sans-serif\",sans-serif;background:#eff3f5;font-size:13px;line-height:18px;font-weight:400;color:#000;text-rendering:optimizelegibility;font-feature-settings:\"kern\";text-size-adjust:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-tap-highlight-color:transparent}body.system-font{font-family:system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"Oxygen\",\"Ubuntu\",\"Cantarell\",\"Fira Sans\",\"Droid Sans\",\"Helvetica Neue\",\"mastodon-font-sans-serif\",sans-serif}body.app-body{padding:0}body.app-body.layout-single-column{height:auto;min-height:100vh;overflow-y:scroll}body.app-body.layout-multiple-columns{position:absolute;width:100%;height:100%}body.app-body.with-modals--active{overflow-y:hidden}body.lighter{background:#d9e1e8}body.with-modals{overflow-x:hidden;overflow-y:scroll}body.with-modals--active{overflow-y:hidden}body.player{text-align:center}body.embed{background:#ccd7e0;margin:0;padding-bottom:0}body.embed .container{position:absolute;width:100%;height:100%;overflow:hidden}body.admin{background:#e6ebf0;padding:0}body.error{position:absolute;text-align:center;color:#282c37;background:#d9e1e8;width:100%;height:100%;padding:0;display:flex;justify-content:center;align-items:center}body.error .dialog{vertical-align:middle;margin:20px}body.error .dialog__illustration img{display:block;max-width:470px;width:100%;height:auto;margin-top:-120px}body.error .dialog h1{font-size:20px;line-height:28px;font-weight:400}button{font-family:inherit;cursor:pointer}button:focus{outline:none}.app-holder,.app-holder>div,.app-holder>noscript{display:flex;width:100%;align-items:center;justify-content:center;outline:0 !important}.app-holder>noscript{height:100vh}.layout-single-column .app-holder,.layout-single-column .app-holder>div{min-height:100vh}.layout-multiple-columns .app-holder,.layout-multiple-columns .app-holder>div{height:100%}.error-boundary,.app-holder noscript{flex-direction:column;font-size:16px;font-weight:400;line-height:1.7;color:#dc2f4b;text-align:center}.error-boundary>div,.app-holder noscript>div{max-width:500px}.error-boundary p,.app-holder noscript p{margin-bottom:.85em}.error-boundary p:last-child,.app-holder noscript p:last-child{margin-bottom:0}.error-boundary a,.app-holder noscript a{color:#2b90d9}.error-boundary a:hover,.error-boundary a:focus,.error-boundary a:active,.app-holder noscript a:hover,.app-holder noscript a:focus,.app-holder noscript a:active{text-decoration:none}.error-boundary__footer,.app-holder noscript__footer{color:#444b5d;font-size:13px}.error-boundary__footer a,.app-holder noscript__footer a{color:#444b5d}.error-boundary button,.app-holder noscript button{display:inline;border:0;background:transparent;color:#444b5d;font:inherit;padding:0;margin:0;line-height:inherit;cursor:pointer;outline:0;transition:color 300ms linear;text-decoration:underline}.error-boundary button:hover,.error-boundary button:focus,.error-boundary button:active,.app-holder noscript button:hover,.app-holder noscript button:focus,.app-holder noscript button:active{text-decoration:none}.error-boundary button.copied,.app-holder noscript button.copied{color:#4a905f;transition:none}.container-alt{width:700px;margin:0 auto;margin-top:40px}@media screen and (max-width: 740px){.container-alt{width:100%;margin:0}}.logo-container{margin:100px auto 50px}@media screen and (max-width: 500px){.logo-container{margin:40px auto 0}}.logo-container h1{display:flex;justify-content:center;align-items:center}.logo-container h1 svg{fill:#000;height:42px;margin-right:10px}.logo-container h1 a{display:flex;justify-content:center;align-items:center;color:#000;text-decoration:none;outline:0;padding:12px 16px;line-height:32px;font-family:\"mastodon-font-display\",sans-serif;font-weight:500;font-size:14px}.compose-standalone .compose-form{width:400px;margin:0 auto;padding:20px 0;margin-top:40px;box-sizing:border-box}@media screen and (max-width: 400px){.compose-standalone .compose-form{width:100%;margin-top:0;padding:20px}}.account-header{width:400px;margin:0 auto;display:flex;font-size:13px;line-height:18px;box-sizing:border-box;padding:20px 0;padding-bottom:0;margin-bottom:-30px;margin-top:40px}@media screen and (max-width: 440px){.account-header{width:100%;margin:0;margin-bottom:10px;padding:20px;padding-bottom:0}}.account-header .avatar{width:40px;height:40px;margin-right:8px}.account-header .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px}.account-header .name{flex:1 1 auto;color:#282c37;width:calc(100% - 88px)}.account-header .name .username{display:block;font-weight:500;text-overflow:ellipsis;overflow:hidden}.account-header .logout-link{display:block;font-size:32px;line-height:40px;margin-left:8px}.grid-3{display:grid;grid-gap:10px;grid-template-columns:3fr 1fr;grid-auto-columns:25%;grid-auto-rows:max-content}.grid-3 .column-0{grid-column:1/3;grid-row:1}.grid-3 .column-1{grid-column:1;grid-row:2}.grid-3 .column-2{grid-column:2;grid-row:2}.grid-3 .column-3{grid-column:1/3;grid-row:3}@media screen and (max-width: 415px){.grid-3{grid-gap:0;grid-template-columns:minmax(0, 100%)}.grid-3 .column-0{grid-column:1}.grid-3 .column-1{grid-column:1;grid-row:3}.grid-3 .column-2{grid-column:1;grid-row:2}.grid-3 .column-3{grid-column:1;grid-row:4}}.grid-4{display:grid;grid-gap:10px;grid-template-columns:repeat(4, minmax(0, 1fr));grid-auto-columns:25%;grid-auto-rows:max-content}.grid-4 .column-0{grid-column:1/5;grid-row:1}.grid-4 .column-1{grid-column:1/4;grid-row:2}.grid-4 .column-2{grid-column:4;grid-row:2}.grid-4 .column-3{grid-column:2/5;grid-row:3}.grid-4 .column-4{grid-column:1;grid-row:3}.grid-4 .landing-page__call-to-action{min-height:100%}.grid-4 .flash-message{margin-bottom:10px}@media screen and (max-width: 738px){.grid-4{grid-template-columns:minmax(0, 50%) minmax(0, 50%)}.grid-4 .landing-page__call-to-action{padding:20px;display:flex;align-items:center;justify-content:center}.grid-4 .row__information-board{width:100%;justify-content:center;align-items:center}.grid-4 .row__mascot{display:none}}@media screen and (max-width: 415px){.grid-4{grid-gap:0;grid-template-columns:minmax(0, 100%)}.grid-4 .column-0{grid-column:1}.grid-4 .column-1{grid-column:1;grid-row:3}.grid-4 .column-2{grid-column:1;grid-row:2}.grid-4 .column-3{grid-column:1;grid-row:5}.grid-4 .column-4{grid-column:1;grid-row:4}}@media screen and (max-width: 415px){.public-layout{padding-top:48px}}.public-layout .container{max-width:960px}@media screen and (max-width: 415px){.public-layout .container{padding:0}}.public-layout .header{background:#c0cdd9;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;height:48px;margin:10px 0;display:flex;align-items:stretch;justify-content:center;flex-wrap:nowrap;overflow:hidden}@media screen and (max-width: 415px){.public-layout .header{position:fixed;width:100%;top:0;left:0;margin:0;border-radius:0;box-shadow:none;z-index:110}}.public-layout .header>div{flex:1 1 33.3%;min-height:1px}.public-layout .header .nav-left{display:flex;align-items:stretch;justify-content:flex-start;flex-wrap:nowrap}.public-layout .header .nav-center{display:flex;align-items:stretch;justify-content:center;flex-wrap:nowrap}.public-layout .header .nav-right{display:flex;align-items:stretch;justify-content:flex-end;flex-wrap:nowrap}.public-layout .header .brand{display:block;padding:15px}.public-layout .header .brand svg{display:block;height:18px;width:auto;position:relative;bottom:-2px;fill:#000}@media screen and (max-width: 415px){.public-layout .header .brand svg{height:20px}}.public-layout .header .brand:hover,.public-layout .header .brand:focus,.public-layout .header .brand:active{background:#b3c3d1}.public-layout .header .nav-link{display:flex;align-items:center;padding:0 1rem;font-size:12px;font-weight:500;text-decoration:none;color:#282c37;white-space:nowrap;text-align:center}.public-layout .header .nav-link:hover,.public-layout .header .nav-link:focus,.public-layout .header .nav-link:active{text-decoration:underline;color:#000}@media screen and (max-width: 550px){.public-layout .header .nav-link.optional{display:none}}.public-layout .header .nav-button{background:#a6b9c9;margin:8px;margin-left:0;border-radius:4px}.public-layout .header .nav-button:hover,.public-layout .header .nav-button:focus,.public-layout .header .nav-button:active{text-decoration:none;background:#99afc2}.public-layout .grid{display:grid;grid-gap:10px;grid-template-columns:minmax(300px, 3fr) minmax(298px, 1fr);grid-auto-columns:25%;grid-auto-rows:max-content}.public-layout .grid .column-0{grid-row:1;grid-column:1}.public-layout .grid .column-1{grid-row:1;grid-column:2}@media screen and (max-width: 600px){.public-layout .grid{grid-template-columns:100%;grid-gap:0}.public-layout .grid .column-1{display:none}}.public-layout .directory__card{border-radius:4px}@media screen and (max-width: 415px){.public-layout .directory__card{border-radius:0}}@media screen and (max-width: 415px){.public-layout .page-header{border-bottom:0}}.public-layout .public-account-header{overflow:hidden;margin-bottom:10px;box-shadow:0 0 15px rgba(0,0,0,.2)}.public-layout .public-account-header.inactive{opacity:.5}.public-layout .public-account-header.inactive .public-account-header__image,.public-layout .public-account-header.inactive .avatar{filter:grayscale(100%)}.public-layout .public-account-header.inactive .logo-button{background-color:#282c37}.public-layout .public-account-header__image{border-radius:4px 4px 0 0;overflow:hidden;height:300px;position:relative;background:#fff}.public-layout .public-account-header__image::after{content:\"\";display:block;position:absolute;width:100%;height:100%;box-shadow:inset 0 -1px 1px 1px rgba(0,0,0,.15);top:0;left:0}.public-layout .public-account-header__image img{object-fit:cover;display:block;width:100%;height:100%;margin:0;border-radius:4px 4px 0 0}@media screen and (max-width: 600px){.public-layout .public-account-header__image{height:200px}}.public-layout .public-account-header--no-bar{margin-bottom:0}.public-layout .public-account-header--no-bar .public-account-header__image,.public-layout .public-account-header--no-bar .public-account-header__image img{border-radius:4px}@media screen and (max-width: 415px){.public-layout .public-account-header--no-bar .public-account-header__image,.public-layout .public-account-header--no-bar .public-account-header__image img{border-radius:0}}@media screen and (max-width: 415px){.public-layout .public-account-header{margin-bottom:0;box-shadow:none}.public-layout .public-account-header__image::after{display:none}.public-layout .public-account-header__image,.public-layout .public-account-header__image img{border-radius:0}}.public-layout .public-account-header__bar{position:relative;margin-top:-80px;display:flex;justify-content:flex-start}.public-layout .public-account-header__bar::before{content:\"\";display:block;background:#ccd7e0;position:absolute;bottom:0;left:0;right:0;height:60px;border-radius:0 0 4px 4px;z-index:-1}.public-layout .public-account-header__bar .avatar{display:block;width:120px;height:120px;padding-left:16px;flex:0 0 auto}.public-layout .public-account-header__bar .avatar img{display:block;width:100%;height:100%;margin:0;border-radius:50%;border:4px solid #ccd7e0;background:#f2f5f7}@media screen and (max-width: 600px){.public-layout .public-account-header__bar{margin-top:0;background:#ccd7e0;border-radius:0 0 4px 4px;padding:5px}.public-layout .public-account-header__bar::before{display:none}.public-layout .public-account-header__bar .avatar{width:48px;height:48px;padding:7px 0;padding-left:10px}.public-layout .public-account-header__bar .avatar img{border:0;border-radius:4px}}@media screen and (max-width: 600px)and (max-width: 360px){.public-layout .public-account-header__bar .avatar{display:none}}@media screen and (max-width: 415px){.public-layout .public-account-header__bar{border-radius:0}}@media screen and (max-width: 600px){.public-layout .public-account-header__bar{flex-wrap:wrap}}.public-layout .public-account-header__tabs{flex:1 1 auto;margin-left:20px}.public-layout .public-account-header__tabs__name{padding-top:20px;padding-bottom:8px}.public-layout .public-account-header__tabs__name h1{font-size:20px;line-height:27px;color:#000;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-shadow:1px 1px 1px #000}.public-layout .public-account-header__tabs__name h1 small{display:block;font-size:14px;color:#000;font-weight:400;overflow:hidden;text-overflow:ellipsis}@media screen and (max-width: 600px){.public-layout .public-account-header__tabs{margin-left:15px;display:flex;justify-content:space-between;align-items:center}.public-layout .public-account-header__tabs__name{padding-top:0;padding-bottom:0}.public-layout .public-account-header__tabs__name h1{font-size:16px;line-height:24px;text-shadow:none}.public-layout .public-account-header__tabs__name h1 small{color:#282c37}}.public-layout .public-account-header__tabs__tabs{display:flex;justify-content:flex-start;align-items:stretch;height:58px}.public-layout .public-account-header__tabs__tabs .details-counters{display:flex;flex-direction:row;min-width:300px}@media screen and (max-width: 600px){.public-layout .public-account-header__tabs__tabs .details-counters{display:none}}.public-layout .public-account-header__tabs__tabs .counter{min-width:33.3%;box-sizing:border-box;flex:0 0 auto;color:#282c37;padding:10px;border-right:1px solid #ccd7e0;cursor:default;text-align:center;position:relative}.public-layout .public-account-header__tabs__tabs .counter a{display:block}.public-layout .public-account-header__tabs__tabs .counter:last-child{border-right:0}.public-layout .public-account-header__tabs__tabs .counter::after{display:block;content:\"\";position:absolute;bottom:0;left:0;width:100%;border-bottom:4px solid #9bcbed;opacity:.5;transition:all 400ms ease}.public-layout .public-account-header__tabs__tabs .counter.active::after{border-bottom:4px solid #2b90d9;opacity:1}.public-layout .public-account-header__tabs__tabs .counter.active.inactive::after{border-bottom-color:#282c37}.public-layout .public-account-header__tabs__tabs .counter:hover::after{opacity:1;transition-duration:100ms}.public-layout .public-account-header__tabs__tabs .counter a{text-decoration:none;color:inherit}.public-layout .public-account-header__tabs__tabs .counter .counter-label{font-size:12px;display:block}.public-layout .public-account-header__tabs__tabs .counter .counter-number{font-weight:500;font-size:18px;margin-bottom:5px;color:#000;font-family:\"mastodon-font-display\",sans-serif}.public-layout .public-account-header__tabs__tabs .spacer{flex:1 1 auto;height:1px}.public-layout .public-account-header__tabs__tabs__buttons{padding:7px 8px}.public-layout .public-account-header__extra{display:none;margin-top:4px}.public-layout .public-account-header__extra .public-account-bio{border-radius:0;box-shadow:none;background:transparent;margin:0 -5px}.public-layout .public-account-header__extra .public-account-bio .account__header__fields{border-top:1px solid #b3c3d1}.public-layout .public-account-header__extra .public-account-bio .roles{display:none}.public-layout .public-account-header__extra__links{margin-top:-15px;font-size:14px;color:#282c37}.public-layout .public-account-header__extra__links a{display:inline-block;color:#282c37;text-decoration:none;padding:15px;font-weight:500}.public-layout .public-account-header__extra__links a strong{font-weight:700;color:#000}@media screen and (max-width: 600px){.public-layout .public-account-header__extra{display:block;flex:100%}}.public-layout .account__section-headline{border-radius:4px 4px 0 0}@media screen and (max-width: 415px){.public-layout .account__section-headline{border-radius:0}}.public-layout .detailed-status__meta{margin-top:25px}.public-layout .public-account-bio{background:#c0cdd9;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;overflow:hidden;margin-bottom:10px}@media screen and (max-width: 415px){.public-layout .public-account-bio{box-shadow:none;margin-bottom:0;border-radius:0}}.public-layout .public-account-bio .account__header__fields{margin:0;border-top:0}.public-layout .public-account-bio .account__header__fields a{color:#217aba}.public-layout .public-account-bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.public-layout .public-account-bio .account__header__fields .verified a{color:#4a905f}.public-layout .public-account-bio .account__header__content{padding:20px;padding-bottom:0;color:#000}.public-layout .public-account-bio__extra,.public-layout .public-account-bio .roles{padding:20px;font-size:14px;color:#282c37}.public-layout .public-account-bio .roles{padding-bottom:0}.public-layout .directory__list{display:grid;grid-gap:10px;grid-template-columns:minmax(0, 50%) minmax(0, 50%)}@media screen and (max-width: 415px){.public-layout .directory__list{display:block}}.public-layout .directory__list .icon-button{font-size:18px}.public-layout .directory__card{margin-bottom:0}.public-layout .card-grid{display:flex;flex-wrap:wrap;min-width:100%;margin:0 -5px}.public-layout .card-grid>div{box-sizing:border-box;flex:1 0 auto;width:300px;padding:0 5px;margin-bottom:10px;max-width:33.333%}@media screen and (max-width: 900px){.public-layout .card-grid>div{max-width:50%}}@media screen and (max-width: 600px){.public-layout .card-grid>div{max-width:100%}}@media screen and (max-width: 415px){.public-layout .card-grid{margin:0;border-top:1px solid #c0cdd9}.public-layout .card-grid>div{width:100%;padding:0;margin-bottom:0;border-bottom:1px solid #c0cdd9}.public-layout .card-grid>div:last-child{border-bottom:0}.public-layout .card-grid>div .card__bar{background:#d9e1e8}.public-layout .card-grid>div .card__bar:hover,.public-layout .card-grid>div .card__bar:active,.public-layout .card-grid>div .card__bar:focus{background:#ccd7e0}}.no-list{list-style:none}.no-list li{display:inline-block;margin:0 5px}.recovery-codes{list-style:none;margin:0 auto}.recovery-codes li{font-size:125%;line-height:1.5;letter-spacing:1px}.public-layout .footer{text-align:left;padding-top:20px;padding-bottom:60px;font-size:12px;color:#6d8ca7}@media screen and (max-width: 415px){.public-layout .footer{padding-left:20px;padding-right:20px}}.public-layout .footer .grid{display:grid;grid-gap:10px;grid-template-columns:1fr 1fr 2fr 1fr 1fr}.public-layout .footer .grid .column-0{grid-column:1;grid-row:1;min-width:0}.public-layout .footer .grid .column-1{grid-column:2;grid-row:1;min-width:0}.public-layout .footer .grid .column-2{grid-column:3;grid-row:1;min-width:0;text-align:center}.public-layout .footer .grid .column-2 h4 a{color:#6d8ca7}.public-layout .footer .grid .column-3{grid-column:4;grid-row:1;min-width:0}.public-layout .footer .grid .column-4{grid-column:5;grid-row:1;min-width:0}@media screen and (max-width: 690px){.public-layout .footer .grid{grid-template-columns:1fr 2fr 1fr}.public-layout .footer .grid .column-0,.public-layout .footer .grid .column-1{grid-column:1}.public-layout .footer .grid .column-1{grid-row:2}.public-layout .footer .grid .column-2{grid-column:2}.public-layout .footer .grid .column-3,.public-layout .footer .grid .column-4{grid-column:3}.public-layout .footer .grid .column-4{grid-row:2}}@media screen and (max-width: 600px){.public-layout .footer .grid .column-1{display:block}}@media screen and (max-width: 415px){.public-layout .footer .grid .column-0,.public-layout .footer .grid .column-1,.public-layout .footer .grid .column-3,.public-layout .footer .grid .column-4{display:none}}.public-layout .footer h4{text-transform:uppercase;font-weight:700;margin-bottom:8px;color:#282c37}.public-layout .footer h4 a{color:inherit;text-decoration:none}.public-layout .footer ul a{text-decoration:none;color:#6d8ca7}.public-layout .footer ul a:hover,.public-layout .footer ul a:active,.public-layout .footer ul a:focus{text-decoration:underline}.public-layout .footer .brand svg{display:block;height:36px;width:auto;margin:0 auto;fill:#6d8ca7}.public-layout .footer .brand:hover svg,.public-layout .footer .brand:focus svg,.public-layout .footer .brand:active svg{fill:#60829f}.compact-header h1{font-size:24px;line-height:28px;color:#282c37;font-weight:500;margin-bottom:20px;padding:0 10px;word-wrap:break-word}@media screen and (max-width: 740px){.compact-header h1{text-align:center;padding:20px 10px 0}}.compact-header h1 a{color:inherit;text-decoration:none}.compact-header h1 small{font-weight:400;color:#282c37}.compact-header h1 img{display:inline-block;margin-bottom:-5px;margin-right:15px;width:36px;height:36px}.hero-widget{margin-bottom:10px;box-shadow:0 0 15px rgba(0,0,0,.2)}.hero-widget__img{width:100%;position:relative;overflow:hidden;border-radius:4px 4px 0 0;background:#000}.hero-widget__img img{object-fit:cover;display:block;width:100%;height:100%;margin:0;border-radius:4px 4px 0 0}.hero-widget__text{background:#d9e1e8;padding:20px;border-radius:0 0 4px 4px;font-size:15px;color:#282c37;line-height:20px;word-wrap:break-word;font-weight:400}.hero-widget__text .emojione{width:20px;height:20px;margin:-3px 0 0}.hero-widget__text p{margin-bottom:20px}.hero-widget__text p:last-child{margin-bottom:0}.hero-widget__text em{display:inline;margin:0;padding:0;font-weight:700;background:transparent;font-family:inherit;font-size:inherit;line-height:inherit;color:#131419}.hero-widget__text a{color:#282c37;text-decoration:none}.hero-widget__text a:hover{text-decoration:underline}@media screen and (max-width: 415px){.hero-widget{display:none}}.endorsements-widget{margin-bottom:10px;padding-bottom:10px}.endorsements-widget h4{padding:10px;text-transform:uppercase;font-weight:700;font-size:13px;color:#282c37}.endorsements-widget .account{padding:10px 0}.endorsements-widget .account:last-child{border-bottom:0}.endorsements-widget .account .account__display-name{display:flex;align-items:center}.endorsements-widget .account .account__avatar{width:44px;height:44px;background-size:44px 44px}.endorsements-widget .trends__item{padding:10px}.trends-widget h4{color:#282c37}.box-widget{padding:20px;border-radius:4px;background:#d9e1e8;box-shadow:0 0 15px rgba(0,0,0,.2)}.placeholder-widget{padding:16px;border-radius:4px;border:2px dashed #444b5d;text-align:center;color:#282c37;margin-bottom:10px}.contact-widget{min-height:100%;font-size:15px;color:#282c37;line-height:20px;word-wrap:break-word;font-weight:400;padding:0}.contact-widget h4{padding:10px;text-transform:uppercase;font-weight:700;font-size:13px;color:#282c37}.contact-widget .account{border-bottom:0;padding:10px 0;padding-top:5px}.contact-widget>a{display:inline-block;padding:10px;padding-top:0;color:#282c37;text-decoration:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.contact-widget>a:hover,.contact-widget>a:focus,.contact-widget>a:active{text-decoration:underline}.moved-account-widget{padding:15px;padding-bottom:20px;border-radius:4px;background:#d9e1e8;box-shadow:0 0 15px rgba(0,0,0,.2);color:#282c37;font-weight:400;margin-bottom:10px}.moved-account-widget strong,.moved-account-widget a{font-weight:500}.moved-account-widget strong:lang(ja),.moved-account-widget a:lang(ja){font-weight:700}.moved-account-widget strong:lang(ko),.moved-account-widget a:lang(ko){font-weight:700}.moved-account-widget strong:lang(zh-CN),.moved-account-widget a:lang(zh-CN){font-weight:700}.moved-account-widget strong:lang(zh-HK),.moved-account-widget a:lang(zh-HK){font-weight:700}.moved-account-widget strong:lang(zh-TW),.moved-account-widget a:lang(zh-TW){font-weight:700}.moved-account-widget a{color:inherit;text-decoration:underline}.moved-account-widget a.mention{text-decoration:none}.moved-account-widget a.mention span{text-decoration:none}.moved-account-widget a.mention:focus,.moved-account-widget a.mention:hover,.moved-account-widget a.mention:active{text-decoration:none}.moved-account-widget a.mention:focus span,.moved-account-widget a.mention:hover span,.moved-account-widget a.mention:active span{text-decoration:underline}.moved-account-widget__message{margin-bottom:15px}.moved-account-widget__message .fa{margin-right:5px;color:#282c37}.moved-account-widget__card .detailed-status__display-avatar{position:relative;cursor:pointer}.moved-account-widget__card .detailed-status__display-name{margin-bottom:0;text-decoration:none}.moved-account-widget__card .detailed-status__display-name span{font-weight:400}.memoriam-widget{padding:20px;border-radius:4px;background:#000;box-shadow:0 0 15px rgba(0,0,0,.2);font-size:14px;color:#282c37;margin-bottom:10px}.page-header{background:#c0cdd9;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;padding:60px 15px;text-align:center;margin:10px 0}.page-header h1{color:#000;font-size:36px;line-height:1.1;font-weight:700;margin-bottom:10px}.page-header p{font-size:15px;color:#282c37}@media screen and (max-width: 415px){.page-header{margin-top:0;background:#ccd7e0}.page-header h1{font-size:24px}}.directory{background:#d9e1e8;border-radius:4px;box-shadow:0 0 15px rgba(0,0,0,.2)}.directory__tag{box-sizing:border-box;margin-bottom:10px}.directory__tag>a,.directory__tag>div{display:flex;align-items:center;justify-content:space-between;background:#d9e1e8;border-radius:4px;padding:15px;text-decoration:none;color:inherit;box-shadow:0 0 15px rgba(0,0,0,.2)}.directory__tag>a:hover,.directory__tag>a:active,.directory__tag>a:focus{background:#c0cdd9}.directory__tag.active>a{background:#2b90d9;cursor:default}.directory__tag.disabled>div{opacity:.5;cursor:default}.directory__tag h4{flex:1 1 auto;font-size:18px;font-weight:700;color:#000;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.directory__tag h4 .fa{color:#282c37}.directory__tag h4 small{display:block;font-weight:400;font-size:15px;margin-top:8px;color:#282c37}.directory__tag.active h4,.directory__tag.active h4 .fa,.directory__tag.active h4 small,.directory__tag.active h4 .trends__item__current{color:#000}.directory__tag .avatar-stack{flex:0 0 auto;width:120px}.directory__tag.active .avatar-stack .account__avatar{border-color:#2b90d9}.directory__tag .trends__item__current{padding-right:0}.avatar-stack{display:flex;justify-content:flex-end}.avatar-stack .account__avatar{flex:0 0 auto;width:36px;height:36px;border-radius:50%;position:relative;margin-left:-10px;background:#f2f5f7;border:2px solid #d9e1e8}.avatar-stack .account__avatar:nth-child(1){z-index:1}.avatar-stack .account__avatar:nth-child(2){z-index:2}.avatar-stack .account__avatar:nth-child(3){z-index:3}.accounts-table{width:100%}.accounts-table .account{padding:0;border:0}.accounts-table strong{font-weight:700}.accounts-table thead th{text-align:center;text-transform:uppercase;color:#282c37;font-weight:700;padding:10px}.accounts-table thead th:first-child{text-align:left}.accounts-table tbody td{padding:15px 0;vertical-align:middle;border-bottom:1px solid #c0cdd9}.accounts-table tbody tr:last-child td{border-bottom:0}.accounts-table__count{width:120px;text-align:center;font-size:15px;font-weight:500;color:#000}.accounts-table__count small{display:block;color:#282c37;font-weight:400;font-size:14px}.accounts-table__comment{width:50%;vertical-align:initial !important}@media screen and (max-width: 415px){.accounts-table tbody td.optional{display:none}}@media screen and (max-width: 415px){.moved-account-widget,.memoriam-widget,.box-widget,.contact-widget,.landing-page__information.contact-widget,.directory,.page-header{margin-bottom:0;box-shadow:none;border-radius:0}}.statuses-grid{min-height:600px}@media screen and (max-width: 640px){.statuses-grid{width:100% !important}}.statuses-grid__item{width:313.3333333333px}@media screen and (max-width: 1255px){.statuses-grid__item{width:306.6666666667px}}@media screen and (max-width: 640px){.statuses-grid__item{width:100%}}@media screen and (max-width: 415px){.statuses-grid__item{width:100vw}}.statuses-grid .detailed-status{border-radius:4px}@media screen and (max-width: 415px){.statuses-grid .detailed-status{border-top:1px solid #a6b9c9}}.statuses-grid .detailed-status.compact .detailed-status__meta{margin-top:15px}.statuses-grid .detailed-status.compact .status__content{font-size:15px;line-height:20px}.statuses-grid .detailed-status.compact .status__content .emojione{width:20px;height:20px;margin:-3px 0 0}.statuses-grid .detailed-status.compact .status__content .status__content__spoiler-link{line-height:20px;margin:0}.statuses-grid .detailed-status.compact .media-gallery,.statuses-grid .detailed-status.compact .status-card,.statuses-grid .detailed-status.compact .video-player{margin-top:15px}.notice-widget{margin-bottom:10px;color:#282c37}.notice-widget p{margin-bottom:10px}.notice-widget p:last-child{margin-bottom:0}.notice-widget a{font-size:14px;line-height:20px}.notice-widget a,.placeholder-widget a{text-decoration:none;font-weight:500;color:#2b90d9}.notice-widget a:hover,.notice-widget a:focus,.notice-widget a:active,.placeholder-widget a:hover,.placeholder-widget a:focus,.placeholder-widget a:active{text-decoration:underline}.table-of-contents{background:#e6ebf0;min-height:100%;font-size:14px;border-radius:4px}.table-of-contents li a{display:block;font-weight:500;padding:15px;overflow:hidden;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-decoration:none;color:#000;border-bottom:1px solid #ccd7e0}.table-of-contents li a:hover,.table-of-contents li a:focus,.table-of-contents li a:active{text-decoration:underline}.table-of-contents li:last-child a{border-bottom:0}.table-of-contents li ul{padding-left:20px;border-bottom:1px solid #ccd7e0}code{font-family:\"mastodon-font-monospace\",monospace;font-weight:400}.form-container{max-width:400px;padding:20px;margin:0 auto}.simple_form .input{margin-bottom:15px;overflow:hidden}.simple_form .input.hidden{margin:0}.simple_form .input.radio_buttons .radio{margin-bottom:15px}.simple_form .input.radio_buttons .radio:last-child{margin-bottom:0}.simple_form .input.radio_buttons .radio>label{position:relative;padding-left:28px}.simple_form .input.radio_buttons .radio>label input{position:absolute;top:-2px;left:0}.simple_form .input.boolean{position:relative;margin-bottom:0}.simple_form .input.boolean .label_input>label{font-family:inherit;font-size:14px;padding-top:5px;color:#000;display:block;width:auto}.simple_form .input.boolean .label_input,.simple_form .input.boolean .hint{padding-left:28px}.simple_form .input.boolean .label_input__wrapper{position:static}.simple_form .input.boolean label.checkbox{position:absolute;top:2px;left:0}.simple_form .input.boolean label a{color:#2b90d9;text-decoration:underline}.simple_form .input.boolean label a:hover,.simple_form .input.boolean label a:active,.simple_form .input.boolean label a:focus{text-decoration:none}.simple_form .input.boolean .recommended{position:absolute;margin:0 4px;margin-top:-2px}.simple_form .row{display:flex;margin:0 -5px}.simple_form .row .input{box-sizing:border-box;flex:1 1 auto;width:50%;padding:0 5px}.simple_form .hint{color:#282c37}.simple_form .hint a{color:#2b90d9}.simple_form .hint code{border-radius:3px;padding:.2em .4em;background:#fff}.simple_form .hint li{list-style:disc;margin-left:18px}.simple_form ul.hint{margin-bottom:15px}.simple_form span.hint{display:block;font-size:12px;margin-top:4px}.simple_form p.hint{margin-bottom:15px;color:#282c37}.simple_form p.hint.subtle-hint{text-align:center;font-size:12px;line-height:18px;margin-top:15px;margin-bottom:0}.simple_form .card{margin-bottom:15px}.simple_form strong{font-weight:500}.simple_form strong:lang(ja){font-weight:700}.simple_form strong:lang(ko){font-weight:700}.simple_form strong:lang(zh-CN){font-weight:700}.simple_form strong:lang(zh-HK){font-weight:700}.simple_form strong:lang(zh-TW){font-weight:700}.simple_form .input.with_floating_label .label_input{display:flex}.simple_form .input.with_floating_label .label_input>label{font-family:inherit;font-size:14px;color:#000;font-weight:500;min-width:150px;flex:0 0 auto}.simple_form .input.with_floating_label .label_input input,.simple_form .input.with_floating_label .label_input select{flex:1 1 auto}.simple_form .input.with_floating_label.select .hint{margin-top:6px;margin-left:150px}.simple_form .input.with_label .label_input>label{font-family:inherit;font-size:14px;color:#000;display:block;margin-bottom:8px;word-wrap:break-word;font-weight:500}.simple_form .input.with_label .hint{margin-top:6px}.simple_form .input.with_label ul{flex:390px}.simple_form .input.with_block_label{max-width:none}.simple_form .input.with_block_label>label{font-family:inherit;font-size:16px;color:#000;display:block;font-weight:500;padding-top:5px}.simple_form .input.with_block_label .hint{margin-bottom:15px}.simple_form .input.with_block_label ul{columns:2}.simple_form .input.datetime .label_input select{display:inline-block;width:auto;flex:0}.simple_form .required abbr{text-decoration:none;color:#c1203b}.simple_form .fields-group{margin-bottom:25px}.simple_form .fields-group .input:last-child{margin-bottom:0}.simple_form .fields-row{display:flex;margin:0 -10px;padding-top:5px;margin-bottom:25px}.simple_form .fields-row .input{max-width:none}.simple_form .fields-row__column{box-sizing:border-box;padding:0 10px;flex:1 1 auto;min-height:1px}.simple_form .fields-row__column-6{max-width:50%}.simple_form .fields-row__column .actions{margin-top:27px}.simple_form .fields-row .fields-group:last-child,.simple_form .fields-row .fields-row__column.fields-group{margin-bottom:0}@media screen and (max-width: 600px){.simple_form .fields-row{display:block;margin-bottom:0}.simple_form .fields-row__column{max-width:none}.simple_form .fields-row .fields-group:last-child,.simple_form .fields-row .fields-row__column.fields-group,.simple_form .fields-row .fields-row__column{margin-bottom:25px}}.simple_form .input.radio_buttons .radio label{margin-bottom:5px;font-family:inherit;font-size:14px;color:#000;display:block;width:auto}.simple_form .check_boxes .checkbox label{font-family:inherit;font-size:14px;color:#000;display:inline-block;width:auto;position:relative;padding-top:5px;padding-left:25px;flex:1 1 auto}.simple_form .check_boxes .checkbox input[type=checkbox]{position:absolute;left:0;top:5px;margin:0}.simple_form .input.static .label_input__wrapper{font-size:16px;padding:10px;border:1px solid #444b5d;border-radius:4px}.simple_form input[type=text],.simple_form input[type=number],.simple_form input[type=email],.simple_form input[type=password],.simple_form textarea{box-sizing:border-box;font-size:16px;color:#000;display:block;width:100%;outline:0;font-family:inherit;resize:vertical;background:#f9fafb;border:1px solid #fff;border-radius:4px;padding:10px}.simple_form input[type=text]::placeholder,.simple_form input[type=number]::placeholder,.simple_form input[type=email]::placeholder,.simple_form input[type=password]::placeholder,.simple_form textarea::placeholder{color:#1f232b}.simple_form input[type=text]:invalid,.simple_form input[type=number]:invalid,.simple_form input[type=email]:invalid,.simple_form input[type=password]:invalid,.simple_form textarea:invalid{box-shadow:none}.simple_form input[type=text]:focus:invalid:not(:placeholder-shown),.simple_form input[type=number]:focus:invalid:not(:placeholder-shown),.simple_form input[type=email]:focus:invalid:not(:placeholder-shown),.simple_form input[type=password]:focus:invalid:not(:placeholder-shown),.simple_form textarea:focus:invalid:not(:placeholder-shown){border-color:#c1203b}.simple_form input[type=text]:required:valid,.simple_form input[type=number]:required:valid,.simple_form input[type=email]:required:valid,.simple_form input[type=password]:required:valid,.simple_form textarea:required:valid{border-color:#4a905f}.simple_form input[type=text]:hover,.simple_form input[type=number]:hover,.simple_form input[type=email]:hover,.simple_form input[type=password]:hover,.simple_form textarea:hover{border-color:#fff}.simple_form input[type=text]:active,.simple_form input[type=text]:focus,.simple_form input[type=number]:active,.simple_form input[type=number]:focus,.simple_form input[type=email]:active,.simple_form input[type=email]:focus,.simple_form input[type=password]:active,.simple_form input[type=password]:focus,.simple_form textarea:active,.simple_form textarea:focus{border-color:#2b90d9;background:#f2f5f7}.simple_form .input.field_with_errors label{color:#c1203b}.simple_form .input.field_with_errors input[type=text],.simple_form .input.field_with_errors input[type=number],.simple_form .input.field_with_errors input[type=email],.simple_form .input.field_with_errors input[type=password],.simple_form .input.field_with_errors textarea,.simple_form .input.field_with_errors select{border-color:#c1203b}.simple_form .input.field_with_errors .error{display:block;font-weight:500;color:#c1203b;margin-top:4px}.simple_form .input.disabled{opacity:.5}.simple_form .actions{margin-top:30px;display:flex}.simple_form .actions.actions--top{margin-top:0;margin-bottom:30px}.simple_form button,.simple_form .button,.simple_form .block-button{display:block;width:100%;border:0;border-radius:4px;background:#2b90d9;color:#000;font-size:18px;line-height:inherit;height:auto;padding:10px;text-transform:uppercase;text-decoration:none;text-align:center;box-sizing:border-box;cursor:pointer;font-weight:500;outline:0;margin-bottom:10px;margin-right:10px}.simple_form button:last-child,.simple_form .button:last-child,.simple_form .block-button:last-child{margin-right:0}.simple_form button:hover,.simple_form .button:hover,.simple_form .block-button:hover{background-color:#2482c7}.simple_form button:active,.simple_form button:focus,.simple_form .button:active,.simple_form .button:focus,.simple_form .block-button:active,.simple_form .block-button:focus{background-color:#419bdd}.simple_form button:disabled:hover,.simple_form .button:disabled:hover,.simple_form .block-button:disabled:hover{background-color:#9bcbed}.simple_form button.negative,.simple_form .button.negative,.simple_form .block-button.negative{background:#df405a}.simple_form button.negative:hover,.simple_form .button.negative:hover,.simple_form .block-button.negative:hover{background-color:#db2a47}.simple_form button.negative:active,.simple_form button.negative:focus,.simple_form .button.negative:active,.simple_form .button.negative:focus,.simple_form .block-button.negative:active,.simple_form .block-button.negative:focus{background-color:#e3566d}.simple_form select{appearance:none;box-sizing:border-box;font-size:16px;color:#000;display:block;width:100%;outline:0;font-family:inherit;resize:vertical;background:#f9fafb url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center/auto 16px;border:1px solid #fff;border-radius:4px;padding-left:10px;padding-right:30px;height:41px}.simple_form h4{margin-bottom:15px !important}.simple_form .label_input__wrapper{position:relative}.simple_form .label_input__append{position:absolute;right:3px;top:1px;padding:10px;padding-bottom:9px;font-size:16px;color:#444b5d;font-family:inherit;pointer-events:none;cursor:default;max-width:140px;white-space:nowrap;overflow:hidden}.simple_form .label_input__append::after{content:\"\";display:block;position:absolute;top:0;right:0;bottom:1px;width:5px;background-image:linear-gradient(to right, rgba(249, 250, 251, 0), #f9fafb)}.simple_form__overlay-area{position:relative}.simple_form__overlay-area__blurred form{filter:blur(2px)}.simple_form__overlay-area__overlay{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;background:rgba(217,225,232,.65);border-radius:4px;margin-left:-4px;margin-top:-4px;padding:4px}.simple_form__overlay-area__overlay__content{text-align:center}.simple_form__overlay-area__overlay__content.rich-formatting,.simple_form__overlay-area__overlay__content.rich-formatting p{color:#000}.block-icon{display:block;margin:0 auto;margin-bottom:10px;font-size:24px}.flash-message{background:#c0cdd9;color:#282c37;border-radius:4px;padding:15px 10px;margin-bottom:30px;text-align:center}.flash-message.notice{border:1px solid rgba(74,144,95,.5);background:rgba(74,144,95,.25);color:#4a905f}.flash-message.alert{border:1px solid rgba(223,64,90,.5);background:rgba(223,64,90,.25);color:#df405a}.flash-message a{display:inline-block;color:#282c37;text-decoration:none}.flash-message a:hover{color:#000;text-decoration:underline}.flash-message p{margin-bottom:15px}.flash-message .oauth-code{outline:0;box-sizing:border-box;display:block;width:100%;border:0;padding:10px;font-family:\"mastodon-font-monospace\",monospace;background:#d9e1e8;color:#000;font-size:14px;margin:0}.flash-message .oauth-code::-moz-focus-inner{border:0}.flash-message .oauth-code::-moz-focus-inner,.flash-message .oauth-code:focus,.flash-message .oauth-code:active{outline:0 !important}.flash-message .oauth-code:focus{background:#ccd7e0}.flash-message strong{font-weight:500}.flash-message strong:lang(ja){font-weight:700}.flash-message strong:lang(ko){font-weight:700}.flash-message strong:lang(zh-CN){font-weight:700}.flash-message strong:lang(zh-HK){font-weight:700}.flash-message strong:lang(zh-TW){font-weight:700}@media screen and (max-width: 740px)and (min-width: 441px){.flash-message{margin-top:40px}}.form-footer{margin-top:30px;text-align:center}.form-footer a{color:#282c37;text-decoration:none}.form-footer a:hover{text-decoration:underline}.quick-nav{list-style:none;margin-bottom:25px;font-size:14px}.quick-nav li{display:inline-block;margin-right:10px}.quick-nav a{color:#2b90d9;text-transform:uppercase;text-decoration:none;font-weight:700}.quick-nav a:hover,.quick-nav a:focus,.quick-nav a:active{color:#217aba}.oauth-prompt,.follow-prompt{margin-bottom:30px;color:#282c37}.oauth-prompt h2,.follow-prompt h2{font-size:16px;margin-bottom:30px;text-align:center}.oauth-prompt strong,.follow-prompt strong{color:#282c37;font-weight:500}.oauth-prompt strong:lang(ja),.follow-prompt strong:lang(ja){font-weight:700}.oauth-prompt strong:lang(ko),.follow-prompt strong:lang(ko){font-weight:700}.oauth-prompt strong:lang(zh-CN),.follow-prompt strong:lang(zh-CN){font-weight:700}.oauth-prompt strong:lang(zh-HK),.follow-prompt strong:lang(zh-HK){font-weight:700}.oauth-prompt strong:lang(zh-TW),.follow-prompt strong:lang(zh-TW){font-weight:700}@media screen and (max-width: 740px)and (min-width: 441px){.oauth-prompt,.follow-prompt{margin-top:40px}}.qr-wrapper{display:flex;flex-wrap:wrap;align-items:flex-start}.qr-code{flex:0 0 auto;background:#fff;padding:4px;margin:0 10px 20px 0;box-shadow:0 0 15px rgba(0,0,0,.2);display:inline-block}.qr-code svg{display:block;margin:0}.qr-alternative{margin-bottom:20px;color:#282c37;flex:150px}.qr-alternative samp{display:block;font-size:14px}.table-form p{margin-bottom:15px}.table-form p strong{font-weight:500}.table-form p strong:lang(ja){font-weight:700}.table-form p strong:lang(ko){font-weight:700}.table-form p strong:lang(zh-CN){font-weight:700}.table-form p strong:lang(zh-HK){font-weight:700}.table-form p strong:lang(zh-TW){font-weight:700}.simple_form .warning,.table-form .warning{box-sizing:border-box;background:rgba(223,64,90,.5);color:#000;text-shadow:1px 1px 0 rgba(0,0,0,.3);box-shadow:0 2px 6px rgba(0,0,0,.4);border-radius:4px;padding:10px;margin-bottom:15px}.simple_form .warning a,.table-form .warning a{color:#000;text-decoration:underline}.simple_form .warning a:hover,.simple_form .warning a:focus,.simple_form .warning a:active,.table-form .warning a:hover,.table-form .warning a:focus,.table-form .warning a:active{text-decoration:none}.simple_form .warning strong,.table-form .warning strong{font-weight:600;display:block;margin-bottom:5px}.simple_form .warning strong:lang(ja),.table-form .warning strong:lang(ja){font-weight:700}.simple_form .warning strong:lang(ko),.table-form .warning strong:lang(ko){font-weight:700}.simple_form .warning strong:lang(zh-CN),.table-form .warning strong:lang(zh-CN){font-weight:700}.simple_form .warning strong:lang(zh-HK),.table-form .warning strong:lang(zh-HK){font-weight:700}.simple_form .warning strong:lang(zh-TW),.table-form .warning strong:lang(zh-TW){font-weight:700}.simple_form .warning strong .fa,.table-form .warning strong .fa{font-weight:400}.action-pagination{display:flex;flex-wrap:wrap;align-items:center}.action-pagination .actions,.action-pagination .pagination{flex:1 1 auto}.action-pagination .actions{padding:30px 0;padding-right:20px;flex:0 0 auto}.post-follow-actions{text-align:center;color:#282c37}.post-follow-actions div{margin-bottom:4px}.alternative-login{margin-top:20px;margin-bottom:20px}.alternative-login h4{font-size:16px;color:#000;text-align:center;margin-bottom:20px;border:0;padding:0}.alternative-login .button{display:block}.scope-danger{color:#ff5050}.form_admin_settings_site_short_description textarea,.form_admin_settings_site_description textarea,.form_admin_settings_site_extended_description textarea,.form_admin_settings_site_terms textarea,.form_admin_settings_custom_css textarea,.form_admin_settings_closed_registrations_message textarea{font-family:\"mastodon-font-monospace\",monospace}.input-copy{background:#f9fafb;border:1px solid #fff;border-radius:4px;display:flex;align-items:center;padding-right:4px;position:relative;top:1px;transition:border-color 300ms linear}.input-copy__wrapper{flex:1 1 auto}.input-copy input[type=text]{background:transparent;border:0;padding:10px;font-size:14px;font-family:\"mastodon-font-monospace\",monospace}.input-copy button{flex:0 0 auto;margin:4px;text-transform:none;font-weight:400;font-size:14px;padding:7px 18px;padding-bottom:6px;width:auto;transition:background 300ms linear}.input-copy.copied{border-color:#4a905f;transition:none}.input-copy.copied button{background:#4a905f;transition:none}.connection-prompt{margin-bottom:25px}.connection-prompt .fa-link{background-color:#e6ebf0;border-radius:100%;font-size:24px;padding:10px}.connection-prompt__column{align-items:center;display:flex;flex:1;flex-direction:column;flex-shrink:1;max-width:50%}.connection-prompt__column-sep{align-self:center;flex-grow:0;overflow:visible;position:relative;z-index:1}.connection-prompt__column p{word-break:break-word}.connection-prompt .account__avatar{margin-bottom:20px}.connection-prompt__connection{background-color:#c0cdd9;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;padding:25px 10px;position:relative;text-align:center}.connection-prompt__connection::after{background-color:#e6ebf0;content:\"\";display:block;height:100%;left:50%;position:absolute;top:0;width:1px}.connection-prompt__row{align-items:flex-start;display:flex;flex-direction:row}.card>a{display:block;text-decoration:none;color:inherit;box-shadow:0 0 15px rgba(0,0,0,.2)}@media screen and (max-width: 415px){.card>a{box-shadow:none}}.card>a:hover .card__bar,.card>a:active .card__bar,.card>a:focus .card__bar{background:#c0cdd9}.card__img{height:130px;position:relative;background:#fff;border-radius:4px 4px 0 0}.card__img img{display:block;width:100%;height:100%;margin:0;object-fit:cover;border-radius:4px 4px 0 0}@media screen and (max-width: 600px){.card__img{height:200px}}@media screen and (max-width: 415px){.card__img{display:none}}.card__bar{position:relative;padding:15px;display:flex;justify-content:flex-start;align-items:center;background:#ccd7e0;border-radius:0 0 4px 4px}@media screen and (max-width: 415px){.card__bar{border-radius:0}}.card__bar .avatar{flex:0 0 auto;width:48px;height:48px;padding-top:2px}.card__bar .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px;background:#f2f5f7;object-fit:cover}.card__bar .display-name{margin-left:15px;text-align:left}.card__bar .display-name strong{font-size:15px;color:#000;font-weight:500;overflow:hidden;text-overflow:ellipsis}.card__bar .display-name span{display:block;font-size:14px;color:#282c37;font-weight:400;overflow:hidden;text-overflow:ellipsis}.pagination{padding:30px 0;text-align:center;overflow:hidden}.pagination a,.pagination .current,.pagination .newer,.pagination .older,.pagination .page,.pagination .gap{font-size:14px;color:#000;font-weight:500;display:inline-block;padding:6px 10px;text-decoration:none}.pagination .current{background:#fff;border-radius:100px;color:#000;cursor:default;margin:0 10px}.pagination .gap{cursor:default}.pagination .older,.pagination .newer{text-transform:uppercase;color:#282c37}.pagination .older{float:left;padding-left:0}.pagination .older .fa{display:inline-block;margin-right:5px}.pagination .newer{float:right;padding-right:0}.pagination .newer .fa{display:inline-block;margin-left:5px}.pagination .disabled{cursor:default;color:#000}@media screen and (max-width: 700px){.pagination{padding:30px 20px}.pagination .page{display:none}.pagination .newer,.pagination .older{display:inline-block}}.nothing-here{background:#d9e1e8;box-shadow:0 0 15px rgba(0,0,0,.2);color:#444b5d;font-size:14px;font-weight:500;text-align:center;display:flex;justify-content:center;align-items:center;cursor:default;border-radius:4px;padding:20px;min-height:30vh}.nothing-here--under-tabs{border-radius:0 0 4px 4px}.nothing-here--flexible{box-sizing:border-box;min-height:100%}.account-role,.simple_form .recommended{display:inline-block;padding:4px 6px;cursor:default;border-radius:3px;font-size:12px;line-height:12px;font-weight:500;color:#282c37;background-color:rgba(40,44,55,.1);border:1px solid rgba(40,44,55,.5)}.account-role.moderator,.simple_form .recommended.moderator{color:#4a905f;background-color:rgba(74,144,95,.1);border-color:rgba(74,144,95,.5)}.account-role.admin,.simple_form .recommended.admin{color:#c1203b;background-color:rgba(193,32,59,.1);border-color:rgba(193,32,59,.5)}.account__header__fields{max-width:100vw;padding:0;margin:15px -15px -15px;border:0 none;border-top:1px solid #b3c3d1;border-bottom:1px solid #b3c3d1;font-size:14px;line-height:20px}.account__header__fields dl{display:flex;border-bottom:1px solid #b3c3d1}.account__header__fields dt,.account__header__fields dd{box-sizing:border-box;padding:14px;text-align:center;max-height:48px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.account__header__fields dt{font-weight:500;width:120px;flex:0 0 auto;color:#282c37;background:rgba(242,245,247,.5)}.account__header__fields dd{flex:1 1 auto;color:#282c37}.account__header__fields a{color:#2b90d9;text-decoration:none}.account__header__fields a:hover,.account__header__fields a:focus,.account__header__fields a:active{text-decoration:underline}.account__header__fields .verified{border:1px solid rgba(74,144,95,.5);background:rgba(74,144,95,.25)}.account__header__fields .verified a{color:#4a905f;font-weight:500}.account__header__fields .verified__mark{color:#4a905f}.account__header__fields dl:last-child{border-bottom:0}.directory__tag .trends__item__current{width:auto}.pending-account__header{color:#282c37}.pending-account__header a{color:#282c37;text-decoration:none}.pending-account__header a:hover,.pending-account__header a:active,.pending-account__header a:focus{text-decoration:underline}.pending-account__header strong{color:#000;font-weight:700}.pending-account__body{margin-top:10px}.activity-stream{box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;overflow:hidden;margin-bottom:10px}.activity-stream--under-tabs{border-radius:0 0 4px 4px}@media screen and (max-width: 415px){.activity-stream{margin-bottom:0;border-radius:0;box-shadow:none}}.activity-stream--headless{border-radius:0;margin:0;box-shadow:none}.activity-stream--headless .detailed-status,.activity-stream--headless .status{border-radius:0 !important}.activity-stream div[data-component]{width:100%}.activity-stream .entry{background:#d9e1e8}.activity-stream .entry .detailed-status,.activity-stream .entry .status,.activity-stream .entry .load-more{animation:none}.activity-stream .entry:last-child .detailed-status,.activity-stream .entry:last-child .status,.activity-stream .entry:last-child .load-more{border-bottom:0;border-radius:0 0 4px 4px}.activity-stream .entry:first-child .detailed-status,.activity-stream .entry:first-child .status,.activity-stream .entry:first-child .load-more{border-radius:4px 4px 0 0}.activity-stream .entry:first-child:last-child .detailed-status,.activity-stream .entry:first-child:last-child .status,.activity-stream .entry:first-child:last-child .load-more{border-radius:4px}@media screen and (max-width: 740px){.activity-stream .entry .detailed-status,.activity-stream .entry .status,.activity-stream .entry .load-more{border-radius:0 !important}}.activity-stream--highlighted .entry{background:#c0cdd9}.button.logo-button{flex:0 auto;font-size:14px;background:#2b90d9;color:#000;text-transform:none;line-height:36px;height:auto;padding:3px 15px;border:0}.button.logo-button svg{width:20px;height:auto;vertical-align:middle;margin-right:5px;fill:#000}.button.logo-button:active,.button.logo-button:focus,.button.logo-button:hover{background:#2074b1}.button.logo-button:disabled:active,.button.logo-button:disabled:focus,.button.logo-button:disabled:hover,.button.logo-button.disabled:active,.button.logo-button.disabled:focus,.button.logo-button.disabled:hover{background:#9bcbed}.button.logo-button.button--destructive:active,.button.logo-button.button--destructive:focus,.button.logo-button.button--destructive:hover{background:#df405a}@media screen and (max-width: 415px){.button.logo-button svg{display:none}}.embed .detailed-status,.public-layout .detailed-status{padding:15px}.embed .status,.public-layout .status{padding:15px 15px 15px 78px;min-height:50px}.embed .status__avatar,.public-layout .status__avatar{left:15px;top:17px}.embed .status__content,.public-layout .status__content{padding-top:5px}.embed .status__prepend,.public-layout .status__prepend{margin-left:78px;padding-top:15px}.embed .status__prepend-icon-wrapper,.public-layout .status__prepend-icon-wrapper{left:-32px}.embed .status .media-gallery,.embed .status__action-bar,.embed .status .video-player,.public-layout .status .media-gallery,.public-layout .status__action-bar,.public-layout .status .video-player{margin-top:10px}button.icon-button i.fa-retweet{background-image:url(\"data:image/svg+xml;utf8,\")}button.icon-button i.fa-retweet:hover{background-image:url(\"data:image/svg+xml;utf8,\")}button.icon-button.disabled i.fa-retweet{background-image:url(\"data:image/svg+xml;utf8,\")}.app-body{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.animated-number{display:inline-flex;flex-direction:column;align-items:stretch;overflow:hidden;position:relative}.link-button{display:block;font-size:15px;line-height:20px;color:#2b90d9;border:0;background:transparent;padding:0;cursor:pointer}.link-button:hover,.link-button:active{text-decoration:underline}.link-button:disabled{color:#9bcbed;cursor:default}.button{background-color:#2b90d9;border:10px none;border-radius:4px;box-sizing:border-box;color:#000;cursor:pointer;display:inline-block;font-family:inherit;font-size:14px;font-weight:500;height:36px;letter-spacing:0;line-height:36px;overflow:hidden;padding:0 16px;position:relative;text-align:center;text-transform:uppercase;text-decoration:none;text-overflow:ellipsis;transition:all 100ms ease-in;white-space:nowrap;width:auto}.button:active,.button:focus,.button:hover{background-color:#2074b1;transition:all 200ms ease-out}.button--destructive{transition:none}.button--destructive:active,.button--destructive:focus,.button--destructive:hover{background-color:#df405a;transition:none}.button:disabled,.button.disabled{background-color:#9bcbed;cursor:default}.button::-moz-focus-inner{border:0}.button::-moz-focus-inner,.button:focus,.button:active{outline:0 !important}.button.button-primary,.button.button-alternative,.button.button-secondary,.button.button-alternative-2{font-size:16px;line-height:36px;height:auto;text-transform:none;padding:4px 16px}.button.button-alternative{color:#000;background:#9bcbed}.button.button-alternative:active,.button.button-alternative:focus,.button.button-alternative:hover{background-color:#8ac2ea}.button.button-alternative-2{background:#b0c0cf}.button.button-alternative-2:active,.button.button-alternative-2:focus,.button.button-alternative-2:hover{background-color:#a3b6c7}.button.button-secondary{color:#282c37;background:transparent;padding:3px 15px;border:1px solid #9bcbed}.button.button-secondary:active,.button.button-secondary:focus,.button.button-secondary:hover{border-color:#8ac2ea;color:#1f232b}.button.button-secondary:disabled{opacity:.5}.button.button--block{display:block;width:100%}.column__wrapper{display:flex;flex:1 1 auto;position:relative}.icon-button{display:inline-block;padding:0;color:#606984;border:0;border-radius:4px;background:transparent;cursor:pointer;transition:all 100ms ease-in;transition-property:background-color,color}.icon-button:hover,.icon-button:active,.icon-button:focus{color:#51596f;background-color:rgba(96,105,132,.15);transition:all 200ms ease-out;transition-property:background-color,color}.icon-button:focus{background-color:rgba(96,105,132,.3)}.icon-button.disabled{color:#828ba4;background-color:transparent;cursor:default}.icon-button.active{color:#2b90d9}.icon-button::-moz-focus-inner{border:0}.icon-button::-moz-focus-inner,.icon-button:focus,.icon-button:active{outline:0 !important}.icon-button.inverted{color:#282c37}.icon-button.inverted:hover,.icon-button.inverted:active,.icon-button.inverted:focus{color:#373d4c;background-color:rgba(40,44,55,.15)}.icon-button.inverted:focus{background-color:rgba(40,44,55,.3)}.icon-button.inverted.disabled{color:#191b22;background-color:transparent}.icon-button.inverted.active{color:#2b90d9}.icon-button.inverted.active.disabled{color:#1d6ca4}.icon-button.overlayed{box-sizing:content-box;background:rgba(255,255,255,.6);color:rgba(0,0,0,.7);border-radius:4px;padding:2px}.icon-button.overlayed:hover{background:rgba(255,255,255,.9)}.text-icon-button{color:#282c37;border:0;border-radius:4px;background:transparent;cursor:pointer;font-weight:600;font-size:11px;padding:0 3px;line-height:27px;outline:0;transition:all 100ms ease-in;transition-property:background-color,color}.text-icon-button:hover,.text-icon-button:active,.text-icon-button:focus{color:#373d4c;background-color:rgba(40,44,55,.15);transition:all 200ms ease-out;transition-property:background-color,color}.text-icon-button:focus{background-color:rgba(40,44,55,.3)}.text-icon-button.disabled{color:#000;background-color:transparent;cursor:default}.text-icon-button.active{color:#2b90d9}.text-icon-button::-moz-focus-inner{border:0}.text-icon-button::-moz-focus-inner,.text-icon-button:focus,.text-icon-button:active{outline:0 !important}.dropdown-menu{position:absolute}.invisible{font-size:0;line-height:0;display:inline-block;width:0;height:0;position:absolute}.invisible img,.invisible svg{margin:0 !important;border:0 !important;padding:0 !important;width:0 !important;height:0 !important}.ellipsis::after{content:\"…\"}.compose-form{padding:10px}.compose-form__sensitive-button{padding:10px;padding-top:0;font-size:14px;font-weight:500}.compose-form__sensitive-button.active{color:#2b90d9}.compose-form__sensitive-button input[type=checkbox]{display:none}.compose-form__sensitive-button .checkbox{display:inline-block;position:relative;border:1px solid #9bcbed;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:4px;vertical-align:middle}.compose-form__sensitive-button .checkbox.active{border-color:#2b90d9;background:#2b90d9}.compose-form .compose-form__warning{color:#000;margin-bottom:10px;background:#9bcbed;box-shadow:0 2px 6px rgba(0,0,0,.3);padding:8px 10px;border-radius:4px;font-size:13px;font-weight:400}.compose-form .compose-form__warning strong{color:#000;font-weight:500}.compose-form .compose-form__warning strong:lang(ja){font-weight:700}.compose-form .compose-form__warning strong:lang(ko){font-weight:700}.compose-form .compose-form__warning strong:lang(zh-CN){font-weight:700}.compose-form .compose-form__warning strong:lang(zh-HK){font-weight:700}.compose-form .compose-form__warning strong:lang(zh-TW){font-weight:700}.compose-form .compose-form__warning a{color:#282c37;font-weight:500;text-decoration:underline}.compose-form .compose-form__warning a:hover,.compose-form .compose-form__warning a:active,.compose-form .compose-form__warning a:focus{text-decoration:none}.compose-form .emoji-picker-dropdown{position:absolute;top:0;right:0}.compose-form .compose-form__autosuggest-wrapper{position:relative}.compose-form .autosuggest-textarea,.compose-form .autosuggest-input,.compose-form .spoiler-input{position:relative;width:100%}.compose-form .spoiler-input{height:0;transform-origin:bottom;opacity:0}.compose-form .spoiler-input.spoiler-input--visible{height:36px;margin-bottom:11px;opacity:1}.compose-form .autosuggest-textarea__textarea,.compose-form .spoiler-input__input{display:block;box-sizing:border-box;width:100%;margin:0;color:#000;background:#fff;padding:10px;font-family:inherit;font-size:14px;resize:vertical;border:0;outline:0}.compose-form .autosuggest-textarea__textarea::placeholder,.compose-form .spoiler-input__input::placeholder{color:#444b5d}.compose-form .autosuggest-textarea__textarea:focus,.compose-form .spoiler-input__input:focus{outline:0}@media screen and (max-width: 600px){.compose-form .autosuggest-textarea__textarea,.compose-form .spoiler-input__input{font-size:16px}}.compose-form .spoiler-input__input{border-radius:4px}.compose-form .autosuggest-textarea__textarea{min-height:100px;border-radius:4px 4px 0 0;padding-bottom:0;padding-right:32px;resize:none;scrollbar-color:initial}.compose-form .autosuggest-textarea__textarea::-webkit-scrollbar{all:unset}@media screen and (max-width: 600px){.compose-form .autosuggest-textarea__textarea{height:100px !important;resize:vertical}}.compose-form .autosuggest-textarea__suggestions-wrapper{position:relative;height:0}.compose-form .autosuggest-textarea__suggestions{box-sizing:border-box;display:none;position:absolute;top:100%;width:100%;z-index:99;box-shadow:4px 4px 6px rgba(0,0,0,.4);background:#282c37;border-radius:0 0 4px 4px;color:#000;font-size:14px;padding:6px}.compose-form .autosuggest-textarea__suggestions.autosuggest-textarea__suggestions--visible{display:block}.compose-form .autosuggest-textarea__suggestions__item{padding:10px;cursor:pointer;border-radius:4px}.compose-form .autosuggest-textarea__suggestions__item:hover,.compose-form .autosuggest-textarea__suggestions__item:focus,.compose-form .autosuggest-textarea__suggestions__item:active,.compose-form .autosuggest-textarea__suggestions__item.selected{background:#3d4455}.compose-form .autosuggest-account,.compose-form .autosuggest-emoji,.compose-form .autosuggest-hashtag{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;line-height:18px;font-size:14px}.compose-form .autosuggest-hashtag{justify-content:space-between}.compose-form .autosuggest-hashtag__name{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.compose-form .autosuggest-hashtag strong{font-weight:500}.compose-form .autosuggest-hashtag__uses{flex:0 0 auto;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.compose-form .autosuggest-account-icon,.compose-form .autosuggest-emoji img{display:block;margin-right:8px;width:16px;height:16px}.compose-form .autosuggest-account .display-name__account{color:#282c37}.compose-form .compose-form__modifiers{color:#000;font-family:inherit;font-size:14px;background:#fff}.compose-form .compose-form__modifiers .compose-form__upload-wrapper{overflow:hidden}.compose-form .compose-form__modifiers .compose-form__uploads-wrapper{display:flex;flex-direction:row;padding:5px;flex-wrap:wrap}.compose-form .compose-form__modifiers .compose-form__upload{flex:1 1 0;min-width:40%;margin:5px}.compose-form .compose-form__modifiers .compose-form__upload__actions{background:linear-gradient(180deg, rgba(0, 0, 0, 0.8) 0, rgba(0, 0, 0, 0.35) 80%, transparent);display:flex;align-items:flex-start;justify-content:space-between;opacity:0;transition:opacity .1s ease}.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button{flex:0 1 auto;color:#282c37;font-size:14px;font-weight:500;padding:10px;font-family:inherit}.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button:hover,.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button:focus,.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button:active{color:#191b22}.compose-form .compose-form__modifiers .compose-form__upload__actions.active{opacity:1}.compose-form .compose-form__modifiers .compose-form__upload-description{position:absolute;z-index:2;bottom:0;left:0;right:0;box-sizing:border-box;background:linear-gradient(0deg, rgba(0, 0, 0, 0.8) 0, rgba(0, 0, 0, 0.35) 80%, transparent);padding:10px;opacity:0;transition:opacity .1s ease}.compose-form .compose-form__modifiers .compose-form__upload-description textarea{background:transparent;color:#282c37;border:0;padding:0;margin:0;width:100%;font-family:inherit;font-size:14px;font-weight:500}.compose-form .compose-form__modifiers .compose-form__upload-description textarea:focus{color:#fff}.compose-form .compose-form__modifiers .compose-form__upload-description textarea::placeholder{opacity:.75;color:#282c37}.compose-form .compose-form__modifiers .compose-form__upload-description.active{opacity:1}.compose-form .compose-form__modifiers .compose-form__upload-thumbnail{border-radius:4px;background-color:#000;background-position:center;background-size:cover;background-repeat:no-repeat;height:140px;width:100%;overflow:hidden}.compose-form .compose-form__buttons-wrapper{padding:10px;background:#fff;border-radius:0 0 4px 4px;display:flex;justify-content:space-between;flex:0 0 auto}.compose-form .compose-form__buttons-wrapper .compose-form__buttons{display:flex}.compose-form .compose-form__buttons-wrapper .compose-form__buttons .compose-form__upload-button-icon{line-height:27px}.compose-form .compose-form__buttons-wrapper .compose-form__buttons .compose-form__sensitive-button{display:none}.compose-form .compose-form__buttons-wrapper .compose-form__buttons .compose-form__sensitive-button.compose-form__sensitive-button--visible{display:block}.compose-form .compose-form__buttons-wrapper .compose-form__buttons .compose-form__sensitive-button .compose-form__sensitive-button__icon{line-height:27px}.compose-form .compose-form__buttons-wrapper .icon-button,.compose-form .compose-form__buttons-wrapper .text-icon-button{box-sizing:content-box;padding:0 3px}.compose-form .compose-form__buttons-wrapper .character-counter__wrapper{align-self:center;margin-right:4px}.compose-form .compose-form__publish{display:flex;justify-content:flex-end;min-width:0;flex:0 0 auto}.compose-form .compose-form__publish .compose-form__publish-button-wrapper{overflow:hidden;padding-top:10px}.character-counter{cursor:default;font-family:\"mastodon-font-sans-serif\",sans-serif;font-size:14px;font-weight:600;color:#282c37}.character-counter.character-counter--over{color:#ff5050}.no-reduce-motion .spoiler-input{transition:height .4s ease,opacity .4s ease}.emojione{font-size:inherit;vertical-align:middle;object-fit:contain;margin:-0.2ex .15em .2ex;width:16px;height:16px}.emojione img{width:auto}.reply-indicator{border-radius:4px;margin-bottom:10px;background:#9bcbed;padding:10px;min-height:23px;overflow-y:auto;flex:0 2 auto}.reply-indicator__header{margin-bottom:5px;overflow:hidden}.reply-indicator__cancel{float:right;line-height:24px}.reply-indicator__display-name{color:#000;display:block;max-width:100%;line-height:24px;overflow:hidden;padding-right:25px;text-decoration:none}.reply-indicator__display-avatar{float:left;margin-right:5px}.status__content--with-action{cursor:pointer}.status__content,.reply-indicator__content{position:relative;font-size:15px;line-height:20px;word-wrap:break-word;font-weight:400;overflow:hidden;text-overflow:ellipsis;padding-top:2px;color:#000}.status__content:focus,.reply-indicator__content:focus{outline:0}.status__content.status__content--with-spoiler,.reply-indicator__content.status__content--with-spoiler{white-space:normal}.status__content.status__content--with-spoiler .status__content__text,.reply-indicator__content.status__content--with-spoiler .status__content__text{white-space:pre-wrap}.status__content .emojione,.reply-indicator__content .emojione{width:20px;height:20px;margin:-3px 0 0}.status__content img,.reply-indicator__content img{max-width:100%;max-height:400px;object-fit:contain}.status__content p,.reply-indicator__content p{margin-bottom:20px;white-space:pre-wrap}.status__content p:last-child,.reply-indicator__content p:last-child{margin-bottom:0}.status__content a,.reply-indicator__content a{color:#d8a070;text-decoration:none}.status__content a:hover,.reply-indicator__content a:hover{text-decoration:underline}.status__content a:hover .fa,.reply-indicator__content a:hover .fa{color:#353a48}.status__content a.mention:hover,.reply-indicator__content a.mention:hover{text-decoration:none}.status__content a.mention:hover span,.reply-indicator__content a.mention:hover span{text-decoration:underline}.status__content a .fa,.reply-indicator__content a .fa{color:#444b5d}.status__content a.unhandled-link,.reply-indicator__content a.unhandled-link{color:#217aba}.status__content .status__content__spoiler-link,.reply-indicator__content .status__content__spoiler-link{background:#606984}.status__content .status__content__spoiler-link:hover,.reply-indicator__content .status__content__spoiler-link:hover{background:#51596f;text-decoration:none}.status__content .status__content__spoiler-link::-moz-focus-inner,.reply-indicator__content .status__content__spoiler-link::-moz-focus-inner{border:0}.status__content .status__content__spoiler-link::-moz-focus-inner,.status__content .status__content__spoiler-link:focus,.status__content .status__content__spoiler-link:active,.reply-indicator__content .status__content__spoiler-link::-moz-focus-inner,.reply-indicator__content .status__content__spoiler-link:focus,.reply-indicator__content .status__content__spoiler-link:active{outline:0 !important}.status__content .status__content__text,.reply-indicator__content .status__content__text{display:none}.status__content .status__content__text.status__content__text--visible,.reply-indicator__content .status__content__text.status__content__text--visible{display:block}.announcements__item__content{word-wrap:break-word;overflow-y:auto}.announcements__item__content .emojione{width:20px;height:20px;margin:-3px 0 0}.announcements__item__content p{margin-bottom:10px;white-space:pre-wrap}.announcements__item__content p:last-child{margin-bottom:0}.announcements__item__content a{color:#282c37;text-decoration:none}.announcements__item__content a:hover{text-decoration:underline}.announcements__item__content a.mention:hover{text-decoration:none}.announcements__item__content a.mention:hover span{text-decoration:underline}.announcements__item__content a.unhandled-link{color:#217aba}.status__content.status__content--collapsed{max-height:300px}.status__content__read-more-button{display:block;font-size:15px;line-height:20px;color:#217aba;border:0;background:transparent;padding:0;padding-top:8px;text-decoration:none}.status__content__read-more-button:hover,.status__content__read-more-button:active{text-decoration:underline}.status__content__spoiler-link{display:inline-block;border-radius:2px;background:transparent;border:0;color:#000;font-weight:700;font-size:11px;padding:0 6px;text-transform:uppercase;line-height:20px;cursor:pointer;vertical-align:middle}.status__wrapper--filtered{color:#444b5d;border:0;font-size:inherit;text-align:center;line-height:inherit;margin:0;padding:15px;box-sizing:border-box;width:100%;clear:both;border-bottom:1px solid #c0cdd9}.status__prepend-icon-wrapper{left:-26px;position:absolute}.focusable:focus{outline:0;background:#ccd7e0}.focusable:focus .status.status-direct{background:#b3c3d1}.focusable:focus .status.status-direct.muted{background:transparent}.focusable:focus .detailed-status,.focusable:focus .detailed-status__action-bar{background:#c0cdd9}.status{padding:8px 10px;padding-left:68px;position:relative;min-height:54px;border-bottom:1px solid #c0cdd9;cursor:default;opacity:1;animation:fade 150ms linear}@supports(-ms-overflow-style: -ms-autohiding-scrollbar){.status{padding-right:26px}}@keyframes fade{0%{opacity:0}100%{opacity:1}}.status .video-player,.status .audio-player{margin-top:8px}.status.status-direct:not(.read){background:#c0cdd9;border-bottom-color:#b3c3d1}.status.light .status__relative-time{color:#444b5d}.status.light .status__display-name{color:#000}.status.light .display-name{color:#444b5d}.status.light .display-name strong{color:#000}.status.light .status__content{color:#000}.status.light .status__content a{color:#2b90d9}.status.light .status__content a.status__content__spoiler-link{color:#000;background:#9bcbed}.status.light .status__content a.status__content__spoiler-link:hover{background:#78b9e7}.notification-favourite .status.status-direct{background:transparent}.notification-favourite .status.status-direct .icon-button.disabled{color:#444a5e}.status__relative-time,.notification__relative_time{color:#444b5d;float:right;font-size:14px}.status__display-name{color:#444b5d}.status__info .status__display-name{display:block;max-width:100%;padding-right:25px}.status__info{font-size:15px}.status-check-box{border-bottom:1px solid #282c37;display:flex}.status-check-box .status-check-box__status{margin:10px 0 10px 10px;flex:1;overflow:hidden}.status-check-box .status-check-box__status .media-gallery{max-width:250px}.status-check-box .status-check-box__status .status__content{padding:0;white-space:normal}.status-check-box .status-check-box__status .video-player,.status-check-box .status-check-box__status .audio-player{margin-top:8px;max-width:250px}.status-check-box .status-check-box__status .media-gallery__item-thumbnail{cursor:default}.status-check-box-toggle{align-items:center;display:flex;flex:0 0 auto;justify-content:center;padding:10px}.status__prepend{margin-left:68px;color:#444b5d;padding:8px 0;padding-bottom:2px;font-size:14px;position:relative}.status__prepend .status__display-name strong{color:#444b5d}.status__prepend>span{display:block;overflow:hidden;text-overflow:ellipsis}.status__action-bar{align-items:center;display:flex;margin-top:8px}.status__action-bar__counter{display:inline-flex;margin-right:11px;align-items:center}.status__action-bar__counter .status__action-bar-button{margin-right:4px}.status__action-bar__counter__label{display:inline-block;width:14px;font-size:12px;font-weight:500;color:#606984}.status__action-bar-button{margin-right:18px}.status__action-bar-dropdown{height:23.15px;width:23.15px}.detailed-status__action-bar-dropdown{flex:1 1 auto;display:flex;align-items:center;justify-content:center;position:relative}.detailed-status{background:#ccd7e0;padding:14px 10px}.detailed-status--flex{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-start}.detailed-status--flex .status__content,.detailed-status--flex .detailed-status__meta{flex:100%}.detailed-status .status__content{font-size:19px;line-height:24px}.detailed-status .status__content .emojione{width:24px;height:24px;margin:-1px 0 0}.detailed-status .status__content .status__content__spoiler-link{line-height:24px;margin:-1px 0 0}.detailed-status .video-player,.detailed-status .audio-player{margin-top:8px}.detailed-status__meta{margin-top:15px;color:#444b5d;font-size:14px;line-height:18px}.detailed-status__action-bar{background:#ccd7e0;border-top:1px solid #c0cdd9;border-bottom:1px solid #c0cdd9;display:flex;flex-direction:row;padding:10px 0}.detailed-status__link{color:inherit;text-decoration:none}.detailed-status__favorites,.detailed-status__reblogs{display:inline-block;font-weight:500;font-size:12px;margin-left:6px}.reply-indicator__content{color:#000;font-size:14px}.reply-indicator__content a{color:#282c37}.domain{padding:10px;border-bottom:1px solid #c0cdd9}.domain .domain__domain-name{flex:1 1 auto;display:block;color:#000;text-decoration:none;font-size:14px;font-weight:500}.domain__wrapper{display:flex}.domain_buttons{height:18px;padding:10px;white-space:nowrap}.account{padding:10px;border-bottom:1px solid #c0cdd9}.account.compact{padding:0;border-bottom:0}.account.compact .account__avatar-wrapper{margin-left:0}.account .account__display-name{flex:1 1 auto;display:block;color:#282c37;overflow:hidden;text-decoration:none;font-size:14px}.account__wrapper{display:flex}.account__avatar-wrapper{float:left;margin-left:12px;margin-right:12px}.account__avatar{border-radius:4px;background:transparent no-repeat;background-position:50%;background-clip:padding-box;position:relative}.account__avatar-inline{display:inline-block;vertical-align:middle;margin-right:5px}.account__avatar-composite{border-radius:4px;background:transparent no-repeat;background-position:50%;background-clip:padding-box;border-radius:50%;overflow:hidden;position:relative}.account__avatar-composite>div{float:left;position:relative;box-sizing:border-box}.account__avatar-composite__label{display:block;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);color:#000;text-shadow:1px 1px 2px #000;font-weight:700;font-size:15px}a .account__avatar{cursor:pointer}.account__avatar-overlay{width:48px;height:48px;background-size:48px 48px}.account__avatar-overlay-base{border-radius:4px;background:transparent no-repeat;background-position:50%;background-clip:padding-box;width:36px;height:36px;background-size:36px 36px}.account__avatar-overlay-overlay{border-radius:4px;background:transparent no-repeat;background-position:50%;background-clip:padding-box;width:24px;height:24px;background-size:24px 24px;position:absolute;bottom:0;right:0;z-index:1}.account__relationship{height:18px;padding:10px;white-space:nowrap}.account__disclaimer{padding:10px;border-top:1px solid #c0cdd9;color:#444b5d}.account__disclaimer strong{font-weight:500}.account__disclaimer strong:lang(ja){font-weight:700}.account__disclaimer strong:lang(ko){font-weight:700}.account__disclaimer strong:lang(zh-CN){font-weight:700}.account__disclaimer strong:lang(zh-HK){font-weight:700}.account__disclaimer strong:lang(zh-TW){font-weight:700}.account__disclaimer a{font-weight:500;color:inherit;text-decoration:underline}.account__disclaimer a:hover,.account__disclaimer a:focus,.account__disclaimer a:active{text-decoration:none}.account__action-bar{border-top:1px solid #c0cdd9;border-bottom:1px solid #c0cdd9;line-height:36px;overflow:hidden;flex:0 0 auto;display:flex}.account__action-bar-dropdown{padding:10px}.account__action-bar-dropdown .icon-button{vertical-align:middle}.account__action-bar-dropdown .dropdown--active .dropdown__content.dropdown__right{left:6px;right:initial}.account__action-bar-dropdown .dropdown--active::after{bottom:initial;margin-left:11px;margin-top:-7px;right:initial}.account__action-bar-links{display:flex;flex:1 1 auto;line-height:18px;text-align:center}.account__action-bar__tab{text-decoration:none;overflow:hidden;flex:0 1 100%;border-right:1px solid #c0cdd9;padding:10px 0;border-bottom:4px solid transparent}.account__action-bar__tab.active{border-bottom:4px solid #2b90d9}.account__action-bar__tab>span{display:block;text-transform:uppercase;font-size:11px;color:#282c37}.account__action-bar__tab strong{display:block;font-size:15px;font-weight:500;color:#000}.account__action-bar__tab strong:lang(ja){font-weight:700}.account__action-bar__tab strong:lang(ko){font-weight:700}.account__action-bar__tab strong:lang(zh-CN){font-weight:700}.account__action-bar__tab strong:lang(zh-HK){font-weight:700}.account__action-bar__tab strong:lang(zh-TW){font-weight:700}.account-authorize{padding:14px 10px}.account-authorize .detailed-status__display-name{display:block;margin-bottom:15px;overflow:hidden}.account-authorize__avatar{float:left;margin-right:10px}.status__display-name,.status__relative-time,.detailed-status__display-name,.detailed-status__datetime,.detailed-status__application,.account__display-name{text-decoration:none}.status__display-name strong,.account__display-name strong{color:#000}.muted .emojione{opacity:.5}.status__display-name:hover strong,.reply-indicator__display-name:hover strong,.detailed-status__display-name:hover strong,a.account__display-name:hover strong{text-decoration:underline}.account__display-name strong{display:block;overflow:hidden;text-overflow:ellipsis}.detailed-status__application,.detailed-status__datetime{color:inherit}.detailed-status .button.logo-button{margin-bottom:15px}.detailed-status__display-name{color:#282c37;display:block;line-height:24px;margin-bottom:15px;overflow:hidden}.detailed-status__display-name strong,.detailed-status__display-name span{display:block;text-overflow:ellipsis;overflow:hidden}.detailed-status__display-name strong{font-size:16px;color:#000}.detailed-status__display-avatar{float:left;margin-right:10px}.status__avatar{height:48px;left:10px;position:absolute;top:10px;width:48px}.status__expand{width:68px;position:absolute;left:0;top:0;height:100%;cursor:pointer}.muted .status__content,.muted .status__content p,.muted .status__content a{color:#444b5d}.muted .status__display-name strong{color:#444b5d}.muted .status__avatar{opacity:.5}.muted a.status__content__spoiler-link{background:#b0c0cf;color:#000}.muted a.status__content__spoiler-link:hover{background:#9aaec2;text-decoration:none}.notification__message{margin:0 10px 0 68px;padding:8px 0 0;cursor:default;color:#282c37;font-size:15px;line-height:22px;position:relative}.notification__message .fa{color:#2b90d9}.notification__message>span{display:inline;overflow:hidden;text-overflow:ellipsis}.notification__favourite-icon-wrapper{left:-26px;position:absolute}.notification__favourite-icon-wrapper .star-icon{color:#ca8f04}.star-icon.active{color:#ca8f04}.bookmark-icon.active{color:#ff5050}.no-reduce-motion .icon-button.star-icon.activate>.fa-star{animation:spring-rotate-in 1s linear}.no-reduce-motion .icon-button.star-icon.deactivate>.fa-star{animation:spring-rotate-out 1s linear}.notification__display-name{color:inherit;font-weight:500;text-decoration:none}.notification__display-name:hover{color:#000;text-decoration:underline}.notification__relative_time{float:right}.display-name{display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.display-name__html{font-weight:500}.display-name__account{font-size:14px}.status__relative-time:hover,.detailed-status__datetime:hover{text-decoration:underline}.image-loader{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center;flex-direction:column}.image-loader .image-loader__preview-canvas{max-width:100%;max-height:80%;background:url(\"~images/void.png\") repeat;object-fit:contain}.image-loader .loading-bar{position:relative}.image-loader.image-loader--amorphous .image-loader__preview-canvas{display:none}.zoomable-image{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center}.zoomable-image img{max-width:100%;max-height:80%;width:auto;height:auto;object-fit:contain}.navigation-bar{padding:10px;display:flex;align-items:center;flex-shrink:0;cursor:default;color:#282c37}.navigation-bar strong{color:#282c37}.navigation-bar a{color:inherit}.navigation-bar .permalink{text-decoration:none}.navigation-bar .navigation-bar__actions{position:relative}.navigation-bar .navigation-bar__actions .icon-button.close{position:absolute;pointer-events:none;transform:scale(0, 1) translate(-100%, 0);opacity:0}.navigation-bar .navigation-bar__actions .compose__action-bar .icon-button{pointer-events:auto;transform:scale(1, 1) translate(0, 0);opacity:1}.navigation-bar__profile{flex:1 1 auto;margin-left:8px;line-height:20px;margin-top:-1px;overflow:hidden}.navigation-bar__profile-account{display:block;font-weight:500;overflow:hidden;text-overflow:ellipsis}.navigation-bar__profile-edit{color:inherit;text-decoration:none}.dropdown{display:inline-block}.dropdown__content{display:none;position:absolute}.dropdown-menu__separator{border-bottom:1px solid #393f4f;margin:5px 7px 6px;height:0}.dropdown-menu{background:#282c37;padding:4px 0;border-radius:4px;box-shadow:2px 4px 15px rgba(0,0,0,.4);z-index:9999}.dropdown-menu ul{list-style:none}.dropdown-menu.left{transform-origin:100% 50%}.dropdown-menu.top{transform-origin:50% 100%}.dropdown-menu.bottom{transform-origin:50% 0}.dropdown-menu.right{transform-origin:0 50%}.dropdown-menu__arrow{position:absolute;width:0;height:0;border:0 solid transparent}.dropdown-menu__arrow.left{right:-5px;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#282c37}.dropdown-menu__arrow.top{bottom:-5px;margin-left:-7px;border-width:5px 7px 0;border-top-color:#282c37}.dropdown-menu__arrow.bottom{top:-5px;margin-left:-7px;border-width:0 7px 5px;border-bottom-color:#282c37}.dropdown-menu__arrow.right{left:-5px;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#282c37}.dropdown-menu__item a{font-size:13px;line-height:18px;display:block;padding:4px 14px;box-sizing:border-box;text-decoration:none;background:#282c37;color:#000;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown-menu__item a:focus,.dropdown-menu__item a:hover,.dropdown-menu__item a:active{background:#2b90d9;color:#282c37;outline:0}.dropdown--active .dropdown__content{display:block;line-height:18px;max-width:311px;right:0;text-align:left;z-index:9999}.dropdown--active .dropdown__content>ul{list-style:none;background:#282c37;padding:4px 0;border-radius:4px;box-shadow:0 0 15px rgba(0,0,0,.4);min-width:140px;position:relative}.dropdown--active .dropdown__content.dropdown__right{right:0}.dropdown--active .dropdown__content.dropdown__left>ul{left:-98px}.dropdown--active .dropdown__content>ul>li>a{font-size:13px;line-height:18px;display:block;padding:4px 14px;box-sizing:border-box;text-decoration:none;background:#282c37;color:#000;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown--active .dropdown__content>ul>li>a:focus{outline:0}.dropdown--active .dropdown__content>ul>li>a:hover{background:#2b90d9;color:#282c37}.dropdown__icon{vertical-align:middle}.columns-area{display:flex;flex:1 1 auto;flex-direction:row;justify-content:flex-start;overflow-x:auto;position:relative}.columns-area.unscrollable{overflow-x:hidden}.columns-area__panels{display:flex;justify-content:center;width:100%;height:100%;min-height:100vh}.columns-area__panels__pane{height:100%;overflow:hidden;pointer-events:none;display:flex;justify-content:flex-end;min-width:285px}.columns-area__panels__pane--start{justify-content:flex-start}.columns-area__panels__pane__inner{position:fixed;width:285px;pointer-events:auto;height:100%}.columns-area__panels__main{box-sizing:border-box;width:100%;max-width:600px;flex:0 0 auto;display:flex;flex-direction:column}@media screen and (min-width: 415px){.columns-area__panels__main{padding:0 10px}}.tabs-bar__wrapper{background:#f2f5f7;position:sticky;top:0;z-index:2;padding-top:0}@media screen and (min-width: 415px){.tabs-bar__wrapper{padding-top:10px}}.tabs-bar__wrapper .tabs-bar{margin-bottom:0}@media screen and (min-width: 415px){.tabs-bar__wrapper .tabs-bar{margin-bottom:10px}}.react-swipeable-view-container,.react-swipeable-view-container .columns-area,.react-swipeable-view-container .drawer,.react-swipeable-view-container .column{height:100%}.react-swipeable-view-container>*{display:flex;align-items:center;justify-content:center;height:100%}.column{width:350px;position:relative;box-sizing:border-box;display:flex;flex-direction:column}.column>.scrollable{background:#d9e1e8;border-bottom-left-radius:2px;border-bottom-right-radius:2px}.ui{flex:0 0 auto;display:flex;flex-direction:column;width:100%;height:100%}.drawer{width:330px;box-sizing:border-box;display:flex;flex-direction:column;overflow-y:hidden}.drawer__tab{display:block;flex:1 1 auto;padding:15px 5px 13px;color:#282c37;text-decoration:none;text-align:center;font-size:16px;border-bottom:2px solid transparent}.column,.drawer{flex:1 1 auto;overflow:hidden}@media screen and (min-width: 631px){.columns-area{padding:0}.column,.drawer{flex:0 0 auto;padding:10px;padding-left:5px;padding-right:5px}.column:first-child,.drawer:first-child{padding-left:10px}.column:last-child,.drawer:last-child{padding-right:10px}.columns-area>div .column,.columns-area>div .drawer{padding-left:5px;padding-right:5px}}.tabs-bar{box-sizing:border-box;display:flex;background:#c0cdd9;flex:0 0 auto;overflow-y:auto}.tabs-bar__link{display:block;flex:1 1 auto;padding:15px 10px;padding-bottom:13px;color:#000;text-decoration:none;text-align:center;font-size:14px;font-weight:500;border-bottom:2px solid #c0cdd9;transition:all 50ms linear;transition-property:border-bottom,background,color}.tabs-bar__link .fa{font-weight:400;font-size:16px}@media screen and (min-width: 631px){.tabs-bar__link:hover,.tabs-bar__link:focus,.tabs-bar__link:active{background:#adbecd;border-bottom-color:#adbecd}}.tabs-bar__link.active{border-bottom:2px solid #2b90d9;color:#2b90d9}.tabs-bar__link span{margin-left:5px;display:none}@media screen and (min-width: 600px){.tabs-bar__link span{display:inline}}.columns-area--mobile{flex-direction:column;width:100%;height:100%;margin:0 auto}.columns-area--mobile .column,.columns-area--mobile .drawer{width:100%;height:100%;padding:0}.columns-area--mobile .directory__list{display:grid;grid-gap:10px;grid-template-columns:minmax(0, 50%) minmax(0, 50%)}@media screen and (max-width: 415px){.columns-area--mobile .directory__list{display:block}}.columns-area--mobile .directory__card{margin-bottom:0}.columns-area--mobile .filter-form{display:flex}.columns-area--mobile .autosuggest-textarea__textarea{font-size:16px}.columns-area--mobile .search__input{line-height:18px;font-size:16px;padding:15px;padding-right:30px}.columns-area--mobile .search__icon .fa{top:15px}.columns-area--mobile .scrollable{overflow:visible}@supports(display: grid){.columns-area--mobile .scrollable{contain:content}}@media screen and (min-width: 415px){.columns-area--mobile{padding:10px 0;padding-top:0}}@media screen and (min-width: 630px){.columns-area--mobile .detailed-status{padding:15px}.columns-area--mobile .detailed-status .media-gallery,.columns-area--mobile .detailed-status .video-player,.columns-area--mobile .detailed-status .audio-player{margin-top:15px}.columns-area--mobile .account__header__bar{padding:5px 10px}.columns-area--mobile .navigation-bar,.columns-area--mobile .compose-form{padding:15px}.columns-area--mobile .compose-form .compose-form__publish .compose-form__publish-button-wrapper{padding-top:15px}.columns-area--mobile .status{padding:15px 15px 15px 78px;min-height:50px}.columns-area--mobile .status__avatar{left:15px;top:17px}.columns-area--mobile .status__content{padding-top:5px}.columns-area--mobile .status__prepend{margin-left:78px;padding-top:15px}.columns-area--mobile .status__prepend-icon-wrapper{left:-32px}.columns-area--mobile .status .media-gallery,.columns-area--mobile .status__action-bar,.columns-area--mobile .status .video-player,.columns-area--mobile .status .audio-player{margin-top:10px}.columns-area--mobile .account{padding:15px 10px}.columns-area--mobile .account__header__bio{margin:0 -10px}.columns-area--mobile .notification__message{margin-left:78px;padding-top:15px}.columns-area--mobile .notification__favourite-icon-wrapper{left:-32px}.columns-area--mobile .notification .status{padding-top:8px}.columns-area--mobile .notification .account{padding-top:8px}.columns-area--mobile .notification .account__avatar-wrapper{margin-left:17px;margin-right:15px}}.floating-action-button{position:fixed;display:flex;justify-content:center;align-items:center;width:3.9375rem;height:3.9375rem;bottom:1.3125rem;right:1.3125rem;background:#3897db;color:#fff;border-radius:50%;font-size:21px;line-height:21px;text-decoration:none;box-shadow:2px 3px 9px rgba(0,0,0,.4)}.floating-action-button:hover,.floating-action-button:focus,.floating-action-button:active{background:#227dbe}@media screen and (min-width: 415px){.tabs-bar{width:100%}.react-swipeable-view-container .columns-area--mobile{height:calc(100% - 10px) !important}.getting-started__wrapper,.getting-started__trends,.search{margin-bottom:10px}.getting-started__panel{margin:10px 0}.column,.drawer{min-width:330px}}@media screen and (max-width: 895px){.columns-area__panels__pane--compositional{display:none}}@media screen and (min-width: 895px){.floating-action-button,.tabs-bar__link.optional{display:none}.search-page .search{display:none}}@media screen and (max-width: 1190px){.columns-area__panels__pane--navigational{display:none}}@media screen and (min-width: 1190px){.tabs-bar{display:none}}.icon-with-badge{position:relative}.icon-with-badge__badge{position:absolute;left:9px;top:-13px;background:#2b90d9;border:2px solid #c0cdd9;padding:1px 6px;border-radius:6px;font-size:10px;font-weight:500;line-height:14px;color:#000}.column-link--transparent .icon-with-badge__badge{border-color:#f2f5f7}.compose-panel{width:285px;margin-top:10px;display:flex;flex-direction:column;height:calc(100% - 10px);overflow-y:hidden}.compose-panel .navigation-bar{padding-top:20px;padding-bottom:20px;flex:0 1 48px;min-height:20px}.compose-panel .flex-spacer{background:transparent}.compose-panel .compose-form{flex:1;overflow-y:hidden;display:flex;flex-direction:column;min-height:310px;padding-bottom:71px;margin-bottom:-71px}.compose-panel .compose-form__autosuggest-wrapper{overflow-y:auto;background-color:#fff;border-radius:4px 4px 0 0;flex:0 1 auto}.compose-panel .autosuggest-textarea__textarea{overflow-y:hidden}.compose-panel .compose-form__upload-thumbnail{height:80px}.navigation-panel{margin-top:10px;margin-bottom:10px;height:calc(100% - 20px);overflow-y:auto;display:flex;flex-direction:column}.navigation-panel>a{flex:0 0 auto}.navigation-panel hr{flex:0 0 auto;border:0;background:transparent;border-top:1px solid #ccd7e0;margin:10px 0}.navigation-panel .flex-spacer{background:transparent}.drawer__pager{box-sizing:border-box;padding:0;flex-grow:1;position:relative;overflow:hidden;display:flex}.drawer__inner{position:absolute;top:0;left:0;background:#b0c0cf;box-sizing:border-box;padding:0;display:flex;flex-direction:column;overflow:hidden;overflow-y:auto;width:100%;height:100%;border-radius:2px}.drawer__inner.darker{background:#d9e1e8}.drawer__inner__mastodon{background:#b0c0cf url('data:image/svg+xml;utf8,') no-repeat bottom/100% auto;flex:1;min-height:47px;display:none}.drawer__inner__mastodon>img{display:block;object-fit:contain;object-position:bottom left;width:85%;height:100%;pointer-events:none;user-drag:none;user-select:none}@media screen and (min-height: 640px){.drawer__inner__mastodon{display:block}}.pseudo-drawer{background:#b0c0cf;font-size:13px;text-align:left}.drawer__header{flex:0 0 auto;font-size:16px;background:#c0cdd9;margin-bottom:10px;display:flex;flex-direction:row;border-radius:2px}.drawer__header a{transition:background 100ms ease-in}.drawer__header a:hover{background:#cfd9e2;transition:background 200ms ease-out}.scrollable{overflow-y:scroll;overflow-x:hidden;flex:1 1 auto;-webkit-overflow-scrolling:touch}.scrollable.optionally-scrollable{overflow-y:auto}@supports(display: grid){.scrollable{contain:strict}}.scrollable--flex{display:flex;flex-direction:column}.scrollable__append{flex:1 1 auto;position:relative;min-height:120px}@supports(display: grid){.scrollable.fullscreen{contain:none}}.column-back-button{box-sizing:border-box;width:100%;background:#ccd7e0;color:#2b90d9;cursor:pointer;flex:0 0 auto;font-size:16px;line-height:inherit;border:0;text-align:unset;padding:15px;margin:0;z-index:3;outline:0}.column-back-button:hover{text-decoration:underline}.column-header__back-button{background:#ccd7e0;border:0;font-family:inherit;color:#2b90d9;cursor:pointer;white-space:nowrap;font-size:16px;padding:0 5px 0 0;z-index:3}.column-header__back-button:hover{text-decoration:underline}.column-header__back-button:last-child{padding:0 15px 0 0}.column-back-button__icon{display:inline-block;margin-right:5px}.column-back-button--slim{position:relative}.column-back-button--slim-button{cursor:pointer;flex:0 0 auto;font-size:16px;padding:15px;position:absolute;right:0;top:-48px}.react-toggle{display:inline-block;position:relative;cursor:pointer;background-color:transparent;border:0;padding:0;user-select:none;-webkit-tap-highlight-color:rgba(255,255,255,0);-webkit-tap-highlight-color:transparent}.react-toggle-screenreader-only{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.react-toggle--disabled{cursor:not-allowed;opacity:.5;transition:opacity .25s}.react-toggle-track{width:50px;height:24px;padding:0;border-radius:30px;background-color:#d9e1e8;transition:background-color .2s ease}.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track{background-color:#f9fafb}.react-toggle--checked .react-toggle-track{background-color:#2b90d9}.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track{background-color:#2074b1}.react-toggle-track-check{position:absolute;width:14px;height:10px;top:0;bottom:0;margin-top:auto;margin-bottom:auto;line-height:0;left:8px;opacity:0;transition:opacity .25s ease}.react-toggle--checked .react-toggle-track-check{opacity:1;transition:opacity .25s ease}.react-toggle-track-x{position:absolute;width:10px;height:10px;top:0;bottom:0;margin-top:auto;margin-bottom:auto;line-height:0;right:10px;opacity:1;transition:opacity .25s ease}.react-toggle--checked .react-toggle-track-x{opacity:0}.react-toggle-thumb{position:absolute;top:1px;left:1px;width:22px;height:22px;border:1px solid #d9e1e8;border-radius:50%;background-color:#fff;box-sizing:border-box;transition:all .25s ease;transition-property:border-color,left}.react-toggle--checked .react-toggle-thumb{left:27px;border-color:#2b90d9}.column-link{background:#c0cdd9;color:#000;display:block;font-size:16px;padding:15px;text-decoration:none}.column-link:hover,.column-link:focus,.column-link:active{background:#b6c5d3}.column-link:focus{outline:0}.column-link--transparent{background:transparent;color:#282c37}.column-link--transparent:hover,.column-link--transparent:focus,.column-link--transparent:active{background:transparent;color:#000}.column-link--transparent.active{color:#2b90d9}.column-link__icon{display:inline-block;margin-right:5px}.column-link__badge{display:inline-block;border-radius:4px;font-size:12px;line-height:19px;font-weight:500;background:#d9e1e8;padding:4px 8px;margin:-6px 10px}.column-subheading{background:#d9e1e8;color:#444b5d;padding:8px 20px;font-size:12px;font-weight:500;text-transform:uppercase;cursor:default}.getting-started__wrapper,.getting-started,.flex-spacer{background:#d9e1e8}.flex-spacer{flex:1 1 auto}.getting-started{color:#444b5d;overflow:auto;border-bottom-left-radius:2px;border-bottom-right-radius:2px}.getting-started__wrapper,.getting-started__panel,.getting-started__footer{height:min-content}.getting-started__panel,.getting-started__footer{padding:10px;padding-top:20px;flex-grow:0}.getting-started__panel ul,.getting-started__footer ul{margin-bottom:10px}.getting-started__panel ul li,.getting-started__footer ul li{display:inline}.getting-started__panel p,.getting-started__footer p{font-size:13px}.getting-started__panel p a,.getting-started__footer p a{color:#444b5d;text-decoration:underline}.getting-started__panel a,.getting-started__footer a{text-decoration:none;color:#282c37}.getting-started__panel a:hover,.getting-started__panel a:focus,.getting-started__panel a:active,.getting-started__footer a:hover,.getting-started__footer a:focus,.getting-started__footer a:active{text-decoration:underline}.getting-started__wrapper,.getting-started__footer{color:#444b5d}.getting-started__trends{flex:0 1 auto;opacity:1;animation:fade 150ms linear;margin-top:10px}.getting-started__trends h4{font-size:12px;text-transform:uppercase;color:#282c37;padding:10px;font-weight:500;border-bottom:1px solid #c0cdd9}@media screen and (max-height: 810px){.getting-started__trends .trends__item:nth-child(3){display:none}}@media screen and (max-height: 720px){.getting-started__trends .trends__item:nth-child(2){display:none}}@media screen and (max-height: 670px){.getting-started__trends{display:none}}.getting-started__trends .trends__item{border-bottom:0;padding:10px}.getting-started__trends .trends__item__current{color:#282c37}.keyboard-shortcuts{padding:8px 0 0;overflow:hidden}.keyboard-shortcuts thead{position:absolute;left:-9999px}.keyboard-shortcuts td{padding:0 10px 8px}.keyboard-shortcuts kbd{display:inline-block;padding:3px 5px;background-color:#c0cdd9;border:1px solid #e6ebf0}.setting-text{display:block;box-sizing:border-box;width:100%;margin:0;color:#000;background:#fff;padding:10px;font-family:inherit;font-size:14px;resize:vertical;border:0;outline:0;border-radius:4px}.setting-text:focus{outline:0}@media screen and (max-width: 600px){.setting-text{font-size:16px}}.no-reduce-motion button.icon-button i.fa-retweet{background-position:0 0;height:19px;transition:background-position .9s steps(10);transition-duration:0s;vertical-align:middle;width:22px}.no-reduce-motion button.icon-button i.fa-retweet::before{display:none !important}.no-reduce-motion button.icon-button.active i.fa-retweet{transition-duration:.9s;background-position:0 100%}.reduce-motion button.icon-button i.fa-retweet{color:#606984;transition:color 100ms ease-in}.reduce-motion button.icon-button.active i.fa-retweet{color:#2b90d9}.status-card{display:flex;font-size:14px;border:1px solid #c0cdd9;border-radius:4px;color:#444b5d;margin-top:14px;text-decoration:none;overflow:hidden}.status-card__actions{bottom:0;left:0;position:absolute;right:0;top:0;display:flex;justify-content:center;align-items:center}.status-card__actions>div{background:rgba(0,0,0,.6);border-radius:8px;padding:12px 9px;flex:0 0 auto;display:flex;justify-content:center;align-items:center}.status-card__actions button,.status-card__actions a{display:inline;color:#282c37;background:transparent;border:0;padding:0 8px;text-decoration:none;font-size:18px;line-height:18px}.status-card__actions button:hover,.status-card__actions button:active,.status-card__actions button:focus,.status-card__actions a:hover,.status-card__actions a:active,.status-card__actions a:focus{color:#000}.status-card__actions a{font-size:19px;position:relative;bottom:-1px}a.status-card{cursor:pointer}a.status-card:hover{background:#c0cdd9}.status-card-photo{cursor:zoom-in;display:block;text-decoration:none;width:100%;height:auto;margin:0}.status-card-video iframe{width:100%;height:100%}.status-card__title{display:block;font-weight:500;margin-bottom:5px;color:#282c37;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-decoration:none}.status-card__content{flex:1 1 auto;overflow:hidden;padding:14px 14px 14px 8px}.status-card__description{color:#282c37}.status-card__host{display:block;margin-top:5px;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-card__image{flex:0 0 100px;background:#c0cdd9;position:relative}.status-card__image>.fa{font-size:21px;position:absolute;transform-origin:50% 50%;top:50%;left:50%;transform:translate(-50%, -50%)}.status-card.horizontal{display:block}.status-card.horizontal .status-card__image{width:100%}.status-card.horizontal .status-card__image-image{border-radius:4px 4px 0 0}.status-card.horizontal .status-card__title{white-space:inherit}.status-card.compact{border-color:#ccd7e0}.status-card.compact.interactive{border:0}.status-card.compact .status-card__content{padding:8px;padding-top:10px}.status-card.compact .status-card__title{white-space:nowrap}.status-card.compact .status-card__image{flex:0 0 60px}a.status-card.compact:hover{background-color:#ccd7e0}.status-card__image-image{border-radius:4px 0 0 4px;display:block;margin:0;width:100%;height:100%;object-fit:cover;background-size:cover;background-position:center center}.load-more{display:block;color:#444b5d;background-color:transparent;border:0;font-size:inherit;text-align:center;line-height:inherit;margin:0;padding:15px;box-sizing:border-box;width:100%;clear:both;text-decoration:none}.load-more:hover{background:#d3dce4}.load-gap{border-bottom:1px solid #c0cdd9}.regeneration-indicator{text-align:center;font-size:16px;font-weight:500;color:#444b5d;background:#d9e1e8;cursor:default;display:flex;flex:1 1 auto;flex-direction:column;align-items:center;justify-content:center;padding:20px}.regeneration-indicator__figure,.regeneration-indicator__figure img{display:block;width:auto;height:160px;margin:0}.regeneration-indicator--without-header{padding-top:68px}.regeneration-indicator__label{margin-top:30px}.regeneration-indicator__label strong{display:block;margin-bottom:10px;color:#444b5d}.regeneration-indicator__label span{font-size:15px;font-weight:400}.column-header__wrapper{position:relative;flex:0 0 auto;z-index:1}.column-header__wrapper.active{box-shadow:0 1px 0 rgba(43,144,217,.3)}.column-header__wrapper.active::before{display:block;content:\"\";position:absolute;bottom:-13px;left:0;right:0;margin:0 auto;width:60%;pointer-events:none;height:28px;z-index:1;background:radial-gradient(ellipse, rgba(43, 144, 217, 0.23) 0%, rgba(43, 144, 217, 0) 60%)}.column-header__wrapper .announcements{z-index:1;position:relative}.column-header{display:flex;font-size:16px;background:#ccd7e0;flex:0 0 auto;cursor:pointer;position:relative;z-index:2;outline:0;overflow:hidden;border-top-left-radius:2px;border-top-right-radius:2px}.column-header>button{margin:0;border:0;padding:15px 0 15px 15px;color:inherit;background:transparent;font:inherit;text-align:left;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;flex:1}.column-header>.column-header__back-button{color:#2b90d9}.column-header.active .column-header__icon{color:#2b90d9;text-shadow:0 0 10px rgba(43,144,217,.4)}.column-header:focus,.column-header:active{outline:0}.column-header__buttons{height:48px;display:flex}.column-header__links{margin-bottom:14px}.column-header__links .text-btn{margin-right:10px}.column-header__button{background:#ccd7e0;border:0;color:#282c37;cursor:pointer;font-size:16px;padding:0 15px}.column-header__button:hover{color:#191b22}.column-header__button.active{color:#000;background:#c0cdd9}.column-header__button.active:hover{color:#000;background:#c0cdd9}.column-header__collapsible{max-height:70vh;overflow:hidden;overflow-y:auto;color:#282c37;transition:max-height 150ms ease-in-out,opacity 300ms linear;opacity:1;z-index:1;position:relative}.column-header__collapsible.collapsed{max-height:0;opacity:.5}.column-header__collapsible.animating{overflow-y:hidden}.column-header__collapsible hr{height:0;background:transparent;border:0;border-top:1px solid #b3c3d1;margin:10px 0}.column-header__collapsible-inner{background:#c0cdd9;padding:15px}.column-header__setting-btn:hover{color:#282c37;text-decoration:underline}.column-header__setting-arrows{float:right}.column-header__setting-arrows .column-header__setting-btn{padding:0 10px}.column-header__setting-arrows .column-header__setting-btn:last-child{padding-right:0}.text-btn{display:inline-block;padding:0;font-family:inherit;font-size:inherit;color:inherit;border:0;background:transparent;cursor:pointer}.column-header__icon{display:inline-block;margin-right:5px}.loading-indicator{color:#444b5d;font-size:12px;font-weight:400;text-transform:uppercase;overflow:visible;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.loading-indicator span{display:block;float:left;margin-left:50%;transform:translateX(-50%);margin:82px 0 0 50%;white-space:nowrap}.loading-indicator__figure{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);width:42px;height:42px;box-sizing:border-box;background-color:transparent;border:0 solid #86a0b6;border-width:6px;border-radius:50%}.no-reduce-motion .loading-indicator span{animation:loader-label 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1)}.no-reduce-motion .loading-indicator__figure{animation:loader-figure 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1)}@keyframes spring-rotate-in{0%{transform:rotate(0deg)}30%{transform:rotate(-484.8deg)}60%{transform:rotate(-316.7deg)}90%{transform:rotate(-375deg)}100%{transform:rotate(-360deg)}}@keyframes spring-rotate-out{0%{transform:rotate(-360deg)}30%{transform:rotate(124.8deg)}60%{transform:rotate(-43.27deg)}90%{transform:rotate(15deg)}100%{transform:rotate(0deg)}}@keyframes loader-figure{0%{width:0;height:0;background-color:#86a0b6}29%{background-color:#86a0b6}30%{width:42px;height:42px;background-color:transparent;border-width:21px;opacity:1}100%{width:42px;height:42px;border-width:0;opacity:0;background-color:transparent}}@keyframes loader-label{0%{opacity:.25}30%{opacity:1}100%{opacity:.25}}.video-error-cover{align-items:center;background:#fff;color:#000;cursor:pointer;display:flex;flex-direction:column;height:100%;justify-content:center;margin-top:8px;position:relative;text-align:center;z-index:100}.media-spoiler{background:#fff;color:#282c37;border:0;padding:0;width:100%;height:100%;border-radius:4px;appearance:none}.media-spoiler:hover,.media-spoiler:active,.media-spoiler:focus{padding:0;color:#17191f}.media-spoiler__warning{display:block;font-size:14px}.media-spoiler__trigger{display:block;font-size:11px;font-weight:700}.spoiler-button{top:0;left:0;width:100%;height:100%;position:absolute;z-index:100}.spoiler-button--minified{display:block;left:4px;top:4px;width:auto;height:auto}.spoiler-button--click-thru{pointer-events:none}.spoiler-button--hidden{display:none}.spoiler-button__overlay{display:block;background:transparent;width:100%;height:100%;border:0}.spoiler-button__overlay__label{display:inline-block;background:rgba(255,255,255,.5);border-radius:8px;padding:8px 12px;color:#000;font-weight:500;font-size:14px}.spoiler-button__overlay:hover .spoiler-button__overlay__label,.spoiler-button__overlay:focus .spoiler-button__overlay__label,.spoiler-button__overlay:active .spoiler-button__overlay__label{background:rgba(255,255,255,.8)}.spoiler-button__overlay:disabled .spoiler-button__overlay__label{background:rgba(255,255,255,.5)}.modal-container--preloader{background:#c0cdd9}.account--panel{background:#ccd7e0;border-top:1px solid #c0cdd9;border-bottom:1px solid #c0cdd9;display:flex;flex-direction:row;padding:10px 0}.account--panel__button,.detailed-status__button{flex:1 1 auto;text-align:center}.column-settings__outer{background:#c0cdd9;padding:15px}.column-settings__section{color:#282c37;cursor:default;display:block;font-weight:500;margin-bottom:10px}.column-settings__hashtags .column-settings__row{margin-bottom:15px}.column-settings__hashtags .column-select__control{outline:0;box-sizing:border-box;width:100%;border:0;box-shadow:none;font-family:inherit;background:#d9e1e8;color:#282c37;font-size:14px;margin:0}.column-settings__hashtags .column-select__control::placeholder{color:#1f232b}.column-settings__hashtags .column-select__control::-moz-focus-inner{border:0}.column-settings__hashtags .column-select__control::-moz-focus-inner,.column-settings__hashtags .column-select__control:focus,.column-settings__hashtags .column-select__control:active{outline:0 !important}.column-settings__hashtags .column-select__control:focus{background:#ccd7e0}@media screen and (max-width: 600px){.column-settings__hashtags .column-select__control{font-size:16px}}.column-settings__hashtags .column-select__placeholder{color:#444b5d;padding-left:2px;font-size:12px}.column-settings__hashtags .column-select__value-container{padding-left:6px}.column-settings__hashtags .column-select__multi-value{background:#c0cdd9}.column-settings__hashtags .column-select__multi-value__remove{cursor:pointer}.column-settings__hashtags .column-select__multi-value__remove:hover,.column-settings__hashtags .column-select__multi-value__remove:active,.column-settings__hashtags .column-select__multi-value__remove:focus{background:#b3c3d1;color:#1f232b}.column-settings__hashtags .column-select__multi-value__label,.column-settings__hashtags .column-select__input{color:#282c37}.column-settings__hashtags .column-select__clear-indicator,.column-settings__hashtags .column-select__dropdown-indicator{cursor:pointer;transition:none;color:#444b5d}.column-settings__hashtags .column-select__clear-indicator:hover,.column-settings__hashtags .column-select__clear-indicator:active,.column-settings__hashtags .column-select__clear-indicator:focus,.column-settings__hashtags .column-select__dropdown-indicator:hover,.column-settings__hashtags .column-select__dropdown-indicator:active,.column-settings__hashtags .column-select__dropdown-indicator:focus{color:#3b4151}.column-settings__hashtags .column-select__indicator-separator{background-color:#c0cdd9}.column-settings__hashtags .column-select__menu{background:#fff;border-radius:4px;padding:10px 14px;padding-bottom:14px;margin-top:10px;color:#444b5d;box-shadow:2px 4px 15px rgba(0,0,0,.4);padding:0;background:#282c37}.column-settings__hashtags .column-select__menu h4{text-transform:uppercase;color:#444b5d;font-size:13px;font-weight:500;margin-bottom:10px}.column-settings__hashtags .column-select__menu li{padding:4px 0}.column-settings__hashtags .column-select__menu ul{margin-bottom:10px}.column-settings__hashtags .column-select__menu em{font-weight:500;color:#000}.column-settings__hashtags .column-select__menu-list{padding:6px}.column-settings__hashtags .column-select__option{color:#000;border-radius:4px;font-size:14px}.column-settings__hashtags .column-select__option--is-focused,.column-settings__hashtags .column-select__option--is-selected{background:#3d4455}.column-settings__row .text-btn{margin-bottom:15px}.relationship-tag{color:#000;margin-bottom:4px;display:block;vertical-align:top;background-color:#fff;text-transform:uppercase;font-size:11px;font-weight:500;padding:4px;border-radius:4px;opacity:.7}.relationship-tag:hover{opacity:1}.setting-toggle{display:block;line-height:24px}.setting-toggle__label{color:#282c37;display:inline-block;margin-bottom:14px;margin-left:8px;vertical-align:middle}.empty-column-indicator,.error-column,.follow_requests-unlocked_explanation{color:#444b5d;background:#d9e1e8;text-align:center;padding:20px;font-size:15px;font-weight:400;cursor:default;display:flex;flex:1 1 auto;align-items:center;justify-content:center}@supports(display: grid){.empty-column-indicator,.error-column,.follow_requests-unlocked_explanation{contain:strict}}.empty-column-indicator>span,.error-column>span,.follow_requests-unlocked_explanation>span{max-width:400px}.empty-column-indicator a,.error-column a,.follow_requests-unlocked_explanation a{color:#2b90d9;text-decoration:none}.empty-column-indicator a:hover,.error-column a:hover,.follow_requests-unlocked_explanation a:hover{text-decoration:underline}.follow_requests-unlocked_explanation{background:#e6ebf0;contain:initial}.error-column{flex-direction:column}@keyframes heartbeat{from{transform:scale(1);animation-timing-function:ease-out}10%{transform:scale(0.91);animation-timing-function:ease-in}17%{transform:scale(0.98);animation-timing-function:ease-out}33%{transform:scale(0.87);animation-timing-function:ease-in}45%{transform:scale(1);animation-timing-function:ease-out}}.no-reduce-motion .pulse-loading{transform-origin:center center;animation:heartbeat 1.5s ease-in-out infinite both}@keyframes shake-bottom{0%,100%{transform:rotate(0deg);transform-origin:50% 100%}10%{transform:rotate(2deg)}20%,40%,60%{transform:rotate(-4deg)}30%,50%,70%{transform:rotate(4deg)}80%{transform:rotate(-2deg)}90%{transform:rotate(2deg)}}.no-reduce-motion .shake-bottom{transform-origin:50% 100%;animation:shake-bottom .8s cubic-bezier(0.455, 0.03, 0.515, 0.955) 2s 2 both}.emoji-picker-dropdown__menu{background:#fff;position:absolute;box-shadow:4px 4px 6px rgba(0,0,0,.4);border-radius:4px;margin-top:5px;z-index:2}.emoji-picker-dropdown__menu .emoji-mart-scroll{transition:opacity 200ms ease}.emoji-picker-dropdown__menu.selecting .emoji-mart-scroll{opacity:.5}.emoji-picker-dropdown__modifiers{position:absolute;top:60px;right:11px;cursor:pointer}.emoji-picker-dropdown__modifiers__menu{position:absolute;z-index:4;top:-4px;left:-8px;background:#fff;border-radius:4px;box-shadow:1px 2px 6px rgba(0,0,0,.2);overflow:hidden}.emoji-picker-dropdown__modifiers__menu button{display:block;cursor:pointer;border:0;padding:4px 8px;background:transparent}.emoji-picker-dropdown__modifiers__menu button:hover,.emoji-picker-dropdown__modifiers__menu button:focus,.emoji-picker-dropdown__modifiers__menu button:active{background:rgba(40,44,55,.4)}.emoji-picker-dropdown__modifiers__menu .emoji-mart-emoji{height:22px}.emoji-mart-emoji span{background-repeat:no-repeat}.upload-area{align-items:center;background:rgba(255,255,255,.8);display:flex;height:100%;justify-content:center;left:0;opacity:0;position:absolute;top:0;visibility:hidden;width:100%;z-index:2000}.upload-area *{pointer-events:none}.upload-area__drop{width:320px;height:160px;display:flex;box-sizing:border-box;position:relative;padding:8px}.upload-area__background{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;border-radius:4px;background:#d9e1e8;box-shadow:0 0 5px rgba(0,0,0,.2)}.upload-area__content{flex:1;display:flex;align-items:center;justify-content:center;color:#282c37;font-size:18px;font-weight:500;border:2px dashed #b0c0cf;border-radius:4px}.upload-progress{padding:10px;color:#282c37;overflow:hidden;display:flex}.upload-progress .fa{font-size:34px;margin-right:10px}.upload-progress span{font-size:12px;text-transform:uppercase;font-weight:500;display:block}.upload-progess__message{flex:1 1 auto}.upload-progress__backdrop{width:100%;height:6px;border-radius:6px;background:#b0c0cf;position:relative;margin-top:5px}.upload-progress__tracker{position:absolute;left:0;top:0;height:6px;background:#2b90d9;border-radius:6px}.emoji-button{display:block;padding:5px 5px 2px 2px;outline:0;cursor:pointer}.emoji-button:active,.emoji-button:focus{outline:0 !important}.emoji-button img{filter:grayscale(100%);opacity:.8;display:block;margin:0;width:22px;height:22px}.emoji-button:hover img,.emoji-button:active img,.emoji-button:focus img{opacity:1;filter:none}.dropdown--active .emoji-button img{opacity:1;filter:none}.privacy-dropdown__dropdown{position:absolute;background:#fff;box-shadow:2px 4px 15px rgba(0,0,0,.4);border-radius:4px;margin-left:40px;overflow:hidden}.privacy-dropdown__dropdown.top{transform-origin:50% 100%}.privacy-dropdown__dropdown.bottom{transform-origin:50% 0}.privacy-dropdown__option{color:#000;padding:10px;cursor:pointer;display:flex}.privacy-dropdown__option:hover,.privacy-dropdown__option.active{background:#2b90d9;color:#000;outline:0}.privacy-dropdown__option:hover .privacy-dropdown__option__content,.privacy-dropdown__option.active .privacy-dropdown__option__content{color:#000}.privacy-dropdown__option:hover .privacy-dropdown__option__content strong,.privacy-dropdown__option.active .privacy-dropdown__option__content strong{color:#000}.privacy-dropdown__option.active:hover{background:#2485cb}.privacy-dropdown__option__icon{display:flex;align-items:center;justify-content:center;margin-right:10px}.privacy-dropdown__option__content{flex:1 1 auto;color:#282c37}.privacy-dropdown__option__content strong{font-weight:500;display:block;color:#000}.privacy-dropdown__option__content strong:lang(ja){font-weight:700}.privacy-dropdown__option__content strong:lang(ko){font-weight:700}.privacy-dropdown__option__content strong:lang(zh-CN){font-weight:700}.privacy-dropdown__option__content strong:lang(zh-HK){font-weight:700}.privacy-dropdown__option__content strong:lang(zh-TW){font-weight:700}.privacy-dropdown.active .privacy-dropdown__value{background:#fff;border-radius:4px 4px 0 0;box-shadow:0 -4px 4px rgba(0,0,0,.1)}.privacy-dropdown.active .privacy-dropdown__value .icon-button{transition:none}.privacy-dropdown.active .privacy-dropdown__value.active{background:#2b90d9}.privacy-dropdown.active .privacy-dropdown__value.active .icon-button{color:#000}.privacy-dropdown.active.top .privacy-dropdown__value{border-radius:0 0 4px 4px}.privacy-dropdown.active .privacy-dropdown__dropdown{display:block;box-shadow:2px 4px 6px rgba(0,0,0,.1)}.search{position:relative}.search__input{outline:0;box-sizing:border-box;width:100%;border:0;box-shadow:none;font-family:inherit;background:#d9e1e8;color:#282c37;font-size:14px;margin:0;display:block;padding:15px;padding-right:30px;line-height:18px;font-size:16px}.search__input::placeholder{color:#1f232b}.search__input::-moz-focus-inner{border:0}.search__input::-moz-focus-inner,.search__input:focus,.search__input:active{outline:0 !important}.search__input:focus{background:#ccd7e0}@media screen and (max-width: 600px){.search__input{font-size:16px}}.search__icon::-moz-focus-inner{border:0}.search__icon::-moz-focus-inner,.search__icon:focus{outline:0 !important}.search__icon .fa{position:absolute;top:16px;right:10px;z-index:2;display:inline-block;opacity:0;transition:all 100ms linear;transition-property:transform,opacity;font-size:18px;width:18px;height:18px;color:#282c37;cursor:default;pointer-events:none}.search__icon .fa.active{pointer-events:auto;opacity:.3}.search__icon .fa-search{transform:rotate(90deg)}.search__icon .fa-search.active{pointer-events:none;transform:rotate(0deg)}.search__icon .fa-times-circle{top:17px;transform:rotate(0deg);color:#606984;cursor:pointer}.search__icon .fa-times-circle.active{transform:rotate(90deg)}.search__icon .fa-times-circle:hover{color:#51596f}.search-results__header{color:#444b5d;background:#d3dce4;padding:15px;font-weight:500;font-size:16px;cursor:default}.search-results__header .fa{display:inline-block;margin-right:5px}.search-results__section{margin-bottom:5px}.search-results__section h5{background:#e6ebf0;border-bottom:1px solid #c0cdd9;cursor:default;display:flex;padding:15px;font-weight:500;font-size:16px;color:#444b5d}.search-results__section h5 .fa{display:inline-block;margin-right:5px}.search-results__section .account:last-child,.search-results__section>div:last-child .status{border-bottom:0}.search-results__hashtag{display:block;padding:10px;color:#282c37;text-decoration:none}.search-results__hashtag:hover,.search-results__hashtag:active,.search-results__hashtag:focus{color:#1f232b;text-decoration:underline}.search-results__info{padding:20px;color:#282c37;text-align:center}.modal-root{position:relative;transition:opacity .3s linear;will-change:opacity;z-index:9999}.modal-root__overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(255,255,255,.7)}.modal-root__container{position:fixed;top:0;left:0;width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;align-content:space-around;z-index:9999;pointer-events:none;user-select:none}.modal-root__modal{pointer-events:auto;display:flex;z-index:9999}.video-modal__container{max-width:100vw;max-height:100vh}.audio-modal__container{width:50vw}.media-modal{width:100%;height:100%;position:relative}.media-modal .extended-video-player{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.media-modal .extended-video-player video{max-width:100%;max-height:80%}.media-modal__closer{position:absolute;top:0;left:0;right:0;bottom:0}.media-modal__navigation{position:absolute;top:0;left:0;right:0;bottom:0;pointer-events:none;transition:opacity .3s linear;will-change:opacity}.media-modal__navigation *{pointer-events:auto}.media-modal__navigation.media-modal__navigation--hidden{opacity:0}.media-modal__navigation.media-modal__navigation--hidden *{pointer-events:none}.media-modal__nav{background:rgba(255,255,255,.5);box-sizing:border-box;border:0;color:#000;cursor:pointer;display:flex;align-items:center;font-size:24px;height:20vmax;margin:auto 0;padding:30px 15px;position:absolute;top:0;bottom:0}.media-modal__nav--left{left:0}.media-modal__nav--right{right:0}.media-modal__pagination{width:100%;text-align:center;position:absolute;left:0;bottom:20px;pointer-events:none}.media-modal__meta{text-align:center;position:absolute;left:0;bottom:20px;width:100%;pointer-events:none}.media-modal__meta--shifted{bottom:62px}.media-modal__meta a{pointer-events:auto;text-decoration:none;font-weight:500;color:#282c37}.media-modal__meta a:hover,.media-modal__meta a:focus,.media-modal__meta a:active{text-decoration:underline}.media-modal__page-dot{display:inline-block}.media-modal__button{background-color:#000;height:12px;width:12px;border-radius:6px;margin:10px;padding:0;border:0;font-size:0}.media-modal__button--active{background-color:#2b90d9}.media-modal__close{position:absolute;right:8px;top:8px;z-index:100}.onboarding-modal,.error-modal,.embed-modal{background:#282c37;color:#000;border-radius:8px;overflow:hidden;display:flex;flex-direction:column}.error-modal__body{height:80vh;width:80vw;max-width:520px;max-height:420px;position:relative}.error-modal__body>div{position:absolute;top:0;left:0;width:100%;height:100%;box-sizing:border-box;padding:25px;display:none;flex-direction:column;align-items:center;justify-content:center;display:flex;opacity:0;user-select:text}.error-modal__body{display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center}.onboarding-modal__paginator,.error-modal__footer{flex:0 0 auto;background:#393f4f;display:flex;padding:25px}.onboarding-modal__paginator>div,.error-modal__footer>div{min-width:33px}.onboarding-modal__paginator .onboarding-modal__nav,.onboarding-modal__paginator .error-modal__nav,.error-modal__footer .onboarding-modal__nav,.error-modal__footer .error-modal__nav{color:#282c37;border:0;font-size:14px;font-weight:500;padding:10px 25px;line-height:inherit;height:auto;margin:-10px;border-radius:4px;background-color:transparent}.onboarding-modal__paginator .onboarding-modal__nav:hover,.onboarding-modal__paginator .onboarding-modal__nav:focus,.onboarding-modal__paginator .onboarding-modal__nav:active,.onboarding-modal__paginator .error-modal__nav:hover,.onboarding-modal__paginator .error-modal__nav:focus,.onboarding-modal__paginator .error-modal__nav:active,.error-modal__footer .onboarding-modal__nav:hover,.error-modal__footer .onboarding-modal__nav:focus,.error-modal__footer .onboarding-modal__nav:active,.error-modal__footer .error-modal__nav:hover,.error-modal__footer .error-modal__nav:focus,.error-modal__footer .error-modal__nav:active{color:#313543;background-color:#4a5266}.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next,.error-modal__footer .error-modal__nav.onboarding-modal__done,.error-modal__footer .error-modal__nav.onboarding-modal__next{color:#000}.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:hover,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:focus,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:active,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:hover,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:focus,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:active,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:hover,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:focus,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:active,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:hover,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:focus,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:active,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:hover,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:focus,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:active,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:hover,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:focus,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:active,.error-modal__footer .error-modal__nav.onboarding-modal__done:hover,.error-modal__footer .error-modal__nav.onboarding-modal__done:focus,.error-modal__footer .error-modal__nav.onboarding-modal__done:active,.error-modal__footer .error-modal__nav.onboarding-modal__next:hover,.error-modal__footer .error-modal__nav.onboarding-modal__next:focus,.error-modal__footer .error-modal__nav.onboarding-modal__next:active{color:#000}.error-modal__footer{justify-content:center}.display-case{text-align:center;font-size:15px;margin-bottom:15px}.display-case__label{font-weight:500;color:#000;margin-bottom:5px;text-transform:uppercase;font-size:12px}.display-case__case{background:#d9e1e8;color:#282c37;font-weight:500;padding:10px;border-radius:4px}.onboard-sliders{display:inline-block;max-width:30px;max-height:auto;margin-left:10px}.boost-modal,.confirmation-modal,.report-modal,.actions-modal,.mute-modal,.block-modal{background:#17191f;color:#000;border-radius:8px;overflow:hidden;max-width:90vw;width:480px;position:relative;flex-direction:column}.boost-modal .status__display-name,.confirmation-modal .status__display-name,.report-modal .status__display-name,.actions-modal .status__display-name,.mute-modal .status__display-name,.block-modal .status__display-name{display:block;max-width:100%;padding-right:25px}.boost-modal .status__avatar,.confirmation-modal .status__avatar,.report-modal .status__avatar,.actions-modal .status__avatar,.mute-modal .status__avatar,.block-modal .status__avatar{height:28px;left:10px;position:absolute;top:10px;width:48px}.boost-modal .status__content__spoiler-link,.confirmation-modal .status__content__spoiler-link,.report-modal .status__content__spoiler-link,.actions-modal .status__content__spoiler-link,.mute-modal .status__content__spoiler-link,.block-modal .status__content__spoiler-link{color:#17191f}.actions-modal .status{background:#fff;border-bottom-color:#282c37;padding-top:10px;padding-bottom:10px}.actions-modal .dropdown-menu__separator{border-bottom-color:#282c37}.boost-modal__container{overflow-x:scroll;padding:10px}.boost-modal__container .status{user-select:text;border-bottom:0}.boost-modal__action-bar,.confirmation-modal__action-bar,.mute-modal__action-bar,.block-modal__action-bar{display:flex;justify-content:space-between;background:#282c37;padding:10px;line-height:36px}.boost-modal__action-bar>div,.confirmation-modal__action-bar>div,.mute-modal__action-bar>div,.block-modal__action-bar>div{flex:1 1 auto;text-align:right;color:#282c37;padding-right:10px}.boost-modal__action-bar .button,.confirmation-modal__action-bar .button,.mute-modal__action-bar .button,.block-modal__action-bar .button{flex:0 0 auto}.boost-modal__status-header{font-size:15px}.boost-modal__status-time{float:right;font-size:14px}.mute-modal,.block-modal{line-height:24px}.mute-modal .react-toggle,.block-modal .react-toggle{vertical-align:middle}.report-modal{width:90vw;max-width:700px}.report-modal__container{display:flex;border-top:1px solid #282c37}@media screen and (max-width: 480px){.report-modal__container{flex-wrap:wrap;overflow-y:auto}}.report-modal__statuses,.report-modal__comment{box-sizing:border-box;width:50%}@media screen and (max-width: 480px){.report-modal__statuses,.report-modal__comment{width:100%}}.report-modal__statuses,.focal-point-modal__content{flex:1 1 auto;min-height:20vh;max-height:80vh;overflow-y:auto;overflow-x:hidden}.report-modal__statuses .status__content a,.focal-point-modal__content .status__content a{color:#2b90d9}.report-modal__statuses .status__content,.report-modal__statuses .status__content p,.focal-point-modal__content .status__content,.focal-point-modal__content .status__content p{color:#000}@media screen and (max-width: 480px){.report-modal__statuses,.focal-point-modal__content{max-height:10vh}}@media screen and (max-width: 480px){.focal-point-modal__content{max-height:40vh}}.report-modal__comment{padding:20px;border-right:1px solid #282c37;max-width:320px}.report-modal__comment p{font-size:14px;line-height:20px;margin-bottom:20px}.report-modal__comment .setting-text{display:block;box-sizing:border-box;width:100%;margin:0;color:#000;background:#fff;padding:10px;font-family:inherit;font-size:14px;resize:none;border:0;outline:0;border-radius:4px;border:1px solid #282c37;min-height:100px;max-height:50vh;margin-bottom:10px}.report-modal__comment .setting-text:focus{border:1px solid #393f4f}.report-modal__comment .setting-text__wrapper{background:#fff;border:1px solid #282c37;margin-bottom:10px;border-radius:4px}.report-modal__comment .setting-text__wrapper .setting-text{border:0;margin-bottom:0;border-radius:0}.report-modal__comment .setting-text__wrapper .setting-text:focus{border:0}.report-modal__comment .setting-text__wrapper__modifiers{color:#000;font-family:inherit;font-size:14px;background:#fff}.report-modal__comment .setting-text__toolbar{display:flex;justify-content:space-between;margin-bottom:20px}.report-modal__comment .setting-text-label{display:block;color:#000;font-size:14px;font-weight:500;margin-bottom:10px}.report-modal__comment .setting-toggle{margin-top:20px;margin-bottom:24px}.report-modal__comment .setting-toggle__label{color:#000;font-size:14px}@media screen and (max-width: 480px){.report-modal__comment{padding:10px;max-width:100%;order:2}.report-modal__comment .setting-toggle{margin-bottom:4px}}.actions-modal{max-height:80vh;max-width:80vw}.actions-modal .status{overflow-y:auto;max-height:300px}.actions-modal .actions-modal__item-label{font-weight:500}.actions-modal ul{overflow-y:auto;flex-shrink:0;max-height:80vh}.actions-modal ul.with-status{max-height:calc(80vh - 75px)}.actions-modal ul li:empty{margin:0}.actions-modal ul li:not(:empty) a{color:#000;display:flex;padding:12px 16px;font-size:15px;align-items:center;text-decoration:none}.actions-modal ul li:not(:empty) a,.actions-modal ul li:not(:empty) a button{transition:none}.actions-modal ul li:not(:empty) a.active,.actions-modal ul li:not(:empty) a.active button,.actions-modal ul li:not(:empty) a:hover,.actions-modal ul li:not(:empty) a:hover button,.actions-modal ul li:not(:empty) a:active,.actions-modal ul li:not(:empty) a:active button,.actions-modal ul li:not(:empty) a:focus,.actions-modal ul li:not(:empty) a:focus button{background:#2b90d9;color:#000}.actions-modal ul li:not(:empty) a button:first-child{margin-right:10px}.confirmation-modal__action-bar .confirmation-modal__secondary-button,.mute-modal__action-bar .confirmation-modal__secondary-button,.block-modal__action-bar .confirmation-modal__secondary-button{flex-shrink:1}.confirmation-modal__secondary-button,.confirmation-modal__cancel-button,.mute-modal__cancel-button,.block-modal__cancel-button{background-color:transparent;color:#282c37;font-size:14px;font-weight:500}.confirmation-modal__secondary-button:hover,.confirmation-modal__secondary-button:focus,.confirmation-modal__secondary-button:active,.confirmation-modal__cancel-button:hover,.confirmation-modal__cancel-button:focus,.confirmation-modal__cancel-button:active,.mute-modal__cancel-button:hover,.mute-modal__cancel-button:focus,.mute-modal__cancel-button:active,.block-modal__cancel-button:hover,.block-modal__cancel-button:focus,.block-modal__cancel-button:active{color:#313543;background-color:transparent}.confirmation-modal__container,.mute-modal__container,.block-modal__container,.report-modal__target{padding:30px;font-size:16px}.confirmation-modal__container strong,.mute-modal__container strong,.block-modal__container strong,.report-modal__target strong{font-weight:500}.confirmation-modal__container strong:lang(ja),.mute-modal__container strong:lang(ja),.block-modal__container strong:lang(ja),.report-modal__target strong:lang(ja){font-weight:700}.confirmation-modal__container strong:lang(ko),.mute-modal__container strong:lang(ko),.block-modal__container strong:lang(ko),.report-modal__target strong:lang(ko){font-weight:700}.confirmation-modal__container strong:lang(zh-CN),.mute-modal__container strong:lang(zh-CN),.block-modal__container strong:lang(zh-CN),.report-modal__target strong:lang(zh-CN){font-weight:700}.confirmation-modal__container strong:lang(zh-HK),.mute-modal__container strong:lang(zh-HK),.block-modal__container strong:lang(zh-HK),.report-modal__target strong:lang(zh-HK){font-weight:700}.confirmation-modal__container strong:lang(zh-TW),.mute-modal__container strong:lang(zh-TW),.block-modal__container strong:lang(zh-TW),.report-modal__target strong:lang(zh-TW){font-weight:700}.confirmation-modal__container,.report-modal__target{text-align:center}.block-modal__explanation,.mute-modal__explanation{margin-top:20px}.block-modal .setting-toggle,.mute-modal .setting-toggle{margin-top:20px;margin-bottom:24px;display:flex;align-items:center}.block-modal .setting-toggle__label,.mute-modal .setting-toggle__label{color:#000;margin:0;margin-left:8px}.report-modal__target{padding:15px}.report-modal__target .media-modal__close{top:14px;right:15px}.loading-bar{background-color:#2b90d9;height:3px;position:absolute;top:0;left:0;z-index:9999}.media-gallery__gifv__label{display:block;position:absolute;color:#000;background:rgba(255,255,255,.5);bottom:6px;left:6px;padding:2px 6px;border-radius:2px;font-size:11px;font-weight:600;z-index:1;pointer-events:none;opacity:.9;transition:opacity .1s ease;line-height:18px}.media-gallery__gifv:hover .media-gallery__gifv__label{opacity:1}.media-gallery__audio{margin-top:32px}.media-gallery__audio audio{width:100%}.attachment-list{display:flex;font-size:14px;border:1px solid #c0cdd9;border-radius:4px;margin-top:14px;overflow:hidden}.attachment-list__icon{flex:0 0 auto;color:#444b5d;padding:8px 18px;cursor:default;border-right:1px solid #c0cdd9;display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:26px}.attachment-list__icon .fa{display:block}.attachment-list__list{list-style:none;padding:4px 0;padding-left:8px;display:flex;flex-direction:column;justify-content:center}.attachment-list__list li{display:block;padding:4px 0}.attachment-list__list a{text-decoration:none;color:#444b5d;font-weight:500}.attachment-list__list a:hover{text-decoration:underline}.attachment-list.compact{border:0;margin-top:4px}.attachment-list.compact .attachment-list__list{padding:0;display:block}.attachment-list.compact .fa{color:#444b5d}.media-gallery{box-sizing:border-box;margin-top:8px;overflow:hidden;border-radius:4px;position:relative;width:100%}.media-gallery__item{border:0;box-sizing:border-box;display:block;float:left;position:relative;border-radius:4px;overflow:hidden}.media-gallery__item.standalone .media-gallery__item-gifv-thumbnail{transform:none;top:0}.media-gallery__item-thumbnail{cursor:zoom-in;display:block;text-decoration:none;color:#282c37;position:relative;z-index:1}.media-gallery__item-thumbnail,.media-gallery__item-thumbnail img{height:100%;width:100%}.media-gallery__item-thumbnail img{object-fit:cover}.media-gallery__preview{width:100%;height:100%;object-fit:cover;position:absolute;top:0;left:0;z-index:0;background:#fff}.media-gallery__preview--hidden{display:none}.media-gallery__gifv{height:100%;overflow:hidden;position:relative;width:100%}.media-gallery__item-gifv-thumbnail{cursor:zoom-in;height:100%;object-fit:cover;position:relative;top:50%;transform:translateY(-50%);width:100%;z-index:1}.media-gallery__item-thumbnail-label{clip:rect(1px 1px 1px 1px);clip:rect(1px, 1px, 1px, 1px);overflow:hidden;position:absolute}.detailed .video-player__volume__current,.detailed .video-player__volume::before,.fullscreen .video-player__volume__current,.fullscreen .video-player__volume::before{bottom:27px}.detailed .video-player__volume__handle,.fullscreen .video-player__volume__handle{bottom:23px}.audio-player{box-sizing:border-box;position:relative;background:#f2f5f7;border-radius:4px;padding-bottom:44px;direction:ltr}.audio-player.editable{border-radius:0;height:100%}.audio-player__waveform{padding:15px 0;position:relative;overflow:hidden}.audio-player__waveform::before{content:\"\";display:block;position:absolute;border-top:1px solid #ccd7e0;width:100%;height:0;left:0;top:calc(50% + 1px)}.audio-player__progress-placeholder{background-color:rgba(33,122,186,.5)}.audio-player__wave-placeholder{background-color:#a6b9c9}.audio-player .video-player__controls{padding:0 15px;padding-top:10px;background:#f2f5f7;border-top:1px solid #ccd7e0;border-radius:0 0 4px 4px}.video-player{overflow:hidden;position:relative;background:#000;max-width:100%;border-radius:4px;box-sizing:border-box;direction:ltr}.video-player.editable{border-radius:0;height:100% !important}.video-player:focus{outline:0}.video-player video{max-width:100vw;max-height:80vh;z-index:1}.video-player.fullscreen{width:100% !important;height:100% !important;margin:0}.video-player.fullscreen video{max-width:100% !important;max-height:100% !important;width:100% !important;height:100% !important;outline:0}.video-player.inline video{object-fit:contain;position:relative;top:50%;transform:translateY(-50%)}.video-player__controls{position:absolute;z-index:2;bottom:0;left:0;right:0;box-sizing:border-box;background:linear-gradient(0deg, rgba(0, 0, 0, 0.85) 0, rgba(0, 0, 0, 0.45) 60%, transparent);padding:0 15px;opacity:0;transition:opacity .1s ease}.video-player__controls.active{opacity:1}.video-player.inactive video,.video-player.inactive .video-player__controls{visibility:hidden}.video-player__spoiler{display:none;position:absolute;top:0;left:0;width:100%;height:100%;z-index:4;border:0;background:#fff;color:#282c37;transition:none;pointer-events:none}.video-player__spoiler.active{display:block;pointer-events:auto}.video-player__spoiler.active:hover,.video-player__spoiler.active:active,.video-player__spoiler.active:focus{color:#191b22}.video-player__spoiler__title{display:block;font-size:14px}.video-player__spoiler__subtitle{display:block;font-size:11px;font-weight:500}.video-player__buttons-bar{display:flex;justify-content:space-between;padding-bottom:10px}.video-player__buttons-bar .video-player__download__icon{color:inherit}.video-player__buttons{font-size:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.video-player__buttons.left button{padding-left:0}.video-player__buttons.right button{padding-right:0}.video-player__buttons button{background:transparent;padding:2px 10px;font-size:16px;border:0;color:rgba(255,255,255,.75)}.video-player__buttons button:active,.video-player__buttons button:hover,.video-player__buttons button:focus{color:#fff}.video-player__time-sep,.video-player__time-total,.video-player__time-current{font-size:14px;font-weight:500}.video-player__time-current{color:#fff;margin-left:60px}.video-player__time-sep{display:inline-block;margin:0 6px}.video-player__time-sep,.video-player__time-total{color:#fff}.video-player__volume{cursor:pointer;height:24px;display:inline}.video-player__volume::before{content:\"\";width:50px;background:rgba(255,255,255,.35);border-radius:4px;display:block;position:absolute;height:4px;left:70px;bottom:20px}.video-player__volume__current{display:block;position:absolute;height:4px;border-radius:4px;left:70px;bottom:20px;background:#217aba}.video-player__volume__handle{position:absolute;z-index:3;border-radius:50%;width:12px;height:12px;bottom:16px;left:70px;transition:opacity .1s ease;background:#217aba;box-shadow:1px 2px 6px rgba(0,0,0,.2);pointer-events:none}.video-player__link{padding:2px 10px}.video-player__link a{text-decoration:none;font-size:14px;font-weight:500;color:#fff}.video-player__link a:hover,.video-player__link a:active,.video-player__link a:focus{text-decoration:underline}.video-player__seek{cursor:pointer;height:24px;position:relative}.video-player__seek::before{content:\"\";width:100%;background:rgba(255,255,255,.35);border-radius:4px;display:block;position:absolute;height:4px;top:10px}.video-player__seek__progress,.video-player__seek__buffer{display:block;position:absolute;height:4px;border-radius:4px;top:10px;background:#217aba}.video-player__seek__buffer{background:rgba(255,255,255,.2)}.video-player__seek__handle{position:absolute;z-index:3;opacity:0;border-radius:50%;width:12px;height:12px;top:6px;margin-left:-6px;transition:opacity .1s ease;background:#217aba;box-shadow:1px 2px 6px rgba(0,0,0,.2);pointer-events:none}.video-player__seek__handle.active{opacity:1}.video-player__seek:hover .video-player__seek__handle{opacity:1}.video-player.detailed .video-player__buttons button,.video-player.fullscreen .video-player__buttons button{padding-top:10px;padding-bottom:10px}.directory__list{width:100%;margin:10px 0;transition:opacity 100ms ease-in}.directory__list.loading{opacity:.7}@media screen and (max-width: 415px){.directory__list{margin:0}}.directory__card{box-sizing:border-box;margin-bottom:10px}.directory__card__img{height:125px;position:relative;background:#fff;overflow:hidden}.directory__card__img img{display:block;width:100%;height:100%;margin:0;object-fit:cover}.directory__card__bar{display:flex;align-items:center;background:#ccd7e0;padding:10px}.directory__card__bar__name{flex:1 1 auto;display:flex;align-items:center;text-decoration:none;overflow:hidden}.directory__card__bar__relationship{width:23px;min-height:1px;flex:0 0 auto}.directory__card__bar .avatar{flex:0 0 auto;width:48px;height:48px;padding-top:2px}.directory__card__bar .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px;background:#f2f5f7;object-fit:cover}.directory__card__bar .display-name{margin-left:15px;text-align:left}.directory__card__bar .display-name strong{font-size:15px;color:#000;font-weight:500;overflow:hidden;text-overflow:ellipsis}.directory__card__bar .display-name span{display:block;font-size:14px;color:#282c37;font-weight:400;overflow:hidden;text-overflow:ellipsis}.directory__card__extra{background:#d9e1e8;display:flex;align-items:center;justify-content:center}.directory__card__extra .accounts-table__count{width:33.33%;flex:0 0 auto;padding:15px 0}.directory__card__extra .account__header__content{box-sizing:border-box;padding:15px 10px;border-bottom:1px solid #c0cdd9;width:100%;min-height:48px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.directory__card__extra .account__header__content p{display:none}.directory__card__extra .account__header__content p:first-child{display:inline}.directory__card__extra .account__header__content br{display:none}.account-gallery__container{display:flex;flex-wrap:wrap;padding:4px 2px}.account-gallery__item{border:0;box-sizing:border-box;display:block;position:relative;border-radius:4px;overflow:hidden;margin:2px}.account-gallery__item__icons{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);font-size:24px}.notification__filter-bar,.account__section-headline{background:#e6ebf0;border-bottom:1px solid #c0cdd9;cursor:default;display:flex;flex-shrink:0}.notification__filter-bar button,.account__section-headline button{background:#e6ebf0;border:0;margin:0}.notification__filter-bar button,.notification__filter-bar a,.account__section-headline button,.account__section-headline a{display:block;flex:1 1 auto;color:#282c37;padding:15px 0;font-size:14px;font-weight:500;text-align:center;text-decoration:none;position:relative;width:100%;white-space:nowrap}.notification__filter-bar button.active,.notification__filter-bar a.active,.account__section-headline button.active,.account__section-headline a.active{color:#282c37}.notification__filter-bar button.active::before,.notification__filter-bar button.active::after,.notification__filter-bar a.active::before,.notification__filter-bar a.active::after,.account__section-headline button.active::before,.account__section-headline button.active::after,.account__section-headline a.active::before,.account__section-headline a.active::after{display:block;content:\"\";position:absolute;bottom:0;left:50%;width:0;height:0;transform:translateX(-50%);border-style:solid;border-width:0 10px 10px;border-color:transparent transparent #c0cdd9}.notification__filter-bar button.active::after,.notification__filter-bar a.active::after,.account__section-headline button.active::after,.account__section-headline a.active::after{bottom:-1px;border-color:transparent transparent #d9e1e8}.notification__filter-bar.directory__section-headline,.account__section-headline.directory__section-headline{background:#dfe6ec;border-bottom-color:transparent}.notification__filter-bar.directory__section-headline a.active::before,.notification__filter-bar.directory__section-headline button.active::before,.account__section-headline.directory__section-headline a.active::before,.account__section-headline.directory__section-headline button.active::before{display:none}.notification__filter-bar.directory__section-headline a.active::after,.notification__filter-bar.directory__section-headline button.active::after,.account__section-headline.directory__section-headline a.active::after,.account__section-headline.directory__section-headline button.active::after{border-color:transparent transparent #eff3f5}.filter-form{background:#d9e1e8}.filter-form__column{padding:10px 15px}.filter-form .radio-button{display:block}.radio-button{font-size:14px;position:relative;display:inline-block;padding:6px 0;line-height:18px;cursor:default;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer}.radio-button input[type=radio],.radio-button input[type=checkbox]{display:none}.radio-button__input{display:inline-block;position:relative;border:1px solid #9bcbed;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:50%;vertical-align:middle}.radio-button__input.checked{border-color:#217aba;background:#217aba}::-webkit-scrollbar-thumb{border-radius:0}.search-popout{background:#fff;border-radius:4px;padding:10px 14px;padding-bottom:14px;margin-top:10px;color:#444b5d;box-shadow:2px 4px 15px rgba(0,0,0,.4)}.search-popout h4{text-transform:uppercase;color:#444b5d;font-size:13px;font-weight:500;margin-bottom:10px}.search-popout li{padding:4px 0}.search-popout ul{margin-bottom:10px}.search-popout em{font-weight:500;color:#000}noscript{text-align:center}noscript img{width:200px;opacity:.5;animation:flicker 4s infinite}noscript div{font-size:14px;margin:30px auto;color:#282c37;max-width:400px}noscript div a{color:#2b90d9;text-decoration:underline}noscript div a:hover{text-decoration:none}@keyframes flicker{0%{opacity:1}30%{opacity:.75}100%{opacity:1}}@media screen and (max-width: 630px)and (max-height: 400px){.tabs-bar,.search{will-change:margin-top;transition:margin-top 400ms 100ms}.navigation-bar{will-change:padding-bottom;transition:padding-bottom 400ms 100ms}.navigation-bar>a:first-child{will-change:margin-top,margin-left,margin-right,width;transition:margin-top 400ms 100ms,margin-left 400ms 500ms,margin-right 400ms 500ms}.navigation-bar>.navigation-bar__profile-edit{will-change:margin-top;transition:margin-top 400ms 100ms}.navigation-bar .navigation-bar__actions>.icon-button.close{will-change:opacity transform;transition:opacity 200ms 100ms,transform 400ms 100ms}.navigation-bar .navigation-bar__actions>.compose__action-bar .icon-button{will-change:opacity transform;transition:opacity 200ms 300ms,transform 400ms 100ms}.is-composing .tabs-bar,.is-composing .search{margin-top:-50px}.is-composing .navigation-bar{padding-bottom:0}.is-composing .navigation-bar>a:first-child{margin:-100px 10px 0 -50px}.is-composing .navigation-bar .navigation-bar__profile{padding-top:2px}.is-composing .navigation-bar .navigation-bar__profile-edit{position:absolute;margin-top:-60px}.is-composing .navigation-bar .navigation-bar__actions .icon-button.close{pointer-events:auto;opacity:1;transform:scale(1, 1) translate(0, 0);bottom:5px}.is-composing .navigation-bar .navigation-bar__actions .compose__action-bar .icon-button{pointer-events:none;opacity:0;transform:scale(0, 1) translate(100%, 0)}}.embed-modal{width:auto;max-width:80vw;max-height:80vh}.embed-modal h4{padding:30px;font-weight:500;font-size:16px;text-align:center}.embed-modal .embed-modal__container{padding:10px}.embed-modal .embed-modal__container .hint{margin-bottom:15px}.embed-modal .embed-modal__container .embed-modal__html{outline:0;box-sizing:border-box;display:block;width:100%;border:0;padding:10px;font-family:\"mastodon-font-monospace\",monospace;background:#d9e1e8;color:#000;font-size:14px;margin:0;margin-bottom:15px;border-radius:4px}.embed-modal .embed-modal__container .embed-modal__html::-moz-focus-inner{border:0}.embed-modal .embed-modal__container .embed-modal__html::-moz-focus-inner,.embed-modal .embed-modal__container .embed-modal__html:focus,.embed-modal .embed-modal__container .embed-modal__html:active{outline:0 !important}.embed-modal .embed-modal__container .embed-modal__html:focus{background:#ccd7e0}@media screen and (max-width: 600px){.embed-modal .embed-modal__container .embed-modal__html{font-size:16px}}.embed-modal .embed-modal__container .embed-modal__iframe{width:400px;max-width:100%;overflow:hidden;border:0;border-radius:4px}.account__moved-note{padding:14px 10px;padding-bottom:16px;background:#ccd7e0;border-top:1px solid #c0cdd9;border-bottom:1px solid #c0cdd9}.account__moved-note__message{position:relative;margin-left:58px;color:#444b5d;padding:8px 0;padding-top:0;padding-bottom:4px;font-size:14px}.account__moved-note__message>span{display:block;overflow:hidden;text-overflow:ellipsis}.account__moved-note__icon-wrapper{left:-26px;position:absolute}.account__moved-note .detailed-status__display-avatar{position:relative}.account__moved-note .detailed-status__display-name{margin-bottom:0}.column-inline-form{padding:15px;padding-right:0;display:flex;justify-content:flex-start;align-items:center;background:#ccd7e0}.column-inline-form label{flex:1 1 auto}.column-inline-form label input{width:100%}.column-inline-form label input:focus{outline:0}.column-inline-form .icon-button{flex:0 0 auto;margin:0 10px}.drawer__backdrop{cursor:pointer;position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(255,255,255,.5)}.list-editor{background:#d9e1e8;flex-direction:column;border-radius:8px;box-shadow:2px 4px 15px rgba(0,0,0,.4);width:380px;overflow:hidden}@media screen and (max-width: 420px){.list-editor{width:90%}}.list-editor h4{padding:15px 0;background:#b0c0cf;font-weight:500;font-size:16px;text-align:center;border-radius:8px 8px 0 0}.list-editor .drawer__pager{height:50vh}.list-editor .drawer__inner{border-radius:0 0 8px 8px}.list-editor .drawer__inner.backdrop{width:calc(100% - 60px);box-shadow:2px 4px 15px rgba(0,0,0,.4);border-radius:0 0 0 8px}.list-editor__accounts{overflow-y:auto}.list-editor .account__display-name:hover strong{text-decoration:none}.list-editor .account__avatar{cursor:default}.list-editor .search{margin-bottom:0}.list-adder{background:#d9e1e8;flex-direction:column;border-radius:8px;box-shadow:2px 4px 15px rgba(0,0,0,.4);width:380px;overflow:hidden}@media screen and (max-width: 420px){.list-adder{width:90%}}.list-adder__account{background:#b0c0cf}.list-adder__lists{background:#b0c0cf;height:50vh;border-radius:0 0 8px 8px;overflow-y:auto}.list-adder .list{padding:10px;border-bottom:1px solid #c0cdd9}.list-adder .list__wrapper{display:flex}.list-adder .list__display-name{flex:1 1 auto;overflow:hidden;text-decoration:none;font-size:16px;padding:10px}.focal-point{position:relative;cursor:move;overflow:hidden;height:100%;display:flex;justify-content:center;align-items:center;background:#000}.focal-point img,.focal-point video,.focal-point canvas{display:block;max-height:80vh;width:100%;height:auto;margin:0;object-fit:contain;background:#000}.focal-point__reticle{position:absolute;width:100px;height:100px;transform:translate(-50%, -50%);background:url(\"~images/reticle.png\") no-repeat 0 0;border-radius:50%;box-shadow:0 0 0 9999em rgba(0,0,0,.35)}.focal-point__overlay{position:absolute;width:100%;height:100%;top:0;left:0}.focal-point__preview{position:absolute;bottom:10px;right:10px;z-index:2;cursor:move;transition:opacity .1s ease}.focal-point__preview:hover{opacity:.5}.focal-point__preview strong{color:#000;font-size:14px;font-weight:500;display:block;margin-bottom:5px}.focal-point__preview div{border-radius:4px;box-shadow:0 0 14px rgba(0,0,0,.2)}@media screen and (max-width: 480px){.focal-point img,.focal-point video{max-height:100%}.focal-point__preview{display:none}}.account__header__content{color:#282c37;font-size:14px;font-weight:400;overflow:hidden;word-break:normal;word-wrap:break-word}.account__header__content p{margin-bottom:20px}.account__header__content p:last-child{margin-bottom:0}.account__header__content a{color:inherit;text-decoration:underline}.account__header__content a:hover{text-decoration:none}.account__header{overflow:hidden}.account__header.inactive{opacity:.5}.account__header.inactive .account__header__image,.account__header.inactive .account__avatar{filter:grayscale(100%)}.account__header__info{position:absolute;top:10px;left:10px}.account__header__image{overflow:hidden;height:145px;position:relative;background:#e6ebf0}.account__header__image img{object-fit:cover;display:block;width:100%;height:100%;margin:0}.account__header__bar{position:relative;background:#ccd7e0;padding:5px;border-bottom:1px solid #b3c3d1}.account__header__bar .avatar{display:block;flex:0 0 auto;width:94px;margin-left:-2px}.account__header__bar .avatar .account__avatar{background:#f2f5f7;border:2px solid #ccd7e0}.account__header__tabs{display:flex;align-items:flex-start;padding:7px 5px;margin-top:-55px}.account__header__tabs__buttons{display:flex;align-items:center;padding-top:55px;overflow:hidden}.account__header__tabs__buttons .icon-button{border:1px solid #b3c3d1;border-radius:4px;box-sizing:content-box;padding:2px}.account__header__tabs__buttons .button{margin:0 8px}.account__header__tabs__name{padding:5px}.account__header__tabs__name .account-role{vertical-align:top}.account__header__tabs__name .emojione{width:22px;height:22px}.account__header__tabs__name h1{font-size:16px;line-height:24px;color:#000;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.account__header__tabs__name h1 small{display:block;font-size:14px;color:#282c37;font-weight:400;overflow:hidden;text-overflow:ellipsis}.account__header__tabs .spacer{flex:1 1 auto}.account__header__bio{overflow:hidden;margin:0 -5px}.account__header__bio .account__header__content{padding:20px 15px;padding-bottom:5px;color:#000}.account__header__bio .account__header__fields{margin:0;border-top:1px solid #b3c3d1}.account__header__bio .account__header__fields a{color:#217aba}.account__header__bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.account__header__bio .account__header__fields .verified a{color:#4a905f}.account__header__extra{margin-top:4px}.account__header__extra__links{font-size:14px;color:#282c37;padding:10px 0}.account__header__extra__links a{display:inline-block;color:#282c37;text-decoration:none;padding:5px 10px;font-weight:500}.account__header__extra__links a strong{font-weight:700;color:#000}.trends__header{color:#444b5d;background:#d3dce4;border-bottom:1px solid #e6ebf0;font-weight:500;padding:15px;font-size:16px;cursor:default}.trends__header .fa{display:inline-block;margin-right:5px}.trends__item{display:flex;align-items:center;padding:15px;border-bottom:1px solid #c0cdd9}.trends__item:last-child{border-bottom:0}.trends__item__name{flex:1 1 auto;color:#444b5d;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trends__item__name strong{font-weight:500}.trends__item__name a{color:#282c37;text-decoration:none;font-size:14px;font-weight:500;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trends__item__name a:hover span,.trends__item__name a:focus span,.trends__item__name a:active span{text-decoration:underline}.trends__item__current{flex:0 0 auto;font-size:24px;line-height:36px;font-weight:500;text-align:right;padding-right:15px;margin-left:5px;color:#282c37}.trends__item__sparkline{flex:0 0 auto;width:50px}.trends__item__sparkline path:first-child{fill:rgba(43,144,217,.25) !important;fill-opacity:1 !important}.trends__item__sparkline path:last-child{stroke:#2380c3 !important}.conversation{display:flex;border-bottom:1px solid #c0cdd9;padding:5px;padding-bottom:0}.conversation:focus{background:#d3dce4;outline:0}.conversation__avatar{flex:0 0 auto;padding:10px;padding-top:12px;position:relative;cursor:pointer}.conversation__unread{display:inline-block;background:#2b90d9;border-radius:50%;width:.625rem;height:.625rem;margin:-0.1ex .15em .1ex}.conversation__content{flex:1 1 auto;padding:10px 5px;padding-right:15px;overflow:hidden}.conversation__content__info{overflow:hidden;display:flex;flex-direction:row-reverse;justify-content:space-between}.conversation__content__relative-time{font-size:15px;color:#282c37;padding-left:15px}.conversation__content__names{color:#282c37;font-size:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:4px;flex-basis:90px;flex-grow:1}.conversation__content__names a{color:#000;text-decoration:none}.conversation__content__names a:hover,.conversation__content__names a:focus,.conversation__content__names a:active{text-decoration:underline}.conversation__content a{word-break:break-word}.conversation--unread{background:#d3dce4}.conversation--unread:focus{background:#ccd7e0}.conversation--unread .conversation__content__info{font-weight:700}.conversation--unread .conversation__content__relative-time{color:#000}.announcements{background:#c0cdd9;font-size:13px;display:flex;align-items:flex-end}.announcements__mastodon{width:124px;flex:0 0 auto}@media screen and (max-width: 424px){.announcements__mastodon{display:none}}.announcements__container{width:calc(100% - 124px);flex:0 0 auto;position:relative}@media screen and (max-width: 424px){.announcements__container{width:100%}}.announcements__item{box-sizing:border-box;width:100%;padding:15px;position:relative;font-size:15px;line-height:20px;word-wrap:break-word;font-weight:400;max-height:50vh;overflow:hidden;display:flex;flex-direction:column}.announcements__item__range{display:block;font-weight:500;margin-bottom:10px;padding-right:18px}.announcements__item__unread{position:absolute;top:19px;right:19px;display:block;background:#2b90d9;border-radius:50%;width:.625rem;height:.625rem}.announcements__pagination{padding:15px;color:#282c37;position:absolute;bottom:3px;right:0}.layout-multiple-columns .announcements__mastodon{display:none}.layout-multiple-columns .announcements__container{width:100%}.reactions-bar{display:flex;flex-wrap:wrap;align-items:center;margin-top:15px;margin-left:-2px;width:calc(100% - (90px - 33px))}.reactions-bar__item{flex-shrink:0;background:#b3c3d1;border:0;border-radius:3px;margin:2px;cursor:pointer;user-select:none;padding:0 6px;display:flex;align-items:center;transition:all 100ms ease-in;transition-property:background-color,color}.reactions-bar__item__emoji{display:block;margin:3px 0;width:16px;height:16px}.reactions-bar__item__emoji img{display:block;margin:0;width:100%;height:100%;min-width:auto;min-height:auto;vertical-align:bottom;object-fit:contain}.reactions-bar__item__count{display:block;min-width:9px;font-size:13px;font-weight:500;text-align:center;margin-left:6px;color:#282c37}.reactions-bar__item:hover,.reactions-bar__item:focus,.reactions-bar__item:active{background:#a6b9c9;transition:all 200ms ease-out;transition-property:background-color,color}.reactions-bar__item:hover__count,.reactions-bar__item:focus__count,.reactions-bar__item:active__count{color:#1f232b}.reactions-bar__item.active{transition:all 100ms ease-in;transition-property:background-color,color;background-color:#98b9d3}.reactions-bar__item.active .reactions-bar__item__count{color:#217aba}.reactions-bar .emoji-picker-dropdown{margin:2px}.reactions-bar:hover .emoji-button{opacity:.85}.reactions-bar .emoji-button{color:#282c37;margin:0;font-size:16px;width:auto;flex-shrink:0;padding:0 6px;height:22px;display:flex;align-items:center;opacity:.5;transition:all 100ms ease-in;transition-property:background-color,color}.reactions-bar .emoji-button:hover,.reactions-bar .emoji-button:active,.reactions-bar .emoji-button:focus{opacity:1;color:#1f232b;transition:all 200ms ease-out;transition-property:background-color,color}.reactions-bar--empty .emoji-button{padding:0}.poll{margin-top:16px;font-size:14px}.poll li{margin-bottom:10px;position:relative}.poll__chart{border-radius:4px;display:block;background:#b1d6f1;height:5px;min-width:1%}.poll__chart.leading{background:#2b90d9}.poll__option{position:relative;display:flex;padding:6px 0;line-height:18px;cursor:default;overflow:hidden}.poll__option__text{display:inline-block;word-wrap:break-word;overflow-wrap:break-word;max-width:calc(100% - 45px - 25px)}.poll__option input[type=radio],.poll__option input[type=checkbox]{display:none}.poll__option .autossugest-input{flex:1 1 auto}.poll__option input[type=text]{display:block;box-sizing:border-box;width:100%;font-size:14px;color:#000;outline:0;font-family:inherit;background:#fff;border:1px solid #fff;border-radius:4px;padding:6px 10px}.poll__option input[type=text]:focus{border-color:#2b90d9}.poll__option.selectable{cursor:pointer}.poll__option.editable{display:flex;align-items:center;overflow:visible}.poll__input{display:inline-block;position:relative;border:1px solid #9bcbed;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:50%;vertical-align:middle;margin-top:auto;margin-bottom:auto;flex:0 0 18px}.poll__input.checkbox{border-radius:4px}.poll__input.active{border-color:#4a905f;background:#4a905f}.poll__input:active,.poll__input:focus,.poll__input:hover{border-color:#305d3d;border-width:4px}.poll__input::-moz-focus-inner{outline:0 !important;border:0}.poll__input:focus,.poll__input:active{outline:0 !important}.poll__number{display:inline-block;width:45px;font-weight:700;flex:0 0 45px}.poll__voted{padding:0 5px;display:inline-block}.poll__voted__mark{font-size:18px}.poll__footer{padding-top:6px;padding-bottom:5px;color:#444b5d}.poll__link{display:inline;background:transparent;padding:0;margin:0;border:0;color:#444b5d;text-decoration:underline;font-size:inherit}.poll__link:hover{text-decoration:none}.poll__link:active,.poll__link:focus{background-color:rgba(68,75,93,.1)}.poll .button{height:36px;padding:0 16px;margin-right:10px;font-size:14px}.compose-form__poll-wrapper{border-top:1px solid #fff}.compose-form__poll-wrapper ul{padding:10px}.compose-form__poll-wrapper .poll__footer{border-top:1px solid #fff;padding:10px;display:flex;align-items:center}.compose-form__poll-wrapper .poll__footer button,.compose-form__poll-wrapper .poll__footer select{flex:1 1 50%}.compose-form__poll-wrapper .poll__footer button:focus,.compose-form__poll-wrapper .poll__footer select:focus{border-color:#2b90d9}.compose-form__poll-wrapper .button.button-secondary{font-size:14px;font-weight:400;padding:6px 10px;height:auto;line-height:inherit;color:#606984;border-color:#606984;margin-right:5px}.compose-form__poll-wrapper li{display:flex;align-items:center}.compose-form__poll-wrapper li .poll__option{flex:0 0 auto;width:calc(100% - (23px + 6px));margin-right:6px}.compose-form__poll-wrapper select{appearance:none;box-sizing:border-box;font-size:14px;color:#000;display:inline-block;width:auto;outline:0;font-family:inherit;background:#fff url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center/auto 16px;border:1px solid #fff;border-radius:4px;padding:6px 10px;padding-right:30px}.compose-form__poll-wrapper .icon-button.disabled{color:#fff}.muted .poll{color:#444b5d}.muted .poll__chart{background:rgba(216,234,248,.2)}.muted .poll__chart.leading{background:rgba(43,144,217,.2)}.modal-layout{background:#d9e1e8 url('data:image/svg+xml;utf8,') repeat-x bottom fixed;display:flex;flex-direction:column;height:100vh;padding:0}.modal-layout__mastodon{display:flex;flex:1;flex-direction:column;justify-content:flex-end}.modal-layout__mastodon>*{flex:1;max-height:235px}@media screen and (max-width: 600px){.account-header{margin-top:0}}.emoji-mart{font-size:13px;display:inline-block;color:#000}.emoji-mart,.emoji-mart *{box-sizing:border-box;line-height:1.15}.emoji-mart .emoji-mart-emoji{padding:6px}.emoji-mart-bar{border:0 solid #393f4f}.emoji-mart-bar:first-child{border-bottom-width:1px;border-top-left-radius:5px;border-top-right-radius:5px;background:#282c37}.emoji-mart-bar:last-child{border-top-width:1px;border-bottom-left-radius:5px;border-bottom-right-radius:5px;display:none}.emoji-mart-anchors{display:flex;justify-content:space-between;padding:0 6px;color:#282c37;line-height:0}.emoji-mart-anchor{position:relative;flex:1;text-align:center;padding:12px 4px;overflow:hidden;transition:color .1s ease-out;cursor:pointer}.emoji-mart-anchor:hover{color:#313543}.emoji-mart-anchor-selected{color:#2b90d9}.emoji-mart-anchor-selected:hover{color:#3c99dc}.emoji-mart-anchor-selected .emoji-mart-anchor-bar{bottom:-1px}.emoji-mart-anchor-bar{position:absolute;bottom:-5px;left:0;width:100%;height:4px;background-color:#2b90d9}.emoji-mart-anchors i{display:inline-block;width:100%;max-width:22px}.emoji-mart-anchors svg{fill:currentColor;max-height:18px}.emoji-mart-scroll{overflow-y:scroll;height:270px;max-height:35vh;padding:0 6px 6px;background:#fff;will-change:transform}.emoji-mart-scroll::-webkit-scrollbar-track:hover,.emoji-mart-scroll::-webkit-scrollbar-track:active{background-color:rgba(255,255,255,.3)}.emoji-mart-search{padding:10px;padding-right:45px;background:#fff}.emoji-mart-search input{font-size:14px;font-weight:400;padding:7px 9px;font-family:inherit;display:block;width:100%;background:rgba(40,44,55,.3);color:#000;border:1px solid #282c37;border-radius:4px}.emoji-mart-search input::-moz-focus-inner{border:0}.emoji-mart-search input::-moz-focus-inner,.emoji-mart-search input:focus,.emoji-mart-search input:active{outline:0 !important}.emoji-mart-category .emoji-mart-emoji{cursor:pointer}.emoji-mart-category .emoji-mart-emoji span{z-index:1;position:relative;text-align:center}.emoji-mart-category .emoji-mart-emoji:hover::before{z-index:0;content:\"\";position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(40,44,55,.7);border-radius:100%}.emoji-mart-category-label{z-index:2;position:relative;position:-webkit-sticky;position:sticky;top:0}.emoji-mart-category-label span{display:block;width:100%;font-weight:500;padding:5px 6px;background:#fff}.emoji-mart-emoji{position:relative;display:inline-block;font-size:0}.emoji-mart-emoji span{width:22px;height:22px}.emoji-mart-no-results{font-size:14px;text-align:center;padding-top:70px;color:#444b5d}.emoji-mart-no-results .emoji-mart-category-label{display:none}.emoji-mart-no-results .emoji-mart-no-results-label{margin-top:.2em}.emoji-mart-no-results .emoji-mart-emoji:hover::before{content:none}.emoji-mart-preview{display:none}.container{box-sizing:border-box;max-width:1235px;margin:0 auto;position:relative}@media screen and (max-width: 1255px){.container{width:100%;padding:0 10px}}.rich-formatting{font-family:\"mastodon-font-sans-serif\",sans-serif;font-size:14px;font-weight:400;line-height:1.7;word-wrap:break-word;color:#282c37}.rich-formatting a{color:#2b90d9;text-decoration:underline}.rich-formatting a:hover,.rich-formatting a:focus,.rich-formatting a:active{text-decoration:none}.rich-formatting p,.rich-formatting li{color:#282c37}.rich-formatting p{margin-top:0;margin-bottom:.85em}.rich-formatting p:last-child{margin-bottom:0}.rich-formatting strong{font-weight:700;color:#282c37}.rich-formatting em{font-style:italic;color:#282c37}.rich-formatting code{font-size:.85em;background:#f2f5f7;border-radius:4px;padding:.2em .3em}.rich-formatting h1,.rich-formatting h2,.rich-formatting h3,.rich-formatting h4,.rich-formatting h5,.rich-formatting h6{font-family:\"mastodon-font-display\",sans-serif;margin-top:1.275em;margin-bottom:.85em;font-weight:500;color:#282c37}.rich-formatting h1{font-size:2em}.rich-formatting h2{font-size:1.75em}.rich-formatting h3{font-size:1.5em}.rich-formatting h4{font-size:1.25em}.rich-formatting h5,.rich-formatting h6{font-size:1em}.rich-formatting ul{list-style:disc}.rich-formatting ol{list-style:decimal}.rich-formatting ul,.rich-formatting ol{margin:0;padding:0;padding-left:2em;margin-bottom:.85em}.rich-formatting ul[type=a],.rich-formatting ol[type=a]{list-style-type:lower-alpha}.rich-formatting ul[type=i],.rich-formatting ol[type=i]{list-style-type:lower-roman}.rich-formatting hr{width:100%;height:0;border:0;border-bottom:1px solid #ccd7e0;margin:1.7em 0}.rich-formatting hr.spacer{height:1px;border:0}.rich-formatting table{width:100%;border-collapse:collapse;break-inside:auto;margin-top:24px;margin-bottom:32px}.rich-formatting table thead tr,.rich-formatting table tbody tr{border-bottom:1px solid #ccd7e0;font-size:1em;line-height:1.625;font-weight:400;text-align:left;color:#282c37}.rich-formatting table thead tr{border-bottom-width:2px;line-height:1.5;font-weight:500;color:#444b5d}.rich-formatting table th,.rich-formatting table td{padding:8px;align-self:start;align-items:start;word-break:break-all}.rich-formatting table th.nowrap,.rich-formatting table td.nowrap{width:25%;position:relative}.rich-formatting table th.nowrap::before,.rich-formatting table td.nowrap::before{content:\" \";visibility:hidden}.rich-formatting table th.nowrap span,.rich-formatting table td.nowrap span{position:absolute;left:8px;right:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rich-formatting>:first-child{margin-top:0}.information-board{background:#e6ebf0;padding:20px 0}.information-board .container-alt{position:relative;padding-right:295px}.information-board__sections{display:flex;justify-content:space-between;flex-wrap:wrap}.information-board__section{flex:1 0 0;font-family:\"mastodon-font-sans-serif\",sans-serif;font-size:16px;line-height:28px;color:#000;text-align:right;padding:10px 15px}.information-board__section span,.information-board__section strong{display:block}.information-board__section span:last-child{color:#282c37}.information-board__section strong{font-family:\"mastodon-font-display\",sans-serif;font-weight:500;font-size:32px;line-height:48px}@media screen and (max-width: 700px){.information-board__section{text-align:center}}.information-board .panel{position:absolute;width:280px;box-sizing:border-box;background:#f2f5f7;padding:20px;padding-top:10px;border-radius:4px 4px 0 0;right:0;bottom:-40px}.information-board .panel .panel-header{font-family:\"mastodon-font-display\",sans-serif;font-size:14px;line-height:24px;font-weight:500;color:#282c37;padding-bottom:5px;margin-bottom:15px;border-bottom:1px solid #ccd7e0;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.information-board .panel .panel-header a,.information-board .panel .panel-header span{font-weight:400;color:#3d4455}.information-board .panel .panel-header a{text-decoration:none}.information-board .owner{text-align:center}.information-board .owner .avatar{width:80px;height:80px;margin:0 auto;margin-bottom:15px}.information-board .owner .avatar img{display:block;width:80px;height:80px;border-radius:48px}.information-board .owner .name{font-size:14px}.information-board .owner .name a{display:block;color:#000;text-decoration:none}.information-board .owner .name a:hover .display_name{text-decoration:underline}.information-board .owner .name .username{display:block;color:#282c37}.landing-page p,.landing-page li{font-family:\"mastodon-font-sans-serif\",sans-serif;font-size:16px;font-weight:400;font-size:16px;line-height:30px;margin-bottom:12px;color:#282c37}.landing-page p a,.landing-page li a{color:#2b90d9;text-decoration:underline}.landing-page em{display:inline;margin:0;padding:0;font-weight:700;background:transparent;font-family:inherit;font-size:inherit;line-height:inherit;color:#131419}.landing-page h1{font-family:\"mastodon-font-display\",sans-serif;font-size:26px;line-height:30px;font-weight:500;margin-bottom:20px;color:#282c37}.landing-page h1 small{font-family:\"mastodon-font-sans-serif\",sans-serif;display:block;font-size:18px;font-weight:400;color:#131419}.landing-page h2{font-family:\"mastodon-font-display\",sans-serif;font-size:22px;line-height:26px;font-weight:500;margin-bottom:20px;color:#282c37}.landing-page h3{font-family:\"mastodon-font-display\",sans-serif;font-size:18px;line-height:24px;font-weight:500;margin-bottom:20px;color:#282c37}.landing-page h4{font-family:\"mastodon-font-display\",sans-serif;font-size:16px;line-height:24px;font-weight:500;margin-bottom:20px;color:#282c37}.landing-page h5{font-family:\"mastodon-font-display\",sans-serif;font-size:14px;line-height:24px;font-weight:500;margin-bottom:20px;color:#282c37}.landing-page h6{font-family:\"mastodon-font-display\",sans-serif;font-size:12px;line-height:24px;font-weight:500;margin-bottom:20px;color:#282c37}.landing-page ul,.landing-page ol{margin-left:20px}.landing-page ul[type=a],.landing-page ol[type=a]{list-style-type:lower-alpha}.landing-page ul[type=i],.landing-page ol[type=i]{list-style-type:lower-roman}.landing-page ul{list-style:disc}.landing-page ol{list-style:decimal}.landing-page li>ol,.landing-page li>ul{margin-top:6px}.landing-page hr{width:100%;height:0;border:0;border-bottom:1px solid rgba(176,192,207,.6);margin:20px 0}.landing-page hr.spacer{height:1px;border:0}.landing-page__information,.landing-page__forms{padding:20px}.landing-page__call-to-action{background:#d9e1e8;border-radius:4px;padding:25px 40px;overflow:hidden;box-sizing:border-box}.landing-page__call-to-action .row{width:100%;display:flex;flex-direction:row-reverse;flex-wrap:nowrap;justify-content:space-between;align-items:center}.landing-page__call-to-action .row__information-board{display:flex;justify-content:flex-end;align-items:flex-end}.landing-page__call-to-action .row__information-board .information-board__section{flex:1 0 auto;padding:0 10px}@media screen and (max-width: 415px){.landing-page__call-to-action .row__information-board{width:100%;justify-content:space-between}}.landing-page__call-to-action .row__mascot{flex:1;margin:10px -50px 0 0}@media screen and (max-width: 415px){.landing-page__call-to-action .row__mascot{display:none}}.landing-page__logo{margin-right:20px}.landing-page__logo img{height:50px;width:auto;mix-blend-mode:lighten}.landing-page__information{padding:45px 40px;margin-bottom:10px}.landing-page__information:last-child{margin-bottom:0}.landing-page__information strong{font-weight:500;color:#131419}.landing-page__information .account{border-bottom:0;padding:0}.landing-page__information .account__display-name{align-items:center;display:flex;margin-right:5px}.landing-page__information .account div.account__display-name:hover .display-name strong{text-decoration:none}.landing-page__information .account div.account__display-name .account__avatar{cursor:default}.landing-page__information .account__avatar-wrapper{margin-left:0;flex:0 0 auto}.landing-page__information .account__avatar{width:44px;height:44px;background-size:44px 44px}.landing-page__information .account .display-name{font-size:15px}.landing-page__information .account .display-name__account{font-size:14px}@media screen and (max-width: 960px){.landing-page__information .contact{margin-top:30px}}@media screen and (max-width: 700px){.landing-page__information{padding:25px 20px}}.landing-page__information,.landing-page__forms,.landing-page #mastodon-timeline{box-sizing:border-box;background:#d9e1e8;border-radius:4px;box-shadow:0 0 6px rgba(0,0,0,.1)}.landing-page__mascot{height:104px;position:relative;left:-40px;bottom:25px}.landing-page__mascot img{height:190px;width:auto}.landing-page__short-description .row{display:flex;flex-wrap:wrap;align-items:center;margin-bottom:40px}@media screen and (max-width: 700px){.landing-page__short-description .row{margin-bottom:20px}}.landing-page__short-description p a{color:#282c37}.landing-page__short-description h1{font-weight:500;color:#000;margin-bottom:0}.landing-page__short-description h1 small{color:#282c37}.landing-page__short-description h1 small span{color:#282c37}.landing-page__short-description p:last-child{margin-bottom:0}.landing-page__hero{margin-bottom:10px}.landing-page__hero img{display:block;margin:0;max-width:100%;height:auto;border-radius:4px}@media screen and (max-width: 840px){.landing-page .information-board .container-alt{padding-right:20px}.landing-page .information-board .panel{position:static;margin-top:20px;width:100%;border-radius:4px}.landing-page .information-board .panel .panel-header{text-align:center}}@media screen and (max-width: 675px){.landing-page .header-wrapper{padding-top:0}.landing-page .header-wrapper.compact{padding-bottom:0}.landing-page .header-wrapper.compact .hero .heading{text-align:initial}.landing-page .header .container-alt,.landing-page .features .container-alt{display:block}}.landing-page .cta{margin:20px}.landing{margin-bottom:100px}@media screen and (max-width: 738px){.landing{margin-bottom:0}}.landing__brand{display:flex;justify-content:center;align-items:center;padding:50px}.landing__brand svg{fill:#000;height:52px}@media screen and (max-width: 415px){.landing__brand{padding:0;margin-bottom:30px}}.landing .directory{margin-top:30px;background:transparent;box-shadow:none;border-radius:0}.landing .hero-widget{margin-top:30px;margin-bottom:0}.landing .hero-widget h4{padding:10px;text-transform:uppercase;font-weight:700;font-size:13px;color:#282c37}.landing .hero-widget__text{border-radius:0;padding-bottom:0}.landing .hero-widget__footer{background:#d9e1e8;padding:10px;border-radius:0 0 4px 4px;display:flex}.landing .hero-widget__footer__column{flex:1 1 50%}.landing .hero-widget .account{padding:10px 0;border-bottom:0}.landing .hero-widget .account .account__display-name{display:flex;align-items:center}.landing .hero-widget .account .account__avatar{width:44px;height:44px;background-size:44px 44px}.landing .hero-widget__counter{padding:10px}.landing .hero-widget__counter strong{font-family:\"mastodon-font-display\",sans-serif;font-size:15px;font-weight:700;display:block}.landing .hero-widget__counter span{font-size:14px;color:#282c37}.landing .simple_form .user_agreement .label_input>label{font-weight:400;color:#282c37}.landing .simple_form p.lead{color:#282c37;font-size:15px;line-height:20px;font-weight:400;margin-bottom:25px}.landing__grid{max-width:960px;margin:0 auto;display:grid;grid-template-columns:minmax(0, 50%) minmax(0, 50%);grid-gap:30px}@media screen and (max-width: 738px){.landing__grid{grid-template-columns:minmax(0, 100%);grid-gap:10px}.landing__grid__column-login{grid-row:1;display:flex;flex-direction:column}.landing__grid__column-login .box-widget{order:2;flex:0 0 auto}.landing__grid__column-login .hero-widget{margin-top:0;margin-bottom:10px;order:1;flex:0 0 auto}.landing__grid__column-registration{grid-row:2}.landing__grid .directory{margin-top:10px}}@media screen and (max-width: 415px){.landing__grid{grid-gap:0}.landing__grid .hero-widget{display:block;margin-bottom:0;box-shadow:none}.landing__grid .hero-widget__img,.landing__grid .hero-widget__img img,.landing__grid .hero-widget__footer{border-radius:0}.landing__grid .hero-widget,.landing__grid .box-widget,.landing__grid .directory__tag{border-bottom:1px solid #c0cdd9}.landing__grid .directory{margin-top:0}.landing__grid .directory__tag{margin-bottom:0}.landing__grid .directory__tag>a,.landing__grid .directory__tag>div{border-radius:0;box-shadow:none}.landing__grid .directory__tag:last-child{border-bottom:0}}.brand{position:relative;text-decoration:none}.brand__tagline{display:block;position:absolute;bottom:-10px;left:50px;width:300px;color:#9bcbed;text-decoration:none;font-size:14px}@media screen and (max-width: 415px){.brand__tagline{position:static;width:auto;margin-top:20px;color:#444b5d}}.table{width:100%;max-width:100%;border-spacing:0;border-collapse:collapse}.table th,.table td{padding:8px;line-height:18px;vertical-align:top;border-top:1px solid #d9e1e8;text-align:left;background:#e6ebf0}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #d9e1e8;border-top:0;font-weight:500}.table>tbody>tr>th{font-weight:500}.table>tbody>tr:nth-child(odd)>td,.table>tbody>tr:nth-child(odd)>th{background:#d9e1e8}.table a{color:#2b90d9;text-decoration:underline}.table a:hover{text-decoration:none}.table strong{font-weight:500}.table strong:lang(ja){font-weight:700}.table strong:lang(ko){font-weight:700}.table strong:lang(zh-CN){font-weight:700}.table strong:lang(zh-HK){font-weight:700}.table strong:lang(zh-TW){font-weight:700}.table.inline-table>tbody>tr:nth-child(odd)>td,.table.inline-table>tbody>tr:nth-child(odd)>th{background:transparent}.table.inline-table>tbody>tr:first-child>td,.table.inline-table>tbody>tr:first-child>th{border-top:0}.table.batch-table>thead>tr>th{background:#d9e1e8;border-top:1px solid #f2f5f7;border-bottom:1px solid #f2f5f7}.table.batch-table>thead>tr>th:first-child{border-radius:4px 0 0;border-left:1px solid #f2f5f7}.table.batch-table>thead>tr>th:last-child{border-radius:0 4px 0 0;border-right:1px solid #f2f5f7}.table--invites tbody td{vertical-align:middle}.table-wrapper{overflow:auto;margin-bottom:20px}samp{font-family:\"mastodon-font-monospace\",monospace}button.table-action-link{background:transparent;border:0;font:inherit}button.table-action-link,a.table-action-link{text-decoration:none;display:inline-block;margin-right:5px;padding:0 10px;color:#282c37;font-weight:500}button.table-action-link:hover,a.table-action-link:hover{color:#000}button.table-action-link i.fa,a.table-action-link i.fa{font-weight:400;margin-right:5px}button.table-action-link:first-child,a.table-action-link:first-child{padding-left:0}.batch-table__toolbar,.batch-table__row{display:flex}.batch-table__toolbar__select,.batch-table__row__select{box-sizing:border-box;padding:8px 16px;cursor:pointer;min-height:100%}.batch-table__toolbar__select input,.batch-table__row__select input{margin-top:8px}.batch-table__toolbar__select--aligned,.batch-table__row__select--aligned{display:flex;align-items:center}.batch-table__toolbar__select--aligned input,.batch-table__row__select--aligned input{margin-top:0}.batch-table__toolbar__actions,.batch-table__toolbar__content,.batch-table__row__actions,.batch-table__row__content{padding:8px 0;padding-right:16px;flex:1 1 auto}.batch-table__toolbar{border:1px solid #f2f5f7;background:#d9e1e8;border-radius:4px 0 0;height:47px;align-items:center}.batch-table__toolbar__actions{text-align:right;padding-right:11px}.batch-table__form{padding:16px;border:1px solid #f2f5f7;border-top:0;background:#d9e1e8}.batch-table__form .fields-row{padding-top:0;margin-bottom:0}.batch-table__row{border:1px solid #f2f5f7;border-top:0;background:#e6ebf0}@media screen and (max-width: 415px){.optional .batch-table__row:first-child{border-top:1px solid #f2f5f7}}.batch-table__row:hover{background:#dfe6ec}.batch-table__row:nth-child(even){background:#d9e1e8}.batch-table__row:nth-child(even):hover{background:#d3dce4}.batch-table__row__content{padding-top:12px;padding-bottom:16px}.batch-table__row__content--unpadded{padding:0}.batch-table__row__content--with-image{display:flex;align-items:center}.batch-table__row__content__image{flex:0 0 auto;display:flex;justify-content:center;align-items:center;margin-right:10px}.batch-table__row__content__image .emojione{width:32px;height:32px}.batch-table__row__content__text{flex:1 1 auto}.batch-table__row__content__extra{flex:0 0 auto;text-align:right;color:#282c37;font-weight:500}.batch-table__row .directory__tag{margin:0;width:100%}.batch-table__row .directory__tag a{background:transparent;border-radius:0}@media screen and (max-width: 415px){.batch-table.optional .batch-table__toolbar,.batch-table.optional .batch-table__row__select{display:none}}.batch-table .status__content{padding-top:0}.batch-table .status__content summary{display:list-item}.batch-table .status__content strong{font-weight:700}.batch-table .nothing-here{border:1px solid #f2f5f7;border-top:0;box-shadow:none}@media screen and (max-width: 415px){.batch-table .nothing-here{border-top:1px solid #f2f5f7}}@media screen and (max-width: 870px){.batch-table .accounts-table tbody td.optional{display:none}}.admin-wrapper{display:flex;justify-content:center;width:100%;min-height:100vh}.admin-wrapper .sidebar-wrapper{min-height:100vh;overflow:hidden;pointer-events:none;flex:1 1 auto}.admin-wrapper .sidebar-wrapper__inner{display:flex;justify-content:flex-end;background:#d9e1e8;height:100%}.admin-wrapper .sidebar{width:240px;padding:0;pointer-events:auto}.admin-wrapper .sidebar__toggle{display:none;background:#c0cdd9;height:48px}.admin-wrapper .sidebar__toggle__logo{flex:1 1 auto}.admin-wrapper .sidebar__toggle__logo a{display:inline-block;padding:15px}.admin-wrapper .sidebar__toggle__logo svg{fill:#000;height:20px;position:relative;bottom:-2px}.admin-wrapper .sidebar__toggle__icon{display:block;color:#282c37;text-decoration:none;flex:0 0 auto;font-size:20px;padding:15px}.admin-wrapper .sidebar__toggle a:hover,.admin-wrapper .sidebar__toggle a:focus,.admin-wrapper .sidebar__toggle a:active{background:#b3c3d1}.admin-wrapper .sidebar .logo{display:block;margin:40px auto;width:100px;height:100px}@media screen and (max-width: 600px){.admin-wrapper .sidebar>a:first-child{display:none}}.admin-wrapper .sidebar ul{list-style:none;border-radius:4px 0 0 4px;overflow:hidden;margin-bottom:20px}@media screen and (max-width: 600px){.admin-wrapper .sidebar ul{margin-bottom:0}}.admin-wrapper .sidebar ul a{display:block;padding:15px;color:#282c37;text-decoration:none;transition:all 200ms linear;transition-property:color,background-color;border-radius:4px 0 0 4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.admin-wrapper .sidebar ul a i.fa{margin-right:5px}.admin-wrapper .sidebar ul a:hover{color:#000;background-color:#e9eef2;transition:all 100ms linear;transition-property:color,background-color}.admin-wrapper .sidebar ul a.selected{background:#dfe6ec;border-radius:4px 0 0}.admin-wrapper .sidebar ul ul{background:#e6ebf0;border-radius:0 0 0 4px;margin:0}.admin-wrapper .sidebar ul ul a{border:0;padding:15px 35px}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a{color:#000;background-color:#2b90d9;border-bottom:0;border-radius:0}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a:hover{background-color:#2482c7}.admin-wrapper .sidebar>ul>.simple-navigation-active-leaf a{border-radius:4px 0 0 4px}.admin-wrapper .content-wrapper{box-sizing:border-box;width:100%;max-width:840px;flex:1 1 auto}@media screen and (max-width: 1080px){.admin-wrapper .sidebar-wrapper--empty{display:none}.admin-wrapper .sidebar-wrapper{width:240px;flex:0 0 auto}}@media screen and (max-width: 600px){.admin-wrapper .sidebar-wrapper{width:100%}}.admin-wrapper .content{padding:20px 15px;padding-top:60px;padding-left:25px}@media screen and (max-width: 600px){.admin-wrapper .content{max-width:none;padding:15px;padding-top:30px}}.admin-wrapper .content-heading{display:flex;padding-bottom:40px;border-bottom:1px solid #c0cdd9;margin:-15px -15px 40px 0;flex-wrap:wrap;align-items:center;justify-content:space-between}.admin-wrapper .content-heading>*{margin-top:15px;margin-right:15px}.admin-wrapper .content-heading-actions{display:inline-flex}.admin-wrapper .content-heading-actions>:not(:first-child){margin-left:5px}@media screen and (max-width: 600px){.admin-wrapper .content-heading{border-bottom:0;padding-bottom:0}}.admin-wrapper .content h2{color:#282c37;font-size:24px;line-height:28px;font-weight:400}@media screen and (max-width: 600px){.admin-wrapper .content h2{font-weight:700}}.admin-wrapper .content h3{color:#282c37;font-size:20px;line-height:28px;font-weight:400;margin-bottom:30px}.admin-wrapper .content h4{text-transform:uppercase;font-size:13px;font-weight:700;color:#282c37;padding-bottom:8px;margin-bottom:8px;border-bottom:1px solid #c0cdd9}.admin-wrapper .content h6{font-size:16px;color:#282c37;line-height:28px;font-weight:500}.admin-wrapper .content .fields-group h6{color:#000;font-weight:500}.admin-wrapper .content .directory__tag>a,.admin-wrapper .content .directory__tag>div{box-shadow:none}.admin-wrapper .content .directory__tag .table-action-link .fa{color:inherit}.admin-wrapper .content .directory__tag h4{font-size:18px;font-weight:700;color:#000;text-transform:none;padding-bottom:0;margin-bottom:0;border-bottom:0}.admin-wrapper .content>p{font-size:14px;line-height:21px;color:#282c37;margin-bottom:20px}.admin-wrapper .content>p strong{color:#000;font-weight:500}.admin-wrapper .content>p strong:lang(ja){font-weight:700}.admin-wrapper .content>p strong:lang(ko){font-weight:700}.admin-wrapper .content>p strong:lang(zh-CN){font-weight:700}.admin-wrapper .content>p strong:lang(zh-HK){font-weight:700}.admin-wrapper .content>p strong:lang(zh-TW){font-weight:700}.admin-wrapper .content hr{width:100%;height:0;border:0;border-bottom:1px solid rgba(176,192,207,.6);margin:20px 0}.admin-wrapper .content hr.spacer{height:1px;border:0}@media screen and (max-width: 600px){.admin-wrapper{display:block}.admin-wrapper .sidebar-wrapper{min-height:0}.admin-wrapper .sidebar{width:100%;padding:0;height:auto}.admin-wrapper .sidebar__toggle{display:flex}.admin-wrapper .sidebar>ul{display:none}.admin-wrapper .sidebar ul a,.admin-wrapper .sidebar ul ul a{border-radius:0;border-bottom:1px solid #ccd7e0;transition:none}.admin-wrapper .sidebar ul a:hover,.admin-wrapper .sidebar ul ul a:hover{transition:none}.admin-wrapper .sidebar ul ul{border-radius:0}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a{border-bottom-color:#2b90d9}}hr.spacer{width:100%;border:0;margin:20px 0;height:1px}body .muted-hint,.admin-wrapper .content .muted-hint{color:#282c37}body .muted-hint a,.admin-wrapper .content .muted-hint a{color:#2b90d9}body .positive-hint,.admin-wrapper .content .positive-hint{color:#4a905f;font-weight:500}body .negative-hint,.admin-wrapper .content .negative-hint{color:#df405a;font-weight:500}body .neutral-hint,.admin-wrapper .content .neutral-hint{color:#444b5d;font-weight:500}body .warning-hint,.admin-wrapper .content .warning-hint{color:#ca8f04;font-weight:500}.filters{display:flex;flex-wrap:wrap}.filters .filter-subset{flex:0 0 auto;margin:0 40px 20px 0}.filters .filter-subset:last-child{margin-bottom:30px}.filters .filter-subset ul{margin-top:5px;list-style:none}.filters .filter-subset ul li{display:inline-block;margin-right:5px}.filters .filter-subset strong{font-weight:500;text-transform:uppercase;font-size:12px}.filters .filter-subset strong:lang(ja){font-weight:700}.filters .filter-subset strong:lang(ko){font-weight:700}.filters .filter-subset strong:lang(zh-CN){font-weight:700}.filters .filter-subset strong:lang(zh-HK){font-weight:700}.filters .filter-subset strong:lang(zh-TW){font-weight:700}.filters .filter-subset--with-select strong{display:block;margin-bottom:10px}.filters .filter-subset a{display:inline-block;color:#282c37;text-decoration:none;text-transform:uppercase;font-size:12px;font-weight:500;border-bottom:2px solid #d9e1e8}.filters .filter-subset a:hover{color:#000;border-bottom:2px solid #c9d4de}.filters .filter-subset a.selected{color:#2b90d9;border-bottom:2px solid #2b90d9}.flavour-screen{display:block;margin:10px auto;max-width:100%}.flavour-description{display:block;font-size:16px;margin:10px 0}.flavour-description>p{margin:10px 0}.flavour-screen{display:block;margin:10px auto;max-width:100%}.flavour-description{display:block;font-size:16px;margin:10px 0}.flavour-description>p{margin:10px 0}.report-accounts{display:flex;flex-wrap:wrap;margin-bottom:20px}.report-accounts__item{display:flex;flex:250px;flex-direction:column;margin:0 5px}.report-accounts__item>strong{display:block;margin:0 0 10px -5px;font-weight:500;font-size:14px;line-height:18px;color:#282c37}.report-accounts__item>strong:lang(ja){font-weight:700}.report-accounts__item>strong:lang(ko){font-weight:700}.report-accounts__item>strong:lang(zh-CN){font-weight:700}.report-accounts__item>strong:lang(zh-HK){font-weight:700}.report-accounts__item>strong:lang(zh-TW){font-weight:700}.report-accounts__item .account-card{flex:1 1 auto}.report-status,.account-status{display:flex;margin-bottom:10px}.report-status .activity-stream,.account-status .activity-stream{flex:2 0 0;margin-right:20px;max-width:calc(100% - 60px)}.report-status .activity-stream .entry,.account-status .activity-stream .entry{border-radius:4px}.report-status__actions,.account-status__actions{flex:0 0 auto;display:flex;flex-direction:column}.report-status__actions .icon-button,.account-status__actions .icon-button{font-size:24px;width:24px;text-align:center;margin-bottom:10px}.simple_form.new_report_note,.simple_form.new_account_moderation_note{max-width:100%}.batch-form-box{display:flex;flex-wrap:wrap;margin-bottom:5px}.batch-form-box #form_status_batch_action{margin:0 5px 5px 0;font-size:14px}.batch-form-box input.button{margin:0 5px 5px 0}.batch-form-box .media-spoiler-toggle-buttons{margin-left:auto}.batch-form-box .media-spoiler-toggle-buttons .button{overflow:visible;margin:0 0 5px 5px;float:right}.back-link{margin-bottom:10px;font-size:14px}.back-link a{color:#2b90d9;text-decoration:none}.back-link a:hover{text-decoration:underline}.spacer{flex:1 1 auto}.log-entry{line-height:20px;padding:15px 0;background:#d9e1e8;border-bottom:1px solid #ccd7e0}.log-entry:last-child{border-bottom:0}.log-entry__header{display:flex;justify-content:flex-start;align-items:center;color:#282c37;font-size:14px;padding:0 10px}.log-entry__avatar{margin-right:10px}.log-entry__avatar .avatar{display:block;margin:0;border-radius:50%;width:40px;height:40px}.log-entry__content{max-width:calc(100% - 90px)}.log-entry__title{word-wrap:break-word}.log-entry__timestamp{color:#444b5d}.log-entry a,.log-entry .username,.log-entry .target{color:#282c37;text-decoration:none;font-weight:500}a.name-tag,.name-tag,a.inline-name-tag,.inline-name-tag{text-decoration:none;color:#282c37}a.name-tag .username,.name-tag .username,a.inline-name-tag .username,.inline-name-tag .username{font-weight:500}a.name-tag.suspended .username,.name-tag.suspended .username,a.inline-name-tag.suspended .username,.inline-name-tag.suspended .username{text-decoration:line-through;color:#c1203b}a.name-tag.suspended .avatar,.name-tag.suspended .avatar,a.inline-name-tag.suspended .avatar,.inline-name-tag.suspended .avatar{filter:grayscale(100%);opacity:.8}a.name-tag,.name-tag{display:flex;align-items:center}a.name-tag .avatar,.name-tag .avatar{display:block;margin:0;margin-right:5px;border-radius:50%}a.name-tag.suspended .avatar,.name-tag.suspended .avatar{filter:grayscale(100%);opacity:.8}.speech-bubble{margin-bottom:20px;border-left:4px solid #2b90d9}.speech-bubble.positive{border-left-color:#4a905f}.speech-bubble.negative{border-left-color:#c1203b}.speech-bubble.warning{border-left-color:#ca8f04}.speech-bubble__bubble{padding:16px;padding-left:14px;font-size:15px;line-height:20px;border-radius:4px 4px 4px 0;position:relative;font-weight:500}.speech-bubble__bubble a{color:#282c37}.speech-bubble__owner{padding:8px;padding-left:12px}.speech-bubble time{color:#444b5d}.report-card{background:#d9e1e8;border-radius:4px;margin-bottom:20px}.report-card__profile{display:flex;justify-content:space-between;align-items:center;padding:15px}.report-card__profile .account{padding:0;border:0}.report-card__profile .account__avatar-wrapper{margin-left:0}.report-card__profile__stats{flex:0 0 auto;font-weight:500;color:#282c37;text-transform:uppercase;text-align:right}.report-card__profile__stats a{color:inherit;text-decoration:none}.report-card__profile__stats a:focus,.report-card__profile__stats a:hover,.report-card__profile__stats a:active{color:#17191f}.report-card__profile__stats .red{color:#df405a}.report-card__summary__item{display:flex;justify-content:flex-start;border-top:1px solid #e6ebf0}.report-card__summary__item:hover{background:#d3dce4}.report-card__summary__item__reported-by,.report-card__summary__item__assigned{padding:15px;flex:0 0 auto;box-sizing:border-box;width:150px;color:#282c37}.report-card__summary__item__reported-by,.report-card__summary__item__reported-by .username,.report-card__summary__item__assigned,.report-card__summary__item__assigned .username{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.report-card__summary__item__content{flex:1 1 auto;max-width:calc(100% - 300px)}.report-card__summary__item__content__icon{color:#444b5d;margin-right:4px;font-weight:500}.report-card__summary__item__content a{display:block;box-sizing:border-box;width:100%;padding:15px;text-decoration:none;color:#282c37}.one-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ellipsized-ip{display:inline-block;max-width:120px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.admin-account-bio{display:flex;flex-wrap:wrap;margin:0 -5px;margin-top:20px}.admin-account-bio>div{box-sizing:border-box;padding:0 5px;margin-bottom:10px;flex:1 0 50%}.admin-account-bio .account__header__fields,.admin-account-bio .account__header__content{background:#c0cdd9;border-radius:4px;height:100%}.admin-account-bio .account__header__fields{margin:0;border:0}.admin-account-bio .account__header__fields a{color:#217aba}.admin-account-bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.admin-account-bio .account__header__fields .verified a{color:#4a905f}.admin-account-bio .account__header__content{box-sizing:border-box;padding:20px;color:#000}.center-text{text-align:center}.announcements-list{border:1px solid #ccd7e0;border-radius:4px}.announcements-list__item{padding:15px 0;background:#d9e1e8;border-bottom:1px solid #ccd7e0}.announcements-list__item__title{padding:0 15px;display:block;font-weight:500;font-size:18px;line-height:1.5;color:#282c37;text-decoration:none;margin-bottom:10px}.announcements-list__item__title:hover,.announcements-list__item__title:focus,.announcements-list__item__title:active{color:#000}.announcements-list__item__meta{padding:0 15px;color:#444b5d}.announcements-list__item__action-bar{display:flex;justify-content:space-between;align-items:center}.announcements-list__item:last-child{border-bottom:0}.dashboard__counters{display:flex;flex-wrap:wrap;margin:0 -5px;margin-bottom:20px}.dashboard__counters>div{box-sizing:border-box;flex:0 0 33.333%;padding:0 5px;margin-bottom:10px}.dashboard__counters>div>div,.dashboard__counters>div>a{padding:20px;background:#ccd7e0;border-radius:4px;box-sizing:border-box;height:100%}.dashboard__counters>div>a{text-decoration:none;color:inherit;display:block}.dashboard__counters>div>a:hover,.dashboard__counters>div>a:focus,.dashboard__counters>div>a:active{background:#c0cdd9}.dashboard__counters__num,.dashboard__counters__text{text-align:center;font-weight:500;font-size:24px;line-height:21px;color:#000;font-family:\"mastodon-font-display\",sans-serif;margin-bottom:20px;line-height:30px}.dashboard__counters__text{font-size:18px}.dashboard__counters__label{font-size:14px;color:#282c37;text-align:center;font-weight:500}.dashboard__widgets{display:flex;flex-wrap:wrap;margin:0 -5px}.dashboard__widgets>div{flex:0 0 33.333%;margin-bottom:20px}.dashboard__widgets>div>div{padding:0 5px}.dashboard__widgets a:not(.name-tag){color:#282c37;font-weight:500;text-decoration:none}body.rtl{direction:rtl}body.rtl .column-header>button{text-align:right;padding-left:0;padding-right:15px}body.rtl .radio-button__input{margin-right:0;margin-left:10px}body.rtl .directory__card__bar .display-name{margin-left:0;margin-right:15px}body.rtl .display-name{text-align:right}body.rtl .notification__message{margin-left:0;margin-right:68px}body.rtl .drawer__inner__mastodon>img{transform:scaleX(-1)}body.rtl .notification__favourite-icon-wrapper{left:auto;right:-26px}body.rtl .landing-page__logo{margin-right:0;margin-left:20px}body.rtl .landing-page .features-list .features-list__row .visual{margin-left:0;margin-right:15px}body.rtl .column-link__icon,body.rtl .column-header__icon{margin-right:0;margin-left:5px}body.rtl .compose-form .compose-form__buttons-wrapper .character-counter__wrapper{margin-right:0;margin-left:4px}body.rtl .navigation-bar__profile{margin-left:0;margin-right:8px}body.rtl .search__input{padding-right:10px;padding-left:30px}body.rtl .search__icon .fa{right:auto;left:10px}body.rtl .columns-area{direction:rtl}body.rtl .column-header__buttons{left:0;right:auto;margin-left:0;margin-right:-15px}body.rtl .column-inline-form .icon-button{margin-left:0;margin-right:5px}body.rtl .column-header__links .text-btn{margin-left:10px;margin-right:0}body.rtl .account__avatar-wrapper{float:right}body.rtl .column-header__back-button{padding-left:5px;padding-right:0}body.rtl .column-header__setting-arrows{float:left}body.rtl .setting-toggle__label{margin-left:0;margin-right:8px}body.rtl .status__avatar{left:auto;right:10px}body.rtl .status,body.rtl .activity-stream .status.light{padding-left:10px;padding-right:68px}body.rtl .status__info .status__display-name,body.rtl .activity-stream .status.light .status__display-name{padding-left:25px;padding-right:0}body.rtl .activity-stream .pre-header{padding-right:68px;padding-left:0}body.rtl .status__prepend{margin-left:0;margin-right:68px}body.rtl .status__prepend-icon-wrapper{left:auto;right:-26px}body.rtl .activity-stream .pre-header .pre-header__icon{left:auto;right:42px}body.rtl .account__avatar-overlay-overlay{right:auto;left:0}body.rtl .column-back-button--slim-button{right:auto;left:0}body.rtl .status__relative-time,body.rtl .activity-stream .status.light .status__header .status__meta{float:left}body.rtl .status__action-bar__counter{margin-right:0;margin-left:11px}body.rtl .status__action-bar__counter .status__action-bar-button{margin-right:0;margin-left:4px}body.rtl .status__action-bar-button{float:right;margin-right:0;margin-left:18px}body.rtl .status__action-bar-dropdown{float:right}body.rtl .privacy-dropdown__dropdown{margin-left:0;margin-right:40px}body.rtl .privacy-dropdown__option__icon{margin-left:10px;margin-right:0}body.rtl .detailed-status__display-name .display-name{text-align:right}body.rtl .detailed-status__display-avatar{margin-right:0;margin-left:10px;float:right}body.rtl .detailed-status__favorites,body.rtl .detailed-status__reblogs{margin-left:0;margin-right:6px}body.rtl .fa-ul{margin-left:2.14285714em}body.rtl .fa-li{left:auto;right:-2.14285714em}body.rtl .admin-wrapper{direction:rtl}body.rtl .admin-wrapper .sidebar ul a i.fa,body.rtl a.table-action-link i.fa{margin-right:0;margin-left:5px}body.rtl .simple_form .check_boxes .checkbox label{padding-left:0;padding-right:25px}body.rtl .simple_form .input.with_label.boolean label.checkbox{padding-left:25px;padding-right:0}body.rtl .simple_form .check_boxes .checkbox input[type=checkbox],body.rtl .simple_form .input.boolean input[type=checkbox]{left:auto;right:0}body.rtl .simple_form .input.radio_buttons .radio{left:auto;right:0}body.rtl .simple_form .input.radio_buttons .radio>label{padding-right:28px;padding-left:0}body.rtl .simple_form .input-with-append .input input{padding-left:142px;padding-right:0}body.rtl .simple_form .input.boolean label.checkbox{left:auto;right:0}body.rtl .simple_form .input.boolean .label_input,body.rtl .simple_form .input.boolean .hint{padding-left:0;padding-right:28px}body.rtl .simple_form .label_input__append{right:auto;left:3px}body.rtl .simple_form .label_input__append::after{right:auto;left:0;background-image:linear-gradient(to left, rgba(249, 250, 251, 0), #f9fafb)}body.rtl .simple_form select{background:#f9fafb url(\"data:image/svg+xml;utf8,\") no-repeat left 8px center/auto 16px}body.rtl .table th,body.rtl .table td{text-align:right}body.rtl .filters .filter-subset{margin-right:0;margin-left:45px}body.rtl .landing-page .header-wrapper .mascot{right:60px;left:auto}body.rtl .landing-page__call-to-action .row__information-board{direction:rtl}body.rtl .landing-page .header .hero .floats .float-1{left:-120px;right:auto}body.rtl .landing-page .header .hero .floats .float-2{left:210px;right:auto}body.rtl .landing-page .header .hero .floats .float-3{left:110px;right:auto}body.rtl .landing-page .header .links .brand img{left:0}body.rtl .landing-page .fa-external-link{padding-right:5px;padding-left:0 !important}body.rtl .landing-page .features #mastodon-timeline{margin-right:0;margin-left:30px}@media screen and (min-width: 631px){body.rtl .column,body.rtl .drawer{padding-left:5px;padding-right:5px}body.rtl .column:first-child,body.rtl .drawer:first-child{padding-left:5px;padding-right:10px}body.rtl .columns-area>div .column,body.rtl .columns-area>div .drawer{padding-left:5px;padding-right:5px}}body.rtl .columns-area--mobile .column,body.rtl .columns-area--mobile .drawer{padding-left:0;padding-right:0}body.rtl .public-layout .header .nav-button{margin-left:8px;margin-right:0}body.rtl .public-layout .public-account-header__tabs{margin-left:0;margin-right:20px}body.rtl .landing-page__information .account__display-name{margin-right:0;margin-left:5px}body.rtl .landing-page__information .account__avatar-wrapper{margin-left:12px;margin-right:0}body.rtl .card__bar .display-name{margin-left:0;margin-right:15px;text-align:right}body.rtl .fa-chevron-left::before{content:\"\"}body.rtl .fa-chevron-right::before{content:\"\"}body.rtl .column-back-button__icon{margin-right:0;margin-left:5px}body.rtl .column-header__setting-arrows .column-header__setting-btn:last-child{padding-left:0;padding-right:10px}body.rtl .simple_form .input.radio_buttons .radio>label input{left:auto;right:0}.emojione[title=\":wavy_dash:\"],.emojione[title=\":waving_black_flag:\"],.emojione[title=\":water_buffalo:\"],.emojione[title=\":video_game:\"],.emojione[title=\":video_camera:\"],.emojione[title=\":vhs:\"],.emojione[title=\":turkey:\"],.emojione[title=\":tophat:\"],.emojione[title=\":top:\"],.emojione[title=\":tm:\"],.emojione[title=\":telephone_receiver:\"],.emojione[title=\":spider:\"],.emojione[title=\":speaking_head_in_silhouette:\"],.emojione[title=\":spades:\"],.emojione[title=\":soon:\"],.emojione[title=\":registered:\"],.emojione[title=\":on:\"],.emojione[title=\":musical_score:\"],.emojione[title=\":movie_camera:\"],.emojione[title=\":mortar_board:\"],.emojione[title=\":microphone:\"],.emojione[title=\":male-guard:\"],.emojione[title=\":lower_left_fountain_pen:\"],.emojione[title=\":lower_left_ballpoint_pen:\"],.emojione[title=\":kaaba:\"],.emojione[title=\":joystick:\"],.emojione[title=\":hole:\"],.emojione[title=\":hocho:\"],.emojione[title=\":heavy_plus_sign:\"],.emojione[title=\":heavy_multiplication_x:\"],.emojione[title=\":heavy_minus_sign:\"],.emojione[title=\":heavy_dollar_sign:\"],.emojione[title=\":heavy_division_sign:\"],.emojione[title=\":heavy_check_mark:\"],.emojione[title=\":guardsman:\"],.emojione[title=\":gorilla:\"],.emojione[title=\":fried_egg:\"],.emojione[title=\":film_projector:\"],.emojione[title=\":female-guard:\"],.emojione[title=\":end:\"],.emojione[title=\":electric_plug:\"],.emojione[title=\":eight_pointed_black_star:\"],.emojione[title=\":dark_sunglasses:\"],.emojione[title=\":currency_exchange:\"],.emojione[title=\":curly_loop:\"],.emojione[title=\":copyright:\"],.emojione[title=\":clubs:\"],.emojione[title=\":camera_with_flash:\"],.emojione[title=\":camera:\"],.emojione[title=\":busts_in_silhouette:\"],.emojione[title=\":bust_in_silhouette:\"],.emojione[title=\":bowling:\"],.emojione[title=\":bomb:\"],.emojione[title=\":black_small_square:\"],.emojione[title=\":black_nib:\"],.emojione[title=\":black_medium_square:\"],.emojione[title=\":black_medium_small_square:\"],.emojione[title=\":black_large_square:\"],.emojione[title=\":black_heart:\"],.emojione[title=\":black_circle:\"],.emojione[title=\":back:\"],.emojione[title=\":ant:\"],.emojione[title=\":8ball:\"]{filter:drop-shadow(1px 1px 0 #ffffff) drop-shadow(-1px 1px 0 #ffffff) drop-shadow(1px -1px 0 #ffffff) drop-shadow(-1px -1px 0 #ffffff);transform:scale(0.71)}html{scrollbar-color:#d9e1e8 rgba(217,225,232,.25)}.button{color:#fff}.button.button-alternative-2{color:#fff}.status-card__actions button,.status-card__actions a{color:rgba(255,255,255,.8)}.status-card__actions button:hover,.status-card__actions button:active,.status-card__actions button:focus,.status-card__actions a:hover,.status-card__actions a:active,.status-card__actions a:focus{color:#fff}.column>.scrollable,.getting-started,.column-inline-form,.error-column,.regeneration-indicator{background:#fff;border:1px solid #c0cdd9;border-top:0}.directory__card__img{background:#b3c3d1}.filter-form,.directory__card__bar{background:#fff;border-bottom:1px solid #c0cdd9}.scrollable .directory__list{width:calc(100% + 2px);margin-left:-1px;margin-right:-1px}.directory__card,.table-of-contents{border:1px solid #c0cdd9}.column-back-button,.column-header{background:#fff;border:1px solid #c0cdd9}@media screen and (max-width: 415px){.column-back-button,.column-header{border-top:0}}.column-back-button--slim-button,.column-header--slim-button{top:-50px;right:0}.column-header__back-button,.column-header__button,.column-header__button.active,.account__header__bar,.directory__card__extra{background:#fff}.column-header__button.active{color:#2b90d9}.column-header__button.active:hover,.column-header__button.active:active,.column-header__button.active:focus{color:#2b90d9;background:#fff}.account__header__bar .avatar .account__avatar{border-color:#fff}.getting-started__footer a{color:#282c37;text-decoration:underline}.confirmation-modal__secondary-button,.confirmation-modal__cancel-button,.mute-modal__cancel-button,.block-modal__cancel-button{color:#86a0b6}.confirmation-modal__secondary-button:hover,.confirmation-modal__secondary-button:focus,.confirmation-modal__secondary-button:active,.confirmation-modal__cancel-button:hover,.confirmation-modal__cancel-button:focus,.confirmation-modal__cancel-button:active,.mute-modal__cancel-button:hover,.mute-modal__cancel-button:focus,.mute-modal__cancel-button:active,.block-modal__cancel-button:hover,.block-modal__cancel-button:focus,.block-modal__cancel-button:active{color:#000}.column-subheading{background:#e6ebf0;border-bottom:1px solid #c0cdd9}.getting-started .column-link,.scrollable .column-link{background:#fff;border-bottom:1px solid #c0cdd9}.getting-started .column-link:hover,.getting-started .column-link:active,.getting-started .column-link:focus,.scrollable .column-link:hover,.scrollable .column-link:active,.scrollable .column-link:focus{background:#d9e1e8}.getting-started .navigation-bar{border-top:1px solid #c0cdd9;border-bottom:1px solid #c0cdd9}@media screen and (max-width: 415px){.getting-started .navigation-bar{border-top:0}}.compose-form__autosuggest-wrapper,.poll__option input[type=text],.compose-form .spoiler-input__input,.compose-form__poll-wrapper select,.search__input,.setting-text,.box-widget input[type=text],.box-widget input[type=email],.box-widget input[type=password],.box-widget textarea,.statuses-grid .detailed-status,.audio-player{border:1px solid #c0cdd9}@media screen and (max-width: 415px){.search__input{border-top:0;border-bottom:0}}.list-editor .search .search__input{border-top:0;border-bottom:0}.compose-form__poll-wrapper select{background:#fff url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center/auto 16px}.compose-form__poll-wrapper,.compose-form__poll-wrapper .poll__footer{border-top-color:#c0cdd9}.notification__filter-bar{border:1px solid #c0cdd9;border-top:0}.compose-form .compose-form__buttons-wrapper{background:#d9e1e8;border:1px solid #c0cdd9;border-top:0}.drawer__header,.drawer__inner{background:#fff;border:1px solid #c0cdd9}.drawer__inner__mastodon{background:#fff url('data:image/svg+xml;utf8,') no-repeat bottom/100% auto}.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button{color:#ededed}.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button:active,.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button:focus,.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button:hover{color:#fff}.compose-form .compose-form__modifiers .compose-form__upload-description input{color:#ededed}.compose-form .compose-form__modifiers .compose-form__upload-description input::placeholder{color:#ededed}.compose-form .compose-form__buttons-wrapper{background:#ecf0f4}.compose-form .autosuggest-textarea__suggestions{background:#ecf0f4}.compose-form .autosuggest-textarea__suggestions__item:hover,.compose-form .autosuggest-textarea__suggestions__item:focus,.compose-form .autosuggest-textarea__suggestions__item:active,.compose-form .autosuggest-textarea__suggestions__item.selected{background:#ccd7e0}.emoji-mart-bar{border-color:#ccd7e0}.emoji-mart-bar:first-child{background:#ecf0f4}.emoji-mart-search input{background:rgba(217,225,232,.3);border-color:#d9e1e8}.focusable:focus{background:#d9e1e8}.status.status-direct{background:#ccd7e0}.focusable:focus .status.status-direct{background:#c0cdd9}.detailed-status,.detailed-status__action-bar{background:#fff}.reply-indicator__content .status__content__spoiler-link,.status__content .status__content__spoiler-link{background:#d9e1e8}.reply-indicator__content .status__content__spoiler-link:hover,.status__content .status__content__spoiler-link:hover{background:#ccd7e0}.media-spoiler,.video-player__spoiler{background:#d9e1e8}.privacy-dropdown.active .privacy-dropdown__value.active .icon-button{color:#fff}.account-gallery__item a{background-color:#d9e1e8}.dropdown-menu{background:#fff}.dropdown-menu__arrow.left{border-left-color:#fff}.dropdown-menu__arrow.top{border-top-color:#fff}.dropdown-menu__arrow.bottom{border-bottom-color:#fff}.dropdown-menu__arrow.right{border-right-color:#fff}.dropdown-menu__item a{background:#fff;color:#282c37}.privacy-dropdown__option.active,.privacy-dropdown__option:hover,.privacy-dropdown__option.active .privacy-dropdown__option__content,.privacy-dropdown__option.active .privacy-dropdown__option__content strong,.privacy-dropdown__option:hover .privacy-dropdown__option__content,.privacy-dropdown__option:hover .privacy-dropdown__option__content strong,.dropdown-menu__item a:active,.dropdown-menu__item a:focus,.dropdown-menu__item a:hover,.actions-modal ul li:not(:empty) a.active,.actions-modal ul li:not(:empty) a.active button,.actions-modal ul li:not(:empty) a:active,.actions-modal ul li:not(:empty) a:active button,.actions-modal ul li:not(:empty) a:focus,.actions-modal ul li:not(:empty) a:focus button,.actions-modal ul li:not(:empty) a:hover,.actions-modal ul li:not(:empty) a:hover button,.admin-wrapper .sidebar ul .simple-navigation-active-leaf a,.simple_form .block-button,.simple_form .button,.simple_form button{color:#fff}.dropdown-menu__separator{border-bottom-color:#ccd7e0}.actions-modal,.boost-modal,.confirmation-modal,.mute-modal,.block-modal,.report-modal,.embed-modal,.error-modal,.onboarding-modal,.report-modal__comment .setting-text__wrapper,.report-modal__comment .setting-text{background:#fff;border:1px solid #c0cdd9}.report-modal__comment{border-right-color:#c0cdd9}.report-modal__container{border-top-color:#c0cdd9}.column-header__collapsible-inner{background:#e6ebf0;border:1px solid #c0cdd9;border-top:0}.focal-point__preview strong{color:#fff}.boost-modal__action-bar,.confirmation-modal__action-bar,.mute-modal__action-bar,.block-modal__action-bar,.onboarding-modal__paginator,.error-modal__footer{background:#ecf0f4}.boost-modal__action-bar .onboarding-modal__nav:hover,.boost-modal__action-bar .onboarding-modal__nav:focus,.boost-modal__action-bar .onboarding-modal__nav:active,.boost-modal__action-bar .error-modal__nav:hover,.boost-modal__action-bar .error-modal__nav:focus,.boost-modal__action-bar .error-modal__nav:active,.confirmation-modal__action-bar .onboarding-modal__nav:hover,.confirmation-modal__action-bar .onboarding-modal__nav:focus,.confirmation-modal__action-bar .onboarding-modal__nav:active,.confirmation-modal__action-bar .error-modal__nav:hover,.confirmation-modal__action-bar .error-modal__nav:focus,.confirmation-modal__action-bar .error-modal__nav:active,.mute-modal__action-bar .onboarding-modal__nav:hover,.mute-modal__action-bar .onboarding-modal__nav:focus,.mute-modal__action-bar .onboarding-modal__nav:active,.mute-modal__action-bar .error-modal__nav:hover,.mute-modal__action-bar .error-modal__nav:focus,.mute-modal__action-bar .error-modal__nav:active,.block-modal__action-bar .onboarding-modal__nav:hover,.block-modal__action-bar .onboarding-modal__nav:focus,.block-modal__action-bar .onboarding-modal__nav:active,.block-modal__action-bar .error-modal__nav:hover,.block-modal__action-bar .error-modal__nav:focus,.block-modal__action-bar .error-modal__nav:active,.onboarding-modal__paginator .onboarding-modal__nav:hover,.onboarding-modal__paginator .onboarding-modal__nav:focus,.onboarding-modal__paginator .onboarding-modal__nav:active,.onboarding-modal__paginator .error-modal__nav:hover,.onboarding-modal__paginator .error-modal__nav:focus,.onboarding-modal__paginator .error-modal__nav:active,.error-modal__footer .onboarding-modal__nav:hover,.error-modal__footer .onboarding-modal__nav:focus,.error-modal__footer .onboarding-modal__nav:active,.error-modal__footer .error-modal__nav:hover,.error-modal__footer .error-modal__nav:focus,.error-modal__footer .error-modal__nav:active{background-color:#fff}.display-case__case{background:#fff}.embed-modal .embed-modal__container .embed-modal__html{background:#fff;border:1px solid #c0cdd9}.embed-modal .embed-modal__container .embed-modal__html:focus{border-color:#b3c3d1;background:#fff}.react-toggle-track{background:#282c37}.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track{background:#3d4455}.react-toggle.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track{background:#2074b1}.empty-column-indicator,.error-column{color:#000;background:#fff}.tabs-bar{background:#fff;border:1px solid #c0cdd9;border-bottom:0}@media screen and (max-width: 415px){.tabs-bar{border-top:0}}.tabs-bar__link{padding-bottom:14px;border-bottom-width:1px;border-bottom-color:#c0cdd9}.tabs-bar__link:hover,.tabs-bar__link:active,.tabs-bar__link:focus{background:#d9e1e8}.tabs-bar__link.active:hover,.tabs-bar__link.active:active,.tabs-bar__link.active:focus{background:transparent;border-bottom-color:#2b90d9}.activity-stream-tabs{background:#fff;border-bottom-color:#c0cdd9}.box-widget,.nothing-here,.page-header,.directory__tag>a,.directory__tag>div,.landing-page__call-to-action,.contact-widget,.landing .hero-widget__text,.landing-page__information.contact-widget{background:#fff;border:1px solid #c0cdd9}@media screen and (max-width: 415px){.box-widget,.nothing-here,.page-header,.directory__tag>a,.directory__tag>div,.landing-page__call-to-action,.contact-widget,.landing .hero-widget__text,.landing-page__information.contact-widget{border-left:0;border-right:0;border-top:0}}.landing .hero-widget__text{border-top:0;border-bottom:0}.simple_form input[type=text]:hover,.simple_form input[type=number]:hover,.simple_form input[type=email]:hover,.simple_form input[type=password]:hover,.simple_form textarea:hover{border-color:#b3c3d1}.landing .hero-widget__footer{background:#fff;border:1px solid #c0cdd9;border-top:0}@media screen and (max-width: 415px){.landing .hero-widget__footer{border:0}}.brand__tagline{color:#282c37}.directory__tag>a:hover,.directory__tag>a:active,.directory__tag>a:focus{background:#d9e1e8}@media screen and (max-width: 415px){.directory__tag>a{border:0}}.directory__tag.active>a,.directory__tag.active>div{border-color:#2b90d9}.directory__tag.active>a,.directory__tag.active>a h4,.directory__tag.active>a h4 small,.directory__tag.active>a .fa,.directory__tag.active>a .trends__item__current,.directory__tag.active>div,.directory__tag.active>div h4,.directory__tag.active>div h4 small,.directory__tag.active>div .fa,.directory__tag.active>div .trends__item__current{color:#fff}.directory__tag.active>a:hover,.directory__tag.active>a:active,.directory__tag.active>a:focus,.directory__tag.active>div:hover,.directory__tag.active>div:active,.directory__tag.active>div:focus{background:#2b90d9}.batch-table__toolbar,.batch-table__row,.batch-table .nothing-here{border-color:#c0cdd9}.activity-stream{border:1px solid #c0cdd9}.activity-stream--under-tabs{border-top:0}.activity-stream .entry{background:#fff}.activity-stream .entry .detailed-status.light,.activity-stream .entry .more.light,.activity-stream .entry .status.light{border-bottom-color:#c0cdd9}.activity-stream .status.light .status__content{color:#000}.activity-stream .status.light .display-name strong{color:#000}.accounts-grid .account-grid-card .controls .icon-button{color:#282c37}.accounts-grid .account-grid-card .name a{color:#000}.accounts-grid .account-grid-card .username{color:#282c37}.accounts-grid .account-grid-card .account__header__content{color:#000}.simple_form .warning,.table-form .warning{box-shadow:none;background:rgba(223,64,90,.5);text-shadow:none}.simple_form .recommended,.table-form .recommended{border-color:#2b90d9;color:#2b90d9;background-color:rgba(43,144,217,.1)}.compose-form .compose-form__warning{border-color:#2b90d9;background-color:rgba(43,144,217,.1)}.compose-form .compose-form__warning,.compose-form .compose-form__warning a{color:#2b90d9}.status__content a,.reply-indicator__content a{color:#2b90d9}.button.logo-button{color:#fff}.button.logo-button svg{fill:#fff}.public-layout .account__section-headline{border:1px solid #c0cdd9}@media screen and (max-width: 415px){.public-layout .account__section-headline{border-top:0}}.public-layout .header,.public-layout .public-account-header,.public-layout .public-account-bio{box-shadow:none}.public-layout .public-account-bio,.public-layout .hero-widget__text{background:#fff;border:1px solid #c0cdd9}.public-layout .header{background:#d9e1e8;border:1px solid #c0cdd9}@media screen and (max-width: 415px){.public-layout .header{border:0}}.public-layout .header .brand:hover,.public-layout .header .brand:focus,.public-layout .header .brand:active{background:#ccd7e0}.public-layout .public-account-header__image{background:#b3c3d1}.public-layout .public-account-header__image::after{box-shadow:none}.public-layout .public-account-header__bar::before{background:#fff;border:1px solid #c0cdd9;border-top:0}.public-layout .public-account-header__bar .avatar img{border-color:#fff}@media screen and (max-width: 600px){.public-layout .public-account-header__bar{background:#fff;border:1px solid #c0cdd9;border-top:0}}.public-layout .public-account-header__tabs__name h1,.public-layout .public-account-header__tabs__name h1 small{color:#fff}@media screen and (max-width: 600px){.public-layout .public-account-header__tabs__name h1,.public-layout .public-account-header__tabs__name h1 small{color:#000}}.public-layout .public-account-header__extra .public-account-bio{border:0}.public-layout .public-account-header__extra .public-account-bio .account__header__fields{border-color:#c0cdd9}.notification__filter-bar button.active::after,.account__section-headline a.active::after{border-color:transparent transparent #fff}.hero-widget,.box-widget,.contact-widget,.landing-page__information.contact-widget,.moved-account-widget,.memoriam-widget,.activity-stream,.nothing-here,.directory__tag>a,.directory__tag>div,.card>a,.page-header,.compose-form .compose-form__warning{box-shadow:none}.audio-player .video-player__controls button,.audio-player .video-player__time-sep,.audio-player .video-player__time-current,.audio-player .video-player__time-total{color:#000}","/* http://meyerweb.com/eric/tools/css/reset/\n v2.0 | 20110126\n License: none (public domain)\n*/\n\nhtml, body, div, span, applet, object, iframe,\nh1, h2, h3, h4, h5, h6, p, blockquote, pre,\na, abbr, acronym, address, big, cite, code,\ndel, dfn, em, img, ins, kbd, q, s, samp,\nsmall, strike, strong, sub, sup, tt, var,\nb, u, i, center,\ndl, dt, dd, ol, ul, li,\nfieldset, form, label, legend,\ntable, caption, tbody, tfoot, thead, tr, th, td,\narticle, aside, canvas, details, embed,\nfigure, figcaption, footer, header, hgroup,\nmenu, nav, output, ruby, section, summary,\ntime, mark, audio, video {\n margin: 0;\n padding: 0;\n border: 0;\n font-size: 100%;\n font: inherit;\n vertical-align: baseline;\n}\n\n/* HTML5 display-role reset for older browsers */\narticle, aside, details, figcaption, figure,\nfooter, header, hgroup, menu, nav, section {\n display: block;\n}\n\nbody {\n line-height: 1;\n}\n\nol, ul {\n list-style: none;\n}\n\nblockquote, q {\n quotes: none;\n}\n\nblockquote:before, blockquote:after,\nq:before, q:after {\n content: '';\n content: none;\n}\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\nhtml {\n scrollbar-color: lighten($ui-base-color, 4%) rgba($base-overlay-background, 0.1);\n}\n\n::-webkit-scrollbar {\n width: 12px;\n height: 12px;\n}\n\n::-webkit-scrollbar-thumb {\n background: lighten($ui-base-color, 4%);\n border: 0px none $base-border-color;\n border-radius: 50px;\n}\n\n::-webkit-scrollbar-thumb:hover {\n background: lighten($ui-base-color, 6%);\n}\n\n::-webkit-scrollbar-thumb:active {\n background: lighten($ui-base-color, 4%);\n}\n\n::-webkit-scrollbar-track {\n border: 0px none $base-border-color;\n border-radius: 0;\n background: rgba($base-overlay-background, 0.1);\n}\n\n::-webkit-scrollbar-track:hover {\n background: $ui-base-color;\n}\n\n::-webkit-scrollbar-track:active {\n background: $ui-base-color;\n}\n\n::-webkit-scrollbar-corner {\n background: transparent;\n}\n","// Dependent colors\n$black: #000000;\n$white: #ffffff;\n\n$classic-base-color: #282c37;\n$classic-primary-color: #9baec8;\n$classic-secondary-color: #d9e1e8;\n$classic-highlight-color: #2b90d9;\n\n// Differences\n$success-green: lighten(#3c754d, 8%);\n\n$base-overlay-background: $white !default;\n$valid-value-color: $success-green !default;\n\n$ui-base-color: $classic-secondary-color !default;\n$ui-base-lighter-color: #b0c0cf;\n$ui-primary-color: #9bcbed;\n$ui-secondary-color: $classic-base-color !default;\n$ui-highlight-color: #2b90d9;\n\n$primary-text-color: $black !default;\n$darker-text-color: $classic-base-color !default;\n$dark-text-color: #444b5d;\n$action-button-color: #606984;\n\n$inverted-text-color: $black !default;\n$lighter-text-color: $classic-base-color !default;\n$light-text-color: #444b5d;\n\n//Newly added colors\n$account-background-color: $white !default;\n\n//Invert darkened and lightened colors\n@function darken($color, $amount) {\n @return hsl(hue($color), saturation($color), lightness($color) + $amount);\n}\n\n@function lighten($color, $amount) {\n @return hsl(hue($color), saturation($color), lightness($color) - $amount);\n}\n","@function hex-color($color) {\n @if type-of($color) == 'color' {\n $color: str-slice(ie-hex-str($color), 4);\n }\n\n @return '%23' + unquote($color);\n}\n\nbody {\n font-family: $font-sans-serif, sans-serif;\n background: darken($ui-base-color, 7%);\n font-size: 13px;\n line-height: 18px;\n font-weight: 400;\n color: $primary-text-color;\n text-rendering: optimizelegibility;\n font-feature-settings: \"kern\";\n text-size-adjust: none;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n -webkit-tap-highlight-color: transparent;\n\n &.system-font {\n // system-ui => standard property (Chrome/Android WebView 56+, Opera 43+, Safari 11+)\n // -apple-system => Safari <11 specific\n // BlinkMacSystemFont => Chrome <56 on macOS specific\n // Segoe UI => Windows 7/8/10\n // Oxygen => KDE\n // Ubuntu => Unity/Ubuntu\n // Cantarell => GNOME\n // Fira Sans => Firefox OS\n // Droid Sans => Older Androids (<4.0)\n // Helvetica Neue => Older macOS <10.11\n // $font-sans-serif => web-font (Roboto) fallback and newer Androids (>=4.0)\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Oxygen\", \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", $font-sans-serif, sans-serif;\n }\n\n &.app-body {\n padding: 0;\n\n &.layout-single-column {\n height: auto;\n min-height: 100vh;\n overflow-y: scroll;\n }\n\n &.layout-multiple-columns {\n position: absolute;\n width: 100%;\n height: 100%;\n }\n\n &.with-modals--active {\n overflow-y: hidden;\n }\n }\n\n &.lighter {\n background: $ui-base-color;\n }\n\n &.with-modals {\n overflow-x: hidden;\n overflow-y: scroll;\n\n &--active {\n overflow-y: hidden;\n }\n }\n\n &.player {\n text-align: center;\n }\n\n &.embed {\n background: lighten($ui-base-color, 4%);\n margin: 0;\n padding-bottom: 0;\n\n .container {\n position: absolute;\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n }\n\n &.admin {\n background: darken($ui-base-color, 4%);\n padding: 0;\n }\n\n &.error {\n position: absolute;\n text-align: center;\n color: $darker-text-color;\n background: $ui-base-color;\n width: 100%;\n height: 100%;\n padding: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n\n .dialog {\n vertical-align: middle;\n margin: 20px;\n\n &__illustration {\n img {\n display: block;\n max-width: 470px;\n width: 100%;\n height: auto;\n margin-top: -120px;\n }\n }\n\n h1 {\n font-size: 20px;\n line-height: 28px;\n font-weight: 400;\n }\n }\n }\n}\n\nbutton {\n font-family: inherit;\n cursor: pointer;\n\n &:focus {\n outline: none;\n }\n}\n\n.app-holder {\n &,\n & > div,\n & > noscript {\n display: flex;\n width: 100%;\n align-items: center;\n justify-content: center;\n outline: 0 !important;\n }\n\n & > noscript {\n height: 100vh;\n }\n}\n\n.layout-single-column .app-holder {\n &,\n & > div {\n min-height: 100vh;\n }\n}\n\n.layout-multiple-columns .app-holder {\n &,\n & > div {\n height: 100%;\n }\n}\n\n.error-boundary,\n.app-holder noscript {\n flex-direction: column;\n font-size: 16px;\n font-weight: 400;\n line-height: 1.7;\n color: lighten($error-red, 4%);\n text-align: center;\n\n & > div {\n max-width: 500px;\n }\n\n p {\n margin-bottom: .85em;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: $highlight-text-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n &__footer {\n color: $dark-text-color;\n font-size: 13px;\n\n a {\n color: $dark-text-color;\n }\n }\n\n button {\n display: inline;\n border: 0;\n background: transparent;\n color: $dark-text-color;\n font: inherit;\n padding: 0;\n margin: 0;\n line-height: inherit;\n cursor: pointer;\n outline: 0;\n transition: color 300ms linear;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n\n &.copied {\n color: $valid-value-color;\n transition: none;\n }\n }\n}\n",".container-alt {\n width: 700px;\n margin: 0 auto;\n margin-top: 40px;\n\n @media screen and (max-width: 740px) {\n width: 100%;\n margin: 0;\n }\n}\n\n.logo-container {\n margin: 100px auto 50px;\n\n @media screen and (max-width: 500px) {\n margin: 40px auto 0;\n }\n\n h1 {\n display: flex;\n justify-content: center;\n align-items: center;\n\n svg {\n fill: $primary-text-color;\n height: 42px;\n margin-right: 10px;\n }\n\n a {\n display: flex;\n justify-content: center;\n align-items: center;\n color: $primary-text-color;\n text-decoration: none;\n outline: 0;\n padding: 12px 16px;\n line-height: 32px;\n font-family: $font-display, sans-serif;\n font-weight: 500;\n font-size: 14px;\n }\n }\n}\n\n.compose-standalone {\n .compose-form {\n width: 400px;\n margin: 0 auto;\n padding: 20px 0;\n margin-top: 40px;\n box-sizing: border-box;\n\n @media screen and (max-width: 400px) {\n width: 100%;\n margin-top: 0;\n padding: 20px;\n }\n }\n}\n\n.account-header {\n width: 400px;\n margin: 0 auto;\n display: flex;\n font-size: 13px;\n line-height: 18px;\n box-sizing: border-box;\n padding: 20px 0;\n padding-bottom: 0;\n margin-bottom: -30px;\n margin-top: 40px;\n\n @media screen and (max-width: 440px) {\n width: 100%;\n margin: 0;\n margin-bottom: 10px;\n padding: 20px;\n padding-bottom: 0;\n }\n\n .avatar {\n width: 40px;\n height: 40px;\n margin-right: 8px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n }\n }\n\n .name {\n flex: 1 1 auto;\n color: $secondary-text-color;\n width: calc(100% - 88px);\n\n .username {\n display: block;\n font-weight: 500;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n }\n\n .logout-link {\n display: block;\n font-size: 32px;\n line-height: 40px;\n margin-left: 8px;\n }\n}\n\n.grid-3 {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: 3fr 1fr;\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-column: 1 / 3;\n grid-row: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 2;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1 / 3;\n grid-row: 3;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n grid-template-columns: minmax(0, 100%);\n\n .column-0 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .column-2 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1;\n grid-row: 4;\n }\n }\n}\n\n.grid-4 {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: repeat(4, minmax(0, 1fr));\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-column: 1 / 5;\n grid-row: 1;\n }\n\n .column-1 {\n grid-column: 1 / 4;\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 4;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 2 / 5;\n grid-row: 3;\n }\n\n .column-4 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .landing-page__call-to-action {\n min-height: 100%;\n }\n\n .flash-message {\n margin-bottom: 10px;\n }\n\n @media screen and (max-width: 738px) {\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n .landing-page__call-to-action {\n padding: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .row__information-board {\n width: 100%;\n justify-content: center;\n align-items: center;\n }\n\n .row__mascot {\n display: none;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n grid-template-columns: minmax(0, 100%);\n\n .column-0 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .column-2 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1;\n grid-row: 5;\n }\n\n .column-4 {\n grid-column: 1;\n grid-row: 4;\n }\n }\n}\n\n.public-layout {\n @media screen and (max-width: $no-gap-breakpoint) {\n padding-top: 48px;\n }\n\n .container {\n max-width: 960px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding: 0;\n }\n }\n\n .header {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n height: 48px;\n margin: 10px 0;\n display: flex;\n align-items: stretch;\n justify-content: center;\n flex-wrap: nowrap;\n overflow: hidden;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n position: fixed;\n width: 100%;\n top: 0;\n left: 0;\n margin: 0;\n border-radius: 0;\n box-shadow: none;\n z-index: 110;\n }\n\n & > div {\n flex: 1 1 33.3%;\n min-height: 1px;\n }\n\n .nav-left {\n display: flex;\n align-items: stretch;\n justify-content: flex-start;\n flex-wrap: nowrap;\n }\n\n .nav-center {\n display: flex;\n align-items: stretch;\n justify-content: center;\n flex-wrap: nowrap;\n }\n\n .nav-right {\n display: flex;\n align-items: stretch;\n justify-content: flex-end;\n flex-wrap: nowrap;\n }\n\n .brand {\n display: block;\n padding: 15px;\n\n svg {\n display: block;\n height: 18px;\n width: auto;\n position: relative;\n bottom: -2px;\n fill: $primary-text-color;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n height: 20px;\n }\n }\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 12%);\n }\n }\n\n .nav-link {\n display: flex;\n align-items: center;\n padding: 0 1rem;\n font-size: 12px;\n font-weight: 500;\n text-decoration: none;\n color: $darker-text-color;\n white-space: nowrap;\n text-align: center;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n color: $primary-text-color;\n }\n\n @media screen and (max-width: 550px) {\n &.optional {\n display: none;\n }\n }\n }\n\n .nav-button {\n background: lighten($ui-base-color, 16%);\n margin: 8px;\n margin-left: 0;\n border-radius: 4px;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n background: lighten($ui-base-color, 20%);\n }\n }\n }\n\n $no-columns-breakpoint: 600px;\n\n .grid {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(300px, 3fr) minmax(298px, 1fr);\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-row: 1;\n grid-column: 1;\n }\n\n .column-1 {\n grid-row: 1;\n grid-column: 2;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n grid-template-columns: 100%;\n grid-gap: 0;\n\n .column-1 {\n display: none;\n }\n }\n }\n\n .directory__card {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n\n .page-header {\n @media screen and (max-width: $no-gap-breakpoint) {\n border-bottom: 0;\n }\n }\n\n .public-account-header {\n overflow: hidden;\n margin-bottom: 10px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &.inactive {\n opacity: 0.5;\n\n .public-account-header__image,\n .avatar {\n filter: grayscale(100%);\n }\n\n .logo-button {\n background-color: $secondary-text-color;\n }\n }\n\n &__image {\n border-radius: 4px 4px 0 0;\n overflow: hidden;\n height: 300px;\n position: relative;\n background: darken($ui-base-color, 12%);\n\n &::after {\n content: \"\";\n display: block;\n position: absolute;\n width: 100%;\n height: 100%;\n box-shadow: inset 0 -1px 1px 1px rgba($base-shadow-color, 0.15);\n top: 0;\n left: 0;\n }\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 4px 4px 0 0;\n }\n\n @media screen and (max-width: 600px) {\n height: 200px;\n }\n }\n\n &--no-bar {\n margin-bottom: 0;\n\n .public-account-header__image,\n .public-account-header__image img {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n box-shadow: none;\n\n &__image::after {\n display: none;\n }\n\n &__image,\n &__image img {\n border-radius: 0;\n }\n }\n\n &__bar {\n position: relative;\n margin-top: -80px;\n display: flex;\n justify-content: flex-start;\n\n &::before {\n content: \"\";\n display: block;\n background: lighten($ui-base-color, 4%);\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: 60px;\n border-radius: 0 0 4px 4px;\n z-index: -1;\n }\n\n .avatar {\n display: block;\n width: 120px;\n height: 120px;\n padding-left: 20px - 4px;\n flex: 0 0 auto;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 50%;\n border: 4px solid lighten($ui-base-color, 4%);\n background: darken($ui-base-color, 8%);\n }\n }\n\n @media screen and (max-width: 600px) {\n margin-top: 0;\n background: lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n padding: 5px;\n\n &::before {\n display: none;\n }\n\n .avatar {\n width: 48px;\n height: 48px;\n padding: 7px 0;\n padding-left: 10px;\n\n img {\n border: 0;\n border-radius: 4px;\n }\n\n @media screen and (max-width: 360px) {\n display: none;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n flex-wrap: wrap;\n }\n }\n\n &__tabs {\n flex: 1 1 auto;\n margin-left: 20px;\n\n &__name {\n padding-top: 20px;\n padding-bottom: 8px;\n\n h1 {\n font-size: 20px;\n line-height: 18px * 1.5;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n text-shadow: 1px 1px 1px $base-shadow-color;\n\n small {\n display: block;\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n @media screen and (max-width: 600px) {\n margin-left: 15px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n &__name {\n padding-top: 0;\n padding-bottom: 0;\n\n h1 {\n font-size: 16px;\n line-height: 24px;\n text-shadow: none;\n\n small {\n color: $darker-text-color;\n }\n }\n }\n }\n\n &__tabs {\n display: flex;\n justify-content: flex-start;\n align-items: stretch;\n height: 58px;\n\n .details-counters {\n display: flex;\n flex-direction: row;\n min-width: 300px;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n .details-counters {\n display: none;\n }\n }\n\n .counter {\n min-width: 33.3%;\n box-sizing: border-box;\n flex: 0 0 auto;\n color: $darker-text-color;\n padding: 10px;\n border-right: 1px solid lighten($ui-base-color, 4%);\n cursor: default;\n text-align: center;\n position: relative;\n\n a {\n display: block;\n }\n\n &:last-child {\n border-right: 0;\n }\n\n &::after {\n display: block;\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n border-bottom: 4px solid $ui-primary-color;\n opacity: 0.5;\n transition: all 400ms ease;\n }\n\n &.active {\n &::after {\n border-bottom: 4px solid $highlight-text-color;\n opacity: 1;\n }\n\n &.inactive::after {\n border-bottom-color: $secondary-text-color;\n }\n }\n\n &:hover {\n &::after {\n opacity: 1;\n transition-duration: 100ms;\n }\n }\n\n a {\n text-decoration: none;\n color: inherit;\n }\n\n .counter-label {\n font-size: 12px;\n display: block;\n }\n\n .counter-number {\n font-weight: 500;\n font-size: 18px;\n margin-bottom: 5px;\n color: $primary-text-color;\n font-family: $font-display, sans-serif;\n }\n }\n\n .spacer {\n flex: 1 1 auto;\n height: 1px;\n }\n\n &__buttons {\n padding: 7px 8px;\n }\n }\n }\n\n &__extra {\n display: none;\n margin-top: 4px;\n\n .public-account-bio {\n border-radius: 0;\n box-shadow: none;\n background: transparent;\n margin: 0 -5px;\n\n .account__header__fields {\n border-top: 1px solid lighten($ui-base-color, 12%);\n }\n\n .roles {\n display: none;\n }\n }\n\n &__links {\n margin-top: -15px;\n font-size: 14px;\n color: $darker-text-color;\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n padding: 15px;\n font-weight: 500;\n\n strong {\n font-weight: 700;\n color: $primary-text-color;\n }\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n flex: 100%;\n }\n }\n }\n\n .account__section-headline {\n border-radius: 4px 4px 0 0;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n\n .detailed-status__meta {\n margin-top: 25px;\n }\n\n .public-account-bio {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n overflow: hidden;\n margin-bottom: 10px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n box-shadow: none;\n margin-bottom: 0;\n border-radius: 0;\n }\n\n .account__header__fields {\n margin: 0;\n border-top: 0;\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n\n .account__header__content {\n padding: 20px;\n padding-bottom: 0;\n color: $primary-text-color;\n }\n\n &__extra,\n .roles {\n padding: 20px;\n font-size: 14px;\n color: $darker-text-color;\n }\n\n .roles {\n padding-bottom: 0;\n }\n }\n\n .directory__list {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: block;\n }\n\n .icon-button {\n font-size: 18px;\n }\n }\n\n .directory__card {\n margin-bottom: 0;\n }\n\n .card-grid {\n display: flex;\n flex-wrap: wrap;\n min-width: 100%;\n margin: 0 -5px;\n\n & > div {\n box-sizing: border-box;\n flex: 1 0 auto;\n width: 300px;\n padding: 0 5px;\n margin-bottom: 10px;\n max-width: 33.333%;\n\n @media screen and (max-width: 900px) {\n max-width: 50%;\n }\n\n @media screen and (max-width: 600px) {\n max-width: 100%;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin: 0;\n border-top: 1px solid lighten($ui-base-color, 8%);\n\n & > div {\n width: 100%;\n padding: 0;\n margin-bottom: 0;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &:last-child {\n border-bottom: 0;\n }\n\n .card__bar {\n background: $ui-base-color;\n\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n }\n }\n }\n }\n}\n",".no-list {\n list-style: none;\n\n li {\n display: inline-block;\n margin: 0 5px;\n }\n}\n\n.recovery-codes {\n list-style: none;\n margin: 0 auto;\n\n li {\n font-size: 125%;\n line-height: 1.5;\n letter-spacing: 1px;\n }\n}\n",".public-layout {\n .footer {\n text-align: left;\n padding-top: 20px;\n padding-bottom: 60px;\n font-size: 12px;\n color: lighten($ui-base-color, 34%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding-left: 20px;\n padding-right: 20px;\n }\n\n .grid {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: 1fr 1fr 2fr 1fr 1fr;\n\n .column-0 {\n grid-column: 1;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-1 {\n grid-column: 2;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-2 {\n grid-column: 3;\n grid-row: 1;\n min-width: 0;\n text-align: center;\n\n h4 a {\n color: lighten($ui-base-color, 34%);\n }\n }\n\n .column-3 {\n grid-column: 4;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-4 {\n grid-column: 5;\n grid-row: 1;\n min-width: 0;\n }\n\n @media screen and (max-width: 690px) {\n grid-template-columns: 1fr 2fr 1fr;\n\n .column-0,\n .column-1 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 2;\n }\n\n .column-3,\n .column-4 {\n grid-column: 3;\n }\n\n .column-4 {\n grid-row: 2;\n }\n }\n\n @media screen and (max-width: 600px) {\n .column-1 {\n display: block;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n .column-0,\n .column-1,\n .column-3,\n .column-4 {\n display: none;\n }\n }\n }\n\n h4 {\n text-transform: uppercase;\n font-weight: 700;\n margin-bottom: 8px;\n color: $darker-text-color;\n\n a {\n color: inherit;\n text-decoration: none;\n }\n }\n\n ul a {\n text-decoration: none;\n color: lighten($ui-base-color, 34%);\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n\n .brand {\n svg {\n display: block;\n height: 36px;\n width: auto;\n margin: 0 auto;\n fill: lighten($ui-base-color, 34%);\n }\n\n &:hover,\n &:focus,\n &:active {\n svg {\n fill: lighten($ui-base-color, 38%);\n }\n }\n }\n }\n}\n",".compact-header {\n h1 {\n font-size: 24px;\n line-height: 28px;\n color: $darker-text-color;\n font-weight: 500;\n margin-bottom: 20px;\n padding: 0 10px;\n word-wrap: break-word;\n\n @media screen and (max-width: 740px) {\n text-align: center;\n padding: 20px 10px 0;\n }\n\n a {\n color: inherit;\n text-decoration: none;\n }\n\n small {\n font-weight: 400;\n color: $secondary-text-color;\n }\n\n img {\n display: inline-block;\n margin-bottom: -5px;\n margin-right: 15px;\n width: 36px;\n height: 36px;\n }\n }\n}\n",".hero-widget {\n margin-bottom: 10px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &__img {\n width: 100%;\n position: relative;\n overflow: hidden;\n border-radius: 4px 4px 0 0;\n background: $base-shadow-color;\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 4px 4px 0 0;\n }\n }\n\n &__text {\n background: $ui-base-color;\n padding: 20px;\n border-radius: 0 0 4px 4px;\n font-size: 15px;\n color: $darker-text-color;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n p {\n margin-bottom: 20px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n em {\n display: inline;\n margin: 0;\n padding: 0;\n font-weight: 700;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n color: lighten($darker-text-color, 10%);\n }\n\n a {\n color: $secondary-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n}\n\n.endorsements-widget {\n margin-bottom: 10px;\n padding-bottom: 10px;\n\n h4 {\n padding: 10px;\n text-transform: uppercase;\n font-weight: 700;\n font-size: 13px;\n color: $darker-text-color;\n }\n\n .account {\n padding: 10px 0;\n\n &:last-child {\n border-bottom: 0;\n }\n\n .account__display-name {\n display: flex;\n align-items: center;\n }\n\n .account__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n }\n\n .trends__item {\n padding: 10px;\n }\n}\n\n.trends-widget {\n h4 {\n color: $darker-text-color;\n }\n}\n\n.box-widget {\n padding: 20px;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n}\n\n.placeholder-widget {\n padding: 16px;\n border-radius: 4px;\n border: 2px dashed $dark-text-color;\n text-align: center;\n color: $darker-text-color;\n margin-bottom: 10px;\n}\n\n.contact-widget {\n min-height: 100%;\n font-size: 15px;\n color: $darker-text-color;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n padding: 0;\n\n h4 {\n padding: 10px;\n text-transform: uppercase;\n font-weight: 700;\n font-size: 13px;\n color: $darker-text-color;\n }\n\n .account {\n border-bottom: 0;\n padding: 10px 0;\n padding-top: 5px;\n }\n\n & > a {\n display: inline-block;\n padding: 10px;\n padding-top: 0;\n color: $darker-text-color;\n text-decoration: none;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.moved-account-widget {\n padding: 15px;\n padding-bottom: 20px;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n color: $secondary-text-color;\n font-weight: 400;\n margin-bottom: 10px;\n\n strong,\n a {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n color: inherit;\n text-decoration: underline;\n\n &.mention {\n text-decoration: none;\n\n span {\n text-decoration: none;\n }\n\n &:focus,\n &:hover,\n &:active {\n text-decoration: none;\n\n span {\n text-decoration: underline;\n }\n }\n }\n }\n\n &__message {\n margin-bottom: 15px;\n\n .fa {\n margin-right: 5px;\n color: $darker-text-color;\n }\n }\n\n &__card {\n .detailed-status__display-avatar {\n position: relative;\n cursor: pointer;\n }\n\n .detailed-status__display-name {\n margin-bottom: 0;\n text-decoration: none;\n\n span {\n font-weight: 400;\n }\n }\n }\n}\n\n.memoriam-widget {\n padding: 20px;\n border-radius: 4px;\n background: $base-shadow-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n font-size: 14px;\n color: $darker-text-color;\n margin-bottom: 10px;\n}\n\n.page-header {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n padding: 60px 15px;\n text-align: center;\n margin: 10px 0;\n\n h1 {\n color: $primary-text-color;\n font-size: 36px;\n line-height: 1.1;\n font-weight: 700;\n margin-bottom: 10px;\n }\n\n p {\n font-size: 15px;\n color: $darker-text-color;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-top: 0;\n background: lighten($ui-base-color, 4%);\n\n h1 {\n font-size: 24px;\n }\n }\n}\n\n.directory {\n background: $ui-base-color;\n border-radius: 4px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &__tag {\n box-sizing: border-box;\n margin-bottom: 10px;\n\n & > a,\n & > div {\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: $ui-base-color;\n border-radius: 4px;\n padding: 15px;\n text-decoration: none;\n color: inherit;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n }\n\n & > a {\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 8%);\n }\n }\n\n &.active > a {\n background: $ui-highlight-color;\n cursor: default;\n }\n\n &.disabled > div {\n opacity: 0.5;\n cursor: default;\n }\n\n h4 {\n flex: 1 1 auto;\n font-size: 18px;\n font-weight: 700;\n color: $primary-text-color;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n .fa {\n color: $darker-text-color;\n }\n\n small {\n display: block;\n font-weight: 400;\n font-size: 15px;\n margin-top: 8px;\n color: $darker-text-color;\n }\n }\n\n &.active h4 {\n &,\n .fa,\n small,\n .trends__item__current {\n color: $primary-text-color;\n }\n }\n\n .avatar-stack {\n flex: 0 0 auto;\n width: (36px + 4px) * 3;\n }\n\n &.active .avatar-stack .account__avatar {\n border-color: $ui-highlight-color;\n }\n\n .trends__item__current {\n padding-right: 0;\n }\n }\n}\n\n.avatar-stack {\n display: flex;\n justify-content: flex-end;\n\n .account__avatar {\n flex: 0 0 auto;\n width: 36px;\n height: 36px;\n border-radius: 50%;\n position: relative;\n margin-left: -10px;\n background: darken($ui-base-color, 8%);\n border: 2px solid $ui-base-color;\n\n &:nth-child(1) {\n z-index: 1;\n }\n\n &:nth-child(2) {\n z-index: 2;\n }\n\n &:nth-child(3) {\n z-index: 3;\n }\n }\n}\n\n.accounts-table {\n width: 100%;\n\n .account {\n padding: 0;\n border: 0;\n }\n\n strong {\n font-weight: 700;\n }\n\n thead th {\n text-align: center;\n text-transform: uppercase;\n color: $darker-text-color;\n font-weight: 700;\n padding: 10px;\n\n &:first-child {\n text-align: left;\n }\n }\n\n tbody td {\n padding: 15px 0;\n vertical-align: middle;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n tbody tr:last-child td {\n border-bottom: 0;\n }\n\n &__count {\n width: 120px;\n text-align: center;\n font-size: 15px;\n font-weight: 500;\n color: $primary-text-color;\n\n small {\n display: block;\n color: $darker-text-color;\n font-weight: 400;\n font-size: 14px;\n }\n }\n\n &__comment {\n width: 50%;\n vertical-align: initial !important;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n tbody td.optional {\n display: none;\n }\n }\n}\n\n.moved-account-widget,\n.memoriam-widget,\n.box-widget,\n.contact-widget,\n.landing-page__information.contact-widget,\n.directory,\n.page-header {\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n box-shadow: none;\n border-radius: 0;\n }\n}\n\n$maximum-width: 1235px;\n$fluid-breakpoint: $maximum-width + 20px;\n\n.statuses-grid {\n min-height: 600px;\n\n @media screen and (max-width: 640px) {\n width: 100% !important; // Masonry layout is unnecessary at this width\n }\n\n &__item {\n width: (960px - 20px) / 3;\n\n @media screen and (max-width: $fluid-breakpoint) {\n width: (940px - 20px) / 3;\n }\n\n @media screen and (max-width: 640px) {\n width: 100%;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n width: 100vw;\n }\n }\n\n .detailed-status {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 1px solid lighten($ui-base-color, 16%);\n }\n\n &.compact {\n .detailed-status__meta {\n margin-top: 15px;\n }\n\n .status__content {\n font-size: 15px;\n line-height: 20px;\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n .status__content__spoiler-link {\n line-height: 20px;\n margin: 0;\n }\n }\n\n .media-gallery,\n .status-card,\n .video-player {\n margin-top: 15px;\n }\n }\n }\n}\n\n.notice-widget {\n margin-bottom: 10px;\n color: $darker-text-color;\n\n p {\n margin-bottom: 10px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n font-size: 14px;\n line-height: 20px;\n }\n}\n\n.notice-widget,\n.placeholder-widget {\n a {\n text-decoration: none;\n font-weight: 500;\n color: $ui-highlight-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.table-of-contents {\n background: darken($ui-base-color, 4%);\n min-height: 100%;\n font-size: 14px;\n border-radius: 4px;\n\n li a {\n display: block;\n font-weight: 500;\n padding: 15px;\n overflow: hidden;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n text-decoration: none;\n color: $primary-text-color;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n\n li:last-child a {\n border-bottom: 0;\n }\n\n li ul {\n padding-left: 20px;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n }\n}\n","// Commonly used web colors\n$black: #000000; // Black\n$white: #ffffff; // White\n$success-green: #79bd9a !default; // Padua\n$error-red: #df405a !default; // Cerise\n$warning-red: #ff5050 !default; // Sunset Orange\n$gold-star: #ca8f04 !default; // Dark Goldenrod\n\n$red-bookmark: $warning-red;\n\n// Pleroma-Dark colors\n$pleroma-bg: #121a24;\n$pleroma-fg: #182230;\n$pleroma-text: #b9b9ba;\n$pleroma-links: #d8a070;\n\n// Values from the classic Mastodon UI\n$classic-base-color: $pleroma-bg;\n$classic-primary-color: #9baec8;\n$classic-secondary-color: #d9e1e8;\n$classic-highlight-color: #d8a070;\n\n// Variables for defaults in UI\n$base-shadow-color: $black !default;\n$base-overlay-background: $black !default;\n$base-border-color: $white !default;\n$simple-background-color: $white !default;\n$valid-value-color: $success-green !default;\n$error-value-color: $error-red !default;\n\n// Tell UI to use selected colors\n$ui-base-color: $classic-base-color !default; // Darkest\n$ui-base-lighter-color: lighten($ui-base-color, 26%) !default; // Lighter darkest\n$ui-primary-color: $classic-primary-color !default; // Lighter\n$ui-secondary-color: $classic-secondary-color !default; // Lightest\n$ui-highlight-color: $classic-highlight-color !default;\n\n// Variables for texts\n$primary-text-color: $white !default;\n$darker-text-color: $ui-primary-color !default;\n$dark-text-color: $ui-base-lighter-color !default;\n$secondary-text-color: $ui-secondary-color !default;\n$highlight-text-color: $ui-highlight-color !default;\n$action-button-color: $ui-base-lighter-color !default;\n// For texts on inverted backgrounds\n$inverted-text-color: $ui-base-color !default;\n$lighter-text-color: $ui-base-lighter-color !default;\n$light-text-color: $ui-primary-color !default;\n\n// Language codes that uses CJK fonts\n$cjk-langs: ja, ko, zh-CN, zh-HK, zh-TW;\n\n// Variables for components\n$media-modal-media-max-width: 100%;\n// put margins on top and bottom of image to avoid the screen covered by image.\n$media-modal-media-max-height: 80%;\n\n$no-gap-breakpoint: 415px;\n\n$font-sans-serif: 'mastodon-font-sans-serif' !default;\n$font-display: 'mastodon-font-display' !default;\n$font-monospace: 'mastodon-font-monospace' !default;\n","$no-columns-breakpoint: 600px;\n\ncode {\n font-family: $font-monospace, monospace;\n font-weight: 400;\n}\n\n.form-container {\n max-width: 400px;\n padding: 20px;\n margin: 0 auto;\n}\n\n.simple_form {\n .input {\n margin-bottom: 15px;\n overflow: hidden;\n\n &.hidden {\n margin: 0;\n }\n\n &.radio_buttons {\n .radio {\n margin-bottom: 15px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .radio > label {\n position: relative;\n padding-left: 28px;\n\n input {\n position: absolute;\n top: -2px;\n left: 0;\n }\n }\n }\n\n &.boolean {\n position: relative;\n margin-bottom: 0;\n\n .label_input > label {\n font-family: inherit;\n font-size: 14px;\n padding-top: 5px;\n color: $primary-text-color;\n display: block;\n width: auto;\n }\n\n .label_input,\n .hint {\n padding-left: 28px;\n }\n\n .label_input__wrapper {\n position: static;\n }\n\n label.checkbox {\n position: absolute;\n top: 2px;\n left: 0;\n }\n\n label a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: none;\n }\n }\n\n .recommended {\n position: absolute;\n margin: 0 4px;\n margin-top: -2px;\n }\n }\n }\n\n .row {\n display: flex;\n margin: 0 -5px;\n\n .input {\n box-sizing: border-box;\n flex: 1 1 auto;\n width: 50%;\n padding: 0 5px;\n }\n }\n\n .hint {\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n }\n\n code {\n border-radius: 3px;\n padding: 0.2em 0.4em;\n background: darken($ui-base-color, 12%);\n }\n\n li {\n list-style: disc;\n margin-left: 18px;\n }\n }\n\n ul.hint {\n margin-bottom: 15px;\n }\n\n span.hint {\n display: block;\n font-size: 12px;\n margin-top: 4px;\n }\n\n p.hint {\n margin-bottom: 15px;\n color: $darker-text-color;\n\n &.subtle-hint {\n text-align: center;\n font-size: 12px;\n line-height: 18px;\n margin-top: 15px;\n margin-bottom: 0;\n }\n }\n\n .card {\n margin-bottom: 15px;\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n .input.with_floating_label {\n .label_input {\n display: flex;\n\n & > label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 500;\n min-width: 150px;\n flex: 0 0 auto;\n }\n\n input,\n select {\n flex: 1 1 auto;\n }\n }\n\n &.select .hint {\n margin-top: 6px;\n margin-left: 150px;\n }\n }\n\n .input.with_label {\n .label_input > label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: block;\n margin-bottom: 8px;\n word-wrap: break-word;\n font-weight: 500;\n }\n\n .hint {\n margin-top: 6px;\n }\n\n ul {\n flex: 390px;\n }\n }\n\n .input.with_block_label {\n max-width: none;\n\n & > label {\n font-family: inherit;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n font-weight: 500;\n padding-top: 5px;\n }\n\n .hint {\n margin-bottom: 15px;\n }\n\n ul {\n columns: 2;\n }\n }\n\n .input.datetime .label_input select {\n display: inline-block;\n width: auto;\n flex: 0;\n }\n\n .required abbr {\n text-decoration: none;\n color: lighten($error-value-color, 12%);\n }\n\n .fields-group {\n margin-bottom: 25px;\n\n .input:last-child {\n margin-bottom: 0;\n }\n }\n\n .fields-row {\n display: flex;\n margin: 0 -10px;\n padding-top: 5px;\n margin-bottom: 25px;\n\n .input {\n max-width: none;\n }\n\n &__column {\n box-sizing: border-box;\n padding: 0 10px;\n flex: 1 1 auto;\n min-height: 1px;\n\n &-6 {\n max-width: 50%;\n }\n\n .actions {\n margin-top: 27px;\n }\n }\n\n .fields-group:last-child,\n .fields-row__column.fields-group {\n margin-bottom: 0;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n margin-bottom: 0;\n\n &__column {\n max-width: none;\n }\n\n .fields-group:last-child,\n .fields-row__column.fields-group,\n .fields-row__column {\n margin-bottom: 25px;\n }\n }\n }\n\n .input.radio_buttons .radio label {\n margin-bottom: 5px;\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: block;\n width: auto;\n }\n\n .check_boxes {\n .checkbox {\n label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: inline-block;\n width: auto;\n position: relative;\n padding-top: 5px;\n padding-left: 25px;\n flex: 1 1 auto;\n }\n\n input[type=checkbox] {\n position: absolute;\n left: 0;\n top: 5px;\n margin: 0;\n }\n }\n }\n\n .input.static .label_input__wrapper {\n font-size: 16px;\n padding: 10px;\n border: 1px solid $dark-text-color;\n border-radius: 4px;\n }\n\n input[type=text],\n input[type=number],\n input[type=email],\n input[type=password],\n textarea {\n box-sizing: border-box;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n width: 100%;\n outline: 0;\n font-family: inherit;\n resize: vertical;\n background: darken($ui-base-color, 10%);\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n padding: 10px;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &:invalid {\n box-shadow: none;\n }\n\n &:focus:invalid:not(:placeholder-shown) {\n border-color: lighten($error-red, 12%);\n }\n\n &:required:valid {\n border-color: $valid-value-color;\n }\n\n &:hover {\n border-color: darken($ui-base-color, 20%);\n }\n\n &:active,\n &:focus {\n border-color: $highlight-text-color;\n background: darken($ui-base-color, 8%);\n }\n }\n\n .input.field_with_errors {\n label {\n color: lighten($error-red, 12%);\n }\n\n input[type=text],\n input[type=number],\n input[type=email],\n input[type=password],\n textarea,\n select {\n border-color: lighten($error-red, 12%);\n }\n\n .error {\n display: block;\n font-weight: 500;\n color: lighten($error-red, 12%);\n margin-top: 4px;\n }\n }\n\n .input.disabled {\n opacity: 0.5;\n }\n\n .actions {\n margin-top: 30px;\n display: flex;\n\n &.actions--top {\n margin-top: 0;\n margin-bottom: 30px;\n }\n }\n\n button,\n .button,\n .block-button {\n display: block;\n width: 100%;\n border: 0;\n border-radius: 4px;\n background: $ui-highlight-color;\n color: $primary-text-color;\n font-size: 18px;\n line-height: inherit;\n height: auto;\n padding: 10px;\n text-transform: uppercase;\n text-decoration: none;\n text-align: center;\n box-sizing: border-box;\n cursor: pointer;\n font-weight: 500;\n outline: 0;\n margin-bottom: 10px;\n margin-right: 10px;\n\n &:last-child {\n margin-right: 0;\n }\n\n &:hover {\n background-color: lighten($ui-highlight-color, 5%);\n }\n\n &:active,\n &:focus {\n background-color: darken($ui-highlight-color, 5%);\n }\n\n &:disabled:hover {\n background-color: $ui-primary-color;\n }\n\n &.negative {\n background: $error-value-color;\n\n &:hover {\n background-color: lighten($error-value-color, 5%);\n }\n\n &:active,\n &:focus {\n background-color: darken($error-value-color, 5%);\n }\n }\n }\n\n select {\n appearance: none;\n box-sizing: border-box;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n width: 100%;\n outline: 0;\n font-family: inherit;\n resize: vertical;\n background: darken($ui-base-color, 10%) url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center / auto 16px;\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n padding-left: 10px;\n padding-right: 30px;\n height: 41px;\n }\n\n h4 {\n margin-bottom: 15px !important;\n }\n\n .label_input {\n &__wrapper {\n position: relative;\n }\n\n &__append {\n position: absolute;\n right: 3px;\n top: 1px;\n padding: 10px;\n padding-bottom: 9px;\n font-size: 16px;\n color: $dark-text-color;\n font-family: inherit;\n pointer-events: none;\n cursor: default;\n max-width: 140px;\n white-space: nowrap;\n overflow: hidden;\n\n &::after {\n content: '';\n display: block;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 1px;\n width: 5px;\n background-image: linear-gradient(to right, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));\n }\n }\n }\n\n &__overlay-area {\n position: relative;\n\n &__blurred form {\n filter: blur(2px);\n }\n\n &__overlay {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n background: rgba($ui-base-color, 0.65);\n border-radius: 4px;\n margin-left: -4px;\n margin-top: -4px;\n padding: 4px;\n\n &__content {\n text-align: center;\n\n &.rich-formatting {\n &,\n p {\n color: $primary-text-color;\n }\n }\n }\n }\n }\n}\n\n.block-icon {\n display: block;\n margin: 0 auto;\n margin-bottom: 10px;\n font-size: 24px;\n}\n\n.flash-message {\n background: lighten($ui-base-color, 8%);\n color: $darker-text-color;\n border-radius: 4px;\n padding: 15px 10px;\n margin-bottom: 30px;\n text-align: center;\n\n &.notice {\n border: 1px solid rgba($valid-value-color, 0.5);\n background: rgba($valid-value-color, 0.25);\n color: $valid-value-color;\n }\n\n &.alert {\n border: 1px solid rgba($error-value-color, 0.5);\n background: rgba($error-value-color, 0.25);\n color: $error-value-color;\n }\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n\n &:hover {\n color: $primary-text-color;\n text-decoration: underline;\n }\n }\n\n p {\n margin-bottom: 15px;\n }\n\n .oauth-code {\n outline: 0;\n box-sizing: border-box;\n display: block;\n width: 100%;\n border: 0;\n padding: 10px;\n font-family: $font-monospace, monospace;\n background: $ui-base-color;\n color: $primary-text-color;\n font-size: 14px;\n margin: 0;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n @media screen and (max-width: 740px) and (min-width: 441px) {\n margin-top: 40px;\n }\n}\n\n.form-footer {\n margin-top: 30px;\n text-align: center;\n\n a {\n color: $darker-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.quick-nav {\n list-style: none;\n margin-bottom: 25px;\n font-size: 14px;\n\n li {\n display: inline-block;\n margin-right: 10px;\n }\n\n a {\n color: $highlight-text-color;\n text-transform: uppercase;\n text-decoration: none;\n font-weight: 700;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($highlight-text-color, 8%);\n }\n }\n}\n\n.oauth-prompt,\n.follow-prompt {\n margin-bottom: 30px;\n color: $darker-text-color;\n\n h2 {\n font-size: 16px;\n margin-bottom: 30px;\n text-align: center;\n }\n\n strong {\n color: $secondary-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n @media screen and (max-width: 740px) and (min-width: 441px) {\n margin-top: 40px;\n }\n}\n\n.qr-wrapper {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n}\n\n.qr-code {\n flex: 0 0 auto;\n background: $simple-background-color;\n padding: 4px;\n margin: 0 10px 20px 0;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n display: inline-block;\n\n svg {\n display: block;\n margin: 0;\n }\n}\n\n.qr-alternative {\n margin-bottom: 20px;\n color: $secondary-text-color;\n flex: 150px;\n\n samp {\n display: block;\n font-size: 14px;\n }\n}\n\n.table-form {\n p {\n margin-bottom: 15px;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n }\n}\n\n.simple_form,\n.table-form {\n .warning {\n box-sizing: border-box;\n background: rgba($error-value-color, 0.5);\n color: $primary-text-color;\n text-shadow: 1px 1px 0 rgba($base-shadow-color, 0.3);\n box-shadow: 0 2px 6px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n padding: 10px;\n margin-bottom: 15px;\n\n a {\n color: $primary-text-color;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n strong {\n font-weight: 600;\n display: block;\n margin-bottom: 5px;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n\n .fa {\n font-weight: 400;\n }\n }\n }\n}\n\n.action-pagination {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n\n .actions,\n .pagination {\n flex: 1 1 auto;\n }\n\n .actions {\n padding: 30px 0;\n padding-right: 20px;\n flex: 0 0 auto;\n }\n}\n\n.post-follow-actions {\n text-align: center;\n color: $darker-text-color;\n\n div {\n margin-bottom: 4px;\n }\n}\n\n.alternative-login {\n margin-top: 20px;\n margin-bottom: 20px;\n\n h4 {\n font-size: 16px;\n color: $primary-text-color;\n text-align: center;\n margin-bottom: 20px;\n border: 0;\n padding: 0;\n }\n\n .button {\n display: block;\n }\n}\n\n.scope-danger {\n color: $warning-red;\n}\n\n.form_admin_settings_site_short_description,\n.form_admin_settings_site_description,\n.form_admin_settings_site_extended_description,\n.form_admin_settings_site_terms,\n.form_admin_settings_custom_css,\n.form_admin_settings_closed_registrations_message {\n textarea {\n font-family: $font-monospace, monospace;\n }\n}\n\n.input-copy {\n background: darken($ui-base-color, 10%);\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n display: flex;\n align-items: center;\n padding-right: 4px;\n position: relative;\n top: 1px;\n transition: border-color 300ms linear;\n\n &__wrapper {\n flex: 1 1 auto;\n }\n\n input[type=text] {\n background: transparent;\n border: 0;\n padding: 10px;\n font-size: 14px;\n font-family: $font-monospace, monospace;\n }\n\n button {\n flex: 0 0 auto;\n margin: 4px;\n text-transform: none;\n font-weight: 400;\n font-size: 14px;\n padding: 7px 18px;\n padding-bottom: 6px;\n width: auto;\n transition: background 300ms linear;\n }\n\n &.copied {\n border-color: $valid-value-color;\n transition: none;\n\n button {\n background: $valid-value-color;\n transition: none;\n }\n }\n}\n\n.connection-prompt {\n margin-bottom: 25px;\n\n .fa-link {\n background-color: darken($ui-base-color, 4%);\n border-radius: 100%;\n font-size: 24px;\n padding: 10px;\n }\n\n &__column {\n align-items: center;\n display: flex;\n flex: 1;\n flex-direction: column;\n flex-shrink: 1;\n max-width: 50%;\n\n &-sep {\n align-self: center;\n flex-grow: 0;\n overflow: visible;\n position: relative;\n z-index: 1;\n }\n\n p {\n word-break: break-word;\n }\n }\n\n .account__avatar {\n margin-bottom: 20px;\n }\n\n &__connection {\n background-color: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n padding: 25px 10px;\n position: relative;\n text-align: center;\n\n &::after {\n background-color: darken($ui-base-color, 4%);\n content: '';\n display: block;\n height: 100%;\n left: 50%;\n position: absolute;\n top: 0;\n width: 1px;\n }\n }\n\n &__row {\n align-items: flex-start;\n display: flex;\n flex-direction: row;\n }\n}\n",".card {\n & > a {\n display: block;\n text-decoration: none;\n color: inherit;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n box-shadow: none;\n }\n\n &:hover,\n &:active,\n &:focus {\n .card__bar {\n background: lighten($ui-base-color, 8%);\n }\n }\n }\n\n &__img {\n height: 130px;\n position: relative;\n background: darken($ui-base-color, 12%);\n border-radius: 4px 4px 0 0;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n object-fit: cover;\n border-radius: 4px 4px 0 0;\n }\n\n @media screen and (max-width: 600px) {\n height: 200px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n\n &__bar {\n position: relative;\n padding: 15px;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n\n .avatar {\n flex: 0 0 auto;\n width: 48px;\n height: 48px;\n padding-top: 2px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n background: darken($ui-base-color, 8%);\n object-fit: cover;\n }\n }\n\n .display-name {\n margin-left: 15px;\n text-align: left;\n\n strong {\n font-size: 15px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n span {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n}\n\n.pagination {\n padding: 30px 0;\n text-align: center;\n overflow: hidden;\n\n a,\n .current,\n .newer,\n .older,\n .page,\n .gap {\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 500;\n display: inline-block;\n padding: 6px 10px;\n text-decoration: none;\n }\n\n .current {\n background: $simple-background-color;\n border-radius: 100px;\n color: $inverted-text-color;\n cursor: default;\n margin: 0 10px;\n }\n\n .gap {\n cursor: default;\n }\n\n .older,\n .newer {\n text-transform: uppercase;\n color: $secondary-text-color;\n }\n\n .older {\n float: left;\n padding-left: 0;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n .newer {\n float: right;\n padding-right: 0;\n\n .fa {\n display: inline-block;\n margin-left: 5px;\n }\n }\n\n .disabled {\n cursor: default;\n color: lighten($inverted-text-color, 10%);\n }\n\n @media screen and (max-width: 700px) {\n padding: 30px 20px;\n\n .page {\n display: none;\n }\n\n .newer,\n .older {\n display: inline-block;\n }\n }\n}\n\n.nothing-here {\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n color: $light-text-color;\n font-size: 14px;\n font-weight: 500;\n text-align: center;\n display: flex;\n justify-content: center;\n align-items: center;\n cursor: default;\n border-radius: 4px;\n padding: 20px;\n min-height: 30vh;\n\n &--under-tabs {\n border-radius: 0 0 4px 4px;\n }\n\n &--flexible {\n box-sizing: border-box;\n min-height: 100%;\n }\n}\n\n.account-role,\n.simple_form .recommended {\n display: inline-block;\n padding: 4px 6px;\n cursor: default;\n border-radius: 3px;\n font-size: 12px;\n line-height: 12px;\n font-weight: 500;\n color: $ui-secondary-color;\n background-color: rgba($ui-secondary-color, 0.1);\n border: 1px solid rgba($ui-secondary-color, 0.5);\n\n &.moderator {\n color: $success-green;\n background-color: rgba($success-green, 0.1);\n border-color: rgba($success-green, 0.5);\n }\n\n &.admin {\n color: lighten($error-red, 12%);\n background-color: rgba(lighten($error-red, 12%), 0.1);\n border-color: rgba(lighten($error-red, 12%), 0.5);\n }\n}\n\n.account__header__fields {\n max-width: 100vw;\n padding: 0;\n margin: 15px -15px -15px;\n border: 0 none;\n border-top: 1px solid lighten($ui-base-color, 12%);\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n font-size: 14px;\n line-height: 20px;\n\n dl {\n display: flex;\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n }\n\n dt,\n dd {\n box-sizing: border-box;\n padding: 14px;\n text-align: center;\n max-height: 48px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n dt {\n font-weight: 500;\n width: 120px;\n flex: 0 0 auto;\n color: $secondary-text-color;\n background: rgba(darken($ui-base-color, 8%), 0.5);\n }\n\n dd {\n flex: 1 1 auto;\n color: $darker-text-color;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n\n .verified {\n border: 1px solid rgba($valid-value-color, 0.5);\n background: rgba($valid-value-color, 0.25);\n\n a {\n color: $valid-value-color;\n font-weight: 500;\n }\n\n &__mark {\n color: $valid-value-color;\n }\n }\n\n dl:last-child {\n border-bottom: 0;\n }\n}\n\n.directory__tag .trends__item__current {\n width: auto;\n}\n\n.pending-account {\n &__header {\n color: $darker-text-color;\n\n a {\n color: $ui-secondary-color;\n text-decoration: none;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n\n strong {\n color: $primary-text-color;\n font-weight: 700;\n }\n }\n\n &__body {\n margin-top: 10px;\n }\n}\n",".activity-stream {\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n overflow: hidden;\n margin-bottom: 10px;\n\n &--under-tabs {\n border-radius: 0 0 4px 4px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n border-radius: 0;\n box-shadow: none;\n }\n\n &--headless {\n border-radius: 0;\n margin: 0;\n box-shadow: none;\n\n .detailed-status,\n .status {\n border-radius: 0 !important;\n }\n }\n\n div[data-component] {\n width: 100%;\n }\n\n .entry {\n background: $ui-base-color;\n\n .detailed-status,\n .status,\n .load-more {\n animation: none;\n }\n\n &:last-child {\n .detailed-status,\n .status,\n .load-more {\n border-bottom: 0;\n border-radius: 0 0 4px 4px;\n }\n }\n\n &:first-child {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 4px 4px 0 0;\n }\n\n &:last-child {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 4px;\n }\n }\n }\n\n @media screen and (max-width: 740px) {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 0 !important;\n }\n }\n }\n\n &--highlighted .entry {\n background: lighten($ui-base-color, 8%);\n }\n}\n\n.button.logo-button {\n flex: 0 auto;\n font-size: 14px;\n background: $ui-highlight-color;\n color: $primary-text-color;\n text-transform: none;\n line-height: 36px;\n height: auto;\n padding: 3px 15px;\n border: 0;\n\n svg {\n width: 20px;\n height: auto;\n vertical-align: middle;\n margin-right: 5px;\n fill: $primary-text-color;\n }\n\n &:active,\n &:focus,\n &:hover {\n background: lighten($ui-highlight-color, 10%);\n }\n\n &:disabled,\n &.disabled {\n &:active,\n &:focus,\n &:hover {\n background: $ui-primary-color;\n }\n }\n\n &.button--destructive {\n &:active,\n &:focus,\n &:hover {\n background: $error-red;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n svg {\n display: none;\n }\n }\n}\n\n.embed,\n.public-layout {\n .detailed-status {\n padding: 15px;\n }\n\n .status {\n padding: 15px 15px 15px (48px + 15px * 2);\n min-height: 48px + 2px;\n\n &__avatar {\n left: 15px;\n top: 17px;\n }\n\n &__content {\n padding-top: 5px;\n }\n\n &__prepend {\n margin-left: 48px + 15px * 2;\n padding-top: 15px;\n }\n\n &__prepend-icon-wrapper {\n left: -32px;\n }\n\n .media-gallery,\n &__action-bar,\n .video-player {\n margin-top: 10px;\n }\n }\n}\n","button.icon-button i.fa-retweet {\n background-image: url(\"data:image/svg+xml;utf8,\");\n\n &:hover {\n background-image: url(\"data:image/svg+xml;utf8,\");\n }\n}\n\nbutton.icon-button.disabled i.fa-retweet {\n background-image: url(\"data:image/svg+xml;utf8,\");\n}\n",".app-body {\n -webkit-overflow-scrolling: touch;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n}\n\n.animated-number {\n display: inline-flex;\n flex-direction: column;\n align-items: stretch;\n overflow: hidden;\n position: relative;\n}\n\n.link-button {\n display: block;\n font-size: 15px;\n line-height: 20px;\n color: $ui-highlight-color;\n border: 0;\n background: transparent;\n padding: 0;\n cursor: pointer;\n\n &:hover,\n &:active {\n text-decoration: underline;\n }\n\n &:disabled {\n color: $ui-primary-color;\n cursor: default;\n }\n}\n\n.button {\n background-color: $ui-highlight-color;\n border: 10px none;\n border-radius: 4px;\n box-sizing: border-box;\n color: $primary-text-color;\n cursor: pointer;\n display: inline-block;\n font-family: inherit;\n font-size: 14px;\n font-weight: 500;\n height: 36px;\n letter-spacing: 0;\n line-height: 36px;\n overflow: hidden;\n padding: 0 16px;\n position: relative;\n text-align: center;\n text-transform: uppercase;\n text-decoration: none;\n text-overflow: ellipsis;\n transition: all 100ms ease-in;\n white-space: nowrap;\n width: auto;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-highlight-color, 10%);\n transition: all 200ms ease-out;\n }\n\n &--destructive {\n transition: none;\n\n &:active,\n &:focus,\n &:hover {\n background-color: $error-red;\n transition: none;\n }\n }\n\n &:disabled,\n &.disabled {\n background-color: $ui-primary-color;\n cursor: default;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &.button-primary,\n &.button-alternative,\n &.button-secondary,\n &.button-alternative-2 {\n font-size: 16px;\n line-height: 36px;\n height: auto;\n text-transform: none;\n padding: 4px 16px;\n }\n\n &.button-alternative {\n color: $inverted-text-color;\n background: $ui-primary-color;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-primary-color, 4%);\n }\n }\n\n &.button-alternative-2 {\n background: $ui-base-lighter-color;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-base-lighter-color, 4%);\n }\n }\n\n &.button-secondary {\n color: $darker-text-color;\n background: transparent;\n padding: 3px 15px;\n border: 1px solid $ui-primary-color;\n\n &:active,\n &:focus,\n &:hover {\n border-color: lighten($ui-primary-color, 4%);\n color: lighten($darker-text-color, 4%);\n }\n\n &:disabled {\n opacity: 0.5;\n }\n }\n\n &.button--block {\n display: block;\n width: 100%;\n }\n}\n\n.column__wrapper {\n display: flex;\n flex: 1 1 auto;\n position: relative;\n}\n\n.icon-button {\n display: inline-block;\n padding: 0;\n color: $action-button-color;\n border: 0;\n border-radius: 4px;\n background: transparent;\n cursor: pointer;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($action-button-color, 7%);\n background-color: rgba($action-button-color, 0.15);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n }\n\n &:focus {\n background-color: rgba($action-button-color, 0.3);\n }\n\n &.disabled {\n color: darken($action-button-color, 13%);\n background-color: transparent;\n cursor: default;\n }\n\n &.active {\n color: $highlight-text-color;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &.inverted {\n color: $lighter-text-color;\n\n &:hover,\n &:active,\n &:focus {\n color: darken($lighter-text-color, 7%);\n background-color: rgba($lighter-text-color, 0.15);\n }\n\n &:focus {\n background-color: rgba($lighter-text-color, 0.3);\n }\n\n &.disabled {\n color: lighten($lighter-text-color, 7%);\n background-color: transparent;\n }\n\n &.active {\n color: $highlight-text-color;\n\n &.disabled {\n color: lighten($highlight-text-color, 13%);\n }\n }\n }\n\n &.overlayed {\n box-sizing: content-box;\n background: rgba($base-overlay-background, 0.6);\n color: rgba($primary-text-color, 0.7);\n border-radius: 4px;\n padding: 2px;\n\n &:hover {\n background: rgba($base-overlay-background, 0.9);\n }\n }\n}\n\n.text-icon-button {\n color: $lighter-text-color;\n border: 0;\n border-radius: 4px;\n background: transparent;\n cursor: pointer;\n font-weight: 600;\n font-size: 11px;\n padding: 0 3px;\n line-height: 27px;\n outline: 0;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &:hover,\n &:active,\n &:focus {\n color: darken($lighter-text-color, 7%);\n background-color: rgba($lighter-text-color, 0.15);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n }\n\n &:focus {\n background-color: rgba($lighter-text-color, 0.3);\n }\n\n &.disabled {\n color: lighten($lighter-text-color, 20%);\n background-color: transparent;\n cursor: default;\n }\n\n &.active {\n color: $highlight-text-color;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n}\n\n.dropdown-menu {\n position: absolute;\n}\n\n.invisible {\n font-size: 0;\n line-height: 0;\n display: inline-block;\n width: 0;\n height: 0;\n position: absolute;\n\n img,\n svg {\n margin: 0 !important;\n border: 0 !important;\n padding: 0 !important;\n width: 0 !important;\n height: 0 !important;\n }\n}\n\n.ellipsis {\n &::after {\n content: \"…\";\n }\n}\n\n.compose-form {\n padding: 10px;\n\n &__sensitive-button {\n padding: 10px;\n padding-top: 0;\n\n font-size: 14px;\n font-weight: 500;\n\n &.active {\n color: $highlight-text-color;\n }\n\n input[type=checkbox] {\n display: none;\n }\n\n .checkbox {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 4px;\n vertical-align: middle;\n\n &.active {\n border-color: $highlight-text-color;\n background: $highlight-text-color;\n }\n }\n }\n\n .compose-form__warning {\n color: $inverted-text-color;\n margin-bottom: 10px;\n background: $ui-primary-color;\n box-shadow: 0 2px 6px rgba($base-shadow-color, 0.3);\n padding: 8px 10px;\n border-radius: 4px;\n font-size: 13px;\n font-weight: 400;\n\n strong {\n color: $inverted-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n color: $lighter-text-color;\n font-weight: 500;\n text-decoration: underline;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: none;\n }\n }\n }\n\n .emoji-picker-dropdown {\n position: absolute;\n top: 0;\n right: 0;\n }\n\n .compose-form__autosuggest-wrapper {\n position: relative;\n }\n\n .autosuggest-textarea,\n .autosuggest-input,\n .spoiler-input {\n position: relative;\n width: 100%;\n }\n\n .spoiler-input {\n height: 0;\n transform-origin: bottom;\n opacity: 0;\n\n &.spoiler-input--visible {\n height: 36px;\n margin-bottom: 11px;\n opacity: 1;\n }\n }\n\n .autosuggest-textarea__textarea,\n .spoiler-input__input {\n display: block;\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n color: $inverted-text-color;\n background: $simple-background-color;\n padding: 10px;\n font-family: inherit;\n font-size: 14px;\n resize: vertical;\n border: 0;\n outline: 0;\n\n &::placeholder {\n color: $dark-text-color;\n }\n\n &:focus {\n outline: 0;\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n .spoiler-input__input {\n border-radius: 4px;\n }\n\n .autosuggest-textarea__textarea {\n min-height: 100px;\n border-radius: 4px 4px 0 0;\n padding-bottom: 0;\n padding-right: 10px + 22px;\n resize: none;\n scrollbar-color: initial;\n\n &::-webkit-scrollbar {\n all: unset;\n }\n\n @media screen and (max-width: 600px) {\n height: 100px !important; // prevent auto-resize textarea\n resize: vertical;\n }\n }\n\n .autosuggest-textarea__suggestions-wrapper {\n position: relative;\n height: 0;\n }\n\n .autosuggest-textarea__suggestions {\n box-sizing: border-box;\n display: none;\n position: absolute;\n top: 100%;\n width: 100%;\n z-index: 99;\n box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4);\n background: $ui-secondary-color;\n border-radius: 0 0 4px 4px;\n color: $inverted-text-color;\n font-size: 14px;\n padding: 6px;\n\n &.autosuggest-textarea__suggestions--visible {\n display: block;\n }\n }\n\n .autosuggest-textarea__suggestions__item {\n padding: 10px;\n cursor: pointer;\n border-radius: 4px;\n\n &:hover,\n &:focus,\n &:active,\n &.selected {\n background: darken($ui-secondary-color, 10%);\n }\n }\n\n .autosuggest-account,\n .autosuggest-emoji,\n .autosuggest-hashtag {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: flex-start;\n line-height: 18px;\n font-size: 14px;\n }\n\n .autosuggest-hashtag {\n justify-content: space-between;\n\n &__name {\n flex: 1 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n strong {\n font-weight: 500;\n }\n\n &__uses {\n flex: 0 0 auto;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n }\n\n .autosuggest-account-icon,\n .autosuggest-emoji img {\n display: block;\n margin-right: 8px;\n width: 16px;\n height: 16px;\n }\n\n .autosuggest-account .display-name__account {\n color: $lighter-text-color;\n }\n\n .compose-form__modifiers {\n color: $inverted-text-color;\n font-family: inherit;\n font-size: 14px;\n background: $simple-background-color;\n\n .compose-form__upload-wrapper {\n overflow: hidden;\n }\n\n .compose-form__uploads-wrapper {\n display: flex;\n flex-direction: row;\n padding: 5px;\n flex-wrap: wrap;\n }\n\n .compose-form__upload {\n flex: 1 1 0;\n min-width: 40%;\n margin: 5px;\n\n &__actions {\n background: linear-gradient(180deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n opacity: 0;\n transition: opacity .1s ease;\n\n .icon-button {\n flex: 0 1 auto;\n color: $secondary-text-color;\n font-size: 14px;\n font-weight: 500;\n padding: 10px;\n font-family: inherit;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($secondary-text-color, 7%);\n }\n }\n\n &.active {\n opacity: 1;\n }\n }\n\n &-description {\n position: absolute;\n z-index: 2;\n bottom: 0;\n left: 0;\n right: 0;\n box-sizing: border-box;\n background: linear-gradient(0deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);\n padding: 10px;\n opacity: 0;\n transition: opacity .1s ease;\n\n textarea {\n background: transparent;\n color: $secondary-text-color;\n border: 0;\n padding: 0;\n margin: 0;\n width: 100%;\n font-family: inherit;\n font-size: 14px;\n font-weight: 500;\n\n &:focus {\n color: $white;\n }\n\n &::placeholder {\n opacity: 0.75;\n color: $secondary-text-color;\n }\n }\n\n &.active {\n opacity: 1;\n }\n }\n }\n\n .compose-form__upload-thumbnail {\n border-radius: 4px;\n background-color: $base-shadow-color;\n background-position: center;\n background-size: cover;\n background-repeat: no-repeat;\n height: 140px;\n width: 100%;\n overflow: hidden;\n }\n }\n\n .compose-form__buttons-wrapper {\n padding: 10px;\n background: darken($simple-background-color, 8%);\n border-radius: 0 0 4px 4px;\n display: flex;\n justify-content: space-between;\n flex: 0 0 auto;\n\n .compose-form__buttons {\n display: flex;\n\n .compose-form__upload-button-icon {\n line-height: 27px;\n }\n\n .compose-form__sensitive-button {\n display: none;\n\n &.compose-form__sensitive-button--visible {\n display: block;\n }\n\n .compose-form__sensitive-button__icon {\n line-height: 27px;\n }\n }\n }\n\n .icon-button,\n .text-icon-button {\n box-sizing: content-box;\n padding: 0 3px;\n }\n\n .character-counter__wrapper {\n align-self: center;\n margin-right: 4px;\n }\n }\n\n .compose-form__publish {\n display: flex;\n justify-content: flex-end;\n min-width: 0;\n flex: 0 0 auto;\n\n .compose-form__publish-button-wrapper {\n overflow: hidden;\n padding-top: 10px;\n }\n }\n}\n\n.character-counter {\n cursor: default;\n font-family: $font-sans-serif, sans-serif;\n font-size: 14px;\n font-weight: 600;\n color: $lighter-text-color;\n\n &.character-counter--over {\n color: $warning-red;\n }\n}\n\n.no-reduce-motion .spoiler-input {\n transition: height 0.4s ease, opacity 0.4s ease;\n}\n\n.emojione {\n font-size: inherit;\n vertical-align: middle;\n object-fit: contain;\n margin: -.2ex .15em .2ex;\n width: 16px;\n height: 16px;\n\n img {\n width: auto;\n }\n}\n\n.reply-indicator {\n border-radius: 4px;\n margin-bottom: 10px;\n background: $ui-primary-color;\n padding: 10px;\n min-height: 23px;\n overflow-y: auto;\n flex: 0 2 auto;\n}\n\n.reply-indicator__header {\n margin-bottom: 5px;\n overflow: hidden;\n}\n\n.reply-indicator__cancel {\n float: right;\n line-height: 24px;\n}\n\n.reply-indicator__display-name {\n color: $inverted-text-color;\n display: block;\n max-width: 100%;\n line-height: 24px;\n overflow: hidden;\n padding-right: 25px;\n text-decoration: none;\n}\n\n.reply-indicator__display-avatar {\n float: left;\n margin-right: 5px;\n}\n\n.status__content--with-action {\n cursor: pointer;\n}\n\n.status__content,\n.reply-indicator__content {\n position: relative;\n font-size: 15px;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n padding-top: 2px;\n color: $primary-text-color;\n\n &:focus {\n outline: 0;\n }\n\n &.status__content--with-spoiler {\n white-space: normal;\n\n .status__content__text {\n white-space: pre-wrap;\n }\n }\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n img {\n max-width: 100%;\n max-height: 400px;\n object-fit: contain;\n }\n\n p {\n margin-bottom: 20px;\n white-space: pre-wrap;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: $pleroma-links;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n\n .fa {\n color: lighten($dark-text-color, 7%);\n }\n }\n\n &.mention {\n &:hover {\n text-decoration: none;\n\n span {\n text-decoration: underline;\n }\n }\n }\n\n .fa {\n color: $dark-text-color;\n }\n }\n\n a.unhandled-link {\n color: lighten($ui-highlight-color, 8%);\n }\n\n .status__content__spoiler-link {\n background: $action-button-color;\n\n &:hover {\n background: lighten($action-button-color, 7%);\n text-decoration: none;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n\n .status__content__text {\n display: none;\n\n &.status__content__text--visible {\n display: block;\n }\n }\n}\n\n.announcements__item__content {\n word-wrap: break-word;\n overflow-y: auto;\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n p {\n margin-bottom: 10px;\n white-space: pre-wrap;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: $secondary-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n\n &.mention {\n &:hover {\n text-decoration: none;\n\n span {\n text-decoration: underline;\n }\n }\n }\n\n &.unhandled-link {\n color: lighten($ui-highlight-color, 8%);\n }\n }\n}\n\n.status__content.status__content--collapsed {\n max-height: 20px * 15; // 15 lines is roughly above 500 characters\n}\n\n.status__content__read-more-button {\n display: block;\n font-size: 15px;\n line-height: 20px;\n color: lighten($ui-highlight-color, 8%);\n border: 0;\n background: transparent;\n padding: 0;\n padding-top: 8px;\n text-decoration: none;\n\n &:hover,\n &:active {\n text-decoration: underline;\n }\n}\n\n.status__content__spoiler-link {\n display: inline-block;\n border-radius: 2px;\n background: transparent;\n border: 0;\n color: $inverted-text-color;\n font-weight: 700;\n font-size: 11px;\n padding: 0 6px;\n text-transform: uppercase;\n line-height: 20px;\n cursor: pointer;\n vertical-align: middle;\n}\n\n.status__wrapper--filtered {\n color: $dark-text-color;\n border: 0;\n font-size: inherit;\n text-align: center;\n line-height: inherit;\n margin: 0;\n padding: 15px;\n box-sizing: border-box;\n width: 100%;\n clear: both;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n}\n\n.status__prepend-icon-wrapper {\n left: -26px;\n position: absolute;\n}\n\n.focusable {\n &:focus {\n outline: 0;\n background: lighten($ui-base-color, 4%);\n\n .status.status-direct {\n background: lighten($ui-base-color, 12%);\n\n &.muted {\n background: transparent;\n }\n }\n\n .detailed-status,\n .detailed-status__action-bar {\n background: lighten($ui-base-color, 8%);\n }\n }\n}\n\n.status {\n padding: 8px 10px;\n padding-left: 68px;\n position: relative;\n min-height: 54px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n\n @supports (-ms-overflow-style: -ms-autohiding-scrollbar) {\n // Add margin to avoid Edge auto-hiding scrollbar appearing over content.\n // On Edge 16 this is 16px and Edge <=15 it's 12px, so aim for 16px.\n padding-right: 26px; // 10px + 16px\n }\n\n @keyframes fade {\n 0% { opacity: 0; }\n 100% { opacity: 1; }\n }\n\n opacity: 1;\n animation: fade 150ms linear;\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n }\n\n &.status-direct:not(.read) {\n background: lighten($ui-base-color, 8%);\n border-bottom-color: lighten($ui-base-color, 12%);\n }\n\n &.light {\n .status__relative-time {\n color: $light-text-color;\n }\n\n .status__display-name {\n color: $inverted-text-color;\n }\n\n .display-name {\n color: $light-text-color;\n\n strong {\n color: $inverted-text-color;\n }\n }\n\n .status__content {\n color: $inverted-text-color;\n\n a {\n color: $highlight-text-color;\n }\n\n a.status__content__spoiler-link {\n color: $primary-text-color;\n background: $ui-primary-color;\n\n &:hover {\n background: lighten($ui-primary-color, 8%);\n }\n }\n }\n }\n}\n\n.notification-favourite {\n .status.status-direct {\n background: transparent;\n\n .icon-button.disabled {\n color: lighten($action-button-color, 13%);\n }\n }\n}\n\n.status__relative-time,\n.notification__relative_time {\n color: $dark-text-color;\n float: right;\n font-size: 14px;\n}\n\n.status__display-name {\n color: $dark-text-color;\n}\n\n.status__info .status__display-name {\n display: block;\n max-width: 100%;\n padding-right: 25px;\n}\n\n.status__info {\n font-size: 15px;\n}\n\n.status-check-box {\n border-bottom: 1px solid $ui-secondary-color;\n display: flex;\n\n .status-check-box__status {\n margin: 10px 0 10px 10px;\n flex: 1;\n overflow: hidden;\n\n .media-gallery {\n max-width: 250px;\n }\n\n .status__content {\n padding: 0;\n white-space: normal;\n }\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n max-width: 250px;\n }\n\n .media-gallery__item-thumbnail {\n cursor: default;\n }\n }\n}\n\n.status-check-box-toggle {\n align-items: center;\n display: flex;\n flex: 0 0 auto;\n justify-content: center;\n padding: 10px;\n}\n\n.status__prepend {\n margin-left: 68px;\n color: $dark-text-color;\n padding: 8px 0;\n padding-bottom: 2px;\n font-size: 14px;\n position: relative;\n\n .status__display-name strong {\n color: $dark-text-color;\n }\n\n > span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.status__action-bar {\n align-items: center;\n display: flex;\n margin-top: 8px;\n\n &__counter {\n display: inline-flex;\n margin-right: 11px;\n align-items: center;\n\n .status__action-bar-button {\n margin-right: 4px;\n }\n\n &__label {\n display: inline-block;\n width: 14px;\n font-size: 12px;\n font-weight: 500;\n color: $action-button-color;\n }\n }\n}\n\n.status__action-bar-button {\n margin-right: 18px;\n}\n\n.status__action-bar-dropdown {\n height: 23.15px;\n width: 23.15px;\n}\n\n.detailed-status__action-bar-dropdown {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n}\n\n.detailed-status {\n background: lighten($ui-base-color, 4%);\n padding: 14px 10px;\n\n &--flex {\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n align-items: flex-start;\n\n .status__content,\n .detailed-status__meta {\n flex: 100%;\n }\n }\n\n .status__content {\n font-size: 19px;\n line-height: 24px;\n\n .emojione {\n width: 24px;\n height: 24px;\n margin: -1px 0 0;\n }\n\n .status__content__spoiler-link {\n line-height: 24px;\n margin: -1px 0 0;\n }\n }\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n }\n}\n\n.detailed-status__meta {\n margin-top: 15px;\n color: $dark-text-color;\n font-size: 14px;\n line-height: 18px;\n}\n\n.detailed-status__action-bar {\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: row;\n padding: 10px 0;\n}\n\n.detailed-status__link {\n color: inherit;\n text-decoration: none;\n}\n\n.detailed-status__favorites,\n.detailed-status__reblogs {\n display: inline-block;\n font-weight: 500;\n font-size: 12px;\n margin-left: 6px;\n}\n\n.reply-indicator__content {\n color: $inverted-text-color;\n font-size: 14px;\n\n a {\n color: $lighter-text-color;\n }\n}\n\n.domain {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n .domain__domain-name {\n flex: 1 1 auto;\n display: block;\n color: $primary-text-color;\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n }\n}\n\n.domain__wrapper {\n display: flex;\n}\n\n.domain_buttons {\n height: 18px;\n padding: 10px;\n white-space: nowrap;\n}\n\n.account {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &.compact {\n padding: 0;\n border-bottom: 0;\n\n .account__avatar-wrapper {\n margin-left: 0;\n }\n }\n\n .account__display-name {\n flex: 1 1 auto;\n display: block;\n color: $darker-text-color;\n overflow: hidden;\n text-decoration: none;\n font-size: 14px;\n }\n}\n\n.account__wrapper {\n display: flex;\n}\n\n.account__avatar-wrapper {\n float: left;\n margin-left: 12px;\n margin-right: 12px;\n}\n\n.account__avatar {\n @include avatar-radius;\n position: relative;\n\n &-inline {\n display: inline-block;\n vertical-align: middle;\n margin-right: 5px;\n }\n\n &-composite {\n @include avatar-radius;\n border-radius: 50%;\n overflow: hidden;\n position: relative;\n\n & > div {\n float: left;\n position: relative;\n box-sizing: border-box;\n }\n\n &__label {\n display: block;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n color: $primary-text-color;\n text-shadow: 1px 1px 2px $base-shadow-color;\n font-weight: 700;\n font-size: 15px;\n }\n }\n}\n\na .account__avatar {\n cursor: pointer;\n}\n\n.account__avatar-overlay {\n @include avatar-size(48px);\n\n &-base {\n @include avatar-radius;\n @include avatar-size(36px);\n }\n\n &-overlay {\n @include avatar-radius;\n @include avatar-size(24px);\n\n position: absolute;\n bottom: 0;\n right: 0;\n z-index: 1;\n }\n}\n\n.account__relationship {\n height: 18px;\n padding: 10px;\n white-space: nowrap;\n}\n\n.account__disclaimer {\n padding: 10px;\n border-top: 1px solid lighten($ui-base-color, 8%);\n color: $dark-text-color;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n font-weight: 500;\n color: inherit;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n}\n\n.account__action-bar {\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n line-height: 36px;\n overflow: hidden;\n flex: 0 0 auto;\n display: flex;\n}\n\n.account__action-bar-dropdown {\n padding: 10px;\n\n .icon-button {\n vertical-align: middle;\n }\n\n .dropdown--active {\n .dropdown__content.dropdown__right {\n left: 6px;\n right: initial;\n }\n\n &::after {\n bottom: initial;\n margin-left: 11px;\n margin-top: -7px;\n right: initial;\n }\n }\n}\n\n.account__action-bar-links {\n display: flex;\n flex: 1 1 auto;\n line-height: 18px;\n text-align: center;\n}\n\n.account__action-bar__tab {\n text-decoration: none;\n overflow: hidden;\n flex: 0 1 100%;\n border-right: 1px solid lighten($ui-base-color, 8%);\n padding: 10px 0;\n border-bottom: 4px solid transparent;\n\n &.active {\n border-bottom: 4px solid $ui-highlight-color;\n }\n\n & > span {\n display: block;\n text-transform: uppercase;\n font-size: 11px;\n color: $darker-text-color;\n }\n\n strong {\n display: block;\n font-size: 15px;\n font-weight: 500;\n color: $primary-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n}\n\n.account-authorize {\n padding: 14px 10px;\n\n .detailed-status__display-name {\n display: block;\n margin-bottom: 15px;\n overflow: hidden;\n }\n}\n\n.account-authorize__avatar {\n float: left;\n margin-right: 10px;\n}\n\n.status__display-name,\n.status__relative-time,\n.detailed-status__display-name,\n.detailed-status__datetime,\n.detailed-status__application,\n.account__display-name {\n text-decoration: none;\n}\n\n.status__display-name,\n.account__display-name {\n strong {\n color: $primary-text-color;\n }\n}\n\n.muted {\n .emojione {\n opacity: 0.5;\n }\n}\n\n.status__display-name,\n.reply-indicator__display-name,\n.detailed-status__display-name,\na.account__display-name {\n &:hover strong {\n text-decoration: underline;\n }\n}\n\n.account__display-name strong {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.detailed-status__application,\n.detailed-status__datetime {\n color: inherit;\n}\n\n.detailed-status .button.logo-button {\n margin-bottom: 15px;\n}\n\n.detailed-status__display-name {\n color: $secondary-text-color;\n display: block;\n line-height: 24px;\n margin-bottom: 15px;\n overflow: hidden;\n\n strong,\n span {\n display: block;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n strong {\n font-size: 16px;\n color: $primary-text-color;\n }\n}\n\n.detailed-status__display-avatar {\n float: left;\n margin-right: 10px;\n}\n\n.status__avatar {\n height: 48px;\n left: 10px;\n position: absolute;\n top: 10px;\n width: 48px;\n}\n\n.status__expand {\n width: 68px;\n position: absolute;\n left: 0;\n top: 0;\n height: 100%;\n cursor: pointer;\n}\n\n.muted {\n .status__content,\n .status__content p,\n .status__content a {\n color: $dark-text-color;\n }\n\n .status__display-name strong {\n color: $dark-text-color;\n }\n\n .status__avatar {\n opacity: 0.5;\n }\n\n a.status__content__spoiler-link {\n background: $ui-base-lighter-color;\n color: $inverted-text-color;\n\n &:hover {\n background: lighten($ui-base-lighter-color, 7%);\n text-decoration: none;\n }\n }\n}\n\n.notification__message {\n margin: 0 10px 0 68px;\n padding: 8px 0 0;\n cursor: default;\n color: $darker-text-color;\n font-size: 15px;\n line-height: 22px;\n position: relative;\n\n .fa {\n color: $highlight-text-color;\n }\n\n > span {\n display: inline;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.notification__favourite-icon-wrapper {\n left: -26px;\n position: absolute;\n\n .star-icon {\n color: $gold-star;\n }\n}\n\n.star-icon.active {\n color: $gold-star;\n}\n\n.bookmark-icon.active {\n color: $red-bookmark;\n}\n\n.no-reduce-motion .icon-button.star-icon {\n &.activate {\n & > .fa-star {\n animation: spring-rotate-in 1s linear;\n }\n }\n\n &.deactivate {\n & > .fa-star {\n animation: spring-rotate-out 1s linear;\n }\n }\n}\n\n.notification__display-name {\n color: inherit;\n font-weight: 500;\n text-decoration: none;\n\n &:hover {\n color: $primary-text-color;\n text-decoration: underline;\n }\n}\n\n.notification__relative_time {\n float: right;\n}\n\n.display-name {\n display: block;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.display-name__html {\n font-weight: 500;\n}\n\n.display-name__account {\n font-size: 14px;\n}\n\n.status__relative-time,\n.detailed-status__datetime {\n &:hover {\n text-decoration: underline;\n }\n}\n\n.image-loader {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n\n .image-loader__preview-canvas {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n background: url('~images/void.png') repeat;\n object-fit: contain;\n }\n\n .loading-bar {\n position: relative;\n }\n\n &.image-loader--amorphous .image-loader__preview-canvas {\n display: none;\n }\n}\n\n.zoomable-image {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n img {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n width: auto;\n height: auto;\n object-fit: contain;\n }\n}\n\n.navigation-bar {\n padding: 10px;\n display: flex;\n align-items: center;\n flex-shrink: 0;\n cursor: default;\n color: $darker-text-color;\n\n strong {\n color: $secondary-text-color;\n }\n\n a {\n color: inherit;\n }\n\n .permalink {\n text-decoration: none;\n }\n\n .navigation-bar__actions {\n position: relative;\n\n .icon-button.close {\n position: absolute;\n pointer-events: none;\n transform: scale(0, 1) translate(-100%, 0);\n opacity: 0;\n }\n\n .compose__action-bar .icon-button {\n pointer-events: auto;\n transform: scale(1, 1) translate(0, 0);\n opacity: 1;\n }\n }\n}\n\n.navigation-bar__profile {\n flex: 1 1 auto;\n margin-left: 8px;\n line-height: 20px;\n margin-top: -1px;\n overflow: hidden;\n}\n\n.navigation-bar__profile-account {\n display: block;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.navigation-bar__profile-edit {\n color: inherit;\n text-decoration: none;\n}\n\n.dropdown {\n display: inline-block;\n}\n\n.dropdown__content {\n display: none;\n position: absolute;\n}\n\n.dropdown-menu__separator {\n border-bottom: 1px solid darken($ui-secondary-color, 8%);\n margin: 5px 7px 6px;\n height: 0;\n}\n\n.dropdown-menu {\n background: $ui-secondary-color;\n padding: 4px 0;\n border-radius: 4px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n z-index: 9999;\n\n ul {\n list-style: none;\n }\n\n &.left {\n transform-origin: 100% 50%;\n }\n\n &.top {\n transform-origin: 50% 100%;\n }\n\n &.bottom {\n transform-origin: 50% 0;\n }\n\n &.right {\n transform-origin: 0 50%;\n }\n}\n\n.dropdown-menu__arrow {\n position: absolute;\n width: 0;\n height: 0;\n border: 0 solid transparent;\n\n &.left {\n right: -5px;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: $ui-secondary-color;\n }\n\n &.top {\n bottom: -5px;\n margin-left: -7px;\n border-width: 5px 7px 0;\n border-top-color: $ui-secondary-color;\n }\n\n &.bottom {\n top: -5px;\n margin-left: -7px;\n border-width: 0 7px 5px;\n border-bottom-color: $ui-secondary-color;\n }\n\n &.right {\n left: -5px;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: $ui-secondary-color;\n }\n}\n\n.dropdown-menu__item {\n a {\n font-size: 13px;\n line-height: 18px;\n display: block;\n padding: 4px 14px;\n box-sizing: border-box;\n text-decoration: none;\n background: $ui-secondary-color;\n color: $inverted-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:focus,\n &:hover,\n &:active {\n background: $ui-highlight-color;\n color: $secondary-text-color;\n outline: 0;\n }\n }\n}\n\n.dropdown--active .dropdown__content {\n display: block;\n line-height: 18px;\n max-width: 311px;\n right: 0;\n text-align: left;\n z-index: 9999;\n\n & > ul {\n list-style: none;\n background: $ui-secondary-color;\n padding: 4px 0;\n border-radius: 4px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.4);\n min-width: 140px;\n position: relative;\n }\n\n &.dropdown__right {\n right: 0;\n }\n\n &.dropdown__left {\n & > ul {\n left: -98px;\n }\n }\n\n & > ul > li > a {\n font-size: 13px;\n line-height: 18px;\n display: block;\n padding: 4px 14px;\n box-sizing: border-box;\n text-decoration: none;\n background: $ui-secondary-color;\n color: $inverted-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:focus {\n outline: 0;\n }\n\n &:hover {\n background: $ui-highlight-color;\n color: $secondary-text-color;\n }\n }\n}\n\n.dropdown__icon {\n vertical-align: middle;\n}\n\n.columns-area {\n display: flex;\n flex: 1 1 auto;\n flex-direction: row;\n justify-content: flex-start;\n overflow-x: auto;\n position: relative;\n\n &.unscrollable {\n overflow-x: hidden;\n }\n\n &__panels {\n display: flex;\n justify-content: center;\n width: 100%;\n height: 100%;\n min-height: 100vh;\n\n &__pane {\n height: 100%;\n overflow: hidden;\n pointer-events: none;\n display: flex;\n justify-content: flex-end;\n min-width: 285px;\n\n &--start {\n justify-content: flex-start;\n }\n\n &__inner {\n position: fixed;\n width: 285px;\n pointer-events: auto;\n height: 100%;\n }\n }\n\n &__main {\n box-sizing: border-box;\n width: 100%;\n max-width: 600px;\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding: 0 10px;\n }\n }\n }\n}\n\n.tabs-bar__wrapper {\n background: darken($ui-base-color, 8%);\n position: sticky;\n top: 0;\n z-index: 2;\n padding-top: 0;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding-top: 10px;\n }\n\n .tabs-bar {\n margin-bottom: 0;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n margin-bottom: 10px;\n }\n }\n}\n\n.react-swipeable-view-container {\n &,\n .columns-area,\n .drawer,\n .column {\n height: 100%;\n }\n}\n\n.react-swipeable-view-container > * {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n}\n\n.column {\n width: 350px;\n position: relative;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n\n > .scrollable {\n background: $ui-base-color;\n border-bottom-left-radius: 2px;\n border-bottom-right-radius: 2px;\n }\n}\n\n.ui {\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n}\n\n.drawer {\n width: 330px;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n overflow-y: hidden;\n}\n\n.drawer__tab {\n display: block;\n flex: 1 1 auto;\n padding: 15px 5px 13px;\n color: $darker-text-color;\n text-decoration: none;\n text-align: center;\n font-size: 16px;\n border-bottom: 2px solid transparent;\n}\n\n.column,\n.drawer {\n flex: 1 1 auto;\n overflow: hidden;\n}\n\n@media screen and (min-width: 631px) {\n .columns-area {\n padding: 0;\n }\n\n .column,\n .drawer {\n flex: 0 0 auto;\n padding: 10px;\n padding-left: 5px;\n padding-right: 5px;\n\n &:first-child {\n padding-left: 10px;\n }\n\n &:last-child {\n padding-right: 10px;\n }\n }\n\n .columns-area > div {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n }\n }\n}\n\n.tabs-bar {\n box-sizing: border-box;\n display: flex;\n background: lighten($ui-base-color, 8%);\n flex: 0 0 auto;\n overflow-y: auto;\n}\n\n.tabs-bar__link {\n display: block;\n flex: 1 1 auto;\n padding: 15px 10px;\n padding-bottom: 13px;\n color: $primary-text-color;\n text-decoration: none;\n text-align: center;\n font-size: 14px;\n font-weight: 500;\n border-bottom: 2px solid lighten($ui-base-color, 8%);\n transition: all 50ms linear;\n transition-property: border-bottom, background, color;\n\n .fa {\n font-weight: 400;\n font-size: 16px;\n }\n\n &:hover,\n &:focus,\n &:active {\n @media screen and (min-width: 631px) {\n background: lighten($ui-base-color, 14%);\n border-bottom-color: lighten($ui-base-color, 14%);\n }\n }\n\n &.active {\n border-bottom: 2px solid $highlight-text-color;\n color: $highlight-text-color;\n }\n\n span {\n margin-left: 5px;\n display: none;\n }\n}\n\n@media screen and (min-width: 600px) {\n .tabs-bar__link {\n span {\n display: inline;\n }\n }\n}\n\n.columns-area--mobile {\n flex-direction: column;\n width: 100%;\n height: 100%;\n margin: 0 auto;\n\n .column,\n .drawer {\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .directory__list {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: block;\n }\n }\n\n .directory__card {\n margin-bottom: 0;\n }\n\n .filter-form {\n display: flex;\n }\n\n .autosuggest-textarea__textarea {\n font-size: 16px;\n }\n\n .search__input {\n line-height: 18px;\n font-size: 16px;\n padding: 15px;\n padding-right: 30px;\n }\n\n .search__icon .fa {\n top: 15px;\n }\n\n .scrollable {\n overflow: visible;\n\n @supports(display: grid) {\n contain: content;\n }\n }\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding: 10px 0;\n padding-top: 0;\n }\n\n @media screen and (min-width: 630px) {\n .detailed-status {\n padding: 15px;\n\n .media-gallery,\n .video-player,\n .audio-player {\n margin-top: 15px;\n }\n }\n\n .account__header__bar {\n padding: 5px 10px;\n }\n\n .navigation-bar,\n .compose-form {\n padding: 15px;\n }\n\n .compose-form .compose-form__publish .compose-form__publish-button-wrapper {\n padding-top: 15px;\n }\n\n .status {\n padding: 15px 15px 15px (48px + 15px * 2);\n min-height: 48px + 2px;\n\n &__avatar {\n left: 15px;\n top: 17px;\n }\n\n &__content {\n padding-top: 5px;\n }\n\n &__prepend {\n margin-left: 48px + 15px * 2;\n padding-top: 15px;\n }\n\n &__prepend-icon-wrapper {\n left: -32px;\n }\n\n .media-gallery,\n &__action-bar,\n .video-player,\n .audio-player {\n margin-top: 10px;\n }\n }\n\n .account {\n padding: 15px 10px;\n\n &__header__bio {\n margin: 0 -10px;\n }\n }\n\n .notification {\n &__message {\n margin-left: 48px + 15px * 2;\n padding-top: 15px;\n }\n\n &__favourite-icon-wrapper {\n left: -32px;\n }\n\n .status {\n padding-top: 8px;\n }\n\n .account {\n padding-top: 8px;\n }\n\n .account__avatar-wrapper {\n margin-left: 17px;\n margin-right: 15px;\n }\n }\n }\n}\n\n.floating-action-button {\n position: fixed;\n display: flex;\n justify-content: center;\n align-items: center;\n width: 3.9375rem;\n height: 3.9375rem;\n bottom: 1.3125rem;\n right: 1.3125rem;\n background: darken($ui-highlight-color, 3%);\n color: $white;\n border-radius: 50%;\n font-size: 21px;\n line-height: 21px;\n text-decoration: none;\n box-shadow: 2px 3px 9px rgba($base-shadow-color, 0.4);\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-highlight-color, 7%);\n }\n}\n\n@media screen and (min-width: $no-gap-breakpoint) {\n .tabs-bar {\n width: 100%;\n }\n\n .react-swipeable-view-container .columns-area--mobile {\n height: calc(100% - 10px) !important;\n }\n\n .getting-started__wrapper,\n .getting-started__trends,\n .search {\n margin-bottom: 10px;\n }\n\n .getting-started__panel {\n margin: 10px 0;\n }\n\n .column,\n .drawer {\n min-width: 330px;\n }\n}\n\n@media screen and (max-width: 600px + (285px * 1) + (10px * 1)) {\n .columns-area__panels__pane--compositional {\n display: none;\n }\n}\n\n@media screen and (min-width: 600px + (285px * 1) + (10px * 1)) {\n .floating-action-button,\n .tabs-bar__link.optional {\n display: none;\n }\n\n .search-page .search {\n display: none;\n }\n}\n\n@media screen and (max-width: 600px + (285px * 2) + (10px * 2)) {\n .columns-area__panels__pane--navigational {\n display: none;\n }\n}\n\n@media screen and (min-width: 600px + (285px * 2) + (10px * 2)) {\n .tabs-bar {\n display: none;\n }\n}\n\n.icon-with-badge {\n position: relative;\n\n &__badge {\n position: absolute;\n left: 9px;\n top: -13px;\n background: $ui-highlight-color;\n border: 2px solid lighten($ui-base-color, 8%);\n padding: 1px 6px;\n border-radius: 6px;\n font-size: 10px;\n font-weight: 500;\n line-height: 14px;\n color: $primary-text-color;\n }\n}\n\n.column-link--transparent .icon-with-badge__badge {\n border-color: darken($ui-base-color, 8%);\n}\n\n.compose-panel {\n width: 285px;\n margin-top: 10px;\n display: flex;\n flex-direction: column;\n height: calc(100% - 10px);\n overflow-y: hidden;\n\n .navigation-bar {\n padding-top: 20px;\n padding-bottom: 20px;\n flex: 0 1 48px;\n min-height: 20px;\n }\n\n .flex-spacer {\n background: transparent;\n }\n\n .compose-form {\n flex: 1;\n overflow-y: hidden;\n display: flex;\n flex-direction: column;\n min-height: 310px;\n padding-bottom: 71px;\n margin-bottom: -71px;\n }\n\n .compose-form__autosuggest-wrapper {\n overflow-y: auto;\n background-color: $white;\n border-radius: 4px 4px 0 0;\n flex: 0 1 auto;\n }\n\n .autosuggest-textarea__textarea {\n overflow-y: hidden;\n }\n\n .compose-form__upload-thumbnail {\n height: 80px;\n }\n}\n\n.navigation-panel {\n margin-top: 10px;\n margin-bottom: 10px;\n height: calc(100% - 20px);\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n\n & > a {\n flex: 0 0 auto;\n }\n\n hr {\n flex: 0 0 auto;\n border: 0;\n background: transparent;\n border-top: 1px solid lighten($ui-base-color, 4%);\n margin: 10px 0;\n }\n\n .flex-spacer {\n background: transparent;\n }\n}\n\n.drawer__pager {\n box-sizing: border-box;\n padding: 0;\n flex-grow: 1;\n position: relative;\n overflow: hidden;\n display: flex;\n}\n\n.drawer__inner {\n position: absolute;\n top: 0;\n left: 0;\n background: lighten($ui-base-color, 13%);\n box-sizing: border-box;\n padding: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n overflow-y: auto;\n width: 100%;\n height: 100%;\n border-radius: 2px;\n\n &.darker {\n background: $ui-base-color;\n }\n}\n\n.drawer__inner__mastodon {\n background: lighten($ui-base-color, 13%) url('data:image/svg+xml;utf8,') no-repeat bottom / 100% auto;\n flex: 1;\n min-height: 47px;\n display: none;\n\n > img {\n display: block;\n object-fit: contain;\n object-position: bottom left;\n width: 85%;\n height: 100%;\n pointer-events: none;\n user-drag: none;\n user-select: none;\n }\n\n @media screen and (min-height: 640px) {\n display: block;\n }\n}\n\n.pseudo-drawer {\n background: lighten($ui-base-color, 13%);\n font-size: 13px;\n text-align: left;\n}\n\n.drawer__header {\n flex: 0 0 auto;\n font-size: 16px;\n background: lighten($ui-base-color, 8%);\n margin-bottom: 10px;\n display: flex;\n flex-direction: row;\n border-radius: 2px;\n\n a {\n transition: background 100ms ease-in;\n\n &:hover {\n background: lighten($ui-base-color, 3%);\n transition: background 200ms ease-out;\n }\n }\n}\n\n.scrollable {\n overflow-y: scroll;\n overflow-x: hidden;\n flex: 1 1 auto;\n -webkit-overflow-scrolling: touch;\n\n &.optionally-scrollable {\n overflow-y: auto;\n }\n\n @supports(display: grid) { // hack to fix Chrome <57\n contain: strict;\n }\n\n &--flex {\n display: flex;\n flex-direction: column;\n }\n\n &__append {\n flex: 1 1 auto;\n position: relative;\n min-height: 120px;\n }\n}\n\n.scrollable.fullscreen {\n @supports(display: grid) { // hack to fix Chrome <57\n contain: none;\n }\n}\n\n.column-back-button {\n box-sizing: border-box;\n width: 100%;\n background: lighten($ui-base-color, 4%);\n color: $highlight-text-color;\n cursor: pointer;\n flex: 0 0 auto;\n font-size: 16px;\n line-height: inherit;\n border: 0;\n text-align: unset;\n padding: 15px;\n margin: 0;\n z-index: 3;\n outline: 0;\n\n &:hover {\n text-decoration: underline;\n }\n}\n\n.column-header__back-button {\n background: lighten($ui-base-color, 4%);\n border: 0;\n font-family: inherit;\n color: $highlight-text-color;\n cursor: pointer;\n white-space: nowrap;\n font-size: 16px;\n padding: 0 5px 0 0;\n z-index: 3;\n\n &:hover {\n text-decoration: underline;\n }\n\n &:last-child {\n padding: 0 15px 0 0;\n }\n}\n\n.column-back-button__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.column-back-button--slim {\n position: relative;\n}\n\n.column-back-button--slim-button {\n cursor: pointer;\n flex: 0 0 auto;\n font-size: 16px;\n padding: 15px;\n position: absolute;\n right: 0;\n top: -48px;\n}\n\n.react-toggle {\n display: inline-block;\n position: relative;\n cursor: pointer;\n background-color: transparent;\n border: 0;\n padding: 0;\n user-select: none;\n -webkit-tap-highlight-color: rgba($base-overlay-background, 0);\n -webkit-tap-highlight-color: transparent;\n}\n\n.react-toggle-screenreader-only {\n border: 0;\n clip: rect(0 0 0 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n}\n\n.react-toggle--disabled {\n cursor: not-allowed;\n opacity: 0.5;\n transition: opacity 0.25s;\n}\n\n.react-toggle-track {\n width: 50px;\n height: 24px;\n padding: 0;\n border-radius: 30px;\n background-color: $ui-base-color;\n transition: background-color 0.2s ease;\n}\n\n.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track {\n background-color: darken($ui-base-color, 10%);\n}\n\n.react-toggle--checked .react-toggle-track {\n background-color: $ui-highlight-color;\n}\n\n.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track {\n background-color: lighten($ui-highlight-color, 10%);\n}\n\n.react-toggle-track-check {\n position: absolute;\n width: 14px;\n height: 10px;\n top: 0;\n bottom: 0;\n margin-top: auto;\n margin-bottom: auto;\n line-height: 0;\n left: 8px;\n opacity: 0;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle--checked .react-toggle-track-check {\n opacity: 1;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle-track-x {\n position: absolute;\n width: 10px;\n height: 10px;\n top: 0;\n bottom: 0;\n margin-top: auto;\n margin-bottom: auto;\n line-height: 0;\n right: 10px;\n opacity: 1;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle--checked .react-toggle-track-x {\n opacity: 0;\n}\n\n.react-toggle-thumb {\n position: absolute;\n top: 1px;\n left: 1px;\n width: 22px;\n height: 22px;\n border: 1px solid $ui-base-color;\n border-radius: 50%;\n background-color: darken($simple-background-color, 2%);\n box-sizing: border-box;\n transition: all 0.25s ease;\n transition-property: border-color, left;\n}\n\n.react-toggle--checked .react-toggle-thumb {\n left: 27px;\n border-color: $ui-highlight-color;\n}\n\n.column-link {\n background: lighten($ui-base-color, 8%);\n color: $primary-text-color;\n display: block;\n font-size: 16px;\n padding: 15px;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 11%);\n }\n\n &:focus {\n outline: 0;\n }\n\n &--transparent {\n background: transparent;\n color: $ui-secondary-color;\n\n &:hover,\n &:focus,\n &:active {\n background: transparent;\n color: $primary-text-color;\n }\n\n &.active {\n color: $ui-highlight-color;\n }\n }\n}\n\n.column-link__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.column-link__badge {\n display: inline-block;\n border-radius: 4px;\n font-size: 12px;\n line-height: 19px;\n font-weight: 500;\n background: $ui-base-color;\n padding: 4px 8px;\n margin: -6px 10px;\n}\n\n.column-subheading {\n background: $ui-base-color;\n color: $dark-text-color;\n padding: 8px 20px;\n font-size: 12px;\n font-weight: 500;\n text-transform: uppercase;\n cursor: default;\n}\n\n.getting-started__wrapper,\n.getting-started,\n.flex-spacer {\n background: $ui-base-color;\n}\n\n.flex-spacer {\n flex: 1 1 auto;\n}\n\n.getting-started {\n color: $dark-text-color;\n overflow: auto;\n border-bottom-left-radius: 2px;\n border-bottom-right-radius: 2px;\n\n &__wrapper,\n &__panel,\n &__footer {\n height: min-content;\n }\n\n &__panel,\n &__footer\n {\n padding: 10px;\n padding-top: 20px;\n flex-grow: 0;\n\n ul {\n margin-bottom: 10px;\n }\n\n ul li {\n display: inline;\n }\n\n p {\n font-size: 13px;\n\n a {\n color: $dark-text-color;\n text-decoration: underline;\n }\n }\n\n a {\n text-decoration: none;\n color: $darker-text-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n }\n\n &__wrapper,\n &__footer\n {\n color: $dark-text-color;\n }\n\n &__trends {\n flex: 0 1 auto;\n opacity: 1;\n animation: fade 150ms linear;\n margin-top: 10px;\n\n h4 {\n font-size: 12px;\n text-transform: uppercase;\n color: $darker-text-color;\n padding: 10px;\n font-weight: 500;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n @media screen and (max-height: 810px) {\n .trends__item:nth-child(3) {\n display: none;\n }\n }\n\n @media screen and (max-height: 720px) {\n .trends__item:nth-child(2) {\n display: none;\n }\n }\n\n @media screen and (max-height: 670px) {\n display: none;\n }\n\n .trends__item {\n border-bottom: 0;\n padding: 10px;\n\n &__current {\n color: $darker-text-color;\n }\n }\n }\n}\n\n.keyboard-shortcuts {\n padding: 8px 0 0;\n overflow: hidden;\n\n thead {\n position: absolute;\n left: -9999px;\n }\n\n td {\n padding: 0 10px 8px;\n }\n\n kbd {\n display: inline-block;\n padding: 3px 5px;\n background-color: lighten($ui-base-color, 8%);\n border: 1px solid darken($ui-base-color, 4%);\n }\n}\n\n.setting-text {\n display: block;\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n color: $inverted-text-color;\n background: $simple-background-color;\n padding: 10px;\n font-family: inherit;\n font-size: 14px;\n resize: vertical;\n border: 0;\n outline: 0;\n border-radius: 4px;\n\n &:focus {\n outline: 0;\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n}\n\n.no-reduce-motion button.icon-button i.fa-retweet {\n background-position: 0 0;\n height: 19px;\n transition: background-position 0.9s steps(10);\n transition-duration: 0s;\n vertical-align: middle;\n width: 22px;\n\n &::before {\n display: none !important;\n }\n\n}\n\n.no-reduce-motion button.icon-button.active i.fa-retweet {\n transition-duration: 0.9s;\n background-position: 0 100%;\n}\n\n.reduce-motion button.icon-button i.fa-retweet {\n color: $action-button-color;\n transition: color 100ms ease-in;\n}\n\n.reduce-motion button.icon-button.active i.fa-retweet {\n color: $highlight-text-color;\n}\n\n.status-card {\n display: flex;\n font-size: 14px;\n border: 1px solid lighten($ui-base-color, 8%);\n border-radius: 4px;\n color: $dark-text-color;\n margin-top: 14px;\n text-decoration: none;\n overflow: hidden;\n\n &__actions {\n bottom: 0;\n left: 0;\n position: absolute;\n right: 0;\n top: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n\n & > div {\n background: rgba($base-shadow-color, 0.6);\n border-radius: 8px;\n padding: 12px 9px;\n flex: 0 0 auto;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n button,\n a {\n display: inline;\n color: $secondary-text-color;\n background: transparent;\n border: 0;\n padding: 0 8px;\n text-decoration: none;\n font-size: 18px;\n line-height: 18px;\n\n &:hover,\n &:active,\n &:focus {\n color: $primary-text-color;\n }\n }\n\n a {\n font-size: 19px;\n position: relative;\n bottom: -1px;\n }\n }\n}\n\na.status-card {\n cursor: pointer;\n\n &:hover {\n background: lighten($ui-base-color, 8%);\n }\n}\n\n.status-card-photo {\n cursor: zoom-in;\n display: block;\n text-decoration: none;\n width: 100%;\n height: auto;\n margin: 0;\n}\n\n.status-card-video {\n iframe {\n width: 100%;\n height: 100%;\n }\n}\n\n.status-card__title {\n display: block;\n font-weight: 500;\n margin-bottom: 5px;\n color: $darker-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-decoration: none;\n}\n\n.status-card__content {\n flex: 1 1 auto;\n overflow: hidden;\n padding: 14px 14px 14px 8px;\n}\n\n.status-card__description {\n color: $darker-text-color;\n}\n\n.status-card__host {\n display: block;\n margin-top: 5px;\n font-size: 13px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.status-card__image {\n flex: 0 0 100px;\n background: lighten($ui-base-color, 8%);\n position: relative;\n\n & > .fa {\n font-size: 21px;\n position: absolute;\n transform-origin: 50% 50%;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n}\n\n.status-card.horizontal {\n display: block;\n\n .status-card__image {\n width: 100%;\n }\n\n .status-card__image-image {\n border-radius: 4px 4px 0 0;\n }\n\n .status-card__title {\n white-space: inherit;\n }\n}\n\n.status-card.compact {\n border-color: lighten($ui-base-color, 4%);\n\n &.interactive {\n border: 0;\n }\n\n .status-card__content {\n padding: 8px;\n padding-top: 10px;\n }\n\n .status-card__title {\n white-space: nowrap;\n }\n\n .status-card__image {\n flex: 0 0 60px;\n }\n}\n\na.status-card.compact:hover {\n background-color: lighten($ui-base-color, 4%);\n}\n\n.status-card__image-image {\n border-radius: 4px 0 0 4px;\n display: block;\n margin: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n background-size: cover;\n background-position: center center;\n}\n\n.load-more {\n display: block;\n color: $dark-text-color;\n background-color: transparent;\n border: 0;\n font-size: inherit;\n text-align: center;\n line-height: inherit;\n margin: 0;\n padding: 15px;\n box-sizing: border-box;\n width: 100%;\n clear: both;\n text-decoration: none;\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n}\n\n.load-gap {\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n}\n\n.regeneration-indicator {\n text-align: center;\n font-size: 16px;\n font-weight: 500;\n color: $dark-text-color;\n background: $ui-base-color;\n cursor: default;\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 20px;\n\n &__figure {\n &,\n img {\n display: block;\n width: auto;\n height: 160px;\n margin: 0;\n }\n }\n\n &--without-header {\n padding-top: 20px + 48px;\n }\n\n &__label {\n margin-top: 30px;\n\n strong {\n display: block;\n margin-bottom: 10px;\n color: $dark-text-color;\n }\n\n span {\n font-size: 15px;\n font-weight: 400;\n }\n }\n}\n\n.column-header__wrapper {\n position: relative;\n flex: 0 0 auto;\n z-index: 1;\n\n &.active {\n box-shadow: 0 1px 0 rgba($highlight-text-color, 0.3);\n\n &::before {\n display: block;\n content: \"\";\n position: absolute;\n bottom: -13px;\n left: 0;\n right: 0;\n margin: 0 auto;\n width: 60%;\n pointer-events: none;\n height: 28px;\n z-index: 1;\n background: radial-gradient(ellipse, rgba($ui-highlight-color, 0.23) 0%, rgba($ui-highlight-color, 0) 60%);\n }\n }\n\n .announcements {\n z-index: 1;\n position: relative;\n }\n}\n\n.column-header {\n display: flex;\n font-size: 16px;\n background: lighten($ui-base-color, 4%);\n flex: 0 0 auto;\n cursor: pointer;\n position: relative;\n z-index: 2;\n outline: 0;\n overflow: hidden;\n border-top-left-radius: 2px;\n border-top-right-radius: 2px;\n\n & > button {\n margin: 0;\n border: 0;\n padding: 15px 0 15px 15px;\n color: inherit;\n background: transparent;\n font: inherit;\n text-align: left;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n flex: 1;\n }\n\n & > .column-header__back-button {\n color: $highlight-text-color;\n }\n\n &.active {\n .column-header__icon {\n color: $highlight-text-color;\n text-shadow: 0 0 10px rgba($highlight-text-color, 0.4);\n }\n }\n\n &:focus,\n &:active {\n outline: 0;\n }\n}\n\n.column-header__buttons {\n height: 48px;\n display: flex;\n}\n\n.column-header__links {\n margin-bottom: 14px;\n}\n\n.column-header__links .text-btn {\n margin-right: 10px;\n}\n\n.column-header__button {\n background: lighten($ui-base-color, 4%);\n border: 0;\n color: $darker-text-color;\n cursor: pointer;\n font-size: 16px;\n padding: 0 15px;\n\n &:hover {\n color: lighten($darker-text-color, 7%);\n }\n\n &.active {\n color: $primary-text-color;\n background: lighten($ui-base-color, 8%);\n\n &:hover {\n color: $primary-text-color;\n background: lighten($ui-base-color, 8%);\n }\n }\n}\n\n.column-header__collapsible {\n max-height: 70vh;\n overflow: hidden;\n overflow-y: auto;\n color: $darker-text-color;\n transition: max-height 150ms ease-in-out, opacity 300ms linear;\n opacity: 1;\n z-index: 1;\n position: relative;\n\n &.collapsed {\n max-height: 0;\n opacity: 0.5;\n }\n\n &.animating {\n overflow-y: hidden;\n }\n\n hr {\n height: 0;\n background: transparent;\n border: 0;\n border-top: 1px solid lighten($ui-base-color, 12%);\n margin: 10px 0;\n }\n}\n\n.column-header__collapsible-inner {\n background: lighten($ui-base-color, 8%);\n padding: 15px;\n}\n\n.column-header__setting-btn {\n &:hover {\n color: $darker-text-color;\n text-decoration: underline;\n }\n}\n\n.column-header__setting-arrows {\n float: right;\n\n .column-header__setting-btn {\n padding: 0 10px;\n\n &:last-child {\n padding-right: 0;\n }\n }\n}\n\n.text-btn {\n display: inline-block;\n padding: 0;\n font-family: inherit;\n font-size: inherit;\n color: inherit;\n border: 0;\n background: transparent;\n cursor: pointer;\n}\n\n.column-header__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.loading-indicator {\n color: $dark-text-color;\n font-size: 12px;\n font-weight: 400;\n text-transform: uppercase;\n overflow: visible;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n\n span {\n display: block;\n float: left;\n margin-left: 50%;\n transform: translateX(-50%);\n margin: 82px 0 0 50%;\n white-space: nowrap;\n }\n}\n\n.loading-indicator__figure {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 42px;\n height: 42px;\n box-sizing: border-box;\n background-color: transparent;\n border: 0 solid lighten($ui-base-color, 26%);\n border-width: 6px;\n border-radius: 50%;\n}\n\n.no-reduce-motion .loading-indicator span {\n animation: loader-label 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1);\n}\n\n.no-reduce-motion .loading-indicator__figure {\n animation: loader-figure 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1);\n}\n\n@keyframes spring-rotate-in {\n 0% {\n transform: rotate(0deg);\n }\n\n 30% {\n transform: rotate(-484.8deg);\n }\n\n 60% {\n transform: rotate(-316.7deg);\n }\n\n 90% {\n transform: rotate(-375deg);\n }\n\n 100% {\n transform: rotate(-360deg);\n }\n}\n\n@keyframes spring-rotate-out {\n 0% {\n transform: rotate(-360deg);\n }\n\n 30% {\n transform: rotate(124.8deg);\n }\n\n 60% {\n transform: rotate(-43.27deg);\n }\n\n 90% {\n transform: rotate(15deg);\n }\n\n 100% {\n transform: rotate(0deg);\n }\n}\n\n@keyframes loader-figure {\n 0% {\n width: 0;\n height: 0;\n background-color: lighten($ui-base-color, 26%);\n }\n\n 29% {\n background-color: lighten($ui-base-color, 26%);\n }\n\n 30% {\n width: 42px;\n height: 42px;\n background-color: transparent;\n border-width: 21px;\n opacity: 1;\n }\n\n 100% {\n width: 42px;\n height: 42px;\n border-width: 0;\n opacity: 0;\n background-color: transparent;\n }\n}\n\n@keyframes loader-label {\n 0% { opacity: 0.25; }\n 30% { opacity: 1; }\n 100% { opacity: 0.25; }\n}\n\n.video-error-cover {\n align-items: center;\n background: $base-overlay-background;\n color: $primary-text-color;\n cursor: pointer;\n display: flex;\n flex-direction: column;\n height: 100%;\n justify-content: center;\n margin-top: 8px;\n position: relative;\n text-align: center;\n z-index: 100;\n}\n\n.media-spoiler {\n background: $base-overlay-background;\n color: $darker-text-color;\n border: 0;\n padding: 0;\n width: 100%;\n height: 100%;\n border-radius: 4px;\n appearance: none;\n\n &:hover,\n &:active,\n &:focus {\n padding: 0;\n color: lighten($darker-text-color, 8%);\n }\n}\n\n.media-spoiler__warning {\n display: block;\n font-size: 14px;\n}\n\n.media-spoiler__trigger {\n display: block;\n font-size: 11px;\n font-weight: 700;\n}\n\n.spoiler-button {\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n position: absolute;\n z-index: 100;\n\n &--minified {\n display: block;\n left: 4px;\n top: 4px;\n width: auto;\n height: auto;\n }\n\n &--click-thru {\n pointer-events: none;\n }\n\n &--hidden {\n display: none;\n }\n\n &__overlay {\n display: block;\n background: transparent;\n width: 100%;\n height: 100%;\n border: 0;\n\n &__label {\n display: inline-block;\n background: rgba($base-overlay-background, 0.5);\n border-radius: 8px;\n padding: 8px 12px;\n color: $primary-text-color;\n font-weight: 500;\n font-size: 14px;\n }\n\n &:hover,\n &:focus,\n &:active {\n .spoiler-button__overlay__label {\n background: rgba($base-overlay-background, 0.8);\n }\n }\n\n &:disabled {\n .spoiler-button__overlay__label {\n background: rgba($base-overlay-background, 0.5);\n }\n }\n }\n}\n\n.modal-container--preloader {\n background: lighten($ui-base-color, 8%);\n}\n\n.account--panel {\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: row;\n padding: 10px 0;\n}\n\n.account--panel__button,\n.detailed-status__button {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.column-settings__outer {\n background: lighten($ui-base-color, 8%);\n padding: 15px;\n}\n\n.column-settings__section {\n color: $darker-text-color;\n cursor: default;\n display: block;\n font-weight: 500;\n margin-bottom: 10px;\n}\n\n.column-settings__hashtags {\n .column-settings__row {\n margin-bottom: 15px;\n }\n\n .column-select {\n &__control {\n @include search-input;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n &__placeholder {\n color: $dark-text-color;\n padding-left: 2px;\n font-size: 12px;\n }\n\n &__value-container {\n padding-left: 6px;\n }\n\n &__multi-value {\n background: lighten($ui-base-color, 8%);\n\n &__remove {\n cursor: pointer;\n\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 12%);\n color: lighten($darker-text-color, 4%);\n }\n }\n }\n\n &__multi-value__label,\n &__input {\n color: $darker-text-color;\n }\n\n &__clear-indicator,\n &__dropdown-indicator {\n cursor: pointer;\n transition: none;\n color: $dark-text-color;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($dark-text-color, 4%);\n }\n }\n\n &__indicator-separator {\n background-color: lighten($ui-base-color, 8%);\n }\n\n &__menu {\n @include search-popout;\n padding: 0;\n background: $ui-secondary-color;\n }\n\n &__menu-list {\n padding: 6px;\n }\n\n &__option {\n color: $inverted-text-color;\n border-radius: 4px;\n font-size: 14px;\n\n &--is-focused,\n &--is-selected {\n background: darken($ui-secondary-color, 10%);\n }\n }\n }\n}\n\n.column-settings__row {\n .text-btn {\n margin-bottom: 15px;\n }\n}\n\n.relationship-tag {\n color: $primary-text-color;\n margin-bottom: 4px;\n display: block;\n vertical-align: top;\n background-color: $base-overlay-background;\n text-transform: uppercase;\n font-size: 11px;\n font-weight: 500;\n padding: 4px;\n border-radius: 4px;\n opacity: 0.7;\n\n &:hover {\n opacity: 1;\n }\n}\n\n.setting-toggle {\n display: block;\n line-height: 24px;\n}\n\n.setting-toggle__label {\n color: $darker-text-color;\n display: inline-block;\n margin-bottom: 14px;\n margin-left: 8px;\n vertical-align: middle;\n}\n\n.empty-column-indicator,\n.error-column,\n.follow_requests-unlocked_explanation {\n color: $dark-text-color;\n background: $ui-base-color;\n text-align: center;\n padding: 20px;\n font-size: 15px;\n font-weight: 400;\n cursor: default;\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n justify-content: center;\n\n @supports(display: grid) { // hack to fix Chrome <57\n contain: strict;\n }\n\n & > span {\n max-width: 400px;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.follow_requests-unlocked_explanation {\n background: darken($ui-base-color, 4%);\n contain: initial;\n}\n\n.error-column {\n flex-direction: column;\n}\n\n@keyframes heartbeat {\n from {\n transform: scale(1);\n animation-timing-function: ease-out;\n }\n\n 10% {\n transform: scale(0.91);\n animation-timing-function: ease-in;\n }\n\n 17% {\n transform: scale(0.98);\n animation-timing-function: ease-out;\n }\n\n 33% {\n transform: scale(0.87);\n animation-timing-function: ease-in;\n }\n\n 45% {\n transform: scale(1);\n animation-timing-function: ease-out;\n }\n}\n\n.no-reduce-motion .pulse-loading {\n transform-origin: center center;\n animation: heartbeat 1.5s ease-in-out infinite both;\n}\n\n@keyframes shake-bottom {\n 0%,\n 100% {\n transform: rotate(0deg);\n transform-origin: 50% 100%;\n }\n\n 10% {\n transform: rotate(2deg);\n }\n\n 20%,\n 40%,\n 60% {\n transform: rotate(-4deg);\n }\n\n 30%,\n 50%,\n 70% {\n transform: rotate(4deg);\n }\n\n 80% {\n transform: rotate(-2deg);\n }\n\n 90% {\n transform: rotate(2deg);\n }\n}\n\n.no-reduce-motion .shake-bottom {\n transform-origin: 50% 100%;\n animation: shake-bottom 0.8s cubic-bezier(0.455, 0.03, 0.515, 0.955) 2s 2 both;\n}\n\n.emoji-picker-dropdown__menu {\n background: $simple-background-color;\n position: absolute;\n box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n margin-top: 5px;\n z-index: 2;\n\n .emoji-mart-scroll {\n transition: opacity 200ms ease;\n }\n\n &.selecting .emoji-mart-scroll {\n opacity: 0.5;\n }\n}\n\n.emoji-picker-dropdown__modifiers {\n position: absolute;\n top: 60px;\n right: 11px;\n cursor: pointer;\n}\n\n.emoji-picker-dropdown__modifiers__menu {\n position: absolute;\n z-index: 4;\n top: -4px;\n left: -8px;\n background: $simple-background-color;\n border-radius: 4px;\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n overflow: hidden;\n\n button {\n display: block;\n cursor: pointer;\n border: 0;\n padding: 4px 8px;\n background: transparent;\n\n &:hover,\n &:focus,\n &:active {\n background: rgba($ui-secondary-color, 0.4);\n }\n }\n\n .emoji-mart-emoji {\n height: 22px;\n }\n}\n\n.emoji-mart-emoji {\n span {\n background-repeat: no-repeat;\n }\n}\n\n.upload-area {\n align-items: center;\n background: rgba($base-overlay-background, 0.8);\n display: flex;\n height: 100%;\n justify-content: center;\n left: 0;\n opacity: 0;\n position: absolute;\n top: 0;\n visibility: hidden;\n width: 100%;\n z-index: 2000;\n\n * {\n pointer-events: none;\n }\n}\n\n.upload-area__drop {\n width: 320px;\n height: 160px;\n display: flex;\n box-sizing: border-box;\n position: relative;\n padding: 8px;\n}\n\n.upload-area__background {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: -1;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 5px rgba($base-shadow-color, 0.2);\n}\n\n.upload-area__content {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: $secondary-text-color;\n font-size: 18px;\n font-weight: 500;\n border: 2px dashed $ui-base-lighter-color;\n border-radius: 4px;\n}\n\n.upload-progress {\n padding: 10px;\n color: $lighter-text-color;\n overflow: hidden;\n display: flex;\n\n .fa {\n font-size: 34px;\n margin-right: 10px;\n }\n\n span {\n font-size: 12px;\n text-transform: uppercase;\n font-weight: 500;\n display: block;\n }\n}\n\n.upload-progess__message {\n flex: 1 1 auto;\n}\n\n.upload-progress__backdrop {\n width: 100%;\n height: 6px;\n border-radius: 6px;\n background: $ui-base-lighter-color;\n position: relative;\n margin-top: 5px;\n}\n\n.upload-progress__tracker {\n position: absolute;\n left: 0;\n top: 0;\n height: 6px;\n background: $ui-highlight-color;\n border-radius: 6px;\n}\n\n.emoji-button {\n display: block;\n padding: 5px 5px 2px 2px;\n outline: 0;\n cursor: pointer;\n\n &:active,\n &:focus {\n outline: 0 !important;\n }\n\n img {\n filter: grayscale(100%);\n opacity: 0.8;\n display: block;\n margin: 0;\n width: 22px;\n height: 22px;\n }\n\n &:hover,\n &:active,\n &:focus {\n img {\n opacity: 1;\n filter: none;\n }\n }\n}\n\n.dropdown--active .emoji-button img {\n opacity: 1;\n filter: none;\n}\n\n.privacy-dropdown__dropdown {\n position: absolute;\n background: $simple-background-color;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n margin-left: 40px;\n overflow: hidden;\n\n &.top {\n transform-origin: 50% 100%;\n }\n\n &.bottom {\n transform-origin: 50% 0;\n }\n}\n\n.privacy-dropdown__option {\n color: $inverted-text-color;\n padding: 10px;\n cursor: pointer;\n display: flex;\n\n &:hover,\n &.active {\n background: $ui-highlight-color;\n color: $primary-text-color;\n outline: 0;\n\n .privacy-dropdown__option__content {\n color: $primary-text-color;\n\n strong {\n color: $primary-text-color;\n }\n }\n }\n\n &.active:hover {\n background: lighten($ui-highlight-color, 4%);\n }\n}\n\n.privacy-dropdown__option__icon {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 10px;\n}\n\n.privacy-dropdown__option__content {\n flex: 1 1 auto;\n color: $lighter-text-color;\n\n strong {\n font-weight: 500;\n display: block;\n color: $inverted-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n}\n\n.privacy-dropdown.active {\n .privacy-dropdown__value {\n background: $simple-background-color;\n border-radius: 4px 4px 0 0;\n box-shadow: 0 -4px 4px rgba($base-shadow-color, 0.1);\n\n .icon-button {\n transition: none;\n }\n\n &.active {\n background: $ui-highlight-color;\n\n .icon-button {\n color: $primary-text-color;\n }\n }\n }\n\n &.top .privacy-dropdown__value {\n border-radius: 0 0 4px 4px;\n }\n\n .privacy-dropdown__dropdown {\n display: block;\n box-shadow: 2px 4px 6px rgba($base-shadow-color, 0.1);\n }\n}\n\n.search {\n position: relative;\n}\n\n.search__input {\n @include search-input;\n\n display: block;\n padding: 15px;\n padding-right: 30px;\n line-height: 18px;\n font-size: 16px;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n}\n\n.search__icon {\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus {\n outline: 0 !important;\n }\n\n .fa {\n position: absolute;\n top: 16px;\n right: 10px;\n z-index: 2;\n display: inline-block;\n opacity: 0;\n transition: all 100ms linear;\n transition-property: transform, opacity;\n font-size: 18px;\n width: 18px;\n height: 18px;\n color: $secondary-text-color;\n cursor: default;\n pointer-events: none;\n\n &.active {\n pointer-events: auto;\n opacity: 0.3;\n }\n }\n\n .fa-search {\n transform: rotate(90deg);\n\n &.active {\n pointer-events: none;\n transform: rotate(0deg);\n }\n }\n\n .fa-times-circle {\n top: 17px;\n transform: rotate(0deg);\n color: $action-button-color;\n cursor: pointer;\n\n &.active {\n transform: rotate(90deg);\n }\n\n &:hover {\n color: lighten($action-button-color, 7%);\n }\n }\n}\n\n.search-results__header {\n color: $dark-text-color;\n background: lighten($ui-base-color, 2%);\n padding: 15px;\n font-weight: 500;\n font-size: 16px;\n cursor: default;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n}\n\n.search-results__section {\n margin-bottom: 5px;\n\n h5 {\n background: darken($ui-base-color, 4%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n display: flex;\n padding: 15px;\n font-weight: 500;\n font-size: 16px;\n color: $dark-text-color;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n .account:last-child,\n & > div:last-child .status {\n border-bottom: 0;\n }\n}\n\n.search-results__hashtag {\n display: block;\n padding: 10px;\n color: $secondary-text-color;\n text-decoration: none;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($secondary-text-color, 4%);\n text-decoration: underline;\n }\n}\n\n.search-results__info {\n padding: 20px;\n color: $darker-text-color;\n text-align: center;\n}\n\n.modal-root {\n position: relative;\n transition: opacity 0.3s linear;\n will-change: opacity;\n z-index: 9999;\n}\n\n.modal-root__overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba($base-overlay-background, 0.7);\n}\n\n.modal-root__container {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n align-content: space-around;\n z-index: 9999;\n pointer-events: none;\n user-select: none;\n}\n\n.modal-root__modal {\n pointer-events: auto;\n display: flex;\n z-index: 9999;\n}\n\n.video-modal__container {\n max-width: 100vw;\n max-height: 100vh;\n}\n\n.audio-modal__container {\n width: 50vw;\n}\n\n.media-modal {\n width: 100%;\n height: 100%;\n position: relative;\n\n .extended-video-player {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n video {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n }\n }\n}\n\n.media-modal__closer {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n}\n\n.media-modal__navigation {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n transition: opacity 0.3s linear;\n will-change: opacity;\n\n * {\n pointer-events: auto;\n }\n\n &.media-modal__navigation--hidden {\n opacity: 0;\n\n * {\n pointer-events: none;\n }\n }\n}\n\n.media-modal__nav {\n background: rgba($base-overlay-background, 0.5);\n box-sizing: border-box;\n border: 0;\n color: $primary-text-color;\n cursor: pointer;\n display: flex;\n align-items: center;\n font-size: 24px;\n height: 20vmax;\n margin: auto 0;\n padding: 30px 15px;\n position: absolute;\n top: 0;\n bottom: 0;\n}\n\n.media-modal__nav--left {\n left: 0;\n}\n\n.media-modal__nav--right {\n right: 0;\n}\n\n.media-modal__pagination {\n width: 100%;\n text-align: center;\n position: absolute;\n left: 0;\n bottom: 20px;\n pointer-events: none;\n}\n\n.media-modal__meta {\n text-align: center;\n position: absolute;\n left: 0;\n bottom: 20px;\n width: 100%;\n pointer-events: none;\n\n &--shifted {\n bottom: 62px;\n }\n\n a {\n pointer-events: auto;\n text-decoration: none;\n font-weight: 500;\n color: $ui-secondary-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.media-modal__page-dot {\n display: inline-block;\n}\n\n.media-modal__button {\n background-color: $primary-text-color;\n height: 12px;\n width: 12px;\n border-radius: 6px;\n margin: 10px;\n padding: 0;\n border: 0;\n font-size: 0;\n}\n\n.media-modal__button--active {\n background-color: $highlight-text-color;\n}\n\n.media-modal__close {\n position: absolute;\n right: 8px;\n top: 8px;\n z-index: 100;\n}\n\n.onboarding-modal,\n.error-modal,\n.embed-modal {\n background: $ui-secondary-color;\n color: $inverted-text-color;\n border-radius: 8px;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.error-modal__body {\n height: 80vh;\n width: 80vw;\n max-width: 520px;\n max-height: 420px;\n position: relative;\n\n & > div {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n padding: 25px;\n display: none;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n display: flex;\n opacity: 0;\n user-select: text;\n }\n}\n\n.error-modal__body {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n text-align: center;\n}\n\n.onboarding-modal__paginator,\n.error-modal__footer {\n flex: 0 0 auto;\n background: darken($ui-secondary-color, 8%);\n display: flex;\n padding: 25px;\n\n & > div {\n min-width: 33px;\n }\n\n .onboarding-modal__nav,\n .error-modal__nav {\n color: $lighter-text-color;\n border: 0;\n font-size: 14px;\n font-weight: 500;\n padding: 10px 25px;\n line-height: inherit;\n height: auto;\n margin: -10px;\n border-radius: 4px;\n background-color: transparent;\n\n &:hover,\n &:focus,\n &:active {\n color: darken($lighter-text-color, 4%);\n background-color: darken($ui-secondary-color, 16%);\n }\n\n &.onboarding-modal__done,\n &.onboarding-modal__next {\n color: $inverted-text-color;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($inverted-text-color, 4%);\n }\n }\n }\n}\n\n.error-modal__footer {\n justify-content: center;\n}\n\n.display-case {\n text-align: center;\n font-size: 15px;\n margin-bottom: 15px;\n\n &__label {\n font-weight: 500;\n color: $inverted-text-color;\n margin-bottom: 5px;\n text-transform: uppercase;\n font-size: 12px;\n }\n\n &__case {\n background: $ui-base-color;\n color: $secondary-text-color;\n font-weight: 500;\n padding: 10px;\n border-radius: 4px;\n }\n}\n\n.onboard-sliders {\n display: inline-block;\n max-width: 30px;\n max-height: auto;\n margin-left: 10px;\n}\n\n.boost-modal,\n.confirmation-modal,\n.report-modal,\n.actions-modal,\n.mute-modal,\n.block-modal {\n background: lighten($ui-secondary-color, 8%);\n color: $inverted-text-color;\n border-radius: 8px;\n overflow: hidden;\n max-width: 90vw;\n width: 480px;\n position: relative;\n flex-direction: column;\n\n .status__display-name {\n display: block;\n max-width: 100%;\n padding-right: 25px;\n }\n\n .status__avatar {\n height: 28px;\n left: 10px;\n position: absolute;\n top: 10px;\n width: 48px;\n }\n\n .status__content__spoiler-link {\n color: lighten($secondary-text-color, 8%);\n }\n}\n\n.actions-modal {\n .status {\n background: $white;\n border-bottom-color: $ui-secondary-color;\n padding-top: 10px;\n padding-bottom: 10px;\n }\n\n .dropdown-menu__separator {\n border-bottom-color: $ui-secondary-color;\n }\n}\n\n.boost-modal__container {\n overflow-x: scroll;\n padding: 10px;\n\n .status {\n user-select: text;\n border-bottom: 0;\n }\n}\n\n.boost-modal__action-bar,\n.confirmation-modal__action-bar,\n.mute-modal__action-bar,\n.block-modal__action-bar {\n display: flex;\n justify-content: space-between;\n background: $ui-secondary-color;\n padding: 10px;\n line-height: 36px;\n\n & > div {\n flex: 1 1 auto;\n text-align: right;\n color: $lighter-text-color;\n padding-right: 10px;\n }\n\n .button {\n flex: 0 0 auto;\n }\n}\n\n.boost-modal__status-header {\n font-size: 15px;\n}\n\n.boost-modal__status-time {\n float: right;\n font-size: 14px;\n}\n\n.mute-modal,\n.block-modal {\n line-height: 24px;\n}\n\n.mute-modal .react-toggle,\n.block-modal .react-toggle {\n vertical-align: middle;\n}\n\n.report-modal {\n width: 90vw;\n max-width: 700px;\n}\n\n.report-modal__container {\n display: flex;\n border-top: 1px solid $ui-secondary-color;\n\n @media screen and (max-width: 480px) {\n flex-wrap: wrap;\n overflow-y: auto;\n }\n}\n\n.report-modal__statuses,\n.report-modal__comment {\n box-sizing: border-box;\n width: 50%;\n\n @media screen and (max-width: 480px) {\n width: 100%;\n }\n}\n\n.report-modal__statuses,\n.focal-point-modal__content {\n flex: 1 1 auto;\n min-height: 20vh;\n max-height: 80vh;\n overflow-y: auto;\n overflow-x: hidden;\n\n .status__content a {\n color: $highlight-text-color;\n }\n\n .status__content,\n .status__content p {\n color: $inverted-text-color;\n }\n\n @media screen and (max-width: 480px) {\n max-height: 10vh;\n }\n}\n\n.focal-point-modal__content {\n @media screen and (max-width: 480px) {\n max-height: 40vh;\n }\n}\n\n.report-modal__comment {\n padding: 20px;\n border-right: 1px solid $ui-secondary-color;\n max-width: 320px;\n\n p {\n font-size: 14px;\n line-height: 20px;\n margin-bottom: 20px;\n }\n\n .setting-text {\n display: block;\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n color: $inverted-text-color;\n background: $white;\n padding: 10px;\n font-family: inherit;\n font-size: 14px;\n resize: none;\n border: 0;\n outline: 0;\n border-radius: 4px;\n border: 1px solid $ui-secondary-color;\n min-height: 100px;\n max-height: 50vh;\n margin-bottom: 10px;\n\n &:focus {\n border: 1px solid darken($ui-secondary-color, 8%);\n }\n\n &__wrapper {\n background: $white;\n border: 1px solid $ui-secondary-color;\n margin-bottom: 10px;\n border-radius: 4px;\n\n .setting-text {\n border: 0;\n margin-bottom: 0;\n border-radius: 0;\n\n &:focus {\n border: 0;\n }\n }\n\n &__modifiers {\n color: $inverted-text-color;\n font-family: inherit;\n font-size: 14px;\n background: $white;\n }\n }\n\n &__toolbar {\n display: flex;\n justify-content: space-between;\n margin-bottom: 20px;\n }\n }\n\n .setting-text-label {\n display: block;\n color: $inverted-text-color;\n font-size: 14px;\n font-weight: 500;\n margin-bottom: 10px;\n }\n\n .setting-toggle {\n margin-top: 20px;\n margin-bottom: 24px;\n\n &__label {\n color: $inverted-text-color;\n font-size: 14px;\n }\n }\n\n @media screen and (max-width: 480px) {\n padding: 10px;\n max-width: 100%;\n order: 2;\n\n .setting-toggle {\n margin-bottom: 4px;\n }\n }\n}\n\n.actions-modal {\n max-height: 80vh;\n max-width: 80vw;\n\n .status {\n overflow-y: auto;\n max-height: 300px;\n }\n\n .actions-modal__item-label {\n font-weight: 500;\n }\n\n ul {\n overflow-y: auto;\n flex-shrink: 0;\n max-height: 80vh;\n\n &.with-status {\n max-height: calc(80vh - 75px);\n }\n\n li:empty {\n margin: 0;\n }\n\n li:not(:empty) {\n a {\n color: $inverted-text-color;\n display: flex;\n padding: 12px 16px;\n font-size: 15px;\n align-items: center;\n text-decoration: none;\n\n &,\n button {\n transition: none;\n }\n\n &.active,\n &:hover,\n &:active,\n &:focus {\n &,\n button {\n background: $ui-highlight-color;\n color: $primary-text-color;\n }\n }\n\n button:first-child {\n margin-right: 10px;\n }\n }\n }\n }\n}\n\n.confirmation-modal__action-bar,\n.mute-modal__action-bar,\n.block-modal__action-bar {\n .confirmation-modal__secondary-button {\n flex-shrink: 1;\n }\n}\n\n.confirmation-modal__secondary-button,\n.confirmation-modal__cancel-button,\n.mute-modal__cancel-button,\n.block-modal__cancel-button {\n background-color: transparent;\n color: $lighter-text-color;\n font-size: 14px;\n font-weight: 500;\n\n &:hover,\n &:focus,\n &:active {\n color: darken($lighter-text-color, 4%);\n background-color: transparent;\n }\n}\n\n.confirmation-modal__container,\n.mute-modal__container,\n.block-modal__container,\n.report-modal__target {\n padding: 30px;\n font-size: 16px;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n}\n\n.confirmation-modal__container,\n.report-modal__target {\n text-align: center;\n}\n\n.block-modal,\n.mute-modal {\n &__explanation {\n margin-top: 20px;\n }\n\n .setting-toggle {\n margin-top: 20px;\n margin-bottom: 24px;\n display: flex;\n align-items: center;\n\n &__label {\n color: $inverted-text-color;\n margin: 0;\n margin-left: 8px;\n }\n }\n}\n\n.report-modal__target {\n padding: 15px;\n\n .media-modal__close {\n top: 14px;\n right: 15px;\n }\n}\n\n.loading-bar {\n background-color: $highlight-text-color;\n height: 3px;\n position: absolute;\n top: 0;\n left: 0;\n z-index: 9999;\n}\n\n.media-gallery__gifv__label {\n display: block;\n position: absolute;\n color: $primary-text-color;\n background: rgba($base-overlay-background, 0.5);\n bottom: 6px;\n left: 6px;\n padding: 2px 6px;\n border-radius: 2px;\n font-size: 11px;\n font-weight: 600;\n z-index: 1;\n pointer-events: none;\n opacity: 0.9;\n transition: opacity 0.1s ease;\n line-height: 18px;\n}\n\n.media-gallery__gifv {\n &:hover {\n .media-gallery__gifv__label {\n opacity: 1;\n }\n }\n}\n\n.media-gallery__audio {\n margin-top: 32px;\n\n audio {\n width: 100%;\n }\n}\n\n.attachment-list {\n display: flex;\n font-size: 14px;\n border: 1px solid lighten($ui-base-color, 8%);\n border-radius: 4px;\n margin-top: 14px;\n overflow: hidden;\n\n &__icon {\n flex: 0 0 auto;\n color: $dark-text-color;\n padding: 8px 18px;\n cursor: default;\n border-right: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n font-size: 26px;\n\n .fa {\n display: block;\n }\n }\n\n &__list {\n list-style: none;\n padding: 4px 0;\n padding-left: 8px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n\n li {\n display: block;\n padding: 4px 0;\n }\n\n a {\n text-decoration: none;\n color: $dark-text-color;\n font-weight: 500;\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n &.compact {\n border: 0;\n margin-top: 4px;\n\n .attachment-list__list {\n padding: 0;\n display: block;\n }\n\n .fa {\n color: $dark-text-color;\n }\n }\n}\n\n/* Media Gallery */\n.media-gallery {\n box-sizing: border-box;\n margin-top: 8px;\n overflow: hidden;\n border-radius: 4px;\n position: relative;\n width: 100%;\n}\n\n.media-gallery__item {\n border: 0;\n box-sizing: border-box;\n display: block;\n float: left;\n position: relative;\n border-radius: 4px;\n overflow: hidden;\n\n &.standalone {\n .media-gallery__item-gifv-thumbnail {\n transform: none;\n top: 0;\n }\n }\n}\n\n.media-gallery__item-thumbnail {\n cursor: zoom-in;\n display: block;\n text-decoration: none;\n color: $secondary-text-color;\n position: relative;\n z-index: 1;\n\n &,\n img {\n height: 100%;\n width: 100%;\n }\n\n img {\n object-fit: cover;\n }\n}\n\n.media-gallery__preview {\n width: 100%;\n height: 100%;\n object-fit: cover;\n position: absolute;\n top: 0;\n left: 0;\n z-index: 0;\n background: $base-overlay-background;\n\n &--hidden {\n display: none;\n }\n}\n\n.media-gallery__gifv {\n height: 100%;\n overflow: hidden;\n position: relative;\n width: 100%;\n}\n\n.media-gallery__item-gifv-thumbnail {\n cursor: zoom-in;\n height: 100%;\n object-fit: cover;\n position: relative;\n top: 50%;\n transform: translateY(-50%);\n width: 100%;\n z-index: 1;\n}\n\n.media-gallery__item-thumbnail-label {\n clip: rect(1px 1px 1px 1px); /* IE6, IE7 */\n clip: rect(1px, 1px, 1px, 1px);\n overflow: hidden;\n position: absolute;\n}\n/* End Media Gallery */\n\n.detailed,\n.fullscreen {\n .video-player__volume__current,\n .video-player__volume::before {\n bottom: 27px;\n }\n\n .video-player__volume__handle {\n bottom: 23px;\n }\n\n}\n\n.audio-player {\n box-sizing: border-box;\n position: relative;\n background: darken($ui-base-color, 8%);\n border-radius: 4px;\n padding-bottom: 44px;\n direction: ltr;\n\n &.editable {\n border-radius: 0;\n height: 100%;\n }\n\n &__waveform {\n padding: 15px 0;\n position: relative;\n overflow: hidden;\n\n &::before {\n content: \"\";\n display: block;\n position: absolute;\n border-top: 1px solid lighten($ui-base-color, 4%);\n width: 100%;\n height: 0;\n left: 0;\n top: calc(50% + 1px);\n }\n }\n\n &__progress-placeholder {\n background-color: rgba(lighten($ui-highlight-color, 8%), 0.5);\n }\n\n &__wave-placeholder {\n background-color: lighten($ui-base-color, 16%);\n }\n\n .video-player__controls {\n padding: 0 15px;\n padding-top: 10px;\n background: darken($ui-base-color, 8%);\n border-top: 1px solid lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n }\n}\n\n.video-player {\n overflow: hidden;\n position: relative;\n background: $base-shadow-color;\n max-width: 100%;\n border-radius: 4px;\n box-sizing: border-box;\n direction: ltr;\n\n &.editable {\n border-radius: 0;\n height: 100% !important;\n }\n\n &:focus {\n outline: 0;\n }\n\n video {\n max-width: 100vw;\n max-height: 80vh;\n z-index: 1;\n }\n\n &.fullscreen {\n width: 100% !important;\n height: 100% !important;\n margin: 0;\n\n video {\n max-width: 100% !important;\n max-height: 100% !important;\n width: 100% !important;\n height: 100% !important;\n outline: 0;\n }\n }\n\n &.inline {\n video {\n object-fit: contain;\n position: relative;\n top: 50%;\n transform: translateY(-50%);\n }\n }\n\n &__controls {\n position: absolute;\n z-index: 2;\n bottom: 0;\n left: 0;\n right: 0;\n box-sizing: border-box;\n background: linear-gradient(0deg, rgba($base-shadow-color, 0.85) 0, rgba($base-shadow-color, 0.45) 60%, transparent);\n padding: 0 15px;\n opacity: 0;\n transition: opacity .1s ease;\n\n &.active {\n opacity: 1;\n }\n }\n\n &.inactive {\n video,\n .video-player__controls {\n visibility: hidden;\n }\n }\n\n &__spoiler {\n display: none;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 4;\n border: 0;\n background: $base-overlay-background;\n color: $darker-text-color;\n transition: none;\n pointer-events: none;\n\n &.active {\n display: block;\n pointer-events: auto;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($darker-text-color, 7%);\n }\n }\n\n &__title {\n display: block;\n font-size: 14px;\n }\n\n &__subtitle {\n display: block;\n font-size: 11px;\n font-weight: 500;\n }\n }\n\n &__buttons-bar {\n display: flex;\n justify-content: space-between;\n padding-bottom: 10px;\n\n .video-player__download__icon {\n color: inherit;\n }\n }\n\n &__buttons {\n font-size: 16px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &.left {\n button {\n padding-left: 0;\n }\n }\n\n &.right {\n button {\n padding-right: 0;\n }\n }\n\n button {\n background: transparent;\n padding: 2px 10px;\n font-size: 16px;\n border: 0;\n color: rgba($white, 0.75);\n\n &:active,\n &:hover,\n &:focus {\n color: $white;\n }\n }\n }\n\n &__time-sep,\n &__time-total,\n &__time-current {\n font-size: 14px;\n font-weight: 500;\n }\n\n &__time-current {\n color: $white;\n margin-left: 60px;\n }\n\n &__time-sep {\n display: inline-block;\n margin: 0 6px;\n }\n\n &__time-sep,\n &__time-total {\n color: $white;\n }\n\n &__volume {\n cursor: pointer;\n height: 24px;\n display: inline;\n\n &::before {\n content: \"\";\n width: 50px;\n background: rgba($white, 0.35);\n border-radius: 4px;\n display: block;\n position: absolute;\n height: 4px;\n left: 70px;\n bottom: 20px;\n }\n\n &__current {\n display: block;\n position: absolute;\n height: 4px;\n border-radius: 4px;\n left: 70px;\n bottom: 20px;\n background: lighten($ui-highlight-color, 8%);\n }\n\n &__handle {\n position: absolute;\n z-index: 3;\n border-radius: 50%;\n width: 12px;\n height: 12px;\n bottom: 16px;\n left: 70px;\n transition: opacity .1s ease;\n background: lighten($ui-highlight-color, 8%);\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n pointer-events: none;\n }\n }\n\n &__link {\n padding: 2px 10px;\n\n a {\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n color: $white;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n }\n\n &__seek {\n cursor: pointer;\n height: 24px;\n position: relative;\n\n &::before {\n content: \"\";\n width: 100%;\n background: rgba($white, 0.35);\n border-radius: 4px;\n display: block;\n position: absolute;\n height: 4px;\n top: 10px;\n }\n\n &__progress,\n &__buffer {\n display: block;\n position: absolute;\n height: 4px;\n border-radius: 4px;\n top: 10px;\n background: lighten($ui-highlight-color, 8%);\n }\n\n &__buffer {\n background: rgba($white, 0.2);\n }\n\n &__handle {\n position: absolute;\n z-index: 3;\n opacity: 0;\n border-radius: 50%;\n width: 12px;\n height: 12px;\n top: 6px;\n margin-left: -6px;\n transition: opacity .1s ease;\n background: lighten($ui-highlight-color, 8%);\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n pointer-events: none;\n\n &.active {\n opacity: 1;\n }\n }\n\n &:hover {\n .video-player__seek__handle {\n opacity: 1;\n }\n }\n }\n\n &.detailed,\n &.fullscreen {\n .video-player__buttons {\n button {\n padding-top: 10px;\n padding-bottom: 10px;\n }\n }\n }\n}\n\n.directory {\n &__list {\n width: 100%;\n margin: 10px 0;\n transition: opacity 100ms ease-in;\n\n &.loading {\n opacity: 0.7;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin: 0;\n }\n }\n\n &__card {\n box-sizing: border-box;\n margin-bottom: 10px;\n\n &__img {\n height: 125px;\n position: relative;\n background: darken($ui-base-color, 12%);\n overflow: hidden;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n object-fit: cover;\n }\n }\n\n &__bar {\n display: flex;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n padding: 10px;\n\n &__name {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n text-decoration: none;\n overflow: hidden;\n }\n\n &__relationship {\n width: 23px;\n min-height: 1px;\n flex: 0 0 auto;\n }\n\n .avatar {\n flex: 0 0 auto;\n width: 48px;\n height: 48px;\n padding-top: 2px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n background: darken($ui-base-color, 8%);\n object-fit: cover;\n }\n }\n\n .display-name {\n margin-left: 15px;\n text-align: left;\n\n strong {\n font-size: 15px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n span {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n &__extra {\n background: $ui-base-color;\n display: flex;\n align-items: center;\n justify-content: center;\n\n .accounts-table__count {\n width: 33.33%;\n flex: 0 0 auto;\n padding: 15px 0;\n }\n\n .account__header__content {\n box-sizing: border-box;\n padding: 15px 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n width: 100%;\n min-height: 18px + 30px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n p {\n display: none;\n\n &:first-child {\n display: inline;\n }\n }\n\n br {\n display: none;\n }\n }\n }\n }\n}\n\n.account-gallery__container {\n display: flex;\n flex-wrap: wrap;\n padding: 4px 2px;\n}\n\n.account-gallery__item {\n border: 0;\n box-sizing: border-box;\n display: block;\n position: relative;\n border-radius: 4px;\n overflow: hidden;\n margin: 2px;\n\n &__icons {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 24px;\n }\n}\n\n.notification__filter-bar,\n.account__section-headline {\n background: darken($ui-base-color, 4%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n display: flex;\n flex-shrink: 0;\n\n button {\n background: darken($ui-base-color, 4%);\n border: 0;\n margin: 0;\n }\n\n button,\n a {\n display: block;\n flex: 1 1 auto;\n color: $darker-text-color;\n padding: 15px 0;\n font-size: 14px;\n font-weight: 500;\n text-align: center;\n text-decoration: none;\n position: relative;\n width: 100%;\n white-space: nowrap;\n\n &.active {\n color: $secondary-text-color;\n\n &::before,\n &::after {\n display: block;\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 50%;\n width: 0;\n height: 0;\n transform: translateX(-50%);\n border-style: solid;\n border-width: 0 10px 10px;\n border-color: transparent transparent lighten($ui-base-color, 8%);\n }\n\n &::after {\n bottom: -1px;\n border-color: transparent transparent $ui-base-color;\n }\n }\n }\n\n &.directory__section-headline {\n background: darken($ui-base-color, 2%);\n border-bottom-color: transparent;\n\n a,\n button {\n &.active {\n &::before {\n display: none;\n }\n\n &::after {\n border-color: transparent transparent darken($ui-base-color, 7%);\n }\n }\n }\n }\n}\n\n.filter-form {\n background: $ui-base-color;\n\n &__column {\n padding: 10px 15px;\n }\n\n .radio-button {\n display: block;\n }\n}\n\n.radio-button {\n font-size: 14px;\n position: relative;\n display: inline-block;\n padding: 6px 0;\n line-height: 18px;\n cursor: default;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n cursor: pointer;\n\n input[type=radio],\n input[type=checkbox] {\n display: none;\n }\n\n &__input {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 50%;\n vertical-align: middle;\n\n &.checked {\n border-color: lighten($ui-highlight-color, 8%);\n background: lighten($ui-highlight-color, 8%);\n }\n }\n}\n\n::-webkit-scrollbar-thumb {\n border-radius: 0;\n}\n\n.search-popout {\n @include search-popout;\n}\n\nnoscript {\n text-align: center;\n\n img {\n width: 200px;\n opacity: 0.5;\n animation: flicker 4s infinite;\n }\n\n div {\n font-size: 14px;\n margin: 30px auto;\n color: $secondary-text-color;\n max-width: 400px;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n }\n}\n\n@keyframes flicker {\n 0% { opacity: 1; }\n 30% { opacity: 0.75; }\n 100% { opacity: 1; }\n}\n\n@media screen and (max-width: 630px) and (max-height: 400px) {\n $duration: 400ms;\n $delay: 100ms;\n\n .tabs-bar,\n .search {\n will-change: margin-top;\n transition: margin-top $duration $delay;\n }\n\n .navigation-bar {\n will-change: padding-bottom;\n transition: padding-bottom $duration $delay;\n }\n\n .navigation-bar {\n & > a:first-child {\n will-change: margin-top, margin-left, margin-right, width;\n transition: margin-top $duration $delay, margin-left $duration ($duration + $delay), margin-right $duration ($duration + $delay);\n }\n\n & > .navigation-bar__profile-edit {\n will-change: margin-top;\n transition: margin-top $duration $delay;\n }\n\n .navigation-bar__actions {\n & > .icon-button.close {\n will-change: opacity transform;\n transition: opacity $duration * 0.5 $delay,\n transform $duration $delay;\n }\n\n & > .compose__action-bar .icon-button {\n will-change: opacity transform;\n transition: opacity $duration * 0.5 $delay + $duration * 0.5,\n transform $duration $delay;\n }\n }\n }\n\n .is-composing {\n .tabs-bar,\n .search {\n margin-top: -50px;\n }\n\n .navigation-bar {\n padding-bottom: 0;\n\n & > a:first-child {\n margin: -100px 10px 0 -50px;\n }\n\n .navigation-bar__profile {\n padding-top: 2px;\n }\n\n .navigation-bar__profile-edit {\n position: absolute;\n margin-top: -60px;\n }\n\n .navigation-bar__actions {\n .icon-button.close {\n pointer-events: auto;\n opacity: 1;\n transform: scale(1, 1) translate(0, 0);\n bottom: 5px;\n }\n\n .compose__action-bar .icon-button {\n pointer-events: none;\n opacity: 0;\n transform: scale(0, 1) translate(100%, 0);\n }\n }\n }\n }\n}\n\n.embed-modal {\n width: auto;\n max-width: 80vw;\n max-height: 80vh;\n\n h4 {\n padding: 30px;\n font-weight: 500;\n font-size: 16px;\n text-align: center;\n }\n\n .embed-modal__container {\n padding: 10px;\n\n .hint {\n margin-bottom: 15px;\n }\n\n .embed-modal__html {\n outline: 0;\n box-sizing: border-box;\n display: block;\n width: 100%;\n border: 0;\n padding: 10px;\n font-family: $font-monospace, monospace;\n background: $ui-base-color;\n color: $primary-text-color;\n font-size: 14px;\n margin: 0;\n margin-bottom: 15px;\n border-radius: 4px;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n .embed-modal__iframe {\n width: 400px;\n max-width: 100%;\n overflow: hidden;\n border: 0;\n border-radius: 4px;\n }\n }\n}\n\n.account__moved-note {\n padding: 14px 10px;\n padding-bottom: 16px;\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &__message {\n position: relative;\n margin-left: 58px;\n color: $dark-text-color;\n padding: 8px 0;\n padding-top: 0;\n padding-bottom: 4px;\n font-size: 14px;\n\n > span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n &__icon-wrapper {\n left: -26px;\n position: absolute;\n }\n\n .detailed-status__display-avatar {\n position: relative;\n }\n\n .detailed-status__display-name {\n margin-bottom: 0;\n }\n}\n\n.column-inline-form {\n padding: 15px;\n padding-right: 0;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n\n label {\n flex: 1 1 auto;\n\n input {\n width: 100%;\n\n &:focus {\n outline: 0;\n }\n }\n }\n\n .icon-button {\n flex: 0 0 auto;\n margin: 0 10px;\n }\n}\n\n.drawer__backdrop {\n cursor: pointer;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba($base-overlay-background, 0.5);\n}\n\n.list-editor {\n background: $ui-base-color;\n flex-direction: column;\n border-radius: 8px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n width: 380px;\n overflow: hidden;\n\n @media screen and (max-width: 420px) {\n width: 90%;\n }\n\n h4 {\n padding: 15px 0;\n background: lighten($ui-base-color, 13%);\n font-weight: 500;\n font-size: 16px;\n text-align: center;\n border-radius: 8px 8px 0 0;\n }\n\n .drawer__pager {\n height: 50vh;\n }\n\n .drawer__inner {\n border-radius: 0 0 8px 8px;\n\n &.backdrop {\n width: calc(100% - 60px);\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n border-radius: 0 0 0 8px;\n }\n }\n\n &__accounts {\n overflow-y: auto;\n }\n\n .account__display-name {\n &:hover strong {\n text-decoration: none;\n }\n }\n\n .account__avatar {\n cursor: default;\n }\n\n .search {\n margin-bottom: 0;\n }\n}\n\n.list-adder {\n background: $ui-base-color;\n flex-direction: column;\n border-radius: 8px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n width: 380px;\n overflow: hidden;\n\n @media screen and (max-width: 420px) {\n width: 90%;\n }\n\n &__account {\n background: lighten($ui-base-color, 13%);\n }\n\n &__lists {\n background: lighten($ui-base-color, 13%);\n height: 50vh;\n border-radius: 0 0 8px 8px;\n overflow-y: auto;\n }\n\n .list {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n .list__wrapper {\n display: flex;\n }\n\n .list__display-name {\n flex: 1 1 auto;\n overflow: hidden;\n text-decoration: none;\n font-size: 16px;\n padding: 10px;\n }\n}\n\n.focal-point {\n position: relative;\n cursor: move;\n overflow: hidden;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n background: $base-shadow-color;\n\n img,\n video,\n canvas {\n display: block;\n max-height: 80vh;\n width: 100%;\n height: auto;\n margin: 0;\n object-fit: contain;\n background: $base-shadow-color;\n }\n\n &__reticle {\n position: absolute;\n width: 100px;\n height: 100px;\n transform: translate(-50%, -50%);\n background: url('~images/reticle.png') no-repeat 0 0;\n border-radius: 50%;\n box-shadow: 0 0 0 9999em rgba($base-shadow-color, 0.35);\n }\n\n &__overlay {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n }\n\n &__preview {\n position: absolute;\n bottom: 10px;\n right: 10px;\n z-index: 2;\n cursor: move;\n transition: opacity 0.1s ease;\n\n &:hover {\n opacity: 0.5;\n }\n\n strong {\n color: $primary-text-color;\n font-size: 14px;\n font-weight: 500;\n display: block;\n margin-bottom: 5px;\n }\n\n div {\n border-radius: 4px;\n box-shadow: 0 0 14px rgba($base-shadow-color, 0.2);\n }\n }\n\n @media screen and (max-width: 480px) {\n img,\n video {\n max-height: 100%;\n }\n\n &__preview {\n display: none;\n }\n }\n}\n\n.account__header__content {\n color: $darker-text-color;\n font-size: 14px;\n font-weight: 400;\n overflow: hidden;\n word-break: normal;\n word-wrap: break-word;\n\n p {\n margin-bottom: 20px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: inherit;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n}\n\n.account__header {\n overflow: hidden;\n\n &.inactive {\n opacity: 0.5;\n\n .account__header__image,\n .account__avatar {\n filter: grayscale(100%);\n }\n }\n\n &__info {\n position: absolute;\n top: 10px;\n left: 10px;\n }\n\n &__image {\n overflow: hidden;\n height: 145px;\n position: relative;\n background: darken($ui-base-color, 4%);\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n }\n }\n\n &__bar {\n position: relative;\n background: lighten($ui-base-color, 4%);\n padding: 5px;\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n\n .avatar {\n display: block;\n flex: 0 0 auto;\n width: 94px;\n margin-left: -2px;\n\n .account__avatar {\n background: darken($ui-base-color, 8%);\n border: 2px solid lighten($ui-base-color, 4%);\n }\n }\n }\n\n &__tabs {\n display: flex;\n align-items: flex-start;\n padding: 7px 5px;\n margin-top: -55px;\n\n &__buttons {\n display: flex;\n align-items: center;\n padding-top: 55px;\n overflow: hidden;\n\n .icon-button {\n border: 1px solid lighten($ui-base-color, 12%);\n border-radius: 4px;\n box-sizing: content-box;\n padding: 2px;\n }\n\n .button {\n margin: 0 8px;\n }\n }\n\n &__name {\n padding: 5px;\n\n .account-role {\n vertical-align: top;\n }\n\n .emojione {\n width: 22px;\n height: 22px;\n }\n\n h1 {\n font-size: 16px;\n line-height: 24px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n\n small {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n .spacer {\n flex: 1 1 auto;\n }\n }\n\n &__bio {\n overflow: hidden;\n margin: 0 -5px;\n\n .account__header__content {\n padding: 20px 15px;\n padding-bottom: 5px;\n color: $primary-text-color;\n }\n\n .account__header__fields {\n margin: 0;\n border-top: 1px solid lighten($ui-base-color, 12%);\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n }\n\n &__extra {\n margin-top: 4px;\n\n &__links {\n font-size: 14px;\n color: $darker-text-color;\n padding: 10px 0;\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n padding: 5px 10px;\n font-weight: 500;\n\n strong {\n font-weight: 700;\n color: $primary-text-color;\n }\n }\n }\n }\n}\n\n.trends {\n &__header {\n color: $dark-text-color;\n background: lighten($ui-base-color, 2%);\n border-bottom: 1px solid darken($ui-base-color, 4%);\n font-weight: 500;\n padding: 15px;\n font-size: 16px;\n cursor: default;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n &__item {\n display: flex;\n align-items: center;\n padding: 15px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &:last-child {\n border-bottom: 0;\n }\n\n &__name {\n flex: 1 1 auto;\n color: $dark-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n strong {\n font-weight: 500;\n }\n\n a {\n color: $darker-text-color;\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:hover,\n &:focus,\n &:active {\n span {\n text-decoration: underline;\n }\n }\n }\n }\n\n &__current {\n flex: 0 0 auto;\n font-size: 24px;\n line-height: 36px;\n font-weight: 500;\n text-align: right;\n padding-right: 15px;\n margin-left: 5px;\n color: $secondary-text-color;\n }\n\n &__sparkline {\n flex: 0 0 auto;\n width: 50px;\n\n path:first-child {\n fill: rgba($highlight-text-color, 0.25) !important;\n fill-opacity: 1 !important;\n }\n\n path:last-child {\n stroke: lighten($highlight-text-color, 6%) !important;\n }\n }\n }\n}\n\n.conversation {\n display: flex;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n padding: 5px;\n padding-bottom: 0;\n\n &:focus {\n background: lighten($ui-base-color, 2%);\n outline: 0;\n }\n\n &__avatar {\n flex: 0 0 auto;\n padding: 10px;\n padding-top: 12px;\n position: relative;\n cursor: pointer;\n }\n\n &__unread {\n display: inline-block;\n background: $highlight-text-color;\n border-radius: 50%;\n width: 0.625rem;\n height: 0.625rem;\n margin: -.1ex .15em .1ex;\n }\n\n &__content {\n flex: 1 1 auto;\n padding: 10px 5px;\n padding-right: 15px;\n overflow: hidden;\n\n &__info {\n overflow: hidden;\n display: flex;\n flex-direction: row-reverse;\n justify-content: space-between;\n }\n\n &__relative-time {\n font-size: 15px;\n color: $darker-text-color;\n padding-left: 15px;\n }\n\n &__names {\n color: $darker-text-color;\n font-size: 15px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-bottom: 4px;\n flex-basis: 90px;\n flex-grow: 1;\n\n a {\n color: $primary-text-color;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n }\n\n a {\n word-break: break-word;\n }\n }\n\n &--unread {\n background: lighten($ui-base-color, 2%);\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n .conversation__content__info {\n font-weight: 700;\n }\n\n .conversation__content__relative-time {\n color: $primary-text-color;\n }\n }\n}\n\n.announcements {\n background: lighten($ui-base-color, 8%);\n font-size: 13px;\n display: flex;\n align-items: flex-end;\n\n &__mastodon {\n width: 124px;\n flex: 0 0 auto;\n\n @media screen and (max-width: 124px + 300px) {\n display: none;\n }\n }\n\n &__container {\n width: calc(100% - 124px);\n flex: 0 0 auto;\n position: relative;\n\n @media screen and (max-width: 124px + 300px) {\n width: 100%;\n }\n }\n\n &__item {\n box-sizing: border-box;\n width: 100%;\n padding: 15px;\n position: relative;\n font-size: 15px;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n max-height: 50vh;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n\n &__range {\n display: block;\n font-weight: 500;\n margin-bottom: 10px;\n padding-right: 18px;\n }\n\n &__unread {\n position: absolute;\n top: 19px;\n right: 19px;\n display: block;\n background: $highlight-text-color;\n border-radius: 50%;\n width: 0.625rem;\n height: 0.625rem;\n }\n }\n\n &__pagination {\n padding: 15px;\n color: $darker-text-color;\n position: absolute;\n bottom: 3px;\n right: 0;\n }\n}\n\n.layout-multiple-columns .announcements__mastodon {\n display: none;\n}\n\n.layout-multiple-columns .announcements__container {\n width: 100%;\n}\n\n.reactions-bar {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n margin-top: 15px;\n margin-left: -2px;\n width: calc(100% - (90px - 33px));\n\n &__item {\n flex-shrink: 0;\n background: lighten($ui-base-color, 12%);\n border: 0;\n border-radius: 3px;\n margin: 2px;\n cursor: pointer;\n user-select: none;\n padding: 0 6px;\n display: flex;\n align-items: center;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &__emoji {\n display: block;\n margin: 3px 0;\n width: 16px;\n height: 16px;\n\n img {\n display: block;\n margin: 0;\n width: 100%;\n height: 100%;\n min-width: auto;\n min-height: auto;\n vertical-align: bottom;\n object-fit: contain;\n }\n }\n\n &__count {\n display: block;\n min-width: 9px;\n font-size: 13px;\n font-weight: 500;\n text-align: center;\n margin-left: 6px;\n color: $darker-text-color;\n }\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 16%);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n\n &__count {\n color: lighten($darker-text-color, 4%);\n }\n }\n\n &.active {\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n background-color: mix(lighten($ui-base-color, 12%), $ui-highlight-color, 80%);\n\n .reactions-bar__item__count {\n color: lighten($highlight-text-color, 8%);\n }\n }\n }\n\n .emoji-picker-dropdown {\n margin: 2px;\n }\n\n &:hover .emoji-button {\n opacity: 0.85;\n }\n\n .emoji-button {\n color: $darker-text-color;\n margin: 0;\n font-size: 16px;\n width: auto;\n flex-shrink: 0;\n padding: 0 6px;\n height: 22px;\n display: flex;\n align-items: center;\n opacity: 0.5;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &:hover,\n &:active,\n &:focus {\n opacity: 1;\n color: lighten($darker-text-color, 4%);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n }\n }\n\n &--empty {\n .emoji-button {\n padding: 0;\n }\n }\n}\n",null,"@mixin avatar-radius {\n border-radius: 4px;\n background: transparent no-repeat;\n background-position: 50%;\n background-clip: padding-box;\n}\n\n@mixin avatar-size($size: 48px) {\n width: $size;\n height: $size;\n background-size: $size $size;\n}\n\n@mixin search-input {\n outline: 0;\n box-sizing: border-box;\n width: 100%;\n border: 0;\n box-shadow: none;\n font-family: inherit;\n background: $ui-base-color;\n color: $darker-text-color;\n font-size: 14px;\n margin: 0;\n}\n\n@mixin search-popout {\n background: $simple-background-color;\n border-radius: 4px;\n padding: 10px 14px;\n padding-bottom: 14px;\n margin-top: 10px;\n color: $light-text-color;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n\n h4 {\n text-transform: uppercase;\n color: $light-text-color;\n font-size: 13px;\n font-weight: 500;\n margin-bottom: 10px;\n }\n\n li {\n padding: 4px 0;\n }\n\n ul {\n margin-bottom: 10px;\n }\n\n em {\n font-weight: 500;\n color: $inverted-text-color;\n }\n}\n",".poll {\n margin-top: 16px;\n font-size: 14px;\n\n li {\n margin-bottom: 10px;\n position: relative;\n }\n\n &__chart {\n border-radius: 4px;\n display: block;\n background: darken($ui-primary-color, 5%);\n height: 5px;\n min-width: 1%;\n\n &.leading {\n background: $ui-highlight-color;\n }\n }\n\n &__option {\n position: relative;\n display: flex;\n padding: 6px 0;\n line-height: 18px;\n cursor: default;\n overflow: hidden;\n\n &__text {\n display: inline-block;\n word-wrap: break-word;\n overflow-wrap: break-word;\n max-width: calc(100% - 45px - 25px);\n }\n\n input[type=radio],\n input[type=checkbox] {\n display: none;\n }\n\n .autossugest-input {\n flex: 1 1 auto;\n }\n\n input[type=text] {\n display: block;\n box-sizing: border-box;\n width: 100%;\n font-size: 14px;\n color: $inverted-text-color;\n outline: 0;\n font-family: inherit;\n background: $simple-background-color;\n border: 1px solid darken($simple-background-color, 14%);\n border-radius: 4px;\n padding: 6px 10px;\n\n &:focus {\n border-color: $highlight-text-color;\n }\n }\n\n &.selectable {\n cursor: pointer;\n }\n\n &.editable {\n display: flex;\n align-items: center;\n overflow: visible;\n }\n }\n\n &__input {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 50%;\n vertical-align: middle;\n margin-top: auto;\n margin-bottom: auto;\n flex: 0 0 18px;\n\n &.checkbox {\n border-radius: 4px;\n }\n\n &.active {\n border-color: $valid-value-color;\n background: $valid-value-color;\n }\n\n &:active,\n &:focus,\n &:hover {\n border-color: lighten($valid-value-color, 15%);\n border-width: 4px;\n }\n\n &::-moz-focus-inner {\n outline: 0 !important;\n border: 0;\n }\n\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n\n &__number {\n display: inline-block;\n width: 45px;\n font-weight: 700;\n flex: 0 0 45px;\n }\n\n &__voted {\n padding: 0 5px;\n display: inline-block;\n\n &__mark {\n font-size: 18px;\n }\n }\n\n &__footer {\n padding-top: 6px;\n padding-bottom: 5px;\n color: $dark-text-color;\n }\n\n &__link {\n display: inline;\n background: transparent;\n padding: 0;\n margin: 0;\n border: 0;\n color: $dark-text-color;\n text-decoration: underline;\n font-size: inherit;\n\n &:hover {\n text-decoration: none;\n }\n\n &:active,\n &:focus {\n background-color: rgba($dark-text-color, .1);\n }\n }\n\n .button {\n height: 36px;\n padding: 0 16px;\n margin-right: 10px;\n font-size: 14px;\n }\n}\n\n.compose-form__poll-wrapper {\n border-top: 1px solid darken($simple-background-color, 8%);\n\n ul {\n padding: 10px;\n }\n\n .poll__footer {\n border-top: 1px solid darken($simple-background-color, 8%);\n padding: 10px;\n display: flex;\n align-items: center;\n\n button,\n select {\n flex: 1 1 50%;\n\n &:focus {\n border-color: $highlight-text-color;\n }\n }\n }\n\n .button.button-secondary {\n font-size: 14px;\n font-weight: 400;\n padding: 6px 10px;\n height: auto;\n line-height: inherit;\n color: $action-button-color;\n border-color: $action-button-color;\n margin-right: 5px;\n }\n\n li {\n display: flex;\n align-items: center;\n\n .poll__option {\n flex: 0 0 auto;\n width: calc(100% - (23px + 6px));\n margin-right: 6px;\n }\n }\n\n select {\n appearance: none;\n box-sizing: border-box;\n font-size: 14px;\n color: $inverted-text-color;\n display: inline-block;\n width: auto;\n outline: 0;\n font-family: inherit;\n background: $simple-background-color url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center / auto 16px;\n border: 1px solid darken($simple-background-color, 14%);\n border-radius: 4px;\n padding: 6px 10px;\n padding-right: 30px;\n }\n\n .icon-button.disabled {\n color: darken($simple-background-color, 14%);\n }\n}\n\n.muted .poll {\n color: $dark-text-color;\n\n &__chart {\n background: rgba(darken($ui-primary-color, 14%), 0.2);\n\n &.leading {\n background: rgba($ui-highlight-color, 0.2);\n }\n }\n}\n",".modal-layout {\n background: $ui-base-color url('data:image/svg+xml;utf8,') repeat-x bottom fixed;\n display: flex;\n flex-direction: column;\n height: 100vh;\n padding: 0;\n}\n\n.modal-layout__mastodon {\n display: flex;\n flex: 1;\n flex-direction: column;\n justify-content: flex-end;\n\n > * {\n flex: 1;\n max-height: 235px;\n }\n}\n\n@media screen and (max-width: 600px) {\n .account-header {\n margin-top: 0;\n }\n}\n",".emoji-mart {\n font-size: 13px;\n display: inline-block;\n color: $inverted-text-color;\n\n &,\n * {\n box-sizing: border-box;\n line-height: 1.15;\n }\n\n .emoji-mart-emoji {\n padding: 6px;\n }\n}\n\n.emoji-mart-bar {\n border: 0 solid darken($ui-secondary-color, 8%);\n\n &:first-child {\n border-bottom-width: 1px;\n border-top-left-radius: 5px;\n border-top-right-radius: 5px;\n background: $ui-secondary-color;\n }\n\n &:last-child {\n border-top-width: 1px;\n border-bottom-left-radius: 5px;\n border-bottom-right-radius: 5px;\n display: none;\n }\n}\n\n.emoji-mart-anchors {\n display: flex;\n justify-content: space-between;\n padding: 0 6px;\n color: $lighter-text-color;\n line-height: 0;\n}\n\n.emoji-mart-anchor {\n position: relative;\n flex: 1;\n text-align: center;\n padding: 12px 4px;\n overflow: hidden;\n transition: color .1s ease-out;\n cursor: pointer;\n\n &:hover {\n color: darken($lighter-text-color, 4%);\n }\n}\n\n.emoji-mart-anchor-selected {\n color: $highlight-text-color;\n\n &:hover {\n color: darken($highlight-text-color, 4%);\n }\n\n .emoji-mart-anchor-bar {\n bottom: -1px;\n }\n}\n\n.emoji-mart-anchor-bar {\n position: absolute;\n bottom: -5px;\n left: 0;\n width: 100%;\n height: 4px;\n background-color: $highlight-text-color;\n}\n\n.emoji-mart-anchors {\n i {\n display: inline-block;\n width: 100%;\n max-width: 22px;\n }\n\n svg {\n fill: currentColor;\n max-height: 18px;\n }\n}\n\n.emoji-mart-scroll {\n overflow-y: scroll;\n height: 270px;\n max-height: 35vh;\n padding: 0 6px 6px;\n background: $simple-background-color;\n will-change: transform;\n\n &::-webkit-scrollbar-track:hover,\n &::-webkit-scrollbar-track:active {\n background-color: rgba($base-overlay-background, 0.3);\n }\n}\n\n.emoji-mart-search {\n padding: 10px;\n padding-right: 45px;\n background: $simple-background-color;\n\n input {\n font-size: 14px;\n font-weight: 400;\n padding: 7px 9px;\n font-family: inherit;\n display: block;\n width: 100%;\n background: rgba($ui-secondary-color, 0.3);\n color: $inverted-text-color;\n border: 1px solid $ui-secondary-color;\n border-radius: 4px;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n}\n\n.emoji-mart-category .emoji-mart-emoji {\n cursor: pointer;\n\n span {\n z-index: 1;\n position: relative;\n text-align: center;\n }\n\n &:hover::before {\n z-index: 0;\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba($ui-secondary-color, 0.7);\n border-radius: 100%;\n }\n}\n\n.emoji-mart-category-label {\n z-index: 2;\n position: relative;\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n\n span {\n display: block;\n width: 100%;\n font-weight: 500;\n padding: 5px 6px;\n background: $simple-background-color;\n }\n}\n\n.emoji-mart-emoji {\n position: relative;\n display: inline-block;\n font-size: 0;\n\n span {\n width: 22px;\n height: 22px;\n }\n}\n\n.emoji-mart-no-results {\n font-size: 14px;\n text-align: center;\n padding-top: 70px;\n color: $light-text-color;\n\n .emoji-mart-category-label {\n display: none;\n }\n\n .emoji-mart-no-results-label {\n margin-top: .2em;\n }\n\n .emoji-mart-emoji:hover::before {\n content: none;\n }\n}\n\n.emoji-mart-preview {\n display: none;\n}\n","$maximum-width: 1235px;\n$fluid-breakpoint: $maximum-width + 20px;\n$column-breakpoint: 700px;\n$small-breakpoint: 960px;\n\n.container {\n box-sizing: border-box;\n max-width: $maximum-width;\n margin: 0 auto;\n position: relative;\n\n @media screen and (max-width: $fluid-breakpoint) {\n width: 100%;\n padding: 0 10px;\n }\n}\n\n.rich-formatting {\n font-family: $font-sans-serif, sans-serif;\n font-size: 14px;\n font-weight: 400;\n line-height: 1.7;\n word-wrap: break-word;\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n p,\n li {\n color: $darker-text-color;\n }\n\n p {\n margin-top: 0;\n margin-bottom: .85em;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n strong {\n font-weight: 700;\n color: $secondary-text-color;\n }\n\n em {\n font-style: italic;\n color: $secondary-text-color;\n }\n\n code {\n font-size: 0.85em;\n background: darken($ui-base-color, 8%);\n border-radius: 4px;\n padding: 0.2em 0.3em;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n font-family: $font-display, sans-serif;\n margin-top: 1.275em;\n margin-bottom: .85em;\n font-weight: 500;\n color: $secondary-text-color;\n }\n\n h1 {\n font-size: 2em;\n }\n\n h2 {\n font-size: 1.75em;\n }\n\n h3 {\n font-size: 1.5em;\n }\n\n h4 {\n font-size: 1.25em;\n }\n\n h5,\n h6 {\n font-size: 1em;\n }\n\n ul {\n list-style: disc;\n }\n\n ol {\n list-style: decimal;\n }\n\n ul,\n ol {\n margin: 0;\n padding: 0;\n padding-left: 2em;\n margin-bottom: 0.85em;\n\n &[type='a'] {\n list-style-type: lower-alpha;\n }\n\n &[type='i'] {\n list-style-type: lower-roman;\n }\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n margin: 1.7em 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n\n table {\n width: 100%;\n border-collapse: collapse;\n break-inside: auto;\n margin-top: 24px;\n margin-bottom: 32px;\n\n thead tr,\n tbody tr {\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n font-size: 1em;\n line-height: 1.625;\n font-weight: 400;\n text-align: left;\n color: $darker-text-color;\n }\n\n thead tr {\n border-bottom-width: 2px;\n line-height: 1.5;\n font-weight: 500;\n color: $dark-text-color;\n }\n\n th,\n td {\n padding: 8px;\n align-self: start;\n align-items: start;\n word-break: break-all;\n\n &.nowrap {\n width: 25%;\n position: relative;\n\n &::before {\n content: ' ';\n visibility: hidden;\n }\n\n span {\n position: absolute;\n left: 8px;\n right: 8px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n }\n\n & > :first-child {\n margin-top: 0;\n }\n}\n\n.information-board {\n background: darken($ui-base-color, 4%);\n padding: 20px 0;\n\n .container-alt {\n position: relative;\n padding-right: 280px + 15px;\n }\n\n &__sections {\n display: flex;\n justify-content: space-between;\n flex-wrap: wrap;\n }\n\n &__section {\n flex: 1 0 0;\n font-family: $font-sans-serif, sans-serif;\n font-size: 16px;\n line-height: 28px;\n color: $primary-text-color;\n text-align: right;\n padding: 10px 15px;\n\n span,\n strong {\n display: block;\n }\n\n span {\n &:last-child {\n color: $secondary-text-color;\n }\n }\n\n strong {\n font-family: $font-display, sans-serif;\n font-weight: 500;\n font-size: 32px;\n line-height: 48px;\n }\n\n @media screen and (max-width: $column-breakpoint) {\n text-align: center;\n }\n }\n\n .panel {\n position: absolute;\n width: 280px;\n box-sizing: border-box;\n background: darken($ui-base-color, 8%);\n padding: 20px;\n padding-top: 10px;\n border-radius: 4px 4px 0 0;\n right: 0;\n bottom: -40px;\n\n .panel-header {\n font-family: $font-display, sans-serif;\n font-size: 14px;\n line-height: 24px;\n font-weight: 500;\n color: $darker-text-color;\n padding-bottom: 5px;\n margin-bottom: 15px;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n\n a,\n span {\n font-weight: 400;\n color: darken($darker-text-color, 10%);\n }\n\n a {\n text-decoration: none;\n }\n }\n }\n\n .owner {\n text-align: center;\n\n .avatar {\n width: 80px;\n height: 80px;\n margin: 0 auto;\n margin-bottom: 15px;\n\n img {\n display: block;\n width: 80px;\n height: 80px;\n border-radius: 48px;\n }\n }\n\n .name {\n font-size: 14px;\n\n a {\n display: block;\n color: $primary-text-color;\n text-decoration: none;\n\n &:hover {\n .display_name {\n text-decoration: underline;\n }\n }\n }\n\n .username {\n display: block;\n color: $darker-text-color;\n }\n }\n }\n}\n\n.landing-page {\n p,\n li {\n font-family: $font-sans-serif, sans-serif;\n font-size: 16px;\n font-weight: 400;\n font-size: 16px;\n line-height: 30px;\n margin-bottom: 12px;\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n }\n }\n\n em {\n display: inline;\n margin: 0;\n padding: 0;\n font-weight: 700;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n color: lighten($darker-text-color, 10%);\n }\n\n h1 {\n font-family: $font-display, sans-serif;\n font-size: 26px;\n line-height: 30px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n\n small {\n font-family: $font-sans-serif, sans-serif;\n display: block;\n font-size: 18px;\n font-weight: 400;\n color: lighten($darker-text-color, 10%);\n }\n }\n\n h2 {\n font-family: $font-display, sans-serif;\n font-size: 22px;\n line-height: 26px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h3 {\n font-family: $font-display, sans-serif;\n font-size: 18px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h4 {\n font-family: $font-display, sans-serif;\n font-size: 16px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h5 {\n font-family: $font-display, sans-serif;\n font-size: 14px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h6 {\n font-family: $font-display, sans-serif;\n font-size: 12px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n ul,\n ol {\n margin-left: 20px;\n\n &[type='a'] {\n list-style-type: lower-alpha;\n }\n\n &[type='i'] {\n list-style-type: lower-roman;\n }\n }\n\n ul {\n list-style: disc;\n }\n\n ol {\n list-style: decimal;\n }\n\n li > ol,\n li > ul {\n margin-top: 6px;\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid rgba($ui-base-lighter-color, .6);\n margin: 20px 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n\n &__information,\n &__forms {\n padding: 20px;\n }\n\n &__call-to-action {\n background: $ui-base-color;\n border-radius: 4px;\n padding: 25px 40px;\n overflow: hidden;\n box-sizing: border-box;\n\n .row {\n width: 100%;\n display: flex;\n flex-direction: row-reverse;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n }\n\n .row__information-board {\n display: flex;\n justify-content: flex-end;\n align-items: flex-end;\n\n .information-board__section {\n flex: 1 0 auto;\n padding: 0 10px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n width: 100%;\n justify-content: space-between;\n }\n }\n\n .row__mascot {\n flex: 1;\n margin: 10px -50px 0 0;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n }\n\n &__logo {\n margin-right: 20px;\n\n img {\n height: 50px;\n width: auto;\n mix-blend-mode: lighten;\n }\n }\n\n &__information {\n padding: 45px 40px;\n margin-bottom: 10px;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n strong {\n font-weight: 500;\n color: lighten($darker-text-color, 10%);\n }\n\n .account {\n border-bottom: 0;\n padding: 0;\n\n &__display-name {\n align-items: center;\n display: flex;\n margin-right: 5px;\n }\n\n div.account__display-name {\n &:hover {\n .display-name strong {\n text-decoration: none;\n }\n }\n\n .account__avatar {\n cursor: default;\n }\n }\n\n &__avatar-wrapper {\n margin-left: 0;\n flex: 0 0 auto;\n }\n\n &__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n\n .display-name {\n font-size: 15px;\n\n &__account {\n font-size: 14px;\n }\n }\n }\n\n @media screen and (max-width: $small-breakpoint) {\n .contact {\n margin-top: 30px;\n }\n }\n\n @media screen and (max-width: $column-breakpoint) {\n padding: 25px 20px;\n }\n }\n\n &__information,\n &__forms,\n #mastodon-timeline {\n box-sizing: border-box;\n background: $ui-base-color;\n border-radius: 4px;\n box-shadow: 0 0 6px rgba($black, 0.1);\n }\n\n &__mascot {\n height: 104px;\n position: relative;\n left: -40px;\n bottom: 25px;\n\n img {\n height: 190px;\n width: auto;\n }\n }\n\n &__short-description {\n .row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n margin-bottom: 40px;\n }\n\n @media screen and (max-width: $column-breakpoint) {\n .row {\n margin-bottom: 20px;\n }\n }\n\n p a {\n color: $secondary-text-color;\n }\n\n h1 {\n font-weight: 500;\n color: $primary-text-color;\n margin-bottom: 0;\n\n small {\n color: $darker-text-color;\n\n span {\n color: $secondary-text-color;\n }\n }\n }\n\n p:last-child {\n margin-bottom: 0;\n }\n }\n\n &__hero {\n margin-bottom: 10px;\n\n img {\n display: block;\n margin: 0;\n max-width: 100%;\n height: auto;\n border-radius: 4px;\n }\n }\n\n @media screen and (max-width: 840px) {\n .information-board {\n .container-alt {\n padding-right: 20px;\n }\n\n .panel {\n position: static;\n margin-top: 20px;\n width: 100%;\n border-radius: 4px;\n\n .panel-header {\n text-align: center;\n }\n }\n }\n }\n\n @media screen and (max-width: 675px) {\n .header-wrapper {\n padding-top: 0;\n\n &.compact {\n padding-bottom: 0;\n }\n\n &.compact .hero .heading {\n text-align: initial;\n }\n }\n\n .header .container-alt,\n .features .container-alt {\n display: block;\n }\n }\n\n .cta {\n margin: 20px;\n }\n}\n\n.landing {\n margin-bottom: 100px;\n\n @media screen and (max-width: 738px) {\n margin-bottom: 0;\n }\n\n &__brand {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 50px;\n\n svg {\n fill: $primary-text-color;\n height: 52px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding: 0;\n margin-bottom: 30px;\n }\n }\n\n .directory {\n margin-top: 30px;\n background: transparent;\n box-shadow: none;\n border-radius: 0;\n }\n\n .hero-widget {\n margin-top: 30px;\n margin-bottom: 0;\n\n h4 {\n padding: 10px;\n text-transform: uppercase;\n font-weight: 700;\n font-size: 13px;\n color: $darker-text-color;\n }\n\n &__text {\n border-radius: 0;\n padding-bottom: 0;\n }\n\n &__footer {\n background: $ui-base-color;\n padding: 10px;\n border-radius: 0 0 4px 4px;\n display: flex;\n\n &__column {\n flex: 1 1 50%;\n }\n }\n\n .account {\n padding: 10px 0;\n border-bottom: 0;\n\n .account__display-name {\n display: flex;\n align-items: center;\n }\n\n .account__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n }\n\n &__counter {\n padding: 10px;\n\n strong {\n font-family: $font-display, sans-serif;\n font-size: 15px;\n font-weight: 700;\n display: block;\n }\n\n span {\n font-size: 14px;\n color: $darker-text-color;\n }\n }\n }\n\n .simple_form .user_agreement .label_input > label {\n font-weight: 400;\n color: $darker-text-color;\n }\n\n .simple_form p.lead {\n color: $darker-text-color;\n font-size: 15px;\n line-height: 20px;\n font-weight: 400;\n margin-bottom: 25px;\n }\n\n &__grid {\n max-width: 960px;\n margin: 0 auto;\n display: grid;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n grid-gap: 30px;\n\n @media screen and (max-width: 738px) {\n grid-template-columns: minmax(0, 100%);\n grid-gap: 10px;\n\n &__column-login {\n grid-row: 1;\n display: flex;\n flex-direction: column;\n\n .box-widget {\n order: 2;\n flex: 0 0 auto;\n }\n\n .hero-widget {\n margin-top: 0;\n margin-bottom: 10px;\n order: 1;\n flex: 0 0 auto;\n }\n }\n\n &__column-registration {\n grid-row: 2;\n }\n\n .directory {\n margin-top: 10px;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n\n .hero-widget {\n display: block;\n margin-bottom: 0;\n box-shadow: none;\n\n &__img,\n &__img img,\n &__footer {\n border-radius: 0;\n }\n }\n\n .hero-widget,\n .box-widget,\n .directory__tag {\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n .directory {\n margin-top: 0;\n\n &__tag {\n margin-bottom: 0;\n\n & > a,\n & > div {\n border-radius: 0;\n box-shadow: none;\n }\n\n &:last-child {\n border-bottom: 0;\n }\n }\n }\n }\n }\n}\n\n.brand {\n position: relative;\n text-decoration: none;\n}\n\n.brand__tagline {\n display: block;\n position: absolute;\n bottom: -10px;\n left: 50px;\n width: 300px;\n color: $ui-primary-color;\n text-decoration: none;\n font-size: 14px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n position: static;\n width: auto;\n margin-top: 20px;\n color: $dark-text-color;\n }\n}\n\n",".table {\n width: 100%;\n max-width: 100%;\n border-spacing: 0;\n border-collapse: collapse;\n\n th,\n td {\n padding: 8px;\n line-height: 18px;\n vertical-align: top;\n border-top: 1px solid $ui-base-color;\n text-align: left;\n background: darken($ui-base-color, 4%);\n }\n\n & > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid $ui-base-color;\n border-top: 0;\n font-weight: 500;\n }\n\n & > tbody > tr > th {\n font-weight: 500;\n }\n\n & > tbody > tr:nth-child(odd) > td,\n & > tbody > tr:nth-child(odd) > th {\n background: $ui-base-color;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n &.inline-table {\n & > tbody > tr:nth-child(odd) {\n & > td,\n & > th {\n background: transparent;\n }\n }\n\n & > tbody > tr:first-child {\n & > td,\n & > th {\n border-top: 0;\n }\n }\n }\n\n &.batch-table {\n & > thead > tr > th {\n background: $ui-base-color;\n border-top: 1px solid darken($ui-base-color, 8%);\n border-bottom: 1px solid darken($ui-base-color, 8%);\n\n &:first-child {\n border-radius: 4px 0 0;\n border-left: 1px solid darken($ui-base-color, 8%);\n }\n\n &:last-child {\n border-radius: 0 4px 0 0;\n border-right: 1px solid darken($ui-base-color, 8%);\n }\n }\n }\n\n &--invites tbody td {\n vertical-align: middle;\n }\n}\n\n.table-wrapper {\n overflow: auto;\n margin-bottom: 20px;\n}\n\nsamp {\n font-family: $font-monospace, monospace;\n}\n\nbutton.table-action-link {\n background: transparent;\n border: 0;\n font: inherit;\n}\n\nbutton.table-action-link,\na.table-action-link {\n text-decoration: none;\n display: inline-block;\n margin-right: 5px;\n padding: 0 10px;\n color: $darker-text-color;\n font-weight: 500;\n\n &:hover {\n color: $primary-text-color;\n }\n\n i.fa {\n font-weight: 400;\n margin-right: 5px;\n }\n\n &:first-child {\n padding-left: 0;\n }\n}\n\n.batch-table {\n &__toolbar,\n &__row {\n display: flex;\n\n &__select {\n box-sizing: border-box;\n padding: 8px 16px;\n cursor: pointer;\n min-height: 100%;\n\n input {\n margin-top: 8px;\n }\n\n &--aligned {\n display: flex;\n align-items: center;\n\n input {\n margin-top: 0;\n }\n }\n }\n\n &__actions,\n &__content {\n padding: 8px 0;\n padding-right: 16px;\n flex: 1 1 auto;\n }\n }\n\n &__toolbar {\n border: 1px solid darken($ui-base-color, 8%);\n background: $ui-base-color;\n border-radius: 4px 0 0;\n height: 47px;\n align-items: center;\n\n &__actions {\n text-align: right;\n padding-right: 16px - 5px;\n }\n }\n\n &__form {\n padding: 16px;\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n background: $ui-base-color;\n\n .fields-row {\n padding-top: 0;\n margin-bottom: 0;\n }\n }\n\n &__row {\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n background: darken($ui-base-color, 4%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n .optional &:first-child {\n border-top: 1px solid darken($ui-base-color, 8%);\n }\n }\n\n &:hover {\n background: darken($ui-base-color, 2%);\n }\n\n &:nth-child(even) {\n background: $ui-base-color;\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n }\n\n &__content {\n padding-top: 12px;\n padding-bottom: 16px;\n\n &--unpadded {\n padding: 0;\n }\n\n &--with-image {\n display: flex;\n align-items: center;\n }\n\n &__image {\n flex: 0 0 auto;\n display: flex;\n justify-content: center;\n align-items: center;\n margin-right: 10px;\n\n .emojione {\n width: 32px;\n height: 32px;\n }\n }\n\n &__text {\n flex: 1 1 auto;\n }\n\n &__extra {\n flex: 0 0 auto;\n text-align: right;\n color: $darker-text-color;\n font-weight: 500;\n }\n }\n\n .directory__tag {\n margin: 0;\n width: 100%;\n\n a {\n background: transparent;\n border-radius: 0;\n }\n }\n }\n\n &.optional .batch-table__toolbar,\n &.optional .batch-table__row__select {\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n\n .status__content {\n padding-top: 0;\n\n summary {\n display: list-item;\n }\n\n strong {\n font-weight: 700;\n }\n }\n\n .nothing-here {\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n box-shadow: none;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 1px solid darken($ui-base-color, 8%);\n }\n }\n\n @media screen and (max-width: 870px) {\n .accounts-table tbody td.optional {\n display: none;\n }\n }\n}\n","$no-columns-breakpoint: 600px;\n$sidebar-width: 240px;\n$content-width: 840px;\n\n.admin-wrapper {\n display: flex;\n justify-content: center;\n width: 100%;\n min-height: 100vh;\n\n .sidebar-wrapper {\n min-height: 100vh;\n overflow: hidden;\n pointer-events: none;\n flex: 1 1 auto;\n\n &__inner {\n display: flex;\n justify-content: flex-end;\n background: $ui-base-color;\n height: 100%;\n }\n }\n\n .sidebar {\n width: $sidebar-width;\n padding: 0;\n pointer-events: auto;\n\n &__toggle {\n display: none;\n background: lighten($ui-base-color, 8%);\n height: 48px;\n\n &__logo {\n flex: 1 1 auto;\n\n a {\n display: inline-block;\n padding: 15px;\n }\n\n svg {\n fill: $primary-text-color;\n height: 20px;\n position: relative;\n bottom: -2px;\n }\n }\n\n &__icon {\n display: block;\n color: $darker-text-color;\n text-decoration: none;\n flex: 0 0 auto;\n font-size: 20px;\n padding: 15px;\n }\n\n a {\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 12%);\n }\n }\n }\n\n .logo {\n display: block;\n margin: 40px auto;\n width: 100px;\n height: 100px;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n & > a:first-child {\n display: none;\n }\n }\n\n ul {\n list-style: none;\n border-radius: 4px 0 0 4px;\n overflow: hidden;\n margin-bottom: 20px;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n margin-bottom: 0;\n }\n\n a {\n display: block;\n padding: 15px;\n color: $darker-text-color;\n text-decoration: none;\n transition: all 200ms linear;\n transition-property: color, background-color;\n border-radius: 4px 0 0 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n i.fa {\n margin-right: 5px;\n }\n\n &:hover {\n color: $primary-text-color;\n background-color: darken($ui-base-color, 5%);\n transition: all 100ms linear;\n transition-property: color, background-color;\n }\n\n &.selected {\n background: darken($ui-base-color, 2%);\n border-radius: 4px 0 0;\n }\n }\n\n ul {\n background: darken($ui-base-color, 4%);\n border-radius: 0 0 0 4px;\n margin: 0;\n\n a {\n border: 0;\n padding: 15px 35px;\n }\n }\n\n .simple-navigation-active-leaf a {\n color: $primary-text-color;\n background-color: $ui-highlight-color;\n border-bottom: 0;\n border-radius: 0;\n\n &:hover {\n background-color: lighten($ui-highlight-color, 5%);\n }\n }\n }\n\n & > ul > .simple-navigation-active-leaf a {\n border-radius: 4px 0 0 4px;\n }\n }\n\n .content-wrapper {\n box-sizing: border-box;\n width: 100%;\n max-width: $content-width;\n flex: 1 1 auto;\n }\n\n @media screen and (max-width: $content-width + $sidebar-width) {\n .sidebar-wrapper--empty {\n display: none;\n }\n\n .sidebar-wrapper {\n width: $sidebar-width;\n flex: 0 0 auto;\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n .sidebar-wrapper {\n width: 100%;\n }\n }\n\n .content {\n padding: 20px 15px;\n padding-top: 60px;\n padding-left: 25px;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n max-width: none;\n padding: 15px;\n padding-top: 30px;\n }\n\n &-heading {\n display: flex;\n\n padding-bottom: 40px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n margin: -15px -15px 40px 0;\n\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n\n & > * {\n margin-top: 15px;\n margin-right: 15px;\n }\n\n &-actions {\n display: inline-flex;\n\n & > :not(:first-child) {\n margin-left: 5px;\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n border-bottom: 0;\n padding-bottom: 0;\n }\n }\n\n h2 {\n color: $secondary-text-color;\n font-size: 24px;\n line-height: 28px;\n font-weight: 400;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n font-weight: 700;\n }\n }\n\n h3 {\n color: $secondary-text-color;\n font-size: 20px;\n line-height: 28px;\n font-weight: 400;\n margin-bottom: 30px;\n }\n\n h4 {\n text-transform: uppercase;\n font-size: 13px;\n font-weight: 700;\n color: $darker-text-color;\n padding-bottom: 8px;\n margin-bottom: 8px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n h6 {\n font-size: 16px;\n color: $secondary-text-color;\n line-height: 28px;\n font-weight: 500;\n }\n\n .fields-group h6 {\n color: $primary-text-color;\n font-weight: 500;\n }\n\n .directory__tag > a,\n .directory__tag > div {\n box-shadow: none;\n }\n\n .directory__tag .table-action-link .fa {\n color: inherit;\n }\n\n .directory__tag h4 {\n font-size: 18px;\n font-weight: 700;\n color: $primary-text-color;\n text-transform: none;\n padding-bottom: 0;\n margin-bottom: 0;\n border-bottom: 0;\n }\n\n & > p {\n font-size: 14px;\n line-height: 21px;\n color: $secondary-text-color;\n margin-bottom: 20px;\n\n strong {\n color: $primary-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid rgba($ui-base-lighter-color, .6);\n margin: 20px 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n\n .sidebar-wrapper {\n min-height: 0;\n }\n\n .sidebar {\n width: 100%;\n padding: 0;\n height: auto;\n\n &__toggle {\n display: flex;\n }\n\n & > ul {\n display: none;\n }\n\n ul a,\n ul ul a {\n border-radius: 0;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n transition: none;\n\n &:hover {\n transition: none;\n }\n }\n\n ul ul {\n border-radius: 0;\n }\n\n ul .simple-navigation-active-leaf a {\n border-bottom-color: $ui-highlight-color;\n }\n }\n }\n}\n\nhr.spacer {\n width: 100%;\n border: 0;\n margin: 20px 0;\n height: 1px;\n}\n\nbody,\n.admin-wrapper .content {\n .muted-hint {\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n }\n }\n\n .positive-hint {\n color: $valid-value-color;\n font-weight: 500;\n }\n\n .negative-hint {\n color: $error-value-color;\n font-weight: 500;\n }\n\n .neutral-hint {\n color: $dark-text-color;\n font-weight: 500;\n }\n\n .warning-hint {\n color: $gold-star;\n font-weight: 500;\n }\n}\n\n.filters {\n display: flex;\n flex-wrap: wrap;\n\n .filter-subset {\n flex: 0 0 auto;\n margin: 0 40px 20px 0;\n\n &:last-child {\n margin-bottom: 30px;\n }\n\n ul {\n margin-top: 5px;\n list-style: none;\n\n li {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n strong {\n font-weight: 500;\n text-transform: uppercase;\n font-size: 12px;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n &--with-select strong {\n display: block;\n margin-bottom: 10px;\n }\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n text-transform: uppercase;\n font-size: 12px;\n font-weight: 500;\n border-bottom: 2px solid $ui-base-color;\n\n &:hover {\n color: $primary-text-color;\n border-bottom: 2px solid lighten($ui-base-color, 5%);\n }\n\n &.selected {\n color: $highlight-text-color;\n border-bottom: 2px solid $ui-highlight-color;\n }\n }\n }\n}\n\n.flavour-screen {\n display: block;\n margin: 10px auto;\n max-width: 100%;\n}\n\n.flavour-description {\n display: block;\n font-size: 16px;\n margin: 10px 0;\n\n & > p {\n margin: 10px 0;\n }\n}\n\n.flavour-screen {\n display: block;\n margin: 10px auto;\n max-width: 100%;\n}\n\n.flavour-description {\n display: block;\n font-size: 16px;\n margin: 10px 0;\n\n & > p {\n margin: 10px 0;\n }\n}\n\n.report-accounts {\n display: flex;\n flex-wrap: wrap;\n margin-bottom: 20px;\n}\n\n.report-accounts__item {\n display: flex;\n flex: 250px;\n flex-direction: column;\n margin: 0 5px;\n\n & > strong {\n display: block;\n margin: 0 0 10px -5px;\n font-weight: 500;\n font-size: 14px;\n line-height: 18px;\n color: $secondary-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n .account-card {\n flex: 1 1 auto;\n }\n}\n\n.report-status,\n.account-status {\n display: flex;\n margin-bottom: 10px;\n\n .activity-stream {\n flex: 2 0 0;\n margin-right: 20px;\n max-width: calc(100% - 60px);\n\n .entry {\n border-radius: 4px;\n }\n }\n}\n\n.report-status__actions,\n.account-status__actions {\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n\n .icon-button {\n font-size: 24px;\n width: 24px;\n text-align: center;\n margin-bottom: 10px;\n }\n}\n\n.simple_form.new_report_note,\n.simple_form.new_account_moderation_note {\n max-width: 100%;\n}\n\n.batch-form-box {\n display: flex;\n flex-wrap: wrap;\n margin-bottom: 5px;\n\n #form_status_batch_action {\n margin: 0 5px 5px 0;\n font-size: 14px;\n }\n\n input.button {\n margin: 0 5px 5px 0;\n }\n\n .media-spoiler-toggle-buttons {\n margin-left: auto;\n\n .button {\n overflow: visible;\n margin: 0 0 5px 5px;\n float: right;\n }\n }\n}\n\n.back-link {\n margin-bottom: 10px;\n font-size: 14px;\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.spacer {\n flex: 1 1 auto;\n}\n\n.log-entry {\n line-height: 20px;\n padding: 15px 0;\n background: $ui-base-color;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n\n &:last-child {\n border-bottom: 0;\n }\n\n &__header {\n display: flex;\n justify-content: flex-start;\n align-items: center;\n color: $darker-text-color;\n font-size: 14px;\n padding: 0 10px;\n }\n\n &__avatar {\n margin-right: 10px;\n\n .avatar {\n display: block;\n margin: 0;\n border-radius: 50%;\n width: 40px;\n height: 40px;\n }\n }\n\n &__content {\n max-width: calc(100% - 90px);\n }\n\n &__title {\n word-wrap: break-word;\n }\n\n &__timestamp {\n color: $dark-text-color;\n }\n\n a,\n .username,\n .target {\n color: $secondary-text-color;\n text-decoration: none;\n font-weight: 500;\n }\n}\n\na.name-tag,\n.name-tag,\na.inline-name-tag,\n.inline-name-tag {\n text-decoration: none;\n color: $secondary-text-color;\n\n .username {\n font-weight: 500;\n }\n\n &.suspended {\n .username {\n text-decoration: line-through;\n color: lighten($error-red, 12%);\n }\n\n .avatar {\n filter: grayscale(100%);\n opacity: 0.8;\n }\n }\n}\n\na.name-tag,\n.name-tag {\n display: flex;\n align-items: center;\n\n .avatar {\n display: block;\n margin: 0;\n margin-right: 5px;\n border-radius: 50%;\n }\n\n &.suspended {\n .avatar {\n filter: grayscale(100%);\n opacity: 0.8;\n }\n }\n}\n\n.speech-bubble {\n margin-bottom: 20px;\n border-left: 4px solid $ui-highlight-color;\n\n &.positive {\n border-left-color: $success-green;\n }\n\n &.negative {\n border-left-color: lighten($error-red, 12%);\n }\n\n &.warning {\n border-left-color: $gold-star;\n }\n\n &__bubble {\n padding: 16px;\n padding-left: 14px;\n font-size: 15px;\n line-height: 20px;\n border-radius: 4px 4px 4px 0;\n position: relative;\n font-weight: 500;\n\n a {\n color: $darker-text-color;\n }\n }\n\n &__owner {\n padding: 8px;\n padding-left: 12px;\n }\n\n time {\n color: $dark-text-color;\n }\n}\n\n.report-card {\n background: $ui-base-color;\n border-radius: 4px;\n margin-bottom: 20px;\n\n &__profile {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 15px;\n\n .account {\n padding: 0;\n border: 0;\n\n &__avatar-wrapper {\n margin-left: 0;\n }\n }\n\n &__stats {\n flex: 0 0 auto;\n font-weight: 500;\n color: $darker-text-color;\n text-transform: uppercase;\n text-align: right;\n\n a {\n color: inherit;\n text-decoration: none;\n\n &:focus,\n &:hover,\n &:active {\n color: lighten($darker-text-color, 8%);\n }\n }\n\n .red {\n color: $error-value-color;\n }\n }\n }\n\n &__summary {\n &__item {\n display: flex;\n justify-content: flex-start;\n border-top: 1px solid darken($ui-base-color, 4%);\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n\n &__reported-by,\n &__assigned {\n padding: 15px;\n flex: 0 0 auto;\n box-sizing: border-box;\n width: 150px;\n color: $darker-text-color;\n\n &,\n .username {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n &__content {\n flex: 1 1 auto;\n max-width: calc(100% - 300px);\n\n &__icon {\n color: $dark-text-color;\n margin-right: 4px;\n font-weight: 500;\n }\n }\n\n &__content a {\n display: block;\n box-sizing: border-box;\n width: 100%;\n padding: 15px;\n text-decoration: none;\n color: $darker-text-color;\n }\n }\n }\n}\n\n.one-line {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.ellipsized-ip {\n display: inline-block;\n max-width: 120px;\n overflow: hidden;\n text-overflow: ellipsis;\n vertical-align: middle;\n}\n\n.admin-account-bio {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n margin-top: 20px;\n\n > div {\n box-sizing: border-box;\n padding: 0 5px;\n margin-bottom: 10px;\n flex: 1 0 50%;\n }\n\n .account__header__fields,\n .account__header__content {\n background: lighten($ui-base-color, 8%);\n border-radius: 4px;\n height: 100%;\n }\n\n .account__header__fields {\n margin: 0;\n border: 0;\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n\n .account__header__content {\n box-sizing: border-box;\n padding: 20px;\n color: $primary-text-color;\n }\n}\n\n.center-text {\n text-align: center;\n}\n\n.announcements-list {\n border: 1px solid lighten($ui-base-color, 4%);\n border-radius: 4px;\n\n &__item {\n padding: 15px 0;\n background: $ui-base-color;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n\n &__title {\n padding: 0 15px;\n display: block;\n font-weight: 500;\n font-size: 18px;\n line-height: 1.5;\n color: $secondary-text-color;\n text-decoration: none;\n margin-bottom: 10px;\n\n &:hover,\n &:focus,\n &:active {\n color: $primary-text-color;\n }\n }\n\n &__meta {\n padding: 0 15px;\n color: $dark-text-color;\n }\n\n &__action-bar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n &:last-child {\n border-bottom: 0;\n }\n }\n}\n",".dashboard__counters {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n margin-bottom: 20px;\n\n & > div {\n box-sizing: border-box;\n flex: 0 0 33.333%;\n padding: 0 5px;\n margin-bottom: 10px;\n\n & > div,\n & > a {\n padding: 20px;\n background: lighten($ui-base-color, 4%);\n border-radius: 4px;\n box-sizing: border-box;\n height: 100%;\n }\n\n & > a {\n text-decoration: none;\n color: inherit;\n display: block;\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 8%);\n }\n }\n }\n\n &__num,\n &__text {\n text-align: center;\n font-weight: 500;\n font-size: 24px;\n line-height: 21px;\n color: $primary-text-color;\n font-family: $font-display, sans-serif;\n margin-bottom: 20px;\n line-height: 30px;\n }\n\n &__text {\n font-size: 18px;\n }\n\n &__label {\n font-size: 14px;\n color: $darker-text-color;\n text-align: center;\n font-weight: 500;\n }\n}\n\n.dashboard__widgets {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n\n & > div {\n flex: 0 0 33.333%;\n margin-bottom: 20px;\n\n & > div {\n padding: 0 5px;\n }\n }\n\n a:not(.name-tag) {\n color: $ui-secondary-color;\n font-weight: 500;\n text-decoration: none;\n }\n}\n","body.rtl {\n direction: rtl;\n\n .column-header > button {\n text-align: right;\n padding-left: 0;\n padding-right: 15px;\n }\n\n .radio-button__input {\n margin-right: 0;\n margin-left: 10px;\n }\n\n .directory__card__bar .display-name {\n margin-left: 0;\n margin-right: 15px;\n }\n\n .display-name {\n text-align: right;\n }\n\n .notification__message {\n margin-left: 0;\n margin-right: 68px;\n }\n\n .drawer__inner__mastodon > img {\n transform: scaleX(-1);\n }\n\n .notification__favourite-icon-wrapper {\n left: auto;\n right: -26px;\n }\n\n .landing-page__logo {\n margin-right: 0;\n margin-left: 20px;\n }\n\n .landing-page .features-list .features-list__row .visual {\n margin-left: 0;\n margin-right: 15px;\n }\n\n .column-link__icon,\n .column-header__icon {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .compose-form .compose-form__buttons-wrapper .character-counter__wrapper {\n margin-right: 0;\n margin-left: 4px;\n }\n\n .navigation-bar__profile {\n margin-left: 0;\n margin-right: 8px;\n }\n\n .search__input {\n padding-right: 10px;\n padding-left: 30px;\n }\n\n .search__icon .fa {\n right: auto;\n left: 10px;\n }\n\n .columns-area {\n direction: rtl;\n }\n\n .column-header__buttons {\n left: 0;\n right: auto;\n margin-left: 0;\n margin-right: -15px;\n }\n\n .column-inline-form .icon-button {\n margin-left: 0;\n margin-right: 5px;\n }\n\n .column-header__links .text-btn {\n margin-left: 10px;\n margin-right: 0;\n }\n\n .account__avatar-wrapper {\n float: right;\n }\n\n .column-header__back-button {\n padding-left: 5px;\n padding-right: 0;\n }\n\n .column-header__setting-arrows {\n float: left;\n }\n\n .setting-toggle__label {\n margin-left: 0;\n margin-right: 8px;\n }\n\n .status__avatar {\n left: auto;\n right: 10px;\n }\n\n .status,\n .activity-stream .status.light {\n padding-left: 10px;\n padding-right: 68px;\n }\n\n .status__info .status__display-name,\n .activity-stream .status.light .status__display-name {\n padding-left: 25px;\n padding-right: 0;\n }\n\n .activity-stream .pre-header {\n padding-right: 68px;\n padding-left: 0;\n }\n\n .status__prepend {\n margin-left: 0;\n margin-right: 68px;\n }\n\n .status__prepend-icon-wrapper {\n left: auto;\n right: -26px;\n }\n\n .activity-stream .pre-header .pre-header__icon {\n left: auto;\n right: 42px;\n }\n\n .account__avatar-overlay-overlay {\n right: auto;\n left: 0;\n }\n\n .column-back-button--slim-button {\n right: auto;\n left: 0;\n }\n\n .status__relative-time,\n .activity-stream .status.light .status__header .status__meta {\n float: left;\n }\n\n .status__action-bar {\n &__counter {\n margin-right: 0;\n margin-left: 11px;\n\n .status__action-bar-button {\n margin-right: 0;\n margin-left: 4px;\n }\n }\n }\n\n .status__action-bar-button {\n float: right;\n margin-right: 0;\n margin-left: 18px;\n }\n\n .status__action-bar-dropdown {\n float: right;\n }\n\n .privacy-dropdown__dropdown {\n margin-left: 0;\n margin-right: 40px;\n }\n\n .privacy-dropdown__option__icon {\n margin-left: 10px;\n margin-right: 0;\n }\n\n .detailed-status__display-name .display-name {\n text-align: right;\n }\n\n .detailed-status__display-avatar {\n margin-right: 0;\n margin-left: 10px;\n float: right;\n }\n\n .detailed-status__favorites,\n .detailed-status__reblogs {\n margin-left: 0;\n margin-right: 6px;\n }\n\n .fa-ul {\n margin-left: 2.14285714em;\n }\n\n .fa-li {\n left: auto;\n right: -2.14285714em;\n }\n\n .admin-wrapper {\n direction: rtl;\n }\n\n .admin-wrapper .sidebar ul a i.fa,\n a.table-action-link i.fa {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .simple_form .check_boxes .checkbox label {\n padding-left: 0;\n padding-right: 25px;\n }\n\n .simple_form .input.with_label.boolean label.checkbox {\n padding-left: 25px;\n padding-right: 0;\n }\n\n .simple_form .check_boxes .checkbox input[type=\"checkbox\"],\n .simple_form .input.boolean input[type=\"checkbox\"] {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.radio_buttons .radio {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.radio_buttons .radio > label {\n padding-right: 28px;\n padding-left: 0;\n }\n\n .simple_form .input-with-append .input input {\n padding-left: 142px;\n padding-right: 0;\n }\n\n .simple_form .input.boolean label.checkbox {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.boolean .label_input,\n .simple_form .input.boolean .hint {\n padding-left: 0;\n padding-right: 28px;\n }\n\n .simple_form .label_input__append {\n right: auto;\n left: 3px;\n\n &::after {\n right: auto;\n left: 0;\n background-image: linear-gradient(to left, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));\n }\n }\n\n .simple_form select {\n background: darken($ui-base-color, 10%) url(\"data:image/svg+xml;utf8,\") no-repeat left 8px center / auto 16px;\n }\n\n .table th,\n .table td {\n text-align: right;\n }\n\n .filters .filter-subset {\n margin-right: 0;\n margin-left: 45px;\n }\n\n .landing-page .header-wrapper .mascot {\n right: 60px;\n left: auto;\n }\n\n .landing-page__call-to-action .row__information-board {\n direction: rtl;\n }\n\n .landing-page .header .hero .floats .float-1 {\n left: -120px;\n right: auto;\n }\n\n .landing-page .header .hero .floats .float-2 {\n left: 210px;\n right: auto;\n }\n\n .landing-page .header .hero .floats .float-3 {\n left: 110px;\n right: auto;\n }\n\n .landing-page .header .links .brand img {\n left: 0;\n }\n\n .landing-page .fa-external-link {\n padding-right: 5px;\n padding-left: 0 !important;\n }\n\n .landing-page .features #mastodon-timeline {\n margin-right: 0;\n margin-left: 30px;\n }\n\n @media screen and (min-width: 631px) {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n\n &:first-child {\n padding-left: 5px;\n padding-right: 10px;\n }\n }\n\n .columns-area > div {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n }\n }\n }\n\n .columns-area--mobile .column,\n .columns-area--mobile .drawer {\n padding-left: 0;\n padding-right: 0;\n }\n\n .public-layout {\n .header {\n .nav-button {\n margin-left: 8px;\n margin-right: 0;\n }\n }\n\n .public-account-header__tabs {\n margin-left: 0;\n margin-right: 20px;\n }\n }\n\n .landing-page__information {\n .account__display-name {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .account__avatar-wrapper {\n margin-left: 12px;\n margin-right: 0;\n }\n }\n\n .card__bar .display-name {\n margin-left: 0;\n margin-right: 15px;\n text-align: right;\n }\n\n .fa-chevron-left::before {\n content: \"\\F054\";\n }\n\n .fa-chevron-right::before {\n content: \"\\F053\";\n }\n\n .column-back-button__icon {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .column-header__setting-arrows .column-header__setting-btn:last-child {\n padding-left: 0;\n padding-right: 10px;\n }\n\n .simple_form .input.radio_buttons .radio > label input {\n left: auto;\n right: 0;\n }\n}\n","$black-emojis: '8ball' 'ant' 'back' 'black_circle' 'black_heart' 'black_large_square' 'black_medium_small_square' 'black_medium_square' 'black_nib' 'black_small_square' 'bomb' 'bowling' 'bust_in_silhouette' 'busts_in_silhouette' 'camera' 'camera_with_flash' 'clubs' 'copyright' 'curly_loop' 'currency_exchange' 'dark_sunglasses' 'eight_pointed_black_star' 'electric_plug' 'end' 'female-guard' 'film_projector' 'fried_egg' 'gorilla' 'guardsman' 'heavy_check_mark' 'heavy_division_sign' 'heavy_dollar_sign' 'heavy_minus_sign' 'heavy_multiplication_x' 'heavy_plus_sign' 'hocho' 'hole' 'joystick' 'kaaba' 'lower_left_ballpoint_pen' 'lower_left_fountain_pen' 'male-guard' 'microphone' 'mortar_board' 'movie_camera' 'musical_score' 'on' 'registered' 'soon' 'spades' 'speaking_head_in_silhouette' 'spider' 'telephone_receiver' 'tm' 'top' 'tophat' 'turkey' 'vhs' 'video_camera' 'video_game' 'water_buffalo' 'waving_black_flag' 'wavy_dash';\n\n%white-emoji-outline {\n filter: drop-shadow(1px 1px 0 $white) drop-shadow(-1px 1px 0 $white) drop-shadow(1px -1px 0 $white) drop-shadow(-1px -1px 0 $white);\n transform: scale(.71);\n}\n\n.emojione {\n @each $emoji in $black-emojis {\n &[title=':#{$emoji}:'] {\n @extend %white-emoji-outline;\n }\n }\n}\n","// Notes!\n// Sass color functions, \"darken\" and \"lighten\" are automatically replaced.\n\nhtml {\n scrollbar-color: $ui-base-color rgba($ui-base-color, 0.25);\n}\n\n// Change the colors of button texts\n.button {\n color: $white;\n\n &.button-alternative-2 {\n color: $white;\n }\n}\n\n.status-card__actions button,\n.status-card__actions a {\n color: rgba($white, 0.8);\n\n &:hover,\n &:active,\n &:focus {\n color: $white;\n }\n}\n\n// Change default background colors of columns\n.column > .scrollable,\n.getting-started,\n.column-inline-form,\n.error-column,\n.regeneration-indicator {\n background: $white;\n border: 1px solid lighten($ui-base-color, 8%);\n border-top: 0;\n}\n\n.directory__card__img {\n background: lighten($ui-base-color, 12%);\n}\n\n.filter-form,\n.directory__card__bar {\n background: $white;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n}\n\n.scrollable .directory__list {\n width: calc(100% + 2px);\n margin-left: -1px;\n margin-right: -1px;\n}\n\n.directory__card,\n.table-of-contents {\n border: 1px solid lighten($ui-base-color, 8%);\n}\n\n.column-back-button,\n.column-header {\n background: $white;\n border: 1px solid lighten($ui-base-color, 8%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 0;\n }\n\n &--slim-button {\n top: -50px;\n right: 0;\n }\n}\n\n.column-header__back-button,\n.column-header__button,\n.column-header__button.active,\n.account__header__bar,\n.directory__card__extra {\n background: $white;\n}\n\n.column-header__button.active {\n color: $ui-highlight-color;\n\n &:hover,\n &:active,\n &:focus {\n color: $ui-highlight-color;\n background: $white;\n }\n}\n\n.account__header__bar .avatar .account__avatar {\n border-color: $white;\n}\n\n.getting-started__footer a {\n color: $ui-secondary-color;\n text-decoration: underline;\n}\n\n.confirmation-modal__secondary-button,\n.confirmation-modal__cancel-button,\n.mute-modal__cancel-button,\n.block-modal__cancel-button {\n color: lighten($ui-base-color, 26%);\n\n &:hover,\n &:focus,\n &:active {\n color: $primary-text-color;\n }\n}\n\n.column-subheading {\n background: darken($ui-base-color, 4%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n}\n\n.getting-started,\n.scrollable {\n .column-link {\n background: $white;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &:hover,\n &:active,\n &:focus {\n background: $ui-base-color;\n }\n }\n}\n\n.getting-started .navigation-bar {\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 0;\n }\n}\n\n.compose-form__autosuggest-wrapper,\n.poll__option input[type=\"text\"],\n.compose-form .spoiler-input__input,\n.compose-form__poll-wrapper select,\n.search__input,\n.setting-text,\n.box-widget input[type=\"text\"],\n.box-widget input[type=\"email\"],\n.box-widget input[type=\"password\"],\n.box-widget textarea,\n.statuses-grid .detailed-status,\n.audio-player {\n border: 1px solid lighten($ui-base-color, 8%);\n}\n\n.search__input {\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 0;\n border-bottom: 0;\n }\n}\n\n.list-editor .search .search__input {\n border-top: 0;\n border-bottom: 0;\n}\n\n.compose-form__poll-wrapper select {\n background: $simple-background-color url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center / auto 16px;\n}\n\n.compose-form__poll-wrapper,\n.compose-form__poll-wrapper .poll__footer {\n border-top-color: lighten($ui-base-color, 8%);\n}\n\n.notification__filter-bar {\n border: 1px solid lighten($ui-base-color, 8%);\n border-top: 0;\n}\n\n.compose-form .compose-form__buttons-wrapper {\n background: $ui-base-color;\n border: 1px solid lighten($ui-base-color, 8%);\n border-top: 0;\n}\n\n.drawer__header,\n.drawer__inner {\n background: $white;\n border: 1px solid lighten($ui-base-color, 8%);\n}\n\n.drawer__inner__mastodon {\n background: $white url('data:image/svg+xml;utf8,') no-repeat bottom / 100% auto;\n}\n\n// Change the colors used in compose-form\n.compose-form {\n .compose-form__modifiers {\n .compose-form__upload__actions .icon-button {\n color: lighten($white, 7%);\n\n &:active,\n &:focus,\n &:hover {\n color: $white;\n }\n }\n\n .compose-form__upload-description input {\n color: lighten($white, 7%);\n\n &::placeholder {\n color: lighten($white, 7%);\n }\n }\n }\n\n .compose-form__buttons-wrapper {\n background: darken($ui-base-color, 6%);\n }\n\n .autosuggest-textarea__suggestions {\n background: darken($ui-base-color, 6%);\n }\n\n .autosuggest-textarea__suggestions__item {\n &:hover,\n &:focus,\n &:active,\n &.selected {\n background: lighten($ui-base-color, 4%);\n }\n }\n}\n\n.emoji-mart-bar {\n border-color: lighten($ui-base-color, 4%);\n\n &:first-child {\n background: darken($ui-base-color, 6%);\n }\n}\n\n.emoji-mart-search input {\n background: rgba($ui-base-color, 0.3);\n border-color: $ui-base-color;\n}\n\n// Change the background colors of statuses\n.focusable:focus {\n background: $ui-base-color;\n}\n\n.status.status-direct {\n background: lighten($ui-base-color, 4%);\n}\n\n.focusable:focus .status.status-direct {\n background: lighten($ui-base-color, 8%);\n}\n\n.detailed-status,\n.detailed-status__action-bar {\n background: $white;\n}\n\n// Change the background colors of status__content__spoiler-link\n.reply-indicator__content .status__content__spoiler-link,\n.status__content .status__content__spoiler-link {\n background: $ui-base-color;\n\n &:hover {\n background: lighten($ui-base-color, 4%);\n }\n}\n\n// Change the background colors of media and video spoilers\n.media-spoiler,\n.video-player__spoiler {\n background: $ui-base-color;\n}\n\n.privacy-dropdown.active .privacy-dropdown__value.active .icon-button {\n color: $white;\n}\n\n.account-gallery__item a {\n background-color: $ui-base-color;\n}\n\n// Change the colors used in the dropdown menu\n.dropdown-menu {\n background: $white;\n\n &__arrow {\n &.left {\n border-left-color: $white;\n }\n\n &.top {\n border-top-color: $white;\n }\n\n &.bottom {\n border-bottom-color: $white;\n }\n\n &.right {\n border-right-color: $white;\n }\n }\n\n &__item {\n a {\n background: $white;\n color: $darker-text-color;\n }\n }\n}\n\n// Change the text colors on inverted background\n.privacy-dropdown__option.active,\n.privacy-dropdown__option:hover,\n.privacy-dropdown__option.active .privacy-dropdown__option__content,\n.privacy-dropdown__option.active .privacy-dropdown__option__content strong,\n.privacy-dropdown__option:hover .privacy-dropdown__option__content,\n.privacy-dropdown__option:hover .privacy-dropdown__option__content strong,\n.dropdown-menu__item a:active,\n.dropdown-menu__item a:focus,\n.dropdown-menu__item a:hover,\n.actions-modal ul li:not(:empty) a.active,\n.actions-modal ul li:not(:empty) a.active button,\n.actions-modal ul li:not(:empty) a:active,\n.actions-modal ul li:not(:empty) a:active button,\n.actions-modal ul li:not(:empty) a:focus,\n.actions-modal ul li:not(:empty) a:focus button,\n.actions-modal ul li:not(:empty) a:hover,\n.actions-modal ul li:not(:empty) a:hover button,\n.admin-wrapper .sidebar ul .simple-navigation-active-leaf a,\n.simple_form .block-button,\n.simple_form .button,\n.simple_form button {\n color: $white;\n}\n\n.dropdown-menu__separator {\n border-bottom-color: lighten($ui-base-color, 4%);\n}\n\n// Change the background colors of modals\n.actions-modal,\n.boost-modal,\n.confirmation-modal,\n.mute-modal,\n.block-modal,\n.report-modal,\n.embed-modal,\n.error-modal,\n.onboarding-modal,\n.report-modal__comment .setting-text__wrapper,\n.report-modal__comment .setting-text {\n background: $white;\n border: 1px solid lighten($ui-base-color, 8%);\n}\n\n.report-modal__comment {\n border-right-color: lighten($ui-base-color, 8%);\n}\n\n.report-modal__container {\n border-top-color: lighten($ui-base-color, 8%);\n}\n\n.column-header__collapsible-inner {\n background: darken($ui-base-color, 4%);\n border: 1px solid lighten($ui-base-color, 8%);\n border-top: 0;\n}\n\n.focal-point__preview strong {\n color: $white;\n}\n\n.boost-modal__action-bar,\n.confirmation-modal__action-bar,\n.mute-modal__action-bar,\n.block-modal__action-bar,\n.onboarding-modal__paginator,\n.error-modal__footer {\n background: darken($ui-base-color, 6%);\n\n .onboarding-modal__nav,\n .error-modal__nav {\n &:hover,\n &:focus,\n &:active {\n background-color: darken($ui-base-color, 12%);\n }\n }\n}\n\n.display-case__case {\n background: $white;\n}\n\n.embed-modal .embed-modal__container .embed-modal__html {\n background: $white;\n border: 1px solid lighten($ui-base-color, 8%);\n\n &:focus {\n border-color: lighten($ui-base-color, 12%);\n background: $white;\n }\n}\n\n.react-toggle-track {\n background: $ui-secondary-color;\n}\n\n.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track {\n background: darken($ui-secondary-color, 10%);\n}\n\n.react-toggle.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track {\n background: lighten($ui-highlight-color, 10%);\n}\n\n// Change the default color used for the text in an empty column or on the error column\n.empty-column-indicator,\n.error-column {\n color: $primary-text-color;\n background: $white;\n}\n\n.tabs-bar {\n background: $white;\n border: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 0;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 0;\n }\n\n &__link {\n padding-bottom: 14px;\n border-bottom-width: 1px;\n border-bottom-color: lighten($ui-base-color, 8%);\n\n &:hover,\n &:active,\n &:focus {\n background: $ui-base-color;\n }\n\n &.active {\n &:hover,\n &:active,\n &:focus {\n background: transparent;\n border-bottom-color: $ui-highlight-color;\n }\n }\n }\n}\n\n// Change the default colors used on some parts of the profile pages\n.activity-stream-tabs {\n background: $account-background-color;\n border-bottom-color: lighten($ui-base-color, 8%);\n}\n\n.box-widget,\n.nothing-here,\n.page-header,\n.directory__tag > a,\n.directory__tag > div,\n.landing-page__call-to-action,\n.contact-widget,\n.landing .hero-widget__text,\n.landing-page__information.contact-widget {\n background: $white;\n border: 1px solid lighten($ui-base-color, 8%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-left: 0;\n border-right: 0;\n border-top: 0;\n }\n}\n\n.landing .hero-widget__text {\n border-top: 0;\n border-bottom: 0;\n}\n\n.simple_form {\n input[type=text],\n input[type=number],\n input[type=email],\n input[type=password],\n textarea {\n &:hover {\n border-color: lighten($ui-base-color, 12%);\n }\n }\n}\n\n.landing .hero-widget__footer {\n background: $white;\n border: 1px solid lighten($ui-base-color, 8%);\n border-top: 0;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border: 0;\n }\n}\n\n.brand__tagline {\n color: $ui-secondary-color;\n}\n\n.directory__tag > a {\n &:hover,\n &:active,\n &:focus {\n background: $ui-base-color;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border: 0;\n }\n}\n\n.directory__tag.active > a,\n.directory__tag.active > div {\n border-color: $ui-highlight-color;\n\n &,\n h4,\n h4 small,\n .fa,\n .trends__item__current {\n color: $white;\n }\n\n &:hover,\n &:active,\n &:focus {\n background: $ui-highlight-color;\n }\n}\n\n.batch-table {\n &__toolbar,\n &__row,\n .nothing-here {\n border-color: lighten($ui-base-color, 8%);\n }\n}\n\n.activity-stream {\n border: 1px solid lighten($ui-base-color, 8%);\n\n &--under-tabs {\n border-top: 0;\n }\n\n .entry {\n background: $account-background-color;\n\n .detailed-status.light,\n .more.light,\n .status.light {\n border-bottom-color: lighten($ui-base-color, 8%);\n }\n }\n\n .status.light {\n .status__content {\n color: $primary-text-color;\n }\n\n .display-name {\n strong {\n color: $primary-text-color;\n }\n }\n }\n}\n\n.accounts-grid {\n .account-grid-card {\n .controls {\n .icon-button {\n color: $darker-text-color;\n }\n }\n\n .name {\n a {\n color: $primary-text-color;\n }\n }\n\n .username {\n color: $darker-text-color;\n }\n\n .account__header__content {\n color: $primary-text-color;\n }\n }\n}\n\n.simple_form,\n.table-form {\n .warning {\n box-shadow: none;\n background: rgba($error-red, 0.5);\n text-shadow: none;\n }\n\n .recommended {\n border-color: $ui-highlight-color;\n color: $ui-highlight-color;\n background-color: rgba($ui-highlight-color, 0.1);\n }\n}\n\n.compose-form .compose-form__warning {\n border-color: $ui-highlight-color;\n background-color: rgba($ui-highlight-color, 0.1);\n\n &,\n a {\n color: $ui-highlight-color;\n }\n}\n\n.status__content,\n.reply-indicator__content {\n a {\n color: $highlight-text-color;\n }\n}\n\n.button.logo-button {\n color: $white;\n\n svg {\n fill: $white;\n }\n}\n\n.public-layout {\n .account__section-headline {\n border: 1px solid lighten($ui-base-color, 8%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 0;\n }\n }\n\n .header,\n .public-account-header,\n .public-account-bio {\n box-shadow: none;\n }\n\n .public-account-bio,\n .hero-widget__text {\n background: $account-background-color;\n border: 1px solid lighten($ui-base-color, 8%);\n }\n\n .header {\n background: $ui-base-color;\n border: 1px solid lighten($ui-base-color, 8%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border: 0;\n }\n\n .brand {\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 4%);\n }\n }\n }\n\n .public-account-header {\n &__image {\n background: lighten($ui-base-color, 12%);\n\n &::after {\n box-shadow: none;\n }\n }\n\n &__bar {\n &::before {\n background: $account-background-color;\n border: 1px solid lighten($ui-base-color, 8%);\n border-top: 0;\n }\n\n .avatar img {\n border-color: $account-background-color;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n background: $account-background-color;\n border: 1px solid lighten($ui-base-color, 8%);\n border-top: 0;\n }\n }\n\n &__tabs {\n &__name {\n h1,\n h1 small {\n color: $white;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n color: $primary-text-color;\n }\n }\n }\n }\n\n &__extra {\n .public-account-bio {\n border: 0;\n }\n\n .public-account-bio .account__header__fields {\n border-color: lighten($ui-base-color, 8%);\n }\n }\n }\n}\n\n.notification__filter-bar button.active::after,\n.account__section-headline a.active::after {\n border-color: transparent transparent $white;\n}\n\n.hero-widget,\n.box-widget,\n.contact-widget,\n.landing-page__information.contact-widget,\n.moved-account-widget,\n.memoriam-widget,\n.activity-stream,\n.nothing-here,\n.directory__tag > a,\n.directory__tag > div,\n.card > a,\n.page-header,\n.compose-form .compose-form__warning {\n box-shadow: none;\n}\n\n.audio-player .video-player__controls button,\n.audio-player .video-player__time-sep,\n.audio-player .video-player__time-current,\n.audio-player .video-player__time-total {\n color: $primary-text-color;\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/packs/skins/vanilla/mastodon-light/common.js b/priv/static/packs/skins/vanilla/mastodon-light/common.js index 6acf14a24..18bbb7f3b 100644 Binary files a/priv/static/packs/skins/vanilla/mastodon-light/common.js and b/priv/static/packs/skins/vanilla/mastodon-light/common.js differ diff --git a/priv/static/packs/skins/vanilla/win95/common.css b/priv/static/packs/skins/vanilla/win95/common.css index 061d665f0..9e1c6e9e0 100644 Binary files a/priv/static/packs/skins/vanilla/win95/common.css and b/priv/static/packs/skins/vanilla/win95/common.css differ diff --git a/priv/static/packs/skins/vanilla/win95/common.css.map b/priv/static/packs/skins/vanilla/win95/common.css.map index 7edf53558..74f240491 100644 --- a/priv/static/packs/skins/vanilla/win95/common.css.map +++ b/priv/static/packs/skins/vanilla/win95/common.css.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///common.scss","webpack:///./app/javascript/styles/win95.scss","webpack:///./app/javascript/styles/mastodon/reset.scss","webpack:///./app/javascript/styles/mastodon/variables.scss","webpack:///./app/javascript/styles/mastodon/basics.scss","webpack:///./app/javascript/styles/mastodon/containers.scss","webpack:///./app/javascript/styles/mastodon/lists.scss","webpack:///./app/javascript/styles/mastodon/footer.scss","webpack:///./app/javascript/styles/mastodon/compact_header.scss","webpack:///./app/javascript/styles/mastodon/widgets.scss","webpack:///./app/javascript/styles/mastodon/forms.scss","webpack:///./app/javascript/styles/mastodon/accounts.scss","webpack:///./app/javascript/styles/mastodon/statuses.scss","webpack:///./app/javascript/styles/mastodon/boost.scss","webpack:///./app/javascript/styles/mastodon/components.scss","webpack:///","webpack:///./app/javascript/styles/mastodon/_mixins.scss","webpack:///./app/javascript/styles/mastodon/polls.scss","webpack:///./app/javascript/styles/mastodon/modal.scss","webpack:///./app/javascript/styles/mastodon/emoji_picker.scss","webpack:///./app/javascript/styles/mastodon/about.scss","webpack:///./app/javascript/styles/mastodon/tables.scss","webpack:///./app/javascript/styles/mastodon/admin.scss","webpack:///./app/javascript/styles/mastodon/dashboard.scss","webpack:///./app/javascript/styles/mastodon/rtl.scss","webpack:///./app/javascript/styles/mastodon/accessibility.scss"],"names":[],"mappings":"AAAA,WCwEA,wBACE,+DACA,4ZCrEF,QAaE,UACA,SACA,eACA,aACA,wBACA,+EAIF,aAEE,MAGF,aACE,OAGF,eACE,cAGF,WACE,qDAGF,UAEE,aACA,OAGF,wBACE,iBACA,MAGF,sCACE,qBAGF,UACE,YACA,2BAGF,kBACE,cACA,mBACA,iCAGF,kBACE,kCAGF,kBACE,2BAGF,aACE,gBACA,0BACA,CCtEW,iED6Eb,kBC7Ea,4BDiFb,sBACE,MErFF,iDACE,mBACA,CACA,gBACA,gBACA,WDXM,kCCaN,6BACA,8BACA,CADA,0BACA,CADA,yBACA,CADA,qBACA,0CACA,wCACA,kBAEA,iKAYE,eAGF,SACE,oCAEA,WACE,iBACA,kBACA,uCAGF,iBACE,WACA,YACA,mCAGF,iBACE,cAIJ,kBD7CW,kBCiDX,iBACE,kBACA,0BAEA,iBACE,aAIJ,iBACE,YAGF,kBACE,SACA,iBACA,uBAEA,iBACE,WACA,YACA,gBACA,YAIJ,kBACE,UACA,YAGF,iBACE,kBACA,cD3EoB,mBAPX,WCqFT,YACA,UACA,aACA,uBACA,mBACA,oBAEA,qBACE,YACA,sCAGE,aACE,gBACA,WACA,YACA,kBACA,uBAIJ,cACE,iBACA,gBACA,QAMR,mBACE,eACA,cAEA,YACE,kDAKF,YAGE,WACA,mBACA,uBACA,oBACA,sBAGF,YACE,yEAKF,gBAEE,+EAKF,WAEE,sCAIJ,qBAEE,eACA,gBACA,gBACA,cACA,kBACA,8CAEA,eACE,0CAGF,mBACE,gEAEA,eACE,0CAIJ,aHlLoB,kKGqLlB,oBAGE,sDAIJ,aH9LgB,eGgMd,0DAEA,aHlMc,oDGuMhB,cACE,SACA,uBACA,cH1Mc,aG4Md,UACA,SACA,oBACA,eACA,UACA,4BACA,0BACA,gMAEA,oBAGE,kEAGF,aD9NY,gBCgOV,gBCnON,WACE,CACA,kBACA,qCAEA,eALF,UAMI,SACA,kBAIJ,sBACE,qCAEA,gBAHF,kBAII,qBAGF,YACE,uBACA,mBACA,wBAEA,SFrBI,YEuBF,kBACA,sBAGF,YACE,uBACA,mBACA,WF9BE,qBEgCF,UACA,kBACA,iBACA,6CACA,gBACA,eACA,mCAMJ,WACE,CACA,cACA,mBACA,sBACA,qCAEA,kCAPF,UAQI,aACA,aACA,kBAKN,WACE,CACA,YACA,eACA,iBACA,sBACA,CACA,gBACA,CACA,sBACA,qCAEA,gBAZF,UAaI,CACA,eACA,CACA,mBACA,0BAGF,UACE,YACA,iBACA,6BAEA,UACE,YACA,cACA,SACA,kBACA,uBAIJ,aACE,cF7EsB,wBE+EtB,iCAEA,aACE,gBACA,uBACA,gBACA,8BAIJ,aACE,eACA,iBACA,gBACA,SAIJ,YACE,cACA,8BACA,sBACA,mCACA,CADA,0BACA,mBAEA,eACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,eACE,WACA,qCAGF,QA3BF,UA4BI,qCACA,mBAEA,aACE,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,UAKN,YACE,cACA,8CACA,sBACA,mCACA,CADA,0BACA,mBAEA,eACE,WACA,mBAGF,eACE,WACA,mBAGF,aACE,WACA,mBAGF,eACE,WACA,mBAGF,aACE,WACA,uCAGF,eACE,wBAGF,kBACE,qCAGF,QAxCF,iDAyCI,uCAEA,YACE,aACA,mBACA,uBACA,iCAGF,UACE,uBACA,mBACA,sBAGF,YACE,sCAIJ,QA7DF,UA8DI,qCACA,mBAEA,aACE,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,sCAMJ,eADF,gBAEI,4BAGF,eACE,qCAEA,0BAHF,SAII,yBAIJ,kBACE,mCACA,kBACA,YACA,cACA,aACA,oBACA,uBACA,iBACA,gBACA,qCAEA,uBAZF,cAaI,WACA,MACA,OACA,SACA,gBACA,gBACA,YACA,6BAGF,cACE,eACA,kCAGF,YACE,oBACA,2BACA,iBACA,oCAGF,YACE,oBACA,uBACA,iBACA,mCAGF,YACE,oBACA,yBACA,iBACA,+BAGF,aACE,aACA,mCAEA,aACE,YACA,WACA,kBACA,YACA,UFxUA,qCE2UA,kCARF,WASI,+GAIJ,kBAGE,kCAIJ,YACE,mBACA,eACA,eACA,gBACA,qBACA,cF7UkB,mBE+UlB,kBACA,uHAEA,yBAGE,WFrWA,qCEyWF,0CACE,YACE,qCAKN,kBACE,CACA,oBACA,kBACA,6HAEA,oBAGE,mBACA,sBAON,YACE,cACA,0DACA,sBACA,mCACA,CADA,0BACA,gCAEA,UACE,cACA,gCAGF,UACE,cACA,qCAGF,qBAjBF,0BAkBI,WACA,gCAEA,YACE,kCAKN,iBACE,qCAEA,gCAHF,eAII,sCAKF,4BADF,eAEI,wCAIJ,eACE,mBACA,mCACA,gDAEA,UACE,qIAEA,8BAEE,CAFF,sBAEE,6DAGF,wBFtaoB,8CE2atB,yBACE,gBACA,aACA,kBACA,gBACA,oDAEA,UACE,cACA,kBACA,WACA,YACA,gDACA,MACA,OACA,kDAGF,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,0BACA,qCAGF,6CA3BF,YA4BI,gDAIJ,eACE,6JAEA,iBAEE,qCAEA,4JAJF,eAKI,sCAKN,sCA/DF,eAgEI,gBACA,oDAEA,YACE,+FAGF,eAEE,6CAIJ,iBACE,iBACA,aACA,2BACA,mDAEA,UACE,cACA,mBACA,kBACA,SACA,OACA,QACA,YACA,0BACA,WACA,oDAGF,aACE,YACA,aACA,kBACA,cACA,wDAEA,aACE,WACA,YACA,SACA,kBACA,yBACA,mBACA,qCAIJ,2CArCF,YAsCI,mBACA,0BACA,YACA,mDAEA,YACE,oDAGF,UACE,YACA,CACA,sBACA,wDAEA,QACE,kBACA,2DAGF,mDAXF,YAYI,sCAKN,2CAhEF,eAiEI,sCAGF,2CApEF,cAqEI,8CAIJ,aACE,iBACA,mDAEA,gBACE,mBACA,sDAEA,cACE,iBACA,WF1kBF,gBE4kBE,gBACA,mBACA,uBACA,6BACA,4DAEA,aACE,eACA,WFplBJ,gBEslBI,gBACA,uBACA,qCAKN,4CA7BF,gBA8BI,aACA,8BACA,mBACA,mDAEA,aACE,iBACA,sDAEA,cACE,iBACA,iBACA,4DAEA,aF5lBY,oDEmmBlB,YACE,2BACA,oBACA,YACA,qEAEA,YACE,mBACA,gBACA,qCAGF,oEACE,YACE,6DAIJ,eACE,sBACA,cACA,cFxnBc,aE0nBd,+BACA,eACA,kBACA,kBACA,8DAEA,aACE,uEAGF,cACE,kEAGF,aACE,WACA,kBACA,SACA,OACA,WACA,gCACA,WACA,wBACA,yEAIA,+BACE,UACA,kFAGF,2BFzpBc,wEE+pBd,SACE,wBACA,8DAIJ,oBACE,cACA,2EAGF,cACE,cACA,4EAGF,eACE,eACA,kBACA,WFnsBJ,6CEqsBI,2DAIJ,aACE,WACA,4DAGF,eACE,8CAKN,YACE,eACA,kEAEA,eACE,gBACA,uBACA,cACA,2FAEA,4BACE,yEAGF,YACE,qDAIJ,gBACE,eACA,cFztBgB,uDE4tBhB,oBACE,cF7tBc,qBE+tBd,aACA,gBACA,8DAEA,eACE,WFpvBJ,qCE0vBF,6CAtCF,aAuCI,UACA,4CAKN,yBACE,qCAEA,0CAHF,eAII,wCAIJ,eACE,oCAGF,kBACE,mCACA,kBACA,gBACA,mBACA,qCAEA,mCAPF,eAQI,gBACA,gBACA,8DAGF,QACE,aACA,+DAEA,aACE,sFAGF,uBACE,yEAGF,aFryBU,8DE2yBV,mBACA,WF7yBE,qFEizBJ,YAEE,eACA,cFpyBkB,2CEwyBpB,gBACE,iCAIJ,YACE,cACA,kDACA,qCAEA,gCALF,aAMI,+CAGF,cACE,iCAIJ,eACE,2BAGF,YACE,eACA,eACA,cACA,+BAEA,qBACE,cACA,YACA,cACA,mBACA,kBACA,qCAEA,8BARF,aASI,sCAGF,8BAZF,cAaI,sCAIJ,0BAvBF,QAwBI,6BACA,+BAEA,UACE,UACA,gBACA,gCACA,0CAEA,eACE,0CAGF,kBF32BK,+IE82BH,kBAGE,WC53BZ,eACE,aAEA,oBACE,aACA,iBAIJ,eACE,cACA,oBAEA,cACE,gBACA,mBACA,wBCfF,eACE,iBACA,oBACA,eACA,cACA,qCAEA,uBAPF,iBAQI,mBACA,+BAGF,YACE,cACA,0CACA,wCAEA,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,kBACA,6CAEA,aACE,wCAIJ,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,qCAGF,6BAxCF,iCAyCI,+EAEA,aAEE,wCAGF,UACE,wCAGF,aACE,+EAGF,aAEE,wCAGF,UACE,sCAIJ,uCACE,aACE,sCAIJ,4JACE,YAIE,4BAKN,eACE,kBACA,cJ/EkB,6BIkFlB,aACE,qBACA,6BAIJ,oBACE,cACA,wGAEA,yBAGE,mCAKF,aACE,YACA,WACA,cACA,aACA,0HAMA,YACE,oBCjIR,cACE,iBACA,cLeoB,gBKbpB,mBACA,eACA,qBACA,qCAEA,mBATF,iBAUI,oBACA,uBAGF,aACE,qBACA,0BAGF,eACE,cLFoB,wBKMtB,oBACE,mBACA,kBACA,WACA,YACA,cC9BN,kBACE,mCACA,mBAEA,UACE,kBACA,gBACA,0BACA,gBNPI,uBMUJ,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,0BACA,oBAIJ,kBNVW,aMYT,0BACA,eACA,cNPoB,iBMSpB,qBACA,gBACA,8BAEA,UACE,YACA,gBACA,sBAGF,kBACE,iCAEA,eACE,uBAIJ,cACE,SACA,UACA,gBACA,uBACA,oBACA,kBACA,oBACA,cACA,sBAGF,aNtCsB,qBMwCpB,4BAEA,yBACE,qCAKN,aAnEF,YAoEI,uBAIJ,kBACE,oBACA,yBAEA,YACE,gBACA,eACA,cN7DoB,+BMiEtB,cACE,0CAEA,eACE,sDAGF,YACE,mBACA,gDAGF,UACE,YACA,0BACA,oCAIJ,YACE,mBAKF,aN1FsB,aM+FxB,YACE,kBACA,mBNxGW,mCM0GX,qBAGF,YACE,kBACA,0BACA,kBACA,cN1GsB,mBM4GtB,iBAGF,eACE,eACA,cNjHsB,iBMmHtB,qBACA,gBACA,UACA,oBAEA,YACE,gBACA,eACA,cN3HoB,0BM+HtB,eACE,CACA,kBACA,mBAGF,oBACE,CACA,mBACA,cNxIoB,qBM0IpB,mBACA,gBACA,uBACA,0EAEA,yBAGE,uBAMJ,sBACA,kBACA,mBNjKW,mCMmKX,cN3JwB,gBM6JxB,mBACA,sDAEA,eAEE,CAII,qXADF,eACE,yBAKN,aACE,0BACA,CAMI,wLAGF,oBAGE,mIAEA,yBACE,gCAMR,kBACE,oCAEA,gBACE,cNvMkB,8DM6MpB,iBACE,eACA,4DAGF,eACE,qBACA,iEAEA,eACE,kBAMR,YACE,CACA,eNhPM,CMkPN,cACA,cNlOsB,mBMoOtB,+BANA,iBACA,CNhPM,kCM8PN,CATA,aAGF,kBACE,CAEA,iBACA,kBACA,cACA,iBAEA,UN/PM,eMiQJ,gBACA,gBACA,mBACA,gBAGF,cACE,cNxPoB,qCM4PtB,aArBF,YAsBI,mBACA,iBAEA,cACE,aAKN,kBN7Qa,kBM+QX,mCACA,iBAEA,qBACE,mBACA,uCAEA,YAEE,mBACA,8BACA,mBN1RO,kBM4RP,aACA,qBACA,cACA,mCACA,0EAIA,kBAGE,0BAIJ,kBR9SkB,eQgThB,8BAGF,UACE,eACA,oBAGF,aACE,eACA,gBACA,WNjUE,mBMmUF,gBACA,uBACA,wBAEA,aNvTkB,0BM2TlB,aACE,gBACA,eACA,eACA,cN/TgB,0IMqUlB,UNrVE,+BM6VJ,aACE,YACA,uDAGF,oBR5VkB,wCQgWlB,eACE,eAKN,YACE,yBACA,gCAEA,aACE,WACA,YACA,kBACA,kBACA,kBACA,mBACA,yBACA,4CAEA,SACE,6CAGF,SACE,6CAGF,SACE,iBAKN,UACE,0BAEA,SACE,SACA,wBAGF,eACE,0BAGF,iBACE,cNrYoB,gBMuYpB,aACA,sCAEA,eACE,0BAIJ,cACE,sBACA,gCACA,wCAGF,eACE,wBAGF,WACE,kBACA,eACA,gBACA,WN7aI,8BMgbJ,aACE,cNjakB,gBMmalB,eACA,0BAIJ,SACE,iCACA,qCAGF,kCACE,YACE,sCAYJ,qIAPF,eAQI,gBACA,gBACA,iBAOJ,gBACE,qCAEA,eAHF,oBAII,uBAGF,sBACE,sCAEA,qBAHF,sBAII,sCAGF,qBAPF,UAQI,sCAGF,qBAXF,WAYI,kCAIJ,iBACE,qCAEA,gCAHF,4BAII,iEAIA,eACE,0DAGF,cACE,iBACA,oEAEA,UACE,YACA,gBACA,yFAGF,gBACE,SACA,mKAIJ,eAGE,gBAON,aNlgBsB,iCMigBxB,kBAKI,6BAEA,eACE,kBAIJ,cACE,iBACA,wCAMF,oBACE,gBACA,cRjiBkB,4JQoiBlB,yBAGE,oBAKN,kBACE,gBACA,eACA,kBACA,yBAEA,aACE,gBACA,aACA,CACA,kBACA,gBACA,uBACA,qBACA,WNhkBI,gCMkkBJ,4FAEA,yBAGE,oCAIJ,eACE,0BAGF,iBACE,gCACA,MCjlBJ,+CACE,gBACA,iBAGF,eACE,aACA,cACA,qBAIA,kBACE,gBACA,4BAEA,QACE,0CAIA,kBACE,qDAEA,eACE,gDAIJ,iBACE,kBACA,sDAEA,iBACE,SACA,OACA,6BAKN,iBACE,gBACA,gDAEA,mBACE,eACA,gBACA,WPhDA,cOkDA,WACA,4EAGF,iBAEE,mDAGF,eACE,4CAGF,iBACE,QACA,OACA,qCAGF,aT/DgB,0BSiEd,gIAEA,oBAGE,0CAIJ,iBACE,CACA,iBACA,mBAKN,YACE,cACA,0BAEA,qBACE,cACA,UACA,cACA,oBAIJ,aPpFsB,sBOuFpB,aTjGkB,yBSqGlB,iBACE,kBACA,gBACA,uBAGF,eACE,iBACA,sBAIJ,kBACE,wBAGF,aACE,eACA,eACA,qBAGF,kBACE,cPlHoB,iCOqHpB,iBACE,eACA,iBACA,gBACA,gBACA,oBAIJ,kBACE,qBAGF,eACE,CAII,0JADF,eACE,sDAMJ,YACE,4DAEA,mBACE,eACA,WPlKA,gBOoKA,gBACA,cACA,wHAGF,aAEE,sDAIJ,cACE,kBACA,mDAKF,mBACE,eACA,WPxLE,cO0LF,kBACA,qBACA,gBACA,sCAGF,cACE,mCAGF,UACE,sCAIJ,cACE,4CAEA,mBACE,eACA,WP9ME,cOgNF,gBACA,gBACA,4CAGF,kBACE,yCAGF,cACE,CADF,cACE,6BAIJ,oBACE,cACA,4BAGF,kBACE,8CAEA,eACE,0BAIJ,YACE,CACA,eACA,oBACA,iCAEA,cACE,kCAGF,qBACE,eACA,cACA,eACA,oCAEA,aACE,2CAGF,eACE,6GAIJ,eAEE,qCAGF,yBA9BF,aA+BI,gBACA,kCAEA,cACE,0JAGF,kBAGE,iDAKN,iBACE,oBACA,eACA,WP5RI,cO8RJ,WACA,2CAKE,mBACE,eACA,WPtSA,qBOwSA,WACA,kBACA,gBACA,kBACA,cACA,0DAGF,iBACE,OACA,QACA,SACA,kDAKN,cACE,aACA,yBACA,kBACA,sJAGF,qBAKE,eACA,WPtUI,cOwUJ,WACA,UACA,oBACA,gBACA,mBACA,sBACA,kBACA,aACA,6RAEA,aACE,CAHF,+OAEA,aACE,CAHF,mQAEA,aACE,CAHF,wQAEA,aACE,CAHF,sNAEA,aACE,8LAGF,eACE,oVAGF,oBACE,iOAGF,oBP7VY,oLOiWZ,iBACE,4WAGF,oBThWkB,mBSmWhB,6CAKF,aACE,gUAGF,oBAME,8CAGF,aACE,gBACA,cACA,eACA,8BAIJ,UACE,uBAGF,eACE,aACA,oCAEA,YACE,mBACA,qEAIJ,aAGE,WACA,SACA,kBACA,mBTjZkB,WENd,eO0ZJ,oBACA,YACA,aACA,qBACA,kBACA,sBACA,eACA,gBACA,UACA,mBACA,kBACA,sGAEA,cACE,uFAGF,qBACE,gLAGF,qBAEE,kHAGF,wBPpaoB,gGOwapB,kBPtbQ,kHOybN,wBACE,sOAGF,wBAEE,qBAKN,uBACE,CADF,oBACE,CADF,eACE,sBACA,eACA,WPzcI,cO2cJ,WACA,UACA,oBACA,gBACA,wXACA,sBACA,kBACA,kBACA,mBACA,YACA,iBAGF,4BACE,oCAIA,iBACE,mCAGF,iBACE,UACA,QACA,CACA,qBACA,eACA,cTneY,oBSqeZ,oBACA,eACA,gBACA,mBACA,gBACA,yCAEA,UACE,cACA,kBACA,MACA,QACA,WACA,UACA,8DACA,4BAKN,iBACE,0CAEA,wBACE,CADF,gBACE,qCAGF,iBACE,MACA,OACA,WACA,YACA,aACA,uBACA,mBACA,8BACA,kBACA,iBACA,gBACA,YACA,8CAEA,iBACE,6HAGE,UPvhBF,aOiiBR,aACE,CACA,kBACA,eACA,gBAGF,kBACE,cPzhBsB,kBO2hBtB,kBACA,mBACA,kBACA,uBAEA,qCACE,iCACA,cPjjBY,sBOqjBd,mCACE,+BACA,cPtjBQ,kBO0jBV,oBACE,cP7iBoB,qBO+iBpB,wBAEA,UPjkBI,0BOmkBF,kBAIJ,kBACE,4BAGF,SACE,sBACA,cACA,WACA,SACA,aACA,gDACA,mBPzkBS,WATL,eOqlBJ,SACA,8CAEA,QACE,iHAGF,mBAGE,kCAGF,kBACE,uBAIJ,eACE,CAII,oKADF,eACE,0DAKN,eAzEF,eA0EI,eAIJ,eACE,kBACA,gBAEA,aP1mBsB,qBO4mBpB,sBAEA,yBACE,YAKN,eACE,mBACA,eACA,eAEA,oBACE,kBACA,cAGF,aTxoBoB,qBS0oBlB,gBACA,2DAEA,aAGE,8BAKN,kBAEE,cP7oBsB,oCOgpBtB,cACE,mBACA,kBACA,4CAGF,aPrpBwB,gBOupBtB,CAII,mUADF,eACE,0DAKN,6BAtBF,eAuBI,cAIJ,YACE,eACA,uBACA,UAGF,aACE,gBP7rBM,YO+rBN,qBACA,mCACA,qBACA,cAEA,aACE,SACA,iBAIJ,kBACE,cP1rBwB,WO4rBxB,sBAEA,aACE,eACA,eAKF,kBACE,sBAEA,eACE,CAII,+JADF,eACE,4CASR,qBACE,8BACA,WPzuBI,qCO2uBJ,oCACA,kBACA,aACA,mBACA,gDAEA,UAEE,oLAEA,oBAGE,0DAIJ,eACE,cACA,kBACA,CAII,yYADF,eACE,kEAIJ,eACE,oBAMR,YACE,eACA,mBACA,4DAEA,aAEE,6BAIA,wBACA,cACA,sBAIJ,iBACE,cPhxBsB,0BOmxBtB,iBACE,oBAIJ,eACE,mBACA,uBAEA,cACE,WP7yBI,kBO+yBJ,mBACA,SACA,UACA,4BAGF,aACE,eAIJ,aPvzBc,0SOi0BZ,+CACE,aAIJ,kBACE,sBACA,kBACA,aACA,mBACA,kBACA,kBACA,QACA,mCACA,sBAEA,aACE,8BAGF,sBACE,SACA,aACA,eACA,gDACA,oBAGF,aACE,WACA,oBACA,gBACA,eACA,CACA,oBACA,WACA,iCACA,oBAGF,oBP32Bc,gBO62BZ,2BAEA,kBP/2BY,gBOi3BV,oBAKN,kBACE,6BAEA,wBACE,mBACA,eACA,aACA,4BAGF,kBACE,aACA,OACA,sBACA,cACA,cACA,gCAEA,iBACE,YACA,iBACA,kBACA,UACA,8BAGF,qBACE,qCAIJ,kBACE,gCAGF,wBACE,mCACA,kBACA,kBACA,kBACA,kBACA,sCAEA,wBACE,WACA,cACA,YACA,SACA,kBACA,MACA,UACA,yBAIJ,sBACE,aACA,mBACA,SCl7BF,aACE,qBACA,cACA,mCACA,qCAEA,QANF,eAOI,8EAMA,kBACE,YAKN,YACE,kBACA,gBACA,0BACA,gBAEA,aACE,WACA,YACA,SACA,oBACA,CADA,8BACA,CADA,gBACA,0BACA,qCAGF,WAfF,YAgBI,sCAGF,WAnBF,YAoBI,aAIJ,iBACE,aACA,aACA,2BACA,mBACA,mBACA,0BACA,qCAEA,WATF,eAUI,qBAGF,aACE,WACA,YACA,gBACA,wBAEA,UACE,YACA,cACA,SACA,kBACA,mBACA,oBACA,CADA,8BACA,CADA,gBACA,0BAIJ,gBACE,gBACA,iCAEA,cACE,WR7EA,gBQ+EA,gBACA,uBACA,+BAGF,aACE,eACA,cRtEgB,gBQwEhB,gBACA,uBACA,aAMR,cACE,kBACA,gBACA,6GAEA,cAME,WR3GI,gBQ6GJ,qBACA,iBACA,qBACA,sBAGF,eRnHM,oBQqHJ,cR5GS,eQ8GT,cACA,kBAGF,cACE,uCAGF,aR9GwB,oBQmHxB,UACE,eACA,wBAEA,oBACE,iBACA,oBAIJ,WACE,gBACA,wBAEA,oBACE,gBACA,uBAIJ,cACE,cACA,qCAGF,YA7DF,iBA8DI,mBAEA,YACE,uCAGF,oBAEE,gBAKN,kBRlKa,mCQoKX,cR7JsB,eQ+JtB,gBACA,kBACA,aACA,uBACA,mBACA,eACA,kBACA,aACA,gBACA,2BAEA,yBACE,yBAGF,qBACE,gBACA,yCAIJ,oBAEE,gBACA,eACA,kBACA,eACA,iBACA,gBACA,cR3LwB,sCQ6LxB,sCACA,6DAEA,aRhNc,sCQkNZ,kCACA,qDAGF,aACE,sCACA,kCACA,0BAIJ,eACE,UACA,wBACA,gBACA,CADA,YACA,CACA,iCACA,CADA,uBACA,CADA,kBACA,eACA,iBACA,6BAEA,YACE,gCACA,yDAGF,qBAEE,aACA,kBACA,gBACA,gBACA,mBACA,uBACA,6BAGF,eACE,YACA,cACA,cR1OsB,0BQ4OtB,6BAGF,aACE,cRjPoB,4BQqPtB,aV/PoB,qBUiQlB,qGAEA,yBAGE,oCAIJ,qCACE,iCACA,sCAEA,aRnRY,gBQqRV,0CAGF,aRxRY,wCQ6Rd,eACE,wCAIJ,UACE,0BAIA,aRxRsB,4BQ2RpB,aR1RsB,qBQ4RpB,qGAEA,yBAGE,iCAIJ,URtTI,gBQwTF,wBAIJ,eACE,kBC/TJ,kCACE,kBACA,gBACA,mBACA,8BAEA,yBACE,qCAGF,iBAVF,eAWI,gBACA,gBACA,6BAGF,eACE,SACA,gBACA,gFAEA,yBAEE,sCAIJ,UACE,yBAGF,kBTpBW,6GSuBT,sBAGE,CAHF,cAGE,8IAIA,eAGE,0BACA,iJAKF,yBAGE,kLAIA,iBAGE,qCAKN,4GACE,yBAGE,uCAKN,kBACE,qBAIJ,WACE,eACA,mBXzEoB,WENd,oBSkFN,iBACA,YACA,iBACA,SACA,yBAEA,UACE,YACA,sBACA,iBACA,UT5FI,gFSgGN,kBAGE,qNAKA,kBTxFoB,4ISgGpB,kBT9GQ,qCSqHV,wBACE,YACE,0DAOJ,YACE,uCAGF,2BACE,gBACA,uDAEA,SACE,SACA,yDAGF,eACE,yDAGF,gBACE,iBACA,mFAGF,UACE,qMAGF,eAGE,iCC/JN,u+KACE,uCAEA,u+KACE,0CAIJ,u+KACE,WCTF,gCACE,4CACA,cAGF,aACE,eACA,iBACA,cbAoB,SaEpB,uBACA,UACA,eACA,wCAEA,yBAEE,uBAGF,aXFsB,eWIpB,SAIJ,wBblBsB,YaoBpB,kBACA,sBACA,WX5BM,eW8BN,qBACA,oBACA,eACA,gBACA,YACA,iBACA,iBACA,gBACA,eACA,kBACA,kBACA,qBACA,uBACA,2BACA,mBACA,WACA,4CAEA,wBAGE,4BACA,sBAGF,eACE,mFAEA,wBXxDQ,gBW4DN,mCAIJ,wBXlDsB,eWqDpB,2BAGF,QACE,wDAGF,mBAGE,yGAGF,cAIE,iBACA,YACA,oBACA,iBACA,4BAGF,aXpFW,mBAOW,qGWiFpB,wBAGE,8BAIJ,kBbpGgB,2GauGd,wBAGE,0BAIJ,aXlGsB,uBWoGpB,iBACA,yBACA,+FAEA,oBAGE,cACA,mCAGF,UACE,uBAIJ,aACE,WACA,kBAIJ,YACE,cACA,kBACA,cAGF,oBACE,CACA,ab9IgB,SagJhB,kBACA,uBACA,eACA,2BACA,2CACA,2DAEA,aAGE,oCACA,4BACA,2CACA,oBAGF,kCACE,uBAGF,aACE,6BACA,eACA,qBAGF,abxKoB,gCa4KpB,QACE,uEAGF,mBAGE,uBAGF,abxLgB,sFa2Ld,aAGE,oCACA,6BAGF,kCACE,gCAGF,aACE,6BACA,8BAGF,abzMkB,uCa4MhB,aACE,wBAKN,sBACE,0BACA,yBACA,kBACA,YACA,8BAEA,yBACE,mBb5NY,QamOhB,kBACA,uBACA,eACA,gBACA,eACA,cACA,iBACA,UACA,2BACA,2CACA,0EAEA,aAGE,oCACA,4BACA,2CACA,yBAGF,kCACE,4BAGF,aACE,6BACA,eACA,0BAGF,abhQoB,qCaoQpB,QACE,sFAGF,mBAGE,CAKF,0BADF,iBAUE,CATA,WAGF,WACE,cACA,qBACA,QACA,SAEA,+BAEA,kBAEE,mBACA,oBACA,kBACA,mBACA,iBAKF,WACE,eAIJ,YACE,iCAGE,mBACA,eAEA,gBACA,wCAEA,abrTkB,sDayTlB,YACE,2CAGF,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,kDAEA,oBb1UgB,yDaiVpB,aX9UW,mBWgVT,mBXzUoB,oCW2UpB,iBACA,kBACA,eACA,gBACA,6CAEA,aXxVS,gBW0VP,CAII,kRADF,eACE,wCAKN,abxWc,gBa0WZ,0BACA,yIAEA,oBAGE,sCAKN,iBACE,QACA,UACA,kDAGF,iBACE,mGAGF,iBAGE,WACA,8BAGF,QACE,wBACA,UACA,qDAEA,WACE,mBACA,UACA,mFAIJ,aAEE,sBACA,WACA,SACA,cXlZS,gBATL,aW8ZJ,oBACA,eACA,gBACA,SACA,UACA,yIAEA,abjac,Ca+Zd,sHAEA,abjac,Ca+Zd,8HAEA,abjac,Ca+Zd,gIAEA,abjac,Ca+Zd,4GAEA,abjac,+Faqad,SACE,qCAGF,kFAvBF,cAwBI,sCAIJ,iBACE,+CAGF,gBACE,0BACA,iBACA,mBACA,YACA,qBACA,kEAEA,SACE,qCAGF,8CAZF,sBAaI,gBACA,2DAIJ,iBACE,SACA,kDAGF,qBACE,aACA,kBACA,SACA,WACA,WACA,sCACA,mBXncsB,0BWqctB,cX7cS,eW+cT,YACA,6FAEA,aACE,wDAIJ,YACE,eACA,kBACA,yPAEA,kBAIE,wGAIJ,YAGE,mBACA,mBACA,2BACA,iBACA,eACA,oCAGF,6BACE,0CAEA,aACE,gBACA,uBACA,mBACA,2CAGF,eACE,0CAGF,aACE,iBACA,gBACA,uBACA,mBACA,8EAIJ,aAEE,iBACA,WACA,YACA,2DAGF,abnhBgB,wCauhBhB,aXlhBW,oBWohBT,eACA,gBX9hBI,sEWiiBJ,eACE,uEAGF,YACE,mBACA,YACA,eACA,8DAGF,UACE,cACA,WACA,uEAEA,iFACE,aACA,uBACA,8BACA,UACA,4BACA,oFAEA,aACE,cXziBgB,eW2iBhB,gBACA,aACA,oBACA,6QAEA,aAGE,8EAIJ,SACE,0EAIJ,iBACE,UACA,SACA,OACA,QACA,sBACA,gFACA,aACA,UACA,4BACA,mFAEA,sBACE,cXzkBgB,SW2kBhB,UACA,SACA,WACA,oBACA,eACA,gBACA,yFAEA,UXpmBF,8GWwmBE,WACE,cXxlBc,CAjBlB,oGWwmBE,WACE,cXxlBc,CAjBlB,wGWwmBE,WACE,cXxlBc,CAjBlB,yGWwmBE,WACE,cXxlBc,CAjBlB,+FWwmBE,WACE,cXxlBc,iFW6lBlB,SACE,wEAKN,iBACE,sBXtnBE,wBWwnBF,sBACA,4BACA,aACA,WACA,gBACA,8CAIJ,YACE,mBACA,0BACA,aACA,8BACA,cACA,qEAEA,YACE,uGAEA,gBACE,qGAGF,YACE,6IAEA,aACE,2IAGF,gBACE,0HAKN,sBAEE,cACA,0EAGF,iBACE,iBACA,sCAIJ,YACE,yBACA,YACA,cACA,4EAEA,eACE,iBACA,oBAKN,cACE,kDACA,eACA,gBACA,cbrrBgB,4CawrBhB,aXzrBY,kCW8rBd,2CACE,WCpsBF,8DDysBE,sBACA,CADA,kBACA,wBACA,WACA,YACA,eAEA,UACE,kBAIJ,iBACE,mBACA,mBXpsBsB,aWssBtB,gBACA,gBACA,cACA,0BAGF,iBACE,gBACA,0BAGF,WACE,iBACA,gCAGF,aX7tBa,cW+tBX,eACA,iBACA,gBACA,mBACA,qBACA,kCAGF,UACE,iBACA,+BAGF,cACE,4CAGF,iBAEE,eACA,iBACA,qBACA,gBACA,gBACA,uBACA,gBACA,WXlwBM,wDWqwBN,SACE,wGAGF,kBACE,sJAEA,oBACE,gEAIJ,UACE,YACA,gBACA,oDAGF,cACE,iBACA,sBACA,CADA,gCACA,CADA,kBACA,gDAGF,kBACE,qBACA,sEAEA,eACE,gDAIJ,aX1xBc,qBW4xBZ,4DAEA,yBACE,oEAEA,aACE,4EAKF,oBACE,sFAEA,yBACE,wDAKN,abxzBc,8Ea6zBhB,aACE,0GAGF,kBbj0BgB,sHao0Bd,kBACE,qBACA,8IAGF,QACE,0XAGF,mBAGE,0FAIJ,YACE,wJAEA,aACE,6CAKN,gBACE,oCAGF,aACE,eACA,iBACA,cACA,SACA,uBACA,CACA,eACA,oFAEA,yBAEE,gCAIJ,oBACE,kBACA,uBACA,SACA,cXh3BW,gBWk3BX,eACA,cACA,iBACA,eACA,sBACA,4BAGF,ab/3BkB,Sai4BhB,kBACA,kBACA,oBACA,SACA,aACA,sBACA,WACA,WACA,gCACA,+BAGF,UACE,kBACA,kBAIA,SACE,mBACA,wCAEA,kBACE,8CAEA,sBACE,iFAIJ,kBAEE,SAMJ,yBACA,kBACA,gBACA,gCACA,eACA,UAaA,mCACA,CADA,0BACA,wDAZA,QARF,kBAWI,0BAGF,GACE,aACA,WALA,gBAGF,GACE,aACA,uDAMF,cAEE,kCAGF,kBACE,4BACA,sCAIA,aX37BoB,CAPX,uEW28BP,aX38BO,kCW+8BP,aXx8BkB,gCW68BpB,aXp9BS,kCWu9BP,ab19BgB,gEa89BhB,UXp+BE,mBAgBgB,sEWw9BhB,kBACE,+CAQR,sBACE,qEAEA,aACE,qDAKN,abt/BkB,Yay/BhB,eACA,uBAGF,ab7/BkB,qCaigClB,aACE,eACA,mBACA,eAGF,cACE,mBAGF,+BACE,aACA,6CAEA,uBACE,OACA,4DAEA,eACE,8DAGF,SACE,mBACA,qHAGF,cAEE,gBACA,4EAGF,cACE,0BAKN,kBACE,aACA,cACA,uBACA,aACA,kBAGF,gBACE,cbjjCgB,CamjChB,iBACA,eACA,kBACA,+CAEA,abxjCgB,uBa4jChB,aACE,gBACA,uBACA,qBAIJ,kBACE,aACA,eACA,8BAEA,mBACE,kBACA,mBACA,yDAEA,gBACE,qCAGF,oBACE,WACA,eACA,gBACA,cbrlCY,4Ba2lClB,iBACE,8BAGF,cACE,cACA,uCAGF,aACE,aACA,mBACA,uBACA,kBACA,kBAGF,kBACE,kBACA,wBAEA,YACE,eACA,8BACA,uBACA,uFAEA,SAEE,mCAIJ,cACE,iBACA,6CAEA,UACE,YACA,gBACA,kEAGF,gBACE,gBACA,+DAIJ,cAEE,wBAIJ,eACE,cbnpCgB,eaqpChB,iBACA,8BAGF,kBACE,6BACA,gCACA,aACA,mBACA,eACA,wBAGF,aACE,qBACA,uDAGF,oBAEE,gBACA,eACA,gBACA,2BAGF,aX1qCa,eW4qCX,6BAEA,abnrCgB,SawrClB,YACE,gCACA,8BAEA,aACE,cACA,WXlsCI,qBWosCJ,eACA,gBACA,kBAIJ,YACE,iBAGF,WACE,aACA,mBACA,UAGF,YACE,gCACA,kBAEA,SACE,gBACA,2CAEA,aACE,iCAIJ,aACE,cACA,cXntCoB,gBWqtCpB,qBACA,eACA,mBAIJ,YACE,0BAGF,UACE,iBACA,kBACA,kBAGF,iBEtvCE,iCACA,wBACA,4BACA,kBFqvCA,yBAEA,oBACE,sBACA,iBACA,4BAGF,iBEhwCA,iCACA,wBACA,4BACA,kBF+vCE,gBACA,kBACA,eACA,gCAEA,UACE,kBACA,sBACA,mCAGF,aACE,kBACA,QACA,SACA,+BACA,WXjxCE,6BWmxCF,gBACA,eACA,oBAKN,cACE,0BAGF,UACuB,sCEvxCrB,+BFyxCA,iBElyCA,iCACA,wBACA,4BACA,WFiyCuB,sCE3xCvB,kCF8xCA,iBEvyCA,iCACA,wBACA,4BACA,WFsyCuB,sCEhyCvB,kBFkyCE,SACA,QACA,UACA,wBAIJ,WACE,aACA,mBACA,sBAGF,YACE,6BACA,cbrzCgB,6BawzChB,eACE,CAII,kMADF,eACE,wBAKN,eACE,cACA,0BACA,yFAEA,oBAGE,sBAKN,4BACE,gCACA,iBACA,gBACA,cACA,aACA,+BAGF,YACE,4CAEA,qBACE,oFAIA,QACE,WACA,uDAGF,WACE,iBACA,gBACA,WACA,4BAKN,YACE,cACA,iBACA,kBACA,2BAGF,oBACE,gBACA,cACA,+BACA,eACA,oCACA,kCAEA,+BACE,gCAGF,aACE,eACA,cXv3CoB,kCW23CtB,aACE,eACA,gBACA,WX94CI,CWm5CA,2NADF,eACE,oBAMR,iBACE,mDAEA,aACE,mBACA,gBACA,4BAIJ,UACE,kBACA,6JAGF,oBAME,4DAKA,UXn7CM,kBWy7CN,UACE,iKAQF,yBACE,+BAIJ,aACE,gBACA,uBACA,0DAGF,aAEE,sCAGF,kBACE,gCAGF,aXr8C0B,cWu8CxB,iBACA,mBACA,gBACA,2EAEA,aAEE,uBACA,gBACA,uCAGF,cACE,WXr+CI,kCW0+CR,UACE,kBACA,iBAGF,WACE,UACA,kBACA,SACA,WACA,iBAGF,UACE,kBACA,OACA,MACA,YACA,eACA,Cbz/CgB,gHamgDhB,abngDgB,wBaugDhB,UACE,wCAGF,kBb3gDgB,cEKL,8CW0gDT,kBACE,qBACA,wBAKN,oBACE,gBACA,eACA,cX7gDsB,eW+gDtB,iBACA,kBACA,4BAEA,ab7hDoB,6BaiiDpB,cACE,gBACA,uBACA,uCAIJ,UACE,kBACA,CX5iDU,mEWmjDZ,aXnjDY,uBWujDZ,aXxjDc,4DW8jDV,4CACE,CADF,oCACE,8DAKF,6CACE,CADF,qCACE,6BAKN,aACE,gBACA,qBACA,mCAEA,UXllDM,0BWolDJ,8BAIJ,WACE,eAGF,aACE,eACA,gBACA,uBACA,mBACA,qBAGF,eACE,wBAGF,cACE,+DAKA,yBACE,eAIJ,iBACE,WACA,YACA,aACA,mBACA,uBACA,sBACA,6CAEA,cXzkD4B,eAEC,0DW0kD3B,sBACA,CADA,gCACA,CADA,kBACA,4BAGF,iBACE,qEAGF,YACE,iBAIJ,iBACE,WACA,YACA,aACA,mBACA,uBACA,qBAEA,cXjmD4B,eAEC,WWkmD3B,YACA,sBACA,CADA,gCACA,CADA,kBACA,iBAIJ,YACE,aACA,mBACA,cACA,eACA,cXlpDsB,wBWqpDtB,aXppDwB,mBWwpDxB,aACE,4BAGF,oBACE,0CAGF,iBACE,6DAEA,iBACE,oBACA,qCACA,UACA,4EAGF,mBACE,gCACA,UACA,0BAKN,aACE,gBACA,iBACA,gBACA,gBACA,kCAGF,aACE,gBACA,gBACA,uBACA,+BAGF,aACE,qBACA,WAGF,oBACE,oBAGF,YACE,kBACA,2BAGF,+BACE,mBACA,SACA,gBAGF,kBXrtD0B,cWutDxB,kBACA,uCACA,aACA,mBAEA,eACE,qBAGF,yBACE,oBAGF,yBACE,uBAGF,sBACE,sBAGF,sBACE,uBAIJ,iBACE,QACA,SACA,2BACA,4BAEA,UACE,gBACA,2BACA,0BX1vDsB,2BW8vDxB,WACE,iBACA,uBACA,yBXjwDsB,8BWqwDxB,QACE,iBACA,uBACA,4BXxwDsB,6BW4wDxB,SACE,gBACA,2BACA,2BX/wDsB,wBWqxDxB,cACE,iBACA,cACA,iBACA,sBACA,qBACA,mBX3xDsB,cARb,gBWsyDT,uBACA,mBACA,yFAEA,kBb7yDkB,cEWI,UWuyDpB,sCAKN,aACE,iBACA,gBACA,QACA,gBACA,aACA,yCAEA,eACE,mBXrzDsB,cWuzDtB,kBACA,mCACA,gBACA,kBACA,sDAGF,OACE,wDAIA,UACE,8CAIJ,cACE,iBACA,cACA,iBACA,sBACA,qBACA,mBX90DsB,cARb,gBWy1DT,uBACA,mBACA,oDAEA,SACE,oDAGF,kBbp2DkB,cEWI,iBWg2D1B,qBACE,eAGF,YACE,cACA,mBACA,2BACA,gBACA,kBACA,4BAEA,iBACE,uBAGF,YACE,uBACA,WACA,YACA,iBACA,6BAEA,WACE,gBACA,oBACA,aACA,yBACA,gBACA,oCAEA,0BACE,oCAGF,cACE,YACA,oBACA,YACA,6BAIJ,qBACE,WACA,gBACA,cACA,aACA,sBACA,qCAEA,4BARF,cASI,qBAMR,kBACE,wBACA,CADA,eACA,MACA,UACA,cACA,qCAEA,mBAPF,gBAQI,+BAGF,eACE,qCAEA,6BAHF,kBAII,gKAMJ,WAIE,mCAIJ,YACE,mBACA,uBACA,YACA,SAGF,WACE,kBACA,sBACA,aACA,sBACA,qBAEA,kBX78DW,8BW+8DT,+BACA,KAIJ,aACE,CACA,qBACA,WACA,YACA,aAJA,YAYA,CARA,QAGF,WACE,sBACA,CACA,qBACA,kBACA,cAGF,aACE,cACA,sBACA,cXh+DsB,qBWk+DtB,kBACA,eACA,oCACA,iBAGF,aAEE,gBACA,qCAGF,cACE,SACE,iBAGF,aAEE,CAEA,gBACA,yCAEA,iBACE,uCAGF,kBACE,qDAKF,gBAEE,kBACA,YAKN,qBACE,aACA,mBACA,cACA,gBACA,iBAGF,aACE,cACA,CACA,sBACA,WXxiEM,qBW0iEN,kBACA,eACA,gBACA,gCACA,2BACA,mDACA,qBAEA,eACE,eACA,qCAMA,mEAHF,kBAII,4BACA,yBAIJ,+BACE,cb3jEkB,sBa+jEpB,eACE,aACA,qCAIJ,qBAEI,cACE,wBAKN,qBACE,WACA,YACA,cACA,6DAEA,UAEE,YACA,UACA,wCAGF,YACE,cACA,kDACA,qCAEA,uCALF,aAMI,yCAIJ,eACE,oCAGF,YACE,uDAGF,cACE,sCAGF,gBACE,eACA,CACA,2BACA,yCAGF,QACE,mCAGF,gBACE,yBAEA,kCAHF,eAII,sCAIJ,sBACE,gBACA,sCAGF,uCACE,YACE,iKAEA,eAGE,6CAIJ,gBACE,2EAGF,YAEE,kGAGF,gBACE,+BAGF,2BACE,gBACA,uCAEA,SACE,SACA,wCAGF,eACE,wCAGF,gBACE,iBACA,qDAGF,UACE,gLAGF,eAIE,gCAIJ,iBACE,6CAEA,cACE,8CAKF,gBACE,iBACA,6DAGF,UACE,CAIA,yFAGF,eACE,8DAGF,gBACE,kBACA,0BAMR,cACE,aACA,uBACA,mBACA,gBACA,iBACA,iBACA,gBACA,mBACA,WX/uEM,kBWivEN,eACA,iBACA,qBACA,sCACA,4FAEA,kBAGE,qCAIJ,UACE,UACE,uDAGF,kCACE,4DAGF,kBAGE,yBAGF,aACE,iBAGF,eAEE,sCAIJ,2CACE,YACE,sCAOA,sEAGF,YACE,uCAIJ,0CACE,YACE,uCAIJ,UACE,YACE,mBAIJ,iBACE,yBAEA,iBACE,SACA,UACA,mBbpzEkB,yBaszElB,gBACA,kBACA,eACA,gBACA,iBACA,WXj0EI,mDWs0ER,oBACE,gBAGF,WACE,gBACA,aACA,sBACA,yBACA,kBACA,gCAEA,gBACE,oBACA,cACA,gBACA,6BAGF,sBACE,8BAGF,MACE,kBACA,aACA,sBACA,iBACA,oBACA,oBACA,mDAGF,eACE,sBXx2EI,0BW02EJ,cACA,gDAGF,iBACE,gDAGF,WACE,mBAIJ,eACE,mBACA,yBACA,gBACA,aACA,sBACA,qBAEA,aACE,sBAGF,aACE,SACA,CACA,4BACA,cACA,qDAHA,sBAOA,gBAMF,WACA,kBAGA,+BANF,qBACE,UACA,CAEA,eACA,aAiBA,CAhBA,eAGF,iBACE,MACA,OACA,mBACA,CAGA,qBACA,CACA,eACA,WACA,YACA,kBACA,uBAEA,kBX/5EW,0BWo6Eb,u1BACE,OACA,gBACA,aACA,8BAEA,aACE,sBACA,CADA,4DACA,CADA,kBACA,+BACA,CADA,2BACA,WACA,YACA,oBACA,eACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,sCAGF,yBAjBF,aAkBI,iBAIJ,kBACE,eACA,gBACA,iBAGF,aACE,eACA,mBACA,mBACA,aACA,mBACA,kBACA,mBAEA,iCACE,yBAEA,kBACE,mCACA,aAKN,iBACE,kBACA,cACA,iCACA,mCAEA,eACE,yBAGF,YAVF,cAWI,oBAGF,YACE,sBACA,qBAGF,aACE,kBACA,iBACA,yBAKF,uBADF,YAEI,sBAIJ,qBACE,WACA,mBACA,cbz/EoB,ea2/EpB,cACA,eACA,oBACA,SACA,iBACA,aACA,SACA,UACA,UACA,2BAEA,yBACE,6BAIJ,kBACE,SACA,oBACA,cb9gFoB,eaghFpB,mBACA,eACA,kBACA,UACA,mCAEA,yBACE,wCAGF,kBACE,2BAIJ,oBACE,iBACA,2BAGF,iBACE,kCAGF,cACE,cACA,eACA,aACA,CACA,OACA,UACA,eAGF,oBACE,kBACA,eACA,6BACA,SACA,UACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,0CACA,wCACA,iCAGF,QACE,mBACA,WACA,YACA,gBACA,UACA,kBACA,UACA,yBAGF,kBACE,WACA,wBACA,qBAGF,UACE,YACA,UACA,mBACA,yBXhlFW,qCWklFX,sEAGF,wBACE,4CAGF,wBb5lFsB,+EagmFtB,wBACE,2BAGF,iBACE,WACA,YACA,MACA,SACA,gBACA,mBACA,cACA,SACA,UACA,6BACA,CAKA,uEAFF,SACE,6BAeA,CAdA,sBAGF,iBACE,WACA,YACA,MACA,SACA,gBACA,mBACA,cACA,WAGA,8CAGF,SACE,qBAGF,iBACE,QACA,SACA,WACA,YACA,yBACA,kBACA,yBACA,sBACA,yBACA,sCACA,4CAGF,SACE,qBbxpFoB,ca4pFtB,kBACE,WXnqFM,cWqqFN,eACA,aACA,qBACA,2DAEA,kBAGE,oBAGF,SACE,2BAGF,sBACE,cXpqFsB,kGWuqFtB,sBAGE,WX3rFE,kCW+rFJ,abzrFkB,oBa+rFtB,oBACE,iBACA,qBAGF,oBACE,kBACA,eACA,iBACA,gBACA,mBXtsFW,gBWwsFX,iBACA,oBAGF,kBX5sFa,cFLK,iBaotFhB,eACA,gBACA,eACA,yDAGF,kBXrtFa,cW2tFb,aACE,kBAGF,abpuFkB,casuFhB,8BACA,+BACA,4EAEA,0BAGE,CAHF,uBAGE,CAHF,kBAGE,kDAMA,sBACA,YACA,wDAEA,kBACE,8DAGF,cACE,sDAGF,cACE,0DAEA,ablwFY,0BaowFV,sDAIJ,oBACE,cX7vFkB,sMWgwFlB,yBAGE,oDAKN,abpxFgB,0Ba0xFhB,aACE,UACA,mCACA,CADA,0BACA,gBACA,6BAEA,cACE,cXrxFkB,aWuxFlB,gBACA,gCACA,sCAGF,oDACE,YACE,uCAIJ,oDACE,YACE,uCAIJ,yBA1BF,YA2BI,yCAGF,eACE,aACA,iDAEA,aXhzFkB,qBWuzFxB,eACE,gBACA,2BAEA,iBACE,aACA,wBAGF,kBACE,yBAGF,oBACE,gBACA,yBACA,yBACA,eAIJ,aACE,sBACA,WACA,SACA,cXv1FW,gBATL,aWm2FN,oBACA,eACA,gBACA,SACA,UACA,kBACA,qBAEA,SACE,qCAGF,cAnBF,cAoBI,oDAIJ,uBACE,YACA,6CACA,uBACA,sBACA,WACA,0DAEA,sBACE,0DAKJ,uBACE,2BACA,gDAGF,abn4FkB,6Baq4FhB,uDAGF,abt4FsB,ca04FtB,YACE,eACA,yBACA,kBACA,cbh5FgB,gBak5FhB,qBACA,gBACA,uBAEA,QACE,OACA,kBACA,QACA,MAIA,iDAHA,YACA,uBACA,mBAUE,CATF,0BAEA,yBACE,kBACA,iBACA,cAIA,sDAGF,cAEE,cX/5FoB,uBWi6FpB,SACA,cACA,qBACA,eACA,iBACA,sMAEA,UXz7FE,yBWg8FJ,cACE,kBACA,YACA,eAKN,cACE,qBAEA,kBACE,oBAIJ,cACE,cACA,qBACA,WACA,YACA,SACA,2BAIA,UACE,YACA,qBAIJ,aACE,gBACA,kBACA,cXn9FsB,gBWq9FtB,uBACA,mBACA,qBACA,uBAGF,aACE,gBACA,2BACA,2BAGF,aXj+FwB,oBWq+FxB,aACE,eACA,eACA,gBACA,uBACA,mBACA,qBAGF,cACE,mBACA,kBACA,yBAEA,cACE,kBACA,yBACA,QACA,SACA,+BACA,yBAIJ,aACE,6CAEA,UACE,mDAGF,yBACE,6CAGF,mBACE,sBAIJ,oBACE,kCAEA,QACE,4CAIA,oBACA,0CAGF,kBACE,0CAGF,aACE,6BAIJ,wBACE,2BAGF,yBACE,cACA,SACA,WACA,YACA,oBACA,CADA,8BACA,CADA,gBACA,sBACA,wBACA,YAGF,aACE,cb9jGgB,6BagkGhB,SACA,kBACA,kBACA,oBACA,SACA,aACA,sBACA,WACA,WACA,qBACA,kBAEA,kBACE,WAIJ,+BACE,yBAGF,iBACE,eACA,gBACA,cbxlGgB,mBEKL,eWslGX,aACA,cACA,sBACA,mBACA,uBACA,aACA,qEAGE,aAEE,WACA,aACA,SACA,yCAIJ,gBACE,gCAGF,eACE,uCAEA,aACE,mBACA,cbtnGY,qCa0nGd,cACE,gBACA,yBAKN,iBACE,cACA,uCAGE,aACE,WACA,kBACA,SACA,OACA,QACA,cACA,UACA,oBACA,YACA,UACA,4EACA,gBAKN,YACE,eACA,mBACA,cACA,eACA,kBACA,UACA,UACA,gBACA,2BACA,4BACA,uBAEA,QACE,SACA,yBACA,cACA,uBACA,aACA,gBACA,uBACA,gBACA,mBACA,OACA,4CAGF,abhrGoB,uBaorGpB,mCACE,4CAEA,abvrGkB,sCayrGhB,4CAIJ,SAEE,yBAIJ,WACE,aACA,uBAGF,kBACE,iCAGF,iBACE,wBAGF,kBACE,SACA,cXxsGsB,eW0sGtB,eACA,eACA,8BAEA,aACE,CAKA,kEAEA,UXtuGI,mBWwuGF,6BAKN,eACE,gBACA,gBACA,cXhuGsB,0DWkuGtB,UACA,uCAEA,YACE,WACA,uCAGF,iBACE,gCAGF,QACE,uBACA,SACA,6BACA,cACA,mCAIJ,kBACE,aACA,mCAIA,aX7vGsB,0BW+vGpB,gCAIJ,WACE,4DAEA,cACE,uEAEA,eACE,WAKN,oBACE,UACA,oBACA,kBACA,cACA,SACA,uBACA,eACA,sBAGF,oBACE,iBACA,oBAGF,ab3yGkB,ea6yGhB,gBACA,iBACA,kBACA,QACA,SACA,+BACA,yBAEA,aACE,WACA,CACA,0BACA,oBACA,mBACA,4BAIJ,iBACE,QACA,SACA,+BACA,WACA,YACA,sBACA,6BACA,CACA,wBACA,kBACA,2CAGF,2EACE,CADF,mEACE,8CAGF,4EACE,CADF,oEACE,qCAGF,GACE,sBACE,KAGF,2BACE,KAGF,2BACE,KAGF,yBACE,IAGF,wBACE,EArBF,4BAGF,GACE,sBACE,KAGF,2BACE,KAGF,2BACE,KAGF,yBACE,IAGF,wBACE,uCAIJ,GACE,wBACE,KAGF,0BACE,KAGF,2BACE,KAGF,uBACE,IAGF,sBACE,EAtBA,6BAIJ,GACE,wBACE,KAGF,0BACE,KAGF,2BACE,KAGF,uBACE,IAGF,sBACE,mCAIJ,GACE,OACE,SACA,yBACA,KAGF,wBACE,KAGF,UACE,YACA,6BACA,kBACA,UACA,IAGF,UACE,YACA,eACA,UACA,6BACA,EA5BA,yBAIJ,GACE,OACE,SACA,yBACA,KAGF,wBACE,KAGF,UACE,YACA,6BACA,kBACA,UACA,IAGF,UACE,YACA,eACA,UACA,6BACA,kCAIJ,GACE,gBACA,aACA,aAPE,wBAIJ,GACE,gBACA,aACA,gCAGF,kBACE,gBXz6GM,WACA,eW26GN,aACA,sBACA,YACA,uBACA,eACA,kBACA,kBACA,YACA,gBAGF,eXv7GQ,cAiBgB,SWy6GtB,UACA,WACA,YACA,kBACA,wBACA,CADA,oBACA,CADA,eACA,iEAEA,SAGE,cACA,yBAIJ,aACE,eACA,yBAGF,aACE,eACA,gBACA,iBAGF,KACE,OACA,WACA,YACA,kBACA,YACA,2BAEA,aACE,SACA,QACA,WACA,YACA,6BAGF,mBACE,yBAGF,YACE,0BAGF,aACE,uBACA,WACA,YACA,SACA,iCAEA,oBACE,0BACA,kBACA,iBACA,WXt/GE,gBWw/GF,eACA,+LAMA,yBACE,mEAKF,yBACE,6BAMR,kBACE,iBAGF,kBACE,6BACA,gCACA,aACA,mBACA,eACA,kDAGF,aAEE,kBACA,yBAGF,kBACE,aACA,2BAGF,aXphHwB,eWshHtB,cACA,gBACA,mBACA,kDAIA,kBACE,oDAIA,SEtiHF,sBACA,WACA,SACA,gBACA,oBACA,mBbRW,cAOW,eaItB,SACA,+EFgiHI,aACE,CEjiHN,qEFgiHI,aACE,CEjiHN,yEFgiHI,aACE,CEjiHN,0EFgiHI,aACE,CEjiHN,gEFgiHI,aACE,sEAGF,QACE,yLAGF,mBAGE,0DAGF,kBACE,qCAGF,mDArBF,cAsBI,yDAIJ,abxkHc,iBa0kHZ,eACA,4DAGF,gBACE,wDAGF,kBACE,gEAEA,cACE,iNAEA,kBAGE,cACA,gHAKN,aXrlHoB,0HW0lHpB,cAEE,gBACA,cbzmHY,kZa4mHZ,aAGE,gEAIJ,wBACE,iDAGF,eX3nHI,kBa0BN,CAEA,eACA,cbbsB,uCaetB,UF8lHI,mBX5mHoB,oDagBxB,abjBsB,eamBpB,gBACA,mBACA,oDAGF,aACE,oDAGF,kBACE,oDAGF,eACE,cbxCS,sDWwnHT,WACE,mDAGF,aX5nHS,kBW8nHP,eACA,8HAEA,kBAEE,iCAON,kBACE,mBAIJ,UXxpHQ,kBW0pHN,cACA,mBACA,sBX7pHM,eW+pHN,gBACA,YACA,kBACA,WACA,yBAEA,SACE,iBAIJ,aACE,iBACA,wBAGF,aX9pHwB,qBWgqHtB,mBACA,gBACA,sBACA,uCAGF,ablrHkB,mBEKL,kBWirHX,aACA,eACA,gBACA,eACA,aACA,cACA,mBACA,uBACA,yBAEA,sCAdF,cAeI,kDAGF,eACE,2CAGF,abtsHoB,qBawsHlB,uDAEA,yBACE,eAKN,qBACE,8BAGF,GACE,kBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,oBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,kBACE,2CACA,CADA,kCACA,EA1BF,qBAGF,GACE,kBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,oBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,kBACE,2CACA,CADA,kCACA,mCAIJ,8BACE,2DACA,CADA,kDACA,iCAGF,MACE,sBAEE,0BACA,KAGF,sBACE,aAGF,uBAGE,aAGF,sBAGE,KAGF,uBACE,KAGF,sBACE,EA/BF,wBAGF,MACE,sBAEE,0BACA,KAGF,sBACE,aAGF,uBAGE,aAGF,sBAGE,KAGF,uBACE,KAGF,sBACE,kCAIJ,yBACE,8EACA,CADA,qEACA,8BAGF,eX/xHQ,kBWiyHN,sCACA,kBACA,eAEA,iDAEA,2BACE,2DAGF,UACE,mCAIJ,iBACE,SACA,WACA,eACA,yCAGF,iBACE,UACA,SACA,UACA,gBX3zHM,kBW6zHN,sCACA,gBACA,gDAEA,aACE,eACA,SACA,gBACA,uBACA,iKAEA,+BAGE,2DAIJ,WACE,wBAKF,2BACE,cAIJ,kBACE,0BACA,aACA,YACA,uBACA,OACA,UACA,kBACA,MACA,kBACA,WACA,aACA,gBAEA,mBACE,oBAIJ,WACE,aACA,aACA,sBACA,kBACA,YACA,0BAGF,iBACE,MACA,QACA,SACA,OACA,WACA,kBACA,mBXp3HW,kCWs3HX,uBAGF,MACE,aACA,mBACA,uBACA,cXr3HwB,eWu3HxB,gBACA,0BACA,kBACA,kBAGF,YACE,cb34HgB,gBa64HhB,aACA,sBAEA,cACE,kBACA,uBAGF,cACE,gBACA,cACA,0BAIJ,aACE,4BAGF,UACE,WACA,kBACA,mBbn6HgB,kBaq6HhB,eACA,2BAGF,iBACE,OACA,MACA,WACA,mBb36HoB,kBa66HpB,eAGF,aACE,eACA,iBACA,gBACA,WACA,UACA,eACA,0CAEA,mBAEE,mBAGF,8BACE,CADF,sBACE,WACA,cACA,CACA,UACA,YACA,eACA,CAQE,6GAKN,SACE,oBACA,CADA,WACA,6BAGF,iBACE,gBX99HM,uCWg+HN,kBACA,iBACA,gBACA,iCAEA,yBACE,oCAGF,sBACE,2BAIJ,aXr+Ha,aWu+HX,eACA,aACA,kEAEA,kBb9+HoB,WENd,UWw/HJ,CXx/HI,4RW6/HF,UX7/HE,wCWmgIN,kBACE,iCAIJ,YACE,mBACA,uBACA,kBACA,oCAGF,aACE,cb5gIgB,2Ca+gIhB,eACE,cACA,cX5gIS,CWihIL,wQADF,eACE,mDAON,eXjiIM,0BWmiIJ,qCACA,gEAEA,eACE,0DAGF,kBbpiIkB,uEauiIhB,UX7iIE,uDWmjIN,yBACE,sDAGF,aACE,sCACA,SAIJ,iBACE,gBAGF,SErjIE,sBACA,WACA,SACA,gBACA,oBACA,mBbRW,cAOW,eaItB,SACA,cF+iIA,CACA,2BACA,iBACA,eACA,2CAEA,aACE,CAHF,iCAEA,aACE,CAHF,qCAEA,aACE,CAHF,sCAEA,aACE,CAHF,4BAEA,aACE,kCAGF,QACE,6EAGF,mBAGE,sBAGF,kBACE,qCAGF,eA3BF,cA4BI,kCAKF,QACE,qDAGF,mBAEE,mBAGF,iBACE,SACA,WACA,UACA,qBACA,UACA,0BACA,sCACA,eACA,WACA,YACA,cXrmIsB,eWumItB,oBACA,0BAEA,mBACE,WACA,0BAIJ,uBACE,iCAEA,mBACE,uBACA,gCAIJ,QACE,uBACA,cbxoIc,ea0oId,uCAEA,uBACE,sCAGF,aACE,yBAKN,abtpIkB,mBawpIhB,aACA,gBACA,eACA,eACA,6BAEA,oBACE,iBACA,0BAIJ,iBACE,6BAEA,kBACE,gCACA,eACA,aACA,aACA,gBACA,eACA,cb9qIc,iCairId,oBACE,iBACA,8FAIJ,eAEE,0BAIJ,aACE,aACA,cXlrIwB,qBWorIxB,+FAEA,aAGE,0BACA,uBAIJ,YACE,cXhsIsB,kBWksItB,aAGF,iBACE,8BACA,oBACA,aACA,sBAGF,cACE,MACA,OACA,QACA,SACA,0BACA,wBAGF,cACE,MACA,OACA,WACA,YACA,aACA,sBACA,mBACA,uBACA,2BACA,aACA,oBACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,oBAGF,mBACE,aACA,aACA,yBAGF,eACE,iBACA,yBAGF,UACE,cAGF,UACE,YACA,kBACA,qCAEA,UACE,YACA,aACA,mBACA,uBACA,2CAEA,cX7tI0B,eAEC,CWuuI7B,8CALF,iBACE,MACA,OACA,QACA,SAYA,CAXA,yBAQA,mBACA,8BACA,oBACA,4BAEA,mBACE,0DAGF,SACE,4DAEA,mBACE,mBAKN,yBACE,sBACA,SACA,WXzzIM,eW2zIN,aACA,mBACA,eACA,cACA,cACA,kBACA,kBACA,MACA,SACA,yBAGF,MACE,0BAGF,OACE,CASA,4CANF,UACE,kBACA,kBACA,OACA,YACA,oBAUA,6BAEA,WACE,sBAGF,mBACE,qBACA,gBACA,cXt1IsB,mFWy1ItB,yBAGE,wBAKN,oBACE,sBAGF,qBXt3IQ,YWw3IN,WACA,kBACA,YACA,UACA,SACA,YACA,8BAGF,wBb33IsB,qBa+3ItB,iBACE,UACA,QACA,YACA,6CAGF,kBX33I0B,cARb,kBWw4IX,gBACA,aACA,sBACA,oBAGF,WACE,WACA,gBACA,iBACA,kBACA,wBAEA,iBACE,MACA,OACA,WACA,YACA,sBACA,aACA,aACA,CAGA,YACA,UACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,2CANA,qBACA,mBACA,uBAaF,CATE,mBAIJ,YACE,CAGA,iBACA,mDAGF,aAEE,mBACA,aACA,aACA,2DAEA,cACE,uLAGF,ab/7IgB,Sak8Id,eACA,gBACA,kBACA,oBACA,YACA,aACA,kBACA,6BACA,+mBAEA,aAGE,yBACA,qiBAGF,aX98IS,qwDWk9IP,aAGE,sBAMR,sBACE,eAGF,iBACE,eACA,mBACA,sBAEA,eACE,cXr+IS,kBWu+IT,eACA,qBAGF,kBX3+IW,cAQa,gBWs+ItB,aACA,kBACA,kBAIJ,oBACE,eACA,gBACA,iBACA,wFAGF,kBAME,cXjgJW,kBWmgJX,gBACA,eACA,YACA,kBACA,sBACA,4NAEA,aACE,eACA,mBACA,wLAGF,WACE,UACA,kBACA,SACA,WACA,kRAGF,aACE,wBAKF,eXviJM,CAiBkB,gBWyhJtB,oBACA,iEX3iJI,2BAiBkB,yBWkiJ1B,iBACE,aACA,iCAEA,wBACE,CADF,qBACE,CADF,oBACE,CADF,gBACE,gBACA,2GAIJ,YAIE,8BACA,mBXjjJwB,aWmjJxB,iBACA,2HAEA,aACE,iBACA,cbrkJc,mBaukJd,2IAGF,aACE,6BAIJ,cACE,2BAGF,WACE,eACA,0BAGF,gBAEE,sDAGF,qBAEE,eAGF,UACE,gBACA,0BAGF,YACE,6BACA,qCAEA,yBAJF,cAKI,gBACA,iDAIJ,qBAEE,UACA,qCAEA,+CALF,UAMI,sDAIJ,aAEE,gBACA,gBACA,gBACA,kBACA,2FAEA,abjoJoB,iLaqoJpB,aXloJW,qCWuoJX,oDAjBF,eAkBI,sCAKF,4BADF,eAEI,yBAIJ,YACE,+BACA,gBACA,0BAEA,cACE,iBACA,mBACA,sCAGF,aACE,sBACA,WACA,CACA,aXjqJS,gBATL,aW6qJJ,oBACA,eACA,YACA,CACA,SACA,kBACA,yBACA,iBACA,gBACA,gBACA,4CAEA,wBACE,+CAGF,eX7rJI,yBW+rJF,mBACA,kBACA,6DAEA,QACE,gBACA,gBACA,mEAEA,QACE,0DAIJ,aXpsJO,oBWssJL,eACA,gBXhtJA,+CWqtJJ,YACE,8BACA,mBACA,4CAIJ,aACE,cXptJS,eWstJT,gBACA,mBACA,wCAGF,eACE,mBACA,+CAEA,aX/tJS,eWiuJP,qCAIJ,uBAnFF,YAoFI,eACA,QACA,wCAEA,iBACE,iBAKN,eACE,eACA,wBAEA,eACE,iBACA,2CAGF,eACE,mBAGF,eACE,cACA,gBACA,+BAEA,4BACE,4BAGF,QACE,oCAIA,aX3wJO,aW6wJL,kBACA,eACA,mBACA,qBACA,8EAEA,eAEE,yWAOA,kBb/xJY,WENd,uDW4yJA,iBACE,oMAUR,aACE,iIAIJ,4BAIE,cb5zJgB,ea8zJhB,gBACA,6cAEA,aAGE,6BACA,qGAIJ,YAIE,eACA,iIAEA,eACE,CAII,w1BADF,eACE,sDAMR,iBAEE,oDAKA,eACE,0DAGF,eACE,mBACA,aACA,mBACA,wEAEA,aXv2JS,CWy2JP,gBACA,uBAKN,YACE,2CAEA,QACE,WACA,cAIJ,wBb33JsB,Wa63JpB,kBACA,MACA,OACA,aACA,6BAGF,aACE,kBACA,WX54JM,0BW84JN,WACA,SACA,gBACA,kBACA,eACA,gBACA,UACA,oBACA,WACA,4BACA,iBACA,2DAKE,YACE,wDAKF,SACE,uBAKN,eACE,6BAEA,UACE,kBAIJ,YACE,eACA,yBACA,kBACA,gBACA,gBACA,wBAEA,aACE,cbv7Jc,iBay7Jd,eACA,+BACA,aACA,sBACA,mBACA,uBACA,eACA,4BAEA,aACE,wBAIJ,eACE,CACA,qBACA,aACA,sBACA,uBACA,2BAEA,aACE,cACA,0BAGF,oBACE,cbr9JY,gBau9JZ,gCAEA,yBACE,0BAKN,QACE,eACA,iDAEA,SACE,cACA,8BAGF,abx+Jc,gBag/JhB,cACA,CACA,iBACA,CACA,UACA,qCANF,qBACE,CACA,eACA,CACA,iBAYA,CAVA,qBAGF,QACE,CACA,aACA,WACA,CACA,iBAEA,qEAGE,cACE,MACA,gCAKN,cACE,cACA,qBACA,cX//JwB,kBWigKxB,UACA,mEAEA,WAEE,WACA,CAIA,2DADF,mBACE,CADF,8BACE,CADF,gBX5hKM,CW6hKJ,wBAIJ,UACE,YACA,CACA,iBACA,MACA,OACA,UACA,gBXxiKM,iCW2iKN,YACE,sBAIJ,WACE,gBACA,kBACA,WACA,qCAGF,cACE,YACA,oBACA,CADA,8BACA,CADA,gBACA,kBACA,QACA,2BACA,WACA,UACA,sCAGF,0BACE,2BACA,gBACA,kBACA,qKAMA,WAEE,mFAGF,WACE,eAKJ,qBACE,kBACA,mBACA,kBACA,oBACA,cACA,wBAEA,eACE,YACA,yBAGF,cACE,kBACA,gBACA,gCAEA,UACE,cACA,kBACA,6BACA,WACA,SACA,OACA,oBACA,qCAIJ,iCACE,iCAGF,wBACE,uCAIA,mBACA,mBACA,6BACA,0BACA,eAIJ,eACE,kBACA,gBXxoKM,eW0oKN,kBACA,sBACA,cACA,wBAEA,eACE,sBACA,qBAGF,SACE,qBAGF,eACE,gBACA,UACA,0BAGF,oBACE,sBACA,SACA,gCAEA,wBACE,0BACA,qBACA,sBACA,UACA,4BAKF,qBACE,CADF,gCACE,CADF,kBACE,kBACA,QACA,2BACA,yBAIJ,iBACE,UACA,SACA,OACA,QACA,sBACA,iFACA,eACA,UACA,4BACA,gCAEA,SACE,6EAKF,iBAEE,wBAIJ,YACE,kBACA,MACA,OACA,WACA,YACA,UACA,SACA,gBXrtKI,cAiBgB,gBWusKpB,oBACA,+BAEA,aACE,oBACA,8GAEA,aAGE,+BAIJ,aACE,eACA,kCAGF,aACE,eACA,gBACA,4BAIJ,YACE,8BACA,oBACA,0DAEA,aACE,wBAIJ,cACE,mBACA,gBACA,uBACA,oCAGE,cACE,qCAKF,eACE,+BAIJ,sBACE,iBACA,eACA,SACA,0BACA,8GAEA,UXpxKE,+EW4xKN,cAGE,gBACA,6BAGF,UXnyKM,iBWqyKJ,yBAGF,oBACE,aACA,mDAGF,UX7yKM,uBWkzKN,cACE,YACA,eACA,8BAEA,UACE,WACA,+BAOA,6DANA,iBACA,cACA,kBACA,WACA,UACA,YAWA,CAVA,+BASA,kBACA,+BAGF,iBACE,UACA,kBACA,WACA,YACA,YACA,UACA,4BACA,mBACA,sCACA,oBACA,qBAIJ,gBACE,uBAEA,oBACE,eACA,gBACA,WXl2KE,sFWq2KF,yBAGE,qBAKN,cACE,YACA,kBACA,4BAEA,UACE,WACA,+BACA,kBACA,cACA,kBACA,WACA,SACA,2DAGF,aAEE,kBACA,WACA,kBACA,SACA,mBACA,6BAGF,6BACE,6BAGF,iBACE,UACA,UACA,kBACA,WACA,YACA,QACA,iBACA,4BACA,mBACA,sCACA,oBACA,CAGE,yFAKF,SACE,6GAQF,gBACE,oBACA,kBAON,UACE,cACA,+BACA,0BAEA,UACE,qCAGF,iBATF,QAUI,mBAIJ,qBACE,mBACA,uBAEA,YACE,kBACA,gBACA,gBACA,2BAEA,aACE,WACA,YACA,SACA,oBACA,CADA,8BACA,CADA,gBACA,uBAIJ,YACE,mBACA,mBACA,aACA,6BAEA,aACE,aACA,mBACA,qBACA,gBACA,qCAGF,UACE,eACA,cACA,+BAGF,aACE,WACA,YACA,gBACA,mCAEA,UACE,YACA,cACA,SACA,kBACA,mBACA,oBACA,CADA,8BACA,CADA,gBACA,qCAIJ,gBACE,gBACA,4CAEA,cACE,WX5/KF,gBW8/KE,gBACA,uBACA,0CAGF,aACE,eACA,cXr/Kc,gBWu/Kd,gBACA,uBACA,yBAKN,kBXrgLS,aWugLP,mBACA,uBACA,gDAEA,YACE,cACA,eACA,mDAGF,qBACE,kBACA,gCACA,WACA,gBACA,mBACA,gBACA,uBACA,qDAEA,YACE,iEAEA,cACE,sDAIJ,YACE,6BAOV,YACE,eACA,gBACA,wBAGF,QACE,sBACA,cACA,kBACA,kBACA,gBACA,WACA,+BAEA,iBACE,QACA,SACA,+BACA,eACA,sDAIJ,kBAEE,gCACA,eACA,aACA,cACA,oEAEA,kBACE,SACA,SACA,6HAGF,aAEE,cACA,cX7kLoB,eW+kLpB,eACA,gBACA,kBACA,qBACA,kBACA,yJAEA,aXrlLsB,qWWwlLpB,aAEE,WACA,kBACA,SACA,SACA,QACA,SACA,2BACA,CAEA,4CACA,CADA,kBACA,CADA,wBACA,iLAGF,WACE,6CACA,8GAKN,kBACE,gCACA,qSAKI,YACE,iSAGF,4CACE,cAOV,kBXzoLa,sBW4oLX,iBACE,4BAGF,aACE,eAIJ,cACE,kBACA,qBACA,cACA,iBACA,eACA,mBACA,gBACA,uBACA,eACA,oEAEA,YAEE,sBAGF,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,8BAEA,oBACE,mBACA,2BAKN,eACE,gBAGF,eXvsLQ,kBa0BN,CACA,sBACA,gBACA,cbbsB,uCaetB,mBAEA,abjBsB,eamBpB,gBACA,mBACA,mBAGF,aACE,mBAGF,kBACE,mBAGF,eACE,cbxCS,UWksLb,iBACE,cAEA,WACE,WACA,sCACA,CADA,6BACA,cAGF,cACE,iBACA,cXrsLsB,gBWusLtB,gBAEA,abptLkB,0BastLhB,sBAEA,oBACE,4BAMR,GACE,cACA,eACA,WATM,mBAMR,GACE,cACA,eACA,qEAGF,kBAIE,sBAEE,8BACA,iBAGF,0BACE,kCACA,+BAIA,qDACE,uEACA,+CAGF,sBACE,8BACA,6DAIA,6BACE,6CACA,4EAIF,6BACE,6CACA,+CAOJ,gBAEE,+BAGF,gBACE,6CAEA,0BACE,wDAGF,eACE,6DAGF,iBACE,iBACA,2EAIA,mBACE,UACA,gCACA,WACA,0FAGF,mBACE,UACA,oCACA,eAOV,UACE,eACA,gBACA,iBAEA,YACE,gBACA,eACA,kBACA,sCAGF,YACE,4CAEA,kBACE,yDAGF,SACE,sBACA,cACA,WACA,SACA,aACA,gDACA,mBX70LO,WATL,eWy1LF,CACA,eACA,kBACA,2EAEA,QACE,wMAGF,mBAGE,+DAGF,kBACE,qCAGF,wDA7BF,cA8BI,4DAIJ,WACE,eACA,gBACA,SACA,kBACA,sBAMJ,sBACA,mBACA,6BACA,gCACA,+BAEA,iBACE,iBACA,cbh4Lc,Cam4Ld,eACA,eACA,oCAEA,aACE,gBACA,uBACA,oCAIJ,UACE,kBACA,uDAGF,iBACE,qDAGF,eACE,qBAKF,wBACA,aACA,2BACA,mBACA,mBACA,2BAEA,aACE,iCAEA,UACE,uCAEA,SACE,kCAKN,aACE,cACA,mBAIJ,cACE,kBACA,MACA,OACA,WACA,YACA,0BACA,cAGF,kBX37La,sBW67LX,kBACA,uCACA,YACA,gBACA,qCAEA,aARF,SASI,kBAGF,cACE,mBACA,gBACA,eACA,kBACA,0BACA,6BAGF,WACE,6BAGF,yBACE,sCAEA,uBACE,uCACA,wBACA,wBAIJ,eACE,kDAIA,oBACE,+BAIJ,cACE,sBAGF,eACE,aAIJ,kBXj/La,sBWm/LX,kBACA,uCACA,YACA,gBACA,qCAEA,YARF,SASI,uBAGF,kBACE,oBAGF,kBACE,YACA,0BACA,gBACA,mBAGF,YACE,gCACA,4BAGF,YACE,iCAGF,aACE,gBACA,qBACA,eACA,aACA,cAIJ,iBACE,YACA,gBACA,YACA,aACA,uBACA,mBACA,gBX3iMM,yDW8iMN,aAGE,gBACA,WACA,YACA,SACA,sBACA,CADA,gCACA,CADA,kBACA,gBXtjMI,uBW0jMN,iBACE,YACA,aACA,+BACA,iEACA,kBACA,wCACA,uBAGF,iBACE,WACA,YACA,MACA,OACA,uBAGF,iBACE,YACA,WACA,UACA,YACA,4BACA,6BAEA,UACE,8BAGF,UXvlMI,eWylMF,gBACA,cACA,kBACA,2BAGF,iBACE,mCACA,qCAIJ,oCACE,eAEE,uBAGF,YACE,4BAKN,aXjmMwB,eWmmMtB,gBACA,gBACA,kBACA,qBACA,6BAEA,kBACE,wCAEA,eACE,6BAIJ,aACE,0BACA,mCAEA,oBACE,kBAKN,eACE,2BAEA,UACE,8FAEA,8BAEE,CAFF,sBAEE,wBAIJ,iBACE,SACA,UACA,yBAGF,eACE,aACA,kBACA,mBACA,6BAEA,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,uBAIJ,iBACE,mBACA,YACA,gCACA,+BAEA,aACE,cACA,WACA,iBACA,gDAEA,kBACE,yBACA,wBAKN,YACE,uBACA,gBACA,iBACA,iCAEA,YACE,mBACA,iBACA,gBACA,8CAEA,wBACE,kBACA,uBACA,YACA,yCAGF,YACE,8BAIJ,WACE,4CAEA,kBACE,wCAGF,UACE,YACA,iCAGF,cACE,iBACA,WXruMA,gBWuuMA,gBACA,mBACA,uBACA,uCAEA,aACE,eACA,cX9tMc,gBWguMd,gBACA,uBACA,gCAKN,aACE,uBAIJ,eACE,cACA,iDAGE,qBACA,WXlwME,gDWswMJ,QACE,6BACA,kDAEA,aACE,yEAGF,uBACE,4DAGF,aXjxMU,yBWuxMd,cACE,gCAEA,cACE,cX5wMkB,eW8wMlB,kCAEA,oBACE,cXjxMgB,qBWmxMhB,iBACA,gBACA,yCAEA,eACE,WXxyMF,iBWizMN,ab7yMgB,mBa+yMd,gCACA,gBACA,aACA,eACA,eACA,qBAEA,oBACE,iBACA,eAIJ,YACE,mBACA,aACA,gCACA,0BAEA,eACE,qBAGF,aACE,cbv0MY,gBay0MZ,uBACA,mBACA,4BAEA,eACE,uBAGF,aXr0MkB,qBWu0MhB,eACA,gBACA,cACA,gBACA,uBACA,mBACA,qGAKE,yBACE,wBAMR,aACE,eACA,iBACA,gBACA,iBACA,mBACA,gBACA,cX/1MoB,0BWm2MtB,aACE,WACA,2CAEA,gCACE,yBACA,0CAGF,wBACE,eAMR,YACE,gCACA,CACA,iBACA,qBAEA,kBACE,UACA,uBAGF,aACE,CACA,sBACA,kBACA,uBAGF,oBACE,mBbj5MkB,kBam5MlB,cACA,eACA,wBACA,wBAGF,aACE,CACA,0BACA,gBACA,8BAEA,eACE,aACA,2BACA,8BACA,uCAGF,cACE,cX75MkB,kBW+5MlB,+BAGF,aXl6MoB,eWo6MlB,mBACA,gBACA,uBACA,kBACA,gBACA,YACA,iCAEA,UX57ME,qBW87MA,oHAEA,yBAGE,0BAKN,qBACE,uBAIJ,kBACE,6BAEA,kBACE,oDAGF,eACE,6DAGF,UXx9MI,OcFR,eACE,eACA,UAEA,kBACE,kBACA,cAGF,iBACE,MACA,OACA,YACA,qBACA,kBACA,mBACA,sBAEA,kBhBVkB,agBepB,iBACE,aACA,cACA,iBACA,eACA,gBACA,gEAEA,YAEE,gCAGF,aACE,8BAGF,aACE,sBACA,WACA,eACA,cdjCO,UcmCP,oBACA,gBd7CE,yBc+CF,kBACA,iBACA,oCAEA,oBhB7CgB,wBgBkDlB,cACE,sBAGF,YACE,mBACA,iBACA,cAIJ,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,gBACA,mBACA,cACA,uBAEA,iBACE,qBAGF,oBdtFY,8Ec2FZ,gBAGE,gBACA,gCAGF,mBACE,SACA,wCAGF,mBAEE,eAIJ,oBACE,WACA,gBACA,CACA,oBACA,iBACA,gBACA,mBACA,cACA,mBAGF,UACE,iBACA,eAGF,eACE,mBACA,chB7Hc,agBiIhB,cACE,uBACA,UACA,SACA,SACA,chBtIc,0BgBwId,kBACA,mBAEA,oBACE,sCAGF,kCAEE,eAIJ,WACE,eACA,kBACA,eACA,6BAIJ,4BACE,gCAEA,YACE,2CAGF,4BACE,aACA,aACA,mBACA,mGAEA,YAEE,+GAEA,oBhB5KgB,sDgBkLpB,cACE,gBACA,iBACA,YACA,oBACA,chBzLc,sCgB4Ld,gCAGF,YACE,mBACA,4CAEA,aACE,wBACA,iBACA,oCAIJ,uBACE,CADF,oBACE,CADF,eACE,sBACA,eACA,cdxMS,qBc0MT,WACA,UACA,oBACA,qXACA,yBACA,kBACA,CACA,yBACA,mDAGF,aACE,cAIJ,ahB/NkB,qBgBkOhB,+BACE,6BAEA,2BACE,eC5ON,k1BACE,aACA,sBACA,aACA,UACA,yBAGF,YACE,OACA,sBACA,yBACA,2BAEA,MACE,iBACA,qCAIJ,gBACE,YACE,cCtBJ,cACE,qBACA,chBSW,2BgBNX,qBAEE,iBACA,+BAGF,WACE,iBAIJ,sBACE,6BAEA,uBACE,2BACA,4BACA,mBhBHsB,4BgBOxB,oBACE,8BACA,+BACA,aACA,qBAIJ,YACE,8BACA,cACA,clB/BgB,ckBiChB,oBAGF,iBACE,OACA,kBACA,iBACA,gBACA,8BACA,eACA,0BAEA,aACE,6BAIJ,alBhDsB,mCkBmDpB,aACE,oDAGF,WACE,wBAIJ,iBACE,YACA,OACA,WACA,WACA,yBlBjEoB,uBkBsEpB,oBACE,WACA,eACA,yBAGF,iBACE,gBACA,oBAIJ,iBACE,aACA,gBACA,kBACA,gBhB5FM,sBgB8FN,sGAEA,+BAEE,oBAKF,2BACA,gBhBxGM,0BgB2GN,cACE,gBACA,gBACA,oBACA,cACA,WACA,gCACA,chBzGS,yBgB2GT,kBACA,4CAEA,QACE,2GAGF,mBAGE,wCAKN,cACE,6CAEA,SACE,kBACA,kBACA,qDAGF,SACE,WACA,kBACA,MACA,OACA,WACA,YACA,sCACA,mBACA,4BAIJ,SACE,kBACA,wBACA,gBACA,MACA,iCAEA,aACE,WACA,gBACA,gBACA,gBhBpKI,mBgByKR,iBACE,qBACA,YACA,wBAEA,UACE,YACA,wBAIJ,cACE,kBACA,iBACA,chBvKsB,mDgB0KtB,YACE,qDAGF,eACE,uDAGF,YACE,qBAIJ,YACE,YCrMF,qBACE,iBANc,cAQd,kBACA,sCAEA,WANF,UAOI,eACA,mBAIJ,iDACE,eACA,gBACA,gBACA,qBACA,cjBJsB,oBiBOtB,anBjBoB,0BmBmBlB,6EAEA,oBAGE,wCAIJ,ajBlBsB,oBiBuBtB,YACE,oBACA,+BAEA,eACE,yBAIJ,eACE,cjBhCsB,qBiBoCxB,iBACE,cjBrCsB,uBiByCxB,eACE,mBACA,kBACA,kBACA,yHAGF,4CAME,mBACA,oBACA,gBACA,cjBzDsB,qBiB6DxB,aACE,qBAGF,gBACE,qBAGF,eACE,qBAGF,gBACE,yCAGF,aAEE,qBAGF,eACE,qBAGF,kBACE,yCAMA,iBACA,iBACA,yDAEA,2BACE,yDAGF,2BACE,qBAIJ,UACE,SACA,SACA,gCACA,eACA,4BAEA,UACE,SACA,wBAIJ,UACE,yBACA,8BACA,CADA,iBACA,gBACA,mBACA,iEAEA,+BAEE,cACA,kBACA,gBACA,gBACA,cjBrIkB,iCiByIpB,uBACE,gBACA,gBACA,cnBxJY,qDmB4Jd,WAEE,iBACA,kBACA,qBACA,mEAEA,SACE,kBACA,iFAEA,gBACE,kBACA,6EAGF,iBACE,SACA,UACA,mBACA,gBACA,uBACA,+BAMR,YACE,oBAIJ,kBACE,eACA,mCAEA,iBACE,oBACA,8BAGF,YACE,8BACA,eACA,6BAGF,UACE,kDACA,eACA,iBACA,WjBpNI,iBiBsNJ,kBACA,qEAEA,aAEE,6CAIA,ajB9MoB,oCiBmNtB,4CACE,gBACA,eACA,iBACA,qCAGF,4BA3BF,iBA4BI,4BAIJ,iBACE,YACA,sBACA,mBACA,CACA,sBACA,0BACA,QACA,aACA,yCAEA,4CACE,eACA,iBACA,gBACA,cjB/OkB,mBiBiPlB,mBACA,gCACA,uBACA,mBACA,gBACA,wFAEA,eAEE,cACA,2CAGF,oBACE,2BAKN,iBACE,mCAEA,UACE,YACA,CACA,kBACA,uCAEA,aACE,WACA,YACA,mBACA,iCAIJ,cACE,mCAEA,aACE,WjBzSA,qBiB2SA,uDAGE,yBACE,2CAKN,aACE,cjBrSgB,kCiB6StB,iDAEE,CACA,eACA,eACA,iBACA,mBACA,cjBpToB,sCiBuTpB,anBjUkB,0BmBmUhB,kBAIJ,cACE,SACA,UACA,gBACA,uBACA,oBACA,kBACA,oBACA,cACA,kBAGF,4CACE,eACA,iBACA,gBACA,mBACA,cjB7UsB,wBiBgVtB,iDACE,cACA,eACA,gBACA,cACA,kBAIJ,4CACE,eACA,iBACA,gBACA,mBACA,cjB9VsB,kBiBmWtB,cjBnWsB,mCiBkWxB,4CACE,CACA,gBACA,gBACA,mBACA,cjBvWsB,kBiB4WtB,cjB5WsB,kBiBqXtB,cjBrXsB,mCiBoXxB,4CACE,CACA,gBACA,gBACA,mBACA,cjBzXsB,kBiB8XtB,cjB9XsB,mCiBsYxB,gBAEE,mDAEA,2BACE,mDAGF,2BACE,kBAIJ,eACE,kBAGF,kBACE,yCAGF,cAEE,kBAGF,UACE,SACA,SACA,0CACA,cACA,yBAEA,UACE,SACA,iDAIJ,YAEE,+BAGF,kBjB1bW,kBiB4bT,kBACA,gBACA,sBACA,oCAEA,UACE,aACA,2BACA,iBACA,8BACA,mBACA,uDAGF,YACE,yBACA,qBACA,mFAEA,aACE,eACA,qCAGF,sDAVF,UAWI,8BACA,6CAIJ,MACE,sBACA,qCAEA,2CAJF,YAKI,sBAKN,iBACE,yBAEA,WACE,WACA,uBACA,4BAIJ,iBACE,mBACA,uCAEA,eACE,mCAGF,eACE,cACA,qCAGF,eACE,UACA,mDAEA,kBACE,aACA,iBACA,0FAKE,oBACE,gFAIJ,cACE,qDAIJ,aACE,cACA,6CAGF,UACE,YACA,0BACA,mDAGF,cACE,4DAEA,cACE,qCAKN,oCACE,eACE,sCAIJ,2BA7DF,iBA8DI,mFAIJ,qBAGE,mBjBnjBS,kBiBqjBT,kCACA,uBAGF,YACE,kBACA,WACA,YACA,2BAEA,YACE,WACA,uCAKF,YACE,eACA,mBACA,mBACA,qCAGF,sCACE,kBACE,uCAIJ,ajB3kBsB,qCiB+kBtB,eACE,WjBjmBE,gBiBmmBF,2CAEA,ajBrlBkB,gDiBwlBhB,ajBvlBkB,+CiB6lBtB,eACE,qBAIJ,kBACE,yBAEA,aACE,SACA,eACA,YACA,kBACA,qCAIJ,gDAEI,kBACE,yCAGF,eACE,gBACA,WACA,kBACA,uDAEA,iBACE,sCAMR,8BACE,aACE,uCAEA,gBACE,sDAGF,kBACE,6EAIJ,aAEE,qBAIJ,WACE,UAIJ,mBACE,qCAEA,SAHF,eAII,kBAGF,YACE,uBACA,mBACA,aACA,qBAEA,SjBvrBI,YiByrBF,qCAGF,gBAXF,SAYI,mBACA,sBAIJ,eACE,uBACA,gBACA,gBACA,uBAGF,eACE,gBACA,0BAEA,YACE,gBACA,eACA,cjBhsBkB,6BiBosBpB,eACE,iBACA,+BAGF,kBjBhtBS,aiBktBP,0BACA,aACA,uCAEA,YACE,gCAIJ,cACE,gBACA,uDAEA,YACE,mBACA,iDAGF,UACE,YACA,0BACA,gCAIJ,YACE,uCAEA,4CACE,eACA,gBACA,cACA,qCAGF,cACE,cjB/uBgB,uFiBqvBtB,eACE,cASA,CjB/vBoB,2CiB4vBpB,iBACA,CACA,kBACA,gBAGF,eACE,cACA,aACA,kDACA,cACA,qCAEA,eAPF,oCAQI,cACA,8BAEA,UACE,aACA,sBACA,0CAEA,OACE,cACA,2CAGF,YACE,mBACA,QACA,cACA,qCAIJ,UACE,2BAGF,eACE,sCAIJ,eAtCF,UAuCI,6BAEA,aACE,gBACA,gBACA,2GAEA,eAGE,uFAIJ,+BAGE,2BAGF,YACE,gCAEA,eACE,qEAEA,eAEE,gBACA,2CAGF,eACE,SAQZ,iBACE,qBACA,iBAGF,aACE,kBACA,aACA,UACA,YACA,cjB51BsB,qBiB81BtB,eACA,qCAEA,gBAVF,eAWI,WACA,gBACA,cnBh3Bc,SoBNlB,UACE,eACA,iBACA,yBACA,qBAEA,WAEE,iBACA,mBACA,6BACA,gBACA,mBACA,oBAGF,qBACE,gCACA,aACA,gBACA,oBAGF,eACE,qEAGF,kBlBhBW,UkBqBX,apBxBoB,0BoB0BlB,gBAEA,oBACE,eAIJ,eACE,CAII,4HADF,eACE,+FAOF,sBAEE,yFAKF,YAEE,gCAMJ,kBlBzDS,6BkB2DP,gCACA,4CAEA,qBACE,8BACA,2CAGF,uBACE,+BACA,0BAKN,qBACE,gBAIJ,aACE,mBACA,MAGF,+CACE,0BAGF,sBACE,SACA,aACA,8CAGF,oBAEE,qBACA,iBACA,eACA,clB5FsB,gBkB8FtB,0DAEA,UlBhHM,wDkBoHN,eACE,iBACA,sEAGF,cACE,yCAKF,YAEE,yDAEA,qBACE,iBACA,eACA,gBACA,qEAEA,cACE,2EAGF,YACE,mBACA,uFAEA,YACE,qHAOJ,sBACA,cACA,uBAIJ,wBACE,mBlBvJS,sBkByJT,YACA,mBACA,gCAEA,gBACE,mBACA,oBAIJ,YACE,yBACA,aACA,mBlBtKS,gCkByKT,aACE,gBACA,mBAIJ,wBACE,aACA,mBACA,qCAEA,wCACE,4BACE,0BAIJ,kBACE,iCAGF,kBlB9LS,uCkBiMP,kBACE,4BAIJ,gBACE,oBACA,sCAEA,SACE,wCAGF,YACE,mBACA,mCAGF,aACE,aACA,uBACA,mBACA,kBACA,6CAEA,UACE,YACA,kCAIJ,aACE,mCAGF,aACE,iBACA,clB/NgB,gBkBiOhB,mCAIJ,QACE,WACA,qCAEA,sBACE,gBACA,qCAOJ,4FAFF,YAGI,gCAIJ,aACE,uCAEA,iBACE,sCAGF,eACE,4BAIJ,wBACE,aACA,gBACA,qCAEA,2BALF,4BAMI,sCAIJ,+CACE,YACE,iBC7RN,YACE,uBACA,WACA,iBACA,iCAEA,gBACE,gBACA,oBACA,cACA,wCAEA,YACE,yBACA,mBnBPO,YmBSP,yBAIJ,WAvBc,UAyBZ,oBACA,iCAEA,YACE,mBACA,YACA,uCAEA,aACE,yCAEA,oBACE,aACA,2CAGF,SnBxCA,YmB0CE,kBACA,YACA,uCAIJ,aACE,cnBjCgB,qBmBmChB,cACA,eACA,aACA,0HAIA,kBAGE,+BAKN,aACE,iBACA,YACA,aACA,qCAGF,sCACE,YACE,6BAIJ,eACE,0BACA,gBACA,mBACA,qCAEA,2BANF,eAOI,+BAGF,aACE,aACA,cnB3EgB,qBmB6EhB,0BACA,2CACA,0BACA,mBACA,gBACA,uBACA,mCAEA,gBACE,oCAGF,UnBzGA,yBmB2GE,0BACA,2CACA,uCAGF,kBACE,sBACA,+BAIJ,kBACE,wBACA,SACA,iCAEA,QACE,kBACA,6DAIJ,UnBjIE,yBFMc,gBqB8Hd,gBACA,mEAEA,qBACE,6DAKN,yBACE,iCAKF,UACA,gBAEA,sCAGF,uCACE,YACE,iCAGF,WA/JY,cAiKV,sCAIJ,gCACE,UACE,0BAMF,2BACA,qCAEA,wBALF,cAMI,CACA,sBACA,kCAGF,YACE,oBAEA,gCACA,0BAEA,eAEA,mBACA,8BACA,mCAEA,eACE,kBACA,yCAGF,mBACE,4DAEA,eACE,qCAIJ,gCAzBF,eA0BI,iBACA,6BAIJ,anBnMsB,emBqMpB,iBACA,gBACA,qCAEA,2BANF,eAOI,6BAIJ,anB9MsB,emBgNpB,iBACA,gBACA,mBACA,4BAGF,cACE,gBACA,cnBzNkB,mBmB2NlB,kBACA,gCACA,4BAGF,cACE,cnBhOoB,iBmBkOpB,gBACA,0CAGF,UnBvPI,gBmByPF,uFAGF,eAEE,gEAGF,aACE,4CAGF,cACE,gBACA,WnBvQE,oBmByQF,iBACA,gBACA,gBACA,2BAGF,cACE,iBACA,cnBhQoB,mBmBkQpB,kCAEA,UnBrRE,gBmBuRA,CAII,2NADF,eACE,4BAMR,UACE,SACA,SACA,0CACA,cACA,mCAEA,UACE,SACA,qCAKN,eA7SF,aA8SI,iCAEA,YACE,yBAGF,UACE,UACA,YACA,iCAEA,YACE,4BAGF,YACE,8DAGF,eAEE,gCACA,gBACA,0EAEA,eACE,+BAIJ,eACE,6DAGF,2BrB5UgB,YqBmVtB,UACE,SACA,cACA,WACA,sDAKA,anBlVsB,0DmBqVpB,arB/VkB,4DqBoWpB,anBzWc,gBmB2WZ,4DAGF,anB7WU,gBmB+WR,0DAGF,arBhXgB,gBqBkXd,0DAGF,anBrXU,gBmBuXR,UAIJ,YACE,eACA,yBAEA,aACE,qBACA,oCAEA,kBACE,4BAGF,cACE,gBACA,+BAEA,oBACE,iBACA,gCAIJ,eACE,eACA,CAII,iNADF,eACE,2BAKN,oBACE,cnBjZkB,qBmBmZlB,eACA,gBACA,gCACA,iCAEA,UnBxaE,gCmB0aA,oCAGF,arBvagB,gCqByad,CAkBJ,gBAIJ,aACE,iBACA,eACA,sBAGF,aACE,eACA,cACA,wBAEA,aACE,kBAIJ,YACE,eACA,mBACA,wBAGF,YACE,WACA,sBACA,aACA,+BAEA,aACE,qBACA,gBACA,eACA,iBACA,cnBrdsB,CmB0dlB,4MADF,eACE,sCAKN,aACE,gCAIJ,YAEE,mBACA,kEAEA,UACE,kBACA,4BACA,gFAEA,iBACE,kDAKN,aAEE,aACA,sBACA,4EAEA,cACE,WACA,kBACA,mBACA,uEAIJ,cAEE,iBAGF,YACE,eACA,kBACA,2CAEA,kBACE,eACA,8BAGF,kBACE,+CAGF,gBACE,uDAEA,gBACE,mBACA,YACA,YAKN,kBACE,eACA,cAEA,arB/iBoB,qBqBijBlB,oBAEA,yBACE,SAKN,aACE,YAGF,kBACE,iBACA,oBAEA,YACE,2BACA,mBACA,aACA,mBnBlkBS,cAOW,0BmB8jBpB,eACA,kBACA,oBAGF,iBACE,4BAEA,aACE,SACA,kBACA,WACA,YACA,qBAIJ,2BACE,mBAGF,oBACE,uBAGF,arBnmBgB,oBqBumBhB,kBACE,0BACA,aACA,cnB9lBoB,gDmBgmBpB,eACA,qBACA,gBACA,kBAGF,cACE,kBACA,crBpnBc,2BqBwnBhB,iBACE,SACA,WACA,WACA,YACA,kBACA,oCAEA,kBnBnoBY,oCmBuoBZ,kBACE,mCAGF,kBrBtoBkB,sDqB2oBpB,anBhoBwB,qBmBooBtB,gBACA,sBAGF,aACE,0BAGF,anB5oBwB,sBmBgpBxB,anBhqBc,yDmBqqBhB,oBAIE,cnBzpBwB,iGmB4pBxB,eACE,yIAIA,4BACE,cACA,iIAGF,8BACE,CADF,sBACE,WACA,sBAKN,YAEE,mBACA,sCAEA,aACE,CACA,gBACA,kBACA,0DAIA,8BACE,CADF,sBACE,WACA,gBAKN,kBACE,8BACA,yBAEA,yBnBrtBc,yBmBytBd,yBACE,wBAGF,yBnB1tBU,wBmB+tBR,2BACA,eACA,iBACA,4BACA,kBACA,gBACA,0BAEA,anB3tBoB,uBmBiuBpB,wBACA,qBAGF,arBjvBgB,cqBsvBlB,kBnBjvBa,kBmBmvBX,mBACA,uBAEA,YACE,8BACA,mBACA,aACA,gCAEA,SACE,SACA,gDAEA,aACE,8BAIJ,aACE,gBACA,cnBhwBkB,iBmBkwBlB,gCAEA,aACE,qBACA,iHAEA,aAGE,mCAIJ,anB7xBM,6BmBoyBR,YACE,2BACA,6BACA,mCAEA,kBACE,gFAGF,YAEE,cACA,sBACA,YACA,cnBpyBgB,mLmBuyBhB,kBAEE,gBACA,uBACA,sCAIJ,aACE,6BACA,4CAEA,arB/zBU,iBqBi0BR,gBACA,wCAIJ,aACE,sBACA,WACA,aACA,qBACA,cnB/zBgB,WmBs0BxB,kBAGE,0BAFA,eACA,uBASA,CARA,eAGF,oBACE,gBACA,CAEA,qBACA,oBAGF,YACE,eACA,CACA,kBACA,wBAEA,qBACE,cACA,mBACA,aACA,0FAGF,kBAEE,kBACA,YACA,6CAGF,QACE,SACA,+CAEA,aACE,sEAGF,uBACE,yDAGF,anBn4BY,8CmBw4Bd,qBACE,aACA,WnB34BI,cmBg5BR,iBACE,sBCn5BF,YACE,eACA,CACA,kBACA,0BAEA,qBACE,iBACA,cACA,mBACA,yDAEA,YAEE,mBACA,kBACA,sBACA,YACA,4BAGF,oBACE,cACA,cACA,qGAEA,kBAGE,sDAKN,iBAEE,gBACA,eACA,iBACA,WpBrCI,6CoBuCJ,mBACA,iBACA,4BAGF,cACE,6BAGF,cACE,cpBjCoB,kBoBmCpB,gBACA,qBAIJ,YACE,eACA,cACA,yBAEA,gBACE,mBACA,6BAEA,aACE,sCAIJ,apBrDwB,gBoBuDtB,qBACA,UC3EJ,aACE,gCAEA,gBACE,eACA,mBACA,+BAGF,cACE,iBACA,8CAGF,aACE,kBACA,wBAGF,gBACE,iCAGF,aACE,kBACA,uCAGF,oBACE,gDAGF,SACE,YACA,8BAGF,cACE,iBACA,mEAGF,aACE,kBACA,2DAGF,cAEE,gBACA,mFAGF,cACE,gBACA,mCAGF,aACE,iBACA,yBAGF,kBACE,kBACA,4BAGF,UACE,UACA,wBAGF,aACE,kCAGF,MACE,WACA,cACA,mBACA,2CAGF,aACE,iBACA,0CAGF,gBACE,eACA,mCAGF,WACE,sCAGF,gBACE,gBACA,yCAGF,UACE,iCAGF,aACE,iBACA,0BAGF,SACE,WACA,0DAGF,iBAEE,mBACA,4GAGF,iBAEE,gBACA,uCAGF,kBACE,eACA,2BAGF,aACE,kBACA,wCAGF,SACE,YACA,yDAGF,SACE,WACA,CAKA,oFAGF,UACE,OACA,uGAGF,UAEE,uCAIA,cACE,iBACA,kEAEA,cACE,gBACA,qCAKN,WACE,eACA,iBACA,uCAGF,WACE,sCAGF,aACE,kBACA,0CAGF,gBACE,eACA,uDAGF,gBACE,2CAGF,cACE,iBACA,YACA,yEAGF,aAEE,iBACA,iBAGF,wBACE,iBAGF,SACE,oBACA,yBAGF,aACE,8EAGF,cAEE,gBACA,oDAGF,cACE,mBACA,gEAGF,iBACE,gBACA,CAMA,8KAGF,SACE,QACA,yDAGF,kBACE,eACA,uDAGF,kBACE,gBACA,qDAGF,SACE,QACA,8FAGF,cAEE,mBACA,4CAGF,UACE,SACA,kDAEA,UACE,OACA,+DACA,8BAIJ,sXACE,uCAGF,gBAEE,kCAGF,cACE,iBACA,gDAGF,UACE,UACA,gEAGF,aACE,uDAGF,WACE,WACA,uDAGF,UACE,WACA,uDAGF,UACE,WACA,kDAGF,MACE,0CAGF,iBACE,yBACA,qDAGF,cACE,iBACA,qCAGF,kCACE,gBAEE,kBACA,2DAEA,gBACE,mBACA,uEAKF,gBAEE,kBACA,gFAKN,cAEE,gBACA,6CAKE,eACE,eACA,sDAIJ,aACE,kBACA,4DAKF,cACE,gBACA,8DAGF,gBACE,eACA,mCAIJ,aACE,kBACA,iBACA,kCAGF,WACE,mCAGF,WACE,oCAGF,cACE,gBACA,gFAGF,cACE,mBACA,+DAGF,SACE,QACA,kkEC7ZJ,kIACE,CADF,sIACE,qBACA,sCxB6EF,QACE,qBACE,gBACA,SAGF,SACE,gBACA,gBACA,+BAIJ,eAEE,sBACA,kBACA,gBACA,kBACA,kCACA,4BACA,gEAGF,gBAEE,uBACA,2BACA,qBAGF,eACE,UACA,wDAGF,qBAEE,sBACA,MAKF,cACE,oDACA,WACA,kCAGF,eAGE,cAGF,UACE,sBACA,WAGF,kBAzIW,sGAmBT,gBAIA,YAqHA,iBAGF,UACE,CAEA,oBACA,CADA,mBACA,CADA,4BACA,WACA,YACA,wBAGF,qGA7GE,eAIA,gBACA,WA0GA,mCAGF,eACE,WACA,gBACA,eACA,UACA,cACA,kBACA,QACA,4BAGF,iBACE,0BACA,YACA,cA3KS,yDA8KT,4BACA,uBACA,4BACA,yBACA,wBAGF,gBACE,eACA,mBAvLS,eA2LX,aACI,YACA,kBAEA,YACA,UACA,YACA,aACA,iGACA,4BACA,iCACA,UACA,gBAGJ,eACE,UACA,6BAGF,SACE,SAGF,gBACE,qBAGF,kBAvNW,CAcT,eACA,6CA2MA,CA3MA,kBA2MA,CA3MA,sBA2MA,CAMA,uCAHF,UACE,gBACA,mBAYA,CAXA,eAGF,WACE,eACA,CAvNA,eACA,6CAyNA,CAzNA,kBAyNA,CAzNA,sBAyNA,CAEA,oBACA,gCAGF,kBA3OsB,uCA+OtB,YACE,uBAEF,gBACE,mBAnPoB,4CAuPtB,UACE,yBAGF,eACE,eACA,wBAGF,kBAnQW,WAqQT,cACA,eACA,gBACA,cACA,eACA,sGAvPA,gBAIA,8BAsPA,UACE,mEAIJ,qGAvOE,eAIA,gBACA,yBAoOA,6BAMA,eACA,eAIA,iDARF,kBAvRW,WAyRT,YACA,CAEA,qGAzQA,gBAIA,eAuQA,gBAUA,kCAGF,iBACE,UACA,UACA,gBACA,eACA,cACA,2BAGF,cACE,gBACA,6BAGF,8BACE,gCACA,mCAGF,kBA9TW,WAgUT,oCAGF,UACE,oDAGF,yBACE,kBACA,kBACA,YACA,qBAGF,wBA9UW,CAcT,eACA,CAkUA,4CACA,CADA,kBACA,CADA,kBACA,2BAGF,UACE,gBACA,eACA,kBACA,UACA,SACA,yBA3VS,qBA6VT,cACA,gBACA,6CAGF,UACE,gBACA,kCAGF,WACE,iCAEF,WACE,iBAGF,gBACE,mCAIA,qBACA,CAvVA,4CACA,CADA,kBACA,CADA,gBACA,gBACA,WAwVA,YACA,sEAGF,qBACE,yCAGF,QACE,iBACA,kDAGF,SACE,qCAGF,YACE,mCAGF,eACE,aACA,WAGF,wBAjZW,sGAmBT,gBAIA,YA6XA,iBAGF,oBACE,WACA,CAzWA,+BA4WF,qGAjXE,eAIA,gBAsXA,CArXA,cAgXF,UACE,sBACA,CAlXA,cAoXA,YACA,+FAGF,UAEE,gCACA,CAIA,iIAGF,gBACE,oBAGF,wBAtbW,WAwbT,sGAraA,gBAIA,wBAqaF,0lBACE,wBAEA,uCAGF,kBAlcW,WAqcT,kBAGF,yBACE,WACA,SAraA,4CACA,CADA,kBACA,CADA,gBACA,gBACA,sBAwaA,CACA,mBACA,mBACA,uBAGF,wBArdW,kBAydX,cACE,uEAGF,aAEE,qBAGF,qBACE,kBACA,YACA,UACA,mBAteS,uBAweT,CAEA,eACA,iCACA,8BACA,iBACA,sCAGF,qBACE,4BAGF,WACE,8BAGF,gBACE,kBACA,2CAEA,cACE,kCAGJ,UACE,CAlgBS,+DAugBT,kBAvgBS,4DA2gBT,eACE,wBACA,gCAIJ,iBACE,oDAGF,cACE,kBAGF,eACE,4BACA,WACA,0BACA,YACA,gCAGF,aACE,uCAGF,UACE,gBACA,0GAlgBA,4CACA,CADA,kBACA,CADA,gBACA,gBACA,uBAugBA,CAvgBA,cAugBA,6CACA,CADA,oCACA,8BAGF,wBAljBW,SAojBT,iCACA,kBACA,mBACA,iBACA,cAEF,kBA1jBW,CAaT,4CACA,CADA,kBACA,CADA,gBACA,gBACA,UA8iBA,iBAGA,0HAFA,aAIE,qBAriBF,4CACA,CADA,kBACA,CADA,gBACA,gBACA,kCA2iBF,kBACE,eACA,sDAGF,sBAEE,YACA,CEjlBU,2IFslBV,aEtlBU,0BF2lBZ,kBA5lBW,CAaT,4CACA,CADA,kBACA,CADA,gBACA,gBACA,mBAglBA,iCAlkBA,4CACA,CADA,kBACA,CADA,gBACA,gBACA,mBAukBF,aArmBkB,uCAymBlB,gBACE,sBACA,mBACA,0BAGF,aACE,uCAGF,gBACE,mBACA,cAGF,eACE,gBACA,sBACA,WACA,oBAGF,qBACE,qBAGF,UACE,0BACA,gBACA,YAGF,UACE,gBACA,CA5oBS,qGAmBT,gBAIA,CAwnBA,eACA,6BAJA,kBA5oBS,CAuBT,UA6nBE,2BAIJ,UACC,4DAGD,UACE,gBACA,iCAGF,UACE,UAGF,gCACE,0GAGF,kBAzqBW,sGAmBT,gBAIA,sHAupBF,kBA9qBW,wHAkrBX,qGAvoBE,eAIA,gBACA,gDAsoBF,UACE,eAGF,yBACE,WACA,wBAGF,UACE,eACA,6BAGF,eACE,iBAGF,kBAxsBW,CAaT,+BACA,gBACA,qBA4rBA,gBACA,mBACA,6CACA,CADA,+BACA,CADA,gBACA,cAGF,UACE,sGA/rBA,gBAIA,YA6rBA,WACA,cACA,iCAGF,eACE,WACA,gBACA,eACA,UACA,cACA,kBACA,QACA,0BAIF,iBACE,iBACA,WACA,YACA,cAzuBS,yDA4uBT,4BACA,uBACA,4BACA,yBACA,yBAGF,4BACE,qCAGF,8YACE,4BACA,uBACA,4BACA,yBACA,iBACA,SAOF,kBApwBW,CAswBT,WACA,iCACA,CACA,oBACA,CADA,iCACA,CADA,sBACA,gBACA,eAIA,UACA,CA3uBA,4CACA,CADA,kBACA,CADA,gBACA,gBACA,oCAuuBF,qBAOE,gBAGF,gBACE,WACA,gBACA,sBAvxBqB,sBAyxBrB,mBAEA,UACE,oBACA,gBACA,yBAIJ,wBAtyBW,WAwyBT,iCACA,0BAGF,UACE,sOAGF,wBA7yBsB,WAkzBpB,mBAGF,UACE,0BAEA,SACE,yBAGF,UACE,sCAIJ,wBAp0BW,CAu0BT,yBACA,CADA,2BACA,iBAGF,UACE,wBAGF,UACE,gBACA,mFA5yBA,4CACA,CADA,kBACA,CADA,gBACA,gBACA,+CAmzBF,eACE,gCAGF,eACE,gCACA,mBACA,+BAGF,6BACE,+BACA,8CAGF,wBAz2BW,0BA22BT,eACA,gBACA,wBAGF,wBAh3BW,gBAk3BT,iBACA,kCAGF,8BACE,4HAGF,kBA13BW,uEA+3BX,aA93BkB,mDAk4BlB,kBAn4BW,iBAs4BT,yGAGF,kBAt4BsB,4LA24BtB,gBAKE,WACA,sGAj4BA,gBAIA,mBAvBS,oCAy5BX,UACE,2CAGF,eACE,+BAGF,cACE,gBACA,cACA,kBACA,UACA,yBAt6BS,eAw6BT,cACA,wBAGF,iBACE,iBACA,0BACA,yBA/6BS,WAi7BT,0BAGF,UACE,+BAGF,UACE,0BACA,iDA75BA,4CACA,CADA,kBACA,CADA,gBACA,gBACA,mBAg6BA,cACA,iCAGF,eACE,0BACA,yBAr8BS,YAu8BT,sBACA,8CAGF,cACE,gBACA,2BACA,qDAGF,WACE,eACA,gBACA,WACA,gDAGF,YACE,8BAGF,SACE,2BAGF,gBACE,gBACA,yBAl+BS,sBAo+BT,uBACA,6BAIF,UACE,sBACA,CACA,qGAj8BA,eAIA,gBACA,qCAg8BF,gCACE,qCAGF,UACE,gBACA,kBAGF,wBAz/BW,kBA2/BT,0BACA,SA5/BS,qGAmBT,CAIA,eA2+BA,WACA,gBACA,sDALF,wBA//BW,gBA0gCT,qGA/9BA,eAIA,gBACA,kBA89BA,UACE,8BACA,yBAEA,qGA//BF,gBAIA,kBAkgCF,wBAzhCW,sGA2CT,CAIA,eACA,eA4+BA,yBAGF,eACE,WACA,gBACA,eACA,UACA,kBACA,cACA,kBACA,UACA,kBAGF,iBACE,iBACA,WACA,YACA,cA/iCS,+YAkjCT,4BACA,uBACA,4BACA,yBACA,oBAGF,wBAzjCW,WA2jCT,iCACA,oBACA,eACA,cAGF,4BACE,WACA,oBACA,wBAjkCoB,WAmkClB,8CAKF,WACE,SACA,UACA,wCAMA,iBACA,qFAJF,yBACE,4BACA,6BAOE,0CAGF,WACE,WACA,CAMJ,4FACA,yDAGA,wGACA,yDAGA,wEACA,yDAGA,gFACA,yDAGA,sEACA,0DAGA,0FACA,0DAGA,gGACA,0DAGA,wEACA,0DAGA,sEACA,0DAGA,4FACA,0DAGA,wEACA,0DAGA,8EACA,mFAGF,YACE,kCAGF,qBACE,gBACA,eACA,WACA,iBACA,kBACA,mBACA,OAEA,aACA,cACA,kBACA,yBACA,WACA,YACA,CAIA,wBACA,0BACA,2BAjqCA,4CACA,CADA,kBACA,CADA,gBACA,gBACA,yBAfS,yCAsrCX,YACE,yBAGF,wBA1rCW,kBA8rCX,wBACE,4CAGF,UACE,6BAGF,yBACE,WACA,YACA,iBAGF,wBA5sCW,SA8sCT,8BACA,8CAGF,UACE,YACA,gCAGF,UACE,gBACA,kCAGF,UACE,sBAGF,YACE,2BAGF,yBACE,kCAGF,qGA7rCE,eAIA,gBACA,wDA4rCF,eAxuCuB,gBA2uCrB,sBACA,iBACA,kBAGF,4BACE,yBAGF,YACE,gCAGF,UACE,sGAltCA,eAIA,gBACA,8CAitCF,sBACE,oDAGF,sBACE,WACA,0BACA,0CAGF,oBAGE,2FAGF,UACE,4GAGF,qBAII,qBACA,sBACA,yCAGJ,eACI,8BAGJ,iBACI,SACA,iDAGJ,iBACI,SACA,mCAGJ,kBACI,uBAGJ,iBACI,0BAGJ,iBACI,kBAGJ,iBACI,0BAGJ,iBACI,SACA,2GAGJ,qGA9yCE,gBAIA,mBAvBS,2FAu0CX,sBAIE,cACA,mBAz0CoB,WA20CpB,gBACA,iBACA,qBAGF,4BACE,0CAGF,eACE,gBACA,oFAGF,kBA51CW,iBA81CT,sDAGF,kBA91CsB,WAg2CpB,gBACA,YACA,eACA,gBACA,CAKE,+RAEA,UAGE,CAj0CJ,gMAo0CE,qGAz0CF,eAIA,gBACA,uHA00CF,eAEE,WA50CA,2CAi1CF,oQAEE,uBAGF,iBACE,MACA,wBACA,WACA,yBAv4CoB,eAy4CpB,gBACA,WACA,WACA,cACA,CACA,wBACA,sBACA,gBAGF,iBACE,mBAv5CS,sGAmBT,gBAIA,WAm4CA,YACA,iBACA,WACA,iBACA,sBACA,gBACA,sCAGF,eACE,UACE,YACA,kBACA,sCAIJ,eACE,WACE,YACA,0BACA,SACA,kCAIJ,eACE,YACA,cACA,WACA,iCAGF,aACE,wBACA,CAh7CA,4CACA,CADA,kBACA,CADA,gBACA,gBACA,kBAg7CA,iBACA,kBACA,mBACA,sBACA,yBAGF,wBAt8CW,WAw8CT,eACA,gBACA,sBACA,kBACA,yBAGF,eACE,mBAh9CS,WAk9CT,WACA,YACA,oBACA,+BAGF,iBACE,QACA,SACA,WACA,YACA,SACA,4BAGF,kBAj+CW,CAm+CT,gBACA,WACA,+BAEA,oBACE,4EAEA,WAEE,2BACA,sCAt9CJ,UA69CI,wEAJF,iBACE,sGA99CJ,gBAIA,CA49CI,WASA,CARA,kCAGF,oBACE,CAEA,SAEA,iCAGF,oBACE,qIA58CJ,gBAMA,2BACA,4BACA,gBAs8CI,SACA,WACA,wBACA,0CAEA,kBAvgDK,WAygDH,gBACA,mBACA,uCAGF,kBA9gDK,WAghDH,kCAIJ,uBACE,uBACA,kBACA,UACA,SACA,UACA,qCAEA,kBA5hDK,qBA8hDH,wBACA,uCAEA,kBAjiDG,qIAoDT,gBAMA,2BACA,4BACA,WAw+CQ,gBACA,kBACA,UACA,gDAEA,kBAziDC,WA2iDC,mBACA,gBACA,kBACA,iBACA,kBACA,kBACA,UACA,4DAEA,aACE,sDAGF,sBACE,WACA,6CAIJ,kBA9jDC,WAgkDC,sCAQZ,iCACE,gBACE,yBAGF,mBACE,sCAIJ,iCACE,eACE,yBAKE,gBACA,WACA,YACA,iCAEF,aACE,WACA,0BACA,iBAKN,qBAlmDuB,WAomDrB,sBACA,gBACA,kBACA,MACA,OACA,WACA,sBAGF,qBACE,CA7kDA,4CACA,CADA,kBACA,CADA,gBACA,gBACA,weA+kDF,UAeE,qEAGF,qBAEE,sJAGF,UAKE,sBACA,CA9mDA,4CACA,CADA,kBACA,CADA,gBACA,gBACA,4WA+mDA,qBACE,qEAIJ,kBA3pDW,sGAmBT,gBAIA,WA0oDA,gBACA,uFAEA,kBApqDS,4CAyqDX,eArqDuB,WAwqDrB,iBACA,kBACA,sBACA,gDAEA,UACE,0BACA,gGAIJ,kBAvrDW,yBA8rDX,yBACE,YACA,kCAGF,UACE,sBACA,kBACA,CAIA,4CACA,CADA,kBACA,CADA,gBACA,WACA,YACA,qBACA,sBACA,iBACA,2CAGF,qBACE,gCACA,8FAGF,UAGE,kCACA,ooB","file":"skins/vanilla/win95/common.css","sourcesContent":["@font-face{font-family:\"premillenium\";src:url(\"~fonts/premillenium/MSSansSerif.ttf\") format(\"truetype\")}html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:\"\";content:none}table{border-collapse:collapse;border-spacing:0}html{scrollbar-color:#192432 rgba(0,0,0,.1)}::-webkit-scrollbar{width:12px;height:12px}::-webkit-scrollbar-thumb{background:#192432;border:0px none #fff;border-radius:50px}::-webkit-scrollbar-thumb:hover{background:#1c2938}::-webkit-scrollbar-thumb:active{background:#192432}::-webkit-scrollbar-track{border:0px none #fff;border-radius:0;background:rgba(0,0,0,.1)}::-webkit-scrollbar-track:hover{background:#121a24}::-webkit-scrollbar-track:active{background:#121a24}::-webkit-scrollbar-corner{background:transparent}body{font-family:\"mastodon-font-sans-serif\",sans-serif;background:#06090c;font-size:13px;line-height:18px;font-weight:400;color:#fff;text-rendering:optimizelegibility;font-feature-settings:\"kern\";text-size-adjust:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-tap-highlight-color:transparent}body.system-font{font-family:system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"Oxygen\",\"Ubuntu\",\"Cantarell\",\"Fira Sans\",\"Droid Sans\",\"Helvetica Neue\",\"mastodon-font-sans-serif\",sans-serif}body.app-body{padding:0}body.app-body.layout-single-column{height:auto;min-height:100vh;overflow-y:scroll}body.app-body.layout-multiple-columns{position:absolute;width:100%;height:100%}body.app-body.with-modals--active{overflow-y:hidden}body.lighter{background:#121a24}body.with-modals{overflow-x:hidden;overflow-y:scroll}body.with-modals--active{overflow-y:hidden}body.player{text-align:center}body.embed{background:#192432;margin:0;padding-bottom:0}body.embed .container{position:absolute;width:100%;height:100%;overflow:hidden}body.admin{background:#0b1016;padding:0}body.error{position:absolute;text-align:center;color:#9baec8;background:#121a24;width:100%;height:100%;padding:0;display:flex;justify-content:center;align-items:center}body.error .dialog{vertical-align:middle;margin:20px}body.error .dialog__illustration img{display:block;max-width:470px;width:100%;height:auto;margin-top:-120px}body.error .dialog h1{font-size:20px;line-height:28px;font-weight:400}button{font-family:inherit;cursor:pointer}button:focus{outline:none}.app-holder,.app-holder>div,.app-holder>noscript{display:flex;width:100%;align-items:center;justify-content:center;outline:0 !important}.app-holder>noscript{height:100vh}.layout-single-column .app-holder,.layout-single-column .app-holder>div{min-height:100vh}.layout-multiple-columns .app-holder,.layout-multiple-columns .app-holder>div{height:100%}.error-boundary,.app-holder noscript{flex-direction:column;font-size:16px;font-weight:400;line-height:1.7;color:#e25169;text-align:center}.error-boundary>div,.app-holder noscript>div{max-width:500px}.error-boundary p,.app-holder noscript p{margin-bottom:.85em}.error-boundary p:last-child,.app-holder noscript p:last-child{margin-bottom:0}.error-boundary a,.app-holder noscript a{color:#00007f}.error-boundary a:hover,.error-boundary a:focus,.error-boundary a:active,.app-holder noscript a:hover,.app-holder noscript a:focus,.app-holder noscript a:active{text-decoration:none}.error-boundary__footer,.app-holder noscript__footer{color:#404040;font-size:13px}.error-boundary__footer a,.app-holder noscript__footer a{color:#404040}.error-boundary button,.app-holder noscript button{display:inline;border:0;background:transparent;color:#404040;font:inherit;padding:0;margin:0;line-height:inherit;cursor:pointer;outline:0;transition:color 300ms linear;text-decoration:underline}.error-boundary button:hover,.error-boundary button:focus,.error-boundary button:active,.app-holder noscript button:hover,.app-holder noscript button:focus,.app-holder noscript button:active{text-decoration:none}.error-boundary button.copied,.app-holder noscript button.copied{color:#79bd9a;transition:none}.container-alt{width:700px;margin:0 auto;margin-top:40px}@media screen and (max-width: 740px){.container-alt{width:100%;margin:0}}.logo-container{margin:100px auto 50px}@media screen and (max-width: 500px){.logo-container{margin:40px auto 0}}.logo-container h1{display:flex;justify-content:center;align-items:center}.logo-container h1 svg{fill:#fff;height:42px;margin-right:10px}.logo-container h1 a{display:flex;justify-content:center;align-items:center;color:#fff;text-decoration:none;outline:0;padding:12px 16px;line-height:32px;font-family:\"mastodon-font-display\",sans-serif;font-weight:500;font-size:14px}.compose-standalone .compose-form{width:400px;margin:0 auto;padding:20px 0;margin-top:40px;box-sizing:border-box}@media screen and (max-width: 400px){.compose-standalone .compose-form{width:100%;margin-top:0;padding:20px}}.account-header{width:400px;margin:0 auto;display:flex;font-size:13px;line-height:18px;box-sizing:border-box;padding:20px 0;padding-bottom:0;margin-bottom:-30px;margin-top:40px}@media screen and (max-width: 440px){.account-header{width:100%;margin:0;margin-bottom:10px;padding:20px;padding-bottom:0}}.account-header .avatar{width:40px;height:40px;margin-right:8px}.account-header .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px}.account-header .name{flex:1 1 auto;color:#d9e1e8;width:calc(100% - 88px)}.account-header .name .username{display:block;font-weight:500;text-overflow:ellipsis;overflow:hidden}.account-header .logout-link{display:block;font-size:32px;line-height:40px;margin-left:8px}.grid-3{display:grid;grid-gap:10px;grid-template-columns:3fr 1fr;grid-auto-columns:25%;grid-auto-rows:max-content}.grid-3 .column-0{grid-column:1/3;grid-row:1}.grid-3 .column-1{grid-column:1;grid-row:2}.grid-3 .column-2{grid-column:2;grid-row:2}.grid-3 .column-3{grid-column:1/3;grid-row:3}@media screen and (max-width: 415px){.grid-3{grid-gap:0;grid-template-columns:minmax(0, 100%)}.grid-3 .column-0{grid-column:1}.grid-3 .column-1{grid-column:1;grid-row:3}.grid-3 .column-2{grid-column:1;grid-row:2}.grid-3 .column-3{grid-column:1;grid-row:4}}.grid-4{display:grid;grid-gap:10px;grid-template-columns:repeat(4, minmax(0, 1fr));grid-auto-columns:25%;grid-auto-rows:max-content}.grid-4 .column-0{grid-column:1/5;grid-row:1}.grid-4 .column-1{grid-column:1/4;grid-row:2}.grid-4 .column-2{grid-column:4;grid-row:2}.grid-4 .column-3{grid-column:2/5;grid-row:3}.grid-4 .column-4{grid-column:1;grid-row:3}.grid-4 .landing-page__call-to-action{min-height:100%}.grid-4 .flash-message{margin-bottom:10px}@media screen and (max-width: 738px){.grid-4{grid-template-columns:minmax(0, 50%) minmax(0, 50%)}.grid-4 .landing-page__call-to-action{padding:20px;display:flex;align-items:center;justify-content:center}.grid-4 .row__information-board{width:100%;justify-content:center;align-items:center}.grid-4 .row__mascot{display:none}}@media screen and (max-width: 415px){.grid-4{grid-gap:0;grid-template-columns:minmax(0, 100%)}.grid-4 .column-0{grid-column:1}.grid-4 .column-1{grid-column:1;grid-row:3}.grid-4 .column-2{grid-column:1;grid-row:2}.grid-4 .column-3{grid-column:1;grid-row:5}.grid-4 .column-4{grid-column:1;grid-row:4}}@media screen and (max-width: 415px){.public-layout{padding-top:48px}}.public-layout .container{max-width:960px}@media screen and (max-width: 415px){.public-layout .container{padding:0}}.public-layout .header{background:#202e3f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;height:48px;margin:10px 0;display:flex;align-items:stretch;justify-content:center;flex-wrap:nowrap;overflow:hidden}@media screen and (max-width: 415px){.public-layout .header{position:fixed;width:100%;top:0;left:0;margin:0;border-radius:0;box-shadow:none;z-index:110}}.public-layout .header>div{flex:1 1 33.3%;min-height:1px}.public-layout .header .nav-left{display:flex;align-items:stretch;justify-content:flex-start;flex-wrap:nowrap}.public-layout .header .nav-center{display:flex;align-items:stretch;justify-content:center;flex-wrap:nowrap}.public-layout .header .nav-right{display:flex;align-items:stretch;justify-content:flex-end;flex-wrap:nowrap}.public-layout .header .brand{display:block;padding:15px}.public-layout .header .brand svg{display:block;height:18px;width:auto;position:relative;bottom:-2px;fill:#fff}@media screen and (max-width: 415px){.public-layout .header .brand svg{height:20px}}.public-layout .header .brand:hover,.public-layout .header .brand:focus,.public-layout .header .brand:active{background:#26374d}.public-layout .header .nav-link{display:flex;align-items:center;padding:0 1rem;font-size:12px;font-weight:500;text-decoration:none;color:#9baec8;white-space:nowrap;text-align:center}.public-layout .header .nav-link:hover,.public-layout .header .nav-link:focus,.public-layout .header .nav-link:active{text-decoration:underline;color:#fff}@media screen and (max-width: 550px){.public-layout .header .nav-link.optional{display:none}}.public-layout .header .nav-button{background:#2d415a;margin:8px;margin-left:0;border-radius:4px}.public-layout .header .nav-button:hover,.public-layout .header .nav-button:focus,.public-layout .header .nav-button:active{text-decoration:none;background:#344b68}.public-layout .grid{display:grid;grid-gap:10px;grid-template-columns:minmax(300px, 3fr) minmax(298px, 1fr);grid-auto-columns:25%;grid-auto-rows:max-content}.public-layout .grid .column-0{grid-row:1;grid-column:1}.public-layout .grid .column-1{grid-row:1;grid-column:2}@media screen and (max-width: 600px){.public-layout .grid{grid-template-columns:100%;grid-gap:0}.public-layout .grid .column-1{display:none}}.public-layout .directory__card{border-radius:4px}@media screen and (max-width: 415px){.public-layout .directory__card{border-radius:0}}@media screen and (max-width: 415px){.public-layout .page-header{border-bottom:0}}.public-layout .public-account-header{overflow:hidden;margin-bottom:10px;box-shadow:0 0 15px rgba(0,0,0,.2)}.public-layout .public-account-header.inactive{opacity:.5}.public-layout .public-account-header.inactive .public-account-header__image,.public-layout .public-account-header.inactive .avatar{filter:grayscale(100%)}.public-layout .public-account-header.inactive .logo-button{background-color:#d9e1e8}.public-layout .public-account-header__image{border-radius:4px 4px 0 0;overflow:hidden;height:300px;position:relative;background:#000}.public-layout .public-account-header__image::after{content:\"\";display:block;position:absolute;width:100%;height:100%;box-shadow:inset 0 -1px 1px 1px rgba(0,0,0,.15);top:0;left:0}.public-layout .public-account-header__image img{object-fit:cover;display:block;width:100%;height:100%;margin:0;border-radius:4px 4px 0 0}@media screen and (max-width: 600px){.public-layout .public-account-header__image{height:200px}}.public-layout .public-account-header--no-bar{margin-bottom:0}.public-layout .public-account-header--no-bar .public-account-header__image,.public-layout .public-account-header--no-bar .public-account-header__image img{border-radius:4px}@media screen and (max-width: 415px){.public-layout .public-account-header--no-bar .public-account-header__image,.public-layout .public-account-header--no-bar .public-account-header__image img{border-radius:0}}@media screen and (max-width: 415px){.public-layout .public-account-header{margin-bottom:0;box-shadow:none}.public-layout .public-account-header__image::after{display:none}.public-layout .public-account-header__image,.public-layout .public-account-header__image img{border-radius:0}}.public-layout .public-account-header__bar{position:relative;margin-top:-80px;display:flex;justify-content:flex-start}.public-layout .public-account-header__bar::before{content:\"\";display:block;background:#192432;position:absolute;bottom:0;left:0;right:0;height:60px;border-radius:0 0 4px 4px;z-index:-1}.public-layout .public-account-header__bar .avatar{display:block;width:120px;height:120px;padding-left:16px;flex:0 0 auto}.public-layout .public-account-header__bar .avatar img{display:block;width:100%;height:100%;margin:0;border-radius:50%;border:4px solid #192432;background:#040609}@media screen and (max-width: 600px){.public-layout .public-account-header__bar{margin-top:0;background:#192432;border-radius:0 0 4px 4px;padding:5px}.public-layout .public-account-header__bar::before{display:none}.public-layout .public-account-header__bar .avatar{width:48px;height:48px;padding:7px 0;padding-left:10px}.public-layout .public-account-header__bar .avatar img{border:0;border-radius:4px}}@media screen and (max-width: 600px)and (max-width: 360px){.public-layout .public-account-header__bar .avatar{display:none}}@media screen and (max-width: 415px){.public-layout .public-account-header__bar{border-radius:0}}@media screen and (max-width: 600px){.public-layout .public-account-header__bar{flex-wrap:wrap}}.public-layout .public-account-header__tabs{flex:1 1 auto;margin-left:20px}.public-layout .public-account-header__tabs__name{padding-top:20px;padding-bottom:8px}.public-layout .public-account-header__tabs__name h1{font-size:20px;line-height:27px;color:#fff;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-shadow:1px 1px 1px #000}.public-layout .public-account-header__tabs__name h1 small{display:block;font-size:14px;color:#fff;font-weight:400;overflow:hidden;text-overflow:ellipsis}@media screen and (max-width: 600px){.public-layout .public-account-header__tabs{margin-left:15px;display:flex;justify-content:space-between;align-items:center}.public-layout .public-account-header__tabs__name{padding-top:0;padding-bottom:0}.public-layout .public-account-header__tabs__name h1{font-size:16px;line-height:24px;text-shadow:none}.public-layout .public-account-header__tabs__name h1 small{color:#9baec8}}.public-layout .public-account-header__tabs__tabs{display:flex;justify-content:flex-start;align-items:stretch;height:58px}.public-layout .public-account-header__tabs__tabs .details-counters{display:flex;flex-direction:row;min-width:300px}@media screen and (max-width: 600px){.public-layout .public-account-header__tabs__tabs .details-counters{display:none}}.public-layout .public-account-header__tabs__tabs .counter{min-width:33.3%;box-sizing:border-box;flex:0 0 auto;color:#9baec8;padding:10px;border-right:1px solid #192432;cursor:default;text-align:center;position:relative}.public-layout .public-account-header__tabs__tabs .counter a{display:block}.public-layout .public-account-header__tabs__tabs .counter:last-child{border-right:0}.public-layout .public-account-header__tabs__tabs .counter::after{display:block;content:\"\";position:absolute;bottom:0;left:0;width:100%;border-bottom:4px solid #9baec8;opacity:.5;transition:all 400ms ease}.public-layout .public-account-header__tabs__tabs .counter.active::after{border-bottom:4px solid #00007f;opacity:1}.public-layout .public-account-header__tabs__tabs .counter.active.inactive::after{border-bottom-color:#d9e1e8}.public-layout .public-account-header__tabs__tabs .counter:hover::after{opacity:1;transition-duration:100ms}.public-layout .public-account-header__tabs__tabs .counter a{text-decoration:none;color:inherit}.public-layout .public-account-header__tabs__tabs .counter .counter-label{font-size:12px;display:block}.public-layout .public-account-header__tabs__tabs .counter .counter-number{font-weight:500;font-size:18px;margin-bottom:5px;color:#fff;font-family:\"mastodon-font-display\",sans-serif}.public-layout .public-account-header__tabs__tabs .spacer{flex:1 1 auto;height:1px}.public-layout .public-account-header__tabs__tabs__buttons{padding:7px 8px}.public-layout .public-account-header__extra{display:none;margin-top:4px}.public-layout .public-account-header__extra .public-account-bio{border-radius:0;box-shadow:none;background:transparent;margin:0 -5px}.public-layout .public-account-header__extra .public-account-bio .account__header__fields{border-top:1px solid #26374d}.public-layout .public-account-header__extra .public-account-bio .roles{display:none}.public-layout .public-account-header__extra__links{margin-top:-15px;font-size:14px;color:#9baec8}.public-layout .public-account-header__extra__links a{display:inline-block;color:#9baec8;text-decoration:none;padding:15px;font-weight:500}.public-layout .public-account-header__extra__links a strong{font-weight:700;color:#fff}@media screen and (max-width: 600px){.public-layout .public-account-header__extra{display:block;flex:100%}}.public-layout .account__section-headline{border-radius:4px 4px 0 0}@media screen and (max-width: 415px){.public-layout .account__section-headline{border-radius:0}}.public-layout .detailed-status__meta{margin-top:25px}.public-layout .public-account-bio{background:#202e3f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;overflow:hidden;margin-bottom:10px}@media screen and (max-width: 415px){.public-layout .public-account-bio{box-shadow:none;margin-bottom:0;border-radius:0}}.public-layout .public-account-bio .account__header__fields{margin:0;border-top:0}.public-layout .public-account-bio .account__header__fields a{color:#0000a8}.public-layout .public-account-bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.public-layout .public-account-bio .account__header__fields .verified a{color:#79bd9a}.public-layout .public-account-bio .account__header__content{padding:20px;padding-bottom:0;color:#fff}.public-layout .public-account-bio__extra,.public-layout .public-account-bio .roles{padding:20px;font-size:14px;color:#9baec8}.public-layout .public-account-bio .roles{padding-bottom:0}.public-layout .directory__list{display:grid;grid-gap:10px;grid-template-columns:minmax(0, 50%) minmax(0, 50%)}@media screen and (max-width: 415px){.public-layout .directory__list{display:block}}.public-layout .directory__list .icon-button{font-size:18px}.public-layout .directory__card{margin-bottom:0}.public-layout .card-grid{display:flex;flex-wrap:wrap;min-width:100%;margin:0 -5px}.public-layout .card-grid>div{box-sizing:border-box;flex:1 0 auto;width:300px;padding:0 5px;margin-bottom:10px;max-width:33.333%}@media screen and (max-width: 900px){.public-layout .card-grid>div{max-width:50%}}@media screen and (max-width: 600px){.public-layout .card-grid>div{max-width:100%}}@media screen and (max-width: 415px){.public-layout .card-grid{margin:0;border-top:1px solid #202e3f}.public-layout .card-grid>div{width:100%;padding:0;margin-bottom:0;border-bottom:1px solid #202e3f}.public-layout .card-grid>div:last-child{border-bottom:0}.public-layout .card-grid>div .card__bar{background:#121a24}.public-layout .card-grid>div .card__bar:hover,.public-layout .card-grid>div .card__bar:active,.public-layout .card-grid>div .card__bar:focus{background:#192432}}.no-list{list-style:none}.no-list li{display:inline-block;margin:0 5px}.recovery-codes{list-style:none;margin:0 auto}.recovery-codes li{font-size:125%;line-height:1.5;letter-spacing:1px}.public-layout .footer{text-align:left;padding-top:20px;padding-bottom:60px;font-size:12px;color:#4c6d98}@media screen and (max-width: 415px){.public-layout .footer{padding-left:20px;padding-right:20px}}.public-layout .footer .grid{display:grid;grid-gap:10px;grid-template-columns:1fr 1fr 2fr 1fr 1fr}.public-layout .footer .grid .column-0{grid-column:1;grid-row:1;min-width:0}.public-layout .footer .grid .column-1{grid-column:2;grid-row:1;min-width:0}.public-layout .footer .grid .column-2{grid-column:3;grid-row:1;min-width:0;text-align:center}.public-layout .footer .grid .column-2 h4 a{color:#4c6d98}.public-layout .footer .grid .column-3{grid-column:4;grid-row:1;min-width:0}.public-layout .footer .grid .column-4{grid-column:5;grid-row:1;min-width:0}@media screen and (max-width: 690px){.public-layout .footer .grid{grid-template-columns:1fr 2fr 1fr}.public-layout .footer .grid .column-0,.public-layout .footer .grid .column-1{grid-column:1}.public-layout .footer .grid .column-1{grid-row:2}.public-layout .footer .grid .column-2{grid-column:2}.public-layout .footer .grid .column-3,.public-layout .footer .grid .column-4{grid-column:3}.public-layout .footer .grid .column-4{grid-row:2}}@media screen and (max-width: 600px){.public-layout .footer .grid .column-1{display:block}}@media screen and (max-width: 415px){.public-layout .footer .grid .column-0,.public-layout .footer .grid .column-1,.public-layout .footer .grid .column-3,.public-layout .footer .grid .column-4{display:none}}.public-layout .footer h4{font-weight:700;margin-bottom:8px;color:#9baec8}.public-layout .footer h4 a{color:inherit;text-decoration:none}.public-layout .footer ul a{text-decoration:none;color:#4c6d98}.public-layout .footer ul a:hover,.public-layout .footer ul a:active,.public-layout .footer ul a:focus{text-decoration:underline}.public-layout .footer .brand svg{display:block;height:36px;width:auto;margin:0 auto;fill:#4c6d98}.public-layout .footer .brand:hover svg,.public-layout .footer .brand:focus svg,.public-layout .footer .brand:active svg{fill:#5377a5}.compact-header h1{font-size:24px;line-height:28px;color:#9baec8;font-weight:500;margin-bottom:20px;padding:0 10px;word-wrap:break-word}@media screen and (max-width: 740px){.compact-header h1{text-align:center;padding:20px 10px 0}}.compact-header h1 a{color:inherit;text-decoration:none}.compact-header h1 small{font-weight:400;color:#d9e1e8}.compact-header h1 img{display:inline-block;margin-bottom:-5px;margin-right:15px;width:36px;height:36px}.hero-widget{margin-bottom:10px;box-shadow:0 0 15px rgba(0,0,0,.2)}.hero-widget__img{width:100%;position:relative;overflow:hidden;border-radius:4px 4px 0 0;background:#000}.hero-widget__img img{object-fit:cover;display:block;width:100%;height:100%;margin:0;border-radius:4px 4px 0 0}.hero-widget__text{background:#121a24;padding:20px;border-radius:0 0 4px 4px;font-size:15px;color:#9baec8;line-height:20px;word-wrap:break-word;font-weight:400}.hero-widget__text .emojione{width:20px;height:20px;margin:-3px 0 0}.hero-widget__text p{margin-bottom:20px}.hero-widget__text p:last-child{margin-bottom:0}.hero-widget__text em{display:inline;margin:0;padding:0;font-weight:700;background:transparent;font-family:inherit;font-size:inherit;line-height:inherit;color:#bcc9da}.hero-widget__text a{color:#d9e1e8;text-decoration:none}.hero-widget__text a:hover{text-decoration:underline}@media screen and (max-width: 415px){.hero-widget{display:none}}.endorsements-widget{margin-bottom:10px;padding-bottom:10px}.endorsements-widget h4{padding:10px;font-weight:700;font-size:14px;color:#9baec8}.endorsements-widget .account{padding:10px 0}.endorsements-widget .account:last-child{border-bottom:0}.endorsements-widget .account .account__display-name{display:flex;align-items:center}.endorsements-widget .account .account__avatar{width:44px;height:44px;background-size:44px 44px}.endorsements-widget .trends__item{padding:10px}.trends-widget h4{color:#9baec8}.box-widget{padding:20px;border-radius:4px;background:#121a24;box-shadow:0 0 15px rgba(0,0,0,.2)}.placeholder-widget{padding:16px;border-radius:4px;border:2px dashed #404040;text-align:center;color:#9baec8;margin-bottom:10px}.contact-widget{min-height:100%;font-size:15px;color:#9baec8;line-height:20px;word-wrap:break-word;font-weight:400;padding:0}.contact-widget h4{padding:10px;font-weight:700;font-size:14px;color:#9baec8}.contact-widget .account{border-bottom:0;padding:10px 0;padding-top:5px}.contact-widget>a{display:inline-block;padding:10px;padding-top:0;color:#9baec8;text-decoration:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.contact-widget>a:hover,.contact-widget>a:focus,.contact-widget>a:active{text-decoration:underline}.moved-account-widget{padding:15px;padding-bottom:20px;border-radius:4px;background:#121a24;box-shadow:0 0 15px rgba(0,0,0,.2);color:#d9e1e8;font-weight:400;margin-bottom:10px}.moved-account-widget strong,.moved-account-widget a{font-weight:500}.moved-account-widget strong:lang(ja),.moved-account-widget a:lang(ja){font-weight:700}.moved-account-widget strong:lang(ko),.moved-account-widget a:lang(ko){font-weight:700}.moved-account-widget strong:lang(zh-CN),.moved-account-widget a:lang(zh-CN){font-weight:700}.moved-account-widget strong:lang(zh-HK),.moved-account-widget a:lang(zh-HK){font-weight:700}.moved-account-widget strong:lang(zh-TW),.moved-account-widget a:lang(zh-TW){font-weight:700}.moved-account-widget a{color:inherit;text-decoration:underline}.moved-account-widget a.mention{text-decoration:none}.moved-account-widget a.mention span{text-decoration:none}.moved-account-widget a.mention:focus,.moved-account-widget a.mention:hover,.moved-account-widget a.mention:active{text-decoration:none}.moved-account-widget a.mention:focus span,.moved-account-widget a.mention:hover span,.moved-account-widget a.mention:active span{text-decoration:underline}.moved-account-widget__message{margin-bottom:15px}.moved-account-widget__message .fa{margin-right:5px;color:#9baec8}.moved-account-widget__card .detailed-status__display-avatar{position:relative;cursor:pointer}.moved-account-widget__card .detailed-status__display-name{margin-bottom:0;text-decoration:none}.moved-account-widget__card .detailed-status__display-name span{font-weight:400}.memoriam-widget{padding:20px;border-radius:4px;background:#000;box-shadow:0 0 15px rgba(0,0,0,.2);font-size:14px;color:#9baec8;margin-bottom:10px}.page-header{background:#202e3f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;padding:60px 15px;text-align:center;margin:10px 0}.page-header h1{color:#fff;font-size:36px;line-height:1.1;font-weight:700;margin-bottom:10px}.page-header p{font-size:15px;color:#9baec8}@media screen and (max-width: 415px){.page-header{margin-top:0;background:#192432}.page-header h1{font-size:24px}}.directory{background:#121a24;border-radius:4px;box-shadow:0 0 15px rgba(0,0,0,.2)}.directory__tag{box-sizing:border-box;margin-bottom:10px}.directory__tag>a,.directory__tag>div{display:flex;align-items:center;justify-content:space-between;background:#121a24;border-radius:4px;padding:15px;text-decoration:none;color:inherit;box-shadow:0 0 15px rgba(0,0,0,.2)}.directory__tag>a:hover,.directory__tag>a:active,.directory__tag>a:focus{background:#202e3f}.directory__tag.active>a{background:#00007f;cursor:default}.directory__tag.disabled>div{opacity:.5;cursor:default}.directory__tag h4{flex:1 1 auto;font-size:18px;font-weight:700;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.directory__tag h4 .fa{color:#9baec8}.directory__tag h4 small{display:block;font-weight:400;font-size:15px;margin-top:8px;color:#9baec8}.directory__tag.active h4,.directory__tag.active h4 .fa,.directory__tag.active h4 small,.directory__tag.active h4 .trends__item__current{color:#fff}.directory__tag .avatar-stack{flex:0 0 auto;width:120px}.directory__tag.active .avatar-stack .account__avatar{border-color:#00007f}.directory__tag .trends__item__current{padding-right:0}.avatar-stack{display:flex;justify-content:flex-end}.avatar-stack .account__avatar{flex:0 0 auto;width:36px;height:36px;border-radius:50%;position:relative;margin-left:-10px;background:#040609;border:2px solid #121a24}.avatar-stack .account__avatar:nth-child(1){z-index:1}.avatar-stack .account__avatar:nth-child(2){z-index:2}.avatar-stack .account__avatar:nth-child(3){z-index:3}.accounts-table{width:100%}.accounts-table .account{padding:0;border:0}.accounts-table strong{font-weight:700}.accounts-table thead th{text-align:center;color:#9baec8;font-weight:700;padding:10px}.accounts-table thead th:first-child{text-align:left}.accounts-table tbody td{padding:15px 0;vertical-align:middle;border-bottom:1px solid #202e3f}.accounts-table tbody tr:last-child td{border-bottom:0}.accounts-table__count{width:120px;text-align:center;font-size:15px;font-weight:500;color:#fff}.accounts-table__count small{display:block;color:#9baec8;font-weight:400;font-size:14px}.accounts-table__comment{width:50%;vertical-align:initial !important}@media screen and (max-width: 415px){.accounts-table tbody td.optional{display:none}}@media screen and (max-width: 415px){.moved-account-widget,.memoriam-widget,.box-widget,.contact-widget,.landing-page__information.contact-widget,.directory,.page-header{margin-bottom:0;box-shadow:none;border-radius:0}}.statuses-grid{min-height:600px}@media screen and (max-width: 640px){.statuses-grid{width:100% !important}}.statuses-grid__item{width:313.3333333333px}@media screen and (max-width: 1255px){.statuses-grid__item{width:306.6666666667px}}@media screen and (max-width: 640px){.statuses-grid__item{width:100%}}@media screen and (max-width: 415px){.statuses-grid__item{width:100vw}}.statuses-grid .detailed-status{border-radius:4px}@media screen and (max-width: 415px){.statuses-grid .detailed-status{border-top:1px solid #2d415a}}.statuses-grid .detailed-status.compact .detailed-status__meta{margin-top:15px}.statuses-grid .detailed-status.compact .status__content{font-size:15px;line-height:20px}.statuses-grid .detailed-status.compact .status__content .emojione{width:20px;height:20px;margin:-3px 0 0}.statuses-grid .detailed-status.compact .status__content .status__content__spoiler-link{line-height:20px;margin:0}.statuses-grid .detailed-status.compact .media-gallery,.statuses-grid .detailed-status.compact .status-card,.statuses-grid .detailed-status.compact .video-player{margin-top:15px}.notice-widget{margin-bottom:10px;color:#9baec8}.notice-widget p{margin-bottom:10px}.notice-widget p:last-child{margin-bottom:0}.notice-widget a{font-size:14px;line-height:20px}.notice-widget a,.placeholder-widget a{text-decoration:none;font-weight:500;color:#00007f}.notice-widget a:hover,.notice-widget a:focus,.notice-widget a:active,.placeholder-widget a:hover,.placeholder-widget a:focus,.placeholder-widget a:active{text-decoration:underline}.table-of-contents{background:#0b1016;min-height:100%;font-size:14px;border-radius:4px}.table-of-contents li a{display:block;font-weight:500;padding:15px;overflow:hidden;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-decoration:none;color:#fff;border-bottom:1px solid #192432}.table-of-contents li a:hover,.table-of-contents li a:focus,.table-of-contents li a:active{text-decoration:underline}.table-of-contents li:last-child a{border-bottom:0}.table-of-contents li ul{padding-left:20px;border-bottom:1px solid #192432}code{font-family:\"mastodon-font-monospace\",monospace;font-weight:400}.form-container{max-width:400px;padding:20px;margin:0 auto}.simple_form .input{margin-bottom:15px;overflow:hidden}.simple_form .input.hidden{margin:0}.simple_form .input.radio_buttons .radio{margin-bottom:15px}.simple_form .input.radio_buttons .radio:last-child{margin-bottom:0}.simple_form .input.radio_buttons .radio>label{position:relative;padding-left:28px}.simple_form .input.radio_buttons .radio>label input{position:absolute;top:-2px;left:0}.simple_form .input.boolean{position:relative;margin-bottom:0}.simple_form .input.boolean .label_input>label{font-family:inherit;font-size:14px;padding-top:5px;color:#fff;display:block;width:auto}.simple_form .input.boolean .label_input,.simple_form .input.boolean .hint{padding-left:28px}.simple_form .input.boolean .label_input__wrapper{position:static}.simple_form .input.boolean label.checkbox{position:absolute;top:2px;left:0}.simple_form .input.boolean label a{color:#00007f;text-decoration:underline}.simple_form .input.boolean label a:hover,.simple_form .input.boolean label a:active,.simple_form .input.boolean label a:focus{text-decoration:none}.simple_form .input.boolean .recommended{position:absolute;margin:0 4px;margin-top:-2px}.simple_form .row{display:flex;margin:0 -5px}.simple_form .row .input{box-sizing:border-box;flex:1 1 auto;width:50%;padding:0 5px}.simple_form .hint{color:#9baec8}.simple_form .hint a{color:#00007f}.simple_form .hint code{border-radius:3px;padding:.2em .4em;background:#000}.simple_form .hint li{list-style:disc;margin-left:18px}.simple_form ul.hint{margin-bottom:15px}.simple_form span.hint{display:block;font-size:12px;margin-top:4px}.simple_form p.hint{margin-bottom:15px;color:#9baec8}.simple_form p.hint.subtle-hint{text-align:center;font-size:12px;line-height:18px;margin-top:15px;margin-bottom:0}.simple_form .card{margin-bottom:15px}.simple_form strong{font-weight:500}.simple_form strong:lang(ja){font-weight:700}.simple_form strong:lang(ko){font-weight:700}.simple_form strong:lang(zh-CN){font-weight:700}.simple_form strong:lang(zh-HK){font-weight:700}.simple_form strong:lang(zh-TW){font-weight:700}.simple_form .input.with_floating_label .label_input{display:flex}.simple_form .input.with_floating_label .label_input>label{font-family:inherit;font-size:14px;color:#fff;font-weight:500;min-width:150px;flex:0 0 auto}.simple_form .input.with_floating_label .label_input input,.simple_form .input.with_floating_label .label_input select{flex:1 1 auto}.simple_form .input.with_floating_label.select .hint{margin-top:6px;margin-left:150px}.simple_form .input.with_label .label_input>label{font-family:inherit;font-size:14px;color:#fff;display:block;margin-bottom:8px;word-wrap:break-word;font-weight:500}.simple_form .input.with_label .hint{margin-top:6px}.simple_form .input.with_label ul{flex:390px}.simple_form .input.with_block_label{max-width:none}.simple_form .input.with_block_label>label{font-family:inherit;font-size:16px;color:#fff;display:block;font-weight:500;padding-top:5px}.simple_form .input.with_block_label .hint{margin-bottom:15px}.simple_form .input.with_block_label ul{columns:2}.simple_form .required abbr{text-decoration:none;color:#e87487}.simple_form .fields-group{margin-bottom:25px}.simple_form .fields-group .input:last-child{margin-bottom:0}.simple_form .fields-row{display:flex;margin:0 -10px;padding-top:5px;margin-bottom:25px}.simple_form .fields-row .input{max-width:none}.simple_form .fields-row__column{box-sizing:border-box;padding:0 10px;flex:1 1 auto;min-height:1px}.simple_form .fields-row__column-6{max-width:50%}.simple_form .fields-row__column .actions{margin-top:27px}.simple_form .fields-row .fields-group:last-child,.simple_form .fields-row .fields-row__column.fields-group{margin-bottom:0}@media screen and (max-width: 600px){.simple_form .fields-row{display:block;margin-bottom:0}.simple_form .fields-row__column{max-width:none}.simple_form .fields-row .fields-group:last-child,.simple_form .fields-row .fields-row__column.fields-group,.simple_form .fields-row .fields-row__column{margin-bottom:25px}}.simple_form .input.radio_buttons .radio label{margin-bottom:5px;font-family:inherit;font-size:14px;color:#fff;display:block;width:auto}.simple_form .check_boxes .checkbox label{font-family:inherit;font-size:14px;color:#fff;display:inline-block;width:auto;position:relative;padding-top:5px;padding-left:25px;flex:1 1 auto}.simple_form .check_boxes .checkbox input[type=checkbox]{position:absolute;left:0;top:5px;margin:0}.simple_form .input.static .label_input__wrapper{font-size:16px;padding:10px;border:1px solid #404040;border-radius:4px}.simple_form input[type=text],.simple_form input[type=number],.simple_form input[type=email],.simple_form input[type=password],.simple_form textarea{box-sizing:border-box;font-size:16px;color:#fff;display:block;width:100%;outline:0;font-family:inherit;resize:vertical;background:#010102;border:1px solid #000;border-radius:4px;padding:10px}.simple_form input[type=text]::placeholder,.simple_form input[type=number]::placeholder,.simple_form input[type=email]::placeholder,.simple_form input[type=password]::placeholder,.simple_form textarea::placeholder{color:#a8b9cf}.simple_form input[type=text]:invalid,.simple_form input[type=number]:invalid,.simple_form input[type=email]:invalid,.simple_form input[type=password]:invalid,.simple_form textarea:invalid{box-shadow:none}.simple_form input[type=text]:focus:invalid:not(:placeholder-shown),.simple_form input[type=number]:focus:invalid:not(:placeholder-shown),.simple_form input[type=email]:focus:invalid:not(:placeholder-shown),.simple_form input[type=password]:focus:invalid:not(:placeholder-shown),.simple_form textarea:focus:invalid:not(:placeholder-shown){border-color:#e87487}.simple_form input[type=text]:required:valid,.simple_form input[type=number]:required:valid,.simple_form input[type=email]:required:valid,.simple_form input[type=password]:required:valid,.simple_form textarea:required:valid{border-color:#79bd9a}.simple_form input[type=text]:hover,.simple_form input[type=number]:hover,.simple_form input[type=email]:hover,.simple_form input[type=password]:hover,.simple_form textarea:hover{border-color:#000}.simple_form input[type=text]:active,.simple_form input[type=text]:focus,.simple_form input[type=number]:active,.simple_form input[type=number]:focus,.simple_form input[type=email]:active,.simple_form input[type=email]:focus,.simple_form input[type=password]:active,.simple_form input[type=password]:focus,.simple_form textarea:active,.simple_form textarea:focus{border-color:#00007f;background:#040609}.simple_form .input.field_with_errors label{color:#e87487}.simple_form .input.field_with_errors input[type=text],.simple_form .input.field_with_errors input[type=number],.simple_form .input.field_with_errors input[type=email],.simple_form .input.field_with_errors input[type=password],.simple_form .input.field_with_errors textarea,.simple_form .input.field_with_errors select{border-color:#e87487}.simple_form .input.field_with_errors .error{display:block;font-weight:500;color:#e87487;margin-top:4px}.simple_form .input.disabled{opacity:.5}.simple_form .actions{margin-top:30px;display:flex}.simple_form .actions.actions--top{margin-top:0;margin-bottom:30px}.simple_form button,.simple_form .button,.simple_form .block-button{display:block;width:100%;border:0;border-radius:4px;background:#00007f;color:#fff;font-size:18px;line-height:inherit;height:auto;padding:10px;text-decoration:none;text-align:center;box-sizing:border-box;cursor:pointer;font-weight:500;outline:0;margin-bottom:10px;margin-right:10px}.simple_form button:last-child,.simple_form .button:last-child,.simple_form .block-button:last-child{margin-right:0}.simple_form button:hover,.simple_form .button:hover,.simple_form .block-button:hover{background-color:#009}.simple_form button:active,.simple_form button:focus,.simple_form .button:active,.simple_form .button:focus,.simple_form .block-button:active,.simple_form .block-button:focus{background-color:#006}.simple_form button:disabled:hover,.simple_form .button:disabled:hover,.simple_form .block-button:disabled:hover{background-color:#9baec8}.simple_form button.negative,.simple_form .button.negative,.simple_form .block-button.negative{background:#df405a}.simple_form button.negative:hover,.simple_form .button.negative:hover,.simple_form .block-button.negative:hover{background-color:#e3566d}.simple_form button.negative:active,.simple_form button.negative:focus,.simple_form .button.negative:active,.simple_form .button.negative:focus,.simple_form .block-button.negative:active,.simple_form .block-button.negative:focus{background-color:#db2a47}.simple_form select{appearance:none;box-sizing:border-box;font-size:16px;color:#fff;display:block;width:100%;outline:0;font-family:inherit;resize:vertical;background:#010102 url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center/auto 16px;border:1px solid #000;border-radius:4px;padding-left:10px;padding-right:30px;height:41px}.simple_form h4{margin-bottom:15px !important}.simple_form .label_input__wrapper{position:relative}.simple_form .label_input__append{position:absolute;right:3px;top:1px;padding:10px;padding-bottom:9px;font-size:16px;color:#404040;font-family:inherit;pointer-events:none;cursor:default;max-width:140px;white-space:nowrap;overflow:hidden}.simple_form .label_input__append::after{content:\"\";display:block;position:absolute;top:0;right:0;bottom:1px;width:5px;background-image:linear-gradient(to right, rgba(1, 1, 2, 0), #010102)}.simple_form__overlay-area{position:relative}.simple_form__overlay-area__blurred form{filter:blur(2px)}.simple_form__overlay-area__overlay{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;background:rgba(18,26,36,.65);border-radius:4px;margin-left:-4px;margin-top:-4px;padding:4px}.simple_form__overlay-area__overlay__content{text-align:center}.simple_form__overlay-area__overlay__content.rich-formatting,.simple_form__overlay-area__overlay__content.rich-formatting p{color:#fff}.block-icon{display:block;margin:0 auto;margin-bottom:10px;font-size:24px}.flash-message{background:#202e3f;color:#9baec8;border-radius:4px;padding:15px 10px;margin-bottom:30px;text-align:center}.flash-message.notice{border:1px solid rgba(121,189,154,.5);background:rgba(121,189,154,.25);color:#79bd9a}.flash-message.alert{border:1px solid rgba(223,64,90,.5);background:rgba(223,64,90,.25);color:#df405a}.flash-message a{display:inline-block;color:#9baec8;text-decoration:none}.flash-message a:hover{color:#fff;text-decoration:underline}.flash-message p{margin-bottom:15px}.flash-message .oauth-code{outline:0;box-sizing:border-box;display:block;width:100%;border:0;padding:10px;font-family:\"mastodon-font-monospace\",monospace;background:#121a24;color:#fff;font-size:14px;margin:0}.flash-message .oauth-code::-moz-focus-inner{border:0}.flash-message .oauth-code::-moz-focus-inner,.flash-message .oauth-code:focus,.flash-message .oauth-code:active{outline:0 !important}.flash-message .oauth-code:focus{background:#192432}.flash-message strong{font-weight:500}.flash-message strong:lang(ja){font-weight:700}.flash-message strong:lang(ko){font-weight:700}.flash-message strong:lang(zh-CN){font-weight:700}.flash-message strong:lang(zh-HK){font-weight:700}.flash-message strong:lang(zh-TW){font-weight:700}@media screen and (max-width: 740px)and (min-width: 441px){.flash-message{margin-top:40px}}.form-footer{margin-top:30px;text-align:center}.form-footer a{color:#9baec8;text-decoration:none}.form-footer a:hover{text-decoration:underline}.quick-nav{list-style:none;margin-bottom:25px;font-size:14px}.quick-nav li{display:inline-block;margin-right:10px}.quick-nav a{color:#00007f;text-decoration:none;font-weight:700}.quick-nav a:hover,.quick-nav a:focus,.quick-nav a:active{color:#0000a8}.oauth-prompt,.follow-prompt{margin-bottom:30px;color:#9baec8}.oauth-prompt h2,.follow-prompt h2{font-size:16px;margin-bottom:30px;text-align:center}.oauth-prompt strong,.follow-prompt strong{color:#d9e1e8;font-weight:500}.oauth-prompt strong:lang(ja),.follow-prompt strong:lang(ja){font-weight:700}.oauth-prompt strong:lang(ko),.follow-prompt strong:lang(ko){font-weight:700}.oauth-prompt strong:lang(zh-CN),.follow-prompt strong:lang(zh-CN){font-weight:700}.oauth-prompt strong:lang(zh-HK),.follow-prompt strong:lang(zh-HK){font-weight:700}.oauth-prompt strong:lang(zh-TW),.follow-prompt strong:lang(zh-TW){font-weight:700}@media screen and (max-width: 740px)and (min-width: 441px){.oauth-prompt,.follow-prompt{margin-top:40px}}.qr-wrapper{display:flex;flex-wrap:wrap;align-items:flex-start}.qr-code{flex:0 0 auto;background:#fff;padding:4px;margin:0 10px 20px 0;box-shadow:0 0 15px rgba(0,0,0,.2);display:inline-block}.qr-code svg{display:block;margin:0}.qr-alternative{margin-bottom:20px;color:#d9e1e8;flex:150px}.qr-alternative samp{display:block;font-size:14px}.table-form p{margin-bottom:15px}.table-form p strong{font-weight:500}.table-form p strong:lang(ja){font-weight:700}.table-form p strong:lang(ko){font-weight:700}.table-form p strong:lang(zh-CN){font-weight:700}.table-form p strong:lang(zh-HK){font-weight:700}.table-form p strong:lang(zh-TW){font-weight:700}.simple_form .warning,.table-form .warning{box-sizing:border-box;background:rgba(223,64,90,.5);color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,.3);box-shadow:0 2px 6px rgba(0,0,0,.4);border-radius:4px;padding:10px;margin-bottom:15px}.simple_form .warning a,.table-form .warning a{color:#fff;text-decoration:underline}.simple_form .warning a:hover,.simple_form .warning a:focus,.simple_form .warning a:active,.table-form .warning a:hover,.table-form .warning a:focus,.table-form .warning a:active{text-decoration:none}.simple_form .warning strong,.table-form .warning strong{font-weight:600;display:block;margin-bottom:5px}.simple_form .warning strong:lang(ja),.table-form .warning strong:lang(ja){font-weight:700}.simple_form .warning strong:lang(ko),.table-form .warning strong:lang(ko){font-weight:700}.simple_form .warning strong:lang(zh-CN),.table-form .warning strong:lang(zh-CN){font-weight:700}.simple_form .warning strong:lang(zh-HK),.table-form .warning strong:lang(zh-HK){font-weight:700}.simple_form .warning strong:lang(zh-TW),.table-form .warning strong:lang(zh-TW){font-weight:700}.simple_form .warning strong .fa,.table-form .warning strong .fa{font-weight:400}.action-pagination{display:flex;flex-wrap:wrap;align-items:center}.action-pagination .actions,.action-pagination .pagination{flex:1 1 auto}.action-pagination .actions{padding:30px 0;padding-right:20px;flex:0 0 auto}.post-follow-actions{text-align:center;color:#9baec8}.post-follow-actions div{margin-bottom:4px}.alternative-login{margin-top:20px;margin-bottom:20px}.alternative-login h4{font-size:16px;color:#fff;text-align:center;margin-bottom:20px;border:0;padding:0}.alternative-login .button{display:block}.scope-danger{color:#ff5050}.form_admin_settings_site_short_description textarea,.form_admin_settings_site_description textarea,.form_admin_settings_site_extended_description textarea,.form_admin_settings_site_terms textarea,.form_admin_settings_custom_css textarea,.form_admin_settings_closed_registrations_message textarea{font-family:\"mastodon-font-monospace\",monospace}.input-copy{background:#010102;border:1px solid #000;border-radius:4px;display:flex;align-items:center;padding-right:4px;position:relative;top:1px;transition:border-color 300ms linear}.input-copy__wrapper{flex:1 1 auto}.input-copy input[type=text]{background:transparent;border:0;padding:10px;font-size:14px;font-family:\"mastodon-font-monospace\",monospace}.input-copy button{flex:0 0 auto;margin:4px;text-transform:none;font-weight:400;font-size:14px;padding:7px 18px;padding-bottom:6px;width:auto;transition:background 300ms linear}.input-copy.copied{border-color:#79bd9a;transition:none}.input-copy.copied button{background:#79bd9a;transition:none}.connection-prompt{margin-bottom:25px}.connection-prompt .fa-link{background-color:#0b1016;border-radius:100%;font-size:24px;padding:10px}.connection-prompt__column{align-items:center;display:flex;flex:1;flex-direction:column;flex-shrink:1;max-width:50%}.connection-prompt__column-sep{align-self:center;flex-grow:0;overflow:visible;position:relative;z-index:1}.connection-prompt__column p{word-break:break-word}.connection-prompt .account__avatar{margin-bottom:20px}.connection-prompt__connection{background-color:#202e3f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;padding:25px 10px;position:relative;text-align:center}.connection-prompt__connection::after{background-color:#0b1016;content:\"\";display:block;height:100%;left:50%;position:absolute;top:0;width:1px}.connection-prompt__row{align-items:flex-start;display:flex;flex-direction:row}.card>a{display:block;text-decoration:none;color:inherit;box-shadow:0 0 15px rgba(0,0,0,.2)}@media screen and (max-width: 415px){.card>a{box-shadow:none}}.card>a:hover .card__bar,.card>a:active .card__bar,.card>a:focus .card__bar{background:#202e3f}.card__img{height:130px;position:relative;background:#000;border-radius:4px 4px 0 0}.card__img img{display:block;width:100%;height:100%;margin:0;object-fit:cover;border-radius:4px 4px 0 0}@media screen and (max-width: 600px){.card__img{height:200px}}@media screen and (max-width: 415px){.card__img{display:none}}.card__bar{position:relative;padding:15px;display:flex;justify-content:flex-start;align-items:center;background:#192432;border-radius:0 0 4px 4px}@media screen and (max-width: 415px){.card__bar{border-radius:0}}.card__bar .avatar{flex:0 0 auto;width:48px;height:48px;padding-top:2px}.card__bar .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px;background:#040609;object-fit:cover}.card__bar .display-name{margin-left:15px;text-align:left}.card__bar .display-name strong{font-size:15px;color:#fff;font-weight:500;overflow:hidden;text-overflow:ellipsis}.card__bar .display-name span{display:block;font-size:14px;color:#9baec8;font-weight:400;overflow:hidden;text-overflow:ellipsis}.pagination{padding:30px 0;text-align:center;overflow:hidden}.pagination a,.pagination .current,.pagination .newer,.pagination .older,.pagination .page,.pagination .gap{font-size:14px;color:#fff;font-weight:500;display:inline-block;padding:6px 10px;text-decoration:none}.pagination .current{background:#fff;border-radius:100px;color:#121a24;cursor:default;margin:0 10px}.pagination .gap{cursor:default}.pagination .older,.pagination .newer{color:#d9e1e8}.pagination .older{float:left;padding-left:0}.pagination .older .fa{display:inline-block;margin-right:5px}.pagination .newer{float:right;padding-right:0}.pagination .newer .fa{display:inline-block;margin-left:5px}.pagination .disabled{cursor:default;color:#233346}@media screen and (max-width: 700px){.pagination{padding:30px 20px}.pagination .page{display:none}.pagination .newer,.pagination .older{display:inline-block}}.nothing-here{background:#121a24;box-shadow:0 0 15px rgba(0,0,0,.2);color:#9baec8;font-size:14px;font-weight:500;text-align:center;display:flex;justify-content:center;align-items:center;cursor:default;border-radius:4px;padding:20px;min-height:30vh}.nothing-here--under-tabs{border-radius:0 0 4px 4px}.nothing-here--flexible{box-sizing:border-box;min-height:100%}.account-role,.simple_form .recommended{display:inline-block;padding:4px 6px;cursor:default;border-radius:3px;font-size:12px;line-height:12px;font-weight:500;color:#d9e1e8;background-color:rgba(217,225,232,.1);border:1px solid rgba(217,225,232,.5)}.account-role.moderator,.simple_form .recommended.moderator{color:#79bd9a;background-color:rgba(121,189,154,.1);border-color:rgba(121,189,154,.5)}.account-role.admin,.simple_form .recommended.admin{color:#e87487;background-color:rgba(232,116,135,.1);border-color:rgba(232,116,135,.5)}.account__header__fields{max-width:100vw;padding:0;margin:15px -15px -15px;border:0 none;border-top:1px solid #26374d;border-bottom:1px solid #26374d;font-size:14px;line-height:20px}.account__header__fields dl{display:flex;border-bottom:1px solid #26374d}.account__header__fields dt,.account__header__fields dd{box-sizing:border-box;padding:14px;text-align:center;max-height:48px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.account__header__fields dt{font-weight:500;width:120px;flex:0 0 auto;color:#d9e1e8;background:rgba(4,6,9,.5)}.account__header__fields dd{flex:1 1 auto;color:#9baec8}.account__header__fields a{color:#00007f;text-decoration:none}.account__header__fields a:hover,.account__header__fields a:focus,.account__header__fields a:active{text-decoration:underline}.account__header__fields .verified{border:1px solid rgba(121,189,154,.5);background:rgba(121,189,154,.25)}.account__header__fields .verified a{color:#79bd9a;font-weight:500}.account__header__fields .verified__mark{color:#79bd9a}.account__header__fields dl:last-child{border-bottom:0}.directory__tag .trends__item__current{width:auto}.pending-account__header{color:#9baec8}.pending-account__header a{color:#d9e1e8;text-decoration:none}.pending-account__header a:hover,.pending-account__header a:active,.pending-account__header a:focus{text-decoration:underline}.pending-account__header strong{color:#fff;font-weight:700}.pending-account__body{margin-top:10px}.activity-stream{box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;overflow:hidden;margin-bottom:10px}.activity-stream--under-tabs{border-radius:0 0 4px 4px}@media screen and (max-width: 415px){.activity-stream{margin-bottom:0;border-radius:0;box-shadow:none}}.activity-stream--headless{border-radius:0;margin:0;box-shadow:none}.activity-stream--headless .detailed-status,.activity-stream--headless .status{border-radius:0 !important}.activity-stream div[data-component]{width:100%}.activity-stream .entry{background:#121a24}.activity-stream .entry .detailed-status,.activity-stream .entry .status,.activity-stream .entry .load-more{animation:none}.activity-stream .entry:last-child .detailed-status,.activity-stream .entry:last-child .status,.activity-stream .entry:last-child .load-more{border-bottom:0;border-radius:0 0 4px 4px}.activity-stream .entry:first-child .detailed-status,.activity-stream .entry:first-child .status,.activity-stream .entry:first-child .load-more{border-radius:4px 4px 0 0}.activity-stream .entry:first-child:last-child .detailed-status,.activity-stream .entry:first-child:last-child .status,.activity-stream .entry:first-child:last-child .load-more{border-radius:4px}@media screen and (max-width: 740px){.activity-stream .entry .detailed-status,.activity-stream .entry .status,.activity-stream .entry .load-more{border-radius:0 !important}}.activity-stream--highlighted .entry{background:#202e3f}.button.logo-button{flex:0 auto;font-size:14px;background:#00007f;color:#fff;text-transform:none;line-height:36px;height:auto;padding:3px 15px;border:0}.button.logo-button svg{width:20px;height:auto;vertical-align:middle;margin-right:5px;fill:#fff}.button.logo-button:active,.button.logo-button:focus,.button.logo-button:hover{background:#0000b2}.button.logo-button:disabled:active,.button.logo-button:disabled:focus,.button.logo-button:disabled:hover,.button.logo-button.disabled:active,.button.logo-button.disabled:focus,.button.logo-button.disabled:hover{background:#9baec8}.button.logo-button.button--destructive:active,.button.logo-button.button--destructive:focus,.button.logo-button.button--destructive:hover{background:#df405a}@media screen and (max-width: 415px){.button.logo-button svg{display:none}}.embed .detailed-status,.public-layout .detailed-status{padding:15px}.embed .status,.public-layout .status{padding:15px 15px 15px 78px;min-height:50px}.embed .status__avatar,.public-layout .status__avatar{left:15px;top:17px}.embed .status__content,.public-layout .status__content{padding-top:5px}.embed .status__prepend,.public-layout .status__prepend{margin-left:78px;padding-top:15px}.embed .status__prepend-icon-wrapper,.public-layout .status__prepend-icon-wrapper{left:-32px}.embed .status .media-gallery,.embed .status__action-bar,.embed .status .video-player,.public-layout .status .media-gallery,.public-layout .status__action-bar,.public-layout .status .video-player{margin-top:10px}button.icon-button i.fa-retweet{background-image:url(\"data:image/svg+xml;utf8,\")}button.icon-button i.fa-retweet:hover{background-image:url(\"data:image/svg+xml;utf8,\")}button.icon-button.disabled i.fa-retweet{background-image:url(\"data:image/svg+xml;utf8,\")}.app-body{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.link-button{display:block;font-size:15px;line-height:20px;color:#00007f;border:0;background:transparent;padding:0;cursor:pointer}.link-button:hover,.link-button:active{text-decoration:underline}.link-button:disabled{color:#9baec8;cursor:default}.button{background-color:#00007f;border:10px none;border-radius:4px;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-family:inherit;font-size:15px;font-weight:500;height:36px;letter-spacing:0;line-height:36px;overflow:hidden;padding:0 16px;position:relative;text-align:center;text-decoration:none;text-overflow:ellipsis;transition:all 100ms ease-in;white-space:nowrap;width:auto}.button:active,.button:focus,.button:hover{background-color:#0000b2;transition:all 200ms ease-out}.button--destructive{transition:none}.button--destructive:active,.button--destructive:focus,.button--destructive:hover{background-color:#df405a;transition:none}.button:disabled,.button.disabled{background-color:#9baec8;cursor:default}.button::-moz-focus-inner{border:0}.button::-moz-focus-inner,.button:focus,.button:active{outline:0 !important}.button.button-primary,.button.button-alternative,.button.button-secondary,.button.button-alternative-2{font-size:16px;line-height:36px;height:auto;text-transform:none;padding:4px 16px}.button.button-alternative{color:#121a24;background:#9baec8}.button.button-alternative:active,.button.button-alternative:focus,.button.button-alternative:hover{background-color:#a8b9cf}.button.button-alternative-2{background:#404040}.button.button-alternative-2:active,.button.button-alternative-2:focus,.button.button-alternative-2:hover{background-color:#4a4a4a}.button.button-secondary{color:#9baec8;background:transparent;padding:3px 15px;border:1px solid #9baec8}.button.button-secondary:active,.button.button-secondary:focus,.button.button-secondary:hover{border-color:#a8b9cf;color:#a8b9cf}.button.button-secondary:disabled{opacity:.5}.button.button--block{display:block;width:100%}.column__wrapper{display:flex;flex:1 1 auto;position:relative}.icon-button{display:inline-block;padding:0;color:#404040;border:0;border-radius:4px;background:transparent;cursor:pointer;transition:all 100ms ease-in;transition-property:background-color,color}.icon-button:hover,.icon-button:active,.icon-button:focus{color:#525252;background-color:rgba(64,64,64,.15);transition:all 200ms ease-out;transition-property:background-color,color}.icon-button:focus{background-color:rgba(64,64,64,.3)}.icon-button.disabled{color:#1f1f1f;background-color:transparent;cursor:default}.icon-button.active{color:#00007f}.icon-button::-moz-focus-inner{border:0}.icon-button::-moz-focus-inner,.icon-button:focus,.icon-button:active{outline:0 !important}.icon-button.inverted{color:#404040}.icon-button.inverted:hover,.icon-button.inverted:active,.icon-button.inverted:focus{color:#2e2e2e;background-color:rgba(64,64,64,.15)}.icon-button.inverted:focus{background-color:rgba(64,64,64,.3)}.icon-button.inverted.disabled{color:#525252;background-color:transparent}.icon-button.inverted.active{color:#00007f}.icon-button.inverted.active.disabled{color:#0000c1}.icon-button.overlayed{box-sizing:content-box;background:rgba(0,0,0,.6);color:rgba(255,255,255,.7);border-radius:4px;padding:2px}.icon-button.overlayed:hover{background:rgba(0,0,0,.9)}.text-icon-button{color:#404040;border:0;border-radius:4px;background:transparent;cursor:pointer;font-weight:600;font-size:11px;padding:0 3px;line-height:27px;outline:0;transition:all 100ms ease-in;transition-property:background-color,color}.text-icon-button:hover,.text-icon-button:active,.text-icon-button:focus{color:#2e2e2e;background-color:rgba(64,64,64,.15);transition:all 200ms ease-out;transition-property:background-color,color}.text-icon-button:focus{background-color:rgba(64,64,64,.3)}.text-icon-button.disabled{color:#737373;background-color:transparent;cursor:default}.text-icon-button.active{color:#00007f}.text-icon-button::-moz-focus-inner{border:0}.text-icon-button::-moz-focus-inner,.text-icon-button:focus,.text-icon-button:active{outline:0 !important}.dropdown-menu{position:absolute}.invisible{font-size:0;line-height:0;display:inline-block;width:0;height:0;position:absolute}.invisible img,.invisible svg{margin:0 !important;border:0 !important;padding:0 !important;width:0 !important;height:0 !important}.ellipsis::after{content:\"…\"}.compose-form{padding:10px}.compose-form__sensitive-button{padding:10px;padding-top:0;font-size:14px;font-weight:500}.compose-form__sensitive-button.active{color:#00007f}.compose-form__sensitive-button input[type=checkbox]{display:none}.compose-form__sensitive-button .checkbox{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:4px;vertical-align:middle}.compose-form__sensitive-button .checkbox.active{border-color:#00007f;background:#00007f}.compose-form .compose-form__warning{color:#121a24;margin-bottom:10px;background:#9baec8;box-shadow:0 2px 6px rgba(0,0,0,.3);padding:8px 10px;border-radius:4px;font-size:13px;font-weight:400}.compose-form .compose-form__warning strong{color:#121a24;font-weight:500}.compose-form .compose-form__warning strong:lang(ja){font-weight:700}.compose-form .compose-form__warning strong:lang(ko){font-weight:700}.compose-form .compose-form__warning strong:lang(zh-CN){font-weight:700}.compose-form .compose-form__warning strong:lang(zh-HK){font-weight:700}.compose-form .compose-form__warning strong:lang(zh-TW){font-weight:700}.compose-form .compose-form__warning a{color:#404040;font-weight:500;text-decoration:underline}.compose-form .compose-form__warning a:hover,.compose-form .compose-form__warning a:active,.compose-form .compose-form__warning a:focus{text-decoration:none}.compose-form .emoji-picker-dropdown{position:absolute;top:5px;right:5px}.compose-form .compose-form__autosuggest-wrapper{position:relative}.compose-form .autosuggest-textarea,.compose-form .autosuggest-input,.compose-form .spoiler-input{position:relative;width:100%}.compose-form .spoiler-input{height:0;transform-origin:bottom;opacity:0}.compose-form .spoiler-input.spoiler-input--visible{height:36px;margin-bottom:11px;opacity:1}.compose-form .autosuggest-textarea__textarea,.compose-form .spoiler-input__input{display:block;box-sizing:border-box;width:100%;margin:0;color:#121a24;background:#fff;padding:10px;font-family:inherit;font-size:14px;resize:vertical;border:0;outline:0}.compose-form .autosuggest-textarea__textarea::placeholder,.compose-form .spoiler-input__input::placeholder{color:#404040}.compose-form .autosuggest-textarea__textarea:focus,.compose-form .spoiler-input__input:focus{outline:0}@media screen and (max-width: 600px){.compose-form .autosuggest-textarea__textarea,.compose-form .spoiler-input__input{font-size:16px}}.compose-form .spoiler-input__input{border-radius:4px}.compose-form .autosuggest-textarea__textarea{min-height:100px;border-radius:4px 4px 0 0;padding-bottom:0;padding-right:32px;resize:none;scrollbar-color:initial}.compose-form .autosuggest-textarea__textarea::-webkit-scrollbar{all:unset}@media screen and (max-width: 600px){.compose-form .autosuggest-textarea__textarea{height:100px !important;resize:vertical}}.compose-form .autosuggest-textarea__suggestions-wrapper{position:relative;height:0}.compose-form .autosuggest-textarea__suggestions{box-sizing:border-box;display:none;position:absolute;top:100%;width:100%;z-index:99;box-shadow:4px 4px 6px rgba(0,0,0,.4);background:#d9e1e8;border-radius:0 0 4px 4px;color:#121a24;font-size:14px;padding:6px}.compose-form .autosuggest-textarea__suggestions.autosuggest-textarea__suggestions--visible{display:block}.compose-form .autosuggest-textarea__suggestions__item{padding:10px;cursor:pointer;border-radius:4px}.compose-form .autosuggest-textarea__suggestions__item:hover,.compose-form .autosuggest-textarea__suggestions__item:focus,.compose-form .autosuggest-textarea__suggestions__item:active,.compose-form .autosuggest-textarea__suggestions__item.selected{background:#b9c8d5}.compose-form .autosuggest-account,.compose-form .autosuggest-emoji,.compose-form .autosuggest-hashtag{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;line-height:18px;font-size:14px}.compose-form .autosuggest-hashtag{justify-content:space-between}.compose-form .autosuggest-hashtag__name{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.compose-form .autosuggest-hashtag strong{font-weight:500}.compose-form .autosuggest-hashtag__uses{flex:0 0 auto;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.compose-form .autosuggest-account-icon,.compose-form .autosuggest-emoji img{display:block;margin-right:8px;width:16px;height:16px}.compose-form .autosuggest-account .display-name__account{color:#404040}.compose-form .compose-form__modifiers{color:#121a24;font-family:inherit;font-size:14px;background:#fff}.compose-form .compose-form__modifiers .compose-form__upload-wrapper{overflow:hidden}.compose-form .compose-form__modifiers .compose-form__uploads-wrapper{display:flex;flex-direction:row;padding:5px;flex-wrap:wrap}.compose-form .compose-form__modifiers .compose-form__upload{flex:1 1 0;min-width:40%;margin:5px}.compose-form .compose-form__modifiers .compose-form__upload__actions{background:linear-gradient(180deg, rgba(0, 0, 0, 0.8) 0, rgba(0, 0, 0, 0.35) 80%, transparent);display:flex;align-items:flex-start;justify-content:space-between;opacity:0;transition:opacity .1s ease}.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button{flex:0 1 auto;color:#d9e1e8;font-size:14px;font-weight:500;padding:10px;font-family:inherit}.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button:hover,.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button:focus,.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button:active{color:#eff3f5}.compose-form .compose-form__modifiers .compose-form__upload__actions.active{opacity:1}.compose-form .compose-form__modifiers .compose-form__upload-description{position:absolute;z-index:2;bottom:0;left:0;right:0;box-sizing:border-box;background:linear-gradient(0deg, rgba(0, 0, 0, 0.8) 0, rgba(0, 0, 0, 0.35) 80%, transparent);padding:10px;opacity:0;transition:opacity .1s ease}.compose-form .compose-form__modifiers .compose-form__upload-description textarea{background:transparent;color:#d9e1e8;border:0;padding:0;margin:0;width:100%;font-family:inherit;font-size:14px;font-weight:500}.compose-form .compose-form__modifiers .compose-form__upload-description textarea:focus{color:#fff}.compose-form .compose-form__modifiers .compose-form__upload-description textarea::placeholder{opacity:.75;color:#d9e1e8}.compose-form .compose-form__modifiers .compose-form__upload-description.active{opacity:1}.compose-form .compose-form__modifiers .compose-form__upload-thumbnail{border-radius:4px;background-color:#000;background-position:center;background-size:cover;background-repeat:no-repeat;height:140px;width:100%;overflow:hidden}.compose-form .compose-form__buttons-wrapper{padding:10px;background:#ebebeb;border-radius:0 0 4px 4px;display:flex;justify-content:space-between;flex:0 0 auto}.compose-form .compose-form__buttons-wrapper .compose-form__buttons{display:flex}.compose-form .compose-form__buttons-wrapper .compose-form__buttons .compose-form__upload-button-icon{line-height:27px}.compose-form .compose-form__buttons-wrapper .compose-form__buttons .compose-form__sensitive-button{display:none}.compose-form .compose-form__buttons-wrapper .compose-form__buttons .compose-form__sensitive-button.compose-form__sensitive-button--visible{display:block}.compose-form .compose-form__buttons-wrapper .compose-form__buttons .compose-form__sensitive-button .compose-form__sensitive-button__icon{line-height:27px}.compose-form .compose-form__buttons-wrapper .icon-button,.compose-form .compose-form__buttons-wrapper .text-icon-button{box-sizing:content-box;padding:0 3px}.compose-form .compose-form__buttons-wrapper .character-counter__wrapper{align-self:center;margin-right:4px}.compose-form .compose-form__publish{display:flex;justify-content:flex-end;min-width:0;flex:0 0 auto}.compose-form .compose-form__publish .compose-form__publish-button-wrapper{overflow:hidden;padding-top:10px}.character-counter{cursor:default;font-family:\"mastodon-font-sans-serif\",sans-serif;font-size:14px;font-weight:600;color:#404040}.character-counter.character-counter--over{color:#ff5050}.no-reduce-motion .spoiler-input{transition:height .4s ease,opacity .4s ease}.emojione{font-size:inherit;vertical-align:middle;object-fit:contain;margin:-0.2ex .15em .2ex;width:16px;height:16px}.emojione img{width:auto}.reply-indicator{border-radius:4px;margin-bottom:10px;background:#9baec8;padding:10px;min-height:23px;overflow-y:auto;flex:0 2 auto}.reply-indicator__header{margin-bottom:5px;overflow:hidden}.reply-indicator__cancel{float:right;line-height:24px}.reply-indicator__display-name{color:#121a24;display:block;max-width:100%;line-height:24px;overflow:hidden;padding-right:25px;text-decoration:none}.reply-indicator__display-avatar{float:left;margin-right:5px}.status__content--with-action{cursor:pointer}.status__content,.reply-indicator__content{position:relative;font-size:15px;line-height:20px;word-wrap:break-word;font-weight:400;overflow:hidden;text-overflow:ellipsis;padding-top:2px;color:#fff}.status__content:focus,.reply-indicator__content:focus{outline:0}.status__content.status__content--with-spoiler,.reply-indicator__content.status__content--with-spoiler{white-space:normal}.status__content.status__content--with-spoiler .status__content__text,.reply-indicator__content.status__content--with-spoiler .status__content__text{white-space:pre-wrap}.status__content .emojione,.reply-indicator__content .emojione{width:20px;height:20px;margin:-3px 0 0}.status__content img,.reply-indicator__content img{max-width:100%;max-height:400px;object-fit:contain}.status__content p,.reply-indicator__content p{margin-bottom:20px;white-space:pre-wrap}.status__content p:last-child,.reply-indicator__content p:last-child{margin-bottom:0}.status__content a,.reply-indicator__content a{color:#d8a070;text-decoration:none}.status__content a:hover,.reply-indicator__content a:hover{text-decoration:underline}.status__content a:hover .fa,.reply-indicator__content a:hover .fa{color:#525252}.status__content a.mention:hover,.reply-indicator__content a.mention:hover{text-decoration:none}.status__content a.mention:hover span,.reply-indicator__content a.mention:hover span{text-decoration:underline}.status__content a .fa,.reply-indicator__content a .fa{color:#404040}.status__content a.unhandled-link,.reply-indicator__content a.unhandled-link{color:#0000a8}.status__content .status__content__spoiler-link,.reply-indicator__content .status__content__spoiler-link{background:#404040}.status__content .status__content__spoiler-link:hover,.reply-indicator__content .status__content__spoiler-link:hover{background:#525252;text-decoration:none}.status__content .status__content__spoiler-link::-moz-focus-inner,.reply-indicator__content .status__content__spoiler-link::-moz-focus-inner{border:0}.status__content .status__content__spoiler-link::-moz-focus-inner,.status__content .status__content__spoiler-link:focus,.status__content .status__content__spoiler-link:active,.reply-indicator__content .status__content__spoiler-link::-moz-focus-inner,.reply-indicator__content .status__content__spoiler-link:focus,.reply-indicator__content .status__content__spoiler-link:active{outline:0 !important}.status__content .status__content__text,.reply-indicator__content .status__content__text{display:none}.status__content .status__content__text.status__content__text--visible,.reply-indicator__content .status__content__text.status__content__text--visible{display:block}.status__content.status__content--collapsed{max-height:300px}.status__content__read-more-button{display:block;font-size:15px;line-height:20px;color:#0000a8;border:0;background:transparent;padding:0;padding-top:8px}.status__content__read-more-button:hover,.status__content__read-more-button:active{text-decoration:underline}.status__content__spoiler-link{display:inline-block;border-radius:2px;background:transparent;border:0;color:#121a24;font-weight:700;font-size:12px;padding:0 6px;line-height:20px;cursor:pointer;vertical-align:middle}.status__wrapper--filtered{color:#404040;border:0;font-size:inherit;text-align:center;line-height:inherit;margin:0;padding:15px;box-sizing:border-box;width:100%;clear:both;border-bottom:1px solid #202e3f}.status__prepend-icon-wrapper{left:-26px;position:absolute}.focusable:focus{outline:0;background:#192432}.focusable:focus .status.status-direct{background:#26374d}.focusable:focus .status.status-direct.muted{background:transparent}.focusable:focus .detailed-status,.focusable:focus .detailed-status__action-bar{background:#202e3f}.status{padding:8px 10px;padding-left:68px;position:relative;min-height:54px;border-bottom:1px solid #202e3f;cursor:default;opacity:1;animation:fade 150ms linear}@supports(-ms-overflow-style: -ms-autohiding-scrollbar){.status{padding-right:26px}}@keyframes fade{0%{opacity:0}100%{opacity:1}}.status .video-player,.status .audio-player{margin-top:8px}.status.status-direct:not(.read){background:#202e3f;border-bottom-color:#26374d}.status.light .status__relative-time{color:#9baec8}.status.light .status__display-name{color:#121a24}.status.light .display-name strong{color:#121a24}.status.light .display-name span{color:#9baec8}.status.light .status__content{color:#121a24}.status.light .status__content a{color:#00007f}.status.light .status__content a.status__content__spoiler-link{color:#fff;background:#9baec8}.status.light .status__content a.status__content__spoiler-link:hover{background:#b5c3d6}.notification-favourite .status.status-direct{background:transparent}.notification-favourite .status.status-direct .icon-button.disabled{color:#616161}.status__relative-time,.notification__relative_time{color:#404040;float:right;font-size:14px}.status__display-name{color:#404040}.status__info .status__display-name{display:block;max-width:100%;padding-right:25px}.status__info{font-size:15px}.status-check-box{border-bottom:1px solid #d9e1e8;display:flex}.status-check-box .status-check-box__status{margin:10px 0 10px 10px;flex:1}.status-check-box .status-check-box__status .media-gallery{max-width:250px}.status-check-box .status-check-box__status .status__content{padding:0;white-space:normal}.status-check-box .status-check-box__status .video-player,.status-check-box .status-check-box__status .audio-player{margin-top:8px;max-width:250px}.status-check-box .status-check-box__status .media-gallery__item-thumbnail{cursor:default}.status-check-box-toggle{align-items:center;display:flex;flex:0 0 auto;justify-content:center;padding:10px}.status__prepend{margin-left:68px;color:#404040;padding:8px 0;padding-bottom:2px;font-size:14px;position:relative}.status__prepend .status__display-name strong{color:#404040}.status__prepend>span{display:block;overflow:hidden;text-overflow:ellipsis}.status__action-bar{align-items:center;display:flex;margin-top:8px}.status__action-bar__counter{display:inline-flex;margin-right:11px;align-items:center}.status__action-bar__counter .status__action-bar-button{margin-right:4px}.status__action-bar__counter__label{display:inline-block;width:14px;font-size:12px;font-weight:500;color:#404040}.status__action-bar-button{margin-right:18px}.status__action-bar-dropdown{height:23.15px;width:23.15px}.detailed-status__action-bar-dropdown{flex:1 1 auto;display:flex;align-items:center;justify-content:center;position:relative}.detailed-status{background:#192432;padding:14px 10px}.detailed-status--flex{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-start}.detailed-status--flex .status__content,.detailed-status--flex .detailed-status__meta{flex:100%}.detailed-status .status__content{font-size:19px;line-height:24px}.detailed-status .status__content .emojione{width:24px;height:24px;margin:-1px 0 0}.detailed-status .status__content .status__content__spoiler-link{line-height:24px;margin:-1px 0 0}.detailed-status .video-player,.detailed-status .audio-player{margin-top:8px}.detailed-status__meta{margin-top:15px;color:#404040;font-size:14px;line-height:18px}.detailed-status__action-bar{background:#192432;border-top:1px solid #202e3f;border-bottom:1px solid #202e3f;display:flex;flex-direction:row;padding:10px 0}.detailed-status__link{color:inherit;text-decoration:none}.detailed-status__favorites,.detailed-status__reblogs{display:inline-block;font-weight:500;font-size:12px;margin-left:6px}.reply-indicator__content{color:#121a24;font-size:14px}.reply-indicator__content a{color:#404040}.domain{padding:10px;border-bottom:1px solid #202e3f}.domain .domain__domain-name{flex:1 1 auto;display:block;color:#fff;text-decoration:none;font-size:14px;font-weight:500}.domain__wrapper{display:flex}.domain_buttons{height:18px;padding:10px;white-space:nowrap}.account{padding:10px;border-bottom:1px solid #202e3f}.account.compact{padding:0;border-bottom:0}.account.compact .account__avatar-wrapper{margin-left:0}.account .account__display-name{flex:1 1 auto;display:block;color:#9baec8;overflow:hidden;text-decoration:none;font-size:14px}.account__wrapper{display:flex}.account__avatar-wrapper{float:left;margin-left:12px;margin-right:12px}.account__avatar{border-radius:4px;background:transparent no-repeat;background-position:50%;background-clip:padding-box;position:relative}.account__avatar-inline{display:inline-block;vertical-align:middle;margin-right:5px}.account__avatar-composite{border-radius:4px;background:transparent no-repeat;background-position:50%;background-clip:padding-box;border-radius:50%;overflow:hidden;position:relative;cursor:default}.account__avatar-composite>div{float:left;position:relative;box-sizing:border-box}.account__avatar-composite__label{display:block;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);color:#fff;text-shadow:1px 1px 2px #000;font-weight:700;font-size:15px}a .account__avatar{cursor:pointer}.account__avatar-overlay{width:48px;height:48px;background-size:48px 48px}.account__avatar-overlay-base{border-radius:4px;background:transparent no-repeat;background-position:50%;background-clip:padding-box;width:36px;height:36px;background-size:36px 36px}.account__avatar-overlay-overlay{border-radius:4px;background:transparent no-repeat;background-position:50%;background-clip:padding-box;width:24px;height:24px;background-size:24px 24px;position:absolute;bottom:0;right:0;z-index:1}.account__relationship{height:18px;padding:10px;white-space:nowrap}.account__disclaimer{padding:10px;border-top:1px solid #202e3f;color:#404040}.account__disclaimer strong{font-weight:500}.account__disclaimer strong:lang(ja){font-weight:700}.account__disclaimer strong:lang(ko){font-weight:700}.account__disclaimer strong:lang(zh-CN){font-weight:700}.account__disclaimer strong:lang(zh-HK){font-weight:700}.account__disclaimer strong:lang(zh-TW){font-weight:700}.account__disclaimer a{font-weight:500;color:inherit;text-decoration:underline}.account__disclaimer a:hover,.account__disclaimer a:focus,.account__disclaimer a:active{text-decoration:none}.account__action-bar{border-top:1px solid #202e3f;border-bottom:1px solid #202e3f;line-height:36px;overflow:hidden;flex:0 0 auto;display:flex}.account__action-bar-dropdown{padding:10px}.account__action-bar-dropdown .icon-button{vertical-align:middle}.account__action-bar-dropdown .dropdown--active .dropdown__content.dropdown__right{left:6px;right:initial}.account__action-bar-dropdown .dropdown--active::after{bottom:initial;margin-left:11px;margin-top:-7px;right:initial}.account__action-bar-links{display:flex;flex:1 1 auto;line-height:18px;text-align:center}.account__action-bar__tab{text-decoration:none;overflow:hidden;flex:0 1 100%;border-right:1px solid #202e3f;padding:10px 0;border-bottom:4px solid transparent}.account__action-bar__tab.active{border-bottom:4px solid #00007f}.account__action-bar__tab>span{display:block;font-size:12px;color:#9baec8}.account__action-bar__tab strong{display:block;font-size:15px;font-weight:500;color:#fff}.account__action-bar__tab strong:lang(ja){font-weight:700}.account__action-bar__tab strong:lang(ko){font-weight:700}.account__action-bar__tab strong:lang(zh-CN){font-weight:700}.account__action-bar__tab strong:lang(zh-HK){font-weight:700}.account__action-bar__tab strong:lang(zh-TW){font-weight:700}.account-authorize{padding:14px 10px}.account-authorize .detailed-status__display-name{display:block;margin-bottom:15px;overflow:hidden}.account-authorize__avatar{float:left;margin-right:10px}.status__display-name,.status__relative-time,.detailed-status__display-name,.detailed-status__datetime,.detailed-status__application,.account__display-name{text-decoration:none}.status__display-name strong,.account__display-name strong{color:#fff}.muted .emojione{opacity:.5}.status__display-name:hover strong,.reply-indicator__display-name:hover strong,.detailed-status__display-name:hover strong,a.account__display-name:hover strong{text-decoration:underline}.account__display-name strong{display:block;overflow:hidden;text-overflow:ellipsis}.detailed-status__application,.detailed-status__datetime{color:inherit}.detailed-status .button.logo-button{margin-bottom:15px}.detailed-status__display-name{color:#d9e1e8;display:block;line-height:24px;margin-bottom:15px;overflow:hidden}.detailed-status__display-name strong,.detailed-status__display-name span{display:block;text-overflow:ellipsis;overflow:hidden}.detailed-status__display-name strong{font-size:16px;color:#fff}.detailed-status__display-avatar{float:left;margin-right:10px}.status__avatar{height:48px;left:10px;position:absolute;top:10px;width:48px}.status__expand{width:68px;position:absolute;left:0;top:0;height:100%;cursor:pointer}.muted .status__content,.muted .status__content p,.muted .status__content a{color:#404040}.muted .status__display-name strong{color:#404040}.muted .status__avatar{opacity:.5}.muted a.status__content__spoiler-link{background:#404040;color:#121a24}.muted a.status__content__spoiler-link:hover{background:#525252;text-decoration:none}.notification__message{margin:0 10px 0 68px;padding:8px 0 0;cursor:default;color:#9baec8;font-size:15px;line-height:22px;position:relative}.notification__message .fa{color:#00007f}.notification__message>span{display:inline;overflow:hidden;text-overflow:ellipsis}.notification__favourite-icon-wrapper{left:-26px;position:absolute}.notification__favourite-icon-wrapper .star-icon{color:#ca8f04}.star-icon.active{color:#ca8f04}.bookmark-icon.active{color:#ff5050}.no-reduce-motion .icon-button.star-icon.activate>.fa-star{animation:spring-rotate-in 1s linear}.no-reduce-motion .icon-button.star-icon.deactivate>.fa-star{animation:spring-rotate-out 1s linear}.notification__display-name{color:inherit;font-weight:500;text-decoration:none}.notification__display-name:hover{color:#fff;text-decoration:underline}.notification__relative_time{float:right}.display-name{display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.display-name__html{font-weight:500}.display-name__account{font-size:14px}.status__relative-time:hover,.detailed-status__datetime:hover{text-decoration:underline}.image-loader{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center;flex-direction:column}.image-loader .image-loader__preview-canvas{max-width:100%;max-height:80%;background:url(\"~images/void.png\") repeat;object-fit:contain}.image-loader .loading-bar{position:relative}.image-loader.image-loader--amorphous .image-loader__preview-canvas{display:none}.zoomable-image{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center}.zoomable-image img{max-width:100%;max-height:80%;width:auto;height:auto;object-fit:contain}.navigation-bar{padding:10px;display:flex;align-items:center;flex-shrink:0;cursor:default;color:#9baec8}.navigation-bar strong{color:#d9e1e8}.navigation-bar a{color:inherit}.navigation-bar .permalink{text-decoration:none}.navigation-bar .navigation-bar__actions{position:relative}.navigation-bar .navigation-bar__actions .icon-button.close{position:absolute;pointer-events:none;transform:scale(0, 1) translate(-100%, 0);opacity:0}.navigation-bar .navigation-bar__actions .compose__action-bar .icon-button{pointer-events:auto;transform:scale(1, 1) translate(0, 0);opacity:1}.navigation-bar__profile{flex:1 1 auto;margin-left:8px;line-height:20px;margin-top:-1px;overflow:hidden}.navigation-bar__profile-account{display:block;font-weight:500;overflow:hidden;text-overflow:ellipsis}.navigation-bar__profile-edit{color:inherit;text-decoration:none}.dropdown{display:inline-block}.dropdown__content{display:none;position:absolute}.dropdown-menu__separator{border-bottom:1px solid #c0cdd9;margin:5px 7px 6px;height:0}.dropdown-menu{background:#d9e1e8;padding:4px 0;border-radius:4px;box-shadow:2px 4px 15px rgba(0,0,0,.4);z-index:9999}.dropdown-menu ul{list-style:none}.dropdown-menu.left{transform-origin:100% 50%}.dropdown-menu.top{transform-origin:50% 100%}.dropdown-menu.bottom{transform-origin:50% 0}.dropdown-menu.right{transform-origin:0 50%}.dropdown-menu__arrow{position:absolute;width:0;height:0;border:0 solid transparent}.dropdown-menu__arrow.left{right:-5px;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#d9e1e8}.dropdown-menu__arrow.top{bottom:-5px;margin-left:-7px;border-width:5px 7px 0;border-top-color:#d9e1e8}.dropdown-menu__arrow.bottom{top:-5px;margin-left:-7px;border-width:0 7px 5px;border-bottom-color:#d9e1e8}.dropdown-menu__arrow.right{left:-5px;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#d9e1e8}.dropdown-menu__item a{font-size:13px;line-height:18px;display:block;padding:4px 14px;box-sizing:border-box;text-decoration:none;background:#d9e1e8;color:#121a24;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown-menu__item a:focus,.dropdown-menu__item a:hover,.dropdown-menu__item a:active{background:#00007f;color:#d9e1e8;outline:0}.dropdown--active .dropdown__content{display:block;line-height:18px;max-width:311px;right:0;text-align:left;z-index:9999}.dropdown--active .dropdown__content>ul{list-style:none;background:#d9e1e8;padding:4px 0;border-radius:4px;box-shadow:0 0 15px rgba(0,0,0,.4);min-width:140px;position:relative}.dropdown--active .dropdown__content.dropdown__right{right:0}.dropdown--active .dropdown__content.dropdown__left>ul{left:-98px}.dropdown--active .dropdown__content>ul>li>a{font-size:13px;line-height:18px;display:block;padding:4px 14px;box-sizing:border-box;text-decoration:none;background:#d9e1e8;color:#121a24;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown--active .dropdown__content>ul>li>a:focus{outline:0}.dropdown--active .dropdown__content>ul>li>a:hover{background:#00007f;color:#d9e1e8}.dropdown__icon{vertical-align:middle}.columns-area{display:flex;flex:1 1 auto;flex-direction:row;justify-content:flex-start;overflow-x:auto;position:relative}.columns-area.unscrollable{overflow-x:hidden}.columns-area__panels{display:flex;justify-content:center;width:100%;height:100%;min-height:100vh}.columns-area__panels__pane{height:100%;overflow:hidden;pointer-events:none;display:flex;justify-content:flex-end;min-width:285px}.columns-area__panels__pane--start{justify-content:flex-start}.columns-area__panels__pane__inner{position:fixed;width:285px;pointer-events:auto;height:100%}.columns-area__panels__main{box-sizing:border-box;width:100%;max-width:600px;flex:0 0 auto;display:flex;flex-direction:column}@media screen and (min-width: 415px){.columns-area__panels__main{padding:0 10px}}.tabs-bar__wrapper{background:#040609;position:sticky;top:0;z-index:2;padding-top:0}@media screen and (min-width: 415px){.tabs-bar__wrapper{padding-top:10px}}.tabs-bar__wrapper .tabs-bar{margin-bottom:0}@media screen and (min-width: 415px){.tabs-bar__wrapper .tabs-bar{margin-bottom:10px}}.react-swipeable-view-container,.react-swipeable-view-container .columns-area,.react-swipeable-view-container .drawer,.react-swipeable-view-container .column{height:100%}.react-swipeable-view-container>*{display:flex;align-items:center;justify-content:center;height:100%}.column{width:350px;position:relative;box-sizing:border-box;display:flex;flex-direction:column}.column>.scrollable{background:#121a24;border-bottom-left-radius:2px;border-bottom-right-radius:2px}.ui{flex:0 0 auto;display:flex;flex-direction:column;width:100%;height:100%}.drawer{width:330px;box-sizing:border-box;display:flex;flex-direction:column;overflow-y:hidden}.drawer__tab{display:block;flex:1 1 auto;padding:15px 5px 13px;color:#9baec8;text-decoration:none;text-align:center;font-size:16px;border-bottom:2px solid transparent}.column,.drawer{flex:1 1 auto;overflow:hidden}@media screen and (min-width: 631px){.columns-area{padding:0}.column,.drawer{flex:0 0 auto;padding:10px;padding-left:5px;padding-right:5px}.column:first-child,.drawer:first-child{padding-left:10px}.column:last-child,.drawer:last-child{padding-right:10px}.columns-area>div .column,.columns-area>div .drawer{padding-left:5px;padding-right:5px}}.tabs-bar{box-sizing:border-box;display:flex;background:#202e3f;flex:0 0 auto;overflow-y:auto}.tabs-bar__link{display:block;flex:1 1 auto;padding:15px 10px;padding-bottom:13px;color:#fff;text-decoration:none;text-align:center;font-size:14px;font-weight:500;border-bottom:2px solid #202e3f;transition:all 50ms linear;transition-property:border-bottom,background,color}.tabs-bar__link .fa{font-weight:400;font-size:16px}@media screen and (min-width: 631px){.tabs-bar__link:hover,.tabs-bar__link:focus,.tabs-bar__link:active{background:#2a3c54;border-bottom-color:#2a3c54}}.tabs-bar__link.active{border-bottom:2px solid #00007f;color:#00007f}.tabs-bar__link span{margin-left:5px;display:none}@media screen and (min-width: 600px){.tabs-bar__link span{display:inline}}.columns-area--mobile{flex-direction:column;width:100%;height:100%;margin:0 auto}.columns-area--mobile .column,.columns-area--mobile .drawer{width:100%;height:100%;padding:0}.columns-area--mobile .directory__list{display:grid;grid-gap:10px;grid-template-columns:minmax(0, 50%) minmax(0, 50%)}@media screen and (max-width: 415px){.columns-area--mobile .directory__list{display:block}}.columns-area--mobile .directory__card{margin-bottom:0}.columns-area--mobile .filter-form{display:flex}.columns-area--mobile .autosuggest-textarea__textarea{font-size:16px}.columns-area--mobile .search__input{line-height:18px;font-size:16px;padding:15px;padding-right:30px}.columns-area--mobile .search__icon .fa{top:15px}.columns-area--mobile .scrollable{overflow:visible}@supports(display: grid){.columns-area--mobile .scrollable{contain:content}}@media screen and (min-width: 415px){.columns-area--mobile{padding:10px 0;padding-top:0}}@media screen and (min-width: 630px){.columns-area--mobile .detailed-status{padding:15px}.columns-area--mobile .detailed-status .media-gallery,.columns-area--mobile .detailed-status .video-player,.columns-area--mobile .detailed-status .audio-player{margin-top:15px}.columns-area--mobile .account__header__bar{padding:5px 10px}.columns-area--mobile .navigation-bar,.columns-area--mobile .compose-form{padding:15px}.columns-area--mobile .compose-form .compose-form__publish .compose-form__publish-button-wrapper{padding-top:15px}.columns-area--mobile .status{padding:15px 15px 15px 78px;min-height:50px}.columns-area--mobile .status__avatar{left:15px;top:17px}.columns-area--mobile .status__content{padding-top:5px}.columns-area--mobile .status__prepend{margin-left:78px;padding-top:15px}.columns-area--mobile .status__prepend-icon-wrapper{left:-32px}.columns-area--mobile .status .media-gallery,.columns-area--mobile .status__action-bar,.columns-area--mobile .status .video-player,.columns-area--mobile .status .audio-player{margin-top:10px}.columns-area--mobile .account{padding:15px 10px}.columns-area--mobile .account__header__bio{margin:0 -10px}.columns-area--mobile .notification__message{margin-left:78px;padding-top:15px}.columns-area--mobile .notification__favourite-icon-wrapper{left:-32px}.columns-area--mobile .notification .status{padding-top:8px}.columns-area--mobile .notification .account{padding-top:8px}.columns-area--mobile .notification .account__avatar-wrapper{margin-left:17px;margin-right:15px}}.floating-action-button{position:fixed;display:flex;justify-content:center;align-items:center;width:3.9375rem;height:3.9375rem;bottom:1.3125rem;right:1.3125rem;background:#000070;color:#fff;border-radius:50%;font-size:21px;line-height:21px;text-decoration:none;box-shadow:2px 3px 9px rgba(0,0,0,.4)}.floating-action-button:hover,.floating-action-button:focus,.floating-action-button:active{background:#0000a3}@media screen and (min-width: 415px){.tabs-bar{width:100%}.react-swipeable-view-container .columns-area--mobile{height:calc(100% - 10px) !important}.getting-started__wrapper,.getting-started__trends,.search{margin-bottom:10px}.getting-started__panel{margin:10px 0}.column,.drawer{min-width:330px}}@media screen and (max-width: 895px){.columns-area__panels__pane--compositional{display:none}}@media screen and (min-width: 895px){.floating-action-button,.tabs-bar__link.optional{display:none}.search-page .search{display:none}}@media screen and (max-width: 1190px){.columns-area__panels__pane--navigational{display:none}}@media screen and (min-width: 1190px){.tabs-bar{display:none}}.icon-with-badge{position:relative}.icon-with-badge__badge{position:absolute;left:9px;top:-13px;background:#00007f;border:2px solid #202e3f;padding:1px 6px;border-radius:6px;font-size:10px;font-weight:500;line-height:14px;color:#fff}.column-link--transparent .icon-with-badge__badge{border-color:#040609}.compose-panel{width:285px;margin-top:10px;display:flex;flex-direction:column;height:calc(100% - 10px);overflow-y:hidden}.compose-panel .navigation-bar{padding-top:20px;padding-bottom:20px;flex:0 1 48px;min-height:20px}.compose-panel .flex-spacer{background:transparent}.compose-panel .compose-form{flex:1;overflow-y:hidden;display:flex;flex-direction:column;min-height:310px;padding-bottom:71px;margin-bottom:-71px}.compose-panel .compose-form__autosuggest-wrapper{overflow-y:auto;background-color:#fff;border-radius:4px 4px 0 0;flex:0 1 auto}.compose-panel .autosuggest-textarea__textarea{overflow-y:hidden}.compose-panel .compose-form__upload-thumbnail{height:80px}.navigation-panel{margin-top:10px;margin-bottom:10px;height:calc(100% - 20px);overflow-y:auto;display:flex;flex-direction:column}.navigation-panel>a{flex:0 0 auto}.navigation-panel hr{flex:0 0 auto;border:0;background:transparent;border-top:1px solid #192432;margin:10px 0}.navigation-panel .flex-spacer{background:transparent}.drawer__pager{box-sizing:border-box;padding:0;flex-grow:1;position:relative;overflow:hidden;display:flex}.drawer__inner{position:absolute;top:0;left:0;background:#283a50;box-sizing:border-box;padding:0;display:flex;flex-direction:column;overflow:hidden;overflow-y:auto;width:100%;height:100%;border-radius:2px}.drawer__inner.darker{background:#121a24}.drawer__inner__mastodon{background:#283a50 url('data:image/svg+xml;utf8,') no-repeat bottom/100% auto;flex:1;min-height:47px;display:none}.drawer__inner__mastodon>img{display:block;object-fit:contain;object-position:bottom left;width:100%;height:100%;pointer-events:none;user-drag:none;user-select:none}@media screen and (min-height: 640px){.drawer__inner__mastodon{display:block}}.pseudo-drawer{background:#283a50;font-size:13px;text-align:left}.drawer__header{flex:0 0 auto;font-size:16px;background:#202e3f;margin-bottom:10px;display:flex;flex-direction:row;border-radius:2px}.drawer__header a{transition:background 100ms ease-in}.drawer__header a:hover{background:#17212e;transition:background 200ms ease-out}.scrollable{overflow-y:scroll;overflow-x:hidden;flex:1 1 auto;-webkit-overflow-scrolling:touch}.scrollable.optionally-scrollable{overflow-y:auto}@supports(display: grid){.scrollable{contain:strict}}.scrollable--flex{display:flex;flex-direction:column}.scrollable__append{flex:1 1 auto;position:relative;min-height:120px}@supports(display: grid){.scrollable.fullscreen{contain:none}}.column-back-button{box-sizing:border-box;width:100%;background:#192432;color:#00007f;cursor:pointer;flex:0 0 auto;font-size:16px;line-height:inherit;border:0;text-align:unset;padding:15px;margin:0;z-index:3;outline:0}.column-back-button:hover{text-decoration:underline}.column-header__back-button{background:#192432;border:0;font-family:inherit;color:#00007f;cursor:pointer;white-space:nowrap;font-size:16px;padding:0 5px 0 0;z-index:3}.column-header__back-button:hover{text-decoration:underline}.column-header__back-button:last-child{padding:0 15px 0 0}.column-back-button__icon{display:inline-block;margin-right:5px}.column-back-button--slim{position:relative}.column-back-button--slim-button{cursor:pointer;flex:0 0 auto;font-size:16px;padding:15px;position:absolute;right:0;top:-48px}.react-toggle{display:inline-block;position:relative;cursor:pointer;background-color:transparent;border:0;padding:0;user-select:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-tap-highlight-color:transparent}.react-toggle-screenreader-only{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.react-toggle--disabled{cursor:not-allowed;opacity:.5;transition:opacity .25s}.react-toggle-track{width:50px;height:24px;padding:0;border-radius:30px;background-color:#121a24;transition:background-color .2s ease}.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track{background-color:#010102}.react-toggle--checked .react-toggle-track{background-color:#00007f}.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track{background-color:#0000b2}.react-toggle-track-check{position:absolute;width:14px;height:10px;top:0;bottom:0;margin-top:auto;margin-bottom:auto;line-height:0;left:8px;opacity:0;transition:opacity .25s ease}.react-toggle--checked .react-toggle-track-check{opacity:1;transition:opacity .25s ease}.react-toggle-track-x{position:absolute;width:10px;height:10px;top:0;bottom:0;margin-top:auto;margin-bottom:auto;line-height:0;right:10px;opacity:1;transition:opacity .25s ease}.react-toggle--checked .react-toggle-track-x{opacity:0}.react-toggle-thumb{position:absolute;top:1px;left:1px;width:22px;height:22px;border:1px solid #121a24;border-radius:50%;background-color:#fafafa;box-sizing:border-box;transition:all .25s ease;transition-property:border-color,left}.react-toggle--checked .react-toggle-thumb{left:27px;border-color:#00007f}.column-link{background:#202e3f;color:#fff;display:block;font-size:16px;padding:15px;text-decoration:none}.column-link:hover,.column-link:focus,.column-link:active{background:#253549}.column-link:focus{outline:0}.column-link--transparent{background:transparent;color:#d9e1e8}.column-link--transparent:hover,.column-link--transparent:focus,.column-link--transparent:active{background:transparent;color:#fff}.column-link--transparent.active{color:#00007f}.column-link__icon{display:inline-block;margin-right:5px}.column-link__badge{display:inline-block;border-radius:4px;font-size:12px;line-height:19px;font-weight:500;background:#121a24;padding:4px 8px;margin:-6px 10px}.column-subheading{background:#121a24;color:#404040;padding:8px 20px;font-size:13px;font-weight:500;cursor:default}.getting-started__wrapper,.getting-started,.flex-spacer{background:#121a24}.flex-spacer{flex:1 1 auto}.getting-started{color:#404040;overflow:auto;border-bottom-left-radius:2px;border-bottom-right-radius:2px}.getting-started__wrapper,.getting-started__panel,.getting-started__footer{height:min-content}.getting-started__panel,.getting-started__footer{padding:10px;padding-top:20px;flex-grow:0}.getting-started__panel ul,.getting-started__footer ul{margin-bottom:10px}.getting-started__panel ul li,.getting-started__footer ul li{display:inline}.getting-started__panel p,.getting-started__footer p{font-size:13px}.getting-started__panel p a,.getting-started__footer p a{color:#404040;text-decoration:underline}.getting-started__panel a,.getting-started__footer a{text-decoration:none;color:#9baec8}.getting-started__panel a:hover,.getting-started__panel a:focus,.getting-started__panel a:active,.getting-started__footer a:hover,.getting-started__footer a:focus,.getting-started__footer a:active{text-decoration:underline}.getting-started__wrapper,.getting-started__footer{color:#404040}.getting-started__trends{flex:0 1 auto;opacity:1;animation:fade 150ms linear;margin-top:10px}.getting-started__trends h4{font-size:13px;color:#9baec8;padding:10px;font-weight:500;border-bottom:1px solid #202e3f}@media screen and (max-height: 810px){.getting-started__trends .trends__item:nth-child(3){display:none}}@media screen and (max-height: 720px){.getting-started__trends .trends__item:nth-child(2){display:none}}@media screen and (max-height: 670px){.getting-started__trends{display:none}}.getting-started__trends .trends__item{border-bottom:0;padding:10px}.getting-started__trends .trends__item__current{color:#9baec8}.keyboard-shortcuts{padding:8px 0 0;overflow:hidden}.keyboard-shortcuts thead{position:absolute;left:-9999px}.keyboard-shortcuts td{padding:0 10px 8px}.keyboard-shortcuts kbd{display:inline-block;padding:3px 5px;background-color:#202e3f;border:1px solid #0b1016}.setting-text{display:block;box-sizing:border-box;width:100%;margin:0;color:#121a24;background:#fff;padding:10px;font-family:inherit;font-size:14px;resize:vertical;border:0;outline:0;border-radius:4px}.setting-text:focus{outline:0}@media screen and (max-width: 600px){.setting-text{font-size:16px}}.no-reduce-motion button.icon-button i.fa-retweet{background-position:0 0;height:19px;transition:background-position .9s steps(10);transition-duration:0s;vertical-align:middle;width:22px}.no-reduce-motion button.icon-button i.fa-retweet::before{display:none !important}.no-reduce-motion button.icon-button.active i.fa-retweet{transition-duration:.9s;background-position:0 100%}.reduce-motion button.icon-button i.fa-retweet{color:#404040;transition:color 100ms ease-in}.reduce-motion button.icon-button.active i.fa-retweet{color:#00007f}.status-card{display:flex;font-size:14px;border:1px solid #202e3f;border-radius:4px;color:#404040;margin-top:14px;text-decoration:none;overflow:hidden}.status-card__actions{bottom:0;left:0;position:absolute;right:0;top:0;display:flex;justify-content:center;align-items:center}.status-card__actions>div{background:rgba(0,0,0,.6);border-radius:8px;padding:12px 9px;flex:0 0 auto;display:flex;justify-content:center;align-items:center}.status-card__actions button,.status-card__actions a{display:inline;color:#d9e1e8;background:transparent;border:0;padding:0 8px;text-decoration:none;font-size:18px;line-height:18px}.status-card__actions button:hover,.status-card__actions button:active,.status-card__actions button:focus,.status-card__actions a:hover,.status-card__actions a:active,.status-card__actions a:focus{color:#fff}.status-card__actions a{font-size:19px;position:relative;bottom:-1px}a.status-card{cursor:pointer}a.status-card:hover{background:#202e3f}.status-card-photo{cursor:zoom-in;display:block;text-decoration:none;width:100%;height:auto;margin:0}.status-card-video iframe{width:100%;height:100%}.status-card__title{display:block;font-weight:500;margin-bottom:5px;color:#9baec8;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-decoration:none}.status-card__content{flex:1 1 auto;overflow:hidden;padding:14px 14px 14px 8px}.status-card__description{color:#9baec8}.status-card__host{display:block;margin-top:5px;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-card__image{flex:0 0 100px;background:#202e3f;position:relative}.status-card__image>.fa{font-size:21px;position:absolute;transform-origin:50% 50%;top:50%;left:50%;transform:translate(-50%, -50%)}.status-card.horizontal{display:block}.status-card.horizontal .status-card__image{width:100%}.status-card.horizontal .status-card__image-image{border-radius:4px 4px 0 0}.status-card.horizontal .status-card__title{white-space:inherit}.status-card.compact{border-color:#192432}.status-card.compact.interactive{border:0}.status-card.compact .status-card__content{padding:8px;padding-top:10px}.status-card.compact .status-card__title{white-space:nowrap}.status-card.compact .status-card__image{flex:0 0 60px}a.status-card.compact:hover{background-color:#192432}.status-card__image-image{border-radius:4px 0 0 4px;display:block;margin:0;width:100%;height:100%;object-fit:cover;background-size:cover;background-position:center center}.load-more{display:block;color:#404040;background-color:transparent;border:0;font-size:inherit;text-align:center;line-height:inherit;margin:0;padding:15px;box-sizing:border-box;width:100%;clear:both;text-decoration:none}.load-more:hover{background:#151f2b}.load-gap{border-bottom:1px solid #202e3f}.regeneration-indicator{text-align:center;font-size:16px;font-weight:500;color:#404040;background:#121a24;cursor:default;display:flex;flex:1 1 auto;flex-direction:column;align-items:center;justify-content:center;padding:20px}.regeneration-indicator__figure,.regeneration-indicator__figure img{display:block;width:auto;height:160px;margin:0}.regeneration-indicator--without-header{padding-top:68px}.regeneration-indicator__label{margin-top:30px}.regeneration-indicator__label strong{display:block;margin-bottom:10px;color:#404040}.regeneration-indicator__label span{font-size:15px;font-weight:400}.column-header__wrapper{position:relative;flex:0 0 auto}.column-header__wrapper.active::before{display:block;content:\"\";position:absolute;top:35px;left:0;right:0;margin:0 auto;width:60%;pointer-events:none;height:28px;z-index:1;background:radial-gradient(ellipse, rgba(0, 0, 127, 0.23) 0%, rgba(0, 0, 127, 0) 60%)}.column-header{display:flex;font-size:16px;background:#192432;flex:0 0 auto;cursor:pointer;position:relative;z-index:2;outline:0;overflow:hidden;border-top-left-radius:2px;border-top-right-radius:2px}.column-header>button{margin:0;border:0;padding:15px 0 15px 15px;color:inherit;background:transparent;font:inherit;text-align:left;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;flex:1}.column-header>.column-header__back-button{color:#00007f}.column-header.active{box-shadow:0 1px 0 rgba(0,0,127,.3)}.column-header.active .column-header__icon{color:#00007f;text-shadow:0 0 10px rgba(0,0,127,.4)}.column-header:focus,.column-header:active{outline:0}.column-header__buttons{height:48px;display:flex}.column-header__links{margin-bottom:14px}.column-header__links .text-btn{margin-right:10px}.column-header__button{background:#192432;border:0;color:#9baec8;cursor:pointer;font-size:16px;padding:0 15px}.column-header__button:hover{color:#b2c1d5}.column-header__button.active{color:#fff;background:#202e3f}.column-header__button.active:hover{color:#fff;background:#202e3f}.column-header__collapsible{max-height:70vh;overflow:hidden;overflow-y:auto;color:#9baec8;transition:max-height 150ms ease-in-out,opacity 300ms linear;opacity:1}.column-header__collapsible.collapsed{max-height:0;opacity:.5}.column-header__collapsible.animating{overflow-y:hidden}.column-header__collapsible hr{height:0;background:transparent;border:0;border-top:1px solid #26374d;margin:10px 0}.column-header__collapsible-inner{background:#202e3f;padding:15px}.column-header__setting-btn:hover{color:#9baec8;text-decoration:underline}.column-header__setting-arrows{float:right}.column-header__setting-arrows .column-header__setting-btn{padding:0 10px}.column-header__setting-arrows .column-header__setting-btn:last-child{padding-right:0}.text-btn{display:inline-block;padding:0;font-family:inherit;font-size:inherit;color:inherit;border:0;background:transparent;cursor:pointer}.column-header__icon{display:inline-block;margin-right:5px}.loading-indicator{color:#404040;font-size:13px;font-weight:400;overflow:visible;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.loading-indicator span{display:block;float:left;margin-left:50%;transform:translateX(-50%);margin:82px 0 0 50%;white-space:nowrap}.loading-indicator__figure{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);width:42px;height:42px;box-sizing:border-box;background-color:transparent;border:0 solid #3e5a7c;border-width:6px;border-radius:50%}.no-reduce-motion .loading-indicator span{animation:loader-label 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1)}.no-reduce-motion .loading-indicator__figure{animation:loader-figure 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1)}@keyframes spring-rotate-in{0%{transform:rotate(0deg)}30%{transform:rotate(-484.8deg)}60%{transform:rotate(-316.7deg)}90%{transform:rotate(-375deg)}100%{transform:rotate(-360deg)}}@keyframes spring-rotate-out{0%{transform:rotate(-360deg)}30%{transform:rotate(124.8deg)}60%{transform:rotate(-43.27deg)}90%{transform:rotate(15deg)}100%{transform:rotate(0deg)}}@keyframes loader-figure{0%{width:0;height:0;background-color:#3e5a7c}29%{background-color:#3e5a7c}30%{width:42px;height:42px;background-color:transparent;border-width:21px;opacity:1}100%{width:42px;height:42px;border-width:0;opacity:0;background-color:transparent}}@keyframes loader-label{0%{opacity:.25}30%{opacity:1}100%{opacity:.25}}.video-error-cover{align-items:center;background:#000;color:#fff;cursor:pointer;display:flex;flex-direction:column;height:100%;justify-content:center;margin-top:8px;position:relative;text-align:center;z-index:100}.media-spoiler{background:#000;color:#9baec8;border:0;padding:0;width:100%;height:100%;border-radius:4px;appearance:none}.media-spoiler:hover,.media-spoiler:active,.media-spoiler:focus{padding:0;color:#b5c3d6}.media-spoiler__warning{display:block;font-size:14px}.media-spoiler__trigger{display:block;font-size:11px;font-weight:700}.spoiler-button{top:0;left:0;width:100%;height:100%;position:absolute;z-index:100}.spoiler-button--minified{display:block;left:4px;top:4px;width:auto;height:auto}.spoiler-button--click-thru{pointer-events:none}.spoiler-button--hidden{display:none}.spoiler-button__overlay{display:block;background:transparent;width:100%;height:100%;border:0}.spoiler-button__overlay__label{display:inline-block;background:rgba(0,0,0,.5);border-radius:8px;padding:8px 12px;color:#fff;font-weight:500;font-size:14px}.spoiler-button__overlay:hover .spoiler-button__overlay__label,.spoiler-button__overlay:focus .spoiler-button__overlay__label,.spoiler-button__overlay:active .spoiler-button__overlay__label{background:rgba(0,0,0,.8)}.spoiler-button__overlay:disabled .spoiler-button__overlay__label{background:rgba(0,0,0,.5)}.modal-container--preloader{background:#202e3f}.account--panel{background:#192432;border-top:1px solid #202e3f;border-bottom:1px solid #202e3f;display:flex;flex-direction:row;padding:10px 0}.account--panel__button,.detailed-status__button{flex:1 1 auto;text-align:center}.column-settings__outer{background:#202e3f;padding:15px}.column-settings__section{color:#9baec8;cursor:default;display:block;font-weight:500;margin-bottom:10px}.column-settings__hashtags .column-settings__row{margin-bottom:15px}.column-settings__hashtags .column-select__control{outline:0;box-sizing:border-box;width:100%;border:0;box-shadow:none;font-family:inherit;background:#121a24;color:#9baec8;font-size:14px;margin:0}.column-settings__hashtags .column-select__control::placeholder{color:#a8b9cf}.column-settings__hashtags .column-select__control::-moz-focus-inner{border:0}.column-settings__hashtags .column-select__control::-moz-focus-inner,.column-settings__hashtags .column-select__control:focus,.column-settings__hashtags .column-select__control:active{outline:0 !important}.column-settings__hashtags .column-select__control:focus{background:#192432}@media screen and (max-width: 600px){.column-settings__hashtags .column-select__control{font-size:16px}}.column-settings__hashtags .column-select__placeholder{color:#404040;padding-left:2px;font-size:12px}.column-settings__hashtags .column-select__value-container{padding-left:6px}.column-settings__hashtags .column-select__multi-value{background:#202e3f}.column-settings__hashtags .column-select__multi-value__remove{cursor:pointer}.column-settings__hashtags .column-select__multi-value__remove:hover,.column-settings__hashtags .column-select__multi-value__remove:active,.column-settings__hashtags .column-select__multi-value__remove:focus{background:#26374d;color:#a8b9cf}.column-settings__hashtags .column-select__multi-value__label,.column-settings__hashtags .column-select__input{color:#9baec8}.column-settings__hashtags .column-select__clear-indicator,.column-settings__hashtags .column-select__dropdown-indicator{cursor:pointer;transition:none;color:#404040}.column-settings__hashtags .column-select__clear-indicator:hover,.column-settings__hashtags .column-select__clear-indicator:active,.column-settings__hashtags .column-select__clear-indicator:focus,.column-settings__hashtags .column-select__dropdown-indicator:hover,.column-settings__hashtags .column-select__dropdown-indicator:active,.column-settings__hashtags .column-select__dropdown-indicator:focus{color:#4a4a4a}.column-settings__hashtags .column-select__indicator-separator{background-color:#202e3f}.column-settings__hashtags .column-select__menu{background:#fff;border-radius:4px;padding:10px 14px;padding-bottom:14px;margin-top:10px;color:#9baec8;box-shadow:2px 4px 15px rgba(0,0,0,.4);padding:0;background:#d9e1e8}.column-settings__hashtags .column-select__menu h4{color:#9baec8;font-size:14px;font-weight:500;margin-bottom:10px}.column-settings__hashtags .column-select__menu li{padding:4px 0}.column-settings__hashtags .column-select__menu ul{margin-bottom:10px}.column-settings__hashtags .column-select__menu em{font-weight:500;color:#121a24}.column-settings__hashtags .column-select__menu-list{padding:6px}.column-settings__hashtags .column-select__option{color:#121a24;border-radius:4px;font-size:14px}.column-settings__hashtags .column-select__option--is-focused,.column-settings__hashtags .column-select__option--is-selected{background:#b9c8d5}.column-settings__row .text-btn{margin-bottom:15px}.relationship-tag{color:#fff;margin-bottom:4px;display:block;vertical-align:top;background-color:#000;font-size:12px;font-weight:500;padding:4px;border-radius:4px;opacity:.7}.relationship-tag:hover{opacity:1}.setting-toggle{display:block;line-height:24px}.setting-toggle__label{color:#9baec8;display:inline-block;margin-bottom:14px;margin-left:8px;vertical-align:middle}.empty-column-indicator,.error-column{color:#404040;background:#121a24;text-align:center;padding:20px;font-size:15px;font-weight:400;cursor:default;display:flex;flex:1 1 auto;align-items:center;justify-content:center}@supports(display: grid){.empty-column-indicator,.error-column{contain:strict}}.empty-column-indicator>span,.error-column>span{max-width:400px}.empty-column-indicator a,.error-column a{color:#00007f;text-decoration:none}.empty-column-indicator a:hover,.error-column a:hover{text-decoration:underline}.error-column{flex-direction:column}@keyframes heartbeat{from{transform:scale(1);animation-timing-function:ease-out}10%{transform:scale(0.91);animation-timing-function:ease-in}17%{transform:scale(0.98);animation-timing-function:ease-out}33%{transform:scale(0.87);animation-timing-function:ease-in}45%{transform:scale(1);animation-timing-function:ease-out}}.no-reduce-motion .pulse-loading{transform-origin:center center;animation:heartbeat 1.5s ease-in-out infinite both}@keyframes shake-bottom{0%,100%{transform:rotate(0deg);transform-origin:50% 100%}10%{transform:rotate(2deg)}20%,40%,60%{transform:rotate(-4deg)}30%,50%,70%{transform:rotate(4deg)}80%{transform:rotate(-2deg)}90%{transform:rotate(2deg)}}.no-reduce-motion .shake-bottom{transform-origin:50% 100%;animation:shake-bottom .8s cubic-bezier(0.455, 0.03, 0.515, 0.955) 2s 2 both}.emoji-picker-dropdown__menu{background:#fff;position:absolute;box-shadow:4px 4px 6px rgba(0,0,0,.4);border-radius:4px;margin-top:5px;z-index:2}.emoji-picker-dropdown__menu .emoji-mart-scroll{transition:opacity 200ms ease}.emoji-picker-dropdown__menu.selecting .emoji-mart-scroll{opacity:.5}.emoji-picker-dropdown__modifiers{position:absolute;top:60px;right:11px;cursor:pointer}.emoji-picker-dropdown__modifiers__menu{position:absolute;z-index:4;top:-4px;left:-8px;background:#fff;border-radius:4px;box-shadow:1px 2px 6px rgba(0,0,0,.2);overflow:hidden}.emoji-picker-dropdown__modifiers__menu button{display:block;cursor:pointer;border:0;padding:4px 8px;background:transparent}.emoji-picker-dropdown__modifiers__menu button:hover,.emoji-picker-dropdown__modifiers__menu button:focus,.emoji-picker-dropdown__modifiers__menu button:active{background:rgba(217,225,232,.4)}.emoji-picker-dropdown__modifiers__menu .emoji-mart-emoji{height:22px}.emoji-mart-emoji span{background-repeat:no-repeat}.upload-area{align-items:center;background:rgba(0,0,0,.8);display:flex;height:100%;justify-content:center;left:0;opacity:0;position:absolute;top:0;visibility:hidden;width:100%;z-index:2000}.upload-area *{pointer-events:none}.upload-area__drop{width:320px;height:160px;display:flex;box-sizing:border-box;position:relative;padding:8px}.upload-area__background{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;border-radius:4px;background:#121a24;box-shadow:0 0 5px rgba(0,0,0,.2)}.upload-area__content{flex:1;display:flex;align-items:center;justify-content:center;color:#d9e1e8;font-size:18px;font-weight:500;border:2px dashed #404040;border-radius:4px}.upload-progress{padding:10px;color:#404040;overflow:hidden;display:flex}.upload-progress .fa{font-size:34px;margin-right:10px}.upload-progress span{font-size:13px;font-weight:500;display:block}.upload-progess__message{flex:1 1 auto}.upload-progress__backdrop{width:100%;height:6px;border-radius:6px;background:#404040;position:relative;margin-top:5px}.upload-progress__tracker{position:absolute;left:0;top:0;height:6px;background:#00007f;border-radius:6px}.emoji-button{display:block;font-size:24px;line-height:24px;margin-left:2px;width:24px;outline:0;cursor:pointer}.emoji-button:active,.emoji-button:focus{outline:0 !important}.emoji-button img{filter:grayscale(100%);opacity:.8;display:block;margin:0;width:22px;height:22px;margin-top:2px}.emoji-button:hover img,.emoji-button:active img,.emoji-button:focus img{opacity:1;filter:none}.dropdown--active .emoji-button img{opacity:1;filter:none}.privacy-dropdown__dropdown{position:absolute;background:#fff;box-shadow:2px 4px 15px rgba(0,0,0,.4);border-radius:4px;margin-left:40px;overflow:hidden}.privacy-dropdown__dropdown.top{transform-origin:50% 100%}.privacy-dropdown__dropdown.bottom{transform-origin:50% 0}.privacy-dropdown__option{color:#121a24;padding:10px;cursor:pointer;display:flex}.privacy-dropdown__option:hover,.privacy-dropdown__option.active{background:#00007f;color:#fff;outline:0}.privacy-dropdown__option:hover .privacy-dropdown__option__content,.privacy-dropdown__option.active .privacy-dropdown__option__content{color:#fff}.privacy-dropdown__option:hover .privacy-dropdown__option__content strong,.privacy-dropdown__option.active .privacy-dropdown__option__content strong{color:#fff}.privacy-dropdown__option.active:hover{background:#000093}.privacy-dropdown__option__icon{display:flex;align-items:center;justify-content:center;margin-right:10px}.privacy-dropdown__option__content{flex:1 1 auto;color:#404040}.privacy-dropdown__option__content strong{font-weight:500;display:block;color:#121a24}.privacy-dropdown__option__content strong:lang(ja){font-weight:700}.privacy-dropdown__option__content strong:lang(ko){font-weight:700}.privacy-dropdown__option__content strong:lang(zh-CN){font-weight:700}.privacy-dropdown__option__content strong:lang(zh-HK){font-weight:700}.privacy-dropdown__option__content strong:lang(zh-TW){font-weight:700}.privacy-dropdown.active .privacy-dropdown__value{background:#fff;border-radius:4px 4px 0 0;box-shadow:0 -4px 4px rgba(0,0,0,.1)}.privacy-dropdown.active .privacy-dropdown__value .icon-button{transition:none}.privacy-dropdown.active .privacy-dropdown__value.active{background:#00007f}.privacy-dropdown.active .privacy-dropdown__value.active .icon-button{color:#fff}.privacy-dropdown.active.top .privacy-dropdown__value{border-radius:0 0 4px 4px}.privacy-dropdown.active .privacy-dropdown__dropdown{display:block;box-shadow:2px 4px 6px rgba(0,0,0,.1)}.search{position:relative}.search__input{outline:0;box-sizing:border-box;width:100%;border:0;box-shadow:none;font-family:inherit;background:#121a24;color:#9baec8;font-size:14px;margin:0;display:block;padding:15px;padding-right:30px;line-height:18px;font-size:16px}.search__input::placeholder{color:#a8b9cf}.search__input::-moz-focus-inner{border:0}.search__input::-moz-focus-inner,.search__input:focus,.search__input:active{outline:0 !important}.search__input:focus{background:#192432}@media screen and (max-width: 600px){.search__input{font-size:16px}}.search__icon::-moz-focus-inner{border:0}.search__icon::-moz-focus-inner,.search__icon:focus{outline:0 !important}.search__icon .fa{position:absolute;top:16px;right:10px;z-index:2;display:inline-block;opacity:0;transition:all 100ms linear;transition-property:transform,opacity;font-size:18px;width:18px;height:18px;color:#d9e1e8;cursor:default;pointer-events:none}.search__icon .fa.active{pointer-events:auto;opacity:.3}.search__icon .fa-search{transform:rotate(90deg)}.search__icon .fa-search.active{pointer-events:none;transform:rotate(0deg)}.search__icon .fa-times-circle{top:17px;transform:rotate(0deg);color:#404040;cursor:pointer}.search__icon .fa-times-circle.active{transform:rotate(90deg)}.search__icon .fa-times-circle:hover{color:#525252}.search-results__header{color:#404040;background:#151f2b;padding:15px;font-weight:500;font-size:16px;cursor:default}.search-results__header .fa{display:inline-block;margin-right:5px}.search-results__section{margin-bottom:5px}.search-results__section h5{background:#0b1016;border-bottom:1px solid #202e3f;cursor:default;display:flex;padding:15px;font-weight:500;font-size:16px;color:#404040}.search-results__section h5 .fa{display:inline-block;margin-right:5px}.search-results__section .account:last-child,.search-results__section>div:last-child .status{border-bottom:0}.search-results__hashtag{display:block;padding:10px;color:#d9e1e8;text-decoration:none}.search-results__hashtag:hover,.search-results__hashtag:active,.search-results__hashtag:focus{color:#e6ebf0;text-decoration:underline}.search-results__info{padding:20px;color:#9baec8;text-align:center}.modal-root{position:relative;transition:opacity .3s linear;will-change:opacity;z-index:9999}.modal-root__overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.7)}.modal-root__container{position:fixed;top:0;left:0;width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;align-content:space-around;z-index:9999;pointer-events:none;user-select:none}.modal-root__modal{pointer-events:auto;display:flex;z-index:9999}.video-modal__container{max-width:100vw;max-height:100vh}.audio-modal__container{width:50vw}.media-modal{width:100%;height:100%;position:relative}.media-modal .extended-video-player{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.media-modal .extended-video-player video{max-width:100%;max-height:80%}.media-modal__closer{position:absolute;top:0;left:0;right:0;bottom:0}.media-modal__navigation{position:absolute;top:0;left:0;right:0;bottom:0;pointer-events:none;transition:opacity .3s linear;will-change:opacity}.media-modal__navigation *{pointer-events:auto}.media-modal__navigation.media-modal__navigation--hidden{opacity:0}.media-modal__navigation.media-modal__navigation--hidden *{pointer-events:none}.media-modal__nav{background:rgba(0,0,0,.5);box-sizing:border-box;border:0;color:#fff;cursor:pointer;display:flex;align-items:center;font-size:24px;height:20vmax;margin:auto 0;padding:30px 15px;position:absolute;top:0;bottom:0}.media-modal__nav--left{left:0}.media-modal__nav--right{right:0}.media-modal__pagination{width:100%;text-align:center;position:absolute;left:0;bottom:20px;pointer-events:none}.media-modal__meta{text-align:center;position:absolute;left:0;bottom:20px;width:100%;pointer-events:none}.media-modal__meta--shifted{bottom:62px}.media-modal__meta a{pointer-events:auto;text-decoration:none;font-weight:500;color:#d9e1e8}.media-modal__meta a:hover,.media-modal__meta a:focus,.media-modal__meta a:active{text-decoration:underline}.media-modal__page-dot{display:inline-block}.media-modal__button{background-color:#fff;height:12px;width:12px;border-radius:6px;margin:10px;padding:0;border:0;font-size:0}.media-modal__button--active{background-color:#00007f}.media-modal__close{position:absolute;right:8px;top:8px;z-index:100}.onboarding-modal,.error-modal,.embed-modal{background:#d9e1e8;color:#121a24;border-radius:8px;overflow:hidden;display:flex;flex-direction:column}.error-modal__body{height:80vh;width:80vw;max-width:520px;max-height:420px;position:relative}.error-modal__body>div{position:absolute;top:0;left:0;width:100%;height:100%;box-sizing:border-box;padding:25px;display:none;flex-direction:column;align-items:center;justify-content:center;display:flex;opacity:0;user-select:text}.error-modal__body{display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center}.onboarding-modal__paginator,.error-modal__footer{flex:0 0 auto;background:#c0cdd9;display:flex;padding:25px}.onboarding-modal__paginator>div,.error-modal__footer>div{min-width:33px}.onboarding-modal__paginator .onboarding-modal__nav,.onboarding-modal__paginator .error-modal__nav,.error-modal__footer .onboarding-modal__nav,.error-modal__footer .error-modal__nav{color:#404040;border:0;font-size:14px;font-weight:500;padding:10px 25px;line-height:inherit;height:auto;margin:-10px;border-radius:4px;background-color:transparent}.onboarding-modal__paginator .onboarding-modal__nav:hover,.onboarding-modal__paginator .onboarding-modal__nav:focus,.onboarding-modal__paginator .onboarding-modal__nav:active,.onboarding-modal__paginator .error-modal__nav:hover,.onboarding-modal__paginator .error-modal__nav:focus,.onboarding-modal__paginator .error-modal__nav:active,.error-modal__footer .onboarding-modal__nav:hover,.error-modal__footer .onboarding-modal__nav:focus,.error-modal__footer .onboarding-modal__nav:active,.error-modal__footer .error-modal__nav:hover,.error-modal__footer .error-modal__nav:focus,.error-modal__footer .error-modal__nav:active{color:#363636;background-color:#a6b9c9}.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next,.error-modal__footer .error-modal__nav.onboarding-modal__done,.error-modal__footer .error-modal__nav.onboarding-modal__next{color:#121a24}.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:hover,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:focus,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:active,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:hover,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:focus,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:active,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:hover,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:focus,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:active,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:hover,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:focus,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:active,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:hover,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:focus,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:active,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:hover,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:focus,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:active,.error-modal__footer .error-modal__nav.onboarding-modal__done:hover,.error-modal__footer .error-modal__nav.onboarding-modal__done:focus,.error-modal__footer .error-modal__nav.onboarding-modal__done:active,.error-modal__footer .error-modal__nav.onboarding-modal__next:hover,.error-modal__footer .error-modal__nav.onboarding-modal__next:focus,.error-modal__footer .error-modal__nav.onboarding-modal__next:active{color:#192432}.error-modal__footer{justify-content:center}.display-case{text-align:center;font-size:15px;margin-bottom:15px}.display-case__label{font-weight:500;color:#121a24;margin-bottom:5px;font-size:13px}.display-case__case{background:#121a24;color:#d9e1e8;font-weight:500;padding:10px;border-radius:4px}.onboard-sliders{display:inline-block;max-width:30px;max-height:auto;margin-left:10px}.boost-modal,.confirmation-modal,.report-modal,.actions-modal,.mute-modal,.block-modal{background:#f2f5f7;color:#121a24;border-radius:8px;overflow:hidden;max-width:90vw;width:480px;position:relative;flex-direction:column}.boost-modal .status__display-name,.confirmation-modal .status__display-name,.report-modal .status__display-name,.actions-modal .status__display-name,.mute-modal .status__display-name,.block-modal .status__display-name{display:block;max-width:100%;padding-right:25px}.boost-modal .status__avatar,.confirmation-modal .status__avatar,.report-modal .status__avatar,.actions-modal .status__avatar,.mute-modal .status__avatar,.block-modal .status__avatar{height:28px;left:10px;position:absolute;top:10px;width:48px}.boost-modal .status__content__spoiler-link,.confirmation-modal .status__content__spoiler-link,.report-modal .status__content__spoiler-link,.actions-modal .status__content__spoiler-link,.mute-modal .status__content__spoiler-link,.block-modal .status__content__spoiler-link{color:#f2f5f7}.actions-modal .status{background:#fff;border-bottom-color:#d9e1e8;padding-top:10px;padding-bottom:10px}.actions-modal .dropdown-menu__separator{border-bottom-color:#d9e1e8}.boost-modal__container{overflow-x:scroll;padding:10px}.boost-modal__container .status{user-select:text;border-bottom:0}.boost-modal__action-bar,.confirmation-modal__action-bar,.mute-modal__action-bar,.block-modal__action-bar{display:flex;justify-content:space-between;background:#d9e1e8;padding:10px;line-height:36px}.boost-modal__action-bar>div,.confirmation-modal__action-bar>div,.mute-modal__action-bar>div,.block-modal__action-bar>div{flex:1 1 auto;text-align:right;color:#404040;padding-right:10px}.boost-modal__action-bar .button,.confirmation-modal__action-bar .button,.mute-modal__action-bar .button,.block-modal__action-bar .button{flex:0 0 auto}.boost-modal__status-header{font-size:15px}.boost-modal__status-time{float:right;font-size:14px}.mute-modal,.block-modal{line-height:24px}.mute-modal .react-toggle,.block-modal .react-toggle{vertical-align:middle}.report-modal{width:90vw;max-width:700px}.report-modal__container{display:flex;border-top:1px solid #d9e1e8}@media screen and (max-width: 480px){.report-modal__container{flex-wrap:wrap;overflow-y:auto}}.report-modal__statuses,.report-modal__comment{box-sizing:border-box;width:50%}@media screen and (max-width: 480px){.report-modal__statuses,.report-modal__comment{width:100%}}.report-modal__statuses,.focal-point-modal__content{flex:1 1 auto;min-height:20vh;max-height:80vh;overflow-y:auto;overflow-x:hidden}.report-modal__statuses .status__content a,.focal-point-modal__content .status__content a{color:#00007f}.report-modal__statuses .status__content,.report-modal__statuses .status__content p,.focal-point-modal__content .status__content,.focal-point-modal__content .status__content p{color:#121a24}@media screen and (max-width: 480px){.report-modal__statuses,.focal-point-modal__content{max-height:10vh}}@media screen and (max-width: 480px){.focal-point-modal__content{max-height:40vh}}.report-modal__comment{padding:20px;border-right:1px solid #d9e1e8;max-width:320px}.report-modal__comment p{font-size:14px;line-height:20px;margin-bottom:20px}.report-modal__comment .setting-text{display:block;box-sizing:border-box;width:100%;margin:0;color:#121a24;background:#fff;padding:10px;font-family:inherit;font-size:14px;resize:none;border:0;outline:0;border-radius:4px;border:1px solid #d9e1e8;min-height:100px;max-height:50vh;margin-bottom:10px}.report-modal__comment .setting-text:focus{border:1px solid #c0cdd9}.report-modal__comment .setting-text__wrapper{background:#fff;border:1px solid #d9e1e8;margin-bottom:10px;border-radius:4px}.report-modal__comment .setting-text__wrapper .setting-text{border:0;margin-bottom:0;border-radius:0}.report-modal__comment .setting-text__wrapper .setting-text:focus{border:0}.report-modal__comment .setting-text__wrapper__modifiers{color:#121a24;font-family:inherit;font-size:14px;background:#fff}.report-modal__comment .setting-text__toolbar{display:flex;justify-content:space-between;margin-bottom:20px}.report-modal__comment .setting-text-label{display:block;color:#121a24;font-size:14px;font-weight:500;margin-bottom:10px}.report-modal__comment .setting-toggle{margin-top:20px;margin-bottom:24px}.report-modal__comment .setting-toggle__label{color:#121a24;font-size:14px}@media screen and (max-width: 480px){.report-modal__comment{padding:10px;max-width:100%;order:2}.report-modal__comment .setting-toggle{margin-bottom:4px}}.actions-modal{max-height:80vh;max-width:80vw}.actions-modal .status{overflow-y:auto;max-height:300px}.actions-modal .actions-modal__item-label{font-weight:500}.actions-modal ul{overflow-y:auto;flex-shrink:0;max-height:80vh}.actions-modal ul.with-status{max-height:calc(80vh - 75px)}.actions-modal ul li:empty{margin:0}.actions-modal ul li:not(:empty) a{color:#121a24;display:flex;padding:12px 16px;font-size:15px;align-items:center;text-decoration:none}.actions-modal ul li:not(:empty) a,.actions-modal ul li:not(:empty) a button{transition:none}.actions-modal ul li:not(:empty) a.active,.actions-modal ul li:not(:empty) a.active button,.actions-modal ul li:not(:empty) a:hover,.actions-modal ul li:not(:empty) a:hover button,.actions-modal ul li:not(:empty) a:active,.actions-modal ul li:not(:empty) a:active button,.actions-modal ul li:not(:empty) a:focus,.actions-modal ul li:not(:empty) a:focus button{background:#00007f;color:#fff}.actions-modal ul li:not(:empty) a button:first-child{margin-right:10px}.confirmation-modal__action-bar .confirmation-modal__secondary-button,.mute-modal__action-bar .confirmation-modal__secondary-button,.block-modal__action-bar .confirmation-modal__secondary-button{flex-shrink:1}.confirmation-modal__secondary-button,.confirmation-modal__cancel-button,.mute-modal__cancel-button,.block-modal__cancel-button{background-color:transparent;color:#404040;font-size:14px;font-weight:500}.confirmation-modal__secondary-button:hover,.confirmation-modal__secondary-button:focus,.confirmation-modal__secondary-button:active,.confirmation-modal__cancel-button:hover,.confirmation-modal__cancel-button:focus,.confirmation-modal__cancel-button:active,.mute-modal__cancel-button:hover,.mute-modal__cancel-button:focus,.mute-modal__cancel-button:active,.block-modal__cancel-button:hover,.block-modal__cancel-button:focus,.block-modal__cancel-button:active{color:#363636;background-color:transparent}.confirmation-modal__container,.mute-modal__container,.block-modal__container,.report-modal__target{padding:30px;font-size:16px}.confirmation-modal__container strong,.mute-modal__container strong,.block-modal__container strong,.report-modal__target strong{font-weight:500}.confirmation-modal__container strong:lang(ja),.mute-modal__container strong:lang(ja),.block-modal__container strong:lang(ja),.report-modal__target strong:lang(ja){font-weight:700}.confirmation-modal__container strong:lang(ko),.mute-modal__container strong:lang(ko),.block-modal__container strong:lang(ko),.report-modal__target strong:lang(ko){font-weight:700}.confirmation-modal__container strong:lang(zh-CN),.mute-modal__container strong:lang(zh-CN),.block-modal__container strong:lang(zh-CN),.report-modal__target strong:lang(zh-CN){font-weight:700}.confirmation-modal__container strong:lang(zh-HK),.mute-modal__container strong:lang(zh-HK),.block-modal__container strong:lang(zh-HK),.report-modal__target strong:lang(zh-HK){font-weight:700}.confirmation-modal__container strong:lang(zh-TW),.mute-modal__container strong:lang(zh-TW),.block-modal__container strong:lang(zh-TW),.report-modal__target strong:lang(zh-TW){font-weight:700}.confirmation-modal__container,.report-modal__target{text-align:center}.block-modal__explanation,.mute-modal__explanation{margin-top:20px}.block-modal .setting-toggle,.mute-modal .setting-toggle{margin-top:20px;margin-bottom:24px;display:flex;align-items:center}.block-modal .setting-toggle__label,.mute-modal .setting-toggle__label{color:#121a24;margin:0;margin-left:8px}.report-modal__target{padding:15px}.report-modal__target .media-modal__close{top:14px;right:15px}.loading-bar{background-color:#00007f;height:3px;position:absolute;top:0;left:0;z-index:9999}.media-gallery__gifv__label{display:block;position:absolute;color:#fff;background:rgba(0,0,0,.5);bottom:6px;left:6px;padding:2px 6px;border-radius:2px;font-size:11px;font-weight:600;z-index:1;pointer-events:none;opacity:.9;transition:opacity .1s ease;line-height:18px}.media-gallery__gifv.autoplay .media-gallery__gifv__label{display:none}.media-gallery__gifv:hover .media-gallery__gifv__label{opacity:1}.media-gallery__audio{margin-top:32px}.media-gallery__audio audio{width:100%}.attachment-list{display:flex;font-size:14px;border:1px solid #202e3f;border-radius:4px;margin-top:14px;overflow:hidden}.attachment-list__icon{flex:0 0 auto;color:#404040;padding:8px 18px;cursor:default;border-right:1px solid #202e3f;display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:26px}.attachment-list__icon .fa{display:block}.attachment-list__list{list-style:none;padding:4px 0;padding-left:8px;display:flex;flex-direction:column;justify-content:center}.attachment-list__list li{display:block;padding:4px 0}.attachment-list__list a{text-decoration:none;color:#404040;font-weight:500}.attachment-list__list a:hover{text-decoration:underline}.attachment-list.compact{border:0;margin-top:4px}.attachment-list.compact .attachment-list__list{padding:0;display:block}.attachment-list.compact .fa{color:#404040}.media-gallery{box-sizing:border-box;margin-top:8px;overflow:hidden;border-radius:4px;position:relative;width:100%}.media-gallery__item{border:0;box-sizing:border-box;display:block;float:left;position:relative;border-radius:4px;overflow:hidden}.media-gallery__item.standalone .media-gallery__item-gifv-thumbnail{transform:none;top:0}.media-gallery__item-thumbnail{cursor:zoom-in;display:block;text-decoration:none;color:#d9e1e8;position:relative;z-index:1}.media-gallery__item-thumbnail,.media-gallery__item-thumbnail img{height:100%;width:100%}.media-gallery__item-thumbnail img{object-fit:cover}.media-gallery__preview{width:100%;height:100%;object-fit:cover;position:absolute;top:0;left:0;z-index:0;background:#000}.media-gallery__preview--hidden{display:none}.media-gallery__gifv{height:100%;overflow:hidden;position:relative;width:100%}.media-gallery__item-gifv-thumbnail{cursor:zoom-in;height:100%;object-fit:cover;position:relative;top:50%;transform:translateY(-50%);width:100%;z-index:1}.media-gallery__item-thumbnail-label{clip:rect(1px 1px 1px 1px);clip:rect(1px, 1px, 1px, 1px);overflow:hidden;position:absolute}.detailed .video-player__volume__current,.detailed .video-player__volume::before,.fullscreen .video-player__volume__current,.fullscreen .video-player__volume::before{bottom:27px}.detailed .video-player__volume__handle,.fullscreen .video-player__volume__handle{bottom:23px}.audio-player{box-sizing:border-box;position:relative;background:#040609;border-radius:4px;padding-bottom:44px;direction:ltr}.audio-player.editable{border-radius:0;height:100%}.audio-player__waveform{padding:15px 0;position:relative;overflow:hidden}.audio-player__waveform::before{content:\"\";display:block;position:absolute;border-top:1px solid #192432;width:100%;height:0;left:0;top:calc(50% + 1px)}.audio-player__progress-placeholder{background-color:rgba(0,0,168,.5)}.audio-player__wave-placeholder{background-color:#2d415a}.audio-player .video-player__controls{padding:0 15px;padding-top:10px;background:#040609;border-top:1px solid #192432;border-radius:0 0 4px 4px}.video-player{overflow:hidden;position:relative;background:#000;max-width:100%;border-radius:4px;box-sizing:border-box;direction:ltr}.video-player.editable{border-radius:0;height:100% !important}.video-player:focus{outline:0}.video-player video{max-width:100vw;max-height:80vh;z-index:1}.video-player.fullscreen{width:100% !important;height:100% !important;margin:0}.video-player.fullscreen video{max-width:100% !important;max-height:100% !important;width:100% !important;height:100% !important;outline:0}.video-player.inline video{object-fit:contain;position:relative;top:50%;transform:translateY(-50%)}.video-player__controls{position:absolute;z-index:2;bottom:0;left:0;right:0;box-sizing:border-box;background:linear-gradient(0deg, rgba(0, 0, 0, 0.85) 0, rgba(0, 0, 0, 0.45) 60%, transparent);padding:0 15px;opacity:0;transition:opacity .1s ease}.video-player__controls.active{opacity:1}.video-player.inactive video,.video-player.inactive .video-player__controls{visibility:hidden}.video-player__spoiler{display:none;position:absolute;top:0;left:0;width:100%;height:100%;z-index:4;border:0;background:#000;color:#9baec8;transition:none;pointer-events:none}.video-player__spoiler.active{display:block;pointer-events:auto}.video-player__spoiler.active:hover,.video-player__spoiler.active:active,.video-player__spoiler.active:focus{color:#b2c1d5}.video-player__spoiler__title{display:block;font-size:14px}.video-player__spoiler__subtitle{display:block;font-size:11px;font-weight:500}.video-player__buttons-bar{display:flex;justify-content:space-between;padding-bottom:10px}.video-player__buttons-bar .video-player__download__icon{color:inherit}.video-player__buttons{font-size:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.video-player__buttons.left button{padding-left:0}.video-player__buttons.right button{padding-right:0}.video-player__buttons button{background:transparent;padding:2px 10px;font-size:16px;border:0;color:rgba(255,255,255,.75)}.video-player__buttons button:active,.video-player__buttons button:hover,.video-player__buttons button:focus{color:#fff}.video-player__time-sep,.video-player__time-total,.video-player__time-current{font-size:14px;font-weight:500}.video-player__time-current{color:#fff;margin-left:60px}.video-player__time-sep{display:inline-block;margin:0 6px}.video-player__time-sep,.video-player__time-total{color:#fff}.video-player__volume{cursor:pointer;height:24px;display:inline}.video-player__volume::before{content:\"\";width:50px;background:rgba(255,255,255,.35);border-radius:4px;display:block;position:absolute;height:4px;left:70px;bottom:20px}.video-player__volume__current{display:block;position:absolute;height:4px;border-radius:4px;left:70px;bottom:20px;background:#0000a8}.video-player__volume__handle{position:absolute;z-index:3;border-radius:50%;width:12px;height:12px;bottom:16px;left:70px;transition:opacity .1s ease;background:#0000a8;box-shadow:1px 2px 6px rgba(0,0,0,.2);pointer-events:none}.video-player__link{padding:2px 10px}.video-player__link a{text-decoration:none;font-size:14px;font-weight:500;color:#fff}.video-player__link a:hover,.video-player__link a:active,.video-player__link a:focus{text-decoration:underline}.video-player__seek{cursor:pointer;height:24px;position:relative}.video-player__seek::before{content:\"\";width:100%;background:rgba(255,255,255,.35);border-radius:4px;display:block;position:absolute;height:4px;top:10px}.video-player__seek__progress,.video-player__seek__buffer{display:block;position:absolute;height:4px;border-radius:4px;top:10px;background:#0000a8}.video-player__seek__buffer{background:rgba(255,255,255,.2)}.video-player__seek__handle{position:absolute;z-index:3;opacity:0;border-radius:50%;width:12px;height:12px;top:6px;margin-left:-6px;transition:opacity .1s ease;background:#0000a8;box-shadow:1px 2px 6px rgba(0,0,0,.2);pointer-events:none}.video-player__seek__handle.active{opacity:1}.video-player__seek:hover .video-player__seek__handle{opacity:1}.video-player.detailed .video-player__buttons button,.video-player.fullscreen .video-player__buttons button{padding-top:10px;padding-bottom:10px}.directory__list{width:100%;margin:10px 0;transition:opacity 100ms ease-in}.directory__list.loading{opacity:.7}@media screen and (max-width: 415px){.directory__list{margin:0}}.directory__card{box-sizing:border-box;margin-bottom:10px}.directory__card__img{height:125px;position:relative;background:#000;overflow:hidden}.directory__card__img img{display:block;width:100%;height:100%;margin:0;object-fit:cover}.directory__card__bar{display:flex;align-items:center;background:#192432;padding:10px}.directory__card__bar__name{flex:1 1 auto;display:flex;align-items:center;text-decoration:none;overflow:hidden}.directory__card__bar__relationship{width:23px;min-height:1px;flex:0 0 auto}.directory__card__bar .avatar{flex:0 0 auto;width:48px;height:48px;padding-top:2px}.directory__card__bar .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px;background:#040609;object-fit:cover}.directory__card__bar .display-name{margin-left:15px;text-align:left}.directory__card__bar .display-name strong{font-size:15px;color:#fff;font-weight:500;overflow:hidden;text-overflow:ellipsis}.directory__card__bar .display-name span{display:block;font-size:14px;color:#9baec8;font-weight:400;overflow:hidden;text-overflow:ellipsis}.directory__card__extra{background:#121a24;display:flex;align-items:center;justify-content:center}.directory__card__extra .accounts-table__count{width:33.33%;flex:0 0 auto;padding:15px 0}.directory__card__extra .account__header__content{box-sizing:border-box;padding:15px 10px;border-bottom:1px solid #202e3f;width:100%;min-height:48px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.directory__card__extra .account__header__content p{display:none}.directory__card__extra .account__header__content p:first-child{display:inline}.directory__card__extra .account__header__content br{display:none}.account-gallery__container{display:flex;flex-wrap:wrap;padding:4px 2px}.account-gallery__item{border:0;box-sizing:border-box;display:block;position:relative;border-radius:4px;overflow:hidden;margin:2px}.account-gallery__item__icons{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);font-size:24px}.notification__filter-bar,.account__section-headline{background:#0b1016;border-bottom:1px solid #202e3f;cursor:default;display:flex;flex-shrink:0}.notification__filter-bar button,.account__section-headline button{background:#0b1016;border:0;margin:0}.notification__filter-bar button,.notification__filter-bar a,.account__section-headline button,.account__section-headline a{display:block;flex:1 1 auto;color:#9baec8;padding:15px 0;font-size:14px;font-weight:500;text-align:center;text-decoration:none;position:relative}.notification__filter-bar button.active,.notification__filter-bar a.active,.account__section-headline button.active,.account__section-headline a.active{color:#d9e1e8}.notification__filter-bar button.active::before,.notification__filter-bar button.active::after,.notification__filter-bar a.active::before,.notification__filter-bar a.active::after,.account__section-headline button.active::before,.account__section-headline button.active::after,.account__section-headline a.active::before,.account__section-headline a.active::after{display:block;content:\"\";position:absolute;bottom:0;left:50%;width:0;height:0;transform:translateX(-50%);border-style:solid;border-width:0 10px 10px;border-color:transparent transparent #202e3f}.notification__filter-bar button.active::after,.notification__filter-bar a.active::after,.account__section-headline button.active::after,.account__section-headline a.active::after{bottom:-1px;border-color:transparent transparent #121a24}.notification__filter-bar.directory__section-headline,.account__section-headline.directory__section-headline{background:#0f151d;border-bottom-color:transparent}.notification__filter-bar.directory__section-headline a.active::before,.notification__filter-bar.directory__section-headline button.active::before,.account__section-headline.directory__section-headline a.active::before,.account__section-headline.directory__section-headline button.active::before{display:none}.notification__filter-bar.directory__section-headline a.active::after,.notification__filter-bar.directory__section-headline button.active::after,.account__section-headline.directory__section-headline a.active::after,.account__section-headline.directory__section-headline button.active::after{border-color:transparent transparent #06090c}.filter-form{background:#121a24}.filter-form__column{padding:10px 15px}.filter-form .radio-button{display:block}.radio-button{font-size:14px;position:relative;display:inline-block;padding:6px 0;line-height:18px;cursor:default;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer}.radio-button input[type=radio],.radio-button input[type=checkbox]{display:none}.radio-button__input{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:50%;vertical-align:middle}.radio-button__input.checked{border-color:#0000a8;background:#0000a8}::-webkit-scrollbar-thumb{border-radius:0}.search-popout{background:#fff;border-radius:4px;padding:10px 14px;padding-bottom:14px;margin-top:10px;color:#9baec8;box-shadow:2px 4px 15px rgba(0,0,0,.4)}.search-popout h4{color:#9baec8;font-size:14px;font-weight:500;margin-bottom:10px}.search-popout li{padding:4px 0}.search-popout ul{margin-bottom:10px}.search-popout em{font-weight:500;color:#121a24}noscript{text-align:center}noscript img{width:200px;opacity:.5;animation:flicker 4s infinite}noscript div{font-size:14px;margin:30px auto;color:#d9e1e8;max-width:400px}noscript div a{color:#00007f;text-decoration:underline}noscript div a:hover{text-decoration:none}@keyframes flicker{0%{opacity:1}30%{opacity:.75}100%{opacity:1}}@media screen and (max-width: 630px)and (max-height: 400px){.tabs-bar,.search{will-change:margin-top;transition:margin-top 400ms 100ms}.navigation-bar{will-change:padding-bottom;transition:padding-bottom 400ms 100ms}.navigation-bar>a:first-child{will-change:margin-top,margin-left,margin-right,width;transition:margin-top 400ms 100ms,margin-left 400ms 500ms,margin-right 400ms 500ms}.navigation-bar>.navigation-bar__profile-edit{will-change:margin-top;transition:margin-top 400ms 100ms}.navigation-bar .navigation-bar__actions>.icon-button.close{will-change:opacity transform;transition:opacity 200ms 100ms,transform 400ms 100ms}.navigation-bar .navigation-bar__actions>.compose__action-bar .icon-button{will-change:opacity transform;transition:opacity 200ms 300ms,transform 400ms 100ms}.is-composing .tabs-bar,.is-composing .search{margin-top:-50px}.is-composing .navigation-bar{padding-bottom:0}.is-composing .navigation-bar>a:first-child{margin:-100px 10px 0 -50px}.is-composing .navigation-bar .navigation-bar__profile{padding-top:2px}.is-composing .navigation-bar .navigation-bar__profile-edit{position:absolute;margin-top:-60px}.is-composing .navigation-bar .navigation-bar__actions .icon-button.close{pointer-events:auto;opacity:1;transform:scale(1, 1) translate(0, 0);bottom:5px}.is-composing .navigation-bar .navigation-bar__actions .compose__action-bar .icon-button{pointer-events:none;opacity:0;transform:scale(0, 1) translate(100%, 0)}}.embed-modal{width:auto;max-width:80vw;max-height:80vh}.embed-modal h4{padding:30px;font-weight:500;font-size:16px;text-align:center}.embed-modal .embed-modal__container{padding:10px}.embed-modal .embed-modal__container .hint{margin-bottom:15px}.embed-modal .embed-modal__container .embed-modal__html{outline:0;box-sizing:border-box;display:block;width:100%;border:0;padding:10px;font-family:\"mastodon-font-monospace\",monospace;background:#121a24;color:#fff;font-size:14px;margin:0;margin-bottom:15px;border-radius:4px}.embed-modal .embed-modal__container .embed-modal__html::-moz-focus-inner{border:0}.embed-modal .embed-modal__container .embed-modal__html::-moz-focus-inner,.embed-modal .embed-modal__container .embed-modal__html:focus,.embed-modal .embed-modal__container .embed-modal__html:active{outline:0 !important}.embed-modal .embed-modal__container .embed-modal__html:focus{background:#192432}@media screen and (max-width: 600px){.embed-modal .embed-modal__container .embed-modal__html{font-size:16px}}.embed-modal .embed-modal__container .embed-modal__iframe{width:400px;max-width:100%;overflow:hidden;border:0;border-radius:4px}.account__moved-note{padding:14px 10px;padding-bottom:16px;background:#192432;border-top:1px solid #202e3f;border-bottom:1px solid #202e3f}.account__moved-note__message{position:relative;margin-left:58px;color:#404040;padding:8px 0;padding-top:0;padding-bottom:4px;font-size:14px}.account__moved-note__message>span{display:block;overflow:hidden;text-overflow:ellipsis}.account__moved-note__icon-wrapper{left:-26px;position:absolute}.account__moved-note .detailed-status__display-avatar{position:relative}.account__moved-note .detailed-status__display-name{margin-bottom:0}.column-inline-form{padding:15px;padding-right:0;display:flex;justify-content:flex-start;align-items:center;background:#192432}.column-inline-form label{flex:1 1 auto}.column-inline-form label input{width:100%}.column-inline-form label input:focus{outline:0}.column-inline-form .icon-button{flex:0 0 auto;margin:0 10px}.drawer__backdrop{cursor:pointer;position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5)}.list-editor{background:#121a24;flex-direction:column;border-radius:8px;box-shadow:2px 4px 15px rgba(0,0,0,.4);width:380px;overflow:hidden}@media screen and (max-width: 420px){.list-editor{width:90%}}.list-editor h4{padding:15px 0;background:#283a50;font-weight:500;font-size:16px;text-align:center;border-radius:8px 8px 0 0}.list-editor .drawer__pager{height:50vh}.list-editor .drawer__inner{border-radius:0 0 8px 8px}.list-editor .drawer__inner.backdrop{width:calc(100% - 60px);box-shadow:2px 4px 15px rgba(0,0,0,.4);border-radius:0 0 0 8px}.list-editor__accounts{overflow-y:auto}.list-editor .account__display-name:hover strong{text-decoration:none}.list-editor .account__avatar{cursor:default}.list-editor .search{margin-bottom:0}.list-adder{background:#121a24;flex-direction:column;border-radius:8px;box-shadow:2px 4px 15px rgba(0,0,0,.4);width:380px;overflow:hidden}@media screen and (max-width: 420px){.list-adder{width:90%}}.list-adder__account{background:#283a50}.list-adder__lists{background:#283a50;height:50vh;border-radius:0 0 8px 8px;overflow-y:auto}.list-adder .list{padding:10px;border-bottom:1px solid #202e3f}.list-adder .list__wrapper{display:flex}.list-adder .list__display-name{flex:1 1 auto;overflow:hidden;text-decoration:none;font-size:16px;padding:10px}.focal-point{position:relative;cursor:move;overflow:hidden;height:100%;display:flex;justify-content:center;align-items:center;background:#000}.focal-point img,.focal-point video,.focal-point canvas{display:block;max-height:80vh;width:100%;height:auto;margin:0;object-fit:contain;background:#000}.focal-point__reticle{position:absolute;width:100px;height:100px;transform:translate(-50%, -50%);background:url(\"~images/reticle.png\") no-repeat 0 0;border-radius:50%;box-shadow:0 0 0 9999em rgba(0,0,0,.35)}.focal-point__overlay{position:absolute;width:100%;height:100%;top:0;left:0}.focal-point__preview{position:absolute;bottom:10px;right:10px;z-index:2;cursor:move;transition:opacity .1s ease}.focal-point__preview:hover{opacity:.5}.focal-point__preview strong{color:#fff;font-size:14px;font-weight:500;display:block;margin-bottom:5px}.focal-point__preview div{border-radius:4px;box-shadow:0 0 14px rgba(0,0,0,.2)}@media screen and (max-width: 480px){.focal-point img,.focal-point video{max-height:100%}.focal-point__preview{display:none}}.account__header__content{color:#9baec8;font-size:14px;font-weight:400;overflow:hidden;word-break:normal;word-wrap:break-word}.account__header__content p{margin-bottom:20px}.account__header__content p:last-child{margin-bottom:0}.account__header__content a{color:inherit;text-decoration:underline}.account__header__content a:hover{text-decoration:none}.account__header{overflow:hidden}.account__header.inactive{opacity:.5}.account__header.inactive .account__header__image,.account__header.inactive .account__avatar{filter:grayscale(100%)}.account__header__info{position:absolute;top:10px;left:10px}.account__header__image{overflow:hidden;height:145px;position:relative;background:#0b1016}.account__header__image img{object-fit:cover;display:block;width:100%;height:100%;margin:0}.account__header__bar{position:relative;background:#192432;padding:5px;border-bottom:1px solid #26374d}.account__header__bar .avatar{display:block;flex:0 0 auto;width:94px;margin-left:-2px}.account__header__bar .avatar .account__avatar{background:#040609;border:2px solid #192432}.account__header__tabs{display:flex;align-items:flex-start;padding:7px 5px;margin-top:-55px}.account__header__tabs__buttons{display:flex;align-items:center;padding-top:55px;overflow:hidden}.account__header__tabs__buttons .icon-button{border:1px solid #26374d;border-radius:4px;box-sizing:content-box;padding:2px}.account__header__tabs__buttons .button{margin:0 8px}.account__header__tabs__name{padding:5px}.account__header__tabs__name .account-role{vertical-align:top}.account__header__tabs__name .emojione{width:22px;height:22px}.account__header__tabs__name h1{font-size:16px;line-height:24px;color:#fff;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.account__header__tabs__name h1 small{display:block;font-size:14px;color:#9baec8;font-weight:400;overflow:hidden;text-overflow:ellipsis}.account__header__tabs .spacer{flex:1 1 auto}.account__header__bio{overflow:hidden;margin:0 -5px}.account__header__bio .account__header__content{padding:20px 15px;padding-bottom:5px;color:#fff}.account__header__bio .account__header__fields{margin:0;border-top:1px solid #26374d}.account__header__bio .account__header__fields a{color:#0000a8}.account__header__bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.account__header__bio .account__header__fields .verified a{color:#79bd9a}.account__header__extra{margin-top:4px}.account__header__extra__links{font-size:14px;color:#9baec8;padding:10px 0}.account__header__extra__links a{display:inline-block;color:#9baec8;text-decoration:none;padding:5px 10px;font-weight:500}.account__header__extra__links a strong{font-weight:700;color:#fff}.trends__header{color:#404040;background:#151f2b;border-bottom:1px solid #0b1016;font-weight:500;padding:15px;font-size:16px;cursor:default}.trends__header .fa{display:inline-block;margin-right:5px}.trends__item{display:flex;align-items:center;padding:15px;border-bottom:1px solid #202e3f}.trends__item:last-child{border-bottom:0}.trends__item__name{flex:1 1 auto;color:#404040;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trends__item__name strong{font-weight:500}.trends__item__name a{color:#9baec8;text-decoration:none;font-size:14px;font-weight:500;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trends__item__name a:hover span,.trends__item__name a:focus span,.trends__item__name a:active span{text-decoration:underline}.trends__item__current{flex:0 0 auto;font-size:24px;line-height:36px;font-weight:500;text-align:right;padding-right:15px;margin-left:5px;color:#d9e1e8}.trends__item__sparkline{flex:0 0 auto;width:50px}.trends__item__sparkline path:first-child{fill:rgba(0,0,127,.25) !important;fill-opacity:1 !important}.trends__item__sparkline path:last-child{stroke:#00009e !important}.conversation{display:flex;border-bottom:1px solid #202e3f;padding:5px;padding-bottom:0}.conversation:focus{background:#151f2b;outline:0}.conversation__avatar{flex:0 0 auto;padding:10px;padding-top:12px;position:relative}.conversation__unread{display:inline-block;background:#00007f;border-radius:50%;width:.625rem;height:.625rem;margin:-0.1ex .15em .1ex}.conversation__content{flex:1 1 auto;padding:10px 5px;padding-right:15px;overflow:hidden}.conversation__content__info{overflow:hidden;display:flex;flex-direction:row-reverse;justify-content:space-between}.conversation__content__relative-time{font-size:15px;color:#9baec8;padding-left:15px}.conversation__content__names{color:#9baec8;font-size:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:4px;flex-basis:90px;flex-grow:1}.conversation__content__names a{color:#fff;text-decoration:none}.conversation__content__names a:hover,.conversation__content__names a:focus,.conversation__content__names a:active{text-decoration:underline}.conversation__content a{word-break:break-word}.conversation--unread{background:#151f2b}.conversation--unread:focus{background:#192432}.conversation--unread .conversation__content__info{font-weight:700}.conversation--unread .conversation__content__relative-time{color:#fff}.poll{margin-top:16px;font-size:14px}.poll li{margin-bottom:10px;position:relative}.poll__chart{position:absolute;top:0;left:0;height:100%;display:inline-block;border-radius:4px;background:#6d89af}.poll__chart.leading{background:#00007f}.poll__text{position:relative;display:flex;padding:6px 0;line-height:18px;cursor:default;overflow:hidden}.poll__text input[type=radio],.poll__text input[type=checkbox]{display:none}.poll__text .autossugest-input{flex:1 1 auto}.poll__text input[type=text]{display:block;box-sizing:border-box;width:100%;font-size:14px;color:#121a24;outline:0;font-family:inherit;background:#fff;border:1px solid #dbdbdb;border-radius:4px;padding:6px 10px}.poll__text input[type=text]:focus{border-color:#00007f}.poll__text.selectable{cursor:pointer}.poll__text.editable{display:flex;align-items:center;overflow:visible}.poll__input{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:50%;vertical-align:middle;margin-top:auto;margin-bottom:auto;flex:0 0 18px}.poll__input.checkbox{border-radius:4px}.poll__input.active{border-color:#79bd9a;background:#79bd9a}.poll__input:active,.poll__input:focus,.poll__input:hover{border-width:4px;background:none}.poll__input::-moz-focus-inner{outline:0 !important;border:0}.poll__input:focus,.poll__input:active{outline:0 !important}.poll__number{display:inline-block;width:52px;font-weight:700;padding:0 10px;padding-left:8px;text-align:right;margin-top:auto;margin-bottom:auto;flex:0 0 52px}.poll__vote__mark{float:left;line-height:18px}.poll__footer{padding-top:6px;padding-bottom:5px;color:#404040}.poll__link{display:inline;background:transparent;padding:0;margin:0;border:0;color:#404040;text-decoration:underline;font-size:inherit}.poll__link:hover{text-decoration:none}.poll__link:active,.poll__link:focus{background-color:rgba(64,64,64,.1)}.poll .button{height:36px;padding:0 16px;margin-right:10px;font-size:14px}.compose-form__poll-wrapper{border-top:1px solid #ebebeb}.compose-form__poll-wrapper ul{padding:10px}.compose-form__poll-wrapper .poll__footer{border-top:1px solid #ebebeb;padding:10px;display:flex;align-items:center}.compose-form__poll-wrapper .poll__footer button,.compose-form__poll-wrapper .poll__footer select{flex:1 1 50%}.compose-form__poll-wrapper .poll__footer button:focus,.compose-form__poll-wrapper .poll__footer select:focus{border-color:#00007f}.compose-form__poll-wrapper .button.button-secondary{font-size:14px;font-weight:400;padding:6px 10px;height:auto;line-height:inherit;color:#404040;border-color:#404040;margin-right:5px}.compose-form__poll-wrapper li{display:flex;align-items:center}.compose-form__poll-wrapper li .poll__text{flex:0 0 auto;width:calc(100% - (23px + 6px));margin-right:6px}.compose-form__poll-wrapper select{appearance:none;box-sizing:border-box;font-size:14px;color:#121a24;display:inline-block;width:auto;outline:0;font-family:inherit;background:#fff url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center/auto 16px;border:1px solid #dbdbdb;border-radius:4px;padding:6px 10px;padding-right:30px}.compose-form__poll-wrapper .icon-button.disabled{color:#dbdbdb}.muted .poll{color:#404040}.muted .poll__chart{background:rgba(109,137,175,.2)}.muted .poll__chart.leading{background:rgba(0,0,127,.2)}.modal-layout{background:#121a24 url('data:image/svg+xml;utf8,') repeat-x bottom fixed;display:flex;flex-direction:column;height:100vh;padding:0}.modal-layout__mastodon{display:flex;flex:1;flex-direction:column;justify-content:flex-end}.modal-layout__mastodon>*{flex:1;max-height:235px}@media screen and (max-width: 600px){.account-header{margin-top:0}}.emoji-mart{font-size:13px;display:inline-block;color:#121a24}.emoji-mart,.emoji-mart *{box-sizing:border-box;line-height:1.15}.emoji-mart .emoji-mart-emoji{padding:6px}.emoji-mart-bar{border:0 solid #c0cdd9}.emoji-mart-bar:first-child{border-bottom-width:1px;border-top-left-radius:5px;border-top-right-radius:5px;background:#d9e1e8}.emoji-mart-bar:last-child{border-top-width:1px;border-bottom-left-radius:5px;border-bottom-right-radius:5px;display:none}.emoji-mart-anchors{display:flex;justify-content:space-between;padding:0 6px;color:#404040;line-height:0}.emoji-mart-anchor{position:relative;flex:1;text-align:center;padding:12px 4px;overflow:hidden;transition:color .1s ease-out;cursor:pointer}.emoji-mart-anchor:hover{color:#363636}.emoji-mart-anchor-selected{color:#00007f}.emoji-mart-anchor-selected:hover{color:#00006b}.emoji-mart-anchor-selected .emoji-mart-anchor-bar{bottom:-1px}.emoji-mart-anchor-bar{position:absolute;bottom:-5px;left:0;width:100%;height:4px;background-color:#00007f}.emoji-mart-anchors i{display:inline-block;width:100%;max-width:22px}.emoji-mart-anchors svg{fill:currentColor;max-height:18px}.emoji-mart-scroll{overflow-y:scroll;height:270px;max-height:35vh;padding:0 6px 6px;background:#fff;will-change:transform}.emoji-mart-scroll::-webkit-scrollbar-track:hover,.emoji-mart-scroll::-webkit-scrollbar-track:active{background-color:rgba(0,0,0,.3)}.emoji-mart-search{padding:10px;padding-right:45px;background:#fff}.emoji-mart-search input{font-size:14px;font-weight:400;padding:7px 9px;font-family:inherit;display:block;width:100%;background:rgba(217,225,232,.3);color:#121a24;border:1px solid #d9e1e8;border-radius:4px}.emoji-mart-search input::-moz-focus-inner{border:0}.emoji-mart-search input::-moz-focus-inner,.emoji-mart-search input:focus,.emoji-mart-search input:active{outline:0 !important}.emoji-mart-category .emoji-mart-emoji{cursor:pointer}.emoji-mart-category .emoji-mart-emoji span{z-index:1;position:relative;text-align:center}.emoji-mart-category .emoji-mart-emoji:hover::before{z-index:0;content:\"\";position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(217,225,232,.7);border-radius:100%}.emoji-mart-category-label{z-index:2;position:relative;position:-webkit-sticky;position:sticky;top:0}.emoji-mart-category-label span{display:block;width:100%;font-weight:500;padding:5px 6px;background:#fff}.emoji-mart-emoji{position:relative;display:inline-block;font-size:0}.emoji-mart-emoji span{width:22px;height:22px}.emoji-mart-no-results{font-size:14px;text-align:center;padding-top:70px;color:#9baec8}.emoji-mart-no-results .emoji-mart-category-label{display:none}.emoji-mart-no-results .emoji-mart-no-results-label{margin-top:.2em}.emoji-mart-no-results .emoji-mart-emoji:hover::before{content:none}.emoji-mart-preview{display:none}.container{box-sizing:border-box;max-width:1235px;margin:0 auto;position:relative}@media screen and (max-width: 1255px){.container{width:100%;padding:0 10px}}.rich-formatting{font-family:\"mastodon-font-sans-serif\",sans-serif;font-size:14px;font-weight:400;line-height:1.7;word-wrap:break-word;color:#9baec8}.rich-formatting a{color:#00007f;text-decoration:underline}.rich-formatting a:hover,.rich-formatting a:focus,.rich-formatting a:active{text-decoration:none}.rich-formatting p,.rich-formatting li{color:#9baec8}.rich-formatting p{margin-top:0;margin-bottom:.85em}.rich-formatting p:last-child{margin-bottom:0}.rich-formatting strong{font-weight:700;color:#d9e1e8}.rich-formatting em{font-style:italic;color:#d9e1e8}.rich-formatting code{font-size:.85em;background:#040609;border-radius:4px;padding:.2em .3em}.rich-formatting h1,.rich-formatting h2,.rich-formatting h3,.rich-formatting h4,.rich-formatting h5,.rich-formatting h6{font-family:\"mastodon-font-display\",sans-serif;margin-top:1.275em;margin-bottom:.85em;font-weight:500;color:#d9e1e8}.rich-formatting h1{font-size:2em}.rich-formatting h2{font-size:1.75em}.rich-formatting h3{font-size:1.5em}.rich-formatting h4{font-size:1.25em}.rich-formatting h5,.rich-formatting h6{font-size:1em}.rich-formatting ul{list-style:disc}.rich-formatting ol{list-style:decimal}.rich-formatting ul,.rich-formatting ol{margin:0;padding:0;padding-left:2em;margin-bottom:.85em}.rich-formatting ul[type=a],.rich-formatting ol[type=a]{list-style-type:lower-alpha}.rich-formatting ul[type=i],.rich-formatting ol[type=i]{list-style-type:lower-roman}.rich-formatting hr{width:100%;height:0;border:0;border-bottom:1px solid #192432;margin:1.7em 0}.rich-formatting hr.spacer{height:1px;border:0}.rich-formatting table{width:100%;border-collapse:collapse;break-inside:auto;margin-top:24px;margin-bottom:32px}.rich-formatting table thead tr,.rich-formatting table tbody tr{border-bottom:1px solid #192432;font-size:1em;line-height:1.625;font-weight:400;text-align:left;color:#9baec8}.rich-formatting table thead tr{border-bottom-width:2px;line-height:1.5;font-weight:500;color:#404040}.rich-formatting table th,.rich-formatting table td{padding:8px;align-self:start;align-items:start;word-break:break-all}.rich-formatting table th.nowrap,.rich-formatting table td.nowrap{width:25%;position:relative}.rich-formatting table th.nowrap::before,.rich-formatting table td.nowrap::before{content:\" \";visibility:hidden}.rich-formatting table th.nowrap span,.rich-formatting table td.nowrap span{position:absolute;left:8px;right:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rich-formatting>:first-child{margin-top:0}.information-board{background:#0b1016;padding:20px 0}.information-board .container-alt{position:relative;padding-right:295px}.information-board__sections{display:flex;justify-content:space-between;flex-wrap:wrap}.information-board__section{flex:1 0 0;font-family:\"mastodon-font-sans-serif\",sans-serif;font-size:16px;line-height:28px;color:#fff;text-align:right;padding:10px 15px}.information-board__section span,.information-board__section strong{display:block}.information-board__section span:last-child{color:#d9e1e8}.information-board__section strong{font-family:\"mastodon-font-display\",sans-serif;font-weight:500;font-size:32px;line-height:48px}@media screen and (max-width: 700px){.information-board__section{text-align:center}}.information-board .panel{position:absolute;width:280px;box-sizing:border-box;background:#040609;padding:20px;padding-top:10px;border-radius:4px 4px 0 0;right:0;bottom:-40px}.information-board .panel .panel-header{font-family:\"mastodon-font-display\",sans-serif;font-size:14px;line-height:24px;font-weight:500;color:#9baec8;padding-bottom:5px;margin-bottom:15px;border-bottom:1px solid #192432;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.information-board .panel .panel-header a,.information-board .panel .panel-header span{font-weight:400;color:#7a93b6}.information-board .panel .panel-header a{text-decoration:none}.information-board .owner{text-align:center}.information-board .owner .avatar{width:80px;height:80px;margin:0 auto;margin-bottom:15px}.information-board .owner .avatar img{display:block;width:80px;height:80px;border-radius:48px}.information-board .owner .name{font-size:14px}.information-board .owner .name a{display:block;color:#fff;text-decoration:none}.information-board .owner .name a:hover .display_name{text-decoration:underline}.information-board .owner .name .username{display:block;color:#9baec8}.landing-page p,.landing-page li{font-family:\"mastodon-font-sans-serif\",sans-serif;font-size:16px;font-weight:400;font-size:16px;line-height:30px;margin-bottom:12px;color:#9baec8}.landing-page p a,.landing-page li a{color:#00007f;text-decoration:underline}.landing-page em{display:inline;margin:0;padding:0;font-weight:700;background:transparent;font-family:inherit;font-size:inherit;line-height:inherit;color:#bcc9da}.landing-page h1{font-family:\"mastodon-font-display\",sans-serif;font-size:26px;line-height:30px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page h1 small{font-family:\"mastodon-font-sans-serif\",sans-serif;display:block;font-size:18px;font-weight:400;color:#bcc9da}.landing-page h2{font-family:\"mastodon-font-display\",sans-serif;font-size:22px;line-height:26px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page h3{font-family:\"mastodon-font-display\",sans-serif;font-size:18px;line-height:24px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page h4{font-family:\"mastodon-font-display\",sans-serif;font-size:16px;line-height:24px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page h5{font-family:\"mastodon-font-display\",sans-serif;font-size:14px;line-height:24px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page h6{font-family:\"mastodon-font-display\",sans-serif;font-size:12px;line-height:24px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page ul,.landing-page ol{margin-left:20px}.landing-page ul[type=a],.landing-page ol[type=a]{list-style-type:lower-alpha}.landing-page ul[type=i],.landing-page ol[type=i]{list-style-type:lower-roman}.landing-page ul{list-style:disc}.landing-page ol{list-style:decimal}.landing-page li>ol,.landing-page li>ul{margin-top:6px}.landing-page hr{width:100%;height:0;border:0;border-bottom:1px solid rgba(64,64,64,.6);margin:20px 0}.landing-page hr.spacer{height:1px;border:0}.landing-page__information,.landing-page__forms{padding:20px}.landing-page__call-to-action{background:#121a24;border-radius:4px;padding:25px 40px;overflow:hidden;box-sizing:border-box}.landing-page__call-to-action .row{width:100%;display:flex;flex-direction:row-reverse;flex-wrap:nowrap;justify-content:space-between;align-items:center}.landing-page__call-to-action .row__information-board{display:flex;justify-content:flex-end;align-items:flex-end}.landing-page__call-to-action .row__information-board .information-board__section{flex:1 0 auto;padding:0 10px}@media screen and (max-width: 415px){.landing-page__call-to-action .row__information-board{width:100%;justify-content:space-between}}.landing-page__call-to-action .row__mascot{flex:1;margin:10px -50px 0 0}@media screen and (max-width: 415px){.landing-page__call-to-action .row__mascot{display:none}}.landing-page__logo{margin-right:20px}.landing-page__logo img{height:50px;width:auto;mix-blend-mode:lighten}.landing-page__information{padding:45px 40px;margin-bottom:10px}.landing-page__information:last-child{margin-bottom:0}.landing-page__information strong{font-weight:500;color:#bcc9da}.landing-page__information .account{border-bottom:0;padding:0}.landing-page__information .account__display-name{align-items:center;display:flex;margin-right:5px}.landing-page__information .account div.account__display-name:hover .display-name strong{text-decoration:none}.landing-page__information .account div.account__display-name .account__avatar{cursor:default}.landing-page__information .account__avatar-wrapper{margin-left:0;flex:0 0 auto}.landing-page__information .account__avatar{width:44px;height:44px;background-size:44px 44px}.landing-page__information .account .display-name{font-size:15px}.landing-page__information .account .display-name__account{font-size:14px}@media screen and (max-width: 960px){.landing-page__information .contact{margin-top:30px}}@media screen and (max-width: 700px){.landing-page__information{padding:25px 20px}}.landing-page__information,.landing-page__forms,.landing-page #mastodon-timeline{box-sizing:border-box;background:#121a24;border-radius:4px;box-shadow:0 0 6px rgba(0,0,0,.1)}.landing-page__mascot{height:104px;position:relative;left:-40px;bottom:25px}.landing-page__mascot img{height:190px;width:auto}.landing-page__short-description .row{display:flex;flex-wrap:wrap;align-items:center;margin-bottom:40px}@media screen and (max-width: 700px){.landing-page__short-description .row{margin-bottom:20px}}.landing-page__short-description p a{color:#d9e1e8}.landing-page__short-description h1{font-weight:500;color:#fff;margin-bottom:0}.landing-page__short-description h1 small{color:#9baec8}.landing-page__short-description h1 small span{color:#d9e1e8}.landing-page__short-description p:last-child{margin-bottom:0}.landing-page__hero{margin-bottom:10px}.landing-page__hero img{display:block;margin:0;max-width:100%;height:auto;border-radius:4px}@media screen and (max-width: 840px){.landing-page .information-board .container-alt{padding-right:20px}.landing-page .information-board .panel{position:static;margin-top:20px;width:100%;border-radius:4px}.landing-page .information-board .panel .panel-header{text-align:center}}@media screen and (max-width: 675px){.landing-page .header-wrapper{padding-top:0}.landing-page .header-wrapper.compact{padding-bottom:0}.landing-page .header-wrapper.compact .hero .heading{text-align:initial}.landing-page .header .container-alt,.landing-page .features .container-alt{display:block}}.landing-page .cta{margin:20px}.landing{margin-bottom:100px}@media screen and (max-width: 738px){.landing{margin-bottom:0}}.landing__brand{display:flex;justify-content:center;align-items:center;padding:50px}.landing__brand svg{fill:#fff;height:52px}@media screen and (max-width: 415px){.landing__brand{padding:0;margin-bottom:30px}}.landing .directory{margin-top:30px;background:transparent;box-shadow:none;border-radius:0}.landing .hero-widget{margin-top:30px;margin-bottom:0}.landing .hero-widget h4{padding:10px;font-weight:700;font-size:14px;color:#9baec8}.landing .hero-widget__text{border-radius:0;padding-bottom:0}.landing .hero-widget__footer{background:#121a24;padding:10px;border-radius:0 0 4px 4px;display:flex}.landing .hero-widget__footer__column{flex:1 1 50%}.landing .hero-widget .account{padding:10px 0;border-bottom:0}.landing .hero-widget .account .account__display-name{display:flex;align-items:center}.landing .hero-widget .account .account__avatar{width:44px;height:44px;background-size:44px 44px}.landing .hero-widget__counter{padding:10px}.landing .hero-widget__counter strong{font-family:\"mastodon-font-display\",sans-serif;font-size:15px;font-weight:700;display:block}.landing .hero-widget__counter span{font-size:14px;color:#9baec8}.landing .simple_form .user_agreement .label_input>label{font-weight:400;color:#9baec8}.landing .simple_form p.lead{color:#9baec8;font-size:15px;line-height:20px;font-weight:400;margin-bottom:25px}.landing__grid{max-width:960px;margin:0 auto;display:grid;grid-template-columns:minmax(0, 50%) minmax(0, 50%);grid-gap:30px}@media screen and (max-width: 738px){.landing__grid{grid-template-columns:minmax(0, 100%);grid-gap:10px}.landing__grid__column-login{grid-row:1;display:flex;flex-direction:column}.landing__grid__column-login .box-widget{order:2;flex:0 0 auto}.landing__grid__column-login .hero-widget{margin-top:0;margin-bottom:10px;order:1;flex:0 0 auto}.landing__grid__column-registration{grid-row:2}.landing__grid .directory{margin-top:10px}}@media screen and (max-width: 415px){.landing__grid{grid-gap:0}.landing__grid .hero-widget{display:block;margin-bottom:0;box-shadow:none}.landing__grid .hero-widget__img,.landing__grid .hero-widget__img img,.landing__grid .hero-widget__footer{border-radius:0}.landing__grid .hero-widget,.landing__grid .box-widget,.landing__grid .directory__tag{border-bottom:1px solid #202e3f}.landing__grid .directory{margin-top:0}.landing__grid .directory__tag{margin-bottom:0}.landing__grid .directory__tag>a,.landing__grid .directory__tag>div{border-radius:0;box-shadow:none}.landing__grid .directory__tag:last-child{border-bottom:0}}.brand{position:relative;text-decoration:none}.brand__tagline{display:block;position:absolute;bottom:-10px;left:50px;width:300px;color:#9baec8;text-decoration:none;font-size:14px}@media screen and (max-width: 415px){.brand__tagline{position:static;width:auto;margin-top:20px;color:#404040}}.table{width:100%;max-width:100%;border-spacing:0;border-collapse:collapse}.table th,.table td{padding:8px;line-height:18px;vertical-align:top;border-top:1px solid #121a24;text-align:left;background:#0b1016}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #121a24;border-top:0;font-weight:500}.table>tbody>tr>th{font-weight:500}.table>tbody>tr:nth-child(odd)>td,.table>tbody>tr:nth-child(odd)>th{background:#121a24}.table a{color:#00007f;text-decoration:underline}.table a:hover{text-decoration:none}.table strong{font-weight:500}.table strong:lang(ja){font-weight:700}.table strong:lang(ko){font-weight:700}.table strong:lang(zh-CN){font-weight:700}.table strong:lang(zh-HK){font-weight:700}.table strong:lang(zh-TW){font-weight:700}.table.inline-table>tbody>tr:nth-child(odd)>td,.table.inline-table>tbody>tr:nth-child(odd)>th{background:transparent}.table.inline-table>tbody>tr:first-child>td,.table.inline-table>tbody>tr:first-child>th{border-top:0}.table.batch-table>thead>tr>th{background:#121a24;border-top:1px solid #040609;border-bottom:1px solid #040609}.table.batch-table>thead>tr>th:first-child{border-radius:4px 0 0;border-left:1px solid #040609}.table.batch-table>thead>tr>th:last-child{border-radius:0 4px 0 0;border-right:1px solid #040609}.table--invites tbody td{vertical-align:middle}.table-wrapper{overflow:auto;margin-bottom:20px}samp{font-family:\"mastodon-font-monospace\",monospace}button.table-action-link{background:transparent;border:0;font:inherit}button.table-action-link,a.table-action-link{text-decoration:none;display:inline-block;margin-right:5px;padding:0 10px;color:#9baec8;font-weight:500}button.table-action-link:hover,a.table-action-link:hover{color:#fff}button.table-action-link i.fa,a.table-action-link i.fa{font-weight:400;margin-right:5px}button.table-action-link:first-child,a.table-action-link:first-child{padding-left:0}.batch-table__toolbar,.batch-table__row{display:flex}.batch-table__toolbar__select,.batch-table__row__select{box-sizing:border-box;padding:8px 16px;cursor:pointer;min-height:100%}.batch-table__toolbar__select input,.batch-table__row__select input{margin-top:8px}.batch-table__toolbar__select--aligned,.batch-table__row__select--aligned{display:flex;align-items:center}.batch-table__toolbar__select--aligned input,.batch-table__row__select--aligned input{margin-top:0}.batch-table__toolbar__actions,.batch-table__toolbar__content,.batch-table__row__actions,.batch-table__row__content{padding:8px 0;padding-right:16px;flex:1 1 auto}.batch-table__toolbar{border:1px solid #040609;background:#121a24;border-radius:4px 0 0;height:47px;align-items:center}.batch-table__toolbar__actions{text-align:right;padding-right:11px}.batch-table__form{padding:16px;border:1px solid #040609;border-top:0;background:#121a24}.batch-table__form .fields-row{padding-top:0;margin-bottom:0}.batch-table__row{border:1px solid #040609;border-top:0;background:#0b1016}@media screen and (max-width: 415px){.optional .batch-table__row:first-child{border-top:1px solid #040609}}.batch-table__row:hover{background:#0f151d}.batch-table__row:nth-child(even){background:#121a24}.batch-table__row:nth-child(even):hover{background:#151f2b}.batch-table__row__content{padding-top:12px;padding-bottom:16px}.batch-table__row__content--unpadded{padding:0}.batch-table__row__content--with-image{display:flex;align-items:center}.batch-table__row__content__image{flex:0 0 auto;display:flex;justify-content:center;align-items:center;margin-right:10px}.batch-table__row__content__image .emojione{width:32px;height:32px}.batch-table__row__content__text{flex:1 1 auto}.batch-table__row__content__extra{flex:0 0 auto;text-align:right;color:#9baec8;font-weight:500}.batch-table__row .directory__tag{margin:0;width:100%}.batch-table__row .directory__tag a{background:transparent;border-radius:0}@media screen and (max-width: 415px){.batch-table.optional .batch-table__toolbar,.batch-table.optional .batch-table__row__select{display:none}}.batch-table .status__content{padding-top:0}.batch-table .status__content summary{display:list-item}.batch-table .status__content strong{font-weight:700}.batch-table .nothing-here{border:1px solid #040609;border-top:0;box-shadow:none}@media screen and (max-width: 415px){.batch-table .nothing-here{border-top:1px solid #040609}}@media screen and (max-width: 870px){.batch-table .accounts-table tbody td.optional{display:none}}.admin-wrapper{display:flex;justify-content:center;width:100%;min-height:100vh}.admin-wrapper .sidebar-wrapper{min-height:100vh;overflow:hidden;pointer-events:none;flex:1 1 auto}.admin-wrapper .sidebar-wrapper__inner{display:flex;justify-content:flex-end;background:#121a24;height:100%}.admin-wrapper .sidebar{width:240px;padding:0;pointer-events:auto}.admin-wrapper .sidebar__toggle{display:none;background:#202e3f;height:48px}.admin-wrapper .sidebar__toggle__logo{flex:1 1 auto}.admin-wrapper .sidebar__toggle__logo a{display:inline-block;padding:15px}.admin-wrapper .sidebar__toggle__logo svg{fill:#fff;height:20px;position:relative;bottom:-2px}.admin-wrapper .sidebar__toggle__icon{display:block;color:#9baec8;text-decoration:none;flex:0 0 auto;font-size:20px;padding:15px}.admin-wrapper .sidebar__toggle a:hover,.admin-wrapper .sidebar__toggle a:focus,.admin-wrapper .sidebar__toggle a:active{background:#26374d}.admin-wrapper .sidebar .logo{display:block;margin:40px auto;width:100px;height:100px}@media screen and (max-width: 600px){.admin-wrapper .sidebar>a:first-child{display:none}}.admin-wrapper .sidebar ul{list-style:none;border-radius:4px 0 0 4px;overflow:hidden;margin-bottom:20px}@media screen and (max-width: 600px){.admin-wrapper .sidebar ul{margin-bottom:0}}.admin-wrapper .sidebar ul a{display:block;padding:15px;color:#9baec8;text-decoration:none;transition:all 200ms linear;transition-property:color,background-color;border-radius:4px 0 0 4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.admin-wrapper .sidebar ul a i.fa{margin-right:5px}.admin-wrapper .sidebar ul a:hover{color:#fff;background-color:#0a0e13;transition:all 100ms linear;transition-property:color,background-color}.admin-wrapper .sidebar ul a.selected{background:#0f151d;border-radius:4px 0 0}.admin-wrapper .sidebar ul ul{background:#0b1016;border-radius:0 0 0 4px;margin:0}.admin-wrapper .sidebar ul ul a{border:0;padding:15px 35px}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a{color:#fff;background-color:#00007f;border-bottom:0;border-radius:0}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a:hover{background-color:#009}.admin-wrapper .sidebar>ul>.simple-navigation-active-leaf a{border-radius:4px 0 0 4px}.admin-wrapper .content-wrapper{box-sizing:border-box;width:100%;max-width:840px;flex:1 1 auto}@media screen and (max-width: 1080px){.admin-wrapper .sidebar-wrapper--empty{display:none}.admin-wrapper .sidebar-wrapper{width:240px;flex:0 0 auto}}@media screen and (max-width: 600px){.admin-wrapper .sidebar-wrapper{width:100%}}.admin-wrapper .content{padding:20px 15px;padding-top:60px;padding-left:25px}@media screen and (max-width: 600px){.admin-wrapper .content{max-width:none;padding:15px;padding-top:30px}}.admin-wrapper .content-heading{display:flex;padding-bottom:40px;border-bottom:1px solid #202e3f;margin:-15px -15px 40px 0;flex-wrap:wrap;align-items:center;justify-content:space-between}.admin-wrapper .content-heading>*{margin-top:15px;margin-right:15px}.admin-wrapper .content-heading-actions{display:inline-flex}.admin-wrapper .content-heading-actions>:not(:first-child){margin-left:5px}@media screen and (max-width: 600px){.admin-wrapper .content-heading{border-bottom:0;padding-bottom:0}}.admin-wrapper .content h2{color:#d9e1e8;font-size:24px;line-height:28px;font-weight:400}@media screen and (max-width: 600px){.admin-wrapper .content h2{font-weight:700}}.admin-wrapper .content h3{color:#d9e1e8;font-size:20px;line-height:28px;font-weight:400;margin-bottom:30px}.admin-wrapper .content h4{font-size:14px;font-weight:700;color:#9baec8;padding-bottom:8px;margin-bottom:8px;border-bottom:1px solid #202e3f}.admin-wrapper .content h6{font-size:16px;color:#d9e1e8;line-height:28px;font-weight:500}.admin-wrapper .content .fields-group h6{color:#fff;font-weight:500}.admin-wrapper .content .directory__tag>a,.admin-wrapper .content .directory__tag>div{box-shadow:none}.admin-wrapper .content .directory__tag .table-action-link .fa{color:inherit}.admin-wrapper .content .directory__tag h4{font-size:18px;font-weight:700;color:#fff;text-transform:none;padding-bottom:0;margin-bottom:0;border-bottom:0}.admin-wrapper .content>p{font-size:14px;line-height:21px;color:#d9e1e8;margin-bottom:20px}.admin-wrapper .content>p strong{color:#fff;font-weight:500}.admin-wrapper .content>p strong:lang(ja){font-weight:700}.admin-wrapper .content>p strong:lang(ko){font-weight:700}.admin-wrapper .content>p strong:lang(zh-CN){font-weight:700}.admin-wrapper .content>p strong:lang(zh-HK){font-weight:700}.admin-wrapper .content>p strong:lang(zh-TW){font-weight:700}.admin-wrapper .content hr{width:100%;height:0;border:0;border-bottom:1px solid rgba(64,64,64,.6);margin:20px 0}.admin-wrapper .content hr.spacer{height:1px;border:0}@media screen and (max-width: 600px){.admin-wrapper{display:block}.admin-wrapper .sidebar-wrapper{min-height:0}.admin-wrapper .sidebar{width:100%;padding:0;height:auto}.admin-wrapper .sidebar__toggle{display:flex}.admin-wrapper .sidebar>ul{display:none}.admin-wrapper .sidebar ul a,.admin-wrapper .sidebar ul ul a{border-radius:0;border-bottom:1px solid #192432;transition:none}.admin-wrapper .sidebar ul a:hover,.admin-wrapper .sidebar ul ul a:hover{transition:none}.admin-wrapper .sidebar ul ul{border-radius:0}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a{border-bottom-color:#00007f}}hr.spacer{width:100%;border:0;margin:20px 0;height:1px}body .muted-hint,.admin-wrapper .content .muted-hint{color:#9baec8}body .muted-hint a,.admin-wrapper .content .muted-hint a{color:#00007f}body .positive-hint,.admin-wrapper .content .positive-hint{color:#79bd9a;font-weight:500}body .negative-hint,.admin-wrapper .content .negative-hint{color:#df405a;font-weight:500}body .neutral-hint,.admin-wrapper .content .neutral-hint{color:#404040;font-weight:500}body .warning-hint,.admin-wrapper .content .warning-hint{color:#ca8f04;font-weight:500}.filters{display:flex;flex-wrap:wrap}.filters .filter-subset{flex:0 0 auto;margin:0 40px 20px 0}.filters .filter-subset:last-child{margin-bottom:30px}.filters .filter-subset ul{margin-top:5px;list-style:none}.filters .filter-subset ul li{display:inline-block;margin-right:5px}.filters .filter-subset strong{font-weight:500;font-size:13px}.filters .filter-subset strong:lang(ja){font-weight:700}.filters .filter-subset strong:lang(ko){font-weight:700}.filters .filter-subset strong:lang(zh-CN){font-weight:700}.filters .filter-subset strong:lang(zh-HK){font-weight:700}.filters .filter-subset strong:lang(zh-TW){font-weight:700}.filters .filter-subset a{display:inline-block;color:#9baec8;text-decoration:none;font-size:13px;font-weight:500;border-bottom:2px solid #121a24}.filters .filter-subset a:hover{color:#fff;border-bottom:2px solid #1b2635}.filters .filter-subset a.selected{color:#00007f;border-bottom:2px solid #00007f}.flavour-screen{display:block;margin:10px auto;max-width:100%}.flavour-description{display:block;font-size:16px;margin:10px 0}.flavour-description>p{margin:10px 0}.flavour-screen{display:block;margin:10px auto;max-width:100%}.flavour-description{display:block;font-size:16px;margin:10px 0}.flavour-description>p{margin:10px 0}.report-accounts{display:flex;flex-wrap:wrap;margin-bottom:20px}.report-accounts__item{display:flex;flex:250px;flex-direction:column;margin:0 5px}.report-accounts__item>strong{display:block;margin:0 0 10px -5px;font-weight:500;font-size:14px;line-height:18px;color:#d9e1e8}.report-accounts__item>strong:lang(ja){font-weight:700}.report-accounts__item>strong:lang(ko){font-weight:700}.report-accounts__item>strong:lang(zh-CN){font-weight:700}.report-accounts__item>strong:lang(zh-HK){font-weight:700}.report-accounts__item>strong:lang(zh-TW){font-weight:700}.report-accounts__item .account-card{flex:1 1 auto}.report-status,.account-status{display:flex;margin-bottom:10px}.report-status .activity-stream,.account-status .activity-stream{flex:2 0 0;margin-right:20px;max-width:calc(100% - 60px)}.report-status .activity-stream .entry,.account-status .activity-stream .entry{border-radius:4px}.report-status__actions,.account-status__actions{flex:0 0 auto;display:flex;flex-direction:column}.report-status__actions .icon-button,.account-status__actions .icon-button{font-size:24px;width:24px;text-align:center;margin-bottom:10px}.simple_form.new_report_note,.simple_form.new_account_moderation_note{max-width:100%}.batch-form-box{display:flex;flex-wrap:wrap;margin-bottom:5px}.batch-form-box #form_status_batch_action{margin:0 5px 5px 0;font-size:14px}.batch-form-box input.button{margin:0 5px 5px 0}.batch-form-box .media-spoiler-toggle-buttons{margin-left:auto}.batch-form-box .media-spoiler-toggle-buttons .button{overflow:visible;margin:0 0 5px 5px;float:right}.back-link{margin-bottom:10px;font-size:14px}.back-link a{color:#00007f;text-decoration:none}.back-link a:hover{text-decoration:underline}.spacer{flex:1 1 auto}.log-entry{margin-bottom:20px;line-height:20px}.log-entry__header{display:flex;justify-content:flex-start;align-items:center;padding:10px;background:#121a24;color:#9baec8;border-radius:4px 4px 0 0;font-size:14px;position:relative}.log-entry__avatar{margin-right:10px}.log-entry__avatar .avatar{display:block;margin:0;border-radius:50%;width:40px;height:40px}.log-entry__content{max-width:calc(100% - 90px)}.log-entry__title{word-wrap:break-word}.log-entry__timestamp{color:#404040}.log-entry__extras{background:#1c2938;border-radius:0 0 4px 4px;padding:10px;color:#9baec8;font-family:\"mastodon-font-monospace\",monospace;font-size:12px;word-wrap:break-word;min-height:20px}.log-entry__icon{font-size:28px;margin-right:10px;color:#404040}.log-entry__icon__overlay{position:absolute;top:10px;right:10px;width:10px;height:10px;border-radius:50%}.log-entry__icon__overlay.positive{background:#79bd9a}.log-entry__icon__overlay.negative{background:#e87487}.log-entry__icon__overlay.neutral{background:#00007f}.log-entry a,.log-entry .username,.log-entry .target{color:#d9e1e8;text-decoration:none;font-weight:500}.log-entry .diff-old{color:#e87487}.log-entry .diff-neutral{color:#d9e1e8}.log-entry .diff-new{color:#79bd9a}a.name-tag,.name-tag,a.inline-name-tag,.inline-name-tag{text-decoration:none;color:#d9e1e8}a.name-tag .username,.name-tag .username,a.inline-name-tag .username,.inline-name-tag .username{font-weight:500}a.name-tag.suspended .username,.name-tag.suspended .username,a.inline-name-tag.suspended .username,.inline-name-tag.suspended .username{text-decoration:line-through;color:#e87487}a.name-tag.suspended .avatar,.name-tag.suspended .avatar,a.inline-name-tag.suspended .avatar,.inline-name-tag.suspended .avatar{filter:grayscale(100%);opacity:.8}a.name-tag,.name-tag{display:flex;align-items:center}a.name-tag .avatar,.name-tag .avatar{display:block;margin:0;margin-right:5px;border-radius:50%}a.name-tag.suspended .avatar,.name-tag.suspended .avatar{filter:grayscale(100%);opacity:.8}.speech-bubble{margin-bottom:20px;border-left:4px solid #00007f}.speech-bubble.positive{border-left-color:#79bd9a}.speech-bubble.negative{border-left-color:#e87487}.speech-bubble.warning{border-left-color:#ca8f04}.speech-bubble__bubble{padding:16px;padding-left:14px;font-size:15px;line-height:20px;border-radius:4px 4px 4px 0;position:relative;font-weight:500}.speech-bubble__bubble a{color:#9baec8}.speech-bubble__owner{padding:8px;padding-left:12px}.speech-bubble time{color:#404040}.report-card{background:#121a24;border-radius:4px;margin-bottom:20px}.report-card__profile{display:flex;justify-content:space-between;align-items:center;padding:15px}.report-card__profile .account{padding:0;border:0}.report-card__profile .account__avatar-wrapper{margin-left:0}.report-card__profile__stats{flex:0 0 auto;font-weight:500;color:#9baec8;text-align:right}.report-card__profile__stats a{color:inherit;text-decoration:none}.report-card__profile__stats a:focus,.report-card__profile__stats a:hover,.report-card__profile__stats a:active{color:#b5c3d6}.report-card__profile__stats .red{color:#df405a}.report-card__summary__item{display:flex;justify-content:flex-start;border-top:1px solid #0b1016}.report-card__summary__item:hover{background:#151f2b}.report-card__summary__item__reported-by,.report-card__summary__item__assigned{padding:15px;flex:0 0 auto;box-sizing:border-box;width:150px;color:#9baec8}.report-card__summary__item__reported-by,.report-card__summary__item__reported-by .username,.report-card__summary__item__assigned,.report-card__summary__item__assigned .username{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.report-card__summary__item__content{flex:1 1 auto;max-width:calc(100% - 300px)}.report-card__summary__item__content__icon{color:#404040;margin-right:4px;font-weight:500}.report-card__summary__item__content a{display:block;box-sizing:border-box;width:100%;padding:15px;text-decoration:none;color:#9baec8}.one-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ellipsized-ip{display:inline-block;max-width:120px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.admin-account-bio{display:flex;flex-wrap:wrap;margin:0 -5px;margin-top:20px}.admin-account-bio>div{box-sizing:border-box;padding:0 5px;margin-bottom:10px;flex:1 0 50%}.admin-account-bio .account__header__fields,.admin-account-bio .account__header__content{background:#202e3f;border-radius:4px;height:100%}.admin-account-bio .account__header__fields{margin:0;border:0}.admin-account-bio .account__header__fields a{color:#0000a8}.admin-account-bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.admin-account-bio .account__header__fields .verified a{color:#79bd9a}.admin-account-bio .account__header__content{box-sizing:border-box;padding:20px;color:#fff}.center-text{text-align:center}.dashboard__counters{display:flex;flex-wrap:wrap;margin:0 -5px;margin-bottom:20px}.dashboard__counters>div{box-sizing:border-box;flex:0 0 33.333%;padding:0 5px;margin-bottom:10px}.dashboard__counters>div>div,.dashboard__counters>div>a{padding:20px;background:#192432;border-radius:4px;box-sizing:border-box;height:100%}.dashboard__counters>div>a{text-decoration:none;color:inherit;display:block}.dashboard__counters>div>a:hover,.dashboard__counters>div>a:focus,.dashboard__counters>div>a:active{background:#202e3f}.dashboard__counters__num,.dashboard__counters__text{text-align:center;font-weight:500;font-size:24px;line-height:21px;color:#fff;font-family:\"mastodon-font-display\",sans-serif;margin-bottom:20px;line-height:30px}.dashboard__counters__text{font-size:18px}.dashboard__counters__label{font-size:14px;color:#9baec8;text-align:center;font-weight:500}.dashboard__widgets{display:flex;flex-wrap:wrap;margin:0 -5px}.dashboard__widgets>div{flex:0 0 33.333%;margin-bottom:20px}.dashboard__widgets>div>div{padding:0 5px}.dashboard__widgets a:not(.name-tag){color:#d9e1e8;font-weight:500;text-decoration:none}body.rtl{direction:rtl}body.rtl .column-header>button{text-align:right;padding-left:0;padding-right:15px}body.rtl .radio-button__input{margin-right:0;margin-left:10px}body.rtl .directory__card__bar .display-name{margin-left:0;margin-right:15px}body.rtl .display-name{text-align:right}body.rtl .notification__message{margin-left:0;margin-right:68px}body.rtl .drawer__inner__mastodon>img{transform:scaleX(-1)}body.rtl .notification__favourite-icon-wrapper{left:auto;right:-26px}body.rtl .landing-page__logo{margin-right:0;margin-left:20px}body.rtl .landing-page .features-list .features-list__row .visual{margin-left:0;margin-right:15px}body.rtl .column-link__icon,body.rtl .column-header__icon{margin-right:0;margin-left:5px}body.rtl .compose-form .compose-form__buttons-wrapper .character-counter__wrapper{margin-right:0;margin-left:4px}body.rtl .navigation-bar__profile{margin-left:0;margin-right:8px}body.rtl .search__input{padding-right:10px;padding-left:30px}body.rtl .search__icon .fa{right:auto;left:10px}body.rtl .columns-area{direction:rtl}body.rtl .column-header__buttons{left:0;right:auto;margin-left:0;margin-right:-15px}body.rtl .column-inline-form .icon-button{margin-left:0;margin-right:5px}body.rtl .column-header__links .text-btn{margin-left:10px;margin-right:0}body.rtl .account__avatar-wrapper{float:right}body.rtl .column-header__back-button{padding-left:5px;padding-right:0}body.rtl .column-header__setting-arrows{float:left}body.rtl .setting-toggle__label{margin-left:0;margin-right:8px}body.rtl .status__avatar{left:auto;right:10px}body.rtl .status,body.rtl .activity-stream .status.light{padding-left:10px;padding-right:68px}body.rtl .status__info .status__display-name,body.rtl .activity-stream .status.light .status__display-name{padding-left:25px;padding-right:0}body.rtl .activity-stream .pre-header{padding-right:68px;padding-left:0}body.rtl .status__prepend{margin-left:0;margin-right:68px}body.rtl .status__prepend-icon-wrapper{left:auto;right:-26px}body.rtl .activity-stream .pre-header .pre-header__icon{left:auto;right:42px}body.rtl .account__avatar-overlay-overlay{right:auto;left:0}body.rtl .column-back-button--slim-button{right:auto;left:0}body.rtl .status__relative-time,body.rtl .activity-stream .status.light .status__header .status__meta{float:left}body.rtl .status__action-bar__counter{margin-right:0;margin-left:11px}body.rtl .status__action-bar__counter .status__action-bar-button{margin-right:0;margin-left:4px}body.rtl .status__action-bar-button{float:right;margin-right:0;margin-left:18px}body.rtl .status__action-bar-dropdown{float:right}body.rtl .privacy-dropdown__dropdown{margin-left:0;margin-right:40px}body.rtl .privacy-dropdown__option__icon{margin-left:10px;margin-right:0}body.rtl .detailed-status__display-name .display-name{text-align:right}body.rtl .detailed-status__display-avatar{margin-right:0;margin-left:10px;float:right}body.rtl .detailed-status__favorites,body.rtl .detailed-status__reblogs{margin-left:0;margin-right:6px}body.rtl .fa-ul{margin-left:2.14285714em}body.rtl .fa-li{left:auto;right:-2.14285714em}body.rtl .admin-wrapper{direction:rtl}body.rtl .admin-wrapper .sidebar ul a i.fa,body.rtl a.table-action-link i.fa{margin-right:0;margin-left:5px}body.rtl .simple_form .check_boxes .checkbox label{padding-left:0;padding-right:25px}body.rtl .simple_form .input.with_label.boolean label.checkbox{padding-left:25px;padding-right:0}body.rtl .simple_form .check_boxes .checkbox input[type=checkbox],body.rtl .simple_form .input.boolean input[type=checkbox]{left:auto;right:0}body.rtl .simple_form .input.radio_buttons .radio{left:auto;right:0}body.rtl .simple_form .input.radio_buttons .radio>label{padding-right:28px;padding-left:0}body.rtl .simple_form .input-with-append .input input{padding-left:142px;padding-right:0}body.rtl .simple_form .input.boolean label.checkbox{left:auto;right:0}body.rtl .simple_form .input.boolean .label_input,body.rtl .simple_form .input.boolean .hint{padding-left:0;padding-right:28px}body.rtl .simple_form .label_input__append{right:auto;left:3px}body.rtl .simple_form .label_input__append::after{right:auto;left:0;background-image:linear-gradient(to left, rgba(1, 1, 2, 0), #010102)}body.rtl .simple_form select{background:#010102 url(\"data:image/svg+xml;utf8,\") no-repeat left 8px center/auto 16px}body.rtl .table th,body.rtl .table td{text-align:right}body.rtl .filters .filter-subset{margin-right:0;margin-left:45px}body.rtl .landing-page .header-wrapper .mascot{right:60px;left:auto}body.rtl .landing-page__call-to-action .row__information-board{direction:rtl}body.rtl .landing-page .header .hero .floats .float-1{left:-120px;right:auto}body.rtl .landing-page .header .hero .floats .float-2{left:210px;right:auto}body.rtl .landing-page .header .hero .floats .float-3{left:110px;right:auto}body.rtl .landing-page .header .links .brand img{left:0}body.rtl .landing-page .fa-external-link{padding-right:5px;padding-left:0 !important}body.rtl .landing-page .features #mastodon-timeline{margin-right:0;margin-left:30px}@media screen and (min-width: 631px){body.rtl .column,body.rtl .drawer{padding-left:5px;padding-right:5px}body.rtl .column:first-child,body.rtl .drawer:first-child{padding-left:5px;padding-right:10px}body.rtl .columns-area>div .column,body.rtl .columns-area>div .drawer{padding-left:5px;padding-right:5px}}body.rtl .columns-area--mobile .column,body.rtl .columns-area--mobile .drawer{padding-left:0;padding-right:0}body.rtl .public-layout .header .nav-button{margin-left:8px;margin-right:0}body.rtl .public-layout .public-account-header__tabs{margin-left:0;margin-right:20px}body.rtl .landing-page__information .account__display-name{margin-right:0;margin-left:5px}body.rtl .landing-page__information .account__avatar-wrapper{margin-left:12px;margin-right:0}body.rtl .card__bar .display-name{margin-left:0;margin-right:15px;text-align:right}body.rtl .fa-chevron-left::before{content:\"\"}body.rtl .fa-chevron-right::before{content:\"\"}body.rtl .column-back-button__icon{margin-right:0;margin-left:5px}body.rtl .column-header__setting-arrows .column-header__setting-btn:last-child{padding-left:0;padding-right:10px}body.rtl .simple_form .input.radio_buttons .radio>label input{left:auto;right:0}.emojione[title=\":wavy_dash:\"],.emojione[title=\":waving_black_flag:\"],.emojione[title=\":water_buffalo:\"],.emojione[title=\":video_game:\"],.emojione[title=\":video_camera:\"],.emojione[title=\":vhs:\"],.emojione[title=\":turkey:\"],.emojione[title=\":tophat:\"],.emojione[title=\":top:\"],.emojione[title=\":tm:\"],.emojione[title=\":telephone_receiver:\"],.emojione[title=\":spider:\"],.emojione[title=\":speaking_head_in_silhouette:\"],.emojione[title=\":spades:\"],.emojione[title=\":soon:\"],.emojione[title=\":registered:\"],.emojione[title=\":on:\"],.emojione[title=\":musical_score:\"],.emojione[title=\":movie_camera:\"],.emojione[title=\":mortar_board:\"],.emojione[title=\":microphone:\"],.emojione[title=\":male-guard:\"],.emojione[title=\":lower_left_fountain_pen:\"],.emojione[title=\":lower_left_ballpoint_pen:\"],.emojione[title=\":kaaba:\"],.emojione[title=\":joystick:\"],.emojione[title=\":hole:\"],.emojione[title=\":hocho:\"],.emojione[title=\":heavy_plus_sign:\"],.emojione[title=\":heavy_multiplication_x:\"],.emojione[title=\":heavy_minus_sign:\"],.emojione[title=\":heavy_dollar_sign:\"],.emojione[title=\":heavy_division_sign:\"],.emojione[title=\":heavy_check_mark:\"],.emojione[title=\":guardsman:\"],.emojione[title=\":gorilla:\"],.emojione[title=\":fried_egg:\"],.emojione[title=\":film_projector:\"],.emojione[title=\":female-guard:\"],.emojione[title=\":end:\"],.emojione[title=\":electric_plug:\"],.emojione[title=\":eight_pointed_black_star:\"],.emojione[title=\":dark_sunglasses:\"],.emojione[title=\":currency_exchange:\"],.emojione[title=\":curly_loop:\"],.emojione[title=\":copyright:\"],.emojione[title=\":clubs:\"],.emojione[title=\":camera_with_flash:\"],.emojione[title=\":camera:\"],.emojione[title=\":busts_in_silhouette:\"],.emojione[title=\":bust_in_silhouette:\"],.emojione[title=\":bowling:\"],.emojione[title=\":bomb:\"],.emojione[title=\":black_small_square:\"],.emojione[title=\":black_nib:\"],.emojione[title=\":black_medium_square:\"],.emojione[title=\":black_medium_small_square:\"],.emojione[title=\":black_large_square:\"],.emojione[title=\":black_heart:\"],.emojione[title=\":black_circle:\"],.emojione[title=\":back:\"],.emojione[title=\":ant:\"],.emojione[title=\":8ball:\"]{filter:drop-shadow(1px 1px 0 #ffffff) drop-shadow(-1px 1px 0 #ffffff) drop-shadow(1px -1px 0 #ffffff) drop-shadow(-1px -1px 0 #ffffff);transform:scale(0.71)}@media screen and (min-width: 1300px){.column{flex-grow:1 !important;max-width:400px}.drawer{width:17%;max-width:400px;min-width:330px}}.media-gallery,.video-player{max-height:30vh;height:30vh !important;position:relative;margin-top:20px;margin-left:-68px;width:calc(100% + 80px) !important;max-width:calc(100% + 80px)}.detailed-status .media-gallery,.detailed-status .video-player{margin-left:-5px;width:calc(100% + 9px);max-width:calc(100% + 9px)}.video-player video{transform:unset;top:unset}.detailed-status .media-spoiler,.status .media-spoiler{height:100% !important;vertical-align:middle}body{font-size:13px;font-family:\"MS Sans Serif\",\"premillenium\",sans-serif;color:#000}.ui,.ui .columns-area,body.admin{background:teal}.loading-bar{height:5px;background-color:navy}.tabs-bar{background:#bfbfbf;box-shadow:inset -1px -1px 0px #000,inset 1px 1px 0px #fff,inset -2px -2px 0px gray,inset 2px 2px 0px #dfdfdf;border-radius:0px;height:30px}.tabs-bar__link{color:#000;border:2px outset #bfbfbf;border-top-width:1px;border-left-width:1px;margin:2px;padding:3px}.tabs-bar__link.active{box-shadow:inset 1px 1px 0px #000,inset -1px -1px 0px #fff,inset 2px 2px 0px gray,inset -2px -2px 0px #dfdfdf;border-width:0px;border-radius:0px;color:#000}.tabs-bar__link:last-child::before{content:\"Start\";color:#000;font-weight:bold;font-size:15px;width:80%;display:block;position:absolute;right:0px}.tabs-bar__link:last-child{position:relative;flex-basis:60px !important;font-size:0px;color:#bfbfbf;background-image:url(\"~images/start.png\");background-repeat:no-repeat;background-position:8%;background-clip:padding-box;background-size:auto 50%}.drawer .drawer__inner{overflow:visible;height:inherit;background:#bfbfbf}.drawer:after{display:block;content:\" \";position:absolute;bottom:15px;left:15px;width:132px;height:117px;background-image:url(\"~images/clippy_wave.gif\"),url(\"~images/clippy_frame.png\");background-repeat:no-repeat;background-position:4px 20px,0px 0px;z-index:0}.drawer__pager{overflow-y:auto;z-index:1}.privacy-dropdown__dropdown{z-index:2}.column{max-height:100vh}.column>.scrollable{background:#bfbfbf;border-left:2px solid #efefef;border-top:2px solid #efefef;border-right:2px solid #404040;border-bottom:2px solid #404040;border-radius:0px;border-top-width:0px}.column-header__wrapper{color:#fff;font-weight:bold;background:#7f7f7f}.column-header{padding:2px;font-size:13px;background:#7f7f7f;border-left:2px solid #efefef;border-top:2px solid #efefef;border-right:2px solid #404040;border-bottom:2px solid #404040;border-radius:0px;border-bottom-width:0px;color:#fff;font-weight:bold;align-items:baseline}.column-header__wrapper.active{background:#00007f}.column-header__wrapper.active::before{display:none}.column-header.active{box-shadow:unset;background:#00007f}.column-header.active .column-header__icon{color:#fff}.column-header__buttons{max-height:20px;margin-right:0px}.column-header__button{background:#bfbfbf;color:#000;line-height:0px;font-size:14px;max-height:20px;padding:0px 2px;margin-top:2px;box-shadow:inset -1px -1px 0px #000,inset 1px 1px 0px #fff,inset -2px -2px 0px gray,inset 2px 2px 0px #dfdfdf;border-radius:0px}.column-header__button:hover{color:#000}.column-header__button.active,.column-header__button.active:hover{box-shadow:inset 1px 1px 0px #000,inset -1px -1px 0px #fff,inset 2px 2px 0px gray,inset -2px -2px 0px #dfdfdf;border-width:0px;border-radius:0px;background-color:#7f7f7f}.column-header__back-button{background:#bfbfbf;color:#000;padding:2px;max-height:20px;margin-top:2px;box-shadow:inset -1px -1px 0px #000,inset 1px 1px 0px #fff,inset -2px -2px 0px gray,inset 2px 2px 0px #dfdfdf;border-radius:0px;font-size:13px;font-weight:bold}.column-back-button{background:#bfbfbf;color:#000;box-shadow:inset -1px -1px 0px #000,inset 1px 1px 0px #fff,inset -2px -2px 0px gray,inset 2px 2px 0px #dfdfdf;border-radius:0px;padding:2px;font-size:13px;font-weight:bold}.column-back-button--slim-button{position:absolute;top:-22px;right:4px;max-height:20px;max-width:60px;padding:0px 2px}.column-back-button__icon{font-size:11px;margin-top:-3px}.column-header__collapsible{border-left:2px outset #bfbfbf;border-right:2px outset #bfbfbf}.column-header__collapsible-inner{background:#bfbfbf;color:#000}.column-header__collapsible__extra{color:#000}.column-header__collapsible__extra div[role=group]{border:2px groove #bfbfbf;border-radius:4px;margin-bottom:8px;padding:4px}.column-inline-form{background-color:#bfbfbf;border-left:2px solid #efefef;border-top:2px solid #efefef;border-right:2px solid #404040;border-bottom:2px solid #404040;border-radius:0px;border-bottom-width:0px;border-top-width:0px}.column-settings__section{color:#000;font-weight:bold;font-size:11px;position:relative;top:-12px;left:4px;background-color:#bfbfbf;display:inline-block;padding:0px 4px;margin-bottom:0px}.setting-meta__label,.setting-toggle__label{color:#000;font-weight:normal}.setting-meta__label span:before{content:\"(\"}.setting-meta__label span:after{content:\")\"}.setting-toggle{line-height:13px}.react-toggle .react-toggle-track{border-radius:0px;background-color:#fff;border-left:2px solid #404040;border-top:2px solid #404040;border-right:2px solid #efefef;border-bottom:2px solid #efefef;border-radius:0px;width:12px;height:12px}.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track{background-color:#fff}.react-toggle .react-toggle-track-check{left:2px;transition:unset}.react-toggle .react-toggle-track-check svg path{fill:#000}.react-toggle .react-toggle-track-x{display:none}.react-toggle .react-toggle-thumb{border-radius:0px;display:none}.text-btn{background-color:#bfbfbf;box-shadow:inset -1px -1px 0px #000,inset 1px 1px 0px #fff,inset -2px -2px 0px gray,inset 2px 2px 0px #dfdfdf;border-radius:0px;padding:4px}.text-btn:hover{text-decoration:none;color:#000}.text-btn:active{box-shadow:inset 1px 1px 0px #000,inset -1px -1px 0px #fff,inset 2px 2px 0px gray,inset -2px -2px 0px #dfdfdf;border-width:0px;border-radius:0px}.setting-text{color:#000;background-color:#fff;box-shadow:inset 1px 1px 0px #000,inset -1px -1px 0px #fff,inset 2px 2px 0px gray,inset -2px -2px 0px #dfdfdf;border-width:0px;border-radius:0px;font-size:13px;padding:2px}.setting-text:active,.setting-text:focus,.setting-text.light:active,.setting-text.light:focus{color:#000;border-bottom:2px inset #bfbfbf}.column-header__setting-arrows .column-header__setting-btn{padding:3px 10px}.column-header__setting-arrows .column-header__setting-btn:last-child{padding:3px 10px}.missing-indicator{background-color:#bfbfbf;color:#000;box-shadow:inset -1px -1px 0px #000,inset 1px 1px 0px #fff,inset -2px -2px 0px gray,inset 2px 2px 0px #dfdfdf;border-radius:0px}.missing-indicator>div{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRUaXRsZQAACJnLyy9Jyy/NSwEAD5IDblIFOhoAAAAXelRYdEF1dGhvcgAACJlLzijKz0vMAQALmgLoDsFj8gAAAQpJREFUOMuVlD0OwjAMhd2oQl04Axfo0IGBgYELcAY6cqQuSO0ZOEAZGBg6VKg74gwsEaoESRVHjusI8aQqzY8/PbtOEz1qkFSn2YevlaNOpLMJh2DwvixhuXtOa6/LCh51DUMEFkAsgAZD207Doin8mQ562JpRE5CHBAAhmIqD1L8AqzUUUJkxc6kr3AgAJ+NuvIWRdk7WcrKl0AUqcIBBHOiEbpS4m27mIL5Onfg3k0rgggeQuS2sDOGSahKR+glgqaGLgUJs951NN1q9D72cQqQWR9cr3sm9YcEssEuz6eEuZh2bu0aSOhQ1MBezu2O/+TVSvEFII3qLsZWrSA2AAUQIh1HpyP/kC++zjVSMj6ntAAAAAElFTkSuQmCC\") no-repeat;background-position:center center}.empty-column-indicator,.error-column{background:#bfbfbf;color:#000}.status__wrapper{border:2px groove #bfbfbf;margin:4px}.status{border-left:1px solid #404040;border-top:1px solid #404040;border-right:1px solid #efefef;border-bottom:1px solid #efefef;border-radius:0px;background-color:#fff;margin:4px;padding-bottom:40px;margin-bottom:8px}.status.status-direct{background-color:#bfbfbf}.status__content{font-size:13px}.status.light .status__relative-time,.status.light .display-name span{color:#7f7f7f}.status__action-bar{box-sizing:border-box;position:absolute;bottom:-1px;left:-1px;background:#bfbfbf;width:calc(100% + 2px);padding-left:10px;padding:4px 2px;padding-bottom:4px;border-bottom:2px groove #bfbfbf;border-top:1px outset #bfbfbf;text-align:right}.status__wrapper .status__action-bar{border-bottom-width:0px}.status__action-bar-button{float:right}.status__action-bar-dropdown{margin-left:auto;margin-right:10px}.status__action-bar-dropdown .icon-button{min-width:28px}.status.light .status__content a{color:blue}.focusable:focus{background:#bfbfbf}.focusable:focus .detailed-status__action-bar{background:#bfbfbf}.focusable:focus .status,.focusable:focus .detailed-status{background:#fff;outline:2px dotted gray}.dropdown__trigger.icon-button{padding-right:6px}.detailed-status__action-bar-dropdown .icon-button{min-width:28px}.detailed-status{background:#fff;background-clip:padding-box;margin:4px;border:2px groove #bfbfbf;padding:4px}.detailed-status__display-name{color:#7f7f7f}.detailed-status__display-name strong{color:#000;font-weight:bold}.account__avatar,.account__avatar-overlay-base,.account__header__avatar,.account__avatar-overlay-overlay{border-left:1px solid #404040;border-top:1px solid #404040;border-right:1px solid #efefef;border-bottom:1px solid #efefef;border-radius:0px;clip-path:none;filter:saturate(1.8) brightness(1.1)}.detailed-status__action-bar{background-color:#bfbfbf;border:0px;border-bottom:2px groove #bfbfbf;margin-bottom:8px;justify-items:left;padding-left:4px}.icon-button{background:#bfbfbf;border-left:2px solid #efefef;border-top:2px solid #efefef;border-right:2px solid #404040;border-bottom:2px solid #404040;border-radius:0px;padding:0px 0px 0px 0px;margin-right:4px;color:#3f3f3f}.icon-button.inverted,.icon-button:hover,.icon-button.inverted:hover,.icon-button:active,.icon-button:focus{color:#3f3f3f}.icon-button:active{border-left:2px solid #404040;border-top:2px solid #404040;border-right:2px solid #efefef;border-bottom:2px solid #efefef;border-radius:0px}.status__action-bar>.icon-button{padding:0px 15px 0px 0px;min-width:25px}.icon-button.star-icon,.icon-button.star-icon:active{background:transparent;border:none}.icon-button.star-icon.active{color:#ca8f04}.icon-button.star-icon.active:active,.icon-button.star-icon.active:hover,.icon-button.star-icon.active:focus{color:#ca8f04}.icon-button.star-icon>i{background:#bfbfbf;border-left:2px solid #efefef;border-top:2px solid #efefef;border-right:2px solid #404040;border-bottom:2px solid #404040;border-radius:0px;padding-bottom:3px}.icon-button.star-icon:active>i{border-left:2px solid #404040;border-top:2px solid #404040;border-right:2px solid #efefef;border-bottom:2px solid #efefef;border-radius:0px}.text-icon-button{color:#404040}.detailed-status__action-bar-dropdown{margin-left:auto;justify-content:right;padding-right:16px}.detailed-status__button{flex:0 0 auto}.detailed-status__button .icon-button{padding-left:2px;padding-right:25px}.status-card{border-radius:0px;background:#fff;border:1px solid #000;color:#000}.status-card:hover{background-color:#fff}.status-card__title{color:blue;text-decoration:underline;font-weight:bold}.load-more{width:auto;margin:5px auto;background:#bfbfbf;box-shadow:inset -1px -1px 0px #000,inset 1px 1px 0px #fff,inset -2px -2px 0px gray,inset 2px 2px 0px #dfdfdf;border-radius:0px;color:#000;padding:2px 5px}.load-more:hover{background:#bfbfbf;color:#000}.status-card__description{color:#000}.account__display-name strong,.status__display-name strong{color:#000;font-weight:bold}.account .account__display-name{color:#000}.account{border-bottom:2px groove #bfbfbf}.reply-indicator__content .status__content__spoiler-link,.status__content .status__content__spoiler-link{background:#bfbfbf;box-shadow:inset -1px -1px 0px #000,inset 1px 1px 0px #fff,inset -2px -2px 0px gray,inset 2px 2px 0px #dfdfdf;border-radius:0px}.reply-indicator__content .status__content__spoiler-link:hover,.status__content .status__content__spoiler-link:hover{background:#bfbfbf}.reply-indicator__content .status__content__spoiler-link:active,.status__content .status__content__spoiler-link:active{box-shadow:inset 1px 1px 0px #000,inset -1px -1px 0px #fff,inset 2px 2px 0px gray,inset -2px -2px 0px #dfdfdf;border-width:0px;border-radius:0px}.reply-indicator__content a,.status__content a{color:blue}.notification{border:2px groove #bfbfbf;margin:4px}.notification__message{color:#000;font-size:13px}.notification__display-name{font-weight:bold}.drawer__header{background:#bfbfbf;border-left:2px solid #efefef;border-top:2px solid #efefef;border-right:2px solid #404040;border-bottom:2px solid #404040;border-radius:0px;justify-content:left;margin-bottom:0px;padding-bottom:2px;border-bottom:2px groove #bfbfbf}.drawer__tab{color:#000;box-shadow:inset -1px -1px 0px #000,inset 1px 1px 0px #fff,inset -2px -2px 0px gray,inset 2px 2px 0px #dfdfdf;border-radius:0px;padding:5px;margin:2px;flex:0 0 auto}.drawer__tab:first-child::before{content:\"Start\";color:#000;font-weight:bold;font-size:15px;width:80%;display:block;position:absolute;right:0px}.drawer__tab:first-child{position:relative;padding:5px 15px;width:40px;font-size:0px;color:#bfbfbf;background-image:url(\"~images/start.png\");background-repeat:no-repeat;background-position:8%;background-clip:padding-box;background-size:auto 50%}.drawer__header a:hover{background-color:transparent}.drawer__header a:first-child:hover{background-image:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAIAAACpTQvdAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRBdXRob3IAAAiZS84oys9LzAEAC5oC6A7BY/IAAACWSURBVCiRhVJJDsQgDEuqOfRZ7a1P5gbP4uaJaEjTADMWQhHYjlk4p0wLnNdptdF4KvBUDyGzVwc2xO+uKtH+1o0ytEEmqFpuxlvFCGCxKbNIT56QCi2MzaA/2Mz+mERSOeqzJG2RUxkjdTabgPtFoZ1bZxcKvgPcLZVufAyR9Ni8v5dWDzfFx0giC1RvZFv6l35QQ/Mvv39XXgGzQpoAAAAASUVORK5CYII=\");background-repeat:no-repeat;background-position:8%;background-clip:padding-box;background-size:auto 50%;transition:unset}.search{background:#bfbfbf;padding-top:2px;padding:2px;border:2px outset #bfbfbf;border-top-width:0px;border-bottom:2px groove #bfbfbf;margin-bottom:0px}.search input{background-color:#fff;color:#000;border-left:1px solid #404040;border-top:1px solid #404040;border-right:1px solid #efefef;border-bottom:1px solid #efefef;border-radius:0px}.search__input:focus{background-color:#fff}.search-popout{box-shadow:unset;color:#000;border-radius:0px;background-color:#ffc;border:1px solid #000}.search-popout h4{color:#000;text-transform:none;font-weight:bold}.search-results__header{background-color:#bfbfbf;color:#000;border-bottom:2px groove #bfbfbf}.search-results__hashtag{color:blue}.search-results__section .account:hover,.search-results__section .account:hover .account__display-name,.search-results__section .account:hover .account__display-name strong,.search-results__section .search-results__hashtag:hover{background-color:#00007f;color:#fff}.search__icon .fa{color:gray}.search__icon .fa.active{opacity:1}.search__icon .fa:hover{color:gray}.drawer__inner,.drawer__inner.darker{background-color:#bfbfbf;border:2px outset #bfbfbf;border-top-width:0px}.navigation-bar{color:#000}.navigation-bar strong{color:#000;font-weight:bold}.compose-form .autosuggest-textarea__textarea,.compose-form .spoiler-input__input{border-radius:0px;border-left:1px solid #404040;border-top:1px solid #404040;border-right:1px solid #efefef;border-bottom:1px solid #efefef;border-radius:0px}.compose-form .autosuggest-textarea__textarea{border-bottom:0px}.compose-form__uploads-wrapper{border-radius:0px;border-bottom:1px inset #bfbfbf;border-top-width:0px}.compose-form__upload-wrapper{border-left:1px inset #bfbfbf;border-right:1px inset #bfbfbf}.compose-form .compose-form__buttons-wrapper{background-color:#bfbfbf;border:2px groove #bfbfbf;margin-top:4px;padding:4px 8px}.compose-form__buttons{background-color:#bfbfbf;border-radius:0px;box-shadow:unset}.compose-form__buttons-separator{border-left:2px groove #bfbfbf}.privacy-dropdown.active .privacy-dropdown__value.active,.advanced-options-dropdown.open .advanced-options-dropdown__value{background:#bfbfbf}.privacy-dropdown.active .privacy-dropdown__value.active .icon-button{color:#404040}.privacy-dropdown.active .privacy-dropdown__value{background:#bfbfbf;box-shadow:unset}.privacy-dropdown__option.active,.privacy-dropdown__option:hover,.privacy-dropdown__option.active:hover{background:#00007f}.privacy-dropdown__dropdown,.privacy-dropdown.active .privacy-dropdown__dropdown,.advanced-options-dropdown__dropdown,.advanced-options-dropdown.open .advanced-options-dropdown__dropdown{box-shadow:unset;color:#000;box-shadow:inset -1px -1px 0px #000,inset 1px 1px 0px #fff,inset -2px -2px 0px gray,inset 2px 2px 0px #dfdfdf;border-radius:0px;background:#bfbfbf}.privacy-dropdown__option__content{color:#000}.privacy-dropdown__option__content strong{font-weight:bold}.compose-form__warning::before{content:\"Tip:\";font-weight:bold;display:block;position:absolute;top:-10px;background-color:#bfbfbf;font-size:11px;padding:0px 5px}.compose-form__warning{position:relative;box-shadow:unset;border:2px groove #bfbfbf;background-color:#bfbfbf;color:#000}.compose-form__warning a{color:blue}.compose-form__warning strong{color:#000;text-decoration:underline}.compose-form__buttons button.active:last-child{border-left:2px solid #404040;border-top:2px solid #404040;border-right:2px solid #efefef;border-bottom:2px solid #efefef;border-radius:0px;background:#dfdfdf;color:#7f7f7f}.compose-form__upload-thumbnail{border-radius:0px;border:2px groove #bfbfbf;background-color:#bfbfbf;padding:2px;box-sizing:border-box}.compose-form__upload-thumbnail .icon-button{max-width:20px;max-height:20px;line-height:10px !important}.compose-form__upload-thumbnail .icon-button::before{content:\"X\";font-size:13px;font-weight:bold;color:#000}.compose-form__upload-thumbnail .icon-button i{display:none}.emoji-picker-dropdown__menu{z-index:2}.emoji-dialog.with-search{box-shadow:unset;border-radius:0px;background-color:#bfbfbf;border:1px solid #000;box-sizing:content-box}.emoji-dialog .emoji-search{color:#000;background-color:#fff;border-radius:0px;box-shadow:inset 1px 1px 0px #000,inset -1px -1px 0px #fff,inset 2px 2px 0px gray,inset -2px -2px 0px #dfdfdf;border-width:0px;border-radius:0px}.emoji-dialog .emoji-search-wrapper{border-bottom:2px groove #bfbfbf}.emoji-dialog .emoji-category-title{color:#000;font-weight:bold}.reply-indicator{background-color:#bfbfbf;border-radius:3px;border:2px groove #bfbfbf}.button{background-color:#bfbfbf;box-shadow:inset -1px -1px 0px #000,inset 1px 1px 0px #fff,inset -2px -2px 0px gray,inset 2px 2px 0px #dfdfdf;border-radius:0px;border-radius:0px;color:#000;font-weight:bold}.button:hover,.button:focus,.button:disabled{background-color:#bfbfbf}.button:active{box-shadow:inset 1px 1px 0px #000,inset -1px -1px 0px #fff,inset 2px 2px 0px gray,inset -2px -2px 0px #dfdfdf;border-width:0px;border-radius:0px}.button:disabled{color:gray;text-shadow:1px 1px 0px #efefef}.button:disabled:active{box-shadow:inset -1px -1px 0px #000,inset 1px 1px 0px #fff,inset -2px -2px 0px gray,inset 2px 2px 0px #dfdfdf;border-radius:0px}#Getting-started{background-color:#bfbfbf;box-shadow:inset 1px 1px 0px #000,inset -1px -1px 0px #fff,inset 2px 2px 0px gray,inset -2px -2px 0px #dfdfdf;border-width:0px;border-radius:0px;border-bottom-width:0px}#Getting-started::before{content:\"Start\";color:#000;font-weight:bold;font-size:15px;width:80%;text-align:center;display:block;position:absolute;right:2px}#Getting-started{position:relative;padding:5px 15px;width:60px;font-size:0px;color:#bfbfbf;background-image:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAIAAACpTQvdAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRBdXRob3IAAAiZS84oys9LzAEAC5oC6A7BY/IAAACWSURBVCiRhVJJDsQgDEuqOfRZ7a1P5gbP4uaJaEjTADMWQhHYjlk4p0wLnNdptdF4KvBUDyGzVwc2xO+uKtH+1o0ytEEmqFpuxlvFCGCxKbNIT56QCi2MzaA/2Mz+mERSOeqzJG2RUxkjdTabgPtFoZ1bZxcKvgPcLZVufAyR9Ni8v5dWDzfFx0giC1RvZFv6l35QQ/Mvv39XXgGzQpoAAAAASUVORK5CYII=\");background-repeat:no-repeat;background-position:8%;background-clip:padding-box;background-size:auto 50%}.column-subheading{background-color:#bfbfbf;color:#000;border-bottom:2px groove #bfbfbf;text-transform:none;font-size:16px}.column-link{background-color:transparent;color:#000}.column-link:hover{background-color:#00007f;color:#fff}.getting-started__wrapper .column-subheading{font-size:0px;margin:0px;padding:0px}.getting-started__wrapper .column-link{background-size:32px 32px;background-repeat:no-repeat;background-position:36px 50%;padding-left:40px}.getting-started__wrapper .column-link:hover{background-size:32px 32px;background-repeat:no-repeat;background-position:36px 50%}.getting-started__wrapper .column-link i{font-size:0px;width:32px}.column-link[href=\"/web/timelines/public\"]{background-image:url(\"~images/icon_public.png\")}.column-link[href=\"/web/timelines/public\"]:hover{background-image:url(\"~images/icon_public.png\")}.column-link[href=\"/web/timelines/public/local\"]{background-image:url(\"~images/icon_local.png\")}.column-link[href=\"/web/timelines/public/local\"]:hover{background-image:url(\"~images/icon_local.png\")}.column-link[href=\"/web/pinned\"]{background-image:url(\"~images/icon_pin.png\")}.column-link[href=\"/web/pinned\"]:hover{background-image:url(\"~images/icon_pin.png\")}.column-link[href=\"/web/favourites\"]{background-image:url(\"~images/icon_likes.png\")}.column-link[href=\"/web/favourites\"]:hover{background-image:url(\"~images/icon_likes.png\")}.column-link[href=\"/web/lists\"]{background-image:url(\"~images/icon_lists.png\")}.column-link[href=\"/web/lists\"]:hover{background-image:url(\"~images/icon_lists.png\")}.column-link[href=\"/web/follow_requests\"]{background-image:url(\"~images/icon_follow_requests.png\")}.column-link[href=\"/web/follow_requests\"]:hover{background-image:url(\"~images/icon_follow_requests.png\")}.column-link[href=\"/web/keyboard-shortcuts\"]{background-image:url(\"~images/icon_keyboard_shortcuts.png\")}.column-link[href=\"/web/keyboard-shortcuts\"]:hover{background-image:url(\"~images/icon_keyboard_shortcuts.png\")}.column-link[href=\"/web/blocks\"]{background-image:url(\"~images/icon_blocks.png\")}.column-link[href=\"/web/blocks\"]:hover{background-image:url(\"~images/icon_blocks.png\")}.column-link[href=\"/web/mutes\"]{background-image:url(\"~images/icon_mutes.png\")}.column-link[href=\"/web/mutes\"]:hover{background-image:url(\"~images/icon_mutes.png\")}.column-link[href=\"/settings/preferences\"]{background-image:url(\"~images/icon_settings.png\")}.column-link[href=\"/settings/preferences\"]:hover{background-image:url(\"~images/icon_settings.png\")}.column-link[href=\"/about/more\"]{background-image:url(\"~images/icon_about.png\")}.column-link[href=\"/about/more\"]:hover{background-image:url(\"~images/icon_about.png\")}.column-link[href=\"/auth/sign_out\"]{background-image:url(\"~images/icon_logout.png\")}.column-link[href=\"/auth/sign_out\"]:hover{background-image:url(\"~images/icon_logout.png\")}.getting-started__footer{display:none}.getting-started__wrapper::before{content:\"Mastodon 95\";font-weight:bold;font-size:23px;color:#fff;line-height:30px;padding-left:20px;padding-right:40px;left:0px;bottom:-30px;display:block;position:absolute;background-color:#7f7f7f;width:200%;height:30px;-ms-transform:rotate(-90deg);-webkit-transform:rotate(-90deg);transform:rotate(-90deg);transform-origin:top left}.getting-started__wrapper{border-left:2px solid #efefef;border-top:2px solid #efefef;border-right:2px solid #404040;border-bottom:2px solid #404040;border-radius:0px;background-color:#bfbfbf}.column .static-content.getting-started{display:none}.keyboard-shortcuts kbd{background-color:#bfbfbf}.account__header{background-color:#7f7f7f}.account__header .account__header__content{color:#fff}.account-authorize__wrapper{border:2px groove #bfbfbf;margin:2px;padding:2px}.account--panel{background-color:#bfbfbf;border:0px;border-top:2px groove #bfbfbf}.account-authorize .account__header__content{color:#000;margin:10px}.account__action-bar__tab>span{color:#000;font-weight:bold}.account__action-bar__tab strong{color:#000}.account__action-bar{border:unset}.account__action-bar__tab{border:1px outset #bfbfbf}.account__action-bar__tab:active{box-shadow:inset 1px 1px 0px #000,inset -1px -1px 0px #fff,inset 2px 2px 0px gray,inset -2px -2px 0px #dfdfdf;border-width:0px;border-radius:0px}.dropdown--active .dropdown__content>ul,.dropdown-menu{background:#ffc;border-radius:0px;border:1px solid #000;box-shadow:unset}.dropdown-menu a{background-color:transparent}.dropdown--active::after{display:none}.dropdown--active .icon-button{color:#000;box-shadow:inset 1px 1px 0px #000,inset -1px -1px 0px #fff,inset 2px 2px 0px gray,inset -2px -2px 0px #dfdfdf;border-width:0px;border-radius:0px}.dropdown--active .dropdown__content>ul>li>a{background:transparent}.dropdown--active .dropdown__content>ul>li>a:hover{background:transparent;color:#000;text-decoration:underline}.dropdown__sep,.dropdown-menu__separator{border-color:#7f7f7f}.detailed-status__action-bar-dropdown .dropdown--active .dropdown__content.dropdown__left{left:unset}.dropdown>.icon-button,.detailed-status__button>.icon-button,.status__action-bar>.icon-button,.star-icon i{height:25px !important;width:28px !important;box-sizing:border-box}.status__action-bar-button .fa-floppy-o{padding-top:2px}.status__action-bar-dropdown{position:relative;top:-3px}.detailed-status__action-bar-dropdown .dropdown{position:relative;top:-4px}.notification .status__action-bar{border-bottom:none}.notification .status{margin-bottom:4px}.status__wrapper .status{margin-bottom:3px}.status__wrapper{margin-bottom:8px}.icon-button .fa-retweet{position:relative;top:-1px}.embed-modal,.error-modal,.onboarding-modal,.actions-modal,.boost-modal,.confirmation-modal,.report-modal{box-shadow:inset -1px -1px 0px #000,inset 1px 1px 0px #fff,inset -2px -2px 0px gray,inset 2px 2px 0px #dfdfdf;border-radius:0px;background:#bfbfbf}.actions-modal::before,.boost-modal::before,.confirmation-modal::before,.report-modal::before{content:\"Confirmation\";display:block;background:#00007f;color:#fff;font-weight:bold;padding-left:2px}.boost-modal::before{content:\"Boost confirmation\"}.boost-modal__action-bar>div>span:before{content:\"Tip: \";font-weight:bold}.boost-modal__action-bar,.confirmation-modal__action-bar,.report-modal__action-bar{background:#bfbfbf;margin-top:-15px}.embed-modal h4,.error-modal h4,.onboarding-modal h4{background:#00007f;color:#fff;font-weight:bold;padding:2px;font-size:13px;text-align:left}.confirmation-modal__action-bar .confirmation-modal__cancel-button{color:#000}.confirmation-modal__action-bar .confirmation-modal__cancel-button:active,.confirmation-modal__action-bar .confirmation-modal__cancel-button:focus,.confirmation-modal__action-bar .confirmation-modal__cancel-button:hover{color:#000}.confirmation-modal__action-bar .confirmation-modal__cancel-button:active{box-shadow:inset 1px 1px 0px #000,inset -1px -1px 0px #fff,inset 2px 2px 0px gray,inset -2px -2px 0px #dfdfdf;border-width:0px;border-radius:0px}.embed-modal .embed-modal__container .embed-modal__html,.embed-modal .embed-modal__container .embed-modal__html:focus{background:#fff;color:#000;box-shadow:inset 1px 1px 0px #000,inset -1px -1px 0px #fff,inset 2px 2px 0px gray,inset -2px -2px 0px #dfdfdf;border-width:0px;border-radius:0px}.modal-root__overlay,.account__header>div{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAFnpUWHRUaXRsZQAACJnLzU9JzElKBwALgwLXaCRlPwAAABd6VFh0QXV0aG9yAAAImUvOKMrPS8wBAAuaAugOwWPyAAAAEUlEQVQImWNgYGD4z4AE/gMADwMB/414xEUAAAAASUVORK5CYII=\")}.admin-wrapper::before{position:absolute;top:0px;content:\"Control Panel\";color:#fff;background-color:#00007f;font-size:13px;font-weight:bold;width:calc(100%);margin:2px;display:block;padding:2px;padding-left:22px;box-sizing:border-box}.admin-wrapper{position:relative;background:#bfbfbf;box-shadow:inset -1px -1px 0px #000,inset 1px 1px 0px #fff,inset -2px -2px 0px gray,inset 2px 2px 0px #dfdfdf;border-radius:0px;width:70vw;height:80vh;margin:10vh auto;color:#000;padding-top:24px;flex-direction:column;overflow:hidden}@media screen and (max-width: 1120px){.admin-wrapper{width:90vw;height:95vh;margin:2.5vh auto}}@media screen and (max-width: 740px){.admin-wrapper{width:100vw;height:95vh;height:calc(100vh - 24px);margin:0px 0px 0px 0px}}.admin-wrapper .sidebar-wrapper{position:static;height:auto;flex:0 0 auto;margin:2px}.admin-wrapper .content-wrapper{flex:1 1 auto;width:calc(100% - 20px);border-left:2px solid #efefef;border-top:2px solid #efefef;border-right:2px solid #404040;border-bottom:2px solid #404040;border-radius:0px;position:relative;margin-left:10px;margin-right:10px;margin-bottom:40px;box-sizing:border-box}.admin-wrapper .content{background-color:#bfbfbf;width:100%;max-width:100%;min-height:100%;box-sizing:border-box;position:relative}.admin-wrapper .sidebar{position:static;background:#bfbfbf;color:#000;width:100%;height:auto;padding-bottom:20px}.admin-wrapper .sidebar .logo{position:absolute;top:2px;left:4px;width:18px;height:18px;margin:0px}.admin-wrapper .sidebar>ul{background:#bfbfbf;margin:0px;margin-left:8px;color:#000}.admin-wrapper .sidebar>ul>li{display:inline-block}.admin-wrapper .sidebar>ul>li#settings,.admin-wrapper .sidebar>ul>li#admin{padding:2px;border:0px solid transparent}.admin-wrapper .sidebar>ul>li#logout{position:absolute;box-shadow:inset -1px -1px 0px #000,inset 1px 1px 0px #fff,inset -2px -2px 0px gray,inset 2px 2px 0px #dfdfdf;border-radius:0px;right:12px;bottom:10px}.admin-wrapper .sidebar>ul>li#web{display:inline-block;box-shadow:inset -1px -1px 0px #000,inset 1px 1px 0px #fff,inset -2px -2px 0px gray,inset 2px 2px 0px #dfdfdf;border-radius:0px;position:absolute;left:12px;bottom:10px}.admin-wrapper .sidebar>ul>li>a{display:inline-block;box-shadow:inset -1px 0px 0px #000,inset 1px 0px 0px #fff,inset 0px 1px 0px #fff,inset 0px 2px 0px #dfdfdf,inset -2px 0px 0px gray,inset 2px 0px 0px #dfdfdf;border-radius:0px;border-top-left-radius:1px;border-top-right-radius:1px;padding:2px 5px;margin:0px;color:#000;vertical-align:baseline}.admin-wrapper .sidebar>ul>li>a.selected{background:#bfbfbf;color:#000;padding-top:4px;padding-bottom:4px}.admin-wrapper .sidebar>ul>li>a:hover{background:#bfbfbf;color:#000}.admin-wrapper .sidebar>ul>li>ul{width:calc(100% - 20px);background:transparent;position:absolute;left:10px;top:54px;z-index:3}.admin-wrapper .sidebar>ul>li>ul>li{background:#bfbfbf;display:inline-block;vertical-align:baseline}.admin-wrapper .sidebar>ul>li>ul>li>a{background:#bfbfbf;box-shadow:inset -1px 0px 0px #000,inset 1px 0px 0px #fff,inset 0px 1px 0px #fff,inset 0px 2px 0px #dfdfdf,inset -2px 0px 0px gray,inset 2px 0px 0px #dfdfdf;border-radius:0px;border-top-left-radius:1px;border-top-right-radius:1px;color:#000;padding:2px 5px;position:relative;z-index:3}.admin-wrapper .sidebar>ul>li>ul>li>a.selected{background:#bfbfbf;color:#000;padding-bottom:4px;padding-top:4px;padding-right:7px;margin-left:-2px;margin-right:-2px;position:relative;z-index:4}.admin-wrapper .sidebar>ul>li>ul>li>a.selected:first-child{margin-left:0px}.admin-wrapper .sidebar>ul>li>ul>li>a.selected:hover{background:transparent;color:#000}.admin-wrapper .sidebar>ul>li>ul>li>a:hover{background:#bfbfbf;color:#000}@media screen and (max-width: 1520px){.admin-wrapper .sidebar>ul>li>ul{max-width:1000px}.admin-wrapper .sidebar{padding-bottom:45px}}@media screen and (max-width: 600px){.admin-wrapper .sidebar>ul>li>ul{max-width:500px}.admin-wrapper .sidebar{padding:0px;padding-bottom:70px;width:100%;height:auto}.admin-wrapper .content-wrapper{overflow:auto;height:80%;height:calc(100% - 150px)}}.flash-message{background-color:#ffc;color:#000;border:1px solid #000;border-radius:0px;position:absolute;top:0px;left:0px;width:100%}.admin-wrapper table{background-color:#fff;border-left:1px solid #404040;border-top:1px solid #404040;border-right:1px solid #efefef;border-bottom:1px solid #efefef;border-radius:0px}.admin-wrapper .content h2,.simple_form .input.with_label .label_input>label,.admin-wrapper .content h6,.admin-wrapper .content>p,.admin-wrapper .content .muted-hint,.simple_form span.hint,.simple_form h4,.simple_form .check_boxes .checkbox label,.simple_form .input.with_label.boolean .label_input>label,.filters .filter-subset a,.simple_form .input.radio_buttons .radio label,a.table-action-link,a.table-action-link:hover,.simple_form .input.with_block_label>label,.simple_form p.hint{color:#000}.table>tbody>tr:nth-child(2n+1)>td,.table>tbody>tr:nth-child(2n+1)>th{background-color:#fff}.simple_form input[type=text],.simple_form input[type=number],.simple_form input[type=email],.simple_form input[type=password],.simple_form textarea{color:#000;background-color:#fff;border-left:1px solid #404040;border-top:1px solid #404040;border-right:1px solid #efefef;border-bottom:1px solid #efefef;border-radius:0px}.simple_form input[type=text]:active,.simple_form input[type=text]:focus,.simple_form input[type=number]:active,.simple_form input[type=number]:focus,.simple_form input[type=email]:active,.simple_form input[type=email]:focus,.simple_form input[type=password]:active,.simple_form input[type=password]:focus,.simple_form textarea:active,.simple_form textarea:focus{background-color:#fff}.simple_form button,.simple_form .button,.simple_form .block-button{background:#bfbfbf;box-shadow:inset -1px -1px 0px #000,inset 1px 1px 0px #fff,inset -2px -2px 0px gray,inset 2px 2px 0px #dfdfdf;border-radius:0px;color:#000;font-weight:normal}.simple_form button:hover,.simple_form .button:hover,.simple_form .block-button:hover{background:#bfbfbf}.simple_form .warning,.table-form .warning{background:#ffc;color:#000;box-shadow:unset;text-shadow:unset;border:1px solid #000}.simple_form .warning a,.table-form .warning a{color:blue;text-decoration:underline}.simple_form button.negative,.simple_form .button.negative,.simple_form .block-button.negative{background:#bfbfbf}.filters .filter-subset{border:2px groove #bfbfbf;padding:2px}.filters .filter-subset a::before{content:\"\";background-color:#fff;border-radius:50%;border:2px solid #000;border-top-color:#7f7f7f;border-left-color:#7f7f7f;border-bottom-color:#f5f5f5;border-right-color:#f5f5f5;width:12px;height:12px;display:inline-block;vertical-align:middle;margin-right:2px}.filters .filter-subset a.selected::before{background-color:#000;box-shadow:inset 0 0 0 3px #fff}.filters .filter-subset a,.filters .filter-subset a:hover,.filters .filter-subset a.selected{color:#000;border-bottom:0px solid transparent}","// win95 theme from cybrespace.\n\n// Modified by kibi! to use webpack package syntax for urls (eg,\n// `url(~images/…)`) for easy importing into skins.\n\n$win95-bg: #bfbfbf;\n$win95-dark-grey: #404040;\n$win95-mid-grey: #808080;\n$win95-window-header: #00007f;\n$win95-tooltip-yellow: #ffffcc;\n$win95-blue: blue;\n\n$ui-base-lighter-color: $win95-dark-grey;\n$ui-highlight-color: $win95-window-header;\n\n@mixin win95-border-outset() {\n border-left: 2px solid #efefef;\n border-top: 2px solid #efefef;\n border-right: 2px solid #404040;\n border-bottom: 2px solid #404040;\n border-radius:0px;\n}\n\n@mixin win95-outset() {\n box-shadow: inset -1px -1px 0px #000000,\n inset 1px 1px 0px #ffffff,\n inset -2px -2px 0px #808080,\n inset 2px 2px 0px #dfdfdf;\n border-radius:0px;\n}\n\n@mixin win95-border-inset() {\n border-left: 2px solid #404040;\n border-top: 2px solid #404040;\n border-right: 2px solid #efefef;\n border-bottom: 2px solid #efefef;\n border-radius:0px;\n}\n\n@mixin win95-border-slight-inset() {\n border-left: 1px solid #404040;\n border-top: 1px solid #404040;\n border-right: 1px solid #efefef;\n border-bottom: 1px solid #efefef;\n border-radius:0px;\n}\n\n@mixin win95-inset() {\n box-shadow: inset 1px 1px 0px #000000,\n inset -1px -1px 0px #ffffff,\n inset 2px 2px 0px #808080,\n inset -2px -2px 0px #dfdfdf;\n border-width:0px;\n border-radius:0px;\n}\n\n@mixin win95-tab() {\n box-shadow: inset -1px 0px 0px #000000,\n inset 1px 0px 0px #ffffff,\n inset 0px 1px 0px #ffffff,\n inset 0px 2px 0px #dfdfdf,\n inset -2px 0px 0px #808080,\n inset 2px 0px 0px #dfdfdf;\n border-radius:0px;\n border-top-left-radius: 1px;\n border-top-right-radius: 1px;\n}\n\n@mixin win95-reset() {\n box-shadow: unset;\n}\n\n@font-face {\n font-family:\"premillenium\";\n src: url('~fonts/premillenium/MSSansSerif.ttf') format('truetype');\n}\n\n@import 'application';\n\n/* borrowed from cybrespace style: wider columns and full column width images */\n\n@media screen and (min-width: 1300px) {\n .column {\n flex-grow: 1 !important;\n max-width: 400px;\n }\n\n .drawer {\n width: 17%;\n max-width: 400px;\n min-width: 330px;\n }\n}\n\n.media-gallery,\n.video-player {\n max-height:30vh;\n height:30vh !important;\n position:relative;\n margin-top:20px;\n margin-left:-68px;\n width: calc(100% + 80px) !important;\n max-width: calc(100% + 80px);\n}\n\n.detailed-status .media-gallery,\n.detailed-status .video-player {\n margin-left:-5px;\n width: calc(100% + 9px);\n max-width: calc(100% + 9px);\n}\n\n.video-player video {\n transform: unset;\n top: unset;\n}\n\n.detailed-status .media-spoiler,\n.status .media-spoiler {\n height: 100%!important;\n vertical-align: middle;\n}\n\n/* main win95 style */\n\nbody {\n font-size:13px;\n font-family: \"MS Sans Serif\", \"premillenium\", sans-serif;\n color:black;\n}\n\n.ui,\n.ui .columns-area,\nbody.admin {\n background: #008080;\n}\n\n.loading-bar {\n height:5px;\n background-color: #000080;\n}\n\n.tabs-bar {\n background: $win95-bg;\n @include win95-outset();\n height: 30px;\n}\n\n.tabs-bar__link {\n color:black;\n border:2px outset $win95-bg;\n border-top-width: 1px;\n border-left-width: 1px;\n margin:2px;\n padding:3px;\n}\n\n.tabs-bar__link.active {\n @include win95-inset();\n color:black;\n}\n\n.tabs-bar__link:last-child::before {\n content:\"Start\";\n color:black;\n font-weight:bold;\n font-size:15px;\n width:80%;\n display:block;\n position:absolute;\n right:0px;\n}\n\n.tabs-bar__link:last-child {\n position:relative;\n flex-basis:60px !important;\n font-size:0px;\n color:$win95-bg;\n\n background-image: url(\"~images/start.png\");\n background-repeat:no-repeat;\n background-position:8%;\n background-clip:padding-box;\n background-size:auto 50%;\n}\n\n.drawer .drawer__inner {\n overflow: visible;\n height:inherit;\n background:$win95-bg;\n}\n\n.drawer:after {\n display:block;\n content: \" \";\n\n position:absolute;\n bottom:15px;\n left:15px;\n width:132px;\n height:117px;\n background-image:url(\"~images/clippy_wave.gif\"), url(\"~images/clippy_frame.png\");\n background-repeat:no-repeat;\n background-position: 4px 20px, 0px 0px;\n z-index:0;\n}\n\n.drawer__pager {\n overflow-y:auto;\n z-index:1;\n}\n\n.privacy-dropdown__dropdown {\n z-index:2;\n}\n\n.column {\n max-height:100vh;\n}\n\n.column > .scrollable {\n background: $win95-bg;\n @include win95-border-outset();\n border-top-width:0px;\n}\n\n.column-header__wrapper {\n color:white;\n font-weight:bold;\n background:#7f7f7f;\n}\n\n.column-header {\n padding:2px;\n font-size:13px;\n background:#7f7f7f;\n @include win95-border-outset();\n border-bottom-width:0px;\n color:white;\n font-weight:bold;\n align-items:baseline;\n}\n\n.column-header__wrapper.active {\n background:$win95-window-header;\n}\n\n.column-header__wrapper.active::before {\n display:none;\n}\n.column-header.active {\n box-shadow:unset;\n background:$win95-window-header;\n}\n\n.column-header.active .column-header__icon {\n color:white;\n}\n\n.column-header__buttons {\n max-height: 20px;\n margin-right:0px;\n}\n\n.column-header__button {\n background: $win95-bg;\n color: black;\n line-height:0px;\n font-size:14px;\n max-height:20px;\n padding:0px 2px;\n margin-top:2px;\n @include win95-outset();\n\n &:hover {\n color: black;\n }\n}\n\n.column-header__button.active, .column-header__button.active:hover {\n @include win95-inset();\n background-color:#7f7f7f;\n}\n\n.column-header__back-button {\n background: $win95-bg;\n color: black;\n padding:2px;\n max-height:20px;\n margin-top:2px;\n @include win95-outset();\n font-size:13px;\n font-weight:bold;\n}\n\n.column-back-button {\n background:$win95-bg;\n color:black;\n @include win95-outset();\n padding:2px;\n font-size:13px;\n font-weight:bold;\n}\n\n.column-back-button--slim-button {\n position:absolute;\n top:-22px;\n right:4px;\n max-height:20px;\n max-width:60px;\n padding:0px 2px;\n}\n\n.column-back-button__icon {\n font-size:11px;\n margin-top:-3px;\n}\n\n.column-header__collapsible {\n border-left:2px outset $win95-bg;\n border-right:2px outset $win95-bg;\n}\n\n.column-header__collapsible-inner {\n background:$win95-bg;\n color:black;\n}\n\n.column-header__collapsible__extra {\n color:black;\n}\n\n.column-header__collapsible__extra div[role=\"group\"] {\n border: 2px groove $win95-bg;\n border-radius:4px;\n margin-bottom:8px;\n padding:4px;\n}\n\n.column-inline-form {\n background-color: $win95-bg;\n @include win95-border-outset();\n border-bottom-width:0px;\n border-top-width:0px;\n}\n\n.column-settings__section {\n color:black;\n font-weight:bold;\n font-size:11px;\n position:relative;\n top: -12px;\n left:4px;\n background-color:$win95-bg;\n display:inline-block;\n padding:0px 4px;\n margin-bottom:0px;\n}\n\n.setting-meta__label, .setting-toggle__label {\n color:black;\n font-weight:normal;\n}\n\n.setting-meta__label span:before {\n content:\"(\";\n}\n.setting-meta__label span:after {\n content:\")\";\n}\n\n.setting-toggle {\n line-height:13px;\n}\n\n.react-toggle .react-toggle-track {\n border-radius:0px;\n background-color:white;\n @include win95-border-inset();\n\n width:12px;\n height:12px;\n}\n\n.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track {\n background-color:white;\n}\n\n.react-toggle .react-toggle-track-check {\n left:2px;\n transition:unset;\n}\n\n.react-toggle .react-toggle-track-check svg path {\n fill: black;\n}\n\n.react-toggle .react-toggle-track-x {\n display:none;\n}\n\n.react-toggle .react-toggle-thumb {\n border-radius:0px;\n display:none;\n}\n\n.text-btn {\n background-color:$win95-bg;\n @include win95-outset();\n padding:4px;\n}\n\n.text-btn:hover {\n text-decoration:none;\n color:black;\n}\n\n.text-btn:active {\n @include win95-inset();\n}\n\n.setting-text {\n color:black;\n background-color:white;\n @include win95-inset();\n font-size:13px;\n padding:2px;\n}\n\n.setting-text:active, .setting-text:focus,\n.setting-text.light:active, .setting-text.light:focus {\n color:black;\n border-bottom:2px inset $win95-bg;\n}\n\n.column-header__setting-arrows .column-header__setting-btn {\n padding:3px 10px;\n}\n\n.column-header__setting-arrows .column-header__setting-btn:last-child {\n padding:3px 10px;\n}\n\n.missing-indicator {\n background-color:$win95-bg;\n color:black;\n @include win95-outset();\n}\n\n.missing-indicator > div {\n background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRUaXRsZQAACJnLyy9Jyy/NSwEAD5IDblIFOhoAAAAXelRYdEF1dGhvcgAACJlLzijKz0vMAQALmgLoDsFj8gAAAQpJREFUOMuVlD0OwjAMhd2oQl04Axfo0IGBgYELcAY6cqQuSO0ZOEAZGBg6VKg74gwsEaoESRVHjusI8aQqzY8/PbtOEz1qkFSn2YevlaNOpLMJh2DwvixhuXtOa6/LCh51DUMEFkAsgAZD207Doin8mQ562JpRE5CHBAAhmIqD1L8AqzUUUJkxc6kr3AgAJ+NuvIWRdk7WcrKl0AUqcIBBHOiEbpS4m27mIL5Onfg3k0rgggeQuS2sDOGSahKR+glgqaGLgUJs951NN1q9D72cQqQWR9cr3sm9YcEssEuz6eEuZh2bu0aSOhQ1MBezu2O/+TVSvEFII3qLsZWrSA2AAUQIh1HpyP/kC++zjVSMj6ntAAAAAElFTkSuQmCC')\n no-repeat;\n background-position:center center;\n}\n\n.empty-column-indicator,\n.error-column {\n background: $win95-bg;\n color: black;\n}\n\n.status__wrapper {\n border: 2px groove $win95-bg;\n margin:4px;\n}\n\n.status {\n @include win95-border-slight-inset();\n background-color:white;\n margin:4px;\n padding-bottom:40px;\n margin-bottom:8px;\n}\n\n.status.status-direct {\n background-color:$win95-bg;\n}\n\n.status__content {\n font-size:13px;\n}\n\n.status.light .status__relative-time,\n.status.light .display-name span {\n color: #7f7f7f;\n}\n\n.status__action-bar {\n box-sizing:border-box;\n position:absolute;\n bottom:-1px;\n left:-1px;\n background:$win95-bg;\n width:calc(100% + 2px);\n padding-left:10px;\n padding: 4px 2px;\n padding-bottom:4px;\n border-bottom:2px groove $win95-bg;\n border-top:1px outset $win95-bg;\n text-align: right;\n}\n\n.status__wrapper .status__action-bar {\n border-bottom-width:0px;\n}\n\n.status__action-bar-button {\n float:right;\n}\n\n.status__action-bar-dropdown {\n margin-left:auto;\n margin-right:10px;\n\n .icon-button {\n min-width:28px;\n }\n}\n.status.light .status__content a {\n color:blue;\n}\n\n.focusable:focus {\n background: $win95-bg;\n .detailed-status__action-bar {\n background: $win95-bg;\n }\n\n .status, .detailed-status {\n background: white;\n outline:2px dotted $win95-mid-grey;\n }\n}\n\n.dropdown__trigger.icon-button {\n padding-right:6px;\n}\n\n.detailed-status__action-bar-dropdown .icon-button {\n min-width:28px;\n}\n\n.detailed-status {\n background:white;\n background-clip:padding-box;\n margin:4px;\n border: 2px groove $win95-bg;\n padding:4px;\n}\n\n.detailed-status__display-name {\n color:#7f7f7f;\n}\n\n.detailed-status__display-name strong {\n color:black;\n font-weight:bold;\n}\n.account__avatar,\n.account__avatar-overlay-base,\n.account__header__avatar,\n.account__avatar-overlay-overlay {\n @include win95-border-slight-inset();\n clip-path:none;\n filter: saturate(1.8) brightness(1.1);\n}\n\n.detailed-status__action-bar {\n background-color:$win95-bg;\n border:0px;\n border-bottom:2px groove $win95-bg;\n margin-bottom:8px;\n justify-items:left;\n padding-left:4px;\n}\n.icon-button {\n background:$win95-bg;\n @include win95-border-outset();\n padding:0px 0px 0px 0px;\n margin-right:4px;\n\n color:#3f3f3f;\n &.inverted, &:hover, &.inverted:hover, &:active, &:focus {\n color:#3f3f3f;\n }\n}\n\n.icon-button:active {\n @include win95-border-inset();\n}\n\n.status__action-bar > .icon-button {\n padding:0px 15px 0px 0px;\n min-width:25px;\n}\n\n.icon-button.star-icon,\n.icon-button.star-icon:active {\n background:transparent;\n border:none;\n}\n\n.icon-button.star-icon.active {\n color: $gold-star;\n &:active, &:hover, &:focus {\n color: $gold-star;\n }\n}\n\n.icon-button.star-icon > i {\n background:$win95-bg;\n @include win95-border-outset();\n padding-bottom:3px;\n}\n\n.icon-button.star-icon:active > i {\n @include win95-border-inset();\n}\n\n.text-icon-button {\n color:$win95-dark-grey;\n}\n\n.detailed-status__action-bar-dropdown {\n margin-left:auto;\n justify-content:right;\n padding-right:16px;\n}\n\n.detailed-status__button {\n flex:0 0 auto;\n}\n\n.detailed-status__button .icon-button {\n padding-left:2px;\n padding-right:25px;\n}\n\n.status-card {\n border-radius:0px;\n background:white;\n border: 1px solid black;\n color:black;\n}\n\n.status-card:hover {\n background-color:white;\n}\n\n.status-card__title {\n color:blue;\n text-decoration:underline;\n font-weight:bold;\n}\n\n.load-more {\n width:auto;\n margin:5px auto;\n background: $win95-bg;\n @include win95-outset();\n color:black;\n padding: 2px 5px;\n\n &:hover {\n background: $win95-bg;\n color:black;\n }\n}\n\n.status-card__description {\n color:black;\n}\n\n.account__display-name strong, .status__display-name strong {\n color:black;\n font-weight:bold;\n}\n\n.account .account__display-name {\n color:black;\n}\n\n.account {\n border-bottom: 2px groove $win95-bg;\n}\n\n.reply-indicator__content .status__content__spoiler-link, .status__content .status__content__spoiler-link {\n background:$win95-bg;\n @include win95-outset();\n}\n\n.reply-indicator__content .status__content__spoiler-link:hover, .status__content .status__content__spoiler-link:hover {\n background:$win95-bg;\n}\n\n.reply-indicator__content .status__content__spoiler-link:active, .status__content .status__content__spoiler-link:active {\n @include win95-inset();\n}\n\n.reply-indicator__content a, .status__content a {\n color:blue;\n}\n\n.notification {\n border: 2px groove $win95-bg;\n margin:4px;\n}\n\n.notification__message {\n color:black;\n font-size:13px;\n}\n\n.notification__display-name {\n font-weight:bold;\n}\n\n.drawer__header {\n background: $win95-bg;\n @include win95-border-outset();\n justify-content:left;\n margin-bottom:0px;\n padding-bottom:2px;\n border-bottom:2px groove $win95-bg;\n}\n\n.drawer__tab {\n color:black;\n @include win95-outset();\n padding:5px;\n margin:2px;\n flex: 0 0 auto;\n}\n\n.drawer__tab:first-child::before {\n content:\"Start\";\n color:black;\n font-weight:bold;\n font-size:15px;\n width:80%;\n display:block;\n position:absolute;\n right:0px;\n\n}\n\n.drawer__tab:first-child {\n position:relative;\n padding:5px 15px;\n width:40px;\n font-size:0px;\n color:$win95-bg;\n\n background-image: url(\"~images/start.png\");\n background-repeat:no-repeat;\n background-position:8%;\n background-clip:padding-box;\n background-size:auto 50%;\n}\n\n.drawer__header a:hover {\n background-color:transparent;\n}\n\n.drawer__header a:first-child:hover {\n background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAIAAACpTQvdAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRBdXRob3IAAAiZS84oys9LzAEAC5oC6A7BY/IAAACWSURBVCiRhVJJDsQgDEuqOfRZ7a1P5gbP4uaJaEjTADMWQhHYjlk4p0wLnNdptdF4KvBUDyGzVwc2xO+uKtH+1o0ytEEmqFpuxlvFCGCxKbNIT56QCi2MzaA/2Mz+mERSOeqzJG2RUxkjdTabgPtFoZ1bZxcKvgPcLZVufAyR9Ni8v5dWDzfFx0giC1RvZFv6l35QQ/Mvv39XXgGzQpoAAAAASUVORK5CYII=\");\n background-repeat:no-repeat;\n background-position:8%;\n background-clip:padding-box;\n background-size:auto 50%;\n transition:unset;\n}\n\n.drawer__tab:first-child {\n\n}\n\n.search {\n background:$win95-bg;\n padding-top:2px;\n padding:2px;\n border:2px outset $win95-bg;\n border-top-width:0px;\n border-bottom: 2px groove $win95-bg;\n margin-bottom:0px;\n}\n\n.search input {\n background-color:white;\n color:black;\n @include win95-border-slight-inset();\n}\n\n.search__input:focus {\n background-color:white;\n}\n\n.search-popout {\n box-shadow: unset;\n color:black;\n border-radius:0px;\n background-color:$win95-tooltip-yellow;\n border:1px solid black;\n\n h4 {\n color:black;\n text-transform: none;\n font-weight:bold;\n }\n}\n\n.search-results__header {\n background-color: $win95-bg;\n color:black;\n border-bottom:2px groove $win95-bg;\n}\n\n.search-results__hashtag {\n color:blue;\n}\n\n.search-results__section .account:hover,\n.search-results__section .account:hover .account__display-name,\n.search-results__section .account:hover .account__display-name strong,\n.search-results__section .search-results__hashtag:hover {\n background-color:$win95-window-header;\n color:white;\n}\n\n.search__icon .fa {\n color:#808080;\n\n &.active {\n opacity:1.0;\n }\n\n &:hover {\n color: #808080;\n }\n}\n\n.drawer__inner,\n.drawer__inner.darker {\n background-color:$win95-bg;\n border: 2px outset $win95-bg;\n border-top-width:0px;\n}\n\n.navigation-bar {\n color:black;\n}\n\n.navigation-bar strong {\n color:black;\n font-weight:bold;\n}\n\n.compose-form .autosuggest-textarea__textarea,\n.compose-form .spoiler-input__input {\n border-radius:0px;\n @include win95-border-slight-inset();\n}\n\n.compose-form .autosuggest-textarea__textarea {\n border-bottom:0px;\n}\n\n.compose-form__uploads-wrapper {\n border-radius:0px;\n border-bottom:1px inset $win95-bg;\n border-top-width:0px;\n}\n\n.compose-form__upload-wrapper {\n border-left:1px inset $win95-bg;\n border-right:1px inset $win95-bg;\n}\n\n.compose-form .compose-form__buttons-wrapper {\n background-color: $win95-bg;\n border:2px groove $win95-bg;\n margin-top:4px;\n padding:4px 8px;\n}\n\n.compose-form__buttons {\n background-color:$win95-bg;\n border-radius:0px;\n box-shadow:unset;\n}\n\n.compose-form__buttons-separator {\n border-left: 2px groove $win95-bg;\n}\n\n.privacy-dropdown.active .privacy-dropdown__value.active,\n.advanced-options-dropdown.open .advanced-options-dropdown__value {\n background: $win95-bg;\n}\n\n.privacy-dropdown.active .privacy-dropdown__value.active .icon-button {\n color: $win95-dark-grey;\n}\n\n.privacy-dropdown.active\n.privacy-dropdown__value {\n background: $win95-bg;\n box-shadow:unset;\n}\n\n.privacy-dropdown__option.active, .privacy-dropdown__option:hover,\n.privacy-dropdown__option.active:hover {\n background:$win95-window-header;\n}\n\n.privacy-dropdown__dropdown,\n.privacy-dropdown.active .privacy-dropdown__dropdown,\n.advanced-options-dropdown__dropdown,\n.advanced-options-dropdown.open .advanced-options-dropdown__dropdown\n{\n box-shadow:unset;\n color:black;\n @include win95-outset();\n background: $win95-bg;\n}\n\n.privacy-dropdown__option__content {\n color:black;\n}\n\n.privacy-dropdown__option__content strong {\n font-weight:bold;\n}\n\n.compose-form__warning::before {\n content:\"Tip:\";\n font-weight:bold;\n display:block;\n position:absolute;\n top:-10px;\n background-color:$win95-bg;\n font-size:11px;\n padding: 0px 5px;\n}\n\n.compose-form__warning {\n position:relative;\n box-shadow:unset;\n border:2px groove $win95-bg;\n background-color:$win95-bg;\n color:black;\n}\n\n.compose-form__warning a {\n color:blue;\n}\n\n.compose-form__warning strong {\n color:black;\n text-decoration:underline;\n}\n\n.compose-form__buttons button.active:last-child {\n @include win95-border-inset();\n background: #dfdfdf;\n color:#7f7f7f;\n}\n\n.compose-form__upload-thumbnail {\n border-radius:0px;\n border:2px groove $win95-bg;\n background-color:$win95-bg;\n padding:2px;\n box-sizing:border-box;\n}\n\n.compose-form__upload-thumbnail .icon-button {\n max-width:20px;\n max-height:20px;\n line-height:10px !important;\n}\n\n.compose-form__upload-thumbnail .icon-button::before {\n content:\"X\";\n font-size:13px;\n font-weight:bold;\n color:black;\n}\n\n.compose-form__upload-thumbnail .icon-button i {\n display:none;\n}\n\n.emoji-picker-dropdown__menu {\n z-index:2;\n}\n\n.emoji-dialog.with-search {\n box-shadow:unset;\n border-radius:0px;\n background-color:$win95-bg;\n border:1px solid black;\n box-sizing:content-box;\n\n}\n\n.emoji-dialog .emoji-search {\n color:black;\n background-color:white;\n border-radius:0px;\n @include win95-inset();\n}\n\n.emoji-dialog .emoji-search-wrapper {\n border-bottom:2px groove $win95-bg;\n}\n\n.emoji-dialog .emoji-category-title {\n color:black;\n font-weight:bold;\n}\n\n.reply-indicator {\n background-color:$win95-bg;\n border-radius:3px;\n border:2px groove $win95-bg;\n}\n\n.button {\n background-color:$win95-bg;\n @include win95-outset();\n border-radius:0px;\n color:black;\n font-weight:bold;\n\n &:hover, &:focus, &:disabled {\n background-color:$win95-bg;\n }\n\n &:active {\n @include win95-inset();\n }\n\n &:disabled {\n color: #808080;\n text-shadow: 1px 1px 0px #efefef;\n\n &:active {\n @include win95-outset();\n }\n }\n\n}\n\n#Getting-started {\n background-color:$win95-bg;\n @include win95-inset();\n border-bottom-width:0px;\n}\n\n#Getting-started::before {\n content:\"Start\";\n color:black;\n font-weight:bold;\n font-size:15px;\n width:80%;\n text-align:center;\n display:block;\n position:absolute;\n right:2px;\n}\n\n#Getting-started {\n position:relative;\n padding:5px 15px;\n width:60px;\n font-size:0px;\n color:$win95-bg;\n\n background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAIAAACpTQvdAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRBdXRob3IAAAiZS84oys9LzAEAC5oC6A7BY/IAAACWSURBVCiRhVJJDsQgDEuqOfRZ7a1P5gbP4uaJaEjTADMWQhHYjlk4p0wLnNdptdF4KvBUDyGzVwc2xO+uKtH+1o0ytEEmqFpuxlvFCGCxKbNIT56QCi2MzaA/2Mz+mERSOeqzJG2RUxkjdTabgPtFoZ1bZxcKvgPcLZVufAyR9Ni8v5dWDzfFx0giC1RvZFv6l35QQ/Mvv39XXgGzQpoAAAAASUVORK5CYII=\");\n background-repeat:no-repeat;\n background-position:8%;\n background-clip:padding-box;\n background-size:auto 50%;\n}\n\n.column-subheading {\n background-color:$win95-bg;\n color:black;\n border-bottom: 2px groove $win95-bg;\n text-transform: none;\n font-size: 16px;\n}\n\n.column-link {\n background-color:transparent;\n color:black;\n &:hover {\n background-color: $win95-window-header;\n color:white;\n }\n}\n\n.getting-started__wrapper {\n .column-subheading {\n font-size:0px;\n margin:0px;\n padding:0px;\n }\n\n .column-link {\n background-size:32px 32px;\n background-repeat:no-repeat;\n background-position: 36px 50%;\n padding-left:40px;\n\n &:hover {\n background-size:32px 32px;\n background-repeat:no-repeat;\n background-position: 36px 50%;\n }\n\n i {\n font-size: 0px;\n width:32px;\n }\n }\n}\n\n.column-link[href=\"/web/timelines/public\"] {\n background-image: url(\"~images/icon_public.png\");\n &:hover { background-image: url(\"~images/icon_public.png\"); }\n}\n.column-link[href=\"/web/timelines/public/local\"] {\n background-image: url(\"~images/icon_local.png\");\n &:hover { background-image: url(\"~images/icon_local.png\"); }\n}\n.column-link[href=\"/web/pinned\"] {\n background-image: url(\"~images/icon_pin.png\");\n &:hover { background-image: url(\"~images/icon_pin.png\"); }\n}\n.column-link[href=\"/web/favourites\"] {\n background-image: url(\"~images/icon_likes.png\");\n &:hover { background-image: url(\"~images/icon_likes.png\"); }\n}\n.column-link[href=\"/web/lists\"] {\n background-image: url(\"~images/icon_lists.png\");\n &:hover { background-image: url(\"~images/icon_lists.png\"); }\n}\n.column-link[href=\"/web/follow_requests\"] {\n background-image: url(\"~images/icon_follow_requests.png\");\n &:hover { background-image: url(\"~images/icon_follow_requests.png\"); }\n}\n.column-link[href=\"/web/keyboard-shortcuts\"] {\n background-image: url(\"~images/icon_keyboard_shortcuts.png\");\n &:hover { background-image: url(\"~images/icon_keyboard_shortcuts.png\"); }\n}\n.column-link[href=\"/web/blocks\"] {\n background-image: url(\"~images/icon_blocks.png\");\n &:hover { background-image: url(\"~images/icon_blocks.png\"); }\n}\n.column-link[href=\"/web/mutes\"] {\n background-image: url(\"~images/icon_mutes.png\");\n &:hover { background-image: url(\"~images/icon_mutes.png\"); }\n}\n.column-link[href=\"/settings/preferences\"] {\n background-image: url(\"~images/icon_settings.png\");\n &:hover { background-image: url(\"~images/icon_settings.png\"); }\n}\n.column-link[href=\"/about/more\"] {\n background-image: url(\"~images/icon_about.png\");\n &:hover { background-image: url(\"~images/icon_about.png\"); }\n}\n.column-link[href=\"/auth/sign_out\"] {\n background-image: url(\"~images/icon_logout.png\");\n &:hover { background-image: url(\"~images/icon_logout.png\"); }\n}\n\n.getting-started__footer {\n display:none;\n}\n\n.getting-started__wrapper::before {\n content:\"Mastodon 95\";\n font-weight:bold;\n font-size:23px;\n color:white;\n line-height:30px;\n padding-left:20px;\n padding-right:40px;\n\n left:0px;\n bottom:-30px;\n display:block;\n position:absolute;\n background-color:#7f7f7f;\n width:200%;\n height:30px;\n\n -ms-transform: rotate(-90deg);\n\n -webkit-transform: rotate(-90deg);\n transform: rotate(-90deg);\n transform-origin:top left;\n}\n\n.getting-started__wrapper {\n @include win95-border-outset();\n background-color:$win95-bg;\n}\n\n.column .static-content.getting-started {\n display:none;\n}\n\n.keyboard-shortcuts kbd {\n background-color: $win95-bg;\n}\n\n.account__header {\n background-color:#7f7f7f;\n}\n\n.account__header .account__header__content {\n color:white;\n}\n\n.account-authorize__wrapper {\n border: 2px groove $win95-bg;\n margin: 2px;\n padding:2px;\n}\n\n.account--panel {\n background-color: $win95-bg;\n border:0px;\n border-top: 2px groove $win95-bg;\n}\n\n.account-authorize .account__header__content {\n color:black;\n margin:10px;\n}\n\n.account__action-bar__tab > span {\n color:black;\n font-weight:bold;\n}\n\n.account__action-bar__tab strong {\n color:black;\n}\n\n.account__action-bar {\n border: unset;\n}\n\n.account__action-bar__tab {\n border: 1px outset $win95-bg;\n}\n\n.account__action-bar__tab:active {\n @include win95-inset();\n}\n\n.dropdown--active .dropdown__content > ul,\n.dropdown-menu {\n background:$win95-tooltip-yellow;\n border-radius:0px;\n border:1px solid black;\n box-shadow:unset;\n}\n\n.dropdown-menu a {\n background-color:transparent;\n}\n\n.dropdown--active::after {\n display:none;\n}\n\n.dropdown--active .icon-button {\n color:black;\n @include win95-inset();\n}\n\n.dropdown--active .dropdown__content > ul > li > a {\n background:transparent;\n}\n\n.dropdown--active .dropdown__content > ul > li > a:hover {\n background:transparent;\n color:black;\n text-decoration:underline;\n}\n\n.dropdown__sep,\n.dropdown-menu__separator\n{\n border-color:#7f7f7f;\n}\n\n.detailed-status__action-bar-dropdown .dropdown--active .dropdown__content.dropdown__left {\n left:unset;\n}\n\n.dropdown > .icon-button, .detailed-status__button > .icon-button,\n.status__action-bar > .icon-button, .star-icon i {\n /* i don't know what's going on with the inline\n styles someone should look at the react code */\n height: 25px !important;\n width: 28px !important;\n box-sizing: border-box;\n}\n\n.status__action-bar-button .fa-floppy-o {\n padding-top: 2px;\n}\n\n.status__action-bar-dropdown {\n position: relative;\n top: -3px;\n}\n\n.detailed-status__action-bar-dropdown .dropdown {\n position: relative;\n top: -4px;\n}\n\n.notification .status__action-bar {\n border-bottom: none;\n}\n\n.notification .status {\n margin-bottom: 4px;\n}\n\n.status__wrapper .status {\n margin-bottom: 3px;\n}\n\n.status__wrapper {\n margin-bottom: 8px;\n}\n\n.icon-button .fa-retweet {\n position: relative;\n top: -1px;\n}\n\n.embed-modal, .error-modal, .onboarding-modal,\n.actions-modal, .boost-modal, .confirmation-modal, .report-modal {\n @include win95-outset();\n background:$win95-bg;\n}\n\n.actions-modal::before,\n.boost-modal::before,\n.confirmation-modal::before,\n.report-modal::before {\n content: \"Confirmation\";\n display:block;\n background:$win95-window-header;\n color:white;\n font-weight:bold;\n padding-left:2px;\n}\n\n.boost-modal::before {\n content: \"Boost confirmation\";\n}\n\n.boost-modal__action-bar > div > span:before {\n content: \"Tip: \";\n font-weight:bold;\n}\n\n.boost-modal__action-bar, .confirmation-modal__action-bar, .report-modal__action-bar {\n background:$win95-bg;\n margin-top:-15px;\n}\n\n.embed-modal h4, .error-modal h4, .onboarding-modal h4 {\n background:$win95-window-header;\n color:white;\n font-weight:bold;\n padding:2px;\n font-size:13px;\n text-align:left;\n}\n\n.confirmation-modal__action-bar {\n .confirmation-modal__cancel-button {\n color:black;\n\n &:active,\n &:focus,\n &:hover {\n color:black;\n }\n\n &:active {\n @include win95-inset();\n }\n }\n}\n\n.embed-modal .embed-modal__container .embed-modal__html,\n.embed-modal .embed-modal__container .embed-modal__html:focus {\n background:white;\n color:black;\n @include win95-inset();\n}\n\n.modal-root__overlay,\n.account__header > div {\n background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAFnpUWHRUaXRsZQAACJnLzU9JzElKBwALgwLXaCRlPwAAABd6VFh0QXV0aG9yAAAImUvOKMrPS8wBAAuaAugOwWPyAAAAEUlEQVQImWNgYGD4z4AE/gMADwMB/414xEUAAAAASUVORK5CYII=');\n}\n\n.admin-wrapper::before {\n position:absolute;\n top:0px;\n content:\"Control Panel\";\n color:white;\n background-color:$win95-window-header;\n font-size:13px;\n font-weight:bold;\n width:calc(100%);\n margin: 2px;\n display:block;\n padding:2px;\n padding-left:22px;\n box-sizing:border-box;\n}\n\n.admin-wrapper {\n position:relative;\n background: $win95-bg;\n @include win95-outset();\n width:70vw;\n height:80vh;\n margin:10vh auto;\n color: black;\n padding-top:24px;\n flex-direction:column;\n overflow:hidden;\n}\n\n@media screen and (max-width: 1120px) {\n .admin-wrapper {\n width:90vw;\n height:95vh;\n margin:2.5vh auto;\n }\n}\n\n@media screen and (max-width: 740px) {\n .admin-wrapper {\n width:100vw;\n height:95vh;\n height:calc(100vh - 24px);\n margin:0px 0px 0px 0px;\n }\n}\n\n.admin-wrapper .sidebar-wrapper {\n position:static;\n height:auto;\n flex: 0 0 auto;\n margin:2px;\n}\n\n.admin-wrapper .content-wrapper {\n flex: 1 1 auto;\n width:calc(100% - 20px);\n @include win95-border-outset();\n position:relative;\n margin-left:10px;\n margin-right:10px;\n margin-bottom:40px;\n box-sizing:border-box;\n}\n\n.admin-wrapper .content {\n background-color: $win95-bg;\n width: 100%;\n max-width:100%;\n min-height:100%;\n box-sizing:border-box;\n position:relative;\n}\n\n.admin-wrapper .sidebar {\n position:static;\n background: $win95-bg;\n color:black;\n width: 100%;\n height:auto;\n padding-bottom: 20px;\n}\n\n.admin-wrapper .sidebar .logo {\n position:absolute;\n top:2px;\n left:4px;\n width:18px;\n height:18px;\n margin:0px;\n}\n\n.admin-wrapper .sidebar > ul {\n background: $win95-bg;\n margin:0px;\n margin-left:8px;\n color:black;\n\n & > li {\n display:inline-block;\n\n &#settings,\n &#admin {\n padding:2px;\n border: 0px solid transparent;\n }\n\n &#logout {\n position:absolute;\n @include win95-outset();\n right:12px;\n bottom:10px;\n }\n\n &#web {\n display:inline-block;\n @include win95-outset();\n position:absolute;\n left: 12px;\n bottom: 10px;\n }\n\n & > a {\n display:inline-block;\n @include win95-tab();\n padding:2px 5px;\n margin:0px;\n color:black;\n vertical-align:baseline;\n\n &.selected {\n background: $win95-bg;\n color:black;\n padding-top: 4px;\n padding-bottom:4px;\n }\n\n &:hover {\n background: $win95-bg;\n color:black;\n }\n }\n\n & > ul {\n width:calc(100% - 20px);\n background: transparent;\n position:absolute;\n left: 10px;\n top:54px;\n z-index:3;\n\n & > li {\n background: $win95-bg;\n display: inline-block;\n vertical-align:baseline;\n\n & > a {\n background: $win95-bg;\n @include win95-tab();\n color:black;\n padding:2px 5px;\n position:relative;\n z-index:3;\n\n &.selected {\n background: $win95-bg;\n color:black;\n padding-bottom:4px;\n padding-top: 4px;\n padding-right:7px;\n margin-left:-2px;\n margin-right:-2px;\n position:relative;\n z-index:4;\n\n &:first-child {\n margin-left:0px;\n }\n\n &:hover {\n background: transparent;\n color:black;\n }\n }\n\n &:hover {\n background: $win95-bg;\n color:black;\n }\n }\n }\n }\n }\n}\n\n@media screen and (max-width: 1520px) {\n .admin-wrapper .sidebar > ul > li > ul {\n max-width:1000px;\n }\n\n .admin-wrapper .sidebar {\n padding-bottom: 45px;\n }\n}\n\n@media screen and (max-width: 600px) {\n .admin-wrapper .sidebar > ul > li > ul {\n max-width:500px;\n }\n\n .admin-wrapper {\n .sidebar {\n padding:0px;\n padding-bottom: 70px;\n width: 100%;\n height: auto;\n }\n .content-wrapper {\n overflow:auto;\n height:80%;\n height:calc(100% - 150px);\n }\n }\n}\n\n.flash-message {\n background-color:$win95-tooltip-yellow;\n color:black;\n border:1px solid black;\n border-radius:0px;\n position:absolute;\n top:0px;\n left:0px;\n width:100%;\n}\n\n.admin-wrapper table {\n background-color: white;\n @include win95-border-slight-inset();\n}\n\n.admin-wrapper .content h2,\n.simple_form .input.with_label .label_input > label,\n.admin-wrapper .content h6,\n.admin-wrapper .content > p,\n.admin-wrapper .content .muted-hint,\n.simple_form span.hint,\n.simple_form h4,\n.simple_form .check_boxes .checkbox label,\n.simple_form .input.with_label.boolean .label_input > label,\n.filters .filter-subset a,\n.simple_form .input.radio_buttons .radio label,\na.table-action-link,\na.table-action-link:hover,\n.simple_form .input.with_block_label > label,\n.simple_form p.hint {\n color:black;\n}\n\n.table > tbody > tr:nth-child(2n+1) > td,\n.table > tbody > tr:nth-child(2n+1) > th {\n background-color:white;\n}\n\n.simple_form input[type=text],\n.simple_form input[type=number],\n.simple_form input[type=email],\n.simple_form input[type=password],\n.simple_form textarea {\n color:black;\n background-color:white;\n @include win95-border-slight-inset();\n\n &:active, &:focus {\n background-color:white;\n }\n}\n\n.simple_form button,\n.simple_form .button,\n.simple_form .block-button\n{\n background: $win95-bg;\n @include win95-outset();\n color:black;\n font-weight: normal;\n\n &:hover {\n background: $win95-bg;\n }\n}\n\n.simple_form .warning, .table-form .warning\n{\n background: $win95-tooltip-yellow;\n color:black;\n box-shadow: unset;\n text-shadow:unset;\n border:1px solid black;\n\n a {\n color: blue;\n text-decoration:underline;\n }\n}\n\n.simple_form button.negative,\n.simple_form .button.negative,\n.simple_form .block-button.negative\n{\n background: $win95-bg;\n}\n\n.filters .filter-subset {\n border: 2px groove $win95-bg;\n padding:2px;\n}\n\n.filters .filter-subset a::before {\n content: \"\";\n background-color:white;\n border-radius:50%;\n border:2px solid black;\n border-top-color:#7f7f7f;\n border-left-color:#7f7f7f;\n border-bottom-color:#f5f5f5;\n border-right-color:#f5f5f5;\n width:12px;\n height:12px;\n display:inline-block;\n vertical-align:middle;\n margin-right:2px;\n}\n\n.filters .filter-subset a.selected::before {\n background-color:black;\n box-shadow: inset 0 0 0 3px white;\n}\n\n.filters .filter-subset a,\n.filters .filter-subset a:hover,\n.filters .filter-subset a.selected {\n color:black;\n border-bottom: 0px solid transparent;\n}\n","/* http://meyerweb.com/eric/tools/css/reset/\n v2.0 | 20110126\n License: none (public domain)\n*/\n\nhtml, body, div, span, applet, object, iframe,\nh1, h2, h3, h4, h5, h6, p, blockquote, pre,\na, abbr, acronym, address, big, cite, code,\ndel, dfn, em, img, ins, kbd, q, s, samp,\nsmall, strike, strong, sub, sup, tt, var,\nb, u, i, center,\ndl, dt, dd, ol, ul, li,\nfieldset, form, label, legend,\ntable, caption, tbody, tfoot, thead, tr, th, td,\narticle, aside, canvas, details, embed,\nfigure, figcaption, footer, header, hgroup,\nmenu, nav, output, ruby, section, summary,\ntime, mark, audio, video {\n margin: 0;\n padding: 0;\n border: 0;\n font-size: 100%;\n font: inherit;\n vertical-align: baseline;\n}\n\n/* HTML5 display-role reset for older browsers */\narticle, aside, details, figcaption, figure,\nfooter, header, hgroup, menu, nav, section {\n display: block;\n}\n\nbody {\n line-height: 1;\n}\n\nol, ul {\n list-style: none;\n}\n\nblockquote, q {\n quotes: none;\n}\n\nblockquote:before, blockquote:after,\nq:before, q:after {\n content: '';\n content: none;\n}\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\nhtml {\n scrollbar-color: lighten($ui-base-color, 4%) rgba($base-overlay-background, 0.1);\n}\n\n::-webkit-scrollbar {\n width: 12px;\n height: 12px;\n}\n\n::-webkit-scrollbar-thumb {\n background: lighten($ui-base-color, 4%);\n border: 0px none $base-border-color;\n border-radius: 50px;\n}\n\n::-webkit-scrollbar-thumb:hover {\n background: lighten($ui-base-color, 6%);\n}\n\n::-webkit-scrollbar-thumb:active {\n background: lighten($ui-base-color, 4%);\n}\n\n::-webkit-scrollbar-track {\n border: 0px none $base-border-color;\n border-radius: 0;\n background: rgba($base-overlay-background, 0.1);\n}\n\n::-webkit-scrollbar-track:hover {\n background: $ui-base-color;\n}\n\n::-webkit-scrollbar-track:active {\n background: $ui-base-color;\n}\n\n::-webkit-scrollbar-corner {\n background: transparent;\n}\n","// Commonly used web colors\n$black: #000000; // Black\n$white: #ffffff; // White\n$success-green: #79bd9a !default; // Padua\n$error-red: #df405a !default; // Cerise\n$warning-red: #ff5050 !default; // Sunset Orange\n$gold-star: #ca8f04 !default; // Dark Goldenrod\n\n$red-bookmark: $warning-red;\n\n// Pleroma-Dark colors\n$pleroma-bg: #121a24;\n$pleroma-fg: #182230;\n$pleroma-text: #b9b9ba;\n$pleroma-links: #d8a070;\n\n// Values from the classic Mastodon UI\n$classic-base-color: $pleroma-bg;\n$classic-primary-color: #9baec8;\n$classic-secondary-color: #d9e1e8;\n$classic-highlight-color: #d8a070;\n\n// Variables for defaults in UI\n$base-shadow-color: $black !default;\n$base-overlay-background: $black !default;\n$base-border-color: $white !default;\n$simple-background-color: $white !default;\n$valid-value-color: $success-green !default;\n$error-value-color: $error-red !default;\n\n// Tell UI to use selected colors\n$ui-base-color: $classic-base-color !default; // Darkest\n$ui-base-lighter-color: lighten($ui-base-color, 26%) !default; // Lighter darkest\n$ui-primary-color: $classic-primary-color !default; // Lighter\n$ui-secondary-color: $classic-secondary-color !default; // Lightest\n$ui-highlight-color: $classic-highlight-color !default;\n\n// Variables for texts\n$primary-text-color: $white !default;\n$darker-text-color: $ui-primary-color !default;\n$dark-text-color: $ui-base-lighter-color !default;\n$secondary-text-color: $ui-secondary-color !default;\n$highlight-text-color: $ui-highlight-color !default;\n$action-button-color: $ui-base-lighter-color !default;\n// For texts on inverted backgrounds\n$inverted-text-color: $ui-base-color !default;\n$lighter-text-color: $ui-base-lighter-color !default;\n$light-text-color: $ui-primary-color !default;\n\n// Language codes that uses CJK fonts\n$cjk-langs: ja, ko, zh-CN, zh-HK, zh-TW;\n\n// Variables for components\n$media-modal-media-max-width: 100%;\n// put margins on top and bottom of image to avoid the screen covered by image.\n$media-modal-media-max-height: 80%;\n\n$no-gap-breakpoint: 415px;\n\n$font-sans-serif: 'mastodon-font-sans-serif' !default;\n$font-display: 'mastodon-font-display' !default;\n$font-monospace: 'mastodon-font-monospace' !default;\n","@function hex-color($color) {\n @if type-of($color) == 'color' {\n $color: str-slice(ie-hex-str($color), 4);\n }\n\n @return '%23' + unquote($color);\n}\n\nbody {\n font-family: $font-sans-serif, sans-serif;\n background: darken($ui-base-color, 7%);\n font-size: 13px;\n line-height: 18px;\n font-weight: 400;\n color: $primary-text-color;\n text-rendering: optimizelegibility;\n font-feature-settings: \"kern\";\n text-size-adjust: none;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n -webkit-tap-highlight-color: transparent;\n\n &.system-font {\n // system-ui => standard property (Chrome/Android WebView 56+, Opera 43+, Safari 11+)\n // -apple-system => Safari <11 specific\n // BlinkMacSystemFont => Chrome <56 on macOS specific\n // Segoe UI => Windows 7/8/10\n // Oxygen => KDE\n // Ubuntu => Unity/Ubuntu\n // Cantarell => GNOME\n // Fira Sans => Firefox OS\n // Droid Sans => Older Androids (<4.0)\n // Helvetica Neue => Older macOS <10.11\n // $font-sans-serif => web-font (Roboto) fallback and newer Androids (>=4.0)\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Oxygen\", \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", $font-sans-serif, sans-serif;\n }\n\n &.app-body {\n padding: 0;\n\n &.layout-single-column {\n height: auto;\n min-height: 100vh;\n overflow-y: scroll;\n }\n\n &.layout-multiple-columns {\n position: absolute;\n width: 100%;\n height: 100%;\n }\n\n &.with-modals--active {\n overflow-y: hidden;\n }\n }\n\n &.lighter {\n background: $ui-base-color;\n }\n\n &.with-modals {\n overflow-x: hidden;\n overflow-y: scroll;\n\n &--active {\n overflow-y: hidden;\n }\n }\n\n &.player {\n text-align: center;\n }\n\n &.embed {\n background: lighten($ui-base-color, 4%);\n margin: 0;\n padding-bottom: 0;\n\n .container {\n position: absolute;\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n }\n\n &.admin {\n background: darken($ui-base-color, 4%);\n padding: 0;\n }\n\n &.error {\n position: absolute;\n text-align: center;\n color: $darker-text-color;\n background: $ui-base-color;\n width: 100%;\n height: 100%;\n padding: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n\n .dialog {\n vertical-align: middle;\n margin: 20px;\n\n &__illustration {\n img {\n display: block;\n max-width: 470px;\n width: 100%;\n height: auto;\n margin-top: -120px;\n }\n }\n\n h1 {\n font-size: 20px;\n line-height: 28px;\n font-weight: 400;\n }\n }\n }\n}\n\nbutton {\n font-family: inherit;\n cursor: pointer;\n\n &:focus {\n outline: none;\n }\n}\n\n.app-holder {\n &,\n & > div,\n & > noscript {\n display: flex;\n width: 100%;\n align-items: center;\n justify-content: center;\n outline: 0 !important;\n }\n\n & > noscript {\n height: 100vh;\n }\n}\n\n.layout-single-column .app-holder {\n &,\n & > div {\n min-height: 100vh;\n }\n}\n\n.layout-multiple-columns .app-holder {\n &,\n & > div {\n height: 100%;\n }\n}\n\n.error-boundary,\n.app-holder noscript {\n flex-direction: column;\n font-size: 16px;\n font-weight: 400;\n line-height: 1.7;\n color: lighten($error-red, 4%);\n text-align: center;\n\n & > div {\n max-width: 500px;\n }\n\n p {\n margin-bottom: .85em;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: $highlight-text-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n &__footer {\n color: $dark-text-color;\n font-size: 13px;\n\n a {\n color: $dark-text-color;\n }\n }\n\n button {\n display: inline;\n border: 0;\n background: transparent;\n color: $dark-text-color;\n font: inherit;\n padding: 0;\n margin: 0;\n line-height: inherit;\n cursor: pointer;\n outline: 0;\n transition: color 300ms linear;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n\n &.copied {\n color: $valid-value-color;\n transition: none;\n }\n }\n}\n",".container-alt {\n width: 700px;\n margin: 0 auto;\n margin-top: 40px;\n\n @media screen and (max-width: 740px) {\n width: 100%;\n margin: 0;\n }\n}\n\n.logo-container {\n margin: 100px auto 50px;\n\n @media screen and (max-width: 500px) {\n margin: 40px auto 0;\n }\n\n h1 {\n display: flex;\n justify-content: center;\n align-items: center;\n\n svg {\n fill: $primary-text-color;\n height: 42px;\n margin-right: 10px;\n }\n\n a {\n display: flex;\n justify-content: center;\n align-items: center;\n color: $primary-text-color;\n text-decoration: none;\n outline: 0;\n padding: 12px 16px;\n line-height: 32px;\n font-family: $font-display, sans-serif;\n font-weight: 500;\n font-size: 14px;\n }\n }\n}\n\n.compose-standalone {\n .compose-form {\n width: 400px;\n margin: 0 auto;\n padding: 20px 0;\n margin-top: 40px;\n box-sizing: border-box;\n\n @media screen and (max-width: 400px) {\n width: 100%;\n margin-top: 0;\n padding: 20px;\n }\n }\n}\n\n.account-header {\n width: 400px;\n margin: 0 auto;\n display: flex;\n font-size: 13px;\n line-height: 18px;\n box-sizing: border-box;\n padding: 20px 0;\n padding-bottom: 0;\n margin-bottom: -30px;\n margin-top: 40px;\n\n @media screen and (max-width: 440px) {\n width: 100%;\n margin: 0;\n margin-bottom: 10px;\n padding: 20px;\n padding-bottom: 0;\n }\n\n .avatar {\n width: 40px;\n height: 40px;\n margin-right: 8px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n }\n }\n\n .name {\n flex: 1 1 auto;\n color: $secondary-text-color;\n width: calc(100% - 88px);\n\n .username {\n display: block;\n font-weight: 500;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n }\n\n .logout-link {\n display: block;\n font-size: 32px;\n line-height: 40px;\n margin-left: 8px;\n }\n}\n\n.grid-3 {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: 3fr 1fr;\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-column: 1 / 3;\n grid-row: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 2;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1 / 3;\n grid-row: 3;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n grid-template-columns: minmax(0, 100%);\n\n .column-0 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .column-2 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1;\n grid-row: 4;\n }\n }\n}\n\n.grid-4 {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: repeat(4, minmax(0, 1fr));\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-column: 1 / 5;\n grid-row: 1;\n }\n\n .column-1 {\n grid-column: 1 / 4;\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 4;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 2 / 5;\n grid-row: 3;\n }\n\n .column-4 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .landing-page__call-to-action {\n min-height: 100%;\n }\n\n .flash-message {\n margin-bottom: 10px;\n }\n\n @media screen and (max-width: 738px) {\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n .landing-page__call-to-action {\n padding: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .row__information-board {\n width: 100%;\n justify-content: center;\n align-items: center;\n }\n\n .row__mascot {\n display: none;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n grid-template-columns: minmax(0, 100%);\n\n .column-0 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .column-2 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1;\n grid-row: 5;\n }\n\n .column-4 {\n grid-column: 1;\n grid-row: 4;\n }\n }\n}\n\n.public-layout {\n @media screen and (max-width: $no-gap-breakpoint) {\n padding-top: 48px;\n }\n\n .container {\n max-width: 960px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding: 0;\n }\n }\n\n .header {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n height: 48px;\n margin: 10px 0;\n display: flex;\n align-items: stretch;\n justify-content: center;\n flex-wrap: nowrap;\n overflow: hidden;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n position: fixed;\n width: 100%;\n top: 0;\n left: 0;\n margin: 0;\n border-radius: 0;\n box-shadow: none;\n z-index: 110;\n }\n\n & > div {\n flex: 1 1 33.3%;\n min-height: 1px;\n }\n\n .nav-left {\n display: flex;\n align-items: stretch;\n justify-content: flex-start;\n flex-wrap: nowrap;\n }\n\n .nav-center {\n display: flex;\n align-items: stretch;\n justify-content: center;\n flex-wrap: nowrap;\n }\n\n .nav-right {\n display: flex;\n align-items: stretch;\n justify-content: flex-end;\n flex-wrap: nowrap;\n }\n\n .brand {\n display: block;\n padding: 15px;\n\n svg {\n display: block;\n height: 18px;\n width: auto;\n position: relative;\n bottom: -2px;\n fill: $primary-text-color;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n height: 20px;\n }\n }\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 12%);\n }\n }\n\n .nav-link {\n display: flex;\n align-items: center;\n padding: 0 1rem;\n font-size: 12px;\n font-weight: 500;\n text-decoration: none;\n color: $darker-text-color;\n white-space: nowrap;\n text-align: center;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n color: $primary-text-color;\n }\n\n @media screen and (max-width: 550px) {\n &.optional {\n display: none;\n }\n }\n }\n\n .nav-button {\n background: lighten($ui-base-color, 16%);\n margin: 8px;\n margin-left: 0;\n border-radius: 4px;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n background: lighten($ui-base-color, 20%);\n }\n }\n }\n\n $no-columns-breakpoint: 600px;\n\n .grid {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(300px, 3fr) minmax(298px, 1fr);\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-row: 1;\n grid-column: 1;\n }\n\n .column-1 {\n grid-row: 1;\n grid-column: 2;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n grid-template-columns: 100%;\n grid-gap: 0;\n\n .column-1 {\n display: none;\n }\n }\n }\n\n .directory__card {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n\n .page-header {\n @media screen and (max-width: $no-gap-breakpoint) {\n border-bottom: 0;\n }\n }\n\n .public-account-header {\n overflow: hidden;\n margin-bottom: 10px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &.inactive {\n opacity: 0.5;\n\n .public-account-header__image,\n .avatar {\n filter: grayscale(100%);\n }\n\n .logo-button {\n background-color: $secondary-text-color;\n }\n }\n\n &__image {\n border-radius: 4px 4px 0 0;\n overflow: hidden;\n height: 300px;\n position: relative;\n background: darken($ui-base-color, 12%);\n\n &::after {\n content: \"\";\n display: block;\n position: absolute;\n width: 100%;\n height: 100%;\n box-shadow: inset 0 -1px 1px 1px rgba($base-shadow-color, 0.15);\n top: 0;\n left: 0;\n }\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 4px 4px 0 0;\n }\n\n @media screen and (max-width: 600px) {\n height: 200px;\n }\n }\n\n &--no-bar {\n margin-bottom: 0;\n\n .public-account-header__image,\n .public-account-header__image img {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n box-shadow: none;\n\n &__image::after {\n display: none;\n }\n\n &__image,\n &__image img {\n border-radius: 0;\n }\n }\n\n &__bar {\n position: relative;\n margin-top: -80px;\n display: flex;\n justify-content: flex-start;\n\n &::before {\n content: \"\";\n display: block;\n background: lighten($ui-base-color, 4%);\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: 60px;\n border-radius: 0 0 4px 4px;\n z-index: -1;\n }\n\n .avatar {\n display: block;\n width: 120px;\n height: 120px;\n padding-left: 20px - 4px;\n flex: 0 0 auto;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 50%;\n border: 4px solid lighten($ui-base-color, 4%);\n background: darken($ui-base-color, 8%);\n }\n }\n\n @media screen and (max-width: 600px) {\n margin-top: 0;\n background: lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n padding: 5px;\n\n &::before {\n display: none;\n }\n\n .avatar {\n width: 48px;\n height: 48px;\n padding: 7px 0;\n padding-left: 10px;\n\n img {\n border: 0;\n border-radius: 4px;\n }\n\n @media screen and (max-width: 360px) {\n display: none;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n flex-wrap: wrap;\n }\n }\n\n &__tabs {\n flex: 1 1 auto;\n margin-left: 20px;\n\n &__name {\n padding-top: 20px;\n padding-bottom: 8px;\n\n h1 {\n font-size: 20px;\n line-height: 18px * 1.5;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n text-shadow: 1px 1px 1px $base-shadow-color;\n\n small {\n display: block;\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n @media screen and (max-width: 600px) {\n margin-left: 15px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n &__name {\n padding-top: 0;\n padding-bottom: 0;\n\n h1 {\n font-size: 16px;\n line-height: 24px;\n text-shadow: none;\n\n small {\n color: $darker-text-color;\n }\n }\n }\n }\n\n &__tabs {\n display: flex;\n justify-content: flex-start;\n align-items: stretch;\n height: 58px;\n\n .details-counters {\n display: flex;\n flex-direction: row;\n min-width: 300px;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n .details-counters {\n display: none;\n }\n }\n\n .counter {\n min-width: 33.3%;\n box-sizing: border-box;\n flex: 0 0 auto;\n color: $darker-text-color;\n padding: 10px;\n border-right: 1px solid lighten($ui-base-color, 4%);\n cursor: default;\n text-align: center;\n position: relative;\n\n a {\n display: block;\n }\n\n &:last-child {\n border-right: 0;\n }\n\n &::after {\n display: block;\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n border-bottom: 4px solid $ui-primary-color;\n opacity: 0.5;\n transition: all 400ms ease;\n }\n\n &.active {\n &::after {\n border-bottom: 4px solid $highlight-text-color;\n opacity: 1;\n }\n\n &.inactive::after {\n border-bottom-color: $secondary-text-color;\n }\n }\n\n &:hover {\n &::after {\n opacity: 1;\n transition-duration: 100ms;\n }\n }\n\n a {\n text-decoration: none;\n color: inherit;\n }\n\n .counter-label {\n font-size: 12px;\n display: block;\n }\n\n .counter-number {\n font-weight: 500;\n font-size: 18px;\n margin-bottom: 5px;\n color: $primary-text-color;\n font-family: $font-display, sans-serif;\n }\n }\n\n .spacer {\n flex: 1 1 auto;\n height: 1px;\n }\n\n &__buttons {\n padding: 7px 8px;\n }\n }\n }\n\n &__extra {\n display: none;\n margin-top: 4px;\n\n .public-account-bio {\n border-radius: 0;\n box-shadow: none;\n background: transparent;\n margin: 0 -5px;\n\n .account__header__fields {\n border-top: 1px solid lighten($ui-base-color, 12%);\n }\n\n .roles {\n display: none;\n }\n }\n\n &__links {\n margin-top: -15px;\n font-size: 14px;\n color: $darker-text-color;\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n padding: 15px;\n font-weight: 500;\n\n strong {\n font-weight: 700;\n color: $primary-text-color;\n }\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n flex: 100%;\n }\n }\n }\n\n .account__section-headline {\n border-radius: 4px 4px 0 0;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n\n .detailed-status__meta {\n margin-top: 25px;\n }\n\n .public-account-bio {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n overflow: hidden;\n margin-bottom: 10px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n box-shadow: none;\n margin-bottom: 0;\n border-radius: 0;\n }\n\n .account__header__fields {\n margin: 0;\n border-top: 0;\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n\n .account__header__content {\n padding: 20px;\n padding-bottom: 0;\n color: $primary-text-color;\n }\n\n &__extra,\n .roles {\n padding: 20px;\n font-size: 14px;\n color: $darker-text-color;\n }\n\n .roles {\n padding-bottom: 0;\n }\n }\n\n .directory__list {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: block;\n }\n\n .icon-button {\n font-size: 18px;\n }\n }\n\n .directory__card {\n margin-bottom: 0;\n }\n\n .card-grid {\n display: flex;\n flex-wrap: wrap;\n min-width: 100%;\n margin: 0 -5px;\n\n & > div {\n box-sizing: border-box;\n flex: 1 0 auto;\n width: 300px;\n padding: 0 5px;\n margin-bottom: 10px;\n max-width: 33.333%;\n\n @media screen and (max-width: 900px) {\n max-width: 50%;\n }\n\n @media screen and (max-width: 600px) {\n max-width: 100%;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin: 0;\n border-top: 1px solid lighten($ui-base-color, 8%);\n\n & > div {\n width: 100%;\n padding: 0;\n margin-bottom: 0;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &:last-child {\n border-bottom: 0;\n }\n\n .card__bar {\n background: $ui-base-color;\n\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n }\n }\n }\n }\n}\n",".no-list {\n list-style: none;\n\n li {\n display: inline-block;\n margin: 0 5px;\n }\n}\n\n.recovery-codes {\n list-style: none;\n margin: 0 auto;\n\n li {\n font-size: 125%;\n line-height: 1.5;\n letter-spacing: 1px;\n }\n}\n",".public-layout {\n .footer {\n text-align: left;\n padding-top: 20px;\n padding-bottom: 60px;\n font-size: 12px;\n color: lighten($ui-base-color, 34%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding-left: 20px;\n padding-right: 20px;\n }\n\n .grid {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: 1fr 1fr 2fr 1fr 1fr;\n\n .column-0 {\n grid-column: 1;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-1 {\n grid-column: 2;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-2 {\n grid-column: 3;\n grid-row: 1;\n min-width: 0;\n text-align: center;\n\n h4 a {\n color: lighten($ui-base-color, 34%);\n }\n }\n\n .column-3 {\n grid-column: 4;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-4 {\n grid-column: 5;\n grid-row: 1;\n min-width: 0;\n }\n\n @media screen and (max-width: 690px) {\n grid-template-columns: 1fr 2fr 1fr;\n\n .column-0,\n .column-1 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 2;\n }\n\n .column-3,\n .column-4 {\n grid-column: 3;\n }\n\n .column-4 {\n grid-row: 2;\n }\n }\n\n @media screen and (max-width: 600px) {\n .column-1 {\n display: block;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n .column-0,\n .column-1,\n .column-3,\n .column-4 {\n display: none;\n }\n }\n }\n\n h4 {\n font-weight: 700;\n margin-bottom: 8px;\n color: $darker-text-color;\n\n a {\n color: inherit;\n text-decoration: none;\n }\n }\n\n ul a {\n text-decoration: none;\n color: lighten($ui-base-color, 34%);\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n\n .brand {\n svg {\n display: block;\n height: 36px;\n width: auto;\n margin: 0 auto;\n fill: lighten($ui-base-color, 34%);\n }\n\n &:hover,\n &:focus,\n &:active {\n svg {\n fill: lighten($ui-base-color, 38%);\n }\n }\n }\n }\n}\n",".compact-header {\n h1 {\n font-size: 24px;\n line-height: 28px;\n color: $darker-text-color;\n font-weight: 500;\n margin-bottom: 20px;\n padding: 0 10px;\n word-wrap: break-word;\n\n @media screen and (max-width: 740px) {\n text-align: center;\n padding: 20px 10px 0;\n }\n\n a {\n color: inherit;\n text-decoration: none;\n }\n\n small {\n font-weight: 400;\n color: $secondary-text-color;\n }\n\n img {\n display: inline-block;\n margin-bottom: -5px;\n margin-right: 15px;\n width: 36px;\n height: 36px;\n }\n }\n}\n",".hero-widget {\n margin-bottom: 10px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &__img {\n width: 100%;\n position: relative;\n overflow: hidden;\n border-radius: 4px 4px 0 0;\n background: $base-shadow-color;\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 4px 4px 0 0;\n }\n }\n\n &__text {\n background: $ui-base-color;\n padding: 20px;\n border-radius: 0 0 4px 4px;\n font-size: 15px;\n color: $darker-text-color;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n p {\n margin-bottom: 20px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n em {\n display: inline;\n margin: 0;\n padding: 0;\n font-weight: 700;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n color: lighten($darker-text-color, 10%);\n }\n\n a {\n color: $secondary-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n}\n\n.endorsements-widget {\n margin-bottom: 10px;\n padding-bottom: 10px;\n\n h4 {\n padding: 10px;\n font-weight: 700;\n font-size: 14px;\n color: $darker-text-color;\n }\n\n .account {\n padding: 10px 0;\n\n &:last-child {\n border-bottom: 0;\n }\n\n .account__display-name {\n display: flex;\n align-items: center;\n }\n\n .account__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n }\n\n .trends__item {\n padding: 10px;\n }\n}\n\n.trends-widget {\n h4 {\n color: $darker-text-color;\n }\n}\n\n.box-widget {\n padding: 20px;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n}\n\n.placeholder-widget {\n padding: 16px;\n border-radius: 4px;\n border: 2px dashed $dark-text-color;\n text-align: center;\n color: $darker-text-color;\n margin-bottom: 10px;\n}\n\n.contact-widget {\n min-height: 100%;\n font-size: 15px;\n color: $darker-text-color;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n padding: 0;\n\n h4 {\n padding: 10px;\n font-weight: 700;\n font-size: 14px;\n color: $darker-text-color;\n }\n\n .account {\n border-bottom: 0;\n padding: 10px 0;\n padding-top: 5px;\n }\n\n & > a {\n display: inline-block;\n padding: 10px;\n padding-top: 0;\n color: $darker-text-color;\n text-decoration: none;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.moved-account-widget {\n padding: 15px;\n padding-bottom: 20px;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n color: $secondary-text-color;\n font-weight: 400;\n margin-bottom: 10px;\n\n strong,\n a {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n color: inherit;\n text-decoration: underline;\n\n &.mention {\n text-decoration: none;\n\n span {\n text-decoration: none;\n }\n\n &:focus,\n &:hover,\n &:active {\n text-decoration: none;\n\n span {\n text-decoration: underline;\n }\n }\n }\n }\n\n &__message {\n margin-bottom: 15px;\n\n .fa {\n margin-right: 5px;\n color: $darker-text-color;\n }\n }\n\n &__card {\n .detailed-status__display-avatar {\n position: relative;\n cursor: pointer;\n }\n\n .detailed-status__display-name {\n margin-bottom: 0;\n text-decoration: none;\n\n span {\n font-weight: 400;\n }\n }\n }\n}\n\n.memoriam-widget {\n padding: 20px;\n border-radius: 4px;\n background: $base-shadow-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n font-size: 14px;\n color: $darker-text-color;\n margin-bottom: 10px;\n}\n\n.page-header {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n padding: 60px 15px;\n text-align: center;\n margin: 10px 0;\n\n h1 {\n color: $primary-text-color;\n font-size: 36px;\n line-height: 1.1;\n font-weight: 700;\n margin-bottom: 10px;\n }\n\n p {\n font-size: 15px;\n color: $darker-text-color;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-top: 0;\n background: lighten($ui-base-color, 4%);\n\n h1 {\n font-size: 24px;\n }\n }\n}\n\n.directory {\n background: $ui-base-color;\n border-radius: 4px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &__tag {\n box-sizing: border-box;\n margin-bottom: 10px;\n\n & > a,\n & > div {\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: $ui-base-color;\n border-radius: 4px;\n padding: 15px;\n text-decoration: none;\n color: inherit;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n }\n\n & > a {\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 8%);\n }\n }\n\n &.active > a {\n background: $ui-highlight-color;\n cursor: default;\n }\n\n &.disabled > div {\n opacity: 0.5;\n cursor: default;\n }\n\n h4 {\n flex: 1 1 auto;\n font-size: 18px;\n font-weight: 700;\n color: $primary-text-color;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n .fa {\n color: $darker-text-color;\n }\n\n small {\n display: block;\n font-weight: 400;\n font-size: 15px;\n margin-top: 8px;\n color: $darker-text-color;\n }\n }\n\n &.active h4 {\n &,\n .fa,\n small,\n .trends__item__current {\n color: $primary-text-color;\n }\n }\n\n .avatar-stack {\n flex: 0 0 auto;\n width: (36px + 4px) * 3;\n }\n\n &.active .avatar-stack .account__avatar {\n border-color: $ui-highlight-color;\n }\n\n .trends__item__current {\n padding-right: 0;\n }\n }\n}\n\n.avatar-stack {\n display: flex;\n justify-content: flex-end;\n\n .account__avatar {\n flex: 0 0 auto;\n width: 36px;\n height: 36px;\n border-radius: 50%;\n position: relative;\n margin-left: -10px;\n background: darken($ui-base-color, 8%);\n border: 2px solid $ui-base-color;\n\n &:nth-child(1) {\n z-index: 1;\n }\n\n &:nth-child(2) {\n z-index: 2;\n }\n\n &:nth-child(3) {\n z-index: 3;\n }\n }\n}\n\n.accounts-table {\n width: 100%;\n\n .account {\n padding: 0;\n border: 0;\n }\n\n strong {\n font-weight: 700;\n }\n\n thead th {\n text-align: center;\n color: $darker-text-color;\n font-weight: 700;\n padding: 10px;\n\n &:first-child {\n text-align: left;\n }\n }\n\n tbody td {\n padding: 15px 0;\n vertical-align: middle;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n tbody tr:last-child td {\n border-bottom: 0;\n }\n\n &__count {\n width: 120px;\n text-align: center;\n font-size: 15px;\n font-weight: 500;\n color: $primary-text-color;\n\n small {\n display: block;\n color: $darker-text-color;\n font-weight: 400;\n font-size: 14px;\n }\n }\n\n &__comment {\n width: 50%;\n vertical-align: initial !important;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n tbody td.optional {\n display: none;\n }\n }\n}\n\n.moved-account-widget,\n.memoriam-widget,\n.box-widget,\n.contact-widget,\n.landing-page__information.contact-widget,\n.directory,\n.page-header {\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n box-shadow: none;\n border-radius: 0;\n }\n}\n\n$maximum-width: 1235px;\n$fluid-breakpoint: $maximum-width + 20px;\n\n.statuses-grid {\n min-height: 600px;\n\n @media screen and (max-width: 640px) {\n width: 100% !important; // Masonry layout is unnecessary at this width\n }\n\n &__item {\n width: (960px - 20px) / 3;\n\n @media screen and (max-width: $fluid-breakpoint) {\n width: (940px - 20px) / 3;\n }\n\n @media screen and (max-width: 640px) {\n width: 100%;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n width: 100vw;\n }\n }\n\n .detailed-status {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 1px solid lighten($ui-base-color, 16%);\n }\n\n &.compact {\n .detailed-status__meta {\n margin-top: 15px;\n }\n\n .status__content {\n font-size: 15px;\n line-height: 20px;\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n .status__content__spoiler-link {\n line-height: 20px;\n margin: 0;\n }\n }\n\n .media-gallery,\n .status-card,\n .video-player {\n margin-top: 15px;\n }\n }\n }\n}\n\n.notice-widget {\n margin-bottom: 10px;\n color: $darker-text-color;\n\n p {\n margin-bottom: 10px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n font-size: 14px;\n line-height: 20px;\n }\n}\n\n.notice-widget,\n.placeholder-widget {\n a {\n text-decoration: none;\n font-weight: 500;\n color: $ui-highlight-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.table-of-contents {\n background: darken($ui-base-color, 4%);\n min-height: 100%;\n font-size: 14px;\n border-radius: 4px;\n\n li a {\n display: block;\n font-weight: 500;\n padding: 15px;\n overflow: hidden;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n text-decoration: none;\n color: $primary-text-color;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n\n li:last-child a {\n border-bottom: 0;\n }\n\n li ul {\n padding-left: 20px;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n }\n}\n","$no-columns-breakpoint: 600px;\n\ncode {\n font-family: $font-monospace, monospace;\n font-weight: 400;\n}\n\n.form-container {\n max-width: 400px;\n padding: 20px;\n margin: 0 auto;\n}\n\n.simple_form {\n .input {\n margin-bottom: 15px;\n overflow: hidden;\n\n &.hidden {\n margin: 0;\n }\n\n &.radio_buttons {\n .radio {\n margin-bottom: 15px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .radio > label {\n position: relative;\n padding-left: 28px;\n\n input {\n position: absolute;\n top: -2px;\n left: 0;\n }\n }\n }\n\n &.boolean {\n position: relative;\n margin-bottom: 0;\n\n .label_input > label {\n font-family: inherit;\n font-size: 14px;\n padding-top: 5px;\n color: $primary-text-color;\n display: block;\n width: auto;\n }\n\n .label_input,\n .hint {\n padding-left: 28px;\n }\n\n .label_input__wrapper {\n position: static;\n }\n\n label.checkbox {\n position: absolute;\n top: 2px;\n left: 0;\n }\n\n label a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: none;\n }\n }\n\n .recommended {\n position: absolute;\n margin: 0 4px;\n margin-top: -2px;\n }\n }\n }\n\n .row {\n display: flex;\n margin: 0 -5px;\n\n .input {\n box-sizing: border-box;\n flex: 1 1 auto;\n width: 50%;\n padding: 0 5px;\n }\n }\n\n .hint {\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n }\n\n code {\n border-radius: 3px;\n padding: 0.2em 0.4em;\n background: darken($ui-base-color, 12%);\n }\n\n li {\n list-style: disc;\n margin-left: 18px;\n }\n }\n\n ul.hint {\n margin-bottom: 15px;\n }\n\n span.hint {\n display: block;\n font-size: 12px;\n margin-top: 4px;\n }\n\n p.hint {\n margin-bottom: 15px;\n color: $darker-text-color;\n\n &.subtle-hint {\n text-align: center;\n font-size: 12px;\n line-height: 18px;\n margin-top: 15px;\n margin-bottom: 0;\n }\n }\n\n .card {\n margin-bottom: 15px;\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n .input.with_floating_label {\n .label_input {\n display: flex;\n\n & > label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 500;\n min-width: 150px;\n flex: 0 0 auto;\n }\n\n input,\n select {\n flex: 1 1 auto;\n }\n }\n\n &.select .hint {\n margin-top: 6px;\n margin-left: 150px;\n }\n }\n\n .input.with_label {\n .label_input > label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: block;\n margin-bottom: 8px;\n word-wrap: break-word;\n font-weight: 500;\n }\n\n .hint {\n margin-top: 6px;\n }\n\n ul {\n flex: 390px;\n }\n }\n\n .input.with_block_label {\n max-width: none;\n\n & > label {\n font-family: inherit;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n font-weight: 500;\n padding-top: 5px;\n }\n\n .hint {\n margin-bottom: 15px;\n }\n\n ul {\n columns: 2;\n }\n }\n\n .required abbr {\n text-decoration: none;\n color: lighten($error-value-color, 12%);\n }\n\n .fields-group {\n margin-bottom: 25px;\n\n .input:last-child {\n margin-bottom: 0;\n }\n }\n\n .fields-row {\n display: flex;\n margin: 0 -10px;\n padding-top: 5px;\n margin-bottom: 25px;\n\n .input {\n max-width: none;\n }\n\n &__column {\n box-sizing: border-box;\n padding: 0 10px;\n flex: 1 1 auto;\n min-height: 1px;\n\n &-6 {\n max-width: 50%;\n }\n\n .actions {\n margin-top: 27px;\n }\n }\n\n .fields-group:last-child,\n .fields-row__column.fields-group {\n margin-bottom: 0;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n margin-bottom: 0;\n\n &__column {\n max-width: none;\n }\n\n .fields-group:last-child,\n .fields-row__column.fields-group,\n .fields-row__column {\n margin-bottom: 25px;\n }\n }\n }\n\n .input.radio_buttons .radio label {\n margin-bottom: 5px;\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: block;\n width: auto;\n }\n\n .check_boxes {\n .checkbox {\n label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: inline-block;\n width: auto;\n position: relative;\n padding-top: 5px;\n padding-left: 25px;\n flex: 1 1 auto;\n }\n\n input[type=checkbox] {\n position: absolute;\n left: 0;\n top: 5px;\n margin: 0;\n }\n }\n }\n\n .input.static .label_input__wrapper {\n font-size: 16px;\n padding: 10px;\n border: 1px solid $dark-text-color;\n border-radius: 4px;\n }\n\n input[type=text],\n input[type=number],\n input[type=email],\n input[type=password],\n textarea {\n box-sizing: border-box;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n width: 100%;\n outline: 0;\n font-family: inherit;\n resize: vertical;\n background: darken($ui-base-color, 10%);\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n padding: 10px;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &:invalid {\n box-shadow: none;\n }\n\n &:focus:invalid:not(:placeholder-shown) {\n border-color: lighten($error-red, 12%);\n }\n\n &:required:valid {\n border-color: $valid-value-color;\n }\n\n &:hover {\n border-color: darken($ui-base-color, 20%);\n }\n\n &:active,\n &:focus {\n border-color: $highlight-text-color;\n background: darken($ui-base-color, 8%);\n }\n }\n\n .input.field_with_errors {\n label {\n color: lighten($error-red, 12%);\n }\n\n input[type=text],\n input[type=number],\n input[type=email],\n input[type=password],\n textarea,\n select {\n border-color: lighten($error-red, 12%);\n }\n\n .error {\n display: block;\n font-weight: 500;\n color: lighten($error-red, 12%);\n margin-top: 4px;\n }\n }\n\n .input.disabled {\n opacity: 0.5;\n }\n\n .actions {\n margin-top: 30px;\n display: flex;\n\n &.actions--top {\n margin-top: 0;\n margin-bottom: 30px;\n }\n }\n\n button,\n .button,\n .block-button {\n display: block;\n width: 100%;\n border: 0;\n border-radius: 4px;\n background: $ui-highlight-color;\n color: $primary-text-color;\n font-size: 18px;\n line-height: inherit;\n height: auto;\n padding: 10px;\n text-decoration: none;\n text-align: center;\n box-sizing: border-box;\n cursor: pointer;\n font-weight: 500;\n outline: 0;\n margin-bottom: 10px;\n margin-right: 10px;\n\n &:last-child {\n margin-right: 0;\n }\n\n &:hover {\n background-color: lighten($ui-highlight-color, 5%);\n }\n\n &:active,\n &:focus {\n background-color: darken($ui-highlight-color, 5%);\n }\n\n &:disabled:hover {\n background-color: $ui-primary-color;\n }\n\n &.negative {\n background: $error-value-color;\n\n &:hover {\n background-color: lighten($error-value-color, 5%);\n }\n\n &:active,\n &:focus {\n background-color: darken($error-value-color, 5%);\n }\n }\n }\n\n select {\n appearance: none;\n box-sizing: border-box;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n width: 100%;\n outline: 0;\n font-family: inherit;\n resize: vertical;\n background: darken($ui-base-color, 10%) url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center / auto 16px;\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n padding-left: 10px;\n padding-right: 30px;\n height: 41px;\n }\n\n h4 {\n margin-bottom: 15px !important;\n }\n\n .label_input {\n &__wrapper {\n position: relative;\n }\n\n &__append {\n position: absolute;\n right: 3px;\n top: 1px;\n padding: 10px;\n padding-bottom: 9px;\n font-size: 16px;\n color: $dark-text-color;\n font-family: inherit;\n pointer-events: none;\n cursor: default;\n max-width: 140px;\n white-space: nowrap;\n overflow: hidden;\n\n &::after {\n content: '';\n display: block;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 1px;\n width: 5px;\n background-image: linear-gradient(to right, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));\n }\n }\n }\n\n &__overlay-area {\n position: relative;\n\n &__blurred form {\n filter: blur(2px);\n }\n\n &__overlay {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n background: rgba($ui-base-color, 0.65);\n border-radius: 4px;\n margin-left: -4px;\n margin-top: -4px;\n padding: 4px;\n\n &__content {\n text-align: center;\n\n &.rich-formatting {\n &,\n p {\n color: $primary-text-color;\n }\n }\n }\n }\n }\n}\n\n.block-icon {\n display: block;\n margin: 0 auto;\n margin-bottom: 10px;\n font-size: 24px;\n}\n\n.flash-message {\n background: lighten($ui-base-color, 8%);\n color: $darker-text-color;\n border-radius: 4px;\n padding: 15px 10px;\n margin-bottom: 30px;\n text-align: center;\n\n &.notice {\n border: 1px solid rgba($valid-value-color, 0.5);\n background: rgba($valid-value-color, 0.25);\n color: $valid-value-color;\n }\n\n &.alert {\n border: 1px solid rgba($error-value-color, 0.5);\n background: rgba($error-value-color, 0.25);\n color: $error-value-color;\n }\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n\n &:hover {\n color: $primary-text-color;\n text-decoration: underline;\n }\n }\n\n p {\n margin-bottom: 15px;\n }\n\n .oauth-code {\n outline: 0;\n box-sizing: border-box;\n display: block;\n width: 100%;\n border: 0;\n padding: 10px;\n font-family: $font-monospace, monospace;\n background: $ui-base-color;\n color: $primary-text-color;\n font-size: 14px;\n margin: 0;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n @media screen and (max-width: 740px) and (min-width: 441px) {\n margin-top: 40px;\n }\n}\n\n.form-footer {\n margin-top: 30px;\n text-align: center;\n\n a {\n color: $darker-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.quick-nav {\n list-style: none;\n margin-bottom: 25px;\n font-size: 14px;\n\n li {\n display: inline-block;\n margin-right: 10px;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n font-weight: 700;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($highlight-text-color, 8%);\n }\n }\n}\n\n.oauth-prompt,\n.follow-prompt {\n margin-bottom: 30px;\n color: $darker-text-color;\n\n h2 {\n font-size: 16px;\n margin-bottom: 30px;\n text-align: center;\n }\n\n strong {\n color: $secondary-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n @media screen and (max-width: 740px) and (min-width: 441px) {\n margin-top: 40px;\n }\n}\n\n.qr-wrapper {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n}\n\n.qr-code {\n flex: 0 0 auto;\n background: $simple-background-color;\n padding: 4px;\n margin: 0 10px 20px 0;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n display: inline-block;\n\n svg {\n display: block;\n margin: 0;\n }\n}\n\n.qr-alternative {\n margin-bottom: 20px;\n color: $secondary-text-color;\n flex: 150px;\n\n samp {\n display: block;\n font-size: 14px;\n }\n}\n\n.table-form {\n p {\n margin-bottom: 15px;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n }\n}\n\n.simple_form,\n.table-form {\n .warning {\n box-sizing: border-box;\n background: rgba($error-value-color, 0.5);\n color: $primary-text-color;\n text-shadow: 1px 1px 0 rgba($base-shadow-color, 0.3);\n box-shadow: 0 2px 6px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n padding: 10px;\n margin-bottom: 15px;\n\n a {\n color: $primary-text-color;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n strong {\n font-weight: 600;\n display: block;\n margin-bottom: 5px;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n\n .fa {\n font-weight: 400;\n }\n }\n }\n}\n\n.action-pagination {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n\n .actions,\n .pagination {\n flex: 1 1 auto;\n }\n\n .actions {\n padding: 30px 0;\n padding-right: 20px;\n flex: 0 0 auto;\n }\n}\n\n.post-follow-actions {\n text-align: center;\n color: $darker-text-color;\n\n div {\n margin-bottom: 4px;\n }\n}\n\n.alternative-login {\n margin-top: 20px;\n margin-bottom: 20px;\n\n h4 {\n font-size: 16px;\n color: $primary-text-color;\n text-align: center;\n margin-bottom: 20px;\n border: 0;\n padding: 0;\n }\n\n .button {\n display: block;\n }\n}\n\n.scope-danger {\n color: $warning-red;\n}\n\n.form_admin_settings_site_short_description,\n.form_admin_settings_site_description,\n.form_admin_settings_site_extended_description,\n.form_admin_settings_site_terms,\n.form_admin_settings_custom_css,\n.form_admin_settings_closed_registrations_message {\n textarea {\n font-family: $font-monospace, monospace;\n }\n}\n\n.input-copy {\n background: darken($ui-base-color, 10%);\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n display: flex;\n align-items: center;\n padding-right: 4px;\n position: relative;\n top: 1px;\n transition: border-color 300ms linear;\n\n &__wrapper {\n flex: 1 1 auto;\n }\n\n input[type=text] {\n background: transparent;\n border: 0;\n padding: 10px;\n font-size: 14px;\n font-family: $font-monospace, monospace;\n }\n\n button {\n flex: 0 0 auto;\n margin: 4px;\n text-transform: none;\n font-weight: 400;\n font-size: 14px;\n padding: 7px 18px;\n padding-bottom: 6px;\n width: auto;\n transition: background 300ms linear;\n }\n\n &.copied {\n border-color: $valid-value-color;\n transition: none;\n\n button {\n background: $valid-value-color;\n transition: none;\n }\n }\n}\n\n.connection-prompt {\n margin-bottom: 25px;\n\n .fa-link {\n background-color: darken($ui-base-color, 4%);\n border-radius: 100%;\n font-size: 24px;\n padding: 10px;\n }\n\n &__column {\n align-items: center;\n display: flex;\n flex: 1;\n flex-direction: column;\n flex-shrink: 1;\n max-width: 50%;\n\n &-sep {\n align-self: center;\n flex-grow: 0;\n overflow: visible;\n position: relative;\n z-index: 1;\n }\n\n p {\n word-break: break-word;\n }\n }\n\n .account__avatar {\n margin-bottom: 20px;\n }\n\n &__connection {\n background-color: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n padding: 25px 10px;\n position: relative;\n text-align: center;\n\n &::after {\n background-color: darken($ui-base-color, 4%);\n content: '';\n display: block;\n height: 100%;\n left: 50%;\n position: absolute;\n top: 0;\n width: 1px;\n }\n }\n\n &__row {\n align-items: flex-start;\n display: flex;\n flex-direction: row;\n }\n}\n",".card {\n & > a {\n display: block;\n text-decoration: none;\n color: inherit;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n box-shadow: none;\n }\n\n &:hover,\n &:active,\n &:focus {\n .card__bar {\n background: lighten($ui-base-color, 8%);\n }\n }\n }\n\n &__img {\n height: 130px;\n position: relative;\n background: darken($ui-base-color, 12%);\n border-radius: 4px 4px 0 0;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n object-fit: cover;\n border-radius: 4px 4px 0 0;\n }\n\n @media screen and (max-width: 600px) {\n height: 200px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n\n &__bar {\n position: relative;\n padding: 15px;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n\n .avatar {\n flex: 0 0 auto;\n width: 48px;\n height: 48px;\n padding-top: 2px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n background: darken($ui-base-color, 8%);\n object-fit: cover;\n }\n }\n\n .display-name {\n margin-left: 15px;\n text-align: left;\n\n strong {\n font-size: 15px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n span {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n}\n\n.pagination {\n padding: 30px 0;\n text-align: center;\n overflow: hidden;\n\n a,\n .current,\n .newer,\n .older,\n .page,\n .gap {\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 500;\n display: inline-block;\n padding: 6px 10px;\n text-decoration: none;\n }\n\n .current {\n background: $simple-background-color;\n border-radius: 100px;\n color: $inverted-text-color;\n cursor: default;\n margin: 0 10px;\n }\n\n .gap {\n cursor: default;\n }\n\n .older,\n .newer {\n color: $secondary-text-color;\n }\n\n .older {\n float: left;\n padding-left: 0;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n .newer {\n float: right;\n padding-right: 0;\n\n .fa {\n display: inline-block;\n margin-left: 5px;\n }\n }\n\n .disabled {\n cursor: default;\n color: lighten($inverted-text-color, 10%);\n }\n\n @media screen and (max-width: 700px) {\n padding: 30px 20px;\n\n .page {\n display: none;\n }\n\n .newer,\n .older {\n display: inline-block;\n }\n }\n}\n\n.nothing-here {\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n color: $light-text-color;\n font-size: 14px;\n font-weight: 500;\n text-align: center;\n display: flex;\n justify-content: center;\n align-items: center;\n cursor: default;\n border-radius: 4px;\n padding: 20px;\n min-height: 30vh;\n\n &--under-tabs {\n border-radius: 0 0 4px 4px;\n }\n\n &--flexible {\n box-sizing: border-box;\n min-height: 100%;\n }\n}\n\n.account-role,\n.simple_form .recommended {\n display: inline-block;\n padding: 4px 6px;\n cursor: default;\n border-radius: 3px;\n font-size: 12px;\n line-height: 12px;\n font-weight: 500;\n color: $ui-secondary-color;\n background-color: rgba($ui-secondary-color, 0.1);\n border: 1px solid rgba($ui-secondary-color, 0.5);\n\n &.moderator {\n color: $success-green;\n background-color: rgba($success-green, 0.1);\n border-color: rgba($success-green, 0.5);\n }\n\n &.admin {\n color: lighten($error-red, 12%);\n background-color: rgba(lighten($error-red, 12%), 0.1);\n border-color: rgba(lighten($error-red, 12%), 0.5);\n }\n}\n\n.account__header__fields {\n max-width: 100vw;\n padding: 0;\n margin: 15px -15px -15px;\n border: 0 none;\n border-top: 1px solid lighten($ui-base-color, 12%);\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n font-size: 14px;\n line-height: 20px;\n\n dl {\n display: flex;\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n }\n\n dt,\n dd {\n box-sizing: border-box;\n padding: 14px;\n text-align: center;\n max-height: 48px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n dt {\n font-weight: 500;\n width: 120px;\n flex: 0 0 auto;\n color: $secondary-text-color;\n background: rgba(darken($ui-base-color, 8%), 0.5);\n }\n\n dd {\n flex: 1 1 auto;\n color: $darker-text-color;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n\n .verified {\n border: 1px solid rgba($valid-value-color, 0.5);\n background: rgba($valid-value-color, 0.25);\n\n a {\n color: $valid-value-color;\n font-weight: 500;\n }\n\n &__mark {\n color: $valid-value-color;\n }\n }\n\n dl:last-child {\n border-bottom: 0;\n }\n}\n\n.directory__tag .trends__item__current {\n width: auto;\n}\n\n.pending-account {\n &__header {\n color: $darker-text-color;\n\n a {\n color: $ui-secondary-color;\n text-decoration: none;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n\n strong {\n color: $primary-text-color;\n font-weight: 700;\n }\n }\n\n &__body {\n margin-top: 10px;\n }\n}\n",".activity-stream {\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n overflow: hidden;\n margin-bottom: 10px;\n\n &--under-tabs {\n border-radius: 0 0 4px 4px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n border-radius: 0;\n box-shadow: none;\n }\n\n &--headless {\n border-radius: 0;\n margin: 0;\n box-shadow: none;\n\n .detailed-status,\n .status {\n border-radius: 0 !important;\n }\n }\n\n div[data-component] {\n width: 100%;\n }\n\n .entry {\n background: $ui-base-color;\n\n .detailed-status,\n .status,\n .load-more {\n animation: none;\n }\n\n &:last-child {\n .detailed-status,\n .status,\n .load-more {\n border-bottom: 0;\n border-radius: 0 0 4px 4px;\n }\n }\n\n &:first-child {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 4px 4px 0 0;\n }\n\n &:last-child {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 4px;\n }\n }\n }\n\n @media screen and (max-width: 740px) {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 0 !important;\n }\n }\n }\n\n &--highlighted .entry {\n background: lighten($ui-base-color, 8%);\n }\n}\n\n.button.logo-button {\n flex: 0 auto;\n font-size: 14px;\n background: $ui-highlight-color;\n color: $primary-text-color;\n text-transform: none;\n line-height: 36px;\n height: auto;\n padding: 3px 15px;\n border: 0;\n\n svg {\n width: 20px;\n height: auto;\n vertical-align: middle;\n margin-right: 5px;\n fill: $primary-text-color;\n }\n\n &:active,\n &:focus,\n &:hover {\n background: lighten($ui-highlight-color, 10%);\n }\n\n &:disabled,\n &.disabled {\n &:active,\n &:focus,\n &:hover {\n background: $ui-primary-color;\n }\n }\n\n &.button--destructive {\n &:active,\n &:focus,\n &:hover {\n background: $error-red;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n svg {\n display: none;\n }\n }\n}\n\n.embed,\n.public-layout {\n .detailed-status {\n padding: 15px;\n }\n\n .status {\n padding: 15px 15px 15px (48px + 15px * 2);\n min-height: 48px + 2px;\n\n &__avatar {\n left: 15px;\n top: 17px;\n }\n\n &__content {\n padding-top: 5px;\n }\n\n &__prepend {\n margin-left: 48px + 15px * 2;\n padding-top: 15px;\n }\n\n &__prepend-icon-wrapper {\n left: -32px;\n }\n\n .media-gallery,\n &__action-bar,\n .video-player {\n margin-top: 10px;\n }\n }\n}\n","button.icon-button i.fa-retweet {\n background-image: url(\"data:image/svg+xml;utf8,\");\n\n &:hover {\n background-image: url(\"data:image/svg+xml;utf8,\");\n }\n}\n\nbutton.icon-button.disabled i.fa-retweet {\n background-image: url(\"data:image/svg+xml;utf8,\");\n}\n",".app-body {\n -webkit-overflow-scrolling: touch;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n}\n\n.link-button {\n display: block;\n font-size: 15px;\n line-height: 20px;\n color: $ui-highlight-color;\n border: 0;\n background: transparent;\n padding: 0;\n cursor: pointer;\n\n &:hover,\n &:active {\n text-decoration: underline;\n }\n\n &:disabled {\n color: $ui-primary-color;\n cursor: default;\n }\n}\n\n.button {\n background-color: $ui-highlight-color;\n border: 10px none;\n border-radius: 4px;\n box-sizing: border-box;\n color: $primary-text-color;\n cursor: pointer;\n display: inline-block;\n font-family: inherit;\n font-size: 15px;\n font-weight: 500;\n height: 36px;\n letter-spacing: 0;\n line-height: 36px;\n overflow: hidden;\n padding: 0 16px;\n position: relative;\n text-align: center;\n text-decoration: none;\n text-overflow: ellipsis;\n transition: all 100ms ease-in;\n white-space: nowrap;\n width: auto;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-highlight-color, 10%);\n transition: all 200ms ease-out;\n }\n\n &--destructive {\n transition: none;\n\n &:active,\n &:focus,\n &:hover {\n background-color: $error-red;\n transition: none;\n }\n }\n\n &:disabled,\n &.disabled {\n background-color: $ui-primary-color;\n cursor: default;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &.button-primary,\n &.button-alternative,\n &.button-secondary,\n &.button-alternative-2 {\n font-size: 16px;\n line-height: 36px;\n height: auto;\n text-transform: none;\n padding: 4px 16px;\n }\n\n &.button-alternative {\n color: $inverted-text-color;\n background: $ui-primary-color;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-primary-color, 4%);\n }\n }\n\n &.button-alternative-2 {\n background: $ui-base-lighter-color;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-base-lighter-color, 4%);\n }\n }\n\n &.button-secondary {\n color: $darker-text-color;\n background: transparent;\n padding: 3px 15px;\n border: 1px solid $ui-primary-color;\n\n &:active,\n &:focus,\n &:hover {\n border-color: lighten($ui-primary-color, 4%);\n color: lighten($darker-text-color, 4%);\n }\n\n &:disabled {\n opacity: 0.5;\n }\n }\n\n &.button--block {\n display: block;\n width: 100%;\n }\n}\n\n.column__wrapper {\n display: flex;\n flex: 1 1 auto;\n position: relative;\n}\n\n.icon-button {\n display: inline-block;\n padding: 0;\n color: $action-button-color;\n border: 0;\n border-radius: 4px;\n background: transparent;\n cursor: pointer;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($action-button-color, 7%);\n background-color: rgba($action-button-color, 0.15);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n }\n\n &:focus {\n background-color: rgba($action-button-color, 0.3);\n }\n\n &.disabled {\n color: darken($action-button-color, 13%);\n background-color: transparent;\n cursor: default;\n }\n\n &.active {\n color: $highlight-text-color;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &.inverted {\n color: $lighter-text-color;\n\n &:hover,\n &:active,\n &:focus {\n color: darken($lighter-text-color, 7%);\n background-color: rgba($lighter-text-color, 0.15);\n }\n\n &:focus {\n background-color: rgba($lighter-text-color, 0.3);\n }\n\n &.disabled {\n color: lighten($lighter-text-color, 7%);\n background-color: transparent;\n }\n\n &.active {\n color: $highlight-text-color;\n\n &.disabled {\n color: lighten($highlight-text-color, 13%);\n }\n }\n }\n\n &.overlayed {\n box-sizing: content-box;\n background: rgba($base-overlay-background, 0.6);\n color: rgba($primary-text-color, 0.7);\n border-radius: 4px;\n padding: 2px;\n\n &:hover {\n background: rgba($base-overlay-background, 0.9);\n }\n }\n}\n\n.text-icon-button {\n color: $lighter-text-color;\n border: 0;\n border-radius: 4px;\n background: transparent;\n cursor: pointer;\n font-weight: 600;\n font-size: 11px;\n padding: 0 3px;\n line-height: 27px;\n outline: 0;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &:hover,\n &:active,\n &:focus {\n color: darken($lighter-text-color, 7%);\n background-color: rgba($lighter-text-color, 0.15);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n }\n\n &:focus {\n background-color: rgba($lighter-text-color, 0.3);\n }\n\n &.disabled {\n color: lighten($lighter-text-color, 20%);\n background-color: transparent;\n cursor: default;\n }\n\n &.active {\n color: $highlight-text-color;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n}\n\n.dropdown-menu {\n position: absolute;\n}\n\n.invisible {\n font-size: 0;\n line-height: 0;\n display: inline-block;\n width: 0;\n height: 0;\n position: absolute;\n\n img,\n svg {\n margin: 0 !important;\n border: 0 !important;\n padding: 0 !important;\n width: 0 !important;\n height: 0 !important;\n }\n}\n\n.ellipsis {\n &::after {\n content: \"…\";\n }\n}\n\n.compose-form {\n padding: 10px;\n\n &__sensitive-button {\n padding: 10px;\n padding-top: 0;\n\n font-size: 14px;\n font-weight: 500;\n\n &.active {\n color: $highlight-text-color;\n }\n\n input[type=checkbox] {\n display: none;\n }\n\n .checkbox {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 4px;\n vertical-align: middle;\n\n &.active {\n border-color: $highlight-text-color;\n background: $highlight-text-color;\n }\n }\n }\n\n .compose-form__warning {\n color: $inverted-text-color;\n margin-bottom: 10px;\n background: $ui-primary-color;\n box-shadow: 0 2px 6px rgba($base-shadow-color, 0.3);\n padding: 8px 10px;\n border-radius: 4px;\n font-size: 13px;\n font-weight: 400;\n\n strong {\n color: $inverted-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n color: $lighter-text-color;\n font-weight: 500;\n text-decoration: underline;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: none;\n }\n }\n }\n\n .emoji-picker-dropdown {\n position: absolute;\n top: 5px;\n right: 5px;\n }\n\n .compose-form__autosuggest-wrapper {\n position: relative;\n }\n\n .autosuggest-textarea,\n .autosuggest-input,\n .spoiler-input {\n position: relative;\n width: 100%;\n }\n\n .spoiler-input {\n height: 0;\n transform-origin: bottom;\n opacity: 0;\n\n &.spoiler-input--visible {\n height: 36px;\n margin-bottom: 11px;\n opacity: 1;\n }\n }\n\n .autosuggest-textarea__textarea,\n .spoiler-input__input {\n display: block;\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n color: $inverted-text-color;\n background: $simple-background-color;\n padding: 10px;\n font-family: inherit;\n font-size: 14px;\n resize: vertical;\n border: 0;\n outline: 0;\n\n &::placeholder {\n color: $dark-text-color;\n }\n\n &:focus {\n outline: 0;\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n .spoiler-input__input {\n border-radius: 4px;\n }\n\n .autosuggest-textarea__textarea {\n min-height: 100px;\n border-radius: 4px 4px 0 0;\n padding-bottom: 0;\n padding-right: 10px + 22px;\n resize: none;\n scrollbar-color: initial;\n\n &::-webkit-scrollbar {\n all: unset;\n }\n\n @media screen and (max-width: 600px) {\n height: 100px !important; // prevent auto-resize textarea\n resize: vertical;\n }\n }\n\n .autosuggest-textarea__suggestions-wrapper {\n position: relative;\n height: 0;\n }\n\n .autosuggest-textarea__suggestions {\n box-sizing: border-box;\n display: none;\n position: absolute;\n top: 100%;\n width: 100%;\n z-index: 99;\n box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4);\n background: $ui-secondary-color;\n border-radius: 0 0 4px 4px;\n color: $inverted-text-color;\n font-size: 14px;\n padding: 6px;\n\n &.autosuggest-textarea__suggestions--visible {\n display: block;\n }\n }\n\n .autosuggest-textarea__suggestions__item {\n padding: 10px;\n cursor: pointer;\n border-radius: 4px;\n\n &:hover,\n &:focus,\n &:active,\n &.selected {\n background: darken($ui-secondary-color, 10%);\n }\n }\n\n .autosuggest-account,\n .autosuggest-emoji,\n .autosuggest-hashtag {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: flex-start;\n line-height: 18px;\n font-size: 14px;\n }\n\n .autosuggest-hashtag {\n justify-content: space-between;\n\n &__name {\n flex: 1 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n strong {\n font-weight: 500;\n }\n\n &__uses {\n flex: 0 0 auto;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n }\n\n .autosuggest-account-icon,\n .autosuggest-emoji img {\n display: block;\n margin-right: 8px;\n width: 16px;\n height: 16px;\n }\n\n .autosuggest-account .display-name__account {\n color: $lighter-text-color;\n }\n\n .compose-form__modifiers {\n color: $inverted-text-color;\n font-family: inherit;\n font-size: 14px;\n background: $simple-background-color;\n\n .compose-form__upload-wrapper {\n overflow: hidden;\n }\n\n .compose-form__uploads-wrapper {\n display: flex;\n flex-direction: row;\n padding: 5px;\n flex-wrap: wrap;\n }\n\n .compose-form__upload {\n flex: 1 1 0;\n min-width: 40%;\n margin: 5px;\n\n &__actions {\n background: linear-gradient(180deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n opacity: 0;\n transition: opacity .1s ease;\n\n .icon-button {\n flex: 0 1 auto;\n color: $secondary-text-color;\n font-size: 14px;\n font-weight: 500;\n padding: 10px;\n font-family: inherit;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($secondary-text-color, 7%);\n }\n }\n\n &.active {\n opacity: 1;\n }\n }\n\n &-description {\n position: absolute;\n z-index: 2;\n bottom: 0;\n left: 0;\n right: 0;\n box-sizing: border-box;\n background: linear-gradient(0deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);\n padding: 10px;\n opacity: 0;\n transition: opacity .1s ease;\n\n textarea {\n background: transparent;\n color: $secondary-text-color;\n border: 0;\n padding: 0;\n margin: 0;\n width: 100%;\n font-family: inherit;\n font-size: 14px;\n font-weight: 500;\n\n &:focus {\n color: $white;\n }\n\n &::placeholder {\n opacity: 0.75;\n color: $secondary-text-color;\n }\n }\n\n &.active {\n opacity: 1;\n }\n }\n }\n\n .compose-form__upload-thumbnail {\n border-radius: 4px;\n background-color: $base-shadow-color;\n background-position: center;\n background-size: cover;\n background-repeat: no-repeat;\n height: 140px;\n width: 100%;\n overflow: hidden;\n }\n }\n\n .compose-form__buttons-wrapper {\n padding: 10px;\n background: darken($simple-background-color, 8%);\n border-radius: 0 0 4px 4px;\n display: flex;\n justify-content: space-between;\n flex: 0 0 auto;\n\n .compose-form__buttons {\n display: flex;\n\n .compose-form__upload-button-icon {\n line-height: 27px;\n }\n\n .compose-form__sensitive-button {\n display: none;\n\n &.compose-form__sensitive-button--visible {\n display: block;\n }\n\n .compose-form__sensitive-button__icon {\n line-height: 27px;\n }\n }\n }\n\n .icon-button,\n .text-icon-button {\n box-sizing: content-box;\n padding: 0 3px;\n }\n\n .character-counter__wrapper {\n align-self: center;\n margin-right: 4px;\n }\n }\n\n .compose-form__publish {\n display: flex;\n justify-content: flex-end;\n min-width: 0;\n flex: 0 0 auto;\n\n .compose-form__publish-button-wrapper {\n overflow: hidden;\n padding-top: 10px;\n }\n }\n}\n\n.character-counter {\n cursor: default;\n font-family: $font-sans-serif, sans-serif;\n font-size: 14px;\n font-weight: 600;\n color: $lighter-text-color;\n\n &.character-counter--over {\n color: $warning-red;\n }\n}\n\n.no-reduce-motion .spoiler-input {\n transition: height 0.4s ease, opacity 0.4s ease;\n}\n\n.emojione {\n font-size: inherit;\n vertical-align: middle;\n object-fit: contain;\n margin: -.2ex .15em .2ex;\n width: 16px;\n height: 16px;\n\n img {\n width: auto;\n }\n}\n\n.reply-indicator {\n border-radius: 4px;\n margin-bottom: 10px;\n background: $ui-primary-color;\n padding: 10px;\n min-height: 23px;\n overflow-y: auto;\n flex: 0 2 auto;\n}\n\n.reply-indicator__header {\n margin-bottom: 5px;\n overflow: hidden;\n}\n\n.reply-indicator__cancel {\n float: right;\n line-height: 24px;\n}\n\n.reply-indicator__display-name {\n color: $inverted-text-color;\n display: block;\n max-width: 100%;\n line-height: 24px;\n overflow: hidden;\n padding-right: 25px;\n text-decoration: none;\n}\n\n.reply-indicator__display-avatar {\n float: left;\n margin-right: 5px;\n}\n\n.status__content--with-action {\n cursor: pointer;\n}\n\n.status__content,\n.reply-indicator__content {\n position: relative;\n font-size: 15px;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n padding-top: 2px;\n color: $primary-text-color;\n\n &:focus {\n outline: 0;\n }\n\n &.status__content--with-spoiler {\n white-space: normal;\n\n .status__content__text {\n white-space: pre-wrap;\n }\n }\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n img {\n max-width: 100%;\n max-height: 400px;\n object-fit: contain;\n }\n\n p {\n margin-bottom: 20px;\n white-space: pre-wrap;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: $pleroma-links;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n\n .fa {\n color: lighten($dark-text-color, 7%);\n }\n }\n\n &.mention {\n &:hover {\n text-decoration: none;\n\n span {\n text-decoration: underline;\n }\n }\n }\n\n .fa {\n color: $dark-text-color;\n }\n }\n\n a.unhandled-link {\n color: lighten($ui-highlight-color, 8%);\n }\n\n .status__content__spoiler-link {\n background: $action-button-color;\n\n &:hover {\n background: lighten($action-button-color, 7%);\n text-decoration: none;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n\n .status__content__text {\n display: none;\n\n &.status__content__text--visible {\n display: block;\n }\n }\n}\n\n.status__content.status__content--collapsed {\n max-height: 20px * 15; // 15 lines is roughly above 500 characters\n}\n\n.status__content__read-more-button {\n display: block;\n font-size: 15px;\n line-height: 20px;\n color: lighten($ui-highlight-color, 8%);\n border: 0;\n background: transparent;\n padding: 0;\n padding-top: 8px;\n\n &:hover,\n &:active {\n text-decoration: underline;\n }\n}\n\n.status__content__spoiler-link {\n display: inline-block;\n border-radius: 2px;\n background: transparent;\n border: 0;\n color: $inverted-text-color;\n font-weight: 700;\n font-size: 12px;\n padding: 0 6px;\n line-height: 20px;\n cursor: pointer;\n vertical-align: middle;\n}\n\n.status__wrapper--filtered {\n color: $dark-text-color;\n border: 0;\n font-size: inherit;\n text-align: center;\n line-height: inherit;\n margin: 0;\n padding: 15px;\n box-sizing: border-box;\n width: 100%;\n clear: both;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n}\n\n.status__prepend-icon-wrapper {\n left: -26px;\n position: absolute;\n}\n\n.focusable {\n &:focus {\n outline: 0;\n background: lighten($ui-base-color, 4%);\n\n .status.status-direct {\n background: lighten($ui-base-color, 12%);\n\n &.muted {\n background: transparent;\n }\n }\n\n .detailed-status,\n .detailed-status__action-bar {\n background: lighten($ui-base-color, 8%);\n }\n }\n}\n\n.status {\n padding: 8px 10px;\n padding-left: 68px;\n position: relative;\n min-height: 54px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n\n @supports (-ms-overflow-style: -ms-autohiding-scrollbar) {\n // Add margin to avoid Edge auto-hiding scrollbar appearing over content.\n // On Edge 16 this is 16px and Edge <=15 it's 12px, so aim for 16px.\n padding-right: 26px; // 10px + 16px\n }\n\n @keyframes fade {\n 0% { opacity: 0; }\n 100% { opacity: 1; }\n }\n\n opacity: 1;\n animation: fade 150ms linear;\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n }\n\n &.status-direct:not(.read) {\n background: lighten($ui-base-color, 8%);\n border-bottom-color: lighten($ui-base-color, 12%);\n }\n\n &.light {\n .status__relative-time {\n color: $light-text-color;\n }\n\n .status__display-name {\n color: $inverted-text-color;\n }\n\n .display-name {\n strong {\n color: $inverted-text-color;\n }\n\n span {\n color: $light-text-color;\n }\n }\n\n .status__content {\n color: $inverted-text-color;\n\n a {\n color: $highlight-text-color;\n }\n\n a.status__content__spoiler-link {\n color: $primary-text-color;\n background: $ui-primary-color;\n\n &:hover {\n background: lighten($ui-primary-color, 8%);\n }\n }\n }\n }\n}\n\n.notification-favourite {\n .status.status-direct {\n background: transparent;\n\n .icon-button.disabled {\n color: lighten($action-button-color, 13%);\n }\n }\n}\n\n.status__relative-time,\n.notification__relative_time {\n color: $dark-text-color;\n float: right;\n font-size: 14px;\n}\n\n.status__display-name {\n color: $dark-text-color;\n}\n\n.status__info .status__display-name {\n display: block;\n max-width: 100%;\n padding-right: 25px;\n}\n\n.status__info {\n font-size: 15px;\n}\n\n.status-check-box {\n border-bottom: 1px solid $ui-secondary-color;\n display: flex;\n\n .status-check-box__status {\n margin: 10px 0 10px 10px;\n flex: 1;\n\n .media-gallery {\n max-width: 250px;\n }\n\n .status__content {\n padding: 0;\n white-space: normal;\n }\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n max-width: 250px;\n }\n\n .media-gallery__item-thumbnail {\n cursor: default;\n }\n }\n}\n\n.status-check-box-toggle {\n align-items: center;\n display: flex;\n flex: 0 0 auto;\n justify-content: center;\n padding: 10px;\n}\n\n.status__prepend {\n margin-left: 68px;\n color: $dark-text-color;\n padding: 8px 0;\n padding-bottom: 2px;\n font-size: 14px;\n position: relative;\n\n .status__display-name strong {\n color: $dark-text-color;\n }\n\n > span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.status__action-bar {\n align-items: center;\n display: flex;\n margin-top: 8px;\n\n &__counter {\n display: inline-flex;\n margin-right: 11px;\n align-items: center;\n\n .status__action-bar-button {\n margin-right: 4px;\n }\n\n &__label {\n display: inline-block;\n width: 14px;\n font-size: 12px;\n font-weight: 500;\n color: $action-button-color;\n }\n }\n}\n\n.status__action-bar-button {\n margin-right: 18px;\n}\n\n.status__action-bar-dropdown {\n height: 23.15px;\n width: 23.15px;\n}\n\n.detailed-status__action-bar-dropdown {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n}\n\n.detailed-status {\n background: lighten($ui-base-color, 4%);\n padding: 14px 10px;\n\n &--flex {\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n align-items: flex-start;\n\n .status__content,\n .detailed-status__meta {\n flex: 100%;\n }\n }\n\n .status__content {\n font-size: 19px;\n line-height: 24px;\n\n .emojione {\n width: 24px;\n height: 24px;\n margin: -1px 0 0;\n }\n\n .status__content__spoiler-link {\n line-height: 24px;\n margin: -1px 0 0;\n }\n }\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n }\n}\n\n.detailed-status__meta {\n margin-top: 15px;\n color: $dark-text-color;\n font-size: 14px;\n line-height: 18px;\n}\n\n.detailed-status__action-bar {\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: row;\n padding: 10px 0;\n}\n\n.detailed-status__link {\n color: inherit;\n text-decoration: none;\n}\n\n.detailed-status__favorites,\n.detailed-status__reblogs {\n display: inline-block;\n font-weight: 500;\n font-size: 12px;\n margin-left: 6px;\n}\n\n.reply-indicator__content {\n color: $inverted-text-color;\n font-size: 14px;\n\n a {\n color: $lighter-text-color;\n }\n}\n\n.domain {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n .domain__domain-name {\n flex: 1 1 auto;\n display: block;\n color: $primary-text-color;\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n }\n}\n\n.domain__wrapper {\n display: flex;\n}\n\n.domain_buttons {\n height: 18px;\n padding: 10px;\n white-space: nowrap;\n}\n\n.account {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &.compact {\n padding: 0;\n border-bottom: 0;\n\n .account__avatar-wrapper {\n margin-left: 0;\n }\n }\n\n .account__display-name {\n flex: 1 1 auto;\n display: block;\n color: $darker-text-color;\n overflow: hidden;\n text-decoration: none;\n font-size: 14px;\n }\n}\n\n.account__wrapper {\n display: flex;\n}\n\n.account__avatar-wrapper {\n float: left;\n margin-left: 12px;\n margin-right: 12px;\n}\n\n.account__avatar {\n @include avatar-radius;\n position: relative;\n\n &-inline {\n display: inline-block;\n vertical-align: middle;\n margin-right: 5px;\n }\n\n &-composite {\n @include avatar-radius;\n border-radius: 50%;\n overflow: hidden;\n position: relative;\n cursor: default;\n\n & > div {\n float: left;\n position: relative;\n box-sizing: border-box;\n }\n\n &__label {\n display: block;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n color: $primary-text-color;\n text-shadow: 1px 1px 2px $base-shadow-color;\n font-weight: 700;\n font-size: 15px;\n }\n }\n}\n\na .account__avatar {\n cursor: pointer;\n}\n\n.account__avatar-overlay {\n @include avatar-size(48px);\n\n &-base {\n @include avatar-radius;\n @include avatar-size(36px);\n }\n\n &-overlay {\n @include avatar-radius;\n @include avatar-size(24px);\n\n position: absolute;\n bottom: 0;\n right: 0;\n z-index: 1;\n }\n}\n\n.account__relationship {\n height: 18px;\n padding: 10px;\n white-space: nowrap;\n}\n\n.account__disclaimer {\n padding: 10px;\n border-top: 1px solid lighten($ui-base-color, 8%);\n color: $dark-text-color;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n font-weight: 500;\n color: inherit;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n}\n\n.account__action-bar {\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n line-height: 36px;\n overflow: hidden;\n flex: 0 0 auto;\n display: flex;\n}\n\n.account__action-bar-dropdown {\n padding: 10px;\n\n .icon-button {\n vertical-align: middle;\n }\n\n .dropdown--active {\n .dropdown__content.dropdown__right {\n left: 6px;\n right: initial;\n }\n\n &::after {\n bottom: initial;\n margin-left: 11px;\n margin-top: -7px;\n right: initial;\n }\n }\n}\n\n.account__action-bar-links {\n display: flex;\n flex: 1 1 auto;\n line-height: 18px;\n text-align: center;\n}\n\n.account__action-bar__tab {\n text-decoration: none;\n overflow: hidden;\n flex: 0 1 100%;\n border-right: 1px solid lighten($ui-base-color, 8%);\n padding: 10px 0;\n border-bottom: 4px solid transparent;\n\n &.active {\n border-bottom: 4px solid $ui-highlight-color;\n }\n\n & > span {\n display: block;\n font-size: 12px;\n color: $darker-text-color;\n }\n\n strong {\n display: block;\n font-size: 15px;\n font-weight: 500;\n color: $primary-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n}\n\n.account-authorize {\n padding: 14px 10px;\n\n .detailed-status__display-name {\n display: block;\n margin-bottom: 15px;\n overflow: hidden;\n }\n}\n\n.account-authorize__avatar {\n float: left;\n margin-right: 10px;\n}\n\n.status__display-name,\n.status__relative-time,\n.detailed-status__display-name,\n.detailed-status__datetime,\n.detailed-status__application,\n.account__display-name {\n text-decoration: none;\n}\n\n.status__display-name,\n.account__display-name {\n strong {\n color: $primary-text-color;\n }\n}\n\n.muted {\n .emojione {\n opacity: 0.5;\n }\n}\n\n.status__display-name,\n.reply-indicator__display-name,\n.detailed-status__display-name,\na.account__display-name {\n &:hover strong {\n text-decoration: underline;\n }\n}\n\n.account__display-name strong {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.detailed-status__application,\n.detailed-status__datetime {\n color: inherit;\n}\n\n.detailed-status .button.logo-button {\n margin-bottom: 15px;\n}\n\n.detailed-status__display-name {\n color: $secondary-text-color;\n display: block;\n line-height: 24px;\n margin-bottom: 15px;\n overflow: hidden;\n\n strong,\n span {\n display: block;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n strong {\n font-size: 16px;\n color: $primary-text-color;\n }\n}\n\n.detailed-status__display-avatar {\n float: left;\n margin-right: 10px;\n}\n\n.status__avatar {\n height: 48px;\n left: 10px;\n position: absolute;\n top: 10px;\n width: 48px;\n}\n\n.status__expand {\n width: 68px;\n position: absolute;\n left: 0;\n top: 0;\n height: 100%;\n cursor: pointer;\n}\n\n.muted {\n .status__content,\n .status__content p,\n .status__content a {\n color: $dark-text-color;\n }\n\n .status__display-name strong {\n color: $dark-text-color;\n }\n\n .status__avatar {\n opacity: 0.5;\n }\n\n a.status__content__spoiler-link {\n background: $ui-base-lighter-color;\n color: $inverted-text-color;\n\n &:hover {\n background: lighten($ui-base-lighter-color, 7%);\n text-decoration: none;\n }\n }\n}\n\n.notification__message {\n margin: 0 10px 0 68px;\n padding: 8px 0 0;\n cursor: default;\n color: $darker-text-color;\n font-size: 15px;\n line-height: 22px;\n position: relative;\n\n .fa {\n color: $highlight-text-color;\n }\n\n > span {\n display: inline;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.notification__favourite-icon-wrapper {\n left: -26px;\n position: absolute;\n\n .star-icon {\n color: $gold-star;\n }\n}\n\n.star-icon.active {\n color: $gold-star;\n}\n\n.bookmark-icon.active {\n color: $red-bookmark;\n}\n\n.no-reduce-motion .icon-button.star-icon {\n &.activate {\n & > .fa-star {\n animation: spring-rotate-in 1s linear;\n }\n }\n\n &.deactivate {\n & > .fa-star {\n animation: spring-rotate-out 1s linear;\n }\n }\n}\n\n.notification__display-name {\n color: inherit;\n font-weight: 500;\n text-decoration: none;\n\n &:hover {\n color: $primary-text-color;\n text-decoration: underline;\n }\n}\n\n.notification__relative_time {\n float: right;\n}\n\n.display-name {\n display: block;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.display-name__html {\n font-weight: 500;\n}\n\n.display-name__account {\n font-size: 14px;\n}\n\n.status__relative-time,\n.detailed-status__datetime {\n &:hover {\n text-decoration: underline;\n }\n}\n\n.image-loader {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n\n .image-loader__preview-canvas {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n background: url('~images/void.png') repeat;\n object-fit: contain;\n }\n\n .loading-bar {\n position: relative;\n }\n\n &.image-loader--amorphous .image-loader__preview-canvas {\n display: none;\n }\n}\n\n.zoomable-image {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n img {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n width: auto;\n height: auto;\n object-fit: contain;\n }\n}\n\n.navigation-bar {\n padding: 10px;\n display: flex;\n align-items: center;\n flex-shrink: 0;\n cursor: default;\n color: $darker-text-color;\n\n strong {\n color: $secondary-text-color;\n }\n\n a {\n color: inherit;\n }\n\n .permalink {\n text-decoration: none;\n }\n\n .navigation-bar__actions {\n position: relative;\n\n .icon-button.close {\n position: absolute;\n pointer-events: none;\n transform: scale(0, 1) translate(-100%, 0);\n opacity: 0;\n }\n\n .compose__action-bar .icon-button {\n pointer-events: auto;\n transform: scale(1, 1) translate(0, 0);\n opacity: 1;\n }\n }\n}\n\n.navigation-bar__profile {\n flex: 1 1 auto;\n margin-left: 8px;\n line-height: 20px;\n margin-top: -1px;\n overflow: hidden;\n}\n\n.navigation-bar__profile-account {\n display: block;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.navigation-bar__profile-edit {\n color: inherit;\n text-decoration: none;\n}\n\n.dropdown {\n display: inline-block;\n}\n\n.dropdown__content {\n display: none;\n position: absolute;\n}\n\n.dropdown-menu__separator {\n border-bottom: 1px solid darken($ui-secondary-color, 8%);\n margin: 5px 7px 6px;\n height: 0;\n}\n\n.dropdown-menu {\n background: $ui-secondary-color;\n padding: 4px 0;\n border-radius: 4px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n z-index: 9999;\n\n ul {\n list-style: none;\n }\n\n &.left {\n transform-origin: 100% 50%;\n }\n\n &.top {\n transform-origin: 50% 100%;\n }\n\n &.bottom {\n transform-origin: 50% 0;\n }\n\n &.right {\n transform-origin: 0 50%;\n }\n}\n\n.dropdown-menu__arrow {\n position: absolute;\n width: 0;\n height: 0;\n border: 0 solid transparent;\n\n &.left {\n right: -5px;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: $ui-secondary-color;\n }\n\n &.top {\n bottom: -5px;\n margin-left: -7px;\n border-width: 5px 7px 0;\n border-top-color: $ui-secondary-color;\n }\n\n &.bottom {\n top: -5px;\n margin-left: -7px;\n border-width: 0 7px 5px;\n border-bottom-color: $ui-secondary-color;\n }\n\n &.right {\n left: -5px;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: $ui-secondary-color;\n }\n}\n\n.dropdown-menu__item {\n a {\n font-size: 13px;\n line-height: 18px;\n display: block;\n padding: 4px 14px;\n box-sizing: border-box;\n text-decoration: none;\n background: $ui-secondary-color;\n color: $inverted-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:focus,\n &:hover,\n &:active {\n background: $ui-highlight-color;\n color: $secondary-text-color;\n outline: 0;\n }\n }\n}\n\n.dropdown--active .dropdown__content {\n display: block;\n line-height: 18px;\n max-width: 311px;\n right: 0;\n text-align: left;\n z-index: 9999;\n\n & > ul {\n list-style: none;\n background: $ui-secondary-color;\n padding: 4px 0;\n border-radius: 4px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.4);\n min-width: 140px;\n position: relative;\n }\n\n &.dropdown__right {\n right: 0;\n }\n\n &.dropdown__left {\n & > ul {\n left: -98px;\n }\n }\n\n & > ul > li > a {\n font-size: 13px;\n line-height: 18px;\n display: block;\n padding: 4px 14px;\n box-sizing: border-box;\n text-decoration: none;\n background: $ui-secondary-color;\n color: $inverted-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:focus {\n outline: 0;\n }\n\n &:hover {\n background: $ui-highlight-color;\n color: $secondary-text-color;\n }\n }\n}\n\n.dropdown__icon {\n vertical-align: middle;\n}\n\n.columns-area {\n display: flex;\n flex: 1 1 auto;\n flex-direction: row;\n justify-content: flex-start;\n overflow-x: auto;\n position: relative;\n\n &.unscrollable {\n overflow-x: hidden;\n }\n\n &__panels {\n display: flex;\n justify-content: center;\n width: 100%;\n height: 100%;\n min-height: 100vh;\n\n &__pane {\n height: 100%;\n overflow: hidden;\n pointer-events: none;\n display: flex;\n justify-content: flex-end;\n min-width: 285px;\n\n &--start {\n justify-content: flex-start;\n }\n\n &__inner {\n position: fixed;\n width: 285px;\n pointer-events: auto;\n height: 100%;\n }\n }\n\n &__main {\n box-sizing: border-box;\n width: 100%;\n max-width: 600px;\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding: 0 10px;\n }\n }\n }\n}\n\n.tabs-bar__wrapper {\n background: darken($ui-base-color, 8%);\n position: sticky;\n top: 0;\n z-index: 2;\n padding-top: 0;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding-top: 10px;\n }\n\n .tabs-bar {\n margin-bottom: 0;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n margin-bottom: 10px;\n }\n }\n}\n\n.react-swipeable-view-container {\n &,\n .columns-area,\n .drawer,\n .column {\n height: 100%;\n }\n}\n\n.react-swipeable-view-container > * {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n}\n\n.column {\n width: 350px;\n position: relative;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n\n > .scrollable {\n background: $ui-base-color;\n border-bottom-left-radius: 2px;\n border-bottom-right-radius: 2px;\n }\n}\n\n.ui {\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n}\n\n.drawer {\n width: 330px;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n overflow-y: hidden;\n}\n\n.drawer__tab {\n display: block;\n flex: 1 1 auto;\n padding: 15px 5px 13px;\n color: $darker-text-color;\n text-decoration: none;\n text-align: center;\n font-size: 16px;\n border-bottom: 2px solid transparent;\n}\n\n.column,\n.drawer {\n flex: 1 1 auto;\n overflow: hidden;\n}\n\n@media screen and (min-width: 631px) {\n .columns-area {\n padding: 0;\n }\n\n .column,\n .drawer {\n flex: 0 0 auto;\n padding: 10px;\n padding-left: 5px;\n padding-right: 5px;\n\n &:first-child {\n padding-left: 10px;\n }\n\n &:last-child {\n padding-right: 10px;\n }\n }\n\n .columns-area > div {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n }\n }\n}\n\n.tabs-bar {\n box-sizing: border-box;\n display: flex;\n background: lighten($ui-base-color, 8%);\n flex: 0 0 auto;\n overflow-y: auto;\n}\n\n.tabs-bar__link {\n display: block;\n flex: 1 1 auto;\n padding: 15px 10px;\n padding-bottom: 13px;\n color: $primary-text-color;\n text-decoration: none;\n text-align: center;\n font-size: 14px;\n font-weight: 500;\n border-bottom: 2px solid lighten($ui-base-color, 8%);\n transition: all 50ms linear;\n transition-property: border-bottom, background, color;\n\n .fa {\n font-weight: 400;\n font-size: 16px;\n }\n\n &:hover,\n &:focus,\n &:active {\n @media screen and (min-width: 631px) {\n background: lighten($ui-base-color, 14%);\n border-bottom-color: lighten($ui-base-color, 14%);\n }\n }\n\n &.active {\n border-bottom: 2px solid $highlight-text-color;\n color: $highlight-text-color;\n }\n\n span {\n margin-left: 5px;\n display: none;\n }\n}\n\n@media screen and (min-width: 600px) {\n .tabs-bar__link {\n span {\n display: inline;\n }\n }\n}\n\n.columns-area--mobile {\n flex-direction: column;\n width: 100%;\n height: 100%;\n margin: 0 auto;\n\n .column,\n .drawer {\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .directory__list {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: block;\n }\n }\n\n .directory__card {\n margin-bottom: 0;\n }\n\n .filter-form {\n display: flex;\n }\n\n .autosuggest-textarea__textarea {\n font-size: 16px;\n }\n\n .search__input {\n line-height: 18px;\n font-size: 16px;\n padding: 15px;\n padding-right: 30px;\n }\n\n .search__icon .fa {\n top: 15px;\n }\n\n .scrollable {\n overflow: visible;\n\n @supports(display: grid) {\n contain: content;\n }\n }\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding: 10px 0;\n padding-top: 0;\n }\n\n @media screen and (min-width: 630px) {\n .detailed-status {\n padding: 15px;\n\n .media-gallery,\n .video-player,\n .audio-player {\n margin-top: 15px;\n }\n }\n\n .account__header__bar {\n padding: 5px 10px;\n }\n\n .navigation-bar,\n .compose-form {\n padding: 15px;\n }\n\n .compose-form .compose-form__publish .compose-form__publish-button-wrapper {\n padding-top: 15px;\n }\n\n .status {\n padding: 15px 15px 15px (48px + 15px * 2);\n min-height: 48px + 2px;\n\n &__avatar {\n left: 15px;\n top: 17px;\n }\n\n &__content {\n padding-top: 5px;\n }\n\n &__prepend {\n margin-left: 48px + 15px * 2;\n padding-top: 15px;\n }\n\n &__prepend-icon-wrapper {\n left: -32px;\n }\n\n .media-gallery,\n &__action-bar,\n .video-player,\n .audio-player {\n margin-top: 10px;\n }\n }\n\n .account {\n padding: 15px 10px;\n\n &__header__bio {\n margin: 0 -10px;\n }\n }\n\n .notification {\n &__message {\n margin-left: 48px + 15px * 2;\n padding-top: 15px;\n }\n\n &__favourite-icon-wrapper {\n left: -32px;\n }\n\n .status {\n padding-top: 8px;\n }\n\n .account {\n padding-top: 8px;\n }\n\n .account__avatar-wrapper {\n margin-left: 17px;\n margin-right: 15px;\n }\n }\n }\n}\n\n.floating-action-button {\n position: fixed;\n display: flex;\n justify-content: center;\n align-items: center;\n width: 3.9375rem;\n height: 3.9375rem;\n bottom: 1.3125rem;\n right: 1.3125rem;\n background: darken($ui-highlight-color, 3%);\n color: $white;\n border-radius: 50%;\n font-size: 21px;\n line-height: 21px;\n text-decoration: none;\n box-shadow: 2px 3px 9px rgba($base-shadow-color, 0.4);\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-highlight-color, 7%);\n }\n}\n\n@media screen and (min-width: $no-gap-breakpoint) {\n .tabs-bar {\n width: 100%;\n }\n\n .react-swipeable-view-container .columns-area--mobile {\n height: calc(100% - 10px) !important;\n }\n\n .getting-started__wrapper,\n .getting-started__trends,\n .search {\n margin-bottom: 10px;\n }\n\n .getting-started__panel {\n margin: 10px 0;\n }\n\n .column,\n .drawer {\n min-width: 330px;\n }\n}\n\n@media screen and (max-width: 600px + (285px * 1) + (10px * 1)) {\n .columns-area__panels__pane--compositional {\n display: none;\n }\n}\n\n@media screen and (min-width: 600px + (285px * 1) + (10px * 1)) {\n .floating-action-button,\n .tabs-bar__link.optional {\n display: none;\n }\n\n .search-page .search {\n display: none;\n }\n}\n\n@media screen and (max-width: 600px + (285px * 2) + (10px * 2)) {\n .columns-area__panels__pane--navigational {\n display: none;\n }\n}\n\n@media screen and (min-width: 600px + (285px * 2) + (10px * 2)) {\n .tabs-bar {\n display: none;\n }\n}\n\n.icon-with-badge {\n position: relative;\n\n &__badge {\n position: absolute;\n left: 9px;\n top: -13px;\n background: $ui-highlight-color;\n border: 2px solid lighten($ui-base-color, 8%);\n padding: 1px 6px;\n border-radius: 6px;\n font-size: 10px;\n font-weight: 500;\n line-height: 14px;\n color: $primary-text-color;\n }\n}\n\n.column-link--transparent .icon-with-badge__badge {\n border-color: darken($ui-base-color, 8%);\n}\n\n.compose-panel {\n width: 285px;\n margin-top: 10px;\n display: flex;\n flex-direction: column;\n height: calc(100% - 10px);\n overflow-y: hidden;\n\n .navigation-bar {\n padding-top: 20px;\n padding-bottom: 20px;\n flex: 0 1 48px;\n min-height: 20px;\n }\n\n .flex-spacer {\n background: transparent;\n }\n\n .compose-form {\n flex: 1;\n overflow-y: hidden;\n display: flex;\n flex-direction: column;\n min-height: 310px;\n padding-bottom: 71px;\n margin-bottom: -71px;\n }\n\n .compose-form__autosuggest-wrapper {\n overflow-y: auto;\n background-color: $white;\n border-radius: 4px 4px 0 0;\n flex: 0 1 auto;\n }\n\n .autosuggest-textarea__textarea {\n overflow-y: hidden;\n }\n\n .compose-form__upload-thumbnail {\n height: 80px;\n }\n}\n\n.navigation-panel {\n margin-top: 10px;\n margin-bottom: 10px;\n height: calc(100% - 20px);\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n\n & > a {\n flex: 0 0 auto;\n }\n\n hr {\n flex: 0 0 auto;\n border: 0;\n background: transparent;\n border-top: 1px solid lighten($ui-base-color, 4%);\n margin: 10px 0;\n }\n\n .flex-spacer {\n background: transparent;\n }\n}\n\n.drawer__pager {\n box-sizing: border-box;\n padding: 0;\n flex-grow: 1;\n position: relative;\n overflow: hidden;\n display: flex;\n}\n\n.drawer__inner {\n position: absolute;\n top: 0;\n left: 0;\n background: lighten($ui-base-color, 13%);\n box-sizing: border-box;\n padding: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n overflow-y: auto;\n width: 100%;\n height: 100%;\n border-radius: 2px;\n\n &.darker {\n background: $ui-base-color;\n }\n}\n\n.drawer__inner__mastodon {\n background: lighten($ui-base-color, 13%) url('data:image/svg+xml;utf8,') no-repeat bottom / 100% auto;\n flex: 1;\n min-height: 47px;\n display: none;\n\n > img {\n display: block;\n object-fit: contain;\n object-position: bottom left;\n width: 100%;\n height: 100%;\n pointer-events: none;\n user-drag: none;\n user-select: none;\n }\n\n @media screen and (min-height: 640px) {\n display: block;\n }\n}\n\n.pseudo-drawer {\n background: lighten($ui-base-color, 13%);\n font-size: 13px;\n text-align: left;\n}\n\n.drawer__header {\n flex: 0 0 auto;\n font-size: 16px;\n background: lighten($ui-base-color, 8%);\n margin-bottom: 10px;\n display: flex;\n flex-direction: row;\n border-radius: 2px;\n\n a {\n transition: background 100ms ease-in;\n\n &:hover {\n background: lighten($ui-base-color, 3%);\n transition: background 200ms ease-out;\n }\n }\n}\n\n.scrollable {\n overflow-y: scroll;\n overflow-x: hidden;\n flex: 1 1 auto;\n -webkit-overflow-scrolling: touch;\n\n &.optionally-scrollable {\n overflow-y: auto;\n }\n\n @supports(display: grid) { // hack to fix Chrome <57\n contain: strict;\n }\n\n &--flex {\n display: flex;\n flex-direction: column;\n }\n\n &__append {\n flex: 1 1 auto;\n position: relative;\n min-height: 120px;\n }\n}\n\n.scrollable.fullscreen {\n @supports(display: grid) { // hack to fix Chrome <57\n contain: none;\n }\n}\n\n.column-back-button {\n box-sizing: border-box;\n width: 100%;\n background: lighten($ui-base-color, 4%);\n color: $highlight-text-color;\n cursor: pointer;\n flex: 0 0 auto;\n font-size: 16px;\n line-height: inherit;\n border: 0;\n text-align: unset;\n padding: 15px;\n margin: 0;\n z-index: 3;\n outline: 0;\n\n &:hover {\n text-decoration: underline;\n }\n}\n\n.column-header__back-button {\n background: lighten($ui-base-color, 4%);\n border: 0;\n font-family: inherit;\n color: $highlight-text-color;\n cursor: pointer;\n white-space: nowrap;\n font-size: 16px;\n padding: 0 5px 0 0;\n z-index: 3;\n\n &:hover {\n text-decoration: underline;\n }\n\n &:last-child {\n padding: 0 15px 0 0;\n }\n}\n\n.column-back-button__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.column-back-button--slim {\n position: relative;\n}\n\n.column-back-button--slim-button {\n cursor: pointer;\n flex: 0 0 auto;\n font-size: 16px;\n padding: 15px;\n position: absolute;\n right: 0;\n top: -48px;\n}\n\n.react-toggle {\n display: inline-block;\n position: relative;\n cursor: pointer;\n background-color: transparent;\n border: 0;\n padding: 0;\n user-select: none;\n -webkit-tap-highlight-color: rgba($base-overlay-background, 0);\n -webkit-tap-highlight-color: transparent;\n}\n\n.react-toggle-screenreader-only {\n border: 0;\n clip: rect(0 0 0 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n}\n\n.react-toggle--disabled {\n cursor: not-allowed;\n opacity: 0.5;\n transition: opacity 0.25s;\n}\n\n.react-toggle-track {\n width: 50px;\n height: 24px;\n padding: 0;\n border-radius: 30px;\n background-color: $ui-base-color;\n transition: background-color 0.2s ease;\n}\n\n.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track {\n background-color: darken($ui-base-color, 10%);\n}\n\n.react-toggle--checked .react-toggle-track {\n background-color: $ui-highlight-color;\n}\n\n.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track {\n background-color: lighten($ui-highlight-color, 10%);\n}\n\n.react-toggle-track-check {\n position: absolute;\n width: 14px;\n height: 10px;\n top: 0;\n bottom: 0;\n margin-top: auto;\n margin-bottom: auto;\n line-height: 0;\n left: 8px;\n opacity: 0;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle--checked .react-toggle-track-check {\n opacity: 1;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle-track-x {\n position: absolute;\n width: 10px;\n height: 10px;\n top: 0;\n bottom: 0;\n margin-top: auto;\n margin-bottom: auto;\n line-height: 0;\n right: 10px;\n opacity: 1;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle--checked .react-toggle-track-x {\n opacity: 0;\n}\n\n.react-toggle-thumb {\n position: absolute;\n top: 1px;\n left: 1px;\n width: 22px;\n height: 22px;\n border: 1px solid $ui-base-color;\n border-radius: 50%;\n background-color: darken($simple-background-color, 2%);\n box-sizing: border-box;\n transition: all 0.25s ease;\n transition-property: border-color, left;\n}\n\n.react-toggle--checked .react-toggle-thumb {\n left: 27px;\n border-color: $ui-highlight-color;\n}\n\n.column-link {\n background: lighten($ui-base-color, 8%);\n color: $primary-text-color;\n display: block;\n font-size: 16px;\n padding: 15px;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 11%);\n }\n\n &:focus {\n outline: 0;\n }\n\n &--transparent {\n background: transparent;\n color: $ui-secondary-color;\n\n &:hover,\n &:focus,\n &:active {\n background: transparent;\n color: $primary-text-color;\n }\n\n &.active {\n color: $ui-highlight-color;\n }\n }\n}\n\n.column-link__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.column-link__badge {\n display: inline-block;\n border-radius: 4px;\n font-size: 12px;\n line-height: 19px;\n font-weight: 500;\n background: $ui-base-color;\n padding: 4px 8px;\n margin: -6px 10px;\n}\n\n.column-subheading {\n background: $ui-base-color;\n color: $dark-text-color;\n padding: 8px 20px;\n font-size: 13px;\n font-weight: 500;\n cursor: default;\n}\n\n.getting-started__wrapper,\n.getting-started,\n.flex-spacer {\n background: $ui-base-color;\n}\n\n.flex-spacer {\n flex: 1 1 auto;\n}\n\n.getting-started {\n color: $dark-text-color;\n overflow: auto;\n border-bottom-left-radius: 2px;\n border-bottom-right-radius: 2px;\n\n &__wrapper,\n &__panel,\n &__footer {\n height: min-content;\n }\n\n &__panel,\n &__footer\n {\n padding: 10px;\n padding-top: 20px;\n flex-grow: 0;\n\n ul {\n margin-bottom: 10px;\n }\n\n ul li {\n display: inline;\n }\n\n p {\n font-size: 13px;\n\n a {\n color: $dark-text-color;\n text-decoration: underline;\n }\n }\n\n a {\n text-decoration: none;\n color: $darker-text-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n }\n\n &__wrapper,\n &__footer\n {\n color: $dark-text-color;\n }\n\n &__trends {\n flex: 0 1 auto;\n opacity: 1;\n animation: fade 150ms linear;\n margin-top: 10px;\n\n h4 {\n font-size: 13px;\n color: $darker-text-color;\n padding: 10px;\n font-weight: 500;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n @media screen and (max-height: 810px) {\n .trends__item:nth-child(3) {\n display: none;\n }\n }\n\n @media screen and (max-height: 720px) {\n .trends__item:nth-child(2) {\n display: none;\n }\n }\n\n @media screen and (max-height: 670px) {\n display: none;\n }\n\n .trends__item {\n border-bottom: 0;\n padding: 10px;\n\n &__current {\n color: $darker-text-color;\n }\n }\n }\n}\n\n.keyboard-shortcuts {\n padding: 8px 0 0;\n overflow: hidden;\n\n thead {\n position: absolute;\n left: -9999px;\n }\n\n td {\n padding: 0 10px 8px;\n }\n\n kbd {\n display: inline-block;\n padding: 3px 5px;\n background-color: lighten($ui-base-color, 8%);\n border: 1px solid darken($ui-base-color, 4%);\n }\n}\n\n.setting-text {\n display: block;\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n color: $inverted-text-color;\n background: $simple-background-color;\n padding: 10px;\n font-family: inherit;\n font-size: 14px;\n resize: vertical;\n border: 0;\n outline: 0;\n border-radius: 4px;\n\n &:focus {\n outline: 0;\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n}\n\n.no-reduce-motion button.icon-button i.fa-retweet {\n background-position: 0 0;\n height: 19px;\n transition: background-position 0.9s steps(10);\n transition-duration: 0s;\n vertical-align: middle;\n width: 22px;\n\n &::before {\n display: none !important;\n }\n\n}\n\n.no-reduce-motion button.icon-button.active i.fa-retweet {\n transition-duration: 0.9s;\n background-position: 0 100%;\n}\n\n.reduce-motion button.icon-button i.fa-retweet {\n color: $action-button-color;\n transition: color 100ms ease-in;\n}\n\n.reduce-motion button.icon-button.active i.fa-retweet {\n color: $highlight-text-color;\n}\n\n.status-card {\n display: flex;\n font-size: 14px;\n border: 1px solid lighten($ui-base-color, 8%);\n border-radius: 4px;\n color: $dark-text-color;\n margin-top: 14px;\n text-decoration: none;\n overflow: hidden;\n\n &__actions {\n bottom: 0;\n left: 0;\n position: absolute;\n right: 0;\n top: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n\n & > div {\n background: rgba($base-shadow-color, 0.6);\n border-radius: 8px;\n padding: 12px 9px;\n flex: 0 0 auto;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n button,\n a {\n display: inline;\n color: $secondary-text-color;\n background: transparent;\n border: 0;\n padding: 0 8px;\n text-decoration: none;\n font-size: 18px;\n line-height: 18px;\n\n &:hover,\n &:active,\n &:focus {\n color: $primary-text-color;\n }\n }\n\n a {\n font-size: 19px;\n position: relative;\n bottom: -1px;\n }\n }\n}\n\na.status-card {\n cursor: pointer;\n\n &:hover {\n background: lighten($ui-base-color, 8%);\n }\n}\n\n.status-card-photo {\n cursor: zoom-in;\n display: block;\n text-decoration: none;\n width: 100%;\n height: auto;\n margin: 0;\n}\n\n.status-card-video {\n iframe {\n width: 100%;\n height: 100%;\n }\n}\n\n.status-card__title {\n display: block;\n font-weight: 500;\n margin-bottom: 5px;\n color: $darker-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-decoration: none;\n}\n\n.status-card__content {\n flex: 1 1 auto;\n overflow: hidden;\n padding: 14px 14px 14px 8px;\n}\n\n.status-card__description {\n color: $darker-text-color;\n}\n\n.status-card__host {\n display: block;\n margin-top: 5px;\n font-size: 13px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.status-card__image {\n flex: 0 0 100px;\n background: lighten($ui-base-color, 8%);\n position: relative;\n\n & > .fa {\n font-size: 21px;\n position: absolute;\n transform-origin: 50% 50%;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n}\n\n.status-card.horizontal {\n display: block;\n\n .status-card__image {\n width: 100%;\n }\n\n .status-card__image-image {\n border-radius: 4px 4px 0 0;\n }\n\n .status-card__title {\n white-space: inherit;\n }\n}\n\n.status-card.compact {\n border-color: lighten($ui-base-color, 4%);\n\n &.interactive {\n border: 0;\n }\n\n .status-card__content {\n padding: 8px;\n padding-top: 10px;\n }\n\n .status-card__title {\n white-space: nowrap;\n }\n\n .status-card__image {\n flex: 0 0 60px;\n }\n}\n\na.status-card.compact:hover {\n background-color: lighten($ui-base-color, 4%);\n}\n\n.status-card__image-image {\n border-radius: 4px 0 0 4px;\n display: block;\n margin: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n background-size: cover;\n background-position: center center;\n}\n\n.load-more {\n display: block;\n color: $dark-text-color;\n background-color: transparent;\n border: 0;\n font-size: inherit;\n text-align: center;\n line-height: inherit;\n margin: 0;\n padding: 15px;\n box-sizing: border-box;\n width: 100%;\n clear: both;\n text-decoration: none;\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n}\n\n.load-gap {\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n}\n\n.regeneration-indicator {\n text-align: center;\n font-size: 16px;\n font-weight: 500;\n color: $dark-text-color;\n background: $ui-base-color;\n cursor: default;\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 20px;\n\n &__figure {\n &,\n img {\n display: block;\n width: auto;\n height: 160px;\n margin: 0;\n }\n }\n\n &--without-header {\n padding-top: 20px + 48px;\n }\n\n &__label {\n margin-top: 30px;\n\n strong {\n display: block;\n margin-bottom: 10px;\n color: $dark-text-color;\n }\n\n span {\n font-size: 15px;\n font-weight: 400;\n }\n }\n}\n\n.column-header__wrapper {\n position: relative;\n flex: 0 0 auto;\n\n &.active {\n &::before {\n display: block;\n content: \"\";\n position: absolute;\n top: 35px;\n left: 0;\n right: 0;\n margin: 0 auto;\n width: 60%;\n pointer-events: none;\n height: 28px;\n z-index: 1;\n background: radial-gradient(ellipse, rgba($ui-highlight-color, 0.23) 0%, rgba($ui-highlight-color, 0) 60%);\n }\n }\n}\n\n.column-header {\n display: flex;\n font-size: 16px;\n background: lighten($ui-base-color, 4%);\n flex: 0 0 auto;\n cursor: pointer;\n position: relative;\n z-index: 2;\n outline: 0;\n overflow: hidden;\n border-top-left-radius: 2px;\n border-top-right-radius: 2px;\n\n & > button {\n margin: 0;\n border: 0;\n padding: 15px 0 15px 15px;\n color: inherit;\n background: transparent;\n font: inherit;\n text-align: left;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n flex: 1;\n }\n\n & > .column-header__back-button {\n color: $highlight-text-color;\n }\n\n &.active {\n box-shadow: 0 1px 0 rgba($highlight-text-color, 0.3);\n\n .column-header__icon {\n color: $highlight-text-color;\n text-shadow: 0 0 10px rgba($highlight-text-color, 0.4);\n }\n }\n\n &:focus,\n &:active {\n outline: 0;\n }\n}\n\n.column-header__buttons {\n height: 48px;\n display: flex;\n}\n\n.column-header__links {\n margin-bottom: 14px;\n}\n\n.column-header__links .text-btn {\n margin-right: 10px;\n}\n\n.column-header__button {\n background: lighten($ui-base-color, 4%);\n border: 0;\n color: $darker-text-color;\n cursor: pointer;\n font-size: 16px;\n padding: 0 15px;\n\n &:hover {\n color: lighten($darker-text-color, 7%);\n }\n\n &.active {\n color: $primary-text-color;\n background: lighten($ui-base-color, 8%);\n\n &:hover {\n color: $primary-text-color;\n background: lighten($ui-base-color, 8%);\n }\n }\n}\n\n.column-header__collapsible {\n max-height: 70vh;\n overflow: hidden;\n overflow-y: auto;\n color: $darker-text-color;\n transition: max-height 150ms ease-in-out, opacity 300ms linear;\n opacity: 1;\n\n &.collapsed {\n max-height: 0;\n opacity: 0.5;\n }\n\n &.animating {\n overflow-y: hidden;\n }\n\n hr {\n height: 0;\n background: transparent;\n border: 0;\n border-top: 1px solid lighten($ui-base-color, 12%);\n margin: 10px 0;\n }\n}\n\n.column-header__collapsible-inner {\n background: lighten($ui-base-color, 8%);\n padding: 15px;\n}\n\n.column-header__setting-btn {\n &:hover {\n color: $darker-text-color;\n text-decoration: underline;\n }\n}\n\n.column-header__setting-arrows {\n float: right;\n\n .column-header__setting-btn {\n padding: 0 10px;\n\n &:last-child {\n padding-right: 0;\n }\n }\n}\n\n.text-btn {\n display: inline-block;\n padding: 0;\n font-family: inherit;\n font-size: inherit;\n color: inherit;\n border: 0;\n background: transparent;\n cursor: pointer;\n}\n\n.column-header__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.loading-indicator {\n color: $dark-text-color;\n font-size: 13px;\n font-weight: 400;\n overflow: visible;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n\n span {\n display: block;\n float: left;\n margin-left: 50%;\n transform: translateX(-50%);\n margin: 82px 0 0 50%;\n white-space: nowrap;\n }\n}\n\n.loading-indicator__figure {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 42px;\n height: 42px;\n box-sizing: border-box;\n background-color: transparent;\n border: 0 solid lighten($ui-base-color, 26%);\n border-width: 6px;\n border-radius: 50%;\n}\n\n.no-reduce-motion .loading-indicator span {\n animation: loader-label 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1);\n}\n\n.no-reduce-motion .loading-indicator__figure {\n animation: loader-figure 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1);\n}\n\n@keyframes spring-rotate-in {\n 0% {\n transform: rotate(0deg);\n }\n\n 30% {\n transform: rotate(-484.8deg);\n }\n\n 60% {\n transform: rotate(-316.7deg);\n }\n\n 90% {\n transform: rotate(-375deg);\n }\n\n 100% {\n transform: rotate(-360deg);\n }\n}\n\n@keyframes spring-rotate-out {\n 0% {\n transform: rotate(-360deg);\n }\n\n 30% {\n transform: rotate(124.8deg);\n }\n\n 60% {\n transform: rotate(-43.27deg);\n }\n\n 90% {\n transform: rotate(15deg);\n }\n\n 100% {\n transform: rotate(0deg);\n }\n}\n\n@keyframes loader-figure {\n 0% {\n width: 0;\n height: 0;\n background-color: lighten($ui-base-color, 26%);\n }\n\n 29% {\n background-color: lighten($ui-base-color, 26%);\n }\n\n 30% {\n width: 42px;\n height: 42px;\n background-color: transparent;\n border-width: 21px;\n opacity: 1;\n }\n\n 100% {\n width: 42px;\n height: 42px;\n border-width: 0;\n opacity: 0;\n background-color: transparent;\n }\n}\n\n@keyframes loader-label {\n 0% { opacity: 0.25; }\n 30% { opacity: 1; }\n 100% { opacity: 0.25; }\n}\n\n.video-error-cover {\n align-items: center;\n background: $base-overlay-background;\n color: $primary-text-color;\n cursor: pointer;\n display: flex;\n flex-direction: column;\n height: 100%;\n justify-content: center;\n margin-top: 8px;\n position: relative;\n text-align: center;\n z-index: 100;\n}\n\n.media-spoiler {\n background: $base-overlay-background;\n color: $darker-text-color;\n border: 0;\n padding: 0;\n width: 100%;\n height: 100%;\n border-radius: 4px;\n appearance: none;\n\n &:hover,\n &:active,\n &:focus {\n padding: 0;\n color: lighten($darker-text-color, 8%);\n }\n}\n\n.media-spoiler__warning {\n display: block;\n font-size: 14px;\n}\n\n.media-spoiler__trigger {\n display: block;\n font-size: 11px;\n font-weight: 700;\n}\n\n.spoiler-button {\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n position: absolute;\n z-index: 100;\n\n &--minified {\n display: block;\n left: 4px;\n top: 4px;\n width: auto;\n height: auto;\n }\n\n &--click-thru {\n pointer-events: none;\n }\n\n &--hidden {\n display: none;\n }\n\n &__overlay {\n display: block;\n background: transparent;\n width: 100%;\n height: 100%;\n border: 0;\n\n &__label {\n display: inline-block;\n background: rgba($base-overlay-background, 0.5);\n border-radius: 8px;\n padding: 8px 12px;\n color: $primary-text-color;\n font-weight: 500;\n font-size: 14px;\n }\n\n &:hover,\n &:focus,\n &:active {\n .spoiler-button__overlay__label {\n background: rgba($base-overlay-background, 0.8);\n }\n }\n\n &:disabled {\n .spoiler-button__overlay__label {\n background: rgba($base-overlay-background, 0.5);\n }\n }\n }\n}\n\n.modal-container--preloader {\n background: lighten($ui-base-color, 8%);\n}\n\n.account--panel {\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: row;\n padding: 10px 0;\n}\n\n.account--panel__button,\n.detailed-status__button {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.column-settings__outer {\n background: lighten($ui-base-color, 8%);\n padding: 15px;\n}\n\n.column-settings__section {\n color: $darker-text-color;\n cursor: default;\n display: block;\n font-weight: 500;\n margin-bottom: 10px;\n}\n\n.column-settings__hashtags {\n .column-settings__row {\n margin-bottom: 15px;\n }\n\n .column-select {\n &__control {\n @include search-input;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n &__placeholder {\n color: $dark-text-color;\n padding-left: 2px;\n font-size: 12px;\n }\n\n &__value-container {\n padding-left: 6px;\n }\n\n &__multi-value {\n background: lighten($ui-base-color, 8%);\n\n &__remove {\n cursor: pointer;\n\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 12%);\n color: lighten($darker-text-color, 4%);\n }\n }\n }\n\n &__multi-value__label,\n &__input {\n color: $darker-text-color;\n }\n\n &__clear-indicator,\n &__dropdown-indicator {\n cursor: pointer;\n transition: none;\n color: $dark-text-color;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($dark-text-color, 4%);\n }\n }\n\n &__indicator-separator {\n background-color: lighten($ui-base-color, 8%);\n }\n\n &__menu {\n @include search-popout;\n padding: 0;\n background: $ui-secondary-color;\n }\n\n &__menu-list {\n padding: 6px;\n }\n\n &__option {\n color: $inverted-text-color;\n border-radius: 4px;\n font-size: 14px;\n\n &--is-focused,\n &--is-selected {\n background: darken($ui-secondary-color, 10%);\n }\n }\n }\n}\n\n.column-settings__row {\n .text-btn {\n margin-bottom: 15px;\n }\n}\n\n.relationship-tag {\n color: $primary-text-color;\n margin-bottom: 4px;\n display: block;\n vertical-align: top;\n background-color: $base-overlay-background;\n font-size: 12px;\n font-weight: 500;\n padding: 4px;\n border-radius: 4px;\n opacity: 0.7;\n\n &:hover {\n opacity: 1;\n }\n}\n\n.setting-toggle {\n display: block;\n line-height: 24px;\n}\n\n.setting-toggle__label {\n color: $darker-text-color;\n display: inline-block;\n margin-bottom: 14px;\n margin-left: 8px;\n vertical-align: middle;\n}\n\n.empty-column-indicator,\n.error-column {\n color: $dark-text-color;\n background: $ui-base-color;\n text-align: center;\n padding: 20px;\n font-size: 15px;\n font-weight: 400;\n cursor: default;\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n justify-content: center;\n\n @supports(display: grid) { // hack to fix Chrome <57\n contain: strict;\n }\n\n & > span {\n max-width: 400px;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.error-column {\n flex-direction: column;\n}\n\n@keyframes heartbeat {\n from {\n transform: scale(1);\n animation-timing-function: ease-out;\n }\n\n 10% {\n transform: scale(0.91);\n animation-timing-function: ease-in;\n }\n\n 17% {\n transform: scale(0.98);\n animation-timing-function: ease-out;\n }\n\n 33% {\n transform: scale(0.87);\n animation-timing-function: ease-in;\n }\n\n 45% {\n transform: scale(1);\n animation-timing-function: ease-out;\n }\n}\n\n.no-reduce-motion .pulse-loading {\n transform-origin: center center;\n animation: heartbeat 1.5s ease-in-out infinite both;\n}\n\n@keyframes shake-bottom {\n 0%,\n 100% {\n transform: rotate(0deg);\n transform-origin: 50% 100%;\n }\n\n 10% {\n transform: rotate(2deg);\n }\n\n 20%,\n 40%,\n 60% {\n transform: rotate(-4deg);\n }\n\n 30%,\n 50%,\n 70% {\n transform: rotate(4deg);\n }\n\n 80% {\n transform: rotate(-2deg);\n }\n\n 90% {\n transform: rotate(2deg);\n }\n}\n\n.no-reduce-motion .shake-bottom {\n transform-origin: 50% 100%;\n animation: shake-bottom 0.8s cubic-bezier(0.455, 0.03, 0.515, 0.955) 2s 2 both;\n}\n\n.emoji-picker-dropdown__menu {\n background: $simple-background-color;\n position: absolute;\n box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n margin-top: 5px;\n z-index: 2;\n\n .emoji-mart-scroll {\n transition: opacity 200ms ease;\n }\n\n &.selecting .emoji-mart-scroll {\n opacity: 0.5;\n }\n}\n\n.emoji-picker-dropdown__modifiers {\n position: absolute;\n top: 60px;\n right: 11px;\n cursor: pointer;\n}\n\n.emoji-picker-dropdown__modifiers__menu {\n position: absolute;\n z-index: 4;\n top: -4px;\n left: -8px;\n background: $simple-background-color;\n border-radius: 4px;\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n overflow: hidden;\n\n button {\n display: block;\n cursor: pointer;\n border: 0;\n padding: 4px 8px;\n background: transparent;\n\n &:hover,\n &:focus,\n &:active {\n background: rgba($ui-secondary-color, 0.4);\n }\n }\n\n .emoji-mart-emoji {\n height: 22px;\n }\n}\n\n.emoji-mart-emoji {\n span {\n background-repeat: no-repeat;\n }\n}\n\n.upload-area {\n align-items: center;\n background: rgba($base-overlay-background, 0.8);\n display: flex;\n height: 100%;\n justify-content: center;\n left: 0;\n opacity: 0;\n position: absolute;\n top: 0;\n visibility: hidden;\n width: 100%;\n z-index: 2000;\n\n * {\n pointer-events: none;\n }\n}\n\n.upload-area__drop {\n width: 320px;\n height: 160px;\n display: flex;\n box-sizing: border-box;\n position: relative;\n padding: 8px;\n}\n\n.upload-area__background {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: -1;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 5px rgba($base-shadow-color, 0.2);\n}\n\n.upload-area__content {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: $secondary-text-color;\n font-size: 18px;\n font-weight: 500;\n border: 2px dashed $ui-base-lighter-color;\n border-radius: 4px;\n}\n\n.upload-progress {\n padding: 10px;\n color: $lighter-text-color;\n overflow: hidden;\n display: flex;\n\n .fa {\n font-size: 34px;\n margin-right: 10px;\n }\n\n span {\n font-size: 13px;\n font-weight: 500;\n display: block;\n }\n}\n\n.upload-progess__message {\n flex: 1 1 auto;\n}\n\n.upload-progress__backdrop {\n width: 100%;\n height: 6px;\n border-radius: 6px;\n background: $ui-base-lighter-color;\n position: relative;\n margin-top: 5px;\n}\n\n.upload-progress__tracker {\n position: absolute;\n left: 0;\n top: 0;\n height: 6px;\n background: $ui-highlight-color;\n border-radius: 6px;\n}\n\n.emoji-button {\n display: block;\n font-size: 24px;\n line-height: 24px;\n margin-left: 2px;\n width: 24px;\n outline: 0;\n cursor: pointer;\n\n &:active,\n &:focus {\n outline: 0 !important;\n }\n\n img {\n filter: grayscale(100%);\n opacity: 0.8;\n display: block;\n margin: 0;\n width: 22px;\n height: 22px;\n margin-top: 2px;\n }\n\n &:hover,\n &:active,\n &:focus {\n img {\n opacity: 1;\n filter: none;\n }\n }\n}\n\n.dropdown--active .emoji-button img {\n opacity: 1;\n filter: none;\n}\n\n.privacy-dropdown__dropdown {\n position: absolute;\n background: $simple-background-color;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n margin-left: 40px;\n overflow: hidden;\n\n &.top {\n transform-origin: 50% 100%;\n }\n\n &.bottom {\n transform-origin: 50% 0;\n }\n}\n\n.privacy-dropdown__option {\n color: $inverted-text-color;\n padding: 10px;\n cursor: pointer;\n display: flex;\n\n &:hover,\n &.active {\n background: $ui-highlight-color;\n color: $primary-text-color;\n outline: 0;\n\n .privacy-dropdown__option__content {\n color: $primary-text-color;\n\n strong {\n color: $primary-text-color;\n }\n }\n }\n\n &.active:hover {\n background: lighten($ui-highlight-color, 4%);\n }\n}\n\n.privacy-dropdown__option__icon {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 10px;\n}\n\n.privacy-dropdown__option__content {\n flex: 1 1 auto;\n color: $lighter-text-color;\n\n strong {\n font-weight: 500;\n display: block;\n color: $inverted-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n}\n\n.privacy-dropdown.active {\n .privacy-dropdown__value {\n background: $simple-background-color;\n border-radius: 4px 4px 0 0;\n box-shadow: 0 -4px 4px rgba($base-shadow-color, 0.1);\n\n .icon-button {\n transition: none;\n }\n\n &.active {\n background: $ui-highlight-color;\n\n .icon-button {\n color: $primary-text-color;\n }\n }\n }\n\n &.top .privacy-dropdown__value {\n border-radius: 0 0 4px 4px;\n }\n\n .privacy-dropdown__dropdown {\n display: block;\n box-shadow: 2px 4px 6px rgba($base-shadow-color, 0.1);\n }\n}\n\n.search {\n position: relative;\n}\n\n.search__input {\n @include search-input;\n\n display: block;\n padding: 15px;\n padding-right: 30px;\n line-height: 18px;\n font-size: 16px;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n}\n\n.search__icon {\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus {\n outline: 0 !important;\n }\n\n .fa {\n position: absolute;\n top: 16px;\n right: 10px;\n z-index: 2;\n display: inline-block;\n opacity: 0;\n transition: all 100ms linear;\n transition-property: transform, opacity;\n font-size: 18px;\n width: 18px;\n height: 18px;\n color: $secondary-text-color;\n cursor: default;\n pointer-events: none;\n\n &.active {\n pointer-events: auto;\n opacity: 0.3;\n }\n }\n\n .fa-search {\n transform: rotate(90deg);\n\n &.active {\n pointer-events: none;\n transform: rotate(0deg);\n }\n }\n\n .fa-times-circle {\n top: 17px;\n transform: rotate(0deg);\n color: $action-button-color;\n cursor: pointer;\n\n &.active {\n transform: rotate(90deg);\n }\n\n &:hover {\n color: lighten($action-button-color, 7%);\n }\n }\n}\n\n.search-results__header {\n color: $dark-text-color;\n background: lighten($ui-base-color, 2%);\n padding: 15px;\n font-weight: 500;\n font-size: 16px;\n cursor: default;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n}\n\n.search-results__section {\n margin-bottom: 5px;\n\n h5 {\n background: darken($ui-base-color, 4%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n display: flex;\n padding: 15px;\n font-weight: 500;\n font-size: 16px;\n color: $dark-text-color;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n .account:last-child,\n & > div:last-child .status {\n border-bottom: 0;\n }\n}\n\n.search-results__hashtag {\n display: block;\n padding: 10px;\n color: $secondary-text-color;\n text-decoration: none;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($secondary-text-color, 4%);\n text-decoration: underline;\n }\n}\n\n.search-results__info {\n padding: 20px;\n color: $darker-text-color;\n text-align: center;\n}\n\n.modal-root {\n position: relative;\n transition: opacity 0.3s linear;\n will-change: opacity;\n z-index: 9999;\n}\n\n.modal-root__overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba($base-overlay-background, 0.7);\n}\n\n.modal-root__container {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n align-content: space-around;\n z-index: 9999;\n pointer-events: none;\n user-select: none;\n}\n\n.modal-root__modal {\n pointer-events: auto;\n display: flex;\n z-index: 9999;\n}\n\n.video-modal__container {\n max-width: 100vw;\n max-height: 100vh;\n}\n\n.audio-modal__container {\n width: 50vw;\n}\n\n.media-modal {\n width: 100%;\n height: 100%;\n position: relative;\n\n .extended-video-player {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n video {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n }\n }\n}\n\n.media-modal__closer {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n}\n\n.media-modal__navigation {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n transition: opacity 0.3s linear;\n will-change: opacity;\n\n * {\n pointer-events: auto;\n }\n\n &.media-modal__navigation--hidden {\n opacity: 0;\n\n * {\n pointer-events: none;\n }\n }\n}\n\n.media-modal__nav {\n background: rgba($base-overlay-background, 0.5);\n box-sizing: border-box;\n border: 0;\n color: $primary-text-color;\n cursor: pointer;\n display: flex;\n align-items: center;\n font-size: 24px;\n height: 20vmax;\n margin: auto 0;\n padding: 30px 15px;\n position: absolute;\n top: 0;\n bottom: 0;\n}\n\n.media-modal__nav--left {\n left: 0;\n}\n\n.media-modal__nav--right {\n right: 0;\n}\n\n.media-modal__pagination {\n width: 100%;\n text-align: center;\n position: absolute;\n left: 0;\n bottom: 20px;\n pointer-events: none;\n}\n\n.media-modal__meta {\n text-align: center;\n position: absolute;\n left: 0;\n bottom: 20px;\n width: 100%;\n pointer-events: none;\n\n &--shifted {\n bottom: 62px;\n }\n\n a {\n pointer-events: auto;\n text-decoration: none;\n font-weight: 500;\n color: $ui-secondary-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.media-modal__page-dot {\n display: inline-block;\n}\n\n.media-modal__button {\n background-color: $primary-text-color;\n height: 12px;\n width: 12px;\n border-radius: 6px;\n margin: 10px;\n padding: 0;\n border: 0;\n font-size: 0;\n}\n\n.media-modal__button--active {\n background-color: $highlight-text-color;\n}\n\n.media-modal__close {\n position: absolute;\n right: 8px;\n top: 8px;\n z-index: 100;\n}\n\n.onboarding-modal,\n.error-modal,\n.embed-modal {\n background: $ui-secondary-color;\n color: $inverted-text-color;\n border-radius: 8px;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.error-modal__body {\n height: 80vh;\n width: 80vw;\n max-width: 520px;\n max-height: 420px;\n position: relative;\n\n & > div {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n padding: 25px;\n display: none;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n display: flex;\n opacity: 0;\n user-select: text;\n }\n}\n\n.error-modal__body {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n text-align: center;\n}\n\n.onboarding-modal__paginator,\n.error-modal__footer {\n flex: 0 0 auto;\n background: darken($ui-secondary-color, 8%);\n display: flex;\n padding: 25px;\n\n & > div {\n min-width: 33px;\n }\n\n .onboarding-modal__nav,\n .error-modal__nav {\n color: $lighter-text-color;\n border: 0;\n font-size: 14px;\n font-weight: 500;\n padding: 10px 25px;\n line-height: inherit;\n height: auto;\n margin: -10px;\n border-radius: 4px;\n background-color: transparent;\n\n &:hover,\n &:focus,\n &:active {\n color: darken($lighter-text-color, 4%);\n background-color: darken($ui-secondary-color, 16%);\n }\n\n &.onboarding-modal__done,\n &.onboarding-modal__next {\n color: $inverted-text-color;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($inverted-text-color, 4%);\n }\n }\n }\n}\n\n.error-modal__footer {\n justify-content: center;\n}\n\n.display-case {\n text-align: center;\n font-size: 15px;\n margin-bottom: 15px;\n\n &__label {\n font-weight: 500;\n color: $inverted-text-color;\n margin-bottom: 5px;\n font-size: 13px;\n }\n\n &__case {\n background: $ui-base-color;\n color: $secondary-text-color;\n font-weight: 500;\n padding: 10px;\n border-radius: 4px;\n }\n}\n\n.onboard-sliders {\n display: inline-block;\n max-width: 30px;\n max-height: auto;\n margin-left: 10px;\n}\n\n.boost-modal,\n.confirmation-modal,\n.report-modal,\n.actions-modal,\n.mute-modal,\n.block-modal {\n background: lighten($ui-secondary-color, 8%);\n color: $inverted-text-color;\n border-radius: 8px;\n overflow: hidden;\n max-width: 90vw;\n width: 480px;\n position: relative;\n flex-direction: column;\n\n .status__display-name {\n display: block;\n max-width: 100%;\n padding-right: 25px;\n }\n\n .status__avatar {\n height: 28px;\n left: 10px;\n position: absolute;\n top: 10px;\n width: 48px;\n }\n\n .status__content__spoiler-link {\n color: lighten($secondary-text-color, 8%);\n }\n}\n\n.actions-modal {\n .status {\n background: $white;\n border-bottom-color: $ui-secondary-color;\n padding-top: 10px;\n padding-bottom: 10px;\n }\n\n .dropdown-menu__separator {\n border-bottom-color: $ui-secondary-color;\n }\n}\n\n.boost-modal__container {\n overflow-x: scroll;\n padding: 10px;\n\n .status {\n user-select: text;\n border-bottom: 0;\n }\n}\n\n.boost-modal__action-bar,\n.confirmation-modal__action-bar,\n.mute-modal__action-bar,\n.block-modal__action-bar {\n display: flex;\n justify-content: space-between;\n background: $ui-secondary-color;\n padding: 10px;\n line-height: 36px;\n\n & > div {\n flex: 1 1 auto;\n text-align: right;\n color: $lighter-text-color;\n padding-right: 10px;\n }\n\n .button {\n flex: 0 0 auto;\n }\n}\n\n.boost-modal__status-header {\n font-size: 15px;\n}\n\n.boost-modal__status-time {\n float: right;\n font-size: 14px;\n}\n\n.mute-modal,\n.block-modal {\n line-height: 24px;\n}\n\n.mute-modal .react-toggle,\n.block-modal .react-toggle {\n vertical-align: middle;\n}\n\n.report-modal {\n width: 90vw;\n max-width: 700px;\n}\n\n.report-modal__container {\n display: flex;\n border-top: 1px solid $ui-secondary-color;\n\n @media screen and (max-width: 480px) {\n flex-wrap: wrap;\n overflow-y: auto;\n }\n}\n\n.report-modal__statuses,\n.report-modal__comment {\n box-sizing: border-box;\n width: 50%;\n\n @media screen and (max-width: 480px) {\n width: 100%;\n }\n}\n\n.report-modal__statuses,\n.focal-point-modal__content {\n flex: 1 1 auto;\n min-height: 20vh;\n max-height: 80vh;\n overflow-y: auto;\n overflow-x: hidden;\n\n .status__content a {\n color: $highlight-text-color;\n }\n\n .status__content,\n .status__content p {\n color: $inverted-text-color;\n }\n\n @media screen and (max-width: 480px) {\n max-height: 10vh;\n }\n}\n\n.focal-point-modal__content {\n @media screen and (max-width: 480px) {\n max-height: 40vh;\n }\n}\n\n.report-modal__comment {\n padding: 20px;\n border-right: 1px solid $ui-secondary-color;\n max-width: 320px;\n\n p {\n font-size: 14px;\n line-height: 20px;\n margin-bottom: 20px;\n }\n\n .setting-text {\n display: block;\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n color: $inverted-text-color;\n background: $white;\n padding: 10px;\n font-family: inherit;\n font-size: 14px;\n resize: none;\n border: 0;\n outline: 0;\n border-radius: 4px;\n border: 1px solid $ui-secondary-color;\n min-height: 100px;\n max-height: 50vh;\n margin-bottom: 10px;\n\n &:focus {\n border: 1px solid darken($ui-secondary-color, 8%);\n }\n\n &__wrapper {\n background: $white;\n border: 1px solid $ui-secondary-color;\n margin-bottom: 10px;\n border-radius: 4px;\n\n .setting-text {\n border: 0;\n margin-bottom: 0;\n border-radius: 0;\n\n &:focus {\n border: 0;\n }\n }\n\n &__modifiers {\n color: $inverted-text-color;\n font-family: inherit;\n font-size: 14px;\n background: $white;\n }\n }\n\n &__toolbar {\n display: flex;\n justify-content: space-between;\n margin-bottom: 20px;\n }\n }\n\n .setting-text-label {\n display: block;\n color: $inverted-text-color;\n font-size: 14px;\n font-weight: 500;\n margin-bottom: 10px;\n }\n\n .setting-toggle {\n margin-top: 20px;\n margin-bottom: 24px;\n\n &__label {\n color: $inverted-text-color;\n font-size: 14px;\n }\n }\n\n @media screen and (max-width: 480px) {\n padding: 10px;\n max-width: 100%;\n order: 2;\n\n .setting-toggle {\n margin-bottom: 4px;\n }\n }\n}\n\n.actions-modal {\n max-height: 80vh;\n max-width: 80vw;\n\n .status {\n overflow-y: auto;\n max-height: 300px;\n }\n\n .actions-modal__item-label {\n font-weight: 500;\n }\n\n ul {\n overflow-y: auto;\n flex-shrink: 0;\n max-height: 80vh;\n\n &.with-status {\n max-height: calc(80vh - 75px);\n }\n\n li:empty {\n margin: 0;\n }\n\n li:not(:empty) {\n a {\n color: $inverted-text-color;\n display: flex;\n padding: 12px 16px;\n font-size: 15px;\n align-items: center;\n text-decoration: none;\n\n &,\n button {\n transition: none;\n }\n\n &.active,\n &:hover,\n &:active,\n &:focus {\n &,\n button {\n background: $ui-highlight-color;\n color: $primary-text-color;\n }\n }\n\n button:first-child {\n margin-right: 10px;\n }\n }\n }\n }\n}\n\n.confirmation-modal__action-bar,\n.mute-modal__action-bar,\n.block-modal__action-bar {\n .confirmation-modal__secondary-button {\n flex-shrink: 1;\n }\n}\n\n.confirmation-modal__secondary-button,\n.confirmation-modal__cancel-button,\n.mute-modal__cancel-button,\n.block-modal__cancel-button {\n background-color: transparent;\n color: $lighter-text-color;\n font-size: 14px;\n font-weight: 500;\n\n &:hover,\n &:focus,\n &:active {\n color: darken($lighter-text-color, 4%);\n background-color: transparent;\n }\n}\n\n.confirmation-modal__container,\n.mute-modal__container,\n.block-modal__container,\n.report-modal__target {\n padding: 30px;\n font-size: 16px;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n}\n\n.confirmation-modal__container,\n.report-modal__target {\n text-align: center;\n}\n\n.block-modal,\n.mute-modal {\n &__explanation {\n margin-top: 20px;\n }\n\n .setting-toggle {\n margin-top: 20px;\n margin-bottom: 24px;\n display: flex;\n align-items: center;\n\n &__label {\n color: $inverted-text-color;\n margin: 0;\n margin-left: 8px;\n }\n }\n}\n\n.report-modal__target {\n padding: 15px;\n\n .media-modal__close {\n top: 14px;\n right: 15px;\n }\n}\n\n.loading-bar {\n background-color: $highlight-text-color;\n height: 3px;\n position: absolute;\n top: 0;\n left: 0;\n z-index: 9999;\n}\n\n.media-gallery__gifv__label {\n display: block;\n position: absolute;\n color: $primary-text-color;\n background: rgba($base-overlay-background, 0.5);\n bottom: 6px;\n left: 6px;\n padding: 2px 6px;\n border-radius: 2px;\n font-size: 11px;\n font-weight: 600;\n z-index: 1;\n pointer-events: none;\n opacity: 0.9;\n transition: opacity 0.1s ease;\n line-height: 18px;\n}\n\n.media-gallery__gifv {\n &.autoplay {\n .media-gallery__gifv__label {\n display: none;\n }\n }\n\n &:hover {\n .media-gallery__gifv__label {\n opacity: 1;\n }\n }\n}\n\n.media-gallery__audio {\n margin-top: 32px;\n\n audio {\n width: 100%;\n }\n}\n\n.attachment-list {\n display: flex;\n font-size: 14px;\n border: 1px solid lighten($ui-base-color, 8%);\n border-radius: 4px;\n margin-top: 14px;\n overflow: hidden;\n\n &__icon {\n flex: 0 0 auto;\n color: $dark-text-color;\n padding: 8px 18px;\n cursor: default;\n border-right: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n font-size: 26px;\n\n .fa {\n display: block;\n }\n }\n\n &__list {\n list-style: none;\n padding: 4px 0;\n padding-left: 8px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n\n li {\n display: block;\n padding: 4px 0;\n }\n\n a {\n text-decoration: none;\n color: $dark-text-color;\n font-weight: 500;\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n &.compact {\n border: 0;\n margin-top: 4px;\n\n .attachment-list__list {\n padding: 0;\n display: block;\n }\n\n .fa {\n color: $dark-text-color;\n }\n }\n}\n\n/* Media Gallery */\n.media-gallery {\n box-sizing: border-box;\n margin-top: 8px;\n overflow: hidden;\n border-radius: 4px;\n position: relative;\n width: 100%;\n}\n\n.media-gallery__item {\n border: 0;\n box-sizing: border-box;\n display: block;\n float: left;\n position: relative;\n border-radius: 4px;\n overflow: hidden;\n\n &.standalone {\n .media-gallery__item-gifv-thumbnail {\n transform: none;\n top: 0;\n }\n }\n}\n\n.media-gallery__item-thumbnail {\n cursor: zoom-in;\n display: block;\n text-decoration: none;\n color: $secondary-text-color;\n position: relative;\n z-index: 1;\n\n &,\n img {\n height: 100%;\n width: 100%;\n }\n\n img {\n object-fit: cover;\n }\n}\n\n.media-gallery__preview {\n width: 100%;\n height: 100%;\n object-fit: cover;\n position: absolute;\n top: 0;\n left: 0;\n z-index: 0;\n background: $base-overlay-background;\n\n &--hidden {\n display: none;\n }\n}\n\n.media-gallery__gifv {\n height: 100%;\n overflow: hidden;\n position: relative;\n width: 100%;\n}\n\n.media-gallery__item-gifv-thumbnail {\n cursor: zoom-in;\n height: 100%;\n object-fit: cover;\n position: relative;\n top: 50%;\n transform: translateY(-50%);\n width: 100%;\n z-index: 1;\n}\n\n.media-gallery__item-thumbnail-label {\n clip: rect(1px 1px 1px 1px); /* IE6, IE7 */\n clip: rect(1px, 1px, 1px, 1px);\n overflow: hidden;\n position: absolute;\n}\n/* End Media Gallery */\n\n.detailed,\n.fullscreen {\n .video-player__volume__current,\n .video-player__volume::before {\n bottom: 27px;\n }\n\n .video-player__volume__handle {\n bottom: 23px;\n }\n\n}\n\n.audio-player {\n box-sizing: border-box;\n position: relative;\n background: darken($ui-base-color, 8%);\n border-radius: 4px;\n padding-bottom: 44px;\n direction: ltr;\n\n &.editable {\n border-radius: 0;\n height: 100%;\n }\n\n &__waveform {\n padding: 15px 0;\n position: relative;\n overflow: hidden;\n\n &::before {\n content: \"\";\n display: block;\n position: absolute;\n border-top: 1px solid lighten($ui-base-color, 4%);\n width: 100%;\n height: 0;\n left: 0;\n top: calc(50% + 1px);\n }\n }\n\n &__progress-placeholder {\n background-color: rgba(lighten($ui-highlight-color, 8%), 0.5);\n }\n\n &__wave-placeholder {\n background-color: lighten($ui-base-color, 16%);\n }\n\n .video-player__controls {\n padding: 0 15px;\n padding-top: 10px;\n background: darken($ui-base-color, 8%);\n border-top: 1px solid lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n }\n}\n\n.video-player {\n overflow: hidden;\n position: relative;\n background: $base-shadow-color;\n max-width: 100%;\n border-radius: 4px;\n box-sizing: border-box;\n direction: ltr;\n\n &.editable {\n border-radius: 0;\n height: 100% !important;\n }\n\n &:focus {\n outline: 0;\n }\n\n video {\n max-width: 100vw;\n max-height: 80vh;\n z-index: 1;\n }\n\n &.fullscreen {\n width: 100% !important;\n height: 100% !important;\n margin: 0;\n\n video {\n max-width: 100% !important;\n max-height: 100% !important;\n width: 100% !important;\n height: 100% !important;\n outline: 0;\n }\n }\n\n &.inline {\n video {\n object-fit: contain;\n position: relative;\n top: 50%;\n transform: translateY(-50%);\n }\n }\n\n &__controls {\n position: absolute;\n z-index: 2;\n bottom: 0;\n left: 0;\n right: 0;\n box-sizing: border-box;\n background: linear-gradient(0deg, rgba($base-shadow-color, 0.85) 0, rgba($base-shadow-color, 0.45) 60%, transparent);\n padding: 0 15px;\n opacity: 0;\n transition: opacity .1s ease;\n\n &.active {\n opacity: 1;\n }\n }\n\n &.inactive {\n video,\n .video-player__controls {\n visibility: hidden;\n }\n }\n\n &__spoiler {\n display: none;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 4;\n border: 0;\n background: $base-overlay-background;\n color: $darker-text-color;\n transition: none;\n pointer-events: none;\n\n &.active {\n display: block;\n pointer-events: auto;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($darker-text-color, 7%);\n }\n }\n\n &__title {\n display: block;\n font-size: 14px;\n }\n\n &__subtitle {\n display: block;\n font-size: 11px;\n font-weight: 500;\n }\n }\n\n &__buttons-bar {\n display: flex;\n justify-content: space-between;\n padding-bottom: 10px;\n\n .video-player__download__icon {\n color: inherit;\n }\n }\n\n &__buttons {\n font-size: 16px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &.left {\n button {\n padding-left: 0;\n }\n }\n\n &.right {\n button {\n padding-right: 0;\n }\n }\n\n button {\n background: transparent;\n padding: 2px 10px;\n font-size: 16px;\n border: 0;\n color: rgba($white, 0.75);\n\n &:active,\n &:hover,\n &:focus {\n color: $white;\n }\n }\n }\n\n &__time-sep,\n &__time-total,\n &__time-current {\n font-size: 14px;\n font-weight: 500;\n }\n\n &__time-current {\n color: $white;\n margin-left: 60px;\n }\n\n &__time-sep {\n display: inline-block;\n margin: 0 6px;\n }\n\n &__time-sep,\n &__time-total {\n color: $white;\n }\n\n &__volume {\n cursor: pointer;\n height: 24px;\n display: inline;\n\n &::before {\n content: \"\";\n width: 50px;\n background: rgba($white, 0.35);\n border-radius: 4px;\n display: block;\n position: absolute;\n height: 4px;\n left: 70px;\n bottom: 20px;\n }\n\n &__current {\n display: block;\n position: absolute;\n height: 4px;\n border-radius: 4px;\n left: 70px;\n bottom: 20px;\n background: lighten($ui-highlight-color, 8%);\n }\n\n &__handle {\n position: absolute;\n z-index: 3;\n border-radius: 50%;\n width: 12px;\n height: 12px;\n bottom: 16px;\n left: 70px;\n transition: opacity .1s ease;\n background: lighten($ui-highlight-color, 8%);\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n pointer-events: none;\n }\n }\n\n &__link {\n padding: 2px 10px;\n\n a {\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n color: $white;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n }\n\n &__seek {\n cursor: pointer;\n height: 24px;\n position: relative;\n\n &::before {\n content: \"\";\n width: 100%;\n background: rgba($white, 0.35);\n border-radius: 4px;\n display: block;\n position: absolute;\n height: 4px;\n top: 10px;\n }\n\n &__progress,\n &__buffer {\n display: block;\n position: absolute;\n height: 4px;\n border-radius: 4px;\n top: 10px;\n background: lighten($ui-highlight-color, 8%);\n }\n\n &__buffer {\n background: rgba($white, 0.2);\n }\n\n &__handle {\n position: absolute;\n z-index: 3;\n opacity: 0;\n border-radius: 50%;\n width: 12px;\n height: 12px;\n top: 6px;\n margin-left: -6px;\n transition: opacity .1s ease;\n background: lighten($ui-highlight-color, 8%);\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n pointer-events: none;\n\n &.active {\n opacity: 1;\n }\n }\n\n &:hover {\n .video-player__seek__handle {\n opacity: 1;\n }\n }\n }\n\n &.detailed,\n &.fullscreen {\n .video-player__buttons {\n button {\n padding-top: 10px;\n padding-bottom: 10px;\n }\n }\n }\n}\n\n.directory {\n &__list {\n width: 100%;\n margin: 10px 0;\n transition: opacity 100ms ease-in;\n\n &.loading {\n opacity: 0.7;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin: 0;\n }\n }\n\n &__card {\n box-sizing: border-box;\n margin-bottom: 10px;\n\n &__img {\n height: 125px;\n position: relative;\n background: darken($ui-base-color, 12%);\n overflow: hidden;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n object-fit: cover;\n }\n }\n\n &__bar {\n display: flex;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n padding: 10px;\n\n &__name {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n text-decoration: none;\n overflow: hidden;\n }\n\n &__relationship {\n width: 23px;\n min-height: 1px;\n flex: 0 0 auto;\n }\n\n .avatar {\n flex: 0 0 auto;\n width: 48px;\n height: 48px;\n padding-top: 2px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n background: darken($ui-base-color, 8%);\n object-fit: cover;\n }\n }\n\n .display-name {\n margin-left: 15px;\n text-align: left;\n\n strong {\n font-size: 15px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n span {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n &__extra {\n background: $ui-base-color;\n display: flex;\n align-items: center;\n justify-content: center;\n\n .accounts-table__count {\n width: 33.33%;\n flex: 0 0 auto;\n padding: 15px 0;\n }\n\n .account__header__content {\n box-sizing: border-box;\n padding: 15px 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n width: 100%;\n min-height: 18px + 30px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n p {\n display: none;\n\n &:first-child {\n display: inline;\n }\n }\n\n br {\n display: none;\n }\n }\n }\n }\n}\n\n.account-gallery__container {\n display: flex;\n flex-wrap: wrap;\n padding: 4px 2px;\n}\n\n.account-gallery__item {\n border: 0;\n box-sizing: border-box;\n display: block;\n position: relative;\n border-radius: 4px;\n overflow: hidden;\n margin: 2px;\n\n &__icons {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 24px;\n }\n}\n\n.notification__filter-bar,\n.account__section-headline {\n background: darken($ui-base-color, 4%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n display: flex;\n flex-shrink: 0;\n\n button {\n background: darken($ui-base-color, 4%);\n border: 0;\n margin: 0;\n }\n\n button,\n a {\n display: block;\n flex: 1 1 auto;\n color: $darker-text-color;\n padding: 15px 0;\n font-size: 14px;\n font-weight: 500;\n text-align: center;\n text-decoration: none;\n position: relative;\n\n &.active {\n color: $secondary-text-color;\n\n &::before,\n &::after {\n display: block;\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 50%;\n width: 0;\n height: 0;\n transform: translateX(-50%);\n border-style: solid;\n border-width: 0 10px 10px;\n border-color: transparent transparent lighten($ui-base-color, 8%);\n }\n\n &::after {\n bottom: -1px;\n border-color: transparent transparent $ui-base-color;\n }\n }\n }\n\n &.directory__section-headline {\n background: darken($ui-base-color, 2%);\n border-bottom-color: transparent;\n\n a,\n button {\n &.active {\n &::before {\n display: none;\n }\n\n &::after {\n border-color: transparent transparent darken($ui-base-color, 7%);\n }\n }\n }\n }\n}\n\n.filter-form {\n background: $ui-base-color;\n\n &__column {\n padding: 10px 15px;\n }\n\n .radio-button {\n display: block;\n }\n}\n\n.radio-button {\n font-size: 14px;\n position: relative;\n display: inline-block;\n padding: 6px 0;\n line-height: 18px;\n cursor: default;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n cursor: pointer;\n\n input[type=radio],\n input[type=checkbox] {\n display: none;\n }\n\n &__input {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 50%;\n vertical-align: middle;\n\n &.checked {\n border-color: lighten($ui-highlight-color, 8%);\n background: lighten($ui-highlight-color, 8%);\n }\n }\n}\n\n::-webkit-scrollbar-thumb {\n border-radius: 0;\n}\n\n.search-popout {\n @include search-popout;\n}\n\nnoscript {\n text-align: center;\n\n img {\n width: 200px;\n opacity: 0.5;\n animation: flicker 4s infinite;\n }\n\n div {\n font-size: 14px;\n margin: 30px auto;\n color: $secondary-text-color;\n max-width: 400px;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n }\n}\n\n@keyframes flicker {\n 0% { opacity: 1; }\n 30% { opacity: 0.75; }\n 100% { opacity: 1; }\n}\n\n@media screen and (max-width: 630px) and (max-height: 400px) {\n $duration: 400ms;\n $delay: 100ms;\n\n .tabs-bar,\n .search {\n will-change: margin-top;\n transition: margin-top $duration $delay;\n }\n\n .navigation-bar {\n will-change: padding-bottom;\n transition: padding-bottom $duration $delay;\n }\n\n .navigation-bar {\n & > a:first-child {\n will-change: margin-top, margin-left, margin-right, width;\n transition: margin-top $duration $delay, margin-left $duration ($duration + $delay), margin-right $duration ($duration + $delay);\n }\n\n & > .navigation-bar__profile-edit {\n will-change: margin-top;\n transition: margin-top $duration $delay;\n }\n\n .navigation-bar__actions {\n & > .icon-button.close {\n will-change: opacity transform;\n transition: opacity $duration * 0.5 $delay,\n transform $duration $delay;\n }\n\n & > .compose__action-bar .icon-button {\n will-change: opacity transform;\n transition: opacity $duration * 0.5 $delay + $duration * 0.5,\n transform $duration $delay;\n }\n }\n }\n\n .is-composing {\n .tabs-bar,\n .search {\n margin-top: -50px;\n }\n\n .navigation-bar {\n padding-bottom: 0;\n\n & > a:first-child {\n margin: -100px 10px 0 -50px;\n }\n\n .navigation-bar__profile {\n padding-top: 2px;\n }\n\n .navigation-bar__profile-edit {\n position: absolute;\n margin-top: -60px;\n }\n\n .navigation-bar__actions {\n .icon-button.close {\n pointer-events: auto;\n opacity: 1;\n transform: scale(1, 1) translate(0, 0);\n bottom: 5px;\n }\n\n .compose__action-bar .icon-button {\n pointer-events: none;\n opacity: 0;\n transform: scale(0, 1) translate(100%, 0);\n }\n }\n }\n }\n}\n\n.embed-modal {\n width: auto;\n max-width: 80vw;\n max-height: 80vh;\n\n h4 {\n padding: 30px;\n font-weight: 500;\n font-size: 16px;\n text-align: center;\n }\n\n .embed-modal__container {\n padding: 10px;\n\n .hint {\n margin-bottom: 15px;\n }\n\n .embed-modal__html {\n outline: 0;\n box-sizing: border-box;\n display: block;\n width: 100%;\n border: 0;\n padding: 10px;\n font-family: $font-monospace, monospace;\n background: $ui-base-color;\n color: $primary-text-color;\n font-size: 14px;\n margin: 0;\n margin-bottom: 15px;\n border-radius: 4px;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n .embed-modal__iframe {\n width: 400px;\n max-width: 100%;\n overflow: hidden;\n border: 0;\n border-radius: 4px;\n }\n }\n}\n\n.account__moved-note {\n padding: 14px 10px;\n padding-bottom: 16px;\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &__message {\n position: relative;\n margin-left: 58px;\n color: $dark-text-color;\n padding: 8px 0;\n padding-top: 0;\n padding-bottom: 4px;\n font-size: 14px;\n\n > span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n &__icon-wrapper {\n left: -26px;\n position: absolute;\n }\n\n .detailed-status__display-avatar {\n position: relative;\n }\n\n .detailed-status__display-name {\n margin-bottom: 0;\n }\n}\n\n.column-inline-form {\n padding: 15px;\n padding-right: 0;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n\n label {\n flex: 1 1 auto;\n\n input {\n width: 100%;\n\n &:focus {\n outline: 0;\n }\n }\n }\n\n .icon-button {\n flex: 0 0 auto;\n margin: 0 10px;\n }\n}\n\n.drawer__backdrop {\n cursor: pointer;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba($base-overlay-background, 0.5);\n}\n\n.list-editor {\n background: $ui-base-color;\n flex-direction: column;\n border-radius: 8px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n width: 380px;\n overflow: hidden;\n\n @media screen and (max-width: 420px) {\n width: 90%;\n }\n\n h4 {\n padding: 15px 0;\n background: lighten($ui-base-color, 13%);\n font-weight: 500;\n font-size: 16px;\n text-align: center;\n border-radius: 8px 8px 0 0;\n }\n\n .drawer__pager {\n height: 50vh;\n }\n\n .drawer__inner {\n border-radius: 0 0 8px 8px;\n\n &.backdrop {\n width: calc(100% - 60px);\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n border-radius: 0 0 0 8px;\n }\n }\n\n &__accounts {\n overflow-y: auto;\n }\n\n .account__display-name {\n &:hover strong {\n text-decoration: none;\n }\n }\n\n .account__avatar {\n cursor: default;\n }\n\n .search {\n margin-bottom: 0;\n }\n}\n\n.list-adder {\n background: $ui-base-color;\n flex-direction: column;\n border-radius: 8px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n width: 380px;\n overflow: hidden;\n\n @media screen and (max-width: 420px) {\n width: 90%;\n }\n\n &__account {\n background: lighten($ui-base-color, 13%);\n }\n\n &__lists {\n background: lighten($ui-base-color, 13%);\n height: 50vh;\n border-radius: 0 0 8px 8px;\n overflow-y: auto;\n }\n\n .list {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n .list__wrapper {\n display: flex;\n }\n\n .list__display-name {\n flex: 1 1 auto;\n overflow: hidden;\n text-decoration: none;\n font-size: 16px;\n padding: 10px;\n }\n}\n\n.focal-point {\n position: relative;\n cursor: move;\n overflow: hidden;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n background: $base-shadow-color;\n\n img,\n video,\n canvas {\n display: block;\n max-height: 80vh;\n width: 100%;\n height: auto;\n margin: 0;\n object-fit: contain;\n background: $base-shadow-color;\n }\n\n &__reticle {\n position: absolute;\n width: 100px;\n height: 100px;\n transform: translate(-50%, -50%);\n background: url('~images/reticle.png') no-repeat 0 0;\n border-radius: 50%;\n box-shadow: 0 0 0 9999em rgba($base-shadow-color, 0.35);\n }\n\n &__overlay {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n }\n\n &__preview {\n position: absolute;\n bottom: 10px;\n right: 10px;\n z-index: 2;\n cursor: move;\n transition: opacity 0.1s ease;\n\n &:hover {\n opacity: 0.5;\n }\n\n strong {\n color: $primary-text-color;\n font-size: 14px;\n font-weight: 500;\n display: block;\n margin-bottom: 5px;\n }\n\n div {\n border-radius: 4px;\n box-shadow: 0 0 14px rgba($base-shadow-color, 0.2);\n }\n }\n\n @media screen and (max-width: 480px) {\n img,\n video {\n max-height: 100%;\n }\n\n &__preview {\n display: none;\n }\n }\n}\n\n.account__header__content {\n color: $darker-text-color;\n font-size: 14px;\n font-weight: 400;\n overflow: hidden;\n word-break: normal;\n word-wrap: break-word;\n\n p {\n margin-bottom: 20px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: inherit;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n}\n\n.account__header {\n overflow: hidden;\n\n &.inactive {\n opacity: 0.5;\n\n .account__header__image,\n .account__avatar {\n filter: grayscale(100%);\n }\n }\n\n &__info {\n position: absolute;\n top: 10px;\n left: 10px;\n }\n\n &__image {\n overflow: hidden;\n height: 145px;\n position: relative;\n background: darken($ui-base-color, 4%);\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n }\n }\n\n &__bar {\n position: relative;\n background: lighten($ui-base-color, 4%);\n padding: 5px;\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n\n .avatar {\n display: block;\n flex: 0 0 auto;\n width: 94px;\n margin-left: -2px;\n\n .account__avatar {\n background: darken($ui-base-color, 8%);\n border: 2px solid lighten($ui-base-color, 4%);\n }\n }\n }\n\n &__tabs {\n display: flex;\n align-items: flex-start;\n padding: 7px 5px;\n margin-top: -55px;\n\n &__buttons {\n display: flex;\n align-items: center;\n padding-top: 55px;\n overflow: hidden;\n\n .icon-button {\n border: 1px solid lighten($ui-base-color, 12%);\n border-radius: 4px;\n box-sizing: content-box;\n padding: 2px;\n }\n\n .button {\n margin: 0 8px;\n }\n }\n\n &__name {\n padding: 5px;\n\n .account-role {\n vertical-align: top;\n }\n\n .emojione {\n width: 22px;\n height: 22px;\n }\n\n h1 {\n font-size: 16px;\n line-height: 24px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n\n small {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n .spacer {\n flex: 1 1 auto;\n }\n }\n\n &__bio {\n overflow: hidden;\n margin: 0 -5px;\n\n .account__header__content {\n padding: 20px 15px;\n padding-bottom: 5px;\n color: $primary-text-color;\n }\n\n .account__header__fields {\n margin: 0;\n border-top: 1px solid lighten($ui-base-color, 12%);\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n }\n\n &__extra {\n margin-top: 4px;\n\n &__links {\n font-size: 14px;\n color: $darker-text-color;\n padding: 10px 0;\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n padding: 5px 10px;\n font-weight: 500;\n\n strong {\n font-weight: 700;\n color: $primary-text-color;\n }\n }\n }\n }\n}\n\n.trends {\n &__header {\n color: $dark-text-color;\n background: lighten($ui-base-color, 2%);\n border-bottom: 1px solid darken($ui-base-color, 4%);\n font-weight: 500;\n padding: 15px;\n font-size: 16px;\n cursor: default;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n &__item {\n display: flex;\n align-items: center;\n padding: 15px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &:last-child {\n border-bottom: 0;\n }\n\n &__name {\n flex: 1 1 auto;\n color: $dark-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n strong {\n font-weight: 500;\n }\n\n a {\n color: $darker-text-color;\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:hover,\n &:focus,\n &:active {\n span {\n text-decoration: underline;\n }\n }\n }\n }\n\n &__current {\n flex: 0 0 auto;\n font-size: 24px;\n line-height: 36px;\n font-weight: 500;\n text-align: right;\n padding-right: 15px;\n margin-left: 5px;\n color: $secondary-text-color;\n }\n\n &__sparkline {\n flex: 0 0 auto;\n width: 50px;\n\n path:first-child {\n fill: rgba($highlight-text-color, 0.25) !important;\n fill-opacity: 1 !important;\n }\n\n path:last-child {\n stroke: lighten($highlight-text-color, 6%) !important;\n }\n }\n }\n}\n\n.conversation {\n display: flex;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n padding: 5px;\n padding-bottom: 0;\n\n &:focus {\n background: lighten($ui-base-color, 2%);\n outline: 0;\n }\n\n &__avatar {\n flex: 0 0 auto;\n padding: 10px;\n padding-top: 12px;\n position: relative;\n }\n\n &__unread {\n display: inline-block;\n background: $highlight-text-color;\n border-radius: 50%;\n width: 0.625rem;\n height: 0.625rem;\n margin: -.1ex .15em .1ex;\n }\n\n &__content {\n flex: 1 1 auto;\n padding: 10px 5px;\n padding-right: 15px;\n overflow: hidden;\n\n &__info {\n overflow: hidden;\n display: flex;\n flex-direction: row-reverse;\n justify-content: space-between;\n }\n\n &__relative-time {\n font-size: 15px;\n color: $darker-text-color;\n padding-left: 15px;\n }\n\n &__names {\n color: $darker-text-color;\n font-size: 15px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-bottom: 4px;\n flex-basis: 90px;\n flex-grow: 1;\n\n a {\n color: $primary-text-color;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n }\n\n a {\n word-break: break-word;\n }\n }\n\n &--unread {\n background: lighten($ui-base-color, 2%);\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n .conversation__content__info {\n font-weight: 700;\n }\n\n .conversation__content__relative-time {\n color: $primary-text-color;\n }\n }\n}\n",null,"@mixin avatar-radius {\n border-radius: 4px;\n background: transparent no-repeat;\n background-position: 50%;\n background-clip: padding-box;\n}\n\n@mixin avatar-size($size: 48px) {\n width: $size;\n height: $size;\n background-size: $size $size;\n}\n\n@mixin search-input {\n outline: 0;\n box-sizing: border-box;\n width: 100%;\n border: 0;\n box-shadow: none;\n font-family: inherit;\n background: $ui-base-color;\n color: $darker-text-color;\n font-size: 14px;\n margin: 0;\n}\n\n@mixin search-popout {\n background: $simple-background-color;\n border-radius: 4px;\n padding: 10px 14px;\n padding-bottom: 14px;\n margin-top: 10px;\n color: $light-text-color;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n\n h4 {\n color: $light-text-color;\n font-size: 14px;\n font-weight: 500;\n margin-bottom: 10px;\n }\n\n li {\n padding: 4px 0;\n }\n\n ul {\n margin-bottom: 10px;\n }\n\n em {\n font-weight: 500;\n color: $inverted-text-color;\n }\n}\n",".poll {\n margin-top: 16px;\n font-size: 14px;\n\n li {\n margin-bottom: 10px;\n position: relative;\n }\n\n &__chart {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n display: inline-block;\n border-radius: 4px;\n background: darken($ui-primary-color, 14%);\n\n &.leading {\n background: $ui-highlight-color;\n }\n }\n\n &__text {\n position: relative;\n display: flex;\n padding: 6px 0;\n line-height: 18px;\n cursor: default;\n overflow: hidden;\n\n input[type=radio],\n input[type=checkbox] {\n display: none;\n }\n\n .autossugest-input {\n flex: 1 1 auto;\n }\n\n input[type=text] {\n display: block;\n box-sizing: border-box;\n width: 100%;\n font-size: 14px;\n color: $inverted-text-color;\n outline: 0;\n font-family: inherit;\n background: $simple-background-color;\n border: 1px solid darken($simple-background-color, 14%);\n border-radius: 4px;\n padding: 6px 10px;\n\n &:focus {\n border-color: $highlight-text-color;\n }\n }\n\n &.selectable {\n cursor: pointer;\n }\n\n &.editable {\n display: flex;\n align-items: center;\n overflow: visible;\n }\n }\n\n &__input {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 50%;\n vertical-align: middle;\n margin-top: auto;\n margin-bottom: auto;\n flex: 0 0 18px;\n\n &.checkbox {\n border-radius: 4px;\n }\n\n &.active {\n border-color: $valid-value-color;\n background: $valid-value-color;\n }\n\n &:active,\n &:focus,\n &:hover {\n border-width: 4px;\n background: none;\n }\n\n &::-moz-focus-inner {\n outline: 0 !important;\n border: 0;\n }\n\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n\n &__number {\n display: inline-block;\n width: 52px;\n font-weight: 700;\n padding: 0 10px;\n padding-left: 8px;\n text-align: right;\n margin-top: auto;\n margin-bottom: auto;\n flex: 0 0 52px;\n }\n\n &__vote__mark {\n float: left;\n line-height: 18px;\n }\n\n &__footer {\n padding-top: 6px;\n padding-bottom: 5px;\n color: $dark-text-color;\n }\n\n &__link {\n display: inline;\n background: transparent;\n padding: 0;\n margin: 0;\n border: 0;\n color: $dark-text-color;\n text-decoration: underline;\n font-size: inherit;\n\n &:hover {\n text-decoration: none;\n }\n\n &:active,\n &:focus {\n background-color: rgba($dark-text-color, .1);\n }\n }\n\n .button {\n height: 36px;\n padding: 0 16px;\n margin-right: 10px;\n font-size: 14px;\n }\n}\n\n.compose-form__poll-wrapper {\n border-top: 1px solid darken($simple-background-color, 8%);\n\n ul {\n padding: 10px;\n }\n\n .poll__footer {\n border-top: 1px solid darken($simple-background-color, 8%);\n padding: 10px;\n display: flex;\n align-items: center;\n\n button,\n select {\n flex: 1 1 50%;\n\n &:focus {\n border-color: $highlight-text-color;\n }\n }\n }\n\n .button.button-secondary {\n font-size: 14px;\n font-weight: 400;\n padding: 6px 10px;\n height: auto;\n line-height: inherit;\n color: $action-button-color;\n border-color: $action-button-color;\n margin-right: 5px;\n }\n\n li {\n display: flex;\n align-items: center;\n\n .poll__text {\n flex: 0 0 auto;\n width: calc(100% - (23px + 6px));\n margin-right: 6px;\n }\n }\n\n select {\n appearance: none;\n box-sizing: border-box;\n font-size: 14px;\n color: $inverted-text-color;\n display: inline-block;\n width: auto;\n outline: 0;\n font-family: inherit;\n background: $simple-background-color url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center / auto 16px;\n border: 1px solid darken($simple-background-color, 14%);\n border-radius: 4px;\n padding: 6px 10px;\n padding-right: 30px;\n }\n\n .icon-button.disabled {\n color: darken($simple-background-color, 14%);\n }\n}\n\n.muted .poll {\n color: $dark-text-color;\n\n &__chart {\n background: rgba(darken($ui-primary-color, 14%), 0.2);\n\n &.leading {\n background: rgba($ui-highlight-color, 0.2);\n }\n }\n}\n",".modal-layout {\n background: $ui-base-color url('data:image/svg+xml;utf8,') repeat-x bottom fixed;\n display: flex;\n flex-direction: column;\n height: 100vh;\n padding: 0;\n}\n\n.modal-layout__mastodon {\n display: flex;\n flex: 1;\n flex-direction: column;\n justify-content: flex-end;\n\n > * {\n flex: 1;\n max-height: 235px;\n }\n}\n\n@media screen and (max-width: 600px) {\n .account-header {\n margin-top: 0;\n }\n}\n",".emoji-mart {\n font-size: 13px;\n display: inline-block;\n color: $inverted-text-color;\n\n &,\n * {\n box-sizing: border-box;\n line-height: 1.15;\n }\n\n .emoji-mart-emoji {\n padding: 6px;\n }\n}\n\n.emoji-mart-bar {\n border: 0 solid darken($ui-secondary-color, 8%);\n\n &:first-child {\n border-bottom-width: 1px;\n border-top-left-radius: 5px;\n border-top-right-radius: 5px;\n background: $ui-secondary-color;\n }\n\n &:last-child {\n border-top-width: 1px;\n border-bottom-left-radius: 5px;\n border-bottom-right-radius: 5px;\n display: none;\n }\n}\n\n.emoji-mart-anchors {\n display: flex;\n justify-content: space-between;\n padding: 0 6px;\n color: $lighter-text-color;\n line-height: 0;\n}\n\n.emoji-mart-anchor {\n position: relative;\n flex: 1;\n text-align: center;\n padding: 12px 4px;\n overflow: hidden;\n transition: color .1s ease-out;\n cursor: pointer;\n\n &:hover {\n color: darken($lighter-text-color, 4%);\n }\n}\n\n.emoji-mart-anchor-selected {\n color: $highlight-text-color;\n\n &:hover {\n color: darken($highlight-text-color, 4%);\n }\n\n .emoji-mart-anchor-bar {\n bottom: -1px;\n }\n}\n\n.emoji-mart-anchor-bar {\n position: absolute;\n bottom: -5px;\n left: 0;\n width: 100%;\n height: 4px;\n background-color: $highlight-text-color;\n}\n\n.emoji-mart-anchors {\n i {\n display: inline-block;\n width: 100%;\n max-width: 22px;\n }\n\n svg {\n fill: currentColor;\n max-height: 18px;\n }\n}\n\n.emoji-mart-scroll {\n overflow-y: scroll;\n height: 270px;\n max-height: 35vh;\n padding: 0 6px 6px;\n background: $simple-background-color;\n will-change: transform;\n\n &::-webkit-scrollbar-track:hover,\n &::-webkit-scrollbar-track:active {\n background-color: rgba($base-overlay-background, 0.3);\n }\n}\n\n.emoji-mart-search {\n padding: 10px;\n padding-right: 45px;\n background: $simple-background-color;\n\n input {\n font-size: 14px;\n font-weight: 400;\n padding: 7px 9px;\n font-family: inherit;\n display: block;\n width: 100%;\n background: rgba($ui-secondary-color, 0.3);\n color: $inverted-text-color;\n border: 1px solid $ui-secondary-color;\n border-radius: 4px;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n}\n\n.emoji-mart-category .emoji-mart-emoji {\n cursor: pointer;\n\n span {\n z-index: 1;\n position: relative;\n text-align: center;\n }\n\n &:hover::before {\n z-index: 0;\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba($ui-secondary-color, 0.7);\n border-radius: 100%;\n }\n}\n\n.emoji-mart-category-label {\n z-index: 2;\n position: relative;\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n\n span {\n display: block;\n width: 100%;\n font-weight: 500;\n padding: 5px 6px;\n background: $simple-background-color;\n }\n}\n\n.emoji-mart-emoji {\n position: relative;\n display: inline-block;\n font-size: 0;\n\n span {\n width: 22px;\n height: 22px;\n }\n}\n\n.emoji-mart-no-results {\n font-size: 14px;\n text-align: center;\n padding-top: 70px;\n color: $light-text-color;\n\n .emoji-mart-category-label {\n display: none;\n }\n\n .emoji-mart-no-results-label {\n margin-top: .2em;\n }\n\n .emoji-mart-emoji:hover::before {\n content: none;\n }\n}\n\n.emoji-mart-preview {\n display: none;\n}\n","$maximum-width: 1235px;\n$fluid-breakpoint: $maximum-width + 20px;\n$column-breakpoint: 700px;\n$small-breakpoint: 960px;\n\n.container {\n box-sizing: border-box;\n max-width: $maximum-width;\n margin: 0 auto;\n position: relative;\n\n @media screen and (max-width: $fluid-breakpoint) {\n width: 100%;\n padding: 0 10px;\n }\n}\n\n.rich-formatting {\n font-family: $font-sans-serif, sans-serif;\n font-size: 14px;\n font-weight: 400;\n line-height: 1.7;\n word-wrap: break-word;\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n p,\n li {\n color: $darker-text-color;\n }\n\n p {\n margin-top: 0;\n margin-bottom: .85em;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n strong {\n font-weight: 700;\n color: $secondary-text-color;\n }\n\n em {\n font-style: italic;\n color: $secondary-text-color;\n }\n\n code {\n font-size: 0.85em;\n background: darken($ui-base-color, 8%);\n border-radius: 4px;\n padding: 0.2em 0.3em;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n font-family: $font-display, sans-serif;\n margin-top: 1.275em;\n margin-bottom: .85em;\n font-weight: 500;\n color: $secondary-text-color;\n }\n\n h1 {\n font-size: 2em;\n }\n\n h2 {\n font-size: 1.75em;\n }\n\n h3 {\n font-size: 1.5em;\n }\n\n h4 {\n font-size: 1.25em;\n }\n\n h5,\n h6 {\n font-size: 1em;\n }\n\n ul {\n list-style: disc;\n }\n\n ol {\n list-style: decimal;\n }\n\n ul,\n ol {\n margin: 0;\n padding: 0;\n padding-left: 2em;\n margin-bottom: 0.85em;\n\n &[type='a'] {\n list-style-type: lower-alpha;\n }\n\n &[type='i'] {\n list-style-type: lower-roman;\n }\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n margin: 1.7em 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n\n table {\n width: 100%;\n border-collapse: collapse;\n break-inside: auto;\n margin-top: 24px;\n margin-bottom: 32px;\n\n thead tr,\n tbody tr {\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n font-size: 1em;\n line-height: 1.625;\n font-weight: 400;\n text-align: left;\n color: $darker-text-color;\n }\n\n thead tr {\n border-bottom-width: 2px;\n line-height: 1.5;\n font-weight: 500;\n color: $dark-text-color;\n }\n\n th,\n td {\n padding: 8px;\n align-self: start;\n align-items: start;\n word-break: break-all;\n\n &.nowrap {\n width: 25%;\n position: relative;\n\n &::before {\n content: ' ';\n visibility: hidden;\n }\n\n span {\n position: absolute;\n left: 8px;\n right: 8px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n }\n\n & > :first-child {\n margin-top: 0;\n }\n}\n\n.information-board {\n background: darken($ui-base-color, 4%);\n padding: 20px 0;\n\n .container-alt {\n position: relative;\n padding-right: 280px + 15px;\n }\n\n &__sections {\n display: flex;\n justify-content: space-between;\n flex-wrap: wrap;\n }\n\n &__section {\n flex: 1 0 0;\n font-family: $font-sans-serif, sans-serif;\n font-size: 16px;\n line-height: 28px;\n color: $primary-text-color;\n text-align: right;\n padding: 10px 15px;\n\n span,\n strong {\n display: block;\n }\n\n span {\n &:last-child {\n color: $secondary-text-color;\n }\n }\n\n strong {\n font-family: $font-display, sans-serif;\n font-weight: 500;\n font-size: 32px;\n line-height: 48px;\n }\n\n @media screen and (max-width: $column-breakpoint) {\n text-align: center;\n }\n }\n\n .panel {\n position: absolute;\n width: 280px;\n box-sizing: border-box;\n background: darken($ui-base-color, 8%);\n padding: 20px;\n padding-top: 10px;\n border-radius: 4px 4px 0 0;\n right: 0;\n bottom: -40px;\n\n .panel-header {\n font-family: $font-display, sans-serif;\n font-size: 14px;\n line-height: 24px;\n font-weight: 500;\n color: $darker-text-color;\n padding-bottom: 5px;\n margin-bottom: 15px;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n\n a,\n span {\n font-weight: 400;\n color: darken($darker-text-color, 10%);\n }\n\n a {\n text-decoration: none;\n }\n }\n }\n\n .owner {\n text-align: center;\n\n .avatar {\n width: 80px;\n height: 80px;\n margin: 0 auto;\n margin-bottom: 15px;\n\n img {\n display: block;\n width: 80px;\n height: 80px;\n border-radius: 48px;\n }\n }\n\n .name {\n font-size: 14px;\n\n a {\n display: block;\n color: $primary-text-color;\n text-decoration: none;\n\n &:hover {\n .display_name {\n text-decoration: underline;\n }\n }\n }\n\n .username {\n display: block;\n color: $darker-text-color;\n }\n }\n }\n}\n\n.landing-page {\n p,\n li {\n font-family: $font-sans-serif, sans-serif;\n font-size: 16px;\n font-weight: 400;\n font-size: 16px;\n line-height: 30px;\n margin-bottom: 12px;\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n }\n }\n\n em {\n display: inline;\n margin: 0;\n padding: 0;\n font-weight: 700;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n color: lighten($darker-text-color, 10%);\n }\n\n h1 {\n font-family: $font-display, sans-serif;\n font-size: 26px;\n line-height: 30px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n\n small {\n font-family: $font-sans-serif, sans-serif;\n display: block;\n font-size: 18px;\n font-weight: 400;\n color: lighten($darker-text-color, 10%);\n }\n }\n\n h2 {\n font-family: $font-display, sans-serif;\n font-size: 22px;\n line-height: 26px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h3 {\n font-family: $font-display, sans-serif;\n font-size: 18px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h4 {\n font-family: $font-display, sans-serif;\n font-size: 16px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h5 {\n font-family: $font-display, sans-serif;\n font-size: 14px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h6 {\n font-family: $font-display, sans-serif;\n font-size: 12px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n ul,\n ol {\n margin-left: 20px;\n\n &[type='a'] {\n list-style-type: lower-alpha;\n }\n\n &[type='i'] {\n list-style-type: lower-roman;\n }\n }\n\n ul {\n list-style: disc;\n }\n\n ol {\n list-style: decimal;\n }\n\n li > ol,\n li > ul {\n margin-top: 6px;\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid rgba($ui-base-lighter-color, .6);\n margin: 20px 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n\n &__information,\n &__forms {\n padding: 20px;\n }\n\n &__call-to-action {\n background: $ui-base-color;\n border-radius: 4px;\n padding: 25px 40px;\n overflow: hidden;\n box-sizing: border-box;\n\n .row {\n width: 100%;\n display: flex;\n flex-direction: row-reverse;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n }\n\n .row__information-board {\n display: flex;\n justify-content: flex-end;\n align-items: flex-end;\n\n .information-board__section {\n flex: 1 0 auto;\n padding: 0 10px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n width: 100%;\n justify-content: space-between;\n }\n }\n\n .row__mascot {\n flex: 1;\n margin: 10px -50px 0 0;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n }\n\n &__logo {\n margin-right: 20px;\n\n img {\n height: 50px;\n width: auto;\n mix-blend-mode: lighten;\n }\n }\n\n &__information {\n padding: 45px 40px;\n margin-bottom: 10px;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n strong {\n font-weight: 500;\n color: lighten($darker-text-color, 10%);\n }\n\n .account {\n border-bottom: 0;\n padding: 0;\n\n &__display-name {\n align-items: center;\n display: flex;\n margin-right: 5px;\n }\n\n div.account__display-name {\n &:hover {\n .display-name strong {\n text-decoration: none;\n }\n }\n\n .account__avatar {\n cursor: default;\n }\n }\n\n &__avatar-wrapper {\n margin-left: 0;\n flex: 0 0 auto;\n }\n\n &__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n\n .display-name {\n font-size: 15px;\n\n &__account {\n font-size: 14px;\n }\n }\n }\n\n @media screen and (max-width: $small-breakpoint) {\n .contact {\n margin-top: 30px;\n }\n }\n\n @media screen and (max-width: $column-breakpoint) {\n padding: 25px 20px;\n }\n }\n\n &__information,\n &__forms,\n #mastodon-timeline {\n box-sizing: border-box;\n background: $ui-base-color;\n border-radius: 4px;\n box-shadow: 0 0 6px rgba($black, 0.1);\n }\n\n &__mascot {\n height: 104px;\n position: relative;\n left: -40px;\n bottom: 25px;\n\n img {\n height: 190px;\n width: auto;\n }\n }\n\n &__short-description {\n .row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n margin-bottom: 40px;\n }\n\n @media screen and (max-width: $column-breakpoint) {\n .row {\n margin-bottom: 20px;\n }\n }\n\n p a {\n color: $secondary-text-color;\n }\n\n h1 {\n font-weight: 500;\n color: $primary-text-color;\n margin-bottom: 0;\n\n small {\n color: $darker-text-color;\n\n span {\n color: $secondary-text-color;\n }\n }\n }\n\n p:last-child {\n margin-bottom: 0;\n }\n }\n\n &__hero {\n margin-bottom: 10px;\n\n img {\n display: block;\n margin: 0;\n max-width: 100%;\n height: auto;\n border-radius: 4px;\n }\n }\n\n @media screen and (max-width: 840px) {\n .information-board {\n .container-alt {\n padding-right: 20px;\n }\n\n .panel {\n position: static;\n margin-top: 20px;\n width: 100%;\n border-radius: 4px;\n\n .panel-header {\n text-align: center;\n }\n }\n }\n }\n\n @media screen and (max-width: 675px) {\n .header-wrapper {\n padding-top: 0;\n\n &.compact {\n padding-bottom: 0;\n }\n\n &.compact .hero .heading {\n text-align: initial;\n }\n }\n\n .header .container-alt,\n .features .container-alt {\n display: block;\n }\n }\n\n .cta {\n margin: 20px;\n }\n}\n\n.landing {\n margin-bottom: 100px;\n\n @media screen and (max-width: 738px) {\n margin-bottom: 0;\n }\n\n &__brand {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 50px;\n\n svg {\n fill: $primary-text-color;\n height: 52px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding: 0;\n margin-bottom: 30px;\n }\n }\n\n .directory {\n margin-top: 30px;\n background: transparent;\n box-shadow: none;\n border-radius: 0;\n }\n\n .hero-widget {\n margin-top: 30px;\n margin-bottom: 0;\n\n h4 {\n padding: 10px;\n font-weight: 700;\n font-size: 14px;\n color: $darker-text-color;\n }\n\n &__text {\n border-radius: 0;\n padding-bottom: 0;\n }\n\n &__footer {\n background: $ui-base-color;\n padding: 10px;\n border-radius: 0 0 4px 4px;\n display: flex;\n\n &__column {\n flex: 1 1 50%;\n }\n }\n\n .account {\n padding: 10px 0;\n border-bottom: 0;\n\n .account__display-name {\n display: flex;\n align-items: center;\n }\n\n .account__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n }\n\n &__counter {\n padding: 10px;\n\n strong {\n font-family: $font-display, sans-serif;\n font-size: 15px;\n font-weight: 700;\n display: block;\n }\n\n span {\n font-size: 14px;\n color: $darker-text-color;\n }\n }\n }\n\n .simple_form .user_agreement .label_input > label {\n font-weight: 400;\n color: $darker-text-color;\n }\n\n .simple_form p.lead {\n color: $darker-text-color;\n font-size: 15px;\n line-height: 20px;\n font-weight: 400;\n margin-bottom: 25px;\n }\n\n &__grid {\n max-width: 960px;\n margin: 0 auto;\n display: grid;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n grid-gap: 30px;\n\n @media screen and (max-width: 738px) {\n grid-template-columns: minmax(0, 100%);\n grid-gap: 10px;\n\n &__column-login {\n grid-row: 1;\n display: flex;\n flex-direction: column;\n\n .box-widget {\n order: 2;\n flex: 0 0 auto;\n }\n\n .hero-widget {\n margin-top: 0;\n margin-bottom: 10px;\n order: 1;\n flex: 0 0 auto;\n }\n }\n\n &__column-registration {\n grid-row: 2;\n }\n\n .directory {\n margin-top: 10px;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n\n .hero-widget {\n display: block;\n margin-bottom: 0;\n box-shadow: none;\n\n &__img,\n &__img img,\n &__footer {\n border-radius: 0;\n }\n }\n\n .hero-widget,\n .box-widget,\n .directory__tag {\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n .directory {\n margin-top: 0;\n\n &__tag {\n margin-bottom: 0;\n\n & > a,\n & > div {\n border-radius: 0;\n box-shadow: none;\n }\n\n &:last-child {\n border-bottom: 0;\n }\n }\n }\n }\n }\n}\n\n.brand {\n position: relative;\n text-decoration: none;\n}\n\n.brand__tagline {\n display: block;\n position: absolute;\n bottom: -10px;\n left: 50px;\n width: 300px;\n color: $ui-primary-color;\n text-decoration: none;\n font-size: 14px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n position: static;\n width: auto;\n margin-top: 20px;\n color: $dark-text-color;\n }\n}\n\n",".table {\n width: 100%;\n max-width: 100%;\n border-spacing: 0;\n border-collapse: collapse;\n\n th,\n td {\n padding: 8px;\n line-height: 18px;\n vertical-align: top;\n border-top: 1px solid $ui-base-color;\n text-align: left;\n background: darken($ui-base-color, 4%);\n }\n\n & > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid $ui-base-color;\n border-top: 0;\n font-weight: 500;\n }\n\n & > tbody > tr > th {\n font-weight: 500;\n }\n\n & > tbody > tr:nth-child(odd) > td,\n & > tbody > tr:nth-child(odd) > th {\n background: $ui-base-color;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n &.inline-table {\n & > tbody > tr:nth-child(odd) {\n & > td,\n & > th {\n background: transparent;\n }\n }\n\n & > tbody > tr:first-child {\n & > td,\n & > th {\n border-top: 0;\n }\n }\n }\n\n &.batch-table {\n & > thead > tr > th {\n background: $ui-base-color;\n border-top: 1px solid darken($ui-base-color, 8%);\n border-bottom: 1px solid darken($ui-base-color, 8%);\n\n &:first-child {\n border-radius: 4px 0 0;\n border-left: 1px solid darken($ui-base-color, 8%);\n }\n\n &:last-child {\n border-radius: 0 4px 0 0;\n border-right: 1px solid darken($ui-base-color, 8%);\n }\n }\n }\n\n &--invites tbody td {\n vertical-align: middle;\n }\n}\n\n.table-wrapper {\n overflow: auto;\n margin-bottom: 20px;\n}\n\nsamp {\n font-family: $font-monospace, monospace;\n}\n\nbutton.table-action-link {\n background: transparent;\n border: 0;\n font: inherit;\n}\n\nbutton.table-action-link,\na.table-action-link {\n text-decoration: none;\n display: inline-block;\n margin-right: 5px;\n padding: 0 10px;\n color: $darker-text-color;\n font-weight: 500;\n\n &:hover {\n color: $primary-text-color;\n }\n\n i.fa {\n font-weight: 400;\n margin-right: 5px;\n }\n\n &:first-child {\n padding-left: 0;\n }\n}\n\n.batch-table {\n &__toolbar,\n &__row {\n display: flex;\n\n &__select {\n box-sizing: border-box;\n padding: 8px 16px;\n cursor: pointer;\n min-height: 100%;\n\n input {\n margin-top: 8px;\n }\n\n &--aligned {\n display: flex;\n align-items: center;\n\n input {\n margin-top: 0;\n }\n }\n }\n\n &__actions,\n &__content {\n padding: 8px 0;\n padding-right: 16px;\n flex: 1 1 auto;\n }\n }\n\n &__toolbar {\n border: 1px solid darken($ui-base-color, 8%);\n background: $ui-base-color;\n border-radius: 4px 0 0;\n height: 47px;\n align-items: center;\n\n &__actions {\n text-align: right;\n padding-right: 16px - 5px;\n }\n }\n\n &__form {\n padding: 16px;\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n background: $ui-base-color;\n\n .fields-row {\n padding-top: 0;\n margin-bottom: 0;\n }\n }\n\n &__row {\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n background: darken($ui-base-color, 4%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n .optional &:first-child {\n border-top: 1px solid darken($ui-base-color, 8%);\n }\n }\n\n &:hover {\n background: darken($ui-base-color, 2%);\n }\n\n &:nth-child(even) {\n background: $ui-base-color;\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n }\n\n &__content {\n padding-top: 12px;\n padding-bottom: 16px;\n\n &--unpadded {\n padding: 0;\n }\n\n &--with-image {\n display: flex;\n align-items: center;\n }\n\n &__image {\n flex: 0 0 auto;\n display: flex;\n justify-content: center;\n align-items: center;\n margin-right: 10px;\n\n .emojione {\n width: 32px;\n height: 32px;\n }\n }\n\n &__text {\n flex: 1 1 auto;\n }\n\n &__extra {\n flex: 0 0 auto;\n text-align: right;\n color: $darker-text-color;\n font-weight: 500;\n }\n }\n\n .directory__tag {\n margin: 0;\n width: 100%;\n\n a {\n background: transparent;\n border-radius: 0;\n }\n }\n }\n\n &.optional .batch-table__toolbar,\n &.optional .batch-table__row__select {\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n\n .status__content {\n padding-top: 0;\n\n summary {\n display: list-item;\n }\n\n strong {\n font-weight: 700;\n }\n }\n\n .nothing-here {\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n box-shadow: none;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 1px solid darken($ui-base-color, 8%);\n }\n }\n\n @media screen and (max-width: 870px) {\n .accounts-table tbody td.optional {\n display: none;\n }\n }\n}\n","$no-columns-breakpoint: 600px;\n$sidebar-width: 240px;\n$content-width: 840px;\n\n.admin-wrapper {\n display: flex;\n justify-content: center;\n width: 100%;\n min-height: 100vh;\n\n .sidebar-wrapper {\n min-height: 100vh;\n overflow: hidden;\n pointer-events: none;\n flex: 1 1 auto;\n\n &__inner {\n display: flex;\n justify-content: flex-end;\n background: $ui-base-color;\n height: 100%;\n }\n }\n\n .sidebar {\n width: $sidebar-width;\n padding: 0;\n pointer-events: auto;\n\n &__toggle {\n display: none;\n background: lighten($ui-base-color, 8%);\n height: 48px;\n\n &__logo {\n flex: 1 1 auto;\n\n a {\n display: inline-block;\n padding: 15px;\n }\n\n svg {\n fill: $primary-text-color;\n height: 20px;\n position: relative;\n bottom: -2px;\n }\n }\n\n &__icon {\n display: block;\n color: $darker-text-color;\n text-decoration: none;\n flex: 0 0 auto;\n font-size: 20px;\n padding: 15px;\n }\n\n a {\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 12%);\n }\n }\n }\n\n .logo {\n display: block;\n margin: 40px auto;\n width: 100px;\n height: 100px;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n & > a:first-child {\n display: none;\n }\n }\n\n ul {\n list-style: none;\n border-radius: 4px 0 0 4px;\n overflow: hidden;\n margin-bottom: 20px;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n margin-bottom: 0;\n }\n\n a {\n display: block;\n padding: 15px;\n color: $darker-text-color;\n text-decoration: none;\n transition: all 200ms linear;\n transition-property: color, background-color;\n border-radius: 4px 0 0 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n i.fa {\n margin-right: 5px;\n }\n\n &:hover {\n color: $primary-text-color;\n background-color: darken($ui-base-color, 5%);\n transition: all 100ms linear;\n transition-property: color, background-color;\n }\n\n &.selected {\n background: darken($ui-base-color, 2%);\n border-radius: 4px 0 0;\n }\n }\n\n ul {\n background: darken($ui-base-color, 4%);\n border-radius: 0 0 0 4px;\n margin: 0;\n\n a {\n border: 0;\n padding: 15px 35px;\n }\n }\n\n .simple-navigation-active-leaf a {\n color: $primary-text-color;\n background-color: $ui-highlight-color;\n border-bottom: 0;\n border-radius: 0;\n\n &:hover {\n background-color: lighten($ui-highlight-color, 5%);\n }\n }\n }\n\n & > ul > .simple-navigation-active-leaf a {\n border-radius: 4px 0 0 4px;\n }\n }\n\n .content-wrapper {\n box-sizing: border-box;\n width: 100%;\n max-width: $content-width;\n flex: 1 1 auto;\n }\n\n @media screen and (max-width: $content-width + $sidebar-width) {\n .sidebar-wrapper--empty {\n display: none;\n }\n\n .sidebar-wrapper {\n width: $sidebar-width;\n flex: 0 0 auto;\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n .sidebar-wrapper {\n width: 100%;\n }\n }\n\n .content {\n padding: 20px 15px;\n padding-top: 60px;\n padding-left: 25px;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n max-width: none;\n padding: 15px;\n padding-top: 30px;\n }\n\n &-heading {\n display: flex;\n\n padding-bottom: 40px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n margin: -15px -15px 40px 0;\n\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n\n & > * {\n margin-top: 15px;\n margin-right: 15px;\n }\n\n &-actions {\n display: inline-flex;\n\n & > :not(:first-child) {\n margin-left: 5px;\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n border-bottom: 0;\n padding-bottom: 0;\n }\n }\n\n h2 {\n color: $secondary-text-color;\n font-size: 24px;\n line-height: 28px;\n font-weight: 400;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n font-weight: 700;\n }\n }\n\n h3 {\n color: $secondary-text-color;\n font-size: 20px;\n line-height: 28px;\n font-weight: 400;\n margin-bottom: 30px;\n }\n\n h4 {\n font-size: 14px;\n font-weight: 700;\n color: $darker-text-color;\n padding-bottom: 8px;\n margin-bottom: 8px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n h6 {\n font-size: 16px;\n color: $secondary-text-color;\n line-height: 28px;\n font-weight: 500;\n }\n\n .fields-group h6 {\n color: $primary-text-color;\n font-weight: 500;\n }\n\n .directory__tag > a,\n .directory__tag > div {\n box-shadow: none;\n }\n\n .directory__tag .table-action-link .fa {\n color: inherit;\n }\n\n .directory__tag h4 {\n font-size: 18px;\n font-weight: 700;\n color: $primary-text-color;\n text-transform: none;\n padding-bottom: 0;\n margin-bottom: 0;\n border-bottom: 0;\n }\n\n & > p {\n font-size: 14px;\n line-height: 21px;\n color: $secondary-text-color;\n margin-bottom: 20px;\n\n strong {\n color: $primary-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid rgba($ui-base-lighter-color, .6);\n margin: 20px 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n\n .sidebar-wrapper {\n min-height: 0;\n }\n\n .sidebar {\n width: 100%;\n padding: 0;\n height: auto;\n\n &__toggle {\n display: flex;\n }\n\n & > ul {\n display: none;\n }\n\n ul a,\n ul ul a {\n border-radius: 0;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n transition: none;\n\n &:hover {\n transition: none;\n }\n }\n\n ul ul {\n border-radius: 0;\n }\n\n ul .simple-navigation-active-leaf a {\n border-bottom-color: $ui-highlight-color;\n }\n }\n }\n}\n\nhr.spacer {\n width: 100%;\n border: 0;\n margin: 20px 0;\n height: 1px;\n}\n\nbody,\n.admin-wrapper .content {\n .muted-hint {\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n }\n }\n\n .positive-hint {\n color: $valid-value-color;\n font-weight: 500;\n }\n\n .negative-hint {\n color: $error-value-color;\n font-weight: 500;\n }\n\n .neutral-hint {\n color: $dark-text-color;\n font-weight: 500;\n }\n\n .warning-hint {\n color: $gold-star;\n font-weight: 500;\n }\n}\n\n.filters {\n display: flex;\n flex-wrap: wrap;\n\n .filter-subset {\n flex: 0 0 auto;\n margin: 0 40px 20px 0;\n\n &:last-child {\n margin-bottom: 30px;\n }\n\n ul {\n margin-top: 5px;\n list-style: none;\n\n li {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n strong {\n font-weight: 500;\n font-size: 13px;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n font-size: 13px;\n font-weight: 500;\n border-bottom: 2px solid $ui-base-color;\n\n &:hover {\n color: $primary-text-color;\n border-bottom: 2px solid lighten($ui-base-color, 5%);\n }\n\n &.selected {\n color: $highlight-text-color;\n border-bottom: 2px solid $ui-highlight-color;\n }\n }\n }\n}\n\n.flavour-screen {\n display: block;\n margin: 10px auto;\n max-width: 100%;\n}\n\n.flavour-description {\n display: block;\n font-size: 16px;\n margin: 10px 0;\n\n & > p {\n margin: 10px 0;\n }\n}\n\n.flavour-screen {\n display: block;\n margin: 10px auto;\n max-width: 100%;\n}\n\n.flavour-description {\n display: block;\n font-size: 16px;\n margin: 10px 0;\n\n & > p {\n margin: 10px 0;\n }\n}\n\n.report-accounts {\n display: flex;\n flex-wrap: wrap;\n margin-bottom: 20px;\n}\n\n.report-accounts__item {\n display: flex;\n flex: 250px;\n flex-direction: column;\n margin: 0 5px;\n\n & > strong {\n display: block;\n margin: 0 0 10px -5px;\n font-weight: 500;\n font-size: 14px;\n line-height: 18px;\n color: $secondary-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n .account-card {\n flex: 1 1 auto;\n }\n}\n\n.report-status,\n.account-status {\n display: flex;\n margin-bottom: 10px;\n\n .activity-stream {\n flex: 2 0 0;\n margin-right: 20px;\n max-width: calc(100% - 60px);\n\n .entry {\n border-radius: 4px;\n }\n }\n}\n\n.report-status__actions,\n.account-status__actions {\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n\n .icon-button {\n font-size: 24px;\n width: 24px;\n text-align: center;\n margin-bottom: 10px;\n }\n}\n\n.simple_form.new_report_note,\n.simple_form.new_account_moderation_note {\n max-width: 100%;\n}\n\n.batch-form-box {\n display: flex;\n flex-wrap: wrap;\n margin-bottom: 5px;\n\n #form_status_batch_action {\n margin: 0 5px 5px 0;\n font-size: 14px;\n }\n\n input.button {\n margin: 0 5px 5px 0;\n }\n\n .media-spoiler-toggle-buttons {\n margin-left: auto;\n\n .button {\n overflow: visible;\n margin: 0 0 5px 5px;\n float: right;\n }\n }\n}\n\n.back-link {\n margin-bottom: 10px;\n font-size: 14px;\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.spacer {\n flex: 1 1 auto;\n}\n\n.log-entry {\n margin-bottom: 20px;\n line-height: 20px;\n\n &__header {\n display: flex;\n justify-content: flex-start;\n align-items: center;\n padding: 10px;\n background: $ui-base-color;\n color: $darker-text-color;\n border-radius: 4px 4px 0 0;\n font-size: 14px;\n position: relative;\n }\n\n &__avatar {\n margin-right: 10px;\n\n .avatar {\n display: block;\n margin: 0;\n border-radius: 50%;\n width: 40px;\n height: 40px;\n }\n }\n\n &__content {\n max-width: calc(100% - 90px);\n }\n\n &__title {\n word-wrap: break-word;\n }\n\n &__timestamp {\n color: $dark-text-color;\n }\n\n &__extras {\n background: lighten($ui-base-color, 6%);\n border-radius: 0 0 4px 4px;\n padding: 10px;\n color: $darker-text-color;\n font-family: $font-monospace, monospace;\n font-size: 12px;\n word-wrap: break-word;\n min-height: 20px;\n }\n\n &__icon {\n font-size: 28px;\n margin-right: 10px;\n color: $dark-text-color;\n }\n\n &__icon__overlay {\n position: absolute;\n top: 10px;\n right: 10px;\n width: 10px;\n height: 10px;\n border-radius: 50%;\n\n &.positive {\n background: $success-green;\n }\n\n &.negative {\n background: lighten($error-red, 12%);\n }\n\n &.neutral {\n background: $ui-highlight-color;\n }\n }\n\n a,\n .username,\n .target {\n color: $secondary-text-color;\n text-decoration: none;\n font-weight: 500;\n }\n\n .diff-old {\n color: lighten($error-red, 12%);\n }\n\n .diff-neutral {\n color: $secondary-text-color;\n }\n\n .diff-new {\n color: $success-green;\n }\n}\n\na.name-tag,\n.name-tag,\na.inline-name-tag,\n.inline-name-tag {\n text-decoration: none;\n color: $secondary-text-color;\n\n .username {\n font-weight: 500;\n }\n\n &.suspended {\n .username {\n text-decoration: line-through;\n color: lighten($error-red, 12%);\n }\n\n .avatar {\n filter: grayscale(100%);\n opacity: 0.8;\n }\n }\n}\n\na.name-tag,\n.name-tag {\n display: flex;\n align-items: center;\n\n .avatar {\n display: block;\n margin: 0;\n margin-right: 5px;\n border-radius: 50%;\n }\n\n &.suspended {\n .avatar {\n filter: grayscale(100%);\n opacity: 0.8;\n }\n }\n}\n\n.speech-bubble {\n margin-bottom: 20px;\n border-left: 4px solid $ui-highlight-color;\n\n &.positive {\n border-left-color: $success-green;\n }\n\n &.negative {\n border-left-color: lighten($error-red, 12%);\n }\n\n &.warning {\n border-left-color: $gold-star;\n }\n\n &__bubble {\n padding: 16px;\n padding-left: 14px;\n font-size: 15px;\n line-height: 20px;\n border-radius: 4px 4px 4px 0;\n position: relative;\n font-weight: 500;\n\n a {\n color: $darker-text-color;\n }\n }\n\n &__owner {\n padding: 8px;\n padding-left: 12px;\n }\n\n time {\n color: $dark-text-color;\n }\n}\n\n.report-card {\n background: $ui-base-color;\n border-radius: 4px;\n margin-bottom: 20px;\n\n &__profile {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 15px;\n\n .account {\n padding: 0;\n border: 0;\n\n &__avatar-wrapper {\n margin-left: 0;\n }\n }\n\n &__stats {\n flex: 0 0 auto;\n font-weight: 500;\n color: $darker-text-color;\n text-align: right;\n\n a {\n color: inherit;\n text-decoration: none;\n\n &:focus,\n &:hover,\n &:active {\n color: lighten($darker-text-color, 8%);\n }\n }\n\n .red {\n color: $error-value-color;\n }\n }\n }\n\n &__summary {\n &__item {\n display: flex;\n justify-content: flex-start;\n border-top: 1px solid darken($ui-base-color, 4%);\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n\n &__reported-by,\n &__assigned {\n padding: 15px;\n flex: 0 0 auto;\n box-sizing: border-box;\n width: 150px;\n color: $darker-text-color;\n\n &,\n .username {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n &__content {\n flex: 1 1 auto;\n max-width: calc(100% - 300px);\n\n &__icon {\n color: $dark-text-color;\n margin-right: 4px;\n font-weight: 500;\n }\n }\n\n &__content a {\n display: block;\n box-sizing: border-box;\n width: 100%;\n padding: 15px;\n text-decoration: none;\n color: $darker-text-color;\n }\n }\n }\n}\n\n.one-line {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.ellipsized-ip {\n display: inline-block;\n max-width: 120px;\n overflow: hidden;\n text-overflow: ellipsis;\n vertical-align: middle;\n}\n\n.admin-account-bio {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n margin-top: 20px;\n\n > div {\n box-sizing: border-box;\n padding: 0 5px;\n margin-bottom: 10px;\n flex: 1 0 50%;\n }\n\n .account__header__fields,\n .account__header__content {\n background: lighten($ui-base-color, 8%);\n border-radius: 4px;\n height: 100%;\n }\n\n .account__header__fields {\n margin: 0;\n border: 0;\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n\n .account__header__content {\n box-sizing: border-box;\n padding: 20px;\n color: $primary-text-color;\n }\n}\n\n.center-text {\n text-align: center;\n}\n",".dashboard__counters {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n margin-bottom: 20px;\n\n & > div {\n box-sizing: border-box;\n flex: 0 0 33.333%;\n padding: 0 5px;\n margin-bottom: 10px;\n\n & > div,\n & > a {\n padding: 20px;\n background: lighten($ui-base-color, 4%);\n border-radius: 4px;\n box-sizing: border-box;\n height: 100%;\n }\n\n & > a {\n text-decoration: none;\n color: inherit;\n display: block;\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 8%);\n }\n }\n }\n\n &__num,\n &__text {\n text-align: center;\n font-weight: 500;\n font-size: 24px;\n line-height: 21px;\n color: $primary-text-color;\n font-family: $font-display, sans-serif;\n margin-bottom: 20px;\n line-height: 30px;\n }\n\n &__text {\n font-size: 18px;\n }\n\n &__label {\n font-size: 14px;\n color: $darker-text-color;\n text-align: center;\n font-weight: 500;\n }\n}\n\n.dashboard__widgets {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n\n & > div {\n flex: 0 0 33.333%;\n margin-bottom: 20px;\n\n & > div {\n padding: 0 5px;\n }\n }\n\n a:not(.name-tag) {\n color: $ui-secondary-color;\n font-weight: 500;\n text-decoration: none;\n }\n}\n","body.rtl {\n direction: rtl;\n\n .column-header > button {\n text-align: right;\n padding-left: 0;\n padding-right: 15px;\n }\n\n .radio-button__input {\n margin-right: 0;\n margin-left: 10px;\n }\n\n .directory__card__bar .display-name {\n margin-left: 0;\n margin-right: 15px;\n }\n\n .display-name {\n text-align: right;\n }\n\n .notification__message {\n margin-left: 0;\n margin-right: 68px;\n }\n\n .drawer__inner__mastodon > img {\n transform: scaleX(-1);\n }\n\n .notification__favourite-icon-wrapper {\n left: auto;\n right: -26px;\n }\n\n .landing-page__logo {\n margin-right: 0;\n margin-left: 20px;\n }\n\n .landing-page .features-list .features-list__row .visual {\n margin-left: 0;\n margin-right: 15px;\n }\n\n .column-link__icon,\n .column-header__icon {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .compose-form .compose-form__buttons-wrapper .character-counter__wrapper {\n margin-right: 0;\n margin-left: 4px;\n }\n\n .navigation-bar__profile {\n margin-left: 0;\n margin-right: 8px;\n }\n\n .search__input {\n padding-right: 10px;\n padding-left: 30px;\n }\n\n .search__icon .fa {\n right: auto;\n left: 10px;\n }\n\n .columns-area {\n direction: rtl;\n }\n\n .column-header__buttons {\n left: 0;\n right: auto;\n margin-left: 0;\n margin-right: -15px;\n }\n\n .column-inline-form .icon-button {\n margin-left: 0;\n margin-right: 5px;\n }\n\n .column-header__links .text-btn {\n margin-left: 10px;\n margin-right: 0;\n }\n\n .account__avatar-wrapper {\n float: right;\n }\n\n .column-header__back-button {\n padding-left: 5px;\n padding-right: 0;\n }\n\n .column-header__setting-arrows {\n float: left;\n }\n\n .setting-toggle__label {\n margin-left: 0;\n margin-right: 8px;\n }\n\n .status__avatar {\n left: auto;\n right: 10px;\n }\n\n .status,\n .activity-stream .status.light {\n padding-left: 10px;\n padding-right: 68px;\n }\n\n .status__info .status__display-name,\n .activity-stream .status.light .status__display-name {\n padding-left: 25px;\n padding-right: 0;\n }\n\n .activity-stream .pre-header {\n padding-right: 68px;\n padding-left: 0;\n }\n\n .status__prepend {\n margin-left: 0;\n margin-right: 68px;\n }\n\n .status__prepend-icon-wrapper {\n left: auto;\n right: -26px;\n }\n\n .activity-stream .pre-header .pre-header__icon {\n left: auto;\n right: 42px;\n }\n\n .account__avatar-overlay-overlay {\n right: auto;\n left: 0;\n }\n\n .column-back-button--slim-button {\n right: auto;\n left: 0;\n }\n\n .status__relative-time,\n .activity-stream .status.light .status__header .status__meta {\n float: left;\n }\n\n .status__action-bar {\n &__counter {\n margin-right: 0;\n margin-left: 11px;\n\n .status__action-bar-button {\n margin-right: 0;\n margin-left: 4px;\n }\n }\n }\n\n .status__action-bar-button {\n float: right;\n margin-right: 0;\n margin-left: 18px;\n }\n\n .status__action-bar-dropdown {\n float: right;\n }\n\n .privacy-dropdown__dropdown {\n margin-left: 0;\n margin-right: 40px;\n }\n\n .privacy-dropdown__option__icon {\n margin-left: 10px;\n margin-right: 0;\n }\n\n .detailed-status__display-name .display-name {\n text-align: right;\n }\n\n .detailed-status__display-avatar {\n margin-right: 0;\n margin-left: 10px;\n float: right;\n }\n\n .detailed-status__favorites,\n .detailed-status__reblogs {\n margin-left: 0;\n margin-right: 6px;\n }\n\n .fa-ul {\n margin-left: 2.14285714em;\n }\n\n .fa-li {\n left: auto;\n right: -2.14285714em;\n }\n\n .admin-wrapper {\n direction: rtl;\n }\n\n .admin-wrapper .sidebar ul a i.fa,\n a.table-action-link i.fa {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .simple_form .check_boxes .checkbox label {\n padding-left: 0;\n padding-right: 25px;\n }\n\n .simple_form .input.with_label.boolean label.checkbox {\n padding-left: 25px;\n padding-right: 0;\n }\n\n .simple_form .check_boxes .checkbox input[type=\"checkbox\"],\n .simple_form .input.boolean input[type=\"checkbox\"] {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.radio_buttons .radio {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.radio_buttons .radio > label {\n padding-right: 28px;\n padding-left: 0;\n }\n\n .simple_form .input-with-append .input input {\n padding-left: 142px;\n padding-right: 0;\n }\n\n .simple_form .input.boolean label.checkbox {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.boolean .label_input,\n .simple_form .input.boolean .hint {\n padding-left: 0;\n padding-right: 28px;\n }\n\n .simple_form .label_input__append {\n right: auto;\n left: 3px;\n\n &::after {\n right: auto;\n left: 0;\n background-image: linear-gradient(to left, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));\n }\n }\n\n .simple_form select {\n background: darken($ui-base-color, 10%) url(\"data:image/svg+xml;utf8,\") no-repeat left 8px center / auto 16px;\n }\n\n .table th,\n .table td {\n text-align: right;\n }\n\n .filters .filter-subset {\n margin-right: 0;\n margin-left: 45px;\n }\n\n .landing-page .header-wrapper .mascot {\n right: 60px;\n left: auto;\n }\n\n .landing-page__call-to-action .row__information-board {\n direction: rtl;\n }\n\n .landing-page .header .hero .floats .float-1 {\n left: -120px;\n right: auto;\n }\n\n .landing-page .header .hero .floats .float-2 {\n left: 210px;\n right: auto;\n }\n\n .landing-page .header .hero .floats .float-3 {\n left: 110px;\n right: auto;\n }\n\n .landing-page .header .links .brand img {\n left: 0;\n }\n\n .landing-page .fa-external-link {\n padding-right: 5px;\n padding-left: 0 !important;\n }\n\n .landing-page .features #mastodon-timeline {\n margin-right: 0;\n margin-left: 30px;\n }\n\n @media screen and (min-width: 631px) {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n\n &:first-child {\n padding-left: 5px;\n padding-right: 10px;\n }\n }\n\n .columns-area > div {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n }\n }\n }\n\n .columns-area--mobile .column,\n .columns-area--mobile .drawer {\n padding-left: 0;\n padding-right: 0;\n }\n\n .public-layout {\n .header {\n .nav-button {\n margin-left: 8px;\n margin-right: 0;\n }\n }\n\n .public-account-header__tabs {\n margin-left: 0;\n margin-right: 20px;\n }\n }\n\n .landing-page__information {\n .account__display-name {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .account__avatar-wrapper {\n margin-left: 12px;\n margin-right: 0;\n }\n }\n\n .card__bar .display-name {\n margin-left: 0;\n margin-right: 15px;\n text-align: right;\n }\n\n .fa-chevron-left::before {\n content: \"\\F054\";\n }\n\n .fa-chevron-right::before {\n content: \"\\F053\";\n }\n\n .column-back-button__icon {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .column-header__setting-arrows .column-header__setting-btn:last-child {\n padding-left: 0;\n padding-right: 10px;\n }\n\n .simple_form .input.radio_buttons .radio > label input {\n left: auto;\n right: 0;\n }\n}\n","$black-emojis: '8ball' 'ant' 'back' 'black_circle' 'black_heart' 'black_large_square' 'black_medium_small_square' 'black_medium_square' 'black_nib' 'black_small_square' 'bomb' 'bowling' 'bust_in_silhouette' 'busts_in_silhouette' 'camera' 'camera_with_flash' 'clubs' 'copyright' 'curly_loop' 'currency_exchange' 'dark_sunglasses' 'eight_pointed_black_star' 'electric_plug' 'end' 'female-guard' 'film_projector' 'fried_egg' 'gorilla' 'guardsman' 'heavy_check_mark' 'heavy_division_sign' 'heavy_dollar_sign' 'heavy_minus_sign' 'heavy_multiplication_x' 'heavy_plus_sign' 'hocho' 'hole' 'joystick' 'kaaba' 'lower_left_ballpoint_pen' 'lower_left_fountain_pen' 'male-guard' 'microphone' 'mortar_board' 'movie_camera' 'musical_score' 'on' 'registered' 'soon' 'spades' 'speaking_head_in_silhouette' 'spider' 'telephone_receiver' 'tm' 'top' 'tophat' 'turkey' 'vhs' 'video_camera' 'video_game' 'water_buffalo' 'waving_black_flag' 'wavy_dash';\n\n%white-emoji-outline {\n filter: drop-shadow(1px 1px 0 $white) drop-shadow(-1px 1px 0 $white) drop-shadow(1px -1px 0 $white) drop-shadow(-1px -1px 0 $white);\n transform: scale(.71);\n}\n\n.emojione {\n @each $emoji in $black-emojis {\n &[title=':#{$emoji}:'] {\n @extend %white-emoji-outline;\n }\n }\n}\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///common.scss","webpack:///./app/javascript/styles/win95.scss","webpack:///./app/javascript/styles/mastodon/reset.scss","webpack:///./app/javascript/styles/mastodon/variables.scss","webpack:///./app/javascript/styles/mastodon/basics.scss","webpack:///./app/javascript/styles/mastodon/containers.scss","webpack:///./app/javascript/styles/mastodon/lists.scss","webpack:///./app/javascript/styles/mastodon/footer.scss","webpack:///./app/javascript/styles/mastodon/compact_header.scss","webpack:///./app/javascript/styles/mastodon/widgets.scss","webpack:///./app/javascript/styles/mastodon/forms.scss","webpack:///./app/javascript/styles/mastodon/accounts.scss","webpack:///./app/javascript/styles/mastodon/statuses.scss","webpack:///./app/javascript/styles/mastodon/boost.scss","webpack:///./app/javascript/styles/mastodon/components.scss","webpack:///","webpack:///./app/javascript/styles/mastodon/_mixins.scss","webpack:///./app/javascript/styles/mastodon/polls.scss","webpack:///./app/javascript/styles/mastodon/modal.scss","webpack:///./app/javascript/styles/mastodon/emoji_picker.scss","webpack:///./app/javascript/styles/mastodon/about.scss","webpack:///./app/javascript/styles/mastodon/tables.scss","webpack:///./app/javascript/styles/mastodon/admin.scss","webpack:///./app/javascript/styles/mastodon/dashboard.scss","webpack:///./app/javascript/styles/mastodon/rtl.scss","webpack:///./app/javascript/styles/mastodon/accessibility.scss"],"names":[],"mappings":"AAAA,WCwEA,wBACE,+DACA,4ZCrEF,QAaE,UACA,SACA,eACA,aACA,wBACA,+EAIF,aAEE,MAGF,aACE,OAGF,eACE,cAGF,WACE,qDAGF,UAEE,aACA,OAGF,wBACE,iBACA,MAGF,sCACE,qBAGF,UACE,YACA,2BAGF,kBACE,cACA,mBACA,iCAGF,kBACE,kCAGF,kBACE,2BAGF,aACE,gBACA,0BACA,CCtEW,iED6Eb,kBC7Ea,4BDiFb,sBACE,MErFF,iDACE,mBACA,CACA,gBACA,gBACA,WDXM,kCCaN,6BACA,8BACA,CADA,0BACA,CADA,qBACA,0CACA,wCACA,kBAEA,iKAYE,eAGF,SACE,oCAEA,WACE,iBACA,kBACA,uCAGF,iBACE,WACA,YACA,mCAGF,iBACE,cAIJ,kBD7CW,kBCiDX,iBACE,kBACA,0BAEA,iBACE,aAIJ,iBACE,YAGF,kBACE,SACA,iBACA,uBAEA,iBACE,WACA,YACA,gBACA,YAIJ,kBACE,UACA,YAGF,iBACE,kBACA,cD3EoB,mBAPX,WCqFT,YACA,UACA,aACA,uBACA,mBACA,oBAEA,qBACE,YACA,sCAGE,aACE,gBACA,WACA,YACA,kBACA,uBAIJ,cACE,iBACA,gBACA,QAMR,mBACE,eACA,cAEA,YACE,kDAKF,YAGE,WACA,mBACA,uBACA,oBACA,sBAGF,YACE,yEAKF,gBAEE,+EAKF,WAEE,sCAIJ,qBAEE,eACA,gBACA,gBACA,cACA,kBACA,8CAEA,eACE,0CAGF,mBACE,gEAEA,eACE,0CAIJ,aHlLoB,kKGqLlB,oBAGE,sDAIJ,aH9LgB,eGgMd,0DAEA,aHlMc,oDGuMhB,cACE,SACA,uBACA,cH1Mc,aG4Md,UACA,SACA,oBACA,eACA,UACA,4BACA,0BACA,gMAEA,oBAGE,kEAGF,aD9NY,gBCgOV,gBCnON,WACE,CACA,kBACA,qCAEA,eALF,UAMI,SACA,kBAIJ,sBACE,qCAEA,gBAHF,kBAII,qBAGF,YACE,uBACA,mBACA,wBAEA,SFrBI,YEuBF,kBACA,sBAGF,YACE,uBACA,mBACA,WF9BE,qBEgCF,UACA,kBACA,iBACA,6CACA,gBACA,eACA,mCAMJ,WACE,CACA,cACA,mBACA,sBACA,qCAEA,kCAPF,UAQI,aACA,aACA,kBAKN,WACE,CACA,YACA,eACA,iBACA,sBACA,CACA,gBACA,CACA,sBACA,qCAEA,gBAZF,UAaI,CACA,eACA,CACA,mBACA,0BAGF,UACE,YACA,iBACA,6BAEA,UACE,YACA,cACA,SACA,kBACA,uBAIJ,aACE,cF7EsB,wBE+EtB,iCAEA,aACE,gBACA,uBACA,gBACA,8BAIJ,aACE,eACA,iBACA,gBACA,SAIJ,YACE,cACA,8BACA,sBACA,mCACA,CADA,0BACA,mBAEA,eACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,eACE,WACA,qCAGF,QA3BF,UA4BI,qCACA,mBAEA,aACE,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,UAKN,YACE,cACA,8CACA,sBACA,mCACA,CADA,0BACA,mBAEA,eACE,WACA,mBAGF,eACE,WACA,mBAGF,aACE,WACA,mBAGF,eACE,WACA,mBAGF,aACE,WACA,uCAGF,eACE,wBAGF,kBACE,qCAGF,QAxCF,iDAyCI,uCAEA,YACE,aACA,mBACA,uBACA,iCAGF,UACE,uBACA,mBACA,sBAGF,YACE,sCAIJ,QA7DF,UA8DI,qCACA,mBAEA,aACE,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,mBAGF,aACE,WACA,sCAMJ,eADF,gBAEI,4BAGF,eACE,qCAEA,0BAHF,SAII,yBAIJ,kBACE,mCACA,kBACA,YACA,cACA,aACA,oBACA,uBACA,iBACA,gBACA,qCAEA,uBAZF,cAaI,WACA,MACA,OACA,SACA,gBACA,gBACA,YACA,6BAGF,cACE,eACA,kCAGF,YACE,oBACA,2BACA,iBACA,oCAGF,YACE,oBACA,uBACA,iBACA,mCAGF,YACE,oBACA,yBACA,iBACA,+BAGF,aACE,aACA,mCAEA,aACE,YACA,WACA,kBACA,YACA,UFxUA,qCE2UA,kCARF,WASI,+GAIJ,kBAGE,kCAIJ,YACE,mBACA,eACA,eACA,gBACA,qBACA,cF7UkB,mBE+UlB,kBACA,uHAEA,yBAGE,WFrWA,qCEyWF,0CACE,YACE,qCAKN,kBACE,CACA,oBACA,kBACA,6HAEA,oBAGE,mBACA,sBAON,YACE,cACA,0DACA,sBACA,mCACA,CADA,0BACA,gCAEA,UACE,cACA,gCAGF,UACE,cACA,qCAGF,qBAjBF,0BAkBI,WACA,gCAEA,YACE,kCAKN,iBACE,qCAEA,gCAHF,eAII,sCAKF,4BADF,eAEI,wCAIJ,eACE,mBACA,mCACA,gDAEA,UACE,qIAEA,8BAEE,CAFF,sBAEE,6DAGF,wBFtaoB,8CE2atB,yBACE,gBACA,aACA,kBACA,gBACA,oDAEA,UACE,cACA,kBACA,WACA,YACA,gDACA,MACA,OACA,kDAGF,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,0BACA,qCAGF,6CA3BF,YA4BI,gDAIJ,eACE,6JAEA,iBAEE,qCAEA,4JAJF,eAKI,sCAKN,sCA/DF,eAgEI,gBACA,oDAEA,YACE,+FAGF,eAEE,6CAIJ,iBACE,iBACA,aACA,2BACA,mDAEA,UACE,cACA,mBACA,kBACA,SACA,OACA,QACA,YACA,0BACA,WACA,oDAGF,aACE,YACA,aACA,kBACA,cACA,wDAEA,aACE,WACA,YACA,SACA,kBACA,yBACA,mBACA,qCAIJ,2CArCF,YAsCI,mBACA,0BACA,YACA,mDAEA,YACE,oDAGF,UACE,YACA,CACA,sBACA,wDAEA,QACE,kBACA,2DAGF,mDAXF,YAYI,sCAKN,2CAhEF,eAiEI,sCAGF,2CApEF,cAqEI,8CAIJ,aACE,iBACA,mDAEA,gBACE,mBACA,sDAEA,cACE,iBACA,WF1kBF,gBE4kBE,gBACA,mBACA,uBACA,6BACA,4DAEA,aACE,eACA,WFplBJ,gBEslBI,gBACA,uBACA,qCAKN,4CA7BF,gBA8BI,aACA,8BACA,mBACA,mDAEA,aACE,iBACA,sDAEA,cACE,iBACA,iBACA,4DAEA,aF5lBY,oDEmmBlB,YACE,2BACA,oBACA,YACA,qEAEA,YACE,mBACA,gBACA,qCAGF,oEACE,YACE,6DAIJ,eACE,sBACA,cACA,cFxnBc,aE0nBd,+BACA,eACA,kBACA,kBACA,8DAEA,aACE,uEAGF,cACE,kEAGF,aACE,WACA,kBACA,SACA,OACA,WACA,gCACA,WACA,wBACA,yEAIA,+BACE,UACA,kFAGF,2BFzpBc,wEE+pBd,SACE,wBACA,8DAIJ,oBACE,cACA,2EAGF,cACE,cACA,4EAGF,eACE,eACA,kBACA,WFnsBJ,6CEqsBI,2DAIJ,aACE,WACA,4DAGF,eACE,8CAKN,YACE,eACA,kEAEA,eACE,gBACA,uBACA,cACA,2FAEA,4BACE,yEAGF,YACE,qDAIJ,gBACE,eACA,cFztBgB,uDE4tBhB,oBACE,cF7tBc,qBE+tBd,aACA,gBACA,8DAEA,eACE,WFpvBJ,qCE0vBF,6CAtCF,aAuCI,UACA,4CAKN,yBACE,qCAEA,0CAHF,eAII,wCAIJ,eACE,oCAGF,kBACE,mCACA,kBACA,gBACA,mBACA,qCAEA,mCAPF,eAQI,gBACA,gBACA,8DAGF,QACE,aACA,+DAEA,aACE,sFAGF,uBACE,yEAGF,aFryBU,8DE2yBV,mBACA,WF7yBE,qFEizBJ,YAEE,eACA,cFpyBkB,2CEwyBpB,gBACE,iCAIJ,YACE,cACA,kDACA,qCAEA,gCALF,aAMI,+CAGF,cACE,iCAIJ,eACE,2BAGF,YACE,eACA,eACA,cACA,+BAEA,qBACE,cACA,YACA,cACA,mBACA,kBACA,qCAEA,8BARF,aASI,sCAGF,8BAZF,cAaI,sCAIJ,0BAvBF,QAwBI,6BACA,+BAEA,UACE,UACA,gBACA,gCACA,0CAEA,eACE,0CAGF,kBF32BK,+IE82BH,kBAGE,WC53BZ,eACE,aAEA,oBACE,aACA,iBAIJ,eACE,cACA,oBAEA,cACE,gBACA,mBACA,wBCfF,eACE,iBACA,oBACA,eACA,cACA,qCAEA,uBAPF,iBAQI,mBACA,+BAGF,YACE,cACA,0CACA,wCAEA,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,kBACA,6CAEA,aACE,wCAIJ,aACE,WACA,YACA,wCAGF,aACE,WACA,YACA,qCAGF,6BAxCF,iCAyCI,+EAEA,aAEE,wCAGF,UACE,wCAGF,aACE,+EAGF,aAEE,wCAGF,UACE,sCAIJ,uCACE,aACE,sCAIJ,4JACE,YAIE,4BAKN,wBACE,gBACA,kBACA,cJhFkB,6BImFlB,aACE,qBACA,6BAIJ,oBACE,cACA,wGAEA,yBAGE,mCAKF,aACE,YACA,WACA,cACA,aACA,0HAMA,YACE,oBClIR,cACE,iBACA,cLeoB,gBKbpB,mBACA,eACA,qBACA,qCAEA,mBATF,iBAUI,oBACA,uBAGF,aACE,qBACA,0BAGF,eACE,cLFoB,wBKMtB,oBACE,mBACA,kBACA,WACA,YACA,cC9BN,kBACE,mCACA,mBAEA,UACE,kBACA,gBACA,0BACA,gBNPI,uBMUJ,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,0BACA,oBAIJ,kBNVW,aMYT,0BACA,eACA,cNPoB,iBMSpB,qBACA,gBACA,8BAEA,UACE,YACA,gBACA,sBAGF,kBACE,iCAEA,eACE,uBAIJ,cACE,SACA,UACA,gBACA,uBACA,oBACA,kBACA,oBACA,cACA,sBAGF,aNtCsB,qBMwCpB,4BAEA,yBACE,qCAKN,aAnEF,YAoEI,uBAIJ,kBACE,oBACA,yBAEA,YACE,yBACA,gBACA,eACA,cN9DoB,+BMkEtB,cACE,0CAEA,eACE,sDAGF,YACE,mBACA,gDAGF,UACE,YACA,0BACA,oCAIJ,YACE,mBAKF,aN3FsB,aMgGxB,YACE,kBACA,mBNzGW,mCM2GX,qBAGF,YACE,kBACA,0BACA,kBACA,cN3GsB,mBM6GtB,iBAGF,eACE,eACA,cNlHsB,iBMoHtB,qBACA,gBACA,UACA,oBAEA,YACE,yBACA,gBACA,eACA,cN7HoB,0BMiItB,eACE,CACA,kBACA,mBAGF,oBACE,CACA,mBACA,cN1IoB,qBM4IpB,mBACA,gBACA,uBACA,0EAEA,yBAGE,uBAMJ,sBACA,kBACA,mBNnKW,mCMqKX,cN7JwB,gBM+JxB,mBACA,sDAEA,eAEE,CAII,qXADF,eACE,yBAKN,aACE,0BACA,CAMI,wLAGF,oBAGE,mIAEA,yBACE,gCAMR,kBACE,oCAEA,gBACE,cNzMkB,8DM+MpB,iBACE,eACA,4DAGF,eACE,qBACA,iEAEA,eACE,kBAMR,YACE,CACA,eNlPM,CMoPN,cACA,cNpOsB,mBMsOtB,+BANA,iBACA,CNlPM,kCMgQN,CATA,aAGF,kBACE,CAEA,iBACA,kBACA,cACA,iBAEA,UNjQM,eMmQJ,gBACA,gBACA,mBACA,gBAGF,cACE,cN1PoB,qCM8PtB,aArBF,YAsBI,mBACA,iBAEA,cACE,aAKN,kBN/Qa,kBMiRX,mCACA,iBAEA,qBACE,mBACA,uCAEA,YAEE,mBACA,8BACA,mBN5RO,kBM8RP,aACA,qBACA,cACA,mCACA,0EAIA,kBAGE,0BAIJ,kBRhTkB,eQkThB,8BAGF,UACE,eACA,oBAGF,aACE,eACA,gBACA,WNnUE,mBMqUF,gBACA,uBACA,wBAEA,aNzTkB,0BM6TlB,aACE,gBACA,eACA,eACA,cNjUgB,0IMuUlB,UNvVE,+BM+VJ,aACE,YACA,uDAGF,oBR9VkB,wCQkWlB,eACE,eAKN,YACE,yBACA,gCAEA,aACE,WACA,YACA,kBACA,kBACA,kBACA,mBACA,yBACA,4CAEA,SACE,6CAGF,SACE,6CAGF,SACE,iBAKN,UACE,0BAEA,SACE,SACA,wBAGF,eACE,0BAGF,iBACE,yBACA,cNxYoB,gBM0YpB,aACA,sCAEA,eACE,0BAIJ,cACE,sBACA,gCACA,wCAGF,eACE,wBAGF,WACE,kBACA,eACA,gBACA,WNhbI,8BMmbJ,aACE,cNpakB,gBMsalB,eACA,0BAIJ,SACE,iCACA,qCAGF,kCACE,YACE,sCAYJ,qIAPF,eAQI,gBACA,gBACA,iBAOJ,gBACE,qCAEA,eAHF,oBAII,uBAGF,sBACE,sCAEA,qBAHF,sBAII,sCAGF,qBAPF,UAQI,sCAGF,qBAXF,WAYI,kCAIJ,iBACE,qCAEA,gCAHF,4BAII,iEAIA,eACE,0DAGF,cACE,iBACA,oEAEA,UACE,YACA,gBACA,yFAGF,gBACE,SACA,mKAIJ,eAGE,gBAON,aNrgBsB,iCMogBxB,kBAKI,6BAEA,eACE,kBAIJ,cACE,iBACA,wCAMF,oBACE,gBACA,cRpiBkB,4JQuiBlB,yBAGE,oBAKN,kBACE,gBACA,eACA,kBACA,yBAEA,aACE,gBACA,aACA,CACA,kBACA,gBACA,uBACA,qBACA,WNnkBI,gCMqkBJ,4FAEA,yBAGE,oCAIJ,eACE,0BAGF,iBACE,gCACA,MCplBJ,+CACE,gBACA,iBAGF,eACE,aACA,cACA,qBAIA,kBACE,gBACA,4BAEA,QACE,0CAIA,kBACE,qDAEA,eACE,gDAIJ,iBACE,kBACA,sDAEA,iBACE,SACA,OACA,6BAKN,iBACE,gBACA,gDAEA,mBACE,eACA,gBACA,WPhDA,cOkDA,WACA,4EAGF,iBAEE,mDAGF,eACE,4CAGF,iBACE,QACA,OACA,qCAGF,aT/DgB,0BSiEd,gIAEA,oBAGE,0CAIJ,iBACE,CACA,iBACA,mBAKN,YACE,cACA,0BAEA,qBACE,cACA,UACA,cACA,oBAIJ,aPpFsB,sBOuFpB,aTjGkB,yBSqGlB,iBACE,kBACA,gBACA,uBAGF,eACE,iBACA,sBAIJ,kBACE,wBAGF,aACE,eACA,eACA,qBAGF,kBACE,cPlHoB,iCOqHpB,iBACE,eACA,iBACA,gBACA,gBACA,oBAIJ,kBACE,qBAGF,eACE,CAII,0JADF,eACE,sDAMJ,YACE,4DAEA,mBACE,eACA,WPlKA,gBOoKA,gBACA,cACA,wHAGF,aAEE,sDAIJ,cACE,kBACA,mDAKF,mBACE,eACA,WPxLE,cO0LF,kBACA,qBACA,gBACA,sCAGF,cACE,mCAGF,UACE,sCAIJ,cACE,4CAEA,mBACE,eACA,WP9ME,cOgNF,gBACA,gBACA,4CAGF,kBACE,yCAGF,cACE,CADF,cACE,kDAIJ,oBACE,WACA,OACA,6BAGF,oBACE,cACA,4BAGF,kBACE,8CAEA,eACE,0BAIJ,YACE,CACA,eACA,oBACA,iCAEA,cACE,kCAGF,qBACE,eACA,cACA,eACA,oCAEA,aACE,2CAGF,eACE,6GAIJ,eAEE,qCAGF,yBA9BF,aA+BI,gBACA,kCAEA,cACE,0JAGF,kBAGE,iDAKN,iBACE,oBACA,eACA,WPlSI,cOoSJ,WACA,2CAKE,mBACE,eACA,WP5SA,qBO8SA,WACA,kBACA,gBACA,kBACA,cACA,0DAGF,iBACE,OACA,QACA,SACA,kDAKN,cACE,aACA,yBACA,kBACA,sJAGF,qBAKE,eACA,WP5UI,cO8UJ,WACA,UACA,oBACA,gBACA,mBACA,sBACA,kBACA,aACA,6RAEA,aACE,CAHF,+OAEA,aACE,CAHF,mQAEA,aACE,CAHF,sNAEA,aACE,8LAGF,eACE,oVAGF,oBACE,iOAGF,oBPnWY,oLOuWZ,iBACE,4WAGF,oBTtWkB,mBSyWhB,6CAKF,aACE,gUAGF,oBAME,8CAGF,aACE,gBACA,cACA,eACA,8BAIJ,UACE,uBAGF,eACE,aACA,oCAEA,YACE,mBACA,qEAIJ,aAGE,WACA,SACA,kBACA,mBTvZkB,WENd,eOgaJ,oBACA,YACA,aACA,yBACA,qBACA,kBACA,sBACA,eACA,gBACA,UACA,mBACA,kBACA,sGAEA,cACE,uFAGF,qBACE,gLAGF,qBAEE,kHAGF,wBP3aoB,gGO+apB,kBP7bQ,kHOgcN,wBACE,sOAGF,wBAEE,qBAKN,uBACE,CADF,oBACE,CADF,eACE,sBACA,eACA,WPhdI,cOkdJ,WACA,UACA,oBACA,gBACA,wXACA,sBACA,kBACA,kBACA,mBACA,YACA,iBAGF,4BACE,oCAIA,iBACE,mCAGF,iBACE,UACA,QACA,CACA,qBACA,eACA,cT1eY,oBS4eZ,oBACA,eACA,gBACA,mBACA,gBACA,yCAEA,UACE,cACA,kBACA,MACA,QACA,WACA,UACA,8DACA,4BAKN,iBACE,0CAEA,wBACE,CADF,gBACE,qCAGF,iBACE,MACA,OACA,WACA,YACA,aACA,uBACA,mBACA,8BACA,kBACA,iBACA,gBACA,YACA,8CAEA,iBACE,6HAGE,UP9hBF,aOwiBR,aACE,CACA,kBACA,eACA,gBAGF,kBACE,cPhiBsB,kBOkiBtB,kBACA,mBACA,kBACA,uBAEA,qCACE,iCACA,cPxjBY,sBO4jBd,mCACE,+BACA,cP7jBQ,kBOikBV,oBACE,cPpjBoB,qBOsjBpB,wBAEA,UPxkBI,0BO0kBF,kBAIJ,kBACE,4BAGF,SACE,sBACA,cACA,WACA,SACA,aACA,gDACA,mBPhlBS,WATL,eO4lBJ,SACA,8CAEA,QACE,iHAGF,mBAGE,kCAGF,kBACE,uBAIJ,eACE,CAII,oKADF,eACE,0DAKN,eAzEF,eA0EI,eAIJ,eACE,kBACA,gBAEA,aPjnBsB,qBOmnBpB,sBAEA,yBACE,YAKN,eACE,mBACA,eACA,eAEA,oBACE,kBACA,cAGF,aT/oBoB,yBSipBlB,qBACA,gBACA,2DAEA,aAGE,8BAKN,kBAEE,cPrpBsB,oCOwpBtB,cACE,mBACA,kBACA,4CAGF,aP7pBwB,gBO+pBtB,CAII,mUADF,eACE,0DAKN,6BAtBF,eAuBI,cAIJ,YACE,eACA,uBACA,UAGF,aACE,gBPrsBM,YOusBN,qBACA,mCACA,qBACA,cAEA,aACE,SACA,iBAIJ,kBACE,cPlsBwB,WOosBxB,sBAEA,aACE,eACA,eAKF,kBACE,sBAEA,eACE,CAII,+JADF,eACE,4CASR,qBACE,8BACA,WPjvBI,qCOmvBJ,oCACA,kBACA,aACA,mBACA,gDAEA,UAEE,oLAEA,oBAGE,0DAIJ,eACE,cACA,kBACA,CAII,yYADF,eACE,kEAIJ,eACE,oBAMR,YACE,eACA,mBACA,4DAEA,aAEE,6BAIA,wBACA,cACA,sBAIJ,iBACE,cPxxBsB,0BO2xBtB,iBACE,oBAIJ,eACE,mBACA,uBAEA,cACE,WPrzBI,kBOuzBJ,mBACA,SACA,UACA,4BAGF,aACE,eAIJ,aP/zBc,0SOy0BZ,+CACE,aAIJ,kBACE,sBACA,kBACA,aACA,mBACA,kBACA,kBACA,QACA,mCACA,sBAEA,aACE,8BAGF,sBACE,SACA,aACA,eACA,gDACA,oBAGF,aACE,WACA,oBACA,gBACA,eACA,CACA,oBACA,WACA,iCACA,oBAGF,oBPn3Bc,gBOq3BZ,2BAEA,kBPv3BY,gBOy3BV,oBAKN,kBACE,6BAEA,wBACE,mBACA,eACA,aACA,4BAGF,kBACE,aACA,OACA,sBACA,cACA,cACA,gCAEA,iBACE,YACA,iBACA,kBACA,UACA,8BAGF,qBACE,qCAIJ,kBACE,gCAGF,wBACE,mCACA,kBACA,kBACA,kBACA,kBACA,sCAEA,wBACE,WACA,cACA,YACA,SACA,kBACA,MACA,UACA,yBAIJ,sBACE,aACA,mBACA,SC17BF,aACE,qBACA,cACA,mCACA,qCAEA,QANF,eAOI,8EAMA,kBACE,YAKN,YACE,kBACA,gBACA,0BACA,gBAEA,aACE,WACA,YACA,SACA,oBACA,CADA,8BACA,CADA,gBACA,0BACA,qCAGF,WAfF,YAgBI,sCAGF,WAnBF,YAoBI,aAIJ,iBACE,aACA,aACA,2BACA,mBACA,mBACA,0BACA,qCAEA,WATF,eAUI,qBAGF,aACE,WACA,YACA,gBACA,wBAEA,UACE,YACA,cACA,SACA,kBACA,mBACA,oBACA,CADA,8BACA,CADA,gBACA,0BAIJ,gBACE,gBACA,iCAEA,cACE,WR7EA,gBQ+EA,gBACA,uBACA,+BAGF,aACE,eACA,cRtEgB,gBQwEhB,gBACA,uBACA,aAMR,cACE,kBACA,gBACA,6GAEA,cAME,WR3GI,gBQ6GJ,qBACA,iBACA,qBACA,sBAGF,eRnHM,oBQqHJ,cR5GS,eQ8GT,cACA,kBAGF,cACE,uCAGF,wBAEE,cRhHsB,oBQoHxB,UACE,eACA,wBAEA,oBACE,iBACA,oBAIJ,WACE,gBACA,wBAEA,oBACE,gBACA,uBAIJ,cACE,cACA,qCAGF,YA9DF,iBA+DI,mBAEA,YACE,uCAGF,oBAEE,gBAKN,kBRnKa,mCQqKX,cR9JsB,eQgKtB,gBACA,kBACA,aACA,uBACA,mBACA,eACA,kBACA,aACA,gBACA,2BAEA,yBACE,yBAGF,qBACE,gBACA,yCAIJ,oBAEE,gBACA,eACA,kBACA,eACA,iBACA,gBACA,cR5LwB,sCQ8LxB,sCACA,6DAEA,aRjNc,sCQmNZ,kCACA,qDAGF,aACE,sCACA,kCACA,0BAIJ,eACE,UACA,wBACA,gBACA,CADA,YACA,CACA,iCACA,CADA,uBACA,CADA,kBACA,eACA,iBACA,6BAEA,YACE,gCACA,yDAGF,qBAEE,aACA,kBACA,gBACA,gBACA,mBACA,uBACA,6BAGF,eACE,YACA,cACA,cR3OsB,0BQ6OtB,6BAGF,aACE,cRlPoB,4BQsPtB,aVhQoB,qBUkQlB,qGAEA,yBAGE,oCAIJ,qCACE,iCACA,sCAEA,aRpRY,gBQsRV,0CAGF,aRzRY,wCQ8Rd,eACE,wCAIJ,UACE,0BAIA,aRzRsB,4BQ4RpB,aR3RsB,qBQ6RpB,qGAEA,yBAGE,iCAIJ,URvTI,gBQyTF,wBAIJ,eACE,kBChUJ,kCACE,kBACA,gBACA,mBACA,8BAEA,yBACE,qCAGF,iBAVF,eAWI,gBACA,gBACA,6BAGF,eACE,SACA,gBACA,gFAEA,yBAEE,sCAIJ,UACE,yBAGF,kBTpBW,6GSuBT,sBAGE,CAHF,cAGE,8IAIA,eAGE,0BACA,iJAKF,yBAGE,kLAIA,iBAGE,qCAKN,4GACE,yBAGE,uCAKN,kBACE,qBAIJ,WACE,eACA,mBXzEoB,WENd,oBSkFN,iBACA,YACA,iBACA,SACA,yBAEA,UACE,YACA,sBACA,iBACA,UT5FI,gFSgGN,kBAGE,qNAKA,kBTxFoB,4ISgGpB,kBT9GQ,qCSqHV,wBACE,YACE,0DAOJ,YACE,uCAGF,2BACE,gBACA,uDAEA,SACE,SACA,yDAGF,eACE,yDAGF,gBACE,iBACA,mFAGF,UACE,qMAGF,eAGE,iCC/JN,u+KACE,uCAEA,u+KACE,0CAIJ,u+KACE,WCTF,gCACE,4CACA,kBAGF,mBACE,sBACA,oBACA,gBACA,kBACA,cAGF,aACE,eACA,iBACA,cbRoB,SaUpB,uBACA,UACA,eACA,wCAEA,yBAEE,uBAGF,aXVsB,eWYpB,SAIJ,wBb1BsB,Ya4BpB,kBACA,sBACA,WXpCM,eWsCN,qBACA,oBACA,eACA,gBACA,YACA,iBACA,iBACA,gBACA,eACA,kBACA,kBACA,yBACA,qBACA,uBACA,2BACA,mBACA,WACA,4CAEA,wBAGE,4BACA,sBAGF,eACE,mFAEA,wBXjEQ,gBWqEN,mCAIJ,wBX3DsB,eW8DpB,2BAGF,QACE,wDAGF,mBAGE,yGAGF,cAIE,iBACA,YACA,oBACA,iBACA,4BAGF,aX7FW,mBAOW,qGW0FpB,wBAGE,8BAIJ,kBb7GgB,2GagHd,wBAGE,0BAIJ,aX3GsB,uBW6GpB,iBACA,yBACA,+FAEA,oBAGE,cACA,mCAGF,UACE,uBAIJ,aACE,WACA,kBAIJ,YACE,cACA,kBACA,cAGF,oBACE,CACA,abvJgB,SayJhB,kBACA,uBACA,eACA,2BACA,2CACA,2DAEA,aAGE,oCACA,4BACA,2CACA,oBAGF,kCACE,uBAGF,aACE,6BACA,eACA,qBAGF,abjLoB,gCaqLpB,QACE,uEAGF,mBAGE,uBAGF,abjMgB,sFaoMd,aAGE,oCACA,6BAGF,kCACE,gCAGF,aACE,6BACA,8BAGF,ablNkB,uCaqNhB,aACE,wBAKN,sBACE,0BACA,yBACA,kBACA,YACA,8BAEA,yBACE,mBbrOY,Qa4OhB,kBACA,uBACA,eACA,gBACA,eACA,cACA,iBACA,UACA,2BACA,2CACA,0EAEA,aAGE,oCACA,4BACA,2CACA,yBAGF,kCACE,4BAGF,aACE,6BACA,eACA,0BAGF,abzQoB,qCa6QpB,QACE,sFAGF,mBAGE,CAKF,0BADF,iBAUE,CATA,WAGF,WACE,cACA,qBACA,QACA,SAEA,+BAEA,kBAEE,mBACA,oBACA,kBACA,mBACA,iBAKF,WACE,eAIJ,YACE,iCAGE,mBACA,eAEA,gBACA,wCAEA,ab9TkB,sDakUlB,YACE,2CAGF,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,kDAEA,oBbnVgB,yDa0VpB,aXvVW,mBWyVT,mBXlVoB,oCWoVpB,iBACA,kBACA,eACA,gBACA,6CAEA,aXjWS,gBWmWP,CAII,kRADF,eACE,wCAKN,abjXc,gBamXZ,0BACA,yIAEA,oBAGE,sCAKN,iBACE,MACA,QACA,kDAGF,iBACE,mGAGF,iBAGE,WACA,8BAGF,QACE,wBACA,UACA,qDAEA,WACE,mBACA,UACA,mFAIJ,aAEE,sBACA,WACA,SACA,cX3ZS,gBATL,aWuaJ,oBACA,eACA,gBACA,SACA,UACA,yIAEA,ab1ac,Cawad,sHAEA,ab1ac,Cawad,8HAEA,ab1ac,Cawad,4GAEA,ab1ac,+Fa8ad,SACE,qCAGF,kFAvBF,cAwBI,sCAIJ,iBACE,+CAGF,gBACE,0BACA,iBACA,mBACA,YACA,qBACA,kEAEA,SACE,qCAGF,8CAZF,sBAaI,gBACA,2DAIJ,iBACE,SACA,kDAGF,qBACE,aACA,kBACA,SACA,WACA,WACA,sCACA,mBX5csB,0BW8ctB,cXtdS,eWwdT,YACA,6FAEA,aACE,wDAIJ,YACE,eACA,kBACA,yPAEA,kBAIE,wGAIJ,YAGE,mBACA,mBACA,2BACA,iBACA,eACA,oCAGF,6BACE,0CAEA,aACE,gBACA,uBACA,mBACA,2CAGF,eACE,0CAGF,aACE,iBACA,gBACA,uBACA,mBACA,8EAIJ,aAEE,iBACA,WACA,YACA,2DAGF,ab5hBgB,wCagiBhB,aX3hBW,oBW6hBT,eACA,gBXviBI,sEW0iBJ,eACE,uEAGF,YACE,mBACA,YACA,eACA,8DAGF,UACE,cACA,WACA,uEAEA,iFACE,aACA,uBACA,8BACA,UACA,4BACA,oFAEA,aACE,cXljBgB,eWojBhB,gBACA,aACA,oBACA,6QAEA,aAGE,8EAIJ,SACE,0EAIJ,iBACE,UACA,SACA,OACA,QACA,sBACA,gFACA,aACA,UACA,4BACA,mFAEA,sBACE,cXllBgB,SWolBhB,UACA,SACA,WACA,oBACA,eACA,gBACA,yFAEA,UX7mBF,8GWinBE,WACE,cXjmBc,CAjBlB,oGWinBE,WACE,cXjmBc,CAjBlB,wGWinBE,WACE,cXjmBc,CAjBlB,+FWinBE,WACE,cXjmBc,iFWsmBlB,SACE,wEAKN,iBACE,sBX/nBE,wBWioBF,sBACA,4BACA,aACA,WACA,gBACA,8CAIJ,YACE,mBACA,0BACA,aACA,8BACA,cACA,qEAEA,YACE,uGAEA,gBACE,qGAGF,YACE,6IAEA,aACE,2IAGF,gBACE,0HAKN,sBAEE,cACA,0EAGF,iBACE,iBACA,sCAIJ,YACE,yBACA,YACA,cACA,4EAEA,eACE,iBACA,oBAKN,cACE,kDACA,eACA,gBACA,cb9rBgB,4CaisBhB,aXlsBY,kCWusBd,2CACE,WC7sBF,8DDktBE,sBACA,CADA,kBACA,wBACA,WACA,YACA,eAEA,UACE,kBAIJ,iBACE,mBACA,mBX7sBsB,aW+sBtB,gBACA,gBACA,cACA,0BAGF,iBACE,gBACA,0BAGF,WACE,iBACA,gCAGF,aXtuBa,cWwuBX,eACA,iBACA,gBACA,mBACA,qBACA,kCAGF,UACE,iBACA,+BAGF,cACE,4CAGF,iBAEE,eACA,iBACA,qBACA,gBACA,gBACA,uBACA,gBACA,WX3wBM,wDW8wBN,SACE,wGAGF,kBACE,sJAEA,oBACE,gEAIJ,UACE,YACA,gBACA,oDAGF,cACE,iBACA,sBACA,CADA,gCACA,CADA,kBACA,gDAGF,kBACE,qBACA,sEAEA,eACE,gDAIJ,aXnyBc,qBWqyBZ,4DAEA,yBACE,oEAEA,aACE,4EAKF,oBACE,sFAEA,yBACE,wDAKN,abj0Bc,8Eas0BhB,aACE,0GAGF,kBb10BgB,sHa60Bd,kBACE,qBACA,8IAGF,QACE,0XAGF,mBAGE,0FAIJ,YACE,wJAEA,aACE,+BAKN,oBACE,gBACA,yCAEA,UACE,YACA,gBACA,iCAGF,kBACE,qBACA,4CAEA,eACE,iCAIJ,aX52BwB,qBW82BtB,uCAEA,yBACE,+CAIA,oBACE,oDAEA,yBACE,gDAKN,aACE,6CAKN,gBACE,oCAGF,aACE,eACA,iBACA,cACA,SACA,uBACA,CACA,eACA,qBACA,oFAEA,yBAEE,gCAIJ,oBACE,kBACA,uBACA,SACA,cXr6BW,gBWu6BX,eACA,cACA,yBACA,iBACA,eACA,sBACA,4BAGF,abr7BkB,Sau7BhB,kBACA,kBACA,oBACA,SACA,aACA,sBACA,WACA,WACA,gCACA,+BAGF,UACE,kBACA,kBAIA,SACE,mBACA,wCAEA,kBACE,8CAEA,sBACE,iFAIJ,kBAEE,SAMJ,yBACA,kBACA,gBACA,gCACA,eACA,UAaA,mCACA,CADA,0BACA,wDAZA,QARF,kBAWI,0BAGF,GACE,aACA,WALA,gBAGF,GACE,aACA,uDAMF,cAEE,kCAGF,kBACE,4BACA,sCAIA,aXj/BoB,qCWq/BpB,aX5/BS,6BWggCT,aXz/BoB,CAPX,kEWwgCT,aXxgCS,kCW2gCP,ab9gCgB,gEakhChB,UXxhCE,mBAgBgB,sEW4gChB,kBACE,+CAQR,sBACE,qEAEA,aACE,qDAKN,ab1iCkB,Ya6iChB,eACA,uBAGF,abjjCkB,qCaqjClB,aACE,eACA,mBACA,eAGF,cACE,mBAGF,+BACE,aACA,6CAEA,uBACE,OACA,gBACA,4DAEA,eACE,8DAGF,SACE,mBACA,qHAGF,cAEE,gBACA,4EAGF,cACE,0BAKN,kBACE,aACA,cACA,uBACA,aACA,kBAGF,gBACE,cbtmCgB,CawmChB,iBACA,eACA,kBACA,+CAEA,ab7mCgB,uBainChB,aACE,gBACA,uBACA,qBAIJ,kBACE,aACA,eACA,8BAEA,mBACE,kBACA,mBACA,yDAEA,gBACE,qCAGF,oBACE,WACA,eACA,gBACA,cb1oCY,4BagpClB,iBACE,8BAGF,cACE,cACA,uCAGF,aACE,aACA,mBACA,uBACA,kBACA,kBAGF,kBACE,kBACA,wBAEA,YACE,eACA,8BACA,uBACA,uFAEA,SAEE,mCAIJ,cACE,iBACA,6CAEA,UACE,YACA,gBACA,kEAGF,gBACE,gBACA,+DAIJ,cAEE,wBAIJ,eACE,cbxsCgB,ea0sChB,iBACA,8BAGF,kBACE,6BACA,gCACA,aACA,mBACA,eACA,wBAGF,aACE,qBACA,uDAGF,oBAEE,gBACA,eACA,gBACA,2BAGF,aX/tCa,eWiuCX,6BAEA,abxuCgB,Sa6uClB,YACE,gCACA,8BAEA,aACE,cACA,WXvvCI,qBWyvCJ,eACA,gBACA,kBAIJ,YACE,iBAGF,WACE,aACA,mBACA,UAGF,YACE,gCACA,kBAEA,SACE,gBACA,2CAEA,aACE,iCAIJ,aACE,cACA,cXxwCoB,gBW0wCpB,qBACA,eACA,mBAIJ,YACE,0BAGF,UACE,iBACA,kBACA,kBAGF,iBE3yCE,iCACA,wBACA,4BACA,kBF0yCA,yBAEA,oBACE,sBACA,iBACA,4BAGF,iBErzCA,iCACA,wBACA,4BACA,kBFozCE,gBACA,kBACA,gCAEA,UACE,kBACA,sBACA,mCAGF,aACE,kBACA,QACA,SACA,+BACA,WXr0CE,6BWu0CF,gBACA,eACA,oBAKN,cACE,0BAGF,UACuB,sCE30CrB,+BF60CA,iBEt1CA,iCACA,wBACA,4BACA,WFq1CuB,sCE/0CvB,kCFk1CA,iBE31CA,iCACA,wBACA,4BACA,WF01CuB,sCEp1CvB,kBFs1CE,SACA,QACA,UACA,wBAIJ,WACE,aACA,mBACA,sBAGF,YACE,6BACA,cbz2CgB,6Ba42ChB,eACE,CAII,kMADF,eACE,wBAKN,eACE,cACA,0BACA,yFAEA,oBAGE,sBAKN,4BACE,gCACA,iBACA,gBACA,cACA,aACA,+BAGF,YACE,4CAEA,qBACE,oFAIA,QACE,WACA,uDAGF,WACE,iBACA,gBACA,WACA,4BAKN,YACE,cACA,iBACA,kBACA,2BAGF,oBACE,gBACA,cACA,+BACA,eACA,oCACA,kCAEA,+BACE,gCAGF,aACE,yBACA,eACA,cX56CoB,kCWg7CtB,aACE,eACA,gBACA,WXn8CI,CWw8CA,2NADF,eACE,oBAMR,iBACE,mDAEA,aACE,mBACA,gBACA,4BAIJ,UACE,kBACA,6JAGF,oBAME,4DAKA,UXx+CM,kBW8+CN,UACE,iKAQF,yBACE,+BAIJ,aACE,gBACA,uBACA,0DAGF,aAEE,sCAGF,kBACE,gCAGF,aX1/C0B,cW4/CxB,iBACA,mBACA,gBACA,2EAEA,aAEE,uBACA,gBACA,uCAGF,cACE,WX1hDI,kCW+hDR,UACE,kBACA,iBAGF,WACE,UACA,kBACA,SACA,WACA,iBAGF,UACE,kBACA,OACA,MACA,YACA,eACA,Cb9iDgB,gHawjDhB,abxjDgB,wBa4jDhB,UACE,wCAGF,kBbhkDgB,cEKL,8CW+jDT,kBACE,qBACA,wBAKN,oBACE,gBACA,eACA,cXlkDsB,eWokDtB,iBACA,kBACA,4BAEA,abllDoB,6BaslDpB,cACE,gBACA,uBACA,uCAIJ,UACE,kBACA,CXjmDU,mEWwmDZ,aXxmDY,uBW4mDZ,aX7mDc,4DWmnDV,4CACE,CADF,oCACE,8DAKF,6CACE,CADF,qCACE,6BAKN,aACE,gBACA,qBACA,mCAEA,UXvoDM,0BWyoDJ,8BAIJ,WACE,eAGF,aACE,eACA,gBACA,uBACA,mBACA,qBAGF,eACE,wBAGF,cACE,+DAKA,yBACE,eAIJ,iBACE,WACA,YACA,aACA,mBACA,uBACA,sBACA,6CAEA,cX9nD4B,eAEC,0DW+nD3B,sBACA,CADA,gCACA,CADA,kBACA,4BAGF,iBACE,qEAGF,YACE,iBAIJ,iBACE,WACA,YACA,aACA,mBACA,uBACA,qBAEA,cXtpD4B,eAEC,WWupD3B,YACA,sBACA,CADA,gCACA,CADA,kBACA,iBAIJ,YACE,aACA,mBACA,cACA,eACA,cXvsDsB,wBW0sDtB,aXzsDwB,mBW6sDxB,aACE,4BAGF,oBACE,0CAGF,iBACE,6DAEA,iBACE,oBACA,qCACA,UACA,4EAGF,mBACE,gCACA,UACA,0BAKN,aACE,gBACA,iBACA,gBACA,gBACA,kCAGF,aACE,gBACA,gBACA,uBACA,+BAGF,aACE,qBACA,WAGF,oBACE,oBAGF,YACE,kBACA,2BAGF,+BACE,mBACA,SACA,gBAGF,kBX1wD0B,cW4wDxB,kBACA,uCACA,aACA,mBAEA,eACE,qBAGF,yBACE,oBAGF,yBACE,uBAGF,sBACE,sBAGF,sBACE,uBAIJ,iBACE,QACA,SACA,2BACA,4BAEA,UACE,gBACA,2BACA,0BX/yDsB,2BWmzDxB,WACE,iBACA,uBACA,yBXtzDsB,8BW0zDxB,QACE,iBACA,uBACA,4BX7zDsB,6BWi0DxB,SACE,gBACA,2BACA,2BXp0DsB,wBW00DxB,cACE,iBACA,cACA,iBACA,sBACA,qBACA,mBXh1DsB,cARb,gBW21DT,uBACA,mBACA,yFAEA,kBbl2DkB,cEWI,UW41DpB,sCAKN,aACE,iBACA,gBACA,QACA,gBACA,aACA,yCAEA,eACE,mBX12DsB,cW42DtB,kBACA,mCACA,gBACA,kBACA,sDAGF,OACE,wDAIA,UACE,8CAIJ,cACE,iBACA,cACA,iBACA,sBACA,qBACA,mBXn4DsB,cARb,gBW84DT,uBACA,mBACA,oDAEA,SACE,oDAGF,kBbz5DkB,cEWI,iBWq5D1B,qBACE,eAGF,YACE,cACA,mBACA,2BACA,gBACA,kBACA,4BAEA,iBACE,uBAGF,YACE,uBACA,WACA,YACA,iBACA,6BAEA,WACE,gBACA,oBACA,aACA,yBACA,gBACA,oCAEA,0BACE,oCAGF,cACE,YACA,oBACA,YACA,6BAIJ,qBACE,WACA,gBACA,cACA,aACA,sBACA,qCAEA,4BARF,cASI,qBAMR,kBACE,wBACA,CADA,eACA,MACA,UACA,cACA,qCAEA,mBAPF,gBAQI,+BAGF,eACE,qCAEA,6BAHF,kBAII,gKAMJ,WAIE,mCAIJ,YACE,mBACA,uBACA,YACA,SAGF,WACE,kBACA,sBACA,aACA,sBACA,qBAEA,kBXlgEW,8BWogET,+BACA,KAIJ,aACE,CACA,qBACA,WACA,YACA,aAJA,YAYA,CARA,QAGF,WACE,sBACA,CACA,qBACA,kBACA,cAGF,aACE,cACA,sBACA,cXrhEsB,qBWuhEtB,kBACA,eACA,oCACA,iBAGF,aAEE,gBACA,qCAGF,cACE,SACE,iBAGF,aAEE,CAEA,gBACA,yCAEA,iBACE,uCAGF,kBACE,qDAKF,gBAEE,kBACA,YAKN,qBACE,aACA,mBACA,cACA,gBACA,iBAGF,aACE,cACA,CACA,sBACA,WX7lEM,qBW+lEN,kBACA,eACA,gBACA,gCACA,2BACA,mDACA,qBAEA,eACE,eACA,qCAMA,mEAHF,kBAII,4BACA,yBAIJ,+BACE,cbhnEkB,sBaonEpB,eACE,aACA,qCAIJ,qBAEI,cACE,wBAKN,qBACE,WACA,YACA,cACA,6DAEA,UAEE,YACA,UACA,wCAGF,YACE,cACA,kDACA,qCAEA,uCALF,aAMI,yCAIJ,eACE,oCAGF,YACE,uDAGF,cACE,sCAGF,gBACE,eACA,CACA,2BACA,yCAGF,QACE,mCAGF,gBACE,yBAEA,kCAHF,eAII,sCAIJ,sBACE,gBACA,sCAGF,uCACE,YACE,iKAEA,eAGE,6CAIJ,gBACE,2EAGF,YAEE,kGAGF,gBACE,+BAGF,2BACE,gBACA,uCAEA,SACE,SACA,wCAGF,eACE,wCAGF,gBACE,iBACA,qDAGF,UACE,gLAGF,eAIE,gCAIJ,iBACE,6CAEA,cACE,8CAKF,gBACE,iBACA,6DAGF,UACE,CAIA,yFAGF,eACE,8DAGF,gBACE,kBACA,0BAMR,cACE,aACA,uBACA,mBACA,gBACA,iBACA,iBACA,gBACA,mBACA,WXpyEM,kBWsyEN,eACA,iBACA,qBACA,sCACA,4FAEA,kBAGE,qCAIJ,UACE,UACE,uDAGF,kCACE,4DAGF,kBAGE,yBAGF,aACE,iBAGF,eAEE,sCAIJ,2CACE,YACE,sCAOA,sEAGF,YACE,uCAIJ,0CACE,YACE,uCAIJ,UACE,YACE,mBAIJ,iBACE,yBAEA,iBACE,SACA,UACA,mBbz2EkB,yBa22ElB,gBACA,kBACA,eACA,gBACA,iBACA,WXt3EI,mDW23ER,oBACE,gBAGF,WACE,gBACA,aACA,sBACA,yBACA,kBACA,gCAEA,gBACE,oBACA,cACA,gBACA,6BAGF,sBACE,8BAGF,MACE,kBACA,aACA,sBACA,iBACA,oBACA,oBACA,mDAGF,eACE,sBX75EI,0BW+5EJ,cACA,gDAGF,iBACE,gDAGF,WACE,mBAIJ,eACE,mBACA,yBACA,gBACA,aACA,sBACA,qBAEA,aACE,sBAGF,aACE,SACA,CACA,4BACA,cACA,qDAHA,sBAOA,gBAMF,WACA,kBAGA,+BANF,qBACE,UACA,CAEA,eACA,aAiBA,CAhBA,eAGF,iBACE,MACA,OACA,mBACA,CAGA,qBACA,CACA,eACA,WACA,YACA,kBACA,uBAEA,kBXp9EW,0BWy9Eb,u1BACE,OACA,gBACA,aACA,8BAEA,aACE,sBACA,CADA,4DACA,CADA,kBACA,+BACA,CADA,2BACA,UACA,YACA,oBACA,eACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,sCAGF,yBAjBF,aAkBI,iBAIJ,kBACE,eACA,gBACA,iBAGF,aACE,eACA,mBACA,mBACA,aACA,mBACA,kBACA,mBAEA,iCACE,yBAEA,kBACE,mCACA,aAKN,iBACE,kBACA,cACA,iCACA,mCAEA,eACE,yBAGF,YAVF,cAWI,oBAGF,YACE,sBACA,qBAGF,aACE,kBACA,iBACA,yBAKF,uBADF,YAEI,sBAIJ,qBACE,WACA,mBACA,cb9iFoB,eagjFpB,cACA,eACA,oBACA,SACA,iBACA,aACA,SACA,UACA,UACA,2BAEA,yBACE,6BAIJ,kBACE,SACA,oBACA,cbnkFoB,eaqkFpB,mBACA,eACA,kBACA,UACA,mCAEA,yBACE,wCAGF,kBACE,2BAIJ,oBACE,iBACA,2BAGF,iBACE,kCAGF,cACE,cACA,eACA,aACA,CACA,OACA,UACA,eAGF,oBACE,kBACA,eACA,6BACA,SACA,UACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,0CACA,wCACA,iCAGF,QACE,mBACA,WACA,YACA,gBACA,UACA,kBACA,UACA,yBAGF,kBACE,WACA,wBACA,qBAGF,UACE,YACA,UACA,mBACA,yBXroFW,qCWuoFX,sEAGF,wBACE,4CAGF,wBbjpFsB,+EaqpFtB,wBACE,2BAGF,iBACE,WACA,YACA,MACA,SACA,gBACA,mBACA,cACA,SACA,UACA,6BACA,CAKA,uEAFF,SACE,6BAeA,CAdA,sBAGF,iBACE,WACA,YACA,MACA,SACA,gBACA,mBACA,cACA,WAGA,8CAGF,SACE,qBAGF,iBACE,QACA,SACA,WACA,YACA,yBACA,kBACA,yBACA,sBACA,yBACA,sCACA,4CAGF,SACE,qBb7sFoB,caitFtB,kBACE,WXxtFM,cW0tFN,eACA,aACA,qBACA,2DAEA,kBAGE,oBAGF,SACE,2BAGF,sBACE,cXztFsB,kGW4tFtB,sBAGE,WXhvFE,kCWovFJ,ab9uFkB,oBaovFtB,oBACE,iBACA,qBAGF,oBACE,kBACA,CACA,gBACA,CX1vFW,eW6vFX,iBACA,wCANA,cACA,CACA,eACA,mBAaA,CAVA,mBX9vFW,aFLK,iBaywFhB,CAEA,wBACA,eACA,yDAGF,kBX3wFa,cWixFb,aACE,kBAGF,ab1xFkB,ca4xFhB,8BACA,+BACA,4EAEA,0BAGE,CAHF,uBAGE,CAHF,kBAGE,kDAMA,sBACA,YACA,wDAEA,kBACE,8DAGF,cACE,sDAGF,cACE,0DAEA,abxzFY,0Ba0zFV,sDAIJ,oBACE,cXnzFkB,sMWszFlB,yBAGE,oDAKN,ab10FgB,0Bag1FhB,aACE,UACA,mCACA,CADA,0BACA,gBACA,6BAEA,cACE,yBACA,cX50FkB,aW80FlB,gBACA,gCACA,sCAGF,oDACE,YACE,uCAIJ,oDACE,YACE,uCAIJ,yBA3BF,YA4BI,yCAGF,eACE,aACA,iDAEA,aXv2FkB,qBW82FxB,eACE,gBACA,2BAEA,iBACE,aACA,wBAGF,kBACE,yBAGF,oBACE,gBACA,yBACA,yBACA,eAIJ,aACE,sBACA,WACA,SACA,cX94FW,gBATL,aW05FN,oBACA,eACA,gBACA,SACA,UACA,kBACA,qBAEA,SACE,qCAGF,cAnBF,cAoBI,oDAIJ,uBACE,YACA,6CACA,uBACA,sBACA,WACA,0DAEA,sBACE,0DAKJ,uBACE,2BACA,gDAGF,ab17FkB,6Ba47FhB,uDAGF,ab77FsB,cai8FtB,YACE,eACA,yBACA,kBACA,cbv8FgB,gBay8FhB,qBACA,gBACA,uBAEA,QACE,OACA,kBACA,QACA,MAIA,iDAHA,YACA,uBACA,mBAUE,CATF,0BAEA,yBACE,kBACA,iBACA,cAIA,sDAGF,cAEE,cXt9FoB,uBWw9FpB,SACA,cACA,qBACA,eACA,iBACA,sMAEA,UXh/FE,yBWu/FJ,cACE,kBACA,YACA,eAKN,cACE,qBAEA,kBACE,oBAIJ,cACE,cACA,qBACA,WACA,YACA,SACA,2BAIA,UACE,YACA,qBAIJ,aACE,gBACA,kBACA,cX1gGsB,gBW4gGtB,uBACA,mBACA,qBACA,uBAGF,aACE,gBACA,2BACA,2BAGF,aXxhGwB,oBW4hGxB,aACE,eACA,eACA,gBACA,uBACA,mBACA,qBAGF,cACE,mBACA,kBACA,yBAEA,cACE,kBACA,yBACA,QACA,SACA,+BACA,yBAIJ,aACE,6CAEA,UACE,mDAGF,yBACE,6CAGF,mBACE,sBAIJ,oBACE,kCAEA,QACE,4CAIA,oBACA,0CAGF,kBACE,0CAGF,aACE,6BAIJ,wBACE,2BAGF,yBACE,cACA,SACA,WACA,YACA,oBACA,CADA,8BACA,CADA,gBACA,sBACA,wBACA,YAGF,aACE,cbrnGgB,6BaunGhB,SACA,kBACA,kBACA,oBACA,SACA,aACA,sBACA,WACA,WACA,qBACA,kBAEA,kBACE,WAIJ,+BACE,yBAGF,iBACE,eACA,gBACA,cb/oGgB,mBEKL,eW6oGX,aACA,cACA,sBACA,mBACA,uBACA,aACA,qEAGE,aAEE,WACA,aACA,SACA,yCAIJ,gBACE,gCAGF,eACE,uCAEA,aACE,mBACA,cb7qGY,qCairGd,cACE,gBACA,yBAKN,iBACE,cACA,UACA,gCAEA,mCACE,uCAEA,aACE,WACA,kBACA,aACA,OACA,QACA,cACA,UACA,oBACA,YACA,UACA,4EACA,wCAIJ,SACE,kBACA,gBAIJ,YACE,eACA,mBACA,cACA,eACA,kBACA,UACA,UACA,gBACA,2BACA,4BACA,uBAEA,QACE,SACA,yBACA,cACA,uBACA,aACA,gBACA,uBACA,gBACA,mBACA,OACA,4CAGF,ab/uGoB,4CaovGlB,abpvGkB,sCasvGhB,4CAIJ,SAEE,yBAIJ,WACE,aACA,uBAGF,kBACE,iCAGF,iBACE,wBAGF,kBACE,SACA,cXrwGsB,eWuwGtB,eACA,eACA,8BAEA,aACE,CAKA,kEAEA,UXnyGI,mBWqyGF,6BAKN,eACE,gBACA,gBACA,cX7xGsB,0DW+xGtB,UACA,UACA,kBACA,uCAEA,YACE,WACA,uCAGF,iBACE,gCAGF,QACE,uBACA,SACA,6BACA,cACA,mCAIJ,kBACE,aACA,mCAIA,aX5zGsB,0BW8zGpB,gCAIJ,WACE,4DAEA,cACE,uEAEA,eACE,WAKN,oBACE,UACA,oBACA,kBACA,cACA,SACA,uBACA,eACA,sBAGF,oBACE,iBACA,oBAGF,ab12GkB,ea42GhB,gBACA,yBACA,iBACA,kBACA,QACA,SACA,+BACA,yBAEA,aACE,WACA,CACA,0BACA,oBACA,mBACA,4BAIJ,iBACE,QACA,SACA,+BACA,WACA,YACA,sBACA,6BACA,CACA,wBACA,kBACA,2CAGF,2EACE,CADF,mEACE,8CAGF,4EACE,CADF,oEACE,qCAGF,GACE,sBACE,KAGF,2BACE,KAGF,2BACE,KAGF,yBACE,IAGF,wBACE,EArBF,4BAGF,GACE,sBACE,KAGF,2BACE,KAGF,2BACE,KAGF,yBACE,IAGF,wBACE,uCAIJ,GACE,wBACE,KAGF,0BACE,KAGF,2BACE,KAGF,uBACE,IAGF,sBACE,EAtBA,6BAIJ,GACE,wBACE,KAGF,0BACE,KAGF,2BACE,KAGF,uBACE,IAGF,sBACE,mCAIJ,GACE,OACE,SACA,yBACA,KAGF,wBACE,KAGF,UACE,YACA,6BACA,kBACA,UACA,IAGF,UACE,YACA,eACA,UACA,6BACA,EA5BA,yBAIJ,GACE,OACE,SACA,yBACA,KAGF,wBACE,KAGF,UACE,YACA,6BACA,kBACA,UACA,IAGF,UACE,YACA,eACA,UACA,6BACA,kCAIJ,GACE,gBACA,aACA,aAPE,wBAIJ,GACE,gBACA,aACA,gCAGF,kBACE,gBXz+GM,WACA,eW2+GN,aACA,sBACA,YACA,uBACA,eACA,kBACA,kBACA,YACA,gBAGF,eXv/GQ,cAiBgB,SWy+GtB,UACA,WACA,YACA,kBACA,wBACA,CADA,oBACA,CADA,eACA,iEAEA,SAGE,cACA,yBAIJ,aACE,eACA,yBAGF,aACE,eACA,gBACA,iBAGF,KACE,OACA,WACA,YACA,kBACA,YACA,2BAEA,aACE,SACA,QACA,WACA,YACA,6BAGF,mBACE,yBAGF,YACE,0BAGF,aACE,uBACA,WACA,YACA,SACA,iCAEA,oBACE,0BACA,kBACA,iBACA,WXtjHE,gBWwjHF,eACA,+LAMA,yBACE,mEAKF,yBACE,6BAMR,kBACE,iBAGF,kBACE,6BACA,gCACA,aACA,mBACA,eACA,kDAGF,aAEE,kBACA,yBAGF,kBACE,aACA,2BAGF,aXplHwB,eWslHtB,cACA,gBACA,mBACA,kDAIA,kBACE,oDAIA,SEtmHF,sBACA,WACA,SACA,gBACA,oBACA,mBbRW,cAOW,eaItB,SACA,+EFgmHI,aACE,CEjmHN,qEFgmHI,aACE,CEjmHN,yEFgmHI,aACE,CEjmHN,gEFgmHI,aACE,sEAGF,QACE,yLAGF,mBAGE,0DAGF,kBACE,qCAGF,mDArBF,cAsBI,yDAIJ,abxoHc,iBa0oHZ,eACA,4DAGF,gBACE,wDAGF,kBACE,gEAEA,cACE,iNAEA,kBAGE,cACA,gHAKN,aXrpHoB,0HW0pHpB,cAEE,gBACA,cbzqHY,kZa4qHZ,aAGE,gEAIJ,wBACE,iDAGF,eX3rHI,kBa0BN,CAEA,eACA,cbbsB,uCaetB,UF8pHI,mBX5qHoB,oDagBxB,wBACE,cblBoB,eaoBpB,gBACA,mBACA,oDAGF,aACE,oDAGF,kBACE,oDAGF,eACE,cbzCS,sDWwrHT,WACE,mDAGF,aX5rHS,kBW8rHP,eACA,8HAEA,kBAEE,iCAON,kBACE,mBAIJ,UXxtHQ,kBW0tHN,cACA,mBACA,sBX7tHM,yBW+tHN,eACA,gBACA,YACA,kBACA,WACA,yBAEA,SACE,iBAIJ,aACE,iBACA,wBAGF,aX/tHwB,qBWiuHtB,mBACA,gBACA,sBACA,6EAGF,abnvHkB,mBEKL,kBWmvHX,aACA,eACA,gBACA,eACA,aACA,cACA,mBACA,uBACA,yBAEA,4EAfF,cAgBI,6FAGF,eACE,mFAGF,abxwHoB,qBa0wHlB,qGAEA,yBACE,uCAKN,kBACE,aACA,eAGF,qBACE,8BAGF,GACE,kBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,oBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,kBACE,2CACA,CADA,kCACA,EA1BF,qBAGF,GACE,kBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,oBACE,2CACA,CADA,kCACA,KAGF,oBACE,0CACA,CADA,iCACA,KAGF,kBACE,2CACA,CADA,kCACA,mCAIJ,8BACE,2DACA,CADA,kDACA,iCAGF,MACE,sBAEE,0BACA,KAGF,sBACE,aAGF,uBAGE,aAGF,sBAGE,KAGF,uBACE,KAGF,sBACE,EA/BF,wBAGF,MACE,sBAEE,0BACA,KAGF,sBACE,aAGF,uBAGE,aAGF,sBAGE,KAGF,uBACE,KAGF,sBACE,kCAIJ,yBACE,8EACA,CADA,qEACA,8BAGF,eXt2HQ,kBWw2HN,sCACA,kBACA,eAEA,iDAEA,2BACE,2DAGF,UACE,mCAIJ,iBACE,SACA,WACA,eACA,yCAGF,iBACE,UACA,SACA,UACA,gBXl4HM,kBWo4HN,sCACA,gBACA,gDAEA,aACE,eACA,SACA,gBACA,uBACA,iKAEA,+BAGE,2DAIJ,WACE,wBAKF,2BACE,cAIJ,kBACE,0BACA,aACA,YACA,uBACA,OACA,UACA,kBACA,MACA,kBACA,WACA,aACA,gBAEA,mBACE,oBAIJ,WACE,aACA,aACA,sBACA,kBACA,YACA,0BAGF,iBACE,MACA,QACA,SACA,OACA,WACA,kBACA,mBX37HW,kCW67HX,uBAGF,MACE,aACA,mBACA,uBACA,cX57HwB,eW87HxB,gBACA,0BACA,kBACA,kBAGF,YACE,cbl9HgB,gBao9HhB,aACA,sBAEA,cACE,kBACA,uBAGF,cACE,yBACA,gBACA,cACA,0BAIJ,aACE,4BAGF,UACE,WACA,kBACA,mBb3+HgB,kBa6+HhB,eACA,2BAGF,iBACE,OACA,MACA,WACA,mBbn/HoB,kBaq/HpB,eAGF,aACE,wBACA,UACA,eACA,0CAEA,mBAEE,mBAGF,8BACE,CADF,sBACE,WACA,cACA,SACA,WACA,YACA,CAQE,6GAKN,SACE,oBACA,CADA,WACA,6BAGF,iBACE,gBXliIM,uCWoiIN,kBACA,iBACA,gBACA,iCAEA,yBACE,oCAGF,sBACE,2BAIJ,aXziIa,aW2iIX,eACA,aACA,kEAEA,kBbljIoB,WENd,UW4jIJ,CX5jII,4RWikIF,UXjkIE,wCWukIN,kBACE,iCAIJ,YACE,mBACA,uBACA,kBACA,oCAGF,aACE,cbhlIgB,2CamlIhB,eACE,cACA,cXhlIS,CWqlIL,wQADF,eACE,mDAON,eXrmIM,0BWumIJ,qCACA,gEAEA,eACE,0DAGF,kBbxmIkB,uEa2mIhB,UXjnIE,uDWunIN,yBACE,sDAGF,aACE,sCACA,SAIJ,iBACE,gBAGF,SEznIE,sBACA,WACA,SACA,gBACA,oBACA,mBbRW,cAOW,eaItB,SACA,cFmnIA,CACA,2BACA,iBACA,eACA,2CAEA,aACE,CAHF,iCAEA,aACE,CAHF,qCAEA,aACE,CAHF,4BAEA,aACE,kCAGF,QACE,6EAGF,mBAGE,sBAGF,kBACE,qCAGF,eA3BF,cA4BI,kCAKF,QACE,qDAGF,mBAEE,mBAGF,iBACE,SACA,WACA,UACA,qBACA,UACA,0BACA,sCACA,eACA,WACA,YACA,cXzqIsB,eW2qItB,oBACA,0BAEA,mBACE,WACA,0BAIJ,uBACE,iCAEA,mBACE,uBACA,gCAIJ,QACE,uBACA,cb5sIc,ea8sId,uCAEA,uBACE,sCAGF,aACE,yBAKN,ab1tIkB,mBa4tIhB,aACA,gBACA,eACA,eACA,6BAEA,oBACE,iBACA,0BAIJ,iBACE,6BAEA,kBACE,gCACA,eACA,aACA,aACA,gBACA,eACA,cblvIc,iCaqvId,oBACE,iBACA,8FAIJ,eAEE,0BAIJ,aACE,aACA,cXtvIwB,qBWwvIxB,+FAEA,aAGE,0BACA,uBAIJ,YACE,cXpwIsB,kBWswItB,aAGF,iBACE,8BACA,oBACA,aACA,sBAGF,cACE,MACA,OACA,QACA,SACA,0BACA,wBAGF,cACE,MACA,OACA,WACA,YACA,aACA,sBACA,mBACA,uBACA,2BACA,aACA,oBACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,oBAGF,mBACE,aACA,aACA,yBAGF,eACE,iBACA,yBAGF,UACE,cAGF,UACE,YACA,kBACA,qCAEA,UACE,YACA,aACA,mBACA,uBACA,2CAEA,cXjyI0B,eAEC,CW2yI7B,8CALF,iBACE,MACA,OACA,QACA,SAYA,CAXA,yBAQA,mBACA,8BACA,oBACA,4BAEA,mBACE,0DAGF,SACE,4DAEA,mBACE,mBAKN,yBACE,sBACA,SACA,WX73IM,eW+3IN,aACA,mBACA,eACA,cACA,cACA,kBACA,kBACA,MACA,SACA,yBAGF,MACE,0BAGF,OACE,CASA,4CANF,UACE,kBACA,kBACA,OACA,YACA,oBAUA,6BAEA,WACE,sBAGF,mBACE,qBACA,gBACA,cX15IsB,mFW65ItB,yBAGE,wBAKN,oBACE,sBAGF,qBX17IQ,YW47IN,WACA,kBACA,YACA,UACA,SACA,YACA,8BAGF,wBb/7IsB,qBam8ItB,iBACE,UACA,QACA,YACA,6CAGF,kBX/7I0B,cARb,kBW48IX,gBACA,aACA,sBACA,oBAGF,WACE,WACA,gBACA,iBACA,kBACA,wBAEA,iBACE,MACA,OACA,WACA,YACA,sBACA,aACA,aACA,CAGA,YACA,UACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,2CANA,qBACA,mBACA,uBAaF,CATE,mBAIJ,YACE,CAGA,iBACA,mDAGF,aAEE,mBACA,aACA,aACA,2DAEA,cACE,uLAGF,abngJgB,SasgJd,eACA,gBACA,kBACA,oBACA,YACA,aACA,kBACA,6BACA,+mBAEA,aAGE,yBACA,qiBAGF,aXlhJS,qwDWshJP,aAGE,sBAMR,sBACE,eAGF,iBACE,eACA,mBACA,sBAEA,eACE,cXziJS,kBW2iJT,yBACA,eACA,qBAGF,kBXhjJW,cAQa,gBW2iJtB,aACA,kBACA,kBAIJ,oBACE,eACA,gBACA,iBACA,wFAGF,kBAME,cXtkJW,kBWwkJX,gBACA,eACA,YACA,kBACA,sBACA,4NAEA,aACE,eACA,mBACA,wLAGF,WACE,UACA,kBACA,SACA,WACA,kRAGF,aACE,wBAKF,eX5mJM,CAiBkB,gBW8lJtB,oBACA,iEXhnJI,2BAiBkB,yBWumJ1B,iBACE,aACA,iCAEA,wBACE,CADF,qBACE,CADF,oBACE,CADF,gBACE,gBACA,2GAIJ,YAIE,8BACA,mBXtnJwB,aWwnJxB,iBACA,2HAEA,aACE,iBACA,cb1oJc,mBa4oJd,2IAGF,aACE,6BAIJ,cACE,2BAGF,WACE,eACA,0BAGF,gBAEE,sDAGF,qBAEE,eAGF,UACE,gBACA,0BAGF,YACE,6BACA,qCAEA,yBAJF,cAKI,gBACA,iDAIJ,qBAEE,UACA,qCAEA,+CALF,UAMI,sDAIJ,aAEE,gBACA,gBACA,gBACA,kBACA,2FAEA,abtsJoB,iLa0sJpB,aXvsJW,qCW4sJX,oDAjBF,eAkBI,sCAKF,4BADF,eAEI,yBAIJ,YACE,+BACA,gBACA,0BAEA,cACE,iBACA,mBACA,sCAGF,aACE,sBACA,WACA,CACA,aXtuJS,gBATL,aWkvJJ,oBACA,eACA,YACA,CACA,SACA,kBACA,yBACA,iBACA,gBACA,gBACA,4CAEA,wBACE,+CAGF,eXlwJI,yBWowJF,mBACA,kBACA,6DAEA,QACE,gBACA,gBACA,mEAEA,QACE,0DAIJ,aXzwJO,oBW2wJL,eACA,gBXrxJA,+CW0xJJ,YACE,8BACA,mBACA,4CAIJ,aACE,cXzxJS,eW2xJT,gBACA,mBACA,wCAGF,eACE,mBACA,+CAEA,aXpyJS,eWsyJP,qCAIJ,uBAnFF,YAoFI,eACA,QACA,wCAEA,iBACE,iBAKN,eACE,eACA,wBAEA,eACE,iBACA,2CAGF,eACE,mBAGF,eACE,cACA,gBACA,+BAEA,4BACE,4BAGF,QACE,oCAIA,aXh1JO,aWk1JL,kBACA,eACA,mBACA,qBACA,8EAEA,eAEE,yWAOA,kBbp2JY,WENd,uDWi3JA,iBACE,oMAUR,aACE,iIAIJ,4BAIE,cbj4JgB,eam4JhB,gBACA,6cAEA,aAGE,6BACA,qGAIJ,YAIE,eACA,iIAEA,eACE,CAII,w1BADF,eACE,sDAMR,iBAEE,oDAKA,eACE,0DAGF,eACE,mBACA,aACA,mBACA,wEAEA,aX56JS,CW86JP,gBACA,uBAKN,YACE,2CAEA,QACE,WACA,cAIJ,wBbh8JsB,Wak8JpB,kBACA,MACA,OACA,aACA,6BAGF,aACE,kBACA,WXj9JM,0BWm9JN,WACA,SACA,gBACA,kBACA,eACA,gBACA,UACA,oBACA,WACA,4BACA,iBACA,wDAKE,SACE,uBAKN,eACE,6BAEA,UACE,kBAIJ,YACE,eACA,yBACA,kBACA,gBACA,gBACA,wBAEA,aACE,cbt/Jc,iBaw/Jd,eACA,+BACA,aACA,sBACA,mBACA,uBACA,eACA,4BAEA,aACE,wBAIJ,eACE,CACA,qBACA,aACA,sBACA,uBACA,2BAEA,aACE,cACA,0BAGF,oBACE,cbphKY,gBashKZ,gCAEA,yBACE,0BAKN,QACE,eACA,iDAEA,SACE,cACA,8BAGF,abviKc,gBa+iKhB,cACA,CACA,iBACA,CACA,UACA,qCANF,qBACE,CACA,eACA,CACA,iBAYA,CAVA,qBAGF,QACE,CACA,aACA,WACA,CACA,iBAEA,qEAGE,cACE,MACA,gCAKN,cACE,cACA,qBACA,cX9jKwB,kBWgkKxB,UACA,mEAEA,WAEE,WACA,CAIA,2DADF,mBACE,CADF,8BACE,CADF,gBX3lKM,CW4lKJ,wBAIJ,UACE,YACA,CACA,iBACA,MACA,OACA,UACA,gBXvmKM,iCW0mKN,YACE,sBAIJ,WACE,gBACA,kBACA,WACA,qCAGF,cACE,YACA,oBACA,CADA,8BACA,CADA,gBACA,kBACA,QACA,2BACA,WACA,UACA,sCAGF,0BACE,2BACA,gBACA,kBACA,qKAMA,WAEE,mFAGF,WACE,eAKJ,qBACE,kBACA,mBACA,kBACA,oBACA,cACA,wBAEA,eACE,YACA,yBAGF,cACE,kBACA,gBACA,gCAEA,UACE,cACA,kBACA,6BACA,WACA,SACA,OACA,oBACA,qCAIJ,iCACE,iCAGF,wBACE,uCAIA,mBACA,mBACA,6BACA,0BACA,eAIJ,eACE,kBACA,gBXvsKM,eWysKN,kBACA,sBACA,cACA,wBAEA,eACE,sBACA,qBAGF,SACE,qBAGF,eACE,gBACA,UACA,0BAGF,oBACE,sBACA,SACA,gCAEA,wBACE,0BACA,qBACA,sBACA,UACA,4BAKF,qBACE,CADF,gCACE,CADF,kBACE,kBACA,QACA,2BACA,yBAIJ,iBACE,UACA,SACA,OACA,QACA,sBACA,iFACA,eACA,UACA,4BACA,gCAEA,SACE,6EAKF,iBAEE,wBAIJ,YACE,kBACA,MACA,OACA,WACA,YACA,UACA,SACA,gBXpxKI,cAiBgB,gBWswKpB,oBACA,+BAEA,aACE,oBACA,8GAEA,aAGE,+BAIJ,aACE,eACA,kCAGF,aACE,eACA,gBACA,4BAIJ,YACE,8BACA,oBACA,0DAEA,aACE,wBAIJ,cACE,mBACA,gBACA,uBACA,oCAGE,cACE,qCAKF,eACE,+BAIJ,sBACE,iBACA,eACA,SACA,0BACA,8GAEA,UXn1KE,+EW21KN,cAGE,gBACA,6BAGF,UXl2KM,iBWo2KJ,yBAGF,oBACE,aACA,mDAGF,UX52KM,uBWi3KN,cACE,YACA,eACA,8BAEA,UACE,WACA,+BAOA,6DANA,iBACA,cACA,kBACA,WACA,UACA,YAWA,CAVA,+BASA,kBACA,+BAGF,iBACE,UACA,kBACA,WACA,YACA,YACA,UACA,4BACA,mBACA,sCACA,oBACA,qBAIJ,gBACE,uBAEA,oBACE,eACA,gBACA,WXj6KE,sFWo6KF,yBAGE,qBAKN,cACE,YACA,kBACA,4BAEA,UACE,WACA,+BACA,kBACA,cACA,kBACA,WACA,SACA,2DAGF,aAEE,kBACA,WACA,kBACA,SACA,mBACA,6BAGF,6BACE,6BAGF,iBACE,UACA,UACA,kBACA,WACA,YACA,QACA,iBACA,4BACA,mBACA,sCACA,oBACA,CAGE,yFAKF,SACE,6GAQF,gBACE,oBACA,kBAON,UACE,cACA,+BACA,0BAEA,UACE,qCAGF,iBATF,QAUI,mBAIJ,qBACE,mBACA,uBAEA,YACE,kBACA,gBACA,gBACA,2BAEA,aACE,WACA,YACA,SACA,oBACA,CADA,8BACA,CADA,gBACA,uBAIJ,YACE,mBACA,mBACA,aACA,6BAEA,aACE,aACA,mBACA,qBACA,gBACA,qCAGF,UACE,eACA,cACA,+BAGF,aACE,WACA,YACA,gBACA,mCAEA,UACE,YACA,cACA,SACA,kBACA,mBACA,oBACA,CADA,8BACA,CADA,gBACA,qCAIJ,gBACE,gBACA,4CAEA,cACE,WX3jLF,gBW6jLE,gBACA,uBACA,0CAGF,aACE,eACA,cXpjLc,gBWsjLd,gBACA,uBACA,yBAKN,kBXpkLS,aWskLP,mBACA,uBACA,gDAEA,YACE,cACA,eACA,mDAGF,qBACE,kBACA,gCACA,WACA,gBACA,mBACA,gBACA,uBACA,qDAEA,YACE,iEAEA,cACE,sDAIJ,YACE,6BAOV,YACE,eACA,gBACA,wBAGF,QACE,sBACA,cACA,kBACA,kBACA,gBACA,WACA,+BAEA,iBACE,QACA,SACA,+BACA,eACA,sDAIJ,kBAEE,gCACA,eACA,aACA,cACA,oEAEA,kBACE,SACA,SACA,6HAGF,aAEE,cACA,cX5oLoB,eW8oLpB,eACA,gBACA,kBACA,qBACA,kBACA,WACA,mBACA,yJAEA,aXtpLsB,qWWypLpB,aAEE,WACA,kBACA,SACA,SACA,QACA,SACA,2BACA,CAEA,4CACA,CADA,kBACA,CADA,wBACA,iLAGF,WACE,6CACA,8GAKN,kBACE,gCACA,qSAKI,YACE,iSAGF,4CACE,cAOV,kBX1sLa,sBW6sLX,iBACE,4BAGF,aACE,eAIJ,cACE,kBACA,qBACA,cACA,iBACA,eACA,mBACA,gBACA,uBACA,eACA,oEAEA,YAEE,sBAGF,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,8BAEA,oBACE,mBACA,2BAKN,eACE,gBAGF,eXxwLQ,kBa0BN,CACA,sBACA,gBACA,cbbsB,uCaetB,mBAEA,wBACE,cblBoB,eaoBpB,gBACA,mBACA,mBAGF,aACE,mBAGF,kBACE,mBAGF,eACE,cbzCS,UWmwLb,iBACE,cAEA,WACE,WACA,sCACA,CADA,6BACA,cAGF,cACE,iBACA,cXtwLsB,gBWwwLtB,gBAEA,abrxLkB,0BauxLhB,sBAEA,oBACE,4BAMR,GACE,cACA,eACA,WATM,mBAMR,GACE,cACA,eACA,qEAGF,kBAIE,sBAEE,8BACA,iBAGF,0BACE,kCACA,+BAIA,qDACE,uEACA,+CAGF,sBACE,8BACA,6DAIA,6BACE,6CACA,4EAIF,6BACE,6CACA,+CAOJ,gBAEE,+BAGF,gBACE,6CAEA,0BACE,wDAGF,eACE,6DAGF,iBACE,iBACA,2EAIA,mBACE,UACA,gCACA,WACA,0FAGF,mBACE,UACA,oCACA,eAOV,UACE,eACA,gBACA,iBAEA,YACE,gBACA,eACA,kBACA,sCAGF,YACE,4CAEA,kBACE,yDAGF,SACE,sBACA,cACA,WACA,SACA,aACA,gDACA,mBX94LO,WATL,eW05LF,CACA,eACA,kBACA,2EAEA,QACE,wMAGF,mBAGE,+DAGF,kBACE,qCAGF,wDA7BF,cA8BI,4DAIJ,WACE,eACA,gBACA,SACA,kBACA,sBAMJ,sBACA,mBACA,6BACA,gCACA,+BAEA,iBACE,iBACA,cbj8Lc,Cao8Ld,eACA,eACA,oCAEA,aACE,gBACA,uBACA,oCAIJ,UACE,kBACA,uDAGF,iBACE,qDAGF,eACE,qBAKF,wBACA,aACA,2BACA,mBACA,mBACA,2BAEA,aACE,iCAEA,UACE,uCAEA,SACE,kCAKN,aACE,cACA,mBAIJ,cACE,kBACA,MACA,OACA,WACA,YACA,0BACA,cAGF,kBX5/La,sBW8/LX,kBACA,uCACA,YACA,gBACA,qCAEA,aARF,SASI,kBAGF,cACE,mBACA,gBACA,eACA,kBACA,0BACA,6BAGF,WACE,6BAGF,yBACE,sCAEA,uBACE,uCACA,wBACA,wBAIJ,eACE,kDAIA,oBACE,+BAIJ,cACE,sBAGF,eACE,aAIJ,kBXljMa,sBWojMX,kBACA,uCACA,YACA,gBACA,qCAEA,YARF,SASI,uBAGF,kBACE,oBAGF,kBACE,YACA,0BACA,gBACA,mBAGF,YACE,gCACA,4BAGF,YACE,iCAGF,aACE,gBACA,qBACA,eACA,aACA,cAIJ,iBACE,YACA,gBACA,YACA,aACA,uBACA,mBACA,gBX5mMM,yDW+mMN,aAGE,gBACA,WACA,YACA,SACA,sBACA,CADA,gCACA,CADA,kBACA,gBXvnMI,uBW2nMN,iBACE,YACA,aACA,+BACA,iEACA,kBACA,wCACA,uBAGF,iBACE,WACA,YACA,MACA,OACA,uBAGF,iBACE,YACA,WACA,UACA,YACA,4BACA,6BAEA,UACE,8BAGF,UXxpMI,eW0pMF,gBACA,cACA,kBACA,2BAGF,iBACE,mCACA,qCAIJ,oCACE,eAEE,uBAGF,YACE,4BAKN,aXlqMwB,eWoqMtB,gBACA,gBACA,kBACA,qBACA,6BAEA,kBACE,wCAEA,eACE,6BAIJ,aACE,0BACA,mCAEA,oBACE,kBAKN,eACE,2BAEA,UACE,8FAEA,8BAEE,CAFF,sBAEE,wBAIJ,iBACE,SACA,UACA,yBAGF,eACE,aACA,kBACA,mBACA,6BAEA,mBACE,CADF,8BACE,CADF,gBACE,cACA,WACA,YACA,SACA,uBAIJ,iBACE,mBACA,YACA,gCACA,+BAEA,aACE,cACA,WACA,iBACA,gDAEA,kBACE,yBACA,wBAKN,YACE,uBACA,gBACA,iBACA,iCAEA,YACE,mBACA,iBACA,gBACA,8CAEA,wBACE,kBACA,uBACA,YACA,yCAGF,YACE,8BAIJ,WACE,4CAEA,kBACE,wCAGF,UACE,YACA,iCAGF,cACE,iBACA,WXtyMA,gBWwyMA,gBACA,mBACA,uBACA,uCAEA,aACE,eACA,cX/xMc,gBWiyMd,gBACA,uBACA,gCAKN,aACE,uBAIJ,eACE,cACA,iDAGE,qBACA,WXn0ME,gDWu0MJ,QACE,6BACA,kDAEA,aACE,yEAGF,uBACE,4DAGF,aXl1MU,yBWw1Md,cACE,gCAEA,cACE,cX70MkB,eW+0MlB,kCAEA,oBACE,cXl1MgB,qBWo1MhB,iBACA,gBACA,yCAEA,eACE,WXz2MF,iBWk3MN,ab92MgB,mBag3Md,gCACA,gBACA,aACA,eACA,eACA,qBAEA,oBACE,iBACA,eAIJ,YACE,mBACA,aACA,gCACA,0BAEA,eACE,qBAGF,aACE,cbx4MY,gBa04MZ,uBACA,mBACA,4BAEA,eACE,uBAGF,aXt4MkB,qBWw4MhB,eACA,gBACA,cACA,gBACA,uBACA,mBACA,qGAKE,yBACE,wBAMR,aACE,eACA,iBACA,gBACA,iBACA,mBACA,gBACA,cXh6MoB,0BWo6MtB,aACE,WACA,2CAEA,gCACE,yBACA,0CAGF,wBACE,eAMR,YACE,gCACA,CACA,iBACA,qBAEA,kBACE,UACA,uBAGF,aACE,CACA,sBACA,kBACA,eACA,uBAGF,oBACE,mBbn9MkB,kBaq9MlB,cACA,eACA,wBACA,wBAGF,aACE,CACA,0BACA,gBACA,8BAEA,eACE,aACA,2BACA,8BACA,uCAGF,cACE,cX/9MkB,kBWi+MlB,+BAGF,aXp+MoB,eWs+MlB,mBACA,gBACA,uBACA,kBACA,gBACA,YACA,iCAEA,UX9/ME,qBWggNA,oHAEA,yBAGE,0BAKN,qBACE,uBAIJ,kBACE,6BAEA,kBACE,oDAGF,eACE,6DAGF,UX1hNI,gBWgiNR,kBACE,eACA,aACA,qBACA,0BAEA,WACE,cACA,qCAEA,yBAJF,YAKI,4BAIJ,wBACE,cACA,kBACA,qCAEA,0BALF,UAMI,uBAIJ,qBACE,WACA,aACA,kBACA,eACA,iBACA,qBACA,gBACA,gBACA,gBACA,aACA,sBACA,6BAEA,aACE,gBACA,mBACA,mBACA,8BAGF,iBACE,SACA,WACA,cACA,mBb5kNgB,kBa8kNhB,cACA,eACA,4BAIJ,YACE,cX3kNoB,kBW6kNpB,WACA,QACA,mDAIJ,YACE,oDAGF,UACE,gBAGF,YACE,eACA,mBACA,gBACA,iBACA,wBACA,sBAEA,aACE,mBACA,SACA,kBACA,WACA,eACA,yBACA,CADA,qBACA,CADA,oBACA,CADA,gBACA,cACA,aACA,mBACA,2BACA,2CACA,6BAEA,aACE,aACA,WACA,YACA,iCAEA,aACE,SACA,WACA,YACA,eACA,gBACA,sBACA,sBACA,CADA,gCACA,CADA,kBACA,6BAIJ,aACE,cACA,eACA,gBACA,kBACA,gBACA,cXzoNkB,mFW6oNpB,kBAGE,4BACA,2CACA,wGAEA,aACE,6BAIJ,0BACE,2CACA,yBACA,yDAEA,aACE,uCAKN,UACE,oCAGF,WACE,8BAGF,aX5qNsB,SW8qNpB,eACA,WACA,cACA,cACA,YACA,aACA,mBACA,WACA,2BACA,2CACA,2GAEA,SAGE,cACA,4BACA,2CACA,qCAKF,SACE,OGxtNN,eACE,eACA,UAEA,kBACE,kBACA,cAGF,iBACE,cACA,mBACA,WACA,aACA,sBAEA,kBhBRkB,egBapB,iBACE,aACA,cACA,iBACA,eACA,gBACA,qBAEA,oBACE,qBACA,yBACA,4BACA,oEAGF,YAEE,kCAGF,aACE,gCAGF,aACE,sBACA,WACA,eACA,cdtCO,UcwCP,oBACA,gBdlDE,yBcoDF,kBACA,iBACA,sCAEA,oBhBlDgB,0BgBuDlB,cACE,wBAGF,YACE,mBACA,iBACA,cAIJ,oBACE,kBACA,yBACA,sBACA,WACA,YACA,cACA,kBACA,SACA,kBACA,sBACA,gBACA,mBACA,cACA,uBAEA,iBACE,qBAGF,oBd3FY,8EcgGZ,oBAGE,iBACA,gCAGF,mBACE,SACA,wCAGF,mBAEE,eAIJ,oBACE,WACA,gBACA,cACA,cAGF,aACE,qBACA,oBAEA,cACE,eAIJ,eACE,mBACA,chBjIc,agBqIhB,cACE,uBACA,UACA,SACA,SACA,chB1Ic,0BgB4Id,kBACA,mBAEA,oBACE,sCAGF,kCAEE,eAIJ,WACE,eACA,kBACA,eACA,6BAIJ,4BACE,gCAEA,YACE,2CAGF,4BACE,aACA,aACA,mBACA,mGAEA,YAEE,+GAEA,oBhBhLgB,sDgBsLpB,cACE,gBACA,iBACA,YACA,oBACA,chB7Lc,sCgBgMd,gCAGF,YACE,mBACA,8CAEA,aACE,wBACA,iBACA,oCAIJ,uBACE,CADF,oBACE,CADF,eACE,sBACA,eACA,cd5MS,qBc8MT,WACA,UACA,oBACA,qXACA,yBACA,kBACA,CACA,yBACA,mDAGF,aACE,cAIJ,ahBnOkB,qBgBsOhB,+BACE,6BAEA,2BACE,eChPN,k1BACE,aACA,sBACA,aACA,UACA,yBAGF,YACE,OACA,sBACA,yBACA,2BAEA,MACE,iBACA,qCAIJ,gBACE,YACE,cCtBJ,cACE,qBACA,chBSW,2BgBNX,qBAEE,iBACA,+BAGF,WACE,iBAIJ,sBACE,6BAEA,uBACE,2BACA,4BACA,mBhBHsB,4BgBOxB,oBACE,8BACA,+BACA,aACA,qBAIJ,YACE,8BACA,cACA,clB/BgB,ckBiChB,oBAGF,iBACE,OACA,kBACA,iBACA,gBACA,8BACA,eACA,0BAEA,aACE,6BAIJ,alBhDsB,mCkBmDpB,aACE,oDAGF,WACE,wBAIJ,iBACE,YACA,OACA,WACA,WACA,yBlBjEoB,uBkBsEpB,oBACE,WACA,eACA,yBAGF,iBACE,gBACA,oBAIJ,iBACE,aACA,gBACA,kBACA,gBhB5FM,sBgB8FN,sGAEA,+BAEE,oBAKF,2BACA,gBhBxGM,0BgB2GN,cACE,gBACA,gBACA,oBACA,cACA,WACA,gCACA,chBzGS,yBgB2GT,kBACA,4CAEA,QACE,2GAGF,mBAGE,wCAKN,cACE,6CAEA,SACE,kBACA,kBACA,qDAGF,SACE,WACA,kBACA,MACA,OACA,WACA,YACA,sCACA,mBACA,4BAIJ,SACE,kBACA,wBACA,gBACA,MACA,iCAEA,aACE,WACA,gBACA,gBACA,gBhBpKI,mBgByKR,iBACE,qBACA,YACA,wBAEA,UACE,YACA,wBAIJ,cACE,kBACA,iBACA,chBvKsB,mDgB0KtB,YACE,qDAGF,eACE,uDAGF,YACE,qBAIJ,YACE,YCrMF,qBACE,iBANc,cAQd,kBACA,sCAEA,WANF,UAOI,eACA,mBAIJ,iDACE,eACA,gBACA,gBACA,qBACA,cjBJsB,oBiBOtB,anBjBoB,0BmBmBlB,6EAEA,oBAGE,wCAIJ,ajBlBsB,oBiBuBtB,YACE,oBACA,+BAEA,eACE,yBAIJ,eACE,cjBhCsB,qBiBoCxB,iBACE,cjBrCsB,uBiByCxB,eACE,mBACA,kBACA,kBACA,yHAGF,4CAME,mBACA,oBACA,gBACA,cjBzDsB,qBiB6DxB,aACE,qBAGF,gBACE,qBAGF,eACE,qBAGF,gBACE,yCAGF,aAEE,qBAGF,eACE,qBAGF,kBACE,yCAMA,iBACA,iBACA,yDAEA,2BACE,yDAGF,2BACE,qBAIJ,UACE,SACA,SACA,gCACA,eACA,4BAEA,UACE,SACA,wBAIJ,UACE,yBACA,8BACA,CADA,iBACA,gBACA,mBACA,iEAEA,+BAEE,cACA,kBACA,gBACA,gBACA,cjBrIkB,iCiByIpB,uBACE,gBACA,gBACA,cnBxJY,qDmB4Jd,WAEE,iBACA,kBACA,qBACA,mEAEA,SACE,kBACA,iFAEA,gBACE,kBACA,6EAGF,iBACE,SACA,UACA,mBACA,gBACA,uBACA,+BAMR,YACE,oBAIJ,kBACE,eACA,mCAEA,iBACE,oBACA,8BAGF,YACE,8BACA,eACA,6BAGF,UACE,kDACA,eACA,iBACA,WjBpNI,iBiBsNJ,kBACA,qEAEA,aAEE,6CAIA,ajB9MoB,oCiBmNtB,4CACE,gBACA,eACA,iBACA,qCAGF,4BA3BF,iBA4BI,4BAIJ,iBACE,YACA,sBACA,mBACA,CACA,sBACA,0BACA,QACA,aACA,yCAEA,4CACE,eACA,iBACA,gBACA,cjB/OkB,mBiBiPlB,mBACA,gCACA,uBACA,mBACA,gBACA,wFAEA,eAEE,cACA,2CAGF,oBACE,2BAKN,iBACE,mCAEA,UACE,YACA,CACA,kBACA,uCAEA,aACE,WACA,YACA,mBACA,iCAIJ,cACE,mCAEA,aACE,WjBzSA,qBiB2SA,uDAGE,yBACE,2CAKN,aACE,cjBrSgB,kCiB6StB,iDAEE,CACA,eACA,eACA,iBACA,mBACA,cjBpToB,sCiBuTpB,anBjUkB,0BmBmUhB,kBAIJ,cACE,SACA,UACA,gBACA,uBACA,oBACA,kBACA,oBACA,cACA,kBAGF,4CACE,eACA,iBACA,gBACA,mBACA,cjB7UsB,wBiBgVtB,iDACE,cACA,eACA,gBACA,cACA,kBAIJ,4CACE,eACA,iBACA,gBACA,mBACA,cjB9VsB,kBiBmWtB,cjBnWsB,mCiBkWxB,4CACE,CACA,gBACA,gBACA,mBACA,cjBvWsB,kBiB4WtB,cjB5WsB,kBiBqXtB,cjBrXsB,mCiBoXxB,4CACE,CACA,gBACA,gBACA,mBACA,cjBzXsB,kBiB8XtB,cjB9XsB,mCiBsYxB,gBAEE,mDAEA,2BACE,mDAGF,2BACE,kBAIJ,eACE,kBAGF,kBACE,yCAGF,cAEE,kBAGF,UACE,SACA,SACA,0CACA,cACA,yBAEA,UACE,SACA,iDAIJ,YAEE,+BAGF,kBjB1bW,kBiB4bT,kBACA,gBACA,sBACA,oCAEA,UACE,aACA,2BACA,iBACA,8BACA,mBACA,uDAGF,YACE,yBACA,qBACA,mFAEA,aACE,eACA,qCAGF,sDAVF,UAWI,8BACA,6CAIJ,MACE,sBACA,qCAEA,2CAJF,YAKI,sBAKN,iBACE,yBAEA,WACE,WACA,uBACA,4BAIJ,iBACE,mBACA,uCAEA,eACE,mCAGF,eACE,cACA,qCAGF,eACE,UACA,mDAEA,kBACE,aACA,iBACA,0FAKE,oBACE,gFAIJ,cACE,qDAIJ,aACE,cACA,6CAGF,UACE,YACA,0BACA,mDAGF,cACE,4DAEA,cACE,qCAKN,oCACE,eACE,sCAIJ,2BA7DF,iBA8DI,mFAIJ,qBAGE,mBjBnjBS,kBiBqjBT,kCACA,uBAGF,YACE,kBACA,WACA,YACA,2BAEA,YACE,WACA,uCAKF,YACE,eACA,mBACA,mBACA,qCAGF,sCACE,kBACE,uCAIJ,ajB3kBsB,qCiB+kBtB,eACE,WjBjmBE,gBiBmmBF,2CAEA,ajBrlBkB,gDiBwlBhB,ajBvlBkB,+CiB6lBtB,eACE,qBAIJ,kBACE,yBAEA,aACE,SACA,eACA,YACA,kBACA,qCAIJ,gDAEI,kBACE,yCAGF,eACE,gBACA,WACA,kBACA,uDAEA,iBACE,sCAMR,8BACE,aACE,uCAEA,gBACE,sDAGF,kBACE,6EAIJ,aAEE,qBAIJ,WACE,UAIJ,mBACE,qCAEA,SAHF,eAII,kBAGF,YACE,uBACA,mBACA,aACA,qBAEA,SjBvrBI,YiByrBF,qCAGF,gBAXF,SAYI,mBACA,sBAIJ,eACE,uBACA,gBACA,gBACA,uBAGF,eACE,gBACA,0BAEA,YACE,yBACA,gBACA,eACA,cjBjsBkB,6BiBqsBpB,eACE,iBACA,+BAGF,kBjBjtBS,aiBmtBP,0BACA,aACA,uCAEA,YACE,gCAIJ,cACE,gBACA,uDAEA,YACE,mBACA,iDAGF,UACE,YACA,0BACA,gCAIJ,YACE,uCAEA,4CACE,eACA,gBACA,cACA,qCAGF,cACE,cjBhvBgB,uFiBsvBtB,eACE,cASA,CjBhwBoB,2CiB6vBpB,iBACA,CACA,kBACA,gBAGF,eACE,cACA,aACA,kDACA,cACA,qCAEA,eAPF,oCAQI,cACA,8BAEA,UACE,aACA,sBACA,0CAEA,OACE,cACA,2CAGF,YACE,mBACA,QACA,cACA,qCAIJ,UACE,2BAGF,eACE,sCAIJ,eAtCF,UAuCI,6BAEA,aACE,gBACA,gBACA,2GAEA,eAGE,uFAIJ,+BAGE,2BAGF,YACE,gCAEA,eACE,qEAEA,eAEE,gBACA,2CAGF,eACE,SAQZ,iBACE,qBACA,iBAGF,aACE,kBACA,aACA,UACA,YACA,cjB71BsB,qBiB+1BtB,eACA,qCAEA,gBAVF,eAWI,WACA,gBACA,cnBj3Bc,SoBNlB,UACE,eACA,iBACA,yBACA,qBAEA,WAEE,iBACA,mBACA,6BACA,gBACA,mBACA,oBAGF,qBACE,gCACA,aACA,gBACA,oBAGF,eACE,qEAGF,kBlBhBW,UkBqBX,apBxBoB,0BoB0BlB,gBAEA,oBACE,eAIJ,eACE,CAII,4HADF,eACE,+FAOF,sBAEE,yFAKF,YAEE,gCAMJ,kBlBzDS,6BkB2DP,gCACA,4CAEA,qBACE,8BACA,2CAGF,uBACE,+BACA,0BAKN,qBACE,gBAIJ,aACE,mBACA,MAGF,+CACE,0BAGF,sBACE,SACA,aACA,8CAGF,oBAEE,qBACA,iBACA,eACA,clB5FsB,gBkB8FtB,0DAEA,UlBhHM,wDkBoHN,eACE,iBACA,sEAGF,cACE,yCAKF,YAEE,yDAEA,qBACE,iBACA,eACA,gBACA,qEAEA,cACE,2EAGF,YACE,mBACA,uFAEA,YACE,qHAOJ,sBACA,cACA,uBAIJ,wBACE,mBlBvJS,sBkByJT,YACA,mBACA,gCAEA,gBACE,mBACA,oBAIJ,YACE,yBACA,aACA,mBlBtKS,gCkByKT,aACE,gBACA,mBAIJ,wBACE,aACA,mBACA,qCAEA,wCACE,4BACE,0BAIJ,kBACE,iCAGF,kBlB9LS,uCkBiMP,kBACE,4BAIJ,gBACE,oBACA,sCAEA,SACE,wCAGF,YACE,mBACA,mCAGF,aACE,aACA,uBACA,mBACA,kBACA,6CAEA,UACE,YACA,kCAIJ,aACE,mCAGF,aACE,iBACA,clB/NgB,gBkBiOhB,mCAIJ,QACE,WACA,qCAEA,sBACE,gBACA,qCAOJ,4FAFF,YAGI,gCAIJ,aACE,uCAEA,iBACE,sCAGF,eACE,4BAIJ,wBACE,aACA,gBACA,qCAEA,2BALF,4BAMI,sCAIJ,+CACE,YACE,iBC7RN,YACE,uBACA,WACA,iBACA,iCAEA,gBACE,gBACA,oBACA,cACA,wCAEA,YACE,yBACA,mBnBPO,YmBSP,yBAIJ,WAvBc,UAyBZ,oBACA,iCAEA,YACE,mBACA,YACA,uCAEA,aACE,yCAEA,oBACE,aACA,2CAGF,SnBxCA,YmB0CE,kBACA,YACA,uCAIJ,aACE,cnBjCgB,qBmBmChB,cACA,eACA,aACA,0HAIA,kBAGE,+BAKN,aACE,iBACA,YACA,aACA,qCAGF,sCACE,YACE,6BAIJ,eACE,0BACA,gBACA,mBACA,qCAEA,2BANF,eAOI,+BAGF,aACE,aACA,cnB3EgB,qBmB6EhB,0BACA,2CACA,0BACA,mBACA,gBACA,uBACA,mCAEA,gBACE,oCAGF,UnBzGA,yBmB2GE,0BACA,2CACA,uCAGF,kBACE,sBACA,+BAIJ,kBACE,wBACA,SACA,iCAEA,QACE,kBACA,6DAIJ,UnBjIE,yBFMc,gBqB8Hd,gBACA,mEAEA,qBACE,6DAKN,yBACE,iCAKF,UACA,gBAEA,sCAGF,uCACE,YACE,iCAGF,WA/JY,cAiKV,sCAIJ,gCACE,UACE,0BAMF,2BACA,qCAEA,wBALF,cAMI,CACA,sBACA,kCAGF,YACE,oBAEA,gCACA,0BAEA,eAEA,mBACA,8BACA,mCAEA,eACE,kBACA,yCAGF,mBACE,4DAEA,eACE,qCAIJ,gCAzBF,eA0BI,iBACA,6BAIJ,anBnMsB,emBqMpB,iBACA,gBACA,qCAEA,2BANF,eAOI,6BAIJ,anB9MsB,emBgNpB,iBACA,gBACA,mBACA,4BAGF,wBACE,eACA,gBACA,cnB1NkB,mBmB4NlB,kBACA,gCACA,4BAGF,cACE,cnBjOoB,iBmBmOpB,gBACA,0CAGF,UnBxPI,gBmB0PF,uFAGF,eAEE,gEAGF,aACE,4CAGF,cACE,gBACA,WnBxQE,oBmB0QF,iBACA,gBACA,gBACA,2BAGF,cACE,iBACA,cnBjQoB,mBmBmQpB,kCAEA,UnBtRE,gBmBwRA,CAII,2NADF,eACE,4BAMR,UACE,SACA,SACA,0CACA,cACA,mCAEA,UACE,SACA,qCAKN,eA9SF,aA+SI,iCAEA,YACE,yBAGF,UACE,UACA,YACA,iCAEA,YACE,4BAGF,YACE,8DAGF,eAEE,gCACA,gBACA,0EAEA,eACE,+BAIJ,eACE,6DAGF,2BrB7UgB,YqBoVtB,UACE,SACA,cACA,WACA,sDAKA,anBnVsB,0DmBsVpB,arBhWkB,4DqBqWpB,anB1Wc,gBmB4WZ,4DAGF,anB9WU,gBmBgXR,0DAGF,arBjXgB,gBqBmXd,0DAGF,anBtXU,gBmBwXR,UAIJ,YACE,eACA,yBAEA,aACE,qBACA,oCAEA,kBACE,4BAGF,cACE,gBACA,+BAEA,oBACE,iBACA,gCAIJ,eACE,yBACA,eACA,CAII,iNADF,eACE,6CAKN,aACE,mBACA,2BAGF,oBACE,cnBxZkB,qBmB0ZlB,yBACA,eACA,gBACA,gCACA,iCAEA,UnBhbE,gCmBkbA,oCAGF,arB/agB,gCqBibd,CAkBJ,gBAIJ,aACE,iBACA,eACA,sBAGF,aACE,eACA,cACA,wBAEA,aACE,kBAIJ,YACE,eACA,mBACA,wBAGF,YACE,WACA,sBACA,aACA,+BAEA,aACE,qBACA,gBACA,eACA,iBACA,cnB7dsB,CmBkelB,4MADF,eACE,sCAKN,aACE,gCAIJ,YAEE,mBACA,kEAEA,UACE,kBACA,4BACA,gFAEA,iBACE,kDAKN,aAEE,aACA,sBACA,4EAEA,cACE,WACA,kBACA,mBACA,uEAIJ,cAEE,iBAGF,YACE,eACA,kBACA,2CAEA,kBACE,eACA,8BAGF,kBACE,+CAGF,gBACE,uDAEA,gBACE,mBACA,YACA,YAKN,kBACE,eACA,cAEA,arBvjBoB,qBqByjBlB,oBAEA,yBACE,SAKN,aACE,YAGF,gBACE,eACA,mBnBpkBW,gCmBskBX,uBAEA,eACE,oBAGF,YACE,2BACA,mBACA,cnBxkBoB,emB0kBpB,eACA,oBAGF,iBACE,4BAEA,aACE,SACA,kBACA,WACA,YACA,qBAIJ,2BACE,mBAGF,oBACE,uBAGF,arB9mBgB,sDqBknBhB,anBrmBwB,qBmBymBtB,gBACA,yDAIJ,oBAIE,cnBlnBwB,iGmBqnBxB,eACE,yIAIA,4BACE,cACA,iIAGF,8BACE,CADF,sBACE,WACA,sBAKN,YAEE,mBACA,sCAEA,aACE,CACA,gBACA,kBACA,0DAIA,8BACE,CADF,sBACE,WACA,gBAKN,kBACE,8BACA,yBAEA,yBnB9qBc,yBmBkrBd,yBACE,wBAGF,yBnBnrBU,wBmBwrBR,2BACA,eACA,iBACA,4BACA,kBACA,gBACA,0BAEA,anBprBoB,uBmB0rBpB,wBACA,qBAGF,arB1sBgB,cqB+sBlB,kBnB1sBa,kBmB4sBX,mBACA,uBAEA,YACE,8BACA,mBACA,aACA,gCAEA,SACE,SACA,gDAEA,aACE,8BAIJ,aACE,gBACA,cnBztBkB,yBmB2tBlB,iBACA,gCAEA,aACE,qBACA,iHAEA,aAGE,mCAIJ,anBvvBM,6BmB8vBR,YACE,2BACA,6BACA,mCAEA,kBACE,gFAGF,YAEE,cACA,sBACA,YACA,cnB9vBgB,mLmBiwBhB,kBAEE,gBACA,uBACA,sCAIJ,aACE,6BACA,4CAEA,arBzxBU,iBqB2xBR,gBACA,wCAIJ,aACE,sBACA,WACA,aACA,qBACA,cnBzxBgB,WmBgyBxB,kBAGE,0BAFA,eACA,uBASA,CARA,eAGF,oBACE,gBACA,CAEA,qBACA,oBAGF,YACE,eACA,CACA,kBACA,wBAEA,qBACE,cACA,mBACA,aACA,0FAGF,kBAEE,kBACA,YACA,6CAGF,QACE,SACA,+CAEA,aACE,sEAGF,uBACE,yDAGF,anB71BY,8CmBk2Bd,qBACE,aACA,WnBr2BI,cmB02BR,iBACE,qBAGF,wBACE,kBACA,2BAEA,cACE,mBnB12BS,gCmB42BT,kCAEA,cACE,cACA,gBACA,eACA,gBACA,cnB32BoB,qBmB62BpB,mBACA,uHAEA,UnBj4BE,iCmBw4BJ,cACE,crBr4BY,uCqBy4Bd,YACE,8BACA,mBACA,sCAGF,eACE,sBCt5BN,YACE,eACA,CACA,kBACA,0BAEA,qBACE,iBACA,cACA,mBACA,yDAEA,YAEE,mBACA,kBACA,sBACA,YACA,4BAGF,oBACE,cACA,cACA,qGAEA,kBAGE,sDAKN,iBAEE,gBACA,eACA,iBACA,WpBrCI,6CoBuCJ,mBACA,iBACA,4BAGF,cACE,6BAGF,cACE,cpBjCoB,kBoBmCpB,gBACA,qBAIJ,YACE,eACA,cACA,yBAEA,gBACE,mBACA,6BAEA,aACE,sCAIJ,apBrDwB,gBoBuDtB,qBACA,UC3EJ,aACE,gCAEA,gBACE,eACA,mBACA,+BAGF,cACE,iBACA,8CAGF,aACE,kBACA,wBAGF,gBACE,iCAGF,aACE,kBACA,uCAGF,oBACE,gDAGF,SACE,YACA,8BAGF,cACE,iBACA,mEAGF,aACE,kBACA,2DAGF,cAEE,gBACA,mFAGF,cACE,gBACA,mCAGF,aACE,iBACA,yBAGF,kBACE,kBACA,4BAGF,UACE,UACA,wBAGF,aACE,kCAGF,MACE,WACA,cACA,mBACA,2CAGF,aACE,iBACA,0CAGF,gBACE,eACA,mCAGF,WACE,sCAGF,gBACE,gBACA,yCAGF,UACE,iCAGF,aACE,iBACA,0BAGF,SACE,WACA,0DAGF,iBAEE,mBACA,4GAGF,iBAEE,gBACA,uCAGF,kBACE,eACA,2BAGF,aACE,kBACA,wCAGF,SACE,YACA,yDAGF,SACE,WACA,CAKA,oFAGF,UACE,OACA,uGAGF,UAEE,uCAIA,cACE,iBACA,kEAEA,cACE,gBACA,qCAKN,WACE,eACA,iBACA,uCAGF,WACE,sCAGF,aACE,kBACA,0CAGF,gBACE,eACA,uDAGF,gBACE,2CAGF,cACE,iBACA,YACA,yEAGF,aAEE,iBACA,iBAGF,wBACE,iBAGF,SACE,oBACA,yBAGF,aACE,8EAGF,cAEE,gBACA,oDAGF,cACE,mBACA,gEAGF,iBACE,gBACA,CAMA,8KAGF,SACE,QACA,yDAGF,kBACE,eACA,uDAGF,kBACE,gBACA,qDAGF,SACE,QACA,8FAGF,cAEE,mBACA,4CAGF,UACE,SACA,kDAEA,UACE,OACA,+DACA,8BAIJ,sXACE,uCAGF,gBAEE,kCAGF,cACE,iBACA,gDAGF,UACE,UACA,gEAGF,aACE,uDAGF,WACE,WACA,uDAGF,UACE,WACA,uDAGF,UACE,WACA,kDAGF,MACE,0CAGF,iBACE,yBACA,qDAGF,cACE,iBACA,qCAGF,kCACE,gBAEE,kBACA,2DAEA,gBACE,mBACA,uEAKF,gBAEE,kBACA,gFAKN,cAEE,gBACA,6CAKE,eACE,eACA,sDAIJ,aACE,kBACA,4DAKF,cACE,gBACA,8DAGF,gBACE,eACA,mCAIJ,aACE,kBACA,iBACA,kCAGF,WACE,mCAGF,WACE,oCAGF,cACE,gBACA,gFAGF,cACE,mBACA,+DAGF,SACE,QACA,kkEC7ZJ,kIACE,CADF,sIACE,qBACA,sCxB6EF,QACE,qBACE,gBACA,SAGF,SACE,gBACA,gBACA,+BAIJ,eAEE,sBACA,kBACA,gBACA,kBACA,kCACA,4BACA,gEAGF,gBAEE,uBACA,2BACA,qBAGF,eACE,UACA,wDAGF,qBAEE,sBACA,MAKF,cACE,oDACA,WACA,kCAGF,eAGE,cAGF,UACE,sBACA,WAGF,kBAzIW,sGAmBT,gBAIA,YAqHA,iBAGF,UACE,CAEA,oBACA,CADA,mBACA,CADA,4BACA,WACA,YACA,wBAGF,qGA7GE,eAIA,gBACA,WA0GA,mCAGF,eACE,WACA,gBACA,eACA,UACA,cACA,kBACA,QACA,4BAGF,iBACE,0BACA,YACA,cA3KS,yDA8KT,4BACA,uBACA,4BACA,yBACA,wBAGF,gBACE,eACA,mBAvLS,eA2LX,aACI,YACA,kBAEA,YACA,UACA,YACA,aACA,iGACA,4BACA,iCACA,UACA,gBAGJ,eACE,UACA,6BAGF,SACE,SAGF,gBACE,qBAGF,kBAvNW,CAcT,eACA,6CA2MA,CA3MA,kBA2MA,CA3MA,sBA2MA,CAMA,uCAHF,UACE,gBACA,mBAYA,CAXA,eAGF,WACE,eACA,CAvNA,eACA,6CAyNA,CAzNA,kBAyNA,CAzNA,sBAyNA,CAEA,oBACA,gCAGF,kBA3OsB,uCA+OtB,YACE,uBAEF,gBACE,mBAnPoB,4CAuPtB,UACE,yBAGF,eACE,eACA,wBAGF,kBAnQW,WAqQT,cACA,eACA,gBACA,cACA,eACA,sGAvPA,gBAIA,8BAsPA,UACE,mEAIJ,qGAvOE,eAIA,gBACA,yBAoOA,6BAMA,eACA,eAIA,iDARF,kBAvRW,WAyRT,YACA,CAEA,qGAzQA,gBAIA,eAuQA,gBAUA,kCAGF,iBACE,UACA,UACA,gBACA,eACA,cACA,2BAGF,cACE,gBACA,6BAGF,8BACE,gCACA,mCAGF,kBA9TW,WAgUT,oCAGF,UACE,oDAGF,yBACE,kBACA,kBACA,YACA,qBAGF,wBA9UW,CAcT,eACA,CAkUA,4CACA,CADA,kBACA,CADA,kBACA,2BAGF,UACE,gBACA,eACA,kBACA,UACA,SACA,yBA3VS,qBA6VT,cACA,gBACA,6CAGF,UACE,gBACA,kCAGF,WACE,iCAEF,WACE,iBAGF,gBACE,mCAIA,qBACA,CAvVA,4CACA,CADA,kBACA,CADA,gBACA,gBACA,WAwVA,YACA,sEAGF,qBACE,yCAGF,QACE,iBACA,kDAGF,SACE,qCAGF,YACE,mCAGF,eACE,aACA,WAGF,wBAjZW,sGAmBT,gBAIA,YA6XA,iBAGF,oBACE,WACA,CAzWA,+BA4WF,qGAjXE,eAIA,gBAsXA,CArXA,cAgXF,UACE,sBACA,CAlXA,cAoXA,YACA,+FAGF,UAEE,gCACA,CAIA,iIAGF,gBACE,oBAGF,wBAtbW,WAwbT,sGAraA,gBAIA,wBAqaF,0lBACE,wBAEA,uCAGF,kBAlcW,WAqcT,kBAGF,yBACE,WACA,SAraA,4CACA,CADA,kBACA,CADA,gBACA,gBACA,sBAwaA,CACA,mBACA,mBACA,uBAGF,wBArdW,kBAydX,cACE,uEAGF,aAEE,qBAGF,qBACE,kBACA,YACA,UACA,mBAteS,uBAweT,CAEA,eACA,iCACA,8BACA,iBACA,sCAGF,qBACE,4BAGF,WACE,8BAGF,gBACE,kBACA,2CAEA,cACE,kCAGJ,UACE,CAlgBS,+DAugBT,kBAvgBS,4DA2gBT,eACE,wBACA,gCAIJ,iBACE,oDAGF,cACE,kBAGF,eACE,4BACA,WACA,0BACA,YACA,gCAGF,aACE,uCAGF,UACE,gBACA,0GAlgBA,4CACA,CADA,kBACA,CADA,gBACA,gBACA,uBAugBA,CAvgBA,cAugBA,6CACA,CADA,oCACA,8BAGF,wBAljBW,SAojBT,iCACA,kBACA,mBACA,iBACA,cAEF,kBA1jBW,CAaT,4CACA,CADA,kBACA,CADA,gBACA,gBACA,UA8iBA,iBAGA,0HAFA,aAIE,qBAriBF,4CACA,CADA,kBACA,CADA,gBACA,gBACA,kCA2iBF,kBACE,eACA,sDAGF,sBAEE,YACA,CEjlBU,2IFslBV,aEtlBU,0BF2lBZ,kBA5lBW,CAaT,4CACA,CADA,kBACA,CADA,gBACA,gBACA,mBAglBA,iCAlkBA,4CACA,CADA,kBACA,CADA,gBACA,gBACA,mBAukBF,aArmBkB,uCAymBlB,gBACE,sBACA,mBACA,0BAGF,aACE,uCAGF,gBACE,mBACA,cAGF,eACE,gBACA,sBACA,WACA,oBAGF,qBACE,qBAGF,UACE,0BACA,gBACA,YAGF,UACE,gBACA,CA5oBS,qGAmBT,gBAIA,CAwnBA,eACA,6BAJA,kBA5oBS,CAuBT,UA6nBE,2BAIJ,UACC,4DAGD,UACE,gBACA,iCAGF,UACE,UAGF,gCACE,0GAGF,kBAzqBW,sGAmBT,gBAIA,sHAupBF,kBA9qBW,wHAkrBX,qGAvoBE,eAIA,gBACA,gDAsoBF,UACE,eAGF,yBACE,WACA,wBAGF,UACE,eACA,6BAGF,eACE,iBAGF,kBAxsBW,CAaT,+BACA,gBACA,qBA4rBA,gBACA,mBACA,6CACA,CADA,+BACA,CADA,gBACA,cAGF,UACE,sGA/rBA,gBAIA,YA6rBA,WACA,cACA,iCAGF,eACE,WACA,gBACA,eACA,UACA,cACA,kBACA,QACA,0BAIF,iBACE,iBACA,WACA,YACA,cAzuBS,yDA4uBT,4BACA,uBACA,4BACA,yBACA,yBAGF,4BACE,qCAGF,8YACE,4BACA,uBACA,4BACA,yBACA,iBACA,SAOF,kBApwBW,CAswBT,WACA,iCACA,CACA,oBACA,CADA,iCACA,CADA,sBACA,gBACA,eAIA,UACA,CA3uBA,4CACA,CADA,kBACA,CADA,gBACA,gBACA,oCAuuBF,qBAOE,gBAGF,gBACE,WACA,gBACA,sBAvxBqB,sBAyxBrB,mBAEA,UACE,oBACA,gBACA,yBAIJ,wBAtyBW,WAwyBT,iCACA,0BAGF,UACE,sOAGF,wBA7yBsB,WAkzBpB,mBAGF,UACE,0BAEA,SACE,yBAGF,UACE,sCAIJ,wBAp0BW,CAu0BT,yBACA,CADA,2BACA,iBAGF,UACE,wBAGF,UACE,gBACA,mFA5yBA,4CACA,CADA,kBACA,CADA,gBACA,gBACA,+CAmzBF,eACE,gCAGF,eACE,gCACA,mBACA,+BAGF,6BACE,+BACA,8CAGF,wBAz2BW,0BA22BT,eACA,gBACA,wBAGF,wBAh3BW,gBAk3BT,iBACA,kCAGF,8BACE,4HAGF,kBA13BW,uEA+3BX,aA93BkB,mDAk4BlB,kBAn4BW,iBAs4BT,yGAGF,kBAt4BsB,4LA24BtB,gBAKE,WACA,sGAj4BA,gBAIA,mBAvBS,oCAy5BX,UACE,2CAGF,eACE,+BAGF,cACE,gBACA,cACA,kBACA,UACA,yBAt6BS,eAw6BT,cACA,wBAGF,iBACE,iBACA,0BACA,yBA/6BS,WAi7BT,0BAGF,UACE,+BAGF,UACE,0BACA,iDA75BA,4CACA,CADA,kBACA,CADA,gBACA,gBACA,mBAg6BA,cACA,iCAGF,eACE,0BACA,yBAr8BS,YAu8BT,sBACA,8CAGF,cACE,gBACA,2BACA,qDAGF,WACE,eACA,gBACA,WACA,gDAGF,YACE,8BAGF,SACE,2BAGF,gBACE,gBACA,yBAl+BS,sBAo+BT,uBACA,6BAIF,UACE,sBACA,CACA,qGAj8BA,eAIA,gBACA,qCAg8BF,gCACE,qCAGF,UACE,gBACA,kBAGF,wBAz/BW,kBA2/BT,0BACA,SA5/BS,qGAmBT,CAIA,eA2+BA,WACA,gBACA,sDALF,wBA//BW,gBA0gCT,qGA/9BA,eAIA,gBACA,kBA89BA,UACE,8BACA,yBAEA,qGA//BF,gBAIA,kBAkgCF,wBAzhCW,sGA2CT,CAIA,eACA,eA4+BA,yBAGF,eACE,WACA,gBACA,eACA,UACA,kBACA,cACA,kBACA,UACA,kBAGF,iBACE,iBACA,WACA,YACA,cA/iCS,+YAkjCT,4BACA,uBACA,4BACA,yBACA,oBAGF,wBAzjCW,WA2jCT,iCACA,oBACA,eACA,cAGF,4BACE,WACA,oBACA,wBAjkCoB,WAmkClB,8CAKF,WACE,SACA,UACA,wCAMA,iBACA,qFAJF,yBACE,4BACA,6BAOE,0CAGF,WACE,WACA,CAMJ,4FACA,yDAGA,wGACA,yDAGA,wEACA,yDAGA,gFACA,yDAGA,sEACA,0DAGA,0FACA,0DAGA,gGACA,0DAGA,wEACA,0DAGA,sEACA,0DAGA,4FACA,0DAGA,wEACA,0DAGA,8EACA,mFAGF,YACE,kCAGF,qBACE,gBACA,eACA,WACA,iBACA,kBACA,mBACA,OAEA,aACA,cACA,kBACA,yBACA,WACA,YACA,CAIA,wBACA,0BACA,2BAjqCA,4CACA,CADA,kBACA,CADA,gBACA,gBACA,yBAfS,yCAsrCX,YACE,yBAGF,wBA1rCW,kBA8rCX,wBACE,4CAGF,UACE,6BAGF,yBACE,WACA,YACA,iBAGF,wBA5sCW,SA8sCT,8BACA,8CAGF,UACE,YACA,gCAGF,UACE,gBACA,kCAGF,UACE,sBAGF,YACE,2BAGF,yBACE,kCAGF,qGA7rCE,eAIA,gBACA,wDA4rCF,eAxuCuB,gBA2uCrB,sBACA,iBACA,kBAGF,4BACE,yBAGF,YACE,gCAGF,UACE,sGAltCA,eAIA,gBACA,8CAitCF,sBACE,oDAGF,sBACE,WACA,0BACA,0CAGF,oBAGE,2FAGF,UACE,4GAGF,qBAII,qBACA,sBACA,yCAGJ,eACI,8BAGJ,iBACI,SACA,iDAGJ,iBACI,SACA,mCAGJ,kBACI,uBAGJ,iBACI,0BAGJ,iBACI,kBAGJ,iBACI,0BAGJ,iBACI,SACA,2GAGJ,qGA9yCE,gBAIA,mBAvBS,2FAu0CX,sBAIE,cACA,mBAz0CoB,WA20CpB,gBACA,iBACA,qBAGF,4BACE,0CAGF,eACE,gBACA,oFAGF,kBA51CW,iBA81CT,sDAGF,kBA91CsB,WAg2CpB,gBACA,YACA,eACA,gBACA,CAKE,+RAEA,UAGE,CAj0CJ,gMAo0CE,qGAz0CF,eAIA,gBACA,uHA00CF,eAEE,WA50CA,2CAi1CF,oQAEE,uBAGF,iBACE,MACA,wBACA,WACA,yBAv4CoB,eAy4CpB,gBACA,WACA,WACA,cACA,CACA,wBACA,sBACA,gBAGF,iBACE,mBAv5CS,sGAmBT,gBAIA,WAm4CA,YACA,iBACA,WACA,iBACA,sBACA,gBACA,sCAGF,eACE,UACE,YACA,kBACA,sCAIJ,eACE,WACE,YACA,0BACA,SACA,kCAIJ,eACE,YACA,cACA,WACA,iCAGF,aACE,wBACA,CAh7CA,4CACA,CADA,kBACA,CADA,gBACA,gBACA,kBAg7CA,iBACA,kBACA,mBACA,sBACA,yBAGF,wBAt8CW,WAw8CT,eACA,gBACA,sBACA,kBACA,yBAGF,eACE,mBAh9CS,WAk9CT,WACA,YACA,oBACA,+BAGF,iBACE,QACA,SACA,WACA,YACA,SACA,4BAGF,kBAj+CW,CAm+CT,gBACA,WACA,+BAEA,oBACE,4EAEA,WAEE,2BACA,sCAt9CJ,UA69CI,wEAJF,iBACE,sGA99CJ,gBAIA,CA49CI,WASA,CARA,kCAGF,oBACE,CAEA,SAEA,iCAGF,oBACE,qIA58CJ,gBAMA,2BACA,4BACA,gBAs8CI,SACA,WACA,wBACA,0CAEA,kBAvgDK,WAygDH,gBACA,mBACA,uCAGF,kBA9gDK,WAghDH,kCAIJ,uBACE,uBACA,kBACA,UACA,SACA,UACA,qCAEA,kBA5hDK,qBA8hDH,wBACA,uCAEA,kBAjiDG,qIAoDT,gBAMA,2BACA,4BACA,WAw+CQ,gBACA,kBACA,UACA,gDAEA,kBAziDC,WA2iDC,mBACA,gBACA,kBACA,iBACA,kBACA,kBACA,UACA,4DAEA,aACE,sDAGF,sBACE,WACA,6CAIJ,kBA9jDC,WAgkDC,sCAQZ,iCACE,gBACE,yBAGF,mBACE,sCAIJ,iCACE,eACE,yBAKE,gBACA,WACA,YACA,iCAEF,aACE,WACA,0BACA,iBAKN,qBAlmDuB,WAomDrB,sBACA,gBACA,kBACA,MACA,OACA,WACA,sBAGF,qBACE,CA7kDA,4CACA,CADA,kBACA,CADA,gBACA,gBACA,weA+kDF,UAeE,qEAGF,qBAEE,sJAGF,UAKE,sBACA,CA9mDA,4CACA,CADA,kBACA,CADA,gBACA,gBACA,4WA+mDA,qBACE,qEAIJ,kBA3pDW,sGAmBT,gBAIA,WA0oDA,gBACA,uFAEA,kBApqDS,4CAyqDX,eArqDuB,WAwqDrB,iBACA,kBACA,sBACA,gDAEA,UACE,0BACA,gGAIJ,kBAvrDW,yBA8rDX,yBACE,YACA,kCAGF,UACE,sBACA,kBACA,CAIA,4CACA,CADA,kBACA,CADA,gBACA,WACA,YACA,qBACA,sBACA,iBACA,2CAGF,qBACE,gCACA,8FAGF,UAGE,kCACA,ooB","file":"skins/vanilla/win95/common.css","sourcesContent":["@font-face{font-family:\"premillenium\";src:url(\"~fonts/premillenium/MSSansSerif.ttf\") format(\"truetype\")}html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:\"\";content:none}table{border-collapse:collapse;border-spacing:0}html{scrollbar-color:#192432 rgba(0,0,0,.1)}::-webkit-scrollbar{width:12px;height:12px}::-webkit-scrollbar-thumb{background:#192432;border:0px none #fff;border-radius:50px}::-webkit-scrollbar-thumb:hover{background:#1c2938}::-webkit-scrollbar-thumb:active{background:#192432}::-webkit-scrollbar-track{border:0px none #fff;border-radius:0;background:rgba(0,0,0,.1)}::-webkit-scrollbar-track:hover{background:#121a24}::-webkit-scrollbar-track:active{background:#121a24}::-webkit-scrollbar-corner{background:transparent}body{font-family:\"mastodon-font-sans-serif\",sans-serif;background:#06090c;font-size:13px;line-height:18px;font-weight:400;color:#fff;text-rendering:optimizelegibility;font-feature-settings:\"kern\";text-size-adjust:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-tap-highlight-color:transparent}body.system-font{font-family:system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"Oxygen\",\"Ubuntu\",\"Cantarell\",\"Fira Sans\",\"Droid Sans\",\"Helvetica Neue\",\"mastodon-font-sans-serif\",sans-serif}body.app-body{padding:0}body.app-body.layout-single-column{height:auto;min-height:100vh;overflow-y:scroll}body.app-body.layout-multiple-columns{position:absolute;width:100%;height:100%}body.app-body.with-modals--active{overflow-y:hidden}body.lighter{background:#121a24}body.with-modals{overflow-x:hidden;overflow-y:scroll}body.with-modals--active{overflow-y:hidden}body.player{text-align:center}body.embed{background:#192432;margin:0;padding-bottom:0}body.embed .container{position:absolute;width:100%;height:100%;overflow:hidden}body.admin{background:#0b1016;padding:0}body.error{position:absolute;text-align:center;color:#9baec8;background:#121a24;width:100%;height:100%;padding:0;display:flex;justify-content:center;align-items:center}body.error .dialog{vertical-align:middle;margin:20px}body.error .dialog__illustration img{display:block;max-width:470px;width:100%;height:auto;margin-top:-120px}body.error .dialog h1{font-size:20px;line-height:28px;font-weight:400}button{font-family:inherit;cursor:pointer}button:focus{outline:none}.app-holder,.app-holder>div,.app-holder>noscript{display:flex;width:100%;align-items:center;justify-content:center;outline:0 !important}.app-holder>noscript{height:100vh}.layout-single-column .app-holder,.layout-single-column .app-holder>div{min-height:100vh}.layout-multiple-columns .app-holder,.layout-multiple-columns .app-holder>div{height:100%}.error-boundary,.app-holder noscript{flex-direction:column;font-size:16px;font-weight:400;line-height:1.7;color:#e25169;text-align:center}.error-boundary>div,.app-holder noscript>div{max-width:500px}.error-boundary p,.app-holder noscript p{margin-bottom:.85em}.error-boundary p:last-child,.app-holder noscript p:last-child{margin-bottom:0}.error-boundary a,.app-holder noscript a{color:#00007f}.error-boundary a:hover,.error-boundary a:focus,.error-boundary a:active,.app-holder noscript a:hover,.app-holder noscript a:focus,.app-holder noscript a:active{text-decoration:none}.error-boundary__footer,.app-holder noscript__footer{color:#404040;font-size:13px}.error-boundary__footer a,.app-holder noscript__footer a{color:#404040}.error-boundary button,.app-holder noscript button{display:inline;border:0;background:transparent;color:#404040;font:inherit;padding:0;margin:0;line-height:inherit;cursor:pointer;outline:0;transition:color 300ms linear;text-decoration:underline}.error-boundary button:hover,.error-boundary button:focus,.error-boundary button:active,.app-holder noscript button:hover,.app-holder noscript button:focus,.app-holder noscript button:active{text-decoration:none}.error-boundary button.copied,.app-holder noscript button.copied{color:#79bd9a;transition:none}.container-alt{width:700px;margin:0 auto;margin-top:40px}@media screen and (max-width: 740px){.container-alt{width:100%;margin:0}}.logo-container{margin:100px auto 50px}@media screen and (max-width: 500px){.logo-container{margin:40px auto 0}}.logo-container h1{display:flex;justify-content:center;align-items:center}.logo-container h1 svg{fill:#fff;height:42px;margin-right:10px}.logo-container h1 a{display:flex;justify-content:center;align-items:center;color:#fff;text-decoration:none;outline:0;padding:12px 16px;line-height:32px;font-family:\"mastodon-font-display\",sans-serif;font-weight:500;font-size:14px}.compose-standalone .compose-form{width:400px;margin:0 auto;padding:20px 0;margin-top:40px;box-sizing:border-box}@media screen and (max-width: 400px){.compose-standalone .compose-form{width:100%;margin-top:0;padding:20px}}.account-header{width:400px;margin:0 auto;display:flex;font-size:13px;line-height:18px;box-sizing:border-box;padding:20px 0;padding-bottom:0;margin-bottom:-30px;margin-top:40px}@media screen and (max-width: 440px){.account-header{width:100%;margin:0;margin-bottom:10px;padding:20px;padding-bottom:0}}.account-header .avatar{width:40px;height:40px;margin-right:8px}.account-header .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px}.account-header .name{flex:1 1 auto;color:#d9e1e8;width:calc(100% - 88px)}.account-header .name .username{display:block;font-weight:500;text-overflow:ellipsis;overflow:hidden}.account-header .logout-link{display:block;font-size:32px;line-height:40px;margin-left:8px}.grid-3{display:grid;grid-gap:10px;grid-template-columns:3fr 1fr;grid-auto-columns:25%;grid-auto-rows:max-content}.grid-3 .column-0{grid-column:1/3;grid-row:1}.grid-3 .column-1{grid-column:1;grid-row:2}.grid-3 .column-2{grid-column:2;grid-row:2}.grid-3 .column-3{grid-column:1/3;grid-row:3}@media screen and (max-width: 415px){.grid-3{grid-gap:0;grid-template-columns:minmax(0, 100%)}.grid-3 .column-0{grid-column:1}.grid-3 .column-1{grid-column:1;grid-row:3}.grid-3 .column-2{grid-column:1;grid-row:2}.grid-3 .column-3{grid-column:1;grid-row:4}}.grid-4{display:grid;grid-gap:10px;grid-template-columns:repeat(4, minmax(0, 1fr));grid-auto-columns:25%;grid-auto-rows:max-content}.grid-4 .column-0{grid-column:1/5;grid-row:1}.grid-4 .column-1{grid-column:1/4;grid-row:2}.grid-4 .column-2{grid-column:4;grid-row:2}.grid-4 .column-3{grid-column:2/5;grid-row:3}.grid-4 .column-4{grid-column:1;grid-row:3}.grid-4 .landing-page__call-to-action{min-height:100%}.grid-4 .flash-message{margin-bottom:10px}@media screen and (max-width: 738px){.grid-4{grid-template-columns:minmax(0, 50%) minmax(0, 50%)}.grid-4 .landing-page__call-to-action{padding:20px;display:flex;align-items:center;justify-content:center}.grid-4 .row__information-board{width:100%;justify-content:center;align-items:center}.grid-4 .row__mascot{display:none}}@media screen and (max-width: 415px){.grid-4{grid-gap:0;grid-template-columns:minmax(0, 100%)}.grid-4 .column-0{grid-column:1}.grid-4 .column-1{grid-column:1;grid-row:3}.grid-4 .column-2{grid-column:1;grid-row:2}.grid-4 .column-3{grid-column:1;grid-row:5}.grid-4 .column-4{grid-column:1;grid-row:4}}@media screen and (max-width: 415px){.public-layout{padding-top:48px}}.public-layout .container{max-width:960px}@media screen and (max-width: 415px){.public-layout .container{padding:0}}.public-layout .header{background:#202e3f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;height:48px;margin:10px 0;display:flex;align-items:stretch;justify-content:center;flex-wrap:nowrap;overflow:hidden}@media screen and (max-width: 415px){.public-layout .header{position:fixed;width:100%;top:0;left:0;margin:0;border-radius:0;box-shadow:none;z-index:110}}.public-layout .header>div{flex:1 1 33.3%;min-height:1px}.public-layout .header .nav-left{display:flex;align-items:stretch;justify-content:flex-start;flex-wrap:nowrap}.public-layout .header .nav-center{display:flex;align-items:stretch;justify-content:center;flex-wrap:nowrap}.public-layout .header .nav-right{display:flex;align-items:stretch;justify-content:flex-end;flex-wrap:nowrap}.public-layout .header .brand{display:block;padding:15px}.public-layout .header .brand svg{display:block;height:18px;width:auto;position:relative;bottom:-2px;fill:#fff}@media screen and (max-width: 415px){.public-layout .header .brand svg{height:20px}}.public-layout .header .brand:hover,.public-layout .header .brand:focus,.public-layout .header .brand:active{background:#26374d}.public-layout .header .nav-link{display:flex;align-items:center;padding:0 1rem;font-size:12px;font-weight:500;text-decoration:none;color:#9baec8;white-space:nowrap;text-align:center}.public-layout .header .nav-link:hover,.public-layout .header .nav-link:focus,.public-layout .header .nav-link:active{text-decoration:underline;color:#fff}@media screen and (max-width: 550px){.public-layout .header .nav-link.optional{display:none}}.public-layout .header .nav-button{background:#2d415a;margin:8px;margin-left:0;border-radius:4px}.public-layout .header .nav-button:hover,.public-layout .header .nav-button:focus,.public-layout .header .nav-button:active{text-decoration:none;background:#344b68}.public-layout .grid{display:grid;grid-gap:10px;grid-template-columns:minmax(300px, 3fr) minmax(298px, 1fr);grid-auto-columns:25%;grid-auto-rows:max-content}.public-layout .grid .column-0{grid-row:1;grid-column:1}.public-layout .grid .column-1{grid-row:1;grid-column:2}@media screen and (max-width: 600px){.public-layout .grid{grid-template-columns:100%;grid-gap:0}.public-layout .grid .column-1{display:none}}.public-layout .directory__card{border-radius:4px}@media screen and (max-width: 415px){.public-layout .directory__card{border-radius:0}}@media screen and (max-width: 415px){.public-layout .page-header{border-bottom:0}}.public-layout .public-account-header{overflow:hidden;margin-bottom:10px;box-shadow:0 0 15px rgba(0,0,0,.2)}.public-layout .public-account-header.inactive{opacity:.5}.public-layout .public-account-header.inactive .public-account-header__image,.public-layout .public-account-header.inactive .avatar{filter:grayscale(100%)}.public-layout .public-account-header.inactive .logo-button{background-color:#d9e1e8}.public-layout .public-account-header__image{border-radius:4px 4px 0 0;overflow:hidden;height:300px;position:relative;background:#000}.public-layout .public-account-header__image::after{content:\"\";display:block;position:absolute;width:100%;height:100%;box-shadow:inset 0 -1px 1px 1px rgba(0,0,0,.15);top:0;left:0}.public-layout .public-account-header__image img{object-fit:cover;display:block;width:100%;height:100%;margin:0;border-radius:4px 4px 0 0}@media screen and (max-width: 600px){.public-layout .public-account-header__image{height:200px}}.public-layout .public-account-header--no-bar{margin-bottom:0}.public-layout .public-account-header--no-bar .public-account-header__image,.public-layout .public-account-header--no-bar .public-account-header__image img{border-radius:4px}@media screen and (max-width: 415px){.public-layout .public-account-header--no-bar .public-account-header__image,.public-layout .public-account-header--no-bar .public-account-header__image img{border-radius:0}}@media screen and (max-width: 415px){.public-layout .public-account-header{margin-bottom:0;box-shadow:none}.public-layout .public-account-header__image::after{display:none}.public-layout .public-account-header__image,.public-layout .public-account-header__image img{border-radius:0}}.public-layout .public-account-header__bar{position:relative;margin-top:-80px;display:flex;justify-content:flex-start}.public-layout .public-account-header__bar::before{content:\"\";display:block;background:#192432;position:absolute;bottom:0;left:0;right:0;height:60px;border-radius:0 0 4px 4px;z-index:-1}.public-layout .public-account-header__bar .avatar{display:block;width:120px;height:120px;padding-left:16px;flex:0 0 auto}.public-layout .public-account-header__bar .avatar img{display:block;width:100%;height:100%;margin:0;border-radius:50%;border:4px solid #192432;background:#040609}@media screen and (max-width: 600px){.public-layout .public-account-header__bar{margin-top:0;background:#192432;border-radius:0 0 4px 4px;padding:5px}.public-layout .public-account-header__bar::before{display:none}.public-layout .public-account-header__bar .avatar{width:48px;height:48px;padding:7px 0;padding-left:10px}.public-layout .public-account-header__bar .avatar img{border:0;border-radius:4px}}@media screen and (max-width: 600px)and (max-width: 360px){.public-layout .public-account-header__bar .avatar{display:none}}@media screen and (max-width: 415px){.public-layout .public-account-header__bar{border-radius:0}}@media screen and (max-width: 600px){.public-layout .public-account-header__bar{flex-wrap:wrap}}.public-layout .public-account-header__tabs{flex:1 1 auto;margin-left:20px}.public-layout .public-account-header__tabs__name{padding-top:20px;padding-bottom:8px}.public-layout .public-account-header__tabs__name h1{font-size:20px;line-height:27px;color:#fff;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-shadow:1px 1px 1px #000}.public-layout .public-account-header__tabs__name h1 small{display:block;font-size:14px;color:#fff;font-weight:400;overflow:hidden;text-overflow:ellipsis}@media screen and (max-width: 600px){.public-layout .public-account-header__tabs{margin-left:15px;display:flex;justify-content:space-between;align-items:center}.public-layout .public-account-header__tabs__name{padding-top:0;padding-bottom:0}.public-layout .public-account-header__tabs__name h1{font-size:16px;line-height:24px;text-shadow:none}.public-layout .public-account-header__tabs__name h1 small{color:#9baec8}}.public-layout .public-account-header__tabs__tabs{display:flex;justify-content:flex-start;align-items:stretch;height:58px}.public-layout .public-account-header__tabs__tabs .details-counters{display:flex;flex-direction:row;min-width:300px}@media screen and (max-width: 600px){.public-layout .public-account-header__tabs__tabs .details-counters{display:none}}.public-layout .public-account-header__tabs__tabs .counter{min-width:33.3%;box-sizing:border-box;flex:0 0 auto;color:#9baec8;padding:10px;border-right:1px solid #192432;cursor:default;text-align:center;position:relative}.public-layout .public-account-header__tabs__tabs .counter a{display:block}.public-layout .public-account-header__tabs__tabs .counter:last-child{border-right:0}.public-layout .public-account-header__tabs__tabs .counter::after{display:block;content:\"\";position:absolute;bottom:0;left:0;width:100%;border-bottom:4px solid #9baec8;opacity:.5;transition:all 400ms ease}.public-layout .public-account-header__tabs__tabs .counter.active::after{border-bottom:4px solid #00007f;opacity:1}.public-layout .public-account-header__tabs__tabs .counter.active.inactive::after{border-bottom-color:#d9e1e8}.public-layout .public-account-header__tabs__tabs .counter:hover::after{opacity:1;transition-duration:100ms}.public-layout .public-account-header__tabs__tabs .counter a{text-decoration:none;color:inherit}.public-layout .public-account-header__tabs__tabs .counter .counter-label{font-size:12px;display:block}.public-layout .public-account-header__tabs__tabs .counter .counter-number{font-weight:500;font-size:18px;margin-bottom:5px;color:#fff;font-family:\"mastodon-font-display\",sans-serif}.public-layout .public-account-header__tabs__tabs .spacer{flex:1 1 auto;height:1px}.public-layout .public-account-header__tabs__tabs__buttons{padding:7px 8px}.public-layout .public-account-header__extra{display:none;margin-top:4px}.public-layout .public-account-header__extra .public-account-bio{border-radius:0;box-shadow:none;background:transparent;margin:0 -5px}.public-layout .public-account-header__extra .public-account-bio .account__header__fields{border-top:1px solid #26374d}.public-layout .public-account-header__extra .public-account-bio .roles{display:none}.public-layout .public-account-header__extra__links{margin-top:-15px;font-size:14px;color:#9baec8}.public-layout .public-account-header__extra__links a{display:inline-block;color:#9baec8;text-decoration:none;padding:15px;font-weight:500}.public-layout .public-account-header__extra__links a strong{font-weight:700;color:#fff}@media screen and (max-width: 600px){.public-layout .public-account-header__extra{display:block;flex:100%}}.public-layout .account__section-headline{border-radius:4px 4px 0 0}@media screen and (max-width: 415px){.public-layout .account__section-headline{border-radius:0}}.public-layout .detailed-status__meta{margin-top:25px}.public-layout .public-account-bio{background:#202e3f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;overflow:hidden;margin-bottom:10px}@media screen and (max-width: 415px){.public-layout .public-account-bio{box-shadow:none;margin-bottom:0;border-radius:0}}.public-layout .public-account-bio .account__header__fields{margin:0;border-top:0}.public-layout .public-account-bio .account__header__fields a{color:#0000a8}.public-layout .public-account-bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.public-layout .public-account-bio .account__header__fields .verified a{color:#79bd9a}.public-layout .public-account-bio .account__header__content{padding:20px;padding-bottom:0;color:#fff}.public-layout .public-account-bio__extra,.public-layout .public-account-bio .roles{padding:20px;font-size:14px;color:#9baec8}.public-layout .public-account-bio .roles{padding-bottom:0}.public-layout .directory__list{display:grid;grid-gap:10px;grid-template-columns:minmax(0, 50%) minmax(0, 50%)}@media screen and (max-width: 415px){.public-layout .directory__list{display:block}}.public-layout .directory__list .icon-button{font-size:18px}.public-layout .directory__card{margin-bottom:0}.public-layout .card-grid{display:flex;flex-wrap:wrap;min-width:100%;margin:0 -5px}.public-layout .card-grid>div{box-sizing:border-box;flex:1 0 auto;width:300px;padding:0 5px;margin-bottom:10px;max-width:33.333%}@media screen and (max-width: 900px){.public-layout .card-grid>div{max-width:50%}}@media screen and (max-width: 600px){.public-layout .card-grid>div{max-width:100%}}@media screen and (max-width: 415px){.public-layout .card-grid{margin:0;border-top:1px solid #202e3f}.public-layout .card-grid>div{width:100%;padding:0;margin-bottom:0;border-bottom:1px solid #202e3f}.public-layout .card-grid>div:last-child{border-bottom:0}.public-layout .card-grid>div .card__bar{background:#121a24}.public-layout .card-grid>div .card__bar:hover,.public-layout .card-grid>div .card__bar:active,.public-layout .card-grid>div .card__bar:focus{background:#192432}}.no-list{list-style:none}.no-list li{display:inline-block;margin:0 5px}.recovery-codes{list-style:none;margin:0 auto}.recovery-codes li{font-size:125%;line-height:1.5;letter-spacing:1px}.public-layout .footer{text-align:left;padding-top:20px;padding-bottom:60px;font-size:12px;color:#4c6d98}@media screen and (max-width: 415px){.public-layout .footer{padding-left:20px;padding-right:20px}}.public-layout .footer .grid{display:grid;grid-gap:10px;grid-template-columns:1fr 1fr 2fr 1fr 1fr}.public-layout .footer .grid .column-0{grid-column:1;grid-row:1;min-width:0}.public-layout .footer .grid .column-1{grid-column:2;grid-row:1;min-width:0}.public-layout .footer .grid .column-2{grid-column:3;grid-row:1;min-width:0;text-align:center}.public-layout .footer .grid .column-2 h4 a{color:#4c6d98}.public-layout .footer .grid .column-3{grid-column:4;grid-row:1;min-width:0}.public-layout .footer .grid .column-4{grid-column:5;grid-row:1;min-width:0}@media screen and (max-width: 690px){.public-layout .footer .grid{grid-template-columns:1fr 2fr 1fr}.public-layout .footer .grid .column-0,.public-layout .footer .grid .column-1{grid-column:1}.public-layout .footer .grid .column-1{grid-row:2}.public-layout .footer .grid .column-2{grid-column:2}.public-layout .footer .grid .column-3,.public-layout .footer .grid .column-4{grid-column:3}.public-layout .footer .grid .column-4{grid-row:2}}@media screen and (max-width: 600px){.public-layout .footer .grid .column-1{display:block}}@media screen and (max-width: 415px){.public-layout .footer .grid .column-0,.public-layout .footer .grid .column-1,.public-layout .footer .grid .column-3,.public-layout .footer .grid .column-4{display:none}}.public-layout .footer h4{text-transform:uppercase;font-weight:700;margin-bottom:8px;color:#9baec8}.public-layout .footer h4 a{color:inherit;text-decoration:none}.public-layout .footer ul a{text-decoration:none;color:#4c6d98}.public-layout .footer ul a:hover,.public-layout .footer ul a:active,.public-layout .footer ul a:focus{text-decoration:underline}.public-layout .footer .brand svg{display:block;height:36px;width:auto;margin:0 auto;fill:#4c6d98}.public-layout .footer .brand:hover svg,.public-layout .footer .brand:focus svg,.public-layout .footer .brand:active svg{fill:#5377a5}.compact-header h1{font-size:24px;line-height:28px;color:#9baec8;font-weight:500;margin-bottom:20px;padding:0 10px;word-wrap:break-word}@media screen and (max-width: 740px){.compact-header h1{text-align:center;padding:20px 10px 0}}.compact-header h1 a{color:inherit;text-decoration:none}.compact-header h1 small{font-weight:400;color:#d9e1e8}.compact-header h1 img{display:inline-block;margin-bottom:-5px;margin-right:15px;width:36px;height:36px}.hero-widget{margin-bottom:10px;box-shadow:0 0 15px rgba(0,0,0,.2)}.hero-widget__img{width:100%;position:relative;overflow:hidden;border-radius:4px 4px 0 0;background:#000}.hero-widget__img img{object-fit:cover;display:block;width:100%;height:100%;margin:0;border-radius:4px 4px 0 0}.hero-widget__text{background:#121a24;padding:20px;border-radius:0 0 4px 4px;font-size:15px;color:#9baec8;line-height:20px;word-wrap:break-word;font-weight:400}.hero-widget__text .emojione{width:20px;height:20px;margin:-3px 0 0}.hero-widget__text p{margin-bottom:20px}.hero-widget__text p:last-child{margin-bottom:0}.hero-widget__text em{display:inline;margin:0;padding:0;font-weight:700;background:transparent;font-family:inherit;font-size:inherit;line-height:inherit;color:#bcc9da}.hero-widget__text a{color:#d9e1e8;text-decoration:none}.hero-widget__text a:hover{text-decoration:underline}@media screen and (max-width: 415px){.hero-widget{display:none}}.endorsements-widget{margin-bottom:10px;padding-bottom:10px}.endorsements-widget h4{padding:10px;text-transform:uppercase;font-weight:700;font-size:13px;color:#9baec8}.endorsements-widget .account{padding:10px 0}.endorsements-widget .account:last-child{border-bottom:0}.endorsements-widget .account .account__display-name{display:flex;align-items:center}.endorsements-widget .account .account__avatar{width:44px;height:44px;background-size:44px 44px}.endorsements-widget .trends__item{padding:10px}.trends-widget h4{color:#9baec8}.box-widget{padding:20px;border-radius:4px;background:#121a24;box-shadow:0 0 15px rgba(0,0,0,.2)}.placeholder-widget{padding:16px;border-radius:4px;border:2px dashed #404040;text-align:center;color:#9baec8;margin-bottom:10px}.contact-widget{min-height:100%;font-size:15px;color:#9baec8;line-height:20px;word-wrap:break-word;font-weight:400;padding:0}.contact-widget h4{padding:10px;text-transform:uppercase;font-weight:700;font-size:13px;color:#9baec8}.contact-widget .account{border-bottom:0;padding:10px 0;padding-top:5px}.contact-widget>a{display:inline-block;padding:10px;padding-top:0;color:#9baec8;text-decoration:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.contact-widget>a:hover,.contact-widget>a:focus,.contact-widget>a:active{text-decoration:underline}.moved-account-widget{padding:15px;padding-bottom:20px;border-radius:4px;background:#121a24;box-shadow:0 0 15px rgba(0,0,0,.2);color:#d9e1e8;font-weight:400;margin-bottom:10px}.moved-account-widget strong,.moved-account-widget a{font-weight:500}.moved-account-widget strong:lang(ja),.moved-account-widget a:lang(ja){font-weight:700}.moved-account-widget strong:lang(ko),.moved-account-widget a:lang(ko){font-weight:700}.moved-account-widget strong:lang(zh-CN),.moved-account-widget a:lang(zh-CN){font-weight:700}.moved-account-widget strong:lang(zh-HK),.moved-account-widget a:lang(zh-HK){font-weight:700}.moved-account-widget strong:lang(zh-TW),.moved-account-widget a:lang(zh-TW){font-weight:700}.moved-account-widget a{color:inherit;text-decoration:underline}.moved-account-widget a.mention{text-decoration:none}.moved-account-widget a.mention span{text-decoration:none}.moved-account-widget a.mention:focus,.moved-account-widget a.mention:hover,.moved-account-widget a.mention:active{text-decoration:none}.moved-account-widget a.mention:focus span,.moved-account-widget a.mention:hover span,.moved-account-widget a.mention:active span{text-decoration:underline}.moved-account-widget__message{margin-bottom:15px}.moved-account-widget__message .fa{margin-right:5px;color:#9baec8}.moved-account-widget__card .detailed-status__display-avatar{position:relative;cursor:pointer}.moved-account-widget__card .detailed-status__display-name{margin-bottom:0;text-decoration:none}.moved-account-widget__card .detailed-status__display-name span{font-weight:400}.memoriam-widget{padding:20px;border-radius:4px;background:#000;box-shadow:0 0 15px rgba(0,0,0,.2);font-size:14px;color:#9baec8;margin-bottom:10px}.page-header{background:#202e3f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;padding:60px 15px;text-align:center;margin:10px 0}.page-header h1{color:#fff;font-size:36px;line-height:1.1;font-weight:700;margin-bottom:10px}.page-header p{font-size:15px;color:#9baec8}@media screen and (max-width: 415px){.page-header{margin-top:0;background:#192432}.page-header h1{font-size:24px}}.directory{background:#121a24;border-radius:4px;box-shadow:0 0 15px rgba(0,0,0,.2)}.directory__tag{box-sizing:border-box;margin-bottom:10px}.directory__tag>a,.directory__tag>div{display:flex;align-items:center;justify-content:space-between;background:#121a24;border-radius:4px;padding:15px;text-decoration:none;color:inherit;box-shadow:0 0 15px rgba(0,0,0,.2)}.directory__tag>a:hover,.directory__tag>a:active,.directory__tag>a:focus{background:#202e3f}.directory__tag.active>a{background:#00007f;cursor:default}.directory__tag.disabled>div{opacity:.5;cursor:default}.directory__tag h4{flex:1 1 auto;font-size:18px;font-weight:700;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.directory__tag h4 .fa{color:#9baec8}.directory__tag h4 small{display:block;font-weight:400;font-size:15px;margin-top:8px;color:#9baec8}.directory__tag.active h4,.directory__tag.active h4 .fa,.directory__tag.active h4 small,.directory__tag.active h4 .trends__item__current{color:#fff}.directory__tag .avatar-stack{flex:0 0 auto;width:120px}.directory__tag.active .avatar-stack .account__avatar{border-color:#00007f}.directory__tag .trends__item__current{padding-right:0}.avatar-stack{display:flex;justify-content:flex-end}.avatar-stack .account__avatar{flex:0 0 auto;width:36px;height:36px;border-radius:50%;position:relative;margin-left:-10px;background:#040609;border:2px solid #121a24}.avatar-stack .account__avatar:nth-child(1){z-index:1}.avatar-stack .account__avatar:nth-child(2){z-index:2}.avatar-stack .account__avatar:nth-child(3){z-index:3}.accounts-table{width:100%}.accounts-table .account{padding:0;border:0}.accounts-table strong{font-weight:700}.accounts-table thead th{text-align:center;text-transform:uppercase;color:#9baec8;font-weight:700;padding:10px}.accounts-table thead th:first-child{text-align:left}.accounts-table tbody td{padding:15px 0;vertical-align:middle;border-bottom:1px solid #202e3f}.accounts-table tbody tr:last-child td{border-bottom:0}.accounts-table__count{width:120px;text-align:center;font-size:15px;font-weight:500;color:#fff}.accounts-table__count small{display:block;color:#9baec8;font-weight:400;font-size:14px}.accounts-table__comment{width:50%;vertical-align:initial !important}@media screen and (max-width: 415px){.accounts-table tbody td.optional{display:none}}@media screen and (max-width: 415px){.moved-account-widget,.memoriam-widget,.box-widget,.contact-widget,.landing-page__information.contact-widget,.directory,.page-header{margin-bottom:0;box-shadow:none;border-radius:0}}.statuses-grid{min-height:600px}@media screen and (max-width: 640px){.statuses-grid{width:100% !important}}.statuses-grid__item{width:313.3333333333px}@media screen and (max-width: 1255px){.statuses-grid__item{width:306.6666666667px}}@media screen and (max-width: 640px){.statuses-grid__item{width:100%}}@media screen and (max-width: 415px){.statuses-grid__item{width:100vw}}.statuses-grid .detailed-status{border-radius:4px}@media screen and (max-width: 415px){.statuses-grid .detailed-status{border-top:1px solid #2d415a}}.statuses-grid .detailed-status.compact .detailed-status__meta{margin-top:15px}.statuses-grid .detailed-status.compact .status__content{font-size:15px;line-height:20px}.statuses-grid .detailed-status.compact .status__content .emojione{width:20px;height:20px;margin:-3px 0 0}.statuses-grid .detailed-status.compact .status__content .status__content__spoiler-link{line-height:20px;margin:0}.statuses-grid .detailed-status.compact .media-gallery,.statuses-grid .detailed-status.compact .status-card,.statuses-grid .detailed-status.compact .video-player{margin-top:15px}.notice-widget{margin-bottom:10px;color:#9baec8}.notice-widget p{margin-bottom:10px}.notice-widget p:last-child{margin-bottom:0}.notice-widget a{font-size:14px;line-height:20px}.notice-widget a,.placeholder-widget a{text-decoration:none;font-weight:500;color:#00007f}.notice-widget a:hover,.notice-widget a:focus,.notice-widget a:active,.placeholder-widget a:hover,.placeholder-widget a:focus,.placeholder-widget a:active{text-decoration:underline}.table-of-contents{background:#0b1016;min-height:100%;font-size:14px;border-radius:4px}.table-of-contents li a{display:block;font-weight:500;padding:15px;overflow:hidden;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-decoration:none;color:#fff;border-bottom:1px solid #192432}.table-of-contents li a:hover,.table-of-contents li a:focus,.table-of-contents li a:active{text-decoration:underline}.table-of-contents li:last-child a{border-bottom:0}.table-of-contents li ul{padding-left:20px;border-bottom:1px solid #192432}code{font-family:\"mastodon-font-monospace\",monospace;font-weight:400}.form-container{max-width:400px;padding:20px;margin:0 auto}.simple_form .input{margin-bottom:15px;overflow:hidden}.simple_form .input.hidden{margin:0}.simple_form .input.radio_buttons .radio{margin-bottom:15px}.simple_form .input.radio_buttons .radio:last-child{margin-bottom:0}.simple_form .input.radio_buttons .radio>label{position:relative;padding-left:28px}.simple_form .input.radio_buttons .radio>label input{position:absolute;top:-2px;left:0}.simple_form .input.boolean{position:relative;margin-bottom:0}.simple_form .input.boolean .label_input>label{font-family:inherit;font-size:14px;padding-top:5px;color:#fff;display:block;width:auto}.simple_form .input.boolean .label_input,.simple_form .input.boolean .hint{padding-left:28px}.simple_form .input.boolean .label_input__wrapper{position:static}.simple_form .input.boolean label.checkbox{position:absolute;top:2px;left:0}.simple_form .input.boolean label a{color:#00007f;text-decoration:underline}.simple_form .input.boolean label a:hover,.simple_form .input.boolean label a:active,.simple_form .input.boolean label a:focus{text-decoration:none}.simple_form .input.boolean .recommended{position:absolute;margin:0 4px;margin-top:-2px}.simple_form .row{display:flex;margin:0 -5px}.simple_form .row .input{box-sizing:border-box;flex:1 1 auto;width:50%;padding:0 5px}.simple_form .hint{color:#9baec8}.simple_form .hint a{color:#00007f}.simple_form .hint code{border-radius:3px;padding:.2em .4em;background:#000}.simple_form .hint li{list-style:disc;margin-left:18px}.simple_form ul.hint{margin-bottom:15px}.simple_form span.hint{display:block;font-size:12px;margin-top:4px}.simple_form p.hint{margin-bottom:15px;color:#9baec8}.simple_form p.hint.subtle-hint{text-align:center;font-size:12px;line-height:18px;margin-top:15px;margin-bottom:0}.simple_form .card{margin-bottom:15px}.simple_form strong{font-weight:500}.simple_form strong:lang(ja){font-weight:700}.simple_form strong:lang(ko){font-weight:700}.simple_form strong:lang(zh-CN){font-weight:700}.simple_form strong:lang(zh-HK){font-weight:700}.simple_form strong:lang(zh-TW){font-weight:700}.simple_form .input.with_floating_label .label_input{display:flex}.simple_form .input.with_floating_label .label_input>label{font-family:inherit;font-size:14px;color:#fff;font-weight:500;min-width:150px;flex:0 0 auto}.simple_form .input.with_floating_label .label_input input,.simple_form .input.with_floating_label .label_input select{flex:1 1 auto}.simple_form .input.with_floating_label.select .hint{margin-top:6px;margin-left:150px}.simple_form .input.with_label .label_input>label{font-family:inherit;font-size:14px;color:#fff;display:block;margin-bottom:8px;word-wrap:break-word;font-weight:500}.simple_form .input.with_label .hint{margin-top:6px}.simple_form .input.with_label ul{flex:390px}.simple_form .input.with_block_label{max-width:none}.simple_form .input.with_block_label>label{font-family:inherit;font-size:16px;color:#fff;display:block;font-weight:500;padding-top:5px}.simple_form .input.with_block_label .hint{margin-bottom:15px}.simple_form .input.with_block_label ul{columns:2}.simple_form .input.datetime .label_input select{display:inline-block;width:auto;flex:0}.simple_form .required abbr{text-decoration:none;color:#e87487}.simple_form .fields-group{margin-bottom:25px}.simple_form .fields-group .input:last-child{margin-bottom:0}.simple_form .fields-row{display:flex;margin:0 -10px;padding-top:5px;margin-bottom:25px}.simple_form .fields-row .input{max-width:none}.simple_form .fields-row__column{box-sizing:border-box;padding:0 10px;flex:1 1 auto;min-height:1px}.simple_form .fields-row__column-6{max-width:50%}.simple_form .fields-row__column .actions{margin-top:27px}.simple_form .fields-row .fields-group:last-child,.simple_form .fields-row .fields-row__column.fields-group{margin-bottom:0}@media screen and (max-width: 600px){.simple_form .fields-row{display:block;margin-bottom:0}.simple_form .fields-row__column{max-width:none}.simple_form .fields-row .fields-group:last-child,.simple_form .fields-row .fields-row__column.fields-group,.simple_form .fields-row .fields-row__column{margin-bottom:25px}}.simple_form .input.radio_buttons .radio label{margin-bottom:5px;font-family:inherit;font-size:14px;color:#fff;display:block;width:auto}.simple_form .check_boxes .checkbox label{font-family:inherit;font-size:14px;color:#fff;display:inline-block;width:auto;position:relative;padding-top:5px;padding-left:25px;flex:1 1 auto}.simple_form .check_boxes .checkbox input[type=checkbox]{position:absolute;left:0;top:5px;margin:0}.simple_form .input.static .label_input__wrapper{font-size:16px;padding:10px;border:1px solid #404040;border-radius:4px}.simple_form input[type=text],.simple_form input[type=number],.simple_form input[type=email],.simple_form input[type=password],.simple_form textarea{box-sizing:border-box;font-size:16px;color:#fff;display:block;width:100%;outline:0;font-family:inherit;resize:vertical;background:#010102;border:1px solid #000;border-radius:4px;padding:10px}.simple_form input[type=text]::placeholder,.simple_form input[type=number]::placeholder,.simple_form input[type=email]::placeholder,.simple_form input[type=password]::placeholder,.simple_form textarea::placeholder{color:#a8b9cf}.simple_form input[type=text]:invalid,.simple_form input[type=number]:invalid,.simple_form input[type=email]:invalid,.simple_form input[type=password]:invalid,.simple_form textarea:invalid{box-shadow:none}.simple_form input[type=text]:focus:invalid:not(:placeholder-shown),.simple_form input[type=number]:focus:invalid:not(:placeholder-shown),.simple_form input[type=email]:focus:invalid:not(:placeholder-shown),.simple_form input[type=password]:focus:invalid:not(:placeholder-shown),.simple_form textarea:focus:invalid:not(:placeholder-shown){border-color:#e87487}.simple_form input[type=text]:required:valid,.simple_form input[type=number]:required:valid,.simple_form input[type=email]:required:valid,.simple_form input[type=password]:required:valid,.simple_form textarea:required:valid{border-color:#79bd9a}.simple_form input[type=text]:hover,.simple_form input[type=number]:hover,.simple_form input[type=email]:hover,.simple_form input[type=password]:hover,.simple_form textarea:hover{border-color:#000}.simple_form input[type=text]:active,.simple_form input[type=text]:focus,.simple_form input[type=number]:active,.simple_form input[type=number]:focus,.simple_form input[type=email]:active,.simple_form input[type=email]:focus,.simple_form input[type=password]:active,.simple_form input[type=password]:focus,.simple_form textarea:active,.simple_form textarea:focus{border-color:#00007f;background:#040609}.simple_form .input.field_with_errors label{color:#e87487}.simple_form .input.field_with_errors input[type=text],.simple_form .input.field_with_errors input[type=number],.simple_form .input.field_with_errors input[type=email],.simple_form .input.field_with_errors input[type=password],.simple_form .input.field_with_errors textarea,.simple_form .input.field_with_errors select{border-color:#e87487}.simple_form .input.field_with_errors .error{display:block;font-weight:500;color:#e87487;margin-top:4px}.simple_form .input.disabled{opacity:.5}.simple_form .actions{margin-top:30px;display:flex}.simple_form .actions.actions--top{margin-top:0;margin-bottom:30px}.simple_form button,.simple_form .button,.simple_form .block-button{display:block;width:100%;border:0;border-radius:4px;background:#00007f;color:#fff;font-size:18px;line-height:inherit;height:auto;padding:10px;text-transform:uppercase;text-decoration:none;text-align:center;box-sizing:border-box;cursor:pointer;font-weight:500;outline:0;margin-bottom:10px;margin-right:10px}.simple_form button:last-child,.simple_form .button:last-child,.simple_form .block-button:last-child{margin-right:0}.simple_form button:hover,.simple_form .button:hover,.simple_form .block-button:hover{background-color:#009}.simple_form button:active,.simple_form button:focus,.simple_form .button:active,.simple_form .button:focus,.simple_form .block-button:active,.simple_form .block-button:focus{background-color:#006}.simple_form button:disabled:hover,.simple_form .button:disabled:hover,.simple_form .block-button:disabled:hover{background-color:#9baec8}.simple_form button.negative,.simple_form .button.negative,.simple_form .block-button.negative{background:#df405a}.simple_form button.negative:hover,.simple_form .button.negative:hover,.simple_form .block-button.negative:hover{background-color:#e3566d}.simple_form button.negative:active,.simple_form button.negative:focus,.simple_form .button.negative:active,.simple_form .button.negative:focus,.simple_form .block-button.negative:active,.simple_form .block-button.negative:focus{background-color:#db2a47}.simple_form select{appearance:none;box-sizing:border-box;font-size:16px;color:#fff;display:block;width:100%;outline:0;font-family:inherit;resize:vertical;background:#010102 url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center/auto 16px;border:1px solid #000;border-radius:4px;padding-left:10px;padding-right:30px;height:41px}.simple_form h4{margin-bottom:15px !important}.simple_form .label_input__wrapper{position:relative}.simple_form .label_input__append{position:absolute;right:3px;top:1px;padding:10px;padding-bottom:9px;font-size:16px;color:#404040;font-family:inherit;pointer-events:none;cursor:default;max-width:140px;white-space:nowrap;overflow:hidden}.simple_form .label_input__append::after{content:\"\";display:block;position:absolute;top:0;right:0;bottom:1px;width:5px;background-image:linear-gradient(to right, rgba(1, 1, 2, 0), #010102)}.simple_form__overlay-area{position:relative}.simple_form__overlay-area__blurred form{filter:blur(2px)}.simple_form__overlay-area__overlay{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;background:rgba(18,26,36,.65);border-radius:4px;margin-left:-4px;margin-top:-4px;padding:4px}.simple_form__overlay-area__overlay__content{text-align:center}.simple_form__overlay-area__overlay__content.rich-formatting,.simple_form__overlay-area__overlay__content.rich-formatting p{color:#fff}.block-icon{display:block;margin:0 auto;margin-bottom:10px;font-size:24px}.flash-message{background:#202e3f;color:#9baec8;border-radius:4px;padding:15px 10px;margin-bottom:30px;text-align:center}.flash-message.notice{border:1px solid rgba(121,189,154,.5);background:rgba(121,189,154,.25);color:#79bd9a}.flash-message.alert{border:1px solid rgba(223,64,90,.5);background:rgba(223,64,90,.25);color:#df405a}.flash-message a{display:inline-block;color:#9baec8;text-decoration:none}.flash-message a:hover{color:#fff;text-decoration:underline}.flash-message p{margin-bottom:15px}.flash-message .oauth-code{outline:0;box-sizing:border-box;display:block;width:100%;border:0;padding:10px;font-family:\"mastodon-font-monospace\",monospace;background:#121a24;color:#fff;font-size:14px;margin:0}.flash-message .oauth-code::-moz-focus-inner{border:0}.flash-message .oauth-code::-moz-focus-inner,.flash-message .oauth-code:focus,.flash-message .oauth-code:active{outline:0 !important}.flash-message .oauth-code:focus{background:#192432}.flash-message strong{font-weight:500}.flash-message strong:lang(ja){font-weight:700}.flash-message strong:lang(ko){font-weight:700}.flash-message strong:lang(zh-CN){font-weight:700}.flash-message strong:lang(zh-HK){font-weight:700}.flash-message strong:lang(zh-TW){font-weight:700}@media screen and (max-width: 740px)and (min-width: 441px){.flash-message{margin-top:40px}}.form-footer{margin-top:30px;text-align:center}.form-footer a{color:#9baec8;text-decoration:none}.form-footer a:hover{text-decoration:underline}.quick-nav{list-style:none;margin-bottom:25px;font-size:14px}.quick-nav li{display:inline-block;margin-right:10px}.quick-nav a{color:#00007f;text-transform:uppercase;text-decoration:none;font-weight:700}.quick-nav a:hover,.quick-nav a:focus,.quick-nav a:active{color:#0000a8}.oauth-prompt,.follow-prompt{margin-bottom:30px;color:#9baec8}.oauth-prompt h2,.follow-prompt h2{font-size:16px;margin-bottom:30px;text-align:center}.oauth-prompt strong,.follow-prompt strong{color:#d9e1e8;font-weight:500}.oauth-prompt strong:lang(ja),.follow-prompt strong:lang(ja){font-weight:700}.oauth-prompt strong:lang(ko),.follow-prompt strong:lang(ko){font-weight:700}.oauth-prompt strong:lang(zh-CN),.follow-prompt strong:lang(zh-CN){font-weight:700}.oauth-prompt strong:lang(zh-HK),.follow-prompt strong:lang(zh-HK){font-weight:700}.oauth-prompt strong:lang(zh-TW),.follow-prompt strong:lang(zh-TW){font-weight:700}@media screen and (max-width: 740px)and (min-width: 441px){.oauth-prompt,.follow-prompt{margin-top:40px}}.qr-wrapper{display:flex;flex-wrap:wrap;align-items:flex-start}.qr-code{flex:0 0 auto;background:#fff;padding:4px;margin:0 10px 20px 0;box-shadow:0 0 15px rgba(0,0,0,.2);display:inline-block}.qr-code svg{display:block;margin:0}.qr-alternative{margin-bottom:20px;color:#d9e1e8;flex:150px}.qr-alternative samp{display:block;font-size:14px}.table-form p{margin-bottom:15px}.table-form p strong{font-weight:500}.table-form p strong:lang(ja){font-weight:700}.table-form p strong:lang(ko){font-weight:700}.table-form p strong:lang(zh-CN){font-weight:700}.table-form p strong:lang(zh-HK){font-weight:700}.table-form p strong:lang(zh-TW){font-weight:700}.simple_form .warning,.table-form .warning{box-sizing:border-box;background:rgba(223,64,90,.5);color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,.3);box-shadow:0 2px 6px rgba(0,0,0,.4);border-radius:4px;padding:10px;margin-bottom:15px}.simple_form .warning a,.table-form .warning a{color:#fff;text-decoration:underline}.simple_form .warning a:hover,.simple_form .warning a:focus,.simple_form .warning a:active,.table-form .warning a:hover,.table-form .warning a:focus,.table-form .warning a:active{text-decoration:none}.simple_form .warning strong,.table-form .warning strong{font-weight:600;display:block;margin-bottom:5px}.simple_form .warning strong:lang(ja),.table-form .warning strong:lang(ja){font-weight:700}.simple_form .warning strong:lang(ko),.table-form .warning strong:lang(ko){font-weight:700}.simple_form .warning strong:lang(zh-CN),.table-form .warning strong:lang(zh-CN){font-weight:700}.simple_form .warning strong:lang(zh-HK),.table-form .warning strong:lang(zh-HK){font-weight:700}.simple_form .warning strong:lang(zh-TW),.table-form .warning strong:lang(zh-TW){font-weight:700}.simple_form .warning strong .fa,.table-form .warning strong .fa{font-weight:400}.action-pagination{display:flex;flex-wrap:wrap;align-items:center}.action-pagination .actions,.action-pagination .pagination{flex:1 1 auto}.action-pagination .actions{padding:30px 0;padding-right:20px;flex:0 0 auto}.post-follow-actions{text-align:center;color:#9baec8}.post-follow-actions div{margin-bottom:4px}.alternative-login{margin-top:20px;margin-bottom:20px}.alternative-login h4{font-size:16px;color:#fff;text-align:center;margin-bottom:20px;border:0;padding:0}.alternative-login .button{display:block}.scope-danger{color:#ff5050}.form_admin_settings_site_short_description textarea,.form_admin_settings_site_description textarea,.form_admin_settings_site_extended_description textarea,.form_admin_settings_site_terms textarea,.form_admin_settings_custom_css textarea,.form_admin_settings_closed_registrations_message textarea{font-family:\"mastodon-font-monospace\",monospace}.input-copy{background:#010102;border:1px solid #000;border-radius:4px;display:flex;align-items:center;padding-right:4px;position:relative;top:1px;transition:border-color 300ms linear}.input-copy__wrapper{flex:1 1 auto}.input-copy input[type=text]{background:transparent;border:0;padding:10px;font-size:14px;font-family:\"mastodon-font-monospace\",monospace}.input-copy button{flex:0 0 auto;margin:4px;text-transform:none;font-weight:400;font-size:14px;padding:7px 18px;padding-bottom:6px;width:auto;transition:background 300ms linear}.input-copy.copied{border-color:#79bd9a;transition:none}.input-copy.copied button{background:#79bd9a;transition:none}.connection-prompt{margin-bottom:25px}.connection-prompt .fa-link{background-color:#0b1016;border-radius:100%;font-size:24px;padding:10px}.connection-prompt__column{align-items:center;display:flex;flex:1;flex-direction:column;flex-shrink:1;max-width:50%}.connection-prompt__column-sep{align-self:center;flex-grow:0;overflow:visible;position:relative;z-index:1}.connection-prompt__column p{word-break:break-word}.connection-prompt .account__avatar{margin-bottom:20px}.connection-prompt__connection{background-color:#202e3f;box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;padding:25px 10px;position:relative;text-align:center}.connection-prompt__connection::after{background-color:#0b1016;content:\"\";display:block;height:100%;left:50%;position:absolute;top:0;width:1px}.connection-prompt__row{align-items:flex-start;display:flex;flex-direction:row}.card>a{display:block;text-decoration:none;color:inherit;box-shadow:0 0 15px rgba(0,0,0,.2)}@media screen and (max-width: 415px){.card>a{box-shadow:none}}.card>a:hover .card__bar,.card>a:active .card__bar,.card>a:focus .card__bar{background:#202e3f}.card__img{height:130px;position:relative;background:#000;border-radius:4px 4px 0 0}.card__img img{display:block;width:100%;height:100%;margin:0;object-fit:cover;border-radius:4px 4px 0 0}@media screen and (max-width: 600px){.card__img{height:200px}}@media screen and (max-width: 415px){.card__img{display:none}}.card__bar{position:relative;padding:15px;display:flex;justify-content:flex-start;align-items:center;background:#192432;border-radius:0 0 4px 4px}@media screen and (max-width: 415px){.card__bar{border-radius:0}}.card__bar .avatar{flex:0 0 auto;width:48px;height:48px;padding-top:2px}.card__bar .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px;background:#040609;object-fit:cover}.card__bar .display-name{margin-left:15px;text-align:left}.card__bar .display-name strong{font-size:15px;color:#fff;font-weight:500;overflow:hidden;text-overflow:ellipsis}.card__bar .display-name span{display:block;font-size:14px;color:#9baec8;font-weight:400;overflow:hidden;text-overflow:ellipsis}.pagination{padding:30px 0;text-align:center;overflow:hidden}.pagination a,.pagination .current,.pagination .newer,.pagination .older,.pagination .page,.pagination .gap{font-size:14px;color:#fff;font-weight:500;display:inline-block;padding:6px 10px;text-decoration:none}.pagination .current{background:#fff;border-radius:100px;color:#121a24;cursor:default;margin:0 10px}.pagination .gap{cursor:default}.pagination .older,.pagination .newer{text-transform:uppercase;color:#d9e1e8}.pagination .older{float:left;padding-left:0}.pagination .older .fa{display:inline-block;margin-right:5px}.pagination .newer{float:right;padding-right:0}.pagination .newer .fa{display:inline-block;margin-left:5px}.pagination .disabled{cursor:default;color:#233346}@media screen and (max-width: 700px){.pagination{padding:30px 20px}.pagination .page{display:none}.pagination .newer,.pagination .older{display:inline-block}}.nothing-here{background:#121a24;box-shadow:0 0 15px rgba(0,0,0,.2);color:#9baec8;font-size:14px;font-weight:500;text-align:center;display:flex;justify-content:center;align-items:center;cursor:default;border-radius:4px;padding:20px;min-height:30vh}.nothing-here--under-tabs{border-radius:0 0 4px 4px}.nothing-here--flexible{box-sizing:border-box;min-height:100%}.account-role,.simple_form .recommended{display:inline-block;padding:4px 6px;cursor:default;border-radius:3px;font-size:12px;line-height:12px;font-weight:500;color:#d9e1e8;background-color:rgba(217,225,232,.1);border:1px solid rgba(217,225,232,.5)}.account-role.moderator,.simple_form .recommended.moderator{color:#79bd9a;background-color:rgba(121,189,154,.1);border-color:rgba(121,189,154,.5)}.account-role.admin,.simple_form .recommended.admin{color:#e87487;background-color:rgba(232,116,135,.1);border-color:rgba(232,116,135,.5)}.account__header__fields{max-width:100vw;padding:0;margin:15px -15px -15px;border:0 none;border-top:1px solid #26374d;border-bottom:1px solid #26374d;font-size:14px;line-height:20px}.account__header__fields dl{display:flex;border-bottom:1px solid #26374d}.account__header__fields dt,.account__header__fields dd{box-sizing:border-box;padding:14px;text-align:center;max-height:48px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.account__header__fields dt{font-weight:500;width:120px;flex:0 0 auto;color:#d9e1e8;background:rgba(4,6,9,.5)}.account__header__fields dd{flex:1 1 auto;color:#9baec8}.account__header__fields a{color:#00007f;text-decoration:none}.account__header__fields a:hover,.account__header__fields a:focus,.account__header__fields a:active{text-decoration:underline}.account__header__fields .verified{border:1px solid rgba(121,189,154,.5);background:rgba(121,189,154,.25)}.account__header__fields .verified a{color:#79bd9a;font-weight:500}.account__header__fields .verified__mark{color:#79bd9a}.account__header__fields dl:last-child{border-bottom:0}.directory__tag .trends__item__current{width:auto}.pending-account__header{color:#9baec8}.pending-account__header a{color:#d9e1e8;text-decoration:none}.pending-account__header a:hover,.pending-account__header a:active,.pending-account__header a:focus{text-decoration:underline}.pending-account__header strong{color:#fff;font-weight:700}.pending-account__body{margin-top:10px}.activity-stream{box-shadow:0 0 15px rgba(0,0,0,.2);border-radius:4px;overflow:hidden;margin-bottom:10px}.activity-stream--under-tabs{border-radius:0 0 4px 4px}@media screen and (max-width: 415px){.activity-stream{margin-bottom:0;border-radius:0;box-shadow:none}}.activity-stream--headless{border-radius:0;margin:0;box-shadow:none}.activity-stream--headless .detailed-status,.activity-stream--headless .status{border-radius:0 !important}.activity-stream div[data-component]{width:100%}.activity-stream .entry{background:#121a24}.activity-stream .entry .detailed-status,.activity-stream .entry .status,.activity-stream .entry .load-more{animation:none}.activity-stream .entry:last-child .detailed-status,.activity-stream .entry:last-child .status,.activity-stream .entry:last-child .load-more{border-bottom:0;border-radius:0 0 4px 4px}.activity-stream .entry:first-child .detailed-status,.activity-stream .entry:first-child .status,.activity-stream .entry:first-child .load-more{border-radius:4px 4px 0 0}.activity-stream .entry:first-child:last-child .detailed-status,.activity-stream .entry:first-child:last-child .status,.activity-stream .entry:first-child:last-child .load-more{border-radius:4px}@media screen and (max-width: 740px){.activity-stream .entry .detailed-status,.activity-stream .entry .status,.activity-stream .entry .load-more{border-radius:0 !important}}.activity-stream--highlighted .entry{background:#202e3f}.button.logo-button{flex:0 auto;font-size:14px;background:#00007f;color:#fff;text-transform:none;line-height:36px;height:auto;padding:3px 15px;border:0}.button.logo-button svg{width:20px;height:auto;vertical-align:middle;margin-right:5px;fill:#fff}.button.logo-button:active,.button.logo-button:focus,.button.logo-button:hover{background:#0000b2}.button.logo-button:disabled:active,.button.logo-button:disabled:focus,.button.logo-button:disabled:hover,.button.logo-button.disabled:active,.button.logo-button.disabled:focus,.button.logo-button.disabled:hover{background:#9baec8}.button.logo-button.button--destructive:active,.button.logo-button.button--destructive:focus,.button.logo-button.button--destructive:hover{background:#df405a}@media screen and (max-width: 415px){.button.logo-button svg{display:none}}.embed .detailed-status,.public-layout .detailed-status{padding:15px}.embed .status,.public-layout .status{padding:15px 15px 15px 78px;min-height:50px}.embed .status__avatar,.public-layout .status__avatar{left:15px;top:17px}.embed .status__content,.public-layout .status__content{padding-top:5px}.embed .status__prepend,.public-layout .status__prepend{margin-left:78px;padding-top:15px}.embed .status__prepend-icon-wrapper,.public-layout .status__prepend-icon-wrapper{left:-32px}.embed .status .media-gallery,.embed .status__action-bar,.embed .status .video-player,.public-layout .status .media-gallery,.public-layout .status__action-bar,.public-layout .status .video-player{margin-top:10px}button.icon-button i.fa-retweet{background-image:url(\"data:image/svg+xml;utf8,\")}button.icon-button i.fa-retweet:hover{background-image:url(\"data:image/svg+xml;utf8,\")}button.icon-button.disabled i.fa-retweet{background-image:url(\"data:image/svg+xml;utf8,\")}.app-body{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.animated-number{display:inline-flex;flex-direction:column;align-items:stretch;overflow:hidden;position:relative}.link-button{display:block;font-size:15px;line-height:20px;color:#00007f;border:0;background:transparent;padding:0;cursor:pointer}.link-button:hover,.link-button:active{text-decoration:underline}.link-button:disabled{color:#9baec8;cursor:default}.button{background-color:#00007f;border:10px none;border-radius:4px;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-family:inherit;font-size:14px;font-weight:500;height:36px;letter-spacing:0;line-height:36px;overflow:hidden;padding:0 16px;position:relative;text-align:center;text-transform:uppercase;text-decoration:none;text-overflow:ellipsis;transition:all 100ms ease-in;white-space:nowrap;width:auto}.button:active,.button:focus,.button:hover{background-color:#0000b2;transition:all 200ms ease-out}.button--destructive{transition:none}.button--destructive:active,.button--destructive:focus,.button--destructive:hover{background-color:#df405a;transition:none}.button:disabled,.button.disabled{background-color:#9baec8;cursor:default}.button::-moz-focus-inner{border:0}.button::-moz-focus-inner,.button:focus,.button:active{outline:0 !important}.button.button-primary,.button.button-alternative,.button.button-secondary,.button.button-alternative-2{font-size:16px;line-height:36px;height:auto;text-transform:none;padding:4px 16px}.button.button-alternative{color:#121a24;background:#9baec8}.button.button-alternative:active,.button.button-alternative:focus,.button.button-alternative:hover{background-color:#a8b9cf}.button.button-alternative-2{background:#404040}.button.button-alternative-2:active,.button.button-alternative-2:focus,.button.button-alternative-2:hover{background-color:#4a4a4a}.button.button-secondary{color:#9baec8;background:transparent;padding:3px 15px;border:1px solid #9baec8}.button.button-secondary:active,.button.button-secondary:focus,.button.button-secondary:hover{border-color:#a8b9cf;color:#a8b9cf}.button.button-secondary:disabled{opacity:.5}.button.button--block{display:block;width:100%}.column__wrapper{display:flex;flex:1 1 auto;position:relative}.icon-button{display:inline-block;padding:0;color:#404040;border:0;border-radius:4px;background:transparent;cursor:pointer;transition:all 100ms ease-in;transition-property:background-color,color}.icon-button:hover,.icon-button:active,.icon-button:focus{color:#525252;background-color:rgba(64,64,64,.15);transition:all 200ms ease-out;transition-property:background-color,color}.icon-button:focus{background-color:rgba(64,64,64,.3)}.icon-button.disabled{color:#1f1f1f;background-color:transparent;cursor:default}.icon-button.active{color:#00007f}.icon-button::-moz-focus-inner{border:0}.icon-button::-moz-focus-inner,.icon-button:focus,.icon-button:active{outline:0 !important}.icon-button.inverted{color:#404040}.icon-button.inverted:hover,.icon-button.inverted:active,.icon-button.inverted:focus{color:#2e2e2e;background-color:rgba(64,64,64,.15)}.icon-button.inverted:focus{background-color:rgba(64,64,64,.3)}.icon-button.inverted.disabled{color:#525252;background-color:transparent}.icon-button.inverted.active{color:#00007f}.icon-button.inverted.active.disabled{color:#0000c1}.icon-button.overlayed{box-sizing:content-box;background:rgba(0,0,0,.6);color:rgba(255,255,255,.7);border-radius:4px;padding:2px}.icon-button.overlayed:hover{background:rgba(0,0,0,.9)}.text-icon-button{color:#404040;border:0;border-radius:4px;background:transparent;cursor:pointer;font-weight:600;font-size:11px;padding:0 3px;line-height:27px;outline:0;transition:all 100ms ease-in;transition-property:background-color,color}.text-icon-button:hover,.text-icon-button:active,.text-icon-button:focus{color:#2e2e2e;background-color:rgba(64,64,64,.15);transition:all 200ms ease-out;transition-property:background-color,color}.text-icon-button:focus{background-color:rgba(64,64,64,.3)}.text-icon-button.disabled{color:#737373;background-color:transparent;cursor:default}.text-icon-button.active{color:#00007f}.text-icon-button::-moz-focus-inner{border:0}.text-icon-button::-moz-focus-inner,.text-icon-button:focus,.text-icon-button:active{outline:0 !important}.dropdown-menu{position:absolute}.invisible{font-size:0;line-height:0;display:inline-block;width:0;height:0;position:absolute}.invisible img,.invisible svg{margin:0 !important;border:0 !important;padding:0 !important;width:0 !important;height:0 !important}.ellipsis::after{content:\"…\"}.compose-form{padding:10px}.compose-form__sensitive-button{padding:10px;padding-top:0;font-size:14px;font-weight:500}.compose-form__sensitive-button.active{color:#00007f}.compose-form__sensitive-button input[type=checkbox]{display:none}.compose-form__sensitive-button .checkbox{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:4px;vertical-align:middle}.compose-form__sensitive-button .checkbox.active{border-color:#00007f;background:#00007f}.compose-form .compose-form__warning{color:#121a24;margin-bottom:10px;background:#9baec8;box-shadow:0 2px 6px rgba(0,0,0,.3);padding:8px 10px;border-radius:4px;font-size:13px;font-weight:400}.compose-form .compose-form__warning strong{color:#121a24;font-weight:500}.compose-form .compose-form__warning strong:lang(ja){font-weight:700}.compose-form .compose-form__warning strong:lang(ko){font-weight:700}.compose-form .compose-form__warning strong:lang(zh-CN){font-weight:700}.compose-form .compose-form__warning strong:lang(zh-HK){font-weight:700}.compose-form .compose-form__warning strong:lang(zh-TW){font-weight:700}.compose-form .compose-form__warning a{color:#404040;font-weight:500;text-decoration:underline}.compose-form .compose-form__warning a:hover,.compose-form .compose-form__warning a:active,.compose-form .compose-form__warning a:focus{text-decoration:none}.compose-form .emoji-picker-dropdown{position:absolute;top:0;right:0}.compose-form .compose-form__autosuggest-wrapper{position:relative}.compose-form .autosuggest-textarea,.compose-form .autosuggest-input,.compose-form .spoiler-input{position:relative;width:100%}.compose-form .spoiler-input{height:0;transform-origin:bottom;opacity:0}.compose-form .spoiler-input.spoiler-input--visible{height:36px;margin-bottom:11px;opacity:1}.compose-form .autosuggest-textarea__textarea,.compose-form .spoiler-input__input{display:block;box-sizing:border-box;width:100%;margin:0;color:#121a24;background:#fff;padding:10px;font-family:inherit;font-size:14px;resize:vertical;border:0;outline:0}.compose-form .autosuggest-textarea__textarea::placeholder,.compose-form .spoiler-input__input::placeholder{color:#404040}.compose-form .autosuggest-textarea__textarea:focus,.compose-form .spoiler-input__input:focus{outline:0}@media screen and (max-width: 600px){.compose-form .autosuggest-textarea__textarea,.compose-form .spoiler-input__input{font-size:16px}}.compose-form .spoiler-input__input{border-radius:4px}.compose-form .autosuggest-textarea__textarea{min-height:100px;border-radius:4px 4px 0 0;padding-bottom:0;padding-right:32px;resize:none;scrollbar-color:initial}.compose-form .autosuggest-textarea__textarea::-webkit-scrollbar{all:unset}@media screen and (max-width: 600px){.compose-form .autosuggest-textarea__textarea{height:100px !important;resize:vertical}}.compose-form .autosuggest-textarea__suggestions-wrapper{position:relative;height:0}.compose-form .autosuggest-textarea__suggestions{box-sizing:border-box;display:none;position:absolute;top:100%;width:100%;z-index:99;box-shadow:4px 4px 6px rgba(0,0,0,.4);background:#d9e1e8;border-radius:0 0 4px 4px;color:#121a24;font-size:14px;padding:6px}.compose-form .autosuggest-textarea__suggestions.autosuggest-textarea__suggestions--visible{display:block}.compose-form .autosuggest-textarea__suggestions__item{padding:10px;cursor:pointer;border-radius:4px}.compose-form .autosuggest-textarea__suggestions__item:hover,.compose-form .autosuggest-textarea__suggestions__item:focus,.compose-form .autosuggest-textarea__suggestions__item:active,.compose-form .autosuggest-textarea__suggestions__item.selected{background:#b9c8d5}.compose-form .autosuggest-account,.compose-form .autosuggest-emoji,.compose-form .autosuggest-hashtag{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;line-height:18px;font-size:14px}.compose-form .autosuggest-hashtag{justify-content:space-between}.compose-form .autosuggest-hashtag__name{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.compose-form .autosuggest-hashtag strong{font-weight:500}.compose-form .autosuggest-hashtag__uses{flex:0 0 auto;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.compose-form .autosuggest-account-icon,.compose-form .autosuggest-emoji img{display:block;margin-right:8px;width:16px;height:16px}.compose-form .autosuggest-account .display-name__account{color:#404040}.compose-form .compose-form__modifiers{color:#121a24;font-family:inherit;font-size:14px;background:#fff}.compose-form .compose-form__modifiers .compose-form__upload-wrapper{overflow:hidden}.compose-form .compose-form__modifiers .compose-form__uploads-wrapper{display:flex;flex-direction:row;padding:5px;flex-wrap:wrap}.compose-form .compose-form__modifiers .compose-form__upload{flex:1 1 0;min-width:40%;margin:5px}.compose-form .compose-form__modifiers .compose-form__upload__actions{background:linear-gradient(180deg, rgba(0, 0, 0, 0.8) 0, rgba(0, 0, 0, 0.35) 80%, transparent);display:flex;align-items:flex-start;justify-content:space-between;opacity:0;transition:opacity .1s ease}.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button{flex:0 1 auto;color:#d9e1e8;font-size:14px;font-weight:500;padding:10px;font-family:inherit}.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button:hover,.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button:focus,.compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button:active{color:#eff3f5}.compose-form .compose-form__modifiers .compose-form__upload__actions.active{opacity:1}.compose-form .compose-form__modifiers .compose-form__upload-description{position:absolute;z-index:2;bottom:0;left:0;right:0;box-sizing:border-box;background:linear-gradient(0deg, rgba(0, 0, 0, 0.8) 0, rgba(0, 0, 0, 0.35) 80%, transparent);padding:10px;opacity:0;transition:opacity .1s ease}.compose-form .compose-form__modifiers .compose-form__upload-description textarea{background:transparent;color:#d9e1e8;border:0;padding:0;margin:0;width:100%;font-family:inherit;font-size:14px;font-weight:500}.compose-form .compose-form__modifiers .compose-form__upload-description textarea:focus{color:#fff}.compose-form .compose-form__modifiers .compose-form__upload-description textarea::placeholder{opacity:.75;color:#d9e1e8}.compose-form .compose-form__modifiers .compose-form__upload-description.active{opacity:1}.compose-form .compose-form__modifiers .compose-form__upload-thumbnail{border-radius:4px;background-color:#000;background-position:center;background-size:cover;background-repeat:no-repeat;height:140px;width:100%;overflow:hidden}.compose-form .compose-form__buttons-wrapper{padding:10px;background:#ebebeb;border-radius:0 0 4px 4px;display:flex;justify-content:space-between;flex:0 0 auto}.compose-form .compose-form__buttons-wrapper .compose-form__buttons{display:flex}.compose-form .compose-form__buttons-wrapper .compose-form__buttons .compose-form__upload-button-icon{line-height:27px}.compose-form .compose-form__buttons-wrapper .compose-form__buttons .compose-form__sensitive-button{display:none}.compose-form .compose-form__buttons-wrapper .compose-form__buttons .compose-form__sensitive-button.compose-form__sensitive-button--visible{display:block}.compose-form .compose-form__buttons-wrapper .compose-form__buttons .compose-form__sensitive-button .compose-form__sensitive-button__icon{line-height:27px}.compose-form .compose-form__buttons-wrapper .icon-button,.compose-form .compose-form__buttons-wrapper .text-icon-button{box-sizing:content-box;padding:0 3px}.compose-form .compose-form__buttons-wrapper .character-counter__wrapper{align-self:center;margin-right:4px}.compose-form .compose-form__publish{display:flex;justify-content:flex-end;min-width:0;flex:0 0 auto}.compose-form .compose-form__publish .compose-form__publish-button-wrapper{overflow:hidden;padding-top:10px}.character-counter{cursor:default;font-family:\"mastodon-font-sans-serif\",sans-serif;font-size:14px;font-weight:600;color:#404040}.character-counter.character-counter--over{color:#ff5050}.no-reduce-motion .spoiler-input{transition:height .4s ease,opacity .4s ease}.emojione{font-size:inherit;vertical-align:middle;object-fit:contain;margin:-0.2ex .15em .2ex;width:16px;height:16px}.emojione img{width:auto}.reply-indicator{border-radius:4px;margin-bottom:10px;background:#9baec8;padding:10px;min-height:23px;overflow-y:auto;flex:0 2 auto}.reply-indicator__header{margin-bottom:5px;overflow:hidden}.reply-indicator__cancel{float:right;line-height:24px}.reply-indicator__display-name{color:#121a24;display:block;max-width:100%;line-height:24px;overflow:hidden;padding-right:25px;text-decoration:none}.reply-indicator__display-avatar{float:left;margin-right:5px}.status__content--with-action{cursor:pointer}.status__content,.reply-indicator__content{position:relative;font-size:15px;line-height:20px;word-wrap:break-word;font-weight:400;overflow:hidden;text-overflow:ellipsis;padding-top:2px;color:#fff}.status__content:focus,.reply-indicator__content:focus{outline:0}.status__content.status__content--with-spoiler,.reply-indicator__content.status__content--with-spoiler{white-space:normal}.status__content.status__content--with-spoiler .status__content__text,.reply-indicator__content.status__content--with-spoiler .status__content__text{white-space:pre-wrap}.status__content .emojione,.reply-indicator__content .emojione{width:20px;height:20px;margin:-3px 0 0}.status__content img,.reply-indicator__content img{max-width:100%;max-height:400px;object-fit:contain}.status__content p,.reply-indicator__content p{margin-bottom:20px;white-space:pre-wrap}.status__content p:last-child,.reply-indicator__content p:last-child{margin-bottom:0}.status__content a,.reply-indicator__content a{color:#d8a070;text-decoration:none}.status__content a:hover,.reply-indicator__content a:hover{text-decoration:underline}.status__content a:hover .fa,.reply-indicator__content a:hover .fa{color:#525252}.status__content a.mention:hover,.reply-indicator__content a.mention:hover{text-decoration:none}.status__content a.mention:hover span,.reply-indicator__content a.mention:hover span{text-decoration:underline}.status__content a .fa,.reply-indicator__content a .fa{color:#404040}.status__content a.unhandled-link,.reply-indicator__content a.unhandled-link{color:#0000a8}.status__content .status__content__spoiler-link,.reply-indicator__content .status__content__spoiler-link{background:#404040}.status__content .status__content__spoiler-link:hover,.reply-indicator__content .status__content__spoiler-link:hover{background:#525252;text-decoration:none}.status__content .status__content__spoiler-link::-moz-focus-inner,.reply-indicator__content .status__content__spoiler-link::-moz-focus-inner{border:0}.status__content .status__content__spoiler-link::-moz-focus-inner,.status__content .status__content__spoiler-link:focus,.status__content .status__content__spoiler-link:active,.reply-indicator__content .status__content__spoiler-link::-moz-focus-inner,.reply-indicator__content .status__content__spoiler-link:focus,.reply-indicator__content .status__content__spoiler-link:active{outline:0 !important}.status__content .status__content__text,.reply-indicator__content .status__content__text{display:none}.status__content .status__content__text.status__content__text--visible,.reply-indicator__content .status__content__text.status__content__text--visible{display:block}.announcements__item__content{word-wrap:break-word;overflow-y:auto}.announcements__item__content .emojione{width:20px;height:20px;margin:-3px 0 0}.announcements__item__content p{margin-bottom:10px;white-space:pre-wrap}.announcements__item__content p:last-child{margin-bottom:0}.announcements__item__content a{color:#d9e1e8;text-decoration:none}.announcements__item__content a:hover{text-decoration:underline}.announcements__item__content a.mention:hover{text-decoration:none}.announcements__item__content a.mention:hover span{text-decoration:underline}.announcements__item__content a.unhandled-link{color:#0000a8}.status__content.status__content--collapsed{max-height:300px}.status__content__read-more-button{display:block;font-size:15px;line-height:20px;color:#0000a8;border:0;background:transparent;padding:0;padding-top:8px;text-decoration:none}.status__content__read-more-button:hover,.status__content__read-more-button:active{text-decoration:underline}.status__content__spoiler-link{display:inline-block;border-radius:2px;background:transparent;border:0;color:#121a24;font-weight:700;font-size:11px;padding:0 6px;text-transform:uppercase;line-height:20px;cursor:pointer;vertical-align:middle}.status__wrapper--filtered{color:#404040;border:0;font-size:inherit;text-align:center;line-height:inherit;margin:0;padding:15px;box-sizing:border-box;width:100%;clear:both;border-bottom:1px solid #202e3f}.status__prepend-icon-wrapper{left:-26px;position:absolute}.focusable:focus{outline:0;background:#192432}.focusable:focus .status.status-direct{background:#26374d}.focusable:focus .status.status-direct.muted{background:transparent}.focusable:focus .detailed-status,.focusable:focus .detailed-status__action-bar{background:#202e3f}.status{padding:8px 10px;padding-left:68px;position:relative;min-height:54px;border-bottom:1px solid #202e3f;cursor:default;opacity:1;animation:fade 150ms linear}@supports(-ms-overflow-style: -ms-autohiding-scrollbar){.status{padding-right:26px}}@keyframes fade{0%{opacity:0}100%{opacity:1}}.status .video-player,.status .audio-player{margin-top:8px}.status.status-direct:not(.read){background:#202e3f;border-bottom-color:#26374d}.status.light .status__relative-time{color:#9baec8}.status.light .status__display-name{color:#121a24}.status.light .display-name{color:#9baec8}.status.light .display-name strong{color:#121a24}.status.light .status__content{color:#121a24}.status.light .status__content a{color:#00007f}.status.light .status__content a.status__content__spoiler-link{color:#fff;background:#9baec8}.status.light .status__content a.status__content__spoiler-link:hover{background:#b5c3d6}.notification-favourite .status.status-direct{background:transparent}.notification-favourite .status.status-direct .icon-button.disabled{color:#616161}.status__relative-time,.notification__relative_time{color:#404040;float:right;font-size:14px}.status__display-name{color:#404040}.status__info .status__display-name{display:block;max-width:100%;padding-right:25px}.status__info{font-size:15px}.status-check-box{border-bottom:1px solid #d9e1e8;display:flex}.status-check-box .status-check-box__status{margin:10px 0 10px 10px;flex:1;overflow:hidden}.status-check-box .status-check-box__status .media-gallery{max-width:250px}.status-check-box .status-check-box__status .status__content{padding:0;white-space:normal}.status-check-box .status-check-box__status .video-player,.status-check-box .status-check-box__status .audio-player{margin-top:8px;max-width:250px}.status-check-box .status-check-box__status .media-gallery__item-thumbnail{cursor:default}.status-check-box-toggle{align-items:center;display:flex;flex:0 0 auto;justify-content:center;padding:10px}.status__prepend{margin-left:68px;color:#404040;padding:8px 0;padding-bottom:2px;font-size:14px;position:relative}.status__prepend .status__display-name strong{color:#404040}.status__prepend>span{display:block;overflow:hidden;text-overflow:ellipsis}.status__action-bar{align-items:center;display:flex;margin-top:8px}.status__action-bar__counter{display:inline-flex;margin-right:11px;align-items:center}.status__action-bar__counter .status__action-bar-button{margin-right:4px}.status__action-bar__counter__label{display:inline-block;width:14px;font-size:12px;font-weight:500;color:#404040}.status__action-bar-button{margin-right:18px}.status__action-bar-dropdown{height:23.15px;width:23.15px}.detailed-status__action-bar-dropdown{flex:1 1 auto;display:flex;align-items:center;justify-content:center;position:relative}.detailed-status{background:#192432;padding:14px 10px}.detailed-status--flex{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-start}.detailed-status--flex .status__content,.detailed-status--flex .detailed-status__meta{flex:100%}.detailed-status .status__content{font-size:19px;line-height:24px}.detailed-status .status__content .emojione{width:24px;height:24px;margin:-1px 0 0}.detailed-status .status__content .status__content__spoiler-link{line-height:24px;margin:-1px 0 0}.detailed-status .video-player,.detailed-status .audio-player{margin-top:8px}.detailed-status__meta{margin-top:15px;color:#404040;font-size:14px;line-height:18px}.detailed-status__action-bar{background:#192432;border-top:1px solid #202e3f;border-bottom:1px solid #202e3f;display:flex;flex-direction:row;padding:10px 0}.detailed-status__link{color:inherit;text-decoration:none}.detailed-status__favorites,.detailed-status__reblogs{display:inline-block;font-weight:500;font-size:12px;margin-left:6px}.reply-indicator__content{color:#121a24;font-size:14px}.reply-indicator__content a{color:#404040}.domain{padding:10px;border-bottom:1px solid #202e3f}.domain .domain__domain-name{flex:1 1 auto;display:block;color:#fff;text-decoration:none;font-size:14px;font-weight:500}.domain__wrapper{display:flex}.domain_buttons{height:18px;padding:10px;white-space:nowrap}.account{padding:10px;border-bottom:1px solid #202e3f}.account.compact{padding:0;border-bottom:0}.account.compact .account__avatar-wrapper{margin-left:0}.account .account__display-name{flex:1 1 auto;display:block;color:#9baec8;overflow:hidden;text-decoration:none;font-size:14px}.account__wrapper{display:flex}.account__avatar-wrapper{float:left;margin-left:12px;margin-right:12px}.account__avatar{border-radius:4px;background:transparent no-repeat;background-position:50%;background-clip:padding-box;position:relative}.account__avatar-inline{display:inline-block;vertical-align:middle;margin-right:5px}.account__avatar-composite{border-radius:4px;background:transparent no-repeat;background-position:50%;background-clip:padding-box;border-radius:50%;overflow:hidden;position:relative}.account__avatar-composite>div{float:left;position:relative;box-sizing:border-box}.account__avatar-composite__label{display:block;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);color:#fff;text-shadow:1px 1px 2px #000;font-weight:700;font-size:15px}a .account__avatar{cursor:pointer}.account__avatar-overlay{width:48px;height:48px;background-size:48px 48px}.account__avatar-overlay-base{border-radius:4px;background:transparent no-repeat;background-position:50%;background-clip:padding-box;width:36px;height:36px;background-size:36px 36px}.account__avatar-overlay-overlay{border-radius:4px;background:transparent no-repeat;background-position:50%;background-clip:padding-box;width:24px;height:24px;background-size:24px 24px;position:absolute;bottom:0;right:0;z-index:1}.account__relationship{height:18px;padding:10px;white-space:nowrap}.account__disclaimer{padding:10px;border-top:1px solid #202e3f;color:#404040}.account__disclaimer strong{font-weight:500}.account__disclaimer strong:lang(ja){font-weight:700}.account__disclaimer strong:lang(ko){font-weight:700}.account__disclaimer strong:lang(zh-CN){font-weight:700}.account__disclaimer strong:lang(zh-HK){font-weight:700}.account__disclaimer strong:lang(zh-TW){font-weight:700}.account__disclaimer a{font-weight:500;color:inherit;text-decoration:underline}.account__disclaimer a:hover,.account__disclaimer a:focus,.account__disclaimer a:active{text-decoration:none}.account__action-bar{border-top:1px solid #202e3f;border-bottom:1px solid #202e3f;line-height:36px;overflow:hidden;flex:0 0 auto;display:flex}.account__action-bar-dropdown{padding:10px}.account__action-bar-dropdown .icon-button{vertical-align:middle}.account__action-bar-dropdown .dropdown--active .dropdown__content.dropdown__right{left:6px;right:initial}.account__action-bar-dropdown .dropdown--active::after{bottom:initial;margin-left:11px;margin-top:-7px;right:initial}.account__action-bar-links{display:flex;flex:1 1 auto;line-height:18px;text-align:center}.account__action-bar__tab{text-decoration:none;overflow:hidden;flex:0 1 100%;border-right:1px solid #202e3f;padding:10px 0;border-bottom:4px solid transparent}.account__action-bar__tab.active{border-bottom:4px solid #00007f}.account__action-bar__tab>span{display:block;text-transform:uppercase;font-size:11px;color:#9baec8}.account__action-bar__tab strong{display:block;font-size:15px;font-weight:500;color:#fff}.account__action-bar__tab strong:lang(ja){font-weight:700}.account__action-bar__tab strong:lang(ko){font-weight:700}.account__action-bar__tab strong:lang(zh-CN){font-weight:700}.account__action-bar__tab strong:lang(zh-HK){font-weight:700}.account__action-bar__tab strong:lang(zh-TW){font-weight:700}.account-authorize{padding:14px 10px}.account-authorize .detailed-status__display-name{display:block;margin-bottom:15px;overflow:hidden}.account-authorize__avatar{float:left;margin-right:10px}.status__display-name,.status__relative-time,.detailed-status__display-name,.detailed-status__datetime,.detailed-status__application,.account__display-name{text-decoration:none}.status__display-name strong,.account__display-name strong{color:#fff}.muted .emojione{opacity:.5}.status__display-name:hover strong,.reply-indicator__display-name:hover strong,.detailed-status__display-name:hover strong,a.account__display-name:hover strong{text-decoration:underline}.account__display-name strong{display:block;overflow:hidden;text-overflow:ellipsis}.detailed-status__application,.detailed-status__datetime{color:inherit}.detailed-status .button.logo-button{margin-bottom:15px}.detailed-status__display-name{color:#d9e1e8;display:block;line-height:24px;margin-bottom:15px;overflow:hidden}.detailed-status__display-name strong,.detailed-status__display-name span{display:block;text-overflow:ellipsis;overflow:hidden}.detailed-status__display-name strong{font-size:16px;color:#fff}.detailed-status__display-avatar{float:left;margin-right:10px}.status__avatar{height:48px;left:10px;position:absolute;top:10px;width:48px}.status__expand{width:68px;position:absolute;left:0;top:0;height:100%;cursor:pointer}.muted .status__content,.muted .status__content p,.muted .status__content a{color:#404040}.muted .status__display-name strong{color:#404040}.muted .status__avatar{opacity:.5}.muted a.status__content__spoiler-link{background:#404040;color:#121a24}.muted a.status__content__spoiler-link:hover{background:#525252;text-decoration:none}.notification__message{margin:0 10px 0 68px;padding:8px 0 0;cursor:default;color:#9baec8;font-size:15px;line-height:22px;position:relative}.notification__message .fa{color:#00007f}.notification__message>span{display:inline;overflow:hidden;text-overflow:ellipsis}.notification__favourite-icon-wrapper{left:-26px;position:absolute}.notification__favourite-icon-wrapper .star-icon{color:#ca8f04}.star-icon.active{color:#ca8f04}.bookmark-icon.active{color:#ff5050}.no-reduce-motion .icon-button.star-icon.activate>.fa-star{animation:spring-rotate-in 1s linear}.no-reduce-motion .icon-button.star-icon.deactivate>.fa-star{animation:spring-rotate-out 1s linear}.notification__display-name{color:inherit;font-weight:500;text-decoration:none}.notification__display-name:hover{color:#fff;text-decoration:underline}.notification__relative_time{float:right}.display-name{display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.display-name__html{font-weight:500}.display-name__account{font-size:14px}.status__relative-time:hover,.detailed-status__datetime:hover{text-decoration:underline}.image-loader{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center;flex-direction:column}.image-loader .image-loader__preview-canvas{max-width:100%;max-height:80%;background:url(\"~images/void.png\") repeat;object-fit:contain}.image-loader .loading-bar{position:relative}.image-loader.image-loader--amorphous .image-loader__preview-canvas{display:none}.zoomable-image{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center}.zoomable-image img{max-width:100%;max-height:80%;width:auto;height:auto;object-fit:contain}.navigation-bar{padding:10px;display:flex;align-items:center;flex-shrink:0;cursor:default;color:#9baec8}.navigation-bar strong{color:#d9e1e8}.navigation-bar a{color:inherit}.navigation-bar .permalink{text-decoration:none}.navigation-bar .navigation-bar__actions{position:relative}.navigation-bar .navigation-bar__actions .icon-button.close{position:absolute;pointer-events:none;transform:scale(0, 1) translate(-100%, 0);opacity:0}.navigation-bar .navigation-bar__actions .compose__action-bar .icon-button{pointer-events:auto;transform:scale(1, 1) translate(0, 0);opacity:1}.navigation-bar__profile{flex:1 1 auto;margin-left:8px;line-height:20px;margin-top:-1px;overflow:hidden}.navigation-bar__profile-account{display:block;font-weight:500;overflow:hidden;text-overflow:ellipsis}.navigation-bar__profile-edit{color:inherit;text-decoration:none}.dropdown{display:inline-block}.dropdown__content{display:none;position:absolute}.dropdown-menu__separator{border-bottom:1px solid #c0cdd9;margin:5px 7px 6px;height:0}.dropdown-menu{background:#d9e1e8;padding:4px 0;border-radius:4px;box-shadow:2px 4px 15px rgba(0,0,0,.4);z-index:9999}.dropdown-menu ul{list-style:none}.dropdown-menu.left{transform-origin:100% 50%}.dropdown-menu.top{transform-origin:50% 100%}.dropdown-menu.bottom{transform-origin:50% 0}.dropdown-menu.right{transform-origin:0 50%}.dropdown-menu__arrow{position:absolute;width:0;height:0;border:0 solid transparent}.dropdown-menu__arrow.left{right:-5px;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#d9e1e8}.dropdown-menu__arrow.top{bottom:-5px;margin-left:-7px;border-width:5px 7px 0;border-top-color:#d9e1e8}.dropdown-menu__arrow.bottom{top:-5px;margin-left:-7px;border-width:0 7px 5px;border-bottom-color:#d9e1e8}.dropdown-menu__arrow.right{left:-5px;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#d9e1e8}.dropdown-menu__item a{font-size:13px;line-height:18px;display:block;padding:4px 14px;box-sizing:border-box;text-decoration:none;background:#d9e1e8;color:#121a24;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown-menu__item a:focus,.dropdown-menu__item a:hover,.dropdown-menu__item a:active{background:#00007f;color:#d9e1e8;outline:0}.dropdown--active .dropdown__content{display:block;line-height:18px;max-width:311px;right:0;text-align:left;z-index:9999}.dropdown--active .dropdown__content>ul{list-style:none;background:#d9e1e8;padding:4px 0;border-radius:4px;box-shadow:0 0 15px rgba(0,0,0,.4);min-width:140px;position:relative}.dropdown--active .dropdown__content.dropdown__right{right:0}.dropdown--active .dropdown__content.dropdown__left>ul{left:-98px}.dropdown--active .dropdown__content>ul>li>a{font-size:13px;line-height:18px;display:block;padding:4px 14px;box-sizing:border-box;text-decoration:none;background:#d9e1e8;color:#121a24;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown--active .dropdown__content>ul>li>a:focus{outline:0}.dropdown--active .dropdown__content>ul>li>a:hover{background:#00007f;color:#d9e1e8}.dropdown__icon{vertical-align:middle}.columns-area{display:flex;flex:1 1 auto;flex-direction:row;justify-content:flex-start;overflow-x:auto;position:relative}.columns-area.unscrollable{overflow-x:hidden}.columns-area__panels{display:flex;justify-content:center;width:100%;height:100%;min-height:100vh}.columns-area__panels__pane{height:100%;overflow:hidden;pointer-events:none;display:flex;justify-content:flex-end;min-width:285px}.columns-area__panels__pane--start{justify-content:flex-start}.columns-area__panels__pane__inner{position:fixed;width:285px;pointer-events:auto;height:100%}.columns-area__panels__main{box-sizing:border-box;width:100%;max-width:600px;flex:0 0 auto;display:flex;flex-direction:column}@media screen and (min-width: 415px){.columns-area__panels__main{padding:0 10px}}.tabs-bar__wrapper{background:#040609;position:sticky;top:0;z-index:2;padding-top:0}@media screen and (min-width: 415px){.tabs-bar__wrapper{padding-top:10px}}.tabs-bar__wrapper .tabs-bar{margin-bottom:0}@media screen and (min-width: 415px){.tabs-bar__wrapper .tabs-bar{margin-bottom:10px}}.react-swipeable-view-container,.react-swipeable-view-container .columns-area,.react-swipeable-view-container .drawer,.react-swipeable-view-container .column{height:100%}.react-swipeable-view-container>*{display:flex;align-items:center;justify-content:center;height:100%}.column{width:350px;position:relative;box-sizing:border-box;display:flex;flex-direction:column}.column>.scrollable{background:#121a24;border-bottom-left-radius:2px;border-bottom-right-radius:2px}.ui{flex:0 0 auto;display:flex;flex-direction:column;width:100%;height:100%}.drawer{width:330px;box-sizing:border-box;display:flex;flex-direction:column;overflow-y:hidden}.drawer__tab{display:block;flex:1 1 auto;padding:15px 5px 13px;color:#9baec8;text-decoration:none;text-align:center;font-size:16px;border-bottom:2px solid transparent}.column,.drawer{flex:1 1 auto;overflow:hidden}@media screen and (min-width: 631px){.columns-area{padding:0}.column,.drawer{flex:0 0 auto;padding:10px;padding-left:5px;padding-right:5px}.column:first-child,.drawer:first-child{padding-left:10px}.column:last-child,.drawer:last-child{padding-right:10px}.columns-area>div .column,.columns-area>div .drawer{padding-left:5px;padding-right:5px}}.tabs-bar{box-sizing:border-box;display:flex;background:#202e3f;flex:0 0 auto;overflow-y:auto}.tabs-bar__link{display:block;flex:1 1 auto;padding:15px 10px;padding-bottom:13px;color:#fff;text-decoration:none;text-align:center;font-size:14px;font-weight:500;border-bottom:2px solid #202e3f;transition:all 50ms linear;transition-property:border-bottom,background,color}.tabs-bar__link .fa{font-weight:400;font-size:16px}@media screen and (min-width: 631px){.tabs-bar__link:hover,.tabs-bar__link:focus,.tabs-bar__link:active{background:#2a3c54;border-bottom-color:#2a3c54}}.tabs-bar__link.active{border-bottom:2px solid #00007f;color:#00007f}.tabs-bar__link span{margin-left:5px;display:none}@media screen and (min-width: 600px){.tabs-bar__link span{display:inline}}.columns-area--mobile{flex-direction:column;width:100%;height:100%;margin:0 auto}.columns-area--mobile .column,.columns-area--mobile .drawer{width:100%;height:100%;padding:0}.columns-area--mobile .directory__list{display:grid;grid-gap:10px;grid-template-columns:minmax(0, 50%) minmax(0, 50%)}@media screen and (max-width: 415px){.columns-area--mobile .directory__list{display:block}}.columns-area--mobile .directory__card{margin-bottom:0}.columns-area--mobile .filter-form{display:flex}.columns-area--mobile .autosuggest-textarea__textarea{font-size:16px}.columns-area--mobile .search__input{line-height:18px;font-size:16px;padding:15px;padding-right:30px}.columns-area--mobile .search__icon .fa{top:15px}.columns-area--mobile .scrollable{overflow:visible}@supports(display: grid){.columns-area--mobile .scrollable{contain:content}}@media screen and (min-width: 415px){.columns-area--mobile{padding:10px 0;padding-top:0}}@media screen and (min-width: 630px){.columns-area--mobile .detailed-status{padding:15px}.columns-area--mobile .detailed-status .media-gallery,.columns-area--mobile .detailed-status .video-player,.columns-area--mobile .detailed-status .audio-player{margin-top:15px}.columns-area--mobile .account__header__bar{padding:5px 10px}.columns-area--mobile .navigation-bar,.columns-area--mobile .compose-form{padding:15px}.columns-area--mobile .compose-form .compose-form__publish .compose-form__publish-button-wrapper{padding-top:15px}.columns-area--mobile .status{padding:15px 15px 15px 78px;min-height:50px}.columns-area--mobile .status__avatar{left:15px;top:17px}.columns-area--mobile .status__content{padding-top:5px}.columns-area--mobile .status__prepend{margin-left:78px;padding-top:15px}.columns-area--mobile .status__prepend-icon-wrapper{left:-32px}.columns-area--mobile .status .media-gallery,.columns-area--mobile .status__action-bar,.columns-area--mobile .status .video-player,.columns-area--mobile .status .audio-player{margin-top:10px}.columns-area--mobile .account{padding:15px 10px}.columns-area--mobile .account__header__bio{margin:0 -10px}.columns-area--mobile .notification__message{margin-left:78px;padding-top:15px}.columns-area--mobile .notification__favourite-icon-wrapper{left:-32px}.columns-area--mobile .notification .status{padding-top:8px}.columns-area--mobile .notification .account{padding-top:8px}.columns-area--mobile .notification .account__avatar-wrapper{margin-left:17px;margin-right:15px}}.floating-action-button{position:fixed;display:flex;justify-content:center;align-items:center;width:3.9375rem;height:3.9375rem;bottom:1.3125rem;right:1.3125rem;background:#000070;color:#fff;border-radius:50%;font-size:21px;line-height:21px;text-decoration:none;box-shadow:2px 3px 9px rgba(0,0,0,.4)}.floating-action-button:hover,.floating-action-button:focus,.floating-action-button:active{background:#0000a3}@media screen and (min-width: 415px){.tabs-bar{width:100%}.react-swipeable-view-container .columns-area--mobile{height:calc(100% - 10px) !important}.getting-started__wrapper,.getting-started__trends,.search{margin-bottom:10px}.getting-started__panel{margin:10px 0}.column,.drawer{min-width:330px}}@media screen and (max-width: 895px){.columns-area__panels__pane--compositional{display:none}}@media screen and (min-width: 895px){.floating-action-button,.tabs-bar__link.optional{display:none}.search-page .search{display:none}}@media screen and (max-width: 1190px){.columns-area__panels__pane--navigational{display:none}}@media screen and (min-width: 1190px){.tabs-bar{display:none}}.icon-with-badge{position:relative}.icon-with-badge__badge{position:absolute;left:9px;top:-13px;background:#00007f;border:2px solid #202e3f;padding:1px 6px;border-radius:6px;font-size:10px;font-weight:500;line-height:14px;color:#fff}.column-link--transparent .icon-with-badge__badge{border-color:#040609}.compose-panel{width:285px;margin-top:10px;display:flex;flex-direction:column;height:calc(100% - 10px);overflow-y:hidden}.compose-panel .navigation-bar{padding-top:20px;padding-bottom:20px;flex:0 1 48px;min-height:20px}.compose-panel .flex-spacer{background:transparent}.compose-panel .compose-form{flex:1;overflow-y:hidden;display:flex;flex-direction:column;min-height:310px;padding-bottom:71px;margin-bottom:-71px}.compose-panel .compose-form__autosuggest-wrapper{overflow-y:auto;background-color:#fff;border-radius:4px 4px 0 0;flex:0 1 auto}.compose-panel .autosuggest-textarea__textarea{overflow-y:hidden}.compose-panel .compose-form__upload-thumbnail{height:80px}.navigation-panel{margin-top:10px;margin-bottom:10px;height:calc(100% - 20px);overflow-y:auto;display:flex;flex-direction:column}.navigation-panel>a{flex:0 0 auto}.navigation-panel hr{flex:0 0 auto;border:0;background:transparent;border-top:1px solid #192432;margin:10px 0}.navigation-panel .flex-spacer{background:transparent}.drawer__pager{box-sizing:border-box;padding:0;flex-grow:1;position:relative;overflow:hidden;display:flex}.drawer__inner{position:absolute;top:0;left:0;background:#283a50;box-sizing:border-box;padding:0;display:flex;flex-direction:column;overflow:hidden;overflow-y:auto;width:100%;height:100%;border-radius:2px}.drawer__inner.darker{background:#121a24}.drawer__inner__mastodon{background:#283a50 url('data:image/svg+xml;utf8,') no-repeat bottom/100% auto;flex:1;min-height:47px;display:none}.drawer__inner__mastodon>img{display:block;object-fit:contain;object-position:bottom left;width:85%;height:100%;pointer-events:none;user-drag:none;user-select:none}@media screen and (min-height: 640px){.drawer__inner__mastodon{display:block}}.pseudo-drawer{background:#283a50;font-size:13px;text-align:left}.drawer__header{flex:0 0 auto;font-size:16px;background:#202e3f;margin-bottom:10px;display:flex;flex-direction:row;border-radius:2px}.drawer__header a{transition:background 100ms ease-in}.drawer__header a:hover{background:#17212e;transition:background 200ms ease-out}.scrollable{overflow-y:scroll;overflow-x:hidden;flex:1 1 auto;-webkit-overflow-scrolling:touch}.scrollable.optionally-scrollable{overflow-y:auto}@supports(display: grid){.scrollable{contain:strict}}.scrollable--flex{display:flex;flex-direction:column}.scrollable__append{flex:1 1 auto;position:relative;min-height:120px}@supports(display: grid){.scrollable.fullscreen{contain:none}}.column-back-button{box-sizing:border-box;width:100%;background:#192432;color:#00007f;cursor:pointer;flex:0 0 auto;font-size:16px;line-height:inherit;border:0;text-align:unset;padding:15px;margin:0;z-index:3;outline:0}.column-back-button:hover{text-decoration:underline}.column-header__back-button{background:#192432;border:0;font-family:inherit;color:#00007f;cursor:pointer;white-space:nowrap;font-size:16px;padding:0 5px 0 0;z-index:3}.column-header__back-button:hover{text-decoration:underline}.column-header__back-button:last-child{padding:0 15px 0 0}.column-back-button__icon{display:inline-block;margin-right:5px}.column-back-button--slim{position:relative}.column-back-button--slim-button{cursor:pointer;flex:0 0 auto;font-size:16px;padding:15px;position:absolute;right:0;top:-48px}.react-toggle{display:inline-block;position:relative;cursor:pointer;background-color:transparent;border:0;padding:0;user-select:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-tap-highlight-color:transparent}.react-toggle-screenreader-only{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.react-toggle--disabled{cursor:not-allowed;opacity:.5;transition:opacity .25s}.react-toggle-track{width:50px;height:24px;padding:0;border-radius:30px;background-color:#121a24;transition:background-color .2s ease}.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track{background-color:#010102}.react-toggle--checked .react-toggle-track{background-color:#00007f}.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track{background-color:#0000b2}.react-toggle-track-check{position:absolute;width:14px;height:10px;top:0;bottom:0;margin-top:auto;margin-bottom:auto;line-height:0;left:8px;opacity:0;transition:opacity .25s ease}.react-toggle--checked .react-toggle-track-check{opacity:1;transition:opacity .25s ease}.react-toggle-track-x{position:absolute;width:10px;height:10px;top:0;bottom:0;margin-top:auto;margin-bottom:auto;line-height:0;right:10px;opacity:1;transition:opacity .25s ease}.react-toggle--checked .react-toggle-track-x{opacity:0}.react-toggle-thumb{position:absolute;top:1px;left:1px;width:22px;height:22px;border:1px solid #121a24;border-radius:50%;background-color:#fafafa;box-sizing:border-box;transition:all .25s ease;transition-property:border-color,left}.react-toggle--checked .react-toggle-thumb{left:27px;border-color:#00007f}.column-link{background:#202e3f;color:#fff;display:block;font-size:16px;padding:15px;text-decoration:none}.column-link:hover,.column-link:focus,.column-link:active{background:#253549}.column-link:focus{outline:0}.column-link--transparent{background:transparent;color:#d9e1e8}.column-link--transparent:hover,.column-link--transparent:focus,.column-link--transparent:active{background:transparent;color:#fff}.column-link--transparent.active{color:#00007f}.column-link__icon{display:inline-block;margin-right:5px}.column-link__badge{display:inline-block;border-radius:4px;font-size:12px;line-height:19px;font-weight:500;background:#121a24;padding:4px 8px;margin:-6px 10px}.column-subheading{background:#121a24;color:#404040;padding:8px 20px;font-size:12px;font-weight:500;text-transform:uppercase;cursor:default}.getting-started__wrapper,.getting-started,.flex-spacer{background:#121a24}.flex-spacer{flex:1 1 auto}.getting-started{color:#404040;overflow:auto;border-bottom-left-radius:2px;border-bottom-right-radius:2px}.getting-started__wrapper,.getting-started__panel,.getting-started__footer{height:min-content}.getting-started__panel,.getting-started__footer{padding:10px;padding-top:20px;flex-grow:0}.getting-started__panel ul,.getting-started__footer ul{margin-bottom:10px}.getting-started__panel ul li,.getting-started__footer ul li{display:inline}.getting-started__panel p,.getting-started__footer p{font-size:13px}.getting-started__panel p a,.getting-started__footer p a{color:#404040;text-decoration:underline}.getting-started__panel a,.getting-started__footer a{text-decoration:none;color:#9baec8}.getting-started__panel a:hover,.getting-started__panel a:focus,.getting-started__panel a:active,.getting-started__footer a:hover,.getting-started__footer a:focus,.getting-started__footer a:active{text-decoration:underline}.getting-started__wrapper,.getting-started__footer{color:#404040}.getting-started__trends{flex:0 1 auto;opacity:1;animation:fade 150ms linear;margin-top:10px}.getting-started__trends h4{font-size:12px;text-transform:uppercase;color:#9baec8;padding:10px;font-weight:500;border-bottom:1px solid #202e3f}@media screen and (max-height: 810px){.getting-started__trends .trends__item:nth-child(3){display:none}}@media screen and (max-height: 720px){.getting-started__trends .trends__item:nth-child(2){display:none}}@media screen and (max-height: 670px){.getting-started__trends{display:none}}.getting-started__trends .trends__item{border-bottom:0;padding:10px}.getting-started__trends .trends__item__current{color:#9baec8}.keyboard-shortcuts{padding:8px 0 0;overflow:hidden}.keyboard-shortcuts thead{position:absolute;left:-9999px}.keyboard-shortcuts td{padding:0 10px 8px}.keyboard-shortcuts kbd{display:inline-block;padding:3px 5px;background-color:#202e3f;border:1px solid #0b1016}.setting-text{display:block;box-sizing:border-box;width:100%;margin:0;color:#121a24;background:#fff;padding:10px;font-family:inherit;font-size:14px;resize:vertical;border:0;outline:0;border-radius:4px}.setting-text:focus{outline:0}@media screen and (max-width: 600px){.setting-text{font-size:16px}}.no-reduce-motion button.icon-button i.fa-retweet{background-position:0 0;height:19px;transition:background-position .9s steps(10);transition-duration:0s;vertical-align:middle;width:22px}.no-reduce-motion button.icon-button i.fa-retweet::before{display:none !important}.no-reduce-motion button.icon-button.active i.fa-retweet{transition-duration:.9s;background-position:0 100%}.reduce-motion button.icon-button i.fa-retweet{color:#404040;transition:color 100ms ease-in}.reduce-motion button.icon-button.active i.fa-retweet{color:#00007f}.status-card{display:flex;font-size:14px;border:1px solid #202e3f;border-radius:4px;color:#404040;margin-top:14px;text-decoration:none;overflow:hidden}.status-card__actions{bottom:0;left:0;position:absolute;right:0;top:0;display:flex;justify-content:center;align-items:center}.status-card__actions>div{background:rgba(0,0,0,.6);border-radius:8px;padding:12px 9px;flex:0 0 auto;display:flex;justify-content:center;align-items:center}.status-card__actions button,.status-card__actions a{display:inline;color:#d9e1e8;background:transparent;border:0;padding:0 8px;text-decoration:none;font-size:18px;line-height:18px}.status-card__actions button:hover,.status-card__actions button:active,.status-card__actions button:focus,.status-card__actions a:hover,.status-card__actions a:active,.status-card__actions a:focus{color:#fff}.status-card__actions a{font-size:19px;position:relative;bottom:-1px}a.status-card{cursor:pointer}a.status-card:hover{background:#202e3f}.status-card-photo{cursor:zoom-in;display:block;text-decoration:none;width:100%;height:auto;margin:0}.status-card-video iframe{width:100%;height:100%}.status-card__title{display:block;font-weight:500;margin-bottom:5px;color:#9baec8;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-decoration:none}.status-card__content{flex:1 1 auto;overflow:hidden;padding:14px 14px 14px 8px}.status-card__description{color:#9baec8}.status-card__host{display:block;margin-top:5px;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-card__image{flex:0 0 100px;background:#202e3f;position:relative}.status-card__image>.fa{font-size:21px;position:absolute;transform-origin:50% 50%;top:50%;left:50%;transform:translate(-50%, -50%)}.status-card.horizontal{display:block}.status-card.horizontal .status-card__image{width:100%}.status-card.horizontal .status-card__image-image{border-radius:4px 4px 0 0}.status-card.horizontal .status-card__title{white-space:inherit}.status-card.compact{border-color:#192432}.status-card.compact.interactive{border:0}.status-card.compact .status-card__content{padding:8px;padding-top:10px}.status-card.compact .status-card__title{white-space:nowrap}.status-card.compact .status-card__image{flex:0 0 60px}a.status-card.compact:hover{background-color:#192432}.status-card__image-image{border-radius:4px 0 0 4px;display:block;margin:0;width:100%;height:100%;object-fit:cover;background-size:cover;background-position:center center}.load-more{display:block;color:#404040;background-color:transparent;border:0;font-size:inherit;text-align:center;line-height:inherit;margin:0;padding:15px;box-sizing:border-box;width:100%;clear:both;text-decoration:none}.load-more:hover{background:#151f2b}.load-gap{border-bottom:1px solid #202e3f}.regeneration-indicator{text-align:center;font-size:16px;font-weight:500;color:#404040;background:#121a24;cursor:default;display:flex;flex:1 1 auto;flex-direction:column;align-items:center;justify-content:center;padding:20px}.regeneration-indicator__figure,.regeneration-indicator__figure img{display:block;width:auto;height:160px;margin:0}.regeneration-indicator--without-header{padding-top:68px}.regeneration-indicator__label{margin-top:30px}.regeneration-indicator__label strong{display:block;margin-bottom:10px;color:#404040}.regeneration-indicator__label span{font-size:15px;font-weight:400}.column-header__wrapper{position:relative;flex:0 0 auto;z-index:1}.column-header__wrapper.active{box-shadow:0 1px 0 rgba(0,0,127,.3)}.column-header__wrapper.active::before{display:block;content:\"\";position:absolute;bottom:-13px;left:0;right:0;margin:0 auto;width:60%;pointer-events:none;height:28px;z-index:1;background:radial-gradient(ellipse, rgba(0, 0, 127, 0.23) 0%, rgba(0, 0, 127, 0) 60%)}.column-header__wrapper .announcements{z-index:1;position:relative}.column-header{display:flex;font-size:16px;background:#192432;flex:0 0 auto;cursor:pointer;position:relative;z-index:2;outline:0;overflow:hidden;border-top-left-radius:2px;border-top-right-radius:2px}.column-header>button{margin:0;border:0;padding:15px 0 15px 15px;color:inherit;background:transparent;font:inherit;text-align:left;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;flex:1}.column-header>.column-header__back-button{color:#00007f}.column-header.active .column-header__icon{color:#00007f;text-shadow:0 0 10px rgba(0,0,127,.4)}.column-header:focus,.column-header:active{outline:0}.column-header__buttons{height:48px;display:flex}.column-header__links{margin-bottom:14px}.column-header__links .text-btn{margin-right:10px}.column-header__button{background:#192432;border:0;color:#9baec8;cursor:pointer;font-size:16px;padding:0 15px}.column-header__button:hover{color:#b2c1d5}.column-header__button.active{color:#fff;background:#202e3f}.column-header__button.active:hover{color:#fff;background:#202e3f}.column-header__collapsible{max-height:70vh;overflow:hidden;overflow-y:auto;color:#9baec8;transition:max-height 150ms ease-in-out,opacity 300ms linear;opacity:1;z-index:1;position:relative}.column-header__collapsible.collapsed{max-height:0;opacity:.5}.column-header__collapsible.animating{overflow-y:hidden}.column-header__collapsible hr{height:0;background:transparent;border:0;border-top:1px solid #26374d;margin:10px 0}.column-header__collapsible-inner{background:#202e3f;padding:15px}.column-header__setting-btn:hover{color:#9baec8;text-decoration:underline}.column-header__setting-arrows{float:right}.column-header__setting-arrows .column-header__setting-btn{padding:0 10px}.column-header__setting-arrows .column-header__setting-btn:last-child{padding-right:0}.text-btn{display:inline-block;padding:0;font-family:inherit;font-size:inherit;color:inherit;border:0;background:transparent;cursor:pointer}.column-header__icon{display:inline-block;margin-right:5px}.loading-indicator{color:#404040;font-size:12px;font-weight:400;text-transform:uppercase;overflow:visible;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.loading-indicator span{display:block;float:left;margin-left:50%;transform:translateX(-50%);margin:82px 0 0 50%;white-space:nowrap}.loading-indicator__figure{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);width:42px;height:42px;box-sizing:border-box;background-color:transparent;border:0 solid #3e5a7c;border-width:6px;border-radius:50%}.no-reduce-motion .loading-indicator span{animation:loader-label 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1)}.no-reduce-motion .loading-indicator__figure{animation:loader-figure 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1)}@keyframes spring-rotate-in{0%{transform:rotate(0deg)}30%{transform:rotate(-484.8deg)}60%{transform:rotate(-316.7deg)}90%{transform:rotate(-375deg)}100%{transform:rotate(-360deg)}}@keyframes spring-rotate-out{0%{transform:rotate(-360deg)}30%{transform:rotate(124.8deg)}60%{transform:rotate(-43.27deg)}90%{transform:rotate(15deg)}100%{transform:rotate(0deg)}}@keyframes loader-figure{0%{width:0;height:0;background-color:#3e5a7c}29%{background-color:#3e5a7c}30%{width:42px;height:42px;background-color:transparent;border-width:21px;opacity:1}100%{width:42px;height:42px;border-width:0;opacity:0;background-color:transparent}}@keyframes loader-label{0%{opacity:.25}30%{opacity:1}100%{opacity:.25}}.video-error-cover{align-items:center;background:#000;color:#fff;cursor:pointer;display:flex;flex-direction:column;height:100%;justify-content:center;margin-top:8px;position:relative;text-align:center;z-index:100}.media-spoiler{background:#000;color:#9baec8;border:0;padding:0;width:100%;height:100%;border-radius:4px;appearance:none}.media-spoiler:hover,.media-spoiler:active,.media-spoiler:focus{padding:0;color:#b5c3d6}.media-spoiler__warning{display:block;font-size:14px}.media-spoiler__trigger{display:block;font-size:11px;font-weight:700}.spoiler-button{top:0;left:0;width:100%;height:100%;position:absolute;z-index:100}.spoiler-button--minified{display:block;left:4px;top:4px;width:auto;height:auto}.spoiler-button--click-thru{pointer-events:none}.spoiler-button--hidden{display:none}.spoiler-button__overlay{display:block;background:transparent;width:100%;height:100%;border:0}.spoiler-button__overlay__label{display:inline-block;background:rgba(0,0,0,.5);border-radius:8px;padding:8px 12px;color:#fff;font-weight:500;font-size:14px}.spoiler-button__overlay:hover .spoiler-button__overlay__label,.spoiler-button__overlay:focus .spoiler-button__overlay__label,.spoiler-button__overlay:active .spoiler-button__overlay__label{background:rgba(0,0,0,.8)}.spoiler-button__overlay:disabled .spoiler-button__overlay__label{background:rgba(0,0,0,.5)}.modal-container--preloader{background:#202e3f}.account--panel{background:#192432;border-top:1px solid #202e3f;border-bottom:1px solid #202e3f;display:flex;flex-direction:row;padding:10px 0}.account--panel__button,.detailed-status__button{flex:1 1 auto;text-align:center}.column-settings__outer{background:#202e3f;padding:15px}.column-settings__section{color:#9baec8;cursor:default;display:block;font-weight:500;margin-bottom:10px}.column-settings__hashtags .column-settings__row{margin-bottom:15px}.column-settings__hashtags .column-select__control{outline:0;box-sizing:border-box;width:100%;border:0;box-shadow:none;font-family:inherit;background:#121a24;color:#9baec8;font-size:14px;margin:0}.column-settings__hashtags .column-select__control::placeholder{color:#a8b9cf}.column-settings__hashtags .column-select__control::-moz-focus-inner{border:0}.column-settings__hashtags .column-select__control::-moz-focus-inner,.column-settings__hashtags .column-select__control:focus,.column-settings__hashtags .column-select__control:active{outline:0 !important}.column-settings__hashtags .column-select__control:focus{background:#192432}@media screen and (max-width: 600px){.column-settings__hashtags .column-select__control{font-size:16px}}.column-settings__hashtags .column-select__placeholder{color:#404040;padding-left:2px;font-size:12px}.column-settings__hashtags .column-select__value-container{padding-left:6px}.column-settings__hashtags .column-select__multi-value{background:#202e3f}.column-settings__hashtags .column-select__multi-value__remove{cursor:pointer}.column-settings__hashtags .column-select__multi-value__remove:hover,.column-settings__hashtags .column-select__multi-value__remove:active,.column-settings__hashtags .column-select__multi-value__remove:focus{background:#26374d;color:#a8b9cf}.column-settings__hashtags .column-select__multi-value__label,.column-settings__hashtags .column-select__input{color:#9baec8}.column-settings__hashtags .column-select__clear-indicator,.column-settings__hashtags .column-select__dropdown-indicator{cursor:pointer;transition:none;color:#404040}.column-settings__hashtags .column-select__clear-indicator:hover,.column-settings__hashtags .column-select__clear-indicator:active,.column-settings__hashtags .column-select__clear-indicator:focus,.column-settings__hashtags .column-select__dropdown-indicator:hover,.column-settings__hashtags .column-select__dropdown-indicator:active,.column-settings__hashtags .column-select__dropdown-indicator:focus{color:#4a4a4a}.column-settings__hashtags .column-select__indicator-separator{background-color:#202e3f}.column-settings__hashtags .column-select__menu{background:#fff;border-radius:4px;padding:10px 14px;padding-bottom:14px;margin-top:10px;color:#9baec8;box-shadow:2px 4px 15px rgba(0,0,0,.4);padding:0;background:#d9e1e8}.column-settings__hashtags .column-select__menu h4{text-transform:uppercase;color:#9baec8;font-size:13px;font-weight:500;margin-bottom:10px}.column-settings__hashtags .column-select__menu li{padding:4px 0}.column-settings__hashtags .column-select__menu ul{margin-bottom:10px}.column-settings__hashtags .column-select__menu em{font-weight:500;color:#121a24}.column-settings__hashtags .column-select__menu-list{padding:6px}.column-settings__hashtags .column-select__option{color:#121a24;border-radius:4px;font-size:14px}.column-settings__hashtags .column-select__option--is-focused,.column-settings__hashtags .column-select__option--is-selected{background:#b9c8d5}.column-settings__row .text-btn{margin-bottom:15px}.relationship-tag{color:#fff;margin-bottom:4px;display:block;vertical-align:top;background-color:#000;text-transform:uppercase;font-size:11px;font-weight:500;padding:4px;border-radius:4px;opacity:.7}.relationship-tag:hover{opacity:1}.setting-toggle{display:block;line-height:24px}.setting-toggle__label{color:#9baec8;display:inline-block;margin-bottom:14px;margin-left:8px;vertical-align:middle}.empty-column-indicator,.error-column,.follow_requests-unlocked_explanation{color:#404040;background:#121a24;text-align:center;padding:20px;font-size:15px;font-weight:400;cursor:default;display:flex;flex:1 1 auto;align-items:center;justify-content:center}@supports(display: grid){.empty-column-indicator,.error-column,.follow_requests-unlocked_explanation{contain:strict}}.empty-column-indicator>span,.error-column>span,.follow_requests-unlocked_explanation>span{max-width:400px}.empty-column-indicator a,.error-column a,.follow_requests-unlocked_explanation a{color:#00007f;text-decoration:none}.empty-column-indicator a:hover,.error-column a:hover,.follow_requests-unlocked_explanation a:hover{text-decoration:underline}.follow_requests-unlocked_explanation{background:#0b1016;contain:initial}.error-column{flex-direction:column}@keyframes heartbeat{from{transform:scale(1);animation-timing-function:ease-out}10%{transform:scale(0.91);animation-timing-function:ease-in}17%{transform:scale(0.98);animation-timing-function:ease-out}33%{transform:scale(0.87);animation-timing-function:ease-in}45%{transform:scale(1);animation-timing-function:ease-out}}.no-reduce-motion .pulse-loading{transform-origin:center center;animation:heartbeat 1.5s ease-in-out infinite both}@keyframes shake-bottom{0%,100%{transform:rotate(0deg);transform-origin:50% 100%}10%{transform:rotate(2deg)}20%,40%,60%{transform:rotate(-4deg)}30%,50%,70%{transform:rotate(4deg)}80%{transform:rotate(-2deg)}90%{transform:rotate(2deg)}}.no-reduce-motion .shake-bottom{transform-origin:50% 100%;animation:shake-bottom .8s cubic-bezier(0.455, 0.03, 0.515, 0.955) 2s 2 both}.emoji-picker-dropdown__menu{background:#fff;position:absolute;box-shadow:4px 4px 6px rgba(0,0,0,.4);border-radius:4px;margin-top:5px;z-index:2}.emoji-picker-dropdown__menu .emoji-mart-scroll{transition:opacity 200ms ease}.emoji-picker-dropdown__menu.selecting .emoji-mart-scroll{opacity:.5}.emoji-picker-dropdown__modifiers{position:absolute;top:60px;right:11px;cursor:pointer}.emoji-picker-dropdown__modifiers__menu{position:absolute;z-index:4;top:-4px;left:-8px;background:#fff;border-radius:4px;box-shadow:1px 2px 6px rgba(0,0,0,.2);overflow:hidden}.emoji-picker-dropdown__modifiers__menu button{display:block;cursor:pointer;border:0;padding:4px 8px;background:transparent}.emoji-picker-dropdown__modifiers__menu button:hover,.emoji-picker-dropdown__modifiers__menu button:focus,.emoji-picker-dropdown__modifiers__menu button:active{background:rgba(217,225,232,.4)}.emoji-picker-dropdown__modifiers__menu .emoji-mart-emoji{height:22px}.emoji-mart-emoji span{background-repeat:no-repeat}.upload-area{align-items:center;background:rgba(0,0,0,.8);display:flex;height:100%;justify-content:center;left:0;opacity:0;position:absolute;top:0;visibility:hidden;width:100%;z-index:2000}.upload-area *{pointer-events:none}.upload-area__drop{width:320px;height:160px;display:flex;box-sizing:border-box;position:relative;padding:8px}.upload-area__background{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;border-radius:4px;background:#121a24;box-shadow:0 0 5px rgba(0,0,0,.2)}.upload-area__content{flex:1;display:flex;align-items:center;justify-content:center;color:#d9e1e8;font-size:18px;font-weight:500;border:2px dashed #404040;border-radius:4px}.upload-progress{padding:10px;color:#404040;overflow:hidden;display:flex}.upload-progress .fa{font-size:34px;margin-right:10px}.upload-progress span{font-size:12px;text-transform:uppercase;font-weight:500;display:block}.upload-progess__message{flex:1 1 auto}.upload-progress__backdrop{width:100%;height:6px;border-radius:6px;background:#404040;position:relative;margin-top:5px}.upload-progress__tracker{position:absolute;left:0;top:0;height:6px;background:#00007f;border-radius:6px}.emoji-button{display:block;padding:5px 5px 2px 2px;outline:0;cursor:pointer}.emoji-button:active,.emoji-button:focus{outline:0 !important}.emoji-button img{filter:grayscale(100%);opacity:.8;display:block;margin:0;width:22px;height:22px}.emoji-button:hover img,.emoji-button:active img,.emoji-button:focus img{opacity:1;filter:none}.dropdown--active .emoji-button img{opacity:1;filter:none}.privacy-dropdown__dropdown{position:absolute;background:#fff;box-shadow:2px 4px 15px rgba(0,0,0,.4);border-radius:4px;margin-left:40px;overflow:hidden}.privacy-dropdown__dropdown.top{transform-origin:50% 100%}.privacy-dropdown__dropdown.bottom{transform-origin:50% 0}.privacy-dropdown__option{color:#121a24;padding:10px;cursor:pointer;display:flex}.privacy-dropdown__option:hover,.privacy-dropdown__option.active{background:#00007f;color:#fff;outline:0}.privacy-dropdown__option:hover .privacy-dropdown__option__content,.privacy-dropdown__option.active .privacy-dropdown__option__content{color:#fff}.privacy-dropdown__option:hover .privacy-dropdown__option__content strong,.privacy-dropdown__option.active .privacy-dropdown__option__content strong{color:#fff}.privacy-dropdown__option.active:hover{background:#000093}.privacy-dropdown__option__icon{display:flex;align-items:center;justify-content:center;margin-right:10px}.privacy-dropdown__option__content{flex:1 1 auto;color:#404040}.privacy-dropdown__option__content strong{font-weight:500;display:block;color:#121a24}.privacy-dropdown__option__content strong:lang(ja){font-weight:700}.privacy-dropdown__option__content strong:lang(ko){font-weight:700}.privacy-dropdown__option__content strong:lang(zh-CN){font-weight:700}.privacy-dropdown__option__content strong:lang(zh-HK){font-weight:700}.privacy-dropdown__option__content strong:lang(zh-TW){font-weight:700}.privacy-dropdown.active .privacy-dropdown__value{background:#fff;border-radius:4px 4px 0 0;box-shadow:0 -4px 4px rgba(0,0,0,.1)}.privacy-dropdown.active .privacy-dropdown__value .icon-button{transition:none}.privacy-dropdown.active .privacy-dropdown__value.active{background:#00007f}.privacy-dropdown.active .privacy-dropdown__value.active .icon-button{color:#fff}.privacy-dropdown.active.top .privacy-dropdown__value{border-radius:0 0 4px 4px}.privacy-dropdown.active .privacy-dropdown__dropdown{display:block;box-shadow:2px 4px 6px rgba(0,0,0,.1)}.search{position:relative}.search__input{outline:0;box-sizing:border-box;width:100%;border:0;box-shadow:none;font-family:inherit;background:#121a24;color:#9baec8;font-size:14px;margin:0;display:block;padding:15px;padding-right:30px;line-height:18px;font-size:16px}.search__input::placeholder{color:#a8b9cf}.search__input::-moz-focus-inner{border:0}.search__input::-moz-focus-inner,.search__input:focus,.search__input:active{outline:0 !important}.search__input:focus{background:#192432}@media screen and (max-width: 600px){.search__input{font-size:16px}}.search__icon::-moz-focus-inner{border:0}.search__icon::-moz-focus-inner,.search__icon:focus{outline:0 !important}.search__icon .fa{position:absolute;top:16px;right:10px;z-index:2;display:inline-block;opacity:0;transition:all 100ms linear;transition-property:transform,opacity;font-size:18px;width:18px;height:18px;color:#d9e1e8;cursor:default;pointer-events:none}.search__icon .fa.active{pointer-events:auto;opacity:.3}.search__icon .fa-search{transform:rotate(90deg)}.search__icon .fa-search.active{pointer-events:none;transform:rotate(0deg)}.search__icon .fa-times-circle{top:17px;transform:rotate(0deg);color:#404040;cursor:pointer}.search__icon .fa-times-circle.active{transform:rotate(90deg)}.search__icon .fa-times-circle:hover{color:#525252}.search-results__header{color:#404040;background:#151f2b;padding:15px;font-weight:500;font-size:16px;cursor:default}.search-results__header .fa{display:inline-block;margin-right:5px}.search-results__section{margin-bottom:5px}.search-results__section h5{background:#0b1016;border-bottom:1px solid #202e3f;cursor:default;display:flex;padding:15px;font-weight:500;font-size:16px;color:#404040}.search-results__section h5 .fa{display:inline-block;margin-right:5px}.search-results__section .account:last-child,.search-results__section>div:last-child .status{border-bottom:0}.search-results__hashtag{display:block;padding:10px;color:#d9e1e8;text-decoration:none}.search-results__hashtag:hover,.search-results__hashtag:active,.search-results__hashtag:focus{color:#e6ebf0;text-decoration:underline}.search-results__info{padding:20px;color:#9baec8;text-align:center}.modal-root{position:relative;transition:opacity .3s linear;will-change:opacity;z-index:9999}.modal-root__overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.7)}.modal-root__container{position:fixed;top:0;left:0;width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;align-content:space-around;z-index:9999;pointer-events:none;user-select:none}.modal-root__modal{pointer-events:auto;display:flex;z-index:9999}.video-modal__container{max-width:100vw;max-height:100vh}.audio-modal__container{width:50vw}.media-modal{width:100%;height:100%;position:relative}.media-modal .extended-video-player{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.media-modal .extended-video-player video{max-width:100%;max-height:80%}.media-modal__closer{position:absolute;top:0;left:0;right:0;bottom:0}.media-modal__navigation{position:absolute;top:0;left:0;right:0;bottom:0;pointer-events:none;transition:opacity .3s linear;will-change:opacity}.media-modal__navigation *{pointer-events:auto}.media-modal__navigation.media-modal__navigation--hidden{opacity:0}.media-modal__navigation.media-modal__navigation--hidden *{pointer-events:none}.media-modal__nav{background:rgba(0,0,0,.5);box-sizing:border-box;border:0;color:#fff;cursor:pointer;display:flex;align-items:center;font-size:24px;height:20vmax;margin:auto 0;padding:30px 15px;position:absolute;top:0;bottom:0}.media-modal__nav--left{left:0}.media-modal__nav--right{right:0}.media-modal__pagination{width:100%;text-align:center;position:absolute;left:0;bottom:20px;pointer-events:none}.media-modal__meta{text-align:center;position:absolute;left:0;bottom:20px;width:100%;pointer-events:none}.media-modal__meta--shifted{bottom:62px}.media-modal__meta a{pointer-events:auto;text-decoration:none;font-weight:500;color:#d9e1e8}.media-modal__meta a:hover,.media-modal__meta a:focus,.media-modal__meta a:active{text-decoration:underline}.media-modal__page-dot{display:inline-block}.media-modal__button{background-color:#fff;height:12px;width:12px;border-radius:6px;margin:10px;padding:0;border:0;font-size:0}.media-modal__button--active{background-color:#00007f}.media-modal__close{position:absolute;right:8px;top:8px;z-index:100}.onboarding-modal,.error-modal,.embed-modal{background:#d9e1e8;color:#121a24;border-radius:8px;overflow:hidden;display:flex;flex-direction:column}.error-modal__body{height:80vh;width:80vw;max-width:520px;max-height:420px;position:relative}.error-modal__body>div{position:absolute;top:0;left:0;width:100%;height:100%;box-sizing:border-box;padding:25px;display:none;flex-direction:column;align-items:center;justify-content:center;display:flex;opacity:0;user-select:text}.error-modal__body{display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center}.onboarding-modal__paginator,.error-modal__footer{flex:0 0 auto;background:#c0cdd9;display:flex;padding:25px}.onboarding-modal__paginator>div,.error-modal__footer>div{min-width:33px}.onboarding-modal__paginator .onboarding-modal__nav,.onboarding-modal__paginator .error-modal__nav,.error-modal__footer .onboarding-modal__nav,.error-modal__footer .error-modal__nav{color:#404040;border:0;font-size:14px;font-weight:500;padding:10px 25px;line-height:inherit;height:auto;margin:-10px;border-radius:4px;background-color:transparent}.onboarding-modal__paginator .onboarding-modal__nav:hover,.onboarding-modal__paginator .onboarding-modal__nav:focus,.onboarding-modal__paginator .onboarding-modal__nav:active,.onboarding-modal__paginator .error-modal__nav:hover,.onboarding-modal__paginator .error-modal__nav:focus,.onboarding-modal__paginator .error-modal__nav:active,.error-modal__footer .onboarding-modal__nav:hover,.error-modal__footer .onboarding-modal__nav:focus,.error-modal__footer .onboarding-modal__nav:active,.error-modal__footer .error-modal__nav:hover,.error-modal__footer .error-modal__nav:focus,.error-modal__footer .error-modal__nav:active{color:#363636;background-color:#a6b9c9}.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next,.error-modal__footer .error-modal__nav.onboarding-modal__done,.error-modal__footer .error-modal__nav.onboarding-modal__next{color:#121a24}.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:hover,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:focus,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__done:active,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:hover,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:focus,.onboarding-modal__paginator .onboarding-modal__nav.onboarding-modal__next:active,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:hover,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:focus,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__done:active,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:hover,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:focus,.onboarding-modal__paginator .error-modal__nav.onboarding-modal__next:active,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:hover,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:focus,.error-modal__footer .onboarding-modal__nav.onboarding-modal__done:active,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:hover,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:focus,.error-modal__footer .onboarding-modal__nav.onboarding-modal__next:active,.error-modal__footer .error-modal__nav.onboarding-modal__done:hover,.error-modal__footer .error-modal__nav.onboarding-modal__done:focus,.error-modal__footer .error-modal__nav.onboarding-modal__done:active,.error-modal__footer .error-modal__nav.onboarding-modal__next:hover,.error-modal__footer .error-modal__nav.onboarding-modal__next:focus,.error-modal__footer .error-modal__nav.onboarding-modal__next:active{color:#192432}.error-modal__footer{justify-content:center}.display-case{text-align:center;font-size:15px;margin-bottom:15px}.display-case__label{font-weight:500;color:#121a24;margin-bottom:5px;text-transform:uppercase;font-size:12px}.display-case__case{background:#121a24;color:#d9e1e8;font-weight:500;padding:10px;border-radius:4px}.onboard-sliders{display:inline-block;max-width:30px;max-height:auto;margin-left:10px}.boost-modal,.confirmation-modal,.report-modal,.actions-modal,.mute-modal,.block-modal{background:#f2f5f7;color:#121a24;border-radius:8px;overflow:hidden;max-width:90vw;width:480px;position:relative;flex-direction:column}.boost-modal .status__display-name,.confirmation-modal .status__display-name,.report-modal .status__display-name,.actions-modal .status__display-name,.mute-modal .status__display-name,.block-modal .status__display-name{display:block;max-width:100%;padding-right:25px}.boost-modal .status__avatar,.confirmation-modal .status__avatar,.report-modal .status__avatar,.actions-modal .status__avatar,.mute-modal .status__avatar,.block-modal .status__avatar{height:28px;left:10px;position:absolute;top:10px;width:48px}.boost-modal .status__content__spoiler-link,.confirmation-modal .status__content__spoiler-link,.report-modal .status__content__spoiler-link,.actions-modal .status__content__spoiler-link,.mute-modal .status__content__spoiler-link,.block-modal .status__content__spoiler-link{color:#f2f5f7}.actions-modal .status{background:#fff;border-bottom-color:#d9e1e8;padding-top:10px;padding-bottom:10px}.actions-modal .dropdown-menu__separator{border-bottom-color:#d9e1e8}.boost-modal__container{overflow-x:scroll;padding:10px}.boost-modal__container .status{user-select:text;border-bottom:0}.boost-modal__action-bar,.confirmation-modal__action-bar,.mute-modal__action-bar,.block-modal__action-bar{display:flex;justify-content:space-between;background:#d9e1e8;padding:10px;line-height:36px}.boost-modal__action-bar>div,.confirmation-modal__action-bar>div,.mute-modal__action-bar>div,.block-modal__action-bar>div{flex:1 1 auto;text-align:right;color:#404040;padding-right:10px}.boost-modal__action-bar .button,.confirmation-modal__action-bar .button,.mute-modal__action-bar .button,.block-modal__action-bar .button{flex:0 0 auto}.boost-modal__status-header{font-size:15px}.boost-modal__status-time{float:right;font-size:14px}.mute-modal,.block-modal{line-height:24px}.mute-modal .react-toggle,.block-modal .react-toggle{vertical-align:middle}.report-modal{width:90vw;max-width:700px}.report-modal__container{display:flex;border-top:1px solid #d9e1e8}@media screen and (max-width: 480px){.report-modal__container{flex-wrap:wrap;overflow-y:auto}}.report-modal__statuses,.report-modal__comment{box-sizing:border-box;width:50%}@media screen and (max-width: 480px){.report-modal__statuses,.report-modal__comment{width:100%}}.report-modal__statuses,.focal-point-modal__content{flex:1 1 auto;min-height:20vh;max-height:80vh;overflow-y:auto;overflow-x:hidden}.report-modal__statuses .status__content a,.focal-point-modal__content .status__content a{color:#00007f}.report-modal__statuses .status__content,.report-modal__statuses .status__content p,.focal-point-modal__content .status__content,.focal-point-modal__content .status__content p{color:#121a24}@media screen and (max-width: 480px){.report-modal__statuses,.focal-point-modal__content{max-height:10vh}}@media screen and (max-width: 480px){.focal-point-modal__content{max-height:40vh}}.report-modal__comment{padding:20px;border-right:1px solid #d9e1e8;max-width:320px}.report-modal__comment p{font-size:14px;line-height:20px;margin-bottom:20px}.report-modal__comment .setting-text{display:block;box-sizing:border-box;width:100%;margin:0;color:#121a24;background:#fff;padding:10px;font-family:inherit;font-size:14px;resize:none;border:0;outline:0;border-radius:4px;border:1px solid #d9e1e8;min-height:100px;max-height:50vh;margin-bottom:10px}.report-modal__comment .setting-text:focus{border:1px solid #c0cdd9}.report-modal__comment .setting-text__wrapper{background:#fff;border:1px solid #d9e1e8;margin-bottom:10px;border-radius:4px}.report-modal__comment .setting-text__wrapper .setting-text{border:0;margin-bottom:0;border-radius:0}.report-modal__comment .setting-text__wrapper .setting-text:focus{border:0}.report-modal__comment .setting-text__wrapper__modifiers{color:#121a24;font-family:inherit;font-size:14px;background:#fff}.report-modal__comment .setting-text__toolbar{display:flex;justify-content:space-between;margin-bottom:20px}.report-modal__comment .setting-text-label{display:block;color:#121a24;font-size:14px;font-weight:500;margin-bottom:10px}.report-modal__comment .setting-toggle{margin-top:20px;margin-bottom:24px}.report-modal__comment .setting-toggle__label{color:#121a24;font-size:14px}@media screen and (max-width: 480px){.report-modal__comment{padding:10px;max-width:100%;order:2}.report-modal__comment .setting-toggle{margin-bottom:4px}}.actions-modal{max-height:80vh;max-width:80vw}.actions-modal .status{overflow-y:auto;max-height:300px}.actions-modal .actions-modal__item-label{font-weight:500}.actions-modal ul{overflow-y:auto;flex-shrink:0;max-height:80vh}.actions-modal ul.with-status{max-height:calc(80vh - 75px)}.actions-modal ul li:empty{margin:0}.actions-modal ul li:not(:empty) a{color:#121a24;display:flex;padding:12px 16px;font-size:15px;align-items:center;text-decoration:none}.actions-modal ul li:not(:empty) a,.actions-modal ul li:not(:empty) a button{transition:none}.actions-modal ul li:not(:empty) a.active,.actions-modal ul li:not(:empty) a.active button,.actions-modal ul li:not(:empty) a:hover,.actions-modal ul li:not(:empty) a:hover button,.actions-modal ul li:not(:empty) a:active,.actions-modal ul li:not(:empty) a:active button,.actions-modal ul li:not(:empty) a:focus,.actions-modal ul li:not(:empty) a:focus button{background:#00007f;color:#fff}.actions-modal ul li:not(:empty) a button:first-child{margin-right:10px}.confirmation-modal__action-bar .confirmation-modal__secondary-button,.mute-modal__action-bar .confirmation-modal__secondary-button,.block-modal__action-bar .confirmation-modal__secondary-button{flex-shrink:1}.confirmation-modal__secondary-button,.confirmation-modal__cancel-button,.mute-modal__cancel-button,.block-modal__cancel-button{background-color:transparent;color:#404040;font-size:14px;font-weight:500}.confirmation-modal__secondary-button:hover,.confirmation-modal__secondary-button:focus,.confirmation-modal__secondary-button:active,.confirmation-modal__cancel-button:hover,.confirmation-modal__cancel-button:focus,.confirmation-modal__cancel-button:active,.mute-modal__cancel-button:hover,.mute-modal__cancel-button:focus,.mute-modal__cancel-button:active,.block-modal__cancel-button:hover,.block-modal__cancel-button:focus,.block-modal__cancel-button:active{color:#363636;background-color:transparent}.confirmation-modal__container,.mute-modal__container,.block-modal__container,.report-modal__target{padding:30px;font-size:16px}.confirmation-modal__container strong,.mute-modal__container strong,.block-modal__container strong,.report-modal__target strong{font-weight:500}.confirmation-modal__container strong:lang(ja),.mute-modal__container strong:lang(ja),.block-modal__container strong:lang(ja),.report-modal__target strong:lang(ja){font-weight:700}.confirmation-modal__container strong:lang(ko),.mute-modal__container strong:lang(ko),.block-modal__container strong:lang(ko),.report-modal__target strong:lang(ko){font-weight:700}.confirmation-modal__container strong:lang(zh-CN),.mute-modal__container strong:lang(zh-CN),.block-modal__container strong:lang(zh-CN),.report-modal__target strong:lang(zh-CN){font-weight:700}.confirmation-modal__container strong:lang(zh-HK),.mute-modal__container strong:lang(zh-HK),.block-modal__container strong:lang(zh-HK),.report-modal__target strong:lang(zh-HK){font-weight:700}.confirmation-modal__container strong:lang(zh-TW),.mute-modal__container strong:lang(zh-TW),.block-modal__container strong:lang(zh-TW),.report-modal__target strong:lang(zh-TW){font-weight:700}.confirmation-modal__container,.report-modal__target{text-align:center}.block-modal__explanation,.mute-modal__explanation{margin-top:20px}.block-modal .setting-toggle,.mute-modal .setting-toggle{margin-top:20px;margin-bottom:24px;display:flex;align-items:center}.block-modal .setting-toggle__label,.mute-modal .setting-toggle__label{color:#121a24;margin:0;margin-left:8px}.report-modal__target{padding:15px}.report-modal__target .media-modal__close{top:14px;right:15px}.loading-bar{background-color:#00007f;height:3px;position:absolute;top:0;left:0;z-index:9999}.media-gallery__gifv__label{display:block;position:absolute;color:#fff;background:rgba(0,0,0,.5);bottom:6px;left:6px;padding:2px 6px;border-radius:2px;font-size:11px;font-weight:600;z-index:1;pointer-events:none;opacity:.9;transition:opacity .1s ease;line-height:18px}.media-gallery__gifv:hover .media-gallery__gifv__label{opacity:1}.media-gallery__audio{margin-top:32px}.media-gallery__audio audio{width:100%}.attachment-list{display:flex;font-size:14px;border:1px solid #202e3f;border-radius:4px;margin-top:14px;overflow:hidden}.attachment-list__icon{flex:0 0 auto;color:#404040;padding:8px 18px;cursor:default;border-right:1px solid #202e3f;display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:26px}.attachment-list__icon .fa{display:block}.attachment-list__list{list-style:none;padding:4px 0;padding-left:8px;display:flex;flex-direction:column;justify-content:center}.attachment-list__list li{display:block;padding:4px 0}.attachment-list__list a{text-decoration:none;color:#404040;font-weight:500}.attachment-list__list a:hover{text-decoration:underline}.attachment-list.compact{border:0;margin-top:4px}.attachment-list.compact .attachment-list__list{padding:0;display:block}.attachment-list.compact .fa{color:#404040}.media-gallery{box-sizing:border-box;margin-top:8px;overflow:hidden;border-radius:4px;position:relative;width:100%}.media-gallery__item{border:0;box-sizing:border-box;display:block;float:left;position:relative;border-radius:4px;overflow:hidden}.media-gallery__item.standalone .media-gallery__item-gifv-thumbnail{transform:none;top:0}.media-gallery__item-thumbnail{cursor:zoom-in;display:block;text-decoration:none;color:#d9e1e8;position:relative;z-index:1}.media-gallery__item-thumbnail,.media-gallery__item-thumbnail img{height:100%;width:100%}.media-gallery__item-thumbnail img{object-fit:cover}.media-gallery__preview{width:100%;height:100%;object-fit:cover;position:absolute;top:0;left:0;z-index:0;background:#000}.media-gallery__preview--hidden{display:none}.media-gallery__gifv{height:100%;overflow:hidden;position:relative;width:100%}.media-gallery__item-gifv-thumbnail{cursor:zoom-in;height:100%;object-fit:cover;position:relative;top:50%;transform:translateY(-50%);width:100%;z-index:1}.media-gallery__item-thumbnail-label{clip:rect(1px 1px 1px 1px);clip:rect(1px, 1px, 1px, 1px);overflow:hidden;position:absolute}.detailed .video-player__volume__current,.detailed .video-player__volume::before,.fullscreen .video-player__volume__current,.fullscreen .video-player__volume::before{bottom:27px}.detailed .video-player__volume__handle,.fullscreen .video-player__volume__handle{bottom:23px}.audio-player{box-sizing:border-box;position:relative;background:#040609;border-radius:4px;padding-bottom:44px;direction:ltr}.audio-player.editable{border-radius:0;height:100%}.audio-player__waveform{padding:15px 0;position:relative;overflow:hidden}.audio-player__waveform::before{content:\"\";display:block;position:absolute;border-top:1px solid #192432;width:100%;height:0;left:0;top:calc(50% + 1px)}.audio-player__progress-placeholder{background-color:rgba(0,0,168,.5)}.audio-player__wave-placeholder{background-color:#2d415a}.audio-player .video-player__controls{padding:0 15px;padding-top:10px;background:#040609;border-top:1px solid #192432;border-radius:0 0 4px 4px}.video-player{overflow:hidden;position:relative;background:#000;max-width:100%;border-radius:4px;box-sizing:border-box;direction:ltr}.video-player.editable{border-radius:0;height:100% !important}.video-player:focus{outline:0}.video-player video{max-width:100vw;max-height:80vh;z-index:1}.video-player.fullscreen{width:100% !important;height:100% !important;margin:0}.video-player.fullscreen video{max-width:100% !important;max-height:100% !important;width:100% !important;height:100% !important;outline:0}.video-player.inline video{object-fit:contain;position:relative;top:50%;transform:translateY(-50%)}.video-player__controls{position:absolute;z-index:2;bottom:0;left:0;right:0;box-sizing:border-box;background:linear-gradient(0deg, rgba(0, 0, 0, 0.85) 0, rgba(0, 0, 0, 0.45) 60%, transparent);padding:0 15px;opacity:0;transition:opacity .1s ease}.video-player__controls.active{opacity:1}.video-player.inactive video,.video-player.inactive .video-player__controls{visibility:hidden}.video-player__spoiler{display:none;position:absolute;top:0;left:0;width:100%;height:100%;z-index:4;border:0;background:#000;color:#9baec8;transition:none;pointer-events:none}.video-player__spoiler.active{display:block;pointer-events:auto}.video-player__spoiler.active:hover,.video-player__spoiler.active:active,.video-player__spoiler.active:focus{color:#b2c1d5}.video-player__spoiler__title{display:block;font-size:14px}.video-player__spoiler__subtitle{display:block;font-size:11px;font-weight:500}.video-player__buttons-bar{display:flex;justify-content:space-between;padding-bottom:10px}.video-player__buttons-bar .video-player__download__icon{color:inherit}.video-player__buttons{font-size:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.video-player__buttons.left button{padding-left:0}.video-player__buttons.right button{padding-right:0}.video-player__buttons button{background:transparent;padding:2px 10px;font-size:16px;border:0;color:rgba(255,255,255,.75)}.video-player__buttons button:active,.video-player__buttons button:hover,.video-player__buttons button:focus{color:#fff}.video-player__time-sep,.video-player__time-total,.video-player__time-current{font-size:14px;font-weight:500}.video-player__time-current{color:#fff;margin-left:60px}.video-player__time-sep{display:inline-block;margin:0 6px}.video-player__time-sep,.video-player__time-total{color:#fff}.video-player__volume{cursor:pointer;height:24px;display:inline}.video-player__volume::before{content:\"\";width:50px;background:rgba(255,255,255,.35);border-radius:4px;display:block;position:absolute;height:4px;left:70px;bottom:20px}.video-player__volume__current{display:block;position:absolute;height:4px;border-radius:4px;left:70px;bottom:20px;background:#0000a8}.video-player__volume__handle{position:absolute;z-index:3;border-radius:50%;width:12px;height:12px;bottom:16px;left:70px;transition:opacity .1s ease;background:#0000a8;box-shadow:1px 2px 6px rgba(0,0,0,.2);pointer-events:none}.video-player__link{padding:2px 10px}.video-player__link a{text-decoration:none;font-size:14px;font-weight:500;color:#fff}.video-player__link a:hover,.video-player__link a:active,.video-player__link a:focus{text-decoration:underline}.video-player__seek{cursor:pointer;height:24px;position:relative}.video-player__seek::before{content:\"\";width:100%;background:rgba(255,255,255,.35);border-radius:4px;display:block;position:absolute;height:4px;top:10px}.video-player__seek__progress,.video-player__seek__buffer{display:block;position:absolute;height:4px;border-radius:4px;top:10px;background:#0000a8}.video-player__seek__buffer{background:rgba(255,255,255,.2)}.video-player__seek__handle{position:absolute;z-index:3;opacity:0;border-radius:50%;width:12px;height:12px;top:6px;margin-left:-6px;transition:opacity .1s ease;background:#0000a8;box-shadow:1px 2px 6px rgba(0,0,0,.2);pointer-events:none}.video-player__seek__handle.active{opacity:1}.video-player__seek:hover .video-player__seek__handle{opacity:1}.video-player.detailed .video-player__buttons button,.video-player.fullscreen .video-player__buttons button{padding-top:10px;padding-bottom:10px}.directory__list{width:100%;margin:10px 0;transition:opacity 100ms ease-in}.directory__list.loading{opacity:.7}@media screen and (max-width: 415px){.directory__list{margin:0}}.directory__card{box-sizing:border-box;margin-bottom:10px}.directory__card__img{height:125px;position:relative;background:#000;overflow:hidden}.directory__card__img img{display:block;width:100%;height:100%;margin:0;object-fit:cover}.directory__card__bar{display:flex;align-items:center;background:#192432;padding:10px}.directory__card__bar__name{flex:1 1 auto;display:flex;align-items:center;text-decoration:none;overflow:hidden}.directory__card__bar__relationship{width:23px;min-height:1px;flex:0 0 auto}.directory__card__bar .avatar{flex:0 0 auto;width:48px;height:48px;padding-top:2px}.directory__card__bar .avatar img{width:100%;height:100%;display:block;margin:0;border-radius:4px;background:#040609;object-fit:cover}.directory__card__bar .display-name{margin-left:15px;text-align:left}.directory__card__bar .display-name strong{font-size:15px;color:#fff;font-weight:500;overflow:hidden;text-overflow:ellipsis}.directory__card__bar .display-name span{display:block;font-size:14px;color:#9baec8;font-weight:400;overflow:hidden;text-overflow:ellipsis}.directory__card__extra{background:#121a24;display:flex;align-items:center;justify-content:center}.directory__card__extra .accounts-table__count{width:33.33%;flex:0 0 auto;padding:15px 0}.directory__card__extra .account__header__content{box-sizing:border-box;padding:15px 10px;border-bottom:1px solid #202e3f;width:100%;min-height:48px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.directory__card__extra .account__header__content p{display:none}.directory__card__extra .account__header__content p:first-child{display:inline}.directory__card__extra .account__header__content br{display:none}.account-gallery__container{display:flex;flex-wrap:wrap;padding:4px 2px}.account-gallery__item{border:0;box-sizing:border-box;display:block;position:relative;border-radius:4px;overflow:hidden;margin:2px}.account-gallery__item__icons{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);font-size:24px}.notification__filter-bar,.account__section-headline{background:#0b1016;border-bottom:1px solid #202e3f;cursor:default;display:flex;flex-shrink:0}.notification__filter-bar button,.account__section-headline button{background:#0b1016;border:0;margin:0}.notification__filter-bar button,.notification__filter-bar a,.account__section-headline button,.account__section-headline a{display:block;flex:1 1 auto;color:#9baec8;padding:15px 0;font-size:14px;font-weight:500;text-align:center;text-decoration:none;position:relative;width:100%;white-space:nowrap}.notification__filter-bar button.active,.notification__filter-bar a.active,.account__section-headline button.active,.account__section-headline a.active{color:#d9e1e8}.notification__filter-bar button.active::before,.notification__filter-bar button.active::after,.notification__filter-bar a.active::before,.notification__filter-bar a.active::after,.account__section-headline button.active::before,.account__section-headline button.active::after,.account__section-headline a.active::before,.account__section-headline a.active::after{display:block;content:\"\";position:absolute;bottom:0;left:50%;width:0;height:0;transform:translateX(-50%);border-style:solid;border-width:0 10px 10px;border-color:transparent transparent #202e3f}.notification__filter-bar button.active::after,.notification__filter-bar a.active::after,.account__section-headline button.active::after,.account__section-headline a.active::after{bottom:-1px;border-color:transparent transparent #121a24}.notification__filter-bar.directory__section-headline,.account__section-headline.directory__section-headline{background:#0f151d;border-bottom-color:transparent}.notification__filter-bar.directory__section-headline a.active::before,.notification__filter-bar.directory__section-headline button.active::before,.account__section-headline.directory__section-headline a.active::before,.account__section-headline.directory__section-headline button.active::before{display:none}.notification__filter-bar.directory__section-headline a.active::after,.notification__filter-bar.directory__section-headline button.active::after,.account__section-headline.directory__section-headline a.active::after,.account__section-headline.directory__section-headline button.active::after{border-color:transparent transparent #06090c}.filter-form{background:#121a24}.filter-form__column{padding:10px 15px}.filter-form .radio-button{display:block}.radio-button{font-size:14px;position:relative;display:inline-block;padding:6px 0;line-height:18px;cursor:default;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer}.radio-button input[type=radio],.radio-button input[type=checkbox]{display:none}.radio-button__input{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:50%;vertical-align:middle}.radio-button__input.checked{border-color:#0000a8;background:#0000a8}::-webkit-scrollbar-thumb{border-radius:0}.search-popout{background:#fff;border-radius:4px;padding:10px 14px;padding-bottom:14px;margin-top:10px;color:#9baec8;box-shadow:2px 4px 15px rgba(0,0,0,.4)}.search-popout h4{text-transform:uppercase;color:#9baec8;font-size:13px;font-weight:500;margin-bottom:10px}.search-popout li{padding:4px 0}.search-popout ul{margin-bottom:10px}.search-popout em{font-weight:500;color:#121a24}noscript{text-align:center}noscript img{width:200px;opacity:.5;animation:flicker 4s infinite}noscript div{font-size:14px;margin:30px auto;color:#d9e1e8;max-width:400px}noscript div a{color:#00007f;text-decoration:underline}noscript div a:hover{text-decoration:none}@keyframes flicker{0%{opacity:1}30%{opacity:.75}100%{opacity:1}}@media screen and (max-width: 630px)and (max-height: 400px){.tabs-bar,.search{will-change:margin-top;transition:margin-top 400ms 100ms}.navigation-bar{will-change:padding-bottom;transition:padding-bottom 400ms 100ms}.navigation-bar>a:first-child{will-change:margin-top,margin-left,margin-right,width;transition:margin-top 400ms 100ms,margin-left 400ms 500ms,margin-right 400ms 500ms}.navigation-bar>.navigation-bar__profile-edit{will-change:margin-top;transition:margin-top 400ms 100ms}.navigation-bar .navigation-bar__actions>.icon-button.close{will-change:opacity transform;transition:opacity 200ms 100ms,transform 400ms 100ms}.navigation-bar .navigation-bar__actions>.compose__action-bar .icon-button{will-change:opacity transform;transition:opacity 200ms 300ms,transform 400ms 100ms}.is-composing .tabs-bar,.is-composing .search{margin-top:-50px}.is-composing .navigation-bar{padding-bottom:0}.is-composing .navigation-bar>a:first-child{margin:-100px 10px 0 -50px}.is-composing .navigation-bar .navigation-bar__profile{padding-top:2px}.is-composing .navigation-bar .navigation-bar__profile-edit{position:absolute;margin-top:-60px}.is-composing .navigation-bar .navigation-bar__actions .icon-button.close{pointer-events:auto;opacity:1;transform:scale(1, 1) translate(0, 0);bottom:5px}.is-composing .navigation-bar .navigation-bar__actions .compose__action-bar .icon-button{pointer-events:none;opacity:0;transform:scale(0, 1) translate(100%, 0)}}.embed-modal{width:auto;max-width:80vw;max-height:80vh}.embed-modal h4{padding:30px;font-weight:500;font-size:16px;text-align:center}.embed-modal .embed-modal__container{padding:10px}.embed-modal .embed-modal__container .hint{margin-bottom:15px}.embed-modal .embed-modal__container .embed-modal__html{outline:0;box-sizing:border-box;display:block;width:100%;border:0;padding:10px;font-family:\"mastodon-font-monospace\",monospace;background:#121a24;color:#fff;font-size:14px;margin:0;margin-bottom:15px;border-radius:4px}.embed-modal .embed-modal__container .embed-modal__html::-moz-focus-inner{border:0}.embed-modal .embed-modal__container .embed-modal__html::-moz-focus-inner,.embed-modal .embed-modal__container .embed-modal__html:focus,.embed-modal .embed-modal__container .embed-modal__html:active{outline:0 !important}.embed-modal .embed-modal__container .embed-modal__html:focus{background:#192432}@media screen and (max-width: 600px){.embed-modal .embed-modal__container .embed-modal__html{font-size:16px}}.embed-modal .embed-modal__container .embed-modal__iframe{width:400px;max-width:100%;overflow:hidden;border:0;border-radius:4px}.account__moved-note{padding:14px 10px;padding-bottom:16px;background:#192432;border-top:1px solid #202e3f;border-bottom:1px solid #202e3f}.account__moved-note__message{position:relative;margin-left:58px;color:#404040;padding:8px 0;padding-top:0;padding-bottom:4px;font-size:14px}.account__moved-note__message>span{display:block;overflow:hidden;text-overflow:ellipsis}.account__moved-note__icon-wrapper{left:-26px;position:absolute}.account__moved-note .detailed-status__display-avatar{position:relative}.account__moved-note .detailed-status__display-name{margin-bottom:0}.column-inline-form{padding:15px;padding-right:0;display:flex;justify-content:flex-start;align-items:center;background:#192432}.column-inline-form label{flex:1 1 auto}.column-inline-form label input{width:100%}.column-inline-form label input:focus{outline:0}.column-inline-form .icon-button{flex:0 0 auto;margin:0 10px}.drawer__backdrop{cursor:pointer;position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5)}.list-editor{background:#121a24;flex-direction:column;border-radius:8px;box-shadow:2px 4px 15px rgba(0,0,0,.4);width:380px;overflow:hidden}@media screen and (max-width: 420px){.list-editor{width:90%}}.list-editor h4{padding:15px 0;background:#283a50;font-weight:500;font-size:16px;text-align:center;border-radius:8px 8px 0 0}.list-editor .drawer__pager{height:50vh}.list-editor .drawer__inner{border-radius:0 0 8px 8px}.list-editor .drawer__inner.backdrop{width:calc(100% - 60px);box-shadow:2px 4px 15px rgba(0,0,0,.4);border-radius:0 0 0 8px}.list-editor__accounts{overflow-y:auto}.list-editor .account__display-name:hover strong{text-decoration:none}.list-editor .account__avatar{cursor:default}.list-editor .search{margin-bottom:0}.list-adder{background:#121a24;flex-direction:column;border-radius:8px;box-shadow:2px 4px 15px rgba(0,0,0,.4);width:380px;overflow:hidden}@media screen and (max-width: 420px){.list-adder{width:90%}}.list-adder__account{background:#283a50}.list-adder__lists{background:#283a50;height:50vh;border-radius:0 0 8px 8px;overflow-y:auto}.list-adder .list{padding:10px;border-bottom:1px solid #202e3f}.list-adder .list__wrapper{display:flex}.list-adder .list__display-name{flex:1 1 auto;overflow:hidden;text-decoration:none;font-size:16px;padding:10px}.focal-point{position:relative;cursor:move;overflow:hidden;height:100%;display:flex;justify-content:center;align-items:center;background:#000}.focal-point img,.focal-point video,.focal-point canvas{display:block;max-height:80vh;width:100%;height:auto;margin:0;object-fit:contain;background:#000}.focal-point__reticle{position:absolute;width:100px;height:100px;transform:translate(-50%, -50%);background:url(\"~images/reticle.png\") no-repeat 0 0;border-radius:50%;box-shadow:0 0 0 9999em rgba(0,0,0,.35)}.focal-point__overlay{position:absolute;width:100%;height:100%;top:0;left:0}.focal-point__preview{position:absolute;bottom:10px;right:10px;z-index:2;cursor:move;transition:opacity .1s ease}.focal-point__preview:hover{opacity:.5}.focal-point__preview strong{color:#fff;font-size:14px;font-weight:500;display:block;margin-bottom:5px}.focal-point__preview div{border-radius:4px;box-shadow:0 0 14px rgba(0,0,0,.2)}@media screen and (max-width: 480px){.focal-point img,.focal-point video{max-height:100%}.focal-point__preview{display:none}}.account__header__content{color:#9baec8;font-size:14px;font-weight:400;overflow:hidden;word-break:normal;word-wrap:break-word}.account__header__content p{margin-bottom:20px}.account__header__content p:last-child{margin-bottom:0}.account__header__content a{color:inherit;text-decoration:underline}.account__header__content a:hover{text-decoration:none}.account__header{overflow:hidden}.account__header.inactive{opacity:.5}.account__header.inactive .account__header__image,.account__header.inactive .account__avatar{filter:grayscale(100%)}.account__header__info{position:absolute;top:10px;left:10px}.account__header__image{overflow:hidden;height:145px;position:relative;background:#0b1016}.account__header__image img{object-fit:cover;display:block;width:100%;height:100%;margin:0}.account__header__bar{position:relative;background:#192432;padding:5px;border-bottom:1px solid #26374d}.account__header__bar .avatar{display:block;flex:0 0 auto;width:94px;margin-left:-2px}.account__header__bar .avatar .account__avatar{background:#040609;border:2px solid #192432}.account__header__tabs{display:flex;align-items:flex-start;padding:7px 5px;margin-top:-55px}.account__header__tabs__buttons{display:flex;align-items:center;padding-top:55px;overflow:hidden}.account__header__tabs__buttons .icon-button{border:1px solid #26374d;border-radius:4px;box-sizing:content-box;padding:2px}.account__header__tabs__buttons .button{margin:0 8px}.account__header__tabs__name{padding:5px}.account__header__tabs__name .account-role{vertical-align:top}.account__header__tabs__name .emojione{width:22px;height:22px}.account__header__tabs__name h1{font-size:16px;line-height:24px;color:#fff;font-weight:500;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.account__header__tabs__name h1 small{display:block;font-size:14px;color:#9baec8;font-weight:400;overflow:hidden;text-overflow:ellipsis}.account__header__tabs .spacer{flex:1 1 auto}.account__header__bio{overflow:hidden;margin:0 -5px}.account__header__bio .account__header__content{padding:20px 15px;padding-bottom:5px;color:#fff}.account__header__bio .account__header__fields{margin:0;border-top:1px solid #26374d}.account__header__bio .account__header__fields a{color:#0000a8}.account__header__bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.account__header__bio .account__header__fields .verified a{color:#79bd9a}.account__header__extra{margin-top:4px}.account__header__extra__links{font-size:14px;color:#9baec8;padding:10px 0}.account__header__extra__links a{display:inline-block;color:#9baec8;text-decoration:none;padding:5px 10px;font-weight:500}.account__header__extra__links a strong{font-weight:700;color:#fff}.trends__header{color:#404040;background:#151f2b;border-bottom:1px solid #0b1016;font-weight:500;padding:15px;font-size:16px;cursor:default}.trends__header .fa{display:inline-block;margin-right:5px}.trends__item{display:flex;align-items:center;padding:15px;border-bottom:1px solid #202e3f}.trends__item:last-child{border-bottom:0}.trends__item__name{flex:1 1 auto;color:#404040;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trends__item__name strong{font-weight:500}.trends__item__name a{color:#9baec8;text-decoration:none;font-size:14px;font-weight:500;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trends__item__name a:hover span,.trends__item__name a:focus span,.trends__item__name a:active span{text-decoration:underline}.trends__item__current{flex:0 0 auto;font-size:24px;line-height:36px;font-weight:500;text-align:right;padding-right:15px;margin-left:5px;color:#d9e1e8}.trends__item__sparkline{flex:0 0 auto;width:50px}.trends__item__sparkline path:first-child{fill:rgba(0,0,127,.25) !important;fill-opacity:1 !important}.trends__item__sparkline path:last-child{stroke:#00009e !important}.conversation{display:flex;border-bottom:1px solid #202e3f;padding:5px;padding-bottom:0}.conversation:focus{background:#151f2b;outline:0}.conversation__avatar{flex:0 0 auto;padding:10px;padding-top:12px;position:relative;cursor:pointer}.conversation__unread{display:inline-block;background:#00007f;border-radius:50%;width:.625rem;height:.625rem;margin:-0.1ex .15em .1ex}.conversation__content{flex:1 1 auto;padding:10px 5px;padding-right:15px;overflow:hidden}.conversation__content__info{overflow:hidden;display:flex;flex-direction:row-reverse;justify-content:space-between}.conversation__content__relative-time{font-size:15px;color:#9baec8;padding-left:15px}.conversation__content__names{color:#9baec8;font-size:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:4px;flex-basis:90px;flex-grow:1}.conversation__content__names a{color:#fff;text-decoration:none}.conversation__content__names a:hover,.conversation__content__names a:focus,.conversation__content__names a:active{text-decoration:underline}.conversation__content a{word-break:break-word}.conversation--unread{background:#151f2b}.conversation--unread:focus{background:#192432}.conversation--unread .conversation__content__info{font-weight:700}.conversation--unread .conversation__content__relative-time{color:#fff}.announcements{background:#202e3f;font-size:13px;display:flex;align-items:flex-end}.announcements__mastodon{width:124px;flex:0 0 auto}@media screen and (max-width: 424px){.announcements__mastodon{display:none}}.announcements__container{width:calc(100% - 124px);flex:0 0 auto;position:relative}@media screen and (max-width: 424px){.announcements__container{width:100%}}.announcements__item{box-sizing:border-box;width:100%;padding:15px;position:relative;font-size:15px;line-height:20px;word-wrap:break-word;font-weight:400;max-height:50vh;overflow:hidden;display:flex;flex-direction:column}.announcements__item__range{display:block;font-weight:500;margin-bottom:10px;padding-right:18px}.announcements__item__unread{position:absolute;top:19px;right:19px;display:block;background:#00007f;border-radius:50%;width:.625rem;height:.625rem}.announcements__pagination{padding:15px;color:#9baec8;position:absolute;bottom:3px;right:0}.layout-multiple-columns .announcements__mastodon{display:none}.layout-multiple-columns .announcements__container{width:100%}.reactions-bar{display:flex;flex-wrap:wrap;align-items:center;margin-top:15px;margin-left:-2px;width:calc(100% - (90px - 33px))}.reactions-bar__item{flex-shrink:0;background:#26374d;border:0;border-radius:3px;margin:2px;cursor:pointer;user-select:none;padding:0 6px;display:flex;align-items:center;transition:all 100ms ease-in;transition-property:background-color,color}.reactions-bar__item__emoji{display:block;margin:3px 0;width:16px;height:16px}.reactions-bar__item__emoji img{display:block;margin:0;width:100%;height:100%;min-width:auto;min-height:auto;vertical-align:bottom;object-fit:contain}.reactions-bar__item__count{display:block;min-width:9px;font-size:13px;font-weight:500;text-align:center;margin-left:6px;color:#9baec8}.reactions-bar__item:hover,.reactions-bar__item:focus,.reactions-bar__item:active{background:#2d415a;transition:all 200ms ease-out;transition-property:background-color,color}.reactions-bar__item:hover__count,.reactions-bar__item:focus__count,.reactions-bar__item:active__count{color:#a8b9cf}.reactions-bar__item.active{transition:all 100ms ease-in;transition-property:background-color,color;background-color:#1e2c57}.reactions-bar__item.active .reactions-bar__item__count{color:#0000a8}.reactions-bar .emoji-picker-dropdown{margin:2px}.reactions-bar:hover .emoji-button{opacity:.85}.reactions-bar .emoji-button{color:#9baec8;margin:0;font-size:16px;width:auto;flex-shrink:0;padding:0 6px;height:22px;display:flex;align-items:center;opacity:.5;transition:all 100ms ease-in;transition-property:background-color,color}.reactions-bar .emoji-button:hover,.reactions-bar .emoji-button:active,.reactions-bar .emoji-button:focus{opacity:1;color:#a8b9cf;transition:all 200ms ease-out;transition-property:background-color,color}.reactions-bar--empty .emoji-button{padding:0}.poll{margin-top:16px;font-size:14px}.poll li{margin-bottom:10px;position:relative}.poll__chart{border-radius:4px;display:block;background:#8ba1bf;height:5px;min-width:1%}.poll__chart.leading{background:#00007f}.poll__option{position:relative;display:flex;padding:6px 0;line-height:18px;cursor:default;overflow:hidden}.poll__option__text{display:inline-block;word-wrap:break-word;overflow-wrap:break-word;max-width:calc(100% - 45px - 25px)}.poll__option input[type=radio],.poll__option input[type=checkbox]{display:none}.poll__option .autossugest-input{flex:1 1 auto}.poll__option input[type=text]{display:block;box-sizing:border-box;width:100%;font-size:14px;color:#121a24;outline:0;font-family:inherit;background:#fff;border:1px solid #dbdbdb;border-radius:4px;padding:6px 10px}.poll__option input[type=text]:focus{border-color:#00007f}.poll__option.selectable{cursor:pointer}.poll__option.editable{display:flex;align-items:center;overflow:visible}.poll__input{display:inline-block;position:relative;border:1px solid #9baec8;box-sizing:border-box;width:18px;height:18px;flex:0 0 auto;margin-right:10px;top:-1px;border-radius:50%;vertical-align:middle;margin-top:auto;margin-bottom:auto;flex:0 0 18px}.poll__input.checkbox{border-radius:4px}.poll__input.active{border-color:#79bd9a;background:#79bd9a}.poll__input:active,.poll__input:focus,.poll__input:hover{border-color:#acd6c1;border-width:4px}.poll__input::-moz-focus-inner{outline:0 !important;border:0}.poll__input:focus,.poll__input:active{outline:0 !important}.poll__number{display:inline-block;width:45px;font-weight:700;flex:0 0 45px}.poll__voted{padding:0 5px;display:inline-block}.poll__voted__mark{font-size:18px}.poll__footer{padding-top:6px;padding-bottom:5px;color:#404040}.poll__link{display:inline;background:transparent;padding:0;margin:0;border:0;color:#404040;text-decoration:underline;font-size:inherit}.poll__link:hover{text-decoration:none}.poll__link:active,.poll__link:focus{background-color:rgba(64,64,64,.1)}.poll .button{height:36px;padding:0 16px;margin-right:10px;font-size:14px}.compose-form__poll-wrapper{border-top:1px solid #ebebeb}.compose-form__poll-wrapper ul{padding:10px}.compose-form__poll-wrapper .poll__footer{border-top:1px solid #ebebeb;padding:10px;display:flex;align-items:center}.compose-form__poll-wrapper .poll__footer button,.compose-form__poll-wrapper .poll__footer select{flex:1 1 50%}.compose-form__poll-wrapper .poll__footer button:focus,.compose-form__poll-wrapper .poll__footer select:focus{border-color:#00007f}.compose-form__poll-wrapper .button.button-secondary{font-size:14px;font-weight:400;padding:6px 10px;height:auto;line-height:inherit;color:#404040;border-color:#404040;margin-right:5px}.compose-form__poll-wrapper li{display:flex;align-items:center}.compose-form__poll-wrapper li .poll__option{flex:0 0 auto;width:calc(100% - (23px + 6px));margin-right:6px}.compose-form__poll-wrapper select{appearance:none;box-sizing:border-box;font-size:14px;color:#121a24;display:inline-block;width:auto;outline:0;font-family:inherit;background:#fff url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center/auto 16px;border:1px solid #dbdbdb;border-radius:4px;padding:6px 10px;padding-right:30px}.compose-form__poll-wrapper .icon-button.disabled{color:#dbdbdb}.muted .poll{color:#404040}.muted .poll__chart{background:rgba(109,137,175,.2)}.muted .poll__chart.leading{background:rgba(0,0,127,.2)}.modal-layout{background:#121a24 url('data:image/svg+xml;utf8,') repeat-x bottom fixed;display:flex;flex-direction:column;height:100vh;padding:0}.modal-layout__mastodon{display:flex;flex:1;flex-direction:column;justify-content:flex-end}.modal-layout__mastodon>*{flex:1;max-height:235px}@media screen and (max-width: 600px){.account-header{margin-top:0}}.emoji-mart{font-size:13px;display:inline-block;color:#121a24}.emoji-mart,.emoji-mart *{box-sizing:border-box;line-height:1.15}.emoji-mart .emoji-mart-emoji{padding:6px}.emoji-mart-bar{border:0 solid #c0cdd9}.emoji-mart-bar:first-child{border-bottom-width:1px;border-top-left-radius:5px;border-top-right-radius:5px;background:#d9e1e8}.emoji-mart-bar:last-child{border-top-width:1px;border-bottom-left-radius:5px;border-bottom-right-radius:5px;display:none}.emoji-mart-anchors{display:flex;justify-content:space-between;padding:0 6px;color:#404040;line-height:0}.emoji-mart-anchor{position:relative;flex:1;text-align:center;padding:12px 4px;overflow:hidden;transition:color .1s ease-out;cursor:pointer}.emoji-mart-anchor:hover{color:#363636}.emoji-mart-anchor-selected{color:#00007f}.emoji-mart-anchor-selected:hover{color:#00006b}.emoji-mart-anchor-selected .emoji-mart-anchor-bar{bottom:-1px}.emoji-mart-anchor-bar{position:absolute;bottom:-5px;left:0;width:100%;height:4px;background-color:#00007f}.emoji-mart-anchors i{display:inline-block;width:100%;max-width:22px}.emoji-mart-anchors svg{fill:currentColor;max-height:18px}.emoji-mart-scroll{overflow-y:scroll;height:270px;max-height:35vh;padding:0 6px 6px;background:#fff;will-change:transform}.emoji-mart-scroll::-webkit-scrollbar-track:hover,.emoji-mart-scroll::-webkit-scrollbar-track:active{background-color:rgba(0,0,0,.3)}.emoji-mart-search{padding:10px;padding-right:45px;background:#fff}.emoji-mart-search input{font-size:14px;font-weight:400;padding:7px 9px;font-family:inherit;display:block;width:100%;background:rgba(217,225,232,.3);color:#121a24;border:1px solid #d9e1e8;border-radius:4px}.emoji-mart-search input::-moz-focus-inner{border:0}.emoji-mart-search input::-moz-focus-inner,.emoji-mart-search input:focus,.emoji-mart-search input:active{outline:0 !important}.emoji-mart-category .emoji-mart-emoji{cursor:pointer}.emoji-mart-category .emoji-mart-emoji span{z-index:1;position:relative;text-align:center}.emoji-mart-category .emoji-mart-emoji:hover::before{z-index:0;content:\"\";position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(217,225,232,.7);border-radius:100%}.emoji-mart-category-label{z-index:2;position:relative;position:-webkit-sticky;position:sticky;top:0}.emoji-mart-category-label span{display:block;width:100%;font-weight:500;padding:5px 6px;background:#fff}.emoji-mart-emoji{position:relative;display:inline-block;font-size:0}.emoji-mart-emoji span{width:22px;height:22px}.emoji-mart-no-results{font-size:14px;text-align:center;padding-top:70px;color:#9baec8}.emoji-mart-no-results .emoji-mart-category-label{display:none}.emoji-mart-no-results .emoji-mart-no-results-label{margin-top:.2em}.emoji-mart-no-results .emoji-mart-emoji:hover::before{content:none}.emoji-mart-preview{display:none}.container{box-sizing:border-box;max-width:1235px;margin:0 auto;position:relative}@media screen and (max-width: 1255px){.container{width:100%;padding:0 10px}}.rich-formatting{font-family:\"mastodon-font-sans-serif\",sans-serif;font-size:14px;font-weight:400;line-height:1.7;word-wrap:break-word;color:#9baec8}.rich-formatting a{color:#00007f;text-decoration:underline}.rich-formatting a:hover,.rich-formatting a:focus,.rich-formatting a:active{text-decoration:none}.rich-formatting p,.rich-formatting li{color:#9baec8}.rich-formatting p{margin-top:0;margin-bottom:.85em}.rich-formatting p:last-child{margin-bottom:0}.rich-formatting strong{font-weight:700;color:#d9e1e8}.rich-formatting em{font-style:italic;color:#d9e1e8}.rich-formatting code{font-size:.85em;background:#040609;border-radius:4px;padding:.2em .3em}.rich-formatting h1,.rich-formatting h2,.rich-formatting h3,.rich-formatting h4,.rich-formatting h5,.rich-formatting h6{font-family:\"mastodon-font-display\",sans-serif;margin-top:1.275em;margin-bottom:.85em;font-weight:500;color:#d9e1e8}.rich-formatting h1{font-size:2em}.rich-formatting h2{font-size:1.75em}.rich-formatting h3{font-size:1.5em}.rich-formatting h4{font-size:1.25em}.rich-formatting h5,.rich-formatting h6{font-size:1em}.rich-formatting ul{list-style:disc}.rich-formatting ol{list-style:decimal}.rich-formatting ul,.rich-formatting ol{margin:0;padding:0;padding-left:2em;margin-bottom:.85em}.rich-formatting ul[type=a],.rich-formatting ol[type=a]{list-style-type:lower-alpha}.rich-formatting ul[type=i],.rich-formatting ol[type=i]{list-style-type:lower-roman}.rich-formatting hr{width:100%;height:0;border:0;border-bottom:1px solid #192432;margin:1.7em 0}.rich-formatting hr.spacer{height:1px;border:0}.rich-formatting table{width:100%;border-collapse:collapse;break-inside:auto;margin-top:24px;margin-bottom:32px}.rich-formatting table thead tr,.rich-formatting table tbody tr{border-bottom:1px solid #192432;font-size:1em;line-height:1.625;font-weight:400;text-align:left;color:#9baec8}.rich-formatting table thead tr{border-bottom-width:2px;line-height:1.5;font-weight:500;color:#404040}.rich-formatting table th,.rich-formatting table td{padding:8px;align-self:start;align-items:start;word-break:break-all}.rich-formatting table th.nowrap,.rich-formatting table td.nowrap{width:25%;position:relative}.rich-formatting table th.nowrap::before,.rich-formatting table td.nowrap::before{content:\" \";visibility:hidden}.rich-formatting table th.nowrap span,.rich-formatting table td.nowrap span{position:absolute;left:8px;right:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rich-formatting>:first-child{margin-top:0}.information-board{background:#0b1016;padding:20px 0}.information-board .container-alt{position:relative;padding-right:295px}.information-board__sections{display:flex;justify-content:space-between;flex-wrap:wrap}.information-board__section{flex:1 0 0;font-family:\"mastodon-font-sans-serif\",sans-serif;font-size:16px;line-height:28px;color:#fff;text-align:right;padding:10px 15px}.information-board__section span,.information-board__section strong{display:block}.information-board__section span:last-child{color:#d9e1e8}.information-board__section strong{font-family:\"mastodon-font-display\",sans-serif;font-weight:500;font-size:32px;line-height:48px}@media screen and (max-width: 700px){.information-board__section{text-align:center}}.information-board .panel{position:absolute;width:280px;box-sizing:border-box;background:#040609;padding:20px;padding-top:10px;border-radius:4px 4px 0 0;right:0;bottom:-40px}.information-board .panel .panel-header{font-family:\"mastodon-font-display\",sans-serif;font-size:14px;line-height:24px;font-weight:500;color:#9baec8;padding-bottom:5px;margin-bottom:15px;border-bottom:1px solid #192432;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.information-board .panel .panel-header a,.information-board .panel .panel-header span{font-weight:400;color:#7a93b6}.information-board .panel .panel-header a{text-decoration:none}.information-board .owner{text-align:center}.information-board .owner .avatar{width:80px;height:80px;margin:0 auto;margin-bottom:15px}.information-board .owner .avatar img{display:block;width:80px;height:80px;border-radius:48px}.information-board .owner .name{font-size:14px}.information-board .owner .name a{display:block;color:#fff;text-decoration:none}.information-board .owner .name a:hover .display_name{text-decoration:underline}.information-board .owner .name .username{display:block;color:#9baec8}.landing-page p,.landing-page li{font-family:\"mastodon-font-sans-serif\",sans-serif;font-size:16px;font-weight:400;font-size:16px;line-height:30px;margin-bottom:12px;color:#9baec8}.landing-page p a,.landing-page li a{color:#00007f;text-decoration:underline}.landing-page em{display:inline;margin:0;padding:0;font-weight:700;background:transparent;font-family:inherit;font-size:inherit;line-height:inherit;color:#bcc9da}.landing-page h1{font-family:\"mastodon-font-display\",sans-serif;font-size:26px;line-height:30px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page h1 small{font-family:\"mastodon-font-sans-serif\",sans-serif;display:block;font-size:18px;font-weight:400;color:#bcc9da}.landing-page h2{font-family:\"mastodon-font-display\",sans-serif;font-size:22px;line-height:26px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page h3{font-family:\"mastodon-font-display\",sans-serif;font-size:18px;line-height:24px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page h4{font-family:\"mastodon-font-display\",sans-serif;font-size:16px;line-height:24px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page h5{font-family:\"mastodon-font-display\",sans-serif;font-size:14px;line-height:24px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page h6{font-family:\"mastodon-font-display\",sans-serif;font-size:12px;line-height:24px;font-weight:500;margin-bottom:20px;color:#d9e1e8}.landing-page ul,.landing-page ol{margin-left:20px}.landing-page ul[type=a],.landing-page ol[type=a]{list-style-type:lower-alpha}.landing-page ul[type=i],.landing-page ol[type=i]{list-style-type:lower-roman}.landing-page ul{list-style:disc}.landing-page ol{list-style:decimal}.landing-page li>ol,.landing-page li>ul{margin-top:6px}.landing-page hr{width:100%;height:0;border:0;border-bottom:1px solid rgba(64,64,64,.6);margin:20px 0}.landing-page hr.spacer{height:1px;border:0}.landing-page__information,.landing-page__forms{padding:20px}.landing-page__call-to-action{background:#121a24;border-radius:4px;padding:25px 40px;overflow:hidden;box-sizing:border-box}.landing-page__call-to-action .row{width:100%;display:flex;flex-direction:row-reverse;flex-wrap:nowrap;justify-content:space-between;align-items:center}.landing-page__call-to-action .row__information-board{display:flex;justify-content:flex-end;align-items:flex-end}.landing-page__call-to-action .row__information-board .information-board__section{flex:1 0 auto;padding:0 10px}@media screen and (max-width: 415px){.landing-page__call-to-action .row__information-board{width:100%;justify-content:space-between}}.landing-page__call-to-action .row__mascot{flex:1;margin:10px -50px 0 0}@media screen and (max-width: 415px){.landing-page__call-to-action .row__mascot{display:none}}.landing-page__logo{margin-right:20px}.landing-page__logo img{height:50px;width:auto;mix-blend-mode:lighten}.landing-page__information{padding:45px 40px;margin-bottom:10px}.landing-page__information:last-child{margin-bottom:0}.landing-page__information strong{font-weight:500;color:#bcc9da}.landing-page__information .account{border-bottom:0;padding:0}.landing-page__information .account__display-name{align-items:center;display:flex;margin-right:5px}.landing-page__information .account div.account__display-name:hover .display-name strong{text-decoration:none}.landing-page__information .account div.account__display-name .account__avatar{cursor:default}.landing-page__information .account__avatar-wrapper{margin-left:0;flex:0 0 auto}.landing-page__information .account__avatar{width:44px;height:44px;background-size:44px 44px}.landing-page__information .account .display-name{font-size:15px}.landing-page__information .account .display-name__account{font-size:14px}@media screen and (max-width: 960px){.landing-page__information .contact{margin-top:30px}}@media screen and (max-width: 700px){.landing-page__information{padding:25px 20px}}.landing-page__information,.landing-page__forms,.landing-page #mastodon-timeline{box-sizing:border-box;background:#121a24;border-radius:4px;box-shadow:0 0 6px rgba(0,0,0,.1)}.landing-page__mascot{height:104px;position:relative;left:-40px;bottom:25px}.landing-page__mascot img{height:190px;width:auto}.landing-page__short-description .row{display:flex;flex-wrap:wrap;align-items:center;margin-bottom:40px}@media screen and (max-width: 700px){.landing-page__short-description .row{margin-bottom:20px}}.landing-page__short-description p a{color:#d9e1e8}.landing-page__short-description h1{font-weight:500;color:#fff;margin-bottom:0}.landing-page__short-description h1 small{color:#9baec8}.landing-page__short-description h1 small span{color:#d9e1e8}.landing-page__short-description p:last-child{margin-bottom:0}.landing-page__hero{margin-bottom:10px}.landing-page__hero img{display:block;margin:0;max-width:100%;height:auto;border-radius:4px}@media screen and (max-width: 840px){.landing-page .information-board .container-alt{padding-right:20px}.landing-page .information-board .panel{position:static;margin-top:20px;width:100%;border-radius:4px}.landing-page .information-board .panel .panel-header{text-align:center}}@media screen and (max-width: 675px){.landing-page .header-wrapper{padding-top:0}.landing-page .header-wrapper.compact{padding-bottom:0}.landing-page .header-wrapper.compact .hero .heading{text-align:initial}.landing-page .header .container-alt,.landing-page .features .container-alt{display:block}}.landing-page .cta{margin:20px}.landing{margin-bottom:100px}@media screen and (max-width: 738px){.landing{margin-bottom:0}}.landing__brand{display:flex;justify-content:center;align-items:center;padding:50px}.landing__brand svg{fill:#fff;height:52px}@media screen and (max-width: 415px){.landing__brand{padding:0;margin-bottom:30px}}.landing .directory{margin-top:30px;background:transparent;box-shadow:none;border-radius:0}.landing .hero-widget{margin-top:30px;margin-bottom:0}.landing .hero-widget h4{padding:10px;text-transform:uppercase;font-weight:700;font-size:13px;color:#9baec8}.landing .hero-widget__text{border-radius:0;padding-bottom:0}.landing .hero-widget__footer{background:#121a24;padding:10px;border-radius:0 0 4px 4px;display:flex}.landing .hero-widget__footer__column{flex:1 1 50%}.landing .hero-widget .account{padding:10px 0;border-bottom:0}.landing .hero-widget .account .account__display-name{display:flex;align-items:center}.landing .hero-widget .account .account__avatar{width:44px;height:44px;background-size:44px 44px}.landing .hero-widget__counter{padding:10px}.landing .hero-widget__counter strong{font-family:\"mastodon-font-display\",sans-serif;font-size:15px;font-weight:700;display:block}.landing .hero-widget__counter span{font-size:14px;color:#9baec8}.landing .simple_form .user_agreement .label_input>label{font-weight:400;color:#9baec8}.landing .simple_form p.lead{color:#9baec8;font-size:15px;line-height:20px;font-weight:400;margin-bottom:25px}.landing__grid{max-width:960px;margin:0 auto;display:grid;grid-template-columns:minmax(0, 50%) minmax(0, 50%);grid-gap:30px}@media screen and (max-width: 738px){.landing__grid{grid-template-columns:minmax(0, 100%);grid-gap:10px}.landing__grid__column-login{grid-row:1;display:flex;flex-direction:column}.landing__grid__column-login .box-widget{order:2;flex:0 0 auto}.landing__grid__column-login .hero-widget{margin-top:0;margin-bottom:10px;order:1;flex:0 0 auto}.landing__grid__column-registration{grid-row:2}.landing__grid .directory{margin-top:10px}}@media screen and (max-width: 415px){.landing__grid{grid-gap:0}.landing__grid .hero-widget{display:block;margin-bottom:0;box-shadow:none}.landing__grid .hero-widget__img,.landing__grid .hero-widget__img img,.landing__grid .hero-widget__footer{border-radius:0}.landing__grid .hero-widget,.landing__grid .box-widget,.landing__grid .directory__tag{border-bottom:1px solid #202e3f}.landing__grid .directory{margin-top:0}.landing__grid .directory__tag{margin-bottom:0}.landing__grid .directory__tag>a,.landing__grid .directory__tag>div{border-radius:0;box-shadow:none}.landing__grid .directory__tag:last-child{border-bottom:0}}.brand{position:relative;text-decoration:none}.brand__tagline{display:block;position:absolute;bottom:-10px;left:50px;width:300px;color:#9baec8;text-decoration:none;font-size:14px}@media screen and (max-width: 415px){.brand__tagline{position:static;width:auto;margin-top:20px;color:#404040}}.table{width:100%;max-width:100%;border-spacing:0;border-collapse:collapse}.table th,.table td{padding:8px;line-height:18px;vertical-align:top;border-top:1px solid #121a24;text-align:left;background:#0b1016}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #121a24;border-top:0;font-weight:500}.table>tbody>tr>th{font-weight:500}.table>tbody>tr:nth-child(odd)>td,.table>tbody>tr:nth-child(odd)>th{background:#121a24}.table a{color:#00007f;text-decoration:underline}.table a:hover{text-decoration:none}.table strong{font-weight:500}.table strong:lang(ja){font-weight:700}.table strong:lang(ko){font-weight:700}.table strong:lang(zh-CN){font-weight:700}.table strong:lang(zh-HK){font-weight:700}.table strong:lang(zh-TW){font-weight:700}.table.inline-table>tbody>tr:nth-child(odd)>td,.table.inline-table>tbody>tr:nth-child(odd)>th{background:transparent}.table.inline-table>tbody>tr:first-child>td,.table.inline-table>tbody>tr:first-child>th{border-top:0}.table.batch-table>thead>tr>th{background:#121a24;border-top:1px solid #040609;border-bottom:1px solid #040609}.table.batch-table>thead>tr>th:first-child{border-radius:4px 0 0;border-left:1px solid #040609}.table.batch-table>thead>tr>th:last-child{border-radius:0 4px 0 0;border-right:1px solid #040609}.table--invites tbody td{vertical-align:middle}.table-wrapper{overflow:auto;margin-bottom:20px}samp{font-family:\"mastodon-font-monospace\",monospace}button.table-action-link{background:transparent;border:0;font:inherit}button.table-action-link,a.table-action-link{text-decoration:none;display:inline-block;margin-right:5px;padding:0 10px;color:#9baec8;font-weight:500}button.table-action-link:hover,a.table-action-link:hover{color:#fff}button.table-action-link i.fa,a.table-action-link i.fa{font-weight:400;margin-right:5px}button.table-action-link:first-child,a.table-action-link:first-child{padding-left:0}.batch-table__toolbar,.batch-table__row{display:flex}.batch-table__toolbar__select,.batch-table__row__select{box-sizing:border-box;padding:8px 16px;cursor:pointer;min-height:100%}.batch-table__toolbar__select input,.batch-table__row__select input{margin-top:8px}.batch-table__toolbar__select--aligned,.batch-table__row__select--aligned{display:flex;align-items:center}.batch-table__toolbar__select--aligned input,.batch-table__row__select--aligned input{margin-top:0}.batch-table__toolbar__actions,.batch-table__toolbar__content,.batch-table__row__actions,.batch-table__row__content{padding:8px 0;padding-right:16px;flex:1 1 auto}.batch-table__toolbar{border:1px solid #040609;background:#121a24;border-radius:4px 0 0;height:47px;align-items:center}.batch-table__toolbar__actions{text-align:right;padding-right:11px}.batch-table__form{padding:16px;border:1px solid #040609;border-top:0;background:#121a24}.batch-table__form .fields-row{padding-top:0;margin-bottom:0}.batch-table__row{border:1px solid #040609;border-top:0;background:#0b1016}@media screen and (max-width: 415px){.optional .batch-table__row:first-child{border-top:1px solid #040609}}.batch-table__row:hover{background:#0f151d}.batch-table__row:nth-child(even){background:#121a24}.batch-table__row:nth-child(even):hover{background:#151f2b}.batch-table__row__content{padding-top:12px;padding-bottom:16px}.batch-table__row__content--unpadded{padding:0}.batch-table__row__content--with-image{display:flex;align-items:center}.batch-table__row__content__image{flex:0 0 auto;display:flex;justify-content:center;align-items:center;margin-right:10px}.batch-table__row__content__image .emojione{width:32px;height:32px}.batch-table__row__content__text{flex:1 1 auto}.batch-table__row__content__extra{flex:0 0 auto;text-align:right;color:#9baec8;font-weight:500}.batch-table__row .directory__tag{margin:0;width:100%}.batch-table__row .directory__tag a{background:transparent;border-radius:0}@media screen and (max-width: 415px){.batch-table.optional .batch-table__toolbar,.batch-table.optional .batch-table__row__select{display:none}}.batch-table .status__content{padding-top:0}.batch-table .status__content summary{display:list-item}.batch-table .status__content strong{font-weight:700}.batch-table .nothing-here{border:1px solid #040609;border-top:0;box-shadow:none}@media screen and (max-width: 415px){.batch-table .nothing-here{border-top:1px solid #040609}}@media screen and (max-width: 870px){.batch-table .accounts-table tbody td.optional{display:none}}.admin-wrapper{display:flex;justify-content:center;width:100%;min-height:100vh}.admin-wrapper .sidebar-wrapper{min-height:100vh;overflow:hidden;pointer-events:none;flex:1 1 auto}.admin-wrapper .sidebar-wrapper__inner{display:flex;justify-content:flex-end;background:#121a24;height:100%}.admin-wrapper .sidebar{width:240px;padding:0;pointer-events:auto}.admin-wrapper .sidebar__toggle{display:none;background:#202e3f;height:48px}.admin-wrapper .sidebar__toggle__logo{flex:1 1 auto}.admin-wrapper .sidebar__toggle__logo a{display:inline-block;padding:15px}.admin-wrapper .sidebar__toggle__logo svg{fill:#fff;height:20px;position:relative;bottom:-2px}.admin-wrapper .sidebar__toggle__icon{display:block;color:#9baec8;text-decoration:none;flex:0 0 auto;font-size:20px;padding:15px}.admin-wrapper .sidebar__toggle a:hover,.admin-wrapper .sidebar__toggle a:focus,.admin-wrapper .sidebar__toggle a:active{background:#26374d}.admin-wrapper .sidebar .logo{display:block;margin:40px auto;width:100px;height:100px}@media screen and (max-width: 600px){.admin-wrapper .sidebar>a:first-child{display:none}}.admin-wrapper .sidebar ul{list-style:none;border-radius:4px 0 0 4px;overflow:hidden;margin-bottom:20px}@media screen and (max-width: 600px){.admin-wrapper .sidebar ul{margin-bottom:0}}.admin-wrapper .sidebar ul a{display:block;padding:15px;color:#9baec8;text-decoration:none;transition:all 200ms linear;transition-property:color,background-color;border-radius:4px 0 0 4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.admin-wrapper .sidebar ul a i.fa{margin-right:5px}.admin-wrapper .sidebar ul a:hover{color:#fff;background-color:#0a0e13;transition:all 100ms linear;transition-property:color,background-color}.admin-wrapper .sidebar ul a.selected{background:#0f151d;border-radius:4px 0 0}.admin-wrapper .sidebar ul ul{background:#0b1016;border-radius:0 0 0 4px;margin:0}.admin-wrapper .sidebar ul ul a{border:0;padding:15px 35px}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a{color:#fff;background-color:#00007f;border-bottom:0;border-radius:0}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a:hover{background-color:#009}.admin-wrapper .sidebar>ul>.simple-navigation-active-leaf a{border-radius:4px 0 0 4px}.admin-wrapper .content-wrapper{box-sizing:border-box;width:100%;max-width:840px;flex:1 1 auto}@media screen and (max-width: 1080px){.admin-wrapper .sidebar-wrapper--empty{display:none}.admin-wrapper .sidebar-wrapper{width:240px;flex:0 0 auto}}@media screen and (max-width: 600px){.admin-wrapper .sidebar-wrapper{width:100%}}.admin-wrapper .content{padding:20px 15px;padding-top:60px;padding-left:25px}@media screen and (max-width: 600px){.admin-wrapper .content{max-width:none;padding:15px;padding-top:30px}}.admin-wrapper .content-heading{display:flex;padding-bottom:40px;border-bottom:1px solid #202e3f;margin:-15px -15px 40px 0;flex-wrap:wrap;align-items:center;justify-content:space-between}.admin-wrapper .content-heading>*{margin-top:15px;margin-right:15px}.admin-wrapper .content-heading-actions{display:inline-flex}.admin-wrapper .content-heading-actions>:not(:first-child){margin-left:5px}@media screen and (max-width: 600px){.admin-wrapper .content-heading{border-bottom:0;padding-bottom:0}}.admin-wrapper .content h2{color:#d9e1e8;font-size:24px;line-height:28px;font-weight:400}@media screen and (max-width: 600px){.admin-wrapper .content h2{font-weight:700}}.admin-wrapper .content h3{color:#d9e1e8;font-size:20px;line-height:28px;font-weight:400;margin-bottom:30px}.admin-wrapper .content h4{text-transform:uppercase;font-size:13px;font-weight:700;color:#9baec8;padding-bottom:8px;margin-bottom:8px;border-bottom:1px solid #202e3f}.admin-wrapper .content h6{font-size:16px;color:#d9e1e8;line-height:28px;font-weight:500}.admin-wrapper .content .fields-group h6{color:#fff;font-weight:500}.admin-wrapper .content .directory__tag>a,.admin-wrapper .content .directory__tag>div{box-shadow:none}.admin-wrapper .content .directory__tag .table-action-link .fa{color:inherit}.admin-wrapper .content .directory__tag h4{font-size:18px;font-weight:700;color:#fff;text-transform:none;padding-bottom:0;margin-bottom:0;border-bottom:0}.admin-wrapper .content>p{font-size:14px;line-height:21px;color:#d9e1e8;margin-bottom:20px}.admin-wrapper .content>p strong{color:#fff;font-weight:500}.admin-wrapper .content>p strong:lang(ja){font-weight:700}.admin-wrapper .content>p strong:lang(ko){font-weight:700}.admin-wrapper .content>p strong:lang(zh-CN){font-weight:700}.admin-wrapper .content>p strong:lang(zh-HK){font-weight:700}.admin-wrapper .content>p strong:lang(zh-TW){font-weight:700}.admin-wrapper .content hr{width:100%;height:0;border:0;border-bottom:1px solid rgba(64,64,64,.6);margin:20px 0}.admin-wrapper .content hr.spacer{height:1px;border:0}@media screen and (max-width: 600px){.admin-wrapper{display:block}.admin-wrapper .sidebar-wrapper{min-height:0}.admin-wrapper .sidebar{width:100%;padding:0;height:auto}.admin-wrapper .sidebar__toggle{display:flex}.admin-wrapper .sidebar>ul{display:none}.admin-wrapper .sidebar ul a,.admin-wrapper .sidebar ul ul a{border-radius:0;border-bottom:1px solid #192432;transition:none}.admin-wrapper .sidebar ul a:hover,.admin-wrapper .sidebar ul ul a:hover{transition:none}.admin-wrapper .sidebar ul ul{border-radius:0}.admin-wrapper .sidebar ul .simple-navigation-active-leaf a{border-bottom-color:#00007f}}hr.spacer{width:100%;border:0;margin:20px 0;height:1px}body .muted-hint,.admin-wrapper .content .muted-hint{color:#9baec8}body .muted-hint a,.admin-wrapper .content .muted-hint a{color:#00007f}body .positive-hint,.admin-wrapper .content .positive-hint{color:#79bd9a;font-weight:500}body .negative-hint,.admin-wrapper .content .negative-hint{color:#df405a;font-weight:500}body .neutral-hint,.admin-wrapper .content .neutral-hint{color:#404040;font-weight:500}body .warning-hint,.admin-wrapper .content .warning-hint{color:#ca8f04;font-weight:500}.filters{display:flex;flex-wrap:wrap}.filters .filter-subset{flex:0 0 auto;margin:0 40px 20px 0}.filters .filter-subset:last-child{margin-bottom:30px}.filters .filter-subset ul{margin-top:5px;list-style:none}.filters .filter-subset ul li{display:inline-block;margin-right:5px}.filters .filter-subset strong{font-weight:500;text-transform:uppercase;font-size:12px}.filters .filter-subset strong:lang(ja){font-weight:700}.filters .filter-subset strong:lang(ko){font-weight:700}.filters .filter-subset strong:lang(zh-CN){font-weight:700}.filters .filter-subset strong:lang(zh-HK){font-weight:700}.filters .filter-subset strong:lang(zh-TW){font-weight:700}.filters .filter-subset--with-select strong{display:block;margin-bottom:10px}.filters .filter-subset a{display:inline-block;color:#9baec8;text-decoration:none;text-transform:uppercase;font-size:12px;font-weight:500;border-bottom:2px solid #121a24}.filters .filter-subset a:hover{color:#fff;border-bottom:2px solid #1b2635}.filters .filter-subset a.selected{color:#00007f;border-bottom:2px solid #00007f}.flavour-screen{display:block;margin:10px auto;max-width:100%}.flavour-description{display:block;font-size:16px;margin:10px 0}.flavour-description>p{margin:10px 0}.flavour-screen{display:block;margin:10px auto;max-width:100%}.flavour-description{display:block;font-size:16px;margin:10px 0}.flavour-description>p{margin:10px 0}.report-accounts{display:flex;flex-wrap:wrap;margin-bottom:20px}.report-accounts__item{display:flex;flex:250px;flex-direction:column;margin:0 5px}.report-accounts__item>strong{display:block;margin:0 0 10px -5px;font-weight:500;font-size:14px;line-height:18px;color:#d9e1e8}.report-accounts__item>strong:lang(ja){font-weight:700}.report-accounts__item>strong:lang(ko){font-weight:700}.report-accounts__item>strong:lang(zh-CN){font-weight:700}.report-accounts__item>strong:lang(zh-HK){font-weight:700}.report-accounts__item>strong:lang(zh-TW){font-weight:700}.report-accounts__item .account-card{flex:1 1 auto}.report-status,.account-status{display:flex;margin-bottom:10px}.report-status .activity-stream,.account-status .activity-stream{flex:2 0 0;margin-right:20px;max-width:calc(100% - 60px)}.report-status .activity-stream .entry,.account-status .activity-stream .entry{border-radius:4px}.report-status__actions,.account-status__actions{flex:0 0 auto;display:flex;flex-direction:column}.report-status__actions .icon-button,.account-status__actions .icon-button{font-size:24px;width:24px;text-align:center;margin-bottom:10px}.simple_form.new_report_note,.simple_form.new_account_moderation_note{max-width:100%}.batch-form-box{display:flex;flex-wrap:wrap;margin-bottom:5px}.batch-form-box #form_status_batch_action{margin:0 5px 5px 0;font-size:14px}.batch-form-box input.button{margin:0 5px 5px 0}.batch-form-box .media-spoiler-toggle-buttons{margin-left:auto}.batch-form-box .media-spoiler-toggle-buttons .button{overflow:visible;margin:0 0 5px 5px;float:right}.back-link{margin-bottom:10px;font-size:14px}.back-link a{color:#00007f;text-decoration:none}.back-link a:hover{text-decoration:underline}.spacer{flex:1 1 auto}.log-entry{line-height:20px;padding:15px 0;background:#121a24;border-bottom:1px solid #192432}.log-entry:last-child{border-bottom:0}.log-entry__header{display:flex;justify-content:flex-start;align-items:center;color:#9baec8;font-size:14px;padding:0 10px}.log-entry__avatar{margin-right:10px}.log-entry__avatar .avatar{display:block;margin:0;border-radius:50%;width:40px;height:40px}.log-entry__content{max-width:calc(100% - 90px)}.log-entry__title{word-wrap:break-word}.log-entry__timestamp{color:#404040}.log-entry a,.log-entry .username,.log-entry .target{color:#d9e1e8;text-decoration:none;font-weight:500}a.name-tag,.name-tag,a.inline-name-tag,.inline-name-tag{text-decoration:none;color:#d9e1e8}a.name-tag .username,.name-tag .username,a.inline-name-tag .username,.inline-name-tag .username{font-weight:500}a.name-tag.suspended .username,.name-tag.suspended .username,a.inline-name-tag.suspended .username,.inline-name-tag.suspended .username{text-decoration:line-through;color:#e87487}a.name-tag.suspended .avatar,.name-tag.suspended .avatar,a.inline-name-tag.suspended .avatar,.inline-name-tag.suspended .avatar{filter:grayscale(100%);opacity:.8}a.name-tag,.name-tag{display:flex;align-items:center}a.name-tag .avatar,.name-tag .avatar{display:block;margin:0;margin-right:5px;border-radius:50%}a.name-tag.suspended .avatar,.name-tag.suspended .avatar{filter:grayscale(100%);opacity:.8}.speech-bubble{margin-bottom:20px;border-left:4px solid #00007f}.speech-bubble.positive{border-left-color:#79bd9a}.speech-bubble.negative{border-left-color:#e87487}.speech-bubble.warning{border-left-color:#ca8f04}.speech-bubble__bubble{padding:16px;padding-left:14px;font-size:15px;line-height:20px;border-radius:4px 4px 4px 0;position:relative;font-weight:500}.speech-bubble__bubble a{color:#9baec8}.speech-bubble__owner{padding:8px;padding-left:12px}.speech-bubble time{color:#404040}.report-card{background:#121a24;border-radius:4px;margin-bottom:20px}.report-card__profile{display:flex;justify-content:space-between;align-items:center;padding:15px}.report-card__profile .account{padding:0;border:0}.report-card__profile .account__avatar-wrapper{margin-left:0}.report-card__profile__stats{flex:0 0 auto;font-weight:500;color:#9baec8;text-transform:uppercase;text-align:right}.report-card__profile__stats a{color:inherit;text-decoration:none}.report-card__profile__stats a:focus,.report-card__profile__stats a:hover,.report-card__profile__stats a:active{color:#b5c3d6}.report-card__profile__stats .red{color:#df405a}.report-card__summary__item{display:flex;justify-content:flex-start;border-top:1px solid #0b1016}.report-card__summary__item:hover{background:#151f2b}.report-card__summary__item__reported-by,.report-card__summary__item__assigned{padding:15px;flex:0 0 auto;box-sizing:border-box;width:150px;color:#9baec8}.report-card__summary__item__reported-by,.report-card__summary__item__reported-by .username,.report-card__summary__item__assigned,.report-card__summary__item__assigned .username{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.report-card__summary__item__content{flex:1 1 auto;max-width:calc(100% - 300px)}.report-card__summary__item__content__icon{color:#404040;margin-right:4px;font-weight:500}.report-card__summary__item__content a{display:block;box-sizing:border-box;width:100%;padding:15px;text-decoration:none;color:#9baec8}.one-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ellipsized-ip{display:inline-block;max-width:120px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.admin-account-bio{display:flex;flex-wrap:wrap;margin:0 -5px;margin-top:20px}.admin-account-bio>div{box-sizing:border-box;padding:0 5px;margin-bottom:10px;flex:1 0 50%}.admin-account-bio .account__header__fields,.admin-account-bio .account__header__content{background:#202e3f;border-radius:4px;height:100%}.admin-account-bio .account__header__fields{margin:0;border:0}.admin-account-bio .account__header__fields a{color:#0000a8}.admin-account-bio .account__header__fields dl:first-child .verified{border-radius:0 4px 0 0}.admin-account-bio .account__header__fields .verified a{color:#79bd9a}.admin-account-bio .account__header__content{box-sizing:border-box;padding:20px;color:#fff}.center-text{text-align:center}.announcements-list{border:1px solid #192432;border-radius:4px}.announcements-list__item{padding:15px 0;background:#121a24;border-bottom:1px solid #192432}.announcements-list__item__title{padding:0 15px;display:block;font-weight:500;font-size:18px;line-height:1.5;color:#d9e1e8;text-decoration:none;margin-bottom:10px}.announcements-list__item__title:hover,.announcements-list__item__title:focus,.announcements-list__item__title:active{color:#fff}.announcements-list__item__meta{padding:0 15px;color:#404040}.announcements-list__item__action-bar{display:flex;justify-content:space-between;align-items:center}.announcements-list__item:last-child{border-bottom:0}.dashboard__counters{display:flex;flex-wrap:wrap;margin:0 -5px;margin-bottom:20px}.dashboard__counters>div{box-sizing:border-box;flex:0 0 33.333%;padding:0 5px;margin-bottom:10px}.dashboard__counters>div>div,.dashboard__counters>div>a{padding:20px;background:#192432;border-radius:4px;box-sizing:border-box;height:100%}.dashboard__counters>div>a{text-decoration:none;color:inherit;display:block}.dashboard__counters>div>a:hover,.dashboard__counters>div>a:focus,.dashboard__counters>div>a:active{background:#202e3f}.dashboard__counters__num,.dashboard__counters__text{text-align:center;font-weight:500;font-size:24px;line-height:21px;color:#fff;font-family:\"mastodon-font-display\",sans-serif;margin-bottom:20px;line-height:30px}.dashboard__counters__text{font-size:18px}.dashboard__counters__label{font-size:14px;color:#9baec8;text-align:center;font-weight:500}.dashboard__widgets{display:flex;flex-wrap:wrap;margin:0 -5px}.dashboard__widgets>div{flex:0 0 33.333%;margin-bottom:20px}.dashboard__widgets>div>div{padding:0 5px}.dashboard__widgets a:not(.name-tag){color:#d9e1e8;font-weight:500;text-decoration:none}body.rtl{direction:rtl}body.rtl .column-header>button{text-align:right;padding-left:0;padding-right:15px}body.rtl .radio-button__input{margin-right:0;margin-left:10px}body.rtl .directory__card__bar .display-name{margin-left:0;margin-right:15px}body.rtl .display-name{text-align:right}body.rtl .notification__message{margin-left:0;margin-right:68px}body.rtl .drawer__inner__mastodon>img{transform:scaleX(-1)}body.rtl .notification__favourite-icon-wrapper{left:auto;right:-26px}body.rtl .landing-page__logo{margin-right:0;margin-left:20px}body.rtl .landing-page .features-list .features-list__row .visual{margin-left:0;margin-right:15px}body.rtl .column-link__icon,body.rtl .column-header__icon{margin-right:0;margin-left:5px}body.rtl .compose-form .compose-form__buttons-wrapper .character-counter__wrapper{margin-right:0;margin-left:4px}body.rtl .navigation-bar__profile{margin-left:0;margin-right:8px}body.rtl .search__input{padding-right:10px;padding-left:30px}body.rtl .search__icon .fa{right:auto;left:10px}body.rtl .columns-area{direction:rtl}body.rtl .column-header__buttons{left:0;right:auto;margin-left:0;margin-right:-15px}body.rtl .column-inline-form .icon-button{margin-left:0;margin-right:5px}body.rtl .column-header__links .text-btn{margin-left:10px;margin-right:0}body.rtl .account__avatar-wrapper{float:right}body.rtl .column-header__back-button{padding-left:5px;padding-right:0}body.rtl .column-header__setting-arrows{float:left}body.rtl .setting-toggle__label{margin-left:0;margin-right:8px}body.rtl .status__avatar{left:auto;right:10px}body.rtl .status,body.rtl .activity-stream .status.light{padding-left:10px;padding-right:68px}body.rtl .status__info .status__display-name,body.rtl .activity-stream .status.light .status__display-name{padding-left:25px;padding-right:0}body.rtl .activity-stream .pre-header{padding-right:68px;padding-left:0}body.rtl .status__prepend{margin-left:0;margin-right:68px}body.rtl .status__prepend-icon-wrapper{left:auto;right:-26px}body.rtl .activity-stream .pre-header .pre-header__icon{left:auto;right:42px}body.rtl .account__avatar-overlay-overlay{right:auto;left:0}body.rtl .column-back-button--slim-button{right:auto;left:0}body.rtl .status__relative-time,body.rtl .activity-stream .status.light .status__header .status__meta{float:left}body.rtl .status__action-bar__counter{margin-right:0;margin-left:11px}body.rtl .status__action-bar__counter .status__action-bar-button{margin-right:0;margin-left:4px}body.rtl .status__action-bar-button{float:right;margin-right:0;margin-left:18px}body.rtl .status__action-bar-dropdown{float:right}body.rtl .privacy-dropdown__dropdown{margin-left:0;margin-right:40px}body.rtl .privacy-dropdown__option__icon{margin-left:10px;margin-right:0}body.rtl .detailed-status__display-name .display-name{text-align:right}body.rtl .detailed-status__display-avatar{margin-right:0;margin-left:10px;float:right}body.rtl .detailed-status__favorites,body.rtl .detailed-status__reblogs{margin-left:0;margin-right:6px}body.rtl .fa-ul{margin-left:2.14285714em}body.rtl .fa-li{left:auto;right:-2.14285714em}body.rtl .admin-wrapper{direction:rtl}body.rtl .admin-wrapper .sidebar ul a i.fa,body.rtl a.table-action-link i.fa{margin-right:0;margin-left:5px}body.rtl .simple_form .check_boxes .checkbox label{padding-left:0;padding-right:25px}body.rtl .simple_form .input.with_label.boolean label.checkbox{padding-left:25px;padding-right:0}body.rtl .simple_form .check_boxes .checkbox input[type=checkbox],body.rtl .simple_form .input.boolean input[type=checkbox]{left:auto;right:0}body.rtl .simple_form .input.radio_buttons .radio{left:auto;right:0}body.rtl .simple_form .input.radio_buttons .radio>label{padding-right:28px;padding-left:0}body.rtl .simple_form .input-with-append .input input{padding-left:142px;padding-right:0}body.rtl .simple_form .input.boolean label.checkbox{left:auto;right:0}body.rtl .simple_form .input.boolean .label_input,body.rtl .simple_form .input.boolean .hint{padding-left:0;padding-right:28px}body.rtl .simple_form .label_input__append{right:auto;left:3px}body.rtl .simple_form .label_input__append::after{right:auto;left:0;background-image:linear-gradient(to left, rgba(1, 1, 2, 0), #010102)}body.rtl .simple_form select{background:#010102 url(\"data:image/svg+xml;utf8,\") no-repeat left 8px center/auto 16px}body.rtl .table th,body.rtl .table td{text-align:right}body.rtl .filters .filter-subset{margin-right:0;margin-left:45px}body.rtl .landing-page .header-wrapper .mascot{right:60px;left:auto}body.rtl .landing-page__call-to-action .row__information-board{direction:rtl}body.rtl .landing-page .header .hero .floats .float-1{left:-120px;right:auto}body.rtl .landing-page .header .hero .floats .float-2{left:210px;right:auto}body.rtl .landing-page .header .hero .floats .float-3{left:110px;right:auto}body.rtl .landing-page .header .links .brand img{left:0}body.rtl .landing-page .fa-external-link{padding-right:5px;padding-left:0 !important}body.rtl .landing-page .features #mastodon-timeline{margin-right:0;margin-left:30px}@media screen and (min-width: 631px){body.rtl .column,body.rtl .drawer{padding-left:5px;padding-right:5px}body.rtl .column:first-child,body.rtl .drawer:first-child{padding-left:5px;padding-right:10px}body.rtl .columns-area>div .column,body.rtl .columns-area>div .drawer{padding-left:5px;padding-right:5px}}body.rtl .columns-area--mobile .column,body.rtl .columns-area--mobile .drawer{padding-left:0;padding-right:0}body.rtl .public-layout .header .nav-button{margin-left:8px;margin-right:0}body.rtl .public-layout .public-account-header__tabs{margin-left:0;margin-right:20px}body.rtl .landing-page__information .account__display-name{margin-right:0;margin-left:5px}body.rtl .landing-page__information .account__avatar-wrapper{margin-left:12px;margin-right:0}body.rtl .card__bar .display-name{margin-left:0;margin-right:15px;text-align:right}body.rtl .fa-chevron-left::before{content:\"\"}body.rtl .fa-chevron-right::before{content:\"\"}body.rtl .column-back-button__icon{margin-right:0;margin-left:5px}body.rtl .column-header__setting-arrows .column-header__setting-btn:last-child{padding-left:0;padding-right:10px}body.rtl .simple_form .input.radio_buttons .radio>label input{left:auto;right:0}.emojione[title=\":wavy_dash:\"],.emojione[title=\":waving_black_flag:\"],.emojione[title=\":water_buffalo:\"],.emojione[title=\":video_game:\"],.emojione[title=\":video_camera:\"],.emojione[title=\":vhs:\"],.emojione[title=\":turkey:\"],.emojione[title=\":tophat:\"],.emojione[title=\":top:\"],.emojione[title=\":tm:\"],.emojione[title=\":telephone_receiver:\"],.emojione[title=\":spider:\"],.emojione[title=\":speaking_head_in_silhouette:\"],.emojione[title=\":spades:\"],.emojione[title=\":soon:\"],.emojione[title=\":registered:\"],.emojione[title=\":on:\"],.emojione[title=\":musical_score:\"],.emojione[title=\":movie_camera:\"],.emojione[title=\":mortar_board:\"],.emojione[title=\":microphone:\"],.emojione[title=\":male-guard:\"],.emojione[title=\":lower_left_fountain_pen:\"],.emojione[title=\":lower_left_ballpoint_pen:\"],.emojione[title=\":kaaba:\"],.emojione[title=\":joystick:\"],.emojione[title=\":hole:\"],.emojione[title=\":hocho:\"],.emojione[title=\":heavy_plus_sign:\"],.emojione[title=\":heavy_multiplication_x:\"],.emojione[title=\":heavy_minus_sign:\"],.emojione[title=\":heavy_dollar_sign:\"],.emojione[title=\":heavy_division_sign:\"],.emojione[title=\":heavy_check_mark:\"],.emojione[title=\":guardsman:\"],.emojione[title=\":gorilla:\"],.emojione[title=\":fried_egg:\"],.emojione[title=\":film_projector:\"],.emojione[title=\":female-guard:\"],.emojione[title=\":end:\"],.emojione[title=\":electric_plug:\"],.emojione[title=\":eight_pointed_black_star:\"],.emojione[title=\":dark_sunglasses:\"],.emojione[title=\":currency_exchange:\"],.emojione[title=\":curly_loop:\"],.emojione[title=\":copyright:\"],.emojione[title=\":clubs:\"],.emojione[title=\":camera_with_flash:\"],.emojione[title=\":camera:\"],.emojione[title=\":busts_in_silhouette:\"],.emojione[title=\":bust_in_silhouette:\"],.emojione[title=\":bowling:\"],.emojione[title=\":bomb:\"],.emojione[title=\":black_small_square:\"],.emojione[title=\":black_nib:\"],.emojione[title=\":black_medium_square:\"],.emojione[title=\":black_medium_small_square:\"],.emojione[title=\":black_large_square:\"],.emojione[title=\":black_heart:\"],.emojione[title=\":black_circle:\"],.emojione[title=\":back:\"],.emojione[title=\":ant:\"],.emojione[title=\":8ball:\"]{filter:drop-shadow(1px 1px 0 #ffffff) drop-shadow(-1px 1px 0 #ffffff) drop-shadow(1px -1px 0 #ffffff) drop-shadow(-1px -1px 0 #ffffff);transform:scale(0.71)}@media screen and (min-width: 1300px){.column{flex-grow:1 !important;max-width:400px}.drawer{width:17%;max-width:400px;min-width:330px}}.media-gallery,.video-player{max-height:30vh;height:30vh !important;position:relative;margin-top:20px;margin-left:-68px;width:calc(100% + 80px) !important;max-width:calc(100% + 80px)}.detailed-status .media-gallery,.detailed-status .video-player{margin-left:-5px;width:calc(100% + 9px);max-width:calc(100% + 9px)}.video-player video{transform:unset;top:unset}.detailed-status .media-spoiler,.status .media-spoiler{height:100% !important;vertical-align:middle}body{font-size:13px;font-family:\"MS Sans Serif\",\"premillenium\",sans-serif;color:#000}.ui,.ui .columns-area,body.admin{background:teal}.loading-bar{height:5px;background-color:navy}.tabs-bar{background:#bfbfbf;box-shadow:inset -1px -1px 0px #000,inset 1px 1px 0px #fff,inset -2px -2px 0px gray,inset 2px 2px 0px #dfdfdf;border-radius:0px;height:30px}.tabs-bar__link{color:#000;border:2px outset #bfbfbf;border-top-width:1px;border-left-width:1px;margin:2px;padding:3px}.tabs-bar__link.active{box-shadow:inset 1px 1px 0px #000,inset -1px -1px 0px #fff,inset 2px 2px 0px gray,inset -2px -2px 0px #dfdfdf;border-width:0px;border-radius:0px;color:#000}.tabs-bar__link:last-child::before{content:\"Start\";color:#000;font-weight:bold;font-size:15px;width:80%;display:block;position:absolute;right:0px}.tabs-bar__link:last-child{position:relative;flex-basis:60px !important;font-size:0px;color:#bfbfbf;background-image:url(\"~images/start.png\");background-repeat:no-repeat;background-position:8%;background-clip:padding-box;background-size:auto 50%}.drawer .drawer__inner{overflow:visible;height:inherit;background:#bfbfbf}.drawer:after{display:block;content:\" \";position:absolute;bottom:15px;left:15px;width:132px;height:117px;background-image:url(\"~images/clippy_wave.gif\"),url(\"~images/clippy_frame.png\");background-repeat:no-repeat;background-position:4px 20px,0px 0px;z-index:0}.drawer__pager{overflow-y:auto;z-index:1}.privacy-dropdown__dropdown{z-index:2}.column{max-height:100vh}.column>.scrollable{background:#bfbfbf;border-left:2px solid #efefef;border-top:2px solid #efefef;border-right:2px solid #404040;border-bottom:2px solid #404040;border-radius:0px;border-top-width:0px}.column-header__wrapper{color:#fff;font-weight:bold;background:#7f7f7f}.column-header{padding:2px;font-size:13px;background:#7f7f7f;border-left:2px solid #efefef;border-top:2px solid #efefef;border-right:2px solid #404040;border-bottom:2px solid #404040;border-radius:0px;border-bottom-width:0px;color:#fff;font-weight:bold;align-items:baseline}.column-header__wrapper.active{background:#00007f}.column-header__wrapper.active::before{display:none}.column-header.active{box-shadow:unset;background:#00007f}.column-header.active .column-header__icon{color:#fff}.column-header__buttons{max-height:20px;margin-right:0px}.column-header__button{background:#bfbfbf;color:#000;line-height:0px;font-size:14px;max-height:20px;padding:0px 2px;margin-top:2px;box-shadow:inset -1px -1px 0px #000,inset 1px 1px 0px #fff,inset -2px -2px 0px gray,inset 2px 2px 0px #dfdfdf;border-radius:0px}.column-header__button:hover{color:#000}.column-header__button.active,.column-header__button.active:hover{box-shadow:inset 1px 1px 0px #000,inset -1px -1px 0px #fff,inset 2px 2px 0px gray,inset -2px -2px 0px #dfdfdf;border-width:0px;border-radius:0px;background-color:#7f7f7f}.column-header__back-button{background:#bfbfbf;color:#000;padding:2px;max-height:20px;margin-top:2px;box-shadow:inset -1px -1px 0px #000,inset 1px 1px 0px #fff,inset -2px -2px 0px gray,inset 2px 2px 0px #dfdfdf;border-radius:0px;font-size:13px;font-weight:bold}.column-back-button{background:#bfbfbf;color:#000;box-shadow:inset -1px -1px 0px #000,inset 1px 1px 0px #fff,inset -2px -2px 0px gray,inset 2px 2px 0px #dfdfdf;border-radius:0px;padding:2px;font-size:13px;font-weight:bold}.column-back-button--slim-button{position:absolute;top:-22px;right:4px;max-height:20px;max-width:60px;padding:0px 2px}.column-back-button__icon{font-size:11px;margin-top:-3px}.column-header__collapsible{border-left:2px outset #bfbfbf;border-right:2px outset #bfbfbf}.column-header__collapsible-inner{background:#bfbfbf;color:#000}.column-header__collapsible__extra{color:#000}.column-header__collapsible__extra div[role=group]{border:2px groove #bfbfbf;border-radius:4px;margin-bottom:8px;padding:4px}.column-inline-form{background-color:#bfbfbf;border-left:2px solid #efefef;border-top:2px solid #efefef;border-right:2px solid #404040;border-bottom:2px solid #404040;border-radius:0px;border-bottom-width:0px;border-top-width:0px}.column-settings__section{color:#000;font-weight:bold;font-size:11px;position:relative;top:-12px;left:4px;background-color:#bfbfbf;display:inline-block;padding:0px 4px;margin-bottom:0px}.setting-meta__label,.setting-toggle__label{color:#000;font-weight:normal}.setting-meta__label span:before{content:\"(\"}.setting-meta__label span:after{content:\")\"}.setting-toggle{line-height:13px}.react-toggle .react-toggle-track{border-radius:0px;background-color:#fff;border-left:2px solid #404040;border-top:2px solid #404040;border-right:2px solid #efefef;border-bottom:2px solid #efefef;border-radius:0px;width:12px;height:12px}.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track{background-color:#fff}.react-toggle .react-toggle-track-check{left:2px;transition:unset}.react-toggle .react-toggle-track-check svg path{fill:#000}.react-toggle .react-toggle-track-x{display:none}.react-toggle .react-toggle-thumb{border-radius:0px;display:none}.text-btn{background-color:#bfbfbf;box-shadow:inset -1px -1px 0px #000,inset 1px 1px 0px #fff,inset -2px -2px 0px gray,inset 2px 2px 0px #dfdfdf;border-radius:0px;padding:4px}.text-btn:hover{text-decoration:none;color:#000}.text-btn:active{box-shadow:inset 1px 1px 0px #000,inset -1px -1px 0px #fff,inset 2px 2px 0px gray,inset -2px -2px 0px #dfdfdf;border-width:0px;border-radius:0px}.setting-text{color:#000;background-color:#fff;box-shadow:inset 1px 1px 0px #000,inset -1px -1px 0px #fff,inset 2px 2px 0px gray,inset -2px -2px 0px #dfdfdf;border-width:0px;border-radius:0px;font-size:13px;padding:2px}.setting-text:active,.setting-text:focus,.setting-text.light:active,.setting-text.light:focus{color:#000;border-bottom:2px inset #bfbfbf}.column-header__setting-arrows .column-header__setting-btn{padding:3px 10px}.column-header__setting-arrows .column-header__setting-btn:last-child{padding:3px 10px}.missing-indicator{background-color:#bfbfbf;color:#000;box-shadow:inset -1px -1px 0px #000,inset 1px 1px 0px #fff,inset -2px -2px 0px gray,inset 2px 2px 0px #dfdfdf;border-radius:0px}.missing-indicator>div{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRUaXRsZQAACJnLyy9Jyy/NSwEAD5IDblIFOhoAAAAXelRYdEF1dGhvcgAACJlLzijKz0vMAQALmgLoDsFj8gAAAQpJREFUOMuVlD0OwjAMhd2oQl04Axfo0IGBgYELcAY6cqQuSO0ZOEAZGBg6VKg74gwsEaoESRVHjusI8aQqzY8/PbtOEz1qkFSn2YevlaNOpLMJh2DwvixhuXtOa6/LCh51DUMEFkAsgAZD207Doin8mQ562JpRE5CHBAAhmIqD1L8AqzUUUJkxc6kr3AgAJ+NuvIWRdk7WcrKl0AUqcIBBHOiEbpS4m27mIL5Onfg3k0rgggeQuS2sDOGSahKR+glgqaGLgUJs951NN1q9D72cQqQWR9cr3sm9YcEssEuz6eEuZh2bu0aSOhQ1MBezu2O/+TVSvEFII3qLsZWrSA2AAUQIh1HpyP/kC++zjVSMj6ntAAAAAElFTkSuQmCC\") no-repeat;background-position:center center}.empty-column-indicator,.error-column{background:#bfbfbf;color:#000}.status__wrapper{border:2px groove #bfbfbf;margin:4px}.status{border-left:1px solid #404040;border-top:1px solid #404040;border-right:1px solid #efefef;border-bottom:1px solid #efefef;border-radius:0px;background-color:#fff;margin:4px;padding-bottom:40px;margin-bottom:8px}.status.status-direct{background-color:#bfbfbf}.status__content{font-size:13px}.status.light .status__relative-time,.status.light .display-name span{color:#7f7f7f}.status__action-bar{box-sizing:border-box;position:absolute;bottom:-1px;left:-1px;background:#bfbfbf;width:calc(100% + 2px);padding-left:10px;padding:4px 2px;padding-bottom:4px;border-bottom:2px groove #bfbfbf;border-top:1px outset #bfbfbf;text-align:right}.status__wrapper .status__action-bar{border-bottom-width:0px}.status__action-bar-button{float:right}.status__action-bar-dropdown{margin-left:auto;margin-right:10px}.status__action-bar-dropdown .icon-button{min-width:28px}.status.light .status__content a{color:blue}.focusable:focus{background:#bfbfbf}.focusable:focus .detailed-status__action-bar{background:#bfbfbf}.focusable:focus .status,.focusable:focus .detailed-status{background:#fff;outline:2px dotted gray}.dropdown__trigger.icon-button{padding-right:6px}.detailed-status__action-bar-dropdown .icon-button{min-width:28px}.detailed-status{background:#fff;background-clip:padding-box;margin:4px;border:2px groove #bfbfbf;padding:4px}.detailed-status__display-name{color:#7f7f7f}.detailed-status__display-name strong{color:#000;font-weight:bold}.account__avatar,.account__avatar-overlay-base,.account__header__avatar,.account__avatar-overlay-overlay{border-left:1px solid #404040;border-top:1px solid #404040;border-right:1px solid #efefef;border-bottom:1px solid #efefef;border-radius:0px;clip-path:none;filter:saturate(1.8) brightness(1.1)}.detailed-status__action-bar{background-color:#bfbfbf;border:0px;border-bottom:2px groove #bfbfbf;margin-bottom:8px;justify-items:left;padding-left:4px}.icon-button{background:#bfbfbf;border-left:2px solid #efefef;border-top:2px solid #efefef;border-right:2px solid #404040;border-bottom:2px solid #404040;border-radius:0px;padding:0px 0px 0px 0px;margin-right:4px;color:#3f3f3f}.icon-button.inverted,.icon-button:hover,.icon-button.inverted:hover,.icon-button:active,.icon-button:focus{color:#3f3f3f}.icon-button:active{border-left:2px solid #404040;border-top:2px solid #404040;border-right:2px solid #efefef;border-bottom:2px solid #efefef;border-radius:0px}.status__action-bar>.icon-button{padding:0px 15px 0px 0px;min-width:25px}.icon-button.star-icon,.icon-button.star-icon:active{background:transparent;border:none}.icon-button.star-icon.active{color:#ca8f04}.icon-button.star-icon.active:active,.icon-button.star-icon.active:hover,.icon-button.star-icon.active:focus{color:#ca8f04}.icon-button.star-icon>i{background:#bfbfbf;border-left:2px solid #efefef;border-top:2px solid #efefef;border-right:2px solid #404040;border-bottom:2px solid #404040;border-radius:0px;padding-bottom:3px}.icon-button.star-icon:active>i{border-left:2px solid #404040;border-top:2px solid #404040;border-right:2px solid #efefef;border-bottom:2px solid #efefef;border-radius:0px}.text-icon-button{color:#404040}.detailed-status__action-bar-dropdown{margin-left:auto;justify-content:right;padding-right:16px}.detailed-status__button{flex:0 0 auto}.detailed-status__button .icon-button{padding-left:2px;padding-right:25px}.status-card{border-radius:0px;background:#fff;border:1px solid #000;color:#000}.status-card:hover{background-color:#fff}.status-card__title{color:blue;text-decoration:underline;font-weight:bold}.load-more{width:auto;margin:5px auto;background:#bfbfbf;box-shadow:inset -1px -1px 0px #000,inset 1px 1px 0px #fff,inset -2px -2px 0px gray,inset 2px 2px 0px #dfdfdf;border-radius:0px;color:#000;padding:2px 5px}.load-more:hover{background:#bfbfbf;color:#000}.status-card__description{color:#000}.account__display-name strong,.status__display-name strong{color:#000;font-weight:bold}.account .account__display-name{color:#000}.account{border-bottom:2px groove #bfbfbf}.reply-indicator__content .status__content__spoiler-link,.status__content .status__content__spoiler-link{background:#bfbfbf;box-shadow:inset -1px -1px 0px #000,inset 1px 1px 0px #fff,inset -2px -2px 0px gray,inset 2px 2px 0px #dfdfdf;border-radius:0px}.reply-indicator__content .status__content__spoiler-link:hover,.status__content .status__content__spoiler-link:hover{background:#bfbfbf}.reply-indicator__content .status__content__spoiler-link:active,.status__content .status__content__spoiler-link:active{box-shadow:inset 1px 1px 0px #000,inset -1px -1px 0px #fff,inset 2px 2px 0px gray,inset -2px -2px 0px #dfdfdf;border-width:0px;border-radius:0px}.reply-indicator__content a,.status__content a{color:blue}.notification{border:2px groove #bfbfbf;margin:4px}.notification__message{color:#000;font-size:13px}.notification__display-name{font-weight:bold}.drawer__header{background:#bfbfbf;border-left:2px solid #efefef;border-top:2px solid #efefef;border-right:2px solid #404040;border-bottom:2px solid #404040;border-radius:0px;justify-content:left;margin-bottom:0px;padding-bottom:2px;border-bottom:2px groove #bfbfbf}.drawer__tab{color:#000;box-shadow:inset -1px -1px 0px #000,inset 1px 1px 0px #fff,inset -2px -2px 0px gray,inset 2px 2px 0px #dfdfdf;border-radius:0px;padding:5px;margin:2px;flex:0 0 auto}.drawer__tab:first-child::before{content:\"Start\";color:#000;font-weight:bold;font-size:15px;width:80%;display:block;position:absolute;right:0px}.drawer__tab:first-child{position:relative;padding:5px 15px;width:40px;font-size:0px;color:#bfbfbf;background-image:url(\"~images/start.png\");background-repeat:no-repeat;background-position:8%;background-clip:padding-box;background-size:auto 50%}.drawer__header a:hover{background-color:transparent}.drawer__header a:first-child:hover{background-image:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAIAAACpTQvdAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRBdXRob3IAAAiZS84oys9LzAEAC5oC6A7BY/IAAACWSURBVCiRhVJJDsQgDEuqOfRZ7a1P5gbP4uaJaEjTADMWQhHYjlk4p0wLnNdptdF4KvBUDyGzVwc2xO+uKtH+1o0ytEEmqFpuxlvFCGCxKbNIT56QCi2MzaA/2Mz+mERSOeqzJG2RUxkjdTabgPtFoZ1bZxcKvgPcLZVufAyR9Ni8v5dWDzfFx0giC1RvZFv6l35QQ/Mvv39XXgGzQpoAAAAASUVORK5CYII=\");background-repeat:no-repeat;background-position:8%;background-clip:padding-box;background-size:auto 50%;transition:unset}.search{background:#bfbfbf;padding-top:2px;padding:2px;border:2px outset #bfbfbf;border-top-width:0px;border-bottom:2px groove #bfbfbf;margin-bottom:0px}.search input{background-color:#fff;color:#000;border-left:1px solid #404040;border-top:1px solid #404040;border-right:1px solid #efefef;border-bottom:1px solid #efefef;border-radius:0px}.search__input:focus{background-color:#fff}.search-popout{box-shadow:unset;color:#000;border-radius:0px;background-color:#ffc;border:1px solid #000}.search-popout h4{color:#000;text-transform:none;font-weight:bold}.search-results__header{background-color:#bfbfbf;color:#000;border-bottom:2px groove #bfbfbf}.search-results__hashtag{color:blue}.search-results__section .account:hover,.search-results__section .account:hover .account__display-name,.search-results__section .account:hover .account__display-name strong,.search-results__section .search-results__hashtag:hover{background-color:#00007f;color:#fff}.search__icon .fa{color:gray}.search__icon .fa.active{opacity:1}.search__icon .fa:hover{color:gray}.drawer__inner,.drawer__inner.darker{background-color:#bfbfbf;border:2px outset #bfbfbf;border-top-width:0px}.navigation-bar{color:#000}.navigation-bar strong{color:#000;font-weight:bold}.compose-form .autosuggest-textarea__textarea,.compose-form .spoiler-input__input{border-radius:0px;border-left:1px solid #404040;border-top:1px solid #404040;border-right:1px solid #efefef;border-bottom:1px solid #efefef;border-radius:0px}.compose-form .autosuggest-textarea__textarea{border-bottom:0px}.compose-form__uploads-wrapper{border-radius:0px;border-bottom:1px inset #bfbfbf;border-top-width:0px}.compose-form__upload-wrapper{border-left:1px inset #bfbfbf;border-right:1px inset #bfbfbf}.compose-form .compose-form__buttons-wrapper{background-color:#bfbfbf;border:2px groove #bfbfbf;margin-top:4px;padding:4px 8px}.compose-form__buttons{background-color:#bfbfbf;border-radius:0px;box-shadow:unset}.compose-form__buttons-separator{border-left:2px groove #bfbfbf}.privacy-dropdown.active .privacy-dropdown__value.active,.advanced-options-dropdown.open .advanced-options-dropdown__value{background:#bfbfbf}.privacy-dropdown.active .privacy-dropdown__value.active .icon-button{color:#404040}.privacy-dropdown.active .privacy-dropdown__value{background:#bfbfbf;box-shadow:unset}.privacy-dropdown__option.active,.privacy-dropdown__option:hover,.privacy-dropdown__option.active:hover{background:#00007f}.privacy-dropdown__dropdown,.privacy-dropdown.active .privacy-dropdown__dropdown,.advanced-options-dropdown__dropdown,.advanced-options-dropdown.open .advanced-options-dropdown__dropdown{box-shadow:unset;color:#000;box-shadow:inset -1px -1px 0px #000,inset 1px 1px 0px #fff,inset -2px -2px 0px gray,inset 2px 2px 0px #dfdfdf;border-radius:0px;background:#bfbfbf}.privacy-dropdown__option__content{color:#000}.privacy-dropdown__option__content strong{font-weight:bold}.compose-form__warning::before{content:\"Tip:\";font-weight:bold;display:block;position:absolute;top:-10px;background-color:#bfbfbf;font-size:11px;padding:0px 5px}.compose-form__warning{position:relative;box-shadow:unset;border:2px groove #bfbfbf;background-color:#bfbfbf;color:#000}.compose-form__warning a{color:blue}.compose-form__warning strong{color:#000;text-decoration:underline}.compose-form__buttons button.active:last-child{border-left:2px solid #404040;border-top:2px solid #404040;border-right:2px solid #efefef;border-bottom:2px solid #efefef;border-radius:0px;background:#dfdfdf;color:#7f7f7f}.compose-form__upload-thumbnail{border-radius:0px;border:2px groove #bfbfbf;background-color:#bfbfbf;padding:2px;box-sizing:border-box}.compose-form__upload-thumbnail .icon-button{max-width:20px;max-height:20px;line-height:10px !important}.compose-form__upload-thumbnail .icon-button::before{content:\"X\";font-size:13px;font-weight:bold;color:#000}.compose-form__upload-thumbnail .icon-button i{display:none}.emoji-picker-dropdown__menu{z-index:2}.emoji-dialog.with-search{box-shadow:unset;border-radius:0px;background-color:#bfbfbf;border:1px solid #000;box-sizing:content-box}.emoji-dialog .emoji-search{color:#000;background-color:#fff;border-radius:0px;box-shadow:inset 1px 1px 0px #000,inset -1px -1px 0px #fff,inset 2px 2px 0px gray,inset -2px -2px 0px #dfdfdf;border-width:0px;border-radius:0px}.emoji-dialog .emoji-search-wrapper{border-bottom:2px groove #bfbfbf}.emoji-dialog .emoji-category-title{color:#000;font-weight:bold}.reply-indicator{background-color:#bfbfbf;border-radius:3px;border:2px groove #bfbfbf}.button{background-color:#bfbfbf;box-shadow:inset -1px -1px 0px #000,inset 1px 1px 0px #fff,inset -2px -2px 0px gray,inset 2px 2px 0px #dfdfdf;border-radius:0px;border-radius:0px;color:#000;font-weight:bold}.button:hover,.button:focus,.button:disabled{background-color:#bfbfbf}.button:active{box-shadow:inset 1px 1px 0px #000,inset -1px -1px 0px #fff,inset 2px 2px 0px gray,inset -2px -2px 0px #dfdfdf;border-width:0px;border-radius:0px}.button:disabled{color:gray;text-shadow:1px 1px 0px #efefef}.button:disabled:active{box-shadow:inset -1px -1px 0px #000,inset 1px 1px 0px #fff,inset -2px -2px 0px gray,inset 2px 2px 0px #dfdfdf;border-radius:0px}#Getting-started{background-color:#bfbfbf;box-shadow:inset 1px 1px 0px #000,inset -1px -1px 0px #fff,inset 2px 2px 0px gray,inset -2px -2px 0px #dfdfdf;border-width:0px;border-radius:0px;border-bottom-width:0px}#Getting-started::before{content:\"Start\";color:#000;font-weight:bold;font-size:15px;width:80%;text-align:center;display:block;position:absolute;right:2px}#Getting-started{position:relative;padding:5px 15px;width:60px;font-size:0px;color:#bfbfbf;background-image:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAIAAACpTQvdAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRBdXRob3IAAAiZS84oys9LzAEAC5oC6A7BY/IAAACWSURBVCiRhVJJDsQgDEuqOfRZ7a1P5gbP4uaJaEjTADMWQhHYjlk4p0wLnNdptdF4KvBUDyGzVwc2xO+uKtH+1o0ytEEmqFpuxlvFCGCxKbNIT56QCi2MzaA/2Mz+mERSOeqzJG2RUxkjdTabgPtFoZ1bZxcKvgPcLZVufAyR9Ni8v5dWDzfFx0giC1RvZFv6l35QQ/Mvv39XXgGzQpoAAAAASUVORK5CYII=\");background-repeat:no-repeat;background-position:8%;background-clip:padding-box;background-size:auto 50%}.column-subheading{background-color:#bfbfbf;color:#000;border-bottom:2px groove #bfbfbf;text-transform:none;font-size:16px}.column-link{background-color:transparent;color:#000}.column-link:hover{background-color:#00007f;color:#fff}.getting-started__wrapper .column-subheading{font-size:0px;margin:0px;padding:0px}.getting-started__wrapper .column-link{background-size:32px 32px;background-repeat:no-repeat;background-position:36px 50%;padding-left:40px}.getting-started__wrapper .column-link:hover{background-size:32px 32px;background-repeat:no-repeat;background-position:36px 50%}.getting-started__wrapper .column-link i{font-size:0px;width:32px}.column-link[href=\"/web/timelines/public\"]{background-image:url(\"~images/icon_public.png\")}.column-link[href=\"/web/timelines/public\"]:hover{background-image:url(\"~images/icon_public.png\")}.column-link[href=\"/web/timelines/public/local\"]{background-image:url(\"~images/icon_local.png\")}.column-link[href=\"/web/timelines/public/local\"]:hover{background-image:url(\"~images/icon_local.png\")}.column-link[href=\"/web/pinned\"]{background-image:url(\"~images/icon_pin.png\")}.column-link[href=\"/web/pinned\"]:hover{background-image:url(\"~images/icon_pin.png\")}.column-link[href=\"/web/favourites\"]{background-image:url(\"~images/icon_likes.png\")}.column-link[href=\"/web/favourites\"]:hover{background-image:url(\"~images/icon_likes.png\")}.column-link[href=\"/web/lists\"]{background-image:url(\"~images/icon_lists.png\")}.column-link[href=\"/web/lists\"]:hover{background-image:url(\"~images/icon_lists.png\")}.column-link[href=\"/web/follow_requests\"]{background-image:url(\"~images/icon_follow_requests.png\")}.column-link[href=\"/web/follow_requests\"]:hover{background-image:url(\"~images/icon_follow_requests.png\")}.column-link[href=\"/web/keyboard-shortcuts\"]{background-image:url(\"~images/icon_keyboard_shortcuts.png\")}.column-link[href=\"/web/keyboard-shortcuts\"]:hover{background-image:url(\"~images/icon_keyboard_shortcuts.png\")}.column-link[href=\"/web/blocks\"]{background-image:url(\"~images/icon_blocks.png\")}.column-link[href=\"/web/blocks\"]:hover{background-image:url(\"~images/icon_blocks.png\")}.column-link[href=\"/web/mutes\"]{background-image:url(\"~images/icon_mutes.png\")}.column-link[href=\"/web/mutes\"]:hover{background-image:url(\"~images/icon_mutes.png\")}.column-link[href=\"/settings/preferences\"]{background-image:url(\"~images/icon_settings.png\")}.column-link[href=\"/settings/preferences\"]:hover{background-image:url(\"~images/icon_settings.png\")}.column-link[href=\"/about/more\"]{background-image:url(\"~images/icon_about.png\")}.column-link[href=\"/about/more\"]:hover{background-image:url(\"~images/icon_about.png\")}.column-link[href=\"/auth/sign_out\"]{background-image:url(\"~images/icon_logout.png\")}.column-link[href=\"/auth/sign_out\"]:hover{background-image:url(\"~images/icon_logout.png\")}.getting-started__footer{display:none}.getting-started__wrapper::before{content:\"Mastodon 95\";font-weight:bold;font-size:23px;color:#fff;line-height:30px;padding-left:20px;padding-right:40px;left:0px;bottom:-30px;display:block;position:absolute;background-color:#7f7f7f;width:200%;height:30px;-ms-transform:rotate(-90deg);-webkit-transform:rotate(-90deg);transform:rotate(-90deg);transform-origin:top left}.getting-started__wrapper{border-left:2px solid #efefef;border-top:2px solid #efefef;border-right:2px solid #404040;border-bottom:2px solid #404040;border-radius:0px;background-color:#bfbfbf}.column .static-content.getting-started{display:none}.keyboard-shortcuts kbd{background-color:#bfbfbf}.account__header{background-color:#7f7f7f}.account__header .account__header__content{color:#fff}.account-authorize__wrapper{border:2px groove #bfbfbf;margin:2px;padding:2px}.account--panel{background-color:#bfbfbf;border:0px;border-top:2px groove #bfbfbf}.account-authorize .account__header__content{color:#000;margin:10px}.account__action-bar__tab>span{color:#000;font-weight:bold}.account__action-bar__tab strong{color:#000}.account__action-bar{border:unset}.account__action-bar__tab{border:1px outset #bfbfbf}.account__action-bar__tab:active{box-shadow:inset 1px 1px 0px #000,inset -1px -1px 0px #fff,inset 2px 2px 0px gray,inset -2px -2px 0px #dfdfdf;border-width:0px;border-radius:0px}.dropdown--active .dropdown__content>ul,.dropdown-menu{background:#ffc;border-radius:0px;border:1px solid #000;box-shadow:unset}.dropdown-menu a{background-color:transparent}.dropdown--active::after{display:none}.dropdown--active .icon-button{color:#000;box-shadow:inset 1px 1px 0px #000,inset -1px -1px 0px #fff,inset 2px 2px 0px gray,inset -2px -2px 0px #dfdfdf;border-width:0px;border-radius:0px}.dropdown--active .dropdown__content>ul>li>a{background:transparent}.dropdown--active .dropdown__content>ul>li>a:hover{background:transparent;color:#000;text-decoration:underline}.dropdown__sep,.dropdown-menu__separator{border-color:#7f7f7f}.detailed-status__action-bar-dropdown .dropdown--active .dropdown__content.dropdown__left{left:unset}.dropdown>.icon-button,.detailed-status__button>.icon-button,.status__action-bar>.icon-button,.star-icon i{height:25px !important;width:28px !important;box-sizing:border-box}.status__action-bar-button .fa-floppy-o{padding-top:2px}.status__action-bar-dropdown{position:relative;top:-3px}.detailed-status__action-bar-dropdown .dropdown{position:relative;top:-4px}.notification .status__action-bar{border-bottom:none}.notification .status{margin-bottom:4px}.status__wrapper .status{margin-bottom:3px}.status__wrapper{margin-bottom:8px}.icon-button .fa-retweet{position:relative;top:-1px}.embed-modal,.error-modal,.onboarding-modal,.actions-modal,.boost-modal,.confirmation-modal,.report-modal{box-shadow:inset -1px -1px 0px #000,inset 1px 1px 0px #fff,inset -2px -2px 0px gray,inset 2px 2px 0px #dfdfdf;border-radius:0px;background:#bfbfbf}.actions-modal::before,.boost-modal::before,.confirmation-modal::before,.report-modal::before{content:\"Confirmation\";display:block;background:#00007f;color:#fff;font-weight:bold;padding-left:2px}.boost-modal::before{content:\"Boost confirmation\"}.boost-modal__action-bar>div>span:before{content:\"Tip: \";font-weight:bold}.boost-modal__action-bar,.confirmation-modal__action-bar,.report-modal__action-bar{background:#bfbfbf;margin-top:-15px}.embed-modal h4,.error-modal h4,.onboarding-modal h4{background:#00007f;color:#fff;font-weight:bold;padding:2px;font-size:13px;text-align:left}.confirmation-modal__action-bar .confirmation-modal__cancel-button{color:#000}.confirmation-modal__action-bar .confirmation-modal__cancel-button:active,.confirmation-modal__action-bar .confirmation-modal__cancel-button:focus,.confirmation-modal__action-bar .confirmation-modal__cancel-button:hover{color:#000}.confirmation-modal__action-bar .confirmation-modal__cancel-button:active{box-shadow:inset 1px 1px 0px #000,inset -1px -1px 0px #fff,inset 2px 2px 0px gray,inset -2px -2px 0px #dfdfdf;border-width:0px;border-radius:0px}.embed-modal .embed-modal__container .embed-modal__html,.embed-modal .embed-modal__container .embed-modal__html:focus{background:#fff;color:#000;box-shadow:inset 1px 1px 0px #000,inset -1px -1px 0px #fff,inset 2px 2px 0px gray,inset -2px -2px 0px #dfdfdf;border-width:0px;border-radius:0px}.modal-root__overlay,.account__header>div{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAFnpUWHRUaXRsZQAACJnLzU9JzElKBwALgwLXaCRlPwAAABd6VFh0QXV0aG9yAAAImUvOKMrPS8wBAAuaAugOwWPyAAAAEUlEQVQImWNgYGD4z4AE/gMADwMB/414xEUAAAAASUVORK5CYII=\")}.admin-wrapper::before{position:absolute;top:0px;content:\"Control Panel\";color:#fff;background-color:#00007f;font-size:13px;font-weight:bold;width:calc(100%);margin:2px;display:block;padding:2px;padding-left:22px;box-sizing:border-box}.admin-wrapper{position:relative;background:#bfbfbf;box-shadow:inset -1px -1px 0px #000,inset 1px 1px 0px #fff,inset -2px -2px 0px gray,inset 2px 2px 0px #dfdfdf;border-radius:0px;width:70vw;height:80vh;margin:10vh auto;color:#000;padding-top:24px;flex-direction:column;overflow:hidden}@media screen and (max-width: 1120px){.admin-wrapper{width:90vw;height:95vh;margin:2.5vh auto}}@media screen and (max-width: 740px){.admin-wrapper{width:100vw;height:95vh;height:calc(100vh - 24px);margin:0px 0px 0px 0px}}.admin-wrapper .sidebar-wrapper{position:static;height:auto;flex:0 0 auto;margin:2px}.admin-wrapper .content-wrapper{flex:1 1 auto;width:calc(100% - 20px);border-left:2px solid #efefef;border-top:2px solid #efefef;border-right:2px solid #404040;border-bottom:2px solid #404040;border-radius:0px;position:relative;margin-left:10px;margin-right:10px;margin-bottom:40px;box-sizing:border-box}.admin-wrapper .content{background-color:#bfbfbf;width:100%;max-width:100%;min-height:100%;box-sizing:border-box;position:relative}.admin-wrapper .sidebar{position:static;background:#bfbfbf;color:#000;width:100%;height:auto;padding-bottom:20px}.admin-wrapper .sidebar .logo{position:absolute;top:2px;left:4px;width:18px;height:18px;margin:0px}.admin-wrapper .sidebar>ul{background:#bfbfbf;margin:0px;margin-left:8px;color:#000}.admin-wrapper .sidebar>ul>li{display:inline-block}.admin-wrapper .sidebar>ul>li#settings,.admin-wrapper .sidebar>ul>li#admin{padding:2px;border:0px solid transparent}.admin-wrapper .sidebar>ul>li#logout{position:absolute;box-shadow:inset -1px -1px 0px #000,inset 1px 1px 0px #fff,inset -2px -2px 0px gray,inset 2px 2px 0px #dfdfdf;border-radius:0px;right:12px;bottom:10px}.admin-wrapper .sidebar>ul>li#web{display:inline-block;box-shadow:inset -1px -1px 0px #000,inset 1px 1px 0px #fff,inset -2px -2px 0px gray,inset 2px 2px 0px #dfdfdf;border-radius:0px;position:absolute;left:12px;bottom:10px}.admin-wrapper .sidebar>ul>li>a{display:inline-block;box-shadow:inset -1px 0px 0px #000,inset 1px 0px 0px #fff,inset 0px 1px 0px #fff,inset 0px 2px 0px #dfdfdf,inset -2px 0px 0px gray,inset 2px 0px 0px #dfdfdf;border-radius:0px;border-top-left-radius:1px;border-top-right-radius:1px;padding:2px 5px;margin:0px;color:#000;vertical-align:baseline}.admin-wrapper .sidebar>ul>li>a.selected{background:#bfbfbf;color:#000;padding-top:4px;padding-bottom:4px}.admin-wrapper .sidebar>ul>li>a:hover{background:#bfbfbf;color:#000}.admin-wrapper .sidebar>ul>li>ul{width:calc(100% - 20px);background:transparent;position:absolute;left:10px;top:54px;z-index:3}.admin-wrapper .sidebar>ul>li>ul>li{background:#bfbfbf;display:inline-block;vertical-align:baseline}.admin-wrapper .sidebar>ul>li>ul>li>a{background:#bfbfbf;box-shadow:inset -1px 0px 0px #000,inset 1px 0px 0px #fff,inset 0px 1px 0px #fff,inset 0px 2px 0px #dfdfdf,inset -2px 0px 0px gray,inset 2px 0px 0px #dfdfdf;border-radius:0px;border-top-left-radius:1px;border-top-right-radius:1px;color:#000;padding:2px 5px;position:relative;z-index:3}.admin-wrapper .sidebar>ul>li>ul>li>a.selected{background:#bfbfbf;color:#000;padding-bottom:4px;padding-top:4px;padding-right:7px;margin-left:-2px;margin-right:-2px;position:relative;z-index:4}.admin-wrapper .sidebar>ul>li>ul>li>a.selected:first-child{margin-left:0px}.admin-wrapper .sidebar>ul>li>ul>li>a.selected:hover{background:transparent;color:#000}.admin-wrapper .sidebar>ul>li>ul>li>a:hover{background:#bfbfbf;color:#000}@media screen and (max-width: 1520px){.admin-wrapper .sidebar>ul>li>ul{max-width:1000px}.admin-wrapper .sidebar{padding-bottom:45px}}@media screen and (max-width: 600px){.admin-wrapper .sidebar>ul>li>ul{max-width:500px}.admin-wrapper .sidebar{padding:0px;padding-bottom:70px;width:100%;height:auto}.admin-wrapper .content-wrapper{overflow:auto;height:80%;height:calc(100% - 150px)}}.flash-message{background-color:#ffc;color:#000;border:1px solid #000;border-radius:0px;position:absolute;top:0px;left:0px;width:100%}.admin-wrapper table{background-color:#fff;border-left:1px solid #404040;border-top:1px solid #404040;border-right:1px solid #efefef;border-bottom:1px solid #efefef;border-radius:0px}.admin-wrapper .content h2,.simple_form .input.with_label .label_input>label,.admin-wrapper .content h6,.admin-wrapper .content>p,.admin-wrapper .content .muted-hint,.simple_form span.hint,.simple_form h4,.simple_form .check_boxes .checkbox label,.simple_form .input.with_label.boolean .label_input>label,.filters .filter-subset a,.simple_form .input.radio_buttons .radio label,a.table-action-link,a.table-action-link:hover,.simple_form .input.with_block_label>label,.simple_form p.hint{color:#000}.table>tbody>tr:nth-child(2n+1)>td,.table>tbody>tr:nth-child(2n+1)>th{background-color:#fff}.simple_form input[type=text],.simple_form input[type=number],.simple_form input[type=email],.simple_form input[type=password],.simple_form textarea{color:#000;background-color:#fff;border-left:1px solid #404040;border-top:1px solid #404040;border-right:1px solid #efefef;border-bottom:1px solid #efefef;border-radius:0px}.simple_form input[type=text]:active,.simple_form input[type=text]:focus,.simple_form input[type=number]:active,.simple_form input[type=number]:focus,.simple_form input[type=email]:active,.simple_form input[type=email]:focus,.simple_form input[type=password]:active,.simple_form input[type=password]:focus,.simple_form textarea:active,.simple_form textarea:focus{background-color:#fff}.simple_form button,.simple_form .button,.simple_form .block-button{background:#bfbfbf;box-shadow:inset -1px -1px 0px #000,inset 1px 1px 0px #fff,inset -2px -2px 0px gray,inset 2px 2px 0px #dfdfdf;border-radius:0px;color:#000;font-weight:normal}.simple_form button:hover,.simple_form .button:hover,.simple_form .block-button:hover{background:#bfbfbf}.simple_form .warning,.table-form .warning{background:#ffc;color:#000;box-shadow:unset;text-shadow:unset;border:1px solid #000}.simple_form .warning a,.table-form .warning a{color:blue;text-decoration:underline}.simple_form button.negative,.simple_form .button.negative,.simple_form .block-button.negative{background:#bfbfbf}.filters .filter-subset{border:2px groove #bfbfbf;padding:2px}.filters .filter-subset a::before{content:\"\";background-color:#fff;border-radius:50%;border:2px solid #000;border-top-color:#7f7f7f;border-left-color:#7f7f7f;border-bottom-color:#f5f5f5;border-right-color:#f5f5f5;width:12px;height:12px;display:inline-block;vertical-align:middle;margin-right:2px}.filters .filter-subset a.selected::before{background-color:#000;box-shadow:inset 0 0 0 3px #fff}.filters .filter-subset a,.filters .filter-subset a:hover,.filters .filter-subset a.selected{color:#000;border-bottom:0px solid transparent}","// win95 theme from cybrespace.\n\n// Modified by kibi! to use webpack package syntax for urls (eg,\n// `url(~images/…)`) for easy importing into skins.\n\n$win95-bg: #bfbfbf;\n$win95-dark-grey: #404040;\n$win95-mid-grey: #808080;\n$win95-window-header: #00007f;\n$win95-tooltip-yellow: #ffffcc;\n$win95-blue: blue;\n\n$ui-base-lighter-color: $win95-dark-grey;\n$ui-highlight-color: $win95-window-header;\n\n@mixin win95-border-outset() {\n border-left: 2px solid #efefef;\n border-top: 2px solid #efefef;\n border-right: 2px solid #404040;\n border-bottom: 2px solid #404040;\n border-radius:0px;\n}\n\n@mixin win95-outset() {\n box-shadow: inset -1px -1px 0px #000000,\n inset 1px 1px 0px #ffffff,\n inset -2px -2px 0px #808080,\n inset 2px 2px 0px #dfdfdf;\n border-radius:0px;\n}\n\n@mixin win95-border-inset() {\n border-left: 2px solid #404040;\n border-top: 2px solid #404040;\n border-right: 2px solid #efefef;\n border-bottom: 2px solid #efefef;\n border-radius:0px;\n}\n\n@mixin win95-border-slight-inset() {\n border-left: 1px solid #404040;\n border-top: 1px solid #404040;\n border-right: 1px solid #efefef;\n border-bottom: 1px solid #efefef;\n border-radius:0px;\n}\n\n@mixin win95-inset() {\n box-shadow: inset 1px 1px 0px #000000,\n inset -1px -1px 0px #ffffff,\n inset 2px 2px 0px #808080,\n inset -2px -2px 0px #dfdfdf;\n border-width:0px;\n border-radius:0px;\n}\n\n@mixin win95-tab() {\n box-shadow: inset -1px 0px 0px #000000,\n inset 1px 0px 0px #ffffff,\n inset 0px 1px 0px #ffffff,\n inset 0px 2px 0px #dfdfdf,\n inset -2px 0px 0px #808080,\n inset 2px 0px 0px #dfdfdf;\n border-radius:0px;\n border-top-left-radius: 1px;\n border-top-right-radius: 1px;\n}\n\n@mixin win95-reset() {\n box-shadow: unset;\n}\n\n@font-face {\n font-family:\"premillenium\";\n src: url('~fonts/premillenium/MSSansSerif.ttf') format('truetype');\n}\n\n@import 'application';\n\n/* borrowed from cybrespace style: wider columns and full column width images */\n\n@media screen and (min-width: 1300px) {\n .column {\n flex-grow: 1 !important;\n max-width: 400px;\n }\n\n .drawer {\n width: 17%;\n max-width: 400px;\n min-width: 330px;\n }\n}\n\n.media-gallery,\n.video-player {\n max-height:30vh;\n height:30vh !important;\n position:relative;\n margin-top:20px;\n margin-left:-68px;\n width: calc(100% + 80px) !important;\n max-width: calc(100% + 80px);\n}\n\n.detailed-status .media-gallery,\n.detailed-status .video-player {\n margin-left:-5px;\n width: calc(100% + 9px);\n max-width: calc(100% + 9px);\n}\n\n.video-player video {\n transform: unset;\n top: unset;\n}\n\n.detailed-status .media-spoiler,\n.status .media-spoiler {\n height: 100%!important;\n vertical-align: middle;\n}\n\n/* main win95 style */\n\nbody {\n font-size:13px;\n font-family: \"MS Sans Serif\", \"premillenium\", sans-serif;\n color:black;\n}\n\n.ui,\n.ui .columns-area,\nbody.admin {\n background: #008080;\n}\n\n.loading-bar {\n height:5px;\n background-color: #000080;\n}\n\n.tabs-bar {\n background: $win95-bg;\n @include win95-outset();\n height: 30px;\n}\n\n.tabs-bar__link {\n color:black;\n border:2px outset $win95-bg;\n border-top-width: 1px;\n border-left-width: 1px;\n margin:2px;\n padding:3px;\n}\n\n.tabs-bar__link.active {\n @include win95-inset();\n color:black;\n}\n\n.tabs-bar__link:last-child::before {\n content:\"Start\";\n color:black;\n font-weight:bold;\n font-size:15px;\n width:80%;\n display:block;\n position:absolute;\n right:0px;\n}\n\n.tabs-bar__link:last-child {\n position:relative;\n flex-basis:60px !important;\n font-size:0px;\n color:$win95-bg;\n\n background-image: url(\"~images/start.png\");\n background-repeat:no-repeat;\n background-position:8%;\n background-clip:padding-box;\n background-size:auto 50%;\n}\n\n.drawer .drawer__inner {\n overflow: visible;\n height:inherit;\n background:$win95-bg;\n}\n\n.drawer:after {\n display:block;\n content: \" \";\n\n position:absolute;\n bottom:15px;\n left:15px;\n width:132px;\n height:117px;\n background-image:url(\"~images/clippy_wave.gif\"), url(\"~images/clippy_frame.png\");\n background-repeat:no-repeat;\n background-position: 4px 20px, 0px 0px;\n z-index:0;\n}\n\n.drawer__pager {\n overflow-y:auto;\n z-index:1;\n}\n\n.privacy-dropdown__dropdown {\n z-index:2;\n}\n\n.column {\n max-height:100vh;\n}\n\n.column > .scrollable {\n background: $win95-bg;\n @include win95-border-outset();\n border-top-width:0px;\n}\n\n.column-header__wrapper {\n color:white;\n font-weight:bold;\n background:#7f7f7f;\n}\n\n.column-header {\n padding:2px;\n font-size:13px;\n background:#7f7f7f;\n @include win95-border-outset();\n border-bottom-width:0px;\n color:white;\n font-weight:bold;\n align-items:baseline;\n}\n\n.column-header__wrapper.active {\n background:$win95-window-header;\n}\n\n.column-header__wrapper.active::before {\n display:none;\n}\n.column-header.active {\n box-shadow:unset;\n background:$win95-window-header;\n}\n\n.column-header.active .column-header__icon {\n color:white;\n}\n\n.column-header__buttons {\n max-height: 20px;\n margin-right:0px;\n}\n\n.column-header__button {\n background: $win95-bg;\n color: black;\n line-height:0px;\n font-size:14px;\n max-height:20px;\n padding:0px 2px;\n margin-top:2px;\n @include win95-outset();\n\n &:hover {\n color: black;\n }\n}\n\n.column-header__button.active, .column-header__button.active:hover {\n @include win95-inset();\n background-color:#7f7f7f;\n}\n\n.column-header__back-button {\n background: $win95-bg;\n color: black;\n padding:2px;\n max-height:20px;\n margin-top:2px;\n @include win95-outset();\n font-size:13px;\n font-weight:bold;\n}\n\n.column-back-button {\n background:$win95-bg;\n color:black;\n @include win95-outset();\n padding:2px;\n font-size:13px;\n font-weight:bold;\n}\n\n.column-back-button--slim-button {\n position:absolute;\n top:-22px;\n right:4px;\n max-height:20px;\n max-width:60px;\n padding:0px 2px;\n}\n\n.column-back-button__icon {\n font-size:11px;\n margin-top:-3px;\n}\n\n.column-header__collapsible {\n border-left:2px outset $win95-bg;\n border-right:2px outset $win95-bg;\n}\n\n.column-header__collapsible-inner {\n background:$win95-bg;\n color:black;\n}\n\n.column-header__collapsible__extra {\n color:black;\n}\n\n.column-header__collapsible__extra div[role=\"group\"] {\n border: 2px groove $win95-bg;\n border-radius:4px;\n margin-bottom:8px;\n padding:4px;\n}\n\n.column-inline-form {\n background-color: $win95-bg;\n @include win95-border-outset();\n border-bottom-width:0px;\n border-top-width:0px;\n}\n\n.column-settings__section {\n color:black;\n font-weight:bold;\n font-size:11px;\n position:relative;\n top: -12px;\n left:4px;\n background-color:$win95-bg;\n display:inline-block;\n padding:0px 4px;\n margin-bottom:0px;\n}\n\n.setting-meta__label, .setting-toggle__label {\n color:black;\n font-weight:normal;\n}\n\n.setting-meta__label span:before {\n content:\"(\";\n}\n.setting-meta__label span:after {\n content:\")\";\n}\n\n.setting-toggle {\n line-height:13px;\n}\n\n.react-toggle .react-toggle-track {\n border-radius:0px;\n background-color:white;\n @include win95-border-inset();\n\n width:12px;\n height:12px;\n}\n\n.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track {\n background-color:white;\n}\n\n.react-toggle .react-toggle-track-check {\n left:2px;\n transition:unset;\n}\n\n.react-toggle .react-toggle-track-check svg path {\n fill: black;\n}\n\n.react-toggle .react-toggle-track-x {\n display:none;\n}\n\n.react-toggle .react-toggle-thumb {\n border-radius:0px;\n display:none;\n}\n\n.text-btn {\n background-color:$win95-bg;\n @include win95-outset();\n padding:4px;\n}\n\n.text-btn:hover {\n text-decoration:none;\n color:black;\n}\n\n.text-btn:active {\n @include win95-inset();\n}\n\n.setting-text {\n color:black;\n background-color:white;\n @include win95-inset();\n font-size:13px;\n padding:2px;\n}\n\n.setting-text:active, .setting-text:focus,\n.setting-text.light:active, .setting-text.light:focus {\n color:black;\n border-bottom:2px inset $win95-bg;\n}\n\n.column-header__setting-arrows .column-header__setting-btn {\n padding:3px 10px;\n}\n\n.column-header__setting-arrows .column-header__setting-btn:last-child {\n padding:3px 10px;\n}\n\n.missing-indicator {\n background-color:$win95-bg;\n color:black;\n @include win95-outset();\n}\n\n.missing-indicator > div {\n background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRUaXRsZQAACJnLyy9Jyy/NSwEAD5IDblIFOhoAAAAXelRYdEF1dGhvcgAACJlLzijKz0vMAQALmgLoDsFj8gAAAQpJREFUOMuVlD0OwjAMhd2oQl04Axfo0IGBgYELcAY6cqQuSO0ZOEAZGBg6VKg74gwsEaoESRVHjusI8aQqzY8/PbtOEz1qkFSn2YevlaNOpLMJh2DwvixhuXtOa6/LCh51DUMEFkAsgAZD207Doin8mQ562JpRE5CHBAAhmIqD1L8AqzUUUJkxc6kr3AgAJ+NuvIWRdk7WcrKl0AUqcIBBHOiEbpS4m27mIL5Onfg3k0rgggeQuS2sDOGSahKR+glgqaGLgUJs951NN1q9D72cQqQWR9cr3sm9YcEssEuz6eEuZh2bu0aSOhQ1MBezu2O/+TVSvEFII3qLsZWrSA2AAUQIh1HpyP/kC++zjVSMj6ntAAAAAElFTkSuQmCC')\n no-repeat;\n background-position:center center;\n}\n\n.empty-column-indicator,\n.error-column {\n background: $win95-bg;\n color: black;\n}\n\n.status__wrapper {\n border: 2px groove $win95-bg;\n margin:4px;\n}\n\n.status {\n @include win95-border-slight-inset();\n background-color:white;\n margin:4px;\n padding-bottom:40px;\n margin-bottom:8px;\n}\n\n.status.status-direct {\n background-color:$win95-bg;\n}\n\n.status__content {\n font-size:13px;\n}\n\n.status.light .status__relative-time,\n.status.light .display-name span {\n color: #7f7f7f;\n}\n\n.status__action-bar {\n box-sizing:border-box;\n position:absolute;\n bottom:-1px;\n left:-1px;\n background:$win95-bg;\n width:calc(100% + 2px);\n padding-left:10px;\n padding: 4px 2px;\n padding-bottom:4px;\n border-bottom:2px groove $win95-bg;\n border-top:1px outset $win95-bg;\n text-align: right;\n}\n\n.status__wrapper .status__action-bar {\n border-bottom-width:0px;\n}\n\n.status__action-bar-button {\n float:right;\n}\n\n.status__action-bar-dropdown {\n margin-left:auto;\n margin-right:10px;\n\n .icon-button {\n min-width:28px;\n }\n}\n.status.light .status__content a {\n color:blue;\n}\n\n.focusable:focus {\n background: $win95-bg;\n .detailed-status__action-bar {\n background: $win95-bg;\n }\n\n .status, .detailed-status {\n background: white;\n outline:2px dotted $win95-mid-grey;\n }\n}\n\n.dropdown__trigger.icon-button {\n padding-right:6px;\n}\n\n.detailed-status__action-bar-dropdown .icon-button {\n min-width:28px;\n}\n\n.detailed-status {\n background:white;\n background-clip:padding-box;\n margin:4px;\n border: 2px groove $win95-bg;\n padding:4px;\n}\n\n.detailed-status__display-name {\n color:#7f7f7f;\n}\n\n.detailed-status__display-name strong {\n color:black;\n font-weight:bold;\n}\n.account__avatar,\n.account__avatar-overlay-base,\n.account__header__avatar,\n.account__avatar-overlay-overlay {\n @include win95-border-slight-inset();\n clip-path:none;\n filter: saturate(1.8) brightness(1.1);\n}\n\n.detailed-status__action-bar {\n background-color:$win95-bg;\n border:0px;\n border-bottom:2px groove $win95-bg;\n margin-bottom:8px;\n justify-items:left;\n padding-left:4px;\n}\n.icon-button {\n background:$win95-bg;\n @include win95-border-outset();\n padding:0px 0px 0px 0px;\n margin-right:4px;\n\n color:#3f3f3f;\n &.inverted, &:hover, &.inverted:hover, &:active, &:focus {\n color:#3f3f3f;\n }\n}\n\n.icon-button:active {\n @include win95-border-inset();\n}\n\n.status__action-bar > .icon-button {\n padding:0px 15px 0px 0px;\n min-width:25px;\n}\n\n.icon-button.star-icon,\n.icon-button.star-icon:active {\n background:transparent;\n border:none;\n}\n\n.icon-button.star-icon.active {\n color: $gold-star;\n &:active, &:hover, &:focus {\n color: $gold-star;\n }\n}\n\n.icon-button.star-icon > i {\n background:$win95-bg;\n @include win95-border-outset();\n padding-bottom:3px;\n}\n\n.icon-button.star-icon:active > i {\n @include win95-border-inset();\n}\n\n.text-icon-button {\n color:$win95-dark-grey;\n}\n\n.detailed-status__action-bar-dropdown {\n margin-left:auto;\n justify-content:right;\n padding-right:16px;\n}\n\n.detailed-status__button {\n flex:0 0 auto;\n}\n\n.detailed-status__button .icon-button {\n padding-left:2px;\n padding-right:25px;\n}\n\n.status-card {\n border-radius:0px;\n background:white;\n border: 1px solid black;\n color:black;\n}\n\n.status-card:hover {\n background-color:white;\n}\n\n.status-card__title {\n color:blue;\n text-decoration:underline;\n font-weight:bold;\n}\n\n.load-more {\n width:auto;\n margin:5px auto;\n background: $win95-bg;\n @include win95-outset();\n color:black;\n padding: 2px 5px;\n\n &:hover {\n background: $win95-bg;\n color:black;\n }\n}\n\n.status-card__description {\n color:black;\n}\n\n.account__display-name strong, .status__display-name strong {\n color:black;\n font-weight:bold;\n}\n\n.account .account__display-name {\n color:black;\n}\n\n.account {\n border-bottom: 2px groove $win95-bg;\n}\n\n.reply-indicator__content .status__content__spoiler-link, .status__content .status__content__spoiler-link {\n background:$win95-bg;\n @include win95-outset();\n}\n\n.reply-indicator__content .status__content__spoiler-link:hover, .status__content .status__content__spoiler-link:hover {\n background:$win95-bg;\n}\n\n.reply-indicator__content .status__content__spoiler-link:active, .status__content .status__content__spoiler-link:active {\n @include win95-inset();\n}\n\n.reply-indicator__content a, .status__content a {\n color:blue;\n}\n\n.notification {\n border: 2px groove $win95-bg;\n margin:4px;\n}\n\n.notification__message {\n color:black;\n font-size:13px;\n}\n\n.notification__display-name {\n font-weight:bold;\n}\n\n.drawer__header {\n background: $win95-bg;\n @include win95-border-outset();\n justify-content:left;\n margin-bottom:0px;\n padding-bottom:2px;\n border-bottom:2px groove $win95-bg;\n}\n\n.drawer__tab {\n color:black;\n @include win95-outset();\n padding:5px;\n margin:2px;\n flex: 0 0 auto;\n}\n\n.drawer__tab:first-child::before {\n content:\"Start\";\n color:black;\n font-weight:bold;\n font-size:15px;\n width:80%;\n display:block;\n position:absolute;\n right:0px;\n\n}\n\n.drawer__tab:first-child {\n position:relative;\n padding:5px 15px;\n width:40px;\n font-size:0px;\n color:$win95-bg;\n\n background-image: url(\"~images/start.png\");\n background-repeat:no-repeat;\n background-position:8%;\n background-clip:padding-box;\n background-size:auto 50%;\n}\n\n.drawer__header a:hover {\n background-color:transparent;\n}\n\n.drawer__header a:first-child:hover {\n background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAIAAACpTQvdAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRBdXRob3IAAAiZS84oys9LzAEAC5oC6A7BY/IAAACWSURBVCiRhVJJDsQgDEuqOfRZ7a1P5gbP4uaJaEjTADMWQhHYjlk4p0wLnNdptdF4KvBUDyGzVwc2xO+uKtH+1o0ytEEmqFpuxlvFCGCxKbNIT56QCi2MzaA/2Mz+mERSOeqzJG2RUxkjdTabgPtFoZ1bZxcKvgPcLZVufAyR9Ni8v5dWDzfFx0giC1RvZFv6l35QQ/Mvv39XXgGzQpoAAAAASUVORK5CYII=\");\n background-repeat:no-repeat;\n background-position:8%;\n background-clip:padding-box;\n background-size:auto 50%;\n transition:unset;\n}\n\n.drawer__tab:first-child {\n\n}\n\n.search {\n background:$win95-bg;\n padding-top:2px;\n padding:2px;\n border:2px outset $win95-bg;\n border-top-width:0px;\n border-bottom: 2px groove $win95-bg;\n margin-bottom:0px;\n}\n\n.search input {\n background-color:white;\n color:black;\n @include win95-border-slight-inset();\n}\n\n.search__input:focus {\n background-color:white;\n}\n\n.search-popout {\n box-shadow: unset;\n color:black;\n border-radius:0px;\n background-color:$win95-tooltip-yellow;\n border:1px solid black;\n\n h4 {\n color:black;\n text-transform: none;\n font-weight:bold;\n }\n}\n\n.search-results__header {\n background-color: $win95-bg;\n color:black;\n border-bottom:2px groove $win95-bg;\n}\n\n.search-results__hashtag {\n color:blue;\n}\n\n.search-results__section .account:hover,\n.search-results__section .account:hover .account__display-name,\n.search-results__section .account:hover .account__display-name strong,\n.search-results__section .search-results__hashtag:hover {\n background-color:$win95-window-header;\n color:white;\n}\n\n.search__icon .fa {\n color:#808080;\n\n &.active {\n opacity:1.0;\n }\n\n &:hover {\n color: #808080;\n }\n}\n\n.drawer__inner,\n.drawer__inner.darker {\n background-color:$win95-bg;\n border: 2px outset $win95-bg;\n border-top-width:0px;\n}\n\n.navigation-bar {\n color:black;\n}\n\n.navigation-bar strong {\n color:black;\n font-weight:bold;\n}\n\n.compose-form .autosuggest-textarea__textarea,\n.compose-form .spoiler-input__input {\n border-radius:0px;\n @include win95-border-slight-inset();\n}\n\n.compose-form .autosuggest-textarea__textarea {\n border-bottom:0px;\n}\n\n.compose-form__uploads-wrapper {\n border-radius:0px;\n border-bottom:1px inset $win95-bg;\n border-top-width:0px;\n}\n\n.compose-form__upload-wrapper {\n border-left:1px inset $win95-bg;\n border-right:1px inset $win95-bg;\n}\n\n.compose-form .compose-form__buttons-wrapper {\n background-color: $win95-bg;\n border:2px groove $win95-bg;\n margin-top:4px;\n padding:4px 8px;\n}\n\n.compose-form__buttons {\n background-color:$win95-bg;\n border-radius:0px;\n box-shadow:unset;\n}\n\n.compose-form__buttons-separator {\n border-left: 2px groove $win95-bg;\n}\n\n.privacy-dropdown.active .privacy-dropdown__value.active,\n.advanced-options-dropdown.open .advanced-options-dropdown__value {\n background: $win95-bg;\n}\n\n.privacy-dropdown.active .privacy-dropdown__value.active .icon-button {\n color: $win95-dark-grey;\n}\n\n.privacy-dropdown.active\n.privacy-dropdown__value {\n background: $win95-bg;\n box-shadow:unset;\n}\n\n.privacy-dropdown__option.active, .privacy-dropdown__option:hover,\n.privacy-dropdown__option.active:hover {\n background:$win95-window-header;\n}\n\n.privacy-dropdown__dropdown,\n.privacy-dropdown.active .privacy-dropdown__dropdown,\n.advanced-options-dropdown__dropdown,\n.advanced-options-dropdown.open .advanced-options-dropdown__dropdown\n{\n box-shadow:unset;\n color:black;\n @include win95-outset();\n background: $win95-bg;\n}\n\n.privacy-dropdown__option__content {\n color:black;\n}\n\n.privacy-dropdown__option__content strong {\n font-weight:bold;\n}\n\n.compose-form__warning::before {\n content:\"Tip:\";\n font-weight:bold;\n display:block;\n position:absolute;\n top:-10px;\n background-color:$win95-bg;\n font-size:11px;\n padding: 0px 5px;\n}\n\n.compose-form__warning {\n position:relative;\n box-shadow:unset;\n border:2px groove $win95-bg;\n background-color:$win95-bg;\n color:black;\n}\n\n.compose-form__warning a {\n color:blue;\n}\n\n.compose-form__warning strong {\n color:black;\n text-decoration:underline;\n}\n\n.compose-form__buttons button.active:last-child {\n @include win95-border-inset();\n background: #dfdfdf;\n color:#7f7f7f;\n}\n\n.compose-form__upload-thumbnail {\n border-radius:0px;\n border:2px groove $win95-bg;\n background-color:$win95-bg;\n padding:2px;\n box-sizing:border-box;\n}\n\n.compose-form__upload-thumbnail .icon-button {\n max-width:20px;\n max-height:20px;\n line-height:10px !important;\n}\n\n.compose-form__upload-thumbnail .icon-button::before {\n content:\"X\";\n font-size:13px;\n font-weight:bold;\n color:black;\n}\n\n.compose-form__upload-thumbnail .icon-button i {\n display:none;\n}\n\n.emoji-picker-dropdown__menu {\n z-index:2;\n}\n\n.emoji-dialog.with-search {\n box-shadow:unset;\n border-radius:0px;\n background-color:$win95-bg;\n border:1px solid black;\n box-sizing:content-box;\n\n}\n\n.emoji-dialog .emoji-search {\n color:black;\n background-color:white;\n border-radius:0px;\n @include win95-inset();\n}\n\n.emoji-dialog .emoji-search-wrapper {\n border-bottom:2px groove $win95-bg;\n}\n\n.emoji-dialog .emoji-category-title {\n color:black;\n font-weight:bold;\n}\n\n.reply-indicator {\n background-color:$win95-bg;\n border-radius:3px;\n border:2px groove $win95-bg;\n}\n\n.button {\n background-color:$win95-bg;\n @include win95-outset();\n border-radius:0px;\n color:black;\n font-weight:bold;\n\n &:hover, &:focus, &:disabled {\n background-color:$win95-bg;\n }\n\n &:active {\n @include win95-inset();\n }\n\n &:disabled {\n color: #808080;\n text-shadow: 1px 1px 0px #efefef;\n\n &:active {\n @include win95-outset();\n }\n }\n\n}\n\n#Getting-started {\n background-color:$win95-bg;\n @include win95-inset();\n border-bottom-width:0px;\n}\n\n#Getting-started::before {\n content:\"Start\";\n color:black;\n font-weight:bold;\n font-size:15px;\n width:80%;\n text-align:center;\n display:block;\n position:absolute;\n right:2px;\n}\n\n#Getting-started {\n position:relative;\n padding:5px 15px;\n width:60px;\n font-size:0px;\n color:$win95-bg;\n\n background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAIAAACpTQvdAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRBdXRob3IAAAiZS84oys9LzAEAC5oC6A7BY/IAAACWSURBVCiRhVJJDsQgDEuqOfRZ7a1P5gbP4uaJaEjTADMWQhHYjlk4p0wLnNdptdF4KvBUDyGzVwc2xO+uKtH+1o0ytEEmqFpuxlvFCGCxKbNIT56QCi2MzaA/2Mz+mERSOeqzJG2RUxkjdTabgPtFoZ1bZxcKvgPcLZVufAyR9Ni8v5dWDzfFx0giC1RvZFv6l35QQ/Mvv39XXgGzQpoAAAAASUVORK5CYII=\");\n background-repeat:no-repeat;\n background-position:8%;\n background-clip:padding-box;\n background-size:auto 50%;\n}\n\n.column-subheading {\n background-color:$win95-bg;\n color:black;\n border-bottom: 2px groove $win95-bg;\n text-transform: none;\n font-size: 16px;\n}\n\n.column-link {\n background-color:transparent;\n color:black;\n &:hover {\n background-color: $win95-window-header;\n color:white;\n }\n}\n\n.getting-started__wrapper {\n .column-subheading {\n font-size:0px;\n margin:0px;\n padding:0px;\n }\n\n .column-link {\n background-size:32px 32px;\n background-repeat:no-repeat;\n background-position: 36px 50%;\n padding-left:40px;\n\n &:hover {\n background-size:32px 32px;\n background-repeat:no-repeat;\n background-position: 36px 50%;\n }\n\n i {\n font-size: 0px;\n width:32px;\n }\n }\n}\n\n.column-link[href=\"/web/timelines/public\"] {\n background-image: url(\"~images/icon_public.png\");\n &:hover { background-image: url(\"~images/icon_public.png\"); }\n}\n.column-link[href=\"/web/timelines/public/local\"] {\n background-image: url(\"~images/icon_local.png\");\n &:hover { background-image: url(\"~images/icon_local.png\"); }\n}\n.column-link[href=\"/web/pinned\"] {\n background-image: url(\"~images/icon_pin.png\");\n &:hover { background-image: url(\"~images/icon_pin.png\"); }\n}\n.column-link[href=\"/web/favourites\"] {\n background-image: url(\"~images/icon_likes.png\");\n &:hover { background-image: url(\"~images/icon_likes.png\"); }\n}\n.column-link[href=\"/web/lists\"] {\n background-image: url(\"~images/icon_lists.png\");\n &:hover { background-image: url(\"~images/icon_lists.png\"); }\n}\n.column-link[href=\"/web/follow_requests\"] {\n background-image: url(\"~images/icon_follow_requests.png\");\n &:hover { background-image: url(\"~images/icon_follow_requests.png\"); }\n}\n.column-link[href=\"/web/keyboard-shortcuts\"] {\n background-image: url(\"~images/icon_keyboard_shortcuts.png\");\n &:hover { background-image: url(\"~images/icon_keyboard_shortcuts.png\"); }\n}\n.column-link[href=\"/web/blocks\"] {\n background-image: url(\"~images/icon_blocks.png\");\n &:hover { background-image: url(\"~images/icon_blocks.png\"); }\n}\n.column-link[href=\"/web/mutes\"] {\n background-image: url(\"~images/icon_mutes.png\");\n &:hover { background-image: url(\"~images/icon_mutes.png\"); }\n}\n.column-link[href=\"/settings/preferences\"] {\n background-image: url(\"~images/icon_settings.png\");\n &:hover { background-image: url(\"~images/icon_settings.png\"); }\n}\n.column-link[href=\"/about/more\"] {\n background-image: url(\"~images/icon_about.png\");\n &:hover { background-image: url(\"~images/icon_about.png\"); }\n}\n.column-link[href=\"/auth/sign_out\"] {\n background-image: url(\"~images/icon_logout.png\");\n &:hover { background-image: url(\"~images/icon_logout.png\"); }\n}\n\n.getting-started__footer {\n display:none;\n}\n\n.getting-started__wrapper::before {\n content:\"Mastodon 95\";\n font-weight:bold;\n font-size:23px;\n color:white;\n line-height:30px;\n padding-left:20px;\n padding-right:40px;\n\n left:0px;\n bottom:-30px;\n display:block;\n position:absolute;\n background-color:#7f7f7f;\n width:200%;\n height:30px;\n\n -ms-transform: rotate(-90deg);\n\n -webkit-transform: rotate(-90deg);\n transform: rotate(-90deg);\n transform-origin:top left;\n}\n\n.getting-started__wrapper {\n @include win95-border-outset();\n background-color:$win95-bg;\n}\n\n.column .static-content.getting-started {\n display:none;\n}\n\n.keyboard-shortcuts kbd {\n background-color: $win95-bg;\n}\n\n.account__header {\n background-color:#7f7f7f;\n}\n\n.account__header .account__header__content {\n color:white;\n}\n\n.account-authorize__wrapper {\n border: 2px groove $win95-bg;\n margin: 2px;\n padding:2px;\n}\n\n.account--panel {\n background-color: $win95-bg;\n border:0px;\n border-top: 2px groove $win95-bg;\n}\n\n.account-authorize .account__header__content {\n color:black;\n margin:10px;\n}\n\n.account__action-bar__tab > span {\n color:black;\n font-weight:bold;\n}\n\n.account__action-bar__tab strong {\n color:black;\n}\n\n.account__action-bar {\n border: unset;\n}\n\n.account__action-bar__tab {\n border: 1px outset $win95-bg;\n}\n\n.account__action-bar__tab:active {\n @include win95-inset();\n}\n\n.dropdown--active .dropdown__content > ul,\n.dropdown-menu {\n background:$win95-tooltip-yellow;\n border-radius:0px;\n border:1px solid black;\n box-shadow:unset;\n}\n\n.dropdown-menu a {\n background-color:transparent;\n}\n\n.dropdown--active::after {\n display:none;\n}\n\n.dropdown--active .icon-button {\n color:black;\n @include win95-inset();\n}\n\n.dropdown--active .dropdown__content > ul > li > a {\n background:transparent;\n}\n\n.dropdown--active .dropdown__content > ul > li > a:hover {\n background:transparent;\n color:black;\n text-decoration:underline;\n}\n\n.dropdown__sep,\n.dropdown-menu__separator\n{\n border-color:#7f7f7f;\n}\n\n.detailed-status__action-bar-dropdown .dropdown--active .dropdown__content.dropdown__left {\n left:unset;\n}\n\n.dropdown > .icon-button, .detailed-status__button > .icon-button,\n.status__action-bar > .icon-button, .star-icon i {\n /* i don't know what's going on with the inline\n styles someone should look at the react code */\n height: 25px !important;\n width: 28px !important;\n box-sizing: border-box;\n}\n\n.status__action-bar-button .fa-floppy-o {\n padding-top: 2px;\n}\n\n.status__action-bar-dropdown {\n position: relative;\n top: -3px;\n}\n\n.detailed-status__action-bar-dropdown .dropdown {\n position: relative;\n top: -4px;\n}\n\n.notification .status__action-bar {\n border-bottom: none;\n}\n\n.notification .status {\n margin-bottom: 4px;\n}\n\n.status__wrapper .status {\n margin-bottom: 3px;\n}\n\n.status__wrapper {\n margin-bottom: 8px;\n}\n\n.icon-button .fa-retweet {\n position: relative;\n top: -1px;\n}\n\n.embed-modal, .error-modal, .onboarding-modal,\n.actions-modal, .boost-modal, .confirmation-modal, .report-modal {\n @include win95-outset();\n background:$win95-bg;\n}\n\n.actions-modal::before,\n.boost-modal::before,\n.confirmation-modal::before,\n.report-modal::before {\n content: \"Confirmation\";\n display:block;\n background:$win95-window-header;\n color:white;\n font-weight:bold;\n padding-left:2px;\n}\n\n.boost-modal::before {\n content: \"Boost confirmation\";\n}\n\n.boost-modal__action-bar > div > span:before {\n content: \"Tip: \";\n font-weight:bold;\n}\n\n.boost-modal__action-bar, .confirmation-modal__action-bar, .report-modal__action-bar {\n background:$win95-bg;\n margin-top:-15px;\n}\n\n.embed-modal h4, .error-modal h4, .onboarding-modal h4 {\n background:$win95-window-header;\n color:white;\n font-weight:bold;\n padding:2px;\n font-size:13px;\n text-align:left;\n}\n\n.confirmation-modal__action-bar {\n .confirmation-modal__cancel-button {\n color:black;\n\n &:active,\n &:focus,\n &:hover {\n color:black;\n }\n\n &:active {\n @include win95-inset();\n }\n }\n}\n\n.embed-modal .embed-modal__container .embed-modal__html,\n.embed-modal .embed-modal__container .embed-modal__html:focus {\n background:white;\n color:black;\n @include win95-inset();\n}\n\n.modal-root__overlay,\n.account__header > div {\n background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAFnpUWHRUaXRsZQAACJnLzU9JzElKBwALgwLXaCRlPwAAABd6VFh0QXV0aG9yAAAImUvOKMrPS8wBAAuaAugOwWPyAAAAEUlEQVQImWNgYGD4z4AE/gMADwMB/414xEUAAAAASUVORK5CYII=');\n}\n\n.admin-wrapper::before {\n position:absolute;\n top:0px;\n content:\"Control Panel\";\n color:white;\n background-color:$win95-window-header;\n font-size:13px;\n font-weight:bold;\n width:calc(100%);\n margin: 2px;\n display:block;\n padding:2px;\n padding-left:22px;\n box-sizing:border-box;\n}\n\n.admin-wrapper {\n position:relative;\n background: $win95-bg;\n @include win95-outset();\n width:70vw;\n height:80vh;\n margin:10vh auto;\n color: black;\n padding-top:24px;\n flex-direction:column;\n overflow:hidden;\n}\n\n@media screen and (max-width: 1120px) {\n .admin-wrapper {\n width:90vw;\n height:95vh;\n margin:2.5vh auto;\n }\n}\n\n@media screen and (max-width: 740px) {\n .admin-wrapper {\n width:100vw;\n height:95vh;\n height:calc(100vh - 24px);\n margin:0px 0px 0px 0px;\n }\n}\n\n.admin-wrapper .sidebar-wrapper {\n position:static;\n height:auto;\n flex: 0 0 auto;\n margin:2px;\n}\n\n.admin-wrapper .content-wrapper {\n flex: 1 1 auto;\n width:calc(100% - 20px);\n @include win95-border-outset();\n position:relative;\n margin-left:10px;\n margin-right:10px;\n margin-bottom:40px;\n box-sizing:border-box;\n}\n\n.admin-wrapper .content {\n background-color: $win95-bg;\n width: 100%;\n max-width:100%;\n min-height:100%;\n box-sizing:border-box;\n position:relative;\n}\n\n.admin-wrapper .sidebar {\n position:static;\n background: $win95-bg;\n color:black;\n width: 100%;\n height:auto;\n padding-bottom: 20px;\n}\n\n.admin-wrapper .sidebar .logo {\n position:absolute;\n top:2px;\n left:4px;\n width:18px;\n height:18px;\n margin:0px;\n}\n\n.admin-wrapper .sidebar > ul {\n background: $win95-bg;\n margin:0px;\n margin-left:8px;\n color:black;\n\n & > li {\n display:inline-block;\n\n &#settings,\n &#admin {\n padding:2px;\n border: 0px solid transparent;\n }\n\n &#logout {\n position:absolute;\n @include win95-outset();\n right:12px;\n bottom:10px;\n }\n\n &#web {\n display:inline-block;\n @include win95-outset();\n position:absolute;\n left: 12px;\n bottom: 10px;\n }\n\n & > a {\n display:inline-block;\n @include win95-tab();\n padding:2px 5px;\n margin:0px;\n color:black;\n vertical-align:baseline;\n\n &.selected {\n background: $win95-bg;\n color:black;\n padding-top: 4px;\n padding-bottom:4px;\n }\n\n &:hover {\n background: $win95-bg;\n color:black;\n }\n }\n\n & > ul {\n width:calc(100% - 20px);\n background: transparent;\n position:absolute;\n left: 10px;\n top:54px;\n z-index:3;\n\n & > li {\n background: $win95-bg;\n display: inline-block;\n vertical-align:baseline;\n\n & > a {\n background: $win95-bg;\n @include win95-tab();\n color:black;\n padding:2px 5px;\n position:relative;\n z-index:3;\n\n &.selected {\n background: $win95-bg;\n color:black;\n padding-bottom:4px;\n padding-top: 4px;\n padding-right:7px;\n margin-left:-2px;\n margin-right:-2px;\n position:relative;\n z-index:4;\n\n &:first-child {\n margin-left:0px;\n }\n\n &:hover {\n background: transparent;\n color:black;\n }\n }\n\n &:hover {\n background: $win95-bg;\n color:black;\n }\n }\n }\n }\n }\n}\n\n@media screen and (max-width: 1520px) {\n .admin-wrapper .sidebar > ul > li > ul {\n max-width:1000px;\n }\n\n .admin-wrapper .sidebar {\n padding-bottom: 45px;\n }\n}\n\n@media screen and (max-width: 600px) {\n .admin-wrapper .sidebar > ul > li > ul {\n max-width:500px;\n }\n\n .admin-wrapper {\n .sidebar {\n padding:0px;\n padding-bottom: 70px;\n width: 100%;\n height: auto;\n }\n .content-wrapper {\n overflow:auto;\n height:80%;\n height:calc(100% - 150px);\n }\n }\n}\n\n.flash-message {\n background-color:$win95-tooltip-yellow;\n color:black;\n border:1px solid black;\n border-radius:0px;\n position:absolute;\n top:0px;\n left:0px;\n width:100%;\n}\n\n.admin-wrapper table {\n background-color: white;\n @include win95-border-slight-inset();\n}\n\n.admin-wrapper .content h2,\n.simple_form .input.with_label .label_input > label,\n.admin-wrapper .content h6,\n.admin-wrapper .content > p,\n.admin-wrapper .content .muted-hint,\n.simple_form span.hint,\n.simple_form h4,\n.simple_form .check_boxes .checkbox label,\n.simple_form .input.with_label.boolean .label_input > label,\n.filters .filter-subset a,\n.simple_form .input.radio_buttons .radio label,\na.table-action-link,\na.table-action-link:hover,\n.simple_form .input.with_block_label > label,\n.simple_form p.hint {\n color:black;\n}\n\n.table > tbody > tr:nth-child(2n+1) > td,\n.table > tbody > tr:nth-child(2n+1) > th {\n background-color:white;\n}\n\n.simple_form input[type=text],\n.simple_form input[type=number],\n.simple_form input[type=email],\n.simple_form input[type=password],\n.simple_form textarea {\n color:black;\n background-color:white;\n @include win95-border-slight-inset();\n\n &:active, &:focus {\n background-color:white;\n }\n}\n\n.simple_form button,\n.simple_form .button,\n.simple_form .block-button\n{\n background: $win95-bg;\n @include win95-outset();\n color:black;\n font-weight: normal;\n\n &:hover {\n background: $win95-bg;\n }\n}\n\n.simple_form .warning, .table-form .warning\n{\n background: $win95-tooltip-yellow;\n color:black;\n box-shadow: unset;\n text-shadow:unset;\n border:1px solid black;\n\n a {\n color: blue;\n text-decoration:underline;\n }\n}\n\n.simple_form button.negative,\n.simple_form .button.negative,\n.simple_form .block-button.negative\n{\n background: $win95-bg;\n}\n\n.filters .filter-subset {\n border: 2px groove $win95-bg;\n padding:2px;\n}\n\n.filters .filter-subset a::before {\n content: \"\";\n background-color:white;\n border-radius:50%;\n border:2px solid black;\n border-top-color:#7f7f7f;\n border-left-color:#7f7f7f;\n border-bottom-color:#f5f5f5;\n border-right-color:#f5f5f5;\n width:12px;\n height:12px;\n display:inline-block;\n vertical-align:middle;\n margin-right:2px;\n}\n\n.filters .filter-subset a.selected::before {\n background-color:black;\n box-shadow: inset 0 0 0 3px white;\n}\n\n.filters .filter-subset a,\n.filters .filter-subset a:hover,\n.filters .filter-subset a.selected {\n color:black;\n border-bottom: 0px solid transparent;\n}\n","/* http://meyerweb.com/eric/tools/css/reset/\n v2.0 | 20110126\n License: none (public domain)\n*/\n\nhtml, body, div, span, applet, object, iframe,\nh1, h2, h3, h4, h5, h6, p, blockquote, pre,\na, abbr, acronym, address, big, cite, code,\ndel, dfn, em, img, ins, kbd, q, s, samp,\nsmall, strike, strong, sub, sup, tt, var,\nb, u, i, center,\ndl, dt, dd, ol, ul, li,\nfieldset, form, label, legend,\ntable, caption, tbody, tfoot, thead, tr, th, td,\narticle, aside, canvas, details, embed,\nfigure, figcaption, footer, header, hgroup,\nmenu, nav, output, ruby, section, summary,\ntime, mark, audio, video {\n margin: 0;\n padding: 0;\n border: 0;\n font-size: 100%;\n font: inherit;\n vertical-align: baseline;\n}\n\n/* HTML5 display-role reset for older browsers */\narticle, aside, details, figcaption, figure,\nfooter, header, hgroup, menu, nav, section {\n display: block;\n}\n\nbody {\n line-height: 1;\n}\n\nol, ul {\n list-style: none;\n}\n\nblockquote, q {\n quotes: none;\n}\n\nblockquote:before, blockquote:after,\nq:before, q:after {\n content: '';\n content: none;\n}\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\nhtml {\n scrollbar-color: lighten($ui-base-color, 4%) rgba($base-overlay-background, 0.1);\n}\n\n::-webkit-scrollbar {\n width: 12px;\n height: 12px;\n}\n\n::-webkit-scrollbar-thumb {\n background: lighten($ui-base-color, 4%);\n border: 0px none $base-border-color;\n border-radius: 50px;\n}\n\n::-webkit-scrollbar-thumb:hover {\n background: lighten($ui-base-color, 6%);\n}\n\n::-webkit-scrollbar-thumb:active {\n background: lighten($ui-base-color, 4%);\n}\n\n::-webkit-scrollbar-track {\n border: 0px none $base-border-color;\n border-radius: 0;\n background: rgba($base-overlay-background, 0.1);\n}\n\n::-webkit-scrollbar-track:hover {\n background: $ui-base-color;\n}\n\n::-webkit-scrollbar-track:active {\n background: $ui-base-color;\n}\n\n::-webkit-scrollbar-corner {\n background: transparent;\n}\n","// Commonly used web colors\n$black: #000000; // Black\n$white: #ffffff; // White\n$success-green: #79bd9a !default; // Padua\n$error-red: #df405a !default; // Cerise\n$warning-red: #ff5050 !default; // Sunset Orange\n$gold-star: #ca8f04 !default; // Dark Goldenrod\n\n$red-bookmark: $warning-red;\n\n// Pleroma-Dark colors\n$pleroma-bg: #121a24;\n$pleroma-fg: #182230;\n$pleroma-text: #b9b9ba;\n$pleroma-links: #d8a070;\n\n// Values from the classic Mastodon UI\n$classic-base-color: $pleroma-bg;\n$classic-primary-color: #9baec8;\n$classic-secondary-color: #d9e1e8;\n$classic-highlight-color: #d8a070;\n\n// Variables for defaults in UI\n$base-shadow-color: $black !default;\n$base-overlay-background: $black !default;\n$base-border-color: $white !default;\n$simple-background-color: $white !default;\n$valid-value-color: $success-green !default;\n$error-value-color: $error-red !default;\n\n// Tell UI to use selected colors\n$ui-base-color: $classic-base-color !default; // Darkest\n$ui-base-lighter-color: lighten($ui-base-color, 26%) !default; // Lighter darkest\n$ui-primary-color: $classic-primary-color !default; // Lighter\n$ui-secondary-color: $classic-secondary-color !default; // Lightest\n$ui-highlight-color: $classic-highlight-color !default;\n\n// Variables for texts\n$primary-text-color: $white !default;\n$darker-text-color: $ui-primary-color !default;\n$dark-text-color: $ui-base-lighter-color !default;\n$secondary-text-color: $ui-secondary-color !default;\n$highlight-text-color: $ui-highlight-color !default;\n$action-button-color: $ui-base-lighter-color !default;\n// For texts on inverted backgrounds\n$inverted-text-color: $ui-base-color !default;\n$lighter-text-color: $ui-base-lighter-color !default;\n$light-text-color: $ui-primary-color !default;\n\n// Language codes that uses CJK fonts\n$cjk-langs: ja, ko, zh-CN, zh-HK, zh-TW;\n\n// Variables for components\n$media-modal-media-max-width: 100%;\n// put margins on top and bottom of image to avoid the screen covered by image.\n$media-modal-media-max-height: 80%;\n\n$no-gap-breakpoint: 415px;\n\n$font-sans-serif: 'mastodon-font-sans-serif' !default;\n$font-display: 'mastodon-font-display' !default;\n$font-monospace: 'mastodon-font-monospace' !default;\n","@function hex-color($color) {\n @if type-of($color) == 'color' {\n $color: str-slice(ie-hex-str($color), 4);\n }\n\n @return '%23' + unquote($color);\n}\n\nbody {\n font-family: $font-sans-serif, sans-serif;\n background: darken($ui-base-color, 7%);\n font-size: 13px;\n line-height: 18px;\n font-weight: 400;\n color: $primary-text-color;\n text-rendering: optimizelegibility;\n font-feature-settings: \"kern\";\n text-size-adjust: none;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n -webkit-tap-highlight-color: transparent;\n\n &.system-font {\n // system-ui => standard property (Chrome/Android WebView 56+, Opera 43+, Safari 11+)\n // -apple-system => Safari <11 specific\n // BlinkMacSystemFont => Chrome <56 on macOS specific\n // Segoe UI => Windows 7/8/10\n // Oxygen => KDE\n // Ubuntu => Unity/Ubuntu\n // Cantarell => GNOME\n // Fira Sans => Firefox OS\n // Droid Sans => Older Androids (<4.0)\n // Helvetica Neue => Older macOS <10.11\n // $font-sans-serif => web-font (Roboto) fallback and newer Androids (>=4.0)\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Oxygen\", \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", $font-sans-serif, sans-serif;\n }\n\n &.app-body {\n padding: 0;\n\n &.layout-single-column {\n height: auto;\n min-height: 100vh;\n overflow-y: scroll;\n }\n\n &.layout-multiple-columns {\n position: absolute;\n width: 100%;\n height: 100%;\n }\n\n &.with-modals--active {\n overflow-y: hidden;\n }\n }\n\n &.lighter {\n background: $ui-base-color;\n }\n\n &.with-modals {\n overflow-x: hidden;\n overflow-y: scroll;\n\n &--active {\n overflow-y: hidden;\n }\n }\n\n &.player {\n text-align: center;\n }\n\n &.embed {\n background: lighten($ui-base-color, 4%);\n margin: 0;\n padding-bottom: 0;\n\n .container {\n position: absolute;\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n }\n\n &.admin {\n background: darken($ui-base-color, 4%);\n padding: 0;\n }\n\n &.error {\n position: absolute;\n text-align: center;\n color: $darker-text-color;\n background: $ui-base-color;\n width: 100%;\n height: 100%;\n padding: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n\n .dialog {\n vertical-align: middle;\n margin: 20px;\n\n &__illustration {\n img {\n display: block;\n max-width: 470px;\n width: 100%;\n height: auto;\n margin-top: -120px;\n }\n }\n\n h1 {\n font-size: 20px;\n line-height: 28px;\n font-weight: 400;\n }\n }\n }\n}\n\nbutton {\n font-family: inherit;\n cursor: pointer;\n\n &:focus {\n outline: none;\n }\n}\n\n.app-holder {\n &,\n & > div,\n & > noscript {\n display: flex;\n width: 100%;\n align-items: center;\n justify-content: center;\n outline: 0 !important;\n }\n\n & > noscript {\n height: 100vh;\n }\n}\n\n.layout-single-column .app-holder {\n &,\n & > div {\n min-height: 100vh;\n }\n}\n\n.layout-multiple-columns .app-holder {\n &,\n & > div {\n height: 100%;\n }\n}\n\n.error-boundary,\n.app-holder noscript {\n flex-direction: column;\n font-size: 16px;\n font-weight: 400;\n line-height: 1.7;\n color: lighten($error-red, 4%);\n text-align: center;\n\n & > div {\n max-width: 500px;\n }\n\n p {\n margin-bottom: .85em;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: $highlight-text-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n &__footer {\n color: $dark-text-color;\n font-size: 13px;\n\n a {\n color: $dark-text-color;\n }\n }\n\n button {\n display: inline;\n border: 0;\n background: transparent;\n color: $dark-text-color;\n font: inherit;\n padding: 0;\n margin: 0;\n line-height: inherit;\n cursor: pointer;\n outline: 0;\n transition: color 300ms linear;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n\n &.copied {\n color: $valid-value-color;\n transition: none;\n }\n }\n}\n",".container-alt {\n width: 700px;\n margin: 0 auto;\n margin-top: 40px;\n\n @media screen and (max-width: 740px) {\n width: 100%;\n margin: 0;\n }\n}\n\n.logo-container {\n margin: 100px auto 50px;\n\n @media screen and (max-width: 500px) {\n margin: 40px auto 0;\n }\n\n h1 {\n display: flex;\n justify-content: center;\n align-items: center;\n\n svg {\n fill: $primary-text-color;\n height: 42px;\n margin-right: 10px;\n }\n\n a {\n display: flex;\n justify-content: center;\n align-items: center;\n color: $primary-text-color;\n text-decoration: none;\n outline: 0;\n padding: 12px 16px;\n line-height: 32px;\n font-family: $font-display, sans-serif;\n font-weight: 500;\n font-size: 14px;\n }\n }\n}\n\n.compose-standalone {\n .compose-form {\n width: 400px;\n margin: 0 auto;\n padding: 20px 0;\n margin-top: 40px;\n box-sizing: border-box;\n\n @media screen and (max-width: 400px) {\n width: 100%;\n margin-top: 0;\n padding: 20px;\n }\n }\n}\n\n.account-header {\n width: 400px;\n margin: 0 auto;\n display: flex;\n font-size: 13px;\n line-height: 18px;\n box-sizing: border-box;\n padding: 20px 0;\n padding-bottom: 0;\n margin-bottom: -30px;\n margin-top: 40px;\n\n @media screen and (max-width: 440px) {\n width: 100%;\n margin: 0;\n margin-bottom: 10px;\n padding: 20px;\n padding-bottom: 0;\n }\n\n .avatar {\n width: 40px;\n height: 40px;\n margin-right: 8px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n }\n }\n\n .name {\n flex: 1 1 auto;\n color: $secondary-text-color;\n width: calc(100% - 88px);\n\n .username {\n display: block;\n font-weight: 500;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n }\n\n .logout-link {\n display: block;\n font-size: 32px;\n line-height: 40px;\n margin-left: 8px;\n }\n}\n\n.grid-3 {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: 3fr 1fr;\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-column: 1 / 3;\n grid-row: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 2;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1 / 3;\n grid-row: 3;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n grid-template-columns: minmax(0, 100%);\n\n .column-0 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .column-2 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1;\n grid-row: 4;\n }\n }\n}\n\n.grid-4 {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: repeat(4, minmax(0, 1fr));\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-column: 1 / 5;\n grid-row: 1;\n }\n\n .column-1 {\n grid-column: 1 / 4;\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 4;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 2 / 5;\n grid-row: 3;\n }\n\n .column-4 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .landing-page__call-to-action {\n min-height: 100%;\n }\n\n .flash-message {\n margin-bottom: 10px;\n }\n\n @media screen and (max-width: 738px) {\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n .landing-page__call-to-action {\n padding: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .row__information-board {\n width: 100%;\n justify-content: center;\n align-items: center;\n }\n\n .row__mascot {\n display: none;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n grid-template-columns: minmax(0, 100%);\n\n .column-0 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-column: 1;\n grid-row: 3;\n }\n\n .column-2 {\n grid-column: 1;\n grid-row: 2;\n }\n\n .column-3 {\n grid-column: 1;\n grid-row: 5;\n }\n\n .column-4 {\n grid-column: 1;\n grid-row: 4;\n }\n }\n}\n\n.public-layout {\n @media screen and (max-width: $no-gap-breakpoint) {\n padding-top: 48px;\n }\n\n .container {\n max-width: 960px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding: 0;\n }\n }\n\n .header {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n height: 48px;\n margin: 10px 0;\n display: flex;\n align-items: stretch;\n justify-content: center;\n flex-wrap: nowrap;\n overflow: hidden;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n position: fixed;\n width: 100%;\n top: 0;\n left: 0;\n margin: 0;\n border-radius: 0;\n box-shadow: none;\n z-index: 110;\n }\n\n & > div {\n flex: 1 1 33.3%;\n min-height: 1px;\n }\n\n .nav-left {\n display: flex;\n align-items: stretch;\n justify-content: flex-start;\n flex-wrap: nowrap;\n }\n\n .nav-center {\n display: flex;\n align-items: stretch;\n justify-content: center;\n flex-wrap: nowrap;\n }\n\n .nav-right {\n display: flex;\n align-items: stretch;\n justify-content: flex-end;\n flex-wrap: nowrap;\n }\n\n .brand {\n display: block;\n padding: 15px;\n\n svg {\n display: block;\n height: 18px;\n width: auto;\n position: relative;\n bottom: -2px;\n fill: $primary-text-color;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n height: 20px;\n }\n }\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 12%);\n }\n }\n\n .nav-link {\n display: flex;\n align-items: center;\n padding: 0 1rem;\n font-size: 12px;\n font-weight: 500;\n text-decoration: none;\n color: $darker-text-color;\n white-space: nowrap;\n text-align: center;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n color: $primary-text-color;\n }\n\n @media screen and (max-width: 550px) {\n &.optional {\n display: none;\n }\n }\n }\n\n .nav-button {\n background: lighten($ui-base-color, 16%);\n margin: 8px;\n margin-left: 0;\n border-radius: 4px;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n background: lighten($ui-base-color, 20%);\n }\n }\n }\n\n $no-columns-breakpoint: 600px;\n\n .grid {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(300px, 3fr) minmax(298px, 1fr);\n grid-auto-columns: 25%;\n grid-auto-rows: max-content;\n\n .column-0 {\n grid-row: 1;\n grid-column: 1;\n }\n\n .column-1 {\n grid-row: 1;\n grid-column: 2;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n grid-template-columns: 100%;\n grid-gap: 0;\n\n .column-1 {\n display: none;\n }\n }\n }\n\n .directory__card {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n\n .page-header {\n @media screen and (max-width: $no-gap-breakpoint) {\n border-bottom: 0;\n }\n }\n\n .public-account-header {\n overflow: hidden;\n margin-bottom: 10px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &.inactive {\n opacity: 0.5;\n\n .public-account-header__image,\n .avatar {\n filter: grayscale(100%);\n }\n\n .logo-button {\n background-color: $secondary-text-color;\n }\n }\n\n &__image {\n border-radius: 4px 4px 0 0;\n overflow: hidden;\n height: 300px;\n position: relative;\n background: darken($ui-base-color, 12%);\n\n &::after {\n content: \"\";\n display: block;\n position: absolute;\n width: 100%;\n height: 100%;\n box-shadow: inset 0 -1px 1px 1px rgba($base-shadow-color, 0.15);\n top: 0;\n left: 0;\n }\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 4px 4px 0 0;\n }\n\n @media screen and (max-width: 600px) {\n height: 200px;\n }\n }\n\n &--no-bar {\n margin-bottom: 0;\n\n .public-account-header__image,\n .public-account-header__image img {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n box-shadow: none;\n\n &__image::after {\n display: none;\n }\n\n &__image,\n &__image img {\n border-radius: 0;\n }\n }\n\n &__bar {\n position: relative;\n margin-top: -80px;\n display: flex;\n justify-content: flex-start;\n\n &::before {\n content: \"\";\n display: block;\n background: lighten($ui-base-color, 4%);\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: 60px;\n border-radius: 0 0 4px 4px;\n z-index: -1;\n }\n\n .avatar {\n display: block;\n width: 120px;\n height: 120px;\n padding-left: 20px - 4px;\n flex: 0 0 auto;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 50%;\n border: 4px solid lighten($ui-base-color, 4%);\n background: darken($ui-base-color, 8%);\n }\n }\n\n @media screen and (max-width: 600px) {\n margin-top: 0;\n background: lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n padding: 5px;\n\n &::before {\n display: none;\n }\n\n .avatar {\n width: 48px;\n height: 48px;\n padding: 7px 0;\n padding-left: 10px;\n\n img {\n border: 0;\n border-radius: 4px;\n }\n\n @media screen and (max-width: 360px) {\n display: none;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n flex-wrap: wrap;\n }\n }\n\n &__tabs {\n flex: 1 1 auto;\n margin-left: 20px;\n\n &__name {\n padding-top: 20px;\n padding-bottom: 8px;\n\n h1 {\n font-size: 20px;\n line-height: 18px * 1.5;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n text-shadow: 1px 1px 1px $base-shadow-color;\n\n small {\n display: block;\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n @media screen and (max-width: 600px) {\n margin-left: 15px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n &__name {\n padding-top: 0;\n padding-bottom: 0;\n\n h1 {\n font-size: 16px;\n line-height: 24px;\n text-shadow: none;\n\n small {\n color: $darker-text-color;\n }\n }\n }\n }\n\n &__tabs {\n display: flex;\n justify-content: flex-start;\n align-items: stretch;\n height: 58px;\n\n .details-counters {\n display: flex;\n flex-direction: row;\n min-width: 300px;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n .details-counters {\n display: none;\n }\n }\n\n .counter {\n min-width: 33.3%;\n box-sizing: border-box;\n flex: 0 0 auto;\n color: $darker-text-color;\n padding: 10px;\n border-right: 1px solid lighten($ui-base-color, 4%);\n cursor: default;\n text-align: center;\n position: relative;\n\n a {\n display: block;\n }\n\n &:last-child {\n border-right: 0;\n }\n\n &::after {\n display: block;\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n border-bottom: 4px solid $ui-primary-color;\n opacity: 0.5;\n transition: all 400ms ease;\n }\n\n &.active {\n &::after {\n border-bottom: 4px solid $highlight-text-color;\n opacity: 1;\n }\n\n &.inactive::after {\n border-bottom-color: $secondary-text-color;\n }\n }\n\n &:hover {\n &::after {\n opacity: 1;\n transition-duration: 100ms;\n }\n }\n\n a {\n text-decoration: none;\n color: inherit;\n }\n\n .counter-label {\n font-size: 12px;\n display: block;\n }\n\n .counter-number {\n font-weight: 500;\n font-size: 18px;\n margin-bottom: 5px;\n color: $primary-text-color;\n font-family: $font-display, sans-serif;\n }\n }\n\n .spacer {\n flex: 1 1 auto;\n height: 1px;\n }\n\n &__buttons {\n padding: 7px 8px;\n }\n }\n }\n\n &__extra {\n display: none;\n margin-top: 4px;\n\n .public-account-bio {\n border-radius: 0;\n box-shadow: none;\n background: transparent;\n margin: 0 -5px;\n\n .account__header__fields {\n border-top: 1px solid lighten($ui-base-color, 12%);\n }\n\n .roles {\n display: none;\n }\n }\n\n &__links {\n margin-top: -15px;\n font-size: 14px;\n color: $darker-text-color;\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n padding: 15px;\n font-weight: 500;\n\n strong {\n font-weight: 700;\n color: $primary-text-color;\n }\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n flex: 100%;\n }\n }\n }\n\n .account__section-headline {\n border-radius: 4px 4px 0 0;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n }\n\n .detailed-status__meta {\n margin-top: 25px;\n }\n\n .public-account-bio {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n overflow: hidden;\n margin-bottom: 10px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n box-shadow: none;\n margin-bottom: 0;\n border-radius: 0;\n }\n\n .account__header__fields {\n margin: 0;\n border-top: 0;\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n\n .account__header__content {\n padding: 20px;\n padding-bottom: 0;\n color: $primary-text-color;\n }\n\n &__extra,\n .roles {\n padding: 20px;\n font-size: 14px;\n color: $darker-text-color;\n }\n\n .roles {\n padding-bottom: 0;\n }\n }\n\n .directory__list {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: block;\n }\n\n .icon-button {\n font-size: 18px;\n }\n }\n\n .directory__card {\n margin-bottom: 0;\n }\n\n .card-grid {\n display: flex;\n flex-wrap: wrap;\n min-width: 100%;\n margin: 0 -5px;\n\n & > div {\n box-sizing: border-box;\n flex: 1 0 auto;\n width: 300px;\n padding: 0 5px;\n margin-bottom: 10px;\n max-width: 33.333%;\n\n @media screen and (max-width: 900px) {\n max-width: 50%;\n }\n\n @media screen and (max-width: 600px) {\n max-width: 100%;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin: 0;\n border-top: 1px solid lighten($ui-base-color, 8%);\n\n & > div {\n width: 100%;\n padding: 0;\n margin-bottom: 0;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &:last-child {\n border-bottom: 0;\n }\n\n .card__bar {\n background: $ui-base-color;\n\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n }\n }\n }\n }\n}\n",".no-list {\n list-style: none;\n\n li {\n display: inline-block;\n margin: 0 5px;\n }\n}\n\n.recovery-codes {\n list-style: none;\n margin: 0 auto;\n\n li {\n font-size: 125%;\n line-height: 1.5;\n letter-spacing: 1px;\n }\n}\n",".public-layout {\n .footer {\n text-align: left;\n padding-top: 20px;\n padding-bottom: 60px;\n font-size: 12px;\n color: lighten($ui-base-color, 34%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding-left: 20px;\n padding-right: 20px;\n }\n\n .grid {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: 1fr 1fr 2fr 1fr 1fr;\n\n .column-0 {\n grid-column: 1;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-1 {\n grid-column: 2;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-2 {\n grid-column: 3;\n grid-row: 1;\n min-width: 0;\n text-align: center;\n\n h4 a {\n color: lighten($ui-base-color, 34%);\n }\n }\n\n .column-3 {\n grid-column: 4;\n grid-row: 1;\n min-width: 0;\n }\n\n .column-4 {\n grid-column: 5;\n grid-row: 1;\n min-width: 0;\n }\n\n @media screen and (max-width: 690px) {\n grid-template-columns: 1fr 2fr 1fr;\n\n .column-0,\n .column-1 {\n grid-column: 1;\n }\n\n .column-1 {\n grid-row: 2;\n }\n\n .column-2 {\n grid-column: 2;\n }\n\n .column-3,\n .column-4 {\n grid-column: 3;\n }\n\n .column-4 {\n grid-row: 2;\n }\n }\n\n @media screen and (max-width: 600px) {\n .column-1 {\n display: block;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n .column-0,\n .column-1,\n .column-3,\n .column-4 {\n display: none;\n }\n }\n }\n\n h4 {\n text-transform: uppercase;\n font-weight: 700;\n margin-bottom: 8px;\n color: $darker-text-color;\n\n a {\n color: inherit;\n text-decoration: none;\n }\n }\n\n ul a {\n text-decoration: none;\n color: lighten($ui-base-color, 34%);\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n\n .brand {\n svg {\n display: block;\n height: 36px;\n width: auto;\n margin: 0 auto;\n fill: lighten($ui-base-color, 34%);\n }\n\n &:hover,\n &:focus,\n &:active {\n svg {\n fill: lighten($ui-base-color, 38%);\n }\n }\n }\n }\n}\n",".compact-header {\n h1 {\n font-size: 24px;\n line-height: 28px;\n color: $darker-text-color;\n font-weight: 500;\n margin-bottom: 20px;\n padding: 0 10px;\n word-wrap: break-word;\n\n @media screen and (max-width: 740px) {\n text-align: center;\n padding: 20px 10px 0;\n }\n\n a {\n color: inherit;\n text-decoration: none;\n }\n\n small {\n font-weight: 400;\n color: $secondary-text-color;\n }\n\n img {\n display: inline-block;\n margin-bottom: -5px;\n margin-right: 15px;\n width: 36px;\n height: 36px;\n }\n }\n}\n",".hero-widget {\n margin-bottom: 10px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &__img {\n width: 100%;\n position: relative;\n overflow: hidden;\n border-radius: 4px 4px 0 0;\n background: $base-shadow-color;\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n border-radius: 4px 4px 0 0;\n }\n }\n\n &__text {\n background: $ui-base-color;\n padding: 20px;\n border-radius: 0 0 4px 4px;\n font-size: 15px;\n color: $darker-text-color;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n p {\n margin-bottom: 20px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n em {\n display: inline;\n margin: 0;\n padding: 0;\n font-weight: 700;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n color: lighten($darker-text-color, 10%);\n }\n\n a {\n color: $secondary-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n}\n\n.endorsements-widget {\n margin-bottom: 10px;\n padding-bottom: 10px;\n\n h4 {\n padding: 10px;\n text-transform: uppercase;\n font-weight: 700;\n font-size: 13px;\n color: $darker-text-color;\n }\n\n .account {\n padding: 10px 0;\n\n &:last-child {\n border-bottom: 0;\n }\n\n .account__display-name {\n display: flex;\n align-items: center;\n }\n\n .account__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n }\n\n .trends__item {\n padding: 10px;\n }\n}\n\n.trends-widget {\n h4 {\n color: $darker-text-color;\n }\n}\n\n.box-widget {\n padding: 20px;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n}\n\n.placeholder-widget {\n padding: 16px;\n border-radius: 4px;\n border: 2px dashed $dark-text-color;\n text-align: center;\n color: $darker-text-color;\n margin-bottom: 10px;\n}\n\n.contact-widget {\n min-height: 100%;\n font-size: 15px;\n color: $darker-text-color;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n padding: 0;\n\n h4 {\n padding: 10px;\n text-transform: uppercase;\n font-weight: 700;\n font-size: 13px;\n color: $darker-text-color;\n }\n\n .account {\n border-bottom: 0;\n padding: 10px 0;\n padding-top: 5px;\n }\n\n & > a {\n display: inline-block;\n padding: 10px;\n padding-top: 0;\n color: $darker-text-color;\n text-decoration: none;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.moved-account-widget {\n padding: 15px;\n padding-bottom: 20px;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n color: $secondary-text-color;\n font-weight: 400;\n margin-bottom: 10px;\n\n strong,\n a {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n color: inherit;\n text-decoration: underline;\n\n &.mention {\n text-decoration: none;\n\n span {\n text-decoration: none;\n }\n\n &:focus,\n &:hover,\n &:active {\n text-decoration: none;\n\n span {\n text-decoration: underline;\n }\n }\n }\n }\n\n &__message {\n margin-bottom: 15px;\n\n .fa {\n margin-right: 5px;\n color: $darker-text-color;\n }\n }\n\n &__card {\n .detailed-status__display-avatar {\n position: relative;\n cursor: pointer;\n }\n\n .detailed-status__display-name {\n margin-bottom: 0;\n text-decoration: none;\n\n span {\n font-weight: 400;\n }\n }\n }\n}\n\n.memoriam-widget {\n padding: 20px;\n border-radius: 4px;\n background: $base-shadow-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n font-size: 14px;\n color: $darker-text-color;\n margin-bottom: 10px;\n}\n\n.page-header {\n background: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n padding: 60px 15px;\n text-align: center;\n margin: 10px 0;\n\n h1 {\n color: $primary-text-color;\n font-size: 36px;\n line-height: 1.1;\n font-weight: 700;\n margin-bottom: 10px;\n }\n\n p {\n font-size: 15px;\n color: $darker-text-color;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-top: 0;\n background: lighten($ui-base-color, 4%);\n\n h1 {\n font-size: 24px;\n }\n }\n}\n\n.directory {\n background: $ui-base-color;\n border-radius: 4px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n &__tag {\n box-sizing: border-box;\n margin-bottom: 10px;\n\n & > a,\n & > div {\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: $ui-base-color;\n border-radius: 4px;\n padding: 15px;\n text-decoration: none;\n color: inherit;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n }\n\n & > a {\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 8%);\n }\n }\n\n &.active > a {\n background: $ui-highlight-color;\n cursor: default;\n }\n\n &.disabled > div {\n opacity: 0.5;\n cursor: default;\n }\n\n h4 {\n flex: 1 1 auto;\n font-size: 18px;\n font-weight: 700;\n color: $primary-text-color;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n .fa {\n color: $darker-text-color;\n }\n\n small {\n display: block;\n font-weight: 400;\n font-size: 15px;\n margin-top: 8px;\n color: $darker-text-color;\n }\n }\n\n &.active h4 {\n &,\n .fa,\n small,\n .trends__item__current {\n color: $primary-text-color;\n }\n }\n\n .avatar-stack {\n flex: 0 0 auto;\n width: (36px + 4px) * 3;\n }\n\n &.active .avatar-stack .account__avatar {\n border-color: $ui-highlight-color;\n }\n\n .trends__item__current {\n padding-right: 0;\n }\n }\n}\n\n.avatar-stack {\n display: flex;\n justify-content: flex-end;\n\n .account__avatar {\n flex: 0 0 auto;\n width: 36px;\n height: 36px;\n border-radius: 50%;\n position: relative;\n margin-left: -10px;\n background: darken($ui-base-color, 8%);\n border: 2px solid $ui-base-color;\n\n &:nth-child(1) {\n z-index: 1;\n }\n\n &:nth-child(2) {\n z-index: 2;\n }\n\n &:nth-child(3) {\n z-index: 3;\n }\n }\n}\n\n.accounts-table {\n width: 100%;\n\n .account {\n padding: 0;\n border: 0;\n }\n\n strong {\n font-weight: 700;\n }\n\n thead th {\n text-align: center;\n text-transform: uppercase;\n color: $darker-text-color;\n font-weight: 700;\n padding: 10px;\n\n &:first-child {\n text-align: left;\n }\n }\n\n tbody td {\n padding: 15px 0;\n vertical-align: middle;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n tbody tr:last-child td {\n border-bottom: 0;\n }\n\n &__count {\n width: 120px;\n text-align: center;\n font-size: 15px;\n font-weight: 500;\n color: $primary-text-color;\n\n small {\n display: block;\n color: $darker-text-color;\n font-weight: 400;\n font-size: 14px;\n }\n }\n\n &__comment {\n width: 50%;\n vertical-align: initial !important;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n tbody td.optional {\n display: none;\n }\n }\n}\n\n.moved-account-widget,\n.memoriam-widget,\n.box-widget,\n.contact-widget,\n.landing-page__information.contact-widget,\n.directory,\n.page-header {\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n box-shadow: none;\n border-radius: 0;\n }\n}\n\n$maximum-width: 1235px;\n$fluid-breakpoint: $maximum-width + 20px;\n\n.statuses-grid {\n min-height: 600px;\n\n @media screen and (max-width: 640px) {\n width: 100% !important; // Masonry layout is unnecessary at this width\n }\n\n &__item {\n width: (960px - 20px) / 3;\n\n @media screen and (max-width: $fluid-breakpoint) {\n width: (940px - 20px) / 3;\n }\n\n @media screen and (max-width: 640px) {\n width: 100%;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n width: 100vw;\n }\n }\n\n .detailed-status {\n border-radius: 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 1px solid lighten($ui-base-color, 16%);\n }\n\n &.compact {\n .detailed-status__meta {\n margin-top: 15px;\n }\n\n .status__content {\n font-size: 15px;\n line-height: 20px;\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n .status__content__spoiler-link {\n line-height: 20px;\n margin: 0;\n }\n }\n\n .media-gallery,\n .status-card,\n .video-player {\n margin-top: 15px;\n }\n }\n }\n}\n\n.notice-widget {\n margin-bottom: 10px;\n color: $darker-text-color;\n\n p {\n margin-bottom: 10px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n font-size: 14px;\n line-height: 20px;\n }\n}\n\n.notice-widget,\n.placeholder-widget {\n a {\n text-decoration: none;\n font-weight: 500;\n color: $ui-highlight-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.table-of-contents {\n background: darken($ui-base-color, 4%);\n min-height: 100%;\n font-size: 14px;\n border-radius: 4px;\n\n li a {\n display: block;\n font-weight: 500;\n padding: 15px;\n overflow: hidden;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n text-decoration: none;\n color: $primary-text-color;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n\n li:last-child a {\n border-bottom: 0;\n }\n\n li ul {\n padding-left: 20px;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n }\n}\n","$no-columns-breakpoint: 600px;\n\ncode {\n font-family: $font-monospace, monospace;\n font-weight: 400;\n}\n\n.form-container {\n max-width: 400px;\n padding: 20px;\n margin: 0 auto;\n}\n\n.simple_form {\n .input {\n margin-bottom: 15px;\n overflow: hidden;\n\n &.hidden {\n margin: 0;\n }\n\n &.radio_buttons {\n .radio {\n margin-bottom: 15px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .radio > label {\n position: relative;\n padding-left: 28px;\n\n input {\n position: absolute;\n top: -2px;\n left: 0;\n }\n }\n }\n\n &.boolean {\n position: relative;\n margin-bottom: 0;\n\n .label_input > label {\n font-family: inherit;\n font-size: 14px;\n padding-top: 5px;\n color: $primary-text-color;\n display: block;\n width: auto;\n }\n\n .label_input,\n .hint {\n padding-left: 28px;\n }\n\n .label_input__wrapper {\n position: static;\n }\n\n label.checkbox {\n position: absolute;\n top: 2px;\n left: 0;\n }\n\n label a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: none;\n }\n }\n\n .recommended {\n position: absolute;\n margin: 0 4px;\n margin-top: -2px;\n }\n }\n }\n\n .row {\n display: flex;\n margin: 0 -5px;\n\n .input {\n box-sizing: border-box;\n flex: 1 1 auto;\n width: 50%;\n padding: 0 5px;\n }\n }\n\n .hint {\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n }\n\n code {\n border-radius: 3px;\n padding: 0.2em 0.4em;\n background: darken($ui-base-color, 12%);\n }\n\n li {\n list-style: disc;\n margin-left: 18px;\n }\n }\n\n ul.hint {\n margin-bottom: 15px;\n }\n\n span.hint {\n display: block;\n font-size: 12px;\n margin-top: 4px;\n }\n\n p.hint {\n margin-bottom: 15px;\n color: $darker-text-color;\n\n &.subtle-hint {\n text-align: center;\n font-size: 12px;\n line-height: 18px;\n margin-top: 15px;\n margin-bottom: 0;\n }\n }\n\n .card {\n margin-bottom: 15px;\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n .input.with_floating_label {\n .label_input {\n display: flex;\n\n & > label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 500;\n min-width: 150px;\n flex: 0 0 auto;\n }\n\n input,\n select {\n flex: 1 1 auto;\n }\n }\n\n &.select .hint {\n margin-top: 6px;\n margin-left: 150px;\n }\n }\n\n .input.with_label {\n .label_input > label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: block;\n margin-bottom: 8px;\n word-wrap: break-word;\n font-weight: 500;\n }\n\n .hint {\n margin-top: 6px;\n }\n\n ul {\n flex: 390px;\n }\n }\n\n .input.with_block_label {\n max-width: none;\n\n & > label {\n font-family: inherit;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n font-weight: 500;\n padding-top: 5px;\n }\n\n .hint {\n margin-bottom: 15px;\n }\n\n ul {\n columns: 2;\n }\n }\n\n .input.datetime .label_input select {\n display: inline-block;\n width: auto;\n flex: 0;\n }\n\n .required abbr {\n text-decoration: none;\n color: lighten($error-value-color, 12%);\n }\n\n .fields-group {\n margin-bottom: 25px;\n\n .input:last-child {\n margin-bottom: 0;\n }\n }\n\n .fields-row {\n display: flex;\n margin: 0 -10px;\n padding-top: 5px;\n margin-bottom: 25px;\n\n .input {\n max-width: none;\n }\n\n &__column {\n box-sizing: border-box;\n padding: 0 10px;\n flex: 1 1 auto;\n min-height: 1px;\n\n &-6 {\n max-width: 50%;\n }\n\n .actions {\n margin-top: 27px;\n }\n }\n\n .fields-group:last-child,\n .fields-row__column.fields-group {\n margin-bottom: 0;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n margin-bottom: 0;\n\n &__column {\n max-width: none;\n }\n\n .fields-group:last-child,\n .fields-row__column.fields-group,\n .fields-row__column {\n margin-bottom: 25px;\n }\n }\n }\n\n .input.radio_buttons .radio label {\n margin-bottom: 5px;\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: block;\n width: auto;\n }\n\n .check_boxes {\n .checkbox {\n label {\n font-family: inherit;\n font-size: 14px;\n color: $primary-text-color;\n display: inline-block;\n width: auto;\n position: relative;\n padding-top: 5px;\n padding-left: 25px;\n flex: 1 1 auto;\n }\n\n input[type=checkbox] {\n position: absolute;\n left: 0;\n top: 5px;\n margin: 0;\n }\n }\n }\n\n .input.static .label_input__wrapper {\n font-size: 16px;\n padding: 10px;\n border: 1px solid $dark-text-color;\n border-radius: 4px;\n }\n\n input[type=text],\n input[type=number],\n input[type=email],\n input[type=password],\n textarea {\n box-sizing: border-box;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n width: 100%;\n outline: 0;\n font-family: inherit;\n resize: vertical;\n background: darken($ui-base-color, 10%);\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n padding: 10px;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &:invalid {\n box-shadow: none;\n }\n\n &:focus:invalid:not(:placeholder-shown) {\n border-color: lighten($error-red, 12%);\n }\n\n &:required:valid {\n border-color: $valid-value-color;\n }\n\n &:hover {\n border-color: darken($ui-base-color, 20%);\n }\n\n &:active,\n &:focus {\n border-color: $highlight-text-color;\n background: darken($ui-base-color, 8%);\n }\n }\n\n .input.field_with_errors {\n label {\n color: lighten($error-red, 12%);\n }\n\n input[type=text],\n input[type=number],\n input[type=email],\n input[type=password],\n textarea,\n select {\n border-color: lighten($error-red, 12%);\n }\n\n .error {\n display: block;\n font-weight: 500;\n color: lighten($error-red, 12%);\n margin-top: 4px;\n }\n }\n\n .input.disabled {\n opacity: 0.5;\n }\n\n .actions {\n margin-top: 30px;\n display: flex;\n\n &.actions--top {\n margin-top: 0;\n margin-bottom: 30px;\n }\n }\n\n button,\n .button,\n .block-button {\n display: block;\n width: 100%;\n border: 0;\n border-radius: 4px;\n background: $ui-highlight-color;\n color: $primary-text-color;\n font-size: 18px;\n line-height: inherit;\n height: auto;\n padding: 10px;\n text-transform: uppercase;\n text-decoration: none;\n text-align: center;\n box-sizing: border-box;\n cursor: pointer;\n font-weight: 500;\n outline: 0;\n margin-bottom: 10px;\n margin-right: 10px;\n\n &:last-child {\n margin-right: 0;\n }\n\n &:hover {\n background-color: lighten($ui-highlight-color, 5%);\n }\n\n &:active,\n &:focus {\n background-color: darken($ui-highlight-color, 5%);\n }\n\n &:disabled:hover {\n background-color: $ui-primary-color;\n }\n\n &.negative {\n background: $error-value-color;\n\n &:hover {\n background-color: lighten($error-value-color, 5%);\n }\n\n &:active,\n &:focus {\n background-color: darken($error-value-color, 5%);\n }\n }\n }\n\n select {\n appearance: none;\n box-sizing: border-box;\n font-size: 16px;\n color: $primary-text-color;\n display: block;\n width: 100%;\n outline: 0;\n font-family: inherit;\n resize: vertical;\n background: darken($ui-base-color, 10%) url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center / auto 16px;\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n padding-left: 10px;\n padding-right: 30px;\n height: 41px;\n }\n\n h4 {\n margin-bottom: 15px !important;\n }\n\n .label_input {\n &__wrapper {\n position: relative;\n }\n\n &__append {\n position: absolute;\n right: 3px;\n top: 1px;\n padding: 10px;\n padding-bottom: 9px;\n font-size: 16px;\n color: $dark-text-color;\n font-family: inherit;\n pointer-events: none;\n cursor: default;\n max-width: 140px;\n white-space: nowrap;\n overflow: hidden;\n\n &::after {\n content: '';\n display: block;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 1px;\n width: 5px;\n background-image: linear-gradient(to right, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));\n }\n }\n }\n\n &__overlay-area {\n position: relative;\n\n &__blurred form {\n filter: blur(2px);\n }\n\n &__overlay {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n background: rgba($ui-base-color, 0.65);\n border-radius: 4px;\n margin-left: -4px;\n margin-top: -4px;\n padding: 4px;\n\n &__content {\n text-align: center;\n\n &.rich-formatting {\n &,\n p {\n color: $primary-text-color;\n }\n }\n }\n }\n }\n}\n\n.block-icon {\n display: block;\n margin: 0 auto;\n margin-bottom: 10px;\n font-size: 24px;\n}\n\n.flash-message {\n background: lighten($ui-base-color, 8%);\n color: $darker-text-color;\n border-radius: 4px;\n padding: 15px 10px;\n margin-bottom: 30px;\n text-align: center;\n\n &.notice {\n border: 1px solid rgba($valid-value-color, 0.5);\n background: rgba($valid-value-color, 0.25);\n color: $valid-value-color;\n }\n\n &.alert {\n border: 1px solid rgba($error-value-color, 0.5);\n background: rgba($error-value-color, 0.25);\n color: $error-value-color;\n }\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n\n &:hover {\n color: $primary-text-color;\n text-decoration: underline;\n }\n }\n\n p {\n margin-bottom: 15px;\n }\n\n .oauth-code {\n outline: 0;\n box-sizing: border-box;\n display: block;\n width: 100%;\n border: 0;\n padding: 10px;\n font-family: $font-monospace, monospace;\n background: $ui-base-color;\n color: $primary-text-color;\n font-size: 14px;\n margin: 0;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n @media screen and (max-width: 740px) and (min-width: 441px) {\n margin-top: 40px;\n }\n}\n\n.form-footer {\n margin-top: 30px;\n text-align: center;\n\n a {\n color: $darker-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.quick-nav {\n list-style: none;\n margin-bottom: 25px;\n font-size: 14px;\n\n li {\n display: inline-block;\n margin-right: 10px;\n }\n\n a {\n color: $highlight-text-color;\n text-transform: uppercase;\n text-decoration: none;\n font-weight: 700;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($highlight-text-color, 8%);\n }\n }\n}\n\n.oauth-prompt,\n.follow-prompt {\n margin-bottom: 30px;\n color: $darker-text-color;\n\n h2 {\n font-size: 16px;\n margin-bottom: 30px;\n text-align: center;\n }\n\n strong {\n color: $secondary-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n @media screen and (max-width: 740px) and (min-width: 441px) {\n margin-top: 40px;\n }\n}\n\n.qr-wrapper {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n}\n\n.qr-code {\n flex: 0 0 auto;\n background: $simple-background-color;\n padding: 4px;\n margin: 0 10px 20px 0;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n display: inline-block;\n\n svg {\n display: block;\n margin: 0;\n }\n}\n\n.qr-alternative {\n margin-bottom: 20px;\n color: $secondary-text-color;\n flex: 150px;\n\n samp {\n display: block;\n font-size: 14px;\n }\n}\n\n.table-form {\n p {\n margin-bottom: 15px;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n }\n}\n\n.simple_form,\n.table-form {\n .warning {\n box-sizing: border-box;\n background: rgba($error-value-color, 0.5);\n color: $primary-text-color;\n text-shadow: 1px 1px 0 rgba($base-shadow-color, 0.3);\n box-shadow: 0 2px 6px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n padding: 10px;\n margin-bottom: 15px;\n\n a {\n color: $primary-text-color;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n strong {\n font-weight: 600;\n display: block;\n margin-bottom: 5px;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n\n .fa {\n font-weight: 400;\n }\n }\n }\n}\n\n.action-pagination {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n\n .actions,\n .pagination {\n flex: 1 1 auto;\n }\n\n .actions {\n padding: 30px 0;\n padding-right: 20px;\n flex: 0 0 auto;\n }\n}\n\n.post-follow-actions {\n text-align: center;\n color: $darker-text-color;\n\n div {\n margin-bottom: 4px;\n }\n}\n\n.alternative-login {\n margin-top: 20px;\n margin-bottom: 20px;\n\n h4 {\n font-size: 16px;\n color: $primary-text-color;\n text-align: center;\n margin-bottom: 20px;\n border: 0;\n padding: 0;\n }\n\n .button {\n display: block;\n }\n}\n\n.scope-danger {\n color: $warning-red;\n}\n\n.form_admin_settings_site_short_description,\n.form_admin_settings_site_description,\n.form_admin_settings_site_extended_description,\n.form_admin_settings_site_terms,\n.form_admin_settings_custom_css,\n.form_admin_settings_closed_registrations_message {\n textarea {\n font-family: $font-monospace, monospace;\n }\n}\n\n.input-copy {\n background: darken($ui-base-color, 10%);\n border: 1px solid darken($ui-base-color, 14%);\n border-radius: 4px;\n display: flex;\n align-items: center;\n padding-right: 4px;\n position: relative;\n top: 1px;\n transition: border-color 300ms linear;\n\n &__wrapper {\n flex: 1 1 auto;\n }\n\n input[type=text] {\n background: transparent;\n border: 0;\n padding: 10px;\n font-size: 14px;\n font-family: $font-monospace, monospace;\n }\n\n button {\n flex: 0 0 auto;\n margin: 4px;\n text-transform: none;\n font-weight: 400;\n font-size: 14px;\n padding: 7px 18px;\n padding-bottom: 6px;\n width: auto;\n transition: background 300ms linear;\n }\n\n &.copied {\n border-color: $valid-value-color;\n transition: none;\n\n button {\n background: $valid-value-color;\n transition: none;\n }\n }\n}\n\n.connection-prompt {\n margin-bottom: 25px;\n\n .fa-link {\n background-color: darken($ui-base-color, 4%);\n border-radius: 100%;\n font-size: 24px;\n padding: 10px;\n }\n\n &__column {\n align-items: center;\n display: flex;\n flex: 1;\n flex-direction: column;\n flex-shrink: 1;\n max-width: 50%;\n\n &-sep {\n align-self: center;\n flex-grow: 0;\n overflow: visible;\n position: relative;\n z-index: 1;\n }\n\n p {\n word-break: break-word;\n }\n }\n\n .account__avatar {\n margin-bottom: 20px;\n }\n\n &__connection {\n background-color: lighten($ui-base-color, 8%);\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n padding: 25px 10px;\n position: relative;\n text-align: center;\n\n &::after {\n background-color: darken($ui-base-color, 4%);\n content: '';\n display: block;\n height: 100%;\n left: 50%;\n position: absolute;\n top: 0;\n width: 1px;\n }\n }\n\n &__row {\n align-items: flex-start;\n display: flex;\n flex-direction: row;\n }\n}\n",".card {\n & > a {\n display: block;\n text-decoration: none;\n color: inherit;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n box-shadow: none;\n }\n\n &:hover,\n &:active,\n &:focus {\n .card__bar {\n background: lighten($ui-base-color, 8%);\n }\n }\n }\n\n &__img {\n height: 130px;\n position: relative;\n background: darken($ui-base-color, 12%);\n border-radius: 4px 4px 0 0;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n object-fit: cover;\n border-radius: 4px 4px 0 0;\n }\n\n @media screen and (max-width: 600px) {\n height: 200px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n\n &__bar {\n position: relative;\n padding: 15px;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-radius: 0;\n }\n\n .avatar {\n flex: 0 0 auto;\n width: 48px;\n height: 48px;\n padding-top: 2px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n background: darken($ui-base-color, 8%);\n object-fit: cover;\n }\n }\n\n .display-name {\n margin-left: 15px;\n text-align: left;\n\n strong {\n font-size: 15px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n span {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n}\n\n.pagination {\n padding: 30px 0;\n text-align: center;\n overflow: hidden;\n\n a,\n .current,\n .newer,\n .older,\n .page,\n .gap {\n font-size: 14px;\n color: $primary-text-color;\n font-weight: 500;\n display: inline-block;\n padding: 6px 10px;\n text-decoration: none;\n }\n\n .current {\n background: $simple-background-color;\n border-radius: 100px;\n color: $inverted-text-color;\n cursor: default;\n margin: 0 10px;\n }\n\n .gap {\n cursor: default;\n }\n\n .older,\n .newer {\n text-transform: uppercase;\n color: $secondary-text-color;\n }\n\n .older {\n float: left;\n padding-left: 0;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n .newer {\n float: right;\n padding-right: 0;\n\n .fa {\n display: inline-block;\n margin-left: 5px;\n }\n }\n\n .disabled {\n cursor: default;\n color: lighten($inverted-text-color, 10%);\n }\n\n @media screen and (max-width: 700px) {\n padding: 30px 20px;\n\n .page {\n display: none;\n }\n\n .newer,\n .older {\n display: inline-block;\n }\n }\n}\n\n.nothing-here {\n background: $ui-base-color;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n color: $light-text-color;\n font-size: 14px;\n font-weight: 500;\n text-align: center;\n display: flex;\n justify-content: center;\n align-items: center;\n cursor: default;\n border-radius: 4px;\n padding: 20px;\n min-height: 30vh;\n\n &--under-tabs {\n border-radius: 0 0 4px 4px;\n }\n\n &--flexible {\n box-sizing: border-box;\n min-height: 100%;\n }\n}\n\n.account-role,\n.simple_form .recommended {\n display: inline-block;\n padding: 4px 6px;\n cursor: default;\n border-radius: 3px;\n font-size: 12px;\n line-height: 12px;\n font-weight: 500;\n color: $ui-secondary-color;\n background-color: rgba($ui-secondary-color, 0.1);\n border: 1px solid rgba($ui-secondary-color, 0.5);\n\n &.moderator {\n color: $success-green;\n background-color: rgba($success-green, 0.1);\n border-color: rgba($success-green, 0.5);\n }\n\n &.admin {\n color: lighten($error-red, 12%);\n background-color: rgba(lighten($error-red, 12%), 0.1);\n border-color: rgba(lighten($error-red, 12%), 0.5);\n }\n}\n\n.account__header__fields {\n max-width: 100vw;\n padding: 0;\n margin: 15px -15px -15px;\n border: 0 none;\n border-top: 1px solid lighten($ui-base-color, 12%);\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n font-size: 14px;\n line-height: 20px;\n\n dl {\n display: flex;\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n }\n\n dt,\n dd {\n box-sizing: border-box;\n padding: 14px;\n text-align: center;\n max-height: 48px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n dt {\n font-weight: 500;\n width: 120px;\n flex: 0 0 auto;\n color: $secondary-text-color;\n background: rgba(darken($ui-base-color, 8%), 0.5);\n }\n\n dd {\n flex: 1 1 auto;\n color: $darker-text-color;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n\n .verified {\n border: 1px solid rgba($valid-value-color, 0.5);\n background: rgba($valid-value-color, 0.25);\n\n a {\n color: $valid-value-color;\n font-weight: 500;\n }\n\n &__mark {\n color: $valid-value-color;\n }\n }\n\n dl:last-child {\n border-bottom: 0;\n }\n}\n\n.directory__tag .trends__item__current {\n width: auto;\n}\n\n.pending-account {\n &__header {\n color: $darker-text-color;\n\n a {\n color: $ui-secondary-color;\n text-decoration: none;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n\n strong {\n color: $primary-text-color;\n font-weight: 700;\n }\n }\n\n &__body {\n margin-top: 10px;\n }\n}\n",".activity-stream {\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);\n border-radius: 4px;\n overflow: hidden;\n margin-bottom: 10px;\n\n &--under-tabs {\n border-radius: 0 0 4px 4px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin-bottom: 0;\n border-radius: 0;\n box-shadow: none;\n }\n\n &--headless {\n border-radius: 0;\n margin: 0;\n box-shadow: none;\n\n .detailed-status,\n .status {\n border-radius: 0 !important;\n }\n }\n\n div[data-component] {\n width: 100%;\n }\n\n .entry {\n background: $ui-base-color;\n\n .detailed-status,\n .status,\n .load-more {\n animation: none;\n }\n\n &:last-child {\n .detailed-status,\n .status,\n .load-more {\n border-bottom: 0;\n border-radius: 0 0 4px 4px;\n }\n }\n\n &:first-child {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 4px 4px 0 0;\n }\n\n &:last-child {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 4px;\n }\n }\n }\n\n @media screen and (max-width: 740px) {\n .detailed-status,\n .status,\n .load-more {\n border-radius: 0 !important;\n }\n }\n }\n\n &--highlighted .entry {\n background: lighten($ui-base-color, 8%);\n }\n}\n\n.button.logo-button {\n flex: 0 auto;\n font-size: 14px;\n background: $ui-highlight-color;\n color: $primary-text-color;\n text-transform: none;\n line-height: 36px;\n height: auto;\n padding: 3px 15px;\n border: 0;\n\n svg {\n width: 20px;\n height: auto;\n vertical-align: middle;\n margin-right: 5px;\n fill: $primary-text-color;\n }\n\n &:active,\n &:focus,\n &:hover {\n background: lighten($ui-highlight-color, 10%);\n }\n\n &:disabled,\n &.disabled {\n &:active,\n &:focus,\n &:hover {\n background: $ui-primary-color;\n }\n }\n\n &.button--destructive {\n &:active,\n &:focus,\n &:hover {\n background: $error-red;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n svg {\n display: none;\n }\n }\n}\n\n.embed,\n.public-layout {\n .detailed-status {\n padding: 15px;\n }\n\n .status {\n padding: 15px 15px 15px (48px + 15px * 2);\n min-height: 48px + 2px;\n\n &__avatar {\n left: 15px;\n top: 17px;\n }\n\n &__content {\n padding-top: 5px;\n }\n\n &__prepend {\n margin-left: 48px + 15px * 2;\n padding-top: 15px;\n }\n\n &__prepend-icon-wrapper {\n left: -32px;\n }\n\n .media-gallery,\n &__action-bar,\n .video-player {\n margin-top: 10px;\n }\n }\n}\n","button.icon-button i.fa-retweet {\n background-image: url(\"data:image/svg+xml;utf8,\");\n\n &:hover {\n background-image: url(\"data:image/svg+xml;utf8,\");\n }\n}\n\nbutton.icon-button.disabled i.fa-retweet {\n background-image: url(\"data:image/svg+xml;utf8,\");\n}\n",".app-body {\n -webkit-overflow-scrolling: touch;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n}\n\n.animated-number {\n display: inline-flex;\n flex-direction: column;\n align-items: stretch;\n overflow: hidden;\n position: relative;\n}\n\n.link-button {\n display: block;\n font-size: 15px;\n line-height: 20px;\n color: $ui-highlight-color;\n border: 0;\n background: transparent;\n padding: 0;\n cursor: pointer;\n\n &:hover,\n &:active {\n text-decoration: underline;\n }\n\n &:disabled {\n color: $ui-primary-color;\n cursor: default;\n }\n}\n\n.button {\n background-color: $ui-highlight-color;\n border: 10px none;\n border-radius: 4px;\n box-sizing: border-box;\n color: $primary-text-color;\n cursor: pointer;\n display: inline-block;\n font-family: inherit;\n font-size: 14px;\n font-weight: 500;\n height: 36px;\n letter-spacing: 0;\n line-height: 36px;\n overflow: hidden;\n padding: 0 16px;\n position: relative;\n text-align: center;\n text-transform: uppercase;\n text-decoration: none;\n text-overflow: ellipsis;\n transition: all 100ms ease-in;\n white-space: nowrap;\n width: auto;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-highlight-color, 10%);\n transition: all 200ms ease-out;\n }\n\n &--destructive {\n transition: none;\n\n &:active,\n &:focus,\n &:hover {\n background-color: $error-red;\n transition: none;\n }\n }\n\n &:disabled,\n &.disabled {\n background-color: $ui-primary-color;\n cursor: default;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &.button-primary,\n &.button-alternative,\n &.button-secondary,\n &.button-alternative-2 {\n font-size: 16px;\n line-height: 36px;\n height: auto;\n text-transform: none;\n padding: 4px 16px;\n }\n\n &.button-alternative {\n color: $inverted-text-color;\n background: $ui-primary-color;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-primary-color, 4%);\n }\n }\n\n &.button-alternative-2 {\n background: $ui-base-lighter-color;\n\n &:active,\n &:focus,\n &:hover {\n background-color: lighten($ui-base-lighter-color, 4%);\n }\n }\n\n &.button-secondary {\n color: $darker-text-color;\n background: transparent;\n padding: 3px 15px;\n border: 1px solid $ui-primary-color;\n\n &:active,\n &:focus,\n &:hover {\n border-color: lighten($ui-primary-color, 4%);\n color: lighten($darker-text-color, 4%);\n }\n\n &:disabled {\n opacity: 0.5;\n }\n }\n\n &.button--block {\n display: block;\n width: 100%;\n }\n}\n\n.column__wrapper {\n display: flex;\n flex: 1 1 auto;\n position: relative;\n}\n\n.icon-button {\n display: inline-block;\n padding: 0;\n color: $action-button-color;\n border: 0;\n border-radius: 4px;\n background: transparent;\n cursor: pointer;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($action-button-color, 7%);\n background-color: rgba($action-button-color, 0.15);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n }\n\n &:focus {\n background-color: rgba($action-button-color, 0.3);\n }\n\n &.disabled {\n color: darken($action-button-color, 13%);\n background-color: transparent;\n cursor: default;\n }\n\n &.active {\n color: $highlight-text-color;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &.inverted {\n color: $lighter-text-color;\n\n &:hover,\n &:active,\n &:focus {\n color: darken($lighter-text-color, 7%);\n background-color: rgba($lighter-text-color, 0.15);\n }\n\n &:focus {\n background-color: rgba($lighter-text-color, 0.3);\n }\n\n &.disabled {\n color: lighten($lighter-text-color, 7%);\n background-color: transparent;\n }\n\n &.active {\n color: $highlight-text-color;\n\n &.disabled {\n color: lighten($highlight-text-color, 13%);\n }\n }\n }\n\n &.overlayed {\n box-sizing: content-box;\n background: rgba($base-overlay-background, 0.6);\n color: rgba($primary-text-color, 0.7);\n border-radius: 4px;\n padding: 2px;\n\n &:hover {\n background: rgba($base-overlay-background, 0.9);\n }\n }\n}\n\n.text-icon-button {\n color: $lighter-text-color;\n border: 0;\n border-radius: 4px;\n background: transparent;\n cursor: pointer;\n font-weight: 600;\n font-size: 11px;\n padding: 0 3px;\n line-height: 27px;\n outline: 0;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &:hover,\n &:active,\n &:focus {\n color: darken($lighter-text-color, 7%);\n background-color: rgba($lighter-text-color, 0.15);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n }\n\n &:focus {\n background-color: rgba($lighter-text-color, 0.3);\n }\n\n &.disabled {\n color: lighten($lighter-text-color, 20%);\n background-color: transparent;\n cursor: default;\n }\n\n &.active {\n color: $highlight-text-color;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n}\n\n.dropdown-menu {\n position: absolute;\n}\n\n.invisible {\n font-size: 0;\n line-height: 0;\n display: inline-block;\n width: 0;\n height: 0;\n position: absolute;\n\n img,\n svg {\n margin: 0 !important;\n border: 0 !important;\n padding: 0 !important;\n width: 0 !important;\n height: 0 !important;\n }\n}\n\n.ellipsis {\n &::after {\n content: \"…\";\n }\n}\n\n.compose-form {\n padding: 10px;\n\n &__sensitive-button {\n padding: 10px;\n padding-top: 0;\n\n font-size: 14px;\n font-weight: 500;\n\n &.active {\n color: $highlight-text-color;\n }\n\n input[type=checkbox] {\n display: none;\n }\n\n .checkbox {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 4px;\n vertical-align: middle;\n\n &.active {\n border-color: $highlight-text-color;\n background: $highlight-text-color;\n }\n }\n }\n\n .compose-form__warning {\n color: $inverted-text-color;\n margin-bottom: 10px;\n background: $ui-primary-color;\n box-shadow: 0 2px 6px rgba($base-shadow-color, 0.3);\n padding: 8px 10px;\n border-radius: 4px;\n font-size: 13px;\n font-weight: 400;\n\n strong {\n color: $inverted-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n color: $lighter-text-color;\n font-weight: 500;\n text-decoration: underline;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: none;\n }\n }\n }\n\n .emoji-picker-dropdown {\n position: absolute;\n top: 0;\n right: 0;\n }\n\n .compose-form__autosuggest-wrapper {\n position: relative;\n }\n\n .autosuggest-textarea,\n .autosuggest-input,\n .spoiler-input {\n position: relative;\n width: 100%;\n }\n\n .spoiler-input {\n height: 0;\n transform-origin: bottom;\n opacity: 0;\n\n &.spoiler-input--visible {\n height: 36px;\n margin-bottom: 11px;\n opacity: 1;\n }\n }\n\n .autosuggest-textarea__textarea,\n .spoiler-input__input {\n display: block;\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n color: $inverted-text-color;\n background: $simple-background-color;\n padding: 10px;\n font-family: inherit;\n font-size: 14px;\n resize: vertical;\n border: 0;\n outline: 0;\n\n &::placeholder {\n color: $dark-text-color;\n }\n\n &:focus {\n outline: 0;\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n .spoiler-input__input {\n border-radius: 4px;\n }\n\n .autosuggest-textarea__textarea {\n min-height: 100px;\n border-radius: 4px 4px 0 0;\n padding-bottom: 0;\n padding-right: 10px + 22px;\n resize: none;\n scrollbar-color: initial;\n\n &::-webkit-scrollbar {\n all: unset;\n }\n\n @media screen and (max-width: 600px) {\n height: 100px !important; // prevent auto-resize textarea\n resize: vertical;\n }\n }\n\n .autosuggest-textarea__suggestions-wrapper {\n position: relative;\n height: 0;\n }\n\n .autosuggest-textarea__suggestions {\n box-sizing: border-box;\n display: none;\n position: absolute;\n top: 100%;\n width: 100%;\n z-index: 99;\n box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4);\n background: $ui-secondary-color;\n border-radius: 0 0 4px 4px;\n color: $inverted-text-color;\n font-size: 14px;\n padding: 6px;\n\n &.autosuggest-textarea__suggestions--visible {\n display: block;\n }\n }\n\n .autosuggest-textarea__suggestions__item {\n padding: 10px;\n cursor: pointer;\n border-radius: 4px;\n\n &:hover,\n &:focus,\n &:active,\n &.selected {\n background: darken($ui-secondary-color, 10%);\n }\n }\n\n .autosuggest-account,\n .autosuggest-emoji,\n .autosuggest-hashtag {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: flex-start;\n line-height: 18px;\n font-size: 14px;\n }\n\n .autosuggest-hashtag {\n justify-content: space-between;\n\n &__name {\n flex: 1 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n strong {\n font-weight: 500;\n }\n\n &__uses {\n flex: 0 0 auto;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n }\n\n .autosuggest-account-icon,\n .autosuggest-emoji img {\n display: block;\n margin-right: 8px;\n width: 16px;\n height: 16px;\n }\n\n .autosuggest-account .display-name__account {\n color: $lighter-text-color;\n }\n\n .compose-form__modifiers {\n color: $inverted-text-color;\n font-family: inherit;\n font-size: 14px;\n background: $simple-background-color;\n\n .compose-form__upload-wrapper {\n overflow: hidden;\n }\n\n .compose-form__uploads-wrapper {\n display: flex;\n flex-direction: row;\n padding: 5px;\n flex-wrap: wrap;\n }\n\n .compose-form__upload {\n flex: 1 1 0;\n min-width: 40%;\n margin: 5px;\n\n &__actions {\n background: linear-gradient(180deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n opacity: 0;\n transition: opacity .1s ease;\n\n .icon-button {\n flex: 0 1 auto;\n color: $secondary-text-color;\n font-size: 14px;\n font-weight: 500;\n padding: 10px;\n font-family: inherit;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($secondary-text-color, 7%);\n }\n }\n\n &.active {\n opacity: 1;\n }\n }\n\n &-description {\n position: absolute;\n z-index: 2;\n bottom: 0;\n left: 0;\n right: 0;\n box-sizing: border-box;\n background: linear-gradient(0deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);\n padding: 10px;\n opacity: 0;\n transition: opacity .1s ease;\n\n textarea {\n background: transparent;\n color: $secondary-text-color;\n border: 0;\n padding: 0;\n margin: 0;\n width: 100%;\n font-family: inherit;\n font-size: 14px;\n font-weight: 500;\n\n &:focus {\n color: $white;\n }\n\n &::placeholder {\n opacity: 0.75;\n color: $secondary-text-color;\n }\n }\n\n &.active {\n opacity: 1;\n }\n }\n }\n\n .compose-form__upload-thumbnail {\n border-radius: 4px;\n background-color: $base-shadow-color;\n background-position: center;\n background-size: cover;\n background-repeat: no-repeat;\n height: 140px;\n width: 100%;\n overflow: hidden;\n }\n }\n\n .compose-form__buttons-wrapper {\n padding: 10px;\n background: darken($simple-background-color, 8%);\n border-radius: 0 0 4px 4px;\n display: flex;\n justify-content: space-between;\n flex: 0 0 auto;\n\n .compose-form__buttons {\n display: flex;\n\n .compose-form__upload-button-icon {\n line-height: 27px;\n }\n\n .compose-form__sensitive-button {\n display: none;\n\n &.compose-form__sensitive-button--visible {\n display: block;\n }\n\n .compose-form__sensitive-button__icon {\n line-height: 27px;\n }\n }\n }\n\n .icon-button,\n .text-icon-button {\n box-sizing: content-box;\n padding: 0 3px;\n }\n\n .character-counter__wrapper {\n align-self: center;\n margin-right: 4px;\n }\n }\n\n .compose-form__publish {\n display: flex;\n justify-content: flex-end;\n min-width: 0;\n flex: 0 0 auto;\n\n .compose-form__publish-button-wrapper {\n overflow: hidden;\n padding-top: 10px;\n }\n }\n}\n\n.character-counter {\n cursor: default;\n font-family: $font-sans-serif, sans-serif;\n font-size: 14px;\n font-weight: 600;\n color: $lighter-text-color;\n\n &.character-counter--over {\n color: $warning-red;\n }\n}\n\n.no-reduce-motion .spoiler-input {\n transition: height 0.4s ease, opacity 0.4s ease;\n}\n\n.emojione {\n font-size: inherit;\n vertical-align: middle;\n object-fit: contain;\n margin: -.2ex .15em .2ex;\n width: 16px;\n height: 16px;\n\n img {\n width: auto;\n }\n}\n\n.reply-indicator {\n border-radius: 4px;\n margin-bottom: 10px;\n background: $ui-primary-color;\n padding: 10px;\n min-height: 23px;\n overflow-y: auto;\n flex: 0 2 auto;\n}\n\n.reply-indicator__header {\n margin-bottom: 5px;\n overflow: hidden;\n}\n\n.reply-indicator__cancel {\n float: right;\n line-height: 24px;\n}\n\n.reply-indicator__display-name {\n color: $inverted-text-color;\n display: block;\n max-width: 100%;\n line-height: 24px;\n overflow: hidden;\n padding-right: 25px;\n text-decoration: none;\n}\n\n.reply-indicator__display-avatar {\n float: left;\n margin-right: 5px;\n}\n\n.status__content--with-action {\n cursor: pointer;\n}\n\n.status__content,\n.reply-indicator__content {\n position: relative;\n font-size: 15px;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n padding-top: 2px;\n color: $primary-text-color;\n\n &:focus {\n outline: 0;\n }\n\n &.status__content--with-spoiler {\n white-space: normal;\n\n .status__content__text {\n white-space: pre-wrap;\n }\n }\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n img {\n max-width: 100%;\n max-height: 400px;\n object-fit: contain;\n }\n\n p {\n margin-bottom: 20px;\n white-space: pre-wrap;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: $pleroma-links;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n\n .fa {\n color: lighten($dark-text-color, 7%);\n }\n }\n\n &.mention {\n &:hover {\n text-decoration: none;\n\n span {\n text-decoration: underline;\n }\n }\n }\n\n .fa {\n color: $dark-text-color;\n }\n }\n\n a.unhandled-link {\n color: lighten($ui-highlight-color, 8%);\n }\n\n .status__content__spoiler-link {\n background: $action-button-color;\n\n &:hover {\n background: lighten($action-button-color, 7%);\n text-decoration: none;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n\n .status__content__text {\n display: none;\n\n &.status__content__text--visible {\n display: block;\n }\n }\n}\n\n.announcements__item__content {\n word-wrap: break-word;\n overflow-y: auto;\n\n .emojione {\n width: 20px;\n height: 20px;\n margin: -3px 0 0;\n }\n\n p {\n margin-bottom: 10px;\n white-space: pre-wrap;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: $secondary-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n\n &.mention {\n &:hover {\n text-decoration: none;\n\n span {\n text-decoration: underline;\n }\n }\n }\n\n &.unhandled-link {\n color: lighten($ui-highlight-color, 8%);\n }\n }\n}\n\n.status__content.status__content--collapsed {\n max-height: 20px * 15; // 15 lines is roughly above 500 characters\n}\n\n.status__content__read-more-button {\n display: block;\n font-size: 15px;\n line-height: 20px;\n color: lighten($ui-highlight-color, 8%);\n border: 0;\n background: transparent;\n padding: 0;\n padding-top: 8px;\n text-decoration: none;\n\n &:hover,\n &:active {\n text-decoration: underline;\n }\n}\n\n.status__content__spoiler-link {\n display: inline-block;\n border-radius: 2px;\n background: transparent;\n border: 0;\n color: $inverted-text-color;\n font-weight: 700;\n font-size: 11px;\n padding: 0 6px;\n text-transform: uppercase;\n line-height: 20px;\n cursor: pointer;\n vertical-align: middle;\n}\n\n.status__wrapper--filtered {\n color: $dark-text-color;\n border: 0;\n font-size: inherit;\n text-align: center;\n line-height: inherit;\n margin: 0;\n padding: 15px;\n box-sizing: border-box;\n width: 100%;\n clear: both;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n}\n\n.status__prepend-icon-wrapper {\n left: -26px;\n position: absolute;\n}\n\n.focusable {\n &:focus {\n outline: 0;\n background: lighten($ui-base-color, 4%);\n\n .status.status-direct {\n background: lighten($ui-base-color, 12%);\n\n &.muted {\n background: transparent;\n }\n }\n\n .detailed-status,\n .detailed-status__action-bar {\n background: lighten($ui-base-color, 8%);\n }\n }\n}\n\n.status {\n padding: 8px 10px;\n padding-left: 68px;\n position: relative;\n min-height: 54px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n\n @supports (-ms-overflow-style: -ms-autohiding-scrollbar) {\n // Add margin to avoid Edge auto-hiding scrollbar appearing over content.\n // On Edge 16 this is 16px and Edge <=15 it's 12px, so aim for 16px.\n padding-right: 26px; // 10px + 16px\n }\n\n @keyframes fade {\n 0% { opacity: 0; }\n 100% { opacity: 1; }\n }\n\n opacity: 1;\n animation: fade 150ms linear;\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n }\n\n &.status-direct:not(.read) {\n background: lighten($ui-base-color, 8%);\n border-bottom-color: lighten($ui-base-color, 12%);\n }\n\n &.light {\n .status__relative-time {\n color: $light-text-color;\n }\n\n .status__display-name {\n color: $inverted-text-color;\n }\n\n .display-name {\n color: $light-text-color;\n\n strong {\n color: $inverted-text-color;\n }\n }\n\n .status__content {\n color: $inverted-text-color;\n\n a {\n color: $highlight-text-color;\n }\n\n a.status__content__spoiler-link {\n color: $primary-text-color;\n background: $ui-primary-color;\n\n &:hover {\n background: lighten($ui-primary-color, 8%);\n }\n }\n }\n }\n}\n\n.notification-favourite {\n .status.status-direct {\n background: transparent;\n\n .icon-button.disabled {\n color: lighten($action-button-color, 13%);\n }\n }\n}\n\n.status__relative-time,\n.notification__relative_time {\n color: $dark-text-color;\n float: right;\n font-size: 14px;\n}\n\n.status__display-name {\n color: $dark-text-color;\n}\n\n.status__info .status__display-name {\n display: block;\n max-width: 100%;\n padding-right: 25px;\n}\n\n.status__info {\n font-size: 15px;\n}\n\n.status-check-box {\n border-bottom: 1px solid $ui-secondary-color;\n display: flex;\n\n .status-check-box__status {\n margin: 10px 0 10px 10px;\n flex: 1;\n overflow: hidden;\n\n .media-gallery {\n max-width: 250px;\n }\n\n .status__content {\n padding: 0;\n white-space: normal;\n }\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n max-width: 250px;\n }\n\n .media-gallery__item-thumbnail {\n cursor: default;\n }\n }\n}\n\n.status-check-box-toggle {\n align-items: center;\n display: flex;\n flex: 0 0 auto;\n justify-content: center;\n padding: 10px;\n}\n\n.status__prepend {\n margin-left: 68px;\n color: $dark-text-color;\n padding: 8px 0;\n padding-bottom: 2px;\n font-size: 14px;\n position: relative;\n\n .status__display-name strong {\n color: $dark-text-color;\n }\n\n > span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.status__action-bar {\n align-items: center;\n display: flex;\n margin-top: 8px;\n\n &__counter {\n display: inline-flex;\n margin-right: 11px;\n align-items: center;\n\n .status__action-bar-button {\n margin-right: 4px;\n }\n\n &__label {\n display: inline-block;\n width: 14px;\n font-size: 12px;\n font-weight: 500;\n color: $action-button-color;\n }\n }\n}\n\n.status__action-bar-button {\n margin-right: 18px;\n}\n\n.status__action-bar-dropdown {\n height: 23.15px;\n width: 23.15px;\n}\n\n.detailed-status__action-bar-dropdown {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n}\n\n.detailed-status {\n background: lighten($ui-base-color, 4%);\n padding: 14px 10px;\n\n &--flex {\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n align-items: flex-start;\n\n .status__content,\n .detailed-status__meta {\n flex: 100%;\n }\n }\n\n .status__content {\n font-size: 19px;\n line-height: 24px;\n\n .emojione {\n width: 24px;\n height: 24px;\n margin: -1px 0 0;\n }\n\n .status__content__spoiler-link {\n line-height: 24px;\n margin: -1px 0 0;\n }\n }\n\n .video-player,\n .audio-player {\n margin-top: 8px;\n }\n}\n\n.detailed-status__meta {\n margin-top: 15px;\n color: $dark-text-color;\n font-size: 14px;\n line-height: 18px;\n}\n\n.detailed-status__action-bar {\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: row;\n padding: 10px 0;\n}\n\n.detailed-status__link {\n color: inherit;\n text-decoration: none;\n}\n\n.detailed-status__favorites,\n.detailed-status__reblogs {\n display: inline-block;\n font-weight: 500;\n font-size: 12px;\n margin-left: 6px;\n}\n\n.reply-indicator__content {\n color: $inverted-text-color;\n font-size: 14px;\n\n a {\n color: $lighter-text-color;\n }\n}\n\n.domain {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n .domain__domain-name {\n flex: 1 1 auto;\n display: block;\n color: $primary-text-color;\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n }\n}\n\n.domain__wrapper {\n display: flex;\n}\n\n.domain_buttons {\n height: 18px;\n padding: 10px;\n white-space: nowrap;\n}\n\n.account {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &.compact {\n padding: 0;\n border-bottom: 0;\n\n .account__avatar-wrapper {\n margin-left: 0;\n }\n }\n\n .account__display-name {\n flex: 1 1 auto;\n display: block;\n color: $darker-text-color;\n overflow: hidden;\n text-decoration: none;\n font-size: 14px;\n }\n}\n\n.account__wrapper {\n display: flex;\n}\n\n.account__avatar-wrapper {\n float: left;\n margin-left: 12px;\n margin-right: 12px;\n}\n\n.account__avatar {\n @include avatar-radius;\n position: relative;\n\n &-inline {\n display: inline-block;\n vertical-align: middle;\n margin-right: 5px;\n }\n\n &-composite {\n @include avatar-radius;\n border-radius: 50%;\n overflow: hidden;\n position: relative;\n\n & > div {\n float: left;\n position: relative;\n box-sizing: border-box;\n }\n\n &__label {\n display: block;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n color: $primary-text-color;\n text-shadow: 1px 1px 2px $base-shadow-color;\n font-weight: 700;\n font-size: 15px;\n }\n }\n}\n\na .account__avatar {\n cursor: pointer;\n}\n\n.account__avatar-overlay {\n @include avatar-size(48px);\n\n &-base {\n @include avatar-radius;\n @include avatar-size(36px);\n }\n\n &-overlay {\n @include avatar-radius;\n @include avatar-size(24px);\n\n position: absolute;\n bottom: 0;\n right: 0;\n z-index: 1;\n }\n}\n\n.account__relationship {\n height: 18px;\n padding: 10px;\n white-space: nowrap;\n}\n\n.account__disclaimer {\n padding: 10px;\n border-top: 1px solid lighten($ui-base-color, 8%);\n color: $dark-text-color;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n a {\n font-weight: 500;\n color: inherit;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n}\n\n.account__action-bar {\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n line-height: 36px;\n overflow: hidden;\n flex: 0 0 auto;\n display: flex;\n}\n\n.account__action-bar-dropdown {\n padding: 10px;\n\n .icon-button {\n vertical-align: middle;\n }\n\n .dropdown--active {\n .dropdown__content.dropdown__right {\n left: 6px;\n right: initial;\n }\n\n &::after {\n bottom: initial;\n margin-left: 11px;\n margin-top: -7px;\n right: initial;\n }\n }\n}\n\n.account__action-bar-links {\n display: flex;\n flex: 1 1 auto;\n line-height: 18px;\n text-align: center;\n}\n\n.account__action-bar__tab {\n text-decoration: none;\n overflow: hidden;\n flex: 0 1 100%;\n border-right: 1px solid lighten($ui-base-color, 8%);\n padding: 10px 0;\n border-bottom: 4px solid transparent;\n\n &.active {\n border-bottom: 4px solid $ui-highlight-color;\n }\n\n & > span {\n display: block;\n text-transform: uppercase;\n font-size: 11px;\n color: $darker-text-color;\n }\n\n strong {\n display: block;\n font-size: 15px;\n font-weight: 500;\n color: $primary-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n}\n\n.account-authorize {\n padding: 14px 10px;\n\n .detailed-status__display-name {\n display: block;\n margin-bottom: 15px;\n overflow: hidden;\n }\n}\n\n.account-authorize__avatar {\n float: left;\n margin-right: 10px;\n}\n\n.status__display-name,\n.status__relative-time,\n.detailed-status__display-name,\n.detailed-status__datetime,\n.detailed-status__application,\n.account__display-name {\n text-decoration: none;\n}\n\n.status__display-name,\n.account__display-name {\n strong {\n color: $primary-text-color;\n }\n}\n\n.muted {\n .emojione {\n opacity: 0.5;\n }\n}\n\n.status__display-name,\n.reply-indicator__display-name,\n.detailed-status__display-name,\na.account__display-name {\n &:hover strong {\n text-decoration: underline;\n }\n}\n\n.account__display-name strong {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.detailed-status__application,\n.detailed-status__datetime {\n color: inherit;\n}\n\n.detailed-status .button.logo-button {\n margin-bottom: 15px;\n}\n\n.detailed-status__display-name {\n color: $secondary-text-color;\n display: block;\n line-height: 24px;\n margin-bottom: 15px;\n overflow: hidden;\n\n strong,\n span {\n display: block;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n strong {\n font-size: 16px;\n color: $primary-text-color;\n }\n}\n\n.detailed-status__display-avatar {\n float: left;\n margin-right: 10px;\n}\n\n.status__avatar {\n height: 48px;\n left: 10px;\n position: absolute;\n top: 10px;\n width: 48px;\n}\n\n.status__expand {\n width: 68px;\n position: absolute;\n left: 0;\n top: 0;\n height: 100%;\n cursor: pointer;\n}\n\n.muted {\n .status__content,\n .status__content p,\n .status__content a {\n color: $dark-text-color;\n }\n\n .status__display-name strong {\n color: $dark-text-color;\n }\n\n .status__avatar {\n opacity: 0.5;\n }\n\n a.status__content__spoiler-link {\n background: $ui-base-lighter-color;\n color: $inverted-text-color;\n\n &:hover {\n background: lighten($ui-base-lighter-color, 7%);\n text-decoration: none;\n }\n }\n}\n\n.notification__message {\n margin: 0 10px 0 68px;\n padding: 8px 0 0;\n cursor: default;\n color: $darker-text-color;\n font-size: 15px;\n line-height: 22px;\n position: relative;\n\n .fa {\n color: $highlight-text-color;\n }\n\n > span {\n display: inline;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.notification__favourite-icon-wrapper {\n left: -26px;\n position: absolute;\n\n .star-icon {\n color: $gold-star;\n }\n}\n\n.star-icon.active {\n color: $gold-star;\n}\n\n.bookmark-icon.active {\n color: $red-bookmark;\n}\n\n.no-reduce-motion .icon-button.star-icon {\n &.activate {\n & > .fa-star {\n animation: spring-rotate-in 1s linear;\n }\n }\n\n &.deactivate {\n & > .fa-star {\n animation: spring-rotate-out 1s linear;\n }\n }\n}\n\n.notification__display-name {\n color: inherit;\n font-weight: 500;\n text-decoration: none;\n\n &:hover {\n color: $primary-text-color;\n text-decoration: underline;\n }\n}\n\n.notification__relative_time {\n float: right;\n}\n\n.display-name {\n display: block;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.display-name__html {\n font-weight: 500;\n}\n\n.display-name__account {\n font-size: 14px;\n}\n\n.status__relative-time,\n.detailed-status__datetime {\n &:hover {\n text-decoration: underline;\n }\n}\n\n.image-loader {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n\n .image-loader__preview-canvas {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n background: url('~images/void.png') repeat;\n object-fit: contain;\n }\n\n .loading-bar {\n position: relative;\n }\n\n &.image-loader--amorphous .image-loader__preview-canvas {\n display: none;\n }\n}\n\n.zoomable-image {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n img {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n width: auto;\n height: auto;\n object-fit: contain;\n }\n}\n\n.navigation-bar {\n padding: 10px;\n display: flex;\n align-items: center;\n flex-shrink: 0;\n cursor: default;\n color: $darker-text-color;\n\n strong {\n color: $secondary-text-color;\n }\n\n a {\n color: inherit;\n }\n\n .permalink {\n text-decoration: none;\n }\n\n .navigation-bar__actions {\n position: relative;\n\n .icon-button.close {\n position: absolute;\n pointer-events: none;\n transform: scale(0, 1) translate(-100%, 0);\n opacity: 0;\n }\n\n .compose__action-bar .icon-button {\n pointer-events: auto;\n transform: scale(1, 1) translate(0, 0);\n opacity: 1;\n }\n }\n}\n\n.navigation-bar__profile {\n flex: 1 1 auto;\n margin-left: 8px;\n line-height: 20px;\n margin-top: -1px;\n overflow: hidden;\n}\n\n.navigation-bar__profile-account {\n display: block;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.navigation-bar__profile-edit {\n color: inherit;\n text-decoration: none;\n}\n\n.dropdown {\n display: inline-block;\n}\n\n.dropdown__content {\n display: none;\n position: absolute;\n}\n\n.dropdown-menu__separator {\n border-bottom: 1px solid darken($ui-secondary-color, 8%);\n margin: 5px 7px 6px;\n height: 0;\n}\n\n.dropdown-menu {\n background: $ui-secondary-color;\n padding: 4px 0;\n border-radius: 4px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n z-index: 9999;\n\n ul {\n list-style: none;\n }\n\n &.left {\n transform-origin: 100% 50%;\n }\n\n &.top {\n transform-origin: 50% 100%;\n }\n\n &.bottom {\n transform-origin: 50% 0;\n }\n\n &.right {\n transform-origin: 0 50%;\n }\n}\n\n.dropdown-menu__arrow {\n position: absolute;\n width: 0;\n height: 0;\n border: 0 solid transparent;\n\n &.left {\n right: -5px;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: $ui-secondary-color;\n }\n\n &.top {\n bottom: -5px;\n margin-left: -7px;\n border-width: 5px 7px 0;\n border-top-color: $ui-secondary-color;\n }\n\n &.bottom {\n top: -5px;\n margin-left: -7px;\n border-width: 0 7px 5px;\n border-bottom-color: $ui-secondary-color;\n }\n\n &.right {\n left: -5px;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: $ui-secondary-color;\n }\n}\n\n.dropdown-menu__item {\n a {\n font-size: 13px;\n line-height: 18px;\n display: block;\n padding: 4px 14px;\n box-sizing: border-box;\n text-decoration: none;\n background: $ui-secondary-color;\n color: $inverted-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:focus,\n &:hover,\n &:active {\n background: $ui-highlight-color;\n color: $secondary-text-color;\n outline: 0;\n }\n }\n}\n\n.dropdown--active .dropdown__content {\n display: block;\n line-height: 18px;\n max-width: 311px;\n right: 0;\n text-align: left;\n z-index: 9999;\n\n & > ul {\n list-style: none;\n background: $ui-secondary-color;\n padding: 4px 0;\n border-radius: 4px;\n box-shadow: 0 0 15px rgba($base-shadow-color, 0.4);\n min-width: 140px;\n position: relative;\n }\n\n &.dropdown__right {\n right: 0;\n }\n\n &.dropdown__left {\n & > ul {\n left: -98px;\n }\n }\n\n & > ul > li > a {\n font-size: 13px;\n line-height: 18px;\n display: block;\n padding: 4px 14px;\n box-sizing: border-box;\n text-decoration: none;\n background: $ui-secondary-color;\n color: $inverted-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:focus {\n outline: 0;\n }\n\n &:hover {\n background: $ui-highlight-color;\n color: $secondary-text-color;\n }\n }\n}\n\n.dropdown__icon {\n vertical-align: middle;\n}\n\n.columns-area {\n display: flex;\n flex: 1 1 auto;\n flex-direction: row;\n justify-content: flex-start;\n overflow-x: auto;\n position: relative;\n\n &.unscrollable {\n overflow-x: hidden;\n }\n\n &__panels {\n display: flex;\n justify-content: center;\n width: 100%;\n height: 100%;\n min-height: 100vh;\n\n &__pane {\n height: 100%;\n overflow: hidden;\n pointer-events: none;\n display: flex;\n justify-content: flex-end;\n min-width: 285px;\n\n &--start {\n justify-content: flex-start;\n }\n\n &__inner {\n position: fixed;\n width: 285px;\n pointer-events: auto;\n height: 100%;\n }\n }\n\n &__main {\n box-sizing: border-box;\n width: 100%;\n max-width: 600px;\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding: 0 10px;\n }\n }\n }\n}\n\n.tabs-bar__wrapper {\n background: darken($ui-base-color, 8%);\n position: sticky;\n top: 0;\n z-index: 2;\n padding-top: 0;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding-top: 10px;\n }\n\n .tabs-bar {\n margin-bottom: 0;\n\n @media screen and (min-width: $no-gap-breakpoint) {\n margin-bottom: 10px;\n }\n }\n}\n\n.react-swipeable-view-container {\n &,\n .columns-area,\n .drawer,\n .column {\n height: 100%;\n }\n}\n\n.react-swipeable-view-container > * {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n}\n\n.column {\n width: 350px;\n position: relative;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n\n > .scrollable {\n background: $ui-base-color;\n border-bottom-left-radius: 2px;\n border-bottom-right-radius: 2px;\n }\n}\n\n.ui {\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n}\n\n.drawer {\n width: 330px;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n overflow-y: hidden;\n}\n\n.drawer__tab {\n display: block;\n flex: 1 1 auto;\n padding: 15px 5px 13px;\n color: $darker-text-color;\n text-decoration: none;\n text-align: center;\n font-size: 16px;\n border-bottom: 2px solid transparent;\n}\n\n.column,\n.drawer {\n flex: 1 1 auto;\n overflow: hidden;\n}\n\n@media screen and (min-width: 631px) {\n .columns-area {\n padding: 0;\n }\n\n .column,\n .drawer {\n flex: 0 0 auto;\n padding: 10px;\n padding-left: 5px;\n padding-right: 5px;\n\n &:first-child {\n padding-left: 10px;\n }\n\n &:last-child {\n padding-right: 10px;\n }\n }\n\n .columns-area > div {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n }\n }\n}\n\n.tabs-bar {\n box-sizing: border-box;\n display: flex;\n background: lighten($ui-base-color, 8%);\n flex: 0 0 auto;\n overflow-y: auto;\n}\n\n.tabs-bar__link {\n display: block;\n flex: 1 1 auto;\n padding: 15px 10px;\n padding-bottom: 13px;\n color: $primary-text-color;\n text-decoration: none;\n text-align: center;\n font-size: 14px;\n font-weight: 500;\n border-bottom: 2px solid lighten($ui-base-color, 8%);\n transition: all 50ms linear;\n transition-property: border-bottom, background, color;\n\n .fa {\n font-weight: 400;\n font-size: 16px;\n }\n\n &:hover,\n &:focus,\n &:active {\n @media screen and (min-width: 631px) {\n background: lighten($ui-base-color, 14%);\n border-bottom-color: lighten($ui-base-color, 14%);\n }\n }\n\n &.active {\n border-bottom: 2px solid $highlight-text-color;\n color: $highlight-text-color;\n }\n\n span {\n margin-left: 5px;\n display: none;\n }\n}\n\n@media screen and (min-width: 600px) {\n .tabs-bar__link {\n span {\n display: inline;\n }\n }\n}\n\n.columns-area--mobile {\n flex-direction: column;\n width: 100%;\n height: 100%;\n margin: 0 auto;\n\n .column,\n .drawer {\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .directory__list {\n display: grid;\n grid-gap: 10px;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: block;\n }\n }\n\n .directory__card {\n margin-bottom: 0;\n }\n\n .filter-form {\n display: flex;\n }\n\n .autosuggest-textarea__textarea {\n font-size: 16px;\n }\n\n .search__input {\n line-height: 18px;\n font-size: 16px;\n padding: 15px;\n padding-right: 30px;\n }\n\n .search__icon .fa {\n top: 15px;\n }\n\n .scrollable {\n overflow: visible;\n\n @supports(display: grid) {\n contain: content;\n }\n }\n\n @media screen and (min-width: $no-gap-breakpoint) {\n padding: 10px 0;\n padding-top: 0;\n }\n\n @media screen and (min-width: 630px) {\n .detailed-status {\n padding: 15px;\n\n .media-gallery,\n .video-player,\n .audio-player {\n margin-top: 15px;\n }\n }\n\n .account__header__bar {\n padding: 5px 10px;\n }\n\n .navigation-bar,\n .compose-form {\n padding: 15px;\n }\n\n .compose-form .compose-form__publish .compose-form__publish-button-wrapper {\n padding-top: 15px;\n }\n\n .status {\n padding: 15px 15px 15px (48px + 15px * 2);\n min-height: 48px + 2px;\n\n &__avatar {\n left: 15px;\n top: 17px;\n }\n\n &__content {\n padding-top: 5px;\n }\n\n &__prepend {\n margin-left: 48px + 15px * 2;\n padding-top: 15px;\n }\n\n &__prepend-icon-wrapper {\n left: -32px;\n }\n\n .media-gallery,\n &__action-bar,\n .video-player,\n .audio-player {\n margin-top: 10px;\n }\n }\n\n .account {\n padding: 15px 10px;\n\n &__header__bio {\n margin: 0 -10px;\n }\n }\n\n .notification {\n &__message {\n margin-left: 48px + 15px * 2;\n padding-top: 15px;\n }\n\n &__favourite-icon-wrapper {\n left: -32px;\n }\n\n .status {\n padding-top: 8px;\n }\n\n .account {\n padding-top: 8px;\n }\n\n .account__avatar-wrapper {\n margin-left: 17px;\n margin-right: 15px;\n }\n }\n }\n}\n\n.floating-action-button {\n position: fixed;\n display: flex;\n justify-content: center;\n align-items: center;\n width: 3.9375rem;\n height: 3.9375rem;\n bottom: 1.3125rem;\n right: 1.3125rem;\n background: darken($ui-highlight-color, 3%);\n color: $white;\n border-radius: 50%;\n font-size: 21px;\n line-height: 21px;\n text-decoration: none;\n box-shadow: 2px 3px 9px rgba($base-shadow-color, 0.4);\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-highlight-color, 7%);\n }\n}\n\n@media screen and (min-width: $no-gap-breakpoint) {\n .tabs-bar {\n width: 100%;\n }\n\n .react-swipeable-view-container .columns-area--mobile {\n height: calc(100% - 10px) !important;\n }\n\n .getting-started__wrapper,\n .getting-started__trends,\n .search {\n margin-bottom: 10px;\n }\n\n .getting-started__panel {\n margin: 10px 0;\n }\n\n .column,\n .drawer {\n min-width: 330px;\n }\n}\n\n@media screen and (max-width: 600px + (285px * 1) + (10px * 1)) {\n .columns-area__panels__pane--compositional {\n display: none;\n }\n}\n\n@media screen and (min-width: 600px + (285px * 1) + (10px * 1)) {\n .floating-action-button,\n .tabs-bar__link.optional {\n display: none;\n }\n\n .search-page .search {\n display: none;\n }\n}\n\n@media screen and (max-width: 600px + (285px * 2) + (10px * 2)) {\n .columns-area__panels__pane--navigational {\n display: none;\n }\n}\n\n@media screen and (min-width: 600px + (285px * 2) + (10px * 2)) {\n .tabs-bar {\n display: none;\n }\n}\n\n.icon-with-badge {\n position: relative;\n\n &__badge {\n position: absolute;\n left: 9px;\n top: -13px;\n background: $ui-highlight-color;\n border: 2px solid lighten($ui-base-color, 8%);\n padding: 1px 6px;\n border-radius: 6px;\n font-size: 10px;\n font-weight: 500;\n line-height: 14px;\n color: $primary-text-color;\n }\n}\n\n.column-link--transparent .icon-with-badge__badge {\n border-color: darken($ui-base-color, 8%);\n}\n\n.compose-panel {\n width: 285px;\n margin-top: 10px;\n display: flex;\n flex-direction: column;\n height: calc(100% - 10px);\n overflow-y: hidden;\n\n .navigation-bar {\n padding-top: 20px;\n padding-bottom: 20px;\n flex: 0 1 48px;\n min-height: 20px;\n }\n\n .flex-spacer {\n background: transparent;\n }\n\n .compose-form {\n flex: 1;\n overflow-y: hidden;\n display: flex;\n flex-direction: column;\n min-height: 310px;\n padding-bottom: 71px;\n margin-bottom: -71px;\n }\n\n .compose-form__autosuggest-wrapper {\n overflow-y: auto;\n background-color: $white;\n border-radius: 4px 4px 0 0;\n flex: 0 1 auto;\n }\n\n .autosuggest-textarea__textarea {\n overflow-y: hidden;\n }\n\n .compose-form__upload-thumbnail {\n height: 80px;\n }\n}\n\n.navigation-panel {\n margin-top: 10px;\n margin-bottom: 10px;\n height: calc(100% - 20px);\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n\n & > a {\n flex: 0 0 auto;\n }\n\n hr {\n flex: 0 0 auto;\n border: 0;\n background: transparent;\n border-top: 1px solid lighten($ui-base-color, 4%);\n margin: 10px 0;\n }\n\n .flex-spacer {\n background: transparent;\n }\n}\n\n.drawer__pager {\n box-sizing: border-box;\n padding: 0;\n flex-grow: 1;\n position: relative;\n overflow: hidden;\n display: flex;\n}\n\n.drawer__inner {\n position: absolute;\n top: 0;\n left: 0;\n background: lighten($ui-base-color, 13%);\n box-sizing: border-box;\n padding: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n overflow-y: auto;\n width: 100%;\n height: 100%;\n border-radius: 2px;\n\n &.darker {\n background: $ui-base-color;\n }\n}\n\n.drawer__inner__mastodon {\n background: lighten($ui-base-color, 13%) url('data:image/svg+xml;utf8,') no-repeat bottom / 100% auto;\n flex: 1;\n min-height: 47px;\n display: none;\n\n > img {\n display: block;\n object-fit: contain;\n object-position: bottom left;\n width: 85%;\n height: 100%;\n pointer-events: none;\n user-drag: none;\n user-select: none;\n }\n\n @media screen and (min-height: 640px) {\n display: block;\n }\n}\n\n.pseudo-drawer {\n background: lighten($ui-base-color, 13%);\n font-size: 13px;\n text-align: left;\n}\n\n.drawer__header {\n flex: 0 0 auto;\n font-size: 16px;\n background: lighten($ui-base-color, 8%);\n margin-bottom: 10px;\n display: flex;\n flex-direction: row;\n border-radius: 2px;\n\n a {\n transition: background 100ms ease-in;\n\n &:hover {\n background: lighten($ui-base-color, 3%);\n transition: background 200ms ease-out;\n }\n }\n}\n\n.scrollable {\n overflow-y: scroll;\n overflow-x: hidden;\n flex: 1 1 auto;\n -webkit-overflow-scrolling: touch;\n\n &.optionally-scrollable {\n overflow-y: auto;\n }\n\n @supports(display: grid) { // hack to fix Chrome <57\n contain: strict;\n }\n\n &--flex {\n display: flex;\n flex-direction: column;\n }\n\n &__append {\n flex: 1 1 auto;\n position: relative;\n min-height: 120px;\n }\n}\n\n.scrollable.fullscreen {\n @supports(display: grid) { // hack to fix Chrome <57\n contain: none;\n }\n}\n\n.column-back-button {\n box-sizing: border-box;\n width: 100%;\n background: lighten($ui-base-color, 4%);\n color: $highlight-text-color;\n cursor: pointer;\n flex: 0 0 auto;\n font-size: 16px;\n line-height: inherit;\n border: 0;\n text-align: unset;\n padding: 15px;\n margin: 0;\n z-index: 3;\n outline: 0;\n\n &:hover {\n text-decoration: underline;\n }\n}\n\n.column-header__back-button {\n background: lighten($ui-base-color, 4%);\n border: 0;\n font-family: inherit;\n color: $highlight-text-color;\n cursor: pointer;\n white-space: nowrap;\n font-size: 16px;\n padding: 0 5px 0 0;\n z-index: 3;\n\n &:hover {\n text-decoration: underline;\n }\n\n &:last-child {\n padding: 0 15px 0 0;\n }\n}\n\n.column-back-button__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.column-back-button--slim {\n position: relative;\n}\n\n.column-back-button--slim-button {\n cursor: pointer;\n flex: 0 0 auto;\n font-size: 16px;\n padding: 15px;\n position: absolute;\n right: 0;\n top: -48px;\n}\n\n.react-toggle {\n display: inline-block;\n position: relative;\n cursor: pointer;\n background-color: transparent;\n border: 0;\n padding: 0;\n user-select: none;\n -webkit-tap-highlight-color: rgba($base-overlay-background, 0);\n -webkit-tap-highlight-color: transparent;\n}\n\n.react-toggle-screenreader-only {\n border: 0;\n clip: rect(0 0 0 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n}\n\n.react-toggle--disabled {\n cursor: not-allowed;\n opacity: 0.5;\n transition: opacity 0.25s;\n}\n\n.react-toggle-track {\n width: 50px;\n height: 24px;\n padding: 0;\n border-radius: 30px;\n background-color: $ui-base-color;\n transition: background-color 0.2s ease;\n}\n\n.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track {\n background-color: darken($ui-base-color, 10%);\n}\n\n.react-toggle--checked .react-toggle-track {\n background-color: $ui-highlight-color;\n}\n\n.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track {\n background-color: lighten($ui-highlight-color, 10%);\n}\n\n.react-toggle-track-check {\n position: absolute;\n width: 14px;\n height: 10px;\n top: 0;\n bottom: 0;\n margin-top: auto;\n margin-bottom: auto;\n line-height: 0;\n left: 8px;\n opacity: 0;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle--checked .react-toggle-track-check {\n opacity: 1;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle-track-x {\n position: absolute;\n width: 10px;\n height: 10px;\n top: 0;\n bottom: 0;\n margin-top: auto;\n margin-bottom: auto;\n line-height: 0;\n right: 10px;\n opacity: 1;\n transition: opacity 0.25s ease;\n}\n\n.react-toggle--checked .react-toggle-track-x {\n opacity: 0;\n}\n\n.react-toggle-thumb {\n position: absolute;\n top: 1px;\n left: 1px;\n width: 22px;\n height: 22px;\n border: 1px solid $ui-base-color;\n border-radius: 50%;\n background-color: darken($simple-background-color, 2%);\n box-sizing: border-box;\n transition: all 0.25s ease;\n transition-property: border-color, left;\n}\n\n.react-toggle--checked .react-toggle-thumb {\n left: 27px;\n border-color: $ui-highlight-color;\n}\n\n.column-link {\n background: lighten($ui-base-color, 8%);\n color: $primary-text-color;\n display: block;\n font-size: 16px;\n padding: 15px;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 11%);\n }\n\n &:focus {\n outline: 0;\n }\n\n &--transparent {\n background: transparent;\n color: $ui-secondary-color;\n\n &:hover,\n &:focus,\n &:active {\n background: transparent;\n color: $primary-text-color;\n }\n\n &.active {\n color: $ui-highlight-color;\n }\n }\n}\n\n.column-link__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.column-link__badge {\n display: inline-block;\n border-radius: 4px;\n font-size: 12px;\n line-height: 19px;\n font-weight: 500;\n background: $ui-base-color;\n padding: 4px 8px;\n margin: -6px 10px;\n}\n\n.column-subheading {\n background: $ui-base-color;\n color: $dark-text-color;\n padding: 8px 20px;\n font-size: 12px;\n font-weight: 500;\n text-transform: uppercase;\n cursor: default;\n}\n\n.getting-started__wrapper,\n.getting-started,\n.flex-spacer {\n background: $ui-base-color;\n}\n\n.flex-spacer {\n flex: 1 1 auto;\n}\n\n.getting-started {\n color: $dark-text-color;\n overflow: auto;\n border-bottom-left-radius: 2px;\n border-bottom-right-radius: 2px;\n\n &__wrapper,\n &__panel,\n &__footer {\n height: min-content;\n }\n\n &__panel,\n &__footer\n {\n padding: 10px;\n padding-top: 20px;\n flex-grow: 0;\n\n ul {\n margin-bottom: 10px;\n }\n\n ul li {\n display: inline;\n }\n\n p {\n font-size: 13px;\n\n a {\n color: $dark-text-color;\n text-decoration: underline;\n }\n }\n\n a {\n text-decoration: none;\n color: $darker-text-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n }\n\n &__wrapper,\n &__footer\n {\n color: $dark-text-color;\n }\n\n &__trends {\n flex: 0 1 auto;\n opacity: 1;\n animation: fade 150ms linear;\n margin-top: 10px;\n\n h4 {\n font-size: 12px;\n text-transform: uppercase;\n color: $darker-text-color;\n padding: 10px;\n font-weight: 500;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n @media screen and (max-height: 810px) {\n .trends__item:nth-child(3) {\n display: none;\n }\n }\n\n @media screen and (max-height: 720px) {\n .trends__item:nth-child(2) {\n display: none;\n }\n }\n\n @media screen and (max-height: 670px) {\n display: none;\n }\n\n .trends__item {\n border-bottom: 0;\n padding: 10px;\n\n &__current {\n color: $darker-text-color;\n }\n }\n }\n}\n\n.keyboard-shortcuts {\n padding: 8px 0 0;\n overflow: hidden;\n\n thead {\n position: absolute;\n left: -9999px;\n }\n\n td {\n padding: 0 10px 8px;\n }\n\n kbd {\n display: inline-block;\n padding: 3px 5px;\n background-color: lighten($ui-base-color, 8%);\n border: 1px solid darken($ui-base-color, 4%);\n }\n}\n\n.setting-text {\n display: block;\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n color: $inverted-text-color;\n background: $simple-background-color;\n padding: 10px;\n font-family: inherit;\n font-size: 14px;\n resize: vertical;\n border: 0;\n outline: 0;\n border-radius: 4px;\n\n &:focus {\n outline: 0;\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n}\n\n.no-reduce-motion button.icon-button i.fa-retweet {\n background-position: 0 0;\n height: 19px;\n transition: background-position 0.9s steps(10);\n transition-duration: 0s;\n vertical-align: middle;\n width: 22px;\n\n &::before {\n display: none !important;\n }\n\n}\n\n.no-reduce-motion button.icon-button.active i.fa-retweet {\n transition-duration: 0.9s;\n background-position: 0 100%;\n}\n\n.reduce-motion button.icon-button i.fa-retweet {\n color: $action-button-color;\n transition: color 100ms ease-in;\n}\n\n.reduce-motion button.icon-button.active i.fa-retweet {\n color: $highlight-text-color;\n}\n\n.status-card {\n display: flex;\n font-size: 14px;\n border: 1px solid lighten($ui-base-color, 8%);\n border-radius: 4px;\n color: $dark-text-color;\n margin-top: 14px;\n text-decoration: none;\n overflow: hidden;\n\n &__actions {\n bottom: 0;\n left: 0;\n position: absolute;\n right: 0;\n top: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n\n & > div {\n background: rgba($base-shadow-color, 0.6);\n border-radius: 8px;\n padding: 12px 9px;\n flex: 0 0 auto;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n button,\n a {\n display: inline;\n color: $secondary-text-color;\n background: transparent;\n border: 0;\n padding: 0 8px;\n text-decoration: none;\n font-size: 18px;\n line-height: 18px;\n\n &:hover,\n &:active,\n &:focus {\n color: $primary-text-color;\n }\n }\n\n a {\n font-size: 19px;\n position: relative;\n bottom: -1px;\n }\n }\n}\n\na.status-card {\n cursor: pointer;\n\n &:hover {\n background: lighten($ui-base-color, 8%);\n }\n}\n\n.status-card-photo {\n cursor: zoom-in;\n display: block;\n text-decoration: none;\n width: 100%;\n height: auto;\n margin: 0;\n}\n\n.status-card-video {\n iframe {\n width: 100%;\n height: 100%;\n }\n}\n\n.status-card__title {\n display: block;\n font-weight: 500;\n margin-bottom: 5px;\n color: $darker-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-decoration: none;\n}\n\n.status-card__content {\n flex: 1 1 auto;\n overflow: hidden;\n padding: 14px 14px 14px 8px;\n}\n\n.status-card__description {\n color: $darker-text-color;\n}\n\n.status-card__host {\n display: block;\n margin-top: 5px;\n font-size: 13px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.status-card__image {\n flex: 0 0 100px;\n background: lighten($ui-base-color, 8%);\n position: relative;\n\n & > .fa {\n font-size: 21px;\n position: absolute;\n transform-origin: 50% 50%;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n}\n\n.status-card.horizontal {\n display: block;\n\n .status-card__image {\n width: 100%;\n }\n\n .status-card__image-image {\n border-radius: 4px 4px 0 0;\n }\n\n .status-card__title {\n white-space: inherit;\n }\n}\n\n.status-card.compact {\n border-color: lighten($ui-base-color, 4%);\n\n &.interactive {\n border: 0;\n }\n\n .status-card__content {\n padding: 8px;\n padding-top: 10px;\n }\n\n .status-card__title {\n white-space: nowrap;\n }\n\n .status-card__image {\n flex: 0 0 60px;\n }\n}\n\na.status-card.compact:hover {\n background-color: lighten($ui-base-color, 4%);\n}\n\n.status-card__image-image {\n border-radius: 4px 0 0 4px;\n display: block;\n margin: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n background-size: cover;\n background-position: center center;\n}\n\n.load-more {\n display: block;\n color: $dark-text-color;\n background-color: transparent;\n border: 0;\n font-size: inherit;\n text-align: center;\n line-height: inherit;\n margin: 0;\n padding: 15px;\n box-sizing: border-box;\n width: 100%;\n clear: both;\n text-decoration: none;\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n}\n\n.load-gap {\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n}\n\n.regeneration-indicator {\n text-align: center;\n font-size: 16px;\n font-weight: 500;\n color: $dark-text-color;\n background: $ui-base-color;\n cursor: default;\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 20px;\n\n &__figure {\n &,\n img {\n display: block;\n width: auto;\n height: 160px;\n margin: 0;\n }\n }\n\n &--without-header {\n padding-top: 20px + 48px;\n }\n\n &__label {\n margin-top: 30px;\n\n strong {\n display: block;\n margin-bottom: 10px;\n color: $dark-text-color;\n }\n\n span {\n font-size: 15px;\n font-weight: 400;\n }\n }\n}\n\n.column-header__wrapper {\n position: relative;\n flex: 0 0 auto;\n z-index: 1;\n\n &.active {\n box-shadow: 0 1px 0 rgba($highlight-text-color, 0.3);\n\n &::before {\n display: block;\n content: \"\";\n position: absolute;\n bottom: -13px;\n left: 0;\n right: 0;\n margin: 0 auto;\n width: 60%;\n pointer-events: none;\n height: 28px;\n z-index: 1;\n background: radial-gradient(ellipse, rgba($ui-highlight-color, 0.23) 0%, rgba($ui-highlight-color, 0) 60%);\n }\n }\n\n .announcements {\n z-index: 1;\n position: relative;\n }\n}\n\n.column-header {\n display: flex;\n font-size: 16px;\n background: lighten($ui-base-color, 4%);\n flex: 0 0 auto;\n cursor: pointer;\n position: relative;\n z-index: 2;\n outline: 0;\n overflow: hidden;\n border-top-left-radius: 2px;\n border-top-right-radius: 2px;\n\n & > button {\n margin: 0;\n border: 0;\n padding: 15px 0 15px 15px;\n color: inherit;\n background: transparent;\n font: inherit;\n text-align: left;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n flex: 1;\n }\n\n & > .column-header__back-button {\n color: $highlight-text-color;\n }\n\n &.active {\n .column-header__icon {\n color: $highlight-text-color;\n text-shadow: 0 0 10px rgba($highlight-text-color, 0.4);\n }\n }\n\n &:focus,\n &:active {\n outline: 0;\n }\n}\n\n.column-header__buttons {\n height: 48px;\n display: flex;\n}\n\n.column-header__links {\n margin-bottom: 14px;\n}\n\n.column-header__links .text-btn {\n margin-right: 10px;\n}\n\n.column-header__button {\n background: lighten($ui-base-color, 4%);\n border: 0;\n color: $darker-text-color;\n cursor: pointer;\n font-size: 16px;\n padding: 0 15px;\n\n &:hover {\n color: lighten($darker-text-color, 7%);\n }\n\n &.active {\n color: $primary-text-color;\n background: lighten($ui-base-color, 8%);\n\n &:hover {\n color: $primary-text-color;\n background: lighten($ui-base-color, 8%);\n }\n }\n}\n\n.column-header__collapsible {\n max-height: 70vh;\n overflow: hidden;\n overflow-y: auto;\n color: $darker-text-color;\n transition: max-height 150ms ease-in-out, opacity 300ms linear;\n opacity: 1;\n z-index: 1;\n position: relative;\n\n &.collapsed {\n max-height: 0;\n opacity: 0.5;\n }\n\n &.animating {\n overflow-y: hidden;\n }\n\n hr {\n height: 0;\n background: transparent;\n border: 0;\n border-top: 1px solid lighten($ui-base-color, 12%);\n margin: 10px 0;\n }\n}\n\n.column-header__collapsible-inner {\n background: lighten($ui-base-color, 8%);\n padding: 15px;\n}\n\n.column-header__setting-btn {\n &:hover {\n color: $darker-text-color;\n text-decoration: underline;\n }\n}\n\n.column-header__setting-arrows {\n float: right;\n\n .column-header__setting-btn {\n padding: 0 10px;\n\n &:last-child {\n padding-right: 0;\n }\n }\n}\n\n.text-btn {\n display: inline-block;\n padding: 0;\n font-family: inherit;\n font-size: inherit;\n color: inherit;\n border: 0;\n background: transparent;\n cursor: pointer;\n}\n\n.column-header__icon {\n display: inline-block;\n margin-right: 5px;\n}\n\n.loading-indicator {\n color: $dark-text-color;\n font-size: 12px;\n font-weight: 400;\n text-transform: uppercase;\n overflow: visible;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n\n span {\n display: block;\n float: left;\n margin-left: 50%;\n transform: translateX(-50%);\n margin: 82px 0 0 50%;\n white-space: nowrap;\n }\n}\n\n.loading-indicator__figure {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 42px;\n height: 42px;\n box-sizing: border-box;\n background-color: transparent;\n border: 0 solid lighten($ui-base-color, 26%);\n border-width: 6px;\n border-radius: 50%;\n}\n\n.no-reduce-motion .loading-indicator span {\n animation: loader-label 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1);\n}\n\n.no-reduce-motion .loading-indicator__figure {\n animation: loader-figure 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1);\n}\n\n@keyframes spring-rotate-in {\n 0% {\n transform: rotate(0deg);\n }\n\n 30% {\n transform: rotate(-484.8deg);\n }\n\n 60% {\n transform: rotate(-316.7deg);\n }\n\n 90% {\n transform: rotate(-375deg);\n }\n\n 100% {\n transform: rotate(-360deg);\n }\n}\n\n@keyframes spring-rotate-out {\n 0% {\n transform: rotate(-360deg);\n }\n\n 30% {\n transform: rotate(124.8deg);\n }\n\n 60% {\n transform: rotate(-43.27deg);\n }\n\n 90% {\n transform: rotate(15deg);\n }\n\n 100% {\n transform: rotate(0deg);\n }\n}\n\n@keyframes loader-figure {\n 0% {\n width: 0;\n height: 0;\n background-color: lighten($ui-base-color, 26%);\n }\n\n 29% {\n background-color: lighten($ui-base-color, 26%);\n }\n\n 30% {\n width: 42px;\n height: 42px;\n background-color: transparent;\n border-width: 21px;\n opacity: 1;\n }\n\n 100% {\n width: 42px;\n height: 42px;\n border-width: 0;\n opacity: 0;\n background-color: transparent;\n }\n}\n\n@keyframes loader-label {\n 0% { opacity: 0.25; }\n 30% { opacity: 1; }\n 100% { opacity: 0.25; }\n}\n\n.video-error-cover {\n align-items: center;\n background: $base-overlay-background;\n color: $primary-text-color;\n cursor: pointer;\n display: flex;\n flex-direction: column;\n height: 100%;\n justify-content: center;\n margin-top: 8px;\n position: relative;\n text-align: center;\n z-index: 100;\n}\n\n.media-spoiler {\n background: $base-overlay-background;\n color: $darker-text-color;\n border: 0;\n padding: 0;\n width: 100%;\n height: 100%;\n border-radius: 4px;\n appearance: none;\n\n &:hover,\n &:active,\n &:focus {\n padding: 0;\n color: lighten($darker-text-color, 8%);\n }\n}\n\n.media-spoiler__warning {\n display: block;\n font-size: 14px;\n}\n\n.media-spoiler__trigger {\n display: block;\n font-size: 11px;\n font-weight: 700;\n}\n\n.spoiler-button {\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n position: absolute;\n z-index: 100;\n\n &--minified {\n display: block;\n left: 4px;\n top: 4px;\n width: auto;\n height: auto;\n }\n\n &--click-thru {\n pointer-events: none;\n }\n\n &--hidden {\n display: none;\n }\n\n &__overlay {\n display: block;\n background: transparent;\n width: 100%;\n height: 100%;\n border: 0;\n\n &__label {\n display: inline-block;\n background: rgba($base-overlay-background, 0.5);\n border-radius: 8px;\n padding: 8px 12px;\n color: $primary-text-color;\n font-weight: 500;\n font-size: 14px;\n }\n\n &:hover,\n &:focus,\n &:active {\n .spoiler-button__overlay__label {\n background: rgba($base-overlay-background, 0.8);\n }\n }\n\n &:disabled {\n .spoiler-button__overlay__label {\n background: rgba($base-overlay-background, 0.5);\n }\n }\n }\n}\n\n.modal-container--preloader {\n background: lighten($ui-base-color, 8%);\n}\n\n.account--panel {\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: row;\n padding: 10px 0;\n}\n\n.account--panel__button,\n.detailed-status__button {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.column-settings__outer {\n background: lighten($ui-base-color, 8%);\n padding: 15px;\n}\n\n.column-settings__section {\n color: $darker-text-color;\n cursor: default;\n display: block;\n font-weight: 500;\n margin-bottom: 10px;\n}\n\n.column-settings__hashtags {\n .column-settings__row {\n margin-bottom: 15px;\n }\n\n .column-select {\n &__control {\n @include search-input;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n &__placeholder {\n color: $dark-text-color;\n padding-left: 2px;\n font-size: 12px;\n }\n\n &__value-container {\n padding-left: 6px;\n }\n\n &__multi-value {\n background: lighten($ui-base-color, 8%);\n\n &__remove {\n cursor: pointer;\n\n &:hover,\n &:active,\n &:focus {\n background: lighten($ui-base-color, 12%);\n color: lighten($darker-text-color, 4%);\n }\n }\n }\n\n &__multi-value__label,\n &__input {\n color: $darker-text-color;\n }\n\n &__clear-indicator,\n &__dropdown-indicator {\n cursor: pointer;\n transition: none;\n color: $dark-text-color;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($dark-text-color, 4%);\n }\n }\n\n &__indicator-separator {\n background-color: lighten($ui-base-color, 8%);\n }\n\n &__menu {\n @include search-popout;\n padding: 0;\n background: $ui-secondary-color;\n }\n\n &__menu-list {\n padding: 6px;\n }\n\n &__option {\n color: $inverted-text-color;\n border-radius: 4px;\n font-size: 14px;\n\n &--is-focused,\n &--is-selected {\n background: darken($ui-secondary-color, 10%);\n }\n }\n }\n}\n\n.column-settings__row {\n .text-btn {\n margin-bottom: 15px;\n }\n}\n\n.relationship-tag {\n color: $primary-text-color;\n margin-bottom: 4px;\n display: block;\n vertical-align: top;\n background-color: $base-overlay-background;\n text-transform: uppercase;\n font-size: 11px;\n font-weight: 500;\n padding: 4px;\n border-radius: 4px;\n opacity: 0.7;\n\n &:hover {\n opacity: 1;\n }\n}\n\n.setting-toggle {\n display: block;\n line-height: 24px;\n}\n\n.setting-toggle__label {\n color: $darker-text-color;\n display: inline-block;\n margin-bottom: 14px;\n margin-left: 8px;\n vertical-align: middle;\n}\n\n.empty-column-indicator,\n.error-column,\n.follow_requests-unlocked_explanation {\n color: $dark-text-color;\n background: $ui-base-color;\n text-align: center;\n padding: 20px;\n font-size: 15px;\n font-weight: 400;\n cursor: default;\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n justify-content: center;\n\n @supports(display: grid) { // hack to fix Chrome <57\n contain: strict;\n }\n\n & > span {\n max-width: 400px;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.follow_requests-unlocked_explanation {\n background: darken($ui-base-color, 4%);\n contain: initial;\n}\n\n.error-column {\n flex-direction: column;\n}\n\n@keyframes heartbeat {\n from {\n transform: scale(1);\n animation-timing-function: ease-out;\n }\n\n 10% {\n transform: scale(0.91);\n animation-timing-function: ease-in;\n }\n\n 17% {\n transform: scale(0.98);\n animation-timing-function: ease-out;\n }\n\n 33% {\n transform: scale(0.87);\n animation-timing-function: ease-in;\n }\n\n 45% {\n transform: scale(1);\n animation-timing-function: ease-out;\n }\n}\n\n.no-reduce-motion .pulse-loading {\n transform-origin: center center;\n animation: heartbeat 1.5s ease-in-out infinite both;\n}\n\n@keyframes shake-bottom {\n 0%,\n 100% {\n transform: rotate(0deg);\n transform-origin: 50% 100%;\n }\n\n 10% {\n transform: rotate(2deg);\n }\n\n 20%,\n 40%,\n 60% {\n transform: rotate(-4deg);\n }\n\n 30%,\n 50%,\n 70% {\n transform: rotate(4deg);\n }\n\n 80% {\n transform: rotate(-2deg);\n }\n\n 90% {\n transform: rotate(2deg);\n }\n}\n\n.no-reduce-motion .shake-bottom {\n transform-origin: 50% 100%;\n animation: shake-bottom 0.8s cubic-bezier(0.455, 0.03, 0.515, 0.955) 2s 2 both;\n}\n\n.emoji-picker-dropdown__menu {\n background: $simple-background-color;\n position: absolute;\n box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n margin-top: 5px;\n z-index: 2;\n\n .emoji-mart-scroll {\n transition: opacity 200ms ease;\n }\n\n &.selecting .emoji-mart-scroll {\n opacity: 0.5;\n }\n}\n\n.emoji-picker-dropdown__modifiers {\n position: absolute;\n top: 60px;\n right: 11px;\n cursor: pointer;\n}\n\n.emoji-picker-dropdown__modifiers__menu {\n position: absolute;\n z-index: 4;\n top: -4px;\n left: -8px;\n background: $simple-background-color;\n border-radius: 4px;\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n overflow: hidden;\n\n button {\n display: block;\n cursor: pointer;\n border: 0;\n padding: 4px 8px;\n background: transparent;\n\n &:hover,\n &:focus,\n &:active {\n background: rgba($ui-secondary-color, 0.4);\n }\n }\n\n .emoji-mart-emoji {\n height: 22px;\n }\n}\n\n.emoji-mart-emoji {\n span {\n background-repeat: no-repeat;\n }\n}\n\n.upload-area {\n align-items: center;\n background: rgba($base-overlay-background, 0.8);\n display: flex;\n height: 100%;\n justify-content: center;\n left: 0;\n opacity: 0;\n position: absolute;\n top: 0;\n visibility: hidden;\n width: 100%;\n z-index: 2000;\n\n * {\n pointer-events: none;\n }\n}\n\n.upload-area__drop {\n width: 320px;\n height: 160px;\n display: flex;\n box-sizing: border-box;\n position: relative;\n padding: 8px;\n}\n\n.upload-area__background {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: -1;\n border-radius: 4px;\n background: $ui-base-color;\n box-shadow: 0 0 5px rgba($base-shadow-color, 0.2);\n}\n\n.upload-area__content {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: $secondary-text-color;\n font-size: 18px;\n font-weight: 500;\n border: 2px dashed $ui-base-lighter-color;\n border-radius: 4px;\n}\n\n.upload-progress {\n padding: 10px;\n color: $lighter-text-color;\n overflow: hidden;\n display: flex;\n\n .fa {\n font-size: 34px;\n margin-right: 10px;\n }\n\n span {\n font-size: 12px;\n text-transform: uppercase;\n font-weight: 500;\n display: block;\n }\n}\n\n.upload-progess__message {\n flex: 1 1 auto;\n}\n\n.upload-progress__backdrop {\n width: 100%;\n height: 6px;\n border-radius: 6px;\n background: $ui-base-lighter-color;\n position: relative;\n margin-top: 5px;\n}\n\n.upload-progress__tracker {\n position: absolute;\n left: 0;\n top: 0;\n height: 6px;\n background: $ui-highlight-color;\n border-radius: 6px;\n}\n\n.emoji-button {\n display: block;\n padding: 5px 5px 2px 2px;\n outline: 0;\n cursor: pointer;\n\n &:active,\n &:focus {\n outline: 0 !important;\n }\n\n img {\n filter: grayscale(100%);\n opacity: 0.8;\n display: block;\n margin: 0;\n width: 22px;\n height: 22px;\n }\n\n &:hover,\n &:active,\n &:focus {\n img {\n opacity: 1;\n filter: none;\n }\n }\n}\n\n.dropdown--active .emoji-button img {\n opacity: 1;\n filter: none;\n}\n\n.privacy-dropdown__dropdown {\n position: absolute;\n background: $simple-background-color;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n border-radius: 4px;\n margin-left: 40px;\n overflow: hidden;\n\n &.top {\n transform-origin: 50% 100%;\n }\n\n &.bottom {\n transform-origin: 50% 0;\n }\n}\n\n.privacy-dropdown__option {\n color: $inverted-text-color;\n padding: 10px;\n cursor: pointer;\n display: flex;\n\n &:hover,\n &.active {\n background: $ui-highlight-color;\n color: $primary-text-color;\n outline: 0;\n\n .privacy-dropdown__option__content {\n color: $primary-text-color;\n\n strong {\n color: $primary-text-color;\n }\n }\n }\n\n &.active:hover {\n background: lighten($ui-highlight-color, 4%);\n }\n}\n\n.privacy-dropdown__option__icon {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 10px;\n}\n\n.privacy-dropdown__option__content {\n flex: 1 1 auto;\n color: $lighter-text-color;\n\n strong {\n font-weight: 500;\n display: block;\n color: $inverted-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n}\n\n.privacy-dropdown.active {\n .privacy-dropdown__value {\n background: $simple-background-color;\n border-radius: 4px 4px 0 0;\n box-shadow: 0 -4px 4px rgba($base-shadow-color, 0.1);\n\n .icon-button {\n transition: none;\n }\n\n &.active {\n background: $ui-highlight-color;\n\n .icon-button {\n color: $primary-text-color;\n }\n }\n }\n\n &.top .privacy-dropdown__value {\n border-radius: 0 0 4px 4px;\n }\n\n .privacy-dropdown__dropdown {\n display: block;\n box-shadow: 2px 4px 6px rgba($base-shadow-color, 0.1);\n }\n}\n\n.search {\n position: relative;\n}\n\n.search__input {\n @include search-input;\n\n display: block;\n padding: 15px;\n padding-right: 30px;\n line-height: 18px;\n font-size: 16px;\n\n &::placeholder {\n color: lighten($darker-text-color, 4%);\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n}\n\n.search__icon {\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus {\n outline: 0 !important;\n }\n\n .fa {\n position: absolute;\n top: 16px;\n right: 10px;\n z-index: 2;\n display: inline-block;\n opacity: 0;\n transition: all 100ms linear;\n transition-property: transform, opacity;\n font-size: 18px;\n width: 18px;\n height: 18px;\n color: $secondary-text-color;\n cursor: default;\n pointer-events: none;\n\n &.active {\n pointer-events: auto;\n opacity: 0.3;\n }\n }\n\n .fa-search {\n transform: rotate(90deg);\n\n &.active {\n pointer-events: none;\n transform: rotate(0deg);\n }\n }\n\n .fa-times-circle {\n top: 17px;\n transform: rotate(0deg);\n color: $action-button-color;\n cursor: pointer;\n\n &.active {\n transform: rotate(90deg);\n }\n\n &:hover {\n color: lighten($action-button-color, 7%);\n }\n }\n}\n\n.search-results__header {\n color: $dark-text-color;\n background: lighten($ui-base-color, 2%);\n padding: 15px;\n font-weight: 500;\n font-size: 16px;\n cursor: default;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n}\n\n.search-results__section {\n margin-bottom: 5px;\n\n h5 {\n background: darken($ui-base-color, 4%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n display: flex;\n padding: 15px;\n font-weight: 500;\n font-size: 16px;\n color: $dark-text-color;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n .account:last-child,\n & > div:last-child .status {\n border-bottom: 0;\n }\n}\n\n.search-results__hashtag {\n display: block;\n padding: 10px;\n color: $secondary-text-color;\n text-decoration: none;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($secondary-text-color, 4%);\n text-decoration: underline;\n }\n}\n\n.search-results__info {\n padding: 20px;\n color: $darker-text-color;\n text-align: center;\n}\n\n.modal-root {\n position: relative;\n transition: opacity 0.3s linear;\n will-change: opacity;\n z-index: 9999;\n}\n\n.modal-root__overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba($base-overlay-background, 0.7);\n}\n\n.modal-root__container {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n align-content: space-around;\n z-index: 9999;\n pointer-events: none;\n user-select: none;\n}\n\n.modal-root__modal {\n pointer-events: auto;\n display: flex;\n z-index: 9999;\n}\n\n.video-modal__container {\n max-width: 100vw;\n max-height: 100vh;\n}\n\n.audio-modal__container {\n width: 50vw;\n}\n\n.media-modal {\n width: 100%;\n height: 100%;\n position: relative;\n\n .extended-video-player {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n video {\n max-width: $media-modal-media-max-width;\n max-height: $media-modal-media-max-height;\n }\n }\n}\n\n.media-modal__closer {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n}\n\n.media-modal__navigation {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n transition: opacity 0.3s linear;\n will-change: opacity;\n\n * {\n pointer-events: auto;\n }\n\n &.media-modal__navigation--hidden {\n opacity: 0;\n\n * {\n pointer-events: none;\n }\n }\n}\n\n.media-modal__nav {\n background: rgba($base-overlay-background, 0.5);\n box-sizing: border-box;\n border: 0;\n color: $primary-text-color;\n cursor: pointer;\n display: flex;\n align-items: center;\n font-size: 24px;\n height: 20vmax;\n margin: auto 0;\n padding: 30px 15px;\n position: absolute;\n top: 0;\n bottom: 0;\n}\n\n.media-modal__nav--left {\n left: 0;\n}\n\n.media-modal__nav--right {\n right: 0;\n}\n\n.media-modal__pagination {\n width: 100%;\n text-align: center;\n position: absolute;\n left: 0;\n bottom: 20px;\n pointer-events: none;\n}\n\n.media-modal__meta {\n text-align: center;\n position: absolute;\n left: 0;\n bottom: 20px;\n width: 100%;\n pointer-events: none;\n\n &--shifted {\n bottom: 62px;\n }\n\n a {\n pointer-events: auto;\n text-decoration: none;\n font-weight: 500;\n color: $ui-secondary-color;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n}\n\n.media-modal__page-dot {\n display: inline-block;\n}\n\n.media-modal__button {\n background-color: $primary-text-color;\n height: 12px;\n width: 12px;\n border-radius: 6px;\n margin: 10px;\n padding: 0;\n border: 0;\n font-size: 0;\n}\n\n.media-modal__button--active {\n background-color: $highlight-text-color;\n}\n\n.media-modal__close {\n position: absolute;\n right: 8px;\n top: 8px;\n z-index: 100;\n}\n\n.onboarding-modal,\n.error-modal,\n.embed-modal {\n background: $ui-secondary-color;\n color: $inverted-text-color;\n border-radius: 8px;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.error-modal__body {\n height: 80vh;\n width: 80vw;\n max-width: 520px;\n max-height: 420px;\n position: relative;\n\n & > div {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n padding: 25px;\n display: none;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n display: flex;\n opacity: 0;\n user-select: text;\n }\n}\n\n.error-modal__body {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n text-align: center;\n}\n\n.onboarding-modal__paginator,\n.error-modal__footer {\n flex: 0 0 auto;\n background: darken($ui-secondary-color, 8%);\n display: flex;\n padding: 25px;\n\n & > div {\n min-width: 33px;\n }\n\n .onboarding-modal__nav,\n .error-modal__nav {\n color: $lighter-text-color;\n border: 0;\n font-size: 14px;\n font-weight: 500;\n padding: 10px 25px;\n line-height: inherit;\n height: auto;\n margin: -10px;\n border-radius: 4px;\n background-color: transparent;\n\n &:hover,\n &:focus,\n &:active {\n color: darken($lighter-text-color, 4%);\n background-color: darken($ui-secondary-color, 16%);\n }\n\n &.onboarding-modal__done,\n &.onboarding-modal__next {\n color: $inverted-text-color;\n\n &:hover,\n &:focus,\n &:active {\n color: lighten($inverted-text-color, 4%);\n }\n }\n }\n}\n\n.error-modal__footer {\n justify-content: center;\n}\n\n.display-case {\n text-align: center;\n font-size: 15px;\n margin-bottom: 15px;\n\n &__label {\n font-weight: 500;\n color: $inverted-text-color;\n margin-bottom: 5px;\n text-transform: uppercase;\n font-size: 12px;\n }\n\n &__case {\n background: $ui-base-color;\n color: $secondary-text-color;\n font-weight: 500;\n padding: 10px;\n border-radius: 4px;\n }\n}\n\n.onboard-sliders {\n display: inline-block;\n max-width: 30px;\n max-height: auto;\n margin-left: 10px;\n}\n\n.boost-modal,\n.confirmation-modal,\n.report-modal,\n.actions-modal,\n.mute-modal,\n.block-modal {\n background: lighten($ui-secondary-color, 8%);\n color: $inverted-text-color;\n border-radius: 8px;\n overflow: hidden;\n max-width: 90vw;\n width: 480px;\n position: relative;\n flex-direction: column;\n\n .status__display-name {\n display: block;\n max-width: 100%;\n padding-right: 25px;\n }\n\n .status__avatar {\n height: 28px;\n left: 10px;\n position: absolute;\n top: 10px;\n width: 48px;\n }\n\n .status__content__spoiler-link {\n color: lighten($secondary-text-color, 8%);\n }\n}\n\n.actions-modal {\n .status {\n background: $white;\n border-bottom-color: $ui-secondary-color;\n padding-top: 10px;\n padding-bottom: 10px;\n }\n\n .dropdown-menu__separator {\n border-bottom-color: $ui-secondary-color;\n }\n}\n\n.boost-modal__container {\n overflow-x: scroll;\n padding: 10px;\n\n .status {\n user-select: text;\n border-bottom: 0;\n }\n}\n\n.boost-modal__action-bar,\n.confirmation-modal__action-bar,\n.mute-modal__action-bar,\n.block-modal__action-bar {\n display: flex;\n justify-content: space-between;\n background: $ui-secondary-color;\n padding: 10px;\n line-height: 36px;\n\n & > div {\n flex: 1 1 auto;\n text-align: right;\n color: $lighter-text-color;\n padding-right: 10px;\n }\n\n .button {\n flex: 0 0 auto;\n }\n}\n\n.boost-modal__status-header {\n font-size: 15px;\n}\n\n.boost-modal__status-time {\n float: right;\n font-size: 14px;\n}\n\n.mute-modal,\n.block-modal {\n line-height: 24px;\n}\n\n.mute-modal .react-toggle,\n.block-modal .react-toggle {\n vertical-align: middle;\n}\n\n.report-modal {\n width: 90vw;\n max-width: 700px;\n}\n\n.report-modal__container {\n display: flex;\n border-top: 1px solid $ui-secondary-color;\n\n @media screen and (max-width: 480px) {\n flex-wrap: wrap;\n overflow-y: auto;\n }\n}\n\n.report-modal__statuses,\n.report-modal__comment {\n box-sizing: border-box;\n width: 50%;\n\n @media screen and (max-width: 480px) {\n width: 100%;\n }\n}\n\n.report-modal__statuses,\n.focal-point-modal__content {\n flex: 1 1 auto;\n min-height: 20vh;\n max-height: 80vh;\n overflow-y: auto;\n overflow-x: hidden;\n\n .status__content a {\n color: $highlight-text-color;\n }\n\n .status__content,\n .status__content p {\n color: $inverted-text-color;\n }\n\n @media screen and (max-width: 480px) {\n max-height: 10vh;\n }\n}\n\n.focal-point-modal__content {\n @media screen and (max-width: 480px) {\n max-height: 40vh;\n }\n}\n\n.report-modal__comment {\n padding: 20px;\n border-right: 1px solid $ui-secondary-color;\n max-width: 320px;\n\n p {\n font-size: 14px;\n line-height: 20px;\n margin-bottom: 20px;\n }\n\n .setting-text {\n display: block;\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n color: $inverted-text-color;\n background: $white;\n padding: 10px;\n font-family: inherit;\n font-size: 14px;\n resize: none;\n border: 0;\n outline: 0;\n border-radius: 4px;\n border: 1px solid $ui-secondary-color;\n min-height: 100px;\n max-height: 50vh;\n margin-bottom: 10px;\n\n &:focus {\n border: 1px solid darken($ui-secondary-color, 8%);\n }\n\n &__wrapper {\n background: $white;\n border: 1px solid $ui-secondary-color;\n margin-bottom: 10px;\n border-radius: 4px;\n\n .setting-text {\n border: 0;\n margin-bottom: 0;\n border-radius: 0;\n\n &:focus {\n border: 0;\n }\n }\n\n &__modifiers {\n color: $inverted-text-color;\n font-family: inherit;\n font-size: 14px;\n background: $white;\n }\n }\n\n &__toolbar {\n display: flex;\n justify-content: space-between;\n margin-bottom: 20px;\n }\n }\n\n .setting-text-label {\n display: block;\n color: $inverted-text-color;\n font-size: 14px;\n font-weight: 500;\n margin-bottom: 10px;\n }\n\n .setting-toggle {\n margin-top: 20px;\n margin-bottom: 24px;\n\n &__label {\n color: $inverted-text-color;\n font-size: 14px;\n }\n }\n\n @media screen and (max-width: 480px) {\n padding: 10px;\n max-width: 100%;\n order: 2;\n\n .setting-toggle {\n margin-bottom: 4px;\n }\n }\n}\n\n.actions-modal {\n max-height: 80vh;\n max-width: 80vw;\n\n .status {\n overflow-y: auto;\n max-height: 300px;\n }\n\n .actions-modal__item-label {\n font-weight: 500;\n }\n\n ul {\n overflow-y: auto;\n flex-shrink: 0;\n max-height: 80vh;\n\n &.with-status {\n max-height: calc(80vh - 75px);\n }\n\n li:empty {\n margin: 0;\n }\n\n li:not(:empty) {\n a {\n color: $inverted-text-color;\n display: flex;\n padding: 12px 16px;\n font-size: 15px;\n align-items: center;\n text-decoration: none;\n\n &,\n button {\n transition: none;\n }\n\n &.active,\n &:hover,\n &:active,\n &:focus {\n &,\n button {\n background: $ui-highlight-color;\n color: $primary-text-color;\n }\n }\n\n button:first-child {\n margin-right: 10px;\n }\n }\n }\n }\n}\n\n.confirmation-modal__action-bar,\n.mute-modal__action-bar,\n.block-modal__action-bar {\n .confirmation-modal__secondary-button {\n flex-shrink: 1;\n }\n}\n\n.confirmation-modal__secondary-button,\n.confirmation-modal__cancel-button,\n.mute-modal__cancel-button,\n.block-modal__cancel-button {\n background-color: transparent;\n color: $lighter-text-color;\n font-size: 14px;\n font-weight: 500;\n\n &:hover,\n &:focus,\n &:active {\n color: darken($lighter-text-color, 4%);\n background-color: transparent;\n }\n}\n\n.confirmation-modal__container,\n.mute-modal__container,\n.block-modal__container,\n.report-modal__target {\n padding: 30px;\n font-size: 16px;\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n}\n\n.confirmation-modal__container,\n.report-modal__target {\n text-align: center;\n}\n\n.block-modal,\n.mute-modal {\n &__explanation {\n margin-top: 20px;\n }\n\n .setting-toggle {\n margin-top: 20px;\n margin-bottom: 24px;\n display: flex;\n align-items: center;\n\n &__label {\n color: $inverted-text-color;\n margin: 0;\n margin-left: 8px;\n }\n }\n}\n\n.report-modal__target {\n padding: 15px;\n\n .media-modal__close {\n top: 14px;\n right: 15px;\n }\n}\n\n.loading-bar {\n background-color: $highlight-text-color;\n height: 3px;\n position: absolute;\n top: 0;\n left: 0;\n z-index: 9999;\n}\n\n.media-gallery__gifv__label {\n display: block;\n position: absolute;\n color: $primary-text-color;\n background: rgba($base-overlay-background, 0.5);\n bottom: 6px;\n left: 6px;\n padding: 2px 6px;\n border-radius: 2px;\n font-size: 11px;\n font-weight: 600;\n z-index: 1;\n pointer-events: none;\n opacity: 0.9;\n transition: opacity 0.1s ease;\n line-height: 18px;\n}\n\n.media-gallery__gifv {\n &:hover {\n .media-gallery__gifv__label {\n opacity: 1;\n }\n }\n}\n\n.media-gallery__audio {\n margin-top: 32px;\n\n audio {\n width: 100%;\n }\n}\n\n.attachment-list {\n display: flex;\n font-size: 14px;\n border: 1px solid lighten($ui-base-color, 8%);\n border-radius: 4px;\n margin-top: 14px;\n overflow: hidden;\n\n &__icon {\n flex: 0 0 auto;\n color: $dark-text-color;\n padding: 8px 18px;\n cursor: default;\n border-right: 1px solid lighten($ui-base-color, 8%);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n font-size: 26px;\n\n .fa {\n display: block;\n }\n }\n\n &__list {\n list-style: none;\n padding: 4px 0;\n padding-left: 8px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n\n li {\n display: block;\n padding: 4px 0;\n }\n\n a {\n text-decoration: none;\n color: $dark-text-color;\n font-weight: 500;\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n &.compact {\n border: 0;\n margin-top: 4px;\n\n .attachment-list__list {\n padding: 0;\n display: block;\n }\n\n .fa {\n color: $dark-text-color;\n }\n }\n}\n\n/* Media Gallery */\n.media-gallery {\n box-sizing: border-box;\n margin-top: 8px;\n overflow: hidden;\n border-radius: 4px;\n position: relative;\n width: 100%;\n}\n\n.media-gallery__item {\n border: 0;\n box-sizing: border-box;\n display: block;\n float: left;\n position: relative;\n border-radius: 4px;\n overflow: hidden;\n\n &.standalone {\n .media-gallery__item-gifv-thumbnail {\n transform: none;\n top: 0;\n }\n }\n}\n\n.media-gallery__item-thumbnail {\n cursor: zoom-in;\n display: block;\n text-decoration: none;\n color: $secondary-text-color;\n position: relative;\n z-index: 1;\n\n &,\n img {\n height: 100%;\n width: 100%;\n }\n\n img {\n object-fit: cover;\n }\n}\n\n.media-gallery__preview {\n width: 100%;\n height: 100%;\n object-fit: cover;\n position: absolute;\n top: 0;\n left: 0;\n z-index: 0;\n background: $base-overlay-background;\n\n &--hidden {\n display: none;\n }\n}\n\n.media-gallery__gifv {\n height: 100%;\n overflow: hidden;\n position: relative;\n width: 100%;\n}\n\n.media-gallery__item-gifv-thumbnail {\n cursor: zoom-in;\n height: 100%;\n object-fit: cover;\n position: relative;\n top: 50%;\n transform: translateY(-50%);\n width: 100%;\n z-index: 1;\n}\n\n.media-gallery__item-thumbnail-label {\n clip: rect(1px 1px 1px 1px); /* IE6, IE7 */\n clip: rect(1px, 1px, 1px, 1px);\n overflow: hidden;\n position: absolute;\n}\n/* End Media Gallery */\n\n.detailed,\n.fullscreen {\n .video-player__volume__current,\n .video-player__volume::before {\n bottom: 27px;\n }\n\n .video-player__volume__handle {\n bottom: 23px;\n }\n\n}\n\n.audio-player {\n box-sizing: border-box;\n position: relative;\n background: darken($ui-base-color, 8%);\n border-radius: 4px;\n padding-bottom: 44px;\n direction: ltr;\n\n &.editable {\n border-radius: 0;\n height: 100%;\n }\n\n &__waveform {\n padding: 15px 0;\n position: relative;\n overflow: hidden;\n\n &::before {\n content: \"\";\n display: block;\n position: absolute;\n border-top: 1px solid lighten($ui-base-color, 4%);\n width: 100%;\n height: 0;\n left: 0;\n top: calc(50% + 1px);\n }\n }\n\n &__progress-placeholder {\n background-color: rgba(lighten($ui-highlight-color, 8%), 0.5);\n }\n\n &__wave-placeholder {\n background-color: lighten($ui-base-color, 16%);\n }\n\n .video-player__controls {\n padding: 0 15px;\n padding-top: 10px;\n background: darken($ui-base-color, 8%);\n border-top: 1px solid lighten($ui-base-color, 4%);\n border-radius: 0 0 4px 4px;\n }\n}\n\n.video-player {\n overflow: hidden;\n position: relative;\n background: $base-shadow-color;\n max-width: 100%;\n border-radius: 4px;\n box-sizing: border-box;\n direction: ltr;\n\n &.editable {\n border-radius: 0;\n height: 100% !important;\n }\n\n &:focus {\n outline: 0;\n }\n\n video {\n max-width: 100vw;\n max-height: 80vh;\n z-index: 1;\n }\n\n &.fullscreen {\n width: 100% !important;\n height: 100% !important;\n margin: 0;\n\n video {\n max-width: 100% !important;\n max-height: 100% !important;\n width: 100% !important;\n height: 100% !important;\n outline: 0;\n }\n }\n\n &.inline {\n video {\n object-fit: contain;\n position: relative;\n top: 50%;\n transform: translateY(-50%);\n }\n }\n\n &__controls {\n position: absolute;\n z-index: 2;\n bottom: 0;\n left: 0;\n right: 0;\n box-sizing: border-box;\n background: linear-gradient(0deg, rgba($base-shadow-color, 0.85) 0, rgba($base-shadow-color, 0.45) 60%, transparent);\n padding: 0 15px;\n opacity: 0;\n transition: opacity .1s ease;\n\n &.active {\n opacity: 1;\n }\n }\n\n &.inactive {\n video,\n .video-player__controls {\n visibility: hidden;\n }\n }\n\n &__spoiler {\n display: none;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 4;\n border: 0;\n background: $base-overlay-background;\n color: $darker-text-color;\n transition: none;\n pointer-events: none;\n\n &.active {\n display: block;\n pointer-events: auto;\n\n &:hover,\n &:active,\n &:focus {\n color: lighten($darker-text-color, 7%);\n }\n }\n\n &__title {\n display: block;\n font-size: 14px;\n }\n\n &__subtitle {\n display: block;\n font-size: 11px;\n font-weight: 500;\n }\n }\n\n &__buttons-bar {\n display: flex;\n justify-content: space-between;\n padding-bottom: 10px;\n\n .video-player__download__icon {\n color: inherit;\n }\n }\n\n &__buttons {\n font-size: 16px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &.left {\n button {\n padding-left: 0;\n }\n }\n\n &.right {\n button {\n padding-right: 0;\n }\n }\n\n button {\n background: transparent;\n padding: 2px 10px;\n font-size: 16px;\n border: 0;\n color: rgba($white, 0.75);\n\n &:active,\n &:hover,\n &:focus {\n color: $white;\n }\n }\n }\n\n &__time-sep,\n &__time-total,\n &__time-current {\n font-size: 14px;\n font-weight: 500;\n }\n\n &__time-current {\n color: $white;\n margin-left: 60px;\n }\n\n &__time-sep {\n display: inline-block;\n margin: 0 6px;\n }\n\n &__time-sep,\n &__time-total {\n color: $white;\n }\n\n &__volume {\n cursor: pointer;\n height: 24px;\n display: inline;\n\n &::before {\n content: \"\";\n width: 50px;\n background: rgba($white, 0.35);\n border-radius: 4px;\n display: block;\n position: absolute;\n height: 4px;\n left: 70px;\n bottom: 20px;\n }\n\n &__current {\n display: block;\n position: absolute;\n height: 4px;\n border-radius: 4px;\n left: 70px;\n bottom: 20px;\n background: lighten($ui-highlight-color, 8%);\n }\n\n &__handle {\n position: absolute;\n z-index: 3;\n border-radius: 50%;\n width: 12px;\n height: 12px;\n bottom: 16px;\n left: 70px;\n transition: opacity .1s ease;\n background: lighten($ui-highlight-color, 8%);\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n pointer-events: none;\n }\n }\n\n &__link {\n padding: 2px 10px;\n\n a {\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n color: $white;\n\n &:hover,\n &:active,\n &:focus {\n text-decoration: underline;\n }\n }\n }\n\n &__seek {\n cursor: pointer;\n height: 24px;\n position: relative;\n\n &::before {\n content: \"\";\n width: 100%;\n background: rgba($white, 0.35);\n border-radius: 4px;\n display: block;\n position: absolute;\n height: 4px;\n top: 10px;\n }\n\n &__progress,\n &__buffer {\n display: block;\n position: absolute;\n height: 4px;\n border-radius: 4px;\n top: 10px;\n background: lighten($ui-highlight-color, 8%);\n }\n\n &__buffer {\n background: rgba($white, 0.2);\n }\n\n &__handle {\n position: absolute;\n z-index: 3;\n opacity: 0;\n border-radius: 50%;\n width: 12px;\n height: 12px;\n top: 6px;\n margin-left: -6px;\n transition: opacity .1s ease;\n background: lighten($ui-highlight-color, 8%);\n box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);\n pointer-events: none;\n\n &.active {\n opacity: 1;\n }\n }\n\n &:hover {\n .video-player__seek__handle {\n opacity: 1;\n }\n }\n }\n\n &.detailed,\n &.fullscreen {\n .video-player__buttons {\n button {\n padding-top: 10px;\n padding-bottom: 10px;\n }\n }\n }\n}\n\n.directory {\n &__list {\n width: 100%;\n margin: 10px 0;\n transition: opacity 100ms ease-in;\n\n &.loading {\n opacity: 0.7;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n margin: 0;\n }\n }\n\n &__card {\n box-sizing: border-box;\n margin-bottom: 10px;\n\n &__img {\n height: 125px;\n position: relative;\n background: darken($ui-base-color, 12%);\n overflow: hidden;\n\n img {\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n object-fit: cover;\n }\n }\n\n &__bar {\n display: flex;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n padding: 10px;\n\n &__name {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n text-decoration: none;\n overflow: hidden;\n }\n\n &__relationship {\n width: 23px;\n min-height: 1px;\n flex: 0 0 auto;\n }\n\n .avatar {\n flex: 0 0 auto;\n width: 48px;\n height: 48px;\n padding-top: 2px;\n\n img {\n width: 100%;\n height: 100%;\n display: block;\n margin: 0;\n border-radius: 4px;\n background: darken($ui-base-color, 8%);\n object-fit: cover;\n }\n }\n\n .display-name {\n margin-left: 15px;\n text-align: left;\n\n strong {\n font-size: 15px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n span {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n &__extra {\n background: $ui-base-color;\n display: flex;\n align-items: center;\n justify-content: center;\n\n .accounts-table__count {\n width: 33.33%;\n flex: 0 0 auto;\n padding: 15px 0;\n }\n\n .account__header__content {\n box-sizing: border-box;\n padding: 15px 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n width: 100%;\n min-height: 18px + 30px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n p {\n display: none;\n\n &:first-child {\n display: inline;\n }\n }\n\n br {\n display: none;\n }\n }\n }\n }\n}\n\n.account-gallery__container {\n display: flex;\n flex-wrap: wrap;\n padding: 4px 2px;\n}\n\n.account-gallery__item {\n border: 0;\n box-sizing: border-box;\n display: block;\n position: relative;\n border-radius: 4px;\n overflow: hidden;\n margin: 2px;\n\n &__icons {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 24px;\n }\n}\n\n.notification__filter-bar,\n.account__section-headline {\n background: darken($ui-base-color, 4%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n cursor: default;\n display: flex;\n flex-shrink: 0;\n\n button {\n background: darken($ui-base-color, 4%);\n border: 0;\n margin: 0;\n }\n\n button,\n a {\n display: block;\n flex: 1 1 auto;\n color: $darker-text-color;\n padding: 15px 0;\n font-size: 14px;\n font-weight: 500;\n text-align: center;\n text-decoration: none;\n position: relative;\n width: 100%;\n white-space: nowrap;\n\n &.active {\n color: $secondary-text-color;\n\n &::before,\n &::after {\n display: block;\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 50%;\n width: 0;\n height: 0;\n transform: translateX(-50%);\n border-style: solid;\n border-width: 0 10px 10px;\n border-color: transparent transparent lighten($ui-base-color, 8%);\n }\n\n &::after {\n bottom: -1px;\n border-color: transparent transparent $ui-base-color;\n }\n }\n }\n\n &.directory__section-headline {\n background: darken($ui-base-color, 2%);\n border-bottom-color: transparent;\n\n a,\n button {\n &.active {\n &::before {\n display: none;\n }\n\n &::after {\n border-color: transparent transparent darken($ui-base-color, 7%);\n }\n }\n }\n }\n}\n\n.filter-form {\n background: $ui-base-color;\n\n &__column {\n padding: 10px 15px;\n }\n\n .radio-button {\n display: block;\n }\n}\n\n.radio-button {\n font-size: 14px;\n position: relative;\n display: inline-block;\n padding: 6px 0;\n line-height: 18px;\n cursor: default;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n cursor: pointer;\n\n input[type=radio],\n input[type=checkbox] {\n display: none;\n }\n\n &__input {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 50%;\n vertical-align: middle;\n\n &.checked {\n border-color: lighten($ui-highlight-color, 8%);\n background: lighten($ui-highlight-color, 8%);\n }\n }\n}\n\n::-webkit-scrollbar-thumb {\n border-radius: 0;\n}\n\n.search-popout {\n @include search-popout;\n}\n\nnoscript {\n text-align: center;\n\n img {\n width: 200px;\n opacity: 0.5;\n animation: flicker 4s infinite;\n }\n\n div {\n font-size: 14px;\n margin: 30px auto;\n color: $secondary-text-color;\n max-width: 400px;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n }\n}\n\n@keyframes flicker {\n 0% { opacity: 1; }\n 30% { opacity: 0.75; }\n 100% { opacity: 1; }\n}\n\n@media screen and (max-width: 630px) and (max-height: 400px) {\n $duration: 400ms;\n $delay: 100ms;\n\n .tabs-bar,\n .search {\n will-change: margin-top;\n transition: margin-top $duration $delay;\n }\n\n .navigation-bar {\n will-change: padding-bottom;\n transition: padding-bottom $duration $delay;\n }\n\n .navigation-bar {\n & > a:first-child {\n will-change: margin-top, margin-left, margin-right, width;\n transition: margin-top $duration $delay, margin-left $duration ($duration + $delay), margin-right $duration ($duration + $delay);\n }\n\n & > .navigation-bar__profile-edit {\n will-change: margin-top;\n transition: margin-top $duration $delay;\n }\n\n .navigation-bar__actions {\n & > .icon-button.close {\n will-change: opacity transform;\n transition: opacity $duration * 0.5 $delay,\n transform $duration $delay;\n }\n\n & > .compose__action-bar .icon-button {\n will-change: opacity transform;\n transition: opacity $duration * 0.5 $delay + $duration * 0.5,\n transform $duration $delay;\n }\n }\n }\n\n .is-composing {\n .tabs-bar,\n .search {\n margin-top: -50px;\n }\n\n .navigation-bar {\n padding-bottom: 0;\n\n & > a:first-child {\n margin: -100px 10px 0 -50px;\n }\n\n .navigation-bar__profile {\n padding-top: 2px;\n }\n\n .navigation-bar__profile-edit {\n position: absolute;\n margin-top: -60px;\n }\n\n .navigation-bar__actions {\n .icon-button.close {\n pointer-events: auto;\n opacity: 1;\n transform: scale(1, 1) translate(0, 0);\n bottom: 5px;\n }\n\n .compose__action-bar .icon-button {\n pointer-events: none;\n opacity: 0;\n transform: scale(0, 1) translate(100%, 0);\n }\n }\n }\n }\n}\n\n.embed-modal {\n width: auto;\n max-width: 80vw;\n max-height: 80vh;\n\n h4 {\n padding: 30px;\n font-weight: 500;\n font-size: 16px;\n text-align: center;\n }\n\n .embed-modal__container {\n padding: 10px;\n\n .hint {\n margin-bottom: 15px;\n }\n\n .embed-modal__html {\n outline: 0;\n box-sizing: border-box;\n display: block;\n width: 100%;\n border: 0;\n padding: 10px;\n font-family: $font-monospace, monospace;\n background: $ui-base-color;\n color: $primary-text-color;\n font-size: 14px;\n margin: 0;\n margin-bottom: 15px;\n border-radius: 4px;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n @media screen and (max-width: 600px) {\n font-size: 16px;\n }\n }\n\n .embed-modal__iframe {\n width: 400px;\n max-width: 100%;\n overflow: hidden;\n border: 0;\n border-radius: 4px;\n }\n }\n}\n\n.account__moved-note {\n padding: 14px 10px;\n padding-bottom: 16px;\n background: lighten($ui-base-color, 4%);\n border-top: 1px solid lighten($ui-base-color, 8%);\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &__message {\n position: relative;\n margin-left: 58px;\n color: $dark-text-color;\n padding: 8px 0;\n padding-top: 0;\n padding-bottom: 4px;\n font-size: 14px;\n\n > span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n &__icon-wrapper {\n left: -26px;\n position: absolute;\n }\n\n .detailed-status__display-avatar {\n position: relative;\n }\n\n .detailed-status__display-name {\n margin-bottom: 0;\n }\n}\n\n.column-inline-form {\n padding: 15px;\n padding-right: 0;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n background: lighten($ui-base-color, 4%);\n\n label {\n flex: 1 1 auto;\n\n input {\n width: 100%;\n\n &:focus {\n outline: 0;\n }\n }\n }\n\n .icon-button {\n flex: 0 0 auto;\n margin: 0 10px;\n }\n}\n\n.drawer__backdrop {\n cursor: pointer;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba($base-overlay-background, 0.5);\n}\n\n.list-editor {\n background: $ui-base-color;\n flex-direction: column;\n border-radius: 8px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n width: 380px;\n overflow: hidden;\n\n @media screen and (max-width: 420px) {\n width: 90%;\n }\n\n h4 {\n padding: 15px 0;\n background: lighten($ui-base-color, 13%);\n font-weight: 500;\n font-size: 16px;\n text-align: center;\n border-radius: 8px 8px 0 0;\n }\n\n .drawer__pager {\n height: 50vh;\n }\n\n .drawer__inner {\n border-radius: 0 0 8px 8px;\n\n &.backdrop {\n width: calc(100% - 60px);\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n border-radius: 0 0 0 8px;\n }\n }\n\n &__accounts {\n overflow-y: auto;\n }\n\n .account__display-name {\n &:hover strong {\n text-decoration: none;\n }\n }\n\n .account__avatar {\n cursor: default;\n }\n\n .search {\n margin-bottom: 0;\n }\n}\n\n.list-adder {\n background: $ui-base-color;\n flex-direction: column;\n border-radius: 8px;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n width: 380px;\n overflow: hidden;\n\n @media screen and (max-width: 420px) {\n width: 90%;\n }\n\n &__account {\n background: lighten($ui-base-color, 13%);\n }\n\n &__lists {\n background: lighten($ui-base-color, 13%);\n height: 50vh;\n border-radius: 0 0 8px 8px;\n overflow-y: auto;\n }\n\n .list {\n padding: 10px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n .list__wrapper {\n display: flex;\n }\n\n .list__display-name {\n flex: 1 1 auto;\n overflow: hidden;\n text-decoration: none;\n font-size: 16px;\n padding: 10px;\n }\n}\n\n.focal-point {\n position: relative;\n cursor: move;\n overflow: hidden;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n background: $base-shadow-color;\n\n img,\n video,\n canvas {\n display: block;\n max-height: 80vh;\n width: 100%;\n height: auto;\n margin: 0;\n object-fit: contain;\n background: $base-shadow-color;\n }\n\n &__reticle {\n position: absolute;\n width: 100px;\n height: 100px;\n transform: translate(-50%, -50%);\n background: url('~images/reticle.png') no-repeat 0 0;\n border-radius: 50%;\n box-shadow: 0 0 0 9999em rgba($base-shadow-color, 0.35);\n }\n\n &__overlay {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n }\n\n &__preview {\n position: absolute;\n bottom: 10px;\n right: 10px;\n z-index: 2;\n cursor: move;\n transition: opacity 0.1s ease;\n\n &:hover {\n opacity: 0.5;\n }\n\n strong {\n color: $primary-text-color;\n font-size: 14px;\n font-weight: 500;\n display: block;\n margin-bottom: 5px;\n }\n\n div {\n border-radius: 4px;\n box-shadow: 0 0 14px rgba($base-shadow-color, 0.2);\n }\n }\n\n @media screen and (max-width: 480px) {\n img,\n video {\n max-height: 100%;\n }\n\n &__preview {\n display: none;\n }\n }\n}\n\n.account__header__content {\n color: $darker-text-color;\n font-size: 14px;\n font-weight: 400;\n overflow: hidden;\n word-break: normal;\n word-wrap: break-word;\n\n p {\n margin-bottom: 20px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n a {\n color: inherit;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n}\n\n.account__header {\n overflow: hidden;\n\n &.inactive {\n opacity: 0.5;\n\n .account__header__image,\n .account__avatar {\n filter: grayscale(100%);\n }\n }\n\n &__info {\n position: absolute;\n top: 10px;\n left: 10px;\n }\n\n &__image {\n overflow: hidden;\n height: 145px;\n position: relative;\n background: darken($ui-base-color, 4%);\n\n img {\n object-fit: cover;\n display: block;\n width: 100%;\n height: 100%;\n margin: 0;\n }\n }\n\n &__bar {\n position: relative;\n background: lighten($ui-base-color, 4%);\n padding: 5px;\n border-bottom: 1px solid lighten($ui-base-color, 12%);\n\n .avatar {\n display: block;\n flex: 0 0 auto;\n width: 94px;\n margin-left: -2px;\n\n .account__avatar {\n background: darken($ui-base-color, 8%);\n border: 2px solid lighten($ui-base-color, 4%);\n }\n }\n }\n\n &__tabs {\n display: flex;\n align-items: flex-start;\n padding: 7px 5px;\n margin-top: -55px;\n\n &__buttons {\n display: flex;\n align-items: center;\n padding-top: 55px;\n overflow: hidden;\n\n .icon-button {\n border: 1px solid lighten($ui-base-color, 12%);\n border-radius: 4px;\n box-sizing: content-box;\n padding: 2px;\n }\n\n .button {\n margin: 0 8px;\n }\n }\n\n &__name {\n padding: 5px;\n\n .account-role {\n vertical-align: top;\n }\n\n .emojione {\n width: 22px;\n height: 22px;\n }\n\n h1 {\n font-size: 16px;\n line-height: 24px;\n color: $primary-text-color;\n font-weight: 500;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n\n small {\n display: block;\n font-size: 14px;\n color: $darker-text-color;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n\n .spacer {\n flex: 1 1 auto;\n }\n }\n\n &__bio {\n overflow: hidden;\n margin: 0 -5px;\n\n .account__header__content {\n padding: 20px 15px;\n padding-bottom: 5px;\n color: $primary-text-color;\n }\n\n .account__header__fields {\n margin: 0;\n border-top: 1px solid lighten($ui-base-color, 12%);\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n }\n\n &__extra {\n margin-top: 4px;\n\n &__links {\n font-size: 14px;\n color: $darker-text-color;\n padding: 10px 0;\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n padding: 5px 10px;\n font-weight: 500;\n\n strong {\n font-weight: 700;\n color: $primary-text-color;\n }\n }\n }\n }\n}\n\n.trends {\n &__header {\n color: $dark-text-color;\n background: lighten($ui-base-color, 2%);\n border-bottom: 1px solid darken($ui-base-color, 4%);\n font-weight: 500;\n padding: 15px;\n font-size: 16px;\n cursor: default;\n\n .fa {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n &__item {\n display: flex;\n align-items: center;\n padding: 15px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n &:last-child {\n border-bottom: 0;\n }\n\n &__name {\n flex: 1 1 auto;\n color: $dark-text-color;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n strong {\n font-weight: 500;\n }\n\n a {\n color: $darker-text-color;\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:hover,\n &:focus,\n &:active {\n span {\n text-decoration: underline;\n }\n }\n }\n }\n\n &__current {\n flex: 0 0 auto;\n font-size: 24px;\n line-height: 36px;\n font-weight: 500;\n text-align: right;\n padding-right: 15px;\n margin-left: 5px;\n color: $secondary-text-color;\n }\n\n &__sparkline {\n flex: 0 0 auto;\n width: 50px;\n\n path:first-child {\n fill: rgba($highlight-text-color, 0.25) !important;\n fill-opacity: 1 !important;\n }\n\n path:last-child {\n stroke: lighten($highlight-text-color, 6%) !important;\n }\n }\n }\n}\n\n.conversation {\n display: flex;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n padding: 5px;\n padding-bottom: 0;\n\n &:focus {\n background: lighten($ui-base-color, 2%);\n outline: 0;\n }\n\n &__avatar {\n flex: 0 0 auto;\n padding: 10px;\n padding-top: 12px;\n position: relative;\n cursor: pointer;\n }\n\n &__unread {\n display: inline-block;\n background: $highlight-text-color;\n border-radius: 50%;\n width: 0.625rem;\n height: 0.625rem;\n margin: -.1ex .15em .1ex;\n }\n\n &__content {\n flex: 1 1 auto;\n padding: 10px 5px;\n padding-right: 15px;\n overflow: hidden;\n\n &__info {\n overflow: hidden;\n display: flex;\n flex-direction: row-reverse;\n justify-content: space-between;\n }\n\n &__relative-time {\n font-size: 15px;\n color: $darker-text-color;\n padding-left: 15px;\n }\n\n &__names {\n color: $darker-text-color;\n font-size: 15px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-bottom: 4px;\n flex-basis: 90px;\n flex-grow: 1;\n\n a {\n color: $primary-text-color;\n text-decoration: none;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: underline;\n }\n }\n }\n\n a {\n word-break: break-word;\n }\n }\n\n &--unread {\n background: lighten($ui-base-color, 2%);\n\n &:focus {\n background: lighten($ui-base-color, 4%);\n }\n\n .conversation__content__info {\n font-weight: 700;\n }\n\n .conversation__content__relative-time {\n color: $primary-text-color;\n }\n }\n}\n\n.announcements {\n background: lighten($ui-base-color, 8%);\n font-size: 13px;\n display: flex;\n align-items: flex-end;\n\n &__mastodon {\n width: 124px;\n flex: 0 0 auto;\n\n @media screen and (max-width: 124px + 300px) {\n display: none;\n }\n }\n\n &__container {\n width: calc(100% - 124px);\n flex: 0 0 auto;\n position: relative;\n\n @media screen and (max-width: 124px + 300px) {\n width: 100%;\n }\n }\n\n &__item {\n box-sizing: border-box;\n width: 100%;\n padding: 15px;\n position: relative;\n font-size: 15px;\n line-height: 20px;\n word-wrap: break-word;\n font-weight: 400;\n max-height: 50vh;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n\n &__range {\n display: block;\n font-weight: 500;\n margin-bottom: 10px;\n padding-right: 18px;\n }\n\n &__unread {\n position: absolute;\n top: 19px;\n right: 19px;\n display: block;\n background: $highlight-text-color;\n border-radius: 50%;\n width: 0.625rem;\n height: 0.625rem;\n }\n }\n\n &__pagination {\n padding: 15px;\n color: $darker-text-color;\n position: absolute;\n bottom: 3px;\n right: 0;\n }\n}\n\n.layout-multiple-columns .announcements__mastodon {\n display: none;\n}\n\n.layout-multiple-columns .announcements__container {\n width: 100%;\n}\n\n.reactions-bar {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n margin-top: 15px;\n margin-left: -2px;\n width: calc(100% - (90px - 33px));\n\n &__item {\n flex-shrink: 0;\n background: lighten($ui-base-color, 12%);\n border: 0;\n border-radius: 3px;\n margin: 2px;\n cursor: pointer;\n user-select: none;\n padding: 0 6px;\n display: flex;\n align-items: center;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &__emoji {\n display: block;\n margin: 3px 0;\n width: 16px;\n height: 16px;\n\n img {\n display: block;\n margin: 0;\n width: 100%;\n height: 100%;\n min-width: auto;\n min-height: auto;\n vertical-align: bottom;\n object-fit: contain;\n }\n }\n\n &__count {\n display: block;\n min-width: 9px;\n font-size: 13px;\n font-weight: 500;\n text-align: center;\n margin-left: 6px;\n color: $darker-text-color;\n }\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 16%);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n\n &__count {\n color: lighten($darker-text-color, 4%);\n }\n }\n\n &.active {\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n background-color: mix(lighten($ui-base-color, 12%), $ui-highlight-color, 80%);\n\n .reactions-bar__item__count {\n color: lighten($highlight-text-color, 8%);\n }\n }\n }\n\n .emoji-picker-dropdown {\n margin: 2px;\n }\n\n &:hover .emoji-button {\n opacity: 0.85;\n }\n\n .emoji-button {\n color: $darker-text-color;\n margin: 0;\n font-size: 16px;\n width: auto;\n flex-shrink: 0;\n padding: 0 6px;\n height: 22px;\n display: flex;\n align-items: center;\n opacity: 0.5;\n transition: all 100ms ease-in;\n transition-property: background-color, color;\n\n &:hover,\n &:active,\n &:focus {\n opacity: 1;\n color: lighten($darker-text-color, 4%);\n transition: all 200ms ease-out;\n transition-property: background-color, color;\n }\n }\n\n &--empty {\n .emoji-button {\n padding: 0;\n }\n }\n}\n",null,"@mixin avatar-radius {\n border-radius: 4px;\n background: transparent no-repeat;\n background-position: 50%;\n background-clip: padding-box;\n}\n\n@mixin avatar-size($size: 48px) {\n width: $size;\n height: $size;\n background-size: $size $size;\n}\n\n@mixin search-input {\n outline: 0;\n box-sizing: border-box;\n width: 100%;\n border: 0;\n box-shadow: none;\n font-family: inherit;\n background: $ui-base-color;\n color: $darker-text-color;\n font-size: 14px;\n margin: 0;\n}\n\n@mixin search-popout {\n background: $simple-background-color;\n border-radius: 4px;\n padding: 10px 14px;\n padding-bottom: 14px;\n margin-top: 10px;\n color: $light-text-color;\n box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);\n\n h4 {\n text-transform: uppercase;\n color: $light-text-color;\n font-size: 13px;\n font-weight: 500;\n margin-bottom: 10px;\n }\n\n li {\n padding: 4px 0;\n }\n\n ul {\n margin-bottom: 10px;\n }\n\n em {\n font-weight: 500;\n color: $inverted-text-color;\n }\n}\n",".poll {\n margin-top: 16px;\n font-size: 14px;\n\n li {\n margin-bottom: 10px;\n position: relative;\n }\n\n &__chart {\n border-radius: 4px;\n display: block;\n background: darken($ui-primary-color, 5%);\n height: 5px;\n min-width: 1%;\n\n &.leading {\n background: $ui-highlight-color;\n }\n }\n\n &__option {\n position: relative;\n display: flex;\n padding: 6px 0;\n line-height: 18px;\n cursor: default;\n overflow: hidden;\n\n &__text {\n display: inline-block;\n word-wrap: break-word;\n overflow-wrap: break-word;\n max-width: calc(100% - 45px - 25px);\n }\n\n input[type=radio],\n input[type=checkbox] {\n display: none;\n }\n\n .autossugest-input {\n flex: 1 1 auto;\n }\n\n input[type=text] {\n display: block;\n box-sizing: border-box;\n width: 100%;\n font-size: 14px;\n color: $inverted-text-color;\n outline: 0;\n font-family: inherit;\n background: $simple-background-color;\n border: 1px solid darken($simple-background-color, 14%);\n border-radius: 4px;\n padding: 6px 10px;\n\n &:focus {\n border-color: $highlight-text-color;\n }\n }\n\n &.selectable {\n cursor: pointer;\n }\n\n &.editable {\n display: flex;\n align-items: center;\n overflow: visible;\n }\n }\n\n &__input {\n display: inline-block;\n position: relative;\n border: 1px solid $ui-primary-color;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex: 0 0 auto;\n margin-right: 10px;\n top: -1px;\n border-radius: 50%;\n vertical-align: middle;\n margin-top: auto;\n margin-bottom: auto;\n flex: 0 0 18px;\n\n &.checkbox {\n border-radius: 4px;\n }\n\n &.active {\n border-color: $valid-value-color;\n background: $valid-value-color;\n }\n\n &:active,\n &:focus,\n &:hover {\n border-color: lighten($valid-value-color, 15%);\n border-width: 4px;\n }\n\n &::-moz-focus-inner {\n outline: 0 !important;\n border: 0;\n }\n\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n\n &__number {\n display: inline-block;\n width: 45px;\n font-weight: 700;\n flex: 0 0 45px;\n }\n\n &__voted {\n padding: 0 5px;\n display: inline-block;\n\n &__mark {\n font-size: 18px;\n }\n }\n\n &__footer {\n padding-top: 6px;\n padding-bottom: 5px;\n color: $dark-text-color;\n }\n\n &__link {\n display: inline;\n background: transparent;\n padding: 0;\n margin: 0;\n border: 0;\n color: $dark-text-color;\n text-decoration: underline;\n font-size: inherit;\n\n &:hover {\n text-decoration: none;\n }\n\n &:active,\n &:focus {\n background-color: rgba($dark-text-color, .1);\n }\n }\n\n .button {\n height: 36px;\n padding: 0 16px;\n margin-right: 10px;\n font-size: 14px;\n }\n}\n\n.compose-form__poll-wrapper {\n border-top: 1px solid darken($simple-background-color, 8%);\n\n ul {\n padding: 10px;\n }\n\n .poll__footer {\n border-top: 1px solid darken($simple-background-color, 8%);\n padding: 10px;\n display: flex;\n align-items: center;\n\n button,\n select {\n flex: 1 1 50%;\n\n &:focus {\n border-color: $highlight-text-color;\n }\n }\n }\n\n .button.button-secondary {\n font-size: 14px;\n font-weight: 400;\n padding: 6px 10px;\n height: auto;\n line-height: inherit;\n color: $action-button-color;\n border-color: $action-button-color;\n margin-right: 5px;\n }\n\n li {\n display: flex;\n align-items: center;\n\n .poll__option {\n flex: 0 0 auto;\n width: calc(100% - (23px + 6px));\n margin-right: 6px;\n }\n }\n\n select {\n appearance: none;\n box-sizing: border-box;\n font-size: 14px;\n color: $inverted-text-color;\n display: inline-block;\n width: auto;\n outline: 0;\n font-family: inherit;\n background: $simple-background-color url(\"data:image/svg+xml;utf8,\") no-repeat right 8px center / auto 16px;\n border: 1px solid darken($simple-background-color, 14%);\n border-radius: 4px;\n padding: 6px 10px;\n padding-right: 30px;\n }\n\n .icon-button.disabled {\n color: darken($simple-background-color, 14%);\n }\n}\n\n.muted .poll {\n color: $dark-text-color;\n\n &__chart {\n background: rgba(darken($ui-primary-color, 14%), 0.2);\n\n &.leading {\n background: rgba($ui-highlight-color, 0.2);\n }\n }\n}\n",".modal-layout {\n background: $ui-base-color url('data:image/svg+xml;utf8,') repeat-x bottom fixed;\n display: flex;\n flex-direction: column;\n height: 100vh;\n padding: 0;\n}\n\n.modal-layout__mastodon {\n display: flex;\n flex: 1;\n flex-direction: column;\n justify-content: flex-end;\n\n > * {\n flex: 1;\n max-height: 235px;\n }\n}\n\n@media screen and (max-width: 600px) {\n .account-header {\n margin-top: 0;\n }\n}\n",".emoji-mart {\n font-size: 13px;\n display: inline-block;\n color: $inverted-text-color;\n\n &,\n * {\n box-sizing: border-box;\n line-height: 1.15;\n }\n\n .emoji-mart-emoji {\n padding: 6px;\n }\n}\n\n.emoji-mart-bar {\n border: 0 solid darken($ui-secondary-color, 8%);\n\n &:first-child {\n border-bottom-width: 1px;\n border-top-left-radius: 5px;\n border-top-right-radius: 5px;\n background: $ui-secondary-color;\n }\n\n &:last-child {\n border-top-width: 1px;\n border-bottom-left-radius: 5px;\n border-bottom-right-radius: 5px;\n display: none;\n }\n}\n\n.emoji-mart-anchors {\n display: flex;\n justify-content: space-between;\n padding: 0 6px;\n color: $lighter-text-color;\n line-height: 0;\n}\n\n.emoji-mart-anchor {\n position: relative;\n flex: 1;\n text-align: center;\n padding: 12px 4px;\n overflow: hidden;\n transition: color .1s ease-out;\n cursor: pointer;\n\n &:hover {\n color: darken($lighter-text-color, 4%);\n }\n}\n\n.emoji-mart-anchor-selected {\n color: $highlight-text-color;\n\n &:hover {\n color: darken($highlight-text-color, 4%);\n }\n\n .emoji-mart-anchor-bar {\n bottom: -1px;\n }\n}\n\n.emoji-mart-anchor-bar {\n position: absolute;\n bottom: -5px;\n left: 0;\n width: 100%;\n height: 4px;\n background-color: $highlight-text-color;\n}\n\n.emoji-mart-anchors {\n i {\n display: inline-block;\n width: 100%;\n max-width: 22px;\n }\n\n svg {\n fill: currentColor;\n max-height: 18px;\n }\n}\n\n.emoji-mart-scroll {\n overflow-y: scroll;\n height: 270px;\n max-height: 35vh;\n padding: 0 6px 6px;\n background: $simple-background-color;\n will-change: transform;\n\n &::-webkit-scrollbar-track:hover,\n &::-webkit-scrollbar-track:active {\n background-color: rgba($base-overlay-background, 0.3);\n }\n}\n\n.emoji-mart-search {\n padding: 10px;\n padding-right: 45px;\n background: $simple-background-color;\n\n input {\n font-size: 14px;\n font-weight: 400;\n padding: 7px 9px;\n font-family: inherit;\n display: block;\n width: 100%;\n background: rgba($ui-secondary-color, 0.3);\n color: $inverted-text-color;\n border: 1px solid $ui-secondary-color;\n border-radius: 4px;\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &::-moz-focus-inner,\n &:focus,\n &:active {\n outline: 0 !important;\n }\n }\n}\n\n.emoji-mart-category .emoji-mart-emoji {\n cursor: pointer;\n\n span {\n z-index: 1;\n position: relative;\n text-align: center;\n }\n\n &:hover::before {\n z-index: 0;\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba($ui-secondary-color, 0.7);\n border-radius: 100%;\n }\n}\n\n.emoji-mart-category-label {\n z-index: 2;\n position: relative;\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n\n span {\n display: block;\n width: 100%;\n font-weight: 500;\n padding: 5px 6px;\n background: $simple-background-color;\n }\n}\n\n.emoji-mart-emoji {\n position: relative;\n display: inline-block;\n font-size: 0;\n\n span {\n width: 22px;\n height: 22px;\n }\n}\n\n.emoji-mart-no-results {\n font-size: 14px;\n text-align: center;\n padding-top: 70px;\n color: $light-text-color;\n\n .emoji-mart-category-label {\n display: none;\n }\n\n .emoji-mart-no-results-label {\n margin-top: .2em;\n }\n\n .emoji-mart-emoji:hover::before {\n content: none;\n }\n}\n\n.emoji-mart-preview {\n display: none;\n}\n","$maximum-width: 1235px;\n$fluid-breakpoint: $maximum-width + 20px;\n$column-breakpoint: 700px;\n$small-breakpoint: 960px;\n\n.container {\n box-sizing: border-box;\n max-width: $maximum-width;\n margin: 0 auto;\n position: relative;\n\n @media screen and (max-width: $fluid-breakpoint) {\n width: 100%;\n padding: 0 10px;\n }\n}\n\n.rich-formatting {\n font-family: $font-sans-serif, sans-serif;\n font-size: 14px;\n font-weight: 400;\n line-height: 1.7;\n word-wrap: break-word;\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover,\n &:focus,\n &:active {\n text-decoration: none;\n }\n }\n\n p,\n li {\n color: $darker-text-color;\n }\n\n p {\n margin-top: 0;\n margin-bottom: .85em;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n strong {\n font-weight: 700;\n color: $secondary-text-color;\n }\n\n em {\n font-style: italic;\n color: $secondary-text-color;\n }\n\n code {\n font-size: 0.85em;\n background: darken($ui-base-color, 8%);\n border-radius: 4px;\n padding: 0.2em 0.3em;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n font-family: $font-display, sans-serif;\n margin-top: 1.275em;\n margin-bottom: .85em;\n font-weight: 500;\n color: $secondary-text-color;\n }\n\n h1 {\n font-size: 2em;\n }\n\n h2 {\n font-size: 1.75em;\n }\n\n h3 {\n font-size: 1.5em;\n }\n\n h4 {\n font-size: 1.25em;\n }\n\n h5,\n h6 {\n font-size: 1em;\n }\n\n ul {\n list-style: disc;\n }\n\n ol {\n list-style: decimal;\n }\n\n ul,\n ol {\n margin: 0;\n padding: 0;\n padding-left: 2em;\n margin-bottom: 0.85em;\n\n &[type='a'] {\n list-style-type: lower-alpha;\n }\n\n &[type='i'] {\n list-style-type: lower-roman;\n }\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n margin: 1.7em 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n\n table {\n width: 100%;\n border-collapse: collapse;\n break-inside: auto;\n margin-top: 24px;\n margin-bottom: 32px;\n\n thead tr,\n tbody tr {\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n font-size: 1em;\n line-height: 1.625;\n font-weight: 400;\n text-align: left;\n color: $darker-text-color;\n }\n\n thead tr {\n border-bottom-width: 2px;\n line-height: 1.5;\n font-weight: 500;\n color: $dark-text-color;\n }\n\n th,\n td {\n padding: 8px;\n align-self: start;\n align-items: start;\n word-break: break-all;\n\n &.nowrap {\n width: 25%;\n position: relative;\n\n &::before {\n content: ' ';\n visibility: hidden;\n }\n\n span {\n position: absolute;\n left: 8px;\n right: 8px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n }\n\n & > :first-child {\n margin-top: 0;\n }\n}\n\n.information-board {\n background: darken($ui-base-color, 4%);\n padding: 20px 0;\n\n .container-alt {\n position: relative;\n padding-right: 280px + 15px;\n }\n\n &__sections {\n display: flex;\n justify-content: space-between;\n flex-wrap: wrap;\n }\n\n &__section {\n flex: 1 0 0;\n font-family: $font-sans-serif, sans-serif;\n font-size: 16px;\n line-height: 28px;\n color: $primary-text-color;\n text-align: right;\n padding: 10px 15px;\n\n span,\n strong {\n display: block;\n }\n\n span {\n &:last-child {\n color: $secondary-text-color;\n }\n }\n\n strong {\n font-family: $font-display, sans-serif;\n font-weight: 500;\n font-size: 32px;\n line-height: 48px;\n }\n\n @media screen and (max-width: $column-breakpoint) {\n text-align: center;\n }\n }\n\n .panel {\n position: absolute;\n width: 280px;\n box-sizing: border-box;\n background: darken($ui-base-color, 8%);\n padding: 20px;\n padding-top: 10px;\n border-radius: 4px 4px 0 0;\n right: 0;\n bottom: -40px;\n\n .panel-header {\n font-family: $font-display, sans-serif;\n font-size: 14px;\n line-height: 24px;\n font-weight: 500;\n color: $darker-text-color;\n padding-bottom: 5px;\n margin-bottom: 15px;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n\n a,\n span {\n font-weight: 400;\n color: darken($darker-text-color, 10%);\n }\n\n a {\n text-decoration: none;\n }\n }\n }\n\n .owner {\n text-align: center;\n\n .avatar {\n width: 80px;\n height: 80px;\n margin: 0 auto;\n margin-bottom: 15px;\n\n img {\n display: block;\n width: 80px;\n height: 80px;\n border-radius: 48px;\n }\n }\n\n .name {\n font-size: 14px;\n\n a {\n display: block;\n color: $primary-text-color;\n text-decoration: none;\n\n &:hover {\n .display_name {\n text-decoration: underline;\n }\n }\n }\n\n .username {\n display: block;\n color: $darker-text-color;\n }\n }\n }\n}\n\n.landing-page {\n p,\n li {\n font-family: $font-sans-serif, sans-serif;\n font-size: 16px;\n font-weight: 400;\n font-size: 16px;\n line-height: 30px;\n margin-bottom: 12px;\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n }\n }\n\n em {\n display: inline;\n margin: 0;\n padding: 0;\n font-weight: 700;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n color: lighten($darker-text-color, 10%);\n }\n\n h1 {\n font-family: $font-display, sans-serif;\n font-size: 26px;\n line-height: 30px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n\n small {\n font-family: $font-sans-serif, sans-serif;\n display: block;\n font-size: 18px;\n font-weight: 400;\n color: lighten($darker-text-color, 10%);\n }\n }\n\n h2 {\n font-family: $font-display, sans-serif;\n font-size: 22px;\n line-height: 26px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h3 {\n font-family: $font-display, sans-serif;\n font-size: 18px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h4 {\n font-family: $font-display, sans-serif;\n font-size: 16px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h5 {\n font-family: $font-display, sans-serif;\n font-size: 14px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n h6 {\n font-family: $font-display, sans-serif;\n font-size: 12px;\n line-height: 24px;\n font-weight: 500;\n margin-bottom: 20px;\n color: $secondary-text-color;\n }\n\n ul,\n ol {\n margin-left: 20px;\n\n &[type='a'] {\n list-style-type: lower-alpha;\n }\n\n &[type='i'] {\n list-style-type: lower-roman;\n }\n }\n\n ul {\n list-style: disc;\n }\n\n ol {\n list-style: decimal;\n }\n\n li > ol,\n li > ul {\n margin-top: 6px;\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid rgba($ui-base-lighter-color, .6);\n margin: 20px 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n\n &__information,\n &__forms {\n padding: 20px;\n }\n\n &__call-to-action {\n background: $ui-base-color;\n border-radius: 4px;\n padding: 25px 40px;\n overflow: hidden;\n box-sizing: border-box;\n\n .row {\n width: 100%;\n display: flex;\n flex-direction: row-reverse;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n }\n\n .row__information-board {\n display: flex;\n justify-content: flex-end;\n align-items: flex-end;\n\n .information-board__section {\n flex: 1 0 auto;\n padding: 0 10px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n width: 100%;\n justify-content: space-between;\n }\n }\n\n .row__mascot {\n flex: 1;\n margin: 10px -50px 0 0;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n }\n\n &__logo {\n margin-right: 20px;\n\n img {\n height: 50px;\n width: auto;\n mix-blend-mode: lighten;\n }\n }\n\n &__information {\n padding: 45px 40px;\n margin-bottom: 10px;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n strong {\n font-weight: 500;\n color: lighten($darker-text-color, 10%);\n }\n\n .account {\n border-bottom: 0;\n padding: 0;\n\n &__display-name {\n align-items: center;\n display: flex;\n margin-right: 5px;\n }\n\n div.account__display-name {\n &:hover {\n .display-name strong {\n text-decoration: none;\n }\n }\n\n .account__avatar {\n cursor: default;\n }\n }\n\n &__avatar-wrapper {\n margin-left: 0;\n flex: 0 0 auto;\n }\n\n &__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n\n .display-name {\n font-size: 15px;\n\n &__account {\n font-size: 14px;\n }\n }\n }\n\n @media screen and (max-width: $small-breakpoint) {\n .contact {\n margin-top: 30px;\n }\n }\n\n @media screen and (max-width: $column-breakpoint) {\n padding: 25px 20px;\n }\n }\n\n &__information,\n &__forms,\n #mastodon-timeline {\n box-sizing: border-box;\n background: $ui-base-color;\n border-radius: 4px;\n box-shadow: 0 0 6px rgba($black, 0.1);\n }\n\n &__mascot {\n height: 104px;\n position: relative;\n left: -40px;\n bottom: 25px;\n\n img {\n height: 190px;\n width: auto;\n }\n }\n\n &__short-description {\n .row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n margin-bottom: 40px;\n }\n\n @media screen and (max-width: $column-breakpoint) {\n .row {\n margin-bottom: 20px;\n }\n }\n\n p a {\n color: $secondary-text-color;\n }\n\n h1 {\n font-weight: 500;\n color: $primary-text-color;\n margin-bottom: 0;\n\n small {\n color: $darker-text-color;\n\n span {\n color: $secondary-text-color;\n }\n }\n }\n\n p:last-child {\n margin-bottom: 0;\n }\n }\n\n &__hero {\n margin-bottom: 10px;\n\n img {\n display: block;\n margin: 0;\n max-width: 100%;\n height: auto;\n border-radius: 4px;\n }\n }\n\n @media screen and (max-width: 840px) {\n .information-board {\n .container-alt {\n padding-right: 20px;\n }\n\n .panel {\n position: static;\n margin-top: 20px;\n width: 100%;\n border-radius: 4px;\n\n .panel-header {\n text-align: center;\n }\n }\n }\n }\n\n @media screen and (max-width: 675px) {\n .header-wrapper {\n padding-top: 0;\n\n &.compact {\n padding-bottom: 0;\n }\n\n &.compact .hero .heading {\n text-align: initial;\n }\n }\n\n .header .container-alt,\n .features .container-alt {\n display: block;\n }\n }\n\n .cta {\n margin: 20px;\n }\n}\n\n.landing {\n margin-bottom: 100px;\n\n @media screen and (max-width: 738px) {\n margin-bottom: 0;\n }\n\n &__brand {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 50px;\n\n svg {\n fill: $primary-text-color;\n height: 52px;\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n padding: 0;\n margin-bottom: 30px;\n }\n }\n\n .directory {\n margin-top: 30px;\n background: transparent;\n box-shadow: none;\n border-radius: 0;\n }\n\n .hero-widget {\n margin-top: 30px;\n margin-bottom: 0;\n\n h4 {\n padding: 10px;\n text-transform: uppercase;\n font-weight: 700;\n font-size: 13px;\n color: $darker-text-color;\n }\n\n &__text {\n border-radius: 0;\n padding-bottom: 0;\n }\n\n &__footer {\n background: $ui-base-color;\n padding: 10px;\n border-radius: 0 0 4px 4px;\n display: flex;\n\n &__column {\n flex: 1 1 50%;\n }\n }\n\n .account {\n padding: 10px 0;\n border-bottom: 0;\n\n .account__display-name {\n display: flex;\n align-items: center;\n }\n\n .account__avatar {\n width: 44px;\n height: 44px;\n background-size: 44px 44px;\n }\n }\n\n &__counter {\n padding: 10px;\n\n strong {\n font-family: $font-display, sans-serif;\n font-size: 15px;\n font-weight: 700;\n display: block;\n }\n\n span {\n font-size: 14px;\n color: $darker-text-color;\n }\n }\n }\n\n .simple_form .user_agreement .label_input > label {\n font-weight: 400;\n color: $darker-text-color;\n }\n\n .simple_form p.lead {\n color: $darker-text-color;\n font-size: 15px;\n line-height: 20px;\n font-weight: 400;\n margin-bottom: 25px;\n }\n\n &__grid {\n max-width: 960px;\n margin: 0 auto;\n display: grid;\n grid-template-columns: minmax(0, 50%) minmax(0, 50%);\n grid-gap: 30px;\n\n @media screen and (max-width: 738px) {\n grid-template-columns: minmax(0, 100%);\n grid-gap: 10px;\n\n &__column-login {\n grid-row: 1;\n display: flex;\n flex-direction: column;\n\n .box-widget {\n order: 2;\n flex: 0 0 auto;\n }\n\n .hero-widget {\n margin-top: 0;\n margin-bottom: 10px;\n order: 1;\n flex: 0 0 auto;\n }\n }\n\n &__column-registration {\n grid-row: 2;\n }\n\n .directory {\n margin-top: 10px;\n }\n }\n\n @media screen and (max-width: $no-gap-breakpoint) {\n grid-gap: 0;\n\n .hero-widget {\n display: block;\n margin-bottom: 0;\n box-shadow: none;\n\n &__img,\n &__img img,\n &__footer {\n border-radius: 0;\n }\n }\n\n .hero-widget,\n .box-widget,\n .directory__tag {\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n .directory {\n margin-top: 0;\n\n &__tag {\n margin-bottom: 0;\n\n & > a,\n & > div {\n border-radius: 0;\n box-shadow: none;\n }\n\n &:last-child {\n border-bottom: 0;\n }\n }\n }\n }\n }\n}\n\n.brand {\n position: relative;\n text-decoration: none;\n}\n\n.brand__tagline {\n display: block;\n position: absolute;\n bottom: -10px;\n left: 50px;\n width: 300px;\n color: $ui-primary-color;\n text-decoration: none;\n font-size: 14px;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n position: static;\n width: auto;\n margin-top: 20px;\n color: $dark-text-color;\n }\n}\n\n",".table {\n width: 100%;\n max-width: 100%;\n border-spacing: 0;\n border-collapse: collapse;\n\n th,\n td {\n padding: 8px;\n line-height: 18px;\n vertical-align: top;\n border-top: 1px solid $ui-base-color;\n text-align: left;\n background: darken($ui-base-color, 4%);\n }\n\n & > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid $ui-base-color;\n border-top: 0;\n font-weight: 500;\n }\n\n & > tbody > tr > th {\n font-weight: 500;\n }\n\n & > tbody > tr:nth-child(odd) > td,\n & > tbody > tr:nth-child(odd) > th {\n background: $ui-base-color;\n }\n\n a {\n color: $highlight-text-color;\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n\n strong {\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n &.inline-table {\n & > tbody > tr:nth-child(odd) {\n & > td,\n & > th {\n background: transparent;\n }\n }\n\n & > tbody > tr:first-child {\n & > td,\n & > th {\n border-top: 0;\n }\n }\n }\n\n &.batch-table {\n & > thead > tr > th {\n background: $ui-base-color;\n border-top: 1px solid darken($ui-base-color, 8%);\n border-bottom: 1px solid darken($ui-base-color, 8%);\n\n &:first-child {\n border-radius: 4px 0 0;\n border-left: 1px solid darken($ui-base-color, 8%);\n }\n\n &:last-child {\n border-radius: 0 4px 0 0;\n border-right: 1px solid darken($ui-base-color, 8%);\n }\n }\n }\n\n &--invites tbody td {\n vertical-align: middle;\n }\n}\n\n.table-wrapper {\n overflow: auto;\n margin-bottom: 20px;\n}\n\nsamp {\n font-family: $font-monospace, monospace;\n}\n\nbutton.table-action-link {\n background: transparent;\n border: 0;\n font: inherit;\n}\n\nbutton.table-action-link,\na.table-action-link {\n text-decoration: none;\n display: inline-block;\n margin-right: 5px;\n padding: 0 10px;\n color: $darker-text-color;\n font-weight: 500;\n\n &:hover {\n color: $primary-text-color;\n }\n\n i.fa {\n font-weight: 400;\n margin-right: 5px;\n }\n\n &:first-child {\n padding-left: 0;\n }\n}\n\n.batch-table {\n &__toolbar,\n &__row {\n display: flex;\n\n &__select {\n box-sizing: border-box;\n padding: 8px 16px;\n cursor: pointer;\n min-height: 100%;\n\n input {\n margin-top: 8px;\n }\n\n &--aligned {\n display: flex;\n align-items: center;\n\n input {\n margin-top: 0;\n }\n }\n }\n\n &__actions,\n &__content {\n padding: 8px 0;\n padding-right: 16px;\n flex: 1 1 auto;\n }\n }\n\n &__toolbar {\n border: 1px solid darken($ui-base-color, 8%);\n background: $ui-base-color;\n border-radius: 4px 0 0;\n height: 47px;\n align-items: center;\n\n &__actions {\n text-align: right;\n padding-right: 16px - 5px;\n }\n }\n\n &__form {\n padding: 16px;\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n background: $ui-base-color;\n\n .fields-row {\n padding-top: 0;\n margin-bottom: 0;\n }\n }\n\n &__row {\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n background: darken($ui-base-color, 4%);\n\n @media screen and (max-width: $no-gap-breakpoint) {\n .optional &:first-child {\n border-top: 1px solid darken($ui-base-color, 8%);\n }\n }\n\n &:hover {\n background: darken($ui-base-color, 2%);\n }\n\n &:nth-child(even) {\n background: $ui-base-color;\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n }\n\n &__content {\n padding-top: 12px;\n padding-bottom: 16px;\n\n &--unpadded {\n padding: 0;\n }\n\n &--with-image {\n display: flex;\n align-items: center;\n }\n\n &__image {\n flex: 0 0 auto;\n display: flex;\n justify-content: center;\n align-items: center;\n margin-right: 10px;\n\n .emojione {\n width: 32px;\n height: 32px;\n }\n }\n\n &__text {\n flex: 1 1 auto;\n }\n\n &__extra {\n flex: 0 0 auto;\n text-align: right;\n color: $darker-text-color;\n font-weight: 500;\n }\n }\n\n .directory__tag {\n margin: 0;\n width: 100%;\n\n a {\n background: transparent;\n border-radius: 0;\n }\n }\n }\n\n &.optional .batch-table__toolbar,\n &.optional .batch-table__row__select {\n @media screen and (max-width: $no-gap-breakpoint) {\n display: none;\n }\n }\n\n .status__content {\n padding-top: 0;\n\n summary {\n display: list-item;\n }\n\n strong {\n font-weight: 700;\n }\n }\n\n .nothing-here {\n border: 1px solid darken($ui-base-color, 8%);\n border-top: 0;\n box-shadow: none;\n\n @media screen and (max-width: $no-gap-breakpoint) {\n border-top: 1px solid darken($ui-base-color, 8%);\n }\n }\n\n @media screen and (max-width: 870px) {\n .accounts-table tbody td.optional {\n display: none;\n }\n }\n}\n","$no-columns-breakpoint: 600px;\n$sidebar-width: 240px;\n$content-width: 840px;\n\n.admin-wrapper {\n display: flex;\n justify-content: center;\n width: 100%;\n min-height: 100vh;\n\n .sidebar-wrapper {\n min-height: 100vh;\n overflow: hidden;\n pointer-events: none;\n flex: 1 1 auto;\n\n &__inner {\n display: flex;\n justify-content: flex-end;\n background: $ui-base-color;\n height: 100%;\n }\n }\n\n .sidebar {\n width: $sidebar-width;\n padding: 0;\n pointer-events: auto;\n\n &__toggle {\n display: none;\n background: lighten($ui-base-color, 8%);\n height: 48px;\n\n &__logo {\n flex: 1 1 auto;\n\n a {\n display: inline-block;\n padding: 15px;\n }\n\n svg {\n fill: $primary-text-color;\n height: 20px;\n position: relative;\n bottom: -2px;\n }\n }\n\n &__icon {\n display: block;\n color: $darker-text-color;\n text-decoration: none;\n flex: 0 0 auto;\n font-size: 20px;\n padding: 15px;\n }\n\n a {\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 12%);\n }\n }\n }\n\n .logo {\n display: block;\n margin: 40px auto;\n width: 100px;\n height: 100px;\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n & > a:first-child {\n display: none;\n }\n }\n\n ul {\n list-style: none;\n border-radius: 4px 0 0 4px;\n overflow: hidden;\n margin-bottom: 20px;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n margin-bottom: 0;\n }\n\n a {\n display: block;\n padding: 15px;\n color: $darker-text-color;\n text-decoration: none;\n transition: all 200ms linear;\n transition-property: color, background-color;\n border-radius: 4px 0 0 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n i.fa {\n margin-right: 5px;\n }\n\n &:hover {\n color: $primary-text-color;\n background-color: darken($ui-base-color, 5%);\n transition: all 100ms linear;\n transition-property: color, background-color;\n }\n\n &.selected {\n background: darken($ui-base-color, 2%);\n border-radius: 4px 0 0;\n }\n }\n\n ul {\n background: darken($ui-base-color, 4%);\n border-radius: 0 0 0 4px;\n margin: 0;\n\n a {\n border: 0;\n padding: 15px 35px;\n }\n }\n\n .simple-navigation-active-leaf a {\n color: $primary-text-color;\n background-color: $ui-highlight-color;\n border-bottom: 0;\n border-radius: 0;\n\n &:hover {\n background-color: lighten($ui-highlight-color, 5%);\n }\n }\n }\n\n & > ul > .simple-navigation-active-leaf a {\n border-radius: 4px 0 0 4px;\n }\n }\n\n .content-wrapper {\n box-sizing: border-box;\n width: 100%;\n max-width: $content-width;\n flex: 1 1 auto;\n }\n\n @media screen and (max-width: $content-width + $sidebar-width) {\n .sidebar-wrapper--empty {\n display: none;\n }\n\n .sidebar-wrapper {\n width: $sidebar-width;\n flex: 0 0 auto;\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n .sidebar-wrapper {\n width: 100%;\n }\n }\n\n .content {\n padding: 20px 15px;\n padding-top: 60px;\n padding-left: 25px;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n max-width: none;\n padding: 15px;\n padding-top: 30px;\n }\n\n &-heading {\n display: flex;\n\n padding-bottom: 40px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n\n margin: -15px -15px 40px 0;\n\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n\n & > * {\n margin-top: 15px;\n margin-right: 15px;\n }\n\n &-actions {\n display: inline-flex;\n\n & > :not(:first-child) {\n margin-left: 5px;\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n border-bottom: 0;\n padding-bottom: 0;\n }\n }\n\n h2 {\n color: $secondary-text-color;\n font-size: 24px;\n line-height: 28px;\n font-weight: 400;\n\n @media screen and (max-width: $no-columns-breakpoint) {\n font-weight: 700;\n }\n }\n\n h3 {\n color: $secondary-text-color;\n font-size: 20px;\n line-height: 28px;\n font-weight: 400;\n margin-bottom: 30px;\n }\n\n h4 {\n text-transform: uppercase;\n font-size: 13px;\n font-weight: 700;\n color: $darker-text-color;\n padding-bottom: 8px;\n margin-bottom: 8px;\n border-bottom: 1px solid lighten($ui-base-color, 8%);\n }\n\n h6 {\n font-size: 16px;\n color: $secondary-text-color;\n line-height: 28px;\n font-weight: 500;\n }\n\n .fields-group h6 {\n color: $primary-text-color;\n font-weight: 500;\n }\n\n .directory__tag > a,\n .directory__tag > div {\n box-shadow: none;\n }\n\n .directory__tag .table-action-link .fa {\n color: inherit;\n }\n\n .directory__tag h4 {\n font-size: 18px;\n font-weight: 700;\n color: $primary-text-color;\n text-transform: none;\n padding-bottom: 0;\n margin-bottom: 0;\n border-bottom: 0;\n }\n\n & > p {\n font-size: 14px;\n line-height: 21px;\n color: $secondary-text-color;\n margin-bottom: 20px;\n\n strong {\n color: $primary-text-color;\n font-weight: 500;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n }\n\n hr {\n width: 100%;\n height: 0;\n border: 0;\n border-bottom: 1px solid rgba($ui-base-lighter-color, .6);\n margin: 20px 0;\n\n &.spacer {\n height: 1px;\n border: 0;\n }\n }\n }\n\n @media screen and (max-width: $no-columns-breakpoint) {\n display: block;\n\n .sidebar-wrapper {\n min-height: 0;\n }\n\n .sidebar {\n width: 100%;\n padding: 0;\n height: auto;\n\n &__toggle {\n display: flex;\n }\n\n & > ul {\n display: none;\n }\n\n ul a,\n ul ul a {\n border-radius: 0;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n transition: none;\n\n &:hover {\n transition: none;\n }\n }\n\n ul ul {\n border-radius: 0;\n }\n\n ul .simple-navigation-active-leaf a {\n border-bottom-color: $ui-highlight-color;\n }\n }\n }\n}\n\nhr.spacer {\n width: 100%;\n border: 0;\n margin: 20px 0;\n height: 1px;\n}\n\nbody,\n.admin-wrapper .content {\n .muted-hint {\n color: $darker-text-color;\n\n a {\n color: $highlight-text-color;\n }\n }\n\n .positive-hint {\n color: $valid-value-color;\n font-weight: 500;\n }\n\n .negative-hint {\n color: $error-value-color;\n font-weight: 500;\n }\n\n .neutral-hint {\n color: $dark-text-color;\n font-weight: 500;\n }\n\n .warning-hint {\n color: $gold-star;\n font-weight: 500;\n }\n}\n\n.filters {\n display: flex;\n flex-wrap: wrap;\n\n .filter-subset {\n flex: 0 0 auto;\n margin: 0 40px 20px 0;\n\n &:last-child {\n margin-bottom: 30px;\n }\n\n ul {\n margin-top: 5px;\n list-style: none;\n\n li {\n display: inline-block;\n margin-right: 5px;\n }\n }\n\n strong {\n font-weight: 500;\n text-transform: uppercase;\n font-size: 12px;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n &--with-select strong {\n display: block;\n margin-bottom: 10px;\n }\n\n a {\n display: inline-block;\n color: $darker-text-color;\n text-decoration: none;\n text-transform: uppercase;\n font-size: 12px;\n font-weight: 500;\n border-bottom: 2px solid $ui-base-color;\n\n &:hover {\n color: $primary-text-color;\n border-bottom: 2px solid lighten($ui-base-color, 5%);\n }\n\n &.selected {\n color: $highlight-text-color;\n border-bottom: 2px solid $ui-highlight-color;\n }\n }\n }\n}\n\n.flavour-screen {\n display: block;\n margin: 10px auto;\n max-width: 100%;\n}\n\n.flavour-description {\n display: block;\n font-size: 16px;\n margin: 10px 0;\n\n & > p {\n margin: 10px 0;\n }\n}\n\n.flavour-screen {\n display: block;\n margin: 10px auto;\n max-width: 100%;\n}\n\n.flavour-description {\n display: block;\n font-size: 16px;\n margin: 10px 0;\n\n & > p {\n margin: 10px 0;\n }\n}\n\n.report-accounts {\n display: flex;\n flex-wrap: wrap;\n margin-bottom: 20px;\n}\n\n.report-accounts__item {\n display: flex;\n flex: 250px;\n flex-direction: column;\n margin: 0 5px;\n\n & > strong {\n display: block;\n margin: 0 0 10px -5px;\n font-weight: 500;\n font-size: 14px;\n line-height: 18px;\n color: $secondary-text-color;\n\n @each $lang in $cjk-langs {\n &:lang(#{$lang}) {\n font-weight: 700;\n }\n }\n }\n\n .account-card {\n flex: 1 1 auto;\n }\n}\n\n.report-status,\n.account-status {\n display: flex;\n margin-bottom: 10px;\n\n .activity-stream {\n flex: 2 0 0;\n margin-right: 20px;\n max-width: calc(100% - 60px);\n\n .entry {\n border-radius: 4px;\n }\n }\n}\n\n.report-status__actions,\n.account-status__actions {\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n\n .icon-button {\n font-size: 24px;\n width: 24px;\n text-align: center;\n margin-bottom: 10px;\n }\n}\n\n.simple_form.new_report_note,\n.simple_form.new_account_moderation_note {\n max-width: 100%;\n}\n\n.batch-form-box {\n display: flex;\n flex-wrap: wrap;\n margin-bottom: 5px;\n\n #form_status_batch_action {\n margin: 0 5px 5px 0;\n font-size: 14px;\n }\n\n input.button {\n margin: 0 5px 5px 0;\n }\n\n .media-spoiler-toggle-buttons {\n margin-left: auto;\n\n .button {\n overflow: visible;\n margin: 0 0 5px 5px;\n float: right;\n }\n }\n}\n\n.back-link {\n margin-bottom: 10px;\n font-size: 14px;\n\n a {\n color: $highlight-text-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.spacer {\n flex: 1 1 auto;\n}\n\n.log-entry {\n line-height: 20px;\n padding: 15px 0;\n background: $ui-base-color;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n\n &:last-child {\n border-bottom: 0;\n }\n\n &__header {\n display: flex;\n justify-content: flex-start;\n align-items: center;\n color: $darker-text-color;\n font-size: 14px;\n padding: 0 10px;\n }\n\n &__avatar {\n margin-right: 10px;\n\n .avatar {\n display: block;\n margin: 0;\n border-radius: 50%;\n width: 40px;\n height: 40px;\n }\n }\n\n &__content {\n max-width: calc(100% - 90px);\n }\n\n &__title {\n word-wrap: break-word;\n }\n\n &__timestamp {\n color: $dark-text-color;\n }\n\n a,\n .username,\n .target {\n color: $secondary-text-color;\n text-decoration: none;\n font-weight: 500;\n }\n}\n\na.name-tag,\n.name-tag,\na.inline-name-tag,\n.inline-name-tag {\n text-decoration: none;\n color: $secondary-text-color;\n\n .username {\n font-weight: 500;\n }\n\n &.suspended {\n .username {\n text-decoration: line-through;\n color: lighten($error-red, 12%);\n }\n\n .avatar {\n filter: grayscale(100%);\n opacity: 0.8;\n }\n }\n}\n\na.name-tag,\n.name-tag {\n display: flex;\n align-items: center;\n\n .avatar {\n display: block;\n margin: 0;\n margin-right: 5px;\n border-radius: 50%;\n }\n\n &.suspended {\n .avatar {\n filter: grayscale(100%);\n opacity: 0.8;\n }\n }\n}\n\n.speech-bubble {\n margin-bottom: 20px;\n border-left: 4px solid $ui-highlight-color;\n\n &.positive {\n border-left-color: $success-green;\n }\n\n &.negative {\n border-left-color: lighten($error-red, 12%);\n }\n\n &.warning {\n border-left-color: $gold-star;\n }\n\n &__bubble {\n padding: 16px;\n padding-left: 14px;\n font-size: 15px;\n line-height: 20px;\n border-radius: 4px 4px 4px 0;\n position: relative;\n font-weight: 500;\n\n a {\n color: $darker-text-color;\n }\n }\n\n &__owner {\n padding: 8px;\n padding-left: 12px;\n }\n\n time {\n color: $dark-text-color;\n }\n}\n\n.report-card {\n background: $ui-base-color;\n border-radius: 4px;\n margin-bottom: 20px;\n\n &__profile {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 15px;\n\n .account {\n padding: 0;\n border: 0;\n\n &__avatar-wrapper {\n margin-left: 0;\n }\n }\n\n &__stats {\n flex: 0 0 auto;\n font-weight: 500;\n color: $darker-text-color;\n text-transform: uppercase;\n text-align: right;\n\n a {\n color: inherit;\n text-decoration: none;\n\n &:focus,\n &:hover,\n &:active {\n color: lighten($darker-text-color, 8%);\n }\n }\n\n .red {\n color: $error-value-color;\n }\n }\n }\n\n &__summary {\n &__item {\n display: flex;\n justify-content: flex-start;\n border-top: 1px solid darken($ui-base-color, 4%);\n\n &:hover {\n background: lighten($ui-base-color, 2%);\n }\n\n &__reported-by,\n &__assigned {\n padding: 15px;\n flex: 0 0 auto;\n box-sizing: border-box;\n width: 150px;\n color: $darker-text-color;\n\n &,\n .username {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n &__content {\n flex: 1 1 auto;\n max-width: calc(100% - 300px);\n\n &__icon {\n color: $dark-text-color;\n margin-right: 4px;\n font-weight: 500;\n }\n }\n\n &__content a {\n display: block;\n box-sizing: border-box;\n width: 100%;\n padding: 15px;\n text-decoration: none;\n color: $darker-text-color;\n }\n }\n }\n}\n\n.one-line {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.ellipsized-ip {\n display: inline-block;\n max-width: 120px;\n overflow: hidden;\n text-overflow: ellipsis;\n vertical-align: middle;\n}\n\n.admin-account-bio {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n margin-top: 20px;\n\n > div {\n box-sizing: border-box;\n padding: 0 5px;\n margin-bottom: 10px;\n flex: 1 0 50%;\n }\n\n .account__header__fields,\n .account__header__content {\n background: lighten($ui-base-color, 8%);\n border-radius: 4px;\n height: 100%;\n }\n\n .account__header__fields {\n margin: 0;\n border: 0;\n\n a {\n color: lighten($ui-highlight-color, 8%);\n }\n\n dl:first-child .verified {\n border-radius: 0 4px 0 0;\n }\n\n .verified a {\n color: $valid-value-color;\n }\n }\n\n .account__header__content {\n box-sizing: border-box;\n padding: 20px;\n color: $primary-text-color;\n }\n}\n\n.center-text {\n text-align: center;\n}\n\n.announcements-list {\n border: 1px solid lighten($ui-base-color, 4%);\n border-radius: 4px;\n\n &__item {\n padding: 15px 0;\n background: $ui-base-color;\n border-bottom: 1px solid lighten($ui-base-color, 4%);\n\n &__title {\n padding: 0 15px;\n display: block;\n font-weight: 500;\n font-size: 18px;\n line-height: 1.5;\n color: $secondary-text-color;\n text-decoration: none;\n margin-bottom: 10px;\n\n &:hover,\n &:focus,\n &:active {\n color: $primary-text-color;\n }\n }\n\n &__meta {\n padding: 0 15px;\n color: $dark-text-color;\n }\n\n &__action-bar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n &:last-child {\n border-bottom: 0;\n }\n }\n}\n",".dashboard__counters {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n margin-bottom: 20px;\n\n & > div {\n box-sizing: border-box;\n flex: 0 0 33.333%;\n padding: 0 5px;\n margin-bottom: 10px;\n\n & > div,\n & > a {\n padding: 20px;\n background: lighten($ui-base-color, 4%);\n border-radius: 4px;\n box-sizing: border-box;\n height: 100%;\n }\n\n & > a {\n text-decoration: none;\n color: inherit;\n display: block;\n\n &:hover,\n &:focus,\n &:active {\n background: lighten($ui-base-color, 8%);\n }\n }\n }\n\n &__num,\n &__text {\n text-align: center;\n font-weight: 500;\n font-size: 24px;\n line-height: 21px;\n color: $primary-text-color;\n font-family: $font-display, sans-serif;\n margin-bottom: 20px;\n line-height: 30px;\n }\n\n &__text {\n font-size: 18px;\n }\n\n &__label {\n font-size: 14px;\n color: $darker-text-color;\n text-align: center;\n font-weight: 500;\n }\n}\n\n.dashboard__widgets {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -5px;\n\n & > div {\n flex: 0 0 33.333%;\n margin-bottom: 20px;\n\n & > div {\n padding: 0 5px;\n }\n }\n\n a:not(.name-tag) {\n color: $ui-secondary-color;\n font-weight: 500;\n text-decoration: none;\n }\n}\n","body.rtl {\n direction: rtl;\n\n .column-header > button {\n text-align: right;\n padding-left: 0;\n padding-right: 15px;\n }\n\n .radio-button__input {\n margin-right: 0;\n margin-left: 10px;\n }\n\n .directory__card__bar .display-name {\n margin-left: 0;\n margin-right: 15px;\n }\n\n .display-name {\n text-align: right;\n }\n\n .notification__message {\n margin-left: 0;\n margin-right: 68px;\n }\n\n .drawer__inner__mastodon > img {\n transform: scaleX(-1);\n }\n\n .notification__favourite-icon-wrapper {\n left: auto;\n right: -26px;\n }\n\n .landing-page__logo {\n margin-right: 0;\n margin-left: 20px;\n }\n\n .landing-page .features-list .features-list__row .visual {\n margin-left: 0;\n margin-right: 15px;\n }\n\n .column-link__icon,\n .column-header__icon {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .compose-form .compose-form__buttons-wrapper .character-counter__wrapper {\n margin-right: 0;\n margin-left: 4px;\n }\n\n .navigation-bar__profile {\n margin-left: 0;\n margin-right: 8px;\n }\n\n .search__input {\n padding-right: 10px;\n padding-left: 30px;\n }\n\n .search__icon .fa {\n right: auto;\n left: 10px;\n }\n\n .columns-area {\n direction: rtl;\n }\n\n .column-header__buttons {\n left: 0;\n right: auto;\n margin-left: 0;\n margin-right: -15px;\n }\n\n .column-inline-form .icon-button {\n margin-left: 0;\n margin-right: 5px;\n }\n\n .column-header__links .text-btn {\n margin-left: 10px;\n margin-right: 0;\n }\n\n .account__avatar-wrapper {\n float: right;\n }\n\n .column-header__back-button {\n padding-left: 5px;\n padding-right: 0;\n }\n\n .column-header__setting-arrows {\n float: left;\n }\n\n .setting-toggle__label {\n margin-left: 0;\n margin-right: 8px;\n }\n\n .status__avatar {\n left: auto;\n right: 10px;\n }\n\n .status,\n .activity-stream .status.light {\n padding-left: 10px;\n padding-right: 68px;\n }\n\n .status__info .status__display-name,\n .activity-stream .status.light .status__display-name {\n padding-left: 25px;\n padding-right: 0;\n }\n\n .activity-stream .pre-header {\n padding-right: 68px;\n padding-left: 0;\n }\n\n .status__prepend {\n margin-left: 0;\n margin-right: 68px;\n }\n\n .status__prepend-icon-wrapper {\n left: auto;\n right: -26px;\n }\n\n .activity-stream .pre-header .pre-header__icon {\n left: auto;\n right: 42px;\n }\n\n .account__avatar-overlay-overlay {\n right: auto;\n left: 0;\n }\n\n .column-back-button--slim-button {\n right: auto;\n left: 0;\n }\n\n .status__relative-time,\n .activity-stream .status.light .status__header .status__meta {\n float: left;\n }\n\n .status__action-bar {\n &__counter {\n margin-right: 0;\n margin-left: 11px;\n\n .status__action-bar-button {\n margin-right: 0;\n margin-left: 4px;\n }\n }\n }\n\n .status__action-bar-button {\n float: right;\n margin-right: 0;\n margin-left: 18px;\n }\n\n .status__action-bar-dropdown {\n float: right;\n }\n\n .privacy-dropdown__dropdown {\n margin-left: 0;\n margin-right: 40px;\n }\n\n .privacy-dropdown__option__icon {\n margin-left: 10px;\n margin-right: 0;\n }\n\n .detailed-status__display-name .display-name {\n text-align: right;\n }\n\n .detailed-status__display-avatar {\n margin-right: 0;\n margin-left: 10px;\n float: right;\n }\n\n .detailed-status__favorites,\n .detailed-status__reblogs {\n margin-left: 0;\n margin-right: 6px;\n }\n\n .fa-ul {\n margin-left: 2.14285714em;\n }\n\n .fa-li {\n left: auto;\n right: -2.14285714em;\n }\n\n .admin-wrapper {\n direction: rtl;\n }\n\n .admin-wrapper .sidebar ul a i.fa,\n a.table-action-link i.fa {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .simple_form .check_boxes .checkbox label {\n padding-left: 0;\n padding-right: 25px;\n }\n\n .simple_form .input.with_label.boolean label.checkbox {\n padding-left: 25px;\n padding-right: 0;\n }\n\n .simple_form .check_boxes .checkbox input[type=\"checkbox\"],\n .simple_form .input.boolean input[type=\"checkbox\"] {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.radio_buttons .radio {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.radio_buttons .radio > label {\n padding-right: 28px;\n padding-left: 0;\n }\n\n .simple_form .input-with-append .input input {\n padding-left: 142px;\n padding-right: 0;\n }\n\n .simple_form .input.boolean label.checkbox {\n left: auto;\n right: 0;\n }\n\n .simple_form .input.boolean .label_input,\n .simple_form .input.boolean .hint {\n padding-left: 0;\n padding-right: 28px;\n }\n\n .simple_form .label_input__append {\n right: auto;\n left: 3px;\n\n &::after {\n right: auto;\n left: 0;\n background-image: linear-gradient(to left, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));\n }\n }\n\n .simple_form select {\n background: darken($ui-base-color, 10%) url(\"data:image/svg+xml;utf8,\") no-repeat left 8px center / auto 16px;\n }\n\n .table th,\n .table td {\n text-align: right;\n }\n\n .filters .filter-subset {\n margin-right: 0;\n margin-left: 45px;\n }\n\n .landing-page .header-wrapper .mascot {\n right: 60px;\n left: auto;\n }\n\n .landing-page__call-to-action .row__information-board {\n direction: rtl;\n }\n\n .landing-page .header .hero .floats .float-1 {\n left: -120px;\n right: auto;\n }\n\n .landing-page .header .hero .floats .float-2 {\n left: 210px;\n right: auto;\n }\n\n .landing-page .header .hero .floats .float-3 {\n left: 110px;\n right: auto;\n }\n\n .landing-page .header .links .brand img {\n left: 0;\n }\n\n .landing-page .fa-external-link {\n padding-right: 5px;\n padding-left: 0 !important;\n }\n\n .landing-page .features #mastodon-timeline {\n margin-right: 0;\n margin-left: 30px;\n }\n\n @media screen and (min-width: 631px) {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n\n &:first-child {\n padding-left: 5px;\n padding-right: 10px;\n }\n }\n\n .columns-area > div {\n .column,\n .drawer {\n padding-left: 5px;\n padding-right: 5px;\n }\n }\n }\n\n .columns-area--mobile .column,\n .columns-area--mobile .drawer {\n padding-left: 0;\n padding-right: 0;\n }\n\n .public-layout {\n .header {\n .nav-button {\n margin-left: 8px;\n margin-right: 0;\n }\n }\n\n .public-account-header__tabs {\n margin-left: 0;\n margin-right: 20px;\n }\n }\n\n .landing-page__information {\n .account__display-name {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .account__avatar-wrapper {\n margin-left: 12px;\n margin-right: 0;\n }\n }\n\n .card__bar .display-name {\n margin-left: 0;\n margin-right: 15px;\n text-align: right;\n }\n\n .fa-chevron-left::before {\n content: \"\\F054\";\n }\n\n .fa-chevron-right::before {\n content: \"\\F053\";\n }\n\n .column-back-button__icon {\n margin-right: 0;\n margin-left: 5px;\n }\n\n .column-header__setting-arrows .column-header__setting-btn:last-child {\n padding-left: 0;\n padding-right: 10px;\n }\n\n .simple_form .input.radio_buttons .radio > label input {\n left: auto;\n right: 0;\n }\n}\n","$black-emojis: '8ball' 'ant' 'back' 'black_circle' 'black_heart' 'black_large_square' 'black_medium_small_square' 'black_medium_square' 'black_nib' 'black_small_square' 'bomb' 'bowling' 'bust_in_silhouette' 'busts_in_silhouette' 'camera' 'camera_with_flash' 'clubs' 'copyright' 'curly_loop' 'currency_exchange' 'dark_sunglasses' 'eight_pointed_black_star' 'electric_plug' 'end' 'female-guard' 'film_projector' 'fried_egg' 'gorilla' 'guardsman' 'heavy_check_mark' 'heavy_division_sign' 'heavy_dollar_sign' 'heavy_minus_sign' 'heavy_multiplication_x' 'heavy_plus_sign' 'hocho' 'hole' 'joystick' 'kaaba' 'lower_left_ballpoint_pen' 'lower_left_fountain_pen' 'male-guard' 'microphone' 'mortar_board' 'movie_camera' 'musical_score' 'on' 'registered' 'soon' 'spades' 'speaking_head_in_silhouette' 'spider' 'telephone_receiver' 'tm' 'top' 'tophat' 'turkey' 'vhs' 'video_camera' 'video_game' 'water_buffalo' 'waving_black_flag' 'wavy_dash';\n\n%white-emoji-outline {\n filter: drop-shadow(1px 1px 0 $white) drop-shadow(-1px 1px 0 $white) drop-shadow(1px -1px 0 $white) drop-shadow(-1px -1px 0 $white);\n transform: scale(.71);\n}\n\n.emojione {\n @each $emoji in $black-emojis {\n &[title=':#{$emoji}:'] {\n @extend %white-emoji-outline;\n }\n }\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/packs/skins/vanilla/win95/common.js b/priv/static/packs/skins/vanilla/win95/common.js index 67f57683a..ad508dd52 100644 Binary files a/priv/static/packs/skins/vanilla/win95/common.js and b/priv/static/packs/skins/vanilla/win95/common.js differ diff --git a/priv/static/packs/tesseract.js b/priv/static/packs/tesseract.js index 3dca2bfe2..8d0a37718 100644 Binary files a/priv/static/packs/tesseract.js and b/priv/static/packs/tesseract.js differ diff --git a/priv/static/packs/tesseract.js.LICENSE b/priv/static/packs/tesseract.js.LICENSE.txt similarity index 100% rename from priv/static/packs/tesseract.js.LICENSE rename to priv/static/packs/tesseract.js.LICENSE.txt diff --git a/priv/static/packs/tesseract.js.map b/priv/static/packs/tesseract.js.map index 5e9c4cd5c..0a5962033 100644 Binary files a/priv/static/packs/tesseract.js.map and b/priv/static/packs/tesseract.js.map differ diff --git a/priv/static/static/static-fe.css b/priv/static/static-fe/static-fe.css similarity index 96% rename from priv/static/static/static-fe.css rename to priv/static/static-fe/static-fe.css index 19c56387b..db61ff266 100644 Binary files a/priv/static/static/static-fe.css and b/priv/static/static-fe/static-fe.css differ diff --git a/priv/static/static/config.json b/priv/static/static/config.json index c82678699..727dde73b 100644 --- a/priv/static/static/config.json +++ b/priv/static/static/config.json @@ -1,23 +1,28 @@ { - "theme": "pleroma-dark", - "background": "/static/aurora_borealis.jpg", - "logo": "/static/logo.png", - "logoMask": true, - "logoMargin": ".1em", - "redirectRootNoLogin": "/main/all", - "redirectRootLogin": "/main/friends", - "showInstanceSpecificPanel": false, - "collapseMessageWithSubject": false, - "scopeCopy": true, - "subjectLineBehavior": "email", - "postContentType": "text/plain", "alwaysShowSubjectInput": true, + "background": "/static/aurora_borealis.jpg", + "collapseMessageWithSubject": false, + "disableChat": false, + "greentext": false, + "hideFilteredStatuses": false, + "hideMutedPosts": false, "hidePostStats": false, + "hideSitename": false, "hideUserStats": false, "loginMethod": "password", - "webPushNotifications": false, + "logo": "/static/logo.png", + "logoMargin": ".1em", + "logoMask": true, + "minimalScopesMode": false, "noAttachmentLinks": false, "nsfwCensorImage": "", + "postContentType": "text/plain", + "redirectRootLogin": "/main/friends", + "redirectRootNoLogin": "/main/all", + "scopeCopy": true, "showFeaturesPanel": true, - "minimalScopesMode": false + "showInstanceSpecificPanel": false, + "subjectLineBehavior": "email", + "theme": "pleroma-dark", + "webPushNotifications": false } diff --git a/priv/static/static/css/app.1055039ce3f2fe4dd110.css b/priv/static/static/css/app.1055039ce3f2fe4dd110.css deleted file mode 100644 index 1867ca81a..000000000 Binary files a/priv/static/static/css/app.1055039ce3f2fe4dd110.css and /dev/null differ diff --git a/priv/static/static/css/app.1055039ce3f2fe4dd110.css.map b/priv/static/static/css/app.1055039ce3f2fe4dd110.css.map deleted file mode 100644 index 861ee8313..000000000 --- a/priv/static/static/css/app.1055039ce3f2fe4dd110.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/hocs/with_load_more/with_load_more.scss","webpack:///./src/components/tab_switcher/tab_switcher.scss","webpack:///./src/hocs/with_subscription/with_subscription.scss"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,C;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,C;ACxFA;AACA;AACA;AACA;AACA;AACA;AACA,C","file":"static/css/app.1055039ce3f2fe4dd110.css","sourcesContent":[".with-load-more-footer {\n padding: 10px;\n text-align: center;\n border-top: 1px solid;\n border-top-color: #222;\n border-top-color: var(--border, #222);\n}\n.with-load-more-footer .error {\n font-size: 14px;\n}",".tab-switcher {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n}\n.tab-switcher .contents {\n -ms-flex: 1 0 auto;\n flex: 1 0 auto;\n min-height: 0px;\n}\n.tab-switcher .contents .hidden {\n display: none;\n}\n.tab-switcher .contents.scrollable-tabs {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n overflow-y: auto;\n}\n.tab-switcher .tabs {\n display: -ms-flexbox;\n display: flex;\n position: relative;\n width: 100%;\n overflow-y: hidden;\n overflow-x: auto;\n padding-top: 5px;\n box-sizing: border-box;\n}\n.tab-switcher .tabs::after, .tab-switcher .tabs::before {\n display: block;\n content: \"\";\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n border-bottom: 1px solid;\n border-bottom-color: #222;\n border-bottom-color: var(--border, #222);\n}\n.tab-switcher .tabs .tab-wrapper {\n height: 28px;\n position: relative;\n display: -ms-flexbox;\n display: flex;\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n}\n.tab-switcher .tabs .tab-wrapper .tab {\n width: 100%;\n min-width: 1px;\n position: relative;\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n padding: 6px 1em;\n padding-bottom: 99px;\n margin-bottom: -93px;\n white-space: nowrap;\n color: #b9b9ba;\n color: var(--tabText, #b9b9ba);\n background-color: #182230;\n background-color: var(--tab, #182230);\n}\n.tab-switcher .tabs .tab-wrapper .tab:not(.active) {\n z-index: 4;\n}\n.tab-switcher .tabs .tab-wrapper .tab:not(.active):hover {\n z-index: 6;\n}\n.tab-switcher .tabs .tab-wrapper .tab.active {\n background: transparent;\n z-index: 5;\n color: #b9b9ba;\n color: var(--tabActiveText, #b9b9ba);\n}\n.tab-switcher .tabs .tab-wrapper .tab img {\n max-height: 26px;\n vertical-align: top;\n margin-top: -5px;\n}\n.tab-switcher .tabs .tab-wrapper:not(.active)::after {\n content: \"\";\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 7;\n border-bottom: 1px solid;\n border-bottom-color: #222;\n border-bottom-color: var(--border, #222);\n}",".with-subscription-loading {\n padding: 10px;\n text-align: center;\n}\n.with-subscription-loading .error {\n font-size: 14px;\n}"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/static/css/app.613cef07981cd95ccceb.css b/priv/static/static/css/app.613cef07981cd95ccceb.css new file mode 100644 index 000000000..c1d5f8188 Binary files /dev/null and b/priv/static/static/css/app.613cef07981cd95ccceb.css differ diff --git a/priv/static/static/css/app.613cef07981cd95ccceb.css.map b/priv/static/static/css/app.613cef07981cd95ccceb.css.map new file mode 100644 index 000000000..556e0bb0b --- /dev/null +++ b/priv/static/static/css/app.613cef07981cd95ccceb.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/hocs/with_load_more/with_load_more.scss","webpack:///./src/components/tab_switcher/tab_switcher.scss","webpack:///./src/hocs/with_subscription/with_subscription.scss"],"names":[],"mappings":"AAAA,uBAAuB,aAAa,kBAAkB,qBAAqB,sBAAsB,qCAAqC,8BAA8B,e;ACApK,cAAc,oBAAoB,aAAa,0BAA0B,sBAAsB,wBAAwB,kBAAkB,cAAc,eAAe,gCAAgC,aAAa,wCAAwC,0BAA0B,aAAa,gBAAgB,oBAAoB,oBAAoB,aAAa,kBAAkB,WAAW,kBAAkB,gBAAgB,gBAAgB,sBAAsB,uDAAuD,cAAc,WAAW,kBAAkB,cAAc,wBAAwB,yBAAyB,wCAAwC,iCAAiC,YAAY,kBAAkB,oBAAoB,aAAa,kBAAkB,cAAc,sCAAsC,WAAW,cAAc,kBAAkB,4BAA4B,6BAA6B,gBAAgB,oBAAoB,oBAAoB,mBAAmB,cAAc,8BAA8B,yBAAyB,qCAAqC,mDAAmD,UAAU,yDAAyD,UAAU,6CAA6C,uBAAuB,UAAU,cAAc,oCAAoC,0CAA0C,gBAAgB,mBAAmB,gBAAgB,qDAAqD,WAAW,kBAAkB,OAAO,QAAQ,SAAS,UAAU,wBAAwB,yBAAyB,wC;ACAtlD,2BAA2B,aAAa,kBAAkB,kCAAkC,e","file":"static/css/app.613cef07981cd95ccceb.css","sourcesContent":[".with-load-more-footer{padding:10px;text-align:center;border-top:1px solid;border-top-color:#222;border-top-color:var(--border, #222)}.with-load-more-footer .error{font-size:14px}",".tab-switcher{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.tab-switcher .contents{-ms-flex:1 0 auto;flex:1 0 auto;min-height:0px}.tab-switcher .contents .hidden{display:none}.tab-switcher .contents.scrollable-tabs{-ms-flex-preferred-size:0;flex-basis:0;overflow-y:auto}.tab-switcher .tabs{display:-ms-flexbox;display:flex;position:relative;width:100%;overflow-y:hidden;overflow-x:auto;padding-top:5px;box-sizing:border-box}.tab-switcher .tabs::after,.tab-switcher .tabs::before{display:block;content:\"\";-ms-flex:1 1 auto;flex:1 1 auto;border-bottom:1px solid;border-bottom-color:#222;border-bottom-color:var(--border, #222)}.tab-switcher .tabs .tab-wrapper{height:28px;position:relative;display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto}.tab-switcher .tabs .tab-wrapper .tab{width:100%;min-width:1px;position:relative;border-bottom-left-radius:0;border-bottom-right-radius:0;padding:6px 1em;padding-bottom:99px;margin-bottom:-93px;white-space:nowrap;color:#b9b9ba;color:var(--tabText, #b9b9ba);background-color:#182230;background-color:var(--tab, #182230)}.tab-switcher .tabs .tab-wrapper .tab:not(.active){z-index:4}.tab-switcher .tabs .tab-wrapper .tab:not(.active):hover{z-index:6}.tab-switcher .tabs .tab-wrapper .tab.active{background:transparent;z-index:5;color:#b9b9ba;color:var(--tabActiveText, #b9b9ba)}.tab-switcher .tabs .tab-wrapper .tab img{max-height:26px;vertical-align:top;margin-top:-5px}.tab-switcher .tabs .tab-wrapper:not(.active)::after{content:\"\";position:absolute;left:0;right:0;bottom:0;z-index:7;border-bottom:1px solid;border-bottom-color:#222;border-bottom-color:var(--border, #222)}",".with-subscription-loading{padding:10px;text-align:center}.with-subscription-loading .error{font-size:14px}"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/static/css/vendors~app.b2603a50868c68a1c192.css b/priv/static/static/css/vendors~app.18fea621d430000acc27.css similarity index 92% rename from priv/static/static/css/vendors~app.b2603a50868c68a1c192.css rename to priv/static/static/css/vendors~app.18fea621d430000acc27.css index a2e625f5e..ef783cbb3 100644 Binary files a/priv/static/static/css/vendors~app.b2603a50868c68a1c192.css and b/priv/static/static/css/vendors~app.18fea621d430000acc27.css differ diff --git a/priv/static/static/css/vendors~app.18fea621d430000acc27.css.map b/priv/static/static/css/vendors~app.18fea621d430000acc27.css.map new file mode 100644 index 000000000..057d67d6a --- /dev/null +++ b/priv/static/static/css/vendors~app.18fea621d430000acc27.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./node_modules/cropperjs/dist/cropper.css"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,wCAAwC;AACxC;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA","file":"static/css/vendors~app.18fea621d430000acc27.css","sourcesContent":["/*!\n * Cropper.js v1.5.6\n * https://fengyuanchen.github.io/cropperjs\n *\n * Copyright 2015-present Chen Fengyuan\n * Released under the MIT license\n *\n * Date: 2019-10-04T04:33:44.164Z\n */\n\n.cropper-container {\n direction: ltr;\n font-size: 0;\n line-height: 0;\n position: relative;\n -ms-touch-action: none;\n touch-action: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.cropper-container img {\n display: block;\n height: 100%;\n image-orientation: 0deg;\n max-height: none !important;\n max-width: none !important;\n min-height: 0 !important;\n min-width: 0 !important;\n width: 100%;\n}\n\n.cropper-wrap-box,\n.cropper-canvas,\n.cropper-drag-box,\n.cropper-crop-box,\n.cropper-modal {\n bottom: 0;\n left: 0;\n position: absolute;\n right: 0;\n top: 0;\n}\n\n.cropper-wrap-box,\n.cropper-canvas {\n overflow: hidden;\n}\n\n.cropper-drag-box {\n background-color: #fff;\n opacity: 0;\n}\n\n.cropper-modal {\n background-color: #000;\n opacity: 0.5;\n}\n\n.cropper-view-box {\n display: block;\n height: 100%;\n outline: 1px solid #39f;\n outline-color: rgba(51, 153, 255, 0.75);\n overflow: hidden;\n width: 100%;\n}\n\n.cropper-dashed {\n border: 0 dashed #eee;\n display: block;\n opacity: 0.5;\n position: absolute;\n}\n\n.cropper-dashed.dashed-h {\n border-bottom-width: 1px;\n border-top-width: 1px;\n height: calc(100% / 3);\n left: 0;\n top: calc(100% / 3);\n width: 100%;\n}\n\n.cropper-dashed.dashed-v {\n border-left-width: 1px;\n border-right-width: 1px;\n height: 100%;\n left: calc(100% / 3);\n top: 0;\n width: calc(100% / 3);\n}\n\n.cropper-center {\n display: block;\n height: 0;\n left: 50%;\n opacity: 0.75;\n position: absolute;\n top: 50%;\n width: 0;\n}\n\n.cropper-center::before,\n.cropper-center::after {\n background-color: #eee;\n content: ' ';\n display: block;\n position: absolute;\n}\n\n.cropper-center::before {\n height: 1px;\n left: -3px;\n top: 0;\n width: 7px;\n}\n\n.cropper-center::after {\n height: 7px;\n left: 0;\n top: -3px;\n width: 1px;\n}\n\n.cropper-face,\n.cropper-line,\n.cropper-point {\n display: block;\n height: 100%;\n opacity: 0.1;\n position: absolute;\n width: 100%;\n}\n\n.cropper-face {\n background-color: #fff;\n left: 0;\n top: 0;\n}\n\n.cropper-line {\n background-color: #39f;\n}\n\n.cropper-line.line-e {\n cursor: ew-resize;\n right: -3px;\n top: 0;\n width: 5px;\n}\n\n.cropper-line.line-n {\n cursor: ns-resize;\n height: 5px;\n left: 0;\n top: -3px;\n}\n\n.cropper-line.line-w {\n cursor: ew-resize;\n left: -3px;\n top: 0;\n width: 5px;\n}\n\n.cropper-line.line-s {\n bottom: -3px;\n cursor: ns-resize;\n height: 5px;\n left: 0;\n}\n\n.cropper-point {\n background-color: #39f;\n height: 5px;\n opacity: 0.75;\n width: 5px;\n}\n\n.cropper-point.point-e {\n cursor: ew-resize;\n margin-top: -3px;\n right: -3px;\n top: 50%;\n}\n\n.cropper-point.point-n {\n cursor: ns-resize;\n left: 50%;\n margin-left: -3px;\n top: -3px;\n}\n\n.cropper-point.point-w {\n cursor: ew-resize;\n left: -3px;\n margin-top: -3px;\n top: 50%;\n}\n\n.cropper-point.point-s {\n bottom: -3px;\n cursor: s-resize;\n left: 50%;\n margin-left: -3px;\n}\n\n.cropper-point.point-ne {\n cursor: nesw-resize;\n right: -3px;\n top: -3px;\n}\n\n.cropper-point.point-nw {\n cursor: nwse-resize;\n left: -3px;\n top: -3px;\n}\n\n.cropper-point.point-sw {\n bottom: -3px;\n cursor: nesw-resize;\n left: -3px;\n}\n\n.cropper-point.point-se {\n bottom: -3px;\n cursor: nwse-resize;\n height: 20px;\n opacity: 1;\n right: -3px;\n width: 20px;\n}\n\n@media (min-width: 768px) {\n .cropper-point.point-se {\n height: 15px;\n width: 15px;\n }\n}\n\n@media (min-width: 992px) {\n .cropper-point.point-se {\n height: 10px;\n width: 10px;\n }\n}\n\n@media (min-width: 1200px) {\n .cropper-point.point-se {\n height: 5px;\n opacity: 0.75;\n width: 5px;\n }\n}\n\n.cropper-point.point-se::before {\n background-color: #39f;\n bottom: -50%;\n content: ' ';\n display: block;\n height: 200%;\n opacity: 0;\n position: absolute;\n right: -50%;\n width: 200%;\n}\n\n.cropper-invisible {\n opacity: 0;\n}\n\n.cropper-bg {\n background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC');\n}\n\n.cropper-hide {\n display: block;\n height: 0;\n position: absolute;\n width: 0;\n}\n\n.cropper-hidden {\n display: none !important;\n}\n\n.cropper-move {\n cursor: move;\n}\n\n.cropper-crop {\n cursor: crosshair;\n}\n\n.cropper-disabled .cropper-drag-box,\n.cropper-disabled .cropper-face,\n.cropper-disabled .cropper-line,\n.cropper-disabled .cropper-point {\n cursor: not-allowed;\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/static/css/vendors~app.b2603a50868c68a1c192.css.map b/priv/static/static/css/vendors~app.b2603a50868c68a1c192.css.map deleted file mode 100644 index e7013b291..000000000 --- a/priv/static/static/css/vendors~app.b2603a50868c68a1c192.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./node_modules/cropperjs/dist/cropper.css"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,wCAAwC;AACxC;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA","file":"static/css/vendors~app.b2603a50868c68a1c192.css","sourcesContent":["/*!\n * Cropper.js v1.4.3\n * https://fengyuanchen.github.io/cropperjs\n *\n * Copyright 2015-present Chen Fengyuan\n * Released under the MIT license\n *\n * Date: 2018-10-24T13:07:11.429Z\n */\n\n.cropper-container {\n direction: ltr;\n font-size: 0;\n line-height: 0;\n position: relative;\n -ms-touch-action: none;\n touch-action: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.cropper-container img {\n display: block;\n height: 100%;\n image-orientation: 0deg;\n max-height: none !important;\n max-width: none !important;\n min-height: 0 !important;\n min-width: 0 !important;\n width: 100%;\n}\n\n.cropper-wrap-box,\n.cropper-canvas,\n.cropper-drag-box,\n.cropper-crop-box,\n.cropper-modal {\n bottom: 0;\n left: 0;\n position: absolute;\n right: 0;\n top: 0;\n}\n\n.cropper-wrap-box,\n.cropper-canvas {\n overflow: hidden;\n}\n\n.cropper-drag-box {\n background-color: #fff;\n opacity: 0;\n}\n\n.cropper-modal {\n background-color: #000;\n opacity: .5;\n}\n\n.cropper-view-box {\n display: block;\n height: 100%;\n outline-color: rgba(51, 153, 255, 0.75);\n outline: 1px solid #39f;\n overflow: hidden;\n width: 100%;\n}\n\n.cropper-dashed {\n border: 0 dashed #eee;\n display: block;\n opacity: .5;\n position: absolute;\n}\n\n.cropper-dashed.dashed-h {\n border-bottom-width: 1px;\n border-top-width: 1px;\n height: calc(100% / 3);\n left: 0;\n top: calc(100% / 3);\n width: 100%;\n}\n\n.cropper-dashed.dashed-v {\n border-left-width: 1px;\n border-right-width: 1px;\n height: 100%;\n left: calc(100% / 3);\n top: 0;\n width: calc(100% / 3);\n}\n\n.cropper-center {\n display: block;\n height: 0;\n left: 50%;\n opacity: .75;\n position: absolute;\n top: 50%;\n width: 0;\n}\n\n.cropper-center:before,\n.cropper-center:after {\n background-color: #eee;\n content: ' ';\n display: block;\n position: absolute;\n}\n\n.cropper-center:before {\n height: 1px;\n left: -3px;\n top: 0;\n width: 7px;\n}\n\n.cropper-center:after {\n height: 7px;\n left: 0;\n top: -3px;\n width: 1px;\n}\n\n.cropper-face,\n.cropper-line,\n.cropper-point {\n display: block;\n height: 100%;\n opacity: .1;\n position: absolute;\n width: 100%;\n}\n\n.cropper-face {\n background-color: #fff;\n left: 0;\n top: 0;\n}\n\n.cropper-line {\n background-color: #39f;\n}\n\n.cropper-line.line-e {\n cursor: ew-resize;\n right: -3px;\n top: 0;\n width: 5px;\n}\n\n.cropper-line.line-n {\n cursor: ns-resize;\n height: 5px;\n left: 0;\n top: -3px;\n}\n\n.cropper-line.line-w {\n cursor: ew-resize;\n left: -3px;\n top: 0;\n width: 5px;\n}\n\n.cropper-line.line-s {\n bottom: -3px;\n cursor: ns-resize;\n height: 5px;\n left: 0;\n}\n\n.cropper-point {\n background-color: #39f;\n height: 5px;\n opacity: .75;\n width: 5px;\n}\n\n.cropper-point.point-e {\n cursor: ew-resize;\n margin-top: -3px;\n right: -3px;\n top: 50%;\n}\n\n.cropper-point.point-n {\n cursor: ns-resize;\n left: 50%;\n margin-left: -3px;\n top: -3px;\n}\n\n.cropper-point.point-w {\n cursor: ew-resize;\n left: -3px;\n margin-top: -3px;\n top: 50%;\n}\n\n.cropper-point.point-s {\n bottom: -3px;\n cursor: s-resize;\n left: 50%;\n margin-left: -3px;\n}\n\n.cropper-point.point-ne {\n cursor: nesw-resize;\n right: -3px;\n top: -3px;\n}\n\n.cropper-point.point-nw {\n cursor: nwse-resize;\n left: -3px;\n top: -3px;\n}\n\n.cropper-point.point-sw {\n bottom: -3px;\n cursor: nesw-resize;\n left: -3px;\n}\n\n.cropper-point.point-se {\n bottom: -3px;\n cursor: nwse-resize;\n height: 20px;\n opacity: 1;\n right: -3px;\n width: 20px;\n}\n\n@media (min-width: 768px) {\n .cropper-point.point-se {\n height: 15px;\n width: 15px;\n }\n}\n\n@media (min-width: 992px) {\n .cropper-point.point-se {\n height: 10px;\n width: 10px;\n }\n}\n\n@media (min-width: 1200px) {\n .cropper-point.point-se {\n height: 5px;\n opacity: .75;\n width: 5px;\n }\n}\n\n.cropper-point.point-se:before {\n background-color: #39f;\n bottom: -50%;\n content: ' ';\n display: block;\n height: 200%;\n opacity: 0;\n position: absolute;\n right: -50%;\n width: 200%;\n}\n\n.cropper-invisible {\n opacity: 0;\n}\n\n.cropper-bg {\n background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC');\n}\n\n.cropper-hide {\n display: block;\n height: 0;\n position: absolute;\n width: 0;\n}\n\n.cropper-hidden {\n display: none !important;\n}\n\n.cropper-move {\n cursor: move;\n}\n\n.cropper-crop {\n cursor: crosshair;\n}\n\n.cropper-disabled .cropper-drag-box,\n.cropper-disabled .cropper-face,\n.cropper-disabled .cropper-line,\n.cropper-disabled .cropper-point {\n cursor: not-allowed;\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/static/font/fontello.1583594169021.woff b/priv/static/static/font/fontello.1583594169021.woff deleted file mode 100644 index 408c26afb..000000000 Binary files a/priv/static/static/font/fontello.1583594169021.woff and /dev/null differ diff --git a/priv/static/static/font/fontello.1583594169021.woff2 b/priv/static/static/font/fontello.1583594169021.woff2 deleted file mode 100644 index b963e9489..000000000 Binary files a/priv/static/static/font/fontello.1583594169021.woff2 and /dev/null differ diff --git a/priv/static/static/font/fontello.1583594169021.eot b/priv/static/static/font/fontello.1589385935077.eot similarity index 87% rename from priv/static/static/font/fontello.1583594169021.eot rename to priv/static/static/font/fontello.1589385935077.eot index f822a48a3..e5f37013a 100644 Binary files a/priv/static/static/font/fontello.1583594169021.eot and b/priv/static/static/font/fontello.1589385935077.eot differ diff --git a/priv/static/static/font/fontello.1583594169021.svg b/priv/static/static/font/fontello.1589385935077.svg similarity index 96% rename from priv/static/static/font/fontello.1583594169021.svg rename to priv/static/static/font/fontello.1589385935077.svg index b905a0f6c..e63fb7529 100644 --- a/priv/static/static/font/fontello.1583594169021.svg +++ b/priv/static/static/font/fontello.1589385935077.svg @@ -78,6 +78,10 @@ + + + + @@ -110,6 +114,8 @@ + + diff --git a/priv/static/static/font/fontello.1583594169021.ttf b/priv/static/static/font/fontello.1589385935077.ttf similarity index 87% rename from priv/static/static/font/fontello.1583594169021.ttf rename to priv/static/static/font/fontello.1589385935077.ttf index 5ed36e9aa..0fde96cea 100644 Binary files a/priv/static/static/font/fontello.1583594169021.ttf and b/priv/static/static/font/fontello.1589385935077.ttf differ diff --git a/priv/static/static/font/fontello.1589385935077.woff b/priv/static/static/font/fontello.1589385935077.woff new file mode 100644 index 000000000..f48488a77 Binary files /dev/null and b/priv/static/static/font/fontello.1589385935077.woff differ diff --git a/priv/static/static/font/fontello.1589385935077.woff2 b/priv/static/static/font/fontello.1589385935077.woff2 new file mode 100644 index 000000000..012eb9305 Binary files /dev/null and b/priv/static/static/font/fontello.1589385935077.woff2 differ diff --git a/priv/static/static/fontello.1583594169021.css b/priv/static/static/fontello.1589385935077.css similarity index 85% rename from priv/static/static/fontello.1583594169021.css rename to priv/static/static/fontello.1589385935077.css index c096e6103..746492163 100644 Binary files a/priv/static/static/fontello.1583594169021.css and b/priv/static/static/fontello.1589385935077.css differ diff --git a/priv/static/static/fontello.json b/priv/static/static/fontello.json index 5a7086a23..7f0e7cdd5 100755 --- a/priv/static/static/fontello.json +++ b/priv/static/static/fontello.json @@ -345,6 +345,24 @@ "css": "link", "code": 59427, "src": "fontawesome" + }, + { + "uid": "4aad6bb50b02c18508aae9cbe14e784e", + "css": "share", + "code": 61920, + "src": "fontawesome" + }, + { + "uid": "8b80d36d4ef43889db10bc1f0dc9a862", + "css": "user", + "code": 59428, + "src": "fontawesome" + }, + { + "uid": "12f4ece88e46abd864e40b35e05b11cd", + "css": "ok", + "code": 59431, + "src": "fontawesome" } ] -} +} \ No newline at end of file diff --git a/priv/static/static/js/2.18e4adec273c4ce867a8.js b/priv/static/static/js/2.18e4adec273c4ce867a8.js new file mode 100644 index 000000000..d191aa852 Binary files /dev/null and b/priv/static/static/js/2.18e4adec273c4ce867a8.js differ diff --git a/priv/static/static/js/2.18e4adec273c4ce867a8.js.map b/priv/static/static/js/2.18e4adec273c4ce867a8.js.map new file mode 100644 index 000000000..a7f98bfef Binary files /dev/null and b/priv/static/static/js/2.18e4adec273c4ce867a8.js.map differ diff --git a/priv/static/static/js/2.f158cbd2b8770e467dfe.js b/priv/static/static/js/2.f158cbd2b8770e467dfe.js deleted file mode 100644 index 24f80fe7b..000000000 Binary files a/priv/static/static/js/2.f158cbd2b8770e467dfe.js and /dev/null differ diff --git a/priv/static/static/js/2.f158cbd2b8770e467dfe.js.map b/priv/static/static/js/2.f158cbd2b8770e467dfe.js.map deleted file mode 100644 index 94ca6f090..000000000 Binary files a/priv/static/static/js/2.f158cbd2b8770e467dfe.js.map and /dev/null differ diff --git a/priv/static/static/js/app.5c94bdec79a7d0f3cfcb.js b/priv/static/static/js/app.5c94bdec79a7d0f3cfcb.js deleted file mode 100644 index 7ef7a5f12..000000000 Binary files a/priv/static/static/js/app.5c94bdec79a7d0f3cfcb.js and /dev/null differ diff --git a/priv/static/static/js/app.5c94bdec79a7d0f3cfcb.js.map b/priv/static/static/js/app.5c94bdec79a7d0f3cfcb.js.map deleted file mode 100644 index 163f78149..000000000 Binary files a/priv/static/static/js/app.5c94bdec79a7d0f3cfcb.js.map and /dev/null differ diff --git a/priv/static/static/js/app.838ffa9aecf210c7d744.js b/priv/static/static/js/app.838ffa9aecf210c7d744.js new file mode 100644 index 000000000..7e224748e Binary files /dev/null and b/priv/static/static/js/app.838ffa9aecf210c7d744.js differ diff --git a/priv/static/static/js/app.838ffa9aecf210c7d744.js.map b/priv/static/static/js/app.838ffa9aecf210c7d744.js.map new file mode 100644 index 000000000..4c2835cb4 Binary files /dev/null and b/priv/static/static/js/app.838ffa9aecf210c7d744.js.map differ diff --git a/priv/static/static/js/vendors~app.561a1c605d1dfb0e6f74.js b/priv/static/static/js/vendors~app.561a1c605d1dfb0e6f74.js new file mode 100644 index 000000000..d1f1a1830 Binary files /dev/null and b/priv/static/static/js/vendors~app.561a1c605d1dfb0e6f74.js differ diff --git a/priv/static/static/js/vendors~app.561a1c605d1dfb0e6f74.js.map b/priv/static/static/js/vendors~app.561a1c605d1dfb0e6f74.js.map new file mode 100644 index 000000000..0d4a859ea Binary files /dev/null and b/priv/static/static/js/vendors~app.561a1c605d1dfb0e6f74.js.map differ diff --git a/priv/static/static/js/vendors~app.c5bbd3734647f0cc7eef.js b/priv/static/static/js/vendors~app.c5bbd3734647f0cc7eef.js deleted file mode 100644 index 8964180cd..000000000 Binary files a/priv/static/static/js/vendors~app.c5bbd3734647f0cc7eef.js and /dev/null differ diff --git a/priv/static/static/js/vendors~app.c5bbd3734647f0cc7eef.js.map b/priv/static/static/js/vendors~app.c5bbd3734647f0cc7eef.js.map deleted file mode 100644 index fab720d23..000000000 Binary files a/priv/static/static/js/vendors~app.c5bbd3734647f0cc7eef.js.map and /dev/null differ diff --git a/priv/static/sw-pleroma.js b/priv/static/sw-pleroma.js index 88e8fcd5a..4d73c414e 100644 Binary files a/priv/static/sw-pleroma.js and b/priv/static/sw-pleroma.js differ diff --git a/priv/static/sw-pleroma.js.map b/priv/static/sw-pleroma.js.map index 5d9874693..c704cb951 100644 Binary files a/priv/static/sw-pleroma.js.map and b/priv/static/sw-pleroma.js.map differ diff --git a/priv/static/sw.js b/priv/static/sw.js index b462115f9..0fde0f440 100644 Binary files a/priv/static/sw.js and b/priv/static/sw.js differ diff --git a/restarter/lib/pleroma.ex b/restarter/lib/pleroma.ex index 7f08c637c..149a569ce 100644 --- a/restarter/lib/pleroma.ex +++ b/restarter/lib/pleroma.ex @@ -62,7 +62,7 @@ def handle_cast(:refresh, _state) do end def handle_cast({:restart, :test, _}, state) do - Logger.warn("pleroma restarted") + Logger.debug("pleroma manually restarted") {:noreply, Map.put(state, :need_reboot, false)} end @@ -75,7 +75,7 @@ def handle_cast({:restart, _, delay}, state) do def handle_cast({:after_boot, _}, %{after_boot: true} = state), do: {:noreply, state} def handle_cast({:after_boot, :test}, state) do - Logger.warn("pleroma restarted") + Logger.debug("pleroma restarted after boot") state = %{state | after_boot: true, rebooted: true} {:noreply, state} end diff --git a/test/activity/ir/topics_test.exs b/test/activity/ir/topics_test.exs index 44aec1e19..14a6e6b71 100644 --- a/test/activity/ir/topics_test.exs +++ b/test/activity/ir/topics_test.exs @@ -83,7 +83,7 @@ test "converts tags to hash tags", %{activity: %{object: %{data: data} = object} assert Enum.member?(topics, "hashtag:bar") end - test "only converts strinngs to hash tags", %{ + test "only converts strings to hash tags", %{ activity: %{object: %{data: data} = object} = activity } do tagged_data = Map.put(data, "tag", [2]) diff --git a/test/activity_test.exs b/test/activity_test.exs index 0c19f481b..2a92327d1 100644 --- a/test/activity_test.exs +++ b/test/activity_test.exs @@ -11,6 +11,11 @@ defmodule Pleroma.ActivityTest do alias Pleroma.ThreadMute import Pleroma.Factory + setup_all do + Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) + :ok + end + test "returns an activity by it's AP id" do activity = insert(:note_activity) found_activity = Activity.get_by_ap_id(activity.data["id"]) @@ -107,8 +112,6 @@ test "when association is not loaded" do describe "search" do setup do - Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) - user = insert(:user) params = %{ @@ -125,8 +128,8 @@ test "when association is not loaded" do "to" => ["https://www.w3.org/ns/activitystreams#Public"] } - {:ok, local_activity} = Pleroma.Web.CommonAPI.post(user, %{"status" => "find me!"}) - {:ok, japanese_activity} = Pleroma.Web.CommonAPI.post(user, %{"status" => "更新情報"}) + {:ok, local_activity} = Pleroma.Web.CommonAPI.post(user, %{status: "find me!"}) + {:ok, japanese_activity} = Pleroma.Web.CommonAPI.post(user, %{status: "更新情報"}) {:ok, job} = Pleroma.Web.Federator.incoming_ap_doc(params) {:ok, remote_activity} = ObanHelpers.perform(job) @@ -225,8 +228,8 @@ test "get_by_id/1" do test "all_by_actor_and_id/2" do user = insert(:user) - {:ok, %{id: id1}} = Pleroma.Web.CommonAPI.post(user, %{"status" => "cofe"}) - {:ok, %{id: id2}} = Pleroma.Web.CommonAPI.post(user, %{"status" => "cofefe"}) + {:ok, %{id: id1}} = Pleroma.Web.CommonAPI.post(user, %{status: "cofe"}) + {:ok, %{id: id2}} = Pleroma.Web.CommonAPI.post(user, %{status: "cofefe"}) assert [] == Activity.all_by_actor_and_id(user, []) diff --git a/test/bbs/handler_test.exs b/test/bbs/handler_test.exs index 74982547b..eb716486e 100644 --- a/test/bbs/handler_test.exs +++ b/test/bbs/handler_test.exs @@ -21,8 +21,8 @@ test "getting the home timeline" do {:ok, user} = User.follow(user, followed) - {:ok, _first} = CommonAPI.post(user, %{"status" => "hey"}) - {:ok, _second} = CommonAPI.post(followed, %{"status" => "hello"}) + {:ok, _first} = CommonAPI.post(user, %{status: "hey"}) + {:ok, _second} = CommonAPI.post(followed, %{status: "hello"}) output = capture_io(fn -> @@ -62,7 +62,7 @@ test "replying" do user = insert(:user) another_user = insert(:user) - {:ok, activity} = CommonAPI.post(another_user, %{"status" => "this is a test post"}) + {:ok, activity} = CommonAPI.post(another_user, %{status: "this is a test post"}) activity_object = Object.normalize(activity) output = diff --git a/test/bookmark_test.exs b/test/bookmark_test.exs index 021f79322..2726fe7cd 100644 --- a/test/bookmark_test.exs +++ b/test/bookmark_test.exs @@ -11,7 +11,7 @@ defmodule Pleroma.BookmarkTest do describe "create/2" do test "with valid params" do user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "Some cool information"}) + {:ok, activity} = CommonAPI.post(user, %{status: "Some cool information"}) {:ok, bookmark} = Bookmark.create(user.id, activity.id) assert bookmark.user_id == user.id assert bookmark.activity_id == activity.id @@ -32,7 +32,7 @@ test "with invalid params" do test "with valid params" do user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "Some cool information"}) + {:ok, activity} = CommonAPI.post(user, %{status: "Some cool information"}) {:ok, _bookmark} = Bookmark.create(user.id, activity.id) {:ok, _deleted_bookmark} = Bookmark.destroy(user.id, activity.id) @@ -45,7 +45,7 @@ test "gets a bookmark" do {:ok, activity} = CommonAPI.post(user, %{ - "status" => + status: "Scientists Discover The Secret Behind Tenshi Eating A Corndog Being So Cute – Science Daily" }) diff --git a/test/captcha_test.exs b/test/captcha_test.exs index ac1d846e8..1ab9019ab 100644 --- a/test/captcha_test.exs +++ b/test/captcha_test.exs @@ -61,7 +61,7 @@ test "new and validate" do assert is_binary(answer) assert :ok = Native.validate(token, answer, answer) - assert {:error, "Invalid CAPTCHA"} == Native.validate(token, answer, answer <> "foobar") + assert {:error, :invalid} == Native.validate(token, answer, answer <> "foobar") end end @@ -78,6 +78,7 @@ test "validate" do assert is_binary(answer) assert :ok = Captcha.validate(token, "63615261b77f5354fb8c4e4986477555", answer) + Cachex.del(:used_captcha_cache, token) end test "doesn't validate invalid answer" do @@ -92,7 +93,7 @@ test "doesn't validate invalid answer" do assert is_binary(answer) - assert {:error, "Invalid answer data"} = + assert {:error, :invalid_answer_data} = Captcha.validate(token, "63615261b77f5354fb8c4e4986477555", answer <> "foobar") end @@ -108,7 +109,7 @@ test "nil answer_data" do assert is_binary(answer) - assert {:error, "Invalid answer data"} = + assert {:error, :invalid_answer_data} = Captcha.validate(token, "63615261b77f5354fb8c4e4986477555", nil) end end diff --git a/test/config/config_db_test.exs b/test/config/config_db_test.exs index ac3dde681..336de7359 100644 --- a/test/config/config_db_test.exs +++ b/test/config/config_db_test.exs @@ -43,11 +43,9 @@ test "get_all_as_keyword/0" do {ConfigDB.from_string(saved.key), ConfigDB.from_binary(saved.value)} ] - assert config[:quack] == [ - level: :info, - meta: [:none], - webhook_url: "https://hooks.slack.com/services/KEY/some_val" - ] + assert config[:quack][:level] == :info + assert config[:quack][:meta] == [:none] + assert config[:quack][:webhook_url] == "https://hooks.slack.com/services/KEY/some_val" end describe "update_or_create/1" do diff --git a/test/config/transfer_task_test.exs b/test/config/transfer_task_test.exs index 0265a6156..473899d1d 100644 --- a/test/config/transfer_task_test.exs +++ b/test/config/transfer_task_test.exs @@ -16,6 +16,8 @@ test "transfer config values from db to env" do refute Application.get_env(:pleroma, :test_key) refute Application.get_env(:idna, :test_key) refute Application.get_env(:quack, :test_key) + refute Application.get_env(:postgrex, :test_key) + initial = Application.get_env(:logger, :level) ConfigDB.create(%{ group: ":pleroma", @@ -35,16 +37,28 @@ test "transfer config values from db to env" do value: [:test_value1, :test_value2] }) + ConfigDB.create(%{ + group: ":postgrex", + key: ":test_key", + value: :value + }) + + ConfigDB.create(%{group: ":logger", key: ":level", value: :debug}) + TransferTask.start_link([]) assert Application.get_env(:pleroma, :test_key) == [live: 2, com: 3] assert Application.get_env(:idna, :test_key) == [live: 15, com: 35] assert Application.get_env(:quack, :test_key) == [:test_value1, :test_value2] + assert Application.get_env(:logger, :level) == :debug + assert Application.get_env(:postgrex, :test_key) == :value on_exit(fn -> Application.delete_env(:pleroma, :test_key) Application.delete_env(:idna, :test_key) Application.delete_env(:quack, :test_key) + Application.delete_env(:postgrex, :test_key) + Application.put_env(:logger, :level, initial) end) end @@ -78,8 +92,8 @@ test "transfer config values for 1 group and some keys" do end test "transfer config values with full subkey update" do - emoji = Application.get_env(:pleroma, :emoji) - assets = Application.get_env(:pleroma, :assets) + clear_config(:emoji) + clear_config(:assets) ConfigDB.create(%{ group: ":pleroma", @@ -99,11 +113,6 @@ test "transfer config values with full subkey update" do assert emoji_env[:groups] == [a: 1, b: 2] assets_env = Application.get_env(:pleroma, :assets) assert assets_env[:mascots] == [a: 1, b: 2] - - on_exit(fn -> - Application.put_env(:pleroma, :emoji, emoji) - Application.put_env(:pleroma, :assets, assets) - end) end describe "pleroma restart" do @@ -112,8 +121,7 @@ test "transfer config values with full subkey update" do end test "don't restart if no reboot time settings were changed" do - emoji = Application.get_env(:pleroma, :emoji) - on_exit(fn -> Application.put_env(:pleroma, :emoji, emoji) end) + clear_config(:emoji) ConfigDB.create(%{ group: ":pleroma", @@ -128,8 +136,7 @@ test "don't restart if no reboot time settings were changed" do end test "on reboot time key" do - chat = Application.get_env(:pleroma, :chat) - on_exit(fn -> Application.put_env(:pleroma, :chat, chat) end) + clear_config(:chat) ConfigDB.create(%{ group: ":pleroma", @@ -141,8 +148,7 @@ test "on reboot time key" do end test "on reboot time subkey" do - captcha = Application.get_env(:pleroma, Pleroma.Captcha) - on_exit(fn -> Application.put_env(:pleroma, Pleroma.Captcha, captcha) end) + clear_config(Pleroma.Captcha) ConfigDB.create(%{ group: ":pleroma", @@ -154,13 +160,8 @@ test "on reboot time subkey" do end test "don't restart pleroma on reboot time key and subkey if there is false flag" do - chat = Application.get_env(:pleroma, :chat) - captcha = Application.get_env(:pleroma, Pleroma.Captcha) - - on_exit(fn -> - Application.put_env(:pleroma, :chat, chat) - Application.put_env(:pleroma, Pleroma.Captcha, captcha) - end) + clear_config(:chat) + clear_config(Pleroma.Captcha) ConfigDB.create(%{ group: ":pleroma", diff --git a/test/conversation/participation_test.exs b/test/conversation/participation_test.exs index 3536842e8..59a1b6492 100644 --- a/test/conversation/participation_test.exs +++ b/test/conversation/participation_test.exs @@ -16,7 +16,7 @@ test "getting a participation will also preload things" do other_user = insert(:user) {:ok, _activity} = - CommonAPI.post(user, %{"status" => "Hey @#{other_user.nickname}.", "visibility" => "direct"}) + CommonAPI.post(user, %{status: "Hey @#{other_user.nickname}.", visibility: "direct"}) [participation] = Participation.for_user(user) @@ -30,7 +30,7 @@ test "for a new conversation or a reply, it doesn't mark the author's participat other_user = insert(:user) {:ok, _} = - CommonAPI.post(user, %{"status" => "Hey @#{other_user.nickname}.", "visibility" => "direct"}) + CommonAPI.post(user, %{status: "Hey @#{other_user.nickname}.", visibility: "direct"}) user = User.get_cached_by_id(user.id) other_user = User.get_cached_by_id(other_user.id) @@ -43,9 +43,9 @@ test "for a new conversation or a reply, it doesn't mark the author's participat {:ok, _} = CommonAPI.post(other_user, %{ - "status" => "Hey @#{user.nickname}.", - "visibility" => "direct", - "in_reply_to_conversation_id" => participation.id + status: "Hey @#{user.nickname}.", + visibility: "direct", + in_reply_to_conversation_id: participation.id }) user = User.get_cached_by_id(user.id) @@ -64,7 +64,7 @@ test "for a new conversation, it sets the recipents of the participation" do third_user = insert(:user) {:ok, activity} = - CommonAPI.post(user, %{"status" => "Hey @#{other_user.nickname}.", "visibility" => "direct"}) + CommonAPI.post(user, %{status: "Hey @#{other_user.nickname}.", visibility: "direct"}) user = User.get_cached_by_id(user.id) other_user = User.get_cached_by_id(other_user.id) @@ -79,9 +79,9 @@ test "for a new conversation, it sets the recipents of the participation" do {:ok, _activity} = CommonAPI.post(user, %{ - "in_reply_to_status_id" => activity.id, - "status" => "Hey @#{third_user.nickname}.", - "visibility" => "direct" + in_reply_to_status_id: activity.id, + status: "Hey @#{third_user.nickname}.", + visibility: "direct" }) [participation] = Participation.for_user(user) @@ -154,14 +154,14 @@ test "it marks all the user's participations as read" do test "gets all the participations for a user, ordered by updated at descending" do user = insert(:user) - {:ok, activity_one} = CommonAPI.post(user, %{"status" => "x", "visibility" => "direct"}) - {:ok, activity_two} = CommonAPI.post(user, %{"status" => "x", "visibility" => "direct"}) + {:ok, activity_one} = CommonAPI.post(user, %{status: "x", visibility: "direct"}) + {:ok, activity_two} = CommonAPI.post(user, %{status: "x", visibility: "direct"}) {:ok, activity_three} = CommonAPI.post(user, %{ - "status" => "x", - "visibility" => "direct", - "in_reply_to_status_id" => activity_one.id + status: "x", + visibility: "direct", + in_reply_to_status_id: activity_one.id }) # Offset participations because the accuracy of updated_at is down to a second @@ -201,7 +201,7 @@ test "gets all the participations for a user, ordered by updated at descending" test "Doesn't die when the conversation gets empty" do user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => ".", "visibility" => "direct"}) + {:ok, activity} = CommonAPI.post(user, %{status: ".", visibility: "direct"}) [participation] = Participation.for_user_with_last_activity_id(user) assert participation.last_activity_id == activity.id @@ -215,7 +215,7 @@ test "it sets recipients, always keeping the owner of the participation even whe user = insert(:user) other_user = insert(:user) - {:ok, _activity} = CommonAPI.post(user, %{"status" => ".", "visibility" => "direct"}) + {:ok, _activity} = CommonAPI.post(user, %{status: ".", visibility: "direct"}) [participation] = Participation.for_user_with_last_activity_id(user) participation = Repo.preload(participation, :recipients) @@ -239,26 +239,26 @@ test "when the user blocks a recipient, the existing conversations with them are {:ok, _direct1} = CommonAPI.post(third_user, %{ - "status" => "Hi @#{blocker.nickname}", - "visibility" => "direct" + status: "Hi @#{blocker.nickname}", + visibility: "direct" }) {:ok, _direct2} = CommonAPI.post(third_user, %{ - "status" => "Hi @#{blocker.nickname}, @#{blocked.nickname}", - "visibility" => "direct" + status: "Hi @#{blocker.nickname}, @#{blocked.nickname}", + visibility: "direct" }) {:ok, _direct3} = CommonAPI.post(blocked, %{ - "status" => "Hi @#{blocker.nickname}", - "visibility" => "direct" + status: "Hi @#{blocker.nickname}", + visibility: "direct" }) {:ok, _direct4} = CommonAPI.post(blocked, %{ - "status" => "Hi @#{blocker.nickname}, @#{third_user.nickname}", - "visibility" => "direct" + status: "Hi @#{blocker.nickname}, @#{third_user.nickname}", + visibility: "direct" }) assert [%{read: false}, %{read: false}, %{read: false}, %{read: false}] = @@ -293,8 +293,8 @@ test "the new conversation with the blocked user is not marked as unread " do # When the blocked user is the author {:ok, _direct1} = CommonAPI.post(blocked, %{ - "status" => "Hi @#{blocker.nickname}", - "visibility" => "direct" + status: "Hi @#{blocker.nickname}", + visibility: "direct" }) assert [%{read: true}] = Participation.for_user(blocker) @@ -303,8 +303,8 @@ test "the new conversation with the blocked user is not marked as unread " do # When the blocked user is a recipient {:ok, _direct2} = CommonAPI.post(third_user, %{ - "status" => "Hi @#{blocker.nickname}, @#{blocked.nickname}", - "visibility" => "direct" + status: "Hi @#{blocker.nickname}, @#{blocked.nickname}", + visibility: "direct" }) assert [%{read: true}, %{read: true}] = Participation.for_user(blocker) @@ -321,8 +321,8 @@ test "the conversation with the blocked user is not marked as unread on a reply" {:ok, _direct1} = CommonAPI.post(blocker, %{ - "status" => "Hi @#{third_user.nickname}, @#{blocked.nickname}", - "visibility" => "direct" + status: "Hi @#{third_user.nickname}, @#{blocked.nickname}", + visibility: "direct" }) {:ok, _user_relationship} = User.block(blocker, blocked) @@ -334,9 +334,9 @@ test "the conversation with the blocked user is not marked as unread on a reply" # When it's a reply from the blocked user {:ok, _direct2} = CommonAPI.post(blocked, %{ - "status" => "reply", - "visibility" => "direct", - "in_reply_to_conversation_id" => blocked_participation.id + status: "reply", + visibility: "direct", + in_reply_to_conversation_id: blocked_participation.id }) assert [%{read: true}] = Participation.for_user(blocker) @@ -347,9 +347,9 @@ test "the conversation with the blocked user is not marked as unread on a reply" # When it's a reply from the third user {:ok, _direct3} = CommonAPI.post(third_user, %{ - "status" => "reply", - "visibility" => "direct", - "in_reply_to_conversation_id" => third_user_participation.id + status: "reply", + visibility: "direct", + in_reply_to_conversation_id: third_user_participation.id }) assert [%{read: true}] = Participation.for_user(blocker) diff --git a/test/conversation_test.exs b/test/conversation_test.exs index 056a0e920..359aa6840 100644 --- a/test/conversation_test.exs +++ b/test/conversation_test.exs @@ -18,7 +18,7 @@ test "it goes through old direct conversations" do other_user = insert(:user) {:ok, _activity} = - CommonAPI.post(user, %{"visibility" => "direct", "status" => "hey @#{other_user.nickname}"}) + CommonAPI.post(user, %{visibility: "direct", status: "hey @#{other_user.nickname}"}) Pleroma.Tests.ObanHelpers.perform_all() @@ -46,7 +46,7 @@ test "it creates a conversation for given ap_id" do test "public posts don't create conversations" do user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "Hey"}) + {:ok, activity} = CommonAPI.post(user, %{status: "Hey"}) object = Pleroma.Object.normalize(activity) context = object.data["context"] @@ -62,7 +62,7 @@ test "it creates or updates a conversation and participations for a given DM" do tridi = insert(:user) {:ok, activity} = - CommonAPI.post(har, %{"status" => "Hey @#{jafnhar.nickname}", "visibility" => "direct"}) + CommonAPI.post(har, %{status: "Hey @#{jafnhar.nickname}", visibility: "direct"}) object = Pleroma.Object.normalize(activity) context = object.data["context"] @@ -81,9 +81,9 @@ test "it creates or updates a conversation and participations for a given DM" do {:ok, activity} = CommonAPI.post(jafnhar, %{ - "status" => "Hey @#{har.nickname}", - "visibility" => "direct", - "in_reply_to_status_id" => activity.id + status: "Hey @#{har.nickname}", + visibility: "direct", + in_reply_to_status_id: activity.id }) object = Pleroma.Object.normalize(activity) @@ -105,9 +105,9 @@ test "it creates or updates a conversation and participations for a given DM" do {:ok, activity} = CommonAPI.post(tridi, %{ - "status" => "Hey @#{har.nickname}", - "visibility" => "direct", - "in_reply_to_status_id" => activity.id + status: "Hey @#{har.nickname}", + visibility: "direct", + in_reply_to_status_id: activity.id }) object = Pleroma.Object.normalize(activity) @@ -149,14 +149,14 @@ test "create_or_bump_for returns the conversation with participations" do jafnhar = insert(:user, local: false) {:ok, activity} = - CommonAPI.post(har, %{"status" => "Hey @#{jafnhar.nickname}", "visibility" => "direct"}) + CommonAPI.post(har, %{status: "Hey @#{jafnhar.nickname}", visibility: "direct"}) {:ok, conversation} = Conversation.create_or_bump_for(activity) assert length(conversation.participations) == 2 {:ok, activity} = - CommonAPI.post(har, %{"status" => "Hey @#{jafnhar.nickname}", "visibility" => "public"}) + CommonAPI.post(har, %{status: "Hey @#{jafnhar.nickname}", visibility: "public"}) assert {:error, _} = Conversation.create_or_bump_for(activity) end diff --git a/test/emoji/formatter_test.exs b/test/emoji/formatter_test.exs index 3bfee9420..12af6cd8b 100644 --- a/test/emoji/formatter_test.exs +++ b/test/emoji/formatter_test.exs @@ -3,7 +3,6 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Emoji.FormatterTest do - alias Pleroma.Emoji alias Pleroma.Emoji.Formatter use Pleroma.DataCase @@ -32,30 +31,19 @@ test "it does not add XSS emoji" do end end - describe "get_emoji" do + describe "get_emoji_map" do test "it returns the emoji used in the text" do - text = "I love :firefox:" - - assert Formatter.get_emoji(text) == [ - {"firefox", - %Emoji{ - code: "firefox", - file: "/emoji/Firefox.gif", - tags: ["Gif", "Fun"], - safe_code: "firefox", - safe_file: "/emoji/Firefox.gif" - }} - ] + assert Formatter.get_emoji_map("I love :firefox:") == %{ + "firefox" => "http://localhost:4001/emoji/Firefox.gif" + } end test "it returns a nice empty result when no emojis are present" do - text = "I love moominamma" - assert Formatter.get_emoji(text) == [] + assert Formatter.get_emoji_map("I love moominamma") == %{} end test "it doesn't die when text is absent" do - text = nil - assert Formatter.get_emoji(text) == [] + assert Formatter.get_emoji_map(nil) == %{} end end end diff --git a/test/filter_test.exs b/test/filter_test.exs index b2a8330ee..63a30c736 100644 --- a/test/filter_test.exs +++ b/test/filter_test.exs @@ -141,17 +141,15 @@ test "updating a filter" do context: ["home"] } - query_two = %Pleroma.Filter{ - user_id: user.id, - filter_id: 1, + changes = %{ phrase: "who", context: ["home", "timeline"] } {:ok, filter_one} = Pleroma.Filter.create(query_one) - {:ok, filter_two} = Pleroma.Filter.update(query_two) + {:ok, filter_two} = Pleroma.Filter.update(filter_one, changes) assert filter_one != filter_two - assert filter_two.phrase == query_two.phrase - assert filter_two.context == query_two.context + assert filter_two.phrase == changes.phrase + assert filter_two.context == changes.context end end diff --git a/test/fixtures/config/temp.secret.exs b/test/fixtures/config/temp.secret.exs index f4686c101..dc950ca30 100644 --- a/test/fixtures/config/temp.secret.exs +++ b/test/fixtures/config/temp.secret.exs @@ -7,3 +7,5 @@ config :quack, level: :info config :pleroma, Pleroma.Repo, pool: Ecto.Adapters.SQL.Sandbox + +config :postgrex, :json_library, Poison diff --git a/test/fixtures/emoji/packs/blank.png.zip b/test/fixtures/emoji/packs/blank.png.zip new file mode 100644 index 000000000..651daf127 Binary files /dev/null and b/test/fixtures/emoji/packs/blank.png.zip differ diff --git a/test/fixtures/emoji/packs/default-manifest.json b/test/fixtures/emoji/packs/default-manifest.json new file mode 100644 index 000000000..c8433808d --- /dev/null +++ b/test/fixtures/emoji/packs/default-manifest.json @@ -0,0 +1,10 @@ +{ + "finmoji": { + "license": "CC BY-NC-ND 4.0", + "homepage": "https://finland.fi/emoji/", + "description": "Finland is the first country in the world to publish its own set of country themed emojis. The Finland emoji collection contains 56 tongue-in-cheek emotions, which were created to explain some hard-to-describe Finnish emotions, Finnish words and customs.", + "src": "https://finland.fi/wp-content/uploads/2017/06/finland-emojis.zip", + "src_sha256": "384025A1AC6314473863A11AC7AB38A12C01B851A3F82359B89B4D4211D3291D", + "files": "finmoji.json" + } +} \ No newline at end of file diff --git a/test/fixtures/emoji/packs/finmoji.json b/test/fixtures/emoji/packs/finmoji.json new file mode 100644 index 000000000..279770998 --- /dev/null +++ b/test/fixtures/emoji/packs/finmoji.json @@ -0,0 +1,3 @@ +{ + "blank": "blank.png" +} \ No newline at end of file diff --git a/test/fixtures/emoji/packs/manifest.json b/test/fixtures/emoji/packs/manifest.json new file mode 100644 index 000000000..2d51a459b --- /dev/null +++ b/test/fixtures/emoji/packs/manifest.json @@ -0,0 +1,10 @@ +{ + "blobs.gg": { + "src_sha256": "3a12f3a181678d5b3584a62095411b0d60a335118135910d879920f8ade5a57f", + "src": "https://git.pleroma.social/pleroma/emoji-index/raw/master/packs/blobs_gg.zip", + "license": "Apache 2.0", + "homepage": "https://blobs.gg", + "files": "blobs_gg.json", + "description": "Blob Emoji from blobs.gg repacked as apng" + } +} \ No newline at end of file diff --git a/test/fixtures/kroeg-announce-with-inline-actor.json b/test/fixtures/kroeg-announce-with-inline-actor.json index 7bd6e8199..f73f93410 100644 --- a/test/fixtures/kroeg-announce-with-inline-actor.json +++ b/test/fixtures/kroeg-announce-with-inline-actor.json @@ -1 +1,88 @@ -{"@context":["https://www.w3.org/ns/activitystreams","https://puckipedia.com/-/context"],"actor":{"endpoints":"https://puckipedia.com/#endpoints","followers":"https://puckipedia.com/followers","following":"https://puckipedia.com/following","icon":{"mediaType":"image/png","type":"Image","url":"https://puckipedia.com/images/avatar.png"},"id":"https://puckipedia.com/","inbox":"https://puckipedia.com/inbox","kroeg:blocks":{"id":"https://puckipedia.com/blocks"},"liked":"https://puckipedia.com/liked","manuallyApprovesFollowers":false,"name":"HACKER TEEN PUCKIPEDIA 👩‍💻","outbox":"https://puckipedia.com/outbox","preferredUsername":"puckipedia","publicKey":{"id":"https://puckipedia.com/#key","owner":"https://puckipedia.com/","publicKeyPem":"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvN05xIcFE0Qgany7Rht4\n0ZI5wu++IT7K5iSqRimBYkpoeHbVcT9RFlW+aWH/QJJW/YgZ7+LMr8AMCrKrwSpS\nCndyrpx4O4lZ3FNRLu7tbklh01rGZfE6R1SFfYBpvMvImc9nYT6iezYDbv6NkHku\no3aVhjql216XlA0OhIrqQme9sAdrLbjbMrTUS8douCTkDOX+JFj1ghHCqdYEMZJI\nOY9kovtgnqyxFLm0RsPGsO1+g/OVojqG+VqHz6O2lceaTVQLlnZ4gOhLVG1tVsA2\nRfXQK+R/VgXncYE+BlQVd/tcdGAz7CDL7PP3rP65gmARnafhGR96cCOi/KzlAXSO\nMwIDAQAB\n-----END PUBLIC KEY-----","type":[]},"summary":"

federated hacker teen
\n[she/they]

","type":"Person","updated":"2017-12-19T16:56:29.7576707+00:00"},"cc":"http://mastodon.example.org/users/admin","id":"https://puckipedia.com/cc56a9658e","object":{"as:sensitive":false,"attributedTo":{"endpoints":{"sharedInbox":"https://mastodon.social/inbox","type":[]},"followers":"http://mastodon.example.org/users/admin/followers","following":"http://mastodon.example.org/users/admin/following","icon":{"mediaType":"image/png","type":"Image","url":"https://files.mastodon.social/accounts/avatars/000/015/163/original/70ca6c52b01ca913.png"},"id":"http://mastodon.example.org/users/admin","inbox":"http://mastodon.example.org/users/admin/inbox","manuallyApprovesFollowers":{"@value":"False","type":"xsd:boolean"},"name":"","outbox":"http://mastodon.example.org/users/admin/outbox","preferredUsername":"revenant","publicKey":{"id":"http://mastodon.example.org/users/admin#main-key","owner":"http://mastodon.example.org/users/admin","publicKeyPem":"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0gEN3wPW7gkE2gQqnmfB\n1ychjmFIf2LIwY0oCJLiGE/xpZrUKoq+eWH30AP7mATw4LD0gOYABL/ijqPUrPqR\nDXLL+0CqMP8HsZKvRlj9KArMK3YtNiSGGj2U7iReiRrD7nJzjJlsjjJXflLZhZ7/\nenSv1CcaeK8tB0PoAgShy/MyfhPF7WI5/Zm9DmmDQFvUEnDYKXAf/vG/IWw1EyMC\nkbaEYJeIowQU3GsbPxzRGI22bQtfotm431Ch2MbNo+kyzmYVFLAVoSGNMzvJwOPg\nTxLIIBeQXG7MinRyK887yPKhxhcALea4yCcALaa+3jPE7yqwIKYwTHtSlblsHDAo\nmQIDAQAB\n-----END PUBLIC KEY-----\n","type":[]},"summary":"

neatly partitioned meats and cheeses appeal to me on an aesthetic level | any pronouns | revenant1.net

","type":"Person","url":"https://mastodon.social/@revenant"},"cc":"http://mastodon.example.org/users/admin/followers","content":"

the name's jond (jeans bond)

","contentMap":{"en":"

the name's jond (jeans bond)

"},"conversation":"tag:mastodon.social,2018-09-25:objectId=55659382:objectType=Conversation","id":"http://mastodon.example.org/users/admin/statuses/100787282858396771","ostatus:atomUri":"http://mastodon.example.org/users/admin/statuses/100787282858396771","published":"2018-09-25T16:11:29Z","to":"https://www.w3.org/ns/activitystreams#Public","type":"Note","url":"https://mastodon.social/@revenant/100787282858396771"},"to":["https://www.w3.org/ns/activitystreams#Public","https://puckipedia.com/followers"],"type":"Announce"} +{ + "@context" : [ + "https://www.w3.org/ns/activitystreams", + "https://puckipedia.com/-/context" + ], + "actor" : { + "endpoints" : "https://puckipedia.com/#endpoints", + "followers" : "https://puckipedia.com/followers", + "following" : "https://puckipedia.com/following", + "icon" : { + "mediaType" : "image/png", + "type" : "Image", + "url" : "https://puckipedia.com/images/avatar.png" + }, + "id" : "https://puckipedia.com/", + "inbox" : "https://puckipedia.com/inbox", + "kroeg:blocks" : { + "id" : "https://puckipedia.com/blocks" + }, + "liked" : "https://puckipedia.com/liked", + "manuallyApprovesFollowers" : false, + "name" : "HACKER TEEN PUCKIPEDIA 👩‍💻", + "outbox" : "https://puckipedia.com/outbox", + "preferredUsername" : "puckipedia", + "publicKey" : { + "id" : "https://puckipedia.com/#key", + "owner" : "https://puckipedia.com/", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvN05xIcFE0Qgany7Rht4\n0ZI5wu++IT7K5iSqRimBYkpoeHbVcT9RFlW+aWH/QJJW/YgZ7+LMr8AMCrKrwSpS\nCndyrpx4O4lZ3FNRLu7tbklh01rGZfE6R1SFfYBpvMvImc9nYT6iezYDbv6NkHku\no3aVhjql216XlA0OhIrqQme9sAdrLbjbMrTUS8douCTkDOX+JFj1ghHCqdYEMZJI\nOY9kovtgnqyxFLm0RsPGsO1+g/OVojqG+VqHz6O2lceaTVQLlnZ4gOhLVG1tVsA2\nRfXQK+R/VgXncYE+BlQVd/tcdGAz7CDL7PP3rP65gmARnafhGR96cCOi/KzlAXSO\nMwIDAQAB\n-----END PUBLIC KEY-----", + "type" : [] + }, + "summary" : "

federated hacker teen
\n[she/they]

", + "type" : "Person", + "updated" : "2017-12-19T16:56:29.7576707+00:00" + }, + "cc" : "http://mastodon.example.org/users/admin", + "id" : "https://puckipedia.com/cc56a9658e", + "object" : { + "as:sensitive" : false, + "attributedTo" : { + "endpoints" : { + "sharedInbox" : "https://mastodon.social/inbox", + "type" : [] + }, + "followers" : "http://mastodon.example.org/users/admin/followers", + "following" : "http://mastodon.example.org/users/admin/following", + "icon" : { + "mediaType" : "image/png", + "type" : "Image", + "url" : "https://files.mastodon.social/accounts/avatars/000/015/163/original/70ca6c52b01ca913.png" + }, + "id" : "http://mastodon.example.org/users/admin", + "inbox" : "http://mastodon.example.org/users/admin/inbox", + "manuallyApprovesFollowers" : { + "@value" : "False", + "type" : "xsd:boolean" + }, + "name" : "", + "outbox" : "http://mastodon.example.org/users/admin/outbox", + "preferredUsername" : "revenant", + "publicKey" : { + "id" : "http://mastodon.example.org/users/admin#main-key", + "owner" : "http://mastodon.example.org/users/admin", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0gEN3wPW7gkE2gQqnmfB\n1ychjmFIf2LIwY0oCJLiGE/xpZrUKoq+eWH30AP7mATw4LD0gOYABL/ijqPUrPqR\nDXLL+0CqMP8HsZKvRlj9KArMK3YtNiSGGj2U7iReiRrD7nJzjJlsjjJXflLZhZ7/\nenSv1CcaeK8tB0PoAgShy/MyfhPF7WI5/Zm9DmmDQFvUEnDYKXAf/vG/IWw1EyMC\nkbaEYJeIowQU3GsbPxzRGI22bQtfotm431Ch2MbNo+kyzmYVFLAVoSGNMzvJwOPg\nTxLIIBeQXG7MinRyK887yPKhxhcALea4yCcALaa+3jPE7yqwIKYwTHtSlblsHDAo\nmQIDAQAB\n-----END PUBLIC KEY-----\n", + "type" : [] + }, + "summary" : "

neatly partitioned meats and cheeses appeal to me on an aesthetic level | any pronouns | revenant1.net

", + "type" : "Person", + "url" : "https://mastodon.social/@revenant" + }, + "cc" : "http://mastodon.example.org/users/admin/followers", + "content" : "

the name's jond (jeans bond)

", + "contentMap" : { + "en" : "

the name's jond (jeans bond)

" + }, + "conversation" : "tag:mastodon.social,2018-09-25:objectId=55659382:objectType=Conversation", + "id" : "http://mastodon.example.org/users/admin/statuses/100787282858396771", + "ostatus:atomUri" : "http://mastodon.example.org/users/admin/statuses/100787282858396771", + "published" : "2018-09-25T16:11:29Z", + "to" : "https://www.w3.org/ns/activitystreams#Public", + "type" : "Note", + "url" : "https://mastodon.social/@revenant/100787282858396771" + }, + "to" : [ + "https://www.w3.org/ns/activitystreams#Public", + "https://puckipedia.com/followers" + ], + "type" : "Announce" +} diff --git a/test/fixtures/mastodon-note-object.json b/test/fixtures/mastodon-note-object.json index 75bed9625..d28c7fbe9 100644 --- a/test/fixtures/mastodon-note-object.json +++ b/test/fixtures/mastodon-note-object.json @@ -1,9 +1,45 @@ -{"@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"}],"id":"http://mastodon.example.org/users/admin/statuses/99541947525187367","type":"Note","summary":null,"content":"\u003cp\u003eyeah.\u003c/p\u003e","inReplyTo":null,"published":"2018-02-17T17:46:20Z","url":"http://mastodon.example.org/@admin/99541947525187367","attributedTo":"http://mastodon.example.org/users/admin","to":["https://www.w3.org/ns/activitystreams#Public"],"cc":["http://mastodon.example.org/users/admin/followers"],"sensitive":false,"atomUri":"http://mastodon.example.org/users/admin/statuses/99541947525187367","inReplyToAtomUri":null,"conversation":"tag:mastodon.example.org,2018-02-17:objectId=59:objectType=Conversation","tag":[], - "attachment": [ +{ + "@context" : [ + "https://www.w3.org/ns/activitystreams", + "https://w3id.org/security/v1", { - "url": "http://mastodon.example.org/system/media_attachments/files/000/000/002/original/334ce029e7bfb920.jpg", - "type": "Document", - "name": null, - "mediaType": "image/jpeg" + "Emoji" : "toot:Emoji", + "Hashtag" : "as:Hashtag", + "atomUri" : "ostatus:atomUri", + "conversation" : "ostatus:conversation", + "inReplyToAtomUri" : "ostatus:inReplyToAtomUri", + "manuallyApprovesFollowers" : "as:manuallyApprovesFollowers", + "movedTo" : "as:movedTo", + "ostatus" : "http://ostatus.org#", + "sensitive" : "as:sensitive", + "toot" : "http://joinmastodon.org/ns#" } - ]} + ], + "atomUri" : "http://mastodon.example.org/users/admin/statuses/99541947525187367", + "attachment" : [ + { + "mediaType" : "image/jpeg", + "name" : null, + "type" : "Document", + "url" : "http://mastodon.example.org/system/media_attachments/files/000/000/002/original/334ce029e7bfb920.jpg" + } + ], + "attributedTo" : "http://mastodon.example.org/users/admin", + "cc" : [ + "http://mastodon.example.org/users/admin/followers" + ], + "content" : "

yeah.

", + "conversation" : "tag:mastodon.example.org,2018-02-17:objectId=59:objectType=Conversation", + "id" : "http://mastodon.example.org/users/admin/statuses/99541947525187367", + "inReplyTo" : null, + "inReplyToAtomUri" : null, + "published" : "2018-02-17T17:46:20Z", + "sensitive" : false, + "summary" : null, + "tag" : [], + "to" : [ + "https://www.w3.org/ns/activitystreams#Public" + ], + "type" : "Note", + "url" : "http://mastodon.example.org/@admin/99541947525187367" +} diff --git a/test/fixtures/tesla_mock/craigmaloney.json b/test/fixtures/tesla_mock/craigmaloney.json new file mode 100644 index 000000000..56ea9c7c3 --- /dev/null +++ b/test/fixtures/tesla_mock/craigmaloney.json @@ -0,0 +1,112 @@ +{ + "@context": [ + "https://www.w3.org/ns/activitystreams", + "https://w3id.org/security/v1", + { + "CacheFile": "pt:CacheFile", + "Hashtag": "as:Hashtag", + "Infohash": "pt:Infohash", + "RsaSignature2017": "https://w3id.org/security#RsaSignature2017", + "category": "sc:category", + "commentsEnabled": { + "@id": "pt:commentsEnabled", + "@type": "sc:Boolean" + }, + "downloadEnabled": { + "@id": "pt:downloadEnabled", + "@type": "sc:Boolean" + }, + "expires": "sc:expires", + "fps": { + "@id": "pt:fps", + "@type": "sc:Number" + }, + "language": "sc:inLanguage", + "licence": "sc:license", + "originallyPublishedAt": "sc:datePublished", + "position": { + "@id": "pt:position", + "@type": "sc:Number" + }, + "pt": "https://joinpeertube.org/ns#", + "sc": "http://schema.org#", + "sensitive": "as:sensitive", + "size": { + "@id": "pt:size", + "@type": "sc:Number" + }, + "startTimestamp": { + "@id": "pt:startTimestamp", + "@type": "sc:Number" + }, + "state": { + "@id": "pt:state", + "@type": "sc:Number" + }, + "stopTimestamp": { + "@id": "pt:stopTimestamp", + "@type": "sc:Number" + }, + "subtitleLanguage": "sc:subtitleLanguage", + "support": { + "@id": "pt:support", + "@type": "sc:Text" + }, + "uuid": "sc:identifier", + "views": { + "@id": "pt:views", + "@type": "sc:Number" + }, + "waitTranscoding": { + "@id": "pt:waitTranscoding", + "@type": "sc:Boolean" + } + }, + { + "comments": { + "@id": "as:comments", + "@type": "@id" + }, + "dislikes": { + "@id": "as:dislikes", + "@type": "@id" + }, + "likes": { + "@id": "as:likes", + "@type": "@id" + }, + "playlists": { + "@id": "pt:playlists", + "@type": "@id" + }, + "shares": { + "@id": "as:shares", + "@type": "@id" + } + } + ], + "endpoints": { + "sharedInbox": "https://peertube.social/inbox" + }, + "followers": "https://peertube.social/accounts/craigmaloney/followers", + "following": "https://peertube.social/accounts/craigmaloney/following", + "icon": { + "mediaType": "image/png", + "type": "Image", + "url": "https://peertube.social/lazy-static/avatars/87bd694b-95bc-4066-83f4-bddfcd2b9caa.png" + }, + "id": "https://peertube.social/accounts/craigmaloney", + "inbox": "https://peertube.social/accounts/craigmaloney/inbox", + "name": "Craig Maloney", + "outbox": "https://peertube.social/accounts/craigmaloney/outbox", + "playlists": "https://peertube.social/accounts/craigmaloney/playlists", + "preferredUsername": "craigmaloney", + "publicKey": { + "id": "https://peertube.social/accounts/craigmaloney#main-key", + "owner": "https://peertube.social/accounts/craigmaloney", + "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9qvGIYUW01yc8CCsrwxK\n5OXlV5s7EbNWY8tJr/p1oGuELZwAnG2XKxtdbvgcCT+YxL5uRXIdCFIIIKrzRFr/\nHfS0mOgNT9u3gu+SstCNgtatciT0RVP77yiC3b2NHq1NRRvvVhzQb4cpIWObIxqh\nb2ypDClTc7XaKtgmQCbwZlGyZMT+EKz/vustD6BlpGsglRkm7iES6s1PPGb1BU+n\nS94KhbS2DOFiLcXCVWt0QarokIIuKznp4+xP1axKyP+SkT5AHx08Nd5TYFb2C1Jl\nz0WD/1q0mAN62m7QrA3SQPUgB+wWD+S3Nzf7FwNPiP4srbBgxVEUnji/r9mQ6BXC\nrQIDAQAB\n-----END PUBLIC KEY-----" + }, + "summary": null, + "type": "Person", + "url": "https://peertube.social/accounts/craigmaloney" +} diff --git a/test/fixtures/tesla_mock/funkwhale_audio.json b/test/fixtures/tesla_mock/funkwhale_audio.json new file mode 100644 index 000000000..15736b1f8 --- /dev/null +++ b/test/fixtures/tesla_mock/funkwhale_audio.json @@ -0,0 +1,44 @@ +{ + "id": "https://channels.tests.funkwhale.audio/federation/music/uploads/42342395-0208-4fee-a38d-259a6dae0871", + "type": "Audio", + "name": "Compositions - Test Audio for Pleroma", + "attributedTo": "https://channels.tests.funkwhale.audio/federation/actors/compositions", + "published": "2020-03-11T10:01:52.714918+00:00", + "to": "https://www.w3.org/ns/activitystreams#Public", + "url": [ + { + "type": "Link", + "mimeType": "audio/ogg", + "href": "https://channels.tests.funkwhale.audio/api/v1/listen/3901e5d8-0445-49d5-9711-e096cf32e515/?upload=42342395-0208-4fee-a38d-259a6dae0871&download=false" + }, + { + "type": "Link", + "mimeType": "text/html", + "href": "https://channels.tests.funkwhale.audio/library/tracks/74" + } + ], + "content": "

This is a test Audio for Pleroma.

", + "mediaType": "text/html", + "tag": [ + { + "type": "Hashtag", + "name": "#funkwhale" + }, + { + "type": "Hashtag", + "name": "#test" + }, + { + "type": "Hashtag", + "name": "#tests" + } + ], + "summary": "#funkwhale #test #tests", + "@context": [ + "https://www.w3.org/ns/activitystreams", + "https://w3id.org/security/v1", + { + "manuallyApprovesFollowers": "as:manuallyApprovesFollowers" + } + ] +} diff --git a/test/fixtures/tesla_mock/funkwhale_channel.json b/test/fixtures/tesla_mock/funkwhale_channel.json new file mode 100644 index 000000000..cf9ee8151 --- /dev/null +++ b/test/fixtures/tesla_mock/funkwhale_channel.json @@ -0,0 +1,44 @@ +{ + "id": "https://channels.tests.funkwhale.audio/federation/actors/compositions", + "outbox": "https://channels.tests.funkwhale.audio/federation/actors/compositions/outbox", + "inbox": "https://channels.tests.funkwhale.audio/federation/actors/compositions/inbox", + "preferredUsername": "compositions", + "type": "Person", + "name": "Compositions", + "followers": "https://channels.tests.funkwhale.audio/federation/actors/compositions/followers", + "following": "https://channels.tests.funkwhale.audio/federation/actors/compositions/following", + "manuallyApprovesFollowers": false, + "url": [ + { + "type": "Link", + "href": "https://channels.tests.funkwhale.audio/channels/compositions", + "mediaType": "text/html" + }, + { + "type": "Link", + "href": "https://channels.tests.funkwhale.audio/api/v1/channels/compositions/rss", + "mediaType": "application/rss+xml" + } + ], + "icon": { + "type": "Image", + "url": "https://channels.tests.funkwhale.audio/media/attachments/75/b4/f1/nosmile.jpeg", + "mediaType": "image/jpeg" + }, + "summary": "

I'm testing federation with the fediverse :)

", + "@context": [ + "https://www.w3.org/ns/activitystreams", + "https://w3id.org/security/v1", + { + "manuallyApprovesFollowers": "as:manuallyApprovesFollowers" + } + ], + "publicKey": { + "owner": "https://channels.tests.funkwhale.audio/federation/actors/compositions", + "publicKeyPem": "-----BEGIN RSA PUBLIC KEY-----\nMIIBCgKCAQEAv25u57oZfVLV3KltS+HcsdSx9Op4MmzIes1J8Wu8s0KbdXf2zEwS\nsVqyHgs/XCbnzsR3FqyJTo46D2BVnvZcuU5srNcR2I2HMaqQ0oVdnATE4K6KdcgV\nN+98pMWo56B8LTgE1VpvqbsrXLi9jCTzjrkebVMOP+ZVu+64v1qdgddseblYMnBZ\nct0s7ONbHnqrWlTGf5wES1uIZTVdn5r4MduZG+Uenfi1opBS0lUUxfWdW9r0oF2b\nyneZUyaUCbEroeKbqsweXCWVgnMarUOsgqC42KM4cf95lySSwTSaUtZYIbTw7s9W\n2jveU/rVg8BYZu5JK5obgBoxtlUeUoSswwIDAQAB\n-----END RSA PUBLIC KEY-----\n", + "id": "https://channels.tests.funkwhale.audio/federation/actors/compositions#main-key" + }, + "endpoints": { + "sharedInbox": "https://channels.tests.funkwhale.audio/federation/shared/inbox" + } +} diff --git a/test/fixtures/tesla_mock/peertube-social.json b/test/fixtures/tesla_mock/peertube-social.json new file mode 100644 index 000000000..0e996ba35 --- /dev/null +++ b/test/fixtures/tesla_mock/peertube-social.json @@ -0,0 +1,234 @@ +{ + "@context": [ + "https://www.w3.org/ns/activitystreams", + "https://w3id.org/security/v1", + { + "CacheFile": "pt:CacheFile", + "Hashtag": "as:Hashtag", + "Infohash": "pt:Infohash", + "RsaSignature2017": "https://w3id.org/security#RsaSignature2017", + "category": "sc:category", + "commentsEnabled": { + "@id": "pt:commentsEnabled", + "@type": "sc:Boolean" + }, + "downloadEnabled": { + "@id": "pt:downloadEnabled", + "@type": "sc:Boolean" + }, + "expires": "sc:expires", + "fps": { + "@id": "pt:fps", + "@type": "sc:Number" + }, + "language": "sc:inLanguage", + "licence": "sc:license", + "originallyPublishedAt": "sc:datePublished", + "position": { + "@id": "pt:position", + "@type": "sc:Number" + }, + "pt": "https://joinpeertube.org/ns#", + "sc": "http://schema.org#", + "sensitive": "as:sensitive", + "size": { + "@id": "pt:size", + "@type": "sc:Number" + }, + "startTimestamp": { + "@id": "pt:startTimestamp", + "@type": "sc:Number" + }, + "state": { + "@id": "pt:state", + "@type": "sc:Number" + }, + "stopTimestamp": { + "@id": "pt:stopTimestamp", + "@type": "sc:Number" + }, + "subtitleLanguage": "sc:subtitleLanguage", + "support": { + "@id": "pt:support", + "@type": "sc:Text" + }, + "uuid": "sc:identifier", + "views": { + "@id": "pt:views", + "@type": "sc:Number" + }, + "waitTranscoding": { + "@id": "pt:waitTranscoding", + "@type": "sc:Boolean" + } + }, + { + "comments": { + "@id": "as:comments", + "@type": "@id" + }, + "dislikes": { + "@id": "as:dislikes", + "@type": "@id" + }, + "likes": { + "@id": "as:likes", + "@type": "@id" + }, + "playlists": { + "@id": "pt:playlists", + "@type": "@id" + }, + "shares": { + "@id": "as:shares", + "@type": "@id" + } + } + ], + "attributedTo": [ + { + "id": "https://peertube.social/accounts/craigmaloney", + "type": "Person" + }, + { + "id": "https://peertube.social/video-channels/9909c7d9-6b5b-4aae-9164-c1af7229c91c", + "type": "Group" + } + ], + "category": { + "identifier": "15", + "name": "Science & Technology" + }, + "cc": [ + "https://peertube.social/accounts/craigmaloney/followers" + ], + "comments": "https://peertube.social/videos/watch/278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe/comments", + "commentsEnabled": true, + "content": "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...", + "dislikes": "https://peertube.social/videos/watch/278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe/dislikes", + "downloadEnabled": true, + "duration": "PT5151S", + "icon": { + "height": 122, + "mediaType": "image/jpeg", + "type": "Image", + "url": "https://peertube.social/static/thumbnails/278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe.jpg", + "width": 223 + }, + "id": "https://peertube.social/videos/watch/278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe", + "language": { + "identifier": "en", + "name": "English" + }, + "licence": { + "identifier": "1", + "name": "Attribution" + }, + "likes": "https://peertube.social/videos/watch/278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe/likes", + "mediaType": "text/markdown", + "name": "Twenty Years in Jail: FreeBSD's Jails, Then and Now", + "originallyPublishedAt": "2019-08-13T00:00:00.000Z", + "published": "2020-02-12T01:06:08.054Z", + "sensitive": false, + "shares": "https://peertube.social/videos/watch/278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe/announces", + "state": 1, + "subtitleLanguage": [], + "support": "Learn more at http://mug.org", + "tag": [ + { + "name": "linux", + "type": "Hashtag" + }, + { + "name": "mug.org", + "type": "Hashtag" + }, + { + "name": "open", + "type": "Hashtag" + }, + { + "name": "oss", + "type": "Hashtag" + }, + { + "name": "source", + "type": "Hashtag" + } + ], + "to": [ + "https://www.w3.org/ns/activitystreams#Public" + ], + "type": "Video", + "updated": "2020-02-15T15:01:09.474Z", + "url": [ + { + "href": "https://peertube.social/videos/watch/278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe", + "mediaType": "text/html", + "type": "Link" + }, + { + "fps": 30, + "height": 240, + "href": "https://peertube.social/static/webseed/278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe-240.mp4", + "mediaType": "video/mp4", + "size": 119465800, + "type": "Link" + }, + { + "height": 240, + "href": "https://peertube.social/static/torrents/278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe-240.torrent", + "mediaType": "application/x-bittorrent", + "type": "Link" + }, + { + "height": 240, + "href": "magnet:?xs=https%3A%2F%2Fpeertube.social%2Fstatic%2Ftorrents%2F278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe-240.torrent&xt=urn:btih:b3365331a8543bf48d09add56d7fe4b1cbbb5659&dn=Twenty+Years+in+Jail%3A+FreeBSD's+Jails%2C+Then+and+Now&tr=wss%3A%2F%2Fpeertube.social%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fpeertube.social%2Ftracker%2Fannounce&ws=https%3A%2F%2Fpeertube.social%2Fstatic%2Fwebseed%2F278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe-240.mp4", + "mediaType": "application/x-bittorrent;x-scheme-handler/magnet", + "type": "Link" + }, + { + "fps": 30, + "height": 360, + "href": "https://peertube.social/static/webseed/278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe-360.mp4", + "mediaType": "video/mp4", + "size": 143930318, + "type": "Link" + }, + { + "height": 360, + "href": "https://peertube.social/static/torrents/278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe-360.torrent", + "mediaType": "application/x-bittorrent", + "type": "Link" + }, + { + "height": 360, + "href": "magnet:?xs=https%3A%2F%2Fpeertube.social%2Fstatic%2Ftorrents%2F278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe-360.torrent&xt=urn:btih:0d37b23c98cb0d89e28b5dc8f49b3c97a041e569&dn=Twenty+Years+in+Jail%3A+FreeBSD's+Jails%2C+Then+and+Now&tr=wss%3A%2F%2Fpeertube.social%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fpeertube.social%2Ftracker%2Fannounce&ws=https%3A%2F%2Fpeertube.social%2Fstatic%2Fwebseed%2F278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe-360.mp4", + "mediaType": "application/x-bittorrent;x-scheme-handler/magnet", + "type": "Link" + }, + { + "fps": 30, + "height": 480, + "href": "https://peertube.social/static/webseed/278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe-480.mp4", + "mediaType": "video/mp4", + "size": 130530754, + "type": "Link" + }, + { + "height": 480, + "href": "https://peertube.social/static/torrents/278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe-480.torrent", + "mediaType": "application/x-bittorrent", + "type": "Link" + }, + { + "height": 480, + "href": "magnet:?xs=https%3A%2F%2Fpeertube.social%2Fstatic%2Ftorrents%2F278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe-480.torrent&xt=urn:btih:3a13ff822ad9494165eff6167183ddaaabc1372a&dn=Twenty+Years+in+Jail%3A+FreeBSD's+Jails%2C+Then+and+Now&tr=wss%3A%2F%2Fpeertube.social%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fpeertube.social%2Ftracker%2Fannounce&ws=https%3A%2F%2Fpeertube.social%2Fstatic%2Fwebseed%2F278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe-480.mp4", + "mediaType": "application/x-bittorrent;x-scheme-handler/magnet", + "type": "Link" + } + ], + "uuid": "278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe", + "views": 2, + "waitTranscoding": false +} diff --git a/test/fixtures/users_mock/localhost.json b/test/fixtures/users_mock/localhost.json new file mode 100644 index 000000000..a49935db1 --- /dev/null +++ b/test/fixtures/users_mock/localhost.json @@ -0,0 +1,41 @@ +{ + "@context": [ + "https://www.w3.org/ns/activitystreams", + "http://localhost:4001/schemas/litepub-0.1.jsonld", + { + "@language": "und" + } + ], + "attachment": [], + "endpoints": { + "oauthAuthorizationEndpoint": "http://localhost:4001/oauth/authorize", + "oauthRegistrationEndpoint": "http://localhost:4001/api/v1/apps", + "oauthTokenEndpoint": "http://localhost:4001/oauth/token", + "sharedInbox": "http://localhost:4001/inbox" + }, + "followers": "http://localhost:4001/users/{{nickname}}/followers", + "following": "http://localhost:4001/users/{{nickname}}/following", + "icon": { + "type": "Image", + "url": "http://localhost:4001/media/4e914f5b84e4a259a3f6c2d2edc9ab642f2ab05f3e3d9c52c81fc2d984b3d51e.jpg" + }, + "id": "http://localhost:4001/users/{{nickname}}", + "image": { + "type": "Image", + "url": "http://localhost:4001/media/f739efddefeee49c6e67e947c4811fdc911785c16ae43da4c3684051fbf8da6a.jpg?name=f739efddefeee49c6e67e947c4811fdc911785c16ae43da4c3684051fbf8da6a.jpg" + }, + "inbox": "http://localhost:4001/users/{{nickname}}/inbox", + "manuallyApprovesFollowers": false, + "name": "{{nickname}}", + "outbox": "http://localhost:4001/users/{{nickname}}/outbox", + "preferredUsername": "{{nickname}}", + "publicKey": { + "id": "http://localhost:4001/users/{{nickname}}#main-key", + "owner": "http://localhost:4001/users/{{nickname}}", + "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5DLtwGXNZElJyxFGfcVc\nXANhaMadj/iYYQwZjOJTV9QsbtiNBeIK54PJrYuU0/0YIdrvS1iqheX5IwXRhcwa\nhm3ZyLz7XeN9st7FBni4BmZMBtMpxAuYuu5p/jbWy13qAiYOhPreCx0wrWgm/lBD\n9mkgaxIxPooBE0S4ZWEJIDIV1Vft3AWcRUyWW1vIBK0uZzs6GYshbQZB952S0yo4\nFzI1hABGHncH8UvuFauh4EZ8tY7/X5I0pGRnDOcRN1dAht5w5yTA+6r5kebiFQjP\nIzN/eCO/a9Flrj9YGW7HDNtjSOH0A31PLRGlJtJO3yK57dnf5ppyCZGfL4emShQo\ncQIDAQAB\n-----END PUBLIC KEY-----\n\n" + }, + "summary": "your friendly neighborhood pleroma developer
I like cute things and distributed systems, and really hate delete and redrafts", + "tag": [], + "type": "Person", + "url": "http://localhost:4001/users/{{nickname}}" +} \ No newline at end of file diff --git a/test/fixtures/warnings/otp_version/21.1 b/test/fixtures/warnings/otp_version/21.1 new file mode 100644 index 000000000..90cd64c4f --- /dev/null +++ b/test/fixtures/warnings/otp_version/21.1 @@ -0,0 +1 @@ +21.1 \ No newline at end of file diff --git a/test/fixtures/warnings/otp_version/22.1 b/test/fixtures/warnings/otp_version/22.1 new file mode 100644 index 000000000..d9b314368 --- /dev/null +++ b/test/fixtures/warnings/otp_version/22.1 @@ -0,0 +1 @@ +22.1 \ No newline at end of file diff --git a/test/fixtures/warnings/otp_version/22.4 b/test/fixtures/warnings/otp_version/22.4 new file mode 100644 index 000000000..1da8ccd28 --- /dev/null +++ b/test/fixtures/warnings/otp_version/22.4 @@ -0,0 +1 @@ +22.4 \ No newline at end of file diff --git a/test/fixtures/warnings/otp_version/23.0 b/test/fixtures/warnings/otp_version/23.0 new file mode 100644 index 000000000..4266d8634 --- /dev/null +++ b/test/fixtures/warnings/otp_version/23.0 @@ -0,0 +1 @@ +23.0 \ No newline at end of file diff --git a/test/following_relationship_test.exs b/test/following_relationship_test.exs index 865bb3838..17a468abb 100644 --- a/test/following_relationship_test.exs +++ b/test/following_relationship_test.exs @@ -15,28 +15,28 @@ defmodule Pleroma.FollowingRelationshipTest do test "returns following addresses without internal.fetch" do user = insert(:user) fetch_actor = InternalFetchActor.get_actor() - FollowingRelationship.follow(fetch_actor, user, "accept") + FollowingRelationship.follow(fetch_actor, user, :follow_accept) assert FollowingRelationship.following(fetch_actor) == [user.follower_address] end test "returns following addresses without relay" do user = insert(:user) relay_actor = Relay.get_actor() - FollowingRelationship.follow(relay_actor, user, "accept") + FollowingRelationship.follow(relay_actor, user, :follow_accept) assert FollowingRelationship.following(relay_actor) == [user.follower_address] end test "returns following addresses without remote user" do user = insert(:user) actor = insert(:user, local: false) - FollowingRelationship.follow(actor, user, "accept") + FollowingRelationship.follow(actor, user, :follow_accept) assert FollowingRelationship.following(actor) == [user.follower_address] end test "returns following addresses with local user" do user = insert(:user) actor = insert(:user, local: true) - FollowingRelationship.follow(actor, user, "accept") + FollowingRelationship.follow(actor, user, :follow_accept) assert FollowingRelationship.following(actor) == [ actor.follower_address, diff --git a/test/formatter_test.exs b/test/formatter_test.exs index cf8441cf6..bef5a2c28 100644 --- a/test/formatter_test.exs +++ b/test/formatter_test.exs @@ -140,7 +140,7 @@ test "gives a replacement for user links, using local nicknames in user links te archaeme = insert(:user, nickname: "archa_eme_", - source_data: %{"url" => "https://archeme/@archa_eme_"} + uri: "https://archeme/@archa_eme_" ) archaeme_remote = insert(:user, %{nickname: "archaeme@archae.me"}) @@ -150,13 +150,13 @@ test "gives a replacement for user links, using local nicknames in user links te assert length(mentions) == 3 expected_text = - ~s(@gsimg According to @gsimg According to @archa_eme_, that is @daggsy. Also hello @archa_eme_, that is @daggsy. Also hello @archaeme) + }" href="#{archaeme_remote.ap_id}" rel="ugc">@archaeme) assert expected_text == text end @@ -171,7 +171,7 @@ test "gives a replacement for user links when the user is using Osada" do assert length(mentions) == 1 expected_text = - ~s(@mike test) @@ -187,7 +187,7 @@ test "gives a replacement for single-character local nicknames" do assert length(mentions) == 1 expected_text = - ~s(@o hi) + ~s(@o hi) assert expected_text == text end @@ -209,17 +209,13 @@ test "given the 'safe_mention' option, it will only mention people in the beginn assert mentions == [{"@#{user.nickname}", user}, {"@#{other_user.nickname}", other_user}] assert expected_text == - ~s(@#{user.nickname} @#{user.nickname} @#{ - other_user.nickname - } hey dudes i hate @#{other_user.nickname} hey dudes i hate @#{ - third_user.nickname - }) + }" href="#{third_user.ap_id}" rel="ugc">@#{third_user.nickname}) end test "given the 'safe_mention' option, it will still work without any mention" do diff --git a/test/html_test.exs b/test/html_test.exs index a006fd492..0a4b4ebbc 100644 --- a/test/html_test.exs +++ b/test/html_test.exs @@ -171,7 +171,7 @@ test "extracts the url" do {:ok, activity} = CommonAPI.post(user, %{ - "status" => + status: "I think I just found the best github repo https://github.com/komeiji-satori/Dress" }) @@ -186,7 +186,7 @@ test "skips mentions" do {:ok, activity} = CommonAPI.post(user, %{ - "status" => + status: "@#{other_user.nickname} install misskey! https://github.com/syuilo/misskey/blob/develop/docs/setup.en.md" }) @@ -203,8 +203,7 @@ test "skips hashtags" do {:ok, activity} = CommonAPI.post(user, %{ - "status" => - "#cofe https://www.pixiv.net/member_illust.php?mode=medium&illust_id=72255140" + status: "#cofe https://www.pixiv.net/member_illust.php?mode=medium&illust_id=72255140" }) object = Object.normalize(activity) @@ -218,9 +217,9 @@ test "skips microformats hashtags" do {:ok, activity} = CommonAPI.post(user, %{ - "status" => + status: "#cofe https://www.pixiv.net/member_illust.php?mode=medium&illust_id=72255140", - "content_type" => "text/html" + content_type: "text/html" }) object = Object.normalize(activity) @@ -232,8 +231,7 @@ test "skips microformats hashtags" do test "does not crash when there is an HTML entity in a link" do user = insert(:user) - {:ok, activity} = - CommonAPI.post(user, %{"status" => "\"http://cofe.com/?boomer=ok&foo=bar\""}) + {:ok, activity} = CommonAPI.post(user, %{status: "\"http://cofe.com/?boomer=ok&foo=bar\""}) object = Object.normalize(activity) diff --git a/test/http/adapter_helper/gun_test.exs b/test/http/adapter_helper/gun_test.exs new file mode 100644 index 000000000..2e961826e --- /dev/null +++ b/test/http/adapter_helper/gun_test.exs @@ -0,0 +1,258 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.HTTP.AdapterHelper.GunTest do + use ExUnit.Case, async: true + use Pleroma.Tests.Helpers + + import Mox + + alias Pleroma.Config + alias Pleroma.Gun.Conn + alias Pleroma.HTTP.AdapterHelper.Gun + alias Pleroma.Pool.Connections + + setup :verify_on_exit! + + defp gun_mock(_) do + gun_mock() + :ok + end + + defp gun_mock do + Pleroma.GunMock + |> stub(:open, fn _, _, _ -> Task.start_link(fn -> Process.sleep(1000) end) end) + |> stub(:await_up, fn _, _ -> {:ok, :http} end) + |> stub(:set_owner, fn _, _ -> :ok end) + end + + describe "options/1" do + setup do: clear_config([:http, :adapter], a: 1, b: 2) + + test "https url with default port" do + uri = URI.parse("https://example.com") + + opts = Gun.options([receive_conn: false], uri) + assert opts[:certificates_verification] + assert opts[:tls_opts][:log_level] == :warning + end + + test "https ipv4 with default port" do + uri = URI.parse("https://127.0.0.1") + + opts = Gun.options([receive_conn: false], uri) + assert opts[:certificates_verification] + assert opts[:tls_opts][:log_level] == :warning + end + + test "https ipv6 with default port" do + uri = URI.parse("https://[2a03:2880:f10c:83:face:b00c:0:25de]") + + opts = Gun.options([receive_conn: false], uri) + assert opts[:certificates_verification] + assert opts[:tls_opts][:log_level] == :warning + end + + test "https url with non standart port" do + uri = URI.parse("https://example.com:115") + + opts = Gun.options([receive_conn: false], uri) + + assert opts[:certificates_verification] + end + + test "get conn on next request" do + gun_mock() + level = Application.get_env(:logger, :level) + Logger.configure(level: :debug) + on_exit(fn -> Logger.configure(level: level) end) + uri = URI.parse("http://some-domain2.com") + + opts = Gun.options(uri) + + assert opts[:conn] == nil + assert opts[:close_conn] == nil + + Process.sleep(50) + opts = Gun.options(uri) + + assert is_pid(opts[:conn]) + assert opts[:close_conn] == false + end + + test "merges with defaul http adapter config" do + defaults = Gun.options([receive_conn: false], URI.parse("https://example.com")) + assert Keyword.has_key?(defaults, :a) + assert Keyword.has_key?(defaults, :b) + end + + test "default ssl adapter opts with connection" do + gun_mock() + uri = URI.parse("https://some-domain.com") + + :ok = Conn.open(uri, :gun_connections) + + opts = Gun.options(uri) + + assert opts[:certificates_verification] + refute opts[:tls_opts] == [] + + assert opts[:close_conn] == false + assert is_pid(opts[:conn]) + end + + test "parses string proxy host & port" do + proxy = Config.get([:http, :proxy_url]) + Config.put([:http, :proxy_url], "localhost:8123") + on_exit(fn -> Config.put([:http, :proxy_url], proxy) end) + + uri = URI.parse("https://some-domain.com") + opts = Gun.options([receive_conn: false], uri) + assert opts[:proxy] == {'localhost', 8123} + end + + test "parses tuple proxy scheme host and port" do + proxy = Config.get([:http, :proxy_url]) + Config.put([:http, :proxy_url], {:socks, 'localhost', 1234}) + on_exit(fn -> Config.put([:http, :proxy_url], proxy) end) + + uri = URI.parse("https://some-domain.com") + opts = Gun.options([receive_conn: false], uri) + assert opts[:proxy] == {:socks, 'localhost', 1234} + end + + test "passed opts have more weight than defaults" do + proxy = Config.get([:http, :proxy_url]) + Config.put([:http, :proxy_url], {:socks5, 'localhost', 1234}) + on_exit(fn -> Config.put([:http, :proxy_url], proxy) end) + uri = URI.parse("https://some-domain.com") + opts = Gun.options([receive_conn: false, proxy: {'example.com', 4321}], uri) + + assert opts[:proxy] == {'example.com', 4321} + end + end + + describe "options/1 with receive_conn parameter" do + setup :gun_mock + + test "receive conn by default" do + uri = URI.parse("http://another-domain.com") + :ok = Conn.open(uri, :gun_connections) + + received_opts = Gun.options(uri) + assert received_opts[:close_conn] == false + assert is_pid(received_opts[:conn]) + end + + test "don't receive conn if receive_conn is false" do + uri = URI.parse("http://another-domain.com") + :ok = Conn.open(uri, :gun_connections) + + opts = [receive_conn: false] + received_opts = Gun.options(opts, uri) + assert received_opts[:close_conn] == nil + assert received_opts[:conn] == nil + end + end + + describe "after_request/1" do + setup :gun_mock + + test "body_as not chunks" do + uri = URI.parse("http://some-domain.com") + :ok = Conn.open(uri, :gun_connections) + opts = Gun.options(uri) + :ok = Gun.after_request(opts) + conn = opts[:conn] + + assert %Connections{ + conns: %{ + "http:some-domain.com:80" => %Pleroma.Gun.Conn{ + conn: ^conn, + conn_state: :idle, + used_by: [] + } + } + } = Connections.get_state(:gun_connections) + end + + test "body_as chunks" do + uri = URI.parse("http://some-domain.com") + :ok = Conn.open(uri, :gun_connections) + opts = Gun.options([body_as: :chunks], uri) + :ok = Gun.after_request(opts) + conn = opts[:conn] + self = self() + + assert %Connections{ + conns: %{ + "http:some-domain.com:80" => %Pleroma.Gun.Conn{ + conn: ^conn, + conn_state: :active, + used_by: [{^self, _}] + } + } + } = Connections.get_state(:gun_connections) + end + + test "with no connection" do + uri = URI.parse("http://uniq-domain.com") + + :ok = Conn.open(uri, :gun_connections) + + opts = Gun.options([body_as: :chunks], uri) + conn = opts[:conn] + opts = Keyword.delete(opts, :conn) + self = self() + + :ok = Gun.after_request(opts) + + assert %Connections{ + conns: %{ + "http:uniq-domain.com:80" => %Pleroma.Gun.Conn{ + conn: ^conn, + conn_state: :active, + used_by: [{^self, _}] + } + } + } = Connections.get_state(:gun_connections) + end + + test "with ipv4" do + uri = URI.parse("http://127.0.0.1") + :ok = Conn.open(uri, :gun_connections) + opts = Gun.options(uri) + :ok = Gun.after_request(opts) + conn = opts[:conn] + + assert %Connections{ + conns: %{ + "http:127.0.0.1:80" => %Pleroma.Gun.Conn{ + conn: ^conn, + conn_state: :idle, + used_by: [] + } + } + } = Connections.get_state(:gun_connections) + end + + test "with ipv6" do + uri = URI.parse("http://[2a03:2880:f10c:83:face:b00c:0:25de]") + :ok = Conn.open(uri, :gun_connections) + opts = Gun.options(uri) + :ok = Gun.after_request(opts) + conn = opts[:conn] + + assert %Connections{ + conns: %{ + "http:2a03:2880:f10c:83:face:b00c:0:25de:80" => %Pleroma.Gun.Conn{ + conn: ^conn, + conn_state: :idle, + used_by: [] + } + } + } = Connections.get_state(:gun_connections) + end + end +end diff --git a/test/http/adapter_helper/hackney_test.exs b/test/http/adapter_helper/hackney_test.exs new file mode 100644 index 000000000..f2361ff0b --- /dev/null +++ b/test/http/adapter_helper/hackney_test.exs @@ -0,0 +1,35 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.HTTP.AdapterHelper.HackneyTest do + use ExUnit.Case, async: true + use Pleroma.Tests.Helpers + + alias Pleroma.HTTP.AdapterHelper.Hackney + + setup_all do + uri = URI.parse("http://domain.com") + {:ok, uri: uri} + end + + describe "options/2" do + setup do: clear_config([:http, :adapter], a: 1, b: 2) + + test "add proxy and opts from config", %{uri: uri} do + opts = Hackney.options([proxy: "localhost:8123"], uri) + + assert opts[:a] == 1 + assert opts[:b] == 2 + assert opts[:proxy] == "localhost:8123" + end + + test "respect connection opts and no proxy", %{uri: uri} do + opts = Hackney.options([a: 2, b: 1], uri) + + assert opts[:a] == 2 + assert opts[:b] == 1 + refute Keyword.has_key?(opts, :proxy) + end + end +end diff --git a/test/http/adapter_helper_test.exs b/test/http/adapter_helper_test.exs new file mode 100644 index 000000000..24d501ad5 --- /dev/null +++ b/test/http/adapter_helper_test.exs @@ -0,0 +1,28 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.HTTP.AdapterHelperTest do + use ExUnit.Case, async: true + + alias Pleroma.HTTP.AdapterHelper + + describe "format_proxy/1" do + test "with nil" do + assert AdapterHelper.format_proxy(nil) == nil + end + + test "with string" do + assert AdapterHelper.format_proxy("127.0.0.1:8123") == {{127, 0, 0, 1}, 8123} + end + + test "localhost with port" do + assert AdapterHelper.format_proxy("localhost:8123") == {'localhost', 8123} + end + + test "tuple" do + assert AdapterHelper.format_proxy({:socks4, :localhost, 9050}) == + {:socks4, 'localhost', 9050} + end + end +end diff --git a/test/http/connection_test.exs b/test/http/connection_test.exs new file mode 100644 index 000000000..7c94a50b2 --- /dev/null +++ b/test/http/connection_test.exs @@ -0,0 +1,135 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.HTTP.ConnectionTest do + use ExUnit.Case + use Pleroma.Tests.Helpers + + import ExUnit.CaptureLog + + alias Pleroma.Config + alias Pleroma.HTTP.Connection + + describe "parse_host/1" do + test "as atom to charlist" do + assert Connection.parse_host(:localhost) == 'localhost' + end + + test "as string to charlist" do + assert Connection.parse_host("localhost.com") == 'localhost.com' + end + + test "as string ip to tuple" do + assert Connection.parse_host("127.0.0.1") == {127, 0, 0, 1} + end + end + + describe "parse_proxy/1" do + test "ip with port" do + assert Connection.parse_proxy("127.0.0.1:8123") == {:ok, {127, 0, 0, 1}, 8123} + end + + test "host with port" do + assert Connection.parse_proxy("localhost:8123") == {:ok, 'localhost', 8123} + end + + test "as tuple" do + assert Connection.parse_proxy({:socks4, :localhost, 9050}) == + {:ok, :socks4, 'localhost', 9050} + end + + test "as tuple with string host" do + assert Connection.parse_proxy({:socks5, "localhost", 9050}) == + {:ok, :socks5, 'localhost', 9050} + end + end + + describe "parse_proxy/1 errors" do + test "ip without port" do + capture_log(fn -> + assert Connection.parse_proxy("127.0.0.1") == {:error, :invalid_proxy} + end) =~ "parsing proxy fail \"127.0.0.1\"" + end + + test "host without port" do + capture_log(fn -> + assert Connection.parse_proxy("localhost") == {:error, :invalid_proxy} + end) =~ "parsing proxy fail \"localhost\"" + end + + test "host with bad port" do + capture_log(fn -> + assert Connection.parse_proxy("localhost:port") == {:error, :invalid_proxy_port} + end) =~ "parsing port in proxy fail \"localhost:port\"" + end + + test "ip with bad port" do + capture_log(fn -> + assert Connection.parse_proxy("127.0.0.1:15.9") == {:error, :invalid_proxy_port} + end) =~ "parsing port in proxy fail \"127.0.0.1:15.9\"" + end + + test "as tuple without port" do + capture_log(fn -> + assert Connection.parse_proxy({:socks5, :localhost}) == {:error, :invalid_proxy} + end) =~ "parsing proxy fail {:socks5, :localhost}" + end + + test "with nil" do + assert Connection.parse_proxy(nil) == nil + end + end + + describe "options/3" do + setup do: clear_config([:http, :proxy_url]) + + test "without proxy_url in config" do + Config.delete([:http, :proxy_url]) + + opts = Connection.options(%URI{}) + refute Keyword.has_key?(opts, :proxy) + end + + test "parses string proxy host & port" do + Config.put([:http, :proxy_url], "localhost:8123") + + opts = Connection.options(%URI{}) + assert opts[:proxy] == {'localhost', 8123} + end + + test "parses tuple proxy scheme host and port" do + Config.put([:http, :proxy_url], {:socks, 'localhost', 1234}) + + opts = Connection.options(%URI{}) + assert opts[:proxy] == {:socks, 'localhost', 1234} + end + + test "passed opts have more weight than defaults" do + Config.put([:http, :proxy_url], {:socks5, 'localhost', 1234}) + + opts = Connection.options(%URI{}, proxy: {'example.com', 4321}) + + assert opts[:proxy] == {'example.com', 4321} + end + end + + describe "format_host/1" do + test "with domain" do + assert Connection.format_host("example.com") == 'example.com' + end + + test "with idna domain" do + assert Connection.format_host("ですexample.com") == 'xn--example-183fne.com' + end + + test "with ipv4" do + assert Connection.format_host("127.0.0.1") == '127.0.0.1' + end + + test "with ipv6" do + assert Connection.format_host("2a03:2880:f10c:83:face:b00c:0:25de") == + '2a03:2880:f10c:83:face:b00c:0:25de' + end + end +end diff --git a/test/http/request_builder_test.exs b/test/http/request_builder_test.exs index bf3a15ebe..fab909905 100644 --- a/test/http/request_builder_test.exs +++ b/test/http/request_builder_test.exs @@ -3,57 +3,38 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.HTTP.RequestBuilderTest do - use ExUnit.Case, async: true + use ExUnit.Case use Pleroma.Tests.Helpers + alias Pleroma.HTTP.Request alias Pleroma.HTTP.RequestBuilder describe "headers/2" do - setup do: clear_config([:http, :send_user_agent]) - setup do: clear_config([:http, :user_agent]) - test "don't send pleroma user agent" do - assert RequestBuilder.headers(%{}, []) == %{headers: []} + assert RequestBuilder.headers(%Request{}, []) == %Request{headers: []} end test "send pleroma user agent" do - Pleroma.Config.put([:http, :send_user_agent], true) - Pleroma.Config.put([:http, :user_agent], :default) + clear_config([:http, :send_user_agent], true) + clear_config([:http, :user_agent], :default) - assert RequestBuilder.headers(%{}, []) == %{ - headers: [{"User-Agent", Pleroma.Application.user_agent()}] + assert RequestBuilder.headers(%Request{}, []) == %Request{ + headers: [{"user-agent", Pleroma.Application.user_agent()}] } end test "send custom user agent" do - Pleroma.Config.put([:http, :send_user_agent], true) - Pleroma.Config.put([:http, :user_agent], "totally-not-pleroma") + clear_config([:http, :send_user_agent], true) + clear_config([:http, :user_agent], "totally-not-pleroma") - assert RequestBuilder.headers(%{}, []) == %{ - headers: [{"User-Agent", "totally-not-pleroma"}] + assert RequestBuilder.headers(%Request{}, []) == %Request{ + headers: [{"user-agent", "totally-not-pleroma"}] } end end - describe "add_optional_params/3" do - test "don't add if keyword is empty" do - assert RequestBuilder.add_optional_params(%{}, %{}, []) == %{} - end - - test "add query parameter" do - assert RequestBuilder.add_optional_params( - %{}, - %{query: :query, body: :body, another: :val}, - [ - {:query, "param1=val1¶m2=val2"}, - {:body, "some body"} - ] - ) == %{query: "param1=val1¶m2=val2", body: "some body"} - end - end - describe "add_param/4" do test "add file parameter" do - %{ + %Request{ body: %Tesla.Multipart{ boundary: _, content_type_params: [], @@ -70,7 +51,7 @@ test "add file parameter" do } ] } - } = RequestBuilder.add_param(%{}, :file, "filename.png", "some-path/filename.png") + } = RequestBuilder.add_param(%Request{}, :file, "filename.png", "some-path/filename.png") end test "add key to body" do @@ -82,7 +63,7 @@ test "add key to body" do %Tesla.Multipart.Part{ body: "\"someval\"", dispositions: [name: "somekey"], - headers: ["Content-Type": "application/json"] + headers: [{"content-type", "application/json"}] } ] } diff --git a/test/http_test.exs b/test/http_test.exs index 3edb0de36..618485b55 100644 --- a/test/http_test.exs +++ b/test/http_test.exs @@ -3,8 +3,10 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.HTTPTest do - use Pleroma.DataCase + use ExUnit.Case, async: true + use Pleroma.Tests.Helpers import Tesla.Mock + alias Pleroma.HTTP setup do mock(fn @@ -27,7 +29,7 @@ defmodule Pleroma.HTTPTest do describe "get/1" do test "returns successfully result" do - assert Pleroma.HTTP.get("http://example.com/hello") == { + assert HTTP.get("http://example.com/hello") == { :ok, %Tesla.Env{status: 200, body: "hello"} } @@ -36,7 +38,7 @@ test "returns successfully result" do describe "get/2 (with headers)" do test "returns successfully result for json content-type" do - assert Pleroma.HTTP.get("http://example.com/hello", [{"content-type", "application/json"}]) == + assert HTTP.get("http://example.com/hello", [{"content-type", "application/json"}]) == { :ok, %Tesla.Env{ @@ -50,7 +52,7 @@ test "returns successfully result for json content-type" do describe "post/2" do test "returns successfully result" do - assert Pleroma.HTTP.post("http://example.com/world", "") == { + assert HTTP.post("http://example.com/world", "") == { :ok, %Tesla.Env{status: 200, body: "world"} } diff --git a/test/instance_static/add/shortcode.png b/test/instance_static/add/shortcode.png new file mode 100644 index 000000000..8f50fa023 Binary files /dev/null and b/test/instance_static/add/shortcode.png differ diff --git a/test/instance_static/emoji/pack_bad_sha/blank.png b/test/instance_static/emoji/pack_bad_sha/blank.png new file mode 100644 index 000000000..8f50fa023 Binary files /dev/null and b/test/instance_static/emoji/pack_bad_sha/blank.png differ diff --git a/test/instance_static/emoji/pack_bad_sha/pack.json b/test/instance_static/emoji/pack_bad_sha/pack.json new file mode 100644 index 000000000..35caf4298 --- /dev/null +++ b/test/instance_static/emoji/pack_bad_sha/pack.json @@ -0,0 +1,13 @@ +{ + "pack": { + "license": "Test license", + "homepage": "https://pleroma.social", + "description": "Test description", + "can-download": true, + "share-files": true, + "download-sha256": "57482F30674FD3DE821FF48C81C00DA4D4AF1F300209253684ABA7075E5FC238" + }, + "files": { + "blank": "blank.png" + } +} \ No newline at end of file diff --git a/test/instance_static/emoji/pack_bad_sha/pack_bad_sha.zip b/test/instance_static/emoji/pack_bad_sha/pack_bad_sha.zip new file mode 100644 index 000000000..148446c64 Binary files /dev/null and b/test/instance_static/emoji/pack_bad_sha/pack_bad_sha.zip differ diff --git a/test/instance_static/emoji/test_pack/pack.json b/test/instance_static/emoji/test_pack/pack.json index 5a8ee75f9..481891b08 100644 --- a/test/instance_static/emoji/test_pack/pack.json +++ b/test/instance_static/emoji/test_pack/pack.json @@ -1,13 +1,11 @@ { - "pack": { - "license": "Test license", - "homepage": "https://pleroma.social", - "description": "Test description", - - "share-files": true - }, - "files": { "blank": "blank.png" + }, + "pack": { + "description": "Test description", + "homepage": "https://pleroma.social", + "license": "Test license", + "share-files": true } -} +} \ No newline at end of file diff --git a/test/instance_static/emoji/test_pack_nonshared/pack.json b/test/instance_static/emoji/test_pack_nonshared/pack.json index b96781f81..93d643a5f 100644 --- a/test/instance_static/emoji/test_pack_nonshared/pack.json +++ b/test/instance_static/emoji/test_pack_nonshared/pack.json @@ -3,14 +3,11 @@ "license": "Test license", "homepage": "https://pleroma.social", "description": "Test description", - "fallback-src": "https://nonshared-pack", "fallback-src-sha256": "74409E2674DAA06C072729C6C8426C4CB3B7E0B85ED77792DB7A436E11D76DAF", - "share-files": false }, - "files": { "blank": "blank.png" } -} +} \ No newline at end of file diff --git a/test/instance_static/local_pack/files.json b/test/instance_static/local_pack/files.json new file mode 100644 index 000000000..279770998 --- /dev/null +++ b/test/instance_static/local_pack/files.json @@ -0,0 +1,3 @@ +{ + "blank": "blank.png" +} \ No newline at end of file diff --git a/test/instance_static/local_pack/manifest.json b/test/instance_static/local_pack/manifest.json new file mode 100644 index 000000000..01067042f --- /dev/null +++ b/test/instance_static/local_pack/manifest.json @@ -0,0 +1,10 @@ +{ + "local": { + "src_sha256": "384025A1AC6314473863A11AC7AB38A12C01B851A3F82359B89B4D4211D3291D", + "src": "test/fixtures/emoji/packs/blank.png.zip", + "license": "Apache 2.0", + "homepage": "https://example.com", + "files": "files.json", + "description": "Some local pack" + } +} \ No newline at end of file diff --git a/test/integration/mastodon_websocket_test.exs b/test/integration/mastodon_websocket_test.exs index bd229c55f..ea17e9feb 100644 --- a/test/integration/mastodon_websocket_test.exs +++ b/test/integration/mastodon_websocket_test.exs @@ -12,17 +12,14 @@ defmodule Pleroma.Integration.MastodonWebsocketTest do alias Pleroma.Web.CommonAPI alias Pleroma.Web.OAuth + @moduletag needs_streamer: true, capture_log: true + @path Pleroma.Web.Endpoint.url() |> URI.parse() |> Map.put(:scheme, "ws") |> Map.put(:path, "/api/v1/streaming") |> URI.to_string() - setup_all do - start_supervised(Pleroma.Web.Streamer.supervisor()) - :ok - end - def start_socket(qs \\ nil, headers \\ []) do path = case qs do @@ -35,7 +32,7 @@ def start_socket(qs \\ nil, headers \\ []) do test "refuses invalid requests" do capture_log(fn -> - assert {:error, {400, _}} = start_socket() + assert {:error, {404, _}} = start_socket() assert {:error, {404, _}} = start_socket("?stream=ncjdk") Process.sleep(30) end) @@ -43,8 +40,8 @@ test "refuses invalid requests" do test "requires authentication and a valid token for protected streams" do capture_log(fn -> - assert {:error, {403, _}} = start_socket("?stream=user&access_token=aaaaaaaaaaaa") - assert {:error, {403, _}} = start_socket("?stream=user") + assert {:error, {401, _}} = start_socket("?stream=user&access_token=aaaaaaaaaaaa") + assert {:error, {401, _}} = start_socket("?stream=user") Process.sleep(30) end) end @@ -58,7 +55,7 @@ test "allows public streams without authentication" do test "receives well formatted events" do user = insert(:user) {:ok, _} = start_socket("?stream=public") - {:ok, activity} = CommonAPI.post(user, %{"status" => "nice echo chamber"}) + {:ok, activity} = CommonAPI.post(user, %{status: "nice echo chamber"}) assert_receive {:text, raw_json}, 1_000 assert {:ok, json} = Jason.decode(raw_json) @@ -103,7 +100,7 @@ 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, {403, "Forbidden"}} = start_socket("?stream=user") + assert {:error, {401, _}} = start_socket("?stream=user") Process.sleep(30) end) =~ ":badarg" end @@ -112,7 +109,7 @@ 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, {403, "Forbidden"}} = start_socket("?stream=user:notification") + assert {:error, {401, _}} = start_socket("?stream=user:notification") Process.sleep(30) end) =~ ":badarg" end @@ -121,7 +118,7 @@ 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, {403, "Forbidden"}} = + assert {:error, {401, _}} = start_socket("?stream=user", [{"Sec-WebSocket-Protocol", "I am a friend"}]) Process.sleep(30) diff --git a/test/marker_test.exs b/test/marker_test.exs index c80ae16b6..5b6d0b4a4 100644 --- a/test/marker_test.exs +++ b/test/marker_test.exs @@ -8,12 +8,39 @@ defmodule Pleroma.MarkerTest do import Pleroma.Factory + describe "multi_set_unread_count/3" do + test "returns multi" do + user = insert(:user) + + assert %Ecto.Multi{ + operations: [marker: {:run, _}, counters: {:run, _}] + } = + Marker.multi_set_last_read_id( + Ecto.Multi.new(), + user, + "notifications" + ) + end + + test "return empty multi" do + user = insert(:user) + multi = Ecto.Multi.new() + assert Marker.multi_set_last_read_id(multi, user, "home") == multi + end + end + describe "get_markers/2" do test "returns user markers" do user = insert(:user) marker = insert(:marker, user: user) + insert(:notification, user: user) + insert(:notification, user: user) insert(:marker, timeline: "home", user: user) - assert Marker.get_markers(user, ["notifications"]) == [refresh_record(marker)] + + assert Marker.get_markers( + user, + ["notifications"] + ) == [%Marker{refresh_record(marker) | unread_count: 2}] end end diff --git a/test/mfa/backup_codes_test.exs b/test/mfa/backup_codes_test.exs new file mode 100644 index 000000000..7bc01b36b --- /dev/null +++ b/test/mfa/backup_codes_test.exs @@ -0,0 +1,11 @@ +defmodule Pleroma.MFA.BackupCodesTest do + use Pleroma.DataCase + + alias Pleroma.MFA.BackupCodes + + test "generate backup codes" do + codes = BackupCodes.generate(number_of_codes: 2, length: 4) + + assert [<<_::bytes-size(4)>>, <<_::bytes-size(4)>>] = codes + end +end diff --git a/test/mfa/totp_test.exs b/test/mfa/totp_test.exs new file mode 100644 index 000000000..50153d208 --- /dev/null +++ b/test/mfa/totp_test.exs @@ -0,0 +1,17 @@ +defmodule Pleroma.MFA.TOTPTest do + use Pleroma.DataCase + + alias Pleroma.MFA.TOTP + + test "create provisioning_uri to generate qrcode" do + uri = + TOTP.provisioning_uri("test-secrcet", "test@example.com", + issuer: "Plerome-42", + digits: 8, + period: 60 + ) + + assert uri == + "otpauth://totp/test@example.com?digits=8&issuer=Plerome-42&period=60&secret=test-secrcet" + end +end diff --git a/test/mfa_test.exs b/test/mfa_test.exs new file mode 100644 index 000000000..8875cefd9 --- /dev/null +++ b/test/mfa_test.exs @@ -0,0 +1,52 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2018 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.MFATest do + use Pleroma.DataCase + + import Pleroma.Factory + alias Pleroma.MFA + + describe "mfa_settings" do + test "returns settings user's" do + user = + insert(:user, + multi_factor_authentication_settings: %MFA.Settings{ + enabled: true, + totp: %MFA.Settings.TOTP{secret: "xx", confirmed: true} + } + ) + + settings = MFA.mfa_settings(user) + assert match?(^settings, %{enabled: true, totp: true}) + end + end + + describe "generate backup codes" do + test "returns backup codes" do + user = insert(:user) + + {:ok, [code1, code2]} = MFA.generate_backup_codes(user) + updated_user = refresh_record(user) + [hash1, hash2] = updated_user.multi_factor_authentication_settings.backup_codes + assert Pbkdf2.verify_pass(code1, hash1) + assert Pbkdf2.verify_pass(code2, hash2) + end + end + + describe "invalidate_backup_code" do + test "invalid used code" do + user = insert(:user) + + {:ok, _} = MFA.generate_backup_codes(user) + user = refresh_record(user) + assert length(user.multi_factor_authentication_settings.backup_codes) == 2 + [hash_code | _] = user.multi_factor_authentication_settings.backup_codes + + {:ok, user} = MFA.invalidate_backup_code(user, hash_code) + + assert length(user.multi_factor_authentication_settings.backup_codes) == 1 + end + end +end diff --git a/test/notification_test.exs b/test/notification_test.exs index d240ede94..37c255fee 100644 --- a/test/notification_test.exs +++ b/test/notification_test.exs @@ -6,12 +6,18 @@ defmodule Pleroma.NotificationTest do use Pleroma.DataCase import Pleroma.Factory + import Mock + alias Pleroma.FollowingRelationship alias Pleroma.Notification alias Pleroma.Tests.ObanHelpers alias Pleroma.User + alias Pleroma.Web.ActivityPub.ActivityPub + alias Pleroma.Web.ActivityPub.Builder alias Pleroma.Web.ActivityPub.Transmogrifier alias Pleroma.Web.CommonAPI + alias Pleroma.Web.MastodonAPI.NotificationView + alias Pleroma.Web.Push alias Pleroma.Web.Streamer describe "create_notifications" do @@ -19,8 +25,8 @@ test "creates a notification for an emoji reaction" do user = insert(:user) other_user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "yeah"}) - {:ok, activity, _object} = CommonAPI.react_with_emoji(activity.id, other_user, "☕") + {:ok, activity} = CommonAPI.post(user, %{status: "yeah"}) + {:ok, activity} = CommonAPI.react_with_emoji(activity.id, other_user, "☕") {:ok, [notification]} = Notification.create_notifications(activity) @@ -34,7 +40,7 @@ test "notifies someone when they are directly addressed" do {:ok, activity} = CommonAPI.post(user, %{ - "status" => "hey @#{other_user.nickname} and @#{third_user.nickname}" + status: "hey @#{other_user.nickname} and @#{third_user.nickname}" }) {:ok, [notification, other_notification]} = Notification.create_notifications(activity) @@ -43,6 +49,9 @@ test "notifies someone when they are directly addressed" do assert notified_ids == [other_user.id, third_user.id] assert notification.activity_id == activity.id assert other_notification.activity_id == activity.id + + assert [%Pleroma.Marker{unread_count: 2}] = + Pleroma.Marker.get_markers(other_user, ["notifications"]) end test "it creates a notification for subscribed users" do @@ -51,7 +60,7 @@ test "it creates a notification for subscribed users" do User.subscribe(subscriber, user) - {:ok, status} = CommonAPI.post(user, %{"status" => "Akariiiin"}) + {:ok, status} = CommonAPI.post(user, %{status: "Akariiiin"}) {:ok, [notification]} = Notification.create_notifications(status) assert notification.user_id == subscriber.id @@ -64,12 +73,12 @@ test "does not create a notification for subscribed users if status is a reply" User.subscribe(subscriber, other_user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "test post"}) + {:ok, activity} = CommonAPI.post(user, %{status: "test post"}) {:ok, _reply_activity} = CommonAPI.post(other_user, %{ - "status" => "test reply", - "in_reply_to_status_id" => activity.id + status: "test reply", + in_reply_to_status_id: activity.id }) user_notifications = Notification.for_user(user) @@ -80,18 +89,96 @@ test "does not create a notification for subscribed users if status is a reply" end end + describe "CommonApi.post/2 notification-related functionality" do + test_with_mock "creates but does NOT send notification to blocker user", + Push, + [:passthrough], + [] do + user = insert(:user) + blocker = insert(:user) + {:ok, _user_relationship} = User.block(blocker, user) + + {:ok, _activity} = CommonAPI.post(user, %{status: "hey @#{blocker.nickname}!"}) + + blocker_id = blocker.id + assert [%Notification{user_id: ^blocker_id}] = Repo.all(Notification) + refute called(Push.send(:_)) + end + + test_with_mock "creates but does NOT send notification to notification-muter user", + Push, + [:passthrough], + [] do + user = insert(:user) + muter = insert(:user) + {:ok, _user_relationships} = User.mute(muter, user) + + {:ok, _activity} = CommonAPI.post(user, %{status: "hey @#{muter.nickname}!"}) + + muter_id = muter.id + assert [%Notification{user_id: ^muter_id}] = Repo.all(Notification) + refute called(Push.send(:_)) + end + + test_with_mock "creates but does NOT send notification to thread-muter user", + Push, + [:passthrough], + [] do + user = insert(:user) + thread_muter = insert(:user) + + {:ok, activity} = CommonAPI.post(user, %{status: "hey @#{thread_muter.nickname}!"}) + + {:ok, _} = CommonAPI.add_mute(thread_muter, activity) + + {:ok, _same_context_activity} = + CommonAPI.post(user, %{ + status: "hey-hey-hey @#{thread_muter.nickname}!", + in_reply_to_status_id: activity.id + }) + + [pre_mute_notification, post_mute_notification] = + Repo.all(from(n in Notification, where: n.user_id == ^thread_muter.id, order_by: n.id)) + + pre_mute_notification_id = pre_mute_notification.id + post_mute_notification_id = post_mute_notification.id + + assert called( + Push.send( + :meck.is(fn + %Notification{id: ^pre_mute_notification_id} -> true + _ -> false + end) + ) + ) + + refute called( + Push.send( + :meck.is(fn + %Notification{id: ^post_mute_notification_id} -> true + _ -> false + end) + ) + ) + end + end + describe "create_notification" do @tag needs_streamer: true test "it creates a notification for user and send to the 'user' and the 'user:notification' stream" do user = insert(:user) - task = Task.async(fn -> assert_receive {:text, _}, 4_000 end) - task_user_notification = Task.async(fn -> assert_receive {:text, _}, 4_000 end) - Streamer.add_socket("user", %{transport_pid: task.pid, assigns: %{user: user}}) - Streamer.add_socket( - "user:notification", - %{transport_pid: task_user_notification.pid, assigns: %{user: user}} - ) + task = + Task.async(fn -> + Streamer.get_topic_and_add_socket("user", user) + assert_receive {:render_with_user, _, _, _}, 4_000 + end) + + task_user_notification = + Task.async(fn -> + Streamer.get_topic_and_add_socket("user:notification", user) + assert_receive {:render_with_user, _, _, _}, 4_000 + end) activity = insert(:note_activity) @@ -115,7 +202,7 @@ test "it creates a notification for the user if the user mutes the activity auth muted = insert(:user) {:ok, _} = User.mute(muter, muted) muter = Repo.get(User, muter.id) - {:ok, activity} = CommonAPI.post(muted, %{"status" => "Hi @#{muter.nickname}"}) + {:ok, activity} = CommonAPI.post(muted, %{status: "Hi @#{muter.nickname}"}) assert Notification.create_notification(activity, muter) end @@ -126,7 +213,7 @@ test "notification created if user is muted without notifications" do {:ok, _user_relationships} = User.mute(muter, muted, false) - {:ok, activity} = CommonAPI.post(muted, %{"status" => "Hi @#{muter.nickname}"}) + {:ok, activity} = CommonAPI.post(muted, %{status: "Hi @#{muter.nickname}"}) assert Notification.create_notification(activity, muter) end @@ -134,13 +221,13 @@ test "notification created if user is muted without notifications" do test "it creates a notification for an activity from a muted thread" do muter = insert(:user) other_user = insert(:user) - {:ok, activity} = CommonAPI.post(muter, %{"status" => "hey"}) + {:ok, activity} = CommonAPI.post(muter, %{status: "hey"}) CommonAPI.add_mute(muter, activity) {:ok, activity} = CommonAPI.post(other_user, %{ - "status" => "Hi @#{muter.nickname}", - "in_reply_to_status_id" => activity.id + status: "Hi @#{muter.nickname}", + in_reply_to_status_id: activity.id }) assert Notification.create_notification(activity, muter) @@ -153,7 +240,7 @@ test "it disables notifications from followers" do insert(:user, notification_settings: %Pleroma.User.NotificationSetting{followers: false}) User.follow(follower, followed) - {:ok, activity} = CommonAPI.post(follower, %{"status" => "hey @#{followed.nickname}"}) + {:ok, activity} = CommonAPI.post(follower, %{status: "hey @#{followed.nickname}"}) refute Notification.create_notification(activity, followed) end @@ -165,7 +252,7 @@ test "it disables notifications from non-followers" do notification_settings: %Pleroma.User.NotificationSetting{non_followers: false} ) - {:ok, activity} = CommonAPI.post(follower, %{"status" => "hey @#{followed.nickname}"}) + {:ok, activity} = CommonAPI.post(follower, %{status: "hey @#{followed.nickname}"}) refute Notification.create_notification(activity, followed) end @@ -176,7 +263,7 @@ test "it disables notifications from people the user follows" do followed = insert(:user) User.follow(follower, followed) follower = Repo.get(User, follower.id) - {:ok, activity} = CommonAPI.post(followed, %{"status" => "hey @#{follower.nickname}"}) + {:ok, activity} = CommonAPI.post(followed, %{status: "hey @#{follower.nickname}"}) refute Notification.create_notification(activity, follower) end @@ -185,7 +272,7 @@ test "it disables notifications from people the user does not follow" do insert(:user, notification_settings: %Pleroma.User.NotificationSetting{non_follows: false}) followed = insert(:user) - {:ok, activity} = CommonAPI.post(followed, %{"status" => "hey @#{follower.nickname}"}) + {:ok, activity} = CommonAPI.post(followed, %{status: "hey @#{follower.nickname}"}) refute Notification.create_notification(activity, follower) end @@ -196,23 +283,13 @@ test "it doesn't create a notification for user if he is the activity author" do refute Notification.create_notification(activity, author) end - test "it doesn't create a notification for follow-unfollow-follow chains" do - user = insert(:user) - followed_user = insert(:user) - {:ok, _, _, activity} = CommonAPI.follow(user, followed_user) - Notification.create_notification(activity, followed_user) - CommonAPI.unfollow(user, followed_user) - {:ok, _, _, activity_dupe} = CommonAPI.follow(user, followed_user) - refute Notification.create_notification(activity_dupe, followed_user) - end - test "it doesn't create duplicate notifications for follow+subscribed users" do user = insert(:user) subscriber = insert(:user) {:ok, _, _, _} = CommonAPI.follow(subscriber, user) User.subscribe(subscriber, user) - {:ok, status} = CommonAPI.post(user, %{"status" => "Akariiiin"}) + {:ok, status} = CommonAPI.post(user, %{status: "Akariiiin"}) {:ok, [_notif]} = Notification.create_notifications(status) end @@ -222,18 +299,78 @@ test "it doesn't create subscription notifications if the recipient cannot see t User.subscribe(subscriber, user) - {:ok, status} = CommonAPI.post(user, %{"status" => "inwisible", "visibility" => "direct"}) + {:ok, status} = CommonAPI.post(user, %{status: "inwisible", visibility: "direct"}) assert {:ok, []} == Notification.create_notifications(status) end end + describe "follow / follow_request notifications" do + test "it creates `follow` notification for approved Follow activity" do + user = insert(:user) + followed_user = insert(:user, locked: false) + + {:ok, _, _, _activity} = CommonAPI.follow(user, followed_user) + assert FollowingRelationship.following?(user, followed_user) + assert [notification] = Notification.for_user(followed_user) + + assert %{type: "follow"} = + NotificationView.render("show.json", %{ + notification: notification, + for: followed_user + }) + end + + test "it creates `follow_request` notification for pending Follow activity" do + user = insert(:user) + followed_user = insert(:user, locked: true) + + {:ok, _, _, _activity} = CommonAPI.follow(user, followed_user) + refute FollowingRelationship.following?(user, followed_user) + assert [notification] = Notification.for_user(followed_user) + + render_opts = %{notification: notification, for: followed_user} + assert %{type: "follow_request"} = NotificationView.render("show.json", render_opts) + + # After request is accepted, the same notification is rendered with type "follow": + assert {:ok, _} = CommonAPI.accept_follow_request(user, followed_user) + + notification_id = notification.id + assert [%{id: ^notification_id}] = Notification.for_user(followed_user) + assert %{type: "follow"} = NotificationView.render("show.json", render_opts) + end + + test "it doesn't create a notification for follow-unfollow-follow chains" do + user = insert(:user) + followed_user = insert(:user, locked: false) + + {:ok, _, _, _activity} = CommonAPI.follow(user, followed_user) + assert FollowingRelationship.following?(user, followed_user) + assert [notification] = Notification.for_user(followed_user) + + CommonAPI.unfollow(user, followed_user) + {:ok, _, _, _activity_dupe} = CommonAPI.follow(user, followed_user) + + notification_id = notification.id + assert [%{id: ^notification_id}] = Notification.for_user(followed_user) + end + + test "dismisses the notification on follow request rejection" do + user = insert(:user, locked: true) + follower = insert(:user) + {:ok, _, _, _follow_activity} = CommonAPI.follow(follower, user) + assert [notification] = Notification.for_user(user) + {:ok, _follower} = CommonAPI.reject_follow_request(follower, user) + assert [] = Notification.for_user(user) + end + end + describe "get notification" do test "it gets a notification that belongs to the user" do user = insert(:user) other_user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "hey @#{other_user.nickname}"}) + {:ok, activity} = CommonAPI.post(user, %{status: "hey @#{other_user.nickname}"}) {:ok, [notification]} = Notification.create_notifications(activity) {:ok, notification} = Notification.get(other_user, notification.id) @@ -245,7 +382,7 @@ test "it returns error if the notification doesn't belong to the user" do user = insert(:user) other_user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "hey @#{other_user.nickname}"}) + {:ok, activity} = CommonAPI.post(user, %{status: "hey @#{other_user.nickname}"}) {:ok, [notification]} = Notification.create_notifications(activity) {:error, _notification} = Notification.get(user, notification.id) @@ -257,7 +394,7 @@ test "it dismisses a notification that belongs to the user" do user = insert(:user) other_user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "hey @#{other_user.nickname}"}) + {:ok, activity} = CommonAPI.post(user, %{status: "hey @#{other_user.nickname}"}) {:ok, [notification]} = Notification.create_notifications(activity) {:ok, notification} = Notification.dismiss(other_user, notification.id) @@ -269,7 +406,7 @@ test "it returns error if the notification doesn't belong to the user" do user = insert(:user) other_user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "hey @#{other_user.nickname}"}) + {:ok, activity} = CommonAPI.post(user, %{status: "hey @#{other_user.nickname}"}) {:ok, [notification]} = Notification.create_notifications(activity) {:error, _notification} = Notification.dismiss(user, notification.id) @@ -284,14 +421,14 @@ test "it clears all notifications belonging to the user" do {:ok, activity} = CommonAPI.post(user, %{ - "status" => "hey @#{other_user.nickname} and @#{third_user.nickname} !" + status: "hey @#{other_user.nickname} and @#{third_user.nickname} !" }) {:ok, _notifs} = Notification.create_notifications(activity) {:ok, activity} = CommonAPI.post(user, %{ - "status" => "hey again @#{other_user.nickname} and @#{third_user.nickname} !" + status: "hey again @#{other_user.nickname} and @#{third_user.nickname} !" }) {:ok, _notifs} = Notification.create_notifications(activity) @@ -309,31 +446,42 @@ test "it sets all notifications as read up to a specified notification ID" do {:ok, _activity} = CommonAPI.post(user, %{ - "status" => "hey @#{other_user.nickname}!" + status: "hey @#{other_user.nickname}!" }) {:ok, _activity} = CommonAPI.post(user, %{ - "status" => "hey again @#{other_user.nickname}!" + status: "hey again @#{other_user.nickname}!" }) - [n2, n1] = notifs = Notification.for_user(other_user) - assert length(notifs) == 2 + [n2, n1] = Notification.for_user(other_user) assert n2.id > n1.id {:ok, _activity} = CommonAPI.post(user, %{ - "status" => "hey yet again @#{other_user.nickname}!" + status: "hey yet again @#{other_user.nickname}!" }) - Notification.set_read_up_to(other_user, n2.id) + [_, read_notification] = Notification.set_read_up_to(other_user, n2.id) + + assert read_notification.activity.object [n3, n2, n1] = Notification.for_user(other_user) assert n1.seen == true assert n2.seen == true assert n3.seen == false + + assert %Pleroma.Marker{} = + m = + Pleroma.Repo.get_by( + Pleroma.Marker, + user_id: other_user.id, + timeline: "notifications" + ) + + assert m.last_read_id == to_string(n2.id) end end @@ -353,7 +501,7 @@ test "Returns recent notifications" do Enum.each(0..10, fn i -> {:ok, _activity} = CommonAPI.post(user1, %{ - "status" => "hey ##{i} @#{user2.nickname}!" + status: "hey ##{i} @#{user2.nickname}!" }) end) @@ -382,17 +530,19 @@ test "Returns recent notifications" do end end - describe "notification target determination" do + describe "notification target determination / get_notified_from_activity/2" do test "it sends notifications to addressed users in new messages" do user = insert(:user) other_user = insert(:user) {:ok, activity} = CommonAPI.post(user, %{ - "status" => "hey @#{other_user.nickname}!" + status: "hey @#{other_user.nickname}!" }) - assert other_user in Notification.get_notified_from_activity(activity) + {enabled_receivers, _disabled_receivers} = Notification.get_notified_from_activity(activity) + + assert other_user in enabled_receivers end test "it sends notifications to mentioned users in new messages" do @@ -420,7 +570,9 @@ test "it sends notifications to mentioned users in new messages" do {:ok, activity} = Transmogrifier.handle_incoming(create_activity) - assert other_user in Notification.get_notified_from_activity(activity) + {enabled_receivers, _disabled_receivers} = Notification.get_notified_from_activity(activity) + + assert other_user in enabled_receivers end test "it does not send notifications to users who are only cc in new messages" do @@ -442,7 +594,9 @@ test "it does not send notifications to users who are only cc in new messages" d {:ok, activity} = Transmogrifier.handle_incoming(create_activity) - assert other_user not in Notification.get_notified_from_activity(activity) + {enabled_receivers, _disabled_receivers} = Notification.get_notified_from_activity(activity) + + assert other_user not in enabled_receivers end test "it does not send notification to mentioned users in likes" do @@ -452,12 +606,37 @@ test "it does not send notification to mentioned users in likes" do {:ok, activity_one} = CommonAPI.post(user, %{ - "status" => "hey @#{other_user.nickname}!" + status: "hey @#{other_user.nickname}!" }) - {:ok, activity_two, _} = CommonAPI.favorite(activity_one.id, third_user) + {:ok, activity_two} = CommonAPI.favorite(third_user, activity_one.id) - assert other_user not in Notification.get_notified_from_activity(activity_two) + {enabled_receivers, _disabled_receivers} = + Notification.get_notified_from_activity(activity_two) + + assert other_user not in enabled_receivers + end + + test "it only notifies the post's author in likes" do + user = insert(:user) + other_user = insert(:user) + third_user = insert(:user) + + {:ok, activity_one} = + CommonAPI.post(user, %{ + status: "hey @#{other_user.nickname}!" + }) + + {:ok, like_data, _} = Builder.like(third_user, activity_one.object) + + {:ok, like, _} = + like_data + |> Map.put("to", [other_user.ap_id | like_data["to"]]) + |> ActivityPub.persist(local: true) + + {enabled_receivers, _disabled_receivers} = Notification.get_notified_from_activity(like) + + assert other_user not in enabled_receivers end test "it does not send notification to mentioned users in announces" do @@ -467,12 +646,93 @@ test "it does not send notification to mentioned users in announces" do {:ok, activity_one} = CommonAPI.post(user, %{ - "status" => "hey @#{other_user.nickname}!" + status: "hey @#{other_user.nickname}!" }) - {:ok, activity_two, _} = CommonAPI.repeat(activity_one.id, third_user) + {:ok, activity_two} = CommonAPI.repeat(activity_one.id, third_user) - assert other_user not in Notification.get_notified_from_activity(activity_two) + {enabled_receivers, _disabled_receivers} = + Notification.get_notified_from_activity(activity_two) + + assert other_user not in enabled_receivers + end + + test "it returns blocking recipient in disabled recipients list" do + user = insert(:user) + other_user = insert(:user) + {:ok, _user_relationship} = User.block(other_user, user) + + {:ok, activity} = CommonAPI.post(user, %{status: "hey @#{other_user.nickname}!"}) + + {enabled_receivers, disabled_receivers} = Notification.get_notified_from_activity(activity) + + assert [] == enabled_receivers + assert [other_user] == disabled_receivers + end + + test "it returns notification-muting recipient in disabled recipients list" do + user = insert(:user) + other_user = insert(:user) + {:ok, _user_relationships} = User.mute(other_user, user) + + {:ok, activity} = CommonAPI.post(user, %{status: "hey @#{other_user.nickname}!"}) + + {enabled_receivers, disabled_receivers} = Notification.get_notified_from_activity(activity) + + assert [] == enabled_receivers + assert [other_user] == disabled_receivers + end + + test "it returns thread-muting recipient in disabled recipients list" do + user = insert(:user) + other_user = insert(:user) + + {:ok, activity} = CommonAPI.post(user, %{status: "hey @#{other_user.nickname}!"}) + + {:ok, _} = CommonAPI.add_mute(other_user, activity) + + {:ok, same_context_activity} = + CommonAPI.post(user, %{ + status: "hey-hey-hey @#{other_user.nickname}!", + in_reply_to_status_id: activity.id + }) + + {enabled_receivers, disabled_receivers} = + Notification.get_notified_from_activity(same_context_activity) + + assert [other_user] == disabled_receivers + refute other_user in enabled_receivers + end + + test "it returns non-following domain-blocking recipient in disabled recipients list" do + blocked_domain = "blocked.domain" + user = insert(:user, %{ap_id: "https://#{blocked_domain}/@actor"}) + other_user = insert(:user) + + {:ok, other_user} = User.block_domain(other_user, blocked_domain) + + {:ok, activity} = CommonAPI.post(user, %{status: "hey @#{other_user.nickname}!"}) + + {enabled_receivers, disabled_receivers} = Notification.get_notified_from_activity(activity) + + assert [] == enabled_receivers + assert [other_user] == disabled_receivers + end + + test "it returns following domain-blocking recipient in enabled recipients list" do + blocked_domain = "blocked.domain" + user = insert(:user, %{ap_id: "https://#{blocked_domain}/@actor"}) + other_user = insert(:user) + + {:ok, other_user} = User.block_domain(other_user, blocked_domain) + {:ok, other_user} = User.follow(other_user, user) + + {:ok, activity} = CommonAPI.post(user, %{status: "hey @#{other_user.nickname}!"}) + + {enabled_receivers, disabled_receivers} = Notification.get_notified_from_activity(activity) + + assert [other_user] == enabled_receivers + assert [] == disabled_receivers end end @@ -481,11 +741,11 @@ test "liking an activity results in 1 notification, then 0 if the activity is de user = insert(:user) other_user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "test post"}) + {:ok, activity} = CommonAPI.post(user, %{status: "test post"}) assert Enum.empty?(Notification.for_user(user)) - {:ok, _, _} = CommonAPI.favorite(activity.id, other_user) + {:ok, _} = CommonAPI.favorite(other_user, activity.id) assert length(Notification.for_user(user)) == 1 @@ -498,15 +758,15 @@ test "liking an activity results in 1 notification, then 0 if the activity is un user = insert(:user) other_user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "test post"}) + {:ok, activity} = CommonAPI.post(user, %{status: "test post"}) assert Enum.empty?(Notification.for_user(user)) - {:ok, _, _} = CommonAPI.favorite(activity.id, other_user) + {:ok, _} = CommonAPI.favorite(other_user, activity.id) assert length(Notification.for_user(user)) == 1 - {:ok, _, _, _} = CommonAPI.unfavorite(activity.id, other_user) + {:ok, _} = CommonAPI.unfavorite(activity.id, other_user) assert Enum.empty?(Notification.for_user(user)) end @@ -515,11 +775,11 @@ test "repeating an activity results in 1 notification, then 0 if the activity is user = insert(:user) other_user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "test post"}) + {:ok, activity} = CommonAPI.post(user, %{status: "test post"}) assert Enum.empty?(Notification.for_user(user)) - {:ok, _, _} = CommonAPI.repeat(activity.id, other_user) + {:ok, _} = CommonAPI.repeat(activity.id, other_user) assert length(Notification.for_user(user)) == 1 @@ -532,15 +792,15 @@ test "repeating an activity results in 1 notification, then 0 if the activity is user = insert(:user) other_user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "test post"}) + {:ok, activity} = CommonAPI.post(user, %{status: "test post"}) assert Enum.empty?(Notification.for_user(user)) - {:ok, _, _} = CommonAPI.repeat(activity.id, other_user) + {:ok, _} = CommonAPI.repeat(activity.id, other_user) assert length(Notification.for_user(user)) == 1 - {:ok, _, _} = CommonAPI.unrepeat(activity.id, other_user) + {:ok, _} = CommonAPI.unrepeat(activity.id, other_user) assert Enum.empty?(Notification.for_user(user)) end @@ -549,7 +809,7 @@ test "liking an activity which is already deleted does not generate a notificati user = insert(:user) other_user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "test post"}) + {:ok, activity} = CommonAPI.post(user, %{status: "test post"}) assert Enum.empty?(Notification.for_user(user)) @@ -557,7 +817,7 @@ test "liking an activity which is already deleted does not generate a notificati assert Enum.empty?(Notification.for_user(user)) - {:error, _} = CommonAPI.favorite(activity.id, other_user) + {:error, :not_found} = CommonAPI.favorite(other_user, activity.id) assert Enum.empty?(Notification.for_user(user)) end @@ -566,7 +826,7 @@ test "repeating an activity which is already deleted does not generate a notific user = insert(:user) other_user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "test post"}) + {:ok, activity} = CommonAPI.post(user, %{status: "test post"}) assert Enum.empty?(Notification.for_user(user)) @@ -583,13 +843,13 @@ test "replying to a deleted post without tagging does not generate a notificatio user = insert(:user) other_user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "test post"}) + {:ok, activity} = CommonAPI.post(user, %{status: "test post"}) {:ok, _deletion_activity} = CommonAPI.delete(activity.id, user) {:ok, _reply_activity} = CommonAPI.post(other_user, %{ - "status" => "test reply", - "in_reply_to_status_id" => activity.id + status: "test reply", + in_reply_to_status_id: activity.id }) assert Enum.empty?(Notification.for_user(user)) @@ -600,7 +860,7 @@ test "notifications are deleted if a local user is deleted" do other_user = insert(:user) {:ok, _activity} = - CommonAPI.post(user, %{"status" => "hi @#{other_user.nickname}", "visibility" => "direct"}) + CommonAPI.post(user, %{status: "hi @#{other_user.nickname}", visibility: "direct"}) refute Enum.empty?(Notification.for_user(other_user)) @@ -649,12 +909,20 @@ test "notifications are deleted if a remote user is deleted" do "object" => remote_user.ap_id } + remote_user_url = remote_user.ap_id + + Tesla.Mock.mock(fn + %{method: :get, url: ^remote_user_url} -> + %Tesla.Env{status: 404, body: ""} + end) + {:ok, _delete_activity} = Transmogrifier.handle_incoming(delete_user_message) ObanHelpers.perform_all() assert Enum.empty?(Notification.for_user(local_user)) end + @tag capture_log: true test "move activity generates a notification" do %{ap_id: old_ap_id} = old_user = insert(:user) %{ap_id: new_ap_id} = new_user = insert(:user, also_known_as: [old_ap_id]) @@ -664,6 +932,18 @@ test "move activity generates a notification" do User.follow(follower, old_user) User.follow(other_follower, old_user) + old_user_url = old_user.ap_id + + body = + File.read!("test/fixtures/users_mock/localhost.json") + |> String.replace("{{nickname}}", old_user.nickname) + |> Jason.encode!() + + Tesla.Mock.mock(fn + %{method: :get, url: ^old_user_url} -> + %Tesla.Env{status: 200, body: body} + end) + Pleroma.Web.ActivityPub.ActivityPub.move(old_user, new_user) ObanHelpers.perform_all() @@ -691,9 +971,11 @@ test "it returns notifications for muted user without notifications" do muted = insert(:user) {:ok, _user_relationships} = User.mute(user, muted, false) - {:ok, _activity} = CommonAPI.post(muted, %{"status" => "hey @#{user.nickname}"}) + {:ok, _activity} = CommonAPI.post(muted, %{status: "hey @#{user.nickname}"}) - assert length(Notification.for_user(user)) == 1 + [notification] = Notification.for_user(user) + + assert notification.activity.object end test "it doesn't return notifications for muted user with notifications" do @@ -701,7 +983,7 @@ test "it doesn't return notifications for muted user with notifications" do muted = insert(:user) {:ok, _user_relationships} = User.mute(user, muted) - {:ok, _activity} = CommonAPI.post(muted, %{"status" => "hey @#{user.nickname}"}) + {:ok, _activity} = CommonAPI.post(muted, %{status: "hey @#{user.nickname}"}) assert Notification.for_user(user) == [] end @@ -711,26 +993,38 @@ test "it doesn't return notifications for blocked user" do blocked = insert(:user) {:ok, _user_relationship} = User.block(user, blocked) - {:ok, _activity} = CommonAPI.post(blocked, %{"status" => "hey @#{user.nickname}"}) + {:ok, _activity} = CommonAPI.post(blocked, %{status: "hey @#{user.nickname}"}) assert Notification.for_user(user) == [] end - test "it doesn't return notificatitons for blocked domain" do + test "it doesn't return notifications for domain-blocked non-followed user" do user = insert(:user) blocked = insert(:user, ap_id: "http://some-domain.com") {:ok, user} = User.block_domain(user, "some-domain.com") - {:ok, _activity} = CommonAPI.post(blocked, %{"status" => "hey @#{user.nickname}"}) + {:ok, _activity} = CommonAPI.post(blocked, %{status: "hey @#{user.nickname}"}) assert Notification.for_user(user) == [] end + test "it returns notifications for domain-blocked but followed user" do + user = insert(:user) + blocked = insert(:user, ap_id: "http://some-domain.com") + + {:ok, user} = User.block_domain(user, "some-domain.com") + {:ok, _} = User.follow(user, blocked) + + {:ok, _activity} = CommonAPI.post(blocked, %{status: "hey @#{user.nickname}"}) + + assert length(Notification.for_user(user)) == 1 + end + test "it doesn't return notifications for muted thread" do user = insert(:user) another_user = insert(:user) - {:ok, activity} = CommonAPI.post(another_user, %{"status" => "hey @#{user.nickname}"}) + {:ok, activity} = CommonAPI.post(another_user, %{status: "hey @#{user.nickname}"}) {:ok, _} = Pleroma.ThreadMute.add_mute(user.id, activity.data["context"]) assert Notification.for_user(user) == [] @@ -741,7 +1035,7 @@ test "it returns notifications from a muted user when with_muted is set" do muted = insert(:user) {:ok, _user_relationships} = User.mute(user, muted) - {:ok, _activity} = CommonAPI.post(muted, %{"status" => "hey @#{user.nickname}"}) + {:ok, _activity} = CommonAPI.post(muted, %{status: "hey @#{user.nickname}"}) assert length(Notification.for_user(user, %{with_muted: true})) == 1 end @@ -751,17 +1045,18 @@ test "it doesn't return notifications from a blocked user when with_muted is set blocked = insert(:user) {:ok, _user_relationship} = User.block(user, blocked) - {:ok, _activity} = CommonAPI.post(blocked, %{"status" => "hey @#{user.nickname}"}) + {:ok, _activity} = CommonAPI.post(blocked, %{status: "hey @#{user.nickname}"}) assert Enum.empty?(Notification.for_user(user, %{with_muted: true})) end - test "it doesn't return notifications from a domain-blocked user when with_muted is set" do + test "when with_muted is set, " <> + "it doesn't return notifications from a domain-blocked non-followed user" do user = insert(:user) blocked = insert(:user, ap_id: "http://some-domain.com") {:ok, user} = User.block_domain(user, "some-domain.com") - {:ok, _activity} = CommonAPI.post(blocked, %{"status" => "hey @#{user.nickname}"}) + {:ok, _activity} = CommonAPI.post(blocked, %{status: "hey @#{user.nickname}"}) assert Enum.empty?(Notification.for_user(user, %{with_muted: true})) end @@ -770,7 +1065,7 @@ test "it returns notifications from muted threads when with_muted is set" do user = insert(:user) another_user = insert(:user) - {:ok, activity} = CommonAPI.post(another_user, %{"status" => "hey @#{user.nickname}"}) + {:ok, activity} = CommonAPI.post(another_user, %{status: "hey @#{user.nickname}"}) {:ok, _} = Pleroma.ThreadMute.add_mute(user.id, activity.data["context"]) assert length(Notification.for_user(user, %{with_muted: true})) == 1 diff --git a/test/object_test.exs b/test/object_test.exs index fe583decd..198d3b1cf 100644 --- a/test/object_test.exs +++ b/test/object_test.exs @@ -380,7 +380,8 @@ test "preserves internal fields on refetch", %{mock_modified: mock_modified} do user = insert(:user) activity = Activity.get_create_by_object_ap_id(object.data["id"]) - {:ok, _activity, object} = CommonAPI.favorite(activity.id, user) + {:ok, activity} = CommonAPI.favorite(user, activity.id) + object = Object.get_by_ap_id(activity.data["object"]) assert object.data["like_count"] == 1 diff --git a/test/otp_version_test.exs b/test/otp_version_test.exs new file mode 100644 index 000000000..7d2538ec8 --- /dev/null +++ b/test/otp_version_test.exs @@ -0,0 +1,42 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.OTPVersionTest do + use ExUnit.Case, async: true + + alias Pleroma.OTPVersion + + describe "check/1" do + test "22.4" do + assert OTPVersion.get_version_from_files(["test/fixtures/warnings/otp_version/22.4"]) == + "22.4" + end + + test "22.1" do + assert OTPVersion.get_version_from_files(["test/fixtures/warnings/otp_version/22.1"]) == + "22.1" + end + + test "21.1" do + assert OTPVersion.get_version_from_files(["test/fixtures/warnings/otp_version/21.1"]) == + "21.1" + end + + test "23.0" do + assert OTPVersion.get_version_from_files(["test/fixtures/warnings/otp_version/23.0"]) == + "23.0" + end + + test "with non existance file" do + assert OTPVersion.get_version_from_files([ + "test/fixtures/warnings/otp_version/non-exising", + "test/fixtures/warnings/otp_version/22.4" + ]) == "22.4" + end + + test "empty paths" do + assert OTPVersion.get_version_from_files([]) == nil + end + end +end diff --git a/test/plugs/authentication_plug_test.exs b/test/plugs/authentication_plug_test.exs index ae2f3f8ec..777ae15ae 100644 --- a/test/plugs/authentication_plug_test.exs +++ b/test/plugs/authentication_plug_test.exs @@ -6,15 +6,18 @@ defmodule Pleroma.Plugs.AuthenticationPlugTest do use Pleroma.Web.ConnCase, async: true alias Pleroma.Plugs.AuthenticationPlug + alias Pleroma.Plugs.OAuthScopesPlug + alias Pleroma.Plugs.PlugHelper alias Pleroma.User import ExUnit.CaptureLog + import Pleroma.Factory setup %{conn: conn} do user = %User{ id: 1, name: "dude", - password_hash: Comeonin.Pbkdf2.hashpwsalt("guy") + password_hash: Pbkdf2.hash_pwd_salt("guy") } conn = @@ -36,25 +39,54 @@ test "it does nothing if a user is assigned", %{conn: conn} do assert ret_conn == conn end - test "with a correct password in the credentials, it assigns the auth_user", %{conn: conn} do + test "with a correct password in the credentials, " <> + "it assigns the auth_user and marks OAuthScopesPlug as skipped", + %{conn: conn} do conn = conn |> assign(:auth_credentials, %{password: "guy"}) |> AuthenticationPlug.call(%{}) assert conn.assigns.user == conn.assigns.auth_user + assert PlugHelper.plug_skipped?(conn, OAuthScopesPlug) end - test "with a wrong password in the credentials, it does nothing", %{conn: conn} do + test "with a bcrypt hash, it updates to a pkbdf2 hash", %{conn: conn} do + user = insert(:user, password_hash: Bcrypt.hash_pwd_salt("123")) + assert "$2" <> _ = user.password_hash + conn = conn - |> assign(:auth_credentials, %{password: "wrong"}) - - ret_conn = - conn + |> assign(:auth_user, user) + |> assign(:auth_credentials, %{password: "123"}) |> AuthenticationPlug.call(%{}) - assert conn == ret_conn + assert conn.assigns.user.id == conn.assigns.auth_user.id + assert PlugHelper.plug_skipped?(conn, OAuthScopesPlug) + + user = User.get_by_id(user.id) + assert "$pbkdf2" <> _ = user.password_hash + end + + @tag :skip_on_mac + test "with a crypt hash, it updates to a pkbdf2 hash", %{conn: conn} do + user = + insert(:user, + password_hash: + "$6$9psBWV8gxkGOZWBz$PmfCycChoxeJ3GgGzwvhlgacb9mUoZ.KUXNCssekER4SJ7bOK53uXrHNb2e4i8yPFgSKyzaW9CcmrDXWIEMtD1" + ) + + conn = + conn + |> assign(:auth_user, user) + |> assign(:auth_credentials, %{password: "password"}) + |> AuthenticationPlug.call(%{}) + + assert conn.assigns.user.id == conn.assigns.auth_user.id + assert PlugHelper.plug_skipped?(conn, OAuthScopesPlug) + + user = User.get_by_id(user.id) + assert "$pbkdf2" <> _ = user.password_hash end describe "checkpw/2" do @@ -74,6 +106,13 @@ test "check sha512-crypt hash" do assert AuthenticationPlug.checkpw("password", hash) end + test "check bcrypt hash" do + hash = "$2a$10$uyhC/R/zoE1ndwwCtMusK.TLVzkQ/Ugsbqp3uXI.CTTz0gBw.24jS" + + assert AuthenticationPlug.checkpw("password", hash) + refute AuthenticationPlug.checkpw("password1", hash) + end + test "it returns false when hash invalid" do hash = "psBWV8gxkGOZWBz$PmfCycChoxeJ3GgGzwvhlgacb9mUoZ.KUXNCssekER4SJ7bOK53uXrHNb2e4i8yPFgSKyzaW9CcmrDXWIEMtD1" diff --git a/test/plugs/ensure_authenticated_plug_test.exs b/test/plugs/ensure_authenticated_plug_test.exs index 7f3559b83..a0667c5e0 100644 --- a/test/plugs/ensure_authenticated_plug_test.exs +++ b/test/plugs/ensure_authenticated_plug_test.exs @@ -20,34 +20,61 @@ test "it continues if a user is assigned", %{conn: conn} do conn = assign(conn, :user, %User{}) ret_conn = EnsureAuthenticatedPlug.call(conn, %{}) - assert ret_conn == conn + refute ret_conn.halted end end + test "it halts if user is assigned and MFA enabled", %{conn: conn} do + conn = + conn + |> assign(:user, %User{multi_factor_authentication_settings: %{enabled: true}}) + |> assign(:auth_credentials, %{password: "xd-42"}) + |> EnsureAuthenticatedPlug.call(%{}) + + assert conn.status == 403 + assert conn.halted == true + + assert conn.resp_body == + "{\"error\":\"Two-factor authentication enabled, you must use a access token.\"}" + end + + test "it continues if user is assigned and MFA disabled", %{conn: conn} do + conn = + conn + |> assign(:user, %User{multi_factor_authentication_settings: %{enabled: false}}) + |> assign(:auth_credentials, %{password: "xd-42"}) + |> EnsureAuthenticatedPlug.call(%{}) + + refute conn.status == 403 + refute conn.halted + end + describe "with :if_func / :unless_func options" do setup do %{ - true_fn: fn -> true end, - false_fn: fn -> false end + true_fn: fn _conn -> true end, + false_fn: fn _conn -> false end } end test "it continues if a user is assigned", %{conn: conn, true_fn: true_fn, false_fn: false_fn} do conn = assign(conn, :user, %User{}) - assert EnsureAuthenticatedPlug.call(conn, if_func: true_fn) == conn - assert EnsureAuthenticatedPlug.call(conn, if_func: false_fn) == conn - assert EnsureAuthenticatedPlug.call(conn, unless_func: true_fn) == conn - assert EnsureAuthenticatedPlug.call(conn, unless_func: false_fn) == conn + refute EnsureAuthenticatedPlug.call(conn, if_func: true_fn).halted + refute EnsureAuthenticatedPlug.call(conn, if_func: false_fn).halted + refute EnsureAuthenticatedPlug.call(conn, unless_func: true_fn).halted + refute EnsureAuthenticatedPlug.call(conn, unless_func: false_fn).halted end test "it continues if a user is NOT assigned but :if_func evaluates to `false`", %{conn: conn, false_fn: false_fn} do - assert EnsureAuthenticatedPlug.call(conn, if_func: false_fn) == conn + ret_conn = EnsureAuthenticatedPlug.call(conn, if_func: false_fn) + refute ret_conn.halted end test "it continues if a user is NOT assigned but :unless_func evaluates to `true`", %{conn: conn, true_fn: true_fn} do - assert EnsureAuthenticatedPlug.call(conn, unless_func: true_fn) == conn + ret_conn = EnsureAuthenticatedPlug.call(conn, unless_func: true_fn) + refute ret_conn.halted end test "it halts if a user is NOT assigned and :if_func evaluates to `true`", diff --git a/test/plugs/ensure_public_or_authenticated_plug_test.exs b/test/plugs/ensure_public_or_authenticated_plug_test.exs index 411252274..fc2934369 100644 --- a/test/plugs/ensure_public_or_authenticated_plug_test.exs +++ b/test/plugs/ensure_public_or_authenticated_plug_test.exs @@ -29,7 +29,7 @@ test "it continues if public", %{conn: conn} do conn |> EnsurePublicOrAuthenticatedPlug.call(%{}) - assert ret_conn == conn + refute ret_conn.halted end test "it continues if a user is assigned, even if not public", %{conn: conn} do @@ -43,6 +43,6 @@ test "it continues if a user is assigned, even if not public", %{conn: conn} do conn |> EnsurePublicOrAuthenticatedPlug.call(%{}) - assert ret_conn == conn + refute ret_conn.halted end end diff --git a/test/plugs/http_security_plug_test.exs b/test/plugs/http_security_plug_test.exs index 84e4c274f..63b4d3f31 100644 --- a/test/plugs/http_security_plug_test.exs +++ b/test/plugs/http_security_plug_test.exs @@ -67,7 +67,7 @@ test "it sends `report-to` & `report-uri` CSP response headers" do [csp] = Conn.get_resp_header(conn, "content-security-policy") - assert csp =~ ~r|report-uri https://endpoint.com; report-to csp-endpoint;| + assert csp =~ ~r|report-uri https://endpoint.com;report-to csp-endpoint;| [reply_to] = Conn.get_resp_header(conn, "reply-to") diff --git a/test/plugs/legacy_authentication_plug_test.exs b/test/plugs/legacy_authentication_plug_test.exs index 7559de7d3..3b8c07627 100644 --- a/test/plugs/legacy_authentication_plug_test.exs +++ b/test/plugs/legacy_authentication_plug_test.exs @@ -8,6 +8,8 @@ defmodule Pleroma.Plugs.LegacyAuthenticationPlugTest do import Pleroma.Factory alias Pleroma.Plugs.LegacyAuthenticationPlug + alias Pleroma.Plugs.OAuthScopesPlug + alias Pleroma.Plugs.PlugHelper alias Pleroma.User setup do @@ -36,7 +38,8 @@ test "it does nothing if a user is assigned", %{conn: conn, user: user} do end @tag :skip_on_mac - test "it authenticates the auth_user if present and password is correct and resets the password", + test "if `auth_user` is present and password is correct, " <> + "it authenticates the user, resets the password, marks OAuthScopesPlug as skipped", %{ conn: conn, user: user @@ -49,6 +52,7 @@ test "it authenticates the auth_user if present and password is correct and rese conn = LegacyAuthenticationPlug.call(conn, %{}) assert conn.assigns.user.id == user.id + assert PlugHelper.plug_skipped?(conn, OAuthScopesPlug) end @tag :skip_on_mac diff --git a/test/plugs/oauth_scopes_plug_test.exs b/test/plugs/oauth_scopes_plug_test.exs index e79ecf263..884de7b4d 100644 --- a/test/plugs/oauth_scopes_plug_test.exs +++ b/test/plugs/oauth_scopes_plug_test.exs @@ -5,15 +5,22 @@ defmodule Pleroma.Plugs.OAuthScopesPlugTest do use Pleroma.Web.ConnCase, async: true - alias Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug alias Pleroma.Plugs.OAuthScopesPlug alias Pleroma.Repo import Mock import Pleroma.Factory - setup_with_mocks([{EnsurePublicOrAuthenticatedPlug, [], [call: fn conn, _ -> conn end]}]) do - :ok + test "is not performed if marked as skipped", %{conn: conn} do + with_mock OAuthScopesPlug, [:passthrough], perform: &passthrough([&1, &2]) do + conn = + conn + |> OAuthScopesPlug.skip_plug() + |> OAuthScopesPlug.call(%{scopes: ["random_scope"]}) + + refute called(OAuthScopesPlug.perform(:_, :_)) + refute conn.halted + end end test "if `token.scopes` fulfills specified 'any of' conditions, " <> @@ -48,7 +55,7 @@ test "if `token.scopes` fulfills specified 'all of' conditions, " <> describe "with `fallback: :proceed_unauthenticated` option, " do test "if `token.scopes` doesn't fulfill specified conditions, " <> - "clears :user and :token assigns and calls EnsurePublicOrAuthenticatedPlug", + "clears :user and :token assigns", %{conn: conn} do user = insert(:user) token1 = insert(:oauth_token, scopes: ["read", "write"], user: user) @@ -67,35 +74,6 @@ test "if `token.scopes` doesn't fulfill specified conditions, " <> refute ret_conn.halted refute ret_conn.assigns[:user] refute ret_conn.assigns[:token] - - assert called(EnsurePublicOrAuthenticatedPlug.call(ret_conn, :_)) - end - end - - test "with :skip_instance_privacy_check option, " <> - "if `token.scopes` doesn't fulfill specified conditions, " <> - "clears :user and :token assigns and does NOT call EnsurePublicOrAuthenticatedPlug", - %{conn: conn} do - user = insert(:user) - token1 = insert(:oauth_token, scopes: ["read:statuses", "write"], user: user) - - for token <- [token1, nil], op <- [:|, :&] do - ret_conn = - conn - |> assign(:user, user) - |> assign(:token, token) - |> OAuthScopesPlug.call(%{ - scopes: ["read"], - op: op, - fallback: :proceed_unauthenticated, - skip_instance_privacy_check: true - }) - - refute ret_conn.halted - refute ret_conn.assigns[:user] - refute ret_conn.assigns[:token] - - refute called(EnsurePublicOrAuthenticatedPlug.call(ret_conn, :_)) end end end diff --git a/test/plugs/rate_limiter_test.exs b/test/plugs/rate_limiter_test.exs index 0ce9f3a0a..4d3d694f4 100644 --- a/test/plugs/rate_limiter_test.exs +++ b/test/plugs/rate_limiter_test.exs @@ -5,8 +5,10 @@ defmodule Pleroma.Plugs.RateLimiterTest do use Pleroma.Web.ConnCase + alias Phoenix.ConnTest alias Pleroma.Config alias Pleroma.Plugs.RateLimiter + alias Plug.Conn import Pleroma.Factory import Pleroma.Tests.Helpers, only: [clear_config: 1, clear_config: 2] @@ -36,8 +38,15 @@ test "config is required for plug to work" do end test "it is disabled if it remote ip plug is enabled but no remote ip is found" do - Config.put([Pleroma.Web.Endpoint, :http, :ip], {127, 0, 0, 1}) - assert RateLimiter.disabled?(Plug.Conn.assign(build_conn(), :remote_ip_found, false)) + assert RateLimiter.disabled?(Conn.assign(build_conn(), :remote_ip_found, false)) + end + + test "it is enabled if remote ip found" do + refute RateLimiter.disabled?(Conn.assign(build_conn(), :remote_ip_found, true)) + end + + test "it is enabled if remote_ip_found flag doesn't exist" do + refute RateLimiter.disabled?(build_conn()) end test "it restricts based on config values" do @@ -58,7 +67,7 @@ test "it restricts based on config values" do end conn = RateLimiter.call(conn, plug_opts) - assert %{"error" => "Throttled"} = Phoenix.ConnTest.json_response(conn, :too_many_requests) + assert %{"error" => "Throttled"} = ConnTest.json_response(conn, :too_many_requests) assert conn.halted Process.sleep(50) @@ -68,7 +77,7 @@ test "it restricts based on config values" do conn = RateLimiter.call(conn, plug_opts) assert {1, 4} = RateLimiter.inspect_bucket(conn, limiter_name, plug_opts) - refute conn.status == Plug.Conn.Status.code(:too_many_requests) + refute conn.status == Conn.Status.code(:too_many_requests) refute conn.resp_body refute conn.halted end @@ -98,7 +107,7 @@ test "`params` option allows different queries to be tracked independently" do plug_opts = RateLimiter.init(name: limiter_name, params: ["id"]) conn = build_conn(:get, "/?id=1") - conn = Plug.Conn.fetch_query_params(conn) + conn = Conn.fetch_query_params(conn) conn_2 = build_conn(:get, "/?id=2") RateLimiter.call(conn, plug_opts) @@ -119,7 +128,7 @@ test "it supports combination of options modifying bucket name" do id = "100" conn = build_conn(:get, "/?id=#{id}") - conn = Plug.Conn.fetch_query_params(conn) + conn = Conn.fetch_query_params(conn) conn_2 = build_conn(:get, "/?id=#{101}") RateLimiter.call(conn, plug_opts) @@ -147,13 +156,13 @@ test "are restricted based on remote IP" do conn = RateLimiter.call(conn, plug_opts) - assert %{"error" => "Throttled"} = Phoenix.ConnTest.json_response(conn, :too_many_requests) + assert %{"error" => "Throttled"} = ConnTest.json_response(conn, :too_many_requests) assert conn.halted conn_2 = RateLimiter.call(conn_2, plug_opts) assert {1, 4} = RateLimiter.inspect_bucket(conn_2, limiter_name, plug_opts) - refute conn_2.status == Plug.Conn.Status.code(:too_many_requests) + refute conn_2.status == Conn.Status.code(:too_many_requests) refute conn_2.resp_body refute conn_2.halted end @@ -187,7 +196,7 @@ test "can have limits separate from unauthenticated connections" do conn = RateLimiter.call(conn, plug_opts) - assert %{"error" => "Throttled"} = Phoenix.ConnTest.json_response(conn, :too_many_requests) + assert %{"error" => "Throttled"} = ConnTest.json_response(conn, :too_many_requests) assert conn.halted end @@ -210,12 +219,12 @@ test "different users are counted independently" do end conn = RateLimiter.call(conn, plug_opts) - assert %{"error" => "Throttled"} = Phoenix.ConnTest.json_response(conn, :too_many_requests) + assert %{"error" => "Throttled"} = ConnTest.json_response(conn, :too_many_requests) assert conn.halted conn_2 = RateLimiter.call(conn_2, plug_opts) assert {1, 4} = RateLimiter.inspect_bucket(conn_2, limiter_name, plug_opts) - refute conn_2.status == Plug.Conn.Status.code(:too_many_requests) + refute conn_2.status == Conn.Status.code(:too_many_requests) refute conn_2.resp_body refute conn_2.halted end diff --git a/test/pool/connections_test.exs b/test/pool/connections_test.exs new file mode 100644 index 000000000..aeda54875 --- /dev/null +++ b/test/pool/connections_test.exs @@ -0,0 +1,760 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Pool.ConnectionsTest do + use ExUnit.Case, async: true + use Pleroma.Tests.Helpers + + import ExUnit.CaptureLog + import Mox + + alias Pleroma.Gun.Conn + alias Pleroma.GunMock + alias Pleroma.Pool.Connections + + setup :verify_on_exit! + + setup_all do + name = :test_connections + {:ok, pid} = Connections.start_link({name, [checkin_timeout: 150]}) + {:ok, _} = Registry.start_link(keys: :unique, name: Pleroma.GunMock) + + on_exit(fn -> + if Process.alive?(pid), do: GenServer.stop(name) + end) + + {:ok, name: name} + end + + defp open_mock(num \\ 1) do + GunMock + |> expect(:open, num, &start_and_register(&1, &2, &3)) + |> expect(:await_up, num, fn _, _ -> {:ok, :http} end) + |> expect(:set_owner, num, fn _, _ -> :ok end) + end + + defp connect_mock(mock) do + mock + |> expect(:connect, &connect(&1, &2)) + |> expect(:await, &await(&1, &2)) + end + + defp info_mock(mock), do: expect(mock, :info, &info(&1)) + + defp start_and_register('gun-not-up.com', _, _), do: {:error, :timeout} + + defp start_and_register(host, port, _) do + {:ok, pid} = Task.start_link(fn -> Process.sleep(1000) end) + + scheme = + case port do + 443 -> "https" + _ -> "http" + end + + Registry.register(GunMock, pid, %{ + origin_scheme: scheme, + origin_host: host, + origin_port: port + }) + + {:ok, pid} + end + + defp info(pid) do + [{_, info}] = Registry.lookup(GunMock, pid) + info + end + + defp connect(pid, _) do + ref = make_ref() + Registry.register(GunMock, ref, pid) + ref + end + + defp await(pid, ref) do + [{_, ^pid}] = Registry.lookup(GunMock, ref) + {:response, :fin, 200, []} + end + + defp now, do: :os.system_time(:second) + + describe "alive?/2" do + test "is alive", %{name: name} do + assert Connections.alive?(name) + end + + test "returns false if not started" do + refute Connections.alive?(:some_random_name) + end + end + + test "opens connection and reuse it on next request", %{name: name} do + open_mock() + url = "http://some-domain.com" + key = "http:some-domain.com:80" + refute Connections.checkin(url, name) + :ok = Conn.open(url, name) + + conn = Connections.checkin(url, name) + assert is_pid(conn) + assert Process.alive?(conn) + + self = self() + + %Connections{ + conns: %{ + ^key => %Conn{ + conn: ^conn, + gun_state: :up, + used_by: [{^self, _}], + conn_state: :active + } + } + } = Connections.get_state(name) + + reused_conn = Connections.checkin(url, name) + + assert conn == reused_conn + + %Connections{ + conns: %{ + ^key => %Conn{ + conn: ^conn, + gun_state: :up, + used_by: [{^self, _}, {^self, _}], + conn_state: :active + } + } + } = Connections.get_state(name) + + :ok = Connections.checkout(conn, self, name) + + %Connections{ + conns: %{ + ^key => %Conn{ + conn: ^conn, + gun_state: :up, + used_by: [{^self, _}], + conn_state: :active + } + } + } = Connections.get_state(name) + + :ok = Connections.checkout(conn, self, name) + + %Connections{ + conns: %{ + ^key => %Conn{ + conn: ^conn, + gun_state: :up, + used_by: [], + conn_state: :idle + } + } + } = Connections.get_state(name) + end + + test "reuse connection for idna domains", %{name: name} do + open_mock() + url = "http://ですsome-domain.com" + refute Connections.checkin(url, name) + + :ok = Conn.open(url, name) + + conn = Connections.checkin(url, name) + assert is_pid(conn) + assert Process.alive?(conn) + + self = self() + + %Connections{ + conns: %{ + "http:ですsome-domain.com:80" => %Conn{ + conn: ^conn, + gun_state: :up, + used_by: [{^self, _}], + conn_state: :active + } + } + } = Connections.get_state(name) + + reused_conn = Connections.checkin(url, name) + + assert conn == reused_conn + end + + test "reuse for ipv4", %{name: name} do + open_mock() + url = "http://127.0.0.1" + + refute Connections.checkin(url, name) + + :ok = Conn.open(url, name) + + conn = Connections.checkin(url, name) + assert is_pid(conn) + assert Process.alive?(conn) + + self = self() + + %Connections{ + conns: %{ + "http:127.0.0.1:80" => %Conn{ + conn: ^conn, + gun_state: :up, + used_by: [{^self, _}], + conn_state: :active + } + } + } = Connections.get_state(name) + + reused_conn = Connections.checkin(url, name) + + assert conn == reused_conn + + :ok = Connections.checkout(conn, self, name) + :ok = Connections.checkout(reused_conn, self, name) + + %Connections{ + conns: %{ + "http:127.0.0.1:80" => %Conn{ + conn: ^conn, + gun_state: :up, + used_by: [], + conn_state: :idle + } + } + } = Connections.get_state(name) + end + + test "reuse for ipv6", %{name: name} do + open_mock() + url = "http://[2a03:2880:f10c:83:face:b00c:0:25de]" + + refute Connections.checkin(url, name) + + :ok = Conn.open(url, name) + + conn = Connections.checkin(url, name) + assert is_pid(conn) + assert Process.alive?(conn) + + self = self() + + %Connections{ + conns: %{ + "http:2a03:2880:f10c:83:face:b00c:0:25de:80" => %Conn{ + conn: ^conn, + gun_state: :up, + used_by: [{^self, _}], + conn_state: :active + } + } + } = Connections.get_state(name) + + reused_conn = Connections.checkin(url, name) + + assert conn == reused_conn + end + + test "up and down ipv4", %{name: name} do + open_mock() + |> info_mock() + |> allow(self(), name) + + self = self() + url = "http://127.0.0.1" + :ok = Conn.open(url, name) + conn = Connections.checkin(url, name) + send(name, {:gun_down, conn, nil, nil, nil}) + send(name, {:gun_up, conn, nil}) + + %Connections{ + conns: %{ + "http:127.0.0.1:80" => %Conn{ + conn: ^conn, + gun_state: :up, + used_by: [{^self, _}], + conn_state: :active + } + } + } = Connections.get_state(name) + end + + test "up and down ipv6", %{name: name} do + self = self() + + open_mock() + |> info_mock() + |> allow(self, name) + + url = "http://[2a03:2880:f10c:83:face:b00c:0:25de]" + :ok = Conn.open(url, name) + conn = Connections.checkin(url, name) + send(name, {:gun_down, conn, nil, nil, nil}) + send(name, {:gun_up, conn, nil}) + + %Connections{ + conns: %{ + "http:2a03:2880:f10c:83:face:b00c:0:25de:80" => %Conn{ + conn: ^conn, + gun_state: :up, + used_by: [{^self, _}], + conn_state: :active + } + } + } = Connections.get_state(name) + end + + test "reuses connection based on protocol", %{name: name} do + open_mock(2) + http_url = "http://some-domain.com" + http_key = "http:some-domain.com:80" + https_url = "https://some-domain.com" + https_key = "https:some-domain.com:443" + + refute Connections.checkin(http_url, name) + :ok = Conn.open(http_url, name) + conn = Connections.checkin(http_url, name) + assert is_pid(conn) + assert Process.alive?(conn) + + refute Connections.checkin(https_url, name) + :ok = Conn.open(https_url, name) + https_conn = Connections.checkin(https_url, name) + + refute conn == https_conn + + reused_https = Connections.checkin(https_url, name) + + refute conn == reused_https + + assert reused_https == https_conn + + %Connections{ + conns: %{ + ^http_key => %Conn{ + conn: ^conn, + gun_state: :up + }, + ^https_key => %Conn{ + conn: ^https_conn, + gun_state: :up + } + } + } = Connections.get_state(name) + end + + test "connection can't get up", %{name: name} do + expect(GunMock, :open, &start_and_register(&1, &2, &3)) + url = "http://gun-not-up.com" + + assert capture_log(fn -> + refute Conn.open(url, name) + refute Connections.checkin(url, name) + end) =~ + "Opening connection to http://gun-not-up.com failed with error {:error, :timeout}" + end + + test "process gun_down message and then gun_up", %{name: name} do + self = self() + + open_mock() + |> info_mock() + |> allow(self, name) + + url = "http://gun-down-and-up.com" + key = "http:gun-down-and-up.com:80" + :ok = Conn.open(url, name) + conn = Connections.checkin(url, name) + + assert is_pid(conn) + assert Process.alive?(conn) + + %Connections{ + conns: %{ + ^key => %Conn{ + conn: ^conn, + gun_state: :up, + used_by: [{^self, _}] + } + } + } = Connections.get_state(name) + + send(name, {:gun_down, conn, :http, nil, nil}) + + %Connections{ + conns: %{ + ^key => %Conn{ + conn: ^conn, + gun_state: :down, + used_by: [{^self, _}] + } + } + } = Connections.get_state(name) + + send(name, {:gun_up, conn, :http}) + + conn2 = Connections.checkin(url, name) + assert conn == conn2 + + assert is_pid(conn2) + assert Process.alive?(conn2) + + %Connections{ + conns: %{ + ^key => %Conn{ + conn: _, + gun_state: :up, + used_by: [{^self, _}, {^self, _}] + } + } + } = Connections.get_state(name) + end + + test "async processes get same conn for same domain", %{name: name} do + open_mock() + url = "http://some-domain.com" + :ok = Conn.open(url, name) + + tasks = + for _ <- 1..5 do + Task.async(fn -> + Connections.checkin(url, name) + end) + end + + tasks_with_results = Task.yield_many(tasks) + + results = + Enum.map(tasks_with_results, fn {task, res} -> + res || Task.shutdown(task, :brutal_kill) + end) + + conns = for {:ok, value} <- results, do: value + + %Connections{ + conns: %{ + "http:some-domain.com:80" => %Conn{ + conn: conn, + gun_state: :up + } + } + } = Connections.get_state(name) + + assert Enum.all?(conns, fn res -> res == conn end) + end + + test "remove frequently used and idle", %{name: name} do + open_mock(3) + self = self() + http_url = "http://some-domain.com" + https_url = "https://some-domain.com" + :ok = Conn.open(https_url, name) + :ok = Conn.open(http_url, name) + + conn1 = Connections.checkin(https_url, name) + + [conn2 | _conns] = + for _ <- 1..4 do + Connections.checkin(http_url, name) + end + + http_key = "http:some-domain.com:80" + + %Connections{ + conns: %{ + ^http_key => %Conn{ + conn: ^conn2, + gun_state: :up, + conn_state: :active, + used_by: [{^self, _}, {^self, _}, {^self, _}, {^self, _}] + }, + "https:some-domain.com:443" => %Conn{ + conn: ^conn1, + gun_state: :up, + conn_state: :active, + used_by: [{^self, _}] + } + } + } = Connections.get_state(name) + + :ok = Connections.checkout(conn1, self, name) + + another_url = "http://another-domain.com" + :ok = Conn.open(another_url, name) + conn = Connections.checkin(another_url, name) + + %Connections{ + conns: %{ + "http:another-domain.com:80" => %Conn{ + conn: ^conn, + gun_state: :up + }, + ^http_key => %Conn{ + conn: _, + gun_state: :up + } + } + } = Connections.get_state(name) + end + + describe "with proxy" do + test "as ip", %{name: name} do + open_mock() + |> connect_mock() + + url = "http://proxy-string.com" + key = "http:proxy-string.com:80" + :ok = Conn.open(url, name, proxy: {{127, 0, 0, 1}, 8123}) + + conn = Connections.checkin(url, name) + + %Connections{ + conns: %{ + ^key => %Conn{ + conn: ^conn, + gun_state: :up + } + } + } = Connections.get_state(name) + + reused_conn = Connections.checkin(url, name) + + assert reused_conn == conn + end + + test "as host", %{name: name} do + open_mock() + |> connect_mock() + + url = "http://proxy-tuple-atom.com" + :ok = Conn.open(url, name, proxy: {'localhost', 9050}) + conn = Connections.checkin(url, name) + + %Connections{ + conns: %{ + "http:proxy-tuple-atom.com:80" => %Conn{ + conn: ^conn, + gun_state: :up + } + } + } = Connections.get_state(name) + + reused_conn = Connections.checkin(url, name) + + assert reused_conn == conn + end + + test "as ip and ssl", %{name: name} do + open_mock() + |> connect_mock() + + url = "https://proxy-string.com" + + :ok = Conn.open(url, name, proxy: {{127, 0, 0, 1}, 8123}) + conn = Connections.checkin(url, name) + + %Connections{ + conns: %{ + "https:proxy-string.com:443" => %Conn{ + conn: ^conn, + gun_state: :up + } + } + } = Connections.get_state(name) + + reused_conn = Connections.checkin(url, name) + + assert reused_conn == conn + end + + test "as host and ssl", %{name: name} do + open_mock() + |> connect_mock() + + url = "https://proxy-tuple-atom.com" + :ok = Conn.open(url, name, proxy: {'localhost', 9050}) + conn = Connections.checkin(url, name) + + %Connections{ + conns: %{ + "https:proxy-tuple-atom.com:443" => %Conn{ + conn: ^conn, + gun_state: :up + } + } + } = Connections.get_state(name) + + reused_conn = Connections.checkin(url, name) + + assert reused_conn == conn + end + + test "with socks type", %{name: name} do + open_mock() + + url = "http://proxy-socks.com" + + :ok = Conn.open(url, name, proxy: {:socks5, 'localhost', 1234}) + + conn = Connections.checkin(url, name) + + %Connections{ + conns: %{ + "http:proxy-socks.com:80" => %Conn{ + conn: ^conn, + gun_state: :up + } + } + } = Connections.get_state(name) + + reused_conn = Connections.checkin(url, name) + + assert reused_conn == conn + end + + test "with socks4 type and ssl", %{name: name} do + open_mock() + url = "https://proxy-socks.com" + + :ok = Conn.open(url, name, proxy: {:socks4, 'localhost', 1234}) + + conn = Connections.checkin(url, name) + + %Connections{ + conns: %{ + "https:proxy-socks.com:443" => %Conn{ + conn: ^conn, + gun_state: :up + } + } + } = Connections.get_state(name) + + reused_conn = Connections.checkin(url, name) + + assert reused_conn == conn + end + end + + describe "crf/3" do + setup do + crf = Connections.crf(1, 10, 1) + {:ok, crf: crf} + end + + test "more used will have crf higher", %{crf: crf} do + # used 3 times + crf1 = Connections.crf(1, 10, crf) + crf1 = Connections.crf(1, 10, crf1) + + # used 2 times + crf2 = Connections.crf(1, 10, crf) + + assert crf1 > crf2 + end + + test "recently used will have crf higher on equal references", %{crf: crf} do + # used 3 sec ago + crf1 = Connections.crf(3, 10, crf) + + # used 4 sec ago + crf2 = Connections.crf(4, 10, crf) + + assert crf1 > crf2 + end + + test "equal crf on equal reference and time", %{crf: crf} do + # used 2 times + crf1 = Connections.crf(1, 10, crf) + + # used 2 times + crf2 = Connections.crf(1, 10, crf) + + assert crf1 == crf2 + end + + test "recently used will have higher crf", %{crf: crf} do + crf1 = Connections.crf(2, 10, crf) + crf1 = Connections.crf(1, 10, crf1) + + crf2 = Connections.crf(3, 10, crf) + crf2 = Connections.crf(4, 10, crf2) + assert crf1 > crf2 + end + end + + describe "get_unused_conns/1" do + test "crf is equalent, sorting by reference", %{name: name} do + Connections.add_conn(name, "1", %Conn{ + conn_state: :idle, + last_reference: now() - 1 + }) + + Connections.add_conn(name, "2", %Conn{ + conn_state: :idle, + last_reference: now() + }) + + assert [{"1", _unused_conn} | _others] = Connections.get_unused_conns(name) + end + + test "reference is equalent, sorting by crf", %{name: name} do + Connections.add_conn(name, "1", %Conn{ + conn_state: :idle, + crf: 1.999 + }) + + Connections.add_conn(name, "2", %Conn{ + conn_state: :idle, + crf: 2 + }) + + assert [{"1", _unused_conn} | _others] = Connections.get_unused_conns(name) + end + + test "higher crf and lower reference", %{name: name} do + Connections.add_conn(name, "1", %Conn{ + conn_state: :idle, + crf: 3, + last_reference: now() - 1 + }) + + Connections.add_conn(name, "2", %Conn{ + conn_state: :idle, + crf: 2, + last_reference: now() + }) + + assert [{"2", _unused_conn} | _others] = Connections.get_unused_conns(name) + end + + test "lower crf and lower reference", %{name: name} do + Connections.add_conn(name, "1", %Conn{ + conn_state: :idle, + crf: 1.99, + last_reference: now() - 1 + }) + + Connections.add_conn(name, "2", %Conn{ + conn_state: :idle, + crf: 2, + last_reference: now() + }) + + assert [{"1", _unused_conn} | _others] = Connections.get_unused_conns(name) + end + end + + test "count/1" do + name = :test_count + {:ok, _} = Connections.start_link({name, [checkin_timeout: 150]}) + assert Connections.count(name) == 0 + Connections.add_conn(name, "1", %Conn{conn: self()}) + assert Connections.count(name) == 1 + Connections.remove_conn(name, "1") + assert Connections.count(name) == 0 + end +end diff --git a/test/reverse_proxy_test.exs b/test/reverse_proxy/reverse_proxy_test.exs similarity index 76% rename from test/reverse_proxy_test.exs rename to test/reverse_proxy/reverse_proxy_test.exs index 87c6aca4e..c677066b3 100644 --- a/test/reverse_proxy_test.exs +++ b/test/reverse_proxy/reverse_proxy_test.exs @@ -4,13 +4,16 @@ defmodule Pleroma.ReverseProxyTest do use Pleroma.Web.ConnCase, async: true + import ExUnit.CaptureLog import Mox + alias Pleroma.ReverseProxy alias Pleroma.ReverseProxy.ClientMock + alias Plug.Conn setup_all do - {:ok, _} = Registry.start_link(keys: :unique, name: Pleroma.ReverseProxy.ClientMock) + {:ok, _} = Registry.start_link(keys: :unique, name: ClientMock) :ok end @@ -21,7 +24,7 @@ defp user_agent_mock(user_agent, invokes) do ClientMock |> expect(:request, fn :get, url, _, _, _ -> - Registry.register(Pleroma.ReverseProxy.ClientMock, url, 0) + Registry.register(ClientMock, url, 0) {:ok, 200, [ @@ -29,14 +32,14 @@ defp user_agent_mock(user_agent, invokes) do {"content-length", byte_size(json) |> to_string()} ], %{url: url}} end) - |> expect(:stream_body, invokes, fn %{url: url} -> - case Registry.lookup(Pleroma.ReverseProxy.ClientMock, url) do + |> expect(:stream_body, invokes, fn %{url: url} = client -> + case Registry.lookup(ClientMock, url) do [{_, 0}] -> - Registry.update_value(Pleroma.ReverseProxy.ClientMock, url, &(&1 + 1)) - {:ok, json} + Registry.update_value(ClientMock, url, &(&1 + 1)) + {:ok, json, client} [{_, 1}] -> - Registry.unregister(Pleroma.ReverseProxy.ClientMock, url) + Registry.unregister(ClientMock, url) :done end end) @@ -78,7 +81,39 @@ test "closed connection", %{conn: conn} do assert conn.halted end - describe "max_body " do + defp stream_mock(invokes, with_close? \\ false) do + ClientMock + |> expect(:request, fn :get, "/stream-bytes/" <> length, _, _, _ -> + Registry.register(ClientMock, "/stream-bytes/" <> length, 0) + + {:ok, 200, [{"content-type", "application/octet-stream"}], + %{url: "/stream-bytes/" <> length}} + end) + |> expect(:stream_body, invokes, fn %{url: "/stream-bytes/" <> length} = client -> + max = String.to_integer(length) + + case Registry.lookup(ClientMock, "/stream-bytes/" <> length) do + [{_, current}] when current < max -> + Registry.update_value( + ClientMock, + "/stream-bytes/" <> length, + &(&1 + 10) + ) + + {:ok, "0123456789", client} + + [{_, ^max}] -> + Registry.unregister(ClientMock, "/stream-bytes/" <> length) + :done + end + end) + + if with_close? do + expect(ClientMock, :close, fn _ -> :ok end) + end + end + + describe "max_body" do test "length returns error if content-length more than option", %{conn: conn} do user_agent_mock("hackney/1.15.1", 0) @@ -94,38 +129,6 @@ test "length returns error if content-length more than option", %{conn: conn} do end) == "" end - defp stream_mock(invokes, with_close? \\ false) do - ClientMock - |> expect(:request, fn :get, "/stream-bytes/" <> length, _, _, _ -> - Registry.register(Pleroma.ReverseProxy.ClientMock, "/stream-bytes/" <> length, 0) - - {:ok, 200, [{"content-type", "application/octet-stream"}], - %{url: "/stream-bytes/" <> length}} - end) - |> expect(:stream_body, invokes, fn %{url: "/stream-bytes/" <> length} -> - max = String.to_integer(length) - - case Registry.lookup(Pleroma.ReverseProxy.ClientMock, "/stream-bytes/" <> length) do - [{_, current}] when current < max -> - Registry.update_value( - Pleroma.ReverseProxy.ClientMock, - "/stream-bytes/" <> length, - &(&1 + 10) - ) - - {:ok, "0123456789"} - - [{_, ^max}] -> - Registry.unregister(Pleroma.ReverseProxy.ClientMock, "/stream-bytes/" <> length) - :done - end - end) - - if with_close? do - expect(ClientMock, :close, fn _ -> :ok end) - end - end - test "max_body_length returns error if streaming body more than that option", %{conn: conn} do stream_mock(3, true) @@ -214,24 +217,24 @@ test "streaming", %{conn: conn} do conn = ReverseProxy.call(conn, "/stream-bytes/200") assert conn.state == :chunked assert byte_size(conn.resp_body) == 200 - assert Plug.Conn.get_resp_header(conn, "content-type") == ["application/octet-stream"] + assert Conn.get_resp_header(conn, "content-type") == ["application/octet-stream"] end defp headers_mock(_) do ClientMock |> expect(:request, fn :get, "/headers", headers, _, _ -> - Registry.register(Pleroma.ReverseProxy.ClientMock, "/headers", 0) + Registry.register(ClientMock, "/headers", 0) {:ok, 200, [{"content-type", "application/json"}], %{url: "/headers", headers: headers}} end) - |> expect(:stream_body, 2, fn %{url: url, headers: headers} -> - case Registry.lookup(Pleroma.ReverseProxy.ClientMock, url) do + |> expect(:stream_body, 2, fn %{url: url, headers: headers} = client -> + case Registry.lookup(ClientMock, url) do [{_, 0}] -> - Registry.update_value(Pleroma.ReverseProxy.ClientMock, url, &(&1 + 1)) + Registry.update_value(ClientMock, url, &(&1 + 1)) headers = for {k, v} <- headers, into: %{}, do: {String.capitalize(k), v} - {:ok, Jason.encode!(%{headers: headers})} + {:ok, Jason.encode!(%{headers: headers}), client} [{_, 1}] -> - Registry.unregister(Pleroma.ReverseProxy.ClientMock, url) + Registry.unregister(ClientMock, url) :done end end) @@ -244,7 +247,7 @@ defp headers_mock(_) do test "header passes", %{conn: conn} do conn = - Plug.Conn.put_req_header( + Conn.put_req_header( conn, "accept", "text/html" @@ -257,7 +260,7 @@ test "header passes", %{conn: conn} do test "header is filtered", %{conn: conn} do conn = - Plug.Conn.put_req_header( + Conn.put_req_header( conn, "accept-language", "en-US" @@ -290,18 +293,18 @@ test "add cache-control", %{conn: conn} do defp disposition_headers_mock(headers) do ClientMock |> expect(:request, fn :get, "/disposition", _, _, _ -> - Registry.register(Pleroma.ReverseProxy.ClientMock, "/disposition", 0) + Registry.register(ClientMock, "/disposition", 0) {:ok, 200, headers, %{url: "/disposition"}} end) - |> expect(:stream_body, 2, fn %{url: "/disposition"} -> - case Registry.lookup(Pleroma.ReverseProxy.ClientMock, "/disposition") do + |> expect(:stream_body, 2, fn %{url: "/disposition"} = client -> + case Registry.lookup(ClientMock, "/disposition") do [{_, 0}] -> - Registry.update_value(Pleroma.ReverseProxy.ClientMock, "/disposition", &(&1 + 1)) - {:ok, ""} + Registry.update_value(ClientMock, "/disposition", &(&1 + 1)) + {:ok, "", client} [{_, 1}] -> - Registry.unregister(Pleroma.ReverseProxy.ClientMock, "/disposition") + Registry.unregister(ClientMock, "/disposition") :done end end) diff --git a/test/signature_test.exs b/test/signature_test.exs index 04736d8b9..a7a75aa4d 100644 --- a/test/signature_test.exs +++ b/test/signature_test.exs @@ -19,12 +19,7 @@ defmodule Pleroma.SignatureTest do @private_key "-----BEGIN RSA PRIVATE KEY-----\nMIIEpQIBAAKCAQEA48qb4v6kqigZutO9Ot0wkp27GIF2LiVaADgxQORZozZR63jH\nTaoOrS3Xhngbgc8SSOhfXET3omzeCLqaLNfXnZ8OXmuhJfJSU6mPUvmZ9QdT332j\nfN/g3iWGhYMf/M9ftCKh96nvFVO/tMruzS9xx7tkrfJjehdxh/3LlJMMImPtwcD7\nkFXwyt1qZTAU6Si4oQAJxRDQXHp1ttLl3Ob829VM7IKkrVmY8TD+JSlV0jtVJPj6\n1J19ytKTx/7UaucYvb9HIiBpkuiy5n/irDqKLVf5QEdZoNCdojOZlKJmTLqHhzKP\n3E9TxsUjhrf4/EqegNc/j982RvOxeu4i40zMQwIDAQABAoIBAQDH5DXjfh21i7b4\ncXJuw0cqget617CDUhemdakTDs9yH+rHPZd3mbGDWuT0hVVuFe4vuGpmJ8c+61X0\nRvugOlBlavxK8xvYlsqTzAmPgKUPljyNtEzQ+gz0I+3mH2jkin2rL3D+SksZZgKm\nfiYMPIQWB2WUF04gB46DDb2mRVuymGHyBOQjIx3WC0KW2mzfoFUFRlZEF+Nt8Ilw\nT+g/u0aZ1IWoszbsVFOEdghgZET0HEarum0B2Je/ozcPYtwmU10iBANGMKdLqaP/\nj954BPunrUf6gmlnLZKIKklJj0advx0NA+cL79+zeVB3zexRYSA5o9q0WPhiuTwR\n/aedWHnBAoGBAP0sDWBAM1Y4TRAf8ZI9PcztwLyHPzfEIqzbObJJnx1icUMt7BWi\n+/RMOnhrlPGE1kMhOqSxvXYN3u+eSmWTqai2sSH5Hdw2EqnrISSTnwNUPINX7fHH\njEkgmXQ6ixE48SuBZnb4w1EjdB/BA6/sjL+FNhggOc87tizLTkMXmMtTAoGBAOZV\n+wPuAMBDBXmbmxCuDIjoVmgSlgeRunB1SA8RCPAFAiUo3+/zEgzW2Oz8kgI+xVwM\n33XkLKrWG1Orhpp6Hm57MjIc5MG+zF4/YRDpE/KNG9qU1tiz0UD5hOpIU9pP4bR/\ngxgPxZzvbk4h5BfHWLpjlk8UUpgk6uxqfti48c1RAoGBALBOKDZ6HwYRCSGMjUcg\n3NPEUi84JD8qmFc2B7Tv7h2he2ykIz9iFAGpwCIyETQsJKX1Ewi0OlNnD3RhEEAy\nl7jFGQ+mkzPSeCbadmcpYlgIJmf1KN/x7fDTAepeBpCEzfZVE80QKbxsaybd3Dp8\nCfwpwWUFtBxr4c7J+gNhAGe/AoGAPn8ZyqkrPv9wXtyfqFjxQbx4pWhVmNwrkBPi\nZ2Qh3q4dNOPwTvTO8vjghvzIyR8rAZzkjOJKVFgftgYWUZfM5gE7T2mTkBYq8W+U\n8LetF+S9qAM2gDnaDx0kuUTCq7t87DKk6URuQ/SbI0wCzYjjRD99KxvChVGPBHKo\n1DjqMuECgYEAgJGNm7/lJCS2wk81whfy/ttKGsEIkyhPFYQmdGzSYC5aDc2gp1R3\nxtOkYEvdjfaLfDGEa4UX8CHHF+w3t9u8hBtcdhMH6GYb9iv6z0VBTt4A/11HUR49\n3Z7TQ18Iyh3jAUCzFV9IJlLIExq5Y7P4B3ojWFBN607sDCt8BMPbDYs=\n-----END RSA PRIVATE KEY-----" - @public_key %{ - "id" => "https://mastodon.social/users/lambadalambda#main-key", - "owner" => "https://mastodon.social/users/lambadalambda", - "publicKeyPem" => - "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw0P/Tq4gb4G/QVuMGbJo\nC/AfMNcv+m7NfrlOwkVzcU47jgESuYI4UtJayissCdBycHUnfVUd9qol+eznSODz\nCJhfJloqEIC+aSnuEPGA0POtWad6DU0E6/Ho5zQn5WAWUwbRQqowbrsm/GHo2+3v\neR5jGenwA6sYhINg/c3QQbksyV0uJ20Umyx88w8+TJuv53twOfmyDWuYNoQ3y5cc\nHKOZcLHxYOhvwg3PFaGfFHMFiNmF40dTXt9K96r7sbzc44iLD+VphbMPJEjkMuf8\nPGEFOBzy8pm3wJZw2v32RNW2VESwMYyqDzwHXGSq1a73cS7hEnc79gXlELsK04L9\nQQIDAQAB\n-----END PUBLIC KEY-----\n" - } + @public_key "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw0P/Tq4gb4G/QVuMGbJo\nC/AfMNcv+m7NfrlOwkVzcU47jgESuYI4UtJayissCdBycHUnfVUd9qol+eznSODz\nCJhfJloqEIC+aSnuEPGA0POtWad6DU0E6/Ho5zQn5WAWUwbRQqowbrsm/GHo2+3v\neR5jGenwA6sYhINg/c3QQbksyV0uJ20Umyx88w8+TJuv53twOfmyDWuYNoQ3y5cc\nHKOZcLHxYOhvwg3PFaGfFHMFiNmF40dTXt9K96r7sbzc44iLD+VphbMPJEjkMuf8\nPGEFOBzy8pm3wJZw2v32RNW2VESwMYyqDzwHXGSq1a73cS7hEnc79gXlELsK04L9\nQQIDAQAB\n-----END PUBLIC KEY-----\n" @rsa_public_key { :RSAPublicKey, @@ -42,19 +37,20 @@ defp make_fake_conn(key_id), test "it returns key" do expected_result = {:ok, @rsa_public_key} - user = insert(:user, source_data: %{"publicKey" => @public_key}) + user = insert(:user, public_key: @public_key) assert Signature.fetch_public_key(make_fake_conn(user.ap_id)) == expected_result end test "it returns error when not found user" do assert capture_log(fn -> - assert Signature.fetch_public_key(make_fake_conn("test-ap_id")) == {:error, :error} + assert Signature.fetch_public_key(make_fake_conn("https://test-ap-id")) == + {:error, :error} end) =~ "[error] Could not decode user" end - test "it returns error if public key is empty" do - user = insert(:user, source_data: %{"publicKey" => %{}}) + test "it returns error if public key is nil" do + user = insert(:user, public_key: nil) assert Signature.fetch_public_key(make_fake_conn(user.ap_id)) == {:error, :error} end @@ -69,7 +65,7 @@ test "it returns key" do test "it returns error when not found user" do assert capture_log(fn -> - {:error, _} = Signature.refetch_public_key(make_fake_conn("test-ap_id")) + {:error, _} = Signature.refetch_public_key(make_fake_conn("https://test-ap_id")) end) =~ "[error] Could not decode user" end end @@ -105,12 +101,21 @@ test "it returns error" do describe "key_id_to_actor_id/1" do test "it properly deduces the actor id for misskey" do assert Signature.key_id_to_actor_id("https://example.com/users/1234/publickey") == - "https://example.com/users/1234" + {:ok, "https://example.com/users/1234"} end test "it properly deduces the actor id for mastodon and pleroma" do assert Signature.key_id_to_actor_id("https://example.com/users/1234#main-key") == - "https://example.com/users/1234" + {:ok, "https://example.com/users/1234"} + end + + test "it calls webfinger for 'acct:' accounts" do + with_mock(Pleroma.Web.WebFinger, + finger: fn _ -> %{"ap_id" => "https://gensokyo.2hu/users/raymoo"} end + ) do + assert Signature.key_id_to_actor_id("acct:raymoo@gensokyo.2hu") == + {:ok, "https://gensokyo.2hu/users/raymoo"} + end end end diff --git a/test/stat_test.exs b/test/stats_test.exs similarity index 63% rename from test/stat_test.exs rename to test/stats_test.exs index 33b77e7e7..4b76e2e78 100644 --- a/test/stat_test.exs +++ b/test/stats_test.exs @@ -2,36 +2,46 @@ # Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only -defmodule Pleroma.StateTest do +defmodule Pleroma.StatsTest do use Pleroma.DataCase import Pleroma.Factory alias Pleroma.Web.CommonAPI + describe "user count" do + test "it ignores internal users" do + _user = insert(:user, local: true) + _internal = insert(:user, local: true, nickname: nil) + _internal = Pleroma.Web.ActivityPub.Relay.get_actor() + + assert match?(%{stats: %{user_count: 1}}, Pleroma.Stats.calculate_stat_data()) + end + end + describe "status visibility count" do test "on new status" do user = insert(:user) other_user = insert(:user) - CommonAPI.post(user, %{"visibility" => "public", "status" => "hey"}) + CommonAPI.post(user, %{visibility: "public", status: "hey"}) Enum.each(0..1, fn _ -> CommonAPI.post(user, %{ - "visibility" => "unlisted", - "status" => "hey" + visibility: "unlisted", + status: "hey" }) end) Enum.each(0..2, fn _ -> CommonAPI.post(user, %{ - "visibility" => "direct", - "status" => "hey @#{other_user.nickname}" + visibility: "direct", + status: "hey @#{other_user.nickname}" }) end) Enum.each(0..3, fn _ -> CommonAPI.post(user, %{ - "visibility" => "private", - "status" => "hey" + visibility: "private", + status: "hey" }) end) @@ -41,7 +51,7 @@ test "on new status" do test "on status delete" do user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"visibility" => "public", "status" => "hey"}) + {:ok, activity} = CommonAPI.post(user, %{visibility: "public", status: "hey"}) assert %{public: 1} = Pleroma.Stats.get_status_visibility_count() CommonAPI.delete(activity.id, user) assert %{public: 0} = Pleroma.Stats.get_status_visibility_count() @@ -49,18 +59,18 @@ test "on status delete" do test "on status visibility update" do user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"visibility" => "public", "status" => "hey"}) + {:ok, activity} = CommonAPI.post(user, %{visibility: "public", status: "hey"}) assert %{public: 1, private: 0} = Pleroma.Stats.get_status_visibility_count() - {:ok, _} = CommonAPI.update_activity_scope(activity.id, %{"visibility" => "private"}) + {:ok, _} = CommonAPI.update_activity_scope(activity.id, %{visibility: "private"}) assert %{public: 0, private: 1} = Pleroma.Stats.get_status_visibility_count() end test "doesn't count unrelated activities" do user = insert(:user) other_user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"visibility" => "public", "status" => "hey"}) + {:ok, activity} = CommonAPI.post(user, %{visibility: "public", status: "hey"}) _ = CommonAPI.follow(user, other_user) - CommonAPI.favorite(activity.id, other_user) + CommonAPI.favorite(other_user, activity.id) CommonAPI.repeat(activity.id, other_user) assert %{direct: 0, private: 0, public: 1, unlisted: 0} = diff --git a/test/support/api_spec_helpers.ex b/test/support/api_spec_helpers.ex new file mode 100644 index 000000000..46388f92c --- /dev/null +++ b/test/support/api_spec_helpers.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.Tests.ApiSpecHelpers do + @moduledoc """ + OpenAPI spec test helpers + """ + + import ExUnit.Assertions + + alias OpenApiSpex.Cast.Error + alias OpenApiSpex.Reference + alias OpenApiSpex.Schema + + def assert_schema(value, schema) do + api_spec = Pleroma.Web.ApiSpec.spec() + + case OpenApiSpex.cast_value(value, schema, api_spec) do + {:ok, data} -> + data + + {:error, errors} -> + errors = + Enum.map(errors, fn error -> + message = Error.message(error) + path = Error.path_to_string(error) + "#{message} at #{path}" + end) + + flunk( + "Value does not conform to schema #{schema.title}: #{Enum.join(errors, "\n")}\n#{ + inspect(value) + }" + ) + end + end + + def resolve_schema(%Schema{} = schema), do: schema + + def resolve_schema(%Reference{} = ref) do + schemas = Pleroma.Web.ApiSpec.spec().components.schemas + Reference.resolve_schema(ref, schemas) + end + + def api_operations do + paths = Pleroma.Web.ApiSpec.spec().paths + + Enum.flat_map(paths, fn {_, path_item} -> + path_item + |> Map.take([:delete, :get, :head, :options, :patch, :post, :put, :trace]) + |> Map.values() + |> Enum.reject(&is_nil/1) + end) + |> Enum.uniq() + end +end diff --git a/test/support/builders/activity_builder.ex b/test/support/builders/activity_builder.ex index 6e5a8e059..7c4950bfa 100644 --- a/test/support/builders/activity_builder.ex +++ b/test/support/builders/activity_builder.ex @@ -21,7 +21,15 @@ def build(data \\ %{}, opts \\ %{}) do def insert(data \\ %{}, opts \\ %{}) do activity = build(data, opts) - ActivityPub.insert(activity) + + case ActivityPub.insert(activity) do + ok = {:ok, activity} -> + ActivityPub.notify_and_stream(activity) + ok + + error -> + error + end end def insert_list(times, data \\ %{}, opts \\ %{}) do diff --git a/test/support/builders/user_builder.ex b/test/support/builders/user_builder.ex index fcfea666f..0c687c029 100644 --- a/test/support/builders/user_builder.ex +++ b/test/support/builders/user_builder.ex @@ -7,10 +7,11 @@ def build(data \\ %{}) do email: "test@example.org", name: "Test Name", nickname: "testname", - password_hash: Comeonin.Pbkdf2.hashpwsalt("test"), + password_hash: Pbkdf2.hash_pwd_salt("test"), bio: "A tester.", ap_id: "some id", last_digest_emailed_at: NaiveDateTime.truncate(NaiveDateTime.utc_now(), :second), + multi_factor_authentication_settings: %Pleroma.MFA.Settings{}, notification_settings: %Pleroma.User.NotificationSetting{} } diff --git a/test/support/captcha_mock.ex b/test/support/captcha_mock.ex index 6dae94edf..7b0c1d5af 100644 --- a/test/support/captcha_mock.ex +++ b/test/support/captcha_mock.ex @@ -6,12 +6,16 @@ defmodule Pleroma.Captcha.Mock do alias Pleroma.Captcha.Service @behaviour Service + @solution "63615261b77f5354fb8c4e4986477555" + + def solution, do: @solution + @impl Service def new, do: %{ type: :mock, token: "afa1815e14e29355e6c8f6b143a39fa2", - answer_data: "63615261b77f5354fb8c4e4986477555", + answer_data: @solution, url: "https://example.org/captcha.png" } diff --git a/test/support/conn_case.ex b/test/support/conn_case.ex index 064874201..b23918dd1 100644 --- a/test/support/conn_case.ex +++ b/test/support/conn_case.ex @@ -51,6 +51,60 @@ defp oauth_access(scopes, opts \\ []) do %{user: user, token: token, conn: conn} end + defp request_content_type(%{conn: conn}) do + conn = put_req_header(conn, "content-type", "multipart/form-data") + [conn: conn] + end + + defp json_response_and_validate_schema( + %{ + private: %{ + open_api_spex: %{operation_id: op_id, operation_lookup: lookup, spec: spec} + } + } = conn, + status + ) do + content_type = + conn + |> Plug.Conn.get_resp_header("content-type") + |> List.first() + |> String.split(";") + |> List.first() + + status = Plug.Conn.Status.code(status) + + unless lookup[op_id].responses[status] do + err = "Response schema not found for #{status} #{conn.method} #{conn.request_path}" + flunk(err) + end + + schema = lookup[op_id].responses[status].content[content_type].schema + json = json_response(conn, status) + + case OpenApiSpex.cast_value(json, schema, spec) do + {:ok, _data} -> + json + + {:error, errors} -> + errors = + Enum.map(errors, fn error -> + message = OpenApiSpex.Cast.Error.message(error) + path = OpenApiSpex.Cast.Error.path_to_string(error) + "#{message} at #{path}" + end) + + flunk( + "Response does not conform to schema of #{op_id} operation: #{ + Enum.join(errors, "\n") + }\n#{inspect(json)}" + ) + end + end + + defp json_response_and_validate_schema(conn, _status) do + flunk("Response schema not found for #{conn.method} #{conn.request_path} #{conn.status}") + end + defp ensure_federating_or_authenticated(conn, url, user) do initial_setting = Config.get([:instance, :federating]) on_exit(fn -> Config.put([:instance, :federating], initial_setting) end) @@ -85,7 +139,11 @@ defp ensure_federating_or_authenticated(conn, url, user) do end if tags[:needs_streamer] do - start_supervised(Pleroma.Web.Streamer.supervisor()) + start_supervised(%{ + id: Pleroma.Web.Streamer.registry(), + start: + {Registry, :start_link, [[keys: :duplicate, name: Pleroma.Web.Streamer.registry()]]} + }) end {:ok, conn: Phoenix.ConnTest.build_conn()} diff --git a/test/support/data_case.ex b/test/support/data_case.ex index 1669f2520..ba8848952 100644 --- a/test/support/data_case.ex +++ b/test/support/data_case.ex @@ -40,7 +40,11 @@ defmodule Pleroma.DataCase do end if tags[:needs_streamer] do - start_supervised(Pleroma.Web.Streamer.supervisor()) + start_supervised(%{ + id: Pleroma.Web.Streamer.registry(), + start: + {Registry, :start_link, [[keys: :duplicate, name: Pleroma.Web.Streamer.registry()]]} + }) end :ok diff --git a/test/support/factory.ex b/test/support/factory.ex index af639b6cd..6e3676aca 100644 --- a/test/support/factory.ex +++ b/test/support/factory.ex @@ -29,10 +29,13 @@ def user_factory do name: sequence(:name, &"Test テスト User #{&1}"), email: sequence(:email, &"user#{&1}@example.com"), nickname: sequence(:nickname, &"nick#{&1}"), - password_hash: Comeonin.Pbkdf2.hashpwsalt("test"), + password_hash: Pbkdf2.hash_pwd_salt("test"), bio: sequence(:bio, &"Tester Number #{&1}"), last_digest_emailed_at: NaiveDateTime.utc_now(), - notification_settings: %Pleroma.User.NotificationSetting{} + last_refreshed_at: NaiveDateTime.utc_now(), + notification_settings: %Pleroma.User.NotificationSetting{}, + multi_factor_authentication_settings: %Pleroma.MFA.Settings{}, + ap_enabled: true } %{ @@ -294,7 +297,7 @@ def follow_activity_factory do def oauth_app_factory do %Pleroma.Web.OAuth.App{ - client_name: "Some client", + client_name: sequence(:client_name, &"Some client #{&1}"), redirect_uris: "https://example.com/callback", scopes: ["read", "write", "follow", "push", "admin"], website: "https://example.com", @@ -421,4 +424,13 @@ def marker_factory do last_read_id: "1" } end + + def mfa_token_factory do + %Pleroma.MFA.Token{ + token: :crypto.strong_rand_bytes(32) |> Base.url_encode64(padding: false), + authorization: build(:oauth_authorization), + valid_until: NaiveDateTime.add(NaiveDateTime.utc_now(), 60 * 10), + user: build(:user) + } + end end diff --git a/test/support/helpers.ex b/test/support/helpers.ex index e68e9bfd2..26281b45e 100644 --- a/test/support/helpers.ex +++ b/test/support/helpers.ex @@ -40,12 +40,18 @@ defmacro __using__(_opts) do clear_config: 2 ] - def to_datetime(naive_datetime) do + def to_datetime(%NaiveDateTime{} = naive_datetime) do naive_datetime |> DateTime.from_naive!("Etc/UTC") |> DateTime.truncate(:second) end + def to_datetime(datetime) when is_binary(datetime) do + datetime + |> NaiveDateTime.from_iso8601!() + |> to_datetime() + end + def collect_ids(collection) do collection |> Enum.map(& &1.id) diff --git a/test/support/http_request_mock.ex b/test/support/http_request_mock.ex index e72638814..3d5128835 100644 --- a/test/support/http_request_mock.ex +++ b/test/support/http_request_mock.ex @@ -107,7 +107,7 @@ def get( "https://osada.macgirvin.com/.well-known/webfinger?resource=acct:mike@osada.macgirvin.com", _, _, - Accept: "application/xrd+xml,application/jrd+json" + [{"accept", "application/xrd+xml,application/jrd+json"}] ) do {:ok, %Tesla.Env{ @@ -120,7 +120,7 @@ def get( "https://social.heldscal.la/.well-known/webfinger?resource=https://social.heldscal.la/user/29191", _, _, - Accept: "application/xrd+xml,application/jrd+json" + [{"accept", "application/xrd+xml,application/jrd+json"}] ) do {:ok, %Tesla.Env{ @@ -141,7 +141,7 @@ def get( "https://pawoo.net/.well-known/webfinger?resource=acct:https://pawoo.net/users/pekorino", _, _, - Accept: "application/xrd+xml,application/jrd+json" + [{"accept", "application/xrd+xml,application/jrd+json"}] ) do {:ok, %Tesla.Env{ @@ -167,7 +167,7 @@ def get( "https://social.stopwatchingus-heidelberg.de/.well-known/webfinger?resource=acct:https://social.stopwatchingus-heidelberg.de/user/18330", _, _, - Accept: "application/xrd+xml,application/jrd+json" + [{"accept", "application/xrd+xml,application/jrd+json"}] ) do {:ok, %Tesla.Env{ @@ -188,7 +188,7 @@ def get( "https://mamot.fr/.well-known/webfinger?resource=acct:https://mamot.fr/users/Skruyb", _, _, - Accept: "application/xrd+xml,application/jrd+json" + [{"accept", "application/xrd+xml,application/jrd+json"}] ) do {:ok, %Tesla.Env{ @@ -201,7 +201,7 @@ def get( "https://social.heldscal.la/.well-known/webfinger?resource=nonexistant@social.heldscal.la", _, _, - Accept: "application/xrd+xml,application/jrd+json" + [{"accept", "application/xrd+xml,application/jrd+json"}] ) do {:ok, %Tesla.Env{ @@ -211,10 +211,10 @@ def get( end def get( - "https://squeet.me/xrd/?uri=lain@squeet.me", + "https://squeet.me/xrd/?uri=acct:lain@squeet.me", _, _, - Accept: "application/xrd+xml,application/jrd+json" + [{"accept", "application/xrd+xml,application/jrd+json"}] ) do {:ok, %Tesla.Env{ @@ -227,7 +227,7 @@ def get( "https://mst3k.interlinked.me/users/luciferMysticus", _, _, - Accept: "application/activity+json" + [{"accept", "application/activity+json"}] ) do {:ok, %Tesla.Env{ @@ -248,7 +248,7 @@ def get( "https://hubzilla.example.org/channel/kaniini", _, _, - Accept: "application/activity+json" + [{"accept", "application/activity+json"}] ) do {:ok, %Tesla.Env{ @@ -257,7 +257,7 @@ def get( }} end - def get("https://niu.moe/users/rye", _, _, Accept: "application/activity+json") do + def get("https://niu.moe/users/rye", _, _, [{"accept", "application/activity+json"}]) do {:ok, %Tesla.Env{ status: 200, @@ -265,7 +265,7 @@ def get("https://niu.moe/users/rye", _, _, Accept: "application/activity+json") }} end - def get("https://n1u.moe/users/rye", _, _, Accept: "application/activity+json") do + def get("https://n1u.moe/users/rye", _, _, [{"accept", "application/activity+json"}]) do {:ok, %Tesla.Env{ status: 200, @@ -284,7 +284,7 @@ def get("http://mastodon.example.org/users/admin/statuses/100787282858396771", _ }} end - def get("https://puckipedia.com/", _, _, Accept: "application/activity+json") do + def get("https://puckipedia.com/", _, _, [{"accept", "application/activity+json"}]) do {:ok, %Tesla.Env{ status: 200, @@ -308,9 +308,25 @@ def get("https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3" }} end - def get("https://mobilizon.org/events/252d5816-00a3-4a89-a66f-15bf65c33e39", _, _, - Accept: "application/activity+json" - ) do + def get("https://peertube.social/accounts/craigmaloney", _, _, _) do + {:ok, + %Tesla.Env{ + status: 200, + body: File.read!("test/fixtures/tesla_mock/craigmaloney.json") + }} + end + + def get("https://peertube.social/videos/watch/278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe", _, _, _) do + {:ok, + %Tesla.Env{ + status: 200, + body: File.read!("test/fixtures/tesla_mock/peertube-social.json") + }} + end + + def get("https://mobilizon.org/events/252d5816-00a3-4a89-a66f-15bf65c33e39", _, _, [ + {"accept", "application/activity+json"} + ]) do {:ok, %Tesla.Env{ status: 200, @@ -318,7 +334,7 @@ def get("https://mobilizon.org/events/252d5816-00a3-4a89-a66f-15bf65c33e39", _, }} end - def get("https://mobilizon.org/@tcit", _, _, Accept: "application/activity+json") do + def get("https://mobilizon.org/@tcit", _, _, [{"accept", "application/activity+json"}]) do {:ok, %Tesla.Env{ status: 200, @@ -358,7 +374,7 @@ def get("https://wedistribute.org/wp-json/pterotype/v1/actor/-blog", _, _, _) do }} end - def get("http://mastodon.example.org/users/admin", _, _, Accept: "application/activity+json") do + def get("http://mastodon.example.org/users/admin", _, _, _) do {:ok, %Tesla.Env{ status: 200, @@ -366,7 +382,9 @@ def get("http://mastodon.example.org/users/admin", _, _, Accept: "application/ac }} end - def get("http://mastodon.example.org/users/relay", _, _, Accept: "application/activity+json") do + def get("http://mastodon.example.org/users/relay", _, _, [ + {"accept", "application/activity+json"} + ]) do {:ok, %Tesla.Env{ status: 200, @@ -374,7 +392,9 @@ def get("http://mastodon.example.org/users/relay", _, _, Accept: "application/ac }} end - def get("http://mastodon.example.org/users/gargron", _, _, Accept: "application/activity+json") do + def get("http://mastodon.example.org/users/gargron", _, _, [ + {"accept", "application/activity+json"} + ]) do {:error, :nxdomain} end @@ -557,7 +577,7 @@ def get( "http://mastodon.example.org/@admin/99541947525187367", _, _, - Accept: "application/activity+json" + _ ) do {:ok, %Tesla.Env{ @@ -582,7 +602,7 @@ def get("https://shitposter.club/notice/7369654", _, _, _) do }} end - def get("https://mstdn.io/users/mayuutann", _, _, Accept: "application/activity+json") do + def get("https://mstdn.io/users/mayuutann", _, _, [{"accept", "application/activity+json"}]) do {:ok, %Tesla.Env{ status: 200, @@ -594,7 +614,7 @@ def get( "https://mstdn.io/users/mayuutann/statuses/99568293732299394", _, _, - Accept: "application/activity+json" + [{"accept", "application/activity+json"}] ) do {:ok, %Tesla.Env{ @@ -614,7 +634,7 @@ def get("https://pleroma.soykaf.com/users/lain/feed.atom", _, _, _) do }} end - def get(url, _, _, Accept: "application/xrd+xml,application/jrd+json") + 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", "https://pleroma.soykaf.com/.well-known/webfinger?resource=https://pleroma.soykaf.com/users/lain" @@ -641,7 +661,7 @@ def get( "https://shitposter.club/.well-known/webfinger?resource=https://shitposter.club/user/1", _, _, - Accept: "application/xrd+xml,application/jrd+json" + [{"accept", "application/xrd+xml,application/jrd+json"}] ) do {:ok, %Tesla.Env{ @@ -685,7 +705,7 @@ def get( "https://shitposter.club/.well-known/webfinger?resource=https://shitposter.club/user/5381", _, _, - Accept: "application/xrd+xml,application/jrd+json" + [{"accept", "application/xrd+xml,application/jrd+json"}] ) do {:ok, %Tesla.Env{ @@ -738,7 +758,7 @@ def get( "https://social.sakamoto.gq/.well-known/webfinger?resource=https://social.sakamoto.gq/users/eal", _, _, - Accept: "application/xrd+xml,application/jrd+json" + [{"accept", "application/xrd+xml,application/jrd+json"}] ) do {:ok, %Tesla.Env{ @@ -751,7 +771,7 @@ def get( "https://social.sakamoto.gq/objects/0ccc1a2c-66b0-4305-b23a-7f7f2b040056", _, _, - Accept: "application/atom+xml" + [{"accept", "application/atom+xml"}] ) do {:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/tesla_mock/sakamoto.atom")}} end @@ -768,7 +788,7 @@ def get( "https://mastodon.social/.well-known/webfinger?resource=https://mastodon.social/users/lambadalambda", _, _, - Accept: "application/xrd+xml,application/jrd+json" + [{"accept", "application/xrd+xml,application/jrd+json"}] ) do {:ok, %Tesla.Env{ @@ -790,7 +810,7 @@ def get( "http://gs.example.org/.well-known/webfinger?resource=http://gs.example.org:4040/index.php/user/1", _, _, - Accept: "application/xrd+xml,application/jrd+json" + [{"accept", "application/xrd+xml,application/jrd+json"}] ) do {:ok, %Tesla.Env{ @@ -804,7 +824,7 @@ def get( "http://gs.example.org:4040/index.php/user/1", _, _, - Accept: "application/activity+json" + [{"accept", "application/activity+json"}] ) do {:ok, %Tesla.Env{status: 406, body: ""}} end @@ -840,7 +860,7 @@ def get( "https://squeet.me/xrd?uri=lain@squeet.me", _, _, - Accept: "application/xrd+xml,application/jrd+json" + [{"accept", "application/xrd+xml,application/jrd+json"}] ) do {:ok, %Tesla.Env{ @@ -850,10 +870,10 @@ def get( end def get( - "https://social.heldscal.la/.well-known/webfinger?resource=shp@social.heldscal.la", + "https://social.heldscal.la/.well-known/webfinger?resource=acct:shp@social.heldscal.la", _, _, - Accept: "application/xrd+xml,application/jrd+json" + [{"accept", "application/xrd+xml,application/jrd+json"}] ) do {:ok, %Tesla.Env{ @@ -863,10 +883,10 @@ def get( end def get( - "https://social.heldscal.la/.well-known/webfinger?resource=invalid_content@social.heldscal.la", + "https://social.heldscal.la/.well-known/webfinger?resource=acct:invalid_content@social.heldscal.la", _, _, - Accept: "application/xrd+xml,application/jrd+json" + [{"accept", "application/xrd+xml,application/jrd+json"}] ) do {:ok, %Tesla.Env{status: 200, body: ""}} end @@ -880,10 +900,10 @@ def get("http://framatube.org/.well-known/host-meta", _, _, _) do end def get( - "http://framatube.org/main/xrd?uri=framasoft@framatube.org", + "http://framatube.org/main/xrd?uri=acct:framasoft@framatube.org", _, _, - Accept: "application/xrd+xml,application/jrd+json" + [{"accept", "application/xrd+xml,application/jrd+json"}] ) do {:ok, %Tesla.Env{ @@ -905,7 +925,7 @@ def get( "http://gnusocial.de/main/xrd?uri=winterdienst@gnusocial.de", _, _, - Accept: "application/xrd+xml,application/jrd+json" + [{"accept", "application/xrd+xml,application/jrd+json"}] ) do {:ok, %Tesla.Env{ @@ -939,10 +959,10 @@ def get("http://gerzilla.de/.well-known/host-meta", _, _, _) do end def get( - "https://gerzilla.de/xrd/?uri=kaniini@gerzilla.de", + "https://gerzilla.de/xrd/?uri=acct:kaniini@gerzilla.de", _, _, - Accept: "application/xrd+xml,application/jrd+json" + [{"accept", "application/xrd+xml,application/jrd+json"}] ) do {:ok, %Tesla.Env{ @@ -1005,7 +1025,7 @@ def get("https://apfed.club/channel/indio", _, _, _) do %Tesla.Env{status: 200, body: File.read!("test/fixtures/tesla_mock/osada-user-indio.json")}} end - def get("https://social.heldscal.la/user/23211", _, _, Accept: "application/activity+json") do + def get("https://social.heldscal.la/user/23211", _, _, [{"accept", "application/activity+json"}]) do {:ok, Tesla.Mock.json(%{"id" => "https://social.heldscal.la/user/23211"}, status: 200)} end @@ -1135,10 +1155,10 @@ def get("http://404.site" <> _, _, _, _) do end def get( - "https://zetsubou.xn--q9jyb4c/.well-known/webfinger?resource=lain@zetsubou.xn--q9jyb4c", + "https://zetsubou.xn--q9jyb4c/.well-known/webfinger?resource=acct:lain@zetsubou.xn--q9jyb4c", _, _, - Accept: "application/xrd+xml,application/jrd+json" + [{"accept", "application/xrd+xml,application/jrd+json"}] ) do {:ok, %Tesla.Env{ @@ -1148,10 +1168,10 @@ def get( end def get( - "https://zetsubou.xn--q9jyb4c/.well-known/webfinger?resource=https://zetsubou.xn--q9jyb4c/users/lain", + "https://zetsubou.xn--q9jyb4c/.well-known/webfinger?resource=acct:https://zetsubou.xn--q9jyb4c/users/lain", _, _, - Accept: "application/xrd+xml,application/jrd+json" + [{"accept", "application/xrd+xml,application/jrd+json"}] ) do {:ok, %Tesla.Env{ @@ -1173,7 +1193,9 @@ def get( }} end - def get("https://info.pleroma.site/activity.json", _, _, Accept: "application/activity+json") do + def get("https://info.pleroma.site/activity.json", _, _, [ + {"accept", "application/activity+json"} + ]) do {:ok, %Tesla.Env{ status: 200, @@ -1185,7 +1207,9 @@ def get("https://info.pleroma.site/activity.json", _, _, _) do {:ok, %Tesla.Env{status: 404, body: ""}} end - def get("https://info.pleroma.site/activity2.json", _, _, Accept: "application/activity+json") do + def get("https://info.pleroma.site/activity2.json", _, _, [ + {"accept", "application/activity+json"} + ]) do {:ok, %Tesla.Env{ status: 200, @@ -1197,7 +1221,9 @@ def get("https://info.pleroma.site/activity2.json", _, _, _) do {:ok, %Tesla.Env{status: 404, body: ""}} end - def get("https://info.pleroma.site/activity3.json", _, _, Accept: "application/activity+json") do + def get("https://info.pleroma.site/activity3.json", _, _, [ + {"accept", "application/activity+json"} + ]) do {:ok, %Tesla.Env{ status: 200, @@ -1265,6 +1291,10 @@ def get("https://skippers-bin.com/notes/7x9tmrp97i", _, _, _) do }} end + def get("https://example.org/emoji/firedfox.png", _, _, _) do + {:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/image.jpg")}} + end + def get("https://skippers-bin.com/users/7v1w1r8ce6", _, _, _) do {:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/tesla_mock/sjw.json")}} end @@ -1273,6 +1303,21 @@ def get("https://patch.cx/users/rin", _, _, _) do {:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/tesla_mock/rin.json")}} end + def get( + "https://channels.tests.funkwhale.audio/federation/music/uploads/42342395-0208-4fee-a38d-259a6dae0871", + _, + _, + _ + ) do + {:ok, + %Tesla.Env{status: 200, body: File.read!("test/fixtures/tesla_mock/funkwhale_audio.json")}} + end + + def get("https://channels.tests.funkwhale.audio/federation/actors/compositions", _, _, _) do + {:ok, + %Tesla.Env{status: 200, body: File.read!("test/fixtures/tesla_mock/funkwhale_channel.json")}} + end + def get("http://example.com/rel_me/error", _, _, _) do {:ok, %Tesla.Env{status: 404, body: ""}} end diff --git a/test/tasks/app_test.exs b/test/tasks/app_test.exs new file mode 100644 index 000000000..b8f03566d --- /dev/null +++ b/test/tasks/app_test.exs @@ -0,0 +1,65 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Mix.Tasks.Pleroma.AppTest do + use Pleroma.DataCase, async: true + + setup_all do + Mix.shell(Mix.Shell.Process) + + on_exit(fn -> + Mix.shell(Mix.Shell.IO) + end) + end + + describe "creates new app" do + test "with default scopes" do + name = "Some name" + redirect = "https://example.com" + Mix.Tasks.Pleroma.App.run(["create", "-n", name, "-r", redirect]) + + assert_app(name, redirect, ["read", "write", "follow", "push"]) + end + + test "with custom scopes" do + name = "Another name" + redirect = "https://example.com" + + Mix.Tasks.Pleroma.App.run([ + "create", + "-n", + name, + "-r", + redirect, + "-s", + "read,write,follow,push,admin" + ]) + + assert_app(name, redirect, ["read", "write", "follow", "push", "admin"]) + end + end + + test "with errors" do + Mix.Tasks.Pleroma.App.run(["create"]) + {:mix_shell, :error, ["Creating failed:"]} + {:mix_shell, :error, ["name: can't be blank"]} + {:mix_shell, :error, ["redirect_uris: can't be blank"]} + end + + defp assert_app(name, redirect, scopes) do + app = Repo.get_by(Pleroma.Web.OAuth.App, client_name: name) + + assert_received {:mix_shell, :info, [message]} + assert message == "#{name} successfully created:" + + assert_received {:mix_shell, :info, [message]} + assert message == "App client_id: #{app.client_id}" + + assert_received {:mix_shell, :info, [message]} + assert message == "App client_secret: #{app.client_secret}" + + assert app.scopes == scopes + assert app.redirect_uris == redirect + end +end diff --git a/test/tasks/config_test.exs b/test/tasks/config_test.exs index 3dee4f082..04bc947a9 100644 --- a/test/tasks/config_test.exs +++ b/test/tasks/config_test.exs @@ -38,7 +38,7 @@ test "error if file with custom settings doesn't exist" do on_exit(fn -> Application.put_env(:quack, :level, initial) end) end - test "settings are migrated to db" do + test "filtered settings are migrated to db" do assert Repo.all(ConfigDB) == [] Mix.Tasks.Pleroma.Config.migrate_to_db("test/fixtures/config/temp.secret.exs") @@ -47,6 +47,7 @@ test "settings are migrated to db" do config2 = ConfigDB.get_by_params(%{group: ":pleroma", key: ":second_setting"}) config3 = ConfigDB.get_by_params(%{group: ":quack", key: ":level"}) refute ConfigDB.get_by_params(%{group: ":pleroma", key: "Pleroma.Repo"}) + refute ConfigDB.get_by_params(%{group: ":postgrex", key: ":json_library"}) assert ConfigDB.from_binary(config1.value) == [key: "value", key2: [Repo]] assert ConfigDB.from_binary(config2.value) == [key: "value2", key2: ["Activity"]] diff --git a/test/tasks/count_statuses_test.exs b/test/tasks/count_statuses_test.exs index 73c2ea690..c5cd16960 100644 --- a/test/tasks/count_statuses_test.exs +++ b/test/tasks/count_statuses_test.exs @@ -13,11 +13,11 @@ defmodule Mix.Tasks.Pleroma.CountStatusesTest do test "counts statuses" do user = insert(:user) - {:ok, _} = CommonAPI.post(user, %{"status" => "test"}) - {:ok, _} = CommonAPI.post(user, %{"status" => "test2"}) + {:ok, _} = CommonAPI.post(user, %{status: "test"}) + {:ok, _} = CommonAPI.post(user, %{status: "test2"}) user2 = insert(:user) - {:ok, _} = CommonAPI.post(user2, %{"status" => "test3"}) + {:ok, _} = CommonAPI.post(user2, %{status: "test3"}) user = refresh_record(user) user2 = refresh_record(user2) diff --git a/test/tasks/database_test.exs b/test/tasks/database_test.exs index ed1c31d9c..883828d77 100644 --- a/test/tasks/database_test.exs +++ b/test/tasks/database_test.exs @@ -26,7 +26,7 @@ defmodule Mix.Tasks.Pleroma.DatabaseTest do describe "running remove_embedded_objects" do test "it replaces objects with references" do user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "test"}) + {:ok, activity} = CommonAPI.post(user, %{status: "test"}) new_data = Map.put(activity.data, "object", activity.object.data) {:ok, activity} = @@ -99,10 +99,10 @@ test "following and followers count are updated" do test "it turns OrderedCollection likes into empty arrays" do [user, user2] = insert_pair(:user) - {:ok, %{id: id, object: object}} = CommonAPI.post(user, %{"status" => "test"}) - {:ok, %{object: object2}} = CommonAPI.post(user, %{"status" => "test test"}) + {:ok, %{id: id, object: object}} = CommonAPI.post(user, %{status: "test"}) + {:ok, %{object: object2}} = CommonAPI.post(user, %{status: "test test"}) - CommonAPI.favorite(id, user2) + CommonAPI.favorite(user2, id) likes = %{ "first" => diff --git a/test/tasks/digest_test.exs b/test/tasks/digest_test.exs index 96d762685..eefbc8936 100644 --- a/test/tasks/digest_test.exs +++ b/test/tasks/digest_test.exs @@ -25,7 +25,7 @@ test "Sends digest to the given user" do Enum.each(0..10, fn i -> {:ok, _activity} = CommonAPI.post(user1, %{ - "status" => "hey ##{i} @#{user2.nickname}!" + status: "hey ##{i} @#{user2.nickname}!" }) end) diff --git a/test/tasks/emoji_test.exs b/test/tasks/emoji_test.exs new file mode 100644 index 000000000..499f098c2 --- /dev/null +++ b/test/tasks/emoji_test.exs @@ -0,0 +1,239 @@ +defmodule Mix.Tasks.Pleroma.EmojiTest do + use ExUnit.Case, async: true + + import ExUnit.CaptureIO + import Tesla.Mock + + alias Mix.Tasks.Pleroma.Emoji + + describe "ls-packs" do + test "with default manifest as url" do + mock(fn + %{ + method: :get, + url: "https://git.pleroma.social/pleroma/emoji-index/raw/master/index.json" + } -> + %Tesla.Env{ + status: 200, + body: File.read!("test/fixtures/emoji/packs/default-manifest.json") + } + end) + + capture_io(fn -> Emoji.run(["ls-packs"]) end) =~ + "https://finland.fi/wp-content/uploads/2017/06/finland-emojis.zip" + end + + test "with passed manifest as file" do + capture_io(fn -> + Emoji.run(["ls-packs", "-m", "test/fixtures/emoji/packs/manifest.json"]) + end) =~ "https://git.pleroma.social/pleroma/emoji-index/raw/master/packs/blobs_gg.zip" + end + end + + describe "get-packs" do + test "download pack from default manifest" do + mock(fn + %{ + method: :get, + url: "https://git.pleroma.social/pleroma/emoji-index/raw/master/index.json" + } -> + %Tesla.Env{ + status: 200, + body: File.read!("test/fixtures/emoji/packs/default-manifest.json") + } + + %{ + method: :get, + url: "https://finland.fi/wp-content/uploads/2017/06/finland-emojis.zip" + } -> + %Tesla.Env{ + status: 200, + body: File.read!("test/fixtures/emoji/packs/blank.png.zip") + } + + %{ + method: :get, + url: "https://git.pleroma.social/pleroma/emoji-index/raw/master/finmoji.json" + } -> + %Tesla.Env{ + status: 200, + body: File.read!("test/fixtures/emoji/packs/finmoji.json") + } + end) + + assert capture_io(fn -> Emoji.run(["get-packs", "finmoji"]) end) =~ "Writing pack.json for" + + emoji_path = + Path.join( + Pleroma.Config.get!([:instance, :static_dir]), + "emoji" + ) + + assert File.exists?(Path.join([emoji_path, "finmoji", "pack.json"])) + on_exit(fn -> File.rm_rf!("test/instance_static/emoji/finmoji") end) + end + + test "install local emoji pack" do + assert capture_io(fn -> + Emoji.run([ + "get-packs", + "local", + "--manifest", + "test/instance_static/local_pack/manifest.json" + ]) + end) =~ "Writing pack.json for" + + on_exit(fn -> File.rm_rf!("test/instance_static/emoji/local") end) + end + + test "pack not found" do + mock(fn + %{ + method: :get, + url: "https://git.pleroma.social/pleroma/emoji-index/raw/master/index.json" + } -> + %Tesla.Env{ + status: 200, + body: File.read!("test/fixtures/emoji/packs/default-manifest.json") + } + end) + + assert capture_io(fn -> Emoji.run(["get-packs", "not_found"]) end) =~ + "No pack named \"not_found\" found" + end + + test "raise on bad sha256" do + mock(fn + %{ + method: :get, + url: "https://git.pleroma.social/pleroma/emoji-index/raw/master/packs/blobs_gg.zip" + } -> + %Tesla.Env{ + status: 200, + body: File.read!("test/fixtures/emoji/packs/blank.png.zip") + } + end) + + assert_raise RuntimeError, ~r/^Bad SHA256 for blobs.gg/, fn -> + capture_io(fn -> + Emoji.run(["get-packs", "blobs.gg", "-m", "test/fixtures/emoji/packs/manifest.json"]) + end) + end + end + end + + describe "gen-pack" do + setup do + url = "https://finland.fi/wp-content/uploads/2017/06/finland-emojis.zip" + + mock(fn %{ + method: :get, + url: ^url + } -> + %Tesla.Env{status: 200, body: File.read!("test/fixtures/emoji/packs/blank.png.zip")} + end) + + {:ok, url: url} + end + + test "with default extensions", %{url: url} do + name = "pack1" + pack_json = "#{name}.json" + files_json = "#{name}_file.json" + refute File.exists?(pack_json) + refute File.exists?(files_json) + + captured = + capture_io(fn -> + Emoji.run([ + "gen-pack", + url, + "--name", + name, + "--license", + "license", + "--homepage", + "homepage", + "--description", + "description", + "--files", + files_json, + "--extensions", + ".png .gif" + ]) + end) + + assert captured =~ "#{pack_json} has been created with the pack1 pack" + assert captured =~ "Using .png .gif extensions" + + assert File.exists?(pack_json) + assert File.exists?(files_json) + + on_exit(fn -> + File.rm!(pack_json) + File.rm!(files_json) + end) + end + + test "with custom extensions and update existing files", %{url: url} do + name = "pack2" + pack_json = "#{name}.json" + files_json = "#{name}_file.json" + refute File.exists?(pack_json) + refute File.exists?(files_json) + + captured = + capture_io(fn -> + Emoji.run([ + "gen-pack", + url, + "--name", + name, + "--license", + "license", + "--homepage", + "homepage", + "--description", + "description", + "--files", + files_json, + "--extensions", + " .png .gif .jpeg " + ]) + end) + + assert captured =~ "#{pack_json} has been created with the pack2 pack" + assert captured =~ "Using .png .gif .jpeg extensions" + + assert File.exists?(pack_json) + assert File.exists?(files_json) + + captured = + capture_io(fn -> + Emoji.run([ + "gen-pack", + url, + "--name", + name, + "--license", + "license", + "--homepage", + "homepage", + "--description", + "description", + "--files", + files_json, + "--extensions", + " .png .gif .jpeg " + ]) + end) + + assert captured =~ "#{pack_json} has been updated with the pack2 pack" + + on_exit(fn -> + File.rm!(pack_json) + File.rm!(files_json) + end) + end + end +end diff --git a/test/tasks/instance_test.exs b/test/tasks/instance_test.exs index f6a4ba508..3b4c041d9 100644 --- a/test/tasks/instance_test.exs +++ b/test/tasks/instance_test.exs @@ -63,7 +63,7 @@ test "running gen" do "--uploads-dir", "test/uploads", "--static-dir", - "instance/static/" + "./test/../test/instance/static/" ]) end @@ -83,6 +83,7 @@ test "running gen" do assert generated_config =~ "configurable_from_database: true" assert generated_config =~ "http: [ip: {127, 0, 0, 1}, port: 4000]" assert File.read!(tmp_path() <> "setup.psql") == generated_setup_psql() + assert File.exists?(Path.expand("./test/instance/static/robots.txt")) end defp generated_setup_psql do diff --git a/test/tasks/refresh_counter_cache_test.exs b/test/tasks/refresh_counter_cache_test.exs index b63f44c08..851971a77 100644 --- a/test/tasks/refresh_counter_cache_test.exs +++ b/test/tasks/refresh_counter_cache_test.exs @@ -12,26 +12,26 @@ test "counts statuses" do user = insert(:user) other_user = insert(:user) - CommonAPI.post(user, %{"visibility" => "public", "status" => "hey"}) + CommonAPI.post(user, %{visibility: "public", status: "hey"}) Enum.each(0..1, fn _ -> CommonAPI.post(user, %{ - "visibility" => "unlisted", - "status" => "hey" + visibility: "unlisted", + status: "hey" }) end) Enum.each(0..2, fn _ -> CommonAPI.post(user, %{ - "visibility" => "direct", - "status" => "hey @#{other_user.nickname}" + visibility: "direct", + status: "hey @#{other_user.nickname}" }) end) Enum.each(0..3, fn _ -> CommonAPI.post(user, %{ - "visibility" => "private", - "status" => "hey" + visibility: "private", + status: "hey" }) end) diff --git a/test/tasks/user_test.exs b/test/tasks/user_test.exs index b45f37263..b55aa1cdb 100644 --- a/test/tasks/user_test.exs +++ b/test/tasks/user_test.exs @@ -3,15 +3,21 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Mix.Tasks.Pleroma.UserTest do + alias Pleroma.Activity + alias Pleroma.Object alias Pleroma.Repo + alias Pleroma.Tests.ObanHelpers alias Pleroma.User + alias Pleroma.Web.CommonAPI alias Pleroma.Web.OAuth.Authorization alias Pleroma.Web.OAuth.Token use Pleroma.DataCase + use Oban.Testing, repo: Pleroma.Repo - import Pleroma.Factory import ExUnit.CaptureIO + import Mock + import Pleroma.Factory setup_all do Mix.shell(Mix.Shell.Process) @@ -85,14 +91,44 @@ test "user is not created" do describe "running rm" do test "user is deleted" do + clear_config([:instance, :federating], true) user = insert(:user) - Mix.Tasks.Pleroma.User.run(["rm", user.nickname]) + with_mock Pleroma.Web.Federator, + publish: fn _ -> nil end do + Mix.Tasks.Pleroma.User.run(["rm", user.nickname]) + ObanHelpers.perform_all() - assert_received {:mix_shell, :info, [message]} - assert message =~ " deleted" + assert_received {:mix_shell, :info, [message]} + assert message =~ " deleted" + assert %{deactivated: true} = User.get_by_nickname(user.nickname) - refute User.get_by_nickname(user.nickname) + assert called(Pleroma.Web.Federator.publish(:_)) + end + end + + test "a remote user's create activity is deleted when the object has been pruned" do + user = insert(:user) + {:ok, post} = CommonAPI.post(user, %{status: "uguu"}) + + clear_config([:instance, :federating], true) + + object = Object.normalize(post) + Object.prune(object) + + with_mock Pleroma.Web.Federator, + publish: fn _ -> nil end do + Mix.Tasks.Pleroma.User.run(["rm", user.nickname]) + ObanHelpers.perform_all() + + assert_received {:mix_shell, :info, [message]} + assert message =~ " deleted" + assert %{deactivated: true} = User.get_by_nickname(user.nickname) + + assert called(Pleroma.Web.Federator.publish(:_)) + end + + refute Activity.get_by_id(post.id) end test "no user to delete" do @@ -136,31 +172,31 @@ test "no user to toggle" do end end - describe "running unsubscribe" do + describe "running deactivate" do test "user is unsubscribed" do followed = insert(:user) + remote_followed = insert(:user, local: false) user = insert(:user) - User.follow(user, followed, "accept") - Mix.Tasks.Pleroma.User.run(["unsubscribe", user.nickname]) + User.follow(user, followed, :follow_accept) + User.follow(user, remote_followed, :follow_accept) + + Mix.Tasks.Pleroma.User.run(["deactivate", user.nickname]) assert_received {:mix_shell, :info, [message]} assert message =~ "Deactivating" - assert_received {:mix_shell, :info, [message]} - assert message =~ "Unsubscribing" - # Note that the task has delay :timer.sleep(500) assert_received {:mix_shell, :info, [message]} assert message =~ "Successfully unsubscribed" user = User.get_cached_by_nickname(user.nickname) - assert Enum.empty?(User.get_friends(user)) + assert Enum.empty?(Enum.filter(User.get_friends(user), & &1.local)) assert user.deactivated end - test "no user to unsubscribe" do - Mix.Tasks.Pleroma.User.run(["unsubscribe", "nonexistent"]) + test "no user to deactivate" do + Mix.Tasks.Pleroma.User.run(["deactivate", "nonexistent"]) assert_received {:mix_shell, :error, [message]} assert message =~ "No user" diff --git a/test/test_helper.exs b/test/test_helper.exs index 6b91d2b46..ee880e226 100644 --- a/test/test_helper.exs +++ b/test/test_helper.exs @@ -6,7 +6,10 @@ ExUnit.start(exclude: [:federated | os_exclude]) Ecto.Adapters.SQL.Sandbox.mode(Pleroma.Repo, :manual) + Mox.defmock(Pleroma.ReverseProxy.ClientMock, for: Pleroma.ReverseProxy.Client) +Mox.defmock(Pleroma.GunMock, for: Pleroma.Gun) + {:ok, _} = Application.ensure_all_started(:ex_machina) ExUnit.after_suite(fn _results -> diff --git a/test/uploaders/s3_test.exs b/test/uploaders/s3_test.exs index 6950ccb25..d949c90a5 100644 --- a/test/uploaders/s3_test.exs +++ b/test/uploaders/s3_test.exs @@ -58,7 +58,7 @@ test "it returns path with bucket namespace when namespace is set" do name: "image-tet.jpg", content_type: "image/jpg", path: "test_folder/image-tet.jpg", - tempfile: Path.absname("test/fixtures/image_tmp.jpg") + tempfile: Path.absname("test/instance_static/add/shortcode.png") } [file_upload: file_upload] diff --git a/test/user_invite_token_test.exs b/test/user_invite_token_test.exs index 4f70ef337..63f18f13c 100644 --- a/test/user_invite_token_test.exs +++ b/test/user_invite_token_test.exs @@ -4,7 +4,6 @@ defmodule Pleroma.UserInviteTokenTest do use ExUnit.Case, async: true - use Pleroma.DataCase alias Pleroma.UserInviteToken describe "valid_invite?/1 one time invites" do @@ -64,7 +63,6 @@ test "expires today returns true", %{invite: invite} do test "expires yesterday returns false", %{invite: invite} do invite = %{invite | expires_at: Date.add(Date.utc_today(), -1)} - invite = Repo.insert!(invite) refute UserInviteToken.valid_invite?(invite) end end @@ -82,7 +80,6 @@ test "not overdue date and less uses returns true", %{invite: invite} do test "overdue date and less uses returns false", %{invite: invite} do invite = %{invite | expires_at: Date.add(Date.utc_today(), -1)} - invite = Repo.insert!(invite) refute UserInviteToken.valid_invite?(invite) end @@ -93,7 +90,6 @@ test "not overdue date with more uses returns false", %{invite: invite} do test "overdue date with more uses returns false", %{invite: invite} do invite = %{invite | expires_at: Date.add(Date.utc_today(), -1), uses: 5} - invite = Repo.insert!(invite) refute UserInviteToken.valid_invite?(invite) end end diff --git a/test/user_search_test.exs b/test/user_search_test.exs index cb847b516..17c63322a 100644 --- a/test/user_search_test.exs +++ b/test/user_search_test.exs @@ -172,6 +172,7 @@ test "works with URIs" do |> Map.put(:search_rank, nil) |> Map.put(:search_type, nil) |> Map.put(:last_digest_emailed_at, nil) + |> Map.put(:multi_factor_authentication_settings, nil) |> Map.put(:notification_settings, nil) assert user == expected diff --git a/test/user_test.exs b/test/user_test.exs index 119a36ec1..6b344158d 100644 --- a/test/user_test.exs +++ b/test/user_test.exs @@ -15,7 +15,6 @@ defmodule Pleroma.UserTest do use Pleroma.DataCase use Oban.Testing, repo: Pleroma.Repo - import Mock import Pleroma.Factory import ExUnit.CaptureLog @@ -86,7 +85,7 @@ test "returns invisible actor" do {:ok, user: insert(:user)} end - test "outgoing_relations_ap_ids/1", %{user: user} do + test "outgoing_relationships_ap_ids/1", %{user: user} do rel_types = [:block, :mute, :notification_mute, :reblog_mute, :inverse_subscription] ap_ids_by_rel = @@ -124,10 +123,10 @@ test "outgoing_relations_ap_ids/1", %{user: user} do assert ap_ids_by_rel[:inverse_subscription] == Enum.sort(Enum.map(User.subscriber_users(user), & &1.ap_id)) - outgoing_relations_ap_ids = User.outgoing_relations_ap_ids(user, rel_types) + outgoing_relationships_ap_ids = User.outgoing_relationships_ap_ids(user, rel_types) assert ap_ids_by_rel == - Enum.into(outgoing_relations_ap_ids, %{}, fn {k, v} -> {k, Enum.sort(v)} end) + Enum.into(outgoing_relationships_ap_ids, %{}, fn {k, v} -> {k, Enum.sort(v)} end) end end @@ -194,7 +193,8 @@ test "doesn't return already accepted or duplicate follow requests" do CommonAPI.follow(pending_follower, locked) CommonAPI.follow(pending_follower, locked) CommonAPI.follow(accepted_follower, locked) - Pleroma.FollowingRelationship.update(accepted_follower, locked, "accept") + + Pleroma.FollowingRelationship.update(accepted_follower, locked, :follow_accept) assert [^pending_follower] = User.get_follow_requests(locked) end @@ -319,7 +319,7 @@ test "unfollow with syncronizes external user" do following_address: "http://localhost:4001/users/fuser2/following" }) - {:ok, user} = User.follow(user, followed, "accept") + {:ok, user} = User.follow(user, followed, :follow_accept) {:ok, user, _activity} = User.unfollow(user, followed) @@ -332,7 +332,7 @@ test "unfollow takes a user and another user" do followed = insert(:user) user = insert(:user) - {:ok, user} = User.follow(user, followed, "accept") + {:ok, user} = User.follow(user, followed, :follow_accept) assert User.following(user) == [user.follower_address, followed.follower_address] @@ -353,7 +353,7 @@ test "unfollow doesn't unfollow yourself" do test "test if a user is following another user" do followed = insert(:user) user = insert(:user) - User.follow(user, followed, "accept") + User.follow(user, followed, :follow_accept) assert User.following?(user, followed) refute User.following?(followed, user) @@ -555,6 +555,7 @@ test "gets an existing user by fully qualified nickname, case insensitive" do assert user == fetched_user end + @tag capture_log: true test "returns nil if no user could be fetched" do {:error, fetched_user} = User.get_or_fetch_by_nickname("nonexistant@social.heldscal.la") assert fetched_user == "not found nonexistant@social.heldscal.la" @@ -581,10 +582,30 @@ test "updates an existing user, if stale" do {:ok, user} = User.get_or_fetch_by_ap_id("http://mastodon.example.org/users/admin") - assert user.source_data["endpoints"] + assert user.inbox refute user.last_refreshed_at == orig_user.last_refreshed_at end + + @tag capture_log: true + test "it returns the old user if stale, but unfetchable" do + a_week_ago = NaiveDateTime.add(NaiveDateTime.utc_now(), -604_800) + + orig_user = + insert( + :user, + local: false, + nickname: "admin@mastodon.example.org", + ap_id: "http://mastodon.example.org/users/raymoo", + last_refreshed_at: a_week_ago + ) + + assert orig_user.last_refreshed_at == a_week_ago + + {:ok, user} = User.get_or_fetch_by_ap_id("http://mastodon.example.org/users/raymoo") + + assert user.last_refreshed_at == orig_user.last_refreshed_at + end end test "returns an ap_id for a user" do @@ -609,7 +630,7 @@ test "returns an ap_followers link for a user" do ) <> "/followers" end - describe "remote user creation changeset" do + describe "remote user changeset" do @valid_remote %{ bio: "hello", name: "Someone", @@ -621,28 +642,28 @@ test "returns an ap_followers link for a user" do setup do: clear_config([:instance, :user_name_length]) test "it confirms validity" do - cs = User.remote_user_creation(@valid_remote) + cs = User.remote_user_changeset(@valid_remote) assert cs.valid? end test "it sets the follower_adress" do - cs = User.remote_user_creation(@valid_remote) + cs = User.remote_user_changeset(@valid_remote) # remote users get a fake local follower address assert cs.changes.follower_address == User.ap_followers(%User{nickname: @valid_remote[:nickname]}) end test "it enforces the fqn format for nicknames" do - cs = User.remote_user_creation(%{@valid_remote | nickname: "bla"}) + cs = User.remote_user_changeset(%{@valid_remote | nickname: "bla"}) assert Ecto.Changeset.get_field(cs, :local) == false assert cs.changes.avatar refute cs.valid? end test "it has required fields" do - [:name, :ap_id] + [:ap_id] |> Enum.each(fn field -> - cs = User.remote_user_creation(Map.delete(@valid_remote, field)) + cs = User.remote_user_changeset(Map.delete(@valid_remote, field)) refute cs.valid? end) end @@ -755,8 +776,8 @@ test "it imports user followings from list" do ] {:ok, job} = User.follow_import(user1, identifiers) - result = ObanHelpers.perform(job) + assert {:ok, result} = ObanHelpers.perform(job) assert is_list(result) assert result == [user2, user3] end @@ -978,14 +999,26 @@ test "it imports user blocks from list" do ] {:ok, job} = User.blocks_import(user1, identifiers) - result = ObanHelpers.perform(job) + 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) + user = insert(:user, local: true) + + {:ok, activity} = CommonAPI.post(actor, %{status: "hello"}) + {:ok, announce} = CommonAPI.repeat(activity.id, user) + + recipients = User.get_recipients_from_activity(announce) + + assert user in recipients + end + test "get recipients" do actor = insert(:user) user = insert(:user, local: true) @@ -995,7 +1028,7 @@ test "get recipients" do {:ok, activity} = CommonAPI.post(actor, %{ - "status" => "hey @#{addressed.nickname} @#{addressed_remote.nickname}" + status: "hey @#{addressed.nickname} @#{addressed_remote.nickname}" }) assert Enum.map([actor, addressed], & &1.ap_id) -- @@ -1017,7 +1050,7 @@ test "has following" do {:ok, activity} = CommonAPI.post(actor, %{ - "status" => "hey @#{addressed.nickname}" + status: "hey @#{addressed.nickname}" }) assert Enum.map([actor, addressed], & &1.ap_id) -- @@ -1078,7 +1111,7 @@ test "hide a user's statuses from timelines and notifications" do {:ok, user2} = User.follow(user2, user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "hey @#{user2.nickname}"}) + {:ok, activity} = CommonAPI.post(user, %{status: "hey @#{user2.nickname}"}) activity = Repo.preload(activity, :bookmark) @@ -1114,24 +1147,15 @@ test "hide a user's statuses from timelines and notifications" do setup do: clear_config([:instance, :federating]) test ".delete_user_activities deletes all create activities", %{user: user} do - {:ok, activity} = CommonAPI.post(user, %{"status" => "2hu"}) + {:ok, activity} = CommonAPI.post(user, %{status: "2hu"}) User.delete_user_activities(user) - # TODO: Remove favorites, repeats, delete activities. + # TODO: Test removal favorites, repeats, delete activities. refute Activity.get_by_id(activity.id) end - test "it deletes deactivated user" do - {:ok, user} = insert(:user, deactivated: true) |> User.set_cache() - - {:ok, job} = User.delete(user) - {:ok, _user} = ObanHelpers.perform(job) - - refute User.get_by_id(user.id) - end - - test "it deletes a user, all follow relationships and all activities", %{user: user} do + test "it deactivates a user, all follow relationships and all activities", %{user: user} do follower = insert(:user) {:ok, follower} = User.follow(follower, user) @@ -1141,9 +1165,9 @@ test "it deletes a user, all follow relationships and all activities", %{user: u object_two = insert(:note, user: follower) activity_two = insert(:note_activity, user: follower, note: object_two) - {:ok, like, _} = CommonAPI.favorite(activity_two.id, user) - {:ok, like_two, _} = CommonAPI.favorite(activity.id, follower) - {:ok, repeat, _} = CommonAPI.repeat(activity_two.id, user) + {:ok, like} = CommonAPI.favorite(user, activity_two.id) + {:ok, like_two} = CommonAPI.favorite(follower, activity.id) + {:ok, repeat} = CommonAPI.repeat(activity_two.id, user) {:ok, job} = User.delete(user) {:ok, _user} = ObanHelpers.perform(job) @@ -1151,8 +1175,7 @@ test "it deletes a user, all follow relationships and all activities", %{user: u follower = User.get_cached_by_id(follower.id) refute User.following?(follower, user) - refute User.get_by_id(user.id) - assert {:ok, nil} == Cachex.get(:user_cache, "ap_id:#{user.ap_id}") + assert %{deactivated: true} = User.get_by_id(user.id) user_activities = user.ap_id @@ -1167,30 +1190,32 @@ test "it deletes a user, all follow relationships and all activities", %{user: u refute Activity.get_by_id(like_two.id) refute Activity.get_by_id(repeat.id) end + end - test_with_mock "it sends out User Delete activity", - %{user: user}, - Pleroma.Web.ActivityPub.Publisher, - [:passthrough], - [] do - Pleroma.Config.put([:instance, :federating], true) + describe "delete/1 when confirmation is pending" do + setup do + user = insert(:user, confirmation_pending: true) + {:ok, user: user} + end - {:ok, follower} = User.get_or_fetch_by_ap_id("http://mastodon.example.org/users/admin") - {:ok, _} = User.follow(follower, user) + test "deletes user from database when activation required", %{user: user} do + clear_config([:instance, :account_activation_required], true) {:ok, job} = User.delete(user) - {:ok, _user} = ObanHelpers.perform(job) + {:ok, _} = ObanHelpers.perform(job) - assert ObanHelpers.member?( - %{ - "op" => "publish_one", - "params" => %{ - "inbox" => "http://mastodon.example.org/inbox", - "id" => "pleroma:fakeid" - } - }, - all_enqueued(worker: Pleroma.Workers.PublisherWorker) - ) + refute User.get_cached_by_id(user.id) + refute User.get_by_id(user.id) + end + + test "deactivates user when activation is not required", %{user: user} do + clear_config([:instance, :account_activation_required], false) + + {:ok, job} = User.delete(user) + {:ok, _} = ObanHelpers.perform(job) + + assert %{deactivated: true} = User.get_cached_by_id(user.id) + assert %{deactivated: true} = User.get_by_id(user.id) end end @@ -1198,58 +1223,6 @@ test "get_public_key_for_ap_id fetches a user that's not in the db" do assert {:ok, _key} = User.get_public_key_for_ap_id("http://mastodon.example.org/users/admin") end - describe "insert or update a user from given data" do - test "with normal data" do - user = insert(:user, %{nickname: "nick@name.de"}) - data = %{ap_id: user.ap_id <> "xxx", name: user.name, nickname: user.nickname} - - assert {:ok, %User{}} = User.insert_or_update_user(data) - end - - test "with overly long fields" do - current_max_length = Pleroma.Config.get([:instance, :account_field_value_length], 255) - user = insert(:user, nickname: "nickname@supergood.domain") - - data = %{ - ap_id: user.ap_id, - name: user.name, - nickname: user.nickname, - fields: [ - %{"name" => "myfield", "value" => String.duplicate("h", current_max_length + 1)} - ] - } - - assert {:ok, %User{}} = User.insert_or_update_user(data) - end - - test "with an overly long bio" do - current_max_length = Pleroma.Config.get([:instance, :user_bio_length], 5000) - user = insert(:user, nickname: "nickname@supergood.domain") - - data = %{ - ap_id: user.ap_id, - name: user.name, - nickname: user.nickname, - bio: String.duplicate("h", current_max_length + 1) - } - - assert {:ok, %User{}} = User.insert_or_update_user(data) - end - - test "with an overly long display name" do - current_max_length = Pleroma.Config.get([:instance, :user_name_length], 100) - user = insert(:user, nickname: "nickname@supergood.domain") - - data = %{ - ap_id: user.ap_id, - name: String.duplicate("h", current_max_length + 1), - nickname: user.nickname - } - - assert {:ok, %User{}} = User.insert_or_update_user(data) - end - end - describe "per-user rich-text filtering" do test "html_filter_policy returns default policies, when rich-text is enabled" do user = insert(:user) @@ -1404,7 +1377,7 @@ test "preserves hosts in user links text" do bio = "A.k.a. @nick@domain.com" expected_text = - ~s(A.k.a. @nick@domain.com) @@ -1486,7 +1459,7 @@ test "Only includes users who has no recent activity" do {:ok, _} = CommonAPI.post(user, %{ - "status" => "hey @#{to.nickname}" + status: "hey @#{to.nickname}" }) end) @@ -1518,12 +1491,12 @@ test "Only includes users with no read notifications" do Enum.each(recipients, fn to -> {:ok, _} = CommonAPI.post(sender, %{ - "status" => "hey @#{to.nickname}" + status: "hey @#{to.nickname}" }) {:ok, _} = CommonAPI.post(sender, %{ - "status" => "hey again @#{to.nickname}" + status: "hey again @#{to.nickname}" }) end) @@ -1824,4 +1797,16 @@ test "Notifications are updated", %{user: user} do assert result.email_notifications["digest"] == false end end + + test "avatar fallback" do + user = insert(:user) + assert User.avatar_url(user) =~ "/images/avi.png" + + clear_config([:assets, :default_user_avatar], "avatar.png") + + user = User.get_cached_by_nickname_or_id(user.nickname) + assert User.avatar_url(user) =~ "avatar.png" + + assert User.avatar_url(user, no_default: true) == nil + end end diff --git a/test/web/activity_pub/activity_pub_controller_test.exs b/test/web/activity_pub/activity_pub_controller_test.exs index 573853afa..24edab41a 100644 --- a/test/web/activity_pub/activity_pub_controller_test.exs +++ b/test/web/activity_pub/activity_pub_controller_test.exs @@ -6,7 +6,6 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do use Pleroma.Web.ConnCase use Oban.Testing, repo: Pleroma.Repo - import Pleroma.Factory alias Pleroma.Activity alias Pleroma.Config alias Pleroma.Delivery @@ -14,13 +13,19 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do alias Pleroma.Object alias Pleroma.Tests.ObanHelpers alias Pleroma.User + alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.ActivityPub.ObjectView alias Pleroma.Web.ActivityPub.Relay alias Pleroma.Web.ActivityPub.UserView alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.CommonAPI + alias Pleroma.Web.Endpoint alias Pleroma.Workers.ReceiverWorker + import Pleroma.Factory + + require Pleroma.Constants + setup_all do Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) :ok @@ -168,6 +173,60 @@ test "it requires authentication if instance is NOT federating", %{ end end + describe "mastodon compatibility routes" do + test "it returns a json representation of the object with accept application/json", %{ + conn: conn + } do + {:ok, object} = + %{ + "type" => "Note", + "content" => "hey", + "id" => Endpoint.url() <> "/users/raymoo/statuses/999999999", + "actor" => Endpoint.url() <> "/users/raymoo", + "to" => [Pleroma.Constants.as_public()] + } + |> Object.create() + + conn = + conn + |> put_req_header("accept", "application/json") + |> get("/users/raymoo/statuses/999999999") + + assert json_response(conn, 200) == ObjectView.render("object.json", %{object: object}) + end + + test "it returns a json representation of the activity with accept application/json", %{ + conn: conn + } do + {:ok, object} = + %{ + "type" => "Note", + "content" => "hey", + "id" => Endpoint.url() <> "/users/raymoo/statuses/999999999", + "actor" => Endpoint.url() <> "/users/raymoo", + "to" => [Pleroma.Constants.as_public()] + } + |> Object.create() + + {:ok, activity, _} = + %{ + "id" => object.data["id"] <> "/activity", + "type" => "Create", + "object" => object.data["id"], + "actor" => object.data["actor"], + "to" => object.data["to"] + } + |> ActivityPub.persist(local: true) + + conn = + conn + |> put_req_header("accept", "application/json") + |> get("/users/raymoo/statuses/999999999/activity") + + assert json_response(conn, 200) == ObjectView.render("object.json", %{object: activity}) + end + end + describe "/objects/:uuid" do test "it returns a json representation of the object with accept application/json", %{ conn: conn @@ -341,7 +400,7 @@ test "it caches a response", %{conn: conn} do test "cached purged after activity deletion", %{conn: conn} do user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "cofe"}) + {:ok, activity} = CommonAPI.post(user, %{status: "cofe"}) uuid = String.split(activity.data["id"], "/") |> List.last() @@ -392,6 +451,36 @@ test "it inserts an incoming activity into the database", %{conn: conn} do assert Activity.get_by_ap_id(data["id"]) end + @tag capture_log: true + test "it inserts an incoming activity into the database" <> + "even if we can't fetch the user but have it in our db", + %{conn: conn} do + user = + insert(:user, + ap_id: "https://mastodon.example.org/users/raymoo", + ap_enabled: true, + local: false, + last_refreshed_at: nil + ) + + data = + File.read!("test/fixtures/mastodon-post-activity.json") + |> Poison.decode!() + |> Map.put("actor", user.ap_id) + |> put_in(["object", "attridbutedTo"], user.ap_id) + + conn = + conn + |> assign(:valid_signature, true) + |> put_req_header("content-type", "application/activity+json") + |> post("/inbox", data) + + assert "ok" == json_response(conn, 200) + + ObanHelpers.perform(all_enqueued(worker: ReceiverWorker)) + assert Activity.get_by_ap_id(data["id"]) + end + test "it clears `unreachable` federation status of the sender", %{conn: conn} do data = File.read!("test/fixtures/mastodon-post-activity.json") |> Poison.decode!() @@ -765,51 +854,110 @@ test "it requires authentication if instance is NOT federating", %{ end end - describe "POST /users/:nickname/outbox" do - test "it rejects posts from other users / unauuthenticated users", %{conn: conn} do - data = File.read!("test/fixtures/activitypub-client-post-activity.json") |> Poison.decode!() + describe "POST /users/:nickname/outbox (C2S)" do + setup do + [ + activity: %{ + "@context" => "https://www.w3.org/ns/activitystreams", + "type" => "Create", + "object" => %{"type" => "Note", "content" => "AP C2S test"}, + "to" => "https://www.w3.org/ns/activitystreams#Public", + "cc" => [] + } + ] + end + + test "it rejects posts from other users / unauthenticated users", %{ + conn: conn, + activity: activity + } do user = insert(:user) other_user = insert(:user) conn = put_req_header(conn, "content-type", "application/activity+json") conn - |> post("/users/#{user.nickname}/outbox", data) + |> post("/users/#{user.nickname}/outbox", activity) |> json_response(403) conn |> assign(:user, other_user) - |> post("/users/#{user.nickname}/outbox", data) + |> post("/users/#{user.nickname}/outbox", activity) |> json_response(403) end - test "it inserts an incoming create activity into the database", %{conn: conn} do - data = File.read!("test/fixtures/activitypub-client-post-activity.json") |> Poison.decode!() + test "it inserts an incoming create activity into the database", %{ + conn: conn, + activity: activity + } do user = insert(:user) - conn = + result = conn |> assign(:user, user) |> put_req_header("content-type", "application/activity+json") - |> post("/users/#{user.nickname}/outbox", data) - - result = json_response(conn, 201) + |> post("/users/#{user.nickname}/outbox", activity) + |> json_response(201) assert Activity.get_by_ap_id(result["id"]) + assert result["object"] + assert %Object{data: object} = Object.normalize(result["object"]) + assert object["content"] == activity["object"]["content"] end - test "it rejects an incoming activity with bogus type", %{conn: conn} do - data = File.read!("test/fixtures/activitypub-client-post-activity.json") |> Poison.decode!() + test "it rejects anything beyond 'Note' creations", %{conn: conn, activity: activity} do user = insert(:user) - data = - data - |> Map.put("type", "BadType") + activity = + activity + |> put_in(["object", "type"], "Benis") + + _result = + conn + |> assign(:user, user) + |> put_req_header("content-type", "application/activity+json") + |> post("/users/#{user.nickname}/outbox", activity) + |> json_response(400) + end + + test "it inserts an incoming sensitive activity into the database", %{ + conn: conn, + activity: activity + } do + user = insert(:user) + conn = assign(conn, :user, user) + object = Map.put(activity["object"], "sensitive", true) + activity = Map.put(activity, "object", object) + + response = + conn + |> put_req_header("content-type", "application/activity+json") + |> post("/users/#{user.nickname}/outbox", activity) + |> json_response(201) + + assert Activity.get_by_ap_id(response["id"]) + assert response["object"] + assert %Object{data: response_object} = Object.normalize(response["object"]) + assert response_object["sensitive"] == true + assert response_object["content"] == activity["object"]["content"] + + representation = + conn + |> put_req_header("accept", "application/activity+json") + |> get(response["id"]) + |> json_response(200) + + assert representation["object"]["sensitive"] == true + end + + test "it rejects an incoming activity with bogus type", %{conn: conn, activity: activity} do + user = insert(:user) + activity = Map.put(activity, "type", "BadType") conn = conn |> assign(:user, user) |> put_req_header("content-type", "application/activity+json") - |> post("/users/#{user.nickname}/outbox", data) + |> post("/users/#{user.nickname}/outbox", activity) assert json_response(conn, 400) end @@ -1019,12 +1167,12 @@ test "it works for more than 10 users", %{conn: conn} do assert result["totalItems"] == 15 end - test "returns 403 if requester is not logged in", %{conn: conn} do + test "does not require authentication", %{conn: conn} do user = insert(:user) conn |> get("/users/#{user.nickname}/followers") - |> json_response(403) + |> json_response(200) end end @@ -1116,12 +1264,12 @@ test "it works for more than 10 users", %{conn: conn} do assert result["totalItems"] == 15 end - test "returns 403 if requester is not logged in", %{conn: conn} do + test "does not require authentication", %{conn: conn} do user = insert(:user) conn |> get("/users/#{user.nickname}/following") - |> json_response(403) + |> json_response(200) end end @@ -1239,16 +1387,56 @@ test "POST /api/ap/upload_media", %{conn: conn} do filename: "an_image.jpg" } - conn = + object = conn |> assign(:user, user) |> post("/api/ap/upload_media", %{"file" => image, "description" => desc}) + |> json_response(:created) - assert object = json_response(conn, :created) assert object["name"] == desc assert object["type"] == "Document" assert object["actor"] == user.ap_id + assert [%{"href" => object_href, "mediaType" => object_mediatype}] = object["url"] + assert is_binary(object_href) + assert object_mediatype == "image/jpeg" + activity_request = %{ + "@context" => "https://www.w3.org/ns/activitystreams", + "type" => "Create", + "object" => %{ + "type" => "Note", + "content" => "AP C2S test, attachment", + "attachment" => [object] + }, + "to" => "https://www.w3.org/ns/activitystreams#Public", + "cc" => [] + } + + activity_response = + conn + |> assign(:user, user) + |> post("/users/#{user.nickname}/outbox", activity_request) + |> json_response(:created) + + assert activity_response["id"] + assert activity_response["object"] + assert activity_response["actor"] == user.ap_id + + assert %Object{data: %{"attachment" => [attachment]}} = + Object.normalize(activity_response["object"]) + + assert attachment["type"] == "Document" + assert attachment["name"] == desc + + assert [ + %{ + "href" => ^object_href, + "type" => "Link", + "mediaType" => ^object_mediatype + } + ] = attachment["url"] + + # Fails if unauthenticated conn |> post("/api/ap/upload_media", %{"file" => image, "description" => desc}) |> json_response(403) diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index a43dd34f0..3dcb62873 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -16,11 +16,11 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.AdminAPI.AccountView alias Pleroma.Web.CommonAPI - alias Pleroma.Web.Federator + import ExUnit.CaptureLog + import Mock import Pleroma.Factory import Tesla.Mock - import Mock setup do mock(fn env -> apply(HttpRequestMock, :request, [env]) end) @@ -32,7 +32,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do describe "streaming out participations" do test "it streams them out" do user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => ".", "visibility" => "direct"}) + {:ok, activity} = CommonAPI.post(user, %{status: ".", visibility: "direct"}) {:ok, conversation} = Pleroma.Conversation.create_or_bump_for(activity) @@ -56,8 +56,8 @@ test "streams them out on activity creation" do stream: fn _, _ -> nil end do {:ok, activity} = CommonAPI.post(user_one, %{ - "status" => "@#{user_two.nickname}", - "visibility" => "direct" + status: "@#{user_two.nickname}", + visibility: "direct" }) conversation = @@ -74,15 +74,13 @@ test "streams them out on activity creation" do test "it restricts by the appropriate visibility" do user = insert(:user) - {:ok, public_activity} = CommonAPI.post(user, %{"status" => ".", "visibility" => "public"}) + {:ok, public_activity} = CommonAPI.post(user, %{status: ".", visibility: "public"}) - {:ok, direct_activity} = CommonAPI.post(user, %{"status" => ".", "visibility" => "direct"}) + {:ok, direct_activity} = CommonAPI.post(user, %{status: ".", visibility: "direct"}) - {:ok, unlisted_activity} = - CommonAPI.post(user, %{"status" => ".", "visibility" => "unlisted"}) + {:ok, unlisted_activity} = CommonAPI.post(user, %{status: ".", visibility: "unlisted"}) - {:ok, private_activity} = - CommonAPI.post(user, %{"status" => ".", "visibility" => "private"}) + {:ok, private_activity} = CommonAPI.post(user, %{status: ".", visibility: "private"}) activities = ActivityPub.fetch_activities([], %{:visibility => "direct", "actor_id" => user.ap_id}) @@ -118,15 +116,13 @@ test "it restricts by the appropriate visibility" do test "it excludes by the appropriate visibility" do user = insert(:user) - {:ok, public_activity} = CommonAPI.post(user, %{"status" => ".", "visibility" => "public"}) + {:ok, public_activity} = CommonAPI.post(user, %{status: ".", visibility: "public"}) - {:ok, direct_activity} = CommonAPI.post(user, %{"status" => ".", "visibility" => "direct"}) + {:ok, direct_activity} = CommonAPI.post(user, %{status: ".", visibility: "direct"}) - {:ok, unlisted_activity} = - CommonAPI.post(user, %{"status" => ".", "visibility" => "unlisted"}) + {:ok, unlisted_activity} = CommonAPI.post(user, %{status: ".", visibility: "unlisted"}) - {:ok, private_activity} = - CommonAPI.post(user, %{"status" => ".", "visibility" => "private"}) + {:ok, private_activity} = CommonAPI.post(user, %{status: ".", visibility: "private"}) activities = ActivityPub.fetch_activities([], %{ @@ -180,7 +176,6 @@ test "it returns a user" do {:ok, user} = ActivityPub.make_user_from_ap_id(user_id) assert user.ap_id == user_id assert user.nickname == "admin@mastodon.example.org" - assert user.source_data assert user.ap_enabled assert user.follower_address == "http://mastodon.example.org/users/admin/followers" end @@ -194,9 +189,9 @@ test "it returns a user that is invisible" do test "it fetches the appropriate tag-restricted posts" do user = insert(:user) - {:ok, status_one} = CommonAPI.post(user, %{"status" => ". #test"}) - {:ok, status_two} = CommonAPI.post(user, %{"status" => ". #essais"}) - {:ok, status_three} = CommonAPI.post(user, %{"status" => ". #test #reject"}) + {:ok, status_one} = CommonAPI.post(user, %{status: ". #test"}) + {:ok, status_two} = CommonAPI.post(user, %{status: ". #essais"}) + {:ok, status_three} = CommonAPI.post(user, %{status: ". #test #reject"}) fetch_one = ActivityPub.fetch_activities([], %{"type" => "Create", "tag" => "test"}) @@ -433,26 +428,26 @@ test "increases user note count only for public activities" do {:ok, _} = CommonAPI.post(User.get_cached_by_id(user.id), %{ - "status" => "1", - "visibility" => "public" + status: "1", + visibility: "public" }) {:ok, _} = CommonAPI.post(User.get_cached_by_id(user.id), %{ - "status" => "2", - "visibility" => "unlisted" + status: "2", + visibility: "unlisted" }) {:ok, _} = CommonAPI.post(User.get_cached_by_id(user.id), %{ - "status" => "2", - "visibility" => "private" + status: "2", + visibility: "private" }) {:ok, _} = CommonAPI.post(User.get_cached_by_id(user.id), %{ - "status" => "3", - "visibility" => "direct" + status: "3", + visibility: "direct" }) user = User.get_cached_by_id(user.id) @@ -463,27 +458,27 @@ test "increases replies count" do user = insert(:user) user2 = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "1", "visibility" => "public"}) + {:ok, activity} = CommonAPI.post(user, %{status: "1", visibility: "public"}) ap_id = activity.data["id"] - reply_data = %{"status" => "1", "in_reply_to_status_id" => activity.id} + reply_data = %{status: "1", in_reply_to_status_id: activity.id} # public - {:ok, _} = CommonAPI.post(user2, Map.put(reply_data, "visibility", "public")) + {:ok, _} = CommonAPI.post(user2, Map.put(reply_data, :visibility, "public")) assert %{data: data, object: object} = Activity.get_by_ap_id_with_object(ap_id) assert object.data["repliesCount"] == 1 # unlisted - {:ok, _} = CommonAPI.post(user2, Map.put(reply_data, "visibility", "unlisted")) + {:ok, _} = CommonAPI.post(user2, Map.put(reply_data, :visibility, "unlisted")) assert %{data: data, object: object} = Activity.get_by_ap_id_with_object(ap_id) assert object.data["repliesCount"] == 2 # private - {:ok, _} = CommonAPI.post(user2, Map.put(reply_data, "visibility", "private")) + {:ok, _} = CommonAPI.post(user2, Map.put(reply_data, :visibility, "private")) assert %{data: data, object: object} = Activity.get_by_ap_id_with_object(ap_id) assert object.data["repliesCount"] == 2 # direct - {:ok, _} = CommonAPI.post(user2, Map.put(reply_data, "visibility", "direct")) + {:ok, _} = CommonAPI.post(user2, Map.put(reply_data, :visibility, "direct")) assert %{data: data, object: object} = Activity.get_by_ap_id_with_object(ap_id) assert object.data["repliesCount"] == 2 end @@ -542,7 +537,7 @@ test "doesn't return blocked activities" do assert Enum.member?(activities, activity_one) {:ok, _user_relationship} = User.block(user, %{ap_id: activity_three.data["actor"]}) - {:ok, _announce, %{data: %{"id" => id}}} = CommonAPI.repeat(activity_three.id, booster) + {:ok, %{data: %{"object" => id}}} = CommonAPI.repeat(activity_three.id, booster) %Activity{} = boost_activity = Activity.get_create_by_object_ap_id(id) activity_three = Activity.get_by_id(activity_three.id) @@ -570,13 +565,13 @@ test "doesn't return transitive interactions concerning blocked users" do {:ok, _user_relationship} = User.block(blocker, blockee) - {:ok, activity_one} = CommonAPI.post(friend, %{"status" => "hey!"}) + {:ok, activity_one} = CommonAPI.post(friend, %{status: "hey!"}) - {:ok, activity_two} = CommonAPI.post(friend, %{"status" => "hey! @#{blockee.nickname}"}) + {:ok, activity_two} = CommonAPI.post(friend, %{status: "hey! @#{blockee.nickname}"}) - {:ok, activity_three} = CommonAPI.post(blockee, %{"status" => "hey! @#{friend.nickname}"}) + {:ok, activity_three} = CommonAPI.post(blockee, %{status: "hey! @#{friend.nickname}"}) - {:ok, activity_four} = CommonAPI.post(blockee, %{"status" => "hey! @#{blocker.nickname}"}) + {:ok, activity_four} = CommonAPI.post(blockee, %{status: "hey! @#{blocker.nickname}"}) activities = ActivityPub.fetch_activities([], %{"blocking_user" => blocker}) @@ -593,11 +588,11 @@ test "doesn't return announce activities concerning blocked users" do {:ok, _user_relationship} = User.block(blocker, blockee) - {:ok, activity_one} = CommonAPI.post(friend, %{"status" => "hey!"}) + {:ok, activity_one} = CommonAPI.post(friend, %{status: "hey!"}) - {:ok, activity_two} = CommonAPI.post(blockee, %{"status" => "hey! @#{friend.nickname}"}) + {:ok, activity_two} = CommonAPI.post(blockee, %{status: "hey! @#{friend.nickname}"}) - {:ok, activity_three, _} = CommonAPI.repeat(activity_two.id, friend) + {:ok, activity_three} = CommonAPI.repeat(activity_two.id, friend) activities = ActivityPub.fetch_activities([], %{"blocking_user" => blocker}) @@ -623,7 +618,7 @@ test "doesn't return activities from blocked domains" do followed_user = insert(:user) ActivityPub.follow(user, followed_user) - {:ok, repeat_activity, _} = CommonAPI.repeat(activity.id, followed_user) + {:ok, repeat_activity} = CommonAPI.repeat(activity.id, followed_user) activities = ActivityPub.fetch_activities([], %{"blocking_user" => user, "skip_preload" => true}) @@ -656,7 +651,7 @@ test "does return activities from followed users on blocked domains" do another_user = insert(:user, %{ap_id: "https://#{domain}/@meanie2"}) bad_note = insert(:note, %{data: %{"actor" => another_user.ap_id}}) bad_activity = insert(:note_activity, %{note: bad_note}) - {:ok, repeat_activity, _} = CommonAPI.repeat(bad_activity.id, domain_user) + {:ok, repeat_activity} = CommonAPI.repeat(bad_activity.id, domain_user) activities = ActivityPub.fetch_activities([], %{"blocking_user" => blocker, "skip_preload" => true}) @@ -704,7 +699,7 @@ test "doesn't return muted activities" do activity_three_actor = User.get_by_ap_id(activity_three.data["actor"]) {:ok, _user_relationships} = User.mute(user, activity_three_actor) - {:ok, _announce, %{data: %{"id" => id}}} = CommonAPI.repeat(activity_three.id, booster) + {:ok, %{data: %{"object" => id}}} = CommonAPI.repeat(activity_three.id, booster) %Activity{} = boost_activity = Activity.get_create_by_object_ap_id(id) activity_three = Activity.get_by_id(activity_three.id) @@ -754,7 +749,7 @@ test "does include announces on request" do {:ok, user} = User.follow(user, booster) - {:ok, announce, _object} = CommonAPI.repeat(activity_three.id, booster) + {:ok, announce} = CommonAPI.repeat(activity_three.id, booster) [announce_activity] = ActivityPub.fetch_activities([user.ap_id | User.following(user)]) @@ -775,10 +770,9 @@ test "excludes reblogs on request" do test "doesn't retrieve unlisted activities" do user = insert(:user) - {:ok, _unlisted_activity} = - CommonAPI.post(user, %{"status" => "yeah", "visibility" => "unlisted"}) + {:ok, _unlisted_activity} = CommonAPI.post(user, %{status: "yeah", visibility: "unlisted"}) - {:ok, listed_activity} = CommonAPI.post(user, %{"status" => "yeah"}) + {:ok, listed_activity} = CommonAPI.post(user, %{status: "yeah"}) [activity] = ActivityPub.fetch_public_activities() @@ -852,7 +846,7 @@ test "doesn't return reblogs for users for whom reblogs have been muted" do booster = insert(:user) {:ok, _reblog_mute} = CommonAPI.hide_reblogs(user, booster) - {:ok, activity, _} = CommonAPI.repeat(activity.id, booster) + {:ok, activity} = CommonAPI.repeat(activity.id, booster) activities = ActivityPub.fetch_activities([], %{"muting_user" => user}) @@ -866,7 +860,7 @@ test "returns reblogs for users for whom reblogs have not been muted" do {:ok, _reblog_mute} = CommonAPI.hide_reblogs(user, booster) {:ok, _reblog_mute} = CommonAPI.show_reblogs(user, booster) - {:ok, activity, _} = CommonAPI.repeat(activity.id, booster) + {:ok, activity} = CommonAPI.repeat(activity.id, booster) activities = ActivityPub.fetch_activities([], %{"muting_user" => user}) @@ -874,365 +868,6 @@ test "returns reblogs for users for whom reblogs have not been muted" do end end - describe "react to an object" do - test_with_mock "sends an activity to federation", Federator, [:passthrough], [] do - Config.put([:instance, :federating], true) - user = insert(:user) - reactor = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "YASSSS queen slay"}) - assert object = Object.normalize(activity) - - {:ok, reaction_activity, _object} = ActivityPub.react_with_emoji(reactor, object, "🔥") - - assert called(Federator.publish(reaction_activity)) - end - - test "adds an emoji reaction activity to the db" do - user = insert(:user) - reactor = insert(:user) - third_user = insert(:user) - fourth_user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "YASSSS queen slay"}) - assert object = Object.normalize(activity) - - {:ok, reaction_activity, object} = ActivityPub.react_with_emoji(reactor, object, "🔥") - - assert reaction_activity - - assert reaction_activity.data["actor"] == reactor.ap_id - assert reaction_activity.data["type"] == "EmojiReact" - assert reaction_activity.data["content"] == "🔥" - assert reaction_activity.data["object"] == object.data["id"] - assert reaction_activity.data["to"] == [User.ap_followers(reactor), activity.data["actor"]] - assert reaction_activity.data["context"] == object.data["context"] - assert object.data["reaction_count"] == 1 - assert object.data["reactions"] == [["🔥", [reactor.ap_id]]] - - {:ok, _reaction_activity, object} = ActivityPub.react_with_emoji(third_user, object, "☕") - - assert object.data["reaction_count"] == 2 - assert object.data["reactions"] == [["🔥", [reactor.ap_id]], ["☕", [third_user.ap_id]]] - - {:ok, _reaction_activity, object} = ActivityPub.react_with_emoji(fourth_user, object, "🔥") - - assert object.data["reaction_count"] == 3 - - assert object.data["reactions"] == [ - ["🔥", [fourth_user.ap_id, reactor.ap_id]], - ["☕", [third_user.ap_id]] - ] - end - - test "reverts emoji reaction on error" do - [user, reactor] = insert_list(2, :user) - - {:ok, activity} = CommonAPI.post(user, %{"status" => "Status"}) - object = Object.normalize(activity) - - with_mock(Utils, [:passthrough], maybe_federate: fn _ -> {:error, :reverted} end) do - assert {:error, :reverted} = ActivityPub.react_with_emoji(reactor, object, "😀") - end - - object = Object.get_by_ap_id(object.data["id"]) - refute object.data["reaction_count"] - refute object.data["reactions"] - end - end - - describe "unreacting to an object" do - test_with_mock "sends an activity to federation", Federator, [:passthrough], [] do - Config.put([:instance, :federating], true) - user = insert(:user) - reactor = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "YASSSS queen slay"}) - assert object = Object.normalize(activity) - - {:ok, reaction_activity, _object} = ActivityPub.react_with_emoji(reactor, object, "🔥") - - assert called(Federator.publish(reaction_activity)) - - {:ok, unreaction_activity, _object} = - ActivityPub.unreact_with_emoji(reactor, reaction_activity.data["id"]) - - assert called(Federator.publish(unreaction_activity)) - end - - test "adds an undo activity to the db" do - user = insert(:user) - reactor = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "YASSSS queen slay"}) - assert object = Object.normalize(activity) - - {:ok, reaction_activity, _object} = ActivityPub.react_with_emoji(reactor, object, "🔥") - - {:ok, unreaction_activity, _object} = - ActivityPub.unreact_with_emoji(reactor, reaction_activity.data["id"]) - - assert unreaction_activity.actor == reactor.ap_id - assert unreaction_activity.data["object"] == reaction_activity.data["id"] - - object = Object.get_by_ap_id(object.data["id"]) - assert object.data["reaction_count"] == 0 - assert object.data["reactions"] == [] - end - - test "reverts emoji unreact on error" do - [user, reactor] = insert_list(2, :user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "Status"}) - object = Object.normalize(activity) - - {:ok, reaction_activity, _object} = ActivityPub.react_with_emoji(reactor, object, "😀") - - with_mock(Utils, [:passthrough], maybe_federate: fn _ -> {:error, :reverted} end) do - assert {:error, :reverted} = - ActivityPub.unreact_with_emoji(reactor, reaction_activity.data["id"]) - end - - object = Object.get_by_ap_id(object.data["id"]) - - assert object.data["reaction_count"] == 1 - assert object.data["reactions"] == [["😀", [reactor.ap_id]]] - end - end - - describe "like an object" do - test_with_mock "sends an activity to federation", Federator, [:passthrough], [] do - Config.put([:instance, :federating], true) - note_activity = insert(:note_activity) - assert object_activity = Object.normalize(note_activity) - - user = insert(:user) - - {:ok, like_activity, _object} = ActivityPub.like(user, object_activity) - assert called(Federator.publish(like_activity)) - end - - test "returns exist activity if object already liked" do - note_activity = insert(:note_activity) - assert object_activity = Object.normalize(note_activity) - - user = insert(:user) - - {:ok, like_activity, _object} = ActivityPub.like(user, object_activity) - - {:ok, like_activity_exist, _object} = ActivityPub.like(user, object_activity) - assert like_activity == like_activity_exist - end - - test "reverts like activity on error" do - note_activity = insert(:note_activity) - object = Object.normalize(note_activity) - user = insert(:user) - - with_mock(Utils, [:passthrough], maybe_federate: fn _ -> {:error, :reverted} end) do - assert {:error, :reverted} = ActivityPub.like(user, object) - end - - assert Repo.aggregate(Activity, :count, :id) == 1 - assert Repo.get(Object, object.id) == object - end - - test "adds a like activity to the db" do - note_activity = insert(:note_activity) - assert object = Object.normalize(note_activity) - - user = insert(:user) - user_two = insert(:user) - - {:ok, like_activity, object} = ActivityPub.like(user, object) - - assert like_activity.data["actor"] == user.ap_id - assert like_activity.data["type"] == "Like" - assert like_activity.data["object"] == object.data["id"] - assert like_activity.data["to"] == [User.ap_followers(user), note_activity.data["actor"]] - assert like_activity.data["context"] == object.data["context"] - assert object.data["like_count"] == 1 - assert object.data["likes"] == [user.ap_id] - - # Just return the original activity if the user already liked it. - {:ok, same_like_activity, object} = ActivityPub.like(user, object) - - assert like_activity == same_like_activity - assert object.data["likes"] == [user.ap_id] - assert object.data["like_count"] == 1 - - {:ok, _like_activity, object} = ActivityPub.like(user_two, object) - assert object.data["like_count"] == 2 - end - end - - describe "unliking" do - test_with_mock "sends an activity to federation", Federator, [:passthrough], [] do - Config.put([:instance, :federating], true) - - note_activity = insert(:note_activity) - object = Object.normalize(note_activity) - user = insert(:user) - - {:ok, object} = ActivityPub.unlike(user, object) - refute called(Federator.publish()) - - {:ok, _like_activity, object} = ActivityPub.like(user, object) - assert object.data["like_count"] == 1 - - {:ok, unlike_activity, _, object} = ActivityPub.unlike(user, object) - assert object.data["like_count"] == 0 - - assert called(Federator.publish(unlike_activity)) - end - - test "reverts unliking on error" do - note_activity = insert(:note_activity) - object = Object.normalize(note_activity) - user = insert(:user) - - {:ok, like_activity, object} = ActivityPub.like(user, object) - assert object.data["like_count"] == 1 - - with_mock(Utils, [:passthrough], maybe_federate: fn _ -> {:error, :reverted} end) do - assert {:error, :reverted} = ActivityPub.unlike(user, object) - end - - assert Object.get_by_ap_id(object.data["id"]) == object - assert object.data["like_count"] == 1 - assert Activity.get_by_id(like_activity.id) - end - - test "unliking a previously liked object" do - note_activity = insert(:note_activity) - object = Object.normalize(note_activity) - user = insert(:user) - - # Unliking something that hasn't been liked does nothing - {:ok, object} = ActivityPub.unlike(user, object) - assert object.data["like_count"] == 0 - - {:ok, like_activity, object} = ActivityPub.like(user, object) - assert object.data["like_count"] == 1 - - {:ok, unlike_activity, _, object} = ActivityPub.unlike(user, object) - assert object.data["like_count"] == 0 - - assert Activity.get_by_id(like_activity.id) == nil - assert note_activity.actor in unlike_activity.recipients - end - end - - describe "announcing an object" do - test "adds an announce activity to the db" do - note_activity = insert(:note_activity) - object = Object.normalize(note_activity) - user = insert(:user) - - {:ok, announce_activity, object} = ActivityPub.announce(user, object) - assert object.data["announcement_count"] == 1 - assert object.data["announcements"] == [user.ap_id] - - assert announce_activity.data["to"] == [ - User.ap_followers(user), - note_activity.data["actor"] - ] - - assert announce_activity.data["object"] == object.data["id"] - assert announce_activity.data["actor"] == user.ap_id - assert announce_activity.data["context"] == object.data["context"] - end - - test "reverts annouce from object on error" do - note_activity = insert(:note_activity) - object = Object.normalize(note_activity) - user = insert(:user) - - with_mock(Utils, [:passthrough], maybe_federate: fn _ -> {:error, :reverted} end) do - assert {:error, :reverted} = ActivityPub.announce(user, object) - end - - reloaded_object = Object.get_by_ap_id(object.data["id"]) - assert reloaded_object == object - refute reloaded_object.data["announcement_count"] - refute reloaded_object.data["announcements"] - end - end - - describe "announcing a private object" do - test "adds an announce activity to the db if the audience is not widened" do - user = insert(:user) - {:ok, note_activity} = CommonAPI.post(user, %{"status" => ".", "visibility" => "private"}) - object = Object.normalize(note_activity) - - {:ok, announce_activity, object} = ActivityPub.announce(user, object, nil, true, false) - - assert announce_activity.data["to"] == [User.ap_followers(user)] - - assert announce_activity.data["object"] == object.data["id"] - assert announce_activity.data["actor"] == user.ap_id - assert announce_activity.data["context"] == object.data["context"] - end - - test "does not add an announce activity to the db if the audience is widened" do - user = insert(:user) - {:ok, note_activity} = CommonAPI.post(user, %{"status" => ".", "visibility" => "private"}) - object = Object.normalize(note_activity) - - assert {:error, _} = ActivityPub.announce(user, object, nil, true, true) - end - - test "does not add an announce activity to the db if the announcer is not the author" do - user = insert(:user) - announcer = insert(:user) - {:ok, note_activity} = CommonAPI.post(user, %{"status" => ".", "visibility" => "private"}) - object = Object.normalize(note_activity) - - assert {:error, _} = ActivityPub.announce(announcer, object, nil, true, false) - end - end - - describe "unannouncing an object" do - test "unannouncing a previously announced object" do - note_activity = insert(:note_activity) - object = Object.normalize(note_activity) - user = insert(:user) - - # Unannouncing an object that is not announced does nothing - {:ok, object} = ActivityPub.unannounce(user, object) - refute object.data["announcement_count"] - - {:ok, announce_activity, object} = ActivityPub.announce(user, object) - assert object.data["announcement_count"] == 1 - - {:ok, unannounce_activity, object} = ActivityPub.unannounce(user, object) - assert object.data["announcement_count"] == 0 - - assert unannounce_activity.data["to"] == [ - User.ap_followers(user), - object.data["actor"] - ] - - assert unannounce_activity.data["type"] == "Undo" - assert unannounce_activity.data["object"] == announce_activity.data - assert unannounce_activity.data["actor"] == user.ap_id - assert unannounce_activity.data["context"] == announce_activity.data["context"] - - assert Activity.get_by_id(announce_activity.id) == nil - end - - test "reverts unannouncing on error" do - note_activity = insert(:note_activity) - object = Object.normalize(note_activity) - user = insert(:user) - - {:ok, _announce_activity, object} = ActivityPub.announce(user, object) - assert object.data["announcement_count"] == 1 - - with_mock(Utils, [:passthrough], maybe_federate: fn _ -> {:error, :reverted} end) do - assert {:error, :reverted} = ActivityPub.unannounce(user, object) - end - - object = Object.get_by_ap_id(object.data["id"]) - assert object.data["announcement_count"] == 1 - end - end - describe "uploading files" do test "copies the file to the configured folder" do file = %Plug.Upload{ @@ -1247,7 +882,7 @@ test "copies the file to the configured folder" do test "works with base64 encoded images" do file = %{ - "img" => data_uri() + img: data_uri() } {:ok, %Object{}} = ActivityPub.upload(file) @@ -1339,7 +974,7 @@ test "creates an undo activity for a pending follow request" do end end - describe "blocking / unblocking" do + describe "blocking" do test "reverts block activity on error" do [blocker, blocked] = insert_list(2, :user) @@ -1352,177 +987,38 @@ test "reverts block activity on error" do end test "creates a block activity" do + clear_config([:instance, :federating], true) blocker = insert(:user) blocked = insert(:user) - {:ok, activity} = ActivityPub.block(blocker, blocked) + with_mock Pleroma.Web.Federator, + publish: fn _ -> nil end do + {:ok, activity} = ActivityPub.block(blocker, blocked) - assert activity.data["type"] == "Block" - assert activity.data["actor"] == blocker.ap_id - assert activity.data["object"] == blocked.ap_id - end + assert activity.data["type"] == "Block" + assert activity.data["actor"] == blocker.ap_id + assert activity.data["object"] == blocked.ap_id - test "reverts unblock activity on error" do - [blocker, blocked] = insert_list(2, :user) - {:ok, block_activity} = ActivityPub.block(blocker, blocked) - - with_mock(Utils, [:passthrough], maybe_federate: fn _ -> {:error, :reverted} end) do - assert {:error, :reverted} = ActivityPub.unblock(blocker, blocked) + assert called(Pleroma.Web.Federator.publish(activity)) end - - assert block_activity.data["type"] == "Block" - assert block_activity.data["actor"] == blocker.ap_id - - assert Repo.aggregate(Activity, :count, :id) == 1 - assert Repo.aggregate(Object, :count, :id) == 1 end - test "creates an undo activity for the last block" do + test "works with outgoing blocks disabled, but doesn't federate" do + clear_config([:instance, :federating], true) + clear_config([:activitypub, :outgoing_blocks], false) blocker = insert(:user) blocked = insert(:user) - {:ok, block_activity} = ActivityPub.block(blocker, blocked) - {:ok, activity} = ActivityPub.unblock(blocker, blocked) + with_mock Pleroma.Web.Federator, + publish: fn _ -> nil end do + {:ok, activity} = ActivityPub.block(blocker, blocked) - assert activity.data["type"] == "Undo" - assert activity.data["actor"] == blocker.ap_id + assert activity.data["type"] == "Block" + assert activity.data["actor"] == blocker.ap_id + assert activity.data["object"] == blocked.ap_id - embedded_object = activity.data["object"] - assert is_map(embedded_object) - assert embedded_object["type"] == "Block" - assert embedded_object["object"] == blocked.ap_id - assert embedded_object["id"] == block_activity.data["id"] - end - end - - describe "deletion" do - setup do: clear_config([:instance, :rewrite_policy]) - - test "it reverts deletion on error" do - note = insert(:note_activity) - object = Object.normalize(note) - - with_mock(Utils, [:passthrough], maybe_federate: fn _ -> {:error, :reverted} end) do - assert {:error, :reverted} = ActivityPub.delete(object) + refute called(Pleroma.Web.Federator.publish(:_)) end - - assert Repo.aggregate(Activity, :count, :id) == 1 - assert Repo.get(Object, object.id) == object - assert Activity.get_by_id(note.id) == note - end - - test "it creates a delete activity and deletes the original object" do - note = insert(:note_activity) - object = Object.normalize(note) - {:ok, delete} = ActivityPub.delete(object) - - assert delete.data["type"] == "Delete" - assert delete.data["actor"] == note.data["actor"] - assert delete.data["object"] == object.data["id"] - - assert Activity.get_by_id(delete.id) != nil - - assert Repo.get(Object, object.id).data["type"] == "Tombstone" - end - - test "decrements user note count only for public activities" do - user = insert(:user, note_count: 10) - - {:ok, a1} = - CommonAPI.post(User.get_cached_by_id(user.id), %{ - "status" => "yeah", - "visibility" => "public" - }) - - {:ok, a2} = - CommonAPI.post(User.get_cached_by_id(user.id), %{ - "status" => "yeah", - "visibility" => "unlisted" - }) - - {:ok, a3} = - CommonAPI.post(User.get_cached_by_id(user.id), %{ - "status" => "yeah", - "visibility" => "private" - }) - - {:ok, a4} = - CommonAPI.post(User.get_cached_by_id(user.id), %{ - "status" => "yeah", - "visibility" => "direct" - }) - - {:ok, _} = Object.normalize(a1) |> ActivityPub.delete() - {:ok, _} = Object.normalize(a2) |> ActivityPub.delete() - {:ok, _} = Object.normalize(a3) |> ActivityPub.delete() - {:ok, _} = Object.normalize(a4) |> ActivityPub.delete() - - user = User.get_cached_by_id(user.id) - assert user.note_count == 10 - end - - test "it creates a delete activity and checks that it is also sent to users mentioned by the deleted object" do - user = insert(:user) - note = insert(:note_activity) - object = Object.normalize(note) - - {:ok, object} = - object - |> Object.change(%{ - data: %{ - "actor" => object.data["actor"], - "id" => object.data["id"], - "to" => [user.ap_id], - "type" => "Note" - } - }) - |> Object.update_and_set_cache() - - {:ok, delete} = ActivityPub.delete(object) - - assert user.ap_id in delete.data["to"] - end - - test "decreases reply count" do - user = insert(:user) - user2 = insert(:user) - - {:ok, activity} = CommonAPI.post(user, %{"status" => "1", "visibility" => "public"}) - reply_data = %{"status" => "1", "in_reply_to_status_id" => activity.id} - ap_id = activity.data["id"] - - {:ok, public_reply} = CommonAPI.post(user2, Map.put(reply_data, "visibility", "public")) - {:ok, unlisted_reply} = CommonAPI.post(user2, Map.put(reply_data, "visibility", "unlisted")) - {:ok, private_reply} = CommonAPI.post(user2, Map.put(reply_data, "visibility", "private")) - {:ok, direct_reply} = CommonAPI.post(user2, Map.put(reply_data, "visibility", "direct")) - - _ = CommonAPI.delete(direct_reply.id, user2) - assert %{data: data, object: object} = Activity.get_by_ap_id_with_object(ap_id) - assert object.data["repliesCount"] == 2 - - _ = CommonAPI.delete(private_reply.id, user2) - assert %{data: data, object: object} = Activity.get_by_ap_id_with_object(ap_id) - assert object.data["repliesCount"] == 2 - - _ = CommonAPI.delete(public_reply.id, user2) - assert %{data: data, object: object} = Activity.get_by_ap_id_with_object(ap_id) - assert object.data["repliesCount"] == 1 - - _ = CommonAPI.delete(unlisted_reply.id, user2) - assert %{data: data, object: object} = Activity.get_by_ap_id_with_object(ap_id) - assert object.data["repliesCount"] == 0 - end - - test "it passes delete activity through MRF before deleting the object" do - Pleroma.Config.put([:instance, :rewrite_policy], Pleroma.Web.ActivityPub.MRF.DropPolicy) - - note = insert(:note_activity) - object = Object.normalize(note) - - {:error, {:reject, _}} = ActivityPub.delete(object) - - assert Activity.get_by_id(note.id) - assert Repo.get(Object, object.id).data["type"] == object.data["type"] end end @@ -1541,23 +1037,22 @@ test "it filters broken threads" do {:ok, user3} = User.follow(user3, user2) assert User.following?(user3, user2) - {:ok, public_activity} = CommonAPI.post(user3, %{"status" => "hi 1"}) + {:ok, public_activity} = CommonAPI.post(user3, %{status: "hi 1"}) - {:ok, private_activity_1} = - CommonAPI.post(user3, %{"status" => "hi 2", "visibility" => "private"}) + {:ok, private_activity_1} = CommonAPI.post(user3, %{status: "hi 2", visibility: "private"}) {:ok, private_activity_2} = CommonAPI.post(user2, %{ - "status" => "hi 3", - "visibility" => "private", - "in_reply_to_status_id" => private_activity_1.id + status: "hi 3", + visibility: "private", + in_reply_to_status_id: private_activity_1.id }) {:ok, private_activity_3} = CommonAPI.post(user3, %{ - "status" => "hi 4", - "visibility" => "private", - "in_reply_to_status_id" => private_activity_2.id + status: "hi 4", + visibility: "private", + in_reply_to_status_id: private_activity_2.id }) activities = @@ -1607,9 +1102,9 @@ test "returned pinned statuses" do Config.put([:instance, :max_pinned_statuses], 3) user = insert(:user) - {:ok, activity_one} = CommonAPI.post(user, %{"status" => "HI!!!"}) - {:ok, activity_two} = CommonAPI.post(user, %{"status" => "HI!!!"}) - {:ok, activity_three} = CommonAPI.post(user, %{"status" => "HI!!!"}) + {:ok, activity_one} = CommonAPI.post(user, %{status: "HI!!!"}) + {:ok, activity_two} = CommonAPI.post(user, %{status: "HI!!!"}) + {:ok, activity_three} = CommonAPI.post(user, %{status: "HI!!!"}) CommonAPI.pin(activity_one.id, user) user = refresh_record(user) @@ -1630,7 +1125,7 @@ test "returned pinned statuses" do reporter = insert(:user) target_account = insert(:user) content = "foobar" - {:ok, activity} = CommonAPI.post(target_account, %{"status" => content}) + {:ok, activity} = CommonAPI.post(target_account, %{status: content}) context = Utils.generate_context_id() reporter_ap_id = reporter.ap_id @@ -1726,8 +1221,7 @@ test "fetch_activities/2 returns activities addressed to a list " do {:ok, list} = Pleroma.List.create("foo", user) {:ok, list} = Pleroma.List.follow(list, member) - {:ok, activity} = - CommonAPI.post(user, %{"status" => "foobar", "visibility" => "list:#{list.id}"}) + {:ok, activity} = CommonAPI.post(user, %{status: "foobar", visibility: "list:#{list.id}"}) activity = Repo.preload(activity, :bookmark) activity = %Activity{activity | thread_muted?: !!activity.thread_muted?} @@ -1745,8 +1239,8 @@ test "fetches private posts for followed users" do {:ok, activity} = CommonAPI.post(user, %{ - "status" => "thought I looked cute might delete later :3", - "visibility" => "private" + status: "thought I looked cute might delete later :3", + visibility: "private" }) [result] = ActivityPub.fetch_activities_bounded([user.follower_address], []) @@ -1755,12 +1249,12 @@ test "fetches private posts for followed users" do test "fetches only public posts for other users" do user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "#cofe", "visibility" => "public"}) + {:ok, activity} = CommonAPI.post(user, %{status: "#cofe", visibility: "public"}) {:ok, _private_activity} = CommonAPI.post(user, %{ - "status" => "why is tenshi eating a corndog so cute?", - "visibility" => "private" + status: "why is tenshi eating a corndog so cute?", + visibility: "private" }) [result] = ActivityPub.fetch_activities_bounded([], [user.follower_address]) @@ -1888,20 +1382,20 @@ test "returns a favourite activities sorted by adds to favorite" do other_user = insert(:user) user1 = insert(:user) user2 = insert(:user) - {:ok, a1} = CommonAPI.post(user1, %{"status" => "bla"}) - {:ok, _a2} = CommonAPI.post(user2, %{"status" => "traps are happy"}) - {:ok, a3} = CommonAPI.post(user2, %{"status" => "Trees Are "}) - {:ok, a4} = CommonAPI.post(user2, %{"status" => "Agent Smith "}) - {:ok, a5} = CommonAPI.post(user1, %{"status" => "Red or Blue "}) + {:ok, a1} = CommonAPI.post(user1, %{status: "bla"}) + {:ok, _a2} = CommonAPI.post(user2, %{status: "traps are happy"}) + {:ok, a3} = CommonAPI.post(user2, %{status: "Trees Are "}) + {:ok, a4} = CommonAPI.post(user2, %{status: "Agent Smith "}) + {:ok, a5} = CommonAPI.post(user1, %{status: "Red or Blue "}) - {:ok, _, _} = CommonAPI.favorite(a4.id, user) - {:ok, _, _} = CommonAPI.favorite(a3.id, other_user) - {:ok, _, _} = CommonAPI.favorite(a3.id, user) - {:ok, _, _} = CommonAPI.favorite(a5.id, other_user) - {:ok, _, _} = CommonAPI.favorite(a5.id, user) - {:ok, _, _} = CommonAPI.favorite(a4.id, other_user) - {:ok, _, _} = CommonAPI.favorite(a1.id, user) - {:ok, _, _} = CommonAPI.favorite(a1.id, other_user) + {:ok, _} = CommonAPI.favorite(user, a4.id) + {:ok, _} = CommonAPI.favorite(other_user, a3.id) + {:ok, _} = CommonAPI.favorite(user, a3.id) + {:ok, _} = CommonAPI.favorite(other_user, a5.id) + {:ok, _} = CommonAPI.favorite(user, a5.id) + {:ok, _} = CommonAPI.favorite(other_user, a4.id) + {:ok, _} = CommonAPI.favorite(user, a1.id) + {:ok, _} = CommonAPI.favorite(other_user, a1.id) result = ActivityPub.fetch_favourites(user) assert Enum.map(result, & &1.id) == [a1.id, a5.id, a3.id, a4.id] @@ -1968,4 +1462,543 @@ test "old user must be in the new user's `also_known_as` list" do ActivityPub.move(old_user, new_user) end end + + test "doesn't retrieve replies activities with exclude_replies" do + user = insert(:user) + + {:ok, activity} = CommonAPI.post(user, %{status: "yeah"}) + + {:ok, _reply} = CommonAPI.post(user, %{status: "yeah", in_reply_to_status_id: activity.id}) + + [result] = ActivityPub.fetch_public_activities(%{"exclude_replies" => "true"}) + + assert result.id == activity.id + + assert length(ActivityPub.fetch_public_activities()) == 2 + end + + describe "replies filtering with public messages" do + setup :public_messages + + test "public timeline", %{users: %{u1: user}} do + activities_ids = + %{} + |> Map.put("type", ["Create", "Announce"]) + |> Map.put("local_only", false) + |> Map.put("blocking_user", user) + |> Map.put("muting_user", user) + |> Map.put("reply_filtering_user", user) + |> ActivityPub.fetch_public_activities() + |> Enum.map(& &1.id) + + assert length(activities_ids) == 16 + end + + test "public timeline with reply_visibility `following`", %{ + users: %{u1: user}, + u1: u1, + u2: u2, + u3: u3, + u4: u4, + activities: activities + } do + activities_ids = + %{} + |> Map.put("type", ["Create", "Announce"]) + |> Map.put("local_only", false) + |> Map.put("blocking_user", user) + |> Map.put("muting_user", user) + |> Map.put("reply_visibility", "following") + |> Map.put("reply_filtering_user", user) + |> ActivityPub.fetch_public_activities() + |> Enum.map(& &1.id) + + assert length(activities_ids) == 14 + + visible_ids = + Map.values(u1) ++ Map.values(u2) ++ Map.values(u4) ++ Map.values(activities) ++ [u3[:r1]] + + assert Enum.all?(visible_ids, &(&1 in activities_ids)) + end + + test "public timeline with reply_visibility `self`", %{ + users: %{u1: user}, + u1: u1, + u2: u2, + u3: u3, + u4: u4, + activities: activities + } do + activities_ids = + %{} + |> Map.put("type", ["Create", "Announce"]) + |> Map.put("local_only", false) + |> Map.put("blocking_user", user) + |> Map.put("muting_user", user) + |> Map.put("reply_visibility", "self") + |> Map.put("reply_filtering_user", user) + |> ActivityPub.fetch_public_activities() + |> Enum.map(& &1.id) + + assert length(activities_ids) == 10 + visible_ids = Map.values(u1) ++ [u2[:r1], u3[:r1], u4[:r1]] ++ Map.values(activities) + assert Enum.all?(visible_ids, &(&1 in activities_ids)) + end + + test "home timeline", %{ + users: %{u1: user}, + activities: activities, + u1: u1, + u2: u2, + u3: u3, + u4: u4 + } do + params = + %{} + |> Map.put("type", ["Create", "Announce"]) + |> Map.put("blocking_user", user) + |> Map.put("muting_user", user) + |> Map.put("user", user) + |> Map.put("reply_filtering_user", user) + + activities_ids = + ActivityPub.fetch_activities([user.ap_id | User.following(user)], params) + |> Enum.map(& &1.id) + + assert length(activities_ids) == 13 + + visible_ids = + Map.values(u1) ++ + Map.values(u3) ++ + [ + activities[:a1], + activities[:a2], + activities[:a4], + u2[:r1], + u2[:r3], + u4[:r1], + u4[:r2] + ] + + assert Enum.all?(visible_ids, &(&1 in activities_ids)) + end + + test "home timeline with reply_visibility `following`", %{ + users: %{u1: user}, + activities: activities, + u1: u1, + u2: u2, + u3: u3, + u4: u4 + } do + params = + %{} + |> Map.put("type", ["Create", "Announce"]) + |> Map.put("blocking_user", user) + |> Map.put("muting_user", user) + |> Map.put("user", user) + |> Map.put("reply_visibility", "following") + |> Map.put("reply_filtering_user", user) + + activities_ids = + ActivityPub.fetch_activities([user.ap_id | User.following(user)], params) + |> Enum.map(& &1.id) + + assert length(activities_ids) == 11 + + visible_ids = + Map.values(u1) ++ + [ + activities[:a1], + activities[:a2], + activities[:a4], + u2[:r1], + u2[:r3], + u3[:r1], + u4[:r1], + u4[:r2] + ] + + assert Enum.all?(visible_ids, &(&1 in activities_ids)) + end + + test "home timeline with reply_visibility `self`", %{ + users: %{u1: user}, + activities: activities, + u1: u1, + u2: u2, + u3: u3, + u4: u4 + } do + params = + %{} + |> Map.put("type", ["Create", "Announce"]) + |> Map.put("blocking_user", user) + |> Map.put("muting_user", user) + |> Map.put("user", user) + |> Map.put("reply_visibility", "self") + |> Map.put("reply_filtering_user", user) + + activities_ids = + ActivityPub.fetch_activities([user.ap_id | User.following(user)], params) + |> Enum.map(& &1.id) + + assert length(activities_ids) == 9 + + visible_ids = + Map.values(u1) ++ + [ + activities[:a1], + activities[:a2], + activities[:a4], + u2[:r1], + u3[:r1], + u4[:r1] + ] + + assert Enum.all?(visible_ids, &(&1 in activities_ids)) + end + end + + describe "replies filtering with private messages" do + setup :private_messages + + test "public timeline", %{users: %{u1: user}} do + activities_ids = + %{} + |> Map.put("type", ["Create", "Announce"]) + |> Map.put("local_only", false) + |> Map.put("blocking_user", user) + |> Map.put("muting_user", user) + |> Map.put("user", user) + |> ActivityPub.fetch_public_activities() + |> Enum.map(& &1.id) + + assert activities_ids == [] + end + + test "public timeline with default reply_visibility `following`", %{users: %{u1: user}} do + activities_ids = + %{} + |> Map.put("type", ["Create", "Announce"]) + |> Map.put("local_only", false) + |> Map.put("blocking_user", user) + |> Map.put("muting_user", user) + |> Map.put("reply_visibility", "following") + |> Map.put("reply_filtering_user", user) + |> Map.put("user", user) + |> ActivityPub.fetch_public_activities() + |> Enum.map(& &1.id) + + assert activities_ids == [] + end + + test "public timeline with default reply_visibility `self`", %{users: %{u1: user}} do + activities_ids = + %{} + |> Map.put("type", ["Create", "Announce"]) + |> Map.put("local_only", false) + |> Map.put("blocking_user", user) + |> Map.put("muting_user", user) + |> Map.put("reply_visibility", "self") + |> Map.put("reply_filtering_user", user) + |> Map.put("user", user) + |> ActivityPub.fetch_public_activities() + |> Enum.map(& &1.id) + + assert activities_ids == [] + end + + test "home timeline", %{users: %{u1: user}} do + params = + %{} + |> Map.put("type", ["Create", "Announce"]) + |> Map.put("blocking_user", user) + |> Map.put("muting_user", user) + |> Map.put("user", user) + + activities_ids = + ActivityPub.fetch_activities([user.ap_id | User.following(user)], params) + |> Enum.map(& &1.id) + + assert length(activities_ids) == 12 + end + + test "home timeline with default reply_visibility `following`", %{users: %{u1: user}} do + params = + %{} + |> Map.put("type", ["Create", "Announce"]) + |> Map.put("blocking_user", user) + |> Map.put("muting_user", user) + |> Map.put("user", user) + |> Map.put("reply_visibility", "following") + |> Map.put("reply_filtering_user", user) + + activities_ids = + ActivityPub.fetch_activities([user.ap_id | User.following(user)], params) + |> Enum.map(& &1.id) + + assert length(activities_ids) == 12 + end + + test "home timeline with default reply_visibility `self`", %{ + users: %{u1: user}, + activities: activities, + u1: u1, + u2: u2, + u3: u3, + u4: u4 + } do + params = + %{} + |> Map.put("type", ["Create", "Announce"]) + |> Map.put("blocking_user", user) + |> Map.put("muting_user", user) + |> Map.put("user", user) + |> Map.put("reply_visibility", "self") + |> Map.put("reply_filtering_user", user) + + activities_ids = + ActivityPub.fetch_activities([user.ap_id | User.following(user)], params) + |> Enum.map(& &1.id) + + assert length(activities_ids) == 10 + + visible_ids = + Map.values(u1) ++ Map.values(u4) ++ [u2[:r1], u3[:r1]] ++ Map.values(activities) + + assert Enum.all?(visible_ids, &(&1 in activities_ids)) + end + end + + defp public_messages(_) do + [u1, u2, u3, u4] = insert_list(4, :user) + {:ok, u1} = User.follow(u1, u2) + {:ok, u2} = User.follow(u2, u1) + {:ok, u1} = User.follow(u1, u4) + {:ok, u4} = User.follow(u4, u1) + + {:ok, u2} = User.follow(u2, u3) + {:ok, u3} = User.follow(u3, u2) + + {:ok, a1} = CommonAPI.post(u1, %{status: "Status"}) + + {:ok, r1_1} = + CommonAPI.post(u2, %{ + status: "@#{u1.nickname} reply from u2 to u1", + in_reply_to_status_id: a1.id + }) + + {:ok, r1_2} = + CommonAPI.post(u3, %{ + status: "@#{u1.nickname} reply from u3 to u1", + in_reply_to_status_id: a1.id + }) + + {:ok, r1_3} = + CommonAPI.post(u4, %{ + status: "@#{u1.nickname} reply from u4 to u1", + in_reply_to_status_id: a1.id + }) + + {:ok, a2} = CommonAPI.post(u2, %{status: "Status"}) + + {:ok, r2_1} = + CommonAPI.post(u1, %{ + status: "@#{u2.nickname} reply from u1 to u2", + in_reply_to_status_id: a2.id + }) + + {:ok, r2_2} = + CommonAPI.post(u3, %{ + status: "@#{u2.nickname} reply from u3 to u2", + in_reply_to_status_id: a2.id + }) + + {:ok, r2_3} = + CommonAPI.post(u4, %{ + status: "@#{u2.nickname} reply from u4 to u2", + in_reply_to_status_id: a2.id + }) + + {:ok, a3} = CommonAPI.post(u3, %{status: "Status"}) + + {:ok, r3_1} = + CommonAPI.post(u1, %{ + status: "@#{u3.nickname} reply from u1 to u3", + in_reply_to_status_id: a3.id + }) + + {:ok, r3_2} = + CommonAPI.post(u2, %{ + status: "@#{u3.nickname} reply from u2 to u3", + in_reply_to_status_id: a3.id + }) + + {:ok, r3_3} = + CommonAPI.post(u4, %{ + status: "@#{u3.nickname} reply from u4 to u3", + in_reply_to_status_id: a3.id + }) + + {:ok, a4} = CommonAPI.post(u4, %{status: "Status"}) + + {:ok, r4_1} = + CommonAPI.post(u1, %{ + status: "@#{u4.nickname} reply from u1 to u4", + in_reply_to_status_id: a4.id + }) + + {:ok, r4_2} = + CommonAPI.post(u2, %{ + status: "@#{u4.nickname} reply from u2 to u4", + in_reply_to_status_id: a4.id + }) + + {:ok, r4_3} = + CommonAPI.post(u3, %{ + status: "@#{u4.nickname} reply from u3 to u4", + in_reply_to_status_id: a4.id + }) + + {:ok, + users: %{u1: u1, u2: u2, u3: u3, u4: u4}, + activities: %{a1: a1.id, a2: a2.id, a3: a3.id, a4: a4.id}, + u1: %{r1: r1_1.id, r2: r1_2.id, r3: r1_3.id}, + u2: %{r1: r2_1.id, r2: r2_2.id, r3: r2_3.id}, + u3: %{r1: r3_1.id, r2: r3_2.id, r3: r3_3.id}, + u4: %{r1: r4_1.id, r2: r4_2.id, r3: r4_3.id}} + end + + defp private_messages(_) do + [u1, u2, u3, u4] = insert_list(4, :user) + {:ok, u1} = User.follow(u1, u2) + {:ok, u2} = User.follow(u2, u1) + {:ok, u1} = User.follow(u1, u3) + {:ok, u3} = User.follow(u3, u1) + {:ok, u1} = User.follow(u1, u4) + {:ok, u4} = User.follow(u4, u1) + + {:ok, u2} = User.follow(u2, u3) + {:ok, u3} = User.follow(u3, u2) + + {:ok, a1} = CommonAPI.post(u1, %{status: "Status", visibility: "private"}) + + {:ok, r1_1} = + CommonAPI.post(u2, %{ + status: "@#{u1.nickname} reply from u2 to u1", + in_reply_to_status_id: a1.id, + visibility: "private" + }) + + {:ok, r1_2} = + CommonAPI.post(u3, %{ + status: "@#{u1.nickname} reply from u3 to u1", + in_reply_to_status_id: a1.id, + visibility: "private" + }) + + {:ok, r1_3} = + CommonAPI.post(u4, %{ + status: "@#{u1.nickname} reply from u4 to u1", + in_reply_to_status_id: a1.id, + visibility: "private" + }) + + {:ok, a2} = CommonAPI.post(u2, %{status: "Status", visibility: "private"}) + + {:ok, r2_1} = + CommonAPI.post(u1, %{ + status: "@#{u2.nickname} reply from u1 to u2", + in_reply_to_status_id: a2.id, + visibility: "private" + }) + + {:ok, r2_2} = + CommonAPI.post(u3, %{ + status: "@#{u2.nickname} reply from u3 to u2", + in_reply_to_status_id: a2.id, + visibility: "private" + }) + + {:ok, a3} = CommonAPI.post(u3, %{status: "Status", visibility: "private"}) + + {:ok, r3_1} = + CommonAPI.post(u1, %{ + status: "@#{u3.nickname} reply from u1 to u3", + in_reply_to_status_id: a3.id, + visibility: "private" + }) + + {:ok, r3_2} = + CommonAPI.post(u2, %{ + status: "@#{u3.nickname} reply from u2 to u3", + in_reply_to_status_id: a3.id, + visibility: "private" + }) + + {:ok, a4} = CommonAPI.post(u4, %{status: "Status", visibility: "private"}) + + {:ok, r4_1} = + CommonAPI.post(u1, %{ + status: "@#{u4.nickname} reply from u1 to u4", + in_reply_to_status_id: a4.id, + visibility: "private" + }) + + {:ok, + users: %{u1: u1, u2: u2, u3: u3, u4: u4}, + activities: %{a1: a1.id, a2: a2.id, a3: a3.id, a4: a4.id}, + u1: %{r1: r1_1.id, r2: r1_2.id, r3: r1_3.id}, + u2: %{r1: r2_1.id, r2: r2_2.id}, + u3: %{r1: r3_1.id, r2: r3_2.id}, + u4: %{r1: r4_1.id}} + end + + describe "maybe_update_follow_information/1" do + setup do + clear_config([:instance, :external_user_synchronization], true) + + user = %{ + local: false, + ap_id: "https://gensokyo.2hu/users/raymoo", + following_address: "https://gensokyo.2hu/users/following", + follower_address: "https://gensokyo.2hu/users/followers", + type: "Person" + } + + %{user: user} + end + + test "logs an error when it can't fetch the info", %{user: user} do + assert capture_log(fn -> + ActivityPub.maybe_update_follow_information(user) + end) =~ "Follower/Following counter update for #{user.ap_id} failed" + end + + test "just returns the input if the user type is Application", %{ + user: user + } do + user = + user + |> Map.put(:type, "Application") + + refute capture_log(fn -> + assert ^user = ActivityPub.maybe_update_follow_information(user) + end) =~ "Follower/Following counter update for #{user.ap_id} failed" + end + + test "it just returns the input if the user has no following/follower addresses", %{ + user: user + } do + user = + user + |> Map.put(:following_address, nil) + |> Map.put(:follower_address, nil) + + refute capture_log(fn -> + assert ^user = ActivityPub.maybe_update_follow_information(user) + end) =~ "Follower/Following counter update for #{user.ap_id} failed" + end + end end diff --git a/test/web/activity_pub/mrf/anti_followbot_policy_test.exs b/test/web/activity_pub/mrf/anti_followbot_policy_test.exs index 37a7bfcf7..fca0de7c6 100644 --- a/test/web/activity_pub/mrf/anti_followbot_policy_test.exs +++ b/test/web/activity_pub/mrf/anti_followbot_policy_test.exs @@ -1,5 +1,5 @@ # Pleroma: A lightweight social networking server -# Copyright © 2019 Pleroma Authors +# Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Web.ActivityPub.MRF.AntiFollowbotPolicyTest do diff --git a/test/web/activity_pub/mrf/anti_link_spam_policy_test.exs b/test/web/activity_pub/mrf/anti_link_spam_policy_test.exs index b524fdd23..1a13699be 100644 --- a/test/web/activity_pub/mrf/anti_link_spam_policy_test.exs +++ b/test/web/activity_pub/mrf/anti_link_spam_policy_test.exs @@ -1,5 +1,5 @@ # Pleroma: A lightweight social networking server -# Copyright © 2019 Pleroma Authors +# Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicyTest do @@ -110,6 +110,15 @@ test "it allows posts with links" do end describe "with unknown actors" do + setup do + Tesla.Mock.mock(fn + %{method: :get, url: "http://invalid.actor"} -> + %Tesla.Env{status: 500, body: ""} + end) + + :ok + end + test "it rejects posts without links" do message = @linkless_message diff --git a/test/web/activity_pub/mrf/ensure_re_prepended_test.exs b/test/web/activity_pub/mrf/ensure_re_prepended_test.exs index dbc8b9e80..38ddec5bb 100644 --- a/test/web/activity_pub/mrf/ensure_re_prepended_test.exs +++ b/test/web/activity_pub/mrf/ensure_re_prepended_test.exs @@ -1,5 +1,5 @@ # Pleroma: A lightweight social networking server -# Copyright © 2019 Pleroma Authors +# Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Web.ActivityPub.MRF.EnsureRePrependedTest do diff --git a/test/web/activity_pub/mrf/no_placeholder_text_policy_test.exs b/test/web/activity_pub/mrf/no_placeholder_text_policy_test.exs index 63ed71129..64ea61dd4 100644 --- a/test/web/activity_pub/mrf/no_placeholder_text_policy_test.exs +++ b/test/web/activity_pub/mrf/no_placeholder_text_policy_test.exs @@ -1,5 +1,5 @@ # Pleroma: A lightweight social networking server -# Copyright © 2019 Pleroma Authors +# Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Web.ActivityPub.MRF.NoPlaceholderTextPolicyTest do diff --git a/test/web/activity_pub/mrf/normalize_markup_test.exs b/test/web/activity_pub/mrf/normalize_markup_test.exs index 0207be56b..9b39c45bd 100644 --- a/test/web/activity_pub/mrf/normalize_markup_test.exs +++ b/test/web/activity_pub/mrf/normalize_markup_test.exs @@ -1,5 +1,5 @@ # Pleroma: A lightweight social networking server -# Copyright © 2019 Pleroma Authors +# Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Web.ActivityPub.MRF.NormalizeMarkupTest do diff --git a/test/web/activity_pub/mrf/object_age_policy_test.exs b/test/web/activity_pub/mrf/object_age_policy_test.exs index 0fbc5f57a..b0fb753bd 100644 --- a/test/web/activity_pub/mrf/object_age_policy_test.exs +++ b/test/web/activity_pub/mrf/object_age_policy_test.exs @@ -1,5 +1,5 @@ # Pleroma: A lightweight social networking server -# Copyright © 2019 Pleroma Authors +# Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Web.ActivityPub.MRF.ObjectAgePolicyTest do @@ -20,26 +20,38 @@ defmodule Pleroma.Web.ActivityPub.MRF.ObjectAgePolicyTest do :ok end + defp get_old_message do + File.read!("test/fixtures/mastodon-post-activity.json") + |> Poison.decode!() + end + + defp get_new_message do + old_message = get_old_message() + + new_object = + old_message + |> Map.get("object") + |> Map.put("published", DateTime.utc_now() |> DateTime.to_iso8601()) + + old_message + |> Map.put("object", new_object) + end + describe "with reject action" do test "it rejects an old post" do Config.put([:mrf_object_age, :actions], [:reject]) - data = - File.read!("test/fixtures/mastodon-post-activity.json") - |> Poison.decode!() + data = get_old_message() - {:reject, _} = ObjectAgePolicy.filter(data) + assert match?({:reject, _}, ObjectAgePolicy.filter(data)) end test "it allows a new post" do Config.put([:mrf_object_age, :actions], [:reject]) - data = - File.read!("test/fixtures/mastodon-post-activity.json") - |> Poison.decode!() - |> Map.put("published", DateTime.utc_now() |> DateTime.to_iso8601()) + data = get_new_message() - {:ok, _} = ObjectAgePolicy.filter(data) + assert match?({:ok, _}, ObjectAgePolicy.filter(data)) end end @@ -47,9 +59,7 @@ test "it allows a new post" do test "it delists an old post" do Config.put([:mrf_object_age, :actions], [:delist]) - data = - File.read!("test/fixtures/mastodon-post-activity.json") - |> Poison.decode!() + data = get_old_message() {:ok, _u} = User.get_or_fetch_by_ap_id(data["actor"]) @@ -61,14 +71,11 @@ test "it delists an old post" do test "it allows a new post" do Config.put([:mrf_object_age, :actions], [:delist]) - data = - File.read!("test/fixtures/mastodon-post-activity.json") - |> Poison.decode!() - |> Map.put("published", DateTime.utc_now() |> DateTime.to_iso8601()) + data = get_new_message() {:ok, _user} = User.get_or_fetch_by_ap_id(data["actor"]) - {:ok, ^data} = ObjectAgePolicy.filter(data) + assert match?({:ok, ^data}, ObjectAgePolicy.filter(data)) end end @@ -76,9 +83,7 @@ test "it allows a new post" do test "it strips followers collections from an old post" do Config.put([:mrf_object_age, :actions], [:strip_followers]) - data = - File.read!("test/fixtures/mastodon-post-activity.json") - |> Poison.decode!() + data = get_old_message() {:ok, user} = User.get_or_fetch_by_ap_id(data["actor"]) @@ -91,14 +96,11 @@ test "it strips followers collections from an old post" do test "it allows a new post" do Config.put([:mrf_object_age, :actions], [:strip_followers]) - data = - File.read!("test/fixtures/mastodon-post-activity.json") - |> Poison.decode!() - |> Map.put("published", DateTime.utc_now() |> DateTime.to_iso8601()) + data = get_new_message() {:ok, _u} = User.get_or_fetch_by_ap_id(data["actor"]) - {:ok, ^data} = ObjectAgePolicy.filter(data) + assert match?({:ok, ^data}, ObjectAgePolicy.filter(data)) end end end diff --git a/test/web/activity_pub/mrf/reject_non_public_test.exs b/test/web/activity_pub/mrf/reject_non_public_test.exs index abfd32df8..f36299b86 100644 --- a/test/web/activity_pub/mrf/reject_non_public_test.exs +++ b/test/web/activity_pub/mrf/reject_non_public_test.exs @@ -1,5 +1,5 @@ # Pleroma: A lightweight social networking server -# Copyright © 2019 Pleroma Authors +# Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Web.ActivityPub.MRF.RejectNonPublicTest do diff --git a/test/web/activity_pub/mrf/simple_policy_test.exs b/test/web/activity_pub/mrf/simple_policy_test.exs index 5aebbc675..b7b9bc6a2 100644 --- a/test/web/activity_pub/mrf/simple_policy_test.exs +++ b/test/web/activity_pub/mrf/simple_policy_test.exs @@ -1,5 +1,5 @@ # Pleroma: A lightweight social networking server -# Copyright © 2019 Pleroma Authors +# Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do @@ -17,7 +17,8 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do reject: [], accept: [], avatar_removal: [], - banner_removal: [] + banner_removal: [], + reject_deletes: [] ) describe "when :media_removal" do @@ -382,6 +383,66 @@ test "match with wildcard domain" do end end + describe "when :reject_deletes is empty" do + setup do: Config.put([:mrf_simple, :reject_deletes], []) + + test "it accepts deletions even from rejected servers" do + Config.put([:mrf_simple, :reject], ["remote.instance"]) + + deletion_message = build_remote_deletion_message() + + assert SimplePolicy.filter(deletion_message) == {:ok, deletion_message} + end + + test "it accepts deletions even from non-whitelisted servers" do + Config.put([:mrf_simple, :accept], ["non.matching.remote"]) + + deletion_message = build_remote_deletion_message() + + assert SimplePolicy.filter(deletion_message) == {:ok, deletion_message} + end + end + + describe "when :reject_deletes is not empty but it doesn't have a matching host" do + setup do: Config.put([:mrf_simple, :reject_deletes], ["non.matching.remote"]) + + test "it accepts deletions even from rejected servers" do + Config.put([:mrf_simple, :reject], ["remote.instance"]) + + deletion_message = build_remote_deletion_message() + + assert SimplePolicy.filter(deletion_message) == {:ok, deletion_message} + end + + test "it accepts deletions even from non-whitelisted servers" do + Config.put([:mrf_simple, :accept], ["non.matching.remote"]) + + deletion_message = build_remote_deletion_message() + + assert SimplePolicy.filter(deletion_message) == {:ok, deletion_message} + end + end + + describe "when :reject_deletes has a matching host" do + setup do: Config.put([:mrf_simple, :reject_deletes], ["remote.instance"]) + + test "it rejects the deletion" do + deletion_message = build_remote_deletion_message() + + assert SimplePolicy.filter(deletion_message) == {:reject, nil} + end + end + + describe "when :reject_deletes match with wildcard domain" do + setup do: Config.put([:mrf_simple, :reject_deletes], ["*.remote.instance"]) + + test "it rejects the deletion" do + deletion_message = build_remote_deletion_message() + + assert SimplePolicy.filter(deletion_message) == {:reject, nil} + end + end + defp build_local_message do %{ "actor" => "#{Pleroma.Web.base_url()}/users/alice", @@ -408,4 +469,11 @@ defp build_remote_user do "type" => "Person" } end + + defp build_remote_deletion_message do + %{ + "type" => "Delete", + "actor" => "https://remote.instance/users/bob" + } + end end diff --git a/test/web/activity_pub/mrf/steal_emoji_policy_test.exs b/test/web/activity_pub/mrf/steal_emoji_policy_test.exs new file mode 100644 index 000000000..3f8222736 --- /dev/null +++ b/test/web/activity_pub/mrf/steal_emoji_policy_test.exs @@ -0,0 +1,68 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.MRF.StealEmojiPolicyTest do + use Pleroma.DataCase + + alias Pleroma.Config + alias Pleroma.Web.ActivityPub.MRF.StealEmojiPolicy + + setup_all do + Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) + :ok + end + + setup do + emoji_path = Path.join(Config.get([:instance, :static_dir]), "emoji/stolen") + File.rm_rf!(emoji_path) + File.mkdir!(emoji_path) + + Pleroma.Emoji.reload() + + on_exit(fn -> + File.rm_rf!(emoji_path) + end) + + :ok + end + + test "does nothing by default" do + installed_emoji = Pleroma.Emoji.get_all() |> Enum.map(fn {k, _} -> k end) + refute "firedfox" in installed_emoji + + message = %{ + "type" => "Create", + "object" => %{ + "emoji" => [{"firedfox", "https://example.org/emoji/firedfox.png"}], + "actor" => "https://example.org/users/admin" + } + } + + assert {:ok, message} == StealEmojiPolicy.filter(message) + + installed_emoji = Pleroma.Emoji.get_all() |> Enum.map(fn {k, _} -> k end) + refute "firedfox" in installed_emoji + end + + test "Steals emoji on unknown shortcode from allowed remote host" do + installed_emoji = Pleroma.Emoji.get_all() |> Enum.map(fn {k, _} -> k end) + refute "firedfox" in installed_emoji + + message = %{ + "type" => "Create", + "object" => %{ + "emoji" => [{"firedfox", "https://example.org/emoji/firedfox.png"}], + "actor" => "https://example.org/users/admin" + } + } + + clear_config([:mrf_steal_emoji, :hosts], ["example.org"]) + clear_config([:mrf_steal_emoji, :size_limit], 284_468) + + assert {:ok, message} == StealEmojiPolicy.filter(message) + + installed_emoji = Pleroma.Emoji.get_all() |> Enum.map(fn {k, _} -> k end) + assert "firedfox" in installed_emoji + end +end diff --git a/test/web/activity_pub/object_validator_test.exs b/test/web/activity_pub/object_validator_test.exs new file mode 100644 index 000000000..7953eecf2 --- /dev/null +++ b/test/web/activity_pub/object_validator_test.exs @@ -0,0 +1,375 @@ +defmodule Pleroma.Web.ActivityPub.ObjectValidatorTest do + use Pleroma.DataCase + + alias Pleroma.Object + alias Pleroma.Web.ActivityPub.Builder + alias Pleroma.Web.ActivityPub.ObjectValidator + alias Pleroma.Web.ActivityPub.ObjectValidators.LikeValidator + alias Pleroma.Web.ActivityPub.Utils + alias Pleroma.Web.CommonAPI + + import Pleroma.Factory + + describe "EmojiReacts" do + setup do + user = insert(:user) + {:ok, post_activity} = CommonAPI.post(user, %{status: "uguu"}) + + object = Pleroma.Object.get_by_ap_id(post_activity.data["object"]) + + {:ok, valid_emoji_react, []} = Builder.emoji_react(user, object, "👌") + + %{user: user, post_activity: post_activity, valid_emoji_react: valid_emoji_react} + end + + test "it validates a valid EmojiReact", %{valid_emoji_react: valid_emoji_react} do + assert {:ok, _, _} = ObjectValidator.validate(valid_emoji_react, []) + end + + test "it is not valid without a 'content' field", %{valid_emoji_react: valid_emoji_react} do + without_content = + valid_emoji_react + |> Map.delete("content") + + {:error, cng} = ObjectValidator.validate(without_content, []) + + refute cng.valid? + assert {:content, {"can't be blank", [validation: :required]}} in cng.errors + end + + test "it is not valid with a non-emoji content field", %{valid_emoji_react: valid_emoji_react} do + without_emoji_content = + valid_emoji_react + |> Map.put("content", "x") + + {:error, cng} = ObjectValidator.validate(without_emoji_content, []) + + refute cng.valid? + + assert {:content, {"must be a single character emoji", []}} in cng.errors + end + end + + describe "Undos" do + setup do + user = insert(:user) + {:ok, post_activity} = CommonAPI.post(user, %{status: "uguu"}) + {:ok, like} = CommonAPI.favorite(user, post_activity.id) + {:ok, valid_like_undo, []} = Builder.undo(user, like) + + %{user: user, like: like, valid_like_undo: valid_like_undo} + end + + test "it validates a basic like undo", %{valid_like_undo: valid_like_undo} do + assert {:ok, _, _} = ObjectValidator.validate(valid_like_undo, []) + end + + test "it does not validate if the actor of the undo is not the actor of the object", %{ + valid_like_undo: valid_like_undo + } do + other_user = insert(:user, ap_id: "https://gensokyo.2hu/users/raymoo") + + bad_actor = + valid_like_undo + |> Map.put("actor", other_user.ap_id) + + {:error, cng} = ObjectValidator.validate(bad_actor, []) + + assert {:actor, {"not the same as object actor", []}} in cng.errors + end + + test "it does not validate if the object is missing", %{valid_like_undo: valid_like_undo} do + missing_object = + valid_like_undo + |> Map.put("object", "https://gensokyo.2hu/objects/1") + + {:error, cng} = ObjectValidator.validate(missing_object, []) + + assert {:object, {"can't find object", []}} in cng.errors + assert length(cng.errors) == 1 + end + end + + describe "deletes" do + setup do + user = insert(:user) + {:ok, post_activity} = CommonAPI.post(user, %{status: "cancel me daddy"}) + + {:ok, valid_post_delete, _} = Builder.delete(user, post_activity.data["object"]) + {:ok, valid_user_delete, _} = Builder.delete(user, user.ap_id) + + %{user: user, valid_post_delete: valid_post_delete, valid_user_delete: valid_user_delete} + end + + test "it is valid for a post deletion", %{valid_post_delete: valid_post_delete} do + {:ok, valid_post_delete, _} = ObjectValidator.validate(valid_post_delete, []) + + assert valid_post_delete["deleted_activity_id"] + end + + test "it is invalid if the object isn't in a list of certain types", %{ + valid_post_delete: valid_post_delete + } do + object = Object.get_by_ap_id(valid_post_delete["object"]) + + data = + object.data + |> Map.put("type", "Like") + + {:ok, _object} = + object + |> Ecto.Changeset.change(%{data: data}) + |> Object.update_and_set_cache() + + {:error, cng} = ObjectValidator.validate(valid_post_delete, []) + assert {:object, {"object not in allowed types", []}} in cng.errors + end + + test "it is valid for a user deletion", %{valid_user_delete: valid_user_delete} do + assert match?({:ok, _, _}, ObjectValidator.validate(valid_user_delete, [])) + end + + test "it's invalid if the id is missing", %{valid_post_delete: valid_post_delete} do + no_id = + valid_post_delete + |> Map.delete("id") + + {:error, cng} = ObjectValidator.validate(no_id, []) + + assert {:id, {"can't be blank", [validation: :required]}} in cng.errors + end + + test "it's invalid if the object doesn't exist", %{valid_post_delete: valid_post_delete} do + missing_object = + valid_post_delete + |> Map.put("object", "http://does.not/exist") + + {:error, cng} = ObjectValidator.validate(missing_object, []) + + assert {:object, {"can't find object", []}} in cng.errors + end + + test "it's invalid if the actor of the object and the actor of delete are from different domains", + %{valid_post_delete: valid_post_delete} do + valid_user = insert(:user) + + valid_other_actor = + valid_post_delete + |> Map.put("actor", valid_user.ap_id) + + assert match?({:ok, _, _}, ObjectValidator.validate(valid_other_actor, [])) + + invalid_other_actor = + valid_post_delete + |> Map.put("actor", "https://gensokyo.2hu/users/raymoo") + + {:error, cng} = ObjectValidator.validate(invalid_other_actor, []) + + assert {:actor, {"is not allowed to delete object", []}} in cng.errors + end + + test "it's valid if the actor of the object is a local superuser", + %{valid_post_delete: valid_post_delete} do + user = + insert(:user, local: true, is_moderator: true, ap_id: "https://gensokyo.2hu/users/raymoo") + + valid_other_actor = + valid_post_delete + |> Map.put("actor", user.ap_id) + + {:ok, _, meta} = ObjectValidator.validate(valid_other_actor, []) + assert meta[:do_not_federate] + end + end + + describe "likes" do + setup do + user = insert(:user) + {:ok, post_activity} = CommonAPI.post(user, %{status: "uguu"}) + + valid_like = %{ + "to" => [user.ap_id], + "cc" => [], + "type" => "Like", + "id" => Utils.generate_activity_id(), + "object" => post_activity.data["object"], + "actor" => user.ap_id, + "context" => "a context" + } + + %{valid_like: valid_like, user: user, post_activity: post_activity} + end + + test "returns ok when called in the ObjectValidator", %{valid_like: valid_like} do + {:ok, object, _meta} = ObjectValidator.validate(valid_like, []) + + assert "id" in Map.keys(object) + end + + test "is valid for a valid object", %{valid_like: valid_like} do + assert LikeValidator.cast_and_validate(valid_like).valid? + end + + test "sets the 'to' field to the object actor if no recipients are given", %{ + valid_like: valid_like, + user: user + } do + without_recipients = + valid_like + |> Map.delete("to") + + {:ok, object, _meta} = ObjectValidator.validate(without_recipients, []) + + assert object["to"] == [user.ap_id] + end + + test "sets the context field to the context of the object if no context is given", %{ + valid_like: valid_like, + post_activity: post_activity + } do + without_context = + valid_like + |> Map.delete("context") + + {:ok, object, _meta} = ObjectValidator.validate(without_context, []) + + assert object["context"] == post_activity.data["context"] + end + + test "it errors when the actor is missing or not known", %{valid_like: valid_like} do + without_actor = Map.delete(valid_like, "actor") + + refute LikeValidator.cast_and_validate(without_actor).valid? + + with_invalid_actor = Map.put(valid_like, "actor", "invalidactor") + + refute LikeValidator.cast_and_validate(with_invalid_actor).valid? + end + + test "it errors when the object is missing or not known", %{valid_like: valid_like} do + without_object = Map.delete(valid_like, "object") + + refute LikeValidator.cast_and_validate(without_object).valid? + + with_invalid_object = Map.put(valid_like, "object", "invalidobject") + + refute LikeValidator.cast_and_validate(with_invalid_object).valid? + end + + test "it errors when the actor has already like the object", %{ + valid_like: valid_like, + user: user, + post_activity: post_activity + } do + _like = CommonAPI.favorite(user, post_activity.id) + + refute LikeValidator.cast_and_validate(valid_like).valid? + end + + test "it works when actor or object are wrapped in maps", %{valid_like: valid_like} do + wrapped_like = + valid_like + |> Map.put("actor", %{"id" => valid_like["actor"]}) + |> Map.put("object", %{"id" => valid_like["object"]}) + + validated = LikeValidator.cast_and_validate(wrapped_like) + + assert validated.valid? + + assert {:actor, valid_like["actor"]} in validated.changes + assert {:object, valid_like["object"]} in validated.changes + end + end + + describe "announces" do + setup do + user = insert(:user) + announcer = insert(:user) + {:ok, post_activity} = CommonAPI.post(user, %{status: "uguu"}) + + object = Object.normalize(post_activity, false) + {:ok, valid_announce, []} = Builder.announce(announcer, object) + + %{ + valid_announce: valid_announce, + user: user, + post_activity: post_activity, + announcer: announcer + } + end + + test "returns ok for a valid announce", %{valid_announce: valid_announce} do + assert {:ok, _object, _meta} = ObjectValidator.validate(valid_announce, []) + end + + test "returns an error if the object can't be found", %{valid_announce: valid_announce} do + without_object = + valid_announce + |> Map.delete("object") + + {:error, cng} = ObjectValidator.validate(without_object, []) + + assert {:object, {"can't be blank", [validation: :required]}} in cng.errors + + nonexisting_object = + valid_announce + |> Map.put("object", "https://gensokyo.2hu/objects/99999999") + + {:error, cng} = ObjectValidator.validate(nonexisting_object, []) + + assert {:object, {"can't find object", []}} in cng.errors + end + + test "returns an error if we don't have the actor", %{valid_announce: valid_announce} do + nonexisting_actor = + valid_announce + |> Map.put("actor", "https://gensokyo.2hu/users/raymoo") + + {:error, cng} = ObjectValidator.validate(nonexisting_actor, []) + + assert {:actor, {"can't find user", []}} in cng.errors + end + + test "returns an error if the actor already announced the object", %{ + valid_announce: valid_announce, + announcer: announcer, + post_activity: post_activity + } do + _announce = CommonAPI.repeat(post_activity.id, announcer) + + {:error, cng} = ObjectValidator.validate(valid_announce, []) + + assert {:actor, {"already announced this object", []}} in cng.errors + assert {:object, {"already announced by this actor", []}} in cng.errors + end + + test "returns an error if the actor can't announce the object", %{ + announcer: announcer, + user: user + } do + {:ok, post_activity} = + CommonAPI.post(user, %{status: "a secret post", visibility: "private"}) + + object = Object.normalize(post_activity, false) + + # Another user can't announce it + {:ok, announce, []} = Builder.announce(announcer, object, public: false) + + {:error, cng} = ObjectValidator.validate(announce, []) + + assert {:actor, {"can not announce this object", []}} in cng.errors + + # The actor of the object can announce it + {:ok, announce, []} = Builder.announce(user, object, public: false) + + assert {:ok, _, _} = ObjectValidator.validate(announce, []) + + # The actor of the object can not announce it publicly + {:ok, announce, []} = Builder.announce(user, object, public: true) + + {:error, cng} = ObjectValidator.validate(announce, []) + + assert {:actor, {"can not announce this object publicly", []}} in cng.errors + end + end +end diff --git a/test/web/activity_pub/object_validators/note_validator_test.exs b/test/web/activity_pub/object_validators/note_validator_test.exs new file mode 100644 index 000000000..30c481ffb --- /dev/null +++ b/test/web/activity_pub/object_validators/note_validator_test.exs @@ -0,0 +1,35 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.ObjectValidators.NoteValidatorTest do + use Pleroma.DataCase + + alias Pleroma.Web.ActivityPub.ObjectValidators.NoteValidator + alias Pleroma.Web.ActivityPub.Utils + + import Pleroma.Factory + + describe "Notes" do + setup do + user = insert(:user) + + note = %{ + "id" => Utils.generate_activity_id(), + "type" => "Note", + "actor" => user.ap_id, + "to" => [user.follower_address], + "cc" => [], + "content" => "Hellow this is content.", + "context" => "xxx", + "summary" => "a post" + } + + %{user: user, note: note} + end + + test "a basic note validates", %{note: note} do + %{valid?: true} = NoteValidator.cast_and_validate(note) + end + end +end diff --git a/test/web/activity_pub/object_validators/types/date_time_test.exs b/test/web/activity_pub/object_validators/types/date_time_test.exs new file mode 100644 index 000000000..3e17a9497 --- /dev/null +++ b/test/web/activity_pub/object_validators/types/date_time_test.exs @@ -0,0 +1,32 @@ +defmodule Pleroma.Web.ActivityPub.ObjectValidators.Types.DateTimeTest do + alias Pleroma.Web.ActivityPub.ObjectValidators.Types.DateTime + use Pleroma.DataCase + + test "it validates an xsd:Datetime" do + valid_strings = [ + "2004-04-12T13:20:00", + "2004-04-12T13:20:15.5", + "2004-04-12T13:20:00-05:00", + "2004-04-12T13:20:00Z" + ] + + invalid_strings = [ + "2004-04-12T13:00", + "2004-04-1213:20:00", + "99-04-12T13:00", + "2004-04-12" + ] + + assert {:ok, "2004-04-01T12:00:00Z"} == DateTime.cast("2004-04-01T12:00:00Z") + + Enum.each(valid_strings, fn date_time -> + result = DateTime.cast(date_time) + assert {:ok, _} = result + end) + + Enum.each(invalid_strings, fn date_time -> + result = DateTime.cast(date_time) + assert :error == result + end) + end +end diff --git a/test/web/activity_pub/object_validators/types/object_id_test.exs b/test/web/activity_pub/object_validators/types/object_id_test.exs new file mode 100644 index 000000000..834213182 --- /dev/null +++ b/test/web/activity_pub/object_validators/types/object_id_test.exs @@ -0,0 +1,37 @@ +defmodule Pleroma.Web.ObjectValidators.Types.ObjectIDTest do + alias Pleroma.Web.ActivityPub.ObjectValidators.Types.ObjectID + use Pleroma.DataCase + + @uris [ + "http://lain.com/users/lain", + "http://lain.com", + "https://lain.com/object/1" + ] + + @non_uris [ + "https://", + "rin", + 1, + :x, + %{"1" => 2} + ] + + test "it accepts http uris" do + Enum.each(@uris, fn uri -> + assert {:ok, uri} == ObjectID.cast(uri) + end) + end + + test "it accepts an object with a nested uri id" do + Enum.each(@uris, fn uri -> + assert {:ok, uri} == ObjectID.cast(%{"id" => uri}) + end) + end + + test "it rejects non-uri strings" do + Enum.each(@non_uris, fn non_uri -> + assert :error == ObjectID.cast(non_uri) + assert :error == ObjectID.cast(%{"id" => non_uri}) + end) + end +end diff --git a/test/web/activity_pub/object_validators/types/recipients_test.exs b/test/web/activity_pub/object_validators/types/recipients_test.exs new file mode 100644 index 000000000..f278f039b --- /dev/null +++ b/test/web/activity_pub/object_validators/types/recipients_test.exs @@ -0,0 +1,27 @@ +defmodule Pleroma.Web.ObjectValidators.Types.RecipientsTest do + alias Pleroma.Web.ActivityPub.ObjectValidators.Types.Recipients + use Pleroma.DataCase + + test "it asserts that all elements of the list are object ids" do + list = ["https://lain.com/users/lain", "invalid"] + + assert :error == Recipients.cast(list) + end + + test "it works with a list" do + list = ["https://lain.com/users/lain"] + assert {:ok, list} == Recipients.cast(list) + end + + test "it works with a list with whole objects" do + list = ["https://lain.com/users/lain", %{"id" => "https://gensokyo.2hu/users/raymoo"}] + resulting_list = ["https://gensokyo.2hu/users/raymoo", "https://lain.com/users/lain"] + assert {:ok, resulting_list} == Recipients.cast(list) + end + + test "it turns a single string into a list" do + recipient = "https://lain.com/users/lain" + + assert {:ok, [recipient]} == Recipients.cast(recipient) + end +end diff --git a/test/web/activity_pub/pipeline_test.exs b/test/web/activity_pub/pipeline_test.exs new file mode 100644 index 000000000..26557720b --- /dev/null +++ b/test/web/activity_pub/pipeline_test.exs @@ -0,0 +1,131 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.PipelineTest do + use Pleroma.DataCase + + import Mock + import Pleroma.Factory + + describe "common_pipeline/2" do + setup do + clear_config([:instance, :federating], true) + :ok + end + + test "it goes through validation, filtering, persisting, side effects and federation for local activities" do + activity = insert(:note_activity) + meta = [local: true] + + with_mocks([ + {Pleroma.Web.ActivityPub.ObjectValidator, [], [validate: fn o, m -> {:ok, o, m} end]}, + { + Pleroma.Web.ActivityPub.MRF, + [], + [filter: fn o -> {:ok, o} end] + }, + { + Pleroma.Web.ActivityPub.ActivityPub, + [], + [persist: fn o, m -> {:ok, o, m} end] + }, + { + Pleroma.Web.ActivityPub.SideEffects, + [], + [handle: fn o, m -> {:ok, o, m} end] + }, + { + Pleroma.Web.Federator, + [], + [publish: fn _o -> :ok end] + } + ]) do + assert {:ok, ^activity, ^meta} = + 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.ActivityPub.persist(activity, meta)) + assert_called(Pleroma.Web.ActivityPub.SideEffects.handle(activity, meta)) + assert_called(Pleroma.Web.Federator.publish(activity)) + end + end + + test "it goes through validation, filtering, persisting, side effects without federation for remote activities" do + activity = insert(:note_activity) + meta = [local: false] + + with_mocks([ + {Pleroma.Web.ActivityPub.ObjectValidator, [], [validate: fn o, m -> {:ok, o, m} end]}, + { + Pleroma.Web.ActivityPub.MRF, + [], + [filter: fn o -> {:ok, o} end] + }, + { + Pleroma.Web.ActivityPub.ActivityPub, + [], + [persist: fn o, m -> {:ok, o, m} end] + }, + { + Pleroma.Web.ActivityPub.SideEffects, + [], + [handle: fn o, m -> {:ok, o, m} end] + }, + { + Pleroma.Web.Federator, + [], + [] + } + ]) do + assert {:ok, ^activity, ^meta} = + 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.ActivityPub.persist(activity, meta)) + assert_called(Pleroma.Web.ActivityPub.SideEffects.handle(activity, meta)) + end + end + + test "it goes through validation, filtering, persisting, side effects without federation for local activities if federation is deactivated" do + clear_config([:instance, :federating], false) + + activity = insert(:note_activity) + meta = [local: true] + + with_mocks([ + {Pleroma.Web.ActivityPub.ObjectValidator, [], [validate: fn o, m -> {:ok, o, m} end]}, + { + Pleroma.Web.ActivityPub.MRF, + [], + [filter: fn o -> {:ok, o} end] + }, + { + Pleroma.Web.ActivityPub.ActivityPub, + [], + [persist: fn o, m -> {:ok, o, m} end] + }, + { + Pleroma.Web.ActivityPub.SideEffects, + [], + [handle: fn o, m -> {:ok, o, m} end] + }, + { + Pleroma.Web.Federator, + [], + [] + } + ]) do + assert {:ok, ^activity, ^meta} = + 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.ActivityPub.persist(activity, meta)) + assert_called(Pleroma.Web.ActivityPub.SideEffects.handle(activity, meta)) + end + end + end +end diff --git a/test/web/activity_pub/publisher_test.exs b/test/web/activity_pub/publisher_test.exs index 801da03c1..c2bc38d52 100644 --- a/test/web/activity_pub/publisher_test.exs +++ b/test/web/activity_pub/publisher_test.exs @@ -48,10 +48,7 @@ test "it returns links" do describe "determine_inbox/2" do test "it returns sharedInbox for messages involving as:Public in to" do - user = - insert(:user, %{ - source_data: %{"endpoints" => %{"sharedInbox" => "http://example.com/inbox"}} - }) + user = insert(:user, %{shared_inbox: "http://example.com/inbox"}) activity = %Activity{ data: %{"to" => [@as_public], "cc" => [user.follower_address]} @@ -61,10 +58,7 @@ test "it returns sharedInbox for messages involving as:Public in to" do end test "it returns sharedInbox for messages involving as:Public in cc" do - user = - insert(:user, %{ - source_data: %{"endpoints" => %{"sharedInbox" => "http://example.com/inbox"}} - }) + user = insert(:user, %{shared_inbox: "http://example.com/inbox"}) activity = %Activity{ data: %{"cc" => [@as_public], "to" => [user.follower_address]} @@ -74,11 +68,7 @@ test "it returns sharedInbox for messages involving as:Public in cc" do end test "it returns sharedInbox for messages involving multiple recipients in to" do - user = - insert(:user, %{ - source_data: %{"endpoints" => %{"sharedInbox" => "http://example.com/inbox"}} - }) - + user = insert(:user, %{shared_inbox: "http://example.com/inbox"}) user_two = insert(:user) user_three = insert(:user) @@ -90,11 +80,7 @@ test "it returns sharedInbox for messages involving multiple recipients in to" d end test "it returns sharedInbox for messages involving multiple recipients in cc" do - user = - insert(:user, %{ - source_data: %{"endpoints" => %{"sharedInbox" => "http://example.com/inbox"}} - }) - + user = insert(:user, %{shared_inbox: "http://example.com/inbox"}) user_two = insert(:user) user_three = insert(:user) @@ -107,12 +93,10 @@ test "it returns sharedInbox for messages involving multiple recipients in cc" d test "it returns sharedInbox for messages involving multiple recipients in total" do user = - insert(:user, - source_data: %{ - "inbox" => "http://example.com/personal-inbox", - "endpoints" => %{"sharedInbox" => "http://example.com/inbox"} - } - ) + insert(:user, %{ + shared_inbox: "http://example.com/inbox", + inbox: "http://example.com/personal-inbox" + }) user_two = insert(:user) @@ -125,12 +109,10 @@ test "it returns sharedInbox for messages involving multiple recipients in total test "it returns inbox for messages involving single recipients in total" do user = - insert(:user, - source_data: %{ - "inbox" => "http://example.com/personal-inbox", - "endpoints" => %{"sharedInbox" => "http://example.com/inbox"} - } - ) + insert(:user, %{ + shared_inbox: "http://example.com/inbox", + inbox: "http://example.com/personal-inbox" + }) activity = %Activity{ data: %{"to" => [user.ap_id], "cc" => []} @@ -258,11 +240,11 @@ test "it returns inbox for messages involving single recipients in total" do [:passthrough], [] do follower = - insert(:user, + insert(:user, %{ local: false, - source_data: %{"inbox" => "https://domain.com/users/nick1/inbox"}, + inbox: "https://domain.com/users/nick1/inbox", ap_enabled: true - ) + }) actor = insert(:user, follower_address: follower.ap_id) user = insert(:user) @@ -295,14 +277,14 @@ test "it returns inbox for messages involving single recipients in total" do fetcher = insert(:user, local: false, - source_data: %{"inbox" => "https://domain.com/users/nick1/inbox"}, + inbox: "https://domain.com/users/nick1/inbox", ap_enabled: true ) another_fetcher = insert(:user, local: false, - source_data: %{"inbox" => "https://domain2.com/users/nick1/inbox"}, + inbox: "https://domain2.com/users/nick1/inbox", ap_enabled: true ) diff --git a/test/web/activity_pub/relay_test.exs b/test/web/activity_pub/relay_test.exs index 040625e4d..b3b573c9b 100644 --- a/test/web/activity_pub/relay_test.exs +++ b/test/web/activity_pub/relay_test.exs @@ -6,7 +6,6 @@ defmodule Pleroma.Web.ActivityPub.RelayTest do use Pleroma.DataCase alias Pleroma.Activity - alias Pleroma.Object alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.ActivityPub.Relay @@ -89,22 +88,27 @@ test "returns error when object is unknown" do } ) + Tesla.Mock.mock(fn + %{method: :get, url: "http://mastodon.example.org/eee/99541947525187367"} -> + %Tesla.Env{status: 500, body: ""} + end) + assert capture_log(fn -> - assert Relay.publish(activity) == {:error, nil} - end) =~ "[error] error: nil" + assert Relay.publish(activity) == {:error, false} + end) =~ "[error] error: false" end test_with_mock "returns announce activity and publish to federate", Pleroma.Web.Federator, [:passthrough], [] do - Pleroma.Config.put([:instance, :federating], true) + clear_config([:instance, :federating], true) service_actor = Relay.get_actor() note = insert(:note_activity) - assert {:ok, %Activity{} = activity, %Object{} = obj} = Relay.publish(note) + assert {:ok, %Activity{} = activity} = Relay.publish(note) assert activity.data["type"] == "Announce" assert activity.data["actor"] == service_actor.ap_id - assert activity.data["object"] == obj.data["id"] + assert activity.data["to"] == [service_actor.follower_address] assert called(Pleroma.Web.Federator.publish(activity)) end @@ -112,13 +116,12 @@ test "returns error when object is unknown" do Pleroma.Web.Federator, [:passthrough], [] do - Pleroma.Config.put([:instance, :federating], false) + clear_config([:instance, :federating], false) service_actor = Relay.get_actor() note = insert(:note_activity) - assert {:ok, %Activity{} = activity, %Object{} = obj} = Relay.publish(note) + assert {:ok, %Activity{} = activity} = Relay.publish(note) assert activity.data["type"] == "Announce" assert activity.data["actor"] == service_actor.ap_id - assert activity.data["object"] == obj.data["id"] refute called(Pleroma.Web.Federator.publish(activity)) end end diff --git a/test/web/activity_pub/side_effects_test.exs b/test/web/activity_pub/side_effects_test.exs new file mode 100644 index 000000000..a80104ea7 --- /dev/null +++ b/test/web/activity_pub/side_effects_test.exs @@ -0,0 +1,349 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.SideEffectsTest do + use Oban.Testing, repo: Pleroma.Repo + use Pleroma.DataCase + + alias Pleroma.Activity + alias Pleroma.Notification + alias Pleroma.Object + alias Pleroma.Repo + alias Pleroma.Tests.ObanHelpers + alias Pleroma.User + alias Pleroma.Web.ActivityPub.ActivityPub + alias Pleroma.Web.ActivityPub.Builder + alias Pleroma.Web.ActivityPub.SideEffects + alias Pleroma.Web.CommonAPI + + import Pleroma.Factory + import Mock + + describe "delete objects" do + setup do + user = insert(:user) + other_user = insert(:user) + + {:ok, op} = CommonAPI.post(other_user, %{status: "big oof"}) + {:ok, post} = CommonAPI.post(user, %{status: "hey", in_reply_to_id: op}) + {:ok, favorite} = CommonAPI.favorite(user, post.id) + object = Object.normalize(post) + {:ok, delete_data, _meta} = Builder.delete(user, object.data["id"]) + {:ok, delete_user_data, _meta} = Builder.delete(user, user.ap_id) + {:ok, delete, _meta} = ActivityPub.persist(delete_data, local: true) + {:ok, delete_user, _meta} = ActivityPub.persist(delete_user_data, local: true) + + %{ + user: user, + delete: delete, + post: post, + object: object, + delete_user: delete_user, + op: op, + favorite: favorite + } + end + + test "it handles object deletions", %{ + delete: delete, + post: post, + object: object, + user: user, + op: op, + favorite: favorite + } do + with_mock Pleroma.Web.ActivityPub.ActivityPub, [:passthrough], + stream_out: fn _ -> nil end, + stream_out_participations: fn _, _ -> nil end do + {:ok, delete, _} = SideEffects.handle(delete) + user = User.get_cached_by_ap_id(object.data["actor"]) + + assert called(Pleroma.Web.ActivityPub.ActivityPub.stream_out(delete)) + assert called(Pleroma.Web.ActivityPub.ActivityPub.stream_out_participations(object, user)) + end + + object = Object.get_by_id(object.id) + assert object.data["type"] == "Tombstone" + refute Activity.get_by_id(post.id) + refute Activity.get_by_id(favorite.id) + + user = User.get_by_id(user.id) + assert user.note_count == 0 + + object = Object.normalize(op.data["object"], false) + + assert object.data["repliesCount"] == 0 + end + + test "it handles object deletions when the object itself has been pruned", %{ + delete: delete, + post: post, + object: object, + user: user, + op: op + } do + with_mock Pleroma.Web.ActivityPub.ActivityPub, [:passthrough], + stream_out: fn _ -> nil end, + stream_out_participations: fn _, _ -> nil end do + {:ok, delete, _} = SideEffects.handle(delete) + user = User.get_cached_by_ap_id(object.data["actor"]) + + assert called(Pleroma.Web.ActivityPub.ActivityPub.stream_out(delete)) + assert called(Pleroma.Web.ActivityPub.ActivityPub.stream_out_participations(object, user)) + end + + object = Object.get_by_id(object.id) + assert object.data["type"] == "Tombstone" + refute Activity.get_by_id(post.id) + + user = User.get_by_id(user.id) + assert user.note_count == 0 + + object = Object.normalize(op.data["object"], false) + + assert object.data["repliesCount"] == 0 + end + + test "it handles user deletions", %{delete_user: delete, user: user} do + {:ok, _delete, _} = SideEffects.handle(delete) + ObanHelpers.perform_all() + + assert User.get_cached_by_ap_id(user.ap_id).deactivated + end + end + + describe "EmojiReact objects" do + setup do + poster = insert(:user) + user = insert(:user) + + {:ok, post} = CommonAPI.post(poster, %{status: "hey"}) + + {:ok, emoji_react_data, []} = Builder.emoji_react(user, post.object, "👌") + {:ok, emoji_react, _meta} = ActivityPub.persist(emoji_react_data, local: true) + + %{emoji_react: emoji_react, user: user, poster: poster} + end + + test "adds the reaction to the object", %{emoji_react: emoji_react, user: user} do + {:ok, emoji_react, _} = SideEffects.handle(emoji_react) + object = Object.get_by_ap_id(emoji_react.data["object"]) + + assert object.data["reaction_count"] == 1 + assert ["👌", [user.ap_id]] in object.data["reactions"] + end + + test "creates a notification", %{emoji_react: emoji_react, poster: poster} do + {:ok, emoji_react, _} = SideEffects.handle(emoji_react) + assert Repo.get_by(Notification, user_id: poster.id, activity_id: emoji_react.id) + end + end + + describe "delete users with confirmation pending" do + setup do + user = insert(:user, confirmation_pending: true) + {:ok, delete_user_data, _meta} = Builder.delete(user, user.ap_id) + {:ok, delete_user, _meta} = ActivityPub.persist(delete_user_data, local: true) + {:ok, delete: delete_user, user: user} + end + + test "when activation is not required", %{delete: delete, user: user} do + clear_config([:instance, :account_activation_required], false) + {:ok, _, _} = SideEffects.handle(delete) + ObanHelpers.perform_all() + + assert User.get_cached_by_id(user.id).deactivated + end + + test "when activation is required", %{delete: delete, user: user} do + clear_config([:instance, :account_activation_required], true) + {:ok, _, _} = SideEffects.handle(delete) + ObanHelpers.perform_all() + + refute User.get_cached_by_id(user.id) + end + end + + describe "Undo objects" do + setup do + poster = insert(:user) + user = insert(:user) + {:ok, post} = CommonAPI.post(poster, %{status: "hey"}) + {:ok, like} = CommonAPI.favorite(user, post.id) + {:ok, reaction} = CommonAPI.react_with_emoji(post.id, user, "👍") + {:ok, announce} = CommonAPI.repeat(post.id, user) + {:ok, block} = ActivityPub.block(user, poster) + User.block(user, poster) + + {:ok, undo_data, _meta} = Builder.undo(user, like) + {:ok, like_undo, _meta} = ActivityPub.persist(undo_data, local: true) + + {:ok, undo_data, _meta} = Builder.undo(user, reaction) + {:ok, reaction_undo, _meta} = ActivityPub.persist(undo_data, local: true) + + {:ok, undo_data, _meta} = Builder.undo(user, announce) + {:ok, announce_undo, _meta} = ActivityPub.persist(undo_data, local: true) + + {:ok, undo_data, _meta} = Builder.undo(user, block) + {:ok, block_undo, _meta} = ActivityPub.persist(undo_data, local: true) + + %{ + like_undo: like_undo, + post: post, + like: like, + reaction_undo: reaction_undo, + reaction: reaction, + announce_undo: announce_undo, + announce: announce, + block_undo: block_undo, + block: block, + poster: poster, + user: user + } + end + + test "deletes the original block", %{block_undo: block_undo, block: block} do + {:ok, _block_undo, _} = SideEffects.handle(block_undo) + refute Activity.get_by_id(block.id) + end + + test "unblocks the blocked user", %{block_undo: block_undo, block: block} do + blocker = User.get_by_ap_id(block.data["actor"]) + blocked = User.get_by_ap_id(block.data["object"]) + + {:ok, _block_undo, _} = SideEffects.handle(block_undo) + refute User.blocks?(blocker, blocked) + end + + test "an announce undo removes the announce from the object", %{ + announce_undo: announce_undo, + post: post + } do + {:ok, _announce_undo, _} = SideEffects.handle(announce_undo) + + object = Object.get_by_ap_id(post.data["object"]) + + assert object.data["announcement_count"] == 0 + assert object.data["announcements"] == [] + end + + test "deletes the original announce", %{announce_undo: announce_undo, announce: announce} do + {:ok, _announce_undo, _} = SideEffects.handle(announce_undo) + refute Activity.get_by_id(announce.id) + end + + test "a reaction undo removes the reaction from the object", %{ + reaction_undo: reaction_undo, + post: post + } do + {:ok, _reaction_undo, _} = SideEffects.handle(reaction_undo) + + object = Object.get_by_ap_id(post.data["object"]) + + assert object.data["reaction_count"] == 0 + assert object.data["reactions"] == [] + end + + test "deletes the original reaction", %{reaction_undo: reaction_undo, reaction: reaction} do + {:ok, _reaction_undo, _} = SideEffects.handle(reaction_undo) + refute Activity.get_by_id(reaction.id) + end + + test "a like undo removes the like from the object", %{like_undo: like_undo, post: post} do + {:ok, _like_undo, _} = SideEffects.handle(like_undo) + + object = Object.get_by_ap_id(post.data["object"]) + + assert object.data["like_count"] == 0 + assert object.data["likes"] == [] + end + + test "deletes the original like", %{like_undo: like_undo, like: like} do + {:ok, _like_undo, _} = SideEffects.handle(like_undo) + refute Activity.get_by_id(like.id) + end + end + + describe "like objects" do + setup do + poster = insert(:user) + user = insert(:user) + {:ok, post} = CommonAPI.post(poster, %{status: "hey"}) + + {:ok, like_data, _meta} = Builder.like(user, post.object) + {:ok, like, _meta} = ActivityPub.persist(like_data, local: true) + + %{like: like, user: user, poster: poster} + end + + test "add the like to the original object", %{like: like, user: user} do + {:ok, like, _} = SideEffects.handle(like) + object = Object.get_by_ap_id(like.data["object"]) + assert object.data["like_count"] == 1 + assert user.ap_id in object.data["likes"] + end + + test "creates a notification", %{like: like, poster: poster} do + {:ok, like, _} = SideEffects.handle(like) + assert Repo.get_by(Notification, user_id: poster.id, activity_id: like.id) + end + end + + describe "announce objects" do + setup do + poster = insert(:user) + user = insert(:user) + {:ok, post} = CommonAPI.post(poster, %{status: "hey"}) + {:ok, private_post} = CommonAPI.post(poster, %{status: "hey", visibility: "private"}) + + {:ok, announce_data, _meta} = Builder.announce(user, post.object, public: true) + + {:ok, private_announce_data, _meta} = + Builder.announce(user, private_post.object, public: false) + + {:ok, relay_announce_data, _meta} = + Builder.announce(Pleroma.Web.ActivityPub.Relay.get_actor(), post.object, public: true) + + {:ok, announce, _meta} = ActivityPub.persist(announce_data, local: true) + {:ok, private_announce, _meta} = ActivityPub.persist(private_announce_data, local: true) + {:ok, relay_announce, _meta} = ActivityPub.persist(relay_announce_data, local: true) + + %{ + announce: announce, + user: user, + poster: poster, + private_announce: private_announce, + relay_announce: relay_announce + } + end + + test "adds the announce to the original object", %{announce: announce, user: user} do + {:ok, announce, _} = SideEffects.handle(announce) + object = Object.get_by_ap_id(announce.data["object"]) + assert object.data["announcement_count"] == 1 + assert user.ap_id in object.data["announcements"] + end + + test "does not add the announce to the original object if the actor is a service actor", %{ + relay_announce: announce + } do + {:ok, announce, _} = SideEffects.handle(announce) + object = Object.get_by_ap_id(announce.data["object"]) + assert object.data["announcement_count"] == nil + end + + test "creates a notification", %{announce: announce, poster: poster} do + {:ok, announce, _} = SideEffects.handle(announce) + assert Repo.get_by(Notification, user_id: poster.id, activity_id: announce.id) + end + + test "it streams out the announce", %{announce: announce} do + with_mock Pleroma.Web.ActivityPub.ActivityPub, [:passthrough], stream_out: fn _ -> nil end do + {:ok, announce, _} = SideEffects.handle(announce) + + assert called(Pleroma.Web.ActivityPub.ActivityPub.stream_out(announce)) + end + end + end +end diff --git a/test/web/activity_pub/transmogrifier/announce_handling_test.exs b/test/web/activity_pub/transmogrifier/announce_handling_test.exs new file mode 100644 index 000000000..e895636b5 --- /dev/null +++ b/test/web/activity_pub/transmogrifier/announce_handling_test.exs @@ -0,0 +1,172 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.Transmogrifier.AnnounceHandlingTest do + use Pleroma.DataCase + + alias Pleroma.Activity + alias Pleroma.Object + alias Pleroma.Web.ActivityPub.Transmogrifier + alias Pleroma.Web.CommonAPI + + import Pleroma.Factory + + test "it works for incoming honk announces" do + user = insert(:user, ap_id: "https://honktest/u/test", local: false) + other_user = insert(:user) + {:ok, post} = CommonAPI.post(other_user, %{status: "bonkeronk"}) + + announce = %{ + "@context" => "https://www.w3.org/ns/activitystreams", + "actor" => "https://honktest/u/test", + "id" => "https://honktest/u/test/bonk/1793M7B9MQ48847vdx", + "object" => post.data["object"], + "published" => "2019-06-25T19:33:58Z", + "to" => "https://www.w3.org/ns/activitystreams#Public", + "type" => "Announce" + } + + {:ok, %Activity{local: false}} = Transmogrifier.handle_incoming(announce) + + object = Object.get_by_ap_id(post.data["object"]) + + assert length(object.data["announcements"]) == 1 + assert user.ap_id in object.data["announcements"] + end + + test "it works for incoming announces with actor being inlined (kroeg)" do + data = File.read!("test/fixtures/kroeg-announce-with-inline-actor.json") |> Poison.decode!() + + _user = insert(:user, local: false, ap_id: data["actor"]["id"]) + other_user = insert(:user) + + {:ok, post} = CommonAPI.post(other_user, %{status: "kroegeroeg"}) + + data = + data + |> put_in(["object", "id"], post.data["object"]) + + {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + + assert data["actor"] == "https://puckipedia.com/" + end + + test "it works for incoming announces, fetching the announced object" do + data = + File.read!("test/fixtures/mastodon-announce.json") + |> Poison.decode!() + |> Map.put("object", "http://mastodon.example.org/users/admin/statuses/99541947525187367") + + Tesla.Mock.mock(fn + %{method: :get} -> + %Tesla.Env{status: 200, body: File.read!("test/fixtures/mastodon-note-object.json")} + end) + + _user = insert(:user, local: false, ap_id: data["actor"]) + + {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + + assert data["actor"] == "http://mastodon.example.org/users/admin" + assert data["type"] == "Announce" + + assert data["id"] == + "http://mastodon.example.org/users/admin/statuses/99542391527669785/activity" + + assert data["object"] == + "http://mastodon.example.org/users/admin/statuses/99541947525187367" + + assert(Activity.get_create_by_object_ap_id(data["object"])) + end + + @tag capture_log: true + test "it works for incoming announces with an existing activity" do + user = insert(:user) + {:ok, activity} = CommonAPI.post(user, %{status: "hey"}) + + data = + File.read!("test/fixtures/mastodon-announce.json") + |> Poison.decode!() + |> Map.put("object", activity.data["object"]) + + _user = insert(:user, local: false, ap_id: data["actor"]) + + {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + + assert data["actor"] == "http://mastodon.example.org/users/admin" + assert data["type"] == "Announce" + + assert data["id"] == + "http://mastodon.example.org/users/admin/statuses/99542391527669785/activity" + + assert data["object"] == activity.data["object"] + + assert Activity.get_create_by_object_ap_id(data["object"]).id == activity.id + end + + # Ignore inlined activities for now + @tag skip: true + test "it works for incoming announces with an inlined activity" do + data = + File.read!("test/fixtures/mastodon-announce-private.json") + |> Poison.decode!() + + _user = + insert(:user, + local: false, + ap_id: data["actor"], + follower_address: data["actor"] <> "/followers" + ) + + {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + + assert data["actor"] == "http://mastodon.example.org/users/admin" + assert data["type"] == "Announce" + + assert data["id"] == + "http://mastodon.example.org/users/admin/statuses/99542391527669785/activity" + + object = Object.normalize(data["object"]) + + assert object.data["id"] == "http://mastodon.example.org/@admin/99541947525187368" + assert object.data["content"] == "this is a private toot" + end + + @tag capture_log: true + test "it rejects incoming announces with an inlined activity from another origin" do + Tesla.Mock.mock(fn + %{method: :get} -> %Tesla.Env{status: 404, body: ""} + end) + + data = + File.read!("test/fixtures/bogus-mastodon-announce.json") + |> Poison.decode!() + + _user = insert(:user, local: false, ap_id: data["actor"]) + + assert {:error, e} = Transmogrifier.handle_incoming(data) + end + + test "it does not clobber the addressing on announce activities" do + user = insert(:user) + {:ok, activity} = CommonAPI.post(user, %{status: "hey"}) + + data = + File.read!("test/fixtures/mastodon-announce.json") + |> Poison.decode!() + |> Map.put("object", Object.normalize(activity).data["id"]) + |> Map.put("to", ["http://mastodon.example.org/users/admin/followers"]) + |> Map.put("cc", []) + + _user = + insert(:user, + local: false, + ap_id: data["actor"], + follower_address: "http://mastodon.example.org/users/admin/followers" + ) + + {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + + assert data["to"] == ["http://mastodon.example.org/users/admin/followers"] + end +end diff --git a/test/web/activity_pub/transmogrifier/delete_handling_test.exs b/test/web/activity_pub/transmogrifier/delete_handling_test.exs new file mode 100644 index 000000000..c9a53918c --- /dev/null +++ b/test/web/activity_pub/transmogrifier/delete_handling_test.exs @@ -0,0 +1,114 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.Transmogrifier.DeleteHandlingTest do + use Oban.Testing, repo: Pleroma.Repo + use Pleroma.DataCase + + alias Pleroma.Activity + alias Pleroma.Object + alias Pleroma.Tests.ObanHelpers + alias Pleroma.User + alias Pleroma.Web.ActivityPub.Transmogrifier + + import Pleroma.Factory + + setup_all do + Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) + :ok + end + + test "it works for incoming deletes" do + activity = insert(:note_activity) + deleting_user = insert(:user) + + data = + File.read!("test/fixtures/mastodon-delete.json") + |> Poison.decode!() + |> Map.put("actor", deleting_user.ap_id) + |> put_in(["object", "id"], activity.data["object"]) + + {:ok, %Activity{actor: actor, local: false, data: %{"id" => id}}} = + Transmogrifier.handle_incoming(data) + + assert id == data["id"] + + # We delete the Create activity because we base our timelines on it. + # This should be changed after we unify objects and activities + refute Activity.get_by_id(activity.id) + assert actor == deleting_user.ap_id + + # Objects are replaced by a tombstone object. + object = Object.normalize(activity.data["object"]) + assert object.data["type"] == "Tombstone" + end + + test "it works for incoming when the object has been pruned" do + activity = insert(:note_activity) + + {:ok, object} = + Object.normalize(activity.data["object"]) + |> Repo.delete() + + Cachex.del(:object_cache, "object:#{object.data["id"]}") + + deleting_user = insert(:user) + + data = + File.read!("test/fixtures/mastodon-delete.json") + |> Poison.decode!() + |> Map.put("actor", deleting_user.ap_id) + |> put_in(["object", "id"], activity.data["object"]) + + {:ok, %Activity{actor: actor, local: false, data: %{"id" => id}}} = + Transmogrifier.handle_incoming(data) + + assert id == data["id"] + + # We delete the Create activity because we base our timelines on it. + # This should be changed after we unify objects and activities + refute Activity.get_by_id(activity.id) + assert actor == deleting_user.ap_id + end + + test "it fails for incoming deletes with spoofed origin" do + activity = insert(:note_activity) + %{ap_id: ap_id} = insert(:user, ap_id: "https://gensokyo.2hu/users/raymoo") + + data = + File.read!("test/fixtures/mastodon-delete.json") + |> Poison.decode!() + |> Map.put("actor", ap_id) + |> put_in(["object", "id"], activity.data["object"]) + + assert match?({:error, _}, Transmogrifier.handle_incoming(data)) + end + + @tag capture_log: true + test "it works for incoming user deletes" do + %{ap_id: ap_id} = insert(:user, ap_id: "http://mastodon.example.org/users/admin") + + data = + File.read!("test/fixtures/mastodon-delete-user.json") + |> Poison.decode!() + + {:ok, _} = Transmogrifier.handle_incoming(data) + ObanHelpers.perform_all() + + assert User.get_cached_by_ap_id(ap_id).deactivated + end + + test "it fails for incoming user deletes with spoofed origin" do + %{ap_id: ap_id} = insert(:user) + + data = + File.read!("test/fixtures/mastodon-delete-user.json") + |> Poison.decode!() + |> Map.put("actor", ap_id) + + assert match?({:error, _}, Transmogrifier.handle_incoming(data)) + + assert User.get_cached_by_ap_id(ap_id) + end +end diff --git a/test/web/activity_pub/transmogrifier/emoji_react_handling_test.exs b/test/web/activity_pub/transmogrifier/emoji_react_handling_test.exs new file mode 100644 index 000000000..0fb056b50 --- /dev/null +++ b/test/web/activity_pub/transmogrifier/emoji_react_handling_test.exs @@ -0,0 +1,61 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.Transmogrifier.EmojiReactHandlingTest do + use Pleroma.DataCase + + alias Pleroma.Activity + alias Pleroma.Object + alias Pleroma.Web.ActivityPub.Transmogrifier + alias Pleroma.Web.CommonAPI + + import Pleroma.Factory + + test "it works for incoming emoji reactions" do + user = insert(:user) + other_user = insert(:user, local: false) + {:ok, activity} = CommonAPI.post(user, %{status: "hello"}) + + data = + File.read!("test/fixtures/emoji-reaction.json") + |> Poison.decode!() + |> Map.put("object", activity.data["object"]) + |> Map.put("actor", other_user.ap_id) + + {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + + assert data["actor"] == other_user.ap_id + assert data["type"] == "EmojiReact" + assert data["id"] == "http://mastodon.example.org/users/admin#reactions/2" + assert data["object"] == activity.data["object"] + assert data["content"] == "👌" + + object = Object.get_by_ap_id(data["object"]) + + assert object.data["reaction_count"] == 1 + assert match?([["👌", _]], object.data["reactions"]) + end + + test "it reject invalid emoji reactions" do + user = insert(:user) + other_user = insert(:user, local: false) + {:ok, activity} = CommonAPI.post(user, %{status: "hello"}) + + data = + File.read!("test/fixtures/emoji-reaction-too-long.json") + |> Poison.decode!() + |> Map.put("object", activity.data["object"]) + |> Map.put("actor", other_user.ap_id) + + assert {:error, _} = Transmogrifier.handle_incoming(data) + + data = + File.read!("test/fixtures/emoji-reaction-no-emoji.json") + |> Poison.decode!() + |> Map.put("object", activity.data["object"]) + |> Map.put("actor", other_user.ap_id) + + assert {:error, _} = Transmogrifier.handle_incoming(data) + end +end diff --git a/test/web/activity_pub/transmogrifier/like_handling_test.exs b/test/web/activity_pub/transmogrifier/like_handling_test.exs new file mode 100644 index 000000000..53fe1d550 --- /dev/null +++ b/test/web/activity_pub/transmogrifier/like_handling_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.Web.ActivityPub.Transmogrifier.LikeHandlingTest do + use Pleroma.DataCase + + alias Pleroma.Activity + alias Pleroma.Web.ActivityPub.Transmogrifier + alias Pleroma.Web.CommonAPI + + import Pleroma.Factory + + test "it works for incoming likes" do + user = insert(:user) + + {:ok, activity} = CommonAPI.post(user, %{status: "hello"}) + + data = + File.read!("test/fixtures/mastodon-like.json") + |> Poison.decode!() + |> Map.put("object", activity.data["object"]) + + _actor = insert(:user, ap_id: data["actor"], local: false) + + {:ok, %Activity{data: data, local: false} = activity} = Transmogrifier.handle_incoming(data) + + refute Enum.empty?(activity.recipients) + + assert data["actor"] == "http://mastodon.example.org/users/admin" + assert data["type"] == "Like" + assert data["id"] == "http://mastodon.example.org/users/admin#likes/2" + assert data["object"] == activity.data["object"] + end + + test "it works for incoming misskey likes, turning them into EmojiReacts" do + user = insert(:user) + + {:ok, activity} = CommonAPI.post(user, %{status: "hello"}) + + data = + File.read!("test/fixtures/misskey-like.json") + |> Poison.decode!() + |> Map.put("object", activity.data["object"]) + + _actor = insert(:user, ap_id: data["actor"], local: false) + + {:ok, %Activity{data: activity_data, local: false}} = Transmogrifier.handle_incoming(data) + + assert activity_data["actor"] == data["actor"] + assert activity_data["type"] == "EmojiReact" + assert activity_data["id"] == data["id"] + assert activity_data["object"] == activity.data["object"] + assert activity_data["content"] == "🍮" + end + + test "it works for incoming misskey likes that contain unicode emojis, turning them into EmojiReacts" do + user = insert(:user) + + {:ok, activity} = CommonAPI.post(user, %{status: "hello"}) + + data = + File.read!("test/fixtures/misskey-like.json") + |> Poison.decode!() + |> Map.put("object", activity.data["object"]) + |> Map.put("_misskey_reaction", "⭐") + + _actor = insert(:user, ap_id: data["actor"], local: false) + + {:ok, %Activity{data: activity_data, local: false}} = Transmogrifier.handle_incoming(data) + + assert activity_data["actor"] == data["actor"] + assert activity_data["type"] == "EmojiReact" + assert activity_data["id"] == data["id"] + assert activity_data["object"] == activity.data["object"] + assert activity_data["content"] == "⭐" + end +end diff --git a/test/web/activity_pub/transmogrifier/undo_handling_test.exs b/test/web/activity_pub/transmogrifier/undo_handling_test.exs new file mode 100644 index 000000000..01dd6c370 --- /dev/null +++ b/test/web/activity_pub/transmogrifier/undo_handling_test.exs @@ -0,0 +1,185 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.Transmogrifier.UndoHandlingTest do + use Pleroma.DataCase + + alias Pleroma.Activity + alias Pleroma.Object + alias Pleroma.User + alias Pleroma.Web.ActivityPub.Transmogrifier + alias Pleroma.Web.CommonAPI + + import Pleroma.Factory + + test "it works for incoming emoji reaction undos" do + user = insert(:user) + + {:ok, activity} = CommonAPI.post(user, %{status: "hello"}) + {:ok, reaction_activity} = CommonAPI.react_with_emoji(activity.id, user, "👌") + + data = + File.read!("test/fixtures/mastodon-undo-like.json") + |> Poison.decode!() + |> Map.put("object", reaction_activity.data["id"]) + |> Map.put("actor", user.ap_id) + + {:ok, activity} = Transmogrifier.handle_incoming(data) + + assert activity.actor == user.ap_id + assert activity.data["id"] == data["id"] + assert activity.data["type"] == "Undo" + end + + test "it returns an error for incoming unlikes wihout a like activity" do + user = insert(:user) + {:ok, activity} = CommonAPI.post(user, %{status: "leave a like pls"}) + + data = + File.read!("test/fixtures/mastodon-undo-like.json") + |> Poison.decode!() + |> Map.put("object", activity.data["object"]) + + assert Transmogrifier.handle_incoming(data) == :error + end + + test "it works for incoming unlikes with an existing like activity" do + user = insert(:user) + {:ok, activity} = CommonAPI.post(user, %{status: "leave a like pls"}) + + like_data = + File.read!("test/fixtures/mastodon-like.json") + |> Poison.decode!() + |> Map.put("object", activity.data["object"]) + + _liker = insert(:user, ap_id: like_data["actor"], local: false) + + {:ok, %Activity{data: like_data, local: false}} = Transmogrifier.handle_incoming(like_data) + + data = + File.read!("test/fixtures/mastodon-undo-like.json") + |> Poison.decode!() + |> Map.put("object", like_data) + |> Map.put("actor", like_data["actor"]) + + {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + + assert data["actor"] == "http://mastodon.example.org/users/admin" + assert data["type"] == "Undo" + assert data["id"] == "http://mastodon.example.org/users/admin#likes/2/undo" + assert data["object"] == "http://mastodon.example.org/users/admin#likes/2" + + note = Object.get_by_ap_id(like_data["object"]) + assert note.data["like_count"] == 0 + assert note.data["likes"] == [] + end + + test "it works for incoming unlikes with an existing like activity and a compact object" do + user = insert(:user) + {:ok, activity} = CommonAPI.post(user, %{status: "leave a like pls"}) + + like_data = + File.read!("test/fixtures/mastodon-like.json") + |> Poison.decode!() + |> Map.put("object", activity.data["object"]) + + _liker = insert(:user, ap_id: like_data["actor"], local: false) + + {:ok, %Activity{data: like_data, local: false}} = Transmogrifier.handle_incoming(like_data) + + data = + File.read!("test/fixtures/mastodon-undo-like.json") + |> Poison.decode!() + |> Map.put("object", like_data["id"]) + |> Map.put("actor", like_data["actor"]) + + {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + + assert data["actor"] == "http://mastodon.example.org/users/admin" + assert data["type"] == "Undo" + assert data["id"] == "http://mastodon.example.org/users/admin#likes/2/undo" + assert data["object"] == "http://mastodon.example.org/users/admin#likes/2" + end + + test "it works for incoming unannounces with an existing notice" do + user = insert(:user) + {:ok, activity} = CommonAPI.post(user, %{status: "hey"}) + + announce_data = + File.read!("test/fixtures/mastodon-announce.json") + |> Poison.decode!() + |> Map.put("object", activity.data["object"]) + + _announcer = insert(:user, ap_id: announce_data["actor"], local: false) + + {:ok, %Activity{data: announce_data, local: false}} = + Transmogrifier.handle_incoming(announce_data) + + data = + File.read!("test/fixtures/mastodon-undo-announce.json") + |> Poison.decode!() + |> Map.put("object", announce_data) + |> Map.put("actor", announce_data["actor"]) + + {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + + assert data["type"] == "Undo" + + assert data["object"] == + "http://mastodon.example.org/users/admin/statuses/99542391527669785/activity" + end + + test "it works for incomming unfollows with an existing follow" do + user = insert(:user) + + follow_data = + File.read!("test/fixtures/mastodon-follow-activity.json") + |> Poison.decode!() + |> Map.put("object", user.ap_id) + + _follower = insert(:user, ap_id: follow_data["actor"], local: false) + + {:ok, %Activity{data: _, local: false}} = Transmogrifier.handle_incoming(follow_data) + + data = + File.read!("test/fixtures/mastodon-unfollow-activity.json") + |> Poison.decode!() + |> Map.put("object", follow_data) + + {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + + assert data["type"] == "Undo" + assert data["object"]["type"] == "Follow" + assert data["object"]["object"] == user.ap_id + assert data["actor"] == "http://mastodon.example.org/users/admin" + + refute User.following?(User.get_cached_by_ap_id(data["actor"]), user) + end + + test "it works for incoming unblocks with an existing block" do + user = insert(:user) + + block_data = + File.read!("test/fixtures/mastodon-block-activity.json") + |> Poison.decode!() + |> Map.put("object", user.ap_id) + + _blocker = insert(:user, ap_id: block_data["actor"], local: false) + + {:ok, %Activity{data: _, local: false}} = Transmogrifier.handle_incoming(block_data) + + data = + File.read!("test/fixtures/mastodon-unblock-activity.json") + |> Poison.decode!() + |> Map.put("object", block_data) + + {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + assert data["type"] == "Undo" + assert data["object"] == block_data["id"] + + blocker = User.get_cached_by_ap_id(data["actor"]) + + refute User.blocks?(blocker, user) + end +end diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs index b2cabbd30..94d8552e8 100644 --- a/test/web/activity_pub/transmogrifier_test.exs +++ b/test/web/activity_pub/transmogrifier_test.exs @@ -28,6 +28,63 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do setup do: clear_config([:instance, :max_remote_account_fields]) describe "handle_incoming" do + test "it works for incoming notices with tag not being an array (kroeg)" do + data = File.read!("test/fixtures/kroeg-array-less-emoji.json") |> Poison.decode!() + + {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + object = Object.normalize(data["object"]) + + assert object.data["emoji"] == %{ + "icon_e_smile" => "https://puckipedia.com/forum/images/smilies/icon_e_smile.png" + } + + data = File.read!("test/fixtures/kroeg-array-less-hashtag.json") |> Poison.decode!() + + {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + object = Object.normalize(data["object"]) + + 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) + + to = [user.ap_id, other_user.ap_id] + + data = + File.read!("test/fixtures/mastodon-post-activity.json") + |> Poison.decode!() + |> Map.put("to", to) + |> Map.put("cc", []) + + object = + data["object"] + |> Map.put("to", to) + |> Map.put("cc", []) + + data = Map.put(data, "object", object) + + {:ok, %Activity{data: data, local: false} = activity} = Transmogrifier.handle_incoming(data) + + assert data["to"] == [] + assert data["cc"] == to + + object_data = Object.normalize(activity).data + + assert object_data["to"] == [] + assert object_data["cc"] == to + end + test "it ignores an incoming notice if we already have it" do activity = insert(:note_activity) @@ -212,8 +269,8 @@ test "it rewrites Note votes to Answers and increments vote counters on question {:ok, activity} = CommonAPI.post(user, %{ - "status" => "suya...", - "poll" => %{"options" => ["suya", "suya.", "suya.."], "expires_in" => 10} + status: "suya...", + poll: %{options: ["suya", "suya.", "suya.."], expires_in: 10} }) object = Object.normalize(activity) @@ -260,326 +317,6 @@ test "it works for incoming notices with to/cc not being an array (kroeg)" do "

henlo from my Psion netBook

message sent from my Psion netBook

" end - test "it works for incoming announces with actor being inlined (kroeg)" do - data = File.read!("test/fixtures/kroeg-announce-with-inline-actor.json") |> Poison.decode!() - - {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) - - assert data["actor"] == "https://puckipedia.com/" - end - - test "it works for incoming notices with tag not being an array (kroeg)" do - data = File.read!("test/fixtures/kroeg-array-less-emoji.json") |> Poison.decode!() - - {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) - object = Object.normalize(data["object"]) - - assert object.data["emoji"] == %{ - "icon_e_smile" => "https://puckipedia.com/forum/images/smilies/icon_e_smile.png" - } - - data = File.read!("test/fixtures/kroeg-array-less-hashtag.json") |> Poison.decode!() - - {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) - object = Object.normalize(data["object"]) - - 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) - - to = [user.ap_id, other_user.ap_id] - - data = - File.read!("test/fixtures/mastodon-post-activity.json") - |> Poison.decode!() - |> Map.put("to", to) - |> Map.put("cc", []) - - object = - data["object"] - |> Map.put("to", to) - |> Map.put("cc", []) - - data = Map.put(data, "object", object) - - {:ok, %Activity{data: data, local: false} = activity} = Transmogrifier.handle_incoming(data) - - assert data["to"] == [] - assert data["cc"] == to - - object_data = Object.normalize(activity).data - - assert object_data["to"] == [] - assert object_data["cc"] == to - end - - test "it works for incoming likes" do - user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "hello"}) - - data = - File.read!("test/fixtures/mastodon-like.json") - |> Poison.decode!() - |> Map.put("object", activity.data["object"]) - - {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) - - assert data["actor"] == "http://mastodon.example.org/users/admin" - assert data["type"] == "Like" - assert data["id"] == "http://mastodon.example.org/users/admin#likes/2" - assert data["object"] == activity.data["object"] - end - - test "it works for incoming misskey likes, turning them into EmojiReacts" do - user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "hello"}) - - data = - File.read!("test/fixtures/misskey-like.json") - |> Poison.decode!() - |> Map.put("object", activity.data["object"]) - - {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) - - assert data["actor"] == data["actor"] - assert data["type"] == "EmojiReact" - assert data["id"] == data["id"] - assert data["object"] == activity.data["object"] - assert data["content"] == "🍮" - end - - test "it works for incoming misskey likes that contain unicode emojis, turning them into EmojiReacts" do - user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "hello"}) - - data = - File.read!("test/fixtures/misskey-like.json") - |> Poison.decode!() - |> Map.put("object", activity.data["object"]) - |> Map.put("_misskey_reaction", "⭐") - - {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) - - assert data["actor"] == data["actor"] - assert data["type"] == "EmojiReact" - assert data["id"] == data["id"] - assert data["object"] == activity.data["object"] - assert data["content"] == "⭐" - end - - test "it works for incoming emoji reactions" do - user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "hello"}) - - data = - File.read!("test/fixtures/emoji-reaction.json") - |> Poison.decode!() - |> Map.put("object", activity.data["object"]) - - {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) - - assert data["actor"] == "http://mastodon.example.org/users/admin" - assert data["type"] == "EmojiReact" - assert data["id"] == "http://mastodon.example.org/users/admin#reactions/2" - assert data["object"] == activity.data["object"] - assert data["content"] == "👌" - end - - test "it reject invalid emoji reactions" do - user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "hello"}) - - data = - File.read!("test/fixtures/emoji-reaction-too-long.json") - |> Poison.decode!() - |> Map.put("object", activity.data["object"]) - - assert :error = Transmogrifier.handle_incoming(data) - - data = - File.read!("test/fixtures/emoji-reaction-no-emoji.json") - |> Poison.decode!() - |> Map.put("object", activity.data["object"]) - - assert :error = Transmogrifier.handle_incoming(data) - end - - test "it works for incoming emoji reaction undos" do - user = insert(:user) - - {:ok, activity} = CommonAPI.post(user, %{"status" => "hello"}) - {:ok, reaction_activity, _object} = CommonAPI.react_with_emoji(activity.id, user, "👌") - - data = - File.read!("test/fixtures/mastodon-undo-like.json") - |> Poison.decode!() - |> Map.put("object", reaction_activity.data["id"]) - |> Map.put("actor", user.ap_id) - - {:ok, activity} = Transmogrifier.handle_incoming(data) - - assert activity.actor == user.ap_id - assert activity.data["id"] == data["id"] - assert activity.data["type"] == "Undo" - end - - test "it returns an error for incoming unlikes wihout a like activity" do - user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "leave a like pls"}) - - data = - File.read!("test/fixtures/mastodon-undo-like.json") - |> Poison.decode!() - |> Map.put("object", activity.data["object"]) - - assert Transmogrifier.handle_incoming(data) == :error - end - - test "it works for incoming unlikes with an existing like activity" do - user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "leave a like pls"}) - - like_data = - File.read!("test/fixtures/mastodon-like.json") - |> Poison.decode!() - |> Map.put("object", activity.data["object"]) - - {:ok, %Activity{data: like_data, local: false}} = Transmogrifier.handle_incoming(like_data) - - data = - File.read!("test/fixtures/mastodon-undo-like.json") - |> Poison.decode!() - |> Map.put("object", like_data) - |> Map.put("actor", like_data["actor"]) - - {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) - - assert data["actor"] == "http://mastodon.example.org/users/admin" - assert data["type"] == "Undo" - assert data["id"] == "http://mastodon.example.org/users/admin#likes/2/undo" - assert data["object"]["id"] == "http://mastodon.example.org/users/admin#likes/2" - end - - test "it works for incoming unlikes with an existing like activity and a compact object" do - user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "leave a like pls"}) - - like_data = - File.read!("test/fixtures/mastodon-like.json") - |> Poison.decode!() - |> Map.put("object", activity.data["object"]) - - {:ok, %Activity{data: like_data, local: false}} = Transmogrifier.handle_incoming(like_data) - - data = - File.read!("test/fixtures/mastodon-undo-like.json") - |> Poison.decode!() - |> Map.put("object", like_data["id"]) - |> Map.put("actor", like_data["actor"]) - - {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) - - assert data["actor"] == "http://mastodon.example.org/users/admin" - assert data["type"] == "Undo" - assert data["id"] == "http://mastodon.example.org/users/admin#likes/2/undo" - assert data["object"]["id"] == "http://mastodon.example.org/users/admin#likes/2" - end - - test "it works for incoming announces" do - data = File.read!("test/fixtures/mastodon-announce.json") |> Poison.decode!() - - {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) - - assert data["actor"] == "http://mastodon.example.org/users/admin" - assert data["type"] == "Announce" - - assert data["id"] == - "http://mastodon.example.org/users/admin/statuses/99542391527669785/activity" - - assert data["object"] == - "http://mastodon.example.org/users/admin/statuses/99541947525187367" - - assert Activity.get_create_by_object_ap_id(data["object"]) - end - - test "it works for incoming announces with an existing activity" do - user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "hey"}) - - data = - File.read!("test/fixtures/mastodon-announce.json") - |> Poison.decode!() - |> Map.put("object", activity.data["object"]) - - {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) - - assert data["actor"] == "http://mastodon.example.org/users/admin" - assert data["type"] == "Announce" - - assert data["id"] == - "http://mastodon.example.org/users/admin/statuses/99542391527669785/activity" - - assert data["object"] == activity.data["object"] - - assert Activity.get_create_by_object_ap_id(data["object"]).id == activity.id - end - - test "it works for incoming announces with an inlined activity" do - data = - File.read!("test/fixtures/mastodon-announce-private.json") - |> Poison.decode!() - - {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) - - assert data["actor"] == "http://mastodon.example.org/users/admin" - assert data["type"] == "Announce" - - assert data["id"] == - "http://mastodon.example.org/users/admin/statuses/99542391527669785/activity" - - object = Object.normalize(data["object"]) - - assert object.data["id"] == "http://mastodon.example.org/@admin/99541947525187368" - assert object.data["content"] == "this is a private toot" - end - - @tag capture_log: true - test "it rejects incoming announces with an inlined activity from another origin" do - data = - File.read!("test/fixtures/bogus-mastodon-announce.json") - |> Poison.decode!() - - assert :error = Transmogrifier.handle_incoming(data) - end - - test "it does not clobber the addressing on announce activities" do - user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "hey"}) - - data = - File.read!("test/fixtures/mastodon-announce.json") - |> Poison.decode!() - |> Map.put("object", Object.normalize(activity).data["id"]) - |> Map.put("to", ["http://mastodon.example.org/users/admin/followers"]) - |> Map.put("cc", []) - - {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) - - assert data["to"] == ["http://mastodon.example.org/users/admin/followers"] - end - test "it ensures that as:Public activities make it to their followers collection" do user = insert(:user) @@ -652,8 +389,8 @@ test "it strips internal likes" do test "it strips internal reactions" do user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "#cofe"}) - {:ok, _, _} = CommonAPI.react_with_emoji(activity.id, user, "📢") + {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"}) + {:ok, _} = CommonAPI.react_with_emoji(activity.id, user, "📢") %{object: object} = Activity.get_by_id_with_object(activity.id) assert Map.has_key?(object.data, "reactions") @@ -744,7 +481,7 @@ test "it works with custom profile fields" do user = User.get_cached_by_ap_id(activity.actor) - assert User.fields(user) == [ + assert user.fields == [ %{"name" => "foo", "value" => "bar"}, %{"name" => "foo1", "value" => "bar1"} ] @@ -765,7 +502,7 @@ test "it works with custom profile fields" do user = User.get_cached_by_ap_id(user.ap_id) - assert User.fields(user) == [ + assert user.fields == [ %{"name" => "foo", "value" => "updated"}, %{"name" => "foo1", "value" => "updated"} ] @@ -783,7 +520,7 @@ test "it works with custom profile fields" do user = User.get_cached_by_ap_id(user.ap_id) - assert User.fields(user) == [ + assert user.fields == [ %{"name" => "foo", "value" => "updated"}, %{"name" => "foo1", "value" => "updated"} ] @@ -794,7 +531,7 @@ test "it works with custom profile fields" do user = User.get_cached_by_ap_id(user.ap_id) - assert User.fields(user) == [] + assert user.fields == [] end test "it works for incoming update activities which lock the account" do @@ -820,112 +557,6 @@ test "it works for incoming update activities which lock the account" do assert user.locked == true end - test "it works for incoming deletes" do - activity = insert(:note_activity) - deleting_user = insert(:user) - - data = - File.read!("test/fixtures/mastodon-delete.json") - |> Poison.decode!() - - object = - data["object"] - |> Map.put("id", activity.data["object"]) - - data = - data - |> Map.put("object", object) - |> Map.put("actor", deleting_user.ap_id) - - {:ok, %Activity{actor: actor, local: false, data: %{"id" => id}}} = - Transmogrifier.handle_incoming(data) - - assert id == data["id"] - refute Activity.get_by_id(activity.id) - assert actor == deleting_user.ap_id - end - - test "it fails for incoming deletes with spoofed origin" do - activity = insert(:note_activity) - - data = - File.read!("test/fixtures/mastodon-delete.json") - |> Poison.decode!() - - object = - data["object"] - |> Map.put("id", activity.data["object"]) - - data = - data - |> Map.put("object", object) - - assert capture_log(fn -> - :error = Transmogrifier.handle_incoming(data) - end) =~ - "[error] Could not decode user at fetch http://mastodon.example.org/users/gargron, {:error, :nxdomain}" - - assert Activity.get_by_id(activity.id) - end - - @tag capture_log: true - test "it works for incoming user deletes" do - %{ap_id: ap_id} = insert(:user, ap_id: "http://mastodon.example.org/users/admin") - - data = - File.read!("test/fixtures/mastodon-delete-user.json") - |> Poison.decode!() - - {:ok, _} = Transmogrifier.handle_incoming(data) - ObanHelpers.perform_all() - - refute User.get_cached_by_ap_id(ap_id) - end - - test "it fails for incoming user deletes with spoofed origin" do - %{ap_id: ap_id} = insert(:user) - - data = - File.read!("test/fixtures/mastodon-delete-user.json") - |> Poison.decode!() - |> Map.put("actor", ap_id) - - assert capture_log(fn -> - assert :error == Transmogrifier.handle_incoming(data) - end) =~ "Object containment failed" - - assert User.get_cached_by_ap_id(ap_id) - end - - test "it works for incoming unannounces with an existing notice" do - user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "hey"}) - - announce_data = - File.read!("test/fixtures/mastodon-announce.json") - |> Poison.decode!() - |> Map.put("object", activity.data["object"]) - - {:ok, %Activity{data: announce_data, local: false}} = - Transmogrifier.handle_incoming(announce_data) - - data = - File.read!("test/fixtures/mastodon-undo-announce.json") - |> Poison.decode!() - |> Map.put("object", announce_data) - |> Map.put("actor", announce_data["actor"]) - - {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) - - assert data["type"] == "Undo" - assert object_data = data["object"] - assert object_data["type"] == "Announce" - assert object_data["object"] == activity.data["object"] - - assert object_data["id"] == - "http://mastodon.example.org/users/admin/statuses/99542391527669785/activity" - end - test "it works for incomming unfollows with an existing follow" do user = insert(:user) @@ -1020,32 +651,6 @@ test "incoming blocks successfully tear down any follow relationship" do refute User.following?(blocked, blocker) end - test "it works for incoming unblocks with an existing block" do - user = insert(:user) - - block_data = - File.read!("test/fixtures/mastodon-block-activity.json") - |> Poison.decode!() - |> Map.put("object", user.ap_id) - - {:ok, %Activity{data: _, local: false}} = Transmogrifier.handle_incoming(block_data) - - data = - File.read!("test/fixtures/mastodon-unblock-activity.json") - |> Poison.decode!() - |> Map.put("object", block_data) - - {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) - assert data["type"] == "Undo" - assert data["object"]["type"] == "Block" - assert data["object"]["object"] == user.ap_id - assert data["actor"] == "http://mastodon.example.org/users/admin" - - blocker = User.get_cached_by_ap_id(data["actor"]) - - refute User.blocks?(blocker, user) - end - test "it works for incoming accepts which were pre-accepted" do follower = insert(:user) followed = insert(:user) @@ -1119,6 +724,12 @@ test "it works for incoming accepts which are referenced by IRI only" do follower = User.get_cached_by_id(follower.id) assert User.following?(follower, followed) == true + + follower = User.get_by_id(follower.id) + assert follower.following_count == 1 + + followed = User.get_by_id(followed.id) + assert followed.follower_count == 1 end test "it fails for incoming accepts which cannot be correlated" do @@ -1219,6 +830,35 @@ test "it rejects activities without a valid ID" do :error = Transmogrifier.handle_incoming(data) 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( @@ -1228,19 +868,13 @@ test "it remaps video URLs as attachments if necessary" do attachment = %{ "type" => "Link", "mediaType" => "video/mp4", - "href" => - "https://peertube.moe/static/webseed/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-480.mp4", - "mimeType" => "video/mp4", - "size" => 5_015_880, "url" => [ %{ "href" => "https://peertube.moe/static/webseed/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-480.mp4", - "mediaType" => "video/mp4", - "type" => "Link" + "mediaType" => "video/mp4" } - ], - "width" => 480 + ] } assert object.data["url"] == @@ -1253,7 +887,7 @@ test "it accepts Flag activities" do user = insert(:user) other_user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "test post"}) + {:ok, activity} = CommonAPI.post(user, %{status: "test post"}) object = Object.normalize(activity) note_obj = %{ @@ -1397,13 +1031,13 @@ test "does NOT schedule background fetching of `replies` beyond max thread depth setup do user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "post1"}) + {:ok, activity} = CommonAPI.post(user, %{status: "post1"}) {:ok, reply1} = - CommonAPI.post(user, %{"status" => "reply1", "in_reply_to_status_id" => activity.id}) + CommonAPI.post(user, %{status: "reply1", in_reply_to_status_id: activity.id}) {:ok, reply2} = - CommonAPI.post(user, %{"status" => "reply2", "in_reply_to_status_id" => activity.id}) + CommonAPI.post(user, %{status: "reply2", in_reply_to_status_id: activity.id}) replies_uris = Enum.map([reply1, reply2], fn a -> a.object.data["id"] end) @@ -1443,9 +1077,9 @@ test "does NOT schedule background fetching of `replies` beyond max thread depth test "it inlines private announced objects" do user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "hey", "visibility" => "private"}) + {:ok, activity} = CommonAPI.post(user, %{status: "hey", visibility: "private"}) - {:ok, announce_activity, _} = CommonAPI.repeat(activity.id, user) + {:ok, announce_activity} = CommonAPI.repeat(activity.id, user) {:ok, modified} = Transmogrifier.prepare_outgoing(announce_activity.data) @@ -1458,31 +1092,36 @@ test "it turns mentions into tags" do other_user = insert(:user) {:ok, activity} = - CommonAPI.post(user, %{"status" => "hey, @#{other_user.nickname}, how are ya? #2hu"}) + CommonAPI.post(user, %{status: "hey, @#{other_user.nickname}, how are ya? #2hu"}) - {:ok, modified} = Transmogrifier.prepare_outgoing(activity.data) - object = modified["object"] + with_mock Pleroma.Notification, + get_notified_from_activity: fn _, _ -> [] end do + {:ok, modified} = Transmogrifier.prepare_outgoing(activity.data) - expected_mention = %{ - "href" => other_user.ap_id, - "name" => "@#{other_user.nickname}", - "type" => "Mention" - } + object = modified["object"] - expected_tag = %{ - "href" => Pleroma.Web.Endpoint.url() <> "/tags/2hu", - "type" => "Hashtag", - "name" => "#2hu" - } + expected_mention = %{ + "href" => other_user.ap_id, + "name" => "@#{other_user.nickname}", + "type" => "Mention" + } - assert Enum.member?(object["tag"], expected_tag) - assert Enum.member?(object["tag"], expected_mention) + expected_tag = %{ + "href" => Pleroma.Web.Endpoint.url() <> "/tags/2hu", + "type" => "Hashtag", + "name" => "#2hu" + } + + refute called(Pleroma.Notification.get_notified_from_activity(:_, :_)) + assert Enum.member?(object["tag"], expected_tag) + assert Enum.member?(object["tag"], expected_mention) + end end test "it adds the sensitive property" do user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "#nsfw hey"}) + {:ok, activity} = CommonAPI.post(user, %{status: "#nsfw hey"}) {:ok, modified} = Transmogrifier.prepare_outgoing(activity.data) assert modified["object"]["sensitive"] @@ -1491,7 +1130,7 @@ test "it adds the sensitive property" do test "it adds the json-ld context and the conversation property" do user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "hey"}) + {:ok, activity} = CommonAPI.post(user, %{status: "hey"}) {:ok, modified} = Transmogrifier.prepare_outgoing(activity.data) assert modified["@context"] == @@ -1503,7 +1142,7 @@ test "it adds the json-ld context and the conversation property" do test "it sets the 'attributedTo' property to the actor of the object if it doesn't have one" do user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "hey"}) + {:ok, activity} = CommonAPI.post(user, %{status: "hey"}) {:ok, modified} = Transmogrifier.prepare_outgoing(activity.data) assert modified["object"]["actor"] == modified["object"]["attributedTo"] @@ -1512,7 +1151,7 @@ test "it sets the 'attributedTo' property to the actor of the object if it doesn test "it strips internal hashtag data" do user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "#2hu"}) + {:ok, activity} = CommonAPI.post(user, %{status: "#2hu"}) expected_tag = %{ "href" => Pleroma.Web.Endpoint.url() <> "/tags/2hu", @@ -1528,7 +1167,7 @@ test "it strips internal hashtag data" do test "it strips internal fields" do user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "#2hu :firefox:"}) + {:ok, activity} = CommonAPI.post(user, %{status: "#2hu :firefox:"}) {:ok, modified} = Transmogrifier.prepare_outgoing(activity.data) @@ -1560,14 +1199,13 @@ test "the directMessage flag is present" do user = insert(:user) other_user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "2hu :moominmamma:"}) + {:ok, activity} = CommonAPI.post(user, %{status: "2hu :moominmamma:"}) {:ok, modified} = Transmogrifier.prepare_outgoing(activity.data) assert modified["directMessage"] == false - {:ok, activity} = - CommonAPI.post(user, %{"status" => "@#{other_user.nickname} :moominmamma:"}) + {:ok, activity} = CommonAPI.post(user, %{status: "@#{other_user.nickname} :moominmamma:"}) {:ok, modified} = Transmogrifier.prepare_outgoing(activity.data) @@ -1575,8 +1213,8 @@ test "the directMessage flag is present" do {:ok, activity} = CommonAPI.post(user, %{ - "status" => "@#{other_user.nickname} :moominmamma:", - "visibility" => "direct" + status: "@#{other_user.nickname} :moominmamma:", + visibility: "direct" }) {:ok, modified} = Transmogrifier.prepare_outgoing(activity.data) @@ -1588,8 +1226,7 @@ test "it strips BCC field" do user = insert(:user) {:ok, list} = Pleroma.List.create("foo", user) - {:ok, activity} = - CommonAPI.post(user, %{"status" => "foobar", "visibility" => "list:#{list.id}"}) + {:ok, activity} = CommonAPI.post(user, %{status: "foobar", visibility: "list:#{list.id}"}) {:ok, modified} = Transmogrifier.prepare_outgoing(activity.data) @@ -1622,10 +1259,10 @@ test "it upgrades a user to activitypub" do }) user_two = insert(:user) - Pleroma.FollowingRelationship.follow(user_two, user, "accept") + Pleroma.FollowingRelationship.follow(user_two, user, :follow_accept) - {:ok, activity} = CommonAPI.post(user, %{"status" => "test"}) - {:ok, unrelated_activity} = CommonAPI.post(user_two, %{"status" => "test"}) + {:ok, activity} = CommonAPI.post(user, %{status: "test"}) + {:ok, unrelated_activity} = CommonAPI.post(user_two, %{status: "test"}) assert "http://localhost:4001/users/rye@niu.moe/followers" in activity.recipients user = User.get_cached_by_id(user.id) @@ -1697,7 +1334,7 @@ test "it rejects activities which reference objects with bogus origins" do } assert capture_log(fn -> - :error = Transmogrifier.handle_incoming(data) + {:error, _} = Transmogrifier.handle_incoming(data) end) =~ "Object containment failed" end @@ -1712,7 +1349,7 @@ test "it rejects activities which reference objects that have an incorrect attri } assert capture_log(fn -> - :error = Transmogrifier.handle_incoming(data) + {:error, _} = Transmogrifier.handle_incoming(data) end) =~ "Object containment failed" end @@ -1727,7 +1364,7 @@ test "it rejects activities which reference objects that have an incorrect attri } assert capture_log(fn -> - :error = Transmogrifier.handle_incoming(data) + {:error, _} = Transmogrifier.handle_incoming(data) end) =~ "Object containment failed" end end @@ -1791,8 +1428,8 @@ test "Rewrites Answers to Notes" do {:ok, poll_activity} = CommonAPI.post(user, %{ - "status" => "suya...", - "poll" => %{"options" => ["suya", "suya.", "suya.."], "expires_in" => 10} + status: "suya...", + poll: %{options: ["suya", "suya.", "suya.."], expires_in: 10} }) poll_object = Object.normalize(poll_activity) @@ -2061,11 +1698,7 @@ test "returns modified object when attachment is map" do %{ "mediaType" => "video/mp4", "url" => [ - %{ - "href" => "https://peertube.moe/stat-480.mp4", - "mediaType" => "video/mp4", - "type" => "Link" - } + %{"href" => "https://peertube.moe/stat-480.mp4", "mediaType" => "video/mp4"} ] } ] @@ -2083,23 +1716,13 @@ test "returns modified object when attachment is list" do %{ "mediaType" => "video/mp4", "url" => [ - %{ - "href" => "https://pe.er/stat-480.mp4", - "mediaType" => "video/mp4", - "type" => "Link" - } + %{"href" => "https://pe.er/stat-480.mp4", "mediaType" => "video/mp4"} ] }, %{ - "href" => "https://pe.er/stat-480.mp4", "mediaType" => "video/mp4", - "mimeType" => "video/mp4", "url" => [ - %{ - "href" => "https://pe.er/stat-480.mp4", - "mediaType" => "video/mp4", - "type" => "Link" - } + %{"href" => "https://pe.er/stat-480.mp4", "mediaType" => "video/mp4"} ] } ] @@ -2149,28 +1772,27 @@ test "returns unmodified object if activity doesn't have self-replies" do test "sets `replies` collection with a limited number of self-replies" do [user, another_user] = insert_list(2, :user) - {:ok, %{id: id1} = activity} = CommonAPI.post(user, %{"status" => "1"}) + {:ok, %{id: id1} = activity} = CommonAPI.post(user, %{status: "1"}) {:ok, %{id: id2} = self_reply1} = - CommonAPI.post(user, %{"status" => "self-reply 1", "in_reply_to_status_id" => id1}) + CommonAPI.post(user, %{status: "self-reply 1", in_reply_to_status_id: id1}) {:ok, self_reply2} = - CommonAPI.post(user, %{"status" => "self-reply 2", "in_reply_to_status_id" => id1}) + CommonAPI.post(user, %{status: "self-reply 2", in_reply_to_status_id: id1}) # Assuming to _not_ be present in `replies` due to :note_replies_output_limit is set to 2 - {:ok, _} = - CommonAPI.post(user, %{"status" => "self-reply 3", "in_reply_to_status_id" => id1}) + {:ok, _} = CommonAPI.post(user, %{status: "self-reply 3", in_reply_to_status_id: id1}) {:ok, _} = CommonAPI.post(user, %{ - "status" => "self-reply to self-reply", - "in_reply_to_status_id" => id2 + status: "self-reply to self-reply", + in_reply_to_status_id: id2 }) {:ok, _} = CommonAPI.post(another_user, %{ - "status" => "another user's reply", - "in_reply_to_status_id" => id1 + status: "another user's reply", + in_reply_to_status_id: id1 }) object = Object.normalize(activity) @@ -2180,4 +1802,18 @@ test "sets `replies` collection with a limited number of self-replies" do Transmogrifier.set_replies(object.data)["replies"] end end + + test "take_emoji_tags/1" do + user = insert(:user, %{emoji: %{"firefox" => "https://example.org/firefox.png"}}) + + assert Transmogrifier.take_emoji_tags(user) == [ + %{ + "icon" => %{"type" => "Image", "url" => "https://example.org/firefox.png"}, + "id" => "https://example.org/firefox.png", + "name" => ":firefox:", + "type" => "Emoji", + "updated" => "1970-01-01T00:00:00Z" + } + ] + end end diff --git a/test/web/activity_pub/utils_test.exs b/test/web/activity_pub/utils_test.exs index e913a5148..15f03f193 100644 --- a/test/web/activity_pub/utils_test.exs +++ b/test/web/activity_pub/utils_test.exs @@ -102,34 +102,6 @@ test "works with an object has tags as map" do end end - describe "make_unlike_data/3" do - test "returns data for unlike activity" do - user = insert(:user) - like_activity = insert(:like_activity, data_attrs: %{"context" => "test context"}) - - object = Object.normalize(like_activity.data["object"]) - - assert Utils.make_unlike_data(user, like_activity, nil) == %{ - "type" => "Undo", - "actor" => user.ap_id, - "object" => like_activity.data, - "to" => [user.follower_address, object.data["actor"]], - "cc" => [Pleroma.Constants.as_public()], - "context" => like_activity.data["context"] - } - - assert Utils.make_unlike_data(user, like_activity, "9mJEZK0tky1w2xD2vY") == %{ - "type" => "Undo", - "actor" => user.ap_id, - "object" => like_activity.data, - "to" => [user.follower_address, object.data["actor"]], - "cc" => [Pleroma.Constants.as_public()], - "context" => like_activity.data["context"], - "id" => "9mJEZK0tky1w2xD2vY" - } - end - end - describe "make_like_data" do setup do user = insert(:user) @@ -148,7 +120,7 @@ test "addresses actor's follower address if the activity is public", %{ {:ok, activity} = CommonAPI.post(user, %{ - "status" => + status: "hey @#{other_user.nickname}, @#{third_user.nickname} how about beering together this weekend?" }) @@ -167,8 +139,8 @@ test "does not adress actor's follower address if the activity is not public", % {:ok, activity} = CommonAPI.post(user, %{ - "status" => "@#{other_user.nickname} @#{third_user.nickname} bought a new swimsuit!", - "visibility" => "private" + status: "@#{other_user.nickname} @#{third_user.nickname} bought a new swimsuit!", + visibility: "private" }) %{"to" => to, "cc" => cc} = Utils.make_like_data(other_user, activity, nil) @@ -196,11 +168,11 @@ test "fetches existing votes" do {:ok, activity} = CommonAPI.post(user, %{ - "status" => "How do I pronounce LaTeX?", - "poll" => %{ - "options" => ["laytekh", "lahtekh", "latex"], - "expires_in" => 20, - "multiple" => true + status: "How do I pronounce LaTeX?", + poll: %{ + options: ["laytekh", "lahtekh", "latex"], + expires_in: 20, + multiple: true } }) @@ -215,17 +187,16 @@ test "fetches only Create activities" do {:ok, activity} = CommonAPI.post(user, %{ - "status" => "Are we living in a society?", - "poll" => %{ - "options" => ["yes", "no"], - "expires_in" => 20 + status: "Are we living in a society?", + poll: %{ + options: ["yes", "no"], + expires_in: 20 } }) object = Object.normalize(activity) {:ok, [vote], object} = CommonAPI.vote(other_user, object, [0]) - vote_object = Object.normalize(vote) - {:ok, _activity, _object} = ActivityPub.like(user, vote_object) + {:ok, _activity} = CommonAPI.favorite(user, activity.id) [fetched_vote] = Utils.get_existing_votes(other_user.ap_id, object) assert fetched_vote.id == vote.id end @@ -346,7 +317,7 @@ test "fetches existing like" do user = insert(:user) refute Utils.get_existing_like(user.ap_id, object) - {:ok, like_activity, _object} = ActivityPub.like(user, object) + {:ok, like_activity} = CommonAPI.favorite(user, note_activity.id) assert ^like_activity = Utils.get_existing_like(user.ap_id, object) end @@ -363,7 +334,7 @@ test "fetches existing announce" do assert object = Object.normalize(note_activity) actor = insert(:user) - {:ok, announce, _object} = ActivityPub.announce(actor, object) + {:ok, announce} = CommonAPI.repeat(note_activity.id, actor) assert Utils.get_existing_announce(actor.ap_id, object) == announce end end @@ -498,7 +469,7 @@ test "returns empty map when params is invalid" do test "returns map with Flag object" do reporter = insert(:user) target_account = insert(:user) - {:ok, activity} = CommonAPI.post(target_account, %{"status" => "foobar"}) + {:ok, activity} = CommonAPI.post(target_account, %{status: "foobar"}) context = Utils.generate_context_id() content = "foobar" diff --git a/test/web/activity_pub/views/object_view_test.exs b/test/web/activity_pub/views/object_view_test.exs index de5ffc5b3..f0389845d 100644 --- a/test/web/activity_pub/views/object_view_test.exs +++ b/test/web/activity_pub/views/object_view_test.exs @@ -44,7 +44,7 @@ test "renders `replies` collection for a note activity" do activity = insert(:note_activity, user: user) {:ok, self_reply1} = - CommonAPI.post(user, %{"status" => "self-reply 1", "in_reply_to_status_id" => activity.id}) + CommonAPI.post(user, %{status: "self-reply 1", in_reply_to_status_id: activity.id}) replies_uris = [self_reply1.object.data["id"]] result = ObjectView.render("object.json", %{object: refresh_record(activity)}) @@ -59,7 +59,7 @@ test "renders a like activity" do object = Object.normalize(note) user = insert(:user) - {:ok, like_activity, _} = CommonAPI.favorite(note.id, user) + {:ok, like_activity} = CommonAPI.favorite(user, note.id) result = ObjectView.render("object.json", %{object: like_activity}) @@ -73,7 +73,7 @@ test "renders an announce activity" do object = Object.normalize(note) user = insert(:user) - {:ok, announce_activity, _} = CommonAPI.repeat(note.id, user) + {:ok, announce_activity} = CommonAPI.repeat(note.id, user) result = ObjectView.render("object.json", %{object: announce_activity}) diff --git a/test/web/activity_pub/views/user_view_test.exs b/test/web/activity_pub/views/user_view_test.exs index ecb2dc386..20b0f223c 100644 --- a/test/web/activity_pub/views/user_view_test.exs +++ b/test/web/activity_pub/views/user_view_test.exs @@ -29,7 +29,7 @@ test "Renders profile fields" do {:ok, user} = insert(:user) - |> User.upgrade_changeset(%{fields: fields}) + |> User.update_changeset(%{fields: fields}) |> User.update_and_set_cache() assert %{ @@ -38,7 +38,7 @@ test "Renders profile fields" do end test "Renders with emoji tags" do - user = insert(:user, emoji: [%{"bib" => "/test"}]) + user = insert(:user, emoji: %{"bib" => "/test"}) assert %{ "tag" => [ @@ -164,7 +164,7 @@ test "activity collection page aginates correctly" do posts = for i <- 0..25 do - {:ok, activity} = CommonAPI.post(user, %{"status" => "post #{i}"}) + {:ok, activity} = CommonAPI.post(user, %{status: "post #{i}"}) activity end diff --git a/test/web/activity_pub/visibilty_test.exs b/test/web/activity_pub/visibilty_test.exs index 5b91630d4..8e9354c65 100644 --- a/test/web/activity_pub/visibilty_test.exs +++ b/test/web/activity_pub/visibilty_test.exs @@ -21,21 +21,21 @@ defmodule Pleroma.Web.ActivityPub.VisibilityTest do Pleroma.List.follow(list, unrelated) {:ok, public} = - CommonAPI.post(user, %{"status" => "@#{mentioned.nickname}", "visibility" => "public"}) + CommonAPI.post(user, %{status: "@#{mentioned.nickname}", visibility: "public"}) {:ok, private} = - CommonAPI.post(user, %{"status" => "@#{mentioned.nickname}", "visibility" => "private"}) + CommonAPI.post(user, %{status: "@#{mentioned.nickname}", visibility: "private"}) {:ok, direct} = - CommonAPI.post(user, %{"status" => "@#{mentioned.nickname}", "visibility" => "direct"}) + CommonAPI.post(user, %{status: "@#{mentioned.nickname}", visibility: "direct"}) {:ok, unlisted} = - CommonAPI.post(user, %{"status" => "@#{mentioned.nickname}", "visibility" => "unlisted"}) + CommonAPI.post(user, %{status: "@#{mentioned.nickname}", visibility: "unlisted"}) {:ok, list} = CommonAPI.post(user, %{ - "status" => "@#{mentioned.nickname}", - "visibility" => "list:#{list.id}" + status: "@#{mentioned.nickname}", + visibility: "list:#{list.id}" }) %{ diff --git a/test/web/admin_api/admin_api_controller_test.exs b/test/web/admin_api/controllers/admin_api_controller_test.exs similarity index 85% rename from test/web/admin_api/admin_api_controller_test.exs rename to test/web/admin_api/controllers/admin_api_controller_test.exs index 0a902585d..ead840186 100644 --- a/test/web/admin_api/admin_api_controller_test.exs +++ b/test/web/admin_api/controllers/admin_api_controller_test.exs @@ -6,22 +6,24 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do use Pleroma.Web.ConnCase use Oban.Testing, repo: Pleroma.Repo - import Pleroma.Factory import ExUnit.CaptureLog + import Mock + import Pleroma.Factory alias Pleroma.Activity alias Pleroma.Config alias Pleroma.ConfigDB alias Pleroma.HTML + alias Pleroma.MFA alias Pleroma.ModerationLog alias Pleroma.Repo alias Pleroma.ReportNote alias Pleroma.Tests.ObanHelpers alias Pleroma.User alias Pleroma.UserInviteToken + alias Pleroma.Web alias Pleroma.Web.ActivityPub.Relay alias Pleroma.Web.CommonAPI - alias Pleroma.Web.MastodonAPI.StatusView alias Pleroma.Web.MediaProxy setup_all do @@ -146,18 +148,28 @@ test "GET /api/pleroma/admin/users/:nickname requires " <> describe "DELETE /api/pleroma/admin/users" do test "single user", %{admin: admin, conn: conn} do user = insert(:user) + clear_config([:instance, :federating], true) - conn = - conn - |> put_req_header("accept", "application/json") - |> delete("/api/pleroma/admin/users?nickname=#{user.nickname}") + with_mock Pleroma.Web.Federator, + publish: fn _ -> nil end do + conn = + conn + |> put_req_header("accept", "application/json") + |> delete("/api/pleroma/admin/users?nickname=#{user.nickname}") - log_entry = Repo.one(ModerationLog) + ObanHelpers.perform_all() - assert ModerationLog.get_log_entry_message(log_entry) == - "@#{admin.nickname} deleted users: @#{user.nickname}" + assert User.get_by_nickname(user.nickname).deactivated - assert json_response(conn, 200) == user.nickname + log_entry = Repo.one(ModerationLog) + + assert ModerationLog.get_log_entry_message(log_entry) == + "@#{admin.nickname} deleted users: @#{user.nickname}" + + assert json_response(conn, 200) == [user.nickname] + + assert called(Pleroma.Web.Federator.publish(:_)) + end end test "multiple users", %{admin: admin, conn: conn} do @@ -339,7 +351,7 @@ test "when the user doesn't exist", %{conn: conn} do conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}") - assert "Not found" == json_response(conn, 404) + assert %{"error" => "Not found"} == json_response(conn, 404) end end @@ -626,6 +638,39 @@ test "it returns 403 if requested by a non-admin" do assert json_response(conn, :forbidden) end + + test "email with +", %{conn: conn, admin: admin} do + recipient_email = "foo+bar@baz.com" + + conn + |> put_req_header("content-type", "application/json;charset=utf-8") + |> post("/api/pleroma/admin/users/email_invite", %{email: recipient_email}) + |> json_response(:no_content) + + token_record = + Pleroma.UserInviteToken + |> Repo.all() + |> List.last() + + assert token_record + refute token_record.used + + notify_email = Config.get([:instance, :notify_email]) + instance_name = Config.get([:instance, :name]) + + email = + Pleroma.Emails.UserEmail.user_invitation_email( + admin, + token_record, + recipient_email + ) + + Swoosh.TestAssertions.assert_email_sent( + from: {instance_name, notify_email}, + to: recipient_email, + html_body: email.html_body + ) + end end describe "POST /api/pleroma/admin/users/email_invite, with invalid config" do @@ -638,7 +683,11 @@ test "it returns 500 if `invites_enabled` is not enabled", %{conn: conn} do conn = post(conn, "/api/pleroma/admin/users/email_invite?email=foo@bar.com&name=JD") - assert json_response(conn, :internal_server_error) + assert json_response(conn, :bad_request) == + %{ + "error" => + "To send invites you need to set the `invites_enabled` option to true." + } end test "it returns 500 if `registrations_open` is enabled", %{conn: conn} do @@ -647,7 +696,11 @@ test "it returns 500 if `registrations_open` is enabled", %{conn: conn} do conn = post(conn, "/api/pleroma/admin/users/email_invite?email=foo@bar.com&name=JD") - assert json_response(conn, :internal_server_error) + assert json_response(conn, :bad_request) == + %{ + "error" => + "To send invites you need to set the `registrations_open` option to false." + } end end @@ -703,6 +756,39 @@ test "renders users array for the first page", %{conn: conn, admin: admin} do } end + test "pagination works correctly with service users", %{conn: conn} do + service1 = insert(:user, ap_id: Web.base_url() <> "/relay") + service2 = insert(:user, ap_id: Web.base_url() <> "/internal/fetch") + insert_list(25, :user) + + assert %{"count" => 26, "page_size" => 10, "users" => users1} = + conn + |> get("/api/pleroma/admin/users?page=1&filters=", %{page_size: "10"}) + |> json_response(200) + + assert Enum.count(users1) == 10 + assert service1 not in [users1] + assert service2 not in [users1] + + assert %{"count" => 26, "page_size" => 10, "users" => users2} = + conn + |> get("/api/pleroma/admin/users?page=2&filters=", %{page_size: "10"}) + |> json_response(200) + + assert Enum.count(users2) == 10 + assert service1 not in [users2] + assert service2 not in [users2] + + assert %{"count" => 26, "page_size" => 10, "users" => users3} = + conn + |> get("/api/pleroma/admin/users?page=3&filters=", %{page_size: "10"}) + |> json_response(200) + + assert Enum.count(users3) == 6 + assert service1 not in [users3] + assert service2 not in [users3] + end + test "renders empty array for the second page", %{conn: conn} do insert(:user) @@ -1200,6 +1286,38 @@ test "PATCH /api/pleroma/admin/users/:nickname/toggle_activation", %{admin: admi "@#{admin.nickname} deactivated users: @#{user.nickname}" end + describe "PUT disable_mfa" do + test "returns 200 and disable 2fa", %{conn: conn} do + user = + insert(:user, + multi_factor_authentication_settings: %MFA.Settings{ + enabled: true, + totp: %MFA.Settings.TOTP{secret: "otp_secret", confirmed: true} + } + ) + + response = + conn + |> put("/api/pleroma/admin/users/disable_mfa", %{nickname: user.nickname}) + |> json_response(200) + + assert response == user.nickname + mfa_settings = refresh_record(user).multi_factor_authentication_settings + + refute mfa_settings.enabled + refute mfa_settings.totp.confirmed + end + + test "returns 404 if user not found", %{conn: conn} do + response = + conn + |> put("/api/pleroma/admin/users/disable_mfa", %{nickname: "nickname"}) + |> json_response(404) + + assert response == %{"error" => "Not found"} + end + end + describe "POST /api/pleroma/admin/users/invite_token" do test "without options", %{conn: conn} do conn = post(conn, "/api/pleroma/admin/users/invite_token") @@ -1302,7 +1420,7 @@ test "with token", %{conn: conn} do test "with invalid token", %{conn: conn} do conn = post(conn, "/api/pleroma/admin/users/revoke_invite", %{"token" => "foo"}) - assert json_response(conn, :not_found) == "Not found" + assert json_response(conn, :not_found) == %{"error" => "Not found"} end end @@ -1313,9 +1431,9 @@ test "returns report by its id", %{conn: conn} do {:ok, %{id: report_id}} = CommonAPI.report(reporter, %{ - "account_id" => target_user.id, - "comment" => "I feel offended", - "status_ids" => [activity.id] + account_id: target_user.id, + comment: "I feel offended", + status_ids: [activity.id] }) response = @@ -1329,7 +1447,7 @@ test "returns report by its id", %{conn: conn} do test "returns 404 when report id is invalid", %{conn: conn} do conn = get(conn, "/api/pleroma/admin/reports/test") - assert json_response(conn, :not_found) == "Not found" + assert json_response(conn, :not_found) == %{"error" => "Not found"} end end @@ -1340,16 +1458,16 @@ test "returns 404 when report id is invalid", %{conn: conn} do {:ok, %{id: report_id}} = CommonAPI.report(reporter, %{ - "account_id" => target_user.id, - "comment" => "I feel offended", - "status_ids" => [activity.id] + account_id: target_user.id, + comment: "I feel offended", + status_ids: [activity.id] }) {:ok, %{id: second_report_id}} = CommonAPI.report(reporter, %{ - "account_id" => target_user.id, - "comment" => "I feel very offended", - "status_ids" => [activity.id] + account_id: target_user.id, + comment: "I feel very offended", + status_ids: [activity.id] }) %{ @@ -1489,9 +1607,9 @@ test "returns reports", %{conn: conn} do {:ok, %{id: report_id}} = CommonAPI.report(reporter, %{ - "account_id" => target_user.id, - "comment" => "I feel offended", - "status_ids" => [activity.id] + account_id: target_user.id, + comment: "I feel offended", + status_ids: [activity.id] }) response = @@ -1513,15 +1631,15 @@ test "returns reports with specified state", %{conn: conn} do {:ok, %{id: first_report_id}} = CommonAPI.report(reporter, %{ - "account_id" => target_user.id, - "comment" => "I feel offended", - "status_ids" => [activity.id] + account_id: target_user.id, + comment: "I feel offended", + status_ids: [activity.id] }) {:ok, %{id: second_report_id}} = CommonAPI.report(reporter, %{ - "account_id" => target_user.id, - "comment" => "I don't like this user" + account_id: target_user.id, + comment: "I don't like this user" }) CommonAPI.update_report_state(second_report_id, "closed") @@ -1586,298 +1704,6 @@ test "returns 403 when requested by anonymous" do end end - describe "GET /api/pleroma/admin/grouped_reports" do - setup do - [reporter, target_user] = insert_pair(:user) - - date1 = (DateTime.to_unix(DateTime.utc_now()) + 1000) |> DateTime.from_unix!() - date2 = (DateTime.to_unix(DateTime.utc_now()) + 2000) |> DateTime.from_unix!() - date3 = (DateTime.to_unix(DateTime.utc_now()) + 3000) |> DateTime.from_unix!() - - first_status = - insert(:note_activity, user: target_user, data_attrs: %{"published" => date1}) - - second_status = - insert(:note_activity, user: target_user, data_attrs: %{"published" => date2}) - - third_status = - insert(:note_activity, user: target_user, data_attrs: %{"published" => date3}) - - {:ok, first_report} = - CommonAPI.report(reporter, %{ - "account_id" => target_user.id, - "status_ids" => [first_status.id, second_status.id, third_status.id] - }) - - {:ok, second_report} = - CommonAPI.report(reporter, %{ - "account_id" => target_user.id, - "status_ids" => [first_status.id, second_status.id] - }) - - {:ok, third_report} = - CommonAPI.report(reporter, %{ - "account_id" => target_user.id, - "status_ids" => [first_status.id] - }) - - %{ - first_status: Activity.get_by_ap_id_with_object(first_status.data["id"]), - second_status: Activity.get_by_ap_id_with_object(second_status.data["id"]), - third_status: Activity.get_by_ap_id_with_object(third_status.data["id"]), - first_report: first_report, - first_status_reports: [first_report, second_report, third_report], - second_status_reports: [first_report, second_report], - third_status_reports: [first_report], - target_user: target_user, - reporter: reporter - } - end - - test "returns reports grouped by status", %{ - conn: conn, - first_status: first_status, - second_status: second_status, - third_status: third_status, - first_status_reports: first_status_reports, - second_status_reports: second_status_reports, - third_status_reports: third_status_reports, - target_user: target_user, - reporter: reporter - } do - response = - conn - |> get("/api/pleroma/admin/grouped_reports") - |> json_response(:ok) - - assert length(response["reports"]) == 3 - - first_group = Enum.find(response["reports"], &(&1["status"]["id"] == first_status.id)) - - second_group = Enum.find(response["reports"], &(&1["status"]["id"] == second_status.id)) - - third_group = Enum.find(response["reports"], &(&1["status"]["id"] == third_status.id)) - - assert length(first_group["reports"]) == 3 - assert length(second_group["reports"]) == 2 - assert length(third_group["reports"]) == 1 - - assert first_group["date"] == - Enum.max_by(first_status_reports, fn act -> - NaiveDateTime.from_iso8601!(act.data["published"]) - end).data["published"] - - assert first_group["status"] == - Map.put( - stringify_keys(StatusView.render("show.json", %{activity: first_status})), - "deleted", - false - ) - - assert(first_group["account"]["id"] == target_user.id) - - assert length(first_group["actors"]) == 1 - assert hd(first_group["actors"])["id"] == reporter.id - - assert Enum.map(first_group["reports"], & &1["id"]) -- - Enum.map(first_status_reports, & &1.id) == [] - - assert second_group["date"] == - Enum.max_by(second_status_reports, fn act -> - NaiveDateTime.from_iso8601!(act.data["published"]) - end).data["published"] - - assert second_group["status"] == - Map.put( - stringify_keys(StatusView.render("show.json", %{activity: second_status})), - "deleted", - false - ) - - assert second_group["account"]["id"] == target_user.id - - assert length(second_group["actors"]) == 1 - assert hd(second_group["actors"])["id"] == reporter.id - - assert Enum.map(second_group["reports"], & &1["id"]) -- - Enum.map(second_status_reports, & &1.id) == [] - - assert third_group["date"] == - Enum.max_by(third_status_reports, fn act -> - NaiveDateTime.from_iso8601!(act.data["published"]) - end).data["published"] - - assert third_group["status"] == - Map.put( - stringify_keys(StatusView.render("show.json", %{activity: third_status})), - "deleted", - false - ) - - assert third_group["account"]["id"] == target_user.id - - assert length(third_group["actors"]) == 1 - assert hd(third_group["actors"])["id"] == reporter.id - - assert Enum.map(third_group["reports"], & &1["id"]) -- - Enum.map(third_status_reports, & &1.id) == [] - end - - test "reopened report renders status data", %{ - conn: conn, - first_report: first_report, - first_status: first_status - } do - {:ok, _} = CommonAPI.update_report_state(first_report.id, "resolved") - - response = - conn - |> get("/api/pleroma/admin/grouped_reports") - |> json_response(:ok) - - first_group = Enum.find(response["reports"], &(&1["status"]["id"] == first_status.id)) - - assert first_group["status"] == - Map.put( - stringify_keys(StatusView.render("show.json", %{activity: first_status})), - "deleted", - false - ) - end - - test "reopened report does not render status data if status has been deleted", %{ - conn: conn, - first_report: first_report, - first_status: first_status, - target_user: target_user - } do - {:ok, _} = CommonAPI.update_report_state(first_report.id, "resolved") - {:ok, _} = CommonAPI.delete(first_status.id, target_user) - - refute Activity.get_by_ap_id(first_status.id) - - response = - conn - |> get("/api/pleroma/admin/grouped_reports") - |> json_response(:ok) - - assert Enum.find(response["reports"], &(&1["status"]["deleted"] == true))["status"][ - "deleted" - ] == true - - assert length(Enum.filter(response["reports"], &(&1["status"]["deleted"] == false))) == 2 - end - - test "account not empty if status was deleted", %{ - conn: conn, - first_report: first_report, - first_status: first_status, - target_user: target_user - } do - {:ok, _} = CommonAPI.update_report_state(first_report.id, "resolved") - {:ok, _} = CommonAPI.delete(first_status.id, target_user) - - refute Activity.get_by_ap_id(first_status.id) - - response = - conn - |> get("/api/pleroma/admin/grouped_reports") - |> json_response(:ok) - - assert Enum.find(response["reports"], &(&1["status"]["deleted"] == true))["account"] - end - end - - describe "PUT /api/pleroma/admin/statuses/:id" do - setup do - activity = insert(:note_activity) - - %{id: activity.id} - end - - test "toggle sensitive flag", %{conn: conn, id: id, admin: admin} do - response = - conn - |> put("/api/pleroma/admin/statuses/#{id}", %{"sensitive" => "true"}) - |> json_response(:ok) - - assert response["sensitive"] - - log_entry = Repo.one(ModerationLog) - - assert ModerationLog.get_log_entry_message(log_entry) == - "@#{admin.nickname} updated status ##{id}, set sensitive: 'true'" - - response = - conn - |> put("/api/pleroma/admin/statuses/#{id}", %{"sensitive" => "false"}) - |> json_response(:ok) - - refute response["sensitive"] - end - - test "change visibility flag", %{conn: conn, id: id, admin: admin} do - response = - conn - |> put("/api/pleroma/admin/statuses/#{id}", %{"visibility" => "public"}) - |> json_response(:ok) - - assert response["visibility"] == "public" - - log_entry = Repo.one(ModerationLog) - - assert ModerationLog.get_log_entry_message(log_entry) == - "@#{admin.nickname} updated status ##{id}, set visibility: 'public'" - - response = - conn - |> put("/api/pleroma/admin/statuses/#{id}", %{"visibility" => "private"}) - |> json_response(:ok) - - assert response["visibility"] == "private" - - response = - conn - |> put("/api/pleroma/admin/statuses/#{id}", %{"visibility" => "unlisted"}) - |> json_response(:ok) - - assert response["visibility"] == "unlisted" - end - - test "returns 400 when visibility is unknown", %{conn: conn, id: id} do - conn = put(conn, "/api/pleroma/admin/statuses/#{id}", %{"visibility" => "test"}) - - assert json_response(conn, :bad_request) == "Unsupported visibility" - end - end - - describe "DELETE /api/pleroma/admin/statuses/:id" do - setup do - activity = insert(:note_activity) - - %{id: activity.id} - end - - test "deletes status", %{conn: conn, id: id, admin: admin} do - conn - |> delete("/api/pleroma/admin/statuses/#{id}") - |> json_response(:ok) - - refute Activity.get_by_id(id) - - log_entry = Repo.one(ModerationLog) - - assert ModerationLog.get_log_entry_message(log_entry) == - "@#{admin.nickname} deleted status ##{id}" - end - - test "returns 404 when the status does not exist", %{conn: conn} do - conn = delete(conn, "/api/pleroma/admin/statuses/test") - - assert json_response(conn, :not_found) == "Not found" - end - end - describe "GET /api/pleroma/admin/config" do setup do: clear_config(:configurable_from_database, true) @@ -1886,7 +1712,9 @@ test "when configuration from database is off", %{conn: conn} do conn = get(conn, "/api/pleroma/admin/config") assert json_response(conn, 400) == - "To use this endpoint you need to enable configuration from database." + %{ + "error" => "To use this endpoint you need to enable configuration from database." + } end test "with settings only in db", %{conn: conn} do @@ -2008,7 +1836,7 @@ test "POST /api/pleroma/admin/config error", %{conn: conn} do conn = post(conn, "/api/pleroma/admin/config", %{"configs" => []}) assert json_response(conn, 400) == - "To use this endpoint you need to enable configuration from database." + %{"error" => "To use this endpoint you need to enable configuration from database."} end describe "POST /api/pleroma/admin/config" do @@ -2278,7 +2106,7 @@ test "saving config which need pleroma reboot", %{conn: conn} do |> get("/api/pleroma/admin/config") |> json_response(200) - refute Map.has_key?(configs, "need_reboot") + assert configs["need_reboot"] == false end test "update setting which need reboot, don't change reboot flag until reboot", %{conn: conn} do @@ -2334,7 +2162,7 @@ test "update setting which need reboot, don't change reboot flag until reboot", |> get("/api/pleroma/admin/config") |> json_response(200) - refute Map.has_key?(configs, "need_reboot") + assert configs["need_reboot"] == false end test "saving config with nested merge", %{conn: conn} do @@ -2441,13 +2269,17 @@ test "saving full setting if value is in full_key_update list", %{conn: conn} do value: :erlang.term_to_binary([]) ) + Pleroma.Config.TransferTask.load_and_update_env([], false) + + assert Application.get_env(:logger, :backends) == [] + conn = post(conn, "/api/pleroma/admin/config", %{ configs: [ %{ group: config.group, key: config.key, - value: [":console", %{"tuple" => ["ExSyslogger", ":ex_syslogger"]}] + value: [":console"] } ] }) @@ -2458,8 +2290,7 @@ test "saving full setting if value is in full_key_update list", %{conn: conn} do "group" => ":logger", "key" => ":backends", "value" => [ - ":console", - %{"tuple" => ["ExSyslogger", ":ex_syslogger"]} + ":console" ], "db" => [":backends"] } @@ -2467,14 +2298,8 @@ test "saving full setting if value is in full_key_update list", %{conn: conn} do } assert Application.get_env(:logger, :backends) == [ - :console, - {ExSyslogger, :ex_syslogger} + :console ] - - capture_log(fn -> - require Logger - Logger.warn("Ooops...") - end) =~ "Ooops..." end test "saving full setting if value is not keyword", %{conn: conn} do @@ -2572,9 +2397,6 @@ test "update config setting & delete with fallback to default value", %{ end test "common config example", %{conn: conn} do - adapter = Application.get_env(:tesla, :adapter) - on_exit(fn -> Application.put_env(:tesla, :adapter, adapter) end) - conn = post(conn, "/api/pleroma/admin/config", %{ configs: [ @@ -2594,16 +2416,10 @@ test "common config example", %{conn: conn} do %{"tuple" => [":regex4", "~r/https:\/\/example.com/s"]}, %{"tuple" => [":name", "Pleroma"]} ] - }, - %{ - "group" => ":tesla", - "key" => ":adapter", - "value" => "Tesla.Adapter.Httpc" } ] }) - assert Application.get_env(:tesla, :adapter) == Tesla.Adapter.Httpc assert Config.get([Pleroma.Captcha.NotReal, :name]) == "Pleroma" assert json_response(conn, 200) == %{ @@ -2637,12 +2453,6 @@ test "common config example", %{conn: conn} do ":regex4", ":name" ] - }, - %{ - "group" => ":tesla", - "key" => ":adapter", - "value" => "Tesla.Adapter.Httpc", - "db" => [":adapter"] } ] } @@ -2955,26 +2765,25 @@ test "proxy tuple localhost", %{conn: conn} do group: ":pleroma", key: ":http", value: [ - %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "localhost", 1234]}]}, - %{"tuple" => [":send_user_agent", false]} + %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "localhost", 1234]}]} ] } ] }) - assert json_response(conn, 200) == %{ + assert %{ "configs" => [ %{ "group" => ":pleroma", "key" => ":http", - "value" => [ - %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "localhost", 1234]}]}, - %{"tuple" => [":send_user_agent", false]} - ], - "db" => [":proxy_url", ":send_user_agent"] + "value" => value, + "db" => db } ] - } + } = json_response(conn, 200) + + assert %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "localhost", 1234]}]} in value + assert ":proxy_url" in db end test "proxy tuple domain", %{conn: conn} do @@ -2985,26 +2794,25 @@ test "proxy tuple domain", %{conn: conn} do group: ":pleroma", key: ":http", value: [ - %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "domain.com", 1234]}]}, - %{"tuple" => [":send_user_agent", false]} + %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "domain.com", 1234]}]} ] } ] }) - assert json_response(conn, 200) == %{ + assert %{ "configs" => [ %{ "group" => ":pleroma", "key" => ":http", - "value" => [ - %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "domain.com", 1234]}]}, - %{"tuple" => [":send_user_agent", false]} - ], - "db" => [":proxy_url", ":send_user_agent"] + "value" => value, + "db" => db } ] - } + } = json_response(conn, 200) + + assert %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "domain.com", 1234]}]} in value + assert ":proxy_url" in db end test "proxy tuple ip", %{conn: conn} do @@ -3015,26 +2823,53 @@ test "proxy tuple ip", %{conn: conn} do group: ":pleroma", key: ":http", value: [ - %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "127.0.0.1", 1234]}]}, - %{"tuple" => [":send_user_agent", false]} + %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "127.0.0.1", 1234]}]} ] } ] }) - assert json_response(conn, 200) == %{ + assert %{ "configs" => [ %{ "group" => ":pleroma", "key" => ":http", - "value" => [ - %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "127.0.0.1", 1234]}]}, - %{"tuple" => [":send_user_agent", false]} - ], - "db" => [":proxy_url", ":send_user_agent"] + "value" => value, + "db" => db } ] - } + } = json_response(conn, 200) + + assert %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "127.0.0.1", 1234]}]} in value + assert ":proxy_url" in db + end + + @tag capture_log: true + test "doesn't set keys not in the whitelist", %{conn: conn} do + clear_config(:database_config_whitelist, [ + {:pleroma, :key1}, + {:pleroma, :key2}, + {:pleroma, Pleroma.Captcha.NotReal}, + {:not_real} + ]) + + post(conn, "/api/pleroma/admin/config", %{ + configs: [ + %{group: ":pleroma", key: ":key1", value: "value1"}, + %{group: ":pleroma", key: ":key2", value: "value2"}, + %{group: ":pleroma", key: ":key3", value: "value3"}, + %{group: ":pleroma", key: "Pleroma.Web.Endpoint.NotReal", value: "value4"}, + %{group: ":pleroma", key: "Pleroma.Captcha.NotReal", value: "value5"}, + %{group: ":not_real", key: ":anything", value: "value6"} + ] + }) + + assert Application.get_env(:pleroma, :key1) == "value1" + assert Application.get_env(:pleroma, :key2) == "value2" + assert Application.get_env(:pleroma, :key3) == nil + assert Application.get_env(:pleroma, Pleroma.Web.Endpoint.NotReal) == nil + assert Application.get_env(:pleroma, Pleroma.Captcha.NotReal) == "value5" + assert Application.get_env(:not_real, :anything) == "value6" end end @@ -3050,54 +2885,18 @@ test "pleroma restarts", %{conn: conn} do end end - describe "GET /api/pleroma/admin/statuses" do - test "returns all public and unlisted statuses", %{conn: conn, admin: admin} do - blocked = insert(:user) - user = insert(:user) - User.block(admin, blocked) + test "need_reboot flag", %{conn: conn} do + assert conn + |> get("/api/pleroma/admin/need_reboot") + |> json_response(200) == %{"need_reboot" => false} - {:ok, _} = - CommonAPI.post(user, %{"status" => "@#{admin.nickname}", "visibility" => "direct"}) + Restarter.Pleroma.need_reboot() - {:ok, _} = CommonAPI.post(user, %{"status" => ".", "visibility" => "unlisted"}) - {:ok, _} = CommonAPI.post(user, %{"status" => ".", "visibility" => "private"}) - {:ok, _} = CommonAPI.post(user, %{"status" => ".", "visibility" => "public"}) - {:ok, _} = CommonAPI.post(blocked, %{"status" => ".", "visibility" => "public"}) + assert conn + |> get("/api/pleroma/admin/need_reboot") + |> json_response(200) == %{"need_reboot" => true} - response = - conn - |> get("/api/pleroma/admin/statuses") - |> json_response(200) - - refute "private" in Enum.map(response, & &1["visibility"]) - assert length(response) == 3 - end - - test "returns only local statuses with local_only on", %{conn: conn} do - user = insert(:user) - remote_user = insert(:user, local: false, nickname: "archaeme@archae.me") - insert(:note_activity, user: user, local: true) - insert(:note_activity, user: remote_user, local: false) - - response = - conn - |> get("/api/pleroma/admin/statuses?local_only=true") - |> json_response(200) - - assert length(response) == 1 - end - - test "returns private and direct statuses with godmode on", %{conn: conn, admin: admin} do - user = insert(:user) - - {:ok, _} = - CommonAPI.post(user, %{"status" => "@#{admin.nickname}", "visibility" => "direct"}) - - {:ok, _} = CommonAPI.post(user, %{"status" => ".", "visibility" => "private"}) - {:ok, _} = CommonAPI.post(user, %{"status" => ".", "visibility" => "public"}) - conn = get(conn, "/api/pleroma/admin/statuses?godmode=true") - assert json_response(conn, 200) |> length() == 3 - end + on_exit(fn -> Restarter.Pleroma.refresh() end) end describe "GET /api/pleroma/admin/users/:nickname/statuses" do @@ -3128,11 +2927,9 @@ test "renders user's statuses with a limit", %{conn: conn, user: user} do end test "doesn't return private statuses by default", %{conn: conn, user: user} do - {:ok, _private_status} = - CommonAPI.post(user, %{"status" => "private", "visibility" => "private"}) + {:ok, _private_status} = CommonAPI.post(user, %{status: "private", visibility: "private"}) - {:ok, _public_status} = - CommonAPI.post(user, %{"status" => "public", "visibility" => "public"}) + {:ok, _public_status} = CommonAPI.post(user, %{status: "public", visibility: "public"}) conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}/statuses") @@ -3140,11 +2937,9 @@ test "doesn't return private statuses by default", %{conn: conn, user: user} do end test "returns private statuses with godmode on", %{conn: conn, user: user} do - {:ok, _private_status} = - CommonAPI.post(user, %{"status" => "private", "visibility" => "private"}) + {:ok, _private_status} = CommonAPI.post(user, %{status: "private", visibility: "private"}) - {:ok, _public_status} = - CommonAPI.post(user, %{"status" => "public", "visibility" => "public"}) + {:ok, _public_status} = CommonAPI.post(user, %{status: "public", visibility: "public"}) conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}/statuses?godmode=true") @@ -3153,8 +2948,8 @@ test "returns private statuses with godmode on", %{conn: conn, user: user} do test "excludes reblogs by default", %{conn: conn, user: user} do other_user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "."}) - {:ok, %Activity{}, _} = CommonAPI.repeat(activity.id, other_user) + {:ok, activity} = CommonAPI.post(user, %{status: "."}) + {:ok, %Activity{}} = CommonAPI.repeat(activity.id, other_user) conn_res = get(conn, "/api/pleroma/admin/users/#{other_user.nickname}/statuses") assert json_response(conn_res, 200) |> length() == 0 @@ -3374,6 +3169,102 @@ test "returns log filtered by search", %{conn: conn, moderator: moderator} do end end + describe "GET /users/:nickname/credentials" do + test "gets the user credentials", %{conn: conn} do + user = insert(:user) + conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}/credentials") + + response = assert json_response(conn, 200) + assert response["email"] == user.email + end + + test "returns 403 if requested by a non-admin" do + user = insert(:user) + + conn = + build_conn() + |> assign(:user, user) + |> get("/api/pleroma/admin/users/#{user.nickname}/credentials") + + assert json_response(conn, :forbidden) + end + end + + describe "PATCH /users/:nickname/credentials" do + setup do + user = insert(:user) + [user: user] + end + + test "changes password and email", %{conn: conn, admin: admin, user: user} do + assert user.password_reset_pending == false + + conn = + patch(conn, "/api/pleroma/admin/users/#{user.nickname}/credentials", %{ + "password" => "new_password", + "email" => "new_email@example.com", + "name" => "new_name" + }) + + assert json_response(conn, 200) == %{"status" => "success"} + + ObanHelpers.perform_all() + + updated_user = User.get_by_id(user.id) + + assert updated_user.email == "new_email@example.com" + assert updated_user.name == "new_name" + assert updated_user.password_hash != user.password_hash + assert updated_user.password_reset_pending == true + + [log_entry2, log_entry1] = ModerationLog |> Repo.all() |> Enum.sort() + + assert ModerationLog.get_log_entry_message(log_entry1) == + "@#{admin.nickname} updated users: @#{user.nickname}" + + assert ModerationLog.get_log_entry_message(log_entry2) == + "@#{admin.nickname} forced password reset for users: @#{user.nickname}" + end + + test "returns 403 if requested by a non-admin", %{user: user} do + conn = + build_conn() + |> assign(:user, user) + |> patch("/api/pleroma/admin/users/#{user.nickname}/credentials", %{ + "password" => "new_password", + "email" => "new_email@example.com", + "name" => "new_name" + }) + + assert json_response(conn, :forbidden) + end + + test "changes actor type from permitted list", %{conn: conn, user: user} do + assert user.actor_type == "Person" + + assert patch(conn, "/api/pleroma/admin/users/#{user.nickname}/credentials", %{ + "actor_type" => "Service" + }) + |> json_response(200) == %{"status" => "success"} + + updated_user = User.get_by_id(user.id) + + assert updated_user.actor_type == "Service" + + assert patch(conn, "/api/pleroma/admin/users/#{user.nickname}/credentials", %{ + "actor_type" => "Application" + }) + |> json_response(200) == %{"errors" => %{"actor_type" => "is invalid"}} + end + + test "update non existing user", %{conn: conn} do + assert patch(conn, "/api/pleroma/admin/users/non-existing/credentials", %{ + "password" => "new_password" + }) + |> json_response(200) == %{"error" => "Unable to update user."} + end + end + describe "PATCH /users/:nickname/force_password_reset" do test "sets password_reset_pending to true", %{conn: conn} do user = insert(:user) @@ -3537,9 +3428,9 @@ test "it resend emails for two users", %{conn: conn, admin: admin} do {:ok, %{id: report_id}} = CommonAPI.report(reporter, %{ - "account_id" => target_user.id, - "comment" => "I feel offended", - "status_ids" => [activity.id] + account_id: target_user.id, + comment: "I feel offended", + status_ids: [activity.id] }) post(conn, "/api/pleroma/admin/reports/#{report_id}/notes", %{ @@ -3590,28 +3481,63 @@ test "it deletes the note", %{conn: conn, report_id: report_id} do end end - test "GET /api/pleroma/admin/config/descriptions", %{conn: conn} do - admin = insert(:user, is_admin: true) + describe "GET /api/pleroma/admin/config/descriptions" do + test "structure", %{conn: conn} do + admin = insert(:user, is_admin: true) - conn = - assign(conn, :user, admin) - |> get("/api/pleroma/admin/config/descriptions") + conn = + assign(conn, :user, admin) + |> get("/api/pleroma/admin/config/descriptions") - assert [child | _others] = json_response(conn, 200) + assert [child | _others] = json_response(conn, 200) - assert child["children"] - assert child["key"] - assert String.starts_with?(child["group"], ":") - assert child["description"] + assert child["children"] + assert child["key"] + assert String.starts_with?(child["group"], ":") + assert child["description"] + end + + test "filters by database configuration whitelist", %{conn: conn} do + clear_config(:database_config_whitelist, [ + {:pleroma, :instance}, + {:pleroma, :activitypub}, + {:pleroma, Pleroma.Upload}, + {:esshd} + ]) + + admin = insert(:user, is_admin: true) + + conn = + assign(conn, :user, admin) + |> get("/api/pleroma/admin/config/descriptions") + + children = json_response(conn, 200) + + assert length(children) == 4 + + assert Enum.count(children, fn c -> c["group"] == ":pleroma" end) == 3 + + instance = Enum.find(children, fn c -> c["key"] == ":instance" end) + assert instance["children"] + + activitypub = Enum.find(children, fn c -> c["key"] == ":activitypub" end) + assert activitypub["children"] + + web_endpoint = Enum.find(children, fn c -> c["key"] == "Pleroma.Upload" end) + assert web_endpoint["children"] + + esshd = Enum.find(children, fn c -> c["group"] == ":esshd" end) + assert esshd["children"] + end end describe "/api/pleroma/admin/stats" do test "status visibility count", %{conn: conn} do admin = insert(:user, is_admin: true) user = insert(:user) - CommonAPI.post(user, %{"visibility" => "public", "status" => "hey"}) - CommonAPI.post(user, %{"visibility" => "unlisted", "status" => "hey"}) - CommonAPI.post(user, %{"visibility" => "unlisted", "status" => "hey"}) + CommonAPI.post(user, %{visibility: "public", status: "hey"}) + CommonAPI.post(user, %{visibility: "unlisted", status: "hey"}) + CommonAPI.post(user, %{visibility: "unlisted", status: "hey"}) response = conn @@ -3623,6 +3549,191 @@ test "status visibility count", %{conn: conn} do response["status_visibility"] end end + + describe "POST /api/pleroma/admin/oauth_app" do + test "errors", %{conn: conn} do + response = conn |> post("/api/pleroma/admin/oauth_app", %{}) |> json_response(200) + + assert response == %{"name" => "can't be blank", "redirect_uris" => "can't be blank"} + end + + test "success", %{conn: conn} do + base_url = Web.base_url() + app_name = "Trusted app" + + response = + conn + |> post("/api/pleroma/admin/oauth_app", %{ + name: app_name, + redirect_uris: base_url + }) + |> json_response(200) + + assert %{ + "client_id" => _, + "client_secret" => _, + "name" => ^app_name, + "redirect_uri" => ^base_url, + "trusted" => false + } = response + end + + test "with trusted", %{conn: conn} do + base_url = Web.base_url() + app_name = "Trusted app" + + response = + conn + |> post("/api/pleroma/admin/oauth_app", %{ + name: app_name, + redirect_uris: base_url, + trusted: true + }) + |> json_response(200) + + assert %{ + "client_id" => _, + "client_secret" => _, + "name" => ^app_name, + "redirect_uri" => ^base_url, + "trusted" => true + } = response + end + end + + describe "GET /api/pleroma/admin/oauth_app" do + setup do + app = insert(:oauth_app) + {:ok, app: app} + end + + test "list", %{conn: conn} do + response = + conn + |> get("/api/pleroma/admin/oauth_app") + |> json_response(200) + + assert %{"apps" => apps, "count" => count, "page_size" => _} = response + + assert length(apps) == count + end + + test "with page size", %{conn: conn} do + insert(:oauth_app) + page_size = 1 + + response = + conn + |> get("/api/pleroma/admin/oauth_app", %{page_size: to_string(page_size)}) + |> json_response(200) + + assert %{"apps" => apps, "count" => _, "page_size" => ^page_size} = response + + assert length(apps) == page_size + end + + test "search by client name", %{conn: conn, app: app} do + response = + conn + |> get("/api/pleroma/admin/oauth_app", %{name: app.client_name}) + |> json_response(200) + + assert %{"apps" => [returned], "count" => _, "page_size" => _} = response + + assert returned["client_id"] == app.client_id + assert returned["name"] == app.client_name + end + + test "search by client id", %{conn: conn, app: app} do + response = + conn + |> get("/api/pleroma/admin/oauth_app", %{client_id: app.client_id}) + |> json_response(200) + + assert %{"apps" => [returned], "count" => _, "page_size" => _} = response + + assert returned["client_id"] == app.client_id + assert returned["name"] == app.client_name + end + + test "only trusted", %{conn: conn} do + app = insert(:oauth_app, trusted: true) + + response = + conn + |> get("/api/pleroma/admin/oauth_app", %{trusted: true}) + |> json_response(200) + + assert %{"apps" => [returned], "count" => _, "page_size" => _} = response + + assert returned["client_id"] == app.client_id + assert returned["name"] == app.client_name + end + end + + describe "DELETE /api/pleroma/admin/oauth_app/:id" do + test "with id", %{conn: conn} do + app = insert(:oauth_app) + + response = + conn + |> delete("/api/pleroma/admin/oauth_app/" <> to_string(app.id)) + |> json_response(:no_content) + + assert response == "" + end + + test "with non existance id", %{conn: conn} do + response = + conn + |> delete("/api/pleroma/admin/oauth_app/0") + |> json_response(:bad_request) + + assert response == "" + end + end + + describe "PATCH /api/pleroma/admin/oauth_app/:id" do + test "with id", %{conn: conn} do + app = insert(:oauth_app) + + name = "another name" + url = "https://example.com" + scopes = ["admin"] + id = app.id + website = "http://website.com" + + response = + conn + |> patch("/api/pleroma/admin/oauth_app/" <> to_string(app.id), %{ + name: name, + trusted: true, + redirect_uris: url, + scopes: scopes, + website: website + }) + |> json_response(200) + + assert %{ + "client_id" => _, + "client_secret" => _, + "id" => ^id, + "name" => ^name, + "redirect_uri" => ^url, + "trusted" => true, + "website" => ^website + } = response + end + + test "without id", %{conn: conn} do + response = + conn + |> patch("/api/pleroma/admin/oauth_app/0") + |> json_response(:bad_request) + + assert response == "" + end + end end # Needed for testing diff --git a/test/web/admin_api/controllers/status_controller_test.exs b/test/web/admin_api/controllers/status_controller_test.exs new file mode 100644 index 000000000..124d8dc2e --- /dev/null +++ b/test/web/admin_api/controllers/status_controller_test.exs @@ -0,0 +1,194 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.StatusControllerTest do + use Pleroma.Web.ConnCase + + import Pleroma.Factory + + alias Pleroma.Activity + alias Pleroma.Config + alias Pleroma.ModerationLog + alias Pleroma.Repo + alias Pleroma.User + alias Pleroma.Web.CommonAPI + + 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/statuses/:id" do + test "not found", %{conn: conn} do + assert conn + |> get("/api/pleroma/admin/statuses/not_found") + |> json_response_and_validate_schema(:not_found) + end + + test "shows activity", %{conn: conn} do + activity = insert(:note_activity) + + response = + conn + |> get("/api/pleroma/admin/statuses/#{activity.id}") + |> json_response_and_validate_schema(200) + + assert response["id"] == activity.id + end + end + + describe "PUT /api/pleroma/admin/statuses/:id" do + setup do + activity = insert(:note_activity) + + %{id: activity.id} + end + + test "toggle sensitive flag", %{conn: conn, id: id, admin: admin} do + response = + conn + |> put_req_header("content-type", "application/json") + |> put("/api/pleroma/admin/statuses/#{id}", %{"sensitive" => "true"}) + |> json_response_and_validate_schema(:ok) + + assert response["sensitive"] + + log_entry = Repo.one(ModerationLog) + + assert ModerationLog.get_log_entry_message(log_entry) == + "@#{admin.nickname} updated status ##{id}, set sensitive: 'true'" + + response = + conn + |> put_req_header("content-type", "application/json") + |> put("/api/pleroma/admin/statuses/#{id}", %{"sensitive" => "false"}) + |> json_response_and_validate_schema(:ok) + + refute response["sensitive"] + end + + test "change visibility flag", %{conn: conn, id: id, admin: admin} do + response = + conn + |> put_req_header("content-type", "application/json") + |> put("/api/pleroma/admin/statuses/#{id}", %{visibility: "public"}) + |> json_response_and_validate_schema(:ok) + + assert response["visibility"] == "public" + + log_entry = Repo.one(ModerationLog) + + assert ModerationLog.get_log_entry_message(log_entry) == + "@#{admin.nickname} updated status ##{id}, set visibility: 'public'" + + response = + conn + |> put_req_header("content-type", "application/json") + |> put("/api/pleroma/admin/statuses/#{id}", %{visibility: "private"}) + |> json_response_and_validate_schema(:ok) + + assert response["visibility"] == "private" + + response = + conn + |> put_req_header("content-type", "application/json") + |> put("/api/pleroma/admin/statuses/#{id}", %{visibility: "unlisted"}) + |> json_response_and_validate_schema(:ok) + + assert response["visibility"] == "unlisted" + end + + test "returns 400 when visibility is unknown", %{conn: conn, id: id} do + conn = + conn + |> put_req_header("content-type", "application/json") + |> put("/api/pleroma/admin/statuses/#{id}", %{visibility: "test"}) + + assert %{"error" => "test - Invalid value for enum."} = + json_response_and_validate_schema(conn, :bad_request) + end + end + + describe "DELETE /api/pleroma/admin/statuses/:id" do + setup do + activity = insert(:note_activity) + + %{id: activity.id} + end + + test "deletes status", %{conn: conn, id: id, admin: admin} do + conn + |> delete("/api/pleroma/admin/statuses/#{id}") + |> json_response_and_validate_schema(:ok) + + refute Activity.get_by_id(id) + + log_entry = Repo.one(ModerationLog) + + assert ModerationLog.get_log_entry_message(log_entry) == + "@#{admin.nickname} deleted status ##{id}" + end + + test "returns 404 when the status does not exist", %{conn: conn} do + conn = delete(conn, "/api/pleroma/admin/statuses/test") + + assert json_response_and_validate_schema(conn, :not_found) == %{"error" => "Not found"} + end + end + + describe "GET /api/pleroma/admin/statuses" do + test "returns all public and unlisted statuses", %{conn: conn, admin: admin} do + blocked = insert(:user) + user = insert(:user) + User.block(admin, blocked) + + {:ok, _} = CommonAPI.post(user, %{status: "@#{admin.nickname}", visibility: "direct"}) + + {:ok, _} = CommonAPI.post(user, %{status: ".", visibility: "unlisted"}) + {:ok, _} = CommonAPI.post(user, %{status: ".", visibility: "private"}) + {:ok, _} = CommonAPI.post(user, %{status: ".", visibility: "public"}) + {:ok, _} = CommonAPI.post(blocked, %{status: ".", visibility: "public"}) + + response = + conn + |> get("/api/pleroma/admin/statuses") + |> json_response_and_validate_schema(200) + + refute "private" in Enum.map(response, & &1["visibility"]) + assert length(response) == 3 + end + + test "returns only local statuses with local_only on", %{conn: conn} do + user = insert(:user) + remote_user = insert(:user, local: false, nickname: "archaeme@archae.me") + insert(:note_activity, user: user, local: true) + insert(:note_activity, user: remote_user, local: false) + + response = + conn + |> get("/api/pleroma/admin/statuses?local_only=true") + |> json_response_and_validate_schema(200) + + assert length(response) == 1 + end + + test "returns private and direct statuses with godmode on", %{conn: conn, admin: admin} do + user = insert(:user) + + {:ok, _} = CommonAPI.post(user, %{status: "@#{admin.nickname}", visibility: "direct"}) + + {:ok, _} = CommonAPI.post(user, %{status: ".", visibility: "private"}) + {:ok, _} = CommonAPI.post(user, %{status: ".", visibility: "public"}) + conn = get(conn, "/api/pleroma/admin/statuses?godmode=true") + assert json_response_and_validate_schema(conn, 200) |> length() == 3 + end + end +end diff --git a/test/web/admin_api/views/report_view_test.exs b/test/web/admin_api/views/report_view_test.exs index 5db6629f2..f00b0afb2 100644 --- a/test/web/admin_api/views/report_view_test.exs +++ b/test/web/admin_api/views/report_view_test.exs @@ -15,7 +15,7 @@ test "renders a report" do user = insert(:user) other_user = insert(:user) - {:ok, activity} = CommonAPI.report(user, %{"account_id" => other_user.id}) + {:ok, activity} = CommonAPI.report(user, %{account_id: other_user.id}) expected = %{ content: nil, @@ -45,10 +45,10 @@ test "renders a report" do test "includes reported statuses" do user = insert(:user) other_user = insert(:user) - {:ok, activity} = CommonAPI.post(other_user, %{"status" => "toot"}) + {:ok, activity} = CommonAPI.post(other_user, %{status: "toot"}) {:ok, report_activity} = - CommonAPI.report(user, %{"account_id" => other_user.id, "status_ids" => [activity.id]}) + CommonAPI.report(user, %{account_id: other_user.id, status_ids: [activity.id]}) other_user = Pleroma.User.get_by_id(other_user.id) @@ -81,7 +81,7 @@ test "renders report's state" do user = insert(:user) other_user = insert(:user) - {:ok, activity} = CommonAPI.report(user, %{"account_id" => other_user.id}) + {:ok, activity} = CommonAPI.report(user, %{account_id: other_user.id}) {:ok, activity} = CommonAPI.update_report_state(activity.id, "closed") assert %{state: "closed"} = @@ -94,8 +94,8 @@ test "renders report description" do {:ok, activity} = CommonAPI.report(user, %{ - "account_id" => other_user.id, - "comment" => "posts are too good for this instance" + account_id: other_user.id, + comment: "posts are too good for this instance" }) assert %{content: "posts are too good for this instance"} = @@ -108,8 +108,8 @@ test "sanitizes report description" do {:ok, activity} = CommonAPI.report(user, %{ - "account_id" => other_user.id, - "comment" => "" + account_id: other_user.id, + comment: "" }) data = Map.put(activity.data, "content", "") @@ -125,8 +125,8 @@ test "doesn't error out when the user doesn't exists" do {:ok, activity} = CommonAPI.report(user, %{ - "account_id" => other_user.id, - "comment" => "" + account_id: other_user.id, + comment: "" }) Pleroma.User.delete(other_user) diff --git a/test/web/api_spec/schema_examples_test.exs b/test/web/api_spec/schema_examples_test.exs new file mode 100644 index 000000000..f00e834fc --- /dev/null +++ b/test/web/api_spec/schema_examples_test.exs @@ -0,0 +1,43 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.SchemaExamplesTest do + use ExUnit.Case, async: true + import Pleroma.Tests.ApiSpecHelpers + + @content_type "application/json" + + for operation <- api_operations() do + describe operation.operationId <> " Request Body" do + if operation.requestBody do + @media_type operation.requestBody.content[@content_type] + @schema resolve_schema(@media_type.schema) + + if @media_type.example do + test "request body media type example matches schema" do + assert_schema(@media_type.example, @schema) + end + end + + if @schema.example do + test "request body schema example matches schema" do + assert_schema(@schema.example, @schema) + end + end + end + end + + for {status, response} <- operation.responses, is_map(response.content[@content_type]) do + describe "#{operation.operationId} - #{status} Response" do + @schema resolve_schema(response.content[@content_type].schema) + + if @schema.example do + test "example matches schema" do + assert_schema(@schema.example, @schema) + end + end + end + end + end +end diff --git a/test/web/auth/auth_test_controller_test.exs b/test/web/auth/auth_test_controller_test.exs new file mode 100644 index 000000000..fed52b7f3 --- /dev/null +++ b/test/web/auth/auth_test_controller_test.exs @@ -0,0 +1,242 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Tests.AuthTestControllerTest do + use Pleroma.Web.ConnCase + + import Pleroma.Factory + + describe "do_oauth_check" do + test "serves with proper OAuth token (fulfilling requested scopes)" do + %{conn: good_token_conn, user: user} = oauth_access(["read"]) + + assert %{"user_id" => user.id} == + good_token_conn + |> get("/test/authenticated_api/do_oauth_check") + |> json_response(200) + + # Unintended usage (:api) — use with :authenticated_api instead + assert %{"user_id" => user.id} == + good_token_conn + |> get("/test/api/do_oauth_check") + |> json_response(200) + end + + test "fails on no token / missing scope(s)" do + %{conn: bad_token_conn} = oauth_access(["irrelevant_scope"]) + + bad_token_conn + |> get("/test/authenticated_api/do_oauth_check") + |> json_response(403) + + bad_token_conn + |> assign(:token, nil) + |> get("/test/api/do_oauth_check") + |> json_response(403) + end + end + + describe "fallback_oauth_check" do + test "serves with proper OAuth token (fulfilling requested scopes)" do + %{conn: good_token_conn, user: user} = oauth_access(["read"]) + + assert %{"user_id" => user.id} == + good_token_conn + |> get("/test/api/fallback_oauth_check") + |> json_response(200) + + # Unintended usage (:authenticated_api) — use with :api instead + assert %{"user_id" => user.id} == + good_token_conn + |> get("/test/authenticated_api/fallback_oauth_check") + |> json_response(200) + end + + test "for :api on public instance, drops :user and renders on no token / missing scope(s)" do + clear_config([:instance, :public], true) + + %{conn: bad_token_conn} = oauth_access(["irrelevant_scope"]) + + assert %{"user_id" => nil} == + bad_token_conn + |> get("/test/api/fallback_oauth_check") + |> json_response(200) + + assert %{"user_id" => nil} == + bad_token_conn + |> assign(:token, nil) + |> get("/test/api/fallback_oauth_check") + |> json_response(200) + end + + test "for :api on private instance, fails on no token / missing scope(s)" do + clear_config([:instance, :public], false) + + %{conn: bad_token_conn} = oauth_access(["irrelevant_scope"]) + + bad_token_conn + |> get("/test/api/fallback_oauth_check") + |> json_response(403) + + bad_token_conn + |> assign(:token, nil) + |> get("/test/api/fallback_oauth_check") + |> json_response(403) + end + end + + describe "skip_oauth_check" do + test "for :authenticated_api, serves if :user is set (regardless of token / token scopes)" do + user = insert(:user) + + assert %{"user_id" => user.id} == + build_conn() + |> assign(:user, user) + |> get("/test/authenticated_api/skip_oauth_check") + |> json_response(200) + + %{conn: bad_token_conn, user: user} = oauth_access(["irrelevant_scope"]) + + assert %{"user_id" => user.id} == + bad_token_conn + |> get("/test/authenticated_api/skip_oauth_check") + |> json_response(200) + end + + test "serves via :api on public instance if :user is not set" do + clear_config([:instance, :public], true) + + assert %{"user_id" => nil} == + build_conn() + |> get("/test/api/skip_oauth_check") + |> json_response(200) + + build_conn() + |> get("/test/authenticated_api/skip_oauth_check") + |> json_response(403) + end + + test "fails on private instance if :user is not set" do + clear_config([:instance, :public], false) + + build_conn() + |> get("/test/api/skip_oauth_check") + |> json_response(403) + + build_conn() + |> get("/test/authenticated_api/skip_oauth_check") + |> json_response(403) + end + end + + describe "fallback_oauth_skip_publicity_check" do + test "serves with proper OAuth token (fulfilling requested scopes)" do + %{conn: good_token_conn, user: user} = oauth_access(["read"]) + + assert %{"user_id" => user.id} == + good_token_conn + |> get("/test/api/fallback_oauth_skip_publicity_check") + |> json_response(200) + + # Unintended usage (:authenticated_api) + assert %{"user_id" => user.id} == + good_token_conn + |> get("/test/authenticated_api/fallback_oauth_skip_publicity_check") + |> json_response(200) + end + + test "for :api on private / public instance, drops :user and renders on token issue" do + %{conn: bad_token_conn} = oauth_access(["irrelevant_scope"]) + + for is_public <- [true, false] do + clear_config([:instance, :public], is_public) + + assert %{"user_id" => nil} == + bad_token_conn + |> get("/test/api/fallback_oauth_skip_publicity_check") + |> json_response(200) + + assert %{"user_id" => nil} == + bad_token_conn + |> assign(:token, nil) + |> get("/test/api/fallback_oauth_skip_publicity_check") + |> json_response(200) + end + end + end + + describe "skip_oauth_skip_publicity_check" do + test "for :authenticated_api, serves if :user is set (regardless of token / token scopes)" do + user = insert(:user) + + assert %{"user_id" => user.id} == + build_conn() + |> assign(:user, user) + |> get("/test/authenticated_api/skip_oauth_skip_publicity_check") + |> json_response(200) + + %{conn: bad_token_conn, user: user} = oauth_access(["irrelevant_scope"]) + + assert %{"user_id" => user.id} == + bad_token_conn + |> get("/test/authenticated_api/skip_oauth_skip_publicity_check") + |> json_response(200) + end + + test "for :api, serves on private and public instances regardless of whether :user is set" do + user = insert(:user) + + for is_public <- [true, false] do + clear_config([:instance, :public], is_public) + + assert %{"user_id" => nil} == + build_conn() + |> get("/test/api/skip_oauth_skip_publicity_check") + |> json_response(200) + + assert %{"user_id" => user.id} == + build_conn() + |> assign(:user, user) + |> get("/test/api/skip_oauth_skip_publicity_check") + |> json_response(200) + end + end + end + + describe "missing_oauth_check_definition" do + def test_missing_oauth_check_definition_failure(endpoint, expected_error) do + %{conn: conn} = oauth_access(["read", "write", "follow", "push", "admin"]) + + assert %{"error" => expected_error} == + conn + |> get(endpoint) + |> json_response(403) + end + + test "fails if served via :authenticated_api" do + test_missing_oauth_check_definition_failure( + "/test/authenticated_api/missing_oauth_check_definition", + "Security violation: OAuth scopes check was neither handled nor explicitly skipped." + ) + end + + test "fails if served via :api and the instance is private" do + clear_config([:instance, :public], false) + + test_missing_oauth_check_definition_failure( + "/test/api/missing_oauth_check_definition", + "This resource requires authentication." + ) + end + + test "succeeds with dropped :user if served via :api on public instance" do + %{conn: conn} = oauth_access(["read", "write", "follow", "push", "admin"]) + + assert %{"user_id" => nil} == + conn + |> get("/test/api/missing_oauth_check_definition") + |> json_response(200) + end + end +end diff --git a/test/web/auth/basic_auth_test.exs b/test/web/auth/basic_auth_test.exs new file mode 100644 index 000000000..bf6e3d2fc --- /dev/null +++ b/test/web/auth/basic_auth_test.exs @@ -0,0 +1,46 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.Auth.BasicAuthTest do + use Pleroma.Web.ConnCase + + import Pleroma.Factory + + test "with HTTP Basic Auth used, grants access to OAuth scope-restricted endpoints", %{ + conn: conn + } do + user = insert(:user) + assert Pbkdf2.verify_pass("test", user.password_hash) + + basic_auth_contents = + (URI.encode_www_form(user.nickname) <> ":" <> URI.encode_www_form("test")) + |> Base.encode64() + + # Succeeds with HTTP Basic Auth + response = + conn + |> put_req_header("authorization", "Basic " <> basic_auth_contents) + |> get("/api/v1/accounts/verify_credentials") + |> json_response(200) + + user_nickname = user.nickname + assert %{"username" => ^user_nickname} = response + + # Succeeds with a properly scoped OAuth token + valid_token = insert(:oauth_token, scopes: ["read:accounts"]) + + conn + |> put_req_header("authorization", "Bearer #{valid_token.token}") + |> get("/api/v1/accounts/verify_credentials") + |> json_response(200) + + # Fails with a wrong-scoped OAuth token (proof of restriction) + invalid_token = insert(:oauth_token, scopes: ["read:something"]) + + conn + |> put_req_header("authorization", "Bearer #{invalid_token.token}") + |> get("/api/v1/accounts/verify_credentials") + |> json_response(403) + end +end diff --git a/test/web/auth/pleroma_authenticator_test.exs b/test/web/auth/pleroma_authenticator_test.exs new file mode 100644 index 000000000..1ba0dfecc --- /dev/null +++ b/test/web/auth/pleroma_authenticator_test.exs @@ -0,0 +1,48 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.Auth.PleromaAuthenticatorTest do + use Pleroma.Web.ConnCase + + alias Pleroma.Web.Auth.PleromaAuthenticator + import Pleroma.Factory + + setup do + password = "testpassword" + name = "AgentSmith" + user = insert(:user, nickname: name, password_hash: Pbkdf2.hash_pwd_salt(password)) + {:ok, [user: user, name: name, password: password]} + end + + test "get_user/authorization", %{name: name, password: password} do + name = name <> "1" + user = insert(:user, nickname: name, password_hash: Bcrypt.hash_pwd_salt(password)) + + params = %{"authorization" => %{"name" => name, "password" => password}} + res = PleromaAuthenticator.get_user(%Plug.Conn{params: params}) + + assert {:ok, returned_user} = res + assert returned_user.id == user.id + assert "$pbkdf2" <> _ = returned_user.password_hash + end + + test "get_user/authorization with invalid password", %{name: name} do + params = %{"authorization" => %{"name" => name, "password" => "password"}} + res = PleromaAuthenticator.get_user(%Plug.Conn{params: params}) + + assert {:error, {:checkpw, false}} == res + end + + test "get_user/grant_type_password", %{user: user, name: name, password: password} do + params = %{"grant_type" => "password", "username" => name, "password" => password} + res = PleromaAuthenticator.get_user(%Plug.Conn{params: params}) + + assert {:ok, user} == res + end + + test "error credintails" do + res = PleromaAuthenticator.get_user(%Plug.Conn{params: %{}}) + assert {:error, :invalid_credentials} == res + end +end diff --git a/test/web/auth/totp_authenticator_test.exs b/test/web/auth/totp_authenticator_test.exs new file mode 100644 index 000000000..84d4cd840 --- /dev/null +++ b/test/web/auth/totp_authenticator_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.Web.Auth.TOTPAuthenticatorTest do + use Pleroma.Web.ConnCase + + alias Pleroma.MFA + alias Pleroma.MFA.BackupCodes + alias Pleroma.MFA.TOTP + alias Pleroma.Web.Auth.TOTPAuthenticator + + import Pleroma.Factory + + test "verify token" do + otp_secret = TOTP.generate_secret() + otp_token = TOTP.generate_token(otp_secret) + + user = + insert(:user, + multi_factor_authentication_settings: %MFA.Settings{ + enabled: true, + totp: %MFA.Settings.TOTP{secret: otp_secret, confirmed: true} + } + ) + + assert TOTPAuthenticator.verify(otp_token, user) == {:ok, :pass} + assert TOTPAuthenticator.verify(nil, user) == {:error, :invalid_token} + assert TOTPAuthenticator.verify("", user) == {:error, :invalid_token} + end + + test "checks backup codes" do + [code | _] = backup_codes = BackupCodes.generate() + + hashed_codes = + backup_codes + |> Enum.map(&Pbkdf2.hash_pwd_salt(&1)) + + user = + insert(:user, + multi_factor_authentication_settings: %MFA.Settings{ + enabled: true, + backup_codes: hashed_codes, + totp: %MFA.Settings.TOTP{secret: "otp_secret", confirmed: true} + } + ) + + assert TOTPAuthenticator.verify_recovery_code(user, code) == {:ok, :pass} + refute TOTPAuthenticator.verify_recovery_code(code, refresh_record(user)) == {:ok, :pass} + end +end diff --git a/test/web/common_api/common_api_test.exs b/test/web/common_api/common_api_test.exs index 0da0bd2e2..2291f76dd 100644 --- a/test/web/common_api/common_api_test.exs +++ b/test/web/common_api/common_api_test.exs @@ -9,11 +9,13 @@ defmodule Pleroma.Web.CommonAPITest do alias Pleroma.Object alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub + alias Pleroma.Web.ActivityPub.Transmogrifier alias Pleroma.Web.ActivityPub.Visibility alias Pleroma.Web.AdminAPI.AccountView alias Pleroma.Web.CommonAPI import Pleroma.Factory + import Mock require Pleroma.Constants @@ -21,14 +23,180 @@ defmodule Pleroma.Web.CommonAPITest do setup do: clear_config([:instance, :limit]) setup do: clear_config([:instance, :max_pinned_statuses]) + describe "unblocking" do + test "it works even without an existing block activity" do + blocked = insert(:user) + blocker = insert(:user) + User.block(blocker, blocked) + + assert User.blocks?(blocker, blocked) + assert {:ok, :no_activity} == CommonAPI.unblock(blocker, blocked) + refute User.blocks?(blocker, blocked) + end + end + + describe "deletion" do + test "it works with pruned objects" do + user = insert(:user) + + {:ok, post} = CommonAPI.post(user, %{status: "namu amida butsu"}) + + clear_config([:instance, :federating], true) + + Object.normalize(post, false) + |> Object.prune() + + with_mock Pleroma.Web.Federator, + publish: fn _ -> nil end do + assert {:ok, delete} = CommonAPI.delete(post.id, user) + assert delete.local + assert called(Pleroma.Web.Federator.publish(delete)) + end + + refute Activity.get_by_id(post.id) + end + + test "it allows users to delete their posts" do + user = insert(:user) + + {:ok, post} = CommonAPI.post(user, %{status: "namu amida butsu"}) + + clear_config([:instance, :federating], true) + + with_mock Pleroma.Web.Federator, + publish: fn _ -> nil end do + assert {:ok, delete} = CommonAPI.delete(post.id, user) + assert delete.local + assert called(Pleroma.Web.Federator.publish(delete)) + end + + refute Activity.get_by_id(post.id) + end + + test "it does not allow a user to delete their posts" do + user = insert(:user) + other_user = insert(:user) + + {:ok, post} = CommonAPI.post(user, %{status: "namu amida butsu"}) + + assert {:error, "Could not delete"} = CommonAPI.delete(post.id, other_user) + assert Activity.get_by_id(post.id) + end + + test "it allows moderators to delete other user's posts" do + user = insert(:user) + moderator = insert(:user, is_moderator: true) + + {:ok, post} = CommonAPI.post(user, %{status: "namu amida butsu"}) + + assert {:ok, delete} = CommonAPI.delete(post.id, moderator) + assert delete.local + + refute Activity.get_by_id(post.id) + end + + test "it allows admins to delete other user's posts" do + user = insert(:user) + moderator = insert(:user, is_admin: true) + + {:ok, post} = CommonAPI.post(user, %{status: "namu amida butsu"}) + + assert {:ok, delete} = CommonAPI.delete(post.id, moderator) + assert delete.local + + refute Activity.get_by_id(post.id) + end + + test "superusers deleting non-local posts won't federate the delete" do + # This is the user of the ingested activity + _user = + insert(:user, + local: false, + ap_id: "http://mastodon.example.org/users/admin", + last_refreshed_at: NaiveDateTime.utc_now() + ) + + moderator = insert(:user, is_admin: true) + + data = + File.read!("test/fixtures/mastodon-post-activity.json") + |> Jason.decode!() + + {:ok, post} = Transmogrifier.handle_incoming(data) + + with_mock Pleroma.Web.Federator, + publish: fn _ -> nil end do + assert {:ok, delete} = CommonAPI.delete(post.id, moderator) + assert delete.local + refute called(Pleroma.Web.Federator.publish(:_)) + end + + refute Activity.get_by_id(post.id) + end + end + + test "favoriting race condition" do + user = insert(:user) + users_serial = insert_list(10, :user) + users = insert_list(10, :user) + + {:ok, activity} = CommonAPI.post(user, %{status: "."}) + + users_serial + |> Enum.map(fn user -> + CommonAPI.favorite(user, activity.id) + end) + + object = Object.get_by_ap_id(activity.data["object"]) + assert object.data["like_count"] == 10 + + users + |> Enum.map(fn user -> + Task.async(fn -> + CommonAPI.favorite(user, activity.id) + end) + end) + |> Enum.map(&Task.await/1) + + object = Object.get_by_ap_id(activity.data["object"]) + assert object.data["like_count"] == 20 + end + + test "repeating race condition" do + user = insert(:user) + users_serial = insert_list(10, :user) + users = insert_list(10, :user) + + {:ok, activity} = CommonAPI.post(user, %{status: "."}) + + users_serial + |> Enum.map(fn user -> + CommonAPI.repeat(activity.id, user) + end) + + object = Object.get_by_ap_id(activity.data["object"]) + assert object.data["announcement_count"] == 10 + + users + |> Enum.map(fn user -> + Task.async(fn -> + CommonAPI.repeat(activity.id, user) + end) + end) + |> Enum.map(&Task.await/1) + + object = Object.get_by_ap_id(activity.data["object"]) + assert object.data["announcement_count"] == 20 + end + test "when replying to a conversation / participation, it will set the correct context id even if no explicit reply_to is given" do user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => ".", "visibility" => "direct"}) + {:ok, activity} = CommonAPI.post(user, %{status: ".", visibility: "direct"}) [participation] = Participation.for_user(user) {:ok, convo_reply} = - CommonAPI.post(user, %{"status" => ".", "in_reply_to_conversation_id" => participation.id}) + CommonAPI.post(user, %{status: ".", in_reply_to_conversation_id: participation.id}) assert Visibility.is_direct?(convo_reply) @@ -42,8 +210,8 @@ test "when replying to a conversation / participation, it only mentions the reci {:ok, activity} = CommonAPI.post(har, %{ - "status" => "@#{jafnhar.nickname} hey", - "visibility" => "direct" + status: "@#{jafnhar.nickname} hey", + visibility: "direct" }) assert har.ap_id in activity.recipients @@ -53,10 +221,10 @@ test "when replying to a conversation / participation, it only mentions the reci {:ok, activity} = CommonAPI.post(har, %{ - "status" => "I don't really like @#{tridi.nickname}", - "visibility" => "direct", - "in_reply_to_status_id" => activity.id, - "in_reply_to_conversation_id" => participation.id + status: "I don't really like @#{tridi.nickname}", + visibility: "direct", + in_reply_to_status_id: activity.id, + in_reply_to_conversation_id: participation.id }) assert har.ap_id in activity.recipients @@ -73,8 +241,8 @@ test "with the safe_dm_mention option set, it does not mention people beyond the {:ok, activity} = CommonAPI.post(har, %{ - "status" => "@#{jafnhar.nickname} hey, i never want to see @#{tridi.nickname} again", - "visibility" => "direct" + status: "@#{jafnhar.nickname} hey, i never want to see @#{tridi.nickname} again", + visibility: "direct" }) refute tridi.ap_id in activity.recipients @@ -83,7 +251,7 @@ test "with the safe_dm_mention option set, it does not mention people beyond the test "it de-duplicates tags" do user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "#2hu #2HU"}) + {:ok, activity} = CommonAPI.post(user, %{status: "#2hu #2HU"}) object = Object.normalize(activity) @@ -92,23 +260,11 @@ test "it de-duplicates tags" do test "it adds emoji in the object" do user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => ":firefox:"}) + {:ok, activity} = CommonAPI.post(user, %{status: ":firefox:"}) assert Object.normalize(activity).data["emoji"]["firefox"] end - test "it adds emoji when updating profiles" do - user = insert(:user, %{name: ":firefox:"}) - - {:ok, activity} = CommonAPI.update(user) - user = User.get_cached_by_ap_id(user.ap_id) - [firefox] = user.source_data["tag"] - - assert firefox["name"] == ":firefox:" - - assert Pleroma.Constants.as_public() in activity.recipients - end - describe "posting" do test "it supports explicit addressing" do user = insert(:user) @@ -118,9 +274,9 @@ test "it supports explicit addressing" do {:ok, activity} = CommonAPI.post(user, %{ - "status" => + status: "Hey, I think @#{user_three.nickname} is ugly. @#{user_four.nickname} is alright though.", - "to" => [user_two.nickname, user_four.nickname, "nonexistent"] + to: [user_two.nickname, user_four.nickname, "nonexistent"] }) assert user.ap_id in activity.recipients @@ -136,8 +292,8 @@ test "it filters out obviously bad tags when accepting a post as HTML" do {:ok, activity} = CommonAPI.post(user, %{ - "status" => post, - "content_type" => "text/html" + status: post, + content_type: "text/html" }) object = Object.normalize(activity) @@ -152,8 +308,8 @@ test "it filters out obviously bad tags when accepting a post as Markdown" do {:ok, activity} = CommonAPI.post(user, %{ - "status" => post, - "content_type" => "text/markdown" + status: post, + content_type: "text/markdown" }) object = Object.normalize(activity) @@ -164,31 +320,56 @@ test "it filters out obviously bad tags when accepting a post as Markdown" do test "it does not allow replies to direct messages that are not direct messages themselves" do user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "suya..", "visibility" => "direct"}) + {:ok, activity} = CommonAPI.post(user, %{status: "suya..", visibility: "direct"}) assert {:ok, _} = CommonAPI.post(user, %{ - "status" => "suya..", - "visibility" => "direct", - "in_reply_to_status_id" => activity.id + status: "suya..", + visibility: "direct", + in_reply_to_status_id: activity.id }) Enum.each(["public", "private", "unlisted"], fn visibility -> assert {:error, "The message visibility must be direct"} = CommonAPI.post(user, %{ - "status" => "suya..", - "visibility" => visibility, - "in_reply_to_status_id" => activity.id + status: "suya..", + visibility: visibility, + in_reply_to_status_id: activity.id }) end) end + test "replying with a direct message will NOT auto-add the author of the reply to the recipient list" do + user = insert(:user) + other_user = insert(:user) + third_user = insert(:user) + + {:ok, post} = CommonAPI.post(user, %{status: "I'm stupid"}) + + {:ok, open_answer} = + CommonAPI.post(other_user, %{status: "No ur smart", in_reply_to_status_id: post.id}) + + # The OP is implicitly added + assert user.ap_id in open_answer.recipients + + {:ok, secret_answer} = + CommonAPI.post(other_user, %{ + status: "lol, that guy really is stupid, right, @#{third_user.nickname}?", + in_reply_to_status_id: post.id, + visibility: "direct" + }) + + assert third_user.ap_id in secret_answer.recipients + + # The OP is not added + refute user.ap_id in secret_answer.recipients + end + test "it allows to address a list" do user = insert(:user) {:ok, list} = Pleroma.List.create("foo", user) - {:ok, activity} = - CommonAPI.post(user, %{"status" => "foobar", "visibility" => "list:#{list.id}"}) + {:ok, activity} = CommonAPI.post(user, %{status: "foobar", visibility: "list:#{list.id}"}) assert activity.data["bcc"] == [list.ap_id] assert activity.recipients == [list.ap_id, user.ap_id] @@ -199,7 +380,7 @@ test "it returns error when status is empty and no attachments" do user = insert(:user) assert {:error, "Cannot post an empty status without attachments"} = - CommonAPI.post(user, %{"status" => ""}) + CommonAPI.post(user, %{status: ""}) end test "it validates character limits are correctly enforced" do @@ -208,9 +389,9 @@ test "it validates character limits are correctly enforced" do user = insert(:user) assert {:error, "The status is over the character limit"} = - CommonAPI.post(user, %{"status" => "foobar"}) + CommonAPI.post(user, %{status: "foobar"}) - assert {:ok, activity} = CommonAPI.post(user, %{"status" => "12345"}) + assert {:ok, activity} = CommonAPI.post(user, %{status: "12345"}) end test "it can handle activities that expire" do @@ -221,8 +402,7 @@ test "it can handle activities that expire" do |> NaiveDateTime.truncate(:second) |> NaiveDateTime.add(1_000_000, :second) - assert {:ok, activity} = - CommonAPI.post(user, %{"status" => "chai", "expires_in" => 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 @@ -234,14 +414,14 @@ test "reacting to a status with an emoji" do user = insert(:user) other_user = insert(:user) - {:ok, activity} = CommonAPI.post(other_user, %{"status" => "cofe"}) + {:ok, activity} = CommonAPI.post(other_user, %{status: "cofe"}) - {:ok, reaction, _} = CommonAPI.react_with_emoji(activity.id, user, "👍") + {:ok, reaction} = CommonAPI.react_with_emoji(activity.id, user, "👍") assert reaction.data["actor"] == user.ap_id assert reaction.data["content"] == "👍" - {:ok, activity} = CommonAPI.post(other_user, %{"status" => "cofe"}) + {:ok, activity} = CommonAPI.post(other_user, %{status: "cofe"}) {:error, _} = CommonAPI.react_with_emoji(activity.id, user, ".") end @@ -250,61 +430,77 @@ test "unreacting to a status with an emoji" do user = insert(:user) other_user = insert(:user) - {:ok, activity} = CommonAPI.post(other_user, %{"status" => "cofe"}) - {:ok, reaction, _} = CommonAPI.react_with_emoji(activity.id, user, "👍") + {:ok, activity} = CommonAPI.post(other_user, %{status: "cofe"}) + {:ok, reaction} = CommonAPI.react_with_emoji(activity.id, user, "👍") - {:ok, unreaction, _} = CommonAPI.unreact_with_emoji(activity.id, user, "👍") + {:ok, unreaction} = CommonAPI.unreact_with_emoji(activity.id, user, "👍") assert unreaction.data["type"] == "Undo" assert unreaction.data["object"] == reaction.data["id"] + assert unreaction.local end test "repeating a status" do user = insert(:user) other_user = insert(:user) - {:ok, activity} = CommonAPI.post(other_user, %{"status" => "cofe"}) + {:ok, activity} = CommonAPI.post(other_user, %{status: "cofe"}) - {:ok, %Activity{}, _} = CommonAPI.repeat(activity.id, user) + {:ok, %Activity{} = announce_activity} = CommonAPI.repeat(activity.id, user) + assert Visibility.is_public?(announce_activity) + end + + test "can't repeat a repeat" do + user = insert(:user) + other_user = insert(:user) + {:ok, activity} = CommonAPI.post(other_user, %{status: "cofe"}) + + {:ok, %Activity{} = announce} = CommonAPI.repeat(activity.id, other_user) + + refute match?({:ok, %Activity{}}, CommonAPI.repeat(announce.id, user)) end test "repeating a status privately" do user = insert(:user) other_user = insert(:user) - {:ok, activity} = CommonAPI.post(other_user, %{"status" => "cofe"}) + {:ok, activity} = CommonAPI.post(other_user, %{status: "cofe"}) - {:ok, %Activity{} = announce_activity, _} = - CommonAPI.repeat(activity.id, user, %{"visibility" => "private"}) + {:ok, %Activity{} = announce_activity} = + CommonAPI.repeat(activity.id, user, %{visibility: "private"}) assert Visibility.is_private?(announce_activity) + refute Visibility.visible_for_user?(announce_activity, nil) end test "favoriting a status" do user = insert(:user) other_user = insert(:user) - {:ok, activity} = CommonAPI.post(other_user, %{"status" => "cofe"}) + {:ok, post_activity} = CommonAPI.post(other_user, %{status: "cofe"}) - {:ok, %Activity{}, _} = CommonAPI.favorite(activity.id, user) + {:ok, %Activity{data: data}} = CommonAPI.favorite(user, post_activity.id) + assert data["type"] == "Like" + assert data["actor"] == user.ap_id + assert data["object"] == post_activity.data["object"] end test "retweeting a status twice returns the status" do user = insert(:user) other_user = insert(:user) - {:ok, activity} = CommonAPI.post(other_user, %{"status" => "cofe"}) - {:ok, %Activity{} = activity, object} = CommonAPI.repeat(activity.id, user) - {:ok, ^activity, ^object} = CommonAPI.repeat(activity.id, user) + {:ok, activity} = CommonAPI.post(other_user, %{status: "cofe"}) + {:ok, %Activity{} = announce} = CommonAPI.repeat(activity.id, user) + {:ok, ^announce} = CommonAPI.repeat(activity.id, user) end - test "favoriting a status twice returns the status" do + test "favoriting a status twice returns ok, but without the like activity" do user = insert(:user) other_user = insert(:user) - {:ok, activity} = CommonAPI.post(other_user, %{"status" => "cofe"}) - {:ok, %Activity{} = activity, object} = CommonAPI.favorite(activity.id, user) - {:ok, ^activity, ^object} = CommonAPI.favorite(activity.id, user) + {:ok, activity} = CommonAPI.post(other_user, %{status: "cofe"}) + {:ok, %Activity{}} = CommonAPI.favorite(user, activity.id) + assert {:ok, :already_liked} = CommonAPI.favorite(user, activity.id) end end @@ -313,7 +509,7 @@ test "favoriting a status twice returns the status" do Pleroma.Config.put([:instance, :max_pinned_statuses], 1) user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "HI!!!"}) + {:ok, activity} = CommonAPI.post(user, %{status: "HI!!!"}) [user: user, activity: activity] end @@ -330,8 +526,8 @@ test "pin status", %{user: user, activity: activity} do test "pin poll", %{user: user} do {:ok, activity} = CommonAPI.post(user, %{ - "status" => "How is fediverse today?", - "poll" => %{"options" => ["Absolutely outstanding", "Not good"], "expires_in" => 20} + status: "How is fediverse today?", + poll: %{options: ["Absolutely outstanding", "Not good"], expires_in: 20} }) assert {:ok, ^activity} = CommonAPI.pin(activity.id, user) @@ -343,7 +539,7 @@ test "pin poll", %{user: user} do end test "unlisted statuses can be pinned", %{user: user} do - {:ok, activity} = CommonAPI.post(user, %{"status" => "HI!!!", "visibility" => "unlisted"}) + {:ok, activity} = CommonAPI.post(user, %{status: "HI!!!", visibility: "unlisted"}) assert {:ok, ^activity} = CommonAPI.pin(activity.id, user) end @@ -354,7 +550,7 @@ test "only self-authored can be pinned", %{activity: activity} do end test "max pinned statuses", %{user: user, activity: activity_one} do - {:ok, activity_two} = CommonAPI.post(user, %{"status" => "HI!!!"}) + {:ok, activity_two} = CommonAPI.post(user, %{status: "HI!!!"}) assert {:ok, ^activity_one} = CommonAPI.pin(activity_one.id, user) @@ -369,7 +565,9 @@ test "unpin status", %{user: user, activity: activity} do user = refresh_record(user) - assert {:ok, ^activity} = CommonAPI.unpin(activity.id, user) + id = activity.id + + assert match?({:ok, %{id: ^id}}, CommonAPI.unpin(activity.id, user)) user = refresh_record(user) @@ -420,7 +618,7 @@ test "creates a report" do reporter = insert(:user) target_user = insert(:user) - {:ok, activity} = CommonAPI.post(target_user, %{"status" => "foobar"}) + {:ok, activity} = CommonAPI.post(target_user, %{status: "foobar"}) reporter_ap_id = reporter.ap_id target_ap_id = target_user.ap_id @@ -428,9 +626,9 @@ test "creates a report" do comment = "foobar" report_data = %{ - "account_id" => target_user.id, - "comment" => comment, - "status_ids" => [activity.id] + account_id: target_user.id, + comment: comment, + status_ids: [activity.id] } note_obj = %{ @@ -460,9 +658,9 @@ test "updates report state" do {:ok, %Activity{id: report_id}} = CommonAPI.report(reporter, %{ - "account_id" => target_user.id, - "comment" => "I feel offended", - "status_ids" => [activity.id] + account_id: target_user.id, + comment: "I feel offended", + status_ids: [activity.id] }) {:ok, report} = CommonAPI.update_report_state(report_id, "resolved") @@ -481,9 +679,9 @@ test "does not update report state when state is unsupported" do {:ok, %Activity{id: report_id}} = CommonAPI.report(reporter, %{ - "account_id" => target_user.id, - "comment" => "I feel offended", - "status_ids" => [activity.id] + account_id: target_user.id, + comment: "I feel offended", + status_ids: [activity.id] }) assert CommonAPI.update_report_state(report_id, "test") == {:error, "Unsupported state"} @@ -495,16 +693,16 @@ test "updates state of multiple reports" do {:ok, %Activity{id: first_report_id}} = CommonAPI.report(reporter, %{ - "account_id" => target_user.id, - "comment" => "I feel offended", - "status_ids" => [activity.id] + account_id: target_user.id, + comment: "I feel offended", + status_ids: [activity.id] }) {:ok, %Activity{id: second_report_id}} = CommonAPI.report(reporter, %{ - "account_id" => target_user.id, - "comment" => "I feel very offended!", - "status_ids" => [activity.id] + account_id: target_user.id, + comment: "I feel very offended!", + status_ids: [activity.id] }) {:ok, report_ids} = @@ -562,7 +760,7 @@ test "cancels a pending follow for a local user" do assert {:ok, follower, followed, %{id: activity_id, data: %{"state" => "pending"}}} = CommonAPI.follow(follower, followed) - assert User.get_follow_state(follower, followed) == "pending" + assert User.get_follow_state(follower, followed) == :follow_pending assert {:ok, follower} = CommonAPI.unfollow(follower, followed) assert User.get_follow_state(follower, followed) == nil @@ -584,7 +782,7 @@ test "cancels a pending follow for a remote user" do assert {:ok, follower, followed, %{id: activity_id, data: %{"state" => "pending"}}} = CommonAPI.follow(follower, followed) - assert User.get_follow_state(follower, followed) == "pending" + assert User.get_follow_state(follower, followed) == :follow_pending assert {:ok, follower} = CommonAPI.unfollow(follower, followed) assert User.get_follow_state(follower, followed) == nil @@ -640,6 +838,14 @@ test "after rejection, it sets all existing pending follow request states to 're assert Repo.get(Activity, follow_activity_two.id).data["state"] == "reject" assert Repo.get(Activity, follow_activity_three.id).data["state"] == "pending" end + + test "doesn't create a following relationship if the corresponding follow request doesn't exist" do + user = insert(:user, locked: true) + not_follower = insert(:user) + CommonAPI.accept_follow_request(not_follower, user) + + assert Pleroma.FollowingRelationship.following?(not_follower, user) == false + end end describe "vote/3" do @@ -649,8 +855,8 @@ test "does not allow to vote twice" do {:ok, activity} = CommonAPI.post(user, %{ - "status" => "Am I cute?", - "poll" => %{"options" => ["Yes", "No"], "expires_in" => 20} + status: "Am I cute?", + poll: %{options: ["Yes", "No"], expires_in: 20} }) object = Object.normalize(activity) @@ -667,10 +873,10 @@ test "returns a valid activity" do {:ok, activity} = CommonAPI.listen(user, %{ - "title" => "lain radio episode 1", - "album" => "lain radio", - "artist" => "lain", - "length" => 180_000 + title: "lain radio episode 1", + album: "lain radio", + artist: "lain", + length: 180_000 }) object = Object.normalize(activity) @@ -685,11 +891,11 @@ test "respects visibility=private" do {:ok, activity} = CommonAPI.listen(user, %{ - "title" => "lain radio episode 1", - "album" => "lain radio", - "artist" => "lain", - "length" => 180_000, - "visibility" => "private" + title: "lain radio episode 1", + album: "lain radio", + artist: "lain", + length: 180_000, + visibility: "private" }) object = Object.normalize(activity) diff --git a/test/web/common_api/common_api_utils_test.exs b/test/web/common_api/common_api_utils_test.exs index 45fc94522..e67c10b93 100644 --- a/test/web/common_api/common_api_utils_test.exs +++ b/test/web/common_api/common_api_utils_test.exs @@ -7,7 +7,6 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do alias Pleroma.Object alias Pleroma.Web.CommonAPI alias Pleroma.Web.CommonAPI.Utils - alias Pleroma.Web.Endpoint use Pleroma.DataCase import ExUnit.CaptureLog @@ -15,18 +14,41 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do @public_address "https://www.w3.org/ns/activitystreams#Public" - test "it adds attachment links to a given text and attachment set" do - name = - "Sakura%20Mana%20%E2%80%93%20Turned%20on%20by%20a%20Senior%20OL%20with%20a%20Temptating%20Tight%20Skirt-s%20Full%20Hipline%20and%20Panty%20Shot-%20Beautiful%20Thick%20Thighs-%20and%20Erotic%20Ass-%20-2015-%20--%20Oppaitime%208-28-2017%206-50-33%20PM.png" + describe "add_attachments/2" do + setup do + name = + "Sakura Mana – Turned on by a Senior OL with a Temptating Tight Skirt-s Full Hipline and Panty Shot- Beautiful Thick Thighs- and Erotic Ass- -2015- -- Oppaitime 8-28-2017 6-50-33 PM.png" - attachment = %{ - "url" => [%{"href" => name}] - } + attachment = %{ + "url" => [%{"href" => URI.encode(name)}] + } - res = Utils.add_attachments("", [attachment]) + %{name: name, attachment: attachment} + end - assert res == - "
Sakura Mana – Turned on by a Se…" + test "it adds attachment links to a given text and attachment set", %{ + name: name, + attachment: attachment + } do + len = 10 + clear_config([Pleroma.Upload, :filename_display_max_length], len) + + expected = + "
#{String.slice(name, 0..len)}…" + + assert Utils.add_attachments("", [attachment]) == expected + end + + test "doesn't truncate file name if config for truncate is set to 0", %{ + name: name, + attachment: attachment + } do + clear_config([Pleroma.Upload, :filename_display_max_length], 0) + + expected = "
#{name}" + + assert Utils.add_attachments("", [attachment]) == expected + end end describe "it confirms the password given is the current users password" do @@ -42,28 +64,6 @@ test "correct password given" do end end - test "parses emoji from name and bio" do - {:ok, user} = UserBuilder.insert(%{name: ":blank:", bio: ":firefox:"}) - - expected = [ - %{ - "type" => "Emoji", - "icon" => %{"type" => "Image", "url" => "#{Endpoint.url()}/emoji/Firefox.gif"}, - "name" => ":firefox:" - }, - %{ - "type" => "Emoji", - "icon" => %{ - "type" => "Image", - "url" => "#{Endpoint.url()}/emoji/blank.png" - }, - "name" => ":blank:" - } - ] - - assert expected == Utils.emoji_from_profile(user) - end - describe "format_input/3" do test "works for bare text/plain" do text = "hello world!" @@ -159,11 +159,11 @@ test "works for text/markdown with mentions" do {output, _, _} = Utils.format_input(text, "text/markdown") assert output == - ~s(

hello world

another @user__test and @user__test and @user__test google.com paragraph

) + }" href="http://foo.com/user__test" rel="ugc">@user__test google.com paragraph

) end end @@ -251,7 +251,7 @@ test "for public posts, a reply" do user = insert(:user) mentioned_user = insert(:user) third_user = insert(:user) - {:ok, activity} = CommonAPI.post(third_user, %{"status" => "uguu"}) + {:ok, activity} = CommonAPI.post(third_user, %{status: "uguu"}) mentions = [mentioned_user.ap_id] {to, cc} = Utils.get_to_and_cc(user, mentions, activity, "public", nil) @@ -284,7 +284,7 @@ test "for unlisted posts, a reply" do user = insert(:user) mentioned_user = insert(:user) third_user = insert(:user) - {:ok, activity} = CommonAPI.post(third_user, %{"status" => "uguu"}) + {:ok, activity} = CommonAPI.post(third_user, %{status: "uguu"}) mentions = [mentioned_user.ap_id] {to, cc} = Utils.get_to_and_cc(user, mentions, activity, "unlisted", nil) @@ -315,16 +315,15 @@ test "for private posts, a reply" do user = insert(:user) mentioned_user = insert(:user) third_user = insert(:user) - {:ok, activity} = CommonAPI.post(third_user, %{"status" => "uguu"}) + {:ok, activity} = CommonAPI.post(third_user, %{status: "uguu"}) mentions = [mentioned_user.ap_id] {to, cc} = Utils.get_to_and_cc(user, mentions, activity, "private", nil) - assert length(to) == 3 + assert length(to) == 2 assert Enum.empty?(cc) assert mentioned_user.ap_id in to - assert third_user.ap_id in to assert user.follower_address in to end @@ -345,11 +344,20 @@ test "for direct posts, a reply" do user = insert(:user) mentioned_user = insert(:user) third_user = insert(:user) - {:ok, activity} = CommonAPI.post(third_user, %{"status" => "uguu"}) + {:ok, activity} = CommonAPI.post(third_user, %{status: "uguu"}) mentions = [mentioned_user.ap_id] {to, cc} = Utils.get_to_and_cc(user, mentions, activity, "direct", nil) + assert length(to) == 1 + assert Enum.empty?(cc) + + assert mentioned_user.ap_id in to + + {:ok, direct_activity} = CommonAPI.post(third_user, %{status: "uguu", visibility: "direct"}) + + {to, cc} = Utils.get_to_and_cc(user, mentions, direct_activity, "direct", nil) + assert length(to) == 2 assert Enum.empty?(cc) @@ -358,26 +366,6 @@ test "for direct posts, a reply" do end end - describe "get_by_id_or_ap_id/1" do - test "get activity by id" do - activity = insert(:note_activity) - %Pleroma.Activity{} = note = Utils.get_by_id_or_ap_id(activity.id) - assert note.id == activity.id - end - - test "get activity by ap_id" do - activity = insert(:note_activity) - %Pleroma.Activity{} = note = Utils.get_by_id_or_ap_id(activity.data["object"]) - assert note.id == activity.id - end - - test "get activity by object when type isn't `Create` " do - activity = insert(:like_activity) - %Pleroma.Activity{} = like = Utils.get_by_id_or_ap_id(activity.id) - assert like.data["object"] == activity.data["object"] - end - end - describe "to_master_date/1" do test "removes microseconds from date (NaiveDateTime)" do assert Utils.to_masto_date(~N[2015-01-23 23:50:07.123]) == "2015-01-23T23:50:07.000Z" @@ -472,6 +460,13 @@ test "returns recipients when object not found" do activity = insert(:note_activity, user: user, note: object) Pleroma.Repo.delete(object) + obj_url = activity.data["object"] + + Tesla.Mock.mock(fn + %{method: :get, url: ^obj_url} -> + %Tesla.Env{status: 404, body: ""} + end) + assert Utils.maybe_notify_mentioned_recipients(["test-test"], activity) == [ "test-test" ] @@ -499,8 +494,8 @@ test "returns attachments with descs" do desc = Jason.encode!(%{object.id => "test-desc"}) assert Utils.attachments_from_ids(%{ - "media_ids" => ["#{object.id}"], - "descriptions" => desc + media_ids: ["#{object.id}"], + descriptions: desc }) == [ Map.merge(object.data, %{"name" => "test-desc"}) ] @@ -508,7 +503,7 @@ test "returns attachments with descs" do test "returns attachments without descs" do object = insert(:note) - assert Utils.attachments_from_ids(%{"media_ids" => ["#{object.id}"]}) == [object.data] + assert Utils.attachments_from_ids(%{media_ids: ["#{object.id}"]}) == [object.data] end test "returns [] when not pass media_ids" do diff --git a/test/web/federator_test.exs b/test/web/federator_test.exs index da844c24c..de90aa6e0 100644 --- a/test/web/federator_test.exs +++ b/test/web/federator_test.exs @@ -29,7 +29,7 @@ defmodule Pleroma.Web.FederatorTest do describe "Publish an activity" do setup do user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "HI"}) + {:ok, activity} = CommonAPI.post(user, %{status: "HI"}) relay_mock = { Pleroma.Web.ActivityPub.Relay, @@ -78,7 +78,7 @@ test "it federates only to reachable instances via AP" do local: false, nickname: "nick1@domain.com", ap_id: "https://domain.com/users/nick1", - source_data: %{"inbox" => inbox1}, + inbox: inbox1, ap_enabled: true }) @@ -86,7 +86,7 @@ test "it federates only to reachable instances via AP" do local: false, nickname: "nick2@domain2.com", ap_id: "https://domain2.com/users/nick2", - source_data: %{"inbox" => inbox2}, + inbox: inbox2, ap_enabled: true }) @@ -96,7 +96,7 @@ test "it federates only to reachable instances via AP" do Instances.set_consistently_unreachable(URI.parse(inbox2).host) {:ok, _activity} = - CommonAPI.post(user, %{"status" => "HI @nick1@domain.com, @nick2@domain2.com!"}) + CommonAPI.post(user, %{status: "HI @nick1@domain.com, @nick2@domain2.com!"}) expected_dt = NaiveDateTime.to_iso8601(dt) @@ -130,6 +130,9 @@ test "successfully processes incoming AP docs with correct origin" do assert {:ok, job} = Federator.incoming_ap_doc(params) assert {:ok, _activity} = ObanHelpers.perform(job) + + assert {:ok, job} = Federator.incoming_ap_doc(params) + assert {:error, :already_present} = ObanHelpers.perform(job) end test "rejects incoming AP docs with incorrect origin" do @@ -148,7 +151,7 @@ test "rejects incoming AP docs with incorrect origin" do } assert {:ok, job} = Federator.incoming_ap_doc(params) - assert :error = ObanHelpers.perform(job) + assert {:error, :origin_containment_failed} = ObanHelpers.perform(job) end test "it does not crash if MRF rejects the post" do @@ -164,7 +167,7 @@ test "it does not crash if MRF rejects the post" do |> Poison.decode!() assert {:ok, job} = Federator.incoming_ap_doc(params) - assert :error = ObanHelpers.perform(job) + assert {:error, _} = ObanHelpers.perform(job) end end end diff --git a/test/web/feed/tag_controller_test.exs b/test/web/feed/tag_controller_test.exs index e863df86b..3c29cd94f 100644 --- a/test/web/feed/tag_controller_test.exs +++ b/test/web/feed/tag_controller_test.exs @@ -21,7 +21,7 @@ test "gets a feed (ATOM)", %{conn: conn} do ) user = insert(:user) - {:ok, activity1} = CommonAPI.post(user, %{"status" => "yeah #PleromaArt"}) + {:ok, activity1} = CommonAPI.post(user, %{status: "yeah #PleromaArt"}) object = Object.normalize(activity1) @@ -43,9 +43,9 @@ test "gets a feed (ATOM)", %{conn: conn} do |> Ecto.Changeset.change(data: object_data) |> Pleroma.Repo.update() - {:ok, activity2} = CommonAPI.post(user, %{"status" => "42 This is :moominmamma #PleromaArt"}) + {:ok, activity2} = CommonAPI.post(user, %{status: "42 This is :moominmamma #PleromaArt"}) - {:ok, _activity3} = CommonAPI.post(user, %{"status" => "This is :moominmamma"}) + {:ok, _activity3} = CommonAPI.post(user, %{status: "This is :moominmamma"}) response = conn @@ -88,7 +88,7 @@ test "gets a feed (RSS)", %{conn: conn} do ) user = insert(:user) - {:ok, activity1} = CommonAPI.post(user, %{"status" => "yeah #PleromaArt"}) + {:ok, activity1} = CommonAPI.post(user, %{status: "yeah #PleromaArt"}) object = Object.normalize(activity1) @@ -110,9 +110,9 @@ test "gets a feed (RSS)", %{conn: conn} do |> Ecto.Changeset.change(data: object_data) |> Pleroma.Repo.update() - {:ok, activity2} = CommonAPI.post(user, %{"status" => "42 This is :moominmamma #PleromaArt"}) + {:ok, activity2} = CommonAPI.post(user, %{status: "42 This is :moominmamma #PleromaArt"}) - {:ok, _activity3} = CommonAPI.post(user, %{"status" => "This is :moominmamma"}) + {:ok, _activity3} = CommonAPI.post(user, %{status: "This is :moominmamma"}) response = conn @@ -138,8 +138,8 @@ test "gets a feed (RSS)", %{conn: conn} do ] assert xpath(xml, ~x"//channel/item/pubDate/text()"sl) == [ - FeedView.pub_date(activity1.data["published"]), - FeedView.pub_date(activity2.data["published"]) + FeedView.pub_date(activity2.data["published"]), + FeedView.pub_date(activity1.data["published"]) ] assert xpath(xml, ~x"//channel/item/enclosure/@url"sl) == [ @@ -150,8 +150,8 @@ test "gets a feed (RSS)", %{conn: conn} do obj2 = Object.normalize(activity2) assert xpath(xml, ~x"//channel/item/description/text()"sl) == [ - HtmlEntities.decode(FeedView.activity_content(obj2)), - HtmlEntities.decode(FeedView.activity_content(obj1)) + HtmlEntities.decode(FeedView.activity_content(obj2.data)), + HtmlEntities.decode(FeedView.activity_content(obj1.data)) ] response = diff --git a/test/web/feed/user_controller_test.exs b/test/web/feed/user_controller_test.exs index 05ad427c2..fa2ed1ea5 100644 --- a/test/web/feed/user_controller_test.exs +++ b/test/web/feed/user_controller_test.exs @@ -11,13 +11,14 @@ defmodule Pleroma.Web.Feed.UserControllerTest do alias Pleroma.Config alias Pleroma.Object alias Pleroma.User + alias Pleroma.Web.CommonAPI setup do: clear_config([:instance, :federating], true) describe "feed" do setup do: clear_config([:feed]) - test "gets a feed", %{conn: conn} do + test "gets an atom feed", %{conn: conn} do Config.put( [:feed, :post_title], %{max_length: 10, omission: "..."} @@ -157,6 +158,29 @@ test "returns 404 for a missing feed", %{conn: conn} do assert response(conn, 404) end + + test "returns feed with public and unlisted activities", %{conn: conn} do + user = insert(:user) + + {:ok, _} = CommonAPI.post(user, %{status: "public", visibility: "public"}) + {:ok, _} = CommonAPI.post(user, %{status: "direct", visibility: "direct"}) + {:ok, _} = CommonAPI.post(user, %{status: "unlisted", visibility: "unlisted"}) + {:ok, _} = CommonAPI.post(user, %{status: "private", visibility: "private"}) + + resp = + conn + |> put_req_header("accept", "application/atom+xml") + |> get(user_feed_path(conn, :feed, user.nickname)) + |> response(200) + + activity_titles = + resp + |> SweetXml.parse() + |> SweetXml.xpath(~x"//entry/title/text()"l) + |> Enum.sort() + + assert activity_titles == ['public', 'unlisted'] + end end # Note: see ActivityPubControllerTest for JSON format tests diff --git a/test/web/mastodon_api/controllers/account_controller/update_credentials_test.exs b/test/web/mastodon_api/controllers/account_controller/update_credentials_test.exs index 43538cb17..696228203 100644 --- a/test/web/mastodon_api/controllers/account_controller/update_credentials_test.exs +++ b/test/web/mastodon_api/controllers/account_controller/update_credentials_test.exs @@ -14,6 +14,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do describe "updating credentials" do setup do: oauth_access(["write:accounts"]) + setup :request_content_type test "sets user settings in a generic way", %{conn: conn} do res_conn = @@ -25,7 +26,7 @@ test "sets user settings in a generic way", %{conn: conn} do } }) - assert user_data = json_response(res_conn, 200) + assert user_data = json_response_and_validate_schema(res_conn, 200) assert user_data["pleroma"]["settings_store"] == %{"pleroma_fe" => %{"theme" => "bla"}} user = Repo.get(User, user_data["id"]) @@ -41,7 +42,7 @@ test "sets user settings in a generic way", %{conn: conn} do } }) - assert user_data = json_response(res_conn, 200) + assert user_data = json_response_and_validate_schema(res_conn, 200) assert user_data["pleroma"]["settings_store"] == %{ @@ -62,7 +63,7 @@ test "sets user settings in a generic way", %{conn: conn} do } }) - assert user_data = json_response(res_conn, 200) + assert user_data = json_response_and_validate_schema(res_conn, 200) assert user_data["pleroma"]["settings_store"] == %{ @@ -76,21 +77,21 @@ test "updates the user's bio", %{conn: conn} do conn = patch(conn, "/api/v1/accounts/update_credentials", %{ - "note" => "I drink #cofe with @#{user2.nickname}" + "note" => "I drink #cofe with @#{user2.nickname}\n\nsuya.." }) - assert user_data = json_response(conn, 200) + assert user_data = json_response_and_validate_schema(conn, 200) assert user_data["note"] == - ~s(I drink #cofe with #cofe with @#{user2.nickname}) + }" href="#{user2.ap_id}" rel="ugc">@#{user2.nickname}

suya..) end test "updates the user's locking status", %{conn: conn} do conn = patch(conn, "/api/v1/accounts/update_credentials", %{locked: "true"}) - assert user_data = json_response(conn, 200) + assert user_data = json_response_and_validate_schema(conn, 200) assert user_data["locked"] == true end @@ -100,24 +101,43 @@ test "updates the user's allow_following_move", %{user: user, conn: conn} do conn = patch(conn, "/api/v1/accounts/update_credentials", %{allow_following_move: "false"}) assert refresh_record(user).allow_following_move == false - assert user_data = json_response(conn, 200) + assert user_data = json_response_and_validate_schema(conn, 200) assert user_data["pleroma"]["allow_following_move"] == false end test "updates the user's default scope", %{conn: conn} do - conn = patch(conn, "/api/v1/accounts/update_credentials", %{default_scope: "cofe"}) + conn = patch(conn, "/api/v1/accounts/update_credentials", %{default_scope: "unlisted"}) - assert user_data = json_response(conn, 200) - assert user_data["source"]["privacy"] == "cofe" + assert user_data = json_response_and_validate_schema(conn, 200) + assert user_data["source"]["privacy"] == "unlisted" + end + + test "updates the user's privacy", %{conn: conn} do + conn = patch(conn, "/api/v1/accounts/update_credentials", %{source: %{privacy: "unlisted"}}) + + assert user_data = json_response_and_validate_schema(conn, 200) + assert user_data["source"]["privacy"] == "unlisted" end test "updates the user's hide_followers status", %{conn: conn} do conn = patch(conn, "/api/v1/accounts/update_credentials", %{hide_followers: "true"}) - assert user_data = json_response(conn, 200) + assert user_data = json_response_and_validate_schema(conn, 200) assert user_data["pleroma"]["hide_followers"] == true end + test "updates the user's discoverable status", %{conn: conn} do + assert %{"source" => %{"pleroma" => %{"discoverable" => true}}} = + conn + |> patch("/api/v1/accounts/update_credentials", %{discoverable: "true"}) + |> json_response_and_validate_schema(:ok) + + assert %{"source" => %{"pleroma" => %{"discoverable" => false}}} = + conn + |> patch("/api/v1/accounts/update_credentials", %{discoverable: "false"}) + |> json_response_and_validate_schema(:ok) + end + test "updates the user's hide_followers_count and hide_follows_count", %{conn: conn} do conn = patch(conn, "/api/v1/accounts/update_credentials", %{ @@ -125,7 +145,7 @@ test "updates the user's hide_followers_count and hide_follows_count", %{conn: c hide_follows_count: "true" }) - assert user_data = json_response(conn, 200) + assert user_data = json_response_and_validate_schema(conn, 200) assert user_data["pleroma"]["hide_followers_count"] == true assert user_data["pleroma"]["hide_follows_count"] == true end @@ -134,7 +154,7 @@ test "updates the user's skip_thread_containment option", %{user: user, conn: co response = conn |> patch("/api/v1/accounts/update_credentials", %{skip_thread_containment: "true"}) - |> json_response(200) + |> json_response_and_validate_schema(200) assert response["pleroma"]["skip_thread_containment"] == true assert refresh_record(user).skip_thread_containment @@ -143,28 +163,28 @@ test "updates the user's skip_thread_containment option", %{user: user, conn: co test "updates the user's hide_follows status", %{conn: conn} do conn = patch(conn, "/api/v1/accounts/update_credentials", %{hide_follows: "true"}) - assert user_data = json_response(conn, 200) + assert user_data = json_response_and_validate_schema(conn, 200) assert user_data["pleroma"]["hide_follows"] == true end test "updates the user's hide_favorites status", %{conn: conn} do conn = patch(conn, "/api/v1/accounts/update_credentials", %{hide_favorites: "true"}) - assert user_data = json_response(conn, 200) + assert user_data = json_response_and_validate_schema(conn, 200) assert user_data["pleroma"]["hide_favorites"] == true end test "updates the user's show_role status", %{conn: conn} do conn = patch(conn, "/api/v1/accounts/update_credentials", %{show_role: "false"}) - assert user_data = json_response(conn, 200) + assert user_data = json_response_and_validate_schema(conn, 200) assert user_data["source"]["pleroma"]["show_role"] == false end test "updates the user's no_rich_text status", %{conn: conn} do conn = patch(conn, "/api/v1/accounts/update_credentials", %{no_rich_text: "true"}) - assert user_data = json_response(conn, 200) + assert user_data = json_response_and_validate_schema(conn, 200) assert user_data["source"]["pleroma"]["no_rich_text"] == true end @@ -172,7 +192,7 @@ test "updates the user's name", %{conn: conn} do conn = patch(conn, "/api/v1/accounts/update_credentials", %{"display_name" => "markorepairs"}) - assert user_data = json_response(conn, 200) + assert user_data = json_response_and_validate_schema(conn, 200) assert user_data["display_name"] == "markorepairs" end @@ -185,7 +205,7 @@ test "updates the user's avatar", %{user: user, conn: conn} do conn = patch(conn, "/api/v1/accounts/update_credentials", %{"avatar" => new_avatar}) - assert user_response = json_response(conn, 200) + assert user_response = json_response_and_validate_schema(conn, 200) assert user_response["avatar"] != User.avatar_url(user) end @@ -198,7 +218,7 @@ test "updates the user's banner", %{user: user, conn: conn} do conn = patch(conn, "/api/v1/accounts/update_credentials", %{"header" => new_header}) - assert user_response = json_response(conn, 200) + assert user_response = json_response_and_validate_schema(conn, 200) assert user_response["header"] != User.banner_url(user) end @@ -214,7 +234,7 @@ test "updates the user's background", %{conn: conn} do "pleroma_background_image" => new_header }) - assert user_response = json_response(conn, 200) + assert user_response = json_response_and_validate_schema(conn, 200) assert user_response["pleroma"]["background_image"] end @@ -225,14 +245,15 @@ test "requires 'write:accounts' permission" do for token <- [token1, token2] do conn = build_conn() + |> put_req_header("content-type", "multipart/form-data") |> put_req_header("authorization", "Bearer #{token.token}") |> patch("/api/v1/accounts/update_credentials", %{}) if token == token1 do assert %{"error" => "Insufficient permissions: write:accounts."} == - json_response(conn, 403) + json_response_and_validate_schema(conn, 403) else - assert json_response(conn, 200) + assert json_response_and_validate_schema(conn, 200) end end end @@ -247,11 +268,11 @@ test "updates profile emojos", %{user: user, conn: conn} do "display_name" => name }) - assert json_response(ret_conn, 200) + assert json_response_and_validate_schema(ret_conn, 200) conn = get(conn, "/api/v1/accounts/#{user.id}") - assert user_data = json_response(conn, 200) + assert user_data = json_response_and_validate_schema(conn, 200) assert user_data["note"] == note assert user_data["display_name"] == name @@ -261,17 +282,20 @@ test "updates profile emojos", %{user: user, conn: conn} do test "update fields", %{conn: conn} do fields = [ %{"name" => "foo", "value" => ""}, - %{"name" => "link", "value" => "cofe.io"} + %{"name" => "link.io", "value" => "cofe.io"} ] account_data = conn |> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields}) - |> json_response(200) + |> json_response_and_validate_schema(200) assert account_data["fields"] == [ %{"name" => "foo", "value" => "bar"}, - %{"name" => "link", "value" => ~S(cofe.io)} + %{ + "name" => "link.io", + "value" => ~S(cofe.io) + } ] assert account_data["source"]["fields"] == [ @@ -279,14 +303,16 @@ test "update fields", %{conn: conn} do "name" => "foo", "value" => "" }, - %{"name" => "link", "value" => "cofe.io"} + %{"name" => "link.io", "value" => "cofe.io"} ] + end + test "update fields via x-www-form-urlencoded", %{conn: conn} do fields = [ "fields_attributes[1][name]=link", - "fields_attributes[1][value]=cofe.io", - "fields_attributes[0][name]=foo", + "fields_attributes[1][value]=http://cofe.io", + "fields_attributes[0][name]=foo", "fields_attributes[0][value]=bar" ] |> Enum.join("&") @@ -295,54 +321,23 @@ test "update fields", %{conn: conn} do conn |> put_req_header("content-type", "application/x-www-form-urlencoded") |> patch("/api/v1/accounts/update_credentials", fields) - |> json_response(200) + |> json_response_and_validate_schema(200) assert account["fields"] == [ - %{"name" => "foo", "value" => "bar"}, - %{"name" => "link", "value" => ~S(cofe.io)} + %{"name" => "foo", "value" => "bar"}, + %{ + "name" => "link", + "value" => ~S(http://cofe.io) + } ] assert account["source"]["fields"] == [ - %{ - "name" => "foo", - "value" => "bar" - }, - %{"name" => "link", "value" => "cofe.io"} + %{"name" => "foo", "value" => "bar"}, + %{"name" => "link", "value" => "http://cofe.io"} ] + end - name_limit = Pleroma.Config.get([:instance, :account_field_name_length]) - value_limit = Pleroma.Config.get([:instance, :account_field_value_length]) - - long_value = Enum.map(0..value_limit, fn _ -> "x" end) |> Enum.join() - - fields = [%{"name" => "foo", "value" => long_value}] - - assert %{"error" => "Invalid request"} == - conn - |> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields}) - |> json_response(403) - - long_name = Enum.map(0..name_limit, fn _ -> "x" end) |> Enum.join() - - fields = [%{"name" => long_name, "value" => "bar"}] - - assert %{"error" => "Invalid request"} == - conn - |> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields}) - |> json_response(403) - - Pleroma.Config.put([:instance, :max_account_fields], 1) - - fields = [ - %{"name" => "foo", "value" => "bar"}, - %{"name" => "link", "value" => "cofe.io"} - ] - - assert %{"error" => "Invalid request"} == - conn - |> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields}) - |> json_response(403) - + test "update fields with empty name", %{conn: conn} do fields = [ %{"name" => "foo", "value" => ""}, %{"name" => "", "value" => "bar"} @@ -351,11 +346,45 @@ test "update fields", %{conn: conn} do account = conn |> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields}) - |> json_response(200) + |> json_response_and_validate_schema(200) assert account["fields"] == [ %{"name" => "foo", "value" => ""} ] end + + test "update fields when invalid request", %{conn: conn} do + name_limit = Pleroma.Config.get([:instance, :account_field_name_length]) + value_limit = Pleroma.Config.get([:instance, :account_field_value_length]) + + long_name = Enum.map(0..name_limit, fn _ -> "x" end) |> Enum.join() + long_value = Enum.map(0..value_limit, fn _ -> "x" end) |> Enum.join() + + fields = [%{"name" => "foo", "value" => long_value}] + + assert %{"error" => "Invalid request"} == + conn + |> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields}) + |> json_response_and_validate_schema(403) + + fields = [%{"name" => long_name, "value" => "bar"}] + + assert %{"error" => "Invalid request"} == + conn + |> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields}) + |> json_response_and_validate_schema(403) + + Pleroma.Config.put([:instance, :max_account_fields], 1) + + fields = [ + %{"name" => "foo", "value" => "bar"}, + %{"name" => "link", "value" => "cofe.io"} + ] + + assert %{"error" => "Invalid request"} == + conn + |> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields}) + |> json_response_and_validate_schema(403) + end end end diff --git a/test/web/mastodon_api/controllers/account_controller_test.exs b/test/web/mastodon_api/controllers/account_controller_test.exs index a9fa0ce48..1ce97378d 100644 --- a/test/web/mastodon_api/controllers/account_controller_test.exs +++ b/test/web/mastodon_api/controllers/account_controller_test.exs @@ -19,43 +19,37 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do setup do: clear_config([:instance, :limit_to_local_content]) test "works by id" do - user = insert(:user) + %User{id: user_id} = insert(:user) - conn = - build_conn() - |> get("/api/v1/accounts/#{user.id}") + assert %{"id" => ^user_id} = + build_conn() + |> get("/api/v1/accounts/#{user_id}") + |> json_response_and_validate_schema(200) - assert %{"id" => id} = json_response(conn, 200) - assert id == to_string(user.id) - - conn = - build_conn() - |> get("/api/v1/accounts/-1") - - assert %{"error" => "Can't find user"} = json_response(conn, 404) + assert %{"error" => "Can't find user"} = + build_conn() + |> get("/api/v1/accounts/-1") + |> json_response_and_validate_schema(404) end test "works by nickname" do user = insert(:user) - conn = - build_conn() - |> get("/api/v1/accounts/#{user.nickname}") - - assert %{"id" => id} = json_response(conn, 200) - assert id == user.id + assert %{"id" => user_id} = + build_conn() + |> get("/api/v1/accounts/#{user.nickname}") + |> json_response_and_validate_schema(200) end test "works by nickname for remote users" do Config.put([:instance, :limit_to_local_content], false) + user = insert(:user, nickname: "user@example.com", local: false) - conn = - build_conn() - |> get("/api/v1/accounts/#{user.nickname}") - - assert %{"id" => id} = json_response(conn, 200) - assert id == user.id + assert %{"id" => user_id} = + build_conn() + |> get("/api/v1/accounts/#{user.nickname}") + |> json_response_and_validate_schema(200) end test "respects limit_to_local_content == :all for remote user nicknames" do @@ -63,11 +57,9 @@ test "respects limit_to_local_content == :all for remote user nicknames" do user = insert(:user, nickname: "user@example.com", local: false) - conn = - build_conn() - |> get("/api/v1/accounts/#{user.nickname}") - - assert json_response(conn, 404) + assert build_conn() + |> get("/api/v1/accounts/#{user.nickname}") + |> json_response_and_validate_schema(404) end test "respects limit_to_local_content == :unauthenticated for remote user nicknames" do @@ -80,7 +72,7 @@ test "respects limit_to_local_content == :unauthenticated for remote user nickna build_conn() |> get("/api/v1/accounts/#{user.nickname}") - assert json_response(conn, 404) + assert json_response_and_validate_schema(conn, 404) conn = build_conn() @@ -88,7 +80,7 @@ test "respects limit_to_local_content == :unauthenticated for remote user nickna |> assign(:token, insert(:oauth_token, user: reading_user, scopes: ["read:accounts"])) |> get("/api/v1/accounts/#{user.nickname}") - assert %{"id" => id} = json_response(conn, 200) + assert %{"id" => id} = json_response_and_validate_schema(conn, 200) assert id == user.id end @@ -99,21 +91,21 @@ test "accounts fetches correct account for nicknames beginning with numbers", %{ user_one = insert(:user, %{id: 1212}) user_two = insert(:user, %{nickname: "#{user_one.id}garbage"}) - resp_one = + acc_one = conn |> get("/api/v1/accounts/#{user_one.id}") + |> json_response_and_validate_schema(:ok) - resp_two = + acc_two = conn |> get("/api/v1/accounts/#{user_two.nickname}") + |> json_response_and_validate_schema(:ok) - resp_three = + acc_three = conn |> get("/api/v1/accounts/#{user_two.id}") + |> json_response_and_validate_schema(:ok) - acc_one = json_response(resp_one, 200) - acc_two = json_response(resp_two, 200) - acc_three = json_response(resp_three, 200) refute acc_one == acc_two assert acc_two == acc_three end @@ -121,23 +113,19 @@ test "accounts fetches correct account for nicknames beginning with numbers", %{ test "returns 404 when user is invisible", %{conn: conn} do user = insert(:user, %{invisible: true}) - resp = - conn - |> get("/api/v1/accounts/#{user.nickname}") - |> json_response(404) - - assert %{"error" => "Can't find user"} = resp + assert %{"error" => "Can't find user"} = + conn + |> get("/api/v1/accounts/#{user.nickname}") + |> json_response_and_validate_schema(404) end test "returns 404 for internal.fetch actor", %{conn: conn} do %User{nickname: "internal.fetch"} = InternalFetchActor.get_actor() - resp = - conn - |> get("/api/v1/accounts/internal.fetch") - |> json_response(404) - - assert %{"error" => "Can't find user"} = resp + assert %{"error" => "Can't find user"} = + conn + |> get("/api/v1/accounts/internal.fetch") + |> json_response_and_validate_schema(404) end end @@ -155,27 +143,25 @@ defp local_and_remote_users do setup do: clear_config([:restrict_unauthenticated, :profiles, :remote], true) test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do - res_conn = get(conn, "/api/v1/accounts/#{local.id}") + assert %{"error" => "Can't find user"} == + conn + |> get("/api/v1/accounts/#{local.id}") + |> json_response_and_validate_schema(:not_found) - assert json_response(res_conn, :not_found) == %{ - "error" => "Can't find user" - } - - res_conn = get(conn, "/api/v1/accounts/#{remote.id}") - - assert json_response(res_conn, :not_found) == %{ - "error" => "Can't find user" - } + assert %{"error" => "Can't find user"} == + conn + |> get("/api/v1/accounts/#{remote.id}") + |> json_response_and_validate_schema(:not_found) end test "if user is authenticated", %{local: local, remote: remote} do %{conn: conn} = oauth_access(["read"]) res_conn = get(conn, "/api/v1/accounts/#{local.id}") - assert %{"id" => _} = json_response(res_conn, 200) + assert %{"id" => _} = json_response_and_validate_schema(res_conn, 200) res_conn = get(conn, "/api/v1/accounts/#{remote.id}") - assert %{"id" => _} = json_response(res_conn, 200) + assert %{"id" => _} = json_response_and_validate_schema(res_conn, 200) end end @@ -187,22 +173,22 @@ test "if user is authenticated", %{local: local, remote: remote} do test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do res_conn = get(conn, "/api/v1/accounts/#{local.id}") - assert json_response(res_conn, :not_found) == %{ + assert json_response_and_validate_schema(res_conn, :not_found) == %{ "error" => "Can't find user" } res_conn = get(conn, "/api/v1/accounts/#{remote.id}") - assert %{"id" => _} = json_response(res_conn, 200) + assert %{"id" => _} = json_response_and_validate_schema(res_conn, 200) end test "if user is authenticated", %{local: local, remote: remote} do %{conn: conn} = oauth_access(["read"]) res_conn = get(conn, "/api/v1/accounts/#{local.id}") - assert %{"id" => _} = json_response(res_conn, 200) + assert %{"id" => _} = json_response_and_validate_schema(res_conn, 200) res_conn = get(conn, "/api/v1/accounts/#{remote.id}") - assert %{"id" => _} = json_response(res_conn, 200) + assert %{"id" => _} = json_response_and_validate_schema(res_conn, 200) end end @@ -213,11 +199,11 @@ test "if user is authenticated", %{local: local, remote: remote} do test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do res_conn = get(conn, "/api/v1/accounts/#{local.id}") - assert %{"id" => _} = json_response(res_conn, 200) + assert %{"id" => _} = json_response_and_validate_schema(res_conn, 200) res_conn = get(conn, "/api/v1/accounts/#{remote.id}") - assert json_response(res_conn, :not_found) == %{ + assert json_response_and_validate_schema(res_conn, :not_found) == %{ "error" => "Can't find user" } end @@ -226,46 +212,83 @@ test "if user is authenticated", %{local: local, remote: remote} do %{conn: conn} = oauth_access(["read"]) res_conn = get(conn, "/api/v1/accounts/#{local.id}") - assert %{"id" => _} = json_response(res_conn, 200) + assert %{"id" => _} = json_response_and_validate_schema(res_conn, 200) res_conn = get(conn, "/api/v1/accounts/#{remote.id}") - assert %{"id" => _} = json_response(res_conn, 200) + assert %{"id" => _} = json_response_and_validate_schema(res_conn, 200) end end describe "user timelines" do setup do: oauth_access(["read:statuses"]) + test "works with announces that are just addressed to public", %{conn: conn} do + user = insert(:user, ap_id: "https://honktest/u/test", local: false) + other_user = insert(:user) + + {:ok, post} = CommonAPI.post(other_user, %{status: "bonkeronk"}) + + {:ok, announce, _} = + %{ + "@context" => "https://www.w3.org/ns/activitystreams", + "actor" => "https://honktest/u/test", + "id" => "https://honktest/u/test/bonk/1793M7B9MQ48847vdx", + "object" => post.data["object"], + "published" => "2019-06-25T19:33:58Z", + "to" => ["https://www.w3.org/ns/activitystreams#Public"], + "type" => "Announce" + } + |> ActivityPub.persist(local: false) + + assert resp = + conn + |> get("/api/v1/accounts/#{user.id}/statuses") + |> json_response_and_validate_schema(200) + + assert [%{"id" => id}] = resp + assert id == announce.id + end + test "respects blocks", %{user: user_one, conn: conn} do user_two = insert(:user) user_three = insert(:user) User.block(user_one, user_two) - {:ok, activity} = CommonAPI.post(user_two, %{"status" => "User one sux0rz"}) - {:ok, repeat, _} = CommonAPI.repeat(activity.id, user_three) + {:ok, activity} = CommonAPI.post(user_two, %{status: "User one sux0rz"}) + {:ok, repeat} = CommonAPI.repeat(activity.id, user_three) - resp = get(conn, "/api/v1/accounts/#{user_two.id}/statuses") + assert resp = + conn + |> get("/api/v1/accounts/#{user_two.id}/statuses") + |> json_response_and_validate_schema(200) - assert [%{"id" => id}] = json_response(resp, 200) + assert [%{"id" => id}] = resp assert id == activity.id # Even a blocked user will deliver the full user timeline, there would be # no point in looking at a blocked users timeline otherwise - resp = get(conn, "/api/v1/accounts/#{user_two.id}/statuses") + assert resp = + conn + |> get("/api/v1/accounts/#{user_two.id}/statuses") + |> json_response_and_validate_schema(200) - assert [%{"id" => id}] = json_response(resp, 200) + assert [%{"id" => id}] = resp assert id == activity.id # Third user's timeline includes the repeat when viewed by unauthenticated user - resp = get(build_conn(), "/api/v1/accounts/#{user_three.id}/statuses") - assert [%{"id" => id}] = json_response(resp, 200) + resp = + build_conn() + |> get("/api/v1/accounts/#{user_three.id}/statuses") + |> json_response_and_validate_schema(200) + + assert [%{"id" => id}] = resp assert id == repeat.id # When viewing a third user's timeline, the blocked users' statuses will NOT be shown resp = get(conn, "/api/v1/accounts/#{user_three.id}/statuses") - assert [] = json_response(resp, 200) + assert [] == json_response_and_validate_schema(resp, 200) end test "gets users statuses", %{conn: conn} do @@ -275,20 +298,24 @@ test "gets users statuses", %{conn: conn} do {:ok, _user_three} = User.follow(user_three, user_one) - {:ok, activity} = CommonAPI.post(user_one, %{"status" => "HI!!!"}) + {:ok, activity} = CommonAPI.post(user_one, %{status: "HI!!!"}) {:ok, direct_activity} = CommonAPI.post(user_one, %{ - "status" => "Hi, @#{user_two.nickname}.", - "visibility" => "direct" + status: "Hi, @#{user_two.nickname}.", + visibility: "direct" }) {:ok, private_activity} = - CommonAPI.post(user_one, %{"status" => "private", "visibility" => "private"}) + CommonAPI.post(user_one, %{status: "private", visibility: "private"}) - resp = get(conn, "/api/v1/accounts/#{user_one.id}/statuses") + # TODO!!! + resp = + conn + |> get("/api/v1/accounts/#{user_one.id}/statuses") + |> json_response_and_validate_schema(200) - assert [%{"id" => id}] = json_response(resp, 200) + assert [%{"id" => id}] = resp assert id == to_string(activity.id) resp = @@ -296,8 +323,9 @@ test "gets users statuses", %{conn: conn} do |> assign(:user, user_two) |> assign(:token, insert(:oauth_token, user: user_two, scopes: ["read:statuses"])) |> get("/api/v1/accounts/#{user_one.id}/statuses") + |> json_response_and_validate_schema(200) - assert [%{"id" => id_one}, %{"id" => id_two}] = json_response(resp, 200) + assert [%{"id" => id_one}, %{"id" => id_two}] = resp assert id_one == to_string(direct_activity.id) assert id_two == to_string(activity.id) @@ -306,8 +334,9 @@ test "gets users statuses", %{conn: conn} do |> assign(:user, user_three) |> assign(:token, insert(:oauth_token, user: user_three, scopes: ["read:statuses"])) |> get("/api/v1/accounts/#{user_one.id}/statuses") + |> json_response_and_validate_schema(200) - assert [%{"id" => id_one}, %{"id" => id_two}] = json_response(resp, 200) + assert [%{"id" => id_one}, %{"id" => id_two}] = resp assert id_one == to_string(private_activity.id) assert id_two == to_string(activity.id) end @@ -318,7 +347,7 @@ test "unimplemented pinned statuses feature", %{conn: conn} do conn = get(conn, "/api/v1/accounts/#{user.id}/statuses?pinned=true") - assert json_response(conn, 200) == [] + assert json_response_and_validate_schema(conn, 200) == [] end test "gets an users media", %{conn: conn} do @@ -333,56 +362,47 @@ test "gets an users media", %{conn: conn} do {:ok, %{id: media_id}} = ActivityPub.upload(file, actor: user.ap_id) - {:ok, image_post} = CommonAPI.post(user, %{"status" => "cofe", "media_ids" => [media_id]}) + {:ok, %{id: image_post_id}} = CommonAPI.post(user, %{status: "cofe", media_ids: [media_id]}) - conn = get(conn, "/api/v1/accounts/#{user.id}/statuses", %{"only_media" => "true"}) + conn = get(conn, "/api/v1/accounts/#{user.id}/statuses?only_media=true") - assert [%{"id" => id}] = json_response(conn, 200) - assert id == to_string(image_post.id) + assert [%{"id" => ^image_post_id}] = json_response_and_validate_schema(conn, 200) - conn = get(build_conn(), "/api/v1/accounts/#{user.id}/statuses", %{"only_media" => "1"}) + conn = get(build_conn(), "/api/v1/accounts/#{user.id}/statuses?only_media=1") - assert [%{"id" => id}] = json_response(conn, 200) - assert id == to_string(image_post.id) + assert [%{"id" => ^image_post_id}] = json_response_and_validate_schema(conn, 200) end test "gets a user's statuses without reblogs", %{user: user, conn: conn} do - {:ok, post} = CommonAPI.post(user, %{"status" => "HI!!!"}) - {:ok, _, _} = CommonAPI.repeat(post.id, user) + {:ok, %{id: post_id}} = CommonAPI.post(user, %{status: "HI!!!"}) + {:ok, _} = CommonAPI.repeat(post_id, user) - conn = get(conn, "/api/v1/accounts/#{user.id}/statuses", %{"exclude_reblogs" => "true"}) + conn = get(conn, "/api/v1/accounts/#{user.id}/statuses?exclude_reblogs=true") + assert [%{"id" => ^post_id}] = json_response_and_validate_schema(conn, 200) - assert [%{"id" => id}] = json_response(conn, 200) - assert id == to_string(post.id) - - conn = get(conn, "/api/v1/accounts/#{user.id}/statuses", %{"exclude_reblogs" => "1"}) - - assert [%{"id" => id}] = json_response(conn, 200) - assert id == to_string(post.id) + conn = get(conn, "/api/v1/accounts/#{user.id}/statuses?exclude_reblogs=1") + assert [%{"id" => ^post_id}] = json_response_and_validate_schema(conn, 200) end test "filters user's statuses by a hashtag", %{user: user, conn: conn} do - {:ok, post} = CommonAPI.post(user, %{"status" => "#hashtag"}) - {:ok, _post} = CommonAPI.post(user, %{"status" => "hashtag"}) + {:ok, %{id: post_id}} = CommonAPI.post(user, %{status: "#hashtag"}) + {:ok, _post} = CommonAPI.post(user, %{status: "hashtag"}) - conn = get(conn, "/api/v1/accounts/#{user.id}/statuses", %{"tagged" => "hashtag"}) - - assert [%{"id" => id}] = json_response(conn, 200) - assert id == to_string(post.id) + conn = get(conn, "/api/v1/accounts/#{user.id}/statuses?tagged=hashtag") + assert [%{"id" => ^post_id}] = json_response_and_validate_schema(conn, 200) end test "the user views their own timelines and excludes direct messages", %{ user: user, conn: conn } do - {:ok, public_activity} = CommonAPI.post(user, %{"status" => ".", "visibility" => "public"}) - {:ok, _direct_activity} = CommonAPI.post(user, %{"status" => ".", "visibility" => "direct"}) + {:ok, %{id: public_activity_id}} = + CommonAPI.post(user, %{status: ".", visibility: "public"}) - conn = - get(conn, "/api/v1/accounts/#{user.id}/statuses", %{"exclude_visibilities" => ["direct"]}) + {:ok, _direct_activity} = CommonAPI.post(user, %{status: ".", visibility: "direct"}) - assert [%{"id" => id}] = json_response(conn, 200) - assert id == to_string(public_activity.id) + conn = get(conn, "/api/v1/accounts/#{user.id}/statuses?exclude_visibilities[]=direct") + assert [%{"id" => ^public_activity_id}] = json_response_and_validate_schema(conn, 200) end end @@ -402,27 +422,25 @@ defp local_and_remote_activities(%{local: local, remote: remote}) do setup do: clear_config([:restrict_unauthenticated, :profiles, :remote], true) test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do - res_conn = get(conn, "/api/v1/accounts/#{local.id}/statuses") + assert %{"error" => "Can't find user"} == + conn + |> get("/api/v1/accounts/#{local.id}/statuses") + |> json_response_and_validate_schema(:not_found) - assert json_response(res_conn, :not_found) == %{ - "error" => "Can't find user" - } - - res_conn = get(conn, "/api/v1/accounts/#{remote.id}/statuses") - - assert json_response(res_conn, :not_found) == %{ - "error" => "Can't find user" - } + assert %{"error" => "Can't find user"} == + conn + |> get("/api/v1/accounts/#{remote.id}/statuses") + |> json_response_and_validate_schema(:not_found) end test "if user is authenticated", %{local: local, remote: remote} do %{conn: conn} = oauth_access(["read"]) res_conn = get(conn, "/api/v1/accounts/#{local.id}/statuses") - assert length(json_response(res_conn, 200)) == 1 + assert length(json_response_and_validate_schema(res_conn, 200)) == 1 res_conn = get(conn, "/api/v1/accounts/#{remote.id}/statuses") - assert length(json_response(res_conn, 200)) == 1 + assert length(json_response_and_validate_schema(res_conn, 200)) == 1 end end @@ -433,24 +451,23 @@ test "if user is authenticated", %{local: local, remote: remote} do setup do: clear_config([:restrict_unauthenticated, :profiles, :local], true) test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do - res_conn = get(conn, "/api/v1/accounts/#{local.id}/statuses") - - assert json_response(res_conn, :not_found) == %{ - "error" => "Can't find user" - } + assert %{"error" => "Can't find user"} == + conn + |> get("/api/v1/accounts/#{local.id}/statuses") + |> json_response_and_validate_schema(:not_found) res_conn = get(conn, "/api/v1/accounts/#{remote.id}/statuses") - assert length(json_response(res_conn, 200)) == 1 + assert length(json_response_and_validate_schema(res_conn, 200)) == 1 end test "if user is authenticated", %{local: local, remote: remote} do %{conn: conn} = oauth_access(["read"]) res_conn = get(conn, "/api/v1/accounts/#{local.id}/statuses") - assert length(json_response(res_conn, 200)) == 1 + assert length(json_response_and_validate_schema(res_conn, 200)) == 1 res_conn = get(conn, "/api/v1/accounts/#{remote.id}/statuses") - assert length(json_response(res_conn, 200)) == 1 + assert length(json_response_and_validate_schema(res_conn, 200)) == 1 end end @@ -462,23 +479,22 @@ test "if user is authenticated", %{local: local, remote: remote} do test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do res_conn = get(conn, "/api/v1/accounts/#{local.id}/statuses") - assert length(json_response(res_conn, 200)) == 1 + assert length(json_response_and_validate_schema(res_conn, 200)) == 1 - res_conn = get(conn, "/api/v1/accounts/#{remote.id}/statuses") - - assert json_response(res_conn, :not_found) == %{ - "error" => "Can't find user" - } + assert %{"error" => "Can't find user"} == + conn + |> get("/api/v1/accounts/#{remote.id}/statuses") + |> json_response_and_validate_schema(:not_found) end test "if user is authenticated", %{local: local, remote: remote} do %{conn: conn} = oauth_access(["read"]) res_conn = get(conn, "/api/v1/accounts/#{local.id}/statuses") - assert length(json_response(res_conn, 200)) == 1 + assert length(json_response_and_validate_schema(res_conn, 200)) == 1 res_conn = get(conn, "/api/v1/accounts/#{remote.id}/statuses") - assert length(json_response(res_conn, 200)) == 1 + assert length(json_response_and_validate_schema(res_conn, 200)) == 1 end end @@ -487,12 +503,11 @@ test "if user is authenticated", %{local: local, remote: remote} do test "getting followers", %{user: user, conn: conn} do other_user = insert(:user) - {:ok, user} = User.follow(user, other_user) + {:ok, %{id: user_id}} = User.follow(user, other_user) conn = get(conn, "/api/v1/accounts/#{other_user.id}/followers") - assert [%{"id" => id}] = json_response(conn, 200) - assert id == to_string(user.id) + assert [%{"id" => ^user_id}] = json_response_and_validate_schema(conn, 200) end test "getting followers, hide_followers", %{user: user, conn: conn} do @@ -501,7 +516,7 @@ test "getting followers, hide_followers", %{user: user, conn: conn} do conn = get(conn, "/api/v1/accounts/#{other_user.id}/followers") - assert [] == json_response(conn, 200) + assert [] == json_response_and_validate_schema(conn, 200) end test "getting followers, hide_followers, same user requesting" do @@ -515,37 +530,31 @@ test "getting followers, hide_followers, same user requesting" do |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["read:accounts"])) |> get("/api/v1/accounts/#{other_user.id}/followers") - refute [] == json_response(conn, 200) + refute [] == json_response_and_validate_schema(conn, 200) end test "getting followers, pagination", %{user: user, conn: conn} do - follower1 = insert(:user) - follower2 = insert(:user) - follower3 = insert(:user) - {:ok, _} = User.follow(follower1, user) - {:ok, _} = User.follow(follower2, user) - {:ok, _} = User.follow(follower3, user) + {:ok, %User{id: follower1_id}} = :user |> insert() |> User.follow(user) + {:ok, %User{id: follower2_id}} = :user |> insert() |> User.follow(user) + {:ok, %User{id: follower3_id}} = :user |> insert() |> User.follow(user) - res_conn = get(conn, "/api/v1/accounts/#{user.id}/followers?since_id=#{follower1.id}") + assert [%{"id" => ^follower3_id}, %{"id" => ^follower2_id}] = + conn + |> get("/api/v1/accounts/#{user.id}/followers?since_id=#{follower1_id}") + |> json_response_and_validate_schema(200) - assert [%{"id" => id3}, %{"id" => id2}] = json_response(res_conn, 200) - assert id3 == follower3.id - assert id2 == follower2.id + assert [%{"id" => ^follower2_id}, %{"id" => ^follower1_id}] = + conn + |> get("/api/v1/accounts/#{user.id}/followers?max_id=#{follower3_id}") + |> json_response_and_validate_schema(200) - res_conn = get(conn, "/api/v1/accounts/#{user.id}/followers?max_id=#{follower3.id}") + res_conn = get(conn, "/api/v1/accounts/#{user.id}/followers?limit=1&max_id=#{follower3_id}") - assert [%{"id" => id2}, %{"id" => id1}] = json_response(res_conn, 200) - assert id2 == follower2.id - assert id1 == follower1.id - - res_conn = get(conn, "/api/v1/accounts/#{user.id}/followers?limit=1&max_id=#{follower3.id}") - - assert [%{"id" => id2}] = json_response(res_conn, 200) - assert id2 == follower2.id + assert [%{"id" => ^follower2_id}] = json_response_and_validate_schema(res_conn, 200) assert [link_header] = get_resp_header(res_conn, "link") - assert link_header =~ ~r/min_id=#{follower2.id}/ - assert link_header =~ ~r/max_id=#{follower2.id}/ + assert link_header =~ ~r/min_id=#{follower2_id}/ + assert link_header =~ ~r/max_id=#{follower2_id}/ end end @@ -558,7 +567,7 @@ test "getting following", %{user: user, conn: conn} do conn = get(conn, "/api/v1/accounts/#{user.id}/following") - assert [%{"id" => id}] = json_response(conn, 200) + assert [%{"id" => id}] = json_response_and_validate_schema(conn, 200) assert id == to_string(other_user.id) end @@ -573,7 +582,7 @@ test "getting following, hide_follows, other user requesting" do |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["read:accounts"])) |> get("/api/v1/accounts/#{user.id}/following") - assert [] == json_response(conn, 200) + assert [] == json_response_and_validate_schema(conn, 200) end test "getting following, hide_follows, same user requesting" do @@ -587,7 +596,7 @@ test "getting following, hide_follows, same user requesting" do |> assign(:token, insert(:oauth_token, user: user, scopes: ["read:accounts"])) |> get("/api/v1/accounts/#{user.id}/following") - refute [] == json_response(conn, 200) + refute [] == json_response_and_validate_schema(conn, 200) end test "getting following, pagination", %{user: user, conn: conn} do @@ -600,20 +609,20 @@ test "getting following, pagination", %{user: user, conn: conn} do res_conn = get(conn, "/api/v1/accounts/#{user.id}/following?since_id=#{following1.id}") - assert [%{"id" => id3}, %{"id" => id2}] = json_response(res_conn, 200) + assert [%{"id" => id3}, %{"id" => id2}] = json_response_and_validate_schema(res_conn, 200) assert id3 == following3.id assert id2 == following2.id res_conn = get(conn, "/api/v1/accounts/#{user.id}/following?max_id=#{following3.id}") - assert [%{"id" => id2}, %{"id" => id1}] = json_response(res_conn, 200) + assert [%{"id" => id2}, %{"id" => id1}] = json_response_and_validate_schema(res_conn, 200) assert id2 == following2.id assert id1 == following1.id res_conn = get(conn, "/api/v1/accounts/#{user.id}/following?limit=1&max_id=#{following3.id}") - assert [%{"id" => id2}] = json_response(res_conn, 200) + assert [%{"id" => id2}] = json_response_and_validate_schema(res_conn, 200) assert id2 == following2.id assert [link_header] = get_resp_header(res_conn, "link") @@ -626,30 +635,37 @@ test "getting following, pagination", %{user: user, conn: conn} do setup do: oauth_access(["follow"]) test "following / unfollowing a user", %{conn: conn} do - other_user = insert(:user) + %{id: other_user_id, nickname: other_user_nickname} = insert(:user) - ret_conn = post(conn, "/api/v1/accounts/#{other_user.id}/follow") + assert %{"id" => _id, "following" => true} = + conn + |> post("/api/v1/accounts/#{other_user_id}/follow") + |> json_response_and_validate_schema(200) - assert %{"id" => _id, "following" => true} = json_response(ret_conn, 200) + assert %{"id" => _id, "following" => false} = + conn + |> post("/api/v1/accounts/#{other_user_id}/unfollow") + |> json_response_and_validate_schema(200) - ret_conn = post(conn, "/api/v1/accounts/#{other_user.id}/unfollow") - - assert %{"id" => _id, "following" => false} = json_response(ret_conn, 200) - - conn = post(conn, "/api/v1/follows", %{"uri" => other_user.nickname}) - - assert %{"id" => id} = json_response(conn, 200) - assert id == to_string(other_user.id) + assert %{"id" => ^other_user_id} = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/follows", %{"uri" => other_user_nickname}) + |> json_response_and_validate_schema(200) end test "cancelling follow request", %{conn: conn} do %{id: other_user_id} = insert(:user, %{locked: true}) assert %{"id" => ^other_user_id, "following" => false, "requested" => true} = - conn |> post("/api/v1/accounts/#{other_user_id}/follow") |> json_response(:ok) + conn + |> post("/api/v1/accounts/#{other_user_id}/follow") + |> json_response_and_validate_schema(:ok) assert %{"id" => ^other_user_id, "following" => false, "requested" => false} = - conn |> post("/api/v1/accounts/#{other_user_id}/unfollow") |> json_response(:ok) + conn + |> post("/api/v1/accounts/#{other_user_id}/unfollow") + |> json_response_and_validate_schema(:ok) end test "following without reblogs" do @@ -659,51 +675,65 @@ test "following without reblogs" do ret_conn = post(conn, "/api/v1/accounts/#{followed.id}/follow?reblogs=false") - assert %{"showing_reblogs" => false} = json_response(ret_conn, 200) + assert %{"showing_reblogs" => false} = json_response_and_validate_schema(ret_conn, 200) - {:ok, activity} = CommonAPI.post(other_user, %{"status" => "hey"}) - {:ok, reblog, _} = CommonAPI.repeat(activity.id, followed) + {:ok, activity} = CommonAPI.post(other_user, %{status: "hey"}) + {:ok, %{id: reblog_id}} = CommonAPI.repeat(activity.id, followed) - ret_conn = get(conn, "/api/v1/timelines/home") + assert [] == + conn + |> get("/api/v1/timelines/home") + |> json_response(200) - assert [] == json_response(ret_conn, 200) + assert %{"showing_reblogs" => true} = + conn + |> post("/api/v1/accounts/#{followed.id}/follow?reblogs=true") + |> json_response_and_validate_schema(200) - ret_conn = post(conn, "/api/v1/accounts/#{followed.id}/follow?reblogs=true") - - assert %{"showing_reblogs" => true} = json_response(ret_conn, 200) - - conn = get(conn, "/api/v1/timelines/home") - - expected_activity_id = reblog.id - assert [%{"id" => ^expected_activity_id}] = json_response(conn, 200) + assert [%{"id" => ^reblog_id}] = + conn + |> get("/api/v1/timelines/home") + |> json_response(200) end test "following / unfollowing errors", %{user: user, conn: conn} do # self follow conn_res = post(conn, "/api/v1/accounts/#{user.id}/follow") - assert %{"error" => "Record not found"} = json_response(conn_res, 404) + + assert %{"error" => "Can not follow yourself"} = + json_response_and_validate_schema(conn_res, 400) # self unfollow user = User.get_cached_by_id(user.id) conn_res = post(conn, "/api/v1/accounts/#{user.id}/unfollow") - assert %{"error" => "Record not found"} = json_response(conn_res, 404) + + assert %{"error" => "Can not unfollow yourself"} = + json_response_and_validate_schema(conn_res, 400) # self follow via uri user = User.get_cached_by_id(user.id) - conn_res = post(conn, "/api/v1/follows", %{"uri" => user.nickname}) - assert %{"error" => "Record not found"} = json_response(conn_res, 404) + + assert %{"error" => "Can not follow yourself"} = + conn + |> put_req_header("content-type", "multipart/form-data") + |> post("/api/v1/follows", %{"uri" => user.nickname}) + |> json_response_and_validate_schema(400) # follow non existing user conn_res = post(conn, "/api/v1/accounts/doesntexist/follow") - assert %{"error" => "Record not found"} = json_response(conn_res, 404) + assert %{"error" => "Record not found"} = json_response_and_validate_schema(conn_res, 404) # follow non existing user via uri - conn_res = post(conn, "/api/v1/follows", %{"uri" => "doesntexist"}) - assert %{"error" => "Record not found"} = json_response(conn_res, 404) + conn_res = + conn + |> put_req_header("content-type", "multipart/form-data") + |> post("/api/v1/follows", %{"uri" => "doesntexist"}) + + assert %{"error" => "Record not found"} = json_response_and_validate_schema(conn_res, 404) # unfollow non existing user conn_res = post(conn, "/api/v1/accounts/doesntexist/unfollow") - assert %{"error" => "Record not found"} = json_response(conn_res, 404) + assert %{"error" => "Record not found"} = json_response_and_validate_schema(conn_res, 404) end end @@ -713,55 +743,52 @@ test "following / unfollowing errors", %{user: user, conn: conn} do test "with notifications", %{conn: conn} do other_user = insert(:user) - ret_conn = post(conn, "/api/v1/accounts/#{other_user.id}/mute") - - response = json_response(ret_conn, 200) - - assert %{"id" => _id, "muting" => true, "muting_notifications" => true} = response + assert %{"id" => _id, "muting" => true, "muting_notifications" => true} = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/accounts/#{other_user.id}/mute") + |> json_response_and_validate_schema(200) conn = post(conn, "/api/v1/accounts/#{other_user.id}/unmute") - response = json_response(conn, 200) - assert %{"id" => _id, "muting" => false, "muting_notifications" => false} = response + assert %{"id" => _id, "muting" => false, "muting_notifications" => false} = + json_response_and_validate_schema(conn, 200) end test "without notifications", %{conn: conn} do other_user = insert(:user) ret_conn = - post(conn, "/api/v1/accounts/#{other_user.id}/mute", %{"notifications" => "false"}) + conn + |> put_req_header("content-type", "multipart/form-data") + |> post("/api/v1/accounts/#{other_user.id}/mute", %{"notifications" => "false"}) - response = json_response(ret_conn, 200) - - assert %{"id" => _id, "muting" => true, "muting_notifications" => false} = response + assert %{"id" => _id, "muting" => true, "muting_notifications" => false} = + json_response_and_validate_schema(ret_conn, 200) conn = post(conn, "/api/v1/accounts/#{other_user.id}/unmute") - response = json_response(conn, 200) - assert %{"id" => _id, "muting" => false, "muting_notifications" => false} = response + assert %{"id" => _id, "muting" => false, "muting_notifications" => false} = + json_response_and_validate_schema(conn, 200) end end describe "pinned statuses" do setup do user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "HI!!!"}) + {:ok, activity} = CommonAPI.post(user, %{status: "HI!!!"}) %{conn: conn} = oauth_access(["read:statuses"], user: user) [conn: conn, user: user, activity: activity] end - test "returns pinned statuses", %{conn: conn, user: user, activity: activity} do - {:ok, _} = CommonAPI.pin(activity.id, user) + test "returns pinned statuses", %{conn: conn, user: user, activity: %{id: activity_id}} do + {:ok, _} = CommonAPI.pin(activity_id, user) - result = - conn - |> get("/api/v1/accounts/#{user.id}/statuses?pinned=true") - |> json_response(200) - - id_str = to_string(activity.id) - - assert [%{"id" => ^id_str, "pinned" => true}] = result + assert [%{"id" => ^activity_id, "pinned" => true}] = + conn + |> get("/api/v1/accounts/#{user.id}/statuses?pinned=true") + |> json_response_and_validate_schema(200) end end @@ -771,11 +798,11 @@ test "blocking / unblocking a user" do ret_conn = post(conn, "/api/v1/accounts/#{other_user.id}/block") - assert %{"id" => _id, "blocking" => true} = json_response(ret_conn, 200) + assert %{"id" => _id, "blocking" => true} = json_response_and_validate_schema(ret_conn, 200) conn = post(conn, "/api/v1/accounts/#{other_user.id}/unblock") - assert %{"id" => _id, "blocking" => false} = json_response(conn, 200) + assert %{"id" => _id, "blocking" => false} = json_response_and_validate_schema(conn, 200) end describe "create account by app" do @@ -794,21 +821,23 @@ test "blocking / unblocking a user" do test "Account registration via Application", %{conn: conn} do conn = - post(conn, "/api/v1/apps", %{ + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/apps", %{ client_name: "client_name", redirect_uris: "urn:ietf:wg:oauth:2.0:oob", scopes: "read, write, follow" }) - %{ - "client_id" => client_id, - "client_secret" => client_secret, - "id" => _, - "name" => "client_name", - "redirect_uri" => "urn:ietf:wg:oauth:2.0:oob", - "vapid_key" => _, - "website" => nil - } = json_response(conn, 200) + assert %{ + "client_id" => client_id, + "client_secret" => client_secret, + "id" => _, + "name" => "client_name", + "redirect_uri" => "urn:ietf:wg:oauth:2.0:oob", + "vapid_key" => _, + "website" => nil + } = json_response_and_validate_schema(conn, 200) conn = post(conn, "/oauth/token", %{ @@ -828,6 +857,7 @@ test "Account registration via Application", %{conn: conn} do conn = build_conn() + |> put_req_header("content-type", "multipart/form-data") |> put_req_header("authorization", "Bearer " <> token) |> post("/api/v1/accounts", %{ username: "lain", @@ -842,7 +872,7 @@ test "Account registration via Application", %{conn: conn} do "created_at" => _created_at, "scope" => _scope, "token_type" => "Bearer" - } = json_response(conn, 200) + } = json_response_and_validate_schema(conn, 200) token_from_db = Repo.get_by(Token, token: token) assert token_from_db @@ -856,12 +886,15 @@ test "returns error when user already registred", %{conn: conn, valid_params: va _user = insert(:user, email: "lain@example.org") app_token = insert(:oauth_token, user: nil) - conn = + res = conn |> put_req_header("authorization", "Bearer " <> app_token.token) + |> put_req_header("content-type", "application/json") + |> post("/api/v1/accounts", valid_params) - res = post(conn, "/api/v1/accounts", valid_params) - assert json_response(res, 400) == %{"error" => "{\"email\":[\"has already been taken\"]}"} + assert json_response_and_validate_schema(res, 400) == %{ + "error" => "{\"email\":[\"has already been taken\"]}" + } end test "returns bad_request if missing required params", %{ @@ -870,10 +903,13 @@ test "returns bad_request if missing required params", %{ } do app_token = insert(:oauth_token, user: nil) - conn = put_req_header(conn, "authorization", "Bearer " <> app_token.token) + conn = + conn + |> put_req_header("authorization", "Bearer " <> app_token.token) + |> put_req_header("content-type", "application/json") res = post(conn, "/api/v1/accounts", valid_params) - assert json_response(res, 200) + assert json_response_and_validate_schema(res, 200) [{127, 0, 0, 1}, {127, 0, 0, 2}, {127, 0, 0, 3}, {127, 0, 0, 4}] |> Stream.zip(Map.delete(valid_params, :email)) @@ -882,9 +918,18 @@ test "returns bad_request if missing required params", %{ conn |> Map.put(:remote_ip, ip) |> post("/api/v1/accounts", Map.delete(valid_params, attr)) - |> json_response(400) + |> json_response_and_validate_schema(400) - assert res == %{"error" => "Missing parameters"} + assert res == %{ + "error" => "Missing field: #{attr}.", + "errors" => [ + %{ + "message" => "Missing field: #{attr}", + "source" => %{"pointer" => "/#{attr}"}, + "title" => "Invalid value" + } + ] + } end) end @@ -895,21 +940,28 @@ test "returns bad_request if missing email params when :account_activation_requi Pleroma.Config.put([:instance, :account_activation_required], true) app_token = insert(:oauth_token, user: nil) - conn = put_req_header(conn, "authorization", "Bearer " <> app_token.token) + + conn = + conn + |> put_req_header("authorization", "Bearer " <> app_token.token) + |> put_req_header("content-type", "application/json") res = conn |> Map.put(:remote_ip, {127, 0, 0, 5}) |> post("/api/v1/accounts", Map.delete(valid_params, :email)) - assert json_response(res, 400) == %{"error" => "Missing parameters"} + assert json_response_and_validate_schema(res, 400) == + %{"error" => "Missing parameter: email"} res = conn |> Map.put(:remote_ip, {127, 0, 0, 6}) |> post("/api/v1/accounts", Map.put(valid_params, :email, "")) - assert json_response(res, 400) == %{"error" => "{\"email\":[\"can't be blank\"]}"} + assert json_response_and_validate_schema(res, 400) == %{ + "error" => "{\"email\":[\"can't be blank\"]}" + } end test "allow registration without an email", %{conn: conn, valid_params: valid_params} do @@ -918,10 +970,11 @@ test "allow registration without an email", %{conn: conn, valid_params: valid_pa res = conn + |> put_req_header("content-type", "application/json") |> Map.put(:remote_ip, {127, 0, 0, 7}) |> post("/api/v1/accounts", Map.delete(valid_params, :email)) - assert json_response(res, 200) + assert json_response_and_validate_schema(res, 200) end test "allow registration with an empty email", %{conn: conn, valid_params: valid_params} do @@ -930,17 +983,89 @@ test "allow registration with an empty email", %{conn: conn, valid_params: valid res = conn + |> put_req_header("content-type", "application/json") |> Map.put(:remote_ip, {127, 0, 0, 8}) |> post("/api/v1/accounts", Map.put(valid_params, :email, "")) - assert json_response(res, 200) + assert json_response_and_validate_schema(res, 200) end test "returns forbidden if token is invalid", %{conn: conn, valid_params: valid_params} do - conn = put_req_header(conn, "authorization", "Bearer " <> "invalid-token") + res = + conn + |> put_req_header("authorization", "Bearer " <> "invalid-token") + |> put_req_header("content-type", "multipart/form-data") + |> post("/api/v1/accounts", valid_params) - res = post(conn, "/api/v1/accounts", valid_params) - assert json_response(res, 403) == %{"error" => "Invalid credentials"} + assert json_response_and_validate_schema(res, 403) == %{"error" => "Invalid credentials"} + end + + test "registration from trusted app" do + clear_config([Pleroma.Captcha, :enabled], true) + app = insert(:oauth_app, trusted: true, scopes: ["read", "write", "follow", "push"]) + + conn = + build_conn() + |> post("/oauth/token", %{ + "grant_type" => "client_credentials", + "client_id" => app.client_id, + "client_secret" => app.client_secret + }) + + assert %{"access_token" => token, "token_type" => "Bearer"} = json_response(conn, 200) + + response = + build_conn() + |> Plug.Conn.put_req_header("authorization", "Bearer " <> token) + |> put_req_header("content-type", "multipart/form-data") + |> post("/api/v1/accounts", %{ + nickname: "nickanme", + agreement: true, + email: "email@example.com", + fullname: "Lain", + username: "Lain", + password: "some_password", + confirm: "some_password" + }) + |> json_response_and_validate_schema(200) + + assert %{ + "access_token" => access_token, + "created_at" => _, + "scope" => ["read", "write", "follow", "push"], + "token_type" => "Bearer" + } = response + + response = + build_conn() + |> Plug.Conn.put_req_header("authorization", "Bearer " <> access_token) + |> get("/api/v1/accounts/verify_credentials") + |> json_response_and_validate_schema(200) + + assert %{ + "acct" => "Lain", + "bot" => false, + "display_name" => "Lain", + "follow_requests_count" => 0, + "followers_count" => 0, + "following_count" => 0, + "locked" => false, + "note" => "", + "source" => %{ + "fields" => [], + "note" => "", + "pleroma" => %{ + "actor_type" => "Person", + "discoverable" => false, + "no_rich_text" => false, + "show_role" => true + }, + "privacy" => "public", + "sensitive" => false + }, + "statuses_count" => 0, + "username" => "Lain" + } = response end end @@ -954,10 +1079,12 @@ test "respects rate limit setting", %{conn: conn} do conn |> put_req_header("authorization", "Bearer " <> app_token.token) |> Map.put(:remote_ip, {15, 15, 15, 15}) + |> put_req_header("content-type", "multipart/form-data") for i <- 1..2 do conn = - post(conn, "/api/v1/accounts", %{ + conn + |> post("/api/v1/accounts", %{ username: "#{i}lain", email: "#{i}lain@example.org", password: "PlzDontHackLain", @@ -969,7 +1096,7 @@ test "respects rate limit setting", %{conn: conn} do "created_at" => _created_at, "scope" => _scope, "token_type" => "Bearer" - } = json_response(conn, 200) + } = json_response_and_validate_schema(conn, 200) token_from_db = Repo.get_by(Token, token: token) assert token_from_db @@ -987,7 +1114,94 @@ test "respects rate limit setting", %{conn: conn} do agreement: true }) - assert json_response(conn, :too_many_requests) == %{"error" => "Throttled"} + assert json_response_and_validate_schema(conn, :too_many_requests) == %{ + "error" => "Throttled" + } + end + end + + describe "create account with enabled captcha" do + setup %{conn: conn} do + app_token = insert(:oauth_token, user: nil) + + conn = + conn + |> put_req_header("authorization", "Bearer " <> app_token.token) + |> put_req_header("content-type", "multipart/form-data") + + [conn: conn] + end + + setup do: clear_config([Pleroma.Captcha, :enabled], true) + + test "creates an account and returns 200 if captcha is valid", %{conn: conn} do + %{token: token, answer_data: answer_data} = Pleroma.Captcha.new() + + params = %{ + username: "lain", + email: "lain@example.org", + password: "PlzDontHackLain", + agreement: true, + captcha_solution: Pleroma.Captcha.Mock.solution(), + captcha_token: token, + captcha_answer_data: answer_data + } + + assert %{ + "access_token" => access_token, + "created_at" => _, + "scope" => ["read"], + "token_type" => "Bearer" + } = + conn + |> post("/api/v1/accounts", params) + |> json_response_and_validate_schema(:ok) + + assert Token |> Repo.get_by(token: access_token) |> Repo.preload(:user) |> Map.get(:user) + + Cachex.del(:used_captcha_cache, token) + end + + test "returns 400 if any captcha field is not provided", %{conn: conn} do + captcha_fields = [:captcha_solution, :captcha_token, :captcha_answer_data] + + valid_params = %{ + username: "lain", + email: "lain@example.org", + password: "PlzDontHackLain", + agreement: true, + captcha_solution: "xx", + captcha_token: "xx", + captcha_answer_data: "xx" + } + + for field <- captcha_fields do + expected = %{ + "error" => "{\"captcha\":[\"Invalid CAPTCHA (Missing parameter: #{field})\"]}" + } + + assert expected == + conn + |> post("/api/v1/accounts", Map.delete(valid_params, field)) + |> json_response_and_validate_schema(:bad_request) + end + end + + test "returns an error if captcha is invalid", %{conn: conn} do + params = %{ + username: "lain", + email: "lain@example.org", + password: "PlzDontHackLain", + agreement: true, + captcha_solution: "cofe", + captcha_token: "cofe", + captcha_answer_data: "cofe" + } + + assert %{"error" => "{\"captcha\":[\"Invalid answer data\"]}"} == + conn + |> post("/api/v1/accounts", params) + |> json_response_and_validate_schema(:bad_request) end end @@ -995,27 +1209,28 @@ test "respects rate limit setting", %{conn: conn} do test "returns lists to which the account belongs" do %{user: user, conn: conn} = oauth_access(["read:lists"]) other_user = insert(:user) - assert {:ok, %Pleroma.List{} = list} = Pleroma.List.create("Test List", user) + assert {:ok, %Pleroma.List{id: list_id} = list} = Pleroma.List.create("Test List", user) {:ok, %{following: _following}} = Pleroma.List.follow(list, other_user) - res = - conn - |> get("/api/v1/accounts/#{other_user.id}/lists") - |> json_response(200) - - assert res == [%{"id" => to_string(list.id), "title" => "Test List"}] + assert [%{"id" => list_id, "title" => "Test List"}] = + conn + |> get("/api/v1/accounts/#{other_user.id}/lists") + |> json_response_and_validate_schema(200) end end describe "verify_credentials" do test "verify_credentials" do %{user: user, conn: conn} = oauth_access(["read:accounts"]) + [notification | _] = insert_list(7, :notification, user: user) + Pleroma.Notification.set_read_up_to(user, notification.id) conn = get(conn, "/api/v1/accounts/verify_credentials") - response = json_response(conn, 200) + response = json_response_and_validate_schema(conn, 200) assert %{"id" => id, "source" => %{"privacy" => "public"}} = response assert response["pleroma"]["chat_token"] + assert response["pleroma"]["unread_notifications_count"] == 6 assert id == to_string(user.id) end @@ -1025,7 +1240,9 @@ test "verify_credentials default scope unlisted" do conn = get(conn, "/api/v1/accounts/verify_credentials") - assert %{"id" => id, "source" => %{"privacy" => "unlisted"}} = json_response(conn, 200) + assert %{"id" => id, "source" => %{"privacy" => "unlisted"}} = + json_response_and_validate_schema(conn, 200) + assert id == to_string(user.id) end @@ -1035,7 +1252,9 @@ test "locked accounts" do conn = get(conn, "/api/v1/accounts/verify_credentials") - assert %{"id" => id, "source" => %{"privacy" => "private"}} = json_response(conn, 200) + assert %{"id" => id, "source" => %{"privacy" => "private"}} = + json_response_and_validate_schema(conn, 200) + assert id == to_string(user.id) end end @@ -1044,20 +1263,24 @@ test "locked accounts" do setup do: oauth_access(["read:follows"]) test "returns the relationships for the current user", %{user: user, conn: conn} do - other_user = insert(:user) + %{id: other_user_id} = other_user = insert(:user) {:ok, _user} = User.follow(user, other_user) - conn = get(conn, "/api/v1/accounts/relationships", %{"id" => [other_user.id]}) + assert [%{"id" => ^other_user_id}] = + conn + |> get("/api/v1/accounts/relationships?id=#{other_user.id}") + |> json_response_and_validate_schema(200) - assert [relationship] = json_response(conn, 200) - - assert to_string(other_user.id) == relationship["id"] + assert [%{"id" => ^other_user_id}] = + conn + |> get("/api/v1/accounts/relationships?id[]=#{other_user.id}") + |> json_response_and_validate_schema(200) end test "returns an empty list on a bad request", %{conn: conn} do conn = get(conn, "/api/v1/accounts/relationships", %{}) - assert [] = json_response(conn, 200) + assert [] = json_response_and_validate_schema(conn, 200) end end @@ -1070,7 +1293,7 @@ test "getting a list of mutes" do conn = get(conn, "/api/v1/mutes") other_user_id = to_string(other_user.id) - assert [%{"id" => ^other_user_id}] = json_response(conn, 200) + assert [%{"id" => ^other_user_id}] = json_response_and_validate_schema(conn, 200) end test "getting a list of blocks" do @@ -1085,6 +1308,6 @@ test "getting a list of blocks" do |> get("/api/v1/blocks") other_user_id = to_string(other_user.id) - assert [%{"id" => ^other_user_id}] = json_response(conn, 200) + assert [%{"id" => ^other_user_id}] = json_response_and_validate_schema(conn, 200) end end diff --git a/test/web/mastodon_api/controllers/app_controller_test.exs b/test/web/mastodon_api/controllers/app_controller_test.exs index 77d234d67..a0b8b126c 100644 --- a/test/web/mastodon_api/controllers/app_controller_test.exs +++ b/test/web/mastodon_api/controllers/app_controller_test.exs @@ -16,8 +16,7 @@ test "apps/verify_credentials", %{conn: conn} do conn = conn - |> assign(:user, token.user) - |> assign(:token, token) + |> put_req_header("authorization", "Bearer #{token.token}") |> get("/api/v1/apps/verify_credentials") app = Repo.preload(token, :app).app @@ -28,7 +27,7 @@ test "apps/verify_credentials", %{conn: conn} do "vapid_key" => Push.vapid_config() |> Keyword.get(:public_key) } - assert expected == json_response(conn, 200) + assert expected == json_response_and_validate_schema(conn, 200) end test "creates an oauth app", %{conn: conn} do @@ -37,6 +36,7 @@ test "creates an oauth app", %{conn: conn} do conn = conn + |> put_req_header("content-type", "application/json") |> assign(:user, user) |> post("/api/v1/apps", %{ client_name: app_attrs.client_name, @@ -55,6 +55,6 @@ test "creates an oauth app", %{conn: conn} do "vapid_key" => Push.vapid_config() |> Keyword.get(:public_key) } - assert expected == json_response(conn, 200) + assert expected == json_response_and_validate_schema(conn, 200) end end diff --git a/test/web/mastodon_api/controllers/conversation_controller_test.exs b/test/web/mastodon_api/controllers/conversation_controller_test.exs index 801b0259b..3e21e6bf1 100644 --- a/test/web/mastodon_api/controllers/conversation_controller_test.exs +++ b/test/web/mastodon_api/controllers/conversation_controller_test.exs @@ -12,133 +12,127 @@ defmodule Pleroma.Web.MastodonAPI.ConversationControllerTest do setup do: oauth_access(["read:statuses"]) - test "returns a list of conversations", %{user: user_one, conn: conn} do - user_two = insert(:user) - user_three = insert(:user) + describe "returns a list of conversations" do + setup(%{user: user_one, conn: conn}) do + user_two = insert(:user) + user_three = insert(:user) - {:ok, user_two} = User.follow(user_two, user_one) + {:ok, user_two} = User.follow(user_two, user_one) - assert User.get_cached_by_id(user_two.id).unread_conversation_count == 0 + {:ok, %{user: user_one, user_two: user_two, user_three: user_three, conn: conn}} + end - {:ok, direct} = - CommonAPI.post(user_one, %{ - "status" => "Hi @#{user_two.nickname}, @#{user_three.nickname}!", - "visibility" => "direct" - }) + test "returns correct conversations", %{ + user: user_one, + user_two: user_two, + user_three: user_three, + conn: conn + } do + assert User.get_cached_by_id(user_two.id).unread_conversation_count == 0 + {:ok, direct} = create_direct_message(user_one, [user_two, user_three]) - assert User.get_cached_by_id(user_two.id).unread_conversation_count == 1 + assert User.get_cached_by_id(user_two.id).unread_conversation_count == 1 - {:ok, _follower_only} = - CommonAPI.post(user_one, %{ - "status" => "Hi @#{user_two.nickname}!", - "visibility" => "private" - }) + {:ok, _follower_only} = + CommonAPI.post(user_one, %{ + status: "Hi @#{user_two.nickname}!", + visibility: "private" + }) - res_conn = get(conn, "/api/v1/conversations") + res_conn = get(conn, "/api/v1/conversations") - assert response = json_response(res_conn, 200) + assert response = json_response_and_validate_schema(res_conn, 200) - assert [ - %{ - "id" => res_id, - "accounts" => res_accounts, - "last_status" => res_last_status, - "unread" => unread - } - ] = response + assert [ + %{ + "id" => res_id, + "accounts" => res_accounts, + "last_status" => res_last_status, + "unread" => unread + } + ] = response - account_ids = Enum.map(res_accounts, & &1["id"]) - assert length(res_accounts) == 2 - assert user_two.id in account_ids - assert user_three.id in account_ids - assert is_binary(res_id) - assert unread == false - assert res_last_status["id"] == direct.id - assert User.get_cached_by_id(user_one.id).unread_conversation_count == 0 + account_ids = Enum.map(res_accounts, & &1["id"]) + assert length(res_accounts) == 2 + assert user_two.id in account_ids + assert user_three.id in account_ids + assert is_binary(res_id) + assert unread == false + assert res_last_status["id"] == direct.id + assert User.get_cached_by_id(user_one.id).unread_conversation_count == 0 + end + + test "observes limit params", %{ + user: user_one, + user_two: user_two, + user_three: user_three, + conn: conn + } do + {:ok, _} = create_direct_message(user_one, [user_two, user_three]) + {:ok, _} = create_direct_message(user_two, [user_one, user_three]) + {:ok, _} = create_direct_message(user_three, [user_two, user_one]) + + res_conn = get(conn, "/api/v1/conversations?limit=1") + + assert response = json_response_and_validate_schema(res_conn, 200) + + assert Enum.count(response) == 1 + + res_conn = get(conn, "/api/v1/conversations?limit=2") + + assert response = json_response_and_validate_schema(res_conn, 200) + + assert Enum.count(response) == 2 + end end test "filters conversations by recipients", %{user: user_one, conn: conn} do user_two = insert(:user) user_three = insert(:user) + {:ok, direct1} = create_direct_message(user_one, [user_two]) + {:ok, _direct2} = create_direct_message(user_one, [user_three]) + {:ok, direct3} = create_direct_message(user_one, [user_two, user_three]) + {:ok, _direct4} = create_direct_message(user_two, [user_three]) + {:ok, direct5} = create_direct_message(user_two, [user_one]) - {:ok, direct1} = - CommonAPI.post(user_one, %{ - "status" => "Hi @#{user_two.nickname}!", - "visibility" => "direct" - }) - - {:ok, _direct2} = - CommonAPI.post(user_one, %{ - "status" => "Hi @#{user_three.nickname}!", - "visibility" => "direct" - }) - - {:ok, direct3} = - CommonAPI.post(user_one, %{ - "status" => "Hi @#{user_two.nickname}, @#{user_three.nickname}!", - "visibility" => "direct" - }) - - {:ok, _direct4} = - CommonAPI.post(user_two, %{ - "status" => "Hi @#{user_three.nickname}!", - "visibility" => "direct" - }) - - {:ok, direct5} = - CommonAPI.post(user_two, %{ - "status" => "Hi @#{user_one.nickname}!", - "visibility" => "direct" - }) - - [conversation1, conversation2] = - conn - |> get("/api/v1/conversations", %{"recipients" => [user_two.id]}) - |> json_response(200) + assert [conversation1, conversation2] = + conn + |> get("/api/v1/conversations?recipients[]=#{user_two.id}") + |> json_response_and_validate_schema(200) assert conversation1["last_status"]["id"] == direct5.id assert conversation2["last_status"]["id"] == direct1.id [conversation1] = conn - |> get("/api/v1/conversations", %{"recipients" => [user_two.id, user_three.id]}) - |> json_response(200) + |> get("/api/v1/conversations?recipients[]=#{user_two.id}&recipients[]=#{user_three.id}") + |> json_response_and_validate_schema(200) assert conversation1["last_status"]["id"] == direct3.id end test "updates the last_status on reply", %{user: user_one, conn: conn} do user_two = insert(:user) - - {:ok, direct} = - CommonAPI.post(user_one, %{ - "status" => "Hi @#{user_two.nickname}", - "visibility" => "direct" - }) + {:ok, direct} = create_direct_message(user_one, [user_two]) {:ok, direct_reply} = CommonAPI.post(user_two, %{ - "status" => "reply", - "visibility" => "direct", - "in_reply_to_status_id" => direct.id + status: "reply", + visibility: "direct", + in_reply_to_status_id: direct.id }) [%{"last_status" => res_last_status}] = conn |> get("/api/v1/conversations") - |> json_response(200) + |> json_response_and_validate_schema(200) assert res_last_status["id"] == direct_reply.id end test "the user marks a conversation as read", %{user: user_one, conn: conn} do user_two = insert(:user) - - {:ok, direct} = - CommonAPI.post(user_one, %{ - "status" => "Hi @#{user_two.nickname}", - "visibility" => "direct" - }) + {:ok, direct} = create_direct_message(user_one, [user_two]) assert User.get_cached_by_id(user_one.id).unread_conversation_count == 0 assert User.get_cached_by_id(user_two.id).unread_conversation_count == 1 @@ -154,12 +148,12 @@ test "the user marks a conversation as read", %{user: user_one, conn: conn} do [%{"id" => direct_conversation_id, "unread" => true}] = user_two_conn |> get("/api/v1/conversations") - |> json_response(200) + |> json_response_and_validate_schema(200) %{"unread" => false} = user_two_conn |> post("/api/v1/conversations/#{direct_conversation_id}/read") - |> json_response(200) + |> json_response_and_validate_schema(200) assert User.get_cached_by_id(user_one.id).unread_conversation_count == 0 assert User.get_cached_by_id(user_two.id).unread_conversation_count == 0 @@ -167,15 +161,15 @@ test "the user marks a conversation as read", %{user: user_one, conn: conn} do # The conversation is marked as unread on reply {:ok, _} = CommonAPI.post(user_two, %{ - "status" => "reply", - "visibility" => "direct", - "in_reply_to_status_id" => direct.id + status: "reply", + visibility: "direct", + in_reply_to_status_id: direct.id }) [%{"unread" => true}] = conn |> get("/api/v1/conversations") - |> json_response(200) + |> json_response_and_validate_schema(200) assert User.get_cached_by_id(user_one.id).unread_conversation_count == 1 assert User.get_cached_by_id(user_two.id).unread_conversation_count == 0 @@ -183,9 +177,9 @@ test "the user marks a conversation as read", %{user: user_one, conn: conn} do # A reply doesn't increment the user's unread_conversation_count if the conversation is unread {:ok, _} = CommonAPI.post(user_two, %{ - "status" => "reply", - "visibility" => "direct", - "in_reply_to_status_id" => direct.id + status: "reply", + visibility: "direct", + in_reply_to_status_id: direct.id }) assert User.get_cached_by_id(user_one.id).unread_conversation_count == 1 @@ -194,15 +188,22 @@ test "the user marks a conversation as read", %{user: user_one, conn: conn} do test "(vanilla) Mastodon frontend behaviour", %{user: user_one, conn: conn} do user_two = insert(:user) - - {:ok, direct} = - CommonAPI.post(user_one, %{ - "status" => "Hi @#{user_two.nickname}!", - "visibility" => "direct" - }) + {:ok, direct} = create_direct_message(user_one, [user_two]) res_conn = get(conn, "/api/v1/statuses/#{direct.id}/context") assert %{"ancestors" => [], "descendants" => []} == json_response(res_conn, 200) end + + defp create_direct_message(sender, recips) do + hellos = + recips + |> Enum.map(fn s -> "@#{s.nickname}" end) + |> Enum.join(", ") + + CommonAPI.post(sender, %{ + status: "Hi #{hellos}!", + visibility: "direct" + }) + end end diff --git a/test/web/mastodon_api/controllers/custom_emoji_controller_test.exs b/test/web/mastodon_api/controllers/custom_emoji_controller_test.exs index 6567a0667..ab0027f90 100644 --- a/test/web/mastodon_api/controllers/custom_emoji_controller_test.exs +++ b/test/web/mastodon_api/controllers/custom_emoji_controller_test.exs @@ -6,11 +6,12 @@ defmodule Pleroma.Web.MastodonAPI.CustomEmojiControllerTest do use Pleroma.Web.ConnCase, async: true test "with tags", %{conn: conn} do - [emoji | _body] = - conn - |> get("/api/v1/custom_emojis") - |> json_response(200) + assert resp = + conn + |> get("/api/v1/custom_emojis") + |> json_response_and_validate_schema(200) + assert [emoji | _body] = resp assert Map.has_key?(emoji, "shortcode") assert Map.has_key?(emoji, "static_url") assert Map.has_key?(emoji, "tags") diff --git a/test/web/mastodon_api/controllers/domain_block_controller_test.exs b/test/web/mastodon_api/controllers/domain_block_controller_test.exs index 8d24b3b88..01a24afcf 100644 --- a/test/web/mastodon_api/controllers/domain_block_controller_test.exs +++ b/test/web/mastodon_api/controllers/domain_block_controller_test.exs @@ -13,15 +13,21 @@ test "blocking / unblocking a domain" do %{user: user, conn: conn} = oauth_access(["write:blocks"]) other_user = insert(:user, %{ap_id: "https://dogwhistle.zone/@pundit"}) - ret_conn = post(conn, "/api/v1/domain_blocks", %{"domain" => "dogwhistle.zone"}) + ret_conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/domain_blocks", %{"domain" => "dogwhistle.zone"}) - assert %{} = json_response(ret_conn, 200) + assert %{} == json_response_and_validate_schema(ret_conn, 200) user = User.get_cached_by_ap_id(user.ap_id) assert User.blocks?(user, other_user) - ret_conn = delete(conn, "/api/v1/domain_blocks", %{"domain" => "dogwhistle.zone"}) + ret_conn = + conn + |> put_req_header("content-type", "application/json") + |> delete("/api/v1/domain_blocks", %{"domain" => "dogwhistle.zone"}) - assert %{} = json_response(ret_conn, 200) + assert %{} == json_response_and_validate_schema(ret_conn, 200) user = User.get_cached_by_ap_id(user.ap_id) refute User.blocks?(user, other_user) end @@ -32,14 +38,10 @@ test "getting a list of domain blocks" do {:ok, user} = User.block_domain(user, "bad.site") {:ok, user} = User.block_domain(user, "even.worse.site") - conn = - conn - |> assign(:user, user) - |> get("/api/v1/domain_blocks") - - domain_blocks = json_response(conn, 200) - - assert "bad.site" in domain_blocks - assert "even.worse.site" in domain_blocks + assert ["even.worse.site", "bad.site"] == + conn + |> assign(:user, user) + |> get("/api/v1/domain_blocks") + |> json_response_and_validate_schema(200) end end diff --git a/test/web/mastodon_api/controllers/filter_controller_test.exs b/test/web/mastodon_api/controllers/filter_controller_test.exs index 97ab005e0..f29547d13 100644 --- a/test/web/mastodon_api/controllers/filter_controller_test.exs +++ b/test/web/mastodon_api/controllers/filter_controller_test.exs @@ -15,9 +15,12 @@ test "creating a filter" do context: ["home"] } - conn = post(conn, "/api/v1/filters", %{"phrase" => filter.phrase, context: filter.context}) + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/filters", %{"phrase" => filter.phrase, context: filter.context}) - assert response = json_response(conn, 200) + assert response = json_response_and_validate_schema(conn, 200) assert response["phrase"] == filter.phrase assert response["context"] == filter.context assert response["irreversible"] == false @@ -48,12 +51,12 @@ test "fetching a list of filters" do response = conn |> get("/api/v1/filters") - |> json_response(200) + |> json_response_and_validate_schema(200) assert response == render_json( FilterView, - "filters.json", + "index.json", filters: [filter_two, filter_one] ) end @@ -72,7 +75,7 @@ test "get a filter" do conn = get(conn, "/api/v1/filters/#{filter.filter_id}") - assert _response = json_response(conn, 200) + assert response = json_response_and_validate_schema(conn, 200) end test "update a filter" do @@ -82,7 +85,8 @@ test "update a filter" do user_id: user.id, filter_id: 2, phrase: "knight", - context: ["home"] + context: ["home"], + hide: true } {:ok, _filter} = Pleroma.Filter.create(query) @@ -93,14 +97,17 @@ test "update a filter" do } conn = - put(conn, "/api/v1/filters/#{query.filter_id}", %{ + conn + |> put_req_header("content-type", "application/json") + |> put("/api/v1/filters/#{query.filter_id}", %{ phrase: new.phrase, context: new.context }) - assert response = json_response(conn, 200) + assert response = json_response_and_validate_schema(conn, 200) assert response["phrase"] == new.phrase assert response["context"] == new.context + assert response["irreversible"] == true end test "delete a filter" do @@ -117,7 +124,6 @@ test "delete a filter" do conn = delete(conn, "/api/v1/filters/#{filter.filter_id}") - assert response = json_response(conn, 200) - assert response == %{} + assert json_response_and_validate_schema(conn, 200) == %{} end end diff --git a/test/web/mastodon_api/controllers/follow_request_controller_test.exs b/test/web/mastodon_api/controllers/follow_request_controller_test.exs index dd848821a..44e12d15a 100644 --- a/test/web/mastodon_api/controllers/follow_request_controller_test.exs +++ b/test/web/mastodon_api/controllers/follow_request_controller_test.exs @@ -21,13 +21,13 @@ test "/api/v1/follow_requests works", %{user: user, conn: conn} do other_user = insert(:user) {:ok, _activity} = ActivityPub.follow(other_user, user) - {:ok, other_user} = User.follow(other_user, user, "pending") + {:ok, other_user} = User.follow(other_user, user, :follow_pending) assert User.following?(other_user, user) == false conn = get(conn, "/api/v1/follow_requests") - assert [relationship] = json_response(conn, 200) + assert [relationship] = json_response_and_validate_schema(conn, 200) assert to_string(other_user.id) == relationship["id"] end @@ -35,7 +35,7 @@ test "/api/v1/follow_requests/:id/authorize works", %{user: user, conn: conn} do other_user = insert(:user) {:ok, _activity} = ActivityPub.follow(other_user, user) - {:ok, other_user} = User.follow(other_user, user, "pending") + {:ok, other_user} = User.follow(other_user, user, :follow_pending) user = User.get_cached_by_id(user.id) other_user = User.get_cached_by_id(other_user.id) @@ -44,7 +44,7 @@ test "/api/v1/follow_requests/:id/authorize works", %{user: user, conn: conn} do conn = post(conn, "/api/v1/follow_requests/#{other_user.id}/authorize") - assert relationship = json_response(conn, 200) + assert relationship = json_response_and_validate_schema(conn, 200) assert to_string(other_user.id) == relationship["id"] user = User.get_cached_by_id(user.id) @@ -62,7 +62,7 @@ test "/api/v1/follow_requests/:id/reject works", %{user: user, conn: conn} do conn = post(conn, "/api/v1/follow_requests/#{other_user.id}/reject") - assert relationship = json_response(conn, 200) + assert relationship = json_response_and_validate_schema(conn, 200) assert to_string(other_user.id) == relationship["id"] user = User.get_cached_by_id(user.id) diff --git a/test/web/mastodon_api/controllers/instance_controller_test.exs b/test/web/mastodon_api/controllers/instance_controller_test.exs index 2737dcaba..8bdfdddd1 100644 --- a/test/web/mastodon_api/controllers/instance_controller_test.exs +++ b/test/web/mastodon_api/controllers/instance_controller_test.exs @@ -10,7 +10,7 @@ defmodule Pleroma.Web.MastodonAPI.InstanceControllerTest do test "get instance information", %{conn: conn} do conn = get(conn, "/api/v1/instance") - assert result = json_response(conn, 200) + assert result = json_response_and_validate_schema(conn, 200) email = Pleroma.Config.get([:instance, :email]) # Note: not checking for "max_toot_chars" since it's optional @@ -31,9 +31,14 @@ test "get instance information", %{conn: conn} do "upload_limit" => _, "avatar_upload_limit" => _, "background_upload_limit" => _, - "banner_upload_limit" => _ + "banner_upload_limit" => _, + "background_image" => _ } = result + assert result["pleroma"]["metadata"]["features"] + assert result["pleroma"]["metadata"]["federation"] + assert result["pleroma"]["vapid_public_key"] + assert email == from_config_email end @@ -46,13 +51,13 @@ test "get instance stats", %{conn: conn} do insert(:user, %{local: false, nickname: "u@peer1.com"}) insert(:user, %{local: false, nickname: "u@peer2.com"}) - {:ok, _} = Pleroma.Web.CommonAPI.post(user, %{"status" => "cofe"}) + {:ok, _} = Pleroma.Web.CommonAPI.post(user, %{status: "cofe"}) Pleroma.Stats.force_update() conn = get(conn, "/api/v1/instance") - assert result = json_response(conn, 200) + assert result = json_response_and_validate_schema(conn, 200) stats = result["stats"] @@ -70,7 +75,7 @@ test "get peers", %{conn: conn} do conn = get(conn, "/api/v1/instance/peers") - assert result = json_response(conn, 200) + assert result = json_response_and_validate_schema(conn, 200) assert ["peer1.com", "peer2.com"] == Enum.sort(result) end diff --git a/test/web/mastodon_api/controllers/list_controller_test.exs b/test/web/mastodon_api/controllers/list_controller_test.exs index c9c4cbb49..57a9ef4a4 100644 --- a/test/web/mastodon_api/controllers/list_controller_test.exs +++ b/test/web/mastodon_api/controllers/list_controller_test.exs @@ -12,37 +12,44 @@ defmodule Pleroma.Web.MastodonAPI.ListControllerTest do test "creating a list" do %{conn: conn} = oauth_access(["write:lists"]) - conn = post(conn, "/api/v1/lists", %{"title" => "cuties"}) - - assert %{"title" => title} = json_response(conn, 200) - assert title == "cuties" + assert %{"title" => "cuties"} = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/lists", %{"title" => "cuties"}) + |> json_response_and_validate_schema(:ok) end test "renders error for invalid params" do %{conn: conn} = oauth_access(["write:lists"]) - conn = post(conn, "/api/v1/lists", %{"title" => nil}) + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/lists", %{"title" => nil}) - assert %{"error" => "can't be blank"} == json_response(conn, :unprocessable_entity) + assert %{"error" => "title - null value where string expected."} = + json_response_and_validate_schema(conn, 400) end test "listing a user's lists" do %{conn: conn} = oauth_access(["read:lists", "write:lists"]) conn + |> put_req_header("content-type", "application/json") |> post("/api/v1/lists", %{"title" => "cuties"}) - |> json_response(:ok) + |> json_response_and_validate_schema(:ok) conn + |> put_req_header("content-type", "application/json") |> post("/api/v1/lists", %{"title" => "cofe"}) - |> json_response(:ok) + |> json_response_and_validate_schema(:ok) conn = get(conn, "/api/v1/lists") assert [ %{"id" => _, "title" => "cofe"}, %{"id" => _, "title" => "cuties"} - ] = json_response(conn, :ok) + ] = json_response_and_validate_schema(conn, :ok) end test "adding users to a list" do @@ -50,9 +57,12 @@ test "adding users to a list" do other_user = insert(:user) {:ok, list} = Pleroma.List.create("name", user) - conn = post(conn, "/api/v1/lists/#{list.id}/accounts", %{"account_ids" => [other_user.id]}) + assert %{} == + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/lists/#{list.id}/accounts", %{"account_ids" => [other_user.id]}) + |> json_response_and_validate_schema(:ok) - assert %{} == json_response(conn, 200) %Pleroma.List{following: following} = Pleroma.List.get(list.id, user) assert following == [other_user.follower_address] end @@ -65,9 +75,12 @@ test "removing users from a list" do {:ok, list} = Pleroma.List.follow(list, other_user) {:ok, list} = Pleroma.List.follow(list, third_user) - conn = delete(conn, "/api/v1/lists/#{list.id}/accounts", %{"account_ids" => [other_user.id]}) + assert %{} == + conn + |> put_req_header("content-type", "application/json") + |> delete("/api/v1/lists/#{list.id}/accounts", %{"account_ids" => [other_user.id]}) + |> json_response_and_validate_schema(:ok) - assert %{} == json_response(conn, 200) %Pleroma.List{following: following} = Pleroma.List.get(list.id, user) assert following == [third_user.follower_address] end @@ -83,7 +96,7 @@ test "listing users in a list" do |> assign(:user, user) |> get("/api/v1/lists/#{list.id}/accounts", %{"account_ids" => [other_user.id]}) - assert [%{"id" => id}] = json_response(conn, 200) + assert [%{"id" => id}] = json_response_and_validate_schema(conn, 200) assert id == to_string(other_user.id) end @@ -96,7 +109,7 @@ test "retrieving a list" do |> assign(:user, user) |> get("/api/v1/lists/#{list.id}") - assert %{"id" => id} = json_response(conn, 200) + assert %{"id" => id} = json_response_and_validate_schema(conn, 200) assert id == to_string(list.id) end @@ -105,17 +118,18 @@ test "renders 404 if list is not found" do conn = get(conn, "/api/v1/lists/666") - assert %{"error" => "List not found"} = json_response(conn, :not_found) + assert %{"error" => "List not found"} = json_response_and_validate_schema(conn, :not_found) end test "renaming a list" do %{user: user, conn: conn} = oauth_access(["write:lists"]) {:ok, list} = Pleroma.List.create("name", user) - conn = put(conn, "/api/v1/lists/#{list.id}", %{"title" => "newname"}) - - assert %{"title" => name} = json_response(conn, 200) - assert name == "newname" + assert %{"title" => "newname"} = + conn + |> put_req_header("content-type", "application/json") + |> put("/api/v1/lists/#{list.id}", %{"title" => "newname"}) + |> json_response_and_validate_schema(:ok) end test "validates title when renaming a list" do @@ -125,9 +139,11 @@ test "validates title when renaming a list" do conn = conn |> assign(:user, user) + |> put_req_header("content-type", "application/json") |> put("/api/v1/lists/#{list.id}", %{"title" => " "}) - assert %{"error" => "can't be blank"} == json_response(conn, :unprocessable_entity) + assert %{"error" => "can't be blank"} == + json_response_and_validate_schema(conn, :unprocessable_entity) end test "deleting a list" do @@ -136,7 +152,7 @@ test "deleting a list" do conn = delete(conn, "/api/v1/lists/#{list.id}") - assert %{} = json_response(conn, 200) + assert %{} = json_response_and_validate_schema(conn, 200) assert is_nil(Repo.get(Pleroma.List, list.id)) end end diff --git a/test/web/mastodon_api/controllers/marker_controller_test.exs b/test/web/mastodon_api/controllers/marker_controller_test.exs index 919f295bd..6dd40fb4a 100644 --- a/test/web/mastodon_api/controllers/marker_controller_test.exs +++ b/test/web/mastodon_api/controllers/marker_controller_test.exs @@ -11,6 +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) {:ok, %{"notifications" => marker}} = Pleroma.Marker.upsert( @@ -22,14 +23,15 @@ test "gets markers with correct scopes", %{conn: conn} do conn |> assign(:user, user) |> assign(:token, token) - |> get("/api/v1/markers", %{timeline: ["notifications"]}) - |> json_response(200) + |> get("/api/v1/markers?timeline[]=notifications") + |> json_response_and_validate_schema(200) assert response == %{ "notifications" => %{ "last_read_id" => "69420", "updated_at" => NaiveDateTime.to_iso8601(marker.updated_at), - "version" => 0 + "version" => 0, + "pleroma" => %{"unread_count" => 7} } } end @@ -45,7 +47,7 @@ test "gets markers with missed scopes", %{conn: conn} do |> assign(:user, user) |> assign(:token, token) |> get("/api/v1/markers", %{timeline: ["notifications"]}) - |> json_response(403) + |> json_response_and_validate_schema(403) assert response == %{"error" => "Insufficient permissions: read:statuses."} end @@ -60,17 +62,19 @@ test "creates a marker with correct scopes", %{conn: conn} do conn |> assign(:user, user) |> assign(:token, token) + |> put_req_header("content-type", "application/json") |> post("/api/v1/markers", %{ home: %{last_read_id: "777"}, notifications: %{"last_read_id" => "69420"} }) - |> json_response(200) + |> json_response_and_validate_schema(200) assert %{ "notifications" => %{ "last_read_id" => "69420", "updated_at" => _, - "version" => 0 + "version" => 0, + "pleroma" => %{"unread_count" => 0} } } = response end @@ -89,17 +93,19 @@ test "updates exist marker", %{conn: conn} do conn |> assign(:user, user) |> assign(:token, token) + |> put_req_header("content-type", "application/json") |> post("/api/v1/markers", %{ home: %{last_read_id: "777"}, notifications: %{"last_read_id" => "69888"} }) - |> json_response(200) + |> json_response_and_validate_schema(200) assert response == %{ "notifications" => %{ "last_read_id" => "69888", "updated_at" => NaiveDateTime.to_iso8601(marker.updated_at), - "version" => 0 + "version" => 0, + "pleroma" => %{"unread_count" => 0} } } end @@ -112,11 +118,12 @@ test "creates a marker with missed scopes", %{conn: conn} do conn |> assign(:user, user) |> assign(:token, token) + |> put_req_header("content-type", "application/json") |> post("/api/v1/markers", %{ home: %{last_read_id: "777"}, notifications: %{"last_read_id" => "69420"} }) - |> json_response(403) + |> json_response_and_validate_schema(403) assert response == %{"error" => "Insufficient permissions: write:statuses."} end diff --git a/test/web/mastodon_api/controllers/media_controller_test.exs b/test/web/mastodon_api/controllers/media_controller_test.exs index 6ac4cf63b..906fd940f 100644 --- a/test/web/mastodon_api/controllers/media_controller_test.exs +++ b/test/web/mastodon_api/controllers/media_controller_test.exs @@ -9,9 +9,9 @@ defmodule Pleroma.Web.MastodonAPI.MediaControllerTest do alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub - setup do: oauth_access(["write:media"]) + describe "Upload media" do + setup do: oauth_access(["write:media"]) - describe "media upload" do setup do image = %Plug.Upload{ content_type: "image/jpg", @@ -25,13 +25,14 @@ defmodule Pleroma.Web.MastodonAPI.MediaControllerTest do setup do: clear_config([:media_proxy]) setup do: clear_config([Pleroma.Upload]) - test "returns uploaded image", %{conn: conn, image: image} do + test "/api/v1/media", %{conn: conn, image: image} do desc = "Description of the image" media = conn + |> put_req_header("content-type", "multipart/form-data") |> post("/api/v1/media", %{"file" => image, "description" => desc}) - |> json_response(:ok) + |> json_response_and_validate_schema(:ok) assert media["type"] == "image" assert media["description"] == desc @@ -40,9 +41,37 @@ test "returns uploaded image", %{conn: conn, image: image} do object = Object.get_by_id(media["id"]) assert object.data["actor"] == User.ap_id(conn.assigns[:user]) end + + test "/api/v2/media", %{conn: conn, user: user, image: image} do + desc = "Description of the image" + + response = + conn + |> put_req_header("content-type", "multipart/form-data") + |> post("/api/v2/media", %{"file" => image, "description" => desc}) + |> json_response_and_validate_schema(202) + + assert media_id = response["id"] + + %{conn: conn} = oauth_access(["read:media"], user: user) + + media = + conn + |> get("/api/v1/media/#{media_id}") + |> json_response_and_validate_schema(200) + + assert media["type"] == "image" + assert media["description"] == desc + assert media["id"] + + object = Object.get_by_id(media["id"]) + assert object.data["actor"] == user.ap_id + end end - describe "PUT /api/v1/media/:id" do + describe "Update media description" do + setup do: oauth_access(["write:media"]) + setup %{user: actor} do file = %Plug.Upload{ content_type: "image/jpg", @@ -60,23 +89,58 @@ test "returns uploaded image", %{conn: conn, image: image} do [object: object] end - test "updates name of media", %{conn: conn, object: object} do + test "/api/v1/media/:id good request", %{conn: conn, object: object} do media = conn + |> put_req_header("content-type", "multipart/form-data") |> put("/api/v1/media/#{object.id}", %{"description" => "test-media"}) - |> json_response(:ok) + |> json_response_and_validate_schema(:ok) assert media["description"] == "test-media" assert refresh_record(object).data["name"] == "test-media" end + end - test "returns error when request is bad", %{conn: conn, object: object} do + describe "Get media by id (/api/v1/media/:id)" do + setup do: oauth_access(["read:media"]) + + setup %{user: actor} do + file = %Plug.Upload{ + content_type: "image/jpg", + path: Path.absname("test/fixtures/image.jpg"), + filename: "an_image.jpg" + } + + {:ok, %Object{} = object} = + ActivityPub.upload( + file, + actor: User.ap_id(actor), + description: "test-media" + ) + + [object: object] + end + + test "it returns media object when requested by owner", %{conn: conn, object: object} do media = conn - |> put("/api/v1/media/#{object.id}", %{}) - |> json_response(400) + |> get("/api/v1/media/#{object.id}") + |> json_response_and_validate_schema(:ok) - assert media == %{"error" => "bad_request"} + assert media["description"] == "test-media" + assert media["type"] == "image" + assert media["id"] + end + + test "it returns 403 if media object requested by non-owner", %{object: object, user: user} do + %{conn: conn, user: other_user} = oauth_access(["read:media"]) + + assert object.data["actor"] == user.ap_id + refute user.id == other_user.id + + conn + |> get("/api/v1/media/#{object.id}") + |> json_response(403) end end end diff --git a/test/web/mastodon_api/controllers/notification_controller_test.exs b/test/web/mastodon_api/controllers/notification_controller_test.exs index 7a0011646..e278d61f5 100644 --- a/test/web/mastodon_api/controllers/notification_controller_test.exs +++ b/test/web/mastodon_api/controllers/notification_controller_test.exs @@ -12,11 +12,29 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do import Pleroma.Factory + test "does NOT render account/pleroma/relationship by default" do + %{user: user, conn: conn} = oauth_access(["read:notifications"]) + other_user = insert(:user) + + {:ok, activity} = CommonAPI.post(other_user, %{status: "hi @#{user.nickname}"}) + {:ok, [_notification]} = Notification.create_notifications(activity) + + response = + conn + |> assign(:user, user) + |> get("/api/v1/notifications") + |> json_response_and_validate_schema(200) + + assert Enum.all?(response, fn n -> + get_in(n, ["account", "pleroma", "relationship"]) == %{} + end) + end + test "list of notifications" do %{user: user, conn: conn} = oauth_access(["read:notifications"]) other_user = insert(:user) - {:ok, activity} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"}) + {:ok, activity} = CommonAPI.post(other_user, %{status: "hi @#{user.nickname}"}) {:ok, [_notification]} = Notification.create_notifications(activity) @@ -26,11 +44,13 @@ test "list of notifications" do |> get("/api/v1/notifications") expected_response = - "hi @#{user.nickname}" - assert [%{"status" => %{"content" => response}} | _rest] = json_response(conn, 200) + assert [%{"status" => %{"content" => response}} | _rest] = + json_response_and_validate_schema(conn, 200) + assert response == expected_response end @@ -38,52 +58,69 @@ test "getting a single notification" do %{user: user, conn: conn} = oauth_access(["read:notifications"]) other_user = insert(:user) - {:ok, activity} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"}) + {:ok, activity} = CommonAPI.post(other_user, %{status: "hi @#{user.nickname}"}) {:ok, [notification]} = Notification.create_notifications(activity) conn = get(conn, "/api/v1/notifications/#{notification.id}") expected_response = - "hi @#{user.nickname}" - assert %{"status" => %{"content" => response}} = json_response(conn, 200) + assert %{"status" => %{"content" => response}} = json_response_and_validate_schema(conn, 200) assert response == expected_response end - test "dismissing a single notification" do + test "dismissing a single notification (deprecated endpoint)" do %{user: user, conn: conn} = oauth_access(["write:notifications"]) other_user = insert(:user) - {:ok, activity} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"}) + {:ok, activity} = CommonAPI.post(other_user, %{status: "hi @#{user.nickname}"}) {:ok, [notification]} = Notification.create_notifications(activity) conn = conn |> assign(:user, user) - |> post("/api/v1/notifications/dismiss", %{"id" => notification.id}) + |> put_req_header("content-type", "application/json") + |> post("/api/v1/notifications/dismiss", %{"id" => to_string(notification.id)}) - assert %{} = json_response(conn, 200) + assert %{} = json_response_and_validate_schema(conn, 200) + end + + test "dismissing a single notification" do + %{user: user, conn: conn} = oauth_access(["write:notifications"]) + other_user = insert(:user) + + {:ok, activity} = CommonAPI.post(other_user, %{status: "hi @#{user.nickname}"}) + + {:ok, [notification]} = Notification.create_notifications(activity) + + conn = + conn + |> assign(:user, user) + |> post("/api/v1/notifications/#{notification.id}/dismiss") + + assert %{} = json_response_and_validate_schema(conn, 200) end test "clearing all notifications" do %{user: user, conn: conn} = oauth_access(["write:notifications", "read:notifications"]) other_user = insert(:user) - {:ok, activity} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"}) + {:ok, activity} = CommonAPI.post(other_user, %{status: "hi @#{user.nickname}"}) {:ok, [_notification]} = Notification.create_notifications(activity) ret_conn = post(conn, "/api/v1/notifications/clear") - assert %{} = json_response(ret_conn, 200) + assert %{} = json_response_and_validate_schema(ret_conn, 200) ret_conn = get(conn, "/api/v1/notifications") - assert all = json_response(ret_conn, 200) + assert all = json_response_and_validate_schema(ret_conn, 200) assert all == [] end @@ -91,10 +128,10 @@ test "paginates notifications using min_id, since_id, max_id, and limit" do %{user: user, conn: conn} = oauth_access(["read:notifications"]) other_user = insert(:user) - {:ok, activity1} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"}) - {:ok, activity2} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"}) - {:ok, activity3} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"}) - {:ok, activity4} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"}) + {:ok, activity1} = CommonAPI.post(other_user, %{status: "hi @#{user.nickname}"}) + {:ok, activity2} = CommonAPI.post(other_user, %{status: "hi @#{user.nickname}"}) + {:ok, activity3} = CommonAPI.post(other_user, %{status: "hi @#{user.nickname}"}) + {:ok, activity4} = CommonAPI.post(other_user, %{status: "hi @#{user.nickname}"}) notification1_id = get_notification_id_by_activity(activity1) notification2_id = get_notification_id_by_activity(activity2) @@ -107,7 +144,7 @@ test "paginates notifications using min_id, since_id, max_id, and limit" do result = conn |> get("/api/v1/notifications?limit=2&min_id=#{notification1_id}") - |> json_response(:ok) + |> json_response_and_validate_schema(:ok) assert [%{"id" => ^notification3_id}, %{"id" => ^notification2_id}] = result @@ -115,7 +152,7 @@ test "paginates notifications using min_id, since_id, max_id, and limit" do result = conn |> get("/api/v1/notifications?limit=2&since_id=#{notification1_id}") - |> json_response(:ok) + |> json_response_and_validate_schema(:ok) assert [%{"id" => ^notification4_id}, %{"id" => ^notification3_id}] = result @@ -123,7 +160,7 @@ test "paginates notifications using min_id, since_id, max_id, and limit" do result = conn |> get("/api/v1/notifications?limit=2&max_id=#{notification4_id}") - |> json_response(:ok) + |> json_response_and_validate_schema(:ok) assert [%{"id" => ^notification3_id}, %{"id" => ^notification2_id}] = result end @@ -134,47 +171,39 @@ test "filters notifications for mentions" do other_user = insert(:user) {:ok, public_activity} = - CommonAPI.post(other_user, %{"status" => "@#{user.nickname}", "visibility" => "public"}) + CommonAPI.post(other_user, %{status: "@#{user.nickname}", visibility: "public"}) {:ok, direct_activity} = - CommonAPI.post(other_user, %{"status" => "@#{user.nickname}", "visibility" => "direct"}) + CommonAPI.post(other_user, %{status: "@#{user.nickname}", visibility: "direct"}) {:ok, unlisted_activity} = - CommonAPI.post(other_user, %{"status" => "@#{user.nickname}", "visibility" => "unlisted"}) + CommonAPI.post(other_user, %{status: "@#{user.nickname}", visibility: "unlisted"}) {:ok, private_activity} = - CommonAPI.post(other_user, %{"status" => "@#{user.nickname}", "visibility" => "private"}) + CommonAPI.post(other_user, %{status: "@#{user.nickname}", visibility: "private"}) - conn_res = - get(conn, "/api/v1/notifications", %{ - exclude_visibilities: ["public", "unlisted", "private"] - }) + query = params_to_query(%{exclude_visibilities: ["public", "unlisted", "private"]}) + conn_res = get(conn, "/api/v1/notifications?" <> query) - assert [%{"status" => %{"id" => id}}] = json_response(conn_res, 200) + assert [%{"status" => %{"id" => id}}] = json_response_and_validate_schema(conn_res, 200) assert id == direct_activity.id - conn_res = - get(conn, "/api/v1/notifications", %{ - exclude_visibilities: ["public", "unlisted", "direct"] - }) + query = params_to_query(%{exclude_visibilities: ["public", "unlisted", "direct"]}) + conn_res = get(conn, "/api/v1/notifications?" <> query) - assert [%{"status" => %{"id" => id}}] = json_response(conn_res, 200) + assert [%{"status" => %{"id" => id}}] = json_response_and_validate_schema(conn_res, 200) assert id == private_activity.id - conn_res = - get(conn, "/api/v1/notifications", %{ - exclude_visibilities: ["public", "private", "direct"] - }) + query = params_to_query(%{exclude_visibilities: ["public", "private", "direct"]}) + conn_res = get(conn, "/api/v1/notifications?" <> query) - assert [%{"status" => %{"id" => id}}] = json_response(conn_res, 200) + assert [%{"status" => %{"id" => id}}] = json_response_and_validate_schema(conn_res, 200) assert id == unlisted_activity.id - conn_res = - get(conn, "/api/v1/notifications", %{ - exclude_visibilities: ["unlisted", "private", "direct"] - }) + query = params_to_query(%{exclude_visibilities: ["unlisted", "private", "direct"]}) + conn_res = get(conn, "/api/v1/notifications?" <> query) - assert [%{"status" => %{"id" => id}}] = json_response(conn_res, 200) + assert [%{"status" => %{"id" => id}}] = json_response_and_validate_schema(conn_res, 200) assert id == public_activity.id end @@ -182,27 +211,25 @@ test "filters notifications for Like activities" do user = insert(:user) %{user: other_user, conn: conn} = oauth_access(["read:notifications"]) - {:ok, public_activity} = - CommonAPI.post(other_user, %{"status" => ".", "visibility" => "public"}) + {:ok, public_activity} = CommonAPI.post(other_user, %{status: ".", visibility: "public"}) {:ok, direct_activity} = - CommonAPI.post(other_user, %{"status" => "@#{user.nickname}", "visibility" => "direct"}) + CommonAPI.post(other_user, %{status: "@#{user.nickname}", visibility: "direct"}) {:ok, unlisted_activity} = - CommonAPI.post(other_user, %{"status" => ".", "visibility" => "unlisted"}) + CommonAPI.post(other_user, %{status: ".", visibility: "unlisted"}) - {:ok, private_activity} = - CommonAPI.post(other_user, %{"status" => ".", "visibility" => "private"}) + {:ok, private_activity} = CommonAPI.post(other_user, %{status: ".", visibility: "private"}) - {:ok, _, _} = CommonAPI.favorite(public_activity.id, user) - {:ok, _, _} = CommonAPI.favorite(direct_activity.id, user) - {:ok, _, _} = CommonAPI.favorite(unlisted_activity.id, user) - {:ok, _, _} = CommonAPI.favorite(private_activity.id, user) + {:ok, _} = CommonAPI.favorite(user, public_activity.id) + {:ok, _} = CommonAPI.favorite(user, direct_activity.id) + {:ok, _} = CommonAPI.favorite(user, unlisted_activity.id) + {:ok, _} = CommonAPI.favorite(user, private_activity.id) activity_ids = conn - |> get("/api/v1/notifications", %{exclude_visibilities: ["direct"]}) - |> json_response(200) + |> get("/api/v1/notifications?exclude_visibilities[]=direct") + |> json_response_and_validate_schema(200) |> Enum.map(& &1["status"]["id"]) assert public_activity.id in activity_ids @@ -212,8 +239,8 @@ test "filters notifications for Like activities" do activity_ids = conn - |> get("/api/v1/notifications", %{exclude_visibilities: ["unlisted"]}) - |> json_response(200) + |> get("/api/v1/notifications?exclude_visibilities[]=unlisted") + |> json_response_and_validate_schema(200) |> Enum.map(& &1["status"]["id"]) assert public_activity.id in activity_ids @@ -223,8 +250,8 @@ test "filters notifications for Like activities" do activity_ids = conn - |> get("/api/v1/notifications", %{exclude_visibilities: ["private"]}) - |> json_response(200) + |> get("/api/v1/notifications?exclude_visibilities[]=private") + |> json_response_and_validate_schema(200) |> Enum.map(& &1["status"]["id"]) assert public_activity.id in activity_ids @@ -234,8 +261,8 @@ test "filters notifications for Like activities" do activity_ids = conn - |> get("/api/v1/notifications", %{exclude_visibilities: ["public"]}) - |> json_response(200) + |> get("/api/v1/notifications?exclude_visibilities[]=public") + |> json_response_and_validate_schema(200) |> Enum.map(& &1["status"]["id"]) refute public_activity.id in activity_ids @@ -248,19 +275,18 @@ test "filters notifications for Announce activities" do user = insert(:user) %{user: other_user, conn: conn} = oauth_access(["read:notifications"]) - {:ok, public_activity} = - CommonAPI.post(other_user, %{"status" => ".", "visibility" => "public"}) + {:ok, public_activity} = CommonAPI.post(other_user, %{status: ".", visibility: "public"}) {:ok, unlisted_activity} = - CommonAPI.post(other_user, %{"status" => ".", "visibility" => "unlisted"}) + CommonAPI.post(other_user, %{status: ".", visibility: "unlisted"}) - {:ok, _, _} = CommonAPI.repeat(public_activity.id, user) - {:ok, _, _} = CommonAPI.repeat(unlisted_activity.id, user) + {:ok, _} = CommonAPI.repeat(public_activity.id, user) + {:ok, _} = CommonAPI.repeat(unlisted_activity.id, user) activity_ids = conn - |> get("/api/v1/notifications", %{exclude_visibilities: ["unlisted"]}) - |> json_response(200) + |> get("/api/v1/notifications?exclude_visibilities[]=unlisted") + |> json_response_and_validate_schema(200) |> Enum.map(& &1["status"]["id"]) assert public_activity.id in activity_ids @@ -272,10 +298,10 @@ test "filters notifications using exclude_types" do %{user: user, conn: conn} = oauth_access(["read:notifications"]) other_user = insert(:user) - {:ok, mention_activity} = CommonAPI.post(other_user, %{"status" => "hey @#{user.nickname}"}) - {:ok, create_activity} = CommonAPI.post(user, %{"status" => "hey"}) - {:ok, favorite_activity, _} = CommonAPI.favorite(create_activity.id, other_user) - {:ok, reblog_activity, _} = CommonAPI.repeat(create_activity.id, other_user) + {:ok, mention_activity} = CommonAPI.post(other_user, %{status: "hey @#{user.nickname}"}) + {:ok, create_activity} = CommonAPI.post(user, %{status: "hey"}) + {:ok, favorite_activity} = CommonAPI.favorite(other_user, create_activity.id) + {:ok, reblog_activity} = CommonAPI.repeat(create_activity.id, other_user) {:ok, _, _, follow_activity} = CommonAPI.follow(other_user, user) mention_notification_id = get_notification_id_by_activity(mention_activity) @@ -283,35 +309,37 @@ test "filters notifications using exclude_types" do reblog_notification_id = get_notification_id_by_activity(reblog_activity) follow_notification_id = get_notification_id_by_activity(follow_activity) - conn_res = - get(conn, "/api/v1/notifications", %{exclude_types: ["mention", "favourite", "reblog"]}) + query = params_to_query(%{exclude_types: ["mention", "favourite", "reblog"]}) + conn_res = get(conn, "/api/v1/notifications?" <> query) - assert [%{"id" => ^follow_notification_id}] = json_response(conn_res, 200) + assert [%{"id" => ^follow_notification_id}] = json_response_and_validate_schema(conn_res, 200) - conn_res = - get(conn, "/api/v1/notifications", %{exclude_types: ["favourite", "reblog", "follow"]}) + query = params_to_query(%{exclude_types: ["favourite", "reblog", "follow"]}) + conn_res = get(conn, "/api/v1/notifications?" <> query) - assert [%{"id" => ^mention_notification_id}] = json_response(conn_res, 200) + assert [%{"id" => ^mention_notification_id}] = + json_response_and_validate_schema(conn_res, 200) - conn_res = - get(conn, "/api/v1/notifications", %{exclude_types: ["reblog", "follow", "mention"]}) + query = params_to_query(%{exclude_types: ["reblog", "follow", "mention"]}) + conn_res = get(conn, "/api/v1/notifications?" <> query) - assert [%{"id" => ^favorite_notification_id}] = json_response(conn_res, 200) + assert [%{"id" => ^favorite_notification_id}] = + json_response_and_validate_schema(conn_res, 200) - conn_res = - get(conn, "/api/v1/notifications", %{exclude_types: ["follow", "mention", "favourite"]}) + query = params_to_query(%{exclude_types: ["follow", "mention", "favourite"]}) + conn_res = get(conn, "/api/v1/notifications?" <> query) - assert [%{"id" => ^reblog_notification_id}] = json_response(conn_res, 200) + assert [%{"id" => ^reblog_notification_id}] = json_response_and_validate_schema(conn_res, 200) end test "filters notifications using include_types" do %{user: user, conn: conn} = oauth_access(["read:notifications"]) other_user = insert(:user) - {:ok, mention_activity} = CommonAPI.post(other_user, %{"status" => "hey @#{user.nickname}"}) - {:ok, create_activity} = CommonAPI.post(user, %{"status" => "hey"}) - {:ok, favorite_activity, _} = CommonAPI.favorite(create_activity.id, other_user) - {:ok, reblog_activity, _} = CommonAPI.repeat(create_activity.id, other_user) + {:ok, mention_activity} = CommonAPI.post(other_user, %{status: "hey @#{user.nickname}"}) + {:ok, create_activity} = CommonAPI.post(user, %{status: "hey"}) + {:ok, favorite_activity} = CommonAPI.favorite(other_user, create_activity.id) + {:ok, reblog_activity} = CommonAPI.repeat(create_activity.id, other_user) {:ok, _, _, follow_activity} = CommonAPI.follow(other_user, user) mention_notification_id = get_notification_id_by_activity(mention_activity) @@ -319,32 +347,34 @@ test "filters notifications using include_types" do reblog_notification_id = get_notification_id_by_activity(reblog_activity) follow_notification_id = get_notification_id_by_activity(follow_activity) - conn_res = get(conn, "/api/v1/notifications", %{include_types: ["follow"]}) + conn_res = get(conn, "/api/v1/notifications?include_types[]=follow") - assert [%{"id" => ^follow_notification_id}] = json_response(conn_res, 200) + assert [%{"id" => ^follow_notification_id}] = json_response_and_validate_schema(conn_res, 200) - conn_res = get(conn, "/api/v1/notifications", %{include_types: ["mention"]}) + conn_res = get(conn, "/api/v1/notifications?include_types[]=mention") - assert [%{"id" => ^mention_notification_id}] = json_response(conn_res, 200) + assert [%{"id" => ^mention_notification_id}] = + json_response_and_validate_schema(conn_res, 200) - conn_res = get(conn, "/api/v1/notifications", %{include_types: ["favourite"]}) + conn_res = get(conn, "/api/v1/notifications?include_types[]=favourite") - assert [%{"id" => ^favorite_notification_id}] = json_response(conn_res, 200) + assert [%{"id" => ^favorite_notification_id}] = + json_response_and_validate_schema(conn_res, 200) - conn_res = get(conn, "/api/v1/notifications", %{include_types: ["reblog"]}) + conn_res = get(conn, "/api/v1/notifications?include_types[]=reblog") - assert [%{"id" => ^reblog_notification_id}] = json_response(conn_res, 200) + assert [%{"id" => ^reblog_notification_id}] = json_response_and_validate_schema(conn_res, 200) - result = conn |> get("/api/v1/notifications") |> json_response(200) + result = conn |> get("/api/v1/notifications") |> json_response_and_validate_schema(200) assert length(result) == 4 + query = params_to_query(%{include_types: ["follow", "mention", "favourite", "reblog"]}) + result = conn - |> get("/api/v1/notifications", %{ - include_types: ["follow", "mention", "favourite", "reblog"] - }) - |> json_response(200) + |> get("/api/v1/notifications?" <> query) + |> json_response_and_validate_schema(200) assert length(result) == 4 end @@ -353,10 +383,10 @@ test "destroy multiple" do %{user: user, conn: conn} = oauth_access(["read:notifications", "write:notifications"]) other_user = insert(:user) - {:ok, activity1} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"}) - {:ok, activity2} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"}) - {:ok, activity3} = CommonAPI.post(user, %{"status" => "hi @#{other_user.nickname}"}) - {:ok, activity4} = CommonAPI.post(user, %{"status" => "hi @#{other_user.nickname}"}) + {:ok, activity1} = CommonAPI.post(other_user, %{status: "hi @#{user.nickname}"}) + {:ok, activity2} = CommonAPI.post(other_user, %{status: "hi @#{user.nickname}"}) + {:ok, activity3} = CommonAPI.post(user, %{status: "hi @#{other_user.nickname}"}) + {:ok, activity4} = CommonAPI.post(user, %{status: "hi @#{other_user.nickname}"}) notification1_id = get_notification_id_by_activity(activity1) notification2_id = get_notification_id_by_activity(activity2) @@ -366,7 +396,7 @@ test "destroy multiple" do result = conn |> get("/api/v1/notifications") - |> json_response(:ok) + |> json_response_and_validate_schema(:ok) assert [%{"id" => ^notification2_id}, %{"id" => ^notification1_id}] = result @@ -378,22 +408,19 @@ test "destroy multiple" do result = conn2 |> get("/api/v1/notifications") - |> json_response(:ok) + |> json_response_and_validate_schema(:ok) assert [%{"id" => ^notification4_id}, %{"id" => ^notification3_id}] = result - conn_destroy = - conn - |> delete("/api/v1/notifications/destroy_multiple", %{ - "ids" => [notification1_id, notification2_id] - }) + query = params_to_query(%{ids: [notification1_id, notification2_id]}) + conn_destroy = delete(conn, "/api/v1/notifications/destroy_multiple?" <> query) - assert json_response(conn_destroy, 200) == %{} + assert json_response_and_validate_schema(conn_destroy, 200) == %{} result = conn2 |> get("/api/v1/notifications") - |> json_response(:ok) + |> json_response_and_validate_schema(:ok) assert [%{"id" => ^notification4_id}, %{"id" => ^notification3_id}] = result end @@ -403,17 +430,17 @@ test "doesn't see notifications after muting user with notifications" do user2 = insert(:user) {:ok, _, _, _} = CommonAPI.follow(user, user2) - {:ok, _} = CommonAPI.post(user2, %{"status" => "hey @#{user.nickname}"}) + {:ok, _} = CommonAPI.post(user2, %{status: "hey @#{user.nickname}"}) ret_conn = get(conn, "/api/v1/notifications") - assert length(json_response(ret_conn, 200)) == 1 + assert length(json_response_and_validate_schema(ret_conn, 200)) == 1 {:ok, _user_relationships} = User.mute(user, user2) conn = get(conn, "/api/v1/notifications") - assert json_response(conn, 200) == [] + assert json_response_and_validate_schema(conn, 200) == [] end test "see notifications after muting user without notifications" do @@ -421,17 +448,17 @@ test "see notifications after muting user without notifications" do user2 = insert(:user) {:ok, _, _, _} = CommonAPI.follow(user, user2) - {:ok, _} = CommonAPI.post(user2, %{"status" => "hey @#{user.nickname}"}) + {:ok, _} = CommonAPI.post(user2, %{status: "hey @#{user.nickname}"}) ret_conn = get(conn, "/api/v1/notifications") - assert length(json_response(ret_conn, 200)) == 1 + assert length(json_response_and_validate_schema(ret_conn, 200)) == 1 {:ok, _user_relationships} = User.mute(user, user2, false) conn = get(conn, "/api/v1/notifications") - assert length(json_response(conn, 200)) == 1 + assert length(json_response_and_validate_schema(conn, 200)) == 1 end test "see notifications after muting user with notifications and with_muted parameter" do @@ -439,31 +466,44 @@ test "see notifications after muting user with notifications and with_muted para user2 = insert(:user) {:ok, _, _, _} = CommonAPI.follow(user, user2) - {:ok, _} = CommonAPI.post(user2, %{"status" => "hey @#{user.nickname}"}) + {:ok, _} = CommonAPI.post(user2, %{status: "hey @#{user.nickname}"}) ret_conn = get(conn, "/api/v1/notifications") - assert length(json_response(ret_conn, 200)) == 1 + assert length(json_response_and_validate_schema(ret_conn, 200)) == 1 {:ok, _user_relationships} = User.mute(user, user2) - conn = get(conn, "/api/v1/notifications", %{"with_muted" => "true"}) + conn = get(conn, "/api/v1/notifications?with_muted=true") - assert length(json_response(conn, 200)) == 1 + assert length(json_response_and_validate_schema(conn, 200)) == 1 end + @tag capture_log: true test "see move notifications" do old_user = insert(:user) new_user = insert(:user, also_known_as: [old_user.ap_id]) %{user: follower, conn: conn} = oauth_access(["read:notifications"]) + old_user_url = old_user.ap_id + + body = + File.read!("test/fixtures/users_mock/localhost.json") + |> String.replace("{{nickname}}", old_user.nickname) + |> Jason.encode!() + + Tesla.Mock.mock(fn + %{method: :get, url: ^old_user_url} -> + %Tesla.Env{status: 200, body: body} + end) + User.follow(follower, old_user) Pleroma.Web.ActivityPub.ActivityPub.move(old_user, new_user) Pleroma.Tests.ObanHelpers.perform_all() conn = get(conn, "/api/v1/notifications") - assert length(json_response(conn, 200)) == 1 + assert length(json_response_and_validate_schema(conn, 200)) == 1 end describe "link headers" do @@ -473,14 +513,14 @@ test "preserves parameters in link headers" do {:ok, activity1} = CommonAPI.post(other_user, %{ - "status" => "hi @#{user.nickname}", - "visibility" => "public" + status: "hi @#{user.nickname}", + visibility: "public" }) {:ok, activity2} = CommonAPI.post(other_user, %{ - "status" => "hi @#{user.nickname}", - "visibility" => "public" + status: "hi @#{user.nickname}", + visibility: "public" }) notification1 = Repo.get_by(Notification, activity_id: activity1.id) @@ -489,10 +529,10 @@ test "preserves parameters in link headers" do conn = conn |> assign(:user, user) - |> get("/api/v1/notifications", %{media_only: true}) + |> get("/api/v1/notifications?limit=5") assert [link_header] = get_resp_header(conn, "link") - assert link_header =~ ~r/media_only=true/ + assert link_header =~ ~r/limit=5/ assert link_header =~ ~r/min_id=#{notification2.id}/ assert link_header =~ ~r/max_id=#{notification1.id}/ end @@ -505,20 +545,20 @@ test "account_id" do %{id: account_id} = other_user1 = insert(:user) other_user2 = insert(:user) - {:ok, _activity} = CommonAPI.post(other_user1, %{"status" => "hi @#{user.nickname}"}) - {:ok, _activity} = CommonAPI.post(other_user2, %{"status" => "bye @#{user.nickname}"}) + {:ok, _activity} = CommonAPI.post(other_user1, %{status: "hi @#{user.nickname}"}) + {:ok, _activity} = CommonAPI.post(other_user2, %{status: "bye @#{user.nickname}"}) assert [%{"account" => %{"id" => ^account_id}}] = conn |> assign(:user, user) - |> get("/api/v1/notifications", %{account_id: account_id}) - |> json_response(200) + |> get("/api/v1/notifications?account_id=#{account_id}") + |> json_response_and_validate_schema(200) assert %{"error" => "Account is not found"} = conn |> assign(:user, user) - |> get("/api/v1/notifications", %{account_id: "cofe"}) - |> json_response(404) + |> get("/api/v1/notifications?account_id=cofe") + |> json_response_and_validate_schema(404) end end @@ -528,4 +568,11 @@ defp get_notification_id_by_activity(%{id: id}) do |> Map.get(:id) |> to_string() end + + defp params_to_query(%{} = params) do + Enum.map_join(params, "&", fn + {k, v} when is_list(v) -> Enum.map_join(v, "&", &"#{k}[]=#{&1}") + {k, v} -> k <> "=" <> v + end) + end end diff --git a/test/web/mastodon_api/controllers/poll_controller_test.exs b/test/web/mastodon_api/controllers/poll_controller_test.exs index 88b13a25a..f41de6448 100644 --- a/test/web/mastodon_api/controllers/poll_controller_test.exs +++ b/test/web/mastodon_api/controllers/poll_controller_test.exs @@ -16,15 +16,15 @@ defmodule Pleroma.Web.MastodonAPI.PollControllerTest do test "returns poll entity for object id", %{user: user, conn: conn} do {:ok, activity} = CommonAPI.post(user, %{ - "status" => "Pleroma does", - "poll" => %{"options" => ["what Mastodon't", "n't what Mastodoes"], "expires_in" => 20} + status: "Pleroma does", + poll: %{options: ["what Mastodon't", "n't what Mastodoes"], expires_in: 20} }) object = Object.normalize(activity) conn = get(conn, "/api/v1/polls/#{object.id}") - response = json_response(conn, 200) + response = json_response_and_validate_schema(conn, 200) id = to_string(object.id) assert %{"id" => ^id, "expired" => false, "multiple" => false} = response end @@ -34,16 +34,16 @@ test "does not expose polls for private statuses", %{conn: conn} do {:ok, activity} = CommonAPI.post(other_user, %{ - "status" => "Pleroma does", - "poll" => %{"options" => ["what Mastodon't", "n't what Mastodoes"], "expires_in" => 20}, - "visibility" => "private" + status: "Pleroma does", + poll: %{options: ["what Mastodon't", "n't what Mastodoes"], expires_in: 20}, + visibility: "private" }) object = Object.normalize(activity) conn = get(conn, "/api/v1/polls/#{object.id}") - assert json_response(conn, 404) + assert json_response_and_validate_schema(conn, 404) end end @@ -55,19 +55,22 @@ test "votes are added to the poll", %{conn: conn} do {:ok, activity} = CommonAPI.post(other_user, %{ - "status" => "A very delicious sandwich", - "poll" => %{ - "options" => ["Lettuce", "Grilled Bacon", "Tomato"], - "expires_in" => 20, - "multiple" => true + status: "A very delicious sandwich", + poll: %{ + options: ["Lettuce", "Grilled Bacon", "Tomato"], + expires_in: 20, + multiple: true } }) object = Object.normalize(activity) - conn = post(conn, "/api/v1/polls/#{object.id}/votes", %{"choices" => [0, 1, 2]}) + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/polls/#{object.id}/votes", %{"choices" => [0, 1, 2]}) - assert json_response(conn, 200) + assert json_response_and_validate_schema(conn, 200) object = Object.get_by_id(object.id) assert Enum.all?(object.data["anyOf"], fn %{"replies" => %{"totalItems" => total_items}} -> @@ -78,15 +81,16 @@ test "votes are added to the poll", %{conn: conn} do test "author can't vote", %{user: user, conn: conn} do {:ok, activity} = CommonAPI.post(user, %{ - "status" => "Am I cute?", - "poll" => %{"options" => ["Yes", "No"], "expires_in" => 20} + status: "Am I cute?", + poll: %{options: ["Yes", "No"], expires_in: 20} }) object = Object.normalize(activity) assert conn + |> put_req_header("content-type", "application/json") |> post("/api/v1/polls/#{object.id}/votes", %{"choices" => [1]}) - |> json_response(422) == %{"error" => "Poll's author can't vote"} + |> json_response_and_validate_schema(422) == %{"error" => "Poll's author can't vote"} object = Object.get_by_id(object.id) @@ -98,15 +102,16 @@ test "does not allow multiple choices on a single-choice question", %{conn: conn {:ok, activity} = CommonAPI.post(other_user, %{ - "status" => "The glass is", - "poll" => %{"options" => ["half empty", "half full"], "expires_in" => 20} + status: "The glass is", + poll: %{options: ["half empty", "half full"], expires_in: 20} }) object = Object.normalize(activity) assert conn + |> put_req_header("content-type", "application/json") |> post("/api/v1/polls/#{object.id}/votes", %{"choices" => [0, 1]}) - |> json_response(422) == %{"error" => "Too many choices"} + |> json_response_and_validate_schema(422) == %{"error" => "Too many choices"} object = Object.get_by_id(object.id) @@ -120,21 +125,27 @@ test "does not allow choice index to be greater than options count", %{conn: con {:ok, activity} = CommonAPI.post(other_user, %{ - "status" => "Am I cute?", - "poll" => %{"options" => ["Yes", "No"], "expires_in" => 20} + status: "Am I cute?", + poll: %{options: ["Yes", "No"], expires_in: 20} }) object = Object.normalize(activity) - conn = post(conn, "/api/v1/polls/#{object.id}/votes", %{"choices" => [2]}) + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/polls/#{object.id}/votes", %{"choices" => [2]}) - assert json_response(conn, 422) == %{"error" => "Invalid indices"} + assert json_response_and_validate_schema(conn, 422) == %{"error" => "Invalid indices"} end test "returns 404 error when object is not exist", %{conn: conn} do - conn = post(conn, "/api/v1/polls/1/votes", %{"choices" => [0]}) + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/polls/1/votes", %{"choices" => [0]}) - assert json_response(conn, 404) == %{"error" => "Record not found"} + assert json_response_and_validate_schema(conn, 404) == %{"error" => "Record not found"} end test "returns 404 when poll is private and not available for user", %{conn: conn} do @@ -142,16 +153,19 @@ test "returns 404 when poll is private and not available for user", %{conn: conn {:ok, activity} = CommonAPI.post(other_user, %{ - "status" => "Am I cute?", - "poll" => %{"options" => ["Yes", "No"], "expires_in" => 20}, - "visibility" => "private" + status: "Am I cute?", + poll: %{options: ["Yes", "No"], expires_in: 20}, + visibility: "private" }) object = Object.normalize(activity) - conn = post(conn, "/api/v1/polls/#{object.id}/votes", %{"choices" => [0]}) + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/polls/#{object.id}/votes", %{"choices" => [0]}) - assert json_response(conn, 404) == %{"error" => "Record not found"} + assert json_response_and_validate_schema(conn, 404) == %{"error" => "Record not found"} end end end diff --git a/test/web/mastodon_api/controllers/report_controller_test.exs b/test/web/mastodon_api/controllers/report_controller_test.exs index 34ec8119e..6636cff96 100644 --- a/test/web/mastodon_api/controllers/report_controller_test.exs +++ b/test/web/mastodon_api/controllers/report_controller_test.exs @@ -14,7 +14,7 @@ defmodule Pleroma.Web.MastodonAPI.ReportControllerTest do setup do target_user = insert(:user) - {:ok, activity} = CommonAPI.post(target_user, %{"status" => "foobar"}) + {:ok, activity} = CommonAPI.post(target_user, %{status: "foobar"}) [target_user: target_user, activity: activity] end @@ -22,8 +22,9 @@ defmodule Pleroma.Web.MastodonAPI.ReportControllerTest do test "submit a basic report", %{conn: conn, target_user: target_user} do assert %{"action_taken" => false, "id" => _} = conn + |> put_req_header("content-type", "application/json") |> post("/api/v1/reports", %{"account_id" => target_user.id}) - |> json_response(200) + |> json_response_and_validate_schema(200) end test "submit a report with statuses and comment", %{ @@ -33,23 +34,25 @@ test "submit a report with statuses and comment", %{ } do assert %{"action_taken" => false, "id" => _} = conn + |> put_req_header("content-type", "application/json") |> post("/api/v1/reports", %{ "account_id" => target_user.id, "status_ids" => [activity.id], "comment" => "bad status!", "forward" => "false" }) - |> json_response(200) + |> json_response_and_validate_schema(200) end test "account_id is required", %{ conn: conn, activity: activity } do - assert %{"error" => "Valid `account_id` required"} = + assert %{"error" => "Missing field: account_id."} = conn + |> put_req_header("content-type", "application/json") |> post("/api/v1/reports", %{"status_ids" => [activity.id]}) - |> json_response(400) + |> json_response_and_validate_schema(400) end test "comment must be up to the size specified in the config", %{ @@ -63,17 +66,21 @@ test "comment must be up to the size specified in the config", %{ assert ^error = conn + |> put_req_header("content-type", "application/json") |> post("/api/v1/reports", %{"account_id" => target_user.id, "comment" => comment}) - |> json_response(400) + |> json_response_and_validate_schema(400) end test "returns error when account is not exist", %{ conn: conn, activity: activity } do - conn = post(conn, "/api/v1/reports", %{"status_ids" => [activity.id], "account_id" => "foo"}) + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/reports", %{"status_ids" => [activity.id], "account_id" => "foo"}) - assert json_response(conn, 400) == %{"error" => "Account not found"} + assert json_response_and_validate_schema(conn, 400) == %{"error" => "Account not found"} end test "doesn't fail if an admin has no email", %{conn: conn, target_user: target_user} do @@ -81,7 +88,8 @@ test "doesn't fail if an admin has no email", %{conn: conn, target_user: target_ assert %{"action_taken" => false, "id" => _} = conn + |> put_req_header("content-type", "application/json") |> post("/api/v1/reports", %{"account_id" => target_user.id}) - |> json_response(200) + |> json_response_and_validate_schema(200) end end diff --git a/test/web/mastodon_api/controllers/scheduled_activity_controller_test.exs b/test/web/mastodon_api/controllers/scheduled_activity_controller_test.exs index f86274d57..1ff871c89 100644 --- a/test/web/mastodon_api/controllers/scheduled_activity_controller_test.exs +++ b/test/web/mastodon_api/controllers/scheduled_activity_controller_test.exs @@ -24,19 +24,19 @@ test "shows scheduled activities" do # min_id conn_res = get(conn, "/api/v1/scheduled_statuses?limit=2&min_id=#{scheduled_activity_id1}") - result = json_response(conn_res, 200) + result = json_response_and_validate_schema(conn_res, 200) assert [%{"id" => ^scheduled_activity_id3}, %{"id" => ^scheduled_activity_id2}] = result # since_id conn_res = get(conn, "/api/v1/scheduled_statuses?limit=2&since_id=#{scheduled_activity_id1}") - result = json_response(conn_res, 200) + result = json_response_and_validate_schema(conn_res, 200) assert [%{"id" => ^scheduled_activity_id4}, %{"id" => ^scheduled_activity_id3}] = result # max_id conn_res = get(conn, "/api/v1/scheduled_statuses?limit=2&max_id=#{scheduled_activity_id4}") - result = json_response(conn_res, 200) + result = json_response_and_validate_schema(conn_res, 200) assert [%{"id" => ^scheduled_activity_id3}, %{"id" => ^scheduled_activity_id2}] = result end @@ -46,12 +46,12 @@ test "shows a scheduled activity" do res_conn = get(conn, "/api/v1/scheduled_statuses/#{scheduled_activity.id}") - assert %{"id" => scheduled_activity_id} = json_response(res_conn, 200) + assert %{"id" => scheduled_activity_id} = json_response_and_validate_schema(res_conn, 200) assert scheduled_activity_id == scheduled_activity.id |> to_string() res_conn = get(conn, "/api/v1/scheduled_statuses/404") - assert %{"error" => "Record not found"} = json_response(res_conn, 404) + assert %{"error" => "Record not found"} = json_response_and_validate_schema(res_conn, 404) end test "updates a scheduled activity" do @@ -74,22 +74,32 @@ test "updates a scheduled activity" do assert job.args == %{"activity_id" => scheduled_activity.id} assert DateTime.truncate(job.scheduled_at, :second) == to_datetime(scheduled_at) - new_scheduled_at = Timex.shift(NaiveDateTime.utc_now(), minutes: 120) + new_scheduled_at = + NaiveDateTime.utc_now() + |> Timex.shift(minutes: 120) + |> Timex.format!("%Y-%m-%dT%H:%M:%S.%fZ", :strftime) res_conn = - put(conn, "/api/v1/scheduled_statuses/#{scheduled_activity.id}", %{ + conn + |> put_req_header("content-type", "application/json") + |> put("/api/v1/scheduled_statuses/#{scheduled_activity.id}", %{ scheduled_at: new_scheduled_at }) - assert %{"scheduled_at" => expected_scheduled_at} = json_response(res_conn, 200) + assert %{"scheduled_at" => expected_scheduled_at} = + json_response_and_validate_schema(res_conn, 200) + assert expected_scheduled_at == Pleroma.Web.CommonAPI.Utils.to_masto_date(new_scheduled_at) job = refresh_record(job) assert DateTime.truncate(job.scheduled_at, :second) == to_datetime(new_scheduled_at) - res_conn = put(conn, "/api/v1/scheduled_statuses/404", %{scheduled_at: new_scheduled_at}) + res_conn = + conn + |> put_req_header("content-type", "application/json") + |> put("/api/v1/scheduled_statuses/404", %{scheduled_at: new_scheduled_at}) - assert %{"error" => "Record not found"} = json_response(res_conn, 404) + assert %{"error" => "Record not found"} = json_response_and_validate_schema(res_conn, 404) end test "deletes a scheduled activity" do @@ -115,7 +125,7 @@ test "deletes a scheduled activity" do |> assign(:user, user) |> delete("/api/v1/scheduled_statuses/#{scheduled_activity.id}") - assert %{} = json_response(res_conn, 200) + assert %{} = json_response_and_validate_schema(res_conn, 200) refute Repo.get(ScheduledActivity, scheduled_activity.id) refute Repo.get(Oban.Job, job.id) @@ -124,6 +134,6 @@ test "deletes a scheduled activity" do |> assign(:user, user) |> delete("/api/v1/scheduled_statuses/#{scheduled_activity.id}") - assert %{"error" => "Record not found"} = json_response(res_conn, 404) + assert %{"error" => "Record not found"} = json_response_and_validate_schema(res_conn, 404) 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 11133ff66..7d0cafccc 100644 --- a/test/web/mastodon_api/controllers/search_controller_test.exs +++ b/test/web/mastodon_api/controllers/search_controller_test.exs @@ -13,7 +13,7 @@ defmodule Pleroma.Web.MastodonAPI.SearchControllerTest do import Tesla.Mock import Mock - setup do + setup_all do mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) :ok end @@ -27,8 +27,8 @@ test "it returns empty result if user or status search return undefined error", capture_log(fn -> results = conn - |> get("/api/v2/search", %{"q" => "2hu"}) - |> json_response(200) + |> get("/api/v2/search?q=2hu") + |> json_response_and_validate_schema(200) assert results["accounts"] == [] assert results["statuses"] == [] @@ -42,20 +42,20 @@ test "search", %{conn: conn} do user_two = insert(:user, %{nickname: "shp@shitposter.club"}) user_three = insert(:user, %{nickname: "shp@heldscal.la", name: "I love 2hu"}) - {:ok, activity} = CommonAPI.post(user, %{"status" => "This is about 2hu private 天子"}) + {:ok, activity} = CommonAPI.post(user, %{status: "This is about 2hu private 天子"}) {:ok, _activity} = CommonAPI.post(user, %{ - "status" => "This is about 2hu, but private", - "visibility" => "private" + status: "This is about 2hu, but private", + visibility: "private" }) - {:ok, _} = CommonAPI.post(user_two, %{"status" => "This isn't"}) + {:ok, _} = CommonAPI.post(user_two, %{status: "This isn't"}) results = conn - |> get("/api/v2/search", %{"q" => "2hu #private"}) - |> json_response(200) + |> get("/api/v2/search?#{URI.encode_query(%{q: "2hu #private"})}") + |> json_response_and_validate_schema(200) [account | _] = results["accounts"] assert account["id"] == to_string(user_three.id) @@ -68,8 +68,8 @@ test "search", %{conn: conn} do assert status["id"] == to_string(activity.id) results = - get(conn, "/api/v2/search", %{"q" => "天子"}) - |> json_response(200) + get(conn, "/api/v2/search?q=天子") + |> json_response_and_validate_schema(200) [status] = results["statuses"] assert status["id"] == to_string(activity.id) @@ -80,17 +80,17 @@ test "excludes a blocked users from search results", %{conn: conn} do user_smith = insert(:user, %{nickname: "Agent", name: "I love 2hu"}) user_neo = insert(:user, %{nickname: "Agent Neo", name: "Agent"}) - {:ok, act1} = CommonAPI.post(user, %{"status" => "This is about 2hu private 天子"}) - {:ok, act2} = CommonAPI.post(user_smith, %{"status" => "Agent Smith"}) - {:ok, act3} = CommonAPI.post(user_neo, %{"status" => "Agent Smith"}) + {:ok, act1} = CommonAPI.post(user, %{status: "This is about 2hu private 天子"}) + {:ok, act2} = CommonAPI.post(user_smith, %{status: "Agent Smith"}) + {:ok, act3} = CommonAPI.post(user_neo, %{status: "Agent Smith"}) Pleroma.User.block(user, user_smith) results = conn |> assign(:user, user) |> assign(:token, insert(:oauth_token, user: user, scopes: ["read"])) - |> get("/api/v2/search", %{"q" => "Agent"}) - |> json_response(200) + |> get("/api/v2/search?q=Agent") + |> json_response_and_validate_schema(200) status_ids = Enum.map(results["statuses"], fn g -> g["id"] end) @@ -107,8 +107,8 @@ test "account search", %{conn: conn} do results = conn - |> get("/api/v1/accounts/search", %{"q" => "shp"}) - |> json_response(200) + |> get("/api/v1/accounts/search?q=shp") + |> json_response_and_validate_schema(200) result_ids = for result <- results, do: result["acct"] @@ -117,8 +117,8 @@ test "account search", %{conn: conn} do results = conn - |> get("/api/v1/accounts/search", %{"q" => "2hu"}) - |> json_response(200) + |> get("/api/v1/accounts/search?q=2hu") + |> json_response_and_validate_schema(200) result_ids = for result <- results, do: result["acct"] @@ -130,8 +130,8 @@ test "returns account if query contains a space", %{conn: conn} do results = conn - |> get("/api/v1/accounts/search", %{"q" => "shp@shitposter.club xxx "}) - |> json_response(200) + |> get("/api/v1/accounts/search?q=shp@shitposter.club xxx") + |> json_response_and_validate_schema(200) assert length(results) == 1 end @@ -146,8 +146,8 @@ test "it returns empty result if user or status search return undefined error", capture_log(fn -> results = conn - |> get("/api/v1/search", %{"q" => "2hu"}) - |> json_response(200) + |> get("/api/v1/search?q=2hu") + |> json_response_and_validate_schema(200) assert results["accounts"] == [] assert results["statuses"] == [] @@ -161,20 +161,20 @@ test "search", %{conn: conn} do user_two = insert(:user, %{nickname: "shp@shitposter.club"}) user_three = insert(:user, %{nickname: "shp@heldscal.la", name: "I love 2hu"}) - {:ok, activity} = CommonAPI.post(user, %{"status" => "This is about 2hu"}) + {:ok, activity} = CommonAPI.post(user, %{status: "This is about 2hu"}) {:ok, _activity} = CommonAPI.post(user, %{ - "status" => "This is about 2hu, but private", - "visibility" => "private" + status: "This is about 2hu, but private", + visibility: "private" }) - {:ok, _} = CommonAPI.post(user_two, %{"status" => "This isn't"}) + {:ok, _} = CommonAPI.post(user_two, %{status: "This isn't"}) results = conn - |> get("/api/v1/search", %{"q" => "2hu"}) - |> json_response(200) + |> get("/api/v1/search?q=2hu") + |> json_response_and_validate_schema(200) [account | _] = results["accounts"] assert account["id"] == to_string(user_three.id) @@ -189,13 +189,13 @@ test "search fetches remote statuses and prefers them over other results", %{con capture_log(fn -> {:ok, %{id: activity_id}} = CommonAPI.post(insert(:user), %{ - "status" => "check out https://shitposter.club/notice/2827873" + status: "check out https://shitposter.club/notice/2827873" }) results = conn - |> get("/api/v1/search", %{"q" => "https://shitposter.club/notice/2827873"}) - |> json_response(200) + |> get("/api/v1/search?q=https://shitposter.club/notice/2827873") + |> json_response_and_validate_schema(200) [status, %{"id" => ^activity_id}] = results["statuses"] @@ -207,15 +207,17 @@ test "search fetches remote statuses and prefers them over other results", %{con test "search doesn't show statuses that it shouldn't", %{conn: conn} do {:ok, activity} = CommonAPI.post(insert(:user), %{ - "status" => "This is about 2hu, but private", - "visibility" => "private" + status: "This is about 2hu, but private", + visibility: "private" }) capture_log(fn -> + q = Object.normalize(activity).data["id"] + results = conn - |> get("/api/v1/search", %{"q" => Object.normalize(activity).data["id"]}) - |> json_response(200) + |> get("/api/v1/search?q=#{q}") + |> json_response_and_validate_schema(200) [] = results["statuses"] end) @@ -228,8 +230,8 @@ test "search fetches remote accounts", %{conn: conn} do conn |> assign(:user, user) |> assign(:token, insert(:oauth_token, user: user, scopes: ["read"])) - |> get("/api/v1/search", %{"q" => "mike@osada.macgirvin.com", "resolve" => "true"}) - |> json_response(200) + |> get("/api/v1/search?q=mike@osada.macgirvin.com&resolve=true") + |> json_response_and_validate_schema(200) [account] = results["accounts"] assert account["acct"] == "mike@osada.macgirvin.com" @@ -238,8 +240,8 @@ test "search fetches remote accounts", %{conn: conn} do test "search doesn't fetch remote accounts if resolve is false", %{conn: conn} do results = conn - |> get("/api/v1/search", %{"q" => "mike@osada.macgirvin.com", "resolve" => "false"}) - |> json_response(200) + |> get("/api/v1/search?q=mike@osada.macgirvin.com&resolve=false") + |> json_response_and_validate_schema(200) assert [] == results["accounts"] end @@ -249,21 +251,21 @@ test "search with limit and offset", %{conn: conn} do _user_two = insert(:user, %{nickname: "shp@shitposter.club"}) _user_three = insert(:user, %{nickname: "shp@heldscal.la", name: "I love 2hu"}) - {:ok, _activity1} = CommonAPI.post(user, %{"status" => "This is about 2hu"}) - {:ok, _activity2} = CommonAPI.post(user, %{"status" => "This is also about 2hu"}) + {:ok, _activity1} = CommonAPI.post(user, %{status: "This is about 2hu"}) + {:ok, _activity2} = CommonAPI.post(user, %{status: "This is also about 2hu"}) result = conn - |> get("/api/v1/search", %{"q" => "2hu", "limit" => 1}) + |> get("/api/v1/search?q=2hu&limit=1") - assert results = json_response(result, 200) + assert results = json_response_and_validate_schema(result, 200) assert [%{"id" => activity_id1}] = results["statuses"] assert [_] = results["accounts"] results = conn - |> get("/api/v1/search", %{"q" => "2hu", "limit" => 1, "offset" => 1}) - |> json_response(200) + |> get("/api/v1/search?q=2hu&limit=1&offset=1") + |> json_response_and_validate_schema(200) assert [%{"id" => activity_id2}] = results["statuses"] assert [] = results["accounts"] @@ -275,30 +277,30 @@ test "search returns results only for the given type", %{conn: conn} do user = insert(:user) _user_two = insert(:user, %{nickname: "shp@heldscal.la", name: "I love 2hu"}) - {:ok, _activity} = CommonAPI.post(user, %{"status" => "This is about 2hu"}) + {:ok, _activity} = CommonAPI.post(user, %{status: "This is about 2hu"}) assert %{"statuses" => [_activity], "accounts" => [], "hashtags" => []} = conn - |> get("/api/v1/search", %{"q" => "2hu", "type" => "statuses"}) - |> json_response(200) + |> get("/api/v1/search?q=2hu&type=statuses") + |> json_response_and_validate_schema(200) assert %{"statuses" => [], "accounts" => [_user_two], "hashtags" => []} = conn - |> get("/api/v1/search", %{"q" => "2hu", "type" => "accounts"}) - |> json_response(200) + |> get("/api/v1/search?q=2hu&type=accounts") + |> json_response_and_validate_schema(200) end test "search uses account_id to filter statuses by the author", %{conn: conn} do user = insert(:user, %{nickname: "shp@shitposter.club"}) user_two = insert(:user, %{nickname: "shp@heldscal.la", name: "I love 2hu"}) - {:ok, activity1} = CommonAPI.post(user, %{"status" => "This is about 2hu"}) - {:ok, activity2} = CommonAPI.post(user_two, %{"status" => "This is also about 2hu"}) + {:ok, activity1} = CommonAPI.post(user, %{status: "This is about 2hu"}) + {:ok, activity2} = CommonAPI.post(user_two, %{status: "This is also about 2hu"}) results = conn - |> get("/api/v1/search", %{"q" => "2hu", "account_id" => user.id}) - |> json_response(200) + |> get("/api/v1/search?q=2hu&account_id=#{user.id}") + |> json_response_and_validate_schema(200) assert [%{"id" => activity_id1}] = results["statuses"] assert activity_id1 == activity1.id @@ -306,8 +308,8 @@ test "search uses account_id to filter statuses by the author", %{conn: conn} do results = conn - |> get("/api/v1/search", %{"q" => "2hu", "account_id" => user_two.id}) - |> json_response(200) + |> get("/api/v1/search?q=2hu&account_id=#{user_two.id}") + |> json_response_and_validate_schema(200) assert [%{"id" => activity_id2}] = results["statuses"] assert activity_id2 == activity2.id diff --git a/test/web/mastodon_api/controllers/status_controller_test.exs b/test/web/mastodon_api/controllers/status_controller_test.exs index d59974d50..700c82e4f 100644 --- a/test/web/mastodon_api/controllers/status_controller_test.exs +++ b/test/web/mastodon_api/controllers/status_controller_test.exs @@ -32,13 +32,14 @@ test "posting a status does not increment reblog_count when relaying", %{conn: c response = conn + |> put_req_header("content-type", "application/json") |> post("api/v1/statuses", %{ "content_type" => "text/plain", "source" => "Pleroma FE", "status" => "Hello world", "visibility" => "public" }) - |> json_response(200) + |> json_response_and_validate_schema(200) assert response["reblogs_count"] == 0 ObanHelpers.perform_all() @@ -46,7 +47,7 @@ test "posting a status does not increment reblog_count when relaying", %{conn: c response = conn |> get("api/v1/statuses/#{response["id"]}", %{}) - |> json_response(200) + |> json_response_and_validate_schema(200) assert response["reblogs_count"] == 0 end @@ -56,11 +57,12 @@ test "posting a status", %{conn: conn} do conn_one = conn + |> put_req_header("content-type", "application/json") |> put_req_header("idempotency-key", idempotency_key) |> post("/api/v1/statuses", %{ "status" => "cofe", "spoiler_text" => "2hu", - "sensitive" => "false" + "sensitive" => "0" }) {:ok, ttl} = Cachex.ttl(:idempotency_cache, idempotency_key) @@ -68,17 +70,18 @@ test "posting a status", %{conn: conn} do assert ttl > :timer.seconds(6 * 60 * 60 - 1) assert %{"content" => "cofe", "id" => id, "spoiler_text" => "2hu", "sensitive" => false} = - json_response(conn_one, 200) + json_response_and_validate_schema(conn_one, 200) assert Activity.get_by_id(id) conn_two = conn + |> put_req_header("content-type", "application/json") |> put_req_header("idempotency-key", idempotency_key) |> post("/api/v1/statuses", %{ "status" => "cofe", "spoiler_text" => "2hu", - "sensitive" => "false" + "sensitive" => 0 }) assert %{"id" => second_id} = json_response(conn_two, 200) @@ -86,13 +89,14 @@ test "posting a status", %{conn: conn} do conn_three = conn + |> put_req_header("content-type", "application/json") |> post("/api/v1/statuses", %{ "status" => "cofe", "spoiler_text" => "2hu", - "sensitive" => "false" + "sensitive" => "False" }) - assert %{"id" => third_id} = json_response(conn_three, 200) + assert %{"id" => third_id} = json_response_and_validate_schema(conn_three, 200) refute id == third_id # An activity that will expire: @@ -101,12 +105,15 @@ test "posting a status", %{conn: conn} do conn_four = conn + |> put_req_header("content-type", "application/json") |> post("api/v1/statuses", %{ "status" => "oolong", "expires_in" => expires_in }) - assert fourth_response = %{"id" => fourth_id} = json_response(conn_four, 200) + 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) @@ -130,22 +137,24 @@ test "it fails to create a status if `expires_in` is less or equal than an hour" assert %{"error" => "Expiry date is too soon"} = conn + |> put_req_header("content-type", "application/json") |> post("api/v1/statuses", %{ "status" => "oolong", "expires_in" => expires_in }) - |> json_response(422) + |> json_response_and_validate_schema(422) # 30 minutes expires_in = 30 * 60 assert %{"error" => "Expiry date is too soon"} = conn + |> put_req_header("content-type", "application/json") |> post("api/v1/statuses", %{ "status" => "oolong", "expires_in" => expires_in }) - |> json_response(422) + |> json_response_and_validate_schema(422) end test "posting an undefined status with an attachment", %{user: user, conn: conn} do @@ -158,21 +167,24 @@ test "posting an undefined status with an attachment", %{user: user, conn: conn} {:ok, upload} = ActivityPub.upload(file, actor: user.ap_id) conn = - post(conn, "/api/v1/statuses", %{ + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses", %{ "media_ids" => [to_string(upload.id)] }) - assert json_response(conn, 200) + assert json_response_and_validate_schema(conn, 200) end test "replying to a status", %{user: user, conn: conn} do - {:ok, replied_to} = CommonAPI.post(user, %{"status" => "cofe"}) + {:ok, replied_to} = CommonAPI.post(user, %{status: "cofe"}) conn = conn + |> put_req_header("content-type", "application/json") |> post("/api/v1/statuses", %{"status" => "xD", "in_reply_to_id" => replied_to.id}) - assert %{"content" => "xD", "id" => id} = json_response(conn, 200) + assert %{"content" => "xD", "id" => id} = json_response_and_validate_schema(conn, 200) activity = Activity.get_by_id(id) @@ -184,43 +196,56 @@ test "replying to a direct message with visibility other than direct", %{ user: user, conn: conn } do - {:ok, replied_to} = CommonAPI.post(user, %{"status" => "suya..", "visibility" => "direct"}) + {:ok, replied_to} = CommonAPI.post(user, %{status: "suya..", visibility: "direct"}) Enum.each(["public", "private", "unlisted"], fn visibility -> conn = conn + |> put_req_header("content-type", "application/json") |> post("/api/v1/statuses", %{ "status" => "@#{user.nickname} hey", "in_reply_to_id" => replied_to.id, "visibility" => visibility }) - assert json_response(conn, 422) == %{"error" => "The message visibility must be direct"} + assert json_response_and_validate_schema(conn, 422) == %{ + "error" => "The message visibility must be direct" + } end) end test "posting a status with an invalid in_reply_to_id", %{conn: conn} do - conn = post(conn, "/api/v1/statuses", %{"status" => "xD", "in_reply_to_id" => ""}) + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses", %{"status" => "xD", "in_reply_to_id" => ""}) - assert %{"content" => "xD", "id" => id} = json_response(conn, 200) + assert %{"content" => "xD", "id" => id} = json_response_and_validate_schema(conn, 200) assert Activity.get_by_id(id) end test "posting a sensitive status", %{conn: conn} do - conn = post(conn, "/api/v1/statuses", %{"status" => "cofe", "sensitive" => true}) + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses", %{"status" => "cofe", "sensitive" => true}) + + assert %{"content" => "cofe", "id" => id, "sensitive" => true} = + json_response_and_validate_schema(conn, 200) - assert %{"content" => "cofe", "id" => id, "sensitive" => true} = json_response(conn, 200) assert Activity.get_by_id(id) end test "posting a fake status", %{conn: conn} do real_conn = - post(conn, "/api/v1/statuses", %{ + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses", %{ "status" => "\"Tenshi Eating a Corndog\" is a much discussed concept on /jp/. The significance of it is disputed, so I will focus on one core concept: the symbolism behind it" }) - real_status = json_response(real_conn, 200) + real_status = json_response_and_validate_schema(real_conn, 200) assert real_status assert Object.get_by_ap_id(real_status["uri"]) @@ -234,13 +259,15 @@ test "posting a fake status", %{conn: conn} do |> Kernel.put_in(["pleroma", "conversation_id"], nil) fake_conn = - post(conn, "/api/v1/statuses", %{ + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses", %{ "status" => "\"Tenshi Eating a Corndog\" is a much discussed concept on /jp/. The significance of it is disputed, so I will focus on one core concept: the symbolism behind it", "preview" => true }) - fake_status = json_response(fake_conn, 200) + fake_status = json_response_and_validate_schema(fake_conn, 200) assert fake_status refute Object.get_by_ap_id(fake_status["uri"]) @@ -261,11 +288,15 @@ test "posting a status with OGP link preview", %{conn: conn} do Config.put([:rich_media, :enabled], true) conn = - post(conn, "/api/v1/statuses", %{ + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses", %{ "status" => "https://example.com/ogp" }) - assert %{"id" => id, "card" => %{"title" => "The Rock"}} = json_response(conn, 200) + assert %{"id" => id, "card" => %{"title" => "The Rock"}} = + json_response_and_validate_schema(conn, 200) + assert Activity.get_by_id(id) end @@ -273,9 +304,12 @@ test "posting a direct status", %{conn: conn} do user2 = insert(:user) content = "direct cofe @#{user2.nickname}" - conn = post(conn, "api/v1/statuses", %{"status" => content, "visibility" => "direct"}) + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("api/v1/statuses", %{"status" => content, "visibility" => "direct"}) - assert %{"id" => id} = response = json_response(conn, 200) + assert %{"id" => id} = response = json_response_and_validate_schema(conn, 200) assert response["visibility"] == "direct" assert response["pleroma"]["direct_conversation_id"] assert activity = Activity.get_by_id(id) @@ -289,21 +323,45 @@ test "posting a direct status", %{conn: conn} do setup do: oauth_access(["write:statuses"]) test "creates a scheduled activity", %{conn: conn} do - scheduled_at = NaiveDateTime.add(NaiveDateTime.utc_now(), :timer.minutes(120), :millisecond) + scheduled_at = + NaiveDateTime.add(NaiveDateTime.utc_now(), :timer.minutes(120), :millisecond) + |> NaiveDateTime.to_iso8601() + |> Kernel.<>("Z") conn = - post(conn, "/api/v1/statuses", %{ + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses", %{ "status" => "scheduled", "scheduled_at" => scheduled_at }) - assert %{"scheduled_at" => expected_scheduled_at} = json_response(conn, 200) + assert %{"scheduled_at" => expected_scheduled_at} = + json_response_and_validate_schema(conn, 200) + assert expected_scheduled_at == CommonAPI.Utils.to_masto_date(scheduled_at) assert [] == Repo.all(Activity) end + test "ignores nil values", %{conn: conn} do + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses", %{ + "status" => "not scheduled", + "scheduled_at" => nil + }) + + assert result = json_response_and_validate_schema(conn, 200) + assert Activity.get_by_id(result["id"]) + end + test "creates a scheduled activity with a media attachment", %{user: user, conn: conn} do - scheduled_at = NaiveDateTime.add(NaiveDateTime.utc_now(), :timer.minutes(120), :millisecond) + scheduled_at = + NaiveDateTime.utc_now() + |> NaiveDateTime.add(:timer.minutes(120), :millisecond) + |> NaiveDateTime.to_iso8601() + |> Kernel.<>("Z") file = %Plug.Upload{ content_type: "image/jpg", @@ -314,13 +372,17 @@ test "creates a scheduled activity with a media attachment", %{user: user, conn: {:ok, upload} = ActivityPub.upload(file, actor: user.ap_id) conn = - post(conn, "/api/v1/statuses", %{ + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses", %{ "media_ids" => [to_string(upload.id)], "status" => "scheduled", "scheduled_at" => scheduled_at }) - assert %{"media_attachments" => [media_attachment]} = json_response(conn, 200) + assert %{"media_attachments" => [media_attachment]} = + json_response_and_validate_schema(conn, 200) + assert %{"type" => "image"} = media_attachment end @@ -328,14 +390,18 @@ test "skips the scheduling and creates the activity if scheduled_at is earlier t %{conn: conn} do scheduled_at = NaiveDateTime.add(NaiveDateTime.utc_now(), :timer.minutes(5) - 1, :millisecond) + |> NaiveDateTime.to_iso8601() + |> Kernel.<>("Z") conn = - post(conn, "/api/v1/statuses", %{ + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses", %{ "status" => "not scheduled", "scheduled_at" => scheduled_at }) - assert %{"content" => "not scheduled"} = json_response(conn, 200) + assert %{"content" => "not scheduled"} = json_response_and_validate_schema(conn, 200) assert [] == Repo.all(ScheduledActivity) end @@ -344,14 +410,19 @@ test "returns error when daily user limit is exceeded", %{user: user, conn: conn NaiveDateTime.utc_now() |> NaiveDateTime.add(:timer.minutes(6), :millisecond) |> NaiveDateTime.to_iso8601() + # TODO + |> Kernel.<>("Z") attrs = %{params: %{}, scheduled_at: today} {:ok, _} = ScheduledActivity.create(user, attrs) {:ok, _} = ScheduledActivity.create(user, attrs) - conn = post(conn, "/api/v1/statuses", %{"status" => "scheduled", "scheduled_at" => today}) + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses", %{"status" => "scheduled", "scheduled_at" => today}) - assert %{"error" => "daily limit exceeded"} == json_response(conn, 422) + assert %{"error" => "daily limit exceeded"} == json_response_and_validate_schema(conn, 422) end test "returns error when total user limit is exceeded", %{user: user, conn: conn} do @@ -359,11 +430,13 @@ test "returns error when total user limit is exceeded", %{user: user, conn: conn NaiveDateTime.utc_now() |> NaiveDateTime.add(:timer.minutes(6), :millisecond) |> NaiveDateTime.to_iso8601() + |> Kernel.<>("Z") tomorrow = NaiveDateTime.utc_now() |> NaiveDateTime.add(:timer.hours(36), :millisecond) |> NaiveDateTime.to_iso8601() + |> Kernel.<>("Z") attrs = %{params: %{}, scheduled_at: today} {:ok, _} = ScheduledActivity.create(user, attrs) @@ -371,9 +444,11 @@ test "returns error when total user limit is exceeded", %{user: user, conn: conn {:ok, _} = ScheduledActivity.create(user, %{params: %{}, scheduled_at: tomorrow}) conn = - post(conn, "/api/v1/statuses", %{"status" => "scheduled", "scheduled_at" => tomorrow}) + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses", %{"status" => "scheduled", "scheduled_at" => tomorrow}) - assert %{"error" => "total limit exceeded"} == json_response(conn, 422) + assert %{"error" => "total limit exceeded"} == json_response_and_validate_schema(conn, 422) end end @@ -384,12 +459,17 @@ test "posting a poll", %{conn: conn} do time = NaiveDateTime.utc_now() conn = - post(conn, "/api/v1/statuses", %{ + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses", %{ "status" => "Who is the #bestgrill?", - "poll" => %{"options" => ["Rei", "Asuka", "Misato"], "expires_in" => 420} + "poll" => %{ + "options" => ["Rei", "Asuka", "Misato"], + "expires_in" => 420 + } }) - response = json_response(conn, 200) + response = json_response_and_validate_schema(conn, 200) assert Enum.all?(response["poll"]["options"], fn %{"title" => title} -> title in ["Rei", "Asuka", "Misato"] @@ -408,12 +488,14 @@ test "option limit is enforced", %{conn: conn} do limit = Config.get([:instance, :poll_limits, :max_options]) conn = - post(conn, "/api/v1/statuses", %{ + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses", %{ "status" => "desu~", "poll" => %{"options" => Enum.map(0..limit, fn _ -> "desu" end), "expires_in" => 1} }) - %{"error" => error} = json_response(conn, 422) + %{"error" => error} = json_response_and_validate_schema(conn, 422) assert error == "Poll can't contain more than #{limit} options" end @@ -421,7 +503,9 @@ test "option character limit is enforced", %{conn: conn} do limit = Config.get([:instance, :poll_limits, :max_option_chars]) conn = - post(conn, "/api/v1/statuses", %{ + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses", %{ "status" => "...", "poll" => %{ "options" => [Enum.reduce(0..limit, "", fn _, acc -> acc <> "." end)], @@ -429,7 +513,7 @@ test "option character limit is enforced", %{conn: conn} do } }) - %{"error" => error} = json_response(conn, 422) + %{"error" => error} = json_response_and_validate_schema(conn, 422) assert error == "Poll options cannot be longer than #{limit} characters each" end @@ -437,7 +521,9 @@ test "minimal date limit is enforced", %{conn: conn} do limit = Config.get([:instance, :poll_limits, :min_expiration]) conn = - post(conn, "/api/v1/statuses", %{ + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses", %{ "status" => "imagine arbitrary limits", "poll" => %{ "options" => ["this post was made by pleroma gang"], @@ -445,7 +531,7 @@ test "minimal date limit is enforced", %{conn: conn} do } }) - %{"error" => error} = json_response(conn, 422) + %{"error" => error} = json_response_and_validate_schema(conn, 422) assert error == "Expiration date is too soon" end @@ -453,7 +539,9 @@ test "maximum date limit is enforced", %{conn: conn} do limit = Config.get([:instance, :poll_limits, :max_expiration]) conn = - post(conn, "/api/v1/statuses", %{ + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses", %{ "status" => "imagine arbitrary limits", "poll" => %{ "options" => ["this post was made by pleroma gang"], @@ -461,7 +549,7 @@ test "maximum date limit is enforced", %{conn: conn} do } }) - %{"error" => error} = json_response(conn, 422) + %{"error" => error} = json_response_and_validate_schema(conn, 422) assert error == "Expiration date is too far in the future" end end @@ -472,7 +560,7 @@ test "get a status" do conn = get(conn, "/api/v1/statuses/#{activity.id}") - assert %{"id" => id} = json_response(conn, 200) + assert %{"id" => id} = json_response_and_validate_schema(conn, 200) assert id == to_string(activity.id) end @@ -492,13 +580,13 @@ defp local_and_remote_activities do test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do res_conn = get(conn, "/api/v1/statuses/#{local.id}") - assert json_response(res_conn, :not_found) == %{ + assert json_response_and_validate_schema(res_conn, :not_found) == %{ "error" => "Record not found" } res_conn = get(conn, "/api/v1/statuses/#{remote.id}") - assert json_response(res_conn, :not_found) == %{ + assert json_response_and_validate_schema(res_conn, :not_found) == %{ "error" => "Record not found" } end @@ -506,10 +594,10 @@ test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} d test "if user is authenticated", %{local: local, remote: remote} do %{conn: conn} = oauth_access(["read"]) res_conn = get(conn, "/api/v1/statuses/#{local.id}") - assert %{"id" => _} = json_response(res_conn, 200) + assert %{"id" => _} = json_response_and_validate_schema(res_conn, 200) res_conn = get(conn, "/api/v1/statuses/#{remote.id}") - assert %{"id" => _} = json_response(res_conn, 200) + assert %{"id" => _} = json_response_and_validate_schema(res_conn, 200) end end @@ -521,21 +609,21 @@ test "if user is authenticated", %{local: local, remote: remote} do test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do res_conn = get(conn, "/api/v1/statuses/#{local.id}") - assert json_response(res_conn, :not_found) == %{ + assert json_response_and_validate_schema(res_conn, :not_found) == %{ "error" => "Record not found" } res_conn = get(conn, "/api/v1/statuses/#{remote.id}") - assert %{"id" => _} = json_response(res_conn, 200) + assert %{"id" => _} = json_response_and_validate_schema(res_conn, 200) end test "if user is authenticated", %{local: local, remote: remote} do %{conn: conn} = oauth_access(["read"]) res_conn = get(conn, "/api/v1/statuses/#{local.id}") - assert %{"id" => _} = json_response(res_conn, 200) + assert %{"id" => _} = json_response_and_validate_schema(res_conn, 200) res_conn = get(conn, "/api/v1/statuses/#{remote.id}") - assert %{"id" => _} = json_response(res_conn, 200) + assert %{"id" => _} = json_response_and_validate_schema(res_conn, 200) end end @@ -546,11 +634,11 @@ test "if user is authenticated", %{local: local, remote: remote} do test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do res_conn = get(conn, "/api/v1/statuses/#{local.id}") - assert %{"id" => _} = json_response(res_conn, 200) + assert %{"id" => _} = json_response_and_validate_schema(res_conn, 200) res_conn = get(conn, "/api/v1/statuses/#{remote.id}") - assert json_response(res_conn, :not_found) == %{ + assert json_response_and_validate_schema(res_conn, :not_found) == %{ "error" => "Record not found" } end @@ -558,10 +646,10 @@ test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} d test "if user is authenticated", %{local: local, remote: remote} do %{conn: conn} = oauth_access(["read"]) res_conn = get(conn, "/api/v1/statuses/#{local.id}") - assert %{"id" => _} = json_response(res_conn, 200) + assert %{"id" => _} = json_response_and_validate_schema(res_conn, 200) res_conn = get(conn, "/api/v1/statuses/#{remote.id}") - assert %{"id" => _} = json_response(res_conn, 200) + assert %{"id" => _} = json_response_and_validate_schema(res_conn, 200) end end @@ -571,7 +659,7 @@ test "getting a status that doesn't exist returns 404" do conn = get(conn, "/api/v1/statuses/#{String.downcase(activity.id)}") - assert json_response(conn, 404) == %{"error" => "Record not found"} + assert json_response_and_validate_schema(conn, 404) == %{"error" => "Record not found"} end test "get a direct status" do @@ -579,7 +667,7 @@ test "get a direct status" do other_user = insert(:user) {:ok, activity} = - CommonAPI.post(user, %{"status" => "@#{other_user.nickname}", "visibility" => "direct"}) + CommonAPI.post(user, %{status: "@#{other_user.nickname}", visibility: "direct"}) conn = conn @@ -588,7 +676,7 @@ test "get a direct status" do [participation] = Participation.for_user(user) - res = json_response(conn, 200) + res = json_response_and_validate_schema(conn, 200) assert res["pleroma"]["direct_conversation_id"] == participation.id end @@ -600,7 +688,8 @@ test "get statuses by IDs" do query_string = "ids[]=#{id1}&ids[]=#{id2}" conn = get(conn, "/api/v1/statuses/?#{query_string}") - assert [%{"id" => ^id1}, %{"id" => ^id2}] = Enum.sort_by(json_response(conn, :ok), & &1["id"]) + assert [%{"id" => ^id1}, %{"id" => ^id2}] = + Enum.sort_by(json_response_and_validate_schema(conn, :ok), & &1["id"]) end describe "getting statuses by ids with restricted unauthenticated for local and remote" do @@ -611,17 +700,17 @@ test "get statuses by IDs" do setup do: clear_config([:restrict_unauthenticated, :activities, :remote], true) test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do - res_conn = get(conn, "/api/v1/statuses", %{ids: [local.id, remote.id]}) + res_conn = get(conn, "/api/v1/statuses?ids[]=#{local.id}&ids[]=#{remote.id}") - assert json_response(res_conn, 200) == [] + assert json_response_and_validate_schema(res_conn, 200) == [] end test "if user is authenticated", %{local: local, remote: remote} do %{conn: conn} = oauth_access(["read"]) - res_conn = get(conn, "/api/v1/statuses", %{ids: [local.id, remote.id]}) + res_conn = get(conn, "/api/v1/statuses?ids[]=#{local.id}&ids[]=#{remote.id}") - assert length(json_response(res_conn, 200)) == 2 + assert length(json_response_and_validate_schema(res_conn, 200)) == 2 end end @@ -631,18 +720,18 @@ test "if user is authenticated", %{local: local, remote: remote} do setup do: clear_config([:restrict_unauthenticated, :activities, :local], true) test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do - res_conn = get(conn, "/api/v1/statuses", %{ids: [local.id, remote.id]}) + res_conn = get(conn, "/api/v1/statuses?ids[]=#{local.id}&ids[]=#{remote.id}") remote_id = remote.id - assert [%{"id" => ^remote_id}] = json_response(res_conn, 200) + assert [%{"id" => ^remote_id}] = json_response_and_validate_schema(res_conn, 200) end test "if user is authenticated", %{local: local, remote: remote} do %{conn: conn} = oauth_access(["read"]) - res_conn = get(conn, "/api/v1/statuses", %{ids: [local.id, remote.id]}) + res_conn = get(conn, "/api/v1/statuses?ids[]=#{local.id}&ids[]=#{remote.id}") - assert length(json_response(res_conn, 200)) == 2 + assert length(json_response_and_validate_schema(res_conn, 200)) == 2 end end @@ -652,18 +741,18 @@ test "if user is authenticated", %{local: local, remote: remote} do setup do: clear_config([:restrict_unauthenticated, :activities, :remote], true) test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do - res_conn = get(conn, "/api/v1/statuses", %{ids: [local.id, remote.id]}) + res_conn = get(conn, "/api/v1/statuses?ids[]=#{local.id}&ids[]=#{remote.id}") local_id = local.id - assert [%{"id" => ^local_id}] = json_response(res_conn, 200) + assert [%{"id" => ^local_id}] = json_response_and_validate_schema(res_conn, 200) end test "if user is authenticated", %{local: local, remote: remote} do %{conn: conn} = oauth_access(["read"]) - res_conn = get(conn, "/api/v1/statuses", %{ids: [local.id, remote.id]}) + res_conn = get(conn, "/api/v1/statuses?ids[]=#{local.id}&ids[]=#{remote.id}") - assert length(json_response(res_conn, 200)) == 2 + assert length(json_response_and_validate_schema(res_conn, 200)) == 2 end end @@ -677,7 +766,7 @@ test "when you created it" do |> assign(:user, author) |> delete("/api/v1/statuses/#{activity.id}") - assert %{} = json_response(conn, 200) + assert %{} = json_response_and_validate_schema(conn, 200) refute Activity.get_by_id(activity.id) end @@ -691,7 +780,7 @@ test "when it doesn't exist" do |> assign(:user, author) |> delete("/api/v1/statuses/#{String.downcase(activity.id)}") - assert %{"error" => "Record not found"} == json_response(conn, 404) + assert %{"error" => "Record not found"} == json_response_and_validate_schema(conn, 404) end test "when you didn't create it" do @@ -700,7 +789,7 @@ test "when you didn't create it" do conn = delete(conn, "/api/v1/statuses/#{activity.id}") - assert %{"error" => _} = json_response(conn, 403) + assert %{"error" => _} = json_response_and_validate_schema(conn, 403) assert Activity.get_by_id(activity.id) == activity end @@ -717,7 +806,7 @@ test "when you're an admin or moderator", %{conn: conn} do |> assign(:token, insert(:oauth_token, user: admin, scopes: ["write:statuses"])) |> delete("/api/v1/statuses/#{activity1.id}") - assert %{} = json_response(res_conn, 200) + assert %{} = json_response_and_validate_schema(res_conn, 200) res_conn = conn @@ -725,7 +814,7 @@ test "when you're an admin or moderator", %{conn: conn} do |> assign(:token, insert(:oauth_token, user: moderator, scopes: ["write:statuses"])) |> delete("/api/v1/statuses/#{activity2.id}") - assert %{} = json_response(res_conn, 200) + assert %{} = json_response_and_validate_schema(res_conn, 200) refute Activity.get_by_id(activity1.id) refute Activity.get_by_id(activity2.id) @@ -738,12 +827,15 @@ test "when you're an admin or moderator", %{conn: conn} do test "reblogs and returns the reblogged status", %{conn: conn} do activity = insert(:note_activity) - conn = post(conn, "/api/v1/statuses/#{activity.id}/reblog") + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses/#{activity.id}/reblog") assert %{ "reblog" => %{"id" => id, "reblogged" => true, "reblogs_count" => 1}, "reblogged" => true - } = json_response(conn, 200) + } = json_response_and_validate_schema(conn, 200) assert to_string(activity.id) == id end @@ -751,21 +843,30 @@ test "reblogs and returns the reblogged status", %{conn: conn} do test "returns 404 if the reblogged status doesn't exist", %{conn: conn} do activity = insert(:note_activity) - conn = post(conn, "/api/v1/statuses/#{String.downcase(activity.id)}/reblog") + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses/#{String.downcase(activity.id)}/reblog") - assert %{"error" => "Record not found"} = json_response(conn, 404) + assert %{"error" => "Record not found"} = json_response_and_validate_schema(conn, 404) end test "reblogs privately and returns the reblogged status", %{conn: conn} do activity = insert(:note_activity) - conn = post(conn, "/api/v1/statuses/#{activity.id}/reblog", %{"visibility" => "private"}) + conn = + conn + |> put_req_header("content-type", "application/json") + |> post( + "/api/v1/statuses/#{activity.id}/reblog", + %{"visibility" => "private"} + ) assert %{ "reblog" => %{"id" => id, "reblogged" => true, "reblogs_count" => 1}, "reblogged" => true, "visibility" => "private" - } = json_response(conn, 200) + } = json_response_and_validate_schema(conn, 200) assert to_string(activity.id) == id end @@ -775,10 +876,10 @@ test "reblogged status for another user" do user1 = insert(:user) user2 = insert(:user) user3 = insert(:user) - CommonAPI.favorite(activity.id, user2) + {:ok, _} = CommonAPI.favorite(user2, activity.id) {:ok, _bookmark} = Pleroma.Bookmark.create(user2.id, activity.id) - {:ok, reblog_activity1, _object} = CommonAPI.repeat(activity.id, user1) - {:ok, _, _object} = CommonAPI.repeat(activity.id, user2) + {:ok, reblog_activity1} = CommonAPI.repeat(activity.id, user1) + {:ok, _} = CommonAPI.repeat(activity.id, user2) conn_res = build_conn() @@ -791,7 +892,7 @@ test "reblogged status for another user" do "reblogged" => false, "favourited" => false, "bookmarked" => false - } = json_response(conn_res, 200) + } = json_response_and_validate_schema(conn_res, 200) conn_res = build_conn() @@ -804,7 +905,7 @@ test "reblogged status for another user" do "reblogged" => true, "favourited" => true, "bookmarked" => true - } = json_response(conn_res, 200) + } = json_response_and_validate_schema(conn_res, 200) assert to_string(activity.id) == id end @@ -816,19 +917,26 @@ test "reblogged status for another user" do test "unreblogs and returns the unreblogged status", %{user: user, conn: conn} do activity = insert(:note_activity) - {:ok, _, _} = CommonAPI.repeat(activity.id, user) + {:ok, _} = CommonAPI.repeat(activity.id, user) - conn = post(conn, "/api/v1/statuses/#{activity.id}/unreblog") + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses/#{activity.id}/unreblog") - assert %{"id" => id, "reblogged" => false, "reblogs_count" => 0} = json_response(conn, 200) + assert %{"id" => id, "reblogged" => false, "reblogs_count" => 0} = + json_response_and_validate_schema(conn, 200) assert to_string(activity.id) == id end test "returns 404 error when activity does not exist", %{conn: conn} do - conn = post(conn, "/api/v1/statuses/foo/unreblog") + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses/foo/unreblog") - assert json_response(conn, 404) == %{"error" => "Record not found"} + assert json_response_and_validate_schema(conn, 404) == %{"error" => "Record not found"} end end @@ -838,10 +946,13 @@ test "returns 404 error when activity does not exist", %{conn: conn} do test "favs a status and returns it", %{conn: conn} do activity = insert(:note_activity) - conn = post(conn, "/api/v1/statuses/#{activity.id}/favourite") + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses/#{activity.id}/favourite") assert %{"id" => id, "favourites_count" => 1, "favourited" => true} = - json_response(conn, 200) + json_response_and_validate_schema(conn, 200) assert to_string(activity.id) == id end @@ -849,14 +960,23 @@ test "favs a status and returns it", %{conn: conn} do test "favoriting twice will just return 200", %{conn: conn} do activity = insert(:note_activity) - post(conn, "/api/v1/statuses/#{activity.id}/favourite") - assert post(conn, "/api/v1/statuses/#{activity.id}/favourite") |> json_response(200) + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses/#{activity.id}/favourite") + + assert conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses/#{activity.id}/favourite") + |> json_response_and_validate_schema(200) end test "returns 404 error for a wrong id", %{conn: conn} do - conn = post(conn, "/api/v1/statuses/1/favourite") + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses/1/favourite") - assert json_response(conn, 404) == %{"error" => "Record not found"} + assert json_response_and_validate_schema(conn, 404) == %{"error" => "Record not found"} end end @@ -866,20 +986,26 @@ test "returns 404 error for a wrong id", %{conn: conn} do test "unfavorites a status and returns it", %{user: user, conn: conn} do activity = insert(:note_activity) - {:ok, _, _} = CommonAPI.favorite(activity.id, user) + {:ok, _} = CommonAPI.favorite(user, activity.id) - conn = post(conn, "/api/v1/statuses/#{activity.id}/unfavourite") + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses/#{activity.id}/unfavourite") assert %{"id" => id, "favourites_count" => 0, "favourited" => false} = - json_response(conn, 200) + json_response_and_validate_schema(conn, 200) assert to_string(activity.id) == id end test "returns 404 error for a wrong id", %{conn: conn} do - conn = post(conn, "/api/v1/statuses/1/unfavourite") + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses/1/unfavourite") - assert json_response(conn, 404) == %{"error" => "Record not found"} + assert json_response_and_validate_schema(conn, 404) == %{"error" => "Record not found"} end end @@ -887,7 +1013,7 @@ test "returns 404 error for a wrong id", %{conn: conn} do setup do: oauth_access(["write:accounts"]) setup %{user: user} do - {:ok, activity} = CommonAPI.post(user, %{"status" => "HI!!!"}) + {:ok, activity} = CommonAPI.post(user, %{status: "HI!!!"}) %{activity: activity} end @@ -899,21 +1025,25 @@ test "pin status", %{conn: conn, user: user, activity: activity} do assert %{"id" => ^id_str, "pinned" => true} = conn + |> put_req_header("content-type", "application/json") |> post("/api/v1/statuses/#{activity.id}/pin") - |> json_response(200) + |> json_response_and_validate_schema(200) assert [%{"id" => ^id_str, "pinned" => true}] = conn |> get("/api/v1/accounts/#{user.id}/statuses?pinned=true") - |> json_response(200) + |> json_response_and_validate_schema(200) end test "/pin: returns 400 error when activity is not public", %{conn: conn, user: user} do - {:ok, dm} = CommonAPI.post(user, %{"status" => "test", "visibility" => "direct"}) + {:ok, dm} = CommonAPI.post(user, %{status: "test", visibility: "direct"}) - conn = post(conn, "/api/v1/statuses/#{dm.id}/pin") + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses/#{dm.id}/pin") - assert json_response(conn, 400) == %{"error" => "Could not pin"} + assert json_response_and_validate_schema(conn, 400) == %{"error" => "Could not pin"} end test "unpin status", %{conn: conn, user: user, activity: activity} do @@ -926,29 +1056,33 @@ test "unpin status", %{conn: conn, user: user, activity: activity} do conn |> assign(:user, user) |> post("/api/v1/statuses/#{activity.id}/unpin") - |> json_response(200) + |> json_response_and_validate_schema(200) assert [] = conn |> get("/api/v1/accounts/#{user.id}/statuses?pinned=true") - |> json_response(200) + |> json_response_and_validate_schema(200) end test "/unpin: returns 400 error when activity is not exist", %{conn: conn} do - conn = post(conn, "/api/v1/statuses/1/unpin") + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses/1/unpin") - assert json_response(conn, 400) == %{"error" => "Could not unpin"} + assert json_response_and_validate_schema(conn, 400) == %{"error" => "Could not unpin"} end test "max pinned statuses", %{conn: conn, user: user, activity: activity_one} do - {:ok, activity_two} = CommonAPI.post(user, %{"status" => "HI!!!"}) + {:ok, activity_two} = CommonAPI.post(user, %{status: "HI!!!"}) id_str_one = to_string(activity_one.id) assert %{"id" => ^id_str_one, "pinned" => true} = conn + |> put_req_header("content-type", "application/json") |> post("/api/v1/statuses/#{id_str_one}/pin") - |> json_response(200) + |> json_response_and_validate_schema(200) user = refresh_record(user) @@ -956,7 +1090,7 @@ test "max pinned statuses", %{conn: conn, user: user, activity: activity_one} do conn |> assign(:user, user) |> post("/api/v1/statuses/#{activity_two.id}/pin") - |> json_response(400) + |> json_response_and_validate_schema(400) end end @@ -970,7 +1104,7 @@ test "max pinned statuses", %{conn: conn, user: user, activity: activity_one} do test "returns rich-media card", %{conn: conn, user: user} do Tesla.Mock.mock(fn env -> apply(HttpRequestMock, :request, [env]) end) - {:ok, activity} = CommonAPI.post(user, %{"status" => "https://example.com/ogp"}) + {:ok, activity} = CommonAPI.post(user, %{status: "https://example.com/ogp"}) card_data = %{ "image" => "http://ia.media-imdb.com/images/rock.jpg", @@ -996,18 +1130,18 @@ test "returns rich-media card", %{conn: conn, user: user} do response = conn |> get("/api/v1/statuses/#{activity.id}/card") - |> json_response(200) + |> json_response_and_validate_schema(200) assert response == card_data # works with private posts {:ok, activity} = - CommonAPI.post(user, %{"status" => "https://example.com/ogp", "visibility" => "direct"}) + CommonAPI.post(user, %{status: "https://example.com/ogp", visibility: "direct"}) response_two = conn |> get("/api/v1/statuses/#{activity.id}/card") - |> json_response(200) + |> json_response_and_validate_schema(200) assert response_two == card_data end @@ -1015,13 +1149,12 @@ test "returns rich-media card", %{conn: conn, user: user} do test "replaces missing description with an empty string", %{conn: conn, user: user} do Tesla.Mock.mock(fn env -> apply(HttpRequestMock, :request, [env]) end) - {:ok, activity} = - CommonAPI.post(user, %{"status" => "https://example.com/ogp-missing-data"}) + {:ok, activity} = CommonAPI.post(user, %{status: "https://example.com/ogp-missing-data"}) response = conn |> get("/api/v1/statuses/#{activity.id}/card") - |> json_response(:ok) + |> json_response_and_validate_schema(:ok) assert response == %{ "type" => "link", @@ -1043,39 +1176,47 @@ test "replaces missing description with an empty string", %{conn: conn, user: us end test "bookmarks" do + bookmarks_uri = "/api/v1/bookmarks" + %{conn: conn} = oauth_access(["write:bookmarks", "read:bookmarks"]) author = insert(:user) - {:ok, activity1} = - CommonAPI.post(author, %{ - "status" => "heweoo?" - }) + {:ok, activity1} = CommonAPI.post(author, %{status: "heweoo?"}) + {:ok, activity2} = CommonAPI.post(author, %{status: "heweoo!"}) - {:ok, activity2} = - CommonAPI.post(author, %{ - "status" => "heweoo!" - }) + response1 = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses/#{activity1.id}/bookmark") - response1 = post(conn, "/api/v1/statuses/#{activity1.id}/bookmark") + assert json_response_and_validate_schema(response1, 200)["bookmarked"] == true - assert json_response(response1, 200)["bookmarked"] == true + response2 = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses/#{activity2.id}/bookmark") - response2 = post(conn, "/api/v1/statuses/#{activity2.id}/bookmark") + assert json_response_and_validate_schema(response2, 200)["bookmarked"] == true - assert json_response(response2, 200)["bookmarked"] == true + bookmarks = get(conn, bookmarks_uri) - bookmarks = get(conn, "/api/v1/bookmarks") + assert [ + json_response_and_validate_schema(response2, 200), + json_response_and_validate_schema(response1, 200) + ] == + json_response_and_validate_schema(bookmarks, 200) - assert [json_response(response2, 200), json_response(response1, 200)] == - json_response(bookmarks, 200) + response1 = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses/#{activity1.id}/unbookmark") - response1 = post(conn, "/api/v1/statuses/#{activity1.id}/unbookmark") + assert json_response_and_validate_schema(response1, 200)["bookmarked"] == false - assert json_response(response1, 200)["bookmarked"] == false + bookmarks = get(conn, bookmarks_uri) - bookmarks = get(conn, "/api/v1/bookmarks") - - assert [json_response(response2, 200)] == json_response(bookmarks, 200) + assert [json_response_and_validate_schema(response2, 200)] == + json_response_and_validate_schema(bookmarks, 200) end describe "conversation muting" do @@ -1083,7 +1224,7 @@ test "bookmarks" do setup do post_user = insert(:user) - {:ok, activity} = CommonAPI.post(post_user, %{"status" => "HIE"}) + {:ok, activity} = CommonAPI.post(post_user, %{status: "HIE"}) %{activity: activity} end @@ -1092,16 +1233,22 @@ test "mute conversation", %{conn: conn, activity: activity} do assert %{"id" => ^id_str, "muted" => true} = conn + |> put_req_header("content-type", "application/json") |> post("/api/v1/statuses/#{activity.id}/mute") - |> json_response(200) + |> json_response_and_validate_schema(200) end test "cannot mute already muted conversation", %{conn: conn, user: user, activity: activity} do {:ok, _} = CommonAPI.add_mute(user, activity) - conn = post(conn, "/api/v1/statuses/#{activity.id}/mute") + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses/#{activity.id}/mute") - assert json_response(conn, 400) == %{"error" => "conversation is already muted"} + assert json_response_and_validate_schema(conn, 400) == %{ + "error" => "conversation is already muted" + } end test "unmute conversation", %{conn: conn, user: user, activity: activity} do @@ -1113,7 +1260,7 @@ test "unmute conversation", %{conn: conn, user: user, activity: activity} do conn # |> assign(:user, user) |> post("/api/v1/statuses/#{activity.id}/unmute") - |> json_response(200) + |> json_response_and_validate_schema(200) end end @@ -1122,16 +1269,17 @@ test "Repeated posts that are replies incorrectly have in_reply_to_id null", %{c user2 = insert(:user) user3 = insert(:user) - {:ok, replied_to} = CommonAPI.post(user1, %{"status" => "cofe"}) + {:ok, replied_to} = CommonAPI.post(user1, %{status: "cofe"}) # Reply to status from another user conn1 = conn |> assign(:user, user2) |> assign(:token, insert(:oauth_token, user: user2, scopes: ["write:statuses"])) + |> put_req_header("content-type", "application/json") |> post("/api/v1/statuses", %{"status" => "xD", "in_reply_to_id" => replied_to.id}) - assert %{"content" => "xD", "id" => id} = json_response(conn1, 200) + assert %{"content" => "xD", "id" => id} = json_response_and_validate_schema(conn1, 200) activity = Activity.get_by_id_with_object(id) @@ -1143,10 +1291,11 @@ test "Repeated posts that are replies incorrectly have in_reply_to_id null", %{c conn |> assign(:user, user3) |> assign(:token, insert(:oauth_token, user: user3, scopes: ["write:statuses"])) + |> put_req_header("content-type", "application/json") |> post("/api/v1/statuses/#{activity.id}/reblog") assert %{"reblog" => %{"id" => id, "reblogged" => true, "reblogs_count" => 1}} = - json_response(conn2, 200) + json_response_and_validate_schema(conn2, 200) assert to_string(activity.id) == id @@ -1169,19 +1318,19 @@ test "Repeated posts that are replies incorrectly have in_reply_to_id null", %{c setup do: oauth_access(["read:accounts"]) setup %{user: user} do - {:ok, activity} = CommonAPI.post(user, %{"status" => "test"}) + {:ok, activity} = CommonAPI.post(user, %{status: "test"}) %{activity: activity} end test "returns users who have favorited the status", %{conn: conn, activity: activity} do other_user = insert(:user) - {:ok, _, _} = CommonAPI.favorite(activity.id, other_user) + {:ok, _} = CommonAPI.favorite(other_user, activity.id) response = conn |> get("/api/v1/statuses/#{activity.id}/favourited_by") - |> json_response(:ok) + |> json_response_and_validate_schema(:ok) [%{"id" => id}] = response @@ -1195,7 +1344,7 @@ test "returns empty array when status has not been favorited yet", %{ response = conn |> get("/api/v1/statuses/#{activity.id}/favourited_by") - |> json_response(:ok) + |> json_response_and_validate_schema(:ok) assert Enum.empty?(response) end @@ -1207,24 +1356,24 @@ test "does not return users who have favorited the status but are blocked", %{ other_user = insert(:user) {:ok, _user_relationship} = User.block(user, other_user) - {:ok, _, _} = CommonAPI.favorite(activity.id, other_user) + {:ok, _} = CommonAPI.favorite(other_user, activity.id) response = conn |> get("/api/v1/statuses/#{activity.id}/favourited_by") - |> json_response(:ok) + |> json_response_and_validate_schema(:ok) assert Enum.empty?(response) end test "does not fail on an unauthenticated request", %{activity: activity} do other_user = insert(:user) - {:ok, _, _} = CommonAPI.favorite(activity.id, other_user) + {:ok, _} = CommonAPI.favorite(other_user, activity.id) response = build_conn() |> get("/api/v1/statuses/#{activity.id}/favourited_by") - |> json_response(:ok) + |> json_response_and_validate_schema(:ok) [%{"id" => id}] = response assert id == other_user.id @@ -1235,17 +1384,17 @@ test "requires authentication for private posts", %{user: user} do {:ok, activity} = CommonAPI.post(user, %{ - "status" => "@#{other_user.nickname} wanna get some #cofe together?", - "visibility" => "direct" + status: "@#{other_user.nickname} wanna get some #cofe together?", + visibility: "direct" }) - {:ok, _, _} = CommonAPI.favorite(activity.id, other_user) + {:ok, _} = CommonAPI.favorite(other_user, activity.id) favourited_by_url = "/api/v1/statuses/#{activity.id}/favourited_by" build_conn() |> get(favourited_by_url) - |> json_response(404) + |> json_response_and_validate_schema(404) conn = build_conn() @@ -1255,12 +1404,12 @@ test "requires authentication for private posts", %{user: user} do conn |> assign(:token, nil) |> get(favourited_by_url) - |> json_response(404) + |> json_response_and_validate_schema(404) response = conn |> get(favourited_by_url) - |> json_response(200) + |> json_response_and_validate_schema(200) [%{"id" => id}] = response assert id == other_user.id @@ -1271,19 +1420,19 @@ test "requires authentication for private posts", %{user: user} do setup do: oauth_access(["read:accounts"]) setup %{user: user} do - {:ok, activity} = CommonAPI.post(user, %{"status" => "test"}) + {:ok, activity} = CommonAPI.post(user, %{status: "test"}) %{activity: activity} end test "returns users who have reblogged the status", %{conn: conn, activity: activity} do other_user = insert(:user) - {:ok, _, _} = CommonAPI.repeat(activity.id, other_user) + {:ok, _} = CommonAPI.repeat(activity.id, other_user) response = conn |> get("/api/v1/statuses/#{activity.id}/reblogged_by") - |> json_response(:ok) + |> json_response_and_validate_schema(:ok) [%{"id" => id}] = response @@ -1297,7 +1446,7 @@ test "returns empty array when status has not been reblogged yet", %{ response = conn |> get("/api/v1/statuses/#{activity.id}/reblogged_by") - |> json_response(:ok) + |> json_response_and_validate_schema(:ok) assert Enum.empty?(response) end @@ -1309,40 +1458,40 @@ test "does not return users who have reblogged the status but are blocked", %{ other_user = insert(:user) {:ok, _user_relationship} = User.block(user, other_user) - {:ok, _, _} = CommonAPI.repeat(activity.id, other_user) + {:ok, _} = CommonAPI.repeat(activity.id, other_user) response = conn |> get("/api/v1/statuses/#{activity.id}/reblogged_by") - |> json_response(:ok) + |> json_response_and_validate_schema(:ok) assert Enum.empty?(response) end test "does not return users who have reblogged the status privately", %{ - conn: conn, - activity: activity + conn: conn } do other_user = insert(:user) + {:ok, activity} = CommonAPI.post(other_user, %{status: "my secret post"}) - {:ok, _, _} = CommonAPI.repeat(activity.id, other_user, %{"visibility" => "private"}) + {:ok, _} = CommonAPI.repeat(activity.id, other_user, %{visibility: "private"}) response = conn |> get("/api/v1/statuses/#{activity.id}/reblogged_by") - |> json_response(:ok) + |> json_response_and_validate_schema(:ok) assert Enum.empty?(response) end test "does not fail on an unauthenticated request", %{activity: activity} do other_user = insert(:user) - {:ok, _, _} = CommonAPI.repeat(activity.id, other_user) + {:ok, _} = CommonAPI.repeat(activity.id, other_user) response = build_conn() |> get("/api/v1/statuses/#{activity.id}/reblogged_by") - |> json_response(:ok) + |> json_response_and_validate_schema(:ok) [%{"id" => id}] = response assert id == other_user.id @@ -1353,20 +1502,20 @@ test "requires authentication for private posts", %{user: user} do {:ok, activity} = CommonAPI.post(user, %{ - "status" => "@#{other_user.nickname} wanna get some #cofe together?", - "visibility" => "direct" + status: "@#{other_user.nickname} wanna get some #cofe together?", + visibility: "direct" }) build_conn() |> get("/api/v1/statuses/#{activity.id}/reblogged_by") - |> json_response(404) + |> json_response_and_validate_schema(404) response = build_conn() |> assign(:user, other_user) |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["read:accounts"])) |> get("/api/v1/statuses/#{activity.id}/reblogged_by") - |> json_response(200) + |> json_response_and_validate_schema(200) assert [] == response end @@ -1375,16 +1524,16 @@ test "requires authentication for private posts", %{user: user} do test "context" do user = insert(:user) - {:ok, %{id: id1}} = CommonAPI.post(user, %{"status" => "1"}) - {:ok, %{id: id2}} = CommonAPI.post(user, %{"status" => "2", "in_reply_to_status_id" => id1}) - {:ok, %{id: id3}} = CommonAPI.post(user, %{"status" => "3", "in_reply_to_status_id" => id2}) - {:ok, %{id: id4}} = CommonAPI.post(user, %{"status" => "4", "in_reply_to_status_id" => id3}) - {:ok, %{id: id5}} = CommonAPI.post(user, %{"status" => "5", "in_reply_to_status_id" => id4}) + {:ok, %{id: id1}} = CommonAPI.post(user, %{status: "1"}) + {:ok, %{id: id2}} = CommonAPI.post(user, %{status: "2", in_reply_to_status_id: id1}) + {:ok, %{id: id3}} = CommonAPI.post(user, %{status: "3", in_reply_to_status_id: id2}) + {:ok, %{id: id4}} = CommonAPI.post(user, %{status: "4", in_reply_to_status_id: id3}) + {:ok, %{id: id5}} = CommonAPI.post(user, %{status: "5", in_reply_to_status_id: id4}) response = build_conn() |> get("/api/v1/statuses/#{id3}/context") - |> json_response(:ok) + |> json_response_and_validate_schema(:ok) assert %{ "ancestors" => [%{"id" => ^id1}, %{"id" => ^id2}], @@ -1396,14 +1545,14 @@ test "returns the favorites of a user" do %{user: user, conn: conn} = oauth_access(["read:favourites"]) other_user = insert(:user) - {:ok, _} = CommonAPI.post(other_user, %{"status" => "bla"}) - {:ok, activity} = CommonAPI.post(other_user, %{"status" => "traps are happy"}) + {:ok, _} = CommonAPI.post(other_user, %{status: "bla"}) + {:ok, activity} = CommonAPI.post(other_user, %{status: "traps are happy"}) - {:ok, _, _} = CommonAPI.favorite(activity.id, user) + {:ok, _} = CommonAPI.favorite(user, activity.id) first_conn = get(conn, "/api/v1/favourites") - assert [status] = json_response(first_conn, 200) + assert [status] = json_response_and_validate_schema(first_conn, 200) assert status["id"] == to_string(activity.id) assert [{"link", _link_header}] = @@ -1412,27 +1561,26 @@ test "returns the favorites of a user" do # Honours query params {:ok, second_activity} = CommonAPI.post(other_user, %{ - "status" => - "Trees Are Never Sad Look At Them Every Once In Awhile They're Quite Beautiful." + status: "Trees Are Never Sad Look At Them Every Once In Awhile They're Quite Beautiful." }) - {:ok, _, _} = CommonAPI.favorite(second_activity.id, user) + {:ok, _} = CommonAPI.favorite(user, second_activity.id) last_like = status["id"] second_conn = get(conn, "/api/v1/favourites?since_id=#{last_like}") - assert [second_status] = json_response(second_conn, 200) + assert [second_status] = json_response_and_validate_schema(second_conn, 200) assert second_status["id"] == to_string(second_activity.id) third_conn = get(conn, "/api/v1/favourites?limit=0") - assert [] = json_response(third_conn, 200) + assert [] = json_response_and_validate_schema(third_conn, 200) end test "expires_at is nil for another user" do %{conn: conn, user: user} = oauth_access(["read:statuses"]) - {:ok, activity} = CommonAPI.post(user, %{"status" => "foobar", "expires_in" => 1_000_000}) + {:ok, activity} = CommonAPI.post(user, %{status: "foobar", expires_in: 1_000_000}) expires_at = activity.id @@ -1441,11 +1589,15 @@ test "expires_at is nil for another user" do |> NaiveDateTime.to_iso8601() assert %{"pleroma" => %{"expires_at" => ^expires_at}} = - conn |> get("/api/v1/statuses/#{activity.id}") |> json_response(:ok) + conn + |> get("/api/v1/statuses/#{activity.id}") + |> json_response_and_validate_schema(:ok) %{conn: conn} = oauth_access(["read:statuses"]) assert %{"pleroma" => %{"expires_at" => nil}} = - conn |> get("/api/v1/statuses/#{activity.id}") |> json_response(:ok) + conn + |> get("/api/v1/statuses/#{activity.id}") + |> json_response_and_validate_schema(:ok) end end diff --git a/test/web/mastodon_api/controllers/subscription_controller_test.exs b/test/web/mastodon_api/controllers/subscription_controller_test.exs index 987158a74..4aa260663 100644 --- a/test/web/mastodon_api/controllers/subscription_controller_test.exs +++ b/test/web/mastodon_api/controllers/subscription_controller_test.exs @@ -6,6 +6,7 @@ defmodule Pleroma.Web.MastodonAPI.SubscriptionControllerTest do use Pleroma.Web.ConnCase import Pleroma.Factory + alias Pleroma.Web.Push alias Pleroma.Web.Push.Subscription @@ -27,6 +28,7 @@ defmodule Pleroma.Web.MastodonAPI.SubscriptionControllerTest do build_conn() |> assign(:user, user) |> assign(:token, token) + |> put_req_header("content-type", "application/json") %{conn: conn, user: user, token: token} end @@ -35,7 +37,10 @@ defmacro assert_error_when_disable_push(do: yield) do quote do vapid_details = Application.get_env(:web_push_encryption, :vapid_details, []) Application.put_env(:web_push_encryption, :vapid_details, []) - assert "Something went wrong" == unquote(yield) + + assert %{"error" => "Web push subscription is disabled on this Pleroma instance"} == + unquote(yield) + Application.put_env(:web_push_encryption, :vapid_details, vapid_details) end end @@ -44,8 +49,8 @@ defmacro assert_error_when_disable_push(do: yield) do test "returns error when push disabled ", %{conn: conn} do assert_error_when_disable_push do conn - |> post("/api/v1/push/subscription", %{}) - |> json_response(500) + |> post("/api/v1/push/subscription", %{subscription: @sub}) + |> json_response_and_validate_schema(403) end end @@ -56,7 +61,7 @@ test "successful creation", %{conn: conn} do "data" => %{"alerts" => %{"mention" => true, "test" => true}}, "subscription" => @sub }) - |> json_response(200) + |> json_response_and_validate_schema(200) [subscription] = Pleroma.Repo.all(Subscription) @@ -74,7 +79,7 @@ test "returns error when push disabled ", %{conn: conn} do assert_error_when_disable_push do conn |> get("/api/v1/push/subscription", %{}) - |> json_response(500) + |> json_response_and_validate_schema(403) end end @@ -82,9 +87,9 @@ test "returns error when user hasn't subscription", %{conn: conn} do res = conn |> get("/api/v1/push/subscription", %{}) - |> json_response(404) + |> json_response_and_validate_schema(404) - assert "Not found" == res + assert %{"error" => "Record not found"} == res end test "returns a user subsciption", %{conn: conn, user: user, token: token} do @@ -98,7 +103,7 @@ test "returns a user subsciption", %{conn: conn, user: user, token: token} do res = conn |> get("/api/v1/push/subscription", %{}) - |> json_response(200) + |> json_response_and_validate_schema(200) expect = %{ "alerts" => %{"mention" => true}, @@ -127,7 +132,7 @@ test "returns error when push disabled ", %{conn: conn} do assert_error_when_disable_push do conn |> put("/api/v1/push/subscription", %{data: %{"alerts" => %{"mention" => false}}}) - |> json_response(500) + |> json_response_and_validate_schema(403) end end @@ -137,7 +142,7 @@ test "returns updated subsciption", %{conn: conn, subscription: subscription} do |> put("/api/v1/push/subscription", %{ data: %{"alerts" => %{"mention" => false, "follow" => true}} }) - |> json_response(200) + |> json_response_and_validate_schema(200) expect = %{ "alerts" => %{"follow" => true, "mention" => false}, @@ -155,7 +160,7 @@ test "returns error when push disabled ", %{conn: conn} do assert_error_when_disable_push do conn |> delete("/api/v1/push/subscription", %{}) - |> json_response(500) + |> json_response_and_validate_schema(403) end end @@ -163,9 +168,9 @@ test "returns error when user hasn't subscription", %{conn: conn} do res = conn |> delete("/api/v1/push/subscription", %{}) - |> json_response(404) + |> json_response_and_validate_schema(404) - assert "Not found" == res + assert %{"error" => "Record not found"} == res end test "returns empty result and delete user subsciption", %{ @@ -183,7 +188,7 @@ test "returns empty result and delete user subsciption", %{ res = conn |> delete("/api/v1/push/subscription", %{}) - |> json_response(200) + |> json_response_and_validate_schema(200) assert %{} == res refute Pleroma.Repo.get(Subscription, subscription.id) diff --git a/test/web/mastodon_api/controllers/suggestion_controller_test.exs b/test/web/mastodon_api/controllers/suggestion_controller_test.exs index c697a39f8..7f08e187c 100644 --- a/test/web/mastodon_api/controllers/suggestion_controller_test.exs +++ b/test/web/mastodon_api/controllers/suggestion_controller_test.exs @@ -5,41 +5,13 @@ defmodule Pleroma.Web.MastodonAPI.SuggestionControllerTest do use Pleroma.Web.ConnCase - alias Pleroma.Config - - import Pleroma.Factory - import Tesla.Mock - setup do: oauth_access(["read"]) - setup %{user: user} do - other_user = insert(:user) - host = Config.get([Pleroma.Web.Endpoint, :url, :host]) - url500 = "http://test500?#{host}&#{user.nickname}" - url200 = "http://test200?#{host}&#{user.nickname}" - - mock(fn - %{method: :get, url: ^url500} -> - %Tesla.Env{status: 500, body: "bad request"} - - %{method: :get, url: ^url200} -> - %Tesla.Env{ - status: 200, - body: - ~s([{"acct":"yj455","avatar":"https://social.heldscal.la/avatar/201.jpeg","avatar_static":"https://social.heldscal.la/avatar/s/201.jpeg"}, {"acct":"#{ - other_user.ap_id - }","avatar":"https://social.heldscal.la/avatar/202.jpeg","avatar_static":"https://social.heldscal.la/avatar/s/202.jpeg"}]) - } - end) - - [other_user: other_user] - end - test "returns empty result", %{conn: conn} do res = conn |> get("/api/v1/suggestions") - |> json_response(200) + |> json_response_and_validate_schema(200) assert res == [] end diff --git a/test/web/mastodon_api/controllers/timeline_controller_test.exs b/test/web/mastodon_api/controllers/timeline_controller_test.exs index 6fedb4223..2375ac8e8 100644 --- a/test/web/mastodon_api/controllers/timeline_controller_test.exs +++ b/test/web/mastodon_api/controllers/timeline_controller_test.exs @@ -20,35 +20,36 @@ defmodule Pleroma.Web.MastodonAPI.TimelineControllerTest do describe "home" do setup do: oauth_access(["read:statuses"]) - test "the home timeline", %{user: user, conn: conn} do - following = insert(:user) + test "does NOT embed account/pleroma/relationship in statuses", %{ + user: user, + conn: conn + } do + other_user = insert(:user) - {:ok, _activity} = CommonAPI.post(following, %{"status" => "test"}) + {:ok, _} = CommonAPI.post(other_user, %{status: "hi @#{user.nickname}"}) - ret_conn = get(conn, "/api/v1/timelines/home") + response = + conn + |> assign(:user, user) + |> get("/api/v1/timelines/home") + |> json_response_and_validate_schema(200) - assert Enum.empty?(json_response(ret_conn, :ok)) - - {:ok, _user} = User.follow(user, following) - - conn = get(conn, "/api/v1/timelines/home") - - assert [%{"content" => "test"}] = json_response(conn, :ok) + assert Enum.all?(response, fn n -> + get_in(n, ["account", "pleroma", "relationship"]) == %{} + end) end test "the home timeline when the direct messages are excluded", %{user: user, conn: conn} do - {:ok, public_activity} = CommonAPI.post(user, %{"status" => ".", "visibility" => "public"}) - {:ok, direct_activity} = CommonAPI.post(user, %{"status" => ".", "visibility" => "direct"}) + {:ok, public_activity} = CommonAPI.post(user, %{status: ".", visibility: "public"}) + {:ok, direct_activity} = CommonAPI.post(user, %{status: ".", visibility: "direct"}) - {:ok, unlisted_activity} = - CommonAPI.post(user, %{"status" => ".", "visibility" => "unlisted"}) + {:ok, unlisted_activity} = CommonAPI.post(user, %{status: ".", visibility: "unlisted"}) - {:ok, private_activity} = - CommonAPI.post(user, %{"status" => ".", "visibility" => "private"}) + {:ok, private_activity} = CommonAPI.post(user, %{status: ".", visibility: "private"}) - conn = get(conn, "/api/v1/timelines/home", %{"exclude_visibilities" => ["direct"]}) + conn = get(conn, "/api/v1/timelines/home?exclude_visibilities[]=direct") - assert status_ids = json_response(conn, :ok) |> Enum.map(& &1["id"]) + assert status_ids = json_response_and_validate_schema(conn, :ok) |> Enum.map(& &1["id"]) assert public_activity.id in status_ids assert unlisted_activity.id in status_ids assert private_activity.id in status_ids @@ -61,33 +62,33 @@ test "the home timeline when the direct messages are excluded", %{user: user, co test "the public timeline", %{conn: conn} do following = insert(:user) - {:ok, _activity} = CommonAPI.post(following, %{"status" => "test"}) + {:ok, _activity} = CommonAPI.post(following, %{status: "test"}) _activity = insert(:note_activity, local: false) - conn = get(conn, "/api/v1/timelines/public", %{"local" => "False"}) + conn = get(conn, "/api/v1/timelines/public?local=False") - assert length(json_response(conn, :ok)) == 2 + assert length(json_response_and_validate_schema(conn, :ok)) == 2 - conn = get(build_conn(), "/api/v1/timelines/public", %{"local" => "True"}) + conn = get(build_conn(), "/api/v1/timelines/public?local=True") - assert [%{"content" => "test"}] = json_response(conn, :ok) + assert [%{"content" => "test"}] = json_response_and_validate_schema(conn, :ok) - conn = get(build_conn(), "/api/v1/timelines/public", %{"local" => "1"}) + conn = get(build_conn(), "/api/v1/timelines/public?local=1") - assert [%{"content" => "test"}] = json_response(conn, :ok) + assert [%{"content" => "test"}] = json_response_and_validate_schema(conn, :ok) end test "the public timeline includes only public statuses for an authenticated user" do %{user: user, conn: conn} = oauth_access(["read:statuses"]) - {:ok, _activity} = CommonAPI.post(user, %{"status" => "test"}) - {:ok, _activity} = CommonAPI.post(user, %{"status" => "test", "visibility" => "private"}) - {:ok, _activity} = CommonAPI.post(user, %{"status" => "test", "visibility" => "unlisted"}) - {:ok, _activity} = CommonAPI.post(user, %{"status" => "test", "visibility" => "direct"}) + {:ok, _activity} = CommonAPI.post(user, %{status: "test"}) + {:ok, _activity} = CommonAPI.post(user, %{status: "test", visibility: "private"}) + {:ok, _activity} = CommonAPI.post(user, %{status: "test", visibility: "unlisted"}) + {:ok, _activity} = CommonAPI.post(user, %{status: "test", visibility: "direct"}) res_conn = get(conn, "/api/v1/timelines/public") - assert length(json_response(res_conn, 200)) == 1 + assert length(json_response_and_validate_schema(res_conn, 200)) == 1 end end @@ -105,15 +106,15 @@ defp local_and_remote_activities do setup do: clear_config([:restrict_unauthenticated, :timelines, :federated], true) test "if user is unauthenticated", %{conn: conn} do - res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "true"}) + res_conn = get(conn, "/api/v1/timelines/public?local=true") - assert json_response(res_conn, :unauthorized) == %{ + assert json_response_and_validate_schema(res_conn, :unauthorized) == %{ "error" => "authorization required for timeline view" } - res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "false"}) + res_conn = get(conn, "/api/v1/timelines/public?local=false") - assert json_response(res_conn, :unauthorized) == %{ + assert json_response_and_validate_schema(res_conn, :unauthorized) == %{ "error" => "authorization required for timeline view" } end @@ -121,11 +122,11 @@ test "if user is unauthenticated", %{conn: conn} do test "if user is authenticated" do %{conn: conn} = oauth_access(["read:statuses"]) - res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "true"}) - assert length(json_response(res_conn, 200)) == 1 + res_conn = get(conn, "/api/v1/timelines/public?local=true") + assert length(json_response_and_validate_schema(res_conn, 200)) == 1 - res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "false"}) - assert length(json_response(res_conn, 200)) == 2 + res_conn = get(conn, "/api/v1/timelines/public?local=false") + assert length(json_response_and_validate_schema(res_conn, 200)) == 2 end end @@ -135,24 +136,24 @@ test "if user is authenticated" do setup do: clear_config([:restrict_unauthenticated, :timelines, :local], true) test "if user is unauthenticated", %{conn: conn} do - res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "true"}) + res_conn = get(conn, "/api/v1/timelines/public?local=true") - assert json_response(res_conn, :unauthorized) == %{ + assert json_response_and_validate_schema(res_conn, :unauthorized) == %{ "error" => "authorization required for timeline view" } - res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "false"}) - assert length(json_response(res_conn, 200)) == 2 + res_conn = get(conn, "/api/v1/timelines/public?local=false") + assert length(json_response_and_validate_schema(res_conn, 200)) == 2 end test "if user is authenticated", %{conn: _conn} do %{conn: conn} = oauth_access(["read:statuses"]) - res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "true"}) - assert length(json_response(res_conn, 200)) == 1 + res_conn = get(conn, "/api/v1/timelines/public?local=true") + assert length(json_response_and_validate_schema(res_conn, 200)) == 1 - res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "false"}) - assert length(json_response(res_conn, 200)) == 2 + res_conn = get(conn, "/api/v1/timelines/public?local=false") + assert length(json_response_and_validate_schema(res_conn, 200)) == 2 end end @@ -162,12 +163,12 @@ test "if user is authenticated", %{conn: _conn} do setup do: clear_config([:restrict_unauthenticated, :timelines, :federated], true) test "if user is unauthenticated", %{conn: conn} do - res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "true"}) - assert length(json_response(res_conn, 200)) == 1 + res_conn = get(conn, "/api/v1/timelines/public?local=true") + assert length(json_response_and_validate_schema(res_conn, 200)) == 1 - res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "false"}) + res_conn = get(conn, "/api/v1/timelines/public?local=false") - assert json_response(res_conn, :unauthorized) == %{ + assert json_response_and_validate_schema(res_conn, :unauthorized) == %{ "error" => "authorization required for timeline view" } end @@ -175,11 +176,11 @@ test "if user is unauthenticated", %{conn: conn} do test "if user is authenticated", %{conn: _conn} do %{conn: conn} = oauth_access(["read:statuses"]) - res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "true"}) - assert length(json_response(res_conn, 200)) == 1 + res_conn = get(conn, "/api/v1/timelines/public?local=true") + assert length(json_response_and_validate_schema(res_conn, 200)) == 1 - res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "false"}) - assert length(json_response(res_conn, 200)) == 2 + res_conn = get(conn, "/api/v1/timelines/public?local=false") + assert length(json_response_and_validate_schema(res_conn, 200)) == 2 end end @@ -192,14 +193,14 @@ test "direct timeline", %{conn: conn} do {:ok, direct} = CommonAPI.post(user_one, %{ - "status" => "Hi @#{user_two.nickname}!", - "visibility" => "direct" + status: "Hi @#{user_two.nickname}!", + visibility: "direct" }) {:ok, _follower_only} = CommonAPI.post(user_one, %{ - "status" => "Hi @#{user_two.nickname}!", - "visibility" => "private" + status: "Hi @#{user_two.nickname}!", + visibility: "private" }) conn_user_two = @@ -210,7 +211,7 @@ test "direct timeline", %{conn: conn} do # Only direct should be visible here res_conn = get(conn_user_two, "api/v1/timelines/direct") - [status] = json_response(res_conn, :ok) + assert [status] = json_response_and_validate_schema(res_conn, :ok) assert %{"visibility" => "direct"} = status assert status["url"] != direct.data["id"] @@ -222,33 +223,34 @@ test "direct timeline", %{conn: conn} do |> assign(:token, insert(:oauth_token, user: user_one, scopes: ["read:statuses"])) |> get("api/v1/timelines/direct") - [status] = json_response(res_conn, :ok) + [status] = json_response_and_validate_schema(res_conn, :ok) assert %{"visibility" => "direct"} = status # Both should be visible here res_conn = get(conn_user_two, "api/v1/timelines/home") - [_s1, _s2] = json_response(res_conn, :ok) + [_s1, _s2] = json_response_and_validate_schema(res_conn, :ok) # Test pagination Enum.each(1..20, fn _ -> {:ok, _} = CommonAPI.post(user_one, %{ - "status" => "Hi @#{user_two.nickname}!", - "visibility" => "direct" + status: "Hi @#{user_two.nickname}!", + visibility: "direct" }) end) res_conn = get(conn_user_two, "api/v1/timelines/direct") - statuses = json_response(res_conn, :ok) + statuses = json_response_and_validate_schema(res_conn, :ok) assert length(statuses) == 20 - res_conn = - get(conn_user_two, "api/v1/timelines/direct", %{max_id: List.last(statuses)["id"]}) + max_id = List.last(statuses)["id"] - [status] = json_response(res_conn, :ok) + res_conn = get(conn_user_two, "api/v1/timelines/direct?max_id=#{max_id}") + + assert [status] = json_response_and_validate_schema(res_conn, :ok) assert status["url"] != direct.data["id"] end @@ -261,19 +263,19 @@ test "doesn't include DMs from blocked users" do {:ok, _blocked_direct} = CommonAPI.post(blocked, %{ - "status" => "Hi @#{blocker.nickname}!", - "visibility" => "direct" + status: "Hi @#{blocker.nickname}!", + visibility: "direct" }) {:ok, direct} = CommonAPI.post(other_user, %{ - "status" => "Hi @#{blocker.nickname}!", - "visibility" => "direct" + status: "Hi @#{blocker.nickname}!", + visibility: "direct" }) res_conn = get(conn, "api/v1/timelines/direct") - [status] = json_response(res_conn, :ok) + [status] = json_response_and_validate_schema(res_conn, :ok) assert status["id"] == direct.id end end @@ -283,14 +285,14 @@ test "doesn't include DMs from blocked users" do test "list timeline", %{user: user, conn: conn} do other_user = insert(:user) - {:ok, _activity_one} = CommonAPI.post(user, %{"status" => "Marisa is cute."}) - {:ok, activity_two} = CommonAPI.post(other_user, %{"status" => "Marisa is cute."}) + {:ok, _activity_one} = CommonAPI.post(user, %{status: "Marisa is cute."}) + {:ok, activity_two} = CommonAPI.post(other_user, %{status: "Marisa is cute."}) {:ok, list} = Pleroma.List.create("name", user) {:ok, list} = Pleroma.List.follow(list, other_user) conn = get(conn, "/api/v1/timelines/list/#{list.id}") - assert [%{"id" => id}] = json_response(conn, :ok) + assert [%{"id" => id}] = json_response_and_validate_schema(conn, :ok) assert id == to_string(activity_two.id) end @@ -300,12 +302,12 @@ test "list timeline does not leak non-public statuses for unfollowed users", %{ conn: conn } do other_user = insert(:user) - {:ok, activity_one} = CommonAPI.post(other_user, %{"status" => "Marisa is cute."}) + {:ok, activity_one} = CommonAPI.post(other_user, %{status: "Marisa is cute."}) {:ok, _activity_two} = CommonAPI.post(other_user, %{ - "status" => "Marisa is cute.", - "visibility" => "private" + status: "Marisa is cute.", + visibility: "private" }) {:ok, list} = Pleroma.List.create("name", user) @@ -313,7 +315,7 @@ test "list timeline does not leak non-public statuses for unfollowed users", %{ conn = get(conn, "/api/v1/timelines/list/#{list.id}") - assert [%{"id" => id}] = json_response(conn, :ok) + assert [%{"id" => id}] = json_response_and_validate_schema(conn, :ok) assert id == to_string(activity_one.id) end @@ -326,18 +328,18 @@ test "list timeline does not leak non-public statuses for unfollowed users", %{ test "hashtag timeline", %{conn: conn} do following = insert(:user) - {:ok, activity} = CommonAPI.post(following, %{"status" => "test #2hu"}) + {:ok, activity} = CommonAPI.post(following, %{status: "test #2hu"}) nconn = get(conn, "/api/v1/timelines/tag/2hu") - assert [%{"id" => id}] = json_response(nconn, :ok) + assert [%{"id" => id}] = json_response_and_validate_schema(nconn, :ok) assert id == to_string(activity.id) # works for different capitalization too nconn = get(conn, "/api/v1/timelines/tag/2HU") - assert [%{"id" => id}] = json_response(nconn, :ok) + assert [%{"id" => id}] = json_response_and_validate_schema(nconn, :ok) assert id == to_string(activity.id) end @@ -345,26 +347,25 @@ test "hashtag timeline", %{conn: conn} do test "multi-hashtag timeline", %{conn: conn} do user = insert(:user) - {:ok, activity_test} = CommonAPI.post(user, %{"status" => "#test"}) - {:ok, activity_test1} = CommonAPI.post(user, %{"status" => "#test #test1"}) - {:ok, activity_none} = CommonAPI.post(user, %{"status" => "#test #none"}) + {:ok, activity_test} = CommonAPI.post(user, %{status: "#test"}) + {:ok, activity_test1} = CommonAPI.post(user, %{status: "#test #test1"}) + {:ok, activity_none} = CommonAPI.post(user, %{status: "#test #none"}) - any_test = get(conn, "/api/v1/timelines/tag/test", %{"any" => ["test1"]}) + any_test = get(conn, "/api/v1/timelines/tag/test?any[]=test1") - [status_none, status_test1, status_test] = json_response(any_test, :ok) + [status_none, status_test1, status_test] = json_response_and_validate_schema(any_test, :ok) assert to_string(activity_test.id) == status_test["id"] assert to_string(activity_test1.id) == status_test1["id"] assert to_string(activity_none.id) == status_none["id"] - restricted_test = - get(conn, "/api/v1/timelines/tag/test", %{"all" => ["test1"], "none" => ["none"]}) + restricted_test = get(conn, "/api/v1/timelines/tag/test?all[]=test1&none[]=none") - assert [status_test1] == json_response(restricted_test, :ok) + assert [status_test1] == json_response_and_validate_schema(restricted_test, :ok) - all_test = get(conn, "/api/v1/timelines/tag/test", %{"all" => ["none"]}) + all_test = get(conn, "/api/v1/timelines/tag/test?all[]=none") - assert [status_none] == json_response(all_test, :ok) + assert [status_none] == json_response_and_validate_schema(all_test, :ok) end end end diff --git a/test/web/mastodon_api/mastodon_api_controller_test.exs b/test/web/mastodon_api/mastodon_api_controller_test.exs index 75f184242..bb4bc4396 100644 --- a/test/web/mastodon_api/mastodon_api_controller_test.exs +++ b/test/web/mastodon_api/mastodon_api_controller_test.exs @@ -7,35 +7,28 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do describe "empty_array/2 (stubs)" do test "GET /api/v1/accounts/:id/identity_proofs" do - %{user: user, conn: conn} = oauth_access(["n/a"]) + %{user: user, conn: conn} = oauth_access(["read:accounts"]) - res = - conn - |> assign(:user, user) - |> get("/api/v1/accounts/#{user.id}/identity_proofs") - |> json_response(200) - - assert res == [] + assert [] == + conn + |> get("/api/v1/accounts/#{user.id}/identity_proofs") + |> json_response(200) end test "GET /api/v1/endorsements" do %{conn: conn} = oauth_access(["read:accounts"]) - res = - conn - |> get("/api/v1/endorsements") - |> json_response(200) - - assert res == [] + assert [] == + conn + |> get("/api/v1/endorsements") + |> json_response(200) end test "GET /api/v1/trends", %{conn: conn} do - res = - conn - |> get("/api/v1/trends") - |> json_response(200) - - assert res == [] + assert [] == + conn + |> get("/api/v1/trends") + |> json_response(200) end end end diff --git a/test/web/mastodon_api/mastodon_api_test.exs b/test/web/mastodon_api/mastodon_api_test.exs index cb971806a..a7f9c5205 100644 --- a/test/web/mastodon_api/mastodon_api_test.exs +++ b/test/web/mastodon_api/mastodon_api_test.exs @@ -75,9 +75,9 @@ test "returns notifications for user" do User.subscribe(subscriber, user) - {:ok, status} = CommonAPI.post(user, %{"status" => "Akariiiin"}) + {:ok, status} = CommonAPI.post(user, %{status: "Akariiiin"}) - {:ok, status1} = CommonAPI.post(user, %{"status" => "Magi"}) + {:ok, status1} = CommonAPI.post(user, %{status: "Magi"}) {:ok, [notification]} = Notification.create_notifications(status) {:ok, [notification1]} = Notification.create_notifications(status1) res = MastodonAPI.get_notifications(subscriber) diff --git a/test/web/mastodon_api/views/account_view_test.exs b/test/web/mastodon_api/views/account_view_test.exs index d60ed7b64..f91333e5c 100644 --- a/test/web/mastodon_api/views/account_view_test.exs +++ b/test/web/mastodon_api/views/account_view_test.exs @@ -4,22 +4,21 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do use Pleroma.DataCase - import Pleroma.Factory + alias Pleroma.User + alias Pleroma.UserRelationship alias Pleroma.Web.CommonAPI alias Pleroma.Web.MastodonAPI.AccountView - test "Represent a user account" do - source_data = %{ - "tag" => [ - %{ - "type" => "Emoji", - "icon" => %{"url" => "/file.png"}, - "name" => ":karjalanpiirakka:" - } - ] - } + import Pleroma.Factory + import Tesla.Mock + setup do + mock(fn env -> apply(HttpRequestMock, :request, [env]) end) + :ok + end + + test "Represent a user account" do background_image = %{ "url" => [%{"href" => "https://example.com/images/asuka_hospital.png"}] } @@ -28,12 +27,13 @@ test "Represent a user account" do insert(:user, %{ follower_count: 3, note_count: 5, - source_data: source_data, background: background_image, nickname: "shp@shitposter.club", name: ":karjalanpiirakka: shp", - bio: "valid html", - inserted_at: ~N[2017-08-15 15:47:06.597036] + bio: + "valid html. a
b
c
d
f '&<>\"", + inserted_at: ~N[2017-08-15 15:47:06.597036], + emoji: %{"karjalanpiirakka" => "/file.png"} }) expected = %{ @@ -46,7 +46,7 @@ test "Represent a user account" do followers_count: 3, following_count: 0, statuses_count: 5, - note: "valid html", + note: "valid html. a
b
c
d
f '&<>"", url: user.ap_id, avatar: "http://localhost:4001/images/avi.png", avatar_static: "http://localhost:4001/images/avi.png", @@ -54,16 +54,16 @@ test "Represent a user account" do header_static: "http://localhost:4001/images/banner.png", emojis: [ %{ - "static_url" => "/file.png", - "url" => "/file.png", - "shortcode" => "karjalanpiirakka", - "visible_in_picker" => false + static_url: "/file.png", + url: "/file.png", + shortcode: "karjalanpiirakka", + visible_in_picker: false } ], fields: [], bot: false, source: %{ - note: "valid html", + note: "valid html. a\nb\nc\nd\nf '&<>\"", sensitive: false, pleroma: %{ actor_type: "Person", @@ -93,7 +93,14 @@ test "Represent a user account" do test "Represent the user account for the account owner" do user = insert(:user) - notification_settings = %Pleroma.User.NotificationSetting{} + notification_settings = %{ + followers: true, + follows: true, + non_followers: true, + non_follows: true, + privacy_option: false + } + privacy = user.default_scope assert %{ @@ -107,7 +114,6 @@ test "Represent a Service(bot) account" do insert(:user, %{ follower_count: 3, note_count: 5, - source_data: %{}, actor_type: "Service", nickname: "shp@shitposter.club", inserted_at: ~N[2017-08-15 15:47:06.597036] @@ -160,6 +166,17 @@ test "Represent a Service(bot) account" do assert expected == AccountView.render("show.json", %{user: user}) end + test "Represent a Funkwhale channel" do + {:ok, user} = + User.get_or_fetch_by_ap_id( + "https://channels.tests.funkwhale.audio/federation/actors/compositions" + ) + + assert represented = AccountView.render("show.json", %{user: user}) + assert represented.acct == "compositions@channels.tests.funkwhale.audio" + assert represented.url == "https://channels.tests.funkwhale.audio/channels/compositions" + end + test "Represent a deactivated user for an admin" do admin = insert(:user, is_admin: true) deactivated_user = insert(:user, deactivated: true) @@ -181,6 +198,32 @@ test "Represent a smaller mention" do end describe "relationship" do + defp test_relationship_rendering(user, other_user, expected_result) do + opts = %{user: user, target: other_user, relationships: nil} + assert expected_result == AccountView.render("relationship.json", opts) + + relationships_opt = UserRelationship.view_relationships_option(user, [other_user]) + opts = Map.put(opts, :relationships, relationships_opt) + assert expected_result == AccountView.render("relationship.json", opts) + + assert [expected_result] == + AccountView.render("relationships.json", %{user: user, targets: [other_user]}) + end + + @blank_response %{ + following: false, + followed_by: false, + blocking: false, + blocked_by: false, + muting: false, + muting_notifications: false, + subscribing: false, + requested: false, + domain_blocking: false, + showing_reblogs: true, + endorsed: false + } + test "represent a relationship for the following and followed user" do user = insert(:user) other_user = insert(:user) @@ -191,23 +234,21 @@ test "represent a relationship for the following and followed user" do {:ok, _user_relationships} = User.mute(user, other_user, true) {:ok, _reblog_mute} = CommonAPI.hide_reblogs(user, other_user) - expected = %{ - id: to_string(other_user.id), - following: true, - followed_by: true, - blocking: false, - blocked_by: false, - muting: true, - muting_notifications: true, - subscribing: true, - requested: false, - domain_blocking: false, - showing_reblogs: false, - endorsed: false - } + expected = + Map.merge( + @blank_response, + %{ + following: true, + followed_by: true, + muting: true, + muting_notifications: true, + subscribing: true, + showing_reblogs: false, + id: to_string(other_user.id) + } + ) - assert expected == - AccountView.render("relationship.json", %{user: user, target: other_user}) + test_relationship_rendering(user, other_user, expected) end test "represent a relationship for the blocking and blocked user" do @@ -219,23 +260,13 @@ test "represent a relationship for the blocking and blocked user" do {:ok, _user_relationship} = User.block(user, other_user) {:ok, _user_relationship} = User.block(other_user, user) - expected = %{ - id: to_string(other_user.id), - following: false, - followed_by: false, - blocking: true, - blocked_by: true, - muting: false, - muting_notifications: false, - subscribing: false, - requested: false, - domain_blocking: false, - showing_reblogs: true, - endorsed: false - } + expected = + Map.merge( + @blank_response, + %{following: false, blocking: true, blocked_by: true, id: to_string(other_user.id)} + ) - assert expected == - AccountView.render("relationship.json", %{user: user, target: other_user}) + test_relationship_rendering(user, other_user, expected) end test "represent a relationship for the user blocking a domain" do @@ -244,8 +275,13 @@ test "represent a relationship for the user blocking a domain" do {:ok, user} = User.block_domain(user, "bad.site") - assert %{domain_blocking: true, blocking: false} = - AccountView.render("relationship.json", %{user: user, target: other_user}) + expected = + Map.merge( + @blank_response, + %{domain_blocking: true, blocking: false, id: to_string(other_user.id)} + ) + + test_relationship_rendering(user, other_user, expected) end test "represent a relationship for the user with a pending follow request" do @@ -256,103 +292,16 @@ test "represent a relationship for the user with a pending follow request" do user = User.get_cached_by_id(user.id) other_user = User.get_cached_by_id(other_user.id) - expected = %{ - id: to_string(other_user.id), - following: false, - followed_by: false, - blocking: false, - blocked_by: false, - muting: false, - muting_notifications: false, - subscribing: false, - requested: true, - domain_blocking: false, - showing_reblogs: true, - endorsed: false - } + expected = + Map.merge( + @blank_response, + %{requested: true, following: false, id: to_string(other_user.id)} + ) - assert expected == - AccountView.render("relationship.json", %{user: user, target: other_user}) + test_relationship_rendering(user, other_user, expected) end end - test "represent an embedded relationship" do - user = - insert(:user, %{ - follower_count: 0, - note_count: 5, - source_data: %{}, - actor_type: "Service", - nickname: "shp@shitposter.club", - inserted_at: ~N[2017-08-15 15:47:06.597036] - }) - - other_user = insert(:user) - {:ok, other_user} = User.follow(other_user, user) - {:ok, _user_relationship} = User.block(other_user, user) - {:ok, _} = User.follow(insert(:user), user) - - expected = %{ - id: to_string(user.id), - username: "shp", - acct: user.nickname, - display_name: user.name, - locked: false, - created_at: "2017-08-15T15:47:06.000Z", - followers_count: 1, - following_count: 0, - statuses_count: 5, - note: user.bio, - url: user.ap_id, - avatar: "http://localhost:4001/images/avi.png", - avatar_static: "http://localhost:4001/images/avi.png", - header: "http://localhost:4001/images/banner.png", - header_static: "http://localhost:4001/images/banner.png", - emojis: [], - fields: [], - bot: true, - source: %{ - note: user.bio, - sensitive: false, - pleroma: %{ - actor_type: "Service", - discoverable: false - }, - fields: [] - }, - pleroma: %{ - background_image: nil, - confirmation_pending: false, - tags: [], - is_admin: false, - is_moderator: false, - hide_favorites: true, - hide_followers: false, - hide_follows: false, - hide_followers_count: false, - hide_follows_count: false, - relationship: %{ - id: to_string(user.id), - following: false, - followed_by: false, - blocking: true, - blocked_by: false, - subscribing: false, - muting: false, - muting_notifications: false, - requested: false, - domain_blocking: false, - showing_reblogs: true, - endorsed: false - }, - skip_thread_containment: false - } - } - - assert expected == - AccountView.render("show.json", %{user: refresh_record(user), for: other_user}) - end - test "returns the settings store if the requesting user is the represented user and it's requested specifically" do user = insert(:user, pleroma_settings_store: %{fe: "test"}) @@ -434,8 +383,8 @@ test "shows unread_conversation_count only to the account owner" do {:ok, _activity} = CommonAPI.post(other_user, %{ - "status" => "Hey @#{user.nickname}.", - "visibility" => "direct" + status: "Hey @#{user.nickname}.", + visibility: "direct" }) user = User.get_cached_by_ap_id(user.ap_id) @@ -448,6 +397,24 @@ test "shows unread_conversation_count only to the account owner" do :unread_conversation_count ] == 1 end + + test "shows unread_count only to the account owner" do + user = insert(:user) + insert_list(7, :notification, user: user) + other_user = insert(:user) + + user = User.get_cached_by_ap_id(user.ap_id) + + assert AccountView.render( + "show.json", + %{user: user, for: other_user} + )[:pleroma][:unread_notifications_count] == nil + + assert AccountView.render( + "show.json", + %{user: user, for: user} + )[:pleroma][:unread_notifications_count] == 7 + end end describe "follow requests counter" do @@ -524,4 +491,31 @@ test "shows non-zero when historical unapproved requests are present" do AccountView.render("show.json", %{user: user, for: user}) end end + + test "uses mediaproxy urls when it's enabled" do + clear_config([:media_proxy, :enabled], true) + + user = + insert(:user, + avatar: %{"url" => [%{"href" => "https://evil.website/avatar.png"}]}, + banner: %{"url" => [%{"href" => "https://evil.website/banner.png"}]}, + emoji: %{"joker_smile" => "https://evil.website/society.png"} + ) + + AccountView.render("show.json", %{user: user}) + |> Enum.all?(fn + {key, url} when key in [:avatar, :avatar_static, :header, :header_static] -> + String.starts_with?(url, Pleroma.Web.base_url()) + + {: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 diff --git a/test/web/mastodon_api/views/conversation_view_test.exs b/test/web/mastodon_api/views/conversation_view_test.exs index dbf3c51e2..6f84366f8 100644 --- a/test/web/mastodon_api/views/conversation_view_test.exs +++ b/test/web/mastodon_api/views/conversation_view_test.exs @@ -16,7 +16,7 @@ test "represents a Mastodon Conversation entity" do other_user = insert(:user) {:ok, activity} = - CommonAPI.post(user, %{"status" => "hey @#{other_user.nickname}", "visibility" => "direct"}) + CommonAPI.post(user, %{status: "hey @#{other_user.nickname}", visibility: "direct"}) [participation] = Participation.for_user_with_last_activity_id(user) diff --git a/test/web/mastodon_api/views/marker_view_test.exs b/test/web/mastodon_api/views/marker_view_test.exs index 893cf8857..48a0a6d33 100644 --- a/test/web/mastodon_api/views/marker_view_test.exs +++ b/test/web/mastodon_api/views/marker_view_test.exs @@ -8,19 +8,21 @@ defmodule Pleroma.Web.MastodonAPI.MarkerViewTest do import Pleroma.Factory test "returns markers" do - marker1 = insert(:marker, timeline: "notifications", last_read_id: "17") + marker1 = insert(:marker, timeline: "notifications", last_read_id: "17", unread_count: 5) marker2 = insert(:marker, timeline: "home", last_read_id: "42") assert MarkerView.render("markers.json", %{markers: [marker1, marker2]}) == %{ "home" => %{ last_read_id: "42", updated_at: NaiveDateTime.to_iso8601(marker2.updated_at), - version: 0 + version: 0, + pleroma: %{unread_count: 0} }, "notifications" => %{ last_read_id: "17", updated_at: NaiveDateTime.to_iso8601(marker1.updated_at), - version: 0 + version: 0, + pleroma: %{unread_count: 5} } } end diff --git a/test/web/mastodon_api/views/notification_view_test.exs b/test/web/mastodon_api/views/notification_view_test.exs index d04c3022f..f15be1df1 100644 --- a/test/web/mastodon_api/views/notification_view_test.exs +++ b/test/web/mastodon_api/views/notification_view_test.exs @@ -16,10 +16,25 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do alias Pleroma.Web.MastodonAPI.StatusView import Pleroma.Factory + defp test_notifications_rendering(notifications, user, expected_result) do + result = NotificationView.render("index.json", %{notifications: notifications, for: user}) + + assert expected_result == result + + result = + NotificationView.render("index.json", %{ + notifications: notifications, + for: user, + relationships: nil + }) + + assert expected_result == result + end + test "Mention notification" do user = insert(:user) mentioned_user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "hey @#{mentioned_user.nickname}"}) + {:ok, activity} = CommonAPI.post(user, %{status: "hey @#{mentioned_user.nickname}"}) {:ok, [notification]} = Notification.create_notifications(activity) user = User.get_cached_by_id(user.id) @@ -27,22 +42,23 @@ test "Mention notification" do id: to_string(notification.id), pleroma: %{is_seen: false}, type: "mention", - account: AccountView.render("show.json", %{user: user, for: mentioned_user}), + account: + AccountView.render("show.json", %{ + user: user, + for: mentioned_user + }), status: StatusView.render("show.json", %{activity: activity, for: mentioned_user}), created_at: Utils.to_masto_date(notification.inserted_at) } - result = - NotificationView.render("index.json", %{notifications: [notification], for: mentioned_user}) - - assert [expected] == result + test_notifications_rendering([notification], mentioned_user, [expected]) end test "Favourite notification" do user = insert(:user) another_user = insert(:user) - {:ok, create_activity} = CommonAPI.post(user, %{"status" => "hey"}) - {:ok, favorite_activity, _object} = CommonAPI.favorite(create_activity.id, another_user) + {:ok, create_activity} = CommonAPI.post(user, %{status: "hey"}) + {:ok, favorite_activity} = CommonAPI.favorite(another_user, create_activity.id) {:ok, [notification]} = Notification.create_notifications(favorite_activity) create_activity = Activity.get_by_id(create_activity.id) @@ -55,16 +71,14 @@ test "Favourite notification" do created_at: Utils.to_masto_date(notification.inserted_at) } - result = NotificationView.render("index.json", %{notifications: [notification], for: user}) - - assert [expected] == result + test_notifications_rendering([notification], user, [expected]) end test "Reblog notification" do user = insert(:user) another_user = insert(:user) - {:ok, create_activity} = CommonAPI.post(user, %{"status" => "hey"}) - {:ok, reblog_activity, _object} = CommonAPI.repeat(create_activity.id, another_user) + {:ok, create_activity} = CommonAPI.post(user, %{status: "hey"}) + {:ok, reblog_activity} = CommonAPI.repeat(create_activity.id, another_user) {:ok, [notification]} = Notification.create_notifications(reblog_activity) reblog_activity = Activity.get_by_id(create_activity.id) @@ -77,9 +91,7 @@ test "Reblog notification" do created_at: Utils.to_masto_date(notification.inserted_at) } - result = NotificationView.render("index.json", %{notifications: [notification], for: user}) - - assert [expected] == result + test_notifications_rendering([notification], user, [expected]) end test "Follow notification" do @@ -96,23 +108,32 @@ test "Follow notification" do created_at: Utils.to_masto_date(notification.inserted_at) } - result = - NotificationView.render("index.json", %{notifications: [notification], for: followed}) - - assert [expected] == result + test_notifications_rendering([notification], followed, [expected]) User.perform(:delete, follower) notification = Notification |> Repo.one() |> Repo.preload(:activity) - assert [] == - NotificationView.render("index.json", %{notifications: [notification], for: followed}) + test_notifications_rendering([notification], followed, []) end + @tag capture_log: true test "Move notification" do old_user = insert(:user) new_user = insert(:user, also_known_as: [old_user.ap_id]) follower = insert(:user) + old_user_url = old_user.ap_id + + body = + File.read!("test/fixtures/users_mock/localhost.json") + |> String.replace("{{nickname}}", old_user.nickname) + |> Jason.encode!() + + Tesla.Mock.mock(fn + %{method: :get, url: ^old_user_url} -> + %Tesla.Env{status: 200, body: body} + end) + User.follow(follower, old_user) Pleroma.Web.ActivityPub.ActivityPub.move(old_user, new_user) Pleroma.Tests.ObanHelpers.perform_all() @@ -131,16 +152,15 @@ test "Move notification" do created_at: Utils.to_masto_date(notification.inserted_at) } - assert [expected] == - NotificationView.render("index.json", %{notifications: [notification], for: follower}) + test_notifications_rendering([notification], follower, [expected]) end test "EmojiReact notification" do user = insert(:user) other_user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "#cofe"}) - {:ok, _activity, _} = CommonAPI.react_with_emoji(activity.id, other_user, "☕") + {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"}) + {:ok, _activity} = CommonAPI.react_with_emoji(activity.id, other_user, "☕") activity = Repo.get(Activity, activity.id) @@ -158,7 +178,6 @@ test "EmojiReact notification" do created_at: Utils.to_masto_date(notification.inserted_at) } - assert expected == - NotificationView.render("show.json", %{notification: notification, for: user}) + test_notifications_rendering([notification], user, [expected]) end end diff --git a/test/web/mastodon_api/views/poll_view_test.exs b/test/web/mastodon_api/views/poll_view_test.exs index 6211fa888..76672f36c 100644 --- a/test/web/mastodon_api/views/poll_view_test.exs +++ b/test/web/mastodon_api/views/poll_view_test.exs @@ -22,10 +22,10 @@ test "renders a poll" do {:ok, activity} = CommonAPI.post(user, %{ - "status" => "Is Tenshi eating a corndog cute?", - "poll" => %{ - "options" => ["absolutely!", "sure", "yes", "why are you even asking?"], - "expires_in" => 20 + status: "Is Tenshi eating a corndog cute?", + poll: %{ + options: ["absolutely!", "sure", "yes", "why are you even asking?"], + expires_in: 20 } }) @@ -43,7 +43,8 @@ test "renders a poll" do %{title: "why are you even asking?", votes_count: 0} ], voted: false, - votes_count: 0 + votes_count: 0, + voters_count: nil } result = PollView.render("show.json", %{object: object}) @@ -61,17 +62,28 @@ test "detects if it is multiple choice" do {:ok, activity} = CommonAPI.post(user, %{ - "status" => "Which Mastodon developer is your favourite?", - "poll" => %{ - "options" => ["Gargron", "Eugen"], - "expires_in" => 20, - "multiple" => true + status: "Which Mastodon developer is your favourite?", + poll: %{ + options: ["Gargron", "Eugen"], + expires_in: 20, + multiple: true } }) + voter = insert(:user) + object = Object.normalize(activity) - assert %{multiple: true} = PollView.render("show.json", %{object: object}) + {:ok, _votes, object} = CommonAPI.vote(voter, object, [0, 1]) + + assert match?( + %{ + multiple: true, + voters_count: 1, + votes_count: 2 + }, + PollView.render("show.json", %{object: object}) + ) end test "detects emoji" do @@ -79,10 +91,10 @@ test "detects emoji" do {:ok, activity} = CommonAPI.post(user, %{ - "status" => "What's with the smug face?", - "poll" => %{ - "options" => [":blank: sip", ":blank::blank: sip", ":blank::blank::blank: sip"], - "expires_in" => 20 + status: "What's with the smug face?", + poll: %{ + options: [":blank: sip", ":blank::blank: sip", ":blank::blank::blank: sip"], + expires_in: 20 } }) @@ -97,11 +109,11 @@ test "detects vote status" do {:ok, activity} = CommonAPI.post(user, %{ - "status" => "Which input devices do you use?", - "poll" => %{ - "options" => ["mouse", "trackball", "trackpoint"], - "multiple" => true, - "expires_in" => 20 + status: "Which input devices do you use?", + poll: %{ + options: ["mouse", "trackball", "trackpoint"], + multiple: true, + expires_in: 20 } }) diff --git a/test/web/mastodon_api/views/scheduled_activity_view_test.exs b/test/web/mastodon_api/views/scheduled_activity_view_test.exs index 0c0987593..fbfd873ef 100644 --- a/test/web/mastodon_api/views/scheduled_activity_view_test.exs +++ b/test/web/mastodon_api/views/scheduled_activity_view_test.exs @@ -14,7 +14,7 @@ defmodule Pleroma.Web.MastodonAPI.ScheduledActivityViewTest do test "A scheduled activity with a media attachment" do user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "hi"}) + {:ok, activity} = CommonAPI.post(user, %{status: "hi"}) scheduled_at = NaiveDateTime.utc_now() @@ -47,7 +47,7 @@ test "A scheduled activity with a media attachment" do expected = %{ id: to_string(scheduled_activity.id), media_attachments: - %{"media_ids" => [upload.id]} + %{media_ids: [upload.id]} |> Utils.attachments_from_ids() |> Enum.map(&StatusView.render("attachment.json", %{attachment: &1})), params: %{ diff --git a/test/web/mastodon_api/views/status_view_test.exs b/test/web/mastodon_api/views/status_view_test.exs index 191895c6f..5cbadf0fc 100644 --- a/test/web/mastodon_api/views/status_view_test.exs +++ b/test/web/mastodon_api/views/status_view_test.exs @@ -12,12 +12,15 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do alias Pleroma.Object alias Pleroma.Repo alias Pleroma.User + alias Pleroma.UserRelationship alias Pleroma.Web.CommonAPI alias Pleroma.Web.CommonAPI.Utils alias Pleroma.Web.MastodonAPI.AccountView alias Pleroma.Web.MastodonAPI.StatusView + import Pleroma.Factory import Tesla.Mock + import OpenApiSpex.TestAssertions setup do mock(fn env -> apply(HttpRequestMock, :request, [env]) end) @@ -28,14 +31,16 @@ test "has an emoji reaction list" do user = insert(:user) other_user = insert(:user) third_user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "dae cofe??"}) + {:ok, activity} = CommonAPI.post(user, %{status: "dae cofe??"}) - {:ok, _, _} = CommonAPI.react_with_emoji(activity.id, user, "☕") - {:ok, _, _} = CommonAPI.react_with_emoji(activity.id, third_user, "🍵") - {:ok, _, _} = CommonAPI.react_with_emoji(activity.id, other_user, "☕") + {:ok, _} = CommonAPI.react_with_emoji(activity.id, user, "☕") + {:ok, _} = CommonAPI.react_with_emoji(activity.id, third_user, "🍵") + {:ok, _} = CommonAPI.react_with_emoji(activity.id, other_user, "☕") activity = Repo.get(Activity, activity.id) status = StatusView.render("show.json", activity: activity) + assert_schema(status, "Status", Pleroma.Web.ApiSpec.spec()) + assert status[:pleroma][:emoji_reactions] == [ %{name: "☕", count: 2, me: false}, %{name: "🍵", count: 1, me: false} @@ -43,6 +48,8 @@ test "has an emoji reaction list" do status = StatusView.render("show.json", activity: activity, for: user) + assert_schema(status, "Status", Pleroma.Web.ApiSpec.spec()) + assert status[:pleroma][:emoji_reactions] == [ %{name: "☕", count: 2, me: true}, %{name: "🍵", count: 1, me: false} @@ -52,7 +59,7 @@ test "has an emoji reaction list" do test "loads and returns the direct conversation id when given the `with_direct_conversation_id` option" do user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "Hey @shp!", "visibility" => "direct"}) + {:ok, activity} = CommonAPI.post(user, %{status: "Hey @shp!", visibility: "direct"}) [participation] = Participation.for_user(user) status = @@ -66,12 +73,13 @@ test "loads and returns the direct conversation id when given the `with_direct_c status = StatusView.render("show.json", activity: activity, for: user) assert status[:pleroma][:direct_conversation_id] == nil + assert_schema(status, "Status", Pleroma.Web.ApiSpec.spec()) end test "returns the direct conversation id when given the `direct_conversation_id` option" do user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "Hey @shp!", "visibility" => "direct"}) + {:ok, activity} = CommonAPI.post(user, %{status: "Hey @shp!", visibility: "direct"}) [participation] = Participation.for_user(user) status = @@ -82,16 +90,34 @@ test "returns the direct conversation id when given the `direct_conversation_id` ) assert status[:pleroma][:direct_conversation_id] == participation.id + assert_schema(status, "Status", Pleroma.Web.ApiSpec.spec()) end test "returns a temporary ap_id based user for activities missing db users" do user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "Hey @shp!", "visibility" => "direct"}) + {:ok, activity} = CommonAPI.post(user, %{status: "Hey @shp!", visibility: "direct"}) Repo.delete(user) Cachex.clear(:user_cache) + finger_url = + "https://localhost/.well-known/webfinger?resource=acct:#{user.nickname}@localhost" + + Tesla.Mock.mock_global(fn + %{method: :get, url: "http://localhost/.well-known/host-meta"} -> + %Tesla.Env{status: 404, body: ""} + + %{method: :get, url: "https://localhost/.well-known/host-meta"} -> + %Tesla.Env{status: 404, body: ""} + + %{ + method: :get, + url: ^finger_url + } -> + %Tesla.Env{status: 404, body: ""} + end) + %{account: ms_user} = StatusView.render("show.json", activity: activity) assert ms_user.acct == "erroruser@example.com" @@ -100,7 +126,7 @@ test "returns a temporary ap_id based user for activities missing db users" do test "tries to get a user by nickname if fetching by ap_id doesn't work" do user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "Hey @shp!", "visibility" => "direct"}) + {:ok, activity} = CommonAPI.post(user, %{status: "Hey @shp!", visibility: "direct"}) {:ok, user} = user @@ -112,6 +138,7 @@ test "tries to get a user by nickname if fetching by ap_id doesn't work" do result = StatusView.render("show.json", activity: activity) assert result[:account][:id] == to_string(user.id) + assert_schema(result, "Status", Pleroma.Web.ApiSpec.spec()) end test "a note with null content" do @@ -130,6 +157,7 @@ test "a note with null content" do status = StatusView.render("show.json", %{activity: note}) assert status.content == "" + assert_schema(status, "Status", Pleroma.Web.ApiSpec.spec()) end test "a note activity" do @@ -203,6 +231,7 @@ test "a note activity" do } assert status == expected + assert_schema(status, "Status", Pleroma.Web.ApiSpec.spec()) end test "tells if the message is muted for some reason" do @@ -211,14 +240,25 @@ test "tells if the message is muted for some reason" do {:ok, _user_relationships} = User.mute(user, other_user) - {:ok, activity} = CommonAPI.post(other_user, %{"status" => "test"}) - status = StatusView.render("show.json", %{activity: activity}) + {:ok, activity} = CommonAPI.post(other_user, %{status: "test"}) + relationships_opt = UserRelationship.view_relationships_option(user, [other_user]) + + opts = %{activity: activity} + status = StatusView.render("show.json", opts) + assert status.muted == false + assert_schema(status, "Status", Pleroma.Web.ApiSpec.spec()) + + status = StatusView.render("show.json", Map.put(opts, :relationships, relationships_opt)) assert status.muted == false - status = StatusView.render("show.json", %{activity: activity, for: user}) - + for_opts = %{activity: activity, for: user} + status = StatusView.render("show.json", for_opts) assert status.muted == true + + status = StatusView.render("show.json", Map.put(for_opts, :relationships, relationships_opt)) + assert status.muted == true + assert_schema(status, "Status", Pleroma.Web.ApiSpec.spec()) end test "tells if the message is thread muted" do @@ -227,7 +267,7 @@ test "tells if the message is thread muted" do {:ok, _user_relationships} = User.mute(user, other_user) - {:ok, activity} = CommonAPI.post(other_user, %{"status" => "test"}) + {:ok, activity} = CommonAPI.post(other_user, %{status: "test"}) status = StatusView.render("show.json", %{activity: activity, for: user}) assert status.pleroma.thread_muted == false @@ -242,7 +282,7 @@ test "tells if the message is thread muted" do test "tells if the status is bookmarked" do user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "Cute girls doing cute things"}) + {:ok, activity} = CommonAPI.post(user, %{status: "Cute girls doing cute things"}) status = StatusView.render("show.json", %{activity: activity}) assert status.bookmarked == false @@ -264,8 +304,7 @@ test "a reply" do note = insert(:note_activity) user = insert(:user) - {:ok, activity} = - CommonAPI.post(user, %{"status" => "he", "in_reply_to_status_id" => note.id}) + {:ok, activity} = CommonAPI.post(user, %{status: "he", in_reply_to_status_id: note.id}) status = StatusView.render("show.json", %{activity: activity}) @@ -280,12 +319,14 @@ test "contains mentions" do user = insert(:user) mentioned = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "hi @#{mentioned.nickname}"}) + {:ok, activity} = CommonAPI.post(user, %{status: "hi @#{mentioned.nickname}"}) status = StatusView.render("show.json", %{activity: activity}) assert status.mentions == Enum.map([mentioned], fn u -> AccountView.render("mention.json", %{user: u}) end) + + assert_schema(status, "Status", Pleroma.Web.ApiSpec.spec()) end test "create mentions from the 'to' field" do @@ -374,11 +415,17 @@ test "attachments" do pleroma: %{mime_type: "image/png"} } + api_spec = Pleroma.Web.ApiSpec.spec() + assert expected == StatusView.render("attachment.json", %{attachment: object}) + assert_schema(expected, "Attachment", api_spec) # If theres a "id", use that instead of the generated one object = Map.put(object, "id", 2) - assert %{id: "2"} = StatusView.render("attachment.json", %{attachment: object}) + result = StatusView.render("attachment.json", %{attachment: object}) + + assert %{id: "2"} = result + assert_schema(result, "Attachment", api_spec) end test "put the url advertised in the Activity in to the url attribute" do @@ -395,13 +442,14 @@ test "a reblog" do user = insert(:user) activity = insert(:note_activity) - {:ok, reblog, _} = CommonAPI.repeat(activity.id, user) + {:ok, reblog} = CommonAPI.repeat(activity.id, user) represented = StatusView.render("show.json", %{for: user, activity: reblog}) assert represented[:id] == to_string(reblog.id) assert represented[:reblog][:id] == to_string(activity.id) assert represented[:emojis] == [] + assert_schema(represented, "Status", Pleroma.Web.ApiSpec.spec()) end test "a peertube video" do @@ -416,6 +464,23 @@ test "a peertube video" do represented = StatusView.render("show.json", %{for: user, activity: activity}) + assert represented[:id] == to_string(activity.id) + assert length(represented[:media_attachments]) == 1 + assert_schema(represented, "Status", Pleroma.Web.ApiSpec.spec()) + end + + test "funkwhale audio" do + user = insert(:user) + + {:ok, object} = + Pleroma.Object.Fetcher.fetch_object_from_id( + "https://channels.tests.funkwhale.audio/federation/music/uploads/42342395-0208-4fee-a38d-259a6dae0871" + ) + + %Activity{} = activity = Activity.get_create_by_object_ap_id(object.data["id"]) + + represented = StatusView.render("show.json", %{for: user, activity: activity}) + assert represented[:id] == to_string(activity.id) assert length(represented[:media_attachments]) == 1 end @@ -511,39 +576,37 @@ test "a rich media card with all relevant data renders correctly" do end end - test "embeds a relationship in the account" do + test "does not embed a relationship in the account" do user = insert(:user) other_user = insert(:user) {:ok, activity} = CommonAPI.post(user, %{ - "status" => "drink more water" + status: "drink more water" }) result = StatusView.render("show.json", %{activity: activity, for: other_user}) - assert result[:account][:pleroma][:relationship] == - AccountView.render("relationship.json", %{user: other_user, target: user}) + assert result[:account][:pleroma][:relationship] == %{} + assert_schema(result, "Status", Pleroma.Web.ApiSpec.spec()) end - test "embeds a relationship in the account in reposts" do + test "does not embed a relationship in the account in reposts" do user = insert(:user) other_user = insert(:user) {:ok, activity} = CommonAPI.post(user, %{ - "status" => "˙˙ɐʎns" + status: "˙˙ɐʎns" }) - {:ok, activity, _object} = CommonAPI.repeat(activity.id, other_user) + {:ok, activity} = CommonAPI.repeat(activity.id, other_user) result = StatusView.render("show.json", %{activity: activity, for: user}) - assert result[:account][:pleroma][:relationship] == - AccountView.render("relationship.json", %{user: user, target: other_user}) - - assert result[:reblog][:account][:pleroma][:relationship] == - AccountView.render("relationship.json", %{user: user, target: user}) + assert result[:account][:pleroma][:relationship] == %{} + assert result[:reblog][:account][:pleroma][:relationship] == %{} + assert_schema(result, "Status", Pleroma.Web.ApiSpec.spec()) end test "visibility/list" do @@ -551,20 +614,10 @@ test "visibility/list" do {:ok, list} = Pleroma.List.create("foo", user) - {:ok, activity} = - CommonAPI.post(user, %{"status" => "foobar", "visibility" => "list:#{list.id}"}) + {:ok, activity} = CommonAPI.post(user, %{status: "foobar", visibility: "list:#{list.id}"}) status = StatusView.render("show.json", activity: activity) assert status.visibility == "list" end - - test "successfully renders a Listen activity (pleroma extension)" do - listen_activity = insert(:listen) - - status = StatusView.render("listen.json", activity: listen_activity) - - assert status.length == listen_activity.data["object"]["length"] - assert status.title == listen_activity.data["object"]["title"] - end end diff --git a/test/web/mastodon_api/views/push_subscription_view_test.exs b/test/web/mastodon_api/views/subscription_view_test.exs similarity index 72% rename from test/web/mastodon_api/views/push_subscription_view_test.exs rename to test/web/mastodon_api/views/subscription_view_test.exs index 10c6082a5..981524c0e 100644 --- a/test/web/mastodon_api/views/push_subscription_view_test.exs +++ b/test/web/mastodon_api/views/subscription_view_test.exs @@ -2,10 +2,10 @@ # Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only -defmodule Pleroma.Web.MastodonAPI.PushSubscriptionViewTest do +defmodule Pleroma.Web.MastodonAPI.SubscriptionViewTest do use Pleroma.DataCase import Pleroma.Factory - alias Pleroma.Web.MastodonAPI.PushSubscriptionView, as: View + alias Pleroma.Web.MastodonAPI.SubscriptionView, as: View alias Pleroma.Web.Push test "Represent a subscription" do @@ -18,6 +18,6 @@ test "Represent a subscription" do server_key: Keyword.get(Push.vapid_config(), :public_key) } - assert expected == View.render("push_subscription.json", %{subscription: subscription}) + assert expected == View.render("show.json", %{subscription: subscription}) end end diff --git a/test/web/media_proxy/invalidations/http_test.exs b/test/web/media_proxy/invalidations/http_test.exs new file mode 100644 index 000000000..8a3b4141c --- /dev/null +++ b/test/web/media_proxy/invalidations/http_test.exs @@ -0,0 +1,35 @@ +defmodule Pleroma.Web.MediaProxy.Invalidation.HttpTest do + use ExUnit.Case + alias Pleroma.Web.MediaProxy.Invalidation + + import ExUnit.CaptureLog + import Tesla.Mock + + test "logs hasn't error message when request is valid" do + mock(fn + %{method: :purge, url: "http://example.com/media/example.jpg"} -> + %Tesla.Env{status: 200} + end) + + refute capture_log(fn -> + assert Invalidation.Http.purge( + ["http://example.com/media/example.jpg"], + %{} + ) == {:ok, "success"} + end) =~ "Error while cache purge" + end + + test "it write error message in logs when request invalid" do + mock(fn + %{method: :purge, url: "http://example.com/media/example1.jpg"} -> + %Tesla.Env{status: 404} + end) + + assert capture_log(fn -> + assert Invalidation.Http.purge( + ["http://example.com/media/example1.jpg"], + %{} + ) == {:ok, "success"} + end) =~ "Error while cache purge: url - http://example.com/media/example1.jpg" + end +end diff --git a/test/web/media_proxy/invalidations/script_test.exs b/test/web/media_proxy/invalidations/script_test.exs new file mode 100644 index 000000000..1358963ab --- /dev/null +++ b/test/web/media_proxy/invalidations/script_test.exs @@ -0,0 +1,20 @@ +defmodule Pleroma.Web.MediaProxy.Invalidation.ScriptTest do + use ExUnit.Case + alias Pleroma.Web.MediaProxy.Invalidation + + import ExUnit.CaptureLog + + test "it logger error when script not found" do + assert capture_log(fn -> + assert Invalidation.Script.purge( + ["http://example.com/media/example.jpg"], + %{script_path: "./example"} + ) == {:error, "\"%ErlangError{original: :enoent}\""} + end) =~ "Error while cache purge: \"%ErlangError{original: :enoent}\"" + + assert Invalidation.Script.purge( + ["http://example.com/media/example.jpg"], + %{} + ) == {:error, "not found script path"} + end +end diff --git a/test/web/media_proxy/media_proxy_test.exs b/test/web/media_proxy/media_proxy_test.exs index 69c2d5dae..69d2a71a6 100644 --- a/test/web/media_proxy/media_proxy_test.exs +++ b/test/web/media_proxy/media_proxy_test.exs @@ -124,15 +124,7 @@ test "encoded url are tried to match for proxy as `conn.request_path` encodes th 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) @@ -213,8 +205,8 @@ test "mediaproxy whitelist" do 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" diff --git a/test/web/metadata/metadata_test.exs b/test/web/metadata/metadata_test.exs new file mode 100644 index 000000000..3f8b29e58 --- /dev/null +++ b/test/web/metadata/metadata_test.exs @@ -0,0 +1,25 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.MetadataTest do + use Pleroma.DataCase, async: true + + import Pleroma.Factory + + describe "restrict indexing remote users" do + test "for remote user" do + user = insert(:user, local: false) + + assert Pleroma.Web.Metadata.build_tags(%{user: user}) =~ + "" + end + + test "for local user" do + user = insert(:user) + + refute 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 new file mode 100644 index 000000000..aad0bac42 --- /dev/null +++ b/test/web/metadata/restrict_indexing_test.exs @@ -0,0 +1,21 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.Metadata.Providers.RestrictIndexingTest do + use ExUnit.Case, async: true + + describe "build_tags/1" do + test "for remote user" do + assert Pleroma.Web.Metadata.Providers.RestrictIndexing.build_tags(%{ + user: %Pleroma.User{local: false} + }) == [{:meta, [name: "robots", content: "noindex, noarchive"], []}] + end + + test "for local user" do + assert Pleroma.Web.Metadata.Providers.RestrictIndexing.build_tags(%{ + user: %Pleroma.User{local: true} + }) == [] + end + end +end diff --git a/test/web/metadata/twitter_card_test.exs b/test/web/metadata/twitter_card_test.exs index 9e9c6853a..10931b5ba 100644 --- a/test/web/metadata/twitter_card_test.exs +++ b/test/web/metadata/twitter_card_test.exs @@ -30,7 +30,7 @@ test "it renders twitter card for user info" do test "it uses summary twittercard if post has no attachment" do user = insert(:user, name: "Jimmy Hendriks", bio: "born 19 March 1994") - {:ok, activity} = CommonAPI.post(user, %{"status" => "HI"}) + {:ok, activity} = CommonAPI.post(user, %{status: "HI"}) note = insert(:note, %{ @@ -56,7 +56,7 @@ test "it uses summary twittercard if post has no attachment" do test "it renders avatar not attachment if post is nsfw and unfurl_nsfw is disabled" do Pleroma.Config.put([Pleroma.Web.Metadata, :unfurl_nsfw], false) user = insert(:user, name: "Jimmy Hendriks", bio: "born 19 March 1994") - {:ok, activity} = CommonAPI.post(user, %{"status" => "HI"}) + {:ok, activity} = CommonAPI.post(user, %{status: "HI"}) note = insert(:note, %{ @@ -100,7 +100,7 @@ test "it renders avatar not attachment if post is nsfw and unfurl_nsfw is disabl test "it renders supported types of attachments and skips unknown types" do user = insert(:user, name: "Jimmy Hendriks", bio: "born 19 March 1994") - {:ok, activity} = CommonAPI.post(user, %{"status" => "HI"}) + {:ok, activity} = CommonAPI.post(user, %{status: "HI"}) note = insert(:note, %{ diff --git a/test/web/mongooseim/mongoose_im_controller_test.exs b/test/web/mongooseim/mongoose_im_controller_test.exs index 291ae54fc..5176cde84 100644 --- a/test/web/mongooseim/mongoose_im_controller_test.exs +++ b/test/web/mongooseim/mongoose_im_controller_test.exs @@ -9,6 +9,7 @@ defmodule Pleroma.Web.MongooseIMController do test "/user_exists", %{conn: conn} do _user = insert(:user, nickname: "lain") _remote_user = insert(:user, nickname: "alice", local: false) + _deactivated_user = insert(:user, nickname: "konata", deactivated: true) res = conn @@ -30,10 +31,24 @@ test "/user_exists", %{conn: conn} do |> json_response(404) assert res == false + + res = + conn + |> get(mongoose_im_path(conn, :user_exists), user: "konata") + |> json_response(404) + + assert res == false end test "/check_password", %{conn: conn} do - user = insert(:user, password_hash: Comeonin.Pbkdf2.hashpwsalt("cool")) + user = insert(:user, password_hash: Pbkdf2.hash_pwd_salt("cool")) + + _deactivated_user = + insert(:user, + nickname: "konata", + deactivated: true, + password_hash: Pbkdf2.hash_pwd_salt("cool") + ) res = conn @@ -49,6 +64,13 @@ test "/check_password", %{conn: conn} do assert res == false + res = + conn + |> get(mongoose_im_path(conn, :check_password), user: "konata", pass: "cool") + |> json_response(404) + + assert res == false + res = conn |> get(mongoose_im_path(conn, :check_password), user: "nobody", pass: "cool") diff --git a/test/web/node_info_test.exs b/test/web/node_info_test.exs index 43f322606..9bcc07b37 100644 --- a/test/web/node_info_test.exs +++ b/test/web/node_info_test.exs @@ -7,6 +7,8 @@ defmodule Pleroma.Web.NodeInfoTest do import Pleroma.Factory + alias Pleroma.Config + setup do: clear_config([:mrf_simple]) setup do: clear_config(:instance) @@ -47,7 +49,7 @@ test "nodeinfo shows restricted nicknames", %{conn: conn} do assert result = json_response(conn, 200) - assert Pleroma.Config.get([Pleroma.User, :restricted_nicknames]) == + assert Config.get([Pleroma.User, :restricted_nicknames]) == result["metadata"]["restrictedNicknames"] end @@ -65,10 +67,10 @@ test "returns software.repository field in nodeinfo 2.1", %{conn: conn} do end test "returns fieldsLimits field", %{conn: conn} do - Pleroma.Config.put([:instance, :max_account_fields], 10) - Pleroma.Config.put([:instance, :max_remote_account_fields], 15) - Pleroma.Config.put([:instance, :account_field_name_length], 255) - Pleroma.Config.put([:instance, :account_field_value_length], 2048) + Config.put([:instance, :max_account_fields], 10) + Config.put([:instance, :max_remote_account_fields], 15) + Config.put([:instance, :account_field_name_length], 255) + Config.put([:instance, :account_field_value_length], 2048) response = conn @@ -82,8 +84,8 @@ test "returns fieldsLimits field", %{conn: conn} do end test "it returns the safe_dm_mentions feature if enabled", %{conn: conn} do - option = Pleroma.Config.get([:instance, :safe_dm_mentions]) - Pleroma.Config.put([:instance, :safe_dm_mentions], true) + option = Config.get([:instance, :safe_dm_mentions]) + Config.put([:instance, :safe_dm_mentions], true) response = conn @@ -92,7 +94,7 @@ test "it returns the safe_dm_mentions feature if enabled", %{conn: conn} do assert "safe_dm_mentions" in response["metadata"]["features"] - Pleroma.Config.put([:instance, :safe_dm_mentions], false) + Config.put([:instance, :safe_dm_mentions], false) response = conn @@ -101,14 +103,14 @@ test "it returns the safe_dm_mentions feature if enabled", %{conn: conn} do refute "safe_dm_mentions" in response["metadata"]["features"] - Pleroma.Config.put([:instance, :safe_dm_mentions], option) + Config.put([:instance, :safe_dm_mentions], option) end describe "`metadata/federation/enabled`" do setup do: clear_config([:instance, :federating]) test "it shows if federation is enabled/disabled", %{conn: conn} do - Pleroma.Config.put([:instance, :federating], true) + Config.put([:instance, :federating], true) response = conn @@ -117,7 +119,7 @@ test "it shows if federation is enabled/disabled", %{conn: conn} do assert response["metadata"]["federation"]["enabled"] == true - Pleroma.Config.put([:instance, :federating], false) + Config.put([:instance, :federating], false) response = conn @@ -128,15 +130,39 @@ test "it shows if federation is enabled/disabled", %{conn: conn} do end end - test "it shows MRF transparency data if enabled", %{conn: conn} do - config = Pleroma.Config.get([:instance, :rewrite_policy]) - Pleroma.Config.put([:instance, :rewrite_policy], [Pleroma.Web.ActivityPub.MRF.SimplePolicy]) + test "it shows default features flags", %{conn: conn} do + response = + conn + |> get("/nodeinfo/2.1.json") + |> json_response(:ok) - option = Pleroma.Config.get([:instance, :mrf_transparency]) - Pleroma.Config.put([:instance, :mrf_transparency], true) + default_features = [ + "pleroma_api", + "mastodon_api", + "mastodon_api_streaming", + "polls", + "pleroma_explicit_addressing", + "shareable_emoji_packs", + "multifetch", + "pleroma_emoji_reactions", + "pleroma:api/v1/notifications:include_types_filter" + ] + + assert MapSet.subset?( + MapSet.new(default_features), + MapSet.new(response["metadata"]["features"]) + ) + end + + test "it shows MRF transparency data if enabled", %{conn: conn} do + config = Config.get([:instance, :rewrite_policy]) + Config.put([:instance, :rewrite_policy], [Pleroma.Web.ActivityPub.MRF.SimplePolicy]) + + option = Config.get([:instance, :mrf_transparency]) + Config.put([:instance, :mrf_transparency], true) simple_config = %{"reject" => ["example.com"]} - Pleroma.Config.put(:mrf_simple, simple_config) + Config.put(:mrf_simple, simple_config) response = conn @@ -145,25 +171,25 @@ test "it shows MRF transparency data if enabled", %{conn: conn} do assert response["metadata"]["federation"]["mrf_simple"] == simple_config - Pleroma.Config.put([:instance, :rewrite_policy], config) - Pleroma.Config.put([:instance, :mrf_transparency], option) - Pleroma.Config.put(:mrf_simple, %{}) + Config.put([:instance, :rewrite_policy], config) + Config.put([:instance, :mrf_transparency], option) + Config.put(:mrf_simple, %{}) end test "it performs exclusions from MRF transparency data if configured", %{conn: conn} do - config = Pleroma.Config.get([:instance, :rewrite_policy]) - Pleroma.Config.put([:instance, :rewrite_policy], [Pleroma.Web.ActivityPub.MRF.SimplePolicy]) + config = Config.get([:instance, :rewrite_policy]) + Config.put([:instance, :rewrite_policy], [Pleroma.Web.ActivityPub.MRF.SimplePolicy]) - option = Pleroma.Config.get([:instance, :mrf_transparency]) - Pleroma.Config.put([:instance, :mrf_transparency], true) + option = Config.get([:instance, :mrf_transparency]) + Config.put([:instance, :mrf_transparency], true) - exclusions = Pleroma.Config.get([:instance, :mrf_transparency_exclusions]) - Pleroma.Config.put([:instance, :mrf_transparency_exclusions], ["other.site"]) + exclusions = Config.get([:instance, :mrf_transparency_exclusions]) + Config.put([:instance, :mrf_transparency_exclusions], ["other.site"]) simple_config = %{"reject" => ["example.com", "other.site"]} expected_config = %{"reject" => ["example.com"]} - Pleroma.Config.put(:mrf_simple, simple_config) + Config.put(:mrf_simple, simple_config) response = conn @@ -173,9 +199,9 @@ test "it performs exclusions from MRF transparency data if configured", %{conn: assert response["metadata"]["federation"]["mrf_simple"] == expected_config assert response["metadata"]["federation"]["exclusions"] == true - Pleroma.Config.put([:instance, :rewrite_policy], config) - Pleroma.Config.put([:instance, :mrf_transparency], option) - Pleroma.Config.put([:instance, :mrf_transparency_exclusions], exclusions) - Pleroma.Config.put(:mrf_simple, %{}) + Config.put([:instance, :rewrite_policy], config) + Config.put([:instance, :mrf_transparency], option) + Config.put([:instance, :mrf_transparency_exclusions], exclusions) + Config.put(:mrf_simple, %{}) end end diff --git a/test/web/oauth/ldap_authorization_test.exs b/test/web/oauth/ldap_authorization_test.exs index a8fe8a841..011642c08 100644 --- a/test/web/oauth/ldap_authorization_test.exs +++ b/test/web/oauth/ldap_authorization_test.exs @@ -19,7 +19,7 @@ defmodule Pleroma.Web.OAuth.LDAPAuthorizationTest do @tag @skip test "authorizes the existing user using LDAP credentials" do password = "testpassword" - user = insert(:user, password_hash: Comeonin.Pbkdf2.hashpwsalt(password)) + user = insert(:user, password_hash: Pbkdf2.hash_pwd_salt(password)) app = insert(:oauth_app, scopes: ["read", "write"]) host = Pleroma.Config.get([:ldap, :host]) |> to_charlist @@ -104,7 +104,7 @@ test "creates a new user after successful LDAP authorization" do @tag @skip test "falls back to the default authorization when LDAP is unavailable" do password = "testpassword" - user = insert(:user, password_hash: Comeonin.Pbkdf2.hashpwsalt(password)) + user = insert(:user, password_hash: Pbkdf2.hash_pwd_salt(password)) app = insert(:oauth_app, scopes: ["read", "write"]) host = Pleroma.Config.get([:ldap, :host]) |> to_charlist @@ -148,7 +148,7 @@ test "falls back to the default authorization when LDAP is unavailable" do @tag @skip test "disallow authorization for wrong LDAP credentials" do password = "testpassword" - user = insert(:user, password_hash: Comeonin.Pbkdf2.hashpwsalt(password)) + user = insert(:user, password_hash: Pbkdf2.hash_pwd_salt(password)) app = insert(:oauth_app, scopes: ["read", "write"]) host = Pleroma.Config.get([:ldap, :host]) |> to_charlist diff --git a/test/web/oauth/mfa_controller_test.exs b/test/web/oauth/mfa_controller_test.exs new file mode 100644 index 000000000..3c341facd --- /dev/null +++ b/test/web/oauth/mfa_controller_test.exs @@ -0,0 +1,306 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2018 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.OAuth.MFAControllerTest do + use Pleroma.Web.ConnCase + import Pleroma.Factory + + alias Pleroma.MFA + alias Pleroma.MFA.BackupCodes + alias Pleroma.MFA.TOTP + alias Pleroma.Repo + alias Pleroma.Web.OAuth.Authorization + alias Pleroma.Web.OAuth.OAuthController + + setup %{conn: conn} do + otp_secret = TOTP.generate_secret() + + user = + insert(:user, + multi_factor_authentication_settings: %MFA.Settings{ + enabled: true, + backup_codes: [Pbkdf2.hash_pwd_salt("test-code")], + totp: %MFA.Settings.TOTP{secret: otp_secret, confirmed: true} + } + ) + + app = insert(:oauth_app) + {:ok, conn: conn, user: user, app: app} + end + + describe "show" do + setup %{conn: conn, user: user, app: app} do + mfa_token = + insert(:mfa_token, + user: user, + authorization: build(:oauth_authorization, app: app, scopes: ["write"]) + ) + + {:ok, conn: conn, mfa_token: mfa_token} + end + + test "GET /oauth/mfa renders mfa forms", %{conn: conn, mfa_token: mfa_token} do + conn = + get( + conn, + "/oauth/mfa", + %{ + "mfa_token" => mfa_token.token, + "state" => "a_state", + "redirect_uri" => "http://localhost:8080/callback" + } + ) + + assert response = html_response(conn, 200) + assert response =~ "Two-factor authentication" + assert response =~ mfa_token.token + assert response =~ "http://localhost:8080/callback" + end + + test "GET /oauth/mfa renders mfa recovery forms", %{conn: conn, mfa_token: mfa_token} do + conn = + get( + conn, + "/oauth/mfa", + %{ + "mfa_token" => mfa_token.token, + "state" => "a_state", + "redirect_uri" => "http://localhost:8080/callback", + "challenge_type" => "recovery" + } + ) + + assert response = html_response(conn, 200) + assert response =~ "Two-factor recovery" + assert response =~ mfa_token.token + assert response =~ "http://localhost:8080/callback" + end + end + + describe "verify" do + setup %{conn: conn, user: user, app: app} do + mfa_token = + insert(:mfa_token, + user: user, + authorization: build(:oauth_authorization, app: app, scopes: ["write"]) + ) + + {:ok, conn: conn, user: user, mfa_token: mfa_token, app: app} + end + + test "POST /oauth/mfa/verify, verify totp code", %{ + conn: conn, + user: user, + mfa_token: mfa_token, + app: app + } do + otp_token = TOTP.generate_token(user.multi_factor_authentication_settings.totp.secret) + + conn = + conn + |> post("/oauth/mfa/verify", %{ + "mfa" => %{ + "mfa_token" => mfa_token.token, + "challenge_type" => "totp", + "code" => otp_token, + "state" => "a_state", + "redirect_uri" => OAuthController.default_redirect_uri(app) + } + }) + + target = redirected_to(conn) + target_url = %URI{URI.parse(target) | query: nil} |> URI.to_string() + query = URI.parse(target).query |> URI.query_decoder() |> Map.new() + assert %{"state" => "a_state", "code" => code} = query + assert target_url == OAuthController.default_redirect_uri(app) + auth = Repo.get_by(Authorization, token: code) + assert auth.scopes == ["write"] + end + + test "POST /oauth/mfa/verify, verify recovery code", %{ + conn: conn, + mfa_token: mfa_token, + app: app + } do + conn = + conn + |> post("/oauth/mfa/verify", %{ + "mfa" => %{ + "mfa_token" => mfa_token.token, + "challenge_type" => "recovery", + "code" => "test-code", + "state" => "a_state", + "redirect_uri" => OAuthController.default_redirect_uri(app) + } + }) + + target = redirected_to(conn) + target_url = %URI{URI.parse(target) | query: nil} |> URI.to_string() + query = URI.parse(target).query |> URI.query_decoder() |> Map.new() + assert %{"state" => "a_state", "code" => code} = query + assert target_url == OAuthController.default_redirect_uri(app) + auth = Repo.get_by(Authorization, token: code) + assert auth.scopes == ["write"] + end + end + + describe "challenge/totp" do + test "returns access token with valid code", %{conn: conn, user: user, app: app} do + otp_token = TOTP.generate_token(user.multi_factor_authentication_settings.totp.secret) + + mfa_token = + insert(:mfa_token, + user: user, + authorization: build(:oauth_authorization, app: app, scopes: ["write"]) + ) + + response = + conn + |> post("/oauth/mfa/challenge", %{ + "mfa_token" => mfa_token.token, + "challenge_type" => "totp", + "code" => otp_token, + "client_id" => app.client_id, + "client_secret" => app.client_secret + }) + |> json_response(:ok) + + ap_id = user.ap_id + + assert match?( + %{ + "access_token" => _, + "expires_in" => 600, + "me" => ^ap_id, + "refresh_token" => _, + "scope" => "write", + "token_type" => "Bearer" + }, + response + ) + end + + test "returns errors when mfa token invalid", %{conn: conn, user: user, app: app} do + otp_token = TOTP.generate_token(user.multi_factor_authentication_settings.totp.secret) + + response = + conn + |> post("/oauth/mfa/challenge", %{ + "mfa_token" => "XXX", + "challenge_type" => "totp", + "code" => otp_token, + "client_id" => app.client_id, + "client_secret" => app.client_secret + }) + |> json_response(400) + + assert response == %{"error" => "Invalid code"} + end + + test "returns error when otp code is invalid", %{conn: conn, user: user, app: app} do + mfa_token = insert(:mfa_token, user: user) + + response = + conn + |> post("/oauth/mfa/challenge", %{ + "mfa_token" => mfa_token.token, + "challenge_type" => "totp", + "code" => "XXX", + "client_id" => app.client_id, + "client_secret" => app.client_secret + }) + |> json_response(400) + + assert response == %{"error" => "Invalid code"} + end + + test "returns error when client credentails is wrong ", %{conn: conn, user: user} do + otp_token = TOTP.generate_token(user.multi_factor_authentication_settings.totp.secret) + mfa_token = insert(:mfa_token, user: user) + + response = + conn + |> post("/oauth/mfa/challenge", %{ + "mfa_token" => mfa_token.token, + "challenge_type" => "totp", + "code" => otp_token, + "client_id" => "xxx", + "client_secret" => "xxx" + }) + |> json_response(400) + + assert response == %{"error" => "Invalid code"} + end + end + + describe "challenge/recovery" do + setup %{conn: conn} do + app = insert(:oauth_app) + {:ok, conn: conn, app: app} + end + + test "returns access token with valid code", %{conn: conn, app: app} do + otp_secret = TOTP.generate_secret() + + [code | _] = backup_codes = BackupCodes.generate() + + hashed_codes = + backup_codes + |> Enum.map(&Pbkdf2.hash_pwd_salt(&1)) + + user = + insert(:user, + multi_factor_authentication_settings: %MFA.Settings{ + enabled: true, + backup_codes: hashed_codes, + totp: %MFA.Settings.TOTP{secret: otp_secret, confirmed: true} + } + ) + + mfa_token = + insert(:mfa_token, + user: user, + authorization: build(:oauth_authorization, app: app, scopes: ["write"]) + ) + + response = + conn + |> post("/oauth/mfa/challenge", %{ + "mfa_token" => mfa_token.token, + "challenge_type" => "recovery", + "code" => code, + "client_id" => app.client_id, + "client_secret" => app.client_secret + }) + |> json_response(:ok) + + ap_id = user.ap_id + + assert match?( + %{ + "access_token" => _, + "expires_in" => 600, + "me" => ^ap_id, + "refresh_token" => _, + "scope" => "write", + "token_type" => "Bearer" + }, + response + ) + + error_response = + conn + |> post("/oauth/mfa/challenge", %{ + "mfa_token" => mfa_token.token, + "challenge_type" => "recovery", + "code" => code, + "client_id" => app.client_id, + "client_secret" => app.client_secret + }) + |> json_response(400) + + assert error_response == %{"error" => "Invalid code"} + end + end +end diff --git a/test/web/oauth/oauth_controller_test.exs b/test/web/oauth/oauth_controller_test.exs index 0b0972b17..d389e4ce0 100644 --- a/test/web/oauth/oauth_controller_test.exs +++ b/test/web/oauth/oauth_controller_test.exs @@ -6,6 +6,8 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do use Pleroma.Web.ConnCase import Pleroma.Factory + alias Pleroma.MFA + alias Pleroma.MFA.TOTP alias Pleroma.Repo alias Pleroma.User alias Pleroma.Web.OAuth.Authorization @@ -309,7 +311,7 @@ test "with valid params, POST /oauth/register?op=connect redirects to `redirect_ app: app, conn: conn } do - user = insert(:user, password_hash: Comeonin.Pbkdf2.hashpwsalt("testpassword")) + user = insert(:user, password_hash: Pbkdf2.hash_pwd_salt("testpassword")) registration = insert(:registration, user: nil) redirect_uri = OAuthController.default_redirect_uri(app) @@ -340,7 +342,7 @@ test "with unlisted `redirect_uri`, POST /oauth/register?op=connect results in H app: app, conn: conn } do - user = insert(:user, password_hash: Comeonin.Pbkdf2.hashpwsalt("testpassword")) + user = insert(:user, password_hash: Pbkdf2.hash_pwd_salt("testpassword")) registration = insert(:registration, user: nil) unlisted_redirect_uri = "http://cross-site-request.com" @@ -575,7 +577,7 @@ test "redirects with oauth authorization, " <> # In case scope param is missing, expecting _all_ app-supported scopes to be granted for user <- [non_admin, admin], {requested_scopes, expected_scopes} <- - %{scopes_subset => scopes_subset, nil => app_scopes} do + %{scopes_subset => scopes_subset, nil: app_scopes} do conn = post( build_conn(), @@ -604,6 +606,41 @@ test "redirects with oauth authorization, " <> end end + test "redirect to on two-factor auth page" do + otp_secret = TOTP.generate_secret() + + user = + insert(:user, + multi_factor_authentication_settings: %MFA.Settings{ + enabled: true, + totp: %MFA.Settings.TOTP{secret: otp_secret, confirmed: true} + } + ) + + app = insert(:oauth_app, scopes: ["read", "write", "follow"]) + + conn = + build_conn() + |> post("/oauth/authorize", %{ + "authorization" => %{ + "name" => user.nickname, + "password" => "test", + "client_id" => app.client_id, + "redirect_uri" => app.redirect_uris, + "scope" => "read write", + "state" => "statepassed" + } + }) + + result = html_response(conn, 200) + + mfa_token = Repo.get_by(MFA.Token, user_id: user.id) + assert result =~ app.redirect_uris + assert result =~ "statepassed" + assert result =~ mfa_token.token + assert result =~ "Two-factor authentication" + end + test "returns 401 for wrong credentials", %{conn: conn} do user = insert(:user) app = insert(:oauth_app) @@ -713,7 +750,7 @@ test "issues a token for an all-body request" do test "issues a token for `password` grant_type with valid credentials, with full permissions by default" do password = "testpassword" - user = insert(:user, password_hash: Comeonin.Pbkdf2.hashpwsalt(password)) + user = insert(:user, password_hash: Pbkdf2.hash_pwd_salt(password)) app = insert(:oauth_app, scopes: ["read", "write"]) @@ -735,6 +772,46 @@ test "issues a token for `password` grant_type with valid credentials, with full assert token.scopes == app.scopes end + test "issues a mfa token for `password` grant_type, when MFA enabled" do + password = "testpassword" + otp_secret = TOTP.generate_secret() + + user = + insert(:user, + password_hash: Pbkdf2.hash_pwd_salt(password), + multi_factor_authentication_settings: %MFA.Settings{ + enabled: true, + totp: %MFA.Settings.TOTP{secret: otp_secret, confirmed: true} + } + ) + + app = insert(:oauth_app, scopes: ["read", "write"]) + + response = + build_conn() + |> post("/oauth/token", %{ + "grant_type" => "password", + "username" => user.nickname, + "password" => password, + "client_id" => app.client_id, + "client_secret" => app.client_secret + }) + |> json_response(403) + + assert match?( + %{ + "supported_challenge_types" => "totp", + "mfa_token" => _, + "error" => "mfa_required" + }, + response + ) + + token = Repo.get_by(MFA.Token, token: response["mfa_token"]) + assert token.user_id == user.id + assert token.authorization_id + end + test "issues a token for request with HTTP basic auth client credentials" do user = insert(:user) app = insert(:oauth_app, scopes: ["scope1", "scope2", "scope3"]) @@ -810,7 +887,7 @@ test "rejects token exchange for valid credentials belonging to unconfirmed user password = "testpassword" {:ok, user} = - insert(:user, password_hash: Comeonin.Pbkdf2.hashpwsalt(password)) + insert(:user, password_hash: Pbkdf2.hash_pwd_salt(password)) |> User.confirmation_changeset(need_confirmation: true) |> User.update_and_set_cache() @@ -838,7 +915,7 @@ test "rejects token exchange for valid credentials belonging to deactivated user user = insert(:user, - password_hash: Comeonin.Pbkdf2.hashpwsalt(password), + password_hash: Pbkdf2.hash_pwd_salt(password), deactivated: true ) @@ -866,7 +943,7 @@ test "rejects token exchange for user with password_reset_pending set to true" d user = insert(:user, - password_hash: Comeonin.Pbkdf2.hashpwsalt(password), + password_hash: Pbkdf2.hash_pwd_salt(password), password_reset_pending: true ) @@ -895,7 +972,7 @@ test "rejects token exchange for user with confirmation_pending set to true" do user = insert(:user, - password_hash: Comeonin.Pbkdf2.hashpwsalt(password), + password_hash: Pbkdf2.hash_pwd_salt(password), confirmation_pending: true ) diff --git a/test/web/ostatus/ostatus_controller_test.exs b/test/web/ostatus/ostatus_controller_test.exs index 6787b414b..ee498f4b5 100644 --- a/test/web/ostatus/ostatus_controller_test.exs +++ b/test/web/ostatus/ostatus_controller_test.exs @@ -10,7 +10,11 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do alias Pleroma.Config alias Pleroma.Object alias Pleroma.User + alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.CommonAPI + alias Pleroma.Web.Endpoint + + require Pleroma.Constants setup_all do Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) @@ -19,6 +23,47 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do setup do: clear_config([:instance, :federating], true) + describe "Mastodon compatibility routes" do + setup %{conn: conn} do + conn = put_req_header(conn, "accept", "text/html") + + {:ok, object} = + %{ + "type" => "Note", + "content" => "hey", + "id" => Endpoint.url() <> "/users/raymoo/statuses/999999999", + "actor" => Endpoint.url() <> "/users/raymoo", + "to" => [Pleroma.Constants.as_public()] + } + |> Object.create() + + {:ok, activity, _} = + %{ + "id" => object.data["id"] <> "/activity", + "type" => "Create", + "object" => object.data["id"], + "actor" => object.data["actor"], + "to" => object.data["to"] + } + |> ActivityPub.persist(local: true) + + %{conn: conn, activity: activity} + end + + test "redirects to /notice/:id for html format", %{conn: conn, activity: activity} do + conn = get(conn, "/users/raymoo/statuses/999999999") + assert redirected_to(conn) == "/notice/#{activity.id}" + end + + test "redirects to /notice/:id for html format for activity", %{ + conn: conn, + activity: activity + } do + conn = get(conn, "/users/raymoo/statuses/999999999/activity") + assert redirected_to(conn) == "/notice/#{activity.id}" + end + end + # Note: see ActivityPubControllerTest for JSON format tests describe "GET /objects/:uuid (text/html)" do setup %{conn: conn} do @@ -136,7 +181,7 @@ test "render html for redirect for html format", %{conn: conn} do user = insert(:user) - {:ok, like_activity, _} = CommonAPI.favorite(note_activity.id, user) + {:ok, like_activity} = CommonAPI.favorite(user, note_activity.id) assert like_activity.data["type"] == "Like" diff --git a/test/web/pleroma_api/controllers/account_controller_test.exs b/test/web/pleroma_api/controllers/account_controller_test.exs index 2aa87ac30..103997c31 100644 --- a/test/web/pleroma_api/controllers/account_controller_test.exs +++ b/test/web/pleroma_api/controllers/account_controller_test.exs @@ -31,8 +31,28 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do test "resend account confirmation email", %{conn: conn, user: user} do conn + |> put_req_header("content-type", "application/json") |> post("/api/v1/pleroma/accounts/confirmation_resend?email=#{user.email}") - |> json_response(:no_content) + |> json_response_and_validate_schema(:no_content) + + ObanHelpers.perform_all() + + email = Pleroma.Emails.UserEmail.account_confirmation_email(user) + notify_email = Config.get([:instance, :notify_email]) + instance_name = Config.get([:instance, :name]) + + assert_email_sent( + from: {instance_name, notify_email}, + to: {user.name, user.email}, + html_body: email.html_body + ) + end + + test "resend account confirmation email (with nickname)", %{conn: conn, user: user} do + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/pleroma/accounts/confirmation_resend?nickname=#{user.nickname}") + |> json_response_and_validate_schema(:no_content) ObanHelpers.perform_all() @@ -54,7 +74,10 @@ test "resend account confirmation email", %{conn: conn, user: user} do test "user avatar can be set", %{user: user, conn: conn} do avatar_image = File.read!("test/fixtures/avatar_data_uri") - conn = patch(conn, "/api/v1/pleroma/accounts/update_avatar", %{img: avatar_image}) + conn = + conn + |> put_req_header("content-type", "multipart/form-data") + |> patch("/api/v1/pleroma/accounts/update_avatar", %{img: avatar_image}) user = refresh_record(user) @@ -70,17 +93,20 @@ test "user avatar can be set", %{user: user, conn: conn} do ] } = user.avatar - assert %{"url" => _} = json_response(conn, 200) + assert %{"url" => _} = json_response_and_validate_schema(conn, 200) end test "user avatar can be reset", %{user: user, conn: conn} do - conn = patch(conn, "/api/v1/pleroma/accounts/update_avatar", %{img: ""}) + conn = + conn + |> put_req_header("content-type", "multipart/form-data") + |> patch("/api/v1/pleroma/accounts/update_avatar", %{img: ""}) user = User.get_cached_by_id(user.id) assert user.avatar == nil - assert %{"url" => nil} = json_response(conn, 200) + assert %{"url" => nil} = json_response_and_validate_schema(conn, 200) end end @@ -88,21 +114,27 @@ test "user avatar can be reset", %{user: user, conn: conn} do setup do: oauth_access(["write:accounts"]) test "can set profile banner", %{user: user, conn: conn} do - conn = patch(conn, "/api/v1/pleroma/accounts/update_banner", %{"banner" => @image}) + conn = + conn + |> put_req_header("content-type", "multipart/form-data") + |> patch("/api/v1/pleroma/accounts/update_banner", %{"banner" => @image}) user = refresh_record(user) assert user.banner["type"] == "Image" - assert %{"url" => _} = json_response(conn, 200) + assert %{"url" => _} = json_response_and_validate_schema(conn, 200) end test "can reset profile banner", %{user: user, conn: conn} do - conn = patch(conn, "/api/v1/pleroma/accounts/update_banner", %{"banner" => ""}) + conn = + conn + |> put_req_header("content-type", "multipart/form-data") + |> patch("/api/v1/pleroma/accounts/update_banner", %{"banner" => ""}) user = refresh_record(user) assert user.banner == %{} - assert %{"url" => nil} = json_response(conn, 200) + assert %{"url" => nil} = json_response_and_validate_schema(conn, 200) end end @@ -110,19 +142,26 @@ test "can reset profile banner", %{user: user, conn: conn} do setup do: oauth_access(["write:accounts"]) test "background image can be set", %{user: user, conn: conn} do - conn = patch(conn, "/api/v1/pleroma/accounts/update_background", %{"img" => @image}) + conn = + conn + |> put_req_header("content-type", "multipart/form-data") + |> patch("/api/v1/pleroma/accounts/update_background", %{"img" => @image}) user = refresh_record(user) assert user.background["type"] == "Image" - assert %{"url" => _} = json_response(conn, 200) + # assert %{"url" => _} = json_response(conn, 200) + assert %{"url" => _} = json_response_and_validate_schema(conn, 200) end test "background image can be reset", %{user: user, conn: conn} do - conn = patch(conn, "/api/v1/pleroma/accounts/update_background", %{"img" => ""}) + conn = + conn + |> put_req_header("content-type", "multipart/form-data") + |> patch("/api/v1/pleroma/accounts/update_background", %{"img" => ""}) user = refresh_record(user) assert user.background == %{} - assert %{"url" => nil} = json_response(conn, 200) + assert %{"url" => nil} = json_response_and_validate_schema(conn, 200) end end @@ -138,12 +177,12 @@ test "returns list of statuses favorited by specified user", %{ user: user } do [activity | _] = insert_pair(:note_activity) - CommonAPI.favorite(activity.id, user) + CommonAPI.favorite(user, activity.id) response = conn |> get("/api/v1/pleroma/accounts/#{user.id}/favourites") - |> json_response(:ok) + |> json_response_and_validate_schema(:ok) [like] = response @@ -151,15 +190,18 @@ test "returns list of statuses favorited by specified user", %{ assert like["id"] == activity.id end - test "does not return favorites for specified user_id when user is not logged in", %{ + test "returns favorites for specified user_id when requester is not logged in", %{ user: user } do activity = insert(:note_activity) - CommonAPI.favorite(activity.id, user) + CommonAPI.favorite(user, activity.id) - build_conn() - |> get("/api/v1/pleroma/accounts/#{user.id}/favourites") - |> json_response(403) + response = + build_conn() + |> get("/api/v1/pleroma/accounts/#{user.id}/favourites") + |> json_response_and_validate_schema(200) + + assert length(response) == 1 end test "returns favorited DM only when user is logged in and he is one of recipients", %{ @@ -168,11 +210,11 @@ test "returns favorited DM only when user is logged in and he is one of recipien } do {:ok, direct} = CommonAPI.post(current_user, %{ - "status" => "Hi @#{user.nickname}!", - "visibility" => "direct" + status: "Hi @#{user.nickname}!", + visibility: "direct" }) - CommonAPI.favorite(direct.id, user) + CommonAPI.favorite(user, direct.id) for u <- [user, current_user] do response = @@ -180,14 +222,17 @@ test "returns favorited DM only when user is logged in and he is one of recipien |> assign(:user, u) |> assign(:token, insert(:oauth_token, user: u, scopes: ["read:favourites"])) |> get("/api/v1/pleroma/accounts/#{user.id}/favourites") - |> json_response(:ok) + |> json_response_and_validate_schema(:ok) assert length(response) == 1 end - build_conn() - |> get("/api/v1/pleroma/accounts/#{user.id}/favourites") - |> json_response(403) + response = + build_conn() + |> get("/api/v1/pleroma/accounts/#{user.id}/favourites") + |> json_response_and_validate_schema(200) + + assert length(response) == 0 end test "does not return others' favorited DM when user is not one of recipients", %{ @@ -198,16 +243,16 @@ test "does not return others' favorited DM when user is not one of recipients", {:ok, direct} = CommonAPI.post(user_two, %{ - "status" => "Hi @#{user.nickname}!", - "visibility" => "direct" + status: "Hi @#{user.nickname}!", + visibility: "direct" }) - CommonAPI.favorite(direct.id, user) + CommonAPI.favorite(user, direct.id) response = conn |> get("/api/v1/pleroma/accounts/#{user.id}/favourites") - |> json_response(:ok) + |> json_response_and_validate_schema(:ok) assert Enum.empty?(response) end @@ -219,7 +264,7 @@ test "paginates favorites using since_id and max_id", %{ activities = insert_list(10, :note_activity) Enum.each(activities, fn activity -> - CommonAPI.favorite(activity.id, user) + CommonAPI.favorite(user, activity.id) end) third_activity = Enum.at(activities, 2) @@ -227,11 +272,12 @@ test "paginates favorites using since_id and max_id", %{ response = conn - |> get("/api/v1/pleroma/accounts/#{user.id}/favourites", %{ - since_id: third_activity.id, - max_id: seventh_activity.id - }) - |> json_response(:ok) + |> get( + "/api/v1/pleroma/accounts/#{user.id}/favourites?since_id=#{third_activity.id}&max_id=#{ + seventh_activity.id + }" + ) + |> json_response_and_validate_schema(:ok) assert length(response) == 3 refute third_activity in response @@ -245,13 +291,13 @@ test "limits favorites using limit parameter", %{ 7 |> insert_list(:note_activity) |> Enum.each(fn activity -> - CommonAPI.favorite(activity.id, user) + CommonAPI.favorite(user, activity.id) end) response = conn - |> get("/api/v1/pleroma/accounts/#{user.id}/favourites", %{limit: "3"}) - |> json_response(:ok) + |> get("/api/v1/pleroma/accounts/#{user.id}/favourites?limit=3") + |> json_response_and_validate_schema(:ok) assert length(response) == 3 end @@ -263,7 +309,7 @@ test "returns empty response when user does not have any favorited statuses", %{ response = conn |> get("/api/v1/pleroma/accounts/#{user.id}/favourites") - |> json_response(:ok) + |> json_response_and_validate_schema(:ok) assert Enum.empty?(response) end @@ -271,28 +317,28 @@ test "returns empty response when user does not have any favorited statuses", %{ test "returns 404 error when specified user is not exist", %{conn: conn} do conn = get(conn, "/api/v1/pleroma/accounts/test/favourites") - assert json_response(conn, 404) == %{"error" => "Record not found"} + assert json_response_and_validate_schema(conn, 404) == %{"error" => "Record not found"} end test "returns 403 error when user has hidden own favorites", %{conn: conn} do user = insert(:user, hide_favorites: true) activity = insert(:note_activity) - CommonAPI.favorite(activity.id, user) + CommonAPI.favorite(user, activity.id) conn = get(conn, "/api/v1/pleroma/accounts/#{user.id}/favourites") - assert json_response(conn, 403) == %{"error" => "Can't get favorites"} + assert json_response_and_validate_schema(conn, 403) == %{"error" => "Can't get favorites"} end test "hides favorites for new users by default", %{conn: conn} do user = insert(:user) activity = insert(:note_activity) - CommonAPI.favorite(activity.id, user) + CommonAPI.favorite(user, activity.id) assert user.hide_favorites conn = get(conn, "/api/v1/pleroma/accounts/#{user.id}/favourites") - assert json_response(conn, 403) == %{"error" => "Can't get favorites"} + assert json_response_and_validate_schema(conn, 403) == %{"error" => "Can't get favorites"} end end @@ -306,11 +352,12 @@ test "subscribing / unsubscribing to a user" do |> assign(:user, user) |> post("/api/v1/pleroma/accounts/#{subscription_target.id}/subscribe") - assert %{"id" => _id, "subscribing" => true} = json_response(ret_conn, 200) + assert %{"id" => _id, "subscribing" => true} = + json_response_and_validate_schema(ret_conn, 200) conn = post(conn, "/api/v1/pleroma/accounts/#{subscription_target.id}/unsubscribe") - assert %{"id" => _id, "subscribing" => false} = json_response(conn, 200) + assert %{"id" => _id, "subscribing" => false} = json_response_and_validate_schema(conn, 200) end end @@ -320,7 +367,7 @@ test "returns 404 when subscription_target not found" do conn = post(conn, "/api/v1/pleroma/accounts/target_id/subscribe") - assert %{"error" => "Record not found"} = json_response(conn, 404) + assert %{"error" => "Record not found"} = json_response_and_validate_schema(conn, 404) end end @@ -330,7 +377,7 @@ test "returns 404 when subscription_target not found" do conn = post(conn, "/api/v1/pleroma/accounts/target_id/unsubscribe") - assert %{"error" => "Record not found"} = json_response(conn, 404) + assert %{"error" => "Record not found"} = json_response_and_validate_schema(conn, 404) end end end diff --git a/test/web/pleroma_api/controllers/conversation_controller_test.exs b/test/web/pleroma_api/controllers/conversation_controller_test.exs new file mode 100644 index 000000000..e6d0b3e37 --- /dev/null +++ b/test/web/pleroma_api/controllers/conversation_controller_test.exs @@ -0,0 +1,136 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.PleromaAPI.ConversationControllerTest do + use Pleroma.Web.ConnCase + + alias Pleroma.Conversation.Participation + alias Pleroma.Repo + alias Pleroma.User + alias Pleroma.Web.CommonAPI + + import Pleroma.Factory + + test "/api/v1/pleroma/conversations/:id" do + user = insert(:user) + %{user: other_user, conn: conn} = oauth_access(["read:statuses"]) + + {:ok, _activity} = + CommonAPI.post(user, %{status: "Hi @#{other_user.nickname}!", visibility: "direct"}) + + [participation] = Participation.for_user(other_user) + + result = + conn + |> get("/api/v1/pleroma/conversations/#{participation.id}") + |> json_response_and_validate_schema(200) + + assert result["id"] == participation.id |> to_string() + end + + test "/api/v1/pleroma/conversations/:id/statuses" do + user = insert(:user) + %{user: other_user, conn: conn} = oauth_access(["read:statuses"]) + third_user = insert(:user) + + {:ok, _activity} = + CommonAPI.post(user, %{status: "Hi @#{third_user.nickname}!", visibility: "direct"}) + + {:ok, activity} = + CommonAPI.post(user, %{status: "Hi @#{other_user.nickname}!", visibility: "direct"}) + + [participation] = Participation.for_user(other_user) + + {:ok, activity_two} = + CommonAPI.post(other_user, %{ + status: "Hi!", + in_reply_to_status_id: activity.id, + in_reply_to_conversation_id: participation.id + }) + + result = + conn + |> get("/api/v1/pleroma/conversations/#{participation.id}/statuses") + |> json_response_and_validate_schema(200) + + assert length(result) == 2 + + id_one = activity.id + id_two = activity_two.id + assert [%{"id" => ^id_one}, %{"id" => ^id_two}] = result + + {:ok, %{id: id_three}} = + CommonAPI.post(other_user, %{ + status: "Bye!", + in_reply_to_status_id: activity.id, + in_reply_to_conversation_id: participation.id + }) + + assert [%{"id" => ^id_two}, %{"id" => ^id_three}] = + conn + |> get("/api/v1/pleroma/conversations/#{participation.id}/statuses?limit=2") + |> json_response_and_validate_schema(:ok) + + assert [%{"id" => ^id_three}] = + conn + |> get("/api/v1/pleroma/conversations/#{participation.id}/statuses?min_id=#{id_two}") + |> json_response_and_validate_schema(:ok) + end + + test "PATCH /api/v1/pleroma/conversations/:id" do + %{user: user, conn: conn} = oauth_access(["write:conversations"]) + other_user = insert(:user) + + {:ok, _activity} = CommonAPI.post(user, %{status: "Hi", visibility: "direct"}) + + [participation] = Participation.for_user(user) + + participation = Repo.preload(participation, :recipients) + + user = User.get_cached_by_id(user.id) + assert [user] == participation.recipients + assert other_user not in participation.recipients + + query = "recipients[]=#{user.id}&recipients[]=#{other_user.id}" + + result = + conn + |> patch("/api/v1/pleroma/conversations/#{participation.id}?#{query}") + |> json_response_and_validate_schema(200) + + assert result["id"] == participation.id |> to_string + + [participation] = Participation.for_user(user) + participation = Repo.preload(participation, :recipients) + + assert user in participation.recipients + assert other_user in participation.recipients + end + + test "POST /api/v1/pleroma/conversations/read" do + user = insert(:user) + %{user: other_user, conn: conn} = oauth_access(["write:conversations"]) + + {:ok, _activity} = + CommonAPI.post(user, %{status: "Hi @#{other_user.nickname}", visibility: "direct"}) + + {:ok, _activity} = + CommonAPI.post(user, %{status: "Hi @#{other_user.nickname}", visibility: "direct"}) + + [participation2, participation1] = Participation.for_user(other_user) + assert Participation.get(participation2.id).read == false + assert Participation.get(participation1.id).read == false + assert User.get_cached_by_id(other_user.id).unread_conversation_count == 2 + + [%{"unread" => false}, %{"unread" => false}] = + conn + |> post("/api/v1/pleroma/conversations/read", %{}) + |> json_response_and_validate_schema(200) + + [participation2, participation1] = Participation.for_user(other_user) + assert Participation.get(participation2.id).read == true + assert Participation.get(participation1.id).read == true + assert User.get_cached_by_id(other_user.id).unread_conversation_count == 0 + end +end diff --git a/test/web/pleroma_api/controllers/emoji_api_controller_test.exs b/test/web/pleroma_api/controllers/emoji_api_controller_test.exs deleted file mode 100644 index 435fb6592..000000000 --- a/test/web/pleroma_api/controllers/emoji_api_controller_test.exs +++ /dev/null @@ -1,463 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.PleromaAPI.EmojiAPIControllerTest do - use Pleroma.Web.ConnCase - - import Tesla.Mock - import Pleroma.Factory - - @emoji_dir_path Path.join( - Pleroma.Config.get!([:instance, :static_dir]), - "emoji" - ) - setup do: clear_config([:auth, :enforce_oauth_admin_scope_usage], false) - - test "shared & non-shared pack information in list_packs is ok" do - conn = build_conn() - resp = conn |> get(emoji_api_path(conn, :list_packs)) |> json_response(200) - - assert Map.has_key?(resp, "test_pack") - - pack = resp["test_pack"] - - assert Map.has_key?(pack["pack"], "download-sha256") - assert pack["pack"]["can-download"] - - assert pack["files"] == %{"blank" => "blank.png"} - - # Non-shared pack - - assert Map.has_key?(resp, "test_pack_nonshared") - - pack = resp["test_pack_nonshared"] - - refute pack["pack"]["shared"] - refute pack["pack"]["can-download"] - end - - test "listing remote packs" do - admin = insert(:user, is_admin: true) - %{conn: conn} = oauth_access(["admin:write"], user: admin) - - resp = - build_conn() - |> get(emoji_api_path(conn, :list_packs)) - |> json_response(200) - - mock(fn - %{method: :get, url: "https://example.com/.well-known/nodeinfo"} -> - json(%{links: [%{href: "https://example.com/nodeinfo/2.1.json"}]}) - - %{method: :get, url: "https://example.com/nodeinfo/2.1.json"} -> - json(%{metadata: %{features: ["shareable_emoji_packs"]}}) - - %{method: :get, url: "https://example.com/api/pleroma/emoji/packs"} -> - json(resp) - end) - - assert conn - |> post(emoji_api_path(conn, :list_from), %{instance_address: "https://example.com"}) - |> json_response(200) == resp - end - - test "downloading a shared pack from download_shared" do - conn = build_conn() - - resp = - conn - |> get(emoji_api_path(conn, :download_shared, "test_pack")) - |> response(200) - - {:ok, arch} = :zip.unzip(resp, [:memory]) - - assert Enum.find(arch, fn {n, _} -> n == 'pack.json' end) - assert Enum.find(arch, fn {n, _} -> n == 'blank.png' end) - end - - test "downloading shared & unshared packs from another instance via download_from, deleting them" do - on_exit(fn -> - File.rm_rf!("#{@emoji_dir_path}/test_pack2") - File.rm_rf!("#{@emoji_dir_path}/test_pack_nonshared2") - end) - - mock(fn - %{method: :get, url: "https://old-instance/.well-known/nodeinfo"} -> - json(%{links: [%{href: "https://old-instance/nodeinfo/2.1.json"}]}) - - %{method: :get, url: "https://old-instance/nodeinfo/2.1.json"} -> - json(%{metadata: %{features: []}}) - - %{method: :get, url: "https://example.com/.well-known/nodeinfo"} -> - json(%{links: [%{href: "https://example.com/nodeinfo/2.1.json"}]}) - - %{method: :get, url: "https://example.com/nodeinfo/2.1.json"} -> - json(%{metadata: %{features: ["shareable_emoji_packs"]}}) - - %{ - method: :get, - url: "https://example.com/api/pleroma/emoji/packs/list" - } -> - conn = build_conn() - - conn - |> get(emoji_api_path(conn, :list_packs)) - |> json_response(200) - |> json() - - %{ - method: :get, - url: "https://example.com/api/pleroma/emoji/packs/download_shared/test_pack" - } -> - conn = build_conn() - - conn - |> get(emoji_api_path(conn, :download_shared, "test_pack")) - |> response(200) - |> text() - - %{ - method: :get, - url: "https://nonshared-pack" - } -> - text(File.read!("#{@emoji_dir_path}/test_pack_nonshared/nonshared.zip")) - end) - - admin = insert(:user, is_admin: true) - - conn = - build_conn() - |> assign(:user, admin) - |> assign(:token, insert(:oauth_admin_token, user: admin, scopes: ["admin:write"])) - - assert (conn - |> put_req_header("content-type", "application/json") - |> post( - emoji_api_path( - conn, - :download_from - ), - %{ - instance_address: "https://old-instance", - pack_name: "test_pack", - as: "test_pack2" - } - |> Jason.encode!() - ) - |> json_response(500))["error"] =~ "does not support" - - assert conn - |> put_req_header("content-type", "application/json") - |> post( - emoji_api_path( - conn, - :download_from - ), - %{ - instance_address: "https://example.com", - pack_name: "test_pack", - as: "test_pack2" - } - |> Jason.encode!() - ) - |> json_response(200) == "ok" - - assert File.exists?("#{@emoji_dir_path}/test_pack2/pack.json") - assert File.exists?("#{@emoji_dir_path}/test_pack2/blank.png") - - assert conn - |> delete(emoji_api_path(conn, :delete, "test_pack2")) - |> json_response(200) == "ok" - - refute File.exists?("#{@emoji_dir_path}/test_pack2") - - # non-shared, downloaded from the fallback URL - - assert conn - |> put_req_header("content-type", "application/json") - |> post( - emoji_api_path( - conn, - :download_from - ), - %{ - instance_address: "https://example.com", - pack_name: "test_pack_nonshared", - as: "test_pack_nonshared2" - } - |> Jason.encode!() - ) - |> json_response(200) == "ok" - - assert File.exists?("#{@emoji_dir_path}/test_pack_nonshared2/pack.json") - assert File.exists?("#{@emoji_dir_path}/test_pack_nonshared2/blank.png") - - assert conn - |> delete(emoji_api_path(conn, :delete, "test_pack_nonshared2")) - |> json_response(200) == "ok" - - refute File.exists?("#{@emoji_dir_path}/test_pack_nonshared2") - end - - describe "updating pack metadata" do - setup do - pack_file = "#{@emoji_dir_path}/test_pack/pack.json" - original_content = File.read!(pack_file) - - on_exit(fn -> - File.write!(pack_file, original_content) - end) - - admin = insert(:user, is_admin: true) - %{conn: conn} = oauth_access(["admin:write"], user: admin) - - {:ok, - admin: admin, - conn: conn, - pack_file: pack_file, - new_data: %{ - "license" => "Test license changed", - "homepage" => "https://pleroma.social", - "description" => "Test description", - "share-files" => false - }} - end - - test "for a pack without a fallback source", ctx do - conn = ctx[:conn] - - assert conn - |> post( - emoji_api_path(conn, :update_metadata, "test_pack"), - %{ - "new_data" => ctx[:new_data] - } - ) - |> json_response(200) == ctx[:new_data] - - assert Jason.decode!(File.read!(ctx[:pack_file]))["pack"] == ctx[:new_data] - end - - test "for a pack with a fallback source", ctx do - mock(fn - %{ - method: :get, - url: "https://nonshared-pack" - } -> - text(File.read!("#{@emoji_dir_path}/test_pack_nonshared/nonshared.zip")) - end) - - new_data = Map.put(ctx[:new_data], "fallback-src", "https://nonshared-pack") - - new_data_with_sha = - Map.put( - new_data, - "fallback-src-sha256", - "74409E2674DAA06C072729C6C8426C4CB3B7E0B85ED77792DB7A436E11D76DAF" - ) - - conn = ctx[:conn] - - assert conn - |> post( - emoji_api_path(conn, :update_metadata, "test_pack"), - %{ - "new_data" => new_data - } - ) - |> json_response(200) == new_data_with_sha - - assert Jason.decode!(File.read!(ctx[:pack_file]))["pack"] == new_data_with_sha - end - - test "when the fallback source doesn't have all the files", ctx do - mock(fn - %{ - method: :get, - url: "https://nonshared-pack" - } -> - {:ok, {'empty.zip', empty_arch}} = :zip.zip('empty.zip', [], [:memory]) - text(empty_arch) - end) - - new_data = Map.put(ctx[:new_data], "fallback-src", "https://nonshared-pack") - - conn = ctx[:conn] - - assert (conn - |> post( - emoji_api_path(conn, :update_metadata, "test_pack"), - %{ - "new_data" => new_data - } - ) - |> json_response(:bad_request))["error"] =~ "does not have all" - end - end - - test "updating pack files" do - pack_file = "#{@emoji_dir_path}/test_pack/pack.json" - original_content = File.read!(pack_file) - - on_exit(fn -> - File.write!(pack_file, original_content) - - File.rm_rf!("#{@emoji_dir_path}/test_pack/blank_url.png") - File.rm_rf!("#{@emoji_dir_path}/test_pack/dir") - File.rm_rf!("#{@emoji_dir_path}/test_pack/dir_2") - end) - - admin = insert(:user, is_admin: true) - %{conn: conn} = oauth_access(["admin:write"], user: admin) - - same_name = %{ - "action" => "add", - "shortcode" => "blank", - "filename" => "dir/blank.png", - "file" => %Plug.Upload{ - filename: "blank.png", - path: "#{@emoji_dir_path}/test_pack/blank.png" - } - } - - different_name = %{same_name | "shortcode" => "blank_2"} - - assert (conn - |> post(emoji_api_path(conn, :update_file, "test_pack"), same_name) - |> json_response(:conflict))["error"] =~ "already exists" - - assert conn - |> post(emoji_api_path(conn, :update_file, "test_pack"), different_name) - |> json_response(200) == %{"blank" => "blank.png", "blank_2" => "dir/blank.png"} - - assert File.exists?("#{@emoji_dir_path}/test_pack/dir/blank.png") - - assert conn - |> post(emoji_api_path(conn, :update_file, "test_pack"), %{ - "action" => "update", - "shortcode" => "blank_2", - "new_shortcode" => "blank_3", - "new_filename" => "dir_2/blank_3.png" - }) - |> json_response(200) == %{"blank" => "blank.png", "blank_3" => "dir_2/blank_3.png"} - - refute File.exists?("#{@emoji_dir_path}/test_pack/dir/") - assert File.exists?("#{@emoji_dir_path}/test_pack/dir_2/blank_3.png") - - assert conn - |> post(emoji_api_path(conn, :update_file, "test_pack"), %{ - "action" => "remove", - "shortcode" => "blank_3" - }) - |> json_response(200) == %{"blank" => "blank.png"} - - refute File.exists?("#{@emoji_dir_path}/test_pack/dir_2/") - - mock(fn - %{ - method: :get, - url: "https://test-blank/blank_url.png" - } -> - text(File.read!("#{@emoji_dir_path}/test_pack/blank.png")) - end) - - # The name should be inferred from the URL ending - from_url = %{ - "action" => "add", - "shortcode" => "blank_url", - "file" => "https://test-blank/blank_url.png" - } - - assert conn - |> post(emoji_api_path(conn, :update_file, "test_pack"), from_url) - |> json_response(200) == %{ - "blank" => "blank.png", - "blank_url" => "blank_url.png" - } - - assert File.exists?("#{@emoji_dir_path}/test_pack/blank_url.png") - - assert conn - |> post(emoji_api_path(conn, :update_file, "test_pack"), %{ - "action" => "remove", - "shortcode" => "blank_url" - }) - |> json_response(200) == %{"blank" => "blank.png"} - - refute File.exists?("#{@emoji_dir_path}/test_pack/blank_url.png") - end - - test "creating and deleting a pack" do - on_exit(fn -> - File.rm_rf!("#{@emoji_dir_path}/test_created") - end) - - admin = insert(:user, is_admin: true) - %{conn: conn} = oauth_access(["admin:write"], user: admin) - - assert conn - |> put_req_header("content-type", "application/json") - |> put( - emoji_api_path( - conn, - :create, - "test_created" - ) - ) - |> json_response(200) == "ok" - - assert File.exists?("#{@emoji_dir_path}/test_created/pack.json") - - assert Jason.decode!(File.read!("#{@emoji_dir_path}/test_created/pack.json")) == %{ - "pack" => %{}, - "files" => %{} - } - - assert conn - |> delete(emoji_api_path(conn, :delete, "test_created")) - |> json_response(200) == "ok" - - refute File.exists?("#{@emoji_dir_path}/test_created/pack.json") - end - - test "filesystem import" do - on_exit(fn -> - File.rm!("#{@emoji_dir_path}/test_pack_for_import/emoji.txt") - File.rm!("#{@emoji_dir_path}/test_pack_for_import/pack.json") - end) - - conn = build_conn() - resp = conn |> get(emoji_api_path(conn, :list_packs)) |> json_response(200) - - refute Map.has_key?(resp, "test_pack_for_import") - - admin = insert(:user, is_admin: true) - %{conn: conn} = oauth_access(["admin:write"], user: admin) - - assert conn - |> post(emoji_api_path(conn, :import_from_fs)) - |> json_response(200) == ["test_pack_for_import"] - - resp = conn |> get(emoji_api_path(conn, :list_packs)) |> json_response(200) - assert resp["test_pack_for_import"]["files"] == %{"blank" => "blank.png"} - - File.rm!("#{@emoji_dir_path}/test_pack_for_import/pack.json") - refute File.exists?("#{@emoji_dir_path}/test_pack_for_import/pack.json") - - emoji_txt_content = "blank, blank.png, Fun\n\nblank2, blank.png" - - File.write!("#{@emoji_dir_path}/test_pack_for_import/emoji.txt", emoji_txt_content) - - assert conn - |> post(emoji_api_path(conn, :import_from_fs)) - |> json_response(200) == ["test_pack_for_import"] - - resp = build_conn() |> get(emoji_api_path(conn, :list_packs)) |> json_response(200) - - assert resp["test_pack_for_import"]["files"] == %{ - "blank" => "blank.png", - "blank2" => "blank.png" - } - end -end diff --git a/test/web/pleroma_api/controllers/emoji_pack_controller_test.exs b/test/web/pleroma_api/controllers/emoji_pack_controller_test.exs new file mode 100644 index 000000000..ee3d281a0 --- /dev/null +++ b/test/web/pleroma_api/controllers/emoji_pack_controller_test.exs @@ -0,0 +1,780 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do + use Pleroma.Web.ConnCase + + import Tesla.Mock + import Pleroma.Factory + + @emoji_path Path.join( + Pleroma.Config.get!([:instance, :static_dir]), + "emoji" + ) + setup do: clear_config([:auth, :enforce_oauth_admin_scope_usage], false) + + setup do + admin = insert(:user, is_admin: true) + token = insert(:oauth_admin_token, user: admin) + + admin_conn = + build_conn() + |> assign(:user, admin) + |> assign(:token, token) + + Pleroma.Emoji.reload() + {:ok, %{admin_conn: admin_conn}} + end + + test "GET /api/pleroma/emoji/packs", %{conn: conn} do + resp = conn |> get("/api/pleroma/emoji/packs") |> json_response_and_validate_schema(200) + + shared = resp["test_pack"] + assert shared["files"] == %{"blank" => "blank.png"} + assert Map.has_key?(shared["pack"], "download-sha256") + assert shared["pack"]["can-download"] + assert shared["pack"]["share-files"] + + non_shared = resp["test_pack_nonshared"] + assert non_shared["pack"]["share-files"] == false + assert non_shared["pack"]["can-download"] == false + end + + describe "GET /api/pleroma/emoji/packs/remote" do + test "shareable instance", %{admin_conn: admin_conn, conn: conn} do + resp = + conn + |> get("/api/pleroma/emoji/packs") + |> json_response_and_validate_schema(200) + + mock(fn + %{method: :get, url: "https://example.com/.well-known/nodeinfo"} -> + json(%{links: [%{href: "https://example.com/nodeinfo/2.1.json"}]}) + + %{method: :get, url: "https://example.com/nodeinfo/2.1.json"} -> + json(%{metadata: %{features: ["shareable_emoji_packs"]}}) + + %{method: :get, url: "https://example.com/api/pleroma/emoji/packs"} -> + json(resp) + end) + + assert admin_conn + |> get("/api/pleroma/emoji/packs/remote?url=https://example.com") + |> json_response_and_validate_schema(200) == resp + end + + test "non shareable instance", %{admin_conn: admin_conn} do + mock(fn + %{method: :get, url: "https://example.com/.well-known/nodeinfo"} -> + json(%{links: [%{href: "https://example.com/nodeinfo/2.1.json"}]}) + + %{method: :get, url: "https://example.com/nodeinfo/2.1.json"} -> + json(%{metadata: %{features: []}}) + end) + + assert admin_conn + |> get("/api/pleroma/emoji/packs/remote?url=https://example.com") + |> json_response_and_validate_schema(500) == %{ + "error" => "The requested instance does not support sharing emoji packs" + } + end + end + + describe "GET /api/pleroma/emoji/packs/:name/archive" do + test "download shared pack", %{conn: conn} do + resp = + conn + |> get("/api/pleroma/emoji/packs/test_pack/archive") + |> response(200) + + {:ok, arch} = :zip.unzip(resp, [:memory]) + + assert Enum.find(arch, fn {n, _} -> n == 'pack.json' end) + assert Enum.find(arch, fn {n, _} -> n == 'blank.png' end) + end + + test "non existing pack", %{conn: conn} do + assert conn + |> get("/api/pleroma/emoji/packs/test_pack_for_import/archive") + |> json_response_and_validate_schema(:not_found) == %{ + "error" => "Pack test_pack_for_import does not exist" + } + end + + test "non downloadable pack", %{conn: conn} do + assert conn + |> get("/api/pleroma/emoji/packs/test_pack_nonshared/archive") + |> json_response_and_validate_schema(:forbidden) == %{ + "error" => + "Pack test_pack_nonshared cannot be downloaded from this instance, either pack sharing was disabled for this pack or some files are missing" + } + end + end + + describe "POST /api/pleroma/emoji/packs/download" do + test "shared pack from remote and non shared from fallback-src", %{ + admin_conn: admin_conn, + conn: conn + } do + mock(fn + %{method: :get, url: "https://example.com/.well-known/nodeinfo"} -> + json(%{links: [%{href: "https://example.com/nodeinfo/2.1.json"}]}) + + %{method: :get, url: "https://example.com/nodeinfo/2.1.json"} -> + json(%{metadata: %{features: ["shareable_emoji_packs"]}}) + + %{ + method: :get, + url: "https://example.com/api/pleroma/emoji/packs/test_pack" + } -> + conn + |> get("/api/pleroma/emoji/packs/test_pack") + |> json_response_and_validate_schema(200) + |> json() + + %{ + method: :get, + url: "https://example.com/api/pleroma/emoji/packs/test_pack/archive" + } -> + conn + |> get("/api/pleroma/emoji/packs/test_pack/archive") + |> response(200) + |> text() + + %{ + method: :get, + url: "https://example.com/api/pleroma/emoji/packs/test_pack_nonshared" + } -> + conn + |> get("/api/pleroma/emoji/packs/test_pack_nonshared") + |> json_response_and_validate_schema(200) + |> json() + + %{ + method: :get, + url: "https://nonshared-pack" + } -> + text(File.read!("#{@emoji_path}/test_pack_nonshared/nonshared.zip")) + end) + + assert admin_conn + |> put_req_header("content-type", "multipart/form-data") + |> post("/api/pleroma/emoji/packs/download", %{ + url: "https://example.com", + name: "test_pack", + as: "test_pack2" + }) + |> json_response_and_validate_schema(200) == "ok" + + assert File.exists?("#{@emoji_path}/test_pack2/pack.json") + assert File.exists?("#{@emoji_path}/test_pack2/blank.png") + + assert admin_conn + |> delete("/api/pleroma/emoji/packs/test_pack2") + |> json_response_and_validate_schema(200) == "ok" + + refute File.exists?("#{@emoji_path}/test_pack2") + + assert admin_conn + |> put_req_header("content-type", "multipart/form-data") + |> post( + "/api/pleroma/emoji/packs/download", + %{ + url: "https://example.com", + name: "test_pack_nonshared", + as: "test_pack_nonshared2" + } + ) + |> json_response_and_validate_schema(200) == "ok" + + assert File.exists?("#{@emoji_path}/test_pack_nonshared2/pack.json") + assert File.exists?("#{@emoji_path}/test_pack_nonshared2/blank.png") + + assert admin_conn + |> delete("/api/pleroma/emoji/packs/test_pack_nonshared2") + |> json_response_and_validate_schema(200) == "ok" + + refute File.exists?("#{@emoji_path}/test_pack_nonshared2") + end + + test "nonshareable instance", %{admin_conn: admin_conn} do + mock(fn + %{method: :get, url: "https://old-instance/.well-known/nodeinfo"} -> + json(%{links: [%{href: "https://old-instance/nodeinfo/2.1.json"}]}) + + %{method: :get, url: "https://old-instance/nodeinfo/2.1.json"} -> + json(%{metadata: %{features: []}}) + end) + + assert admin_conn + |> put_req_header("content-type", "multipart/form-data") + |> post( + "/api/pleroma/emoji/packs/download", + %{ + url: "https://old-instance", + name: "test_pack", + as: "test_pack2" + } + ) + |> json_response_and_validate_schema(500) == %{ + "error" => "The requested instance does not support sharing emoji packs" + } + end + + test "checksum fail", %{admin_conn: admin_conn} do + mock(fn + %{method: :get, url: "https://example.com/.well-known/nodeinfo"} -> + json(%{links: [%{href: "https://example.com/nodeinfo/2.1.json"}]}) + + %{method: :get, url: "https://example.com/nodeinfo/2.1.json"} -> + json(%{metadata: %{features: ["shareable_emoji_packs"]}}) + + %{ + method: :get, + url: "https://example.com/api/pleroma/emoji/packs/pack_bad_sha" + } -> + {:ok, pack} = Pleroma.Emoji.Pack.load_pack("pack_bad_sha") + %Tesla.Env{status: 200, body: Jason.encode!(pack)} + + %{ + method: :get, + url: "https://example.com/api/pleroma/emoji/packs/pack_bad_sha/archive" + } -> + %Tesla.Env{ + status: 200, + body: File.read!("test/instance_static/emoji/pack_bad_sha/pack_bad_sha.zip") + } + end) + + assert admin_conn + |> put_req_header("content-type", "multipart/form-data") + |> post("/api/pleroma/emoji/packs/download", %{ + url: "https://example.com", + name: "pack_bad_sha", + as: "pack_bad_sha2" + }) + |> json_response_and_validate_schema(:internal_server_error) == %{ + "error" => "SHA256 for the pack doesn't match the one sent by the server" + } + end + + test "other error", %{admin_conn: admin_conn} do + mock(fn + %{method: :get, url: "https://example.com/.well-known/nodeinfo"} -> + json(%{links: [%{href: "https://example.com/nodeinfo/2.1.json"}]}) + + %{method: :get, url: "https://example.com/nodeinfo/2.1.json"} -> + json(%{metadata: %{features: ["shareable_emoji_packs"]}}) + + %{ + method: :get, + url: "https://example.com/api/pleroma/emoji/packs/test_pack" + } -> + {:ok, pack} = Pleroma.Emoji.Pack.load_pack("test_pack") + %Tesla.Env{status: 200, body: Jason.encode!(pack)} + end) + + assert admin_conn + |> put_req_header("content-type", "multipart/form-data") + |> post("/api/pleroma/emoji/packs/download", %{ + url: "https://example.com", + name: "test_pack", + as: "test_pack2" + }) + |> json_response_and_validate_schema(:internal_server_error) == %{ + "error" => + "The pack was not set as shared and there is no fallback src to download from" + } + end + end + + describe "PATCH /api/pleroma/emoji/packs/:name" do + setup do + pack_file = "#{@emoji_path}/test_pack/pack.json" + original_content = File.read!(pack_file) + + on_exit(fn -> + File.write!(pack_file, original_content) + end) + + {:ok, + pack_file: pack_file, + new_data: %{ + "license" => "Test license changed", + "homepage" => "https://pleroma.social", + "description" => "Test description", + "share-files" => false + }} + end + + test "for a pack without a fallback source", ctx do + assert ctx[:admin_conn] + |> put_req_header("content-type", "multipart/form-data") + |> patch("/api/pleroma/emoji/packs/test_pack", %{"metadata" => ctx[:new_data]}) + |> json_response_and_validate_schema(200) == ctx[:new_data] + + assert Jason.decode!(File.read!(ctx[:pack_file]))["pack"] == ctx[:new_data] + end + + test "for a pack with a fallback source", ctx do + mock(fn + %{ + method: :get, + url: "https://nonshared-pack" + } -> + text(File.read!("#{@emoji_path}/test_pack_nonshared/nonshared.zip")) + end) + + new_data = Map.put(ctx[:new_data], "fallback-src", "https://nonshared-pack") + + new_data_with_sha = + Map.put( + new_data, + "fallback-src-sha256", + "74409E2674DAA06C072729C6C8426C4CB3B7E0B85ED77792DB7A436E11D76DAF" + ) + + assert ctx[:admin_conn] + |> put_req_header("content-type", "multipart/form-data") + |> patch("/api/pleroma/emoji/packs/test_pack", %{metadata: new_data}) + |> json_response_and_validate_schema(200) == new_data_with_sha + + assert Jason.decode!(File.read!(ctx[:pack_file]))["pack"] == new_data_with_sha + end + + test "when the fallback source doesn't have all the files", ctx do + mock(fn + %{ + method: :get, + url: "https://nonshared-pack" + } -> + {:ok, {'empty.zip', empty_arch}} = :zip.zip('empty.zip', [], [:memory]) + text(empty_arch) + end) + + new_data = Map.put(ctx[:new_data], "fallback-src", "https://nonshared-pack") + + assert ctx[:admin_conn] + |> put_req_header("content-type", "multipart/form-data") + |> patch("/api/pleroma/emoji/packs/test_pack", %{metadata: new_data}) + |> json_response_and_validate_schema(:bad_request) == %{ + "error" => "The fallback archive does not have all files specified in pack.json" + } + end + end + + describe "POST/PATCH/DELETE /api/pleroma/emoji/packs/:name/files" do + setup do + pack_file = "#{@emoji_path}/test_pack/pack.json" + original_content = File.read!(pack_file) + + on_exit(fn -> + File.write!(pack_file, original_content) + end) + + :ok + end + + test "create shortcode exists", %{admin_conn: admin_conn} do + assert admin_conn + |> put_req_header("content-type", "multipart/form-data") + |> post("/api/pleroma/emoji/packs/test_pack/files", %{ + shortcode: "blank", + filename: "dir/blank.png", + file: %Plug.Upload{ + filename: "blank.png", + path: "#{@emoji_path}/test_pack/blank.png" + } + }) + |> json_response_and_validate_schema(:conflict) == %{ + "error" => "An emoji with the \"blank\" shortcode already exists" + } + end + + test "don't rewrite old emoji", %{admin_conn: admin_conn} do + on_exit(fn -> File.rm_rf!("#{@emoji_path}/test_pack/dir/") end) + + assert admin_conn + |> put_req_header("content-type", "multipart/form-data") + |> post("/api/pleroma/emoji/packs/test_pack/files", %{ + shortcode: "blank2", + filename: "dir/blank.png", + file: %Plug.Upload{ + filename: "blank.png", + path: "#{@emoji_path}/test_pack/blank.png" + } + }) + |> json_response_and_validate_schema(200) == %{ + "blank" => "blank.png", + "blank2" => "dir/blank.png" + } + + assert File.exists?("#{@emoji_path}/test_pack/dir/blank.png") + + assert admin_conn + |> put_req_header("content-type", "multipart/form-data") + |> patch("/api/pleroma/emoji/packs/test_pack/files", %{ + shortcode: "blank", + new_shortcode: "blank2", + new_filename: "dir_2/blank_3.png" + }) + |> json_response_and_validate_schema(:conflict) == %{ + "error" => + "New shortcode \"blank2\" is already used. If you want to override emoji use 'force' option" + } + end + + test "rewrite old emoji with force option", %{admin_conn: admin_conn} do + on_exit(fn -> File.rm_rf!("#{@emoji_path}/test_pack/dir_2/") end) + + assert admin_conn + |> put_req_header("content-type", "multipart/form-data") + |> post("/api/pleroma/emoji/packs/test_pack/files", %{ + shortcode: "blank2", + filename: "dir/blank.png", + file: %Plug.Upload{ + filename: "blank.png", + path: "#{@emoji_path}/test_pack/blank.png" + } + }) + |> json_response_and_validate_schema(200) == %{ + "blank" => "blank.png", + "blank2" => "dir/blank.png" + } + + assert File.exists?("#{@emoji_path}/test_pack/dir/blank.png") + + assert admin_conn + |> put_req_header("content-type", "multipart/form-data") + |> patch("/api/pleroma/emoji/packs/test_pack/files", %{ + shortcode: "blank2", + new_shortcode: "blank3", + new_filename: "dir_2/blank_3.png", + force: true + }) + |> json_response_and_validate_schema(200) == %{ + "blank" => "blank.png", + "blank3" => "dir_2/blank_3.png" + } + + assert File.exists?("#{@emoji_path}/test_pack/dir_2/blank_3.png") + end + + test "with empty filename", %{admin_conn: admin_conn} do + assert admin_conn + |> put_req_header("content-type", "multipart/form-data") + |> post("/api/pleroma/emoji/packs/test_pack/files", %{ + shortcode: "blank2", + filename: "", + file: %Plug.Upload{ + filename: "blank.png", + path: "#{@emoji_path}/test_pack/blank.png" + } + }) + |> json_response_and_validate_schema(:bad_request) == %{ + "error" => "pack name, shortcode or filename cannot be empty" + } + end + + test "add file with not loaded pack", %{admin_conn: admin_conn} do + assert admin_conn + |> put_req_header("content-type", "multipart/form-data") + |> post("/api/pleroma/emoji/packs/not_loaded/files", %{ + shortcode: "blank2", + filename: "dir/blank.png", + file: %Plug.Upload{ + filename: "blank.png", + path: "#{@emoji_path}/test_pack/blank.png" + } + }) + |> json_response_and_validate_schema(:bad_request) == %{ + "error" => "pack \"not_loaded\" is not found" + } + end + + test "remove file with not loaded pack", %{admin_conn: admin_conn} do + assert admin_conn + |> delete("/api/pleroma/emoji/packs/not_loaded/files?shortcode=blank3") + |> json_response_and_validate_schema(:bad_request) == %{ + "error" => "pack \"not_loaded\" is not found" + } + end + + test "remove file with empty shortcode", %{admin_conn: admin_conn} do + assert admin_conn + |> delete("/api/pleroma/emoji/packs/not_loaded/files?shortcode=") + |> json_response_and_validate_schema(:bad_request) == %{ + "error" => "pack name or shortcode cannot be empty" + } + end + + test "update file with not loaded pack", %{admin_conn: admin_conn} do + assert admin_conn + |> put_req_header("content-type", "multipart/form-data") + |> patch("/api/pleroma/emoji/packs/not_loaded/files", %{ + shortcode: "blank4", + new_shortcode: "blank3", + new_filename: "dir_2/blank_3.png" + }) + |> json_response_and_validate_schema(:bad_request) == %{ + "error" => "pack \"not_loaded\" is not found" + } + end + + test "new with shortcode as file with update", %{admin_conn: admin_conn} do + assert admin_conn + |> put_req_header("content-type", "multipart/form-data") + |> post("/api/pleroma/emoji/packs/test_pack/files", %{ + shortcode: "blank4", + filename: "dir/blank.png", + file: %Plug.Upload{ + filename: "blank.png", + path: "#{@emoji_path}/test_pack/blank.png" + } + }) + |> json_response_and_validate_schema(200) == %{ + "blank" => "blank.png", + "blank4" => "dir/blank.png" + } + + assert File.exists?("#{@emoji_path}/test_pack/dir/blank.png") + + assert admin_conn + |> put_req_header("content-type", "multipart/form-data") + |> patch("/api/pleroma/emoji/packs/test_pack/files", %{ + shortcode: "blank4", + new_shortcode: "blank3", + new_filename: "dir_2/blank_3.png" + }) + |> json_response_and_validate_schema(200) == %{ + "blank3" => "dir_2/blank_3.png", + "blank" => "blank.png" + } + + refute File.exists?("#{@emoji_path}/test_pack/dir/") + assert File.exists?("#{@emoji_path}/test_pack/dir_2/blank_3.png") + + assert admin_conn + |> delete("/api/pleroma/emoji/packs/test_pack/files?shortcode=blank3") + |> json_response_and_validate_schema(200) == %{"blank" => "blank.png"} + + refute File.exists?("#{@emoji_path}/test_pack/dir_2/") + + on_exit(fn -> File.rm_rf!("#{@emoji_path}/test_pack/dir") end) + end + + test "new with shortcode from url", %{admin_conn: admin_conn} do + mock(fn + %{ + method: :get, + url: "https://test-blank/blank_url.png" + } -> + text(File.read!("#{@emoji_path}/test_pack/blank.png")) + end) + + assert admin_conn + |> put_req_header("content-type", "multipart/form-data") + |> post("/api/pleroma/emoji/packs/test_pack/files", %{ + shortcode: "blank_url", + file: "https://test-blank/blank_url.png" + }) + |> json_response_and_validate_schema(200) == %{ + "blank_url" => "blank_url.png", + "blank" => "blank.png" + } + + assert File.exists?("#{@emoji_path}/test_pack/blank_url.png") + + on_exit(fn -> File.rm_rf!("#{@emoji_path}/test_pack/blank_url.png") end) + end + + test "new without shortcode", %{admin_conn: admin_conn} do + on_exit(fn -> File.rm_rf!("#{@emoji_path}/test_pack/shortcode.png") end) + + assert admin_conn + |> put_req_header("content-type", "multipart/form-data") + |> post("/api/pleroma/emoji/packs/test_pack/files", %{ + file: %Plug.Upload{ + filename: "shortcode.png", + path: "#{Pleroma.Config.get([:instance, :static_dir])}/add/shortcode.png" + } + }) + |> json_response_and_validate_schema(200) == %{ + "shortcode" => "shortcode.png", + "blank" => "blank.png" + } + end + + test "remove non existing shortcode in pack.json", %{admin_conn: admin_conn} do + assert admin_conn + |> delete("/api/pleroma/emoji/packs/test_pack/files?shortcode=blank2") + |> json_response_and_validate_schema(:bad_request) == %{ + "error" => "Emoji \"blank2\" does not exist" + } + end + + test "update non existing emoji", %{admin_conn: admin_conn} do + assert admin_conn + |> put_req_header("content-type", "multipart/form-data") + |> patch("/api/pleroma/emoji/packs/test_pack/files", %{ + shortcode: "blank2", + new_shortcode: "blank3", + new_filename: "dir_2/blank_3.png" + }) + |> json_response_and_validate_schema(:bad_request) == %{ + "error" => "Emoji \"blank2\" does not exist" + } + end + + test "update with empty shortcode", %{admin_conn: admin_conn} do + assert %{ + "error" => "Missing field: new_shortcode." + } = + admin_conn + |> put_req_header("content-type", "multipart/form-data") + |> patch("/api/pleroma/emoji/packs/test_pack/files", %{ + shortcode: "blank", + new_filename: "dir_2/blank_3.png" + }) + |> json_response_and_validate_schema(:bad_request) + end + end + + describe "POST/DELETE /api/pleroma/emoji/packs/:name" do + test "creating and deleting a pack", %{admin_conn: admin_conn} do + assert admin_conn + |> post("/api/pleroma/emoji/packs/test_created") + |> json_response_and_validate_schema(200) == "ok" + + assert File.exists?("#{@emoji_path}/test_created/pack.json") + + assert Jason.decode!(File.read!("#{@emoji_path}/test_created/pack.json")) == %{ + "pack" => %{}, + "files" => %{} + } + + assert admin_conn + |> delete("/api/pleroma/emoji/packs/test_created") + |> json_response_and_validate_schema(200) == "ok" + + refute File.exists?("#{@emoji_path}/test_created/pack.json") + end + + test "if pack exists", %{admin_conn: admin_conn} do + path = Path.join(@emoji_path, "test_created") + File.mkdir(path) + pack_file = Jason.encode!(%{files: %{}, pack: %{}}) + File.write!(Path.join(path, "pack.json"), pack_file) + + assert admin_conn + |> post("/api/pleroma/emoji/packs/test_created") + |> json_response_and_validate_schema(:conflict) == %{ + "error" => "A pack named \"test_created\" already exists" + } + + on_exit(fn -> File.rm_rf(path) end) + end + + test "with empty name", %{admin_conn: admin_conn} do + assert admin_conn + |> post("/api/pleroma/emoji/packs/ ") + |> json_response_and_validate_schema(:bad_request) == %{ + "error" => "pack name cannot be empty" + } + end + end + + test "deleting nonexisting pack", %{admin_conn: admin_conn} do + assert admin_conn + |> delete("/api/pleroma/emoji/packs/non_existing") + |> json_response_and_validate_schema(:not_found) == %{ + "error" => "Pack non_existing does not exist" + } + end + + test "deleting with empty name", %{admin_conn: admin_conn} do + assert admin_conn + |> delete("/api/pleroma/emoji/packs/ ") + |> json_response_and_validate_schema(:bad_request) == %{ + "error" => "pack name cannot be empty" + } + end + + test "filesystem import", %{admin_conn: admin_conn, conn: conn} do + on_exit(fn -> + File.rm!("#{@emoji_path}/test_pack_for_import/emoji.txt") + File.rm!("#{@emoji_path}/test_pack_for_import/pack.json") + end) + + resp = conn |> get("/api/pleroma/emoji/packs") |> json_response_and_validate_schema(200) + + refute Map.has_key?(resp, "test_pack_for_import") + + assert admin_conn + |> get("/api/pleroma/emoji/packs/import") + |> json_response_and_validate_schema(200) == ["test_pack_for_import"] + + resp = conn |> get("/api/pleroma/emoji/packs") |> json_response_and_validate_schema(200) + assert resp["test_pack_for_import"]["files"] == %{"blank" => "blank.png"} + + File.rm!("#{@emoji_path}/test_pack_for_import/pack.json") + refute File.exists?("#{@emoji_path}/test_pack_for_import/pack.json") + + emoji_txt_content = """ + blank, blank.png, Fun + blank2, blank.png + foo, /emoji/test_pack_for_import/blank.png + bar + """ + + File.write!("#{@emoji_path}/test_pack_for_import/emoji.txt", emoji_txt_content) + + assert admin_conn + |> get("/api/pleroma/emoji/packs/import") + |> json_response_and_validate_schema(200) == ["test_pack_for_import"] + + resp = conn |> get("/api/pleroma/emoji/packs") |> json_response_and_validate_schema(200) + + assert resp["test_pack_for_import"]["files"] == %{ + "blank" => "blank.png", + "blank2" => "blank.png", + "foo" => "blank.png" + } + end + + describe "GET /api/pleroma/emoji/packs/:name" do + test "shows pack.json", %{conn: conn} do + assert %{ + "files" => %{"blank" => "blank.png"}, + "pack" => %{ + "can-download" => true, + "description" => "Test description", + "download-sha256" => _, + "homepage" => "https://pleroma.social", + "license" => "Test license", + "share-files" => true + } + } = + conn + |> get("/api/pleroma/emoji/packs/test_pack") + |> json_response_and_validate_schema(200) + end + + test "non existing pack", %{conn: conn} do + assert conn + |> get("/api/pleroma/emoji/packs/non_existing") + |> json_response_and_validate_schema(:not_found) == %{ + "error" => "Pack non_existing does not exist" + } + end + + test "error name", %{conn: conn} do + assert conn + |> get("/api/pleroma/emoji/packs/ ") + |> json_response_and_validate_schema(:bad_request) == %{ + "error" => "pack name cannot be empty" + } + end + end +end diff --git a/test/web/pleroma_api/controllers/emoji_reaction_controller_test.exs b/test/web/pleroma_api/controllers/emoji_reaction_controller_test.exs new file mode 100644 index 000000000..e1bb5ebfe --- /dev/null +++ b/test/web/pleroma_api/controllers/emoji_reaction_controller_test.exs @@ -0,0 +1,132 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.PleromaAPI.EmojiReactionControllerTest do + use Oban.Testing, repo: Pleroma.Repo + use Pleroma.Web.ConnCase + + alias Pleroma.Object + alias Pleroma.Tests.ObanHelpers + alias Pleroma.User + alias Pleroma.Web.CommonAPI + + import Pleroma.Factory + + test "PUT /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do + user = insert(:user) + other_user = insert(:user) + + {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"}) + + result = + conn + |> assign(:user, other_user) + |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["write:statuses"])) + |> put("/api/v1/pleroma/statuses/#{activity.id}/reactions/☕") + |> json_response_and_validate_schema(200) + + # We return the status, but this our implementation detail. + assert %{"id" => id} = result + assert to_string(activity.id) == id + + assert result["pleroma"]["emoji_reactions"] == [ + %{"name" => "☕", "count" => 1, "me" => true} + ] + + # Reacting with a non-emoji + assert conn + |> assign(:user, other_user) + |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["write:statuses"])) + |> put("/api/v1/pleroma/statuses/#{activity.id}/reactions/x") + |> json_response_and_validate_schema(400) + end + + test "DELETE /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do + user = insert(:user) + other_user = insert(:user) + + {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"}) + {:ok, _reaction_activity} = CommonAPI.react_with_emoji(activity.id, other_user, "☕") + + ObanHelpers.perform_all() + + result = + conn + |> assign(:user, other_user) + |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["write:statuses"])) + |> delete("/api/v1/pleroma/statuses/#{activity.id}/reactions/☕") + + assert %{"id" => id} = json_response_and_validate_schema(result, 200) + assert to_string(activity.id) == id + + ObanHelpers.perform_all() + + object = Object.get_by_ap_id(activity.data["object"]) + + assert object.data["reaction_count"] == 0 + end + + test "GET /api/v1/pleroma/statuses/:id/reactions", %{conn: conn} do + user = insert(:user) + other_user = insert(:user) + doomed_user = insert(:user) + + {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"}) + + result = + conn + |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions") + |> json_response_and_validate_schema(200) + + assert result == [] + + {:ok, _} = CommonAPI.react_with_emoji(activity.id, other_user, "🎅") + {:ok, _} = CommonAPI.react_with_emoji(activity.id, doomed_user, "🎅") + + User.perform(:delete, doomed_user) + + result = + conn + |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions") + |> json_response_and_validate_schema(200) + + [%{"name" => "🎅", "count" => 1, "accounts" => [represented_user], "me" => false}] = result + + assert represented_user["id"] == other_user.id + + result = + conn + |> assign(:user, other_user) + |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["read:statuses"])) + |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions") + |> json_response_and_validate_schema(200) + + assert [%{"name" => "🎅", "count" => 1, "accounts" => [_represented_user], "me" => true}] = + result + end + + test "GET /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do + user = insert(:user) + other_user = insert(:user) + + {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"}) + + result = + conn + |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions/🎅") + |> json_response_and_validate_schema(200) + + assert result == [] + + {:ok, _} = CommonAPI.react_with_emoji(activity.id, other_user, "🎅") + {:ok, _} = CommonAPI.react_with_emoji(activity.id, other_user, "☕") + + assert [%{"name" => "🎅", "count" => 1, "accounts" => [represented_user], "me" => false}] = + conn + |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions/🎅") + |> json_response_and_validate_schema(200) + + assert represented_user["id"] == other_user.id + end +end diff --git a/test/web/pleroma_api/controllers/mascot_controller_test.exs b/test/web/pleroma_api/controllers/mascot_controller_test.exs index 617831b02..e2ead6e15 100644 --- a/test/web/pleroma_api/controllers/mascot_controller_test.exs +++ b/test/web/pleroma_api/controllers/mascot_controller_test.exs @@ -16,9 +16,12 @@ test "mascot upload" do filename: "sound.mp3" } - ret_conn = put(conn, "/api/v1/pleroma/mascot", %{"file" => non_image_file}) + ret_conn = + conn + |> put_req_header("content-type", "multipart/form-data") + |> put("/api/v1/pleroma/mascot", %{"file" => non_image_file}) - assert json_response(ret_conn, 415) + assert json_response_and_validate_schema(ret_conn, 415) file = %Plug.Upload{ content_type: "image/jpg", @@ -26,9 +29,12 @@ test "mascot upload" do filename: "an_image.jpg" } - conn = put(conn, "/api/v1/pleroma/mascot", %{"file" => file}) + conn = + conn + |> put_req_header("content-type", "multipart/form-data") + |> put("/api/v1/pleroma/mascot", %{"file" => file}) - assert %{"id" => _, "type" => image} = json_response(conn, 200) + assert %{"id" => _, "type" => image} = json_response_and_validate_schema(conn, 200) end test "mascot retrieving" do @@ -37,7 +43,7 @@ test "mascot retrieving" do # When user hasn't set a mascot, we should just get pleroma tan back ret_conn = get(conn, "/api/v1/pleroma/mascot") - assert %{"url" => url} = json_response(ret_conn, 200) + assert %{"url" => url} = json_response_and_validate_schema(ret_conn, 200) assert url =~ "pleroma-fox-tan-smol" # When a user sets their mascot, we should get that back @@ -47,9 +53,12 @@ test "mascot retrieving" do filename: "an_image.jpg" } - ret_conn = put(conn, "/api/v1/pleroma/mascot", %{"file" => file}) + ret_conn = + conn + |> put_req_header("content-type", "multipart/form-data") + |> put("/api/v1/pleroma/mascot", %{"file" => file}) - assert json_response(ret_conn, 200) + assert json_response_and_validate_schema(ret_conn, 200) user = User.get_cached_by_id(user.id) @@ -58,7 +67,7 @@ test "mascot retrieving" do |> assign(:user, user) |> get("/api/v1/pleroma/mascot") - assert %{"url" => url, "type" => "image"} = json_response(conn, 200) + assert %{"url" => url, "type" => "image"} = json_response_and_validate_schema(conn, 200) assert url =~ "an_image" end end diff --git a/test/web/pleroma_api/controllers/notification_controller_test.exs b/test/web/pleroma_api/controllers/notification_controller_test.exs new file mode 100644 index 000000000..bb4fe6c49 --- /dev/null +++ b/test/web/pleroma_api/controllers/notification_controller_test.exs @@ -0,0 +1,68 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.PleromaAPI.NotificationControllerTest do + use Pleroma.Web.ConnCase + + alias Pleroma.Notification + alias Pleroma.Repo + alias Pleroma.Web.CommonAPI + + import Pleroma.Factory + + describe "POST /api/v1/pleroma/notifications/read" do + setup do: oauth_access(["write:notifications"]) + + test "it marks a single notification as read", %{user: user1, conn: conn} do + user2 = insert(:user) + {:ok, activity1} = CommonAPI.post(user2, %{status: "hi @#{user1.nickname}"}) + {:ok, activity2} = CommonAPI.post(user2, %{status: "hi @#{user1.nickname}"}) + {:ok, [notification1]} = Notification.create_notifications(activity1) + {:ok, [notification2]} = Notification.create_notifications(activity2) + + response = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/pleroma/notifications/read", %{id: notification1.id}) + |> json_response_and_validate_schema(:ok) + + assert %{"pleroma" => %{"is_seen" => true}} = response + assert Repo.get(Notification, notification1.id).seen + refute Repo.get(Notification, notification2.id).seen + end + + test "it marks multiple notifications as read", %{user: user1, conn: conn} do + user2 = insert(:user) + {:ok, _activity1} = CommonAPI.post(user2, %{status: "hi @#{user1.nickname}"}) + {:ok, _activity2} = CommonAPI.post(user2, %{status: "hi @#{user1.nickname}"}) + {:ok, _activity3} = CommonAPI.post(user2, %{status: "HIE @#{user1.nickname}"}) + + [notification3, notification2, notification1] = Notification.for_user(user1, %{limit: 3}) + + [response1, response2] = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/pleroma/notifications/read", %{max_id: notification2.id}) + |> json_response_and_validate_schema(:ok) + + assert %{"pleroma" => %{"is_seen" => true}} = response1 + assert %{"pleroma" => %{"is_seen" => true}} = response2 + assert Repo.get(Notification, notification1.id).seen + assert Repo.get(Notification, notification2.id).seen + refute Repo.get(Notification, notification3.id).seen + end + + test "it returns error when notification not found", %{conn: conn} do + response = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/pleroma/notifications/read", %{ + id: 22_222_222_222_222 + }) + |> json_response_and_validate_schema(:bad_request) + + assert response == %{"error" => "Cannot get notification"} + end + end +end diff --git a/test/web/pleroma_api/controllers/pleroma_api_controller_test.exs b/test/web/pleroma_api/controllers/pleroma_api_controller_test.exs deleted file mode 100644 index 32250f06f..000000000 --- a/test/web/pleroma_api/controllers/pleroma_api_controller_test.exs +++ /dev/null @@ -1,279 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.PleromaAPI.PleromaAPIControllerTest do - use Pleroma.Web.ConnCase - - alias Pleroma.Conversation.Participation - alias Pleroma.Notification - alias Pleroma.Object - alias Pleroma.Repo - alias Pleroma.User - alias Pleroma.Web.CommonAPI - - import Pleroma.Factory - - test "PUT /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do - user = insert(:user) - other_user = insert(:user) - - {:ok, activity} = CommonAPI.post(user, %{"status" => "#cofe"}) - - result = - conn - |> assign(:user, other_user) - |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["write:statuses"])) - |> put("/api/v1/pleroma/statuses/#{activity.id}/reactions/☕") - |> json_response(200) - - # We return the status, but this our implementation detail. - assert %{"id" => id} = result - assert to_string(activity.id) == id - - assert result["pleroma"]["emoji_reactions"] == [ - %{"name" => "☕", "count" => 1, "me" => true} - ] - end - - test "DELETE /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do - user = insert(:user) - other_user = insert(:user) - - {:ok, activity} = CommonAPI.post(user, %{"status" => "#cofe"}) - {:ok, activity, _object} = CommonAPI.react_with_emoji(activity.id, other_user, "☕") - - result = - conn - |> assign(:user, other_user) - |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["write:statuses"])) - |> delete("/api/v1/pleroma/statuses/#{activity.id}/reactions/☕") - - assert %{"id" => id} = json_response(result, 200) - assert to_string(activity.id) == id - - object = Object.normalize(activity) - - assert object.data["reaction_count"] == 0 - end - - test "GET /api/v1/pleroma/statuses/:id/reactions", %{conn: conn} do - user = insert(:user) - other_user = insert(:user) - doomed_user = insert(:user) - - {:ok, activity} = CommonAPI.post(user, %{"status" => "#cofe"}) - - result = - conn - |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions") - |> json_response(200) - - assert result == [] - - {:ok, _, _} = CommonAPI.react_with_emoji(activity.id, other_user, "🎅") - {:ok, _, _} = CommonAPI.react_with_emoji(activity.id, doomed_user, "🎅") - - User.perform(:delete, doomed_user) - - result = - conn - |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions") - |> json_response(200) - - [%{"name" => "🎅", "count" => 1, "accounts" => [represented_user], "me" => false}] = result - - assert represented_user["id"] == other_user.id - - result = - conn - |> assign(:user, other_user) - |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["read:statuses"])) - |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions") - |> json_response(200) - - assert [%{"name" => "🎅", "count" => 1, "accounts" => [_represented_user], "me" => true}] = - result - end - - test "GET /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do - user = insert(:user) - other_user = insert(:user) - - {:ok, activity} = CommonAPI.post(user, %{"status" => "#cofe"}) - - result = - conn - |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions/🎅") - |> json_response(200) - - assert result == [] - - {:ok, _, _} = CommonAPI.react_with_emoji(activity.id, other_user, "🎅") - {:ok, _, _} = CommonAPI.react_with_emoji(activity.id, other_user, "☕") - - result = - conn - |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions/🎅") - |> json_response(200) - - [%{"name" => "🎅", "count" => 1, "accounts" => [represented_user], "me" => false}] = result - - assert represented_user["id"] == other_user.id - end - - test "/api/v1/pleroma/conversations/:id" do - user = insert(:user) - %{user: other_user, conn: conn} = oauth_access(["read:statuses"]) - - {:ok, _activity} = - CommonAPI.post(user, %{"status" => "Hi @#{other_user.nickname}!", "visibility" => "direct"}) - - [participation] = Participation.for_user(other_user) - - result = - conn - |> get("/api/v1/pleroma/conversations/#{participation.id}") - |> json_response(200) - - assert result["id"] == participation.id |> to_string() - end - - test "/api/v1/pleroma/conversations/:id/statuses" do - user = insert(:user) - %{user: other_user, conn: conn} = oauth_access(["read:statuses"]) - third_user = insert(:user) - - {:ok, _activity} = - CommonAPI.post(user, %{"status" => "Hi @#{third_user.nickname}!", "visibility" => "direct"}) - - {:ok, activity} = - CommonAPI.post(user, %{"status" => "Hi @#{other_user.nickname}!", "visibility" => "direct"}) - - [participation] = Participation.for_user(other_user) - - {:ok, activity_two} = - CommonAPI.post(other_user, %{ - "status" => "Hi!", - "in_reply_to_status_id" => activity.id, - "in_reply_to_conversation_id" => participation.id - }) - - result = - conn - |> get("/api/v1/pleroma/conversations/#{participation.id}/statuses") - |> json_response(200) - - assert length(result) == 2 - - id_one = activity.id - id_two = activity_two.id - assert [%{"id" => ^id_one}, %{"id" => ^id_two}] = result - end - - test "PATCH /api/v1/pleroma/conversations/:id" do - %{user: user, conn: conn} = oauth_access(["write:conversations"]) - other_user = insert(:user) - - {:ok, _activity} = CommonAPI.post(user, %{"status" => "Hi", "visibility" => "direct"}) - - [participation] = Participation.for_user(user) - - participation = Repo.preload(participation, :recipients) - - user = User.get_cached_by_id(user.id) - assert [user] == participation.recipients - assert other_user not in participation.recipients - - result = - conn - |> patch("/api/v1/pleroma/conversations/#{participation.id}", %{ - "recipients" => [user.id, other_user.id] - }) - |> json_response(200) - - assert result["id"] == participation.id |> to_string - - [participation] = Participation.for_user(user) - participation = Repo.preload(participation, :recipients) - - assert user in participation.recipients - assert other_user in participation.recipients - end - - test "POST /api/v1/pleroma/conversations/read" do - user = insert(:user) - %{user: other_user, conn: conn} = oauth_access(["write:notifications"]) - - {:ok, _activity} = - CommonAPI.post(user, %{"status" => "Hi @#{other_user.nickname}", "visibility" => "direct"}) - - {:ok, _activity} = - CommonAPI.post(user, %{"status" => "Hi @#{other_user.nickname}", "visibility" => "direct"}) - - [participation2, participation1] = Participation.for_user(other_user) - assert Participation.get(participation2.id).read == false - assert Participation.get(participation1.id).read == false - assert User.get_cached_by_id(other_user.id).unread_conversation_count == 2 - - [%{"unread" => false}, %{"unread" => false}] = - conn - |> post("/api/v1/pleroma/conversations/read", %{}) - |> json_response(200) - - [participation2, participation1] = Participation.for_user(other_user) - assert Participation.get(participation2.id).read == true - assert Participation.get(participation1.id).read == true - assert User.get_cached_by_id(other_user.id).unread_conversation_count == 0 - end - - describe "POST /api/v1/pleroma/notifications/read" do - setup do: oauth_access(["write:notifications"]) - - test "it marks a single notification as read", %{user: user1, conn: conn} do - user2 = insert(:user) - {:ok, activity1} = CommonAPI.post(user2, %{"status" => "hi @#{user1.nickname}"}) - {:ok, activity2} = CommonAPI.post(user2, %{"status" => "hi @#{user1.nickname}"}) - {:ok, [notification1]} = Notification.create_notifications(activity1) - {:ok, [notification2]} = Notification.create_notifications(activity2) - - response = - conn - |> post("/api/v1/pleroma/notifications/read", %{"id" => "#{notification1.id}"}) - |> json_response(:ok) - - assert %{"pleroma" => %{"is_seen" => true}} = response - assert Repo.get(Notification, notification1.id).seen - refute Repo.get(Notification, notification2.id).seen - end - - test "it marks multiple notifications as read", %{user: user1, conn: conn} do - user2 = insert(:user) - {:ok, _activity1} = CommonAPI.post(user2, %{"status" => "hi @#{user1.nickname}"}) - {:ok, _activity2} = CommonAPI.post(user2, %{"status" => "hi @#{user1.nickname}"}) - {:ok, _activity3} = CommonAPI.post(user2, %{"status" => "HIE @#{user1.nickname}"}) - - [notification3, notification2, notification1] = Notification.for_user(user1, %{limit: 3}) - - [response1, response2] = - conn - |> post("/api/v1/pleroma/notifications/read", %{"max_id" => "#{notification2.id}"}) - |> json_response(:ok) - - assert %{"pleroma" => %{"is_seen" => true}} = response1 - assert %{"pleroma" => %{"is_seen" => true}} = response2 - assert Repo.get(Notification, notification1.id).seen - assert Repo.get(Notification, notification2.id).seen - refute Repo.get(Notification, notification3.id).seen - end - - test "it returns error when notification not found", %{conn: conn} do - response = - conn - |> post("/api/v1/pleroma/notifications/read", %{"id" => "22222222222222"}) - |> json_response(:bad_request) - - assert response == %{"error" => "Cannot get notification"} - end - end -end diff --git a/test/web/pleroma_api/controllers/scrobble_controller_test.exs b/test/web/pleroma_api/controllers/scrobble_controller_test.exs index 1b945040c..f39c07ac6 100644 --- a/test/web/pleroma_api/controllers/scrobble_controller_test.exs +++ b/test/web/pleroma_api/controllers/scrobble_controller_test.exs @@ -12,14 +12,16 @@ test "works correctly" do %{conn: conn} = oauth_access(["write"]) conn = - post(conn, "/api/v1/pleroma/scrobble", %{ + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/pleroma/scrobble", %{ "title" => "lain radio episode 1", "artist" => "lain", "album" => "lain radio", "length" => "180000" }) - assert %{"title" => "lain radio episode 1"} = json_response(conn, 200) + assert %{"title" => "lain radio episode 1"} = json_response_and_validate_schema(conn, 200) end end @@ -29,28 +31,28 @@ test "works correctly" do {:ok, _activity} = CommonAPI.listen(user, %{ - "title" => "lain radio episode 1", - "artist" => "lain", - "album" => "lain radio" + title: "lain radio episode 1", + artist: "lain", + album: "lain radio" }) {:ok, _activity} = CommonAPI.listen(user, %{ - "title" => "lain radio episode 2", - "artist" => "lain", - "album" => "lain radio" + title: "lain radio episode 2", + artist: "lain", + album: "lain radio" }) {:ok, _activity} = CommonAPI.listen(user, %{ - "title" => "lain radio episode 3", - "artist" => "lain", - "album" => "lain radio" + title: "lain radio episode 3", + artist: "lain", + album: "lain radio" }) conn = get(conn, "/api/v1/pleroma/accounts/#{user.id}/scrobbles") - result = json_response(conn, 200) + result = json_response_and_validate_schema(conn, 200) assert length(result) == 3 end diff --git a/test/web/pleroma_api/controllers/two_factor_authentication_controller_test.exs b/test/web/pleroma_api/controllers/two_factor_authentication_controller_test.exs new file mode 100644 index 000000000..d23d08a00 --- /dev/null +++ b/test/web/pleroma_api/controllers/two_factor_authentication_controller_test.exs @@ -0,0 +1,260 @@ +defmodule Pleroma.Web.PleromaAPI.TwoFactorAuthenticationControllerTest do + use Pleroma.Web.ConnCase + + import Pleroma.Factory + alias Pleroma.MFA.Settings + alias Pleroma.MFA.TOTP + + describe "GET /api/pleroma/accounts/mfa/settings" do + test "returns user mfa settings for new user", %{conn: conn} do + token = insert(:oauth_token, scopes: ["read", "follow"]) + token2 = insert(:oauth_token, scopes: ["write"]) + + assert conn + |> put_req_header("authorization", "Bearer #{token.token}") + |> get("/api/pleroma/accounts/mfa") + |> json_response(:ok) == %{ + "settings" => %{"enabled" => false, "totp" => false} + } + + assert conn + |> put_req_header("authorization", "Bearer #{token2.token}") + |> get("/api/pleroma/accounts/mfa") + |> json_response(403) == %{ + "error" => "Insufficient permissions: read:security." + } + end + + test "returns user mfa settings with enabled totp", %{conn: conn} do + user = + insert(:user, + multi_factor_authentication_settings: %Settings{ + enabled: true, + totp: %Settings.TOTP{secret: "XXX", delivery_type: "app", confirmed: true} + } + ) + + token = insert(:oauth_token, scopes: ["read", "follow"], user: user) + + assert conn + |> put_req_header("authorization", "Bearer #{token.token}") + |> get("/api/pleroma/accounts/mfa") + |> json_response(:ok) == %{ + "settings" => %{"enabled" => true, "totp" => true} + } + end + end + + describe "GET /api/pleroma/accounts/mfa/backup_codes" do + test "returns backup codes", %{conn: conn} do + user = + insert(:user, + multi_factor_authentication_settings: %Settings{ + backup_codes: ["1", "2", "3"], + totp: %Settings.TOTP{secret: "secret"} + } + ) + + token = insert(:oauth_token, scopes: ["write", "follow"], user: user) + token2 = insert(:oauth_token, scopes: ["read"]) + + response = + conn + |> put_req_header("authorization", "Bearer #{token.token}") + |> get("/api/pleroma/accounts/mfa/backup_codes") + |> json_response(:ok) + + assert [<<_::bytes-size(6)>>, <<_::bytes-size(6)>>] = response["codes"] + user = refresh_record(user) + mfa_settings = user.multi_factor_authentication_settings + assert mfa_settings.totp.secret == "secret" + refute mfa_settings.backup_codes == ["1", "2", "3"] + refute mfa_settings.backup_codes == [] + + assert conn + |> put_req_header("authorization", "Bearer #{token2.token}") + |> get("/api/pleroma/accounts/mfa/backup_codes") + |> json_response(403) == %{ + "error" => "Insufficient permissions: write:security." + } + end + end + + describe "GET /api/pleroma/accounts/mfa/setup/totp" do + test "return errors when method is invalid", %{conn: conn} do + user = insert(:user) + token = insert(:oauth_token, scopes: ["write", "follow"], user: user) + + response = + conn + |> put_req_header("authorization", "Bearer #{token.token}") + |> get("/api/pleroma/accounts/mfa/setup/torf") + |> json_response(400) + + assert response == %{"error" => "undefined method"} + end + + test "returns key and provisioning_uri", %{conn: conn} do + user = + insert(:user, + multi_factor_authentication_settings: %Settings{backup_codes: ["1", "2", "3"]} + ) + + token = insert(:oauth_token, scopes: ["write", "follow"], user: user) + token2 = insert(:oauth_token, scopes: ["read"]) + + response = + conn + |> put_req_header("authorization", "Bearer #{token.token}") + |> get("/api/pleroma/accounts/mfa/setup/totp") + |> json_response(:ok) + + user = refresh_record(user) + mfa_settings = user.multi_factor_authentication_settings + secret = mfa_settings.totp.secret + refute mfa_settings.enabled + assert mfa_settings.backup_codes == ["1", "2", "3"] + + assert response == %{ + "key" => secret, + "provisioning_uri" => TOTP.provisioning_uri(secret, "#{user.email}") + } + + assert conn + |> put_req_header("authorization", "Bearer #{token2.token}") + |> get("/api/pleroma/accounts/mfa/setup/totp") + |> json_response(403) == %{ + "error" => "Insufficient permissions: write:security." + } + end + end + + describe "GET /api/pleroma/accounts/mfa/confirm/totp" do + test "returns success result", %{conn: conn} do + secret = TOTP.generate_secret() + code = TOTP.generate_token(secret) + + user = + insert(:user, + multi_factor_authentication_settings: %Settings{ + backup_codes: ["1", "2", "3"], + totp: %Settings.TOTP{secret: secret} + } + ) + + token = insert(:oauth_token, scopes: ["write", "follow"], user: user) + token2 = insert(:oauth_token, scopes: ["read"]) + + assert conn + |> put_req_header("authorization", "Bearer #{token.token}") + |> post("/api/pleroma/accounts/mfa/confirm/totp", %{password: "test", code: code}) + |> json_response(:ok) + + settings = refresh_record(user).multi_factor_authentication_settings + assert settings.enabled + assert settings.totp.secret == secret + assert settings.totp.confirmed + assert settings.backup_codes == ["1", "2", "3"] + + assert conn + |> put_req_header("authorization", "Bearer #{token2.token}") + |> post("/api/pleroma/accounts/mfa/confirm/totp", %{password: "test", code: code}) + |> json_response(403) == %{ + "error" => "Insufficient permissions: write:security." + } + end + + test "returns error if password incorrect", %{conn: conn} do + secret = TOTP.generate_secret() + code = TOTP.generate_token(secret) + + user = + insert(:user, + multi_factor_authentication_settings: %Settings{ + backup_codes: ["1", "2", "3"], + totp: %Settings.TOTP{secret: secret} + } + ) + + token = insert(:oauth_token, scopes: ["write", "follow"], user: user) + + response = + conn + |> put_req_header("authorization", "Bearer #{token.token}") + |> post("/api/pleroma/accounts/mfa/confirm/totp", %{password: "xxx", code: code}) + |> json_response(422) + + settings = refresh_record(user).multi_factor_authentication_settings + refute settings.enabled + refute settings.totp.confirmed + assert settings.backup_codes == ["1", "2", "3"] + assert response == %{"error" => "Invalid password."} + end + + test "returns error if code incorrect", %{conn: conn} do + secret = TOTP.generate_secret() + + user = + insert(:user, + multi_factor_authentication_settings: %Settings{ + backup_codes: ["1", "2", "3"], + totp: %Settings.TOTP{secret: secret} + } + ) + + token = insert(:oauth_token, scopes: ["write", "follow"], user: user) + token2 = insert(:oauth_token, scopes: ["read"]) + + response = + conn + |> put_req_header("authorization", "Bearer #{token.token}") + |> post("/api/pleroma/accounts/mfa/confirm/totp", %{password: "test", code: "code"}) + |> json_response(422) + + settings = refresh_record(user).multi_factor_authentication_settings + refute settings.enabled + refute settings.totp.confirmed + assert settings.backup_codes == ["1", "2", "3"] + assert response == %{"error" => "invalid_token"} + + assert conn + |> put_req_header("authorization", "Bearer #{token2.token}") + |> post("/api/pleroma/accounts/mfa/confirm/totp", %{password: "test", code: "code"}) + |> json_response(403) == %{ + "error" => "Insufficient permissions: write:security." + } + end + end + + describe "DELETE /api/pleroma/accounts/mfa/totp" do + test "returns success result", %{conn: conn} do + user = + insert(:user, + multi_factor_authentication_settings: %Settings{ + backup_codes: ["1", "2", "3"], + totp: %Settings.TOTP{secret: "secret"} + } + ) + + token = insert(:oauth_token, scopes: ["write", "follow"], user: user) + token2 = insert(:oauth_token, scopes: ["read"]) + + assert conn + |> put_req_header("authorization", "Bearer #{token.token}") + |> delete("/api/pleroma/accounts/mfa/totp", %{password: "test"}) + |> json_response(:ok) + + settings = refresh_record(user).multi_factor_authentication_settings + refute settings.enabled + assert settings.totp.secret == nil + refute settings.totp.confirmed + + assert conn + |> put_req_header("authorization", "Bearer #{token2.token}") + |> delete("/api/pleroma/accounts/mfa/totp", %{password: "test"}) + |> json_response(403) == %{ + "error" => "Insufficient permissions: write:security." + } + end + end +end diff --git a/test/web/pleroma_api/views/scrobble_view_test.exs b/test/web/pleroma_api/views/scrobble_view_test.exs new file mode 100644 index 000000000..6bdb56509 --- /dev/null +++ b/test/web/pleroma_api/views/scrobble_view_test.exs @@ -0,0 +1,20 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.PleromaAPI.StatusViewTest do + use Pleroma.DataCase + + alias Pleroma.Web.PleromaAPI.ScrobbleView + + import Pleroma.Factory + + test "successfully renders a Listen activity (pleroma extension)" do + listen_activity = insert(:listen) + + status = ScrobbleView.render("show.json", activity: listen_activity) + + assert status.length == listen_activity.data["object"]["length"] + assert status.title == listen_activity.data["object"]["title"] + end +end diff --git a/test/web/plugs/plug_test.exs b/test/web/plugs/plug_test.exs new file mode 100644 index 000000000..943e484e7 --- /dev/null +++ b/test/web/plugs/plug_test.exs @@ -0,0 +1,91 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.PlugTest do + @moduledoc "Tests for the functionality added via `use Pleroma.Web, :plug`" + + alias Pleroma.Plugs.ExpectAuthenticatedCheckPlug + alias Pleroma.Plugs.ExpectPublicOrAuthenticatedCheckPlug + alias Pleroma.Plugs.PlugHelper + + import Mock + + use Pleroma.Web.ConnCase + + describe "when plug is skipped, " do + setup_with_mocks( + [ + {ExpectPublicOrAuthenticatedCheckPlug, [:passthrough], []} + ], + %{conn: conn} + ) do + conn = ExpectPublicOrAuthenticatedCheckPlug.skip_plug(conn) + %{conn: conn} + end + + test "it neither adds plug to called plugs list nor calls `perform/2`, " <> + "regardless of :if_func / :unless_func options", + %{conn: conn} do + for opts <- [%{}, %{if_func: fn _ -> true end}, %{unless_func: fn _ -> false end}] do + ret_conn = ExpectPublicOrAuthenticatedCheckPlug.call(conn, opts) + + refute called(ExpectPublicOrAuthenticatedCheckPlug.perform(:_, :_)) + refute PlugHelper.plug_called?(ret_conn, ExpectPublicOrAuthenticatedCheckPlug) + end + end + end + + describe "when plug is NOT skipped, " do + setup_with_mocks([{ExpectAuthenticatedCheckPlug, [:passthrough], []}]) do + :ok + end + + test "with no pre-run checks, adds plug to called plugs list and calls `perform/2`", %{ + conn: conn + } do + ret_conn = ExpectAuthenticatedCheckPlug.call(conn, %{}) + + assert called(ExpectAuthenticatedCheckPlug.perform(ret_conn, :_)) + assert PlugHelper.plug_called?(ret_conn, ExpectAuthenticatedCheckPlug) + end + + test "when :if_func option is given, calls the plug only if provided function evals tru-ish", + %{conn: conn} do + ret_conn = ExpectAuthenticatedCheckPlug.call(conn, %{if_func: fn _ -> false end}) + + refute called(ExpectAuthenticatedCheckPlug.perform(:_, :_)) + refute PlugHelper.plug_called?(ret_conn, ExpectAuthenticatedCheckPlug) + + ret_conn = ExpectAuthenticatedCheckPlug.call(conn, %{if_func: fn _ -> true end}) + + assert called(ExpectAuthenticatedCheckPlug.perform(ret_conn, :_)) + assert PlugHelper.plug_called?(ret_conn, ExpectAuthenticatedCheckPlug) + end + + test "if :unless_func option is given, calls the plug only if provided function evals falsy", + %{conn: conn} do + ret_conn = ExpectAuthenticatedCheckPlug.call(conn, %{unless_func: fn _ -> true end}) + + refute called(ExpectAuthenticatedCheckPlug.perform(:_, :_)) + refute PlugHelper.plug_called?(ret_conn, ExpectAuthenticatedCheckPlug) + + ret_conn = ExpectAuthenticatedCheckPlug.call(conn, %{unless_func: fn _ -> false end}) + + assert called(ExpectAuthenticatedCheckPlug.perform(ret_conn, :_)) + assert PlugHelper.plug_called?(ret_conn, ExpectAuthenticatedCheckPlug) + end + + test "allows a plug to be called multiple times (even if it's in called plugs list)", %{ + conn: conn + } do + conn = ExpectAuthenticatedCheckPlug.call(conn, %{an_option: :value1}) + assert called(ExpectAuthenticatedCheckPlug.perform(conn, %{an_option: :value1})) + + assert PlugHelper.plug_called?(conn, ExpectAuthenticatedCheckPlug) + + conn = ExpectAuthenticatedCheckPlug.call(conn, %{an_option: :value2}) + assert called(ExpectAuthenticatedCheckPlug.perform(conn, %{an_option: :value2})) + end + end +end diff --git a/test/web/push/impl_test.exs b/test/web/push/impl_test.exs index 089d55577..a826b24c9 100644 --- a/test/web/push/impl_test.exs +++ b/test/web/push/impl_test.exs @@ -13,8 +13,8 @@ defmodule Pleroma.Web.Push.ImplTest do import Pleroma.Factory - setup_all do - Tesla.Mock.mock_global(fn + setup do + Tesla.Mock.mock(fn %{method: :post, url: "https://example.com/example/1234"} -> %Tesla.Env{status: 200} @@ -55,7 +55,7 @@ test "performs sending notifications" do data: %{alerts: %{"follow" => true, "mention" => false}} ) - {:ok, activity} = CommonAPI.post(user, %{"status" => " + status: "Lorem ipsum dolor sit amet, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis." }) @@ -134,7 +134,7 @@ test "renders title and body for follow activity" do user = insert(:user, nickname: "Bob") other_user = insert(:user) {:ok, _, _, activity} = CommonAPI.follow(user, other_user) - object = Object.normalize(activity) + object = Object.normalize(activity, false) assert Impl.format_body(%{activity: activity}, user, object) == "@Bob has followed you" @@ -147,11 +147,11 @@ test "renders title and body for announce activity" do {:ok, activity} = CommonAPI.post(user, %{ - "status" => + status: "Lorem ipsum dolor sit amet, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis." }) - {:ok, announce_activity, _} = CommonAPI.repeat(activity.id, user) + {:ok, announce_activity} = CommonAPI.repeat(activity.id, user) object = Object.normalize(activity) assert Impl.format_body(%{activity: announce_activity}, user, object) == @@ -166,11 +166,11 @@ test "renders title and body for like activity" do {:ok, activity} = CommonAPI.post(user, %{ - "status" => + status: "Lorem ipsum dolor sit amet, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis." }) - {:ok, activity, _} = CommonAPI.favorite(activity.id, user) + {:ok, activity} = CommonAPI.favorite(user, activity.id) object = Object.normalize(activity) assert Impl.format_body(%{activity: activity}, user, object) == "@Bob has favorited your post" @@ -184,8 +184,8 @@ test "renders title for create activity with direct visibility" do {:ok, activity} = CommonAPI.post(user, %{ - "visibility" => "direct", - "status" => "This is just between you and me, pal" + visibility: "direct", + status: "This is just between you and me, pal" }) assert Impl.format_title(%{activity: activity}) == @@ -193,14 +193,14 @@ test "renders title for create activity with direct visibility" do end describe "build_content/3" do - test "returns info content for direct message with enabled privacy option" do + test "hides details for notifications when privacy option enabled" do user = insert(:user, nickname: "Bob") user2 = insert(:user, nickname: "Rob", notification_settings: %{privacy_option: true}) {:ok, activity} = CommonAPI.post(user, %{ - "visibility" => "direct", - "status" => " "direct", - "status" => + visibility: "direct", + status: "Lorem ipsum dolor sit amet, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis." }) @@ -235,6 +260,36 @@ test "returns regular content for direct message with disabled privacy option" d "@Bob: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce sagittis fini...", title: "New Direct Message" } + + {:ok, activity} = + CommonAPI.post(user, %{ + visibility: "public", + status: + "Lorem ipsum dolor sit amet, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis." + }) + + notif = insert(:notification, user: user2, activity: activity) + + actor = User.get_cached_by_ap_id(notif.activity.data["actor"]) + object = Object.normalize(activity) + + assert Impl.build_content(notif, actor, object) == %{ + body: + "@Bob: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce sagittis fini...", + title: "New Mention" + } + + {:ok, activity} = CommonAPI.favorite(user, activity.id) + + notif = insert(:notification, user: user2, activity: activity) + + actor = User.get_cached_by_ap_id(notif.activity.data["actor"]) + object = Object.normalize(activity) + + assert Impl.build_content(notif, actor, object) == %{ + body: "@Bob has favorited your post", + title: "New Favorite" + } end end end diff --git a/test/web/rel_me_test.exs b/test/web/rel_me_test.exs index e05a8863d..65255916d 100644 --- a/test/web/rel_me_test.exs +++ b/test/web/rel_me_test.exs @@ -3,7 +3,7 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Web.RelMeTest do - use ExUnit.Case, async: true + use ExUnit.Case setup_all do Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) diff --git a/test/web/rich_media/helpers_test.exs b/test/web/rich_media/helpers_test.exs index aa0c5c830..8264a9c41 100644 --- a/test/web/rich_media/helpers_test.exs +++ b/test/web/rich_media/helpers_test.exs @@ -26,8 +26,8 @@ test "refuses to crawl incomplete URLs" do {:ok, activity} = CommonAPI.post(user, %{ - "status" => "[test](example.com/ogp)", - "content_type" => "text/markdown" + status: "[test](example.com/ogp)", + content_type: "text/markdown" }) Config.put([:rich_media, :enabled], true) @@ -40,8 +40,8 @@ test "refuses to crawl malformed URLs" do {:ok, activity} = CommonAPI.post(user, %{ - "status" => "[test](example.com[]/ogp)", - "content_type" => "text/markdown" + status: "[test](example.com[]/ogp)", + content_type: "text/markdown" }) Config.put([:rich_media, :enabled], true) @@ -54,8 +54,8 @@ test "crawls valid, complete URLs" do {:ok, activity} = CommonAPI.post(user, %{ - "status" => "[test](https://example.com/ogp)", - "content_type" => "text/markdown" + status: "[test](https://example.com/ogp)", + content_type: "text/markdown" }) Config.put([:rich_media, :enabled], true) @@ -69,8 +69,8 @@ test "refuses to crawl URLs from posts marked sensitive" do {:ok, activity} = CommonAPI.post(user, %{ - "status" => "http://example.com/ogp", - "sensitive" => true + status: "http://example.com/ogp", + sensitive: true }) %Object{} = object = Object.normalize(activity) @@ -87,7 +87,7 @@ test "refuses to crawl URLs from posts tagged NSFW" do {:ok, activity} = CommonAPI.post(user, %{ - "status" => "http://example.com/ogp #nsfw" + status: "http://example.com/ogp #nsfw" }) %Object{} = object = Object.normalize(activity) @@ -103,12 +103,12 @@ test "refuses to crawl URLs of private network from posts" do user = insert(:user) {:ok, activity} = - CommonAPI.post(user, %{"status" => "http://127.0.0.1:4000/notice/9kCP7VNyPJXFOXDrgO"}) + CommonAPI.post(user, %{status: "http://127.0.0.1:4000/notice/9kCP7VNyPJXFOXDrgO"}) - {:ok, activity2} = CommonAPI.post(user, %{"status" => "https://10.111.10.1/notice/9kCP7V"}) - {:ok, activity3} = CommonAPI.post(user, %{"status" => "https://172.16.32.40/notice/9kCP7V"}) - {:ok, activity4} = CommonAPI.post(user, %{"status" => "https://192.168.10.40/notice/9kCP7V"}) - {:ok, activity5} = CommonAPI.post(user, %{"status" => "https://pleroma.local/notice/9kCP7V"}) + {:ok, activity2} = CommonAPI.post(user, %{status: "https://10.111.10.1/notice/9kCP7V"}) + {:ok, activity3} = CommonAPI.post(user, %{status: "https://172.16.32.40/notice/9kCP7V"}) + {:ok, activity4} = CommonAPI.post(user, %{status: "https://192.168.10.40/notice/9kCP7V"}) + {:ok, activity5} = CommonAPI.post(user, %{status: "https://pleroma.local/notice/9kCP7V"}) Config.put([:rich_media, :enabled], true) diff --git a/test/web/static_fe/static_fe_controller_test.exs b/test/web/static_fe/static_fe_controller_test.exs index 430683ea0..a49ab002f 100644 --- a/test/web/static_fe/static_fe_controller_test.exs +++ b/test/web/static_fe/static_fe_controller_test.exs @@ -32,8 +32,8 @@ test "404 when user not found", %{conn: conn} do end test "profile does not include private messages", %{conn: conn, user: user} do - CommonAPI.post(user, %{"status" => "public"}) - CommonAPI.post(user, %{"status" => "private", "visibility" => "private"}) + CommonAPI.post(user, %{status: "public"}) + CommonAPI.post(user, %{status: "private", visibility: "private"}) conn = get(conn, "/users/#{user.nickname}") @@ -44,7 +44,7 @@ test "profile does not include private messages", %{conn: conn, user: user} do end test "pagination", %{conn: conn, user: user} do - Enum.map(1..30, fn i -> CommonAPI.post(user, %{"status" => "test#{i}"}) end) + Enum.map(1..30, fn i -> CommonAPI.post(user, %{status: "test#{i}"}) end) conn = get(conn, "/users/#{user.nickname}") @@ -57,7 +57,7 @@ test "pagination", %{conn: conn, user: user} do end test "pagination, page 2", %{conn: conn, user: user} do - activities = Enum.map(1..30, fn i -> CommonAPI.post(user, %{"status" => "test#{i}"}) end) + activities = Enum.map(1..30, fn i -> CommonAPI.post(user, %{status: "test#{i}"}) end) {:ok, a11} = Enum.at(activities, 11) conn = get(conn, "/users/#{user.nickname}?max_id=#{a11.id}") @@ -77,7 +77,7 @@ test "it requires authentication if instance is NOT federating", %{conn: conn, u describe "notice html" do test "single notice page", %{conn: conn, user: user} do - {:ok, activity} = CommonAPI.post(user, %{"status" => "testing a thing!"}) + {:ok, activity} = CommonAPI.post(user, %{status: "testing a thing!"}) conn = get(conn, "/notice/#{activity.id}") @@ -89,7 +89,7 @@ test "single notice page", %{conn: conn, user: user} do test "filters HTML tags", %{conn: conn} do user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => ""}) + {:ok, activity} = CommonAPI.post(user, %{status: ""}) conn = conn @@ -101,11 +101,11 @@ test "filters HTML tags", %{conn: conn} do end test "shows the whole thread", %{conn: conn, user: user} do - {:ok, activity} = CommonAPI.post(user, %{"status" => "space: the final frontier"}) + {:ok, activity} = CommonAPI.post(user, %{status: "space: the final frontier"}) CommonAPI.post(user, %{ - "status" => "these are the voyages or something", - "in_reply_to_status_id" => activity.id + status: "these are the voyages or something", + in_reply_to_status_id: activity.id }) conn = get(conn, "/notice/#{activity.id}") @@ -117,7 +117,7 @@ test "shows the whole thread", %{conn: conn, user: user} do test "redirect by AP object ID", %{conn: conn, user: user} do {:ok, %Activity{data: %{"object" => object_url}}} = - CommonAPI.post(user, %{"status" => "beam me up"}) + CommonAPI.post(user, %{status: "beam me up"}) conn = get(conn, URI.parse(object_url).path) @@ -126,7 +126,7 @@ test "redirect by AP object ID", %{conn: conn, user: user} do test "redirect by activity ID", %{conn: conn, user: user} do {:ok, %Activity{data: %{"id" => id}}} = - CommonAPI.post(user, %{"status" => "I'm a doctor, not a devops!"}) + CommonAPI.post(user, %{status: "I'm a doctor, not a devops!"}) conn = get(conn, URI.parse(id).path) @@ -140,8 +140,7 @@ test "404 when notice not found", %{conn: conn} do end test "404 for private status", %{conn: conn, user: user} do - {:ok, activity} = - CommonAPI.post(user, %{"status" => "don't show me!", "visibility" => "private"}) + {:ok, activity} = CommonAPI.post(user, %{status: "don't show me!", visibility: "private"}) conn = get(conn, "/notice/#{activity.id}") @@ -171,7 +170,7 @@ test "302 for remote cached status", %{conn: conn, user: user} do end test "it requires authentication if instance is NOT federating", %{conn: conn, user: user} do - {:ok, activity} = CommonAPI.post(user, %{"status" => "testing a thing!"}) + {:ok, activity} = CommonAPI.post(user, %{status: "testing a thing!"}) ensure_federating_or_authenticated(conn, "/notice/#{activity.id}", user) end diff --git a/test/web/streamer/ping_test.exs b/test/web/streamer/ping_test.exs deleted file mode 100644 index 5df6c1cc3..000000000 --- a/test/web/streamer/ping_test.exs +++ /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.PingTest do - use Pleroma.DataCase - - import Pleroma.Factory - alias Pleroma.Web.Streamer - - setup do - start_supervised({Streamer.supervisor(), [ping_interval: 30]}) - - :ok - end - - describe "sockets" do - setup do - user = insert(:user) - {:ok, %{user: user}} - end - - test "it sends pings", %{user: user} do - task = - Task.async(fn -> - assert_receive {:text, received_event}, 40 - assert_receive {:text, received_event}, 40 - assert_receive {:text, received_event}, 40 - end) - - Streamer.add_socket("public", %{transport_pid: task.pid, assigns: %{user: user}}) - - Task.await(task) - end - end -end diff --git a/test/web/streamer/state_test.exs b/test/web/streamer/state_test.exs deleted file mode 100644 index a755e75c0..000000000 --- a/test/web/streamer/state_test.exs +++ /dev/null @@ -1,54 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.StateTest do - use Pleroma.DataCase - - import Pleroma.Factory - alias Pleroma.Web.Streamer - alias Pleroma.Web.Streamer.StreamerSocket - - @moduletag needs_streamer: true - - describe "sockets" do - setup do - user = insert(:user) - user2 = insert(:user) - {:ok, %{user: user, user2: user2}} - end - - test "it can add a socket", %{user: user} do - Streamer.add_socket("public", %{transport_pid: 1, assigns: %{user: user}}) - - assert(%{"public" => [%StreamerSocket{transport_pid: 1}]} = Streamer.get_sockets()) - end - - test "it can add multiple sockets per user", %{user: user} do - Streamer.add_socket("public", %{transport_pid: 1, assigns: %{user: user}}) - Streamer.add_socket("public", %{transport_pid: 2, assigns: %{user: user}}) - - assert( - %{ - "public" => [ - %StreamerSocket{transport_pid: 2}, - %StreamerSocket{transport_pid: 1} - ] - } = Streamer.get_sockets() - ) - end - - test "it will not add a duplicate socket", %{user: user} do - Streamer.add_socket("activity", %{transport_pid: 1, assigns: %{user: user}}) - Streamer.add_socket("activity", %{transport_pid: 1, assigns: %{user: user}}) - - assert( - %{ - "activity" => [ - %StreamerSocket{transport_pid: 1} - ] - } = Streamer.get_sockets() - ) - end - end -end diff --git a/test/web/streamer/streamer_test.exs b/test/web/streamer/streamer_test.exs index a5d6e8ecf..3f012259a 100644 --- a/test/web/streamer/streamer_test.exs +++ b/test/web/streamer/streamer_test.exs @@ -12,15 +12,81 @@ defmodule Pleroma.Web.StreamerTest do alias Pleroma.User alias Pleroma.Web.CommonAPI alias Pleroma.Web.Streamer - alias Pleroma.Web.Streamer.StreamerSocket - alias Pleroma.Web.Streamer.Worker @moduletag needs_streamer: true, capture_log: true - @streamer_timeout 150 - @streamer_start_wait 10 setup do: clear_config([:instance, :skip_thread_containment]) + describe "get_topic without an user" do + test "allows public" do + assert {:ok, "public"} = Streamer.get_topic("public", nil) + assert {:ok, "public:local"} = Streamer.get_topic("public:local", nil) + assert {:ok, "public:media"} = Streamer.get_topic("public:media", nil) + assert {:ok, "public:local:media"} = Streamer.get_topic("public:local:media", nil) + end + + test "allows hashtag streams" do + assert {:ok, "hashtag:cofe"} = Streamer.get_topic("hashtag", nil, %{"tag" => "cofe"}) + end + + test "disallows user streams" do + assert {:error, _} = Streamer.get_topic("user", nil) + assert {:error, _} = Streamer.get_topic("user:notification", nil) + assert {:error, _} = Streamer.get_topic("direct", nil) + end + + test "disallows list streams" do + assert {:error, _} = Streamer.get_topic("list", nil, %{"list" => 42}) + end + end + + describe "get_topic with an user" do + setup do + user = insert(:user) + {:ok, %{user: user}} + end + + test "allows public streams", %{user: user} do + assert {:ok, "public"} = Streamer.get_topic("public", user) + assert {:ok, "public:local"} = Streamer.get_topic("public:local", user) + assert {:ok, "public:media"} = Streamer.get_topic("public:media", user) + assert {:ok, "public:local:media"} = Streamer.get_topic("public:local:media", user) + end + + test "allows user streams", %{user: user} do + expected_user_topic = "user:#{user.id}" + expected_notif_topic = "user:notification:#{user.id}" + expected_direct_topic = "direct:#{user.id}" + assert {:ok, ^expected_user_topic} = Streamer.get_topic("user", user) + assert {:ok, ^expected_notif_topic} = Streamer.get_topic("user:notification", user) + assert {:ok, ^expected_direct_topic} = Streamer.get_topic("direct", user) + end + + test "allows hashtag streams", %{user: user} do + assert {:ok, "hashtag:cofe"} = Streamer.get_topic("hashtag", user, %{"tag" => "cofe"}) + end + + test "disallows registering to an user stream", %{user: user} do + another_user = insert(:user) + assert {:error, _} = Streamer.get_topic("user:#{another_user.id}", user) + assert {:error, _} = Streamer.get_topic("user:notification:#{another_user.id}", user) + assert {:error, _} = Streamer.get_topic("direct:#{another_user.id}", user) + end + + test "allows list stream that are owned by the user", %{user: user} do + {:ok, list} = List.create("Test", user) + assert {:error, _} = Streamer.get_topic("list:#{list.id}", user) + assert {:ok, _} = Streamer.get_topic("list", user, %{"list" => list.id}) + end + + test "disallows list stream that are not owned by the user", %{user: user} do + another_user = insert(:user) + {:ok, list} = List.create("Test", another_user) + assert {:error, _} = Streamer.get_topic("list:#{list.id}", user) + assert {:error, _} = Streamer.get_topic("list", user, %{"list" => list.id}) + end + end + describe "user streams" do setup do user = insert(:user) @@ -28,34 +94,55 @@ defmodule Pleroma.Web.StreamerTest do {:ok, %{user: user, notify: notify}} end + test "it streams the user's post in the 'user' stream", %{user: user} do + Streamer.get_topic_and_add_socket("user", user) + {:ok, activity} = CommonAPI.post(user, %{status: "hey"}) + assert_receive {:render_with_user, _, _, ^activity} + refute Streamer.filtered_by_user?(user, activity) + end + + test "it streams boosts of the user in the 'user' stream", %{user: user} do + Streamer.get_topic_and_add_socket("user", user) + + other_user = insert(:user) + {:ok, activity} = CommonAPI.post(other_user, %{status: "hey"}) + {:ok, announce} = CommonAPI.repeat(activity.id, user) + + assert_receive {:render_with_user, Pleroma.Web.StreamerView, "update.json", ^announce} + refute Streamer.filtered_by_user?(user, announce) + end + + test "it streams boosts of mastodon user in the 'user' stream", %{user: user} do + Streamer.get_topic_and_add_socket("user", user) + + other_user = insert(:user) + {:ok, activity} = CommonAPI.post(other_user, %{status: "hey"}) + + data = + File.read!("test/fixtures/mastodon-announce.json") + |> Poison.decode!() + |> Map.put("object", activity.data["object"]) + |> Map.put("actor", user.ap_id) + + {:ok, %Pleroma.Activity{data: _data, local: false} = announce} = + Pleroma.Web.ActivityPub.Transmogrifier.handle_incoming(data) + + assert_receive {:render_with_user, Pleroma.Web.StreamerView, "update.json", ^announce} + refute Streamer.filtered_by_user?(user, announce) + end + test "it sends notify to in the 'user' stream", %{user: user, notify: notify} do - task = - Task.async(fn -> - assert_receive {:text, _}, @streamer_timeout - end) - - Streamer.add_socket( - "user", - %{transport_pid: task.pid, assigns: %{user: user}} - ) - + Streamer.get_topic_and_add_socket("user", user) Streamer.stream("user", notify) - Task.await(task) + assert_receive {:render_with_user, _, _, ^notify} + refute Streamer.filtered_by_user?(user, notify) end test "it sends notify to in the 'user:notification' stream", %{user: user, notify: notify} do - task = - Task.async(fn -> - assert_receive {:text, _}, @streamer_timeout - end) - - Streamer.add_socket( - "user:notification", - %{transport_pid: task.pid, assigns: %{user: user}} - ) - + Streamer.get_topic_and_add_socket("user:notification", user) Streamer.stream("user:notification", notify) - Task.await(task) + assert_receive {:render_with_user, _, _, ^notify} + refute Streamer.filtered_by_user?(user, notify) end test "it doesn't send notify to the 'user:notification' stream when a user is blocked", %{ @@ -64,18 +151,12 @@ test "it doesn't send notify to the 'user:notification' stream when a user is bl blocked = insert(:user) {:ok, _user_relationship} = User.block(user, blocked) - {:ok, activity} = CommonAPI.post(user, %{"status" => ":("}) - {:ok, notif, _} = CommonAPI.favorite(activity.id, blocked) + Streamer.get_topic_and_add_socket("user:notification", user) - task = Task.async(fn -> refute_receive {:text, _}, @streamer_timeout end) + {:ok, activity} = CommonAPI.post(user, %{status: ":("}) + {:ok, _} = CommonAPI.favorite(blocked, activity.id) - Streamer.add_socket( - "user:notification", - %{transport_pid: task.pid, assigns: %{user: user}} - ) - - Streamer.stream("user:notification", notif) - Task.await(task) + refute_receive _ end test "it doesn't send notify to the 'user:notification' stream when a thread is muted", %{ @@ -83,121 +164,116 @@ test "it doesn't send notify to the 'user:notification' stream when a thread is } do user2 = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{"status" => "super hot take"}) - {:ok, activity} = CommonAPI.add_mute(user, activity) - {:ok, notif, _} = CommonAPI.favorite(activity.id, user2) + {:ok, activity} = CommonAPI.post(user, %{status: "super hot take"}) + {:ok, _} = CommonAPI.add_mute(user, activity) - task = Task.async(fn -> refute_receive {:text, _}, @streamer_timeout end) + Streamer.get_topic_and_add_socket("user:notification", user) - Streamer.add_socket( - "user:notification", - %{transport_pid: task.pid, assigns: %{user: user}} - ) + {:ok, favorite_activity} = CommonAPI.favorite(user2, activity.id) - Streamer.stream("user:notification", notif) - Task.await(task) + refute_receive _ + assert Streamer.filtered_by_user?(user, favorite_activity) end - test "it doesn't send notify to the 'user:notification' stream' when a domain is blocked", %{ + test "it sends favorite to 'user:notification' stream'", %{ + user: user + } do + user2 = insert(:user, %{ap_id: "https://hecking-lewd-place.com/user/meanie"}) + + {:ok, activity} = CommonAPI.post(user, %{status: "super hot take"}) + Streamer.get_topic_and_add_socket("user:notification", user) + {:ok, favorite_activity} = CommonAPI.favorite(user2, activity.id) + + assert_receive {:render_with_user, _, "notification.json", notif} + assert notif.activity.id == favorite_activity.id + refute Streamer.filtered_by_user?(user, notif) + end + + test "it doesn't send the 'user:notification' stream' when a domain is blocked", %{ user: user } do user2 = insert(:user, %{ap_id: "https://hecking-lewd-place.com/user/meanie"}) {:ok, user} = User.block_domain(user, "hecking-lewd-place.com") - {:ok, activity} = CommonAPI.post(user, %{"status" => "super hot take"}) - {:ok, notif, _} = CommonAPI.favorite(activity.id, user2) + {:ok, activity} = CommonAPI.post(user, %{status: "super hot take"}) + Streamer.get_topic_and_add_socket("user:notification", user) + {:ok, favorite_activity} = CommonAPI.favorite(user2, activity.id) - task = Task.async(fn -> refute_receive {:text, _}, @streamer_timeout end) - - Streamer.add_socket( - "user:notification", - %{transport_pid: task.pid, assigns: %{user: user}} - ) - - Streamer.stream("user:notification", notif) - Task.await(task) + refute_receive _ + assert Streamer.filtered_by_user?(user, favorite_activity) end test "it sends follow activities to the 'user:notification' stream", %{ user: user } do + user_url = user.ap_id user2 = insert(:user) - task = Task.async(fn -> assert_receive {:text, _}, @streamer_timeout end) - Process.sleep(@streamer_start_wait) + body = + File.read!("test/fixtures/users_mock/localhost.json") + |> String.replace("{{nickname}}", user.nickname) + |> Jason.encode!() - Streamer.add_socket( - "user:notification", - %{transport_pid: task.pid, assigns: %{user: user}} - ) + Tesla.Mock.mock_global(fn + %{method: :get, url: ^user_url} -> + %Tesla.Env{status: 200, body: body} + end) - {:ok, _follower, _followed, _activity} = CommonAPI.follow(user2, user) + Streamer.get_topic_and_add_socket("user:notification", user) + {:ok, _follower, _followed, follow_activity} = CommonAPI.follow(user2, user) - # We don't directly pipe the notification to the streamer as it's already - # generated as a side effect of CommonAPI.follow(). - Task.await(task) + assert_receive {:render_with_user, _, "notification.json", notif} + assert notif.activity.id == follow_activity.id + refute Streamer.filtered_by_user?(user, notif) end end - test "it sends to public" do + test "it sends to public authenticated" do user = insert(:user) other_user = insert(:user) - task = - Task.async(fn -> - assert_receive {:text, _}, @streamer_timeout - end) + Streamer.get_topic_and_add_socket("public", other_user) - fake_socket = %StreamerSocket{ - transport_pid: task.pid, - user: user - } + {:ok, activity} = CommonAPI.post(user, %{status: "Test"}) + assert_receive {:render_with_user, _, _, ^activity} + refute Streamer.filtered_by_user?(user, activity) + end - {:ok, activity} = CommonAPI.post(other_user, %{"status" => "Test"}) + test "works for deletions" do + user = insert(:user) + other_user = insert(:user) + {:ok, activity} = CommonAPI.post(other_user, %{status: "Test"}) - topics = %{ - "public" => [fake_socket] - } + Streamer.get_topic_and_add_socket("public", user) - Worker.push_to_socket(topics, "public", activity) + {:ok, _} = CommonAPI.delete(activity.id, other_user) + activity_id = activity.id + assert_receive {:text, event} + assert %{"event" => "delete", "payload" => ^activity_id} = Jason.decode!(event) + end - Task.await(task) + test "it sends to public unauthenticated" do + user = insert(:user) - task = - Task.async(fn -> - expected_event = - %{ - "event" => "delete", - "payload" => activity.id - } - |> Jason.encode!() + Streamer.get_topic_and_add_socket("public", nil) - assert_receive {:text, received_event}, @streamer_timeout - assert received_event == expected_event - end) + {:ok, activity} = CommonAPI.post(user, %{status: "Test"}) + activity_id = activity.id + assert_receive {:text, event} + assert %{"event" => "update", "payload" => payload} = Jason.decode!(event) + assert %{"id" => ^activity_id} = Jason.decode!(payload) - fake_socket = %StreamerSocket{ - transport_pid: task.pid, - user: user - } - - {:ok, activity} = CommonAPI.delete(activity.id, other_user) - - topics = %{ - "public" => [fake_socket] - } - - Worker.push_to_socket(topics, "public", activity) - - Task.await(task) + {:ok, _} = CommonAPI.delete(activity.id, user) + assert_receive {:text, event} + assert %{"event" => "delete", "payload" => ^activity_id} = Jason.decode!(event) end describe "thread_containment" do - test "it doesn't send to user if recipients invalid and thread containment is enabled" do + test "it filters to user if recipients invalid and thread containment is enabled" do Pleroma.Config.put([:instance, :skip_thread_containment], false) author = insert(:user) user = insert(:user) - User.follow(user, author, "accept") + User.follow(user, author, :follow_accept) activity = insert(:note_activity, @@ -208,19 +284,17 @@ test "it doesn't send to user if recipients invalid and thread containment is en ) ) - task = Task.async(fn -> refute_receive {:text, _}, 1_000 end) - fake_socket = %StreamerSocket{transport_pid: task.pid, user: user} - topics = %{"public" => [fake_socket]} - Worker.push_to_socket(topics, "public", activity) - - Task.await(task) + Streamer.get_topic_and_add_socket("public", user) + Streamer.stream("public", activity) + assert_receive {:render_with_user, _, _, ^activity} + assert Streamer.filtered_by_user?(user, activity) end test "it sends message if recipients invalid and thread containment is disabled" do Pleroma.Config.put([:instance, :skip_thread_containment], true) author = insert(:user) user = insert(:user) - User.follow(user, author, "accept") + User.follow(user, author, :follow_accept) activity = insert(:note_activity, @@ -231,19 +305,18 @@ test "it sends message if recipients invalid and thread containment is disabled" ) ) - task = Task.async(fn -> assert_receive {:text, _}, 1_000 end) - fake_socket = %StreamerSocket{transport_pid: task.pid, user: user} - topics = %{"public" => [fake_socket]} - Worker.push_to_socket(topics, "public", activity) + Streamer.get_topic_and_add_socket("public", user) + Streamer.stream("public", activity) - Task.await(task) + assert_receive {:render_with_user, _, _, ^activity} + refute Streamer.filtered_by_user?(user, activity) end test "it sends message if recipients invalid and thread containment is enabled but user's thread containment is disabled" do Pleroma.Config.put([:instance, :skip_thread_containment], false) author = insert(:user) user = insert(:user, skip_thread_containment: true) - User.follow(user, author, "accept") + User.follow(user, author, :follow_accept) activity = insert(:note_activity, @@ -254,255 +327,168 @@ test "it sends message if recipients invalid and thread containment is enabled b ) ) - task = Task.async(fn -> assert_receive {:text, _}, 1_000 end) - fake_socket = %StreamerSocket{transport_pid: task.pid, user: user} - topics = %{"public" => [fake_socket]} - Worker.push_to_socket(topics, "public", activity) + Streamer.get_topic_and_add_socket("public", user) + Streamer.stream("public", activity) - Task.await(task) + assert_receive {:render_with_user, _, _, ^activity} + refute Streamer.filtered_by_user?(user, activity) end end describe "blocks" do - test "it doesn't send messages involving blocked users" do + test "it filters messages involving blocked users" do user = insert(:user) blocked_user = insert(:user) {:ok, _user_relationship} = User.block(user, blocked_user) - {:ok, activity} = CommonAPI.post(blocked_user, %{"status" => "Test"}) - - task = - Task.async(fn -> - refute_receive {:text, _}, 1_000 - end) - - fake_socket = %StreamerSocket{ - transport_pid: task.pid, - user: user - } - - topics = %{ - "public" => [fake_socket] - } - - Worker.push_to_socket(topics, "public", activity) - - Task.await(task) + Streamer.get_topic_and_add_socket("public", user) + {:ok, activity} = CommonAPI.post(blocked_user, %{status: "Test"}) + assert_receive {:render_with_user, _, _, ^activity} + assert Streamer.filtered_by_user?(user, activity) end - test "it doesn't send messages transitively involving blocked users" do + test "it filters messages transitively involving blocked users" do blocker = insert(:user) blockee = insert(:user) friend = insert(:user) - task = - Task.async(fn -> - refute_receive {:text, _}, 1_000 - end) - - fake_socket = %StreamerSocket{ - transport_pid: task.pid, - user: blocker - } - - topics = %{ - "public" => [fake_socket] - } + Streamer.get_topic_and_add_socket("public", blocker) {:ok, _user_relationship} = User.block(blocker, blockee) - {:ok, activity_one} = CommonAPI.post(friend, %{"status" => "hey! @#{blockee.nickname}"}) + {:ok, activity_one} = CommonAPI.post(friend, %{status: "hey! @#{blockee.nickname}"}) - Worker.push_to_socket(topics, "public", activity_one) + assert_receive {:render_with_user, _, _, ^activity_one} + assert Streamer.filtered_by_user?(blocker, activity_one) - {:ok, activity_two} = CommonAPI.post(blockee, %{"status" => "hey! @#{friend.nickname}"}) + {:ok, activity_two} = CommonAPI.post(blockee, %{status: "hey! @#{friend.nickname}"}) - Worker.push_to_socket(topics, "public", activity_two) + assert_receive {:render_with_user, _, _, ^activity_two} + assert Streamer.filtered_by_user?(blocker, activity_two) - {:ok, activity_three} = CommonAPI.post(blockee, %{"status" => "hey! @#{blocker.nickname}"}) + {:ok, activity_three} = CommonAPI.post(blockee, %{status: "hey! @#{blocker.nickname}"}) - Worker.push_to_socket(topics, "public", activity_three) - - Task.await(task) + assert_receive {:render_with_user, _, _, ^activity_three} + assert Streamer.filtered_by_user?(blocker, activity_three) end end - test "it doesn't send unwanted DMs to list" do - user_a = insert(:user) - user_b = insert(:user) - user_c = insert(:user) + describe "lists" do + test "it doesn't send unwanted DMs to list" do + user_a = insert(:user) + user_b = insert(:user) + user_c = insert(:user) - {:ok, user_a} = User.follow(user_a, user_b) + {:ok, user_a} = User.follow(user_a, user_b) - {:ok, list} = List.create("Test", user_a) - {:ok, list} = List.follow(list, user_b) + {:ok, list} = List.create("Test", user_a) + {:ok, list} = List.follow(list, user_b) - {:ok, activity} = - CommonAPI.post(user_b, %{ - "status" => "@#{user_c.nickname} Test", - "visibility" => "direct" - }) + Streamer.get_topic_and_add_socket("list", user_a, %{"list" => list.id}) - task = - Task.async(fn -> - refute_receive {:text, _}, 1_000 - end) + {:ok, _activity} = + CommonAPI.post(user_b, %{ + status: "@#{user_c.nickname} Test", + visibility: "direct" + }) - fake_socket = %StreamerSocket{ - transport_pid: task.pid, - user: user_a - } + refute_receive _ + end - topics = %{ - "list:#{list.id}" => [fake_socket] - } + test "it doesn't send unwanted private posts to list" do + user_a = insert(:user) + user_b = insert(:user) - Worker.handle_call({:stream, "list", activity}, self(), topics) + {:ok, list} = List.create("Test", user_a) + {:ok, list} = List.follow(list, user_b) - Task.await(task) + Streamer.get_topic_and_add_socket("list", user_a, %{"list" => list.id}) + + {:ok, _activity} = + CommonAPI.post(user_b, %{ + status: "Test", + visibility: "private" + }) + + refute_receive _ + end + + test "it sends wanted private posts to list" do + user_a = insert(:user) + user_b = insert(:user) + + {:ok, user_a} = User.follow(user_a, user_b) + + {:ok, list} = List.create("Test", user_a) + {:ok, list} = List.follow(list, user_b) + + Streamer.get_topic_and_add_socket("list", user_a, %{"list" => list.id}) + + {:ok, activity} = + CommonAPI.post(user_b, %{ + status: "Test", + visibility: "private" + }) + + assert_receive {:render_with_user, _, _, ^activity} + refute Streamer.filtered_by_user?(user_a, activity) + end end - test "it doesn't send unwanted private posts to list" do - user_a = insert(:user) - user_b = insert(:user) + describe "muted reblogs" do + test "it filters muted reblogs" do + user1 = insert(:user) + user2 = insert(:user) + user3 = insert(:user) + CommonAPI.follow(user1, user2) + CommonAPI.hide_reblogs(user1, user2) - {:ok, list} = List.create("Test", user_a) - {:ok, list} = List.follow(list, user_b) + {:ok, create_activity} = CommonAPI.post(user3, %{status: "I'm kawen"}) - {:ok, activity} = - CommonAPI.post(user_b, %{ - "status" => "Test", - "visibility" => "private" - }) + Streamer.get_topic_and_add_socket("user", user1) + {:ok, announce_activity} = CommonAPI.repeat(create_activity.id, user2) + assert_receive {:render_with_user, _, _, ^announce_activity} + assert Streamer.filtered_by_user?(user1, announce_activity) + end - task = - Task.async(fn -> - refute_receive {:text, _}, 1_000 - end) + test "it filters reblog notification for reblog-muted actors" do + user1 = insert(:user) + user2 = insert(:user) + CommonAPI.follow(user1, user2) + CommonAPI.hide_reblogs(user1, user2) - fake_socket = %StreamerSocket{ - transport_pid: task.pid, - user: user_a - } + {:ok, create_activity} = CommonAPI.post(user1, %{status: "I'm kawen"}) + Streamer.get_topic_and_add_socket("user", user1) + {:ok, _announce_activity} = CommonAPI.repeat(create_activity.id, user2) - topics = %{ - "list:#{list.id}" => [fake_socket] - } + assert_receive {:render_with_user, _, "notification.json", notif} + assert Streamer.filtered_by_user?(user1, notif) + end - Worker.handle_call({:stream, "list", activity}, self(), topics) + test "it send non-reblog notification for reblog-muted actors" do + user1 = insert(:user) + user2 = insert(:user) + CommonAPI.follow(user1, user2) + CommonAPI.hide_reblogs(user1, user2) - Task.await(task) + {:ok, create_activity} = CommonAPI.post(user1, %{status: "I'm kawen"}) + Streamer.get_topic_and_add_socket("user", user1) + {:ok, _favorite_activity} = CommonAPI.favorite(user2, create_activity.id) + + assert_receive {:render_with_user, _, "notification.json", notif} + refute Streamer.filtered_by_user?(user1, notif) + end end - test "it sends wanted private posts to list" do - user_a = insert(:user) - user_b = insert(:user) - - {:ok, user_a} = User.follow(user_a, user_b) - - {:ok, list} = List.create("Test", user_a) - {:ok, list} = List.follow(list, user_b) - - {:ok, activity} = - CommonAPI.post(user_b, %{ - "status" => "Test", - "visibility" => "private" - }) - - task = - Task.async(fn -> - assert_receive {:text, _}, 1_000 - end) - - fake_socket = %StreamerSocket{ - transport_pid: task.pid, - user: user_a - } - - Streamer.add_socket( - "list:#{list.id}", - fake_socket - ) - - Worker.handle_call({:stream, "list", activity}, self(), %{}) - - Task.await(task) - end - - test "it doesn't send muted reblogs" do - user1 = insert(:user) - user2 = insert(:user) - user3 = insert(:user) - CommonAPI.hide_reblogs(user1, user2) - - {:ok, create_activity} = CommonAPI.post(user3, %{"status" => "I'm kawen"}) - {:ok, announce_activity, _} = CommonAPI.repeat(create_activity.id, user2) - - task = - Task.async(fn -> - refute_receive {:text, _}, 1_000 - end) - - fake_socket = %StreamerSocket{ - transport_pid: task.pid, - user: user1 - } - - topics = %{ - "public" => [fake_socket] - } - - Worker.push_to_socket(topics, "public", announce_activity) - - Task.await(task) - end - - test "it does send non-reblog notification for reblog-muted actors" do - user1 = insert(:user) - user2 = insert(:user) - user3 = insert(:user) - CommonAPI.hide_reblogs(user1, user2) - - {:ok, create_activity} = CommonAPI.post(user3, %{"status" => "I'm kawen"}) - {:ok, favorite_activity, _} = CommonAPI.favorite(create_activity.id, user2) - - task = - Task.async(fn -> - assert_receive {:text, _}, 1_000 - end) - - fake_socket = %StreamerSocket{ - transport_pid: task.pid, - user: user1 - } - - topics = %{ - "public" => [fake_socket] - } - - Worker.push_to_socket(topics, "public", favorite_activity) - - Task.await(task) - end - - test "it doesn't send posts from muted threads" do + test "it filters posts from muted threads" do user = insert(:user) user2 = insert(:user) + Streamer.get_topic_and_add_socket("user", user2) {:ok, user2, user, _activity} = CommonAPI.follow(user2, user) - - {:ok, activity} = CommonAPI.post(user, %{"status" => "super hot take"}) - - {:ok, activity} = CommonAPI.add_mute(user2, activity) - - task = Task.async(fn -> refute_receive {:text, _}, @streamer_timeout end) - - Streamer.add_socket( - "user", - %{transport_pid: task.pid, assigns: %{user: user2}} - ) - - Streamer.stream("user", activity) - Task.await(task) + {:ok, activity} = CommonAPI.post(user, %{status: "super hot take"}) + {:ok, _} = CommonAPI.add_mute(user2, activity) + assert_receive {:render_with_user, _, _, ^activity} + assert Streamer.filtered_by_user?(user2, activity) end describe "direct streams" do @@ -514,103 +500,88 @@ test "it sends conversation update to the 'direct' stream", %{} do user = insert(:user) another_user = insert(:user) - task = - Task.async(fn -> - assert_receive {:text, received_event}, @streamer_timeout - - assert %{"event" => "conversation", "payload" => received_payload} = - Jason.decode!(received_event) - - assert %{"last_status" => last_status} = Jason.decode!(received_payload) - [participation] = Participation.for_user(user) - assert last_status["pleroma"]["direct_conversation_id"] == participation.id - end) - - Streamer.add_socket( - "direct", - %{transport_pid: task.pid, assigns: %{user: user}} - ) + Streamer.get_topic_and_add_socket("direct", user) {:ok, _create_activity} = CommonAPI.post(another_user, %{ - "status" => "hey @#{user.nickname}", - "visibility" => "direct" + status: "hey @#{user.nickname}", + visibility: "direct" }) - Task.await(task) + assert_receive {:text, received_event} + + assert %{"event" => "conversation", "payload" => received_payload} = + Jason.decode!(received_event) + + assert %{"last_status" => last_status} = Jason.decode!(received_payload) + [participation] = Participation.for_user(user) + assert last_status["pleroma"]["direct_conversation_id"] == participation.id end test "it doesn't send conversation update to the 'direct' stream when the last message in the conversation is deleted" do user = insert(:user) another_user = insert(:user) + Streamer.get_topic_and_add_socket("direct", user) + {:ok, create_activity} = CommonAPI.post(another_user, %{ - "status" => "hi @#{user.nickname}", - "visibility" => "direct" + status: "hi @#{user.nickname}", + visibility: "direct" }) - task = - Task.async(fn -> - assert_receive {:text, received_event}, @streamer_timeout - assert %{"event" => "delete", "payload" => _} = Jason.decode!(received_event) + create_activity_id = create_activity.id + assert_receive {:render_with_user, _, _, ^create_activity} + assert_receive {:text, received_conversation1} + assert %{"event" => "conversation", "payload" => _} = Jason.decode!(received_conversation1) - refute_receive {:text, _}, @streamer_timeout - end) + {:ok, _} = CommonAPI.delete(create_activity_id, another_user) - Process.sleep(@streamer_start_wait) + assert_receive {:text, received_event} - Streamer.add_socket( - "direct", - %{transport_pid: task.pid, assigns: %{user: user}} - ) + assert %{"event" => "delete", "payload" => ^create_activity_id} = + Jason.decode!(received_event) - {:ok, _} = CommonAPI.delete(create_activity.id, another_user) - - Task.await(task) + refute_receive _ end test "it sends conversation update to the 'direct' stream when a message is deleted" do user = insert(:user) another_user = insert(:user) + Streamer.get_topic_and_add_socket("direct", user) {:ok, create_activity} = CommonAPI.post(another_user, %{ - "status" => "hi @#{user.nickname}", - "visibility" => "direct" + status: "hi @#{user.nickname}", + visibility: "direct" }) {:ok, create_activity2} = CommonAPI.post(another_user, %{ - "status" => "hi @#{user.nickname}", - "in_reply_to_status_id" => create_activity.id, - "visibility" => "direct" + status: "hi @#{user.nickname} 2", + in_reply_to_status_id: create_activity.id, + visibility: "direct" }) - task = - Task.async(fn -> - assert_receive {:text, received_event}, @streamer_timeout - assert %{"event" => "delete", "payload" => _} = Jason.decode!(received_event) - - assert_receive {:text, received_event}, @streamer_timeout - - assert %{"event" => "conversation", "payload" => received_payload} = - Jason.decode!(received_event) - - assert %{"last_status" => last_status} = Jason.decode!(received_payload) - assert last_status["id"] == to_string(create_activity.id) - end) - - Process.sleep(@streamer_start_wait) - - Streamer.add_socket( - "direct", - %{transport_pid: task.pid, assigns: %{user: user}} - ) + assert_receive {:render_with_user, _, _, ^create_activity} + assert_receive {:render_with_user, _, _, ^create_activity2} + assert_receive {:text, received_conversation1} + assert %{"event" => "conversation", "payload" => _} = Jason.decode!(received_conversation1) + assert_receive {:text, received_conversation1} + assert %{"event" => "conversation", "payload" => _} = Jason.decode!(received_conversation1) {:ok, _} = CommonAPI.delete(create_activity2.id, another_user) - Task.await(task) + assert_receive {:text, received_event} + assert %{"event" => "delete", "payload" => _} = Jason.decode!(received_event) + + assert_receive {:text, received_event} + + assert %{"event" => "conversation", "payload" => received_payload} = + Jason.decode!(received_event) + + assert %{"last_status" => last_status} = Jason.decode!(received_payload) + assert last_status["id"] == to_string(create_activity.id) end end end diff --git a/test/web/twitter_api/password_controller_test.exs b/test/web/twitter_api/password_controller_test.exs index 0a24860d3..231a46c67 100644 --- a/test/web/twitter_api/password_controller_test.exs +++ b/test/web/twitter_api/password_controller_test.exs @@ -54,7 +54,7 @@ test "it returns HTTP 200", %{conn: conn} do assert response =~ "

Password changed!

" user = refresh_record(user) - assert Comeonin.Pbkdf2.checkpw("test", user.password_hash) + assert Pbkdf2.verify_pass("test", user.password_hash) assert Enum.empty?(Token.get_user_tokens(user)) end diff --git a/test/web/twitter_api/remote_follow_controller_test.exs b/test/web/twitter_api/remote_follow_controller_test.exs index 5ff8694a8..f7e54c26a 100644 --- a/test/web/twitter_api/remote_follow_controller_test.exs +++ b/test/web/twitter_api/remote_follow_controller_test.exs @@ -6,11 +6,14 @@ defmodule Pleroma.Web.TwitterAPI.RemoteFollowControllerTest do use Pleroma.Web.ConnCase alias Pleroma.Config + alias Pleroma.MFA + alias Pleroma.MFA.TOTP alias Pleroma.User alias Pleroma.Web.CommonAPI import ExUnit.CaptureLog import Pleroma.Factory + import Ecto.Query setup do Tesla.Mock.mock(fn env -> apply(HttpRequestMock, :request, [env]) end) @@ -160,6 +163,119 @@ test "returns success result when user already in followers", %{conn: conn} do end end + describe "POST /ostatus_subscribe - follow/2 with enabled Two-Factor Auth " do + test "render the MFA login form", %{conn: conn} do + otp_secret = TOTP.generate_secret() + + user = + insert(:user, + multi_factor_authentication_settings: %MFA.Settings{ + enabled: true, + totp: %MFA.Settings.TOTP{secret: otp_secret, confirmed: true} + } + ) + + user2 = insert(:user) + + response = + conn + |> post(remote_follow_path(conn, :do_follow), %{ + "authorization" => %{"name" => user.nickname, "password" => "test", "id" => user2.id} + }) + |> response(200) + + mfa_token = Pleroma.Repo.one(from(q in Pleroma.MFA.Token, where: q.user_id == ^user.id)) + + assert response =~ "Two-factor authentication" + assert response =~ "Authentication code" + assert response =~ mfa_token.token + refute user2.follower_address in User.following(user) + end + + test "returns error when password is incorrect", %{conn: conn} do + otp_secret = TOTP.generate_secret() + + user = + insert(:user, + multi_factor_authentication_settings: %MFA.Settings{ + enabled: true, + totp: %MFA.Settings.TOTP{secret: otp_secret, confirmed: true} + } + ) + + user2 = insert(:user) + + response = + conn + |> post(remote_follow_path(conn, :do_follow), %{ + "authorization" => %{"name" => user.nickname, "password" => "test1", "id" => user2.id} + }) + |> response(200) + + assert response =~ "Wrong username or password" + refute user2.follower_address in User.following(user) + end + + test "follows", %{conn: conn} do + otp_secret = TOTP.generate_secret() + + user = + insert(:user, + multi_factor_authentication_settings: %MFA.Settings{ + enabled: true, + totp: %MFA.Settings.TOTP{secret: otp_secret, confirmed: true} + } + ) + + {:ok, %{token: token}} = MFA.Token.create_token(user) + + user2 = insert(:user) + otp_token = TOTP.generate_token(otp_secret) + + conn = + conn + |> post( + remote_follow_path(conn, :do_follow), + %{ + "mfa" => %{"code" => otp_token, "token" => token, "id" => user2.id} + } + ) + + assert redirected_to(conn) == "/users/#{user2.id}" + assert user2.follower_address in User.following(user) + end + + test "returns error when auth code is incorrect", %{conn: conn} do + otp_secret = TOTP.generate_secret() + + user = + insert(:user, + multi_factor_authentication_settings: %MFA.Settings{ + enabled: true, + totp: %MFA.Settings.TOTP{secret: otp_secret, confirmed: true} + } + ) + + {:ok, %{token: token}} = MFA.Token.create_token(user) + + user2 = insert(:user) + otp_token = TOTP.generate_token(TOTP.generate_secret()) + + response = + conn + |> post( + remote_follow_path(conn, :do_follow), + %{ + "mfa" => %{"code" => otp_token, "token" => token, "id" => user2.id} + } + ) + |> response(200) + + assert response =~ "Wrong authentication code" + refute user2.follower_address in User.following(user) + end + end + describe "POST /ostatus_subscribe - follow/2 without assigned user " do test "follows", %{conn: conn} do user = insert(:user) diff --git a/test/web/twitter_api/twitter_api_controller_test.exs b/test/web/twitter_api/twitter_api_controller_test.exs index ab0a2c3df..464d0ea2e 100644 --- a/test/web/twitter_api/twitter_api_controller_test.exs +++ b/test/web/twitter_api/twitter_api_controller_test.exs @@ -19,13 +19,9 @@ test "without valid credentials", %{conn: conn} do end test "with credentials, without any params" do - %{user: current_user, conn: conn} = - oauth_access(["read:notifications", "write:notifications"]) + %{conn: conn} = oauth_access(["write:notifications"]) - conn = - conn - |> assign(:user, current_user) - |> post("/api/qvitter/statuses/notifications/read") + conn = post(conn, "/api/qvitter/statuses/notifications/read") assert json_response(conn, 400) == %{ "error" => "You need to specify latest_id", diff --git a/test/web/twitter_api/twitter_api_test.exs b/test/web/twitter_api/twitter_api_test.exs index 92f9aa0f5..368533292 100644 --- a/test/web/twitter_api/twitter_api_test.exs +++ b/test/web/twitter_api/twitter_api_test.exs @@ -18,11 +18,11 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do test "it registers a new user and returns the user." do data = %{ - "nickname" => "lain", - "email" => "lain@wired.jp", - "fullname" => "lain iwakura", - "password" => "bear", - "confirm" => "bear" + :username => "lain", + :email => "lain@wired.jp", + :fullname => "lain iwakura", + :password => "bear", + :confirm => "bear" } {:ok, user} = TwitterAPI.register_user(data) @@ -35,12 +35,12 @@ test "it registers a new user and returns the user." do test "it registers a new user with empty string in bio and returns the user." do data = %{ - "nickname" => "lain", - "email" => "lain@wired.jp", - "fullname" => "lain iwakura", - "bio" => "", - "password" => "bear", - "confirm" => "bear" + :username => "lain", + :email => "lain@wired.jp", + :fullname => "lain iwakura", + :bio => "", + :password => "bear", + :confirm => "bear" } {:ok, user} = TwitterAPI.register_user(data) @@ -60,12 +60,12 @@ test "it sends confirmation email if :account_activation_required is specified i end data = %{ - "nickname" => "lain", - "email" => "lain@wired.jp", - "fullname" => "lain iwakura", - "bio" => "", - "password" => "bear", - "confirm" => "bear" + :username => "lain", + :email => "lain@wired.jp", + :fullname => "lain iwakura", + :bio => "", + :password => "bear", + :confirm => "bear" } {:ok, user} = TwitterAPI.register_user(data) @@ -87,29 +87,29 @@ test "it sends confirmation email if :account_activation_required is specified i test "it registers a new user and parses mentions in the bio" do data1 = %{ - "nickname" => "john", - "email" => "john@gmail.com", - "fullname" => "John Doe", - "bio" => "test", - "password" => "bear", - "confirm" => "bear" + :username => "john", + :email => "john@gmail.com", + :fullname => "John Doe", + :bio => "test", + :password => "bear", + :confirm => "bear" } {:ok, user1} = TwitterAPI.register_user(data1) data2 = %{ - "nickname" => "lain", - "email" => "lain@wired.jp", - "fullname" => "lain iwakura", - "bio" => "@john test", - "password" => "bear", - "confirm" => "bear" + :username => "lain", + :email => "lain@wired.jp", + :fullname => "lain iwakura", + :bio => "@john test", + :password => "bear", + :confirm => "bear" } {:ok, user2} = TwitterAPI.register_user(data2) expected_text = - ~s(@john test) @@ -123,13 +123,13 @@ test "returns user on success" do {:ok, invite} = UserInviteToken.create_invite() data = %{ - "nickname" => "vinny", - "email" => "pasta@pizza.vs", - "fullname" => "Vinny Vinesauce", - "bio" => "streamer", - "password" => "hiptofbees", - "confirm" => "hiptofbees", - "token" => invite.token + :username => "vinny", + :email => "pasta@pizza.vs", + :fullname => "Vinny Vinesauce", + :bio => "streamer", + :password => "hiptofbees", + :confirm => "hiptofbees", + :token => invite.token } {:ok, user} = TwitterAPI.register_user(data) @@ -145,13 +145,13 @@ test "returns user on success" do test "returns error on invalid token" do data = %{ - "nickname" => "GrimReaper", - "email" => "death@reapers.afterlife", - "fullname" => "Reaper Grim", - "bio" => "Your time has come", - "password" => "scythe", - "confirm" => "scythe", - "token" => "DudeLetMeInImAFairy" + :username => "GrimReaper", + :email => "death@reapers.afterlife", + :fullname => "Reaper Grim", + :bio => "Your time has come", + :password => "scythe", + :confirm => "scythe", + :token => "DudeLetMeInImAFairy" } {:error, msg} = TwitterAPI.register_user(data) @@ -165,13 +165,13 @@ test "returns error on expired token" do UserInviteToken.update_invite!(invite, used: true) data = %{ - "nickname" => "GrimReaper", - "email" => "death@reapers.afterlife", - "fullname" => "Reaper Grim", - "bio" => "Your time has come", - "password" => "scythe", - "confirm" => "scythe", - "token" => invite.token + :username => "GrimReaper", + :email => "death@reapers.afterlife", + :fullname => "Reaper Grim", + :bio => "Your time has come", + :password => "scythe", + :confirm => "scythe", + :token => invite.token } {:error, msg} = TwitterAPI.register_user(data) @@ -186,16 +186,16 @@ test "returns error on expired token" do setup do data = %{ - "nickname" => "vinny", - "email" => "pasta@pizza.vs", - "fullname" => "Vinny Vinesauce", - "bio" => "streamer", - "password" => "hiptofbees", - "confirm" => "hiptofbees" + :username => "vinny", + :email => "pasta@pizza.vs", + :fullname => "Vinny Vinesauce", + :bio => "streamer", + :password => "hiptofbees", + :confirm => "hiptofbees" } check_fn = fn invite -> - data = Map.put(data, "token", invite.token) + data = Map.put(data, :token, invite.token) {:ok, user} = TwitterAPI.register_user(data) fetched_user = User.get_cached_by_nickname("vinny") @@ -250,13 +250,13 @@ test "returns user on success, after him registration fails" do UserInviteToken.update_invite!(invite, uses: 99) data = %{ - "nickname" => "vinny", - "email" => "pasta@pizza.vs", - "fullname" => "Vinny Vinesauce", - "bio" => "streamer", - "password" => "hiptofbees", - "confirm" => "hiptofbees", - "token" => invite.token + :username => "vinny", + :email => "pasta@pizza.vs", + :fullname => "Vinny Vinesauce", + :bio => "streamer", + :password => "hiptofbees", + :confirm => "hiptofbees", + :token => invite.token } {:ok, user} = TwitterAPI.register_user(data) @@ -269,13 +269,13 @@ test "returns user on success, after him registration fails" do AccountView.render("show.json", %{user: fetched_user}) data = %{ - "nickname" => "GrimReaper", - "email" => "death@reapers.afterlife", - "fullname" => "Reaper Grim", - "bio" => "Your time has come", - "password" => "scythe", - "confirm" => "scythe", - "token" => invite.token + :username => "GrimReaper", + :email => "death@reapers.afterlife", + :fullname => "Reaper Grim", + :bio => "Your time has come", + :password => "scythe", + :confirm => "scythe", + :token => invite.token } {:error, msg} = TwitterAPI.register_user(data) @@ -292,13 +292,13 @@ test "returns user on success" do {:ok, invite} = UserInviteToken.create_invite(%{expires_at: Date.utc_today(), max_use: 100}) data = %{ - "nickname" => "vinny", - "email" => "pasta@pizza.vs", - "fullname" => "Vinny Vinesauce", - "bio" => "streamer", - "password" => "hiptofbees", - "confirm" => "hiptofbees", - "token" => invite.token + :username => "vinny", + :email => "pasta@pizza.vs", + :fullname => "Vinny Vinesauce", + :bio => "streamer", + :password => "hiptofbees", + :confirm => "hiptofbees", + :token => invite.token } {:ok, user} = TwitterAPI.register_user(data) @@ -317,13 +317,13 @@ test "error after max uses" do UserInviteToken.update_invite!(invite, uses: 99) data = %{ - "nickname" => "vinny", - "email" => "pasta@pizza.vs", - "fullname" => "Vinny Vinesauce", - "bio" => "streamer", - "password" => "hiptofbees", - "confirm" => "hiptofbees", - "token" => invite.token + :username => "vinny", + :email => "pasta@pizza.vs", + :fullname => "Vinny Vinesauce", + :bio => "streamer", + :password => "hiptofbees", + :confirm => "hiptofbees", + :token => invite.token } {:ok, user} = TwitterAPI.register_user(data) @@ -335,13 +335,13 @@ test "error after max uses" do AccountView.render("show.json", %{user: fetched_user}) data = %{ - "nickname" => "GrimReaper", - "email" => "death@reapers.afterlife", - "fullname" => "Reaper Grim", - "bio" => "Your time has come", - "password" => "scythe", - "confirm" => "scythe", - "token" => invite.token + :username => "GrimReaper", + :email => "death@reapers.afterlife", + :fullname => "Reaper Grim", + :bio => "Your time has come", + :password => "scythe", + :confirm => "scythe", + :token => invite.token } {:error, msg} = TwitterAPI.register_user(data) @@ -355,13 +355,13 @@ test "returns error on overdue date" do UserInviteToken.create_invite(%{expires_at: Date.add(Date.utc_today(), -1), max_use: 100}) data = %{ - "nickname" => "GrimReaper", - "email" => "death@reapers.afterlife", - "fullname" => "Reaper Grim", - "bio" => "Your time has come", - "password" => "scythe", - "confirm" => "scythe", - "token" => invite.token + :username => "GrimReaper", + :email => "death@reapers.afterlife", + :fullname => "Reaper Grim", + :bio => "Your time has come", + :password => "scythe", + :confirm => "scythe", + :token => invite.token } {:error, msg} = TwitterAPI.register_user(data) @@ -377,13 +377,13 @@ test "returns error on with overdue date and after max" do UserInviteToken.update_invite!(invite, uses: 100) data = %{ - "nickname" => "GrimReaper", - "email" => "death@reapers.afterlife", - "fullname" => "Reaper Grim", - "bio" => "Your time has come", - "password" => "scythe", - "confirm" => "scythe", - "token" => invite.token + :username => "GrimReaper", + :email => "death@reapers.afterlife", + :fullname => "Reaper Grim", + :bio => "Your time has come", + :password => "scythe", + :confirm => "scythe", + :token => invite.token } {:error, msg} = TwitterAPI.register_user(data) @@ -395,16 +395,15 @@ test "returns error on with overdue date and after max" do test "it returns the error on registration problems" do data = %{ - "nickname" => "lain", - "email" => "lain@wired.jp", - "fullname" => "lain iwakura", - "bio" => "close the world.", - "password" => "bear" + :username => "lain", + :email => "lain@wired.jp", + :fullname => "lain iwakura", + :bio => "close the world." } - {:error, error_object} = TwitterAPI.register_user(data) + {:error, error} = TwitterAPI.register_user(data) - assert is_binary(error_object[:error]) + assert is_binary(error) refute User.get_cached_by_nickname("lain") end diff --git a/test/web/twitter_api/util_controller_test.exs b/test/web/twitter_api/util_controller_test.exs index 30e54bebd..ad919d341 100644 --- a/test/web/twitter_api/util_controller_test.exs +++ b/test/web/twitter_api/util_controller_test.exs @@ -95,6 +95,30 @@ test "requires 'follow' or 'write:follows' permissions" do 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 @@ -136,6 +160,29 @@ test "it imports blocks users from file", %{user: user1, conn: conn} do ) 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 @@ -641,7 +688,7 @@ test "with proper permissions, valid password and matching new password and conf assert json_response(conn, 200) == %{"status" => "success"} fetched_user = User.get_cached_by_id(user.id) - assert Comeonin.Pbkdf2.checkpw("newpass", fetched_user.password_hash) == true + assert Pbkdf2.verify_pass("newpass", fetched_user.password_hash) == true end end diff --git a/test/web/web_finger/web_finger_test.exs b/test/web/web_finger/web_finger_test.exs index 4b4282727..f4884e0a2 100644 --- a/test/web/web_finger/web_finger_test.exs +++ b/test/web/web_finger/web_finger_test.exs @@ -67,7 +67,7 @@ test "it work for AP-only user" do assert data["magic_key"] == nil assert data["salmon"] == nil - assert data["topic"] == "https://mstdn.jp/users/kPherox.atom" + assert data["topic"] == nil assert data["subject"] == "acct:kPherox@mstdn.jp" assert data["ap_id"] == "https://mstdn.jp/users/kPherox" assert data["subscribe_address"] == "https://mstdn.jp/authorize_interaction?acct={uri}" diff --git a/test/workers/cron/digest_emails_worker_test.exs b/test/workers/cron/digest_emails_worker_test.exs index 0a63bf4e0..f9bc50db5 100644 --- a/test/workers/cron/digest_emails_worker_test.exs +++ b/test/workers/cron/digest_emails_worker_test.exs @@ -29,7 +29,7 @@ defmodule Pleroma.Workers.Cron.DigestEmailsWorkerTest do user2 = insert(:user, last_digest_emailed_at: date) {:ok, _} = User.switch_email_notifications(user2, "digest", true) - CommonAPI.post(user, %{"status" => "hey @#{user2.nickname}!"}) + CommonAPI.post(user, %{status: "hey @#{user2.nickname}!"}) {:ok, user2: user2} end diff --git a/test/workers/cron/new_users_digest_worker_test.exs b/test/workers/cron/new_users_digest_worker_test.exs index e6d050ecc..ee589bb55 100644 --- a/test/workers/cron/new_users_digest_worker_test.exs +++ b/test/workers/cron/new_users_digest_worker_test.exs @@ -15,7 +15,7 @@ test "it sends new users digest emails" do admin = insert(:user, %{is_admin: true}) user = insert(:user, %{inserted_at: yesterday}) user2 = insert(:user, %{inserted_at: yesterday}) - CommonAPI.post(user, %{"status" => "cofe"}) + CommonAPI.post(user, %{status: "cofe"}) NewUsersDigestWorker.perform(nil, nil) ObanHelpers.perform_all() @@ -28,6 +28,7 @@ test "it sends new users digest emails" do assert email.html_body =~ user.nickname assert email.html_body =~ user2.nickname assert email.html_body =~ "cofe" + assert email.html_body =~ "#{Pleroma.Web.Endpoint.url()}/static/logo.png" end test "it doesn't fail when admin has no email" do @@ -36,7 +37,7 @@ test "it doesn't fail when admin has no email" do insert(:user, %{inserted_at: yesterday}) user = insert(:user, %{inserted_at: yesterday}) - CommonAPI.post(user, %{"status" => "cofe"}) + CommonAPI.post(user, %{status: "cofe"}) NewUsersDigestWorker.perform(nil, nil) ObanHelpers.perform_all()